OmniAICreator/Qiita-1.07M huggingface dataset:
PHPのsetcookieは値をパーセントエンコードする

`header()`関数を使ってわざわざ`Set-Cookie`ヘッダーを書き出すのでなく、それを一発でやってくれる`setcookie()`という便利な関数がありますが、これの挙動にはまってしまいました。

ある値をBase64エンコードした値を、cookieに吐き出したいと思っていました。

```php:setcookie.php
<?php

$value = 'some value';
$encoded = base64_encode($value);
setcookie('key', $encoded);
echo $encoded, PHP_EOL;
```

これは期待した結果になりません。

    $ curl -i localhost/setcookie.php
    HTTP/1.1 200 OK
    Date: Wed, 01 May 2013 14:41:54 GMT
    Server: Apache/2.2.22 (Ubuntu)
    X-Powered-By: PHP/5.4.9-4ubuntu2
    Set-Cookie: key=c29tZSB2YWx1ZQ%3D%3D
    Vary: Accept-Encoding
    Content-Length: 17
    Content-Type: text/html
    
    c29tZSB2YWx1ZQ==

よおく見ると、`Set-Cookie`ヘッダーの最後が`==`ではなくて`%3D%3D`になってる、パーセントエンコードされちゃっています。
パーセントエンコードしない`setrawcookie()`関数というのがあるみたいです。

```php:setrawcookie.php
<?php

$value = 'some value';
$encoded = base64_encode($value);
setrawcookie('key', $encoded);
echo $encoded, PHP_EOL;
```

    $ curl -i localhost/setcookie.php
    HTTP/1.1 200 OK
    Date: Wed, 01 May 2013 14:41:54 GMT
    Server: Apache/2.2.22 (Ubuntu)
    X-Powered-By: PHP/5.4.9-4ubuntu2
    Set-Cookie: key=c29tZSB2YWx1ZQ==
    Vary: Accept-Encoding
    Content-Length: 17
    Content-Type: text/html
    
    c29tZSB2YWx1ZQ==

めでたしめでたし。

しかしなんでこんな仕様なんだろう……HTTPヘッダーインジェクション対策とかですかね。
逆に言うと`setrawcookie()`に不用意にユーザー入力の文字列を渡すと、危険なので、そこは充分注意しましょう。
自分用: cern ROOTによる最小構成のplotting

#TODO
my_app::my_appの引数をなんとかする

#CODE

```cpp

#include "stdafx.h"
#include <string>
#include <vector>
#include <boost/format.hpp>

#include <algorithm>
#include <numeric>
#include <functional>

#include <boost/scoped_array.hpp>
#include <memory>

#include <TMath.h>
#include <TApplication.h>
#include <TCanvas.h>
#include <TH1F.h>
#include <TGraph.h>
#include <TMultiGraph.h>
#include <TLatex.h>
#pragma comment(lib, "libCore.lib")
#pragma comment(lib, "libHist.lib")
#pragma comment(lib, "libGpad.lib")
#pragma comment(lib, "libGraf.lib")

using namespace std;

class my_app : public TApplication{
public:
	my_app(int* argc, char* argv[]) : TApplication("app name", argc, argv){}
	virtual ~my_app(){}
	virtual void Run(){

		
		vector<double> x(100);
		vector<double> y1(100);
		vector<double> y2(100);
		for(size_t i = 0; i < x.size(); ++i){
			x[i] = 1. * i * 10. / x.size();
			y1[i] = TMath::Sin(x[i]);
			y2[i] = TMath::Cos(x[i]);
		}

		
		//TApplication::MakeBatch();
		auto c = new TCanvas("c1 gl", "c gl");
		auto mg = new TMultiGraph();
		
		auto gr1 = new TGraph(x.size(), x.data(), y1.data());
		gr1->SetLineColor(4);
		gr1->SetLineWidth(1);
		gr1->SetMarkerColor(4);
		gr1->SetMarkerStyle(1);
		gr1->SetTitle("sin graph");
		
		auto gr2 = new TGraph(x.size(), x.data(), y2.data());
		gr2->SetLineColor(3);
		gr2->SetLineWidth(1);
		gr2->SetMarkerColor(3);
		gr2->SetMarkerStyle(1);
		gr2->SetTitle("cos graph");
		
		mg->Add(gr1);
		mg->Add(gr2);
		//A:軸
		//C:なめらかな線
		//L:ポリライン
		//P:マーカー
		mg->Draw("ACP");
		auto tex = new TLatex();
		tex->SetTextSize(0.04);

		const auto mytext = (boost::format("cos(#theta) #leq %1%") % *(max_element(begin(y2), end(y2)))).str();
		tex->DrawLatex(1., 1., mytext.c_str());

		mg->GetXaxis()->SetTitle("#theta");
		mg->GetYaxis()->SetTitle("Y");
		mg->GetXaxis()->SetRangeUser(0., 10.);
		mg->GetYaxis()->SetRangeUser(-2., 2.);
		c->Draw();
		//c->SaveAs("test.svg");
		c->WaitPrimitive();
	}
};

int _tmain(int argc, _TCHAR* argv[])
{
	vector<char*> myargv(argc);
	vector<unique_ptr<char[]>> mybuff(argc);
	for(size_t i = 0; i < argc; ++i){
		const wstring o(argv[i]);
		mybuff[i] = unique_ptr<char[]>(new char[o.size() * sizeof(wchar_t) + 1]);
		wcstombs(mybuff[i].get(), o.c_str(), (o.size() + 1) * sizeof(wchar_t));
		myargv[i] = mybuff[i].get();
	}

	my_app app(&argc, myargv.data());
	app.Run();
	return 0;
}

```
SublimeText2でマウスでの動作の設定を変更する


普段MacBookProのMacOSにVMwareFusionでWindows8入れて使ってます。
SublimeText2に限った話じゃないんですが、MacBookProのトラックパッドの慣性スクロール中にCtrlキー押すと文字や表示が拡大縮小してしまいます。
コレが結構うざったいので、拡大縮小しない様に設定を変更しようとする。
最初は`Key Bindings - User`で設定するのかなーと思って`Key Bindings - Default`を眺めてみたものの、そういう設定は見つからず。
( -_-)ｳｰﾝ

調べてみると、この設定に関して日本語の情報が出てなかったのでここに記載することにした。
情報元は[ここ][情報元]。

[情報元]:http://superuser.com/questions/472468/in-sublime-text-how-do-you-disable-increase-decrease-font-size-with-ctrl-and-mo


まず、`Browse Packages…`でパッケージを管理してるフォルダを開く。
その中で`…\Packages\Default\`というフォルダに`Default (Windows).sublime-mousemap`というのがある。
Windows以外にもOSXとかLinuxとかOS別にファイルがある。
で、該当するOSのファイルを開いて中を見るとこういう行があるので……


```python:Ctrl+マウスホイールの設定
// Change font size with ctrl+scroll wheel
{ "button": "scroll_down", "modifiers": ["ctrl"], "command": "decrease_font_size" },
{ "button": "scroll_up", "modifiers": ["ctrl"], "command": "increase_font_size" },
```


ここの`"decrease_font_size"`や`"increase_font_size"`を`"null"`に変更すれば、Ctrl+マウスホイールでの文字の拡大縮小が無効化される(保存後即時反映してくれる)。
これで目的は完了。

中身見たら他にもマウスでの動作を付け加えたり変更したりできそうなので、なにか動作追加したかったらここの設定を変更しよう。

これ、キーバインドの設定(`.sublime-keymap`)と同じくUserフォルダにコピーして必要なところだけ書けばいいだろ、と思っんだけど設定が反映されない模様。
新しいバージョンではちゃんと反映して欲しい……
bashで標準出力と標準エラー出力の一括リダイレクト


詳細は`man bash`で。

#### Redirecting Standard Output and Standard Error
標準出力と標準エラー出力を一括してリダイレクト。これは相当前からある機能。

```Bash
command &> file
若しくは
command >& file
で以下と同じ効果となる
command > file 2>&1
```

#### Appending Standard Output and Standard Error
標準出力と標準エラー出力を追記形式でリダイレクト。
これはbash 4.0からの機能。RHEL/CentOSのデフォルトrpm的には6.0から。

```Bash
command &>> file
以下と同じ効果となる
command >> file 2>&1
```
Windows7 + Vagrant(VirtualBox)でprivate_networkの構築

非常にお恥ずかしい話、Vagrantでprivate_networkを設定しようとすると、

```bash
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!

