2014年3月2日日曜日

FreeBSD 上での Perl の UTF-8 の文字化けではまる

 久々に FreeBSD ではまってしまった。 何にハマったかというと,Perl の UTF-8 テキスト文字列の取扱いでハマった。 Perl + cgi と apache 2.2 で web を運用し,かつ,PostgreSQL で運用しているデータベースの情報を web に載せている。 その際,Perl 内部での日本語文字列(より正確には UTF-8 の文字列)の encoding というので文字化けが発生してしまい,頭が混乱してしまった。 今回はこの件について書こう。
 先に最終的に今回私が採用した解決方法を書いておこう。 私が採用した解決方法は,Perl スクリプトの先頭付近に
use utf8;                            # use utf8 in Perl
use open ':encoding(UTF-8)';         # input/output default encoding is UTF-8
use open ':std';                     # STDIN, STDOUT, STDERR is set equal to "use open ':encoding(UTF-8)';"
という記述を書き,cgi の form でやりとりした文字列に対しては,
$input_string = Encode::decode('utf8', $input_string);
のようにして,文字列のエンコーディングを変換する,という作戦である。

1. システム構成
 まず,今回の件の動作環境について書いておこう。
私は,個人的なサイトのために FreeBSD でサーバーを運用している。 サーバーと言っても,マシン自体はちょっと古くなった Windows の Note PC を格下げして使っているのだが…。 サーバー上では,現在 FreeBSD release 9.0 を動かしている。 その上で,apache 2.2 で web site を立ち上げている。 web site は,主に cgi を使って運用している。 cgi を使うには Perl が必要なのだが,FreeBSD では「当然」Perl は最初から入っている。 現在の Perl のバージョンは,5.18 にしている。 さらに,データの管理のためにデータベースを運用している。 データベース用のアプリケーションは PostgreSQL 9.2.7 を運用している(今回の件で 9.3.3 にあげたが…)。

2014年2月28日金曜日

(FreeBSD 上での)PostgreSQL のメジャーアップデートの仕方のメモ

FreeBSD 上で PostgreSQL を使ったデータベースを運用してるが, 今回,PostgreSQL のメジャーアップデートを行ったので,そのメモを残しておこうと思った。

 そもそも PostgreSQL のメジャーアップデートとは何か? PostgreSQL のバージョンは,PostgreSQL 9.3.3 のように3つの数字で表される。 ここで,9.3 がメジャーバージョンを表し,最後の 3 がマイナーバージョンを表してる。 PostgreSQL のドキュメントにも書いてあるが,マイナーバージョンレベルでのアップデートは, 単に,運用されている PostgreSQL を止め,アプリケーションのコードを更新してから PostgreSQL を起動しなおせばいい。 データの構造が変わることはまずないので,単にアプリケーションソフト自体のみを更新すればいいらしい。

 しかし,メジャーバージョンが変わるアップデートの場合には,データ構造に変更がある場合もあるので,工夫が必要らしい。 備忘録として,以下にまとめてみた。

1. database のデータの dump を作っておく(dump を経由してデータを移行する)(PostgreSQL は動かしたままで行う)
 # /usr/local/bin/pg_dump -U pgsql -E UNICODE testdb > testdb.dump.2014xxxx

2. 古いデータベースを念の為に削除(postgresql はまだ動かしたまま)
 # dropdb -U pgsql testdb

2014年2月20日木曜日

エプソンのネットワークプリンターアダプター PA-TCU1 の設定変更で手間取った件

