OmniAICreator/Qiita-1.07M huggingface dataset:
Mac OS Xアプリでモーダルダイアログボックスを表示する


今どきのアプリではモーダルダイアログボックスはなるべく使わない傾向にあるようですが、とりあえず実装が簡単なモーダルダイアログボックスで作っておき、後からより気の利いたユーザーインターフェースに差し替えようという場合もあるのではないでしょうか。

```objectivec
	// Objective-Cの場合
    NSAlert *alert = [[NSAlert alloc] init];
    [alert setMessageText:@"入力エラー"];
    // ARCを使ってない場合は [alert release];
```

```Swift
	// Swiftの場合
    let alert = NSAlert()
    alert.messageText = "入力エラー"
    alert.runModal()
```

結果
![結果スクリーンショット](http://f.st-hatena.com/images/fotolife/f/fhisa/20140825/20140825193146.png)



##メッセージの詳細などを付け加える

メッセージの詳細などを付け加える場合は```setInformativeText:```を使います。

```objectivec
	// Objective-Cの場合
   NSAlert *alert = [[NSAlert alloc] init];
   [alert setMessageText:@"入力エラー"];
   [alert setInformativeText:@"名前を入力してください"];
   [alert runModal];
   // ARCを使ってない場合は [alert release];
```

```Swift
	// Swiftの場合
    let alert = NSAlert()
    alert.messageText = "入力エラー"
    alert.informativeText = "名前を入力してください"
    alert.runModal()
```

結果
![結果スクリーンショット](http://f.st-hatena.com/images/fotolife/f/fhisa/20140825/20140825193147.png)


##ボタンのラベルを変える

ボタンのラベルを変えたい場合は```addButtonWithTitle:```を使います。

```objectivec
	// Objective-Cの場合
   NSAlert *alert = [[NSAlert alloc] init];
   [alert setMessageText:@"入力エラー"];
   [alert setInformativeText:@"名前を入力してください"];
   [alert addButtonWithTitle:@"わかりました"];
   [alert runModal];
   // ARCを使ってない場合は [alert release];
```

```Swift
	// Swiftの場合
    let alert = NSAlert()
    alert.messageText = "入力エラー"
    alert.informativeText = "名前を入力してください"
    alert.addButtonWithTitle("わかりました")
    alert.runModal()
```

結果
![結果スクリーンショット](http://f.st-hatena.com/images/fotolife/f/fhisa/20140825/20140825193148.png)


ボタンの数が変わるわけでもないのに```addButtonWithTitle:```を使うというのが少しわかりにくいですね。

##続き

まだまだいろいろありますがこのくらいにしておきます。詳しくは[NSAlert Class Reference](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSAlert_Class/Reference/Reference.html "NSAlert Class Reference")をどうぞ。
統計の問題を Python で実際に計算してみる

プレジデントオンラインに統計の記事が掲載されていました。

朝食や出社時間と、営業成績に「相関関係」はあるか？
http://president.jp/articles/-/12416

上記の記事では確かに数式は出てこないのでとっつきやすく解説は詳しいので統計の入門にはピッタリです。しかしながらエクセルで手計算することが前提になっておりこれは若干億劫です。

そこで今まで利用してきた Python でこれらの問題を計算してみたいと思います。

# 問題とその解法

問題の内容としては各社員の、朝食を食べてきた確率 (= 朝食率) 、出社時間、それに対して営業成績を 3 つの変数として相関関係があるか調べるというものです。このように変数の間の相関関係を調べるというのはさまざまな統計の基本とも言えるでしょう。

計算機で扱えるように、それぞれの変数を X Y Z としましょう。まずはこれを[CSV ファイルのデータ](https://github.com/ynakayama/sandbox/blob/master/python/pandas/data.csv)として用意しました。

## 基本統計量を算出する

まずは [2 ページ目](http://president.jp/articles/-/12416?page=2)に登場する統計量を求めます。上記のデータを読み込んで平均や標準偏差などの基本統計量を求めます。これは [pandas](http://pandas.pydata.org/) を使えば簡単で、一瞬で求まります。

```py
data = pd.read_csv("data.csv", names=['X', 'Y', 'Z'])
data.describe()
# =>
#                 X          Y           Z
# count    7.000000   7.000000    7.000000
# mean    42.571429  -8.571429   98.714286
# std     42.968427  14.920424    8.440266
# min      0.000000 -40.000000   88.000000
# 25%      5.000000 -10.000000   92.000000
# 50%     33.000000  -5.000000  100.000000
# 75%     77.500000   0.000000  104.500000
# max    100.000000   5.000000  110.000000
```

## 散布図行列を描く

元の記事では散布図を描いて相関関係を調べています。これもさっそく Python で実施してみましょう。各変数ごとの相関関係をまとめて調べるには[散布図行列](http://qiita.com/ynakayama/items/94779651d09e1004fd46)を描くのが手っ取り早いです。

```py3
from pandas.tools.plotting import scatter_matrix
plt.figure()
scatter_matrix(data)
plt.savefig("image.png")
```

![1.png](https://qiita-image-store.s3.amazonaws.com/0/38501/ba26e05c-be95-75ec-7d5e-01d231028682.png)

## 相関係数を求める

相関係数は共分散を二変数の標準偏差で割れば良いのですが pandas を使うと関数ひとつで簡単に求まります。

```py3
data.corr()
#=>
#           X         Y         Z
# X  1.000000  0.300076  0.550160
# Y  0.300076  1.000000 -0.545455
# Z  0.550160 -0.545455  1.000000
```

 [5 ページ目](http://president.jp/articles/-/12416?page=5)にある相関行列を一発で求めることができました。だいたい一般的な目安としては 0.7 以上だと強い相関があると言われますから、元記事の記述の通り、微妙な相関関係だと言えるでしょう。

## 回帰分析をする

最後に [4 ページ目](http://president.jp/articles/-/12416?page=4)の最後に登場する回帰式を求めます。これは [SciPy](http://www.scipy.org/) の統計関数のひとつ [scipy.stats.linregress](http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.stats.linregress.html) を利用して単回帰分析することで求まります。

```py3
# 値を取り出す
x = data.ix[:,0].values
y = data.ix[:,1].values
z = data.ix[:,2].values

# X と Z の回帰式
slope, intercept, r_value, p_value, std_err = sp.stats.linregress(x, z)
print(slope, intercept, r_value)
#=> 0.108067677706 94.113690292 0.550160142939

# Y と Z の回帰式
slope, intercept, r_value, p_value, std_err = sp.stats.linregress(y, z)
print(slope, intercept, r_value)
#=> -0.308556149733 96.0695187166 -0.545455364632
```

なお slope は傾き、 intercept は切片、 r_value は相関係数です。傾きを a 、切片を b として y = ax + b という一次式が求まります。

たとえば X と Z の一次回帰式なら y = 0.11x + 94.11 (小数点第 2 位まで) という式に回帰するというわけです。

## まとめ

Python を使うとエクセルよりもさらに簡単に統計分析をおこなうことができました。二変数間の相関を調べるのは統計の基礎中の基礎ですから現実の問題にも応用するケースが多いですし、慣れると非常に短時間でこれらの分析をおこなうことができるようになります。
Struts2で独自インターセプター内でリダイレクト先を動的に変えたい

Struts2で独自に定義したインターセプター内で動的にリダイレクト先を変える処理を書きたかったのだが、色々ハマったのでメモ。

# struts.xmlにリダイレクト先を追加。

リダイレクト先はOGNL式で動的に処理できるように定義しておく。

struts.xml

```xml
<result name="redirect" type="redirect">
	<param name="location">${redirectUrl}</param>
</result>
```

# インターセプター内でリダイレクト先を格納。

```java

/** リダイレクト先URL */
private String redirectUrl;

public String intercept(ActionInvocation invocation) throws Exception {


	// 適当な処理


	// リダイレクト先のURLをvalueStackに格納
	ValueStack valueStack = invocation.getStack();
	valueStack.set("redirectUrl",redirectUrl);

	return "redirect";
}
```

参考URL
http://yuroyoro.hatenablog.com/entry/20080414/1208140350
http://stackoverflow.com/questions/173846/struts2-how-to-do-dynamic-url-redirects
http://struts.apache.org/development/2.x/docs/parameters-in-configuration-results.html
[JavaScript] ブラウザバックを無効にする

厳密には、JavaScriptでブラウザの戻るボタンを無効にする方法ではなく、
history.forward(); によって、ユーザーが戻るボタンを押して1ページ分戻った際に
forward で1ページ分前に進めているだけです。

以下JavaScriptソースをブラウザバックして欲しくないファイルの一つ前のファイルの
head内に記述します。

そうすると…例えば、とあるform のconfirm ファイルに記述することで、
その次のcomplete 画面でユーザーがブラウザバックした時に confirm 画面へ移動し再度メールが
送信されてしまったりしてしまうことを防ぐことなどが可能です。

	window.onunload = function() {};
	history.forward();

history.forward(); → InternetExplorer やGoogleChrome に対応。
window.onunload = function() {}; → Firefox に対応。
x64 Windows で Poderosa のターミナルをタブで次々と開く方法(解決編)

# .NET Frameworkアプリを32bitで動作するようにする

前回([調査編](http://qiita.com/hanamiche/items/c1fc39442d8ab823482b))、64bitと32bitの違いで動作に問題があることがわかりました。
となるとOSSのPoderosaでとれる対応は2つありそうです。
## 対応策
* ソースに手を入れてWin32 APIの所を改修する
* 32bitモードで動かすようにする

手抜きな僕は、後者を選択しました(^_^)

# Visual Studioの操作手順
## 環境
* Windows 8.1 x64
* Visual Studio Express 2013 for Windows Desktop
* [Poderosaのソース](http://sourceforge.jp/projects/sfnet_poderosa/)4.3.8bを使用

## ソースをDLして開く！
* poderosa.sln をダブルクリック、プロジェクトの変換が必要だが全部お任せ

## 構成マネージャからx86ビルドを追加する
* 右のソリューションエクスプローラーを右クリック、「構成マネージャー」を選択
![1.png](https://qiita-image-store.s3.amazonaws.com/0/48016/89973de2-5ee0-fd6a-311d-58581b843dae.png)
　

* 構成マネージャーの「アクティブ ソリューション プラットフォーム」から「<新規作成..>」を選択する![スクリーンショット 2014-08-25 18.45.19.png](https://qiita-image-store.s3.amazonaws.com/0/48016/cf841856-8fb8-56bd-dc93-3845339bfea6.png)
　

* 新しいプラットフォームの選択で「x86」を選択してOK!
![スクリーンショット 2014-08-25 18.45.40.png](https://qiita-image-store.s3.amazonaws.com/0/48016/8dc24f80-eb5c-665e-8b04-ba636f050c48.png)
　

* プラットフォームがx86になります！
![スクリーンショット 2014-08-25 18.45.45.png](https://qiita-image-store.s3.amazonaws.com/0/48016/40960e70-5135-7a39-8200-7d0ab065b1e8.png)

　

* 後はビルド！！！
おそらく問題なくビルドできると思います！
　

* ビルドができたら、「Poderosa-4.3.8b\Executable\obj\x86\Release」の中に「Poderosa.exe」があるのでいつも使っているPoderosa.exeに上書き！
(バックアップはお忘れなく！)
　

* 後は32bitプロセスで動いているのか確認！
![スクリーンショット 2014-08-25 18.55.02.png](https://qiita-image-store.s3.amazonaws.com/0/48016/edfd453a-d3f1-fa31-36ad-0d3d877c1769.png)

晴れて、Poderosaが64bitモードで動きました！
Poderosa(x64).exeが今回ビルドしたの64bit版で動くPoderosaです！
通常のPoderosa.exeは32bitで動いています。

ここまでやると、こちらの[バッチファイル](http://qiita.com/hanamiche/items/c1fc39442d8ab823482b)でポンポンと新しいタブで開く元の挙動になりました！

# あとがき
今回はPoderosaでしたが.NETのアプリケーションには同じような問題があるかもしれない。
.NETアプリすべてを32bitで動かすような設定もあるようなので確認したい
Fluentd v0.10.53のリリース

[Fluentd v0.10.53がリリース](http://www.fluentd.org/blog/fluentd-v0.10.53-is-released)されました．

恒例？の日本語での簡単な解説になりますが，v0.10.53の変更点は以下になります．

* in_tail: Fix forget to detach Closer timer object: [#394](https://github.com/fluent/fluentd/pull/394)
* in_debug_agent: Fix config_param type of unix_path: [#392](https://github.com/fluent/fluentd/pull/392)
* in_syslog: Add include_source_host and source_host_Key options: [#391](https://github.com/fluent/fluentd/pull/391)
* config: Dump V1 escaped parameter correctly at start phase: [#389](https://github.com/fluent/fluentd/pull/389)
* config: Fix bug for config_param of bool value without defaults: [#410](https://github.com/fluent/fluentd/pull/410)
* config: Add 'alias' option to config_section and config_param: [#402](https://github.com/fluent/fluentd/pull/402)
* buffer: Add 'disable_retry_limit' option: [#415](https://github.com/fluent/fluentd/pull/415)
* engine: Reduce memory usage when retry_limit is large: [#388](https://github.com/fluent/fluentd/pull/388)
* parser: Add apache_error format: [#396](https://github.com/fluent/fluentd/pull/396)
* supervisor: Dump Fluentd version at dry run mode: [#384](https://github.com/fluent/fluentd/pull/384)
* test: InputTestDriver wait 'run' until input plugin emits all test data: [#397](https://github.com/fluent/fluentd/pull/397)

今回も細かな改善が多いですが，いくつか機能追加があります．

### apache\_errorフォーマットの追加

Fluentdのパーサに`apache_error`を追加しました．MLとか見ていると，それなりにApacheのエラーログをin\_tailで集めている人がいるようなので，標準で提供するようにしました．

### disable\_retry\_limitオプションをバッファに追加

今まで`retry_limit`を無制限にしようとすると，`retry_limit 999999999`みたいに到達しないであろう大きな値を設定していましたが，`disable_retry_limit`によってこの手のトリックがいらなくなりました．
永遠にリトライすることになるので，当たり前ですが`<secondary>`は呼び出されなくなります．

### aliasオプションをconfig_section/config_paramに追加

DSLの設定を使っている時に設定名がRubyのキーワードとかぶっていると，パースエラーになるという問題があり，それを解決するために入れました．
forestのcaseとか，Rubyのキーワードをかぶっているような設定を使っているプラグインはaliasを追加しましょう．

## v0.12の開発をmasterブランチで開始

v0.12の開発に集中するため，v0.10は別ブランチにして，masterはv0.12向けになりました．v0.12の主要機能であるFilterやLabelの実装についてはすでに[PR #416](https://github.com/fluent/fluentd/pull/416)で進めており，これもそろそろmasterにマージされる予定です．

もしv0.10固有の問題に当たった場合には，PRは[v0.10ブランチ](https://github.com/fluent/fluentd/tree/v0.10)に送るか，[v0.10ラベル](https://github.com/fluent/fluentd/labels/v0.10)をつけてissueをオープンしてもらえればと思います．
【AppleScript＋Illustrator】日本語パスのAIファイルを開く

AppleScriptでAdobe系のアプリケーションをコントロールする際、
何気に問題になる日本語ファイルパスの対応法メモ。

```applescript:

on aiFileOpen(f)
	(*最初にPosix Pathに変換*)
	set f to POSIX path of f
	
	(*シングルコーテーションをエスケープ*)
	set AppleScript's text item delimiters to {"'"}
	set f to text items of f
	set AppleScript's text item delimiters to {"\\'"}
	set f to f as Unicode text
	set AppleScript's text item delimiters to {""}
	
	(*JavaScriptでencodeURIエスケープして開く*)
	tell application id "com.adobe.illustrator"
		do javascript "app.open(new File(encodeURI('" & f & "')));"
	end tell
end aiFileOpen

aiFileOpen(choose file of type {"ai"})
```
Project Eulerをhaskellで練習していく日記: Problem 30

#問題
驚くべき事に、各桁の４乗を足すと元の数になるのは、以下の３つのみである。（ただし１は除く）
1634 = 1^4 + 6^4 + 3^4 + 4^4
8208 = 8^4 + 2^4 + 0^4 + 8^4
9474 = 9^4 + 4^4 + 7^4 + 4^4
これら３つの数の和は、1634 + 8208 + 9474 = 19316である。

同様に、各桁の５乗を足すと元の数になるものたちの和を求めよ。
#回答
N桁の数の各桁の５乗を足すと、最大でもN*(9^5)までにしかならない。
9^5=59049なので、N<=6という上限が課せられる。
その上、6*(9^5)=354294なので、2〜354294の範囲で探せばよいことになる。

```hs
main = do
     print $  [x| x<-[2..354294], x==sum (map ((^5).read.(:"")) (show x))]
```
#感想
プログラム自体は１行で簡単あるが、探す範囲の上限を見いだすのに時間がかかりました。
Git でどのブランチにいつコミットしたか覚えていないコードを検索する

並行して多くのブランチを扱っていると、どのブランチでどんなコードを書いたか分からなくなる状況がたまにある。「ここのバグは修正したはずなのにこのブランチには反映されていない……」など。

埋もれたコードを手っ取り早く検索するには reflog の記録を全部 grep するとよい。最近ローカルで操作したブランチ（デフォルトで90日以内のもの）や消してしまったブランチ（同30日以内）を対象に検索できる。

```bash:reflogをgrep
for i in $(seq 0 100); do echo "*** HEAD@{$i} ***"; git grep -e 検索文字列 "HEAD@{$i}"; done
```

コードがどの `HEAD@{n}` に含まれるか突き止めたら `git show` や `git cherry-pick` などで好きに取り出す。ブランチ名を調べるには `git reflog` で `HEAD@{n}` 行のあたりを見て、 `HEAD@{m}: checkout:` (m>n) を探す。

`seq 0 100` の範囲は適当に増減させること。最大値は `git reflog | tail -n2` で確認できる（`-n2` しているのは、どうやらv2.1.0時点では `git reflog` の最終行が途中で途切れるバグがあるため）。

Tip: reflog が記録を保持する期間を変えるには `git config` で `gc.reflogexpire` または `gc.reflogexpireunreachable` をセットする。
ajaxで返ってきた値がjsonにならない問題


```ajax.js
$.ajax({
	type:     'POST',
	url:      '/url/path',
	dataType: 'json',
	data:     data,
	success:  function(data){
　　　　　　　・・・
```

`dataType: 'json',` この一文を忘れたせいで、`data`の中身が`string`になってた。
反省。

`dataType`を指定しないと自動判定されるそうです。
参照：[jQuery $.ajaxでJSON・JSONP読み込みに使用する主なオプション](http://iwb.jp/jquery-ajax-option/)





後から調べたら、同じことでハマってた人の記事が出てきました。
もっと早くここに辿り着ければ。。

[jQuery.ajaxでjsonがうまく取得できない時は](http://lealog.hateblo.jp/entry/2011/12/16/234332)





適切な調べ方を身に着けたい今日この頃なのです
TreasureDataのUDFとPrestoでのRank関数の挙動について

# Rank付け
RANK関数で順序をつけるときの順序の付け方って何がベストなのか、について気になったので。
RANK付けには２種類が有ると思います。
1. 同一の値の場合には、同じ番号を付与する
2. 同一の値の場合には、別の番号を付与する

1の例(user_idとアクセス時間でRank):

| number | user_id | date         |
|-------:|--------:|-------------:|
| 1      | userA   | 2014-01-01   |
| 2      | userA   | 2014-01-02   |
| 2      | userA   | 2014-01-02   |
| 4      | userB   | 2014-01-01   |

2の例(user_idとアクセス時間でRank):

| number | user_id | date         |
|-------:|--------:|-------------:|
| 1      | userA   | 2014-01-01   |
| 2      | userA   | 2014-01-02   |
| 3      | userA   | 2014-01-02   |
| 4      | userB   | 2014-01-01   |

# なぜ気になったのか
TreasureDataには、TD_X_RANKという独自UDFのRANK関数がでは、2を採用しているが、
PrestoのRANK関数では1を採用しており、一般的にどちらが好まれるのかな？と疑問に思ったため。

# TreasureDataのTD_X_RANKを試してみる
http://docs.treasuredata.com/articles/udfs#tdxrank

```sql
SELECT 
  TD_X_RANK(USER) AS rank,
  USER,
  TD_TIME_FORMAT(time,
    'yyyy-MM-dd HH:mm:ss',
    'JST') AS time
FROM (
    SELECT 
      USER,
      time
    FROM
      www_access
    CLUSTER BY USER, time
  ) t
```
![hive.png](https://qiita-image-store.s3.amazonaws.com/0/34543/cdfc3789-3146-7919-9a64-641ad6b38f50.png)



# PrestoのRANKを試してみる
http://prestodb.io/docs/current/functions/window.html

```
SELECT 
  RANK(
  ) OVER(
    PARTITION BY USER
  ORDER BY
    time
  ) AS rnk,
  USER,
  TD_TIME_FORMAT(time,
    'yyyy-MM-dd HH:mm:ss',
    'JST') AS time
FROM
  www_access
ORDER BY
  USER,
  rnk
```

![presto.png](https://qiita-image-store.s3.amazonaws.com/0/34543/bc6af8b3-9659-0142-dbea-d17b9d4b0ad5.png)


# おわりに
書いてておもったのですが、TD_X_RANKは、Prestoのrow_number関数と同じだと思えばよかったのですね。
なるほどなるほど。

# PrestoのROW_NUMBERを試してみる
```sql
SELECT 
  ROW_NUMBER(
  ) OVER(
    PARTITION BY USER
  ORDER BY
    time
  ) AS rnk,
  USER,
  TD_TIME_FORMAT(time,
    'yyyy-MM-dd HH:mm:ss',
    'JST') AS time
FROM
  www_access
ORDER BY
  USER,
  rnk
```
![row_number.png](https://qiita-image-store.s3.amazonaws.com/0/34543/dc3a2794-9605-8db4-91c8-4e71a335fad1.png)


# おわりにpart.2
Hiveでrow_numberがなかったっけ？とおもったら、0.11以上からでした。
なるほどなるほど。
Automator でペースト操作


クリックとかキーボド操作の自動化でいいのないかなーと調べていたら、mac に標準搭載の Automator でいけると発見。
でもどうやらペーストだけは AppleScript でなんとかするしかないみたい。

ペースト操作

```
tell application "System Events"
	
	keystroke "v" using {command down}
	
end tell
```

あと作ったワークフローを繰り返したい時は、"ループ" でいける。
fabricインストール(CentOS6.5)

CentOS6.5でハマったので、メモ

1.前提条件
・CentOS6.5 64bit minimal baseパッケージインストール済
・インターネット接続されている事
・SELinux無効、iptables停止

2.手順
以下のコマンドを全てrootで実行 

<pre>
# yum groupinstall "Development Tools" “Base”
# yum install zlib-devel tk-devel tcl-devel sqlite-devel ncurses-devel gdbm-devel readline-devel bzip2-devel db4-devel openssl-devel python-setuptools python-devel
# easy_install pip
# pip install fabric
</pre>

setuptoolsのバージョンが古いとか何とかエラーがでたら、下記を実行

<pre>
# pip install setuptools --no-use-wheel --upgrade
</pre>

pycryptoのバージョンによっては、実行時に以下のエラーが出る

<pre>
AttributeError: 'module' object has no attribute 'HAVE_DECL_MPZ_POWM_SEC'
</pre>

pycryptoのバージョンを変更すればよい

<pre>
# pip uninstall pycrypto
# pip install PyCrypto==2.3
</pre>

3.動作確認

<pre>
# fab –V
Fabric 1.9.0
Paramiko 1.14.0
</pre>

バージョンが表示されればOK
インストールされたバージョン確認

<pre>
# pip freeze
Fabric==1.9.0
ecdsa==0.11
iniparse==0.3.1
paramiko==1.14.0
pycrypto==2.6.1
pycurl==7.19.0
pygpgme==0.1
urlgrabber==3.9.1
virtualenv==1.11.6
yum-metadata-parser==1.1.2

# pip show setuptools
Name: setuptools
Version: 5.4.1
Location: /usr/lib/python2.6/site-packages
Requires:
</pre>
iTunes Connect リリース時のエラー

備忘録

iTunes Connectで手動リリースをする際に、

The following error(s) occurred:

There was an error saving changes. Please try again later or contact App Store Developer Support.

と表示されて、リリース出来なくなる現象が起きました。
サポートに連絡を取るぐらいしかやりようがないみたいですが、
私の場合、約1日後にエラーが出なくなりリリースする事が出来ました。
MonoBehaviour用のSingletonに別れを告げる

基底クラスを消費するSingletonがあまり好みでないので、以下のようなServiceLocator的に参照を得るスタイルを試している。

```csharp:ComponentLocator.cs
public class ComponentLocator {
	static ComponentLocator instance;
	public static ComponentLocator Instance {
		get {
			if (instance == null) {
				instance = new ComponentLocator();
			}
			return instance;
		}
	}

	Dictionary<Type, WeakReference> cache = new Dictionary<Type, WeakReference>();

	public TComponent Get<TComponent>() where TComponent : Component {
		Type compType = typeof(TComponent);

		WeakReference compRef;
		if (cache.TryGetValue(compType, out compRef)) {
			var target = compRef.Target as TComponent;
			if (target) {
				return target;
			} else {
				Uncache(compType);
			}
		}

		var comp = GameObject.FindObjectOfType<TComponent>();
		if (comp) {
			Cache(comp);
			return comp;
		}

		GameObject go = new GameObject(compType.Name, compType);
		comp = go.GetComponent<TComponent>();
		if (comp) {
			Cache(comp);
			return comp;
		}

		return null;
	}

	// 初回のFindObjectOfTypeも回避したければ、Script Execution Orderを引き上げた後、Awake()でCache()を呼んでおく。
	public void Cache(Component comp) {
		cache[comp.GetType()] = new WeakReference(comp);
	}

	public void Uncache(Type compType) {
		cache.Remove(compType);
	}

	public void ClearCache() {
		cache.Clear();
	}
}
```

こう使う。

```csharp
void Awake() {
	foo = ComponentLocator.Instance.Get<Foo>();
}

void Update() {
	foo.bar();

	// まぁ、Getは長命なコンポーネントならコスト小さいので以下でもよい。
	ComponentLocator.Instance.Get<Foo>().bar();
}
```

対象のコンポーネントはシーンに置いといてもいいし、なければ呼び出し時に作られる。
シーンをまたいで存在しうるかはComponentLocatorでは関知しないので、必要ならコンポーネント実装側でDontDestroyOnLoadすること。

このスタイルが気に入っているのは、Singletonっぽいなと思いつつも考えるの後回しにしてて、とりあえずインスタンスはひとつしかないからAwake内でFindObjectOfTypeして使う。という怠惰な姿勢と合うこと。かな。
上層レイヤーのDOMを通過させて、下層レイヤーにクリックイベントを発火させるには


マークアップの構造として、最上位層にフィルターもしくはマスクのようなDOMを画面全体の大きさで配置したとします。
こうした場合、そのDOMが全てのクリックイベントを遮ってしまうため、
下層にあるDOMに対してクリックイベントやホバーイベントが発火することがなくなってしまいます。


たまにこういうケースに演出上やむを得ず突き当たる場合があると思います。

これを解決することのできるCSS3のプロパティとして、

```
pointer-events: none;
```

があります。

pointer-events: none; 

を、クリックイベントを発火させたくないDOM、つまり前述したケースだと
最上位層のDOMに対して設定することで、そのDOMに対して発生したイベントは無視され、
下層のイベントに対してイベントが発火してくれるようになります。

つまり、クリックイベントがDOMを通過してくれるようなイメージです。

しかし、この pointer-events プロパティはIEだと11からしかサポートしていないため、
実務においてはあまり実用的であるとは言えません。

古いIEブラウザまでサポートするように同様の機能を実装するには、
クリックイベントが発火した位置と、イベントの受け皿としたいDOMの位置とをoffsetパラメータ等を用いて比較し、
一致した場合にはイベントをtriggerで発火させるといった強引なやり方が必要になりそうです。
Gitを使うとき、ssh-agentが増殖してしまう問題のシンプルな解法

# 今までのやり方

.bashrcにこう書いていた。

```bash
eval `ssh-agent`
ssh-add
```

ssh-agentはbashを閉じても死なないので、このやり方だと、bashを開く度にssh-agentのプロセスが増殖してしまう。

# 解決方法
ssh-agentの出力をファイルに吐き出して、使いまわす

## Windows版Gitの場合
- start-ssh-agent.bat(ssh-agent起動スクリプト。スタートアップ時などに呼び出せばいい)

```bat
set git="C:\Program Files\Git\bin\sh.exe"
%git% --norc -c "/bin/ps | /bin/grep -q ssh-agent && /bin/ps | /bin/grep ssh-agent | /bin/gawk '{print $1}' | /bin/xargs /bin/kill"
%git% --norc -c "/bin/mkdir -p /var && /bin/ssh-agent > /var/ssh-agent.out"
```

- .bashrc

```bash
eval `cat /var/ssh-agent.out`
ssh-add
```

## Linuxの場合
※Windows版と内容はまったく同じ。むしろこっちのほうがシンプル。

- start-ssh-agent.sh(ssh-agent起動スクリプト。スタートアップ時などに呼び出せばいい)

```bash
ps ax | awk '$5 ~ /^ssh-agent/{print "kill "$1}' | sh
ssh-agent > /var/ssh-agent.out
```

- .bashrc

```bash
eval `cat /var/ssh-agent.out`
ssh-add
```
HTML ImportsするHTMLのコンテキストになるdocument

Polymerに慣れたあとに、いざピュアなWeb Componentsでやろうとするとハマるかもしれないポイント。
`document.registerElement()`と`<template>`やらを使ってWeb Componentsを構成するときに、ライフサイクルコールバック中にそのテンプレートタグを当然参照すると思いますが、インポートをしているとコンテキストになる`document`がずれる話。

コードで見たほうが早いと思われるので早速例を。

## Polymerを使って`x-element`を作る場合

`x-element.html`の例。

```html:html
<link rel="import" href="lib/polymer/polymer.html">
<polymer-element name="x-element" attributes="foo bar">
  <template id="tmpl">
    <div>This is x-element!</div>
  </template>
  <script>
    Polymer('x-element', {
      ready: function () {
        // <template id="tmpl">を難なく取得出来る。
        console.log(this.$.tmpl);
      }
    });
  </script>
</polymer>
```

コメントに書いてありますが、`x-element.html`内の要素を簡単に参照できる。なぜならばPolymerが上手いこと https://twitter.com/hokaccha/statuses/479063274881683457 みたいな仕組みを作っているからなんだけど、いざこれをピュアなWeb Componentsでやってみようとすると、どうなるか。

## Polymerを使わず`x-element`を作る場合

`x-element.html`の例。

```html:html
<template id="tmpl">
  <div>This is x-element!</div>
</template>
<script>
  var XElementPrototype = Object.create(HTMLElement.prototype);
  XElementPrototype.createdCallback = function () {
    console.log(document.querySelector('#tmpl'));
  };
  window.XElement = document.registerElement('x-element', {
    prototype: XElementPrototype
  });
</script>
```

実は、いざこれをインポートしようとするとエラーが起きる。具体的には`document.querySelector('#tmpl')`している箇所でエラーが起きるのだけど、なぜならばこのスクリプトを評価しているコンテキストが **`x-element.html`をインポートしているHTML** だからである。（逆に言えば、先程の`<link rel='import'>`ではなくHTMLにベタ書きすればコンテキストはそのままなのでOKではある。）

この`querySelector()`の実行ドキュメントは`x-element.html`でないと、`<template>`はパースされておらず参照不可能なので、ちょっとやり方を変える必要がある。それには`document.currentScript.ownerDocument`を使う。

- https://developer.mozilla.org/ja/docs/Web/API/document.currentScript
- https://developer.mozilla.org/ja/docs/Web/API/Node.ownerDocument

```html:html
<template id="tmpl">
  <div>This is x-element!</div>
</template>
<script>
  var thisDocument = document.currentScript.ownerDocument;
  var XElementPrototype = Object.create(HTMLElement.prototype);
  XElementPrototype.createdCallback = function () {
    // #tmplはthisDocument内にある
    console.log(thisDocument.querySelector('#tmpl'));
  };
  // registerElementするdocument はインポート元のdocumentのままでOK
  window.XElement = document.registerElement('x-element', {
    prototype: XElementPrototype
  });
</script>
```

実行コンテキストは各コンポーネントとして独立させているHTML（ここでいう`x-element.html`）にしつつ、変数とかはインポートした先でそのまま展開されるということが頭にあれば混乱しないと思う。つまり、ここで`document.currentScript.ownerDocument`のキャッシュで`var thisDocument`としているけど、他の`y-element.html`でもthisDocumentとかにキャッシュさせて両方共インポートしていると、変数が上書きれて上手くいかないかと思われる。
Rails の production 以外の環境で時刻などをログに出力する

かなり単純なことですが、検索してもシンプルな方法が引っかからなかったので書いておきます。

## 問題

Rails は、デフォルトのままだと production では以下のようなログを出力します。

```log/production.log
D, [2014-08-25T13:19:43.756025 #1104] DEBUG -- : foo
I, [2014-08-25T13:19:43.756434 #1104]  INFO -- : bar
```

しかし、production 以外の環境だと、以下のようにメッセージしか出力してくれません。

```log/development.log
foo
bar
```

普通に開発している分には、リクエストを受けた時刻が以下のように記録されるので困らないかもしれません。

```
Started GET "/foo" for x.x.x.x at 2014-08-25 12:33:37 +0900
```

しかし、リクエストを返すまでの細かい時刻が知りたい、rake タスクのデバッグで時刻が見たい、など prodcution 以外でも詳細な情報を見たい場合があると思います。

## 解決

そのためには、以下のようにします。

```config/application.rb
config.log_formatter = Logger::Formatter.new
```

これだけです。`config/application.rb` の時点では `config.logger` は設定されていないので、`config.logger.formatter = ...` とはできないのに注意です。

おしまい。
サーバ証明書だけもらった時に中間証明書のありかと期限をチェック

<!-- permanent -->

『サーバの証明書更新してください！ファイルはこれ』と、鍵セットだけ貰った時。いやそれどこ発行でいつまで有効やねんと。

とりあえずベンダをチェック。

```shell:
$ openssl x509 -in ssl.example.com -text | grep -i Issuer
        Issuer: C=JP, O=Cybertrust Japan Co., Ltd., CN=Cybertrust Japan Public CA G3
                CA Issuers - URI:http://sureseries-crl.cybertrust.ne.jp/SureServer/ctjpubcag3/ctjpubcag3.crt
```

発行者が`Cybertrust Japan Public CA G3`だ。
ほな中間証明書いるので、 https://www.cybertrust.ne.jp/ssl/support/download_ca.html#02 から取ってくるか。。。

ついでに期限をチェック。

```shell:
 $ openssl x509 -in ssl.example.com.cert.pem -text | grep -i after
            Not After : Sep 30 14:59:00 2015 GMT
```

リマインダにでも登録しとくか。
postfixとdovecotとでPAM認証 (POP before SMTP)

# PAM認証

## 要件

* postfixだけでは `POP before SMTP` がないので、dovecotの機能を使う。
* PAM認証のためsasl_pathをpostfixとdovecotで合わせる。
  * PAM認証とは、サーバ上のユーザのID/Passで認証のことです。

## パッケージインストール

```bash:インストール
pacman -Sy postfix dovecot extra/cyrus-sasl
```

```bash:設定コピー
sudo cp /etc/dovecot/dovecot.conf{.sample,}
```

## 設定

```diff:/etc/postfix/main.cf
(略)
+ smtpd_sasl_type = dovecot
+ smtpd_sasl_path = private/auth
  smtpd_sasl_auth_enable = yes
  smtpd_sasl_security_options = noanonymous
  smtpd_recipient_restrictions =
    permit_mynetworks,
    permit_sasl_authenticated,
    permit_auth_destination,
    reject_rbl_client all.rbl.jp,
    reject_rbl_client bl.spamcop.net,
    reject_rbl_client zen.spamhaus.org,
    reject
(略)
```

```diff:/etc/dovecot/conf.d/customize.conf
  ssl = no
  
  protocols = imap pop3
  disable_plaintext_auth = no
  mail_location = maildir:~/Maildir
  
+ mail_privileged_group = mail
+ service auth {
+   unix_listener /var/spool/postfix/private/auth {
+     group = postfix
+     mode = 0660
+     user = postfix
+   }
+ }
+ 
+ passdb {
+   driver = pam
+   args = %s
+ }
+ userdb {
+   driver = passwd
+ }
```


# SMTP-TLS対応

* Gmailからsmtpサーバの追加をする時、TLS対応している必要がある。

## 鍵生成

```bash:
% mkdir /etc/postfix/tls && cd /etc/postfix/tls
# 秘密鍵作成。(Enter PEM pass phrase:でパスフレーズ入力)
% openssl genrsa -des3 2048 > localhost.key
# 秘密鍵からパスフレーズを削除 (Enter pass phrase for private/localhost.key:)
% openssl rsa -in localhost.key -out localhost.key
# サイト証明書作成
% openssl req -new -x509 -key localhost.key -out localhost.crt -days 7300

-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) []: 
Organization Name (eg, company) [Internet Widgits Pty Ltd]: MY COMPANY
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:mydomain.co.jp
Email Address []:

% ls -lh
-rw-r--r-- 1 root root 1.3K  9月 29 07:28 localhost.crt
-rw-r--r-- 1 root root 1.7K  9月 29 07:27 localhost.key
```

## postfixの設定

```bash:
% cd /etc/postfix/
% touch smtpd_tls_scache
% vim main.cf
```

```bash:main.cfに追加
#TLSを有効にする
smtpd_use_tls = yes
#秘密鍵ファイルの指定
smtpd_tls_key_file = /etc/postfix/tls/localhost.key
#証明書ファイルの指定
smtpd_tls_cert_file = /etc/postfix/tls/localhost.crt
```

```diff:master.cf
submission inet n       -       n       -       -       smtpd
#  -o syslog_name=postfix/submission
-#  -o smtpd_tls_security_level=may
+   -o smtpd_tls_security_level=may
```

* [Postfix TLS サポート](http://www.postfix-jp.info/trans-2.2/jhtml/TLS_README.html)

## postfix restart

```bash:
systemctl restart postfix
journalctl -u postfix -f
journalctl -u postfix --since=today
```
[書評] CSS設計の教科書

先週読んだ本が参考になったのでまとめてみました。


<a href="http://www.amazon.co.jp/gp/product/4844336355/ref=as_li_ss_il?ie=UTF8&camp=247&creative=7399&creativeASIN=4844336355&linkCode=as2&tag=yd_niku-22"><img border="0" src="http://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4844336355&Format=_SL250_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=yd_niku-22" ></a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=yd_niku-22&l=as2&o=9&a=4844336355" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

# 章の構成と内容

第1章で、CSSにおける設計とは、という前提と筆者のかたの考えを説明しています。
HTMLに依存しない、スタイルの上書きをしない、など後々の修正の影響が理解しやすいものをよしとしていることと、また早めに設計し実機で確認しながら作るアジャイル的なワークフローを用いることがフロントエンド側からできるアプローチだ、としています。

第2章では カスケーディングの仕組みと詳細度について、不用意に詳しい指定をしない(セレクタを短くする)ような整理(リファクタリング)のしかたを説明しています。

第3章ではコンポーネント設計のアイデアとして、基本的なコンセプトと各種法の方法を紹介しています。基本的な考え方として「関心の分離」というのがあり、コンポーネント単位で独立して作る(適度にカプセル化する)ことが重要としています。

    - OOCSS
    - SMACSS
    - BEM
    - MCSS
    - FLOCSS

上記の5つについて、それぞれのパターンのコンポーネントレイヤーの分類と例示があります。
FLOCSSは谷さんが独自に作成しているものだそうです。

第4章ではコンポーネント設計の実践のための考え方を説明しています。Martin FowlerのRefactoringというプログラムの改善テクニックのカタログを引用して、CSSの改善のポイントをまとめているのが特徴です。
単一責任の原則や、開放/閉鎖の原則にもとづいた改善ポイントを説明した上で、再利用だけが全てではないとしています。
4−2ではボタンや見出しといった具体的な部品ごとの設計のパターンが例示としてまとめられています。

第5章〜第6章でははSASSなどのプリプロセッサなどを用いた開発手法やプロジェクトの管理についてまとめられています。
ここで命名規則におけるセマンティック性などチーム内で共有すべき考え方についても触れられています。スタイルガイドなどのドキュメントの自動生成ツールなどの紹介もあります。

最後の第7章で、WebComponentsを利用したHTMLを含めた部品のパッケージ化について説明があります。

# 書評

この本は、筆者の方のさまざまな経験をもとに、広い意味で設計の考え方としての整理と注意点がまとめられています。
ただ具体的な手法としてはこうするのが正しいという見解やベストプラクティスのようなものは提示されていません。

開発や運用で苦労された方にはその経験を整理したり見直す意味でとても本だと思いますが、
経験が浅い方がステップアップしたいときに、ああいうやり方もあるし、こういうのもある、という感じでモヤっとしてしまうかもしれません。

これは、そもそも設計に求められるものが要件よってさまざまであることと、その要件と手法を付きあわせた落とし所を見極める作業が必要だということだと思います。

より良い設計にたどり着くには、まず大事にすべきポイントを理解したうえで、自分の頭で考えたり、チームでディスカッションすることが重要だということを考えさせられます。

そういった勘所を養うためのガイドとして、チームで作っているプロダクトへの意識を育んでいくためにこの本は有用なのではないかと思いました。

<a href="http://www.amazon.co.jp/gp/product/4844336355/ref=as_li_ss_il?ie=UTF8&camp=247&creative=7399&creativeASIN=4844336355&linkCode=as2&tag=yd_niku-22"><img border="0" src="http://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4844336355&Format=_SL250_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=yd_niku-22" ></a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=yd_niku-22&l=as2&o=9&a=4844336355" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />


# 自分的に良かったところ

OOCSSやSMACSSなどの違いを俯瞰して見られたのが個人的にはよかったです。

今の開発スタイルに近いのがSMACSSのレイヤー構造なのですが、そこにMCSSの考え方をブレンドできるとよさそうだと感じました。

SMACSSはModule、State、Themeといった機能的な分類で理解しやすいメリットがありますが、LayoutとModule、ModuleとStateなど判断が難しい場合がありました。
MCSSのいいところはFoundation(基礎)→Base(モジュール、パーツ、ステート)→Project(画面構成、レイアウト)→Cosmetic(その他)という具合に、レイヤーの分け方が開発工程に近いところだと思いました。

どちらかだけだと分担した時にムラがでたりカオスになってしまうので、2つの視点
があることで落とし所を議論したり判断しやすくなることを期待しています。
SwiftのAssociated Values(enum)とパターンマッチで無理やりSet


enumのAssociated Valuesの使い方を練習してみました．こういう使い方もできるな，という程度の遊びです．

```swift
enum Option {
    enum Kind {
        case None, Opt0, Opt1, Opt2, Opt3
    }

    case _Set(Kind, Kind, Kind, Kind)

    static func Set(opt: Option.Kind, _ opts: Option.Kind...) -> Option {
        switch opts.count {
        case 0:  return ._Set(opt, .None,   .None,   .None)
        case 1:  return ._Set(opt, opts[0], .None,   .None)
        case 2:  return ._Set(opt, opts[0], opts[1], .None)
        case 3:  return ._Set(opt, opts[0], opts[1], opts[2])
        default: return ._Set(.None, .None, .None, .None) // error
        }
    }

    func has(o: Option.Kind) -> Bool {
        switch self {
        case ._Set(o, _, _, _): return true
        case ._Set(_, o, _, _): return true
        case ._Set(_, _, o, _): return true
        case ._Set(_, _, _, o): return true
        default: return false
        }
    }

    func has(o: Option) -> Bool {
        switch o {
        case ._Set(let a, let b, let c, let d):
            return has(a) && has(b) && has(c) && has(d)
        default: return false
        }
    }
}
```

要素チェック用の`has`とサブセットチェック用の`has`を定義．

- 要素用のは，ドントケア(wildcard pattern)の`_`をたっぷり使ってタプル内を全検査．タプル内の何処かに要素があれば`true`を返す．

- サブセット用のは，タプルパターン＆バリューバインディングパターンで全要素を分解し，それそれを要素用の`has`でチェックしています．

Kindが増えると機械的とは言え，実装するの面倒くさいですね．

使い方，

```swift
var x = Option.Set(.Opt0, .Opt1)
var y = Option.Set(.Opt1, .Opt2)
var z = Option.Set(.Opt2, .Opt3)

x.has(.Opt1)    // true
y.has(.Opt0)    // false
z.has(.Opt3)    // true

x.has(y)        // false
y.has(z)        // false
z.has(x)        // flase

x.has(Option.Set(.Opt0, .Opt1))    // true
x.has(Option.Set(.Opt0, .Opt3))    // false

```
jQuery.リスト(ul ol)をToggleで開閉

#ul、olタグを使ったリストの開閉

JavaScriptの実装は苦痛なので目的からどう実装したか忘れないようにメモる

##実装

liタグに開く対象のidを仕組んたaタグを配置、リンクのクリックでToggle関数を使い開閉する

###HTML側

```html:index.html

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
  </head>
  <body>

  <ul>
    <li>
      <a href="#" onclick="magazineToggle($('#date2014')); return false;">2014年のバックナンバー</a>
      <ol id="date2014">
        <li><a href="/magazine/2014/01.html">1月号</a></li>
        <li><a href="/magazine/2014/05.html">5月号</a></li>
      </ol>
    </li>
    <li>
      <a href="#" onclick="magazineToggle($('#date2013')); return false;">2013年のバックナンバー</a>
      <ol hidden="" id="date2013">
        <li><a href="/magazine/2014/01.html">1月号</a></li>
        <li><a href="/magazine/2014/05.html">5月号</a></li>
        <li><a href="/magazine/2014/09.html">9月号</a></li>
      </ol>
    </li>
  </ul>

  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
  <script src="/js/main.js"></script>
  </body>
</html>
```

2013年はデフォルトで閉じ、2014年はデフォルトで開く設定にしている

###javaScript側

```js:/js/main.js
function magazineToggle(e) {
  e.toggle();
//  e.slideToggle(500);//アコーディオンなアニメーションができる
}
```

##要素が多い場合

llタグの子要素にolタグがあった場合、自身の表示を切り替える
のような実装が望ましいが今回は要素が少ないので実装を諦めた
CAKEPHPで検索プラグイン（Search Plugin)

メモ


# bash

```bash
cd app/Plguin/
git clone https://github.com/CakeDC/search
```

# app/Config/bootstrap.php [add]

```php
CakePlugin::load('Search');
```


# app/Model/User.php

```php
<?php
class User extends AppModel {

        var $displayField = "account";

        var $actsAs = array( "Search.Searchable" );

        var $filterArgs = array(
                array(  "name" => "id", "type" => "value" )
        );
}
```

# app/Controllers/UsersController.php

```php
<?php
class UsersController extends AppController {

var $components = array ( "Search.Prg" );

function index() {

        $this->Prg->commonProcess();
        $this->Paginator->settings["conditions"] = $this->User->parseCriteria($this->Prg->parsedParams());
        $this->request->list = $this->paginate();
}

}
```
Haskellの型クラスとF#のインターフェース

[Haskellの実験メモ](http://qiita.com/7shi/items/b6cbb7df2dd969c84f49)です。

Haskellの型クラスはオブジェクト指向言語のインターフェースと似ている面があります。特にF#のインターフェースは書式まで似ているため比較してみます。ただし似ているのは定義だけで、実装や呼び出し方法はあまり似ていません。

* 参考: [Haskellで関数のオーバーロード](http://qiita.com/7shi/items/17a1567a635af17fc83f)

# 定義

書式がとても似ています。

```hs:Haskell:型クラス
class Foo a where
    foo :: a -> String
```

```fsharp:F#:インターフェース
type Foo<'a> =
    abstract foo: 'a -> string
```

# 実装

Haskellの型クラスは、対象となる型とは分離した形で型クラスのインスタンスを作成します。

```hs:Haskell
instance (Num a, Eq a) => Foo a where
    foo 1 = "bar"
    foo _ = "?"

instance Foo String where
    foo "1" = "baz"
    foo _   = "?"
```

F#はあくまでオブジェクト指向的な意味合いでのインターフェースなので、クラスを定義して実装します。

```fsharp:F#
type FooInt() =
    interface Foo<int> with
        member x.foo a =
            match a with
            | 1 -> "bar"
            | _ -> "?"

type FooString() =
    interface Foo<string> with
        member x.foo a =
            match a with
            | "1" -> "baz"
            | _   -> "?"
```

# 呼び出し

Haskellの型クラスの関数はそのまま呼び出せます。

```hs:Haskell
main = do
    putStrLn $ foo 1
    putStrLn $ foo "1"
```

F#ではクラスのインスタンスを作成して、インターフェースにキャストして呼び出します。

```fsharp:F#
printfn "%s" <| (FooInt   () :> Foo<int>   ).foo 1
printfn "%s" <| (FooString() :> Foo<string>).foo "1"
```

そもそも概念が異なるので、同列に比較するのは無理があります。

# メソッドのオーバーロード

F#ではメソッドのオーバーロードが可能です。今回の例ではこちらを使った方が簡単です。

```fsharp:F#
type Foo =
    static member foo a =
        match a with
        | 1 -> "bar"
        | _ -> "?"

    static member foo a =
        match a with
        | "1" -> "baz"
        | _   -> "?"

printfn "%s" <| Foo.foo 1
printfn "%s" <| Foo.foo "1"
```

F#では型クラスに相当するものはありませんが、必要に応じてインターフェースかオーバーロードを使い分けることになりそうです。
git push/commitを忘れるなら、思い出させればいいじゃない

**:::DEPRECATED:::**

* git-forgotは非推奨になったため、代わりに[git-remind](https://github.com/suin/git-remind)を使ってください。
* [git-remind: Gitの｢コミット忘れ｣と｢プッシュ忘れ｣を防ぐツール - Qiita](https://qiita.com/suin/items/4932dd3f822ea8da8a01)

---


git add したが commit を忘れていた。コミット漏れがあって同僚に迷惑をかけた。複数のリポジトリを同時に触っていたら、片方のリポジトリをpushするのを忘れてしまった。gitを使ったことがあれば、このような失敗をしたことがあるのではないだろうか？

忘れることは人間である以上しかたない。であれば、思い出させてくれる何かがあればいい。例えば、通知センターでコミット漏れを教えてくれるだけでも十分だ。

![Screen Shot 2014-08-25 at 11.12.22.png](https://qiita-image-store.s3.amazonaws.com/0/889/cfd35194-7924-4e52-a20f-59f587843ed8.png "Screen Shot 2014-08-25 at 11.12.22.png")

そこで、今回作ったツールが[git-forgot]。このツールは、`git forgot`と打つとpushやcommitがされてないリポジトリを教えてくれるものだ。

![2__Shell.png](https://qiita-image-store.s3.amazonaws.com/0/889/16b42c12-af04-8867-2310-acc5da83446e.png "2__Shell.png")

この記事では、git-forgtについて紹介したい。

## インストール方法

インストールはMacであればHomebrewでできる。

```
brew tap suin/suin
brew install git-forgot
```

LinuxやWindowsは[ダウンロードコーナー]にバイナリを配布しているのでダウンロードしてほしい。

## セットアップ

git-forgotでチェックしたいディレクトリを環境変数 `GIT_FORGOT_DIR` に設定しておく必要がある。複数またはアスタリスクで指定できる。.gitがあるディレクトリのみチェックされるので、関係ないディレクトリが含まれていても構わない。

```
export GIT_FORGOT_DIR="$HOME/projects/* $HOME/github/*"
```

## 使い方

セットアップが完了したら、あとはコマンドを叩くだけでチェックできるようになる。コミット漏れやプッシュ忘れがあるリポジトリがあれば、そのパスが出る。問題なければ何も出ない。

```console
$ git-forgot
```

なお、gitのサブコマンドとしても使える。

```console
$ git forgot
```

リポーター(`--reporter`, `-r`)を指定すれば、通知センターに通知を送ることもできる。通知には[terminal-notifier]が必要なので、インストールしておいて欲しい。

```console
$ git forgot --reporter terminal-notifier
```

また、`git forgot -r terminal-notifier -t iTerm` のようにコンソールを`-t`で渡すと、通知センターの通知をクリックしたときに、該当プロジェクトを開けるようになる([m0aさん提供])。

crontabにしこんでおけば、定期的にコミット漏れなどをチェックし、通知センターで通知を受け取ることができる。

```sh:crontab
PATH=/usr/local/bin:/usr/bin:/bin

*/20 * * * * git-forgot -r terminal-notifier $HOME/projects/* $HOME/github/* > /dev/null 2>&1
```

pecoと組み合わせても便利。

```
alias gf='arr=(`git-forgot|peco`) && cd $arr[1]'
```

その他のオプションについては `-h` でヘルプを見れる。

```console
$ git forgot -h
```


## おわりに

コミット忘れ・プッシュ忘れが無くなるといいなと思う。なお、git-forgotはGoで書かれたオープンソースなので、いじってみたい人はGitHubを見てほしい。

https://github.com/suin/git-forgot


[git-forgot]: https://github.com/suin/git-forgot
[ダウンロードコーナー]: https://drone.io/github.com/suin/git-forgot/files
[terminal-notifier]: https://github.com/alloy/terminal-notifier
[m0aさん提供]: https://github.com/suin/git-forgot/pull/1
Hubotにお願いしてPull Requestの一覧を表示

Hipchat(Slack)上でHubotを使い、開発中のレポジトリでOpenしているPull Requestの一覧を取得する。

# 準備
* HubotをHipchatで動かす（インストール手順は省略）
* GitHubのPersonal access tokenを取得（https://github.com/settings/applications から取得可能）

# 手順
## hubot-scripts
GitHub社が公式でHubotスクリプト集を公開している。

* [github/hubot-scripts](https://github.com/github/hubot-scripts)
* [Hubot Script Catalog](http://hubot-script-catalog.herokuapp.com/)

その中の、[hubot-scripts/github-pulls.coffee](https://github.com/github/hubot-scripts/blob/master/src/scripts/github-pulls.coffee) を利用する。

Hubotインストール時に上記スクリプト群は同梱されている（`/path/to/hubot/node_modules/hubot-scripts/src/scripts/`以下）ので、利用する際は`hubot-scripts.json`に利用するスクリプトの名前を追記していけば良い。

```json:/path/to/hubot/hubot-scripts.json
[..., "github-pulls.coffee"]
```

## githubot
`github-pulls.coffee`は、githubotという外部モジュールに依存している。
[iangreenleaf/githubot](https://github.com/iangreenleaf/githubot)

このgithubotは、GitHub APIを簡単に扱えるNode.js用ラッパーで、`HUBOT_GITHUB_TOKEN`という環境変数にGitHubのアクセストークンを設定すれば利用可能。

例えば、

```coffeescript:example.coffee
github = require('githubot')
github.get 'https://api.github.com/user/repos', { type: 'private' }, (repos) ->
  console.log repos[0].name
```

のように書けば、ユーザーが管理しているプライベートリポジトリの情報を取得することができる。詳しくはREADME参照。

ということで、利用するためにインストールしておく。

```
$ npm install githubot --save
```

## レポジトリのPull Request一覧をチャット上で表示
ここまで来たら手順としてはほぼ完了している。`github-pulls.coffee`を確認しつつ、追加で環境変数を設定すれば良い。とりあえず必要なのは、

* `HUBOT_GITHUB_TOKEN`（先ほど述べたやつ）
* `HUBOT_GITHUB_USER`

の2つ。`HUBOT_GITHUB_USER`にはGitHubでのユーザー名を入れる。

```
$ export HUBOT_GITHUB_TOKEN = <トークン>
$ export HUBOT_GITHUB_USER = <GitHubのユーザー名>
```

このあとHubotを再起動すれば完了。

Hubotにお願いするコマンドは、

```
$ hubot show [me] <レポジトリ名> pulls
```

実際にチャット上で実行すると、

```
> hubot show hogehoge pulls
> I found 5 open pull requests for <ユーザー名>/hogehoge
  （略）
```

といった感じで、現在open中のPR一覧がURL付きで表示される。

ちなみに、`github-pulls.coffee`の中身を覗いてみると、正規表現を使ったPRタイトルの検索もできるようだ。

例えば、

```
> hubot show hogehoge pulls with WIP
```

と実行すれば、タイトルに"WIP"が含まれるものだけが表示される。Work in progressのものだけ確認したいときに良いかもしれない。

# 終わり
こんな感じで、Hubotを利用して簡単にGitHub上の情報を表示したりできる。[github/hubot-scripts](https://github.com/github/hubot-scripts)には、他にも色々なスクリプトが置いてあるので触ってみると面白そう。
Go言語:CLIツールの配布を自動化するためのDrone.ioの設定


## この記事のゴール

以下をすべて自動化する

* Linux用、Mac用、Windows用のバイナリのクロスコンパイル
* コンパイルされたバイナリの配布
* ビルドにバージョン情報を埋め込む

↓このような感じで、バイナリが配布できるようになる。

![Downloads___drone-golang-ci-example.png](https://qiita-image-store.s3.amazonaws.com/0/889/414f0513-dc1c-4b7d-4c92-b6aeb00b4b68.png "Downloads___drone-golang-ci-example.png")


## やりかた

ビルドにはDrone.ioを使う。Drone.ioの使い方については、以前書いた記事「[Go言語:自分のライブラリをGitHubで公開する方法+drone.ioで継続的インテグレーション - Qiita](http://qiita.com/suin/items/1237f210ef9e81b6475d)」にて解説しているので見てほしい。

Drone.ioの設定は次のようになる。なお、配布を自動化するために、Drone.ioのArtifactsページにて `artifacts/*/*` を設定する。ここでのサンプルは、http://github.com/suin/drone-golang-ci-example をビルドしている。

```
# 設定
APP_NAME="my-app"
APP_OS="linux darwin windows"
APP_ARCH="386 amd64"

# Go1.3.1をダウンロードする
pushd ~/
curl -s -o go.tar.gz https://storage.googleapis.com/golang/go1.3.1.linux-amd64.tar.gz
tar xzf go.tar.gz
export GOROOT=~/go
export PATH=$GOROOT/bin:$PATH
go version
popd

# goxをインストールする
go get github.com/mitchellh/gox
gox -build-toolchain -os="$APP_OS" -arch="$APP_ARCH"

# gitのコミットからバージョンを採番する
APP_VERSION=$(git log --pretty=format:"%h (%ad)" --date=short -1)
echo APP_VERSION is $APP_VERSION

# クロスコンパイルする
gox -os="$APP_OS" -arch="$APP_ARCH" -output="artifacts/{{.OS}}-{{.Arch}}/$APP_NAME" -ldflags "-X main.version '$APP_VERSION'"
find artifacts
```

クロスコンパイルはgoxを使う。[goxでGoをクロスコンパイルする - Qiita](http://qiita.com/ono_matope/items/6cc759da440ef768006f)を参照。Drone.ioに最初から入っているgo1.2ではgoxのbuild-toolchainが失敗する。なので、go1.3.1をダウンロードして入れる。

ビルド時にgitのリビジョン番号をバージョンとして埋め込む。バージョンをビルド時に埋め込む方法については、「[Go言語: ビルド時にバージョン情報を埋め込みたい - Qiita](http://qiita.com/suin/items/d643a0ccb6270e8e3734)」にて解説した。

## リンク

この記事で作ったdrone.ioのサンプル → https://drone.io/github.com/suin/drone-golang-ci-example/files
texliveベースのMacTeX-2014の日本語フォント設定


##フォントのリンク

```bash:フォルダに移動してリンク
cd /usr/local/texlive/2014/texmf-dist/fonts/truetype
sudo ln -s /Library/Fonts Fonts
sudo ln -s /Library/Fonts/ヒラギノ角ゴ\ Pro\ W3.otf HiraKakuPro-W3.otf
sudo ln -s /Library/Fonts/ヒラギノ明朝\ Pro\ W3.otf HiraMinPro-W3.otf
sudo ln -s /Library/Fonts/ヒラギノ角ゴ\ Pro\ W6.otf HiraKakuPro-W6.otf
sudo ln -s /Library/Fonts/ヒラギノ明朝\ Pro\ W6.otf HiraMinPro-W6.otf
```


##チェック．

```bash:lsで確認
ls /usr/local/texlive/2014/texmf-dist/fonts/truetype
...
lrwxr-xr-x   1 root  wheel   14  7 11 11:04 Fonts -> /Library/Fonts
lrwxr-xr-x   1 root  wheel   44  7 11 11:04 HiraKakuPro-W3.otf -> /Library/Fonts/ヒラギノ角ゴ Pro W3.otf
lrwxr-xr-x   1 root  wheel   44  7 11 11:04 HiraKakuPro-W6.otf -> /Library/Fonts/ヒラギノ角ゴ Pro W6.otf
lrwxr-xr-x   1 root  wheel   44  7 11 11:04 HiraMinPro-W3.otf -> /Library/Fonts/ヒラギノ明朝 Pro W3.otf
lrwxr-xr-x   1 root  wheel   44  7 11 11:04 HiraMinPro-W6.otf -> /Library/Fonts/ヒラギノ明朝 Pro W6.otf
...
```



##使えるようにする

```bash:mktexlsrをしないと探してくれない
sudo mktexlsr
```

##使うには
truetypeフォントを埋め込んだPDFの作成

```bash:dvipdfmxの使い方
dvipdfmx -f ptex-hiragino.map
```
ショッピングAPI の「ダウンロード要求API」「ダウンロード準備完了API」について教えてください。

「ダウンロード要求API」「ダウンロード準備完了API」を利用して
簡単なアプリを作成していますが、動作でわからない点があり教えていただけないでしょうか。

1.ダウンロード要求APIを利用し、商品データの作成要求を行います。
処理要求後の戻り値は、以下のようになっています。
``xml
<ResultSet>
<Result>
<Status>OK</Status>
</Result>
</ResultSet>
``

2.ダウンロード準備完了APIを利用し、作成完了結果を確認していますが、時間を空けて作成結果をみてもファイルが作成されていません。半日ほど時間を空けて確認もしていますが、作成できていないようです。
以下が、取得した結果になります。
``xml
<ResultSet totalResultsAvailable="0" totalResultsReturned="0" firstResultPosition="1">
<Result/>
</ResultSet>
``
処理結果を見ると特にエラーもなく、正常に動作しているようですが、ダウンロード可能にならずにダウンロードができない状況です。

「ストアクリエイター PRO」の画面でダウンロード要求後、ダウンロード準備完了API で、作成されたファイルが表示されることを確認しました。

お手数ですが、ダウンロード要求APIの利用方法・チェックすべき点などがありましたら、教えていただけないでしょうか。

どうぞ、宜しくお願いいたします。
画像からのテキスト抽出：tesseract-ocr

#はじめに
画像からの文字の抽出をやってみたいと思ってたので

#簡単
とにかく試してみたい方向きに

**ldiqual/tesseract-ios**
ReadMe.mdが丁寧で分かりやすかった。64bit対応ができるかは要確認
https://github.com/ldiqual/tesseract-ios
http://lois.di-qual.net/blog/install-and-use-tesseract-on-ios-with-tesseract-ios/

**gali8/Tesseract-OCR-iOS**
上記のコードに手をいれて64bit対応したみたい
https://github.com/gali8/Tesseract-OCR-iOS

カメラで撮影してまでテンプレで入っているので
実機転送まで出来るiOSの開発者ライセンスを持っている方には使いやすい

##定番はまり
**言語対応のため追加したjpn.traineddataが有効にならない**
→フォルダリファレンスじゃなくて、グループ指定してた
→なおした。動かない
→シミュレータのアプリ本体を削除忘れ
→消した。うごいたー

#応用
##iOS用にビルド
※理解が進んだら追記します。
SDKのアップデートが確実な時に書いてますので、多少変わるような気がします。
http://lois.di-qual.net/blog/compile-tesseract-for-ios-sdk-6-0/

##認識率をあげる
**公式**
https://code.google.com/p/tesseract-ocr/wiki/TrainingTesseract3

**Tesseract-OCRの学習**
http://hadashi-gensan.hatenablog.com/entry/2014/01/15/135316

**日本語練習中**
http://d.hatena.ne.jp/uakira/20140710

#さいごに
ざっと実装してみたところ、認識率があまりよろしくなく
原因としては、googleからダウンロードした日本語データだけでは実用に耐えない印象です。
認識率をあげるためにはデータの収集方法が別途必要。
EC-CUBEでjavascriptを追加する

EC-CUBEのカスタマイズに初挑戦中...
追加で、javascriptファイルを入れてみました。

user_data/parkerge/テンプレート名/js　に

追加するjsファイル設置する。

data/Smarty/テンプレート名/site_fream.tplを編集。

```html:data/Smarty/テンプレート名/site_fream.tpl
<script type="text/javascript" src="<!--{$TPL_URLPATH}-->ファイル名.js"></script>
```

...読み込み成功しました。

でも、これだと全ページで読み込むんですよね。。
トップページのみの読み込みにしたかったので、勉強してみます。。

<完了>
Shuttle(GUIでのssh接続)とsshpassの組み合わせがいい感じ


## どんなことができるのか

Shuttleは、上部メニューバーにアイコンが表示されて
設定した名前をクリックするとssh接続ができるというもの。
ログインユーザのホームディレクトリ直下に`.shuttle.json`が作成され、
ここにssh接続先の名前、接続時のコマンドを記載する。`Terminal.app`、`iTerm`に対応。
※ SHUTTLE A simple SSH shortcut menu for OS X
 http://fitztrev.github.io/shuttle/

sshpassは、sshコマンド発行時に`sshpass -p 'パスワード'`を前につけることで、
sshパスワードを自動的に入力してくれるもの。

## 私が設定したこと

まずsshpassをインストールします。
Homebrewでは`brew install sshpass`としてもセキュリティ的に問題があるとの警告が出て、インストールさせてくれません。
(パスワードが平文記載だからそうなりますが...)

---

※ 7/8追記・修正:
コメントでご指摘いただいたとおり、
`Warning: MD5 support is deprecated and will be removed in a future version.`
とMD5サポート終了が表示されます。

その為、以下コマンドを実行します。

```
% brew install http://git.io/sshpass.rb
```

---

と外部ファイルを指定してすることで、インストールできるようになります。
※ 参照：Install Sshpass on Mac
 http://lalyos.github.io/blog/2013/09/30/install-sshpass-on-mac/

また、Shuttleは上記URLよりShuttle.dmgをダウンロードして
Shuttle.appをアプリケーションフォルダへ移動。

```.shuttle.json(設定例)
{
	"_comments": [
		"Valid terminals include: 'Terminal.app' or 'iTerm'",
		"Hosts will also be read from your ~/.ssh/config or /etc/ssh_config file, if available",
		"For more information on how to configure, please see http://fitztrev.github.io/shuttle/"
	],
	"terminal": "Terminal.app",
	"launch_at_login": false,
	"show_ssh_config_hosts": true,
	"ssh_config_ignore_hosts": [],
	"ssh_config_ignore_keywords": [],
	"hosts": [
		{
			"Work": [
				{
					"name": "Host-A",
					"cmd": "sshpass -p 'パスワード' ssh username@hostname"
				},
				{
					"name": "Host-B",
					"cmd": "sshpass -p 'パスワード' ssh -t username@remotehost 'ssh username@targethost'"
				}
			]
		},
		{
			"Vagrant": [
				{
					"name": "precise32",
					"cmd": "ssh vagrant@127.0.0.1 -p 2222 -i ~/.vagrant.d/insecure_private_key"
				}
			]
		}
	]
}
```

デフォルトでvagrantなど各種設定方法が記載されています。
(Workの箇所は私が設定した内容の説明となります。)

これらを組み合わせて多段sshを自動で接続できる環境を整えることができました！
SwiftでUILabelにHTMLを表示する方法

## SwiftでUILabelにHTMLを表示する方法

Objective-Cとあまり変わらないけど、若干つまづいたのでメモ。
注）UILabelなので、あくまで表示しかできません。\<a\>タグでリンククリックとかさせたい場合はUIWebView使いましょう

## サンプルプロジェクト

https://github.com/satomikko94/HTMLToLabel

## サンプルコード

```swift
var htmlText = "空は<font color=\"blue\">青い</font>。<br>" +
               "An apple is <font color=\"red\">red</font>."

var err:NSError?
self.htmlLabel.attributedText = NSAttributedString(
                  data: htmlText.dataUsingEncoding(NSUnicodeStringEncoding, allowLossyConversion: true),
               options: [NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType],
    documentAttributes: nil,
                 error: &err)
self.htmlLabel.font = UIFont(name: "System", size: 14)
```

##実行結果
![ScreenShot.png](https://qiita-image-store.s3.amazonaws.com/0/52554/f9021215-0047-a580-8e1f-0c0bab2bcc00.png)


## ポイント

###NSAttributedString
基本的には以下のリンク(Obj-C)のとおり、NSAttributedStringを使ってHTMLを変換しています
http://stackoverflow.com/questions/15872257/display-html-text-in-uilabel-iphone

###NSErrorはOptionalに
NSErrorの値は必ずnilが入りうるので、?をつけてoptional型にしましょう。
これを忘れると "Extra argument 'data' in call" とか全然関係なさそうなコンパイルエラーになります

###fontの設定
HTMLを表示すると、Storyboardで設定したSystemフォントが英字で無効になっちゃうので
あとからUIFontで設定してます。
SwiftではfontWithNameが非推奨になってinitでfont設定するようになったようですね

###UILabelのLinesは0に
HTMLに限ったことではないですが、UILabelの値が可変で2行以上表示させたい場合には
StoryBoardでUILabelのLinesを0に設定しておきましょう

![Screen Shot 2014-08-24 at 21.52.20.png](https://qiita-image-store.s3.amazonaws.com/0/52554/07f47b24-7d5b-1433-b4e8-4b9f94818186.png)
PowerConnect（スイッチ）の勉強前にハマったシリアル接続の備忘録


## 経緯

サーバ・ネットワーク機器をよく扱っているのに、唯一触っていなかったスイッチ。
RTXであれば会社の機器を使っていいと言われたけれど、主に使用しているPowerConnect系は使用不可。。。

「どうしよう」と考えていたら、オークションで『PowerConnect 3324』が割安で出品されていた！
自由に触れる機会が得られるのであれば！と、購入したのが事の始まり。


購入・機器到着後、事前に買っておいたUSB・シリアル変換ケーブルで、
あれこれ試してみたけど、操作まで1週間位かかったのでその備忘録になります。

## 接続できた内容

```クライアント側機器
% sw_vers                   
ProductName:	Mac OS X
ProductVersion:	10.9.4
BuildVersion:	13E28
```

USB・シリアルケーブルとドライバ：
秋月電子通商で販売している、ＵＳＢ－シリアル変換ケーブル　スケルトン　延長ケーブル付
（ http://akizukidenshi.com/catalog/g/gM-00721/ ）を購入。
付属のドライバはWindows用の為、使用しているチップメーカー（Prolific Technology Inc.）から
Mac OSX用のドライバをダウンロード。
（ http://www.prolific.com.tw/US/ShowProduct.aspx?pcid=41&showlevel=0017-0037-0041 ）

付属の延長ケーブルは、ストレートケーブル。
PowerConnectと接続するには、クロスケーブルが必要でしたので別途購入。

接続方法：
Mac - USB・シリアルケーブル - クロスケーブル - PowerConnect 3324

上記のように接続し、無事操作ができるようになりました。

## 参考サイト

Mac OS X Mavericks に USBシリアル変換アダプタ USB-RSAQ5 のドライバをインストールする
http://blog.kfield.co.jp/2013/12/mac-os-x-mavericks-usb-usb-rsaq5.html

ネットワーク機器シリアルポート情報
http://wiki.tomocha.net/network_serialconsole.html

Mac OS X (Snow Leopard)でSerial Console (シリアルコンソール)
http://www.ytsuboi.org/wp/archives/1219