OmniAICreator/Qiita-1.07M huggingface dataset:
naveでインストールしたnode.jsのアプリをstart-stop-daemonとmonitで運用する

<!-- too_old -->
> **この記事は最終更新から1年以上経過しています。** 気をつけてね。

node.jsで作ったアプリの運用を始めるので管理の方法を検討した。

## 方針
node.jsはnave.shでバージョン管理する。PATHさえ通せば使えるのでusemainもしない。多分nodebrewもPATHだけなので同様の方法が使える模様。

node.jsは単体ではでdaemonizeしない、依存増えそうなので。
プロセスの監視はmonit。手法としてはUpstartでのrespawnがよく紹介されているが、node.jsはゆるりと起動してくればよいのでmonit。


## 起動＆停止スクリプト
任意バージョンのnode.jsで /opt/myapp にあるプログラムを操作するスクリプト。

### 起動

```start.sh
export PATH="home/node/.nave/installed/0.8.2/bin:$PATH"
export NODE_ENV=production
start-stop-daemon -S \
 -p /var/run/myapp.pid \
 -d /opt/myapp \
 -c node
 -m -b \
 -x/home/node/.nave/installed/0.8.2/bin/node -- ./app.js --applabel myapp
```

ちなみに最後のapplabelは複数のnodejsアプリが動作するときにpsで判別しやすくする目的でつけているので単体で動かすなら必要ない。

ログなどを標準出力に出している場合は最後にリダイレクトで適当なファイルに出力すればOK。その場合のログローテーションはcopytruncateにしておくと良い。

### 停止

停止はpidを渡すだけ、特にENVはいらないけど気分的に追加。

```stop.sh
#!/usr/bin/env bash
export PATH="/home/node/.nave/installed/0.8.2/bin:$PATH"
export NODE_ENV=production
start-stop-daemon -K \
 -p /var/run/myapp.pid \
 -R=TERM/30/KILL/5
```

Capistranoでデプロイする場合はスクリプトとpidをsharedの下に置き、-dに#{current_path}を指定するとよい。



## monitのコンフィグと操作
monit自身は遠慮無くUpStartで起動しておこう。
最低限の設定としてはこのくらいか。

```myapp_monit.conf 
check process myapp with pidfile /var/run/myapp.pid
  group myapp
  start program "/opt/myapp/bin/start.sh"
  stop program "/opt/myapp/bin/stop.sh"
  if 2 restarts within 3 cycles then unmonitor 
```

グループ指定をしておくと

### monitでnode.jsのアプリを操作
起動するとき

    monit start myapp

停止するとき

    monit stop myapp


これで死活監視とリスポーンとnode.jsのバージョン変更が楽に行える。
Railsで無理なくVimに入門する方法

# Vimを始めようかなーと思ってる人へ

僕はまだVimを使い始めて4ヶ月ですが、IDEよりVimの方が高速かつ快適に開発ができるようになりました。
しかし、そんな僕もこれまでに何度もVim（Emacs）に挫折してきました。
本エントリはそんな僕がどうして今回はVimに"無理なく"使えるようになったのか紹介します。

# なぜVim（Emacs）はハードルが高いのか

僕は多くの人がVim（Emacs）を使いたいと思っても挫折するのは”なかなか前のエディタより便利にならない”というのがあったからだと思います。頑張った先の具体的なメリットがみえていなかったのです。
いわば自転車が歩くより速くて楽だと知らないのに、自転車に乗る練習をしているようなものだったんじゃないでしょうか。

そこで、もし最初からいきなり以前のエディタより便利な機能があると体感できたらどうでしょうか。
そんな都合のいいことと思うかもしれませんが、ラッキーなRailsプログラマはそれができるのです。

# rails.vimがすごく楽

Vimのrails.vimを使うと、最初からめちゃくちゃ楽になります。
まずファイルの移動が楽。コントローラーのアクションから、そのアクションのビューに移動するときに":R"と打つだけ、戻るときも":R"と入力するだけです。
とりあえず:Rとその派生の:Rmodel name, :Rcontroller nameなどを覚えるだけでも既存のIDEなんかよりずっと簡単に開発ができるようになるでしょう。

