最初から高級車メーカーになろうと思ってはならない

ツイッターに書こうと思ったが、ふとがっつり書きたくなったのでブログに。


ちなみに僕は車はおろか免許すらもってなく、ただ Top Gear が好きなだけなので車関係で色々間違ってたらごめんなさいorz

今の自分の身の丈にあったものを作る

イギリスの車番組 Top Gear の司会者 Jeremy Clarkson は新しい高級車メーカーが現れる度にこう思うらしい


『また「Ferrari 以上の車を作るなんて簡単だぜ(鼻声)」と勘違いする馬鹿が現れた』と


実際そのとおりでタケノコのように高級車メーカーがぽこしゃか現れては見事に爆発四散していった。


唯一生き残ったのは Pagani Zonda だけだった(多分他にも Noble とか色々あるとは思いますが詳しくないのでorz)


「彼らは高級車を作ろうとはしませんでした」


どの回かは忘れましたが、とある新しい車メーカーを紹介するとき Jeremy はこう言った。
彼らは車の黎明期を彷彿とさせる車を作った。ニッチに食い込むという戦略のもとで。


ゲームでいうとレトロゲーを作るようなもんでしょうかね?
きっとアングリービデオゲームナードみたいな人が絶対買ってくれますよ!そしてバッファローの下痢をかけてくれるでしょう!

Unity はガチバトル。HTML5 は公園での砂遊び

Unity 本体がブラックボックスの塊だったので長いこと避けてたんですが、最近ようやく触ってみました。


Unity は既存のゲームコミュニティよりは遥かにオープンですが、enchant.js(というより 9leap かな?)に比べたらかなりクローズドだと感じました。


Unity は自分も高級車メーカーに仲間入りができるかもしれない。と夢を見させてくれる魔法のアイテムだと思うんです。
だからある程度クローズドになるのは当然だなーと。そりゃみんな必死になりますよね。


自分の商品の生命線とも言えるソースコードを晒すなんてもってのほかだ。
Unity は遊びじゃないんだよ!!!


9leap のようなおもちゃ箱(最大限の尊敬と感謝を込めて)で遊んでる少年・少女(最近では3・40代でも少女扱いらしいですね・・・)には分からない、ほんとうに食うか食われるかの戦いをしている。


どうも楽しくなかった。


それもそのはずで、僕の総合的な能力(僕自身のスキルレベルとかグラフィッカーの人脈とか資金とか)では並み居る強豪たちにガチバトルを挑んで勝てるはずがないのは明らかだった。勝負にすらなってなかった。


Hunters 2 っていう iOS のゲームいくらか知ってるかい?450円なんだぜ?あのクオリチーで。まぁ多分あれは Unity ではないでしょうが。


嘘みたいだろ・・・こんなレベルの相手だらけなんだぜ?いい感じに絶望するだろ?


どうみてもレッドオーシャンです。本当にありがとうございました。


あと、ソースコードを晒さないというのは、誰からもアドバイスを受けられないということになります。
友達や先生のいない僕には致命的で、学ぶ機会がなくなり僕の成長は頭打ちになることは目に見えてました。


そんな答えが見つからない毎日の中、結局僕はプチ鬱(なんにでもプチをつけるないい加減にしろ!!)になってしまいました\(^o^)/

僕の答え

何週間も悩みぬいた末に僕が出した答えは、もう全部オープンソースでいいや。でした。
いいじゃないですが、一銭も稼げなくても、楽しければ。


それを誰かに丸ごと使用されて稼がれても大丈夫だ問題ない(むしろ感謝)


逆にそれが合図なんだと思います。「お前が作ったものに売りさばく価値があると判断する人間が現れ始めたぞ」と。


その時になってから初めてマネタイズについて考えたんでいいと思うんです。その時こそが高級車メーカーに挑戦するチャンスなんだと思います。


それ GPL でイイジャン。というツッコミもあるかもしれませんが、GPL は諸刃の剣。
ゲームを作っていつの日かこじんまりでいいからお金稼ぎたいなーと思うなら最低でも MIT でなくては将来的に自分の首を絞めることになると思いました。(自分で商用利用する場合、使えなくなる可能性が大)


