Category Archives: プログラミング - Page 2

ThinkPadと昔書いたもの

ThinkPad X201来ました(写真手前)。
画面がワイドタイプで、X31と比べてベゼルが幅広なので、箱から出したときに画面小さいなと思ったけど、電源入れてみたら広く感じられるようになりました(実際X31と比べれば解像度高い)。

2003年09月06日のブログ(現存しない、が探したらInternet Archiveにあった)に、プライベートで初めて購入したThinkPad X31の事を書いているので、8年の付き合いというか、職場でもずっとThinkPadなのでThinkPad一筋。

当時も、

Thinkpadはそのストイックな雰囲気がイイ。

と言ってた。
大丈夫、今でもブレてない。

私はトラックポイントがないと死んでしまうので、デスクトップ向けにIBM Space Saver II Keyboard(写真左端)を使用してます。
マウス持ってません。数年前にFPSやるためにワイヤレスマウス買ったのだけど、ゲーム止めたのと同時になくした。

トラックポイントは、作業中にホームポジションを外さずに済むので楽なのです。完全に依存しています。

そう言えば、このキーボードについても記事(これもInternet Archiveにある)を書いていて、日付を見たら2002年08月11日だった。X31買うより後かと思ってたけど前でした。懐かしいなあ。

ThinkPadシリーズと同様に、トラックポイントが付いています。とは言え、普段はマウスを用いているので、トラックポイントの使用率は低いです。

ブレてる!
「トラックポイントいらねえ」みたいな事言ってる。いるよ馬鹿野郎!

それにしても、自分が書いた昔の文章というのは恥ずかしい。なんかドヤ顔だし、憤りを感じる。
(最初はリンク張るのためらったけど、結局懐かしくなって張りました)

ちなみに、このブログのようなものは、私が初めてフルスクラッチで書いたWebプログラムです。試し打ちの初投稿が1999年09月28日でした。ソースコードは残ってないけど見たくないです。日本語より恥ずかしいと思う。

PHP3 + PosgreSQLで組みました。

画像貼れるようにするのに頑張った気がする。

デザインは今は亡きAlt-Rをリスペクトしたような感じというか、要するにパクりましたごめんなさい。たしかあちらはPerlだったと思う。

楽しかったな。

『コトバパレット』URL共有できるようになりました

パレット生成の言葉をURLに載せることができるようになりました。

こんなかんじ。

http://www.ivoryworks.com/大トロ

おもしろいの出たら共有しましょう。

『コトバパレット』リリースのおしらせ

 おまたせしました。できました。『コトバパレット』リリースします。できました。

コトバパレット

 『コトバパレット』は、言葉に応じてカラーパレットを生成するWebアプリです。
 言葉によってはイメージ通りの色になったり、予想外でかつ納得の色になったり、完全にありえない色が出たりしますが、それもこれもご愛嬌ということで。

 このWebアプリは、先日行われたGunma.web #4のLTで紹介したもので、その日の内にリリースする計画だったのですが、サーバで動作しない事がLTの準備段階で発覚し今日の今日までリリース出来ずじまいでいました。

 リリースが遅れた顛末等は別エントリにします。

 まずは遊んでやってください。

Gunma.web LT 『コトバパレット』まとめ

 先日のGunma.web #4でやらせてもらったLTのまとめです。
 感想等はこちら参照。

 まずはじめに、とても重要な事を言います。
 今回LTで紹介させてもらった『コトバパレット』というWebサービスは、LTの中でも言いましたが、未だにクライアントでしか動作してなく、公開に至っていません。
 下記スライドの中にURLが登場しますが、アクセスしても無駄ですのでもう少し待っていてください。泣きながら調整しています。ちゃんと動いたらリリースエントリします。

 まとめ、と言いましたが、当日は5分に収めることに注力するあまり、うまく喋れていませんでした。重要な事とか飛んじゃってたと思います。
 このエントリで少し補填したいと思ってます。

 まず、このアプリを作成するきっかけとなったのが、PANTONE社が毎年発表しているCOLOR OF THE YEARで、2011年を”Honeysuckle”とした事です。この事はGigazineの記事で知りました。
 スライド内にもありますが、「じゃあコンテンツにこのピンク色使えば2011年的にイカすんじゃなかろうか」と思って、でも配色難しくて「プログラムに作らせよう」と。
 今からして思えば、この時点で既に方向性が狂っていたと言えます。言っている事がおかしいです。

 実は、画像からパレットを作るというアイデアは、ホントの事を言うと完全なオリジナルではありません。

