2011年12月30日

色々あった1年だった

今年一年を振り返ってみるとやはり地震の存在は大きいものの、それ以外にも色々激動だった。
が、まあ個人的なブログに偉人が亡くなったとか世の中のことを書くほど真剣に世の中と向き合っていたわけではないので、個人的なことを綴っておきたい。

Clip to Evernote

2011年12月19日

TAMRON 18-200mm F/3.5-6.3 Di III VC Model B011 を買った

NEX-5ND を買ってからしばらく経った。
わりと楽しく使っているのだが、遠くを撮影したい時にコンデジに太刀打ちできない寂しさに苛まれていたので SEL55210 を買おうと思い、数店探しまわった。しかし在庫が全然ない。でも SEL18200 は高価だしちょっと重い……。
そんなわけで結局 SONY E マウント系としてはサードパーティ製初となる TAMRON 18-200mm F/3.5-6.3 Di III VC Model B011 を買った。

カメラとレンズがほとんど見えてないね……

本体が小さいためにどうしてもゴツい感じになってしまうものの、それほど重くもなく素敵なレンズだと思う。
これ1本で普段は済みそうだなと思っていたものの、最短撮影距離が今まで使用頻度が高かった SEL1855 の 0.25m に比べるとこのレンズは 0.5m となっていて、室内などで使うときには微妙な扱いにくさも感じた。

TAMRON 18-200mm F/3.5-6.3 Di III VC で撮影。距離の確保が大変だった
とはいえ、今まで撮影できなかった距離で撮影できるようになったのはとても嬉しい。
今後の撮影も楽しみになった。









Clip to Evernote

2011年12月8日

PHP + MongoDB であいまい検索を作った話

先日、ちょっとしたキッカケで「あいまい検索」を作ってみようと思った。
アニメのタイトルで。

が、そもそもどうやって作るのかまったくわからない。
ただ、一応形態素解析とか N-gram とかは知っていたので、この辺を攻めればなんとかなるだろうと思ったのでちょっと考えた。
この時点で形態素解析を使ってしまうと使える範囲が限られてしまって楽しくなさそうなので、N-gram で行こうと最初に決めた。言語に依存しないし未知語に対しても強いし、アニメのタイトルのようなものに対しては相性が良さそうだから。

要するに似たものを出せばいいのだ。
例えば「らき☆すた」と「らきすた」は結構似ているが微妙に違う。Bigram を使うとすると、
らき☆すた: らき き☆ ☆す すた 
らきすた: らき きす すた 
のように分かれて、強調にした場所のような共通項が存在する。
特に後半の2つは連続でヒットしていて結構重要なデータと言えそうだ。

そういうのを見てスコアリングして順位を決めればいいのではないだろうか?
と考えたので、実装してみた。

データは以下のような構造で保存した。

word コレクション
検索対象になる言葉の全文が入っているコレクション。
{
  "_id": "(MongoDBが適当に素敵な感じのを考えてくれる)",
  "word": "らき☆すた"
}
wordNgram コレクション
検索対象になる語句を N 文字に分割した状態のコレクション。
{
  "_id": "(MongoDBが適当に素敵な感じのを考えてくれる)",
  "w": "らき",
  "p": [
    {
      "_id": "(wordコレクションでの「らき☆すた」の_id)",
      "pos": 0, //「らき☆すた」内での「らき」の出現位置
      "len": 5  //「らき☆すた」の長さ
    }
  ]
}
こんな感じのものを沢山登録していく。
他にも語句を登録した時などに「らき」を持つものを登録する場合は p に追加するようにし、「らき」自体が複数登録されるのを回避した。これで検索時の処理が少し効率化されないかな、などと思ったため。
あと、wordNgram に保存するデータひとつひとつに "len" を保存しているのだが、これはヒットしなかった範囲の大きさを元に減点する処理を書くために必要になったので仕方がなく全部の文字列片に入れた。
同じデータを何度も重複して入れている形になるので本当はどうにかしたい。

どうやって検索するか
保存されたデータを検索するために MapReduce を使用した。
検索用に入力された語句が「らきすた」だとしたら処理の流れはこんな感じ。

  1. 「らき」「きす」「すた」「た」に分解する
  2. 上記4つのうちいずれかにヒットする項目を wordNgram へ探しに行って Map 処理を行う。
    ここで "p" の中に入っているデータを全て "_id" で emit する。
    emit(p._id, {pos: [p.pos], len: len});
    のような感じで。
  3. 集まったデータを元に Reduce する。Reduce は複数回呼ばれる可能性があるのでここではスコア計算は行わずに Finalize の時に行う。ここで行うのは複数個集まってくる pos を配列に正しくしまうという処理だけ。
  4. Finalize 処理。ここで pos の配列を昇順にソートする。この時点でデータは
    {pos: [0, 3, 4], len: 5}
    になっているはず。これをスコアリングしてあげればいい。
    連続してヒットすればするほど高得点になるようにしたかったので、
    Math.pow(3, "(続いた回数)")
    という式で加点と、
    "(ヒットしなかったブロックの長さ)" * 0.01
    という式で減点するようにした。
    この減点で長い語句ほどランクが下がりやすくなるが、文字列片が連続でヒットした場合 3**N で一気にスコアが上がるので上位に押し上げられるだろうというのが狙い。
    ただ長い語句だとアホみたいにスコアが上がってしまうというのもあるので、もうちょっと上手くやった方がいいかも知れない。
