OmniAICreator/Qiita-1.07M huggingface dataset:
GitをMacに導入するなど

#はじめに
MacBookAirを購入しました。そこで最新版のgitを導入しようと思ったのですが、少し詰まってしまったので、メモとして残そうかと。
#既存バージョン
OSはバージョン10.9.3を使用しています。

```
$ git --veresion
git version 1.8.88 (Apple Git-48)
```


バージョンを確認するとこのようにでます。(実際のは忘れてしまいました)
#Git最新バージョンのインストール
公式ページのトップページからダウンロードできます。

http://git-scm.com

現時点(2014/07/11)では2.0.1が最新ですね。
右下の`Download for Mac`を選択しましょう。
あとは手順通りインストール！ここまでは詰まらず。
#パスを通す
インストールが完了しただけでは、まだ既存バージョンを使ってしまうようです。
インストールされたGitは`/usr/local/git/bin`に。
では、最新版が使用されるようには以下のようにしてパスを通せばよいようです。

##.bash_profileの編集
プロファイルを編集しましょう。

```
$ vim ~/.bash_profile
```
自分の場合は何も書かれていませんでした。
ここに以下の記述を追加(修正)しましょう。

```
PATH=/usr/local/git/bin:$PATH
export PATH
```
パスをechoしてみましょう。

```
$ echo PATH
```
いったんターミナルを再起動しましょう。(しなくていいかも)
#確認
バージョンを確認しましょ。

```
$ git --version
git version 2.0.1
```
はい、なんとかできました。
たぶん、これでいいはず...
【読書】IT・ソフトウェア業界

