2013/12/14

はぐれ学生の例 その1 - はぐれ学生 Advent Calendar 2013

はぐれ学生 Advent Calendar 2013 14日目の投稿です
はぐれ学生の概要はこちらを参照してください。

こんにちは。はぐれ学生の @hktechno です。
現在、筑波大学 情報科学類 在籍5年目で4年生です。
僕が、はぐれるに至った経緯と、はぐれてみた感想を書いてみたい思います。

長いです。読むの大変です。

2013/11/17

SECCON 東北大会に参加した


もう1週間経ってしまいましたが、先週は SECCON 東北大会に参加しました。

SECCON といえば、去年は ifconfig というチームでつくば大会に参加して優勝し、全国大会はあえなく撃沈と言った感じでした。

今年は、福島県会津地方で行われた、東北大会に参加しました。宿泊込の、セキュリティトライアスロンです。普通の CTF とは違って、とても面白かったです。ちなみに、上の写真は、猪苗代湖上で遊覧船かめ丸の上で行われた、早押しクイズ大会開催前の様子です...

僕は、開催前日になって熱がでて大変だったのですが、当日は熱も下がったのでアンチウイルスを施して参加しました。あまり体調は万全ではありませんでしたが、いつもの通りエナジードリンク漬けで頑張りました。

結果的には、まあ優勝というわけだったのですが、僕自身よりチーム全員がそれぞれ取り組んだポイントを確実に取っていったところが、結果につながったと思います。とはいえ、いつもどおりくりすの貢献が大きかった気がする。
初めて、アセンブラかるたとバイナリかるたにも挑戦しました。アセンブラかるたはよかったですが、バイナリかるたは僕には無理ゲーでした。

2013/09/20

PyCon APAC 2013 に参加した

参加した、といっても去年までとは違って今年はスタッフ参加です。去年までは、日本の PyCon は JP として開催してましたが、今年は APAC (Asia-Pacific) としての開催でした。
来年は Taiwan が APAC になって、日本では JP を開催します。
なんで、スタッフ参加しようかと思ったかというと、Python 好きだし使ってるし、何か協力できることがあったら手伝ってもいいと思ったからです。
あと、他のカンファレンスに参加して、なんか PyCon はイケてない感じ(かなり個人的な感想)があったので、なにか変わるかなとか。

ちなみに、この記事はいま YAPC::Asia に参加しながら書いてますけど、これは興味のある話が幾つかあったので参加してる感じです。

2013/07/27

png のファイルサイズを最適化するコマンド

png ファイルって、便利ですけど可逆のはずなのに、なぜか出力するソフトによってファイルサイズが違ったりしますよね。

更に、前回のエントリと同様に、PageSpeed Insights にかけてみると、こんなことを言われるわけです。
以下の画像を最適化すると、サイズを 15.7 KB(7%)削減できます。
    http://example.com/.../image_thumb.png を可逆圧縮すると 8.5 KB(7%)削減できます。
そこで、コマンド一発通したら png ファイルを小さくしてくれるコマンドがあったら便利ですよね。探して見ました。
  • optipng - 進化した PNG (Portable Network Graphics) オプティマイザ
  • pngnq - PNG (Portable Network Graphics) 画像最適化ツール
  • pngcrush - PNG (Portable Network Graphics) ファイルを最適化
aptitude search したらこれぐらい見つかりました。

ひとつ注意として、pngnq だけ他とちょっと違います。pngnq は、32-bit RGBA な PNG ファイルを 8bit RGBA に変換するファイルです。つまり、強制的に小さくなりますし、(通常は)非可逆です。GIF みたいなものです。

それぞれ使ってみます。変換するファイルは、256x256 の GIMP で生成したファイルです。(ODCP のロゴ)
  • Original
    • 37652 byte
  • `convert in.png out.png` (参考)
    • 38654 byte
  • `optipng in.png` => in.png
    • 24482 byte
  • `pngcrush in.png out.png`
    • 24482 byte
  • `pngnq in.png` => out-nq8.png
    • 13853 byte
参考で ImageMagick で convert した結果も乗せて見ました。サイズ増えてますwww

pngnq は 8bit に変換するだけあって、さすがに減ってます。グラデーションとかな png だとがっつり劣化するので、用途によりますかね。

optipng と pngcrush は同じ結果でした。好きな方を使えばいいと思います。

