OmniAICreator/Qiita-1.07M huggingface dataset:
第1話 兄弟ゲンカ

**兄弟ゲンカは、いかん！**

太郎と次郎のケンカをコード化しました。（謎）

```html+php:battle.php
<?php

function dice($param) {
    $_value = 0;
    if (preg_match('/^(\d+)?[dD]\d+([+]\d+)?$/', $param, $_check) === 1) {
        $_param = $_check[0];
        $_result = preg_split('/[dD]/', $_param);
        $_shakes = ($_result[0] == '') ? 1 : $_result[0];
        $_param = $_result[1];
        $_result = preg_split('/[+]/', $_param);
        $_faces = $_result[0];
        $_baseValue = (!isset($_result[1]) || $_result[1] == '') ? 0 : $_result[1];
        for ($_index = 0; $_index < $_shakes; $_index++)
            $_value += mt_rand(1, $_faces);
        $_value += $_baseValue;
	}
    return $_value;
}

$weapon = array (
	"name" => "こんぼう",
	"ATK" => "2d6",
);

function calcDamages($weapon, $defPoint, &$message) {
	$damages = (int)(dice($weapon["ATK"]) - $defPoint);
	if ($damages == 0) {
		$message = "攻撃が弾き返された！";
	}
	if ($damages < 0) {
		$message = "攻撃は届かなかった.";
		$damages = 0;
	}
	if ($damages > 0) {
		$message = $damages."のダメージを与えた!";
	}
	return $damages;
}

function Attack($a, $b) {
	$dmg = calcDamages($a->weapon, $b->defPoint, $msgs);
	echo $a->name . "が跳びかかった!<br>\n";
	echo $b->name . "に". $msgs . "<br>\n";
	$b->hitPoint -= $dmg;
	if ($b->hitPoint < 0) {
		$b->hitPoint = 0;
	}
}

$taro = new stdClass();
$taro->name = "太郎";
$taro->hitPoint = dice("3d6");
$taro->defPoint = dice("1d6");
$taro->weapon = $weapon;

$jiro = new stdClass();
$jiro->name = "次郎";
$jiro->hitPoint = dice("3d6");
$jiro->defPoint = dice("1d6");
$jiro->weapon = $weapon;
?>

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>ヨンプル</title>
</head>
<body>
<?php
echo $taro->name . "HP:" . $taro->hitPoint . " / " . $jiro->name . "HP:" . $jiro->hitPoint . "<br>\n<hr>\n";
while ($taro->hitPoint > 0 && $jiro->hitPoint > 0) {
	$taro->initiative = dice("1d6");
	$jiro->initiative = dice("1d6");
	if ($taro->initiative > $jiro->initiative) {
		Attack($taro, $jiro);
		if ($jiro->hitPoint > 0) {
			Attack($jiro, $taro);
		}
	} else {
		Attack($jiro, $taro);
		if ($taro->hitPoint > 0) {
			Attack($taro, $jiro);
		}
	}
	echo "<hr>\n" . $taro->name . "HP:" . $taro->hitPoint . " / " . $jiro->name . "HP:" . $jiro->hitPoint . "<br>\n<hr>\n";
}
?>
</body>
</html>

```
Parseがサービス終了するので日本語ドキュメントありで移行できそうなmBaaSサービスまとめてみた


facebookグループの最大手BaaSサービスであるParseが2017/01/27でサービス終了を発表したので、改めて他の(m)BaaSサービスについてまとめてみた。

#### ニフティクラウド mobile backend
http://mb.cloud.nifty.com/

* ニフティのサービス
* プッシュ通知/DB/ファイルストレージ/会員管理・認証/位置情報/SNS連携が使える
* 属性によって出し分けプッシュとかできる
* ユーザ活性化のリテンション広告連携ができるらしい
* 無料から使える
* ドキュメントがすべて日本語
* SDKはAndroid, iOS, Java Script, Unity
  * OSSとしてすべてコードを公開している
* 無料枠でAPIリクエスト/プッシュが200万回/月使える
* ドラクエとかキティちゃんのアプリとかで使われてる
* ハイブリッドアプリ開発プラットフォームのMonacaと連携している
  * https://ja.monaca.io/ 

#### Kii Cloud
https://jp.kii.com/

* Kiiのサービス
* プッシュ通知/DB/ファイルストレージ/会員管理・認証/位置情報が使える
* データ分析・可視化やABテスト機能がある
* IoT向けのデバイス管理機能がある
* サーバサイドにコードを置いて機能拡張できる
* ドキュメントは日本語/英語/中国語
* SDKはAndroid, iOS, Java Script, Unity, Thing-IF
* 無料でもAPIリクエスト/プッシュが100万回/月使える
* ハイブリッドアプリ開発プラットフォームのMonacaと連携している
  * https://ja.monaca.io/ 


#### アピアリーズ
http://www.appiaries.com/jp/

* プッシュ通知/DB/ファイルストレージ/会員管理・認証/位置情報が使える
* ピーシーフェーズのサービス
* 無料から使える
* ドキュメントは日本語/英語
* SDKはAndroid, iOS
* ファイルストレージにおけるファイル形式が豊富/メタタグをつけて管理できる
* 無料枠でプッシュ500回/月、APIリクエストの上限はないが、10000回を超えると制限がかかる場合がある
* 同時接続数について保証しない
* テレ東のアプリとかで使われている

#### appC cloud
https://app-c.net/

* カイトのサービス
* プッシュ通知/DB/ファイルストレージ/会員管理・認証/位置情報が使える
* デバッグサービスや分析機能がある
* 広告周りの機能が多い
* 基本的にすべて無料らしい
* SDKはAndroid, iOS
* プラグインはUnity, Cocos2d-x, monaca
* 導入したアプリをレビューして掲載してくれる
* アプリ内課金機能をサポートしてる


### BaaSに準じたサービス

#### Azure Mobile Services
https://azure.microsoft.com/ja-jp/services/app-service/mobile/

* マイクロソフトのサービス
* 様々な言語で使える
* Azureの１サービスという位置づけで、気軽に機能だけ使うのが難しいので今回はこちらに分類

#### Cloud Endpoints(mobile backend starter)
https://cloud.google.com/solutions/mobile/

* グーグルのサービス
* エンドポイントを自分で作成してAPIサービスを提供できる
  * 自分で機能拡張できる
* mobile backend starterなるものがあるが、基本機能として何ができるのか良く分からなかった
* 使い始めるまでが大変そう
* ドキュメントも細かいところは英語のみが多い

印象としてはニフティとKiiが基本的な機能を無料で沢山使える感じ。
ニフティは事例をみるとかなり大手で使われてて実績がある。
Kiiはサーバサイドの機能拡張や分析が出来て高機能。IoT方向も拡張してきてますね。

アピアリーズは昔はSDKがなかったのですが、今回調べたらしっかり対応してました。
同時接続無保証がちょっと気になる。
カイトは課金・広告系のアプリ特化な感じ。

料金体系はニフティとアピアリーズが定額式で分かりやすいですね。
Kiiは基本問合せでカスタムなので、費用感がちょっとわからないです。
カイトは完全無料みたいなので、どうやって稼いでいるのか気になる…。

間違っているところの指摘や、ご意見あればコメントいただけるとありがたいです！

今回は英語ドキュメントのみのサービスを調べる体力がなかったので国内メインでしたが、後日追加するかもしれません。

### リンクまとめ
ニフティクラウド mobile backend
http://mb.cloud.nifty.com/

Kii Cloud
https://jp.kii.com/

アピアリーズ
http://www.appiaries.com/jp/

appC cloud
https://app-c.net/
[SwiftLint] dyld: Library not loaded: @rpath/libclang.dylib する場合

brew install swiftlintして実行しようとしたら

```
dyld: Library not loaded: @rpath/libclang.dylib
Referenced from: /Library/Frameworks/SwiftLintFramework.framework/SwiftLintFramework
Reason: image not found
zsh: trace trap  swiftlint
```

と言われた。
多分Xcodeの名前を変えていると、ダメなのかな…？

```
sudo install_name_tool -add_rpath "/Applications/Xcode720.app/Conte
nts/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib" /Library/Frameworks/Sw
iftLintFramework.framework/SwiftLintFramework                                    
```

で解決。
EEPROMに設定値を変更に強い形で保存する