最近,家のネットワーク環境が少し変わったため,無線LANルーターを新しいものに更新した。 その際,家で運用しているサーバーなどの IP アドレスの設定変更でごたごたしたのだが, 最後にプリンターで手間取ってしまった,という話。

 1個まえの投稿でも書いたのだが,家のネットワークが 100Mbps から 1Gbps へと更新された。 それに伴って,無線LANルーターも 1Gbps 対応のものに入れ替えた。 その際,これまで無線LANルーターにもたせていた local IP アドレスが使えなかった。 どうもブリッジ接続用に予約されてしまったみたい。 そこで,仕方なく別の番号を無線LANルーターのローカルな IP アドレスに指定した。 そうなると,家で使っているコンピュータ類の設定をいじらないといけないものが出てきた。 その一つが家で運用しているサーバーの設定。 resolv.conf や default router などの設定をいじらないといけなかった。 それらの設定でも結構時間を取られたのだが,プリンターの設定までは気が回っていなかった。

 家にあるプリンターはエプソンのインクジェットプリンターなのだが, ネットワーク上に置いておきたいと思ったので,ネットワークプリンターアダプターなる機器を介して,プリンターをネットワークにつなげている。 ネットワークプリンターアダプターは,EPSON の PA-TCU1 という機種。 プリンターは PA-TCU1 とは USB ケーブルで接続されている。 この PA-TCU1 は有線でも無線でもプリンターをネットワークにつなげるというもので,結構便利に使わせてもらっている。 しかし,この PA-TCU1 を介してつないでいるプリンターで印刷ができない,という事態が発生した。 最初は「プリンターで印刷できへん」という苦情だった。 仕方なくプリンターユーティリティで様子を探ろうとしてみたが,どうもプリンターにつながらないみたいだった。 無線LANルーターを更新した際に,プリンターが IP を取得できていないのかもしれない,と思って, エプソンのネットワーク用のユーティリティ(ネットワーク上にある EPSON のネットワークプリンターアダプターを探して設定できるソフト)である EpsonNet Config V4 をインストールしてみた。 しかし,EpsonNet Config V4 を起動後,何度最新情報に更新してみてもアダプターが現れない。 うちは家用は Macintosh なのだが,Windows のノート型パソコンもあるのでそちらで調べたりしてみたが,それでも同じだった。

 そこで,今度は無線LANルーターの設定を見なおしてみた。 MAC アドレスでの接続制限をして,DHCP では固定アドレスをプリンターに与えているのだが,その辺りの設定ミスを疑ってみた。 しかし,無線LANルーターの設定を見なおしてみてもおかしな感じは見受けられなかった。

 そこで,仕方ないのでプリンターと PA-TCU1 を見なおしてみることにした。 PA-TCU1 の背面にはスイッチが2個ある。そのうちの上側の1個を押してみた。 すると,ネットワークに関する情報の一覧みたいなのがプリンターで印刷された。 それを見ると,どうも以前の無線LANルーターの SSID を記憶していて,その SSID の無線LAN につなごうとしているみたいだった。 それはつながらないわ,と思った。

 仕方ないので,PA-TCU1 を初期設定に戻す作業をしてみた。 具体的には,PA-TCU1 の背面にある上の方のスイッチを20秒以上押し続けていると,初期設定に戻るということだった。 実際にやってみると,20秒ほど経つと,正面の LED(上)が,赤→橙→緑の順に点灯し始めた。 これは初期化が始まったということみたい。 その後,ネットワーク情報を打ち出してみると,確かに SSID は EPSON net となって,初期化されたみたいだった。 しかし,その後もすぐにはつながらなかった。 ローカルネットワーク上から EPSON のネットワーク用ユーティリティ EpsonNet Config で PA-TCU1 を探すのだが,見つからない。 どうも,最初の設定時には有線でやるか,Baffalo の AOSS などを使わないといけないみたいだった。 うちの無線LANルーターは Baffalo じゃないので,AOSS は使えない。 仕方ないので,ノートコンピュータを PA-TCU1 のそばに持って行って,有線でつないでみた。 すると,ちゃんと EpsonNet Config 上に PA-TCU1 にが現れた。 そこで,設定をしてやると,無事に無線LANルーターを通して PA-TCU1 と通信することができた。

2014年2月11日火曜日