[IT・ソフトウェア業界](http://www.amazon.co.jp/IT%E3%83%BB%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%80%882015%E5%B9%B4%E5%BA%A6%E7%89%88%E3%80%89-%E7%94%A3%E6%A5%AD%E3%81%A8%E4%BC%9A%E7%A4%BE%E7%A0%94%E7%A9%B6%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E9%82%A3%E9%87%8E-%E6%AF%94%E5%8F%A4/dp/4782533772/ref=sr_1_1?s=books&ie=UTF8&qid=1405005920&sr=1-1&keywords=IT%E3%83%BB%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%80%80%E7%A0%94%E7%A9%B6)


本来は、就活のために業界を知るための本。

業界についてあまりにも知らなかった自分が入社１ヶ月目に購入。

本の知識とネットを使って、
打ち合わせの際に話していることがわずかに理解できるようになった。

こういうものは、就活の時にちゃんと読むべきだな・・・笑
と少し思いました。
JavaScriptで変数が変更されたのを監視して、なんかする方法


値を変更しまくる変数があったとして、その変数の値に変更を加えた際に、なんらかの処理をしたいときに使う。特殊なことはしてなくて、単純にクロージャにしているだけ。

```javascript
function HogeNum() {
	var hogeNum = 0;

	this.getNum = function() {
		return hogeNum;
	};

	this.setNum = function(val) {
		hogeNum = val;
		doSomething(val);
	};
}

function doSomething(val) {
	// do something...
}

var gHogeNum = new HogeNum();

// 値を取得
console.log(gHogeNum.getNum());

// 値を設定
gHogeNum.setNum(100);

```

なんか、グローバルな感じがちょっと嫌って気がする。
【読書】RUNNING LEAN

[RUNNING LEAN](http://www.amazon.co.jp/Running-Lean-%E2%80%95%E5%AE%9F%E8%B7%B5%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88%E3%82%A2%E3%83%83%E3%83%97-LEAN-SERIES/dp/4873115914/ref=sr_1_1?s=books&ie=UTF8&qid=1405005531&sr=1-1&keywords=RUNNING+LEAN)

新規事業を立ち上げるに当たって、リーンキャンバスを書くために購入。

読んだ後に、何度か実践してみたが、おそらくこれは、もう少し新規事業計画が具体性を帯び始めてから、その事業が当たりそうなのか外れそうなのかを考察するために用いるツールの一つのように感じた。

非常に重要な要素の一つであることは確かなので、読んで良かったと非常に感じた。
ここでいう重要な要素とは、新規事業を進めていく上で、最低限考えなくてはいけないことを指し、無駄なく事業を進める点である。
フレームワークを持つことによって、思考の選択肢が増えることと新規事業の流れを知ることができた。

来年度新入社員にも読ませるべき書籍の一つ。
PHPでクロスサイトリクエストフォージェリ（CSRF）対策するときのメモ

```php:
<?php
session_start();

//トークンをセッションにセット
function setToken(){
    $token = sha1(uniqid(mt_rand(), true));
    $_SESSION['token'] = $token;
}

//トークンをセッションから取得
function checkToken(){
    //セッションが空か生成したトークンと異なるトークンでPOSTされたときは不正アクセス
    if(empty($_SESSIOIN['token']) || ($_SESSION['token'] != $_POST['token'])){
        echo '不正なPOSTが行われました', PHP_EOL;
        exit;
    }
}

//エスケープ
function h($s){
    return htmlspecialchars($s, ENT_QUOTES, "UTF-8");
}

//GETでアクセスされたとき
if($_SERVER['REQUEST_METHOD'] != 'POST'){
    setToken();
}
//POSTでアクセスされたとき
else{
    checkToken();
}
```

```html:
<!DOCTYPE html>
<html lang="ja">
...
<body>
...
<form method="post" action="">
...
<!--hiddenで生成したワンタイムトークンの文字列をPOST送信-->
<input type="hidden" name="token" value="<?php echo h($_SESSION['token']); ?>">
<input type="submit" value="登録">
...
</form>

...
</body>
</html>
```
【読書】伝説の新人 20代でチャンスをつかみ突き抜ける人の10の違い

[伝説の新人 20代でチャンスをつかみ突き抜ける人の10の違い](http://www.amazon.co.jp/%E4%BC%9D%E8%AA%AC%E3%81%AE%E6%96%B0%E4%BA%BA-20%E4%BB%A3%E3%81%A7%E3%83%81%E3%83%A3%E3%83%B3%E3%82%B9%E3%82%92%E3%81%A4%E3%81%8B%E3%81%BF%E7%AA%81%E3%81%8D%E6%8A%9C%E3%81%91%E3%82%8B%E4%BA%BA%E3%81%AE10%E3%81%AE%E9%81%95%E3%81%84-%E5%B0%8F%E5%AE%AE-%E8%AC%99%E4%B8%80/dp/4087860213/ref=sr_1_1?s=books&ie=UTF8&qid=1405005224&sr=1-1&keywords=%E4%BC%9D%E8%AA%AC%E3%81%AE%E6%96%B0%E4%BA%BA%E3%80%80%EF%BC%92%EF%BC%90%E4%BB%A3%E3%81%A7%E3%83%81%E3%83%A3%E3%83%B3%E3%82%B9%E3%82%92%E3%81%A4%E3%81%8B%E3%81%BF%E3%80%81%E7%AA%81%E3%81%8D%E6%8A%9C%E3%81%91%E3%82%8B)

この本も新入社員研修後に読んだ本。

新入社員として、やっていく上での心構えと具体的な行動を示してくれた。

もっともっと頑張る必要性を感じた一冊でした。

新人の中で、飛び抜けるために必要なことは「特別でありつづけること」でり、「常に全力で走り抜けること」であることを学んだ。

自分自身に対して、高い目標を課し、それを伝説を作ることによって、伝説の新人になる。
canvasとD3.jsで画像の輝度ヒストグラムをつくる


# 輝度のヒストグラム

画像の明るさや品質を調べるために、画像の輝度の分布状況をヒストグラムを取ることがあります。
YUVのYを計算しその値ごとをカウントしてD3.jsでグラフを出力しようと思います。


````histogram.html
<!DOCTYPE html>
<html>
<head>
<script src="./jquery-2.1.1.min.js"></script>
<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
<script type="text/javascript">
function drawGraph(ys) {
    //d3.js でグラフを描画する。

    //グラフを描画するSVGを用意
    var w = 500;
    var h = 300;
    var barPadding = 1;
    var svg = d3.select("body")
                 .append("svg")
                 .attr("width", w)
                 .attr("height", h);

    //受け取ったデータを元にヒストグラムを作成する
    svg.selectAll("rect")
        .data(ys)
        .enter()
        .append("rect")
        .attr("x", function(d, i) {
            return i * (w/ys.length);
        })
        .attr("y", function(d) {
            return h - d/8;
        })
        .attr("width", w/ys.length - barPadding)
        .attr("height", function(d) {
            return d/8;
        });
}

function fail(e) {
    //エラーの時のメソッド
    alert(e);
}

function getYArray(data) {
    var ys = new Array(256);
    for (var i = 0; i < ys.length;i++) {
        ys[i] = 0;
    }

    for (var i = 0; i < data.length; i= i + 4) {
        // 輝度(YUVのY)の計算を行う
        var y = ~~(0.299 * data[i] + 0.587 * data[i + 1] + 0.114 * data[i + 2]);
        // 輝度の値ごとのカウント
        ys[y]++;
    }
    return ys;
}

function calcY() {    
    var dfd = new $.Deferred;

    var canvas = document.getElementById("c1");
    var ctx = canvas.getContext("2d");
    var img = new Image();
    img.src = "test.jpg";
    img.onload = function() {
        ctx.drawImage(img, 0, 0);
        var imagedata = ctx.getImageData(0, 0, canvas.width, canvas.height);
        var ys = getYArray(imagedata.data);
        dfd.resolve(ys);
    };
    return dfd.promise();
}

window.onload = function() {    
    calcY().then(drawGraph, fail);
};
</script>
</head>
<body>
<canvas id="c1" width="300" height="300">
</body>
</html>
````

いろいろな画像の結果を以下に示します。
暗い画像ほど左(0に近いほう)の値が大きくなっているのがわかります。

![histogram1.png](https://qiita-image-store.s3.amazonaws.com/0/4044/869c500d-54ac-15d6-db9f-b30d60a90ea5.png "histogram1.png")

![histogram2.png](https://qiita-image-store.s3.amazonaws.com/0/4044/0ef32eb2-dd39-1faa-247c-f0d8b2ce82e0.png "histogram2.png")

![histogram3.png](https://qiita-image-store.s3.amazonaws.com/0/4044/c4d9e044-d2f9-5495-3f43-806fa4c431e7.png "histogram3.png")
【読書】「君に任せたい」と言われる部下になる５１の考え

[「君に任せたい」と言われる部下になる５１の考え](http://www.amazon.co.jp/%E3%80%8C%E5%90%9B%E3%81%AB%E3%81%BE%E3%81%8B%E3%81%9B%E3%81%9F%E3%81%84%E3%80%8D%E3%81%A8%E8%A8%80%E3%82%8F%E3%82%8C%E3%82%8B%E9%83%A8%E4%B8%8B%E3%81%AB%E3%81%AA%E3%82%8B51%E3%81%AE%E8%80%83%E3%81%88%E6%96%B9-%E5%B2%A9%E7%94%B0%E6%9D%BE%E9%9B%84/dp/4763133020)

スターバックスの元CEOが執筆をした本で、新入社員研修の後に読みました。

新入社員としての心構えから具体的にやることまで明確に示されていて、自分の今の行動にも反映されていることも多くあると感じた本です。
気遣いや上司の基準が今までの環境とが違いすぎたのである意味、一つの基準にもなったようにも思います。

何度も読み直して、復習するくらい内容が充実していたように感じます。
AS3.0で少しだけLuaを使えるようにした

##ないならば作る
ActionScript3.0でゲームを作っているのだけれど、シナリオスクリプトとしてLuaを使いたくなった。
しかし探してみると意外にもなかなかシナリオスクリプトとして使えそうなLua実装がない。
あったかと思うとパーサーのみ公開されていたりすごく特殊な方法で動かす仕組みであったりする。
シナリオスクリプトとして使えればいいので完全な実装は必要ない。
それならなんとかなるかと思い、自分で作ることにした。

##作ったもの
いちおうBeefと名づけています。
https://github.com/dotneet/as3-lua

##機能
 - Luaソースの実行
 - LuaコードからのAS3.0コードの実行
 - 仮想スレッド(ランタイムが実行コンテキストを共有できる。マルチタスクではない。)
 - Unicode識別子(Lua非互換。日本語を変数や関数名に使用可能)

##できないこと
あくまでゲームのシナリオスクリプトとして使えればいいので、実装していない機能が多数あります。
 - メタテーブルとかコルーチンとか難しい仕様は実装していません
 - ほとんどの標準ライブラリ関数の使用
 - if-else/goto以外の制御構文

##使い方
###1.Luaコードから呼び出す機能の実装(beef.script.SystemFunctionを継承します)
```as3
// 指定したミリ秒数分だけスクリプトの実行を停止する関数
public class FuncWaitTime extends SystemFunction {
    public function FuncWaitTime() {
      super();
    }
    public override function call(runtime:ScriptRuntime, params:Vector.<Value>):Value {
      runtime.stop();
      var millis:Number = params[0].asNumber().value;
      setTimeout(function():void{ runtime.resume();}, millis);
      return BooleanValue.TRUE;
    }
  }
}
```

### 2. LuaコードからAS3コードを実行
```as3
var source:String = "wait_time(1000)";
var c:Compiler = new Compiler();
var fn:ScriptFunction = c.parse(source);
var runtime:ScriptRuntime = new ScriptRuntime();
// wait_timeという名前の関数として登録
runtime.addFunction('wait_time', new FuncWaitTime());
runtime.execute(fn);
```

## 今後
開発中のとあるゲーム（非商用）で実際にBeefを使って開発しています。
しばらくスクリプトのバグはでていないのでシナリオスクリプトとして使うくらいならば問題ない安定度にはなっているかなと思います。
機能的なところではforとrepeat構文が未実装というのがかなり痛い感じなので暇があれば実装したいです。

## 動かせるLuaコードの例
```lua
local a = 10
g = a * a + 10
c,d = a,g

a = 1
::ONEMORE::
a = a + 1
print(a)
if a < 10 then goto ONEMORE; end

function 二乗(a)
  print(a * a)
end

二乗(50)
```
【読書】契約０からトップ営業に変わる最速達成マニュアル

[契約０からトップ営業に変わる最速達成マニュアル](http://www.diamond.co.jp/book/9784478027288.html)

６月末に読んだ本。

営業について知りたく買ったものですが、「んー。。。それで？」という内容でした。

心構え（非常に抽象的なこと）的なことを書いていて、あまり得たものは少なかったように感じました。
faviconにバッジを動的に付ける方法：JavaScript + Canvas


最近色んなサービスで、faviconの上にバッジをつけてるのをよく見るので、どうやって実現しているんだろうなーと調べたら、Canvasで描画したものに差し替えているっぽい。というわけで、Canvasさわったことないけど、うにうに書いてみた。

![favicon.png](https://qiita-image-store.s3.amazonaws.com/0/2152/1bee1018-10f1-9a68-7efd-3b5b4abe9861.png "favicon.png")

こんなかんじのイメージ。

```icon.html
<!DOCTYPE html>
<html>
<head>
	<link rel="icon" href="favicon.ico">
</head>
<body>
<script>
	var metaIcons = document.getElementsByTagName('link');
	var metaIcon = metaIcons[0];

	var canvas = document.createElement("canvas");
	canvas.width = 16;
	canvas.height = 16;
	var context = canvas.getContext("2d");

	var img = document.createElement("img");
	// CORS対策
	img.crossOrigin = "Anonymous";
	img.onload = function() {
		context.clearRect(0, 0, 16, 16);
		context.drawImage(img, 0, 0, 16, 16, 0, 0, 16, 16);

		// 円形を描画
		context.beginPath();
		context.fillStyle = "#ff3686";
		context.arc(11, 11, 5, 0, Math.PI*2, true);
		context.fill();

		// 中の数字を描画
		context.font = "10px arial";
		context.fillStyle = "#ffffff";
		context.textBaseline = "top";
		context.textAlign = "right";
		context.fillText('4', 14, 5);

		// dataURIとしてタグにセット
		metaIcon.href = canvas.toDataURL();
	}
	img.src = metaIcon.getAttribute('href');
</script>
</body>
</html>
```

スマホとかレティナな解像度などを無視して、16px固定でのサンプルだけど、だいたいのイメージはつかめた。ブラウザとかによっても、表示位置を調整する必要がありそうなので、ちょっと面倒くさいけど、わりと簡単に実装できそう。
Swiftで無限リスト

を実装してみました。

* https://github.com/dankogai/swift-lazylist

過去にも

* Perl http://blog.livedoor.jp/dankogai/archives/50839189.html
* JavaScript https://github.com/dankogai/js-list-lazy

などでも実装していて、我ながらどれだけ Lazy List が好きなんだと思いますが、 Swiftのそれは格別に気持ちいいです。

以下、READMEから。

### Infinite list
````swift
let ns = lazylist { $0 } // infinite list of natural numbers
println(ns.filter{$0 % 2 == 1}.map{$0 * $0}.take(10)) // [1, 9, 25, 49, 81, 121, 169, 225, 289, 361]
println(ns.map{$0 * $0}.filter{$0 % 2 == 1}.take(10)) // [1, 9, 25, 49, 81, 121, 169, 225, 289, 361]
````
### Finite list
````swift
let a100 = lazylist(Array(0..<100)) // [0, 1, 2 ... 99]
println(a100.drop(10).take(10))   // [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
println(a100.drop(90).take(20))   // [90, 91, 92, 93, 94, 95, 96, 97, 98, 99] -- only 10
println(a100.drop(100).take(10))  // [] -- no elements left
````
### Infinite list with seed array
````swift
let fibs = lazylist([0,1]){ i, a in a[i-2] + a[i-1] }
println(fibs.drop(10).take(10)) // [55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181] -- F10...F19
````
````swift
let primes = lazylist([2,3]) { i, ps in
    for var n = ps[i-1] + 1; true; n++ {
        for p in ps {
            if n % p == 0 { break }
            if p * p > n  { return n }
        }
    }
}
println(primes.take(25)) // first 25 prime numbers -- primes less than 100
```

考え方は、過去の Lazy Lists の実装同様、「要素がなければ作ってしまえばいいじゃない!」というものですが、今回は「あってもなくても作ってしまえ」モードが追加されています。それが、上記の自然数の例。自然数を作るのに元になる配列は不要ですよね?

この場合のメモリー効率は、HaskellやRubyを上回ります。たとえば、以下の例ではどちらも一時的に1,000,000,010個の要素の配列を作ってしまうためだんまりになってしまうのですが…

Haskell

````haskell
take 10 $ drop 1000000000 [0..]
````

Ruby

````ruby
(0..Float::INFINITY).lazy.drop(1_000_000_000).take(10)
````

以下は瞬殺です。

````swift
lazylist{ $0 }.drop(1_000_000_000).take(10)
````

どうやっているかはソースを参照のこと。

Enjoy!

Dan the Lazy Lister
atomがWindows対応したのでインストールしてみた(zip版)

##atomのWindows版がリリース

たしか[GitHubKaigi](http://githubkaigi.org/ "GitHubKaigi")に参加したときには、
質疑応答のときに、

「Windows？？ｗｗ」

的な感じで村八分にされていた気がしたのですが（失礼
なんと2014/07/09にWindows版がリリースされたようでして、
さっそくインストールしてみました。
（※対応状況はWin7、Win8のみ）

[公式ブログ](http://blog.atom.io/2014/07/09/hello-windows.html "Hello Windows") を見る限り、

>The best way to install Atom on Windows is by installing chocolatey and then running:

というように、[chocolatey](http://chocolatey.org/ "chocolatey")ゴリ押しなんですが、

>If you just want to download a .zip of the latest Atom release, that is now available from atom.io and the Atom releases page.

と、下のほうに書いてありますが、zip版も用意されているので、
サクッと試してみたい場合は、zip版でOKだと思います。

##インストール

1. [Atom.io](https://atom.io/ "GitHubKaigi")にWindowsでアクセスする。

2. 「Download Windows Alpha」のリンクをクリックしてzipファイルをダウンロード。(画像赤枠部分)
![atom1.png](https://qiita-image-store.s3.amazonaws.com/0/26618/4ab337d1-43e6-2bbe-6743-6fbc1525b9f1.png)
<br />
3. zipファイルを解凍する。

4. 解凍したフォルダの中にある「atom.exe」をダブルクリックで起動する。
![atom2.png](https://qiita-image-store.s3.amazonaws.com/0/26618/86863460-22fd-fb19-d915-0342ec9b1b96.png)
<br />

これでWindowsでatomワールドに突入できます。

##注意事項
[公式ブログ](http://blog.atom.io/2014/07/09/hello-windows.html "Hello Windows")にも記述がありますが、
現状Windows版は自動アップデートには対応していないので
アップデートしたい場合は手動でダウンロードしてくる必要があるようです。

ただし、

>Going forward we plan on adding an auto-updater that works the same as the Mac version. 

ということで近い将来Mac版と同様に自動アップデートの機能が備わると思います。

##まとめ
- Windows版のatom登場！
- 対応OSはWin7とWin8！
- chocolateyを使わなくても、zip版でインストールできる！
- 自動アップデートは現在対応待ちなので更新は手動で！
- 近い将来自動アップデートには対応してくれるみたい！
【angularJS × Jasmine】$timeout を spyOn する方法

# はじめに
## $timeout
`$timeout` は window.setTimeout をラップした angularJS のサービスで、次のように使う

```coffeescript
it "$timeout は予約をキャンセルすることが出来る", ->
  inject ["$timeout", ($timeout) ->
    counter = 0
    promise = $timeout (-> counter++), 1000 # 1 秒後にカウントアップ
    $timeout.cancel promise # だが断る
    $timeout.flush
    expect(counter).toBe 0
]
```

## spyOn
`spyOn` はテストダブルのための jasmine の機能で、その関数が呼ばれたかどうかをチェックする

```coffeescript
it "spyOn は関数が呼ばれたかどうかをテスト出来る", ->
  hoge =
    fuga: -> "fuga"
    foo: -> fuga()
  spyOn(hoge, "fuga").and.callThrough()
  hoge.foo()
  expect(hoge.fuga).toHaveBeenCalled()
```

# $timeout を spyOn するには？
`spyOn` はオブジェクトの要素となっている関数は spy することが出来るが、`$timeout` みたいな、どこにも属していないような関数を spy することが出来ない。

## 失敗： 無理やり
```coffeescript
it "別の Object の要素にした上でそいつを spy", ->
  inject ["$timeout", ($timeout) ->
    hoge =
      $timeout: $timeout
    spyOn(hoge, "$timeout").and.callThrough()
    $timeout (-> ), 1000
    expect(hoge.$timeout).not.toHaveBeenCalled()
    expect(hoge.$timeout).not.toBe $timeout
  ]
```

→ spyOn した時点で、 `$timeout` と `hoge.$timeout` は別物

## 準成功： decorator + jasmine.createSpy を使用する
```coffeescript
beforeEach ->
  module ["$provide", ($provide) ->
    $provide.decorator "$timeout", ($delegate) ->
      return jasmine.createSpy $delegate
  ]
it "flush とか cancel が居なくなる", ->
  inject ["$timeout", ($timeout) ->
    counter = 0
    $timeout (-> counter ++), 1000
    expect($timeout).toHaveBeenCalled() # 成功
    $timeout.flush() # 失敗。 undefined is not a function
    expect(counter).toBe 1
  ]
```

jasmine.createSpy を呼ぶと、次のような関数が返る。

```js:console.log($timeout.toString())
function () {
  callTracker.track({
    object: this,
    args: Array.prototype.slice.apply(arguments)
  });
  return spyStrategy.exec.apply(this, arguments);
}
```

要は、$timeout は関数であって、 flush や cancel が使えなくなってしまう。

## 失敗： decorator + createSpyObj
createSpyObj なら、関数の代わりに Obj を生成してくれる。

```coffeescript
beforeEach ->
  module ["$provide", ($provide) ->
    $provide.decorator "$timeout", ($delegate) ->
      return jasmine.createSpyObj $delegate, Object.keys $delegate # 第2引数で渡した配列の各要素がオブジェクトの key になる
  ]
it "$timeout 自体は spy ではない"
  inject ["$timeout", ($timeout) ->
    $timeout (-> ), 1000
    expect($timeout).toHaveBeenCalled() # Expected a spy, but got { うんたらかんたら
  ]
```

$timeout の各キーが spy になる模様

## 成功 decorator + 無理やり
```coffeescript
beforeEach ->
  module ["$provide", ($provide) ->
    $provide.decorator "$timeout", ($delegate) ->
      holder =
        $timeout: $delegate
      spyOn(holder, "$timeout").and.callThrough()
      return holder.$timeout
  ]
it "スパッてる"
  inject ["$timeout", ($timeout) ->
    $timeout (-> ), 1000
    expect($timeout).toHaveBeenCalled() # 成功
  ]
```

# おまけ
需要ありそうなので helper 化した

```coffeescript
spyDecorator = ($delegate) ->
  holder = {$delegate}
  spyOn(holder, "$delegate").and.callThrough()
  return holder.$delegate
```
canvasで画像処理(ネガポジ変換/グレースケール変換)


HTMLのCanvas要素には、

````javascript
  var data = context.getImageData(x, y, width, height);
````
というものがあり、これによりCanvasのデータ列が取得できます。
data.dataは
RGBA順の配列になっており、これを操作してCanvasにputし直すことで画像をなんらかの処理して表示できます。

今回は、下記の画像を使って、ネガポジ変換とグレースケール変換をやってみます。
(ちなみに写真は以前撮らせていただいたCANDY GO!GO!の菜月アイルさんです。)


![1.png](https://qiita-image-store.s3.amazonaws.com/0/4044/133e9ba5-647e-ca27-4a52-5e5b6e369c16.png "1.png")

ちなみにサンプルを動かすとき、file:の画像をCanvasに読み込ませると、Canvasが汚染状態となり、getImageData()ができなくなるので、
[カレントディレクトリでさっくりとWebサーバを起動させる](http://qiita.com/gm_kou/items/1610b6966503ef56f7ce)等を参考にサーバーを起動させて確かめてください。

# ネガポジ変換

ネガポジ変換とは、黒だったら白というように、色情報を反転させる処理です。
各々の色情報を 255-x で計算して求めます。
下記がサンプルです。


````html
<!DOCTYPE html>
<html>
<head>
<title>画像処理</title>
<script type="text/javascript">
window.onload = function() {
    var canvas = document.getElementById("c1");
    var ctx = canvas.getContext("2d");

    var img = new Image();
    img.src = "test.jpg";
    img.onload = function() {
        ctx.drawImage(img, 0, 0);
        var src = ctx.getImageData(0, 0, canvas.width, canvas.height);
        var dst = ctx.createImageData(canvas.width, canvas.height);

        //ネガポジ変換
        for (var i = 0; i < src.data.length; i=i+4) {
            dst.data[i]   = 255 - src.data[i];    //R
            dst.data[i+1] = 255 - src.data[i+1];  //G
            dst.data[i+2] = 255 - src.data[i+2];  //B
            dst.data[i+3] = src.data[i+3];        //A
        }

        ctx.putImageData(dst, 0, 0);
    };
};
</script>
</head>
<body>
  <canvas id="c1" width="300" height="300">
</body>
</html>
````

これを行うと下記のようにになります。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/4044/44b2619c-dd9a-b71f-ca9b-a198c2c37678.png "2.png")

# グレースケール変換

グレースケールとは、画像を白黒とその中間色(灰色)で表された画像で、RGBの値が同じ値になります。
今回は簡単のため、値をR,G,B３つの平均をとることにより、グレースケールに変換しようと思います。


````html
<!DOCTYPE html>
<html>
<head>
<title>画像処理</title>
<script type="text/javascript">
window.onload = function() {
    var canvas = document.getElementById("c1");
    var ctx = canvas.getContext("2d");
    var img = new Image();
    img.src = "test.jpg";
    img.onload = function() {
        ctx.drawImage(img, 0, 0);
        var src = ctx.getImageData(0, 0, canvas.width, canvas.height);
        var dst = ctx.createImageData(canvas.width, canvas.height);

        for (var i = 0; i < src.data.length; i=i+4) {
            var pixel = (src.data[i] + src.data[i+1] + src.data[i+2]) / 3;
            dst.data[i] = dst.data[i+1] = dst.data[i+2] = pixel;
            dst.data[i+3] = src.data[i+3];
        }

        ctx.putImageData(dst, 0, 0);
    };
};
</script>
</head>
<body>
  <canvas id="c1" width="300" height="300">
</body>
</html>
````

下記はその出力結果です。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/4044/7a086865-de4b-b8f9-cd3e-2468f1e3808e.png "3.png")


以上のように、canvasを使えば画像処理のアルゴリズムで画像をいろいろ加工できます。
apache 2.4におけるSSL証明書の設定

apache 2.4（厳密には2.4.8以降）でSSL証明書の設定でちょっとハマったのでメモ。
※CentOS 7系の標準apacheだと2.4.6のため、ここで記載するapache 2.2の方の設定になります。注意。

## 結論

初っ端から結論。
apache 2.4では中間CA証明書を指定する **SSLCertificateChainFile** ディレクティブがなくなってます。
そのためapache 2.4ではサーバ証明書と中間CA証明書、それからクロスルート証明書を一つのファイルにまとめてサーバ証明書を指定する **SSLCertificateFile** ディレクティブで指定します。
> 参考：http://httpd.apache.org/docs/current/mod/mod_ssl.html#sslcertificatechainfile

### apache 2.2での証明書構成

* SSLCertificateKeyFile - 秘密鍵
* SSLCertificateFile - サーバ証明書
* SSLCertificateChainFile - 上：中間CA証明書、下：クロスルート証明書

### apache 2.4での証明書構成

* SSLCertificateKeyFile - 秘密鍵
* SSLCertificateFile - 上：サーバ証明書、中：中間CA証明書、下：クロスルート証明書

## SSLの設定

以上を踏まえてよくやってるSSL設定のメモ。

### apache 2.2での設定

apache 2.2（〜2.4.7まで）のssl設定。

```ssl.conf
LoadModule ssl_module modules/mod_ssl.so
Listen 443
SSLPassPhraseDialog  builtin
SSLSessionCache         shmcb:/var/cache/mod_ssl/scache(512000)
SSLSessionCacheTimeout  300
SSLMutex default
SSLRandomSeed startup file:/dev/urandom  256
SSLRandomSeed connect builtin
SSLCryptoDevice builtin

<VirtualHost _default_:443>
    ErrorLog logs/ssl_error_log
    LogLevel warn
    SSLEngine on
    SSLProtocol all -SSLv2 -SSLv3
    SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
    SSLCertificateFile conf/ssl/server.crt
    SSLCertificateKeyFile conf/ssl/server.key
    SSLCertificateChainFile conf/ssl/chain.crt
    <Files ~ "\.(cgi|shtml|phtml|php3?)$">
        SSLOptions +StdEnvVars
    </Files>
    SetEnvIf User-Agent ".*MSIE.*" \
             nokeepalive ssl-unclean-shutdown \
             downgrade-1.0 force-response-1.0
    CustomLog logs/ssl_access_log ltsv_ssl
</VirtualHost>

```

### apache 2.4での設定

こっちはapache 2.4（2.4.8以降）のssl設定。
``SSLCertificateChainFile``は不要です。

```ssl.conf
Listen 443 https
SSLPassPhraseDialog exec:/usr/libexec/httpd-ssl-pass-dialog
SSLSessionCache         shmcb:/run/httpd/sslcache(512000)
SSLSessionCacheTimeout  300
SSLRandomSeed startup file:/dev/urandom  256
SSLRandomSeed connect builtin
SSLCryptoDevice builtin

<VirtualHost _default_:443>
    ErrorLog logs/ssl_error_log
    LogLevel warn
    SSLEngine on
    SSLProtocol all -SSLv3
    SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5
    SSLCertificateFile conf/ssl/server.crt
    SSLCertificateKeyFile conf/ssl/server.key
    <Files ~ "\.(cgi|shtml|phtml|php3?)$">
        SSLOptions +StdEnvVars
    </Files>
    BrowserMatch "MSIE [2-5]" \
             nokeepalive ssl-unclean-shutdown \
             downgrade-1.0 force-response-1.0
    CustomLog logs/ssl_access_log ltsv_ssl
</VirtualHost>

```
GitLab 7.0 で未コミットのプロジェクトの Issue で Markdown の見出しを利用すると Error 500 が発生

# GitLab | GitLab 7.0 で未コミットのプロジェクトの Issue で Markdown の見出しを利用すると Error 500 が発生する
## 概要
GitLab 7.0 で未コミットのプロジェクトの Issue で Markdown の見出しを利用すると Error 500 が発生します。

類似の問題が下記の Issue で報告されています

https://github.com/gitlabhq/gitlabhq/issues/6518

2014/07/10現在、まだ open のままなので修正されていないようです。

## 再現操作
* プロジェクトを新規作成
* リポジトリのコミットは行わない
* Issueを新規作成
* Issueに見出しつきのMarkdownを記入

![issue.png](https://qiita-image-store.s3.amazonaws.com/0/43480/664c2bb3-7e8d-805c-1820-49bd5a347d83.png)

* 保存するとエラー 500 が発生

![error.png](https://qiita-image-store.s3.amazonaws.com/0/43480/979baba8-c5c2-a2fb-4647-1086495e8369.png)

* 編集画面は開くことができるので、編集画面を開いて見出しを消すとエラーが消える

~~~
* sample
~~~

## 暫定対応
dummyのリポジトリを作成して、最低1回 *commit* して GitLab へ *push* すれば正常に動作します。

~~~bash
echo 'dummy' > README.md
git add README.md
git commit -m "dummy"
git push origin master
~~~

## 補足1
GitLab 6.3 ではこの問題は発生しません。

## 補足2
6518 の issue があるので、別途 issue 報告は行いません。
プルリクしようかと思いましたが、

* 修正対象が helper ゆえに影響範囲がかなり広そうで、他のバグを引き起こしそうで怖い
* 要する修正・確認時間が大きそう
* 「リポジトリは登録しないけど、Issueだけ使う」というレアなケースかつ、暫定対応で回避もできるので問題としての優先度が低そう

などの理由もあり、プルリクを送るのはやめておきます。

どなたかデグレードさせずに直せて、時間的にも余力がある方がいらっしゃれば
プルリクしてみてはいかがでしょうか？

## 参照
https://github.com/gitlabhq/gitlabhq/blob/master/app/helpers/gitlab_markdown_helper.rb
enthumble(キーカスタマイズ)定型文特化

某オークションサイトにて大量出品しているので、頻出単語を中心に補助ツールのショートカット等をまとめています。


##基本操作系
**ijkl配列を元にBSやDelを手元に集めています。**
I={up}
J={left}
K={down}
L={right}
Space={Enter}
Muhenkan={Esc}
Henkan={Esc}
H={Shift down}{Tab}{Shift up}
N={Tab}
M={Backspace}
,={delete}

##記号・定形入力
**☆などの記号や頻出する単語など**
<dl>
<dt>！</dt><dd>.={ASC 33097}</dd>
<dt>？</dt><dd>/={ASC 33096}</dd>
<dt>☆</dt><dd>Semicolon={vkF2sc070B}{vkF3sc029}{ASC 33177}{vkF2sc070B}</dd>
<dt>　：　（セミコロンの前後に空白）</dt><dd>:={vkF2sc070B}{space}:{enter}{space}</dd>
<dt>美品☆★</dt><dd>Up={vkF2sc070B}bihinn{space}{enter}{vkF3sc029}{ASC 33177}{ASC 33178}{vkF2sc070B}</dd>
<dt>★☆</dt><dd>Left={vkF2sc070B}{vkF3sc029}{ASC 33178}{ASC 33177}{vkF2sc070B}</dd>
<dt>☆★</dt><dd>Right={vkF2sc070B}{vkF3sc029}{ASC 33177}{ASC 33178}{vkF2sc070B}</dd>
<dt>Tシャツ</dt><dd>T={vkF2sc070B}{vkF3sc029}{shift down}t{shift up}{vkF2sc070B}syatu{F7}{enter}</dd>
<dt>S~Lサイズ</dt><dd>F9={vkF2sc070B}{vkF3sc029}{shift down}s{shift up}{vkF2sc070B}saizu{space}{enter}</dd>
<dd>F10={vkF2sc070B}{vkF3sc029}{shift down}m{shift up}{vkF2sc070B}saizu{space}{enter}</dd>
<dd>F11={vkF2sc070B}{vkF3sc029}{shift down}l{shift up}{vkF2sc070B}saizu{space}{enter}</dd>
<dt>&lt;BR&gt;</dt><dd>F12={vkF2sc070B}{vkF3sc029}&lt;BR&gt;{enter}{vkF2sc070B}</dd>
<dt>変換候補1番目</dt><dd>Tab={tab}{enter}</dd>
</dl>

##チェックの自動化
毎度々々小さなチェックボックスを幾つもクリックするのは面倒なのでワンキーで一括して出来るようにしています。
タブの連打で対応しているのでページ移動直後でないと大変なことになってしまいます。
ページ内最後のリンクにフォーカスをジャンプするショートカットキーがあれば確実なんですが…。
```F1={shift down}{tab}{tab}{tab}{tab}{tab}{tab}{tab}{tab}{tab}{tab}{tab}{shift up}{up}{shift down}{tab}{tab}{tab}{shift up}{up}{tab}{tab}{space}{tab}{tab}{tab}{tab}{tab}{tab}{space}{tab}{tab}{tab}{tab}{tab}{tab}{tab}{tab}{tab}{tab}{tab}{tab}{tab}{tab}{tab}{enter}{vkF2sc070B}{vkF3sc029}
F1～F4に同様のパターンを入れて状況によって使い分けられるようにしています。```
[SystemVerilog]Sublime Text用のUVMスニペットを書いてみた。

こんにちは、相変わらずメインエディタはSublime Text 3な @tethys_seesaa です。

##はじめに
###問題発生
二ヶ月以上前からUVMを放置しているんですが、いろいろ進めていて、いま **問題が発生して停滞しています。**
原因は特定できたのですが、解決策がわからず…。
周りに知っている人いないし、いやー、UVMって **本当に難しいですね。**
###UVMを書き始めてみて
コードを書き始めてみて、反復的な表現が多いことに気づきました。
これはスニペットを用意した方がいいと感じ、これまで書いてきたコードを参考に、いくつかのUVMパーツのスニペットを今回書いてみました。
むろん、エディタはSublime Text 3です。
今回は、Ubuntu 14.04 LTSでやってみました。

##参考
* [SystemVerilogプラグインのUVMスニペット](https://bitbucket.org/Clams/sublimesystemverilog/src/0e850c36797bcfbeea26f93ff72b8effd7c905e9/class_uvm.sublime-snippet?at=default)

* [Sublime Textのスニペットヘルプ](http://docs.sublimetext.info/en/latest/extensibility/snippets.html)

##必要なもの
* Sublime Text 3
* SystemVerilogプラグイン

##UVMバージョン
ここでは1.1dです。
最近1.2が出たようですが、アプリレイヤーと違ってこの界隈は動きがのろいから、IntelやARMのようなお金持ちが1.2を使い始めるまで対応する必要は無いでしょう。

##コード
スニペットなんで、コーダーの好みによりけりだから参考程度に。
ここでは`uvm_sequencer`を例にとってみます。

```xml:uvm_sequencer.sublime-snippet
<snippet>
    <name>UVM sequencer</name>
    <content><![CDATA[class ${1:${TM_FILENAME/(.+)\..+|.*/$1/:name}} extends #(${2:uvm_sequence_item}, ${3:REQ}) uvm_sequencer ;

//-------------------------------------------------------------------------------
// Factory register
//-------------------------------------------------------------------------------

  `uvm_component_utils(${1})
  //`uvm_component_utils_begin(${1})
    /**** `uvm_field_* macro invocations here ****/
  //`uvm_component_utils_end

//-------------------------------------------------------------------------------
// Functions and Tasks
//-------------------------------------------------------------------------------

  // Constructor
  function new(string name = "${1}", uvm_component parent=null);
    super.new(name, parent);
  endfunction

endclass]]></content>
  <tabTrigger>uvm_sequencer</tabTrigger>
  <scope>source.systemverilog</scope>
</snippet>
```

これを`~/.config/sublime-text-3/Packages/User `に保存します。

##実行
空のsvファイルを用意します。
![st0.png](https://qiita-image-store.s3.amazonaws.com/0/32925/0edc212d-bd04-882a-52c4-bebd6caa7093.png)

初めに、「u」を打ち込むと、それをアタマに持つスニペット一覧が出てくるので、ここでは「uvm_sequcener」をカーソルキーで選択し、tabキーで確定させます。
![st1.png](https://qiita-image-store.s3.amazonaws.com/0/32925/fc3e6788-3d3a-6817-0f54-8a66430e2d11.png)

すると、こんな感じで`uvm_sequencer`の雛型ができます。ここで、「my_uvm」という単語が **複数選択されている** ことがわかります。
![st2.png](https://qiita-image-store.s3.amazonaws.com/0/32925/66296bd9-1d45-3d57-cb83-4153303d8ae1.png)

なので、「my_uvm」を一気に複数同時に変えることができます。
![st3.png](https://qiita-image-store.s3.amazonaws.com/0/32925/731884cb-b9eb-0c4c-6911-da0574ff0ca4.png)

変えた直後、tabキーを押すと、次の変更すべき単語にフォーカスします。この例では`uvm_sequence_item`になります。
![st4.png](https://qiita-image-store.s3.amazonaws.com/0/32925/d73ca034-b0b9-c9b7-20cd-51c1d85495f2.png)

こんな感じで単語を入れてtabキーを押すと最後はこのようになります。
![st5.png](https://qiita-image-store.s3.amazonaws.com/0/32925/c126ff2e-74ff-9d87-5b72-144a7bd38e46.png)

##終わりに
不慣れなもんで、UVMは手で書いていくとコードがどんどん汚くなることがわかり、ここでは一歩引いて、スニペット群を作ることにしました。
スニペットをチームで共有して、書式を統一してもいいかもしれません。コードの生産性も上がりそうです。

画面を見るとお気づきかもしれませんが、他のUVMパーツも作ってあります。
最初は全部載せようかと思いましたが、Qiitaにコードの折りたたみ機能が無いため、1個だけにしました。 **リクエストがあれば残りも載せますので、ご連絡下さい。**
GitLab API | gitlab gem で Issue のコメント一覧を取得する

# GitLab API | gitlab gem で Issue のコメント一覧を取得する
## 概要
gitlab gem で Issue のコメント一覧を取得します。

## シグネチャ

~~~ruby
issue_notes(project, issue)
~~~

project => プロジェクトID
issue => IssueID

## サンプル
プロジェクト10件の、各Issue10件に対するコメントを取得します、

~~~ruby
require 'gitlab'

Gitlab.configure do |config|
  config.endpoint       = 'http://some_path/api/v3' 
  config.private_token  = 'your token'
end
Gitlab.projects(per_page: 10).each do |project|
  Gitlab.issues(project.id, per_page: 10).each do |issue|
    issue_notes = Gitlab.issue_notes(project.id, issue.id)
    if issue_notes.size == 0
      puts "no issue notes"
    else
      puts issue_notes.first.body
    end
  end
end
~~~

## 出力例

~~~
some comment1
some comment2
some comment3
~~~

## 参照
* GitLab gem RubyGems
https://rubygems.org/gems/gitlab

* GitLab gem GitHub
https://github.com/NARKOZ/gitlab
Jerseyのテスト（JerseyTest）をJUnit4のRuleで動かす

Jersey のテストを書こうと思ったら、 `JerseyTest` を継承するって [ユーザーガイドに書いてあった](https://jersey.java.net/documentation/latest/test-framework.html)。

JUnit4 使うんだったら、やっぱり `@Rule` で書いたほうがスタイリッシュなので、 `@Rule` で動かせるか試してみた。

[GitHub でサンプルを公開してます](https://github.com/opengl-8080/jersey-test-rule/tree/master)

#リソースクラス
```java:SampleResource.java
package sample.jersey;

import javax.ws.rs.GET;
import javax.ws.rs.Path;

@Path("sample")
public class SampleResource {
    
    @GET
    public String method() {
        return "sample resource";
    }
}
```

#ルールクラス
```java:JerseyTestRule.java
package sample.jersey;

import javax.ws.rs.core.Application;

import org.glassfish.jersey.test.JerseyTest;
import org.junit.rules.ExternalResource;

public class JerseyTestRule extends ExternalResource {
    
    private JerseyTest jerseyTest;
    
    public JerseyTestRule(final Application config) {
        this.jerseyTest = new JerseyTest() {
            @Override
            protected Application configure() {
                return config;
            }
        };
    }
    
    @Override
    public void before() throws Throwable {
        this.jerseyTest.setUp();
    }
    
    @Override
    public void after() {
        try {
            this.jerseyTest.tearDown();
        } catch (Exception e) {
            throw new RuntimeException("failed to tear down JerseyTest.", e);
        }
    }
    
    public JerseyTest getJerseyTest() {
        return this.jerseyTest;
    }
}
```

#テスト用の Application クラス
```java:TestResourceConfig.java
package sample.jersey;

import org.glassfish.jersey.server.ResourceConfig;

public class TestResourceConfig extends ResourceConfig {
    
    public TestResourceConfig() {
        register(SampleResource.class);
    }
}
```

#テストクラス
```java:SampleResourceTest.java
package sample.jersey;

import static org.hamcrest.MatcherAssert.*;
import static org.hamcrest.Matchers.*;

import org.junit.Rule;
import org.junit.Test;

public class SampleResourceTest {
    
    @Rule
    public JerseyTestRule rule = new JerseyTestRule(new TestResourceConfig());
    
    @Test
    public void test() {
        String response = rule.getJerseyTest().target("sample").request().get(String.class);
        assertThat(response, is("sample resource"));
    }
}
```

#参考
- [Chapter 23. Jersey Test Framework](https://jersey.java.net/documentation/latest/test-framework.html)
GitLab API | gitlab gem で Issueの編集

# GitLab API | gitlab gem で Issueの編集
## 概要
gitlab gem で Issueの編集 

## シグネチャ

~~~
edit_issue(project, id, options = {})
~~~

*project* は プロジェクトの id
*id* は Issue の id
(※プロジェクトごとの連番になっている Issue.iid ではないので注意。GitLab の画面に表示されているのは iid。
ここで利用するのはプロジェクトを問わず全体の連番になっている Issue.id)

|option|type|内容|
|:--|:--|:--|
|:title|String|Issueのタイトル|
|:description|String|Issueの内容。Markdownで記述|
|:assignee_id|Integer|アサイン先のid|
|:milestone_id|Integer|マイルストーンのid|
|:labels|String|カンマ区切りのラベル名のリスト|
|:state_event|String|ステータス。'close' か 'reopen'|

## サンプル
### 新規作成

|項目|設定値|
|:--|:--|
|project_id|31|
|title|new_title|
|description|new_description|
|assignee_id|1|
|labels|ruby,gitlab|

※stateは opend になる。

### 編集内容

|項目|設定値|
|:--|:--|
|project_id|31|
|title|edit_title|
|description|edit_description|
|assignee_id|4|
|state_event|close|
|labels|perl,github|

### コード

~~~ruby
require 'gitlab'
require 'tbpgr_utils'

def show_issue_detail(issue, message_header = '')
  assignee_id = issue.assignee ? issue.assignee.id : ''
  puts message_header
  bulk_puts_eval binding, <<-EOS
issue.id
issue.iid
issue.project_id
issue.title
issue.description
assignee_id
issue.state
issue.labels
  EOS
end

Gitlab.configure do |config|
  config.endpoint       = 'http://some_path/api/v3' 
  config.private_token  = 'some token'
end
project_id = 31
Gitlab.create_issue(project_id, 'new_title', description: 'new_description', assignee_id: 1, labels: 'ruby,gitlab')
new_issue = Gitlab.issues(project_id).first
show_issue_detail(new_issue, "-------new record-------")
Gitlab.edit_issue(project_id, new_issue.id, title:'edit_title', description: 'edit_description', assignee_id: 4, state_event: 'close', labels: 'perl,github')
edit_issue = Gitlab.issues(project_id).first
show_issue_detail(edit_issue, "-------edit record-------")

__END__
下記はTbpgrUtils gemの機能
bulk_puts_eval

https://rubygems.org/gems/tbpgr_utils
https://github.com/tbpgr/tbpgr_utils
~~~

## 出力
~~~
-------new record-------
issue.id          # => 90
issue.iid         # => 13
issue.project_id  # => 31
issue.title       # => "new_title"
issue.description # => "new_description"
assignee_id       # => 1
issue.state       # => "opened"
issue.labels      # => ["ruby", "gitlab"]
-------edit record-------
issue.id          # => 90
issue.iid         # => 13
issue.project_id  # => 31
issue.title       # => "edit_title"
issue.description # => "edit_description"
assignee_id       # => 4
issue.state       # => "closed"
issue.labels      # => ["perl", "github"]
~~~

## 参照
* GitLab gem RubyGems
https://rubygems.org/gems/gitlab

* GitLab gem GitHub
https://github.com/NARKOZ/gitlab
GitLab API | gitlab gem で 新規Issueの作成 

# GitLab API | gitlab gem で 新規Issueの作成 
## 概要
gitlab gem で 新規Issueの作成 

## シグネチャ

~~~
create_issue(project, title, options = {})
~~~

*project* は プロジェクトの id
*title* は Issue のタイトル文字列

|option|type|内容|
|:--|:--|:--|
|:description|String|Issueの内容。Markdownで記述|
|:assignee_id|Integer|アサイン先のid|
|:milestone_id|Integer|マイルストーンのid|
|:labels|String|カンマ区切りのラベル名のリスト|

## サンプル
Issue の *title* 「api test」
Issue の *description* 「api test」
Issue の *assignee_id* 「4」
Issue の *labels* ruby と gitlab
で新規 Issue を作成します。

~~~ruby
require 'gitlab'

Gitlab.configure do |config|
  config.endpoint       = 'http://some_path/api/v3' 
  config.private_token  = 'your token'
end
puts Gitlab.issues.size # => この段階では 0
project_id = 31
issue_title = 'api test'
options = {
  description: 'description',
  assignee_id: 4,
  labels: 'ruby,gitlab',
}
Gitlab.create_issue(project_id, issue_title, options)
puts Gitlab.issues.size # => この段階では 1
~~~

## 出力
~~~
0
1
~~~

## 参照
* GitLab gem RubyGems
https://rubygems.org/gems/gitlab

* GitLab gem GitHub
https://github.com/NARKOZ/gitlab
RuboCop | Style/NonNilCheck

# RuboCop | Style/NonNilCheck

## 概要

RuboCopの「Style/NonNilCheck」警告について。

以下のコードを

~~~ruby
if !hoge.nil?
if hoge != nil?
~~~

以下のコードに変更するように警告します。

~~~ruby
if hoge
~~~

ただし、デフォルト時は

~~~ruby
if hoge != nil?
~~~

のみに警告を出します。

### 設定値一覧

|設定対象|設定値|内容|デフォルト|
|:-----|:---|:---|:---:|
|IncludeSemanticChanges|false|hoge != nil?のようなケースに警告をしない|○|
|IncludeSemanticChanges|true|hoge != nil?のようなケースに警告をする|--|

## NonNilCheck

各設定値での検証結果をまとめます。

### 検証プログラム

non_nil_check.rb

~~~ruby
def hoge(msg)
  puts msg if !msg.nil?
end

def hige(msg)
  puts msg if msg != nil
end

def hage(msg)
  puts msg if msg
end
~~~

### 実行結果 デフォルト の場合

.rubocop.yml

~~~yaml
NonNilCheck:
  IncludeSemanticChanges: false
Style/NegatedIf:
  Enabled: false
~~~

~~~bash
$ rubocop non_nil_check.rb
Inspecting 1 file
C

Offenses:

non_nil_check.rb:6:23: C: Explicit non-nil checks are usually redundant.
  puts msg unless msg != nil
                      ^^

1 file inspected, 1 offense detected
~~~

### 実行結果 true に設定します

.rubocop.yml

~~~yaml
NonNilCheck:
  IncludeSemanticChanges: true
Style/NegatedIf:
  Enabled: false
~~~

~~~bash
$ rubocop non_nil_check.rb
Inspecting 1 file
C

Offenses:

non_nil_check.rb:2:19: C: Explicit non-nil checks are usually redundant.
  puts msg unless !msg.nil?
                  ^^^^^^^^^
non_nil_check.rb:6:23: C: Explicit non-nil checks are usually redundant.
  puts msg unless msg != nil
                      ^^

1 file inspected, 2 offenses detected
~~~

## 補足

この警告は rubocop -a で修正可能です。

## RuboCopまとめ記事

http://qiita.com/tbpgr/items/edbfecb6a6789dd54f47
声優の生年月日を取得してみる

wikipediaから取得してみる

```bash
$ perl birthday.pl
花澤香菜,1989年,2月25日,25歳
阿澄佳奈,1983年,8月12日,30歳
井口裕香,1988年,7月11日,25歳
東山奈央,1992年,3月11日,22歳
竹達彩奈,1989年,6月23日,25歳
茅野愛衣,1987年,9月13日,26歳
金元寿子,1987年,12月16日,26歳
豊崎愛生,1986年,10月28日,27歳
名塚佳織,1985年,4月24日,29歳
今井麻美,1977年,5月16日,37歳
原田ひとみ,不明,不明,不明
西明日香,不明,不明,不明
洲崎綾,1986年,12月25日,27歳
```

```pl:birthday.pl
#!/usr/bin/perl
use strict;
use warnings;
use Furl;
use utf8;
binmode(STDOUT, ":utf8");
binmode(STDIN,  ":utf8");

exit(main());

sub main
{
  my @list = qw(
花澤香菜
阿澄佳奈
井口裕香
東山奈央
竹達彩奈
茅野愛衣
金元寿子
豊崎愛生
名塚佳織
今井麻美
原田ひとみ
西明日香
洲崎綾
);

  foreach my $name (@list) {
    my $uri_name = uri_encode($name);
    my $wiki_top = "http://ja.wikipedia.org/wiki";
    my $html = request_html("$wiki_top/$uri_name");
    die "$name not found" unless $html;
    my ($year, $day, $age) = analyze_html($html);
    print "$name,$year,$day,$age\n";
  }

  return 0;
}

sub analyze_html
{
  my ($html) = @_;

  my $year = "不明";
  my $day  = "不明";
  my $age  = "不明";
  my $parse_tag = "</tr>";
  foreach my $line (split /$parse_tag/, $html) {
    next unless $line =~ /生年月日/;

    if ($line =~ /(\d+年)/) {
      $year = $1;
    }
    if ($line =~ /(\d+月\d+日)/) {
      $day = $1;
    }
    if ($line =~ /(\d+歳)/) {
      $age = $1;
    }
  }
  return ($year, $day, $age);
}

sub uri_encode
{
  my ($str) = @_;
  use URI::Escape;
  return uri_escape_utf8($str);
}

sub request_html
{
  my ($url) = @_;
  my $furl = Furl->new;
  my $res = $furl->get($url);
  unless($res->is_success) {
    return;
  }
  my $http_response = $res->as_http_response;
  my $html = $res->decoded_content;
  return $html;
}
```
ブラウザがサポートしてるinput typeかどうかの判定

html5で新たなinput typeが定義されましたが、ブラウザによってサポート状況が異なります。

参考 caniuse
http://caniuse.com/#search=input%20type

以下のコードでブラウザがサポートしてるinput typeかどうか判定できます。

```lang:supportInputType.js
function supportInputType(type){
    var support, input = document.createElement('input');
    input.setAttribute('type', type);
    support = input.type === type;
    input = null;
    return support;
}
```

デモ http://jsdo.it/ksk1015/4pg0
Python Livereload を使って Sphinx でドキュメントを書く


[Sphinx](http://sphinx-users.jp/index.html) でドキュメントを書いているとソースファイル (reST) を HTML に変換するために `make html` コマンドを実行することが多いと思います。しばらく書いてみると、ソースファイルを変更する度にコマンドを実行して HTML を確認するためにブラウザをリロードして ... という操作は煩雑に思えてきます。

[Python LiveReload](http://livereload.readthedocs.org/en/latest/) を使うとファイルの変更を検知してブラウザを自動的にリロードできるようになります。設定スクリプトは Python で記述しますので、Python に関するドキュメントを書いている場合は頭の切り替えが要らない点がメリットと言えます。

バージョンによって設定方法が違っており、各種 API も変わっています。バージョン 2.2.1 からはそろそろ Python 3.x でも使えるようになってきましたので、導入方法をまとめておきます。

## direnv による環境設定

[direnv](http://direnv.net/) を使って *.envrc* と *requirements.txt* を用意しておくと設定が簡単です。

```bash
$ direnv allow .
$ pip install -r requirements.txt
```


```bash:.envrc
# for Python 2.7
#PYVENV_DIR=$HOME/.pyvenv/sphinx-py27
#PYVENV="virtualenv --distribute"
# for Python 3.4
PYVENV_DIR=$HOME/.pyvenv/sphinx-py34
PYVENV=pyvenv-3.4

[ -d $PYVENV_DIR ] || $PYVENV $PYVENV_DIR
source $PYVENV_DIR/bin/activate
```

```bash:requirements.txt
Sphinx
livereload
```

これで、ターミナルでこのディレクトリに移動すると Sphinx と livereload のパッケージやコマンドを利用できます。

## 設定ファイル

次に、WSGI アプリケーション用に *server.py* を用意します。実行ビットを立てておくと起動時のタイプ数が少なくて便利です。

```python:server.py
#!/usr/bin/env python

from livereload import Server, shell

server = Server()
server.watch('**/*.rst', shell('make html'))
server.serve(open_url=False)
```

スクリプトを実行してサーバーを立ち上げます。`open_url` 引数に True を与えておくと、サーバー起動時にデフォルトのブラウザでページが開きます。

```bash
$ ./server.py
```

あとは普通にドキュメントの reST ソースファイルを編集すると、ファイルを保存したタイミングで `make html` が実行されてブラウザが更新されます。他にも処理を挟みたい場合は Python で記述できますので、たいがいのことには対応できるでしょう。

## おわりに

Python LiveReload を使うと Sphinx でドキュメントを書く作業を快適にできます。[Watchdog](http://pythonhosted.org/watchdog/) でも同じようなことを実現できますが、[LiveReload](http://livereload.com/) はブラウザのリロードまで実行してくれる点が嬉しいですね。

Python 2.x と Python 3.x の両対応で実装が微妙だったり、そもそも対応できていない部分もあるかもしれませんが、ソースファイルを編集する度に手作業でビルドしている場合には導入する価値があると言えるでしょう。

あと、汎用の LiveReload サーバーとしても利用できます。 `livereload` コマンドでディレクトリを指定した配信ができますので、ちょっとした HTML を編集するにも便利だと思います。
Excelで入力フォームを使う

クイックツールバーを右クリックし、クイックアクセスツールバーのカスタマイズを選択。

![スクリーンショット 2014-07-10 20.50.43.png](https://qiita-image-store.s3.amazonaws.com/0/25728/195d9d54-232f-90d6-9c84-98a6f2f494a9.png)

表にカーソルを合わせてフォームアイコンをクリック

![スクリーンショット 2014-07-10 20.52.30.png](https://qiita-image-store.s3.amazonaws.com/0/25728/e928dee9-082a-5ed0-e1bc-effe107a7826.png)
Mac OS Xを再インストールしてhomebrewでインストールしたものが使えなくなった時の対象方法


データを全部消して行うクリーンインストールじゃなくて、OS Xだけをインストールし直した場合の話

# 手順

## 1.XcodeのCommand Line Toolsをインストールする

## 2.brew linkを実施する
```zsh
for x in $(brew list -1); do brew unlink $x; brew link $x; done
```

参考：https://github.com/Homebrew/homebrew/issues/27106#issuecomment-46449600

## 3.brew doctorで確認
```zsh
brew doctor
```

## 4.問題があれば適宜対応

って感じで使えるようになりました！
MacでEclipseの環境構築

# 環境

* Mac OSX 10.9.3
* 15inch MacBookPro (2012 Mid)

# 目標

* WindowsのEclipseと同等の使いやすさの環境をMacで構築する

# Eclipseのインストール

ここからダウンロードしてインストール（Applicationsフォルダにコピー）。あ、フォルダにバージョンを末尾に追加。

* [Eclipse Downloads](https://www.eclipse.org/downloads/)

# Eclipseの日本語化

日本語プラグインをPleadesをインストール。と言ってもWindows版と違って、MacはAll-in-Oneパッケージはなので、 Pleiades プラグインをダウンロードして、手動でインストールする。

下記リンクの「 Pleiades プラグイン・ダウンロード」から安定版で最新のものをダウンロードして解凍

* [Pleiades - Eclipse プラグイン日本語化プラグイン | MergeDoc Project](http://mergedoc.sourceforge.jp/#pleiades.html)

日本語化にあたっての手順はreadme_pleiades.txtに書いてあるが、大きくは以下のとおり。

1.　Eclipse.appの同一階層には、features, pluginsという名前のフォルダがある。そこへ、先ほど解凍したPleiadesフォルダ内にあるfeatures, pluginsフォルダ（同じ名前）**の中のファイル（「jp.sourceforge.mergedoc.pleiades」というフォルダ名）** をそれぞれコピーする。

2.　インストールしたEclipse.appを右クリック→パッケージの内容を表示。更にContents/MacOS/eclipse.iniファイルを適当にテキストエディタで開いて、末尾に

`-javaagent:plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar`

を追加。

あとは、eclipse.iniファイルを好みで修正

```
# パッケージ・エクスプローラやナビゲーション関連のフォントサイズを大きくしたかったので以下を削除

-Dorg.eclipse.swt.internal.carbon.smallFonts

# メモリ領域を40-512MB→1024MBへ

-Xms40m → -Xms1024m
-Xmx512m → -Xmx1024m
```
# 起動してみる

無事起動＼(^o^)／この勢いでワークスペースをDropbox（Windowsで使用）と設定。これまで作ってきたEclipseのプロジェクトが読み込まれた。

# フォントサイズの変更

一見、フォントのサイズがかなり小さい。これは、外付けキーボードを使うため、画面からの距離が多少離れることもあり、見づらい。そこで、フォントサイズを調整しようと思い、メニュー→環境設定→外観→色とフォントの「基本」のテキストフォントのサイズを変更しても、エディタのフォントサイズが変更されない。煮詰まってきたところで、「Java」という項目がみつかったので、そのJavaエディタ・テキスト・フォントという項目のフォントサイズを変更すると、無事エディタの外観が変更された。

# 勢いでRictyインストールした

フォント生成まではやらないだろうなぁ（数年前に挫折したため）と思ってたけど、勢いづいてやってしまった。下記リンクからの手順がとても楽だった。

[Mac OSXに超カッコイイプログラミング用フォント「Ricty」をセットアップする - blog@sotm.jp](http://blog.sotm.jp/2014/01/10/Installing-SublimeText3-iTerm2-Ricty-on-MacOSX-109/)

引っかかったところは、fontforgeのパスが通っていなかったらしいところ。Terminalからアクセス権かえる命令を打ったりしたんだけど、変更されなくて困った。ダメ元で、Finderのフォルダー→フォルダーへ移動→/usr/local/lib→右クリックで情報を見て、該当ペインの下部アクセス権のところを主導で変更した上で、再度Terminalからコマンドを打ったら、無事パスの設定、フォントの生成ができた。

先ほどのEclipseの環境設定のところからフォントの変更をして終了。
インスタグラムの画像200億枚をダウンロードしたら何円なのか？

最近下記のようなニュースを見て気になった
「いったいS3の転送量いくらかかったんだろう」

Instagram が達成した史上最大のマイグレーション：200億枚のイメージを AWS から Facebook Bare-Metal へ！
http://agilecatcloud.com/2014/07/08/instagram-%E3%81%8C%E9%81%94%E6%88%90%E3%81%97%E3%81%9F%E5%8F%B2%E4%B8%8A%E6%9C%80%E5%A4%A7%E3%81%AE%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%EF%BC%9A200%E5%84%84/

200億枚（20,000,000,000) * 100KB(100,000) = 2,000,000GB = 2,000TB

1枚100KBと仮定するとだいたい2ペタバイトだそうだ。
これをAWSの見積ツールに入れてみる

![スクリーンショット 2014-07-10 20.08.51.png](https://qiita-image-store.s3.amazonaws.com/0/4140/05fab21b-9b74-96fa-935b-05f566be6026.png "スクリーンショット 2014-07-10 20.08.51.png")

$114041.47なので1ドル114円だと約1,155万円ですね。思ったより
安いような高いような。
（サポートで約100万円ってなんなんだろう。詳しくないのでわからない）

実際は1年かけて移動ということだし、ボリュームディスカウントもあったりするだろうから全然違う価格だろうけど1回のデータ移動で少なくとも数百万円単位のお金が移動ってすごいなと思いました。
NetBeans + Android 開発環境を用意する

先日急に [Java EE の開発環境を用意](http://qiita.com/ynakayama/items/04ce89a8ddde6ee03315)しましたが、本日は急になぜか Android の開発環境をさらに用意します。

Java なので利用する OS は基本的には何でも良いのですがこの記事では先日と同様、開発者と親和性が高くてフリーなプラットフォームである GNU/Linux ディストリビューションを想定します。

## Java SDK

[先日の記事](http://qiita.com/ynakayama/items/04ce89a8ddde6ee03315)で /opt/java/jdk/current などのディレクトリに Java SDK 7 がセットアップされていることになっていますから何もする必要はありません。省略です。

なお筆者のプロダクトのインストールパスについては[データ分析用のプログラミング言語環境を用意](http://qiita.com/ynakayama/items/2a4d4802c93eb5c40eab)したときにルールを説明しました。

## NetBeans

[先日の記事](http://qiita.com/ynakayama/items/04ce89a8ddde6ee03315)で /opt/netbeans/current などのディレクトリに NetBeans がセットアップされていることになっていますから何もする必要はありません。省略です。

Android 開発の入門用記事を探ると多くは Eclipse を利用しているようですが、 Eclipse は重いしそもそも先日 NetBeans を入れたばかりなのであれこれと IDE を乱立させたくないので NetBeans を使います。

## Android SDK

[Android SDK の公式サイト](http://developer.android.com/sdk/) から the stand-alone Android SDK Tools をダウンロードしてきます。

ここでは android-sdk_r23.0.2-linux.tgz をダウンロードしたものとします。

まずいつも通り /opt/android-sdk/r23.0.2 に展開しシンボリックリンクを貼って /opt/android-sdk/current とします。

次に /opt/android-sdk/current/tools/android を実行して Android SDK Manager を起動します。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/38501/0d56c6e6-1269-07c5-8031-a8a8e9f9bab0.png)

こんな感じでウィンドウが起動するので使いたいものにチェックを入れてインストールします。

## NetBeans 用 Android プラグイン

[NBAndroid](http://nbandroid.org/wiki/index.php/Installation) という NetBeans 用 Android 開発環境プラグインがあるのでこれを入れます。これは NetBeans のプラグインの画面から http://nbandroid.org/updates/updates.xml を追加すればインストールすることができます。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/38501/3d4f1154-b2f0-d04d-ebdd-9b48b2fd1a3c.png)

### SDK ロケーションの指定

プラグインをインストールしたら IDE を再起動し、 NetBeans の設定画面から Android SDK のロケーションを指定します。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/38501/ff52681a-bcc2-b099-2dc2-cfeed67d4281.png)

### NBAndroid 拡張

[NBAndroid 拡張](http://nbandroid.org/wiki/index.php/NBAndroid-ext)のライセンスを登録しろなどという案内が表示されるので [NBAndroid subscriptions](http://nbandroid.org/subscription/) にてメールアドレスを登録、送られてきたキーファイルを設定画面で登録します。

## Android Virtual Device (AVD) Manager の設定

実行にそなえて AVD Manager から利用したい Android 端末を選択し設定します。

![4.png](https://qiita-image-store.s3.amazonaws.com/0/38501/9a12f6db-cdaf-a2a7-636c-63433435e667.png)

## Android Project の開始

これで Android の開発をはじめることができるようになりました。

ちなみに [Android の書籍](http://www.amazon.co.jp/s/ref=nb_sb_noss_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&url=search-alias%3Daps&field-keywords=Android)はできるだけ最新のものを読むと良いでしょう。
プライベートブラウズなSafariだとローカルストレージが使えない


iOS / MacOS共にプライベートブラウズモードなSafariだとローカルストレージが使えない。

```javascript
try {
	localStorage.setItem("name", "value");
} catch(e) {
}
```

try / catchで囲む。プライベートブラウズかどうかの判別には今のところこれしかないみたい。全ブラウザDNTで判定できたら楽なのに。