2次元セルオートマトンを眺めるだけのiPhoneアプリをつくりました

2次元セルオートマトンを眺めるだけのiPhoneアプリ「CA2D」をつくりました。
AppStore で公開しているので、iPhone などを持っている方はぜひダウンロードしてみてください。
無料です。
http://itunes.apple.com/jp/app/ca2d/id406159935?mt=8

CA2D では複数の状態を持つ2次元セルオートマトンを扱っています。
CA2D には以下のサイトで紹介されている状態遷移規則を同梱しています。
http://www.mirekw.com/ca/index.html
このサイトでは色々なセルオートマトンが紹介されています。
おもしろいので興味のある方や、セルオートマトンについてもっと詳しく知りたい方は訪れるとよいと思います。

また、このアプリケーションのソースコードgithub にあげてみました。
参考になるかわかりませんが、こちらもよろしくお願いします。
https://github.com/slightair/CA2D

TextMate で Clojure のコードを書きたい

Clojure のバンドルもきっとあるだろーと考えて探してみたら、いくつかありました。
ここの clojure-tmbundle を入れてみた。
http://github.com/kek/clojure-tmbundle

cd ~/Library/Application\ Support/TextMate/Bundles/
git clone git://github.com/kek/clojure-tmbundle.git Clojure.tmbundle
osascript -e 'tell app "TextMate" to reload bundles'

このバンドルはバンドル内に Clojure の実行環境を持つらしい。
以下のコマンドを打つと Clojure 本体と clojure-contrib ライブラリを github から取ってきてビルドしてくれる。

./Clojure.tmbundle/Vendor/clj-update-and-build

・・・はずなんだけど clojure-contrib のビルドの時に build.xml が無いと怒られてしまう。

この問題の解決方法が以下のページに書いてありました。(tumblrだけど、元の記事はどこにあるのだろう。見つからなかった)
http://mynameisanler.tumblr.com/post/795157125/setting-up-clojure-in-textmate

ページに書かれている手順にコマンドを打って、いくつかのファイルを書き変えたら、 TextMate で開いている Clojure のコードを一発で動かせるようになりました。
すばらしい。

はじめました

めずらしく本を買ってお勉強です

プログラミングClojure

プログラミングClojure

がんばるぞー

HTML5 3days Tech Talk に参加してきた

html5-developers-jp 主催の HTML5 3days Tech Talk の 2日目に参加してきました。HTML5 に関して全く知識の無い状態での参加でしたが、わかりやすい説明で話にきちんとついていくことができました。せっかく勉強会に参加したので、ちょっとずつでも HTML5 に触っていこうかなと思いました。

勉強会で話を聞きながら取っていたメモを載せてみます。

html5 で作るオフラインwebアプリケーション

講師:白石 俊平さん

HTML5は日本が熱い!
HTML5 のグループ登録者が増えている。
国で見ると、日本と韓国で盛り上がっているようだ。
日本がHTML5をひっぱっていくぜ。

オフラインwebアプリケーションとは、そのまんま、オフラインで動作するwebアプリケーションのこと。
2007 年に Google Gears が出た。
HTML5 関連の API は Gears からの影響が顕著に表れている。

しかし、Gearsを使ったアプリケーションはそんなに多くない。

普及していない理由
 - ニーズが顕在化していなかった
 - ブラウザプラグインというアプローチが普及を阻害
 - 開発の知識を持った人材が不足していた

しかし時代は変わる!
 - モバイルネット端末の普及
 - ブラウザ自身による実装
 - 標準化により開発者人口増加
もう普及するしかないだろ!

