PC::Software::Perl Feed

2012年5月 6日 (日)

Perl用のIDE

IDE(統合開発環境)というと大げさだけど、要はプログラミング支援ソフト。Perl向けのものを2種類ほど試してみた。

Perl_ide

この手のものは今まで使ったことがなかったのだけど、なかなか便利そうだ。いちいち手動でプログラムを実行しなくても、プログラムを書いていくそばからシンタックスをチェックして、問題がありそうなところを赤線で教えてくれる。デバッグの時には、プログラムの実行を任意の場所でいったん止めて、1行1行進めていきながら、変数に格納されている値がどう変わるかを見ることもできる。

今ほどPerlになれていなかった時こそ、こういうのがあったら便利だったろうに。でも、その当時は、目の前のタスクをやっつけるのに精一杯で、IDEとかデバッガの使い方を覚えようなんて余裕がなかった。切羽詰まっているときほど、一歩引いて、広めの視野を持つのが大切ということか。(まぁ当時は、今ほど進んだIDEはなかったのかもしれないけれど)

ともあれ、どちらのIDEも使い物にはなるけど、長い行の折り返し表示や、ファイルを開くときの自動エンコード判定ができる点で、Komodoの方が便利。Komodoは保守なしだと$295。「日曜大工」のための道具としては、そう高くもないかな。

2011年3月 7日 (月)

Mac OS X 10.6.6のX11に東雲フォントをインストール

X11上で動くGUIアプリをPerl/Tkで書いていたのだが、ある日突然フォント描画が汚くなった。Mac OS Xを10.6.2から10.6.6にアップデートしたら、X11用のビットマップフォントが無くなったようだ。無くなったのではなくて、見つけることができなくなったのかもしれないが、とにかく使えない。そこで、このあたりを参考に東雲フォントをインストールしたので、手順をメモ。

まず配布サイトから東雲フォントをダウンロード・解凍して、以下のようにコピーする。(2行目の効果のほどはちょっとよく分からない…)

