OmniAICreator/Qiita-1.07M huggingface dataset:
詳解 Linux カーネル 第3版 & Linux Kernel ソースコード 0001

#目的と概要#
今回の目的は

1.積み本を消化する
2.Kernel について勉強する

これを、本とソースコードを同時に読みながら理解を深めて行きたいと思います。

読む本は[詳解 LINUX カーネル 第3版]です。
linux kernelのバージョンは2.6ですので、
使うソースコードもv2.6にします。
プロセッサはx86でいきます。
せっかくなんでv2.6とv3.xのソースコードを
比較しながら記載していきます（できるだけ）。

下記に主に使用した本と参考サイトについてまとめます。

###詳解 Linux カーネル 第3版###
使用した本
[詳解 Linuxカーネル 第3版](http://www.amazon.co.jp/%E8%A9%B3%E8%A7%A3-Linux%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB-%E7%AC%AC3%E7%89%88-Daniel-Bovet/dp/487311313X/ref=sr_1_1?ie=UTF8&qid=1422028562&sr=8-1&keywords=linux+kernel)

###Linux Cross Reference###
参考サイト
[Linux Cross Reference](http://lxr.free-electrons.com/source/)
v3.x用で使用します
###Cross-Referenced Linux and Device Driver Code###
参考サイト
[Cross-Referenced Linux and Device Driver Code](http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux)
v2.6用で使用します

#進め方#
主に「詳解 LINUX カーネル」をメインに進めていきます。
1章の概要は飛ばします。2章のメモリアドレッシングから
初めていきます。
本に出てきた構造体やソースコード、関数、パスの説明、
本に書いてある内容のソースの部分wの説明
などについて書いていきます。
調べたサイトも同時に記載していきます。

タイトルの部分の最後の数字は

* 上位２桁「詳解 LINUX カーネル」の章番号
* 下位２桁　章ごとの更新回数

という風に記載していきます。
 
何ヶ月かかるかわかりませんができるだけ早く全ページ解説できるよう頑張ります。
なにか不明点やおかしな部分がありましたらご連絡ください。
訂正してきますのでよろしくお願いいたします。
hetemlでgitでデプロイする方法


`git`の`hook`という機能を使えば、リモートリポジトリに`git push`すれば自動的にコミットが展開される、というわけらしい。

hetemlでの方法をまとめました。
参考：[MiddlemanのbuildディレクトリをGitでサーバーにデプロイする](http://110chang.com/knowledge/middleman-build-git/)

## heteml側

# 1. SSHでログイン

```
$ ssh -p 2222 YOU@sshXXX.heteml.jp
```
パスワードを求められるのでhetemlのログインパスワード（FTPパスワード）を入力。

※公開鍵方式にすればパスワードは省略可能。


# 2. 管理リポジトリを作成

```
$ mkdir repos
$ cd repos
$ mkdir YOUR_PROJECT.git
$ cd YOUR_PROJECT.git
$ git init --bare --shared
```
ローカルから`push`されたものはここにきます。

# 3.公開リポジトリを作成

```
$ cd ~
$ cd web
$ git clone ../repos/YOUR_PROJECT.git
$ mv YOUR_PROJECT/* ./ #ファイルを全部移動
$ mv YOUR_PROJECT/.??* ./ #ドットファイルも移動
$ rm -r YOUR_PROJECT
```
公開領域にgitをクローンします。今回はルートディレクトリにぶちまけたいのでファイルを移動しました。

# 4.HOOKを作成

僕もよくわかってませんが、`post-receive`というものを使えば、ローカルから管理リポジトリに`push`されることで、公開リポジトリにコピーもされるらしいです。

```
$ vi ../repos/YOUR_PROJECT.git/hooks/post-receive
```

```post-receive
#!/bin/sh

cd /path/to/web;
git --git-dir=.git pull
```

hetemlの場合

```post-receive
#!/bin/sh

cd ~/web;
git --git-dir=.git pull
```

んで、実行権限をつける。

```
$ chmod +x post-receive
```

以上でサーバー側の設定はおしまい。

## ローカル側

# 1.  作業リポジトリにリモートリポジトリを追加

```
$ git init
% git remote add origin ssh://YOU@sshXXX.heteml.jp:2222/~/repos/YOUR_PROJECT.git
```

# 2. あとは作業してその内容を`push`するだけ

```
$ git add.
$ git commit -m 'hello'
$ git push origin master
```
これでうまくいけばサーバーに公開されているはずです。簡単！
GitHub「完璧なプルリクの書き方を教えるぜ」

# はじめに
この記事は
[How to write the perfect pull request - GitHub](https://github.com/blog/1943-how-to-write-the-perfect-pull-request)
を和訳というか、意訳した記事です。
ご指摘などありましたら大歓迎です！

# 良いプルリクエストを書くには
_(原題 : How to write the perfect pull request)_


会社が成長していくと、人もプロジェクトも様変わりしていきます。GitHubの中に私達が望む文化を育んでいくためには、我々が何を自覚してコミュニケーションするべきなのか分かってきました。私達のチームが最強であり続けるために、最近以下のようなプルリクエストのガイドラインを導入しました。

## プルリクへのコメント
_(原題 : Approach to writing a Pull Request)_

- プルリクエストには目的を明記しましょう。たとえば…

     これは〜を調べてみるためのプロトタイプです
     これは〜の表示を簡素化します
     これは〜の取り扱いを修正します

- プルリクを読む人々が経緯に精通していると思い込まず、なぜその仕事が発生したのか概要を提供するように努めましょう。
- 会社の誰しもがプルリクエストを読めるということを忘れないようにしましょう。今後、今参加している人以外が読んだ時にも、内容や雰囲気がわからなくてはいけません。
- あなたがどんなフィードバックを望んでいるのか明確にしましょう。例えば「コードに目を通して欲しい」「技術的な議論がしたい」「設計について批評してほしい」「文言を確認してほしい」などです
- プルリクエストで作業が進行中ならば、いつフィードバックして欲しいかを明確にしてください。タイトルの頭に`[WIP]`をつけるのは、作業中であることを示す一般的なやり方です。_（訳註：WIPとは Work In Progress 作業中の意味です）_
- 議論に関与させたい誰かがいるなら`@hoge`と指定（mention）しましょう。そしてなぜmentionしたのかを添えましょう。（例: /cc [@jesseplusplus](https://twitter.com/jesseplusplus) ロジックの明確化のため）
- チームに対してmentionする場合も同様に理由を添えましょう。（例 /cc @github/security このやり方で問題ないですか？）

## フィードバックの書き方
_(原題 : Offering feedback)_

- 問題の内容や、どうしてこのプルリクエストが発生したのか把握しておきましょう。
- 全く同意できない場合は、反応する前に数分自分の意見を検討しましょう。
- 命令するのではなく、質問しましょう。（「…しないでください」よりも「…についてどう思いますか？」）
- なぜコードの変更を要求しているのか、理由を説明しましょう。（[スタイルガイド](https://github.com/styleguide)に従っていない？　個人的な好み？）
- コードをシンプルに、または改善する方法を提供しましょう。
- 誰かの作成した仕事を参照する際に、「バカな」などのような軽蔑的な言葉は避けましょう。
- 謙虚にやりましょう。（「あまり分からないけど、試してみましょう…」）
- 誇張を避けましょう。（「絶対に…しない」）
- グループでの評論を通して、専門的なスキル、グループの知識、製品品質を発展させていくことを目指しましょう。
- オンラインのコミュニケーションでは、ネガティブなバイアスがかかることに注意しましょう。（内容が中立であれば、我々はネガティブな発言だと仮定しがちです）。中立的ではなく、肯定的な書き方が出来ないか考えてみてください。
- 雰囲気を明確にするために絵文字を使いましょう！　「いいじゃん」と「 :sparkles: :sparkles: いいじゃん :+1: :sparkles: :sparkles: 」を比べてみてください。

## フィードバックへの対応
_(原題 : Responding to feedback)_

- とにかくまず感謝を表明してください。特にフィードバックが的確だった場合は！
- 明確化するよう求めましょう。（「ねえよく分からないんだけど、もう少し説明してくれませんか？」）
- 質問されたら、なぜそのような実装に辿り着いたのか説明し、しっかりとわかってもらいましょう。
- できることなら、すべてのコメントに返信してください。
- 関連するコミットやプルリクエストにリンクを貼りましょう（「1682851でしたやつ、名案だね！」）
- 議論の余地があったり混乱が見られる場合は、もっといい言葉をつかって彼らと会話できるのではないか自問してみてください。対面で話し合っているつもりでやりとりし、オフラインで起きている議論を要約した続報をお互いに投稿してみるといいのではないでしょうか。（これから読む人に役にたちます）

このガイドラインは、Thoughtbotの[code review](https://github.com/thoughtbot/guides/tree/master/code-review) ガイドに触発されて作成しました。
このガイドラインは、我々の仕事の進め方や、我々が育てていきたい文化に適合しています。これを読むあなた達にもそうであることを願っています！

Happy communicating!
MacでJDKのバージョンをスマートに切り替える

以前は**$JAVA_HOME**を変更してやるだけで良かったみたいですが、現在は**$PATH**も変更する必要があるようです。
それを簡単に実現するに以下のシェル関数を定義しておくと便利です。

**~/.bash_profile**や**~/.zshrc**に以下を書いておくとターミナルでログインした時にJDK1.7に切り替わります。

``` .sh
function setjdk() {
  if [ $# -ne 0 ]; then
   removeFromPath '/System/Library/Frameworks/JavaVM.framework/Home/bin'
   if [ -n "${JAVA_HOME+x}" ]; then
    removeFromPath $JAVA_HOME
   fi
   export JAVA_HOME=`/usr/libexec/java_home -v $@`
   export PATH=$JAVA_HOME/bin:$PATH
  fi
 }
 function removeFromPath() {
  export PATH=$(echo $PATH | sed -E -e "s;:$1;;" -e "s;$1:?;;")
 }
# ログイン時にJDK1.7に切り替える
setjdk 1.7
```

JDK1.6に切り替えるには以下のようにします。

``` .sh
$ setjdk 1.6

# 切り替わったことを確認
$ java -version
=> java version "1.6.0_65"
```
CのDialogBoxを振り返る【メモなので結論無し】

DialogBoxのまとめ

・そもそも

NGパターン
DialogBox(hInstance, L"IDD_DIALOG1", NULL, (DLGPROC)nekomimi);

OKパターン
DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, (DLGPROC)nekomimi);

というのがあった。

ダイアログボックスの引数は下の通り
INT_PTR DialogBox(
  HINSTANCE hInstance,  // モジュールのハンドル
  LPCTSTR lpTemplate,   // ダイアログボックステンプレート
  HWND hWndParent,      // オーナーウィンドウのハンドル
  DLGPROC lpDialogFunc  // ダイアログボックスプロシージャ
);
https://msdn.microsoft.com/ja-jp/library/cc410759.aspx

OKパターンのMAKEINTERSOURCEとはなんぞや？ってことで定義は次

---
\#define IS_INTRESOURCE(_r) ((((ULONG_PTR)(_r)) >> 16) == 0)
\#define MAKEINTRESOURCEA(i) ((LPSTR)((ULONG_PTR)((WORD)(i))))
\#define MAKEINTRESOURCEW(i) ((LPWSTR)((ULONG_PTR)((WORD)(i))))
\#ifdef UNICODE
\#define MAKEINTRESOURCE  MAKEINTRESOURCEW
\#else
\#define MAKEINTRESOURCE  MAKEINTRESOURCEA
\#endif

---

DWORDをLPTSTRにキャストしているだけだけど、unicode。
L""の場合もunicodeか。

あれじゃぁ、なんで上が動かなくて、下のほうが動いたんだろう・・・？
まとめを書こうとしてまとめじゃなくなった！

というわけで、明日へ続く
Zabbi APIのJSONフォーマットのサンプルが分かりづらいからメモ


タイトルの通りですが、Zabbix APIのドキュメントにあるリクエストのサンプル例が少ない気がしてるので、うまくいった例をメモしています。
ちなみに全てAPIバージョン2.2でしか試してません。

## item.updateでまとめてitemのstatusを更新したい。

```json
{
    "jsonrpc": "2.0",
    "method": "item.update",
    "params": [
		{"itemid": "10111","status": 0},
		{"itemid": "10112","status": 0},
		{"itemid": "10113","status": 0},
		{"itemid": "10114","status": 0}
	],
    "auth": "-",
    "id": 1
}
```

item.update
https://www.zabbix.com/documentation/2.2/manual/api/reference/item/update
Unity 4.6.1でGraphic RaycasterでタッチのPriorityを有効にする

悲報。Unity 4.6.1から、Graphic RaycasterからPriorityが消えました。
![スクリーンショット 2015-01-23 午後10.50.38.png](https://qiita-image-store.s3.amazonaws.com/0/5973/05877468-be79-450c-693f-d8a7c8ec57b4.png)

これによって、タップしたときに、目に見えているものよりさらに奥に有る物が反応してしまう、なんて事が起きるようになりました。

ということで、

# 表示されていないPriorityを表示する
```csharp
using UnityEngine.UI;

public class CustomGraphicRaycaster : GraphicRaycaster
{
    public int priority;

    public override int sortOrderPriority {
        get {
            return priority;
        }
    }
}
```
以上。
  
  

-----

・・・
蛇足を。

### タップイベントが発行されるまでの雑な解説
Unity 4.6系で導入されたuGUIでは、ユーザの操作を検出するためのBaseInputModuleクラスが用意されています。
タップイベントをサポートするためのコンポーネントとして、
BaseInputModuleクラスを何層か子のTouchInputModuleクラスが作られています。
TouchInputModuleがタップを検出すると、EventSystemのRaycastAllメソッドを呼び出します。
EventSystemのRaycastAllメソッドは、シーン中のBaseRaycasterを継承しているクラス(GraphicRaycasterとか)のコンポーネントに対して、Raycastを要求し、
各RaycasterのRaycast結果をRaycastResultのリストとして収集します。
このとき、EventSystemは収集したRaycastResultのリストを次の2点でソートしてからRaycastAllメソッドの呼び出し元に処理を返します。

- Raycasterに設定されているCameraのdepthで比較する
- Cameraのdepthが同一ならば、RaycasterのsortOrderPriorityで比較する

ソートされたリストをEventSystemから受け取ったTouchInputModuleが、リストの先頭のオブジェクトに対して、ユーザの行った操作のイベントを発行します。
日本の診療科目とHealthcare 2.0


整合性のテスト。
[Wikipediaに掲載されている旧科目](http://ja.wikipedia.org/wiki/%E8%A8%BA%E7%99%82%E7%A7%91)が、[OSMのHealthcare 2.0](http://wiki.openstreetmap.org/wiki/Proposed_features/Healthcare_2.0/Specialties)でどれだけ表現可能か、を一次チェック。
あとで更新する。

* 内科
* 消化器科 gastroenterology
* 循環器科 cardiology
* 呼吸器科 pulmonology
* 腎臓科 nephrology
* 内分泌科 endocrinology
* 糖尿病科 paediatric_diabetology  ??
* 膠原病科 定義なし
* リウマチ科 rheumatology
* アレルギー科 定義なし
* 血液内科 定義なし
* 神経内科 neurology
* 心療内科 psychosomatic_medicine
* 感染症科 infectiology* ??
* 腫瘍科 oncology

----
* 外科
* 一般外科（消化器外科） surgery  general_surgery ???
* 胸部外科（呼吸器外科・心臓血管外科） cardiothoracic_surgery ??
* 乳腺外科 endocrinology   ??
* 甲状腺外科 定義なし？
* 小児外科 定義なし？
* 肛門科 colorectal_surgery

----
* 整形外科 orthopaedics  
* 形成外科 plastic_surgery
* 脳神経外科 neurosurgery
* 小児科 定義なし？
* 産婦人科 obstetrics
* 婦人科 gynaecology
* 産科 obstetrics*  ??
* 皮膚科 dermatology
* 泌尿器科（欧米では、現在でも外科の一分野として扱われることが多い）   urology
* 眼科 ophthalmology
* 耳鼻咽喉科 ear_nose_throat
* リハビリテーション科  要調査
* 放射線科 radiology
* 精神科 psychiatry
* 麻酔科 定義なし
* 臨床検査科 定義なし？
* 病理診断科 pathology

----
* [滋賀医科大学 医学部附属病院 各診療科 外国語対応状況](http://www.shiga-med.ac.jp/hospital/doc/department/others/foreign/index.html)
【Swift】文字列→特定の文字で区切って配列にする方法（RubyやJSのsplit的な）。

現在、メールアドレスをユーザに入れてもらって
そのアドレスにメールするソフトを考えているのですが…
複数宛先の際、どうすれば対応できるのでしょうか？？

","で区切ったりしても無反応で…
よく調べると、MFMailComposeViewControllerにはArrayでアドレスを突っ込む必要がある？
しかし、TextFieldのアドレス（もちろんString）をどうやってArrayに？？と
色々物色していて行きあたったのがこちら。

RubyやJavaScriptだとspritと呼ばれるもののようですが、
Playgroundに突っ込んでも無反応だったうえ、日本語で調べてもなにも見つからずじまい。

英語で探したらこんな素的な方法がありました。
ほぼ"split"的なものだと思います。
<div class="code-frame" data-lang="she'll">
<div class="highlight"><pre>
let separators = NSCharacterSet(charactersInString: " ,")
var fullName: String = "Last, First Middle";
var words = fullName.componentsSeparatedByCharactersInSet(separators)
</pre></div>
</div>

注目すべきは
<b>charactersInString: " ,"</b>
の部分で。。。
ここに書いてある文字（この場合、半角スペースと,）のどちらをも認識。
そこで区切ってくれるのです！！

全角スペースや日本語の文字にも対応可能で
<div class="code-frame" data-lang="she'll">
<div class="highlight"><pre>
let separators = NSCharacterSet(charactersInString: " 　,")
var fullName: String = "Last, First Middle　たなか";
var words = fullName.componentsSeparatedByCharactersInSet(separators)
</pre></div>
</div>
も、きちんと配列に置き換わってくれました！

多謝：<a href="http://stackoverflow.com/questions/25678373/swift-split-a-string-into-an-array" target="_blank">Swift: Split a string into an array</a>が大変参考になりました。とくにAntonioさんに感謝です！
Slack | Incoming WebHooks を利用して, Ruby から Slack にメッセージを送る #ruby #slack

# Slack | Incoming WebHooks を利用して, Ruby から Slack にメッセージを送る #ruby #slack
## :musical_score: 概要
Incoming WebHooks を利用して, Ruby から Slack にメッセージを送ります

## :hand: 前提
環境変数の管理に dotenv gem を利用します。詳細は下記記事参照。
<i class="fa fa-external-link-square" style="font-size:1em;"></i> [dotenv gem で環境変数をスマートに管理](http://qiita.com/tbpgr/items/b7126c3d2d8f0329b11c)

## <i class="fa fa-files-o" style="font-size:1em;"></i> 手順
### :musical_note: Slack の Configure Integrations で Incoming WebHooks を追加

![slack_incoming1.png](https://qiita-image-store.s3.amazonaws.com/0/43480/7035eea2-aa8d-06d6-08bc-53bc32b4f3b9.png)

### :musical_note: Webhook URL をコピーしておく
### :musical_note: Channel , Icon, Customize Name を任意の内容に設定する
|attr|value|
|:--|:--|
|Channel|test|
|Icon|私のプロフィールアイコンを使用|
|Customize Name|(^-^)|

![slack_incoming2.png](https://qiita-image-store.s3.amazonaws.com/0/43480/be367ca5-9472-0b34-1019-d76f5b0ab77e.png)

### :musical_note: .env ファイルを設定

~~~
URL=コピーしておいた WebHooks の URL
~~~

### :musical_note: ソースコード

~~~ruby:sample.rb
require 'net/http'
require 'uri'
require 'json'
require 'dotenv'

class SlackWraper
  def self.post(text)
    data = { "text" => text }
    request_url = ENV['URL']
    uri = URI.parse(request_url)
    Net::HTTP.post_form(uri, {"payload" => data.to_json})  
  end
end

Dotenv.load
SlackWraper.post("=Message=")
~~~

### :musical_note: 実行

~~~bash
$ ruby sample.rb
~~~

### :musical_note: 実行結果を確認
![slack_incoming3.png](https://qiita-image-store.s3.amazonaws.com/0/43480/2291b5b0-cdf4-7431-5301-ad2c336b0695.png)
Active Emoji で Hello, world! #active_emoji #ruby

# Active Emoji で Hello, world! #active_emoji #ruby
## :musical_score: 概要
Active Emoji で絵文字コーディングを可能にし、 Hello, world! を出力します。

## <i class="fa fa-question-circle" style="font-size:1em;"></i> ActiveEmoji とは？

<i class="fa fa-external-link" style="font-size:1em;"></i><i class="fa fa-github-alt" style="font-size:1em;"></i> [ActiveEmoji GitHub](https://github.com/sferik/active_emoji)
<i class="fa fa-external-link" style="font-size:1em;"></i>:gem: [ActiveEmoji RubyGems](https://rubygems.org/gems/active_emoji)

Ruby のコアライブラリに Emoji のエイリアスを追加することで、
特に英語を知らない子供のために、Ruby のコードを **より簡単に読みやすく・書きやすく** します。
（と、README.md に書いてある。私が言ったわけではない）

## :closed_book: Contribution Rule
Pull Request を作成する場合のたった一つのルール。
**コミットメッセージは絵文字で書かなければならない。**

<i class="fa fa-external-link" style="font-size:1em;"></i><i class="fa fa-github-alt" style="font-size:1em;"></i> [ActiveEmoji GitHub Commits](https://github.com/sferik/active_emoji/commits/master)

**リンク先を見れば分かるように厳しい鉄則のようです**

よく見たら、 <i class="fa fa-external-link" style="font-size:1em;"></i> [did_you_mean gem](https://github.com/yuki24/did_you_mean) の作者さんが <i class="fa fa-external-link" style="font-size:1em;"></i> [Contribute](https://github.com/sferik/active_emoji/commit/8c0fe5ec373025ac483ce7d85af5001a835dac36) してました [^1]

## <i class="fa fa-flask" style="font-size:1em;"></i> サンプル
### :hand: 前提
以下の環境で動作確認しました。

* Ruby 2.1
    * date を require しないとエラーになる模様
    * 2.0 系の場合は date の require は不要
* OS
    * Windows 7
    * 本当は MacOS の方が Emoji を使いやすいらしいが、個人の都合により Win を使用します
* エディタ
    * Sublime Text2 を利用する
    * Emoji を表示するために Settings-User で以下を追加
        * `"font_options": ["directwrite"],`
        * この設定をしたから、全ての Emoji を正しく表示できるわけではない

### :scroll: 仕様
Hello, Active Emoji! をカウンタ付きで 10 回標準出力します
### <i class="fa fa-code" style="font-size:1em;"></i> サンプルコード

![hello_active_emoji.png](https://qiita-image-store.s3.amazonaws.com/0/43480/4355a057-c9ae-be47-ae22-88c17709c2b6.png)

### <i class="fa fa-code" style="font-size:1em;"></i> サンプルコード （ Emoji なしのオリジナルコード ）

~~~ruby
10.times { |e|puts "Hello, Active Emoji! #{e}" }
~~~

### <i class="fa fa-file-o" style="font-size:1em;"></i> 出力

~~~
Hello, Active Emoji! 0
Hello, Active Emoji! 1
Hello, Active Emoji! 2
Hello, Active Emoji! 3
Hello, Active Emoji! 4
Hello, Active Emoji! 5
Hello, Active Emoji! 6
Hello, Active Emoji! 7
Hello, Active Emoji! 8
Hello, Active Emoji! 9
~~~

## :books: 外部資料
* <i class="fa fa-external-link" style="font-size:1em;"></i><i class="fa fa-github-alt" style="font-size:1em;"></i> [ActiveEmoji GitHub](https://github.com/sferik/active_emoji)
* <i class="fa fa-external-link" style="font-size:1em;"></i>:gem: [ActiveEmoji RubyGems](https://rubygems.org/gems/active_emoji)

## :books: 脚注
[^1]: <i class="fa fa-external-link-square" style="font-size:1em;"></i> [Ruby | did_you_mean gem でスペルミスを検出＋ did_you_mean gem のコードリーディング](http://qiita.com/tbpgr/items/835b3ac168304cba9b7b)
Redis Desktop ManagerでRedisToGo(Heroku Add-on)へ接続する

GitHubに公開されていた、とあるプロジェクトをHerokuで動かすために、Add-onでRedisToGoを使うことになったのですが、ちょっとデータベースの中身を確認したくなったのでRedis用のGUIツールを探したところ、Redis Desktop managerというアプリを見つけました。

[Redis Desktop Manager - Redis GUI management tool for Windows, Mac OS X, Ubuntu and Debian.](http://redisdesktop.com/)

その際、Redis Desktop ManagerからRedisToGoのデータベースへ接続する際の設定方法に迷ったので、メモしておきたいと思います。

RedisToGoへのアクセス情報
-------------------------

RedisToGoへのアクセス情報は、 **REDISTOGO_URL** という環境変数にあります。

プロジェクトフォルダにて以下のコマンドを叩くか、Heroku DashboardのConfig Variablesから確認します。

```
$ heroku config:get REDISTOGO_URL
```

すると、以下の様な形式の文字列が取得できます。

```
redis://<username>:<password>@<hostname>:<port>
```

Redis Desktop Managerへの設定
-----------------------------

Redis Desktop Managerを起動し、画面左下の **Add New Connection** をクリックすると、接続設定画面が現れます。

![rdm2redistogo01.png](https://qiita-image-store.s3.amazonaws.com/0/12951/a0c37eee-bc48-456b-dcfb-c8a8fba03e57.png "rdm2redistogo01.png")


そこに、上記で取得した文字列から以下のように設定。

| 項目 | 設定内容                       |
|------|--------------------------------|
| Name | DBを識別するための名前（自由） |
| Host | hostname                       |
| Port | port部の数値を入力             |
| Auth | password部の文字列を入力       |

入力後、OKボタンを押せば接続できました。

![rdm2redistogo02.png](https://qiita-image-store.s3.amazonaws.com/0/12951/1611e567-19a2-abf0-6aeb-4fa77317db08.png "rdm2redistogo02.png")


何を迷ったのか…
--------------

はじめ、**Auth** に設定する値は、当然ユーザー名とパスワードの組み合わせだろうと早合点して、 `<username>:<password>`  を設定していて、うまくいかないなーと悩んでました。

まあ、ドキュメントをちゃんと読んだら記載されている情報ではあったのですが。

[Quick Start · uglide/RedisDesktopManager Wiki](https://github.com/uglide/RedisDesktopManager/wiki/Quick-Start)

でもユーザー名がなくても繋がるというのは、Redisを使ったことがないのでわからないのですが、デフォルトの `<username>` のような設定があるんでしょうかね。
gulp-sass を使うと Error: Module did not self-register. と出力される


それは Node.js のバージョンのせいかもしれない。

このエラー。

```
$ gulp sass
...
Module._extensions[extension](this, filename);
                                   ^
Error: Module did not self-register.
  at Error (native)
  ...
```

## 解決する方法

:warning: 2015年1月23日時点での解決法です。

それは Node.js のバージョンのせいかもしれない。

``v0.11.*`` に ruby-sass は :warning: 2015年1月23日時点で対応していないので、``v0.10`` を使うようにしよう。

```
$ nodebrew install v0.10
$ nodebrew use v0.10
```

## というか

~~``v0.11.14`` が unstable だっていうことを知らずに使っていた。``v0.11.14-rc`` とか付けて、正式版じゃないってことを CLI でもわかりやすく表明してほしい。~~

【追記】
コメントにて情報提供していただきましたが、node は偶数 バージョンが stable、奇数バージョンが unstable となっています。

> What is the versioning scheme?
>
>Odd versions are unstable, even versions are stable. v0.2 and v0.4 are even/stable. v0.3 and v0.5 are odd/unstable. The current stable series is v0.10.x. The next stable series will be v0.12.x. The stable branch takes bug fixes only - it does not change the JavaScript API, add-on API, nor ABI (you don't have to rebuild modules after upgrading node with-in a stable branch).
>
>[FAQ · joyent/node Wiki](https://github.com/joyent/node/wiki/FAQ)

@yudppp さん、ありがとうございます！

## ソース

[Module did not self-register · Issue #152 · dlmanning/gulp-sass](https://github.com/dlmanning/gulp-sass/issues/152)
fabricでenv.hostsを動的に設定する

fabfile.py内で以下のような関数オブジェクトを作る

``` python:fabfile.py
env.hosts = ['127.0.0.1']

def local():
    env.hosts = ['127.0.0.1']

def all():
    env.hosts = ['aaa.example.com','bbb.example.com',...]

def deploy():
    # 処理

```

呼び出し時

``` bash:呼び出し
% # ローカルホストのみ
% fab local deploy
%
% # 複数ホスト
% fab all deploy
```
RailsでAPIを作るときのテスト

素のRailsでAPI呼び出し時のリクエストでJSONをポストして、レスポンスにJSONをもらう場合のテスト。

APIをコールする側がnameを送って、APIがuser_idを返すのを例にとる。

テストコード

```rb
require 'json'
class UsersControllerTest < ActionController::TestCase
  test "create user" do
    json = {name: "name"}.to_json
    post :create, json
    assert_response :created

    response_json = JSON.parse(@response.body)
    assert_equal "new user", response_json["user_id"]
  end
end
```
レスポンスは@response.bodyで取得できる。


コントローラ

```rb
require 'json'
class UsersController < ApplicationController
  def create
    json_request = JSON.parse(request.body.read)
    name = json_request["name"]

    response_json = {user_id: "new user"}.to_json
    render json: response_json, status: :created
  end
end
```
送られてきたjsonはrequest.body.readで取得できる。
[Groovy]正規表現メモ


#概要
Groovyでは、他のプログラミング言語同様に正規表現を扱うことが出来ます。
また、Javaの正規表現を強力に使いやすい構文に仕上がっています。
Groovyの正規表現には以下の3つの重要なキーワードがあります。

`/.../` スラッシュの間に正規表現を格納できます。改行が単純に`\n`と言った感じで書けます。
`=~`　文字列から一致する部分を抜き出します。また`()`でグループ化されている部分もちゃんと扱えます。
`==~` 文字列が指定した正規表現と一致しているかどうかをチェックします。

## 基本

```groovy
Closure reg = {String target, String pattern ->
    // =~ を実行した結果、java.util.regex.Matcherのインスタンスが返される。
    (target =~ pattern).each {
        if( it instanceof List) { // つまりグループがある
            println "Word: ${it.head()}"
            println "Groups:"
            it.tail().eachWithIndex {String group ,Integer i ->
                println "    ${i}: ${group}"
            }
        } else {
            println it
        }
    }
    println "*" * 30
}

// 文字列から、正規表現で該当する箇所を抜き出す方法
reg("groovyisgod", /o(.)(.)/)
reg("oh!grailsisgod", /.rails/)

// 本題とは関係ないけど、同じ文字が並んでいる箇所を抽出するサンプル
// もし同じ文字が3つ並んでいる箇所を抜き出したい場合は/(.)\1\1/となる。
reg("0c04bf9ec1e7abcc6ba8f53354f22dfc19a2bf90", /(.)\1/)

// 文字列が、指定した正規表現と一致するかどうかチェックする方法
// 文字列の存在チェックのために　==~ を使う場合、
// 全体に一致するかどうかが問われるので、最初のパターンはfalseになる。
assert false == ("abc" ==~ /b/)
assert true == ("abc" ==~ /.*b.*/)
```

上記のコードを実行すると、以下のようになります。

```
Word: oov
Groups:
    0: o
    1: v
******************************
grails
******************************
Word: cc
Groups:
    0: c
Word: 33
Groups:
    0: 3
Word: 22
Groups:
    0: 2
******************************
```


## 応用
よく使うのにいつも書き方を忘れるので、備忘録としてメモ。
自分がよく使うパターンの**テキストファイルを読み込んで、各行の値をゴニョゴニョする**、というのを想定しています。

各行に記載されている数字を全て抜き出して、単純に合計するサンプルです。

```groovy
def texts = [
"This apple is 300 yen",
"This Orange IS 150 yen",
"Is this book 2000 yen? or 1980 yen?",
"I am koji. yen wo tukau yo",
"This apple is 3 euro.",
]

// 数字を含む行だけを抽出する
def withNumbers = texts.findAll { String line ->
    (line ==~ /.*[0-9].*/)
}

assert withNumbers.size() == 4
assert withNumbers[0] == 'This apple is 300 yen'
assert withNumbers[1] == 'This Orange IS 150 yen'
assert withNumbers[2] == 'Is this book 2000 yen? or 1980 yen?'
assert withNumbers[3] == 'This apple is 3 euro.'

//抜き出した行の中の文字列から、数字の部分だけを抽出する
assert 4433 == withNumbers.collect{ String line ->
    (line =~ /[0-9]+/).collect {String match ->
        // 1行に2個以上この正規表現（数字）に該当するものがあれば、その分ここが繰り返される
        match
    }
// 入れ子のリストになっているのでflattenで普通のリストに変換
}.flatten().collect{
    // 計算用にIntegerに変換
    it as Integer
}.inject{x,y-> 
    //足し合わせる
    x + y
}

//　もし、文字列のフォーマットが例えば以下のようにしっかりカンマ区切りで数字が並んていて、3番目の数字だけ抽出してみる。
assert ["30"] == ("10,20,30,40.50" =~ /([0-9]+),([0-9]+),([0-9]+),(.*)/).collect {all, first, second, hit, gomig -> hit}
assert "30" == ("10,20,30,40.50" =~ /([0-9]+),([0-9]+),([0-9]+),(.*)/)[0][3]

//ちなみに、"This"を含む行だけ抽出したい場合、以下のようにすると当然"this"が抽出されない。
assert 3 == texts.findAll{(it ==~ /.*This.*/)}.size()

//埋め込みフラグを使えばOK
assert 4 == texts.findAll{(it ==~/(?i).*This.*/)}.size()
```
giter8でScalaプロジェクトの作成

Scalaプロジェクトを作成しようとしたら気づいてしまった。
実は、Scalaプロジェクトってどうやって作るんだっけ？と。

Playだったら`activator new`で終了。
でも、Playじゃなくて普通のプロジェクトを作りたいんだ！

しかも、別にJava書かないけど、こういうのが良い！

```
$ tree                                                                    .
├── main
│   ├── java
│   └── scala
└── test
    ├── java
    └── scala
```

多分sbtにあるんだなと思ってい調べていたら、 __giter8__ というのを見つけた。
割と古い投稿ばかりだから最近どうなんだろう？と思ってたけど
今回求めていたモノにばっちりはまったから、使い方メモっておく。

# インストール

Mac OS Xでしかやっていない。
なお、scalaとsbtはインストールしてある前提。

```
$ brew install giter8
```

# プロジェクト作成

```
$ g8 typesafehub/scala-sbt

・・・なんか色々出てくる・・・

Scala Project Using sbt

name [Scala Project]:
organization [org.example]:
version [0.1-SNAPSHOT]:
scala_version [2.10.2]: 2.11.2

Template applied in ./gatling_test
```

`name`がプロジェクト名、`organization`がパッケージ名になるみたい。

なお引数はテンプレートを指定し、以下が指定できるみたい。

[giter8 templates](https://github.com/n8han/giter8/wiki/giter8-templates)

自分でテンプレート作ることも可能のようだ。

# plugins.sbtの設定

```
$ cd [name]
$ vim project/plugins.sbt
```

以下を書く。EclipseとInteliJ書いておいた。

```
addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "2.5.0")

addSbtPlugin("com.github.mpeltonen" % "sbt-idea" % "1.6.0")
```

これで後は良しなに。
smartyからssi呼び出し。テンプレと出力が異文字コード。

呼び出し元

```lan:test.tpl
{ssi file="../design/ssi/head.html" ssi_enc="SJIS"}
```

smarty function

```lang:function.ssi.php
<?php

/**
 * ssi
 */
function smarty_function_ssi($params, &$smarty)
{

    if (empty($params['file'])) return '';
    if (empty($params['ssi_enc'])) return '';
    if (!file_exists($params['file'])) return '<!-- no file -->';

    $ssi = file_get_contents($params['file']);
    if (false === $ssi) return '';

    /*
    echo "<!--", PHP_EOL;
    echo "******************************", PHP_EOL;
    echo $ssi, PHP_EOL;
    echo "******************************", PHP_EOL;
    echo "-->", PHP_EOL;
    */

    $ret = mb_convert_encoding($ssi, mb_internal_encoding(), $params['ssi_enc']);

    /*
    echo "<!--", PHP_EOL;
    echo "******************************", PHP_EOL;
    echo $ret, PHP_EOL;
    echo "******************************", PHP_EOL;
    echo "-->", PHP_EOL;
    */

    return $ret;
}
```
インタフェースと抽象クラスどっち使ったらいいんだ？


どういうケースでどちらを使うかとか知りたかった。
まず結論からいうと多様な議論があるようだった。
だからこれを読んだかたは鵜呑みにせずにいっしょに考えてもらいたい。

##インタフェースと抽象クラス
###結論、インタフェースって？
クラスの型(仕様)を定義するもの。
`カプセル化`と`多態性`を要求する意味あいが強い。
###結論、抽象クラスって？
継承関係をもつ実装の再利用をできる。
`継承`と`多態性`を要求する意味あいが強い。

####インタフェースとは
- インタフェースのメンバ変数は必ず定数。自動で`final public static`となる。
- 抽象メソッドのみ記述可能。自動で`public abstract`となる。
- 実装クラスは、全ての抽象メソッドを実装する必要ある
- 多重継承できる。ミックスインというらしい。
- 多重継承できるけど、メンバ変数は一意でなければならん
- メソッドの場合は実装をもたないのでﾀﾞﾌﾞってても競合せず問題なし
- 実装クラスはアップキャストしてインタフェース型変数に代入可能

####抽象クラスとは
- 抽象メソッドは必ず子クラスで実装されねばならない
- 実装を持つメソッドも記述できる
- クラスなので単一継承のみ。多重継承は不可
- 共通機能を実装し、個別機能は抽象定義しておく
- 抽象クラス使わないで継承するとアップキャストしたときにメソッドが使えなくなるとか起こりうる


###結局どっちを使えばいいのか？
**クラス仕様としての型定義したいならインタフェース。**
**継承関係にあって処理の再利用したいなら抽象クラス。**

ってかんじか。

抽象クラスと派生クラスは「継承」の関係は`IS A関係`と呼ばれている対して、 
インターフェイスと実装クラスの「実装」の関係は`CAN DO関係`と呼ばれているそうです。

(たぶん)たとえば、

```
public abstract class Animal {}
public class Rabbit extends Animal {}
```

はよい。Rabbit is an Animalであるから。=な関係。

```
public interface Jumpable {}
public class Rabbit implements Jumpable {}
```

はよい。Rabbit can jumpであるから。≠の関係。

超個人的感覚的な説明になるが、

実装クラスからみて、
**抽象クラスは垂直に上な関係。**
**インタフェースは斜め上な関係、**

はて。

##参考URL
- http://msugai.fc2web.com/java/interface.html
- http://msugai.fc2web.com/java/absTest.html
- http://promamo.com/?p=481
- http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php
- http://www.programmerinterview.com/index.php/java-questions/interface-vs-abstract-class/topic=40953&forum=7&start=16
- http://www.nulab.co.jp/designPatterns/designPatterns1/designPatterns1-4.html
PlayFramework で フォームから配列（値およびオブジェクト）を POST する

PlayFramework で、フォームから配列を POST する方法です。

値の配列とオブジェクトの配列で書き方が若干異なります。
オブジェクトの配列を POST する方法を探すのが大変だったので共有します。

# String の配列を POST する

１つめは値の POST についてです。
ここでは名前(String)の配列を送信してみます。

## View

配列を送信するには、`name` 属性の値に `[]` を付けることで実現できます。

```html
<form>
  <input type="hidden" name="names[]" value="Alice" />
  <input type="hidden" name="names[]" value="Bob" />
</form>
```

## Controller

Form オブジェクトを作成する際に項目の型を `list` で囲むことで、 `List[A]` 型で受け取ることが可能です。

```scala
case class FormParam(names: List[String])

val form = Form(
  mapping(
    "names" -> list(text)
  )(Names.apply)(Names.unapply)
)

def api = Action { implicit request =>
  form.bindFromRequest.fold(
    errForm => BadRequest(...)
    param => {
      val names = param.names // List(Alice, Bob)
    }
  )
}
```


# オブジェクトの配列

つぎに、オブジェクトの配列を POST する方法です。
`{ name: String, sex: String }` のようなオブジェクトの配列を POST してみます。


## View

ポイントは、`name`属性の書き方です。
配列にインデックスを付ける必要があることと、オブジェクトのプロパティは`.hoge`と指定することです。

```html
<form>
  <input type="hidden" name="users[0].name" value="Alice" />
  <input type="hidden" name="users[0].sex" value="Female" />
  <input type="hidden" name="users[1].name" value="Bob" />
  <input type="hidden" name="users[1].sex" value="Male" />
</form>
```

## Controller

Controller 側では、オブジェクトのリストで受け取ることができます。

```scala
case class FormParam(users: List[UserParam])
case class UserParam(name: String, sex: String)

val form = Form(formParamMapping)

val formParamMapping = mapping(
  "users" -> userParamMapping
)(FormParam.apply)(FormParam.unapply)

val userParamMapping = mapping(
  "name" -> text,
  "sex" -> text
)(UserParam.apply)(UserParam.unapply)

def api = Action { implicit request =>
  form.bindFromRequest.fold(
    errForm => BadRequest(...)
    param => {
      val users = param.users // List(UserParam(Alice, Female), UserParam(Bob, Male))
    }
  }
}

```


# まとめ

Controller 側というより View 側が重要ですね。

* 配列を送信する際は `input` タグの `name` 属性を `hoge[]` のように配列で指定する
* オブジェクトの配列を送信する際は `input` タグの `name` 属性を `hoge[0].fuga` のように配列のインデックスとプロパティ名を指定する
VC++が勝手にキーワードnear, farをマクロ定義している？ ソースをいじらずに回避する離れ業

古い話とひどい話
--
MS-DOSやWin16のプログラミングをしたことがある方ならnearポインタ、farポインタという言葉を聞いたことがあることと思います。
8086互換の16ビットアドレッシングがnearポインタ、80286以降で使えるようになった32ビット（というよりは16+16ビット）アドレッシングがfarポインタで、DOSとかWin16のC/C++開発環境ではこれらを使い分けるためにnear, farというキーワードが定義されていました。

そして信じがたいことに、これらのキーワードは最新のVisual C++にも定義されています。

```cpp:minwindef.h
#define near
#define far
```

すると何が起こるかといいますと、コンパイラ汎用C/C++で作られていたはずのOSSが変数名とかでnear, farを使っているとそこでコンパイルエラーです。まったく、ひどい話と言うほかない。
（そして、コメント欄でも言及されているmin, maxマクロと違って、コンパイルオプションで無効化する方法さえ用意されていません）

まあ、ソースをいじって near, far あたりのトークンを別の単語に書き換えてやれば通るのですが、サブモジュールリポジトリを汚したくもない。さていかがするか。

離れ業
--
windows.h を乗っ取ります。乗っ取るってどういうことか。

1． `#include <windows.h>` をニセwindows.hへ誘導する
2. ニセwindows.hでは本物のwindows.hをインクルードして直後にnear,farを殺す

ポイントは、どうやって ニセwindows.hの中で本物のwindows.hを呼ぶかです。だって、 `#include <windows.h>` なんて記述したら自分自身を呼んでしまって無限再帰参照でコンパイルエラーですからね。確実に本物を呼ぶ方法が必要なのです。
どうするか。Windows SDKの本物が …\include\um\ というディレクトリに置いてあるのを利用しましょう。`#include <../um/windows.h>` と記述して参照します。これは表技感あふれます。

まとめますと、インクルード検索対象ディレクトリにこんな windows.h を置くことになります。

```cpp:windows.h
#pragma once
#include <../um/windows.h>
#undef near
#undef far
```
Linuxサーバ上で特定日付より前に作成されたファイルを一括で削除する

　Linuxのサーバ上で特定の日付より前に作成されたファイルを一括で削除したり移動したりしたい時がある。え、ない？ いやいや、まれにあるんだなこれが。

　例えば、自動起動スクリプトにMTAを登録していなくて、かつてサーバを再起動した時点から自動発報メールが未送信のままspoolに溜まっていた場合など、MTA再起動したらqueueに溜まったメールが怒涛のように送信されてウギャーっとなる前に「もうこの日より前のメールはいらないや…」と選別できた時とかである（ものすごく具体的な例なのは実体験だから…(笑)）。

```bash:
$ cd /var/spool/clientmqueue
$ ls -la
-rw-rw---- 1 apache smmsp     984 12月 24 11:12 qfsBO2CNSF013462
-rw-rw---- 1 apache smmsp     984 12月 25 11:04 qfsBP24NJi007741
-rw-rw---- 1 apache smmsp     984 12月 26 11:07 qfsBQ27TE6002185
-rw-rw---- 1 apache smmsp     984 12月 27 12:09 qfsBR39wPr029964
-rw-rw---- 1 apache smmsp     984 12月 28 11:51 qfsBS2pRxg023695
-rw-rw---- 1 apache smmsp     984 12月 29 11:26 qfsBT2QOTX017228
-rw-rw---- 1 apache smmsp     984 12月 30 11:08 qfsBU28X9Q010897
-rw-rw---- 1 apache smmsp     984 12月 31 11:26 qfsBV2Qu7n005217
-rw-rw---- 1 apache smmsp     982  1月  1 12:30 qft013UbkP032693
-rw-rw---- 1 apache smmsp     982  1月  2 11:31 qft022VEKx025596
-rw-rw---- 1 apache smmsp     982  1月  3 11:33 qft032X1RJ019618
-rw-rw---- 1 apache smmsp     982  1月  4 11:21 qft042LROG013417
-rw-rw---- 1 apache smmsp     982  1月  5 11:04 qft0524bSc007230
-rw-rw---- 1 apache smmsp     982  1月  6 11:06 qft0626N90001781
-rw-rw---- 1 apache smmsp     982  1月  7 11:07 qft0727hF3028772
-rw-rw---- 1 apache smmsp     982  1月  8 11:04 qft0824NQZ023074
```

　↑こんな感じにメールキューに未送信メールが一杯あるんだけど、もう1月1日より前のファイルはいらないや！──とかいう時がまれにある。

　そんな時、ファイルのタイムスタンプを判断して、そのファイルのタイムスタンプより以前（そのファイルも含まれるので注意！）のファイルを一括で削除できると楽なんだが、そんな便利なオプションが`rm`にはない。なので、`find`とチェーンしてやってみた。

```bash:
$ find \! -newer qfsBV2Qu7n005217|sort|less|xargs ls -la
```

　`find`の`-newer`オプションの引数はタイムスタンプを判定したいファイル名である。まず `ls` で試してみると、見事に12月31日のファイル「`qfsBV2Qu7n005217`」を含む **それ以前** のファイルの一覧が表示された。もし **それ以降** のファイルを対象にしたければ、`\!` の否定オプションを付けなければいい。
では、早速削除してみる。

```bash:
$ find \! -newer qfsBV2Qu7n005217|sort|less|xargs rm
$ ls -la
-rw-rw---- 1 apache smmsp     982  1月  1 12:30 qft013UbkP032693
-rw-rw---- 1 apache smmsp     982  1月  2 11:31 qft022VEKx025596
-rw-rw---- 1 apache smmsp     982  1月  3 11:33 qft032X1RJ019618
-rw-rw---- 1 apache smmsp     982  1月  4 11:21 qft042LROG013417
-rw-rw---- 1 apache smmsp     982  1月  5 11:04 qft0524bSc007230
-rw-rw---- 1 apache smmsp     982  1月  6 11:06 qft0626N90001781
-rw-rw---- 1 apache smmsp     982  1月  7 11:07 qft0727hF3028772
-rw-rw---- 1 apache smmsp     982  1月  8 11:04 qft0824NQZ023074
```

　バッチリ、12月31日以前のファイルがすべて消えました。あとはMTAを起動してqueueに残ってるメールをすべて送信させれば、spoolもきれいさっぱりになる次第。

まぁ、サーバ再起動したらミドルウェアの起動状況をちゃんと確認しておけよ──ということですな、はいその通りです(汗)
画像でサイトのパフォーマンスを向上させる

現在の案件でWebサイトの高速化が課題となっています。

> Page load time also has a significant impact on mobile users’ experience.My team at Etsy found an increased bounce rate of 12% on mobile devices when we added 160KB of images to a page. 

（http://radar.oreilly.com/2014/01/web-performance-is-user-experience.html より抜粋）
モバイルにおいて、160KBの画像を追加したことで直帰率が12%も上がってしまったEtsyの例があります。

案件でもパフォーマンス向上対策のひとつとして画像のsprite化とbase64化をやっているので、覚書としてこちらにまとめます。

# 画像のsprite化
複数の画像を一枚の画像にまとめたもののことをsprite画像といいます。
それをcssでbackground-imageで画像の指定をして、background-positionでその画像の中のどの画像を使うか指定をします。

```
.header_menu {
background-image: url('sprite_01.png'); 
}

.header_menu.news {
background-position: 0 0;
}

.header_menu.about {
background-position: 0 -54px;
}
```

### sprite化の良いところ・悪いところ

画像を取得するサーバーへのリクエスト回数が減ることで表示速度の向上ができます。
sprite画像を作るのが面倒というデメリットは、gulp.spritesmithを使って自動で生成するようにすれば問題ありません。
ただ、sprite画像の読み込みが終わるまで表示されないので、読み込みが終わるまでそのエリアがボタンだと気づかない場合が多いので、ボタンなどの背景には向きません。
（メモ：gzipを使えば、spriteと変わらない。

**sprite化では、grunt-spritesmithによくお世話になっています。**
https://github.com/Ensighten/grunt-spritesmith

# 画像のbase64化
画像データをを64種類の英数字を使って表現する形式にすること。
画像をbase64にエンコードして、その文字列をCSSに入れることで、中に画像を埋め込むことができます。

```
.kitty-img {
    background-image: url('img/kitty.png);
}
```

　　　　　↓↓↓↓↓↓↓↓↓↓↓↓↓↓

```
.kitty-img {
    background-image: url('○○ここにbase64化した文字列○○');
}
```

### base64化の良いところ・悪いところ

→画像がCSS内にあるので、画像を取得するためのサーバーへのリクエスト回数が減り、負荷が減ります。
sprite画像とは違い、CSSの読み込みが終わると画像の読み込みも終わるので、
最初から画像が表示される必要のあるボタンなどの背景画像にはよいらしいです。
しかし、CSSが重くなり読み込みの時間が長くなるので、キャッシュが無い時の初期表示が遅くなってしまいます。

**いつもbase64化の際、こちらでお世話になっています。**
http://blog.thingslabo.com/archives/000058.html

# 画像を劣化せずに圧縮できるサービス

https://tinypng.com/
.jpgと.pngをドロップするだけで簡単に圧縮してくれます。
よくお世話になっています。

http://mozjpeg.codelove.de/
（jpgだけですが）

# 実案件にて使用例

・大規模サイト
・多言語でサイト展開
・ベースを本社でつくり、サイト運用は現地のスタッフに任せている

今の案件では、画像は圧縮（gulp-imagemin※）しており、
アイコン画像はそれからさらにbase64化しています。
※https://www.npmjs.com/package/gulp-imagemin

タイトルロゴ画像やボタン画像については、sprite化しています。
本来ならばボタン全てbase64化した方がいいのかもしれませんが、
spriteしたほうが日本語から翻訳する際にデザイナーさんも一気に作業できる点がよいのかもしれません。

とりあえずここまで。
add_foreign_key を利用したときのキー名は実行するたびに変わる

タイトルの通り、Rails 4.2 から使えるようになった外部キー設定用のメソッド`add_foreign_key`だが、これに`name`オプションをしてしなかった場合デフォルトで`fk_rails_xxxxx`のような名前になる。

が、これ、マイグレーションを実行するたびに違う名前になる。

コードを見てみたら`SecureRandom.hex`で採番されていた。参照元と参照先のテーブル名やカラム名をもとにしてるのかと思ったけど完全にランダムのようである。

https://github.com/rails/rails/blob/77fe87cccd90859e67c958cbf63d7e5662174fd8/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb#L984-L988

```rb
def foreign_key_name(table_name, options) # :nodoc:
  options.fetch(:name) do
    "fk_rails_#{SecureRandom.hex(5)}"
  end
end
```

これだと`down`側のマイグレーション書けないし、`rake db:migrate:reset`しただけでも`schema.rb`に差分が出てしまうので`name`オプションは指定しないとダメそうである。どうしてこんな感じになってるの…教えて偉い人！
c# でDbExecutor を使う

最近頻繁にストアドプロシジャーを使いデータを加工してデータを返している。
一時テーブルを使い必要なテーブルから項目を追加すると非常に見やすくしかも高速に実行できる。

そのためC#で簡単にデータを取り扱えないか調べたところ DbExecutor を見つけたのでサンプルコードを書いた。
参考にしたページは下記の通り。

* DbExecutor ver.2 - C#での生SQL書き補助ライブラリ
* [CodePlex](http://dbexecutor.codeplex.com/)

```csharp
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Threading.Tasks;
using SampleDbExecutor.Properties;
using Codeplex.Data;

namespace SampleDbExecutor
{
    class CRow
    {
        public string 患者番号;
        public string 年月日;
    }
    class Program
    {
        static void Main(string[] args)
        {
            string connStr = Settings.Default.XXXXConnectionString;
            var sp = DbExecutor.ExecuteReaderDynamic(
                        new SqlConnection(connStr),
                        "[dbo].[ProcCheckReha]",
                        new { from = "201411", to = "201501" },
                        CommandType.StoredProcedure)
                .Select(d => new CRow
                {
                    患者番号 = d.患者番号,
                    年月日 = d.年月日,
                });

            foreach (var row in sp)
            {
                Console.WriteLine("{0} {1}", row.患者番号, row.年月日);
            }
        }
    }
}

```
「using Codeplex.Data;」がわからずソースコードをダウンロードした。
私はとてもすっきり書けたと感じている。

ProcCheckReha は、外来リハビリテーション診療料のチェックするためのもので下記の処理を行っている。

1. 外来診療料、再診料、外来リハビリテーション診察料、リハビリテーション料を算定しているデータを抽出
2. 1のデータからリハビリテーション料を算定している患者番号を抜き出す
3. 2で抜き出した患者のみを１から抽出
4. 3のデータから年月日に展開
5. 4のデータに診療科、入外区分、算定点数を追加してデータを返す
nf_conntrack_max が反映できない場合の対処法

`nf_conntrack_max` を変更しようとしたときにうまく変更できない場合にどうぞ。

## 状況

- `/etc/modprobe.d/nf_conntrack.conf` (以下、設定ファイル)(`nf_conntrack.conf`のファイル名は任意)に設定した `options nf_conntrack hashsize=[設定値]` が、iptables 再起動時に反映できない。
- このとき、 iptables のほかに ip6tables を実行している。

## 原因

### 説明

-  iptables と ip6tables の両方を実行中の時にどちらかを再起動しても、設定ファイルの値が反映できない。
  - iptables と ip6tables がどちらかが実行されるとき、nf_conntrack モジュール(以下、モジュール)がロードされる。
  - 設定ファイルはモジュールのロード時に読み込まれる。
  - iptables, ip6tables 停止時、モジュールはアンロードされる。
  - しかし、iptables, ip6tables どちらかが引き続き実行中の時は、モジュールはアンロードされない。iptables, ip6tables どちらもが nf_conntrack モジュールに依存しているためである。

### 再現

#### モジュール ロード状況の確認

```text
[root@hb-agent-test ~]# lsmod | grep conntrack
nf_conntrack_ipv4       9506  2 
nf_defrag_ipv4          1483  1 nf_conntrack_ipv4
nf_conntrack_ipv6       8337  2 
nf_defrag_ipv6         27236  1 nf_conntrack_ipv6
nf_conntrack           80390  3 nf_conntrack_ipv4,nf_conntrack_ipv6,xt_state
ipv6                  334932  31 nf_conntrack_ipv6,nf_defrag_ipv6,ip6t_REJECT
[root@test ~]# service iptables stop
iptables: チェインをポリシー ACCEPT へ設定中filter         [  OK  ]
iptables: ファイアウォールルールを消去中:                  [  OK  ]
iptables: モジュールを取り外し中:                          [  OK  ]
[root@test ~]# lsmod | grep conntrack
nf_conntrack_ipv6       8337  2 
nf_defrag_ipv6         27236  1 nf_conntrack_ipv6
nf_conntrack           80390  2 nf_conntrack_ipv6,xt_state
ipv6                  334932  31 nf_conntrack_ipv6,nf_defrag_ipv6,ip6t_REJECT
[root@test ~]# service ip6tables stop
ip6tables: チェインをポリシー ACCEPT に設定中: filter      [  OK  ]
ip6tables: ファイアウォールルールを消去中:                 [  OK  ]
ip6tables: モジュールを取り外し中:                         [  OK  ]
[root@test ~]# lsmod | grep conntrack
[root@test ~]#
```

## 対策

### `/etc/sysctl.conf` に **も** 同じ設定を記述して読み込む

設定ファイルにも記述を行いつつ、`/etc/sysctl.conf`にも記述。これだと即反映可能。設定値を8倍する[^nf]のをお忘れなく。

```
# echo "net.nf_conntrack_max = [設定値 * 8]" >> /etc/sysctl.conf
# sysctl -p
```

### 全て停止して全て起動し直す

iptables, ip6tables を全て停止の上で再起動する。これだと、`/etc/sysctl.conf`には手を入れずとも値の反映が可能。

```
# service ip6tables stop
# service iptables restart
# service ip6tables start
```

### ip6tables を動かさない

IPv6 を使っていないのならあり。

### マシンを再起動する

テスト機や開発機など、マシン再起動が許される環境・状況の場合はどうぞ。


## 備考

- `nf_conntrack_max` の上限値変更は、`/etc/sysctl.conf`よりも`/etc/modprobe.d/nf_conntrack.conf`に記載することが望ましい[^dmm]。
- RHEL/CentOS 5系だと、`nf_conntrack`は`ip_conntrack`と変数名が違う[^ea]ので注意。

## 参考資料

[^nf]: [netfilter/iptables FAQ: Problems at runtime: ip_conntrack: maximum limit of XXX entries exceeded](http://www.netfilter.org/documentation/FAQ/netfilter-faq-3.html#ss3.7)

[^dmm]: [netfilterモジュール | ツチノコブログ](http://tsuchinoko.dmmlabs.com/?p=1016)
[^ea]: [あなたの大量配信サーバ、ip_conntrack溢れていませんか？ | ブログ | 株式会社イー・エージェンシー](http://www.e-agency.co.jp/column/20121225.html)
CentOSでSSL取得のためのCSR(証明書申込みデータ)の作成

# キーとCSRの作成

## ランダムデータとキーの作成

```
$ openssl sha1 /usr/bin/* > rand.dat
$ openssl genrsa -rand rand.dat -des3 2048 > key.pem.2015
67002 semi-random bytes loaded
Generating RSA private key, 2048 bit long modulus
...................+++
........+++
e is 65537 (0x10001)
Enter pass phrase:
Verifying - Enter pass phrase:
```

キーのパスフレーズを入れる

## CSRの作成

```
# openssl req -new -key key.pem.2015 -out csr.pem.2015
Enter pass phrase for key.pem.2015: ←先ほど入れたパスフレーズ
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Tokyo
Locality Name (eg, city) [Default City]:Shibuya-ku
Organization Name (eg, company) [Default Company Ltd]:XXX ltd
Organizational Unit Name (eg, section) []:Development Department
Common Name (eg, your name or your server's hostname) []:www.test.com ←きちんと入れる
Email Address []:admin@test.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:XXXXXXXX
An optional company name []:
```


## キーとCSRを控えて証明書を取得



```
$ cat key.pem.2015
$ cat csr.pem.2015
```

SSL証明書の販売事業者から購入。

## キーのパスフレーズをはずす

Apacheなどに証明書を設定した際、起動時にSSLのパスフレーズを聞かれてしまうので、SSLのパスフレーズを削除したものを設定。

```
$ openssl rsa -in ./key.pem.2015 -out ./no-pass-key.pem.2015
Enter pass phrase for ./key.pem.2015:
writing RSA key
```

あとはこれをサーバに設定。

中間証明書なども事業者から取得。
Macで使えるテキストエディタアプリに隠された機能

> 150123タイトル変更（元: GitHub for Mac.appに隠された機能）・追記
@uasiさんがコメント欄で指摘くださったように、この機能はGitHub for Mac.app固有のものではなく、Macで使えるテキストエディタ系のアプリの一部で有効なものです。

ありのまま今起こったことを話す。俺はGitHub for Mac.appを使ってコミットコメントを書こうとしていたんだ。ふと、`escキー`を押してみると、なにやら入力文字の候補が出るじゃないか。とりあえず候補を選んでみる。もしかして、と思い、スペースをはさんで再び`escキー`を押す...。そんな繰り返しで文字を選んでいくとこんなことになった。

> I love you so much fun and I was just a little bit of a new one is the best thing ever is when you have to be a good day

はじめに選ぶ単語を変えると後続の候補も変わってくる。

> My mom is so cute

どうせなら、よくあるコミット頻出単語（[これとか](http://qiita.com/gogotanaka/items/b65e1b081fa976e5d754)）を出してくれるとありがたい。

有名な話なのかもしれないし、割りとどうでも良い記事でした。
有用な機能があれば教えていただきたい。
Basic math for drawing a circle

**Radians**
Basic:
- Radian is an unit for angles.
- 1 radian is the angle when the arc length is same as the radius
- Circumference is same as radians of 360 degrees = 2π
![radians.jpg](https://qiita-image-store.s3.amazonaws.com/0/64523/ff0c8d14-928e-5505-e633-740222879ee9.jpeg)


```
180 degrees = 3.141592653589793 radians = PI
360 degrees = 6.283185307179586 radians = TWO_PI

1.0 radian = 180 / PI 
           = 57.29577951308232 degrees
```

**Conversions between degrees and radians**

```
DegToRad(degrees){
    radians = degrees * PI / 180
}

RadToDeg(radians){
    degrees = radians * 180 / PI
}
```

---  

**Trigonometry**
![](http://upload.wikimedia.org/wikipedia/commons/9/9d/Circle-trig6.svg)


In some programming languages, sin() or cos() function  uses  radians, not degrees for its argument.

```
sin(radians)
cos(radians)
```

Here are the values of sin or cos when 0, 90, 180, 270, 360 degrees.

```
//---use "signed long" type to get accurate values to avoid to be rounded

0° = 0 * PI/180 radians
sin(0) = 0
cos(0) = 1

90° = 90 * PI/180 radians
sin(PI / 2) = 1
cos(PI / 2) = 0

180° = 180 * PI/180 radians
sin(PI) = 0
cos(PI) = -1

270° = 270 * PI/180 radians
sin(PI * 3/2) = -1
cos(PI * 3/2) = 0

360° =  360 * PI/180 radians
sin(TWO_PI) = 0
cos(TWO_PI) = 1

```

---

**Calculate a coordinate on a circle from an angle**

![sincos.jpg](https://qiita-image-store.s3.amazonaws.com/0/64523/fbe63a5a-ea76-f5f9-8863-abf099e2a847.jpeg)


```
x = cos(radians) * r
y = sin(radians) * r

or

x = cos(degrees * PI / 180) * r
y = sin(degrees * PI / 180) * r
```

---

**Calculate a coordinate on a circle from a percentage**
TWO_PI = 360° = 100%. You can calculate radians from a percentage.

![percent_360.jpg](https://qiita-image-store.s3.amazonaws.com/0/64523/d185c308-d652-85b4-9fe1-f5983d0d27fd.jpeg)


```
percentage = degrees / 360
x = cos(percentage * TWO_PI) * r
y = sin(percentage * TWO_PI) * r
```

The divisor is a number of vertices you want to set on a circle.
If the vertices is 10, the shape will be a decagon rather than a circle.
It's important when you want to get edges of the circle with for-loop etc.  

![percent_10.jpg](https://qiita-image-store.s3.amazonaws.com/0/64523/4b72f6bd-5dc6-f9f4-5d21-26df29a05904.jpeg)


```
percentage = i / 10
x = radius * cos(percentage * TWO_PI) * r
y = radius * sin(percentage * TWO_PI) * r

```

---

**atan2** returns an angle between two points in radians. 

![atan2.jpg](https://qiita-image-store.s3.amazonaws.com/0/64523/2b53fd94-ffc2-d06e-8f59-2c5ee9585ecc.jpeg)


```
atan2(y2-y1, x2-x1)
```
Smart Custom Originパターン拡張：ディレクトリアクセスに対する強制リダイレクトの例外条件を追加する



通常、ディレクトリアクセス(末尾スラッシュ無しのアクセス)の場合には、
末尾にスラッシュを付けてリダイレクトされるが、Defaultだとオリジン名がバレちゃうので、対策（Smart Custom Originパターン適用）が必要。
でも、全てのリクエストでこれをやると、ディレクトリアクセスが正常であるPathがあった場合、予期せぬリダイレクトがかかってしまうのでどうにかしたい！

という話です。



#1.Smart Custom Originパターンとは

Cloudfrontに対して、ディレクトリアクセスをした場合、
オリジン（ここではApache想定）では、`末尾にスラッシュをつけたURLでリダイレクトしろ！`という挙動をとります。
では、どこにリダイレクトすることになるのかというと、`自分自身(=オリジン)のDNS名`になってしまいます。

つまり、
**オリジンDNS名がばれてしまう**
のです。

この課題への対応策が[Smart Custom Originパターン](http://aws.clouddesignpattern.org/index.php/CDP:Smart_Custom_Origin%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3)です。CDPに認定されています。
mod_rewriteモジュールを使って、Cloudfront経由のアクセス、かつディレクトリアクセスだった場合は、CloudfrontのDNS名にリダイレクトさせるように、明示的な設定を入れてやることで対応しています。

#2.全部リダイレクトさせたくないケースもある

ただ、サイトによってはリダイレクトさせたくないpathも混在するはずです。
Tomcat側で処理させるような場合です。
※Tomcat処理させるようなURLは、末尾にスラッシュがないURL（ディレクトリアクセス）になる

つまり、Tomcat連携させるPathだった場合のみリダイレクトさせない、という追加考慮が必要になります。

#3.Smart Custom Originパターンを拡張する

拡張するといっても大それたことをするわけではありません。
mod_rewriteの`RewriteCond`に条件追加してあげるだけです。


例えば、`/tomcat-access`というPathへのアクセスだった場合だけリダイレクトさせないようにするには、
`/tomcat-access`以外の時はリダイレクトする、とすることで実現します。

以下のような設定になります。

```httpd.conf

RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} ^Amazon\ CloudFront$
RewriteCond %{REQUEST_URI} !/tomcat-access(.*)$          ←　ここを追加
RewriteRule ^/([^\.])+[^/]$ http://XXXXcloudfront.net%{REQUEST_URI}/ [R=301]

```

つまるところ、Apache(mod_rewriteモジュール)の基本的な設定の話、、、なのでした。。。
プログラミング言語の学習ステップ

新しいプログラミング言語を学ぼうと考えた時の学習ステップを書きます。数年前に書いたメモだし色々書いてしまっているので、実際に学習するときは適当にスキップ、順序変更、などを行うといいと思います。また、新しい言語を学習した時は、このメモを改定するかもしれません。

# 環境の基本

まずは以下をざっと調べます。

* 使用用途、特徴
* Webサイト
* エディション、利用ライセンス、価格
* 動作環境
* 入手、インストール方法
* 実行方法
* デバッグ方法
* 成果物の配布方法
* リファレンス
* “Hello, world!”のサンプル

# 言語の基本

ざっと調べて使いたいなと思い、”Hello, world!”まで辿り着いたら、以下をサンプルを書きながら学びます。

* 基本構文
* 型
* 変数
* 定数
* 式
* 演算子
* 制御構造
* 関数
* クラス、オブジェクト
* 名前空間
* 例外、エラー
* 他ファイル、スクリプト、ライブラリの参照

# 言語の応用

ある程度使えるようになったら、周辺仕様を調べます。

* テキスト処理
  * 文字列操作
  * 正規表現
* 日付の操作
* ファイルシステム操作
* 外部リソース(設定ファイル)
* データベース操作
* ネットワーク操作
  * HTTP通信
  * (メール操作)
* APIリファレンスの書き方
* 国際化
  * 多言語化
  * 数値、日時の表記法
  * 開発環境
* 総合開発環境
  * ソースコードの整形
  * コーディング規約の確認
  * 良くない実装の確認
  * リファクタリング
* テスト
  * ユニット・テストの方法
  * カバレッジの取得方法
  * ストレス・テストの方法
* スタンドアロン・アプリケーションの開発
  * GUI
* Webアプリケーションの開発
  * Webアプリ実行環境
  * Webフレームワーク
  * Web APIの開発
  * ファイル・アップロード
  * クライアント-Webサイト間通信
  * データのCRUDを行う管理画面の自動生成
  * Webアプリレイヤーのスケール
* ビルド・システム
* 主要なライブラリ、フレームワーク
* 推奨するファイル構成
* バッチ処理
* メモリ管理
* 処理系バージョンごとの違い
[Swift]ジェネリクス関数の型が誤爆してハマった


* Xcode 6.1.1
* Playground

## ハマった箇所

RGB値などを処理するコードを書いていたのですが、以下のような処理が実行時にエラーとなりました。

```swift:再現を目的とした意味の無いコード
// 適当
let a: UInt8 = 230 

// 計算＆UInt8の上限を超えないように抑える的な処理
let b: UInt8 = min(255, Int(a) + 50)
```

![スクリーンショット 2015-01-23 14.49.30.png](https://qiita-image-store.s3.amazonaws.com/0/31347/826ca25e-015c-c53d-06f4-344e58801dfa.png "スクリーンショット 2015-01-23 14.49.30.png")

`min`関数の第一引数はリテラルなので型は曖昧ですが、第二引数はInt型+リテラルなのでジェネリクス関数の`min<T>`はTの型を`Int`と判断する **だろう** と思って書いたコードです。

しかし実際には`min`関数は引数を`UInt8`型として受け取っているようで、第二引数が`230 + 50 = 280`で`255`を超えてしまっているため、オーバーフロー判定により実行時エラーとなっていると思われます。

* 実際には、ある関数の引数へ、min関数を使った結果を渡している所で発生しました。

## 検証

`_stdlib_getTypeName`という関数を使うと型の情報が得られるようですので、それを使ってどんな型として処理されているのかを見てみました。

まずは以下のように定数`b`の型を未指定にしてみます。

```Swift:
let a = UInt8(100)

func gen<T>(value: T) -> T {
    println(_stdlib_getTypeName(value)) // "_TtSi"
    return value
}

let b = gen(Int(a) + 50)
```

この時は`"_TtSi"`と出ますので、期待通り`Int`型として動いています。

しかし、`b`の型をいじると...

```Swift:
let a = UInt8(100)

func gen<T>(value: T) -> T {
    println(_stdlib_getTypeName(value)) // "_TtVSs5UInt8"
    return value
}

let b: UInt8 = gen(Int(a) + 50)
```

今度は`"_TtVSs5UInt8"`というように`UInt8`型として処理していることがわかります。

左辺（代入先）の型に、ジェネリクスの型が影響を受けるって事ですね。

とはいえ、少なくとも`Int(a)`だけは`Int`型のはずで、そこからどうやって`UInt8`型になってしまったのか、意味不明です。
勝手にコンバージョンしてるとしてもおかしな話です。

## 回避策

今回の件で言えばジェネリクス関数の戻り値をコンバージョンしてやれば期待通りになります。

```swift:
// 適当
let a: UInt8 = 230

// 計算＆UInt8の上限を超えないように抑える的な処理
let b: UInt8 = UInt8(min(255, Int(a) + 50)) // 255
```

実行時かつオーバーフローするケースでのみ発生するため、潜在的なバグになりえます。
お気をつけください。
win32のDialogBoxで詰まったところ

なんだかよくわからないんだけど、

NGパターン
DialogBox(hInstance, L"IDD_DIALOG1", NULL, (DLGPROC)nekomimi);

OKパターン
DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, (DLGPROC)nekomimi);

上記でもOKの場合が多いんだけど、したじゃないと動かないパターンに出くわした

原因は不明
Gitリポジトリから差分ファイルだけ取得するスクリプト

「差分ソースだけください」という話がよくあります。
Gitでソース管理しているなら簡単なスクリプトで差分ファイルを抽出できます。

```bash:copy-diff
#!/bin/sh

if [ -z $1 ] || [ -z $2 ]; then
cat <<EOF
Usage: $(basename $0) <tag> <dirname>
EOF
  exit 1
fi

list=$(git diff --name-only --relative $1)

if [ $? -ne 0 ]; then
  exit 1
fi

mkdir -p $2
for i in $list; do
  cp -v --parents $i $2
done
```

第１引数に差分を比較する元のコミットＩＤ（またはタグ）を指定して、第２引数にコピー先のディレクトリを指定します。
これを `copy-diff` などと適当な名前で保存して、 `sh copy-diff 5aed859ee hogehoge-diff` とやると、 指定したコミットとワーキングディレクトリの差分を `hogehoge-diff` というディレクトリに出力されます。