FreeBSD named で managed-keys-zone ./IN: loading from master file managed-keys.bind failed: file not found というエラーがでた

 バイクの写真を載せるのに FreeBSD のサーバーを運用している。 家の中の private network 内にサーバーを置き,mydns と無線LANルーターの port mapping 機能を使って外部からのアクセスに対応している。

 最近,家のネットワークの入口に設置している無線LANルーターを入替えた。 理由は,ネットワークを 100Mbps タイプから 1Gbps タイプにしたから。 あまり通信速度が速くなった感がないから 1Gbps にした意味があったかどうかは不明だが…。

 その際,これまで使っていたいくつかの private IP が予約されたみたいで,指定できなくなっていた。 一番困ったのが無線LANルーター自身の IP アドレス。 以前は無線LANルーター自身のアドレスは,デフォルトだと 192.168.0.1 だったのだが, それって普通すぎるからと思って,3桁目を違う数字にしていた。しかし,その番号が使えなくなってしまった。 そこで,仕方なく,無線LANルーターの LAN 側の IP をデフォルトの IP のままで使うことにしてみた。 となると,DHCP にしてないサーバーでは,DNS 指定や,default router の設定値を変更しないといけない。 プライベート用に named も運用しているのだが,その設定もいじらないといけなかった。 named の事はここには詳しいことは書かないが,今回は極力 named の設定ファイルをいじらずに済ませ,named を再起動してみた。

 すると,何故か named がエラーをいっぱい吐いてきた。 幾つかはコメントアウトに「;」を使うべきところでついつい「#」を使ってしまうなどの単純なタイプミスだったのだが,不明だったのが以下のエラーだった。
managed-keys-zone ./IN: loading from master file managed-keys.bind failed: file not found
どうやら「managed-keys.bind」というファイルが無い,と言っているみたい。 そんなこと言われても,以前からそんな名前のファイルはなかったと思うのだが…。

 仕方ないのでネットで検索してみた。 すると,「ファイルがないのなら,managed-keys.bind という名前の empty ファイルを作ればいい」という記述があった。 それは簡単,だと思ったのだが,問題はファイルを置く場所。 普通なら named.conf のある場所だろう,と思って,とりあえず named.conf のある場所に置いてみた。 具体的には「/etc/named/」の下。 私の使っている FreeBSD では /var/named/etc/named/ が /etc/named/ にリンクされているので,その下に置いてみた。 しかし…,エラーは消えなかった

 仕方ないので,英語のサイトも含めて調べてみた。 すると「working directory に置け」という記載を見つけた。 そういえば,/etc/named/ の下には,master/,slave/,dynamic/ 以外に working/ というディレクトリがある。 named.conf を見てみると,option 設定の中に,
        directory       "/etc/namedb/working";
と書いてあった。 どうやら,/etc/named/working/ (/var/named/etc/named/working/) が working directory みたいだった。 そこで,/etc/named/working/ の下に managed-keys.bind を置いてみた。 中身が何もない empty ファイルなので,
> touch managed-keys.bind
として作ってみた。

 するとエラーは消えた。なんかよくわからないが,エラーが消えたからよしとしよう。

2014年1月26日日曜日

