OmniAICreator/Qiita-1.07M huggingface dataset:
1年間開発して使ったgit commandまとめ

よく使うgitのcommandをまとめてみました。まとめるのに使ったコマンドは下記の通り

```shell-session
history 1 | sed -e 's/^ *[0-9]* *//g' | sed -n -e '/^git/p' | sort | uniq -c | sort -k1 -n
```

なお、SourceTreeを併用しているため、SourceTreeでやりにくいコマンドがメインです。1年間で使ったコマンドが下記26個というのは多いのか少ないのか

# 1位: 600回 git checkout ブランチ名

ブランチを切り替える

1人で開発してるわけではないので、master/develop/feature/hotfix/releaseのブランチを行ったり来たりする必要性があります

# 2位: 382回 git rebase -i HEAD~数字

コミットをまとめる

メンバーの共有財産であるレポジトリをかっこ悪いコミットで汚さないようにマージリクエストを出す前には綺麗にまとめましょう

# 3位: 374回 git push --force-with-lease origin `git rev-parse --abbrev-ref HEAD`

現在のブランチをoriginに強制pushする

rebaseしまくってるので、強制pushしまくってみたいですねｗ

# 4位: 351回 git rebase ブランチ名

別ブランチの変更を取り込む

mergeで取り込む方法もありますが、rebaseで取り込んだ方が歴史が綺麗になるので私はこっちを使っています

# 5位: 261回 git pull

remoteの変更点を取得する

開発する前にはとりあえず変更を取り込んでおくことは大事です。これをしておかないとコンフリクトしたりとややこしい><

# 6位: 243回 git branch

ブランチを確認する

間違えてmasterブランチやdevelopブランチを変更してしまわないようにチェックしましょう

# 7位: 237回 git stash

変更を一時退避する

rebaseする前やpullする前に必要になることがあります

# 8位 132回 git stash pop

git stashで一時退避した変更を戻す

stashした回数に比べて半分ぐらいという不思議・・・git stashをreset代わりに使ってしまっているんでしょうね
 
# 9位: 124回 git checkout -b 新しいブランチ名

新しいブランチを作成して切り替える

新規開発を始める際には基本的なコマンドです

# 10位: 108回 git push origin `git rev-parse --abbrev-ref HEAD`

現在のブランチをoriginにpushする

強制pushする必要性が無いならば、こっちを使ったほうが安全でいいです

# 108回 git reset

`git reset HEAD~数字` HEADから数字分前のコミットへとresetする
`git reset HEAD@{数字}` git reflogで管理されているHEADから数字分前の状態へとresetする
`git reset --hard origin/ブランチ名` originのブランチへとresetする(主に強制pushされた場合にlocalとoriginの歴史の食い違いを解消するために用いました)
`git reset コミットハッシュ` 特定のコミットへとresetする

git resetがあるからちょっと危険なことをしても大丈夫みたいな安心感はありますね

# 74回 git fetch

remoteの変更点を取得する。ただし、pullと違ってmergeはしない

主な使いみちとしてはpullできない状態(強制pushされた場合)で、`git fetch && git reset --hard origin/ブランチ名`という感じに取り込む場合ですかね。後はただ単にcheckoutするためとか。

# 59回 git commit -m "コメント"

変更をコミットする

少ないのはSourceTreeに頼っているからです。GUIある方がaddとかdiffとかがわかりやすいです。

# 43回 git rebase --continue

rebaseを続ける

`git rebase`でコンフリクトした場合に解消して続きを実施する場合に用います

# 43回 git clone リポジトリのURL

リポジトリを複製する

cloneするのは最初だけなので回数は少ないですね

# 39回 git blame ファイル名

ファイルの変更履歴を確認する

主に不具合のあるコードが確認された場合にいつからだろうか(犯人は誰だｗ)と確認するために使います。他にもよくわからないコードを書いた本人に尋ねるためにも使います(コミットログも確認できます)

# 35 git cherry-pick コミットハッシュ

ハッシュで指定したコミットを取り込む

主にdevelopやmasterに不具合が混入した時にhotfixを作成するために用いました

# 35回 git diff

`git diff` 変更点を確認する
`git diff ファイル名` 指定したファイルの変更点を確認する
`git diff --no-prefix HEAD > パッチファイル名` HEADからの変更部分のパッチを作成する

diffはSourceTreeで確認するのがわかりやすいんですが、たまに使っていたようです。

# 35回 git add ファイル名

指定したファイルを変更内容として追加する

commitと同様にほとんどSourceTreeで作業していたので回数が少ないです

# 34回 git rebase --abort

git rebaseを中止する

コンフリクトが酷い場合にやり直すために用いました

# 31回 git merge ブランチ名

指定したブランチの変更をマージ取り込みする

mergeは嫌いなのでほとんどrebaseで取り込んでいます。これが必要なのは開発にgitlabを用いており、gitlab上でmergeができない時の手動マージ処理のためですね。

# 17回 git status

作業ツリーの状態を表示する

これもSourceTreeで確認するのがわかりやすいです。コマンドはほとんど使わないです

# 12回 git reflog

gitの全ての操作ログを表示します

間違えて`reset --hard`してしまった時やブランチを削除してしまった時など、通常のgit操作で戻せない時に助かります

# 6回 git revert 

`git revert コミットハッシュ` 通常のコミットを戻す
`git revert -m 1 コミットハッシュ` マージコミットを戻す

develop/masterに取り込まれたコミットを戻す時に使いました

# 3回 git gc

gcコマンド

# 2回 git log -p ファイル名

指定したファイルの変更履歴をたどる

git blameと似たような使い方で、何か不具合が見つかった時にどのような経緯なのかを確認する時に使いました
ag (The Silver Searcher) コマンド覚え書き