Debian の Apache では Javascript の gzip 圧縮は有効になってない?

Google の PageSpeed Insights って知ってますか?
  • https://developers.google.com/speed/pagespeed/insights
Web ページの表示速度を最適化させるために、あらゆるやるべきことを教えてくれます。簡単にでることもあれば、こんなの無理だろという指摘まで...

最近は、このあたりを最適化してるかしてないかで Google の表示順位も変わってくるらしいので、暇なときに簡単にできそうな問題は修正しておくと良いです。

ところで、僕のある Dokuwiki のサイトを PageSpeed Insights にかけてみたらこんな結果が出てきました。
以下のリソースを gzip で圧縮すると転送サイズを 294.4 KB(71%)削減できます。
    http://example.com/lib/exe/js.php?tseed=1373562644 を圧縮すると 294.4 KB(71%)削減できます。
ん?という感じです。Apache の gzip 圧縮は mod_deflate で有効になっているはずなのですが、確かに HTTP ヘッダを観測してみると、gzip でも deflate でも圧縮されてません。

2013/07/22

glibc の関数の引数の数について調べてみた

Open Design Computer Project で作っている mist32 プロセッサの、関数呼び出し規則と割り込みについて考えてる間に、あるひとつの疑問が...

ふつうの関数は、どれぐらいの引数を使うのか

平均と言うよりは、最大でどれぐらいまでの引数が使われることが普通なのか。

何故こんなデータが欲しいかというと、関数呼び出し規則 (Calling conventions) でレジスタに引数を乗せることは確定だが、どの程度引数レジスタを用意すればいいのか、という事を決めたい。

関数呼び出し規則では、レジスタに呼び出し元か呼び出し先か、どちらで保存するかを定義しなければならない。基本的には、呼び出し先保存 (caller-saved) なレジスタの方が、効率が良いのである。実際に使われたレジスタしか退避することがないから。

全部引数に載せればいいじゃん?って思うかもしれないけど、レジスタが許す限り全部引数をレジスタに乗せることに決めた場合、すべてのレジスタが呼び出し元保存 (callee saved) なレジスタになるので、問題が起きる。呼び出した先の関数がどのレジスタを使ってるのかなどわからないので、呼び出し元の関数で使ってる変数レジスタをすべて退避する必要がある。その先の関数でそれを使っていないかもしれないのに。また、割り込みの際にも、呼び出し元保存のレジスタは、基本的に割り込みハンドラで保存しなければいけないし、多すぎるといいことはない。

つまり、どの程度の数の引数が一般的に使われるかがわかれば、ほとんどの数の引数をレジスタ渡しで実現しつつ、無駄なレジスタ退避を少なくすることができる、理想の引数レジスタの個数をなんとなく予測することができる。

2013/07/18

エンディアン変換とバイトアクセス

最近、Open Design Computer Project で mist32 プロセッサのシミュレーターを作っています。I/O のエミュレーションにもある程度対応してます。
https://github.com/techno/mist32-simulator

そこで気づいたことをひとつ書こうかなと。あたりまえのことなのですが。

ビッグエンディアンとリトルエンディアン

ご存知の通り、この世のコンピューターは内部的にエンディアンやバイトオーダーと言われるような、1ワードのバイト列をどのようにメモリ上に配置するか、という手法が大きく分けると2つあります。

Data: 0x1234ABCD

                0  1  2  3
Big Endian:    12 34 AB CD
Little Endian: CD AB 34 12

上記が、ビッグエンディアンとリトルエンディアンの概要です。ビッグエンディアンの方が人間には自然に見えますが、コンピューター的にはそうでない面もあり、一長一短です。一般的に使われている x86 はリトルエンディアンを使っています。

ファイルシステムや、ネットワークプロトコルなどによって、エンディアンは普通は規定されています。(FAT はリトルエンディアン、ネットワークはビッグエンディアン) しかしながら、ELF のようなメモリイメージのようなフォーマットは、そう簡単に行きません。

2013/07/16

Debian で起動時に NFS マウントが詰まる問題

某所で運用しているシステムで、Debian squeeze で HA 化されたストレージに対して、起動時に NFS マウントしています。

/etc/fstab の記述はこんなかんじです。
192.168.0.xxx:/nfs/var/www /var/www nfs rw,hard,intr,rsize=8192,wsize=8192 0 0

