小学生のような夏休み

アニメの話。

大学院の友人が夏休みを利用して、フルメタルパニック1期を見たらしい。

感想は序盤は微妙だけど後半はちゃんと面白く見れただとか。

うんうん、フルメタ1期はGONZOだしシリアス展開だし好き嫌い分かれそうだけど、アニメーション作品としては素晴らしい部類だと思うんだ。

ASのバトルシーン、その他アクションシーンが3期よりも多いんじゃないかと思う。

後上手く表現できないけど、絵のタッチがミリタリー感をいい感じに出せている気がする。

なんだろう、上手く言えないけど3期とは何か違う感じ。哀愁が漂っている、みたいな。

もし無人島に長編アニメ1つだけ持って行けるとしたら迷わずフルメタを選びますわ。そんくらい好きだし良い作品だと思う。

社会人になったら絶対BD買おう。そして視聴環境も。

合わせて30万は必要かもなあ・・・まだまだ遠い。

どうやら彼はあの調子だと2期のふもっふも見るだろうし、これで彼もおそらくフルメタファンになることでしょう。

ゲームの話。

今日は大学院のメンバーでドカポン合宿でした。

と言っても泊まるわけではないんですけど。

朝11時から夜11時までひたすらやりました・・・。

面白かったけど疲れたというのが正直な感想。

大体面白かったけど、今日の中盤でとある博打イベントが発生。

自分が大穴にかけたら当たってしまい・・・資産が他3人の合計の2倍よりも多く・・・。

その大金は貯金した訳ですけど・・・これ他の人巻き返せるの?

一応物凄い代償を支払うことで貯金を0にできるかもしれない、っていう方法ならあるのですが・・・。

うーん、いっきにゲームバランス崩れました。

一時は盛り上がったけど、急に盛り下がり。

バトル全般は盛り上がるので全然かまわないのですけどね。

今後のドカポンも楽しみだ・・・!

WordPressの改良 画像投稿時の縮小表示とか

現在このblogはWordpressというblogソフトとvicuna.extというスキンを使用しているのですが、画像投稿時に画像を縮小するサイズが選べない!という状況に陥っていました。

登校フォームにはちゃんとサムネイル、中サイズ、大サイズ、フルサイズのチェックボックスがあるにも関わらず選択できない・・・!

検索してもなかなか出てきませんでしたけど、この有力情報で解決できました・・・!

http://ponnao.com/?p=4569

http://www.sa-sa-ki.jp/blog/2009/09/wordpress-3/

yum install php-gdであっさり解決。

画像のリンクをクリックするとattachmentとかいう変な中間ページ(画像は拡大されていない)に飛ばされて凄くうざーって感じだったのですが、

それは単に画像投稿フォームのリンクURL項目を投稿のURLからファイルのURLに変えれば良いだけでした。

でもって今度は画像拡大時のページ遷移が微妙だったのでLightbox 2 WordPress Plugin 日本語版を導入。

http://wppluginsj.sourceforge.jp/i18n-ja_jp/lightbox-2-wordpress-plugin/

これで画像をクリックしてもページの遷移が行われず、拡大画像を表示できるようになりました。

今までテキスト系サイトの影響からblog否定派でしたけど、blogはblogで良い所がありますね。

やっとわかってきました。

今後もちょくちょくプラグイン足して行きたいです。

多次元配列の動的確保

毎度のことながら備忘録シリーズ。

お題:Cで多次元配列の動的確保ってどうやるんだっけ?

正直言って情報系の大学院生なのに分からないとか相当恥ずかしい。

前の大学が悪いんだ!こんなこと教えてくれなかったぜ!と言いたいところだけど、独学で勉強しなかった自分も悪い。

なので恥ずかしいことだけどあえて書く!

そして忘れないように(and 忘れたときのために)しっかりと書く!

再度お題:Cで多次元配列の動的確保ってどうやるんだっけ?

http://www.booran.com/menu/c/multi_pointer.htmlを参考にしました。分かりやすかった!

答えは簡単でした、ポインタのポインタを用意してmallocしてアドレス突っ込んでやるだけ!

そう、Javaと同じでした。

Javaで

[java]
String[] stringArray = new String[10];
[/java]

ってやってもそのままじゃ使えませんよね。

[java]
stringArray[0] = new String();
[/java]

をやらないと実体が無いよ・・・と。

Cも同じで例えば3*3*3の3次元配列を動的に作ろうとしたときは以下のような感じで作る。

[c]
#include <stdio.h>
#include <stdlib.h>

