0

炊き込みご飯

炊き込みご飯

  • といだ米3合
  • 醤油30ml
  • 酒 + みりん 計20ml
  • 砂糖大さじ1
  • 適当な具
を用意してまぜる。具はしいたけ・人参・エリンギ・鶏肉にした。

米は研いだ後に水を切った方が味がしみやすいらしい。

炊飯器に全部入れて、3合のラインまで適当なだし汁を入れて炊く。
今回は具に乾燥しいたけを使ったので、乾燥しいたけを戻した時の汁と、味噌汁用の昆布+にぼしだしを混ぜた奴をだしに使った。


3合ぴったりラインだと少し固めに炊き上がる。

炊き込みご飯

1

Node.jsに入門して画像チャットを作ってHerokuで動かした

増井研の合宿があった。

スケジュールに飲み会の時間が書いてなかったので、もしやと思ったら最初からずっと飲んでた。

夕方にgeta6がNode.jsを1時間ぐらいでみんなに教えてくれた。Express+Socket.IOを使って簡単なチャット一歩手前ぐらいのもの。
そこから改造してちくわぶチャットができた。


Tiqav Chat

TiqavのJSONP API使った。
コードはgithubにある


Heroku

デプロイ先のHerokuだけど、よく有料サービスと勘違いされてるけどDBとかを多めに使わない限り無料で使えます。
とくにSinatraやNode.jsに少量のMemcached/MongoDB/PostgreSQLなら無料で使える。俺もまだ金払ったこと無い。

Herokuはレンタルサーバーみたいにパソコンをまるごと借りるんじゃなくて、ソースコードをgitでアップロードすると実行してくれるサービスだよという話も合宿で説明したりした。


Node.jsとnpmインストール

nodeと、nodeのパッケージマネージャをインストールする
brew install nodejs
node -v
curl http://npmjs.org/install.sh | sh
npm -v
MacのLionとHomebrewだと、nodeはv0.6.19が入った。npmもHomebrewにパッケージがあるけどinstallしようとするとnpmjs.org/install.shを使えと言われる。npmは1.1.32が入った。

UbuntuのaptとかSnow Leopardの人とかmacportsの人はバージョンが違うのが入るのがあった。
Node.js 0.7以上のとか使ってる人は後でpackage.jsonのエラーがでたりしてた。
npmも0.2とかが入ったりする人がいたけど、npmjs.org/install.shから入れたらどうにかなってた。


Expressでプロジェクトを作る

WebアプリケーションフレームワークのExpressを使う。
npm install -g express
npm list -g
-gを付けるとglobal(/usr/local/lib/node_modules)にインストールされる。
付けないとカレントディレクトリにnode_modulesというディレクトリが生成される。

mkdir -p ~/src/nodejs
cd ~/src/nodejs
express tiqav-chat
tiqav-chatディレクトリが生成されて、中にMVCフレームワークらしいディレクトリ構成ができる。

cd tiqav-chat
npm install
npmでパッケージ名を指定せずinstallした場合、カレントディレクトリのpackage.jsonの中を見て必要なパッケージがインストールされる。
Rubyのbundlerみたいな機能。


Node起動

node app.js
http://localhost:3000で起動する。


Socket.IOとは

WebSocketやcommetやAjax pollingの中から適当に使える物で接続してくれるすごいライブラリ。


Socket.IOでチャットアプリを作る

インストールする。
npm install socket.io


Expressでテンプレ作った直後と、チャット実装した後との差分を見るとわかりやすい。
implemented chat with socket.io · 1b0edb8 · shokai/tiqav-chat


こういうチャットができる。ブラウザを2つ起動してみると両方で動いている。

app.jsにsocket.ioを読み込んで、on connectionとon postイベントを登録した。
サーバー側はこれだけ。