『Colors Palette Generator』画像からカラーパレットを一発作成

 これは、約2年前(2009/02/25)のエントリで、アップロードした写真からカラーパレットを作るというWebサービスを紹介しています。
 『コトバパレット』の出力結果が Light / Medium / Darkと3段階となっているのもこのサービスが由来です。
 私がこの、写真からパレットを生成するというアイデアを気に入っているのは、『現実世界の配色』を採用することができるからです。現実世界の配色には当然ながら不自然さがありません。現実に存在するからあたりまえですね。

 さて次に『ヒューリスティック』について少し書きます。
 これは乱暴に言うと「だいたい合ってる解法」で、スパムフィルタやアンチウイルスソフトウェアにも採用されています。
 『コトバパレット』は、これといった解法を持たないまま開発を進め、その過程で色々工夫(ヒューリスティックを考え、採用する)しながら出力(カラーパレット)の精度を上げていきました。これが非常に楽しかった。
 言葉を英訳してから検索語として扱うというボツアイデアもありました。
 
<人間はどうやって答えを得ているのか>

 今回のヒューリスティックは全てこれです。
 写真の端を切り取るというアイデアはその最たるものでしょう。

 最後に、『コトバパレット』の内部処理をざっくり書いておしまいにします。

1.画像の検索
 ユーザが入力した”言葉”をGoogleのWebAPIに渡して検索します。検索結果には、オリジナル画像のURLとサムネイル画像のURLが含まれていますが、サムネイルしか使いません。大きい画像は処理が大変だし、何といってもサムネイルはその画像の特徴が縮小されているからです。ありがとうGoogle。

2.グルーピング
 開発当初から「複数の画像から共通する色を採用する」という考えがあったので、その「複数の画像」の質を高めるため、ふさわしくない画像(性的じゃない意味で)をより分けるグルーピングを行います。
 処理は単純で、各画像を単純なパターンに変換(今回は8色以下に減色する)し、同じパターン同士をグループ化します。
 この8色減色はこのグルーピングでしか使用しません。出力結果となるパレットは、改めてサムネイル画像を512色以下に減色した結果を元にします。
 ちなみに『パターン化』は顔認識処理等にも使用されている考え方です。

3.色の採用
 質の良い画像が集まったら、元画像を512色以下に減色し、たくさん使われていて(ピクセルの数)、かつ複数の画像で使われている色の上位8色を基本パレットとします。

4.パレット生成
 最後に基本パレット(Medium)の明度を上下させ、明るいパレット(Light)と暗いパレット(Dark)を作っておしまい。
 明度の調整は、単純にRGBを上下させれば良いかと思っていたのですが大きな間違いでした。

RGBとYCrCbの変換(明度と色差)

 質疑応答の時間で「結局イカしたサイトデザインはどうなったのか」という質問がありました。これは非常に嬉しかったですね。

 最初の思いつきはどうにもなっていません。

 最初に考えた物がそのまま出来たらLT的においしくないからです。

『Language Generation Loss』というものをつくりました

 先日(と言っても既に去年だけど)のGunma.webでライトニングトークのネタにさせて頂いたWebアプリ『Language Generation Loss』を公開します。

Language Generation Loss

 前のエントリで少し書きましたが、このアプリは文章をくりかえし翻訳することで元の文章を劣化させて楽しむものです。

 たとえば、日本語→英語→日本語→英語→日本語というように、間に多の言語を挟み込むことによって、言い回しや単語そのものの欠損が発生し、思いもよらない結果(文章)が生み出されます。これは少し伝言ゲームに似ています。なお、入力する文章は日本語以外の言語にも対応しています。

 挟み込む言語は選択できるようになっているので、言語によっては大分違う結果が得られるでしょう。
 元にする言語と親和性の高い言語(文法や構造など)であれば、あまり変化が生まれないかもしれません。

 以下が実行例。

1
2
3
4
5
吾輩は猫である。名前はまだない。
I am a cat. There is no name yet.
私は猫をしています。名前のないはまだありません。
I am a cat. Yet unnamed.
私は猫をしています。まだ無名。

 余談ですが、ちょうど今読んでいるオライリーの『入門 自然言語処理』の<1.5.4 機械翻訳>に全く同じ「他言語を挟んでくりかえし翻訳する」という事柄が書かれていて非常に驚きました。

 つぎに、これはオマケのようなものですが、Language Generation Lossの副産物で『ZEN mondo』という、チャットボットに似て非なる代物もつくってみました。

ZEN mondo

 これは、くりかえし翻訳の結果を”相手の発言”として出力することで、ちょっと不思議なチャットログを生み出します。
 以下は簡単な例(下にいくほど古い発言)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
