2012/09/21

vimで保存するときにマジックコメントを埋め込む

最近ちまちまと.vimrcを再構築している @pinzolo です。

Ruby1.9+Railsで開発しているとちょくちょくやらかすのがのがエンコーディングの指定忘れ。 rails gで作られるファイルはマジックコメントがないので日本語入力して実行したらエラーになるわけですな。

んで世のエンジニアはそれをどう解決するかというのを調べてみた。

  1. ショートカットで先頭にマジックコメントを埋め込む
  2. magic-commentermagic-encodingのようなツールで一括付与

というのが結構多かった。 でも、1.は忘れることがあるし、2.はジェネレートするたびに行うのはめんどくさい。 じゃあどうするのが一番いいかと考えたら、保存時に追加されるのが一番だと思った。

エディタで保存を実行しないファイルは編集をしないのだからマジックコメントなくても問題無いわけだ。

class HogeHelper
end

こんなファイルはマジックコメントをいちいち付けなくていいや。というスタンスです。 というわけで、.vimrcに保存時にマジックコメントを追加する処理を書いてみた。

vimscriptなんて今までろくに書いたことがなかったからなかなか大変だった。以下、気にしたポイント。

  • 対象とするのは ruby, ERB, Haml の三種類。
  • ruby の場合は shebang の存在も考慮する。
  • すでにマジックコメントが存在する場合は付与しない。
  • マジックコメントは 1 行目。shebang があるときは 2 行目。
  • マジックコメントの形式は emacs 形式にしようか迷ったけど、自分の環境では vim しか使わないからまあいいや。

ソースコードは間違ってないと思うのだけど、いざ保存すると必ず E488 エラーがでる。
正直なんでかわからん。有識者の方々教えてください。
動作に影響はないからとりあえずこのままにしてる。エラーメッセージがうざかったらとりあえず :silent! つければいいや。

とまあ、微妙に不完全なシロモノですがよければお試しください。

2012/08/09

初めてのたいむまっすぃーん

MacBook Air を購入してしばらくたったが、非常に快適に使用している。
いろいろと仕事に開発に使用する以上、当然バックアップが必要なわけで、遅まきながら TimeMachine を初めて使ってみた。
当然ながら外部メディアがないとどうしようもないので、ヨドバシで使えそうなのを購入。
安かったのとシルバーがあったので、ヨドバシ.com - 東芝 HDTC610JS3A1 [USB3.0接続 ポータブルハードディスク 1TB シルバー]【無料配達】を購入した。
ヨドバシのオンラインだと、11800とかだけど実店舗だと10,000円未満だったですわ。

あとはつないでポチポチポチだった。楽ちん

ただ繋いだら

こんなのが出てきたので、「バックアップディスクとして使用」をクリック。

そしたらこんなのが出てくるので、バッサリと消去。

そしたらもう TimeMachine の設定終わっちゃってさ。

ちょいとしたらバックアップ始まってやがんの。

んで、そのままバックアップ完了よ。簡単でしょ。

Windows も最近はバックアップ(復元ポイントとか)が簡単になってるけど、Mac も簡単なのね。
正直このレベルならどちらも個人的には差がないので甲乙付けられないけど、バックアップと復元が手軽なのはいいね。
願わくばバックアップを使うことがありませんように・・・

2012/06/22

さくら VPS の Ubuntu Server 10.04 に SSL 環境を設定

