2012年1月30日月曜日

今ここ

SymfonyでHPをつくることに
チュートリアルどおりにやろうとしても、環境が中途半端に構築されていたのでよくわからない
ローカルPCにSymfonyを入れよう
前提にApache,PHP,DBがいる
ApacheってWebServerソフトウエアーっつーのか
そういえばYesodってのがある
Yesod動かしてみたい
HaskellPlatformインストールYesodインストール
コンパイルエラー
調べる
Yesod動いた
何してたんだっけ?←今ここ

2012年1月29日日曜日

YesodがWindowsで動いたよ!

Yesodを勉強したくて下記の情報から手順どおりにやってもさっぱり起動まで行かなかったのですが
http://www.yesodweb.com/book/introduction
http://www.yesodweb.com/book/basics

やっと動きました。

手順どおりに行かなかったのは以下のとおりです。
cd my-first-project内でのcabal installが失敗します。
・perlが必要
ActivePerlをインストール

・alexのバージョンが古いと言われる
cabal install alex
で3.0以上のものを取得

・alex3.0を認識しない
よくわからないのですが
\Haskell Platform\2011.2.0.1\lib\extralibs\bin

\Users\xxxxx\AppData\Roaming\cabal\bin
に関連のファイルがありまして
cabal install alex して出来たものは
こっちに出来るのですが、 \Haskell Platform\2011.2.0.1\lib\extralibs\bin のほうが優先して見つけられて古いバージョンのalexに主導権が行ってしまうようでした。
仕方が無いので\Haskell Platform\2011.2.0.1\lib\extralibs\binの中にあるalex.exeを_alex.exeとかに変えてみたら
cabal install
が成功したので、ドキドキしながら
yesod devel
っすよ。
そんで
http://localhost:3000/
にアクセスしたら表示出るじゃないですか!
嬉しいです。
Hello Worldはまた次回!

2012年1月23日月曜日

VMWareでubuntuを入れる

windowsでyesodを試そうといろいろ格闘していたのですが、どうもうまくいかないのでubuntuでやってみることにします。
yesodで失敗するのはlanguage-javascriptのバージョンが違うってエラーで、cabal install language-javascriptすると今度はalexのバージョンが3じゃねーとか言われてalexを入れようとすると失敗。
わかんないのです。
ひとまずMVWarePlayerをインストールしてubuntuのisoをダウンロードして新規仮想マシンを作成したら出来た。
簡単なんだなー。

2012年1月16日月曜日

Unityコインプッシャーにて勉強

Unityコインプッシャー
Unityのラーニングに指定されたのでさくせいしました。

iPhoneゲームを20分間で作る【メダルプッシャー編】



Unity Web Player | WebPlayer

2012年1月12日木曜日

.*演算子 メンバポインタ?

http://d.hatena.ne.jp/redboltz/20120111/1326292284
をあきらさんがつぶやいているのを見て、だいぶわからなかったので調べてみました。
http://www.geocities.jp/ky_webid/cpp/language/034.html
にメンバ関数ポインタ.*演算子について書いてありました。

とにかく
struct A{ int value_; }
に対して
A a;
a.*&A::value_ = 20;
とアクセスできることがわかりました。
まあ、なんでも
a.* がメンバにアクセスする方法で
&A::value_ がクラスの先頭からのオフセット値なんだそうでした。
まだ、途中ですが、ものすごく気持ち悪かったのが
template <class MemPtr, MemPtr p>
MemPtr Access() { return p; }
a.*Access<int A::*, &A::value_>() = 40;
で、aのメンバではないものを呼び出しているようにしか見えませんでしたが
@hudepen先生に聞いたりいろいろしていたらなんとなくわかったのですが、

a.*(Access<int A::*, &A::value_>()) = 40;
っつーことらしく、
先に計算されてAccess<int A::*, &A::value_>()が&A::value_を返すので
a.*(&A::value_ ) = 40;
となるわけで問題ないですね。
よって
void A::set(int _value){ value_ = _value;}
を呼び出す際は
(a.*Access<int A::*, &A::value_>())(50);
です。
また、A内から呼ぶ際は
void A::call(){ (this->*&A::set)(50);}
とか
void A::call(){ (this->*Access<int A::*, &A::value_>())(50) ;}
となりますでしょうか。
ほんで、当のprivateに外部からアクセスする部分はまだ見てません。

2012年1月11日水曜日

遅延評価の把握

http://d.hatena.ne.jp/amachang/20061204/1165180769
こちらを参考にjavascriptで実験してみました。
Function.prototype.funcObj = function() { return { valueOf : this } };
var random = function()
{
  var res = Math.random();
  alert('randomL:'+res);
  return res;
}
function add(i, j) {
  alert('add');
  if(j>0){
    return i+j;
  }
  return j;
}

alert(add(random(), 1));
alert(add(random(), 0));
alert(add(random.funcObj(), 1));
alert(add(random.funcObj(), 0));
普通にrandom()を引数に渡すとadd()の第二引数に関係なく必ずrandom()が実行されますが、
random().funcObj()を引数に渡すと先にadd()が呼ばれて第二引数によってはrandom()が実行されないのを確認。

こんな感じでしょうか。
しかし、
Function.prototype.funcObj = function() { return { valueOf : this } };
これがいまいち理解出来ていなくて、連想配列としてvalueOfを誰かが自動的に呼んで、その際に関数を実行させないで、自分のオブジェクトを返すって事でいいのでしょうか。