実際に動いているものと、そのソースが以下。
ここまでではそれなりの速度で結果が返せているのだが、似たような語句が増えると目に見えて検索速度が落ちていく。また、入力される語句が長いと検索対象データが増えてどうしても処理が重くなってしまう。
(わかりやすいところで「もし高校野球の女子マネージャーがドラッカーの『マネジメント』を読んだら」のような長いタイトルが実際に存在する)

2000件ちょっとしかデータが入ってない現状で若干レスポインスが悪くなるのを感じるので、試しに同じデータの尻にゴミを付与して40000件以上にデータを増やして検索させてみたら、遅いわ遅いわ……。
データ量がこれ以上増えないならいいけど、長い目でみるとこのままではイカン、ということがわかってきたところ。

2011-12-09 追記 ----

シンプルな構造にしてインデックス張ってみたけど最初の実装より遅くなったので戻した。

2011-12-13 追記 ----

エイリアス登録機能を追加して、「K-ON!」や「はにはに」のようなものへ対応できるようにした。
「遊☆戯☆王」のように bigram や unigram では「遊戯王」で検索できないようなものに対してもこれで対応できるようになった。
(正規化の時点で記号類を外す、という選択もあるにはあるが……)

あとは細かい処理の見直しなど。

word コレクションへの登録データは以下のようなものに変わった(少し前にキー名も全体的に1文字に変更されている)。
{
  "_id": "(MongoDBが考えたやつ)",
  "w": "けいおん!",
  "a": ["K-ON!"]
}
単純に a という名前で内部に抱え込むだけ。データの節約のため、初回登録時は "a" 自体は登録されていない状態になっている。
wordNgram コレクション側には現状特にエイリアスであることを区別せず同じ形で登録してある。
これで問題ないと思っていたのだが、よく考えてみると MapReduce でのスコア計算時に区別できないとデータが混じってしまい正しいスコア算出がされなくなってしまう……。
エイリアス同士で混じってもいけないのでやはり個別に区別できなきゃ駄目かな……。
Clip to Evernote

2011年10月6日

Android アプリケーションの作り方を勉強中

本格的にガッツリやってるわけじゃないので進行速度は結構遅いものの、少しずつ調べつつコード書きつつ学んでるところ。
今のところ知ったことなどを書いてまとめつつ進める。
Java もほとんど触ったことない。
  1. SDK をインストールして実機とエミュレータで HelloWorld を動かした
    上手くいったし開発環境もよくできてる気がする
  2. 画像を選択するための Intent をどうやって発行するのか調べた
    Intent.ACTION_PICK で setType("image/*") するのがそれっぽい
    検索してる時に機種によっては発行の仕方によって上手く動かないケースの話を見た気がする
    (記憶が曖昧)
  3. MediaStore.ACTION_IMAGE_CAPTURE を使えばカメラのデータも Intent で受け取れるらしい
    ただし機種によって受け取り方が違うらしい記述を見かけた(特にXperia)
  4. Android3.x 系のエミュレータ上で標準のギャラリーアプリを起動すると落ちてしまう
    実機上では問題ないのでエミュレータ上にサードパーティ製のギャラリーアプリを入れて回避
  5. ViewFilpper を使うと複数の View をアニメーションで切り替えできることを知ったので使ってみた
    でかいスクリーンサイズでスライドアニメーションしてもスムースじゃなくて微妙だった
  6. 大きい画像を Bitmap クラスに読み込む時そこそこ長い時間止まってしまうので、別スレッドで読み込み処理をすることにして、画面はローディングアニメーションアイコンを置いておこう
    別スレッドから UI 触れないというよくある話は Handler で解決するようだ。簡単にできちゃって凄い
  7. 戻るボタンを押すとアプリが終了してしまうので ViewFlipper はなんか一般的じゃない方法のような予感がした
    よくよく調べてみたら基本形は1つのActivityでひとつの画面で対応させる感じだとか
    今作ってるアプリは Intent 発行ボタンを押す → ローディングアニメーションアイコン → 読み込み後の画面 という感じで画面が変わっていくんだけど、Intent 発行ボタンがある画面は別の Activity がよさそうな気がする
  8. Eclipse 上で新規 Activity 作る方法を調べて Activity を追加した
  9. Activity を切り替える方法がわからないので調べた
    これも Intent だった。スマートで凄い
  10. 相変わらず画面切り替えにはエフェクトがあったほうがいいと思うので調べた
    android:activityOpenEnterAnimation とかその周辺がそれっぽい
    ちょっと面倒そうだけどやってること自体は単純っぽい
Clip to Evernote

2011年9月20日

NEX-5ND を買った

ここ最近、謎のカメラ購入欲があって思い切って NEX-5ND を買った。


Clip to Evernote

2011年9月16日

ワンキーゲームを作った


そらけらさんに素敵なイラスト書いてもらいました

昔ながらのワンキーゲームを速攻で作った。
ちょっとずつ変更を加えながらやってた。
HTML ファイルひとつで動くようにしてある。

以下、リリース順に並んでいます。一番下が最新。

スペースキーを押しっぱなしで浮力を与えて箱を避ける
http://test.oov.ch/junk/space-key.html

スペースキーをジャンプ機能に変更
http://test.oov.ch/junk/space-key2.html

迫ってくる箱が斜め移動するように変更
http://test.oov.ch/junk/space-key3.html

迫ってくる箱が画面端で跳ね返るように変更
http://test.oov.ch/junk/space-key4.html

BGM を追加
http://test.oov.ch/junk/space-key5.html