/sbin/ifup eth1 2> /dev/null
```

とか言われて、起動できない。なんだこれってなった時の話。

結論から書くと、Host-only Adapterを手動で追加して、必要なネットワークを前もって準備してないとこうなるみたいで、そういうの含めてVagrantがうまくまるっとやってくれるんでしょと思ってて大ハマリした。

###1.解決方法
---
すごく簡単。
とりあえずVirtualBoxのGUIを起動して、「ファイル > 環境設定」をクリック。
![01](https://ekwquq.blu.livefilestore.com/y1p1640WZmtb6KVLsSTh25r9XPzjxvtUKHzlXvf3RXWytRnBeYsHSWugpmuLVtqMpMXhbKMU76zkTveI9-c17WqcmT4gfQU3G_i/WS000003.JPG?psid=1)

出たウィンドウで「ネットワーク設定」をクリック。
今回はもう作成されているが、複数のhostonlyなネットワークが必要な場合は右の方の＋マークの付いているアイコンをクリックして、アダプターを追加する。
そして、アダプターのネットワーク情報を設定するため、追加したいアダプターを選択して、ドライバー？みたいなマークのアイコンをクリック。
![02](https://ekwquq.blu.livefilestore.com/y1p6OedftUXUDW_C3tRUfd0FlJ9AnUej7BR6AZ3soVHgK2xPxyS8nunrPKmerAMmgUE4hhTgVLE2OzDyY8SjUCJN5t2pvxcCNHg/WS000004.JPG?psid=1)

ここにAdapterのIPとネットマスクを設定してやればOK。
複数必要な場合はこの作業を何回か実施する。
![03](https://ekwquq.blu.livefilestore.com/y1pdiX7DYBV158cR5IFO70NT1qIILrS3WJlf5YMpJtOvaCaClkEc08BpD6mr1uO5tMlq7EjECbxFdIN_56h_yLO512v0S-sGYAn/WS000007.JPG?psid=1)

###2. お洒落じゃないのでコマンドでやりたい
---
Vagrantがせっかくコマンドラインだけでいじれるなら、これもコマンドラインだけで実行してスクリプトとかにすればいいんじゃねってことで、調べてみたところ、次のようなコマンドで作れはするらしい。

```bash
vboxmanage hostonlyif create
```

ただこれでもGUIでも残念ながらアダプターの名前を自由に決めたり変えたりはできないので、その点だけ残念。
よく使うadbのコマンド


自分が比較的よく使うadbのコマンドです。

## adb
```bash:コマンド
adb
```

ダウンロードしたSDKの`platform-tools`ディレクトリにパスを通しておく。
`adb` だけで実行すると使い方を見られる。

```bash:オプション
adb -e コマンド # エミュレータにコマンドを送る
adb -d コマンド # 端末にコマンドを送る
adb -s xxxx コマンド # コマンドを送る端末を指定できる
```

接続している端末が1台だけのときは指定しなくて良い。

## adbのバージョン
```bash:コマンド
adb version
```

```bash:出力例
Android Debug Bridge version 1.0.31
```
このコマンドはほとんど使わないけど、この記事を書いた時の記録として。

## 接続している端末の確認

```bash:コマンド
adb devices
```

```bash:出力例
List of devices attached 
HT05FPL09004	device
```

`HT05FPL09004` が端末の識別番号のようなもの。
複数端末をつないでいる時に `adb -s HT05FPL09004 shell` のように指定すると、その端末にコマンドを送れる。

## apkのインストール・アンインストール

### インストール
```bash:コマンド
# 通常のインストール
adb install xxxx.apk
# アップデートインストール
adb install -r xxxx.apk
```

`xxxx.apk` にインストールしたいapkのファイル名を指定する。
すでに端末に同じ署名のapkがインストールされてる場合は `adb install -r xxxx.apk` のように `-r` をつけると上書きできる。データファイルは保持される。

### アンインストール
```bash:コマンド
adb uninstall com.xxxx.appname
```
`com.xxxx.appname` にアンインストールしたいアプリのパッケージ名を指定する。
完全なパッケージ名を覚えていない場合、後述の`pm list packages` が便利。

## ログの取得

```bash:コマンド
# オプションを指定せずにログ出力
adb logcat
# 出力形式を指定してログ出力
adb logcat -v time
# 現在のログをダンプする
adb logcat -d
# ログのクリア
adb logcat -c
```

標準出力に出力されるので、だいたいは `adb logcat -v time > log.txt` のようにリダイレクトしてる。
あとはvimで `:r! adb logcat -v time -d` のようにして取り込んだりする。

## ファイルの転送
```bash:コマンド
# PCから端末へ
adb push PC上のファイル名 端末上のファイル名
adb push hoge.txt /sdcard/ # 例
# 端末からPCへ
adb pull 端末上のファイル名 PC上のファイル名
adb pull /sdcard/hoge.txt . # 例
```

転送先のファイル名は指定しても良いけど、ファイル名を変えることはあんまりないので省略することが多い。


## adbの起動・停止
```bash:コマンド
# adbの停止
adb kill-server
# adbを起動
adb start-server
```
adbがうまく動いてないんじゃないか？と思った時にkill→startで再起動させてる。

## shell
```bash:コマンド
# shellを起動
adb shell
# shelコマンドを実行
adb shell コマンド
```

shellにコマンドを実行させたいときは `adb shell コマンド` の形で使う。
__以下はshell上で実行できるコマンド__。

### アプリの起動
```bash:コマンド
# Activityの起動(ACTION_VIEW + URL)
am start -a android.intent.action.VIEW -d http://google.com
# Activityの起動(クラス名を指定)
am start -n com.hoge.app/.FugaActivity
# サービスの起動
am startservice ... # Intentの指定方法はActivityと同じ
# ブロードキャストの送信
am broadcast ... # Intentの指定方法はActivityと同じ
```

Intentの内容を `-a`、`-d`、`-n` などのオプションで指定する。デバッグ実行したい場合は `-D` をつける。その他のオプションは `am` 単体で実行すれば見ることができる。
shellを起動せずに実行するときは `adb shell am start -a android.intent.action.VIEW -d http://google.com` のように指定する。

### 文字入力・キーイベント送信
#### 文字入力
```bash:コマンド
input text hoge
```

マルチバイト文字列は送信できない(と思う)。
IMEが起動していると、IMEの入力モードの影響を受けることがある。

#### キーイベント送信
```bash:コマンド
input keyevent 3 # HOMEキー
input keyevent 4 # BACKキー
input keyevent 82 # MENUキー
```