- [川o・-・）＜2nd life - rails.vim](http://d.hatena.ne.jp/secondlife/20061222/1166781841)
- [Vimで快適なRailsライフを](http://qiita.com/items/57e726312ffe47592867)

# 以前の僕がVimに対して思っていたことと今思ってること
- 操作について覚えることが多すぎる
 - 多いが必要なところだけ覚えればいい
- プラグインをたくさんいれなくてはいけない
 - いまはvundler（rubyのbundlerみたいな）というのがあり管理が楽
- ファイルのツリー表示がない。バッファの管理とかわからない
 - ツリー表示はある

# 手順

それぞれを詳しく書くと長くなるのであとは各自で調べて下さい。
vundle,NERDTree,rails.vimを入れれば、普通のエディタなんかよりずっと簡単に開発ができるようになります。
僕は下記のような順番で覚えていきました

- [チートシート（PDF）](www.namaraii.com/files/vim-cheatsheet.pdf)をプリントアウトする
- 最初のチュートリアルをやる（:Tutorialっていれるとでてくる、途中まででもいい）
- vundleを入れてプラグイン管理を楽にする
- NERDTreeを入れて、ファイルのツリーを表示できるようにする
- rails.vimを入れる
- チートシートをもう一回見てみる（最初に書いてなかったとしか思えない機能が見つかる）
- チュートリアルをもう一回やってみる（最初に紹介されてなかったとしか思えない機能が見つかる）

# まとめ

- メリットが見えてれば頑張れる
- Vim使いの人はghjkあんまり使わないけど誰か教えて欲しい
iOSアプリ内でOAuthログインポップアップを開く方法 

Facebook iOS SDKをgithubからCloneしてきたソースの Facebook.m の334行目あたりに

```
[self authorizeWithFBAppAuth:YES safariAuth:YES];
```

があるので

```
[self authorizeWithFBAppAuth:YES safariAuth:NO];
```

に変更すると、Safariを開かずにポップアップでFacebookアプリ認証画面が出せる。
型変数

このコードがコンパイル通らないのですが、GHC拡張で何とかならないでしょうか。
-XScopedTypeVariablesではダメでした。

~~~ {haskell}
maxBoundInteger :: (Bounded a, Integral a) => a -> Integer
maxBoundInteger _ = fromIntegral (maxBound :: a)
~~~
noticeやalertの設定方法の違い

```ruby
redirect_to foos_path, :notice => "Foo saved"
```

これでnoticeが表示されるので、

```ruby
render :action => :new, :alert => "Some errors occured"
```

これも当然alertが表示されるだろう、と思いきや動作しない。
renderの場合はこのように書く必要があった。

```ruby
flash.now[:alert] = "Some errors occured"
render :action => :new
```

ひっかけですね！！

NOTE: [こちらの記事](http://www.perfectline.ee/blog/adding-flash-message-capability-to-your-render-calls-in-rails)を参考にしました。
MacVim + vim-ref + Rubyリファレンスで文字化けが発生した場合の対処方法

[こちらのサイト](http://d.hatena.ne.jp/holypp/20110703/1309711799)を参考にしながらvim-refというプラグインを入れたが、MacVimでRubyリファレンスを開くと文字化けが発生した。
この問題は.vimrcに以下の設定を入れることで解決した。

    let g:ref_refe_encoding = 'euc-jp'



NOTE: 自分のブログ記事からの再掲です。
http://d.hatena.ne.jp/JunichiIto/20120708/1341745241
Linux kernel module の作成

カーネルモジュールを作る際の基本的なメモ．
Ubuntu precise 環境だけれど，今のところ 2.6.x/3.x.x 系ならどのディストリビューションでも根本は同じはず．きっと．

```sh:環境
% lsb_release -dcs | tr "\n" ' ' #=> Ubuntu 12.04 LTS precise
% uname -rm                      #=> 3.2.0-27-generic x86_64
% dpkg -l | grep linux-headers   #=> ii  linux-headers-3.2.0-27-generic  3.2.0-27.43  ...
% WORK_DIR=~/work/mod_oppai
% mkdir -p $WORK_DIR && cd $WORK_DIR && pwd  #=> ~/work/mod_oppai
```

```c:oppai_module.c
#include <linux/module.h>
#include <linux/kernel.h>

MODULE_DESCRIPTION("Test Module");
MODULE_AUTHOR("trashsuite");
MODULE_LICENSE("MIT");

static int oppai_init_module(void)
{
    int error = 0;

    printk("oppai is loaded!");

    if(error) return -ENODEV;

    return 0;
}

static void oppai_cleanup_module(void)
{
    printk("oppai is unloaded!");
}

module_init(oppai_init_module);
module_exit(oppai_cleanup_module);
```

```makefile:Makefile
KERNEL_DIR = /lib/modules/$(shell uname -r)/build
BUILD_DIR := $(shell pwd)
VERBOSE   := 0

obj-m      := oppai.o
oppai-objs := oppai_module.o

all:
	make -C $(KERNEL_DIR) SUBDIRS=$(BUILD_DIR) KBUILD_VERBOSE=$(VERBOSE) modules

clean:
	rm -f  *.o *.ko *.mod.c *.symvers *.order .oppai*
	rm -fr .tmp_versions
```

```sh:ビルド・ロード・リムーブ
% make
% modinfo oppai.ko
filename:       oppai.ko
license:        MIT
author:         trashsuite
description:    Test Module
srcversion:     93045A021979E5BA3ED10F6
depends:        
vermagic:       3.2.0-27-generic SMP mod_unload modversions
%
% sudo insmod oppai.ko
% lsmod | grep oppai #=> oppai 12513  0
% sudo rmmod oppai
%
% dmesg | grep oppai
[2566390.630576] oppai: module license 'MIT' taints kernel.
[2566889.643683] oppai is loaded!
[2566893.356545] oppai is unloaded!
```

'**oppai: module license 'MIT' taints kernel.**'
意訳: なんで GPL じゃあないんだ，あぁん？汚ぇモジュールだなぁおい！…まぁいい… ksg！
アジャイル開発におけるGitの使い方


## はじめに
gitを使ったアジャイルチームによる開発について少し書いておきます。用語はなるべくアジャイルサムライに準じますが、一部スクラムの用語が混じるかもしれません。

## 共同所有
アジャイル開発はまず共同所有が必要なので、最低限共有用のbareレポジトリはたてましょう。githubでやってもいいし、その辺に転がっているマシンをレポジトリサーバーにしてもいいでしょう。
bareレポジトリマシンに必要なのは、常にネットワークに繋がっていることと、ディスク容量が小さくないことです。早くなくても大丈夫ですが、gitのバージョン違いが起きるとあとで面倒なのでなるべく最新のgitを追いかけることのできるバージョンのOSを使いましょう。

## イテレーションとストーリー
### 小さいチームの場合
決まったタイムボックス（イテレーション）で、それぞれのストーリーを開発するのですが、チームが少人数で同時に一つのストーリーしか取り組めない（これが理想的）状態のときは、メインのブランチでそれぞれ開発するといいかもしれません。ただし、毎日作業が終わったら、一通りテストをして、共有レポジトリにpushしておきましょう。もちろん、毎日の開発はpullから始まります。

```
$ git push
$ git pull
```

githubやbitbacketなどの環境の場合は、pull request機能を使うのがいいでしょう。forkをしない方法（[github flow](https://gist.github.com/Gab-km/3705015)としてよく知られています）を使い、pull requestを使うことで確実にコードレビューが終わったコードをマージするというプロセスを作ることができます。

いきなりメインのブランチを変更するのが怖い場合、たとえば、ちょっとスパイク的に試行してみる等といった場合は、個人レベルでブランチを切って開発し、ある程度見えたところで、マージするという方法をとるといいでしょう。

```
$ git branch my_spike    # ブランチを作成
$ git checkout my_spike  # ブランチ my_spike を変更開始
$ git commit             # ブランチにコミット
$ git branch master      # メインのブランチに変更
$ git merge my_spike     # ブランチ my_spike をマージ
$ git branch -d my_spike # ブランチ my_spike を削除
```

これもgithub flowにより代用できます。一気にマージしようとすると、マージに失敗することが多くなり、またその解決も時間がかかることになります。できる限り頻繁なマージを心がけましょう。

大事なのは、いつもメインのブランチが完全に動く（テストがパスする）状態の最新のコードがおいてあるということ。これはCIの原則です。メインのブランチが壊れてないことを確認するために、jenkinsなどのツールを使うことがあります。もし壊れていたら、ストーリーの開発をいったん中止して直しましょう（ラインストップ）。

### 大きいチームの場合
CIの原則やイテレーションの進め方の原則から言えば、優先順位順にストーリーをひとつずつ完了させていくことが理想なのですが、そのような理想の進め方ができるのは、十分に熟練したチームであることが多いです。（でも目指さなければ実現できないこともあわせて憶えておきましょう）

現実に対応するために、複数のストーリーの開発が進行する場合もあるでしょう。その場合は、ストーリーごとにブランチを切って、ストーリーが完了した後にメインのブランチをマージするといいでしょう。

ストーリーとして完了した方を最後に一気にマージするのは、競合が発生する可能性もありあまりおすすめしません。ですので、本来は着手したストーリーをすべてメインのブランチにマージしていった方がいいのだけれども、様々な理由でストーリーの開発が続行できなかったときに取り除くのが難しいことが多くなります。

十分に小さくないストーリーが多いと、競合が発生することが多くなり、最後のマージ作業がとても大変な作業になってしまうので、ストーリーを十分に小さくして置くことが大事です。ここは別のプラクティスになりますね。

## イテレーションが終わったら
### イテレーションの後作業
イテレーションが終わったら、是非タグをつけましょう。次回のイテレーションで困ったときに立ち戻る場所が今回のイテレーションの成果物です。

```
$ git tag itereation_xx
```

もし中途半端になってしまったストーリーがあったら、ストーリーをいつやるのか顧客と相談しましょう。

中途半端になってしまったストーリーのブランチを一度破棄してもう一度はじめからというのも選択肢としてありかもしれません。経験は得られたわけですから、次回は今回よりも作業しやすいでしょう。
awesome_print を pry の表示のデフォルトに使う

`awesome_print` はデバッグに便利な表示メソッドを提供する gem です．

これを多用していると，pry を立ち上げる度に `require 'awesome_print'` しないといけなかったり，`ap` メソッドを手で打つのが面倒くさくなってきたりすると思います．
そこで，`awesome_print` をデフォルトに設定してしまう方法を紹介します．

`~/.pryrc` に次のように設定します．
`AwesomePrint.defaults` の設定項目一覧は [こちら](https://github.com/michaeldv/awesome_print)．

```ruby:~/.pryrc
begin
  require 'awesome_print'
rescue LoadError
else
  AwesomePrint.pry!
end
```

これにより，次のように毎度 `require` する必要がなく，出力も `awesome_print` のものになります．

```ruby:pryのコマンドライン
[1] pry(main)> [1,"abc", {:abc => 1.0}]
[
    [0] 1,
    [1] "abc",
    [2] {
        :abc => 1.0
    }
]
```

##関連記事：
[Awesome Print](http://qiita.com/items/b687cb678c1b9e93dfd1)
[見やすいprint](http://qiita.com/items/e7df375e46d71a9abf55)
do記法でパターンマッチにしくじるとfailが使われる


以下のhogeとhoge'は同じかと思ってたけど、別物。

```haskell:
hoge :: [Int]
hoge = do
  Just x <- [Just 3, Just 2, Nothing, Just 4]
  return x

hoge' :: [Int]
hoge' = [Just 3, Just 2, Nothing, Just 4] >>= (\ (Just x) -> return x)
```

http://www.haskell.org/onlinereport/exps.html によると、do記法の書き換えは以下なので。

```haskell
do {p <- e; stmts}	=	let ok p = do {stmts}
                            ok _ = fail "..."
                        in e >>= ok
```

動きから予想はしてたけど、やっぱ fail かあ。。。
jsでRailsと通信する際の注意 Pusherでの対応

RailsではデフォルトでCSRF攻撃対策がされていて、jsで何も考えずにget以外のmethod(postなど)で通信するとsessionが無効化される。
このため、追加でauthenticity_tokenを送る必要がある。



##CSRF攻撃対策

```ruby:controllers/application_controller.rb
protect_from_forgery
```
上記のようにデフォルトで表記されていて、全てのアクションにCSRF攻撃対策されている。
`protect_from_forgery :except => ["create"]`
`protect_from_forgery :only => ["create"]`
など、対策したいアクションを指定することもできる。

参考
[CSRFトークンの検証プロセス](http://qiita.com/items/ce037ea79bb5893f2b89 "Qiita")
[CSRFの対応について、rails使いが知っておくべきこと](http://d.hatena.ne.jp/willnet/20080509/1210338845)

##js

対策されているアクションとget以外で通信する際には、meta情報にあるauthenticity_tokenを追加して送る必要がある。
今回はjQueryで取得して送信する。

```js:hoge.js
$.post(
    '/hoge/action',{
        "hoge":hoge, 
        "authenticity_token":getCSRFtoken()
    });

function getCSRFtoken(){
    return $("meta[name=csrf-token]").attr("content");
}

```


##Pusher
Pusherでpush通信する際は、以下のようにpusher.jsの通信部分を書き換える必要がある。

```javascript:pusher.js
b.send("socket_id="+encodeURIComponent(a.connection.socket_id)+"&channel_name="+encodeURIComponent(this.name)+"&authenticity_token="+getCSRFtoken())
```

###追記

pusherのバージョンが古かったようです。
v1.12.1では以下のようにソケットを作ると解決します。

```javascript:hoge.js
        var socket = new Pusher(PUSHER_KEY,{
            auth: {
                headers: {
                'X-CSRF-Token': getCSRFtoken()
                }
            }
        });
```
Macを買って3秒で即開発


僕はMacBook Airが嫌いですが、MacBook Proは好きです。あのペラペラしたキーボードとトラックパッドがだめです。
しかしMacBook White Unibodyが一番好きです (でした)。

Appleファンボーイ諸氏は使っているApple製品が壊れると「またApple製品を買える!」と喜ぶそうです。
僕はお金持ちではないので頻繁にMacを買えたりはしませんが、気分転換によくOSをクリーンインストールします。
OSをクリーンインストールするたびに入れるものが減っていってとても気持ちがよいです。

しかしOSをインストールしたあとのセットアップはできるだけ手間をかけたくありません。
高揚していた気持ちも既に冷めつつあるかとおもいます。

設定ファイルをGitなどで管理している人も少なくないとおもいます。
Rubyのバージョン管理ツール (RVMやrbenv) も「これ」というお決まりの使い慣れたものがあるかとおもいます。
irbの代替としてpryを使って久しいよ、とか。

それらをいちいち手で入れ直してもめんどうですし、入れ忘れなどがあってはめんどうです。
かといってブログに書いたりしても自動化したことにはなりません。

ブログなどに「これを入れて、次にこれを入れる、その次はこういう手順を……」ということを書いているうちに、「そのままスクリプトを書けばよいのではないか?」と考えることはありませんか?

ならば自動化しましょう。

## Homebrewでパッケージを揃える

[aereal / homebrew](https://github.com/aereal/homebrew)

Web系の開発などをする限りではHomebrewで十分ですし、なるたけOS Xのライブラリを見るようになっているので、MacPortsなどと比べてインストールにかかる時間は少なく済みます。
(MacPortsは依存関係をMacPortsの中で完結させようという思想のため、細かなライブラリなどをすべてインストールしようとするために時間がかかります。ビルドがより高速に行えるとか、そういうわけではありません。)

HomebrewはGitHub上で開発されており、現在も活発にFormulaの追加やアップデートが行われています。

しかしすべてが揃っているわけではありません。たとえばOS Xに既に入っていて、十分に新しいパッケージは本家には取り入れられないことになっています。

たとえばGNU Screenの開発版を使いたいだとかいった要求はあります。たとえば僕はrefeの入れ方をよく忘れてしまうのでHomebrewのFormulaとして追加しておきたいのですが、本家に日本語ローカルなツールのFormulaについてpull-requestを送っても望み薄です。

そこでHomebrewをforkします。自分のforkで好きなようにFormulaを追加して、気がむいたら

## その他のパッケージのインストールを自動化する

[aereal / osx-bootstrap](https://github.com/aereal/osx-bootstrap)

シェルスクリプト集です。

PerlやRuby, Node.jsをセットアップするために (自分が) 必要なプロセスをすべてスクリプトにしてあります。

`./bootstrap-homebrew.sh` でHomebrewがインストールされ、いつも必要なパッケージがインストールされます。

またRubyのセットアップは `./bootstrap-ruby.sh` で済みます。

## dotfilesをインストールする

[aereal / dotfiles](https://github.com/aereal/dotfiles)

シェルやGitなどの設定ファイルです。

GitのsubmoduleとしてVimのプラグインやTerminal.appなどのカラースキームを追加してあるので、`git clone --recursive git://github.com/aereal/dotfiles.git` ですぐに環境がセットアップできることを目標としています。
PHPアプリのためにCentOS6.2にlibmcryptをインストール

VM上の CentOS6.2 に、phpMyAdmin を入れたら、「mcrypt 拡張がありません。PHP の設定をチェックしてみてください。」ってお知らせが出た。

```sh
# yum install php-mcrypt
```

安直にこうしたら、そんなパッケージ無いよ！っておこられた。どうも CentOS のリポジトリには libmcrypt が含まれて無いらしい。
検索でヒットしたのは、libmcrypt は Fedoraが提供してるRHEL用パッケジにあるので、EPEL をリポジトリに追加して、そっからインストールせよ。とのこと。
情報が断片的だったのメモリー。

まず、[yum用リポジトリ追加 - Server World](http://www.server-world.info/query?
os=CentOS_6&p=initial_conf&f=6) にそのものズバリがあります。この[2]を実施。

```sh
[root@dlp ~]# wget http://ftp.riken.jp/Linux/fedora/epel/RPM-GPG-KEY-EPEL-6
[root@dlp ~]# rpm --import RPM-GPG-KEY-EPEL-6 
[root@dlp ~]# rm -f RPM-GPG-KEY-EPEL-6 
[root@dlp ~]# vi /etc/yum.repos.d/epel.repo
# 以下の内容で新規作成
[epel]
name=EPEL RPM Repository for Red Hat Enterprise Linux
baseurl=http://ftp.riken.jp/Linux/fedora/epel/6/$basearch/
gpgcheck=1
enabled=0
# 上記リポジトリを使用してインストールする場合は、以下のようにコマンド入力
[root@dlp ~]# yum --enablerepo=epel install [パッケージ名]
```

libmcrypt をインストール

```sh
# yum --enablerepo=epel install libmcrypt
```

さらに、php-mcrypt をインストール

```sh
# yum --enablerepo=epel install php-mcrypt
```

完了後は、ウェブサーバーを再起動し、phpinfo()で mcrypt が含まれてることを確認。
以上で phpMyAdmin からのお知らせが消えました！
第一回 オフラインリアルタイムどう書くの解答例。groovy で。

第一回 オフラインリアルタイムどう書く( http://atnd.org/events/30285 )。
問題は http://nabetani.sakura.ne.jp/hena/1/
計算手順としてもちょっと趣向を変えつつ、groovy で。

```ruby:groovy
def side = { [ 'o', 'x' ][it%2] }
def xy={ [it.intdiv(3),it%3] }
def sub={a,b->[ a[0]-b[0], a[1]-b[1] ] }

def onLine={a,b,c->
  bp=sub( xy(b), xy(a) )
  cp=sub( xy(c), xy(a) )
  bp[0]*cp[1] == bp[1]*cp[0]
}

def someLine={ b, hand->
  for( p in (0..<b.size())){
    for( q in (0..<p)){
      if ( onLine( hand, b[p], b[q] ) ){
        return true;
      }
    }
  }
  false;
}

def solv={ q->
  b=[[],[]]
  for( ix in (0..<[ 9, q.size() ].min())){
    hand=q[ix].toInteger()-1
    if ( b.any{ it.contains(hand) } ){
      return "Foul : ${side(ix+1)} won."
    } else if ( someLine(b[ix&1], hand ) ){
      return "${side(ix)} won."
    }
    b[ix&1].add(hand)
  }
  "Draw game."
}

[
  "79538246","35497162193","61978543","254961323121","6134278187",
  "4319581","9625663381","7975662","2368799597","18652368566",
  "965715","38745796","371929","758698769","42683953",
  "618843927","36535224","882973","653675681","9729934662",
  "972651483927","5439126787","142583697","42198637563","657391482"
].each{  println( solv( it ) ) }  
```

もう少し簡潔に書ける気がしてならないが、まあこんなところ。
まだまだ慣れてないので、ブロックから return で抜けても関数から抜けないとか、後置 if がないとか、その辺りでやられる。
ブロックから return で抜けても関数から抜けないので、ruby ではほとんど書くことがない for 文を書かざるをえない（と思う）のが新鮮。
ruby よりいいなぁと思うのは、`a..<b` のような範囲演算子とか、`{ [ 'o', 'x' ][it%2] }` で使っている it 辺り。

ポイントは、`[0,1,2],[3,4,5]`のようなデータを持っていないところ。

しかし、シンタックスハイライトがつかないのが残念。
見やすいgit-tag

```.zshrc
alias gt="git for-each-ref --sort=-taggerdate --format='%(taggerdate:short) %(tag) %(taggername) %(subject)' refs/tags"
```

![git-tag](http://gyazo.com/e6fd03bfaea9f3b44f9c60d8b539dd3c.png?1341920431)

- `git tag`でタグ名を一覧で表示できる。`git tag -n`でコメントもいっしょに表示できる。だけど、タグをつけた日付とかタグをつけた人も表示するには`git tag`では無理みたい。
- `git for-each-ref`はcommitとかtagとかのrefがバーっとみれる（まだよく理解してない）
- `--sort=`で表示されるソート順。`-taggerdate`でタグをつけた日付の降順。`-`をつけないと昇順。
- `--format=`で出力されるフォーマットを指定できる。細かいところはmanをみてください。けっこう細かいので説明するのが大変。。。
- `refs/tags`は表示する条件。これでタグだけを表示できる。
ターミナルでscreenを使ってみる

良いと噂を耳にしたscreenをやっとこさ使ってみる

```
yum install screen
```

をして、

```
screen -t name
```

で新しいスクリーン立ち上げ。名前をつけておいた方が便利

```
C-a d
```

でディタッチ。後でアタッチしなおしたい場合は

```
screen -r
```

で起動すれば、元の状態に戻る。

screen起動中は、

```
C-a c : 新規作成
C-a A : 今のウィンドウの名前設定
C-a l : ウィンドウリストを見る（.screenrcにbind l windowlistを設定している）
C-a S : 画面分割
C-a tab : 画面のフォーカスを移す
C-a X : 分割を戻す
```

どう便利かはこれから試していく。
必要無さそうなら、ターミナルのタブ機能でよしとする予定
MacにRubyをrbenv使って入れる。（Lion+homebrew版）


homebrewは入っている前提。

# rbenvとruby-buildのインストール

## ruby-buildを実行する時にgccないと怒られるので先にインストール

↓のURLからGCC-10.7-v2.pkgをダウンロードしてインストール
https://github.com/kennethreitz/osx-gcc-installer/downloads

## homebrew実行

```sh
brew install rbenv ruby-build
```

これでrbenvとruby-buildがインストールされる。

## zshに設定を追加

```sh
echo 'eval "$(rbenv init -)"' >> .zprofile
```

その後、シェルを再起動する。
（zshrcに入れるのは間違いらしい）

# Ruby 1.9.2-p320をインストール

## 事前にバージョンチェック
```
$ ruby --version                            
ruby 1.8.7 (2011-12-28 patchlevel 357) [universal-darwin11.0]
```

## インストール

```sh
rbenv install 1.9.2-p320
```

## デフォルトに設定

```sh
rbenv global 1.9.2-p320
```

## もう一回チェック！
```
$ ruby --version                            
ruby 1.9.2p320 (2012-04-20 revision 35421) [x86_64-darwin11.4.2]
```

変わってるのを確認したら成功です！
Macでhomebrewのzshを使う

homebrewでインストールしたzshはそのままではログインシェルとして使えません。
なのでパスを登録しましょう。

#homebrewでzshをインストール

```sh
brew install zsh
```

#/etc/shellsにシェルのパスを追加

`/etc/shells`にhomebrewで入れたシェルのパスを追加します。

```sh
sudo vim /etc/shells
```

vimで開いたら最後に（zshの場合）

```
/usr/local/bin/zsh
```

を追加します。

#デフォルトシェル変更

変更したシェルを設定します。

```sh
chsh -s /usr/local/bin/zsh
```

これで完了です。

[グッバイ野郎ども! コピペではじめるzshファイナル](http://news.mynavi.jp/column/zsh/024/index.html)などを参考にzshの設定をしましょう。
Grand Central Dispatch


覚え書きです。


```objectivec
// Serial Dispatch Queue の作成
dispatch_queue_t serialDispatchQueue = 	dispatch_queue_create("jp.sample.serialDispatch", NULL);
dispatch_async(serialDispatchQueue, ^{
	// do work
});
dispatch_release(serialDispatchQueue);
```

```objectivec
// Concurrent Dispatch Queue の作成
dispatch_queue_t concurrentDispatchQueue = dispatch_queue_create("jp.sample.concurrentDispatch", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(concurrentDispatchQueue, ^{
	// do work
});
dispatch_release(concurrentDispatchQueue);
```

```objectivec
// Main Dispatch Queue
dispatch_queue_t mainDispatchQueue = dispatch_get_main_queue();
    
// Global Dispatch Queue
// priority
// DISPATCH_QUEUE_PRIORITY_HIGH
// DISPATCH_QUEUE_PRIORITY_DEFAULT    
// DISPATCH_QUEUE_PRIORITY_LOW
// DISPATCH_QUEUE_PRIORITY_BACKGROUND
dispatch_queue_t globalDispatchQueue_high = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
```

```objectivec
// dispatch_once
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    // 初期化など、アプリケーション中に１回のみ実行される処理
});
```
rbenv による Ruby on Rails 環境構築


Ubuntu 12.04 でインストールしたときのメモ。

まずは依存パッケージをインストールしておく

> sudo apt-get install libsqlite3-dev libssl-dev zlib1g-dev

> sudo apt-get install sqlite3 \# いらないかも

つぎに rbenv のインストール

> git clone https://github.com/sstephenson/rbenv.git .rbenv
> cd .rbenv
> git checkout v0.3.0
> cd
> echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> .bash_profile
> echo 'eval "$(rbenv init -)"' >> .bash_profile
> exec $SHELL

ruby-build もインストールしておく

> mkdir -p ~/.rbenv/plugins
> cd ~/.rbenv/plugins
> git clone git://github.com/sstephenson/ruby-build.git

ruby 1.9.2 をインストールする。
インストール可能な ruby のバージョンは、単に "rbenv install" とすれば一覧が得られる。

> rbenv install 1.9.2-p320
> rbenv rehash
> rbenv global 1.9.2-p320

rails 3.1 系の最新を入れる

> gem install rails --version "<3.2.0"
> rbenv rehash

node.js もいれておく
<del>
> gem install node
> rbenv rehash
</del>

これは node.js じゃない。とりあえず apt-get で入れておく。

> apt-get install nodejs

できた！

> $ rails -v
> Rails 3.1.6
git コマンドメモ


## add し忘れた変更を追加する

> touch hoge fuga
> git add hoge
> git commit -m 'xxx'

fuga を add していないので

> git add fuga
> git commit --amend

エディターが起動するので、コミットログを変更したくば変更する。
不要だったらそのままでOK。


## 直前のコミットの Author: を変更する

> git commit --amend --author="Nanashi no Gonbei <nanashi@example.jp>"
> git commit

エディタが起動するので、そのまま終了する。

> git log

## リモートリポジトリのサブディレクトリに手元のツリーを追加する

> git clone git@github.com:user1/hoge.git
> cd hoge/
>
> \# 追加するための場所を作っておく
> mkdir -p subr/hoge
> touch subr/hoge/.gitkeep
> git add subr
> git commit
>
> \# 追加したいローカルリポジトリ local-repo を追加
> git add remote local1 /path/to/local-repo
> git fetch local1
>
> git merge -X subtree=subr/hoge local1/master
> \# これで commit まで走る
>
> git push origin master

git read-tree でも同様のことが出来るけど、ローカルリポジトリでの変更履歴が残らないので注意。

## 変更の一部分のみを commit する
一つのファイルに加えた、いくつかの変更を分けてコミットしたい場合、-p を使う。

> git commit -p

y/n を聞かれる。y を答えた変更のみ stage に反映される。

## git add を取り消す
> git reset

ファイルの "追加" の add を取り消す場合は reset ではなく、rm --cached を使う。

> git rm --cached <file>
> git rm --cached -r .

## 一つ前のコミットログを変更する
> git commit --amend
サーバーの初期設定用スクリプトをDropBoxで管理


面倒なサーバーの設定を可能な限り自動化。
自動設定用のスクリプトをDropBox(じゃなくても良いけど)に置いといて、DLしてからそのまま実行する。

例としてWordPressのインストール。

```bash:wordpress.sh
#!/bin/sh# WordPressecho "Enter database name"read DATABASE_NAME;echo "Enter mysql user name:"read MYSQL_USER;echo "Enter $MYSQL_USER's password:"read MYSQL_PASSWORD;echo "Enter MySQL root passowrd:"cat << EOS | mysql -u root -pCREATE USER $MYSQL_USER;CREATE DATABASE $DATABASE_NAME;GRANT ALL PRIVILEGES ON $DATABASE_NAME.* TO "$MYSQL_USER"@"localhost" IDENTIFIED BY "$MYSQL_PASSWORD";FLUSH PRIVILEGES;EOS# 最新版の取得wget -P /tmp/ http://ja.wordpress.org/latest-ja.tar.gztar zxvf /tmp/latest-ja.tar.gz -C /tmp/echo "Enter install dir"read INSTALL_DIRmkdir -p $INSTALL_DIRmv /tmp/wordpress/* $INSTALL_DIRchown -R apache:apache $INSTALL_DIR```

あとはこのファイルをDropBoxかなんかに上げておいて、リンクの取得。

```bash
$ wget https://dl.dropbox.com/xxxxx/wordpress.sh?dl=1 -O /tmp/wordpress.sh && sh /tmp/wordpress.sh```

と、rootで呼び出せばそのまま実行されるハズ。
( 一度tmpに保存しているのは、パイプだとreadコマンドが上手く動かなかったから )
あとは使いながら改善という事で。。
第一回 オフラインリアルタイムどう書く解答(C#)

オフライン参加してないのにこんなの書いてもね、というのはあるが。
[問題はこちら](http://nabetani.sakura.ne.jp/hena/1/)。
回答はC言語ライクになってます。勝敗判定なんて力技。

```c#:Program.cs
using System;

class Program
{
    static void Main(string[] args)
    {
        for (string line = Console.ReadLine();
             line != null;
             line = Console.ReadLine())
        {
            Console.WriteLine(TickTackToe(line));
        }
    }

    private static string TickTackToe(string line)
    {
        const int size = 9;
        int[] board = new int[size + 1];
        int t = 1;
        for (int i = 0; i < size; i++)
        {
            int p = line[i] - '0';
            if (board[p] != 0)
                return string.Format("Foul : {0} won.", Player(Opposite(t)));
            board[p] = t;
            if (Done(board, t))
                return string.Format("{0} won.", Player(t));
            t = Opposite(t);
        }
        return "Draw game.";
    }

    private static char Player(int t)
    {
        return " ox"[t];
    }

    private static int Opposite(int t)
    {
        return 3 - t;
    }

    private static bool Done(int[] board, int t)
    {
        return (board[1] == t && board[2] == t && board[3] == t)
            || (board[4] == t && board[5] == t && board[6] == t)
            || (board[7] == t && board[8] == t && board[9] == t)
            || (board[1] == t && board[4] == t && board[7] == t)
            || (board[2] == t && board[5] == t && board[8] == t)
            || (board[3] == t && board[6] == t && board[9] == t)
            || (board[1] == t && board[5] == t && board[9] == t)
            || (board[3] == t && board[5] == t && board[7] == t);
    }
}
```
最後の変更箇所にジャンプする

テキストを編集していて前の編集した箇所に戻りたいときがよくあります。その際に便利なのがgoto-chg.elになります。

```
M-x install-elisp-from-emacswiki goto-chg.el
```

設定ファイルに下記を追加します。

```common-lisp:.emacs.d/init.el
(require 'goto-chg)
(define-key global-map (kbd "<f8>") 'goto-last-change)
(define-key global-map (kbd "S-<f8>") 'goto-last-change-reverse)
```

`F8`を押すと、前回修正した箇所に移動します。`F8`を押し続けると、さらに過去の変更箇所に移動することができます。移動しすぎた際には、`Shift-F8`で元に戻ります。
第一回オフラインリアルタイムどう書く

当日参加していましたが、制限時間内に書き終わりませんでした。
所要時間は当日1h＋家に帰ってから2hくらいかかってます。

問題はコチラ　 http://nabetani.sakura.ne.jp/hena/1/

```java

public class TickTackToe {
	String board ;
	public void exec(String arg) {
		board = "123456789";
		for( int i = 0; i < arg.length() && i < 9 ; i++){
			if( i%2 != 0){	//後攻
				if( isResult("x", arg, i)){ return; }
			}
			else{	// 先攻
				if( isResult("o",  arg, i)){ return; }
			}	
		}
		System.out.print("Draw Game");
	}
	
	// 決着がついてたら結果を表示してtrueを返す
	private boolean isResult(String p,  String arg, int i){
		if( isFoul(board,Integer.parseInt( arg.substring( i,i+1 ) )) ){
			System.out.print( "Foul : " + (p.equals("o") ? "x" : "o") + " won" );
			return true;
		}
		board = board.replaceFirst(arg.substring(i,i+1), p);
		if(isWin(p,board)  ){
			System.out.print( (p.equals("o") ? "o" : "x") + " : won" );
			return true;
		}
		return false;
	}
	
	// 既に手が置いてある所にマークしようとしてたらtrueを返す
	private boolean isFoul(String board,int i){
		if(board.substring(i-1,i).equals("o") || board.substring(i-1,i).equals("x")){
			return true;
		}
		return false;
	}
	
	//勝ってたらtrueを返す
	private boolean isWin(String p, String board){
		/**
		 * 012
		 * 345
		 * 678
		 */
		int[][] win = { {0,1,2}, {3,4,5}, {6,7,8},
						{0,3,6}, {1,4,7}, {2,5,8}, 
						{0,4,8}, {2,4,6} };
		
		for( int i = 0; i < win.length; i++ ){
			if( board.substring( win[i][0],win[i][0]+1 ).equals(p)  && 
				board.substring( win[i][1],win[i][1]+1 ).equals(p)  && 
				board.substring( win[i][2],win[i][2]+1 ).equals(p)  ){
				return true;
			}
		}
		return false;
	}
}

```

Nabetaniさんからご指摘をいただき、色々書き直しました。
【AS3】コンパイル時の-debugオプションをFlash側から無理やり取得。

リリースモード(-debug=false)でコンパイルしたか、デバッグモード(-debug=true)でコンパイルしたかを取得しようと思ったけどそんな変数はなさそうだったので、無理やり取得する方法を考えた。  

## trace( hoge )が無視されることを利用する。
```as3:isDebug.as
public function isDebug():Boolean {
	var b:Boolean;
	trace( b = true );
	return b;
}
```
   
リリースモードの場合、trace( b = true )がまるまる無視されて、falseがかえってくる。  


## 無駄にtrace( true )しないバージョン
上のコードだと、余分にtrace( true )されるので、別バージョンを考える。

```as3:isDebug.as
public function isDebug():Boolean {
	try{trace(b.$)}catch(e:*){var b:*=e}
	return b
}
```
  
trace中にわざとエラーを起こして、catchする。  


## 応用例

IDEのデバッグコンソールとブラウザのJavaScriptコンソール(ChromeだとF12キーで出てくるやつ)に同時にtrace。

```as3:log.as
public function log( ...rest ):void {
	trace((
		ExternalInterface.available && 
		ExternalInterface.call.apply(0,["console.log"].concat(rest)), 
		rest.join(" ")
	));
}
```
  
-debug=falseにすれば、JavaScriptコンソール側の出力も消えてすっきり。JavaScriptが使えない環境でもエラーは起きないし、本来のデバッグコンソールに出力される内容はtraceと同じ。
RubyとvimでQuick JUnit風にテスト実行

Java & Eclipseの開発環境には、Quick JUnitというテストを迅速に実行するプラグインがあります。
Ruby & vimの開発環境においても、ほぼ同等の事が実施可能です。

以前、私のブログで、プロダクションコードとテストコードを素早く切り替えるテクニック、
vimから即座にRSpecを実行し、結果をバッファに表示するテクニックを紹介しました。
詳細は、以下を参照してみてください。

[RubyでTDDをやる際に、ちょっと便利になるVimの設定 - joker1007の日記](http://d.hatena.ne.jp/joker1007/20111107/1320671775)
[rspecをvim-quickrunから非同期で実行する - joker1007の日記](http://d.hatena.ne.jp/joker1007/20111208/1323324569)

今回は、そこから一歩進めて、特定のテストケースだけをvim-quickrunから実行する設定を紹介します。

そもそもrspecには `-l` オプションを付けることで、特定の行だけテストを実施してくれる機能があります。
指定した行が、`it/specify`ブロックの中ならそのケースのみ、`describe/context`ブロックなら、そのテストケースグループのみを実行してくれます。
つまり、vimのカーソル行を取得してrspecのオプションに渡せばオッケーです。

## 設定例

```vim:.vimrc
" quickrunの出力結果にAnsiEscを実行して色付けする
autocmd FileType quickrun AnsiEsc

" quickrunの実行モジュールをvimprocに設定する
let g:quickrun_config = {}
let g:quickrun_config._ = {'runner' : 'vimproc'}

" rspecを実行するための設定を定義する
" %cはcommandに設定した値に置換される
" %oはcmdoptに設定した値に置換される
" %sはソースファイル名に置換される
let g:quickrun_config['rspec/bundle'] = {
  \ 'type': 'rspec/bundle',
  \ 'command': 'rspec',
  \ 'outputter': 'buffered:target=buffer',
  \ 'exec': 'bundle exec %c %o --color --drb --tty %s'
  \}
let g:quickrun_config['rspec/normal'] = {
  \ 'type': 'rspec/normal',
  \ 'command': 'rspec',
  \ 'outputter': 'buffered:target=buffer',
  \ 'exec': '%c %o --color --drb --tty %s'
  \}

" :QuickRunで実行されるコマンドをrspec用の定義に設定する
" <Leader>lrをタイプした時に、:QuickRun -cmdopt "-l (カーソル行)"を実行するキーマップを定義する ← これがポイント
function! RSpecQuickrun()
  let b:quickrun_config = {'type' : 'rspec/bundle'}
  nnoremap <expr><silent> <Leader>lr "<Esc>:QuickRun -cmdopt \"-l " . line(".") . "\"<CR>"
endfunction

" ファイル名が_spec.rbで終わるファイルを読み込んだ時に上記の設定を自動で読み込む
autocmd BufReadPost *_spec.rb call RSpecQuickrun()
```

## 実行結果
![出力結果](http://cdn-ak.f.st-hatena.com/images/fotolife/j/joker1007/20120708/20120708171756_original.png?1341735529)

## まとめ
特定のケースだけ素早くテストを実行することで、
今フォーカスしていないテストの終了を待つ必要がなくなり、
よりスピーディにTDDが行えると思います。

Rubyのテスト環境については、okitanさんによる [テストの自動実行あれこれ #Ruby #開発環境 #AdventCalendar - Qiita](http://qiita.com/items/25238a9b836c14d52cbd) も参照してみてください。

## おまけ
Rubyに限りませんが、dotfiles(設定ファイル)はある程度まとめて、githubで管理しておくと便利です。
私のdotfilesはこんな感じです。
(一部放置されてますが・・・)

[joker1007/dotfiles - Github](https://github.com/joker1007/dotfiles)
Pythonでtest.pyを作るな！

「え？　なんで？」と思われた方もいらっしゃるかもしれませんが、Pythonの標準ライブラリには、[test](http://www.python.jp/doc/2.7/library/test.html)というパッケージがあるので、test.pyやtest.pyがimportするモジュールが、このパッケージを利用するとエラーが発生します。test.pyという名前のスクリプトは極力作らない方がいいです。

実際に試したのが下記のログです。

```console
$ echo from test import support >test.py
$ python test.py
Traceback (most recent call last):
  File "test.py", line 1, in <module>
    from test import support
  File "/tmp/tmp.TWTFmPjXqY/test.py", line 1, in <module>
    from test import support
ImportError: cannot import name support
$ mv test.py test_.py
$ python test_.py
$ 
```

test.pyで`from test import support`を実行するとImportErrorが発生しますが、test_.pyにリネームしてから実行すればエラーにならないことが分かります。

以上、前に引っかかって気をつけていたのに、うっかり忘れて再度引っかかったので自戒を込めて書いたTipsでした。
翌日の0:00のNSDateを受け取る

日付が変わった瞬間にNSTimerを実行したい時とかに使えます。

```objc:

NSDate* nextDate = [NSDate dateWithTimeIntervalSinceNow:1*24*60*60];// 翌日の日付を取得。

NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy/MM/dd"];	// 日付だけ取得できるフォーマットで情報を抽出。

NSString* nextDateString = [dateFormatter stringFromDate:nextDate];
[dateFormatter setDateFormat:@"yyyy/MM/dd hh:mm:ss"];	// 時間を含めたフォーマットで日付を設定する。

NSDate* fireDate = [dateFormatter dateFromString:[NSString stringWithFormat:@"%@ 00:00:00", nextDateString]]; // 翌日の0:00のNSDateが完成。

```

もっと効率の良い方法があったら教えて下さい(^^;
日本語のフォルダ名を英語にする

```sh
sudo apt-get install xdg-user-dirs-gtk
LANG=C xdg-user-dirs-gtk-update
```

ダイアログが表示されたら Update の方を選択します。

Linux 系 OS もずいぶん使いやすくなったもので、
日本語を使うのに苦労することも少なくなってきました。

インストールの時に「日本語」を選択すると、$HOME 内にある
ディレクトリも日本語にしてくれます。

でもこれ、コマンドラインメインで操作するには逆に面倒ですよね。
そんなときにこの tips を使ってみてください。
Node.js でも Webブラウザでも利用できる ライブラリのイントロ

Web で動く前提のライブラリだけど、node のコンソールで叩いて検証した事はよくある。[async.js](https://github.com/caolan/async/blob/master/lib/async.js) のソース見て、「ああ、こうすればよかったのか」感銘を受けたので。

``` javascript:intro.js
(function(root) { // 引数の root はグローバルオブジェクト
  var myModule = {},

      // もし先に同じ名前のオブジェクトが当てられていた場合の対策
      oldMyModule = root.myModule; 

  if (typeof module !== 'undefined' && module.exports) { // Node.js の場合
    module.exports = myModule;
  } else { // ブラウザの場合
    root.myModule = myModule;
  }

  // 衝突対策
  myModule.noConflict = function() {
    root.myModule = oldMyModule;
    return myModule;
  };

  // 以下モジュールのAPI の宣言
})(this); // トップレベルでの this はグローバルオブジェクトを指す
```

`require` 不要なスタンドアロンのライブラリだとこれでよい

## おまけ

``` javascript
(function(exports) {
   // モジュールの API を宣言する
})(typeof exports === 'undefined' ? (myModule = {}) : exports);
```

↑ の書き方もよく見るけど、こっちの場合 `myModule` をグローバルにダイレクトに代入してるので、先の例のような `noConflict()` のような対応が出来ないのと、JsLint は確実に怒るやり方なので冒頭の書き方の方がやっぱり良いなって思う
第一回 オフラインリアルタイムどう書くの解答例 rubyで。3度目。

http://qiita.com/items/5dfd820a4047376c3bf3
あんまりカッコ良かったので、同じ趣旨のものを rubyでも書いてみました。

```ruby
#!ruby

OX=%w( o x )

def titato( str )
  b=[ 0xb6, 0xee, 0x5e, 0xf5, 0x2d, 0xdd, 0x73, 0xeb, 0x9b ].map{ |i| i*0x101 }
  9.times{ |ix|
    hand=str[ix].to_i-1
    side=ix & 1
    return "Faul : #{OX[side^1]} won." if 0!=b[hand]>>16
    b[hand] |= -1&~(0xff<<(side*8))
    return "#{OX[side]} won." if 0!= 0xffff&b.inject(&:&)
  }
  "Draw game."
end

DATA.each{ |line|
  next unless /(\d+)/===line
  puts "%12s -> %s"%[$1,titato($1)]
}

__END__
79538246	x won.
35497162193	x won.
61978543	x won.
254961323121	x won.
6134278187	x won.
4319581 Foul : x won.
9625663381  Foul : x won.
7975662 Foul : x won.
2368799597  Foul : x won.
18652368566 Foul : x won.
965715  o won.
38745796    o won.
371929  o won.
758698769   o won.
42683953    o won.
618843927   Foul : o won.
36535224    Foul : o won.
882973  Foul : o won.
653675681   Foul : o won.
9729934662  Foul : o won.
972651483927    Draw game.
5439126787  Draw game.
142583697   Draw game.
42198637563 Draw game.
657391482   Draw game.
```

if((b[n] ^ (b[n] >> 8)) & 0xffu) の部分のロジックを変えましたが、だいたい同じです。
C++ へ再移植の場合には int が 16bit の環境に注意です。
オフラインどう書く。Haskellで書いたのと同じ事をCでやってみた

[こちら](http://qiita.com/items/73ef781ec9d007704255)にコメントしたHaskellのコードを、暇だったので久しぶりにCでもやってみる。

もとのHaskellのコード

```Haskell:Tick-Tack-Toe.hs
{-# LANGUAGE OverloadedStrings, BangPatterns, ViewPatterns #-}
import Data.Word (Word16)
import Data.Bits ((.|.),(.&.),setBit,testBit)
import Data.Ix (index)

solve :: String -> String
solve = go 'o' 'x' 0 0
  where
    go :: Char -> Char -> Word16 -> Word16 -> String -> String
    go _ _ _ _ [] = undefined -- 勝敗が決まらないまま終了
    go color oponent mhands ohands ((index ('0', '9') -> x):xs)
      | testBit (mhands .|. ohands) x = "Foul:" ++ [oponent] ++ " won."
      | or (map (\x -> x .&. mhands' == x) goals) = [color] ++ " won."
      | (mhands' .|. ohands) == 0x3fe = "Draw game."
      | otherwise = go oponent color ohands mhands' xs
      where
        mhands' = setBit mhands x
        goals = map (foldl setBit 0) [[1,2,3],[4,5,6],[7,8,9],[1,4,7],[2,5,8],[3,6,9],[1,5,9],[3,5,7]]

main :: IO ()
main = getContents >>= mapM_ (putStrLn . solve) . lines 
```

Cのコード

```C:Tick-Tack-Toe.c
#include <stdbool.h>
#include <stdio.h>
#include <stdint.h>

int main(int argc, char *argv[])
{
	bool side = true;
	uint16_t my_hands = 0x0000;
	uint16_t oponent_hands = 0x0000;
#define g(a,b,c) ((1 << (a)) | (1 << (b)) | (1 << (c)))
	static const uint16_t goals[] = { g(1,2,3), g(4,5,6), g(7,8,9), g(1,4,7), g(2,5,8), g(3,6,9), g(1,5,9), g(3,5,7) };

	char *p;
	for (p = argv[1]; *p; p++) { /* IOが面倒なので引数で受け取る。テストはxargsで */
		uint16_t const *pp;
		int n = *p - '0';
		if ((my_hands | oponent_hands) & (1 << n)) {
			printf("Foul: %c won.\n", side? 'x' : 'o');
			goto fin;
		}
		my_hands |= 1 << n;
		for (pp = goals; pp < goals + (sizeof(goals) / sizeof(*goals)); pp++) {
			if ((my_hands & *pp) == *pp) {
				printf("%c won.\n", side? 'o' : 'x');
				goto fin;
			}
		}
		if ((my_hands | oponent_hands) == 0x3fe) {
			puts("Draw game.");
			goto fin;
		}

		side = !side;
		{ // swapってどこで定義されてたんだっけか.....
			uint16_t tmp = my_hands;
			my_hands = oponent_hands;
			oponent_hands = tmp;
		}
	}
	puts("No game."); /* 勝敗がつかないケース */

fin:    return 0;
}
```

久しぶりのCだったのでいろいろグダってしまった。
型をいちいち明示しないといけないのが面倒と感じるあたり、だいぶ染まってしまったというか、Haskell以外愛せない体になってしまったというか...
Emacsで hl-line-mode にしたらカーソル行の文字色が固定されちゃったので直しました

Emacsでカーソル行をハイライトするモード`hl-line-mode`を使っていたら、元々なのか途中からそうなってしまったのか定かではありませんが、プログラム用にハイライトされていてもカーソル行の文字色だけ全て同じになっていて見づらいことこの上無かったので直しました。というかいじってたら勝手に直りました。

で、直し方なんですが、`hl-line+.el`を入れたら直りました。ただ、他にもいじってたので本当にこれが原因なのか分かりません。

僕の環境はMacのiTerm2でEmacs24を使ってます。
Chromeで拡張なしでキーボードだけでリンク移動する方法

1. Command(WindowsならControl)+f で移動したいリンクのキーワードを入力する。
2. Enter or Shift+Enter で移動したいリンクにフォーカスをあてる。
3. Escape で検索を終了する。
4. Enterでリンク移動

※他のブラウザでも出来るかも知れませんが試してないです。
※画像のリンクは出来ません。近くのリンクにフォーカスしてからTab or Shift+Tabでフォーカス当てれば出来ます。が、そうするくらいならトラックパッドなりマウスなり使う人が多そう。
※↑これを応用してテキストエリアにフォーカス当てることもできます。
※書いた後に「これってプログラミング知識でもなんでもねぇな」って思ったけどキーボード操作とプログラマは仲良しなんでいいよね。
yasnippet の新しいスニペットをリージョンから作成する

[yasnippet](http://capitaomorte.github.com/yasnippet/) は Emacs でコードを書くときに便利なツール。短い文字列を定義されたスニペットに応じて展開してくれる。

この新しいスニペットを作成するために、関数 yas/new-snippet が用意されているのだが、コードを書いてる時に「ここをスニペットにしておくと今後便利かもしれない」と思うことがあると思う。そういう時のために、新規スニペット作成用のバッファにリージョンの内容を展開する Elisp を書いた。

```cl
(defun yas/new-snippet-region (&optional start end no-template)
  "Pops a new buffer for writing a snippet.

Expands a snippet-writing snippet, unless the optional prefix arg
NO-TEMPLATE is non-nil."
  (interactive "rP")
  (let ((yas/region-string (buffer-substring-no-properties start end))
        (guessed-directories (yas/guess-snippet-directories)))

    (switch-to-buffer "*new snippet*")
    (erase-buffer)
    (kill-all-local-variables)
    (snippet-mode)
    (yas/minor-mode 1)
    (set (make-local-variable 'yas/guessed-modes) (mapcar #'(lambda (d)
                                                              (intern (yas/table-name (car d))))
                                                          guessed-directories))
    (unless no-template (yas/expand-snippet (format "\
# -*- mode: snippet -*-
# name: $1
# key: ${2:${1:$(replace-regexp-in-string \"\\\\\\\\(\\\\\\\\w+\\\\\\\\).*\" \"\\\\\\\\1\" yas/text)}}
# --
%s$0" yas/region-string)))))
```

使い方は、リージョンを指定して M-x yas/new-snippet-region でOK。

「書いた」といっても、yas/new-snippet に (interactive "r") を追加してその間の文字列を文字列内に挿入しているだけ。また、自分は name: と key: 以外はスニペットに書くことがほとんどないので、テンプレートから残りの項目を削除している。必要なら最後の文字列を元の yas/new-snippet を参照して変更すればいい。

このコードは現在の最新版であるバージョン 0.7 の yas/new-snippet を参考に書いた。yasnippet はコロコロ仕様が変わるから、0.6 系だとおそらく動かない。
漢らしいC++によるどう書く、再び

[先に書いたコード](http://qiita.com/items/d7427ab7d43f1d479405)に、鍋谷さんから「漢らしいC++」との評を頂いてしまいました。ありがとうございます。
もっと漢らしくしてみました（爆）。
なんだかもう呪文みたいになってしまってます。

```
#include <iostream>
#include <string>

enum Result { FAUL_X_WON, FAUL_O_WON, O_WON, X_WON, DRAW_GAME };

Result doukaku(const std::string& t)
{
    unsigned int b[9] = { 0xb6b6u, 0xeeeeu, 0x5e5eu, 0xf5f5u, 0x2d2du, 0xddddu, 0x7373u, 0xebebu, 0x9b9b };
    for(int i = 0; i < 9; ++i)
    {
        int n = t[i] - '0' - 1;
        int p = i % 2;
        if((b[n] ^ (b[n] >> 8)) & 0xffu)
        {
            return static_cast<Result>(p);
        }
        b[n] |= 0xffu << (8 * p);
        if(b[0] & b[1] & b[2] & b[3] & b[4] & b[5] & b[6] & b[7] & b[8])
        {
            return static_cast<Result>(p + 2);
        }
    }
    return DRAW_GAME;
}

int main(int, char* [])
{
    std::string s;
    while((std::cin >> s).good())
    {
        switch(doukaku(s))
        {
        case FAUL_X_WON: std::cout << "Faul: x won.\n"; break;
        case FAUL_O_WON: std::cout << "Faul: o won.\n"; break;
        case X_WON:      std::cout << "x won.\n";       break; 
        case O_WON:      std::cout << "o won.\n";       break;
        default:         std::cout << "Draw game.\n";   break;
        }
    }

    return 0;
}
```
第一回 オフラインリアルタイムどう書く

[第一回 オフラインリアルタイムどう書く](http://atnd.org/events/30285)という勉強会があったそうです。
残念ながら僕は参加できなかったんですが、[当日のお題](http://nabetani.sakura.ne.jp/hena/1/)をHaskellで解いてみました。
なるべくシンプルに実装したつもりです。

```haskell:toukaku.hs
module Main where

import Data.List (transpose, insert)

data Cell   = O | X | None deriving (Eq, Show, Ord, Enum)
type Board  = [Cell]
data Result = OWon | XWon | FoulOWon | FoulXWon | Draw deriving Enum

instance Show Result where
  show OWon     = "o won."
  show XWon     = "x won."
  show FoulOWon = "Foul: o won."
  show FoulXWon = "Foul: x won."
  show Draw     = "Draw game."

main :: IO ()
main = mapM_ (print . judge) . lines =<< getContents

judge :: String -> Result
judge = judge' O (replicate 9 None) . take 9 . map (subtract 49 . fromEnum)

judge' :: Cell -> Board -> [Int] -> Result
judge' _ _ []     = Draw
judge' c b (i:is) = case put c i b of
  Nothing -> toEnum (3 - fromEnum c)
  Just b' -> if win c b'
    then toEnum $ fromEnum c
    else judge' (toEnum (1 - fromEnum c)) b' is

win :: Cell -> Board -> Bool
win c b = any (all (== c)) $ mat ++ transpose mat ++ map (zipWith (!!) mat) [[0,1,2], [2,1,0]]
  where
    mat = take 3 . map (take 3) $ iterate (drop 3) b

put :: Cell -> Int -> Board -> Maybe Board
put c n b = case b !! n of
  None -> Just . map snd . insert (n, c) . filter ((/= n) . fst) $ zip [0..] b
  _    -> Nothing
```
第一回 オフラインリアルタイムどう書く解答(ruby & CoffeeScript)

第一回 オフラインリアルタイムどう書く( http://atnd.org/events/30285 )。
問題は http://nabetani.sakura.ne.jp/hena/1/

会場で書いたものをちょっと手直し

```Ruby:hena1.rb
ox = ['o','x']
checks = [[0,1,2],[3,4,5],[6,7,8],[0,3,6],[1,4,7],[2,5,8],[0,4,8],[2,4,6]]
DATA.readlines.each do |data|
  no,prob,ans = data.chop.split("\t")
  board = Array.new(9)
  result = nil
  prob.split('').each_with_index do |e, i|
    break if i >= 9
    pos = e.to_i - 1
    if board[pos]
      result = "Foul : #{ox[1-(i%2)]} won."
      break
    end
    board[pos] = (i%2)
    checks.each do |x,y,z|
       next unless board[x]
       result = "#{ox[i%2]} won."  if board[x] == board[y] && board[y] == board[z]
    end
    break if result
  end
  result = "Draw game." unless result
  puts prob + " => " + result
  puts "wrong?" + ans  unless result == ans
end
__END__
1	79538246	x won.
2	35497162193	x won.
3	61978543	x won.
4	254961323121	x won.
5	6134278187	x won.
6	4319581	Foul : x won.
7	9625663381	Foul : x won.
8	7975662	Foul : x won.
9	2368799597	Foul : x won.
10	18652368566	Foul : x won.
11	965715	o won.
12	38745796	o won.
13	371929	o won.
14	758698769	o won.
15	42683953	o won.
16	618843927	Foul : o won.
17	36535224	Foul : o won.
18	882973	Foul : o won.
19	653675681	Foul : o won.
20	9729934662	Foul : o won.
21	972651483927	Draw game.
22	5439126787	Draw game.
23	142583697	Draw game.
24	42198637563	Draw game.
25	657391482	Draw game.
```

CoffeeScriptに移植。ほとんどそのままの簡単移植。次回はCoffeeScriptにしようかな。

```CoffeeScript:hena1.coffee
ox = ['o','x']
checks = [[0,1,2],[3,4,5],[6,7,8],[0,3,6],[1,4,7],[2,5,8],[0,4,8],[2,4,6]]
solve = (prob)->
  board = []
  for posStr, i in prob.split('')
    break if i >= 9
    pos = Number(posStr) - 1
    if board[pos]?
      result = "Foul : #{ox[1-(i%2)]} won."
      break
    board[pos] = (i%2)
    for [x,y,z] in checks
       continue unless board[x]?
       result = "#{ox[i%2]} won."  if board[x] == board[y] && board[y] == board[z]
    break if result
  result = "Draw game." unless result?
  result 

probs = '''
1	79538246	x won.
2	35497162193	x won.
3	61978543	x won.
4	254961323121	x won.
5	6134278187	x won.
6	4319581	Foul : x won.
7	9625663381	Foul : x won.
8	7975662	Foul : x won.
9	2368799597	Foul : x won.
10	18652368566	Foul : x won.
11	965715	o won.
12	38745796	o won.
13	371929	o won.
14	758698769	o won.
15	42683953	o won.
16	618843927	Foul : o won.
17	36535224	Foul : o won.
18	882973	Foul : o won.
19	653675681	Foul : o won.
20	9729934662	Foul : o won.
21	972651483927	Draw game.
22	5439126787	Draw game.
23	142583697	Draw game.
24	42198637563	Draw game.
25	657391482	Draw game.
'''
for line,i in probs.split("\n")
  [seq, prob, ans] = line.split("\t")
  console.log prob + " => " + solve(prob)
```
第一回 オフラインリアルタイムどう書くの解答例 rubyで。二度目。

第一回 オフラインリアルタイムどう書く( http://atnd.org/events/30285 )。
問題は http://nabetani.sakura.ne.jp/hena/1/
当日その場で書いたもの。

```ruby
#!ruby
#coding:utf-8

data= <<DATA.enum_for( :scan, /\d{3,}/ ).map{|i| i.chars.map{ |c| c.to_i } }
1	79538246	x won.
2	35497162193	x won.
3	61978543	x won.
4	254961323121	x won.
5	6134278187	x won.
6	4319581	Foul : x won.
7	9625663381	Foul : x won.
8	7975662	Foul : x won.
9	2368799597	Foul : x won.
10	18652368566	Foul : x won.
11	965715	o won.
12	38745796	o won.
13	371929	o won.
14	758698769	o won.
15	42683953	o won.
16	618843927	Foul : o won.
17	36535224	Foul : o won.
18	882973	Foul : o won.
19	653675681	Foul : o won.
20	9729934662	Foul : o won.
21	972651483927	Draw game.
22	5439126787	Draw game.
23	142583697	Draw game.
24	42198637563	Draw game.
25	657391482	Draw game.
DATA

def side( ix )
  %w( o x )[ix%2]
end

def line( board, st, dir )
  c=(0..2).map{ |d|
    position=(0..1).map{ |i| st[i]+dir[i]*d }.join
    return false unless ( r = board[ position ] )
    r
  }.join
  c=='xxx' || c=='ooo'
end

def completed( board )
  [ [2,0],[1,0],[0,0],[0,1],[0,2] ].any?{ |st|
    [ [0,1],[1,0],[1,1],[-1,1] ].any?{ |dir|
      line( board, st, dir )
    }
  }
end
  
def titato( game )
  board={}
  game.each_with_index{ |h,ix|
    position=[(h-1)%3,(h-1)/3].join
    return "Foul : #{side(ix+1)} won." if board[position]
    board[position]=side(ix)
    return "#{side(ix)} won." if completed(board)
    return "Draw game." if ix==8
  }
end

data.each{ |game|
  puts titato( game )
}
```

今までに書いたのとは経路を変えようということで、一列揃っているかどうかの判断を変えてみた。
八通りしかないから全部書こうという作戦をやめ、まっすぐ並んだ三マスとはどういうものかを計算するようにした。遅いけど。

書いてみたところ、これは any? の使い所だ、と気づき、 any? に書き換えた。
第一回 オフラインリアルタイムどう書く の問題の解答例 rubyで。

第一回 オフラインリアルタイムどう書く( http://atnd.org/events/30285 )。
問題は http://nabetani.sakura.ne.jp/hena/1/
この問題にしようと決めてから最初に書いたもの。

```ruby
#!ruby
#coding:utf-8

data= <<DATA.enum_for( :scan, /\d{3,}/ ).map{|i| i.chars.map{ |c| c.to_i } }
1	79538246	x won.
2	35497162193	x won.
3	61978543	x won.
4	254961323121	x won.
5	6134278187	x won.
6	4319581	Foul : x won.
7	9625663381	Foul : x won.
8	7975662	Foul : x won.
9	2368799597	Foul : x won.
10	18652368566	Foul : x won.
11	965715	o won.
12	38745796	o won.
13	371929	o won.
14	758698769	o won.
15	42683953	o won.
16	618843927	Foul : o won.
17	36535224	Foul : o won.
18	882973	Foul : o won.
19	653675681	Foul : o won.
20	9729934662	Foul : o won.
21	972651483927	Draw game.
22	5439126787	Draw game.
23	142583697	Draw game.
24	42198637563	Draw game.
25	657391482	Draw game.
DATA

SIDE=%w( o x )

def comp( n )
  [
   7, 7*8, 7*64, #horizontals
   (1+8+64), (1+8+64)*2, (1+8+64)*4, #verticals
   (1+16+256), (4+16+64) # diagonal
  ].each{ |s|
    return true if s==s&n
  }
  false
end

def titato( seq )
  b=[0,0]
  seq.map{ |i| i.to_i-1 }.each_with_index{ |c,ix|
    s=ix%2
    return "Foul : #{SIDE[1-s]} won." if 0!=(b[1-s]|b[s])[c]
    b[s]=b[s]|(1<<c)
    return "#{SIDE[s]} won." if comp(b[s])
    return "Draw game." if b[0]|b[1] == 2**9-1
  }
  "In play."
end

data.each{ |game|
  puts titato( game )
}
```

戦略としては、

* 盤面に o と x を書いていく
* o の位置と x の位置を別々に記録

という2つがあるなと思い、後者で行こうと。
後者で行くなら、その位置に打った/打たないの二値なのでビットで。
そういえば ruby にはビット演算が便利にできる演算子あったよな、という。

しかし当日。データをソースコードに埋めるもっといい方法があることに気付かされ、勉強になったなぁという気分。

to_i をした後のデータに to_i しているのもとほほな感じ。
呼び出し元をオーバーライドするメソッド

以下のコードでは override メソッドが呼び出し元をオーバーライドしている。

```ruby
class MyClass
  def override
    if /^(.+?):(\d+)(?::in `(.*)')?/ =~ caller.first
      self.class.instance_eval {
        define_method($3) { "overrided" }
      }
    end
  end

  def method
    override
    "overriding"
  end
end

cls = MyClass.new
cls.method                      # => "overriding"
cls.method                      # => "overrided"
cls.method                      # => "overrided"
```

あまり実用的では無いかもしれないが、このコードには

- 呼び出し元のメソッド名を得る方法
- 動的にメソッドを定義する方法

が記述されていて、案外学べることは多い。