OmniAICreator/Qiita-1.07M huggingface dataset:
Dockerの基本的な操作

![](http://applech2.com/wp-content/uploads/2016/07/Docker-logo-icon.jpg)

## docker commands

```bash
# イメージ取得
docker pull ruby:2.4.1-alpine

# イメージ確認
~/ $ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ruby                2.4.1-alpine        5eadd5d1419a        12 days ago         56.3 MB

# コンテナ確認
docker ps

# コンテナ削除
docker rm container_id

# イメージ削除
docker rmi image_id
```

## docker-compose commands
### Start

```bash
# Runs a one-time command
docker-compose run
# Remove container after run
--rm
# DB周りの初期設定
#rails:db:create, rails db:schema:load, rails db:seed
rails db:setup

# app, rails db:setup実行、
docker-compose run --rm app rails db:setup

# Builds, (re)creates, starts
docker-compose up

# Stops and removes containers
docker-compose down

# Starts existing containers 
docker-compose start

# Stops running containers without removing them
docker-compose stop

# コンテナの確認
docker-compose ls

#コンテナの削除
docker-compose rm
```

### Gemsを更新した場合

```bash
docker run --rm -v ${PWD}:/home -w /home ruby:2.4 bundle lock 

# コンテナを開始前にイメージを構築(--build)
docker-compose up -d --build
```

### その他

```bash
# Get a shell in container
docker-compose exec app bash

# Logging can be configured→default outputs everything on stdout/stderr
docker-compose logs
    
# Run the rails minitest.
docker-compose run --rm app rails test
```

## [Dockerfile](http://docs.docker.jp/engine/reference/builder.html#from)
イメージを作り上げる命令を記述する
`docker build`でイメージを構築

1. FROM: ベース・イメージ を指定  
	`FROM <イメージ>`
2. RUN: イメージ上でコマンドを実行  
	`RUN /bin/bash -c 'source $HOME/.bashrc ; echo $HOME'
`
3. CMD: 構築時には何もしませんが、イメージで実行するコマンドを指定  
		コンテナ実行時のデフォルトを提供  
		`CMD echo "This is a test." | wc -`
4. EXPOSE: portをコンテナが実行時にリッスンすることをDockerに伝える  
	`EXPOSE <port> [<port>...]`
5. COPY: sourceのfileやdirectoryをコンテナ内のファイルシステム上にコピー  
	`COPY ソース 送信先(絶対パスor WORKDIRからの相対パス)` 
6. WORKDIR: RUN,CMD,ENTRYPOINT,COPY,ADD実行時の作業ディレクトリ
	`WORKDIR /a`

## docker-compose.yml
[networks](http://docs.docker.jp/compose/compose-file.html#network-configuration-reference)、[volumes](http://docs.docker.jp/compose/compose-file.html#volume-configuration-reference)、[services](http://docs.docker.jp/compose/compose-file.html#id14)を定義する

#### build: 構築時に適用するオプション

```
build: ./dir
```

#### enviroment

```
environment:
  RACK_ENV: development
  SHOW: 'true'
  SESSION_SECRET:
```

#### volumes: マウント・パス指定

```
volumes:
    - ./cache:/tmp/cache
```

#### depends_on: docker-compose up を実行したら、依存関係のある順番に従ってサービスを起動
    
```
depends_on:
      - db
      - redis
```
#### commnad: デフォルトのコマンドを上書き
    
```
    command: [bundle, exec, thin, -p, 3000]
```
#### ports: 公開用のポート

```
ports:
 - "3000"
 - "8000:8000"
```
#### image: コンテナを実行時に元となるイメージを指定

```
image: redis
image: ubuntu:14.04
```
Swift3でテーブルに「>」(右向き矢印)のアイコンをつける

# Swift3でテーブルに「>」(右向き矢印)のアイコンをつける

## 今回の目標
テーブルのセルに「>」のアクセサリを表示する

![Qiita用Cells.png](https://qiita-image-store.s3.amazonaws.com/0/139291/52bd82c4-0636-6576-0e3f-fe652682aad9.png)


## 開発環境
- Xcode：8.2.1
- 言語：Swift 3
- OS：MacOS

## アイコン表示方法
Storyboardで事前にTableViewを作成し、CellにIdentifier(今回は"Cells")を付与しておきます
そのCellを指定する形で下記のコードを実装します
`UITableviewCell.accessoryType = UITableViewCellAccessoryType.disclosureIndicator`

サンプルコード

```swift:ViewController.swift    
    let display:Array = ["cell1", "cell2", "cell3"]
   
    // Cellの値を設定
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cells", for: indexPath) // Storyboard上のテーブルセルのIdentifierと一致
        cell.textLabel!.text = display[indexPath.row]
        cell.accessoryType = UITableViewCellAccessoryType.disclosureIndicator // ここで「>」ボタンを設定
        return cell
    }
```

## 備考
`UITableViewCellAccessoryType.disclosureIndicator`を指定する時に`disclosureIndicator`以外の種類として、チェックマーク(`checkmark`)や詳細(インフォメーション)マーク(`detailButton`)なども設定できる
Cognos Analytics 11.0.6の地図の新機能を使ってみた

##概要
Cognos Analytics 11.0.6の新機能の地図の機能を使ってみました。
こちらが主な情報ソースですが、国→県→市レベルでの詳細化、日本語表示、郵便番号を試してみました。
https://community.watsonanalytics.com/wp-content/uploads/2017/03/IBM-CA-11-R6-Mapping.pdf

##国レベルの表示
試しにExcelで以下のデータを作成し、データ・アップロードの機能でアップロードして使用しています。
![000.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/dcd8b5e5-1e87-5211-38fb-34c2a8211735.png)

アップロードの画面
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/b1fec292-c682-7b8c-0d0b-3659bd668575.png)

この赤枠の地図アイコンが11.0.6の新機能です。その下の地図っぽいアイコンは、11.0.5の機能のもののようです。紛らわしいですね。きっとそのうち統合されると思います。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/7201b7bb-6edb-8f85-12c0-cc7f2a587169.png)

こんな感じに領域に「Country」領域の色に「Values」を置いてみました。ばっちりアメリカ、カナダ、中国、日本が値の色の濃さで表示されました。
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/3c68e576-0c45-d80d-5fc0-8ef6a6826706.png)

拡大、スクロールでアジアに移動すると、こんな感じに見えます。
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/f33df042-ee6e-3b31-52c4-540c582e2be2.png)

##県レベルでの表示
こんなデータを作成してみました。
![006.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/059cd7fc-a83e-02d8-cae1-bb47558c8b10.png)

アップロード中です。
![007.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/2d88be8e-078b-328b-5a83-7e0403b8cf05.png)

表示はこちら。いい感じですね。
領域の絞込みに「Country」を置いていて、Prefectureが、日本のだよ、というのを教えています。
「領域の色」「点のサイズ」「点の色」に値を置いたところ、〇の大きさと色も追加で表示されました。
![008.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/be0eaa94-28f7-c8a6-9dec-c8a4f4a39dd2.png)

##市レベルでの表示
こんなデータを作成してみました。
現状では「領域の絞込み」に国と県を使うために、A列のようなデータにする必要があるようです。
![009.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/060474e9-320f-5f41-0da9-da4865c1a0ce.png)

アップロード中です。
![010.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/839fdce4-7e62-c6dd-aece-f52e0c113cad.png)

いい感じにチーバ君の形が表示できました。
![011.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/49b6ca7e-0d5f-1074-f94b-fd473d3e8ffd.png)

##日本語での国の表示
じゃあちょっといじめてやろうかと、日本語データをやってみました。
![016.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/15dad7e6-edc2-dcff-fa28-b71958d78bc7.png)

おっ、できました。
![017.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/d92e1435-a099-df4e-768c-ce47005d1d57.png)

##日本語での県の表示
もっといじめます。
![019.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/08db3bb3-c917-60b5-b0ab-4beb93996f36.png)

残念、これはエラーになりました。
最初に紹介したリンクの資料に、日本・韓国・中国の文字のサポートはまだというような記載があるので、将来の拡張に期待です。
![020.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/11c97d0e-c36a-919c-0c3b-d311bea80f04.png)

##郵便番号表示
残念ながらこれは動きませんでした。
日本の郵便番号 XXX-YYYY は、上2桁か3桁までの詳細度の表示は可能と記載されているのですが、このデータでやってみても地図に反映されませんでした。
自分のやり方が悪いかも知れないので、誰かやってみてできた方がいたらフィードバック頂けるとうれしいです。
![013.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/2f653572-4241-b747-e950-dfe640a722a9.png)

残念ながら郵便番号はうまく行きませんでしたが、国・県・市の表示は簡単な手順でできました。
是非使ってみて頂ければと思います。

