OmniAICreator/Qiita-1.07M huggingface dataset:
ParseでクライアントサイドからRESTを使う場合の権限設定


例えばJavaScriptからParseのREST APIを呼ぶ場合、API KEYは第三者から参照可能になるので、REST APIでできることを制限しておく必要がある。

### 新規テーブルを作れないようにする

ParseではClassというけど、テーブルというほうが個人的にわかりやすいので、ここではテーブルということにする。

デフォルトではREST APIからテーブルを作ることができる。これをできないようにするにはParseのダッシュボードでアプリケーションのSettingから「App Permissions」の「Allow client class creation」を`OFF`にする。

![kobito.1395809453.561752.png](https://qiita-image-store.s3.amazonaws.com/0/12262/9b7b1359-52eb-331a-fc26-903614ea906e.png "kobito.1395809453.561752.png")


これでREST API KEYの権限では新規テーブルを作成できなくする。

ダッシュボードのData BrowserやMaster keyの権限では作成可能。

### テーブルの権限設定

Data Browserでテーブルを選択して`More`から`Set Permissions`を選ぶと、以下の項目ごとにパーミッションを設定できる。

* Get
* Find
* Update
* Create
* Delete
* Add fields

デフォルトで全部`Public`になっているので、操作されたくないものは権限を変更する。

例えば、大抵のテーブルはユーザーがカラム追加できるのは嬉しくないので`Add fields`を禁止するとか、データ固定のマスターデータみたいなものは`Create`、`Update`、`Delete`をできないようにするとか、管理者だけが利用するログみたいなデータは`Create`だけできて他はできないようにするとかが考えられる。


### 行ごとの権限設定

テーブルのそれぞれの行に対しても権限が設定できて、ACLというカラムに権限のデータを設定する。データを作ったユーザーだけ読み書きできるとか、そういう設定をするときに主に使う。

ACLを設定したデータの作成についてはこちらも参照のこと。

[ParseのREST APIでユーザー認証とデータの読み書き - Qiita](http://qiita.com/hokaccha/items/7254579330c2d5b4f39d)
screencaptureコマンド選択applescript

```applescript:screencapture.scpt
display dialog "select type" buttons {"Window+sub", "fullScreen", "Selection"} default button 1
set btsel to button returned of result

display dialog "set time" buttons {"3", "6", "8"} default button 2
set btnum to button returned of result as number

set myFilename to "~/Desktop/SS_" & (do shell script "date '+%y%m%d%H%M%S'") & ".png"

if btsel is "Window+sub" then
	do shell script "sleep " & btnum & " && screencapture -iCWS " & myFilename
else if btsel is "fullScreen" then
	do shell script "screencapture -CT" & btnum & " " & myFilename
else if btsel is "Selection" then
	do shell script "screencapture -isCT" & btnum & " " & myFilename
end if


(*

tell application "Adobe Photoshop CC"
	activate
	tell application "System Events"
		keystroke "n" using command down
		keystroke return
		keystroke "v" using command down
	end tell
end tell

*)
```

Window+subは、ダイアログ中のpull-down　menuも同時にキャプチャする。
和暦を手軽に扱いたい


[era_ja](https://github.com/tomiacannondale/era_ja)を使用することで、Railsのビューなどで和暦を手軽に扱うことができる。

## era_jaのインストール

Gemfileに以下を記述して bundle install を実行。

```
gem 'era_ja'
```

## セットアップ

`Date`や`Time`を拡張するためのモジュールをロードする必要があるため、Railsであれば`config/initializers/era_ja.rb`などを用意して以下を記述する。

```ruby
require 'era_ja/time'
require 'era_ja/date'
```

## 日付や日時を和暦で表示する

`Date`や`Time`がきちんと拡張されていれば、和暦を良い感じに扱えるようになっている。

```ruby
> Date.today.to_era
=> "H26.03.26"
> Date.today.to_era("%O%E年%m月%d日")
=> "平成26年03月26日"
> Date.today.to_era("%O%JE年%Jm月%Jd日")
=> "平成二十六年三月二十六日"
```

## 参考

* http://tomiacannondale.hatenablog.com/entry/20120616/1339861620
* https://github.com/tomiacannondale/era_ja
chef-client の実行をちょっとでも速くする

いろいろあると思うので、見つけ次第追記していこうと思ってます

# 必要ない ohai の plugin を無効にする

実行時にいろいろな plugin が load されているのですが、必要のないものは load しないようにすることで chef の実行をちょっとでも速くすることができます

## どの ohai の plugin がどれくらい load に時間かかっているか計測する

* [本家のwiki](https://wiki.opscode.com/display/chef/Disabling+Ohai+Plugins) に記述されているこちらの [gist](https://gist.github.com/nstielau/1323597) を実行することで計測できます

* 自分の環境の場合ですが、ldap で user 管理をしているので passwd の plugin が一番時間かかっていました

## /etc/chef/client.rb で plugin を無効にする

* [本家のwiki](https://wiki.opscode.com/display/chef/Disabling+Ohai+Plugins) に記述されている通り、``
Ohai::Config[:disabled_plugins]`` を設定してあげましょう

# search を使っている場合は search の仕方を工夫してみる

* やはり search は少なければ少ないほどいいでしょう
* [こちらのblog](http://engineering.voxer.com/2013/03/22/chef-part-2-performance/) に工夫の仕方が書いてありますので参考にどうぞ
c# コレクションを連結して文字列化する

コレクションの値を連結して一つの文字列にしたい場合、文字列型に用意された静的メソッドの`string.join<T>()`を利用できます。しかし、この場合、コレクションの要素に対して`T.ToString()`が呼ばれるだけなので、`DateTime`のリストを任意の書式で連結したいなど、時として物足りない場合がでてきます。

あと、文字列型の静的メソッドというのも何だか気に入りません。

そこで、コレクションの要素に対してデレゲートを利用して任意の書式に変換できるようにしたjoinを`IEnumerable`の拡張メソッドにしてみました。

## サンプルコード

```csharp
public static class IEnumerableUtil
{
        public static string JoinString<T>(this IEnumerable<T> values, string separator, Func<T, string> converter = null)
        {
            if (converter != null)
            {
                List<string> buff = new List<string>();
                foreach (var item in values)
                    buff.Add(converter(item));
                return string.Join(separator, buff);
            }
            else
                return string.Join(separator, values);
        }
}
```

※ `IEnumerable`には既に`Join`という同名のメソッドが存在したため、`JoinString`に変更しました。(2014.3.27)

## 使い方

`IEnumerable`に対して拡張メソッドを定義しているので、List<T>はもちろん単純な配列に対しても呼び出すことができます。

```csharp
static void JoinTest()
{
    Console.WriteLine((new int[] { 10,23,46,54,82  }).JoinString(","));
    Console.WriteLine((new DateTime[] { 
        new DateTime(2014,1,1), 
        new DateTime(2014,2,2), 
        new DateTime(2014,3,18) 
    }).JoinString(",", v => v.ToString("yyyy年MM月dd日")));
}
```

## 出力例

> 10,23,46,54,82
2014年01月01日,2014年02月02日,2014年03月18日


## 追記：Select() を利用したバージョン (2014.3.27)

コメント欄で`Select()`を利用した方が良いのでは？という指摘をいただきました。恥ずかしながら`Select()`というメソッドの存在を知らなかったのですが、rubyなどでいう`map`に相当するメソッドのようです。

`Select()`を利用することで上記コードは以下のように簡潔に記述することができました。

```csharp
// Select()利用バージョン
public static class IEnumerableUtil
{
    public static string JoinString<T>(this IEnumerable<T> values, string glue, Func<T, string> converter = null)
    {
        if (converter != null)
            return string.Join(glue, values.Select(converter));
        else
            return string.Join(glue, values);
    }
}
```
valid なのに ActiveRecord の保存に失敗する

症状
-------

- モデルの保存に失敗する
- errors.messages は空
- ちゃんと valid だ
- before_save などコールバックを使用している

原因
-------

コールバック内にて false を 返した場合、以降の処理はキャンセルされる。
意図せず保存に失敗してしまう例。

```rb
class User < ActiveRecord::Base

  before_save   :set_flag

  def set_flag
    self.my_flg = false
  end
end
```


対応
-------

コールバック内では return true する


参考
-------

```
If a before_* callback returns false, all the later callbacks and the associated action are cancelled. If an after_* callback returns false, all the later callbacks are cancelled.
```
[ActiveRecord::Callbacks](http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html)
コマンドラインで集合演算

コマンド出力の差分に対してとある処理をしたかったので汎用部分をまとめてみた
入力A
```$ cat A
a
b
c
a
b
c
```
入力B
```$ cat B
A
b
C
A
b
C
```
積集合
```$ join <(cat A|sort -u) <(cat B|sort -u)
b
```
差集合
```$ cat <(cat A|sort -u) <(join <(cat A|sort -u) <(cat B|sort -u) ) | sort | uniq -u
a
c
```
C#のDateTime型に月初日や月末日を取得するメソッドを追加する

業務用のアプリケーションを作成していると、何かと日付の比較をすることが多くて、その中である年月の月初日や月末日が必要になることもままあります。

残念ながらc#の`DateTime`型には月初日や月末日を求めるメソッドは用意されていないので、サンプルコードのような日時関連の処理をまとめた拡張メソッドを作って利用してます。

## サンプルコード
```csharp:DateTimeUtil.cs
/// <summary>
/// DateTime型拡張メソッド定義
/// </summary>
public static class DateTimeUtil
{
    private static readonly int FiscalYearStartingMonth = 4;

    /// <summary>
    /// 該当年月の日数を返す
    /// </summary>
    /// <param name="dt">DateTime</param>
    /// <returns>DateTime</returns>
    public static int DaysInMonth(this DateTime dt)
    {
        return DateTime.DaysInMonth(dt.Year, dt.Month);
    }

    /// <summary>
    /// 月初日を返す
    /// </summary>
    /// <param name="dt">DateTime</param>
    /// <returns>Datetime</returns>
    public static DateTime BeginOfMonth(this DateTime dt)
    {
        return dt.AddDays((dt.Day - 1) * -1);
    }

    /// <summary>
    /// 月末日を返す
    /// </summary>
    /// <param name="dt">DateTime</param>
    /// <returns>DateTime</returns>
    public static DateTime EndOfMonth(this DateTime dt)
    {
        return new DateTime(dt.Year, dt.Month, DaysInMonth(dt));
    }

    /// <summary>
    /// 時刻を落として日付のみにする
    /// </summary>
    /// <param name="dt">DateTime</param>
    /// <returns>DateTime</returns>
    public static DateTime StripTime(this DateTime dt)
    {
        return new DateTime(dt.Year, dt.Month, dt.Day);
    }

    /// <summary>
    /// 日付を落として時刻のみにする
    /// </summary>
    /// <param name="dt">DateTime</param>
    /// <param name="base_date">DateTime* : 基準日</param>
    /// <returns>DateTime</returns>
    public static DateTime StripDate(this DateTime dt, DateTime? base_date = null)
    {
        base_date = base_date ?? DateTime.MinValue;
        return new DateTime(base_date.Value.Year, base_date.Value.Month, base_date.Value.Day, dt.Hour, dt.Minute, dt.Second);
    }

    /// <summary>
    /// 該当日付の年度を返す
    /// </summary>
    /// <param name="dt">DateTime</param>
    /// <param name="startingMonth">int? : 年度の開始月</param>
    /// <returns>int</returns>
    public static int FiscalYear(this DateTime dt, int? startingMonth = null)
    {
        return (dt.Month >= (startingMonth ?? FiscalYearStartingMonth)) ? dt.Year : dt.Year - 1;
    }
}
```

```csharp:program.cs
class Program
{
    static void Main(string[] args)
    {
        DateTime now = DateTime.Now;

        Console.WriteLine("現在時刻は{0:yyyy年MM月dd日HH時mm分ss秒}です。", now);
        Console.WriteLine("月初日：{0:yyyy年MM月dd日}", now.BeginOfMonth());
        Console.WriteLine("月末日：{0:yyyy年MM月dd日}", now.EndOfMonth());
        Console.WriteLine("今月は{0}日あります。", now.DaysInMonth());
        Console.WriteLine("{0}年度", now.FiscalYear());
        Console.WriteLine("日付のみにする：{0:yyyy年MM月dd日HH時mm分ss秒}です。", now.StripTime());
        Console.WriteLine("時刻のみにする：{0:yyyy年MM月dd日HH時mm分ss秒}です。", now.StripDate());
        
    }
}
```

## 実行結果の例

> DateTimeTest.exe
現在時刻は2014年03月19日11時19分08秒です。
月初日：2014年03月01日
月末日：2014年03月31日
今月は31日あります。
2013年度
日付のみにする：2014年03月19日00時00分00秒です。
時刻のみにする：0001年01月01日11時19分08秒です。
CSVファイルを結合する

コマンドプロンプトでは

```
> copy *.csv output.csv
```

とするとカレントディレクトリ内のCSVを容赦なく結合できていましが、PowerShell で同じコマンドを打っても怒られてしまいます。

PowerShell で同じ事ができないかというとそんなことはなくて、Get-Contentコマンドを利用すると概ね同じ様な処理をすることができます。

```PS1
> Get-Content *.csv > output.txt
```

最後に`output.txt`を`output.csv`に変更しておいてください。

`Get-Content`コマンドでCSVファイルの中身を標準出力に出力する代わりに新しい~~CSV~~テキストファイルに送り込んでいるわけです。
`Get-Content`コマンドには`cat`というエイリアスも割り当てられているので

```ps1
> cat *.csv > output.txt
```

としても同じ結果が得られます。

この結合の方法ではCSVファイルだけではなく、テキストベースのファイルならなんでも結合できるので便利です。
ただし、構造化されているテキストファイルをむやみに結合すると、パーサーに突っ込んだときに正しい内容が表示されないことがあるのでその辺は注意が必要です。

##追記
コメント欄でご指摘をいただいた通り、最初の投稿のまま実行するとCSVを再帰的に取得・出力してしまい処理が終わりません。 
出力先ファイルの拡張子を変更するか、他のフォルダに出力先ファイルを指定する必要があります。 

どうしても同じフォルダにイッパツで作りたい場合はこんなコマンドでイケました。 
結構めんどいですね…。 

```ps1
PS1> dir *.csv -name | % { cat $_ >> output.csv } 
```

##さらに追記

CSVファイル名群を一回変数に入れておくと同じフォルダに結合したCSVを出力できますが、長くなってめんどいですね。

```ps1
dir *.csv | sv csvArray;$csvArray | % { cat $_ } >> merged.csv
```

余談ですが、PowerShell のプロンプトからリダイレクトでテキストファイルを作ると文字のエンコードがUTF16LE-BOMとかになるのでOut-Fileで文字コード指定した方が不幸になりにくそうです。

```ps1
dir *.csv | sv csvArray;$csvArray | % { cat $_ } | Out-File merged.csv -Encoding default
```
New Relic Deployment API を使ってレコーディング・デプロイメント


## New Relic
パフォーマンスモニタリングに [New Relic](http://newrelic.com/application-monitoring) を使っています。

[Python Agent](https://docs.newrelic.com/docs/python/) と、[newrelic_sysmond](http://docs.newrelic.com/docs/server/) を入れるだけでアプリケーションとサーバ両方のモニタリングをしてくれて、性能問題やトラブルが手早く解決できるようになりました。

[iOS App](http://newrelic.com/mobility) もあり、いつでもサーバの状態がチェックできて心理的な安心感も得られます。

そんな使いだすと離れられない New Relic ですが、サーバへのデプロイ時刻を記録する機能があります。メリットは大きく分けて二点。

1. ダッシュボードにデプロイした時刻がプロットされる（チームメンバーへの自然な共有）
2. デプロイ前後のパフォーマンスを比較できる（デプロイの影響を測定）

導入も簡単なのでオススメです。

## New Relic Deployment API
デプロイの記録は New Relic Deployment API を叩くだけです。
標準的な REST API なのでここではお手軽な curl を使います。

    curl -H "x-api-key:REPLACE_WITH_YOUR_API_KEY" -d "deployment[app_name]=REPLACE_WITH_YOUR_APP_NAME" https://api.newrelic.com/deployments.xml

上記だけでも単純な記録は可能ですが、デプロイした人以外が確認したときに何をしたのかわかるように設定値を工夫してみました。

| POST パラメータ | 概要 |
|:------- |:------|
|deployment[description]|デプロイにかかった時間とデプロイ前後のコミットの [GitHub Compare View](https://help.github.com/articles/comparing-commits-across-time) の URL|
|deployment[revision]|```git rev-parse --short HEAD``` で取得した commit-ish |
|deployment[changelog]|```git --no-pager log --format=%s -1 HEAD``` で取得した commitlog|
|deployment[user]|デプロイユーザー名|

デプロイユーザー名の取得は ```(trap 'osascript -e "long user name of (system info)"' EXIT; getent passwd $USER | cut -d: -f5 | cut -d,  -f1) || whoami``` みたいな豪快ワンライナーで Linux, OSX 両対応しつつチームメンバーのフルネームを取得しています。

また、デプロイ時にほぼ同等の情報を HipChat にも通知してカジュアルな共有も行っています。

## 参考
* [Deployments dashboard](https://docs.newrelic.com/docs/applications-menu/deployments-dashboard)
* [Recording deployments](https://docs.newrelic.com/docs/features/getting-started-with-the-new-relic-rest-api#deploy)
OSXのSublimeText2でファイルのフルパスを表示する

MacOSXのSetting - Defaultでファイルのフルパスを表示するよう以下の設定となっているのにフルパスが表示されない。

```json:Preferences.sublime-settings
{
  "show_full_path": true
}
```

設定のコメント文をよく見ると以下のように書いてありました。

> // Show the full path to files in the title bar.
> // On OS X, this value is overridden in the platform specific settings, so
> // you'll need to place this line in your user settings to override it.

MacOSXでは、Setting - Userに`"show_full_path": true`の一文を追加する必要があるよとのことでした。


参考サイト

* [Option to display the full path of the current file ... / General forum / Sublime Text]( http://sublimetext.userecho.com/topic/41646-option-to-display-the-full-path-of-the-current-file-in-the-window-title/ )
valgrindで不要なエラーを抑制する


valgrindを実行すると、空のmain関数でも以下のようなエラーが報告される場合があるが、リンクしてるライブラリ内でのエラーなので無視したい。


```
==12059== ERROR SUMMARY: 7 errors from 7 contexts (suppressed: 0 from 0)
==12059==
==12059== 1 errors in context 1 of 7:
==12059== Conditional jump or move depends on uninitialised value(s)
==12059==    at 0x400AF37: (within /lib/ld-2.11.3.so)
==12059==    by 0x40038C3: (within /lib/ld-2.11.3.so)
==12059==    by 0x4014A76: (within /lib/ld-2.11.3.so)
==12059==    by 0x4001422: (within /lib/ld-2.11.3.so)
==12059==    by 0x4000AF7: (within /lib/ld-2.11.3.so)
==12059==    by 0x0: ???
==12059==    by 0x7FF000916: ???
```

### 対応方法

通常は単にvalgrindパッケージをアップデートするだけでよい。

```
apt-get install valgrind
```



それでもだめなら以下をみて`supp`ファイルを書く。

http://valgrind.org/docs/manual/manual-core.html#manual-core.suppress

### 説明

valgrindは`supp`ファイルを記述することで、特定の条件のエラーを抑制することができる。

debianパッケージから入れたvalgrindであれば、`ld`や`libc`等の主要なものに関しては`/usr/lib/valgrind/`以下であらかじめ抑制されるようになっている。

この設定はオブジェクトファイルのバージョンに依存しているので、システムをアップデートしたりするとはずれてしまう場合がある。




参考： http://d.hatena.ne.jp/pyopyopyo/20070104/p1
pager に lv を使っていて、しかし ```git grep``` ではスクリーンに結果を残したい



grep の時には pager を使わないようにする。

```
[pager]
  grep = false
```

pager に lv を使っていると、 lv から抜けたときにスクリーンから結果が消去されてしまうので困っていた。
```git grep foo | cat``` などとしていたが解決した。
ネットワーク再接続の間隔

Javaでタグ付けしていますが、わりと一般論です。

##はじめに
一般論として、サーバに接続する際エラーが発生すると、即座に再接続しても接続できない可能性も高く、接続できる可能性も高いです。

しかし、エラーによって接続できるまで再接続を繰り返した場合、再接続できない可能性が高くなり、接続できる可能性は低くなる傾向にあります。

ネットワーク機器への負荷を考慮すると、最初は短い間隔で再接続を行い、徐々に間隔を長くするのが理想的であると言えます。

##間隔を求める
「最小の間隔」、「最大の間隔」、「最大の間隔に到達するまでのエラー回数」の3つの定数と、エラー回数を使って間隔を求めます。

```java:
// 最大の間隔に到達するまでのエラー回数
public static int MAX_ERRORS = 32;
// 最大の間隔
public static long MAX_INTERVAL = 120000;
// 最小の間隔
public static long MIN_INTERVAL = 1000;

public static long getInterval(int numErrors) {

	// 初回(まだエラーがない場合は0を返す)
	if (numErrors <= 0) {
		return 0L;
	}

	// エラー回数を最大に丸める
	if (numErrors > MAX_ERRORS) {
		numErrors = MAX_ERRORS;
	}

	// エラー回数1からMAX_ERRORSまでを0.0から1.0の値にする
	double r = ((double) (numErrors - 1)) / ((double) (MAX_ERRORS - 1));
	// 二乗する(お好みで)
	r = r * r;

	// 線形補間して間隔を求める
	double min = (double) MIN_INTERVAL;
	double max = (double) MAX_INTERVAL;
	double interval = min + (max - min) * r;

	return (long) interval;
}

public static void main(String[] args) {
	for (int i = 0; i < 40; i++) {
		System.out.println(i + ":" + getInterval(i));
	}
}
```

##出力結果
```
0:0
1:1000
2:1123
3:1495
4:2114
5:2981
6:4095
7:5457
8:7067
9:8925
10:11030
11:13382
12:15983
13:18831
14:21927
15:25270
16:28861
17:32700
18:36786
19:41120
20:45702
21:50531
22:55608
23:60933
24:66505
25:72325
26:78393
27:84708
28:91271
29:98082
30:105140
31:112446
32:120000
33:120000
34:120000
35:120000
36:120000
37:120000
38:120000
39:120000
```

##まとめ
接続に成功した時や、システムからの通知により接続ができるようになったのがわかった時は、エラー回数を0に戻す必要があります。

間隔を決めるにあたって二乗しているところがありますが、これは好みの問題です。二乗するのを止めると増分が一定になります。```r = 1.0D - (1.0D - r) * (1.0D - r);```のような式もありかもしれません。
Objective-Cでシングルトンなインスタンスを生成

GCDのdispatch_once関数を使って下記の様に書きます。
dispatch_onceの引数に渡したブロックはアプリケーションスコープで1度のみ実行されることが保証されるとのこと。

```objc:SingletonSample.h
@interface SingletonSample : NSObject
+ (instancetype)sharedInstance;
@end

```

```objc:SingletonSample.m
+ (instancetype)sharedInstance
{
    static id instance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [self new];
    });
    return instance;
}
```
hubコマンドの接続先を変える


Enterpriseなんかでは`github.com`以外の場所に接続すると思いますがその時の設定変更方法です。

## リポジトリ単位

```bash
$ hub config hub.host hostname
```

## 全体

```bash
$ hub config --global hub.host hostname
```

## 設定の確認

```bash
$ hub config --list
$ hub config --list --global
```
MySQL の ALTER TABLE ... SET DEFAULT は速い

`ALTER TABLE ... SET DEFAULT` はデータを変更しないので速いです。


適当に大量の行を持つテーブルを作ります。

```sql
create table t (id int not null primary key auto_increment);
insert into t () values ();
insert into t select null from t;
insert into t select null from t;
insert into t select null from t;
insert into t select null from t;
insert into t select null from t;
insert into t select null from t;
insert into t select null from t;
insert into t select null from t;
insert into t select null from t;
insert into t select null from t;
insert into t select null from t;
insert into t select null from t;
insert into t select null from t;
insert into t select null from t;
insert into t select null from t;
insert into t select null from t;
insert into t select null from t;
insert into t select null from t;
insert into t select null from t;
insert into t select null from t;

select count(*) from t;
/* 1048576 */
```

列追加はテーブル作りなおしなのでとても遅いです。

```console
$ time mysql test -e 'alter table t add val int not null'

real    0m5.291s
user    0m0.002s
sys     0m0.002s
```

NULL 制約の付け外しも列の変更なのでとても遅いです。

```console
$ time mysql test -e 'alter table t change val val int null'

real    0m4.871s
user    0m0.002s
sys     0m0.001s

$ time mysql test -e 'alter table t change val val int not null'

real    0m4.578s
user    0m0.003s
sys     0m0.001s
```

デフォルトの変更は `ALTER ... SET DEFAULT` を使えば高速です。

```console
$ time mysql test -e 'alter table t alter val set default 2'

real    0m0.018s
user    0m0.002s
sys     0m0.000s

$ time mysql test -e 'alter table t alter val drop default'

real    0m0.017s
user    0m0.003s
sys     0m0.000s
```

---

例えばこんな時・・・

 - あるテーブルに列を追加する
 - 追加する列のデフォルト値は 1
 - ただし既存の行には全部 2 を設定する

この変更は・・・

```sql
alter table t add val int not null default 1;
update t set val = 2;
```

とするよりも・・・

```sql
alter table t add val int not null default 2;
alter table t alter val set default 1;
```

としたほうが早い。
route.rbでパラメータを制限する


こういうresourcesを定義した場合

```
resources :histories
```

```
histories GET /histories(.:format) histories#index
                                                
POST /histories(.:format) histories#create
                                    
new_history GET /histories/new(.:format) histories#new
                                   
edit_history GET /histories/:id/edit(.:format) histories#edit
                                        
history GET /histories/:id(.:format) histories#show
                                                
PATCH    /histories/:id(.:format) histories#update
                                                
PUT      /histories/:id(.:format) histories#update
                                                
DELETE   /histories/:id(.:format) histories#destroy
```

ルーティングルールはこんな感じになる。

で、:idは6桁の数字のみに限定したいな〜なんて時は

```
resources :histories, constraints: {id: /\d{6}/}
```

```
histories GET /histories(.:format) histories#index
                                                
POST /histories(.:format) histories#create
                                    
new_history GET /histories/new(.:format) histories#new
                                   
edit_history GET /histories/:id/edit(.:format) histories#edit {:id=>/\d{6}/}
                                        
history GET /histories/:id(.:format) histories#show {:id=>/\d{6}/}
                                                
PATCH /histories/:id(.:format) histories#update {:id=>/\d{6}/}
                                                
PUT /histories/:id(.:format) histories#update {:id=>/\d{6}/}
                                                
DELETE /histories/:id(.:format) histories#destroy {:id=>/\d{6}/}
```

ルーティングが制限される。便利。このルールから外れると、ルーティングエラーに落ちます。

もちっと複雑なルールを設定したい場合は、matches?を定義したクラスを用意してあげればいいみたい（未検証）

テストはこんな感じ

```rb
it 'パラメータの形式が不正な場合、Not Found画面が表示される' do
  expect(get: 'histories/abcdef').
      to route_to(
             controller: 'application',
             action: 'render_404',
             not_found: 'histories/abcdef'
         )
end
```
hubot-script、hashmeを作ってみた。

そんなに大したものではないのですが、  
hubotで、ちょろっと、hashを確かめたいことがあり、  
hubot-scriptを書きました。

### repo
[tgfjt/hubot-hashme](https://github.com/tgfjt/hubot-hashme)


### テスト

うまいやり方が思いつかなくて、  
とりあえず、機能の部分だけ切り出して、[tape](https://github.com/substack/tape) でやりました。

`mocha` とか、そういうのに比べると素っ気ないけど、さくっと実行出来て良いですね。

### 使い方

`hubot hashme sha1 1395739469` とかやると、sha1で返してくれます。

本家の [hubot-scripts](https://github.com/github/hubot-scripts) を見ると、  
Issuesもプルリクもなんだか大量にあって、しばらくマージされなそうだし、  
そんなマージしてもらうほど大したものでもないしなぁ…と思い、  
とりあえず、[npmパッケージ](https://www.npmjs.org/package/hubot-hashme) として公開しました。

### npm publish

`npm publish` 一発で公開出来る素晴らしいエコシステム！  
だけど、これがもう全然うまくいかなくて、  
「何が悪いんだろう？？ `package.json` がまずいのか？」とか、散々悩みましたが、  
調べてると、リアルタイムで憤る人たちがいっぱいいました。  
[https://twitter.com/search?q=registry%20npm&f=realtime](https://twitter.com/search?q=registry%20npm&f=realtime)  

どうやら祈りが足りなかったようなので、  
適当なときに、`npm publish` を叩いてはダメ、  
またある時に、また `npm publish` を叩いて、を繰り返し、  
けっこう何度もやった挙句、やっとパブリッシュ出来ました。

#### 続報

<blockquote class="twitter-tweet" lang="ja"><p><a href="https://twitter.com/npmjs">@npmjs</a> resized and restarted our problem db, helped some. still lots of io contention on that box. reparenting to a new write-master soon.</p>&mdash; npmbot (@npmjs) <a href="https://twitter.com/npmjs/statuses/448510654073151488">2014, 3月 25</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" lang="ja"><p>seeing fewer publish failures, but still way too many to be happy about. going to be beefing up the write master considerably today.</p>&mdash; npmbot (@npmjs) <a href="https://twitter.com/npmjs/statuses/448498589409366016">2014, 3月 25</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

### インストール

なので、インストールは楽ちん。

```
$ npm install --save hubot-hashme
```

あとは、 `external-scripts.json` に追加するだけです。

```
["hubot-hashme"]
```
CentOS 6.x に bitcoind デーモンをインストールする方法

以下に移行しました<br><a href="http://block-chain.jp/tech/install-bitcoind-daemon-on-centos/" title="CentOS 6.x に bitcoind デーモンをインストールする方法">CentOS 6.x に bitcoind デーモンをインストールする方法</a>
履歴を残したまま複数のgitリポジトリを統合する


半年ほど前のことでうろ覚えなのですが、pixivで複数のリポジトリを統合したときの方法を紹介します。

AAAAAリポジトリとBBBBBリポジトリを統合し、ZZZZZという大きなリポジトリを作成します。もちろんコミットログを統合前まで遡れるようにするのが絶対条件です。

最終形↓

* ZZZZZ
  * .git
  * AAAAA
  * BBBBB

## filter-branch

まず、新しく`git clone AAAAA`してきます。（なぜなら、このディレクトリはこの後使い捨てられるので、pushされてないbranchとがあると困るからです）

次に`cd AAAAA`して、次のコマンドを実行します。

```bash
git filter-branch --index-filter \
  'git ls-files -s | sed "s@\t\"*@&AAAAA/@" |
      GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
        git update-index --index-info &&
  mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE || true' -- --all
```

（「全てのブランチ」である必要がないなら "-- --all" を "HEAD" に変えればよいです）

`git filter-branch`で履歴をごっそり書き換えます。どのように書き換えるかというと、`git ls-files`で全てのファイルを列挙し、それに"AAAAA/"というプレフィックスを付けて`mv`するというようにです。

つまり、このリポジトリの中のファイルは全部AAAAAというディレクトリの中のファイルだったことにします。2万コミットほどあったpixivでは30分ぐらいかかっていた記憶があります。

この段階で

* AAAAA
  * AAAAA
  * .git

というディレクトリ構造になっているはずです。

## ローカルディレクトリを`git remote add`

これをBBBBBのほうにも適用し、例えばBBBBBのほうのディレクトリに入って、

```bash
git remote add localAAAAA /path/to/the/AAAAA
```

のようにします。（/path/to/the/AAAAAは先ほどの.gitがあるディレクトリです）

```bash
git fetch localAAAAA
git merge --allow-unrelated-histories localAAAAA/main
```

とすると、AAAAAのmainだったブランチがBBBBBに統合され、

* BBBBB
  * BBBBB
  * AAAAA
  * .git

のようになるはずです。あとはこの新しいBBBBBをZZZZZリポジトリにpushするだけです。

## 制約

filter-branchではコミットログは残りますが、コミットハッシュは変わってしまいます。

main以外のブランチを持ってくる場合はそれぞれmergeする必要があります。全てのブランチの場合は簡単な方法があるんでしょうか?
GroovyでJDBC接続備忘録

Groovyに限らず、データベースに接続する時の書き方を毎回毎回ググっているのでいい加減に自分用メモ。

#PostgreSQL

```groovy
@GrabConfig(systemClassLoader=true)
@Grapes(
    @Grab(group='postgresql', module='postgresql', version='9.1-901.jdbc4')
)

import groovy.sql.Sql

def dbServer = 'localhost'
def dbName = '******'
def dbPort = '******'
def url = "jdbc:postgresql://${dbServer}:${dbPort}/${dbName}"
def user = '*******'
def password = '*******'

def driver = 'org.postgresql.Driver'
def sql = Sql.newInstance(url, user, password, driver)
```

#MySQL

```groovy
@GrabConfig(systemClassLoader=true)
@Grapes(
    @Grab(group='mysql', module='mysql-connector-java', version='5.1.29')
)

import groovy.sql.Sql

def dbServer = 'localhost'
def dbName = '******'
def dbPort = '******'
def url = "jdbc:mysql://${dbServer}:${dbPort}/${dbName}"
def user = '******'
def password = '******'

def driver = 'com.mysql.jdbc.Driver'
sql = Sql.newInstance(url, user, password, driver)
```

#Sybase

```groovy
@GrabConfig(systemClassLoader=true)
@Grapes(
    @Grab(group='net.sourceforge.jtds', module='jtds', version='1.3.1')
)
import groovy.sql.Sql

def dbServer = 'localhost'
def dbName = '*****'
def dbPort = '*****'
def url = "jdbc:jtds:sybase://${dbServer}:${dbPort}/${dbName}"
def user = '*****'
def password = '*****'

def driver = 'net.sourceforge.jtds.jdbc.Driver'
def sql = Sql.newInstance(url, user, password, driver)
```
配列のリファレンスの配列から値を取る

```pl:AtoA_solve.pl
#!/usr/bin/env perl

use strict;
use warnings;

my $res = {
	'rows_date' => [
		['20121205', '1'],
		['20121206', '2'],
	],
	'total_row' => 2,
};

foreach my $row_ref ($res->{rows_date}) {
	my $rows = @{$row_ref};
	my $index = 0;
	while ($index < $rows) {
		print "date is " . $row_ref->[$index]->[0] . ", value is " . $row_ref->[$index]->[1],"\n";
		$index++;
	}
}
```

結果
![WS000000.JPG](https://qiita-image-store.s3.amazonaws.com/0/34636/1c01e686-bba4-c780-c846-862268aa1583.jpeg)

sublime text 2 上で実行したのでやや見た目が普通と違います。

Google analytics api を使って取得した複雑なデータ構造を処理する場合に使う場合のメモとして残します。
Capistrano3 で deploy_via :copy する

## やりたかったこと

  * `Capistrano3` で `Capistrano2` までの `deploy_via :copy` なデプロイがしたい（タイトルそのまま）
  * `Capistrano3` では `deploy_via :copy` の概念は導入されず

## 動作確認環境

  * クライアント
    * Mac OSX 10.9/Windows 7 (32bit)
    * Ruby 1.9.3-p484
  * リモート
    * CentOS 6.4/RedHat EL6.4

## 依存ライブラリ

  * `Capistrano 3+`
  * `rubyzip`

## 手順

### インストール

`Capistrano` に加えて `rubyzip` をインストールして下さい。

```rb:Gemfile
group :deployment do
  gem 'capistrano', '~> 3.0', require: false
  gem 'rubyzip', require: false
end
```

### セットアップ

`cap install` すると、以下のような構造になると思います。

```
config/
  deploy/
    production.rb
    staging.rb
  deploy.rb
lib/
  capistrano/
    tasks/
Capifile
```
で、 `lib/capistrano/copy.rb` を以下の内容で作成。

```rb:lib/capistrano/copy.rb
require 'zip'

Zip.setup do |c|
  c.unicode_names = true
  c.on_exists_proc = true
  c.continue_on_exists_proc = true
end

namespace :copy do
  task :check do
  end

  task create_release: 'release.zip' do |t|
    file = t.prerequisites.first
    on roles(:app) do
      execute :mkdir, '-p', fetch(:tmp_dir)
      upload! file, fetch(:tmp_dir)
      execute :unzip, '-o', "#{fetch(:tmp_dir)}/release.zip", '-d', release_path
    end
    File.delete file if File.exists?(file)
  end

  file 'release.zip' do |t|
    release_filename = File.join(Dir.pwd, t.name)

    Dir.chdir fetch(:copy_dir) do
      Zip::File.open(release_filename, Zip::File::CREATE) do |zipfile|
        files = FileList['**/*']
        files.exclude(*fetch(:copy_exclude)).each do |file|
          zipfile.add(file, file)
        end
      end
    end
  end
end
```
つまり、このように配置します。

```
config/
  deploy/
    production.rb
    staging.rb
  deploy.rb
lib/
  capistrano/
    tasks/
    copy.rb << Add to here!
Capifile
```

さらに `Capifile` の先頭に以下のように追記します。

```rb:Capifile
$:.unshift File.expand_path(File.dirname(__FILE__) + '/lib') # << 必ず先頭に追加

# Load DSL and Setup Up Stages
require 'capistrano/setup'

# Includes default deployment tasks
require 'capistrano/deploy'
#    :
# Loads custom tasks from `lib/capistrano/tasks' if you have any defined.
Dir.glob('lib/capistrano/tasks/*.cap').each { |r| import r }
```

以上で準備が完了です。

## 使い方

`deploy.rb` とか `deploy/production.rb` とかで以下のように設定すれば OK。

```rb:config/deploy.rb
set :scm, 'copy'
set :copy_dir, '.'
set :tmp_dir, '/tmp'
set :copy_exclude, [ /\.log$/, %r!^files/.+! ]
```

これで `cap production deploy` とかすると、

  1. `Capifile` のあるディレクトリを基準に `:copy_dir` で指定したディレクトリ全体から、
  2. `:copy_exclude` を **除いた** ファイル・ディレクトリが `<Capifile のあるディレクトリ>/release.zip` としてアーカイブされて、
  3. リモートの `:tmp_dir` に送信され、
  4. あとはいつも通り `Capistrano` さんが良きに計らってくださり、

デプロイ完了。

ちなみに、 `:copy_dir` と `:tmp_dir` は必須です。

## 既知の問題

  * `:copy_exclude` の指定方法がわかりにくい
  * ファイル名に日本語が使われていると、名前によってはアーカイブで失敗する場合がある

以上です。 

gem にしようかと思ってました（思ってます）が、いつになるか分からないので
まとめておくことにしました。参考になれば幸いです。
RubyでF#のパイプライン演算子みたいなことがしたい

F#のパイプライン演算子が好きなので、Rubyでも似たことができたら良いなぁと思いやってみた。

```ruby:pipeline.rb
module Pipeline
  def pipe
    if block_given?
      yield self
    else
      self
  end

  Object.send(:include, Pipeline)
end
```

なんか同じメソッドが既にどこかにありそうだけど気にしない。

ブログで書いたのと同じやつ

```ruby:test.rb
#1234を二乗して、文字列にして、順番逆にして、数字に戻す
1234.pipe {|i| i ** 2}.pipe(&:to_s).pipe(&:reverse).pipe(&:to_i)
#=> 6572251
```

こういう使い方はあんまり嬉しくない。

糊付けするとか？

```ruby:hoge.rb
hoge.pipe {|i| f(hoge) }.pipe {|i| g(i) }
```


```ruby:hoge.rb
"hoge".pipe(&["a", "b", "c"].method(:join))
#=> "ahogebhogec"
```

使いどころが分からない。
SocketServerモジュールを使ってTCPサーバを書く

SocketServerというサーバを書く為の便利なモジュールを使って作成する

```py
#!/usr/bin/env python2.7
#-*- coding: utf-8 -*-

import SocketServer

HOST = '127.0.0.1'
PORT = 8080

class Handler(SocketServer.StreamRequestHandler):
    def handle(self):
        while True:
            data = self.request.recv(1024)
            print data
            if len(data) == 0:
                break
            self.request.send(data)
        self.request.close()

server = SocketServer.TCPServer((HOST, PORT), Handler)
print 'listening', server.socket.getsockname()
server.serve_forever()
```
Re: 適当にかいたJavaScriptがきもちわるい


※返信のつもりで書きはじめたけど、特に根拠も知見もない文章しか書けなさそうだったので、別物のメモにした。

--

Javascriptはどうしたって、適当に書いたらカオスになる仕様なので、
適当に書いてもかっちりMVCが分かれるようにするには、backboneさんとかのフレームワークにがっつり乗るしかない気がする。
(自分ルール決めても、急いでたり疲れてたりするときは守れなかったりして、ルールに従ってるところと謎なところとが共存して余計にカオスになるとか、よくある。)

ただ個人的には、そういうのに乗ると柔軟性なくなって、無駄に悩む時間が増えそうな気がしてるので、あんまり乗らない。

それでも読みやすくはしたいので、 **命名で妥協しない** ってとこだけ死守してる。

適切な変数名を付けることを考えたら、ブロックはあんまり長くできないし、
(ブロックが長いと、その分気にしなきゃいけない事項・他の変数が増えちゃって、変数名を長くせざるおえない)

適切な関数名を付けることを考えたら、ひとつの関数内でふたつのことはできない。

あとは、jQueryとかの圧力に負けて、手続き型言語っぽく書きそうになるのをがんばって抑えるとか?
console.log()とか使えないときにちょっと使う

```html
<div id="debug" style="
	background-color: rgba(255,255,255,.5);
	bottom:0;
	height:100px;
	left:0;
	overflow:auto;
	position:fixed;
	text-shadow: 1px 1px 0 #fff;
	width:100%;
	z-index: 10;
	"></div>
<script>
	function d() {
		function _(s) {
			var x = s.replace(/</g, '&lt;');
			return x;
		}

		var t = [];
		for (var i=0,l=arguments.length; i<l; i++) {
			var v = arguments[i];
			t.push(v==null?typeof v:v.toString());
		}
		var e = document.getElementById('debug');
		var s = '<p>' + _(t.join(', ')) + '</p>';
		e.innerHTML += s;
	}
</script>
```
Python 3.4.0 の新機能 (2) - enum


[昨日のエントリ](http://qiita.com/ksato9700/items/9e299f2bbd13cbcc0da8)で始めてしまった Python3.4の新規機能紹介。今日はEnum。

これは昔から欲しいなと思っていた機能なので地味に嬉しい。Pythonの場合はEnumは型ではなくクラスになっていて、名前・値のペアを継承したクラスのクラス変数として定義するイメージ。

例として[列挙型(Wikipedia)](http://ja.wikipedia.org/wiki/%E5%88%97%E6%8C%99%E5%9E%8B)でも取り上げられているCardsuitを使おう。まずは定義から。

```python
from enum import Enum

class Cardsuit(Enum):
    CLUBS = 1
    DIAMONDS = 2
    HEARTS = 3
    SPADES = 4
```

そして使うときには、値を引数にインスタンス化するか、名前をキーにクラス属性を取り出すかする。

```python
# 以下は全て同じ値が代入される
card0 = Cardsuit(2)
card1 = Cardsuit['DIAMONDS']
card2 = Cardsuit.DIAMONDS

# 普通にプリントすると最後の形式で出力される
print(card0, card1, card2) # -> Cardsuit.DIAMONDS Cardsuit.DIAMONDS Cardsuit.DIAMONDS

# 名前と値はそれぞれ別々に取り出せる
print(card0.name, card0.value) # -> DIAMONDS 2
```

なお、PythonのEnumは
- 別の値を同じ名前に割り当てる ... NG
- 同じ値を別の名前に割り当てる ... OK

となっているが、Enum.uniqueを使うと二つ目もNGにできる

```python
from enum import Enum

# これはOK
class Cardsuit(Enum):
    CLUBS = 1
    DIAMONDS = 2
    HEARTS = 3
    SPADES = 4
    ALT_SPADES = 4

# これはNG
@unique
class Cardsuit(Enum):
    CLUBS = 1
    DIAMONDS = 2
    HEARTS = 3
    SPADES = 4
    ALT_SPADES = 4

```

Enumがクラスというのはちょっと意外な気もしたがそれもありかも知れない。たとえば、エラーコードの定義を名前・値ペアでしておいて、必要に応じてそこにメソッド追加していくとか。もう少し実際のコーディングをするとさらに分かってくるのかな。
Windows版Jenkinsを自動インストールする。ついでにプラグインも。

Jenkinsで自動化。インストールも自動化。

# Jenkins Windows Installer編

## コマンド
```bat
msiexec /i jenkins-x.xxx.msi /qn JENKINSDIR="path\to\jenkins"
```

###解説
JenkinsのWindows用native packageは、インストーラーにWindows Installerを利用しています。
 ダウンロードした[zipファイル](http://mirrors.jenkins-ci.org/windows/latest)にはmsiファイルとsetup.exeが同梱されていますが、今回必要なものはmsiだけです。

|オプション|説明|
|:-----------|:-----------|
|/i path.msi|msiファイルの指定。|
|JENKINSDIR=path|インストール先および`JENKINS_HOME`になるパス。<br>指定なしなら`%ProgramFiles(x86)%` (64bit)か`%ProgramFiles%` (32bit)。|
|/qn|サイレントインストール(UI非表示)。/qrとの違いはUIの有無|

`Program Files`配下ではなく、他の場所にインストールしたほうが便利でしょう。`JENKINS_HOME`が指定できることもポイントです。 
その他の細かいオプションはWindows Installerの[公式ドキュメント](http://support.microsoft.com/kb/314881/ja)を参照してください。

##プラグイン
Jenkinsインストール後の作業です。

### Jenkins CLI編

Javaとインターネットが利用できることが前提

```bat
java -jar jenkins-cli.jar -s %JENKINS_URL% install-plugins pluginNameA pluginNameB pluginNameC...
java -jar jenkins-cli.jar -s %JENKINS_URL% safe-restart
```
1コマンドで複数のプラグインがインストールできます。

### ローカルインストール編
Jenkinsマシンからのインターネット利用が難しい場合です。

**プラグインの依存関係の調査**
ローカルインストールではプラグインの依存関係を手動で解決する必要があります。
 [Jenkinsのwiki](https://wiki.jenkins-ci.org/display/JENKINS/Plugins)から、欲しいプラグインが依存しているプラグインを確認しましょう。

**プラグインのダウンロードと設置**
プラグインの実態であるhpiファイルを、プラグイン用ディレクトリに置く必要があります。
hpiのダウンロード元は`http://updates.jenkins-ci.org/latest/pluginName.hpi` 
hpi用のディレクトリは`path/to/jenkins/plugins` です。 
依存関係のあるプラグインも忘れないように。

**Jenkinsの再起動**
`JENKINS_URL/safeRestart`で再起動できます。

# Chef利用編
[Java](http://community.opscode.com/cookbooks/java)と[Jenkins](http://community.opscode.com/cookbooks/jenkins)のcookbookを利用すればよいでしょう。プラグインもうまく処理してくれます。

## 関連記事
* [RubyInstallerをサイレントインストールせよ - Qiita](http://qiita.com/yoshi-taka/items/a770b008f39ef7234e79)
CakePHP2 activateにはまる

会員登録時にメールアドレスに認証メール飛ばして認証させるやつを作ってます。

最初は仮登録メールとして飛ばしていましたが、Twitter風に
あくまで認証にしました。
（認証しなくても一部機能は使えるようにした）

その方が使ってもらいやすいかなと。

が、はまりました。

なぜか認証されない・・・。

参考にしたサイト
http://kwski.net/cakephp-2-x/1100/


*モデル
```ruby
puts "Welcome Qiita!"
```
public function getActivationHash() {

  // ユーザIDの有無確認
  if (!isset($this->id)) {
    return false;
  }

  // 更新日時をハッシュ化
  return Security::hash( $this->field(‘modified’), ‘md5′, true);
}


*コントローラー
public function activate( $user_id = null, $in_hash = null) {
  // モデルにIDをセット
  $this->モデル名->id = $user_id;
  if($this->モデル名->exists() && $in_hash == $this->モデル名->getActivationHash()) {

    // 本登録に有効なURL
    // statusフィールドを0に更新
    
    $this->モデル名->saveField('status', 0);
    $this->Session->setFlash('認証完了しました。');
    $this->redirect('飛び先URL');
    
  }else{
    // 本登録に無効なURL
    $this->Session->setFlash('無効なURLです');
    $this->redirect('飛び先URL');
  }
}


ハッシュ化とそれを認証する仕組みは上のような形なのですが、
（参考サイト丸パクリ・・・）
いつでも認証できるように他のコントローラーにも
認証メール送信のアクションを書きました。

*コントローラー

public function send_activate(){

  // ユーザアクティベート(本登録)用URLの作成
  $act = FULL_BASE_URL // ドメイン
  . $this->request->webroot // サブディレクトリ
  . 'コントローラー名' . DS . 'アクション名' . DS // コントローラ/アクション
  . $member['モデル']['id'] . DS // ユーザID
  . $this->モデル->getActivationHash(); // ハッシュ値

  $url = h(Router::url('/', true));

  //以下CakeEmail送信

}

がしかし！！！！

こいつからだと認証されねぇ。

こいつが送信するURLだと認証されねぇ。

なんで？なんでなの？死ぬの？

いろいろ調べると、ハッシュ化されている値が違っている。

なんでなの？

下のように★を追加したらしたらいけた。

public function send_activate(){

  $this->モデル->id = $member['モデル']['id']; ★
  $hash = $this->モデル->getActivationHash(); ★

  // ユーザアクティベート(本登録)用URLの作成
  $act = FULL_BASE_URL // ドメイン
  . $this->request->webroot // サブディレクトリ
  . 'コントローラー名' . DS . 'アクション名' . DS // コントローラ/アクション
  . $member['モデル']['id'] . DS // ユーザID
  . $hash; // ハッシュ値

  $url = h(Router::url('/', true));

  //以下CakeEmail送信
  
}

はぁ。。どうにかなった。。
でも理由が分からず。
Haskellが最強であるただ一つの理由

最強であるただ一つの理由、それは [hoogle](http://www.haskell.org/hoogle/) の存在。

----

いろんな言語に触っていると、動的言語が良い、いや型チェックだ、OOPだ、Immutableだ、遅延評価だ、ポインタだ、などの
まあ宗教戦争になるほどそれぞれの長所があるわけです。
実際自分はRubyが一番よく使う言語ですし。

でも言語の良さよりも、その環境の使いやすさってのも大きいわけです。

例えばRubyの [`inject`](http://www.ruby-doc.org/core-2.1.0/Enumerable.html#method-i-inject) がほしいような状況があるとします。
でも、どうぐぐっていいのかわからない。

一方Haskellの場合は hoogle に飛んで

```hs
[a] -> (a -> b -> b) -> b -> b
```

と検索するだけでよい。もちろん引数の順番は違うけどそれも吸収してくれます。

----

なお次点で良いのはPHPで、本家のドキュメントに大量のサンプルがあるというのはやっぱり便利ですね。

いや、うちの言語にもいいのありますし～って人はコメントいただけると嬉しいです。
Cakephp2 仮登録→本登録をやってみる

CakePHP2で、

１、メアド、パス登録
２、メール受信確認
３、アクティベート
４、本登録完了

をやってみる。

Authコンポーネントを使います。


Authコンポーネントで「User」モデル以外を使って認証するときは、
対象のコントローラーに、

public $components = array(‘Auth’ => array(‘authenticate’ => array(‘Form’ => array(‘userModel’ => ‘Member’))));

※「Member」モデルを使う場合

と「’userModel’ => ‘Member’」の１文を書かなければなりません。

これにはまった。
Go言語


## Install

まず、処理系はインストールからGoコンパイラとGCCコンパイラコレクションがあるが、今回はGoコンパイラをソースからインストールしてみる。

```sh
$ curl -O https://storage.googleapis.com/golang/go1.4.2.src.tar.gz # 現時点では1.4.2が最新
$ export GOROOT=$HOME/local/go # go言語をインストールする場所を決める。~/.zshenvとかに書いておく
$ tar -C $GOROOT -zxvf go1.4.2.src.tar.gz
$ cd $GOROOT/src
$ ./all.bash
```

ref. http://golang.jp/install/source

開発環境を整える

```sh
$ mkdir $HOME/go # パッケージやらなんやらが入るディレクトリ
$ export $GOPATH=$HOME/go # ~/.zshenvに書いておく
$ go get golang.org/x/tools/cmd/godoc # ドキュメント閲覧ツールをインストールしておく
```

## Hello World!

```go:hello.go
package main

import fmt "fmt"

func main() {
    fmt.Printf("Hello world\n")
}
```

```sh
$ go build hello.go
```

## 参照

* [プログラミング言語Goの情報サイト](http://golang.jp/)
* [Go Web プログラミング](http://astaxie.gitbooks.io/build-web-application-with-golang/content/ja/index.html)
OpenCV2系（Java）でモザイク処理

もともと色々な処理できる関数が用意されているけど、OpenCVでモザイク処理ってやってなかったなーって思ったので書いてみた。
画像全体でもいいけどどうせだったら顔認識した部分限定でかけたいとかあると思うのでROIとなる引数をとるstaticメソッド。

```java
/**
 * ROIを指定してモザイク処理
 * @param image 元画像となる {@link Mat}
 * @param rectangles モザイク対象のROIを指定した {@link MatOfRect}
 * @param size モザイクのピクセル幅
 * @return モザイク処理後の {@link Mat}
 */
public static Mat drawMosaic(Mat image, MatOfRect rectangles, int size) {
	Mat dstImage = image.clone();
	for (Rect rect : rectangles.toArray()) {
		Mat imageROI = new Mat(image, rect);
		Mat dstImageROI = new Mat(dstImage, rect);
		for (int y = 0; y < imageROI.height(); y += size) {
			for (int x = 0; x < imageROI.width(); x += size) {
				int yLimit = y + size;
				if (yLimit >= imageROI.height()) {
					yLimit = imageROI.height();
				}
				int xLimit = x + size;
				if (xLimit >= imageROI.width()) {
					xLimit = imageROI.width();
				}
				double b, g, r;
				b = g = r = 0;
				int winSize = 0;
				for (int i = y; i < yLimit; i++) {
					for (int j = x; j < xLimit; j++) {
						double[] pixel = imageROI.get(j, i);
						b += pixel[0];
						g += pixel[1];
						r += pixel[2];
						winSize++;
					}
				}
				b /= winSize;
				g /= winSize;
				r /= winSize;
				for (int i = y; i < yLimit; i++) {
					for (int j = x; j < xLimit; j++) {
						dstImageROI.put(j, i, new double[] { b, g, r });
					}
				}
			}
		}
	}
	return dstImage;
}
```
英語、1年以内のGoogle検索をChromeの検索エンジンに登録すると便利

Chromeではアドレスバーに検索ワードを入れてEnterキーで検索できますが、カスタムの検索エンジンを登録すると便利です。

[設定]メニュー
→[検索エンジンの管理...]ボタン

から登録できます。

私が登録している2つを例として示します（といいつつ、1年以内のは今登録したところです）。

* Googleで英語で検索
    * 名前: Google en
    * キーワード: g
    * URL: https://www.google.co.jp/search?hl=ja&as_q=%s&lr=lang_en
* Googleで英語で1年以内指定で検索
    * 名前: Google en 1year
    * キーワード: g1
    * URL: https://www.google.co.jp/search?hl=ja&as_q=%s&lr=lang_en&cr=&as_qdr=y

Googleに限らず、他のサイトも検索エンジンとして登録できます。
URLは、お目当てのサイトで検索した結果のURLのうち、検索ワードを%sに置き換えればOKです。
アドレスバーにキーワードとスペースを入力すると、登録した検索エンジンが使用できます。
その後に検索ワードを入れてEnterキーで検索です。

例えば上の登録をしておいて、```g1 ansible```と入力すると以下のようになります。

![search.png](https://qiita-image-store.s3.amazonaws.com/0/3227/04c620bd-dcf9-125e-9767-4a46717627ab.png)

Enterキーで検索すると以下のようになります。

![seach-result.png](https://qiita-image-store.s3.amazonaws.com/0/3227/631eadc0-c355-9f8b-9cb6-871ff86edadc.png)
RubyでiPhoneアプリにPush通知


grocerというライブラリを使うと簡単に通知するコードが書ける。

```ruby:push.rb
require 'grocer'

pusher = Grocer.pusher(
  certificate: "/path/to/cert.pem",      # required
  passphrase:  "",                       # optional
  gateway:     "gateway.sandbox.push.apple.com", # optional
  port:        2195,                     # optional
  retries:     3                         # optional
)

notification = Grocer::Notification.new(
  device_token:      "ここ対象のアプリのデバイストークンを空白なしで入れる",
  alert:             "Hello from Grocer!",
  badge:             1
)

pusher.push(notification)

```

但し、アップルから取得した証明書を変換する作業が必要。
証明書の変換作業はスクリーンショット付きで下のページに乗ってるのでそれを参照すること。

###参考URL
grocer
https://github.com/grocer/grocer
JavaScriptで暗号化した文字列をRubyで復号化してみた


そもそもやりたかったのはGoogleAppsScriptを使って加工したデータを定期的にメールで送りたかった。
その時に加工したファイルの中身を暗号化して送ったのでその方法を残しておく。

###JSで文字列の暗号化
JS側の暗号化にはCryptoJSを使った。
ココ見たらだいたいわかるのでURLだけ。
参照：https://code.google.com/p/crypto-js/


今回の暗号化にはAES-256-CBCを利用。
※CryptoJSはAES用、DES用等とそれぞれファイルが分かれているので使う際は必要なJSを持って来て使う。

と言ってもやったのはほぼサンプルと同じ。
通常のHTMLだとscriptで読み込めばいいが、GASは外部から読めないっぽかったので（ちゃんと調べてないけど）CryptoJSの中身をコピーして貼付けたら使えた。

```javascript:encrypt.js
  var encrypted = CryptoJS.AES.encrypt("Message", "pass");
  // U2FsdGVkX1/XgapHlh8Ks+eIN1uaVOTMc14jRsaENNo=

```


###Rubyで文字列を復号化
Ruby側は特に目新しさはないけどこんな感じ。
このあんまりスマートじゃない感が半端ないんだけど・・・とりあえずこんなロジックで複号化出来た。

```ruby:decrypt.rb
require "openssl"
require "base64"
def decrypt(base64str, password)
  decoded_str = Base64.decode64(base64str)
  salt = decoded_str[8..15]
  data = decoded_str[16..-1] 
  cipher = OpenSSL::Cipher::Cipher.new('AES-256-CBC')
  cipher.decrypt
  cipher.pkcs5_keyivgen(password, salt, 1)
  return cipher.update(data) + cipher.final
end
```

一応使い方。

```ruby:hoge.rb
decrypt("U2FsdGVkX19xK0UNaoIs5QZxZlYFOiwiVu1BY5LUHS8=","pass")
#=> "Message"
```
一番最初に暗号化した"Message"って文字が戻ってきて幸せw
【Android NDK】sigsegvをフックする【cocos2d-x】

cocos2d-xのAndroidではネイティブの処理を利用しているため、ハイパフォーマンスな動作が期待出来ます。
が、実際にアプリを開発しているとエラーに直面することも多いと思います。
その際に出るエラーはこのようなものです。

```
I/DEBUG   ( xxxx): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG   ( xxxx): Build fingerprint: '---------------------------------------'
I/DEBUG   ( xxxx): pid: xxxx, tid: xxxx  >>> /system/bin/netd <<<
I/DEBUG   ( xxxx): signal 11 (SIGSEGV), fault addr deadbaad
I/DEBUG   ( xxxx):  r0 00001728  r1 100ffd7c  r2 00000027  r3 00000000
I/DEBUG   ( xxxx):  r4 afd42328  r5 00000000  r6 00000000  r7 00011000
I/DEBUG   ( xxxx):  r8 00100000  r9 aef01cad  10 10000000  fp 40008008
I/DEBUG   ( xxxx):  ip ffffffff  sp 100ffd68  lr deadbaad  pc afd11ca4  cpsr 40000030
以下略

```

デバッグダンプとか呼ばれているもので、ここからエラーの原因を追っていくわけですが、
このエラー、AndroidOSが発しているものなので、フックすることが出来ます。

```cpp:Test.cpp

#import <stdio.h>
#import <stdlib.h>
#import <android/log.h>
#import <signal.h>

void initSignalHandler(){
    signal(SIGSEGV , &sigsegvSignalHandler);
}

static void sigsegvSignalHandler(int sig){
        jclass exception;
        signal(sig , SIG_IGN);
        JNIEnv *pEnv = 0;
        bool bRet = false;
        JavaVM* jvm = cocos2d::JniHelper::getJavaVM();
        jvm->GetEnv((void**)&pEnv , JNI_VERSION_1_4);
        if (! pEnv)
        {
            return;
        }

        exception = getClassID(pEnv , "java.lang.RuntimeException");
        if(exception != NULL){
             jmethodID methodId = pEnv->GetMethodID(exception , "toString" , "()Ljava/lang/String;");
             jmethodID methodPrintStack = pEnv->GetMethodID(exception , "printStackTrace" , "()V");

             jstring errMes = (jstring)pEnv->CallObjectMethod(exception , methodId);
             pEnv->CallObjectMethod(exception , methodPrintStack);
             const char* chars = pEnv->GetStringUTFChars(errMes , NULL);
             pEnv->ThrowNew(exception , chars);
             pEnv->DeleteLocalRef(exception);
             free((void*)chars);
             pEnv->DeleteLocalRef(chars);
       }
    }

```

signal関数を使用して、そこにHandlerを登録すると、
sigsegvが発生した時に処理を受けることが出来ます。
そこからjavaのRuntimeExceptionを生成して、それをthrowすることも出来ます。

initSignalHandlerは好きなタイミングで呼び出して下さい。
アプリ起動時にJNI経由で呼び出すなら、こんな感じでしょうか。

```java:MainActivity.java

static private native void initSignalHandler();

@Override
protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     initSignalHandler();
}
```

```cpp:Test.h

#ifdef __cplusplus
extern "C" {
#endif
     JNIEXPORT void JNICALL Java_hoge_hoge_MainActivity_initSignalHandler(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
```

```cpp:Test.cpp
JNIEXPORT void JNICALL Java_hoge_hoge_MainActivity_initSignalHandler(JNIEnv* env, jclass clazz) {
     signal(SIGSEGV , &sigsegvSignalHandler);
}
```

で、


で！


で！！！！！


RuntimeExceptionの中身は…空っぽです。
なんにもありません。
そりゃそうだ、何も入れてないんだから！

このソースはこのままでは使えないので、利用方法によって変えるといいよ！
（ログ収集SDK組み込んでるならlogEvent仕込んだりね）

と、投げっぱなしジャーマンな事だったんで、書きにくかったんですが、
途中経過って事で何卒ご了承を。

本当はsigsegvが吐き出すデバッグダンプの中身まで拾いたい。

【追記】
import忘れてた…。
Titanium.Network.HTTPClientでGETリクエスト

sendにparamsを与えると強制的にPOSTリクエストになる。

```js:get_request.js
var url = 'http://cureblack.com/';
var params = {
    nagisa : 'honoka'
};
var http = Ti.Network.createHTTPClient(opts);
http.open('GET', url);
http.send(params);
```

上記のような書き方だとGETのつもりがPOSTになってしまう。
urlにエスケープして継ぎ足してやる必要がある。

XHR風に見えて微妙なところで違うので戸惑う。
生で扱うことはほぼないと思われるので、それぞれのラッパーで適切に処理してやれば問題はないのかな。

こういうのを書いて対応してみた

```js:sendHTTPRequest.js
function sendHTTPRequest(method, url, params, opts){
    var http = Ti.Network.createHTTPClient(opts);
    if(method == 'GET' && params){
        if(!url.match(/\?/)){
            url += "?";
        }else{
            url += "&";
        }
        var q = [];
        var encode = Ti.Network.encodeURIComponent;
        for (key in params){
            q.push(encode(key) + "=" + encode(params[key]));
        }
        url += q.join('&');
        params = null;
    }
    http.open(method, url);
    http.setRequestHeader('User-Agent', getUserAgent());
    return http.send(params);
}
```
空欄だったら、ボタンを使用不能にするセット

こんなフォームがあったとして、

```html:test.html
<form id="hoge" action="login.php" method="post" >
  <label class="input_label" for="user_login">ユーザー名：</label>
  <input name="log" value="" class="input" id="user_login" type="text"><br />
  <label class="input_label" for="user_pass">パスワード：</label>
  <input name="pwd" class="input" id="user_pass" type="password"><br />
  <input class="button" name="submit" id="submit" value="ログイン" type="submit">
</form>
```

こんな感じで書くと、

```html:test.html
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.js"></script>
<script type="text/javascript">
$(function(){
    $("#submit").prop('disabled', true);
    $("#submit").css('color', '#AAA');
    $("input[name='log']").blur(function(){
        $("#submit").css('color', '#000');
        if($("input[name='log']").val() == "" || $("input[name='pwd']").val() == "" ){
            $("#submit").prop('disabled', true);
            $("#submit").css('color', '#AAA');
        } else {
            $("#submit").prop('disabled', false);
        }
    });
    $("input[name='pwd']").blur(function(){
        $("#submit").css('color', '#000');
        if($("input[name='log']").val() == "" || $("input[name='pwd']").val() == "" ){
            $("#submit").prop('disabled', true);
            $("#submit").css('color', '#AAA');
        } else {
            $("#submit").prop('disabled', false);
        }
    });
});
</script>
```

フォームが空欄だったら、ボタンを使用不能にすることができる

思うところあって書き直してみたのが下。

```html:test.html
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.js"></script>
<script type="text/javascript">
$(function(){
    disabled_btn();
    $("input[name='log']").blur(function(){
        change_btn();
    });
    $("input[name='pwd']").blur(function(){
        change_btn();
    });

    function disabled_btn() {
        $("#submit").prop('disabled', true);
        $("#submit").css('color', '#AAA');
    }

    function change_btn() {
        $("#submit").css('color', '#000');
        if($("input[name='log']").val() == "" || $("input[name='pwd']").val() == "" ){
            disabled_btn();
        } else {
            $("#submit").prop('disabled', false);
        }
    }
});
</script>
```