オフラインwebアプリケーションを実現するためのAPI
アプリケーションキャッシュ
 アプリケーションに必要なリソースをローカルにキャッシュするための仕組み
 キャッシュマニフェストファイルを作成する
 マニフェストを text/cache-manifest MIMEタイプで公開
 webアプリケーションのhtml要素にmanifest属性を追加してキャッシュマニフェストのURLを指定する。
 キャッシュマニフェストとは
  - キャッシュするリソースを書き連ねただけのファイル
  - 文字コードはUTF8
  - 1バイトでも変更があればリフレッシュされる
  - コメント内にバージョン文字列を含めたりする。
    
  でも、キャッシュがあるととても開発しづらい。

  デモ1
   hello1.html の中で  とか書いてた。
   manifestファイルでは hello1.htmlをキャッシュする指定
   キャッシュするから、マニフェストファイルを変更しないと再読み込みしても内容が変わらない。
  デモ2
   アプリケーションキャッシュをjsで制御して、自動更新するデモ
   マニフェストファイルが更新されていたら、新しいファイルを取ってくる。

 web database
   クライアント上で動作するRDB
   SQLを全てつかえる
   オフラインwebアプリケーションを作る上で中心的なテクノロドメインごとに領域が分れる。
   ひとつのドメインにつき複数の領域を持てる
   
   非同期と同期方のAPIがある
   
   非同期APIは常に利用可能
   結果を全てコールバック関数で受けらねばならないのでコーディングが面倒
   
   同期API
   ワーカ内でしか使えないが、コーディングが楽
   
   デモ
   java script にSQL文を書いている 
   
   safariの開発者コンソールにデータベースという項目ができてるよ
   
  web stroge
  
    キーバリューストレージ
    web database より簡単に使えるよ
    ドメインごとの領域
    ストレージは二種類
     localstroge 永続期間無制限
     session stroge ウインドウごと、ウインドウを閉じたら消える
     
     localstroge.key = "value"
     var k = localstroge.key
     
  web worker
    バックグラウンドで動くスレッド
    JSで時間かかる処理を行なうとブラウザがかたまる
    
    使うには注意が必要
    スレッドとは厳密には違い、変数を共有できない
    window documentなども不可
    JSフレームワークを使用している場合は注意
    ワーカ間のデータの共有にはメッセージングのAPIを用いる。
    
    ワーカの生成
    new Worker(scriptURL)
    
    メッセージ送信
    worker.postMessage(message)

    メッセージ受信
    worker.onmessage(message)
    
    つらい点
    workerの処理はデバッグで追うことができない
    -> fakeworker.js evalとsetTimerによるweb worker の実装
    
    メッセージングのコードはすぐ複雑になる。
    複数のメッセージをやりとりすると長大なswitch-caseなどになりがち
    -> alexService 
    
    ライブラリ作ったから試してみて。
    
  HTML5(open web platform) 時代のwebアプリアーキテクチャ
  
  理想的なオフラインwebアプリを実現するには大幅に変更する必要がある
  
  オフラインで動作する必要がある
  クライアント内で処理が完結する必要がある
  処理結果の
  
  いままでは
  サーバに処理が集中
  
  これからは
  ローカルDBとデータを読み書き
  任意のタイミングでローカルDBとの差分をDL/UL
  ロジックの大半はローカルに存在する。処理が重くなるのでWorkerを使用。
  
  これらをopen web architecture(仮)ととりあえず呼ぶ
  
  利点
  オフラインでも完全に動作
  高速でリソース消費量も少ない
  ユーザ、もしくはプログラムにより差分UL/DLのタイミングを制御可能
  スマートフォンモバイル向け
  
  オフラインでのweb利用
  あらゆるデスクトップアプリをWebベースに
  ARアプリなどでも応用
  センサーやGPSから得たデータを素早く、記録し、後にアップロード
  サーバからまとめてデータを得てキャッシュしておいてカメラ画像に重ねて表示
  
  問題点
  世界的にみてノウハウの蓄積が少なすぎる
    スクラッチから設計・実装するのは非常に困難
      DBをサーバだけでなくクライアントにも持つ事が前提となる設計手法
      差分UL/DL処理の設計と実装(高速かつフェールセーフに)
      クライアントの状態に応じた処理の切り替え
      データ変更が衝突したら
 
  解決策
   初公開
   Alexing Framework      
    
    作成中のオープンソースフレームワーク「Alexing」(仮称)
    
    クラウド向けRESTfulライブラリ+HTML5 O/Rマッパ
    ここでのO/Rとは Object/Relational Object/RESTの双方を表わす

Canvasチュートリアル

講師:羽田野 太巴さん

資料がここで公開されています。
http://www.html5.jp/blog/2009/10/04/html5-3days-tech-talk/

Canvas 
  Webページに図を描く
  canvas要素にAPIが用意されている
  JavaScriptからAPIを通して図を描く

Canvas SVGの比較
Canvas
  JavaScriptを使って描画
  描いてしまった図を個別に認識できない (円とか?)
  描画そのものは高速
  ピクセル操作が可能
SVG
  XMLマークアップで図を表現
  JavaScriptから各要素にアクセス可能
  要素が多すぎると重い
  ピクセル操作はできない
  
Canvas は個々のピクセルを扱う描画を得意とするだろう。
ウィジットは向いていないだろう
Canvasの枠組みだけでは、ボタンなどを認識できない
コントロール部分をHTMLで実現するか、ウィジット全体をSVGで描画した方が良い。

ブラウザの実装状況
  IE以外は実装済IEExplorerCanvas excanvas.js があるよ
  
マークアップHTML5にするべき?
XHTML1.0 HTML4.01でも動作する
  doctypeがなんであれ、Canvasをサポートしたブラウザであれば動作する
  でも、HTML5以外のマークアップCanvasを用いたら非準拠になるね
 
canvas要素


canvasの描画の前にcanvas要素のコンテキストを取得する。
コンテキストに定義されているメソッドやプロパティを通して実現する。

var canvas = document.getElementById('sample')
(この部分のコードをメモできなかった)

パス
ctx.beginPath();
ctx.moveTo(20,20);

ctx.closePath();
ctx.stroke();

座標系は、左上端が0,0で、右下に向って数字が大きくなっていく。


ここから先は、このメソッドでこんなのが描けるよ、といった話が続いた。Macbook の電池が切れちゃったので、ここでメモはおわり。