今更ですが、[ag(The Silver Searcher)](https://github.com/ggreer/the_silver_searcher) を積極的に使っていこうと思っています。
主に自分用のメモをここに書き溜めていくつもりです。

## ag をよく知らない人のために

ag は Perl 製の [ack](https://github.com/petdance/ack) と似たツールですが、高速に動作するのが特長です。
ディレクトリを再帰的に検索でき、便利な機能・オプションが色々あります。

Mac, Linux, BSD, Windows 各 OS に対応しています。

インストールガイド等は [公式の README](https://github.com/ggreer/the_silver_searcher) をご参照下さい。

## コマンド・フォーマット

`ag --help` より。

```bash
ag [FILE-TYPE] [OPTIONS] PATTERN [PATH]
# 例
ag -i foo /bar/
```

## コマンドオプション

※今は一部しか載せていません。随時加筆予定。

### 出力オプション

| option | 説明 |
|:------:|:-----|
| `-l, --files-with-matches` | マッチしたファイル名のみ表示 |

### 検索オプション

| option | 説明 |
|:------:|:-----|
| `-G, --file-search-regex PATTERN` | 正規表現で対象ファイルを絞り込み |
| `--ignore(-dir) PATTERN` | マッチするファイル・ディレクトリを対象から除外 |
| `--hidden` | 隠しファイルを検索対象にする |
| `-i, --ignore-case` | 大文字小文字の違いを無視 |
| `-s, --case-sensitive` | 大文字小文字の違いを考慮する |
| `-S, --smart-case` | 検索 PATTERN に大文字が含まれない限り、大文字小文字の違いを無視する（デフォルト） |

## 使用例

### 特定ディレクトリ以下のファイル群に対する文字列の一括置換操作

```bash
# lib/ 以下の *.rb を検索して foo => bar に一括置換
ag -l -G '\.rb$' foo lib/ | xargs perl -pi -e 's/foo/bar/g'
```

上のような操作は、今まで `find ... | xargs perl -pi -e '...'` とやっていました[^1]が、ag だとマッチするファイルだけに対象が絞り込まれるので、少し安心感がありますね。

[^1]: [Perlのワンライナーとコマンドラインオプション - weblog of key_amb](http://keyamb.hatenablog.com/entry/20120626/1278392679)

## ハマりどころ

### デフォルトで `--smart-case` が有効

何度か「あれっ？」となったのですが、オプションの項に載せている通り、デフォルトでは検索文字列に大文字を含まない限り、大文字小文字の違いを無視してくれるようです。

きっと、気を利かせてくれているのでしょう。

## おわりに

随時更新予定です。

## 参考

- [The Silver Searcher のススメ - Qiita](http://qiita.com/thermes/items/e1e0c94e2875df96921c)

## 脚注
apnic から 国を指定して IP アドレス一覧を取得する

必要になったのでそういう Gem を作りました。

https://github.com/kminiatures/search_apnic


# Install

```
gem install search_apnic
```

# 一覧を出す

```
search_apnic -c JP --dump
```

 👇🏼

```
1.0.16.0/20
1.0.64.0/18
1.1.64.0/18
1.5.0.0/16
1.21.0.0/16
1.33.0.0/16
1.66.0.0/15
1.72.0.0/13
1.112.0.0/14
....
````

# IP アドレスが日本か調べる

```
search_apnic -c JP -i '192.168.1.1.'
```

範囲内ならアドレス範囲が、そうでなければ 'Not Match' と出力します。

# 既知の問題

`search_apnic -c JP --dump | head` などとすると、`Broken pipe @ io_write - <STDOUT> (Errno::EPIPE)` になる。
ファイルから読みだすループの途中で止まるからかなと思う。

# 以下の記事を参考にしました.

http://qiita.com/tt2004d/items/6ffd26612f6c9c9ba047
pandas.DataFrame.to_sqlの落とし穴と対処法

バッチでデータフレーム型のデータを元に、DB上に仮テーブルを作ったものの
object型のカラムのデータの64文字目以降が勝手に消えていた。
エラーも警告も出なかったのに…なので対処法まとめ。

---

以下のようなデータを元にDBにテーブルを作るとする(nameは70文字)

```sample.csv
name,age
AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDDDDDEEEEEEEEEEFFFFFFFFFFGGGGGGGGGG,20
AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDDDDDEEEEEEEEEEFFFFFFFFFFGGGGGGGGGG,18
AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDDDDDEEEEEEEEEEFFFFFFFFFFGGGGGGGGGG,23
AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDDDDDEEEEEEEEEEFFFFFFFFFFGGGGGGGGGG,21
```

# pandasのto_sql関数とmysql.connectorを使った場合

## サンプルソース
```sample_to_sql.py
import pandas as pd
import mysql.connector
df = pd.read_csv('sample.csv')
table_name = "sample_to_sql"
db_settings = {
    "host": <ホスト名>,
    "database": <データベース名>,
    "user": <ユーザ名>,
    "password": <パスワード>,
    "port":3306
}
con = mysql.connector.connect(**db_settings)
df.to_sql(table_name, con, flavor='mysql', index=False)
```

## 結果
![スクリーンショット 2016-04-25 17.32.13.png](https://qiita-image-store.s3.amazonaws.com/0/69067/229e28b8-58af-7d14-c76d-4ae9f6e92cd1.png "スクリーンショット 2016-04-25 17.32.13.png")

少しわかりにくいが、nameの64文字目以降が消えている。

テーブル情報を見ると
![スクリーンショット 2016-04-25 17.33.39.png](https://qiita-image-store.s3.amazonaws.com/0/69067/7d77e5fc-6f21-bb1d-bc0f-c01bc05f2337.png "スクリーンショット 2016-04-25 17.33.39.png")

63文字制限になっている…
object型のカラムはvarchar(63)でテーブルを作るようにハードコーディングされていた。
(~~~/site-packages/pandas/io/sql.pyの1310行目あたり)

# 解決策
上のスクリプトを実行すると、df.to_sqlの部分でこんな警告が出る。

```
FutureWarning: The 'mysql' flavor with DBAPI connection is deprecated and will be removed in future versions. MySQL will be further supported with SQLAlchemy connectables.
```

ということで、sqlalchemyのインストール

```
sudo pip install sqlalchemy
```

## サンプルコード

```sample_sqlalchemy.py
import pandas as pd
from sqlalchemy import create_engine
df = pd.read_csv('sample.csv')
table_name = "sample_sqlalchemy"
db_settings = {
    "host": <ホスト名>,
    "database": <データベース名>,
    "user": <ユーザ名>,
    "password": <パスワード>,
    "port":3306
}
engine = create_engine('mysql://{user}:{password}@{host}:{port}/{database}'.format(**db_settings))
df.to_sql(table_name, engine, flavor='mysql', index=False)
```

この時点でデータフレームの中身にあったテーブルが作られる。
中身を見るとこんな感じ。

![スクリーンショット 2016-04-25 17.07.00.png](https://qiita-image-store.s3.amazonaws.com/0/69067/1ddb2546-88e2-beb6-6f91-9481c252fe2d.png "スクリーンショット 2016-04-25 17.07.00.png")

varcharだったのが、textになっていた。データはきちんと入っている。
![スクリーンショット 2016-04-25 17.42.52.png](https://qiita-image-store.s3.amazonaws.com/0/69067/46f30251-1bb5-336c-e0e4-0ddb9866c811.png "スクリーンショット 2016-04-25 17.42.52.png")
Ruby | if と unless は一行に両方書ける

# 例

```rb
'I found a truth.' if true unless false

# => 'I found a truth.'
```

# 用途

条件式をつなげるために、余計な否定 ( ! ) を書かなくて良いから。意味が明確になる。
次は冗長な例。

```rb
'I found a truth.' if true && !false

# => 'I found a truth.'
```

# 環境

- ruby 2.3.0



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
正規表現で後方参照の否定はできない(.)[^\1]

自分が日本語で調べた限り見つからなかった。

`9=9`や`あ=あ`という`x=x`を満たす正規表現は
`(.)=\1`
と後方参照で表せられる。
(任意の一文字=先に使った任意の一文字と同じ文字)
では、`9=9`を弾いて、`9=8`や`x=2`のみをマッチさせたい場合、
左辺に出た文字以外を右辺で使いたい。
正規表現の否定は`[^否定したい文字]`なので、
左辺の後方参照を否定する。
`(.)=[^\1]`
しかしこれは正しく動かなかった。
理由は不明であるが、文字クラス`[]`内ではメタ文字が一部を除き機能しないことに由来するのかもしれない。

***

ではどうするか
求めるものは
**先に使用した任意の文字列以外の任意の文字列**
正規表現には単純なAND演算子がなく、そもそも後方参照の否定が難しい

腑に落ちないが、否定先読みを使うと似たようなことができそうだ。

なお、私は正規表現の先読みや後読みは何度解説を読んでも理解できていない。
鵜呑みにはしないでいただきたい。

否定先読みを使うと、こう書ける。
`(.)=(?!\1).`

否定先読みを使うことで、
**=の後が先に使った任意の一文字でなければ、=の後は任意の一文字である**
というふうになる。と思う。
先に`=(?!\1)`で`x=x`の可能性を排除しているので、のちの`.`は`x`以外の場合にしか評価されない。

否定する後方参照が複数になった場合は、グループ化を使用する。

```
☓ 98=9
☓ 98=8
◯ 98=7
```

9でもなく8でもないはこう

`(.)(.)=(?!(?:\1|\2)).`

ORを`(|)`で表現するならば、後方参照対象からはずさなければ未定義になったりするので、後ろのグループ化に悪影響を及ぼす。
なので、`(?:)`で対象から外す。

今回は一文字単位だったが、もっと複雑なものはどうだろうか。
正規表現は否定が苦手、というわけでは無いが、難易度が少し上昇する予感だ。

なお、可読性は著しく下がる。
`((.)(?!\2)(.))\1(?!(?:\2|\3))(.)\4\3`


# 確認サイト

* [Rubular: a Ruby regular expression editor and tester]
* [preg_match()正規表現チェッカー]

[Rubular: a Ruby regular expression editor and tester]:http://rubular.com/
[preg_match()正規表現チェッカー]:http://okumocchi.jp/php/re.php
Angular Material で split bar を実現する

AngularMaterialは標準でスプリットバーを装備していない（2016年4月現在）

flexの数字は動的に変えられるが、5きざみまたは33,35,66,67しか受け付けない。

まずバー部分のHTML
<div layout width="6px" style="cursor:e-resize;" ng-mousedown="split_down($event)"  draggable="false"

あとlayoutのところ
<div layout="column" flex="{{left_width}}" 
<div layout="column" flex="{{right_width}}" 

JavaScript部分

    $scope.downX = -1;

    $scope.left_width = 50;
    $scope.right_width = 50;

    $scope.split_down = function($event){
        
        $scope.downX = $event.screenX;
        $scope.downLeftWidth = $scope.left_width;
        $scope.scaleX = $event.clientX / $scope.left_width;
        
        $document.on('mousemove', $scope.split_move);
        $document.on('mouseup', $scope.split_up); 
    };
    
    $scope.split_up = function($event) {
        $document.unbind('mousemove', $scope.split_move);
        $document.unbind('mouseup', $scope.split_up);   
        
        $scope.downX = -1;
    };
    
    $scope.split_move = function($event) {
        
        if( $scope.downX >= 0){
            var value = parseInt($scope.downLeftWidth + ((  $event.screenX - $scope.downX ) / $scope.scaleX ));
            if( value != $scope.left_width && value % 5 == 0  && value >= 0 && value <= 100){
                $scope.left_width = value;
                $scope.right_width = 100 - value;
                $scope.$apply();
            }
        }
    };
Codeigniter3.0とIon AuthとJQueryの組み合わせで起こったこと

#動いていたはずなのに
Codeigniter3.0とIon Authである程度動線を作りこみ動作確認を行ったときは問題はなかったのに、デザインテンプレートをあてこみIonAuthで既存のUsers情報を更新しようしたところ、セキュリティに問題があるということでどうしても失敗してしまう。

#セッションに問題があるらしい
コントローラAuth.phpでは、1)パスワードのリセット 2)Users情報の更新 には事前にセットされた2つのセッション変数(csrfkeyとcsrfvalue)を照合して成功すれば 1)と 2)それぞれ正常に動作する。
2つのセッション情報は同じコントローラAuth.php内の _get_csrf_nonce という関数で代入される。
私が失敗していたのは更新途中でこの2つのセッション情報が消失してしまったからだった。

#原因はたぶんjquery.min.js
デザインテンプレートをあてこんでから挙動がおかしくなったので、読み込んでいるcssやJSをひとつひとつはずしてみたところ、jquery.min.jsを読み込んだ後に2つのセッション変数(csrfkeyとcsrfvalue)が消えてしまうことがわかった。
本来ならしっかり検証しなくてはならないところだけど。。。

#とりあえずの対処方法
直接$_SESSIONを使うことにした。変数はjqueryにかぶらないように？790行目あたりを

    $key = $_SESSION["ion_auth"]["csrfkey"];
    $value　= $_SESSION["ion_auth"]["csrfvalue"];

と書き換えたらUsersが更新できるようになった。
Cookie関連の最新動向 (2016年)

# はじめに
去年ぐらいからCookieに関する議論が活発に行なわれているように感じます。そこでCookie関連の最新動向について仕様の観点から幾つか列挙します。

* Deprecate modification of 'secure' cookies from non-secure origins
* Cookie Prefixes
* Same-site Cookies
* A Retention Priority Attribute for HTTP Cookies
* Content Security Policy: Cookie Controls


GoogleのMike West氏による提案がほとんどです。議論はIETFのHTTPbis WGやW3Cで行なわれており将来的には正式に標準化されるものもあるでしょう。

また、幾つかはChromeへの実装が進められています。

(間違いなどありましたらご指摘下さい)

## Deprecate modification of 'secure' cookies from non-secure origins
https://tools.ietf.org/html/draft-ietf-httpbis-cookie-alone-00

非セキュアなオリジン(http://)から、secure属性の付いたCookieをセットできないようにする仕様。既にsecure属性が付いたCookieが保存されていたとしても、非セキュアオリジンから上書き出来ないようになります。

「[HTTPSを使ってもCookieの改変は防げないことを実験で試してみた](http://blog.tokumaru.org/2013/09/cookie-manipulation-is-possible-even-on-ssl.html)」の記事で指摘されているような、中間者攻撃によるCookieの改変が防げるようになります。

Chrome 52で導入される予定のようです。

## Cookie Prefixes
https://tools.ietf.org/html/draft-ietf-httpbis-cookie-prefixes-00

サーバ側からはユーザエージェントが保存しているCookieにどのような属性が付いているか確実に知る方法はありません。自身がセットしたCookieといえど、Cookieを共有するサブドメインやJavaScriptに属性を変更されている可能性もあります。

そこで、Cookie名にプレフィックスを用いることで属性を強制する仕様になります。

以下のように、Cookie名に`__Secure`といったPrefixをつけます
`  Set-Cookie: __Secure-SID=12345; Secure; Domain=example.com`

仕様の中で定義されているPrefixは2つです

* `__Secure-` secure属性がついていないCookieは拒否される
* `__Host-`  secure属性がついている。path属性が`/`。domain属性が設定されていない。


現在議論中の仕様での実装が Chrome 49で導入されているようです。


## Same-site Cookies
https://tools.ietf.org/html/draft-west-first-party-cookies-05

当初はFirst-Party-Only Cookieと呼ばれていた仕様ですが、今はSame-site Cookieという仕様になっています。

SameSite属性という属性を新たにCookieに追加する仕様です。このSameSite属性が付いたCookieはクロスサイトなリクエストには付与されなくなります。クロスサイトなリクエストには条件は幾つかアリますが、リクエストの起因となったオリジンと、リクエスト先のオリジンが異なるようなリクエストなどです。これにより、例えばCSRF攻撃などを緩和することが出来ます。

SameSite属性はその他の属性と同様に、以下のように設定できます
`   Set-Cookie: SID=31d4d96e407aad42; SameSite`

Chrome 51で試験導入されているようです。


## A Retention Priority Attribute for HTTP Cookies
https://tools.ietf.org/html/draft-west-cookie-priority-00

サーバからCookieの優先度を指定できるようにする仕様です。ユーザエージェントが容量の問題等でCookieを削除する際にその優先度を見て削除可能にするものです。Cookieを削除する際に、セッションIDといった重要なCookieの削除を避けられるようになります。

Low, Medium, Highという三段階で優先度を指定できます。


Chromeは以前導入されていたらしく、29までは導入されていたらしい。

## Content Security Policy: Cookie Controls
https://www.w3.org/TR/csp-cookies/

CSP(Content Security Policy)に、新しくcookie-scopeと言うディレクティブを追加する仕様です。HTTPレスポンスのSet-Cookieヘッダと、JavaScriptからdocument.cookieで設定できるCookieを制限します。

その他と同様に以下のように指定します。
`Content-Security-Policy: cookie-scope none`

設定できる値は以下のとおりでです

* `host` : domain属性が付いている場合はブロックされる。
* `http` : Set-CookieヘッダからのみCookieをセットできる。document.cookieからはセットできない。
* `none` : 全てブロックする
* `secure` : secure属性の付いたCookieのみを許可する。それ以外はブロックする。
POSIXシェルで変数がセットされているか検査するイディオム

偶にしか使わないと忘れるので備忘録がてら。

2016-04-25 17:26
定義されている、されていないの説明が逆だったので修正しました。失礼しました。


空文字列なのか変数がセットされていないのかを区別しないなら最近のシェルなら

``` shell
[ -n "$foo" ]
```

で検査可能。変数が非空の時にtrueになる（exit statusが0になる）。


空文字列と未定義変数を区別して、未定義変数であるかを検査したいなら

```shell
${foo+:} false
```

で検査可能。こちらも変数が定義されている時にtrueになる（exit statusが0になる）。

これは若干説明が必要だろうか。

まず、変数展開の1つに

```shell
${foo+hogehoge}
```

というのがある。これは `foo` が定義されていれば `hogehoge` 、定義されていなければ空に展開される。

```shell
${foo+:}
```

そこでこれは `foo` が定義されていれば `:` に展開される。 `:` は「何もしない」コマンドだ。引数を全て無視してただtrue（exit status 0）を返す。

ということで

```shell
${foo+:} false
```

は `foo` が定義されてる時には `: false` になり、実行すると `:` が引数の `false` を無視してtrueを返す。
`foo` が定義されていなければ `${foo+:}` は空に展開されるので `${foo+:} false` は `false` に展開される。 `false` はfalse（exit status 1）を返すコマンドだ。

これでとりあえず検査は出来るがパッと見どっちがどっちか分からないのでちゃんとコメントを残そう。

``` shell
## 分岐
if ${foo+:} false; then
    # fooが定義されている時
else
    # fooが定義されていない時
fi

## 定義されていない時のみ何かしたい時は `!` を使って否定する。
if ! ${foo+:} false; then
    # fooが定義されていない時
fi
```

以上
Xcode で突然ビルドできなくなったが、なんとか直した方法

#経緯

休み明けに個人的なお遊びプロジェクトをビルド実行したら謎のダイアログが表示された
しかし仕事用のプロジェクトはビルドできる
 
仕事に支障ないなら別にいいんじゃないか？　と思いつつも
このままだと仕事中に現実逃避できない！　と思い直した
なんとかしないと(\`･ω･´)

>The certificate used to sign "**APP_NAME**" has either expired or has been revoked. An updated certificate is required to sign and install the application.

#解決方法
>
1. ユーティリティ -> キーチェーンアクセス
- [この証明書は取り消されました] と書いてある証明書を削除する`

**※追記した解決方法もご覧ください**

#備考

証明書を更新しろks（Google翻訳）と書いてあったので
バツ印のあった証明書削除したり
Preferences から App ID 削除してみたり
コミットが原因かと思って遡ったりしたけど効果なし
stackoverflow にも解答なさげ
・・・詰んだ
***
状況開始から６時間
「証明書の更新とは一体・・・」って泣きながら並んでる証明書をクリックしてたら
１つだけ*`[この証明書は取り消されました]`*という証明書があり、
まさかと思いつつもそれを削除したらビルドが通った
クリックするまでバツ印が見えない親切設計

凸(´･ω･\`)凸＜Oh Year~

時間返せ


#追記 20160510

また同じ問題が発生しましたが、今度は**キーチェーンアクセスに登録してある証明書を全て削除して問題解決**させました

***

問題が再発したので、上に書いた手順を試したけど効果なし
うーん、と思い他の証明書を見たら
`この証明書は不明な機関によって署名されています`
という不穏分子があったのでそれも削除してみたら、
今度は違うダイアログが出るようになってしまった↓

>**The executable was signed with invalid entitlements**
>The entitlements specified in your application's Code Signing Entitlements file do not match those spcified in your provisioning profile. (0xE8008016)

(´･ω･\`)まずい・・・

そこから悪戦苦闘し、もう証明書全部削除しよう！
とヤケクソを決行した後、Xcode でビルドしたら
**証明書を選ぶダイアログが表示**され、それっぽい選択肢を選んだら
無事実機にアプリインストールできました

***

キーチェーンストアを見ると、証明書が勝手に追加されてたので
やっぱ証明書期限切れだったのかな
と思ったけど、期限切れは全て確認したし証明書を入れる手順もすでに試したはず・・・
(´･ω･\`)もう Xcode だけでいいんじゃないか ｵﾚﾅﾝｶﾄﾞｰｾ

***

また、アプリインスコ成功後に `project.pbxpoj` ファイルが編集済みになっていた
でもロールバックしてもちゃんとアプリはインスコできるようになっていた
(´･ω･\`)だったら勝手に変えないで


#追記 20160804
しばらくしてまた問題が発生
・・・もう削除できる証明書ない気がするんだが？(´･ω･\`)
と思ってたら、
コメント欄の @kameike さんの方法ですんなりいけました
ありがとうございます

>**Xcode -> Preference -> Account -> ViewDetails -> Download All**
で解決しました。
>
>恐らくMacをまたいで開発してて証明の権限の管理をちゃんとしていないとおこる問題ですっ
http://stackoverflow.com/questions/36689116/certificate-has-either-expired-or-has-been-revoked

もう上の方の俺の文章いらないな！(´･ω･\`)

***

最初の頃に Download All は一度試した気はするのですが
その時は全然解決できませんでした
自分の Xcode には AppleId が複数登録されてるので
関係ないアカウントで実行していたかもしれないですね
クソですね

これで最後の追記となることを祈ります ₍₍(ง˘ω˘)ว⁾⁾
弁当とブリトーに見る、メンテナンスのし易い設計

(注：弁当とブリトーのメタファーは、Twitter の Israel Ferrer さんが提唱しているものです。)

## 弁当、ブリトー。それらの概要

弁当と言えば、箱のなかに様々なおかずがつめ込まれた日本の伝統的な携行食です。そしてブリトーと言えば、トルティーヤと呼ばれる薄い小麦粉の生地の中に、様々なおかずがつめ込まれたメキシコの伝統的な料理です。どちらも、小さな箱かトルティーヤかの違いはあるものの、それらの中に様々なおかずがつめ込まれたものであることには変わりありませんが、そのおかずのつめ込まれ方には明確な違いがあります。

## 弁当、ブリトー。それらの違い

弁当には仕切りがあります。この仕切りの中におかずを詰め込んでいくことで弁当が完成しますが、この仕切りは時に自由に配置することができ、好みのおかずのために場所を広くとることができます。そして何より、仕切りがあることで異なるおかず同士味が混ざり合うことはありません。

一方、ブリトーのおかずは混ぜることが前提となります。豚ひき肉、トマト、レタス、米、サワークリーム、パクチー等を混ぜたものをトルティーヤで巻くため、例えば、パクチーが嫌いな人にとってははじめからパクチーが入っていないものを選択する以外にパクチーを抜く手立てがありません。

## 弁当とブリトーに見る、メンテナンスのし易い設計とは

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">Use Fragments at your risk... They use the tasty Burrito pattern, but that means you can&#39;t remove an ingredient unless you make another one&#127791;</p>&mdash; Israel Ferrer (@rallat) <a href="https://twitter.com/rallat/status/676800521924050944">2015年12月15日</a></blockquote>

つまり、メンテナンスのし易い設計とは、ブリトーのようにパクチーだけを抜く為に別のブリトーを作らなければならない設計ではなく、弁当のように、他のおかずに影響なくおかずを好きに組み替えられる仕切りを持った設計のことを指します。

よりプログラミングに近い言葉で言えば、問題のある箇所を修正したらそれに引きずられて全体が崩壊したり、ある箇所にコードを追加したら全体に影響を与えてしまう設計のことをブリトーのような設計と言い、問題のある箇所を修正したりある箇所にコードを追加しても他の箇所が壊れない設計を弁当のような設計と言います。

## おいしい弁当を作ろう

ではどのようにして弁当のような設計を作ればよいでしょうか。
今日では様々な方法論があります。

Qiita にも沢山の投稿がありますので、何か困ったときに読んでみると良いでしょう。

1. [新人プログラマに知ってもらいたいメソッドを読みやすく維持するいくつかの原則](http://qiita.com/hirokidaichi/items/c9a76191216f3cc6c4b2)
2. [新人プログラマに知っておいてもらいたい人類がオブジェクト指向を手に入れるまでの軌跡](http://qiita.com/hirokidaichi/items/591ad96ab12938878fe1)
3. [何かのときにすっと出したい、プログラミングに関する法則・原則一覧](http://qiita.com/hirokidaichi/items/d6c473d8011bd9330e63)

## 参考

1. http://fragmentedpodcast.com/2016/01/
2. https://twitter.com/rallat/status/676800521924050944
3. https://github.com/rallat/effectiveandroid

## 最後に

私はパクチーが大嫌いなのでブリトーにはパクチーを絶対に入れませんが、それでもブリトーは美味しいと思います。
私個人としてはパクチーは、カメムシ草という別名もあるように、カメムシの臭いがするので食べられません。外国の方はパクチーの味を石鹸の味と喩えるようです。いずれにしても食べたくはありませんね。
mitmproxy 画面でのコピペコマンドメモ

[モバイルアプリ開発者のための mitmproxy 入門](http://qiita.com/hkurokawa/items/9034274cc1b9e1405c68)

この記事を参考にmitmproxyをごちょごちょしてて、コピペしてcurlコマンド使いたいのにコピペできなくていろいろググる。macはこれおしながら選択。

**Fn+Option**
DataTablesのいきなりソートを防ぐには？

ソート機能は便利だけど起動時にいきなりソートされてしまうのは困るとき次のように、

```coffeescript:foo.js.coffee
$(".datatable").DataTable
  order: []
```

起動時のソート対象を空にしたところ、いきなりソートを防ぐことができました。
Rspecでダウンロードされたかテストする方法

viewに以下のようにsend_fileでファイルをダウンロードした時は、Rspecでは`content_type`を使うと良いらしい。


```rb:views
send_file(t.path, type: 'application/zip', dispositon: 'attachment', filename: "hoge.zip")
```

```rb:download_spec.rb
RSpec.describe 'ダウンロードを確認する', type: :request, js: true do
  describe 'ダウンロード' do
    context '正常の場合' do
      it 'ダウンロードできる' do
        visit admin_courses_path
        click_button "ダウンロード"
        expect(page.response_headers['Content-Disposition']).to include("hoge.zip")
        expect(page.response_headers['Content-Type']).to eq("application/zip")
      end
    end
  end
end
```
DataTables の mData がないエラーへの暫定的な対処法

とりあえずいろんなテーブルに適用させようと、次のように書いたところ thead タグがないテーブルでは mData がないというエラーが出てしまいました。

```coffeescript:foo.js.coffee
$("table").DataTable()
```

そこで、次のように thead を持つテーブルだけに絞るとエラーを回避できました。

```coffeescript:foo.js.coffee
$("table:has(thead)").DataTable()
```
Ubuntu on Winodws の再セットアップ方法

# はじめに
この機能はプレビュー版で完全な動作は保証されていません。今後もこの方法が使えるかはわかりません。
当方はいかなる責任を負えないことをあらかじめ了承ください。

# 手順
1. 管理者権限でコマンドプロンプトを起動します
2. 次のコマンドを実行します　`rmdir /s /q %LocalAppData%\Lxss`
3. エラーを吐くかもしれませんが無視してもう一度同じコマンドを実行します
4. さらに次のコマンドを実行します`reg delete /f HKCU\Software\Microsoft\Windows\CurrentVersion\Lxss`
5. コンピュータを再起動します。
6. Bash.exeを起動すると初期セットアップ画面がでます。
d3.jsで定期的にデータセットを読みこんでsvgを再表示する

備忘となります。

remove処理を入れないと、ずんずんずんずん図形が黒ずんでいきます。。

```html
<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>Line Chart</title>
    <style>
        svg {
            width: 380px;
            height: 240px;
            border: 1px solid skyblue;
        }
        .line {
            fill: none;
            stroke: black;
        }
        .axis text {
            font-family: sans-serif;
            font-size: 11px;
        }
        .axis path,
        .alis line {
            fill: none;
            stroke: black;
        }
        .axis_x line {
            fill: none;
            stroke: black;
        }
    </style>
    <script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
</head>

<body>
    <h1>Line Chart</h1>
    <svg id="myGraph"></svg>
    <script src="js/line_chart.js"></script>
</body>

</html>
```

```line_chart.js
var svgWidth = 320;
var svgHeight = 240;
var offsetX = 30;
var offsetY = 20;
var scale = 2.0;
var dataSet1 = [10, 47, 65, 8, 64, 99, 75, 22, 63, 80];
var dataSet2 = [10, 48, 67, 18, 74, 20, 80, 22, 63, 80];
var margin = svgWidth / (dataSet1.length - 1);

var t = 0;
var x = 0;
var yScale = d3.scale.linear()
    .domain([0, 100])
    .range([scale * 100, 0])

d3.select("#myGraph")
    .append("g")
    .attr("class", "axis")
    .attr("transform", "translate(" + offsetX + ", " + offsetY + ")")
    .call(
        d3.svg.axis()
        .scale(yScale)
        .orient("left")
    )

d3.select("#myGraph")
    .append("rect")
    .attr("class", "axis_x")
    .attr("width", svgWidth)
    .attr("height", 1)
    .attr("transform", "translate(" + offsetX + ", " + (svgHeight - offsetY - 0.5) + ")")

function draw(dataSet) {
    var line = d3.svg.line()
        .x(function(d, i) {
            return offsetX + i * margin;
        })
        .y(function(d, i) {
            return svgHeight - (d * scale) - offsetY;
        })
        .interpolate("basis")

    var lineElements = d3.selectAll("#myGraph")
        .append("path")
        .attr("class", "line")
        .attr("d", line(dataSet))
}

d3.timer(function() {
    if (t > 1.0) {
        console.log(t);
        t = 0
        x += 1;

        if (x % 2 == 0) {
            d3.selectAll("path").remove();
            draw(dataSet1)

        } else {
            d3.selectAll("path").remove();
            draw(dataSet2)
        }
    }

    t += 0.02;
```

下記のような図が交互に繰り返され続けます。おー。

![Screenshot from 2016-04-25 16-19-16.png](https://qiita-image-store.s3.amazonaws.com/0/49547/853f1f93-5ac8-c6c5-5a47-26317c2d9791.png)![Screenshot from 2016-04-25 16-20-58.png](https://qiita-image-store.s3.amazonaws.com/0/49547/496e8f70-4419-d78c-9d5f-05624080d58c.png)
MeCabをMacOSに入れて使ってみる

# はじめに
自然言語処理で近年よく使われているツールとして「MeCab（[http://taku910.github.io/mecab/](http://taku910.github.io/mecab/)）」が挙げられます。
そのMeCabをMacOSに入れて動作させるところまでの流れを説明します。

今回はMacportsやHOME BREWなどは利用せずやっていきたいと思います。


# MeCabをダウンロード
まず、[公式サイト](http://taku910.github.io/mecab/)の「ダウンロード」から、
MeCab本体とMeCab用の辞書をダウンロードして下さい。
![スクリーンショット 2016-04-25 16.01.29.png](https://qiita-image-store.s3.amazonaws.com/0/63338/234e8563-9d3a-1e7a-c2cb-2c36c4ddaeb7.png)


# インストール
ダウンロードした、**MeCab本体**（おそらくmecab-0.996）と、**MeCabの辞書**（おそらくmecab-ipadic-2.7.0-20070801）をインストールしていきます。

## MeCab本体のインストール
まずは、**mecab-0.996**（MeCabの本体）を解凍し、
ターミナルの**cdコマンド**でその解凍したフォルダに入ってください。
そして以下のコマンドを順に叩いていきます。

```lang:Terminal
$ ./configure
$ make
$ make check
$ sudo make install
```

基本的にmake中に出たwarningは無視します。
インストールが終わったら、今度はMeCab用の辞書をインストールします。


## MeCab辞書のインストール
まずは、**mecab-ipadic-2.7.0-20070801**（MeCabの辞書）を解凍し、
ターミナルの**cdコマンド**でその解凍したフォルダに入ってください。
そして以下のコマンドを順に叩いていきます。

ただし、辞書はデフォルトでは文字コードが**EUC**でインストールされるので、
扱いやすいようにUTF-8に変更してインストールさせましょう。

```lang:Terminal
$ ./configure --with-charset=utf8
$ make
$ sudo make install
```

以上でインストールは終了です。



# とりあえず使ってみる
```lang:Terminal
$ mecab
すもももももももものうちだけど、そんなことはどうでもいいよね？
すもも	名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も	助詞,係助詞,*,*,*,*,も,モ,モ
もも	名詞,一般,*,*,*,*,もも,モモ,モモ
も	助詞,係助詞,*,*,*,*,も,モ,モ
もも	名詞,一般,*,*,*,*,もも,モモ,モモ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
うち	名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
だ	助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ
けど	助詞,接続助詞,*,*,*,*,けど,ケド,ケド
、	記号,読点,*,*,*,*,、,、,、
そんな	連体詞,*,*,*,*,*,そんな,ソンナ,ソンナ
こと	名詞,非自立,一般,*,*,*,こと,コト,コト
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
どう	副詞,助詞類接続,*,*,*,*,どう,ドウ,ドー
でも	助詞,副助詞,*,*,*,*,でも,デモ,デモ
いい	形容詞,自立,*,*,形容詞・イイ,基本形,いい,イイ,イイ
よ	助詞,終助詞,*,*,*,*,よ,ヨ,ヨ
ね	助詞,終助詞,*,*,*,*,ね,ネ,ネ
？	記号,一般,*,*,*,*,？,？,？
```

![スクリーンショット 2016-04-25 16.15.06.png](https://qiita-image-store.s3.amazonaws.com/0/63338/46649da0-63de-849d-042b-cc0091bc9dcf.png)


# あわせてどうぞ
・[MeCabでオリジナル辞書を作成する](http://qiita.com/nnahito/items/16c8e214d71fbc23ed8e)
Mac OS Xのアップデート後にEclipseが起動しなくなった時の対応

#経緯
Mac OS X El Capitanにアップデート後にEclipseを起動しようとしたら「"Eclipse.app" を開くには、以前の Java SE 6 ランタイムをインストールする必要があります。」というダイアログが出て起動できませんでした。
<img width="532" alt="スクリーンショット 2016-04-25 14.04.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/6380/6e26c828-ae86-b860-6aed-45e79c9fb978.png">
いや自分、Java SE 8インストール済みなんすけど…

```
$ java -version
java version "1.8.0_31"
Java(TM) SE Runtime Environment (build 1.8.0_31-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.31-b07, mixed mode)
$ /usr/libexec/java_home -V
Matching Java Virtual Machines (1):
    1.8.0_31, x86_64:    "Java SE 8"    /Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home

/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home
```

Javaの[FAQページ](https://www.java.com/ja/download/faq/yosemite_java.xml)によると、このダイアログが出る原因はApple側の問題とか

>**原因**
>
>これは、通常アプリケーションがAppleによって提供されたレガシーのJava 6を必要とするためです。この問題の解決策については、http://support.apple.com/kb/DL1572 を参照してください。
>

…で、リンク先のAppleのサポートページ見ると「Java SE 6入れてね（はぁと」としか書いていませんでした。

<img width="754" alt="スクリーンショット 2016-04-25 14.36.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/6380/2771a41e-9df9-7c47-5e72-31843ad2cd64.png">

さすがApple！

#対応

普通に考えて新しいバージョンのJava SEが入っていれば問題ないはずなので、わざわざJava SE 6をインストールしなくても起動できるようにする方法を書いておきます。

##JDKのInfo.plistに設定を追記する
JDKのインストールフォルダにある設定ファイルの内容を編集します。
今回の環境では以下の場所に置いてありました。

```
/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Info.plist
```
どうやらJVMの動作設定がコマンドラインのみになっていたことが原因だったようです。

```Info.plist
    <key>JVMCapabilities</key>
        <array>
            <string>CommandLine</string>
        </array>
```

Info.plistのJVMCapabilitiesに必要な設定を追記します。

```diff:Info.plist
    <key>JVMCapabilities</key>
        <array>
+           <string>JNI</string>
+           <string>BundledApp</string>
+           <string>WebStart</string>
+           <string>Applets</string>
            <string>CommandLine</string>
        </array>
```

設定保存後、一旦ログアウトしてログインしなおせばダイアログが出なくなり、Eclipseを起動できるようになります。

#参考
[YosemiteまたはEl Capitanで最新のJavaバージョンをインストールした後でもJavaをインストールするように求められるのはなぜですか。](https://www.java.com/ja/download/faq/yosemite_java.xml)
[Eclipse Kepler for OS X Mavericks request Java SE 6 - Stack Overflow](http://stackoverflow.com/questions/19563766/eclipse-kepler-for-os-x-mavericks-request-java-se-6/19594116)
Redisにexpireを設定するタイミングに注意


Redisのキーにexpireを設定して分散環境でタイムアウト処理を行うときに以下のようなコードにしていると、ごく稀にタイムアウトしないバグが発生します。

```ruby
require 'redis'

ttl = 60 # 1分間でexpireさせる

redis = Redis.new
redis.set('key', 'val')
redis.expire('key', ttl)
```

ここでsetとexpireの間でプロセスが終了してしまうと、expireが設定されないキーが残ってしまいます。
その結果以下のようなコードが無限ループに陥ってしまいます。

```ruby
while redis.get('key').present? ; end
```

これを防止するためには、setとexpireをアトミックな処理とする必要があります。

```ruby
redis.multi do
  redis.set('key', 'val')
  redis.expire('key', ttl)
end
```
three.jsでテクスチャ画像をロードする

[three.js](http://threejs.org/)でテクスチャ画像をロードするサンプルコードです。

REVISION:76時点では、`THREE.ImageUtils.loadTexture(url)`より`TextureLoader`を使うことが推奨されているので、こちらを使ったサンプルです。

```js
const texLoader = new THREE.TextureLoader();
texLoader.crossOrigin = '*';
texLoader.load('http://server/path/to/image.jpg', 
  texture => { // onLoad
    const geometry = new THREE.BoxGeometry(1, 1, 1);
    const material = new MeshBasicMaterial({ map: texture });
    const cube = new THREE.Mesh(geometry, material);
    scene.add(cube);
    ...
  },
  xhr => { // onProgress
    ...
  },
  xhr => { // onError
    ...
  }
);
```

`SecurityError: DOM Exception 18`のようなクロスドメイン系のエラーが出る場合は、`texLoader.crossOrigin = '*';`を忘れずに付けることで解消できます。
Sublime Text 3 による MQL 開発環境の構築

# はじめに
FX 業者などで利用されている [Meta Trader 4 (MT4)](http://www.metatrader4.com) で独自指標や自動取引プログラムの作成に利用されるプログラミング言語 [MQL](https://www.mql4.com) の開発には MT4 標準の MetaEditor というエディタが用いられる事が多い。

ただし、 MetaEditor は他の高機能エディタと比較すると、あまり使い勝手がよいエディタではないので、今回は高機能エディタの一つである [Sublime Text 3](http://www.sublimetext.com) で開発を行うための設定方法をまとめた。

筆者の環境は以下の通り。

| 項目 | 状況 |
|:----|:-------------------------------------------------------------------------|
| PC  | MacBook Pro Retina 13-inch, Early 2015                                   |
| OS  | Mac OSX 10.10.5                                                          |
| IME | Google IME                                                               |
| MT4 | [XM](http://www.xmtrading.com/jp/metatrader-mac) で配布している Mac 用 MT4 |

以下、 MT4 は導入済みの前提で進める。

# Sublime Text 3 のインストール
[Sublime Text 公式HP](http://www.sublimetext.com) から Sublime Text 3 のインストーラをダウンロードし、ダウンロードした dmg ファイルをダブルクリック。`Sublime Text` を `Applications` ドラッグアンドドロップしてインストール完了。

起動時にセキュリティ周りの問題が起きた際は、`システム環境設定 -> セキュリティとプライバシー -> ダウンロードしたアプリケーションの実行許可` の部分を `すべてのアプリケーションを許可` に変更する。

# Google IME 使用時の Tab キーによる補完
デフォルトの設定のままだと、日本語入力時の Tab 補完が正常に動作しないので、キーバインドの設定を変更する必要がある。以下のページを参照。

[sublime text3で日本語入力変換が機能しない場合の解消３ステップ](http://qiita.com/akippiko/items/1382faa29833379621f6)

# Sublime Text 3 の基本設定
以下のページによくまとまっているので参考にして設定する。

[SublimeText 3の基本設定](http://qiita.com/lunatea/items/7101572e159f98369bc9)

## 必要なパッケージのインストールとダウンロード
動作させるのに wine が必要になるので Homebrew を利用してインストールする。

```
$ brew install wine	
```

以下のページの `Download ZIP` をクリックし、パッケージをダウンロード。解凍しておく。

* [mql4compiler](https://github.com/IlanFrumer/mql4compiler)
* [mql5compiler](https://github.com/IlanFrumer/mql5compiler)
* [currencysecrets](https://github.com/currencysecrets/mql4)

# パッケージの登録
Sublime Text 3 を起動し、`Sublime Text -> Preferences -> Browse Packages...` を選択。 Packages 以下に先ほど解凍したフォルダをコピーする。その後 Sublime Text 3 を再起動。

# 動作確認
`hello.mq4` というファイルを作成し、以下の内容を記述する。

```hello.mq4
int init()
{
  Print("Hello World");
}
```

Sublime Text 3 で上記タブを選択中に `Ctrl + Alt + m` を入力すると、`hello.mq4` がコンパイルされ `hello.ex4` が `hello.mq4` のあるディレクトリに出力される。コンパイル時のエラーや警告などのログはエディタ下部に出力される。

Finder から`アプリケーション -> XMTrading.app` を選択し、右クリック。`パッケージの内容を表示` を選択。 `drive_c/Program Files/XMTrading MT4/MQL4/Scripts` 以下に先ほど作成した `hello.ex4` をコピーする。

MT4 の画面から、左下の `Navigator` から `Scripts` を右クリックし、`Refresh` を選択。先ほどコピーした `hello.ex4` が `Navigator` で確認できるようになるので、右クリックし、`Execute on Chart` を選択。

画面下部の Experts タブを選択し、`Message` に `Hello World` が出力されればOK。

# 参考文献
* [Sublime Text 公式HP](http://www.sublimetext.com)
* [Meta Trader 4](http://www.metatrader4.com) 
* [XM](http://www.xmtrading.com/jp/metatrader-mac)
* [MQL 4](https://www.mql4.com)
* [MQL 5](https://www.mql5.com)
* [mql4compiler](https://github.com/IlanFrumer/mql4compiler)
* [mql5compiler](https://github.com/IlanFrumer/mql5compiler)
* [currencysecrets](https://github.com/currencysecrets/mql4)
* [メタトレーダー４ MQL言語リファレンス日本語翻訳マニュアル ver1.1](http://www.metasys-seeker.net/MQL4_Reference_ver1/MQL4_Reference_Contents.html)
* [sublime text3で日本語入力変換が機能しない場合の解消３ステップ](http://qiita.com/akippiko/items/1382faa29833379621f6)
IJCAI2016読みたい論文


* Multi-Modal Bayesian Embeddings for Learning Social Knowledge Graphs
* From One Point to A Manifold: Knowledge Graph Embedding For Precise Link Prediction
* Knowledge Representation Learning with Entities, Attributes and Relations
* Sparse Word Embeddings Using L1 Regularized Online Learning
* Bag-of-Embeddings for Text Classification
* Exploring the Context of Locations for Personalized Location Recommendations
* Text-enhanced Representation Learning for Knowledge Graph
* Representation Learning of Knowledge Graphs with Hierarchical Types
* Querying Data Graphs with Arithmetical Regular Expressions
* Learning First-Order Logic Embeddings via Graph Rewriting
* Predict Anchor Links across Social Networks via an Embedding Approach
* Aligning Users Across Social Networks Using Network Embedding
* Grounding Topic Models with Knowledge Bases
* KOGNAC: Efficient Encoding of Large Knowledge Graphs
* Max-Margin DeepWalk: Discriminative Learning of Network Representation
Windows Server Container　コンテナ共有フォルダ作成

コンテナホストとコンテナ間でファイルを共有できます。

Powershellより以下を実行。

Add-ContainerSharedFolder -ContainerName Mycont01 -SourcePath c:\data_source -DestinationPath c:\shared_data

Mycont01：任意のコンテナ名を指定
c:\data_source：コンテナホストのフォルダ名
c:\shared_data：コンテナのフォルダ名

参考URL：https://msdn.microsoft.com/ja-jp/virtualization/windowscontainers/management/manage_data
Meta Trader 4 の基本的な使い方

# はじめに
FX 業者で利用されている [Meta Trader 4 (MT4)](http://www.metatrader4.com) の基本的な使い方を確認する。[公式](http://www.metatrader4.com)配布されているもの以外に、各業者で接続先などが微妙にカスタマイズされているものがあるが、基本的な部分に違いはない。

筆者の環境は以下の通り。

|項目 | 環境                                                                      |
|:----|:-------------------------------------------------------------------------|
| PC  | MacBook Pro Retina 13-inch, Early 2015                                   |
| OS  | Mac OSX 10.10.5                                                          |
| MT4 | [XM](http://www.xmtrading.com/jp/metatrader-mac) で配布している Mac 用 MT4 |

# 起動までの流れ
今回は業者に [XM](http://www.xmtrading.com/jp/) を利用する。[MT4 のダウンロードページ](http://www.xmtrading.com/jp/metatrader-mac) から Mac 用クライアント (dmg 形式) をダウンロードしてくる。

ダウンロード後 dmg ファイルをダブルクリックし、アプリケーションフォルダにアプリケーション本体をコピーする。アプリケーション内にコピーしたクライアントをダブルクリックして MT4 を起動。ログイン画面が出てくるので、業者で作成したアカウント情報を入力する。

# 画面構成
![basic_01_add.tiff](https://qiita-image-store.s3.amazonaws.com/0/58390/f6d05a8c-47a6-956f-f2ab-d28cde06ab44.tiff)

 1. 気配値
   * 取引可能な商品のレート一覧、Tick チャートの表示。
   * 売値が Bid、買値が Ask。Bid と Ask の差がスプレッド（手数料）。
 2. ナビゲーター
   * アカウント、各種指標、自動取引のアルゴリズムなどの選択に利用。
 3. チャート
   * チャートを表示するためのメインウィンドウ。
 4. ターミナル
   * 現在のポジション、取引履歴、各種通知やニュースの表示。

なお、Mac 版の場合一部のテキストで文字化けが起こったので、言語設定は英語に設定した。ウィンドウ上部のメニューから、`表示 -> 言語 -> English` を選べば変更できる。

# 取引の流れ
基本的に以下の流れで行う。

1. 商品の選択・チャートの表示
3. 新規注文
4. 決済

## 商品の選択・チャートの表示
気配値が表示されている部分で、取引したい商品を右クリック。`Chart Window` をクリックすれば、取引したい商品のチャートが表示される。

例として、今回は `USDJPY` を選択（米ドル ⇔ 日本円）。

### ロウソク足表示
ロウソク足表示にするには、対象のチャートを選択した状態で、画面上部のメニューから、`Charts -> CandleSticks` を選択すると、ロウソク足表示になる。

### 時間軸の変更
対象のチャートを選択した状態で、画面上部のメニューから `Charts -> Timeframes -> (任意の時間軸)` を選択する。選択可能な時間軸は次の通り。

| 略記  | 時間  |
|:-----|------:|
| M1   | 1 分間 |
| M5   | 5 分間 |
| M15  | 15 分間 |
| M30  | 30 分間 |
| H1   | 1 時間 |
| H4   | 4 時間 |
| D1   | 1 日間 |
| W1   | 1 週間 |
| MN   | 1ヶ月間 |

## 新規注文
以下のいずれかの方法で、取引画面を表示する。

* 気配値が表示されている部分で右クリックし `New Order` をクリック。
* 対象の商品のチャート上で右クリックし、`Trading -> New Order` をクリック。

取引画面で以下の項目を入力する。

* Symbol: 取引商品。対象商品がデフォルトで選択されているはず。
* Volume: 取引量。
* Stop Loss: 現在のレートが Stop Loss まで下がると、自動的に損切りが行われる。
* Take Profit: 現在のレートが Take Profit まで上がると、自動的に利益確定が行われる。
* Comment: 注文に記述できるコメント欄。

* Type: 取引の種類。以下の項目から選択できる。
  * Market Execution : 成行き注文
  * Pending Order: 指値/逆指値注文
    * Type:
      * Buy Limit:
         * ASK 価格が at price に到達したときに購入。at price は現在価格よりも低く設定しなければならない。
      * Sell Limit: 
         * ASK 価格が at price に到達したときに売却。at price は現在価格よりも高く設定しなければならない。
      * Buy Stop:
         * ASK 価格が at price に到達したときに購入。at price は現在価格よりも高く設定しなければならない。
      * Sell Stop:
         * ASK 価格が at price に到達したときに売却。at price は現在価格よりも低く設定しなければならない。

## 決済
決済は画面下部のターミナルから行います。

![決済画面.tiff](https://qiita-image-store.s3.amazonaws.com/0/58390/72918366-533b-3e27-8b77-05dacf4b08dd.tiff)

対象のポジション(この図 Order: 263245 と表示されている行)を選択し、`Close Order` を選択すると決済されます。指値/逆指値注文の場合もこの流れで成行き決済が可能です。

# さいごに
ここまでで、チャートの確認、新規注文、決済までの一連の流れが可能になった。
次はカスタム指標・自動取引機能作成のために必要な機能を確認していく。

# 参考文献
[MetaTrader4 公式](http://www.metatrader4.com)
[XM](http://www.xmtrading.com/jp/)
Picasso v2.5.2で画像表示時間がとても遅い時の対処法


## Picassoとは
https://github.com/square/picasso

Androidの画像ダウンロードとかキャッシュとかを良い感じにしてくれるライブラリです。
この辺り何も考えずに実装出来るのはとても助かりますね。

## 画像表示時間がとても遅い端末がある

ただ、詳しい原因は把握できていないですが、古い端末で画像のdecodeにかなり時間がかかってしまう場合がありました。
速くて6s、遅くて13sもの時間がかかる場合がありました。

```
D/Picasso: Main        created      [R0] Request{http://example.com/example.png}
D/Picasso: Hunter      executing    [R0]+7ms 
D/Picasso: Dispatcher  enqueued     [R0]+5ms 
D/Picasso: Hunter      decoded      [R0]+6s 
D/Picasso: Dispatcher  batched      [R0]+6s for completion
D/Picasso: Main        completed    [R0]+6s from NETWORK
D/Picasso: Dispatcher  delivered    [R0]+6s
```

## v2.5.2ではなくv2.6.0のSnapshotを使う

現在の最新バージョンであるv2.5.2ではなく、Snapshotとして上がっているv2.6.0を使うとこの問題は解消されます。

```gradle
dependencies {
    compile('com.squareup.picasso:picasso:2.6.0-20160329.165726-8')
}
```

## 原因は？
https://github.com/square/picasso/compare/picasso-parent-2.5.2...master

上記のdiffのどこかにあるとは思いますが、画像周り詳しくなく追えていない状態です。。

https://github.com/square/picasso/compare/picasso-parent-2.5.2...master#diff-e5188a02d09a90a87e68c1f7a23acf96R131

この辺り、Lollipop以降か否かで場合分けしている箇所が怪しそうだなーくらいです。
gitのremote urlを変更する(レポジトリ移行時)

Githubのプライベートレポジトリを移行した時に行ったクライアントの設定です。

## 前提
以下の項目が完了していること。
- Githubでのプライベートレポジトリ移行
- 自身のPCからGitHubへのssh接続

## 手順
1 現在のリモートURLを確認する

```
git remote -v

=>
origin	git@github.com:hoge/current-repo.git (fetch)
origin	git@github.com:hoge/current-repo.git (push)
```

2 新しいリモートURLに変更する

```
git remote set-url origin {new url}
```

3 変更したリモートURLを確認する

```
git remote -v

=>
origin	git@github.com:hoge/new-repo.git (fetch)
origin	git@github.com:hoge/new-repo.git (push)
```

## はまったところ
{new url}にsshではなくhttpsのpathを指定してたため

```
remote: Repository not found.
```

と怒られた。

## 参考
レポジトリの移行
[GitHubのリポジトリを別のOwnerに引き渡す](http://qiita.com/do7be/items/fa845240bc58b2153a44)

本家
[https://help.github.com/articles/changing-a-remote-s-url/](https://help.github.com/articles/changing-a-remote-s-url/)
tcsh: No entry for terminal type "screen-256color"

tmux環境下で、sshしたときに

```bash
ssh *****

tcsh: No entry for terminal type "screen-256color"
tcsh: using dumb terminal settings.
```

みたいなエラーが出てきて、とことん表示が崩れて面倒だったので、直し方メモ。

```bash:.bashrc
alias ssh='TERM=xterm ssh'
```

これでもう一度読み込みなおしてあげたら、問題なくsshできました。
Play 2.5に入門　④(ぽえむ)プロトタイピングするアプリ:OtaCal

# そろそろ Play Scala
Play 2.5に入門シリーズ。前回まででPlay2.5 Javaの方は、データベース接続込みのアプリ動作を一通りお試ししたので、そろそろ、ScalaでPlay2.5を始めていきたい。非同期周りとかに地雷が潜んでそうな予感。
その後に、PlayでのScalaコードとJavaコードの混在を試し始める予定。

# そろそろアプリのプロトタイピング
一人でちまちま入門していると飽きてくること間違いなしなので、近い将来に作りたいアプリのプロトタイプ作りを兼ねた作業としたい。githubでの皆さんがコミットしているコードを見つつ、どのあたりを作りこんでみるか、しばし考える。

## 元とするアプリ　: Anime RESTful API サーバー
Play Scalaでの実用的なコード例と解説のひとつに、
[放映中のアニメ作品の情報を提供するAnime RESTful API サーバー作りました](http://qiita.com/AKB428/items/64938febfd4dcf6ea698)がある。

こちら、アニメに関する情報集約サービスを提供しているAKB428さん@秋葉原IT戦略研究所の作で、[アニメ公式フォロワー数](http://akibalab.info/animefollower)にあるような情報が扱われている。

2014年春の場合:

![スクリーンショット 2016-04-25 13.58.38.png](https://qiita-image-store.s3.amazonaws.com/0/16455/5e5b0d60-1729-e1de-47a7-aa848433d16c.png)

*...[昨晩のネタ](http://j.mp/hamarimit1)に登場した、魔法科高校の優等生界隈は、ラブライブやハイキューにぶっちぎりで負けていたのか...*

PlayベースのRESTサーバーは、[以下のtwitterメディア](https://twitter.com/anime_follower)のバックエンドとして働いている模様。...ツイート数35万超。

![スクリーンショット 2016-04-25 14.05.24.png](https://qiita-image-store.s3.amazonaws.com/0/16455/57c408db-ca95-3847-c7c1-0ae0bd5fc7c0.png)


# プロトタイピングするアプリ:OtaCal
[我が道を行くAKB428さん](http://akb428.hatenablog.com/)のソースコードをfolkさせてもらうからには、近いネタで行ってみることとしたい。

参考にするのは、近時始まったヲタカル(otacul)の取り組み。こちら、現時点ではサンスポ.comの情報ページ企画としての位置づけなのだが、より幅広いオタクカルチャーのメディアとして発展させていく心意気がある模様。

![スクリーンショット 2016-04-25 14.13.39.png](https://qiita-image-store.s3.amazonaws.com/0/16455/0fd4a248-7487-59f0-84c0-17b15ea51e8b.png)

ということで、ヲタカルのコンテンツと、関連情報とをつなげる情報提供サーバーをREST　APIベースで試作することとしたい。いずれ作るつもりのサービスがカレンダー系なので、プロトタイプアプリの名称はOtaCalとする。

こちら、けっこうまじめに作り始めるので、成果の方は、本入門記事とは別に別途公開することとしたい。
乞、ご期待。

# Play2.5で、Anime RESTful API サーバーをコンパイルしてみる。
OtaCal元とするAnime RESTful API サーバーは、Play2.3系。ということで、まずは、Play2.5でコンパイルするとどうなるのか、試しておきたい。
まずは、project/plugins.sbtを2.5系としておく。

> // The Play plugin
> addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.5.2")


すると、(ORMの)Anormは、もう外部モジュールになったよ、と怒られる。

```shell-session
$ activator compile
[info] Loading project definition from /Users/Apple/play252/sora-playframework-scala/project
[info] Updating {file:/Users/Apple/play252/sora-playframework-scala/project/}sora-playframework-scala-build...
[info] Resolving org.fusesource.jansi#jansi;1.4 ...
[info] Done updating.
Anorm has been moved to an external module.
See https://playframework.com/documentation/2.4.x/Migration24 for details.
Project loading failed: (r)etry, (q)uit, (l)ast, or (i)gnore? i
[warn] Ignoring load failure: no project loaded.
[error] Not a valid command: compile (similar: completions)
[error] compile
[error]        ^
```

ということで、Play 2.5においては、前回お試ししたJavaのORMであるEbeansを使うか、ScalaのFRMであるSlickを使うかといったような決断が求められる模様。

#次回以降
DockerでPlay2.5を動作させ、AWSやGCPに公開する練習をしたい。
Kafka Managerをビルドする

# Scala用のビルドツールであるsbtをインストールする

Playフレームワークの要件によりJava8以降が必要である。

```shell-session
[root@kafka-manager ~]# apt-get update
[root@kafka-manager ~]# apt-get install openjdk-8-jdk
```

```shell-session
[root@kafka-manager ~]# java -version
openjdk version "1.8.0_91"
OpenJDK Runtime Environment (build 1.8.0_91-8u91-b14-0ubuntu4~14.04-b14)
OpenJDK 64-Bit Server VM (build 25.91-b14, mixed mode)
```

デフォルトのランタイムがOpenJDK8でない場合、

```shell-session
[root@kafka-manager ~]# update-alternatives --config java
There are 2 choices for the alternative java (providing /usr/bin/java).

  Selection    Path                                            Priority   Status
------------------------------------------------------------
  0            /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java   1071      auto mode
  1            /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java   1071      manual mode
* 2            /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java   1069      manual mode

Press enter to keep the current choice[*], or type selection number:
```

でOpenJDK8を選択する。

## Ubuntuの場合
```shell-session
[root@kafka-manager ~]# apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 642AC823
```

Proxy環境下では以下のコマンドを実行する。

```shell-session
[root@kafka-manager ~]# apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --keyserver-option http-proxy=http://proxy-server:proxy-port --recv 642AC823
```


sbtをインストールする。

```shell-session
[root@kafka-manager ~]# apt-get install sbt
```

## RedHat/CentOSの場合

```shell-session
[root@kafka-manager ~]# curl https://bintray.com/sbt/rpm/rpm | sudo tee /etc/yum.repos.d/bintray-sbt-rpm.repo
[root@kafka-manager ~]# yum install sbt
```

# Kafka Managerをダウンロードする

```shell-session
[root@kafka-manager ~]# cd ~/
[root@kafka-manager ~]# KAFKA_MANAGER_VERSION=1.3.3.4
[root@kafka-manager ~]# wget https://github.com/yahoo/kafka-manager/archive/${KAFKA_MANAGER_VERSION}.tar.gz
[root@kafka-manager ~]# tar zxvf ${KAFKA_MANAGER_VERSION}.tar.gz
[root@kafka-manager ~]# cd kafka-manager-${KAFKA_MANAGER_VERSION}/
```

# sbtによりビルドする

```shell-session
[root@kafka-manager ~]# ./sbt clean dist
```

バイナリを解凍する。

```shell-session
[root@kafka-manager ~]# cp target/universal/kafka-manager-${KAFKA_MANAGER_VERSION}.zip ~/
[root@kafka-manager ~]# cd ~/
[root@kafka-manager ~]# mv kafka-manager-${KAFKA_MANAGER_VERSION} kafka-manager-${KAFKA_MANAGER_VERSION}-src
[root@kafka-manager ~]# unzip kafka-manager-${KAFKA_MANAGER_VERSION}.zip
```

# Kafka Manager起動

Zookeeperがlocalhostで稼働してるなら以下のコマンドを実行すれば80番ポートで起動する。

```shell-session
[root@kafka-manager ~]# cd kafka-manager-${KAFKA_MANAGER_VERSION}
[root@kafka-manager ~]# bin/kafka-manager -Dkafka-manager.zkhosts="localhost:2181" -Dhttp.port=80 &
```
Robolectric の Illegal connection pointer 対策


結構詰まってしまったのでメモ。

## こんなエラー

バージョン `3.0` の場合

```java
java.lang.NullPointerException
org.robolectric.shadows.ShadowLooper.getMainLooper(ShadowLooper.java:70)
android.os.Looper.getMainLooper(Looper.java)
android.database.sqlite.SQLiteDatabase.isMainThread(SQLiteDatabase.java:391)
android.database.sqlite.SQLiteDatabase.getThreadDefaultConnectionFlags(SQLiteDatabase.java:381)
android.database.sqlite.SQLiteProgram.__constructor__(SQLiteProgram.java:58)
android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java)
android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java)
android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1467)
android.database.sqlite.SQLiteDatabase.insertOrThrow(SQLiteDatabase.java:1365)
```

バージョンを `3.1-rc1` ( 2016-04-25 現在の最新 ) に上げても…

```java
java.lang.IllegalStateException: Illegal connection pointer 1. Current pointers for thread Thread[pool-5-thread-1,5,main] []
org.robolectric.shadows.ShadowSQLiteConnection$Connections.execute(ShadowSQLiteConnection.java:467)
org.robolectric.shadows.ShadowSQLiteConnection$Connections.prepareStatement(ShadowSQLiteConnection.java:373)
org.robolectric.shadows.ShadowSQLiteConnection.nativePrepareStatement(ShadowSQLiteConnection.java:64)
android.database.sqlite.SQLiteConnection.nativePrepareStatement(SQLiteConnection.java)
android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:882)
android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:493)
android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
android.database.sqlite.SQLiteProgram.__constructor__(SQLiteProgram.java:58)
android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java)
android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java)
android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1467)
android.database.sqlite.SQLiteDatabase.insertOrThrow(SQLiteDatabase.java:1365)
```

(´・ω:;.:...

## 回避策

普通に SQLite を利用した場合は問題なかったので、
どうやら別なスレッドから参照するとダメらしい…ということで

```scala
import java.util.concurrent.Executor
import scala.concurrent.ExecutionContext
implicit lazy val executor: ExecutionContext = {
  ExecutionContext fromExecutor new Executor {
    override def execute(command: Runnable) = command.run()
  }
}
```

テスト中だけスレッドを生成しない ExecutionContext に切り替えてしまえば無事に動いてくれる。

やった！

## 参考（にならなかった）リンク

ちなみにこれらは全てうまくいかなかった情報です

* [Testing SQLite database in Robolectrie](http://stackoverflow.com/questions/7320820/testing-sqlite-database-in-robolectric/24578332#24578332)
* [Robolectric accessing database throws an error](http://stackoverflow.com/questions/30308776/robolectric-accessing-database-throws-an-error)
* [ShadowSQLiteConnection$Connections.execute fails while testing sqlite operations in different test case](https://github.com/robolectric/robolectric/issues/1890)
* [Unit test failing when using Ollie](https://github.com/robolectric/robolectric/issues/1882)
イベントハンドラで@(this)を使用する場合の注意


```example.coffee
class Hoge
  constructor: (message) ->
  	@message = message
  	$("form").on "submit" (event) ->
  		_fuga.call(@)
  
  _fuga = ->
  	alert @message
```

上記のコードは正しく動かない。
プライベートメソッド _fuga 中で @message を参照しようとしているが、undefined となる。

理由は、イベントハンドラではthisがイベント発生元のオブジェクトを指すようになっているのが原因。
それを回避するには、あらかじめ _this など別の変数に this を退避しておきイベントハンドラ内では _this を参照するように変更すれば良い。

CoffeeScriptではそのようなケースのショートカットとして => が用意されている。
前述のコードを書き直すと以下のとおりとなる。

```example2.coffee
class Hoge
  constructor: (message) ->
  	@message = message
  	$("form").on "submit" (event) =>
  		_fuga.call(@)
  
  _fuga = ->
  	alert @message
```

# 参考

[CoffeeScriptでjQuery使うときのメモ | webOpixel](http://www.webopixel.net/javascript/660.html)