リスト遊び-Emacsで遊ぶLispの世界-(途中)

完全に現実逃避的にLispの本を読んでいます。
とはいえ、基本的にEmacsユーザなので多かれ少なかれ役には立つと思うのですが...

リスト遊び―Emacsで学ぶLispの世界 (ASCII SOFTWARE SCIENCE Language)

リスト遊び―Emacsで学ぶLispの世界 (ASCII SOFTWARE SCIENCE Language)

何となく学習したことをメモって行きます。

第一章

階乗を求めるプログラム

(defun factorial (n)                                                           
  (cond                                                                        
   ((zerop n) 1)                                                               
   (t (* n (factorial (1- n))))))

ここで、M-:でミニバッファを開く

すると、

Eval: 

と出るので

Eval:(factorial 5)

でRETで5の階乗がバッファに出力.
C-x C-eを押すとミニバッファに出力

定義した関数をミニバッファ内で逐一確認しながら出力が出来る

M-x lisp-interaction-mode
emacsのミニバッファ内でC-jを押すと対話的に実行が可能になる
(Lisp Interaction Mode )

第二章

true -> t
false -> nil

Lispのデータ構造はアトムとセル

chrome-extensionのソースを見る

忘れそうなのでメモ
(Windowsの場合 http://d.hatena.ne.jp/wata_d/20110616/1308204203)

以前はchromeの拡張のソースは、chrome拡張のここのページへ行き、
chromeの拡張のアンカーを右クリック->リンク先を別名でzipにして保存、みたいな感じで中身を見ることが出来た。

しかしながら、chromeWebStoreに仕様が変更され、どうもローカルにソースを落とすことは以前のようなやり方で出来なくなってるようである。

ちょっとググったりしてみたところ以下の方法で出来た。

1)chrome Extensionの保存場所

Terminalから以下のディレクトリで探せる

/Users/(ユーザ名)/Library/Application Support/Google/Chrome/Default/Extensions


の中にエクステンション毎のディレクトリが入っている。

2)個々のソースを見る

その中で色々ランダムにIDが振られていてワケが分からないが、

拡張機能のページ(ツール->オプション)

で以下のような画面が出る

そこで左の▲マークをクリック
IDが表示されるので先ほどのExtensionのディレクトリから見ることが出来る

node.jsを入れてる際にエラーが出てハマった

node.jsをnvmや実際にパッケージを落としてきてmakeすると以下のようなエラーが出た

Build failed:  -> task failed (err #1): 
	{task: cxx_link node_main_5.o,node_5.o,node_buffer_5.o,node_javascript_5.o,node_extensions_5.o,node_http_parser_5.o,node_constants_5.o,node_file_5.o,node_script_5.o,node_os_5.o,node_dtrace_5.o,node_string_5.o,node_zlib_5.o,timer_wrap_5.o,handle_wrap_5.o,stream_wrap_5.o,tcp_wrap_5.o,udp_wrap_5.o,pipe_wrap_5.o,cares_wrap_5.o,tty_wrap_5.o,fs_event_wrap_5.o,process_wrap_5.o,v8_typed_array_5.o,node_signal_watcher_5.o,node_stat_watcher_5.o,node_io_watcher_5.o,platform_darwin_5.o,node_crypto_5.o,http_parser_3.o -> node}

で、最初の方に以下のようなメッセージが出てきてたので、何かしらライブラリが足りないのかな、
と思っていた

Checking for program g++ or c++          : /Developer/usr/bin/g++ 
Checking for program cpp                 : /Developer/usr/bin/cpp 
Checking for program ar                  : /Developer/usr/bin/ar 
Checking for program ranlib              : /Developer/usr/bin/ranlib 
Checking for g++                         : ok  
Checking for program gcc or cc           : /Developer/usr/bin/gcc 
Checking for gcc                         : ok  
Checking for library dl                  : yes 
Checking for openssl                     : yes 
Checking for library util                : yes 
Checking for library rt                  : not found    <-
Checking for fdatasync(2) with c++       : no      <-

結論から言うと、

これらのライブラリは自分の場合には関係がなく、opensslのversionの問題だった

自分の場合で解決したのは

1)Macportsのversionを上げる
2)Macportsでインストールしたものを全てアンインストール
3)brewでopensslで入れる

※恐らくだけど、node.jsをビルドする時に使ったopensslのバージョンがMacportsで入れた古いものと結びついてしまっていたようである

http://dolias.jugem.jp/?eid=581

こういった事例があるので、opensslが原因になる場合があるようだった。
自分の場合はMacportsで入れたopensslのバージョンが古いものだったらしい

自分のマシンはOSがLeopardの時に買ったもので、SnowLeopardに上げたときに
portコマンドが変なエラーを吐いていて、かつhomebrewが流行ってたっぽいし、インストールも簡単だったので、放置してしまっていた。

具体的な手順としては、

1)Macportsの新しいバージョンのインストール

http://distfiles.macports.org/MacPorts/

ここにGUIでも入るのがあるからこれの方が楽だと思う

2)Macportsで入れたパッケージを全てアンインストール

