Category: 小小草

IT 技术领域学海无涯。其实任何领域都学海无涯,无非 IT 发展太快了,让我有更多嘘唏。希望我掌握的技术有如小小草,虽然渺小,却有旺盛的生命力。

  • Install HP printer in Fedora 14

    First printout in Fedora 14
    First printout in Fedora 14
    今天终于把 HP LaserJet 1010 装在了 Fedora 14 上。

    我从 Fedora 11 升级到 Feora 14 已有几周,但一直无法在 Fedora 14 下使用 HP LaserJet 1010 打印机。期间我一有空就想解决这个问题,直到今天才成功,好累。想当初在 Fedora 11 上安装这台打印机很顺利,我估计根本原因是 HP 驱动在 Fedora 14 上多少有点问题。回溯几个迂回的片段:

    首先从 HP Linux imaging and printing 的网站上下载了 hplib 3.10.9,运行其中的 hplip-3.10.9.run,被提示没有 gcc。我用

    1
    yum install gcc gcc-devel

    仍说没有 gcc。我只好再试

    1
    yum install gcc-c++
    HPLIP missing gcc
    HPLIP missing gcc

    这下 gcc 这一关过去了,但仍缺少一堆依赖包,为了求简单,我没有细究我的系统是否需要,按 google 来的建议一股脑地装了很多 packages。

    1
    yum install cups libjpeg-turbo libjpeg-turbo-devel openssl-devel net-snmp-devel libusb-devel python-devel xsane sane-backends-devel dbus-devel libtool

    这下 hplip-3.10.9.run 似乎成功运行完毕,在系统托盘上添加了 HP Device Manager 图标,也能看到 HP LaserJet 1010 打印机列在其中,但一打印,提示 cups-missing-filter。这种错误提示实在不知所云。想在 HP Device Manager 删了打印机再重装,竟然不让删。

    有人说这是 system-config-printer 有问题,只有 cups web interface (http://localhost:631) 才正常。

    我在 cups web interface 尝试去删除打印机,果然成功!得,以后就用 cups web interface 去管理打印机。但是,重装打印机并没有解决问题,一有打印任务就提示 cups-missing-filter。我在 cups web interface 里看到一个新的线索:找不到 /usr/lib/cups/filter/foomatic-rip-hplip。这大概是 cups-missing-filter 所谓的 missing filter 了。

    我从 hplip-3.10.9.run 的安装目录/prnt/hpijs/ 里找到 foomatic-rip-hplip,拷贝到 /usr/lib/cups/filter/,这时打印不再提示 cups-missing-filter,但仍无法打印,在打印任务栏看到所有 print job 都是一打印 status 就成 stopped。

    我没有继续以下尝试,而用重编译 hplib 的办法解决了问题。如果再来一遍,我会尝试

    1
    chmod 755 /usr/lib/cups/filter/foomatic-rip-hplip

    因为我后来看到 /usr/lib/cups/filter/ 下的文件都是 755 属性。

    重编译 hplib 是我在 Fedora 14 下安装 HP LaserJet 1010 打印机最精彩的部分,因为:
    它是最终解决方案;
    我不懂编译原理,只会依样画瓢,然后看到一大堆字符在终端里滚动,神秘的东西总是精彩的;
    我曾想绕过问题在 Fedora 14 下安装另一台 HP LaserJet 1020 打印机,也未成功,说明 HP printer drivers 在 Fedora 14 普遍有问题,那么解决方案也是有普遍适用性。

    言归正传。重编译 hplib 之前要先 uninstall hplib。

    1. 以 root 身份进入 hplib 的安装目录

    1
    2
    3
    su -
     
    cd /path/to/hplip-3.10.9

    2. 依次执行

    1
    2
    3
    4
    5
    6
    7
    8
    9
    make uninstall
     
    rm /usr/share/hplip -rf
     
    rm /etc/hp -rf
     
    rm ~/.hplip -rf
     
    rm /var/lib/hp -rf

    很多的 rm -rf 哟,小心输入。

    现在开始重编译 hplib。

    3. 依次执行

    1
    2
    3
    4
    5
    6
    7
    make clean
     
    ./configure --prefix=/usr --enable-qt4 --enable-doc-build --disable-cups-ppd-install --disable-foomatic-drv-install --enable-foomatic-ppd-install --enable-hpijs-install --disable-policykit --disable-cups-drv-install --disable-hpcups-install --enable-network-build --enable-dbus-build --enable-scan-build --disable-fax-build --disable-foomatic-rip-install --enable-foomatic-rip-hplip-install
     
    make
     
    make install

    在执行 ./configure 时会有一些 warning,大意是跟 foomatic 相关的 options not available。估计有些配置对 hplib 早期版本适用,而对 hplib 3.10.9 无效。Anyway, 这也能完成编译,编译后安装 HP LaserJet 1010 打印机就能打印了。我也想过偷懒,在 uninstall hplib 后不想重编译 hplib,直接在 cups web interface 里添加 HP LaserJet 1010 打印机,指望 cups 能认识一些主流打印机,但没有成功。

    花费了这么多时间才安装一台打印机,我认为问题的源头最有可能是 hplip-3.10.9.run has some defects。如果再来一遍,我不再

    1
    sh hplip-3.10.9.run

    而直接使用它解压出的文件。

  • I decide to follow html5 from now

    关于 html5 的消息时有耳闻,今天看到的 contenteditable 属性让我兴奋不已,所以我决定开始关注 html5。

    看看,有了 contenteditable = “true”,以后接受用户输入有了更灵活的方式。

    本文就是 contenteditable。

  • yum install php-5.3-curl-zend-server

    我快被 zend server 搞疯了。不过说到底是我自己不好——新装了一台 Fedora 14,添了 zend.repo 以后忘了运行

    1
    yum install zend-server-ce-php-5.3

    过了几天开始用它来调试 Magento。貌似 zend server php 替换了原有的 fedora php,因为 php.ini 是来自 /usr/local/zend/etc。这给我很大程度上一个误导,以为 zend server 已经装好了。

    结果 Magento 跑不起来,第一个错误是没有 pdo,我略有纳闷,zend server 怎么不代我完成 pdo 安装?不过没细想,用

    1
    yum install php-pdo-mysql

    解决问题。(不过回想起来,也没搞清楚这到底装了哪个版本的 pdo)

    随后发现进不了后台,第二个错误是没有 curl,这下折腾了两个小时,用

    1
    yum install php-curl

    说已安装(fedora 把 php-curl 包含在 php-common)。然后我用

    1
    yum reinstall php-curl

    当然无济于事。试遍各种可能的命令都不成功,两小时后发觉 zend server 没装过,于是一装 zend server,顺利启动 Magento。

    最后说一下,如果非要单独装 zend server 版的 php curl,可以用

    1
    yum install php-5.3-curl-zend-server
  • Mage_Adminhtml_Controller_action

    今天发现,我的所有的 admin controller 都写成了 extends Mage_Adminhtml_Controller_action。虽然不影响使用,我还是想把它改规范的驼峰式 Mage_Adminhtml_Controller_Action。

    于是搜索了整个硬盘到底哪些文件里包含 Mage_Adminhtml_Controller_action,结果发现这个笔误还不少。而且不光我写的 modules 里有,Aheadworks, J2t, Plieninger 的代码里也有,最后发现源头是 koukou1985 的 Magento module creator。

    看来 Magento module creator 流传甚广。

  • Magento attribute’s attribute frontend_class

    Magento EAV framework is very promising, but not easy to understand. When the code is mixed with typos, it becomes even more confusing.

    Mage_Catalog_Model_Resource_Eav_Mysql4_Setup provides a template for setting up an attribute.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    'name' => array(
    'type'              => 'varchar',
    'backend'           => '',
    'frontend'          => '',
    'label'             => 'Name',
    'input'             => 'text',
    'class'             => '',
    'source'            => '',
    'global'            => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_STORE,
    'visible'           => true,
    'required'          => true,
    'user_defined'      => false,
    'default'           => '',
    'searchable'        => false,
    'filterable'        => false,
    'comparable'        => false,
    'visible_on_front'  => false,
    'unique'            => false,
    )

    However, ‘class’ is wrong. It should be ‘frontend_class’. It refers to DOM class attribute assigned to this entity attribute output html. It can be used for value validation before submission. The possible classes can be found in js/prototype/validation.js. But frontend_class can be set anything you like for css styling or other purposes.

  • Run httpd with SELinux

    我实在不理解 SELinux,以前为了求简单,都是直接 disable SELinux。我也知道这样不好,可以没办法。

    最近重装系统,第一次选 Web Server 来装,我想这样搭配出来的 SELinux 最接近我的要求。可是,但我添加了 zend.repo 以后,发现 httpd 无法启动,错误信息为:

    1
    2
    3
    # service httpd start
    Starting httpd: httpd: Syntax error on line 221 of /etc/httpd/conf/httpd.conf: Syntax error on line 6 of /etc/httpd/conf.d/zendserver_php.conf: Cannot load /usr/local/zend/lib/apache2/libphp5.so into server: /usr/local/zend/lib/apache2/libphp5.so: cannot enable executable stack as shared object requires: Permission denied
                                                               [FAILED]

    我按论坛上的建议,执行了

    1
    # find /usr/local/zend/lib/ -name "*.so*" -exec semanage fcontext -a -t textrel_shlib_t {} \;

    错误仍在。然后按 SELinux 的建议,执行了

    1
    # setsebool -P httpd_execmem 1

    呵,成了。因为我不会 undo # find /usr/local/zend/lib/ -name “*.so*” -exec semanage fcontext -a -t textrel_shlib_t {} \; 所以我不知道此命令是否必要。

  • Update index after moving category in Magento

    这介于 bug 与 usability issue 之间:

    Moving category 使 category url 发生变化后,该 category 所属产品无法 add to compare,Compare, Compared, Viewed sidebars 统统不正常。

    我在 Magento 1.4.2.0 上发现这个问题,或许早先版本一直存在这个问题。我认为它象 bug,是因为 moving category 后 Magento 不提示 reindex index。

    解决办法也很简单,就是 moving category 后,用 System >> Index Management reindex 一下。

  • Magento layout handle name is misleading

    在 Magento app/design/frontend/base/default/layout/catalog.xml 文件里有一段让我费解的配置:

    1
    2
    3
    4
    5
    6
    7
    <catalog_category_layered_nochildren translate="label">
        <label>Catalog Category (Without Subcategories)</label>
        <remove name="right.reports.product.viewed" />
        <reference name="right">
            <block type="reports/product_viewed" before="right.permanent.callout" name="left.reports.product.viewed" template="reports/product_viewed.phtml" />
        </reference>
    </catalog_category_layered_nochildren>

    catalog_category_layered_nochildren,从字面上看,应该是只对 is_anchor == 1 并没有子目录的目录有效;但事实上,它对所有没有子目录的目录有效,所以我想,handle 应该取名 catalog_category_nochildren 更合适。Mage_Catalog_CategoryController::viewAction() 里有一段

    1
    2
    3
    if (!$category->hasChildren()) {
        $update->addHandle('catalog_category_layered_nochildren');
    }

    由此可见这里仅检验 hasChildren,未检验 getIsAnchor。

    catalog.xml 里把 right.reports.product.viewed 移除又添加,重新添加后 block 叫 left.reports.product.viewed,但实际位置仍在右边。这么做有什么意义?我费神地看了半天,得出的结论是:

    没有意义。大概 Magento 是借此演示一下 layout syntax。

    虽然没有意义,但是影响还是有的,有这一段,nochildren 的 category page sidebar 排序为 Compare, Compared, Viewed;否则排序为 Compare, Viewed, Compared。

    Sidebar in the sequence of Compare, Compared, Viewed
    Sidebar in the sequence of Compare, Compared, Viewed
    Sidebar in the sequence of Compare, Viewed, Compared
    Sidebar in the sequence of Compare, Viewed, Compared

  • Ajax Layer Navigation module for Magento

    有人要我对 Magento layer navigation 做些小修改,我觉得修修补补没有意义,要做就做一系列的修改,于是按我觉得可以改进的方向,列了以下几点。

    Add ajax load/change products on page loads or filter changes (TODO)

    Add option to show/hide category filter

    Add option to show price filter as slidebar (TODO)

    Add option to control price accuracy

    Add up to 3 sort by’s (TODO)
    (Someone already asked for a second sort by)

    Add option to show/hide sort by’s (TODO)

    Add option to or not to merge sort asc/desc into sort by dropdown (TODO)

    Add sort by’s position (TODO)
    (Magento native code can control filter attributes’ position, but cannot control sort by attributes’ position)

    Add recursive walk-through function to sort by settings for category and its child categories (TODO)

  • Install / uninstall Adobe Reader on Fedora

    在 Fedora 上安装 Adobe Reader (最新版本 9.4) 本来是非常简单的一件事,很久以前我装过一次,今天在新系统上第二次装,竟然花了两个小时。

    最主要的原因是我下载了错误的文件,我以为老马识途,没仔细看下载了一个 bin 文件,安装后尝试着执行被 SELinux 阻止。

    Summary:

    SELinux is preventing /opt/Adobe/Reader9/Reader/intellinux/bin/acroread from
    making the program stack executable.

    Detailed Description:

    The acroread application attempted to make its stack executable. This is a
    potential security problem. This should never ever be necessary. Stack memory is
    not executable on most OSes these days and this will not change. Executable
    stack memory is one of the biggest security problems. An execstack error might
    in fact be most likely raised by malicious code. Applications are sometimes
    coded incorrectly and request this permission. The SELinux Memory Protection
    Tests (http://www.akkadia.org/drepper/selinux-mem.html) web page explains how to
    remove this requirement. If acroread does not work and you need it to work, you
    can configure SELinux temporarily to allow this access until the application is
    fixed. Please file a bug report.

    Allowing Access:

    Sometimes a library is accidentally marked with the execstack flag, if you find
    a library with this flag you can clear it with the execstack -c LIBRARY_PATH.
    Then retry your application. If the app continues to not work, you can turn the
    flag back on with execstack -s LIBRARY_PATH. Otherwise, if you trust acroread to
    run correctly, you can change the context of the executable to execmem_exec_t.
    “chcon -t execmem_exec_t ‘/opt/Adobe/Reader9/Reader/intellinux/bin/acroread’”
    You must also change the default file context files on the system in order to
    preserve them even on a full relabel. “semanage fcontext -a -t execmem_exec_t
    ‘/opt/Adobe/Reader9/Reader/intellinux/bin/acroread’”

    Fix Command:

    chcon -t execmem_exec_t ‘/opt/Adobe/Reader9/Reader/intellinux/bin/acroread’

    SELinux 非常友好,但我这次尝试着它的建议 chcon -t execmem_exec_t ‘/opt/Adobe/Reader9/Reader/intellinux/bin/acroread’ 无济于事。

    最后,我重上 adobe 网站,发现还有 rpm 可供下载,有 rpm 当然用 rpm 啦,这次安装一次成功。

    PS: 如要卸载,yum erase AdobeReader_enu