2010年6月25日金曜日

Ubuntu(Kubuntu)にJDK入れた。

私はノートPCではUbuntuのKDE版であるKubuntuをインストールしていて、たまーに使ったりしてます。
Ubuntuには最初からJAVAの実行環境としてOpenJDKというものが入っていますが、Sun(Oracle)のJDK(JRE)をインストールする必要があったりしたのでやり方を載せます。
ちなみにKubuntuは10.04でした。

方法はいくつかありますが、たぶん一番楽なのは下の方法。
Ubuntu 10.04にsun-java6-jdkをインストール - Syo-Takasakiの日記
みんな大好きapt-getを使う方法。リポジトリの追加が必要らしい、自分もはまった。上の記事参考。

apt-getを使わず、JDKをダウンロードしてきてインストールする方法。
まずSunからLinux版のJDKをダウンロード。
ダウンロードした.binファイルを展開したいディレクトリに持っていく。
/usrとかだとsudoを多用することになるので、自分はhome(~/)ディレクトリにした。
言葉で書くとめんどくさいのでコマンドで書く。sudoとか書き忘れてるかもしれない。
cd
mkdir jdk
mv jdk-6u20-linux-i586.bin jdk
cd jdk
chmod a+x jdk-6u20-linux-i586.bin
sudo ./jdk-6u20-linux-i586.bin
でインストールし終わったらJAVA_HOMEを設定。
https://forums.ubuntulinux.jp/viewtopic.php?id=3982
上を参考。
さっきの続きを書くと
cd
emacs .bashrc
まあエディタはなんでもいいんですが、emacs使います。
.bashrcに以下を追加。
JAVA_HOME=~/jdk/jdk1.6.0_20
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH=$JAVA_HOME/lib/tools.jar
export JAVA_HOME PATH CLASSPATH
あってるかな?記憶を頼りに書いてるので自信ない。
.bashrcを更新したら、
source .bashrc
一応この後コンソールを終了してまた起動させたほうがいいかも。

あとは以下の記事を参考。
Ubuntu 9.04 に JDK をインストールする - Masaki Katakai's Weblog

java -versionでSunのJDKになってれば無事終了。

2010年6月22日火曜日

自作PC

最近PC組みました。
理由は、Blenderとかで3DいじってたときにノートPCだとちょっと性能的にキツイ部分があることと、学生の間にAdobeのアカデミック版のソフトを買ってインストールしておきたかったからです。

BTOとかも考えたんですが結局パーツを注文して自作することに。
ソフマップ・ドットコムとAmazonでパーツとOSを購入。10万くらい?

CPU:Core i7-860

ビデオカード:SAPPHIRE RADEON HD5770 1G GDDR5

OS:Microsoft Windows7 Home Premium 64bit 日本語 DSP版 + メモリ

メモリ:4GB(2GBx2)

HDD:Caviar Green WD10EARS バルク品 (1TB/SATA)

マザーボード:ASUS P7P55D-E

ドライブ:Liteon IHES208-27

電源:WIN+POWER 550W

ケース:ANTEC THREEHUNDRED AB

それなりに省電力にしたつもり。
i7-860でHD5770だからゲームなどもほぼできると思う。PCでゲームはそれほどやらないけど。
ドライブはBD読み込みだけの安物。BDが見られればいい、書き込みはとりあえず使わないし。
ファンよりもHDDの方がうるさく感じるのがちょっと不満。

2010年6月1日火曜日

[AS3.0]2点間の距離の計算比較

先日Point.distance()で2点間の距離を計算できることを初めて知りました。
今まで2点間の距離は、三平方の定理を使って計算していたので、Pointを使えば楽に求められると思ったのですが、どちらの計算方法が早いのか疑問に思ったので比べてみた。
package {
 import flash.display.Sprite;
 import flash.geom.Point;
 import flash.utils.getTimer;
 
 public class distance extends Sprite {
  public function distance() {
   // 点1
   var x1:Number = 100;
   var y1:Number = 0;
   // 点2
   var x2:Number = 391;
   var y2:Number = 36.8;
   
   var distance:Number;
   
   var start:Number;
   var end:Number;
   var t:Number;
   
   var i:uint;
   
   start = getTimer();
   for(i = 0; i < 1000000; i++)
    distance = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));
   end = getTimer();
   t = end - start;
   trace("Math1: " + t);
   trace(distance);
   
   start = getTimer();
   for(i = 0; i < 1000000; i++)
    distance = Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
   end = getTimer();
   t = end - start;
   trace("Math2: " + t);
   trace(distance);
   
   start = getTimer();
   var dx:Number = x2 - x1;
   var dy:Number = y2 - y1;
   for(i = 0; i < 1000000; i++)
    distance = Math.sqrt(dx * dx + dy * dy);
   end = getTimer();
   t = end - start;
   trace("Math2.5: " + t);
   trace(distance);
   
   start = getTimer();
   var pt1:Point = new Point(x1, y1);
   var pt2:Point = new Point(x2, y2);
   for(i = 0; i < 1000000; i++)
    distance = Point.distance(pt1, pt2);
   end = getTimer();
   t = end - start;
   trace("Point: " + t);
   trace(distance);
  }
 }
}
差が出やすいように100万回計算させてみた。 上のプログラムを実行した結果は、
Math1: 401
293.3176435197856
Math2: 205
293.3176435197856
Math2.5: 197
293.3176435197856
Point: 1214
293.3176435197856
計算結果は当然ながら全部一致。 計算時間は、Pointが目に見えて遅い。 あと二乗ぐらいなら、Math.pow()を使わない方が早い。 ちなみに、Math.sqrt()を使わないで自分で実装したらどうなのかと思って、ニュートン法を使って実行してみたのですが、圧倒的に遅かったです。Math.sqrt()すげー。