??? : さようなら。
You : じゃあね。
??? : 早く家に行ってください。
You : そろそろ帰りたい。
??? : 私はジャガイモに乗っている。
You : ジャガイモも丸いからね。
??? : まあ、それは月のように見える
You : まあ、そんなもんだろう。
??? : これは、ジャガイモと同じです。
You : ジャガイモと同等だと。
??? : 小さなジャガイモ。
You : 小さいジャガイモ・・・。
??? : ちなみに、私はこれはかなり小さいジャガイモだと思う。
You : ところで、これはかなりくだらない物だと思うのです。
??? : こんにちは。
You : やあ。
萩原 正人/中山 敬広/水野 貴明
オライリージャパン (2010/11/11)

実は『JPEGで保存』を繰り返しても大して劣化しない

 先日のLT、4枚めのスライドで「このバチカンのJPEG画像を50,000回『JPEGで保存』すると、こんな風に劣化してしまいます」と言いました。

実のところ、あの画像を50,000回”単純に”繰り返しJPEG圧縮しても、あんな風に劣化しない

 しないんです。
 テーマの本質ではなかったので、LTでは説明を省略しました。補足の意味でここに書いておきます。

 これ、気づくのに少し時間がかかりました。

 JPEG圧縮にはImagemagicのconvertを使用します。
 資料作成時、はじめに書いたシェルスクリプトが以下。

1
2
3
4
5
6
cp ORG.JPG temp.jpg
for i in {0..100}; do
  convert temp.jpg -quality 90 $i.jpg
  rm temp.jpg
  cp $i.jpg temp.jpg
done

 これを実行すると、元の画像”ORG.JPG”が、圧縮率90%で100回繰り返しJPEG圧縮されるのですが、15回めから劣化しなくなります。
 回数を増やそうが、圧縮率を変化させようが、ものの十数回で劣化が止まります。
 最初、劣化の実験には適さない画像(色数や写真そのもの)なのかとか、convertの使い方に誤りがあるのかとか悩んでいたのですが、答えはWikipediaにありました。

File:JPEG Generarion Loss rotating 90 (stitch of 0,100,200,500,900,2000 times).png

この画像資料は、同じくWikipediaのGeneration lossからリンクされているもので、JPEGを2,000回圧縮して劣化させるという、今回の目的そのままの画像です。

 親切にもシェルスクリプトが載ってました。

1
2
3
4
5
6
7
8
9
10
11
for i in {0..2001}; do

convert GenerationLoss_step$i.jpg -rotate 90 -quality 85 GenerationLoss_step$(($i+1)).jpg

if [ $(($i%100)) -ne 0 ]; then
 rm GenerationLoss_step$i.jpg
fi

echo -n "."

done

「回転させていた」

 このスクリプトでは、convertの”rotate”パラメータにより90度ずつ回転させながら圧縮しています。
 未だJPEG圧縮のアルゴリズムを完全に理解しているわけではないのですが、同じアルゴリズムを用いる限り、一定回数に達すると「情報の間引き」に効果がなくなってしまうようです。

 画像を回転させることで、各々のピクセルの位置が変化し、再び”新たに”間引かれるという効果が生まれます。
 JPEG圧縮アルゴリズムについては、こちらのコンテンツを参照しました。丁寧に書かれています。

JPEG画像形式の概要(圧縮アルゴリズム)。

 ちょと勉強になりました。

オーム社 (2001/01)

Gunma.web #3 に参加してきたよ

 2010/12/11(土)にGunma.web #3に参加してきました。
 Gunma.webは地元群馬で開催されるWeb勉強会です。

 会場は前橋のCENTというイタリア料理店で、料理のおいしさはもちろんのこと、雰囲気のとても良いお店でした。贅沢。

 で、前回の#2に続き、今回もLTさせてもらいました(使用した資料は最後に)。

 Language generation loss.

 これ何かと言うと、Googleの翻訳API(Google AJAX Language API)を用いたアプリなのですが、単に翻訳しておしまいではなく、日本語→英語→日本語→英語・・・というように翻訳を繰り返して元の文章を劣化させて遊ぶものです。Language generation lossとはつまりそういうこと。

 な・・・何を言っているのかわからねーと思うので良かったら触ってみてください。

Language generation loss

 LTのデモ向けに作ったのでかなり簡素です。
 気が向いたらちょっとした説明入れるつもりでいます。

 LTの中ではもう一つアプリを紹介していて、これはLanguage generation lossの副産物的なものですが、ZEN mondoと言います。

