OmniAICreator/Qiita-1.07M huggingface dataset:
lstlisting の新しい環境を定義する \lstnewenvironment

[@k_hanazuki](https://twitter.com/#!/k_hanazuki "花月霞Λ__Λ (k_hanazuki) on Twitter") さんが横でやってたのを見てメモメモ。

TeX でソースコードを綺麗に表示するのに便利な listings パッケージ（これについては詳しくは [listings.sty: TeX パッケージ](http://www.biwako.shiga-u.ac.jp/sensei/kumazawa/tex/listings.html "listings.sty: TeX パッケージ") などを参照してください）。`\begin{lstlisting}...` する代わりに、言語毎に `\begin{C++}...` のような環境を用意したい場合、どうすればいいでしょう？

実は、`\newenvironment` を使って次のようにしようとすると、上手くいきません:

```tex:bad-newenvironment-lstlisting.tex
\documentclass{article}
\usepackage{listings}
\lstset{language=C++}
\newenvironment{C++}{\begin{lstlisting}}{\end{lstlisting}}
\begin{document}

\begin{C++}
#include <iostream>

int main () {
  std::cout << "Hello, World!" << std::endl;
  return 0;
}
\end{C++}

\end{document}
```

エラーすら出ないのでよく分かりません:

```
% platex bad-newenvironment-lstlisting.tex
This is pTeXk, Version 3.141592-p3.1.11 (euc) (Web2C 7.5.4)
 %&-line parsing enabled.
(./bad-newenvironment-lstlisting.tex
pLaTeX2e <2006/11/10>+0 (based on LaTeX2e <2009/09/24> patch level 0)
(/usr/share/texmf-texlive/tex/latex/base/article.cls
Document Class: article 2007/10/19 v1.4h Standard LaTeX document class
(/usr/share/texmf-texlive/tex/latex/base/size10.clo))
(/usr/share/texmf-texlive/tex/latex/listings/listings.sty
(/usr/share/texmf-texlive/tex/latex/graphics/keyval.sty)
(/usr/share/texmf-texlive/tex/latex/listings/lstmisc.sty)
(/usr/share/texmf-texlive/tex/latex/listings/listings.cfg))
(/usr/share/texmf-texlive/tex/latex/listings/lstlang1.sty)
(/usr/share/texmf-texlive/tex/latex/listings/lstlang1.sty)
(/usr/share/texmf-texlive/tex/latex/listings/lstmisc.sty)
No file bad-newenvironment-lstlisting.aux.
(/usr/share/texmf-texlive/tex/latex/base/omlcmr.fd)
(/usr/share/texmf-texlive/tex/latex/base/omscmr.fd))
*
```

そこで、こういう場合には `\lstnewenvironment` を使います。詳しくは [The Listings Package](http://get-software.net/macros/latex/contrib/listings/listings.pdf "The Listings Package (listings.pdf)") (Manual PDF) を参照してください。

```tex:lstnewenvironment.tex
\documentclass{article}
\usepackage{listings}
\lstnewenvironment{C++}
  {\lstset{language=C++}}
  {}
\begin{document}


\begin{C++}
#include <iostream>

int main () {
  std::cout << "Hello, World!" << std::endl;
  return 0;
}
\end{C++}

\end{document}
```

これで問題なくタイプセットできました。めでたしめでたし。

ソースファイルとか: [lstlisting の新しい環境を定義する \lstnewenvironment ref: http://qiita.com/items/a971b925fc6526d324c1 — Gist](https://gist.github.com/2978600 "lstlisting の新しい環境を定義する \lstnewenvironment ref: http://qiita.com/items/a971b925fc6526d324c1 — Gist")

----
### 参考文献
- "listings.sty: TeX パッケージ", http://www.biwako.shiga-u.ac.jp/sensei/kumazawa/tex/listings.html , 2012-06-23 23:54
- "The Listings Package", http://get-software.net/macros/latex/contrib/listings/listings.pdf , 2012-06-23 20:38
シンボリックリンクだけ一覧表示

最近よく他の人の設定ファイルを試しに使ったりしています。そうすると、`$HOME` に直で 設定ファイルをおいておくよりも（`git clone` などで）どこか適当な場所に落とした上でシンボリックリンクを張るほうが便利です。

で、まぁここまではたぶん他の人もよくやってることだと思います。なんですが、私はここでしょっちゅうシンボリックリンクを張り間違えます。例えば、物覚えが悪いもので、つい引数を逆に書いたりしてしまいます:

```
% ln -sf $HOME/.vimrc $HOME/dotfiles/someones-dotfiles/.vimrc
```

…あちゃー。せっかく落としてきた他の人のファイルを上書きしてしまいました（-f なんて付けるから… というツッコミはなしで）。

ということで、最近はこまめに `ls -la` で確かめるようにしているんですがいい加減目ぐれっぷするのもちょっと頭が悪い感じがしてきました。ちゃんと `grep` してみましょう。

```
% ls -la | grep "->"
grep: invalid option -- '>'
Usage: grep [OPTION]... PATTERN [FILE]...
Try `grep --help' for more information.
```

……あちゃちゃー＞＜

これ、何が悪いか最初全く分からなかったんですが、エラー文の通り "-\>" がオプション扱いされてしまっているんですよね（かなり長いこと「ちゃんとダブルクォーテーションで括ってるのにぃ！」と唸っていました）。ハイフンで始まるパターンをちゃんと認識させるには、ハイフンを 2 つ繋げて後に続くものがオプションじゃないですよーと教えてあげます。[grepでハイフンから始まる文字をを検索する方法 — ディノオープンラボラトリ](http://openlab.dino.co.jp/2007/10/05/17461999.html "grepでハイフンから始まる文字をを検索する方法 — ディノオープンラボラトリ") を参考にしました。

```
% ls -la | grep -- "->"
lrwxrwxrwx 1 uda  uda     34 2012-06-20 16:45 .gitconfig -> /home/uda/dotfiles/uda-dotfiles/.gitconfig
lrwxrwxrwx 1 uda  uda     33 2012-06-13 00:22 NumericalComputation -> program/test/NumericalComputation
lrwxrwxrwx 1 uda  uda     33 2012-06-20 13:37 .screenrc -> /home/uda/dotfiles/uda-dotfiles/.screenrc
lrwxrwxrwx 1 uda  uda     30 2012-06-20 13:37 .vimrc -> /home/uda/dotfiles/someones-dotfiles/.vimrc
lrwxrwxrwx 1 uda  uda     30 2012-06-20 13:37 .zshrc -> /home/uda/dotfiles/others-dotfiles/.zshrc
```

若干不満なのが、`grep --color=auto` を使っても -\> しかカラーリングされないこと。できれば `ls --color=auto` と同じ色で表示させたいけど、ちょっとよく分からなかった。修行不足だなー

もっとスマートなやり方あるよ！とかある人は是非教えてください。

----
### 参考文献
- "grepでハイフンから始まる文字をを検索する方法 — ディノオープンラボラトリ", http://openlab.dino.co.jp/2007/10/05/17461999.html , 2012-06-23 21:28
textsearch_jaがdicrcを開けない


OS X上のPostgreSQLデータベースに対してtextsearch_ja(9.0.0)をビルドしてインストールした。その後、全文検索を使えるようにするために、textsearch_ja.sqlを実行すると以下のエラーが出た。

```
PGError: ERROR:  mecab: tagger.cpp(150) [load_dictionary_resource(param)] param.cpp(71) [ifs] no such file or directory: ./dicrc
```

なお、ビルドの前提として、mecabとmecab-ipadicはHomeBrewでインストールしてある。

ライブラリ(textsearch_ja.so)のインストール自体は成功していると思われるが、辞書の設定ファイルを見つけられないらしい。

調べたところ、ビルド時に既にインストールされていた、別のmecabをリンクしていたようだ（同様の症状の人は見あたらなかったので、もしかするとportの残骸なのかもしれない）。

/usr/lib/libmecab.dylib

ということで、textsearch_jaのMakefileに以下を追加して、使用するmecabライブラリの位置を指定できるようにした。

```
# specify mecab lib dir
ifdef MECAB_LIB
LDFLAGS += -L$(MECAB_LIB)
endif
```

再度ビルドしてインストールする。

```
$ USE_PGXS=1 make clean
$ MECAB_LIB=/usr/local/Cellar/mecab/0.994/lib USE_PGXS=1 make
$ USE_PGXS=1 make install
```

これで、HomeBrewのmecabを使ってビルドされ、無事にtextsearch_ja.sqlを実行できるようになった。

以下バージョン情報(全てHomeBrewでインストール)
postgresql: 9.0.4
mecab: 0.994
mecab-ipadic: 2.7.0-20070801
Haskellでループのbreak

継続モナド使おう。

<http://hackage.haskell.org/packages/archive/mtl/2.1.2/doc/html/Control-Monad-Cont.html>

~~~ {haskell}
import Control.Monad
import Control.Monad.Cont

main :: IO ()
main = do
  (`runContT` const (return ())) $ do
    callCC $ \k -> do
      forM_ [1..10] $ \i -> do
        when (i > 5) $ k ()
        liftIO $ print i
~~~
git bisect で問題箇所を特定する

以前は問題なく動いていたはずの機能が、最新版では動かなくなっている・・・。こんなときは、「どのコミットが問題を混入させてしまったのだろうか？」を知りたくなるでしょう。

これを手助けするのが [git bisect](http://git-scm.com/docs/git-bisect) コマンドです。git bisect コマンドは、二分探索によって問題箇所を特定します。

事前準備
========

最初に大事なことがひとつあります。それは、__「問題がない（good）状態と問題がある（bad）状態を、確実に判定できるようにする」__ ことです。

当然のことではありますが、ここがあやふやだと、二分探索をしても問題箇所をうまく特定できません。

可能なら、「テストスクリプトを1つ実行するだけで判定」できるようにしたほうが良いです。このとき、テストスクリプトは、git リポジトリからチェックアウトした作業ツリーに対して実行できるようにします（例えばソースからのビルド処理もテストスクリプトに含めます）。また、テストスクリプトは、good なら 0 を、bad なら 1～127（ただし 125 は除く）を返すようにします。

テストスクリプトが用意できない場合は、手動でテストを行うこともできます。

git bisect の実行方法
=====================

good と bad の指定
------------------

まず、問題がない（good）時点と問題がある（bad）時点を指定します。

	$ git bisect start <bad-commit> <good-commit>

たとえば、V1.0 タグの時点では good で、最新（HEAD）では bad である、とすると次のように指定します。

	$ git bisect start HEAD V1.0

これを実行すると、bad と good の間にある適当な中間バージョンがチェックアウトされます。

テストスクリプトの指定
----------------------

次に、テストスクリプトを指定します（テストスクリプトが用意できない場合は、次の「手動でテストする」に進んでください）。

	$ git bisect run <テストスクリプトのファイル名>

これを実行すると、git が自動的に「テスト実行」と「中間バージョンのチェックアウト」を繰り返して、問題が混入した時点を見つけてくれます。処理が終わるまで特にすることはありませんので、コーヒーでも飲んで心を落ち着けながら待ちましょう。

無事終了すれば、問題が混入した時点のバージョンがチェックアウトされています。コミット内容を調べて問題を解決しましょう。

手動でテストする
----------------

テストスクリプトが用意できない場合、手動でテストを行います。

テストの結果、問題がない（good）なら以下を実行します。

	$ git bisect good

テストの結果、問題がある（bad）なら以下を実行します。

	$ git bisect bad

上記のどちらかを実行すると、git が自動的に bad と good の間にある中間バージョンをチェックアウトしてくれます。これに対して、ふたたび手動でテストを行います。

手動の「テスト実行」と git による「中間バージョンのチェックアウト」を繰り返すと、問題が混入した時点が特定できます。コミット内容を調べて問題を解決しましょう。

その他のコマンド
================

現在チェックアウトしているコミットを確認する
--------------------------------------------

git bisect がチェックアウトしているコミットを見るには、次のコマンドが便利です。

	$ git bisect view

デフォルトだと gitk で表示します。オプション -p をつけると、パッチ形式でコンソールに出力します。

二分探索の過程を確認する
------------------------

git bisect のログを表示します。

	$ git bisect log

もとの状態に戻す
----------------

git bisect を実行する前の状態に戻すには、以下を実行します。

	$ git bisect reset

まとめ
======

git bisect を使う機会はそんなに多くはないと思いますが、こういうものがあるということを覚えておくと、いざというときに助かります。実際に使ってみると、きっと感動しますよ。
文字列に対して each_with_index を使用する

`enum_for` を使えば、each_byte の各文字と一緒にインデックスも利用できる。

```ruby
str = "hogehuga"
ary = []
str.enum_for(:each_byte).each_with_index do |c, i|
  ary << [c, i]
end
ary # => [[104, 0], [111, 1], [103, 2], [101, 3], [104, 4], [117, 5], [103, 6], [97, 7]]
```
mklink コマンドで、ハードリンク / シンボリックリンク / ジャンクション を作成する

Windows のショートカット(.lnk) を利用していると、色々と不満があります。

* テキストエディタにドロップしたら、リンク先ファイルを開いて欲しいのに、.lnk ファイルそのものが開かれた、等

Windows Vista や Windows 7 では、mklink コマンドで、ハードリンク / シンボリックリンク / ジャンクション を作成することができます。

# 活用例

VIM関連のファイルを `D:\Dropbox\dotfiles\.vim` ディレクトリに置いてDropboxで管理したいけど、VIMからは `%HOME%\.vim` でアクセスできるようにしたい場合。

その場合は、以下のようにディレクトリのシンボリックリンクを作成します。

```bat:sample_mklink_vim_directory.bat
mklink /D %HOME%\.vim D:\Dropbox\dotfiles\.vim
```

mklink コマンドの使い方は、`mklink /?` でヘルプを参照してください。

# 参考

ハードリンク / シンボリックリンク / ジャンクション の違いについては、以下のサイトを参照。

* [Windowsのシンボリックリンクとジャンクションとハードリンクの違い](http://www.atmarkit.co.jp/ait/articles/1306/07/news111.html)

# 注意

例としてVIMを挙げましたが、__VIMで.vimrc や.gvimrc (ハードリンク)を編集すると、
ハードリンクが解除されてしまうようです。__

せっかくのハードリンクの旨みが・・・と嘆きつつも、そういうものだと割りきって、編集する時は dotfiles\.vimrc を最初から開いております。
UIDatePicker の「年」を限界までスクロールし続けてみた

西暦99999年が最大値（画像は消滅）
![A.D.99999](http://s1-01.twitpicproxy.com/photos/full/603692111.png)

ちなみに和暦の場合、平成1000年くらいからトランケート表示になってしまう。
Javaの単体試験におけるモックの活用メモ EasyMock、PowerMock


初qiitaです

##概要 Mockをつかってテストを簡単にしよう
Javaのテストを書く際、依存しているものがあるとシンプルにテストを書けない。そうしたときにMockを利用することで試験できるようになる。

外部APIとかStrutsのDynaActionFormとか、単純にインスタンス化できないものをMock化してテストできると便利！

###サンプル

```CreateScreenTest.java
import junit.framework.TestCase;
import org.easymock.EasyMock;
import java.io.IOException;

public class CreateScreenTest extends TestCase {
	public void testInit() throws IOException {
		Item item = new Item("test");		

		HttpServletRequest mock = EasyMock.createMock(HttpServletRequest.class);
		//単純にインスタンス化できないもののmockをつくる。
       
EasyMock.expect(mock.getAttribute("Item")).andReturn(item);
		//そのmockクラスのメソッドを使用している箇所でなにをReturnしたいか書く

		EasyMock.replay(mock);

		JB jb = new JB();
		jb.init(mock);

		//assertなテストを書いていく
	}
}
```

クラス名などは架空のものです為念

###EasyMock参考ページ
EasyMockについてはけっこう日本語のページも多いので簡単
-EasyMockをつかってみた
-http://den2sn.hatenablog.com/entry/20090324/1237854455
-EasyMock を使用してテストを容易にする （IBM developerWorks）
-http://www.ibm.com/developerworks/jp/java/library/j-easymock.html


##staticやfinalなメソッドをテストする
EasyMockは簡単で便利。でも、staticやfinalなクラスやメソッドはうまく使えない。（調査不足もあるかも）
そんなときはPowerMockを使う。

###PoweMock参考ページ
-Mockito + PowerMockを使ってみる
-http://d.hatena.ne.jp/torutk/20101003/p3

次のページのサンプルコードはなぜか動かなかった
-http://blog.tarotaro.org/archives/772

###PoweMockでつまっているところ
staticだけであったり、finalだけなら動くのだけれど、
static finalなものは動かない。 
「cannot subclass final class」エラーがでるのだけど、JUnitのテストケースにすると動く、不思議。
英語のページではいろいろ書いてあるけれど、ちょっと調査中。


##その他、気になったこと
###理想
すべてのソースにテストが書かれていて、ソースを修正するたびにテストできる。

###現実
（禁則事項です）

###リスク
-当然だけれどMockを使うと結合部分は試験できないのでどこまで試験できているか確認しましょう。
-どうすれば効率的ないい試験を書けるかは検討中（あまり体系立って調べてはいない）

###テスト駆動開発の2側面
-初期開発の段階では、どういった機能が必要か明確になる。
-保守・追加開発の段階では、ソースの修正でどこも壊れていないか確認できる

#その他
-qiitaの使い方、こんなんであってるのだろか。
-会社で触ってるコードで詰まったのを、どうqiitaなりブログなりに書くと幸せだろか。
-テストちゃんと勉強しないといけない
SphinxへのMathJaxの実装


conf.pyへの記入

```Python
# mathjax
extensions.append( 'mathjax' )
# explicitly referrence to mathjax( URL or PATH ( absolute ) )
mathjax_path = 'http://mathjax.connectmv.com/MathJax.js'
mathjax_path +='?config=default' # for mathjax v1.1
```

MathJax v1.1では、デフォルト設定を追記する必要があるらしい。


ローカルにMathJaxをインストールして、処理させることもできる。

```Python
import os.path
mathjax_path = os.path.extenduser('~/lib/java/MathJax/MathJax.js')
```
db/seeds.rb

```seeds.rb
[Hoge, Fugo].each do |c|
  yml = File.read("#{Rails.root}/db/seeds/#{c.to_s.tableize}.yml")
  list = YAML.load(yml).symbolize_keys
  list[c.to_s.tableize.to_sym].each do |r|
    c.create do |t|
      r.each do |i, v|
        t.send "#{i}=", v
      end
    end
  end
end

if Rails.env.development?
  connection = ActiveRecord::Base.connection()
  [Piyo].each do |c|
    if c.count == 0
      open("#{Rails.root}/db/sql/#{c.to_s.tableize}_sample.sql") {|file|
        while sql = file.gets
          connection.execute sql
        end
      }
    end
  end
end
```
以下の状態にしたい時のマクロ

変更前

```
10
11
12
13
```

変更後

```
'10',
'11',
'12',
'13'
```

方法

```
マクロの記録qを押して、アルファベット小文字を入力して、再度qで保存
:g/^$/d(空行の削除)
先頭に移動して改行を入れる
:%s/\n/',[ctrl+v][Enter]'/
最後の余計な部分を消す
最初の余計な部分を消す
ggVGy
（すべて選択してコピー）
```
Greedy flatten function for Array in JavaScript

## via
[2次元配列を1次元配列にする。 #JavaScript - Qiita](http://qiita.com/items/83f589dca32a4986247c)

## flatten with ECMAScript 5
### c.f.
http://ptech.g.hatena.ne.jp/noromanba/20120622/1340396466 (written in Japanese)
http://ptech.g.hatena.ne.jp/noromanba/20120713/1342259951 (written in Japanese)

```javascript:flatten.js
var flatten = function (ary) {
    return ary.reduce(function (p, c) {
        return Array.isArray(c) ? p.concat(flatten(c)) : p.concat(c);
    }, []);
};
// console.log(flatten([[[2], 0], [1, 3], [4, 6, [5, 7]]]));
// [2, 0, 1, 3, 4, 6, 5, 7]
```
> https://gist.github.com/2975364

If you wan to use `arguments.callee`, as you like

## see also
- [Array reduce method - MDN](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/reduce)
- [Arrayを拡張（flatten,max,min,sum,uniq,first,last） - 素人がプログラミングを勉強するブログ](http://d.hatena.ne.jp/javascripter/20080520/1211231059) (written in Japanese)
2つの配列の各要素を足して新しい配列を作成する

Ruby で
[1, 6, 4, 3, 6] + [5, 4, 3, 2, 1] = [6, 10, 7, 5, 7]
をやる一つの方法。

```ruby
ary1 = [1, 6, 4, 3, 6]
ary2 = [5, 4, 3, 2, 1]

ary1.zip(ary2).map {|a, b| a + b} # => [6, 10, 7, 5, 7]
```

「n個の配列の各要素をそれぞれ〇〇した配列を作成」には、ほとんどの場合 `.zip.map` が使える。
C#とScalaで関数型言語プログラミング

C#でラムダ式が使えるということで・・・

次のScalaとC#のコードは同じ意味です。

```csharp:confrim.cs
   class Program
    {
        static void Main(string[] args)
        {
            loopCall(10, nTimes(5));
        }

        static void loopCall(int max, Func<int, int> func)
        {
            for (int i = 1; i < max+1; i++)
            {
                Console.Write(func(i) + " ");
            }
        }

        static Func<int, int> nTimes(int times)
        {
            return n => n * times;
        }
    }
```

```scala:confrim.scala
object Plactice{
	def main(args: Array[String]){
		loopCall(10, nTimes(5))
	}

	def loopCall(n:Int, func:(Int) => Int) ={
		for(i <- 1 to n)
			print(func(i) + " ")

				println
	}

	def nTimes(times : Int) : (Int) => Int = {
		(value : Int) => value * times;
	}
}
```
出力結果
`5 10 15 20 25 30 35 40 45 50 `

関数型言語Scalaと比べて、関数型言語の様な記述を取り入れたに過ぎないC#はちょっと書き方が面倒ですね。`Func`型を新たに利用しているのが面倒です。ラムダ式なんだから、`main`内で定義しても良かったのですが、そこはScalaのコードと退避させるという意味合いで...

ラムダ式なんてややこし言い方をするから、ややこしくなるのであって要は「処理を動的に変更可能な関数」を受け渡せること、と自分の中で理解。

しかし、C#はわりとJavaと対等な存在として説明されている気がしますが、言語仕様の拡張や改良でガンガン変わるC#と、ほとんど変わらないJava。あげくに、言語の開発者に見捨てられてJVMで動く別の言語ということになったりと・・・。この差はどこでついたんでしょうかね。
AndroidのMediaStoreのselectionで数字の比較がうまくいかない

例えば端末内で、あるアーティストの曲が3曲入っているアーティスト一覧を取得したい場合、

```java
final Cursor cursor = sContext.getContentResolver().query(
    MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI,
    new String[] {
        MediaStore.Audio.Artists.NUMBER_OF_TRACKS,
        MediaStore.Audio.Artists.ARTIST,
        MediaStore.Audio.Artists.ARTIST_KEY
    },
    MediaStore.Audio.Artists.NUMBER_OF_TRACKS + "=?",
    new String[] {
        "3"
    },
    null);
```

とかってすると思うのですが、なぜかこれではヒットせず、


```java
final Cursor cursor = sContext.getContentResolver().query(
    MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI,
    new String[] {
        MediaStore.Audio.Artists.NUMBER_OF_TRACKS,
        MediaStore.Audio.Artists.ARTIST,
        MediaStore.Audio.Artists.ARTIST_KEY
    },
    MediaStore.Audio.Artists.NUMBER_OF_TRACKS + "=3",
    null,
    null);
```

とすると、正しく取得ができた。
selectionArgsはString[] しか受け付けないため、
SQL文として実行する際に number_of_tracks='3' となってしまって、
文字列と数値を正しく扱えていないために起きるのではと推測。
Git で svn export 的なやつ

    $ git checkout-index -a -f --prefix=../hoge/

prefix は末尾に / をちゃんと入れないと悲惨なことになる．

(Qiitaに投稿するとモテると聞いたので、 [過去のブログ](http://d.hatena.ne.jp/strkpy/20090714/1247534844) から引用。)
第一回 オフラインリアルタイムどう書くの参考問題

オフラインでリアルタイムに「どう書く」をやろうと
http://atnd.org/events/30285
atnd を立てた。
で、問題の例を出しておく。難易度と分量はこれを目安に。
## ポーカー

5枚のカードを示す文字列を入力とし、ポーカーの役を出力せよ。
ただし:

* 一枚のカードは、スートを表す文字＋ランクを表す文字列 で構成される。
* スートを表す文字は、S, H, D, C のいずれか
* ランクを表す文字列は、2, 3, ..., 9, 10, J, Q, K, A のいずれか
* 下表の役に対応すること。下表の役に該当しない場合は '--' を出力すること。
* カードはジョーカーを含まない52枚から5枚が選ばれる。
* 不正な入力への対応は不要。

対応すべき役と、その役だった場合に出力する文字列は以下のとおり：

* フォーカード : 4K
* フルハウス : FH
* スリーカード : 3K
* ツーペア : 2P
* ワンペア : 1P
* 上記のいずれにも該当しない : --

例えば、入力が「D3C3C10D10S3」ならフルハウスなので「FH」と出力する。
入力が「S8D10HJS10CJ」ならツーペアなので「2P」と出力する。

解答例は明日辺り。
CustomPostTypePermalinksでのカスタム分類の設定

「[CustomPostTypePermalinks](http://wordpress.org/extend/plugins/custom-post-type-permalinks/)」でカスタム分類（カスタムタクソノミー）をURLに設定する方法。

※プラグインのサポートページでも質問が上がっているのに返答がなかったので備忘録として。

>'%{カスタム分類名}%' は、そのカスタム分類のタームに置換されます。

これを「%taxonomy%」と入れるとそのままURLに入ってしまう。
自分が作ったカスタム分類名が「cat_animal」なら、

%cat_animal%

こう。なので、


/animal/%cat_animal%/%postname%/
とかにする。
.gitconfig で他のファイルを include

[.gitconfigで別ファイルを読み込む - 3100](http://d.hatena.ne.jp/z3100/20120505/1336203155 ".gitconfigで別ファイルを読み込む - 3100") を参考に .gitconfig で他のファイルを読み込むようにしてみました。

```.gitconfig
[include]
    path = .gitconfig.local
```

```.gitconfig.local
[user]
    name = Tomoki UDA
    email = my-email-hoge@fuga.com
```

これで .gitconfig の方は公開しても安心！ちなみに git のバージョンは 1.7.10 です。

----
### 参考文献
- ".gitconfigで別ファイルを読み込む - 3100", http://d.hatena.ne.jp/z3100/20120505/1336203155 , 2012-06-22 21:46
メモリを節約して1000000番目の素数を求める

ハッシュテーブルのエントリ数は最大でも素数の個数で済んでいる。
（それでも、圧縮配列を使ったエラトステネスのふるいの方が優れているっぽい）

```c#:Program.cs
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        var sw = new Stopwatch();
        sw.Start();
        var p1000000 = Primes().Skip(999999).First();
        sw.Stop();
        Console.WriteLine(p1000000);
        Console.WriteLine(sw.Elapsed);
    }

    static IEnumerable<long> Primes()
    {
        yield return 2L;
        var composites = new CompositeTable();
        foreach (var i in OddsFrom3())
        {
            if (!composites.ContainsKey(i))
            {
                yield return i;
                var firstComposite = i * i;
                composites.Append(firstComposite, i);
            }
            else
            {
                foreach (var p in composites[i])
                {
                    var nextComposite = i + 2L * p;
                    composites.Append(nextComposite, p);
                }
                composites.Remove(i);
            }
        }
    }

    static IEnumerable<long> OddsFrom3()
    {
        for (var i = 3L; ; i += 2L) yield return i;
    }

    static IEnumerable<long> EnumerateFrom(long start)
    {
        while (true) yield return start++;
    }
}

class CompositeTable : Dictionary<long, List<long>>
{
    public void Append(long composite, long prime)
    {
        if (this.ContainsKey(composite))
            this[composite].Add(prime);
        else
            this[composite] = new List<long> { prime };
    }
}
```
stringリソースファイル内で文字として%を使う

以下だと実行しようとするとエラーになる。

```xml:
<string name="complete">100% OK</string>
```

formatで使うからまあ当然だわな。
%%でエスケープかと思ったら違った。
`formatted="false"`を指定すればよろしいようです。

```xml:
<string name="complete" formatted="false">100% OK</string>
```

追記。
formatを使用しつつ、%も文字として表示したい場合は、```%%```で良いようです。


```xml:
<string name="complete">%1$d %% OK</string>
```
tmux内のvimでclipboardにunnamedが含まれるとヤンク・コピーができない

Macのtmux内で `clipboard+=unnamed` な Vim でヤンク・コピーをすると `E353: Nothing in register *` というエラーが出る。これはMacでtmuxを使うとpbcopy, pbpasteが使えない問題の余波によるものらしい。
これを修正するには[ChrisJohnsen/tmux-MacOSX-pasteboard](https://github.com/ChrisJohnsen/tmux-MacOSX-pasteboard)を使う。homebrewでインストール可能。

```
brew install reattach-to-user-namespace
```

自分でビルドするには `reattach-to-user-namespace` コマンドをビルドしてPATHを通してtmuxの設定を少し修正する。

```sh
git clone https://github.com/ChrisJohnsen/tmux-MacOSX-pasteboard.git
cd tmux-MacOSX-pasteboard
make reattach-to-user-namespace
cp reattach-to-user-namespace ~/bin/
```

```conf:.tmux.conf
set-option -g default-command "reattach-to-user-namespace -l zsh"
```
時間のプルダウン作成用配列生成

```php:makelist
foreach (range(30, 1439, 30) as $minute) { 
 $times[$minute] = date('H:i', mktime(0, $minute, 0, 1, 1, 1)); 
} 
$times[1440] = '24:00'; 
var_dump($times);
```

最後の1440は苦肉の策、dateでやると、00:00となってしまうため。
ディレクトリ内のファイル名を一括で変更する

diredで開いているディレクトリを編集してファイル面を一括で変更できるようにします。

操作を簡単にするために下記を設定ファイルに追加します。

```common-lisp:.emacs.d/init.el
;;; wdired.el
(define-key dired-mode-map "r" 'wdired-change-to-wdired-mode)
```

ディレクトリをdiredモードで開いた状態で`r`を押します。

この状態でバッファを編集し、変更したいファイル名にします。`M-!`で置換などもできます。

`C-c C-c`か`C-x C-s`を押すと編集した内容でファイル名が変更されます。`C-c C-k`で編集した内容を破棄します。

これをシェルでやろうとすると結構手間です。このやり方でやるとEmacsの置換機能を最大限活用できるのですごく便利です。

## 参考文献

「Emacsテクニックバイブル」P102
Titanium Studioによるアプリ名変更及び言語設定変更[iPad]

忘れないようにメモ

Titanium mobileでアプリを申請する時、アプリ名とかを別途変更したいときがあります。
その時のやり方が分からなくて1日ハマりましたが分かりました。

以下参照
http://keygx.blogspot.jp/2011/04/titanium-mobileiphone2.html

Titanium mobileでビルドして出てきた、
Project root/build/iphone/Info.plistをProject rootにコピー
後はProject rootの方に移したInfo.plistを任意に書き換えるだけ。
どうやらここから情報をちゃんと読み取ってくれるらしい。

ちなみに、
Bundle display nameがiPad上で表示されるアプリ名
Localization native development regionが言語設定(これを変更すると細かい所で表記が変わる)
です。

コマンドにするとこんなん
$ cd {Project root}
$ cp build/iphone/Info.plist ./
書き換え処理

簡単だけど、気づくまでが時間かかる……
フィードに表示されるアイコンに記事を書いた人も表示して欲しい

フィード機能すごく便利です！

一点だけ要望なのですが、表示されるアイコンが++したりコメントした人のアイコンになっているのですが、その記事を書いた人のアイコンも合わせて(もしくは記事を書いた人だけ)表示して欲しいなぁと思いました。
2次元配列を1次元配列にする。


Array.prototype.concat.applyを使う。

```javascript:
var ary = [[1,2,3,4,5,6,7],[8,9,10],[11,12]];
var ary2 = Array.prototype.concat.apply([],ary);
/*
ary2 == [1,2,3,4,5,6,7,8,9,10,11,12];
*/
```
プロセス名を元に、そのアプリのウィンドウを操作する

```ahk:Sample_Send_AltTab.ahk
Send, {ALT DOWN}{TAB}
```

などと書いて、無理やりタスクマネージャーを表示させてどうこうすることはまずやりません。

実行ファイル名がわかっている場合には、Process() 関数でプロセスIDを取得し、それを使って、キーストロークを送信します。

ウィンドウクラス名とかを調べる方が楽な場合が多いですが、こういうやり方もありますよということで。

# サンプル

コマンドプロンプトにキーストロークを送信するサンプル

```ahk:Sample_func_process.ahk
; Sample: Send key stroke to the window from process name.

NotFound = 0

ProgramFileName = cmd.exe

Process, Exist, %ProgramFileName%
PID = %ErrorLevel%

If(PID == NotFound)
{
  MsgBox, Process"%ProgramFileName%" not found.
  ExitApp
}

; activate command prompt.
WinActivate, ahk_pid %PID%
WinWaitActive, ahk_pid %PID%
sleep, 500
; send key stroke to command prompt
ControlSend,  , echo message, ahk_pid %PID%
```

コマンドプロンプトを起動して、裏に隠した状態でこのスクリプトを実行すると、
コマンドプロンプトが表に出てきて、そこに「echo message」とタイプされます。

# 参考

* [Process - AutoHotkeyJp](https://sites.google.com/site/autohotkeyjp/reference/commands/Process)
VIMで、行末の余分な改行コード（^M）をすべて取り除く

たまに使うけれど、よく忘れるのでメモ。

VIMで、行末の余分な改行コード（^M）をすべて取り除くには、以下のコマンドを実行します。

```vim:
:%s/^M//g
```

* `%` はバッファ全体に対して適用
* `s/～/～/g` は、置換（g=同じ行に何個あってもすべて置き換え）

`^M` を入力するには、`<c-v>``<c-m>`を押します。
AutoHotKeyで、IMEがOFFの時のみホットストリングを有効にする(文字置き換え)

AutoHotKeyの [ホットストリング](https://sites.google.com/site/autohotkeyjp/reference/Hotstrings) を利用すれば、
例えば、__ahkとタイプしたら -> AutoHotKey に置き換わる__ というようなこともできます。

# サンプル

1. 以下のサイトからime.ahk をダウンロードして、AutoHotKey の[ライブラリディレクトリ](https://sites.google.com/site/autohotkeyjp/reference/Function#library) に置く
2. 以下のスクリプトファイルを実行して常駐させる
3. 「ahk」とタイプして、TABキーやEnterキーを押してみてください。「AutoHotKey」に置き換わります。（IMEがOFFになっている時にしか作動しないので、日本語入力の妨げになりません）

* [使用しているIMEの情報を ime.ahk で表示できるようにした - blechmusik2の日記](http://d.hatena.ne.jp/blechmusik2/20120126/1327510037)

```ahk:Sample_HotString.ahk
#include <ime>  ; ime.ahk (【入手先】http://d.hatena.ne.jp/blechmusik2/20120126/1327510037)

#If ! IME_GET() ; IME がOFFの時だけ有効

::ahk::AutoHotKey

#If ; End #If
```

ホットストリングでアクションを実行することもできるので、TextExpander の Fill-in みたいなこともできるはず。
GUIのやり方を勉強してから試してみたいですね。

# 補足

`#include <ime>` という書き方については、こちらを参考のこと。

* [#Include / #IncludeAgain - AutoHotkeyJp](https://sites.google.com/site/autohotkeyjp/reference/commands/-Include)
Destructuring Assignment


ECMAScript Harmonyで提案されているDestructuring AssingmentがCoffeeScriptに実装されていて地味に便利なので紹介。[harmony:destructuring](http://wiki.ecmascript.org/doku.php?id=harmony:destructuring)を元にしているらしいけど、実際に実装されてるシンタックスを調査してみた。CoffeeScriptのバージョンは1.3.3。

##配列の分解
```coffeescript:array.coffee
[a, b] = [1, 2]
console.log a, b     # 1 2
```
左辺に配列リテラルで変数を書き配列を代入すると、展開された配列の値が変数に代入される。

###深い配列
```coffeescript:array_deep.coffee
[a, b, [c, d, [e]]] = [1, 2, [11, 12, [21]]]
console.log a, b, c, d, e     # 1 2 11 12 21
```
深い配列でもさくっと変数に値を展開できる。

###restオペレータ
```coffeescript:array_rest.coffee
[a, b..., c] = [1, 2, 3, 4, 5]
console.log a, b, c     # 1 [2, 3, 4] 5
```
途中を配列に込めるなんてことも。

###入れ替え
```coffeescript:array_swap.coffee
a = 1
b = 2
[a, b] = [b, a]
console.log a, b     # 2 1
```
tmpなんていう変数が必要なくて便利。だけどJavaScriptにコンパイルすると・・・

```javascript:array_swap.js
var a, b, _ref;
a = 1;
b = 2;
_ref = [b, a], a = _ref[0], b = _ref[1];
console.log(a, b);
```
こんな感じに、配列を作って参照・代入するのでパフォーマンスが求められるケースでは注意して使用すべき。

###スキップ
```coffeescript:array_skip.coffee
[a, , b] = [1, 2, 3]
console.log a, b     # PARSE ERROR ON LINE 2: UNEXPECTED ','
```
[harmony:destructuring](http://wiki.ecmascript.org/doku.php?id=harmony:destructuring)では提案されてるけど、CoffeeScriptでは不要な値を飛ばして取得することはできない。

##オブジェクトの分解
```coffeescript:object.coffee
{foo: a, bar: b, baz: c} = {foo: 1, bar: 2, baz: 3}
console.log a, b, c     # 1 2 3
```
左辺にオブジェクトリテラルで変数を書きオブジェクトを代入すると、展開された配列の値が変数に代入される。

###深いオブジェクト
```coffeescript:object_deep.coffee
{foo: a, bar: {barfoo: b}, baz: c} = {foo: 1, bar: {barfoo: 21}, baz: 3}
console.log a, b, c     # 1 21 3
```
深いオブジェクトでもさくっと変数に値を展開できる。

###ショートハンド
```coffeescript:object_shorthand.coffee
{foo, bar, baz} = {foo: 1, bar: 2, baz: 3}
console.log foo, bar, baz     # 1 2 3
```
key-valueで分解しなくてもkeyで分解できる。

```coffeescript:object_shorthand_mixed.coffee
{foo, bar: {barfoo}, baz: c} = {foo: 1, bar: {barfoo: 21}, baz: 3}
console.log foo, barfoo, c     # 1 21 3
```
柔軟にコンパイルしてくれるので混ぜて使うことも可能。

##引数の分解
```coffeescript:function.coffee
f = ([a, b, c])-> console.log a, b, c     # 1 2 3
f [1, 2, 3]

f = ({foo: a, bar: b, baz: c})-> console.log a, b, c     # 1 2 3
f {foo: 1, bar: 2, baz: 3}

f = ({foo, bar, baz})-> console.log foo, bar, baz     # 1 2 3
f {foo: 1, bar: 2, baz: 3}
```
関数の引数でも使用できる。
ssh Tunnel


よく忘れるトンネル掘り

## コマンド

```shell
$ ssh -N -f -L <ローカルマシンの待受ポート番号>:<接続先で接続するホストアドレス>:<相手先で接続するポート番号> [<接続するユーザ名>@]<接続先アドレス>
```


## 例

ローカル(Local) からサーバ(Server)ホスト、sshトンネルを掘り、ローカルの8879に接続すれば、サーバの3306番を使用しているmysqlに接続する。

こうすることで、LocalでサーバのMySQLのデータをダンプすることが出来る。

```AA
+--------+            +--------+
| Local  |   Tunnel   | Server |
|   8879 ================> fn ----+
|        |            |        |  |
+--------+            |   3306 <--+
                      +--------+
```

mysql を使った接続使用例

```shell
$ ssh -N -f -L 8879:127.0.0.1:3306 server
$ mysql --host 127.0.0.1 --port 8879 --user root --password root?
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 784
Server version: 5.0.95 Source distribution

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
...
```
両足使ってVimを操作

２つのUSBフットペダルにiとEscを割り当てて、ペダル操作でVimのモード操作を出来るようにした人が現れました。プラグイン云々ではなくハードを改造してるようです。

https://github.com/alevchuk/vim-clutch

Tipsとは違うので投稿するか迷いましたが、おもしろネタって事で。
Excelでファイル名をセルに表示

`=MID(CELL("filename"),SEARCH("[",CELL("filename"))+1, SEARCH("]",CELL("filename"))-SEARCH("[",CELL("filename"))-1)`

どのセルでも同じ（A1を絶対値指定してる）。
やっている内容は、セルの情報をファイルネームごと（ワークシート名も入っている）もってきて
「]」の位置を見極めて、右から文字列を取得している

※ファイル名やフォルダ名に「]」が含まれていると、正しく取得ができない…
その場合は、ユーザー関数を使うしかないかな。

```Excel:SheetName()
Function SheetName() As String
　Application.Volatile
　SheetName = Application.Caller.Parent.Name
End Function
```
git最強のオプション filter-branch

[Git Advent Calendar / Jun.](http://qiita.com/advent-calendar/git) 21日目の記事を書かせて頂きます。

今回の記事では、gitのfilter-branchを紹介します。

## filter-branchとは
これは、大量のコミットの書き換えを機械的に行うオプションです。
(filter-branch自体はシェルスクリプトで書かれています。)
これを使うとレポジトリの歴史上からコミットされたファイルを完全に抹消することができます！

今回、ファイルを抹消するためにfilter-branchの--index-filterオプションを使います。

## 使うシチュエーション
こんな怖いオプションどこで使うのかというと、例えば下記のようなシチュエーションが考えられます。

* パスワードファイルを間違ってcommitしてしまった or やんごとなき事情により削除したい
* 巨大なファイルを間違ってcommitしてしまった

1コミットだけなら良いのですが、何回もcommitされていたり、ブランチを作ってマージとかを繰り返しているとなると、もう手動では削除はできないですよね。

そこで、今回はfilter-branchの--index-filterオプションを使って、全てのcommitを精査して対象のファイルを消します。

## 実際にやってみる
まず、サンプルのgitのレポジトリを作りました。
ブランチ(test_a)も作り、password.txtというファイルに対してcommit & masterにmergeしています。

~~~
[ master ]$ ls
password.txt test.txt
[ master ]$ git log --graph --pretty=format:"%h : %s"
* bdb9b96 : password 2
* b000e66 : password 1
* e0c5788 : initial commit
~~~

で、後になって**password.txt**を消したいとなったとします。
今回はサンプルなので、そのままやってしまいますが、実際のサービスではまずは、テスト用にcloneしたレポジトリで試してからやってください。

~~~
[ master ]$ ls
password.txt test.txt
[ master ]$ git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch password.txt" --prune-empty -- --all
Rewrite b000e661b5267f00a0cd32f9b83514a8e2714f4c (2/3)rm 'password.txt'
Rewrite bdb9b9650c5fc1fe3c398672c1f22f86881325e1 (3/3)rm 'password.txt'

Ref 'refs/heads/master' was rewritten
Ref 'refs/heads/test_a' was rewritten
Ref 'refs/remotes/origin/master' was rewritten
[ master ]$ ls
test.txt
[ master ]$ git checkout test_a
Switched to branch 'test_a'
[ test_a ]$
test.txt
~~~

password.txtは消えてますね！
他のブランチでも消えています。
git log -pしても差分はみれません！
よーしこれで完了だ！！。。。。。とは、いきません。
例えば、

~~~
[ master ]$ git show b000e661b5267f00a0cd32f9b83514a8e2714f4c
commit b000e661b5267f00a0cd32f9b83514a8e2714f4c
Author: Spring_MT <today.is.sky.blue.sky@gmail.com>
Date:   Thu Jun 21 15:28:50 2012 +0900

    password 1

diff --git a/password.txt b/password.txt
new file mode 100644
index 0000000..f3097ab
--- /dev/null
+++ b/password.txt
@@ -0,0 +1 @@
+password

~~~

とかすると、差分が見れてしまいます。。。。
ローカルレポジトリにgitのオブジェクトがまだ残っていることに起因しています。

~~~
[ master ]$ ls .git/objects/b0/
00e661b5267f00a0cd32f9b83514a8e2714f4c
(object_idの最初の二文字がdirを示す)
~~~

これを消さないと、まだpassword.txtの中身がわかってしまうので、git gcで消しましょう。

~~~
[ master ]$ rm -rf .git/refs/original/
[ master ]$ git reflog expire --expire=now --all
[ master ]$ git gc --aggressive --prune=now
Counting objects: 6, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (6/6), done.
Total 6 (delta 0), reused 0 (delta 0) 
[ master ]$ git show b000e661b5267f00a0cd32f9b83514a8e2714f4c
fatal: bad object b000e661b5267f00a0cd32f9b83514a8e2714f4c
~~~

これで、レポジトリからpassword.txtとその内容が抹消されました！
git gcしているので、オブジェクトもなくなっているので、復旧は**不可能**です。
filter-branchをする時以外でも、commitを消した際は、git gcしておくと良いかと思います。

filter-branchは用法、用量を守ってお使いください。

### 補足
#### --no-ffでmergeしている場合
mergeコミットがあると、 "error: duplicate parent"となって、git gcしてもオブジェクトが残ってしまいす。
この場合ローカルのデータを消すためには、push(forceオプション付き) -> レポジトリ消す -> clone する必要があります。
ActionViewで自動リンク


[rinku](https://rubygems.org/gems/rinku)というgemを使って、ActionView 3.2で自動リンクをする。

ちなみに3.0までは`ActionView::Helpers::TextHelper`に`auto_link`っていうそのものズバリなヘルパメソッドがあったけど、3.1から削除されてしまった。一応それを切り出した[rails_autolink](https://rubygems.org/gems/rails_autolink)があるんだけど、rinkuはCで書かれてて速いらしく、GitHubで使われているようなので、今回はこちらを使った。

Gemfile:

```
gem 'rinku'
```

hoge.html.erb:

```
<%= raw Rinku.auto_link(h(some_text)) %>
```

`some_text`がscriptタグを含んでいたら嫌なので、まず`h`でエスケープしておき、そのあとに`auto_link`でURLをaタグに変換する。そしてそれを自動エスケープせずに出力したいから`raw`。

`raw`のかわりに`String#html_safe`を使ってみたけどうまくいかなかった。両者の違いはなんなんだろう？
分割したウィンドウの大きさを変更する

いままでノートPCで開発をしていた時は画面も小さかったのであまりバッファは分割していませんでした。最近広いモニタにしてバッファを分割することが多くなり、分割バッファの幅を変えるのに`C-x {`や`C-x }`でやっており結構面倒でした。

ネットで調べていいのがあったのでその設定をメモしておきます。

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

```common-lisp:.emacs.d/init.el
(defun window-resizer ()
  "Control window size and position."
  (interactive)
  (let ((window-obj (selected-window))
        (current-width (window-width))
        (current-height (window-height))
        (dx (if (= (nth 0 (window-edges)) 0) 1
              -1))
        (dy (if (= (nth 1 (window-edges)) 0) 1
              -1))
        action c)
    (catch 'end-flag
      (while t
        (setq action
              (read-key-sequence-vector (format "size[%dx%d]"
                                                (window-width)
                                                (window-height))))
        (setq c (aref action 0))
        (cond ((= c ?l)
               (enlarge-window-horizontally dx))
              ((= c ?h)
               (shrink-window-horizontally dx))
              ((= c ?j)
               (enlarge-window dy))
              ((= c ?k)
               (shrink-window dy))
              ;; otherwise
              (t
               (let ((last-command-char (aref action 0))
                     (command (key-binding action)))
                 (when command
                   (call-interactively command)))
               (message "Quit")
               (throw 'end-flag t)))))))
(global-set-key "\C-c\C-r" 'window-resizer)
```

これで、Emacsを再起動し、分割されたバッファで`C-c C-r`をして、`h`を押すと境界線が左に、`j`を押すと下に、`k`を押すと上に、`l`を押すと右に移動します。

これは直感的でわかりやすいです。


## 参考URL

http://d.hatena.ne.jp/mooz/20100119/p1
http://d.hatena.ne.jp/khiker/20100119/window_resize
コマンドラインで OGP をデバッグする

Facebook のデバッガー ( http://developers.facebook.com/tools/debug ) も便利ですが、Graph API 経由でも ogp を確認出来ます。

```php
#!/usr/bin/env php
<?php

if (!isset($argv[1])) {
    echo "Usage: php ogp.php [URL]", PHP_EOL;
    exit;
}

$data = http_build_query(array(
    'id'     => $argv[1],
    'scrape' => 'true',
));

$context = array(
    'http' => array(
        'method' => 'POST',
        'header' => implode("\r\n", array(
            'Content-Type: application/x-www-form-urlencoded',
            'Content-Length: '.strlen($data),
        )),
        'content' => $data,
    ),
);

var_dump(json_decode(file_get_contents(
    'https://graph.facebook.com',
    false,
    stream_context_create($context)
), true));
```

うん、雑なコード。
git でリモートのタグやブランチを削除する方法

git におけるリモートリポジトリの操作は、「リモート上の何かを直接操作する」のではなくて「ローカルの変更をリモートに送りこむ」と考えれば理解しやすいのかもしれない。

リモートのタグを削除する
------------------------

リモート origin のタグ TAGNAME を削除するには、次のようにする。

	git push origin :tags/TAGNAME

リモートに「空のタグを送りこむ」という感じ。

リモートのブランチを削除する
----------------------------

リモート origin のブランチ BRANCHNAME を削除するには、次のようにする。

	git push origin :BRANCHNAME

リモートに「空のブランチを送りこむ」という感じ。

追記（2012-09-13）
----------------

TAGNAME や BRANCHNAME の前にコロンを付けるかわりに、次のようにすることができるようです。こちらのほうが分かりやすいですね。

	git push --delete origin tag TAGNAME
	git push --delete origin BRANCHNAME
XML の整形

XMLStarletを使って簡単に整形できる。`xml`は、XMLStarletのコマンド名。

`xml fo [XMLFILE]`

XMLFILEを省略すると、標準入力からXMLを整形する。

```xml
$ echo "<keys><key>color</key><val>blue</val></keys>" | xml fo
<?xml version="1.0"?>
<keys>
  <key>color</key>
  <val>blue</val>
</keys>
```

**XMLStarletのホームページ**
http://xmlstar.sourceforge.net/

XMLStarletは、整形するだけでなく色々な操作をXMLに対して行うことができるツールである。
gem install を高速化する


```
$ gem install XXX --no-rdoc --no-ri
```

ドキュメントが不要な人はこれでインストールにかかる時間が二倍位高速になります。

## 実際にやってみた
試しにjsonで測ってみました。

```
$ time gem install json 
time gem install json 
Fetching: json-1.7.3.gem (100%)
Building native extensions.  This could take a while...
Successfully installed json-1.7.3
1 gem installed
Installing ri documentation for json-1.7.3...
Installing RDoc documentation for json-1.7.3...

real	0m9.695s
user	0m3.000s
sys	0m0.434s
```

```
$ time gem install json --no-rdoc --no-ri
time gem install json --no-rdoc --no-ri
Building native extensions.  This could take a while...
Successfully installed json-1.7.3
1 gem installed

real	0m1.991s
user	0m0.939s
sys	0m0.241s
```

4倍位早くなりましたね、おすすめです。

## デフォルトにする
``.gemrc``に以下の内容を記述します。

```
gem: --no-ri --no-rdoc
```

参考 : [RubyGemsでgemのインストール時に--no-ri --no-rdocをデフォルトにする](http://d.hatena.ne.jp/ruedap/20110514/ruby_gem_install_no_ri_no_rdoc_gemrc)
CakePHP2系でJSON形式のデータをjQueryが受け取る

CakePHP2系を利用して、JSON形式のデータをVIEW側が受け取る方法

環境
CakePHP 2.1.2
PHP 5.3.10

---

ResponseオブジェクトのbodyにJSONデータをセットしてVIEW側に返却

```HogesController.php
class HogesController extends AppController {
     public function hoge() {
          $this->autoRender = false;
          $json = array('json_data'=>array('key01'=>'data01', 'key02'=>'data02'));
          return new CakeResponse(array('body' => json_encode($json)));
     }
}
```

---

jQuery.ajax() の dataType を 'json' として受け取るデータを JSON データとして評価
jQuery.parseJSON() を利用して、JSON データをJavaScript オブジェクトに変換

```js:hoge.ctp
<?php
$js = <<< JS
     $(function(){
       var _hoge = function() {
         var json = $.ajax({
              url: 'hoges/hoge',
              async: false,
              type: 'GET',
              dataType: 'json'
         });
         if (json.responseText == '') return true;
         var response = $.parseJSON(json.responseText);
         console.log(response.json_data.key01);
         console.log(response.json_data.key02);
       };
       _hoge();
     });
JS;
echo $this->Html->scriptBlock($js, array('block' => 'script'));
?>
```
dired でファイルのフルパスを簡単に killing

dired は w でカーソル位置(もしくはマークしているファイル)のファイル名を killing できる。このとき、プレフィックスが 0 であればフルパスを killing するのだが、プレフィックス 0 は入力するのが面倒。なので C-u w で (すなわち、プレフィックス 4 で) フルパスを killing できるようにしてみた。

```cl
(defadvice dired-copy-filename-as-kill (before four-prefix activate)
  (interactive "P")
  (when (eq 4 (prefix-numeric-value (ad-get-arg 0)))
    (ad-set-arg 0 0)))
```

この設定の問題は、プレフィックスが 1 以上 (n) であればカーソル以下 n 個のファイル名を killing するという機能のうち n = 4 が使えなくなることである。また、本来 C-u を入力することで得られる default-directory からの相対パスも取得できなくなる。絶対パスを取得する機会が少ないなら設定しない方がいいかと。
macのターミナルでkeytoolを使った際の文字化け対策


macのターミナルでJDK等のkeytoolを使った際に、文字化けが発生する。
macのターミナルの文字コードがデフォルトでUTF-8になっているのに対して、macにインストールされているJDKのデフォルトの文字コードがShift_JISになっているのが原因ぽい。
環境変数 _JAVA_OPTIONSで文字コードを指定できるので、以下のように.profileに記述を追加した。

```profile:~/.profile
export _JAVA_OPTIONS='-Dfile.encoding=UTF-8'
```

```
$ source ~/.profile
```
UITableViewCell の Reorder-Control（並べ替え用ノブ）をカスタマイズ


```objective-c:Hoge.m

// UITableViewDelegate
- (void)tableView:(UITableView *)tableView 
  willDisplayCell:(UITableViewCell *)cell 
forRowAtIndexPath:(NSIndexPath*)indexPath
{
	// セルの子 view を走査…
	for (UIView *view in cell.subviews)
	{
		// "UITableViewCellReorderControl" という Undocumented Class ? があの並べ替え用「ノブ」
		if([NSStringFromClass([view class]) isEqualToString:@"UITableViewCellReorderControl"])
		{
			for (UIImageView *knobView in view.subviews)
			{
				// ノブのアイコンを表示しているのは単なる UIImageView
				if([knobView isKindOfClass:[UIImageView class]])
				{
					// nil にすれば「三」のようなアイコンを消せる
					UIImage *image = nil;
					[knobView setImage:image];

					break;
				}
			}

			break;
		}
	}

}

```
MacVim-Kaoriya版で proc.so がないとエラーが出たら

MacVim-Kaoriya版  7.3.515 にアップデートしたら、
proc.so がないとエラーが出ました。

.vimrcを以下のように変更したら解決しました。
パッケージ内のファイル名、いつから変わったのかな？

```vim:.vimrc
if has('mac')
  " let g:vimproc_dll_path = $VIMRUNTIME . '/autoload/proc.so'
  let g:vimproc_dll_path = $VIMRUNTIME . '/autoload/vimproc_mac.so'
endif
```

![MacVim.appの中身](https://lh5.googleusercontent.com/-YwCxVQH8yQA/T-HaFXiGUBI/AAAAAAAAEPM/dpM1zaIgreQ/s800/_Applications_MacVim.app_Contents_Resources_vim_runtime_autoload.png)
[AIR] ローカルに画像保存

```actionscript3:
/**
 * copyright (c) 2012 www.itoz.jp
 * @author itoz
 * @since 2012/06/20 19:55:22
 */
package jp.itoz.air.util
{
	import flash.events.ErrorEvent;
	import flash.filesystem.File;
	import flash.filesystem.FileMode;
	import flash.filesystem.FileStream;
	import flash.utils.ByteArray;
	import flash.events.EventDispatcher;
	import flash.events.IEventDispatcher;

	/**
	 * [AIR] ローカルに画像保存
	 */
	public class LocalImageSaver extends EventDispatcher
	{
		public function LocalImageSaver(target : IEventDispatcher = null)
		{
			super(target);
		}

		/**
		 * 保存
		 * @param writeFile
		 * @param imageBytes
		 */
		public function save(writeFile : File, imageBytes : ByteArray) : void
		{
			var stream : FileStream = new FileStream();
			try {
				
				stream.open(writeFile, FileMode.WRITE);
				stream.writeBytes(imageBytes, 0, imageBytes.length);
				
			}
			catch (e : Error) {
				dispatchEvent(new ErrorEvent(ErrorEvent.ERROR, false, false, writeFile + " 保存できませんでした"));
			}
			finally {
			stream.close();
			}
		}
	}
}
```


```actionscript3:
//sample
_saveDir = File.userDirectory;
var pngBytes : ByteArray 	= PNGEncoder.encode(myBitmapData);
_saver = new LocalImageSaver();
_saver.addEventListener(ErrorEvent.ERROR, onSaveError);
_saver.save(_saveDir.resolvePath("hoge"+"/"+_name), pngBytes);
```
~/.ssh/config に LocalForward の設定を書く

`ssh -L aaaa:proxy.domain:bbbb myname@where.is.myhost` みたいにしてローカルフォワードできるが、何度もやるのが面倒。

.ssh/config ファイルに、次のように書いておけば便利:

```txt:config
Host myhost
	HostName where.is.myhost
	User myname
	LocalForward aaaa proxy.kuins.net:bbbb
```

こうすると、`ssh myhost` だけでカンタンにローカルフォワードできる。

\# man すら見ずに「どうせ config で適当に書きゃまぁ行けるやろー」とか思って loc まで書いた所で neocomplecache さんが補完してくれた。neocomplecache さんパないっすね。
VirtualBox の仮想ディスクサイズを拡張する

全体としては次の手順で操作していきます。

1. 仮想マシンの状態確認
2. 仮想マシンのバックアップ
3. 仮想ディスクサイズの拡張
4. 仮想ディスク情報の確認

バックアップまでは GUI からできるのですが、
仮想ディスクサイズの拡張はなぜか GUI からはできません。
ここでは操作は全部コマンドで行うことにします。

コマンドは Windows と Linux の両方を表記していますが、
Linux はディストリによっては異なる動作をするかもしれません。

#1. 仮想マシンの状態確認

コマンドを実行して State が "power off" になっていることを確認します。

**Windows の場合**

    VBoxManage showvminfo 仮想マシン名 | findstr "^Name ^State"

**Linux の場合**

    VBoxManage showvminfo 仮想マシン名 | grep -E "^Name|^State"

#2. 仮想マシンのバックアップ

コマンドは Linux, Windows 共通です。

    VBoxManage export 仮想マシン名 --output 出力ファイル名 --legacy09 --manifest

#3. 仮想ディスクサイズの拡張

コマンドは Linux, Windows 共通です。
ディスクサイズは **MB 単位** で指定します。

    VBoxManage modifyhd 仮想マシン名 --resize ディスクサイズ

#4. 仮想ディスク情報の確認

最後に設定したサイズになっているか確認しましょう。
コマンドのオプションにはファイル名(.vdi, .vmdk, .vhd)を指定することに注意してください。

**Windows の場合**

    VBoxManage showhdinfo 仮想ディスクファイル名 | findstr "^Logical"

**Linux の場合**

    VBoxManage showhdinfo 仮想ディスクファイル名 | grep -E "^Logical"

参考: [VBoxManager コマンドリファレンス](http://www.virtualbox.org/manual/ch08.html "Chapter8. VBoxManage")
jQuery + jquery.lazyload + jquery.transit + iScroll4　でスクロールしながら画像の遅延ロード＆表示アニメーションをちょっときれいに。



```
<script src="jquery.js" type="text/javascript" charset="utf-8"></script>
<script src="iscroll.js" type="text/javascript" charset="utf-8"></script>
<script src="jquery.lazyload.js" type="text/javascript" charset="utf-8"></script>
<script src="jquery.transit.js" type="text/javascript" charset="utf-8"></script>
```

jquery.lazyloadはスクロールイベントを監視しているので、
iScrollのスクロールでwindowのscrollを発火させる。

```
	new iScroll('scroller', {
		useTransition: true,
		onScrollMove: function () {
			$(window).trigger('scroll');
		}
	});
```


Lazy Load後の表示でデフォルトのアニメーションを使うとMobile Safariではコマ落ちするので、jquery.transitのアニメーションに置き換える。

```
   $('target').lazyload({
      effect : 'show',
      effect_speed: 0,
      appear: function() 
      {
        $(this).css('opacity',0);

      },
      load: function() 
      {
        $(this).transition({
            'opacity': 0.999999
        }, 250);
      }   
    });
```
Emacsのgitクライアントmagitのインストール

こちらのエントリを参考にEmacsのgitクライアントMagitを使い始めました。

http://qiita.com/items/c7a11ff30caedc4c5ba7

私の場合、追加でいれるlisp類はユーザのディレクトリにいれるようにしているので、自分がしたインストールの仕方をメモしておきます。

```
$ cd .emacs.d/elisp/
$ git clone git@github.com:magit/magit.git
```

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

```common-lisp:.emacs.d/init.el
(add-to-list 'load-path "~/.emacs.d/elisp/magit")
(require 'magit)
```
Vim で表示行単位の上下移動

慣れれば苦でもないのかもしれないけれど、個人的にはやはり表示行単位の移動の方が好みなので。[vimのカーソル移動を表示行単位で行うようにしたい - ちくわプログラマにっき](http://d.hatena.ne.jp/thata/20100606/1275796513 "vimのカーソル移動を表示行単位で行うようにしたい - ちくわプログラマにっき") を参考にこうしてみました:

```vim:move-by-display-lines.vim
" 表示行単位で上下移動するように
nnoremap j gj
nnoremap k gk
nnoremap <Down> gj
nnoremap <Up>   gk
" 逆に普通の行単位で移動したい時のために逆の map も設定しておく
nnoremap gj j
nnoremap gk k
```

余談。これを書く時に「これってどっちが論理行だっけ物理行だっけ？」と気になって調べてみた所、どうもみんな言っていることがまちまち。[物理行と論理行 - 永遠に未完成](http://d.hatena.ne.jp/thinca/20101028/1288199814 "物理行と論理行 - 永遠に未完成") にまとめられてるように、「論理行」「物理行」というのはすごく不統一な用語のようです。あまり使わない方が良さそうです。なお `:help gj` には「表示行」(英: display lines) と書かれていたので、こちらの用語は（少なくとも Vim 界隈では）全く問題ないと思います。

### 参考文献
- vimのカーソル移動を表示行単位で行うようにしたい - ちくわプログラマにっき, http://d.hatena.ne.jp/thata/20100606/1275796513, 2012/06/20 15:05
- 物理行と論理行 - 永遠に未完成, http://d.hatena.ne.jp/thinca/20101028/1288199814, 2012/06/20 15:15
Homebrew で突如発生する Untracking File を一括削除する


Homebrew を使っていて、どういうわけか Untracking File が発生して `brew update` に失敗することがあります。これらのファイルを一括削除する方法です。

```sh
⚡ cd /usr/local
⚡ git status -b -s |awk '/^\?{2}.+/ { print $2 }' |xargs rm
```
ファイルを自動保存する

elispファイルをインストールします。

```
M-x install-elisp http://homepage3.nifty.com/oatu/emacs/archives/auto-save-buffers.el
```

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

```common-lisp:.emacs.d/init.el
;;; auto-save-buffers
(require 'auto-save-buffers)
(run-with-idle-timer 2 t 'auto-save-buffers)
```

アイドル2秒後に自動で保存されます。

## 参考文献

「Emacsテクニックバイブル」P94
クロージャで可変長引数を使う。


あれ？Groovyのクロージャで可変長引数って使えたっけ？
と思ってやってみたらできた。

```groovy:
def testclj = {... arg ->
    println arg.each{ println it }
    println arg.class
}
testclj(1,3,6)

/*
結果:
1
3
6
class [Ljava.lang.Object;
*/
```
Capistranoでデプロイ完了したらGrowlで通知する

まず http://d.hatena.ne.jp/tetsuyai/20110917/1316234149 あたりを参考に growlnotify を入れます。

```
after "deploy:restart" do
  system("which -s growlnotify && growlnotify -n 'Capistrano' -t 'Capistrano' -m 'デプロイ完了しました。'")
end
```

which -s でのコマンドの存在チェックと、 -n でアプリケーション名を設定しているところがポイントですかね。
Heroku上のPlayから外のMysqlに接続すると、1度目は必ず失敗してしまう問題の解決方法

###ありません。
先日[scalaの勉強会](http://blog.greative.jp/archives/627)で見てもらった限りでは、現状(2012/06/19現在)、根本的な解決策は「ない」とのことでした。
2回目はうまくいくので、リトライするようにしましょう。
###heroku上の該当のエラーログの抜粋
```sh:herokuのエラーログ
2012-06-20T01:49:22+00:00 app[web.1]: [error] application - 
2012-06-20T01:49:22+00:00 app[web.1]: 
2012-06-20T01:49:22+00:00 app[web.1]: ! @zzzzzzzzzz - Internal server error, for request [GET /list_mangas] ->
lay.core.ActionInvoker$$anonfun$receive$1$$anon$1: Execution exception [[SQLException: Timed out waiting for a free available connection.]]
java.sql.SQLException: Timed out waiting for a free available connection.
```
###heroku上の該当のエラーログ
```sh:herokuのエラーログ
2012-06-20T01:49:20+00:00 heroku[router]: GET manga-checker.herokuapp.com/assets/js/index.js dyno=web.1 queue=0 wait=0ms service=6ms status=304 bytes=0
2012-06-20T01:49:22+00:00 app[web.1]: [error] application - 
2012-06-20T01:49:22+00:00 app[web.1]: 
2012-06-20T01:49:22+00:00 app[web.1]: ! @zzzzzzzzzz - Internal server error, for request [GET /list_mangas] ->
2012-06-20T01:49:22+00:00 app[web.1]: 
2012-06-20T01:49:22+00:00 app[web.1]: play.core.ActionInvoker$$anonfun$receive$1$$anon$1: Execution exception [[SQLException: Timed out waiting for a free available connection.]]
2012-06-20T01:49:22+00:00 app[web.1]: 	at play.core.ActionInvoker$$anonfun$receive$1.apply(Invoker.scala:82) [play_2.9.1-2.0.jar:2.0]
2012-06-20T01:49:22+00:00 app[web.1]: 	at play.core.ActionInvoker$$anonfun$receive$1.apply(Invoker.scala:63) [play_2.9.1-2.0.jar:2.0]
2012-06-20T01:49:22+00:00 heroku[router]: GET manga-checker.herokuapp.com/list_mangas dyno=web.1 queue=0 wait=0ms service=1016ms status=500 bytes=1930
2012-06-20T01:49:22+00:00 app[web.1]: 	at akka.actor.Actor$class.apply(Actor.scala:290) [akka-actor-2.0.jar:2.0]
2012-06-20T01:49:22+00:00 app[web.1]: 	at play.core.ActionInvoker.apply(Invoker.scala:61) [play_2.9.1-2.0.jar:2.0]
2012-06-20T01:49:22+00:00 app[web.1]: 	at akka.actor.ActorCell.invoke(ActorCell.scala:617) [akka-actor-2.0.jar:2.0]
2012-06-20T01:49:22+00:00 app[web.1]: 	at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:179) [akka-actor-2.0.jar:2.0]
2012-06-20T01:49:22+00:00 app[web.1]: Caused by: java.sql.SQLException: Timed out waiting for a free available connection.
2012-06-20T01:49:22+00:00 app[web.1]: 	at com.jolbox.bonecp.BoneCP.getConnection(BoneCP.java:503) ~[bonecp-0.7.1.RELEASE.jar:0.7.1.RELEASE]
2012-06-20T01:49:22+00:00 app[web.1]: 	at com.jolbox.bonecp.BoneCPDataSource.getConnection(BoneCPDataSource.java:114) ~[bonecp-0.7.1.RELEASE.jar:0.7.1.RELEASE]
Win32なGvimをMinGWShellでコマンドを打たずに起動する方法

Win32な(G)vimはMinGWから起動することによって、テンポラリファイルを作成することができる。
しかし、MinGWを常用していない限り、いちいちMinGWのBashから起動するのは面倒である。
それをVBScriptを使ってWrapしてあげることにより煩わしさを減らすことができる。
コードは以下の通り

```Gvim.vbs
Option Explicit

Dim oShell
Set oShell = WScript.CreateObject ("WScript.Shell")
oShell.run "C:\MinGW\msys\1.0\bin\bash.exe -c 'source ~/.bashrc; gvim' &"
Set oShell = Nothing
```
この時PATHにWin32なGVimのパスが通ってる必要がある。
また、`source ~/.bashrc;`が無いと、.bashrcで設定したMinGW向けの設定を読まない。
このスクリプトを実行すると、Gvim以外にプロンプト画面が出てくる。
邪魔だと思う人は「[NaiNai](http://www.isoq.org/Pages/NaiNai.aspx)」などのユーティリティを使ってタスクトレイに最小化することをおすすめする。