ところが、起動時に "Waiting for /var/www..." で詰まって、タイムアウトするまでブートシーケンスが止まる、しかも結局マウントされない、という問題が起きてました。しかしながら、起動した後 mount -a すると正常にマウントされます...

/var/www がマウントされないと、その後の apache の起動もコケるので、非常に良くない状況です。再起動するたびに、手動でマウントするようなことはしていられません...

原因を探ってみたところ、起動時に nfs のマウントを司っているのは、/etc/init.d/mountnfs.sh だという事がわかりました。このファイルを辿って行くと、"$ASYNCMOUNTNFS" という変数を見て、do_wait_async_mount に飛ぶか飛ばないかを見ているようです。どうもこいつが怪しそうです。

結局以下のコマンドを打ったら、現象は再現しなくなりました。根本的な原因はよくわかりませんが、まあいいかなと...
`echo "ASYNCMOUNTNFS=no" >> /etc/default/rcS`

2013/06/04

LinuxCon Japan 2013 へ行ってきた

今年も LinuxCon Japan へ行って来ました。Student であれば first50 が参加費免除という、去年と同じパターンです。こういうカンファレンスに、学生であれば優遇して参加できるというのはいいことですね。

去年は、割と軽い気持ちで参加したのですが、今年は研究室でカーネルをいじったりストレージやメモリ周りの話をしているので、割と本格的に話を聞きに行きました。

プレゼンテーションはこちらにアップロードされてるみたいです

Cloud Open が併設ということで、Keynote も公演も、仮想化・クラウドの話が多かったですね。あと、リアル Linus の話を初めて聞くことができました、いつもの調子で結構ぶっちゃけてました。

ストレージとかメモリ周りの話を重点的に、Intel の CPU hotplug の話とか、Google の RedHat から Debian にダイナミック移行の話だとか、少し KVM の話も聞いたりしてました。英語ついていくの大変でしたけど、とても面白かったので、来年も行けたらいいな、とか。というか、毎年 Student Presentation があるので、来年こそはなんか成果を発表できたりしたらいいですね...

最後に、会場が椿山荘という場所だったのですが、庭園が綺麗でした。昼休みに、庭園と神田川沿いを散歩したりしてました。去年のみなとみらいもそうでしたが、休み時間にそとをぶらぶらして楽しめる立地というのは、時間が無駄にならないですし、海外から来てる人にとっても、嬉しいだろうなーという。よく考えられてますね、偶然かもしれないけど。

2013/05/14

自炊 PDF を Kobo Touch 向けに ImageMagick で変換してみる

最近このおもちゃを手に入れました。Kobo Touch です。
http://kobo.rakuten.co.jp/

当たり前のように、買ったのではなく、キャンペーンでもらいました。貰わなくても、そこら中で投げ売りされてるわけですが、タダより安いものはないです。もちろん、もらうには理由があって、最近研究室関連で本を読んだり論文を読んだりすることが多いので、活用してます。

そんなわけで、まずはあんなことやこんなことをしないで、正常に使ってみます。しかしながら、少し使ってみた感じとしては、(定価では)同じような値段で売っている Kindle Paperwhite に勝るところはたぶん無いと思います。バックライトついてないと、暗いところだと辛いですね。

 さて、早速 ScanSnap で自炊されている本を入れてみたのですが、縦横比の問題とか余白が大きすぎて、そのままでは綺麗に見るのは難しそうです。世の中には、Windows 向けに自炊したものを変換してくれるものもあるみたいですが (ChainLP など)、手元に Windows もないので ImageMagick とかを使ってうまく行かないか試してみます。

2013/04/21

ビックリバコ株式会社でお世話になった皆様へ


突然なのですが、そろそろ?この会社の開発から退くことにしました。
(そもそも、肩書きは飾りで、お手伝いさんだったけど...)

まず、僕を開発に誘ってくれたよぴた (吉田有花/CEO) に感謝します。
彼女の「夢は笑顔テロで世界征服。」に、惹かれて、彼女の足りない部分を補ったらなんかできるのではないかと思い、手伝うことにした、半年前。
僕も時間に余裕があり、一度はこういう体験をしてみるのもありかなと思っていました。

まあ、当初とは様々な環境の変化があり、創業時に考えていた負担割合以上に、半年間努力してきました。
しかしながら、4月から研究室に配属されてそちらに集中したいのと、Open Design Computer Project にもっと時間を費やしたいと思いました。そして、僕がお手伝いとして、この会社に貢献できることが、中途半端になってきたというのもあり、区切りがつきました。
最初から4月までで一区切りつける予定だったので。やっぱり区切りつけようと思ったのが数日前。

