php5.4のphp_memcache.dllの場所

5.4の環境を作りたくてxamppを入れ直した時にmemcacheが使えなかったのでメモしておきます。 ちなみに環境はWindows7 64Bitです。

5.3で使っていたphp_memcache.dllをコピーして使おうとしたところ、apacheの起動時に以下の様なエラーが出ました。

PHP Startup: memcache: Unable t initialize module. Module compiled with module API=20090626 PHP compiled with module api=20100525 These options need to match

調べたところStackOverflowで話題が出ていて助かりました。リンク先によると以下にあるよ、とのこと。

http://windows.php.net/downloads/pecl/snaps/memcache/3.0.6/

ts版とnts版はスレッドセーフか、そうでないかの違いです。 ぼくはts版を使いました。

後はphp/extフォルダにダウンロードしたphp_memcache.dllをコピーして、php.iniに以下の記述を追加すれば使えるはずです。

extension=php_memcache.dll

Textileをhtmlにリアルタイムに変換するツールを作りました

はてなブログで記事を編集するときに、プレビューボタンをクリックしないと内容が確認できないことが苦痛でした。やっぱ編集するときはテキストエリアに限りますよね。そこで何か良いツールはないかと探してみたところ、invisible.js というオープンソースのライブラリを発見。

ぼくはRedmineのTextile記法に慣れているので、是非使わせてもらおうということで、リアルタイムにTextileをhtmlにコンバートしてくれるツールを作りました。

TextileConv

f:id:asanoboy:20121016214030p:plain

トップのテキストエリアに入力した文字が、下部のエリアにHTMLテキストと、プレビューとして表示されます。ライブラリ側で対応しているMarkdown、wiki記法でも使えます。

作ってから見つけてしまったんですが、似たようなこと出来るサイトすでにいくつかあります、、汗

Markdown Live Editor

Live Textile JS Preview

Markdown Live Preview

まぁ折角作ったんだし日の目を見させてやろうかということで公開しておきます。気に入った方がいれば使ってやってください。

謝辞

invisible.js 作者の@opaken さん、この場で拝借させていただいたお礼をさせていただきます。どうもありがとうございました。

redmine2.0.1のherokuへの移行を断念するまで

さくらVPSで回していたredmineをherokuに移行させたら安くつくんじゃないかと思い、試してみました。結果問題が発覚して断念しましたので、その経緯をまとめておこうと思います。

 

db:push

まずherokuにアプリケーションを作成して、postgresqlアドオンを追加します。

# heroku create asanoboy-redmine
# heroku addons:add heroku-postgresql:dev
Adding heroku-postgresql:dev on asanoboy-redmine... done, v2 (free)
Attached as HEROKU_POSTGRESQL_AQUA_URL
Database has been created and is available
Use `heroku addons:docs heroku-postgresql:dev` to view documentation.

これでHEROKU_POSTGRESQL_AQUA_URLという環境変数PostgreSQLのURLが設定されました、heroku configで中身を確認可能です。これをpg:promoteします。

heroku pg:promote HEROKU_POSTGRESQL_AQUA_URL

次にさくらVPSのmysql上にあるデータをherokuのDBにコピーしますが、Ruby1.9.2のtapsを使わないと、heroku db:push したときに以下のエラーが出てうまくいきません。

Taps Server Error: PGError: ERROR: time zone displacement out of range:

以下がdb:pushまで

rvm use 1.9.2
gem install taps sqlite3 mysql
heroku db:push mysql://[username]:[password]@localhost/db_redmine --app asanoboy-redmine

アップロードの確認のため、アプリ名の再入力を求められるので、入力すればアップロードがスタートします。

users:         100% |==========================================| Time: 00:00:00
versions:      100% |==========================================| Time: 00:00:00
watchers:      100% |==========================================| Time: 00:00:00
wiki_content_: 100% |==========================================| Time: 00:00:00
wiki_contents: 100% |==========================================| Time: 00:00:00
wiki_pages:    100% |==========================================| Time: 00:00:00
wiki_redirect: 100% |==========================================| Time: 00:00:00
wikis:         100% |==========================================| Time: 00:00:00
workflows:     100% |==========================================| Time: 00:00:00
Resetting sequences
#

ここまで終了。

redmineのデプロイ

githubから落としてきたredmineではGemfile.lockが.gitignoreに含まれているので、外しておきます。

またGemfile内にsqlite3の記述をコメントアウトしておきます。 herokuではインストールできません。

  • Gemfile
