トップ 最新 追記

Masa's blog

検索キーワード:

2012年04月05日 午後のコーダのソースが消失? [長年日記]


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/ekplp0System 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/にコピー。 それぞれのディレクトリに入って、mkfontscalemkfontdirを実行。

/usr/local/share/fonts/TTF/にはsazanami-mincho.ttfsazanami-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のソースから拝借。

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 (文字コード) - WikipediaFont 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.

_ canfep for UTF-8

diff for source :)

http://gentoo.osuosl.org/distfiles/canfep_utf8.diff