Ubuntu 10.04 Serverの設定メモ を参考に Redmine を SSL 環境に移行した。
# 鍵作成時の入力の手間を省く
pinzolo@mkt-sys:~$ sudo vim /usr/lib/ssl/misc/CA.sh
- DAYS="-days 365" # 1 year - CADAYS="-days 1095" # 3 years + DAYS="-days 3650" # 10 year + CADAYS="-days 7300" # 20 years
# 鍵作成時の入力の手間を省く pinzolo@mkt-sys:~$ sudo vim /etc/ssl/openssl.cnf
- default_days = 365 # how long to certify for - default_crl_days= 30 # how long before next CRL + default_days = 3650 # how long to certify for + default_crl_days= 7300 # how long before next CRL - countryName_default = AU + countryName_default = JP - stateOrProvinceName_default = Some-State + stateOrProvinceName_default = Kanagawa - 0.organizationName_default = Internet Widgits Pty Ltd + 0.organizationName_default = mkt-sys.jp - basicConstraints = CA:FALSE + basicConstraints = CA:TRUE
# 自己認証局(CA)用に複写して編集 pinzolo@mkt-sys:~$ sudo cp /etc/ssl/openssl.cnf /etc/ssl/openssl_server.cnf pinzolo@mkt-sys:~$ sudo vim /etc/ssl/openssl_server.cnf
- basicConstraints = CA:TRUE + basicConstraints = CA:FALSE - # nsCertType = server + nsCertType = server
# 秘密鍵の作成(このサーバー用にパスワードを考える) pinzolo@mkt-sys:~$ sudo openssl genrsa -des3 -out mkt-sys.key 1024 # 要求証明書(CSR)を作成(本来このCSRを認証局に送って署名してもらう) pinzolo@mkt-sys:~$ sudo openssl req -new -days 3650 -key mkt-sys.key -out csr-mkt-sys.pem # 自分で認証局(CA)を立てて署名するため、CAの構築(CA用のパスワードを考える) pinzolo@mkt-sys:~$ sudo /usr/lib/ssl/misc/CA.sh -newca # CSRに署名をして証明ファイルを作成 pinzolo@mkt-sys:~$ sudo openssl ca -config /etc/ssl/openssl_server.cnf -in csr-mkt-sys.pem -keyfile demoCA/private/cakey.pem -cert demoCA/cacert.pem -out ssl-cert-mkt-sys.pem # エラーが発生した場合 index.txt を空にして再実行 pinzolo@mkt-sys:~$ sudo rm demoCA/index.txt pinzolo@mkt-sys:~$ sudo touch demoCA/index.txt pinzolo@mkt-sys:~$ sudo openssl ca -config /etc/ssl/openssl_server.cnf -in csr-mkt-sys.pem -keyfile demoCA/private/cakey.pem -cert demoCA/cacert.pem -out ssl-cert-mkt-sys.pem # 秘密鍵のパスワードを解除する(サーバー用パスワードを使用) pinzolo@mkt-sys:~$ sudo openssl rsa -in mkt-sys.key -out ssl-cert-mkt-sys.key # permission 変更 pinzolo@mkt-sys:~$ sudo chmod 640 ssl-cert-mkt-sys.* # グループの変更(owner は root のまま) pinzolo@mkt-sys:~$ sudo chgrp ssl-cert ssl-cert-mkt-sys.* # 解除した秘密鍵と証明書を適当なフォルダに格納 pinzolo@mkt-sys:~$ sudo mkdir /etc/apache2/cert pinzolo@mkt-sys:~$ sudo cp ssl-cert-mkt-sys.* /etc/apache2/cert/ pinzolo@mkt-sys:~$ sudo ln -s /etc/apache2/mods-available/ssl.conf /etc/apache2/mods-enabled/ssl.conf pinzolo@mkt-sys:~$ sudo ln -s /etc/apache2/mods-available/ssl.load /etc/apache2/mods-enabled/ssl.load # 鍵ファイル情報を追加 pinzolo@mkt-sys:~$ sudo vim /etc/apache2/sites-available/redmine
+ SSLCertificateFile /etc/apache2/cert/ssl-cert-mkt-sys.pem + SSLCertificateKeyFile /etc/apache2/cert/ssl-cert-mkt-sys.key
# サービスを再起動 pinzolo@mkt-sys:~$ sudo service apache2 restart # 後始末(最初にワークディレクトリ作れば良かった) pinzolo@mkt-sys:~$ mkdir work/ssl pinzolo@mkt-sys:~$ sudo mv mkt-sys.key work/ssl/ pinzolo@mkt-sys:~$ sudo mv csr-mkt-sys.pem work/ssl/ pinzolo@mkt-sys:~$ sudo mv demoCA/ work/ssl/ pinzolo@mkt-sys:~$ sudo mv ssl-cert-mkt-sys.* work/ssl/

