Maxのjsのバグ

Max 6.0.xのjsでTask使うとバグがあるっぽく動かない.
6.1.xだったら大丈夫.

new Task(function() {
    post("foo");
}).schedule(500);

こんな感じのソース.

想ひ出ブレイカー

この度, 『想ひ出ブレイカー』というグリッチーなiPhone用カメラアプリをリリースしました.

想ひ出ブレイカー

自主企画としては初のアプリリリースでドキがムネムネしています.
自分が作ったアプリを知らない人が使って居るという状況がとても嬉しく楽しいですね.
リリース後3日目でまだ400DLくらいですが, 別にこれでマネタイズしたいわけじゃないし, グリッチという物が好きなニッチな層に受ければそれで良いかなと思ってたりも.

このアプリ自体は半年前に作り始めて半年前に殆ど出来上がってたのですが, なかなかリリースしようという気分にまでいかず, この前勢いで申請して通った次第です. 結局アイコンや起動時の画面のデザインが一番の問題だったり…

自分のやりたいことだけやるアプリ開発超楽しい. でもそれだけじゃ食べて行けないのよね. うーん.

TypeScript勉強ログ #2 チャーチ数

Church Number

高階関数が扱える様になったら取り敢えずみんな大好きチャーチ数の実装したくなるよね!
で, 都合の悪い所は型推論に任せて型を省略するよ!

module ChurchNumber {
	interface N { (f : Fn) : Fn; };
	interface Fn { (x : any) : any; };

	export var Zero  : N = (f : Fn) => ((x : any) => x);
	export var Succ  : (N) => N = (m : N) => (f : Fn) => (x : N) => f(m(f)(x));
	export var Pred  : (N) => N = (n : N) => (f : Fn) => (x : N) => n((g) => (h) => h(g(f)))((u) => x)((u) => u);
	export var Plus  : (N) => (N) => N = (m : N) => (n : N) => n(Succ)(m);
	export var Mult  : (N) => (N) => N = (m : N) => (n : N) => n(Plus(m))(Zero);
	export var Minus : (N) => (N) => N = (m : N) => (n : N) => n(Pred)(m);

	export class Test {
		static private printNumber(m : N) : void {
			console.log(m((n : number) => n + 1)(0));
		};
		static public run() : void {
			var One   = Succ(Zero);
			var Two   = Plus(One)(One);
			var Four  = Mult(Two)(Two);
			var Three = Pred(Four);
			var Six   = Mult(Two)(Three);
			var Five  = Minus(Six)(One);

			printNumber(Zero);
			printNumber(One);
			printNumber(Two);
			printNumber(Three);
			printNumber(Four);
			printNumber(Five);
			printNumber(Six);
		};
	};
};

ChurchNumber.Test.run();

これでいけました.

Pred

(g) => (h) => h(g(f))


がすんなり通って賢いですね.

追記

module ChurchNumber {
	interface N { (f : Fn) : Fn; };
	interface Fn { (x : any) : any; };

	interface UnaryOp { (m : N) : N; };
	interface BinOp { (m : N) : UnaryOp; };
	
	interface TruthVal { (x : any) : Fn; };

	interface LogicalOp { (x : TruthVal) : TruthVal; };
	interface LogicalBinOp { (x : TruthVal) : LogicalOp; };

	interface Predicate { (...args : any[]) : TruthVal; };

	export var Wrap : (any) => (any) => any = (x : any) => (_ : any) => x;

	export var True : TruthVal = (x : any) => (y : any) => x;
	export var False : TruthVal = (x : any) => (y : any) => y;

	export var Not : LogicalOp = (p : TruthVal) => p(False)(True);
	export var And : LogicalBinOp = (p : TruthVal) => (q : TruthVal) => p(q)(p);
	export var Or : LogicalBinOp = (p : TruthVal) => (q : TruthVal) => p(p)(q);
	export var Xor : LogicalBinOp = (p : TruthVal) => (q : TruthVal) => p(Not(q))(q);
	export var Imp : LogicalBinOp = (p : TruthVal) => (q : TruthVal) => Or(Not(p))(q);