ZEN mondo

 一見、人工無脳的なチャットシステムのようですが、種明かしをすると、応答の文章はLanguage generation lossの仕組みそのままを用いています。つまり自分の発言を劣化させたもの。
 普通に考えると、同じ意味の文章がオウム返しで返ってくるはずですが、Language generation lossの処理結果は意外な文章となる事が多く、ちょっと不思議な感覚を味わえます。

 ・・・なんて、澄ましてアプリの紹介してますが、実はLTでまたコケました。

 前回のLTでは、モニタ設定をしくじっていて画面が2/3しか表示されず、絶体絶命的な状況に追い込まれた挙句、画面2/3のままLTを強行したという、はっきり言って信じられない暴挙に出た過去があり、今回も接続にヒヤヒヤしていたのですが、タイトルが正しくフルスクリーンで表示されたので安心しきっていたところに、デモで用意した動画が真っ暗(PC側は表示されている)で気を失いました。もちろん5分に収まりゃしません。ごめんなさい。息をしていなかったと思います。

 お見せできなかった動画は公開するつもりはないのですが、2つのアプリの面白さを短い時間で最大限に引き出せるよう実験を重ね、言葉を厳選したりしたのですが残念です。
 Language generation lossとZEN mondoについては、改めて別エントリする予定なので、その時にでも少し紹介したいと思います。

 ところで、私はWebの人間ではないので、Gunma.webには「隅っこにマゼてもらっている」という気持ちでいる反面、こういった事を言うと怒られるかもしれないけど「だからちょっとふざけてもいいよね」というちょっとズルい気持ちを持って、Web開発を絡めたLTを好き勝手にやらせてもらっています。ごめんなさい。とても感謝しています。ホントです。

Gunma.web #2 に参加してきたよ

 10/09に、地元群馬で開催されたGunma.webという勉強会に参加させてもらいました。

 初参加ということもあり、挨拶にかえてLTを。
 LT初めてなので非常に緊張しました。まず資料の作り方がわかりませんでした。

 スタパクラウドのおはなしをしたのですが、プログラムの事は1stepもでてこない上に外部モニタ出力でコケて、スライドが2/3未満しか表示されていない状態で喋りまくり、会場を大いに震撼させてきました。
 紹介している資料の中にスタパクラウドのURLが一切登場しないのも斬新だったと自負しています。

 たぶん皆さん訳が分からなかったと思いますが、掴みとしては成功です。

 Gunma.webは、WEBサイト作成に関わる方々はもちろん、私のような素性のわからない人間まで受け入れてくれる非常に素晴らしいコミュニティです。
 若干男子率が高め(100%)なので女子の方々大募集中!

『数字混じり文字列ソート』投稿

どう書く?.org』に投稿。

 お題はこちら
 自然順アルゴリズムで配列をソートしてくださいというものです。

 例えば、1.txt, 10.txt, 2.txtであれば、1.txt, 10.txt, 2.txt ではなく、1.txt, 2.txt, 10.txt というように。

 PHPではnatcasesort()という要求そのままの関数が存在するのですが(大文字小文字を区別するならnatsort()です)、この関数はキーの関係を保持してソートするため、キーを持たない配列をソートした場合に期待した結果になりません。

 例えば、

$a = array( ’1.txt’, ’10.txt’, ’2.txt’ );

この配列をnatcasesortすると、

1
2
3
4
5
6
Array
(
    [0] => 1.txt
    [2] => 2.txt
    [1] => 10.txt
)

こうなる。
 foreachで回すならこれで良いのですが、forで回す場合にはソートされていないように見えてしまいます。

 このため、お題の回答は以下にしました。
 第2パラメータを省略またはFALSEを渡せばnatcasesort()と同等、TRUEでキーの関係を保持しない結果となります。

1
2
3
4
5
6
7
8
9
10
function NaturalSort( &$target, $sw = FALSE )
{
  natcasesort( $target );
  if ( $sw ) {
    foreach ( $target as $value ) {
      $buf[] = $value;
    }
    $target = $buf;
  }
}

投稿:
http://ja.doukaku.org/comment/21159/
PHP Rank:10(74.6%)

LLTigerに行ってきました

 ブログ死んでたので今更ですが、7/31にLL Tiger(Lightweight Language Tiger)に行ってきました。

 場所は虎ノ門。10:25から20:10までと長丁場ですが楽しかったです。
 会場、座る位置にもよるのだろうけど、ちょっと寒かったかな。薄着だったというせいもあるけど。

 こういったカンファレンス等に参加すると刺激を受けるので良いです。
 本業でLLを用いる事はないのだけど、何か新しい言語に挑戦してみようかな。

 写真は会場にあったオライリーガチャポンの商品。
 Pythonのステッカーが若干卑猥な仕上がりとなっております。

 来月(9/10-11)は、オープンソースカンファレンス2010 fall
 明星大学 日野キャンパスちょっと遠いのですが頑張って行きます。静かでいいよ。