FreeBSD で ports でのアップデート時のオプションの指定

 FreeBSD を使って,プライベートなサーバーを作っているのだが,ある程度の頻度で更新のチェックをして,必要に応じてアプリケーションの更新をしないといけない。 FreeBSD には,アプリケーションの更新のために ports というシステムがある。 FreeBSD のシステムの中に ports というディレクトリを導入しておいて,そこに記述されているものよりも古いバージョンのアプリケーションがあれば更新をしてくれる,というものである。 CPAN などの内容の変更も反映されるが,メンテナンスの人数の問題もあるようで,更新が反映されるにはある程度のタイムラグがある。

 今回,ports を通じてアプリケーションの update をしようとしたのだが, その際,一部のアプリケーションがうまくインストールされないために,アップデートが進まなかった。 具体的には,まず最初に pkgdb -F を実行しろ,と言われた。 そこで,pkgdb -F を実行しようと思ったら,x264 というソフトがインストールできないので,pkgdb -F を完了できない,ということだった。 ports でいうと,/usr/ports/multimedia/x264/ が相当する。 なぜインストールできないかというと,エラーメッセージによると, どうも asm がないから,x264 のための configure ができない,みたいな感じの事が書かれていた(実はちゃんと覚えてないし,メモも取ってない…)。 asm が何かよくわからないのだが,どうも i386 用ではなく,amd64 用の FreeBSD をインストールしているのが影響しているような気がしている。

 エラーメッセージには,configure の際に --disable-asm のオプションをつけなさい,というような事が書かれていた。 ということで,make config の際に --disable-asm というオプションをつけてやればうまくいくはずだった。 ところが,困ったことに,どのようにすればいいのかがいまいちわからなかった。 make config --disable-asm としてもいまいちうまくいったように思えないし…。 そこでいろいろとネットで調べてみると, /usr/ports/multimedia/x264/ の下に Makefile.local というファイルを作り,その中に
CONFIGURE_ARGS+= --disable-asm
と書けばいいみたい,ということがわかった。

 そこで,Makefile.local を作ってから,x264 をインストールしてみた。 すると,うまくインストールができた。 その後で pkgdb -F を実行してみると,ちゃんと完了させることができた。 その結果,portupdate も実行することができた。

 今回はちょっとしたことだったのだが,意外と知らないと悩んでしまう,という現象だった。 いずれにせようまく ports を通じてのアップデートができてよかった。 しかし,そろそろそのサーバーは FreeBSD 自体をアップデートしないといけないかもしれない。 システム全体をアップデートしないといけないかもなぁ…。

2014年1月1日水曜日

明けましておめでとうございます

明けましておめでとうございます。
今年もよろしくお願いします。

まつぴ

2013年12月29日日曜日

Gms-g9 の firmware をアップデートした

 昨年からGlobalTop製の GNSS/GPS ユニット Gms-g9 を使っている。最近は一回り小さいサイズの Gms-g6 が発売されているが,すでに Gms-g9 を3個持っているので,とりあえずは Gms-g9 を使っていこうと思っている。Gms-g9 に関しては,ねむいさんがいろいろとレポートされているので,よく参考にさせて頂いている。最近,ねむいさんがGPS/GNSSモジュールを試用する10 -Gms-g9のファームを更新-を書かれていた。その中で,Gms-g9 の firmware の最新版が v3.20 になっているという事だった。ねむいさんが買われた Gms-g9 は v3.10 だったので,GlobalTop Flash Tool を使って v3.20 にアップデートされた,という事が書かれていた。そうなると,俄然自分の持っている Gms-g9 の firmware のバージョンが気になった。そこで,GlobalTop GPS Viewer を使って情報を得てみた。すると,私の持っている Gms-g9 のうちの1個について見てみると,やはりバージョンは v3.10 だった。ほぼ同じ時期に同じネットショップから購入したので,firmware が同じなのは当然といえば当然なのだが…。

 firmware の最新版に関しては,ねむいさんが GlobalTop 社に直接連絡して最新版を頂いたそうで,お友達にも教えてあげてくださいな,と書かれていた,との事だった。そこでねむいさんにお願いして firmware の最新版をいただいた。書き込みは GlobalTop 社の Flash Tool を使った。ハード的にはSpark Fun 社の FTDI を用いて,書き込んだ。

2013年12月7日土曜日

