smellman's Broken Diary

クソみたいなもんです

昔話: 僕のコンピュータ環境と萌え

今日、某クラウディアさんの中の人*1からいつから組長ってなったのって聞かれた。
たぶん2002年ぐらいからだと思うんだけど、その説明をする中で重要だと思われる昔話がある。
そこをひっくるめたら重要な話があるかもしれないので、僕が関わってきたものを中心に記録として残そうと思う。
あくまで、僕の記憶と経験に基づくので平行して行われたものはまったくノータッチです。

90年代の話

僕がパソコンを始めて自宅に導入したのは97年(正確にはその前に姉がビジネススクール用の持っていたんだけど、ぷよぷよとBio100%のゲームしかやってなかった)で、実際自宅にUnix環境を整えたのは98年にHDDを増設して自宅マシンにTurbo Linux 2Jを導入したぐらいである。
まぁ、Windows環境からゴニョゴニョしたことはあったけど、僕が本格的にUnix環境について知識をつけたが当時同級生から借りたFreeBSD徹底入門で2日で読破して今のかなりの基礎がそこでついたという感じです。あと、自宅がWinModemだったのでTurbo Linux入れてもそこからネットに繋がらないのでいろんなRPMパッケージをフロッピーに入れてLinuxにフロッピーからコピーして遊んでました。
その次代かどうかは思え出せないのですが、tcshが萌え系カタログとしてリリースしていたっていうのがあったはずです。
wikipediaにも記載がありますが、今は残ってないけど、たしかあったはずだっていう感じではあります。
あと、90年代にも他にあったけど僕が知ったのがその後なので後述します。

2000年代初頭の話

2000年代初頭、僕が大学一年の後期ぐらいに萌えに対して覚醒します。
覚醒というのはすごく重要です。
当時は萌えという言葉が徐々に広まろうという時期で、萌えについて気づいた人が徐々に拡散していった時期でもあります。
そして、メイド喫茶ができた当時だったような気がします。(覚えてねーよさすがに)

2000年ぐらいに僕はとあるグループに参加します。
それが、Linux萌え萌え大作戦です。
たしか、埼玉Linux研究会よりも前だった気がします。
僕にとっての始めて馴染めたチャットコミュニティでもありました。