#  group :sqlite do
#    gem "sqlite3"
#  end

Gemfile.lockを新しくしておきます。

# bundle install

次にconfig/enbironment.rbのexit 1をコメントアウトします。これは以下のソースを参考にしました。これしないとheroku側に怒られて、デプロイ後アプリがクラッシュします。

http://stackoverflow.com/questions/11444170/redmine-deploy-on-heroku-cedar

準備が出来たのでgit pushします。

# git add .
# git commit -m "hoge"
# git push heroku master:master
# heroku run rake assets:precompile
-----> Preparing app for Rails asset pipeline

辺りで何かエラーをはいてうまくいかない場合は、以下の記事を参考にprecompileの設定を追加して再度pushしてください。

http://codenote.net/heroku/1050.html

  • config/application.rb
config.assets.initialize_on_precompile = false

 

これでredmineがherokuで動き始めます。

が、アクセスしようとするとInternal Errorでredmineがうまく見れません。

ログを見るとsecret_token.rbがどうたら、で怒られます。

断念した理由

herokuではローカルディレクトリへのファイル書き込み権限はアプリケーション側にはありません。以下はredmineの.gitignoreですが、

https://github.com/edavis10/redmine/blob/master/.gitignore

secret_token.rb、session_store.rbなどはredmineが書き出すファイルで、herokuに持っていくなら予め別環境で作ってデプロイしないといけません。

redmineの中身まで掘り下げるのはコストは割に合わないと思い、断念しました。

 

この辺りのherokuとredmineの相性が改善される日まで、さくらVPSでいいやということになりました。それでも十分安いですからね。

javascriptで音を出す

javascriptで波形を作ってバッファーに突っ込み音を出す際の注意事項。

まずjavascriptにはいろんな音の出し方があるんだよというのが、以下にうまくまとまっている。

つまみ食う

次にjavascriptで音を扱えるようになるとどんなことが出来るようになるの?というのは以下のサンプルを見るとわかりやすい。

強火で進め

これらを踏まえた上で、実装する上での注意点をまとめる。

Chrome: WebAudioAPI

以下をDeveloperToolsのコンソールにコピペして実行すれば音がなる。

(function(){
	var cnt = 0, length = 2048;
	var ctx = new webkitAudioContext();
	var node = ctx['createJavaScriptNode'](length, 1, 2);
	node['onaudioprocess'] = function(e){
		var data0 = e['outputBuffer']['getChannelData'](0), 
			data1 = e['outputBuffer']['getChannelData'](1);
		
		var val;
		for( var i=0; i<length; i++ ){
			val = Math.sin(cnt++/10)
			data0[i] = val;
			data1[i] = val;
		}
	}
	node['connect'](ctx['destination']);
})();
  • コールバック関数(onaudioprocess)が適当なタイミング呼ばれるので、javascript側では波形を生成することに専念できる。実装が楽。
  • onaudioprocessはなぜかalert関数で処理をブロックした状態でも呼ばれている。どうなっているのか謎。
  • 上記nodeを作ってしばらく放っていると、CPU使用率が20%台でずっと推移することがある(Win7,64bit/Chrome18)
  • sampleRateをセットできないため、デフォルトの48000に波形もあわせなければいけない。
  • 上記サンプルにはないが、周波数フィルタリング機能などもありちょっとしたシンセサイザーなどをサクッと作れそう。

FireFox: AudioDataAPI

以下をFirebugのコンソールにコピペして実行すれば音がなる。

(function(){
	var cnt = 0, 
		buffersize = 24000, 
		maxBuffersize=8192,
		currentWritePosition = 0, 
		totaltail, tail, written;
	var audio = new Audio();
	audio['mozSetup'](2, 48000);
	setInterval(function(){
		if( tail ){
			totaltail+=tail.length;
			written = audio['mozWriteAudio'](tail);
			currentWritePosition += written;
			tail = null
		}
		var available = audio['mozCurrentSampleOffset']() + buffersize - currentWritePosition;

		if( available>0 ){
			var readLength = available>=maxBuffersize ? maxBuffersize : available;
			var soundData = new Float32Array(readLength);
			for( i=0; i<readLength; i+=2 ){
				var v = Math.sin(cnt++/10);
				soundData[i] = v;
				soundData[i+1] = v;
			}
			written = audio['mozWriteAudio'](soundData);
			if( written < readLength ){
				tail = soundData.subarray(written);
			}
			currentWritePosition += written;
		}
		
	}, 50);
})();
  • WebAudioAPIと比べるとコードの量が多くなっているし、チューニングするべきパラメータの数が多い。
  • setTimeoutで好きなときにバッファーをセットできるのが良いのかもしれないが、どっちかというと不便。
  • CPU使用率問題や、sampleRate問題はないのでその点は素性が良い。