死んだ時に BGM を停止するように変更
配色を Nyan cat 風に
http://test.oov.ch/junk/space-key6.html

自機を Nyan cat に変更
http://test.oov.ch/junk/space-key7.html

ブロックの出現パターンを毎回一緒になるように変更
http://test.oov.ch/junk/space-key8.html

タイトル画面
スコア表示位置変更
背後に虹
ブロックに枠線
http://test.oov.ch/junk/space-key9.html

上部に余白を設けた
内部処理を若干整理
http://test.oov.ch/junk/space-keyA.html

meta タグで Android 上での動作も少し考慮
http://test.oov.ch/junk/space-keyB.html
Clip to Evernote

2011年9月5日

Google+ の話と、月刊地球さん9月号


7月10日から Google+ を始めて、もうすぐ2ヶ月ぐらいになる。

始めは何をしたらいいのかよくわからなかった。
数少ない友人をサークルに入れて機能の確認をして、文字装飾機能があるとか、その機能は日本語だと微妙に使い勝手に難があるとか、再共有や再共有ロック、ブロック機能とかがあることを知った。
いくつか遊んではみたものの結局のところ限られた人数では広がり方にも限界があり、この時点では Google+ 自体が「フーン…」という程度の印象だった。

ただ Google+ は Facebook と違い実際の人間関係をリアルに反映させろとは言っていなかった。
だから元々名前を知っている人や尊敬している人で Google+ を始めてる人を探してサークルに入れ始めた。
この頃は何故かモテメンさんのコラが異常に流行っていてストリームが若干怖い感じではあったものの、なんか雰囲気を見る限り堅苦しい使い方じゃなく、もっとフランクに使っていいものなのだなと感じた。

それでもストリームに流れてくるのはわりと真面目な投稿が多かった。
なので友達候補や、他人がサークルに入れている人の中で投稿が面白い人を探して適当に入れ始めた。

その途中で 2ch のアカウント招待スレで Google+ を始めた人とかをサークルに入れたようで、妙にハイテンションな人達が増えだし、それと同時に一気にストリームが良くも悪くも低レベル化して、軽いノリで投稿したりコメントしたりできる場が出来上がっていった。
この辺から自分の中で急激に Google+ が面白くなってきたので、その分 Twitter に費やしていた時間を Google+ に注ぎこむようになって、一気に Twitter が放置状態になっていった。

ネット拾った二次画像を投稿する人も居るし、それを突然無言でものすごい勢いで行う「地球さん」と呼ばれる人も居る(恐らく中華圏の人のようなのだが具体的にどこなのかは不明)。
この辺のノリは本当に VIP とかに近くて、作者自体に全く言及されないまま過ぎ去っていくことも多いので絵を描く側からすれば素直に喜べない人も居ると思う(最近は Google で画像を元に検索できるので、作者に辿りつける事は多いけど)。
猫画像を定期的に投稿する人も居るし、動画を YouTube ではなくアニメーションGIFで投稿する人も居るし、昼飯時には会社の休み時間を利用してご飯画像を上げてくるような文化のようなものもある。
もちろん、自分で描いたイラストを投稿している人も居る。色々な人がいる。

Twitter に比べて他人と知り合いやすい構造になっているせいか、外国人とコミュニケーションを取るシーンも急激に増えた。中国、台湾、韓国、ロシア、アメリカに住んでる人と Excite 翻訳や Google 翻訳を駆使してやり取りしあった。
その中でロシアは国内でタイムゾーンが9つある事、中国はタイムゾーンがひとつしか無いことも知った。
関わってくれるような人はみんな日本人に対してとても友好的で、過激な言い合いとかは全然ない。

知り合った韓国人はみんな日本語が上手すぎて日本人と同じ調子で会話できるし、中国や台湾の人も日本語上手すぎて注意深く見てないと日本人だと思い込むケースが多々ある。日本語しかできない自分でも翻訳サイト片手に片言の英語でなんとか会話できるし、以前よりパッと見で英文の意味がわかるようになってきたように思う。

色々な出会いはあったけど、まあもちろん良い事ばかりではなかった。
誰とは言わないけどモメたこともあったし、面接実況やらでニュー速でスレまで立ってお馴染みの特定の展開になったりもしてた大元の現場も書き込みこそしなかったもののリアルタイムで眺めてたし、ビジネス目的でつまらん投稿ばっかりするツマラン人間も増えたし、本当に色々な人が居るから色々なことが起こる。

新しい人の参入もある程度落ち着いたので以前ほどの急激な盛り上がりはなくなってきたけど、それでも毎日緩くみんなと「今」を共有している感じはとても楽しい。

で、そんな Google+ で知り合った人たちが集まって、月間地球さん9月号というものが出来上がった。
Picasa の画像を元のサイズで表示する Chrome 拡張を作った関係で俺まで載せてもらってしまった。
国際的なコミュニケーションが行われた結果、日本語版の他に中国語版(簡体字、繁体字)も速攻で作られた。
英語版の翻訳作業もやっている人が居る(まだ未完成のようだ)。

内容自体は正直なところ内輪ネタ感が少なからずあると思う。
でもここには俺が見てきた Google+ がまとまっていたので、2ヶ月を振り返りながら記事を書いた。
関係者各位、お疲れさまでした。
Clip to Evernote

2011年8月16日

ブラウザゲーム ColorTiles



ゲームのルールとかはこちらをどうぞ。最初のダイアログの右下にもリンクがあります。

動作環境:
PC
  Firefox, Chrome, Safari, Opera の古くないもの