勉強会というものに参加することもはじめてだったのでどきどきしましたが、とてもよい時間を過ごすことができました。これからは他の勉強会にも積極的に参加してみたいなと思いました。

SnowLeopard を入れようと思う

クリーンインストールするのです。
というわけで今使っているアプリケーションのメモなのです。

Adium - IM クライント
Artwork Gofer - iTunes のアートワークを Amazon から探すソフト
AquaSKK - かな漢字変換システム
CamTwist - 仮想カメラデバイスを作るソフト。
CyberDuck - FTP クライアント
FireFox3.5 - Web ブラウザ / MacOSX 向けに最適化されたものを使っています。http://fox.lazycat.info/
GIMP - 画像レタッチソフト
Growl - 汎用通知ソフト
HappyLHA - LHA 形式の圧縮ファイル解凍ソフト
Inkscape - お絵描きソフト
iScrobbler - Last.fm に今聴いている曲の情報を送信するソフト
LimeChat for OSX - IRC クライアント
MacPorts - UNIX 向けオープンソースプログラムのパッケージ管理ソフト
MikuInstaller - Windows 向けのアプリケーションを動かすソフト
OpenInTextMate - Finder で 開いている/選択している ディレクトリをTextMateで開くためのアプリケーション(apple script)
OpenInTerminalHere - Finder で 開いている/選択している ディレクトリを Terminal.app で開くためのアプリケーション(apple script)
Porticus - MacPortsGUI で操作するためのソフト。
Quicksilver - 高機能ランチャー+α これがないとはじまらない
Reader Notifier - Google Reader の内容をメニューバーから見ることができるソフト
Skype - チャットソフト
Smultron - テキストエディタ
TextMate - コードエディタ
The Unarchiver - 各種圧縮ファイル解凍ソフト
Transmission - BitTorrent クライアント
VLC - メディアプレイヤー
YoruFukurou - Twitter クライアント

RubyGems のパッケージを作ってみた & 自前の gem サーバを建ててみた

RubyGems のパッケージを作り、そのパッケージをインストールするための gem サーバを用意する。
作成した gem を一般に公開するなら、 RubyForge にアップロードすればよいのだろう。
しかし、今回作成するパッケージのプログラムは、限られた利用者だけに公開したいプログラムなので、自前の Web サーバに gem ファイルを設置し、 gem サーバとして機能するように設定した。
サーバの RubyGems のバージョンは 1.2.0 である。*1

gem の作成
gem を作成するために、パッケージにするプログラムの情報を記述した gemspec ファイルを用意する。
以下のサイトを参考に gemspec ファイルを作成した。
るびま
http://docs.rubygems.org/read/chapter/20
パッケージの作成にあたり、プログラムのファイル配置を調整する必要があった。
参考サイトや、他のパッケージのファイル構成を参考に、bin, lib ディレクトリを作成して、適切な場所にファイルを配置した。

gemspec ファイルが作成できたら、gem build コマンドを用いて gem を作成する。
xxx はパッケージ名である。

gem build xxx.gemspec

うまくいけば、パッケージ名に gemspec で指定したバージョン番号がついた名前の gem ファイルができる。
gem ができたら、うまくインストールできるか試してみる。

gem install xxx.-x.y.gem --test

もし、インストールがうまくいかなかったり、テストに失敗するようならば、コードや gemspec ファイルを修正する。
インストールが成功したら以下のコマンドを実行して、 webrick を用いた RubyGems サーバを立ち上げて、 RDoc ドキュメントも正しく生成されているか確認してみよう。

gem server

ブラウザで http://localhost:8808/ にアクセスすれば、RDoc ドキュメントを見ることができる。
gem の設置と公開用の設定

gem ができたら、 Web サーバに gem ファイルを設置して、そこから gem パッケージをインストールできるようにする。
gem ファイルを設置するディレクトリに対し、 Web サーバ側で認証の設定をすることで、パッケージの公開範囲を制限することができる。

今回は以下の URL でリモートレポジトリを公開するとする。
http://yourserver/gemserver/

Web サーバの gemserver ディレクトリに gems ディレクトリを作成し、その中に gem ファイルを置く。
gem ファイルを置いたら、以下のコマンドを実行してインデックスを生成する。

gem generate_index -d

その後、Web サーバ側で gemserver ディレクトリ以下にアクセス制限の設定を行った。

クライアント側からインストールできるか試してみる。

gem install xxx --source http://yourserver/gemserver/

これで、自前の gem サーバができた。
公開してよし。こっそり使ってよし。

作成した gem が他の gem を必要とするときは、依存している gem ファイルを自分の gem サーバに置いておくとよい。
または、インストール時に --remote オプションを付けることで、パッケージが見つからない時に標準のリモートレポジトリへ探しにいってくれるようだ。*2
他の gem サーバにある gem ファイルは以下のコマンドで取得できる。

gem fetch パッケージ名

*1:より新しいバージョンの RubyGems が出ている。

*2:RubyGems の使い方 - WebOS Goodies