railsアプリの欠点のひとつはファイルのアップロードが大変なことでしょう。
そこで次のようなrakeを作って、rsyncをつかってサーバと同期するようにしました。
これでテストサーバにアップロードするのが簡単になります。
deployするときはcapistranoの方が楽そうですが、開発段階ではいちいちsvnにコミットせねばならず無駄にコミットを繰り返すことになってしまいます。
おそらくこちらの方がよいでしょう。
参考につくったrakeファイルを置いておきます。これを lib/tasksに入れておけばOK。
SERVER=”username@domain.name”
APP_DIR=”/path/to/merb/root/”namespace “rsync” do
desc “do rsync”
task :do do
sh “rsync -avz –delete –exclude ‘.pid’ –exclude ‘log/’ –exclude ‘.svn/’ –exclude ‘tmp/’ –exclude ‘*~’ –progress ./ #{SERVER}:#{APP_DIR}”
enddesc “test rsync”
task :test do
sh “rsync -avz –delete –exclude ‘.pid’ –exclude ‘log/’ –exclude ‘.svn/’ –exclude ‘tmp/’ –exclude ‘*~’ –progress –dry-run ./ #{SERVER}:#{APP_DIR}”
end
enddesc “alias do rsync”
task :rsync => “rsync:do”desc “reset merb”
task :restart do
sh “ssh #{SERVER} touch #{APP_DIR}tmp/restart.txt”
end
これを使うと merb restart で再起動(mod_rack使用時のみ)でき、merb rsyncでrsyncを実行、merb rsync:testでrsyncの内容を確認することができます。
実は口頭とtwitterではよく言ってるんだけど、iPhoneがビジネスになるかどうかは結構難しいよね。
という、話を書いている人がいたのでリンクを貼る。
単価を100円とすると1万本売れても100万円が1回入ってくるだけで、優秀な開発者を2名以上アサインすると開発費を捻出できない。(実際にペイしなかった)
たぶん一番の問題はここで、現状app storeにあがっているものは漫画とかの「コンテンツ」の扱いに近く、一度消費されたら二度消費されない。
つまり一回の収入で売り切りになってしまうわけ。
よく600万円売り上げたソフトがある?とか話題になるけど、それで企業のお金が回るようには思えない。恒常的にヒットが飛ばし続けられるのかという問題に結局はなってしまう。
ポイントはおそらくここ。
App Storeでは不可能だが、既にコンテンツを抱えていたり、ウェブサービスを展開している会社では、そちらでお金を稼ぎ、アプリは無料で公開するというビ ジネスモデルが可能。つまり、有償版のウェブサービスを契約しないとアプリは接続できないようにする。iPhone アプリは、なぜか通信は比較的自由にできるのでそれをフル活用すべし。
個人的にはIDを有料で売るような仕組みはありなんだろうなと思っている。どうやら利用規約で禁止されていたりはしないようなので、こういう形で月額課金を施すことは可能なのかと思う。
たとえば「機能限定版は無料で使えるけど、フル機能はIDを取得してアクティベートとできない」というのは原理的には可能な仕組みのはず。
ほかにもいろいろとアイディアはあるけど、儲けようとおもうならこうした仕組みは必要だろうなと思う。
確実に利益を出すには、コンテンツプロバイダーからの受託やコンサルかと思います。携帯の公式サイトを作りたがるコンテンツプロバイダーが多いように、iPhoneアプリを作りたいというコンテンツプロバイダーは一定数いると思います。
そう。だけどこの議論は、どんなことにも当てはまってしまうので、あまり新しい事実ではないんだよね。「何かをつくりたいけど、能力がないorつくることが本業でない」ひとから仕事を請けるというのは、いつの時代も安定的に収入につながる。たぶん中学生でもわかる。
個人的に思うのは、こういったものはiPhoneだけでなくfacebookのときもほとんど同じ現象が起きたのになということ。単純にfacebookが日本人にあまりなじみがないので日本だと表面化しなかったのかなぁ。
rockyouとかがfacebookでは有名ですが、あれがまわってる(か、どうか知らないけど)のはコンテンツ(ゲーム)を作るだけじゃなくて、人のを買ったりすることで安定的にコンテンツを提供し続けている点にある。
ジャンプはたくさん漫画が載っているわけだけど、漫画家が何年もヒットを飛ばすなんてことは考えにくいよね。あったとしてもレアすぎてそれを期待するのはナンセンス。
やはりビジネスとして定常的にまわそうと思うなら、コンテンツを流通させる部分にまわるのが正解なのかなぁとおもう。
デジタルコンテンツを流通させる方法が増えているのは事実で、facebookやiPhone, Android marketやらなんやらある。個人的に思うのは適切なコンテンツを集め、適切な流通路に流す。そういうことをするのがあの周辺のビジネスではうまくいくんじゃないかなと感じます。
もうひとつの可能性は、「コンテンツ」ではなく「サービス」を提供するようにすること。そして、「サービス」の提供に見合った課金方法を構築することかな。
前述のとおり月額課金することは、iPhone app store自身ではできないわけですが、技術的に実現することは可能です。
そして、ユーザに一定の「サービス」を提供することで毎月少しずつ売り上げる。きっとこういうモデルを確立する必要があるのだと思います。
「コンテンツ」と「サービス」は何が違うんだという話はありそうですが、それはまた別の話なのでまたの機会に。ただ、この二つを混同してビジネスを構築すると必ず破綻するだろうなと思います。そして、知っている範囲ではほとんどが「コンテンツ」として売られているような気がします。
さて、趣味でやってる俺見たいのとか個人の人は別として、企業でやろうとしてる人はちょっと考えてみてはいかがでしょうか?
http://www.snotr.com/video/1926
(http://twitter.com/shi3z/status/1042030674)
実は似たようなのは結構あったりしてテンションを刺激されるなーと思う。
processingという割と有名なツールがよく使われており、そこのページのexhibitionにたくさん例が載っています。
http://processing.org/exhibition/index.html
気に入ってるものをいくつか。
http://www.movingbrands.com/pages/home/responsive?casestudyid=147&flash=1
http://www.firstbornmultimedia.com/gallery/player.aspx?title=Digital%20Kitchen&stitle=Live%20Event&file=dk_fb&width=480&height=270
http://bricktable.wordpress.com/about/what-is-roots/
http://www.flickr.com/photos/shiffman/2124879919/
すごいといえば、違う意味ですごいのがこの動画。ファイルサイズ概要に小さい。
http://gigazine.net/index.php?/news/comments/20070423_fr041_debris/
メガデモとよばれるもので、むかーしはやってました。
重い重いといわれているeclipseですがこれで若干マシになりました。
JVMがいけないのもようです。
インストラクションどおりにsunのjvmに変えたらダイブマシになりました。
まぁなんでプログラミング10何年もやってて知らないんだって話しです。
冷静に考えると特に必要はなかった気もするんですが、実験のデータ加工をするプログラムをC++で書いてみました。
C++あまり使ったことなかったのですが、最近のプログラミング言語に比べて割と挙動が違うのでコツが必要だった。
ようは一番何が違うかというと、オブジェクトとそれを格納する変数の取り扱いが違う。
C++:
MyClass mc;
と書くと、たとえばjavaとかの場合mcにはnullが入っているわけですが、c++の場合暗黙にコンストラクタMyClass()が呼び出されて初期化されます。
どういう差かというとjavaの場合オブジェクト型を入れる変数は全部ポインタなんですね。だから宣言しただけだとnull(pointer)が入ってるわけです。
C++の場合普通に宣言すると、ちょうどCの構造体と同じ扱いになります。つまり基本的には「値」扱いみたいな感じになります。
なのでC++にはガーベッジコレクトがないわけですが、上のように宣言すると(mcの内部の話は別として)mc自体は破棄されます。
これを確認するのに一時間くらいテストコード書いてた・・・・
つまりは、C++で
C++:
MyClass * mc = new MyClass();
と書く場合がjavaのデフォルトで、ただし、ガーベッジコレクトがあるおかげで、なんか適当な感じにできてるわけです。
この辺はrubyとか、たぶんpythonも一緒。
で、問題はガーベッジコレクトがないところで、newなどで動的にメモリ確保をした場合が割りとめんどくさいのです。
たとえばつぎのようなクラスを作ったとします。このクラスはあまり設計的によろしくないような感じがします。
こういう風にした場合hogefunc()で作られたFooのメモリが開放されません。どっかでdeleteしないといけないんでしょうが、どこでやったものかという悩みが発生します。
ちなみにjavaとかだとまったく問題ないんだけども。
MyClassのデストラクタでやるとするとMyClassが破棄された時点でFooが消えるので、メモリの変なところへアクセスしたりしそうです。
一方で、(この場合は問題にならないですが)MyClassの外で消すと、MyClass内の処理で引っかかりそうです。
なんか適当に作ってしまったので、いまさら変更するのもなーと思って放置なんですが、どうやるのが美しいのかなぁ。
new使わずにやるのがよさそうかな。
けどその場合の帰り値はコピーコンストラクタとかが使われることになるのかな。解決できる問題ではあるんだけど、めんどくさいのとC++の流儀がどうなってるのかがひっかかってるはらじゅんでした。
まだ何もコメントすべきほど調べてはいないのだけど、メモ予定地としてこのエントリを作っておく。
ベンチマークは結構されていて次のサイトにまとまっているっぽい。
Lyme vs Lanp 21 Century Code Works
最近並列分散処理というようなことが流行っているので、この手のものはちょっと気になる。
hamlがあまりにも気持ち悪いので、erbで実装したのですが、そのコードを参考のために載せておきます。
動作が確認済。
index.html.erb
<table>
<%- @posts.each do |post| %>
<tr>
<td><%= post.title %></td>
<td><%= link_to "Show", url(:post,post) %></td>
<td><%= link_to "Edit", url(:edit_post,post) %>/td>
</tr>
<%- end %>
</table>
<%= link_to "New", url(:new_post) %>
new.html.erb
<%= error_messages_for :post %>
<%= form_for( @post, :action => url(:posts)) do %>
<%= partial :form %>
<p><%= submit "Create" %></p><% end =%>
<%= link_to 'Back', url(:posts) %>
show.html.erb
<p><%= @post.title %></p>
<p><%= @post.body %></p><br />
<hr /><h1>Comments</h1>
<p>
<%= partial "comments/show", :with => @post.comments.reverse, :as => :comment %>
</p>
<%= partial "comments/comment" %><%= link_to 'Edit', url(:edit_post, @post) %>
<%= link_to 'Back', url(:posts) %>
edit.html.erb
<%= error_messages_for :post %>
<%= form_for(@post, :action => url(:post, @post)) do %>
<%= partial :form %>
<p><%= submit "Update" %></p>
<% end =%>
<%= link_to "Show", url(:post, @post) %>
<%= link_to "Back", url(:posts) %>
_form.html.erb
<p>
<%= text_field :title %>
</p>
hogehoge
<p>
<%= text_area :body %>
</p>
_show.html.erb
<p><%= comment.name %></p>
<p><%= comment.body %></p>
_comment.html.erb
<p>
<%= error_messages_for :comment %>
</p><p>
<%= form_for(:comment, :action => "/posts/#{@post.id}/comments") do %>
<p><%= text_field :name, :name => "comment[name]" %></p>
<p><%= text_area :body %></p>
<p><%= submit "Comment" %></p>
<% end =%></p>
あまりにも情報がないのでまとめてみようかと。音声認識以外の用途でつかおうと思うとなかなかとっつきにくい。
以下は関連ライブラリなど
今回データとして音声以外を使うのでSOURCEFORMAT=USERと、HQuantあたりが鍵かなぁ?
音声認識などでよく使われるHMM(隠れマルコフモデル)を使うときに便利らしいHTK。
環境依存みたいですが、サンプルがそのままだと実行できないことがあります。
そういうときは次のフォルダを作って見てください。
hmms/
hmms/hmm.0
hmms/hmm.1
hmms/hmm.2
hmms/tmp
proto/
test/
こうするとなぜかできる。
実際軽くなるかどうかは不明だけど。
config/dependencies.rbに作ったmerbアプリケーションの依存しているライブラリが乗っています。
素朴にmerb-gen app hogeでやった場合こんな感じ。
# dependencies are generated using a strict version, don't forget to edit the dependency versions when upgrading.
merb_gems_version = "1.0.1"
dm_gems_version = "0.9.7"# For more information about each component, please read http://wiki.merbivore.com/faqs/merb_components
dependency "merb-action-args", merb_gems_version
dependency "merb-assets", merb_gems_version
dependency "merb-cache", merb_gems_version
dependency "merb-helpers", merb_gems_version
dependency "merb-mailer", merb_gems_version
dependency "merb-slices", merb_gems_version
dependency "merb-auth-core", merb_gems_version
dependency "merb-auth-more", merb_gems_version
dependency "merb-auth-slice-password", merb_gems_version
dependency "merb-param-protection", merb_gems_version
dependency "merb-exceptions", merb_gems_versiondependency "dm-core", dm_gems_version
dependency "dm-aggregates", dm_gems_version
dependency "dm-migrations", dm_gems_version
dependency "dm-timestamps", dm_gems_version
dependency "dm-types", dm_gems_version
dependency "dm-validations", dm_gems_version
非常にたくさんのモジュールが呼ばれています。明らかにcacheとか今使ってないのでそういうのをコメントアウトするとより軽くなるのかなぁと妄想しているところです。