	export var IfThenElse : (TruthVal) => (any) => (any) => any = (p : TruthVal) => (Then : any) => (Else : any) => p(Then)(Else);
	export var IsZero : Predicate = (m : N) => m((x) => False)(True);
	export var Equal : Predicate = (m : N) => (n : N) => And(IsZero(Minus(m)(n)))(IsZero(Minus(n)(m)));
	export var Leq : Predicate = (m : N) => (n : N) => IsZero(Minus(m)(n));
	export var Lt : Predicate = (m : N) => (n : N) => And(Leq(m)(n))(Not(Equal(m)(n)));
	export var Geq : Predicate = (m : N) => (n : N) => Not(Lt(m)(n));
	export var Gt : Predicate = (m : N) => (n : N) => Not(Leq(m)(n));

	export var NAN : N;
	export var IsNAN : Predicate = (m : N) => m == NAN ? True : False;

	export var Zero : N = (f : Fn) => (x : any) => x;
	export var Succ : UnaryOp = (m : N) => (f : Fn) => (x : N) => f(m(f)(x));
	export var Pred : UnaryOp = (m : N) => (f : Fn) => (x : N) => m((g) => (h) => h(g(f)))((u) => x)((u) => u);

	export var Plus : BinOp = (m : N) => (n : N) => n(Succ)(m);
	export var Mult : BinOp = (m : N) => (n : N) => n(Plus(m))(Zero);
	export var Pow : BinOp = (m : N) => (n : N) => n(Mult(m))(Succ(Zero));
	export var Minus : BinOp = (m : N) => (n : N) => n(Pred)(m);

	export var Mod : BinOp = (m : N) => (n : N) => IfThenElse(Lt(m)(n))(Wrap(m))(Mod(Minus(m)(n)))(n)
	export var Div : BinOp = (m : N) => (n : N) => IfThenElse(Lt(m)(n))(Wrap(Zero))((k : N) => Succ(Div(Minus(m)(n))(k)))(n)

	export var SafetyMod : BinOp = (m : N) => (n : N) => IfThenElse(IsZero(n))(Wrap(NAN))(Mod(m))(n);
	export var SafetyDiv : BinOp = (m : N) => (n : N) => IfThenElse(IsZero(n))(Wrap(NAN))(Div(m))(n);

	export class Test {
		static public run() : void {
			var One   = Succ(Zero),
				Two   = Plus(One)(One),
				Four  = Pow(Two)(Two),
				Three = Pred(Four),
				Six   = Mult(Two)(Three),
				Five  = Minus(Six)(One);
			var Nine  = Pow(Three)(Two);
			printNumber(Zero);
			printNumber(One);
			printNumber(Two);
			printNumber(Three);
			printNumber(Four);
			printNumber(Five);
			printNumber(Six);
			printNumber(Nine);

			printNumber(Mod(Five)(Two));
			printNumber(Div(Five)(One));
			printNumber(SafetyDiv(Five)(Zero));
		};
		static private printNumber = (m : N) => console.log(m == NAN ? "NaN" : m((n : number) => n + 1)(0));
	};
};

ChurchNumber.Test.run();

TypeScript勉強ログ #1

新しいこと勉強したくてTypeScript始めました.

まださっきtsc入れたばっかなのであれですが, 取り敢えず.

インストール

npmとSublime Text2で.

npm install -g typescript
npm install -g tsc_completion

あとはtscにパス通したり, TypeScript.sublime-build入れたり, TypeScriptのSyntaxファイル入れたり.
どうせすぐ古くなりそうだからここには書かずその都度ググった方が良いと思う.

Hello World

module First {
	export class HelloWorld {
		constructor( private target : string = "World") {

		};

		say() : void {
			console.log("Hello, " + this.target);
		};
	};

	export class Test {
		static public run() {
			var hw0:First.HelloWorld = new First.HelloWorld();
			hw0.say();

			var hw1:First.HelloWorld = new First.HelloWorld("Me");
			hw1.say();

			var f = (g => g(0));

			console.log(f);
		};
	};
};

First.Test.run();

静的型付け

なんだかんだで, 良いよね, 静的型付け. はまるよね, var型.
Pythonやphpでもそうだったけどさ.
でも, ちょこちょこ書いてみてると,

((number) => number) => number