さくら VPS (Ubuntu Server 10.04)設定エントリ一覧

2012/06/16

果実酒つけたのでレポートするよ

今年も果実酒がアツい季節がやって参りました。
というわけで、いつもは「○○漬けた」とつぶやくだけだったけど、今回はレポートしてみます。
今回漬けるのは二つ。
果実酒の定番である梅酒と、果実酒の王様であるびわ酒。

今日の主役たち


びわ 1kg強
梅(南高梅) 1kg
ウォッカ GILBEY'S 750ml を 2.5本
ウィスキー トリス を 1.8リットル
果糖 300g
果実酒の基本は、果物1kgにお酒1.8リットルです。
お酒はアルコール度数20度以上の物にしましょう。
酒税法で決められているというのもありますが、度数が低いとカビが生えたりして失敗する可能性が高くなります。
なぜ、こういうチョイスなのかは後で述べます。

前準備


あく抜きのために梅を水につけておきます。
熟した南高梅の場合はあまり必要ないのですが、青梅やあまり熟していない南高梅の場合はやっておいた方がいいでしょう。
漬けておく時間は、長くても一時間ぐらいで。

びわ酒を漬ける


びわを一つずつ丁寧に水洗いし、へたを取ります。


とりあえずクッキングシートを敷いて並べてます。


焼酎など度数が強めのアルコールで容器を消毒し


びわを一つ一つクッキングシートでよく拭いて


消毒した容器に入れていきます。


びわは高いし、こんな機会でもないとなかなか買わないのでつまみ食いも欠かしません。


全部入れ終わると、ウォッカを注いでいきます。
基本はこれだけですが、もうちょっとあります。


つまみ食いしたびわの種がありますよね。
びわはあんずとかと同様に仁、つまり種からもいい味が出ます。
なので、種も洗って放り込みます。


こんな風に投入します。
漬けた後からも、びわを食べる機会があったら種をちょこちょこ足していくといいですよ。
これでびわ酒は終わりなので、次は梅酒に行きましょう。

梅酒を漬ける


びわと同じように梅も一つずつ丁寧に洗います。
その際に爪楊枝などでへたを取ります。
えぐるより真ん中に刺してはがす感じ。これが意外と楽しい


びわと同じように綺麗に拭いて容器に入れていきます。


果糖300gを投入します。


ウィスキーを投入して完了。

最後に


日付や材料をタグ付けして


暗所(押入)に保存。
本来は冷暗所がいいんだけど、最近の住宅事情だと冷蔵庫以外の冷暗所なんてなかなかない。
だれか蔵を寄贈して下さい。

こだわり

ホワイトリカーじゃなくてウォッカ?
一般的には果実酒はホワイトリカーで作ります。
これはホワイトリカーが香りもクセもないお酒なので、果物の味がわかりやすく、楽しみやすいからです。
ということなら無味無臭無香のウォッカでもいいわけで、絞りカスから作られるホワイトリカーよりウォッカの方がいいなーということでウォッカを使ってます。
自分が果実酒を作るときはまずウォッカで作り、いったん試してから相性の良さそうなお酒を探します。

レモン使わないの?
びわのように酸味の弱い果物にはレモンの輪切りを一緒に漬ける人も多いみたいです。
でも、ほとんどの果物においては単一で作った方がしっかり味が出ておいしいと思います。
旬の果物の味を楽しみたいのでレモンは使ってません。

