OmniAICreator/Qiita-1.07M huggingface dataset:
datetime型のrspec書くときにミリ秒単位で値がずれてfailすることがある問題について

## 前提
Rails 4.2系
MySQL 5.6.4以降

## 問題
同じ値を比較しているはずなのに、こんなことがおきる..!!

```
    expected: "2016-11-22T05:30:12.291Z"
         got: "2016-11-22T05:30:12.000Z"
```

ミリ秒..

## 結論（僕の場合は）
MySQLのdatetime系のカラムのミリ秒を設定しないまま、
createで作りたてのActiveRecordのインスタンスのdatetime型のattributeと
データベースからロードしてきたActiveRecordのインスタンスのdatetime型のattributeを比較しているのがfailしている原因。

## Mysqlでのミリ秒の扱いについて
Mysql5.6.4以降ではdatetime系のカラムでミリ秒もサポートしている。
ただ、普通にmigrationを書くと、defaultではミリ秒は扱わないようになっていて、クエリにミリ秒が含まれていると、秒単位まで四捨五入して保存する。

なので、コードと一緒にかくと以下のようなことがおきる。

```ruby
now = Time.zone.now # with ミリ秒
hoge = Hoge.new(fuga_datetime:  now) # fuga_datetimeはwith ミリ秒
hoge.save # ミリ秒は切り捨てて保存される
hoge.fuga_datetime # インスタンスにはnowがほじされているので with ミリ秒
Hoge.last.fuga_datetime # => DBからのloadなので、without ミリ秒。 式で書くとここでは、hoge.fuga_datetime != UserFood.last.fuga_datetime 
```

こんな感じ。

なんで、たとえば以下のようなget api の specはfailする。
get apiは（当然）データベースから読み込んだインスタンスを使ってレスポンスを返しているのに、
specで比較するときのインスタンスはレコード作成時のインスタンスを使っているため。

```ruby
let(:hoge) do
  create(:hoge, fuga_datetime: Time.zone.now) # hoge.fuga_datetimeはミリ秒をもってしまう
end

subject do
  get "some/endpoint/hoges/#{hoge.id}"
end

it do
  subject
  body_hash = JSON.parse(response.body)
  expect(body_hash['hoge']['fuga_datetime']).to eq hoge.fuga_datetime.iso8601(3) # because fuga_datetime has milli-seconds
end
```

上記の場合は、単にhogeをreloadすれば成功します

```ruby
it do
  subject
  hoge.reload # fuga_datetimeをデータベースの値(without ミリ秒)へ
  ...
end
```

to_iして比較しろ的なstack over flowがいくつかでてくるんですが、
ミリ秒はmysqlは四捨五入、to_iは切り捨てなのでミリ秒が0.5秒以上になるとfailするのでやっぱりだめ。

```ruby
it do
  subject
  body_hash = JSON.parse(response.body)
  expect(body_hash['hoge']['fuga_datetime'].to_time.to_i).to eq hoge.to_i # たまに1ずれる
end
```

やっぱりreloadするのが良さそう。

## まとめ
作りたてのインスタンスのdate time型のattributeをspecでかくときはreloadした上で使いましょう

## 参考
### MySQLのミリ秒の扱いについて
https://doruby.jp/users/ap_tg/entries/MySQL_DATETIME_
https://dev.mysql.com/doc/refman/5.6/ja/fractional-seconds.html

### Railsでのミリ秒の扱いについて（ちょっと古いけどさくっとまとまってる）
http://qiita.com/joker1007/items/d4043eced880cbbce21c
MacでChefを使用するための環境を構築する方法


## 前提