みたいな型の書き方が分からない.
これは困った. 高階関数の型こそきちんと型付けしたいのに.

で, 取り敢えず,

interface NumericalFunction { (number):number; }

var f : NumericalFunction = (x : number) => x + 1;
var F : (NumericalFunction) => number = (f : NumericalFunction) => f(0);
console.log(F(f));


みたいに, interfaceを使ってtypedefみたいなことやったら出来ることは分かった.

でも, 型変数みたいなのは無さげなので, その場でサクッとTypeに対して

((Type) => Type) => Type


みたいな型を定義は出来ない気がする. 毎回interface書くの…?
うーん.

あと, interfaceの書き方では

interface BinaryOperator { (m : number, n : number) : number; }
var bracket : (BinaryOperator) => BinaryOperator = f => (m, n) => f(m, n) - f(n, m);


だけど, 二変数になったときの感覚がまだ掴めてない.

var add : (number, number) => number = (m : number, n : number) => m + n;


じゃ怒られるし.

と思ったら,

var f : (m : number,n : number) => number = (m : number, n : number) => m + n;


だった. 型宣言でも引数名が要るの…?えー?

var g = (number) => (number) => number;


というのも許された. コンパイルされたjs見たら

var g = function (number) {
    return function (number) {
        return number;
    }
};


になってた. えー…?

今日のまとめ

ちゃんとドキュメント読んで精進します.

追記

まさか,と思って

var h : (f:(number) => number) => number = f => f(0);


ってやったら動いた. なんかわざわざ引数名付けなきゃなのはめんどくさいけど取り敢えず安心して寝れますね.

おやすみなさい.

最近’s works / Font Me / Gatorade Free Run

Font Me
石橋先生のblog
てことで天下のAdobeのキャンペーンのiPadリモコンアプリを書いてます.
キャンペーンは昨日今日明日の3日間. 参加するとスッテカーが貰えますよ.
石橋さんアプリ側で使ってるofxHTTPServerがなかなか癖が強くて最初はまりましたが基本的にはHTTP通信と一部OSCで通信してます. OSCはやっぱデータ取りこぼしが怖いのでキュー出しには向かないですね. 精神衛生上. 特にiPad側がWiFiだし.
Viva雑用プログラマ.

Gatorade Run / Fun Race
ゲータレードのキャンペーン.
スマフォアプリでレースに参加. ある特定順位だと景品が貰えます.
iPhone, Android共にやってます. 初AndroidではまりまくりGWが虚空に消えました.
天下のライゾマのテクニカルな仕切りの下, サーバーサイドが天下のマウントポジションさん, デザインが上のAdobeと同じく天下のDELTROさんと一緒にやってます.
きちんとGPS情報を使ってやってるので野外でのジョギングなら某Nike+より精度は良いのではないかと思います.
バックグラウンド処理難しいですね.

べ, 別にTwitterばっかやってるわけじゃないんだからね!!

最近スマフォアプリ多いなぁ

mosh入れてみた

今流行りのMIT謹製のmoshを会社のサーバーとMBAに入れてみた. (mosh: MITからモバイル時代のSSH代替品)

FedoraはyumあるけどCentOSのyumだと無い
けど、レポジトリどれかに入ってるだろうと思って探したけどよー分からんかった
ので、src.rpm落としてrpm rebuildしよう
としたら、MD5がゴニョゴニョと言われた
から、仕方無くrpm -ivh –nomd5したんだけどSPECS出て来ねー
ということで、gitから拾って来て./autogen.shをしたらautoreconfに怒られた
ので、漢ならtar玉だ!とtar.gz解凍して./configureしたらconfigure: error: Unable to find byte swapping functionsって怒られ
たので、ググったらgithubに Missing byte swapping functionsってのがあったのでまさにそれだ!とandrewgho氏のを丸々コピペして上手く./configure通ったのでmake!したらboost周りで怒られ
えー。。。と思いながらyumでboost141入れてみてもダメで, つうかそもそもconfigureで1.2以上って言ってんじゃんなんでだよ
とか思ったらboostのインクルードパス通してないだけでした.

大変.

で, 気を取り直してMBAにはMacPortsもhome brewも入れてないので楽にpkg使ってインストール.