氷砂糖じゃなくて果糖?
レモンと同様に基本的に果実酒には糖類は使わないのですが梅酒とあんず酒には糖類を入れた方がおいしいと思います。
特にあんず酒はあんず単品だと飲めた物じゃないです。糖類必須。
で、一般的に梅酒には氷砂糖を使うようです。
浸透圧だとか、じっくり溶けるからより梅のエキスがでるとかいいますが、あまり関係ありません。
関係なくはないのですが、あれは短期間しか漬けない人が少しでも味を良くするための知恵だと思います。
氷砂糖がゆっくり溶けるといっても一ヶ月もあれば影も形もないのです。
自分のように最低でも一年は漬ける場合、梅単体で漬かっている方が遥かに長く、氷砂糖が溶けている時間なんて誤差みたいなもんです。
そして、なぜ果糖かというと果糖は果物によく含まれているので、相性がいいだろうということと、糖度が砂糖よりも高いため500gのところを350g程度で済みます。
カロリー的には少し低いか、大して変わりませんが、コストパフォーマンスはけっこういいですよ。
吸収率は無類ですし

ウィスキー?
梅酒に関しては色々試しました。
各種焼酎、ウォッカ、黒糖焼酎 + 黒糖の黒糖梅酒、ブランデー、ウィスキー、紹興酒...
どれもそれぞれおいしいんですが、ウィスキーが一番インパクトがあります。
ウィスキーって独特のクセがあったりしますが、あれがなくなり非常にまろやかになります。
人に飲ませたとき、ウィスキーで漬けたというとたいてい驚かれます。
個人的にはウィスキー梅酒はかなりオススメです。

というわけで果実酒レポートでした。
旬の果物を果実酒にすると色々と楽しめます。
同じ果物はだいたい一年に1,2回しかつけません。
来年はこういう漬け方してみようとか思うので趣味として長続きするんじゃないでしょうかね。
この時期、果実酒にしておいしい果物があふれています。梅、びわ、あんず、プラムなどなど。
ぜひ、この機会に試してみて下さい。

2012/06/15

MacBook Air 13inch を注文してきた

なんで Mac?

開発用ノートとして個人的に外せない要素として
  1. 持ち運びできる大きさ、重さなこと(1.5kg前後まで)
  2. *nixもしくはそれに準ずる環境が使えること
  3. USキーボード
  4. メモリたくさん
  5. それなりに高い解像度
があるのだけど、2, 3 の時点でだいたい3つの選択肢になる。
  1. ThinkPad + Ubuntu
  2. Vaio + Ubuntu
  3. Mac
最初は 2 でがんばってたんだけど、どうも Vaio と Ubuntu が相性が良くない。(あくまで経験上ね)
なので、ほとんど ThinkPad に Ubuntu 入れていた。
Windows 環境もいるので、Mac はあまり眼中になかった。
また ThinkPad X200 シリーズはモバイル性、スペックの上で素晴らしいバランスだった。
しかし、そのまま正当進化すればいいのに 1440 * 900 の解像度を捨ててしまった。
縦 768 とかアホか。ほんとアホか。
というわけで Windows 環境込みで考えるとコストが高いけど、開発マシンとして評判の高い Mac を買うことにした。
あ、あと iPhone アプリも開発してみたかったんだ。iPhone 持ってないけど。

どの Mac にしたの?

結局 MacBook Air 13inch にした。
先日の WWDC では、MacBook Pro 13inch with Retina Display を期待していたんだけど、15inch だけった。
いくら従来より軽くなったとはいえ重い。そしてでかすぎる。
なので持ち運びやすい MacBook Air にした。
MacBook Pro 13inch は約2kgと重いし、解像度が Air 13inch に劣るしね。

どんな構成?

  • CPU を i7 に
  • メモリを8Gに
  • キーボードをUSに
こんな感じ。
SSD 256 → 512 に +44,000 はちょっときつい。
初めての Mac なので 256 でも十分だろうと思った。
3年後ぐらいには MacBook Pro 13inch with Retina で2kg切ったやつが出てるだろうし。

どこで買ったの?