int main(void){
  int ***malloc_array;
  int i, j, k;

  //3次元配列の確保
  malloc_array = (int ***)malloc(sizeof(int**) * 3);
  for(i=0; i<3; i++){
    malloc_array[i] = (int **)malloc(sizeof(int *) * 3);
    for(j=0; j<3; j++){
      malloc_array[i][j] = (int *)malloc(sizeof(int) * 3);
    }
  }

  //0クリア
  for(i=0; i<3; i++){
    for(j=0; j<3; j++){
      for(k=0; k<3; k++){
	malloc_array[i][j][k] = 0;
      }
    }
  }

  //3次元配列として扱える
  malloc_array[0][0][1] = 1;

  //print malloc_array
  printf("print malloc_array\n");
  for(i=0; i<3; i++){
    for(j=0; j<3; j++){
      for(k=0; k<3; k++){
        printf("%d ", malloc_array[i][j][k]);
      }
      printf("\n");
    }
    printf("\n");
  }
  printf("\n");

  return 0;
}
[/c]

出力結果

print malloc_array
0 1 0
0 0 0
0 0 0

0 0 0
0 0 0
0 0 0

0 0 0
0 0 0
0 0 0

と、まあ面倒っちゃ面倒だけど一応作れるようにはなった。

けどこれだとmallocを何度も呼び出しているのでアドレスがきっちり揃っていない。

アドレスを出力するコードを追加して実行してみる。

[c]
  //print malloc_array addresses
  printf("print malloc_array addrsses\n");
  for(i=0; i<3; i++){
    for(j=0; j<3; j++){
      for(k=0; k<3; k++){
        printf("%x ", &malloc_array[i][j][k]);
      }
      printf("\n");
    }
    printf("\n");
  }
  printf("\n");

[/c]

print malloc_array addrsses
e2bc050 e2bc054 e2bc058
e2bc070 e2bc074 e2bc078
e2bc090 e2bc094 e2bc098

e2bc0d0 e2bc0d4 e2bc0d8
e2bc0f0 e2bc0f4 e2bc0f8
e2bc110 e2bc114 e2bc118

e2bc150 e2bc154 e2bc158
e2bc170 e2bc174 e2bc178
e2bc190 e2bc194 e2bc198

すごく・・・とびとびです・・・。

ポインタ変数を++すると型分だけ先に進んで次の内容(配列の1個先)が見れるってのがありますよね。

3次元配列と言えど、結局は1次元だから上記の配列を1次元と見なして++でどんどん次を見ていくとき、こんなアドレス状況じゃあ使える訳ないですね。

という訳で改良。ようは、どかっと取ればいい。

[c]
#include <stdio.h>
#include <stdlib.h>

int main(void){
  int ***malloc_array;
  int i, j, k;
  int count = 0;
  int *p;

  //3次元配列の確保
  malloc_array = (int ***)malloc(sizeof(int**) * 3 );
  for(i=0; i<3; i++){
    malloc_array[i] = (int **)malloc(sizeof(int *) * 3);
  }
  //intの実体(配列)をどかっと確保
  malloc_array[0][0] = (int *)malloc(sizeof(int) * 27);

  malloc_array[0][1] = malloc_array[0][0] + 3;
  malloc_array[0][2] = malloc_array[0][1] + 3;
  malloc_array[1][0] = malloc_array[0][2] + 3;
  malloc_array[1][1] = malloc_array[1][0] + 3;
  malloc_array[1][2] = malloc_array[1][1] + 3;
  malloc_array[2][0] = malloc_array[1][2] + 3;
  malloc_array[2][1] = malloc_array[2][0] + 3;
  malloc_array[2][2] = malloc_array[2][1] + 3;

  p = &malloc_array[0][0][0];

  //0クリア
  for(i=0; i<3; i++){
    for(j=0; j<3; j++){
      for(k=0; k<3; k++){
	malloc_array[i][j][k] = 0;
      }
    }
  }

  //3次元配列として扱える
  malloc_array[0][0][1] = 1;

  //print malloc_array
  printf("print malloc_array\n");
  for(i=0; i<3; i++){
    for(j=0; j<3; j++){
      for(k=0; k<3; k++){
        printf("%d ", malloc_array[i][j][k]);
      }
      printf("\n");
    }
    printf("\n");
  }
  printf("\n");

  //print malloc_array addresses
  printf("print malloc_array addrsses\n");
  for(i=0; i<3; i++){
    for(j=0; j<3; j++){
      for(k=0; k<3; k++){
	printf("%x ", &malloc_array[i][j][k]);
      }
      printf("\n");
    }
    printf("\n");
  }
  printf("\n");

  //print malloc_array pointer addresses
  printf("print malloc_array addrsses\n");
  for(i=0; i<3; i++){
    for(j=0; j<3; j++){
      printf("%x \n", &malloc_array[i][j]);
    }
    printf("\n");
  }
  printf("\n");

  //malloc_arrayを適当な数字で埋める
  for(i=0; i<3; i++){
    for(j=0; j<3; j++){
      for(k=0; k<3; k++){
	malloc_array[i][j][k] = ++count;
      }
    }
  }

  //上手く行く、1次元配列として扱える
  printf("forで27回ループしつつp++してゆく\n");
  for(i=0; i<27; i++){
    printf("[%d]=%d\n", i, *p++);
  }

  return 0;
}