iPad
  iOS3 以降。ホーム画面に登録するとオフラインでの動作も可能なはず
Android タブレット
  3.0 の Firefox でそれなりに快適な動作を確認。標準ブラウザだと若干重い


作ったと言っても実際に作業していたのはまだ iPad が iOS3 だった時代で、放置している間に随分時間が流れてしまった。当時 iOS3 では Safari のバグで正常にマルチタッチのイベントが飛んでこなかったので、その影響でマルチタッチは非対応。

もう消せなくなったら盤面をリセットしてタイム追加して続行とか、色々とまだ機能も考えたりはしていたもののモチベーションが続かなくなってしまったので、取りあえず現状を放流して終わりにしようかと思い全部公開することにしました。
Clip to Evernote

2011年8月10日

Google+™ で速攻挨拶するためのなんか凄いやつ

https://chrome.google.com/webstore/detail/kcjbjghmhjeocljmfloppdhhlafgogei

Google+ での Post では日常的に挨拶が行われていて、個人的には「そういうのはデマッターでやってろよ」と思っているものの、わりと簡単にツール化できそうだったので作ってみた。
噂通りクラス名などが圧縮されてるようでちょっとした仕様変更ですぐ使えなくなりそうな気配がしているもの、まあおもちゃとしてはよさそう。

応用しやすい構造にしておいたのでもっといい使い方があればそれに使おう。
Clip to Evernote

2011年7月30日

Google+ に高度利用者向け緊急地震速報を投稿する話

最近 Google+ に入り浸っていて、せっかくリアルタイムに色々動いてるんだからスクリプトから何か投稿することでもっと便利になるんじゃねーの、ってことでPython から記事を投稿するスクリプトを書いた
これには Google+ のスマートフォン以外のモバイル端末向けの画面を使った。

で、更にそれを使って高度利用者向け緊急地震速報を投稿する奴を作った
緊急地震速報を受信する仕組みは昔 Go 言語で作ったものを使い回して、投稿処理を繋いだだけ。


そこそこリアルタイムに投稿されるので機能性もそれなりにあっていい感じ。

2011/12/30 追記 ----

今では投稿処理にモバイル用の投稿画面からではなく、PC側の方を使うようになって地図画像の表示にも対応するようになった。
Clip to Evernote

2011年7月28日

webmdrop を作った話

https://bitbucket.org/oov/webmdrop
起動すると現れるウィンドウにオーディオファイルをドロップすると、同じ場所に WebM 形式の動画ファイルを作るツール。
Windows 用で、多分 Windows 2000 以降であれば動くんじゃないかと思う。

以下ツールを作った経緯など。

Clip to Evernote

2011年7月27日

View original size image (for Picasa)

https://chrome.google.com/webstore/detail/nkkdbkckhkoiahnjhakihonekfhconan

Google+ を見てると自作画像をしておられる方がいて、アップロード時のサイズはもっと大きいはずなので大きくして見たい!
ということで簡単にみられるように Chrome 拡張を作った。

スクリーンショットの通りで、拡大できそうな画像の時は右クリックメニューに項目が追加されるので表示された項目を選べば別のタブにその画像が出る、というだけ。

https://plus.google.com/107833567277221498070/posts/dFw2HkzSP2q
作った時の一連のコメントなども一応貼っておく。

v1.0.1 - sXXX を取り外すのではなくて s0 を付与するようにしてもっと大きいサイズで取れるように
v1.0.2 - Picasa の外部の画像をプロクシ経由で縮小表示しているようなケースに対処
v1.0.3 - *.googleusercontents.com ではなく *.ggpht.com 経由での画像拡大表示にも対応
Clip to Evernote

2011年7月21日

ASUS Eee Pad Transformer TF101 と ConnectBot

Android で使える ConnectBot という SSH クライアントがあるのだが、元々これはハードウェアキーボードが存在しない環境で使うことを想定されているようで、一部のキー入力が特殊な割り当てになっていたりしてハードウェアキーボードがある TF101 とは微妙に相性が悪い。

ちょっと調べてみたところ、マーケットには登録されていないものの Transformer 向けに改変されたバージョンが github の fork で見つかった。
後者は Android 3.1 にならないと動かない予感がするので前者を入れてみた。
  • Shift + 数字キーで問題なく記号が打てるようになっていい感じ
  • 英語キーボード的な割り当てになっているので日本語キーボードの刻印通りには出ない
    (ただ個人的には普段から英語配列の HHKB を使っているのでこれでもあまり問題はない)
  • 日本語入力は相変わらずできない
  • vim とか screen とか使うと勝手に改行されて表示が崩れまくる
    (なんか改行の処理がおかしい系の問題のような気がする……)

    解決した。ターミナルのエミュレーションモードを screen にしておくと起きない。
    xterm-256color に変えてしまっていた。完全に俺のせい。
もうすぐ Android 3.1 へのアップデートが来るようなので、それがきたら後者のも試してみたい。

---- 2011年8月11日追記

忘れてたけど Android 3.1 のアップデートがきたので試してみた。
後者の方だと日本語キーボードが日本語の配列のまま使える。
どうせCapsLockキーの位置にCtrlが配置されてないし日本語配列でもいいような気もしてきたのでこっちを入れておこうと思う。
Clip to Evernote

2011年6月26日

Native Instruments の Service Center が Windows7 で起動しない問題

少し前からうちの Windows7 64bit 環境で Native Instrument の Service Center が起動しなくなってしまった。
ソフトウェアのアップデート類がチェックできないのでサイトを見に行ってアップデータをダウンロードしなければいけなくて死ぬほどだるい。