あと誰かにマネタイズを丸投げ(アウトソージング)できたならーという思いも正直少しあります。
誰かが稼いできてくれて分前もらえて生きていけたらなー・・・と(白昼夢)


とまぁーー長々と書いてしまいましたが三行(AA)でまとめますと。

       ____ 
     /      \ 
   /  _ノ  ヽ、_  \ 
  / o゚((●)) ((●))゚o \  ほんとは働きたくないからなんとかお金を稼ぎたいんだお 
  |     (__人__)    | 
  \     ` ⌒´     / 



       ____ 
     /      \ 
   /  _ノ  ヽ、_  \ 
  /  o゚⌒   ⌒゚o  \  でもマネタイズとか考えると無理ゲーすぎて鬱になるお… 
  |     (__人__)    |   
  \     ` ⌒´     / 



       ____ 
     /⌒  ⌒\ 
   /( ●)  (●)\ 
  /::::::⌒(__人__)⌒::::: \   だからもう考えるのをやめて全部オープンソースでだすお! 
  |     |r┬-|     | 
  \      `ー'´     / 


だっておばんばんwwwwwwwww
現実逃避おつwwwwwwwwwww

追記

後々になって思うと html5 ってどっちかというとソーシャルゲームの領域ですよね(失念)
彼らも壮絶なガチならぬガチャバトルを繰り広げているので html5 が公園の砂遊びと言ったのは間違ってました(謝罪)

socket.io のサンプルを heroku で動かしてみる

http://d.hatena.ne.jp/alpha_neet/20120508/1336497694 の続きです。

環境

node 0.6.12
npm 1.1.4
socket.io 0.9.6

nave を使って node をインストール

2012/05/09 の時点で最新の node のバージョンは 0.7.8 ですが、
socket.io 付属のサンプルが 0.7 以上では動かないので、0.6 系をインストールします。

nave install 0.6.13
nave use 0.6.13
curl http://npmjs.org/install.sh | sh

ちなみに nave usemain をすると、デフォルト選択になって、起動時にいちいち use しなくていいらしい。

socket.io のサンプルを落とす。

cd ~/work(どこでもいい)
npm install socket.io
mv node_modules/socket.io/examples/chat/ .
cd chat

追加ファイル
  • .gitignore
node_modules
  • Procfile
web: node app.js
変更ファイル
  • app.js
@@ -5,7 +5,7 @@
 var express = require('express')
   , stylus = require('stylus')
   , nib = require('nib')
-  , sio = require('../../lib/socket.io');
+  , sio = require('socket.io');
 
 /**
  * App.
@@ -42,7 +42,8 @@ app.get('/', function (req, res) {
  * App listen.
  */
 
-app.listen(3000, function () {
+var port = process.env.PORT || 3000;
+app.listen(port, function () {
   var addr = app.address();
   console.log('   app listening on http://' + addr.address + ':' + addr.port);
 });
@@ -1,5 +1,9 @@
 {
     "name": "chat.io"
+  , "engines": {
+        "node": "0.6.12"
+      , "npm": "1.1.4"
+    }
   , "description": "example chat application with socket.io"
   , "version": "0.0.1"
   , "dependencies": {
@@ -7,5 +11,6 @@
       , "jade": "0.16.4"
       , "stylus": "0.19.0"
       , "nib": "0.2.0"
+      , "socket.io": "0.9.6"
     }
 }

試しにローカルで動かしてみる

npm install
foreman start (or node app.js)

foreman がなければ node app.js で。
http://localhost:5000 か 3000 を開けばチャットが開始されます。

heroku にデプロイしてみる

http://d.hatena.ne.jp/scalar/20120214/1329227856 を参考にしました。

git init
git add .
git commit -m 'first commit'

heroku create --stack cedar --buildpack http://github.com/heroku/heroku-buildpack-nodejs.git
git push heroku master
heroku open

上手く動いたら成功。
ローカルに比べて「Connecting to socket.io server」がちと長いかも。

いつまで立っても動かなかったり、エラーが出たら heroku logs を見てみる。

homebrew 管理していた node.js を nave に移す

heroku では公式にサポートしてる node.js のバージョンが 0.4.7 だったり node 自体のバージョンパップも激しいので、すぐ切り替えれるように nave で管理することにしました。

homebrew でインストールした node.js と npm の削除

(注)npm の削除には node.js が必要っぽいので必ず npm から削除しましょう

http://mochizblog.heroku.com/13を参考にしました。

npm uninstall npm -g
$ brew uninstall node

したところ、エラーが出たので、/usr/local/lib/node_modules/npm/uninstall.js を見てみると

    // uninstall .. should not delete /usr/local/lib/node_modules/..
    var p = path.join(path.resolve(nm), path.join("/", arg))

みたいなこと書いてあったので

var p = "/usr/local/lib/node_modules/'"

こんな感じに直接指定してみたら上手く消せました?(いいのかこれで(汗

nave を入れる

cd ~/lib
git clone http://github.com/isaacs/nave.git
cd ~/bin
ln -s ~/lib/nave/nave.sh nave

適当に ~/lib とか ~/bin とかに入れちゃいましたけど、多分 git clone する場所は ~/.nave が正しいお作法っぽいです。

zsh で nave を使う

http://koexuka.blogspot.jp/2012/04/zshnaveno-such-option-rcfile.html
手抜きすいませんorz

サイコロを二個振って一つ以上1になる確率

小学生かよ!!!というような問題ですが。
きっと僕が小学生のころは覚えてたんですが忘れてしまったので復習しますた!
というか skype で教えてもらったのでそのまま書きました!

最初1が出た場合(A)

最初1が出る確率は 1/6 ですね。こんぐらいは分かりますよね!?(必死)
次はなんでもいいので 6/6 になります。

よって最初1が出て、次はなんでもいい確率は 1/6 * 6/6 = 6 / 36 になりあす。

最初1以外が出た場合(B)

最初1以外が出る確率は 5/6 です。1が出なかったので次は1が出ないとだめです。
1が出る確率は 1/6 です。

よって最初1以外が出て、次に1が出る確率は 5/6 * 1/6 = 5 / 36 になります。

正直どこを掛けるのか足すかあまり分かってない

サイコロを二個振ってどちらかが1でるのは(A)と(B)の場合のみなので、この二つ足します


6 / 36 + 5 / 36 = 11 / 36

よって、「サイコロを二つ振ってどちらかが1になる確率は 11 / 36 である」(きりっ

引いて考えるという手もある

どちらかが1ではあるということは逆に言えば1(36/36)からどちらも1ではない確率を引いたものでもある。


両方1ではない確率は 5 / 6 * 5 / 6 = 25 / 35 になり 36 / 36 - 25 / 36 = 11 / 36 になる。

enchant.js 使ってみた

websocket が凄すぎるので(←遅い)javascript 始めてみました。
適当にどんな感じで開発してるか軽くメモっときます。


もっといい方法があれば教えてください!!

enchant.js

https://github.com/wise9/enchant.js/zipball/master


から落としてきて解凍。なかの examples/shooting/ を適当な作業ディレクトリにコピー
基本僕 Dropbox の下で作業してるので ~/Dropbox/work/js/test とかに移動。


中の index.html をダブルクリックしてシューティングが始まったら成功

cd ~/Dropbox/work/js/test
mv main.js main.old.js
touch main.js

新しい js ファイルを作って、サンプルのシューティングのソース(main.old.js)を見ながら色々弄るといいキガシマス!


http://9leap.net/
あとここにいけば、むちゃくちゃサンプルプログラムあるので大変助かります!


apache

iphone で実機確認が簡単に出来るとマンモスウレピーので mac 付属の apache を使ってみる。

sudo vim /etc/apache2/users/.conf

  • .conf

- Options Indexes MultiViews
+ Options Indexes MultiViews FollowSymLinks

プロジェクトファイルは Dropbox の以下にあるのでシンボリックリンクを貼るため設定を変更する。


あとプロジェクトファイルまでのパーミッションが全部 755 になってないとダメっぽいです。
僕の環境だと ~/Dropbox が 755 になってなかったので chmod 755 ~/Dropbox にしました。

cd ~/Sites
ln -s ~/Dropbox/work/js/test/ test


これで、上のメニュー > リンゴマーク > システム環境設定 > 共有 > Web共有 を on にする。
「パーソナル Web サイトフォルダを開く」の上に表示されている URL をクリック。


URL の末尾に /test を追加して表示されたら成功。
PC と同じアクセスポイントの wifi 接続した iPhone で URL を開いて表示できたら成功。

vim & ctags

恥ずかしながら今までタグジャンプ機能的なもの使用してませんでした( ;´。 `;)
こ、こんなに便利ならもっと早く使ってればよかった。。。

  • ~/.vimrc