FreeBSD の ports 経由の update についてのメモ

 ふと FreeBSD のアップデートをしようと思った。理由は特にない。ほんとに,ふと思い立ったのだった。 私は基本的に ports を使って update をさせている。 updater は portupgrade を使っている。 portupgrade は ruby18 を使っているから portmaster の方がいいという人もいるのだが, とりあえずは問題なく update してくれるので,とりあえずは良しとしている。

 今回,portupgarade を使って ports 経由での update をしたのだが,結構多くのエラーがでたのでまとめておこうと思った。 手順としては,
 1. portsnap fetch update を使って,ports を最新にしておく。
   以前は cvsup だったのだが,最近,portsnap を使いなさい,とどっかに御沙汰があったので portsnap を使うようにしている。

 2. 次に portupgrade -an として,どのアプリケーションが update の対象になっているかを調べる。
   ここで,-a オプションはすべてが対象であり,-n オプションは調べるだけで update の処理は行わない,というもの。
   もし,そのリストに Perl などの基本的なアプリケーションが入っていたら要注意ということになる。

 3. 要注意アプリケーションが update のリストに入っていたら,/usr/ports/UPDATING をチェックした方がいい。
   あなたが前回 update を行った以降のエントリーがあれば,注意した方がいい。
   特に Perl のようにいろいろな所で使われているアプリケーションだと,影響が大きいので注意が必要となる。
   具体的には,Perl のバージョンが上がると,Perl に依存しているアプリケーションすべてを強制的に update しないといけない事がある。

 4. いちいちオプションを選択するのがめんどくさいので,export BATCH=yes (tcsh 系では setenv BATCH yes) としておく。
   既にインストールされているアプリケーションは,同じオプションを指定することになるので,とても便利である。

 5. いよいよ update となる。具体的には portupgrade -a とすればよい。

2013年12月2日月曜日

Sena SMH10 のファームウェア・アップデートのまとめ

 以前,Sena SMH10 のファームウェアをアップデートしたとして,SENA 製の Bluetooth ヘッドセットのファームウェアアップデートの話を書いた。 今回,Firmware v4.3 が公式にリリースされたので,備忘録を兼ねてまとめなおしておこうと思う。 以前の時にも書いたが,私が持っているのは,日本国内で販売されている正規品ではなく,USA 仕様の正規品の SMH10 である。 そのため firmware アップデートには USA SENA のサイトに行かないといけない。 その辺りのまとめである。

2013年11月13日水曜日

FreeBSD で Net::SMTP::TLS を使うには (2013/11 現在)

 Net::SMTP::TLS は2006年1月以来更新が止まっていて,2016年時点ではすでに非推奨になっている。 そこで,2016年11月に FreeBSD で,Perl で gmail からメールを送る:Net::SMTP::TLS をやめて,Net::SMTP,IO::Socket::SSL,Authen::SASL を使うことにした というのを書いたので,そちらも参照してみて欲しい。
 以前,FreeBSD, Perl の Net::SMTP::TLS ではまるという投稿を書いた。 それは,FreeBSD のサーバーから,Perl で 587 番ポートを使って gmail からメールを送信する際に, Net::SMTP::TLS がうまく使えない,という話だった。 その時は CPAN にある Net-SMTP-TLS-ButMaintained というのが使えそう,という事を書いた。 その当時(2012/12),FreeBSD の ports には,Net-SMTP-TLS のバージョン 0.12 しかなく,Net::SMTP::TLS を使って Perl で 587 番ポートを通じてメールを送信するのは不可能だった。 その時の解決策は CPAN の Net-SMTP-TLS-ButMaintained を取ってきて,TLS.pm を置換える作戦だった。 その作戦を使うと TLS.pm + Perl で 587 番ポート経由でメールを送信することができた。

 その後,そのままメールを使っていたのだが,Perl のバージョンを 5.18 に上げた際に,Perl + Net::SMTP::TLS で 587 番ポートからメールが送信できなくなったので,以前の話を思い出した。 Perl のバージョンを上げると,Perl 関連のパッケージをインストールしなおさないと行けないのだが,Net::SMTP::TLS は,ButMaintained を手動で置換えないといけないのだった。 その時,FreeBSD の ports を見ると,p5-Net-SMTP-TLS 以外に p5-Net-SMTP-TLS-ButMaintained という ports が作られているのを見つけた。 これは使えるかもしれない,と思って,p5-Net-SMTP-TLS-ButMaintained を使ってみようと思ったのが,今回の話。