今日久々に調べなおしたらどうやら原因が発覚したようで、IE9 をインストールしたタイミングでおかしくなるらしい。
以下の URL から辿れるフォーラムに書いてあった。


Clip to Evernote

2011年6月25日

ASUS の Eee Pad Transformer TF101 買った

ASUS Eee Pad Transformer TF101を買った。

有楽町のヨドバシカメラで買うと59800円+5980ポイント+先着15名に初代 iPad のオフィシャルカバーによく似たカバーがついてきた。
こういう感じのカバー。「Sleeve」と店員の台湾のお姉さんが呼んでいた。

自分は Android 詳しくないし、ノートパソコンを自分のために買ったこともない(NetWalker は持っているけどあれはノートパソコンとはちょっと違う気もする)。
そんな状態で買ったので過去の製品とかと比較するような詳細なレビューは出来ないものの、少なくとも IPS 液晶は綺麗だしキーボードも打ちやすいし Android3.0 のブラウザはそれなりに快適だしノートパソコンとして使うのにもそこそこ行けそうな感じ。
ライブ壁紙も気持ち良く動いてるし大体の操作がスムースに動いている気がする。フォントはモトヤのマルベリかな? なかなか綺麗で読みやすい。

Windows でブラウザを使うとき程の快適さには届かないものの、画面もそれなりに広いし通常の Web ブラウジングの用途であれば問題ないレベルで使えそう。
今このブログも Blogger に TF101 でアクセスして普通に書いてるけど HTML 編集モードじゃないと漢字変換できない以外はこれといった問題もなく普通に書けてる。
(この辺の機能は contentEditable 関連の厄介な部分なのでうまく動かないのは想定の範囲内だった)

キーボードで入力している最中に間違ってタッチパッドに触ってしまってフォーカス移動しちゃったりとかはするけど慣れの問題と思われる。

キャリアと結び付けられてないので合わせて契約するものもないし、購入の敷居が低くていい。
普通の Windows ノートじゃつまんないし Apple 製品持ってる人間の自慢話みたいなのはうざいし、ちょっと変わったものが欲しかった身としては面白いものを買った気がする。

これから色々とアプリケーションをインストールして遊んでみようと思う。

Flash を入れたらニコ動もそんなにコマ落ちせずに再生できるのでゴロ寝しながらだらだらニコ動ライフもできそう。いいねー。
ちなみに Blogger への画像のアップロードは上手く行かなかったのでPCから上げました。
スクリーンショット撮影用のボタンがキーボードに用意されていて撮影も超簡単。昔の Android だと厄介だったらしいですね。
Clip to Evernote

2011年6月22日

PuTTY + Ubuntu + screen + vim で左に寄る理由

今まで PuTTY を複数起動して並行して使ったりとかよくやっていたので、素晴らしいと噂の screen を使ってみようと思って sudo apt-get install byobu した。

でもなんかおかしい。

Clip to Evernote

2011年6月7日

オーディオサンプルフォーマットコンバータとリサンプラ

オーディオデータを扱う時、8bit / 16bit / 24bit / 32bit に int / unsigned int / float だの LSB / MSB だの色々なフォーマットがあり、色々な周波数があり、それらを相互に変換できると嬉しいことが多々ある。
フォーマットの違いを吸収するためにはわりと泥臭いコードを泥臭く書かないといけないし、リサンプラは下手に作ると計算量も少なくないので重くなりやすい。

もちろん変換を経由しないのが一番ではあるものの、ドライバが腐っていて特定のフォーマットは非対応だったり、入力したデータがぶっ壊れてたりすることもあったりするので、というかあったので、変換しなければいけないケースが出てくる。

探してみると BSD 系ライセンスでその辺をやってくれるコードが見つかる。
  • PortAudio のサンプルフォーマットコンバータ実装箇所 pa_converters.c
    クリッピングやディザリングに対応したコンバータも一部ある
  • Speex のリサンプラ実装箇所 resample.c / resample_sse.h
    ファイル名からわかるとおり SSE 最適化済みコードも含んでいる
どちらのソースもわりと切り出しやすくなっていて部分的に使う場合でもハードルが低くてありがたい。

自分のように技術力がうんこでも一見うんこじゃないプログラムが作れるよ! うんこの部分はクローズドソースなんだ! ごめんな! でも普通うんこはクローズドでするだろ!

まあ結局これら使って作ってたソフトは情熱が冷めてやめちゃったんですがね……。
Clip to Evernote

Python + wxPython で GUI アプリケーションを作る 7 ステップ

会社で PythonwxPython を使って簡単な GUI アプリケーションを作った。
案外調べながら作ると結構色々と大変だったので大まかにまとめておく。

1. Python をインストールする
Python は歴史的な事情からどれを入れるのか迷う。
Google App Engine を使うなら未だに 2.5 系じゃないと駄目だし、3 系はサードパーティ製のものを組み合わせて使う場合若干時期尚早な感じもある。今回の場合は wxPython が 2.7 系までしかまだ配布されていなかったので、Python 2.7 を選択した。

自分の環境に合わせたインストーラをダウンロードして簡単にインストールできるので特に問題になるようなことはないと思う。今回は特に 64bit 版である必要がなかったので 32bit 版を Windows7 64bit 版にインストールした。