nnoremap <C-[> :pop<CR>

brew update
brew install --use-gcc ctags
cd ~/Dropbox/work/js/test/
ctags -R

これで vim で main.old.js 開いて、適当なところで C-] を押すと定義の箇所にジャンプしてくれます。
C-[ でジャンプ前に戻ります。スゴイ!!


あと、ちょい vim でのインデントが微妙だったので適当の探してきたの使わせて頂きましたorz
http://d.hatena.ne.jp/h1mesuke/20100701/p1 を .vim/indent/javascript.vim に入れるとまぁまぁいい感じに。

tmux

全然 javascript と関係ないですが、いい機会なので自分のレガシーな部分を一新してみました。

brew install tmux

  • ~/.tmux.conf
unbind-key C-b
set-option -g prefix C-t
bind-key C-t send-prefix
unbind-key l
bind-key C-t last-window
unbind n
bind-key C-n next-window
unbind p
bind-key C-p previous-window
bind-key c new-window
bind-key q kill-server

set-window-option -g mode-key vi

javascript の repl 候補

javascript さっぱり分かんないんで、repl で色々試したいなーと思い調べてみました。

他にもオススメあれば教えててくだしあ>ω<b

Chrome Developer Tools

多分これが最強です。
現在作業中のページのタブにフォーカスを合わせて


右上のメニューボタン > ツール > デベロッパーツール をクリック。


Share photos on twitter with Twitpic


下の >= っぽいアイコンをクリックするとコンソールが立ち上がって色々入力できます。
自動補完もしてくれてむちゃ便利です。


あと、作業中のページの js 全てを読み込んだ状態になるので、普通にここで enchant.js のクラスを作ったり出来ます。

node.js

brew install node
node

これで repl が起動するので、文法とかの確認をターミナル上でさくっと行いたい場合は node を使うもいいかもしれません。

console.log() println 的なもの。chrome の Developer Tools でも使える
_ 直前に評価した値が代入される特殊変数

番外編

MongoDB のコンソールでも同じことが出来るらしいので、地獄のミサワっぽくカチャカチャカチャ...ッターン!すると相手に「こいつ、ただものではない」と思わすことが出来ます!!。。。とツイッターで聞きました!!

scala.swing の PartialFunction の合成っぽいのを Actor でやってみた

https://github.com/scala/scala/blob/master/docs/examples/swing/ButtonApp.scala#L16-L18
https://github.com/scala/scala/blob/master/src/swing/scala/swing/Reactions.scala#L19-L27


こんな感じに reactions に PartialFunction を足していく感じのを actor でも出来たら便利なんじゃないんだろうか?
色んなの reactions に足していけるし!みたいなことを思い付いたので実装してみました


http://d.hatena.ne.jp/yuroyoro/20100705/1278328898
http://www.ne.jp/asahi/hishidama/home/tech/scala/actor.html

を参考にさせて頂きました。

環境

scala 2.9.1

gist

とりあえず気になること

  • 10行目の reactions.reduceLeft { _ orElse _ } これはありかなしか。
  • もっといい方法はないでしょうか?というかどっかのライブラリでありそう!!