OmniAICreator/Qiita-1.07M huggingface dataset:
NSViewのサイズ変更通知

NSViewのサブクラスでサイズ変更を検出するには、特定のメソッドをオーバーライドするのではなく、NSNotificationCenterを使う。もちろん、この方法ではサブクラスでなくても通知を受けることが出来る。
-[NSView initWithFrame:]などでNSNotificationCenterに登録する。

```objectivec
[[NSNotificationCenter defaultCenter] addObserverForName:NSViewFrameDidChangeNotification
                                                  object:self
                                                   queue:[NSOperationQueue mainQueue]
                                              usingBlock:^(NSNotification *note){ /* 処理 */ }];
```

Blocksを使わなければこう。

```objectivec
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(hoge:)
                                             name:NSViewFrameDidChangeNotification
                                           object:self];
```

通知を受け取るメソッド(例ではhoge:)は第一引数にNSNotification*をとる必要がある。

NSOpenGLViewには-updateや-reshapeがあるので、NSViewにもそういうのがあるかと思っていた。
まぁ、もしそうならわざわざNSOpenGLViewで宣言したりしないよね。
文字列の部分一致とデフォルト値のイディオム

[【論理演算子】｜｜のデフォルト値を与えるイディオム](http://qiita.com/items/8c7ee7781634eff1d180) の変化形です。
ある文字列に正規表現がマッチするなら一致部分を、そうでないならデフォルト値を与えます。

```ruby
""[/[A-Za-z]+/] || "default"
#=> "default"
"ATOZ"[/[A-Za-z]+/] || "default"
#=>"ATOZ"
"AtoZ"[/[A-Za-z]+/] || "default"
#=> "AtoZ"
"009"[/[A-Za-z]+/] || "default"
#=> "default"
```
これはStringオブジェクトに[]を与えると、一致部分もしくは不一致の場合にnilが返却されることを利用しています。[]の引数にはRegexpだけでなく範囲指定や文字列指定も可能です。
[instance method String#[]](http://doc.ruby-lang.org/ja/1.9.3/method/String/i/=5b=5d.html)
Mac OS Xでデスクトップのアイコンの表示・非表示を切り替えるスクリプト


実行すると一時的にデスクトップの全アイコンを消すことができる。もう一度実行すると元に戻る。プレゼンテーションを行うときなどに便利。

```bash:cleardesk.sh
#!/bin/sh

ICON_STATUS=`defaults read com.apple.finder CreateDesktop`
if [ $ICON_STATUS -eq 0 ]
then
	NEW_STATUS=true
	echo デスクトップのアイコンを表示します。
else
	NEW_STATUS=false
	echo デスクトップのアイコンを非表示にします。
fi

defaults write com.apple.finder CreateDesktop -boolean $NEW_STATUS
killall Finder
```

動作確認はMac OS X 10.8で行った。

## 参考

- [ Macでデスクトップから一切のアイコンを消す ] (http://qiita.com/items/397cb77652223b0a1348)
コマンドライン上で手軽に16進計算

10進/16進の変換なら `printf` コマンドでフォーマット変換する方法があります。

```console
$ alias hex2dec="printf '%d\n'"
$ alias dec2hex="printf '%x\n'"

$ hex2dec 0x64 0xC9 0x14
100
201
20

$ dec2hex 100 201 20
64
c9
14
```

`bc` コマンドをつかうと、16進（任意の基数）での計算ができます。

```console
$ echo "obase=10;ibase=16;FF00+FF" | bc
65535
$ echo "obase=16;ibase=16;100*100*100-1" | bc
FFFFFF
$ echo "obase=2;ibase=16;F0-1" | bc
11101111
```

`ibase` が入力値の基数で、`obase` が出力値の基数です。`obase` の値は直前の `ibase` で指定した基数で評価されますので、`ibase` は最後に指定するとよいです。

```console
# 出力値は10進のつもりだが、16進(ibase=16)の 0x10 で評価されている
$ echo "ibase=16;obase=10;FF" | bc
FF
# 16進なら 0x0A で指定
$ echo "ibase=16;obase=0A;FF" | bc
255
# ややこしくなるので ibase を最後に指定するとよい
$ echo "obase=10;ibase=16;FF" | bc
255
```
CakePHP: 2.3.0で導入された blowfish/bcrypt を使用したパスワードのハッシュを試す

まず AppController.php の beforeFilter() あたりでどのような値が返ってくるのか見てみます。blowfish/bcrypt を使用したパスワードのハッシュをしたい場合は Security クラスの hash() メソッドにアクセスします。詳しくは [lib/Cake/Utility/Security.php](https://github.com/cakephp/cakephp/blob/master/lib/Cake/Utility/Security.php)

~~~php:AppController.php
<?php
App::uses('Controller', 'Controller');
App::uses('Security', 'Utility');

class AppController extends Controller {
    public function beforeFilter() {
        var_dump(Security::hash('strongestpasswordintheworld', 'blowfish'));
        // string '$2a$10$CTCaBgYErd/QJwSF6w2yHuTPHv.Tx1emg8EdD.bwoMADQPtkGyoiG' (length=60)
    }
}
~~~

長さは 60 の固定で、いくつかの記号も使われていたりします。md5, sha1, sha256 などよりも強そうです。また blowfish/bcrypt を使用する場合 hashCost というものも設定できます (範囲は 4 〜 31 までの数値) 。デフォルトは 10 です。以下のように設定します。

~~~php:AppController.php
<?php
App::uses('Controller', 'Controller');
App::uses('Security', 'Utility');

class AppController extends Controller {
    public function beforeFilter() {
        Security::setCost(15); // 追加
    }
}
~~~

15 に設定して実行するとわかりますが、ページの読み込みが終了するまでかなり時間がかかります。hashCost の数値は高ければ高いほどパスワードがバレたときに解析に時間がかかると予想されますが、その分負荷がかかるので、上手くバランスを見て設定する必要がありそうです。

## ログイン時に blowfish/bcrypt を使う例

~~~php:AppController.php
<?php
App::uses('Controller', 'Controller');
App::uses('Security', 'Utility');

class AppController extends Controller {
    public $components = array(
        'Auth' => array(
            'authenticate' => array(
                'Blowfish',
            ),
        ),
    );
}
~~~

beforeFilter() で設定するのかな？と思っていたんですが、上記のように設定するみたいです。詳しくは [Using bcrypt for passwords](http://book.cakephp.org/2.0/en/core-libraries/components/authentication.html#using-bcrypt-for-passwords) に書かれています。ユーザの登録時などのサンプルコードもあるので参考になりました。

## その他 2.3.0 での変更点など

認証まわりの変更なども含めて [CakePHP 2.3.0 がリリースされました!  -  The Bakery, なんでもCakePHP！](http://bakery.cakephp-users.jp/2013/01/29/cakephp_2_3_0_is_out/) を参考にしました。翻訳ありがとうございます！ 

## その他 パスワード関連の記事

* [ハッシュとソルト、ストレッチングを正しく理解する 本当は怖いパスワードの話](http://www.atmarkit.co.jp/fsecurity/special/165pswd/01.html)
* [第40回　MOPS：安全性の高いパスワードハッシュ作成ツール - phpass：なぜPHPアプリにセキュリティホールが多いのか?｜gihyo.jp … 技術評論社] (http://gihyo.jp/dev/serial/01/php-security/0040)
SBCL 1.1.4変更点まとめ

# 最適化

* "of-type character"を使っているloopが少しだけ効率的になりました。

# バグ修正

* とても長い（あるいは無限の長さを持つ）リストの定数をdolistで使ったとき、コンパイルにとても時間がかかったり、ヒープが枯渇することがなくなりました。（[#1095488](https://bugs.launchpad.net/sbcl/+bug/1095488)）
* `#3(1)が#(1)ではなく#(1 1 1)と読まれるようになりました。（[#1095918](https://bugs.launchpad.net/sbcl/+bug/1095918)）
* adjust-arrayがsimple-vectorsを扱うとき:initial-elementを無視していました。（[#1096359](https://bugs.launchpad.net/sbcl/+bug/1096359)）
* initargsにリストのリテラルを伴うmake-instanceの最適化で、（循環しているデータの場合に）無限ループしたり、eqlity constraintsに違反することがなくなりました。（[#1099708](https://bugs.launchpad.net/sbcl/+bug/1099708)）
* firstが展開されていませんでした。（1.1.0からのリグレッション）
groongaでキーワードごとに重み付けをして検索するには

# はじめに

2013年1月29日にオープンソースの[カラムストア機能付き全文検索エンジンgroonga](http://groonga.org/ja/) 2.1.2をリリースしました。

そこで2.1.2で新規に追加された複数の[query()関数](http://groonga.org/ja/docs/reference/functions/query.html)のサポートを使って、キーワードごとに重み付けをして検索する方法を紹介します。

# サンプルスキーマとデータ

例で使うテーブルのスキーマは以下の通りです。

```
table_create Users TABLE_NO_KEY
column_create Users name COLUMN_SCALAR ShortText
column_create Users memo COLUMN_SCALAR ShortText

table_create Lexicon TABLE_HASH_KEY ShortText \
  --default_tokenizer TokenBigramSplitSymbolAlphaDigit \
  --normalizer NormalizerAuto
column_create Lexicon users_name COLUMN_INDEX|WITH_POSITION Users name
column_create Lexicon users_memo COLUMN_INDEX|WITH_POSITION Users memo
```

例で使うテーブルのデータは以下の通りです。
Usersテーブルのnameカラムとmemoカラムにデータを登録します。

```
 load --table Users
 [
 {"name": "Alice", "memo": "groonga user"},
 {"name": "Alisa", "memo": "mroonga user"},
 {"name": "Bob",   "memo": "rroonga user"},
{"name": "Tom",   "memo": "nroonga user"},
{"name": "Tobby", "memo": "groonga and mroonga user. mroonga is ..."},
]
```

まずは、Usersテーブルのnameカラムからキーワード"alice"を全文検索するクエリの例を示します。(nameカラムで合致したデータに対する重みづけとして10をこのサンプルでは指定します)

query()関数を使ったクエリは以下のように書くことができます。

```
select Users \
  --output_columns name,_score \
  --filter 'query("name * 10", "alice")'
```

Usersテーブルからnameカラムに10の重み付け``"name * 10"``を行い、キーワード"alice"を全文検索します。
結果としてマッチしたnameカラムの値と、マッチした場合のスコア(``_score``)を表示します。
条件にマッチするほど``_score``の値は大きくなります。

ではいくつかキーワードが与えられていて、そのキーワードに異なる重みづけをして全文検索を行いたいときにはどうなるでしょうか。

``query()``関数を使って、以下のようにキーワードごとに重み付けをしてmemoカラムを検索してみます。
groongaもしくはmroongaを使っているuserで、mroongaを最も重視する、という例です。

|全文検索対象のキーワード|キーワードに対する重み付けの値|
|:-----------------------|------------------------------|
|groonga                 | 10                           |
|mroonga                 | 20                           |
|user                    | 1                            |

実際のクエリは以下のように書くことができます。

```
select Users \
  --output_columns name,memo,_score \
  --filter 'query("memo * 10", "groonga") || query("memo * 20", "mroonga") || query("memo * 1", "user")' \
  --sortby -_score
```

クエリの結果では重みづけを行っているのでmroongaがより上位に来ていることがわかります。

```
[
 ["name","ShortText"],["memo","ShortText"],["_score","Int32"]
],
["Tobby","groonga and mroonga user. mroonga is ...",51],
["Alisa","mroonga user",21],
["Alice","groonga user",11],
["Tom","nroonga user",1],
["Bob","rroonga user",1]
```

このように``query()``関数を使うことで、キーワードの重要度に応じて検索結果を得られるようになりました。

# まとめ

groonga 2.1.2で追加されたquery()関数を使って、キーワードごとに重み付けを行って検索する例を紹介しました。

groongaに興味を持ったなら、まずは[インストール](http://groonga.org/ja/docs/install.html)して試してみてください。

[チュートリアル](http://groonga.org/ja/docs/tutorial.html)も用意しています。
emacsでその場で一行スクロールする

M-n, M-pでその場で一行スクロールする。

```cl
(global-unset-key "\M-p")
(global-unset-key "\M-n")

(defun scroll-up-in-place (n)
  (interactive "p")
  (previous-line n)
  (scroll-down n))

(defun scroll-down-in-place (n)
  (interactive "p")
  (next-line n)
  (scroll-up n))

(global-set-key "\M-p" 'scroll-up-in-place)
(global-set-key [M-up] 'scroll-up-in-place)
(global-set-key "\M-n" 'scroll-down-in-place)
(global-set-key [M-down] 'scroll-down-in-place)
```
LVM の dm-0 とかの表示をデバイス名に読み替える

参考 → [linux - What is this dm-0 device? - Super User](http://superuser.com/questions/131519/what-is-this-dm-0-device "linux - What is this dm-0 device? - Super User")

```console
# lvdisplay|awk  '/LV Name/{n=$3} /Block device/{d=$3; sub(".*:","dm-",d); print d,n;}'
dm-0 /dev/vg00/lv_root
dm-1 /dev/vg00/lv_swap
```

`lvdisplay` の応答が遅くてもっさりするので `dmsetup ls` を使うように変更。

```console
# dmsetup ls | perl -ne 'print "dm-$2\t$1\n" if /^(\S+)\s+\(\d+[:,]\s*(\d+)\)$/'
dm-1	vg00-lv_swap
dm-0	vg00-lv_root
```

あるいは `dmsetup ls --tree` でも可。

```console
# dmsetup ls --tree | perl -ne 'print "dm-$2\t$1\n" if /^(\S+)\s+\(\d+:(\d+)\)$/'
dm-1	vg00-lv_swap
dm-0	vg00-lv_root
```

CentOS6 なら `/sys/block/dm-*/dm/name` を見るだけでOK。

```console
# for i in $(ls -d /sys/block/dm-*); do echo -e "$(basename $i)\t$(cat $i/dm/name)"; done
dm-0	vg00-lv_root
dm-1    vg00-lv_swap
```

[@satoh_fumiyasu](https://twitter.com/satoh_fumiyasu/status/296853630756216832) さんに指摘いただいて追記。RHEL6 や CentOS6 なら `ls -l /dev/mapper/` だけで人が見る分には十分。

```console
# ls -l /dev/mapper/
lrwxrwxrwx 1 root root      7 11月 12 20:08 2012 vg00-lv_root -> ../dm-0
lrwxrwxrwx 1 root root      7 11月 12 20:08 2012 vg00-lv_swap -> ../dm-1
```
よく使う汎用jQuery：：ホバーボタン


```test.html
<img src="/img/off/hoge.gif">
<!-- 下記ボタンは動作しない -->
<img src="/img/off/hage.gif" class="not_hover">
```

```common.js
	//  /img/off/と/img/on/にある同一ファイル名の画像を切り替える
	$("img:not(.not_hover), input[type='image']:not(.not_hover)")
		.on('mouseenter touchstart', function() {
			$(this).attr("src", $(this).attr("src").replace('/off/', '/on/'));
		})
		.on('mouseleave touchend', function() {
			$(this).attr("src", $(this).attr("src").replace('/on/', '/off/'));
		})
	;
	//  CSS対応
	$(".bg-hover:not(.not_hover)")
		.on('mouseenter touchstart', function() {
			$(this).css("background-image", $(this).css("background-image").replace('/off/', '/on/'));
		})
		.on('mouseleave touchend', function() {
			$(this).css("background-image", $(this).css("background-image").replace('/on/', '/off/'));
		})
	;
```

画像はファイル名を同じにしてonフォルダとoffフォルダへ。
動作させたくない場合はclass="not_hover"
何となくずっと使ってるけど、セレクタをclass指定にした方が軽いかも。
App::build()で参照順を最後にして追加

App::build()でファイルの参照先を追加すると、そこを最初に探査する。

```bootstrap.php
//ビューの参照先を追加
App::build(
    array(
        'View' => array(NEW_VIEW_PATH),
    )
);
```

以下のようにすると、参照する順番を最後にして追加できる。

```bootstrap.php
//ビューの参照先を追加
App::build(
    array(
        'View' => array(NEW_VIEW_PATH),
    ),
    APP::APPEND
);
```
IE9でテーブルの空白セルがはしょられる件について

IE9のtableタグには空白のtdを無視するという許しがたいバグ（仕様？）が存在する。
それを回避するにはempty-cellプロパティを利用して回避する。

参考URL
http://www.htmq.com/style/empty-cells.shtml
Scala+Playの導入が簡単だという話


OSはMacOS Xです。

なんぞ簡単だったのでご紹介します。
結論からいうと、brewでインストールします。

brewで確認してみると、

```bash
% brew search scala
scala
% brew search sbt      
sbt
% brew search play     
play
```

ちゃんと入っています。(上記のコマンドの出力結果はわかりやすく要らないものを削っています)

なので、

```bash
% brew install scala
% brew install sbt      
% brew install play  
```

とするだけでOK。

インストールが終わったら、適当なディレクトリを作ります。

```bash
% mkdir ./Projects/Scala/play_work
% cd ./Projects/Scala/play_work
```

移動したら、次のコマンドを使ってサンプルプロジェクトを生成してみましょう。

```bash
% play new prac1
```

実行すると、アプリケーションの名前を聞かれます。適当にエンターキーでいいと思います。

```bash
       _            _ 
 _ __ | | __ _ _  _| |
| '_ \| |/ _' | || |_|
|  __/|_|\____|\__ (_)
|_|            |__/ 
             
play! 2.0.4, http://www.playframework.org

The new application will be created in ./play_work/prac2

What is the application name? 
> prac2
```

次に、テンプレートの選択です。ここでは1を選択しましょう。

```bash
Which template do you want to use for this new application? 

  1 - Create a simple Scala application
  2 - Create a simple Java application
  3 - Create an empty project

>  1
```

次のメッセージが表示されれば、テンプレートからのアプリ生成が完了です。

```bash
OK, application prac2 is created.

Have fun!
```

Playのrunコマンドを使って開発モードで実行しましょう

```bash
% cd ./prac2
% play run
[info] Loading project definition from ./play_work/prac2/project
[info] Set current project to prac2 (in build file:./play_work/prac2/)

[info] Updating {file:./play_work/prac2/}prac2...
[info] Done updating.                                                                  
--- (Running the application from SBT, auto-reloading is enabled) ---

[info] play - Listening for HTTP on port 9000...

(Server started, use Ctrl+D to stop and go back to the console...)
```

ブラウザでLocalhostの9000ポートにアクセスすると次の画面が出ます。

![Play起動画面](https://www.dropbox.com/s/nxgvxl30qc50ppo/Screen%20Shot%202013-01-30%20at%2021.08.51.png?dl=1)

以上までが導入でした。

なお、本番用に実行する場合は、startコマンドを使用します。

テンプレートでstartコマンドで起動すると、Viewが切り替わって以下の様になります。
![Startでの起動画面](https://www.dropbox.com/s/yf0fbibydmnil72/Screen%20Shot%202013-01-30%20at%2021.15.25.png?dl=1)
Postfixからのメール送信をSTARTTLSに対応させる


送信だけなら証明書を取得しなくても容易にSTARTTLSに対応させることができる。

メールの受信は行わず送信するだけのアプリケーションサーバなどでは、ぜひ設定しておくとよいのではないか。

## 設定

main.cfに以下の記述を追加する。

```
smtp_tls_CAfile = /etc/pki/tls/cert.pem
smtp_tls_security_level = may
smtp_tls_loglevel = 1
```

- smtp_tls_security_level = may を指定すると、宛先MTAが対応していればSTARTTLSを使用する。正規の証明書が使われていなくても通信する。宛先MTAがSTARTTLSに対応していない場合は平文で通信が行われる。
- smtp_tls_loglevel = 1 を指定すると、TLSで通信しているかどうかログで確認できる。

## 動作確認

gmailなどSTARTTLSに対応した宛先にメールを送り、ログに以下のようなTLSで接続している旨の記録があればOK。

```
Jan 30 19:29:31 ..... postfix/smtp[18387]: setting up TLS connection to aspmx.l.google.com
Jan 30 19:29:31 ..... postfix/smtp[18387]: Verified: subject_CN=mx.google.com, issuer=Google Internet Authority
Jan 30 19:29:31 ..... postfix/smtp[18387]: TLS connection established to aspmx.l.google.com: TLSv1 with cipher RC4-SHA (128/128 bits)
```

## 関連情報

- [smtp_tls_security_level] (http://www.postfix.org/postconf.5.html#smtp_tls_security_level) (postfix.org)
- [smtp_tls_CAfile] (http://www.postfix.org/postconf.5.html#smtp_tls_CAfile) (postfix.org)
- [smtp_tls_loglevel] (http://www.postfix.org/postconf.5.html#smtp_tls_loglevel) (postfix.org)
root 権限でファイルを開き直す

ファイル開いたはいいけど、今のユーザだと編集できないファイルだった・・・死にたい・・・って時に生きるために使う。

```scm
(defun reopen-with-sudo ()
  "Reopen current buffer-file with sudo using tramp."
  (interactive)
  (let ((file-name (buffer-file-name)))
    (if file-name
        (find-alternate-file (concat "/sudo::" file-name))
      (error "Cannot get a file name"))))
```

みたいな、簡単なコマンド作って:

    M-x reopen-with-sudo

すれば、今開いてるファイルを sudo で開きなおしてくれる。

### コマンド作るのが嫌

    C-xC-v /sudo::[今開いてるファイルのパス]

ってやれば、ほぼ同じ事出来る。`/sudo::` をいつも忘れてしまうので、↑みたいなコマンド作ったんだけど。

### 自動で root 権限で開いてほしい

これみる。

* [Re-open read-only files as root automagically « Tassilo's Blog](http://tsdh.wordpress.com/2008/08/20/re-open-read-only-files-as-root-automagically/)

`find-file` で開こうとしているファイルが編集できないファイルのときに「このファイル読込専用みたいだけど root で開く？」って聞いてくれるようになるらしい。
可変長引数が最初にある関数に対する do.call() のやりかた

ggplot2 でちょっとはまったのでメモ。
複数のグラフを一枚のプロットに埋め込むには `gridExtra` パッケージの `grid.arrange()` を使えばいいらしい。
参照：[異なる複数のグラフを一つの図に描画 - Triad sou.](http://d.hatena.ne.jp/triadsou/20100528/1275042816#extgridarrange)

```r
library("ggplot2")
library("gridExtra")

data(iris)

graph.list <- lapply(1:4, function(i) {
  name <- colnames(iris)[i]
  d <- data.frame(Species=iris[,5], y=iris[,i])
  ggplot(d, aes(x=Species, y=y, fill=Species)) + geom_boxplot() + 
    xlab(NULL) + ylab(NULL) + ggtitle(name)
})

grid.arrange(graph.list[[1]], graph.list[[2]], graph.list[[3]], 
             graph.list[[4]], ncol=2, nrow=2)
```
![複数のグラフを一枚のプロットに埋め込む](http://cdn-ak.f.st-hatena.com/images/fotolife/h/hoxo_m/20130130/20130130172037.png)

でもさ、最後の行、`graph.list[[1]]`, ..., `graph.list[[4]]` っていちいち書くのめんどくさいよね。
この `graph.list` をそのまま `grid.arrange()` に渡したい。
フツ―に下記のように書くと、エラーになる。

```r
grid.arrange(graph.list, ncol=2, nrow=2)
```

```
 以下にエラー arrangeGrob(..., as.table = as.table, clip = clip, main = main,  : 
  input must be grobs!
```

こういうときは、`do.call()` を使う。
`do.call()` はリストを `list[[1]], ..., list[[n]]` みたいに展開して関数に渡してくれるナイスなやつです。
使い方は `do.call(関数名, 引数リスト)`

```r
args <- list(graph.list, ncol=2, nrow=2)
do.call(grid.arrange, args)
```

```
 以下にエラー arrangeGrob(..., as.table = as.table, clip = clip, main = main,  : 
  input must be grobs!
```

しかし、これもうまくいかなかった。
なぜ？
原因は `grid.arrange()` は可変長引数を最初に持つからっぽい。
こういうときは、次のように書けばいいみたい。

```r
args <- c(graph.list, list(ncol=2, nrow=2))
do.call(grid.arrange, args)
```

![プロット成功！](http://cdn-ak.f.st-hatena.com/images/fotolife/h/hoxo_m/20130130/20130130172037.png)

おー、でけた！

以上です。
MacでPHP-MongoDB Driverをインストールするメモ


# 環境
 
* OSX 10.8.2
* PHP 5.3.15
 
## 失敗
 ```
$ curl -o go-pear.php http://pear.php.net/go-pear
↑では、version依存でダメ
 ```
## 成功
 ```
$ sudo php /usr/lib/php/install-pear-nozlib.phar 
$ sudo pecl install mongo
$ cp /etc/php.ini.default  /etc/php.ini
$ vi /etc/php.ini
→extension=mongo.soを追加
 
php phpinfo.php | grep mongo
→出力されればOK
```
Redisを初めてさわってみるメモ


# 準備

## クライアント

* OSX 10.8.2
* インストール

```
$ brew update
$ brew install redis
```
下記のコマンドが入る

* redis-benchmark
* redis-check-aof
* redis-check-dump
* redis-cli
* redis-server

## サーバ
redis4youというhostサービスを使ってみる。無料だから。
http://redis4you.com/

* 無料の場合は、２インスタンスまで作成できた。
* アカウント作成をする。
* インスタンス作成（トップのFree下、[select this plan]から）
* インスタンス起動（[My Redis Instanses]から各ページ上、[start]）

#試し

## 接続
```
$ redis-cli -h <Host> -p <Port> -a <Auth> 
```

## リファレンス
http://redis.shibu.jp/commandreference/index.html
CompassでIE7,8,9に対応したボタンを作る

```
@import "compass";

$use-ie-filter : true;
$experimental-support-for-svg: true;

%btnBase{
	@include inline-block;
	@include box-shadow(rgba(255,255,255,.75) 0 0 1px inset);
	@include border-radius(20px);
	line-height: 29px;
	padding: 1px 20px 0;
	font-size: 13px;
	-webkit-appearance: none;
	
	&:active{
		@include box-shadow(rgba(0,0,0,.15) 0 1px 3px inset);
	}
}

.md-btnAttention{
	@extend %btnBase;
	@if $legacy-support-for-ie{
		@include filter-gradient(#f2ad39, #ed830f); // IE7,8用にfilterでグラデを描画する
	}
	&:not(:target){
		filter: none¥9; // IE9はfilterが角丸からはみ出すので無効にする
	}
	@include background-image(linear-gradient(#f2ad39, #ed830f));
	border-top: 1px solid #d78f32;
	border-bottom: 1px solid #d36d0d;
	border-left: 1px solid #d78123;
	border-right: 1px solid #d78123;
	color: #fff !important;
	text-shadow: 0 -1px 0 #cc5822;
}
```

# Sample
http://jsdo.it/gryng02/vqBK
PerformSelector で PerformSelector may cause a leak because its selector is unknown が出るときの対応


performSelector を動的に呼ぼうとして、

```Objective-C
    SEL selector = NSSelectorFromString(selector_string);
performSelector-leaks"
    [main performSelector:selector];
```

と書いたらコンパイル時に警告がでる。ググってみたところ

警告「PerformSelector may cause a leak because its selector is unknown」への対処 - 甘いものが好きです
http://d.hatena.ne.jp/captainshadow/20121114/1352834276

で、それはコードが正しくてもでてしまう警告なので、以下の対応で警告を出ないようにするのが良いらしい。

```Objective-C
    SEL selector = NSSelectorFromString(selector_string);
    #pragma clang diagnostic push
    #pragma clang diagnostic ignored "-Warc-performSelector-leaks"
    [main performSelector:selector];
    #pragma clang diagnostic pop
```

ちょっと気持ち悪いがしょうがないのかな。
igraphにcsvでグラフ構造突っ込んで可視化した

csvの構造は、gephiでランダムグラフを作ってcsvでエクスポートしたｗ
全部フィールドが反映されているのかわからないけど、一応、表示も確認できた。

参考
http://eu-mour.cocolog-nifty.com/euphoria_mourningblog/2010/09/r-1756.html

>library("igraph")
g <- read.graph("tableE.csv","csv")　//この入れ方はgml拡張子でないと入らない。

 以下にエラー match.arg(arg = arg, choices = choices, several.ok = several.ok) : 
  'arg' should be one of “edgelist”, “pajek”, “ncol”, “lgl”, “graphml”, “dimacs”, “graphdb”, “gml”, “dl”

>csvdata<-read.csv("tableE.csv", head = T)   //これは見出しがありバージョン
>graphdata<-graph.data.frame(csvdata)
 
>graphdata<-graph.data.frame(csvdata[1:50,]) //ノード数かな…　ちがった、この場合エッジ数だった。
>tkplot(graphdata, vertex.label=V(graphdata)$name)

Loading required package: tcltk

Tcl/Tkインターフェースのロード中   終了済 
[1] 1
Error in vids[[1]] :  添え字が許される範囲外です 
- - -
csvファイルの中身の例（ヘッダごと入れる）

Source,Target,Type,Id,Label,Weight
4992,5009,Directed,6683,,1.0
4992,5012,Directed,6684,,1.0
4992,5021,Directed,6685,,1.0
4992,5023,Directed,6686,,1.0
4992,5029,Directed,6687,,1.0
4993,5002,Directed,6688,,1.0
4993,5024,Directed,6689,,1.0
4993,5030,Directed,6690,,1.0
4993,5039,Directed,6691,,1.0
4994,5003,Directed,6692,,1.0

- - -
画像↓　あ、出ないｗ
![ランダムグラフ](http://twitpic.com/bzf8t0)
zshにgitのカレントブランチを常時表示させておく

![zsh](http://cdn-ak.f.st-hatena.com/images/fotolife/l/laplus-knsn/20130129/20130129171707.png)

自分の環境で、gitのカレントブランチを確認するときに

```sh
$ git branch
```

を毎回叩くのって結構面倒なので、常に表示させるようにしています。
その方法は、git branchをすると、カレントブランチには*がつくので、それを目印にしてsedをしてます。
また、gitで管理していないディレクトリの場合は出力しないように/dev/nullに捨ててます

まとめたのが下記のコマンドです

```sh
$ git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ \1/'
```

これを、.zshrcのPS1 (またはPROMPT1)などに

```sh
PS1="\$(git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ \1/')"
PS1="\$(git status -s 2> /dev/null)" # git status -sを出力
```

のように \$() で括るとコマンド実行時に解析するようになります。

くわしくは[kaneshin/dotfiles](https://github.com/kaneshin/dotfiles)の

- .zshrc
- .shrc.common

をみてもらったほうがいいですね。zshrcの中身はエスケープ文字使ってるんで、気をつけてください。
SpiderOakのHTTPプロキシを環境変数から設定する

[SpiderOakのFAQ](https://spideroak.com/faq/category/general/) より。

    If you are executing SpiderOak from the command line, this can be arranged by setting the Environment variable SPIDEROAK_HTTP_PROXY using this format:
    http://proxy_hostname/
    If your proxy server requires authentication, you may specify it this way:
    http://username:password@proxy_hostname/

Windows版でも、この環境変数`SPIDEROAK_HTTP_PROXY` は有効。
Xcode 4.6 What's News

Xcode 4.6が出ましたね。iOS6.1と合わせてというかんじです。
というわけで新しくなった部分をまとめてみます。
この訳は、結構稚拙な英語力で淡々と訳したものです。過度な期待はしないでください。
個人的に重要だと思う所が太文字です。

リリースノートより

######iOS 6.1 サポート・iPad miniとRetinaのiPadディスプレイ(第４世代)のサポート
######Apple LLVMコンパイラとObjective-c言語のアップデート
　・ARCとweak参照を使っている時の新しいコンパイラ警告
　・C++11 の「ユーザー定義リテラル（user defined literals)と
　　無制限Union(unrestricted unions)のサポート
　・バラバラに配置されたスタックオブジェクトをマージすることで、
　　スタックメモリのアロケーションを減少させる、高度な最適化
　・The Typed-Based Alias Analysis (TBAA) code generationがデフォルトで有効になった
　・__マイクロソフトスタイルのインラインアセンブリのサポート（i386とx86_64)__
　・otoolのIntel AVX instructionsの逆アセンブルのサポートの向上
　・otool can now precisely decode all instructions and skip over data entries
　　 in text segments.(よくわからない）
　・Static analyzerのC++とObjective-cの深い横断的解析のサポート

######LLDBデバッガアップデート
　・Objective-cランタイムからメタデータを読む機能
　・インライン関数のステップオーバーのサポートの向上
　・関数の引数をデフォルトでバックトレースに表示
　・"thread return,"、一時的ブレークポイント、GDBからのショートカットのサポート
　・__NSArrayとNSDictionaryの中身をXcodeのデバッガから見ることができるようになった__


たくさんのバグ修正とステータビリティの向上
git のcommit/merge/checkoutなどのタイミングでctagsを実行するフックスクリプト


.git/hooks 配下に以下のようなスクリプトを post-commit というファイル名で作成。実行権限を与える。

```sh:.git/hooks/post-commit
#!/bin/sh
/usr/local/bin/ctags -f tags -R `pwd`
echo "*** Update tags by git hook script."
```

同様の内容で、post-merge, post-checkout という名前でファイルを用意する。


## 参考
- [Git - Git フック](http://git-scm.com/book/ja/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%83%95%E3%83%83%E3%82%AF)

- [A script for generating TAGS from a git hook.](https://gist.github.com/42308)
Subversionからロック中ファイルの一覧を取得する（bash）

リポジトリがあるサーバ上であれば「svnadmin lslocks」が使えますが、管理者権限が付与されていないことも有ると思います。
以下に示すのはクライアントマシンから取得する方法です。

# bash用
svn list http://{PATH}/ -R --verbose | awk '{if($3=="O"){print $8}}'  | while read i
do
svn info http://{PATH}/$i | awk '{if($1=="URL:"){url=$2;}else if($1=="ロック所有者:"){user=$2}else if($1=="ロック作成日時:"){print user","$2,$3","url }}'
done > lock.csv
MySQLコマンドラインでSQLを実行する

オプション「-e」を使って、SQLステートメントをサーバに送り届ける。

```bash
$ mysql -uUserName -pPassword -e 'show databases;'
$ mysql -uUserName -pPassword databasename -e 'show tables;'
```

パイプを使った方法。

```bash
$ echo 'show tables;' | mysql -uUserName -pPassword databasename -t
$ cat sqlfile  | mysql -uUserName -pPassword databasename -t
```
Coffee-script+mochaコンパイルせずにテスト


まずはインストール、sudoの必要があるかもしれません。

```
$ npm install coffee-script -g
$ npm install mocha -g
```

mocha.optsにcoffee-scriptを追加。

```./test/mocha.opts
--compilers coffee:coffee-script
```

後はそのまま.coffeeのテストを書くだけです。
テストする時は：

```
$ mocha
```

> コードを読みやすく、package.json、又はCakefileにテストコマンドを書いておく。

ソースコードもコンパイルせずにテスト、例えば./index.coffeeのテスト、ここでは[Chai](http://chaijs.com)の[assert](http://chaijs.com/api/assert/)を使います。

```coffee-script:./test/test.index.coffee
{assert} = require('chai')
target = require '../src/index'

describe 'Constant', ->
  it 'should work', ->
    assert.ok target?
```
プログラミング力を鍛えるためのサイト

- [AtCoder (アットコーダー)](http://atcoder.jp/)

- [TopCoder](http://www.topcoder.com/)

- [AIZU ONLINE JUDGE: Programming Challenge](http://judge.u-aizu.ac.jp/onlinejudge/index.jsp)
 - 参考: [3分で競技プログラミングを試す - 競技プログラミング Wiki*](http://wikiwiki.jp/kyopro/?3%CA%AC%A4%C7%B6%A5%B5%BB%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0%A4%F2%BB%EE%A4%B9)

- [CodeKata](http://www.codekata.com/)
 - 参考: [Code Kata　コード＝カタ - 自ブログで行こう　KShunのブログ作成格闘記＋寄り道](http://d.hatena.ne.jp/KShun/20070818/1187414830)

- [Project Euler](http://projecteuler.net/)
 - 参考: [Project Eulerについて - PukiWiki](http://odz.sakura.ne.jp/projecteuler/index.php?Project%20Euler%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)

- [DailyCoding](http://daily-coding.herokuapp.com/)
 - 上記 Project Euler の問題を日替わりで出題してみんなで答え合わせするサービス

- [Code Golf](http://codegolf.com/)

- [Codeforces](http://codeforces.com/)
 - 参考: [主にコーディング: Codeforcesへの参加方法（2011/9/23更新）](http://mainly-coding.blogspot.jp/2010/06/codeforces.html)
アクセサを一つのメソッドにまとめる

Pythonでちゃんとプロパティのアクセサを設定する場合、`property`関数を使って以下の様に書くのが一般的。たとえば`Foo`クラスに`bar`プロパティをくっつける場合。

```python
class Foo(object):
    def __get_bar(self):
        return self.__bar

    def __set_bar(self, value):
            self.__bar = value

    def __del_bar(self):
            del self.__bar

    bar = property(__get_bar, __set_bar, __del_bar,
                   doc="short explanation for bar property")
```

ただこの書き方だと1つのプロパティに対して3つもメソッドを作る必要がありごちゃごちゃする。

そんなとき、これをまとめて以下のように書くことも可能。上と下は同じ意味になる。


```python
class Foo(object):
    def bar():
        doc = "short explanation for bar property"

        def fget(self):
            return self.__bar

        def fset(self, value):
            self.__bar = value

        def fdel(self):
            del self.__bar

        return locals()

    bar = property(**bar())
```

`fdel()`や`doc`はいらなければ省略可能。

一つのプロパティに対して同じ名前のメソッド一つにまとまるからちょっと見やすくなる...気がする。
vibe.dをライブラリとして使う

**末尾に追記あり**

# モチベーション

vibe.dはD言語で使えるまともなNon Blocking IO and Webフレームワークだが，一つ問題があってフレームワーク色が強すぎる．[Tornado](http://www.tornadoweb.org/)のようにIOStreamだけ使って華麗にライブラリを書くということが今は出来ないし，そもそもlibvibedのようなものを提供してない．
が，今現在Windowsで動くことも含めNon Blocking IOのライブラリを書くのは骨が折れるし出来れば楽したいので，vibe.dを使えるようなんとかする．

# vibe.dアプリの動かし方

vibe.dはサーバの起動にvibeというコマンドを使う．これは必要になるlibeventやlibsslなどをオプションとして追加し，ローカルにあるpackage.jsonなどを読み込んでvibe.dアプリを起動する．これがライブラリとして使う時には使えないので，なんとかする．が，今のところ綺麗にどうこうする方法が思いつかないので，全部ライブラリに同梱するのが吉．

# vibe.dアプリの起動シーケンス

[HTTPサーバ](https://github.com/rejectedsoftware/vibe.d/blob/master/examples/http_server/source/app.d)の例を見るとわかるが，サーバのようなvibe.dアプリは`shared static this`を使って実行する．`shared static this`で起動とか気持ち悪いし，こんなのライブラリの場合はやってられない．なんでこれで動くのかというと，```import vibe.d;```をすると`vibe.appmain.d`がさらにimportされる．実はこの`vibe.appmain.d`が中にvibe.d用のmainを定義していて，すべてのセットアップが終わったらこれが呼ばれるようになっている．
vibe.dではグローバル変数を使って情報をやりとりしているのでこんな芸当が出来るわけだが，まぁやめてほしい．なので，ライブラリとして使う場合は`vibe.appmain.d`と`vibe.d.d`の二つを消すしかない．

# vibe.dを普通に起動する

やることは以下のように，`vibe.appmain.d`がやってることを自分でやってやれば良い．HTTPサーバの例は以下のようになる．

```d
import vibe.vibe;

void handleRequest(HttpServerRequest req, HttpServerResponse res)
{
    res.writeBody(cast(ubyte[])"Hello, World!", "text/plain");
}

void main()
{
    auto settings = new HttpServerSettings;
    settings.port = 8080;
    setLogLevel(LogLevel.None);

    listenHttp(settings, &handleRequest);
    startListening();
    runEventLoop();
}
```

もしこれをhttp_server.dとかで保存したのであれば，以下のような感じで実行する．

```sh
dmd -m64 -L-levent_pthreads -L-levent -L-lssl -L-lcrypto -Isrc ...(src以下のファイルを列挙) -run http_server.d
```

...の所は予めビルドしてlibhogeみたいなのにまとめておけば，それを指定するだけで良い．これでvibeコマンドとおさらば出来るし，普通にイベントループだけを利用できる．やったね！

# Makefile

vibe.dはとてもファイルがたくさんある．構成を変更するたびにこまめにチェックしてMakefileのSRCSのような変数を修正するのは非常にばからしい．なので，今は以下のような簡単なスクリプトでリストアップしてMakefileにぶちこんでいる．

```rb
Dir['src/**/*.d'].each { |path|
  puts "\t#{path} \\"
}
```

vibe.dがライブラリとして使えるようになっていればこんな無駄なことはしなくていいんだけど…

# 追記 (2014/09/08)

最近vibe.dをチェックしてみたら，`vibe/appmain.d`に[VibeCustomMainというversionが増えていた](https://github.com/rejectedsoftware/vibe.d/blob/c9371089476968e09680fe2518a80729535ed43a/source/vibe/appmain.d#L24)．これをセットしてやると，上記でいうmainが勝手に追加される問題が解決出来る．

[msgpack-rpc-d](https://github.com/msgpack-rpc/msgpack-rpc-d)ではdubの設定で以下のようにしており，外部から使うときにはvibe.dの俺俺mainを呼ばないようにした．

```json
    "configurations": [
        {
            "name": "default",
            "versions": ["VibeCustomMain"]
        }
    ]
```
GGJ2013に参加した話


どうも、えいやです。
[Global Game Jam 2013](http://globalgamejam.org/)に参加しましたのでご報告です。

GGJとは、世界中で同時に(時差があるため最大24時間のズレあり)行われるゲームづくりのハッカソンで、その規模はおそらく世界一のハッカソンです。48時間の持ち時間を使い、開催年ごとGGJ開始とともに発表されるテーマを題材にゲームを作るというものです。チーム参加、個人参加ともに自由です。テーマの発表は会場ごとに行われますので、好きな会場を選んで、その会場から参加することになります。

今回ボクが参加した会場は、[ギークハウス武蔵小杉会場](http://atnd.org/events/36101)です。
ボクが今住んでいるシェアハウスですね。

住民の一人でゲーム作りが趣味の[Mikami](http://mkgames.me)さんが、GGJの会場として通常の民家でも登録できることを発見し、我が家を会場として登録、会場の主催者として運営を色々頑張ってくれました。

GGJテーマは動画で発表されます。
今年の動画は何も映されず、サウンドで心音のみが流れました。
動画からの印象がテーマですので、素直に心音をテーマにするかどうか捉え方は個人の自由です。

当日の会場の様子は、[UST](http://www.ustream.tv/channel/global-game-jam-in-%E3%82%AE%E3%83%BC%E3%82%AF%E3%83%8F%E3%82%A6%E3%82%B9%E6%AD%A6%E8%94%B5%E5%B0%8F%E6%9D%89)で見ることが出来るほか、[まとめ](http://mkgames.me/archives/525)をMikamiさんのブログ[MK Games](http://mkgames.me)で読むことができます。

制作や会場の様子などは上記を見ていただくこととして、この記事ではゲーム作りでやったことをさらっとまとめます。

## 会場に集まったメンバーから2チームに分ける

ギークハウス武蔵小杉の会場では8名のメンバーが集まりました。
会場主催のMikamiさんの仕切りで、その8名を4人の一組のチームで分けました。
当初のMikamiさんの計画では、知り合い同士がチームにならないように分ける予定でしたが、当日公開のGGJのプロモーションで「出来れば友達同士で参加しましょう」ということでした。
そこで計画を変更して、知り合い2人で来場した2組を合わせた1チームを作り、Mikamiさんやボクを含む残りの4名でもう1チームとしました。

ちなみに今回のボクの役割は、プログラマー兼3Dモデラーですが、結局プログラミングはせずに終わりました。

ちょいちょいコーディングに口を出す程度のことはしましたよ。（震え声）

## ゲームはUnity3Dで作成

GGJ2013の参加者には、3Dゲーム制作ツールの定番どころである[Unity3D](http://japan.unity3d.com/)の最新版のプロライセンスが提供されました。
プロライセンスは30日限定で、導入すると、Unity3D内で完結するバージョン管理サーバ機能、制作したゲームをスマートフォン用にビルド出来る機能などが使えるようになります。

GGJ2013の参加者の多くがUnity3Dを使用してゲームづくりを行ったようで、ボクのチームもUnity3Dを使ってゲームを作りました。

GGJでのゲーム作成はUnity3Dを使うのがスタンダードなので、今回の会場でも参加2チーム両方ともに、さらっとUnity3Dの利用の方針が固まりました。

## テーマからゲームアイデアを洗い出す

テーマからゲームのアイデアを連想するのは、GGJでのゲーム作りの重要な点です。
テーマの心音の動画から、アイデアを出していきます。

![アイデアのマインドマップ](https://www.dropbox.com/s/u7o9idphx2f7zaz/ggjMMP.jpg?dl=1)
※ 上記は最終的に決まった内容ではなく、途中経過の状態をボクがまとめたものです。

ボクらのチームではアイデア出しがなかなかまとまらずに、先に犬のキャラクターだけ決めて、デザインと3Dモデリングを始めました。

モデリングをしているうちに、方針は「GPSを使って犬と散歩するゲーム」ということに決まりました。
走ったり歩いたりすることで心拍数をあげるゲームという感じです。

## キャラクターデザイン＆モデリング

アイデアとして最終的に犬のキャラクターを育成するゲームというコンセプトが決まりました。
チームのなかで2Dデザインを担当してもらっていたメンバーから、トイプードルのキャラデザをもらい、ボクがそれをモデリングしました。

その後、実際のモデルを見ながらカラーの調整やテクスチャの作成を行いました。

![モデリング中の犬](https://www.dropbox.com/s/m9o4jr026co5p97/Screen%20Shot%202013-01-29%20at%2023.48.41.png?dl=1)

## コーディング＆アニメーション作成

ボクの役割はモデラーなのでコーディングにはほとんどノータッチです。

UIやらGPSへのアクセスやらの設計は他の二人のプログラマが頑張ってくれました。

ボクがモデリングしたキャラクタはWebプレイヤーで見られるようにしてあります。
![WebPlayer画面](https://www.dropbox.com/s/506ixy6s0cl31tj/Screen%20Shot%202013-01-30%20at%200.04.15.png?dl=1)


[WebPlayerを起動](http://geesugitan-console.herokuapp.com/game/WancoMotionCheck/WancoMotionCheck.html)

## 出来上がり
そんなこんなで一応、ゲームを完成させることができ、その後Google Playへの登録もできました。
[「ワンコとおさんぽ」](https://play.google.com/store/apps/details?id=jp.kosugeek.ggj2013&feature=search_result#?t=W251bGwsMSwyLDEsImpwLmtvc3VnZWVrLmdnajIwMTMiXQ..)という安直なタイトルで見つけることができます。

48時間の突貫工事のため、アプリを終了できない、動かない端末がある、など色々と課題が残っています。
今後早いうちに主催のMikamiさんと一緒に少しずつ改良して上げなおそうと考えています。

## 今後のね
少し前からUnityやらBlender使って色々やってみたりしてましたけど、わりと面白くて続いています。

Scala＋LiftやらPlayやら、Node.jsの研究もやっていきたいですけど、まずはアプリを出してみようかなぁってのがあるので、しばらくはUnityに時間を突っ込んでみようかと思っています。

なんぞイベントなんかがあればお誘いください。
Zshでコマンドの終了ステータス コードをプロンプトに表示する

直前に実行したコマンドとその終了ステータス コードをプロンプトに表示します。
promptsubst を有効にして `$history[$(($HISTCMD-1))]` で直前のコマンドを取り出します。
本質ではありませんが、背景色を $?=0 のときは緑、それ以外のときは赤くしてみました。

シェル スクリプトの作成時に各コマンドの終了ステータス コードを調べるときや、
実行するすべてのコマンドの終了ステータス コードが気になる人(自分のこと)にオススメ。

```sh
autoload -U colors
colors
setopt promptsubst
PROMPT="%{$fg[black]%(?.$bg[green].$bg[red])%}<%?> \$history[\$((\$HISTCMD-1))]%{$reset_color%}
(%n@%m)[%h] %~ %% "
```
Perlで配列要素と一緒に要素番号を取得する

配列をループで処理するときに、要素と一緒に要素番号も欲しくなることが稀によくあるが、Perlでやる方法を今まで知らなかったのでメモ
PythonのenumerateとかRubyのeach_with_indexのPerl版

```perl:with_index.pl
my @a = (10..20);
while(my ($i,$j) = each @a){
    print "$i $j\n";
}
```

```
$ perl with_index.pl
0 10
1 11
2 12
3 13
4 14
5 15
6 16
7 17
8 18
9 19
10 20
```

ただeachするだけでよかった

######追記
コメントで指摘されてる通り、mapで使いたいけど、いい感じの方法が見つからなかった
仕方なく、自分で書いてみた

```perl
sub each_with_index {
    my @ret;
    while (my ($i,$j) = each @_) {
        push @ret, [$i, $j];
    }
    return @ret;
}

my @a = (10..20);
print "$_\n" for map { "$_->[0]:  $_->[1]" } each_with_index @a;

```

Tie変数とかいうのを使ってみた。

```perl
{
    package Tie::WithIndex;
    sub TIEARRAY {
        my ($pkg, @array) = @_;
        bless { array => \@array }, $pkg;
    }
    sub FETCH {
        my ($this, $index) = @_;
        return [$index, $this->{array}->[$index]]
    }
    sub FETCHSIZE {
        my ($this, $index) = @_;
        return scalar(@{$this->{array}});
    }
}

tie my @a, 'Tie::WithIndex', (10..20);
print "$_\n" for map { "$_->[0] : $_->[1]" } @a;
```
ActiveModel::Dirtyのメソッドを使って変更を感知しよう


[ActiveRecord](http://api.rubyonrails.org/classes/ActiveRecord/Base.html)を使っていると時々プログラム内でModelオブジェクトの値を変更してから、変更前の値が欲しくなったりすることがある。

そんなときは[ActiveModel::Dirty](http://api.rubyonrails.org/classes/ActiveModel/Dirty.html)のメソッドを使うとModelのオブジェクトに変更があった時に変更の情報を取得出来る。

```ruby
# たとえばUserのレコードを一個引っ張ってきて
u = User.last
=> #<User id: 5, age: 19, name: "Kiriko Takemura">


# 変更されていないことが確認出来る
u.changes
=> {}

u.changed
=> []

u.changed?
=> false


# 名前を変更してみる
u.name = "Caroline Charonplop Kyary Pamyu Pamyu"

# するとchangesが変更されたプロパティの変更前と変更後のデータが取得できる。
u.changes
=> {"name"=>["Kiriko Takemura", "Caroline Charonplop Kyary Pamyu Pamyu"]}

# booleanでも取得できる
u.changed?
=> true

# 変更されたプロパティ名だけ取得もできる
u.changed
=> ["name"]


# と言うことは、何回も変更したら変更するだけ履歴として残る？
u.name = "Kyary Pamyu Pamyu"

# 残念。そんなことはなく変更前と最新のデータだけ取得出来る。
u.changes
=> {"name"=>["Kiriko Takemura", "Kyary Pamyu Pamyu"]}


# 違うプロパティも変更してみる
u.mail = "kyary@pamyupamyu.com"
=> "kyary@pamyupamyu.com"

# ちゃんと変更したプロパティを取得できる
u.changed
=> ["name", "mail"]

# こんな感じでいくつ変更しても残る
u.age = 20
u.changed
=> ["name", "mail", "age"]
```

こういうメソッドがあると変更前の情報を後で使いたいときにいちいち別に一時的な変数を用意して取っておくなんてことをしなくても済む。

今更だけど題名は「感知」じゃなくて「検知」にすべき気だったがしてきた。
Railsでテーブルデータ処理が頻繁に出てくる時はscopeを使う

今日勉強したメモ。
テーブルデータの検索で頻繁に使う処理は`scope`を使って、定義しておくのがいいみたい。

##（例）記事一覧が最新記事順で並べられるようにEntryクラスにscopeを追加する

【モデル】
定義する
**./app/models/entry.rb**
`:latest`とシンボルを設定。

```
class Entry < ActiveRecord::Base
  scope :latest , order ('update_at desc')
end
```

【コントローラー】
**./app/controller/entries_controller.rb**

```
class EntriesController < ApplicationController
  def index
    @entries = Entry.where("blogger_id=?" , @blogger.id).latest 
  end
end
```
Express3.xでejsをインストールする方法


Express2.x系ではテンプレートエンジンをejsに指定した方法でスケルトンを作成するには以下のようにした

```
express sample -t ejs
```

3.x系では方法が変わったらしい

```
express sample -e
```

参考:http://creator.cotapon.org/articles/node-js/%E3%80%90node-js%E3%80%91express%E3%81%A7ejs%E3%81%8C%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E5%87%BA%E6%9D%A5%E3%81%AA%E3%81%84%E5%AF%BE%E5%87%A6%E6%B3%95
標準入力時に入力内容を表示させない方法


```
print 'password: '
system "stty -echo"
password = $stdin.gets.chop
system "stty echo"
```

####※2/2 追記
すでに既出のTipsであり、もっと適切な方法が以下に紹介されておりますので、そちらを参照して頂くことをオススメします！
http://qiita.com/items/88194612bb0fa705e39d
default-command に reattach-to-user-namespace -l zsh を指定すると zshenv が2回読まれる


 * ログインシェルに zsh を指定している
 * .tmux.conf で `default-command` に `reattach-to-user-namespace -l zsh` を設定している

 1. tmux がログインシェルを起動する
 2. `$ZDOTDIR/.zshenv` が読まれる
 3. `default-command` が実行される
 4. zsh が起動する
 5. `$ZDOTDIR/.zshenv` が読まれる
 6. インタラクティブシェル開始
Haskellで文字列フォーマット

Haskellで文字列フォーマットがしたくなる時があります。
例えばPythonでは、 `"{0},{1}".format(a,b)` のようにして、タプルのn番目を `{n}` と書くと文字列中で展開されるというフォーマット用のメソッドがあります。
これがHaskellにも欲しくなったので実装しました。

使い方としては、
`[format| フォーマット |]` の形で書くと、整形された文字列を返してくれます。

例は以下のような感じです。

```haskell
-- 要： TemplateHaskell拡張, import Control.Lens
>>> [format|{_1}, {_2}!|] $ ("hello", "world")
"hello, world!"
```

ただし、 `[format| {f} |] $ tuple` としたとき、 `show $ tuple ^. f` で展開されます。よって、[Control.Lens](http://hackage.haskell.org/package/lens)をインポートしていれば、 

```haskell
[format| {_2} |] $ (a,b) == 
" " ++ show $ (a,b) ^. _2 ++ " " == 
" " ++ show b ++ " "
```

となります。
(タプルの先頭の要素が_1から始まっているのが気持ち悪い？はい、私も気持ち悪いと思いますが何故かControl.Lensだとそうなっているので文句がある方はライブラリの方に言ってください）

また、 `[format| <f> |] $ tuple` などとすれば、 `show $ f tuple` と展開されるので、以下のような使い方も可能です。

```haskell
-- 要： TemplateHaskell拡張
>>> [format|<fst>, <snd>!|] $ ("hello", "world")
"hello, world!"
```

今のところタプルは1つしか受け取れませんが、とりあえずHaskellでも文字列フォーマットができるようになったので、これで文字列をいい感じに整形できますね！


--------------------------------

以下にソースを示します。

```haskell:strformat.hs
{-# LANGUAGE TemplateHaskell #-}
import Language.Haskell.TH
import Language.Haskell.TH.Quote
import Text.Parsec hiding ((<|>))
import Control.Lens

import Control.Applicative hiding (many)

-- [format| {_1}, {_2}! |] $ ("hello","world") --> hello, world!

type FString = String
data Format = Normal String
            | Getter String
            | Func String
            deriving (Show)

isFunc :: Format -> Bool
isFunc (Func _) = True
isFunc (Getter _) = True
isFunc _ = False

skipSpace :: Parsec String () a -> Parsec String () a
skipSpace p = skipMany space *> p

elimEsc :: String -> String
elimEsc = elim "\"'"
  where
    elim :: (Eq a) => [a] -> [a] -> [a]
    elim cs = filter (\x -> not $ x `elem` cs)

formatExpr :: Parsec String () [Format]
formatExpr = many1 (try fmGetter <|> try fmFunc <|> fmString)

symbol :: String -> Parsec String () String
symbol = skipSpace . string

fmGetter :: Parsec String () Format
fmGetter = Getter <$> between (symbol "{") (symbol "}") (many1 $ noneOf "}")

fmFunc :: Parsec String () Format
fmFunc = Func <$> between (symbol "<") (symbol ">") (many1 $ noneOf ">")

fmString :: Parsec String () Format
fmString = Normal <$> (many1 $ noneOf "{}<>")

toExpQ :: Format -> Name -> ExpQ
toExpQ format name =
  case format of
    Func f -> [| (++) $ elimEsc . show $ $(varE $ mkName f) $(varE name) |]
    Getter f -> [| (++) $ elimEsc . show $ $(varE name) ^. $(varE $ mkName f) |]
    Normal f -> [| (++) $(litE $ stringL f) |]
    
parseExp :: String -> ExpQ
parseExp s = case parse formatExpr "" s of
  Left err -> [| putStrLn $(litE $ stringL (show err)) |]
  Right x ->
    case any isFunc x of
      True -> do
        name <- newName "x"
        let fm = foldr appE [| "" |] $ map (flip toExpQ name) $ x
        lamE [varP name] fm
      False -> [| print $(litE $ stringL s) |]

format :: QuasiQuoter
format = QuasiQuoter { quoteExp = parseExp
                     , quotePat = undefined
                     , quoteType = undefined
                     , quoteDec = undefined}
```
(__QuasiQuote__, __TemplateHaskell__を用いています。)
Eshellで「Text is read-only」が出る問題を回避する/複数行プロンプトを使いやすくする

Eshell、つかってますか。いーしぇる。
わたしはEshellをつかっています。

Windowsだけ使って生きてきてるので、いまいちシェルの使い方もわからずでしたが、とにかく触ってみようとおもって使い始めたのが`bash`さんでした。
しかしどうもいまいち操作感がしっくりこなかったので`Emacs Shell`上で動かすようにしてみて、そこからしばらくして`Eshell`に乗り換えた形です。
最初はなにこれって思いましたが、少しずつカスタムしてみたらすごく手に馴染むようになったのでまるでEmacsみたいなシェルでした。じわじわくる。
まだまだ便利な使い方がわからないのでしばらく使いこなせるようにがんばります。


-
本題です。
Eshellをカスタマイズしてたら突然「`Text is read-only`」とかいうエラーメッセージを出しはじめてEshellが閉じられなくなったことはありませんか。
Emacs本体を閉じることもできなくなってとってもイライラさせてくれるこの問題をなおしたのでここに書いておきます。


こいつを`Init.el`にドーン！

```scm
;; 許されざるText is read-onlyを回避する
(defadvice eshell-get-old-input (after eshell-read-only-korosu activate)
  (setq ad-return-value (substring-no-properties ad-return-value)))
```

表面上で問題回避しようとするとどうやってもどこかしらに穴がでちゃったので根本からつぶしちゃいました。
この問題、`eshell-prompt-function`をいじってプロンプトを複数行にしたときなどによく発生します。

本来EshellはReturnキーを押したときカーソルのある行をそのままコマンドラインにドーンしてくれるんですが、プロンプトのある行でReturnしたときはプロンプト部をスルーするように作られてます。
そのときのプロンプト探しの正規表現が`eshell-prompt-regexp`ですね。

実はこの`eshell-prompt-regexp`をつかう関数がちょっと曲者で、__プロンプトを1行単位でしかマッチング判定しない__ようにできてます。なにそれクソい。
で、複数行プロンプトには当然マッチしなくて、プロンプトにマッチしないとなると、今度はそのプロンプト文自体をコマンドラインにドーンしちゃうんですが、それをやると上の問題が発生しちゃいます。プロンプト文の持つread-only属性が原因だったようです。

というわけで、なんとかしてプロンプト行をコマンドラインに入れないようにしようといろいろ画策したんですが、結局無理っぽかったので問題原因そのものを潰しました。これで何やってももんだいないよやったね。
たぶんこれで不具合とかは出ないと思いますが、まだテストしてないので……。お悩みの方はどうぞ。


-
以下メモ。／おまけ「Eshellプロンプトを複数行にしたときの動作を快適にする」

上の問題を回避しようといろいろやった時の残りカスです。
が、使い物にはなります。

とりあえずコード。
例のごとく`Init.el`かどこかにドーンする。

```scm
(custom-set-variables
 ;; eshellのプロンプトフォーマットを指定
 '(eshell-prompt-function
   (lambda ()
     (concat
      "[ " (format-time-string "%Y/%m/%d %H:%M") " | "
      (user-login-name) "@" (system-name) " ]\n"
      "[" (abbreviate-file-name (eshell/pwd)) "]\n"
      (if (= (user-uid) 0) "#" "$")
      " ")))
 ;; プロンプトにマッチングする正規表現を指定
 ;; 複数行プロンプトを使う場合はそれぞれ1行毎にマッチングするように書くこと
 '(eshell-prompt-regexp "^\\(\\[[^]\n]+\\]\\|[$#] \\)"))

;; 追加設定
(defcustom eshell-prompt-regexp-lastline "^[#$] "
  "複数行プロンプトの最終行にマッチする正規表現を指定する"
  :type 'regexp
  :group 'eshell-prompt)

;; 複数行プロンプトでもスキップが正常に動作するようにする
(defadvice eshell-skip-prompt (around eshell-skip-prompt-ext activate)
  (if (looking-at eshell-prompt-regexp)
      (re-search-forward eshell-prompt-regexp-lastline nil t)))

```

上から順に。

`eshell-prompt-function`は書いてあるとおり、プロンプトのフォーマットを指定します。
上の記述だと、

[じかん | ろぐいん名@ほすと名]
[作業でぃれくとり]
$

という形ですね。

2つ目。`eshell-prompt-regexp`はプロンプトにマッチする正規表現を指定します。
大事なのは、プロンプトの全ての行に1行ずつマッチするようにORる必要があることです。
上の設定だと、
` [...] ` と ` $/# ` の行それぞれにマッチするようになってます。
こう書けばプロンプト部が全部きちんとプロンプトとして扱われるようになりますが、
弊害として、プロンプトの上でC-a(`eshell-bol`)を押すと

[じかん | ろぐいん名@ほすと名]■ ←ここにカーソルが来るようになっちゃいます。
[...

なので、改造。3つ目。
`eshell-prompt-regexp-lastline`変数を新しく作りました。
複数行プロンプトの最後の行にマッチするように書きます。
defcustomは趣味なのでdefvarでもいい。setqはバイトコンパイラさんにおこられるからダメ。

4つめ。プロンプト上のカーソル移動関数`eshell-skip-prompt`を上書きして、
複数行プロンプトの時も正しくスキップが働くようにしてみました。
`eshell-prompt-regexp`と`eshell-prompt-regexp-lastline`が正しく設定されていればちゃんと動くはずです。
これで`eshell-bol`実行時、`$/#`の後ろにカーソルが来るようになります。
例によってこれでなんか不具合出るかもしれないけど、そんなことはしらない。

以上メモおわり。


ここまでやってようやく最初の一歩を踏み出した感あるEshellさん底が知れない。
でもいじる楽しみがたくさんあるのは面白いし楽しい。
みなさんもEshellを使ってみてはいかがでしょうか。
異なるエンコーディングでのファイル書き出しと読み込み

古いシステムのために EUC-JP でファイル書き出しをする必要がある場合，内部エンコーディングは UTF-8 だったので，今まで明示的に書き込む文字列を EUC-JP に変換してから書き込んでいた．
でも，次のようにモードでエンコーディングを指定すると自動でその変換をやってくれるらしい．

```ruby
# coding: UTF-8

# UTF-8 から EUC-JP へ変換して書き込んでくれる．
File.open("hoge-euc", "w:EUC-JP:UTF-8") do |f|
  f << "ファイルの中身"
end
```

同様に，ファイルからの読み込みもファイル読み込み時にエンコーディングを指定できる．
encoding キーワードを付ければ良い．

```ruby
# coding: UTF-8

# EUC-JP のファイルを読み込んで UTF-8 に変換する
puts File.read("hoge-euc", encoding: 'EUC-JP:UTF-8')
```
Ruby 1.9 で標準入力から文字コードを変換する

覚えているうちに脳内メモリを書き出しておく。例えば標準入力が Shift_JIS で出力を UTF-8 にしたい場合は以下のコードで出来る。

```ruby
STDIN.set_encoding("Shift_JIS", "UTF-8").read
```

これはワンライナーで役に立つ。例えば Shift_JIS のテキストファイルから最初の一行を抽出してコンソールに書き出したい場合は以下になるだろう。

```bash
head -n sjis.txt | ruby1.9 -e 'p STDIN.set_encoding("Shift_JIS", "UTF-8").read'
```
OSX上のVirtualBoxでWindowsを使う時の設定

## クリップボード共有

[Devices]/[Shared Clipboard]/[Bidirectional]メニューにチェック

## ファイル共有

[Devices]/[Shared Folders]メニュー
→追加ボタン(フォルダに+のアイコンボタン)を押して、OSXのフォルダと共有名を
　入力して追加。
   [Auto-mount]と[Make Permanent]にチェックをつける。Auto-mountはVirtualBox Guest Additionsをインストールしてあることが前提。詳細は [Chapter 4. Guest Additions](http://www.virtualbox.org/manual/ch04.html#sf_mount_auto) を参照。

## 3Dアクセラレーション (Experimental)

[Chapter 4. Guest Additions](http://www.virtualbox.org/manual/ch04.html#guestadd-3d)

設定画面の[ディスプレイ]でビデオメモリーを128MB以上にする。
拡張機能の[3Dアクセラレーションを有効化]と[2Dビデオアクセラレーションを有効化]
にチェック。

Guest Additionsをインストールする際のコンポーネント選択で、
[Direct3D Support (Experimental)]にチェック
→[This system supports the Window Aero (WDDM) interface.
   VirtualBox support for this feature is experimental and should
   not be used on production system yet.

   Would you like to install basic Direct3D support instead?]
   に[いいえ]と選択。

→[Please note that in order to use 3D acceleration the virtual
   machine requires at least 128MB of video memory with 256MB
   recommended if you wish to use it with multiple monitors.

   If necessary you can change the video memory size in the
   "Display" section of the virtual machine settings.]
   で[OK]を押す。

しかし、Aeroに切り替えると画面最下部のスタートバーの下に黒い帯が表示され、
各種ボタンの表示位置と実際にクリックに反応する領域は縦方向にずれがある。

[#11021 (Guest display is offset on retina display when 3d acceleration is enabled) – Oracle VM VirtualBox](https://www.virtualbox.org/ticket/11021)

ターミナルから以下のコマンドを実行して、VMのウィンドウの下のステータスバーを
非表示にすると、Aeroでもずれは起きなくなる。

```
VBoxManage setextradata global GUI/Customizations noStatusBar
```

## 左commandキーをWindowsキーとして使えるようにする

ホストキー(ゲストのウィンドウからホストにフォーカス切り替え用のキー)が
デフォルトでは左commandキーになっているので右commandキーに変更。

VirtualBoxの設定画面の[入力]タブの[ホストキー]
→右commandキーに変更
Windows環境PHPへのmemcachedインストール手順


＜必要ファイル＞
①php_memcache.dll
php_memcache-cvs-20090703-5.3-VC6-x86.zip
（各種OSに合うものを選ぶ）
解凍すると→php_memcache.dllが入ってる。
解凍前のファイルは下記サイトとかからDL
http://downloads.php.net/pierre/
http://shikii.net/blog/downloads/php_memcache-cvs-20090703-5.3-VC6-x86.zip
（各種OSに合うものを選ぶ）

②memcached本体
以下のサイトからmemcached 1.2.6のwin32 binalyをDLして解凍すると
memcached.exeが入ってる。
http://code.jellycan.com/memcached/


＜手順＞
①php.iniの最後に以下2行を追記して保存

```php.ini
[PHP_Memcache]
extension=php_memcache.dll
```


②php_memcache.dllを配置
以下に配置
**php\ext\**


③memcachedインストール、起動
cmd.exe起動。
memcached.exeの存在するディレクトリに移動後、
下記コマンドを実行することでサービスに登録できる。
**memcached.exe -d install**


**net start "memcached Server"**
で開始

Windowsのサービス一覧でmemcached Serverを確認。

************************
下記4行は備考(cmd.exeで行う)
**net stop "memcached Server"**
で終了します。
下記コマンドを実行することでサービスから削除できる。
**memcached.exe -d uninstall**
*********************

④webサーバ再起動

⑤info.phpをブラウザで開いてページ内検索でmemcachedで検索
HITする事を確認

以上

Windows環境でのMemcachedインストール方法の情報が結構バラバラだったので、まとめてみました。
Sublime Text2 で Titanium Mobile のコード補完を効かせる方法


1.  PackageManager で SublimeCodeIntel をインストールする
        参考: http://ready-study-go.blogspot.jp/2011/09/sublime-text-2.html

2.  jsca2js を使って Titanium Mobile の api.json を JS 化する
        https://github.com/navinpeiris/jsca2js

    Titanium3.0.0 の api.json をインストールする場合、jsca2/titanium-mobile.py の 23行目を
    次のように書き換える

    ```python:titanium-mobile.py
        url = 'http://docs.appcelerator.com/titanium/data/' + version + '/api.json'
    ```

    ※ Titanium3.0.0 の api.json も http://docs.appcelerator.com/titanium/data 以下にあるため。

3.  生成された titanium-mobile-x.x.x.js を ~/.codeintel/extra にコピーする
      本来は別にコピーする必要はないですが、次の説明をしやすくするために。

4.  SublimeCodeIntel の javascriptExtraPaths に、生成した titanium-mobile-x.x.x.js のパスを追加する
        ~/.codeintel/config をテキストエディタで開き下記を追加する

    ```javascript:~/.codeintel/config
        {
            "JavaScript": {
                "javascriptExtraPaths": ["~/.codeintel/extra"]
            }
        }
    ```

    以上で自動補完が効くようになっているはず

5. (オプション) CoffeeScript でも補完が効くようにする
    Sublime Text2 の > Preferences > Package Settings > SublimeCodeIntel > Settings - User を開き下記を追加する

    ```javascript
        {
            "codeintel_syntax_map":
            {
                "CoffeeScript": "JavaScript"
            }
        }
    ```
MySQLスクリプトのコメント

※「--」の場合は「-- コメント」と半角スペースを１つ以上空けることに注意。

下記はすべてコメント

```sql
-- line comment.
  -- line comment.
    --   line comment.

#line comment.
# line comment.
 # line comment.

/*
 * comments.
 */

    /*
 * comments.
                */

/* line comment. */
  /* line comment. */
```
HeidiSQLでのcsvエクスポート、インポート

## 利用シーン
MySQL(UTF8のDB)からテーブル単位でCSV出力して、Excelで編集し再度取り込む。

### エクスポート
* テーブルを選択する。
* 「メニュー＞Tools＞Export grid rows ..」を選択する。
* Encodingを「ANSI」とする。
* Row selectionを「Complete」とする。
* 「OK」を押してエクスポートする。

～ Excel等でCSVを編集

### インポート
* 取り込むCSVの文字コードをUTF-8とする。※任意のエディタやツールで
* 「メニュー＞Tools＞Import CSV file ..」を選択する。
* Control charactersのFields terminated byを「,」にする。
* Methodを「Client parses file contents」にする。
* 「Import!」を押してインポートする。

###　補足

Handling of duplicate rowsオプション

|オプション|説明|
|-----------|------------|
|INSERT (may throw errors)|登録時に利用する。取り込みファイルに重複行があると、エラーとなる。|
|INSERT IGNORE (duplicates)|登録時に利用する。取り込める行だけ取り込む。（重複行はスキップ）|
|REPLACE (duplicates)|キーが同じ行は更新される。取り込める行は取り込まれる。（重複行はスキップ）|
ブランチ作り直し

いったん `devel` ブランチを消して作りなおす。

```
task recreate_devel_branch => sub {
    my ($host, @args) = @_;
    my $dir = get 'deploy_dir';
    remote {
        run "cd \Q$dir\E && git checkout master && git branch -D devel && git fetch origin && git checkout -b devel origin/devel";
    } $host, user => get 'git_clone_user';
};
```