2. wxPython をインストールする
wxPythonwxWidgets を Python から使えるようにしたもので、OS ネイティブな部品を活用するので見た目が独特になりにくいクロスプラットフォーム GUI ライブラリとして重宝されているように思う。
しかし元々 Python で作られたライブラリではないのでメソッド名などの命名規則は基本的に Python ソースコードとしてはかなり浮いてる感じになる(実害はないけど)。

色々あるのだが、さっき 32bit 版の Python 2.7 をインストールしたのでその時点で選択肢は2つ。更に今後は unicode 版に統一されていくらしいので unicode 版を選択することにした。つまり wxPython2.8-win32-unicode-py27 を選んだ。これもインストーラが提供されているので次へ次へで上手くいくはず。

3. GUI ビルダーの XRCed を使えるようにする
GUI アプリケーションは GUI の組み立てが果てしなく面倒臭いが、wxPython をインストールした際に標準で XRCed がインストールされる。他にも自分で探せば wxGlade とか wxFormBuilder とかまあ色々あって、特に wxFormBuilder なんかは Delphi に慣れた人には扱いやすそうな代物ではあるけど取りあえず最初から入ってるヤツを使うことにした。

が、どうもそのままでは起動させられないようだ。標準のインストール先であれば以下の場所にあるファイルでコメントアウトしなければいけない箇所があった。
C:\Python27\Lib\site-packages\wx-2.8-msw-unicode\wx\tools\XRCed\plugins\xh_wxlib.pyの20行目
#self.AddStyle('FPB_DEFAULT_STYLE', fpb.FPB_DEFAULT_STYLE)
ここだけ直せば、後は C:\Python27\Scripts\xrced.bat を実行すればエディタが起動するはず。起動にちょっと時間掛かるかも。

実際にモノ作ってからまとめとしてこの記事を書いているので、実のところ今では wxFormBuilder の方がよかったかなと思っている。

4. GUI を設計する
取りあえず会社で作ったのは2つのサーバに存在するファイルを SSH 経由で見比べるソフトだったので、接続設定を入力するためのダイアログが必要だった。そのためこういう感じにした。
XRCed で GUI を作って、まず xrc ファイルを保存する。その後に Python スクリプトファイルを生成するためにメニューから [Generate Python...] を選ぶと生成に関する設定項目などが現れる。
設定次第で色々な出力の仕方が出来るようだが、取りあえず xrc ファイルの内容自体を生成するスクリプトに埋め込める設定が便利そうなのでそれを使ったりした(ちなみに wxFormBuilder の場合はそもそも XRC ファイルを経由しないでフォームが生成できたりする。これはこれでいい)。
で、スクリプトファイルが生成されるので、これを使えばすぐにプログラムが作れるところまでいける。

間違えてはいけないのは生成されたファイル自体は書き換えるべきではない
まあちょっといじれば理由はすぐにわかるとは思うけど、プログラム弄る場合にGUIを変更しようとすると、そのたびに Python のソースコードファイルを生成しなおす必要がある。
直接書き換えていたらもちろん失われるので、基本的にこのソースコードには触らずに中で定義されているクラスを継承して使うようにするべき。

GUI の設計自体も Sizer の概念が理解できるまで苦労する。しかも wxStaticText が縦方向のセンタリングができないためそこにも Sizer を入れてセンタリングしたり、案外泥臭い真似をすることになった。
ただこれを覚えずに設計すると OS によって GUI 部品のサイズが違ったりするので簡単に悲惨な状態になる。

あと、wx.stc.StyledTextCtrl のように XRCed からは挿入できないコントロールもあった。
この辺は自分で継承したクラス内でコントロールを追加するようにスクリプトを書いた。

5. 処理を書く
GUI 設計とプログラム作りはある程度並行でやることになったりすると思うのでこの順番にあまり深い意味はないけどそろそろプログラムを書く頃合い。まあ自分が作りたいもの作ればいいと思うからそんなのは深く語る必要はないね?
# -*- coding: utf-8 -*-
import wx, test_xrc

class TestDialog(test_xrc.xrcTestDialog):
    pass

def main():
    app = wx.App()
    TestDialog(None)
    app.MainLoop()
動かしてないから間違ってるところあるかも知れないけどまあ書き始めはこんな感じでしょう。

6. There is no rule six.
ルールじゃねえというツッコミは把握しているため必要ありませんことよ。

7. 配布するには
他の人がこのプログラムを使うために同じ環境構築させるのはあまりに酷な話なので、この辺は上手く exe ファイルとかにまとめられるといい。
こういうのには py2exe とか py2app とか cx_Freeze とか色々あるのだが、cx_Freeze は手元の Norton がヤバいプログラムと誤認識したので今回は使わず、py2exe と py2app で Windows 用アプリケーションと Mac OSX 用アプリケーションとして生成した(そもそもコンパイル済みのスクリプト言語はアンチウィルスソフトからは解析しづらく、誤検出されてもおかしくはないわけで……)。

Mac OSX の app 形式の場合実態はディレクトリだからファイルが散らかる心配はないのだが、Windows の exe 形式の場合は対策しないとプログラム内で使ってるだけのアイコンファイルを外に配置するハメになってしまう。
この辺の対策は真面目に考えると結構面倒なのだが、wxPython は標準のインストール先に
C:\Python27\Lib\site-packages\wx-2.8-msw-unicode\wx\tools\img2py.py
というスクリプトを用意していて、これを使うと画像ファイルを Python スクリプトの中に埋め込むことができる。こうしておけばどこの環境でも同じコードで同じリソースが読める状態に持ち込めるので便利。
(ただし完全に埋め込む形になるのでコンパイル済みのものから取り出すのは微妙な感じに)

