学生ケータイあわ~ど 2008 のページに「tabWallPaper」が掲載されました

学生ケータイあわ~ど2008
広島大学で表彰式 | BlueSky Lab.

昨年、i アプリを作ってプレイステーション 3 を頂いた、大変おいしい企画 「学生ケータイあわ~ど 2008」が約束通り今年も開催されるようだ。
それで、「学生ケータイあわ~ど 2008」のサイトに昨年度の受賞作品として、私が作った「tabWallpaper」が掲載されている。(学生ケータイあわ~ど2008 ―サンプル―)

この企画がなぜ「おいしい」かというと、
・参加条件が「中国地方の大学・小中高・高専・専門学校の学生」
これだけでもかなり限定される上に、(昨年の場合) 始まったばかりで認知度が低く応募者が少ない。
大学院生はダメっぽいけど、去年の表彰式では大学院生が普通に受賞してた。

・副賞がやたらとよい
今年も「パソコン」、「プレイステーション 3」、「iPod」など、総額で 50 万円弱はあるのではないかと思う。

・アイデアだけでも応募可能
コードを書けなくても、もちろん OK。そう簡単に実現できないようなアイデアでも、もちろん OK というかむしろ歓迎な雰囲気。(昨年の場合)

・表彰式で他大学・高専と交流
これをきっかけにしてネットワーク (?) を広げることができるかも。
去年の私の場合、プレゼンの用意を全くしていなかったせいで最悪だったけど。

9 月 30 日まで応募を受け付けているみたい。今から i アプリの作り方覚えても全然間に合う。
ちなみに、ドコモの HP「あわ~ど」のサンプルが大変参考になった。

おいしい企画なので、ぜひ。

行列式の値の求め方、逆行列の作り方の C 言語プログラム

本業だけじゃ生活できないので、ときどき他学科のプログラミング演習の課題を受託開発をすることで、見返りに唐揚げ定食とかうまかっちゃんとかよくおごってもらっている。

なぜかこの時期に「行列式の値」と「逆行列」を作成するプログラムを毎年書いている気がして、その都度作るのが非常に面倒臭いので、今後も困らないようにアップしておく。

行列式の値の求め方

・2 次の場合
たすきがけで簡単に解ける。

double a[2][2]={{1,2},{4,-1}};
double det=0.0;
det=a[0][0]*a[1][1]; det-=a[0][1]*a[1][0]; printf("%f\n",det); // -> -9.000000


・3 次の場合
サラスの方法で簡単に解ける。

double a[3][3]={{1,8,9},{-3,2,1},{4,1,5}};
double det=0.0;
det=a[0][0]*a[1][1]*a[2][2]; det+=a[1][0]*a[2][1]*a[0][2]; det+=a[2][0]*a[0][1]*a[1][2]; det-=a[2][0]*a[1][1]*a[0][2]; det-=a[1][0]*a[0][1]*a[2][2]; det-=a[0][0]*a[2][1]*a[1][2]; printf("%f\n",det); // -> 62.000000


・4 次以上の場合
通常の計算では 3×3 以下の余因子行列を作成して、符号を掛けた上で足し合わせるやり方を使うと思う。
これをプログラムで実装するには、再帰または多段ループが必要になり計算量も多い。
特に 5 次以降になると面倒。

でも、上三角行列を作って、対角部分 (左上から右下) を掛け合わせれば、簡単に行列式の値を求めることができる。
このやり方だと非常に簡単。

double a[4][4]={{2,-2,4,2},{2,-1,6,3},{3,-2,12,12},{-1,3,-4,4}};
double det=1.0,buf;
int n=4;  //配列の次数
int i,j,k;
//三角行列を作成 for(i=0;i<n;i++){ for(j=0;j<n;j++){ if(i<j){ buf=a[j][i]/a[i][i]; for(k=0;k<n;k++){ a[j][k]-=a[i][k]*buf; } } } } //対角部分の積 for(i=0;i<n;i++){ det*=a[i][i]; }
printf("%f\n",det); // -> 120.000000


逆行列の求め方