いざ
mosh 192.168.1.xx
と, やってもうまくいかない. 多分俺のsshdとかの設定が悪いんだろうとは思いつつ言語がどうのと文句言われてるので色々試してたら
mosh 192.168.1.xx -server=”LANG=$LANG mosh-server”
とやったらうまく行った.
ので, vi ~/mosh.sh して
#/bin/sh
mosh $1 -server=”LANG=$LANG mosh-server”
って書いてchmod 777 mosh.shして.bash_profileに
alias mosh=”./mosh.sh”
として終わり.

でも上の記事でも書かれてるようにローカルエコーってのとネットワーク接続切れても大丈夫(IP変わっても!)というのは魅力的.
インストールの敷居がもう少し下がると良いよね. boost周りは… ね.
みんなもmosh入れよう!

よく使う/使おうと思ってる開発ツールをまとめてみる

たまにははてダの人っぽいことやってみる. 全然はてダの人じゃないけど.
リンクとかは気が向いたら貼るけど取り敢えず貼らないのでググって.

・Coda
言わずと知れたhtmlエディタ. html/css/php/jsは勿論Python辺りまで.
最近はWeb系は殆どこれですね.
以前は小さい修正はCyberduck+CotEditorとかでやってたんですけどCotEditorのバージョン上げたら連携が上手くいかないので(早く修正されて欲しい…)一通りCodaに登録する様になりました.

・Cyberduck
そろそろTransmitに乗り換えようかな…

・CotEditor
色々便利. 随分前にmiから乗り換えました. 未だに正規表現周りで変にはまったりするけど(調べもしないので改善されない)

・CodeRunner
超便利. 最近これが無いと死ぬ.
AppStoreで現在850yen.
主にjs, php, pythonの簡易エディタ+実行環境.(jsは要node.js)
それだけじゃなくC/C++/Objective-C/Javaとかも勝手にコンパイルして走らせてくれる.
ヘッダのインクルードとか謎だけど.
まあ, 取り敢えず別にこれで大規模開発はしないし, コードスニペット的なアレ.

・Hex Friend
バイナリエディタ. 地味にあると便利.

・Launcher
bashも叩けて素敵.
Alt+Space -> open /usr
とか.

// 以下まだあんまり使ってないけどAppStoreで買った良さげなの

・Jellyfissh
複数サーバーとかやり始めるとsshやってらんねーっす.
と思って調べてこれが引っ掛かって, 一応ダイスケ先生に聞いたらやっぱこれって言ってたしこれじゃね?
まあ別にクライアントはTerminalで良いし.

・Cocoa JSON Editor
まだ殆ど使ってないけど便利げ.

・JSON Validator
たまに使う. 大体勘違い.

・Javascript Packer
まあWebでも出来るしコマンドラインでも出来るけどローカルなGUIでサクッと出来ると便利じゃね?的な.

・GraphicalHttpClient
cURLで良いじゃんって言わないで.
GUIだし. 便利そう.

なんかまとめてたらWeb屋さんみたいな感じになってるね.
まあiOSは基本Xcodeだけだし, oFもXcodeだし, Maxとか言っても今更感あるし.
Webはよく分からんかrあい路色試してるんですよね. 多分.

バージョン管理システムの勉強, 基本用語編 [Subversionを例にあげて]

今までバージョン管理なんてローカルでプロジェクトフォルダを別名付けてコピーするくらいで良い程度の日曜プログラマだったわけですが, 徐々に職業プログラマになってきたのできちんとバージョン管理システムの使い方を覚えようと思い立ちまして… というか真面目に使ったことなんてなくて, 最低限のコマンド使ったことしかありません.

ということで, 大雑把に用語をまとめてみる.
間違いは内容に勉強してるつもりですが, 勘違いとか根本的に間違えてることも多いと思いますので, 間違いのご指摘は大歓迎です. 俺と同じバージョン管理素人さんは全部鵜呑みにしないように
まあ, 飽くまでも「大雑把に」なのであんまり細かい所に目くじら立てないでね… しょぼーんってなっちゃうから…
なんでSubversionを例にかというと, Subversionの本しか持ってないから. でも, まあ, 基本中の基本が多いので多分他でも通じることが多い, はず.
本当はgitを使いたいんだけどね, それはそのうち.