というわけで2点間の距離は、今後も三平方の定理を使って求めていきたいと思います。

2010年5月1日土曜日

シューカツ おいしいです ^o^

私の就職活動が一段落しました。

というわけで、就活を総括して、料理を作りたいと思います。
その名も『シューカツ』

まず一口シューを用意。本当はシュークリームで作ろうかと思ったんですけど、スーパーに売ってなかったので徳用チョコシューで代用。

チョコシューを小麦粉でくるみます。正直この工程が必要か疑問です。

先程のものを、溶き卵につけ、パン粉でくるみます。
なんか写真で見るとおいしそう。

揚げます。ケチなので油少ないです。

できました、、、が、油が少なく、温度も高かったため焦げました。悔しいので作りなおします。

改めて完成!!
中火以下で丁寧に揚げるといいです。

作ったので食べます。
中はこんな感じ
ネタで作った料理ですが、味は普通でした。
衣がサクサクパリパリしてて、中のチョコが溶けてて温かいので、普段とは違うチョコシューを楽しめます。
少し油っぽいですが、悪くないです。

完食!

1分足らずで作れる、超お手軽料理『シューカツ』。
あなたも試してみては?

2010年4月16日金曜日

[Pv3D] Meteor Attack(@wonderfl)の解説

一時的にだけど、[Pv3D] Meteor AttackWonderflでデイリーのPVで一位になったのを記念に解説をこちらのほうでやってみます。


と言ってもこれはそんなに難しいことをしているわけではないんですよね。
やっていることをまとめると、
「球(スフィア)の配置」「カメラ、ライト移動のためのイベント」「画像のロード」「シェーダー、マテリアルの設定」「球(スフィア)のクリックイベント」「アニメーション」「バンプマップの更新」
ぐらいです。

全部説明するのは面倒疲れるので、「球(スフィア)のクリックイベント」「バンプマップの更新」だけ解説します。
該当部はここらへん。
//private function onMapComplete(e:Event):void {
private function onMapComplete():void {
 //var bmpData:BitmapData = new BitmapData(e.target.loader.width, e.target.loader.height);
 var loader1:Loader = imageArray.pop();
 var bmpData:BitmapData = new BitmapData(loader1.width, loader1.height);
 bmpData.draw(loader1);
 moonBmpData = bmpData;
 var loader2:Loader = imageArray.pop();
 bmpData = new BitmapData(loader2.width, loader2.height);
 bmpData.draw(loader2);
 bumpBmpData = bmpData;
 scene.addChild(light);
 
 shader = new PhongShader(light, 0xFFFFFF, 0x666666, 0, bumpBmpData);
 var material:ShadedMaterial = new ShadedMaterial(new BitmapMaterial(moonBmpData), shader);
 material.interactive = true;
 material.smooth = true;
 var sphere:Sphere = new Sphere(material, 100, 15, 15);
 sphere.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, onObjectClick);
 scene.addChild(sphere);
 
 var particles:ParticleField = new ParticleField(new ParticleMaterial(0xffffff, 1, 1), 200, 2, 500, 500, 500);
 scene.addChild(particles);
}

private function onObjectClick(e:InteractiveScene3DEvent):void {
 var ball:Sphere = new Sphere(new ColorMaterial(0xEEEEEE), 10);
 scene.addChild(ball);
 var tween:ITween = BetweenAS3.tween(ball, {x: e.renderHitData.x * 0.9, y: e.renderHitData.y * 0.9, z: e.renderHitData.z * 0.9}, {x: e.renderHitData.x * 3.5, y: e.renderHitData.y * 3.5, z: e.renderHitData.z * 3.5});
 tween.play();
 tween.onComplete = function():void {
  var sp:Sprite = new Sprite();
  sp.graphics.beginFill(0xFFFFFF);
  sp.graphics.drawCircle(25, 25, 20);
  sp.graphics.endFill();
  sp.graphics.beginFill(0x000000);
  sp.graphics.drawCircle(25, 25, 17);
  sp.graphics.endFill();
  var bmpData:BitmapData = new BitmapData(50, 50, true, 0x00000000);
  bmpData.draw(sp);
  bumpBmpData.draw(bmpData, new Matrix(1, 0, 0, 1, e.x * 1000 - 25, e.y * 500 - 25));
  shader.bumpmap = bumpBmpData;
  scene.removeChild(ball);
 }
}
上のほうはシェーダーの設定です。
sphere.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, onObjectClick);
でSphereのクリックイベントを設定しています。

で、イベントハンドラで、
(InteractiveScene3DEvent).x及び、(InteractiveScene3DEvent).yは、SphereのマテリアルのUV情報、
(InteractiveScene3DEvent).renderHitData.x(.y, .z)は、クリックしたXYZ座標の値を取ってくることができます。
UVについてはこちらが自分はわかりやすいと思いました。英語だけど。
要するに、UVの値からテクスチャにおける座標を取得したいと思ったら、UVそれぞれにテクスチャの幅と高さを掛けてやれば良いわけです。
(InteractiveScene3DEvent).x * (image).widthという感じで。

上記のプログラムの32行目~は、外側が白で、内側が黒の円を描いて、円の中心がクリックした点になるように移動し、shader.bumpmap = bumpBmpData;でバンプマップを更新しているわけです。

バンプマップを更新したところで、地味で目立たないですね。
というかこれ、以前の記事のプログラムの流用です。

・・・解説下手だなー。