$sudo port -f uninstall installed

3)brewで新しくopensslを入れなおす

$ brew install openssl

その後

$nvm install v0.6.0

とかやれば入ると思う。

自分のようにLeopardからSnowLeopardにアップグレードしてなんにもしてない人はこういう場合で解決するかもしれない。

セレクトボックス最適化テンプレ

PCサイトをスマートフォンに最適化するときに、PC版ではボタンだったものをそのままベタッと
貼ると、画面が小さい故にボタンの押し間違えが起こってしまう。
ましてタッチパネルの性能がイマイチなAndroidはそれが頻繁に起こりうると思う。

したがって個人的にセレクトボックスが良いかな、と思っている。
(iOSはかっこよく整形してくれるし、Androidでもそこまで挙動の違いは無いから)
以下のようにすれば選択したオプションのvalueなりidなりを取ってきて
新しいWindowを開けたり出来る。リンクに飛ばしたい場合はlocation.hrefとかで。


html

<form id="test">
    <select id="hoge">
        <option>image_harady</option>
    </select>
</form>

javascript

var elm = document.getElementById("hoge");

for(var i=0;i<5;i++){   
    var opt = document.createElement("option");
    var id = i;
    var value = i;
    var text = i + "_test";
    opt.id = id;
    opt.value = value;
    opt.text = text;
    elm.options[i+1] = opt;
    
}


function newWin(){
    var urlFlagment = elm.value;
    window.open("http://" + urlFlagment);//ここは任意のURLを指定する
};

elm.addEventListener("change", newWin, false);

これでセレクトボックスのオプションが変わったときに
リンク先に飛んだりする。

参考:画像ハラディ
http://wikiwiki.jp/domingo/?%B2%E8%C1%FC%A5%CF%A5%E9%A5%C7%A5%A3

git + dropboxでWEB開発環境を整える(書き途中)

今回の作業に至った動機

①シコシコscpでディレクトリを/var/www/とかでやるのがいい加減だるくなってきた。だいたい最新のソースがどれなのか分からなくなる
sshでhttp上で見るようにVPSで編集してたら、頻繁にsshのセッションが切れる。
③何よりVPSではviしか使えない。emacs使うと表示がおかしくなる(普段はemacs使ってる)

そんな時、先輩に「Dropboxとgitでソースを管理するのがいい」と言われたので、やってみる。
githubは何となく使ってたが、CUI系のGitはあんまり使ったこと無いので、ググリながら作業してみる。


VPS:CentOS(以下VPS)
ローカル:Mac OSX(以下Mac)



手順としては、
VPSMacDropboxをインストール
MacDropboxディレクトリの中にリポジトリを作成、Macの/Library/Webserver/Documentsなどのドキュメントルートにディレクトリをcloneする
③必要に応じてpushとかpullとかすればいちいちscpとか使わなくても生きているのが辛くない、はず。

MacにはDropboxは勿論入れてあるので、VPSCUI上で動くDropboxをインストールから始める。



CentOSDropboxを入れる

参考:

http://d.hatena.ne.jp/deeeki/20110102/dropbox_centos_cui

id:deeekiさんのエントリを参考にさせていただいた

$wget http://www.python.org/ftp/python/2.7.1/Python-2.7.1.tgz
$tar xvzf Python-2.7.1.tgz
$cd Python-2.7.1
$./configure
$make
$sudo make install 

上のエントリにも書いてある通り、/usr/local/bin/と/usr/local/lib/にインストールされるので、
pythonって打って出なかったら、ここ
http://goo.gl/uc7Skでも見ながらパスを通しましょう

$cd
$.dropbox-dist/dropboxd
Please visit (なんかURL) to link this machine.

URLが出てくるので、そこにアクセスして自分が普段使っているDropboxのアカウントのパスワードを入れる。

/home/自分 以下にDropboxディレクトリが作られる。

google chart APIが動かなくなった(書き途中)

google chart apiが動かなくなった

Firebugのコンソールには、

これを読むと、
http://markmail.org/message/e3aeitzrbwza4qss#query:+page:1+mid:e3aeitzrbwza4qss+state:results
どうやらgoogle chart apiが構築する前にページ遷移というか何かしてるらしい。

jQuery mobileでなんか作ってたらAndroidで変なエラー吐いた

iphoneの実機でフォーム

<input type = "number">

みたいなフォームにアクセス出来ないとかで困った。

さらに追い打ちをかけるようにAndroid実機orエミュレータで実証してみたら、
下記のようなエラーを吐いていた。

それっぽい情報は以下のようなものがあった。

http://www.google.com/support/forum/p/android/thread?tid=573855a87f8a57c8&hl=en

でもキャッシュを消したり、GPSをオフにしたり、って完全にユーザサイドでしか出来ないよね

http://stackoverflow.com/questions/598699/typeerror-value-undefined-result-of-expression-xmldoc-load-is-not-object

ちょいちょい情報を漁ってみるけどそれらしいのは無さそうであるので、
android用に別のページを用意したほうがいいかもしれない。

またGoogle chart apiandroidでは描画出来ない、という噂もある