OmniAICreator/Qiita-1.07M huggingface dataset:
Firebaseで条件を指定してプッシュ通知を送るのにどハマりした件


## やりたかったこと
FirebaseのNotificationsを利用することで、条件を満たしたユーザーに対してプッシュ通知をしたかった。条件の例としては「**ボタンを５回以上押したユーザー**」や「**特定の画面を表示したユーザー**」などなど。

## FirebaseでiOS端末にプッシュ通知を送れるようになるまで

こちらの記事が大変わかりやすかったのでここでは省略します。

- [FirebaseのPush通知をiOSで使ってみる](http://qiita.com/jiiikki/items/31f294cf2afcfe8d868d)
- [SwiftでFirebaseを使ってNotificationを送ってみた（が、色々詰まった話）
](http://qiita.com/uti/items/31e44aacadc7d7ef439a)

## 条件付きプッシュ通知を送る流れ
コードにはこんなイベントをテストログとして残しておく。

```viewController.swift
    override func viewDidLoad() {
        super.viewDidLoad()
  

        FIRAnalytics.logEventWithName("sccontent", parameters: [
            "name": "tap",
            "full_text": "button"
            ])
    }
```
<br>


1. Analyticsのユーザーをクリックした後に、新しくユーザーリストを作成する(例:testUser)
![一枚目.png](https://qiita-image-store.s3.amazonaws.com/0/116582/fe22476e-90cd-1e90-0cdc-080d1b53ae39.png)
<br>

2. コードに埋め込んだイベント名を直接入力
 ![２枚目.png](https://qiita-image-store.s3.amazonaws.com/0/116582/bebe3ba7-4d6c-fcd8-af0e-9febfb57f69f.png)
<br>
3. パラメータを入力する
![4枚目.png](https://qiita-image-store.s3.amazonaws.com/0/116582/6969a134-845e-0215-bad0-c839a193ffc2.png)
<br>
4.こんな感じになればOKです
![5枚目.png](https://qiita-image-store.s3.amazonaws.com/0/116582/2b738d86-3218-fc5d-15a2-1c3392a547e7.png)
<br>

5.最後にNotificationsより新規メッセージで、先ほど追加したユーザーを選択してあげれば完了です
![7枚目.png](https://qiita-image-store.s3.amazonaws.com/0/116582/85ae64a2-fca3-7bb6-c66b-fe8072373d0e.png)
<br>


## はまった点
- 上の手順通りやったが一向に通知が送られてこなかった。(アプリのみを選択すると通知が来るので、通知自体がこない状態ではなかった)
- 原因としては、イベントが**firebase上に反映されていない**のが原因だったらしく、翌日に再度このユーザーに対してメッセージを送信したらちゃんと通知が届いた。イベントが何時間後に反映されているのかはわかってないです(^_^;)
- 条件付きのメッセージを送りたい場合は、パラメータは確認できませんが**イベントがまず表示されているか確認することが大事**ということを学びました
![イベント.png](https://qiita-image-store.s3.amazonaws.com/0/116582/d868c511-4c42-6ca0-d427-dc87c6e04616.png)
rake db:create ができない時の対処（Could not find rake-11.2.2 in any of the sources）

環境はosx yosemite 10.10.5
ruby -v 2.1.3


自分の場合は
rake db:createをしようとした時に、

```
Could not find rake-11.2.2 in any of the sources
Run `bundle install` to install missing gems.
```
このようなエラーが吐かれ、rakeコマンドが使えなくなった。
当然、`rake routes`も`rake db:migrate`もできない。



#rubyの確認
```
MacBook-Pro-3:app user_name$  which ruby
/Users/user_name/.rbenv/shims/ruby
```

#bundleの確認

ここで、本来ならば、bundleもrakeも.rbenv配下を見て欲しいのだが、

```
MacBook-Pro-3:app user_name$ which bundle
/usr/bin/bundle
MacBook-Pro-3:app user_name$ bundle show rake
/Library/Ruby/Gems/2.0.0/gems/rake-11.2.2
```
両方とも.rbenv配下を見に行ってない。



#修正作業　　bundleのインストール

```
MacBook-Pro-3:app user_name$ rbenv exec gem install bundler
Successfully installed bundler-1.12.5
Parsing documentation for bundler-1.12.5
Done installing documentation for bundler after 2 seconds
1 gem installed

MacBook-Pro-3:app user_name$ rbenv rehash
```
```
MacBook-Pro-3:app user_name$ which bundle
/Users/user_name/.rbenv/shims/bundle
```
bundleは.rbenv配下に入った。

しかし、
rakeあるはずだけどrakeがない見つからないと言われる・・・。
```
MacBook-Pro-3:app user_name$ bundle show rake
Could not find rake-11.2.2 in any of the sources
```

#rakeのinstall

```
MacBook-Pro-3:app user_name$ gem install rake
Fetching: rake-11.2.2.gem (100%)
rake's executable "rake" conflicts with /Users/user_name/.rbenv/versions/2.1.3/bin/rake
Overwrite the executable? [yN]  y
Successfully installed rake-11.2.2
Parsing documentation for rake-11.2.2
Installing ri documentation for rake-11.2.2
Done installing documentation for rake after 0 seconds
1 gem installed
```
rakeのインストールできた！！！！

#bundle install実行
```
MacBook-Pro-3:app user_name$ bundle install
Fetching gem metadata from https://rubygems.org/
Fetching version metadata from https://rubygems.org/
Fetching dependency metadata from https://rubygems.org/
Using rake 11.2.2
Installing i18n 0.7.0
Installing json 1.8.3 with native extensions
...
...
...
.
.
.
.
.
Bundle complete! 14 Gemfile dependencies, 69 gems now installed.
Use `bundle show [gemname]` to see where a bundled gem is installed.
```

これで晴れてrakeコマンドが使えるようになる。
CSS 復習


<h1>Point's of HTNL tag & what is a div elements?</h1>

<h2>HTML Elementsのお勉強</h2>

なんか微妙な理解を再度復習、うんスッキリ！！！

##what is a link?

Link要素は、現在のドキュメントと関連する別のドキュメントを指定し、その関係性を示す

##What is a rel?

rel要素は、リンク先のほかのドキュメントに対する関係性を示すための属性

rel="stylesheet"は、「外部スタイルシート」であることを示す。

##what is a type?

type=""はCSSのMINEタイプを指定する

MINEタイプとは、WebサーバとWebブラウザの間でやりとりされるデータのなかで「ファイル形式を示す識別子」
type="text/css" => ファイルの分類/ファイルの種類

##what is a href?

href要素は、Hyper Referenceの略称で読み込むスタイルシートファイルを指定

##what is a div? 

division要素は、それ自身は意味を持っていない。ただ、スタイルシートを適用させる範囲を
区別したりするときに使う。

##参照URL
http://www.mitsue.co.jp/glossary/html4_xhtml1/attribute/rel.html
http://www.xml.vc/HTML5/kiso/MIME-Type.html
http://www.htmq.com/html/link.shtml
http://www.htmq.com/html/div.shtml
QString を atoi する

# toInt() を使おう

QString は格納している文字を整数化する toInt() メソッドを持ちます。
特別な理由がない限り、toInt()メソッドで代替できます。

# toInt と atoi の違い
toInt() は、文字列を整数化できる場合に、文字列を整数にします。
atoi() は、文字列を前方から整数化できる場合に、該当箇所を文字列を整数にします。

```cpp
// toInt()
qDebug() << QString("123").toInt() // 123
qDebug() << QString("1b3").toInt() // 0
qDebug() << QString("abc").toInt() // 0
// atoi
qDebug() << atoi("123") // 123
qDebug() << atoi("1b3") // 1
qDebug() << atoi("abc") // 0
```

# atoi する

なんかしらatoiを使う理由がある場合（従来コードでatoiされてるが、実装意図がわからない など）、以下のように const char * を取り出すことで利用できます。

```cpp
QString str("1b3");
int n = atoi( str.toAscii().constData() ); // n == 1
```

なお蛇足ですが、atof、atolも同様に応用できます。

# 参考

[C言語 atoi](http://hitorilife.com/atoi.php)
centos7

# networking
## add ip alias

- "NM_CONTROLLED=no" means this interface is not allowed to be configured by Network Manager service.

```
[root@centos7 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1
#VAGRANT-BEGIN
# The contents below are automatically generated by Vagrant. Do not modify.
NM_CONTROLLED=no
BOOTPROTO=none
ONBOOT=yes
IPADDR=192.168.33.10
NETMASK=255.255.255.0
DEVICE=eth1
PEERDNS=no
#VAGRANT-END
```

- add ip alias manually on eth1

```
[root@centos7 ~]# diff /tmp/ /etc/sysconfig/network-scripts/ifcfg-eth1
7a8,9
> IPADDR1=192.168.33.11
> NETMASK1=255.255.255.0

[root@centos7 ~]# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:96:1d:95 brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic eth0
       valid_lft 85357sec preferred_lft 85357sec
    inet6 fe80::5054:ff:fe96:1d95/64 scope link
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:e7:bb:f9 brd ff:ff:ff:ff:ff:ff
    inet 192.168.33.10/24 brd 192.168.33.255 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fee7:bbf9/64 scope link
       valid_lft forever preferred_lft forever
[root@centos7 ~]# ifup eth1
RTNETLINK answers: File exists
[root@centos7 ~]# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:96:1d:95 brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic eth0
       valid_lft 85323sec preferred_lft 85323sec
    inet6 fe80::5054:ff:fe96:1d95/64 scope link
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:e7:bb:f9 brd ff:ff:ff:ff:ff:ff
    inet 192.168.33.10/24 brd 192.168.33.255 scope global eth1
       valid_lft forever preferred_lft forever
    inet 192.168.33.11/24 brd 192.168.33.255 scope global secondary eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fee7:bbf9/64 scope link
       valid_lft forever preferred_lft forever
```
PyAudioを使って音声ファイルを割り込みで再生させる



Pythonのタグを新着順で眺めているとこんな記事がありました。
[Pythonから音声ファイルを割り込みで再生させる
](http://qiita.com/Mic-U/items/21991d0d0f0679d90cda)


PyAudio使ったことあるけどそんな使い方してなかったので、「PyAudioでもできそうだけどできないのかな？」と思いながら、読んでいました。 
###気がついたら作ってました。



```python
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pyaudio
import wave
from time import sleep
import threading

CHUNK = 1024


class AudioPlayer:
    """ A Class For Playing Audio """

    def __init__(self):
        self.audio_file = ""

        # 止める用のフラグ
        self.paused = threading.Event()

    def setAudioFile(self, audio_file):
        self.audio_file = audio_file

    def playAudio(self):
        if (self.audio_file == ""):
            return
        self.wf = wave.open(self.audio_file, "rb")
        p = pyaudio.PyAudio()

        self.stream = p.open(format=p.get_format_from_width(self.wf.getsampwidth()),
                             channels=self.wf.getnchannels(),
                             rate=self.wf.getframerate(),
                             output=True)

        data = self.wf.readframes(CHUNK)

        # play stream (3)
        while len(data) > 0:
            # もし、止めるフラグが立ってたら
            if self.paused.is_set():
                # 再生を止める
                self.stream.stop_stream()
                # フラグを初期状態に
                self.paused.clear()
                break
            self.stream.write(data)
            data = self.wf.readframes(CHUNK)

        # stop stream (4)
        self.stream.stop_stream()
        self.stream.close()
        # close PyAudio (5)
        p.terminate()


def play(player):
    # 再生は別のスレッドでする
    audio_thread = threading.Thread(target=player.playAudio)
    audio_thread.start()


if __name__ == "__main__":
    player1 = AudioPlayer()
    player1.setAudioFile("1.wav")
    player2 = AudioPlayer()
    player2.setAudioFile("2.wav")

    play(player1)
    # 例えば0,5秒後に別の音源に変える
    sleep(0.5)
    # 1を止めて
    player1.paused.set()
    # 2を再生
    play(player2)

```


一応できたのですが、 **バグ** というかがあって。。。
メインの部分を、一度止めてもう一度再生するみたいにすると、


```python
if __name__ == "__main__":
    player1 = AudioPlayer()
    player1.setAudioFile("1.wav")

    play(player1)
    # 例えば0,5秒後にもう一度同じのを再生する
    sleep(0.5)
    # 1を止めて
    player1.paused.set()
    # もう一度1を再生
    play(player1)

```



```bash
Python(39927,0x105607000) malloc: *** error for object 0x100886800: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
zsh: abort      python audio.py
```

ってエラーがでるので、適宜

```python
if __name__ == "__main__":
    player1 = AudioPlayer()
    player1.setAudioFile("1.wav")

    play(player1)
    # 例えば0,5秒後にもう一度同じのを再生する
    sleep(0.5)
    # 1を止めて
    player1.paused.set()
    # もう一度1を再生
    
    # エラー出るからスリープかける
    sleep(0.6)
    play(player1)

```

として、スリープをかけてあげてください。私の環境では0.6秒以上休まないとこのエラーがでます。
MonoDevelopのソースコード折りたたみ機能を有効にする

# #regionが折りたためない件
UnityでC#を書いていて

```
#region 

#endregion 
```
で囲ったコードを折りたためるということを知ったのだが、MonoDevelopのソースコード折りたたみ機能が有効になっておらず機能しなかった(´･_･`)


# MonoDevelopのソースコード折りたたみ機能を有効にする
Preference > Text Editor > General > Code Folding > Enable code folding にチェックを入れる。
<img width="722" alt="スクリーンショット_2016-06-29_15_39_05.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/6380/91e9c47a-3f2d-ca10-e6a9-9afa3a4be0e5.jpeg">
これで折りたためるようになる。
<img width="426" alt="スクリーンショット 2016-06-29 15.39.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/6380/8ae53d94-69b7-d1d2-cb9b-2f8c011b7bf3.png">
↓
<img width="447" alt="スクリーンショット 2016-06-29 15.39.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/6380/bbb79d45-74ba-6528-7961-3f63a0689466.png">


というかメソッドの折りたたみも普通にできたのかよ／(^o^)＼

#参考
[#region (C# リファレンス)](https://msdn.microsoft.com/ja-jp/library/9a1ybwek.aspx)
Add Flash Type in Rails

## Add flash type in application controller

```rb
# app/controller/application_controller.rb
class ApplicationController
  add_flash_types :original_type, :second_one
end
```

## How to use (Example)

```haml
-# app/views/layouts/application.html.haml
- if flash.present?
  - flash.each_with_index do |(type, msg), index| 
    %div(class="flash flash-#{type}")
      .alertBlock
        %p= msg
  :coffee
    if typeof timerID != 'undefined'
      clearTimeout timerID
    timerID = setTimeout ->
      $('.alert.floating').animate {
        opacity: 0
      }, 300, ->
        $('.alert.floating').css 'display', 'none'
    , 1700
```
Grasshopperで生物の形モデリング_ハニカム

![](https://pixabay.com/static/uploads/photo/2014/05/02/12/49/the-hive-335984_960_720.jpg)

ハチの巣などで見られる六角形が並んだかたち、ハニカム構造をGrasshopperで作ります。

---------------

#できたもの

6角柱の集まり。高さ、大きさ、ｘ方向とy方向の複製数をいじることができます。
![honeycomb_1.PNG](https://qiita-image-store.s3.amazonaws.com/0/39559/980b8e51-7dc9-49d2-ad69-561de7a7b149.png)

![honyecomb2.PNG](https://qiita-image-store.s3.amazonaws.com/0/39559/98879cc8-d0b4-1bf0-2f8c-a44f05a7925d.png)

--------------------

また、ハニカム構造ではなくなりますが、ベースの図形の角の数も変えられます。三角だとこんなかんじ。
![honeycomb3.PNG](https://qiita-image-store.s3.amazonaws.com/0/39559/88df1cab-87c1-66a5-277c-84e0bd1dda51.png)

四角だとこんな感じ
![honeycomb4.PNG](https://qiita-image-store.s3.amazonaws.com/0/39559/155cfb9b-cabe-4c10-6683-e56d54277e80.png)

--------------



#記述

![honeycomb.PNG](https://qiita-image-store.s3.amazonaws.com/0/39559/f7beb030-da49-55c4-c1b6-1b5be6ac952a.png)

-----------
1.ベースとなる6角形を作成。
2.RectangularArrayで複製・ｘ方向に整列。
3.整列した間を埋めるように、y方向に半分ずらしてMoveで複製。
4.サーフェイスを押し出す。

-----------

#ハニカム構造とは
- 正六角形または正六角柱を並べた形
- 平面充填図形の中では6角形は最も円に近いため、もっとも周の長さが短い=充填に必要な資材量が少ない
- ミツバチとハニカム構造についての[この動画がかわいい](https://youtu.be/QEzlsjAqADA)

-----------

#最後に

複製を同数ではなくだんだん数が減っていくようにして、四角ではなく↓みたいな感じにしたかったのだが、ループのさせ方がわからなくて断念しました。あと久しぶりに3平方の定理とかを使って、数学やっててよかったなあと思いました。100点満点中9点とかとったなぁ・・・。

![](https://pixabay.com/static/uploads/photo/2013/07/13/10/06/geometry-156568_960_720.png)
vue.jsでinputにfocus時のみ表示される「決定」ボタンと、サンプルコード

`input`に`focus`されている時だけ、ボタンを表示させるデザインを描きたいことありますよね。ユーザーの入力データを一項目ずつ保存させたいデザインの際、ボタンだらけにならずに済むので助かります。


それ、`vue.js`で簡単に実装できます。

## コード

[デモ jsfiddle](https://jsfiddle.net/akiho/w6h3djyt/1/)

```html:html
  <form @submit.prevent="submit">
    <h2>Front End</h2>
    <input type="text" v-model="value" @focus="focus" @keyup.esc="cancel" v-el:input-ele>
    <div v-show="onFocus">
      <p @click="cancel">cancel</p>
      <p @click="submit">submit</p>
    </div>
  </form>
```

```js:js
var app = new Vue({

  el: '#app',
  
  data: {
  	value: '',
    tmp: '',
    onFocus: false
  },
  
  created() {
  
  	this.value = _DB
  
  },
  
  methods: {
    
    focus() {
      this.tmp = this.value
      this.onFocus = true
    },
      
  	submit() {
      this.onFocus = false
      this.$els.inputEle.blur()
      this.ajax()
    },
    
    cancel() {
      this.value = this.tmp
      this.onFocus = false
    },
    
    ajax() {
      // do something
    }
  
  }  

})
```

※ 上記コードだけでは動きません（参考までにどうぞ）

## 終わり

vue.jsの公式にあるtodoアプリの超簡易バージョンといったところでしょうか。上記コードを配列などうまく使って拡張すれば、実際に即、運用可能になります。
Vagrant CentOSにて、ヒドいミスしてCan't connect to local MySQL server through socketを出した件

Vagrant上のCentOSにて、

```
ERROR 2002 (HY000): Can't connect
to local MySQL server
through socket '/var/lib/mysql/mysql.sock' (2)
```

というエラーを出してしまった。

mysqlの設定はlinuxだと大抵`/etc/my.cnf`に書いてあるので、`/etc/my.cnf`を確認。

```/etc/my.cnf
[mysqld_safe]
log-error=/var/log/mysqld.log
```

error logが`/var/log/mysqld.log`にあるとわかったので、そこを確認してみます。`grep ERROR`により、ERROR箇所のみを抽出できます。`less`コマンドでも良いんだけどね。

```shell-session
sudo cat /var/log/mysqld.log | grep ERROR
```

これで、ERRORメッセージを発見。

```
[ERROR] /usr/sbin/mysqld:
unknown variable 'character_set_server=utf8'
```

`'character_set_server=utf8'`というunknown variableがありますよ、と。実は試し書きをしてゐて、本来`character-set-server`と書くべきところをアンダースコアにしてました。mysqlの文法が正しく書いてあるドキュメントを読めればよかったのですが...

なので、とりあえず当該行を修正します。

```
sudo vi /etc/my.cnf # viでmy.cnfを開き当該行を修正
sudo service mysqld restart # mysqldの再起動
```

これにより解決、めでたしめでたし.
`character-set-server`は何かというと、databaseのエンコーディングを決める変数でした。
ここがShift-JISとかだと、普通に文字化けしてしまうんですよね。ここをutf-8に直したいと思ってやったことが思わぬバグを生みました。
xUnit.net の使い方（ソースの指定）

* 単体テストでは、引数と結果だけが違って、処理の同じテストを行いたいケースが多い。
* テストを関数として準備してやり、そこに引数を順次入れてテストを実行するための便利な機能が `xUnit.net` には準備されている。


# InlineData 属性

* テスト用の関数に属性としてつける。
* 属性の引数に書いたものがテストとして実行する際の引数になる。
* 1つの関数に何回でもつけることができる。
* 対象となる関数には `Theory` 属性をつけないとテストは実行されない。（逆に `[Fact]` は必要ない）
* `InlineData` の引数はすべて `object` 型になるため実行するまで型があってるかの情報は得られない。

```csharp
[Theory,
InlineData(0, 0, 0),
InlineData(1, 0, 1),
InlineData(1, 1, 0),
InlineData(2, 1, 1)]
public void AddTest(int expected, int x, int y)
{
    Assert.Equal(expected, Add(x, y));
}
```


# MemberData 属性

* テスト用の関数に属性としてつける
* 第1引数に指定した名前の、プロパティー、フィールド、メソッドが実行時の引数として利用される
* 1つの関数に何回でもつけることができる
* 対象となる関数には `Theory` 属性をつけないとテストは実行されない

## メソッド版

* 第1引数で指定した名前の `static` メンバー関数が実行されその結果がテストに渡される
* 関数の戻り値は、イテレータブルなものである必要があり、その中身が順次テストの引数として渡される
* 第2引数以降の引数は、ソースの生成用関数に渡される
* 以下の様に、 `IEnumerable<T>` と `yield` を利用すればきれいに書ける

```csharp
public static IEnumerable<object[]> GetSource()
{
    yield return new object[] { 0, 0, 0 };
    yield return new object[] { 1, 0, 1 };
    yield return new object[] { 1, 1, 0 };
    yield return new object[] { 2, 1, 1 };
}

[Theory,
MemberData(nameof(GetSource))]
public void AddTest(int expected, int x, int y)
{
    Assert.Equal(expected, Add(x, y));
}
```




## プロパティー版

* 第1引数で指定した名前の `static` プロパティーの値がテストに渡される
* 関数の戻り値は、イテレータブルなものである必要があり、その中身が順次テストの引数として渡される

```csharp
public static object[][] Source
{
    get
    {
        return new object[][]
        {
            new object[] { 0, 0, 0 },
            new object[] { 1, 0, 1 },
            new object[] { 1, 1, 0 },
            new object[] { 2, 1, 1 },
        };
    }
}

[Theory,
MemberData(nameof(Source))]
public void AddTest(int expected, int x, int y)
{
    Assert.Equal(expected, Add(x, y));
}
```


## フィールド版

* 第1引数で指定した名前の `static` フィールドの値がテストに渡される
* 関数の戻り値は、イテレータブルなものである必要があり、その中身が順次テストの引数として渡される

```csharp
public static object[][] Source = new object[][]
{
    new object[] { 0, 0, 0 },
    new object[] { 1, 0, 1 },
    new object[] { 1, 1, 0 },
    new object[] { 2, 1, 1 },
}

[Theory,
MemberData(nameof(Source))]
public void AddTest(int expected, int x, int y)
{
    Assert.Equal(expected, Add(x, y));
}
```


# 参考資料
Hyper-V版Androidエミュレータで時刻を変更する

Hyper-V版とはなんぞや？という人は[Hyper-VでサクサクAndroidエミュレータを使おう](http://qiita.com/kuluna/items/6984898efa975d61e74c)を見てみてください。

# 困ったこと
時刻によって表示が変わる系のアプリを開発していた時に、Hyper-V版エミュレータ上で時刻をいじってテストしようとしたのですが、時刻を取得するという処理のタイミングでなぜか元通りに戻ってしまいます。
![a77_1.png](https://qiita-image-store.s3.amazonaws.com/0/44992/6ce8b170-26b7-8308-b4a8-e1daff244b50.png)
上の**日付と時刻の自動設定**をOFFにするとこの画面ではいじることができるのですが、
アプリ側で`Calendar`クラスを使って時刻を取得しようとすると元に戻ってしまいます。

# 時刻の同期を止める方法
原因はHyper-V側にありました。Microsoft Visual Studio Emulator for Androidが作成するエミュレータは、ゲストOSの時刻を自動的に同期してくれるような設定になっているようです。
なのでその設定をOFFにすれば戻ることがなくなります。

1. Hyper-Vマネージャーを開きます。  
一覧の中にAndroidエミュレータがありますので、それを右クリック->設定に進みます。
![a77_2.png](https://qiita-image-store.s3.amazonaws.com/0/44992/abf957b3-3dc6-9876-16c8-091179b9b28d.png)
2. 統合サービスの中に**時刻の同期**があるので、このチェックを外してOKを押します。  
![a77_3.png](https://qiita-image-store.s3.amazonaws.com/0/44992/33c2374b-42b4-d6dd-3779-a5d1f1d3de90.png)

これでエミュレータの時刻を好きな時間に調整することができます。
AWSのGPUインスタンスでCIFAR-10の分類

## AWSでGPUインスタンスを作る

ここを参考にした。場所はus-eastが安いがレイテンシが結構ある。
http://www.chino-js.com/ja/tech/rbm-theano-gpu-aws/

## cuDNNのインストール
ここを参考にした。
http://qiita.com/pyr_revs/items/e1545e6f464b712517ed#chainer-with-cudnn
現時点では、`cudnn-7.5-linux-x64-v5.0-ga.tgz`がよさそう。
5.1以上はKerasがサポートしてないというメッセージが出る。
Cudaのバージョンは`nvcc -V`で確認できた。

## 必要そうなものをインストール

anacondaとkerasを入れる。
参考：[データサイエンティストを目指す人のpython環境構築 2016 - Qiita](http://qiita.com/y__sama/items/5b62d31cb7e6ed50f02c)

~~~
sudo yum -y install git
git clone https://github.com/yyuu/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
source ~/.bashrc

pyenv install anaconda3-4.0.0
pyenv rehash
pyenv global anaconda3-4.0.0
echo 'export PATH="$PYENV_ROOT/versions/anaconda3-2.5.0/bin/:$PATH"' >> ~/.bashrc
source ~/.bashrc
conda update conda
conda install seaborn
pip install keras
~~~

## スクリプトと計算結果

この論文のAll-CNN-Cをやってみた http://arxiv.org/pdf/1412.6806.pdf

Notebookはこちら、
https://gist.github.com/juntaki/e50200c82d6f3a5143e7b206a0ab2451

g2.2xlargeで10エポックで30分程度でした。
~~結果は81%しか出ていない（論文では90%以上出ている）、もうちょっと試行錯誤が必要そう。~~
追記：Dropoutとdata augmentationを追加して、87%まで出せた。時間の都合で打ち切ったがもうちょっと回せばだいたい論文と同じくらいの結果になったかも。
【Docker】Dockerでホストのディレクトリをマウントする

[Manage data in Docker | Docker Documentation](https://docs.docker.com/storage/)

ホストのディレクトリをDockerのコンテナから参照できるようにする。

# コマンド

## ホスト側のマウント先を指定する場合

```
docker run -v [ホストディレクトリの絶対パス]:[コンテナの絶対パス] [イメージ名] [コマンド]
```

```exmaple
docker run -v /lib/modules:/lib/modules dummy-img /bin/bash
```

これでホスト側のディレクトリがコンテナにマウントされる。コンテナ上で作ったファイルがホストの方に残る。

`docker inspect`するとこんな感じで表示される↓

```
"Mounts": [
    {
        "Source": "/lib/modules",
        "Destination": "/lib/modules",
        "Mode": "",
        "RW": true,
        "Propagation": "rprivate"
    }
]
```

マウントするとデフォルトで`read-write mode`なので`"RW": true`になってる。

> Docker volumes default to mount in read-write mode, but you can also set it to be mounted read-only.

```
docker run -v [ホストディレクトリの絶対パス]:[コンテナの絶対パス]:ro [イメージ名] [コマンド]
```

最後に`ro`をつけると`read-only mode`になる。

```
"Mounts": [
    {
        "Source": "/lib/modules",
        "Destination": "/lib/modules",
        "Mode": "ro",
        "RW": false,
        "Propagation": "rprivate"
    }
]
```

## ホスト先のマウント先を指定しない場合

```
docker run -v [コンテナの絶対パス] [イメージ名] [コマンド]
```

```exmaple
docker run -v /lib/modules dummy-img /bin/bash
```

```
"Mounts": [
    {     
        "Name": "3da94f6d7353ac0287b97b5a2eaa6434b4a827683dddaf03719c112e531fd47b",
        "Source": "/var/lib/docker/volumes/3da94f6d7353ac0287b97b5a2eaa6434b4a827683dddaf03719c112e531fd47b/_data",
        "Destination": "/lib/modules",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
    }
]
```

ホスト側の`/var/lib/docker/volumes`の下にディレクトリ作られてマウントされた。

## ホスト先のマウント先を指定しない場合 （name指定）

```
docker run -v [name]:[コンテナの絶対パス] [イメージ名] [コマンド]
```

```exmaple
docker run -v foo:/lib/modules dummy-img /bin/bash
```

```
"Mounts": [
    {
        "Name": "foo",
        "Source": "/var/lib/docker/volumes/foo/_data",
        "Destination": "/lib/modules",
        "Driver": "local",
        "Mode": "z",
        "RW": true,
        "Propagation": "rprivate"
    }
]
```

ホスト側の`/var/lib/docker/volumes`の下に`fooo`ディレクトリ作られてマウントされる。

# ちなみに

pythonの[docker-py](https://github.com/docker/docker-py)とかrubyの[docker-api](https://github.com/swipely/docker-api)を使うことが多いのでメモ。

## docker-py

[docker-py Documentation using-volumes](https://docker-py.readthedocs.io/en/latest/volumes/)

```
container_id = cli.create_container(
    'busybox', 'ls', volumes=['/mnt/vol1', '/mnt/vol2'],
    host_config=cli.create_host_config(binds={
        '/home/user1/': {
            'bind': '/mnt/vol2',
            'mode': 'rw',
        },
        '/var/www': {
            'bind': '/mnt/vol1',
            'mode': 'ro',
        }
    })
)
```

## docker-api

```
container = Docker::Container.create(
      'Image' => 'dummy_img',
      'HostConfig' => { 
          'Binds':  [ '/lib/modules:/lib/modules' ]
      },
)
```

# 参考

http://qiita.com/sokutou-metsu/items/b83b275198fc9594f5a4
xUnit.net の使い方（基本編）

# テスト用プロジェクトの準備

* Visual Studio テストのためのクラスライブラリプロジェクトを作成する
* プロジェクト名は、`テスト対象となるプロジェクトのプロジェクト名` + `.Tests` が多い
* テストプロジェクトは、テスト対象となるプロジェクトと同じソリューションに作ってもいい（大きなソリューションでなければ、この方が管理が楽）


# xUnit.net のインストール

* テストプロジェクトに `xUnit.net` をインストールする

* Visual Studio のメニューバーから `ツール` → `NuGet パッケージマネージャ` → `ソリューションのパッケージの管理` を開く
* ダイアログ右側から`オンライン` `nuget.org` を選ぶ
* 左上にある検索ボックスに `xUnit.net` と入力して検索
* 検索結果の中にある `xUnit.net` と `xUnit.net [Runner: Visual Studio]` をテストプロジェクトにインストールする

![WS000022.JPG](https://qiita-image-store.s3.amazonaws.com/0/28936/911a18e3-c885-318c-c99c-3013088b0e07.jpeg)


# 依存関係の追加

* テストプロジェクトの参照にテスト対象となるプロジェクトを追加する
* テスト対象となるプロジェクトの `internal` 属性にアクセスしたい場合は、テスト対象となるプロジェクトの `AssemblyInfo.cs` に以下を追記する

```csharp
[assembly: InternalsVisibleTo("『テストプロジェクトのアセンブリ名』")]
```


# テストコードを書く

* テストプロジェクト内にクラスを作成しテストを記述する
* クラス名は `テスト対象のクラス名` + `Tests` が多い
* テストメソッド名は `テスト対象のメソッド名` + `Test` が多い
* テストメソッドには `Fact` 属性をつける

```csharp
using Xunit;

public class IntCalculatorTests
{
    [Fact]
    public void AddTest()
    {
        Assert.Equal(0, IntCalculator.Add(0, 0));
        Assert.Equal(1, IntCalculator.Add(0, 1));
        Assert.Equal(1, IntCalculator.Add(1, 0));
        Assert.Equal(2, IntCalculator.Add(1, 1));
    }
}
```


# 実行する

* テストクラスに含まれる全てのテストを実行する場合は、エディタ上でテストクラスを右クリックし（クラス名の辺りがいい）、`テストを実行` を選択
* 特定のテストメソッドのみを実行する際は、テストメソッドのところで右クリックし、`テストを実行` を選択
* それ以外の場合、プロジェクト内のテスト全てを実行する場合は、メニューバーの`テスト` → `実行` → `全て` を選択
* テストが実行されると『テスト エクスプローラー』に結果が表示される。（表示されない場合は、メニューの `テスト` → `ウィンドウ` → `テスト エクスプローラー` を選択する。）
Install reCAPTCHA on Rails Application

# How to
### 1 - Create reCAPTCHA account.
  https://www.google.com/recaptcha/admin
###2 - Add gem 'recaptcha' 

```rb
# Gemfile
gem "recaptcha", require: "recaptcha/rails"

# DON'T omit "require" option like this!  'gem "recaptcha"'
# This cause the error such as:
# "undefined local variable or method `recaptcha_tags' " 
```

###3 - Add validation to controller

```rb
# app/controllers/some_controller.rb

def create
    @user = Some.new user_params
    if verify_recaptcha(model: @some) && @some.save
      redirect_to account_login_path, notice: 'Success!'
    else
      render :new
    end
end
```

###4 - Add reCAPTCHA tag in view file (in this case, edit haml file)

```rb
# app/view/some/new.html.haml
= form_for user, url: path do |f|
  = recaptcha_tags # ADDED
```

###5 - Add reCAPTCHA config file

```rb
# config/initializers/recaptcha.rb
Recaptcha.configure do |config|
  config.site_key  = 'Your Public key'
  config.secret_key = 'Your Private key'
  # Uncomment the following line if you are using a proxy server:
  # config.proxy = 'http://myproxy.com.au:8080'
end
```

###6 - Bundle install and start server

```bash
bundle install
rails s
```

###7 - Error massage translation

```yaml
# config/locale/ja.yml
ja:
  recaptcha:
    errors:
      verification_failed: "認証に失敗しました"
      recaptcha_unreachable: "接続に失敗しました"
```

It is very easy way to integrate reCAPTCHA to your Rails Application.
Should Try! 
Feel free to comment or ask Question. 

* 2017/02/14 fixed chapter "5 - Add reCAPTCHA config file". Thanks to @besukosan
テストコードの始め方

# テストとは

* プログラムが期待された通りに動くかどうかを確認する作業
* 手動で行う場合や、ツールを使う、テストコードを利用する場合などがある
    * 手動
        * 打鍵フルパステスト
    * ツール
        * [Lint](https://ja.wikipedia.org/wiki/Lint)
        * [静的コード解析](https://ja.wikipedia.org/wiki/%E9%9D%99%E7%9A%84%E3%82%B3%E3%83%BC%E3%83%89%E8%A7%A3%E6%9E%90)


# テストコードを利用したテスト

* プログラムが正しく動くかどうか、プログラムを利用して検証する
* 引数や状態を与えてやって、その時に期待される結果が返ってくるかをコードで確認する
* 一般的には、テスト用のライブラリを利用して行う


## 単体テスト用ライブラリ

| 言語       | ライブラリ |
|:-----------|:----------|
| C          | [CUnit](http://cunit.sourceforge.net/) |
| C#         | [xUnit.net](http://xunit.github.io/), [NUnit](http://www.nunit.org/) |
| Java       | [JUnit](http://junit.org/junit4/) |
| JavaScript | [QUnit](https://qunitjs.com/), [Mocha](https://mochajs.org/), [Jasmine](http://jasmine.github.io/) |


# C# での単体テストの例

コードで見た方が、何をする事なのかわかりやすいと思います。

```csharp
Assert.Equal(0, Add(0, 0));
Assert.Equal(1, Add(0, 1));
Assert.Equal(2, Add(1, 1));
```

* テスト用のライブラリ [xUnit.net](http://xunit.github.io/) を利用した例
* 関数 `Add` は2つの整数の引数を取り、その和を返す関数
* 関数 `Assert.Equal` は二つの引数が異なる（同じではない）と異常をだす
    * 1つ目の引数が期待される答え（expected）
    * 2つ目の引数が実際の値（actual）
* これらのコードを実行すれば、関数の戻り値の整合性の確認がとれる
* 前提となる条件、状況が必要な場合には、それらもコードで与えてやることになる


# テストコードを書くメリット

## 検証作業を自動化できる

* テストコードを走らせれば、検証できるので、検証作業を自動化することが出来る
* テストコードを自動で走らせるソフトを利用する
    * [Jenkins](https://jenkins.io/)
    * [CircleCI](https://circleci.com/), [Travis CI](https://travis-ci.org/), [AppVeyor](https://www.appveyor.com/)


## リファクタリングしやすくなる

* チューニングやリファクタリングを繰り返しても、コードを走らせるだけで『壊してないかを』確認できる
* 安心して修正することが出来る

## リリースを素早くできる

* テストコードのカバー範囲が増えていけば、人がしなければならない検証作業を減らすことが出来る
* よって、リリース前の確認作業を減らすことが出来る
* 究極の理想状態 (全ての動作の確認をテストコードでできてしまう状態) に到達できれば、コードを書いた瞬間に出荷判定が出来る
    * 現実には難しいですが・・・
    * ただ、継続的インテグレーションの目標はこの辺だと思います


## プログラムが正しく動くことを客観的に保証できる

* テストコードを走らせれば、誰でも同じ検証が出来る (ので、そもそも人がしなくてもいい)
* バージョン管理にテストコードも一緒に入れておけば、後からその時点での確認もできる

## そもそも、テストコードは仕様書みたいなものである

* メソッド単位で挙動をコードに書くので、仕様書のようなものである
* 仕様書からテストコードを作るソフトもあるらしい（個人的には逆が欲しい・・・）


## 設計手法が洗練される

* 「テストが書きやすいコードは良いコード」という意見が巷にはある (私も同意見)
* テストが書きやすいコードは、状況の再現が容易なコードでもあるので
    * 引数で状況を再現してやる訳だし
* テストコード上で、状況と呼び出されるメソッドと結果が一目で見てわかる状況になるので、不整合が違和感として浮かび上がりやすい
    * 『こうすれば、こうなるのが、このメソッド』とコードで書くわけなので、この三つがずれてる設計や命名だとテストコードがいびつなものになる


# テストコードを書くデメリット、難点

## そもそも、テストコードを書かなければならない
    
* テストコードを書かないことには検証できないので面倒くさい
* 納期が短いと『そんな余裕はない』ということも・・・
* そんな時のために [静的コード解析](https://ja.wikipedia.org/wiki/%E9%9D%99%E7%9A%84%E3%82%B3%E3%83%BC%E3%83%89%E8%A7%A3%E6%9E%90) ツールは存在するわけですが・・・ (高い・・・)

## テストを書いたからと言って『完璧』になるわけではない

* 全ての検証作業でそうな様に、テストの内容に漏れがあれば検証としては不完全なものになる
* そもそも、ハードウェアが無いと出来ないことは、テストコードだけではどうしようもないですし・・・


# とりあえず・・・

テストを書けば、完璧な検証がすぐにできると言うような銀の弾丸的な効果はありませんが、ソフトウェアが複雑化しながら納期が短くなる昨今では、どこかでやらなければならなくなるモノだと思います。
Windows Update エージェントのバージョンを確認する

検索でたどり着くのに以外に時間がかかったのでメモ

https://support.microsoft.com/ja-jp/kb/949104

#インストールされている Windows Update エージェントのバージョンを確認する方法
- % システム ルート %\system32 フォルダーを開きます。% システム ルート %は、Windows がインストールされているフォルダーです。たとえば、%systemroot%フォルダーは、C:\Windows です。
- Wuaueng.dll を右クリックし、[プロパティ] をクリックします。
- [詳細] タブをクリックし、ファイルのバージョン番号を探します。
git pushしたらPermission errorでメンタルがやられました


#1.Gitでpushしたら...

```ruby:command
$ git push fork master
ERROR: Permission to xxx/test.git denied to yyy.
fatal: The remote end hung up unexpectedly

Please make sure you have the correct access rights
and the repository exists.
```

このエラーではまってしまいました...

#2.僕がしたこと

~/.ssh/configを設定する

```~/.ssh/config
~/.ssh/config
Host github.com
  HostName watsonso
  Port 22
  IdentityFile ~/.ssh/id_rsa // 名前変更したSSH鍵
  TCPKeepAlive yes
  IdentitiesOnly yes
```

#3. 新しくブランチを作成

```ruby:command
$ git checkout -b test master
```

このブランチでpushしたらうまく行きました！！！
avastの中間者攻撃！

# まずはスクリーンショットから

![Githubの…証明書！？](https://qiita-image-store.s3.amazonaws.com/0/60327/139a74e0-f86f-0538-9c29-b7335dea7df9.png)

# 気づいた経緯

SSL関連での設定を行ったこともあって、ほかのサイトでも「SSL設定はどうなっているかな」と調べていたところ、証明書がこんなのになっていることに気づいてしまいました。

# 技術的な詳細
ブラウザで「安全」だとされる証明書は、証明書の署名をたどっていって、ブラウザあるいはOSに入っている「ルート証明書」に行き着くもの、ということになります。そして、このルート証明書の正しさを担保するものは、じつは**何もありません**。

ということで、誰かがルート証明書に不用意なものを追加してしまえば、SSLの安全性全体が崩壊しかねない、ということになります（少し前に、[Superfish](http://www.itmedia.co.jp/enterprise/articles/1502/27/news077.html)なんていうものが話題となりました）。

このケースでも、avast!が追加した「avast! Web/Mail Shield Root」がルート証明書として組み込まれて、そしてavast!が生成したgithub.comの証明書が「正当なもの」として通用してしまっています。

# セキュリティのためなら仕方ないんじゃ？
たしかに、このような手を使わなければHTTPSの通信内容を取得することはできません。実験用などで、意図的にMITMProxyを自分で仕掛けることもあるかもしれません。

ただ、今回気づいてびっくりしたように、avast!のこの仕掛けは、少なくとも**意識的に設定したものではありません**。コンピューターの管理者が事前に設定しておく、という場合はともかく、自分自身のパソコンにこのような設定を組む以上は、ユーザー側の明確な同意が必要なものだと考えます。「許諾契約に書いておいた」レベルではまずいでしょう。

# 公開鍵ピンニングは？
Githubでは公開鍵ピンニングを導入しているので、こんなMITM攻撃は成立しないと思っていました。ところが、今回の場合は通ってしまっていました。で、確認してみると、もともとブラウザについていた以外のルート証明書については、**ピンニングチェックの対象外**とのことでした。このように、PC側に何か入れられた場合には手のうちようがありません。
image-familyとbreaking change !!

# image alias

Compute EngineのImageには元々Aliasというプロパティがあり、Aliasを指定した場合、その中の最新のImageが使われていました。

例えば、以下のようにdebian-8のAliasを持ったImageが複数あった場合、その中の最も大きい名前のImageが選択されます。

```
gcloud compute instances create --image debian-8
# debian-8-jessie-v20160606 が使われる
```

Image List

```
Image Name                 Alias
debian-8-jessie-v20160511  debian-8
debian-8-jessie-v20160606  debian-8
```

```
debian-8-jessie-v20160511                          debian-cloud     debian-8            DEPRECATED  READY
debian-8-jessie-v20160606                          debian-cloud     debian-8                        READY
```

debian-8とさえ指定していれば、最新のdebian-8を選択してくれるので、便利な機能です。
しかし、Aliasは自分が作成した Custom Imageには設定できず、最初から存在しているImage専用の機能でした。

そのため、Custom Imageを指定してImage Templateを作っている場合、Version Upする度にImage Templateを作りなおす必要がありました。

# image-family

その状況を覆すために生まれたのが、image-familyです。image-familyはAliasと同じようにImageに設定され、Instance作成時に指定できます。
また、Custom Imageにもimage-familyを設定できるようになりました。

```
gcloud compute images create HOGE --family FAMILY
```

```
NAME               FAMILY
image-v20160517a   sample                         
image-v20160517b   sample
```

image-familyを利用する場合、明示的に --image-familyを利用します。

```
gcloud compute instances create HOGE --image-family FAMILY
```

FAMILYにsampleを指定した場合、sampleの中で最も名前が大きい `image-v20160517b` が利用されます。
これで、Custom Imageを更新する度に、imageを指定するNAMEを変更する必要がなくなりました。

# Breaking Changes

image-familyがリリースされたことで、image aliasesは利用することができなくなりました。そのため--imageを指定する場合は、完全なimage名を指定する必要があります。
gcloud sdk 114.0.0から適用されているので、updateする時は気を付けてください。

```
gcloud compute instances create hoge --image "/debian-cloud/debian-8-jessie-v20160606"
```


114.0.0 (2016/06/15)

```
Breaking Changes
      ▪ (Google Compute Engine) Deprecated the use of image aliases. Please
        use image families instead. See
        https://cloud.google.com/compute/docs/images for more details.
```
MACにGolangをインストールしてみる〜HomeBrew編〜

# インストール
簡単ですね

```
$ sudo brew install go
```

# 動作確認1
```
$ go version
go version go1.6.2 darwin/amd64
```

# 環境変数設定
```~/.bashrc
export GOPATH=$HOME/golang
```

# 動作確認2
## hello.goを作成
```go:hello.go
package main
import "fmt"

func main(){
    fmt.Printf("Hello, world\n")
}
```

## 実行
```
$ go run hello.go
Hello, world
KitematicでホストとDockerのディレクトリを共有する

【経緯】
DockerHubからオフィシャルじゃないレシピを取得し実行した時、Volumesが設定されておらず、作業環境とDockerでディレクトリが共有されていないことが不便だった。
<hr>
１）dockerのイメージからコンテナを作成する
$ docker run -v ~/tmp:/var/www/html --name sample imagename
・~/tmpはホスト側のディレクトリ名
・/var/www/htmlはdocker側のディレクトリ名
・--name オブションをつけてコンテナ名を付ける(今回のものではsample)
・最後にイメージ名

２）後はGUIでPortｓを設定
![スクリーンショット 2016-06-29 20.28.00.png](https://qiita-image-store.s3.amazonaws.com/0/63777/c831af19-f185-035b-5ab4-4ea35a1f3503.png)
画面では80ポートを32775に設定。
http://localhost:32775/
上記で接続出来ます。

感想：そのうちGUIだけで設定出来るようになるんじゃないかなぁー…なって欲しいな…
<hr>
関連記事
[Docker for mac と Kitematic でGUIから環境構築](http://qiita.com/tak74/items/3ea99eb62a20041d8fd5)
Bash | 複数行のテキストを文字列の長さでソートする

```bash
$ [TEXT] | awk '{ print length, $0 }' | sort -n -s | cut -d" " -f2-
```

と書く。

# 例

```bash
pyramid=$(cat << EOM
AA
A
AAAA
AAAAA
AAA
EOM
)

echo "$piramid" | awk '{ print length, $0 }' | sort -n -s | cut -d" " -f2-
```

# 結果

```
A
AA
AAA
AAAA
AAAAA
```

# 解説

いちど各行頭に数字をつけてからソートして、また数字を消す、ということをやっているっぽい。

# 環境

- bash 3.2


# 参考

- http://stackoverflow.com/questions/5917576/sort-a-text-file-by-line-length-including-spaces








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
[AWS] EFSがプロダクションリリースされたので作ってみた

ついにEFSがプロダクションリリースされました。（[AWS Blog](https://aws.amazon.com/jp/blogs/aws/amazon-elastic-file-system-production-ready-in-three-regions/?sc_channel=sm&sc_campaign=launch_elastic_file_system_4ad72d12&sc_publisher=tw_go&sc_content=Elastic_File_System_GA&sc_country=global&sc_geo=global&adbsc=social_launches_20160629_63297656&adbid=748004301662982145&adbpl=tw&adbpr=66780587)）
まだバージニア/オレゴン/アイルランドの3リージョンですが、勢いにまかせて作成してみました。

使用感やパフォーマンス測定は後日。

構成
===
こんな感じ

![efs.png](https://qiita-image-store.s3.amazonaws.com/0/111300/20a1a1be-c205-a23f-062f-37423ef09af6.png)

よくあるMulti-AZの構成です。

マネジメントコンソールからの作成
===

手順というほどもなく、簡単に作成できます。

![efs0004.png](https://qiita-image-store.s3.amazonaws.com/0/111300/e66485db-4803-1508-ec81-d128101ab90c.png)

"プレビュー"の文字が消えました！

![efs0002.png](https://qiita-image-store.s3.amazonaws.com/0/111300/8f1e7343-ec9c-afb8-43df-e63e350d98f5.png)

作成するVPC/Subnet/SecurityGroupを選択。エンドポイントに固定のIPも振れるようです。

![efs0003.png](https://qiita-image-store.s3.amazonaws.com/0/111300/e3bf09c0-56b3-7396-2816-158e46b99499.png)

タグをつけて、パフォーマンスモードを選択。

あとは最終確認して作成です！

完成！
====

![efs0005.png](https://qiita-image-store.s3.amazonaws.com/0/111300/cf819520-4db9-e463-038b-211227a7b8df.png)

できました。
3分くらいでマウントターゲットのStateがAbailableになりました。

マウントもしてませんので、今後、モードの違いによるパフォーマンスの差など、確認していきたいと思います。
なお、課金体系はファイルシステムに配置した容量によりますので、作成するだけならばほぼコストはかかりません。

削除
====
削除する際は、削除選択後、FileSystemIDの入力する確認がありました。
S3のバケット削除と同じように誤操作防止が効いています。
Movable Type でシステムテンプレートに検索結果がないとき

古くから運用されている Movable Type のシステムテンレプートに「検索結果」テンプレートがないとき、とても困ります。テーマとして書き出しをして、テーマの再適用をしても出てこないことがありました。そんなときのおまじまい。

https://gist.github.com/hirata/3fda63def6fdbef35d0651f37d7ddf00

こちらのコードを ```[MT_DIR]/tools``` に置いて

```perl add-search-template.pl <blog_id>```

と実行すると、空のテンプレートができあがります。デフォルトのテンプレートは ```[MT_DIR]/search_templates/default.tmpl``` にありますから参考にどうぞです。
hubを使ってCLI上でPull Request


## やりたいこと
* PRをCLIで完結したい
* 可能な限り楽にPR送りたい
* 用意しておいたテンプレートをPRのコメントとして使いたい

## usages
```sh
$ edit_pull_request
$ send_pull_request <base_branch_name>
```


## scripts
* [hub](https://github.com/github/hub)を使います

```sh
function edit_pull_request {
  template_dir="/hoge/geho/tmp/pull_request_template"
  branch_name=$(git rev-parse --abbrev-ref HEAD)
  template_base_path=$(echo "${template_dir}/base.md")
  dir=$(echo "${template_dir}/${branch_name}")
  path=$(echo "${dir}/template.md")

  mkdir -p $dir
  if [ ! -f $path ]; then
    echo "cp $template_base_path $path"
    cp $template_base_path $path
  fi

  editor $path  # use your favorite editor!
}

function send_pull_request {
  base_branch=$1
  template_dir="/hoge/geho/tmp/pull_request_template"
  branch_name=$(git rev-parse --abbrev-ref HEAD)
  template_path=$(echo "${template_dir}/${branch_name}/template.md")

  echo "git push"
  git push

  echo "hub pull-request -F $template_path -b $base_branch"
  hub pull-request -F $template_path -b $base_branch
}
```

* template(example)

```
[hotfix] title

@hoge
@geho
@fuga

## やったこと

## 見て欲しいところ

## 確認したこと

```


## 補足：hub usage

```
usage: git pull-request [-f] [-m <MESSAGE>|-F <FILE>|-i <ISSUE>|<ISSUE-URL>] [-o] [-b <BASE>] [-h <HEAD>]
```

* `-F` でテンプレートファイルを指定
* `-b` でbase branch
* `-i` でissueをリンク
UbuntuでMariaDBをうまく再インストールできなくなったときの対処方法

MariaDBを再インストールしようとして、どうしようもなくなってしまった場合の対処方法についてまとめます。

#前提
* Ubuntu
* [[MariaDB] ubuntuにMariaDBをインストールしてみた - Qiita](http://qiita.com/pb_tmz08/items/9cddfccc6615d1a089f2)に従って、一度インストールを行っている

#コマンド
無駄なコマンドも混ざっていますが、とりあえずこのように実行していくと、うまく再インストールできるようです。

```bash
sudo rm -r /etc/ld.so.conf.d/mysql /etc/mysql/my.cnf /usr/local/mysql /var/log/mysql/error.log
sudo apt purge mariadb-common mariadb-server
sudo apt autoremove
sudo apt clean
sudo apt install mariadb-common mariadb-server mariadb-client
```

#参考文献
* [[ubuntu] 11.10 MySQL install errors, doesn't work, cant uninstall either!](http://ubuntuforums.org/showthread.php?t=1892646&p=11525596#post11525596)
【WordPress】独自テーブルを作成、使用するための情報

#【WordPress】独自テーブルを作成、使用するための情報メモ

***標準のテーブルではなく、独自テーブルを作成し、INPUT,OUTPUTを行うための情報のメモ***

・以下のサイトにありがたい情報が掲載されていた。
http://www.webopixel.net/wordpress/637.html

こちらの記事でカスタムフィールドの独自テーブルを作成して、
それに対してデータ挿入、削除などができるようになる。

ありがとうございます！
PIL(Pillow)で画像処理


以前[ImageMagicで画像処理](http://qiita.com/haradahirokikiki/items/967ff930c5ba7acef56a)の記事を書きました。
今回はPythonのPILというライブラリを用いた画像処理について書きたいと思います。

今回も下の画像(800*600)を使って行きます。
![resize_img.jpg](https://qiita-image-store.s3.amazonaws.com/0/80399/06a84028-900d-f9a8-a342-a04d4f3c9116.jpeg "resize_img.jpg")


## 画像サイズ調整
```
from PIL import Image

# 既存ファイルを読み込む
img = Image.open('testimg/bb8.jpg', 'r')
# リサイズする。幅と高さを指定する。
resize_img = img.resize((800,600))
# 画像を保存。リサイズした画像を保存する。
resize_img.save('testimg/resize_img.jpg')
```

今回処理する対象としている上の画像は、(4032*3024)のものを上記でリサイズしました！

## 回転
```
rotate_img = img.rotate(45)
```
![rotate_img.jpg](https://qiita-image-store.s3.amazonaws.com/0/80399/ca1fab75-4aab-cf3d-d695-fe12be3fe058.jpeg "rotate_img.jpg")

こうなりました！
回転させてときの端の部分が黒くなってます。
ImageMagicと違いますね。

## ２つの画像を並べる
```
def canvasimage(inimg1, inimg2, outimg):
	img1 = Image.open(inimg1, 'r')
	img2 = Image.open(inimg2, 'r')

	canvas = Image.new('RGB', (800, 1200), (255, 255, 255))

	canvas.paste(img1, (0, 0))
	canvas.paste(img2, (0, 600))

	canvas.save(outimg, 'JPEG')
```
ならんだ！！！

![canvas_img.jpg](https://qiita-image-store.s3.amazonaws.com/0/80399/ed2290aa-4153-378e-ed11-92a4883592e6.jpeg "canvas_img.jpg")


## 疑問
回転したときに黒を入れないようにするにはどうするのか！調べます。
Qualys SSL Labs で A もらうまでやったこと

# 環境

+ CentOS 6.6
+ Apache/2.4.12
+ Lets encrypt で取得した証明書

# 対応
最後にまとめてあるので一番下の項目だけ見ても OK です。


## Qualys SSL labs
https://www.ssllabs.com/ssltest/

ここで SSL の暗号方式の強さの評価ができます。
情報を公開したくなければチェック入れれば OK です。

## Poodle 対策(SSLv3をOFF)
``` httpd.conf
SSLProtocol all -SSLv2 -SSLv3
```

この時点で F 評価

## Padding oracle attack対策
openssl のバージョンが古かったら

``` yum update openssl
```

この時点で C 評価

## 弱い Cipher の制御
``` httpd.conf
SSLCipherSuite ALL:!EXP!MD5!RC4!ADH!DSS:+HIGH:!eNULL:!aNULL:!AES256-SHA256:!DES-CBC-SHA:!EDH-RSA-DES-CBC-SHA
```

この時点で A- 評価

## ここで検索を駆使していいサイト見つける
http://bastian.rieck.ru/blog/posts/2014/better_ssl_apache/

結局全部これに変えました笑。

``` httpd.conf
SSLProtocol all -SSLv2 -SSLv3
SSLHonorCipherOrder On
SSLCipherSuite ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
SSLCompression Off
```

これで A になりました。
rebar3で環境毎の変数設定を適用する

※ Erlang勉強しはじめたばかりなのでベストプラクティスではないかもしれません

## モチベーション

Erlangプロジェクトで、外部リソースを参照する必要があり環境ごとにエンドポイント設定を変えたい…という場合があります。
例えば、Erlangアプリケーションから外部Redisを参照するような場合です。

```erlang
{ok, RedisHost} = application:get_env(my_application, redis_host).
```

ベタ書きでホスト情報をコード中に書いていくのではなく、上記のように、アプリケーションのコードから動的にホスト情報を取得したいです。

## rebar3で環境ごとのapplication environment variableを設定する

### rebar3のProfileについて

rebar3には[Profile](https://www.rebar3.org/docs/profiles)という機能があります。以下のようなことが簡単にできます。

* `rebar.config`に任意の設定をprofile名とひもづけて書いておくことができる
* `rebar3`コマンドに`rebar3 as <profile> <command>`のような形式でprofile名を与え、任意のprofile設定をコマンド実行時に適用することができる

rebar3では内部でrelxを利用してリリースパッケージを作成しています。また、`rebar.config`内にrelxのconfigをそのまま書くことができます。
relxのconfigには`sys_config`というものがあり（[configuration · erlware/relx Wiki](https://github.com/erlware/relx/wiki/configuration)）、ここでは`erl -config <config>`のconfig fileとして指定するファイルパスを設定することができます。
（※Erlangのconfig設定についてはこちらを参照しました [Erlang -- config](http://erlang.org/doc/man/config.html)）

この機能を利用して、以下のようにすれば環境ごとの変数設定ができそうです。

* 環境ごとにconfig fileを用意する
* 環境ごとにrebar3のProfileを用意する
* `rebar.config`内でProfile設定ごとにconfig fileを切り替えるような設定をする

### rebar.configでProfile設定を追加する例

下記のように環境毎のconfig fileを用意します。

```erlang
%% config/sys.config
[
  {my_application, [
    {redis_host, "127.0.0.1"}
  ]}
].
```

```erlang
%% config/sys.config.production

[
  {my_application, [
    {redis_host, "10.0.0.1"}
  ]}
].
```

`rebar.config`では、`production`というProfile設定を追加します。Prodile設定`production`以下にrelxのsys_config設定を追加します。

```erlang
%% rebar.config

%% ... 省略
{relx, [
  {release,
    {my_application, "0.0.1"},
    [my_application, sasl]},

  {dev_mode, true},
  {include_erts, false},
  {vm_args, "./config/vm.args"},
  {sys_config, "./config/sys.config"}, %% 開発環境用のsys.config
  {extended_start_script, true}
]}.

{profiles, [
  %% ※必要に応じてdefault profile設定を追加
  {production, [
    {relx, [
      {dev_mode, false},
      {sys_config, "./config/sys.config.production"} %% 本番環境用のsys.config
    ]}
  ]}
]}.
```

Profileで設定した項目の優先順ですが、2016/06/29現在[ドキュメントでは下記のように説明されています](https://www.rebar3.org/docs/profiles)。

1. Profile設定の`default`
2. `REBAR_PROFILE`環境変数
3. `as`で指定されたProfile
4. rebar3コマンド設定で指定されたProfile設定

上記のrebar.configでは、標準のrelxの設定を書いたうえでproduction環境用のProfile設定を書いています。
production環境用のリリースパッケージを作る場合は`rebar3 as production release`コマンドを使えば、rebar3がrelxのsys_config設定として`./config/sys.config.production`を参照してくれます。
今回の例だと、`rebar3 as production release`してできたリリースパッケージ中のコードで`{ok, RedisHost} = application:get_env(my_application, redis_host)`すると、`Redishost`は`10.0.0.1`となります。

## rebar3を使ってリリースパッケージを作成

前述したように、production環境用のリリースパッケージは`rebar3 as production release`で作成することができます。
今回の例ではProfileを`production`しか用意していませんが、rebar.configに`development`, `test`などのProfile設定を追加しておくと環境ごとに細かく設定を切り替えることができるので便利そうです。
Hydrogenで`No kernel for language python found`が出る時の対処法

Atomのプラグインの1つに、iPython(Jupyter)を走らせられるHydrogenというものがあります。 
ただ、私の手元にあるUbuntuのマシンに入れてみたところ、何度やってもNo kernel for language python foundと表示されます。 
![Screenshot from 2016-06-29 18:57:57.png](https://qiita-image-store.s3.amazonaws.com/0/76668/fcf320c4-e481-100a-e034-7d0cf2905008.png)
そこで今回は、その対処法について紹介します。 
端末(Terminal)で以下の通りに入力し、出てきたものをコピーします。
`$ jupyter kernelspec list --json`
Preferences -> Packages -> Hydrogen -> Kernel Specsにペーストします。 

![Screenshot from 2016-06-29 19:04:24.png](https://qiita-image-store.s3.amazonaws.com/0/76668/348258e7-83d8-4ab0-6769-e2a0195433b7.png)

これで上部のDisable -> Enable と切り替えて完了です。

![Screenshot from 2016-06-29 19:06:29.png](https://qiita-image-store.s3.amazonaws.com/0/76668/791aa3bb-a4e3-e750-94c5-b9bcef578513.png)
↓
![Screenshot from 2016-06-29 19:06:39.png](https://qiita-image-store.s3.amazonaws.com/0/76668/b97eecee-7975-2558-5b55-143ce35f22a8.png)

これで動くと思います。
Enjoy!
wp-cron.php の 499 エラーの対処法

#環境と概要
 - CentOS 6.7
 - nginx 1.10.1
 - php 7
 - WordPress

アクセスログに次のようなエラーが大量に記録される。

```:access.log
192.0.2.1 - - [01/Jun/2016:05:27:38 +0900] "POST /wp-cron.php?doing_wp_cron=1464726557.8682820996966554734375 HTTP/1.0" 499 0 "-" "WordPress/4.5.2; http://example.jp" "-"
192.0.2.1 - - [01/Jun/2016:05:31:21 +0900] "POST /wp-cron.php?doing_wp_cron=1714472866.7813869780316166109375 HTTP/1.0" 499 0 "-" "WordPress/4.5.2; http://example.jp" "-"
192.0.2.1 - - [01/Jun/2016:06:35:13 +0900] "POST /wp-cron.php?doing_wp_cron=1964520202.6834461245782472703125 HTTP/1.0" 499 0 "-" "WordPress/4.5.2; http://example.jp" "-"
```

#対処法
phpの処理がタイムアウトすると発生するらしい。

よって、タイムアウト時間を長くすると良い。

値の600（秒）は各自の環境に合わせて調節すること。
###php-fpm編

php-fpmの設定ファイルを開く

`vi /etc/php.ini`

次の値を更新

```:php.ini
max_execution_time = 600
```

###nginx編

nginxの設定ファイルを開く

`vi /etc/nginx/nginx.conf`

次の値を更新

```:nginx.conf
fastcgi_read_timeout    600;
fastcgi_send_timeout    600;
```

変更の適用
`/etc/init.d/nginx restart`
`/etc/init.d/php-fpm restart`

#参考リンク
[Increase PHP script execution time with Nginx](https://easyengine.io/tutorials/php/increase-script-execution-time/)
[nginx でupstream timed outエラーが発生した時の対処&nbsp;|&nbsp;レンタルサーバー・自宅サーバー設定・構築のヒント](http://server-setting.info/centos/nginx-upstream-timed-out.html)
MacのDockerでphpの割当メモリを増やす

## 環境
- Mac osx v10.9.5
- Docker v1.10.1
- docker-machine v0.6.0

## 動機
Dockerのphpコンテナ上で、そこそこの大きさのExcelファイルをphpスクリプト内でロードした際に、システムらしき何かに突如killされてしまった。どうもコンテナの割り当てられているメモリが枯渇したのが原因っぽかったのでメモリを増やしたい。

```bash
root@xxxx:/var/www/html# php ./read_m_tokui.php -f data/tokui.xlsx
Killed
```

## Docker-Machineの割当メモリを増やす

VirtualBoxマネージャーを開いて設定をクリック。
![スクリーンショット 2016-06-29 18.33.52.png](https://qiita-image-store.s3.amazonaws.com/0/81353/cfe78923-9676-8441-fafd-7c2d670a7698.png)

システムタブをクリックしてメインメモリを増やす。
![スクリーンショット 2016-06-29 18.36.11.png](https://qiita-image-store.s3.amazonaws.com/0/81353/0e4a3d4b-95ef-da5e-390b-c5d22965ab03.png)

## Docker-Machineとコンテナを起動

「-m <使用メモリ>」オプションを指定してコンテナを再度作り直す。

```bash
$ docker-machine start inspect
$ eval $(docker-machine env inspect)
$ docker start mroonga # DBとしてMroongaを使っているので最初に起動
$ # 一旦phpコンテナを削除して…
$ docker rm -f php
$ # phpコンテナの使用メモリを指定して起動
$ docker run -m 1024m -p 80:80 -p 443:443 -v $HOME/work/proj/inspect/php.ini:/etc/php5/apache2/php.ini -v $HOME/work/proj/inspect/php:/var/www/html --link mroonga:mroonga --name php -d eboraas/apache-php
```

## メモリの割当が増えていることを確認

```bash
$ docker exec -ti php bash
root@xxxx:/# free -h
             total       used       free     shared    buffers     cached
Mem:          2.0G       840M       1.1G       169M        12M       222M
-/+ buffers/cache:       605M       1.4G
Swap:         1.4G         0B       1.4G
```

## まとめ

基本的に参考にさせていただいたサイトとやっていることは同じです。突如phpが落ちるシチュエーションに遭遇した際の参考になれば…。

## 参考

http://qiita.com/niisan-tokyo/items/2d7d21aeb4e25f7a7bbe