先日「第120回東京エリアDebian勉強会、2014年11月勉強会」に参加してきました。 rroonga関連のパッケージをどうにかしようと考えていたのですが、Jornada 720にDebianを入れようとしていた人が来ていたので、そのお手伝いをしました。私自身はJornada 680を持っていて、過去にDebianを入れて使った経験があったので、それが多少役に立ちました。 Jornadaは、今は亡き「ハンドヘルドPC」と呼ばれるカテゴリのデバイスで、キーボードとディスプレイのついた小型PC的なものです。680はsh3が、780はStrongARMが搭載されています。標準OSとしてWindows CEが入っています。 基本的には「Lenny on j720」にあるカーネル、ブートローダー(CE用実行バイナリ)をCFに入れて、適切なカーネルパラメータを設定して起動するだけです。 任意のアプリケーションをインストールできるようにしたかったのですが、その場にあったPCMCIAネットワークカード(Corega PCC-TD)の認識がうまくゆかず、そこまではたどり着けませんでした。 一応、最近のkernelにもjornada 780向けのコード自体は入っていますが、パッケージとして用意されているarm用カーネルでその設定を有効にしたものは現状ありませんでした。コンパイルして動くかどうかもあやしい気がします。 この時代のunstableはLennyだったようで、userlandはLennyのものでした。このころはhotplug周りの仕組みが変化していた時期でしたが、Lennyは既にudevで動いていたようです。/etc/pcmcia/config*にCorega PCC-TDの設定を追加してやればNICも動いたかもしれません。 しかしLennyの頃はアーキテクチャarmとarmelが用意されていたのに対して、それ以降ではarmel/armhfに変わっています。ABIも変わってしまっているので、直接的なアップグレードはおそらくうまくいかなかったことでしょう。 Jornada 780は探せば1万円を切る程度の価格で入手できるようですが、さすがに今から使おうという気にはちょっとなれませんでした。
最近壊したもの
昨年は本厄年で、今年は後厄を迎えているのですが、ここ2か月ぐらいでかなりの勢いでモノを壊してしまったので、記録として残しておきます。 Bluetoothキーボード 以前購入した「ELECOM Bluetoothフルキーボード ゲーム用82キー 9台切替 ブラック TK-GMFBP043BK」です。ちょっと引っかけてしまい、キートップが一つとれてしまいました。このキーボードはパンタグラフタイプです。 対処 エレコムのサポートに問い合わせたところ、サポート期間半年以内であれば対応とのことで、新品を送ってきてくれました。故障したものと購入を証明できるものを送り返してくれとのこと。神様のような対応です。 Playstation VITA(初代3Gモデル) ジップロックに包んで水場で使っていたのですが、口をしっかりと締めていなかったため、するりとジップロックから本体がこぼれおち、がっつり水没させてしまいました。 1週間ほど陰干ししていたのですが、結局復帰することはありませんでした。 対処 水没に関しては通常修理対応しないということなので、中古で新しいモデルのWiFi版を購入しました。目下の課題は、壊れた本体とPS3との紐づけを外すことです。一応、サポートセンター経由でできるようです(未実施)。 Nintendo 3DS LL ジムで運動しているときに、うっかり落としてしまいました。LEDがついている右側のヒンジ部分を強打してしまい、破損してしまいました。上部液晶は通電はしているものの、映像は移りません。 対処 取り急ぎ、中古の本体を購入しました。現在修理依頼をしているところです。直ったら、最悪一人すれ違い用にしようと思っています。 Nexus 5 路上にて、胸ポケットにいれるつもりが位置を外してしまい、そのままアスファルトの地面に落下し、表面ガラスが大きく破損しました。液晶表示およびタッチ部分に問題はありませんでしたが、通知部にひびが集中して見づらい状況でした。 対処 LGモバイルサポートセンターに修理として出しました。修理中はしまっていたGalaxy Nexusを引っ張り出して我慢しましたが、今となってはほぼ使い物にならないレベルでした(メモリ、CPU不足)。 修理費用は2万9千円程度になりました。白ロムのNexus5 32GBが4万円程度で流通しているようですが、修理してもらうことにしました。1週間程度で修理は完了し、現在はソフトケースを取り付けて利用しています。 LCD-10000VH2 外でもECS Livaの開発に使えるようなディスプレイが欲しい、ということでUSB給電で動作する小型のLCDパネル「センチュリー 10.1インチHDMIマルチモニター PLUS ONE HDMI LCD-10000VH2」を購入しました。 いい加減に保管していたら、ディスプレイ部に荷重がかかりすぎてしまい液晶が割れてしまいました。 対処 修理に出すことを検討していますが、まだアクションは起こしていません。正直いろんなものが集中して壊れすぎてこちらの精神まで壊れそうです。 まとめ あらためてまとめてみると不幸続きにもほどがあることを実感できます。適切な取り扱いや、自衛対策をより進めてゆきます。
Windows版puttyのビルド
puttyのビルドに関する情報、特にWindows向けが少ないのでメモとして記録しておきます。 必要なもの Perl (ActivePerl, Strawberry, cygwinなんでも良い) puttyのソース スクリプトの実行 perl mkfiles.plを実行 出力結果 windows/MSVC ディレクトリの下にVisual C++ 6向けのputty.dswファイルとサブディレクトリ以下に各種コマンド(putty, puttygen等)のサブディレクトリとプロジェクトファイル(dsp)が生成されます。 新しいVisual Studioで開く エクスプローラーからputty.dswを右クリックし、「プログラムから開く」で利用したいバージョンのVisual Studioを選択します。Expressでも使えます。 開いたあとはVisual Studioがslnファイルに変換してくれます。コマンドラインからmsbuildなども使えるようになります。 注意点 SSPIと呼ばれる機構を利用しているので、マクロSECURITY_WIN32を定義する必要があります。プロジェクトのプロパティからプリプロセッサの設定でこのマクロ定義を追加するなどの処置をすると良いでしょう。
動作中のプロセスのptyをつなぎかえられる、reptyrを使ってみる
UNIX板のGNU screenスレッドで紹介されていたreptyrを使ってみました。 screen外のプロセスにattachさせる 既にscreenを実行している状況で、screenのセッション外のプロセスを起動してみます。適当なterminalを起動するなり、外からsshでつなげるなりしてみます。あとでプロセスを探しやすいようにttyコマンドで現在使っているptyデバイスが何かを確認しておきます。 次にscreen内の任意のウインドウのshellから、当該プロセスにつなげてみます。 この時点で、元のターミナルは無反応になり、bashの制御がscreen下に移りました。shellを終了すればreptyrに制御が戻ります。 gdbと組み合わせる reptyrのもう一つの機能、ptyを外部から使わせるために確保する-lオプションを使ってみます。 別のshellからgdbでこのptyを使ってみます。set inferior-ttyで/dev/pts/7を指定することで、gdbが動かすプロセスの出力をreptyr側の端末に変更できます。 reptyrを実行していたshell上に、lsの出力が表示されます。標準入出力をデバッガの画面と切り離すことができて便利です。 実装方法 以前「起動済みプロセスのリダイレクト先を設定したい」という記事を見かけた記憶があったので、基本的には同じようなやりかただろうと思いつつソースを見てみたら、その通りでした。 起動しているプロセスに対してptrace(2)でattachし、ptyをdup2でfile descripter 0, 1, 2に複製しています。ただし、単なるリダイレクトと違い仮想端末が相手なのでresize等に対応するためのコードも含まれているようです。 前述の記事や本プログラムのドキュメントにもありますが、Ubuntuのカーネルはデフォルトで一般ユーザーのptraceを禁止しています。procfsを見てそのあたりをチェックするコードも入っています。Ubuntuユーザーが利用する場合、rootで実行するか、sysctlの設定を変更する必要があります。
SSLv3の脆弱性(POODLE)対応
SSL 3.0に、プロトコル自体の脆弱性がGoogleによって発見されました。”Paddning Oracle On Downgrade Legacy Encryption”略してPOODLEと呼ばれています。 検証サイト https://www.poodletest.com/ が立ち上がっており、脆弱性の詳細に関する元ソースへのリンクもあります。 今回の脆弱性はサーバー、クライアントともに対策が必要になります。とり急ぎ自分の周りにあるSSL/TLSを使うサービスに対策を施しました。 Apache+mod_ssl SSL_Engine onとしているセクション内で、以下の設定をしました。 SSL 2.0, 3.0を無効にし、利用可能な暗号からMD5, 3DES等を外しています(参考: httpsだからというだけで安全?調べたら怖くなってきたSSLの話!?)。 Postfix 参考: Postfix TLS Support Courier-imapd Debianのcourier-imapdはOpenSSLをリンクしているのでTLS1のみ設定しています。 確認方法 OpenSSLのs_clientを利用することで、任意のバージョンのSSL/TLSを使った接続を試すことができます。 上記サンプルでは、1回目はSSLv3, AESでの接続、2回目はSSLv3, RC4での接続ができています(参考: 私が愛した openssl (SSL/TLS 編))。設定が正しくできれば、以下のような結果となりネゴシエーションに失敗します。 STARTTLSを使う場合は-starttlsオプションが利用できます。 Debianでの対応状況(2014/10/16朝頃) w3mはSSLv3を無効化するパッチの当たったバージョンがsidにアップロードされています SSLv3が無効にされたOpenSSL 1.0.1jがリリースされており、sidにもアップロードされています。
mikutter-perlの公開
マルチプラットフォームで動作する、Rubyで書かれたTwitterクライアントmikutterのプラグイン、mikutter-perlを書きました。 動機: RubyからPerlを呼びたい 前々からNamazuのRuby実装を作りたい、ということを考えていました。現状のNamazuは独自のデータ形式を持っていますが、新しい実装ではバックエンドをGroongaにしたいと思っています。現状、Groongaのperl bindingはこれといった定番がないのに対し、RubyにはRroongaがあるので、作るならRubyだろうと考えています。 ただ、これまでPerlで書かれたフィルター群をどうにか継承できないか、とも考えていました。Namazuのフィルターはさまざまな形式のファイルからテキストを抽出するもので、今となっては結構な種類の数があります。 フィルター部分のみを呼び出すために、RubyからPerlのコードを呼び出したいという考えを実現する最初の一歩として、mikutter-perlを書いてみたというわけです。なお、Perl側には逆のことをするInline::Rubyというものがあります。 libperl呼び出し部分 最初に書いておきますが、やっていることは大したことありません。perlembedのサンプルとそう大きくは変わりません。 当初は直接libperl.soをDL::Importで読み込んで実行することを考えていたのですが、その手法には問題がありました。構造体へのアクセスができず、初期化に必要な作業が実行できません。以下にperlembedでも出てくるコード例を示します。 肝となるのはPL_exit_flagsです。perl_alloc, perl_constructで作成したperlインタプリタのインスタンス的なものに対し、終了時の挙動をフラグとして設定する箇所です。 gcc -Eオプションを使ってこの部分がどのような内容に展開されるかを確認すると、以下のようになります(on Debian wheezy)。 Perlinterpreterはstruct interpreterをtypedefしたもので、my_perlのIexit_flagsに値を代入するようなコードに展開されます。 デバッグ情報、シンボル情報などをstripした状態で、dlopen(2)だけでこれらにアクセスすることはできません。そもそもPerl周りはたくさんのマクロを使っているので、そこをクリアしたとしても汎用性が担保できません。 結局、そのあたりを全部担当するためのコードをCで書き、シンプルなインターフェースだけにまとめてDL::Import(dlopen)で呼び出せるようなコードを書きました(perlstub.c)。 RubyとPerlの間のやりとりも単純な文字列だけなので、割とシンプルに書きあがりました(mikutter-perl.c)。DL::Importはchar *を自動的にRubyの文字列に変換してくれるので楽です。 PL_exit_flagsさえ気にしなければ、DL::Importだけでコードを完結させることはできます。実際に書いたコードをgistにおいてあります。 mikutterプラグインの開発にあたって 今回初めてmikutterのプラグインを作成しました。参考にした資料は以下の通りです。 Writing mikutter plugin (http://toshia.github.io/writing-mikutter-plugin/) 基本的な書き方とイベントフィルタ、アクティビティの扱いについての情報 Event and Filters (http://toshia.github.io/writing-mikutter-plugin/event.html) 利用可能なイベントの一覧。今回は自分の実際のポストのみを対象とするためpostedイベントを監視 mikutter-shell-post (https://github.com/penguin2716/mikutter_shell_post) 似たようなことを実現している先行例として大いに参考になりました mikutter pluigin特有だと思われる、自分がはまった点についても列挙しておきます。 プラグイン内部で発生した例外は自力で受けないとスルーされる。ちょっとしたエラーがあっても止まらないのでわからない mypostイベントは、mikutter起動時に取得される過去の自身のツイートを受け取った時にも発生する。今まさにポストしたツイートに対応するイベントはpostedになる
Windowsの証明書自動更新と認証proxyの罠(CryptoAPI)
過去にCentOS/RHEL5にてGlobalSignのルート証明書が期限切れとなる事態が起きました(参考: RHEL5/CentOS5でGlobalSignのルート証明書が有効期限切れで大騒ぎ)。一般的なGNU/Linuxディストリビューションでは、SSLのルート証明書等をパッケージとして配布しています。たとえばDebianではca-certificatesパッケージがそれに該当します。 かたやWindowsは、XPまではWindows Updateで最新の証明書セットを配布していました。しかしVista以降はマイクロソフトが各種証明局と連携して、自動的に更新する仕組みを導入しています。しかし、システムが利用するhttp proxyがユーザー認証つきの場合、これが動作しないということに最近気付きましたので、記録として残しておきます。 CryptoAPI SSL証明書の自動更新は、CryptoAPIのサービス、Cryptographic Servicesが行います。管理ツールのサービス一覧を見ると、このサービスが動作しているのがわかります。 まったく新規のWindows環境を用意して、台湾のVISA取得サービス(https://visawebapp.boca.gov.tw/BOCA_MRVWeb/subroot/MRVWeb0_form.jsp)にアクセスする場合を例示してみます。 新規のWindows環境では、台湾のルート証明書は古いものが搭載されています。前述のURLにアクセスすると、CryptoAPIサービスが新しい証明書(http://grca.nat.gov.tw/repository/CRL/CA.crl)を取得し、検証用のエンドポイント(http://gca.nat.gov.tw/cgi-bin/OCSP/ocsp_server.exe)で証明書が正しいことを確認した上で、OSの証明書ストアを新しいものに更新します。 困ったことに、CryptoAPIは認証つきhttp proxyを経由したアクセスをサポートしていません。これは仕様としてそうなっているようです。 したがって、認証つきhttp proxyしかない環境下では、SSL証明書の更新がうまく動作しません。 一つの対応策として、User-Agentが”Crypto-API”である場合に認証を不要とする方法があります。それ以外には、stone等を使って認証不要なhttp proxyをローカルに立ち上げるという手段も考えられます。
ownCloudのDBマイグレーション失敗とリカバー
ふとしたことから、手元のsid環境を更新したのですが、その時にownCloudが5.0.25から7.0.2へと大きく変わってしまいました。ownCloudはアップブレード機能を持っている(web, occコマンド)のですが、それが途中でこけてしまったので、対処方法をblogに残しておきます。 5.0.25から7.0.2へ移行 自分はsid環境を、lxcコンテナの一つに持っています。その中でownCloudも運用しています。最初に導入したときのバージョンは5.0.25だったのですが、この記事を書いている辞典では7.0.2が最新です。5->6のメジャーアップグレードをはさめばうまくいったのかもしれませんが、自分のケースではデータベースの移行がうまくゆきませんでした。バックエンドにはSQLite3を使っています。 oc_lucene_statusでのエラー アップグレード時に発生したエラーログの一部を以下に示します。 oc_lucene_statusというテーブルの移行に失敗しています。このテーブルはLuceneによる全文検索用のものと思われますが、自分自身が全文検索を使ったことがこれまでなかったので、単純にテーブルの削除と再作成をすればよいだろうと推測し、まずはバックアップを取ったうえでdropしてみました。 単純にdropをしただけでは、当然テーブルがなくなるだけなので、やはりアップグレードに失敗します。その時のエラーは以下の通りです。 データベースのテーブルの定義はXMLで書かれています。ソースコードのapps/search_lucene/appinfo/database.xmlが該当するファイルです。これを見て適当に見よう見まねでテーブルを作ってみたところ、うまくゆきませんでした。 これはまずいと思い、バックアップしておいた方のデータベース上でのテーブル構造を参照してみました。 この結果を参考に、新しい方のデータベースで同じテーブルを作成し(表示されているSQLをそのまま実行する)、再度アップグレードを試みたところ成功しました。 無事アップグレードに成功し、今では普通に利用できています。
個人的に購入して便利だったBluetooth機器
概要 今時は複数の機器とペアリングできるBluetoothデバイスがあって便利だな、という話です。 キーボード 「ELECOM Bluetoothフルキーボード ゲーム用82キー 9台切替 ブラック TK-GMFBP043BK」 最大9台までペアリングが可能なキーボードです。単4電池2本で動きます。他の特徴を以下に挙げます。 USBによる有線接続もできる(mini B端子、ケーブル別売り) Windows, Mac, Android向けの配列モードがある 液晶エリアでバッテリー残量、モード、ペアリング状態等が確認できる 自分は持ち歩くことを前提にしていたので、この小さいタイプを購入しましたが、フルキー版もあります。自宅で使う分にはこちらの方がよさそうなので、近いうちに買おうかなあ、と思っています。 マウス 「ELECOM Bluetooth3.0マウス 5ボタン 9台切替 IR ブラック M-NV1BRBK」 同じくエレコム製の、9台までペアリング可能なマウスです。こちらも単4電池2本で動きます。 LED表示エリアで1~9までの数値が表示され、どの機器がペアリング対象か判別できる ペアリング切り替えボタンはマウスの頭頂部にある。1→9の順にシーケンシャルにしか切り替えできない(これはしょうがない) 光学式 電源スイッチとペアリングボタンは裏面にある キーボードと違って表示インジケーターや切り替えは若干制限がありますが、マウスというデバイスであることを考えると妥当なところです。こちらにはUSB接続の口もありません。 HID送信機 「iBUFFALO Bluetooth HID送信機 ブラック BSHSBT04BK」 上記2つを買うまではこれを使っていました。このデバイスは刺したマシンの入力デバイスを、Bluetooth HIDとして扱えるものです。たとえばノートPCに差してそのキーボードやトラックポインタをAndroid端末につなげることができます。 USB的にはMass Storageに見える ストレージ内に専用アプリ(Windows/Mac用)があり、それを実行してデバイスを制御する Windows/Mac/Androidのキーボードレイアウトに対応 なかなかよさそうなデバイスに見えるのですが、長く使っていると接触が悪くなるようで、うっかりちょっと触ったらUSB切断されるような事象が見られます。2つ持っているので、個体差でなく全体の傾向がそうなのではないかと怪しんでいます。あと、最初に購入した奴は初期不良でそもそもUSBデバイスとして認識できませんでした。 これをLinuxで使えるようにしたい、と常々思っているのですが、試しにUSBパケットをキャプチャしてみたところ、USB Mass Storage以外のパケットが流れていませんでした。パケットの中身を解析しないとダメそうです。 以下余談 個人的に、Bluetoothには10年ぐらい前から注目していました。それ以前はIrDAに注目していました。どちらも無接点で扱えるという点に魅力を感じています。 かつてPDAのPalmやZaurus(Linuxでない方)を持っていた頃、いわゆる母艦となるPCとのやりとりは可能な限りIrDAを使っていました。大きな理由として、PalmとPCをシリアルポート経由で接続するクレイドルの公式耐用回数が3000回と少なかったからです。1日3回使えば、1年3年持たない計算です(石川さんのご指摘があったので修正)。余談ですが、一般的なUSBのB端子(フラッシュメモリ等)は規格上1500回とさらに少ない値となっています。microUSBなら1万回です。 かつてIrDAはノートPに標準搭載されるぐらい一般的なものでした。自分がDebian開発者になって最初にパッケージしたのはirda-utilsでした(今はメンテナを別人に交代)。しかし代替となるような技術が出ないまま徐々に廃れてゆきました。 今の携帯電話についているような赤外線通信機能はIrDAのサブセットで、メールアドレスなどの交換にしか使わないことが前提の、軽量な実装です。 IrDAに代わってPDAに搭載されるようになったのがBluetooothです。Bluetoothは2.4GHzの周波数帯を使います。Bluetoothの出始めの時期は無線LANと割とかぶっていますが、周波数帯までかぶっています。 受難の時期 ゼロ年台前半は、毎年「今年はBluetooth元年だ」という記事が出るくらいに注目されつつも普及しませんでした。実際にBluetooth機器が安価に出回るようになったのは、iPhone、Android端末が売れるようになってからです。… Continue reading 個人的に購入して便利だったBluetooth機器
caffから受け取った署名を自分の鍵へ取り込む(gpg import)
ずいぶん間が開いてしまいましたが、GnuPG key signの作業をする(signing-party/caff)の続きです。前回は自分が相手に対して署名を行い、その結果を送るための手続きについて説明しました。今回はその逆、自分が受け取った相手からの署名を自分の鍵に追加する方法について説明します。 メールをファイルに保存 相手がcaffを使っている場合、pgp鍵のおそらくは各IDごとに1通のメールが届きます。 私の鍵の場合だと、IDとしているメールアドレスは4つあるので、一人当たり4通メールが送られてきます。それらを1つづつファイルとして保存します。 メールの内容は、それぞれのIDに対応する、自身の公開鍵で暗号化されたpgp asciiメッセージです。 メールの復号化 このメールをpgpコマンドで復号化します。 上記コマンド例では、入力されたファイルをmsgというファイル名で復号化しています。復号化した内容は、caffの標準テンプレートであれば以下のようになります。 署名の取り込み この復号化されたファイルには、添付ファイルとして鍵への署名があります。本文中にも説明がありますが、gpg –importコマンドを実行することで署名を自分の鍵に取り込むことができます。 これを、届いたメールの数だけ実施します。さすがに毎回passphreaseを入力するのはしんどいので、gpg-agent等を使うと楽になります。gpg-agentはバージョン2系からついてきます。1.4系にはありません。エージェントの使い方はssh-agentとよく似ているので、そちらに慣れている人であれば楽に使えるでしょう。 私は以下のようなワンライナーで一括処理をするようにしています。 公開キーサーバー上の鍵の更新 最後に、公開キーサーバーへ新しい(電子署名の増えた)鍵を送信して更新します。これは普段から公開キーサーバーに鍵を登録している人だけがすればよい作業なので、運用によっては不要な作業です。 以上で作業は終わりです。