- rubyが導入済みであること。
    - [Macで複数バージョンのRubyを使用するための環境を構築する方法](http://qiita.com/LowSE01/items/59fbf2ec7c1cd818b22d)とかを参照。

## Chefのインストール

- 下記コマンドを実行

    ```bash:console
    gem install chef
    ```

## knifeコマンドのインストール

- 下記コマンドを実行

    ```bash:console
    gem install knife
    ```
boto3からaws-sdk-goにしただけでCPU使用率が75%->10%になった

## 概要
* 社内の ZABBIX server の CPU 使用率が高くなってきたので、最小工数で解決したい
* CloudWatch からメトリクスを取得するスクリプトが python(boto3) で書かれてる
* とりあえずこのスクリプトを go(aws-sdk-go) に書き換える

**CPU 使用率が 75% から 10% に下がった。**
![chart3.png](https://qiita-image-store.s3.amazonaws.com/0/46714/87a3b6a4-4d99-c02e-692a-28047654428c.png "chart3.png")

## 結論
**簡単なスクリプトがボトルネックになってそうなら、go で書き換えれば良いと思いました。**

## 以下詳細　
### 弊社のメトリクスの取得方法

1. プロジェクト毎に ZABBIX proxy を立て、proxy 経由で ZABBIX server が各メトリクスを取得・保存
![zabbix構成図改.png](https://qiita-image-store.s3.amazonaws.com/0/46714/1e332a8b-5b9d-f967-b417-1d24c95b0c22.png "zabbix構成図改.png")

2. **1 で取得できないものは、ZABBIX server が全プロジェクト分 CloudWatch api で取得**

### CloudWatch でのメトリクス取得について
* 1回の api で取得しているのは、1インスタンスの 1メトリック
* api は基本的に 300秒に 1回、CPU 使用率のような細くほしいものは 60秒に 1回
* RDS であれば、1インスタンスあたり10個ほどのメトリクスを取得している
* **Python boto3 で書かれていた**

### go で書き換えるに当たって
* 最小工数でいくために ZABBIX の設定を変えなくても済むよう、引数と出力を python スクリプトと同じにする
* 最低限の開発環境は整える(外部パッケージのバージョン管理とか)

#### 以下 go に関すること
| |version|
|---|---|
|go|1.6.2|
|aws-sdk-go|1.4.15|

* ディレクトリ構成は以下のような構成で

```
├── Gomfile
├── Makefile
├── README.md
├── aws.go
├── bin
│   └── cloudwatch_metrics
├── main.go
└── vendor
    ├── bin
    ├── github.com
    └── pkg
```

* パッケージ管理はシンプルなもので良かったので、https://github.com/mattn/gom を使用
* 1 回のコマンド実行で 1 度しか api が実行されないので、service の使い回しとかも考えない
* 関数は全部で 4 つ
	* init
	* main
	* createCloudWatchService
	* getMetrics
* config ファイルを指定する必要があったが、1.4.15 では環境変数 "AWS_CONFIG_FILE" にファイルパスを設定しなくてはならず、サーバー側の変更を最小限にしたかったので、コマンド内で環境変数を設定することにした

```
// サーバー側の変更を最小限にしたかったので、コマンド内で環境変数を設定
if err := os.Setenv("AWS_CONFIG_FILE", credentialFilePath); err != nil {
	return nil, fmt.Errorf("AWS_CONFIG_FILE could not be set, %s", err)
}

// credential ファイルパスはここで設定できる
creds := credentials.NewSharedCredentials(credentialFilePath, *profile)
conf := aws.NewConfig().WithCredentials(creds)

s, err := session.NewSessionWithOptions(
	session.Options{
		Config:            *conf,
		Profile:           *profile,
		SharedConfigState: session.SharedConfigEnable,
	},
)
```

* 後は公式ドキュメント・サンプル通り、CloudWatch service インスタンス作って、Input インスタンス作って、GetMetricStatistics するだけ

以上
Qiitaの「いいね」追加でUIの難しさを感じた

# はじめに
1週間前の11月15日、Qiitaに「いいね」機能が追加されたことは、この記事を見ている方はご存知かと思います（知らなかった人は[こちら](http://blog.qiita.com/post/153200849029/qiita-like-button)）。
正直言って最初この変更を知ったときはかなり驚き、不満も生まれました。
どこかにその不満をぶつけようかと思ったのですが、一旦他の方の反応を見てみようと思い、この1週間はTwitterやQiita、ブログなどを見ているだけにしました（と言いつつTwitterでは愚痴ってた）。
そしてそろそろ感じたことをまとめてみようかと思います。

## 私が感じた不満

### 1. ストックからいいねに変わったのかと思った
私はQiita自体の情報は積極的に集めているわけではないので、ある日Qiitaの記事を開いたときにストックボタンがいいねボタンに変わっていることに気づきました。
調べてみてストック自体は別に残っていることを知りました。

### 2. ストックの位置がわかりづらい（目立たない）
これは私の目が節穴なだけかもしれませんが、前のストックボタンの印象が強すぎて、新ストックボタンの位置がわからず、一度ググりました。

### 3. 記事を読まずにいいねを押せてしまう
「いいね」は「この記事良かった！」と評価するためのシステムであると認識していますが、記事を読まずにいいねボタンを押せてしまうことに違和感を覚えます。
スマホ版のデザインだと、タイトルのすぐあとにいいねボタンがあるので違和感はさらに大きいです。

### 4. ストックのつもりでいいねを押すユーザーの存在
Twitterで「Qiita　いいね」などで検索すると「Qiitaのストックがいいねに変わった」と認識している方がある程度いらっしゃいます。
つまり、「ストックを押したつもりでいいねを押す」ユーザーが出かねないということです。

### 5. Contributionの値の信用性が低くなる
3と4によって、適切にいいねが押されない可能性が生まれ、Contributionの値が信用できなくなる。
（もっともこの記事の著者のContributionは0なのですが、他の人のContributionを見るときの話です）

## 改善案
以上の不満を解決するとして、私ならどうするかを考えてみました。

### 1. ストックボタンを元の位置に戻す
これだけで私の不満の1, 2, 3, 4, 5全て解決できます、最高
じゃあいいねボタンはどこへ？

### 2. いいねボタンは記事の最後のみにする
そもそも記事を最後まで読まないでいいねを押すのが間違いだと思います。

## 良いと思った点
もちろん今回のQiitaの更新全てに不満があるわけではありません。
今回の更新とそれを通じた周囲の意見の観察を通して得られた（プラスになった）と感じたことを書きます。

### 1. いいねシステムの実装
「ストックするほどじゃないけど、応援したい！」と思った時など、今まではどうしようもなかったのですがいいねシステムの実装により、そのモヤモヤが解消されます。いいねシステムの実装自体にいいねを贈りたいです。

### 2. ストックの利用方法
私はストックをブックマークのように使用していて、たまに「あの記事ストックしてたよな～」と検索することもあったのですが、いいねの意味でストックする人がいたことなどを知り、アハ体験のようなものを感じました。

## UIの難しさを感じた
Twitterなどを見ると、同じように「押し間違えた」「ストックからいいねに変わってる」という意見が見られます。
当然Qiita開発チームの中でも「既存ユーザが混乱するのでは？」という議論が交わされたに違いありません。

それでもいいねボタンをあの場所に追加したのは、それ以上のメリットがあると判断されたからだと思うのですが、ユーザ目線ではそれほど大きなメリットがあるようには感じません。
もしかすると私とは違うタイプのユーザ（高頻度でQiitaを訪れたくさんの記事を投稿するユーザ、1週間に1回程度の低頻度ユーザ）からすると違う意見なのかもしれませんが。

開発チームでの議論とユーザ目線の違いというものを意識していくことを、UIを考える際に参考にしていきたいです。

以上、読んでいただきありがとうございました。
【Unity拡張】アセットをブックマーク管理するウィンドウを作ってみたら便利だった

#はじめに
プロジェクト内のファイルが増えてくると、目的のファイルまでたどり着くのがなかなか大変です。
Projectビューにはお気に入り機能がついていますが、アセットは登録することができません。
<img width = 200 src = "https://qiita-image-store.s3.amazonaws.com/0/44288/4d3d5353-1e85-8f2f-1f2f-36265f1fa555.png">

そこで、アセットをブックマークして簡単に参照できるようにするウィンドウを作ってみました。

Unity-AssetBookmarker
https://github.com/rngtm/Unity-AssetBookmarker

<img width = 400 src = "https://qiita-image-store.s3.amazonaws.com/0/44288/a9535b1b-c823-dfbf-8a58-8e80c89275d3.png">



#実際に使ってみて
よかったところ
・アセットがどこにあったかいちいち探す手間がかからないので便利 (重要)

わるかったところ
・ブックマークを見るためにウィンドウを表示させるのが若干めんどくさい
・ブックマークの登録を解除するのがちょっとめんどくさい (アセットをクリック->マイナスボタンをクリックのふた手間が必要)
Twitterに投稿できるmp4をffmpegでトリミングして作る

`ffmpeg`で動画をトリミングしてTwitterにあげようとしたら画質の問題で失敗したので書いておきます。

### mp4の画質制限

Twitterに投稿できる画質の上限は`high-L4.2`らしいんですが、以下の`ffmpeg`ではデフォルトで`4.3`らしくそのままトリミングを行うとTwitterに投稿できません。

```.sh
$ ffmpeg -v
ffmpeg version N-75517-gf559812 Copyright (c) 2000-2015 the FFmpeg developers
  built with gcc 4.9.3 (GCC)
```

### 画質を指定してエンコード

画質を上げるなら`high-L4.2`を使うのが正解なんでしょうが、めんどくさいので`baseline`でエンコードします。

```.sh
$ ffmpeg.exe -i input.mp4 -profile:v baseline -ss 10:10 -t 20 out.mp4
```

これで元動画の10分10秒から10分20秒までの間がトリミングされて出力されます。
JIRAで課題タイプを追加する

課題タイプの作成
--------------
画面右上の歯車メニューからIssuesを選択する。
<img width="381" alt="Screen Shot 2016-11-22 at 11.56.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/138322/c2a7d8de-b4d1-f241-9c07-53628227c5cf.png">

「Add issue type」ボタンをクリックして、Issueを作成。
<img width="381" alt="Screen Shot 2016-11-22 at 11.58.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/138322/28887192-34db-4b09-8af4-5bdb290ee711.png">

課題タイプをプロジェクトに追加
------------------------
Issue type schemesを開く
<img width="484" alt="Screen Shot 2016-11-22 at 11.59.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/138322/9a5d4b20-78fb-97c2-75fa-a5670c4f646b.png">

課題タイプを追加したいプロジェクトのスキームのEditをクリック
<img width="1178" alt="Screen_Shot_2016-11-22_at_12_57_39.png" src="https://qiita-image-store.s3.amazonaws.com/0/138322/f6b1dad4-c802-a73c-339d-ce06fd8aa1c0.png">

作成したIssue typeが右に表示されるので、ドラッグして左のリストに追加する。
<img width="730" alt="Screen Shot 2016-11-22 at 12.57.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/138322/8b2865ce-e6cf-88b4-e654-a648791c959f.png">

で、Saveして完了。
Google Custom Search APIを使って画像収集

これから、真面目にDeep Learningの勉強を始めたいと思います。
その前に、学習に必要の大量なデータがどこから入手でするかを考えないといけないです。

思付いた方法の一つはTwitter画像botから画像を収集します。
もう一つはGoogle、Bingなどの画像検索エンジンを利用します。
良いbotを見つけるには時間かかりそうなので、まず検索APIを使ってみます。
Bing検索APIは今年年末に終了するようですから、今回はGoogleを選択します。

###検索エンジンの設定
[カスタム検索](https://cse.google.co.jp/cse/all)で新し検索エンジンを作成。
設定は以下になります。

![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/144971/46896b03-72c6-0518-c0d5-b56399443044.jpeg)
①画像検索をオンにして
②「ウェブ全体を検索する」を選択
③検索サイトを削除
④検索エンジンIDからIDを獲得
　IDは「数字列：英字列」の型になっています。
　数字列はユーザID、英字列はエンジンIDらしいです。

###Custom Search APIを獲得
[Google Cloud Platform Console](https://console.cloud.google.com/apis)でCustom Search APIを有効にして、認証情報でAPIキーを作成します。
![222.JPG](https://qiita-image-store.s3.amazonaws.com/0/144971/73b6d1c5-72d6-72ea-902f-c05dc503af56.jpeg)

###Python Scriptの作成

```
https://www.googleapis.com/customsearch/v1?key=[API_KEY]&cx=[CUSTOM_SEARCH_ENGINE]&q=[search_item]
```
で検索できます。
画像を検索するため、`searchType=image`を追加して、
`num=xx&start=yy`は大量画像を取得するためのページネーションです。
[リファレンス](https://developers.google.com/custom-search/json-api/v1/reference/cse/list?hl=ja)によると、numは1~10の整数になります。
つまり、一回で最大10個を検索できます。

スクリプトは[tukiyo3さんのコード](http://qiita.com/tukiyo3/items/96724a3ae7c90d3ae387)を参考しました。

```get_image.py
#-*- coding:utf-8 -*-
#onlyzs1023@gmail.com 2016/11/21
import urllib.request
from urllib.parse import quote
import httplib2
import json 
import os

API_KEY = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
CUSTOM_SEARCH_ENGINE = "12345648954985648968:xxxxxxxxx"

def getImageUrl(search_item, total_num):
 img_list = []
 i = 0
 while i < total_num:
  query_img = "https://www.googleapis.com/customsearch/v1?key=" + API_KEY + "&cx=" + CUSTOM_SEARCH_ENGINE + "&num=" + str(10 if(total_num-i)>10 else (total_num-i)) + "&start=" + str(i+1) + "&q=" + quote(search_item) + "&searchType=image"
  print (query_img)
  res = urllib.request.urlopen(query_img)
  data = json.loads(res.read().decode('utf-8'))
  for j in range(len(data["items"])):
   img_list.append(data["items"][j]["link"])
  i=i+10
 return img_list
 
def getImage(search_item, img_list):
 opener = urllib.request.build_opener()
 http = httplib2.Http(".cache")
 for i in range(len(img_list)):
  try:
   fn, ext = os.path.splitext(img_list[i])
   print(img_list[i])
   response, content = http.request(img_list[i])
   with open(search_item+str(i)+ext, 'wb') as f:
    f.write(content)
  except:
   print("failed to download images.")
   continue

if __name__ == "__main__":
 img_list = getImageUrl("犬", 5)
 print(img_list)
 getImage("dog", img_list)
```

コードはそんなにきれいじゃないですけど、共有します。
[Github](https://github.com/onlyzs89/study/blob/master/get_image.py)にも入れました。

###おわり
Google Custom Search APIは便利だけど、無料使用枠は100リクエスト/日で、スクリプトのテストだけで7割りを使いました。
実際に使うと、お金を払わないといけませんね。
やっぱり、無料で画像を収集したいので、ほかの方法（Twitterとか）で少し工夫してみます。

2016/11/24 更新
いい画像収集の方法を見つかりました！↓
http://d.hatena.ne.jp/shi3z/20160309/1457480722
上記リンク中のpythonスクリプトをpython3対応に修正しました。　→　[GitHub](https://github.com/onlyzs89/study/blob/master/collectImagenet.py)
TensorFlow エラーメモ

最近 TensorFlow を触りだしたので、遭遇したエラーとその対応をメモしていきます。
随時書き足していきます。

# placeholder / Variable の次元を間違えた
```
ValueError: Dimensions must be equal, but are 780 and 784
```

### 原因
placeholder, Variable の次元数が間違っています。（整合性が保てていません）

ニューラルネットワークで言えば、 placeholder はニューロンで、 Variable は重みやバイアスなどの変数です。

![image](https://qiita-image-store.s3.amazonaws.com/0/61079/65e7e116-ffd5-bc6f-7c63-185dc6cb1c77.png)

上のようなネットワークがあったとき、 placeholder = ニューロンの数をまず決めると思います。
その後それに合わせて、前後のニューロン間の Variable = 重みを決めると思いますが、重みの次元が前後のニューロンの次元とマッチしていない場合などに起こります。

（この図では簡単のためバイアスの Variable は省略しています）

イメージとしては上記のような感じですが、厳密にはどのような行列演算がなされるかを考えてみればわかると思います。

# 属性が無い
```
AttributeError: module 'tensorflow.models.rnn.ptb.reader' has no attribute 'ptb_producer'
```

### 原因
pip install した TensorFlow のバージョンと、 git clone してきた TensorFlow のバージョンがちがうかもしれません。
例えば pip install で v0.11 をインストールし、 v0.12 以降のソースコードを git clone してきてその中のサンプルで実行をしている場合に起きたりします。

### 対応
参照しているソースコード側を適切なバージョンのブランチに切り替えましょう。

python を実行して pip install した tensorflow のバージョンを調べます。

```
>>> import tensorflow
>>> tensorflow.__version__
'0.11.0'
```

pip install したバージョンを check out します。

```
git checkout -b r0.11 origin/r0.11
```

### 参考
[Can't import reader.py correctly for rnn/ptb/](https://github.com/tensorflow/tensorflow/issues/4697)

# tensorflow 直下で import tensorflow しない
```
ImportError: cannot import name 'pywrap_tensorflow'
```

### 原因
clone してきた tensorflow 直下で python から import tensorflow しようとするとこのエラーが出るようです。
PyCharm とかで実行するとこうなってしまう？

### 対応
別のディレクトリで実行しましょう。

### 参考
[ImportError: cannot import name pywrap_tensorflow](https://github.com/tensorflow/tensorflow/issues/3217)
UI > 行政サービス > 住民票の写しの印刷

コンビニで住民票の写しの印刷ができそうだと知ったので試した。
印刷できなかった。

使用したのは「住民基本台帳」カード。

「住民基本台帳」カードには2種類あり、対応しているものとしていないものがあるようだ。

http://www.city.hamada.shimane.jp/www/contents/1411689510668/index_k.html

さらに、市町村によって、以下のように対応が異なるようだ

- 住民基本台帳カード (自マーク付き)で印刷可能
- 住民基本台帳カードでは印刷不可能
   - マイナンバーカードを使う

僕の住んでいる場所では「住民基本台帳カードでは印刷不可能」の方だった。

マイナンバーカードの普及率は2016年10月現在5%程度。

こういうカードの読取機能の実装費用は市町村が各コンビニに支払うのだろうか? 

### 関連資料
[コンビニエンスストア等における証明書等の自動交付（コンビニ交付）導入検討の手引き](https://www.j-lis.go.jp/data/open/cnt/3/141/1/convini_tebiki_201604.pdf)

p21 
> 6 契約について
> ...
> このため、地方公共団体と証明書交付サービス運営主体である当機構が「証明書等自動交付事務の運営管理に係る協定書」及び「証明書等自動交付事務委託契約書」を締結し、当機構とコンビニ事業者等が委託契約を締結することにより、契約本数を削減させ、事務処理の負担の軽減を図ります。
GAE/Go でテンプレートファイルをソースに埋め込んで扱う & テンプレートファイル更新時に自動で更新する

# はじめに

* [前回](http://qiita.com/nirasan/items/0d2230d49d4213e6b6e9) の続きで管理画面のテンプレートを文字列からテンプレートファイルに変更する
* テンプレートファイルは [go-bindata](https://github.com/jteeuwen/go-bindata) を使って Go のソースコードに埋め込んで扱う
* また [godo](https://github.com/go-godo/godo) を使ってテンプレートファイルの更新時に go-bindata を実行してソースコードも更新する

# レポジトリ

* https://github.com/nirasan/gae-admin

# go-bindata でテンプレートファイルをコードに埋め込む

* go-bindata をインストールして実行するだけ

## インストール

```
go get -u github.com/jteeuwen/go-bindata/...
```

## 実行

```
go-bindata -o bindata/bindata.go -pkg "bindata" -prefix "templates/" templates/...
```

* `-o` が出力先
* `-pkg` で出力するコードのパッケージを指定する
  * デフォルトだと `main` になってインポートして扱いづらいので任意で指定する
* `-prefix` でファイルを呼び出すときに省略する文字列を指定
  * 例のように指定すると `templates/index.html` を `index.html` だけで呼び出せる
* 最後の引数の `templates/...` が埋め込み対象のファイル
  * 例のようにすると `templates` 以下のファイルが全て対象になる


# go-bindata で埋め込んだファイルを扱う

```go
// 生成したコードをインポートし、ファイル名を指定すると []byte が取得できる
bytes, err := bindata.Assets("index.html")
```

# godo でコードの自動生成を行う

## インストール

```
go get -u gopkg.in/godo.v2/cmd/godo
```

## 設定ファイルの作成

* 設定は Go のコードで行う
* ファイル名は `Gododir/main.go` とかで固定

```go:Gododir/main.go
package main

import (
	do "gopkg.in/godo.v2"
)

func tasks(p *do.Project) {
	do.Env = `GOPATH=.vendor::$GOPATH`

	p.Task("bindata", nil, func(c *do.Context) {
		c.Run(`go-bindata -o bindata/bindata.go -pkg "bindata" -prefix "templates/" templates/...`)
	}).Src("templates/**/*")
}

func main() {
	do.Godo(tasks)
}
```

## ファイルの変更監視と自動更新を行う

* Gododir の上のディレクトリで実行

```
godo bindata --watch
```
Github上で消したブランチが見える場合

いつものごとくローカル領域の要らなくなったブランチを削除していました。

```bash
git branch
* origin/master
* origin/feature/aaa
* origin/feature/bbb
* origin/feature/ccc
```

```bash
git branch -D origin/feature/aaa
 Deleted branch feature/aaa (was fd31416).
```
よし。
問題はここからで、

```bash
git branch -r
  origin/HEAD -> origin/master
  origin/feature/aaa
  origin/feature/bbb
  origin/feature/ccc
  origin/master
```

消えていない！！
ローカルにある、リモート領域は-Dコマンドでは消えないみたい。

そんな場合、

```bash
git fetch --prune
 x [deleted]         (none)     -> origin/feature/aaa
 x [deleted]         (none)     -> origin/feature/bbb
 x [deleted]         (none)     -> origin/feature/ccc
```

消えました(ﾟ∀ﾟ)

### 逆パターンで、ローカルのブランチをリモートと合わせたい場合

良いアイデアが無かったです。とりあえず、masterとdevelop以外のローカルブランチを一括削除するワンライナーです。リモートと合わせるとした場合、自分で作っていたローカルブランチも消されてしまうので、そういうコマンドは存在しないのかもですね。。

```
git branch | grep -v master | grep -v develop | xargs git branch -D
```

### まとめ

fetchする場合に更新する、ローカルのリモート領域をリモートサーバと、どうやって合わせるのかなぁと調べた結果でした。ちなみに適当にコマンド打ってたらヘルプが表示されたので、そちらに書いてありました。ググるよりヘルプのほうが速いですね。。。

あ、cloneし直せばいいじゃんとか言うのは、野暮ですよ。
PostgreSQL で pagination とかやるときは order をちゃんと指定おいた方がよいよ。

## 神隠しに遭います。


たとえば、説明会の一覧ページをページネーション付でつくったとします。
簡略化のため、説明会は、

- id
- date （開催日）
- time （開始時刻）

のデータを持っているとします。


例えば、seminars テーブルの 開催日が 11月2日は以下の2つのレコードを持っています。

| seminar_id | date | time |
|:-:|:-:|:-:|
| 5  |  2016-11-2 |  8:00  |
| 6  |  2016-11-2 |  9:00 |




そして、以下のページネーションのように、**order に date だけを指定しまった場合（timeは指定しなかった場合）** 神隠しに遭うことができます。




## 1ページ目

```sql:発行されるSQL
select * from seminars order by date asc limit 5 offset 0
```

| seminar_id | date | time |
|:-:|:-:|:-:|
| 1  |  2016-11-1 |  6:00  |
| 2  |  2016-11-1 |  7:00 |
| 3  |  2016-11-1 |  9:00 |
| 4  |  2016-11-1 |  8:00 |
| 6  |  2016-11-2 |  9:00 |


そうすると2ページ目がこんな感じなったりします。


## 2ページ目

```sql:発行されるSQL
select * from seminars order by date asc limit 5 offset 5
```

| seminar_id | date | time |
|:-:|:-:|:-:|
| 6  |  2016-11-2 |  9:00  |
| 7  |  2016-11-3 |  6:00 |
| 8  |  2016-11-3 |  7:00 |
| 9  |  2016-11-3 |  8:00 |
| 10  |  2016-11-3 |  9:00 |

**「seminar_id = 5 はどこへ行った？？」** となります。

## order を指定しないと順序が保証されない

https://www.postgresql.org/docs/9.6/static/queries-order.html

この辺が参考になると思いますが。

一意に決まる order を設定しないと、上のようなことが起こりえます。

```sql:修正したSQL
select * from seminars order by date asc, time asc limit 5 offset 5
```


勉強になりました。
Qiita > 編集リクエストが機能してない? > リクエスト適用時にリクエストの内容が反映されてない下書きになっている

Qiitaの記事に編集リクエストをいただいたので編集リクエストを適用しようとしました。

以下の状況になりました。

- 編集リクエスト一覧を表示した
- リクエストの内容を確認した
- 「編集リクエストを採用」をクリック
- 編集リクエストの内容が「適用されていない」下書きが表示

このため、編集リクエスト適用は編集リクエストの内容を確認しながら、記事を同じように修正することで対応しました。

こちらの環境だけの問題かは切り分けできていません。

```txt:動作環境
Windows 8.1 pro 64bit
Chrome バージョン 54.0.2840.99 m
```
CentOS7でズレた時刻を調整する


使っている環境の時刻がズレている事ってよくありますよね？
そんなズレを正しく調整する時のメモです。

```bash:cli
# 確認(タイムゾーンと時刻が正しくない)
$ timedatectl
      Local time: 火 2016-11-22 03:22:54 CET
  Universal time: 火 2016-11-22 02:22:54 UTC
        Timezone: Europe/Berlin (CET, +0100)
     NTP enabled: yes
NTP synchronized: no
 RTC in local TZ: no
      DST active: no
 Last DST change: DST ended at
                  日 2016-10-30 02:59:59 CEST
                  日 2016-10-30 02:00:00 CET
 Next DST change: DST begins (the clock jumps one hour forward) at
                  日 2017-03-26 01:59:59 CET
                  日 2017-03-26 03:00:00 CEST

#タイムゾーンの設定
$ sudo timedatectl set-timezone Asia/Tokyo

# 時刻を調整
$ sudo ntpdate ntp.nict.jp

# 確認(正しく現在時刻が設定されました)
$ timedatectl
      Local time: 火 2016-11-22 11:45:33 JST
  Universal time: 火 2016-11-22 02:45:33 UTC
        Timezone: Asia/Tokyo (JST, +0900)
     NTP enabled: yes
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a
```

20分以上ズレてた。。。:astonished: 

# 参考
- http://www.linuxmaster.jp/linux_skill/2016/01/centos7-4.html
- http://qiita.com/dumpty-alma@github/items/0e43c1b585f1fb90ec8e
AppleTVのSSL通信をCharlesでモニタする


# 前提
アプリ側がSSL証明書Pinningを実装しているなど、CharlesのSSLルート証明書を使ったSSL通信が許可されていない場合、この記事の方法ではモニタできません。

# CharlesのSSLルート証明書のプロファイルを作成
## Charlesのルート証明書を書き出します。
### まずはKeyChainに登録
![charles-ssl.png](https://qiita-image-store.s3.amazonaws.com/0/35008/770cea7a-f1ef-d350-13f8-be93881c9dac.png "charles-ssl.png")


### KeyChain上で❌マークになっていたら、右クリック=>Get InfoからAlways Trustにして信頼された状態にしましょう。
![charles-cert-trusted.png](https://qiita-image-store.s3.amazonaws.com/0/35008/1e3b10d9-7c0d-9020-63fa-99987883e554.png "charles-cert-trusted.png")

### KeyChainからエクスポートします。
![exported.png](https://qiita-image-store.s3.amazonaws.com/0/35008/e48d7b4d-bdcd-e4e5-5f63-b01cb75efc8d.png "exported.png")

## Apple Configurator 2でプロファイルを作成します。
<kbd>Cmd</kbd>+<kbd>N</kbd>でこういうのが出てくる。Certificateを選択。
![configure-cert.png](https://qiita-image-store.s3.amazonaws.com/0/35008/48d6ea40-fa1a-c4a7-a5d9-ac57ea654280.png "configure-cert.png")
`Configure`を押してさっきエクスポートした.certのファイルを選択するとこうなる。
![configure-cert2.png](https://qiita-image-store.s3.amazonaws.com/0/35008/3cdbcbf8-a2d7-2cc6-713a-c6e1b98e5187.png "configure-cert2.png")

この状態で<kbd>Cmd</kbd>+<kbd>S</kbd>で保存。
これでSSLルート証明書のプロファイルは完成。

# Global HTTP Proxyのプロファイルを作成
## Apple Configurator 2 でプロファイルを作成します。
![configure-proxy2.png](https://qiita-image-store.s3.amazonaws.com/0/35008/92b41861-198d-78ff-d693-6895212daf18.png "configure-proxy2.png")
Global HTTP Proxyに設定したら、先ほどの要領で<kbd>Cmd</kbd>+<kbd>S</kbd>。
ちなみに Generalタブで名前をつけておかないと、先ほどの証明書のプロファイルもこちらもプロファイルの選択画面でUntitledと表示されてどちらかわからなくなります。
![general-name.png](https://qiita-image-store.s3.amazonaws.com/0/35008/d52c1b2f-33b6-f281-7b5c-364e8d46ff9f.png "general-name.png")


### Proxyのホスト
もし自分のMacのCharlesでいいのであれば、例えば以下の要領でipが取れます。当たり前ですがAppleTVと同じネットワークに接続していることを確認してください。

```
$ ifconfig | grep 192
	inet 192.168.5.25 netmask 0xffffff00 broadcast 192.168.5.255
```

この例だと192.168.5.25というのがそれです。ポートはCharlesの設定とか見るとわかると思います。何も考えてなければ8888で良いはず。

# Apple Configurator 2 からプロファイルを追加する
デバイス右クリック=>Add=>Profiles... から、上で保存したプロファイルを両方選択、決定する。
![ac2.png](https://qiita-image-store.s3.amazonaws.com/0/35008/1d848d63-2cb0-7000-b33e-23d899648ac0.png "ac2.png")

以上で、CharlesでAppleTVのSSL通信がモニタできるようになったと思います。
使い終わったら端末からプロファイルを削除するのを忘れずに。
iOSシミュレーターの時間を変更！（local notificationを確認など）



シミュレーターの時刻はmacのシステム時間と同期しているので、macの時間を変更してやればいい

## dateコマンドで時間を変更

`date %m%d%H%M%Y` の形式で時刻を変更できる

```
sudo date 1220235916 <= 2016年12月20日23時59分に設定
```

## システム環境設定から時刻を戻す

```
システム環境設定 > 日付と時刻 > 左下の鍵をクリック > パスワード入力
```

でntpから時刻を取得して元どおりになる
iOSアプリの配布方法まとめ

# 概要
iOSアプリの配布方法は本番配布以外にも様々な方法があります。
テスト配布のやりかたや社内用アプリの配布などもいろいろあるためまとめてみました。

# iOSの配布方法（Standard / Adhoc / Enterprise / VPP）

|  | Standard | Adhoc |  |  |Enterprise(ADEP) In-House  | Volume Purchase Program(VPP) |
|:-----------|:------------|:------------|:------------|:------------|:------------|:------------|
| 配布手段       | AppStore |   開発機から直接接続し配布    | Testflight使用 | Testflight使用 | セキュアな専用配布サーバーが必要 | Appleが専用ページを利用側に用意 |
| 区分     |      - |    内部テスター    | 内部テスター | 外部テスター | - | - |
| アプリ利用有効期限      | 特になし | 最大1年   | 30日 | 30日 | 1年 | 特になし |
| 最大利用デバイス数         |          無制限 |     25      | 25 | 2000 | 無制限 | 無制限 |
| 利用可能者       | iOSデバイス利用者全て |   25    | 25 | 2000 | ADEP契約主体の従業員 | 購入企業内で、DLするURLとコードを配布した利用者 |
| ライセンスの購入者   | 個人 |  デベロッパーアカウントが認めた一時的利用者となる  | デベロッパーアカウントが認めた一時的利用者となる | デベロッパーアカウントが認めた一時的利用者となる | Enterpriseライセンスを購入した配布先企業 | 企業の代表者 |
| 端末管理方法   |  利用者に委ねる |   利用者に委ねる   | 利用者に委ねる | 利用者に委ねる | 当該企業に委ねる | 企業がインストール状態を管理できる |
| 購入方法   |    Appleへ支払い、デベロッパーアカウントへ |  不要  | 不要 | 不要 | - | Appleへの支払いは法人カードにより企業が一括で行う。 |
| 事前登録作業   |  なし   |  iTunes Connect Membersへの登録が必要    | 内部テスターへの登録が必要 |  | 事前のデバイス登録不要 | 事前登録必要。登録にあたってはDUNSナンバーの入手が必要。 |
| 審査   |   あり |  なし    | なし | 簡易審査あり（1日程度） | なし | あり |
| その他   |   |      |  |  |  | 開発企業は、アプリを「Custom B2B App」としてiTunes Connectに申請 |

# 各種プログラム
- Enterprise
    - [Apple Developer Enterprise Program](https://developer.apple.com/enterprise/)
- Volume Purchase Program(VPP)
    - [VPP oficial](http://images.apple.com/jp/business/docs/VPP_Business_Guide.pdf)
    - [Volume Purchasing Program (VPP) を通じて App を配布する](https://support.apple.com/ja-jp/HT202995)

# 参考
http://qiita.com/isaac-otao/items/126bced83d9af86c7ce5
【Tips】MovableTypeでブログ記事のmt:EntryTagsが他のブログのカテゴリと紐付ける方法


忙しいですがメモしないと忘れて書かなくなるので残しておきます。

あまり使うことがないと思うのですが、記事に入力したタグの文字列と他のブログカテゴリ名が一致した記事だけにカテゴリの情報を渡すという方法になります。

* 他ブログのカテゴリ情報を変数に格納
* mt:EntryTagsのブロックタグ内のTagNameで条件分岐させる


``` html
<mt:Blogs blog_ids="カテゴリ先のあるブログID" ignore_archive_context="1">
<mt:TopLevelCategories>
<$mt:CategoryLabel setvar="cat_label"$>  // 他ブログで使用しているカテゴリラベルを変数に格納
<mt:CategoryArchiveLink setvar="cat_link" />  // 他ブログでのカテゴリリンクを変数に格納
<mt:CategoryDescription setvar="cat_label_description" />  // 他ブログのカテゴリの説明
<mt:EntryTags>
  <mt:If tag="TagName" eq="$cat_label">  // 記事のEntryTagとカテゴリが一致したものを出力
  <h1>他ブログ名</h1>
  <a href="<mt:Var name="cat_link" />">
    <h2><mt:Var name="cat_label" /></h2>
    <p><mt:Var name="cat_label_description" /></p>
  </a>
  </mt:If>
</mt:EntryTags>
</mt:TopLevelCategories>
</mt:Blogs>
```

たったこれだけですが、何かに紐付けをしたいときには使えるかと思います。
Macでやりたい初期設定

**トラックパッド**

* 「アプリケーションExpose」をチェック

**バッテリー**

* 残量のパーセントを表示する

**日付と時刻**

* 日付を表示

**ディスプレイ**

* メニューバーにミラーリングオプションを表示しない

**Dock**

* Dockを右に移動
* Dockを自動的に隠す
* ウィンドウタイトルバーのダブルクリックでしまう
* ウィンドウをアプリケーションアイコンにしまう
* サイズを1/4にする
* 拡大を1/2にする
* 必要なアプリをDockに追加
    * Finder
    * メール
    * システム環境設定
    * Google Chrome
    * ターミナル
    * Atom
    * Xcode
    * Sequel Pro
    * ChatWork

**共有**

* コンピュータ名を変更

**デスクトップ**

* 表示順序を「グリッドに沿う」にする
* 壁紙を無地にする

**Finder**

* 表示形式を「カラム表示」にする
* 並び順序を「なし」にする
* 表示順序を「名前」にする
* 表示形式、並び順序、表示順序をデフォルトとして使用する
* 新規FinderウィンドウでHOMEを表示する
* 「サイドバーに表示する項目」を整理
    * AirDrop
    * アプリケーション
    * デスクトップ
    * HOME
    * 共有すべて
    * デバイスすべて
* すべてのファイル名拡張子を表示する
* 並び替えでフォルダを上部に表示する
* すべてのバーを表示する

**セキュリティとプライバシー**

* ファイアウォールを入にする

**通知センター**

* ウィジェットの整理
    * 天気

**アプリケーション**

* Command Line Tools
* Homebrew
* Hosts
* Docker for Mac
* Atom
* ChatWork
* AppCleaner
* Sequel Pro
* Google Chrome
* Xcode
* Git

**メール**

* アカウント設定

**Git**

* ユーザー情報を設定

**Atom**

* 設定ファイルをダウンロード
* パッケージをインストール

**一般**

* デフォルトのWebブラウザをChromeにする
Ansibleでrhn_registerを使ってみた

必要に駆られて、RedHat構築をPlaybook化した時にちょっと困った(主に自分のtypoで)し、日本語の記事が無かったので
わいがやるんや！の精神で投稿


## 雑な環境説明
Ansible2.0系が動くこと
ターゲットOSはRHEL6.7

## 雑な使い方

rhn_register.yml ってファイルを作って適当にincludeさせてます。
詳しくは、公式見てね。。。
http://docs.ansible.com/ansible/rhn_register_module.html

```
---

- name: Regist to RedHatNetwork
  rhn_register: state=present username=YOURNAME password=YOURPASSWD server_url=https://xmlrpc.rhn.redhat.com/XMLRPC

```

## 被った被害(自己責任)

1.　server_urlに間違った内容を入れたあと、正しい内容にplaybookを直して再実行しても反映されない？感じがあった。
　　　→　例えば、server_url=https://hoge.rhn.redhat.com/ とかにして、実行後間違いに気づいて
         server_url=https://fuga.rhn.redhat.com/ として再実行しても
　　　　  /etc/sysconfig/rhn/up2date の中身が変わらなかった感じがあった。
　　　　　トラブル初期時の記憶なのでちょっとうろ覚え

2.　server_urlには `https` を入れましょう
    https://access.redhat.com/solutions/53905
　　RedhatNetworkにRegistは出来るけど、yum update が出来ないという↑の問題引きました

Ansibleの問題ではなくヒューマン的な問題でした。
多分server_urlとか指定しなくてもきちんと使えるとは思いますが、念のためhttpsできちんと指定し直し。
transferFile()で転送したファイルは溜まっていくのか?

#はじめに
WCSessionのtransferFile()を通じてiOS-watchOS間でファイル転送を繰り返した場合、そのファイルは溜まっていくのでしょうか?

#結論
溜まりません。

何度か実行した上で、実際にフォルダを確認してみましょう。

<img width="299" alt="screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/84185/30b757fa-b277-0884-732e-bc83dd23a68c.png">

溜まっていませんね。

[An Introduction to Watch Connectivity in watchOS 2](http://www.techotopia.com/index.php/An_Introduction_to_Watch_Connectivity_in_watchOS_2)の説明によれば、転送されたファイルは転送先アプリのDocument/Inboxフォルダに入ります。次いで、デリゲートメソッドが返った時に自動的に削除されます。

逆にいえば、転送先でファイルを保持したい場合は、意図的に保存する必要があります。

#ディレクトリの確認を素早く
[SimPholders 3.0](https://simpholders.com)(執筆時β版)を使うと、シミュレータのフォルダに素早くアクセスできます。watchOS、Sierra/Xcode 8にも対応しています。

#Contribution
[RealmデータをwatchOSとiOSとの間でやりとりする(3)](http://qiita.com/hsylife/items/986a47a173a4b8ad5672#comment-94ee50cfbaa8ba590152)への@n440さんの質問から生まれた記事です。ご質問ありがとうございます。
【VMware@SoftLayer】論理ルーターによるL2 Bridge編

#前回までのあらすじ

IBMとVMwareが協業しましたね。

SoftLayer上でVMwareを使っていろいろできるかどうか確認するという趣味を持つ私としては嬉しい限りです。

前回までの詳しい流れについては[こちら](http://qiita.com/khayama/items/b8dc884c7ea273861a24)の記事をご覧ください

#今回やること
NSX Edgeの機能であるL2 Bridgeを用いて、VLANとVXLAN(物理ネットワークと仮想ネットワーク)間でのルーティングができることを確認していきます。
![p2v1.png](https://qiita-image-store.s3.amazonaws.com/0/103277/399667b9-b217-175a-76d5-0a55416ccbe5.png)


これにより、仮想ネットワーク上のワークロードをIPアドレスの変更なく物理ネットワーク上に移行することができます。

ちなみにP2VのルーティングにはEdge Services Gatewayではなく、Logical Routerを利用します。


#実装

##Logical Switchの作成

まずはVXLANの実態である論理スイッチを作成します。

いつも通りWeb Clientから「Networking and Security」を選択し、「論理スイッチ」をクリックします。
![p2v2.png](https://qiita-image-store.s3.amazonaws.com/0/103277/d4b8e784-da3f-b6bc-54b3-3a4b935b2d65.png)

新規論理スイッチを作成しましょう。

##Logical Routerの作成

次に、論理ルーターを作成します。

「Networking and Security」の「NSX Edge」メニューから、作成していきます。
![p2v3.png](https://qiita-image-store.s3.amazonaws.com/0/103277/3cd7fb61-9def-4298-de32-dfb9b7b0eae7.png)

パスワードを入力し、リソースを選択します。
![p2v4.png](https://qiita-image-store.s3.amazonaws.com/0/103277/8d153e2f-3af4-130e-8476-74e61877e46c.png)

また、論理ルーターでは**HA用(マネージメント用)のインターフェースをあらかじめ分散ポートグループか論理スイッチに接続しなければなりません**。
![p2v9.png](https://qiita-image-store.s3.amazonaws.com/0/103277/ca2a9302-df04-8b89-cb3b-92ebe8be62e1.png)

空欄のままだとエラーで作成できません。
![p2v6.png](https://qiita-image-store.s3.amazonaws.com/0/103277/810537c0-cdb1-2ea5-4c6b-f7536e402411.png)

無事にデプロイされました。
![p2v10.png](https://qiita-image-store.s3.amazonaws.com/0/103277/f13f6c5f-317e-6ab8-30a4-be561f6f94b5.png)

##Bridgeの設定

最後に、両セグメントを　ブリッジします。

論理ルーターの「管理」メニューから「ブリッジ」を選択します。
![p2v13.png](https://qiita-image-store.s3.amazonaws.com/0/103277/5e198819-8065-bcec-e0d0-46b49c6b84b1.png)
ブリッジの名前を入力し、ブリッジするVLANと論理スイッチ選択して完了です。


#疎通確認

ブリッジできているかどうか確認していきます。

各セグメントに用意した仮想マシン同士の疎通を確認します。
![p2v14.png](https://qiita-image-store.s3.amazonaws.com/0/103277/791e05d3-ae75-0b4c-2e97-a42679b7bebd.png)
疎通できました！これでVXLAN上にある仮想マシンもVLAN上にある仮想マシンと同様に振舞うことができそうです。

#ユースケースについて

L2ブリッジがどのようなユースケースで利用されるのか気になったので調べてみると、[こちら](https://telecomoccasionally.wordpress.com/2016/04/14/do-i-need-a-hardware-vtep-for-my-nsx-for-vsphere/)のサイトに4つのユースケースが載っていました。

詳しくはリンク先をご覧いただければよいと思いますが、まとめてみるとこんな感じです。

1. 論理スイッチ上のVMがストレージやLBなどの物理コンポーネントにアクセスする時
2. VLAN上の物理サーバーを論理スイッチ上に移行する必要がある時
3. 物理サーバーを含む、多層アーキテクチャのアプリケーション
4. 論理スイッチ上のVMにマルチキャストを通す場合


#まとめ

今回はL2 Bridgeの機能を利用し、P2Vでの疎通を確認しました。これにより、論理スイッチ上にあるワークロードと物理的なVLAN上のワークロードがブリッジされます。

非常に簡単な操作で設定ができるので是非お試し下さい！
MySQLで任意の文字種を使ったランダムな文字列を作る

この記事で分かること
----
* MySQLで任意の文字種を使って任意の長さの(そこそこ)ランダムな文字列を作る方法


概要
----
MySQLで任意の文字種を使った任意長のある程度ランダムな文字列が生成したくなったので調べてみたら、組み込み関数でペロっとできるものではなさそうだったのでfunctionを書いた。


モノ
----

```sql
delimiter //

create function generate_random_string (permitted_chars text, string_length int) returns text
begin
    declare i int default 0;
    declare generated_string text default '';

    while i < string_length do
        set generated_string = concat(
            generated_string,
            substring(permitted_chars, ceil(rand() * char_length(permitted_chars)), 1)
        );
        set i = i + 1;
    end while;

    return generated_string;
end//

delimiter ;
```

使わなくなったら `drop function generate_random_string` で葬ってあげる。


実行例
----
```sql
mysql> select generate_random_string('a', 1);
+--------------------------------+
| generate_random_string('a', 1) |
+--------------------------------+
| a                              |
+--------------------------------+
1 row in set (0.00 sec)

mysql> select generate_random_string('abc', 1);
+----------------------------------+
| generate_random_string('abc', 1) |
+----------------------------------+
| c                                |
+----------------------------------+
1 row in set (0.00 sec)

mysql> select generate_random_string('abc', 1);
+----------------------------------+
| generate_random_string('abc', 1) |
+----------------------------------+
| b                                |
+----------------------------------+
1 row in set (0.00 sec)

mysql> select generate_random_string('0123456789', 32);
+------------------------------------------+
| generate_random_string('0123456789', 32) |
+------------------------------------------+
| 46034298664266382588833453036192         |
+------------------------------------------+
1 row in set (0.00 sec)

mysql> select generate_random_string('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', 32);
+----------------------------------------------------------------------------------------------+
| generate_random_string('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', 32) |
+----------------------------------------------------------------------------------------------+
| Ki5pAAZ39ppFZKENU0aCq8eDggp50CUy                                                             |
+----------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
```


キーワード
----
* create function
  * see: https://dev.mysql.com/doc/refman/5.6/ja/create-procedure.html
* declare
  * see: https://dev.mysql.com/doc/refman/5.6/ja/stored-program-variables.html


独り言
----
任意の文字種を使う、っていう要件がなければ、 `sha1` で生成した文字列をsubstringでカットしてあげる方がシンプルで好きです（この場合、英小文字 + 数値の文字列が生成される)。

もっとスマートにかける方法があれば、是非教えてください(_ _)


参考文献
----
1. "[MySQL] ランダム文字列の生成", http://readit.l8r.in/post-382/, 2016/11/22参照.
ssh: connect to host heroku.com port 22: Connection refusedが出た場合の対処方法

ssh接続したのにgit pullとかしたときに
こんなのが出た時↓

```
ssh: connect to host heroku.com port 22: Connection refused
fatal: Could not read from remote repository.

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

多分sshでつながっていないだけ。

```
git remote -v
```

これでremoteのurlの一覧が出てくるので
そこがhttpsになってないはず


```
git remote set-url test-stg https://git.heroku.com/test-stg.git
```

みたいにやればOKだと思う。
[Java][Spring Boot][MySQL] テーブル名/列名等の大文字小文字を区別する方法 - NetBeansで始めるSpring Boot (9)

# 環境

- Spring Boot 1.4.2
- Java 8


# 概要

例えば、以下のようにエンティティのテーブル名を大文字にしていても、データベースには小文字でアクセスするようになっています。

```java:
@Entity
@Table("MY_ENTITY")
class MyEntity {
  // ...
}
```

これを、大文字でアクセスするようにする方法です。

# 詳細

Spring Bootのデフォルトでは、[物理名マッピングするためのクラスが設定されています](http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-configure-jpa-properties)。

物理名マッピングは、[SpringPhysicalNamingStrategyクラス](https://github.com/spring-projects/spring-boot/blob/master/spring-boot/src/main/java/org/springframework/boot/orm/jpa/hibernate/SpringPhysicalNamingStrategy.java)で行われています。

上記クラスの中ですべて小文字変換しているので、大文字小文字を区別するMySQLでは困ってしまいます。

# 解決策

apprication.ymlまたは同propertiesの中で、物理名マッピングするクラスをHibernateオリジナルのものに変更します。

```yaml:application.yml
spring:
     jpa:
        hibernate:
            naming:
                physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
```

# 真の解決策

テーブル名/列名は小文字にするのが安心安全です。 :smile:
Google Mapsで2地点間の経路を描画するサンプル

こんな感じ
![image](https://qiita-image-store.s3.amazonaws.com/0/79394/dcafb6ca-943e-423c-10fe-1de3c00d650a.png)


APIキーだけは書き換えて下さい：

```sample.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Google Mapsで2地点間の経路を描画するサンプル</title>

<script src="https://code.jquery.com/jquery-2.2.1.min.js"></script>
<script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?key=●●●●●●●●●●"></script>

<script type="text/javascript">
  $(function() {
    var latlng1 = new google.maps.LatLng(35.705947, 139.651252);  // VAL研究所
    var latlng2 = new google.maps.LatLng(35.705469, 139.649610);  // 高円寺駅
    var map;
    var directionsService = new google.maps.DirectionsService();
    var directionsRenderer = new google.maps.DirectionsRenderer();
    
    // 地図初期化のオプション
    var mapOptions = {
        zoom: 17,
        center: latlng1,
        mapTypeId: google.maps.MapTypeId.ROADMAP,
        scaleControl: true,
    };
    // 地図を表示
    map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);

    // ルートを取得
    var request = {
      origin: latlng1,        // 出発地点の緯度、経度
      destination: latlng2,   // 到着地点の緯度、経度
      travelMode: google.maps.DirectionsTravelMode.WALKING // ルートの種類
    };
    directionsService.route(request, function(result, status) {
      directionsRenderer.setDirections(result); // 取得したルートをセット
      directionsRenderer.setMap(map); // ルートを地図に表示
    });
  });

</script>
</head>
<body>

  <div id="map_canvas" style="width: 100%; height: 600px;"></div>

</body>
</html>
```

`WALKING`の部分は他に`DRIVING`（車）, `BICYCLING`（自転車）, `TRANSIT`（公共交通機関）が指定できる。
[Directions Service  |  Google Maps JavaScript API  |  Google Developers](
https://developers.google.com/maps/documentation/javascript/directions?hl=ja)
WindowsServer2012R2で評価版から正規版へのライセンス認証

#結論
評価版⇒正規版へのライセンス認証を実施する際には、「コマンド」からライセンスキー入力が必要です。その結果、Windows認証されていなくても、今度はライセンスキー入力可能になります。

#きっかけ
WindowsServer2012R2を構築するために、WindowsServer2012R2評価版のDVDを取得。

しかし、これがなかなか思ったようにはいかず。
⇒評価版には、180日間の評価期間がついてくる。
⇒という先輩からの前情報だったのだが、なぜか既に有効期限が切れている。
⇒このままだと、OSが1時間でシャットダウンしてしまうので作業にならない。

上記の理由で、正規版をアクティベートする前に、評価版の有効期限を延長。
`slmgr.vbs -rearm`

WindowsServer2012R2も構築し、さあ正規版をアクティベートしようがとキーを入力したが、「このエディションのWindowsのライセンス認証にそのキーは使えません。別のキーを試してみてください」のエラーメッセージ。

さあ、どうしよう。またOSインストールして、再設定？？いやだ。
という理由で、評価版⇒正規版へのライセンス認証する方法を調査した結果です。

#対応
コマンドを実行することで正規のライセンキーを入力できるようになるらしい。
[Windows Server 2012 R2 Standard評価版の期限切れ。勝手にシャットダウンされるので正規のライセンスキーを入力した結果](http://blog.putise.com/windows-server-2012-r2-standard%E8%A9%95%E4%BE%A1%E7%89%88%E3%81%AE%E6%9C%9F%E9%99%90%E5%88%87%E3%82%8C%E3%80%82%E5%8B%9D%E6%89%8B%E3%81%AB%E3%82%B7%E3%83%A3%E3%83%83%E3%83%88%E3%83%80%E3%82%A6/)
を参考にしました。ただ、この記事の筆者は、再インストールした後でコマンド実行することが可能になることを調べたらしく、実際には試していない様子。

`DISM /online /Set-Edition:<edition ID> /ProductKey:XXXXX-XXXXX-XXXXX-XXXXX-XXXXX /AcceptEula`
※管理者でコマンド実行します。

edition IDは、ServerStandardにしました。

`DISM /online /Get-CurrentEdition`
を実行すると、現在のエディションがServerStandardEvalだったので、Evalを取って。

#確認
全部で、5台に実施しました。
再起動後、コントロールパネル⇒システムにて、Windowsライセンス認証の項目を確認しました。

1台だけ「Windows認証されていません」と表示されています。理由は不明。

もう一度、ライセンス認証を行ってみます。この記事で紹介したコマンドではなく、普通にGUIからライセンスキーを入力しました。
今度は問題なく、認証されました。

#結論
評価版⇒正規版へのライセンス認証を実施する際には、コマンドからライセンスキー入力が必要です。その結果、Windows認証されていなくても、今度はライセンスキー入力可能になります。
Heroku で Let's Encrypt 無料証明書を使う（自動更新あり）

[letsencrypt-rails-heroku](https://github.com/pixielabs/letsencrypt-rails-heroku)

便利な gem が出てきて、 Heroku でも気軽に設定できる、更に自動更新もできるようになったので、共有致します。

ほぼ gem の README のままですが、順番調整と注意ポイントもあります。

## 手順
1. gem 追加
2. Heroku 環境変数追加
3. SSL証明書生成
4. Heroku Scheduler 自動更新設定追加

### 1. gem追加
- gem 追加して、`bundle install`を実行する

```rb
gem 'platform-api', github: 'jalada/platform-api', branch: 'master'
gem 'letsencrypt-rails-heroku', group: 'production'
```

- 設定追加

```rb:config/environments/production.rb:

Rails.application.configure do
  ...

  config.middleware.use Letsencrypt::Middleware

  ...
end
```

**Heroku への push を忘れずに**

### 2. Heroku 環境変数追加
- Heroku Token 作成しておく

```bash
$ heroku plugins:install heroku-cli-oauth
$ heroku authorizations:create -d "LetsEncrypt"
Created OAuth authorization.
  ID:          <heroku-client-id>
  Description: LetsEncrypt
  Scope:       global
  Token:       <heroku-token>
```

- Heroku 環境変数追加

```rb
heroku config:add ACME_DOMAIN=example.com,www.example.com ACME_EMAIL=admin@example.com HEROKU_APP=you_app_name HEROKU_TOKEN=上記で作成したtoken
```

### 3. SSL証明書生成

```rb
heroku run rake letsencrypt:renew
```

### 4. Heroku Scheduler 自動更新設定追加

```bash
# 毎月の1日が更新する
if [ "$(date +%d)" = 01 ]; then rake letsencrypt:renew; fi
```

## 注意ポイント

- **証明書を生成するステップの中、 Heroku 側へのリクエストは HTTP で来るので、対応が必要**
- SSL導入したら、`config/environments/production.rb`で `force_ssl = true`を書きたいですが、上記の理由で、SSL証明書生成する時の（コールバックみたいな）URLだけ HTTP にする必要がある

### Rails 4 のやり方

```rb
# application_controller.rb　に追加
force_ssl if: :force_ssl?

private

  def force_ssl?
    not request.path =~ /^.well-known\/acme-challenge/
  end
```

### Rails 5 のやり方

```rb
# config/environments/production.rb
config.force_ssl = true
config.ssl_options = { redirect: { exclude: -> request { request.path =~ /^.well-known\/acme-challenge/ } } }
```

参考リンク：[Rails 5 ssl_options](http://api.rubyonrails.org/classes/ActionDispatch/SSL.html)
Windows10 > link > アクションセンターの非表示

```txt:動作環境
Windows10 Anniversary Update適用後
```

アクションセンターの非表示の方法について、Windows 10 Anniversary Update前/後で設定方法が異なるようだ。



## Anniversary Update後

Windows 10 Anniversary Update後の方法は以下が参考になった。
https://xinroom.net/pc/win10-taskbar-icon-actioncenter/


## Anniversary Update前

Anniversary Update前は以下の方法で設定できた。
https://121ware.com/qasearch/1007/app/servlet/relatedqa?QID=018031
[Resolved]Qiita いいねボタンがなくなった

###投稿記事やコメントに「いいね」できるようになりました（Contributionの算定基準も変わります）
http://blog.qiita.com/post/153200849029/qiita-like-button

###投稿閲覧画面での「いいね」の操作
![397d550e-8bd5-15b5-7533-d88b65134e18[1].png](https://qiita-image-store.s3.amazonaws.com/0/67318/39c9464d-e528-254e-dae4-f317fbe0ef80.png)

###ストックボタンは健在なので困ることはない。
![無題1122.png](https://qiita-image-store.s3.amazonaws.com/0/67318/4cdd9c38-aa71-febb-488a-d47dba49588f.png)

###確認した環境
+ IE11
SSRS -> Excel で要回復のファイルが作成される件

#再現環境

* SQL Server 2014
* Excel 2013

#問題発生

客先の社内システムの画面の一部をSQL Server Reporting Service（以下SSRS）で作成したレポートの形で提供していたところ、「画面をExcelで保存するとエラーが出る」というクレームがありました。
そもそもExcelで保存って何だ？と再確認してみると、SSRSの標準機能としてExcelファイルへのエクスポート機能があることに気付きました（先に把握しておくべきだったかとは思いますが）。
色々試してみたところ、特定のデータで特定のレポートをエクスポートしたときだけExcelファイルが破損していました。

#再現方法

レポートビルダーで新規レポートを作成し、適当なデータソース・データセットを作成し、下記のクエリを設定します。

```sql
SELECT 0.00000000000000 AS data
```

作成したデータセットのdataフィールドをD&Dでレポートに放り込んで、テキストボックスを作成します。
そしておもむろに実行。
レポートが表示されたら、エクスポート->Excelを選択し、ファイルを適当な場所に保存してExcelで開きます。
すると、「'～.xlsx'の一部の内容に問題が見つかりました」のダイアログが表示されます。
内容の回復は可能で、回復すると一応ファイルを開くことができます。
勿論、レポートサーバに配置した後でも同様の問題が発生します。

#原因は？

Excelの数値有効桁数が15桁なので、それにまつわる問題かと思われます。
値が完全な0ではない場合は、指数表現に変換されるためかセーフとなります。

そうは言っても、そうそう15桁を超えることなんか無いような、とも思えるのですが、SQL Serverの場合はDECIMAL÷INTとかやってしまうといきなり桁数が膨れ上がる（参考：[NUMERIC/DECIMAL の演算結果の有効桁数と小数点以下桁数](https://blogs.msdn.microsoft.com/jpsql/2013/05/07/numericdecimal/)）ので、あっさり突破されます。

#回避方法

該当の式にFormatプロパティを設定して、小数桁数が14桁以下になるようにすればOK。
・・・かと思いきや、SSRSからExcel形式でエクスポートした場合、値は値、FormatはExcelの書式指定として別々にエクスポートされるので回避できません。
他に考えられる回避策は

* Valueプロパティ内でFormat式を使用して桁数を削る
* SQLの段階で適当な桁数のDECIMALにキャストする
* SQLでDECIMAL÷INT系の演算をしないように気をつける

といったところでしょうか。
いずれにせよ、一括処理はできないので調査・対応は非常に面倒です。
うぐぐぐぐ。
PowやPuma-devで動いているRailsアプリにRubyMineからアタッチしてデバッグ実行する

## はじめに

RubyMine 2016.3から、ローカルで動いているRubyプロセスにアタッチしてデバッグ実行できる機能が追加されました。

[RubyMine 2016\.3 Release Candidate: Attach to Local Process with Debugger \| RubyMine Blog](https://blog.jetbrains.com/ruby/2016/11/attach-to-local-process-with-debugger/)

これにより、PowやPuma-devで動いているRailsアプリに対してもRubyMineからアタッチしてデバッグ実行することができます。
この記事ではそのデバッグ実行の手順を説明します。

### PowやPuma-devって何？

`rails server`でRailsを起動しなくても、`http://your-app-name.dev`みたいなURLでRailsアプリを実行できる便利ツールです。

- [Pow: Zero\-configuration Rack server for Mac OS X](http://pow.cx/)
- [puma/puma\-dev: A tool to manage rack apps in development with puma](https://github.com/puma/puma-dev)

ちなみに今回はPowを使いましたが、Rails 5のActionCableを使うようなアプリではPuma-devを使うのがいいみたいです。


Puma-devでは試していませんが、おそらく同じような手順でデバッグ実行できるんじゃないかと思います。

Puma-devでも同じように使えることを確認しました！（2016.12.12追記）

## 百聞は一見にしかず：動画で確認する

こんな感じでデバッグ実行できます！:satisfied: 

<blockquote class="twitter-video" data-lang="en"><p lang="ja" dir="ltr">Powで動いているRailsアプリにRubyMine 2016.3からアタッチしてデバッグ実行する動画を撮ってみた。<a href="https://t.co/D1EgVN3tPy">https://t.co/D1EgVN3tPy</a> <a href="https://t.co/yVKb1K1YES">pic.twitter.com/yVKb1K1YES</a></p>&mdash; Junichi Ito (伊藤淳一) (@jnchito) <a href="https://twitter.com/jnchito/status/800830372577583104">November 21, 2016</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

## デバッグ実行の手順

デバッグ実行の手順は以下のとおりです。

1. Powで動くRailsアプリを起動する（Powのプロセスを立ち上げる）
2. RubyMine上でデバッグしたいコードにブレークポイントを付ける
3. Run > Attach to Local Process でPowのプロセスを選択する
    - 場合によってはいろいろリストアップされますが、"/.../Pow/.../アプリのディレクトリ/.../nack.xxx.sock"みたいなのがPowのプロセスです。![Screen Shot 2016-11-22 at 07.48.30.png](https://qiita-image-store.s3.amazonaws.com/0/7465/ea68b912-68fb-81bf-99ec-7e29abac786a.png "Screen Shot 2016-11-22 at 07.48.30.png")
4. デバッガが起動するので、プログレスバーが動いている間にRailsアプリを操作してブレークポイントを付けたコードを実行する
    - プログレスバーが最後まで到達してしまうと、エラーが出てアタッチできない場合があります。
5. ブレークポイントで止まったら（うまくアタッチできたら）、普段通りRubyMineでデバッグ実行する
    - 1回で止まらない場合、画面をリロードするなどして何度か目的のコードを動かすようにしてみてください。

最初はアタッチするまでのクセをつかむのに時間がかかるかもしれませんが、コツをつかめば簡単です！

## まとめ

これまではPowやPuma-devで実行中のRailsアプリをRubyMineでデバッグするのはちょっと面倒でしたが、これで思い立ったときにすぐデバッグ実行できそうです。

RubyMineは有料ではあるものの、かなりハイペースで魅力的なバージョンアップを繰り返してくれるので、お布施のしがいがある開発ツールだと思っています。
まだ使っていない人は30日間の無料トライアルもできるので、ぜひ試してみてください！

[Ruby on Rails IDE :: JetBrains RubyMine](https://www.jetbrains.com/ruby/)

### あわせて読みたい

RubyMineについて詳しく知りたい方はこちらのアドベントカレンダーをどうぞ。

[RubyMine Advent Calendar 2014 \- Qiita](http://qiita.com/advent-calendar/2014/rubymine)
Linuxで環境変数が保存される仕組み(bash_profile)

環境変数である＄PATHはインストールする時などのエラーの原因になりやすいです。
そのため、＄PATHの設定を理解するための記事です。

環境変数はログイン時に毎回、値を代入されています。
まずは、$PATHを初期化しているファイルを特定しましょう。

## ログインした時に実行されるファイル(実行順)
1, /etc/profile
2, /etc/profile/profile.d
3, ~/.bash_profile
4, ~/.bash_login
5, ~/.profile
6, ~/.bashrc
7, /etc/bashrc
上記の順番で次々と実行されていく。
/etc/profile/profile.dはディレクトリです。
profile.dの中に入っている.shファイルが全て実行されます。
全ユーザにPATHを追加するときはprofile.dの中のshファイルを追加すると良いでしょう。
特定のユーザにPATHを追加するときは/.bash_profileに追加すると良いでしょう。

## ログアウトした時に実行されるファイル
1, ~/.bash_logout

## 「/etc/profileファイル」の説明
この部分ではrootユーザとそれ以外のユーザで分岐されている。（上がrootユーザ）
pathmunge関数で、＄PATHに引数の値を追加している。
<pre><code>if [ "$EUID" = "0" ]; then
    pathmunge /sbin
    pathmunge /usr/sbin
    pathmunge /usr/local/sbin
else
    pathmunge /usr/local/sbin after
    pathmunge /usr/sbin after
    pathmunge /sbin after
fi</code></pre>

この部分では/etc/profile.d/の中の拡張子が.shのものを全て実行していく
<pre><code>for i in /etc/profile.d/*.sh ; do
    if [ -r "$i" ]; then
        if [ "${-#*i}" != "$-" ]; then
            . "$i"
        else
            . "$i" >/dev/null 2>&1
        fi
    fi
done</code></pre>

この部分ではpathmunge関数の定義をしている
第２引数にafterが付いていれば$PATHの後に追加する。(同じ名前のコマンドだと先頭のパスが優先される)
<pre><code>pathmunge () {
    case ":${PATH}:" in
        *:"$1":*)
            ;;
        *)
            if [ "$2" = "after" ] ; then
                PATH=$PATH:$1
            else
                PATH=$1:$PATH
            fi
    esac
}</code></pre>


# PATHの確認
<pre><code>echo $PATH</code></pre>
<pre><code>/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/username/bin</code></pre>

# コマンドのPATHの確認
<pre><code>which python</code></pre>
<pre><code>/usr/bin/python</code></pre>
コマンドのPATHがバージョンの違うコマンドだったりとかが、たまにあります。
ホームディレクトリに最初インストールしていて、その後/usr/local/srcなどにインストールしたらPATHがホームディレクトリのままであったりとか。

# フォルダの説明
/bin　システムで使う基本的なコマンドを格納
/sbin システムで使う管理者用の基本的なコマンドを格納
/usr/bin アプリケーションで使う基本的なコマンドを格納
/usr/sbin アプリケーションで使う管理者用のアプリ汎用コマンドを格納
/usr/local/bin　追加したアプリケーションで使うコマンドを格納
/usr/local/sbin 追加した管理者用のコマンドを格納

/home/USER/bin ユーザが追加したコマンドを格納
/etc/profile/profile.d 全ユーザでも使えるアプリケーションのコマンドのPATH追加するシェルファイルを格納
doppiaモデルを使ってみる（１）

##はじめに
前３回でDeepCascadeモデル
https://bitbucket.org/rodrigob/doppia
のインストールにチャレンジしたが、挫折してその大元のdoppiaをインストールした。

DeepCascadeモデルをインストールする（１）
http://qiita.com/masataka46/items/61032ba4470e35557389
DeepCascadeモデルをインストールする（２）
http://qiita.com/masataka46/items/df3b9aba6fa7dc6bbff5
doppiaモデルをインストールする
http://qiita.com/masataka46/items/acf698e8f169cabae7fb

今回はこのモデルを触りながら仕組みを学ぶ

##環境
OS: Ubuntu14.04
GPU: GTX1070
python2.7.6
doppiaモデルをインストール済み
##アプリケーションobject_detectionの概要
`doppia/src/applications/objects_detection`にあるアプリケーション`objects_detection`が学習済みモデルを使った検出アプリのようだ。

これの使い方は

```
MP_NUM_THREADS=4 ./objects_detection -c cvpr2012_inria_pedestrians.config.ini --gui.disable false
```

のように`-c ....config.ini`で設定ファイルに記載した設定で実行するようだ。また使用する学習済みモデルは`doppia/data/trained_models/`内にある。

以下ではこの設定ファイルをいじる事で仕組みを学ぶ。
##cvpr2012_inria_pedestrians.config.iniをいじる
技術英語 > make sure you understand it [to the core]

@ Code Complete (No. 17749 / 36077)

> make sure you understand it <font color=red>to the core</font>

http://ejje.weblio.jp/content/to+the+core
> 心底まで、徹底的に

<hr>
@ ヘッセの読書術 by Hermann Hesse 

> 私たちが徹底的に知っているものだけを私たちは本当に自分のものにしたといえるのである。