[/c]

出力結果

print malloc_array
0 1 0
0 0 0
0 0 0

0 0 0
0 0 0
0 0 0

0 0 0
0 0 0
0 0 0

print malloc_array addrsses
1321b090 1321b094 1321b098
1321b09c 1321b0a0 1321b0a4
1321b0a8 1321b0ac 1321b0b0

1321b0b4 1321b0b8 1321b0bc
1321b0c0 1321b0c4 1321b0c8
1321b0cc 1321b0d0 1321b0d4

1321b0d8 1321b0dc 1321b0e0
1321b0e4 1321b0e8 1321b0ec
1321b0f0 1321b0f4 1321b0f8

print malloc_array addrsses
1321b030
1321b038
1321b040

1321b050
1321b058
1321b060

1321b070
1321b078
1321b080

forで27回ループしつつp++してゆく
[0]=1
[1]=2
[2]=3
[3]=4
[4]=5
[5]=6
[6]=7
[7]=8
[8]=9
[9]=10
[10]=11
[11]=12
[12]=13
[13]=14
[14]=15
[15]=16
[16]=17
[17]=18
[18]=19
[19]=20
[20]=21
[21]=22
[22]=23
[23]=24
[24]=25
[25]=26
[26]=27

きれいに揃ってるしちゃんと++できました。

でも多次元配列を1次元と見なして++していいんだろうか。

実験したところmallocじゃなく宣言で多次元配列用意するとほとんど連続したアドレスが割り当てられるみたいだけど・・・

ここら辺は言語仕様読まなくちゃ分からない気がする。

まだ詰めが甘い気がするけど、とりあえず多次元配列の動的確保は完了!

また少し成長した気がします。

ねんどろいどぷち

ついに・・・ついに買っちゃいました!ねんどろいどぷち!

Fate/stay nightと東方第一弾です。

やっぱできが良いと思う。

自分はフィギュア1体に7000円もかけられないので1個500円程度のねんぷちは凄く合ってると思います。

ちっちゃかわいい。うん、おすすめです。

Fate/stay nightはBOX(12個入り)をAmazonで買いました。なんかすごく安くなってるので。

アマゾンのサーバでエラーが起こっているかもしれません。
一度ページを再読み込みしてみてください。

ちなみにヨドバシだと5000円で売ってました。

このFateのBOX、箱に「BOXには全種入ってるわけではない(意訳)」と書いてあるのですが、開けてみたら全種類揃ってました。やった・・・!

今後もねんぷちのフィギュアは要チェックです。

グッドスマイルカンパニーいい仕事するじゃん・・・!

ただ、ちょっと欠陥があったことは忘れないけどな・・・!

画面中央、黒い足が無い・・・・

袋の中にも入ってなかったので梱包前、多分製造時にもげた?

これくらいは目をつむってやることにしよう。

欠陥はあったものの、おおむねいい会社、いいフィギュアだと思います。

という訳で次はAngel Beatsと東方第二弾をチェックだ・・!

Let’s noteっていいよね、CPUとかが

うちのパソコン古くなってきて結構厳しいです。

特にCPUが厳しい。Athlon64 X2

具体的にはH.264の動画再生時とか、VS2010でコンパイルするときとか・・・厳しいです。

という訳でパソコン買い替えを考えているのですが、次はノートPCにしようかなーと。

理由は主に2つ、前述の通り性能が欲しいのと、あと省スペースです。

来年4月から最低3ヶ月は茨城確定なのでノートPCで行きたいなと。

某家電量販店でLet’s note見てたときに店員に「持ち運びしない、動画関係目的でないなら他のノートPCでもいいかも」と言われたので、・・・本当にこれでいいのか調べてみることに。

必須条件:12.1inchモニタ、Corei5 or Corei7、メモリ2G でkakaku.com検索

うん、LenovoかLet’s noteしか見つからないわ!

一応富士通も検索ヒットするのですが、Corei5の低消費電力版なので周波数が1.2GHzしかない。

店員さんの気持ちも分かるよ!確かにLet’s noteは軽さと耐衝撃性を凄く売りにしてるよね。

持ち運びしない人はその分のメリットが無駄になってる!買わない方がいいかもしれない。

でもLet’s noteSシリーズの真価は他機種に無いハイエンドなCPUが乗ってるってところにあると思うんだよ!

というわけで次買うPCはLet’s noteでほぼ決まり。

12.1inch以上のでかいノートを買えば他社でもCorei5乗ってるんでしょうが、省スペースでないので却下。

できればBluethooth内臓ノートPCが良いのですが、内臓版は凄く高いみたい・・・。

とにかく来年の春までに15万くらい用意しないとなあ。