これはディストリビューション/パッケージマネージャー Advent Calendar 2013 17日目の記事です。 Debianの安定版(stable)と呼ばれるものは、一度リリースされると致命的なバグやセキュリティに問題がない限り、ソフトウェアのメジャーバージョンが上がることはありません。またリリース間隔が不定期なため、状況によっては古いソフトウェアを使い続けることになります。これはメリットであり、デメリットでもあります。 安定板でも新しいパッケージを使いたい、という要望に応えたものがbackportsです。かつてはwww.backports.orgで非公式サービスとして提供されていましたが、現在では公式なものとして扱われています。 どのようにしてbackportsにパッケージをアップロードするのかは、http://backports.debian.org/Contribute/に基本的にはすべて記述されています。ここでは実体験を交えて説明します。 ACL(Access Contorol List)への追加リクエスト Debian開発者であれば、backportsのACLに自分のIDを追加してもらうだけでアップロードができるようになります。ACLの追加は自力ではできないので、RT(Request Tracker)にチケットを作成してリクエストをします。 チケットの作成はメールで行います。backports@rt.debian.orgあてに”Debian RT”という文字列を含んだメールを送ることで、その内容がチケットになります。以下は私が出したメールの例です backportsに関する情報を得るために、debian-backports MLも購読しておきましょう。 さて、チケットを作って待つこと一週間、何も動きがありませんでした。催促の意味を込めて、次のようなメールをMLに投げました。 するとすぐACLに追加され、チケットはresolvされました。これでdebian/changelogのdistributionの項目に”wheezy-backports”などとしたパッケージを通常のincomingサーバーにアップロードすれば、backportsに登録されるようになります。 Debian開発者ではない人がアップロードをしたい場合は、sponsorを探す必要があります。debian-backports MLでsponsorを募集してみましょう。アップロード先にはhttp://mentors.debian.net/等を利用しましょう。 パッケージの作成 いよいよパッケージのbackportをやります。まず対象となるソフトのソースを入手しましょう。 dgetはdpkg-sourceまで実行してソースコードを展開してくれるので、次はdebian/changelogを更新します。dchには親切にも–bpoというbackportsのポリシーに合わせてバージョン番号を上げる機能がついているので、これを使います。 これで自動生成されるエントリーは以下のようになります。wheezyのdchはデフォルトでsqueeze向けのbpo情報を埋め込みます。 今回はwheezy向けにパッケージを作るので、バージョンとディストリビューションを修正します。 bpo60+1をbpo+72と、現在のwheezyのバージョン番号に合わせました。ディストリビューションもsqueeze-backportsからwheezy-backportsに変えました。 さて、実際にビルドしてみましょう。ビルドには、きれいな(純粋にwheezyのパッケージだけで構成された)環境の利用が推奨されています。pbuilder等の利用を検討しましょう。pbuilderの使い方については、今回ここでは行いません。 上記の例では、まず実環境でビルドしてdscファイルを生成し、それをもとにpbuilderでビルドを行っています。これでビルドに成功すれば、晴れて完成です。 足りないパッケージも作る 完成に見えたこのbackports用パッケージですが、実はこれだけではwheezyで動きません。mikutterのビルド自体はwheezyでできるのですが、インストールしてみといくつかのパッケージがwheezyに存在しないため、エラーになります。 ruby-addressableとruby-oauthはwheezyにもあるようですが。残りは存在しないようです。足りないパッケージを同様にしてbackport化しましょう。 debuildを実行するときには、-Fオプションを忘れないようにしましょう。初回のアップロード時にはupstreamのソースコードも必要だからです。 一通りのパッケージをインストールし、動作することが確認できたら、いよいよアップロードです。 stableが大好きな皆さんはbackportsを活用してゆきましょう。
git-builpackageを使う(Debian/Ubuntu JP Advent Calendar 2013)
これはDebian/Ubuntu JP Advent Calendar 2013 11日目の記事です。 Debianではパッケージを管理する際に、オリジナルのソースコードの上にdebianというディレクトリを作成し、その下にDebian固有のパッケージングに関する情報を記録してゆくようになっています。 かつてはこのファイルの管理はそう大変なことではありませんでした。しかし現在のDebianはoldstable, stable, testing, unstableという4つ(場合によってはexperimentalを含めた5つ)のdistributionを同時に管理しなければなりません。こうなると、やはりバージョンコントロールシステムが使いたくなるところです。 そのためのパッケージのひとつがgit-buildpackageです。名前の通りSCMにgitを使います。この記事ではその解説を行います。他にもsvnやcvs, bzrに対応したものがありますが、それぞれ設計思想から異なるのでここでは触れません。個人的にはsvn-buildpackageも使ってはいます。 ソースコードのインポート 一番最初に行うのは、すでにあるdeb用ソースコード一式のインポートです。これにはgit-import-dscコマンド(あるいはgit-import-dscs)を使います。 これでパッケージ名(この場合hallo)のディレクトリが作成され、そこがgitリポジトリになります このようにインポートされたdebianバージョンとupstreamのタグが作成されます。内容を更新し、新しいバージョンをリリースする際には同様に新しいdebianバージョンのtagを生成することになります。 変更 適当に変更をしてみます。このあたりは普通のgitリポジトリを扱うのと変わりはありません。 テストビルド 修正をコミットする前にテストビルドをするには、git-buildpackage build –git-ignore-newを実行します。–git-ignore-newオプション以外はdebuildと同じです。 問題がなければ、親ディレクトリにパッケージと各種ファイルが生成されます。これでよいと思ったら普通にgit commitしましょう。 リリース向けビルド リリース用のビルドは–git-tagオプションを付けることでできます 新しく作ったdebian versionのタグができていることが確認できます。 参考 PackagingWithGit (Debian Wiki)
HTMLタグを含むpoファイルからプレーンテキストにまで加工して形態素解析にかけてみてtypo等を見つける (Doc-ja Advent Calendar 2013)
これはDoc-ja Advent Calendar 2013 5日目の記事です。 www.gnu.orgでは、現在GNU website Japanese Translation Teamにてチーム体制でwebの翻訳を進めています。実態はほとんどgniibeさん一人で、私は今のところ翻訳チェックぐらいしかできていませんが… gnu.orgのwebはメッセージの中にHTMLタグも含んだ状態で、poファイルによって管理されています。レビューをする上では、なかなか扱いにくい形式です。 そこで、私は一度poから日本語訳文のテキストを生成し、もう少し見やすくした状態でレビューをしています。この記事では、その方法を紹介します さらに、結果を形態素解析にかければ、若干typo等が見つけやすくなります 今時の形態素解析器はできるだけ細かく分解する方向の実装・辞書が多いので、KAKASIなどを使った方がよいかもしれません。
GNUプロジェクトについて知るワークショップ参加
先の「GNUプロジェクトについて知るワークショップ」に参加してきました。私は「自由ソフトウェアによるライブストリーミング」という内容の発表をしました。 当日gniibeさんに指摘を受けたのですが、この発表ではストリーミングに用いるデバイスは民生品の利用を前提としています。 業務用のデバイスではDRMなどがかからないもの多くあり、不自由なテクノロジーに縛られないストリーミングが可能なはずです。
squeezeからwheezyへのアップグレード
最近いくつかのDebian squeeze(6.0)環境をwheezy(7.0)にアップグレードしたので、その時に直面した問題などをここに記録してゆきます。何かあったら随時追記します。 makefile style init script(insserv) devfsdというかなり古いパッケージがずっと残っていたのですが、これのせいでinit scriptの依存関係がループを起こし、insservがエラーを出してパッケージのconfigureが完了しない、という事態が起きました。 init scriptはsqueezeから依存関係が記述できるようになり、可能な限り並列でdaemonを起動しようとするのですが、devfsdはそれより古いパッケージ(そもそも現在使われていない)ものだったので、デフォルトで与えられる依存関係情報とmdadm-raidの依存関係とが循環参照を起こし、止まってしまいました。一時的にmdadm-raidからdevfsdの記述を削除することで、この問題は解決しました。 本来ならdevfsdなんてインストールすらされていないはずなので、バグレポートはしていません。 phpとrep2ex 2011年ごろのかなり古いrep2exをずっと使っていたのですが、wheezyのphp(5.3.3)で動いていたrep2exがsqueezeのphp(5.4.4)で正常に動作しなくなりました。 確実に動かないのはImageCahe2で、これは新しいphpでDataObjectクラスがsqlite2をサポートしなくなったことが原因です。MySQLかPostgreSQLを使うようにすれば動作します。 ただ、何も考えないとデータベースが移行できないので、データベースの初期化だけ行ってから、sqlite2 image.sqlite .dumpコマンドでエクスポートし、INSERT文だけ抽出してデータベースに食わせることでデータを引き継いでいます。 他に板の名前など一部の日本語が表示されない、という問題が起きているので、これの解決に取り組もうとしています。 最新のrep2exにアップグレードすることも検討したのですが、ディレクトリ構造を含め大きく変わっているので、とりあえず今のrep2exが使える状態になってから取り組もうと思っています。 今後進展があれば、随時更新してゆきます。 追記1(5/27) rex2exの日本語が出ない問題は、php 5.3->5.4でのhtmlspecialcharsの挙動の変化が原因でした。デフォルトでは、エンコーディングの指定がないと5.3ではISO-8859-1、5.4ではUTF-8で処理しようとします。基本的に2chはSJISなので、日本語を含む文字列の変換に失敗して空の文字列を返してしまうようです。 あちこちにhtmlspecialcharsが存在していますが、ある程度機械的に置換してSJISを明示してやることで、大体動くようになりました。これで様子をみつつ、最新のrep2exに追従したいと思います。
第八回 カーネル/VM探検隊に参加してきた
2013年4月13日、都内で第八回 カーネル/VM探検隊が開催されたので、参加してきました。詳細はGoogle Siteの方を見てもらえば、発表内容や資料が見られます。 個人的に気になったところを書いていこうと思います。 @hiraku_wfs ftraceの解説と最近の動向 ftraceそのもの以上に、debugfsの使い方が興味深いものでした。debugfs(8)ではなく、Greg Kroah-Hartmanが実装した、kernelとuserspaceを橋渡しするためのインターフェースです。mkdirすることでトレース状態のスナップショットをとることが可能、という使われ方をしていました。 ライトニングトーク @boronology CD/DVDのエラー計測 「市販のプレスされたメディアでも結構エラーは出るもの」「むしろ一部の書き込みメディアの方がエラーレートが低いことがある」などなどいろいろと面白い話でした。qpxtoolはDebianパッケージもあるので、試してみたいところです。 @Talos208 フォントとカーネル Vmのあやしい関係 フォントレンダラーのバグをつくことで、OSを落とすことすら可能なフォントデータが作れる、という話でした。過去にFreeTypeでも脆弱性の報告がありましたから、まあそういうこともあるよね、という感じです。今でもlibpngあたりはよく脆弱性が報告されていますから、気を付けたいところです。 @yogata 超簡単!TELNETの話 TELNETの標準プロトコルでも暗号化をサポートしていますよ、という話がメインでした。実際に対応している実装としては、FreeBSDのtelnetがあるようです。Debianのnetkitベースなtelnetにそういう処理はなさそうでした。 驚愕だったのは、source routingをサポートしているというところです。sshの多段接続よりも驚きです。 残念ながら懇親会に参加することはできなかったので、懇親会内でのライトニングトークは聞けませんでしたが、あいかわらず濃いイベントでした。
特定のファイルがどのパッケージに含まれているかを調べる
あるファイルがどのパッケージに含まれているかを調べたいことはよくあります。 既にインストールされたものの中から探すのなら、dpkg -Sが使えます。 $ dpkg -S /bin/ls coreutils: /bin/ls しかしこれは線形探索なので、結構時間がかかります。また、インストールされていないファイルに対しては調べられません。 一応、Webで探索できるページ(http://packages.debian.org/ja/)も用意されていますが、オフラインのときには使えません。 ftpサイトのdebian/dists/(stable|testing|unstable)/Contents-(i386|amd64|…).gzというファイルに、そのアーキテクチャの全パッケージのファイルリストがあるので、これをあらかじめ取得しておいて調べるという方法もあります。 しかし、そこまでやるならapt-fileを使った方がよいでしょう。apt-fileはContents-$arch.gzを取得してインデックス化してくれるので、検索も高速です。 同様のことができるパッケージは他にもあります(auto-apt等)。うまく活用するとよいでしょう。
Debian/Ubuntu JP Advent Calendar 2012 – grub2のデフォルト起動エントリーを変更する
この記事は Debian/Ubuntu JP Advent Calendar 2012 : ATND の 12/6(木) の記事です。 今日のお題はDebianのデフォルトブートローダーであるgrub2の起動エントリーを変更する方法について紹介します。 現在のgrub2は設定ファイルである/boot/grub/grub.cfgを直接編集することはなく、基本的な制御は/etc/default/grubを編集し、update-grubを実行することでgrub.cfgを再生性させる使い方が正しいとされています。 デフォルトでインストールされる/etc/default/grubでは、エントリーの一番先頭がデフォルトで選択されるようになっています(GRUB_DEFAULT=0)。複数のOSをインストールしている環境では、毎回カーソルキーで起動OSを選択するのは面倒だと思うので、一度選択したエントリーを記憶させるモードを使っている人も多いと思います。 具体的には、以下のような感じに/etc/default/grubを書き換えます。 GRUB_DEFAULT=0をGRUB_DEFAULT=savedにかえ、GRUB_SAVEDEFAULT=trueを追加します。これで次回起動したOSのエントリーが/boot/grub/grubenvにsaved_entry=OS Entry Nameという形で保存されます。 これは、Debianが起動中であればgrub-set-defaultコマンドで変更させることができます。エントリー名はgrub.cfgのなかでmenuentry命令で定義しているので、grepしてみればどういう名前で登録されているかがわかります。 たとえばこの状態で、grub-set-default “Windows 8 (loader) (on /dev/sda1)”を実行すれば、grubenvが書き換わり次回の起動時に自動的にWindows8を起動するエントリーが初期選択される状態になります。 これで、リモートから起動するOSを変更することも可能です。 過去の記事、「Windons7のVirtualBoxでデュアルブート用のraw partitionにあるLinuxを起動させる」と連携すれば、Windows OS側で一度VirtualBoxを起動し、その中のDebianでgrub-set-defaultを実行することで、Windowsでもgrubのエントリー変更させることが間接的に可能です。できれば直接Windowsでgrubenvの修正ができるとよいのですが、/boot/grub以下の読み書きができないといけないのでちょっと難しいでしょうね。
ヘッドマウントディスプレイHMZ-T2を購入
長らくヘッドマウントディスプレイ(HMD)が欲しかったのですが、たいていは640×480程度の解像度だったり、10万円以上したりして実際に買うまでには至りませんでした。 しかしSONYからHDMI入力可能で720pまで表示でき、価格は7万円を切るHMZ-T2という機種が出たので、ついに買ってしまいました。この機種の前にHMZ-T1という機種を出していたのですが、ヘッドフォンが備え付けという欠点をもっていだのですが、新機種ではミニジャックで自分の好きなヘッドフォンを利用できます。 使用感 今のところ、主にThinkPad Edge E130とつなげて使っています。HMZ-T2の電源を入れるとデフォルトでミラーディスプレイとして動作します。E130は1366×768なので微妙に720pを超えるサイズなのですが、中央部分がHMZ側に表示されます。 装着してみると、意外とディスプレイ部分が重いです。カタログによると約330gとのことで、これでも旧機種より若干かるくなっているそうです。重みでちょうど焦点が合うように設計されているようで、正面を向かない姿勢ではちょっとずれたりします。うまく調整すればまあ寝たまま見られなくもないのですが、そのあたりかなりセンシティブです。手を添えて固定するのはちょっとうれしくないので、そのあたりもう少し改善してほしいところです。 レンズの周りに差し込む遮光版があるのですが、自分は使っていません。おそらくしっかり遮光すると、没入感がより高まるだろうなとは思います。フェードアウトするような場面を見ていると本当に映画館で映像を見ているような感覚を受けます。 オーディオ出力デバイスが選べるようになったため、それに合わせたモード(インナーヘッドホン、オーバーヘッドヘッドホン)が用意されています。自分は付属のインナーヘッドホンしか使っていないので、違いについてはなんとも評価できません。 オーディオ出力もHDMI経由なのですが、Windows7で利用しているとアプリケーションの起動したときとHDMIポートに刺したときとのタイミングによっては、HDMIに音声がきちんとでない場合があるようです。そういう時は、HDMIに刺した状態でアプリケーションを起動し直せば治るようです。ニコ生を見るときにこの現象にあったので、かなり焦りました。 残念ながら3Dモードは未体験です。PS3のいくつかのソフトが対応しているとのことで、廉価版Call Of Duty Black Opsを買いましたが、他のゲームをやってばっかりでまだ試せていません。 ImpressのGAME Watchに検証記事がありますが、ゲームモードだと遅延が2フレーム程度あるそうです。対戦ゲームだとちょっと厳しいかもしれません。 ともかく、好きな態勢で寝ながら画面を見るという自分の希望が達成できたので、まあ満足しています。早くこの手のデバイスがフルHDになってほしいところです。
Debian Advent Calendar – cron-aptで常に最新状態を保つ
私はDebianの中でもStableを好んで使っています。Debianパッケージされたソフトウェアのなかで、脆弱性が見つかるとそれを修正したものを提供してくれる点が気に入っています。 過去、DSA(Debian Security Advisory)を常に見張りながら報告があるたびにapt-get upgradeをするという運用をしていたのですが、うっかり更新ミスをしてしまったがために外部からの侵入を許してしまったことがあります。 そういった事態に陥らないために、stableを常用している人はぜひcron-aptを入れましょう。cron-aptは毎日apt-get update, upgradeを実施してくれるパッケージです。しかしながら、デフォルトでは更新されたパッケージをダウンロードするだけで、インストールはしてくれません。 インストールまで自動化するためには、/etc/cron-apt/action.d/3-downloadの内容を修正しましょう。標準では以下のようになっています。 これはapt-getに与えられる引数です。この中から、”-d”オプションを取り除きます これで自動的にインストールまでが行われます。なにか失敗があったとき(たまたまミラーサーバーが止まっていたりなど)は、cronでメールがrootに飛んでくるので見落とさないようにしましょう。