OmniAICreator/Qiita-1.07M huggingface dataset:
配列要素の同値性を比較する

配列の全要素が同じかどうかを比較するには`Array#uniq`が使えます。

```ruby
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1].uniq.size==1 # => true
[1, 1, 1, 1, 1, 1, 1, 2, 1, 1].uniq.size==1 # => false
%w(street retest setter tester).uniq { |w| w.chars.sort }.size==1 # => true
```
これをメソッドにした`Array#same?`を考えました。

```ruby
class Array
  def same?(&blk)
    self.uniq(&blk).size==1
  end
end
```
`uniq`同様、ブロックで同値性の条件を定義できます。

`same?`を使うと先の例は次のように簡潔に書けます。

```ruby
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1].same? # => true
[1, 1, 1, 1, 1, 1, 1, 2, 1, 1].same? # => false
%w(street retest setter tester).same? { |w| w.chars.sort } # => true
```

[RubyのメソッドArray#same?は要りませんか？](http://melborne.github.com/2012/10/30/compare-elements-in-an-array/ 'RubyのメソッドArray#same?は要りませんか？')
TapでFizzBuzz

`Object#tap`でFizzBuzzしてみました : )

```ruby
def fizzbuzz(n)
  n.tap { break :Fizz if (n%3)==0 }
   .tap { break :Buzz if (n%5)==0 }
   .tap { break :FizzBuzz if (n%15)==0 }
end

(1..100).each { |i| printf "%s ", fizzbuzz(i) }

# >> 1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 17 Fizz 19 Buzz Fizz 22 23 Fizz Buzz 26 Fizz 28 29 FizzBuzz 31 32 Fizz 34 Buzz Fizz 37 38 Fizz Buzz 41 Fizz 43 44 FizzBuzz 46 47 Fizz 49 Buzz Fizz 52 53 Fizz Buzz 56 Fizz 58 59 FizzBuzz 61 62 Fizz 64 Buzz Fizz 67 68 Fizz Buzz 71 Fizz 73 74 FizzBuzz 76 77 Fizz 79 Buzz Fizz 82 83 Fizz Buzz 86 Fizz 88 89 FizzBuzz 91 92 Fizz 94 Buzz Fizz 97 98 Fizz Buzz 
```
if修飾子が真でbreakが発動します。途中のブロックでbreakが発動しても評価は最後まで進みます。いずれのbreakも発動しない場合はnが返ります。