そして、そこで開始したのが「ランゲージ娘\0(」です。
これはプログラミング言語を擬人化するという当時としてはマニアックな企画でした。
しかしながら、源流としては今はOSCの代表として知られるびぎねっとの宮原さんがRubyちゃんとPerl姉さんというネタをこれより数年前にやってました。
その中でみんながネタ作りをしていて、主催者のれのふみさんがDelphiが好きで当時Kylixちゃんを作って、僕が当時まじめに勉強していたSchemeXULをキャラクターデザインしたり、これらをイベントに出していたりしてました。

ちなみに、その時のこのグループの友達がIRCで僕のことを「組長」と言い出して、大阪のイベントで「組長」と言われて、その経緯があって僕は最終的に「組長」になったんだよね。
あと、僕が組長をやっていたもじら組という組織でも、OSCで一回コラボしてたりします。
友達だもんね!

2000年後期からの今の話

IT業界にはいろんなものが出てきました。任意たんとかはそこら辺が有名なところでしょう。

でも、今はあまり目立たないところとして、いろんなキャラが出ていました。
その中でネットランナーという雑誌がいろいろフューチャーをしました。
mixiたんとかありましたよね。

僕の友達のinugamixさん*2が書いたFirefox子というキャラクターもフューチャーされたその一人です。
僕があるときinugamixさんから「ネットランナーが付録にしたいという話がある」と連絡があって、当時のMozilla Japanのメンバーに経由で聞いてMozillal CorpからNGを貰い、Firefoxという名前を使わないようにということで、「ふぉくす子」ならOKという返事を貰い今に至ります。
つまり、ふぉくす子はMozilla非公認キャラクターなのです。

そして今はマイクロソフトですらキャラを出してきています。
クラウディアさんの中の人知り合いですけどね!

次のOSCではふぉくす子に出てもらおうというのでいろいろ動いています。
今日の打ち合わせではいろんなキャラも出てくるそうです。
かれこれ10年以上擬人化に関わってきた人間として、僕が楽しんでることを一緒に楽しんでもらいたいです。
どうやら今回のイベントもすごい声優さんたちが司会をやってくれるそうです(こっちが謎だろ)。
僕が面白がってやっていたことが少しでもみなさんに面白がってもらえることを望んでいます。

*1:声優の方ではなく、Microsoftの方です

*2:ちなみにinugamixさんは僕のアイコンを書いてくれた人です。

MapProxy インストールメモ

MapProxyMacに入れようとしたんだけど、ちょいとひっかかったのでメモです。
環境はMountain Lion+MacPortsです。

% virtualenv-2.7 env
% source env/bin/activate
(env) % pip install Pillow
(env) % pip install --no-install PyYAML
(env) % cd env/build/PyYAML
(env) % python setup.py build_ext --include-dirs=/opt/local/include --library-dirs=/opt/local/lib
(env) % pip install --no-download PyYAML
(env) % cd ../../..
(env) % pip install MapProxy

MapProxyが依存してるパッケージを先に手動で入れています。
1つ目はPillow。これはPILの代替として使えるのですが、先にインストールしておかないとPILをインストールしようとしてはまります。
2つ目はPyYAMLです。これは、libyamlが発見できなくて--without-libyamlが有効になってしまうので、手動でlibyamlが入っている位置を指定しています。

というわけで仕事しますね。

今日の買った音楽まとめ

今日、今年一発目の音楽の買い物をしました。
全部ではないですが、面白いものを買えたので紹介します。

Igorrr / Nostril

AdNoiseamからのリリース。
昨年新しい方のアルバムを買っていたんだけど、こっちは古い方。
デスメタルバロック音楽ブレイクコアが調和したすごくヤバイ音源。

個人的にはPavor Nocturnusの後半がすごく好きです。
ブレイクコアのリズムの壊し具合がすごく気持ちいい。


WHOURKR / Concrete

Igorrrともう一人の人でやってるグループ。
こちらも今はAdNoiseamからリリースをしてるんだけど、こっちはCrucial Blastというレーベルからのリリース。

Igorrrよりデスメタルをかなり強くした感じだけど、酷さは大差がない。
あと、ドラムがかなりやばい。むちゃくちゃ過ぎる。


Beefcake / Hôte

Beefcakeの2002年のEP。

BeefcakeはHymen Recordsで出した2作がとても好きで、実家に居た時はひたすら風呂の中で聴き続けていた記憶があります。
いい感じのBrain Danceで、何時間でも聞いていられるような心地よさがあります。

本作もなかなかその傾向があるんですが、ここにまさかのVenetian Snaresの参加です。
2002年ぐらいのVenetian Snaresということで頭がおかしい感じを期待したところ、やはり期待を裏切らない出来です。
むしろ懐かしさが本当にヤバイです。
僕がブレイクコアにハマった時の大好きな音がここにありました。
本当にありがとうございます(何

まぁ、こんな感じで未だにブレイクコア最高!

新年の抱負とか

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

去年はいろいろな事がありましたが、そんなんは省略し、今年の抱負だけ書きます。

今年は「心と体の健康」を目標としたいと思います。
具体的には以下の事を心がけたいです。

  • 料理のレパートリーを増やす、特にスープ系
  • 弁当をなるべく作る
  • アイロンを使いこなす
  • Wii Fit Uに慣れる、特に腕立て系
  • ゲームをちゃんとやる
  • 今年こそは健康診断を受ける
  • 快便
去年はよく体の不調が目立ちました。
余計な心配はかけないことが目標です。
もう歳ですからね。

【第3類医薬品】ザ・ガードコーワ整腸錠PC 560錠

【第3類医薬品】ザ・ガードコーワ整腸錠PC 560錠

BANGFACE - Neo-Rave Armageddon

たぶん、今年最後のエントリーです。

本当は去年買った音楽のまとめとか書いてたんですが、いろいろあって書けなくなりました。

代わりに、今年最後に買った音楽を紹介します。

BANGFACE - Neo-Rave Armageddon

BANGFACEっていうのはUKあたりでやってるレイブイベント。
僕は今年イギリスに行った時にちょうどやってたんだけど、居た場所が開催地から離れてて参加できなかったという悔しい思いをしたイベントです。

で、今回はそのイベントのコンピレーションがリリースされました。
参加アーティストがまた豪華です。

Bong-Ra vs The DJ Producer, Luke Vibert, Ceephax Acid Crew, Venetian Snares, Hellfish, Shitmatと、いつのPlanet-Muだよこれみたいなラインナップw
特に久々のVenetian Snaresの新作が入っているというのがポイントです。
いやー、ずいぶん待たされた感ありますね。
旧譜とリミックス以外のリリースでは今年初のリリースじゃないですかね?
って、年末に今年初とかどういうことだよ!

内容はレイブイベントのコンピらしいハードコアとAcidのクソ煮込みです。
とてもとてもカッコいいです。
Luke VibertCeephax Acid Crewは相変わらず素晴らしいAcidだし、
Hellfishは相変わらずとんでもないスピード感だし、
Luna-Cってアーティストが今年ももクロで散々聞く羽目になった某クラシック曲をむちゃくちゃにしまくってるし、
Bong-Ra vs The DJ ProducerやShitmatのレイブミュージック感は本当にたまらないし、
そんでもってVenetian Snaresがただの神だし。

あと、アルバム買うとおまけについてくるDJ Mixがまたカッコいいんですよね。
こういう頭空っぽにして聞けるDJ Mixが手に入って本当にうれしいです。

今年の最後にこんなにおかしなアルバムが手に入って大満足です。
これで辛いことが乗り越えられそうです。
皆さん、また来年〜

なれる!SE (11) 絶対?管理職宣言 読了

エンジニアが血の涙を流すライトノベルなれる!SEの最新作を読みました。

今度は管理職...えーと、工兵まだ新卒一年目ですよねwwwタイトルが発表された段階で笑ってしまいました。

内容もすごかったですね。最初に工兵が一緒に客先に行くところで頭抱えるような内容が盛り沢山。たまらないですねー。
少々ネタバレになりますが、ベンダー保守を頼んでないとか、代替機がほとんどないとかとても懐かしいというか、これ何年前の話だよって思いました。

今回の話のメインとなるのは赤字を抱えた現場をどうするかっていうもの。
ただ、赤字の成り立ち方がかなり異常というか、いままでの話のなかで結構特殊な部類。
ライトノベルらしいといえばそうなんだけど、このシリーズの中では異色とも言える回だったと思います。
その分、普通に話として楽しめる感じで、今までよりは遥かに心に傷を負わなかったとも言えます。
まぁ、こんな現場絶対嫌だけど(汗

オチは相変わらずというか、ぶっ飛んでましたね。
今までよくある相手の会社で解決するパターンだったんだけど、
今までの中で一番ありえない訪問の仕方。無茶がすぎるwww

読んだあとのすっきり感は今まででは一番強く、途中で心が折れて読めなくなった人にもオススメの回です。

pgRoutingの例で見るsphinx-intlとtransifixの連携

これは Doc-ja Advent Calendar 2013 6日目の記事です。

先日、FOSS4G 2013 Tokyoのハンズオンのため、同僚と一緒にpgRoutingworkshop日本語への翻訳を行いました。
pgRoutingは弊社が中心となって開発しているOSSです。
pgRouting自体の説明はpgRouting workshopの日本語版などを参考にして下さい。

pgRouting workshopのドキュメントはSphinxを使って作成をしています。
国際化の部分をsphinx-intlを使って行い、transifexを使って共同作業で翻訳を行っています。

今回は実際の翻訳作業を通して得た知識を元に説明をします。なお、pgRoutingの例で見るとありますが、そこまでガッツリpgRouting絡んでないので安心してください(何

今回の作業では主に以下の4つの作業を元に説明します。

  1. 作業を行うのに必要なツールのインストールと設定
  2. プロジェクトの翻訳を開始して、翻訳ファイルのベースをtransifexにアップロード
  3. transifexで翻訳をした後にローカルに反映してhtmlなどを作成
  4. プロジェクトの原文が更新されたときの作業方法

作業を行うのに必要なツールのインストールと設定

今回必要となるツールは以下のものです。

いずれもPythonで作成されており、virtualenvを使えば簡単に構築環境を作ることができます。

まず、virtualenv環境の構築です。ここは主題ではないので適当に進めます。

$ virtualenv sphinx
$ echo "sphinx/*" >> .gitignore

.gitignoreに追加したのはプロジェクト管理から外すためです。
プロジェクト管理をしていない、もしくは別の仕組みを使っている場合は無視しても構いません。

次に、各ツールのインストールを行います。なお、(sphinx)はvirtualenv上にいることを指します。

$ source sphinx/bin/activate
(sphinx) $ pip install sphinx==1.2b3
(sphinx) $ pip install sphinx-intl
(sphinx) $ pip install transifex-client

これでインストールは完了です。
次のコマンドが打てるか確認しましょう。

(sphinx) $ sphinx-build
(sphinx) $ tx

sphinx-buildがsphinxのコマンドで、txがtransifex-clientのコマンドとなります。
shellによっては実行できない場合があります。その場合は一旦virtualenvを抜けて再度activateにすれば良いと思います。

(sphinx) $ deactivate
$ source sphinx/bin/activate

なお、次からの記述から(sphinx)を省略します。基本、virtualenv環境で行うことに注意をしてください。

次にsphinxのプロジェクトを作ります。

$ sphinx-quickstart docs

今回はdocsというディレクトリにファイルがあるという前提で進めます。
これはpgRoutingで使われている構成と一致します。

続いて、transifex-clientのセットアップを行います。
まず、先にtransifexでアカウントを作成しておきます。

次にtx initコマンドを使って作業用のディレクトリに設定ファイル(.tx/config)と、個人用の設定ファイル(~/.transifexrc)を作成します。

$ cd docs
$ tx init --user=<username> --pass=<password>

Transifex instanceを聞かれますが、それはこのままEnterを押して下さい。

続いて、Transifex側でプロジェクトの作成を行います。
この作業は僕のケースではすでに作成済だったため、作成方法は割愛をします。

続いてプロジェクトのIDを確認します。
こちらはTransifexのURLを確認すればOKです。
pgRouting workshopの場合では、 https://www.transifex.com/projects/p/pgrouting-workshop/ となるので、プロジェクトIDは pgrouting-workshop となります。
今回は仮にyasumetarouとしておきます。

プロジェクトの翻訳を開始して、翻訳ファイルのベースをtransifexにアップロード

では、実際にプロジェクトの翻訳を始めていきます。

基本的な流れは以下のようになります。

  1. potファイルの作成(sphinx-build -b gettext)
  2. transifexにアップロードできるようリソースを更新する(sphinx-intl update-txconfig-resources)
  3. transifexにpotをアップロードする

なお、今回の解説ではsphinxが提供するmakeコマンドは使わないようにしてる点に注意して下さい。

まず、翻訳の元となるpotファイルを作成します。

作成に使うコマンドはsphinx-buildです。 -b gettext オプションでpotファイルの作成となります。

$ cd docs
$ sphinx-build -b gettext -a -E -c . . ./i18n/pot

-c オプションはconf.pyがあるディレクトリを指定します。
ハイフン無しのオプションは source ディレクトリ、 output ディレクトリの順になります。

続いて、potファイルをtransifexにアップロードできるようにします。

$ sphinx-intl update-txconfig-resources -c "./conf.py" -p "./i18n/pot" -d "./i18n" --transifex-project-name=yasumetarou

-c でsphinxのconf.pyを指定します。
-p でpotファイルのパスを指定します。
-d でpoファイルのlocaleの位置を指定します。
--transifex-project-name で先ほど確認しておいたプロジェクトIDを指定します。

ここで行われれる作業は .tx/config の更新となります。
この作業後は以下の様な状態になります。

[main]
host = https://www.transifex.com
type = PO

[yasumetarou.index]
file_filter = i18n/<lang>/LC_MESSAGES/index.po
source_file = i18n/pot/index.pot
source_lang = en

今回ではi18n以下にpotと各localeが入るような構成にしています。
実際pgRoutingでは以下のような構成になっています。

% tree -L 1 i18n
i18n
├── de
├── es
├── fr
├── ja
└── pot

.tx/configにおけるfile_filterのが各言語のパスに置き換わるような形です。

最後にtransifexにpotをアップロードします。

$ tx push -s

-s はsourceファイル、つまりpotファイルのみをアップロードすることを意味します。

これでpotファイルがアップロードされます。
あとは、transifexから言語を追加して翻訳を行います。

transifexで翻訳をした後にローカルに反映してhtmlなどを作成

ここからが継続的な作業となります。

翻訳を取り込んでhtmlなどを作成します。

  1. transifexで行った翻訳ファイル(poファイル)をダウンロード(tx pull)
  2. 取得したpoファイルを元にmoファイルを作成(sphinx-intl build)
  3. sphinx-buildでhtmlを作成

まず、poファイルをダウンロードします。

$ tx pull -l "ja" -f --minimum-perc=1

-l で言語を指定します。
-f はダウンロードを強制します。
--minimum-percはその言語がどのぐらい翻訳されたらダウンロードするかという基準を与えています。この場合では 1 なので 1% 以上更新されていたらダウンロードするようにしています。

次にpoファイルをmoファイルに変換します。

$ sphinx-intl build -l "ja" -c "./conf.py" -p "./i18n/pot" -d "./i18n"

-l で言語を指定しています。

最後に、sphinx-buildでhtmlを作成します。

$ sphinx-build -b html -a -E -D language="ja" -c .  ./_build/doc/html/ja

これで、翻訳されたドキュメントを得ることができます。

プロジェクトの原文が更新されたときの作業方法

最後に原文に更新が入った時の対処です。

基本的には以下の手順になります。

  1. potファイルを再度作成する(sphinx-build -b gettext)
  2. transifexの最終更新分を取得しておく(tx pull)
  3. potファイルを元にpoファイルに更新を行う(sphinx-intl update)
  4. potファイルをtransifexにアップロードする(sphinx-intl update-txconfig-resources)
  5. ローカルのpoファイルをtransifexにアップロードする(tx push)

ここで使われているコマンドは全ていままで紹介したものなので、具体的なコマンド例は割愛しますが、いくつか重要なポイントがあります。

一つ目はtx pullで最終更新分を取得しておく事と、新しくできたpotファイルを元に手元のpoファイルを更新することです。

というのも、原文にちょっとした修正が入ってしまうとtransifix側ではまるごと文章が変更されたという扱いになります。
そのため、一旦手元に更新されたものを置いておいて、git diffなどで差分をとっておくと変更点がわかりやすくなります。

また、今回はtx pushで-sオプションのみ使うようにしています。
実は手元のpoファイルも-tオプションで更新できるようなのですが、transifexではファイルの扱いが非常に破壊的なため、このオプションでtransifex側で不具合があると危険なので、僕自身は使わないようにしています。

基本手元のpoファイルはread onlyという扱いにして、更新は全てtransifexで行うというふうにしています。
正直これが良いかどうかはわかってないのですが、危機回避という点では徹底するようにしています。

使えるスクリプト

完璧ではないのですが、pgRoutingでは以下の場所にあるスクリプトで基本的に作業をしています。

https://github.com/pgRouting/workshop/tree/master/tools/transifex

potの更新部分については

  1. init_gettext.sh
  2. update_transifex.sh

の順番で動かすようにしています。

プロジェクトごとにこのようなスクリプトを用意しておくと円滑に進めることができると思います。

ぜひ活用してください。

おまけ1: sphinx-buildとpdf出力

本筋とは関係ないのですが、sphinx-buildでlatex経由でpdfを作成できるよう同僚が調整しています。

https://github.com/pgRouting/workshop/blob/master/tools/transifex/build_translations.sh

うまく出力できない!っていう人はこれを試してみるとよいかもしれません。

おまけ2: github pagesの活用

pgRoutingでは本家サイトもpgRouting workshopも公開のためにgithub pagesを使っています。

https://github.com/pgRouting/pgrouting/tree/gh-pages

https://github.com/pgRouting/workshop/tree/gh-pages

これらのおかげでサイトの構築のためのリソースも含めて一括してgithub内で扱うことができます。
新しいプロジェクトを作りたいという人はドキュメントをsphinxで、公開はgithub pagesというのも結構使える手段だと思います。

まとめ

三行でまとめると

  1. sphinxとtransifexは相性がよい
  2. transifex側で翻訳作業を完結させればトラブルは起きない
  3. 簡単なスクリプトを書いて作業を楽にしよう!

ってな感じです。皆さんの翻訳に参考になれば幸いです。

次回は@Arachansanさんです。あれ、さんが二回?