仕事帰りに帰り道とは全く関係ない秋葉原まで行ってきた。
カスタマイズした Mac を買ってポイントつくのは、ここら辺だと Mac Collection AKIBA しかないみたい。
現金だと 5%、カードだと 3%。プレミアムクラブに入ってると +1% のルピーっていうソフマップのポイントがもらえる。
クレジットカード + プレミアムクラブだったから、145800円で5832ポイントもらえた。
ソフマップのポイントはビックカメラのポイントに交換できるし、ビックカメラのポイントは Suica やマイルに交換することができる。
Mac 買うためだけにポイントカード作ってもいいんじゃないかな?
プレミアムクラブは年会費かかるけどね。(でも、年に一回ソフマップで買い物すれば無料になる)
あと、独自のサポートもやってるので Apple Care 高いなーと思う人にはいいかもしれない。
自分は Apple Care に入らず、ワランティMってやつに入っておいた。
月額 300 円で、落として壊してもサポート受けられるってお店の人が言ってた。

いつごろ届く?

お店の人に 10 日から 2 週間かかるって言われた。
土日を多く挟むタイミングだったから少し長いって言われたので、平均したら一週間ちょいぐらいで届くみたい。
ちなみに、自宅への送料も無料

というわけで

人生において初めての Mac。
今から楽しみです。
とりあえず、アレ入れよう、これ設定しようといろんなエントリ見ながらワクワクしてます。
早く来い来い。

2012/06/09

さくら VPS の Ubuntu Server 10.04 に git サーバーを構築

公開リポジトリは github でいいけれど、プライベートなリポジトリも欲しいよね。
というわけで、サーバーに git のリポジトリをたてるべく gitosis をさくらの VPS の Ubuntu Server 10.04 に導入したのでメモ。

# gitosis のインストール
pinzolo@server:~$ sudo aptitude install -y gitosis
[sudo] password for pinzolo: Reading package lists... Done Building dependency tree Reading state information... Done Reading extended state information Initializing package states... Done The following NEW packages will be installed: gitosis python-pkg-resources{a} python-setuptools{a} 0 packages upgraded, 3 newly installed, 0 to remove and 0 not upgraded. Need to get 318kB of archives. After unpacking 1,487kB will be used. Writing extended state information... Done Get:1 http://jp.archive.ubuntu.com/ubuntu/ lucid/main python-pkg-resources 0.6.10-4ubuntu1 [65.0kB] Get:2 http://jp.archive.ubuntu.com/ubuntu/ lucid/main python-setuptools 0.6.10-4ubuntu1 [213kB] Get:3 http://jp.archive.ubuntu.com/ubuntu/ lucid/universe gitosis 0.2+20090917-2 [40.4kB] Fetched 318kB in 0s (501kB/s) Preconfiguring packages ... Selecting previously deselected package python-pkg-resources. (Reading database ... 64406 files and directories currently installed.) Unpacking python-pkg-resources (from .../python-pkg-resources_0.6.10-4ubuntu1_all.deb) ... Selecting previously deselected package python-setuptools. Unpacking python-setuptools (from .../python-setuptools_0.6.10-4ubuntu1_all.deb) ... Selecting previously deselected package gitosis. Unpacking gitosis (from .../gitosis_0.2+20090917-2_all.deb) ... Setting up python-pkg-resources (0.6.10-4ubuntu1) ... Processing triggers for python-central ... Setting up python-setuptools (0.6.10-4ubuntu1) ... Processing triggers for python-central ... Setting up gitosis (0.2+20090917-2) ... Please read /usr/share/doc/gitosis/README.Debian for information about how to use gitosis. Processing triggers for python-support ... Reading package lists... Done Building dependency tree Reading state information... Done Reading extended state information Initializing package states... Done Writing extended state information... Done
# git ユーザーを作成 pinzolo@server:~$ sudo adduser git --system --shell /bin/sh --group --disabled-password --home /var/lib/git
Adding system user 'git' (UID 107) ... Adding new group 'git' (GID 116) ... Adding new user 'git' (UID 107) with group 'git' ... Creating home directory '/var/lib/git' ...
# gitosis 初期化 pinzolo@server:~$ sudo -H -u git gitosis-init < .ssh/id_rsa.pub
Initialized empty Git repository in /var/lib/git/repositories/gitosis-admin.git/ Reinitialized existing Git repository in /var/lib/git/repositories/gitosis-admin.git/
# post-update フックスクリプトに実行権限を付与 pinzolo@server:~$ sudo chmod 755 /var/lib/git/repositories/gitosis-admin.git/hooks/post-update
これでサーバー上の作業はおしまい。