[TapがRubyの新たな制御構造の世界を開く](http://melborne.github.com/2012/10/29/rubys-new-control-structure-by-tap-and-break/ 'TapがRubyの新たな制御構造の世界を開く')
new演算子が作用できるもの

クラスとselfとstringが指定できることは知っていたけどオブジェクトが指定できるのは知らなかった。

* クラス
* self, parent, static(クラスのコンテキスト内のみ)
* クラス名(string)
* オブジェクト (PHP5.3以降)

```php
<?php
class A {
}

$classname = 'A';

$a = new A; //Aオブジェクト1
$b = new $classname; //Aオブジェクト2
$c = new $a; //Aオブジェクト3
```

オブジェクトをnewすると、単に「オブジェクトのクラス名」をnewしたのと同じ挙動になります。
なお、オブジェクトに__toString()が実装されていても、単に無視されます。
tmux起動時に分割する

普段使う分割はだいたい決まっているので、起動したときについでに分割して欲しいなーという話。

tmuxはセミコロンでマルチコマンドが使えるらしく、単純にこんな感じでいいらしい。

```
tmux new-session \; splitw
```

このまま\; splitw -h \; splitw -vと続けていってもいいのだが、長くなりそうなので

```~/.tmux/session
selectp -t 0
splitw -h
selectp -t 0
splitw -v
selectp -t 0
```

といった感じで自分好みのものを作り、

```
tmux new-session \; source-file ~/.tmux/session
```

で実行すると楽。
変えたいときは~/.tmux/sessionを編集すればいい。

もちろんこれを.zshrcなんかにaliasとして書いておくと便利かと。
attachも考慮した上で自分は最終的に.zshrcにこんな風に書いてます。

```.zshrc
if [ $SHLVL = 1 ]; then
	alias tmux="tmux attach || tmux new-session \; source-file ~/.tmux/session"
fi
```

tmuxを実行するとattachしてくれる、無ければ起動して分割してくれる、という感じです。
$SHLVLで判定しているのはtmux起動中は普通にtmuxコマンドを使えるようにするためです。


といった具合でどうでしょう。
参考になれば幸いです。
ISUCON2 向けのOSの初期設定


isucon2 に向けた、 CentOS の競技用チューニング。

## SELinux無効
`/etc/selinuc/config` で `SELINUX=disabled`

##iptables切る
http://akitosblog.seesaa.net/article/160568740.html

```
/etc/init.d/iptables stop
chkconfig iptables off
```

##カーネルの設定

TCPのチューニングと、カーネルパニックになったら再起動するように。

/etc/sysctl.conf の最後に次のを追記しておく。

```
net.ipv4.tcp_tw_reuse = 1  # recycle は危険. reuseだけで十分
net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_rmem = 16384 131072 262144
net.ipv4.tcp_wmem = 16384 131072 262144
net.ipv4.tcp_mem  = 2048000 4096000 4096000

kernel.panic = 10
```

再起動もしくは sysctl -p で反映

kernel.panic がこれで反映されるか不明。起動オプションに panic=10 とつけたほうがいいかもしれない。

##パッケージ

```
yum install -y \
  vim screen tmux rsync \
  pcre-devel perf strace gcc kernel-devel kernel-headers \
  apr-util bzip2-devel bzip2 ctags diffutils dstat \
  gcc gdb git httpd-tools man-pages patch pcre-devel \
  sqlite-devel zlib-devel
```

##nginx
1.3.7 を使用。

```
http {
    open_file_cache max=10000;
    sendfile on;
    …
}
```

open_file_cache を設定しておくと、ファイルを開き直し＆読み直ししないので、statsを含めるとかなりのシステムコールを削減できる。小さい静的ファイルの配信速度がかなり上がるはず。
縦書きテーブルで\multicolumnを使う方法

縦書きのテーブルは、e-pTeXなどにある、
_plext_ パッケージによって`\begin{tabular}<t>{...}`で追加出来るようになる。

ただ、`\tate`モードに突入してしまうので、通常`\yoko`モードで実行される
`\multicolumn`を用いると、_unboxed_ エラーとなる。
なので、テーブル自体を`\hbox`などに挿入し、その冒頭で`\tate`を使って縦書きモード
にしてからであれば、使うことが出来る。

```tex:tate-multi.tex
\usepackage{plext}

\hbox{%
	\tate
	\begin{tabular}<t>{ll}
	...
	\multicolumn{2}{c}{ ...... } \\
	...
	\end{tabular}
}
```
wgetのpostのパラメータでurlを渡す

様々な理由でwgetのpostのパラメータとして、urlを渡したい時はあるけど、&のエスケープは気をつけないといけない.

たとえば、```{a: 1, b: 2}```というパラメータを渡したいなら

```bash
wget --post-data="a=1&b=2" http://hogehoge.com/fuga/piyo
```

となるが、```{url: "http://example.com/?a=1&b=2"}```みたいなのを渡したい時は
```&```をescapeしてあげないといけない

escapeするには```%26```を使う。

```bash
wget --post-data="url=http://example.com/?a=1%26b=2" http://hogehoge.com/fuga/piyo
```
Google Maps API Key の取得で「入力されたフィンガープリントは無効です。」が出るようになった件


Android で Googleマップを利用する際に必ず通る道である Google Map API Key の取得。
久しぶりに行ったら、少しハマったのでメモ。

手順は、

[Maps API Keyの取得 - Android Wiki](http://wikiwiki.jp/android/?Maps%20API%20Key%A4%CE%BC%E8%C6%C0)

など、たくさん出てくるが、この通りやっても **「入力されたフィンガープリントは無効です。」** とエラーになってしまう。

「いやいやご冗談を。」と、よぉ〜く見直したら、

##keytool の結果が MD5 じゃなくて SHA1 になってるッ！！！

という話。

```
$  keytool -list -keystore ~/.android/debug.keystore 
```

>キーストアのパスワードを入力してください:  
>
*****************  WARNING WARNING WARNING  *****************
*キーストアに保存された情報の整合性は*
*検証されていません。整合性を検証するには*
*キーストアのパスワードを入力する必要があります。*
*****************  WARNING WARNING WARNING  *****************
>
キーストアのタイプ: JKS
キーストア・プロバイダ: SUN
>
キーストアには1エントリが含まれます
>
androiddebugkey,2011/10/05, PrivateKeyEntry, 
証明書のフィンガプリント(SHA1): xx:xx:xx:xx:xx:xx:xx:…

上のリンク先のコメントにチラッと説明があった。
どうやら Java7 を導入すると SHA1 に替わってしまうらしい。

-v を足して実行すると、MD5 も表示されるので、そこからコピーして解決。

```
$  keytool -list -keystore ~/.android/debug.keystore -v
```

>キーストアのパスワードを入力してください:  
>
*****************  WARNING WARNING WARNING  *****************
*キーストアに保存された情報の整合性は*
*検証されていません。整合性を検証するには*
*キーストアのパスワードを入力する必要があります。*
*****************  WARNING WARNING WARNING  *****************
>
キーストアのタイプ: JKS
キーストア・プロバイダ: SUN
>
キーストアには1エントリが含まれます
>
別名: androiddebugkey
作成日: 2011/10/05
エントリ・タイプ: PrivateKeyEntry
証明書チェーンの長さ: 1
証明書[1]:
所有者: CN=Android Debug, O=Android, C=US
発行者: CN=Android Debug, O=Android, C=US
シリアル番号: 4e8bdcd5
有効期間の開始日: Wed Oct 05 13:28:05 JST 2011終了日: Fri Sep 27 13:28:05 JST 2041
証明書のフィンガプリント:
	 MD5:  xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:…
	 SHA1: xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:…
	 SHA256: xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:…
	 署名アルゴリズム名: SHA1withRSA
	 バージョン: 3

気づかねぇよ、こんなもん（←やつあたり
debugger で常に autoeval を有効に


```ruby
require "debugger"
Debugger.settings[:autoeval] = true
```

ってずっと書いてたんだけど、`~/.rdebugrc` つくって

```
set autoeval
```

と書けばよかった。ruby-debug19 でも同様。

参考: http://github.com/cldwalker/debugger
NERDTreeで開いているファイルがツリーのどこなのか表示する

":NERDTreeFind                                                  *:NERDTreeFind*
    Find the current file in the tree."

参考リンク: [nerdtree/doc/NERD_tree.txt at master · scrooloose/nerdtree · GitHub](https://github.com/scrooloose/nerdtree/blob/master/doc/NERD_tree.txt)
JSON の構文の正当性をチェックする

パッケージマネージャで [yajl](http://lloyd.github.com/yajl/) をインストールすると `json_verify` コマンドがついてくる。このコマンドは標準入力に渡された JSON テキストの構文が正しいかどうかチェックする。

```
> echo "[1, 2, 3]" | json_verify
JSON is valid

> echo "[1, 2 3]" | json_verify
parse error: after array element, I expect ',' or ']'
                                        [1, 2 3] 
                     (right here) ------^
JSON is invalid
```

ただし `json_vefify` は JSON テキストのトップレベルに object または array 以外の値があっても valid と判定する点に注意されたい（ [JSON の仕様 （RFC4627）](http://www.rfc-editor.org/rfc/rfc4627.txt)は、トップレベルの値が object または array でなくてはならないと定めている）。**2015年10月追記：** [新しい JSON の仕様（RFC7159）](https://tools.ietf.org/html/rfc7159)はトップレベルに任意の値を許すようになった。

```
> echo '"string"' | json_verify
JSON is valid

> echo 42 | json_verify
JSON is valid
```
Paperclipのデータ保存/削除処理をstub化する方法


PaperClipを使ってデータを保存するモデルを作る場合、create等データを保存/削除する処理をした場合、テストの度にファイルが上がってしまう。そこで保存/削除処理をstub化してこれを回避するための方法
save_attached_files,prepare_for_destroy,destroy_attached_filesをstub化すれば良い。

```ruby:
Model.any_instance.stub(:save_attached_files).and_return(true)
Model.any_instance.stub(:prepare_for_destroy).and_return(true)
Model.any_instance.stub(:destroy_attached_files).and_return(true)
```
改行をスペースに置換して一行にする

sedでは改行を含む文字列を一行に結合するのは結構面倒臭い。引数無しのxargsにパイプで複数行の文字列を渡すと、タブや改行がすべてスペースに置き換わった一行のテキストが得られる。

```
$ ps 
  PID TTY           TIME CMD
  277 ttys000    0:00.28 -zsh
  746 ttys000    0:00.01 tmux
  747 ttys000    0:00.00 (tmux)
  749 ttys001    0:01.38 -zsh
26028 ttys002    0:02.13 -zsh
17193 ttys003    0:00.10 -zsh
17203 ttys004    0:00.06 -zsh
19801 ttys005    0:00.60 -zsh
 $ ps | xargs
PID TTY TIME CMD 277 ttys000 0:00.28 -zsh 746 ttys000 0:00.01 tmux 747 ttys000 0:00.00 (tmux) 749 ttys001 0:01.38 -zsh 26028 ttys002 0:02.15 -zsh 36213 ttys002 0:00.00 xargs 17193 ttys003 0:00.10 -zsh 17203 ttys004 0:00.06 -zsh 19801 ttys005 0:00.60 -zsh
```
git mergetoolでマージする


Conflictの解消とかわかりにくいから、そこはGUIでMergeしたいという方へ。

![ScreenShot of DiffMerge](http://www.sourcegear.com/images/screenshots/diffmerge/mac_file_window_merge.png)

自分の知っている中で一番優秀なFreeのmargetoolはdiffmerge(http://www.sourcegear.com/diffmerge/)

3-way-mergeに対応していて、左右で自分と相手の変更を見ながら、真ん中のViewでEditできる！さらに、真ん中のViewでは初期状態としてMerge元の状態が表示されているので、それも確認しながら最終バージョンを作成できる！！
とりあえずダウンロードしよう！(注：ダウンロード時のEmailアドレス登録はスキップできる。)



### Merge(`git mergetool`)用の設定

```
git config --global merge.tool diffmerge
git config --global mergetool.keepBackup false
git config --global mergetool.diffmerge.cmd "diffmerge --merge --result=\$MERGED \$LOCAL \$BASE \$REMOTE"
git config --global mergetool.diffmerge.trustExitCode true
```

### Diff(`git difftool`)用の設定

```
git config --global diff.tool diffmerge
git config --global difftool.diffmerge.cmd "diffmerge \$LOCAL \$REMOTE"
```

参考：

- http://gitguru.com/2009/02/22/integrating-git-with-a-visual-merge-tool/
- http://adventuresincoding.com/2010/04/how-to-setup-git-to-use-diffmerge/
git blameを再帰的に行う


ある行の変更がどういう経緯でなされたか知りたい時に。
リファクタリング等々の原因で`git blame`一発では知りたいChangeに辿りつけないことありますよね。

## $ tig blame

`git`コマンドだけではさすがに厳しいので、vim風インターフェースの`tig`を使って

```
tig blame <filename>
```

とする。

この画面上で、以下の操作を繰り返すことで、コミット履歴をたどっていける。

- `Enter`: カーソル行のコミット内容を表示
- `,`: カーソル行のコミットの親のコミットにblameを適用

他に使いそうな`tig`コマンドとしては

- `h`: `tig`で使えるコマンド一覧を表示
- `Tab`:ビューのフォーカスを切り替え
- `q`: 現在のビューを閉じる


ちなみに一度、`,`を押してしまうと、前の画面に戻る方法はないらしい。そんな時は`q`または`Q`で一から閉じてやり直し。
まぁ、これ以上求めるなら、GUIツールを使ってください。

## $ git log -S/-G

ちょっと違うけれど、

```
git log -p -S'search keyword'
```

もおすすめ。`search keyword`が含まれる変更をすべて出してくれる。実はこっちのほうが使えるかも。

ちなみに、`-p`はlogをパッチ形式出だしてくれるオプションで、これをつけることで、どういうdiffだったかが見られる。


正規表現も以下のどちらかのようにすれば使える。

```
git log -p -G'regex search keyword'
git log -p -S'regex search keyword' --pickaxe-regex
```

2つの違い？気にするな。`-G`の方が打ちやすい。それでいいじゃないか。


## 参考
- http://git.661346.n2.nabble.com/In-depth-git-blame-td6082521.html
- http://qiita.com/items/94d62f3678e9abcac82a
JVMを32bitから64bitに変更する時はpermGenSpace消費増に注意 

今時 32bit JVM なんてないわー

JVMを 32bitから64bitに変更すると、同じアプリでも permGenSpace (permenent 領域)の要求量が増えます。この領域を使い切ると Eclipse でおなじみ ``OutOfMemoryError: PermGen space`` で GC 祭りとなり、固まります。泣きたい。

普通は設計を大幅に見直さない限り permanent 領域の容量は減らせませんので、対策は permenent 領域の割当を引き上げてやるしかありません。

割当は java 起動時の ``-XX:MaxPermSize`` オプションで変更可能です。Oracle 公式の [Java Hotspot VM Options](http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html) によりますと...

> -XX:MaxPermSize=64m	
> Size of the Permanent Generation.  [5.0 and newer: 64 bit VMs are scaled 30% larger; 1.4 amd64: 96m; 1.3.1 -client: 32m.]

java5 以降の 64bit VM ではデフォルトで 32bit時の 30%増し、つまり約 83MB まで拡張されることになっているそうですが…うーん。今回は実測ベースで約 55MB で推移してたものが 83MB 使い切って溢れたのですよ。 30% 増しじゃ足りませんがな。

まぁ、同時にJavaのバージョンも上げてるので深くは追求するまい。

今回はメモリに余裕のあるマシンだったので富豪的に

```
-XX: MaxPermSize=256m 
```

を起動オプションに追加して乗り切ることにしました。設定が入ったかどうかの確認は

```
% jmap -heap <PID> | grep MaxPermSize
  MaxPermSize      = 268435456 (256.0MB)
```

でやるのがよろしいかと。

(以下、蛇足)

Java 6 以降ではヒープサイズ 32GB 以下の場合には 32bit ポインタを使う(-XX:+UseCompressedOops 有効) が、 Java5 ではつねに 64bit ポインタが使われてしまうため、特に消費増が顕著とか。いまから Java5 に乗り換える人はいないでしょうが、そんな情報もありました、と言うことで。

http://stackoverflow.com/questions/7383658/permgen-space-exception
jQuery.inArray() ≒ Array.prototype.indexOf()


`jQuery.inArray()`をてっきり値が配列内にあるかどうかの論理値を返すメソッドかと思っていたら、インデックス数を返すメソッドで、**ECMA5**の`Array.prototype.indexOf()`とほぼ同じ機能だった(厳密には違うので各ドキュメントを参照されたし)。

`Array.prototype.indexOf()`は**ECMA5**で定義された配列型のインスタンスメソッドで、残念ながらIE8などには対応していない。対応していないブラウザにもモンキーパッチ的にprototype拡張をすればなんとかなるけど([参考](https://developer.mozilla.org/ja/docs/JavaScript/Reference/Global_Objects/Array/indexOf))、なるべくprototype汚染はしたくないし、jQueryを使っているならプラグインも必要ないわけだしそのままユーティリティ関数として使ったほうがいい。

```javascript
// How to
jQuery.inArray(1, [1, 2, 3]); // => 0
jQuery.inArray(2, [1, 2, 3]); // => 1
jQuery.inArray(3, [1, 2, 3]); // => 2
jQuery.inArray(4, [1, 2, 3]); // => -1
```

ちなみに**PHP**では有無の論理を返すのが`in_array()`で、インデックス数を返すのが`array_search()`。

名前がややこしい。

注意は、値が含まれていない場合に`-1`を返すので、暗黙的な`false`にはならないということ。条件としてそのままは使えない。

```javascript
// ダメな例
if (jQuery.inArray(needle, array)) {
	// 処理
}

// 良い例
if (jQuery.inArray(needle, array) !== -1) {
	// 処理
}
```

以上メモでした。
Ruby で楽に範囲のチェックをする

範囲のチェックをする時に、

```ruby
hoge >= min and hoge <= max
```

と書くのはめんどくさい。

`Comparable` module をインクルードしているクラスでは `between?` メソッドを使って楽にチェックができる。

```ruby
between?(min, max)
``` 

Fixnum でも使えるし:

```ruby
1.9.3p194 :228 > 10.between?(1, 10)
 => true
1.9.3p194 :229 > 11.between?(1, 10)
 => false
```

DateTime でも使える:

```ruby
1.9.3p194 :230 > DateTime.parse('2012-10-01').between?(DateTime.parse('2012-01-01'), DateTime.parse('2012-12-31'))
 => true
1.9.3p194 :231 > DateTime.parse('2013-01-01').between?(DateTime.parse('2012-01-01'), DateTime.parse('2012-12-31'))
 => false
```
良い感じにスワイプを検知する方法

AndroidのWebViewベースのアプリを作っていて、苦戦したのでメモ。zepto.jsのスワイプイベントを検知する奴を使っていたけど、ちょっと縦スクロール中に、ちょっと指が横に滑っただけでも検知してしまって、使い物にならなかったので、以下のscriptで対応した。


```
			var touchStartX;
			var touchEndX;
			this.$el.bind("touchstart",function(e){
				touchStartX = e.touches[0].pageX;
			});

			this.$el.bind("touchmove",function(e){
				touchEndX = e.touches[0].pageX;
				var diff = touchStartX - touchEndX;
				if (diff < 0) diff = diff * -1;
				if (diff > 35){
					self.toggleDescription();
				}
			});

```

35ぐらいがいい感じかな？
Sublime Tex2のテーマいろいろ


##テーマ

[nilium/st2-nil-theme](https://github.com/nilium/st2-nil-theme)

[buymeasoda/soda-theme](https://github.com/buymeasoda/soda-theme)

[netatoo/phoenix-theme](https://github.com/netatoo/phoenix-theme)

[cafarm/aqua-theme](https://github.com/cafarm/aqua-theme)

[danro/refined-theme](https://github.com/danro/refined-theme)

##テーマの切替を簡単にするためのプラグイン

[chrislongo/QuickThemes](https://github.com/chrislongo/QuickThemes)
nanoエディタでWindowsっぽいキーバインド

<dl class="alert alert-info">
<dt>追記</dt>
  <dd>今なら「Windowsっぽいキーバインド」なら<a href="https://micro-editor.github.io/">Micro</a>とかの方がおすすめなの</dd>
  <dd><a href="http://qiita.com/tadsan/items/f0747f09ea5ce863f2ec">いま熱い最新スクリーンエディタmicro ことはじめ - Qiita</a></dd>
</dl>

##それは小さなエディタなの
nanoとは、最近のPC-UNIX(LinuxとかMac OS Xとか)に入ってるスクリーンエディタのことなの。VimとかEmacsみたいにキーバインドが凝ってなくて、コマンドが常に画面下部に表示されてるから初心者でも混乱しないのが売りなの。端末で動くメモ帳みたいなものなの。

でもnanoのキーバインドって正直言って独特すぎて、ほかのエディタと全然互換性がないの。 `C-k` でカットなのは Emacs っぽいんだけど、それ以外のキーバインドは… わかりにくいの。

##キーバインド、そしてお引っ越しなの!

だからWindowsのメモ帳みたいなキーバインドにしてみたいと思ったの。

そしたらこんな感じになったの!

```bash:~/.nanorc
# Windows (notepad) like keybinding for nano editor
# written by zonuexe, license under GPLv3 or NYSL(0.9982)
# lastupdate: h240921
#
# how to install
# a. rename and move this file to $HOME/.nanorc
#    % mv nanorc.keybindings $HOME/.nanorc
# b. concatenate this file with tail of $HOME/.nanorc
#    % cat nanorc.keybindings >> $HOME/.nanorc

bind ^C copytext    main
bind ^F whereis     main
bind ^G gotoline    main
bind ^I indent      main
bind ^N exit        main
bind ^M enter       main
bind ^S writeout    main
bind ^R replace     main
bind ^V uncut       main
bind ^X cut         main
bind ^Y redo        main
bind ^Z undo        main

bind F1 help        main
bind F3 whereis     main
#bind F3 nexthistory search
## ここの設定のしかたがわからないの
```

まだいろいろ弄りたいところがあるけど、nanoの挙動がよくわからないのでこの辺にしておくの。正直、メモ帳の `C-n` の挙動とか今回初めて知ったの。 `Shift` とかで範囲選択ができないのはもやもやするけど、 `C-x` で切り取り、 `C-v` で貼り付けとかできればストレスはなくなると思ふの。

めんどくさいひとは端末で `curl https://gist.githubusercontent.com/zonuexe/3760480/raw/nanorc.keybindings >> ~/.nanorc` ってやっておくと良いの。でもOS Xに入ってるnanoは古すぎるので、 [GNU nano: Download](http://www.nano-editor.org/download.php) からダウンロードしてビルドしなきゃだめなの。残念ながらいまのところHomeBrewには入ってないみたいなの。MacPortsのことは知らないの。

そこまでやる気がない子はふつうにLinuxを使っておくか、Vimの操作を覚えておくのが良いの。実際Vimだって基本的な機能だけならそんなに難しくないの。 といふか、SSHでVPSに繋いでるとかじゃなきゃ `gedit` の方が最初からそれっぽいキーバインドなので、そっちを使っておくのがずっと良いの。

##備考
この記事を書いてる自宅警備員は、実は *なのちゃん* のことをよく知らないの。

この設定ファイルの初出は [nano editorでWindows風のキーバインドなの — Gist](https://gist.github.com/3760480) なの。
【解決済】Play2.xのwebsocketで特定のクライアントにpushする方法

掲題の"Play2.xのwebsocketで特定のクライアントに向けてpushする方法"についてご存知の方いらっしゃいましたら、ご教授ください。

##どこまでできたか
ドキュメントを参考にして書いたコード(下記記載)で、リクエストを送ったクライアントに向けてpushすること

##何ができないか(2つの別の問題を抱えています)
1.リクエストを送ったクライアントではなく、接続している任意のクライアントに向けてpushすること
2.参考にしていたPlay付属のsamples/scala/websocket-chatのソースを読み解くために```play run```を実行したところ、下記のようなエラーが表示され、実行できない
>:: USE VERBOSE OR DEBUG MESSAGE LEVEL FOR MORE DETAILS
unresolved dependency: org.scala-tools.sbt#sbt_2.9.1;0.12.1: not found
Error during sbt execution: Error retrieving required libraries
  (see /usr/local/bin/../Cellar/play/2.0.1/bin/../libexec/framework/sbt/boot/update.log for complete log)
Error: Could not retrieve sbt 0.12.1

##環境
Scala 2.9.1
Play 2.0.1
sbt 0.12.1

##現在のコード

```scala:ここまでできたpackage controllers

import play.api._
import play.api.mvc._
import play.api.libs.json.Json
import play.api.libs.iteratee._

object Application extends Controller {
  
  def index = Action {
    Ok(views.html.index("Your new application is ready."))
  }

  def websocket = WebSocket.using[String] { request => 
    
    // Log events to the console
    val in = Iteratee.foreach[String](println).mapDone { _ =>
      println("Disconnected")
    }
    
    // Send a single 'Hello!' message
    val out = Enumerator("Hello!")
    
    (in, out)
  }
}
```##参考
Playのドキュメントの"Websocket"
http://playdocja.appspot.com/documentation/2.0.3/ScalaWebSockets
Playのドキュメントの"反応的なストリーム処理"
http://playdocja.appspot.com/documentation/2.0.3/Iteratees
Play付属のサンプル"Websocket-chat"
https://github.com/playframework/Play20/tree/master/samples/scala/websocket-chat

以上、よろしくお願い致します。
第五回オフラインリアルタイムどう書くの参考問題の実装例(javascript) 

```js
function getRailType(pos, railTypes){
    var a = {
        "A": 0,
        "B": 1,
        "C": 2,
        "D": 3,
        "E": 4,
        "F": 5,
        "G": 6,
        "H": 7,
        "I": 8
    };
    for (var i in a) {
        if (i === pos) {
            return railTypes.charAt(a[i]);
        }
    }
}

function getNextPos(prevPos, curPos, railType){
    var map = {
        "A": ["B#D#", "B#D#", "BDDB"],
        "B": ["ACBECAE#", "AEBCC#EA", "A#BACEEC"],
        "C": ["B#F#", "BFFB", "B#F#"],
        "D": ["AGE#GA", "AEEAG#", "A#EGGE"],
        "E": ["BHDFFDHB", "BFDHFBHD", "BDDBFHHF"],
        "F": ["CIE#IC", "C#EIIE", "CEECI#"],
        "G": ["D#H#", "DHHD", "D#H#"],
        "H": ["E#GIIG", "EIG#IE", "EGGEI#"],
        "I": ["F#H#", "F#H#", "FHHF"]
    };
    var nextPos = map[curPos][railType];
    for (var i = 0; i < nextPos.length; i += 2) {
        if (prevPos === nextPos.charAt(i)) {
            return nextPos.charAt(i + 1);
        }
    }
}

function solve(railTypes, loopTimes){
    var ans = "B";
    for (var i = 0; i < loopTimes; ++i) {
        var railType = getRailType(ans.charAt(i), railTypes);
        ans += getNextPos(i === 0 ? "B" : ans.charAt(i - 1), i === 0 ? "B" : ans.charAt(i), parseInt(railType, 10));
        if (ans.charAt(ans.length - 1) === "#") {
            return ans.substr(0, ans.length - 1);
        }
    }
}

test('solve_test', function(){
    var testDatas = {
        "101221102": "BEDGHIFEH",
        "000000000": "BEH",
        "111111111": "BCF",
        "222222222": "BAD",
        "000211112": "BEFIHEDGH",
        "221011102": "BADGHIFEBCF",
        "201100112": "BEHIFCBADEF",
        "000111222": "BEFIH",
        "012012012": "BC",
        "201120111": "BEDABCFI",
        "220111122": "BADEHGD",
        "221011022": "BADG",
        "111000112": "BCFIHEBA",
        "001211001": "BEFI",
        "111222012": "BCFEHIF",
        "220111211": "BADEHI",
        "211212212": "BCFEBAD",
        "002112210": "BEFC",
        "001010221": "BEF",
        "100211002": "BEFIHG",
        "201212121": "BEFCBAD"
    }
    for (var i in testDatas) {
        deepEqual(solve(i, testDatas[i].length), testDatas[i]);
    }
});
```
ハッシュのスライス


ハッシュに対し、指定した複数のキーに対応する値たちを取得する方法。


Perlではこんな書き方。

```perl
#!/usr/bin/env perl
use strict;
use warnings;
use feature qw(say);

my %hash = (
    hoge => 'foo',
    fuga => 'bar',
    piyo => 'baz',
);

for my $val (@hash{qw(piyo fuga)}) {
    say $val;
}
```

Rubyでは`Hash#values_at`が使えるらしい。

```ruby
#!/usr/bin/env ruby

hash = {
  :hoge => 'foo',
  :fuga => 'bar',
  :piyo => 'baz',
}

hash.values_at(:piyo, :fuga).each do |val|
  puts val
end
```
シェルから MacVim のタブで開いたりする


[mvim](https://github.com/splhack/macvim/blob/master/src/MacVim/mvim) というスクリプトを使うと CLI からよしなに MacVim を起動できる。

さらに CLI からもっとよしなに MacVim でファイルを開いたりしたい。

具体的には:

 * 引数を指定しなければ MacVim のウィンドウを開く
 * 引数を渡すと既存の server のタブで開く

といったことをしたい。

```zsh:macvim
function macvim () {
  local mvim="/Applications/MacVim.app/Contents/MacOS/mvim"

  if [[ ${#@} = 0 ]]; then
    $mvim
  else
    $mvim --remote-tab-silent $@
  fi
}
```
phpのboolをintにキャストする際 

ちょっとメモ

bool型をint型にキャストして値を取得したいがために以下の要に記述
しかしこのままで帰ってくるのはbool型

```
/**
 * @return int
 */
public function getPayType()
{
    return (int) $this->getCoinFlag() === self::COIN_FLAG;
}
```

何故かっていったら左方から優先して型変換を行ってくれたので
上記のような記述方法だと以下のように解釈される


```
public function getPayType()
{
    return ((int) $this->getCoinFlag()) === self::COIN_FLAG;
}
```

実際に帰ってくるのはbool型

なので以下のように変更して上げる事で目的のint型が帰ってきてくれる

```
/**
 * @return int
 */
public function getPayType()
{
    return (int) ($this->getCoinFlag() === self::COIN_FLAG);
}
```
Rails でテキストエリアのデフォルトの行数・列数を変更する


```ruby
= form_for @post do |f|
  = f.text_area :body
```

みたいなコードで生成される textarea の cols, rows はデフォルトでは 40, 20 になる。個人的には rows 多すぎ。

```ruby
= f.text_area :body, rows: 10
```

と書けば上書きできるけど、デフォルトを変えたい。

`actionpack-3.2.8/lib/action_view/helpers/form_helper.rb` をみると下記の定数があり、これを使用している。

```ruby
DEFAULT_TEXT_AREA_OPTIONS = { "cols" => 40, "rows" => 20 }
```

なので `config/initializers/form_helper.rb` あたりにファイルを作って、下記のコードを書けばよい。

```ruby
ActionView::Helpers::InstanceTag::DEFAULT_TEXT_AREA_OPTIONS.merge!("rows" => 10) 
```
CAAnimationのdelegateの循環参照

CAAnimationのdelegateには落とし穴があった。

UIKitのdelegate系はすべて弱参照だと思っていたが、
CAAnimationのdelegateに限っては強参照のようだ。

https://developer.apple.com/library/mac/#documentation/graphicsimaging/reference/CAAnimation_class/Introduction/Introduction.html
Important: The delegate object is retained by the receiver. This is a rare exception to the memory management rules described in Advanced Memory Management Programming Guide.
An instance of CAAnimation should not be set as a delegate of itself. Doing so (outside of a garbage-collected environment) will cause retain cycles.


NSTimerのターゲットアクションもそうだが、非常に気づきにくいメモリリークの原因である。
他にもこういうケースはありそうである。
また、ヘッダーをしっかり確認するというのは大切である。


CAAnimationの明示的アニメーションは、
        animation.fillMode = kCAFillModeForwards;
        animation.removedOnCompletion = NO;
等と設定しない限りはアニメーションの終了と同時にオブジェクトが消滅するが、
ループアニメーションの場合や、上の設定をした場合、自然には削除されない。

なので例えばViewController等でLayerをコントロールする場合、
ViewConroller -> View -> Layer -> ViewController(delegate)
という強参照ループが状況によってはあり得る

さてdelegateを使う場合今回のケースの対策だが、ごく単純に

```ObjC
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
{
    /*ここで何か処理*/
    anyLayer.delegate = nil;
}
```

としてみたが、理由は分からないが例外をはかれてしまった。
なので、

```ObjC
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
{
    /*ここで何か処理*/
    [anyLayer removeAllAnimations];
}
```

ということで対応ができた。
これは状況によってどのように循環参照を断ち切るのかは変わってきそうである。
OS X のバージョン番号を取得する

http://cocoadev.com/wiki/DeterminingOSVersion によれば、 OS X のバージョンを取得する正しい方法は `/System/Library/CoreServices/SystemVersion.plist` の `ProductVersion` キーを参照することらしい。

```objc
NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:@"/System/Library/CoreServices/SystemVersion.plist"];
NSString *version = [dict objectForKey:@"ProductVersion"];
// version == "10.8.2"
```

`Gestalt()` で取得することもできるが、この関数は10.8から非推奨になった。

```objc
 SInt32 major, minor, bugFix;
 Gestalt(gestaltSystemVersionMajor, &major);
 Gestalt(gestaltSystemVersionMinor, &minor);
 Gestalt(gestaltSystemVersionBugFix, &bugFix);
// major  == 10
// minor  == 8
// bugFix == 2
```

Human readable な文字列が欲しければ `-[NSProcessInfo operatingSystemVersionString]` が使える。

```objc
NSString *version = [[NSProcessInfo processInfo] operatingSystemVersionString];
// version == "Version 10.8.2 (Build 12C60)"
```
Sequel Pro で C-h でちゃんと DELETE する


[KeyRemap4MacBook](http://pqrs.org/macosx/keyremap4macbook/) を使う。

```xml:private.xml
<?xml version="1.0"?>
<root>
  <appdef>
    <appname>SEQUELPRO</appname>
    <equal>com.google.code.sequel-pro</equal>
  </appdef>

  <item>
    <name>Sequel Pro</name>
    <item>
      <item>Remap C-h to DELETE</item>
      <identifier>org.aereal.sequel-pro.remap-c-h-to-delete</identifier>
      <autogen>--KeyToKey-- KeyCode::H, VK_CONTROL, KeyCode::DELETE</autogen>
    </item>
  </item>
```

~/Library/Application Support/KeyRemap4MacBook/private.xml に追記 (なければ作る) する。

/Library/PreferencePanes/KeyRemap4MacBook.prefPane を開いて "Reload XML"
テーブルとインデックスのサイズ、件数を取得するスクリプト

USER_EXTENTS からテーブルとインデックスのサイズを集計するとともに、テーブルの場合は件数も取得して標準出力に出力します。

```powershell:GetTableSize.ps1
[void][reflection.assembly]::LoadWithPartialName("Oracle.DataAccess")

$conStr = "Data Source=XE;User Id=hr;Password=hr"

$con = New-Object Oracle.DataAccess.Client.OracleConnection($conStr)
$con.Open()

$sqlStr="select segment_name,segment_type,sum(bytes)/1024/1024 as MB 
from user_extents 
group by segment_name,segment_type
order by segment_type,segment_name"

$cmd = New-Object Oracle.DataAccess.Client.OracleCommand($sqlStr, $con)
$reader = $cmd.ExecuteReader()

$outputDataFormat="  {0, -10} {1, -30} {2, 10} {3, 15}"
Write-Host ($outputDataFormat -F "TYPE", "OBJECT_NAME" ,"SIZE(MB)", "RECORD_COUNT")
while ( $reader.read() )
{
    if ($reader[1] -eq "TABLE"){
        $countSql=("select count(*) from {0}" -F $reader[0])
        $cmd = New-Object Oracle.DataAccess.Client.OracleCommand($countSql, $con)
        $countReader = $cmd.ExecuteReader()
        [void]$countReader.read()
        
        Write-Host ($outputDataFormat -F $reader[1] ,$reader[0] ,$reader[2], $countReader[0])
    }else{
        Write-Host ($outputDataFormat -F $reader[1] ,$reader[0] ,$reader[2], "")
    }
}
$con.Close()
```

以下のような結果が出力されます。

```
  TYPE       OBJECT_NAME                      SIZE(MB)    RECORD_COUNT
  INDEX      COUNTRY_C_ID_PK                    0.0625
  INDEX      DEPT_ID_PK                         0.0625
  INDEX      DEPT_LOCATION_IX                   0.0625
  INDEX      EMP_DEPARTMENT_IX                  0.0625
  INDEX      EMP_EMAIL_UK                       0.0625
  INDEX      EMP_EMP_ID_PK                      0.0625
  INDEX      EMP_JOB_IX                         0.0625
  INDEX      EMP_MANAGER_IX                     0.0625
  INDEX      EMP_NAME_IX                        0.0625
  INDEX      JHIST_DEPARTMENT_IX                0.0625
  INDEX      JHIST_EMPLOYEE_IX                  0.0625
  INDEX      JHIST_EMP_ID_ST_DATE_PK            0.0625
  INDEX      JHIST_JOB_IX                       0.0625
  INDEX      JOB_ID_PK                          0.0625
  INDEX      LOC_CITY_IX                        0.0625
  INDEX      LOC_COUNTRY_IX                     0.0625
  INDEX      LOC_ID_PK                          0.0625
  INDEX      LOC_STATE_PROVINCE_IX              0.0625
  INDEX      REG_ID_PK                          0.0625
  TABLE      DEPARTMENTS                        0.0625              27
  TABLE      EMPLOYEES                          0.0625             107
  TABLE      JOBS                               0.0625              19
  TABLE      JOB_HISTORY                        0.0625              10
  TABLE      LOCATIONS                          0.0625              23
  TABLE      REGIONS                            0.0625               4
```
Intel AcceleratorつきでWindowsのAndroidエミュレータを起動する方法

WindowsマシンでAndroidエミュレータを普通に起動すると、めちゃくちゃ遅いため、Intel Emulator Accelerator を使います。

検証環境: Windows7 + Android 4.0.3

1. SDK Manager の Extras から Intel x86 Emulator Accelerator を選択してインストール
1. [Androidインストールディレクトリ]\android-sdk\extras\intel\Hardware_Accelerated_Execution_Managerで、IntelHaxm.exeを実行してインストール
1. Intel Atom (x86) を選択
1. Built-inでWXGA800を選択
1. Resultionを選択して、1280*800と入力
1. Device ram size の 1024 に "MB" を追加
1. Startをクリックして起動

下２つは、「Failed to allocate memory: 8」というエラーを回避するために
http://stackoverflow.com/questions/7222906/failed-to-allocate-memory-8
を参考にしたものです。
Vimで挿入モードから抜ける時に英数入力に切り替える


開発にMac book使ってるのでMacでの話です。
Vimでコマンドモードに戻る時にかな入力だと具合が悪いので、
方法がないかとググったら、[KeyRemap4MacBook](http://pqrs.org/macosx/keyremap4macbook/index.html.ja)を使う方法が見つかったんだけど、
自分のしたい設定にするのには、いくつか情報が足らなかったのでメモ。

## 何がしたかったか
自分がしたかったのは、

	ESC と Ctrl+C と Ctrl+[ 全部に適応したい。
	Terminal と MacVim と Sublime など、vimのkeybindなものに適応したい。

ググって見つかるのは、

	ESC と Ctrl+C に適応
	Terminal にのみ適応

でした。

普通に設定をコピって適当に書き換えればいけると思ったのですが、
ちょっと追加する必要がありました。


## 何を追加したのか

### KeyCodeの追加
今回でいうと、[ の KeyCodeがデフォでいないようだったので追加しました。
（デフォであるかもしれないけどわからなかった。）

	<symbol_map type="KeyCode" name="[" value="0x1e" />

EventViewerというウィンドウを立ち上げて、
keyboardを適当にタイプすると、Eventの情報を表示してくれます。
その情報のcodeの欄の数値をvalueに設定すると良いです。

### アプリ定義の追加
	<appdef>
		<appname>SUBLIMETEXT2</appname>
		<equal>com.sublimetext.2</equal>
	</appdef>

TerminalとVimはあらかじめ定義されていたのですが、
Sublime Text2はさすがに定義されていなかったので追加しました。
KeyCodeの時と同じくEventViewerを開いて、
追加したいアプリをアクティブにすると情報が表示されるので、
CurrentApplicationの文字列をequalタグの値に設定。

他のアプリを追加したい場合は同じように設定してあげればOK。

## 出来上がった設定ファイル

```XML:private.xml
<?xml version="1.0"?>
<root>
	<symbol_map type="KeyCode" name="[" value="0x1e" />
	<appdef>
		<appname>SUBLIMETEXT2</appname>
		<equal>com.sublimetext.2</equal>
	</appdef>
	<list>
		<item>
			<name>LeaveInsMode with EISUU(vim keybind apps)</name>
			<identifier>private.vim_keybind_apps_esc_with_eisuu</identifier>
			<only>TERMINAL,VI,SUBLIMETEXT2</only>
			<autogen>--KeyToKey-- KeyCode::ESCAPE, KeyCode::ESCAPE, KeyCode::JIS_EISUU</autogen>
			<autogen>--KeyToKey-- KeyCode::[, VK_CONTROL, KeyCode::[, VK_CONTROL, KeyCode::JIS_EISUU</autogen>
			<autogen>--KeyToKey-- KeyCode::C, VK_CONTROL, KeyCode::C, VK_CONTROL, KeyCode::JIS_EISUU</autogen>
		</item>
	</list>
</root>
```

以上メモでした。
HaxeでjQuery。

**Haxeの標準ライブラリはjQueryを含んでいます。**
ただし、Haxe3では、別途.jsファイルが必要です。あらかじめ、jQueryのサイト( http://jquery.com/ )からダウンロードして、htmlからリンクしておいてください。

#コード例
toggle()を使って二つのボタンを切り変えます。

```html:html
<button class="toggle on">ON</button>
<button class="toggle off" style="display: none">OFF</button>
```

```hx:Main.hx
import js.JQuery;

class Main {
	static function main() {
		new JQuery( "button.toggle" ).click( function() { 
			new JQuery( "button.toggle" ).toggle(); 
		});
	}
}
```

ちなみに$は使えません。そもそも、Haxeでは変数名に"$"を含めることができません。
どうしてもnew JQueryを書くのがめんどくさい人は、適当な1文字に割り当てておきましょう。

```hx:Main.hx
import js.JQuery;

class Main {
	static inline function _( str:String ):JQuery { return untyped $( str ); }
	
	static function main() {
		_( "button.toggle" ).click( function() { 
			_( "button.toggle" ).toggle(); 
		});
	}
}
```

#staticな値について
Haxeではtoggle、add、nextのようなjQueryのインスタンスメソッドについては網羅されているのですが、jQuery.trim()やjQuery.each()などほとんどの静的な関数はサポートされていません。
しかし、多くはHaXeの別の関数で代用可能です。

```hx:Main.hx
import js.JQuery;

class Main {
	static function main() {
		
		//jQuery.each( obj, function(it, val){} )
		//配列やオブジェクトの各要素に対して、関数を呼び出して処理を行います。
		var obj = { one:1, two:2, three:3, four:4, five:5 };
		Lambda.iter( Reflect.fields( obj ), function( it:String ) {
			var val = Reflect.field( obj, it );
		});
		
		
		//jQuery.inArray( value, array )
		//arrayにvalueが含まれるか確かめます。
		var arr = [1, 2, "hoge", 4, "hello" ];
		Lambda.has( arr, "hello" );
		
		
		//jQuery.isArray( obj )
		//objが配列か確かめます。
		Std.is( {}, Array ); 	//false
		
		
		//jQuery.map
		//配列の各要素に対して関数を実行して、関数の返り値の配列を生成します。
		arr = [ "a", "b", "c" ];
		Lambda.array( Lambda.map( arr, function( v:String ) { return v.toUpperCase(); } ) );
		
		
		//jQuery.noConfict()
		//コンフリクトを解消する。
		JQuery.noConflict( true );
		
		
		//jQuery.trim( str );
		//文字列の初めと終わりの空白文字を取り除く。
		StringTools.trim( "\t\n    xxx     " );		//※jQuery.trimと異なり全角スペースは削除されません。
	}
}
```

jQuery.unique()のように対応する関数がHaXeにないものもありますが、JavaScriptに埋め込まれるコードには含まれているのでuntypedを使えば簡単に利用することができます。

```hx:Main.hx
import js.JQuery;

class Main {
	static function main() {
		
		//jQuery.unique( array )
		//配列内の重複を除去。
		var arr = [1, 1, 3, 5, 6, 3, 4, 6 ];
		untyped $.unique( arr );
		
		//jQuery.get( url, data, callback )
		//HTTP(GET)通信でページを読み込み。
		untyped $.get( "test.php" );
		
		//jQuery.support
		//ブラウザの各機能のサポート状況を含むオブジェクト。
		var support:Dynamic<Bool> = untyped $.support;
	}
}
```

#$(this)について
JavaScriptとHaxeではthisの扱いが違います。
jQueryのイベントハンドラやコールバック関数内のthisはそのイベントのターゲットのHTMLのDOM要素ですが、Haxeの場合実行している関数を持つオブジェクトになります。

つまり以下のようになります。

```hx:Main.hx
import js.JQuery;

class Main {
	static function main() { new Main(); }
	
	function new() {
		new JQuery( "button" ).click( function() { 
			trace( this ); //DOMじゃないよMainだよ！
		});
	}
}
```

これだと$(this)も使えないので、$(this)の代わりにJQuery.curを使います。


```hx:Main.hx
import js.JQuery;

class Main {
	static function main() {
		new JQuery( "button" ).click( function(e) { 
			JQuery.cur.text( "ok" );
		});
	}
}
```
----

ちなみにHaxe2.10の時点では、埋め込まれるjQueryのバージョンは1.6.4です。
Qiita の通知をアイコンとポップアップで表示する Chrome 拡張


Qiita のページを開かなくても Qiita の通知が見られるように、Chrome 拡張を作ってみました。

https://github.com/shuhei/qiita-notification

![通知の数](http://dl.dropbox.com/u/1569777/screenshots/qiita_notif.png)

![通知の内容](http://dl.dropbox.com/u/1569777/screenshots/qiita_popup.png)

通知の取得には、サイトで使われている下記の非公開 API を使っています。

- `/api/notifications`
- `/api/notifications/count`
- `/api/notifications/read`

拡張では認証について何もしていないので、Qiita のサイトに Chrome でログインしていないと使えません。

## インストール方法

1. [ソースコード](https://github.com/shuhei/qiita-notification)をダウンロードか clone します。
2. Google Chrome を開きます。
3. ツール -> 拡張機能 -> パッケージ化されていない拡張機能を読み込む...
4. ソースのファイルが入っているディレクトリを選択します。
5. インストール完了です。

## 通知のタイプ

対応している通知タイプは、今のところ以下だけです。

- 投稿がストックされる
- フォローされる
- コメントした記事に新しいコメント

他の通知のタイプは、受け取ってみないとデータ形式かわからないので、受け取り次第順次追加していく予定です。
フォームからmultipartでデータをアップロードする時に一時データの保存先を変更する方法


Ajaxのフォームで画像を上げてサムネイルを表示したい時など、ユーザが上げたデータの一時ファイルの保存先をWEB上から参照できるPATHに変更する方法。ENV['TMPDIR']の値を変更する。initializerなどで最初から定義しておくと便利

```ruby:initializers/myenv.rb
ENV['TMPDIR'] = File.join(Rails.root.to_s, 'public/tmp') 
```
jQueryのanimateでbackground-colorを変更する

参考
http://stackoverflow.com/questions/190560/jquery-animate-backgroundcolor

背景色をjQueryのanimateを使って変えようとするとjquery color pluginを入れようとでてくるが、やっていることは単純なのでプラグインにすることないよという話。
上記URLにもあるが、下記コードを先に読み込んでやればよい

```javascript
(function(d){d.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor","borderTopColor","color","outlineColor"],function(f,e){d.fx.step[e]=function(g){if(!g.colorInit){g.start=c(g.elem,e);g.end=b(g.end);g.colorInit=true}g.elem.style[e]="rgb("+[Math.max(Math.min(parseInt((g.pos*(g.end[0]-g.start[0]))+g.start[0]),255),0),Math.max(Math.min(parseInt((g.pos*(g.end[1]-g.start[1]))+g.start[1]),255),0),Math.max(Math.min(parseInt((g.pos*(g.end[2]-g.start[2]))+g.start[2]),255),0)].join(",")+")"}});function b(f){var e;if(f&&f.constructor==Array&&f.length==3){return f}if(e=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(f)){return[parseInt(e[1]),parseInt(e[2]),parseInt(e[3])]}if(e=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(f)){return[parseFloat(e[1])*2.55,parseFloat(e[2])*2.55,parseFloat(e[3])*2.55]}if(e=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(f)){return[parseInt(e[1],16),parseInt(e[2],16),parseInt(e[3],16)]}if(e=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(f)){return[parseInt(e[1]+e[1],16),parseInt(e[2]+e[2],16),parseInt(e[3]+e[3],16)]}if(e=/rgba\(0, 0, 0, 0\)/.exec(f)){return a.transparent}return a[d.trim(f).toLowerCase()]}function c(g,e){var f;do{f=d.css(g,e);if(f!=""&&f!="transparent"||d.nodeName(g,"body")){break}e="backgroundColor"}while(g=g.parentNode);return b(f)}var a={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]}})(jQuery);
```
Zach Holmanが Aloha RubyConf で紹介してた git 便利 tips


- `git commit -m "LOOK AT ME TROLOLOLOL" --allow-empty`
でno diff commit出来る

- `git status -sb`
で色足してくれてメッセージも要らないのも省いてくれる

- `git config --global help.autocorrect 1`
で`git comit`とかタイポしたときも`commit`してくれる

- `git config --global rerere.enabled 1`
大規模の時にconflictを対処するときになんか作業を覚えてくれるらしい

- `git commit --amend`
で最新のコミットに今の変更点を付け足せるらしい

- `git reset --soft HEAD^`
で最新のコミットをstaging状態に戻せる

- `git shortlog -sn`
で誰がいくらコミットしたかを一覧表示

[紹介元](http://confreaks.com/videos/1229-aloharuby2012-git-and-github-secrets)
jQueryの「draggable」指定時に画面サイズ以上の位置へドラッグできない場合

jQuery-UIを利用して、「ドラッグ可能Object」に指定した場合、ドラッグできる位置がウィンドウサイズ以内に制限されてしまうことがあります。
CSSを編集することでも解消可能ですが、JSのみで解消をするためには、単純に以下のコードでOKです。

```jquery
jQuery(function($) {
    $('body').css({
        possition : 'relative'
    })
});
```
テンプレートがあるかないか調べる

`app/views/posts/_form`のpartialがあるかどうか知りたい時

```ruby
lookup_context.exists?('form', 'posts', true)
```

参考URLのstackoverflowでは例外を使ったやりかたも紹介されていた

```ruby
<%= render :partial => "#{dynamic_partial}" rescue render :partial => 'partial_that_actually_exists' %>
```

参考
http://api.rubyonrails.org/classes/ActionView/LookupContext/ViewPaths.html#method-i-find_template
http://stackoverflow.com/questions/3559419/is-there-any-rails-function-to-check-if-a-partial-exists
tcpdump + wireshark で https な通信を解読する

webアプリケーション開発者たるもの、時には https と戦わねばならぬこともあるのです。

打つ手がなくて泣きそうになっていたら同僚から救いの手が！ (ただしサーバ側/クライアント側のいずれかで鍵交換アルゴリズムを変更できる場合に限る)

まず、tcpdump でダンプしたものを wireshark で見るには `-w FILE` オプションをつけてダンプデータをファイルに書き出させます。環境によってはデフォルトで先頭数十バイトしかダンプしない (man によれば、CentOS 5.x  で 68 bytes, 同じく Ubuntu 10.04 で 65535 bytes)ようなので、`-s 65535` とか `-s 0` などとダンプさせるサイズを指定してやるのが吉

今回は https なのでお手軽にポートで絞ることにして...こんな感じで叩けば良いかと。

```shellscript
tcpdump -s 65535 -w /tmp/dump.pcap -i eth0 dst port 443 or src port 443 
```

出力されたファイルは普通に wireshark で開けます。もちろんこのままだとメッセージボディは暗号化されていて読めません。

次に wireshark で暗号化解きの設定をします。wireshark のメニューから "Preferences" > "Protocols" > "SSL" と開き、 "RSA keys list:" となっているところの "Edit" ボタンをクリック。

開いたウインドウで  "New" ボタンをクリックし、以下のようにサーバの秘密鍵を登録します。

* IP Address: (サーバのアドレス)
* Port: 443
* Key File: (サーバの秘密鍵、pem形式)
* Password: (秘密鍵にパスフレーズを設定している場合、パスフレーズ)

この辺りの操作は [WiresharkでSSL/TLSトラフィックを解読する方法@Citrix Knowledge Center](http://support.citrix.com/article/CTX116872) そのままですので、詳しくはそちらをご覧いただくのが良いかと。

これで成功していれば生データが表示されるペインに "Decrypted SSL Records" というタブが追加され、そこでほどいた中身が見えます...が、たいていうまくいきません。メッセージの暗号化に使う共有鍵がさくっと解けないような方式で交換されているせいとかなんとか。(DHアルゴリズム。この辺いろいろありますが、説明できるほど調べてないので適当にごまかす)

鍵交換/暗号化アルゴリズムはSSLのセッション確立時にサーバ-クライアント間で強度の高いものが選ばれるようになっていますので、サーバ側、クライアント側のいずれかでDHを使わないように絞ってあげないとだめな模様。

クライアントが  openssl コマンドであれば、鍵交換/暗号化アルゴリズムを選択できますので ``openssl ciphers -v`` して出てくる中から ``Kx=RSA`` となっているものを選んで、``-cipher HOGE`` とオプションをつけて叩いてください。あまりしょぼいアルゴリズムだとサーバ側から蹴飛ばされることがあるので、AES256-SHA あたりが無難かと思います。

たとえば、こんな感じで。

```shellscript
cat /tmp/request.txt | openssl s_client -cipher AES256-SHA -connect localhost:443
```

クライアントがブラウザの場合など、設定を自由にいじれない場合には[こちらの方法](http://qiita.com/items/1283c6c83cc72a218bb9)で生のリクエストのダンプを取得して、``openssl`` コマンドで投げつける (動作がクライアントの動作に依存する場合には使えません) か、サーバ側で設定してあげる必要があります。webサーバに Apache httpd を使用している場合、例えば以下のように設定することで RSA方式での鍵交換を強制できる...と思います (未検証)

```httpd.conf
SSLCipherSuite kRSA
```

この状態でダンプしたデータであれば、wireshark でメッセージボディがほどけているはずなので、後は http として解読できます。

俺のデバッグはまだ始まったばかりだ！
楽に配布可能なインストーラーをRubyで作る方法

最近流行りのネットからcurlでコードを落としてきてシェルに投げてインストールさせる
コードってどうやるのかなーってのを考えてました。

```sh:RVMの場合
$ \curl -L https://get.rvm.io | bash -s stable --ruby
```

でもそもそもシェルスクリプト書くの面倒だしRubyで書けないかな〜と模索していた所、__END__以下にファイルを埋め込んで保存するという方法を思いつきました。

以下サンプルです。

```ruby:installer.rb
# !/usr/bin/env ruby
require 'fileutils' 

data = DATA.read
file_list = data.split(/^(@@.*?)$\n/m)
description = file_list.shift
puts description

iterator = (0...file_list.size/2).map{|x| x * 2 } 
for i in iterator
  path = file_list[i].sub('@@','')
  puts path
  FileUtils.mkdir_p(File.dirname(path))
  File.open(path, 'w') do |f|
    f.puts file_list[i+1]
  end
end

__END__
description 
hogehoge
@@a.rb

p 'hello'

@@lib/hoge/b.rb

p 'good bye'

```

Sinatra等でよくテンプレートを埋め込んで使う方法と同じです。DATAで読み込める領域は基本的には複数ファイルに対応しておりませんが、以下の正規表現で、@@の行で中身を分割して、ファイルをどんどん保存していくという方法です。（splitに()を含めると()内でマッチした部分も返り値に含まれます。）、

```ruby
file_list = data.split(/^(@@.*?)$\n/m)
```

ただ、この正規表現だと、一番最初の@@の部分の前に改行が含まれてしまうっぽいので、__END__直後の部分に何らかの説明を入れておくと良いかもしれません。

このコードをサーバに置いて、仮にhttp://example.com/installerで配布する場合は、

```sh
$ curl http://example.com/installer | ruby
```

という風に実行させると、@@以下に書いたパスへファイルをどんどん保存させていくことができます。
Linux系OSのバージョン情報 (ディストリビューションのリリース情報) を表示させるコマンド

# リリース情報を表示する

```
$ cat /etc/`ls /etc -F | grep "release$\|version$"`
```
いつも忘れるので。
/etc/の下にある OSのディストリビューションのリリース情報 (release～, version～)の内容を表示してくれる。

それぞれのOSのファイルの場所は以下

* Redhat/CentOS
``` /etc/redhat-release ```
* Fedora
``` /etc/fedora-release ```
* Debian
``` /etc/debian_version ```
* Turbolinux
``` /etc/turbolinux-release ```
* SuSE Linux
``` /etc/SuSE-release ```

# もうひとつのコマンド

```
$ cat /etc/issue
```

でも見ることができる。
WindowsのIMEでインライン変換を正しく表示できるようにしてみた

WindowsのSublime Text 2はインライン変換が正しく表示できません。これを直すプラグインを作りました。
以下のように、カーソル位置にインライン変換が表示されるようになります。

![](https://raw.github.com/chikatoike/IMESupport/master/img/inline2.png)

## 方法
IMESupportをインストールします。現在、Package Controlには登録していないので、コマンドプロンプト等で C:\Users\(ユーザー名)\AppData\Roaming\Sublime Text 2\Packages に移動して、 git clone してください。
リポジトリは以下のURLです。
https://github.com/chikatoike/IMESupport
smart-mode-line.elの設定いじったらphpファイル編集する時の動作がおかしくなった

[追記]
やっぱり設定云々の前に、smart-mode-line使った時点で動作がおかしかったので、そもそも使うのやめた
[追記終わり]

smart-mode-line.elのfile名を表示する長さとmodeを表示する長さを↓のようにいじった。

```
(custom-set-variables
略
 '(sml/mode-width 30)
 '(sml/name-width 70))
```

そしたらphpファイル編集する時の動作がおかしくなって、とても使い物にならなくなったので戻した。
phpファイル編集する時のどれかのmodeとバッティングしてるんだと思う。それ調べる気力はないので、この部分をコメントアウトして放置。
この設定が原因だと突き止めるだけで大分時間食った。。。
Mac OS X Lionでプロセッサやメモリの情報を取得するコマンド


Linuxだと/proc/cpuinfoを開くことで、周波数やコア数、キャッシュ容量などの各種プロセッサ情報が取得できることはご存知でしょうか。

    cat /proc/cpuinfo

一方で、MacはもちろんLinuxベースではないので、/proc/cpuinfoが存在せず、この方法では取得することができません。
代わりに下記コマンドを使うと取得できました。

	system_profiler SPHardwareDataType

CPU情報以外にも様々な情報が取得でき、下記のコマンドでその種類（DataType）を確認できます。

	system_profiler -listDataTypes


なお、DataTypeは複数指定することもできます。
DataTypeを指定せずに実行すると、まとめて全部表示することができますが、そこそこ重たいみたいなので注意が必要です。
Ubuntu 12.04でBluetoothのホスト名を変える

Ubuntu 12.04ではBluetoothの自局ホスト名を変える設定が存在しない。
Bluetoothの設定画面に行くと、「ubuntu-0」という表示があるが固定されている。これだと非常にかっこ悪い。

この設定自体はGnomeが管理しているものではなく、bluetoothスタックが管理しているようである。Ubuntu 12.04では下記の場所にあるファイル内部に設定が存在する。
/var/lib/bluethooth/（BluetoothデバイスのMACアドレス）/config

	name ubuntu-0
	pairable yes
	class 0x6e0100

上記のようなファイルになっているので、name欄を好きな名前に書き換えた上で、再起動するか、bluetoothデーモンを再起動すればOK。

    sudo service bluetooth restart
Xcodeでビルドした時の”duplicate symbols”エラーを回避する

FacebookSDKやAWSiOSSDKなど、いろんなライブラリをブチ込みまくると

```
ld: - duplicate symbols for architecture ---
```

というエラーがよく出る。
重複して使われているライブラリ(SBJsonとか)が出るとこのようなエラーがでてしまう。

くっそ！

そしてググりまくって回避方法を見つけました(｀･ω･´)

今回はFacebookとAWSの.frameworkの衝突を回避する例を紹介します。

まず普通にビルドすると、

```
duplicate symbol _OBJC_CLASS_$_SBJsonParser in:
    .../Build/Products/Debug-iphoneos/libFacebook SDK.a(SBJsonParser.o)
.
.
.
.
.
XcodeWorkspace/aws-ios-sdk-1.4.3/AWSiOSSDK.framework/AWSiOSSDK(SBJsonWriter.o)
ld: 6 duplicate symbols for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)
```

お、おぅ、となります。
○ SBJsonParser.o
○ SBJsonWriter.o
これらがFacebookSDKとAWSのSDKで使われてるから怒られる。たぶん。

なので、AWSiOSSDKの方からこれらを消してあげます。

まず下記コマンドで、どのアーキテクチャ用になってるかチェック。

```
$lipo -info AWSiOSSDK
Architectures in the fat file: AWSiOSSDK are: armv7 (cputype (12) cpusubtype (11)) i386 
```

armv7とi386のアーキテクチャ用にビルドされてるそうです。

下記コマンドで分解。

```
$lipo -thin armv7 AWSiOSSDK -output AWSiOSSDK_armv7
$lipo -thin i386 AWSiOSSDK -output AWSiOSSDK_i386
```

.oファイル検索

```
$ar -t AWSiOSSDK_armv7|grep SBJson                                                                                               
SBJsonParser.o
SBJsonStreamParser.o
SBJsonStreamParserAccumulator.o
SBJsonStreamParserAdapter.o
SBJsonStreamParserState.o
SBJsonStreamWriter.o
SBJsonStreamWriterAccumulator.o
SBJsonStreamWriterState.o
SBJsonTokeniser.o
SBJsonUTF8Stream.o
SBJsonWriter.o
```

あったあった。

目的のファイル削除。

```
ar -dv AWSiOSSDK_armv7 SBJsonParser.o SBJsonWriter.o
ar -dv AWSiOSSDK_i386 SBJsonParser.o SBJsonWriter.o 
```

合体！

```
lipo -create AWSiOSSDK_armv7 AWSiOSSDK_i386  -output AWSiOSSDK
```

これでビルドすると。。。。
Building...... (´・ω・｀)

Succeed！いぇーす！おめでとう！


*追記
armv7sのライブラリ抽出は下記で可能です。

```
xcrun -sdk iphoneos lipo -thin armv7s AWSiOSSDK -output AWSiOSSDK_armv7s
```

(cputype (12) cpusubtype (11))がarmv7sの表示みたいです。
gem install rmagick でエラー

rmagickインストール時にエラー

```:gemでインストール
$ gem install rmagick
```

>
>Building native extensions.  This could take a while...
>ERROR:  Error installing rmagick:
>	ERROR: Failed to build gem native extension.
>
>        /usr/local/Cellar/ruby/1.9.3-p286/bin/ruby extconf.rb
>checking for Ruby version >= 1.8.5... yes
>extconf.rb:128: Use RbConfig instead of obsolete and deprecated Config.
>checking for /usr/bin/clang... yes
>checking for Magick-config... no
>Can't install RMagick 2.13.1. Can't find Magick-config in >/usr/local/bin:/usr/local/Cellar/ruby/1.9.3->p286/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin
>
>*** extconf.rb failed ***
>Could not create Makefile due to some reason, probably lack of
>necessary libraries and/or headers.  Check the mkmf.log file for more
>details.  You may need configuration options.
>
>Provided configuration options:
>	--with-opt-dir
>	--without-opt-dir
>	--with-opt-include
>	--without-opt-include=${opt-dir}/include
>	--with-opt-lib
>	--without-opt-lib=${opt-dir}/lib
>	--with-make-prog
>	--without-make-prog
>	--srcdir=.
>	--curdir
>	--ruby=/usr/local/Cellar/ruby/1.9.3-p286/bin/ruby
>
>
>Gem files will remain installed in /usr/local/Cellar/ruby/1.9.3->p286/lib/ruby/gems/1.9.1/gems/rmagick-2.13.1 for inspection.
>Results logged to /usr/local/Cellar/ruby/1.9.3->p286/lib/ruby/gems/1.9.1/gems/rmagick-2.13.1/ext/RMagick/gem_make.out

Magick-configがないということなので、ImageMagickをhomebrewでインストール

```:homebrewでimagemagickインストール
$ brew install imagemagick
```

```:gemでrmagickを再度インストール
$ gem install rmagick
```

>Building native extensions.  This could take a while...
>Successfully installed rmagick-2.13.1
>1 gem installed


すばらしい。
bit.ly APIで短縮したURLにアクセスされてしまう

パスワード再発行する時に、ある程度個人情報入れさせて個人を特定させた後、ハッシュ化したキーをURLにつけてメールすることがあるけど、そのURLをbit.lyを利用して短縮してみたら、即座に短縮前の長いURLにアクセスしてくる輩が。
IP引いたら、amazonaws.com 。bit.ly じゃないけど怪しい。
URLをクリックしたら即座にパスワード再発行とか絶対にしてはならない。
ユーザが何もしていないのにパスワード再発行されてしまう。