地図の機能のFAQがありましたのでリンクを添付しておきます。
**#Cognos Analytics 11.0.5 Mapping and Visualization FAQ**
https://www.ibm.com/communities/analytics/cognos-analytics-blog/cognos-analytics-11-0-5-mapping-and-visualization-faq/

他の新機能は、こちらもご参照下さい。
**Cognos Analytics 11.0.6 新機能一覧**
http://qiita.com/shinyama/items/5f8a04138472c1e5f1dc
第13回つぶやき勉強会 ~ プライベートの侵害 ~

# メソッドが４つあります

```rb
class Hoge
  def hoge1; piyo;             end
  def hoge2; self.piyo;        end
  def hoge3; self.send(:piyo); end
  def hoge4; self&.piyo;       end

  private
    def piyo; 'Good'; end
end
```

```rb
h = Hoge.new
```

----

４つのインスタンスメソッドを実行すると、それぞれ何が返りますか？

```rb
h.hoge1
h.hoge2
h.hoge3
h.hoge4
```

----

```rb
(1..4).each do |i|
  begin
    puts "hoge#{i}:" + h.send("hoge#{i}".to_sym)
  rescue => e
    puts "hoge#{i}:'#{e}'"
  end
end;
```

----

# 解答

```rb
hoge1:Good
hoge2:'private method `piyo' called for #<Hoge:0x007f8142c02770>'
hoge3:Good
hoge4:'private method `piyo' called for #<Hoge:0x007f8142c02770>'
```

----
# あとがき
ぼくは、`h.try(:piyo)` を勘違いしていました。これは、`&.` と同じような扱いになります。
直前のコミットを修正してみる

コミットしてから修正漏れ、タイポを見つけることもしばしば・・・。
今回は直前のコミットを修正する練習をしてみた。

「test1」ブランチで作業してみる。

```text:ターミナル
$ git branch test1
$ git checkout test1
```

「kana.txt」というファイルを追加してコミット。

```text:ターミナル
$ git add kana.txt
$ git commit -m "か行を追加"
[test1 a878c96] か行を追加
 1 file changed, 1 insertion(+)
```

ローカルリポジトリからリモートリポジトリにpushしてみる。

```text:ターミナル
$ git push
Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 384 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/mizuho-imai/practice
   aefb14f..bb721f7  test1 -> test1
```

無事にpushできた様子。
ここで、先ほどコミットした内容に不備があり、コミットを修正してみることに。

「kana.txt」ファイルを修正してコミット。
`--amend`で直前のコミットを修正することができる。
`-a`オプションは`git add`と同じ操作。

```text:ターミナル
$ git commit -a --amend
[test1 1e507cf] か行、さ行を追加
 Date: Tue Apr 4 14:58:37 2017 +0900
 1 file changed, 2 insertions(+)
```

[test1 a878c96] か行を追加　→　[test1 1e507cf] か行、さ行を追加 にコミット内容が変更されている。
先ほどと同じようにリモートリポジトリにpushしてみる。

```text:ターミナル
$ git push
To https://github.com/mizuho-imai/practice
 ! [rejected]        test1 -> test1 (non-fast-forward)
error: failed to push some refs to 'https://github.com/mizuho-imai/practice'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
```

エラーが出る。現在のブランチがリモートブランチより古くなっていますよーpullして最新にしてくださいねーというようなことを言われているっぽい。

`-f`オプションで強制的にpush。

```text:ターミナル
$ git push -f
Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 406 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/mizuho-imai/practice
 + bb721f7...1e507cf test1 -> test1 (forced update)
```

今度はエラーが出ずにpushできた。
リモートリポジトリのコミット内容を修正するのは本来NG
(他の人の修正などもあり、コミットログが正しくなくなるため)
なので、リモートにpushした後にミスが発覚した場合は素直に追加修正commit→push対応をするのが良さそう。
phpmyadmin synchronizeの使い方

はじめて使ったのでメモ！

接続元と接続先を設定する。

![2017-04-04_15h42_35.png](https://qiita-image-store.s3.amazonaws.com/0/72794/39382c2a-ef0a-4e38-0c5e-0316e85a6e0a.png)

こんな画面になるので、適宜設定して実行。

![2017-04-04_15h43_31.png](https://qiita-image-store.s3.amazonaws.com/0/72794/6461f972-da46-e360-cde0-2cd09827bc3c.png)

同期は一回切り。その後のデータ更新も同期されるわけではない。
HL-4570CDWをUbuntu 16.04 LTSで使えるようにする方法

Ubuntu 16.04 LTSで、HL-4570CDW (Brother製レーザプリンタ) をネットワーク経由で使用するための方法についてまとめます (Brother製の他の複合機でも同様の方法でできるのではないかと思われます)。

#プリンタの設定
1. [ソフトウェアダウンロード | HL-4570CDW/ HL-4570CDWT | 日本 | ブラザー](http://support.brother.co.jp/j/b/downloadlist.aspx?c=jp&lang=ja&prod=hl4570cdw&os=128)にアクセスします。
3. Linux 簡易インストーラーをダウンロードします。
1. Linux 簡易インストーラーを適当なディレクトリに解凍します。
3. 端末を起動します。
4. `cd {解凍先のパス}`でカレントディレクトリを移動します。
6. `chmod +x {Linux 簡易インストーラーのファイル名}`で、実行権限を与えます。
7. `sudo ./{Linux 簡易インストーラーのファイル名} HL-4570CDW`を実行し、案内に従ってインストールを行います。

#その他
今回ダウンロードしたdebパッケージはリポジトリに登録されているわけではないので、手動でアップデートしなければなりません。

#関連記事
* [EP-805AをUbuntu 16.04 LTSで使えるようにする方法 - Qiita](http://qiita.com/SUZUKI_Masaya/items/67e281d16e36c9ac09d2)
* [MG6230をUbuntu 16.04 LTSで使えるようにする方法 - Qiita](http://qiita.com/SUZUKI_Masaya/items/84269bfeeda538429feb)
* [MFC-9420CNをUbuntu 16.04 LTSで使えるようにする方法 - Qiita](http://qiita.com/SUZUKI_Masaya/items/d051ea2c1146fd48740c)
<table>タグのデータを配列に変換する

スクリプト書いた。

[table-tag-parser](https://www.npmjs.com/package/table-tag-parser)

[Clipboard.js](https://clipboardjs.com/)と組わせると、ボタンクリックでテーブルのデータをクリップボードにコピー、Excelやスプレッドシートに貼り付けできる。サンプルは[ここ](https://github.com/KeitaMoromizato/table-tag-parser-sample)。

```js
import Clipboard from 'clipboard';
import parser from 'table-tag-parser';

const clipboard = new Clipboard('#button', {
  text: () => {
    const data = parser('#table', { ignoreHeader: true });

    return data.reduce((memo, row) => memo + row.reduce((memo, cell) => `${memo}${cell},`, '') + '\n', '');
  }
});
```

Railsとかでさくっと作った管理系の画面に、「CSVエクスポート機能欲しいんですよー」とか言われた時に便利。
同じテーブルから違う条件でSELECTする

## 追記
以下のようにも書けるようです。

```SQL
SELECT
  Users.name,
  MAX(
    CASE WHEN UserMails.mail_type = 0 
      THEN UserMails.mail_address 
      ELSE '' 
    END
  ) AS mail_address,
  MAX(
    CASE WHEN UserMails.mail_type = 1
      THEN UserMails.mail_address 
      ELSE '' 
    END
  ) AS mobile_mail_address
FROM users Users
LEFT JOIN
  user_mails UserMails
  ON Users.id = UserMails.user_id
GROUP BY Users.id, Users.name
ORDER BY Users.id, Users.name
```
@asahina_dev さん、ありがとうございました。

## 以下、修正前の内容
例えば`user_mails`っていうテーブルにユーザーのメールアドレスが入ってて、
`mail_type`カラムでPCとか携帯とかのタイプ分けがされているものを一緒にSELECTする場合

```
users テーブル
┌────┬───────┐
│ id │ name  │
├────┼───────┤
│ 1  │ user1 │
└────┴───────┘

user_mails テーブル（mail_type = 0 がPC、 mail_type = 1 が携帯）
┌────┬─────────┬──────────────────┬───────────┐
│ id │ user_id │ mail_address     │ mail_type │
├────┼─────────┼──────────────────┼───────────┤
│ 1  │ 1       │ hoge@example.com │ 0         │
├────┼─────────┼──────────────────┼───────────┤
│ 2  │ 1       │ fuga@example.com │ 1         │
└────┴─────────┴──────────────────┴───────────┘
```
```SQL
SELECT
  Users.name,
  UserMails.mail_address,
  UserMobileMails.mail_address AS mobile_mail_address
