2012年04月15日 EPSON PM-3500C をUSB接続で利用する場合の注意 [長年日記]
_ EPSON PM-3500C をUSB接続で利用する場合の注意
PM-3500Cを含む多くのEPSONプリンタでは、単純にUSBポートに接続するだけでは、カーネルはちゃんと認識しているが、いざデータを送っても全く反応しない。Linux USB FAQ:My Epson printer doesn't print anything.によると、以下のデータをプリンタに送ってやらないとパラレルモードからUSBモードに切り替わらないということらしい。
echo -e "\x00\x00\x00\x1b\x01\x40\x45\x4a\x4c\x20\x31\x32\x38\x34\x2e\x34\x0a\x40\x45\x4a\x4c\x20\x20\x20\x20\x20\x0a" >/dev/usblp0
実際、上記の操作を行ったら、
echo -e "aaa\f" >/dev/usblp0
で "aaa" が印字された。
_ LPRng-3.8.35
Slackware-11.0 + kernel-2.6.17.14という若干古めな環境に、EPSON PM-3500CをUSBで接続することにしたのだが、そのマシンというのは、このmyh.no-ip.orgのこと。常時起動マシンに繋げるのだから、lpd的なものを立ち上げてネットワーク越しに、奥さん(Linux)や息子のPC(Windows7)から常に印字できるようにしたい。
さすがにSlackware-11.0という古い環境でも、プリント環境はCUPSになっている。しかしこちらはlpd止まりの知識しか持ち合わせていない。また、このマシンはXorgは起動していないので、ブラウザベースで管理するCUPSではちと勝手が悪い...。
と、都合の良い理由をつけて、(いにしえの)LPRngをインストールした。
LPRng-3.8.35
- tar xvzf LPRng-3.8.35.tgz
- cd LPRng-3.8.35
- vi Makefile.in
*** Makefile.in.ORG 2012-04-15 21:13:45.000000000 +0900 --- Makefile.in 2012-04-15 21:14:28.000000000 +0900 *************** *** 45,51 **** LPD_CONF_PATH=\"@LPD_CONF_PATH@\" PRINTCAP_PATH=\"@PRINTCAP_PATH@\" LPD_PATH=\"@LPD_DIR@/lpd\" ! SHELL="@SHELL@" LOCKFILE=\"@LOCKFILE@\" CONFIG_SUBDIR="@CONFIG_SUBDIR@" PSHOWALL="@PSHOWALL@" --- 45,51 ---- LPD_CONF_PATH=\"@LPD_CONF_PATH@\" PRINTCAP_PATH=\"@PRINTCAP_PATH@\" LPD_PATH=\"@LPD_DIR@/lpd\" ! SHELL=@SHELL@ LOCKFILE=\"@LOCKFILE@\" CONFIG_SUBDIR="@CONFIG_SUBDIR@" PSHOWALL="@PSHOWALL@"
- make
- su
- make install
/etc/group
lpdがユーザdaemonの権限で動き、USBプリンタのデバイスが、
$ ls -al /dev/usb/lp0 crw-rw-r-- 1 root lp 180, 0 2012-04-15 21:21 /dev/usb/lp0
という状況なので、vipw -gにて
lp::7:lp,daemon
と設定する。
スプールディレクトリの作成
- mkdir /var/spool/lpd; chown daemon.daemon /var/spool/lpd; chmod 775 /var/spool/lpd
- mkdir /var/spool/lpd/lp; chown daemon.daemon /var/spool/lpd/lp; chmod 700 /var/spool/lpd/lp
- mkdir /var/spool/lpd/lpraw; chown daemon.daemon /var/spool/lpd/lpraw; chmod 700 /var/spool/lpd/lpraw
一通りできたら、root権限でcheckpcを実行してみると良い。パーミッション等で不適切な状態があれば指摘してくれる。
/usr/local/etc/printcap
.common: :sd=/var/spool/lpd/%P :sh:mx=0:mc=0 # lp:lp=/dev/usblp0:\ :tc=.common:\ :filter=/usr/libexec/filters/lp-filter.sh: # lpraw:lp=/dev/usblp0:\ :tc=.common:\ :filter=/usr/libexec/filters/lpraw-filter.sh: :ff=:
lpはローカルから打ち出すためのプリンタ定義。lprawはネットワーク越しに他のPCからの印字を受けるプリンタ定義。フィルタは以前の設定を参照。
pips3500-2.1.2
EPSONから提供されているフィルタを使うのだが、メンテはとっくに止まっている感じ。コンパイル時もエラーが出た。下記のパッチをあてればコンパイルは通る。
*** ekpstm/ekpstm-1.0.2/src/main.c.ORG 2012-04-15 11:52:39.000000000 +0900 --- ekpstm/ekpstm-1.0.2/src/main.c 2012-04-15 11:53:15.000000000 +0900 *************** *** 72,77 **** --- 72,79 ---- break; default: + break; + } }
ただし、printcapに、
# written for pips3500 pm3500c:\ :sd=/var/spool/lpd/pm3500c:\ :mx#0:\ :sh:\ :lp=/var/ekpd/ekplp0:\ :if=/usr/local/EPKowa/PM3500C/filter3500: # pips3500 end
の定義をいれると、lprで印字できない。/var/ekpd/ekplp0でSystem call interruptみたいなメッセージがでる。なので、この定義はコメントアウトしておき、/etc/rc.d/rc.localに追加されている/etc/rc.d/rc.ekpdの起動部分もコメントアウトしておく。
/etc/rc.d/rc.lprng
#!/bin/sh case "$1" in start) # Start daemons. /usr/bin/echo "Starting lpd"; /usr/local/sbin/lpd; /usr/bin/echo ""; ;; stop) # Stop daemons. /usr/bin/printf "Shutting down lpd: " pkill lpd /usr/bin/echo "done" ;; *) echo "Usage: lpd {start|stop}" ;; esac
/usr/libexec/filters/initepsonusb.sh
#! /bin/sh /usr/bin/echo -e "\x00\x00\x00\x1b\x01\x40\x45\x4a\x4c\x20\x31\x32\x38\x34\x2e\x34\x0a\x40\x45\x4a\x4c\x20\x20\x20\x20\x20"
/usr/libexec/filters/lp-filter.sh
#! /bin/sh # # txt, ps, jpg, gif # PATH=/usr/libexec/filters:/usr/X11R6/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin export PATH # # FUNCTION # function terminate(){ rm /tmp/prfilter.*.$$.tmp exit 0 } # initepsonusb.sh # cat >/tmp/prfilter.1.$$.tmp fileattr=`file /tmp/prfilter.1.$$.tmp` # # mt=$1 # PLAIN SFINE PMPHOTO # re=$2 # 360 720 # ql=$3 # STD FINE PHOTO # hs=$4 # ON OFF # in=$5 # COLOR MONO # cc=$6 # PHOTO GRAPH NONE # # POSTSCRIPT file # if [ "X`echo $fileattr|grep -i ' postscript'`" != "X" ] then cat /tmp/prfilter.1.$$.tmp |\ psfilter.sh PLAIN 360 STD ON COLOR PHOTO terminate fi # # JPEG file # if [ "X`echo $fileattr|grep -i ' jpeg'`" != "X" -o \ "X`echo $fileattr|grep -i ' jfif'`" != "X" ] then djpeg -pnm /tmp/prfilter.1.$$.tmp |\ pnmtops -nocenter |\ psfilter.sh PLAIN 360 STD ON COLOR PHOTO terminate fi # # GIF file # if [ "X`echo $fileattr|grep -i ' gif'`" != "X" ] then giftopnm /tmp/prfilter.1.$$.tmp |\ pnmtops -nocenter |\ psfilter.sh PLAIN 360 STD ON COLOR PHOTO terminate fi #DEL_# #DEL_# OBJ(Tgif) file #DEL_# #DEL_if [ "X`echo $fileattr|grep -i ' tgif'`" != "X" ] #DEL_then #DEL_ cp /tmp/prfilter.1.$$.tmp /tmp/prfilter.1.$$.obj #DEL_ tgif -print -color -o/tmp -ps -stdout /tmp/prfilter.1.$$.obj 2>/dev/null |\ #DEL_ psfilter.sh PLAIN 360 STD ON COLOR PHOTO #DEL_ rm /tmp/prfilter.1.$$.obj #DEL_ terminate #DEL_fi # # TEXT file # if [ "X`echo $fileattr|grep -i ' text'`" != "X" ] then PROVDIR=/usr/local/prov; export PROVDIR ${PROVDIR}/bin/prov -text /dev/null /tmp/prfilter.1.$$.tmp |\ psfilter.sh PLAIN 360 STD ON MONO NONE terminate fi # # NOT SUPPORTED # (echo $fileattr; echo ""; echo "NOT SUPPORTED"; echo "^L") >/tmp/prfilter.2.$$.tmp PROVDIR=/usr/local/prov; export PROVDIR ${PROVDIR}/bin/prov -text /dev/null /tmp/prfilter.2.$$.tmp |\ psfilter.sh PLAIN 360 STD ON MONO NONE terminate
/usr/libexec/filters/psfilter.sh
#! /bin/sh PATH=/usr/libexec/filters:/usr/X11R6/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin export PATH # #LANG=ja_JP.eucJP #export LANG # mt=$1 # PLAIN SFINE PMPHOTO re=$2 # 360 720 ql=$3 # STD FINE PHOTO hs=$4 # ON OFF in=$5 # COLOR MONO cc=$6 # PHOTO GRAPH NONE # # width =210-3-3 =204mm = 204x(360/25.4)=2891dot = 8inch # height=297-3-14=280mm = 280x(360/25.4)=3968dot =11inch # gs -r${re} \ -sPAPERSIZE=a4 \ -q \ -dNOPROMPT \ -dNOPAUSE \ -dSAFER \ -sDEVICE=png16m \ -sOutputFile=- \ - \ -c \ quit |\ pips3500 -ui C \ -ms A4 \ -mt ${mt} \ -re ${re} \ -ql ${ql} \ -hs ${hs} \ -ht ED \ -sc 100 \ -in ${in} \ -cc ${cc} \ -br 0 \ -co 0 \ -sa 0 \ -st 0 0 0 \ -mg 3 3 \ -ps AUTO
/usr/libexec/filters/lpraw-filter.sh
#!/bin/sh # # raw filter for any printer # initepsonusb.sh /bin/cat
prov
lp-filter.sh中で使用している、拙作provに関しては、prov-1.1 -- Overlay printing utility for UNIX-like systemsを参照。
_ lpr(LPRng等)とgtk+-2.0系のアプリケーションに関して
firefox等のgtk+-2.0系のアプリケーションで印刷を行う際に、デフォルトでは[LPRに印刷する]の選択肢が出てこない。まぁ大方の人間はCUPSを使っているのだろうから構わないということなのだろう。
[LPRに印刷する]の選択肢を出すためには、/etc/gtk-2.0/gtkrcまたは~/.gtkrc-2.0に以下のような記述を追加する。
gtk-print-backends="file,lpr,cups"
2012年04月16日 ghostscript-9.05 インストール [長年日記]
_ ghostscript-9.05 インストール
Slackware-11.0という古めの環境に最新のghostscript-9.05をインストールした。 Web上の情報やら、自分で気づいた方法やら、ごった煮のインストール手順のメモ。
TTF, OTFフォントの用意
Slackware-13.37環境の/usr/share/fonts/TTF/と/usr/share/fonts/OTF/を拝借し、それぞれを/usr/local/share/fonts/TTF/と/usr/local/share/fonts/OTF/にコピー。 それぞれのディレクトリに入って、mkfontscaleとmkfontdirを実行。
/usr/local/share/fonts/TTF/にはsazanami-mincho.ttfとsazanami-gothic.ttfが入っている。
ビルド
- tar xvjf ghostscript-9.05.tar.bz2
- cd ghostscript-9.05
- ./configure --disable-compile-inits --disable-cups --with-fontpath="/usr/local/share/fonts/TTF:/usr/local/share/fonts/OTF"
- make
- make so
- su -
- make install
- make soinstall
--disable-compile-initsを付けないと/usr/local/share/ghostscript/9.05/Resource/が出来ない。--disable-cupsはcups関係でコンパイルエラーが出たので...。
postscriptフォントのインストール
Slackware-currentのソースから拝借。
- su -
- cd /usr/local/share/ghostscript/
- tar xvjf ghostscript-fonts-std-8.11.tar.bz2
cidfmapの作成
Slackware-13.37の/usr/share/ghostscript/9.00/Resource/Init/cidfmapを拝借し/usr/share/ghostscript/9.05/Resource/Init/cidfmapにコピー。 基本的には以下の設定でいけるはず。
/Sazanami-Gothic << /FileType /TrueType /Path (sazanami-gothic.ttf) /CSI [(Japan1) 6] >> ; /Sazanami-Gothic-Regular /Sazanami-Gothic ; /Sazanami-Gothic-JaH << /FileType /TrueType /Path (sazanami-gothic.ttf) /CSI [(Japan2) 0] >> ; /Sazanami-Gothic-Regular-JaH /Sazanami-Gothic-JaH ; /Sazanami-Mincho << /FileType /TrueType /Path (sazanami-mincho.ttf) /CSI [(Japan1) 6] >> ; /Sazanami-Mincho-Regular /Sazanami-Mincho ; /Sazanami-Mincho-JaH << /FileType /TrueType /Path (sazanami-mincho.ttf) /CSI [(Japan2) 0] >> ; /Sazanami-Mincho-Regular-JaH /Sazanami-Mincho-JaH ; /Ryumin-Light /Sazanami-Mincho ; /Ryumin-Light-H /Sazanami-Mincho ; /GothicBBB-Medium /Sazanami-Gothic ; /GothicBBB-Medium-V /Sazanami-Gothic ; /HeiseiMin-W3 /Ryumin-Light ; /HeiseiKakuGo-W5 /GothicBBB-Medium ; /HeiseiMin-W3-Acro /Ryumin-Light ; /HeiseiKaKuGo-W5-Acro /GothicBBB-Medium ; /Kochi-Gothic /Sazanami-Gothic ; /Kochi-Mincho /Sazanami-Mincho ; /WadaMin-Regular /Sazanami-Mincho ; /WadaMin-Bold /Sazanami-Mincho ; /WadaGo-Regular /Sazanami-Gothic ; /WadaGo-Bold /Sazanami-Gothic ; /Adobe-Japan1 /Sazanami-Gothic ; /Adobe-Japan2 /Sazanami-Gothic-JaH ;
cidfmapの/CSIパラメータ(CIDSysteminfo)について
CID (文字コード) - Wikipedia、Font technical notesを参照。
最後に
こんな適当なインストール方法でも一応、憲法第9条.psが表示できたので、良とすることにする。
2012年04月21日 mruby on zaurus [長年日記]
_ mruby on zaurus
軽量rubyらしい。zaurusで動けば嬉しいのだが...
gcc -Wall -Werror-implicit-function-declaration -g -MMD -I../../src -I../../src/../include -c ../../src/st.c -o ../../src/st.o ../../src/st.c: In function 'st_hash': ../../src/st.c:1053: error: 'SIZEOF_ST_INDEX_T' undeclared (first use in this function) ../../src/st.c:1053: error: (Each undeclared identifier is reported only once ../../src/st.c:1053: error: for each function it appears in.) make[2]: *** [../../src/st.o] Error 1 make[1]: *** [../bin/mrbc] Error 2 make: *** [src/mrblib/mrblib.o] Error 2
SIZEOF_ST_INDEX_Tがどこにも定義されていない?
解決
Mac OSXでも同じ状況だった様子。対応がめちゃくちゃ早い。
--- a/src/st.c +++ b/src/st.c @@ -963,6 +963,8 @@ strhash(st_data_t arg) #define MURMUR 2 #endif +#define SIZEOF_ST_INDEX_T __WORDSIZE + #if MURMUR == 1 #define MurmurMagic 0xc6a4a793 #elif MURMUR == 2
また引っかかった
リンク段階でエラー。
make: built targets of /home/m-ito/tmp/mruby-mruby-9718925/mrblib gcc -o ../../bin/mruby ../../src/../tools/mruby/mruby.o ../../src/array.o ../../src/ascii.o ../../src/class.o ../../src/codegen.o ../../src/compar.o ../../src/crc.o ../../src/encoding.o ../../src/enum.o ../../src/error.o ../../src/etc.o ../../src/gc.o ../../src/hash.o ../../src/init.o ../../src/init_ext.o ../../src/kernel.o ../../src/load.o ../../src/numeric.o ../../src/object.o ../../src/pool.o ../../src/print.o ../../src/proc.o ../../src/range.o ../../src/re.o ../../src/regcomp.o ../../src/regenc.o ../../src/regerror.o ../../src/regexec.o ../../src/regparse.o ../../src/sprintf.o ../../src/st.o ../../src/state.o ../../src/string.o ../../src/struct.o ../../src/symbol.o ../../src/transcode.o ../../src/unicode.o ../../src/us_ascii.o ../../src/utf_8.o ../../src/variable.o ../../src/version.o ../../src/vm.o ../../src/y.tab.o ../../src/../mrblib/mrblib.o -lm ../../src/../mrblib/mrblib.o: In function `mrb_init_mrblib': /home/m-ito/tmp/mruby-mruby-9718925/mrblib/mrblib.c:16: undefined reference to mrblib_irep' collect2: ld returned 1 exit status make[1]: *** [../../bin/mruby] Error 1 make: *** [src/init_ext.o] Error 2
実は少し前の段階で
make: built targets of /home/m-ito/tmp/mruby-mruby-9718925/tools/mrbc cat array.rb compar.rb enum.rb error.rb hash.rb kernel.rb numeric.rb print.rb range.rb string.rb struct.rb > mrblib.rbtmp ../bin/mrbc -Bmrblib_irep -omrblib.ctmp mrblib.rbtmp; cat init_mrblib.c mrblib.ctmp > mrblib.c /bin/sh: line 1: 8007 Segmentation fault ../bin/mrbc -Bmrblib_irep -omrblib.ctmp mrblib.rbtmp
セグっている。なぜ?
とりあえずgdbをかけた結果を貼っておく。
10027 m-ito@c860:~/tmp/mruby-mruby-9718925/mrblib$ gdb ../bin/mrbc GNU gdb (GDB) 7.1 Copyright (C) 2010 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "arm-slackware-linux-gnueabi". For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>... Reading symbols from /home/m-ito/tmp/mruby-mruby-9718925/bin/mrbc...done. (gdb) run -Bmrblib_irep -omrblib.ctmp mrblib.rbtmp Starting program: /home/m-ito/tmp/mruby-mruby-9718925/bin/mrbc -Bmrblib_irep -omrblib.ctmp mrblib.rbtmp Program received signal SIGSEGV, Segmentation fault. 0x000ae9f4 in parser_yylex (p=0x11fb90) at ../../src/parse.y:4406 4406 if (!identchar(c)) { (gdb) list 4401 case '_': 4402 newtok(p); 4403 break; 4404 4405 default: 4406 if (!identchar(c)) { 4407 yyerror_i(p, "Invalid char `\\x%02X' in expression", c); 4408 goto retry; 4409 } 4410 (gdb) quit A debugging session is active. Inferior 1 [process 8052] will be killed. Quit anyway? (y or n) y 10028 m-ito@c860:~/tmp/mruby-mruby-9718925/mrblib$
解決!(2012.6.29 追記)
#define ALLOC_ALIGN 4
を、src/pool.cの先頭に追加で解決(^^)d
2012年04月29日 Kinput2 for UTF-8 [長年日記]
_ Kinput2 for UTF-8
Add ja_JP.UTF-8 to *IMProtocol.locales: in /usr/X11R6/lib/X11/app-defaults/Kinput2 like following.
*IMProtocol.locales: ja_JP.UTF-8, ja_JP.SJIS, ja_JP.EUC, ja_JP, japanese, japan, ja
or add Kinput2*IMProtocol.locales: ja_JP.UTF-8, ... into ~/Xresources.