sudo cp ~/Desktop/shinonome-0.9.11/bdf/*.bdf /usr/X11R6/lib/X11/fonts/local/
sudo /usr/X11R6/bin/mkfontdir /usr/X11R6/lib/X11/fonts/local/

これだけでは上手く行かなかったようなので、「/usr/X11/lib/X11/xinit/xinitrc.d/10-fontdir.sh」に上記パス(/usr/X11R6/lib/X11/fonts/local/)を加えた。そうすれば、X11で東雲フォントを使えるようになった。

ちなみに、X11のターミナルでxlsfontsコマンドを実行すれば、X11で使えるフォントのリストを確認できる。「-shinonome-gothic-medium-i-normal--0-0-75-75-c-0-iso8859-1」のようなのが表示されればOK。

2009年12月 1日 (火)

Mac OS X 10.6でのPerl(5.10)モジュールのインストール

10.6 "Snow Leopard"にいくつかのPerlモジュールをインストールしようとして、少し苦労してしまったので、以下簡単にメモ。

ちなみにSnow Leopardには、比較的新しいPerl 5.10が載っているのだが、FINKには5.10用のモジュールがまだあまり整備されていなかった。そのために、自前で多くのモジュールをインストールせねばならなかったので、少し苦労することに…。Mac OSの新しいバージョンは、出てから1年くらいたってから手を出すのが良いかもしれない。なお、大半のモジュールは伝統的なやり方で大丈夫だった。例えば「Jcode」モジュールをインストールするには、ターミナルで以下のようにすれば良い。

sudo perl -MCPAN -e shell
install Jcode

しかしDBD::mysql、Image::Magick、Perl/Tkといったモジュールでは、いくらか手を加える必要があった。まずDBD::mysqlから。

  1. まず32bit版のMySQL Serverをインストールする。これはmysql.comののBinaryパッケージでOK。OSが64bitでも、32bit版をインストールするのがポイント。
  2. ターミナルで「export PATH=/usr/local/mysql/bin:$PATH」を実行。
  3. あとは同じターミナルでDBD::mysqlのインストールを行えば良い。

次にImage::Magick。FINKではImageMagick本体とそのPerlモジュールが別々になっていて、Perl 5.10用のモジュールはまだ用意されていない。そこで、ImageMagick本体のインストール時に、Perlモジュールも一緒にインストールしてしまうように変更する。

  1. FINKでImageMagicのパッケージをソースからインストール。
  2. インストールが上手く行くことを確認したら、いったんFINK上でImageMagicをアンインストール。
  3. 次の手順で、FINKのImageMagickパッケージを編集する。
    1. まず、現在のパッケージ記述を
      fink dumpinfo -finfofile ImageMagick
      で探す。
    2. これを /sw/fink/10.5/local/main/finkinfo にコピーする
    3. コピーしたものを編集して、パッケージの名前を「my-ImageMagick」のように変更し、「--without perl」という記述を削除する
  4. 編集した「my-ImageMagick」をインストールすれば、Perlモジュールも自動的にインストールされる。

最後はPerl/Tk。せっかくのMacなので、Perl/Tkで作成したGUI・Windowでも、ヒラギノフォントにアンチエイリアスをかけて表示したい。そのためには少し手間をかける必要がある。

  1. FINKを使ってfontconfig、freetype、xftなどをインストール。Geditをインストールして、Geditでヒラギノフォントを選べるようになっていればこの段階の準備は完了。
  2. Perl/TkをCPANからダウンロードして解凍。今回使用したのはTk-804.028_501。
  3. myConfigの409行目を次のように編集(赤が追加部分)。
        my $ftinc = Ift("/usr/include","/usr/local/include","/sw/include",$X11INC||());
  4. PNG/Makefile.PLの18行目~30行目までを次のように編集(赤が編集部分)。
        if (1)
         {
          Tk::MMutil::TkExtMakefile(
               NAME         => 'Tk::PNG',
               VERSION_FROM => 'PNG.pm',
               XS_VERSION   => $Tk::Config::VERSION,
               dist         => { COMPRESS => 'gzip -f9', SUFFIX => '.gz' },
               OBJECT       => '$(O_FILES)',
               INC          => '-I/sw/include',
               LIBS         => ['-L/sw/lib -lpng -lz -lm'],
             );
         }
  5. makeする際には以下のようにする:
        perl Makefile.PL XFT=1
        make
        sudo make install

こうしてあれこれモジュールをインストールせねばならないのは、面倒と言えば面倒。しかし、それだけ多くの先人達の仕事(モジュール)があってこそ、自分の仕事が成り立っているということでもある。(アカデミックな分野ではとりわけ)フリーソフトウェア(自由ソフトウェア)の考え方は素晴らしい。感謝。

2009年8月17日 (月)

PerlでのSMTP認証

Perlを使って、SMTPサーバーからメールを送信する方法についてはちらほら解説がある

こうした方法で基本的には十分なのだが、多くのプロバイダが導入しているop25bを乗り越えて、なおかつYahoo! MailのSMTP認証をパスするには、2~3行加える必要があった。SMTPサーバーへの接続時に、以下のようにすると良い。

my $smtp = Net::SMTP->new( 'smtp_server', Port => 587);
$smtp->auth( 'id', 'pass' ) or die("aurh failed\n");

「それだけ?」という感じだけど、それだけ。あとは普通に送信すれば大丈夫。Net::SMTP::TSLとかNet::SMTP_aurhとかいったモジュールが要るのかと思ったけれど、必要なかった。ちなみに、1行目でポートをブロックされている25から587に変えて、2行目でSMTP認証を行っている。

あと、ヘッダ内で日本語を使いたい場合は、Jcodeモジュールを使った変換の方がシンプルに書けて楽かも。

$header .= "From: ".Jcode->new('日本語の名前')->mime_encode." <from@address.com>\n";

2009年7月29日 (水)

Blackboardに提出された課題ファイルの回収

授業の資料配布や課題提出などをWeb上で行える「Blackboard Learning System」だが、ちょっと使用法でつまずいたのでメモ。

添付ファイルで提出された課題を、全員分まとめてダウンロード・保存するには、次のような手順を踏めば良いらしい。

  1. ダウンロードしたい「課題」の「提出済みタブ」を開く。
  2. ページ右下で「すべて」を選んで「>」アイコンをクリック。これで、提出された課題がすべて表示される。
  3. 次に、ページ左上(一番上)のチェックボックスにチェックを入れると、提出された課題がすべてチェック・選択される。
  4. その状態でページ右下の「印刷用表示」をクリックする。
  5. 「まとめられた答案」が表示されるので、このページで「ファイルに保存」をクリックする。

まず、この手順そのものが分かりにくい。

おまけに、この手順で作成できるZipファイルでは、日本語ファイル名・フォルダ名が文字化けしている。提出者ごとにフォルダが作成されていて、それらのフォルダの中に提出ファイルが入っている。そのフォルダ名=提出者名なので、これが化けているのはちょっと辛い。

この文字化けは以下のPerlスクリプトで修正(しつつ解凍)できるのだが、Blackboard君にはもう少し頑張って欲しい所だ。たぶん、良い値段がするモノなんだろうし。

続きを読む »

2009年6月 6日 (土)

Mac OS Xのファイルシステムの文字コード

Mac OS Xのファイルシステムは、一般的な「UTF-8」ではなく、「UTF-8-MAC」という文字コードでファイル名を保存している。この「UTF-8-MAC」では、「パ」のように濁点・半濁点がついた文字が、「ハ」+「半濁点」という形で2文字(?)に分けて保存されている。「パ」1文字で保存するのをNFC、「ハ」+「半濁点」の2文字で保存するのをNFDと言うらしい。

ここで、プログラム側からファイル名を伝えるときは、「パ」と言っても(UTF-8 / NFC)、「ハ」+「半濁点」と言っても(UTF-8-MAC / NFD)、どちらでもOKのようだ。ファイルシステムが自動的に「パ」から「ハ」+「半濁点」へ変換してくれる。

ただし、ファイルシステムからファイル名を受け取る場合は、常に「ハ」+「半濁点」の形(UTF-8-MAC / NFD)になっている。この状態ではEUC-JPやSHIFT-JIS等の文字コードには変換できない。事前に普通の「UTF-8」に変換しておく必要がある。この普通の「UTF-8」への変換を行う際に、単にNFD→NFCへの変換だと考えて、

#!/usr/bin/perl
use Unicode::Normalize qw/NFC NFD/;
$char = NFC( $char );

とやってしまうのはマズイらしい。「UTF-8-MAC」は一般的なNFDとちょっと違っているために、上のコードでは余分な変換まで行われてしまうとのこと。というわけで正解は以下のコード:

#!/usr/bin/perl
use Text::Iconv;
$char = Text::Iconv->new( 'UTF-8-MAC', 'UTF-8' )->convert( $char );

「『UTF-8-MAC』を『UTF-8』に変換する」という処理をしなくてはならないらしい。

これが分かってしまえばどうと言うことはないのだけれど、明らかに誤っていたり、紛らわしかったりな情報がWebに溢れていたので、少し戸惑ってしまった。少なくともコンピュータ関係に限っては、Googleで検索すればすぐに問題が解決してしまうことが多かったので、つい油断していたようだ。コンピュータ関係についても、Webにはまだまだ怪しい情報が多いということを、念頭に置いておかないと…。

2009年2月27日 (金)

WindowsにおけるPerlの終了処理

以下のように書いておけば、Perlのプログラムが動作中にWindowsがシャットダウンされた場合に、終了処理を実行できるという話がある。

$SIG{INT} = $SIG{HUP} = $SIG{TERM} = $SIG{KILL} = $SIG{QUIT} =
  sub {
     # 終了処理の内容
     exit;
  }

確かに、OSによっては上手くいくようで、Windowsのシャットダウンを少し待たせて、終了処理を実行してくれる。各OSの対応状況はこんなかんじ。

Windows 98 SE ×
Windows 2000 Server
Windows XP
Windows 2003 Server
Windows Vista ×

今更Windows 9x/Meでうまく動かないのはまぁ仕方ないかと思う。しかし、Vistaで上手くいかないはちょっと辛い?

続きを読む »