OmniAICreator/Qiita-1.07M huggingface dataset:
プログラミング言語Go読書会#12(7.5.1-7.10)[2017/06/14]

[Go読書会 #12](https://lancers-engineer.connpass.com/event/58819/) が[ランサーズ株式会社](https://www.lancers.co.jp/)で行われたので進捗と技術的なメモ書きを書いておきます。読書会の内容は[プログラミング言語Go](https://www.amazon.co.jp/dp/4621300253/?&_encoding=UTF8&tag=amesho-22&linkCode=ur2&linkId=7e29043d833086d36f8b64c2ed3721b2&camp=247&creative=1211)を冒頭から皆で読み進めていくというものです。

## 進捗した内容

+ 7章 インタフェース
    + 7.5.1 警告:nilポインタを含むインターフェースはnilではない
  + 7.6 sort.Interfaceでのソート
  + 7.7 http.Handerインタフェース
  + 7.8 errorインタフェース
  + 7.9 例：式評価器
  + 7.10 型アサーション


## 話題に上がった話

### 7.6 sort.Interfaceでのソート

ここでは、goに用意されているsort.Interfaceを利用したソートの書き方が書かれていました。これは`Len()`、`Less()`、`Swap()`という3つを満たした状態にすればsortを実装出来ます。goの場合、基本型は`a,b = b,a`といった入れ替えが出来るので、swapは必要なんですかという疑問が出ましたが、構造体など複雑なデータ構造を入れ替えるのに必要だという話をしました。

### 7.8 errorインタフェース

ここでは、errorStringの基底型が構造体であることと、`Newのすべての呼び出しは、互いに等しくない全く異なるインスタンスを割り当てます`というところが話題になりました。意図しない同一のエラー比較などが行われないような仕組みが組み込まれていました。

### 7.9 例：式評価器

コンパイラの話で良く出てくる電卓の作成のようです。単純な算術式に対する`評価器(evaluator)`を作成する項目でした。実際にコンパイラ等に関わることが少ない人もいたので評価器に対して説明したり、有効そうなリンクを探してみたりしました。

+ 参考
  + [第13章 評価器の構造](http://i.loveruby.net/ja/rhg/book/evaluator.html)
  + [簡単な式の評価機を作ってみる #golang](http://qiita.com/tenntenn/items/a312d2c5381e36cf4cd3)

### 7.10 型アサーション

これは、`インタフェース値へ提供される演算`で、`x.(T)`という構文で型を指定して、オペランドの動的な型がTと一致するかどうかを検査するものです。型が違っていた場合panicが起きるので安全に開発できるところがうれしいですね。

```go
w = os.Stdout
f := w.(*os.File)
```

ここまで呼んだところで、時間になりました。次回は 7.11 型アサーションによるエラーの区別です。
phpのエラー「Undefined offset」


![Screen Shot 2017-06-20 at 13.12.42.png](https://qiita-image-store.s3.amazonaws.com/0/109241/c7a5512c-9990-fcab-b6d9-883ede6fece7.png "Screen Shot 2017-06-20 at 13.12.42.png")

##原因

配列で存在しない位置のインデックスを参照したときに出るエラー。
今回の場合は

![Screen Shot 2017-06-20 at 13.14.48.png](https://qiita-image-store.s3.amazonaws.com/0/109241/192b479d-c909-5b8b-fb7f-86faaaff7350.png "Screen Shot 2017-06-20 at 13.14.48.png")

なのに

![Screen Shot 2017-06-20 at 13.14.57.png](https://qiita-image-store.s3.amazonaws.com/0/109241/eaa466d0-fbd4-afb9-634c-d47ecfff9eb1.png "Screen Shot 2017-06-20 at 13.14.57.png")

としていたから。
`$dates` はkeyでいうと `0, 1, 2, 3` のみ。

![Screen Shot 2017-06-20 at 13.18.11.png](https://qiita-image-store.s3.amazonaws.com/0/109241/080d76a4-c75f-f652-efd8-aaa4b94f504c.png "Screen Shot 2017-06-20 at 13.18.11.png")

としたら直った。
Google Apps ScriptでスプレッドシートにサイトのURLを記入する方法

```js:getTitle
function getTitle(tURL) {
  var objSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var objSheet = objSpreadsheet.getActiveSheet();
  var objCell = objSheet.getActiveCell();
  var response = UrlFetchApp.fetch(tURL);

  var myRegexp = /<title>([\s\S]*?)<\/title>/i;
  var match = myRegexp.exec(response.getContentText());
  var title = match[1];

  title = title.replace(/(^\s+)|(\s+$)/g, "");  
  //objCell.setValue(title)
  if(title==null){
    return "NULL";
  }else{
    return title;    
  }
}
```

```js:getDescription
function getDescription(tURL) {
  var objSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var objSheet = objSpreadsheet.getActiveSheet();
  var objCell = objSheet.getActiveCell();
  var response = UrlFetchApp.fetch(tURL);

  var myRegexp = /<meta name=\"description\" .*content=\"([\s\S]*?)(\".*\/|\".*)>/i;
  var match = myRegexp.exec(response.getContentText());
  var title = match[1];

  title = title.replace(/(^\s+)|(\s+$)/g, "");  
//  objCell.setValue(title)
  if(title==null){
    return "NULL";
  }else{
    return title;    
  }
}
```
UiPathでRPAを実践してみる(1) ～FlowchartからHello World～

> 更新

日本語サイトが公開されているので、一部のUiPathコミュニティとAcademyへのリンクを貼り替えました。
日本語の公式サイトは[ここ](https://www.uipath.com/ja/)
これをきっかけに、より日本国内にUiPathが広がっていくと面白いですね。(一応、私は社員でも何でもありません…)

# 初めに

RPAという単語に惹かれて、UiPathを使ってみました。実務では、日々の単純作業が意外と多いもの。
これを自動化出来ると、色々な範囲で応用出来て幸せになれないかな、と思って実践してみました。

[UiPath Academy](https://academy.uipath.com/lms/)のRPA Developer - Basic Trainingは修了済み。
テストや解説は英語のみですが動画には日本語字幕がついているので、何とか理解は出来ました。
折角、身に着けた知識を風化させない様に、一つずつメモを残していこうかと思います。

##1.UiPathをインストール
　こちらのサイトからUiPath Communityをダウンロードしましょう。[UiPath Community](https://www.uipath.com/ja/community-edition-download)
　インストールにあたっては、特に難しい事はありませんでした。(いきなりUiPath Studioが立ち上がります。)
　私の環境ではインストールは、`C:\Users\ユーザー\AppData\Local\UiPath`に展開されていました。(Program Filesではない)

##2.プロジェクトの作成方法
　UiPathは基本的にFlowchartから始まります。テンプレートがあるので、Simple Processを選択します。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/154110/f5bee28c-b266-b967-e9e7-31850a98665b.png)

　適当な名前を付けたら、あっという間にワークフローが出来上がります。
　テンプレートはデータを入力⇒入力があれば、何か処理をする。無ければ終了というシンプルなものです。
![キャプチャ1.PNG](https://qiita-image-store.s3.amazonaws.com/0/154110/0795775b-04b3-bce9-8e3a-57a65d55aa2e.png)
![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/154110/33613bf9-ead1-7b91-0e30-dffc3c798311.png)

##3.変数へ値を保存し、Hello Worldを出力してみる
　とりあえず、練習の為に0からFlowchartを組み立てていきます。この場合は、新しいプロジェクトにはBlankを使いましょう。
　①左側の`Activitiesペイン`から`Flowchart`を選択して、ドラッグ&ドロップ![キャプチャ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/154110/2fcedef3-1041-1186-b0e1-799f1d85fbbc.png)
　②InputダイアログをStartの下の矢印にドラッグ＆ドロップ。こうする事で自動でFlowの線がつながります。
　 ちなみに、Startから何も処理がつながっていない場合はコンパイルができません。![キャプチャ4.PNG](https://qiita-image-store.s3.amazonaws.com/0/154110/d83444d7-f2d2-cce5-dde6-5b2c7baaa280.png)
 ③Inputダイアログをクリックすると、右側にそのプロパティが表示されます。ここで、入力された文字を格納する変数の定義ができます。Outputをクリックして、**Ctrl + k**キーを押すと名前を入力するように求められるので適当な変数名を付けてあげましょう。![キャプチャ5.PNG](https://qiita-image-store.s3.amazonaws.com/0/154110/393aa406-4242-a99f-af2c-49968b4242f1.png)
　変数はVariablesペインから確認が可能で、ここから型やScopeの編集ができます。デフォルトでは自動で隠れているので気をつけましょう(もちろん、追加も出来ます)![キャプチャ6.PNG](https://qiita-image-store.s3.amazonaws.com/0/154110/32ed03e6-61fe-ad83-55fe-906c65e44c41.png)
　④最後に、上記と同様の手順でMessage Boxをドラッグ&ドロップします。出力内容はContentsで定義できます。文字列は`+`で連結可能ですので、`"Hello! " + hoge + "さん"`としましょう。(文字列は"で囲うのを忘れずに！)インテリセンスが効いているのも確認すると◎です。![キャプチャ8.PNG](https://qiita-image-store.s3.amazonaws.com/0/154110/4b7d462b-50cd-292b-f6f4-4fb8182cde8f.png)
　⑤最後に`F5`で実行して内容を確認します。
![キャプチャ9.PNG](https://qiita-image-store.s3.amazonaws.com/0/154110/c651e126-17e6-049d-2dba-914f391ae686.png)![キャプチャ10.PNG](https://qiita-image-store.s3.amazonaws.com/0/154110/a98f2675-3eba-9137-f687-322f32814158.png)

VB.netを知っているのであれば、ほとんど違和感なくプログラムが出来たのではないでしょうか。
入力を受け取って、変数に格納⇒出力するのは上記のような手順で行います。

次はExcelやCSVを使った処理を書いてみようかな…
出来るだけHomebrewで管理出来ないか試してみた

仕事で使用しているMacを初期化する機会があったので、
可能な限りHomebrewでインストール出来ないか試してみた。

## 対象環境

MacBook Pro (Retina 13-inch、Early 2015) 128GB

Mac OS El Capitan

## 下準備

## [Homebrew](https://brew.sh/index_ja.html)

```
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

## [Homebrew-Cask](https://caskroom.github.io/)

```
$ brew cask
```

### [homebrew-cask-versions](https://github.com/caskroom/homebrew-versions)

```
$ brew tap caskroom/versions
```

## サーチアンドインストール

### サーチ

```
brew search "使うアプリの名前"
```

### インストール

```
$ brew cask install iterm2
$ brew cask install alfred
$ brew cask install sublime-text
$ brew cask install disk-inventory-x
$ brew cask install google-chrome
$ brew cask install google-japanese-ime
$ brew cask install xtrafinder
$ brew cask install appcleaner
$ brew cask install vagrant
$ brew cask install vagrant-manager
$ brew cask install virtualbox
$ brew cask install sourcetree
$ brew cask install dash
$ brew cask install gimp
$ brew cask install the-unarchiver
$ brew cask install realm-browser
$ brew cask install sqlitebrowser
$ brew cask install dbeaver-community
$ brew cask install eclipse-ide
$ brew cask install java
$ brew cask install java6
$ brew cask install libreoffice
$ brew install docker
$ brew install docker-machine
$ brew install carthage
$ brew install cocoapods
$ brew install ffmpeg
$ brew install poppler
$ brew install pandoc
$ brew install tomcat@6
$ echo 'export PATH="/usr/local/opt/tomcat@6/bin:$PATH"' >> ~/.bash_profile
$ # Tomcat Home -> /usr/local/Cellar/tomcat@6/6.0.51/libexec
$ brew install tomcat@7
$ echo 'export PATH="/usr/local/opt/tomcat@7/bin:$PATH"' >> ~/.bash_profile
```

#### Xcode

##### xcode-installインストール＆インストール可能Xcodeバージョン全表示

```
$ sudo gem install xcode-install
$ xcversion list --all
Username: Apple Developer ID
Password (for Apple Developer ID): Apple Developer Password
```

##### 任意のXcodeをインストール

```
$ xcversion install Xcode Version
Username: Apple Developer ID
Password (for Apple Developer ID): Apple Developer Password
```

## 結果

Google日本語入力など、インストーラーと違い、
インストール後に自分で設定が必要になったアプリもあったが、

思ったよりHomebrewに対応しているアプリが多く、
次回の再セットアップにもコマンドが流用できるため、管理が楽になったように思える。
Sublime Text2 | CSharp > 関数リストが表示されない場合 > SyntaxをC++にする

```txt:動作環境
Windows 8.1 Pro (64bit)
Sublime Text 2
```

とあるC#スクリプトをSublime Text 2において開いて、関数リストを取得しようとした。
Ctrl+Rしたときに表示されるのはusingの行とnamespaceの定義のみ。
namspace内で定義している関数がリストに表示されない。

### 対処

syntaxをC++に変更すると関数リストに全関数の定義が表示されるようになった。

C#としての解釈に失敗しているのだろうか。
[React]`This can lead to unexpected behavior when compiling on a filesystem with other case-semantic`という警告が出た時　


エラー回避用の備忘録

```sh
W
This can lead to unexpected behavior when compiling on a filesystem with other case-semantic.
Use equal casing. Compare these module identifiers:

* /Users/nmatsumoto4/Documents/rails/workspace/sampleApp/node_modules/babel-loader/lib/index.js??ref--1!/Users/nmatsumoto4/Documents/rails/workspace/sampleApp/node_modules/b
abel-loader/lib/index.js??ref--4!/Users/nmatsumoto4/Documents/rails/workspace/sampleApp/app/javascript/assets/components/util/MstSelect.js
    Used by 1 module(s), i. e.
    /Users/nmatsumoto4/Documents/rails/workspace/sampleApp/node_modules/babel-loader/lib/index.js??ref--1!/Users/nmatsumoto4/Documents/rails/workspace/sampleApp/node_modules
/babel-loader/lib/index.js??ref--4!/Users/nmatsumoto4/Documents/rails/workspace/sampleApp/app/javascript/assets/components/pages/RollCalls/beforeDrive/selectDriverStep.j
s
* /Users/nmatsumoto4/Documents/rails/workspace/sampleApp/node_modules/babel-loader/lib/index.js??ref--1!/Users/nmatsumoto4/Documents/rails/workspace/sampleApp/node_modules/b
abel-loader/lib/index.js??ref--4!/Users/nmatsumoto4/Documents/rails/workspace/sampleApp/app/javascript/assets/components/util/mstSelect.js
    Used by 2 module(s), i. e.
    /Users/nmatsumoto4/Documents/rails/workspace/sampleApp/node_modules/babel-loader/lib/index.js??ref--1!/Users/nmatsumoto4/Documents/rails/workspace/sampleApp/node_modules
/babel-loader/lib/index.js??ref--4!/Users/nmatsumoto4/Documents/rails/workspace/sampleApp/app/javascript/assets/components/pages/DispachTrucks/addEdit/filterTrucksStep.j
s
```

これはimportする時に、同じコンポーネントを違う形式でimportするとなる。
この場合は、
selectDriverStep.jsではMstSelect

```js:selectDriverStep.js
import MstSelect from '~/components/util/MstSelect.js'
```

js:filterTrucksStep.jsではmstSelect

```js:filterTrucksStep.js
import MstSelect from '~/components/util/mstSelect.js'
```

と読んでおり、同じファイルを異なる識別子で呼んでいる。という警告である。
どちらかに識別子を揃えれば治る。
ちゃんと警告内容見ればわかる内容でした。
(ぐぐるだけじゃダメですね。)
イラレで山路以外を登りたい

![zoizoi.gif](https://qiita-image-store.s3.amazonaws.com/0/185296/15450b99-fe65-a2ef-530b-e00c4a1b988a.gif)

もうOFFにしてしまったあの「新規テキストオブジェクトにサンプルテキストを割り付け」の文字列を変えます。

## 設定ファイルを見つける
Windowsだとショートカットのプロパティに「作業フォルダ」の場所が表示されています。この中にあるja_JPフォルダを開いてください。
![WorkingDir.PNG](https://qiita-image-store.s3.amazonaws.com/0/185296/62ea2071-b051-54ec-4e5e-27f288d69aae.png)

私の環境では以下のフォルダになりました。
`C:\Program Files\Adobe\Adobe Illustrator CC 2017\Support Files\Contents\Windows\ja_JP`

Macだとここです。
`/Applications/Adobe Illustrator CC 2017/Support Files/Resources/ja_JP/Lang-Resources`

Windows / Macともに `Illustrator.ztx` というファイルが見つかりましたでしょうか。これがローカライズ情報が書かれているファイルです。

## Illustrator.ztxを編集して君だけの山路を登ろう
イラレのように多言語展開されているソフトウェアは各国語での表示内容を設定ファイルとして保持し、それをプログラム側から読み込んでいることが多いです。「言語パック」とでも言いましょうか。
要するにこいつを編集してしまえばイラレの画面上に表示される文字列は思いのまま（のはず）です。

当然ながら「山路を登りながら」もここに設定されています。

### テキストエディタで開く
（一応ここからは自己責任でお願いします。Illustrator.ztxのバックアップを取っておいても良いでしょう。）
.ztxという見慣れないファイル形式ですが、実体はテキストファイルですから普通にメモ帳で開けます。わりと重いですけど。

Windows環境では管理者権限でテキストエディタを起動しないと上書き保存できませんので要注意です。（作業フォルダへのアクセスに管理者権限が必要なので）
テキストエディタを右クリック→「管理者として実行」でOKです。

Macもsudoしないと上書き保存できないんですが、rootなにそれおいしいの？という方はとりあえず書類なりデスクトップなりに保存し、先程のフォルダに移動して上書きすればよいと思います。

私の環境では9094行目（Windows）、9068行目(Mac)に問題の部分がありました。行数から探すのはかなり面倒なので `PlaceHoldeText/Word2` で検索（Ctrl+F）してしまったほうが早いと思います。

```
"$$$/PlaceHoldeText/Word2=山路を登りながら"
```

こいつを編集して上書き保存してしまえばOKです。= や " を削らないように気を付けてください。

```
"$$$/PlaceHoldeText/Word2=今日も一日がんばるぞい！"
```
うっかり管理者権限でエディタを開き忘れた方、管理者権限での開き方がわからなかった方はデスクトップなどの普通に保存できる場所に保存した上で作業フォルダに移動する操作をしてください。

余談ですがNEW GAME!だと飯島ゆんちゃんが好きです。

## イラレを起動して試す
当たり前ですが「新規テキストオブジェクトにサンプルテキストを割り付け」をONにしてあげてください。
冒頭の画像のような感じになります
![zoizoi.gif](https://qiita-image-store.s3.amazonaws.com/0/185296/15450b99-fe65-a2ef-530b-e00c4a1b988a.gif)

## その他
長文のサンプルテキストの方はLorem Ipsumに差し替えると若干実用的になるかもしれませんね。
Git Lab を勉強中

#GitLab
GitLabを最近よく使っていたのですが日本語になっていなかったので簡潔に項目（メニュー）を追加

##見方の確認
[言葉] - 意味
・項目
：ステータス

#タグ

・Project - 計画, 企画, プロジェクト

・Repository - 倉庫, レポジトリ
#####Files - 書類,ファイル 出願する言葉が完成物のような感じですね。
#####Commits - 委託,約束　コミット　ここではしっかりと送り込むという意味の方がわかりやすいかなぁ
#####Branches - 枝,ブランチ　拡張するという意味の方がわかりやすいかなぁ
#####Tags - 付け札,タグ
#####Contributors - 貢献者,コントリビュータ
#####Graph - 表,グラフ
#####Compare - 比較,コンペア 
#####Charts - チャーツ（プログラミング言語など？の円グラフ）

・Issues - 問題, イシュー
　：Open - 開放
　：Closed - 閉鎖
　：All - 全て
#####List - 一覧
#####Board - ボード 一目で図のように見れます
#####Labels - ラベル　ラベルの一覧
#####Milestones - マイルストーン / 達成度のような感じ？

・MergeRequests
合併要請
　：Open - 開放
　：Merged - 合併
　：Closed - 閉鎖
　：All - 全て

・Wiki
ウェブブラウザを利用してWebサーバ上のハイパーテキスト文書を書き換えるシステムの一種である。ここでは、サイトの状態などの説明のために使う
ランニングページという使い方も、、

・Settings
設定

徐々に追加していきます


##Labels - ラベル について
僕はこんな感じで使ってます
・バグ修正
・リリース対象
・レビュー中
・レビュー完了
・改善タスク
・TODO
・〜〜化
・リファクタリング
・リリース中
・テスト中
・開発中
・カテゴリ名 - カテゴリ名色々なジャンルごとに名前をつけるといいかも
など

##記事カキカキ
GitMaster - [http://sunstripe.main.jp/GitMaster](http://sunstripe.main.jp/GitMaster/)

---

## 関連記事

【About】(http://qiita.com/sunstripe) - サンストライプ

---

## 制作チーム：サンストライプ

[![sunstripe_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/322f2d60-f19d-af9e-2b6f-7290ca546848.png)](http://sunstripe.main.jp/)
http://sunstripe.main.jp/

(月１WEBコンテンツをリリースして便利な世の中を作っていくぞ！！ボランティアプログラマー/デザイナー/イラストレーター/その他クリエイター声優募集中！!)

### 地域情報 THEメディア
THE メディア 地域活性化をテーマに様々なリリース情報も含め、記事をお届けしてます！！
https://the.themedia.jp/

### ゼロからはじめる演劇ワークショップ
多様化の時代に向けて他者理解を鍛える

https://workshop.themedia.jp/

### プログラミングワークショップ・ウェブ塾の開講！！！
様々なテーマでプログラミングに囚われずに取り組んでいきます。
詳しくはこちら　↓　↓　↓　↓　↓　↓　↓　↓
[プログラミングサロン 月１だけのプログラミング学習塾](https://workshop.themedia.jp/posts/7057553?fbclid=IwAR32CfRQ7RvDOhvuogoSwqxDLMOU7Jvuzljlnx-TMc27qBPX1BnWsfLcBR8
)

### 協力応援 / 支援者の集い
## チーム：サンストライプ
#### プログラミングラボ
https://twitter.com/sunstripe2011

一緒にポートフォリオを作りませんか？現場の体験やそれぞれの立場から年齢関係なく作品を作りたい方々と一緒にチームを作って、作品を作っています。現場に行きたい人には、職場紹介や職場の体験や悩み相談なども受けております。
様々な職種からプログラミングの知識を得たい、デザインの知識を得たい、データーベースの知識を得たいという人が集まっております。
週１のミーティングにそれぞれの近況と作業報告して、たまにリモート飲み会などをしております！！

興味がある方は、DMに話しかけてみてください。

## トラストヒューマン
http://trusthuman.co.jp/
私たちは何よりも信頼､人と考えてます｡

｢コンサルティング｣と｢クリエイティブ｣の両角度から｢人材戦略パートナー｣としてトータル的にサポートします！！

キャリア教育事業
広域学習支援プラットフォーム『のびのび日和』
https://slc-lab.amebaownd.com/

#スポンサー募集
最近めちゃくちゃ便利になった Vim の dot repeat の設定

[ブログ記事](http://secret-garden.hatenablog.com/entry/2015/05/05/000000)からの転載です。

最近…というか asterisk.vim を使い始めた頃に（いまさら）dot repeat にはまっていたりします。  
例えば、asterisk.vim を利用すると `<Plug>(asterisk-z*)cgn` というキー入力で  
『カーソル下の単語を変更し、dot repeat で次の単語も同じ変更をする』  
という事ができます。  
dot repeat をうまく活用できなかった勢としては、これがかなり衝撃的でめちゃくちゃ便利でした。  
<br>
が、これにも欠点があり（asterisk.vim を使う上でしょうがないんですが）『カーソル下の単語』しか対象にする事ができません。  
textobj を多用する Vim でこれはちょっと不便だったので、__[operator-exec_command](https://github.com/osyo-manga/vim-operator-exec_command)__にヘルパ関数を追加し、もう少し柔軟性を高くしてみました。  

## operator#exec_command#mapexpr_gn({operator}[, {noremap}])

このヘルパ関数は『{motion} のテキストを @/ に保存したあとに {operator}gn を行う operator のキーマッピング』を返します。  
例えば `c` で dot repeat したい場合は以下のような設定になります。  

```vim
" C{motion} で {motion} のテキストに対して dot repeat する事ができる
nmap <expr> C operator#exec_command#mapexpr_gn("c", 1)
```

![dotrepeat](https://cloud.githubusercontent.com/assets/214488/7475515/09978496-f383-11e4-9dbd-9c2c39e9af64.gif)
<br>
これにより任意の textobj（{motion}）に対して dot repeat する事ができるようになります。  
また、`c` 以外のも `<Plug>(operator-replace)` などを適用することもできます。

```vim
nmap <expr> S operator#exec_command#mapexpr_gn("\<Plug>(operator-replace)")
```

これでかなり捗るようになった。
CentOS7にffmpegをyumインストール

# はじめに
諸事情あってアップロード済の動画からサムネイルを生成することになりました。
この段階で頭にはffmpeg使う事くらいしか思い浮かばないのでCentOS7にyumでインストールしたメモです。

#### EPELリポジトリ追加して
```
yum -y install epel-release
```
#### Nux Dextopリポジトリ追加して
```
rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
```
```
rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-1.el7.nux.noarch.rpm
```

#### yumでインストールするだけ

```
yum -y install ffmpeg ffmpeg-devel
```

#### 確認
```
ffmpeg -h
```
これでヘルプが表示されればOKです。
std::moveは使用上の注意をよく読み、用法・用量を守って正しくお使い下さい。

**要約：** `std::move()`は「オブジェクト構築／代入操作においてムーブセマンティクス(move semantics)を明示するため」のものであり、それ以外の場面で用いるべきでない。という主張。

```C++:正しい使い方
FooClass x;
FooClass y{std::move(x)};  // xからyへムーブ操作

FooClass z;
z = std::move(y);          // yからzへムーブ操作
```

## 不適切事例1

```C++:適切でない使い方1
FooClass x;

// std::move戻値を右辺値参照型rxに束縛しておき...
FooClass&& rx = std::move(x);

// あとでrxから"ムーブ"するつもり??
FooClass y = rx;
```

右辺値参照型の変数 `rx` をどう利用するつもりでした？あなたの期待に反して `FooClass y = rx;` は "ムーブ操作" ではなく "コピー操作" になります。`rx`（つまり`x`）から "ムーブ操作" を行う場合は、

```C++
FooClass y = std::move(rx);
```

のように、結局は `rx` に対しても `std::move` を明示する必要があります。何のために右辺値参照型(`FooClass&&`)を使ったんでしたっけ？


## 不適切事例2

```C++:適切でない使い方2
FooClass x, y;

// std::move戻値に別オブジェクトを代入??
std::move(x) = y;
```

このコードで行われる処理は、単純なコピー代入操作(`x = y;`)と等価です。つまりこの`std::move`は、善良なプログラマを惑わすだけの冗長なシロモノです。やめときましょう。

**重箱の隅：** コピー代入演算子を `operator=(const T&) &` と `operator=(T&) &&` でオーバーロード定義すれば、`x = y;` で前者を `std::move(x) = y;` で後者をと呼び分けることはできます。ただし（私が知る限り）、後者のセマンティクスについて広く合意されたものはないため、あくまでも自己責任でどうぞ。


# やる気の無い解説

- `std::move`関数 **それ自身は、何の処理も行いません**。
- `std::move`関数は、**型キャスト(type cast)** しか行いません。
- 実際の "ムーブ操作" 処理を行うのは、構築／代入対象となるクラス自身です。
- 関数名`move`が示すとおり、「ムーブセマンティクス」を**ソースコード上で明示するラベル** に過ぎません。
- C++文法上は、明示的な型キャストにより "ムーブ操作" を行えます。`std::move`関数は必須ではありませんが、**分かりやすさのため** 利用が強く推奨されます。
JQueryの目的の場所に要素を追加

### append
・指定した要素の最後に、引数で指定した内容を追加。
`$('#box').append('<div>...</div>');`

### appendTo
・指定した内容を、引数で指定した要素の最後に追加する。
`$('<div>...</div>').appendTo('#box');`

### prepend
・指定した要素の最初に、引数で指定した内容を追加。
`$('#box').prepend('<div>...</div>');`

### prependTo
・指定した内容を、引数で指定した要素の最初に追加する。
`$('<div>...</div>').prependTo('#box');`

### after
・指定した要素の直後に、引数で指定した内容を追加する。
`$('#box').after('<div>...</div>');`

### insertAfter
・指定した内容を、引数で指定した要素の直後に追加する。
`$('<div>...</div>').insertAfter('#box');`

### before
・指定した要素の直前に、引数で指定した内容を追加する。
`$('#box').before('<div>...</div>');`

### insertBefore
・指定した内容を、引数で指定した要素の直前に追加する。
`$('<div>...</div>').insertBefore('#box');`
Ubuntu 16.04でのPHP5<->7切り替え

Ubuntu 16.04でのPHPは、デフォルトでは7系になっています。
ですが、まだPHP5系の環境が必要になり、
インストールすることもあるでしょう。

このとき、PHP5系でPHPクライアント実行をさせたい場合、
そのままではPHP7が実行される場合があります。

そんなときは、

```shell-session
sudo update-alternatives --list php
```
と打つと、

```shell-session
/usr/bin/php5.6
/usr/bin/php7.1
```

のように結果が出ますので、

```shell-session
sudo update-alternatives --set php /usr/bin/php5.6
```

のようにすれば、

```shell-session
update-alternatives: using /usr/bin/php5.6 to provide /usr/bin/php (php) in manual mode
```

という出力により、変更が確認できます。
opencvで動画読み込みをループする

動画の末尾に到達したときに最初から再生する。

```py
cap = cv2.VedeoCapture(file)
while cap.isOpened():
    (grabbed, img) = cap.read()
    if not grabbed:
        cap.set(cv2.CAP_PROP_POS_FRAMES, 0)
        continue
    ...
```
bootstrapでinput-groupとbtn-groupを条件によって使い分ける

まずは、単体の`input-group`を試してみる。以下のコードで下のようなものができる。aaaaのボタンは切り替えよう。目標は、真ん中のInputFieldをボタンにかえる。

```haml
#test-area.input-group
  .input-group-btn.test-btn
    %button.btn.btn-success operator
  %input.form-control#test-input
  %button.btn.btn-info#test-set-value{style: "display: none;"} set value
  .input-group-btn.test-btn
    %button.btn.btn-success plus
%button.btn.btn-primary#change{ type: 'button' } aaaa
```


<img width="271" alt="Screen Shot 2017-06-10 at 4.59.34 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/7059/76e61237-39cd-b2e3-3460-580dca29c53b.png">


Coffeescriptを書いて、HideしていたButtonを真ん中のInputの代わりに出すようにする。基本は、`input-group`, `input-group-btn`と `btn-group`を入れ替えるだけで済む

```coffeescript
$ ->
  $('#change').on 'click', ->
    console.log 'click'
    $('#test-input').toggle()
    $('.test-btn').toggleClass 'input-group-btn'
    $('#test-area').toggleClass 'input-group'
    $('#test-area').toggleClass 'btn-group'
    $('.test-btn').toggleClass 'btn-group'
    $('#test-set-value').toggle()
```

<img width="260" alt="Screen Shot 2017-06-10 at 5.22.33 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/7059/413d5ed5-9ba6-c2fd-5d7c-6687860133b7.png">

このClassの付け外しを行わないと以下のように真ん中のボタンが中途半端な位置に来てしまう。

<img width="261" alt="Screen Shot 2017-06-10 at 5.23.27 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/7059/5953abc8-d345-5e4d-6e62-7b1fad535bf4.png">
[checkio] Xs and Os Referee

マルバツゲームの審判をするプログラムを作る。
機械ちゃんなんでもやってくれやーと。

３つの文字列要素からなる配列を引数として渡されて、３種の勝利パターンいずれかが存在するかを確認し、勝敗の決しないものには不名誉の"D"を渡す。

###自分の回答
```js
function xoReferee(data) {
    let winner = "";
    data[0] = data[0].split('');
    data[1] = data[1].split('');
    data[2] = data[2].split('');
    
    for (let i = 0; i < 3; i++) {
        //checking horizontally
        if (data[i][0] == data[i][1] && data[i][1] == data[i][2]) {
            winner = data[i][0];
        }
        //checking vertically
        else if (data[0][i] == data[1][i] && data[1][i] == data[2][i]) {
            winner = data[0][i];
        }
        //checking diagnolly
        else if (data[0][0] == data[1][1] && data[1][1] == data[2][2]) {
            winner = data[0][0];
        } else if (data[0][2] == data[1][1] && data[1][1] == data[2][0]) {
            winner = data[0][2];
        }
    }
    
    if (winner != "X" && winner != "O") {
        winner = "D";
    }
    
    return winner;
}
```
論理演算子も使ってちょっとだけ簡潔にできた。
盤面が拡大すれば無用の長物と化す。holy shit!!

###すごいとおもったかいとう
```js
function checkio(data) {
    var chars = data.map(function (a) {return a.split('')});
    for(var i=0; i<3; i++){
        data.push(chars[0][i] + chars[1][i] + chars[2][i]);
    }
    data.push(chars[0][0] + chars[1][1] + chars[2][2]);
    data.push(chars[2][0] + chars[1][1] + chars[0][2]);
    
    if (data.indexOf("XXX") + 1) {
        return "X"
    }
    if (data.indexOf("OOO") + 1) {
        return "O"
    }
    return "D"
    
}
```
ンンンンなるほど。
勝利パターンのフォーミュラを一つの配列に全て盛り込み、X、Oそれぞれの連続した文字列(勝利パターン)がその中にあるかをindexで確認する。
+1しているのは0番目のインデックスのため。

###学び
・map()関数
配列クラスのメソッド。引数に与えた関数を配列の要素全てに呼び出して新しい配列を返す。

>```js
var numbers = [1, 4, 9];
var roots = numbers.map(Math.sqrt);
```
*[Array.prototype.map() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/map)*

例えばこう呼び出せばnumbersの内容は保持しつつ、rootsに平方根バージョンの配列を作り出す。

これをfor文で書くと、

```js
var numbers = [1,4,9];
var roots = [];
for (let i of numbers) {
  roots.push(Math.sqrt(i));
}
```
なるほど簡潔。関数をもっとしっかり書きたいときに便利そう。

###反省
もっと早く回答できるようにしよう。
あと2層のifで勝利パターンを確認していた時なぜかうまく行かないことがあったので、if文の動きを確認する。
octopackageでPHPライブラリをリリースする方法

## [octopackage](https://github.com/k1LoW/octopackage) って何？

PHP用の[octorelease](https://github.com/mizzy/octorelease)です。

（参考: [octoreleaseのJavaScript版 "octopublish"と、PHP版 "octopackage" を作った - Copy/Cut/Paste/Hatena](http://k1low.hatenablog.com/entry/2017/06/19/083000) )

`composer octopackage`コマンドを実行することで、自動で以下の処理を実行します。

- 新しいバージョン番号でtagを作成（ `v1.0.0` 形式 )（ `--major` `--minor` `--patch` )
- tagもふくめて `git push`
- 既存のバージョン番号(tag)からの新しいバージョン番号(tag)の間にあったPull Requestにどのバージョンでリリースされたかがわかるようにコメント（ "Released as v1.0.0." )
- 既存のバージョン番号(tag)からの新しいバージョン番号(tag)の間にあったPull Requestのタイトルを収集してGitHubのreleaseを作成

PHPのライブラリをPackagistに登録するには、GitHubとPackagistを連携する必要があります。

逆にいうと、GitHubとPackagistを連携しておけば、GitHubにバージョン番号のtagをpushするだけで、Packagistに登録されます。

なので、octopackageが実施するのはGitHubへのtagのpushまでです。

## 使い方

### 初期設定

まず、何はなくとも `~/.config/hub` の設定が必要です。

以下のようなファイルが生成されている必要があります。hubコマンド用の設定ですね。

```yaml
---
github.com:
- protocol: https
  user: YOUR_USER_ID
  oauth_token: YOUR_OAUTH_TOKEN
```

（参考: [hubを2-factor authentication（2要素認証）有効でも使いたい](http://qiita.com/izumin5210/items/28dfd5fa9e03fb68c042) )

### インストール

オススメは各プロジェクトでoctopackageをインストールする方法です。

```sh
$ cd your-php-project/
$ composer require k1low/octopackage --dev
```

グローバルにもインストールできます。

```
$ composer global require k1low/octopackage
```

### 実行（リリース）

octopackageはComposerプラグインとして作成されています。なので、コマンドは `composer octopackage` となります。

```sh
$ cd your-php-project/
$ composer octopackage 
```

デフォルトではpatchバージョンを上げる形になっていますので、minorバージョンをあげてリリースしたいときには `--minor` オプションを、majorバージョンをあげてリリースしたいときには `--major` オプションを付与して実行してください。

## 別の使い方

octopackageはgit pushまでしかしません。

ということは、普段の開発でPullRequestベースでの開発をしていれば、バージョンタグやGitHubのreleaseをいい感じに管理できます。

便利！

## あわせて読みたい

[linyows/capistrano-github-releases: GitHub Releases tasks for Capistrano v3](https://github.com/linyows/capistrano-github-releases)
とりあえずsshを使いたくてググりながらなんとかなった時のメモ

何もよくわからない状態でとりあえずbitbucketでsshを使いたくてググりながらなんとかなった時のメモ

### 試行錯誤

SSH入ってますかー？

```
$ ssh -V 
OpenSSH_7.3p1, LibreSSL 2.4.1
```

/.sshの中何が入ってんのよー？

```
$ ls -a ~/.ssh
known_hosts  id_dsa
```

ssh鍵をジェネレートするよー

```
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/hogenobu/.ssh/id_rsa):                          
/Users/hogenobu/.ssh/id_rsa already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /Users/hogenobu/.ssh/id_rsa.
Your public key has been saved in /Users/hogenobu/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:M2AfimvEeUB2Mgc0IhmVxZ+iTitp5/+cM/oIWiBHD5U hogenobu@PC
The key's randomart image is:
+---[RSA 2048]----+
|o+o=@oo          |
|...=E*           |
|  o ..o..        |
| . +.=o+ .       |
|....*.o S        |
|..+. o   o       |
| + +o            |
|o.=o. oo.        |
|.oo..++=o        |
+----[SHA256]-----+
```

※実は/.sshにすでにkyeがあるのに上うっかりOverwriteにyesと答えてあとで結構苦労した話もあるけど割愛


```
$ ps -e | grep [s]sh-agent
 2578 ??         0:00.02 /usr/bin/ssh-agent -l
```

```
$ ssh-agent /bin/bash
```

```
$ ssh-add ~/.ssh/id_rsa
```

```
$ ssh-add -l 
```

```
$ cat ~/.ssh/id_rsa.pub
ssh-rsa ごにゃごにゃ
```

```
$ pbcopy < ~/.ssh/id_rsa.pub
```

```
$ cd ~/.ssh
```

```
$ touch config
```

```
$ chmod 700 config
```

```
$ vi config
```

vim弱だから参考になりました　（http://qiita.com/hide/items/5bfe5b322872c61a6896）

```
Host bitbucket.org
  HostName bitbucket.org
  IdentityFile ~/.ssh/bitbucket/id_rsa
  User hogenobu
  Port 22
  TCPKeepAlive yes
  IdentitiesOnly yes
```

```
$ ssh -T bitbucket.org
no such identity: /Users/hogenobu/.ssh/bitbucket/id_rsa: No such file or directory
Permission denied (publickey).
```

ダメだった

公式　https://ja.confluence.atlassian.com/bbkb/permission-denied-publickey-302811860.html

```
$ ssh -T hg@bitbucket.org
logged in
```

ログインできた

### 参考になったサイト様たち

公式
https://confluence.atlassian.com/bitbucket/set-up-ssh-for-git-728138079.html

[Bitbucket]gitコマンドでBitbucketを操作する　〜基本編〜
http://qiita.com/yyosuke/items/986dabc9906674e2ea97

bitbucketにgitでpushするとPermission denied (publickey).と表示されるときの解決法
　http://kuroneko0208.hatenablog.com/entry/2013/08/22/181251

Gitで”Permission denied (publickey).” が出たときのメモ
http://qiita.com/sygnas/items/43306a738f01cb7ab45c

初めてGitHubリポジトリにpushしたらrejectedエラーになったときの対応メモ　http://qiita.com/takanatsu/items/fc89de9bd11148da1438


### ペア鍵について
gitlabへのpush時に「does not appear to be a git repository」と表示されるときの対策
http://qiita.com/volanja/items/d0ed86dbb6e4ec7d7a54

BitbucketにSSHでアクセスする（複数アカウントもおっけー）
http://cflat-inc.hatenablog.com/entry/20130311/1362955659

GitHubやBitbucketで複数アカウントを使い分ける方法
http://blog.amanesiku.com/?p=390
(初心者向け)Swift3.0で初アプリ - 最初のアプリを作ってみる

Swift3.0を使って簡単なiPhoneアプリを作ってみます

#１. Xcodeでアプリを作ってみます
- Xcodeを起動し、「Create a new Xcode project」を選択します
![スクリーンショット 2017-06-20 10.35.39.png](https://qiita-image-store.s3.amazonaws.com/0/125842/7befc0e4-9164-1af7-bbd2-3611f918cc04.png)
- 「Single View Application」を選び、「Next」を押します
![スクリーンショット 2017-06-20 10.36.13.png](https://qiita-image-store.s3.amazonaws.com/0/125842/898af7a9-65e6-aed7-8457-61a8de861037.png)
- 「Product Name」を適当に指定します
- 「Team」のプルダウンメニューで、Apple Developer Programに登録したIDを選択します（Apple Developer Programに登録していないとこの後のステップでiPhoneにアプリをインストールできません）
- 「Organization Name」は自分の名前などを指定します
- 「Organization Identifier」は自分の社名を逆に読んだ文字列を指定するのが一般的です。たとえば"com.xxx"などになります
- 「Language」は「Swift」を選択します
- 「Device」は「iPhone」を選択します
- 「Next」を押します
- プロジェクトを保管するフォルダーを選択します
- アプリが作成されました。下記のような画面が表示されます
![スクリーンショット 2017-06-20 10.42.35.png](https://qiita-image-store.s3.amazonaws.com/0/125842/3427d713-9bfb-e902-a152-6794369f7d45.png)

#2. 画面を作ってみます
- 画面左側のメニューから「Main.storyboard」を選択します。下記のような画面が表示されます
![スクリーンショット 2017-06-20 10.44.20.png](https://qiita-image-store.s3.amazonaws.com/0/125842/1d3dcfdf-e191-e6e0-10ad-7f946606d141.png)
- （18/11/02追記） Xcode10？から右下の入力欄が廃止？され表示されなくなっています。参照→[【XCode】XCode10からの変更で、右下のアイツがいない](https://qiita.com/okamu_/items/9378c022aae26643a02b)
- 画面右下の入力欄に"label"と入力すると、その上に「Label」が選択肢として表示されます
![スクリーンショット 2017-06-20 10.45.43.png](https://qiita-image-store.s3.amazonaws.com/0/125842/daf6cf5b-ef9a-a4ac-8d23-63abf718209c.png)
- 表示された「Label」を選択し、画面中央のストーリーボードへドラッグ＆ドロップします。ラベルが作成されます
![スクリーンショット 2017-06-20 10.47.21.png](https://qiita-image-store.s3.amazonaws.com/0/125842/4f76229a-3c8c-fca6-c1a2-19a2142bdc7c.png)
- このままではラベルの文字が小さくて見にくいので、画面右上のメニューからフォントのサイズを大きくします。またストーリーボード上のラベル領域が小さいのでドラッグして拡張し、文字列を変更する、中央に揃えるなどします
- 画面の背景部分を選択し、右側のメニューから色のメニューを選択し色を設定します。色のメニューの最下部の「Other」を選択すると、任意の色を設定可能です

![スクリーンショット 2017-06-20 10.53.29.png](https://qiita-image-store.s3.amazonaws.com/0/125842/a164fdb7-a776-e948-5db5-1aa3b47f1de0.png)

#3. シミュレーターで確認します
- Xcode画面左上のビルドターゲットとして"iPhone7"などが選択されていることを確認します

![スクリーンショット 2017-06-21 10.11.36.png](https://qiita-image-store.s3.amazonaws.com/0/125842/e89c11b3-fcce-aafe-1673-995f7c1f28eb.png)

- [Command]+R（もしくは「▶」ボタン）を押してビルドを実行します。"Build Succeeded"のメッセージが表示されビルド（コンパイル）がうまくいったことがわかります。
- Xcodeとは別にシミュレーターのプログラムが起動しているので、画面を切り替えてシミュレーターを表示（前画面）にします。ラベルに設定したとおり「こんにちは」と表示されていることを確認します

![スクリーンショット 2017-06-21 10.18.38.png](https://qiita-image-store.s3.amazonaws.com/0/125842/f1191e57-bcf0-8531-bed7-a41a0383bee6.png)




#4. iPhoneで実行してみます
- iPhoneをMacbookに接続します
- Xcodeの画面左上のビルドターゲットから接続した自分のiPhoneを選択します。表示されるプルダウンの選択肢の一番上のほうにあります
- [Command]+R（もしくは「▶」ボタン）を押してビルドを実行します。"Build Succeeded"のメッセージが表示されビルド（コンパイル）がうまくいったことがわかります。
- iPhoneにアプリがインストールされ、画面が表示されることを確認します。

<img width="375" alt="IMG_3586.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/125842/96252794-5dcb-a7f7-1a89-c75e39f61098.png">

# 次のステップへ
- [ボタンを付けてみます](http://qiita.com/egplnt/items/b3c8804f99766a892701)
- [次画面を追加してみる](http://qiita.com/egplnt/items/2806aa6b88a966a82f8c)

#関連ページ
- [(初心者向け)html5upを使ってみる](http://qiita.com/egplnt/items/2643c299d8540f749181)
Lineスタンプを作ってみた

#Line Studioというアプリがリリースされたのでスタンプを作成してみた

Line Studioアプリはアプリ内でスタンプの作成から申請までできるアプリ
https://itunes.apple.com/jp/app/line-creators-studio-%E7%B0%A1%E5%8D%98-%E5%86%99%E7%9C%9F%E3%81%A7line%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%97%E3%81%8C%E3%81%A4%E3%81%8F%E3%82%8C%E3%82%8B/id1239684967?mt=8

とりあえずダウンロードしてスタンプを作ってみることに

<img width="375" alt="asset.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/126397/954f29bc-355c-3f27-7e9f-683728be51b0.png">

カメラロールにあった去年グアムで釣ったカツオの画像を切り抜いて
文字を追加して完成！

画像の切り抜きも、文字の配置も直感的で簡単にできます

#そして申請へ
名前、住所、電話番号、スタンプの説明をアプリ内で入力するだけで申請完了しました

#審査過程
6/14 19時30分くらいに申請
↓
6/19 20時47分審査完了　承認
↓
公開ボタンを押す
↓
一時間後くらいにストアに掲載

#管理画面
![キャプチャ03.PNG](https://qiita-image-store.s3.amazonaws.com/0/126397/2724337c-6419-a51a-f172-1cc9fdc7b810.png)
売り上げ、統計情報など観れるみたいです

#管理画面→売上レポート
分配額の速報値が照会できます。
確定金額の確認は｢送金申請｣をご確認ください。

ここに表示されている金額は、送金対象となる確定金額とは異なります。
LINE STOREおよびLINEアプリ内ショップのランキング更新より、売上データの情報反映が遅い場合があります。ご了承ください。
LINEコインは2015年4月30日分までの購入分は1コイン1.47円として計算されます。
2015年5月1日以降の購入分は1.76円として計算されます。

![キャプチャ04.PNG](https://qiita-image-store.s3.amazonaws.com/0/126397/e08e98bc-01f7-6f54-b07e-a427ae2f882b.png)

３０分おきくらいでデータが更新されるようです

#管理画面→統計情報：アイテム
![キャプチャ05.PNG](https://qiita-image-store.s3.amazonaws.com/0/126397/22c2c626-8bc8-be8f-3209-1eac5ebc3ca9.png)
どのスタンプが一番使われているかなど確認できて便利です

![キャプチャ06.PNG](https://qiita-image-store.s3.amazonaws.com/0/126397/9f5b1527-569b-a726-cb95-d9648222bc00.png)
鮮度が命が一番しようされているようです
こちらの更新は結構遅くて一日一回くらい？

#まとめ
こんな適当なスタンプでも配信されるんですね...
管理画面を見てみると配信直後に謎に一個売れてました
あとで、管理画面についても記述したいと思います
適当に作ったカツオスタンプ販売中です
http://line.me/S/sticker/1464026
CCD > Binning > faster readout speeds and improved signal to noise ratios

CMOSカメラでBinning modeというのがあり、何をしているか調べた。
以下の資料はCCDでの例である。

http://www.andor.com/learning-academy/ccd-binning-what-does-binning-mean

> Binning allows charges from adjacent pixels to be combined and this can offer benefits in faster readout speeds and improved signal to noise ratios albeit at the expense of reduced spatial resolution.

以下の二者での比較もしている

- single pixel readout
- binning operation

図の左側がsingle pixel readout、右側がbinning operation。

図の左中央にある番号はテキストの項目番号に対応する。

Signal to noise ratioについては

> Even if we subsequently sum the four pixels in a computer after readout the signal to noise ratio becomes 4:1. In adding the four pixels we sum the signal (4 times 20e i.e. 80e) and the noise is added in quadrature i.e. square root of the sum of the noises squared (square root of 4 times 10 squared i.e. 20e). In the binned example there is no noise until the signal is readout by the amplifier so the signal to noise ratio is 8:1(80e/10e) i.e. twice as good as the single pixel readout mode.

ノイズがどの時点で混入するかというとreadoutの時点。
binningを行う利点はここにあるようだ。

- single pixel readoutを4回足した場合は 4:1
- binning operationの場合は 8:1
Ansibleにてネストするディクショナリをループできない

### 概要

Ansibleでネストするディクショナリをいい感じにループできないので対応方法を備忘としてメモ。
誰か知っている人がいたら教えて下さい。

### 環境情報

```
$ ansible --version
ansible 2.3.0.0
  config file = /etc/ansible/ansible.cfg
  configured module search path = Default w/o overrides
  python version = 2.7.12 (default, Sep  1 2016, 22:14:00) [GCC 4.8.3 20140911 (Red Hat 4.8.3-9)]
```

### やりたいこと

例えばini_fileモジュールを利用する場合など、下記のようなネストしたディクショナリ変数をループさせたいと思いますよね。

```yaml
inifile_entries:
  section1:
    file: /var/log/messages
    format: "%b %d %H:%M:%S"
    initial_position: start_of_file
    buffer_duration: 5000
    group_name: system
    stream_name: stream1
  section2:
    file: /var/log/audit/audit.log
    initial_position: start_of_file
    buffer_duration: 5000
    group_name: audit
    stream_name: stream2
```

```yaml
- name: configure ini file
  ini_file:
    dest: /destfile
    section: "{{ item.key }}"
    option: "ここにネストしたディクショナリのキーを設定したい"
    value: "ここにネストしたディクショナリのバリューを設定したい"
  with_dict: "{{ inifile_entries }}"
```

ところが、これを実現する方法がありません。

### どうするか

変数をディクショナリではなくリストで定義して`with_subelements`を利用する形になります。
うーん格好悪い。


```yaml
inifile_entries:
  - section: section1
    params:
      - option: file
        value: /var/log/messages
      - option: format
        value: "%b %d %H:%M:%S"
      - option: initial_position
        value: start_of_file
      - option: group_name
        value: system
      - option: stream_name
        value: stream1
  - section: section2
    params:
      - option: file
        value: /var/log/audit/audit.log
      - option: initial_position
        value: start_of_file
      - option: group_name
        value: audit
      - option: stream_name
        value: stream2
```

```yaml
- name: configure ini file
  ini_file:
    dest: /destfile
    section: "{{ item.0.section }}"
    option: "{{ item.1.option }}"
    value: "{{ item.1.value }}"
    backup: yes
  with_subelements:
    - "{{ inifile_entries }}"
    - params
```
tapきらい

# ごめん。好き

cf. http://qiita.com/annyamonnya/items/04078bc38c57059e5dd2

# tapを愛する理由
1. すべてのオブジェクトに生えている
    - tapとはrubyのobjectクラスに紐づくメソッド
    - すべての(Stringみたいな組み込み系及び自分で作成したものもそのはず)クラスはobjectクラスを継承している
    - 継承されたクラスに定義されていたメソッドは、継承したクラスで呼び出すことができる
    - Rubyで扱う値とかは一部を除きすべて何かしらのクラスから生成されている
        - 一部(Stringとか)はnewしてないだけで実際Classから生成されているのかな？よくわからない。
    - 以上から、tapメソッド（正確にはインスタンスメソッドなんだけど）はすべてのインスタンスから呼び出すことができる。
2. コードがきれいになる
    - 例:https://qiita.com/jidosyabu/items/fb184d146a807a3ff697#%E4%BD%BF%E7%94%A8%E4%BE%8B

3. メソッドチェーンを繋げられる
    - 長過ぎるものはNGですが、メソッドのチェーンでつなげたほうが統一感があるので好きです。
    - 無理やり例を作れば次の様になります。いえ、確かに途中で説明変数としておいたほうが良さそうですが、、、
        - bad:a = A.hogehoge.fugafuga.fugofugo, b = func(a).fugefugo.fango
        - good:b =  A.hogehoge.fugafuga.fugofugo.tap { |a| func(a) }.fugefugo.fango

# tapが嫌いな理由
操作が抽象的
    - 最初何言ってんのかわかりませんでした。今でも説明がうまくいくにはどうしたらよいかわからない。慣れれば素敵なメソッドですね。


## 補足:数学っぽく書くとtapってこういう感じですね
$X=\rm{(ObjectClassから生成されるオブジェクト全体)}$とする。このとき$\rm{tap}$は$\rm{tap}:X\rightarrow X$を満たす写像として定義される。
- ただし、(これがプログラミングで言う関数の面白いところなのですが、)そのふるまいは逐一定義するので一定じゃないです。
Color Calibration > Macbeth standard color checker

Macbeth standard color checker

http://www.poynton.com/notes/color/GretagMacbeth-ColorChecker.html

読んでいる資料にて紹介されていた。
厳密に色補正するにはこういう治具を使うのだろうか。

実際にこれを必要とする場面は今のところ想定していない。
Dialogflow(旧:API.AI) のSmall Talkを使って一般的なリクエストの返答をカジュアルにしよう #dialogflow

#API.AIのSmall Talk
API.AIにはSmall Talkという機能があります。Small Talkは一般的な質問の答えを簡単にカスタマイズすることが出来る機能です。例えば「Who are you?」という質問の答えに対する言葉を複数用意しておくことが出来ます。***※Small Talkで用意しなかった場合はAPI.AIのデフォルトのものが返されます。***

##新しいAgentの作成
- Agent Name
    - SmallTalkTestProject
- LANGUAGE
    - English

##Small Talk

1.左側のメニューからSmall Talkを選択します。

<img width="241" alt="Screen Shot 0029-06-20 at 9.30.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/114922/89368314-0144-8f4b-c15b-547174e89bf4.png">

2.Enableにチェックを付けます。

3.About agent を開きます。

4.「Who are you?」の返答候補に「I'm small talk's test project.」と入れます。

<img width="400" alt="Screen Shot 0029-06-20 at 9.34.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/114922/1533088f-a158-cbd2-c705-44781a35049f.png">

5.終わったら上部のSaveボタンを押してください。

6.右のシュミレーターに「Who are you?」と入れて、「I'm small talk's test project.」と返事が来たら成功です。

<img width="336" alt="Screen Shot 0029-06-20 at 9.36.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/114922/fc5046f4-c167-a40d-54e7-209bda83f12a.png">

JSONデータにもしっかり記述されています♪

```json:response.json
{
  "id": "6fc76197-8062-469b-a861-0c11dd71328e",
  "timestamp": "2017-06-20T00:36:22.396Z",
  "lang": "en",
  "result": {
    "source": "domains",
    "resolvedQuery": "Who are you?",
    "action": "smalltalk.agent.acquaintance",
    "actionIncomplete": false,
    "parameters": {},
    "contexts": [],
    "metadata": {},
    "fulfillment": {
      "speech": "I'm small talk's test project.",
      "messages": [
        {
          "type": 0,
          "speech": "I'm small talk's test project."
        }
      ]
    },
    "score": 1
  },
  "status": {
    "code": 200,
    "errorType": "success"
  },
  "sessionId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
```

このように一般的な返答を簡単に作成することができます。まだまだ沢山の返答候補が作れるのでぜひ試してみてください♪
Ciscoルーターを操作してみる

「Ciscoルーターを操作してみる」というテーマで何回かにわけてコマンドを紹介していきたいと思います。今日はIPアドレスを割当ててみたいと思います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/161833/44960fc8-26f5-f60a-feed-6c5cf27cc954.png)

<手順>
①interface fastEthernetコマンドで各インターフェースに入ります。
②ip addressコマンドでIPアドレスとサブネットマスクを指定します。
③画像に書き忘れましたが、no shutdownコマンドでインターフェースを有効化します。
CodingKeyで、case名のcamelCase ⇄ stringValueのsnake_case を自動で変換する

[CodingKeyのマッピングを動的に切り替える - Qiita](http://qiita.com/takasek/items/94a8c3ccd7843c84f7fb) を書いてたら、なんかできそうな気がしたので類似アプローチでもうひとネタ。
やってみたらできた。


```swift
extension String {
    var snakecased: String {
        return self.replacingOccurrences(
            of: "([A-Z])",
            with: "_$1",
            options: .regularExpression
            ).lowercased()
    }
    var camelcased: String {
        return self
            .components(separatedBy: "_")
            .enumerated()
            .map { 0 == $0.offset ? $0.element : $0.element.capitalized }
            .joined()
    }
}

struct S: Codable {
    let hogeFuga: Int

    enum CodingKeys: String, CodingKey {
        case hogeFuga

        init?(stringValue: String) {
            self.init(rawValue: stringValue.camelcased)
        }
        var stringValue: String {
            return rawValue.snakecased
        }
    }
}

import Foundation

let data = """
{
    "hoge_fuga": 10,
}
""".data(using: .utf8)!

let decoder = JSONDecoder()
let s0 = try! decoder.decode(S.self, from: data)
print(s0)
```

結果:

```
S(hogeFuga: 10)
```

# 思ったこと

`String enum` だったらrawValueだけでなんとかしなきゃいけないと思い込んでたけど、そもそもインタフェース的には `init?(stringValue:)` を噛ませてるから、そこの処理を自前で書いてしまえば結構自由にフックできるんですねー。


# ちなみに、CodingKeyがコンパイラに自動生成されるときのコードはこんな感じらしいです。

https://github.com/apple/swift/blob/4468ad20281972e84cc93befc8bf0d2361f22bf8/lib/Sema/DerivedConformanceCodingKey.cpp#L313-L324

```swift
  // enum SomeEnum {
  //   case A, B, C
  //   @derived init?(stringValue: String) {
  //     switch stringValue {
  //     case "A":
  //       self = .A
  //     case "B":
  //       self = .B
  //     case "C":
  //       self = .C
  //     default:
  //       return nil
  //     }
  //   }
  // }
```

https://github.com/apple/swift/blob/4468ad20281972e84cc93befc8bf0d2361f22bf8/lib/Sema/DerivedConformanceCodingKey.cpp#L245-L257

```swift
  // enum SomeEnum {
  //   case A, B, C
  //   @derived var stringValue: String {
  //     switch self {
  //       case A:
  //         return "A"
  //       case B:
  //         return "B"
  //       case C:
  //         return "C"
  //     }
  //   }
  // }
```
curlのオプション--data, --data-binary, --data-raw, --data-urlencodeの違い

`--data`, `--data-binary`, `--data-raw`, `--data-urlencode` はどれも似ているが、下記の点で微妙な違いがある。

- `@ファイル名`でファイルの内容を送信するか
- `@ファイル名`でファイルの中の改行文字を削除するか
- データをURLエンコードするか

|オプション | @でファイル送信 | @ファイル内の改行を削除 | URLエンコード | 代表的な用途
|---|---|---|---|---|
|-d, --data, --data-ascii | ○ | ○ | × | JSONをPOSTする
|--data-raw | × | - | × | JSONをPOSTする
|--data-binary | ○ | × | × | バイナリファイルをPOSTする
|--data-urlencode | ○ | × | ○ | --getと一緒に指定してクエリー文字列をURLエンコードする

`-d`, `--data`, `--data-ascii`は完全に同じ。
`--data-raw`は`@ファイル名`の記法を解釈しない。それ以外は`-d`, `--data`と同じ。
`--data-binary`は`@ファイル名`でファイルの内容をそのままPOSTデータとしたい場合向け。
`--data-urlencode`は`Content-type: application/x-www-form-urlencoded`でPOSTしたい場合向けで、以下の5種類の記法に対応しており、`=`と`@`の扱いがやや特殊なので注意：

```
content
     contentをURLエンコードし、POSTデータとする。contentは = または @ を含んではならないことに注意。

=content
     contentをURLエンコードし、POSTデータとする。先頭の = 自体は取り除かれる。

name=content
      contentの部分をURLエンコードする。nameは自動的にURLエンコードされないので、自分でしておくことに注意。

@filename
     POSTするデータをファイルから読み込み、URLエンコードする。

name@filename
     ファイルからnameの値を読み込む。nameは自動的にURLエンコードされないので、自分でしておくことに注意。
```

## 改行文字の扱い

`--data`は`@a.txt`でファイルを指定した場合、ファイル内の改行文字（CR, LF）を削除する。つまり

```a.txt
a
b
c
```

というファイルを`--data '@a.txt'`で送信した場合、

```
abc
```

という3バイトが送信される。これが`--data-urlencode '@a.txt'`では

```
a%0Ab%0Ac%0A
```

となり、`--data-binary '@a.txt'`ではCR, LFをそのまま送る。


## -F, --formの例

`-F`, `--form`は`multipart/form-data`でのフォーム送信をエミュレートする。

```bash
# ファイルをアップロードする
curl -F "profile=@portrait.jpg" https://example.com/upload.cgi

# typeを指定してファイルをアップロードする
curl -F "web=@index.html;type=text/html" https://example.com/upload.cgi

# ファイル名を指定してファイルをアップロードする
curl -F "file=@localfile;filename=nameinpost" https://example.com/upload.cgi
```
strongSwanで3DES_CBC not supportedのエラーが出た場合

# 概要
IPSecの設定がうまくいかずエラーを見たら3DES_CBC not supportedのエラーが出ていたので、解消した話です。

# 環境
- Linux Mint 18.1
- strongSwan 5.3.5-1ubuntu3.3

# 参考
- http://qiita.com/__cooper/items/4b5ab7ae40b0e95f0d19

# 詳細
参考ページに書いてあるとおり進めていったところ、 `ipsec status` をしてもどうも成功していないように見えたのでログを見たところ以下のようなエラーが出ていました。

```
# cat /var/log/syslog | grep CBC
Jun 17 10:55:17 XXX charon: 13[IKE] ENCRYPTION_ALGORITHM 3DES_CBC (key size 0) not supported!
```

3DES_CBCに対応していないと怒られています。
`ipsec listalgs` で対応アルゴリズムが確認できるようだったので確認したが、やはりないです。

```
# ipsec listalgs | grep 3DES
```

困ったので調べたら普通に書いてありました。
https://wiki.strongswan.org/issues/832

`strongswan-plugin-openssl` を入れれば良いとのこと。
strongSwanのバックエンドとしてopensslが有効になるらしいです。

```
# apt-get install strongswan-plugin-openssl
```

設定を確認すると、load=yesになっているので大丈夫そう。

```
# cat /etc/strongswan.d/charon/openssl.conf
openssl {

    # ENGINE ID to use in the OpenSSL plugin.
    # engine_id = pkcs11

    # Set OpenSSL FIPS mode: disabled(0), enabled(1), Suite B enabled(2).
    # fips_mode = 0

    # Whether to load the plugin. Can also be an integer to increase the
    # priority of this plugin.
    load = yes

}
```

再度確認する。

```
# ipsec listalgs | grep 3DES
  encryption: AES_CBC[aes] RC2_CBC[rc2] 3DES_CBC[openssl] CAMELLIA_CBC[openssl] CAST_CBC[openssl] BLOWFISH_CBC[openssl]
```

これで3DES_CBC (key size 0) not supported!のエラーは出なくなりました。
Seleniumで使用するXPathをChromeで取得する

Chrome：58.0.3029.110 (64-bit)
FireFox：53.0.3 (64 ビット)
Selenium IDE：2.9.1
#Chromeデベロッパーツール起動
F12を押す。
![Chromeデベロッパーツール起動.PNG](https://qiita-image-store.s3.amazonaws.com/0/186570/75c8d333-a3b3-bc2d-6a84-131486f85c9b.png)
#要素指定
デベロッパーツールの左上の矢印アイコンを押すと要素を指定できる。
![要素指定.png](https://qiita-image-store.s3.amazonaws.com/0/186570/e4fe0e88-8aa9-8616-9607-47cb73338606.png)
#XPathコピー
要素の一覧上で右クリックし、「Copy / Copy XPath」を指定
![XPathコピー.png](https://qiita-image-store.s3.amazonaws.com/0/186570/ea6c8211-b745-dc20-2beb-66f50da62417.png)
#その他のブラウザでの取得例（英語サイト）
http://www.wikihow.com/Find-XPath-Using-Firebug
（※FireBugではXpathのコピーが表示されないかもしれません）
#Selenium IDEでの実行例
Yahooトップを表示して検索ボタンをクリック。
![Selenium IDE.PNG](https://qiita-image-store.s3.amazonaws.com/0/186570/1cc7e3b1-82e4-9dc6-3e34-5711d7fefbfb.png)
Yahooトップ表示。
![Yahooトップ.PNG](https://qiita-image-store.s3.amazonaws.com/0/186570/59933041-3cd0-d641-5534-3ae04995b3b3.png)
検索ボタンクリック後。
![検索ボタンクリック後.PNG](https://qiita-image-store.s3.amazonaws.com/0/186570/0011a66c-3f64-5de3-5bf9-af7225d4499a.png)
Neural Networks > over fittingを防ぐ式 > (n + 2)M + 1 < m @ 2005年


[Approximation of complex nonlinear functions by means of neural networks](https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwiW44i_hMvUAhVKJpQKHZsoChUQFggjMAA&url=https%3A%2F%2Fwww.dynardo.de%2Ffileadmin%2FMaterial_Dynardo%2FWOST%2FPaper%2Fwost2.0%2FNeuralNetworks.pdf&usg=AFQjCNGgFVDV3eSmuHw_tU6B70Q35jqG7A&sig2=4B_SFHF1ZpAu1Ow48mCqLg)
Thomas Most
presented at the 2nd Weimar Optimization and Stochastic Days 2005

2017年現在からすると、12年も前の論文。
論文ではmutli-layer perceptron (also called feed-forward back-propagation network)を使い、[Katsuki and Frangopol(1994)](http://ascelibrary.org/doi/10.1061/%28ASCE%290733-9399%281994%29120%3A11%282405%29) による関数の近似例がある。

over fittingを防ぐ式としてEquation 2が紹介されている (Hagen et al., 1996).

```math
(n + 2)M + 1 < m 
```

m: the number of training samples
n: the number of input values
M: the number of hidden neurons for a network with single hidden layer

> Hagan, M. T. ; Demuth, H. B. ; Beale, M.: Neural Network Design. PWS Publishing Company, 1996

dropoutを入れると上記の式が変化するかは不明。
composer updateしたときの「Your requirements could not be resolved to an installable set of packages.」

# composer update 時のエラー
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/187152/01c9f9f9-052f-eaf6-c764-1757ca597a51.png)
単純にこれをインストールしようとしたけどこれが足りないというもの
画像だと
laravel/framework は ext-mbstring が必要ですよって言ってるので
ext-mbstringでｇｇると

```
yum install --enablerepo=remi,remi-php70 php php-devel php-mbstring php-pdo php-gd
```

で解決