「書きかけの歳時記」
2010/02版 その3

(since '05.04.25)

この日記は不定期に更新されます。なんにせよ、大したことは書かれないはずですが。

取扱上の注意

間違って検索サイトから来られた方へ(よくある検索 pattern)

アンテナ管理者の方へ


[2004 年までの一覧へ] [この年の目次へ] [この年のカテゴリ一覧へ]

[前日へ]

2010/02/21 (日)


2010/02/22 (月)


2010/02/23 (火)


2010/02/24 (水)


2010/02/25 (木)


2010/02/26 (金)


2010/02/27 (土)


2010/02/28 (日) 雨のち曇一時晴れ <久方ぶり>

近況 [その他]

生きてます。死にそう。


暖かくなってきたので [体調]

かふんしょお。へーちょ。


へい、ぶらざー。 [FreeBSD]

先日、ついに printer が壊れた。

ここしばらく(もうかれこれ 2 年以上前から)騙し騙し使っていたのではあった。Cleaning 機能は使えないし(cleaning 機構そのものが ink で溢れたっぽい)、しょっちゅう「ink cartridge 異常」を訴えたり。それでも、いざ動いてしまえば快調なので、捨てる気にはならなかったんだよね。だいたい、psc750 って発売されたのいつだ? 思えば 遠くへ来たもんだ ずいぶん長く使ってきたものだ。

で、こないだ電源を入れたところ、初期化時に毎回実施されるはずの scanner の calibration 動作が行なわれない。おや? と思っているうちに焦臭い匂いが漂ってきた。急いで 口で吸え 電源を引っこ抜く。うーん、駆動系がどっかで引っ掛かった挙げ句に motor が過負荷で焼けた風味。いい printer でした!

近々確定申告もあることだし、printer がないと困る。幸いこの所暖かかったので、先週の水曜日につくばへ一走りして printer を取ってきた。いや、前々から置き換えようと思ってはいたわけですよ。で、買っておいたはいいものの、置場所がなくて箱に入ったままずーっと放置してあったわけで。

そんなこんなで、持って帰ってきたのは Brother の MFC-3820JN。そもそもこれだって相当前のブツだよなー、と思いつつ保証書の日付を見てみたら、買ってから 7 年くらい経っている。つまり今のマンションを買った頃ですよ! さすがにビビった。

機械ものはなまじ動かさないでいるとかえって故障するもんだが、さすがに買ってから一度も通電していないどころか開封すらしていなかった(!)だけあって、すんなり動いてくれた。ただ、やっぱり head が微妙に目詰まりしていて、clearning をいきなり 10 回以上やる羽目に。むー。

ともあれ、無事に印刷環境が復活。Business 向けの機種なだけあって、印字は psc750 に比べるとかなり落ちるが、これはしょうがないね‥‥‥。どうせ名詞のネタも絶滅してきたし‥‥‥。

でまあ、Windoze から印刷できるのは当たり前。今まで使っていた psc750 は USB 接続なのであまり本格的に整備する気にならなかったのだが、せっかく printer 自体が LAN I/F を持っていることだし、FreeBSD でも印刷環境をちゃんと整えてみることにした。

Brother の inkhet printer の command sequence は公開されていないっぽい。ところが、Linux 用の driver set を Brother 自身が公開してくれている。まあ詰まるところ filter なんだけど、実は購入当時にこの filter が FreeBSD でも動作することは確認してあった(だからこの printer を購入したわけでもある)。で、公開されているのは lpd 用の filter/script の詰め合わせ。CUPS 環境用にはこの lpd 用のブツを CUPS から呼び出せるようにする wrapper(を生成するための script)が別途配布されている。うちの machine も気が付いたら CUPS の環境になっていたので(FreeBSD からはほとんど印刷してないからあまり気にしてなかった (__;)、MFC-3820JN を CUPS から使えるようにしてみるんだよしてみるんだよ。

最初は lpd 用の環境構築から。Lpd を実際に動かすかはともかく、CUPS wrapper もこの環境(の files)を利用して動作するようになっているので、これをやらないことには始まらない。

Lpd 用の filter script である filterMFC3820JN は、「各種入力 file →(filter)→ PostScript →(psconvertij)→ PPM Raw →(rastertobrij)→ printer data」という流れで変換を行なう構造になっている。このうち、psconvertij は内部で Ghostscript を呼び出している。これらの filter は基本的に shell script や plain text file で構成されているが、rastertobrij だけは binary で配布されている。これは当然 Linux 用の binary なので、install する各種 files は native 環境と Linuxulator のどちらからも同じ path で参照できるようにしておくのが無難なので、今回はそうしておいた。

さて、まずは材料です。

  1. 上記の download page から取得した所定の「LPR ドライバ」
    今回は RPM を採用。
  2. Ghostscript
    出力として ppmraw を support した状態で build してあること。
  3. GNU sed
    Script 内部で printer の parameter を抽出する際に「単語の先頭」に match する正規表現が使われているため、BSD 版では動作しない。や、当該部分を「行頭」とかにしてしまえば回避できるんだけどね‥‥‥。
  4. Linuxulator
    たいがい有効になってるだろうけど一応書いとく。
  5. PDF を直接印刷できるようにするためには pdf2ps も必要(filterMFC3820JN 内から呼び出される)

材料が揃ったら、早速調理を始めましょう。

  1. RPM を展開する
    
       rpm2cpio MFC3820JNlpr-1.0.4-1.i386.rpm | ( cd /usr/compat/linux; cpio -id --quiet )
    

  2. Script を抽出する
    
       rpm -qp --scripts MFC3820JNlpr-1.0.4-1.i386.rpm > script.lpr
    
    ぶっちゃけ、3. 以降の内容はここで抽出した script の内容に沿ってるはずなのだが、update されてたりで変わってる可能性もあるので、一応確認しておくがいいよ。

  3. 配布物の path とかを調整
    
       ln -s /usr/compat/linux/usr/bin/brprintconfij /usr/local/bin
       ln -s /usr/compat/linux/usr/local/Brother /usr/local/share
       cd /usr/compat/linux/usr/local
       mkdir share
       cd share
       ln -s ../Brother .
       chmod 755 /usr/compat/linux/usr/local
    
    面倒くさいことしてる理由は上に書いた通り。

  4. Script の内容を確認しつつ適当に実行
    
       /usr/compat/linux/usr/local/Brother/inf/setupPrintcapij MFC3820JN -i USB 
       cd /usr/compat/linux/usr/lib
       rm -f libbrcompij.so.1.0
       rm -f libbrcompij.so.1
       rm -f libbrcompij.so
       ln -s libbrcompij.so.1.0.4 libbrcompij.so.1.0
       ln -s libbrcompij.so.1.0.4 libbrcompij.so.1
       ln -s libbrcompij.so.1.0.4 libbrcompij.so
    
    setupPrintcapij の引数である「-i USB」は USB 接続であることを示しているのだが、network 接続の指定方法がないようなので、ここでは無視。

  5. Filter script の path を調整
    
    ----8<--------8<--------8<--------8<--------8<--------8<--------8<--------8<----
    --- /usr/compat/linux/usr/local/Brother/lpd/filterMFC3820JN-dist        2010-02-28 10:50:38.000000000 +0900
    +++ /usr/compat/linux/usr/local/Brother/lpd/filterMFC3820JN     2010-02-28 11:07:45.000000000 +0900
    @@ -21,7 +21,7 @@
     PRINTER="MFC-3820JN"
     PRINTER_TMP=$(echo $PRINTER | sed -e 's/ //g' -e 's/-//g')
     
    -BR_PRT_PATH=/usr/local/Brother/
    +BR_PRT_PATH=/usr/local/share/Brother/
     RCFILE=`eval echo $BR_PRT_PATH/inf/brPRINTERrc | eval sed 's/PRINTER/"$PRINTER_TMP"/'`
     PAPER_INF=$BR_PRT_PATH/inf/paperinfij
     PSCONV=$BR_PRT_PATH/lpd/psconvertij
    ----8<--------8<--------8<--------8<--------8<--------8<--------8<--------8<----
    

  6. psconvertij script の bug 等を修正
    
    ----8<--------8<--------8<--------8<--------8<--------8<--------8<--------8<----
    --- /usr/local/share/Brother/lpd/psconvertij-dist       2010-02-28 10:50:38.000000000 +0900
    +++ /usr/local/share/Brother/lpd/psconvertij    2010-02-28 12:54:35.000000000 +0900
    @@ -1,4 +1,4 @@
    -#/bin/sh
    +#!/bin/sh
     #
     # psconertij [Paper_inf] [rc_file]
     # Copyright (C) 2003 Brother. Industries, Ltd.
    @@ -26,7 +26,7 @@
     PAPER_TYPE=`echo $PAPER_TYPE | sed -e 's/ //g' -e 's/PaperType=//'`
     
     # get Resolution
    -RESOLUTION=`sed -n '/\<Resolution/p' $RC_FILE`
    +RESOLUTION=`gsed -n '/\<Resolution/p' $RC_FILE`
     RESOLUTION=`echo $RESOLUTION | sed -e 's/ //g' -e 's/Resolution=//'`
     
     # get paper size
    ----8<--------8<--------8<--------8<--------8<--------8<--------8<--------8<----
    

  7. Printcap の接続 port と filter の path を調整
    
    ----8<--------8<--------8<--------8<--------8<--------8<--------8<--------8<----
       MFC3820JN:\
               :mx=0:\
               :sd=/var/spool/lpd/MFC3820JN:\
               :sh:\
               :rm=MFC3820JN:rp=lp:\
               :if=/usr/compat/linux/usr/local/Brother/lpd/filterMFC3820JN:
    ----8<--------8<--------8<--------8<--------8<--------8<--------8<--------8<----
    

  8. Lpd を restart
    
       /etc/rc.d/lpd restart
    

CUPS 環境で使う場合は 7. と 8. はやんなくていいです。

LPD 用の環境構築が終わったら、いよいよ CUPS Wrapper の install に移るわけです。

  1. RPM を展開
    
       rpm2cpio cupswrapperMFC3820JN-1.0.0-1.i386.rpm  | ( cd /usr/compat/linux/ ; cpio -id --quiet )
    

  2. 念の為 script を確認
    
       rpm -qp --scripts cupswrapperMFC3820JN-1.0.0-1.i386.rpm  > script.cups
    

  3. Script 内の path を調整
    
       /usr/share/cups           → /usr/local/share/cups
       /usr/lib/cups             → /usr/local/libexec/cups
       /usr/local/Brother/filter → /usr/local/share/Brother/filter
       /usr/bin		     → /usr/local/bin
    
    と書き換える。
    
    ----8<--------8<--------8<--------8<--------8<--------8<--------8<--------8<----
    --- /usr/compat/linux/usr/local/Brother/cupswrapper/cupswrapperMFC3820JN-1.0.0-dist     2010-02-28 11:24:27.000000000 +0900
    +++ /usr/compat/linux/usr/local/Brother/cupswrapper/cupswrapperMFC3820JN-1.0.0  2010-02-28 12:23:52.000000000 +0900
    @@ -20,8 +20,8 @@
     
     if("$1" == '-e')then
       lpadmin -x MFC3820JN
    -  rm -f /usr/share/cups/model/brmfc3820jn_cups.ppd
    -  rm -f /usr/lib/cups/filter/brlpdwrapperMFC3820JN
    +  rm -f /usr/local/share/cups/model/brmfc3820jn_cups.ppd
    +  rm -f /usr/local/libexec/cups/filter/brlpdwrapperMFC3820JN
       /etc/init.d/cups restart
       exit(0)
     endif
    @@ -37,14 +37,14 @@
       echo   '       -r : remove printer'
       exit(0)
     endif
    -mkdir -p /usr/local/Brother/filter
    -mkdir -p /usr/lib/cups/filter
    +mkdir -p /usr/local/share/Brother/filter
    +mkdir -p /usr/local/libexec/cups/filter
     
    -if(!(-e "/usr/local/Brother/lpd/filterMFC3820JN"))then
    +if(!(-e "/usr/local/share/Brother/lpd/filterMFC3820JN"))then
       echo "ERROR : Brother LPD filter is not installed."
     endif
    -rm -f /usr/share/cups/model/brmfc3820jn_cups.ppd
    -set  ppd_file_name=/usr/share/cups/model/brmfc3820jn_cups.ppd
    +rm -f /usr/local/share/cups/model/brmfc3820jn_cups.ppd
    +set  ppd_file_name=/usr/local/share/cups/model/brmfc3820jn_cups.ppd
     
     echo '*PPD-Adobe: "4.3"'                                                                >>$ppd_file_name
     echo '*% '                                                                              >>$ppd_file_name
    @@ -607,9 +607,9 @@
     echo '*Font US-Roman: Standard "(001.005)" Standard ROM'                                >>$ppd_file_name
     echo ''                                                                                 >>$ppd_file_name
     echo ''                                                                                 >>$ppd_file_name
    -set  brotherlpdwrapper=/usr/lib/cups/filter/brlpdwrapperMFC3820JN
    +set  brotherlpdwrapper=/usr/local/libexec/cups/filter/brlpdwrapperMFC3820JN
     rm -f  $brotherlpdwrapper
    -echo 'rm -f /usr/lib/cups/filter/brlpdwrapperMFC3820JN'
    +echo 'rm -f /usr/local/libexec/cups/filter/brlpdwrapperMFC3820JN'
     echo  '#! /bin/csh'  >>  $brotherlpdwrapper
     echo  '#'  >>  $brotherlpdwrapper
     echo  '# Brother Print filter  '  >>  $brotherlpdwrapper
    @@ -646,7 +646,7 @@
     echo  ''  >>  $brotherlpdwrapper
     echo  ''  >>  $brotherlpdwrapper
     echo  'if ( `printenv | grep "PPD="` == "") then'  >>  $brotherlpdwrapper
    -echo  '    set  PPD = "/usr/share/cups/model/brmfc3820jn_cups.ppd"'  >>  $brotherlpdwrapper
    +echo  '    set  PPD = "/usr/local/share/cups/model/brmfc3820jn_cups.ppd"'  >>  $brotherlpdwrapper
     echo  'endif'  >>  $brotherlpdwrapper
     echo  ''  >>  $brotherlpdwrapper
     echo  ''  >>  $brotherlpdwrapper
    @@ -973,8 +973,8 @@
     echo  '    echo "PPD  = $PPD"                                   >>$LOGFILE'  >>  $brotherlpdwrapper
     echo  'endif'  >>  $brotherlpdwrapper
     echo  ''  >>  $brotherlpdwrapper
    -echo  'if(!(-e /usr/local/Brother/lpd/filterMFC3820JN)) then'  >>  $brotherlpdwrapper
    -echo  '    echo "ERROR: /usr/local/Brother/lpd/filterMFC3820JN does not exist"                      >>$LOGFILE'  >>  $brotherlpdwrapper
    +echo  'if(!(-e /usr/local/share/Brother/lpd/filterMFC3820JN)) then'  >>  $brotherlpdwrapper
    +echo  '    echo "ERROR: /usr/local/share/Brother/lpd/filterMFC3820JN does not exist"                      >>$LOGFILE'  >>  $brotherlpdwrapper
     echo  '    set errorcode=30'  >>  $brotherlpdwrapper
     echo  '    exit $errorcode'  >>  $brotherlpdwrapper
     echo  'endif'  >>  $brotherlpdwrapper
    @@ -987,7 +987,7 @@
     echo  'endif'  >>  $brotherlpdwrapper
     echo  ''  >>  $brotherlpdwrapper
     echo  ''  >>  $brotherlpdwrapper
    -echo  'if(-e "/usr/bin/$BRPRINTCONFIG") then'  >>  $brotherlpdwrapper
    +echo  'if(-e "/usr/local/bin/$BRPRINTCONFIG") then'  >>  $brotherlpdwrapper
     echo  ''  >>  $brotherlpdwrapper
     echo  '    echo  "-------set printer defaults-------"               >>&"$LOGFILE"'  >>  $brotherlpdwrapper
     echo  '    set i = 1'  >>  $brotherlpdwrapper
    @@ -1107,7 +1107,7 @@
     echo  ''  >>  $brotherlpdwrapper
     echo  ''  >>  $brotherlpdwrapper
     echo  'else'  >>  $brotherlpdwrapper
    -echo  '    echo "WARNING: /usr/bin/$BRPRINTCONFIG does not exist"           >>$LOGFILE'  >>  $brotherlpdwrapper
    +echo  '    echo "WARNING: /usr/local/bin/$BRPRINTCONFIG does not exist"           >>$LOGFILE'  >>  $brotherlpdwrapper
     echo  '    set errorcode=31'  >>  $brotherlpdwrapper
     echo  'endif'  >>  $brotherlpdwrapper
     echo  ''  >>  $brotherlpdwrapper
    @@ -1115,7 +1115,7 @@
     echo  ''  >>  $brotherlpdwrapper
     echo  ''  >>  $brotherlpdwrapper
     echo  'if($DEBUG < 10) then'  >>  $brotherlpdwrapper
    -echo  '    cat    $INPUT_TEMP_PS | /usr/local/Brother/lpd/filterMFC3820JN'  >>  $brotherlpdwrapper
    +echo  '    cat    $INPUT_TEMP_PS | /usr/local/share/Brother/lpd/filterMFC3820JN'  >>  $brotherlpdwrapper
     echo  ''  >>  $brotherlpdwrapper
     echo  '    if($LOGLEVEL > 2) then'  >>  $brotherlpdwrapper
     echo  '        if($LOGFILE != "/dev/null") then'  >>  $brotherlpdwrapper
    @@ -1133,8 +1133,8 @@
     echo  ''  >>  $brotherlpdwrapper
     echo  ''  >>  $brotherlpdwrapper
     chmod a+x $brotherlpdwrapper
    -chmod a+w /usr/local/Brother/inf/brMFC3820JNrc
    -chmod a+w /usr/local/Brother/inf
    +chmod a+w /usr/local/share/Brother/inf/brMFC3820JNrc
    +chmod a+w /usr/local/share/Brother/inf
     if( -e /etc/init.d/lpd) then
        /etc/init.d/lpd stop
     endif
    ----8<--------8<--------8<--------8<--------8<--------8<--------8<--------8<----
    

    Network 接続の場合は lpadmin の行も変える必要があるんだよあるんだよ。
    
    ----8<--------8<--------8<--------8<--------8<--------8<--------8<--------8<----
    @@ -1143,5 +1143,5 @@
     endif
     /etc/init.d/cups restart
     sleep 2s
    -lpadmin -p MFC3820JN -E -v usb:/dev/usb/lp0 -m brmfc3820jn_cups.ppd
    +lpadmin -p MFC3820JN -E -v lpd://MFC3820JN/lp -m brmfc3820jn_cups.ppd
       exit(0)
    ----8<--------8<--------8<--------8<--------8<--------8<--------8<--------8<----
                                ^^^^^^^^^^^^^^^^^^
    
  4. Permission の調整
    Linux と違って FreeBSD で port を使って CUPS を install すると cupsdcups:cups で実行されるので、そのままだと正しく動作しない。なので、permission を調整。
    
       chmod 755 /usr/compat/linux/usr/local/Brother
       chmod 777 /usr/compat/linux/usr/local/Brother/inf
       chmod 755 /usr/compat/linux/usr/local/Brother/lpd
    
    どうせ LPD と CUPS は排他利用なので、chmod するかわりに /usr/compat/linux/usr/local/Brother 以下を cups:cups に chown してもいいやね。

  5. /etc/rc.conf に「cupsd_enable="YES"」という行があることを確認。なければ追加して「/usr/local/etc/rc.d/cupsd start」を実行しておく。
  6. Script の内容を実行
    
       csh /usr/compat/linux/usr/local/Brother/cupswrapper/cupswrapperMFC3820JN-1.0.0 -i
    
    /etc/init.d/cups が見つかんねーよ!」とか言われるがキニシナイ。あと、なんか文字化けした prompt が出てくるのは password の要求。unsetenv LANG するか env LANG= しておくと幸せになれるかも。

  7. CUPS に printer が追加されたのを確認
    
       lpinfo -m
    

  8. CUPS に device が認識されたのを確認
    
       lpinfo -v
    

    network lpd」の行があればいいっぽい。あと、文字化けした prompt は以下同文。

  9. CUPS の管理画面(http://localhost:631/admin)に接続 「Printers」section の「Manage Printers」を click し、MFC3820JN が現れていれば OK。

  10. Default の printer や option を設定
    
       lpoptions -d MFC3820JN
       lpoptions -d MFC3820JN -o ppi=1200
       lpoptions -d MFC3820JN -o media=A4
    

なんか lpoptions で設定したつもりの解像度の default 値が反映されていないような気がする。謎。



[後日へ]

[最新版へ] [2004 年までの一覧へ] [今年の目次へ] [今年のカテゴリ一覧へ]

メールはこちらへ...[五反田 秋彦 as (五) / a-gota @(at) agt .(dot) ne .(dot) jp]

この日記は、GNSを使用して作成されています。作製者の GORRY さんに感謝 m(__)m