ここからローカルでの作業。

# 管理リポジトリを clone する
pinzolo@local % git clone git@server:gitosis-admin.git
Cloning into 'gitosis-admin'... remote: Counting objects: 5, done. remote: Compressing objects: 100% (5/5), done. remote: Total 5 (delta 0), reused 5 (delta 0) Receiving objects: 100% (5/5), done.
# リポジトリ内はこんな構造になっている pinzolo@local % cd gitosis-admin pinzolo@local % tree
. ├── gitosis.conf └── keydir └── pinzolo@mkt-sys.jp.pub 1 directory, 2 files
# gitosis.conf を編集 pinzolo@local % vim gitosis.conf
[gitosis] [group gitosis-admin] writable = gitosis-admin members = pinzolo@mkt-sys.jp # ここから追加 [group hoge] writable = hoge members = pinzolo@mkt-sys.jp
# 修正を commit して、反映させるために push(新しいリポジトリ hoge.git が作成される) pinzolo@local % git add gitosis.conf pinzolo@local % git status
# On branch master # Changes to be committed: # (use "git reset HEAD ..." to unstage) # # modified: gitosis.conf #
pinzolo@local % git commit -m "hogeリポジトリを追加"
[master 01e4aec] hogeリポジトリを追加 1 file changed, 4 insertions(+)
pinzolo@local % git push
Counting objects: 5, done. Delta compression using up to 2 threads. Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 387 bytes, done. Total 3 (delta 0), reused 0 (delta 0) To git@server:gitosis-admin.git 893246e..01e4aec master -> master
# サーバーのリポジトリを origin として登録し push する pinzolo@local % cd ~/projects/hoge pinzolo@local % git remote add origin git@server:hoge.git pinzolo@local % git push origin master
Counting objects: 5557, done. Delta compression using up to 2 threads. Compressing objects: 100% (5162/5162), done. Writing objects: 100% (5557/5557), 14.71 MiB | 145 KiB/s, done. Total 5557 (delta 1436), reused 0 (delta 0) To git@server:hoge.git * [new branch] master -> master

結構簡単に中央リポジトリのある開発ができますね。

さくら VPS (Ubuntu Server 10.04)設定エントリ一覧

2012/05/30

BackgroundWorker 内で DataContext を使うとき

DataContext を取得するのは UI スレッドからでしか無理のようだ。例外が発生する。
なので BackgroundWorker で DataContext を取得したい場合、こんな風に UI スレッドで動かしてやらないといけない。
Action action = () =>
{
    var hoge = (HogeViewModel)this.DataContext;
    // do something ...
}
tihs.Dispatcher.Invoke(action);

WPFのドラッグアンドドロップで処理を行う場合

エクスプローラとかからディレクトリを D & D して処理を行う場合、よほど軽いすぐ終わる処理でない限りは BackgroundWorker などで別スレッドにしたほうがいいみたい。
Window_Drop ハンドラ内で処理していたら、処理が終わるまでエクスプローラがロックされたような状態になってしまう。

2012/05/29

WPFでファイルやディレクトリのドラッグアンドドロップ処理

例えば Window に対して行うなら、Window の AllowDrop を true にして、DragOver と Drop イベントにハンドラを設定すればできる。
イベント名が違うだけで、これも WinForms 時代と変わらないね。
DataFormats って文字列の定数クラスなのね。
const じゃなくて readonly なのは理由があるのだろうか?

2012/05/28

WPFで未処理の例外を一括処理

アプリケーション開発の定番の例外一括処理。
WPF も Windows Forms 時代とたいして変わらないね。
DispatcherUnhandledException はコードビハインドではなく、App.xaml に記述することもできるけど、UIスレッドで発生した時の DispatcherUnhandledException と UIスレッド以外で発生した時の UnhandledException はセットで考えるべきだと思うので、見通しが良いように一括で設定するようにしてる。