具体的には、資金と時間、技術も含めて様々なものが足りずに、自分が必死に作ったもの完成目前で実質お蔵入りしてしまったので、一番プログラマーとしては、大きなダメージでした。それと、必死になっていたのも、ある理由(非常に重要)があったからなのですが、その問題が解消されつつあるというのも、安心してこうできる理由の1つです。

なので、僕自身いろいろ一度リセットします。
こんなこと公開しないほうが良いかもしれませんが、けじめです。けじめ。

ビックリバコ株式会社は、これからも、僕が少し?鍛え上げたよぴたが続けていきますので、よろしくお願いします。また、現在進行中のものはお手伝いを続けますし、完全に抜けるわけではなく、面白いものが出てきたら、また手伝うつもりです。
少し自分勝手なような気もしますけど、よぴたも納得してくれたので頑張ります!

よぴたの、よくわからないあの雰囲気があれば、箱からビックリするものが、いつかは出てくるはずです。
受託ばっかり続けてちゃダメなんだからね!
http://bicly.net/

2013/02/04

Linux から L2TP/IPsec で VPN

最近、Softether が開発している PacketixVPN 4.0 に、L2TP, OpenVPN, MS-SSTP が対応して、その界隈ではとても熱い感じです。
おかげで、様々なクライアントから特別なソフトウェアの導入なしにつなげるようになったことで、夢が広がります。
まだ、ベータ版というか、RC1 の状態ですが、ダウンロードして試すことができます。

クライアントから、手軽に L2TP/IPsec したいよね?

そんなわけで、Linux からも L2TP/IPsec で VPN したいわけです、しかも手軽に。
クライアントからつなぐ際、PPTP とか OpenVPN であれば、NetworkManager が対応しているわけなんですけど、L2TP/IPsec は StrongSwan が対応しているようで、なんかうまくいきません。
(少なくとも PSK, 事前共有鍵 を使った接続はできなさそうだった)

設定ファイルをぽちぽちいじるのも、なんか前世代的で面倒です。
それに、結構色々設定しなきゃいけません。

l2tp-ipsec-vpn を使ってみる


色々探してみたのですが、OpenSwan をバックエンドとして使う l2tp-ipsec-vpn を使うのが良さそうです。
これなら、GUI からぽちぽち設定してつなぐことができます。PSK にも対応してます。

Debian (wheezy 以降) や Ubuntu であれば、以下のようにしてインストールするだけです。
sudo apt-get install l2tp-ipsec-vpn
メニューから GUI のプログラムをたちあげると、上記のような設定画面が出てくると思います。

設定とか

接続の設定画面はこんな感じですね。
"Use pre-shared key for authentication" の部分に PSK (事前共有鍵) を入力します。

今回の接続先の、Packetix VPN の L2TP/IPsec は PAP にしか対応していませんので、PPP タブに移って、"Allow these protocols" を選択して PAP にチェック入れた後、"User name" と "Password" を入力します。

それと、"IP Settings" の中の "Obtain DNS server addresses automatically" にチェックを入れておきましょう。
これにチェックを入れないと繋がらないかもしれません。
または、DNS サーバーのアドレスを手動入力しましょう。

設定が終わったら、GNOME3 であれば、右下のタスクバーみたいなところに l2tp-ipsec-vpn が常駐しているはずなので、設定名をクリックするとつながります。

初期設定は、VPN を貼ったネットワークがデフォルトゲートウェイになるので、設定を変更したい場合は "IP Settings" -> "Routes..." で設定しましょう。

Linux でも割と手軽に、L2TP/IPsec で VPN を張ることができました。
接続先も Packetix VPN を使えば、とても簡単に設置することができるので、良い時代になりましたね...

2013/01/13

MacBook Air のキーボードを分解掃除した

普段は MacBook Air に Debian を入れて、持ち運び用の使っているのですが、正月に気を抜いたら、キーボードに飲み物をこぼしてしまいました。しかも、ファンタグレープ...
なかなか拭く物が見つからず、少し染みこんでしまったようです。

おかげで、数日後に、水飴状になったファンタが、キーボードの動きを固着させてくれたというか、全体的に動きが悪いです。
すぐキーが戻ってこなくなるとか、パリパリした音がなるとか。