FROM users Users
LEFT JOIN
  user_mails UserMails
  ON Users.id = UserMails.user_id
  AND UserMails.mail_type = 0
LEFT JOIN
  user_mails UserMobileMails
  ON Users.id = UserMobileMails.user_id
  AND UserMobileMails.mail_type = 1
WHERE Users.id = 1
```
```
結果
┌───────┬──────────────────┬─────────────────────┐
│ name  │ mail_address     │ mobile_mail_address │
├───────┼──────────────────┼─────────────────────┤
│ user1 │ hoge@example.com │ fuga@example.com    │
└───────┴──────────────────┴─────────────────────┘
```
~~って感じに複数JOINして別名を付けてあげるといいらしい。
ただメールアドレスがPC携帯の2種類、電話番号が自宅携帯会社の3種類とかあると
それだけで5回JOINすることになってしまう。
もうちょっと簡潔に書ける方法ってないのかな・・・~~
UITableViewCellの標準AccessoryViewをプログラムで切り替える

`accessoryType`プロパティで切り替えられます。
例えば下記のように切り替えられます。

```
class TableCell: UITableViewCell {
    func fill(isSelected: Bool) {
        if isSelected {
            accessoryType = .checkmark
        } else {
            accessoryType = .none
        }
    }
}
```

[Reference](https://developer.apple.com/reference/uikit/uitableviewcell/1623228-accessorytype)
統計的なデータ可視化のできる seabornの概要とTips

[seaborn](http://seaborn.pydata.org/index.html): pythonのデータ可視化ライブラリ。高レベルAPI。綺麗。

<img width="1144" alt="スクリーンショット 2017-04-04 19.18.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/158680/48f1df15-8e76-93fd-2427-7600922db7de.png">

## 0. matplotlibとの使い分け

* `seaborn`で用意されてるなら`seaborn`を使う。そうじゃないなら`matplotlib`で描く。

* `matplotlib`で描くにしても、スタイルは`seaborn`を使うのがいい（importするだけで設定される）

## 1. スタイルの設定

styleは default か "white"をよく使う。font_scaleは図を見て調整。

```python
import seaborn as sns
sns.set(style="white", font_scale=1.3, palette="muted", color_codes=True)
```

## 2. seabornでしたいことできるか確認
official doc. の [gallery](http://seaborn.pydata.org/examples/index.html) ページを見る。(使えそうな関数は下記に限られるので、関数名で何ができるかイメージできるとリンクを見なくてよくなる。引数の詳細はipythonのヘルプ機能で確認すればいい。)

分布の可視化

>
関数
* distplot : 1-dim.
* jointplot : 2-dim.
* pairplot : k-dim.
* heatmap: 相関行列
>
引数
- kde: カーネル密度推定
- hist: ヒストグラム
- hue: 条件別の分布推定


回帰

>
関数
* lmplot: 信頼区間付き回帰
>
引数
- order: 多項式回帰
- logistic: ロジスティック回帰
- hue: 条件別の回帰 (col, row)

カテゴリカルデータ

>
関数
* stripplot, swarmplot: 散布図
* boxplot, violinplot: 分布の可視化
* barplot, countplot, pointplot: 統計的性質の可視化
* factorplot(hue='key'): 条件別の統計的性質の可視化

## 3. その他

seabornで用意されているデータセット読み込み

```python
# datasetリスト: https://github.com/mwaskom/seaborn-data
sns.load_dataset('titanic')
```

軸の除去

```python
sns.despine() # 上と右
sns.despine(left=True) # 左も
```

color palettes

```python
# 現在のカラーマップ
cmap_current = sns.color_palette()
sns.palplot(cmap_current)
# 新しいカラーマップ
# 参考: http://seaborn.pydata.org/tutorial/color_palettes.html
# 例: key = "set1" (categorical), "Blues" (sequential)
num = 8
cmap = sns.color_palette(key, num)
sns.palplot(cmap)
```
MySQLのソケットエラー

 
 環境: centos67
 PHP: 5.3.6
 
 mysqlに接続しようとして下記のエラーが出た。socketファイルがないことが原因らしい。
 
 ```
 ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
 ```
 
 mysqlを再起動すると、`/var/lib/mysql/mysql.sock`が自動的に作成されるらしい
 
 ```
 $ sudo /etc/init.d/mysqld restart
 ```
 
 手動でmysql.sockを作成する場合
 
 ```
 $ sudo touch /var/lib/mysql/mysql.sock
 $ sudo chown mysql:mysql /var/lib/mysql/mysql.sock
 ```
golangのechoでMiddlewareFuncを使ってみる

　自分はWebFrameworkを使う時、データベースのインスタンス等はカスタムMiddlewareを使って開いたり閉じたりしてます。
　最近[echo](https://github.com/labstack/echo)を使ってみて、echoのカスタムMiddlewareの[ドキュメント](https://echo.labstack.com/cookbook/middleware)ってHandlerFuncを使って書いてあるですが、HandlerFuncだと引数が取れなくて困ってしまいました。
　そんでソースを見てたらMiddlewareFuncを発見したって話しです。

# 前提条件
- golang
    - 1.8
- WebFramework
    - [https://github.com/labstack/echo](https://github.com/labstack/echo)
    - v3.1.0-rc.1
- MySQLドライバー
    - [https://github.com/go-sql-driver/mysql](https://github.com/go-sql-driver/mysql)
    - Version 1.3

# カスタムコンテキストを定義
　データベースのインスタンスはコンテキストに置くのでカスタムコンテキストを定義（参照：https://echo.labstack.com/guide/context)

```golang

package main

import (
	"database/sql"

	"github.com/labstack/echo"
)

// カスタムコンテキスト
type CustomContext struct {
	echo.Context
	DB            *sql.DB
}
```

# MiddlewareFuncの実装
　早速、MiddlewareFuncを実装してみる。とりあえず、カスタムコンテキスト用とDB用とは分けて書いてみる。

```golang

package main

import (
	"database/sql"

	"github.com/labstack/echo"
	_ "github.com/go-sql-driver/mysql" // 本当はmain.goに置いほうが良いらしい
)

// カスタムコンテキストを定義するMiddleware
func myCustomContextMiddleware() echo.MiddlewareFunc {
	return func(next echo.HandlerFunc) echo.HandlerFunc {
		return func(c echo.Context) error {
			// カスタムコンテキストを初期化して次へ
			cctx := &CustomContext{
				Context: c,
			}
			return next(cctx)
		}
	}
}

// DBを設定するMiddleware
func myDBMiddleware(datasource string) echo.MiddlewareFunc {
	return func(next echo.HandlerFunc) echo.HandlerFunc {
		return func(c echo.Context) error {
			cctx, ok := c.(*CustomContext)
			if !ok {
				return echo.NewHTTPError(http.StatusInternalServerError, "カスタムコンテキストが取得できません")
			}

			db, err := sql.Open("mysql", datasource)
			if err != nil {
				return echo.NewHTTPError(http.StatusInternalServerError, "DBが取得できません")				
			}
			defer db.Close()

			// DBをコンテキストに設定して次へ
			cctx.DB = db
			return next(cctx)
		}
	}
}
```

# main
後はMiddlewareを適用するだけ。

```golang

package main

import (
	"context"
	"database/sql"
	"os"
	"os/signal"
	"syscall"

	"github.com/labstack/echo"
)

func main() {
	e := echo.New()

	// カスタムコンテキスト用Middlewareを適用
	e.Use(myCustomContextMiddleware())

	// DB用Middlewareを適用
	e.Use(myDBMiddleware("データソースは省略"))

	errC := make(chan error)

	go func() {
		if err := e.Start(":8080"); err != nil {
			errC <- err
		}
	}()

	quitC := make(chan os.Signal)
	signal.Notify(quitC, syscall.SiGINT, syscall.SIGTERM)

	select {
	case err := <-errC:
		panic(err)
	case <-quitC:
		shutdownCtx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
		defer cancel()
		if err := e.Shutdown(shutdownCtx); err != nil {
			errC <- err
		}
	}
}
```

# 以上
　今回カスタムコンテキスト用とDB用と分けたので必ず先にカスタムコンテキスト用を適用する必要があります。
　DB用はDBを使うグループ(echo.Group)のみに適用したりすると良いかもしれません。
Scene遷移に使うScene名をBuildSettingsから読み込むエディタ拡張

まずScene遷移は一般的に

```C#
        SceneManager.LoadScene("遷移先のScene名");