クライアント側は、まずpublic/javascripts/にjquery置いた。
views/index.jadeにinputタグでボタン作って、views/layout.jadeでsocket.io.js読み込んだ。
で、public/javascripts/main.jsでinputタグのボタンが押された時に、socket.ioのpostイベントにemitでチャットの本文を送りつけるようにした。
あとmain.jsのio.connect(‘http://localhost:3000’)の部分、引数にURL書いてるけど引数無しの方がいい。

動作確認してから、最後にpackage.jsonのdependenciesにsocket.ioを追加した。


Herokuサインアップ

http://www.heroku.com/でサインアップして、メールが来るのでconfirmする。


コマンド入れる
gem install heroku
heroku login
sshの公開鍵がアップロードされて認証される。


NodeアプリをHeroku用に修正する

これが参考になる Getting Started with Node.js | Heroku Dev Center

上で実装したchatアプリをHerokuで動かせるように修正するまでの差分を見るとわかりやすい Comparing 1b0edb8b0fb354b4ea0f0454ae199285cf436455…08a9184e7061bfcfdf061459857e6aead8bfad0d · shokai/tiqav-chat


app.jsのapp.listenを
app.listen(process.env.PORT || 5000, function(){
に修正する。Herokuは起動するプロセスのportは環境変数で指定されるので。


Procfile というファイルを作って、中身にapp.jsを起動する設定を書く
web: node app.js


app.jsを修正する。
HerokuのNode.jsではまだWebSocketが使えないので、ajax pollingだけ使うようにする。
Using Socket.IO with Node.js on Heroku | Heroku Dev Center
io.configure(function(){
io.set('transports', ['xhr-polling']);
io.set('polling duration', 10);
});


package.jsonのenginesにnode0.6系を使うように指定する。
socket.ioもdependenciesに入れておく。


ちゃんと動くか確かめる。foremanから起動する
foreman start
今度は3000じゃなく http://localhost:5000で起動する。


Herokuにデプロイ

するためにgit commitしておく
git init

.gitignore を作って、node_modulesディレクトリ下をcommitしないようにする
node_modules

git add ./
git commit -m 'implemented chat with node.js+socket.io'


Herokuにアプリ登録する
heroku create --stack cedar
これでgit remoteにherokuが登録される


deploy
git push heroku master
heroku open
もうHerokuで動いてるはず。


アプリ名はrenameできる
heroku apps:rename 好きな名前

0

HerokuでSinatra+Memcached使う

Memcached使ってみたかった。なんかキャッシュしなきゃならんので
ブラウザ <---> Heroku <---(cache)---> Twitter
なものを作った。

できたもの http://twiticon.herokuapp.com/

twitterのユーザーアイコンをHTMLに簡単に貼れるやつ。ソースコードはここ

こういうHTMLでアイコンがでる。
<img src="http://twiticon.herokuapp.com/shokai">


小さいのや大きいのも貼れる。

テキストや http://twiticon.herokuapp.com/shokai.txt
JSONでも取得できる http://twiticon.herokuapp.com/shokai.json


使い方は http://twiticon.herokuapp.com に詳しく書いてある。


Twitterのアイコン

ここにAPIがある
GET users/profile_image/:screen_name | Twitter Developers
ユーザーが新しいアイコンをアップロードする毎にURLが変わる。
例えば今の俺のアイコンは https://si0.twimg.com/profile_images/2328443341/tmp_normal.png になってる。


Memcached

ふつうのSQL DBみたいにHDDにデータは保存しないけど、メモリ上で高速に動作する。
あとExpireする期限を決めれる。今回は保存したアイコンURLは12時間で消滅するようにした。
12時間1秒経過すると、再度Twitter APIを使ってURLを取りに行く。


Herokuでmemcached使う

Memcache | Heroku Dev Centerにドキュメントがある。
Herokuのmemcachedはユーザー名とパスワードによる認証があって、SASLというプロトコルを使っているので対応しているgemじゃないと使えない。
dalliというpure rubyのgemが推奨されている。

いつも使ってるCで書かれてるmemcached gemはSASLサポートしてるって記述があるんだけど、使い方がドキュメントに書いてないし面倒臭くなってdalliに落ち着いた。


Herokuにmemcached addon追加した。無料だけどクレジットカード番号登録しないと使わせてもらえない。
% heroku create --stack cedar
% heroku addons:add memcache:5mb


パスワードとかは
% heroku config
で見れる。
MEMCACHE_PASSWORD, MEMCACHE_SERVERS, MEMCACHE_USERNAMEがそれ。
これがHerokuで動かしてるアプリの環境変数に入るので、ENV[‘MEMCACHE_SERVERS’]とかで取り出す。


dalliでMemcached使う

認証なし
require 'rubygems'
require 'dalli'
cache = Dalli::Client.new 'localhost:11211'

Heroku用
cache = Dalli::Client.new ENV['MEMCACHE_SERVERS'], {:username => ENV['MEMCACHE_USERNAME'], :password => ENV['MEMCACHE_PASSWORD']}


で、あとはcacheにset/getすればよい。
# cache 1 hour
cache.set('icon_shokai', 'https://si0.twimg.com/profile_images/2328443341/tmp_normal.png', 3600)

# get icon
puts cache.get('icon_shokai')


ちなみにHerokuのmemcachedは自分のローカル環境からも接続できる。
addons:add memcachedしたらすぐに起動するので、手元で開発してるプログラムで
cache = Dalli::Client.new 'xxxxx.ec2.northscale.net', {:username => '123456heroku.com', :password => 'asdf122345hujiko'}
とか書いても動かせる。太平洋横断してるから遅いけど。


ローカル開発環境にMemcachedをインストール

homebrewやapt-getでインストールできる。
% brew install memcached
% memcached -vv -p 11211
これでlocalhost:11211で起動する。


SinatraでMemcachedを使う

ふつうに上に書いたのを組み合わせてredirectするだけなのでgithub見ればわかると思う。
https://github.com/shokai/twiticon


controllerでは
redirect icon user, size
とだけ書いて、iconって関数は適当にキャッシュもしてくれるように書かれている


あと開発時はローカルのlocalhost:11211のmemcachedを見て欲しいので、環境変数が無かったらconfig.ymlから同じ値を探すようにしたらはかどった。


感想

memcache無料の5MBぐらいだと、tmp_cache gem使ったほうが設定もいらないし楽なのでは・・・

0

gitの各コマンドの使用回数

2010年8月〜現在までのログから

history -E 1 | grep git | ruby -lane 'a=$_.split(/\s+/) rescue next; next unless a[3] == "git"; puts a[5] =~ /^-.+/ ? "#{a[4]} #{a[5]}" : a[4]' | sort | uniq -c | sort -n -r
Ruby1.9.2でやったら invalid byte sequence in UTF-8 (ArgumentError) が出たので1.8.7使った。


gitは難しい、1文字違いで間違えてるの多い
8320 status
3443 add
3425 diff
2244 commit -m
2123 push
629 log
563 add -p
530 branch
524 checkout
360 pull
323 mv
194 commit --amend
185 remote
135 ls-files
120 init
114 clone
110 rm
103 merge
79 grep
63 add -f
49 tag
41 tag -a
33 reset
31 rm --cache
24 cherry-pick
22 checkout -b
21 branch -d
19 log --oneline
18 stta
18 reset --hard
18 dif
14 stat
12 sta
12 log --help
12 idff
10 commit --ammend
8 rm -r
7 tag -m
7 show
7 satt
6 tag -d
6 sat
6 nil
6 log --branches
6 difff
6 commmit -m
5 rm -f
5 instaweb --httpd=thin
5 fetch
4 tag -v
4 rm -rf
4 mv -f
4 ls
4 commit -amend
3 tags
3 instaweb --httpd=webrick
3 config --global
3 commit -ammend
3 commit
3 branch -D
3 -v
3 --version
3 --help
2 tat
2 tag --help
2 sttat
2 statt
2 search
2 reset --head
2 mv -r
2 mv -R
2 mv --cache
2 log --tags
2 log --merges
2 log --branche
2 instaweb --httpd=webric
2 instaweb
2 ini
2 diff -HEAD
2 diff --HEAD
2 dad
2 commit-
2 comit -m
2 chekcout
2 cat
2 branches
1 vm
1 tree
1 tav -a
1 tag -l
1 statq
1 statp
1 stata
1 stash
1 staat
1 server
1 rmeote
1 rm -R
1 rm --cached
1 reset --soft
1 remoteush
1 ranch
1 puh
1 mv -n
1 mori
1 ls-tree
1 ls-file
1 ls --cache
1 log -simple
1 log -oneline
1 log -o
1 log -m
1 log --tree
1 log --tags=v
1 log --tags=^v
1 log --simple
1 log --o
1 log --left-right
1 log --follow
1 log --commit
1 log --comment
1 log --all
1 log --a
1 lod
1 list
1 lgo
1 instaweb --httpd=mongrel
1 init --help
1 iinit
1 iff
1 git
1 filelist
1 file-list
1 diff -p
1 didf
1 dfiff
1 dfif
1 dff
1 cvsserver
1 cp
1 config
1 commit --
1 comimt -m
1 co
1 cloen
1 checktou
1 checkout -f
1 checkout --cache
1 checkoub -b
1 chckout
1 brandh -d
1 branch -b
1 branc
1 brach
1 bracch
1 bnrach
1 barnch
1 ammend
1 addd
1 add -@
1 ad
1 aad
1 --f
1 --cached
1 *

1

Ruby1.9のEncodeでUTF-8-MACをUTF-8に変換できた

Macで「ぱぴぷぺぽ」等のファイル名があると「ぱÿぴÿぷÿぺÿぽÿ」みたいな変な文字になる問題について。

UTF-8-MACをUTF-8に変換するではMacのiconvで変換したけど、
Mac以外で動かすにはApple製iconvを自前ビルドしなければならなくて、でもgccでコンパイル通らなかったので困ってた。

Ruby1.9以降のEncodeを使ったら解決した。