なので、思い切って分解しました。
といっても、MacBook のキーボードは、キーの下の方を爪で引っ掛けて、上方向に持ちあげれば、簡単にパチっと外れます。
割と力を入れてもそれなりに大丈夫ですが、自己責任で。

こぼしてしまったあたりを分解して、パンタグラフの部分も取り外して楊枝を駆使して掃除しました。
ほとんど元に戻ったのでよしとしますが、あと1年ぐらいは持ってくれないとな...

Apple に持って行ったら、キーボード全交換とかですごい額取られそうである。
キーボードの表面だから良かったけど、Apple の製品は気軽に分解して掃除できないのは、ちょっと苦しい。

2013/01/09

Python の JSON モジュールの速度を比較してみる

とりあえず結果から

Python 2.6 の json モジュールはかなり遅いみたいです。
速度を気にする場面では避けたほうが無難です。
Python 2.7 以降では改善されているよう。(3.x は未確認)

以下、結果の詳細

ちょっと速度が気になる場面が出てきたので、自分で少し JSON のシリアライズのベンチマークを取ってみた。
Python 2.6 から、標準で json モジュールが組み込まれていますが、これ以外にも様々なモジュールがあります。
確か、組み込みの json は simplejson が元になっているような気がしました。

ベンチマークのとり方は、今回利用するアプリケーションに特化したベンチマークを取ろうとしたので、その形式になっています。
単純な50万個のリストが並んだリストです。シリアライズのみ。

ベンチマークに使ったコードは以下においておきます。
https://gist.github.com/4486729

2013/01/05

Raspberry Pi のセットアップから日本語化まで

先月辺り、僕のところにもやっと Raspberry Pi が届きました。

"ラズベリーパイ"というこのボード、$35 で買える ARM の SoC が乗った名刺サイズコンピューターというやつです。
Linux が動いて HDMI, LAN, USB がついていて、SD カードがストレージになります。
RAM は 512MB も積んでいます。(僕に届いた新しいモデルの場合)

詳しい仕様は、以下のサイトを見てみてください。
とにかく、ガジェットオタクとしては格好のおもちゃなわけです。
しかし、乗り遅れたこともあって、7月初めに注文して、届いたのが12月初旬という...

とりあえず動かしてみる

とりあえず Raspberry Pi を動かしてみたいと思います。

まあ、Raspbian という Raspberry Pi 向けの Debian が用意されていて、これを書き込むだけなんですけど。
必要なものはこんな感じです。
  • MicroUSB ケーブルか、MicroUSB ACアダプタ
  • 4GB 以上ぐらいの SD カード
  • USB キーボード・マウス
  • HDMI ケーブルと対応したディスプレイ
  • 有線 LAN (ソフトウェアのインストールに必要)

2013/01/02

"Your Twitter archive" が来た!

Twitter ユーザーの長年の悩み、 それは Twitter に投稿したつぶやきの過去ログが全て見られないこと。
現在は、Web インターフェース上ではある程度しか遡ることができません。
しかし、Twitter もユーザーがすべての Tweet を見れるのを望んでいることはわかっているようで、近日中にできるという噂は聞かれていました。

そして、先日やっと正式にアナウンスがあったわけです。
Twitter Blog: Your Twitter archive

すべての Tweet がダウンロードできるようになるというもの。
ただし、現在は英語版に設定しているユーザーの中でゆっくり機能の適用が進行中ということで、すべてのユーザーに浸透するまで数ヶ月ぐらいかかるようです。

今日確認したら、僕のアカウント (@hktechno) にはすでにこの機能が来ていました。
まだかまだかと待ち望んでいたのでいすが、思ってたよりははやく来た感じです。
はやく全員がこれができるようになる、そして Web で見れるようになるといいですね。

ダウンロードすると、Twitter の生データとしては JSON 形式に抽出できる js ファイルと、CSV のファイルが含まれていました。
その他に、綺麗に UI が整備されたローカルで動く HTML と JS が同梱されていて、過去の自分の Tweet を閲覧・検索することができます。

ちなみに、僕の Twitter の "Your Twitter archive" を当面の間以下に公開しておきます。
悪趣味な方は見てみると良いかもしれませんw
http://tweets.hktechno.net/

ちなみに生データはここから。開発用に?どうぞ。
http://tweets.hktechno.net/data/