```
と書かれる。
stringをコードに直接書き込むのはtypoの発生やScene名の変更に弱い等の問題点があるのでBuildSettingsからSceneのPathを読み込み、ドロップダウンメニューを作成するPropertyAttributeを作成した。

```C#:SceneChangerAttribute.cs
using UnityEngine;
#if UNITY_EDITOR
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
#endif

class SceneChangerAttribute : PropertyAttribute { }
#if UNITY_EDITOR
[CustomPropertyDrawer(typeof(SceneChangerAttribute))]
public class SceneChangerEditor : PropertyDrawer
{
    //Scene名のList
    List<string> AllSceneName
    {
        get
        {
            List<string> sceneNames = new List<string>();
            //BuildSettingsからSceneのPathを読み込む
            List<string> AllPaths = (from scene in EditorBuildSettings.scenes where scene.enabled select scene.path).ToList();
            //PathからScene名を切り出す
            foreach (string x in AllPaths)
            {
                int slash = x.LastIndexOf("/");
                int dot = x.LastIndexOf(".");
                sceneNames.Add(x.Substring(slash + 1, dot - slash - 1));
            }
            return sceneNames;
        }
    }
    //ドロップダウンメニューの作成
    public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
    {
        var list = AllSceneName;
        var selectedIndex = list.FindIndex(item => item.Equals(property.stringValue));
        if (selectedIndex == -1)
        {
            selectedIndex = list.FindIndex(item => item.Equals(list[0]));
        }

        selectedIndex = EditorGUI.Popup(position, label.text, selectedIndex, list.ToArray());

        property.stringValue = list[selectedIndex];
    }
}
#endif
```

使用時は上記のSceneChangerAttribute.csをUnityのプロジェクトに入れ、以下のようにする(例はButtonでScene遷移したい場合)。

```C#:SceneChanger4Button.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class SceneChanger4Button : MonoBehaviour
{
    //どんな名前でもいいのでstring型のフィールドに付ける
    [SerializeField, SceneChangerAttribute]
    string _NextScene;

    void OnClick()
    {
        SceneManager.LoadScene(_NextScene);
    }
}
```
![sc4b.png](https://qiita-image-store.s3.amazonaws.com/0/163397/7668c3f1-ad3b-ecfb-08de-466cfce29176.png)
このようにBuildSettingsに追加したSceneの名前が表示される。
利点はtypoがないこととエディタ上で遷移先がわかること。
欠点はBuildSettingsでSceneの順番を入れ替えると対応ができず設定をし直さねばならないこと、ただこれはタイトルに使うSceneを0に設定する以外は順番を入れ替えることはほとんどないと思うのでそこまで影響はないと思います。
参考文献
[UnityのAttribute（属性）についてまとめてメモる。](http://tsubakit1.hateblo.jp/entry/2015/01/03/203843"UnityのAttribute（属性）についてまとめてメモる。")
PhpStormエディターのGitコンフリクト解消ツール

毎回忘れる...のでメモ。

この動画が全て。
https://youtu.be/ThGz222swMI

1. メニューから、
「VCS」メニュー > 「Git」 > 「Resolve Confricts...」

2. コンフリクト一覧から選ばれているのを確認して、「Merge...」をクリック
※キャプチャーはMac
![スクリーンショット](https://qiita-image-store.s3.amazonaws.com/0/40940/5c211d52-84ca-137e-0d05-286a29fdb15f.png)

3. 真ん中が最終結果、左と右から欲しいものを選ぶ。
できたら「Apply」を押す。
確認のウィンドウが出てきたら「Yes（OKかも）」。

4. これでコンフリクトをまとめてくれて、indexにステージングもされる。
あとはコミットすればOk。


その他参考:
https://www.jetbrains.com/help/phpstorm/2016.3/resolving-conflicts.html#d1193583e100
Symfony1.4でフォーマットを指定して日時のバリデーションをする方法

## 前置き
日時のバリデーションをする際に思い込みでやってしまい、かなりの時間を浪費したので備忘の意味も含めて記載します。

## 環境について
* PHP 5.5
* Symfony 1.4
* Apache 2.2
* CentOS 6

## Symfony1.4で日時のフォーマットを指定してバリデーションをするには
フォーマットを指定して日時のバリデーションをするにはsfValidatorDateクラスを継承したsfValidatorDateTimeクラスを使って下記のように設定をすればバリデーションが出来ます。

```php:validation
new sfValidatorDateTime([
    'date_format' => '/(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2}) (?P<hour>\d{2}):(?P<minute>\d{2}):(?P<second>\d{2})/',
]));
```

ここで大事なのは(?P<year>\d{4})という記述方法です。
この記述方法は名前付きサブパターンというらしいのですが、この記述方法で無いとSymfony1.4では正常にフォーマットのバリデーションを行うことが出来ません。
[ドキュメント](http://www.symfony-project.org/api/1_4/sfValidatorDate)にもサブパターンを使いましょうとあります。

バリでショーンが正常に行えない場合ですが、具体的に例を上げると次のような設定だとバリデーションに引っかからずに通ってしまいます。

## バリデーションが通ってしまう例

```php:validation2
new sfValidatorDateTime([
    'date_format' => '/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/',
    'min' => strtotime('2017-03-21 13:00:00'),
]));
```

上記の設定だとフォーマットが違う場合には弾かれるが、最小値より過去の日時を入力した場合、バリデーションを実行した日時が最小値を過ぎてしまっている場合にはバリデーションが通ってしまいまいます。
なぜこのバリデーションが通ってしまうかと言うと、フォーマットのチェックの処理が下記のような実装になっているため、サブパターン付きの正規表現以外では「year」、「month」、「date」のインデックスが存在せず、検査後の値が現在日時となってしまい、最小値の指定をしたとしても最小値が現在よりも過去であれば通ってしまう結果となります。

```php:symfony-1.4/lib/validator/sfValidatorDate.class.php
  protected function convertDateArrayToString($value)
  {
    // all elements must be empty or a number
    foreach (array('year', 'month', 'day', 'hour', 'minute', 'second') as $key)
    {
      if (isset($value[$key]) && !preg_match('#^\d+$#', $value[$key]) && !empty($value[$key]))
      {
        throw new sfValidatorError($this, 'invalid', array('value' => $value));
      }
    }
    // if one date value is empty, all others must be empty too
    $empties =
      (!isset($value['year']) || !$value['year'] ? 1 : 0) +
      (!isset($value['month']) || !$value['month'] ? 1 : 0) +
      (!isset($value['day']) || !$value['day'] ? 1 : 0)
    ;
    if ($empties > 0 && $empties < 3)
    {
      throw new sfValidatorError($this, 'invalid', array('value' => $value));
    }
    else if (3 == $empties)
    {
      return $this->getEmptyValue();
    }
    ...

```

## まとめ

この通りSymfony1.4で日時のチェックをする際には名前付きのサブパターンが必須となります。
何かをする際にはドキュメントはちゃんと読みましょう。
管理者権限がなかったらUAC昇格してから実行するバッチファイル（引数指定可能）

管理者権限があったらそのまま実行するけれど、管理者権限がなかったらUACダイアログを出して別ウィンドウで`cmd.exe`を起動してそっちで実行する、というバッチファイルです。

[こちらの記事](http://qiita.com/hymtk7/items/b3b77ad3375095dcd7eb)を参考にさせていただきました。
基本的にはこの通りでよかったのですが、こちらはバッチファイルに引数が渡せない仕様だったので、引数を渡せるようにしました。
加えて、管理者権限の有無の確認は（自分の使う範囲では）`NET FILE`で十分だったので、簡略化してしまいました。

```bat:ev.cmd
@set @dummy=0/*
@echo off
NET FILE 1>NUL 2>NUL
if "%ERRORLEVEL%" neq "0" (
  cscript //nologo //E:JScript "%~f0" %*
  exit /b %ERRORLEVEL%
)

REM 管理者権限で実行したい処理 ここから
echo 引数1 %~1
echo 引数2 %~2
echo 引数3 %~3
NET FILE 1>NUL 2>NUL
if "%ERRORLEVEL%" == "0" (
  echo 管理者権限実行成功！ NET FILE の ERRORLEVEL = %ERRORLEVEL%
) else (
  echo 管理者権限実行失敗... NET FILE の ERRORLEVEL = %ERRORLEVEL%
)
pause
REM 管理者権限で実行したい処理 ここまで

goto :EOF
*/
var cmd = '"/c ""' + WScript.ScriptFullName + '" ';
for (var i = 0; i < WScript.Arguments.Length; i++) cmd += '"' + WScript.Arguments(i) + '" ';
(new ActiveXObject('Shell.Application')).ShellExecute('cmd.exe', cmd + ' "', '', 'runas', 1);
```

コマンドプロンプトから引数を指定して呼び出すと、以下のように引数が受け渡されるのが確認できます。

```bat:呼び出しコマンド
ev.cmd a b "c D"
```

```
引数1 a
引数2 b
引数3 c D
管理者権限実行成功！ NET FILE の ERRORLEVEL = 0
続行するには何かキーを押してください . . .
```

## 制限

以下の機能はありません。

* 元ウィンドウの処理の中で、別ウィンドウの`cmd.exe`が終了するのを待つ
* 別ウィンドウの`cmd.exe`から変数を引き継ぐ
* 別ウィンドウの`cmd.exe`の終了時`ERRORLEVEL`を取得する

これらが必要な場合は、ロックファイルを作る、ファイルを経由してデータを引き継ぐ等の処理を追加することになると思います。


## 参考ページ
* [バッチファイルからUAC昇格ダイアログを表示する - Qiita](http://qiita.com/hymtk7/items/b3b77ad3375095dcd7eb)
* [@set ステートメント](https://msdn.microsoft.com/ja-jp/library/k0h7dyd7(v=vs.100).aspx)
* [cmd.exe /c の引数について (半角スペースと"の微妙な関係) | アプリ仮想化奉行](https://tunemicky.blogspot.jp/2012/03/cmdexe-c.html)
★非推奨 - Digdagからsh>でEmbulk起動時にプラグインバージョンを固定(ローカルgemあり版)

[ローカルgemなし版](http://qiita.com/pilot/items/2c4bc45adafa17030f37)の続き

★この記事はEmbulk 0.8.24以降は使えない(「後日談」参照)のため非推奨★ → [改良版](http://qiita.com/pilot/items/208aa30b2f0e175a3259)

# 基本的な考え方

1. digdagサーバにpushするプロジェクトディレクトリ内にgemファイルを持っておく
2. dig実行の度にその先頭で以下を実行する(※1)
  1. NFSディレクトリ(※2)にEmbulkプラグインインストールディレクトリを作成
  2. 当該ディレクトリにインストール済のEmbulkプラグインを一旦全てアンインストール(※3、※4)
  3. 当該ディレクトリにEmbulkプラグインをインストール(※4)
3. dig内でのEmbulk実行時にEmbulkプラグインインストールディレクトリを指定(※4)

※1：2回目以降は無意味だが許容
※2：[こちら](http://qiita.com/pilot/items/2c4bc45adafa17030f37#nfs%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E7%90%86%E7%94%B1)の理由と似たような感じ
※3：何らかの理由でバージョンを戻したい時や不要になったプラグインがある時の為
※4：embulkコマンドにホームディレクトリを指定(-J-Duser.homeオプション)

# 実際の内容

```
$ embulk --version
embulk 0.8.18
$ digdag version
2017-04-04 13:01:55 +0900: Digdag v0.9.8
Client version: 0.9.8
Server version: 0.9.8
$ ls -F
daily.dig  embulk/ embulk_gem_install.dig  embulk_gems/  params/  scripts/
$ ls embulk/
export_data.yml.liquid  import_data.yml.liquid
$ ls embulk_gems/
embulk-output-XXX-0.1.0.gem
$ ls scripts/
embulk_run.sh
```

```yaml:daily.dig
!include : params/common/timezone.dig

_export:
  !include : params/common/params.dig # embulk_home_dirの定義

+embulk_gem_install:
  call>: embulk_gem_install.dig
+import_data:
  sh>: scripts/embulk_run.sh ${embulk_home_dir} embulk/import_data.yml.liquid
+export_data:
  sh>: scripts/embulk_run.sh ${embulk_home_dir} embulk/export_data.yml.liquid
````

```yaml:embulk_gem_install.dig
!include : params/common/timezone.dig

_export:
  !include : params/common/params.dig # embulk_home_dirの定義

+mkdir:
  sh>: mkdir -p ${embulk_home_dir} # -pをつけているので2回目以降もエラーにならない
+uninstall:
  sh>: >-
    /usr/local/bin/embulk -J-Duser.home=${embulk_home_dir} gem uninstall --all
+install:
  sh>: >-
    /usr/local/bin/embulk -J-Duser.home=${embulk_home_dir} gem install
    embulk-input-td:0.1.0 # 通常のリポジトリからのインストール
    embulk-output-td:0.3.13
    embulk-input-sftp:0.2.3
    embulk-output-sftp:0.0.9
    embulk-filter-column:0.6.0
    embulk-filter-timestamp_format:0.2.4
    embulk_gems/embulk-output-XXX-0.1.0.gem # ローカルgemのインストール
```

```bash:embulk_run.sh
#!/bin/bash

if [ $# -ne 2 ]; then
  echo "Usage: $0 embulk_home_dir embulk_file" 1>&2
  exit 1
fi

/usr/local/bin/embulk -J-Duser.home=$1 run $2
exit $?
```

# 後日談 - 使えなくなった-J-Duser.homeオプション
0.8.23までは当該オプションで指定したディレクトリにプラグインがインストールされる
0.8.24以降では当該オプションが無視されて$HOMEにインストールされてしまう
[0.8.24のリリースノート](http://www.embulk.org/docs/release/release-0.8.24.html)にあった`Make environment variables immutable in JRuby/Java`が原因か

→ [当該オプションを使用しない改良版](http://qiita.com/pilot/items/208aa30b2f0e175a3259)
rubyの`# =>`を検証するやつを書いた

Rubyでよく

```ruby
1 + 2 # => 3
```

とか書いてあるじゃないですか。`# => `を挟んで、左辺が式で右辺がその結果というやつ。
それ、でも、どんだけ信じていいの?

そのコメント作るだけであれば [JoshCheek/seeing_is_believing](https://github.com/JoshCheek/seeing_is_believing) で作れるんだけど、逆がないんだよね。

というわけで作った。 https://rubygems.org/gems/xmp2assert

## 実装について

ごくラフなアイディアとしては `actual # => expected` って書いてあったら `assert_equal(expected, actual)` に変換する。これが着想。

とはいえこの式はRubyの式なわけで、正規表現置換のような生易しいことにはならない。Ripperでがんばってコメント位置を発見して、その直前にある式を……　みたいなのをやっていて非常に面倒。

このコメントはコメントであるがゆえに実行時には読み飛ばされるので、[k-tsj/power_assert](https://github.com/k-tsj/power_assert)みたいにTracePointで頑張るとかも不可。根性以外の武器はなさそうな気がしている。

あと `# => ` の右側って、まあ、`1 + 2 # => 3` とかならシンプルかもしれないけど、普通そうじゃないわけよ。現実的には、

```ruby
-> { } # => #<Proc:0x007fbc22efed78@(pry):1 (lambda)>
```

こんな感じでもっと複雑になっている。なので、そこをうまくハンドリングする必要がある。たとえば上記でいうと`0x007fbc22efed78`はポインタじゃん。毎回違うじゃん。そういうのはよろしく無視する必要がある。

ただ、この部分はかなりヒューリスティックなので、まだまだ改善の余地があるなあと思う。

## そのほかの趣味に走った部分

- 普段思っていることを[スタイルガイド](https://github.com/shyouhei/xmp2assert/blob/master/Styleguide.md)に書いてみた
- pとppでそれぞれ`inspect`と`pretty_print`をわざわざ両方書くのいい加減めどいので[ppだけ対応すればよしなにp側も反映するやつ](https://github.com/shyouhei/xmp2assert/blob/master/lib/xmp2assert/prettier_inspect.rb) (これは便利だから別のgemにするかもしれん)
Herokuにアップする時の手順メモ（PostgreSQLを利用する場合）

#前提

[Herokuのアカウント作成](https://signup.heroku.com/identity)と[Heroku Toolbelt](https://devcenter.heroku.com/articles/getting-started-with-ruby#set-up)のインストールは終えているものとします。
何度かデプロイしてるけど、細かいところを忘れちゃう、という方向けです。

#デプロイまでの手順

アプリケーションのあるディレクトリに移動してから、以下を実行する。

```
$heroku login
```

```ruby:Gemfile
gem 'rails_12factor'
gem 'pg'
```
Gemを追加してからbundle install


```ruby:config/environments/production.rb
config.assets.compile = true
```

```
$ heroku create
```
アプリ名は自動で割り振られる。自分でつけたい場合はcreateの後に指定する。

```
$ git init
$ git add .
$ git commit -m "commit message"
$ git push heroku master
```
GitでHerokuにプッシュする。

```
$ heroku run rake db:migrate
```
Heroku上でマイグレートを実行する。

以上！
、、、エラーが出なければ。笑
Ansibleでループ中の変数に応じてhandlerを切り替える


#はじめに
Ansibleで、あるミドルウェアをプロビジョニングするとき、関連する設定ファイルが複数ある場合、with_items等を使ってtemplateモジュールやcopyモジュールで対応すると思います。
その際、notifyでサービスのリロードや再起動などを制御するのが通常のやり方です。

しかし、ミドルウェアによっては、設定ファイルごとに別のhandlerを呼びたいことがあります。

例えばapacheと連携するZabbixなどです。
`/etc/zabbix_server.conf`の更新時にはzabbix-serverを、`/etc/httpd/conf.d/zabbix.conf`の更新時にはapacheをリロードしたいでしょう。

ところが、with_items等で使う変数itemの内容は、notifyで呼ぶhandlers内のタスクでは参照できません。

```
  notify:
    - reload apache
    - reload middleware
```
このように複数のhandlerを指定することは可能ですが、この場合、本来middleware本体のみリロードすべきところをapacheまでリロードされてしまいます。

前置きが長くなりましたが、今回はループ処理中の変数の値によって、handlerを切り替える方法をご紹介します。

#やること
ループ中の変数に`is_apache: True`が定義されている時はapacheをリロードするhandlerを呼び、それ以外はmiddlewareをリロードするhandlerを呼ぶ

#sample
##ディレクトリ構成
```bash:ディレクトリ構成
site.yml
hosts/inventory_file
host_vars/targethost.yml
roles/
|--middleware/
|  |--tasks/
|  |  |--main.yml
|  |--handlers/
|  |  |--main.yml
```

## Role
notifyの中で変数を評価し、呼ぶhandlerを切り替えます。

```yaml:roles/middleware/tasks/main.yml
- name: put some middleware config files
  template:
    src: "{{ item.template }}"
    dest: "{{ item.path }}"
    owner: "{{ item.owner | default('root') }}"
    group: "{{ item.group | default('root') }}"
    mode: "{{ item.mode | default('0644') }}"
  with_items: "{{ my_vars.middleware.config_file }}"
  notify: >-
    {%- if item.is_apache == True -%}
    ["reload apache"]
    {%- else -%}
    ["reload middleware"]
    {%- endif -%}
```

## vars
apacheを再起動したい設定ファイルについては`is_apache: True`を定義しておきます。

```yaml:host_vars/targethost.yml
---
my_vars:
  middleware:
    config_file:
      - template: middleware.conf.j2
        owner: middleware_user
        group: middleware_group
        mode: '0644'
        path: /path/to/middleware.conf
      - template: middleware_apache.conf.j2
        owner: apache
        group: apache
        mode: '0644'
        path: /path/to/middleware_apache.conf
        is_apache: True
```


## handler
handlerは普通に2つ定義しておきます。

```yaml:roles/middleware/handlers/main.yml
---
- name: reload apache
  service:
    name: httpd
    state: reloaded
  when: not ansible_check_mode

- name: reload middleware
  service:
    name: middleware
    state: reloaded
  when: not ansible_check_mode
```

# まとめ
これで他と連携するミドルウェアについてもスマートにRoleが定義できると思います。
TFv1.1でのKerasとの統合を試してみた


XLAについて言及がないことで一部ではざわざわしたTensorFlowのv1.1の[Release](https://github.com/tensorflow/tensorflow/blob/master/RELEASE.md)ですが、ロードマップの通りKerasとのインテグレーションが始まっているようです。まだ[RC](https://pypi.python.org/pypi/tensorflow)っぽいですが、個人的には目玉の1つであり、試してみたくてうずうずしたのでやってみました。

以前、[TensorFlowのHighLevelAPIについての雑感つき解説](http://qiita.com/rindai87/items/72651c702e9265595047)と題した記事の中で書いたKerasのコードを流用しました。

### サンプルコード

```python
import tensorflow as tf
from tensorflow.contrib.keras.python import keras
from sklearn import cross_validation

# データの準備
iris = tf.contrib.learn.datasets.base.load_iris()
train_x, test_x, train_y, test_y = cross_validation.train_test_split(
    iris.data, iris.target, test_size=0.2
)

num_classes = 3
train_y = keras.utils.to_categorical(train_y, num_classes)
test_y = keras.utils.to_categorical(test_y, num_classes)

# モデルの定義
model = Sequential()

# ネットワークの定義
model.add(Dense(10, activation='relu', input_shape=(4,)))
model.add(Dense(20, activation='relu'))
model.add(Dense(10, activation='relu'))
model.add(Dense(3, activation='softmax'))

# モデルのサマリの確認
model.summary()

# モデルのコンパイル
model.compile(loss='categorical_crossentropy',
              optimizer='sgd',
              metrics=['accuracy'])

# 学習
history = model.fit(train_x, train_y,
                    batch_size=100,
                    epochs=2000,
                    verbose=1,
                    validation_data=(test_x, test_y))

# 学習モデルの評価
score = model.evaluate(x_test, y_test, verbose=0)

print('Test loss:', score[0])
print('Test accuracy:', score[1])
```

### 結果

- 聞いていた通り`tensorflow.contrib.keras.python`を`import`さえすればKerasのモジュールにアクセスできるのでサイコーっぽい
- Estimatorとの合わせ技で、データサイエンティストとエンジニアの分業が捗る未来がぼんやりみえました
- `CloudML　Engine`ももっとつかいやすくなりそうな予感です


さっとしか試していませんので、詳しい考察はまた今度やりたいですね。
resourcesでネストした場合のform_forメソッドの使い方

## 概要
映画の詳細ページから、その映画に対するレビューが書けるアプリケーションを作成する。

つまり、
レビューするには、reviews_controller.rbのnewアクションでreviewインスタンスを生成。createメソッドで保存する必要がある。
作成したファイルは以下。

config/routes.rb

```
resources :users do
  resources :products do
    resources :reviews
  end
end
```

new.html.erb

```
<%= form_for ( [@user, @product, @review ] ) do |f| %>
  （中略）
<% end %>
```

review_controller.rb

```
def new
  @user = User.find(4)
  @product = Product.find(2)
  @review = Review.new
end
```


## 疑問
new.html.erbファイルで引数を3つ指定している。この引数がどのように処理されているのか不透明であったので、調べてみた。

このアプリケーションの場合、レビューをするには、
new.html.erbのform_forメソッドから情報を入力し、送信する。
送信先のURLは、新規レビューであるから
```/users/:user_id/products/:product_id/reviews```
となる。

form_forメソッドに引数としてreviewインスタンスを渡すだけでは、<u>user_id</u>と<u>product_id</u>が指定されずエラーとなる。
form_forメソッドに引数として保存されたuserインスタンスとproductインスタンスを渡すことで、自動的にパスを指定してくれる。

## 結論
form_forメソッド便利。

## 参考
山田祥寛 Ruby on Rails4 アプリケーションプログラミング　技術評論社 2015年5月 第１版 p.104
laravel-elixir-vue-2

laravel 5.3〜 パッケージ内のVueにて
laravel側がvueのwebpackを設定しているファイル

```
/node_modules/laravel-elixir-vue-2/index.js
```

vue-loader, file-loader, url-loaderを読み込んでいる。
また、webpack.config.jsに以下を追加すると、コンポーネント内のCSSのスコープ化とSASSを使えるようになる


```
module.exports = {
  vue: {
    loaders: {
      js: 'buble-loader',
      scss: 'vue-style-loader!css-loader!sass-loader'
    }
  }
}
```

参考
https://github.com/vuejs/laravel-elixir-vue-2
aws-sdkからAWS SecurityGroupを変更する

SecurityGroupからIPアドレスによるアクセス制御をしていたのですが
諸事情によりIPアドレスが変更となったのでaws-sdkを使ってごそっと設定を変更してみました

## スクリプト
* 例として元々 192.0.2.0/24 を設定していたものを 198.51.100.0/24,203.0.113.0/24 に変更してみます
    * addとremoveの処理がだいだいコピペなんで直そうかと思ったけど面倒なのでこのままで。。。
* ~/.aws/credentials は別途用意して下さい
    * http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html 参照

```rb
#!/usr/bin/env ruby
# encoding: utf-8
require 'aws-sdk'
require 'aws-sdk-core/errors'

OLD_IP_RANGE   = '192.0.2.0/24'
NEW_IP_RANGE_1 = '198.51.100.0/24'
NEW_IP_RANGE_2 = '203.0.113.0/24'

def add_ip_range(sg_id:, permission:, region:)
  sg = Aws::EC2::SecurityGroup.new(sg_id, region: region) 
  begin
    sg.authorize_ingress(
      ip_permissions: [
        {       
          ip_protocol: permission.ip_protocol,
          from_port:   permission.from_port,
          to_port:     permission.to_port,
          ip_ranges: [
            { cidr_ip: NEW_IP_RANGE_1 },
            { cidr_ip: NEW_IP_RANGE_2 },
          ],      
          ipv_6_ranges: [ {} ], 
          prefix_list_ids: [ {} ], 
        }       
      ]
    )
    puts "[S]#{sg_id}(#{region}): #{permission.from_port}/#{permission.ip_protocol}"
  rescue Aws::Errors::ServiceError => e
    puts "[E]#{sg_id}(#{region}): " + e.inspect
  end
end

def remove_ip_range(sg_id:, permission:, region:)
  sg = Aws::EC2::SecurityGroup.new(sg_id, region: region) 
  begin
    sg.revoke_ingress(
      ip_permissions: [
        {       
          ip_protocol: permission.ip_protocol,
          from_port:   permission.from_port,
          to_port:     permission.to_port,
          ip_ranges: [
            { cidr_ip: OLD_IP_RANGE },
          ],      
          ipv_6_ranges: [ {} ], 
          prefix_list_ids: [ {} ], 
        }       
      ]
    )
    puts "[S]#{sg_id}(#{region}): #{permission.from_port}/#{permission.ip_protocol}"
  rescue Aws::Errors::ServiceError => e
    puts "[E]#{sg_id}(#{region}): " + e.inspect
  end
end

Aws.partition('aws').regions.each do |region|
  ec2 = Aws::EC2::Client.new(region: region.name)
  ec2.describe_security_groups.data.security_groups.each do |sg| 
    sg.ip_permissions.each do |perm|
      perm.ip_ranges.each do |range| 
        if range.cidr_ip == OLD_IP_RANGE
          add_ip_range(sg_id: sg.group_id, permission: perm, region: region.name)
          remove_ip_range(sg_id: sg.group_id, permission: perm, region: region.name)
        end     
      end     
    end
  end
end
```
カレントブランチネームをクリップボードにコピーする冴えたやり方

# 目的

カレントブランチネームをコピーしたい……。
けどホームポジションを解除してマウスに手をのばすのは億劫、やだ！

そんな人のためにコンソールの入力でカレントブランチネームをコピーするスクリプトを作りました！

# Script

```bash
echo -n `git symbolic-ref --short HEAD` | pbcopy
```

カレントブランチネームを表示させ、`pbcopy`でクリップボートに入れています。

aliasを作るとなおよし。

```bash
alias cpcb='echo -n `git symbolic-ref --short HEAD` | pbcopy'
```

# Example

```shell-session
[poi2] ~/sugoi_project
% echo -n `git symbolic-ref --short HEAD` | pbcopy      (git)-[master]

[poi2] ~/sugoi_project
% pbpaste                                               (git)-[master]
master
```

クリップボードに`master`がコピーされました。


# 参考

[Copy to Clipboard from Command Line](https://davidwalsh.name/copy-clipboard-command-line)
Jenkins Plugin 「Build Flow Plugin」 覚書

# Build Flow Plugin 

https://wiki.jenkins-ci.org/display/JENKINS/Build+Flow+Plugin
Build Flow Plugin とは JenkinsのPluginの１つで、
ざっくり言うと、**複数ジョブをまとめて実施してくれるジョブを作れるプラグイン**です。
標準機能で
「(ビルド後に)他のプロジェクトのビルド」というのがありますが、
・数珠つなぎで各ジョブに設定しないといけなかったり、
・単品で実行したいときもあるんだ！という場合に不便だったり、
とその辺の使い勝手を改善してくれるブラグインだと思います。

## 基本的な書き方

あらかじめ、job1～3は単体で作ります。
その後、[新規ジョブ作成]-[Build Flow]でジョブを作ります。

```
build("job1")
build("job2")
build("job3")
```

これを実行すると job1→job2→job3 と続けてビルドしてくれます
（※ 途中でエラーになると以降のジョブは実行されません）

### パラレルな書き方

```
parallel(
  { build("job1-1") },
  { build("job1-2") },
)
```

順番は問いません。job1-1 と job1-2 実行できる方から実行するという書き方です。

### 引数ありな書き方

```
build("job1")
build("job2", param1: 1)
```

job2 実行時に param1=1 を入れた形で実行します


### 引数ありな書き方２

``` ビルドのパラメータ化.
hoge = 5
```

``` Flow.
build("job1")
build("job2", param1: params['hoge'])
```

Build Flow ジョブ自体に引数を入力できるようにし、その引数をセットする形

### 全部入り

``` ビルドのパラメータ化.
hoge = 5
```

``` Flow.
parallel(
  { build("job0-1") },
  { build("job0-2") },
)
build("job1")
build("job2", param1: params['hoge'])
build("job3", param2: "aaa")
```

以上です
「GitHub Team (GitHub Organizations)」を使おう(5人$25～。企業導入実績多数。パブリックリポジトリのみでよければ「無料＋ユーザー数無制限」も可能)

<div align="center">
  <a href="http://bit.ly/cyginst"><img width="426" height="67" src="https://raw.githubusercontent.com/javacommons/qiita/master/jc-banner-2017-0419-0240.gif" /></a>
</div>

<hr />

`#`この記事が [`@qiitapoi(Qiita 人気の投稿)`](https://twitter.com/qiitapoi)に載りました。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">「GitHub Team (GitHub Organizations)」を使おう(5人$25～。企業導入実績多数) <a href="https://t.co/Sy6IRhSGXE">https://t.co/Sy6IRhSGXE</a></p>&mdash; Qiita 人気の投稿 (@qiitapoi) <a href="https://twitter.com/qiitapoi/status/849175995143700480">2017年4月4日</a></blockquote>

# あとで加筆します(たぶん)。コストパフォーマンス大です！

「GitHub Team (GitHub Organizations)」( https://github.com/account/organizations/new )をお勧めします。多くの企業ユーザーがこのサービスを使っています。

`#`仕事で使う他、自分でも(わざわざ)$25払って「GitHub Team (GitHub Organizations)」を使っています。
`#`少人数でもリポジトリを複数人で共有して作業する場合には「Team (Organizations)」を使った方が便利です。
`#`**パブリックリポジトリだけでいいなら「Free (Organizations)」を使って試してみたら良いと思います。**
`#`(今のところ)説明なしでスマヌ！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/140610/fb5b8207-e316-45e6-5392-a746965f756a.png)

> 利用例: http://qiita.com/javacommons/items/5cddb545ec2a4fb3de2b 『【ドラフト＆書きかけ】とある企業における、GitHubの「プロジェクト機能」と「リリース機能」利用例(仮題)』

<table height="400" width="600"><tr><td>
😲<b>セーラームーン / ムーンライト伝説 (ユーロビート)ver.</b>
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">セーラームーン / ムーンライト伝説 (ユーロビート)ver.<a href="https://t.co/o91qCKNtAW">https://t.co/o91qCKNtAW</a></p>&mdash; JavaCommons (@javacommons) <a href="https://twitter.com/javacommons/status/849831235933224960">2017年4月6日</a></blockquote>
</td></tr></table>
Metalシェーダ言語のバージョンについて

Metalを利用しているアプリで、iOS 9のデバイスでMTLRenderPipelineStateを作成するのに失敗していて、iOS 10のAPIを使っているところは回避してるはずなのに何だろうと思ってエラーメッセージを見てみたら、

> Error Domain=AGXMetalG4P Code=1 "Function {関数名} is using **language version 1.2** which is incompatible with this OS."

と、**Metal Shading Language のバージョンの問題**だった。Metal 1.2はiOS 9では使えないよ、と。


##利用するMetal Shading Languageのバージョンを指定する

[Metal Shading Language Specification](https://developer.apple.com/metal/metal-shading-language-specification.pdf)の「6.3 Options Controlling the Language Version」にバージョンの指定方法と、各言語バージョンとiOSバージョンの関係が書いてあった。


- `ios-metal1.0` – support the unified graphics / compute language revision 1.0 programs
for iOS 8.0.
- `ios-metal1.1` – support the unified graphics / compute language revision 1.1 programs
for iOS 9.0.
- `ios-metal1.2` – support the unified graphics / compute language revision 1.2 programs
for iOS 10.0.
- `osx-metal1.1` – support the unified graphics / compute language revision 1.1 programs
for OS X 10.11.
- `osx-metal1.2` – support the unified graphics / compute language revision 1.2 programs
for macOS 10.12. 

##Xcodeでの設定方法

上記のドキュメントでは、コンパイラオプションに `-std=` に続いて上のバージョンのどれかを指定するように書かれているが、Xcode だと "Metal Compiler - Features" というセクションに、"Metal language revision" というプルダウンで設定できる項目がある。（8.3で確認）
Vue.jsの「ライフサイクルダイアグラム」の見方


https://jp.vuejs.org/v2/guide/instance.html#ライフサイクルダイアグラム
の見方がよくわからなかったので、自分の言葉で適当にメモだけ。

observe data：データがあるのかとかのチェックはするが、まだデータは埋め込まれない
created：なので、createdのときにはまだdataが入らない
赤字：イベント
実践：否が応でも進む方向
点線：場合によって待ったりする方向
mountされる：データがはめ込まれる
destroy：コンポーネントとかを読み終わったら。
文字列に含まれるタグを削除して要素を取り出す

```python
def remove_select_tags(string, start_tag, end_tag):
    start = string.find(start_tag)
    while start != -1:
        end = string.find(end_tag, start)
        string = string[:start] + " " + string[end + 1:]
        start = string.find(start_tag)
    return string.split()

def test_case():
    target_string = '''<h1>Title</h1><p>This is a
                        <a href="mt-takao.top">link</a>.<p>'''
    assert remove_select_tags(target_string, '<', '>') == ['Title', 'This', 'is', 'a', 'link', '.']
    target_string = "[test]アイウエオ[test][next]カキクケコ[next]"
    assert remove_select_tags(target_string, '[', ']') == ['アイウエオ', 'カキクケコ']
    print('test ok')
test_case()
```
文字列の中の指定した文字の要素を削除し要素を取り出します。
要素が見つからなかったら-1が返るのでそれ以外の場合実行します。
startで見つかったindexの前の部分を空白でつなぎendで見つかったindex以降の文字列とつなぎ合わせます。
そして新たに生成された文字列からさらにstart_tagを探します。
最後に空白をカンマ区切りにして終了します。
[Resolved?] Qiita > UI > 下書き保存後、下書きを編集しようとすると「Qiitaに投稿」になる。

2017年4月4日現在、気づいた事項。

下書きを作成して、「下書き保存」ボタンで保存。
その後、[編集]ボタンを押して編集をしようとすると、ボタンは「Qiitaに投稿」になっている。

気のせいかもしれないが、これが数日前は「下書き保存」になっていた（前回の選択が記憶されていた）と思う。

下書きを編集するときは誤って投稿してしまわないように注意が必要だ。

記事の新規作成時に@howdy39さんのQ Acceleratorにより下書きが表示されるはずだが、それも表示されない。
通信関連のトラブルだろうか。

- Ubuntu 14.04 LTS @ location 1
- CentOS 6.8 (64bit) @ location 2
- Windows 8.1 pro (64bit) @ location 2
- Windows 7 pro (32bit) @ location 2

### 対策
(追記 2017/04/24)

タグを記載しないことで、誤投稿を防ぐことができる。下書きにはタグをつけないという方法が良さそう。

### 戻った?
(追記 2017/04/27)

下書き保存後、再編集時には「下書き保存」になるように戻っています。
これで、下書き編集時に毎回「下書き保存」を選択するという作業が不要になりました。
誤って投稿してしまうリスクもなくなりました。
:clap: :clap_tone1: :clap_tone2: :clap_tone3: :smile: 

対応ありがとうございます。
Kotlin設定でエラー → Error:Failed to resolve: org.jetbrains.kotlin:kotlin-stdlib-jre7:1.0.7


Androidプロジェクトを新規作成し「Configure Kotlin in Project」でKotlin設定後ビルドをしたら下記エラーが出ました。

![Kobito.8b60fw.png](https://qiita-image-store.s3.amazonaws.com/0/6061/1c7f90ba-317f-7ad6-7efc-041f74e4b864.png "Kobito.8b60fw.png")

これは単純に、`kotlin-stdlib-jre7`はバージョン1.1系以上のパッケージしか公開されていないためです。

https://mvnrepository.com/artifact/org.jetbrains.kotlin/kotlin-stdlib-jre7

ですので、バージョンを1.1以上のものにすれば直ります。

```build.gradle
buildscript {
-     ext.kotlin_version = '1.0.7'
+     ext.kotlin_version = '1.1.1'
    
    ...
```

参考：http://stackoverflow.com/q/42843441
typora フローチャートの書き方


## 横方向に書く場合
 
~~~

```mermaid
 graph LR
    A[東京] -- 山梨 --> B((長野))
    A --> C(熱海)
    B --> D{名古屋}
    C --> D
    D --> |行けたら| E[大阪]
    D --> |無理なら| F[和歌山]
``` `

~~~
↑最後のバッククォートひとつは、いりません。（記事の表示崩れ防止）

次のようになります。
![md-chart.PNG](https://qiita-image-store.s3.amazonaws.com/0/173326/df33d54c-0d8e-f7af-21b9-9541cbe83c78.png)



## 縦方向に書く場合


~~~

```mermaid
graph TB
    A[東京] -- 山梨 --> B((長野))
    A --> C(熱海)
    B --> D{名古屋}
    C --> D
    D --> |行けたら| E[大阪]
    D --> |無理なら| F[和歌山]
``` `

~~~

↑最後のバッククォートひとつは、いりません。（記事の表示崩れ防止）

次のようになります。
![md-chart.PNG](https://qiita-image-store.s3.amazonaws.com/0/173326/240b8b1c-91c0-5a2d-4489-42b1a40b5ba0.png)

## まとめ
横方向に書きたいときは
> graph LR

縦方向に書きたいときは
> graph TB

ということになります。
Rails5のActionCableを特定のページのみ使用する

Rails5から導入されたActionCableは、Websocketを使ってブラウザとサーバ間を持続的に接続し、リアルタイムで相互通信をする仕組みです。業務で使用するために調査をしていたのですが、どうも特定のページのみ使用するような仕組みにはなっておらず、Railsの公式ドキュメントのまま適用すると、全てのページでストリーミング接続してしまいます。

ググってみてもなかなか日本語での解説は見つからなかったのですが、海外では同様の問題を考えているサイトがいくつか見つかりました。それらを参考に、最終的に以下のように対応しました。

まず、application.html.erbのbodyタグにコントローラ名、アクション名を埋め込みます。

```erb:app/views/layouts/application.html.erb
<html>
  ...
  <body class="<%= controller_name %> <%= action_name %>">
  ...
  </body>
</html>
```

次に、クライアント側サブスクリプションで特定クラスのみ接続するよう変更します。以下コードの冒頭２行を追加します。(hogeチャンネルを作成し、fooコントローラーのbarアクションのみで使用したい場合)

```coffeescript:app/assets/javascripts/channels/hoge.coffee
$(document).on "turbolinks:load", ->
  if $(".foo.bar").length > 0
    App.response = App.cable.subscriptions.create "HogeChannel",
      received: (data) ->
        # 受信時の処理
```

以上で、特定のページのみストリーム接続することが可能になりました。

現場からは以上です。

### 参考
- http://philippe.bourgau.net/how-to-subscribe-to-an-actioncable-channel-on-a-specific-page-with-custom-data/
- http://stackoverflow.com/questions/36438323/page-specific-actioncable
Guest Additionsのインストールができないときの対応①


　■参考URL：http://qiita.com/wakaba260/items/b5c87b7815b710f303a0

　　1.sudo yum -y update kernel
　　2.sudo yum -y install kernel-devel kernel-headers dkms gcc gcc-c++
　　3.export KERN_DIR=`ls -t /usr/src/kernels/|head -1`
　　4.サーバー再起動
　　5.sudo /etc/init.d/vboxadd setup
vi便利コマンド


・文字コードを指定して表示
:e ++enc=文字コード

・ファイルエンコードを指定して保存しなおす
:set fenc=文字コード

・開いているファイルの文字コードの確認
:set enc?

・開いてるファイルエンコードの確認
:set fenc?

・タブ関連
	新規タブを開く:tabnew
	次のタブに切り替え:gt
	前のタブに切り替え:gT
	ウィンドウを閉じる:q
	バッファを閉じる:bd

・次の画面に進む
:Ctr+f

・前の画面に進む
:Ctr+b

・入力補完
入力中にCtr+pを押す

・ビジュアルモード
通常モードでvを押す

・矩形選択＋挿入
	1.Ctr+v
	2.カーソルで範囲を選択
	3.Shift+iまたはShift+a
	4.文字を入力後、escキー

・矩形選択＋削除+挿入
	1.Ctr+v
	2.カーソルlを押す
	3.カーソルで範囲を選択
	4.カーソルのcを押してインサートモード
	5.文字を入力後、escキー
このディレクトリ パーティションは少なくとも次の日数の間、バックアップされていません。

と出るのを解消したく
調査したら
http://blog.dreamhive.co.jp/mkoba/?p=2462
「システム状態」
を追加すれば良いだけだったので追加しましたっ

ちゃんと取れていると期待っ