自分の場合は Windows と Mac OSX で動かすのが取りあえずの目標だったので、Windows らしいアプローチとしてリソースから読み出す手段を選択した。詳しいやり方に関してはこの辺に詳しく書いてある。
検索すると ctypes を使わずに win32api を使ってリソースを読むための API を呼ぶ例もあったのだが、ctypes を使うもののほうがポータブルな感じなのでこれを使わせてもらった。

出来上がったアプリケーションは zip 圧縮した状態で Windows 版が 6.4MB、Mac OSX 版が 16.8MB になった。少しでかいけどまあそれが問題になるような時代でもないかな。
Clip to Evernote

2011年5月4日

Ustreamのチャットって普通のIRCだったんだってさ

今日そんなことを知ったので LimeChat から繋いで普通にダラダラと会話するのに使ったりしてました。
ブラウザからチャットするよりも個人的には便利だと思うんだけど最近の人はどうなんだろう。

Clip to Evernote

2011年4月22日

PHP で BMP ファイルを読む

PHP には GD という画像を扱うためのエクステンションがあり、使用可能なサーバも少なくない。
サポート形式も JPEG / GIF / PNG など Web 上でメジャーな画像形式には一通り対応しているので困ることはないのだが、案外 BMP ファイルが読めなかったりする。
パソコンに詳しくない人が使うサービスなんかだと BMP ファイルが使えると嬉しいことも多いだろう。

ググッても案外思ったほどちゃんと対応しているコードは多くないようで、RLE圧縮非対応だったり、16bitカラー非対応だったり、特殊なビットフィールドに対応できていなかったりなどなど。
(試してないけど)真面目に対応したいんだったら ImageMagick などを使えばいいという話もあるので PHP で書かなければいけない理由はそんなにないものの、GD だけで手軽に済ませたいこともしばしばあるので真面目に書いてみた。

https://bitbucket.org/oov/php-bmp/src
  • 1bit / 4bit / 8bit / 16bit / 24bit / 32bit
  • RLE圧縮
  • ビットフィールドフリー
  • BI_JPEG / BI_PNG も読める
  • 透過情報も上手く読み込める
  • 恐らく PHP 5.1.0 以降で動くんじゃなかろうか
テスト用画像としては自分で作ったデータの他、こちらで配布されているデータも利用した。

追記: よく見たらbmp対応コードが既にあるっぽいので将来的にはどこのサーバでも bmp が読めるようになりそう。と、思ったら PHP の GD エクステンションのヘッダみると、webp はサポートしようとしてるけど bmp の気配はない……ぐぬぬ。
Clip to Evernote

2011年4月5日

SENNHEISER 92595 を買った

サウンドハウスSENNHEISER 92595 を買った。

標準プラグをミニプラグに変換するためのパーツで、似たような商品はたくさんあるのだがこのタイプの形状が多く、意外とこの商品のように途中にケーブルを経由して変換するものは少ない。
ケーブルを途中に挟むことによって接続部分が重さによって無理に引っ張られることがないので恐らく接続先に与えるダメージが少なくて済むのではないかと思い購入。

最近変換コネクタの接触が悪くてヘッドホンからなる音の左右のバランスがおかしかったのだが、これで安心して MDR-CD900ST を使えるようになった。
Clip to Evernote

2011年4月1日

僕と一緒に始めよう!初心者と始めるPHP入門[謎解き編]

エイプリルフールも過ぎたので青字で少し追記しました。

PHPは掲示板とかカウンタとか作れる凄いやつです。早速書いてみましょう!
Clip to Evernote

2011年3月30日

俺みたいなギークには HHKB が必須だろ常考

タイトルは自嘲。ギークはこんなこと言わない。
勢いで Happy Hacking Keyboard Professional2 墨 英語配列というキーボードを買った。
勢いじゃないと買えなかったと思う。自分にとってはそんな商品。
Clip to Evernote

2011年3月28日

ブラウザのヒンティングテスト

letter-spacing: 0.1em を指定した時のブラウザでのフォントヒンティング品質テスト。
適切にヒンティングが行われているなら、上から下へ綺麗に文字間が等間隔で少しずつ拡大していくはず。
MS Pゴシックやメイリオがない環境では sans-serif です。

MS Pゴシック 8px
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
MS Pゴシック 9px
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
MS Pゴシック 10px
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
MS Pゴシック 11px
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
MS Pゴシック 12px
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
メイリオ 8px
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
メイリオ 9px
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
メイリオ 10px
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
メイリオ 11px
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
メイリオ 12px
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii

Clip to Evernote

2011年3月21日

緊急地震速報を使って何か作りたい時の情報ソース

自分が作ってるものにも緊急地震速報機能を付けておくと備えあれば憂いなしかなーとか思ったので、ちょっと緊急地震速報について調べた。とはいえあんまり内容読まずに流し読み程度なんだけども。
Clip to Evernote

2011年3月7日

自作VSTエフェクト「Multiband TLs Maximizer」

マルチバンドコンプのコンプ部分が TLs Maximizer になった感じのエフェクタ、
Multiband TLs Maximizer
を作った。

マルチバンドな TLs Maximizer ですとしか言いようがないので GUI もないし語ることがない。
ニーズ自体もかなり特殊な予感。

上手く動いてるかわからんけど、まあ専門知識がなくてもこの程度なら作れるということで。
Clip to Evernote

2011年3月4日

記事単体ページに zenback を設置してみた