数値でキーコードを指定する。
キーコードは [KeyEvent | Android Developers](http://developer.android.com/reference/android/view/KeyEvent.html "KeyEvent | Android Developers") を参照。

### パッケージ名列挙
```bash:コマンド
pm list packages
```
インストールされてるアプリのパッケージ名が列挙される。
`adb uninstall` で必要なパッケージ名を一部しか覚えていないときに `adb shell pm list packages | grep hoge` のようにして使うことが多い。
(追記) grepを使わなくても、`adb shell pm list packages hoge` でフィルタリングできた。

### cat
```bash:コマンド
cat /sdcard/hoge.txt
```
読み込み権限のあるファイルの中身を簡単に確認するときに使う。
vimで `:r! adb shell cat /sdcard/hoge.txt` のように使うことが多い。
Eclipseでソースファイルを自動保存する


IntelliJ IDEA絶賛愛用中ですが、Eclipseの方がPluginが豊富なのは事実。

しかし、1度IntelliJ IDEAに慣れてしまうと、Command(WindowsはCtl)+Sとかで**いちいち手動保存なんてやってられない**訳です。
（間違えたらUndoすればいいだけですので。）

Eclipseにも自動保存くらいあるだろｗと思ったら、意外と情報自体がなかったので、まとめてみました。

>まず、結論から。
###Eclipseには、IntelliJ IDEAのようにソース変更をトリガに即時で自動保存される設定やPluginはない。

唯一あったのが「EclipseのWindowからフォーカスが外れることで、自動保存される」Plugin。

きっと、これがEclipseの仕様上、限界なんだろうと思いますが、よくよく考えるとこれも悪くないと思います。
例えば、PHPやらHTMLを更新してブラウザに移れば、勝手に保存（→ビルド）されるので、ブラウザで即更新結果が閲覧できる訳です。


####< 設定 >

####1.Eclipseの設定
![Preferences 2013-05-01 11-22-12.jpg](https://qiita-image-store.s3.amazonaws.com/0/9497/8951d178-1f82-2b2d-ca40-8fe9761446a9.jpeg)

![Preferences 2013-05-01 11-19-51.jpg](https://qiita-image-store.s3.amazonaws.com/0/9497/3d4a7d7b-77a4-c462-64ef-e49447956d9e.jpeg)


---

####2.Pluginインストール
Help > Install New Software…

```
auto_save - http://eclatosa.googlecode.com/svn/trunk/eclatosa.updatesite/
```
*auto_saveの部分はご自由に。

![Install 2013-05-01 11-23-30.jpg](https://qiita-image-store.s3.amazonaws.com/0/9497/81f5701e-6159-f624-c858-e2ef3c9091a0.jpeg)



適当にOKとかで進んでEclipse再起動。

---

####3.確認

![Preferences 2013-05-01 11-18-16.jpg](https://qiita-image-store.s3.amazonaws.com/0/9497/07e4f1df-183e-6678-4e96-e2ec3a3575ab.jpeg)

設定はJavaですが、Java以外にも普通に機能します。
エディタで編集して、Windowを他のアプリに切り替えてみてください。
エディタタブの更新編集中マークである「*hoge.java」とかが「hoge.java」になり自動保存されたと思います。
複数ファイル操作

ソースコードとかで関数名やdefineなどを変更した際に全置換する方法です。
最近知りました。vim使っている人でも知らない人が多いみたいなので、メモ書きと紹介です。下記のようにします。※argsに引数を渡さずに使うと現在設定されている引数のリストが表示されます。

### 複数ファイルを一気に操作

```vim
:args *.c
:argdo %s/hoge/fuga/g | update
```

### 今開いているバッファすべてにコマンドを適用する

```vim
:bufdo %s/hoge/fuga/g | update
```
vimでリファクタとかするときには結構使えるテクニックですね。
Indexed free monad

DSLを作るときに使えるかもしれない

```hs
{-# LANGUAGE GADTs #-}
import Control.Monad.Indexed

data IxFree f i j x where
    Pure :: a -> IxFree f i i a
    Free :: f i j (IxFree f j k a) -> IxFree f i k a

instance IxFunctor f => IxFunctor (IxFree f) where
    imap f (Pure a) = Pure (f a)
    imap f (Free w) = Free (imap (imap f) w)

instance IxFunctor f => IxPointed (IxFree f) where
    ireturn = Pure

instance IxFunctor f => IxApplicative (IxFree f) where
    iap (Pure a) (Pure b) = Pure (a b)
    iap (Pure a) (Free fb) = Free (imap a `imap` fb)
    iap (Free fa) mb = Free $ imap (`iap` mb) fa

instance IxFunctor f => IxMonad (IxFree f) where
    ibind k (Pure a) = k a
    ibind k (Free fm) = Free $ imap (ibind k) fm
```
guard-livereloadを使う

viewのファイルやjs, cssを更新した時に、ブラウザが自動更新するようになる。

## 導入
`Gemfile`に追加して、gemをインストールする。

```rb:Gemfile
group :development do
  gem 'guard-livereload'
end
```

```
$ bundle install
$ bundle exec guard init livereload
```
`Guardfile`が作成されて以下の内容が追加される。監視するファイルはプロジェクトによって適宜変更するとよさそう。

```rb:Guardfile
guard 'livereload' do
  watch(%r{app/views/.+\.(erb|haml|slim)$})
  watch(%r{app/helpers/.+\.rb})
  watch(%r{public/.+\.(css|js|html)})
  watch(%r{config/locales/.+\.yml})
  # Rails Assets Pipeline
  watch(%r{(app|vendor)(/assets/\w+/(.+\.(css|js|html))).*}) { |m| "/assets/#{m[3]}" }
end
```

guardを起動する。

```
$ bundle exec guard
```

livereloadのブラウザ拡張をインストールする。[chrome拡張](https://chrome.google.com/webstore/detail/livereload/jnihajbhpnppcggbcgedagnkighmdlei) 
拡張機能の設定で「ファイルの URL へのアクセスを許可する」にチェックを入れる。
firefoxのアドオンではなぜかうまくいきませんでした。（設定等必要？？）

Rails等を起動する。

これで`Guardfile`で指定されたファイルを更新すると、ブラウザが自動更新するようになる。

## 参考
- [guard/guard-livereload · GitHub](https://github.com/guard/guard-livereload)
- [guard/guard · GitHub](https://github.com/guard/guard)

## あとがき
書いてから気づいたけど、ほぼ README の内容だったorz
SVProgressHUDでプログレスビューを表示する

標準のUIProgressViewは見た目が格好良くないので、SVProgressHUDを使ってみました。

参考
[超簡単！iOSでたった数行でかっこいいローディング表示 – SVProgressHUD](http://dev.classmethod.jp/smartphone/ios-loading-svprogresshud/)

**QuartzCore.frameworkを使うので、追加しておきます。**

```objc
// プログレス表示
[SVProgressHUD show];

// プログレス非表示
[SVProgressHUD dismiss];
```

NSBlockOperationのブロックの中で消そうとして、dismissしたけど、消えませんでした。(UIスレッド外だから？)
[SVProgressHUD showSuccessWithStatus:@""]だと消えます。んー。。。
enchant.jsのサンプル

enchant.js の練習コードを以下に置きました。
https://github.com/katoy/sample-enchant

- sample001 スプライトの表示、移動、クリック時の処理の練習
- 15puzzle　 15 パズルとその一般化 (n x m のセル分割), BGM の再生、Start シーン処理の練習
- breakblock ブロック崩し
- invador インベーダー
- playingcards トランプのカード表示練習
- memory 神経衰弱 (トランプゲーム)。  カード移動、カードめくり、カードシャッフルのアニメーションを含む。
- tetris テトリス
- reversi    リバーシ。 石をひっくり返すアニメーション、 undo/redo 機能、簡易コンピュター思考ルーチン (含む negaMax 法)

ソースコードは Coffee-script で記述しています。
15 パズルの例では、jquery も利用しています。

    $ cake compile

とすることで main.script から game.js として javascript に変換できます。

動作デモ：
-   http://homepage2.nifty.com/youichi_kato/src/github/enchant/sample001/index.html
- http://homepage2.nifty.com/youichi_kato/src/github/enchant/15puzzle/index.html
- http://homepage2.nifty.com/youichi_kato/src/github/enchant/breakblock/index.html
- http://homepage2.nifty.com/youichi_kato/src/github/enchant/invador/index.html
- http://homepage2.nifty.com/youichi_kato/src/github/enchant/playingcards/index.html
- http://homepage2.nifty.com/youichi_kato/src/github/enchant/memory/index.html
- http://homepage2.nifty.com/youichi_kato/src/github/enchant/tetris/index.html 

- http://homepage2.nifty.com/youichi_kato/src/github/enchant/reversi/index.html 


一部は jsdoit にも投稿しています。

http://jsdo.it/katoy/olos
Content-Disposition の日本語問題


たとえば rails で、

```ruby
send_file(filename: "日本語.pdf")
```

のように日本語指定するとブラウザによってうまくいかない場合がある。
この問題は検索してみるとなかなかやっかいなのだが、いちおう現時点では
http://greenbytes.de/tech/tc2231/#attwithfn2231utf8
これがファイナルアンサーと思われる。

しかし rails3.2 rails4.0 時点での send_file は、この記法

```
Content-Disposition: attachment; filename*=UTF-8''foo-%c3%a4-%e2%82%ac.html
```

に対応していない。(see [rfc2231](http://www.ietf.org/rfc/rfc2231.txt))

そこでモンキーパッチを当てよう。

```ruby:config/initializers/send_file_with_utf8.rb
module ActionController
  module DataStreaming
    def send_file_headers_with_utf8!(options)
      send_file_headers_without_utf8!(options)
      match = /(.+); filename="(.+)"/.match(headers['Content-Disposition'])
      encoded = URI.encode_www_form_component(match[2])
      headers['Content-Disposition'] = "#{match[1]}; filename*=UTF-8''#{encoded}" unless encoded == match[2]
    end
    alias_method_chain :send_file_headers!, :utf8
  end
end
```

一発パッチコマンドはこちら↓

```
wget https://gist.github.com/kuboon/5494463/raw/31d80be6dc23eac2bc05d996df1e0293ae001124/send_file_with_utf8.rb -P config/initializers/
```

update: 2013/05/01 Windows版 safari ではうまくいかないことが判明した。

Content-Disposition をどんなに工夫しても無視され、URL の末尾のファイル名が使用されるっぽい。そこで、まず filename をオプショナルに受け取れるように routes.rb を修正

```config/routes.rb
  get "/pdf/:id(/:filename)" => "pdfs#show"
```

action に以下のように、自分自身にリダイレクトするコードを書く。(```gem 'useragent'``` を使用)

```
  user_agent = UserAgent.parse(request.env['HTTP_USER_AGENT'])
  if params[:filename].nil? && user_agent.browser == "Safari" && user_agent.platform == "Windows" 
    # && user_agent.version <= "5.1.7" 新バージョンで修正されたら uncomment
    return redirect_to pdf_path(params[:id], filename)
  end
```

さすがにこの処理をモンキーパッチで書くのは黒魔法過ぎるのでここで妥協。
Mac OS X (10.8) での nginx + lua-nginx-module インストール

nginx + lua-nginx-module の環境構築
========================

nginx + lua-nginx-module を利用してなんかやりたいけど、
わざわざUbuntuの入ったVMを〜とかはだるかったので、Mac OS X (10.8)で
環境構築をしてみた。

##Mac OS Xでの環境構築

pcre、LuaJITはnginxのインストールで必要なので、
homebrewでインストールしておく。
Luaでも問題ないのだけど、今回はLuaJITで。

```sh
brew install pcre
brew install luajit
```

##nginx + lua-nginx-moduleのインストール


手順を[公式](http://wiki.nginx.org/HttpLuaModule#Installation)で確認すると、
を見ると、nginx_devel_kit、ngx_luaが必要とのこと。
nginxについては先日(2013-04-24)リリースされたnginx1.4.0を利用する。

git clone したり、 git checkout したり。

```sh
> mkdir -p /usr/local/sandbox/nginx_lua_module
> cd /usr/local/sandbox/nginx_lua_module
>
> git clone git://github.com/simpl/ngx_devel_kit.git
> git clone git://github.com/chaoslawful/lua-nginx-module.git
> curl -O http://nginx.org/download/nginx-1.4.0.tar.gz
>
> tar -xvzf nginx-1.4.0.tar.gz
>
> cd ngx_devel_kit
> git checkout -b v0.2.18 v0.2.18
> cd ../lua-nginx-module
> git checkout -b v0.8.1 v0.8.1
> cd ../nginx-1.4.0
```

###LuaJITのライブラリ及びヘッダファイルパスを設定

```sh
> export LUAJIT_LIB="`brew --cellar luajit`/2.0.1/lib"
> export LUAJIT_INC="`brew --cellar luajit`/2.0.1/include/luajit-2.0"
```

### nginxのビルド準備

pcreはhomebrewを利用してインストールしているので、
CFLAGS及びライブラリへのリンクを指定する。

```sh
> mkdir -p /usr/local/nginx-1.4.0
> ./configure --prefix=/usr/local/nginx-1.4.0 \
> --add-module=/usr/local/sandbox/nginx_lua_module/ngx_devel_kit \
> --add-module=/usr/local/sandbox/nginx_lua_module/lua-nginx-module \
> --with-cc-opt='-O0 -I/usr/local/Cellar/pcre/8.32/include' \
> --with-ld-opt='-L/usr/local/Cellar/pcre/8.32/lib' 
```

configureスクリプトが通ったらビルド。

```sh
> make -j2
> make install
```

### 起動テスト

ビルドが通り、インストールも終わったら起動テストを行なってみる。

```sh
sudo /usr/local/nginx-1.4.0/sbin/nginx
```

http://localhost/ にアクセス。

![nginx startup](https://dl.dropboxusercontent.com/u/614755/qiita/lua-nginx-module/screen-01.png)

OK。

## lua-nginx-moduleの動作確認

既存のnginx.confに最低限の設定だけ残したり、編集したりして動作確認する。

```sh
> cd /usr/local/nginx-1.4.0/conf
> vi nginx.conf
```

```nginx
worker_processes  1;

error_log  logs/error.log;
pid        logs/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    access_log  logs/access.log;

    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;

        access_log  logs/host.access.log;

        location / {
            root   html;
            index  index.html index.htm;
        }

        location /lua-test {
            default_type 'text/plain';
            content_by_lua "ngx.say('Hello,world!')";
        }
    }
}
```

新たに追加した/lua-testに対しアクセスをしてみる。

http://localhost/lua-test

![lua-test](https://dl.dropboxusercontent.com/u/614755/qiita/lua-nginx-module/screen-02.png)

動作確認OK。
これで遊べるようになった。
UIBarButtonItemのイメージを変更する

UIToolbarに並んでいるUIBarButtonItemのイメージを変更する方法です。

普通に[UIBarButtonItem setImage:UIImage]したら変更できるのかと思っていたら、全然変わらない罠が。。。
どうやら、変更後のイメージを設定したUIButtonをカスタムビューとして設定したUIBarButtonItemを新たに作って、UIToolbarに設定しないとイケナイようです。

```objc
// 変更後のイメージ
UIImage *img = [UIImage imageNamed:@"hoge"];
        
// 変更後のイメージを設定するボタン
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];

// イメージを設定
[button setImage:img forState:UIControlStateNormal];
        
// ボタンにターゲットを設定
[button addTarget:self action:@selector(onButtonClicked:) forControlEvents:(UIControlEventTouchUpInside)];

button.frame = CGRectMake(0, 0, img.size.width, img.size.height);
        
// 変更後のBarButtonを用意
UIBarButtonItem *barButton = [[UIBarButtonItem alloc]initWithCustomView:button];
        
// styleを変更(変更できない・・・)
[barButton setStyle:UIBarButtonItemStyleBordered];
barButton.style = UIBarButtonItemStyleDone;

// 既存のtoolbarのアイテムを取得
NSArray *barButtonItemArray = [self.myToolBar items];
        
NSMutableArray *changedBarButtonItemArray = [NSMutableArray arrayWithArray:barButtonItemArray];

// イメージを変更したいアイテムを入れ替える
[changedBarButtonItemArray replaceObjectAtIndex:4 withObject:barButton];

// 変更後のアイテムの一覧をtoolbarに設定する
self.myToolBar.items = changedBarButtonItemArray;
```

```objc
[barButton setStyle:UIBarButtonItemStyleBordered];
barButton.style = UIBarButtonItemStyleDone;
```
なんかー、スタイルを変更したくてもできないしー。

###他に方法あるんじゃないんですか・・・？
###教えて偉い人。。。
Play Framework (Java) の WS を使った時のタイムアウト

Play Framework では、[Play WS API](http://www.playframework.com/documentation/2.1.1/JavaWS) なるものを使うと、Web サービスへのアクセスが簡単にできます。

ドキュメントの中の「Configuring the HTTP client」を見ると、`ws.timeout` なるパラメータを設定することで、タイムアウトを設定出来ます。単位はミリ秒で、デフォルトは 120000、つまり2分です。外部サービスが重い時に自分のサービスまで重くなってしまうのは避けたいので、この値は基本小さくして、必要に応じてアクセス時に上げるのがいいと思います。

さて、タイムアウトした時の挙動ですが、特にドキュメントにありません。では何が起こるのかというと `Promise<Response>#get` で `java.util.concurrent.TimeoutException` が発生します。

えー！[throws には RuntimeException しか書いてない](http://www.playframework.com/documentation/api/2.1.1/java/play/libs/F.Promise.html)じゃないかー！と言いたい気持ちは分かるのですが、チェック例外である TimeoutException が発生します。多分、中で Scala と Java を行ったり来たりしてるうちに、チェック例外であるということが隠されてしまったのでしょう。

非チェック例外しか投げないはずのメソッドに対して

```java
String url = "http://example.com/image.jpg";
try {
  response = WS.url(url).get().get();
} catch (TimeoutException e) {
  Logger.warn("Timeout: " + url);
}
```

みたいなコードを書いても「Unreachable catch block for TimeoutException. This exception is never thrown from the try statement body」などと怒られてしまいます。もしタイムアウトであるかどうかを確認したければ、Exception を catch して、instanceof などするしかないようです。
[PC-6001] メモリマップ

#ざっくり
|   address    | size  | description |
|:------------:|:-----:|:------------|
| \$0000~$3FFF | $4000 | BASIC ROM   |
| \$4000~$7FFF | $4000 | 拡張ROM     |
| \$8000~$BFFF | $4000 | 拡張RAM     |
| \$C000~$FFFF | $4000 | 標準RAM     |
shell script で tee つかったときの終了コード取得方法

~~~:shell
make all | tee log.txt;
if [[ "${PIPESTATUS[0]}" == 1 ]] || [[ "$pipestatus[1]" == 1 ]]; then
  echo ng;
else
  echo ok;
fi;
~~~

`$pipestatus[1]` は zsh の場合
`${PIPESTATUS[0]}` は bash の場合

http://www.unix.com/shell-programming-scripting/92163-command-does-not-return-exit-status-due-tee.html を参考に
Photoshop CS6 SDK を XCode4.6.1 でビルドする


Photoshop CS6 SDK を XCode4.6.1 でビルドする方法。需要あるのかなこれ。

前提として、XCodeの動作についての基本的な知識はあるものとして解説しています。 まず、samplesに含まれる適当なxcodeprojを開いて、ビルドが通らないのを確認してから、以下を読んでね。

## 原因

* FlatCarbonのファイルパスが違う
* 一部のヘッダファイルが存在しなくなってる

## 対処

### Adobe common

Adobeで用意しているヘッダファイルが、Carbonの既に存在しないヘッダを読んでいるせい、らしい。

http://forums.adobe.com/message/4927747

の通りにする。

### Mac OS common 

Mac OS common の中身を全部消して、

	/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk/Developer/Headers/FlatCarbon/

の中にある.hファイルと.rファイルを入れる。

### あとは頑張る

大抵は SetRect がなくてコケるケースが頻発するので何とかする。 僕は、こうしてみた。

```cpp:PIUtilities.h
    inline Boolean PISetRect(Rect* pRect, short nLeft, short nTop, short nRight, short nBottom)
    {
        pRect->left   = nLeft;
        pRect->top    = nTop;
        pRect->right  = nRight;
        pRect->bottom = nBottom;
        
        return true;
    }
```
NSStringのisEqualToString:の落とし穴

##※この記事は間違った情報を記述しています##

NSStringにはisEqualToString:[isEqual:]で文字を比較することができます。
しかしながら、この比較というのはliteral Unicode-based comparison、バイト列の比較なのです。
つまり、文字列的には同じだが、バイト列としては違う場合、
isEqualToStringは違うものと判断してしまいます。
従ってこの挙動が望ましくない場合、compare:等のその他の比較メソッドの中から適切に選択する必要があります。

caseInsensitiveCompare:やlocalizedCompare:等々色々ありますね。
この辺はまたしっかりリサーチができたらいずれまとめたいです。

```objc
#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        char a[] = "あいうえお";
        char b[] = "あいうえお";
        NSString *aString = [NSString stringWithCString:a encoding:NSUTF8StringEncoding];
        NSString *bString = [NSString stringWithCString:b encoding:NSUTF16StringEncoding];
        
        printf("[aString isEqual:bString] => %s\n", [aString isEqual:bString]? "YES" : "NO");
        printf("[aString isEqualToString:bString] => %s\n", [aString isEqualToString:bString]? "YES" : "NO");
        printf("[aString compare:bString] => %s\n", [aString compare:bString]? "YES" : "NO");
    }
    return 0;
}
```

出力
[aString isEqual:bString] => NO
[aString isEqualToString:bString] => NO
[aString compare:bString] => YES


##追記　5/8
なんだか文字列比較がよくわからなくなってきました。

```
int main(int argc, const char * argv[])
{
    @autoreleasepool {
        char a[] = "あいう";
        unichar b[] = {L'あ', L'い', L'う'};
        
        NSString *aString = [NSString stringWithCString:a encoding:NSUTF8StringEncoding];
        NSString *bString = [NSString stringWithCharacters:b length:sizeof(b) / sizeof(b[0])];
        
        printf("[aString isEqual:bString] => %s\n", [aString isEqual:bString]? "YES" : "NO");
        printf("[aString isEqualToString:bString] => %s\n", [aString isEqualToString:bString]? "YES" : "NO");
        printf("[aString compare:bString] => %s\n", [aString compare:bString] == NSOrderedSame? "YES" : "NO");
        printf("[aString compare:bString options:NSLiteralSearch] => %s\n", [aString compare:bString options:NSLiteralSearch] == NSOrderedSame? "YES" : "NO");
    }
    return 0;
}
```

出力
[aString isEqual:bString] => YES
[aString isEqualToString:bString] => YES
[aString compare:bString] => YES
[aString compare:bString options:NSLiteralSearch] => YES
Rails3.2でエラー画面を静的ファイルでなくcontrollerで処理する方法


production環境下では404, 500などのエラーが発生した場合にpublicディレクトリの下にある静的ファイルが表示されるが、これをcontroller経由で処理できるようにする方法。
routingで表示するエラーを指定し、各メソッド、テンプレートを作成する。
有効にするには各環境で設定を変更する必要がある。

```text:config/environments/*.rb
config.consider_all_requests_local = false
config.exceptions_app = self.routes
```

```text:contig/routes.rb
match "/404", :to => "errors#not_found"
match "/500", :to => "errors#system_error"
```

```ruby:errors_controller
class ErrorsController < ApplicationController
  def not_found
  end

  def system_error
  end
end
```

後はアクションに合わせて各テンプレートを用意する。
最低限必要だけど、忘れがちなgitコマンド まとめ 備忘録

addとかpushはわかるけど、ちょっと忘れがちな基本コマンドたちをまとめました。

# 作業やり直し関係

````
$ git commit --amend
     pushしてない直前のコミットを、このコミットに置き換える
````

e.g)
$ git commit -m 'aaaa'
$ git add huge
$ git commit --amend
最後のコミットがその前のコミットを上書きします。

````
$ git status
     ワーキングコピーでの状況の確認
     ここの表示に「こんな時はこんなコマンドを打ってね」って出ます(・∀・)！
````

e.g)
 Changes not staged for commit:
   (use "git add <file>..." to update what will be committed)
   (use "git checkout -- <file>..." to discard changes in working directory)

       modified:   hogehoge.pm


````
$ git reset HEAD hoge.pm
     ステージから下げる
     （addしてしまったものをaddしてない状態にする）
````

````
$ git checkout -- hoge.pm
     ワーキングディレクトリでの変更をもとに戻す
````

# コミット履歴関係

````
$ git log -p -2
-p
     書くコミットのdiffを見れる
-2
     直近の2エントリに指定
````

````
$ git log --stat
--stat
     各コミットエントリに続けて、変更されたファイルの一覧・ファイル数、追加削除された行数が表示される
--shortstat
     --statのうち、変更／追加／削除の業のみ表示
--name-only
````
     
e.g)
commit a1tekitof0sohochazuke75hogeabomberyeah9e6
Author: Ochazuke Fire <ochazuke.at.fire.fire>
Date:   Mer Jue 15 11:00:00 2013 -0700

    first commit

 template/hogehoge           |    6 ++++++
 Rakefile                           |   23 +++++++++++++++++++++++
 lib/hoge/O/hoge/fire.pm     |   25 +++++++++++++++++++++++++
 3 files changed, 54 insertions(+), 0 deletions(-)


````
$git log --pretty=oneline
--pretty
     ログ出力形式を設定出来る
=oneline
     各コミットを1行で表示
```` 

e.g)
ca82a6ochazukedaisuki2690a93763949 changed the version number
085bb cb608e1e845sonnnanisukijanie7 removed unnecessary test code
a1tekisutowireioiaouhgoasga0de2209e6 first commit


````
$ git log --pretty=format:"%h - %an, %ar : %s"
--format
     独自のログ出力フォーマットを指定
````

````
$ git log --pretty=format:"%h %s" --graph --since=2.week
--graph --author=hoge
     グラフの表示
--since, --until, -before, -after
     ログ出力対象期間を設定
     = “2008-01-15”
          絶対日時指定
     =2 years 1 day 3 minutes ago
          相対日時指定
````
単語と単語idの対でできた辞書を簡単に作る

自然言語処理でお馴染みの作業．
[Pythonではもっと簡単らしい](https://twitter.com/neubig/status/328679465137872896)

```ruby
words = ['apple', 'banana', 'cat']
Hash[words.each_with_index.map{|e, i|[e, i]}]
#=> {"apple"=>0, "banana"=>1, "cat"=>2}
```
テンプレートタグ文法の衝突を（無理矢理）回避する

# 背景

playframework 1.x の groovy テンプレートはいくつかの独自構文を定義しています。

* [Documentation: templates — Playframework](http://www.playframework-ja.org/documentation/1.1/templates#syntax)


# 問題

このうち、式の `${...}` は jsp や velocity などでも見かける一般的な構文ですが、タグ `#{...}` や メッセージタグ `&{...}`, リバースタグ `@{...}` は独自色が強く、そのため他のプロダクトと組み合わせて使用する際に構文が衝突する場合があります。

例えば、URL の一部文字列を置換するために `{id}` や `{key}` などというプレースホルダを指定するプロダクトがあった場合、これをラベルや get パラメータに含めると

```
http://someurl/xxx#{id}?key=value&{key}=value
```

という URL を組み上げる際に、タグ `#{...}` や メッセージタグ `&{...}` の文法が衝突します。実際に tablesorter の文法と衝突しました。

* [jQuery plugin: Tablesorter 2.0 - Pager plugin - Ajax](http://mottie.github.io/tablesorter/docs/example-pager-ajax.html)


# （暫定）対応

この問題は、以下のようにしてスクリプトタグ `%{...}%` で当該箇所を出力することで（無理矢理）回避することができます。

```groovy
%{out.print('http://someurl/xxx#{id}?key=value&{key}=value');}%
```

もっといい方法があったら教えてください。
意識の低いgitの始め方

## 対象
* 意識低い人  
* これから始めたいけどなんかgit使ってる人怖いって人  

## 操作

これだけは覚えとけって操作  

* コミット  
	これができないとお話にならないので  

**以上**  
**これ以外は使いながら覚えればおｋ**

（リモート使うんならpull/pushも必要かもね）


## ツール
  
意識高い人「gitはコマンドライン叩いてナンボ」
 - 最初はコマンドとかほっとけばいいよ

とりあえずオススメのGUI系

* Windows

	``GitExtensions``
　	http://gitextensions.github.io/

* Mac

	``SourceTree``
　	http://sourcetreeapp.com/

* Linux

	意識低い人がLinux使ってるはずないので省略

WindowsにもSourceTreeあるけど、UIが英語なので意識低い人は日本語化されてるGitExtensions使っとけ
「WinもMacも使うんだよ！」って人はSourceTreeでもいいと思うけど

> 2017/01/23 mod start
> 最近だと僕は [GitKraken](https://www.gitkraken.com/) 使ってますけどね。
> 2017/01/23 mod end

## コミットメッセージ

意識高い人「コミットメッセージは英語で書くべきだ！」
 - 日本語で書けばいいよ、どーせ自分しか見ないんだから
 - 全世界に公開するつもりなら英語で書いたほうがいいと思うけど

意識高い人「1行目がコミットのタイトルで、空白行あけて3行目から説明を書け」
 - 好きなように書けばいいよ
 - このへんはgitに慣れたらなんとなくわかるかもだけど、わかるまでは適当でいいよ
 - コミットメッセージに日記書いてもいいと思うよ、面白いし


## コミットの粒度について

意識高い人「コミットの粒度は小さくするべきだ！」
 - 最初は適当でいいよ
 - 使ってれば自分に最適な粒度がわかってくるかもしれないよ

## ブランチ

意識高い人「masterで作業するな！Git FlowとかGitHub Flowとか使わないと」
 - どんどんmasterにコミットすればいいよ
 - むしろmasterしかブランチがなくてもいいと思うよ
 - ブランチの便利さがわかったらブランチ切るようにしたらいいよ

## リモートリポジトリ

意識高い人「やっぱGitHubでしょ」
 - ほっとけばいいよ
 - ローカルリポジトリだけでも十分便利だよ
 - いろんなマシンでリポジトリ同期したい場合はDropBoxとかにでもBareリポジトリ置いとけばいいよ

## Rebaseについて

Rebase教信者「直線になってるコミットグラフだけでご飯3杯イケます」  
--no-ff教信者「マージコミットには意味があるんだよ！」  

　- 信者こわちか
　- わかるまでは、gitが勝手にマージするのに任せとけ
　- というかブランチ切らなければRebaseも--no-ffも関係ないですしおすし

（Rebase便利だけど、アレは「**履歴を書き換えてる**」って意識を持って使うようにしましょうね）

## まとめ

**つべこべ言わずにgit使え、git**
grunt-contrib-watchで変更されたファイルを取得する方法


`grunt.event.on('watch', fn)`で「watch」イベントを監視し、変更したファイルを取得することができる。

イベントハンドラでは変更ファイルのパスが取得できるので、
それを使用してconfigを書き換えて、変更ファイルのみにタスクを実行させる、ということができる。
※jshintの他にもsassやcoffeescript等のコンパイルに利用できそう。

grunt-contrib-watchのconfigで`nospawn: true`にしないとイベントハンドラによるconfig書き換えが反映されない。


```javascript
grunt.initConfig({
  watch: {
    scripts: {
      files: ['lib/*.js'],
      tasks: ['jshint'],
    },
	options: {
      nospawn: true
    }
  },
  jshint: {
    all: ['lib/*.js'],
  },
});

grunt.event.on('watch', function(action, filepath) {
  grunt.config(['jshint', 'all'], [filepath]);
});
```
Arch Linux の Nautilus の見た目をまともに

Pacman -S nautilus でインストールできる Ubuntu でおなじみのファイルマネージャ Nautilus だが，Gnome 以外の環境で使うとあまりの見た目に残念な気持ちになる．この Nautilus のテーマは，以下の方法で変えることができる．

1. `$ mkdir ~/.config/gtk-3.0`
2. .config/gtk-3.0/settings.ini を作成し，テーマ名やアイコンの設定を記述する．以下はその例．

```
[Settings]
gtk-theme-name = Adwaita
gtk-icon-theme-name = Humanity
```

これで nautilus を起動すれば，テーマとアイコンが設定されている．テーマは /usr/share/themes に，アイコンは /usr/share/icons に格納されているので，右辺はここから選択すればよい．

ちなみに上の例でも使用している GNOME3 の Adwaita テーマは，`$ packer -S gnome-themes-standard` でインストールできる．


[追記]
設定項目: https://developer.gnome.org/gtk3/unstable/GtkSettings.html
Macにedisをインストールしてみる

噂のEdisをインストールしてみたっつー話です。
[Edis！！！](http://b.hatena.ne.jp/entry/inaka.github.io/edis/)

前提条件はMacを使っている事
基本的にHomebrewで設定したMacを利用している物とする

1. 作業用ディレクトリを作成

```
$ mkdir /usr/local/src
cd /usr/local/src
```
　
2. rebarをインストールする
Erlangをコンパイルする為に必要らしい。  
基本的にここを参照
[rebar、それはErlangのビルドツール](http://www.eisbahn.jp/yoichiro/2012/02/erlang_rebar.html)
ちなみにErlangが入ってない場合はこのようにいれる

```
$ brew install erlang
```
入れた後は以下のようにコマンドを実行していく

```
$ git clone https://github.com/basho/rebar
$ cd rebar
$ ./bootstrap
```
これでrebarコマンドが出来ているのであとは適当にパスが通ってるところにcpしてあげる

```
$ cp ./rebar ~/bin
```
　
3. Edisをインストールする
[公式サイト](http://inaka.github.io/edis/download.html)通りにインストールすればおkと思いきやエラーが・・・

```
$ cd /usr/local/src
$ git clone git://github.com/inaka/edis
$ cd edis/
$ make                                                                                                                                                (git)-[master]-[/usr/local/src/edis]
rebar get-deps compile
==> edis (get-deps)
Pulling lager from {git,"git@github.com:basho/lager.git","master"}
Cloning into 'lager'...
Host key verification failed.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
ERROR: git clone -n git@github.com:basho/lager.git lager failed with error: 128 and output:
Cloning into 'lager'...
Host key verification failed.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

ERROR: 'get-deps' failed while processing /usr/local/src/edis: rebar_abort
make: *** [erl] Error 1
```

あら、やだgitがclone出来ないって・・・
仕方ないので、rebar.configを直すよ
※どうやらgithubのsshキーがないPCでやると発生するようです。。。

```
$ vim ./rebar.config
-- {deps, [{lager,  "2.0.0", {git, "git@github.com:basho/lager.git",   "master"}},
++ {deps, [{lager,  "2.0.0", {git, "git://github.com/basho/lager.git",   "master"}},
--        {eper,   "0.60",  {git, "git@github.com:mhald/eper.git",      "HEAD"}},
++        {eper,   "0.60",  {git, "git://github.com/mhald/eper.git",      "HEAD"}},
```

気合いをいれてインストールし直し！

```
$ make
$ make install
```
ちゃんとインストールされているか確認する

```
$ type edis
edis is /usr/local/bin/edis
```

やったねたえちゃん！！
でもうごかねーよ。。。。。
起動できねーお。。。。だれか教えて・・・


**ポリドッグ先生の次回作にご期待ください**
【覚え書き】AWS Elastic BeanstalkからRDSへ接続

※ローカル環境で、node.jsを使って開発してるときのお話。

http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_nodejs.rds.html
に書いてあるサンプル

```javascript
var mysql = require('mysql');

var connection = mysql.createConnection({
  host     : process.env.RDS_HOSTNAME,
  user     : process.env.RDS_USERNAME,
  password : process.env.RDS_PASSWORD,
  port 	   : process.env.RDS_PORT
});
```

って、つまり、シェルの環境変数に設定しとけってことのようだ。
こんな感じ。

```bash
$ export RDS_HOSTNAME=hogehoge.us-west-2.rds.amazonaws.com
$ export RDS_USERNAME=username
$ export RDS_PASSWORD=pass
$ export RDS_PORT=3306
```

ホストネームに設定するのは、"Services"->"RDS"->"DB Instances"から
EB(Elastic Beanstalk)に結びつけられてるデータベースを選ぶと、
下にいろいろ表示されたなかの"Endpoint:"のとこの長いやつ。

これだけだと、セキュリティの問題（？）で接続できないので、
左側にある"DB Security Groups"を選ぶ。
すると、右側にセキュリティグループが表示されるから、
EBに結びつけられたデータベース用のを選ぶ。
で、下に詳細が表示されるので、"CIDR/IP"の説明欄に表示されている
自分のPCのIPアドレスをいれて、"Add"ボタンを押す。
これで接続出来るようになったけど、常時接続じゃないとか
プロクシとか使ってる場合は別の方法を考えたほうがいいだろう。



あとは、直接MySQLに接続したいときには次のようにする。

```bash
mysql -u username -p --host=hogehoge.us-west-2.rds.amazonaws.com
```

すると無事、EB用のMySQLに接続できるので、"CREATE DATABASE"したり、
"CREATE TABLE hoge"できるようになる。

>ユーザーネームとパスワードは、RDSを作成するときに登録したものを使う。
Haml で html_safe を使う (Rails 以外で)


`haml-4.0.2/lib/haml/template.rb` を参考にした。環境は下記の通り。

- ruby 2.0.0-p0
- haml 4.0.2
- activesupport 3.2.13

必要なのは...

1. `active_support/core_ext/string/output_safety` で `String#html_safe` など追加
2. `Haml::Util#rails_xss_safe?` が `true` を返す様にする
3. `Haml::Helpers` に `Haml::Helpers::XssMods` を `include`
4. `Haml::Engine` のコンストラクタで `escape_html: true` 指定

```ruby
require "active_support/core_ext/string/output_safety"
require "haml"
require "haml/helpers/xss_mods"

Haml::Util.class_eval do
  def rails_xss_safe?
    true
  end
end

Haml::Helpers.class_eval do
  include Haml::Helpers::XssMods
end

haml = <<-HAML
= "<script>alert('1');</script>"
= "<script>alert('1');</script>".html_safe
HAML

puts Haml::Engine.new(haml, escape_html: true).render
```

```html
&lt;script&gt;alert(1);&lt;/script&gt;
<script>alert(1);</script>
```
JPAでページネーション

`from` と `fetch` で絞り込みます。

```java
public List<Account> findBySizeAndPage(int size, int page) {
    int start = page * size;
    List<Account> accounts = Account.find("order by accountId").from(start).fetch(size);
}
```

## 参考

* [Documentation: jpa — Playframework](http://www.playframework-ja.org/documentation/1.2.5/jpa#finding)
* [java - Play Framework - Pagination using JPA - Stack Overflow](http://stackoverflow.com/questions/7556889/play-framework-pagination-using-jpa)
SublimeText2のプラグインを作ってみた

##ペースト時にクリップボード中の「%s」を選択している箇所の文字列と置換してペーストする

クリップボード中に「ほげほげ%sふがふが」こういう文字列があるとき、
文字列「hogehoge」を選択した状態でCtrl+bを行うと
「ほげほげhogehgoeふがふが」のような形でペーストするだけのプラグインを習作として作ってみました。

### プラグイン本体（python）
```python:ReplePaste.py
import sublime, sublime_plugin

class RepleCommand(sublime_plugin.TextCommand):
	def run(self, edit):
		clip = sublime.get_clipboard()
		for sel in self.view.sel():
			if not sel.empty():
				rep = clip % self.view.substr(sel)
				self.view.replace(edit, sel, rep)
```

### キーマップ
```Default.sublime-keymap
[  
    {  
        "keys": ["ctrl+b"], "command": "reple"  
    }  
]
```
GitLab 4.0 -> 5.1におけるNetworkの変更点をまとめてみる

GitLab 4.0 -> 5.1 にかけて、私が行ったNetworkの変更点のまとめてみました。CHANGELOGでは説明されていない内容について、実際のプルリクへのリンクを含めて、簡単に解説します。
なお、実際に動かしたい場合は[公式のデモページ](http://demo.gitlabhq.com/)が5.1になっているので試してみてください。

## 変更点

### 4.0 -> 4.1

1. マージコミットが分かり難い場合があるのを修正([#2260](https://github.com/gitlabhq/gitlabhq/pull/2260))

### 4.1 -> 4.2

1. セレクトボックスでメインブランチを変更する機能を追加([#2823](https://github.com/gitlabhq/gitlabhq/pull/2823))
2. Networkにおかしな線が表示される不具合を修正([#2709](https://github.com/gitlabhq/gitlabhq/pull/2709))
3. 最新コミットのツールチップが見切れる不具合を修正([#2769](https://github.com/gitlabhq/gitlabhq/pull/2769))
4. Netwokの線が重なって、マージが分かり難いのを改善([#2847](https://github.com/gitlabhq/gitlabhq/pull/2847))
5. コミットをクリックした時に、新しいウィンドウを開くように変更([#2852](https://github.com/gitlabhq/gitlabhq/pull/2852))

### 4.2 -> 5.0

1. Network上のコミットをSHAで検索するテキストボックスを追加([#2910](https://github.com/gitlabhq/gitlabhq/pull/2910))
2. リベースしたコミットがクルクルして表示されるのを改善([#2910](https://github.com/gitlabhq/gitlabhq/pull/2910))

### 5.0 -> 5.1

1. Networkの向きを横方向から縦方向に変更([#3258](https://github.com/gitlabhq/gitlabhq/pull/3258))
2. Network上にコミットメッセージとAuthorのアイコンを表示するように変更([#3258](https://github.com/gitlabhq/gitlabhq/pull/3258))
3. マージコミットのマージ元の場合のみ矢印を表示するように変更([#3288](https://github.com/gitlabhq/gitlabhq/pull/3288))
4. Netowk上にコミットのコメント件数を表示するように変更([#3369](https://github.com/gitlabhq/gitlabhq/pull/3369))

### (おまけ)5.1 -> master(5.2?)

1. Networkの表示速度を改善([#3741](https://github.com/gitlabhq/gitlabhq/pull/3741))
2. 画面の移動をドラッグ＆ドロップから縦スクロールバーに変更([#3741](https://github.com/gitlabhq/gitlabhq/pull/3741))
3. セレクトボックスでタグを選択したときに、選択したタグに画面が位置付かない不具合を修正([#3741](https://github.com/gitlabhq/gitlabhq/pull/3741))
4. 選択中のrefのみをフィルタする機能を追加([#3591](https://github.com/gitlabhq/gitlabhq/pull/3591))

## 注意点

サーバーのgitのバージョンが古いと、5.0 -> 5.1のアップデートでファイルが表示されなくなる問題があります。少なくとも、gitのバージョンを1.7.10以降であれば問題が発生しないようです。詳しくは[#3666](https://github.com/gitlabhq/gitlabhq/issues/3666)を参照して下さい。
また、途中のバージョンをスキップして最新版にアップデートするのは難しいみたいなので、アップデートガイドに従い一つずつアップデートするのが良いかと思います。

## 最後に

GitLab4.0以降にNetworkが大きく改善されています。この記事で興味を持っていただけたら、この機会に最新版にアップデートしてみてはいかがでしょうか？
それと、Networkについてフィードバックをお待ちしております。
Qiita APIへの要望


Qiita APIを使ったiOSアプリ作ろうかと思いましたが、下記3つのAPIが追加されればいいなと思います

- ページネーションの取得範囲条件に記事id指定を増やして欲しい
- ユーザーのストックされた回数
- フィード取得API

## ページネーションの取得範囲条件に記事id指定を増やして欲しい

iOS端末ローカルに記事一覧を保存しておこうとすると、保存している記事より過去の一覧を取得しようとしてもpageパラメータだけでは取得したいものを特定できません。また、保存している記事から無駄なく最新だけを取得しようとすることも同じように特定できないんですよね。

なので、例えばTwitter APIのmax_idやsince_idのように指定するid以前の記事を取得、以後の記事を取得するような条件を付けられればいいかなと思います。


## ユーザーのストックされた回数

記事単体のストック数ではなく、ユーザーあたりのストックされた回数が意外とユーザーのモチベーションになります。特定ユーザーの情報取得APIで取得したいですね。

## フィード取得API

自分のフィードを見ることが出来れば嬉しいんですが
Node.js + ArduinoでLEDを光らせる。

いままではFlashやProcessingを使ってPCとArduinoを連携させていましたが、
Node.jsでも結構簡単に制御できることを知ったのでメモしておきます。


【用意するもの】
・Arduino
・Node.jsの動く環境
・duino（ https://github.com/ecto/duino ）

1. なんとかしてNode.jsの動く環境を用意する
2. duinoをインストールする
3. duino/src/du/du.ino をArduinoに書き込む
4. LEDをA0ピンとGNDピンに繋ぐ
5. duino/examples/led.jsを実行

これでLDEが点滅するはずです。

ソースコードをみてみましょう。

```javascript:duino/examples/led.js
// duinoのインポート
var arduino = require('../');

// Arduinoボードオブジェクトの作成
var board = new arduino.Board({
  debug: true // デバッグモードをON
});

// LEDオブジェクトの作成
var led = new arduino.Led({
  board: board, // ボードの選択
  pin: "A0" // 出力ピンの選択
});

// ボードの準備完了に対してコールバック関数を登録
board.on('ready', function(){
    led.blink(); // LEDを点滅させる
});
```

あとは、Arduinoに書き込んだ duino/src/du/du.ino がなんとかしてくれます。
おそらくArduinoのAPIをJSで叩けるようにしてくれているのでしょう。
ライブラリのおかげで非常に直感的にかけるのではないでしょうか。

```java:blink.ino
// 使用するピンを変数に代入
int led = A0;

// セットアップ（1度だけ実行）
void setup() {
    // ピンを出力に設定
    pinMode(led, OUTPUT);     
}

// ループ処理（電源供給しているかぎりループで実行）
void loop() {
    analogWrite(led, 255); // LEDをON
    delay(1000); // 1000ms待機
    analogWrite(led, 0); // LEDをOFF
    delay(1000); // 1000ms待機
}
```

と、こんなこんなに感じになります。

お気づきの方も多いかと思いますが、
実はこの段階では、コード自体にそんなに大差はありません。
むしろNode.jsを使わなければ電源供給のみで動作させることができるので、
この程度のコードであればArduinoのみで動かしたほうがよさげです。

例えば、Twitterと連動させてLEDを光らせたいときなど、
サーバサイドとの連携が必要なときこそNode.js、duinoの出番です。
用途によってうまく使い分けていきたいと思います。

※ Arduino UNO, Macbook Pro (OS 10.7.5), Node.js (v0.8.22) にて確認
グループ開発時の権限設定 


チームで一つのサーバーにログインして
一つのファイルをみんなで編集を行う場合には
グループ権限を活用する必要がある

その時の設定方法をまとめておく


# ファイル作成時の権限

最初にユーザーが作成するファイルの権限を
グループ権限付きのものに変更するための設定を行う。

現在の権限を確認するためには

    umask

を使用する。
`umask`で出力される値は通常`0022`だと思われる。
これは「自分以外のユーザーは書き込みを行わせない」という権限の設定になる。

以下の説明が詳しい

> umaskコマンドでは、許可しないビットを指定する。従って、読み書きを行う設定（666）から設定したいパーミッションを引き算すれば、指定する値が求められる。

参照 : [ファイル新規作成時のパーミッションを変更するには] (http://www.atmarkit.co.jp/flinux/rensai/linuxtips/474deffilepermssion.html)

と、あるので、今回のような場合では

    umask 002

とすれば同じグループなら書き込み、読み込みが出来るファイルを標準で作成することが出来る。
このコマンドを毎回ログインするたびに入力するのはイケテナイでの`.bashrc`に記述をしておく。

    echo umask 002 >> ~/.bashrc

`.bash_profile`でも良いが`sftp`や`screen`を使用した際には`.bash_profile`は読み込まれないので
`.bashrc`に設定を記述しておいた方が良い。

そして、その記述を毎回ユーザーが作られるたびに実行させるのもイケテナイので

ユーザーが作成された時に作られるファイル郡が置いてある`/etc/skel`の中の`.bashrc`に記述を追加しておく。

    sudo sh -c "echo umask 002 >> /etc/skel/.bashrc"

ログインしなおして`umask`を打って002が表示されれば完了

# グループの作成、追加

次に開発時のグループ作成、グループ指定でのユーザー作成。
グループを`dev`とする

    sudo groupadd dev
    sudo adduser -g dev mugi

ユーザーを後からグループに追加するとき

    sudo usermod -g dev mugi

グループを指定してユーザーを作成、追加する時に
`-g`のオプションを付けているが
これはプライマリーのグループ指定を行っている。

これによって作成されるファイルが`dev`グループで作成がされる。
プライマリーのグループでファイルが作成されるということ。

プライマリーのグループと編集時のグループを別にする場合には別途手順が必要になると思われる。
各自必要であれば調べてコメントにでも書き込んでくれると嬉しいです。


これで完了。
グループ間で同じファイルの編集が可能になる。

# sambaを使用した編集時

`smb.conf`でグループ権限付きでファイルが作成するように設定を書いてあげれば良い

    sudo vi /etc/samba/smb.conf

```smb.conf
# ファイル作成時のパーミッション設定
force create mode = 0664
create mask = 0664
# ディレクトリ作成時のパーミッション設定
force directory mode = 0775
directory mask = 0775

force group = dev
```

# まとめ

ポイントとして

- グループの書き込み権限
- 指定グループでのファイル作成

が出来るようになればグループ間で同じファイルを編集することが出来る

# トラブルシューティング

一人でもグループ権限が付いていない設定になっていたりすると
グループ権限が付いていないファイルが出来てしまう。
そうなるとグループの他のメンバーが書き込みすることが出来なくなるので
解決をする必要がある。

その時の助けになるであろうコマンドたち

グループ権限が付いていないファイルを表示

    find . ! -perm -g+w -type f

devグループでファイルが作成されていないファイルの表示

    find . ! -group dev

とりあえずディレクトリ以下のファイル全部をdevグループのユーザーが書き込めるように

    sudo chmod g+w -R .
    sudo chgrp -R dev .

ユーザーがどんな操作を行ったかのログの場所

    sudo less /var/log/secure
selectタグに空のvalueを追加する

単純に `#{option}` タグを追加するだけです。

```
#{select 'elementId', items: xxx, valueProperty:'id', labelProperty:'name', value: params.elementId }
  #{option}please select something...#{/option}
#{/select}
```

## 参考

* [How to add an empty option to select tag in playframework](http://whatsdev.blogspot.jp/2011/06/how-to-add-empty-option-to-select-tag.html)
[PC-6001] キー入力 & ジョイスティック入力

#キー入力
##BIOSを使う
```
call    $1061   ;Aregに状態が返ってくる
```
| bit7  |   bit6   | bit5 | bit4 | bit3 | bit2 | bit1 | bit0  |
|:-----:|:--------:|:----:|:----:|:----:|:----:|:----:|:-----:|
| SPACE | reserved |  ←  |  →  |  ↓  |  ↑  | STOP | SHIFT |
* 0:OFF, 1:ON
* BASICのSTICK(0),STRIG(0)に相当

#ジョイスティック入力
##BIOSを使う
```
ld      a,no    ;ジョイスティック番号(#1:$01,#2:$02)
call    $1CA6   ;Aregに状態が返ってくる
```
|  bit7-6   |   bit5   |   bit4   | bit3 | bit2 | bit1 | bit0 |
|:---------:|:--------:|:--------:|:----:|:----:|:----:|:----:|
| reserved  | TRIGGER1 | TRIGGER2 |  ←  |  →  |  ↓  |  ↑  |
* 0:OFF, 1:ON
* BASICのSTICK(n),STRIG(n)に相当（n=1~2）

ただし、BIOSの前半部分にバグがありPSGにノイズが乗ってしまうことがあるので、下記のようにして回避します。

```
entry:
        rrca
        rrca
        or      %10000000
        push    bc
        ld      b,a
        ld      a,$07   ;PSG/R7
        di
        out     ($A0),a
        in      a,($A2)
        ld      c,a
        ;ここまではBIOSからの抜粋
        or      %10000000       ;ここがBIOSでは ld a,%10000000 になっている
        jp      $1CB6           ;BIOSの途中に飛ぶ
```
Herokuでリクエストタイムアウトを検知する

heroku でWebサービスを運営している時って、監視系はみなさんどうしてますか？
おそらく定番アドオンである [New Relic](https://addons.heroku.com/newrelic) と [Air Brake](https://addons.heroku.com/airbrake) を使用していると思うのですが、これらでは heroku で発生するタイムアウトを検知できません。
30秒以内に応答返せなかったらってアレですね。

考えてみれば heroku の Error Code12 は例外がスローされてるわけじゃないので、Air Brake 対象外。
タイムアウト処理しているのは WebDyno じゃなくて heroku/router なので New Relic で捕捉できない、ってことのようで。
どうしようかなといろいろ調べましたが、結局 Papertrail の検索結果送信機能を使うことにしました。

Papertrail を使う
---

[Papertrail](https://addons.heroku.com/papertrail) は heroku のログ取り扱いアドオンです。
Logly と違ってログ内に日本語があっても正常に表示されるし、一定期間内のログを Web 上で閲覧することができます。
このログ閲覧機能がすごく優秀で、キーワード検索も時刻での検索もでき、検索条件の保存もできるので、もう手放せない存在になっています。
もちろん、Amazon S3 へ圧縮したログを自動で保存してくれます。

んで、この検索条件保存機能はただ保存するだけじゃなくて、検索条件に一致するログが記録された場合、それを通知することもできるようになっているんですね。
監視間隔を毎分、毎時、毎日に設定できるので、即時性がほしい場合も問題ないでしょう。
ちなみに毎日の場合、設定されているタイムゾーンの朝5時にバッチ実行されるようです。

通知方式はごく普通にメールのほか、いくつかのWebサービスを対象とすることもできます。コラボレーションツールの Campfire （日本のクラウドファンディングサービスとは多分無関係）とか、モニタリングツールの Boundary とか。

リクエストタイムアウトのログは、このように記録されています。

```
Apr 29 02:46:09 application-name heroku/router:  at=error code=H12 desc="Request timeout" method=GET path=/hogehoge/fugafuga/error_uri host=jobhub.jp fwd="192.168.0.1" dyno=web.2 connect=1ms service=30000ms status=503 bytes=0 
```

このログが引っかかるように検索条件を保存してアラート設定してあげると良いです。
主目的はタイムアウトの補足ですが、他のエラーも検知したいので、キーワードは `at=error code=` にしてみました。

* * *

実はこの辺の情報は、先日 heroku に実装された Production-Check 機能のヘルプで解説されています。
[Production Check|Heroku Dev Center](https://devcenter.heroku.com/articles/production-check#log-monitoring)
公式の方でも、ログのアドオンは Papertrail を推しているようですね。
NSArray内のオブジェクトでソートする

NSArrayで独自のオブジェクトを保持していて、そのオブジェクトのメンバーでソートする方法です。
例えば、Item内のNSDateでソートする場合は、、、

```objc:Item.h
#import <Foundation/Foundation.h>

@interface Item : NSObject

@property (strong, nonatomic) NSString *text1;
@property (strong, nonatomic) NSDate *date1;

- (NSComparisonResult)comparWithDate:(Item *)item;

@end
```

```objc:Item.m
#import "Item.h"

@implementation Item

- (NSComparisonResult)comparWithDate:(Item *)item
{
    NSComparisonResult result = [self.date1 compare:item.date1];

    // 日付の降順でソート    
    switch(result){
        case NSOrderedAscending:
            result = NSOrderedDescending;
            break;
        case NSOrderedDescending:
            result = NSOrderedAscending;
            break;
        case NSOrderedSame:
            break;
    }
    
    return result;
}

@end
```

NSComparisonResultを返す比較メソッド(comparWithDate)を定義、実装します。

で、Itemを保持しているNSArrayで、

```objc:Hoge.m
// 日付の降順でソート
itemArray = [itemArray sortedArrayUsingSelector:@selector(comparWithDate:)]; 
```

sortedArrayUsingSelectorで、Itemで定義した比較用のメソッド(comparWithDate)を指定して呼び出せばソートできます。
Herokuでアプリを公開する直前までのチュートリアル

[Getting Started with Heroku](https://devcenter.heroku.com/articles/quickstart)の日本語訳がないので、簡易版を書いてみます。Herokuでアプリを公開する**直前**までのチュートリアルです。

## Step 1: Herokuにアカウントを登録しましょう

[こちらのリンク先からherokuにアカウントを登録しましょう。](https://api.heroku.com/signup/devcenter)

## Step 2: Heroku Toolbeltというツールをインストールしましょう

[こちらのリンク先からHeroku Toolbeltというツールをインストールしましょう。](https://toolbelt.heroku.com/)

Herokuを使うためには必須のツールなので、忘れずにインストールしてくださいね！　MacでもWindowsでも使えますよ。

## Step 3: コマンドラインからログインしよう

Macならターミナル、Windowsならコマンドプロンプトを起動して、`heroku login`と打ち込んで下さい。

打ち込むと以下のようにメールアドレスとパスワードを聞かれるので、Step 1で登録したメールアドレスとパスワードを入力してください。

```bash
$ heroku login
Enter your Heroku credentials.
Email: adam@example.com
Password: 
Could not find an existing public key.
Would you like to generate one? [Yn]  ← ここで「Y」と入力して下さい。
Generating new SSH public key.
Uploading ssh public key /Users/adam/.ssh/id_rsa.pub
```

## Herokuでアプリを公開する準備が整いました！

これでいつでもHerokuにアプリを公開することができます！

あとはお好きな言語やフレームワーク別のチュートリアルをごらんください。

Have a nice trip!