OmniAICreator/Qiita-1.07M huggingface dataset:
cygwinでSSHサーバを立てようとした時につまづいたメモ

こちらを参考に、cygwinでSSHサーバを立てようとしたがケアレスミスが多すぎなので反省のためにメモ。
http://osksn2.hep.sci.osaka-u.ac.jp/~naga/miscellaneous/winssh/winssha-4.html

#### パスワードを許可しない設定
今回は秘密鍵で認証しようとしてたので、パスワード認証を許可しない設定が必要だった。
こちらを参考にした。
https://sites.google.com/site/himazu/ssh-on-cygwin

```
#PasswordAuthentication yes
→
PasswordAuthentication no
#ChallengeResponseAuthentication yes
→
ChallengeResponseAuthentication no
```

#### 権限を間違えていた。
公開鍵を作成して配置した後、権限を600にするのを忘れていた。
.ssh ディレクトリの権限は700。

#### authorized_keys の書き間違え
これが一番アホくさい。反省のため書いておく。
以下の点が特に注意。
- スペルに間違いないか  authorized_keys が正しい。
- 書き込んだ内容に間違いがないか
    - catで書き込んでいる時、違うファイルを使って書き込んでしまった。
- 実行コマンドの制限を付けようとして誤って編集した。
Visual Studio 2017のインストーラにElectronが使われてる