まとめ

WebAudioAPIもAudioDataAPIも発展途上で、クロスブラウザでの実装を考慮に入れるとお互いが足を引っ張り合ってしまう。早く仕様の統一される日が来てほしいが、FileAPIとかWebSocketの方が目を引く話題だし後回しにされそうな予感がする。うーん、切ないなぁ、、

IEは仕様が統一されてしばらくたってから実装するとか、たぶん石橋たたいて渡ってくるんだろう。

facebookアプリのheroku上への構築手順と、開発言語の検討

facebookアプリをherokuに構築するのが恐ろしく簡単だったメモ。ついでにheroku上でfacebookアプリを作るなら何で作ればよさそうかも載せておいた。

前準備としてherokuのアカウントを取得しておく。

facebookのdeveloperページからherokuにアプリを設置

https://developers.facebook.com/からログインして、「新しいアプリケーションを作成」からアプリを作成する。すると作成したアプリの基本設定画面に遷移する。画面中段に以下の表示。

f:id:asanoboy:20120201003358j:plain

そのままGet Startedで進む。

f:id:asanoboy:20120201003756j:plain

今の環境だとherokuしか選択できないようなので、Next!

f:id:asanoboy:20120201004348j:plain

次に言語環境(現状はPHP、Node.js、PythonRuby)とherokuのID(E-mail アドレス)を入力して「作成」に進む。

f:id:asanoboy:20120201004549j:plain

数秒の間があって、Successページが表示される。Go to appを押すとherokuで作成されたページが表示される。

ちなみにすべての環境で試したところ、PHP、Node.jsの場合はアプリのインストールページにリダイレクトされるのだが、PythonRubyの場合は以下のようなデフォルトの静的ページが表示されるだけっぽい。

f:id:asanoboy:20120201011444j:plain

この辺りはPHPerに優しいfacebookに譲歩したherokuってことなのかな。っていうか、herokuのドキュメントはPHPの開発について全く触れられてないんだが、どうなってるんだろ?

せっかくなのでherokuにどんなアプリがデフォルトでデプロイされたか見てみる。ソースコードの取得はherokuの管理ページからアプリのGitリポジトリの場所を確認して

$ git clone git@heroku.com:hoge-hoge-1234.git

とかすればよい。

PHP

どうやらルートディレクトリのindex.phpがエントリポイントになっているみたい。httpのレスポンスヘッダー見るとApacheがheroku上で動いている様子。なるほどね。

Apacheのドキュメントルートでしか開発できないとなると制約が出てきて使いづらそう。今後の展開に期待しつつ、当面はPHPは保留だな。

python

チェックアウトしたrequirements.txtを見る。

Flask==0.7.2
Jinja2==2.6
Werkzeug==0.7.1
simplejson==2.2.1
wsgiref==0.1.2

とある。次にexampleapp.py

FBAPI_APP_ID = os.environ.get('FACEBOOK_APP_ID')

お、環境変数facebookのapp_idが設定済み?すごい!他にもいろいろfacebook APIがらみの関数が定義してあるので何かと使えそう。とはいえドキュメントが見当たらないので、当面は通信部分も含めて実装する必要がある。

Node.js

当面使う予定はなかったけれど一応見てみた。というのもfacebook公式SDKのうちheroku上でまともに動かせそうなのが、PHPJavascriptしかない。heroku上のPHP開発運用は不明点もあるので、もしかしてNode.jsが一番環境整っているのかもと思ったため。

というわけでpackage.jsonを見てみる。

{
  "name":        "facebook-template-node",
  "version":     "0.0.1",
  "description": "Template app for Heroku / Facebook integration, Node.js language",
  "dependencies": {
    "ejs": "0.4.3",
    "everyauth": "0.2.18",
    "express": "2.4.6",
    "facebook-client": "1.3.0",
    "facebook": "0.0.3",
    "node-uuid": "1.2.0",
    "socket.io": "0.8.4"
  }
}

おー、facebookSDKっぽいものが入ってる。これはもうNode.js時代が幕を開けているといっても過言ではないな。Pythonでやろうと思っていたが、これはNode.jsでやったほうが楽そうだ。

RubyはたぶんPythonと同じ扱いだろうということで割愛。以上。