・リポジトリ – repository
ソースが格納される場所

・作業コピー – working copy
自分の作業用のコピー

・チェックアウト – check out
リポジトリから作業コピーをローカルに保存すること

・コミット – commit / チェックイン – check in
作業コピーでの変更をリポジトリに反映させること

・アップデート – update
自分がチェックアウトした後に別の人によって変更された差分をチェックアウトすること

・リビジョン – revision
修正のこと

・リビジョン番号
修正されたことを識別する番号, ファイル毎に付けられることもあればプロジェクト全体に付けられることもあるらしい. svnはプロジェクト全体に1つのリビジョン番号が付く

・タグ – tag
リビジョン番号より分かり易い名前を付けること, 要するにタグ

・トランク – trunk
メインのコード群

・ブランチ – branch
trunkから枝分かれしたコード群, リリースがtrunkで開発版がbranchみたいな感じ

・マージ – marge
差分の結合

ここまで分かればもう何でも出来るね!

Whitespaceインタプリタ作ったよ

某真鍋大度兄さんに急に頼まれ, 安請け合いしてしまい苦労したWhitespaceインタプリタですが, 無事公開に間に合いました. ということで大度さんが書いてる連載第一回. おめでとう, 大度さん!
http://www.cbc-net.com/dots/daito_manabe/manabe_01/

と言っても, まだバグありそうなのですが…
でもちゃんとコマンドの説明を日本語で書いた俺は偉いと思う!

取り敢えず, ちゃちゃっとbrainfuckのインタプリタも書いてLazy-KかUnlambdaも実装するか.

大度さんのいってる2bit君って俺だよ!俺!!と自己アピールしておく.

ヘタレCurry奮闘記 PAKCS [OSX]編

PAKCS を参考に.

0. Glasgow Haskell Compilerをインストール.
MCC編でもインストールしてるので省略します. MacPortsでOK.
MCC編

1. SWI-Prologをインストール.
SICStus-Prologがお薦めされてますが, 有料っぽいのでSWI-Prologをインストールします.
なんとこれもMacPortsにあります.

$sudo port install swi-prolog

2. ソースをダウンロード. (not “Mac OS X / Intel”)

$wget http://www.informatik.uni-kiel.de/~pakcs/download/pakcs_src.tar.gz

別にcurlでも良いっすよ.

3. tarで展開.

$tar zxfv pakcs_src.tar.gz

4. 移動

$cd pakcs

5. configure-pakcs

$./configure-pakcs

ここで, 僕の場合は, ghcのパスがこれで良いか?みたいな質問をされたのでyしました.

6. make install

$make install

ちょっと待ちましょう.

7. パスを設定
この人, デフォルトだと今のディレクトリにbinが出来るのでヘタレでめんどくさい僕は
.bash_profileに

export PATH=$PATH:~/[ダウンロードしたディレクトリ]/pakcs/bin

と書き込みました.
ここまで書いてある通りにやってきた人は

export PATH=$PATH:~/pakcs/bin

で良いはず. くれぐれもpakcsディレクトリを捨てない様にね!
/usr/local/binとかに入れたい人は頑張って!Unixコマンドに関してヘタレなので勘弁.

8. pakcs

$pakcs

と打って

  ______      __       _    _    ______   _______
 |  __  |    /  \     | |  / /  |  ____| |  _____|   Portland Aachen Kiel
 | |  | |   / /\ \    | |_/ /   | |      | |_____    Curry System
 | |__| |  / /__\ \   |  _  |   | |      |_____  |
 |  ____| / ______ \  | | \ \   | |____   _____| |   Version 1.9.1 (7)
 |_|     /_/      \_\ |_|  \_\  |______| |_______|   January 2009

Curry2Prolog(swi 5.6) Compiler Environment (Version of 13/01/09)
(RWTH Aachen, CAU Kiel, Portland State University)

Bug reports: mh@informatik.uni-kiel.de

Type ":h" for help

と出たら取り敢えず成功.

Prelude>1 + 2 * 3

とかやってみて動けばそれで良いと思う.

お疲れさまでした.

Have a good Curry Life!!