英StackOverflow,[Safely storing and accessing EEPROM](http://stackoverflow.com/questions/3551824/safely-storing-and-accessing-eeprom)より、
組み込みでEEPROM(など)に設定値を書くときのデータ構造について。


#データ構造
ヘッダの後にデータを続ける。次の設定値は隙間を開けずにまた続ける。
設定値が可変長でなければ(大抵の場合固定長)、これで困らない。
(長さが変わったらそれは別のファームウェアバージョンとして、初期設定の対象になる)
設定値が可変長であるシステムはまた別の方法で実装するか、
固定長になるように考えなおす。
全体の末尾には0を付けておく。
`ヘッダ,データ,ヘッダ,データ,...ヘッダ,データ,0`みたいになる

ヘッダの構造はこちら:
> Byte 0: Table Length   (in 16-bit words)
Byte 1: Table ID       (used by firmware to determine what this data is)
Byte 2: Format Version (incremented every time the format of this table changes)
Byte 3: Checksum       (simple sum-to-zero checksum)


#つかいかた
ある設定値を読み込むときは、アドレス0から読み込んでいき、
合致するIDとFormat Versionが現れるまでテーブルを探す。
テーブルは隙間なく詰めているので、探すときにはアドレスをTable Length分飛ばせばいい。
全体の末尾に0を書いておけば、Table Lengthが0のとき探しきったことになる。
こうしておけば、フォーマットもEEPROMの先頭に0書くだけで済む。

#初期状態で0埋めされていないEEPROMの場合
初期値が0x00以外で埋められているEEPROMでこのデータ構造を使うと、
一番最初の立ち上げが未フォーマット状態になる。
初回起動時に限り手動フォーマットでもいいが、自動でやりたい場合には、

- 先頭アドレスをフォーマット済みフラグにする。
- 次のアドレスからテーブルを始める。
- 起動時にフォーマット済みフラグを読む。
- 初期値なら先頭テーブルを削除し(長さに0を書く)、フォーマット済みフラグを初期値+1なり何なりする。
- 設定値を使う各モジュールは、自分の使うidが登録されているかを見て、存在しないなら初期設定を書き込む。

[雑にですが書いてみました](https://paiza.io/projects/vv1bm0KN9O5Qg4aIJj9J3w)
WPF ItemsControlのItemsにCollectionChangedイベントハンドラを設定

メモ。

ItemsControlを基底としてコントロールを作ったとき。
Itemsにコレクション変化イベント（CollectionChanged）を設定したい。

### 方法
ItemsをINotifyCollectionChangedでキャストするとCollectionChangedを引っ張り出せます。

```C#:こんな感じ
((INotifyCollectionChanged)this.Items).CollectionChanged += (s, e) =>
{
};
```
AfterEffectsSDK プラグイン開発開始まで

AfterEffectsのPluginを開発するために使うAfterEffectsSDK。
プラグインはたまにしか作らないからやり方をすぐに忘れちゃうので、導入までをメモ。
コンポやレイヤーを弄るプラグインの作成です。エフェクトとかは知らないです。

## 環境
- windows7
- VisualStudio2013
- AfterEffects CC

## SDKのダウンロード
[After Effects Developer](http://www.adobe.com/devnet/aftereffects.html)からSDKを入手。

「Get theSDKs」→ログイン→「Select an SDK:」でAfterEffectsを選択→バージョンやOSを選んでダウンロード
※ユーザー登録が必要です。

## SDKを解凍してフォルダに入れる
解凍したフォルダ丸ごとそのまま入れます。
（この説明では「Adobe After Effects CC Win SDK」を使用）
僕の場合はとりあえずProgram FilesのAdobeの中に入れました。
C:\Program Files\Adobe\Adobe After Effects CC Win SDK

## 環境変数にパスを設定

|変数名|値|
|:--|:--|
|AE_PLUGIN_BUILD_DIR|プラグインを出力する場所|

AEのプラグインフォルダにsdkフォルダを作って、そこを指定しました。
C:\Program Files\Adobe\Adobe After Effects CC\Support Files\Plug-ins\sdk

※これを指定しないとおそらくcドライブのルートに大量にプラグインが吐かれます。
※出力先を直接指定したい場合は、VisualStudioでプロジェクトを開いた後、
「プロパティ」→「構成プロパティ」→「リンカー」→「全般」
の「出力ファイル」にパスを直接書いてください。


## ビルドしてみる
1. SDKのフォルダ「Adobe After Effects CC Win SDK\Examples」の下にある「BuildAll.sln」をVSで起動します。
2. 一方向アップグレードのウィンドウが開くので「OK」でアップグレードを実行します。「信頼性の高い～」ウィンドウが開いたら、チェックボックスをはずして「OK」（チェックをはずさないと「OK」連打する羽目になります）。
3. PR_Public.hファイルの修正をします(ヘッダファイルはExamples\Headersの中)。 そのままビルドすると「warning C4819」がでます。5行目の「�2005 by Adobe Systems Inc.」を削除して保存すれば直ります（ファイルが読み込み専用になっている場合は先に解除しておきましょう）。
4. ビルドします。環境変数で指定したフォルダにプラグインが吐かれているはずです。

※プラグインが出力されない場合、出力先のフォルダにアクセス権がないかもしれません。

## デバッグの設定
1. プロジェクトの「プロパティ」→「デバッグ」を開きます。
2. 「コマンド」の欄にAEを指定します。

C:\Program Files\Adobe\Adobe After Effects CC\Support Files\AfterFX.exe

- デバッグ実行するとAEが起動します。
- ビルドしたプラグインが読み込まれているはず。
- ブレークポイントにもきちんとひっかかります。
- デバッグ実行を終了するとAEも閉じます。

## 取っ掛かり
- SDK直下にある「After_Effects_SDK_Guide.pdf」にほぼほぼ載ってます。英語ですが関数の説明を読むだけで色々と値が拾えます。
- フッテージやコンポやレイヤーをごにょごにょするなら「Adobe After Effects CC Win SDK\Examples\AEGP」以下のサンプルが良い感じです。
- EntryPointFunc関数がエントリーポイントなので、ここから順に探っていくと良いかもです。
- 新規でプラグインを作る場合、AEGP\Persistoをコピー,リネームして使うと便利です。Persistoを丸ごとコピーして、フォルダ名・ファイル名・全てのファイルの中身をツール名にリネームすればプロジェクトのできあがり。（例えばツール名が「Test」なら、「Persisto」という部分を全て「Test」に置換する）

## 取っ掛かり２
### EntryPointFunc
- エントリーの関数。AE起動時にいきなり呼ばれます（プラグイン実行時ではない）。
- ここでメニューにプラグインが登録されます。
 - AEGP_InsertMenuCommandの部分。
 - AEGP_Menu_FILEという引数が登録先のメニュー指定。AEGP_Menu_FILEは「ファイル」、AEGP_Menu_EDITにすると「編集」という具合。

### CommandHook
- プラグイン実行時に呼ばれます（EntryPointFunc内でAEGP_RegisterCommandHookで設定されてます）。
- 試しにこの関数内にブレークポイント仕掛けて、デバッグ実行→(AEが起動)→プラグイン実行、で引っ掛けられると思います。
- いらない処理を消して、自由にAEをごにょごにょしてください。

## ダイアログを開きたい
- 僕の場合、Win32APIで昔ながらの方法でダイアログを開いてます。
- HWNDとHINSTANCEが必要になるので、

```
HINSTANCE hInst = GetModuleHandle("このツール.aex");	// このdllのインスタンスを得る
HWND hAEWnd;
ERR(suites.UtilitySuite6()->AEGP_GetMainHWND(&hAEWnd));	// AEのウィンドウハンドル
```
って感じで拾っています。

- あとは普通のダイアログアプリケーションのように作ればひとまず色々やれます。
- ダイアログなので、開いている間はAE本体は操作できなくなるので注意です。
404や503発生時にHaproxyから静的ファイルを返す方法メモ


参考記事
[HOWTO use haproxy custom 503 error document when back server sends 503 http code](http://serverfault.com/questions/249109/howto-use-haproxy-custom-503-error-document-when-back-server-sends-503-http-code)

[Haproxy Documentation](http://www.haproxy.org/download/1.7/doc/configuration.txt)

　
やり方としては、haproxy.confのdefaultセクション等にステータスコードごとに表示したいファイルのパスを書くだけです。
(defaults,frontend,listen,backendセクションにかけるようです)

```haproxy.conf
defaults
	errorfile 404 /etc/haproxy/errors/404.http
	errorfile 503 /etc/haproxy/errors/503.http
```

```503.http
HTTP/1.0 503 Service Unavailable
Cache-Control: no-cache
Connection: close
Content-Type: text/html

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

*ファイルの内容を変更した場合は、restartしないと反映されません。*
CocoaPodsでライブラリを追加・更新したい


##開発環境

Xcode7.2
CocoaPods 0.39.0


##流れ
すでにプロジェクトに入れてあるPodsのPodfileに

```lang:Podfile
pod 'ライブラリ名', '~> バージョン'
```
を追加。
更新の場合は新バージョンの数に書き換える。



ターミナルで

```lang:
$ cd Podfileを保存したディレクトリ
$ pod update 
```

を実行して完了。
あれ〜めちゃめちゃ簡単やんけ〜。
mysql 5.7 以降の user 追加について

brew ではいる mysql が 5.7.10 というのになってて、ユーザー追加にはまった。

```sql
CREATE USER 'hoge'@'localhost' IDENTIFIED BY 'hage';
```

なんかGRANTでいきなり追加ができなくなったらしいので、上記のようにすると、mysql.user の plugin のカラムにハッシュ値みたいのが入る。

mysql のエラーには

```
The plugin '*00000000000034D1E9A887E4A913CB219E' used to authenticate user 'hoge'@'localhost' is not loaded. Nobody can currently login using this account.
```

みたいのが出る。

mysql -uhoge -p でも同じような plugins がどうしたみたいなエラーに。

```sql
CREATE USER 'hoge'@'localhost' IDENTIFIED WITH mysql_native_password BY 'hage';
```

とかが正しいらしいのでそうするが、なんかだめ。

結果としては過去の DB がのこってて

```
2016-01-28T11:36:35.274313Z 0 [ERROR] Column count of performance_schema.events_statements_history_long is wrong. Expected 41, found 40. Created with MySQL 50619, now running 50710. Please use mysql_upgrade to fix this error.
~snip~
2016-01-28T11:36:35.457764Z 0 [ERROR] Native table 'performance_schema'.'session_variables' has the wrong structure
2016-01-28T11:36:35.457876Z 0 [ERROR] Incorrect definition of table mysql.db: expected column 'User' at position 2 to have type char(32), found type char(16).
2016-01-28T11:36:35.457893Z 0 [ERROR] mysql.user has no `Event_priv` column at position 28
2016-01-28T11:36:35.471894Z 0 [ERROR] Event Scheduler: An error occurred when initializing system tables. Disabling the Event Scheduler.
2016-01-28T11:36:35.472106Z 0 [Note] /usr/local/Cellar/mysql/5.7.10/bin/mysqld: ready for connections.
```

みたいなログが大量に出てた。／(^o^)＼

ので、brew uninstall mysql して、/usr/local/var/mysql を削除して入れなおしたらすべてうまくいきました。

mysql_upgrade でも良かったんだろうけど、別に未練はなかったので。
iOS:インストールしているアプリのプロビジョニングファイルが切れちゃったら

#はじめに
ほぼ一年間できれるadhocアプリや、enterprise版で書き出したiOSアプリの復活のTipsです。

# 以前は・・・

## iPhone構成ユーティリティー
バージョン6.2まではダウンロードできたようですが
iOS8で不具合があったりでダウンロードできるものは2.2となっていました。
今回はこちらは使わず、Xcodeを使う方を対象としています。

## OTA配信

プロビジョニングを更新したあとに

 - アプリ削除
 - OTA配信

これで差し替えることもできたのですが、できなくなっていました。

# 環境
 - Mac OS X Yosemite
 - Xcode7.2

<img width="528" alt="スクリーンショット 2016-01-29 9.45.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/7079b0f1-a1ee-dcd2-a032-13f449ce2749.png">


#更新の方針

 1. 端末内のプロビジョニングファイルを差し替え
 2. アーカイブファイルからipa書き出し時に差し替え

# 端末内のプロビジョニングファイルを差し替え

（1）Xcodeの `Window > Devices`
<img width="320" alt="スクリーンショット 2016-01-29 9.54.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/054969ba-a44b-bb7d-efe9-5de186f90295.png">

（2）`Show Provisioning Profiles`
<img width="801" alt="スクリーンショット 2016-01-29 9.47.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/7fe53af5-fea4-5ad6-3957-85f29780a5ef.png">

（3）`+`,`-`でプロビジョニングファイルを追加と削除
<img width="809" alt="スクリーンショット 2016-01-29 9.48.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/c005396f-6456-3984-2874-b1125a4f32b0.png">

OTA経由などでインストールされたプロビジョニングファイルは差し替えることができます。

#アーカイブファイルからipa書き出し時に差し替え

**Archive**
![スクリーンショット 2014-04-24 9.35.21.png](https://qiita-image-store.s3.amazonaws.com/0/12362/9e65f6c0-c2cd-4bac-ce82-c59da8776c1a.png)

##XcodeArchiveを使う
開発環境を維持しないのであれば、同一端末での長期運用を前提にしたアプリはarchiveするべき。
この作業でのゴールは`プロビジョニングファイルの差し替え`です。

手順はこちらで
http://qiita.com/nofrmm/items/797ab6fc89af3ade7a27#ipa書き出し

## アーカイブファイルにするメリット

 - ビルド環境（対応するXcode、MacOSXのバージョンも含む）を保全は考慮しなくていい
 - Provisiong Fileを差し替えるだけなのでリビルドで引っかかるなどがない

### レガシーなアプリ
 - Xcode4時代にビルドしたiOS５アプリ
 - ２年ほど前にUnityから出力したプロジェクトファイルでアーカイブしたiOS6アプリ

これらは問題なく動かせています。

## アーカイブファイルのデメリット

 - Xcodeやアーカイブファイルの仕様に変更が入ると運用終了。
 - MDMなどで配信時にアプリのバージョンを上げる必要がある・・・といった場合は使えない

# 参考
構成ユーティリティ3.6.2がダウンロード出来ない
https://discussionsjapan.apple.com/thread/10155863

#さいごに
一番難しいのが古いiOSをターゲットとしているアプリの開発環境再構築です。
ただ復活させたいのであれば、アーカイブファイルから再取得すればよく
リソースの差し替えや、バージョンアップも！と言われるとリビルドになるんですが・・・
運用の仕方が決まっていなければリビルド一択になり、工期的にも予算的にもクライアント、技術者に負担がかかります。

こういう運用ならこういう方法がいいよーとか:apple:さんはもっと広めて欲しいなと思っています。
SBTとIntelliJでブレークポイントを張る

http://qiita.com/suin/items/83b93e98a5503b4e0460

プロジェクトの設定の違いによる所が大きいいが上の記事をみて自分で実行してみたら失敗したので、上手く行った方法をメモする。
OS: Windows7
sbt: 0.13.8
scala: 2.11

# コンソール側対応
```
set SBT_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
sbt
```

# IntelliJ側の対応

1. Run/Debug Configurationsを開いて`+`ボタンを押してremoteを選択する。
![intellij-config.png](https://qiita-image-store.s3.amazonaws.com/0/108588/8027167e-685a-2e3b-62f1-cf0060c14c72.png)
2. 上記の設定でdebugボタンを実行
3. ブレークポイントを仕掛ける

以上を設定後
実行したいsbtのコマンドを打つ（testなど）でうまくいった。

参考
http://stackoverflow.com/questions/23332378/how-can-i-enable-remote-debugging-for-sbt-in-windows
【Hexo】Hexo环境下设置Google Adsense


### 新建Adsense用模板
```
themes/xxxx/layout/_custom_ad/google_adsense.ejs
```
将Google Adsense的代码复制到google_adsense.ejs

### 编辑layout.ejs
在需要加上广告的地方加上

```
<!-- ad start -->
<%- partial('_custom_ad/google_adsense') %>
<!-- ad end -->
```

### 参考资料
http://www.embeddedjs.com/
gitの全履歴のコードの検索

こんなに簡単にgitの全履歴のコードの検索ができたんですね…。

```sh
git grep <regexp> $(git rev-list --all)
```

How to grep (search) committed code in the git history?
<http://stackoverflow.com/questions/2928584/how-to-grep-search-committed-code-in-the-git-history>
CentOS6.5にGoをインストールする


この記事に感化されてGoを試したくなったのでインストール方法メモ
[【今更聞けないGo言語】Goって何？魅力は？Go言語資料まとめてみました](https://techstars.jp/blog/golang-1/ "【今更聞けないGo言語】Goって何？魅力は？Go言語資料まとめてみました")


#Goのインストール
[The Go Programming Language Getting Started](https://golang.org/doc/install "The Go Programming Language Getting Started")のここを実行するだけでインストール出来ます
簡単は正義だ

![スクリーンショット 2016-01-29 9.20.24.png](https://qiita-image-store.s3.amazonaws.com/0/36871/07a2d602-f6d0-bf5e-c844-a8203661349c.png "スクリーンショット 2016-01-29 9.20.24.png")



まず[Download the archive](https://golang.org/dl/ "Download the archive")に飛んで「go1.5.3.linux-amd64.tar.gz」のURLをコピーします

今回コピーしたURLは
`https://storage.googleapis.com/golang/go1.5.3.linux-amd64.tar.gz`


wgetで落とします

```
wget https://storage.googleapis.com/golang/go1.5.3.linux-amd64.tar.gz
```

ダウンロードしたファイルを展開します

```
tar -C /usr/local -xzf go1.5.3.linux-amd64.tar.gz
```


パスを追加して

```
export PATH=$PATH:/usr/local/go/bin
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin
```

ちゃんと通っているか確認

```
which go
```

```
[root@caa618bff9e9 src]# which go
/usr/local/go/bin/go
```

通りました



#Goreのインストール

モダン言語にREPLは欠かせませんよね
GoreはGoのREPLです

```
go get github.com/motemen/gore #gore本体
```

```
go get github.com/nsf/gocode # 入力補完に
```

```
go get github.com/k0kubun/pp # プリティプリントに
```

```
go get golang.org/x/tools/cmd/godoc # ドキュメントに
```



goreコマンドが入ってるか確認

```
[root@caa618bff9e9 src]# which gore
/root/go/bin/gore
[root@caa618bff9e9 src]# gore
gore version 0.2.5  :help for help
gore>
gore> num := 10
10
gore> num+3
13
```


動くようになりました



#所感
Go触ったこと無いのでDocker使いとしてももっと触ってみたいと思います :ghost: 




#参考
[The Go Programming Language Getting Started](https://golang.org/doc/install "The Go Programming Language Getting Started")

[コード補完もできる Go の REPL「gore」を作った](http://motemen.hatenablog.com/entry/2015/02/go-repl-gore "コード補完もできる Go の REPL「gore」を作った")
(メモ)docker-composeでUID指定し起動

## 参考

* [Support --user option in "docker-compose up" · Issue #1532 · docker/compose](https://github.com/docker/compose/issues/1532)

## 方法

```diff:docker-compose
 gollum:
   image: suttang/gollum
+  user: $UID
```

```bash:起動
UID=1000 docker-compose up
```

## syntax check

```bash:
docker-compose config
```
homebrew で less のシンタックスカラーリングの導入と設定メモ


less のカラーリングは色々あるけれど、OS X に限った情報のメモ。

lesspipe.sh を導入と設定

```shell
brew install lesspipe
```

環境変数を設定

```.bashrc
export LESS="-j10 -R --no-init --quit-if-one-screen"
export LESSCHARSET="utf-8"
export LESS_ADVANCED_PREPROCESSOR="1"
export LESSOPEN='|/usr/local/bin/lesspipe.sh "%s"'
```

これで大抵の事は完了している。
lesspipe.sh をプリプロセッサとして置くことで、たぶんこれぐらいの事は自動でやってくれる。

* 圧縮ファイルを自動展開して中身を見る
* 文字コードを iconv で変換する

なお、アーカイバ自体は必要に応じて個別にインストールする事。
あと LESS 環境変数で -R / -r のどちらかのオプションを指定しないと less コマンドが ANCI エスケープシーケンスを解釈しないのでカラーリングが強制的に無効になる。

lesspipe のカラーリングを Pygments に変更する

デフォルトでも lesspipe 付属の code2color という Perl 製のシンタックスハイライターが適用されるが、どうも構文解釈がおかしい気がして気に入らなかった。

lesspipe.sh ではこれを Python の Pygments に置き換えることが可能。

Python と Pygments のインストール

```shell
brew install python # 手元の環境では Python2.7 系が導入された
pip install --upgrade pip # 付属の pip が古いと警告されたので一応
pip install Pygments

```

ここまでで Pygments が導入され、pygmentize コマンドが使えるようになる。


あとは環境変数を以下のように設定すると Pygments を使うようになる

```.bashrc
export LESSCOLORIZER="/usr/local/bin/pygmentize"
```
Reactでembed.jsを使ってリッチなコンテンツ表現

[embed.js](http://riteshkr.com/embed.js/)を利用すればリッチなコンテンツ表現ができます。embed.jsは特定のDOM要素を直接操作して、コンテンツをリッチ化するものと、リッチなコンテンツを文字列として返すものの二種類のAPIがあります。

Reactで使う場合、DOMを直接操作してしますと、VituralDOMの管理外のものが混在して、メモリ管理などが面倒になります。今回は、文字列として取得するAPIを利用してReactからembed.jsを利用します。


## import

```js
import 'embed.js';
```

ES6の記法で書いています。僕の環境ではimport EmbedJS from 'embed.js';のように記述できなかったので、全部をインポートしています。


## embed.jsの利用

embed.jsで文字列として返還後の文字列を取得します。そのあと、dangerouslySetInnerHTMLを使ってコンテンツを表示します。コードはこんな感じ。


```js
export default class Body extends React.Component {
  componentDidMount() {
    this.mounted = true;
    if (this.props.body && !this.state.body) {
      const options = {
        element: this.refs.body,
      };
      new window.EmbedJS(options)
        .text((htmlBody) => {
          if (!this.mounted) {
            return;
          }
          this.setBody(htmlBody);
        });
    }
  }

  componentWillUnmount() {
    this.mounted = false;
  }

  setBody(htmlBody) {
    this.setState({body: (<div dangerouslySetInnerHTML={{__html: htmlBody}} />)});
  }

  render() {
    return this.state.body ? this.state.body : (<div ref="body">this.props.body</div>);
  }
}
```

componentDidMountで、EmbedJSでコンテンツを変換します。コンストラクタに渡すオブジェクトでelement(DOM要素)を指定します。elementじゃなく、文字列で指定も一応は可能なんですが、

- 文字列のエスケープを事前に自前でやっておかないとXSSの脆弱性になる
- Twitterの埋め込みなどはelementで指定しないとエラーになる

など問題があるので、文字列じゃなくelementで指定するのがいいです。

そのあとに、textメッソドを実行して文字列に変換しています。textメソッドは非同期実行されて結果が返ってくるので、結果が帰る前にunmountされると警告がコンソールにでるので、unmountされそうになったらstateを更新しないようにしています。

mount状態を取得するisMountedは昔のReactは使えたのですが今はdeprecatedになっっているので、使わないで自前でmount状態を管理します。


でわでわ
Dockerコンテナ(ubuntu)にoracle-java8をインストールする

2016/1/29現在では、Ubuntuにapt-getでoracle-java8を単純にインストールすることができないようです。この記事では、Dockerコンテナ(ubuntu:latest)にoracle-java8をインストールして、最低限の動作確認としてバージョン情報を表示してみます。Dockerはあまり関係なく、本質はUbuntuにoracle-java8をインストールすることですけど。

# 前提

* Windowsを前提で説明しますが、OS Xでもほぼ同様の手順になるはずです。Linuxの場合、Dockerホストを構築する手順が異なります。
* VirtualBox
    * Windows、またはOS Xの場合。
    * `cinst virtualbox`(Windowsの場合)、`brew install virtualbox`(OS Xの場合)などでインストール可能です。
* Docker Machine
    * Windows、またはOS Xの場合。LinuxはDockerホスト構築が必要ないため、不要。
    * `cinst docker-machine`(Windowsの場合)、`brew install docker-machine`(OS Xの場合)などでインストール可能です。
* Docker Engine
    * Linuxの場合。

# Dockerホストを構築

Windowsでは単純にDockerを使用することができないため、Docker MachineでVirtualBox上にDockerホストを構築します。

```
$ docker-machine create --driver virtualbox test
```

Dockerホストにsshログインします。

```
$ docker-machine ssh test
```

# Dockerイメージを構築

Dockerホスト内で、Dockerfileをダウンロードします。このDockerfileは、ubuntu:latestをベースイメージとしてoracle-java8をインストールします。

```
$ git clone https://github.com/u6k/ubuntu-oracle-java8.git
```

Dockerイメージを構築します。かなり時間がかかります。

```
$ docker build -t u6k/ubuntu-oracle-java8 .
```

イメージ一覧を表示して、構築したイメージが含まれていることを確認します。

```
$ docker images
REPOSITORY                TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
u6k/ubuntu-oracle-java8   latest              2008f3ea987b        24 hours ago        815.6 MB
ubuntu                    latest              6cc0fc2a5ee3        8 days ago          187.9 MB
```

# Dockerコンテナを実行

構築したイメージを実行します。成功すると、Javaバージョン情報が表示されます。

```
$ docker run u6k/ubuntu-oracle-java8
java version "1.8.0_72"
Java(TM) SE Runtime Environment (build 1.8.0_72-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.72-b15, mixed mode)
```

# 参照

* [u6k/ubuntu-oracle-java8](https://github.com/u6k/ubuntu-oracle-java8)
gollum使ってみた

## 注意点

* .mdのファイル名が日本語だと表示されない
* [rogue](http://rouge.jneen.net/)が使われるためQiitaと書き方が異なる
* `--ref`でブランチ指定するのも良いかも
* `./uploads/`にUPLOADされる
    * 画像の表示は`[[/uploads/image.png]]`

```diff:syntax_hilightの注意
- ```rb:
+ ```rb
```

## 起動

```bash:docker-compose.yml 
gollum:
  image: suttang/gollum
  ports:
   - "4567:4567"
  volumes:
   - .:/root/wikidata
  entrypoint:
   - "/usr/local/bin/gollum"
   - "/root/wikidata"
   - "--live-preview"
   - "--h1-title"
   #
   - "--show-all"
   - "--allow-uploads"
```

```bash:_Sidebar.md 
[[_TOC_]]
```

* TOCの日本語文字化けは起こらなかった。

## 特殊なファイル

* _Header.md
* _Sidebar.md
* _Footer.md

## 書式

* [Home · gollum/gollum Wiki](https://github.com/gollum/gollum/wiki)
DockerがSetting up ca-certificates-javaで固まる

# 背景

Dockerを最新化して使っていた。

# 問題

- [アメッシュの画像を表示するslackのボットをbotkitを使ってDockerイメージにしてherokuで動かした - non vorrei lavorare](http://abrakatabura.hatenablog.com/entry/2016/01/28/142028)

の記事を書く際にはまった。

- https://github.com/tt/stack-images

のDockerfileをビルドさせようとしたら、待てど暮らせど

```txt
Setting up ca-certificates-java
```

から先に進まない。

docker-machine sshしてpsすると
コンテナ内のjavaがdefunctに

# 解決方法

aufsとLinuxカーネルの問題らしい。

docker-machineの内部で使っているboot2dockerを

- https://github.com/tianon/boot2docker-legacy/releases/tag/v1.10.0-rc1

にした仮想マシンを作成し、これで作業する。

```bash
docker-machine create -d virtualbox --virtualbox-boot2docker-url=https://github.com/tianon/boot2docker-legacy/releases/download/v1.10.0-rc1/boot2docker.iso

```

# 資料

- https://github.com/docker/docker/issues/18180

# 関連記事

- [EC-CUBEをh2oと連携させてdocker for macで動かしてosxfsが大変遅いことを体感した件](http://abrakatabura.hatenablog.com/entry/2017/03/11/094319)
- [DockerでIPython Notebookを動かして、数え上げおねえさんを救う](http://abrakatabura.hatenablog.com/entry/2014/11/30/214133)
- [Dockerで音を鳴らす](http://abrakatabura.hatenablog.com/entry/2014/08/21/062305)
- [JavaScriptをDockerを使って黒い画面に表示する](http://abrakatabura.hatenablog.com/entry/2014/08/09/224138)
- [Dockerやって知ったmoshの残念な点](http://abrakatabura.hatenablog.com/entry/2014/07/26/043530)
- [OSXでDocker入れるとTimeMachineが遅くなるかも #solved](http://abrakatabura.hatenablog.com/entry/2014/07/19/075732)
- [Dockerやって色々勉強になってる件](http://abrakatabura.hatenablog.com/entry/2014/07/15/065931)
- [Dockerの画面をiPhoneに表示する - non vorrei lavorare](http://abrakatabura.hatenablog.com/entry/2014/09/10/205608)
- [Docker入れてからのVirtualBoxのアップデート](http://abrakatabura.hatenablog.com/entry/2014/03/30/080156)
- [DockerのAlpine Linuxでタイムゾーンでハマった](http://abrakatabura.hatenablog.com/entry/2017/07/16/081952)
c++ > using value_type = T; > 効果が分からない

http://qiita.com/SaitoAtsushi/items/d26a5cfa5453d8d91b63
のコードをもとにSTLやtemplateを少しずつ勉強している。


```cpp
template<class T>
class continuous {
...
    using value_type = T;
...
```

上記のvalue_typeの一文の効果が分かっていない。

http://en.cppreference.com/w/cpp/language/type_alias

```cpp
// type alias can introduce a member typedef name
template<typename T>
struct Container { using value_type = T; };
```

https://github.com/hironishihara/GILDesignGuide-ja/blob/master/src/section_04.md

```cpp
typename value_type      = T;        // use channel_traits<T>::value_type to access it
```


今のところ説明のweb検索は成功していない。

STLの本で勉強するのがいいかもしれない。
技術英語 > So, hurricane Sandy, or super-storm Sandy, or hybrid Sandy, or [whatever you want to call it…] / to name a few / great-grandfather

@ LOE > November 2, 2012
http://loe.org/shows/shows.html?programID=12-P13-00044
> So, hurricane Sandy, or super-storm Sandy, or hybrid Sandy, or <font color=red>whatever you want to call it…</font>

<hr>
関連して思い出したのは

to name a few

http://eow.alc.co.jp/search?q=to+name+a+few&ref=sa
> ほんの数例を挙げれば

<hr>
ドラマ「フルハウス」でミシェルと父親のやり取りを思い出した。

父親、祖父、曽祖父、その上の説明をしていた場面。

father
grandfather
great-grandfather
great great great great-grandfather

最後のは確か「お父さんの、お父さんの、お父さんの、お父さんの、お父さんの、お父さん」という訳がついていた。
errbitをHerokuに置いて簡単Railsアプリエラー管理


Herokuのアカウントが作成済みなら15分もあればできてしまうと思います。


# 準備
Herokuのアカウントがなければ作り、Heroku toolbeltを入れるなど初期セットアップを済ませておいてください。

# １：Herokuにデプロイする。
errbitのgitになんとHerokuにデプロイするボタンがあります。
https://github.com/errbit/errbit/blob/master/docs/deployment/heroku.md

- 「Deploy to Heroku」をクリック

  -> Herokuのサイトに遷移してデプロイ完了。

# ２：Herokuにデプロイしたerrbitをローカルにクローン

ターミナルでerrbitを置きたいディレクトリに移動。
`git clone`でローカルにクローン。
giturlはherokuのアプリのSettingsのページを見ると書いてあります。
Settingsのページはこのまま開いておいてくださいね。

# ３：errbitの設定
## ログインユーザーの設定
### db:seedを編集

- ローカルにクローンしたerrbitプロジェクトのdb/seed.rbを編集して最初のログインユーザーを設定します。

```ruby:db/seed.rb
# Create an initial Admin User
admin_username = "ユーザー名"
admin_email = "メールアドレス"
admin_pass  = ENV['ADMIN_PASS']

user.name = '任意のAdmin name' # 変えなくてもOK
```
パスワードは環境変数に入れました。



### Herokuで環境変数を設定
先ほど開いておいたHerokuのSettingsのページに"Config Variables"という項目があります。
**Reveal Config Vars**　というボタンをクリックすると環境変数の一覧が出ます。
そこにKey: ADMIN_PASS、Value:任意のパスワードを追加します。

## New Relicを追加
Herokuは無料プランだと１時間アクセスがないとDynoがアイドル状態になるので、これを回避するためにNew Relicというパフォーマンス監視サービスを導入します。

これについては詳しく説明しているページが色々あると思うのでわからなければ調べてみてください。ここでは手短にやり方だけを載せます。

- Gemfileに以下を追加して`bundle install`。

```ruby:Gemfile
gem 'newrelic_rpm'
```

## 変更内容を適用
- gitでローカルの変更内容をpush
- herokuでnew relicアドオンを追加
- db:seedを適用

```terminal
$ git add .
$ git commit -m "change: db:seed, add: new relic"
$ git push origin master
$ heroku addons:create newrelic:wayne
$ heroku run rake db:seed
$ heroku open
```

`heroku open`でerrbitのアプリを開き、次の設定に進みます。

# 4:監視するアプリの設定
1. errbitのアプリに先ほど設定したメールアドレスとパスワードでログインします。
1. Appsのページの __Click here to create your first one__をクリックすると監視先アプリの情報のフォームが出ます。    
必要な内容を入力してフォームを送信します。
SEND NOTIFICATIONS TO ALL USERSにチェックを入れるとエラー通知のメールが届くようになります。
1. 監視対象のアプリのGemfileに以下を追加して`bundle install`  

```ruby:Gemfile
group :production, :staging do
	gem 'airbrake, '~> 5.0'
end
```

4. config/initializers/errbit.rbを作成し、以下のerrbitのアプリ設定完了ページのところに書いてある内容をコピペ。以下の最後の一行を追加するとdevelopmentとtest環境を除外できます。

```ruby:config/initializers/errbit.rb
Airbrake.configure do |config|
  config.host = 'errbitのアプリ設定で書いてある内容'
  config.project_id = true
  config.project_key = 'errbitのアプリ設定で書いてある内容'
end if Rails.env.production?
```

監視対象アプリをデプロイしたらOK。これでerrbitが使えるようになりました。

### デプロイでエラーが出た場合
バージョンのタイミングが悪かったようですが、私はこのままデプロイしたら以下の様なエラーが出ました。

```
Airbrake::Error: the 'default' notifier isn't configured
```
airbrake-rubyのv1.0.2あたりでのみ出ている問題のようでしたので、その場合はGemfileのproduction, stagingグループ内にairbrake-rubyをバージョン指定して追加して`bundle install`して再度デプロイします。

```ruby:Gemfile
group :production, :staging do
	gem 'airbrake-ruby', '~> 1.0.3'
end
```
参考：https://github.com/airbrake/airbrake-ruby/issues/28

# ５：errbitを更に細かく設定する

errbitでは各種configの値を環境変数で持っています。
パラメーターの一覧は公式ページにあります。
https://github.com/errbit/errbit/blob/master/docs/configuration.md

何も設定しないとエラーが出た時にerrbit@example.comというアドレスからメールが来るので、ERRBIT_EMAIL_FROMはお好みのアドレスに変更すると良いのではないでしょうか。他の項目は適宜どうぞ。

以上です。
電脳体キュラゲタムを討伐せよ


https://codeiq.jp/q/2574

激ムズのため協力可とのこと。結局解説の事前公開はしませんでしたが。

## 概要
左上のマスからスタートし、マップ上の一番高い地点をすべて回って戻ってきたい。隣接するマスの移動コストは

- 高低差+1 : 11
- 高低差0  : 3
- 高低差-1 : 2

である。移動コストの合計の最小値を求めよ。

マップの縦横は250以下、一番高い地点は15個以下。

## 解法

### 地点間の距離
- マップを走査し、回る地点を列挙する。
- 隣接するマスをグラフに変換し、地点間の距離を(地点数分) **ダイクストラ** を回して求める。
  - マップの距離については[AtCoderに類題がある](http://code-festival-2015-relay.contest.atcoder.jp/tasks/cf_2015_relay_h)。
  - 今回、 **地点はスタート地点を含めて最大16個** なので、最大16回ダイクストラを回すことになる。
  - マス数の上限は250**2=62500なので、ワーシャルフロイドだとTLEする。
- なお、移動コストが非対称なので、`dist[i][j]=dist[j][i]=...`といった代入はできないことに注意する。

### 距離の合計
- 地点を1回ずつ回って帰ってくる。といえば、 **巡回セールスマン問題** である。
- 巡回セールスマン問題のナイーブな解法は、順列を全列挙する方法だが、これではO(n!)となり、nの最大が16だとTLEである。
- これには、bitDPを用いてO(n^2 2^n)とする解法が知られている。詳しくは[Spaghetti Source](http://www.prefield.com/algorithm/graph/shortest_hamilton_path.html)を参照されたい。
- この解法がとっつきにくい場合は、[yukicoder](http://yukicoder.me/problems?tags=bitDP)で練習することができる。

## 解答例
http://ideone.com/lEW6vG
(ideoneのC++14、[実行くん](https://codeiq.jp/tools/sandbox/)のC++11ともに0.3秒なので、スクリプト言語で1秒切るのは厳しいかもしれないですね)

## まとめ
というわけで、実はダイクストラ+巡回セールスマン問題という典型問題でした。でもまあ、典型という結論に至るには考察が必要なので、良問であったと思います。
AndroidのChromeでフロントエンドを高速デバッグ

Android の Chrome で Web のフロントエンドがどういう挙動をするかデバッグする時なんかに便利。特に Javascript でスマホ限定のイベントを扱うとかね。

今回は Android の Chrome で加速度センサーの値をリアルタイムで PC 画面に出力してみる。

マニュアルは以下より。
https://developer.chrome.com/devtools/docs/remote-debugging

#01. 必要なもの
- Chrome の入ってる Android 実機
- Chrome の入ってる Mac (もちろん Windows でもドライバをインストールすればできる)
- エディタ (Bracketsなんかだとライブリロードが標準でついていて面白い)
- Terminal (ローカルサーバーを立てるため)

#02. Android の準備
設定 > 開発者向けオプション > USBデバッグを ON にしておく

#03. ローカルサーバーの構築
まずは Terminal を起動。以下のコマンドを打ち込み、Desktop にローカルサーバーを立てる。

```
mkdir ~/Desktop/test & cd ~/Desktop/test
```

次に ~/Desktop/test/ に index.html を作成。

```html:index.html
<!doctype html>
<html lang="en">
    <head>
	<meta charset="UTF-8"/>
	<title>USB Debugging</title>
    </head>
    <body>
        <h1>Hello World!</h1>
    </body>
</html>
```

再び Terminal で次を入力。するとブラウザで 127.0.0.1:8000 にアクセスすると無事 Hello World! されているはず。

```
python -m SimpleHTTPServer 8000
```

ちなみに Livereload ができる方は 8000 番ポートでローカルサーバーを立てると爆速デバッグが可能になる。
(↓ Python で簡単に Livereload )
https://github.com/lepture/python-livereload

#04. Android で見てみる
ここで PC と Android を USB で繋ぐ。Android 側で何か出るかもしれないが、許可しておく。

次に以下 URL に Chrome でアクセス。
chrome://inspect/#devices

こんな感じの画面が表示されただろうか。自分の端末が表示されていればOK。
<img width="759" alt="スクリーンショット 2016-01-29 2.12.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/91302/d9fabb30-0f6c-1b7a-47a2-e7986397e537.png">

ここで「Open tab with url」に適当な URL を打ち込めば Android 側の Chrome でその URL にアクセスできるが、とりあえずローカルホストにアクセスできるように設定する。
をクリック。次のように入力して 「Done」をクリック。

<img width="292" alt="スクリーンショット 2016-01-29 2.17.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/91302/1d3ec5f9-8c3d-5ed7-1830-9269c552f513.png">

最後に「Open tab with url」に「localhost:8000」と入力して 「Open」を押す。
<img width="626" alt="スクリーンショット 2016-01-29 2.22.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/91302/d41c089e-2d97-d9f3-2f62-cc92603be6df.png">

すると Android で Chrome のタブが開かれ、Hello World を出力するはず。
![Screenshot_20160129-022453.png](https://qiita-image-store.s3.amazonaws.com/0/91302/58e46ea7-e370-3b37-8659-e8050d025f26.png)

#05. Debug する

ここまで来れば後は簡単。まずは「inspect」をクリックすると Chrome のデバッグでお馴染みの画面が立ち上がる。
<img width="300" alt="スクリーンショット 2016-01-29 2.26.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/91302/20628812-8dea-7330-f506-bae837d36861.png">

もちろんこの画面は PC 版の Chrome の「検証」と同じように扱うことができる。
<img width="1280" alt="スクリーンショット 2016-01-29 2.26.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/91302/a1c9cb64-92cf-2ccb-5bc5-411a6941aa1e.png">

index.html に以下を追記 (加速度の取得)

```html:index.html
<script type="text/javascript">
window.addEventListener("devicemotion", function (e) {
    var x = e.acceleration.x;
    var y = e.acceleration.y;
    var z = e.acceleration.z;
    var txt = "x:" + x + " ,y:" + y + " ,z:" + z;
    console.log(txt);
});
</script>
```

Android の Chrome をリロードするとインスペクタのコンソールに加速度がわらわら出てくるようになる。

<img width="716" alt="スクリーンショット 2016-01-29 2.34.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/91302/ec03fbd8-261d-1208-2646-34acc145b6ec.png">


#06. 雑感
とまあこんな感じでできますよ。一言で言えば Chrome が凄すぎた。
Javascript でセンサーの値取得とかは非常に楽なので、これを使って面白いものをガンガン開発できるといいですね。もちろん Touch イベントなんかも拾えますよ。
【middleman】slimのテンプレートでinitする

#やりたいこと
middlemanで静的サイトを作成する際に、どうせならはじめからslimでテンプレートを出したい。

#結論
以下の順番でコマンドを打ちます。

```bash:ターミナル
#middlemanのインストール
$gem install middleman
#slimのインストール
$gem install slim
#middlemanのinit
$middleman init PROJECT_NAME -T yterajima/middleman-slim
```
実行後ターミナルが以下のようになっていれば成功

```
         run  git clone --depth 1 git://github.com/yterajima/middleman-slim.git /var/folders/ng/q_w1pz_96yj7hjmk3h6pln3h0000gn/T/d20160129-57446-1qdzle6 from "."
Cloning into '/var/folders/ng/q_w1pz_96yj7hjmk3h6pln3h0000gn/T/d20160129-57446-1qdzle6'...
remote: Counting objects: 31, done.
remote: Compressing objects: 100% (22/22), done.
remote: Total 31 (delta 0), reused 24 (delta 0), pack-reused 0
Receiving objects: 100% (31/31), 8.10 KiB | 0 bytes/s, done.
Checking connectivity... done.
       exist
      create  .gitignore
      create  Gemfile
      create  config.rb
      create  source/images/middleman-logo.svg
      create  source/index.html.slim
      create  source/javascripts/all.js
      create  source/layouts/layout.slim
      create  source/stylesheets/_normalize.scss
      create  source/stylesheets/site.css.scss
```


#経緯
いくつかのサイトを参考に、以下のコマンドを試したところエラー

```bash:ターミナル
$middleman init PROJECT_NAME --template slim
```
`middleman`のバージョンが上がった際にコマンドの書き方が変わったようです。

https://github.com/yterajima/middleman-slim
error: RPC failed; result=56, HTTP code = 200B | 18 KiB/s   

表題のエラーについて、どうしても解決できないので、解決策を教えていただきたいです。

環境
・Debian Wheezy 7.8

git clone した際に、以下のエラーが出てしまい、cloneすることができません。

error: RPC failed; result=56, HTTP code = 200B | 18 KiB/s      
fatal: The remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed

多くの記事では、以下のbufferを変更すれば、できるみたいなのですが、
できませんでした。

postBuffer = 1048576000

何卒、よろしくお願いします。
El Capitan で RubyMineのデバッガが動かなかった

ブレイクポイントを設定すると

```
IOError in Customer::StudentsController#index
```

とか言われまして。



native exceptionとか言われちゃったので。。

```
gem uninstall ruby-debug-ide

Select gem to uninstall:
 1. ruby-debug-ide-0.4.32
 2. ruby-debug-ide-0.6.0
 3. All versions
```
ruby-debug-ideが2個入ってたので削除。


```
http://qiita.com/takecian/items/bd9fd49c9b9704d6c425
El Capitan で library not found for -lgmp が発生する時の対処法

>xcode-select --install

動いたー!
models/concerns/hoge.rb と controllers/concerns/hoge.rbを作ると、死ぬ可能性がある。



死んでいたので。

concernsという、その他諸々みたいなものを入れておくディレクトリがある。


models/concerns/hoge.rbでmoduleを定義する

```rb
#models/concerns/hoge.rb

module Hoge
	def hoge
		' hoge by concern in models'
	end
end
```


そして、controllers/concerns/hoge.rbでmoduleを定義する。

```rb
#controllers/concerns/hoge.rb

module Hoge
	def hoge
		' hoge by concern in controllers'
	end
end
```

そして、どっかのmodelでHogeをincludeする。
すると直感的には、models/concerns/hoge.rbが読まれてほしい。
つまり以下は

```rb
#models/fuga.rb

class Fuga
    include Hoge
	def hello
		"hello" + hoge
	end
end
```

こうなってほしい

```
> Fuga.new.hello => "hello hoge in concern in models"
```

しかし、実際は。。。


```
> Fuga.new.hello => "hello hoge by concern in controllers
```

controllers/concerns/hoge.rbが呼ばれている。


これは、railsがincludeするときにファイルを探すとき、module名に対応したファイルを探すらしい。その時に、modelsのディレクトリよりもcontrollersを先に読んでしまう。
なので、controller側のhoge.rbを読んで終わってしまう。



この時気をつけなれければならないのは、じゃあcontrollerの方を適当に入れ子にしておけばいいと思うこともあるかもしれない。以下のような感じ。(僕はこれで行けると思ってしまいました)

```rb
#controllers/concerns/hoge.rb

module ControllerHoge
	module Hoge
		def hoge
			' hoge by concern in controllers'
		end
	end
end
```
するとこんなエラー。

```
LoadError: Unable to autoload constant Hoge, expected /home/vagrant/src/stocker/app/controllers/concerns/hoge.rb
```

要するに、railsはcontrollerのconcernでincludeしたmodule名に対応したファイルを見つけると(Hogeに対してhoge.rb) そのファイルを読み込んでしまう。
そこでファイルの中を見てみると、module Hoge がないやでと言われてしまう。というわけだ。

タイトルに出した「死ぬ」はこれ。僕はこれでうわぁぁぁってなってました。
  
  



でもこういった感じで同じファイル名を与えたいときはあると思う。

なので、こうすることですっきりした。(つもり)

まず　controllers/concerns/somedir　を作る。
そしてディレクトリに対応してネームスペースを与える。

```rb
#controllers/concerns/somedir

module Somedir::Hoge
	def hoge
		'hoge by concern in controller'
	end
end
```

そして、Fuga.new.helloを実行。

```
> Fuga.new.hello => "hello hoge by concern in models"
```


いやぁ。。。仕様をもっと理解しよう。
SwiftLint 0.7.1 アップデート内容まとめ

# 強化されたもの

## MissingDocsRule

パフォーマンスが上がりました。

## CustomRules

新しく追加されたルールです。名前の通り、ルールをカスタマイズして追加することができます。
ただしものすごく自由にカスタマイズできるわけではなく、「正規表現ベースのルール」という制限があります。
書き方は以下のようになります(公式の[Defining Custom Rules](https://github.com/realm/SwiftLint#defining-custom-rules)から抜粋)。

```
custom_rules:
  dont_use_str: # rule identifier
    name: "Don't use 'str'" # rule name. optional.
    regex: "(str)" # matching pattern
    match_kinds: # SyntaxKinds to match. optional.
      - doccomment
    message: "Don't use 'str' in doc comment and parameter." # violation message. optional.
    severity: error # violation severity. optional.
```

上記の例の場合、ドキュメントコメントの中に”str”という文字列が存在していたらエラーを出す、というルールになります。
なので、以下のような結果になります。
ドキュメントコメント中の”str”にはエラーが出ていますが、メソッドの引数部分、メソッド内部の”str”にはエラーが出ていません。

<img width="607" alt="スクリーンショット 2016-01-28 10.05.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/100736/caea55d1-fde4-40df-b36c-71e28509a2aa.png">

ちなみにmatch_kindsには以下の種類があります。
これらの値は(全部かはわかりませんが)SourceKittenから来ているみたいですね。
なのでこれらが具体的に何を指すのかは[SourceKitten](https://github.com/paulyoung/sourcekitten)をご参照ください。

* argument
* attribute.builtin
* attribute.id
* buildconfig.id
* buildconfig.keyword
* comment
* comment.mark
* comment.url
* doccomment
* doccomment.field
* identifier
* keyword
* number
* objectliteral
* parameter
* placeholder
* string
* string_interpolation_anchor
* typeidentifier

## ForceUnwrappingRule

全てのforced unwrapに対して警告が出されるようになりました。

# バグFix

ValidDocsRuleに存在していたいくつかの偽陽性が修正されました。
※偽陽性
今回の場合で言うと、「本当はvalidなのにinvalidと判定された」ということになると思います。
SwiftLint 0.7.0 アップデート内容まとめ

この間0.6.0がリリースされたと思ったらその10日後に0.7.0がリリースされ、そしてその2日後に0.7.1がリリースされました。
いろいろパワーアップしたり追加されたりしているので新しい記事として書くことにしました。
長くなるので0.7.0の記事と0.7.1の記事を分けます。

# 廃止されたもの

## XPCDictionary

今まで使用していた全てのXPCDictionaryは[String: SourceKitRepresentable]に置き換えられました。

## VariableNameMinLengthRule、VariableNameMaxLengthRule
代わりにVariableNameRuleに統合されました。

### VariableNameRule

内容自体は以前のVariableNameMinLengthRule、VariableNameMaxLengthRule、VariableNameRuleが合わさったものと考えればいいと思います。

.swiftlint.ymlでは以下のように記述します([Configuration](https://github.com/realm/SwiftLint#configuration)から抜粋)。

```
variable_name:
  min_length:
    error: 4 # only error
  max_length: # warning and error
    warning: 40
    error: 50
  excluded: # excluded via string array
    - id
    - URL
    - GlobalAPIKey
```

従来まではerrorやwarningの値を定義するときは以下のように記述していましたね。

```
<rule name>:
- <数値> # warning
- <数値> # error
```

## ViolationLevelRule
代わりにConfigProviderRuleとSeverityLevelsConfigが加わりました。

### ConfigProviderRule

ConfigProviderRuleはプロトコルです。
ちゃんとわかっていないのでぼかしますが、ルールはこれに則っているべき、とかそういうかんじだと思います(後日ちゃんと書き直そうと思います)。

[参考：CONTRIBUTING.md](https://github.com/realm/SwiftLint/blob/e9897c1b44e4ee614f1e7d1574c3f6161ea02022/CONTRIBUTING.md#configproviderrule)

### SeverityLevelsConfig

warning、errorがこれに該当します。

[SeverityLevelsConfig.swift](https://github.com/realm/SwiftLint/blob/e9897c1b44e4ee614f1e7d1574c3f6161ea02022/Source/SwiftLintFramework/Rules/RuleConfigs/SeverityLevelsConfig.swift)

READMEによると、”severity”という文字列を明示的に記述することも、省略することもできるようです。

```
force_cast: warning # implicitly
force_try:
  severity: warning # explicitly
```

さらに数値をカスタマイズするときの”warning”, “error”文字列ですが、これも明示的に記述することも、省略することもできるようです。

```
# implicitly
line_length: 110
# they can set both implicitly with an array
type_body_length:
  - 300 # warning
  - 400 # error
# or they can set both explicitly
file_length:
  warning: 500
  error: 1200
```

# 強化されたもの

## TypeBodyLengthRule

コメント行や空行はカウントされなくなりました。

## FunctionBodyLengthRule

コメント行や空行はカウントされなくなりました。

## TypeNameRule、VariableNameRule

NameConfigを用いたConfigProviderRuleに準拠するようになり、min_length(最小文字数)、max_length(最大文字数)、excluded names(ルール適用外文字列)を指定できるようになりました。

## CyclomaticComplexityRule

新しく追加されたルールです。直訳すると「循環的複雑度に関するルール」です。

循環的複雑度について[この記事](http://saturday-dory-fever.blogspot.jp/2012/04/cyclomatic-complexity.html)をもとにざっくりと理解したところでは「ある1つの関数がどれだけ複雑なのかを表した指標」であり、「デフォルトで数値は1で、条件分岐が増えるごとに＋1される」といったかんじでしょうか。

<img width="724" alt="スクリーンショット 2016-01-27 15.10.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/100736/b401f794-35cc-e49c-677b-e81fb28bffbe.png">

SwiftLintのCyclomaticComplexityRuleでは、complexityを10以下に抑えないと警告が表示されます。

complexityが増えるキーワードとされているものは以下の通りです。
`foreach, if, switch, case, guard, for, repeatwhile, while`

## 全てのルール

全てのルールはSeverityConfigに基づいてwarningなどのseverityを設定できるようになりました。

# バグFix

* ネストされた設定ファイルを使用した時に無限再帰が発生してしまってクラッシュする問題が修正されました。
* NULL文字が含まれていた場合にクラッシュする問題が修正されました。
canvasで半透明な線を書く方法

いろいろ検索してみたけど、canvasで半透明な線を書く方法が見つからなかったので、透明な線が引けるお絵かきツールのソースを読んでまとめました。

# 方法その1

```js
var last_image, pos, down = false;
var canvas;
var ctx = canvas.getContext('2d');
var getPos =  function(evt) {
    var rect = canvas.getBoundingClientRect();
    return {
        x: (evt.clientX - rect.left),
        y: (evt.clientY - rect.top)
    };
};

canvas.addEventListener('mousedown', function (e) {
    down = true;
    last_image = ctx.getImageData(0, 0, canvas.width, canvas.height);
    ctx.beginPath();
    pos = getPos(e);
    ctx.moveTo(pos.x, pos.y);
}, false);
window.addEventListener('mousemove', function (e) {
    if (!down) return;
    ctx.putImageData(last_image, 0, 0);
    pos = getPos(e);
    ctx.lineTo(pos.x, pos.y);
    ctx.stroke();
}, false);
window.addEventListener('mouseup', function (e) {
    if (!down) return;
    ctx.putImageData(last_image, 0, 0);
    pos = getPos(e);
    ctx.lineTo(pos.x, pos.y);
    ctx.stroke();
    ctx.closePath();
    down = false;
}, false);
```

この方法は、canvasの状態を保存しておいて、mousemoveで次の線を引く時に保存しておいたcanvasに戻してから引き直すといった方法です。
canvasを元の状態に戻しても、pathはそのままなので描き始めから半透明で書くことができます。
canvasを一つしか使いたくない場合はこの方法がオススメです。

# 方法その2

```js
var last_image, pos, down = false, last_pos;
var myCanvas, mainCanvas;
var myCtx = myCanvas.getContext('2d');
var mainCtx = mainCanvas.getContext('2d');

var getPos =  function(evt) {
    var rect = mainCanvas.getBoundingClientRect();
    return {
        x: (evt.clientX - rect.left),
        y: (evt.clientY - rect.top)
    };
};

mainCanvas.addEventListener('mousedown', function (e) {
    down = true;
    myCtx.clearRect(0, 0, myCanvas.width, myCanvas.height);
    myCtx.save();
    last_image = mainCtx.getImageData(0, 0, mainCanvas.width, mainCanvas.height);

    last_pos = getPos(e);
    mainCtx.globalAlpha = myCtx.globalAlpha;
    myCtx.globalAlpha = 1.0;
}, false);
window.addEventListener('mousemove', function (e) {
    if (!down) return;
    myCtx.beginPath();
    myCtx.moveTo(last_pos.x, last_pos.y);
    last_pos = getPos(e);
    myCtx.lineTo(last_pos.x, last_pos.y);
    myCtx.closePath();
    myCtx.stroke();

    mainCtx.putImageData(last_image, 0, 0);
    mainCtx.drawImage(myCanvas, 0, 0);
}, false);
window.addEventListener('mouseup', function (e) {
    if (!down) return;
    myCtx.beginPath();
    myCtx.moveTo(last_pos.x, last_pos.y);
    last_pos = getPos(e);
    myCtx.lineTo(last_pos.x, last_pos.y);
    myCtx.stroke();
    myCtx.closePath();
    myCtx.restore();

    mainCtx.save();
    mainCtx.putImageData(last_image, 0, 0);
    mainCtx.drawImage(myCanvas, 0, 0);
    mainCtx.restore();

    down = false;
}, false);
```

この方法は、その1を少し応用したもので、描画用のcanvasに描いて、それを表示用に半透明にしてコピーするといった感じです。
canvasが2つ必要ですが、一筆の間に色や太さを帰ることができるメリットがあります。

# まとめ

一筆で半透明な線を書くには、一旦canvasを保存しておいて、描画するたびに元に戻す作業が必要みたいです。(?)
compoundでTwitter認証

Node.jsのcompoundでTwitter認証しようと思ったら想像以上に苦戦したのでメモ

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

```zsh
$ npm install compound-passport passport passport-twitter
```

# config/passport.ymlを作成

```yaml
development:
  baseURL: 'http://localhost:3000/'
  twitter:
    apiKey: TWITTER_CONSUMER_KEY
    secret: TWITTER_CONSUMER_SECRET
production:
  baseURL: 'http://example.com:3000/'
  twitter:
    apiKey: TWITTER_CONSUMER_KEY
    secret: TWITTER_CONSUMER_SECRET
```

# config/autoload.jsを編集

`'compound-passport'`を追加

```js
var defaultModules = [
    'jugglingdb',
    'co-assets-compiler',
    'compound-passport'
], developmentModules = [];
```

# Userモデルにメソッド追加

モデルのプロパティは適宜読み替えてください

```js
User.findOrCreate = function (data, done) {
   /* TWITTER */
   if (data.twitterId) {
       var twitterdata = data.profile._json;
       User.all({
           where: {
               uid: twitterdata.id
           }, limit: 1
       }, function (err, user) {
           if (user[0]){
               user[0].name = twitterdata.name;
               user[0].screenname = twitterdata.screen_name;
               user[0].icon = twitterdata.profile_image_url;
               user[0].save();
               done(err, user[0]);
           }
           else{
               console.log(twitterdata);

               console.log("create a new user");
               User.create({
                   uid: twitterdata.id,
                   name: twitterdata.name,
                   screenname: twitterdata.screen_name,
                   icon: twitterdata.profile_image_url
               }, done);
           }
       });
    }
};
```

# application_controller.jsに追記

this.userに格納しておくとviewから直接アクセスできるようになる

```js
before(function requireManager() {
    User.find(session.passport.user, function (err, user) {
        console.log(user);
        if (user) {
            req.user = user;
        }
        this.user = req.user;
        next();
    });
});
```

# ログアウト用のコントローラー作成

コントローラー内で以下のメソッドを呼べばOK

```js
req.logout();
res.redirect('/');
```

# おわりに

`/auth/twitter`にアクセスすることでTwitter認証できます。
このcompound-passportを使用すると、ライブラリを弄らないとaccesstokenは取得できないようですね。

# 参考
* https://github.com/1602/compound-passport
* [getperiodic/user.js at 65e2f9389133cf779537316bf5777c545e018072 · yawetse/getperiodic](https://github.com/yawetse/getperiodic/blob/65e2f9389133cf779537316bf5777c545e018072/webapp/app/models/user.js)
* [Authentication with Compound-Passport](http://www.tysoncadenhead.com/blog/authentication-with-compound-passport#.VBFdfmSDaFM)
1次元のパーリンノイズを扱う


Processingのnoiseメソッドみたいな1次元のパーリンノイズが欲しかったのでそれらしきパッチを書いたのと、Perlinノードが出力する値について書いた。

# パッチ
![Perlin.jpg](https://qiita-image-store.s3.amazonaws.com/0/26489/f407a6ff-95bd-bc53-299c-a91b0c7b23b3.jpeg)

一番下のグラフ出力はIOBoxで直近500件の出力値を表示しています。
いつもやり方を忘れるんだけど、右側のInspektorの通りに、Columnsを入力するSpreadと同じ値にして、Show ConnectionsをEnableにするとこういう表示になる。
音声入力を周波数ごとに波形表示したい場合なんかでよく使われてるっぽい。

# 入力値と出力値の関係について
Perlinノイズ自体の算出方法については、[パーリンノイズを理解する](http://postd.cc/understanding-perlin-noise/)を読むと良さそう。Perlinノードのinputピンになっている`Octaves` / `Frequency` / `Persistence`もそのまま出てくる。
で、一度読んでみたけどほとんどまともに理解できなかったので、入力値を変化させて出力される値がどう変化するか可視化してみました。

振幅値については、Minが負の方向、Maxが正の方向にPersistenceに応じた値(?)が出ている感じ。なので出力される値の幅を変えたい場合はPersistenceをいじれば良さそう。

inputの変化量を増やすと、単純に出力される値の変化量が変わる。グラフ的には時間軸方向に圧縮したようなイメージ。
![input.jpg](https://qiita-image-store.s3.amazonaws.com/0/26489/87969cde-8428-f456-ac89-2357aa73c2cf.jpeg)

一方、Frequencyの値を増やすと、値のアップダウン自体が小刻みになる。
![freq.jpg](https://qiita-image-store.s3.amazonaws.com/0/26489/8562db53-c2a0-9ec1-b2ba-a896ef581b42.jpeg)

Octavesの値を増やした場合はノイズ感が増える。ちなみに0にするとFrequencyが効かなくなるっぽい。
Persistenceの値を1以上にした場合はOctavesを増やすとわけわかんない値になるので厳しい。
![octave.jpg](https://qiita-image-store.s3.amazonaws.com/0/26489/745a0e23-72e7-6ef0-b9c9-2affdbdb778d.jpeg)


# 入力値のソースに使うノードについて

今回は[Integrate](https://vvvv.org/documentation/integrate-(differential))を使った。このノードは1秒ごとにPosition Inに指定した分だけ増えるように毎フレーム値を増やしてくれる。つまり1フレームごとの変化量は`PositionIn / FrameRate`の値となるので、フレームレートが落ちた場合にもコマ落ちしてるように見えるけど変化のスピードは変わらなくなる。

逆に、フレームレートが落ちた場合にも1フレームごとの変化量は一定であって欲しい場合は、FrameCountに対して好きな倍率を掛けて入力値のソースとして使うと良いと思う。

例えば60fpsで動いてる場合、Inに1を設定したIntegrateをソースに出力したPerlinノイズと、FrameCounterの出力値を60で割った値をソースに出力したPerlinノイズは、RandomSeedが同じならほぼ一緒。ただしフレームレートは一定ではないので多少誤差が出る。
![60fps.jpg](https://qiita-image-store.s3.amazonaws.com/0/26489/e6f0ec2c-b259-be7e-b39f-976c7531d59d.jpeg)

30fpsまでフレームレートが落ちた場合でも、FrameCounterを使用した側は1フレームごとの変化量を一定に保てる。
ただし、グラフの見た目は同じでも端から端へ移動するまでに60fpsで動いている時の倍の時間がかかっていることに注意。
![30fps.jpg](https://qiita-image-store.s3.amazonaws.com/0/26489/ac82b784-be88-5289-0bbc-2e63da8b3b0b.jpeg)