記事単体ページの下に zenback を設置してみた。
関連した話題があれば辿れるし、はてなブックマークやTwitterのツイート一覧が出るようになった。
この閑古鳥ブログではあんまり役に立たないかも知れないけど。

ツイートやブックマークをするためのボタンは以前のコードを流用するようにした。

zenback を入れると jQuery と衝突するとか言うので仕方がなくブログ内で jQuery 使うのをやめた。
(埋め込み用スクリプトの中に抱え込むなりしておけばいいのに……アホなの……)

zenback からのお知らせ、関連リンク、関連キーワードの項目は消せないようにタグにインラインのスタイルで important 付きでいくつか指定してるみたいだ。
この程度だと position: absolute; left: -100000px; とかで簡単に消えそう。消さないけど。

Blogger への埋め込み方法に関しては基本的な方法は検索すると出てくるようなので省略。
以下の CSS を加えてちょっとだけ角丸にした。
.zenback .zenback-heading,
.zenback .zenback-heading span {
  border-radius: 4px 4px 0 0;
}
Clip to Evernote

2011年2月18日

CSS で記述の入れ子を可能にする「LESS」と、サヨナラCSSハック


LESS « The Dynamic Stylesheet language
http://lesscss.org/

CSS を書いているとき、
  • コメントアウトに /* ~ */ じゃなくて // を使いたい
  • 入れ子で書いたのを解釈して欲しい
と思ったことがある人なら多分夢のようなライブラリだと思う。
Clip to Evernote

2011年2月17日

fabfilter Pro-Q を買った

FabFilter Pro-Q を買った。

Cubase 5 を買った時、OS は Windows 7 Home Premium の 64bit 版を使っていたので思い切って Cubase5 も 64bit 版を使い始めたのだが、正直なところエフェクト周りで結構困っていた。
世の中のフリープラグインのほとんどは 64bit に対応していないために VST Bridge を経由しなければならず、あまり激しく使うとパフォーマンス面の影響も少なくないし、使っている限りではわりと些細なことで VST Bridge がクラッシュしてしまう印象がある。

VSTi に関しては KOMPLETE 7 をメインに使うようにしているので 64bit 版への対応も問題なくできているものの、コレ以外となると現状 Cubase 標準の VSTi ぐらいしか使っていない。
一方 VST エフェクトは徐々にフリープラグインでも 64bit 対応のものが増えつつあり、例えば VoxengoBlue Cat AudioMeldaProduction などで配布されている。

が、個人的に欲しかったガッツリカットできる LPF / HPF がない。
MeldaProduction の MEqualizer が一番望むものに近いものの、無料のままだとプリセットが保存できない。
インターフェイスも煩雑な感じが否めないし、いっそまともなEQを買ってみようと思っていくつか体験版を試すことにした。
  • MEqualizerLinearPhase $132 → 日本円に換算
    方式を LinearPhase から Normal に切り替えてもレイテンシがゼロになってないのか、
    「プラグインディレイ補正の解除」(Cubaseのプロジェクトウィンドウ左上の時計アイコンのやつ)
    で無効化されてしまう
    LPF とか HPF とか切り替えるのにイチイチポップアップウィンドウが変な位置に出る
    数値直接入力するのにキーボード押しながらマウスクリックが必要で地味にめんどい
    全体的にインターフェイスが残念
  • EQuality $149.99 → 日本円に換算
    全てがひとつの画面で完結するので分かりやすくていい
    リンクしたページは LPF / HPF は 36db までしか書いてないけど最新版には 48db もある
    VST3版を使っても音データが全く入力されていないトラックで CPU 食ってるのが気になる
    例え GAIN いじってなくても有効化されてるだけで CPU 食ってるのが気になる
    Pro-Qに比べると LinearPhase モードが重い
  • Pro-Q $199 → 日本円に換算
    ポイントの情報が1つずつしか出ないので全体の設定を確認しづらい
    アナライザを重ねて表示できるのは結構嬉しい
    Zero Latency モードは EQuality の Digital モードと同じぐらいの負荷
EQuality と Pro-Q で迷ったものの、アナライザのオーバーレイ表示がいい感じだったので Pro-Q にした。
EQuality も処理しなくてよさそうなタイミングで CPU 食ってる以外は全く問題なかったと思う。
Pro-Q の使いにくさはプリセットと根性でカバーしよう。
Clip to Evernote

2011年2月13日

朝食ティータイムフィギュア付き十六茶を買った

けいおんキャラが朝食を持っている「朝食ティータイムフィギュア」が近所のセブンにあったので買ってきた。

むぎ みお みお むぎ
でこ むぎ むぎ むぎ
むぎ でこ むぎ むぎ
-----------
    ガラス
-----------
     おれ

むぎちゃんそんなに人気ないの……。
赤くしたところのむぎちゃんを買いました。
Clip to Evernote

2011年2月11日

スピッツはいいよね


チャンネル埋め込み機能があるらしいのでスピッツのオフィシャルチャンネルを貼っておきます。
Clip to Evernote

2011年2月4日

jsdo.it の埋め込み機能便利そう

jsdo.it の埋め込み機能便利そうだと思ったんだけどブログの表示領域の幅が狭いせいでまともに表示されてない予感……。
違った。背景色をちゃんとつけてないせいだった。ごめんなさい。
Clip to Evernote

2011年2月3日

golang で WebSocket チャットを作った

わりと自分にしては長い間温めてきた、というか公開するタイミングを逃し続けてここまできた感じではあるが、https と wss を使って保護された環境下で通信するチャットを作った。

Clip to Evernote