本日 [Visual Studio 2017](https://www.visualstudio.com/vs/) が正式リリースされました :clap: 
キーノートだけでもと思いぼーっと放送を眺めていましたが，Live Unit Testing や コードリファクタリング周りが印象に残った部分でした．

で表題ですが，インストーラを使って少しUIで ん？ っと思った方もいらっしゃると思います．

![UI.png](https://qiita-image-store.s3.amazonaws.com/0/104085/9259f653-85c4-8a2b-c7e7-852226f8809e.png)

気になる...気になりますよね?

ということでインストーラのディレクトリを見てみましょう．

`C:\Program Files (x86)\Microsoft Visual Studio\Installer` 以下にインストーラが展開されています．
そのディレクトリには node.dll の文字が...ん，これは...
そしてディレクトリとして `Assets, locales, resources`となんとも見覚えのある様なディレクトリ構成です．

そこで resources 以下を見てみると，いました， `electron.asar`!!!

...とここまで見てある程度満足してしまったのでこれ以上の掘り下げはなしでした．

app以下に配置されている `ThirdPartyNotices.txt` や `package.json`を眺めてライブラリに何が使われているのかじっくり見てみると楽しいのかもしれません．

印象的だったのはフロントに React とかではなく，riot.js が使われていました，わかる．
JScriptでBase64にエンコード、デコード

過去にどこかで拾ったもの
とりあえず、保存の意味で書き込み

超便利です
作者さんありがとうございます



```base64.js

/**
 * :: base64.js  BASE64の読み書きを行なうバッチ
 * 
 * エンコード方法：
 *   cscript //nologo base64.js encode 対象ファイル > hoge.txt
 * 
 * デコード方法：
 *   cscript //nologo base64.js decode hoge.txt 復元ファイルの保存パス
 * 
 **/

// ----------------- コマンドライン引数 --------------
var action_type = WScript.Arguments.Unnamed(0); // encode or decode
  //log( action_type );


// ----------------- 関数 --------------
function log(s){ WScript.Echo( s ); }


// エンコード実行
function base64encode( target_file_path )
{
  // ファイルをバイナリデータとして読み取り
  var stream = new ActiveXObject('ADODB.Stream');
  stream.Type = 1; // binary
  stream.Open();
  stream.LoadFromFile( target_file_path );
  var binary_data = stream.Read( -1 ); // -1:read all
  
  // 新規XMLデータを作成
  var xml = new ActiveXObject("Microsoft.XMLDOM");
  xml.loadXML('<?xml version="1.0" ?> <root/>');
  xml.documentElement.setAttribute("xmlns:dt", "urn:schemas-microsoft-com:datatypes");
  
  // バイナリデータを格納するためのノードを作成
  var node = xml.createElement("file-node");
  node.dataType = "bin.base64";
  
  // バイナリデータを格納
  node.nodeTypedValue = binary_data;
  xml.documentElement.appendChild( node );
  
  // そのノードからBASE64エンコード済み文字列を取り出す
  var base64encoded_text = node.text;
  return base64encoded_text;
};


// デコード実行
function base64decode( encoded_text_path, binary_file_save_path )
{
  // BASE64文字列を取得
  var fso_r = WScript.CreateObject( "Scripting.FileSystemObject" );
  var base64str = fso_r.OpenTextFile( encoded_text_path, 1 ).ReadAll();
  
  // 新規XMLデータを作成
  var xml = WScript.CreateObject("Microsoft.XMLDOM");
  
  // BASE64文字列を格納するためのノードを作成
  var node = xml.createElement("base64-node");
  node.dataType = "bin.base64";
  
  // バイナリデータを取得
  node.text = base64str;
  var binary_data = node.nodeTypedValue;
  
  // 書き込み
  var sw = new ActiveXObject("ADODB.Stream");
  sw.Type = 1; // binary
  sw.Open();
  sw.Write( binary_data );
  sw.SaveToFile( binary_file_save_path );
  sw.Close();
};


// ----------------- メイン処理 --------------
if( action_type == "encode" )
{
  var target_file_path = WScript.Arguments.Unnamed(1);
  //log( target_file_path );
  var ret =  base64encode( target_file_path );
  
  // エンコード結果を出力
  log( ret );
}
else if( action_type == "decode" )
{
  var encoded_text_path = WScript.Arguments.Unnamed(1);
  var binary_file_save_path = WScript.Arguments.Unnamed(2);
  
  // デコード結果を保存
  base64decode( encoded_text_path, binary_file_save_path );
}

```


これでファイルを「文字」にしてしまえば、メールの本文で送ることもできちゃうヨ
JenkinsでStoryBookとかJavaDoc表示したいときのContent Security Policy

JenkinsのHTML PublisherでStoryBookとかJavaDoc表示しようとしていつもハマるのでメモ

とりあえず許可するには管理 > スクリプトコンソールに以下を入力

```
System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "default-src 'self'; img-src 'self' data:; style-src 'self' 'unsafe-inline'; child-src 'self'; frame-src 'self'; script-src 'self' 'unsafe-inline';")
```

- webpackとかで画像をbase64エンコードして使ってる場合は`img-src 'self' data:`が必要
- inline css使ってるときは`style-src 'self' 'unsafe-inline'`が必要
- scriptタグとか使うとき?は`script-src 'self' 'unsafe-inline'`が必要

chromeは明示的にキャッシュ破棄して再読込しないと反映されないので注意

参考URL: https://developer.mozilla.org/ja/docs/Web/Security/CSP/CSP_policy_directives
【読書メモ】レビューについて(WEB+DB Press No.96)


[WEB+DB PRESS Vol.96 Amazon](https://www.amazon.co.jp/WEB-DB-PRESS-Vol-96-PRESS%E7%B7%A8%E9%9B%86%E9%83%A8/dp/4774185787/ref=sr_1_2?s=books&ie=UTF8&qid=1488926870&sr=1-2&keywords=Web%2BDB)

* レビュー依頼する人はレビュー担当を明示する
* レビューアに対する気遣いを
	* 何をする修正かを明確にする
	* チケットへのリンクを添える
	* 制限事項があれば先に伝えておく（「xxxの不具合には気づいているが、影響範囲が大きいため今回は修正してません」とか）
	* コメントでの対応が時間かかるなら直接話すでもOK
	* コミットは意味のある単位で細かく分ける
* レビュー依頼テンプレートを作る
	* 何を解決するのか
	* レビューポイント
		* 見るべき場所
		* 見ないでも良い場所
		* スコープを明確にする
* レビュー指摘
	* 期待する結果を伝える
	* 感情を伝える（絵文字など）
	* レビューイに対する気遣いを
	* 褒めるのもアリ

* オフラインも使い分ける
	* 判断が難しい箇所
	* 短時間で高密度なやりとり

* チャットを活用
* レビュー当番
	* 期間ごとにレビュー担当を持ち回る
* レビュータイム
	* １日のうちある時間帯をレビュータイムとして決める
* チャットbot
	* レビューアを機械的に決める
* 属人性を排除
	* スキルの高い／低い
	* 業務知識の有無
	* に左右されずにレビューする
* レビューアを2人体制にするとかも
SalesForceとMarketoをつなぐにあたって気をつけたこと

WantedlyではMarketoを使っていますが、営業チームの拡大に伴ってSalesForceを導入しています。
自社DBのつなぎ込みも含めて、確認したポイントをメモ。

※随時更新予定
## 概要
SFとMAの更新の概要は[このあたり](http://docs.marketo.com/pages/releaseview.action?pageId=7511115)を読んだら概要をつかめるかとおもいます。
逆に言うと公式ではMarketo側のこのドキュメント以外あるんでしょうか。
SF側のドキュメントは多すぎて、いいのがあるかどうか不明。。。

## リードの連携に関して

- 最初の同期はSF→MAの方向で行われる。SF側の情報が親
- SFのLeadとConcactオブジェクトが、MAのLeadオブジェクトとして同期される
- 同期後、Ma側にSFDCTypeなるカラムが作られ、そこにLeadなのかContactなのかが保持される
- 同期の際のキーは、``SFDC ID``というカラム
- つまり、Emailをキーにして既存のMA側のリード存在すればそのリードが更新されるようなことはなく、初めの同期の際にSFに存在するリードがすべて新しく作られる。
- なのでもし、自社DBからMAにリードを送り込んでいるのを（自社DB↔MA）、自社DBからSFにリードを送りSFとMAを同期させる形に変える場合（自社DB↔SF↔MA）、一時的に大量の重複リードが発生する
 - とても手動でマージしきれない場合はMarketo社に一括マージを依頼することができる

個人的には、**SFのLeadとConcactオブジェクトが、MAのLeadオブジェクトとして同期される**というところが一番ポイントでした。
これは自社DBとのつなぎ込みの柔軟性があがって嬉しかったです。
LeadとContactは対等なオブジェクトっていうイメージができました。

詳しくは、Marketo社問い合わせた時の回答がとてもわかり易かったので、載せておきます。

【質問】

```
ドキュメントのような連携で、MarketoのLeadと同期されるのは、 
- Sales ForceのLead(リード) 
- Sales ForceのContact(取引先責任者) 
という認識で間違いはないでしょうか。 
また、同期のキーについては、 Emailでしょうかそれとも他のもでしょうか？
```

【回答】

```
MarketoではLeadと呼んでおりますが、SalesforceのLead, Contact両方のオブジェクトのレコードが同期対象となります。 
- Sales ForceのLead(リード) 
- Sales ForceのContact(取引先責任者) 

なお、SFDCとマルケトを連携しますと、SFDC Typeというフィールドに自動的にLeadかContactという値が入りますので、スマートリストのSFDCのタイプ(SFDC Type)というフィルターを使ってSFDCと同期済みのリードのタイプがLead Contactなどをご確認頂けるようになります。 

マルケトのリードデータベースにリードを追加する際に、キーとなるのはEmailアドレスですが、Salesforceからマルケトに最初に同期されてくる際は、SFDC IDがキーとなっております。そのため、例えば、マルケト内で先に作成されたリードA(Salesforceと未同期の状態)と、SFDCから同期されるリードBは、実は同じメールアドレスの同一人物だとしても、重複リードとしてマージされることはなく、リードBがマルケトに同期される際は新規の別リードとして作成されます。 

リストのインポートや、フォーム入力ではメールアドレスをキーに、既存のリードのデータが更新されますが、Salesforceとの連携時に、Salesforce側からマルケトに作成されるリードの場合は、同じメールアドレスであっても、マージされることはございません。そのため、もしSalesforceのLeadとContactに同じメールアドレスのレコードが存在した場合、それらも別々のリードとしてマルケトに同期されてくることになります。SFDC側で重複のレコードがある場合は、可能であれば先にSalesforce側でマージしておくことをお勧めしております。 
また、マルケトにSalesforceのLeadやContactが同期された後、マルケトに同じメールアドレスのリードが既に存在している場合は、手動でマージして頂くことが可能です。 
```

この同期構造についてMarketoに問い合わせたときは素早く丁寧な回答が帰ってきて感心しました。

## Sandbox環境に関して
SalesforceのSandbox環境は無料で作れますが、Marketo側のSandbox環境は有料。
必要かなと思う場合は、予め担当の方に問い合わせてみて下さい。

弊社の場合は先にMarketoが動いていたので本番で検証したくなかったですが、Sandbox環境なのに結構工学だったのも有り、SF側に最小の情報を入れて、しっかり確かめながら本番で同期を検証しました。男気検証。

## カラムに関して
SFにあるAccount, Contact, Leadのカラムのうち、同期に使用するSFユーザーのPropertyでVisibleになっているカラムはすべてMAのLeadにカラムとして追加されます。

例えばAccountとContactにcompany_idみたいなカラムを持たせていて、両者をVisibleな状態でMAと同期させた場合、MAのLeadには、

- company_id(L)※Lead
- company_id(A)※Account

の２つのカラムが追加されてしまいます。

こんな感じ
![スクリーンショット 2017-03-08 7.44.37.png](https://qiita-image-store.s3.amazonaws.com/0/106253/c5dbf295-9bd8-2a5c-0de6-1f382bce7898.png)



結構カオスになりがちなので、初めの同期の際はなるべく注意しましょう。
【読書メモ】Web API: The Good Parts




* Web API を公開する
* Web API を美しく設計する（ただしRESTにこだわりすぎない）
* URIの設計
	* 短く入力しやすい
	* 人間が読んで理解できる
		* 一般的な英単語を使う → [ProgrammableWeb](https://www.programmableweb.com/category/all/apis) のAPIディレクトリが参考になる
	* 大文字小文字が混在していない
	* 改造しやすい
	* サーバ側のアーキテクチャが反映されていない
	* ルールが統一されている
* URIがリソース、メソッドが操作
* リソースは複数形の名詞を使う
* クエリパラメータとパスの使い分け
	* 一意なリソースを表す情報 → パスに含めるのが適切
	* 省略可能な情報 → クエリパラメータ
* SSKDs (Small Set of Known Developers) : 少数の既知の開発者
* LSUDs (Large Set of Unknown Developers) : 大多数の未知の開発者
* 1ページ 1APIコール / 1セーブ1APIコール
	* 速度 = UXを優先
	* 表示や保存するデータの整合性の保証
	* https://www.youtube.com/watch?v=8BsrAblL23U
		* 2016 http://boston2016.apistrat.com/
	* オーケストレーション層
* HATEOAS (hypermedia as the engine of application state)
	* APIのレスポンスの中に次のアクションを呼び出すAPIのURLが埋め込まれている
	* REST Level3
	* https://www.slideshare.net/philharveyx/http-caching-ftw-rest-fest-2013
	* アプリケーションは先頭ページのAPIのURLだけをハードコードすれば良い

* レスポンス
	* データ構造
		* メタデータは出来るだけHTTPヘッダを利用
		* JSONPではHTTPヘッダ利用できないためレスポンスボディの中にメタデータを格納する必要あり
		* レスポンスに必要なk項目をユーザが選択可能な仕組みもアリ
		* 基本フラット、必要に応じて階層化
		* トップレベルはオブジェクトとする（配列の場合JSONインジェクションの懸念）
	* フォーマット
		* データ名
			* 少ない単語
			* 連結方法は統一（キャメルケースが一般的）
			* 単数形/複数形を意識する
		* 性別(sex? or gender?)
			* 医療系: 生物学的 sex
			* EC,SNS: 社会的 gender
		* 日付
			* RFC 3339 を推奨 ([RFC 3339の日付形式](https://wiki.suikawiki.org/n/RFC%203339%E3%81%AE%E6%97%A5%E4%BB%98%E5%BD%A2%E5%BC%8F))
			* TimeZoneはUTCを推奨
			* HTTPヘッダの場合は RFC822 に従う
		* id (巨大な整数)
			* javascriptで扱うと誤差が生じる場合あるので、そのときは文字列として扱う
* エラー
	* HTTPステータスコードを設定する
	* 詳細情報はボディ?ヘッダ? => ボディが一般的

	* メンテナンス時
		* ステータスコードは 503
		* Retry-After ヘッダでメンテナンス終了予定を示す
	* セキュリティの観点で詳細な情報は返さないケースも考慮する
		* 開発時は詳細返すが本番では返さないというのもあり

* HTTP仕様
	* ステータスコード
		* 200系
			* POST成功 201
			* 削除成功 204
			* その他成功 200

	* キャッシュ
		* Varyヘッダを設定する

	* CORS
	
* 変更しやすいAPI
	* バージョン管理
		* Semantic Versioning http://semver.org/
		* メジャーバージョンのみURIに含める（滅多に上がらない）
		* できる限り後方互換を残す方法（マイナーバージョンアップ）で対応
		* エイリアスは不要(バージョンは明示的に指定される方が良い）
	* 廃止
		* Blackout test
		* HTTP status 410 (Gone)
	* オーケストレーション層
		* OSFA (One size fits all) = 最大公約数的 : サイズが大きく無駄になる
		* [The future of API design: The orchestration layer](https://thenextweb.com/dd/2013/12/17/future-api-design-orchestration-layer/#.tnw_PJRf3sRs)
		* クライアントアダプタ: [The Netflix Tech Blog: Embracing the Differences : Inside the Netflix API Redesign](http://techblog.netflix.com/2012/07/embracing-differences-inside-netflix.html)
		* AWS であれば API Gateway で実現できる？

* セキュリティ
	* https化
	* 特別なヘッダがついてなければ処理しない
	* Content-Type を正しく設定(application/json)
	* X-Content-Type-Options: nosniff
	* JSONの文字列をエスケープ
	* JSONのトップレベルはオブジェクトにする
	* セッション管理をWebページとは切り離す
	* ブラウザからの利用を制限するために特定のヘッダの値をチェックする
	* Rate limit の実装(Flaskの場合) http://flask.pocoo.org/snippets/70/


## サポートページ

* http://takaaki.info/web-api-the-good-parts/

## 参考リンク

* [Web API: The Good Parts | 水野 貴明 |本 | 通販 | Amazon](https://www.amazon.co.jp/Web-API-Parts-%E6%B0%B4%E9%87%8E-%E8%B2%B4%E6%98%8E/dp/4873116864/ref=sr_1_1?s=books&ie=UTF8&qid=1488926727&sr=1-1)
* [これから始めるエンタープライズ Web API 開発 | オブジェクトの広場](https://www.ogis-ri.co.jp/otc/hiroba/technical/WebAPI/part2.html)
Rubyで指定した要素に対してArray#flattenを実行する

Rubyには `flatten` という配列を再帰的に平坦化するメソッドがあります。ただ、この `flatten` は全ての要素に対して実行されるので「指定した要素だけを平坦化したい」ということは出来ません。

```rb
p [[1,2],[3,4],[5,6]].flatten   #=> [1, 2, 3, 4, 5, 6]
p [[1,2],[[3,4],[5,6]]].flatten #=> [1, 2, 3, 4, 5, 6]
```

そこで、指定した要素だけを平坦化出来るようなコードを書いてみました。

```rb
class Array
  def flat_at(index, level = nil)
    insert(index, *[delete_at(index)].flatten(level))
  end
end

p [[1,2],[3,4],[5,6]].flat_at(1) #=> [[1, 2], 3, 4, [5, 6]]
```

これで、指定した要素だけ `flatten` が実行出来るようになりました :muscle:


## おまけ

上のコードを書いてる時に `flatten` が引数を取れることを知りました。 再帰の深さを引数で指定出来るみたいです。

```rb
p [[[1]]].flatten    #=> [1]
p [[[1]]].flatten(0) #=> [[[1]]]
p [[[1]]].flatten(1) #=> [[1]]
p [[[1]]].flatten(2) #=> [1]
```

## 参考サイト

https://docs.ruby-lang.org/ja/latest/class/Array.html#I_FLATTEN
link > A list of cost functions used in neural networks, alongside applications

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
GNU bash, version 4.3.8(1)-release (x86_64-pc-linux-gnu)
```

TensorFlowで扱っているNeural Networkの誤差関数について。

http://stats.stackexchange.com/questions/154879/a-list-of-cost-functions-used-in-neural-networks-alongside-applications

- cost functionの定義
- cost functionが出力のerror計算に使われるための式
- cost functionとして要求される２つの特性
- 様々なcost functions
  - Quadratic cost
  - Cross-entropy cost
  - Exponentional cost
  - Hellinger distance
  - Kullback–Leibler divergence
  - Generalized Kullback–Leibler divergence
  - Itakura–Saito distance
link > Neural Networks and Deep Learning by Michael Nielsen

TensorFlowで検討しているNeural Networkについて、誤差関数の考察を深めようとしている。

その中で読んでいる
http://stats.stackexchange.com/questions/154879/a-list-of-cost-functions-used-in-neural-networks-alongside-applications
にある以下の記述。
> This notation is from Neilsen's book.

http://neuralnetworksanddeeplearning.com/index.html

これが今の自分にあった資料かは不明。
Android Studio 2.3 (Gradle 2.3.0)でDatabindingがビルドエラーになるときの対処方法

下記の方法で対処した。

app/build.gradle

```
apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt'

..省略

dependencies {
    apt 'com.android.databinding:compiler:2.3.0'
}
```


###参考

http://stackoverflow.com/questions/42583759/databinding-not-working-after-upgrade-android-studio-2-3
TensorFlow > link > gradient clipping 

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
GNU bash, version 4.3.8(1)-release (x86_64-pc-linux-gnu)
```

https://github.com/tensorflow/tensorflow/issues/323
を読んでいて、以下が気になった。

> vincentvanhoucke commented on 25 Nov 2015
> ...
> Another possibility is to use gradient clipping in general (see: clip_by_norm(), which we should provide better examples for).

gradient clippingとは何か。

https://www.quora.com/What-is-gradient-clipping-and-why-is-it-necessary
> ... This is called the vanishing gradient problem. ... On the other hand, you can have exploding gradients too. ... **Gradient clipping** will clip the gradients between two numbers to prevent them from getting too large.

勾配消失問題については「深層学習」by 岡谷貴之さん p54において、事前学習で回避する、と記載がある。
一方でexploding gradients問題はgradient clippingで対応するというのが上記の記載から見られる。

https://www.tensorflow.org/api_docs/python/tf/clip_by_norm
> Given a tensor t, and a maximum clip value clip_norm, this operation normalizes t so that its L2-norm is less than or equal to clip_norm, along the dimensions given in axes.
技術英語 > zip() stops when the shortest sequence is done > itertools のzip_longest()を教えていただきました

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 2241 / 12833)

> zip() stops when the shortest sequence is done

http://ideone.com/eyZBSm

```py
alist = [ 'A', 'B', 'C', 'D' ]
blist = [ 1, 2, 3 ]

for alph, num in zip(alist, blist):
	print(alph, num)
```

```txt:結果
Success	time: 0 memory: 23352 signal:0
('A', 1)
('B', 2)
('C', 3)
```

### 教えていただいた事項
(追記 2017/03/24)

@Tsutomu-KKE@github さんの[コメント](http://qiita.com/7of9/items/4e58cddbd72b7e1b3036/#comment-d160c72ca9dff399c9ce)にてitertools の`zip_longest()`を教えていただきました。

情報感謝です。
SwiftでC言語みたいな関数ポインタ呼び出しを使いたいんですけど

Oさんからの質問です。

Q.
swift3 で C でいうところの関数ポインタ呼び出しをしたいのですが可能でしょうか？
そもそも不可能だったりしますか？
以下擬似コード

```swift:q.swift
var _action //こんな変数を用意する
func foo( action: ( ( Void ) -> Void )? = nil )
{
    _action = action // 別変数に代入する
}
func bar()
{
    _action() // こんな感じで呼び出す
}
```
知っている方教えてくださいませ！


A.
こんな感じですかねぇ。
以下、プレイグラウンド用。

```swift:a.swift
var _action :  ( ( Void ) -> Void )?

func hoge() {
    print("hello")
}


func foo( action: ( ( Void ) -> Void )? = nil )
{
    _action = action
}


func bar() {
    _action?()
}

foo(action: hoge);
bar();

```
Git Bashにて、irbが反応しない

<h1>困ってること：irbが反応しない</h1>
<p>Git Bash上でirbを実行しようとしたところ、「"Hello!」と打ち間違えて以降反応しなくなってしまった。つまり、「>」が表示されなくなってしまった。</p>
<p>exit end quitなどを打ってみてもうんともすんとも言わない。</p>

<h7>動かないirb</h7>
![irbが動かない.PNG](https://qiita-image-store.s3.amazonaws.com/0/166086/ca7451ee-ff04-075c-6dfa-00d73508df34.png)


<p>色々調べても解決策が見当たらない…困った…と思っていたらなんか動いてた(5~10分後でした)</p>
![irb動いた！.PNG](https://qiita-image-store.s3.amazonaws.com/0/166086/b151fa06-ef1c-ccf0-f491-0479a017ea26.png)

<p>「^C」ってどういう意味なんだろう…なにはともあれ勝手に復帰してくれた。そのあと"Hello!"と打ち込むと無事反応。ヨカッタヨカッタ。</p>

<p>とりあえず「^」はハットキャレットと読み、「べき乗を表す演算子」らしい。<br>
例：「=3^2」は、「3の2乗」<br>
だって。へー。<br>
でもここの使われ方はまた違う意味のような気がするけどな…</p>

<p>なにはともあれ、一件落着。</p>
リンクの状態に合わせたCSS

<h4>リンクの状態</h4>

<table>
    <tr>
        <th>要素</th>
        <th>状態</th>
    </tr>
    <tr>
        <td>link</td>
        <td>遷移先のWebサイトに訪問したことがないリンク。</td>
    </tr>
    <tr>
        <td>visited</td>
        <td>遷移先のWebサイトに訪問したことがあるリンク。</td>
    </tr>
    <tr>
        <td>hover</td>
        <td>現在マウスを置いているリンク。</td>
    </tr>
    <tr>
        <td>active</td>
        <td>現在クリックなどを選択しているリンク。</td>
    </tr>
</table>

使い方

```sample.css
a:link{
    color: red;
}
//まだクリックしたことがないリンクを赤い文字にする
```
Ethereumプライベートネットワークのアカウント作成まで

#はじめに
EthereumのクライアントGethを使って開発を行うときに必要となるアカウント作成までの手順を備忘のためにメモします。

Geth 1.5.9-stable-a07539fbがインストールされたことを前提にし、プライベートネットワーク(以下、PN)で立ち上げる場合について書きます。

#genesis.jsonファイルを作成
まず、PN関連のデータを入れておくディレクトリ`sample_eth_pn`(一例)を作成します。

```
$ mkdir ${HOME}/sample_eth_pn
```

genesis.jsonファイルを次(一例)のように記述し、上のディレクトリの中に配置します。

```json
{
    "nonce": "0x0000000000000042",
    "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "difficulty": "0x200",
    "coinbase": "0x0000000000000000000000000000000000000000",
    "timestamp": "0x00",
    "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "gasLimit": "0xffffffff"
}
```

#genesisブロックを作成

次のコマンドを実行して、上のgenesisファイルを用い、ブロックチェーンの先頭となるgenesisブロックを生成します。

--datadirオプションをつけているのは、データベースとキーストアのファイルを保存するディレクトリへのパスを指定するためです。

```
$ geth --datadir ${HOME}/sample_eth_pn init ${HOME}/sample_eth_pn/genesis.json
```

この処理が完了すると、ブロックチェーンが初期化された状態になります。

#Gethを起動

次のコマンドにより、Gethをプライベートネットワークで立ち上げます。
```
$ geth --datadir ${HOME}/sample_eth_pn console
```

#アカウントを作成

コンソールが起動しているので、`> `に続けて、次のコマンドを実行します。

```
> personal.newAccount()
```

次に、`Passphrase:`を聞かれますので、そのアカウントのパスワードとなる任意の文字列を入力します。続けて、`Repeat passphrase: `に同じ値を入力します。

`New wallet appeared:(省略)`のメッセージの下に、新しく作成したアカウント(16進数20文字の文字列)が緑色で表示されます。
例: `"0x39465c7186ac60a930329cb8c5c3fbce9bc0a25c"`

#アカウントを確認

正常に作成できたことを確認するには、次のコマンドを実行します。

```
> eth.accounts
```

すると、["0x39465c7186ac60a930329cb8c5c3fbce9bc0a25c"]というアカウントリストのメッセージが返ってくるはずです。現状、一つのアカウントを作成しているので、一つだけですが、複数のアカウントを作成すると、このリストの中にアカウントが増えていきます。

#Gethの終了

次のコマンドでGethを終了します。

```
> exit
```



#参考リンク
[Ethereum(geth)でプライベート・ネットワークを作る手順](http://qiita.com/hshimo/items/8b69975d40466022f278)
[ブロックチェーンEthereum入門 2](http://www.intellilink.co.jp/article/column/ethereum02.html)
[Ethereum Geth コンソールコマンド一覧](http://qiita.com/toshikase/items/fa7a826db483177d1e80)
[Command Line Options](https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options)
kintoneを選んだ理由

筆者は、起業して13年ほど立ちます。当初は、Javaのプログラム開発や、ゲームサービスのバックエンド開発などをするプログラマーでしたが、10年くらい前からは、WordPressの開発を中心とした「Web制作業」を主としています。

そんな私が、なぜ kintoneを使うに至ったかについて書き留めておきます。

## 最初はクライアントさんからのご相談

これまでも、Web制作のクライアントさんから、例えば「お問い合わせのデータを、一覧で管理したい」と言ったご要望や「（教室などで）生徒のデータを Excelで管理しているが、管理しきれなくて困っている」といったご相談を受けることがありました。

しかし、だからといって簡単に「では、Webシステムを組んで解決しましょう」というわけにはいきませんでした。

- 開発費用が高額になる
- システムの要件をまとめるまでに非常に時間がかかる
- 個人情報を扱う場合などは、サーバーのセキュリティが重要に
- 作り上げた後の保守・要件の変更などに対応していくのが大変

等の理由から、ほとんどお応えすることができずにいました。

## データの価値

そんな相談を受け続けている中で、昨年くらいから私自身が「中小企業に眠っているデータの価値」というものに注目をし始めました。お問い合わせの履歴や、さまざまな記録、人事データを管理することでそれに付随するログデータ（勤務時間など）やお金の管理など、データを蓄えていくことで、それを分析したり、Web上のシステムと連携したりと活用することができるのではないかと考えました。

そこで、次のようなデータベース製品を選定し、「中小企業のデータ活用」に役立つ製品を探しました。

- Microsoft Access
- FileMaker
- Salesforce
- nyoibox
- ZOHO CRM

これらの中で、最終的に残ったのが「kintone」でした。主な選定理由としては次の通りです。

- クラウドベースである
- サーバーの安全対策に信頼性がある
- インタフェースが良い意味でやぼったく、分かりやすい
- JavaScriptを利用してカスタマイズができる（スタンダードプラン）
- 料金がこなれている（月額 7,500円から（スタンダードプラン・5ユーザー））

そこで、kintoneを契約し、まずは自社のデータを kintoneに投入しながらあれこれ試してみました。すると、次のようなメリットがありました。

- 要件をあらかじめがっちり決めなくても、とりあえずいったん作成してデータを投入しながらあれこれいじれる
- 投入したデータを、とりあえずフィルタリングやグラフを作ることで、だいたいの様子が分かる
- その条件を保存しておくことで、定期的に集計データを確認できるようになる
- 標準機能でできないことがあったら、JavaScriptを使ってカスタマイズして解決できる

こうして、自分にとって手放せないサービスになったため、これならクライアントにもお勧めができると思い、弊社のサービスラインナップに加えることにしました。

ただ、ここまですんなり kintoneを理解でき、カスタマイズができるようになったのは、もともと Webプログラマーという土台があるため、データベースの知識や JavaScriptの知識などがあり、それが活かせたという部分は大きいです。Accessや FileMakerでは、このあたりの学習コストが大きいという点で導入に至らなかった部分はありません。

今後も Web業界の人として、kintoneの魅力を Qiitaや各種のセミナーなどを通じて紹介しながら、kintoneを使ってみたいというお客様のご要望にお応えしていきたいと思っています。

- [kintone導入・開発支援 \| H2O space](https://h2o-space.com/service/kintone/)
mllib

scala

/**
  * Created by tetsuya on 2017/03/08.
  */
import org.apache.spark.ml.classification.LogisticRegression
import org.apache.spark.sql.SparkSession
object HelloWorld {
  def main(args: Array[String]){

    val spark = SparkSession
      .builder()
      .appName("Spark Sample App")
      .getOrCreate()

    // Load training data
    val training = spark.read.format("libsvm").load("sample_libsvm_data.txt")

    val lr = new LogisticRegression()
      .setMaxIter(10)
      .setRegParam(0.3)
      .setElasticNetParam(0.8)

    // Fit the model
    val lrModel = lr.fit(training)

    // Print the coefficients and intercept for logistic regression
    println(s"Coefficients: ${lrModel.coefficients} Intercept: ${lrModel.intercept}")  }
}

build.sbt


name := "test"

version := "1.0"

scalaVersion := "2.11.8"

libraryDependencies ++= Seq(
  "org.apache.spark" %% "spark-core" % "2.0.0",
  "org.apache.spark" %% "spark-mllib" % "2.0.0",
  "org.apache.spark" %% "spark-sql" % "2.0.0",
  "com.databricks" %% "spark-csv" % "1.4.0"
)

assemblyMergeStrategy in assembly := {
  case PathList("javax", "servlet", xs @ _*)         => MergeStrategy.first
  case PathList(ps @ _*) if ps.last endsWith ".properties" => MergeStrategy.first
  case PathList(ps @ _*) if ps.last endsWith ".xml" => MergeStrategy.first
  case PathList(ps @ _*) if ps.last endsWith ".types" => MergeStrategy.first
  case PathList(ps @ _*) if ps.last endsWith ".class" => MergeStrategy.first
  case "application.conf"                            => MergeStrategy.concat
  case "unwanted.txt"                                => MergeStrategy.discard
  case x =>
    val oldStrategy = (assemblyMergeStrategy in assembly).value
    oldStrategy(x)
}

assembly.sbt 

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.12.0")
フロー図(UMLシーケンス図)もコードで書いて管理したい(atom + mermaid.js)

# フロー図(シーケンス図)もコードで書いて管理したい(atom + mermaid.js)

## 前置き

- 業務フロー図など書くことありますか?
- ツールは何で~~書かされて~~ 書いてますか?
- MS Excel ですか?
- MS Visio ですか?
- astah community edition という Free の UML モデリングツールもあるよ
    - http://astah.change-vision.com/ja/product/astah-community.html

## 目的

### 運用ドキュメントも Infrastructure as Code で

- 1. エクセルでがんばってフロー図書いた
- 2. 「あそこはこう変えて、ここはこう変えてね。よろしく。」
- 3. 図形をドラッグ・アンド・ドロップして…キーーーー

> GUI めんどくさい!

### コードベースのメリット

- git などでバージョン管理(差分管理)できる
- 変更もエディタ上で文字列編集することで可能

## 結論

### コードベースでシーケンス図書けるツールあります

> atom + mermaid.js

### atom

- https://atom.io/
- https://ja.wikipedia.org/wiki/Atom_(%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF)

### mermaid.js

- http://knsv.github.io/mermaid/
- https://atom.io/packages/atom-mermaid
- シーケンス図以外も書けます

## 環境

- MacOS Sierra
- Atom 1.13.0 x64

## インストール方法

- atom が導入済みであれば + install するだけ

![Screenshot 2017-03-08 02.18.22.png](https://qiita-image-store.s3.amazonaws.com/0/67892/c428e322-52f5-caef-7dc3-68aea1e2e17e.png)

## 使いかた

- mermaid docs のサンプルを参考にしましょう
    - http://knsv.github.io/mermaid/#sequence-diagrams6

```
%% Example of sequence diagram
sequenceDiagram
    participant 依頼者
    participant 運用担当
    participant リーダー
    依頼者->>+運用担当: よさげなサーバーこさえてよ!
    運用担当-->>-依頼者: そんな簡単に出来るかぼけぇ!!!
    activate 依頼者
    依頼者->>+運用担当: そんなこと言わずに
    deactivate 依頼者
    運用担当-->>+リーダー: 下々がこんなこと言ってます
    リーダー->>-運用担当: 仕方ない、やってやれ
    運用担当-->>-依頼者: いいって、ほらよ
```

![Screenshot 2017-03-08 02.27.00.png](https://qiita-image-store.s3.amazonaws.com/0/67892/0d89cebd-2f9c-fe29-fc9c-c14979b5f558.png)

## おわり
three.jsでlineを使ってジェネラレティブ表現っぽいのやってみる

![a928652749ad185dde0490074d7c3187.gif](https://qiita-image-store.s3.amazonaws.com/0/108368/10915b0a-fcb0-51ce-b1ce-3c1fc0ee8b49.gif)

![スクリーンショット 2017-03-08 2.13.49.png](https://qiita-image-store.s3.amazonaws.com/0/108368/641b8fa0-1ce4-f48d-3e1b-9363ac28f9f1.png)

こういうやつ。

#コード

```html:qiita.html

<html>
  <head>
  <title>My first Three.js app</title>
  <style>
    body { margin: 0; }
    canvas { width: 100%; height: 100% }
  </style>
  </head>
  <body>
    <script src="../build/three.js"></script>
<script>

var cube;
var renderer;
var scean;
var camera;
var planes;
var plane;


Init();



function Init(){

   
    planes = new Array(1000);
    const far = 20000;
    const w = window.innerWidth/10;
    const h = window.innerHeight/10;
    scene = new THREE.Scene();
    camera = new THREE.PerspectiveCamera( 75, window.innerWidth/window.innerHeight, 0.1, far);
    camera.position.z = 300;
    renderer = new THREE.WebGLRenderer();
    renderer.setSize( window.innerWidth, window.innerHeight );
    renderer.setClearColor( 0xffffff, 0 );
    document.body.appendChild( renderer.domElement );

    
 


};
          



var n =0;
const render = function () {
  requestAnimationFrame( render );

  n+= 20;
 
 if(n>360) {n-= 360;}
 if(n<0){n+= 360};

  var geometry = new THREE.Geometry();

  geometry.vertices.push(new THREE.Vertex(n/2*Math.sin(n),0,n/2*Math.cos(n)));
  geometry.vertices.push(new THREE.Vertex(0,-n/2*Math.cos(n*10*Math.random()),0));

  var line = new THREE.Line(geometry,new THREE.LineBasicMaterial({ color: 0xffffff, transparent: true, opacity: 0.6 } ));

  scene.add(line);

 
  renderer.render(scene, camera);

  scene.rotation.y+= 0.01;
};

render();

</script>

  </body>
  </body>
</html>
```

やってることは、lineの始点を、特定の平面上だけである程度ランダムで動くようにしてあげて、ラインの終点をy座標上下でランダムにとってあげた感じです。

もっと綺麗なの作れそうだけど、明日も仕事だから寝なきゃ。
VNC Server 起動後に、FireFoxをリモートで起動したい

#環境設定
##リモートVNCサーバ
CentOS6.x
``$ cat /etc/redhat-release``
TigerVNC
``$ yum install tigervnc-server``
FireFox
``$ yum install firefox``
##ローカルPC
- ローカル
- Windows10
- UltraVNC
- VirtualBox
- Vagrant
- CentOS6.x

##ローカルPCからVNCサーバへ接続する
※VNCサーバのiptablesは、ローカルPCからのアクセスを許可しているものとする。時間があればまた詳しい記事を書きます。
UltraVNC(緑色のアイコン)を起動したら、VNCサーバへ接続する。
接続後、terminalを起動
``$ firefox -P``
でプロファイルの初期設定をする。
ユーザ defaultで、FireFoxを起動。
起動後、アドレスバーに
``about:config``と入力
ボタンを押して設定をする。
##ローカルPCからVNCサーバのFireFoxを起動する
IPアドレス(or domain or hosts)、displayを指定して。

備忘録程度ですので、またまとめます。眠い。
Mac Book Pro の設定・セットアップ

仕事でMacBookProを使用していましたが、プライベートでも購入したので、セットアップ手順をまとめます。

##トラックパッド
動きが重たいのがストレスなので、**軌跡の速さ**を「速い」に調整。ミッキー比と言われるやつです。
<img width="780" alt="スクリーンショット 2017-03-08 1.04.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/145861/407a1d77-35dc-c705-8c5c-b2fef77c8e01.png">

##Dock
使用しないものを残す必要性がないため、初期のものはばっさりなくします。
操作しやすいように左側に配置し、アイコンを小さめに設定。

<img width="1280" alt="スクリーンショット 2017-03-08 1.33.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/145861/28d0240e-5497-04e3-aa7a-153c036def64.png">


##キーボード
キーリピートを最速に、リピート入力認識時間も速めにしています。キャレットの移動が速いとコーディングがはかどります。

ファンクションキーをファンクションキーをそのものとして利用するチェックも入れています。

<img width="780" alt="スクリーンショット 2017-03-08 1.38.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/145861/57e2b06c-2433-04b9-a7bb-4426708b3c1e.png">


##画面の明るさ調整 ([f.lux](http://thesaibase.com/pc/flux))
PCのディスプレイがまぶしすぎるので、ブルーライトを抑え、目に優しい色合いに調整してくれるフリーソフト「[f.lux](http://thesaibase.com/pc/flux)」を使っています。
使い方はリンクを見ていただきたいですが、メニューバーに表示されたアイコンをクリックし「Preference」を選択して明るさ調整ができます。


##Google Chrome
<img width="137" alt="GoogleChromeアイコン.png" src="https://qiita-image-store.s3.amazonaws.com/0/145861/572429ee-96f9-fa61-6b2f-cbebd379b415.png">
[このページ](https://www.google.co.jp/chrome/browser/desktop/index.html?brand=CHBD&gclid=Cj0KCQiA0fnFBRC6ARIsAPHX_MBPxV5NJHMZbTy5EcLOCerA4giiIuWLtBdze1jV8pihMpy2flRIX7MaAvrpEALw_wcB)からインストール。

##Google日本語入力
![a346b6e2-43a5-a6fe-a2c0-252b4065ad08.png](https://qiita-image-store.s3.amazonaws.com/0/145861/fca15b69-7745-1c54-3f22-76865d9f1a37.png)
[このページ](https://www.google.co.jp/ime/)からインストール。

英数とひらがなの切り替えのキーバインドは、なにやら面倒くさいことになっていますが、かなと英数で切り替えができます。

その他の細かい設定は以下のとおり、スペースは常に半角で、キー設定は 慣れ親しんだ MS-IME にしています。

また、Mac は '¥' と '\' を区別していて、プログラミングを行う場合、¥ キーで直接バックスラッシュが入力できたほうが良いため、そのように変更します。

<img width="520" alt="e3222f8e-ffce-4a5d-0bc6-355449276b67.png" src="https://qiita-image-store.s3.amazonaws.com/0/145861/cfb583f5-581c-8a54-963c-5acee0099ad8.png">


##細かいところ
- メニューバーのバッテリーをクリックして「割合(%)を表示」させる
- Finderの**表示**を「アイコン」から「リスト」に変更
![スクリーンショット 2017-03-08 1.21.02.png](https://qiita-image-store.s3.amazonaws.com/0/145861/691cde9b-cee0-6154-707c-cabc1ff29c63.png)


##今後設定を進めること
- ブックマークの移管
- 開発環境の構築(エディタやターミナル設定)
などなど
service と init.d の違いを docker で知る

## 経緯

dockerの勉強中に何故かapacheのコンテナでapacheが起動せず、コンテナにアクセスした上でコマンド起動。ところが、linkしたコンテナの環境変数が取得できない。コンテナにアクセスしたコマンドライン上では確認できるが、apacheでは取得できない(phpinfoで確認したが、phpの問題ではない)。


薄っすらと記憶はあったものの、なにがどうなっているのかわからなかったので、結構時間を食う。まぁ、学習コストは高くつくものです。

最終的に、「なぜ`init.d`ではなく`service`を使うべきか」という内容の記事を思い出した。

## apache起動しない問題

こちらは本題ではないので、軽くしか触れないが、いずれ。

dockerで複数のコンテナを起動しコンテナ同士をつなぐ、というかなり初歩的なところで躓いた。まずは、mysqlのコンテナを起動し、続いてアプリケーション用のapacheのコンテナを起動。そして、コンテナに接続する。Dockerfileには起動コマンドが「一個だけ」書いてあり、FOREGROUNDで動作するようになっている。のに、apacheは起動しなかった。

## apacheが起動しない原因

原因としては単にDockerfileのCMDとdocker runのコマンドオプションが重複していたのでapacheが起動しなかっただけなのだが、コマンドラインでは確認できる環境変数が、**apacheに反映されない**事象が起きる。すなわち、mysqlの情報が受け渡せない。

オ〜〜マイ・ガッ。

## 何が原因かわからない

正直、ほとんど記事になっていないと思われる。手元の環境でCentOSを使う人はもはや少ないのか。おそらく、RedHat、Fedora、CentOSなどでは起こるがDebian系のLinuxでは起きないのだと思う。
DockerはどうやらDebian推奨のようなので、あまり話題にのぼらないのか。

## 兎に角、CMDと同じように起動してみると

DockerfileのCMDでは、直接httpdコマンドをFOREGROUNDで起動する。起動スクリプトは使わない。ので、そのように。

**！！**

出た、環境変数。ただ、理由はまったくわからない。なにか、引っかかるものはあるのだが明確にならない。
そして、init.dで起動しても環境変数は取得できる…あれ？
serviceでは取得できない。
どっかでそのような話を聞いたような…。

## これが答えだ

[デーモンの起動・終了にはserviceコマンドを利用しよう 2013年6月24日](https://heartbeats.jp/hbblog/2013/06/service-start-stop.html)

そう、serviceコマンドは環境変数を引き継がない。そして、CentOSにどっぷり浸っていた私は、目をつぶってserviceを叩いた。これは実行者によらず、安定して動作するってことで重要なことなんだと理解している。

そう、そもそも実行者の環境変数なんていうものに依存するのはどうなんだろう、と思いつつ、このあたりでCMDの重複に気づいたのでした。

結局は、DockerfileのCMDで起動するapacheは環境変数を持てるのだが、それに依存してアプリケーションを構築するのは、開発環境以外では危険かなと。
webpack2でpostcssとextract-text-webpack-pluginのビルド周りの変更点

WEB+DB Press Vol.97の特集1、第一章を写経している。
既に発刊時にはwebpackのバージョンが未指定だと2になっていた。
しかし、雑誌掲載のコードは注記にもあるがwebpack1の内容で書かれている。
それによってpostcssのビルドでかなりハマったので、同じ沼にハマった人が抜け出せるように書き残す。

### 一番の変更点

下記部分をwebpack.config.jsに書いちゃいけなくなっている。

``` Javascript:webpack.config.js
...
postcss: [
  require('postcss-easy-import')({glob: true}),
]
...
```

この部分のコードを消し去り、代わりにpostcss.config.jsを作成して書くのが良さそう。
下記コンフィグを設置したところ一番の沼は回避できた。

``` js:postcss.config.js
module.exports = {
    plugins: [
        require('postcss-easy-import')({glob: true})
    ]
}
```


### entryが掲載のコードのままだとbuildは成功するけどエラー吐かれる問題
entryの記述を下記にして対応できた。

``` Javascript:webpack.config.js
entry: ['./src/main.js', './src/main.css']
```

### 最終的な成果物webpack.config.js
その他、outputのpathがフルパスにしないと怒られたり、module.loaders => module.rulesになったり、直したところ最終的には下記で動きました。

``` Javascript:webpack.config.js
const ExtractTextPlugin = require('extract-text-webpack-plugin');

module.exports = {
    entry: ['./src/main.js', './src/main.css'],
    output: { path: __dirname + '/public', filename: 'bundle.js' },
    module: {
        rules: [
            {
                test: /\.js$/,
                exclude: /node_modules/,
                use: 'babel-loader'
            },
            {
                test: /\.css$/,
                use: ExtractTextPlugin.extract({
                    loader: 'css-loader!postcss-loader',
                }),
            }
        ],
    },
    devtool: 'source-map',
    devServer: {
        contentBase: 'public',
        port: 8080,
    },
    plugins: [
        new ExtractTextPlugin({
            filename: 'bundle.css'
        }),
    ],
};
```
queueの実装に関して

キューってどのコンテナ使うべきか迷いますよね。
スタックならvector一択なんですが…。

std::queueってのもありますが、デフォルトでの中身はdequeです。

https://cpplover.blogspot.jp/2017/02/c-p0550r0-p0601r0.html
「実際、マイクロベンチマークでも先頭へのinsertやeraseは、vectorの方がlistやdequeより速い。」

マジか！って事で、色々試してみたのですが、vectorが圧倒的に遅いです。
どういう条件で試せば速いんだろう…？？？

ただ、PCも進歩すると過去の常識が今の非常識になることは少なくありません。
dequeよりvectorの方が高速動作する時代もありうる話です。

ただ、vectorはそこそこの大きさのメモリ移動が発生するわけで、もうちょっと効率のいいコンテナはありそうです。
pop_frontをしたときには、管理上の先頭の位置だけをずらして、実際のメモリの場所は移動しない、そんなコンテナがあればベストです。

そこで循環バッファのコンテナである、[boost::circular_buffer](https://boostjp.github.io/tips/circular_buffer.html)を使いましょう。

```cpp
#include <boost/circular_buffer.hpp>

int main(){
	// 5の領域を確保
	boost::circular_buffer<int> queue(3);

	// 7個追加 (2, 3, 4, 5, 6) 先頭の0, 1は消える
	for (int i = 0; i < 7; i++){queue.push_back(i);}

	// 3個取り出し (5, 6)
	for (int i = 0; i < 3; i++) {queue.pop_front();}
}
```

vectorやdequeと違って、circular_bufferは勝手に大きさを変更することはありません。
もし、コンテナからあふれる場合、逆側の端を消します。
push_back() する時にあふれる場合は、一度pop_front() が実行される、という感じです。

もし、溢れないバッファが欲しいなら以下のような関数を作っておくといいでしょう。

```cpp
template<typename T>
void circular_push_front(boost::circular_buffer<T> &c, const T &n){
	if (c.full()) c.set_capacity(c.size() * 2);
	c.push_front(n);
}

template<typename T>
void circular_push_back(boost::circular_buffer<T> &c, const T &n){
	if (c.full()) c.set_capacity(c.size() * 2);
	c.push_back(n);
}
```

vectorではreserveで事前に確保領域を増やせますが、
circular_bufferのreserveは空き容量(最大確保数 - 現在使用数)を返すconst関数です。
同名でありながらぜんぜん違う機能なので注意しましょう。
vectorのreserveに当たる関数は、circular_bufferではset_capacityです。

ただ、このcircular_bufferでのベンチを色々試したんですが、dequeより等速～1.1倍ほど時間がかかるという結果になっています。
理論的にはメモリ拡張が起きなければ、最も速いqueueの実装のはずなので、こちらを積極的に使う価値はあると思います。
[zsh] zsh: no matches found

## エラー
rakeタスクの引数を渡す場合に、エラー表示がでる。

```Tarminal
$ bundle exec rake neo4j:generate_schema_migration[constraint,大学,uuid]
zsh: no matches found: neo4j:generate_schema_migration[constraint,大学,uuid]
```

## 対応
`noglob`を使う。

```Tarminal
$ noglob bundle exec rake neo4j:generate_schema_migration[constraint,大学,uuid]
```

よく使う場合は、エイリアスに追加するのもありかもしれないです。

```~/.zshenv
alias rake='noglob bundle exec rake'
```

## 参考
http://neo4jrb.readthedocs.io/en/6.0.x/RakeTasks.html
http://qiita.com/kwgch/items/445a230b3ae9ec246fcb
ubuntu16.04にslack-desktopをインストールするとエラーが出る

メモ程度と思ってください。
まず、私の環境は、ubuntu16.04で当初slack(Version 0.15.2-7)というpackageが入っており、ここに[slack-desktop](https://downloads.slack-edge.com/linux_releases/slack-desktop-2.5.1-amd64.deb)をインストールしようとしたところ、
>$ gdebi slack-desktop-2.5.1-amd64.deb 
>
>Reading package lists... Done
>
>Building dependency tree        
>
>Reading state information... Done
>
>Reading state information... Done
>
>Slack Desktop
>
>ソフトウェアパッケージをインストールしますか? [y/N]:y
>
>(データベースを読み込んでいます ... 現在 298841 個のファイルとディレクトリがインストールされています。)
>
>slack-desktop-2.5.1-amd64.deb を展開する準備をしています ...
>
>slack-desktop (2.5.1) を展開しています...
>
>dpkg: アーカイブ /home/halcyon/Downloads/slack-desktop-2.5.1-amd64.deb の処理中にエラーが発生しました (--install):
>
> '/usr/share/lintian/overrides/slack' を上書きしようとしています。これはパッケージ slack 0.15.2-7 にも存在します
>
>bamfdaemon (0.5.3~bzr0+16.04.20160824-0ubuntu1) のトリガを処理しています ...
>
>Rebuilding /usr/share/applications/bamf-2.index...
>
>gnome-menus (3.13.3-6ubuntu3.1) のトリガを処理しています ...
>
>desktop-file-utils (0.22-1ubuntu5) のトリガを処理しています ...
>
>mime-support (3.59ubuntu1) のトリガを処理しています ...
>
>処理中にエラーが発生しました:slack-desktop-2.5.1-amd64.deb
>
> 

などとエラーが出ます。これは、`dpkg -i hoge.deb`や`apt install -f hoge.deb`のようにしても同様のエラーが出ます。`apt remove slack`でslackを除去してからインストールしましょう。
ELB(v2)配下のEC2を削除するとゾンビ化したインスタンスが残る

ターゲットグループに所属したままのEC2インスタンスを削除すると、ターゲットグループ配下にゴミとして残りdescribe-target-healthの結果に削除済みのインスタンスが入ってくることがある。
1台起動、1台停止、1台削除した状態で以下のコマンドを実行すると、

```sh
aws elbv2 describe-target-health --target-group-arn [ターゲットグループのARN]
```

このような結果が返ってくることがある。

```
ID: i-xxxxxxxxxxxxxxxxx / state: healthy / reason: undefined          # 起動しているインスタンス
ID: i-yyyyyyyyyyyyyyyyy / state: unused / reason: Target.InvalidState # 停止しているインスタンス
ID: i-zzzzzzzzzzzzzzzzz / state: unused / reason: Target.InvalidState # 削除済みのインスタンス
```

削除済みのインスタンスはいずれガベコレされるものと思われるが、それがいつかは分からない。
しかも、このゾンビが停止中のインスタンスと区別が付かない。

実際、ここを見ると、Target.InvalidStateになるのは、停止しているインスタンスまたは削除済みのインスタンスである。
http://docs.aws.amazon.com/cli/latest/reference/elbv2/describe-target-health.html

性質が悪いのは、このインスタンスが**AWSコンソールから見えない**こと。
EC2のターゲットグループページからインスタンスタブを開いても、一覧に表示されるのはi-xxxxxxxxxxxxxxxxxとi-yyyyyyyyyyyyyyyyyの2つだけである。

どうやらCLIから削除するしかないらしい。
これを実行することで、このゾンビを駆除できる。

```sh
aws elbv2 deregister-targets --target-group-arn [ターゲットグループのARN] --targets Id=i-zzzzzzzzzzzzzzzzz,Port=80
```

このコマンドの実行直後に取得すると次のような結果が返り、削除済みのインスタンスは区別できる状態となる。

```
ID: i-xxxxxxxxxxxxxxxxx / state: healthy / reason: undefined
ID: i-yyyyyyyyyyyyyyyyy / state: unused / reason: Target.InvalidState
ID: i-zzzzzzzzzzzzzzzzz / state: draining / reason: Target.DeregistrationInProgress
```


しばらく時間を置くと次のように完全に削除されるようだ。

```
ID: i-xxxxxxxxxxxxxxxxx / state: healthy / reason: undefined
ID: i-yyyyyyyyyyyyyyyyy / state: unused / reason: Target.InvalidState
```
Pythonを使ってJIRAチケット作成

タスクやバグのJIRAのチケットをまとめて作成したい！
けどJIRAのwebのフォームから1件ずつ作ってると、項目毎にテキストボックス切り替えたり、プルダウンメニューから項目選んだり、となかなか操作が手間ですよね。


そこで、今日はPythonを使ってJIRAチケットを作成する方法をまとめました。
日本語の記事だとあまり言及されていなかった、

 - 優先度
 - コンポーネント
 - バージョン
 - ラベル

などの入れ方についても説明します。



##環境
- MacBook Pro (Retina, 13-inch, Early 2015)
- プロセッサ： 3.1 GHz Intel Core i7
- メモリ： 16 GB 1867 MHz DDR3
- OSバージョン： 10.12.3
- R : 3.3.1

#準備

JIRAのパッケージをインストールします

```bash
pip install jira
```

軽い使い方などはこちらにも載っています
https://pypi.python.org/pypi/jira/

試しに、アトラシアンの公開JIRAからチケットの情報を抽出してみます

```py3
from jira import JIRA

jira = JIRA('https://jira.atlassian.com')

issue = jira.issue('JRA-10')
print (issue.fields.project.key)    　　　#プロジェクトキーの取得
print (issue.fields.issuetype.name)　　　 #チケットのタイプ
print (issue.fields.reporter.displayName)#報告者名
```



#ログインする

普通に仕事でJIRAを使っていたらきっとログインしないと閲覧・投稿できないはずです。
なので！まずはログインします！

```py3
from jira import JIRA
from jira.exceptions import JIRAError

options = {'server': '（自分のJIRAのURL）'}

usr = '（ユーザー名）'
pas = '（パスワード）'

try:
    jira = JIRA(options=options, basic_auth=(usr, pas))
except JIRAError as e:
    if e.status_code == 401:
        print ("Login to JIRA failed.")
print ("Login!!")
```

うまくいったら、Loginと表示されます。

#チケットの作成

続いてチケットの作成です。
多様な項目を入れたチケットを作成してみましょう！
項目によって、カッコの付け方やid,nameとか微妙に違うので注意してください。

```py3
new_issue = jira.create_issue(
                            project='（あなたのプロジェクトキー）',
                            summary= '（要約）',
                            description= '（説明）',
                            issuetype={'name': '（チケットタイプ）'},
                            priority= {'id': '（優先度[1が最高]）'},
                            assignee={'name': '（担当者）'},
                            components= [{"name": '（コンポーネント）'}],
                            versions =  [{"name": '（バージョン）'}],
                            labels = ['（ラベル）']
                            )
print ("Done!")
```

優先度は、番号での指定になりますが、文字列として入力する必要があります。
またコンポーネントやバージョンは登録がないとエラーが表示されます。

あとは応用次第で、まとめてチケット作成が捗ります。
自分はExcelからまとめて、タスクをチケット化するなんてこともやってみました。
AMIMOTO AMIのrootユーザーで–allow-rootオプションを使わずにWP-CLIを使用する

## 前提
[WP-CLI の –allow-root オプションは非推奨です！ - firegoby](https://firegoby.jp/archives/6783)

```
# wp core version
Error: YIKES! It looks like you're running this as root. You probably meant to run this as the user that your WordPress install exists under.

If you REALLY mean to run this as root, we won't stop you, but just bear in mind that any code on this site will then have full control of your server, making it quite DANGEROUS.

If you'd like to continue as root, please run this again, adding this flag:  --allow-root

If you'd like to run it as the user that this site is under, you can run the following to become the respective user:

    sudo -u USER -i -- wp <command>

```

「`--allow-root`じゃなく、`sudo -u USER -i -- wp`でroot以外のユーザーとして実行してくれ」とメッセージが出るようになっています。

ただEC2 System ManagerのRun CommandやUserDataなど、rootユーザーでコマンドを実行するケースも少なからずあります。

## AMIMOTO AMI(セルフホスティング)でrootユーザーからWP-CLIを実行する
AMIMOTOの場合は以下のようにすることで、rootユーザーでのコマンド実行時にも問題なく動作させることができます。

```
# sudo -u nginx /usr/local/bin/wp core update
Updating to version 4.7.3 (en_US)...
Downloading update from https://downloads.wordpress.org/release/wordpress-4.7.3-new-bundled.zip...
Unpacking the update...
Cleaning up files...
No files found that need cleaned up.
Success: WordPress updated successfully.
```

### run-httpd-as-ec2-user(SFTP接続対応など）を実行している場合
<a href="https://amimoto-ami.zendesk.com/hc/ja/articles/215857168-AMIMOTO-AMI-%E3%81%A7%E4%BD%9C%E6%88%90%E3%81%97%E3%81%9F%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%81%B8-ec2-user-%E3%81%A7-SFTP-%E6%8E%A5%E7%B6%9A%E3%82%92%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95" >AMIMOTO AMI で作成したインスタンスへ ec2-user で SFTP 接続をする方法 – FAQ & SUPPORT</a>などで紹介されている方法で、PHP-FPMやNginxをec2-userで動作させている場合は以下のようになります。


```
# sudo -u ec2-user /usr/local/bin/wp core update
Updating to version 4.7.3 (en_US)...
Downloading update from https://downloads.wordpress.org/release/wordpress-4.7.3-new-bundled.zip...
Unpacking the update...
Cleaning up files...
No files found that need cleaned up.
Success: WordPress updated successfully.
```
Raspberry PiのNode-RED小ネタ


(注意）
ngrokによるアクセスはdeployできますが、debug機能が使用で着ませんでした。

# Node-REDの小ネタです。
## ngrokを使用してnode-redをインターネット経由でアクセス
[ngrok](http://ngrok.com)にアクセスします。
1) ngrokのlinux arm版をダウンロードします。
![スクリーンショット 2017-03-08 1.08.45.png](https://qiita-image-store.s3.amazonaws.com/0/136933/749d6e84-bfad-8a01-9819-a0ded5615f56.png)

2) ngrokにログイン githubやgoogle+でログインできます。
3) ホームページに記載してあるように、takenをインストール

XXXXXXはホームページに書かれているのでそれを使用します。
またダウンロードフォルダが異なっていたら変更してください。
```
cd ~/Download
unzip  ngrok-stable-linux-arm.zip
./ngrok authtoken XXXXXXXXXXXXXXXXXXXXXXXXX
```
4) node-redを起動
5) ngrokにnode-redのポートを指定。デフォルトなら1880なので、
./ngrok http 1880
とコンソール画面に入力してアプリケーションを起動します。

で、これだけです。

ホームページの閲覧のためにidとパスワードを設定するのであれば、
./ngrok http -auth="id:pswd" 1880
としてください。idとpasswdは任意です。

6) コマンド入力後にアクセスするサイトは
http://xxxxxx.ngrok.io -> localhost:1880
 ^^^^^^^^^^^
このURLになります。

## node-redを自動起動する場合
/etc/rc.localに"node-red-start"と記述するとバックグランドでジョブが流れてしまい、コンソール画面が表示されません。
デスクトップ画面を起動した後にコンソール画面を開いてnode-redを起動する方法の紹介です。

1) 以下のファイルを作成
　ファイル名は任意ですが、次の内容をnodered.desktopと言うファイルで保存します。

```
[Desktop Entry]
Exec=lxterminal -e "node-red-start"
Type=Application
Encoding=UTF-8
Terminal=true
```
2) nodered.desktopを以下のフォルダに保存
mkdir ~/.config/autostart
無ければ新規作成してください。

これで、Raspberry Piに ログインした後にnode-redが起動します。
kubernetesでapache-phpのpodを作成する

kubernetesを使ってapache-phpが動くimageを使ってpodを作成し、
アクセスできることを確認してみたいと思います

今回はdockerで試します。
こんなdockerの設定になっています。
https://github.com/shiotaro/gke-sample

# コンテナクラスタを作成
下記のURLから作成します
https://console.cloud.google.com/kubernetes/list

名前やゾーンを変更しても良いですが、そのままでも良いです

# cloud shellを開く
ソースコードをクローンします。
Cloud ソース レポジトリを利用しました。

```shell
TUTORIALDIR=~/src/hogehoge
cd $TUTORIALDIR
gcloud source repos clone gke-quickstart --project=hogehoge
```

```shell
cd $TUTORIALDIR/gke-quickstart/containerengine/php-hello-world
```

# 作成したコンテナクラスタのgcloud認証情報を取得する

```shell
gcloud container clusters get-credentials cluster-1 --zone us-central1-a
```

# アプリケーションのイメージを作成してpushする

```shell
docker build -t gcr.io/hogehoge/hello-php:v1 $PWD
```

※ここで出来上がったimageはContainer Registryに上げています。

```shell
gcloud docker -- push gcr.io/hogehoge/hello-php:v1
```

# コンテナ上のアプリケーションを実行する

```shell
kubectl run hello-php --image=gcr.io/hogehoge/hello-php:v1 --port=80
```

ここでpodを確認すると表示されます

```shell
$ kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
hello-php-265407199-2prxr   1/1       Running   0          58s
```

# コンテナを公開する

```shell
kubectl expose deployment hello-php --type="LoadBalancer"
```

# 外部IPアドレスを見つける
下記のコマンドで外部IPを見つけることができます(EXTERNAL-IP)

```shell
$ kubectl get service hello-php --watch
NAME         CLUSTER-IP     EXTERNAL-IP      PORT(S)        AGE
hello-php    10.3.250.245   xxx.xxx.xxx.xxx  80:32335/TCP   1m
```

http://xxx.xxx.xxx.xxx でアクセスするとphpのバージョンが表示されることを確認しました。

# [番外]podへのアクセス
あまり行わないのですが、直接podへsshすることも可能です

podの名前を調べます

```shell
$ kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
hello-php-265407199-2prxr   1/1       Running   0          8m
```

podの名前を指定してアクセスします

```shell
$ kubectl exec -it hello-php-265407199-2prxr /bin/bash
root@hello-php-265407199-2prxr:/var/www/html# 
```

# まとめ
以上、ざっとですがkubernetesを使って管理する方法を試してみました。
次は`Replication Controller`を利用して、podを管理する方法を試して見たいと思います。
多分これがkubernetesの肝。
AtomでEmacsキーバインド ~ctrl-h,ctrl-y,ctrl-kを有効にする~

# windows版AtomをEmacsキーバインドで使いたい

http://qiita.com/onegear0o/items/2958255fba1125a72489
を拝見したとおり、パッケージをインストールするだけでは
一番欲しいctrl-h,ctrl-y,ctrl-kのバインドが使えない・・・

### 目的
瞬殺でAtomでEmacsキーバインドを使えるようにする

### やること
・atomic-emacsパッケージインストール
・keymap.csonを一部書き換え

### atomic-emacsパッケージインストール

File→Settings→Installでウィンドウに「atomic-emacs」と記入して、
出てきたパッケージをインストールする。終わり。

参考にさせていただきました：http://vdeep.net/atom-packages

###keymap.csonを一部書き換え

・File→Settings→Keybindingsの青文字リンクからkeymap.csonを開く
・コメントアウトの並ぶ最終列以降に、下記をコピペして保存
　※ctrl-kがプレフィックスキーとして設定されているので、それをすべて無効化することで
　　本来の力を発揮できる。

```
'body':
  'ctrl-h': 'core:backspace'
  'ctrl-y': 'core:paste'

'atom-text-editor':
  'ctrl-k t down': 'unset!'
  'ctrl-k t left': 'unset!'
  'ctrl-k ctrl-0': 'unset!'
  'ctrl-k ctrl-1': 'unset!'
  'ctrl-k ctrl-2': 'unset!'
  'ctrl-k ctrl-3': 'unset!'
  'ctrl-k ctrl-4': 'unset!'
  'ctrl-k ctrl-5': 'unset!'
  'ctrl-k ctrl-6': 'unset!'
  'ctrl-k ctrl-7': 'unset!'
  'ctrl-k ctrl-8': 'unset!'
  'ctrl-k ctrl-9': 'unset!'
  'ctrl-k ctrl-alt-w': 'unset!'
  'ctrl-k ctrl-b': 'unset!'
  'ctrl-k ctrl-d': 'unset!'
  'ctrl-k ctrl-down': 'unset!'
  'ctrl-k ctrl-k': 'unset!'
  'ctrl-k ctrl-l': 'unset!'
  'ctrl-k ctrl-left': 'unset!'
  'ctrl-k ctrl-n': 'unset!'
  'ctrl-k ctrl-p': 'unset!'
  'ctrl-k ctrl-right': 'unset!'
  'ctrl-k ctrl-u': 'unset!'
  'ctrl-k ctrl-up': 'unset!'
  'ctrl-k ctrl-w': 'unset!'
  'ctrl-k down': 'unset!'
  'ctrl-k h': 'unset!'
  'ctrl-k k': 'unset!'
  'ctrl-k l': 'unset!'
  'ctrl-k left': 'unset!'
  'ctrl-k right': 'unset!'
  'ctrl-k j': 'unset!'
  'ctrl-k up': 'unset!'
```

反映されない場合Atomを再起動してみてください。
AndroidStudio2.3にしたらRobolectricを使ったTestが動かなくなった時の対処法

AndroidStudio2.3がリリースされ、喜んでアップデートしました。
特に問題なく使っていましたが、テストを実行したら何故か失敗する。当然のことながらテストも、テストされる側も全く変更していないのにです。

# TL;DR

Run/Debug ConfigurationsのDefaults -> Android JUnit -> Working directoryの欄が空になっていました。

![Screenshot from 2017-03-08 00-10-15.png](https://qiita-image-store.s3.amazonaws.com/0/154021/9ce67ea5-114e-3059-3aad-09ba7dd846b2.png)

バージョンアップ前は確かに`$MODULE_DIR$`と入れていたのに…
ということで、これを再度入力しておけば大丈夫です。

# 環境
robolectricのバージョンは3.0です、古くてすみません。