何といってもやはり掃き出し法が簡単。
2 次から n 次まで対応。

double a[4][4]={{1,2,0,-1},{-1,1,2,0},{2,0,1,1},{1,-2,-1,1}}; //入力用の配列
double inv_a[4][4]; //ここに逆行列が入る
double buf; //一時的なデータを蓄える
int i,j,k; //カウンタ
int n=4;  //配列の次数
//単位行列を作る for(i=0;i<n;i++){ for(j=0;j<n;j++){ inv_a[i][j]=(i==j)?1.0:0.0; } } //掃き出し法 for(i=0;i<n;i++){ buf=1/a[i][i]; for(j=0;j<n;j++){ a[i][j]*=buf; inv_a[i][j]*=buf; } for(j=0;j<n;j++){ if(i!=j){ buf=a[j][i]; for(k=0;k<n;k++){ a[j][k]-=a[i][k]*buf; inv_a[j][k]-=inv_a[i][k]*buf; } } } } //逆行列を出力 for(i=0;i<n;i++){ for(j=0;j<n;j++){ printf(" %f",inv_a[i][j]); } printf("\n"); }
/* 出力 2.000000 2.000000 -1.000000 3.000000 -4.000000 -5.000000 3.000000 -7.000000 3.000000 4.000000 -2.000000 5.000000 -7.000000 -8.000000 5.000000 -11.000000 */

プログラムは Microsoft Visual Studio 2008 および Fedora 9 の gcc で実行確認済み。
手元に Linux のマシンがなかったので、稼働中の Web サーバを使って動作確認した。

今更だけど、Java の勉強を始めた

携帯の i アプリとか、コマンドラインで動くちょっとしたプログラムなら作ったことあるけど、本格的にはじめたのは某研究で某装置-某サーバ間で TCP/IP 経由のネットワークプログラミングが必要になったため。
別に Java じゃなくてもできそうなんだけど。

とりあえず、研究室に放置されてあった本の、「Java クイックリファレンス」が非常に詳しくためになるので、1200 ページくらいあったけどがんばって半分くらい読んだ。
具体的なソースの書き方がわかんなかったので、土曜日に博多のジュンク堂へ行って、「やさしいJava 活用編」を買った。
ついでに、「ActionScript 3.0 逆引きリファレンス」も買った。
いつも通り立ち読みしすぎて疲れたので、休憩をかねて成分献血した。

Javaクイックリファレンス 第4版
David Flanagan
オライリー・ジャパン
売り上げランキング: 236733
やさしいJava 活用編 第2版 (やさしいシリーズ)
高橋 麻奈
ソフトバンククリエイティブ
売り上げランキング: 24998
ActionScript 3.0 逆引きクイックリファレンス Adobe Flash CS3対応
田中 康博 林 拓也
毎日コミュニケーションズ
売り上げランキング: 9618

Java Books

新しいプログラミング言語を習得するときは、今までに習得した言語にとらわれずに、中学校や高校、大学に入学したてかのようなのピカピカの気持ちで、貪欲に知識を吸収するのが最も効率的だと思う。

Google の水筒が送られてきた

ここ最近、昼間はずっと研究室にいるから、自宅宛てに届いた宅配便を受け取れなくて、毎日不在票がポストに入ってたんだけど、やっと今日受け取ることができた荷物のひとつがこれ。

case of Google bottle
Google のロゴが入ってる、こんな箱に入ってた。

Google bottle
箱を開けると、緑色のケースに入ったボトルが出てきた。

Google bottle rear
緑色のケースを開けると、裏に「I'm Feeling Lucky」と書いてあった。

なぜ、Google の水筒が届いたの? って聞かれると、たぶん、UNIQLO のプレゼントに当選したから、って可能性が濃厚。だって、宅配便の送り主が「(株) ユニクロ」だったから。

実は去年にもこの時期に水筒をプレゼントで当選してて、今も去年のぽんいちボトルを愛用しているから、扱いに困っているのが本音。ぽんいちボトルは Google Bottle よりたくさん液体をストレージできて、ケースはついてないけど氷だって入る。とりあえず鑑賞用として飾っておく。