OmniAICreator/Qiita-1.07M huggingface dataset:
GoogleDataStudioのすゝめ

GoogleDataStudioを使えば面倒なグラフを使ったレポートの作成も楽ちんということで纏めてみました。

#デモ
https://datastudio.google.com/open/1ZW5PSBidMuM_wOWVaHizYddc13eYIZCH

（個人的には期間を設定するをUIで手軽に期間を維持れるのは同じ資料を期間毎に用意しなくていいと便利に思いました）

上記のデータはgoogleが提供しているデモアカウントのものです。
https://support.google.com/analytics/answer/6367342?hl=ja
なお、中身は「Google Merchandise Store」のデータ。

# Google Analitycsのカスタムレポートじゃ駄目なの？
カスタムレポートと比べ下記のようなメリットがあります。

- Google Analitycsのアカウントがなくても見れる
- 見せたいデータの範囲の指定が用意
- グラフの作成やサイス変更が簡単

# でも、使えるデータはGoogle Analitycsだけなんでしょう？
いえ、他にも様々データが扱えます。下記は一覧の画像となります。
<img width="1408" alt="datalist.png" src="https://qiita-image-store.s3.amazonaws.com/0/176199/0dc22d2d-4897-1ea8-99d2-0f6d3117eb85.png">

スプレッドシートのGoogleActionScriptと組み合わせれば自動でレポート作成も夢ではありません。
エクセルと睨めっこしてコピペしてチマチマグラフを作る作業ともおさらばできるかも！？

また、おしゃれなテンプレートもあります。
<img width="1089" alt="template.png" src="https://qiita-image-store.s3.amazonaws.com/0/176199/e974dfca-30c7-625c-c9f7-dc67a43fd4c4.png">

# でも、お高いんでしょ？
無料です！
もっと味のあるBoidsを描きたい

最近Unityをはじめたので、いい感じに動くものを作りたいと思って、Boidsをシミュレーションするものを作ってみました。

## Boidsとは
```
コンピュータ上の鳥オブジェクトに以下の三つの動作規則を与え、多数を同時に動かして群れの振る舞いをシミュレーションする。

分離（Separation）
鳥オブジェクトが他の鳥オブジェクトとぶつからないように距離をとる。
整列（Alignment）
鳥オブジェクトが他の鳥オブジェクトと概ね同じ方向に飛ぶように速度と方向を合わせる。
結合（Cohesion）
鳥オブジェクトが他の鳥オブジェクトが集まっている群れの中心方向へ向かうように方向を変える。
```
引用 - [ボイド_(人工生命) - wikipedia](https://ja.wikipedia.org/wiki/%E3%83%9C%E3%82%A4%E3%83%89_(%E4%BA%BA%E5%B7%A5%E7%94%9F%E5%91%BD))

### 参考文献
* [Boidsシミュレーション - WonderPlanet DEVELOPER BLOG](http://developer.wonderpla.net/entry/blog/engineer/Unity_BoidsSimulation/)
* [JavaScript, HTML5で『群れ』をシミュレーションするレシピ (ボイド) - コードレシピ](http://coderecipe.jp/recipe/gRrj53OPQF/)

## 課題と改善
まず、基本のルール通りにコードを書いたのですが結構動きが単調になってしまってなんか、いい感じゃない。（ただ群の塊がいろんな方向に動くだけになってしまう。）
なので、ルールを追加したり、数値を利用して、もっといい動きをするBoidsを作れないか試してみました。

## 実際に行ったこと
### 1. 結合のルールの変更
他の鳥オブジェクトと結合するか、しないかを際の、鳥オブジェクト間の距離に応じて決めるようにした。  
そうすることで、群が複数できるようになり、また距離によっては群の結合が行われて複雑性が増した気がすする。

### 2. 整列のルールの変更
群の中心ではなく、群の中心から、一番離れた鳥オブジェクトをリーダーとして、それに向かうように変更を加てみました。場面によりリーダーが代わり、より縦横無尽に場面を行き来するようになりました。

### 3. グループの鳥オブジェクトの数を利用する
群が大きいほど、色が濃くなるようにして、それぞれの群が可視化できやすいようにしてみた。（ここはまだ改善の余地がありそう）

## 実際に作ったもの
![boids](https://media.giphy.com/media/ipSiQ1fDrwlIbOVEi7/giphy.gif)
[nuuullnull/Unity-Boids](https://github.com/nuuullnull/Unity-Boids)

### 今後の課題
まだまだ、色々ルールの追加で面白くはなりそうな気がするので、値とかうまく使い回せるようにしたい。
あとUnity、C#のお作法がまだしっかりとよくわかってないので勉強したいです。
コードで変なところとかあればぜひ教えてください！
react-routerの<Link> Componentでeslintのエラーが出るのを防ぐ

## 概要
react-routerの\<Link\> Componentはリンク先を決めるAttributeとして`href`の代わりに`to`を使う。

だが、`eslint`の`jsx-a11y/anchor-is-valid`プラグインを使っていると、`href`を使っていない事で怒られてしまう。

## 解決策

ルールを無効にする事も出来るが、それだと本来の\<a\>タグを使用する時に機能しなくなってしまうので、\<Link\> Componentを使う時は特別に`to`をリンク先を決めるAttributeとして認める為のルールを`.eslintrc`に追加する。

```.eslintrc.js
module.exports = {
  "rules": {
      "jsx-a11y/anchor-is-valid": [ "error", {
          "components": [ "Link" ],
          "specialLink": ["to"]
      }]
  }
}
```

## 参考

[jsx-a11y/anchor-is-validレポジトリのissue#340](https://github.com/evcohen/eslint-plugin-jsx-a11y/issues/340)
[Review] Independent Q Learning

## Profile
Titile: MultiAgent Reinforcement Learning: Independent vs Cooperative Agents
Author: Ming Tan
Published Year: 1993
Link: http://web.media.mit.edu/~cynthiab/Readings/tan-MAS-reinfLearn.pdf

## Abstraction
Since the author got inspired by the learning behaviour of human beings, he investigated the multi-agent in reinforcement learning by comparing two generic assumption.

1. Agents who can cooperate with other agents by sharing information
2. Agent who cannot cooperate with others

And he found that basically in the cases described below, agents could efficiently learn through the cooperation each other.

1. Sharing sensation
2. Sharing episodes
3. Sharing learned policies

## Concept
He wanted to find the answer to the questions below.
1. Given the same number of RL agents, will cooperative agents outperform independent agents who do not communicate during learning?
2. What is the price of such cooperation?

## Tasks
Basic hunter/prey game
<img width="284" alt="Screen Shot 2018-06-20 at 8.56.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/240801/212c1b9a-65df-a15c-c984-2194aff5d34d.png">

Sensorable area for each agent
<img width="264" alt="Screen Shot 2018-06-20 at 8.56.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/240801/51b40cd3-fb9a-0bae-ac41-05c4a52920a9.png">

## Results
<img width="742" alt="Screen Shot 2018-06-20 at 8.58.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/240801/339fd7b2-109a-9431-a1f6-1d8fbd27aaa7.png">
<img width="834" alt="Screen Shot 2018-06-20 at 8.58.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/240801/a6f821b3-9acb-c19c-6050-5e67423a3599.png">
<img width="797" alt="Screen Shot 2018-06-20 at 8.57.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/240801/97fdfd16-2b16-8c93-e121-ecdd254b2c54.png">
<img width="797" alt="Screen Shot 2018-06-20 at 8.57.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/240801/bd80f384-6ba0-c577-220a-c24d5ab78210.png">

## Maths
<img width="443" alt="Screen Shot 2018-06-20 at 9.07.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/240801/2e6b65d2-7a92-1038-9013-366841965895.png">


## References
[Check the slide of 49](http://www.ecmlpkdd2013.org/wp-content/uploads/2013/09/Multiagent-Reinforcement-Learning.pdf)
Windows10でのDocker for Windows 導入条件

# 最初に
Docker for Windows/Mac についてです。
色々調べたのですが直球で書かれている記事が私の見ている範囲では無かったので記述させていただいております。また、今回は私がWindows10での環境構築で陥ったところのため他のWindowsのVersionでは検証できておりません。

# Docker for Windowsを使用するための条件
・Pro版であること

### 解説
Windows10で導入する場合はWindows10の設定でHyper-Vという項目を有効にしなければいけないらしくこれはPro版の機能なのでPro版以外だとできないそうです。

## 結論
・Docker for Windowsを使用したい場合はPro版を買う（Home版からのアップグレードの場合14000円）
・DockerをWindowsで無料で使用したい場合、VMなどの仮想環境を使用しLinuxで行う
Chefのattributeでdefault[]への代入元にnode[]を使っても自己参照で発散しない? => しない


default[]などは代入元にnode[]が使えるが、自己参照で発散したりしないか気になったので、少し試して見た。


```ruby:recipes/default.rb

node.default['foo'] = 'bar'
log node['foo']                 #=>         * log[bar] action write

node.default['foo'] = 'baz'
log node['foo']                 #=>         * log[baz] action write

# node[]の値はその時点で判断される。
# ならば自己参照による発散もない。


node.default['foo'] = node['foo']
log node['foo']                 #=>         * log[baz] action write

node.default['foo'] = node['foo'] * 2
log node['foo']                 #=>         * log[bazbaz] action write

# 当然発散しない


node.force_default['foo'] = 'qux'
log node['foo']                 #=>         * log[qux] action write

# 高優先順位で設定


node.default['foo'] = 'quux'
log node['foo']                 #=>         * log[qux] action write

# 低優先順位の設定は表に出てこれない

log node.default['foo']         #=>         * log[quux] action write
log node.force_default['foo']   #=>         * log[qux] action write

# 低優先順位の値も内部的には保持し続けている
# node[]は保持している値の中で、その時点でもっとも優先順位の高い値を返すだけ
```
発散しない。
node[]は都度収束される。
Ruby のソースコードからコメントを集める gem を作った

Ruby のソースコードからコメントを集める [comment_collector](https://github.com/siman-man/comment_collector) という gem を作りました。

例えば、こんな感じのコードがある時に

```rb:example.rb
# class comment
# this is sample
class Foo
  BAR = 'hello' # string

  # method
  def say
    'hi'
  end
end

=begin
multi line
comments
=end
```

こんな感じでコードを書くと

```rb:comment.rb
require 'comment_collector'

comments = CommentCollector.get(File.read('example.rb'))

puts '=' * 20

comments.each do |comment|
  puts comment.value
  puts '=' * 20
end
```

こんな感じでコメントだけを抜き出してくれます。

```
$ ruby comment.rb
====================
# class comment
# this is sample
====================
# string
====================
# method
====================
=begin
multi line
comments
=end
====================
```

`CommentCollector.get` では `Comment` の配列が返ってきます。`Comment` は構造体で定義していて、以下のような感じの情報が取れるようになってます。

```rb
Comment = Struct.new(:value, :first_lineno, :first_column, :last_lineno, :last_column)
```

## 仕組み

Ruby の静的解析ツールを使ってていつも「コメント部分が取れないな」と思っていたのですが、逆に「ソースコードからパースした結果を取り除いたらコメント部分が残るのでは」と思い書いてみた次第です。実際には `__END__` とか残ったりしたのですが、そこら辺は無理やり処理しました。

最初は RubyVM::AST を使っていたのですが、あまり意図しないパース結果になったりしたので途中で [parser gem](https://github.com/whitequark/parser) に切り替えて実装しました。
Laravel で jQuery を使う

次のプログラムを改造して、jQuery を使います。
[Laravel で HelloWorld](https://qiita.com/ekzemplaro/items/c74e7431a8a90e2feb03)

<ol>
<li>resources/views/hello.blade.php　を改造</li>

```php:hello.blade.php
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
<script type="text/javascript" src="js/ex01.js"></script>
  <title>My First Page</title>
</head>
<body>
  <h2>Hello World!!</h2>
  <p>皆さん、こんにちは</p>
<hr />
<div id="outarea_aa">outarea_aa</div>
<div id="outarea_bb">outarea_bb</div>
<div id="outarea_cc">outarea_cc</div>
<div id="outarea_dd">outarea_dd</div>
<div id="outarea_ee">outarea_ee</div>
<div id="outarea_ff">outarea_ff</div>
<div id="outarea_gg">outarea_gg</div>
<div id="outarea_hh">outarea_hh</div>
<hr />
<p>Dec/16/2023</p>
</body>
</html>

```

<li>スクリプト public/js/ex01.js を作成</li>

```bash
mkdir public/js
```

```js:public/js/ex01.js
// -----------------------------------------------------------------------
//      ex01.js
//
//                                      Dec/16/2023
//
// -----------------------------------------------------------------------
jQuery (function ()
{
        jQuery("#outarea_aa").text ("*** ex01.js *** start ***")

        jQuery("#outarea_bb").text ("*** Dec/16/2023 AM 09:33 ***")

        jQuery("#outarea_hh").text ("*** ex01.js *** end ***")
})
// -----------------------------------------------------------------------
```

<li>サーバーを起動</li>

```bash
php artisan serve --host 0.0.0.0
```

<li>ブラウザーで　http://localhost:8000/hello にアクセス</li>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/2b6748d5-9b9b-a792-4e9b-81cd261bb464.png)

</ol>
GithubとBitbucketに別々にSSH鍵を設定

#　SSHを使わない時はどうしていたか
PCによってはSSHを設定していたりしたが、メモをきちんと残していなかったので端末によっては
[netrcを設定したりしていた。](https://shoken.hatenablog.com/entry/20120629/p1)

netrc使ってるとgithubとbitbucketでアカウント分けるのが面倒ということに気づいたのでSSH設定の手順を残します。

#　鍵を作成する手順
SSH鍵を作る手順は以下の通り。[このサイト](https://morizyun.github.io/blog/ssh-key-bitbucket-github/index.html)の記述が丁寧。以下のコマンドを実行することで鍵を作成可能。

```
cd ~/.ssh
ssh-keygen -t rsa -C test@example.com
```
この際帰ってくるメッセージは次の通り。何も考えずにEnterを３回押せばid_rsaとid_rsa.pubという秘密鍵、公開鍵の２つができる。
以下では最初のメッセージで'bitbucket'とうってbitbucket用の鍵を生成している。

```
Generating public/private rsa key pair.
Enter file in which to save the key (/home/＊＊＊＊/.ssh/id_rsa): bitbucket
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in bitbucket.
Your public key has been saved in bitbucket.pub.
...
```

` chmod 600 bitbucket `とうって所有者のみが変更可能にすると良いらしい。[chmodのPermissionについてはこちら。](http://itdoc.hitachi.co.jp/manuals/3021/3021313320/JPAS0348.HTM)　

#　クライアント側の設定
`~/.ssh/config`を開き、次のような記述を追加する。
私の場合、bitbucketとgithubのように鍵に名前をつけているのでIdentityFileの箇所は適当に読み替えて書いてほしい。

```
Host bitbucket.org
  HostName bitbucket.org
  IdentityFile ~/.ssh/bitbucket
  User git

Host github
  HostName github.com
  IdentityFile ~/.ssh/github
  User git
```

#　Github、Bitbucket側の設定
アカウント情報からSSH鍵の箇所をひらき、**.pubの方を登録する**。
図説は[このサイト](https://morizyun.github.io/blog/ssh-key-bitbucket-github/index.html)に任せる。
ちょっと表示が古いがなんとかしてやってください。

##　接続確認

GithubとのSSH確認は以下の通り。

```
ssh -T git@github.com
```
ホントに繋いでOK？的なメッセージが出るが許可する。

```
The authenticity of host 'github.com (192.30.255.112)' can't be established.
RSA key fingerprint is <XXXX>.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,192.30.255.112' (RSA) to the list of known hosts.
Hi <あなたの名前>! You've successfully authenticated, but GitHub does not provide shell access.
```

Bitbucketの場合は次のコマンドを実行して確認。

```
ssh -T git@bitbucket.org
```
##　SSHへの移行
HTTPでCloneしたファイルはSSHでpushしたりできないので、移行が必要になる。

[このサイトが丁寧。](https://yoshiyoshifujii.hatenablog.com/entry/2014/08/12/230144)

一旦remoteを確認し

```
$　git remote -v
  origin  https://github.com/USERNAME/REPOSITORY.git (fetch)
  origin  https://github.com/USERNAME/REPOSITORY.git (push)
```

次のように変更。

```
$ git remote set-url origin git@github.com:USERNAME/REPOSITORY.git
```
【Ruby on Rails チュートリアル】疑問その1 - テスト実行内容を辿る

# はじめに
Ruby on RailsでWebアプリ開発をするためにRails Tutorialを学習中(現在は9章の途中)です。"超初心者"ですので間違ったところなどございましたらご指摘をよろしくお願いします。

# テストが何やってるかよくわからん
Rails Tutorialのテスト文を書いていて「分かったような気がしてきた」テスト内の一文をちゃんと整理しようと思いました。実際に自分で独自アプリを作ったときにテストが書けるようにするためのメモです。
## ・validates
こいつが初めて登場したのは、[6.22 存在性を検証する](https://railstutorial.jp/chapters/modeling_users?version=5.1#sec-presence_validation) です。
使いどころは、

```app/models/user.rb
class User < ApplicationRecord
  validates :name, presence: true
end
```

でname属性の存在性を検証するとあります。
このページでの説明は
> validates メソッドにpresence: trueという引数を与えて使うことです。presence: trueという引数は、要素が１つのオプションハッシュです。4.3.4のようにメソッドの最後の引数としてハッシュを渡す場合、波カッコを付けなくても問題ありません。

`validates`っていうのは何だ...?
ついでに`presence: true`の使い方もわからん...
まずは英語単語の意味から調べる！！

- validates : 検証する
- presence  : 存在

この時点で大体察して、
要するに指定したシンボルが空でないならテストを通るという感じ。
つまり

```
validates シンボル 検証項目
```

という使い方のようです。

## ・assert_select
こいつの登場は[3.4.1 タイトルをテストする (Red)](https://railstutorial.jp/chapters/static_pages?version=5.1#sec-testing_titles)です。
この説明は
>このテストで使っているassert_selectメソッドでは、特定のHTMLタグが存在するかどうかをテストします (この種のアサーションメソッドはその名から「セレクタ」と呼ばれることもあります)。
```
assert_select "title", "Home | Ruby on Rails Tutorial Sample App"
```
上のセレクタは、<title>タグ内に「Home | Ruby on Rails Tutorial Sample App」という文字列があるかどうかをチェックします。

これは説明を読めば分かりますが、

```
assert_select "HTMLタグ" , "対象文字列"
```

と書くことでHTMLタグ内に対象文字列があればテストを通るようです。

また5章では

```test/integration/site_layout_test.rb
assert_select "a[href=?]", root_path, count: 2
```

のような使い方もしています
これはhrefの遷移先がroot_pathである項目が2つあるということです。

#まとめ

- validation 

```
validates シンボル 検証項目
```

指定シンボルが検証項目を満たしていたらテストを通る。

- assert_alert :

```
assert_select "HTMLタグ" , "対象文字列"
```

HTMLタグ内に対象文字列があればテストを通る。


#参考
Railsバリデーションまとめ
https://qiita.com/shunhikita/items/772b81a1cc066e67930e#%E5%8F%82%E8%80%83

Active Record バリデーション
https://railsguides.jp/active_record_validations.html

assert_selectの使い方
http://d.hatena.ne.jp/zariganitosh/20080405/1207455670
TensorFlowアルゴリズムの一般的な流れ②

前回の続き
一連の流れ[引用元(1)]
①デ―タセットをインポートまたは生成
②データを変換/正規化:fist_tone4:
③データセットをトレーニングセット、テストセット、検証セットに分割する
④アルゴリズムのパラメータを設定:taco:
⑤変数とプレースホルダーを初期化
⑥モデル構造を定義:flag_ag:
⑦損失関数を設定
⑧モデルの初期化とトレーニング
⑨モデルを評価:sunny:
⑩ハイパーパラメーターをチューニング
⑪デプロイと新しい成果指標の予測
これが全然わからんと。③からやっていく。:raised_hand:

##③データセットをトレーニングセット、テストセット、検証セットに分割する。
データセットをトレーニングセット(このトレーニングセットデータを自分達が使おうって考えた機械学習アルゴリズムに入れて、自分たちのモデルのトレーニングに使おうってことらしい。モデルさん:ok_woman_tone3:に何をしてあげればよくなるか訓練させるための部分て感じでいいんかな)、テストセット(さっきのトレーニングしたモデルさんのほんとの理想姿:information_desk_person_tone2:があるところ。このテストセットデータのモデルさん:information_desk_person_tone2:とトレーニングセットのモデルさん:ok_woman_tone3:を近づけたいとのこと)、検証セット(これはトレーニングセットがうまくモデルさん:ok_woman_tone3:を良くしているか検証してくれるぽい。テストセットでそれをやろうとすると答えで検証しちゃってるから既知の値には精度が良くなるけど、未知の値に対しても精度よくなるか不明になる。だから検証セットを使う。1を聞き1,2くらいしか知れない、機械学習)に分割する。分割ってどんな比率で分割するんだろね。6:2:2くらいらしい



##④アルゴリズムのパラメータを設定。
アルゴリズムはあれ、コンピュータの計算方法的な。
パラメータは外から入ってくる値のことらしく、中の値に影響を与えるもの事らしい。
ってことでアルゴリズム(コンピュータの計算方法)のパラメータ(外から中に影響を与える部分)の設定をいじる。
learning_rate(学習率かな),batch_size(ひとまとまりのサイズ),iterations(反復て翻訳出てきた)
これらの事らしい　詳しくはまたどこかでやる。


##⑤変数とプレースホルダを初期化
変数は値が変わっちゃうやつ、定数じゃない。変数はさっき③で書いたアルゴリズムのパラメータだって。
プレースホルダとは=実際の値を後から挿入するために、とりあえず確保した場所のこと。まだ正確な値が分かってないときに使う。
ふむ学校行く準備するか今日はここまで

(1):「Pythonベースの活用レシピ60+ TensorFlow 機械学習クックブック　2017年」p3-5
AmazonAWSのt2.micro上にTensorFlowの開発環境を構築するまで

# はじめに
　今まで、TensorFlowをローカルのPC（MacBook early 2016）で遊んでたんですが、GPGPUを使った処理をしたかったこともあり、AWS上で動かすことにチャレンジしました。
　本来であれば、GPU利用可能なg2.2xlarge等のセッションを作るべきだったのですが、AWSを利用することが初めてだったということもり、まずは無料のt2.microのセッションを作成して、そこでTensorFlowを動かすことから始めました。
　思ってたよりハマったので、備忘録のために投稿します。

# 利用したAWSのセッション
　無料利用枠のt2.microをオプションなしで選択。OSはUbuntuを選択しました。

# pipのインストール
　Ubuntuなので、pipは以下のコマンドでインストールします。これは、普通に大丈夫でした。

```ruby:pipをインストールするためのコマンド
sudo apt-get install python-pip
```

# ロケール変数の設定
　通常の`pip install モジュール名`というコマンドでは、エラーが出て無理でした。TensorFlowだけでなく、Numpyも同様のエラーが出てインストールできず。
　調べてみたところ、ロケール変数というパラメータが悪さをしているようなので、`export LC_ALL=C`というコマンドで対処します。Numpyはこれでインストールすることができました。

```ruby:Numpyをインストールするためのコマンド
export LC_ALL=C
pip install numpy
```

# TensorFlowのインストール
　ただし、それでもTensorFlowはインストールすることができませんでした。最終的に、TensorFlowは、pip3を使ってPython3用のものをインストールしました。


```ruby:TensorFlowをインストールするためのコマンド
sudo apt-get install python3-pip
pip3 install tensorflow
```

# pipでのインストールで出るエラーについて
　ちなみに、TensorFlowをpipでインストールしようとすると、以下のエラーメッセージが出ますが、言われた通りにpipをアップグレードすると、pipコマンド自体が使えなくなってしまうので注意が必要です。


```ruby:TensorFlowをインストールするためのコマンド
You are using pip version 8.1.1, however version 10.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
```
WSL の起動ディレクトリを Windows の ホームディレクトリにする

wsl.exe の引数でカレントディレクトリが変えられるか調べてみたけどわからなかったので、起動後に強制的に変更。

既定では、`.bash_profile` がなかったので作って、そこで `cd` してみた。
ただ、`.bash_profile` があると、`.profile` が読まれないので、冒頭で source している。

```~/.bash_profile
source ~/.profile
cd /mnt/c/Users/${USER}
```

ぶっちゃけ、`.bashrc`, `.bash_profile`, `.profile` の使い分けがわかっていないので、コメント求む。

むしろ、引数オプションで出来たらうれしいので、そっちの方が知りたい。
Rails5でdeviseに新しいカラムを追加した時のcontrollerの書き方

ApplicationControllerに下記を追加するだけでした。

```rb
  before_action :configure_permitted_parameters, if: :devise_controller?

  private
    def configure_permitted_parameters
      devise_parameter_sanitizer.permit(:sign_up, keys: [:name, :avator])
      devise_parameter_sanitizer.permit(:account_update, keys: [:name, :avator])
    end
```
Deviseの新しいcontrollerを作ってコードを書く手もあるけど、こっちは未確認。

```
rails g devise:controllers users
```
【OpenCV】【Python】画像上に日本語のテキストを描画

もはや、タイトルが詐欺くさい気がしないでもないです。
OpenCV単体だと大変なのでPillow(PIL)を利用しております。

日本語テキストを描画しようとしたら、パッと思いつく範囲で
以下のような対応があります（大変な順に。。。
　・OpenCVのソースコードを修正しputTextをマルチバイト文字対応させる
　・日本語フォントの文字画像を用意し、対象画像に重ね合わせて描画する
　・日本語対応している他ライブラリに渡して描画する

今回はパッと表示したいだけだったので、Pillowを利用します。
ソースコードは以下。

```python:CvPutJaText.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import cv2 as cv
import numpy as np
from PIL import ImageFont, ImageDraw, Image

class CvPutJaText:
    def __init__(self):
        pass

    @classmethod
    def puttext(cls, cv_image, text, point, font_path, font_size, color=(0,0,0)):
        font = ImageFont.truetype(font_path, font_size)
        
        cv_rgb_image = cv.cvtColor(cv_image, cv.COLOR_BGR2RGB)
        pil_image = Image.fromarray(cv_rgb_image)
        
        draw = ImageDraw.Draw(pil_image)
        draw.text(point, text, fill=color, font=font)
        
        cv_rgb_result_image = np.asarray(pil_image)
        cv_bgr_result_image = cv.cvtColor(cv_rgb_result_image, cv.COLOR_RGB2BGR)

        return cv_bgr_result_image
```

使用例は以下。
今回はフォントに「[衡山毛筆フォント行書](https://webdesignmagazine.net/download/brush-japanese-free-font/ "【商用利用可】毛筆体の日本語フリーフォント26選")」を使用しております。

```python
if __name__ == '__main__':
    cv_image = cv.imread("sample.jpg")
    
    font_path = './font/font_jb004_running_brush_wi.ttf'
    
    image = CvPutJaText.puttext(cv_image, u"ごんべ", (30, 30), font_path, 60, (0, 0, 0))

    cv.imshow("sample", image)
    cv.waitKey(0)

```
![2018-06-20.png](https://qiita-image-store.s3.amazonaws.com/0/140207/f703d752-b36a-c1a2-60eb-66daf706fbb2.png)

以上。
激安SSD HIDISC HDSSD-SMIN120G を買ってみた、ベンチ測ってみた。

#導入
こんばんは。はにおかさいです。Macbook Airでubuntuを開発環境として使うために、SSDを安く調達したい。
変なメーカーは嫌だなと思い、ググったら「磁器研究所」から『HIDISC HDSSD-SMIN120G』なるものが出てたので買ってみました。(https://nttxstore.jp/_II_MA15879083)
あと、アマゾンでSalcar(セキ株式会社）の2.5inchSATAケースも買った。
#開封
箱はこんな感じ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245977/4cb26a39-d186-90cd-c60c-f5ac0eb9d4d5.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245977/f1bc6ada-c96d-6403-8832-474f4be6c718.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245977/0f76e87a-385a-d7bc-d8e8-ca658155b76b.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245977/d4573692-e6a3-fad9-ebb1-3cfdeca27de1.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245977/ec3e483f-1367-b4c9-3ae1-696ea4bc409c.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245977/d8f36a61-b900-421b-4306-2a015a72e8c5.png)
簡単にはめられます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245977/810dee9d-5723-e6f8-dcf5-e0e4c745184a.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245977/6eaafdc9-2962-7f0f-be70-19d82332f15c.png)
書き込み禁止という概念が用意されているようです
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245977/7d0ab24b-8713-8c02-40c3-d9fc567cd532.png)

気になったのは、ツーハンにはintelと書いてあるが、この画像ではMicronと書いてありますね。nandなのかコントローラなのか分解しないとわからない（禁止シールが貼ってある）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245977/4e4cf44a-95d7-ba86-251f-9d3b4261fff4.png)



#ベンチ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245977/fe8b9520-59d1-0175-d499-43630c853e4e.png)
USB3.0接続、macbook air 2015
read 330MB/s write 395MB/s 
ランダムも悪くないので、SDカード買うよりも良かったかなぁと。
#まとめ
Ubuntuを入れましたが、快適そのもの。流れるようにAPTが済みます。
非常に価格的に優秀です。どのくらい持つかはわかりませんが、保証も長いので何かあったら会社に問い合わせるか、、、
Twitterの広告で「GitHubでプルリクエスト数が多いプログラミング言語教えます！」みたいなのが流れてきたけど、聞く必要ないなーと思って5分ぐらいで調べてみた

~~なお該当のTweetは見失った模様。。~~

発見しました。↓
<img width="375" alt="hz.png" src="https://qiita-image-store.s3.amazonaws.com/0/51774/0f41fe5d-65e1-0200-60d4-b6f4257a77ad.png">
チャットボットである意味はよくわからないけど、なにやらエンジニア系の転職を斡旋してくれるサービスの模様。
「プログラミング言語のプルリクエスト数」というのは、各リポジトリで使われてるプログラミング言語別の、プルリクエスト数ということかしらん。。リポジトリ毎でもなく？ようわからんな。。

---

さして興味あるわけでもなかったけど、簡単に調べられないかなと思い以下の方法でやった。

# GitHubで人気のあるプログラミング言語
別にプログラミング言語じゃなくてもいいなと思って、とりあえずTrend上位のもので試した。

### Trend上位
GitHub→explore→Trendingで、こんな感じ
※2018/06/19調べ

![github-trend.png](https://qiita-image-store.s3.amazonaws.com/0/51774/ef6fbeb6-ca71-5e59-9171-7f34f23ce210.png)

上から、
[vuejs/vue](https://github.com/vuejs/vue)
[facebook/react](https://github.com/facebook/react)
[Netflix/pollyjs](https://github.com/Netflix/pollyjs)
[GeekyAnts/vue-native-core](https://github.com/GeekyAnts/vue-native-core)
[DovAmir/awesome-design-patterns](https://github.com/DovAmir/awesome-design-patterns)
が上位5個

# プルリクエストの数を簡単に調べる

それぞれブラウザでページ開いたら、opne/closed両方書いてある。
![page.png](https://qiita-image-store.s3.amazonaws.com/0/51774/6674c923-718e-e07e-3a01-f4340695b16a.png)

というわけで、なんかGitHubAPIとか使わなくてもcurlでいけんじゃね？と思い

```bash
$ curl -Ss "https://github.com/vuejs/vue/pulls" | egrep "Open|Closed" | grep -v "class"
      90 Open
      1,108 Closed
```
とれた。ちょちょっとシェルスクリプト書く。

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

URL=$1

echo "== ${URL} =="

PR=$(curl -Ss ${URL} | egrep "Open|Close" | grep -v "class")

OPEN_PR=$(echo -n "${PR}" | grep "Open" | awk '{print $1}' | sed "s/,//")
CLOSED_PR=$(echo -n "${PR}" | grep "Closed" | awk '{print $1}' | sed "s/,//")

echo "Open:${OPEN_PR}"
echo "Closed:${CLOSED_PR}"
echo "total:$((OPEN_PR + CLOSED_PR))"
```

```txt:list
https://github.com/vuejs/vue/pulls
https://github.com/facebook/react/pulls
https://github.com/Netflix/pollyjs/pulls
https://github.com/GeekyAnts/vue-native-core/pulls
https://github.com/DovAmir/awesome-design-patterns/pulls
```

# 実行
```bash
$ for TARGET in $(cat list) ; do ./get_number_of_pr.sh $TARGET ; done
== https://github.com/vuejs/vue/pulls ==
Open:90
Closed:1108
total:1198
== https://github.com/facebook/react/pulls ==
Open:83
Closed:6809
total:6892
== https://github.com/Netflix/pollyjs/pulls ==
Open:0
Closed:13
total:13
== https://github.com/GeekyAnts/vue-native-core/pulls ==
Open:2
Closed:3
total:5
== https://github.com/DovAmir/awesome-design-patterns/pulls ==
Open:0
Closed:12
total:12
```

そもそもTrend上位は別にpull requestが多いってわけでもないみたいだった。
reactが一番多いのかなー？

5分ぐらいでさっとやろって思ったけど、10分ぐらいかかったのでここで終わり。
Google Apps ScriptからTwitterのAPIを叩けなくなったら

# はじめに
TwitterWebService ライブラリ を使ってTwitterの情報を取得していたのですが、2018年6月13日から、情報取得できなくなっていました。Twitter側の仕様変更により、Callback URLを設定する必要が生じました。
今回、解決方法がわかったので記しておきます。

# 解決方法
TwitterのApplication ManagerでCallback URLに以下を追加する必要があります。

https://script.google.com/macros/d/{Google Apps ScriptのスクリプトID}/usercallback
【iOS】少しでも読みやすくなる為にこれだけは守ろう！

#型を書け
必ず書きましょう。複数行あるメソッド内で一つも型がないと何やってるか想像しにくいです。
メンバももちろん例外ではありません。

#selfをつけろ
メンバやメソッドにアクセスするときですね。"型を書け"と同じようにパッと見でわかるだけでだいぶ助かります。

#アクセスコントロールを書け
これも必ず書きましょう。privateなのかinternalなのかわかるだけで全然違います。
Swiftではデフォルトでinternalですが、省略せず書いたほうが意図して書いているのだとわかります。
最初はメンバ、メソッド共にprivateで定義して、必要になったらinternalにするのがいいでしょう。

#使ってないメソッドは消せ
使ってないメソッドを定義してるくせに中身は何もなかったり、どこからも呼ばれていなかったりするコードも結構見ます。特にdidReceiveMemoryWarningが残ったままのコードをよく見ますね。
消しましょう。

#コメントは想いを書け
いいコメントが思いつかないなら思ったことをそのまま書けばいいです。
"なんか知らないけどこう書いたら思い通りに動いたー"
↑でもないよりマシです。手を加えていいのだとわかりますから。

#おまけ
##　循環参照は避けよう
・delegateパターン -> メンバで保持するdelegateはweakにする
・クロージャ -> weak self でselfを参照する。

もうおまじないとして書いてもいいと思います。
cloud9とgitをつかってherokuにデプロイする。

```git init```　でフォルダを作る。

```git add -A```　で書き溜めたコード（ファイル）をそのフォルダに追加する。

```git commit -m "Initialize repository"```これはよくわかってないけど、やったほうがいいっぽい

一応bitbucketにコード入れとく

gemファイルを以下に変更

```source 'https://rubygems.org
gem 'rails',        '5.1.4'
gem 'puma',         '3.9.1'
gem 'sass-rails',   '5.0.6'
gem 'uglifier',     '3.2.0'
gem 'coffee-rails', '4.2.2'
gem 'jquery-rails', '4.3.1'
gem 'turbolinks',   '5.0.1'
gem 'jbuilder',     '2.7.0'

group :development, :test do
  gem 'sqlite3', '1.3.13'
  gem 'byebug',  '9.0.6', platform: :mri
end

group :development do
  gem 'web-console',           '3.5.1'
  gem 'listen',                '3.1.5'
  gem 'spring',                '2.0.2'
  gem 'spring-watcher-listen', '2.0.1'
end

group :production do
  gem 'pg', '0.20.0'
end

 Windows環境ではtzinfo-dataというgemを含める必要があります
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]```


 ```bundle install --without production```  gemをインすトール

```git commit -a -m "Update Gemfile for Heroku"```

```heroku --version```

```source <(curl -sL https://cdn.learnenough.com/heroku_install)```

```heroku login```

```heroku keys:add```

一通りやる

```heroku create```　ヘロクに特定のサーバーを作る。

```git push heroku master```その特定のサーバーにgitをpushすることで作ってたコードたちが反映される。



とおもっていたらいろいろエラーが出る。
herokuのsettings、deployをいろいろいじるとうまくいくことが分かった。
bildpackのrubyを選択する
deployの下のほうにあるコードたちをターミナルに順にぶち込む。


以上、よくわかってないけどデプロイできた話。
Javaでdocomo音声認識APIとGoogle Speech APIを使ってみた

学校での製作物に音声認識をさせて文字列化する、と言う機能を搭載させる為にライブラリ等を調べたところ、docomoとGoogleでAPIがあったので使って見ました。

## 準備
[docomo音声認識API](https://dev.smt.docomo.ne.jp/?p=docs.api.page&api_name=speech_recognition&p_name=api_amivoice_1#tag01)
Googleの音声認識APIを使うには以下のグループに参加必須とのこと
[Chrome-dev](https://groups.google.com/a/chromium.org/forum/?fromgroups#!forum/chromium-dev)
[Google Cloud Console](https://cloud.google.com/)

docomoとGoogle Cloud Consoleサイトでアカウントの作成(サインイン)しておいて下さい。
また、Google Cloud Consoleでは新規プロジェクトを作成し、APIライブラリ検索窓から**"speech"**と入力し、APIを有効化してください。
docomoではAPIKeyの申請をすると時間帯にもよるかもしれませんが、ものの数分で発行されます。

![Screenshot from 2018-06-20 00-59-27.png](https://qiita-image-store.s3.amazonaws.com/0/230050/68aba2ae-b165-a5c4-dea6-f6f3e67c1014.png)
(画像では既に有効化になっていますが参考までに。Chrome-devグループに参加するとこのAPIが出てきました)

## 実行結果
![Screenshot from 2018-06-20 01-01-53.png](https://qiita-image-store.s3.amazonaws.com/0/230050/35111695-7b93-fe25-2dff-560a6e488ca8.png)
上の文字列がdocomoで、下がGoogleです(実験途中のプログラムだったので変な表示の仕方で申し訳ないです)

ソースコードを[GitHub](https://github.com/gn5r/speech2text)に上げているので、ご参考までに。

ガバガバプログラムですが、勉強途中の身なのでどうか暖かい目で眺めて下さい。
Google音声認識の方は最初の1件目を取り出しています。
レスポンスボディには、3つほど候補が出てくるので各自で改変などしてみてください。
また、録音した音声を再生するプログラムも追加しましたので、認識がうまくいかないときは音声を確認して、ノイズが入ってないかどうか確認してみてください。

誤字脱字などありましたらコメントか編集リクエストの方をお願いします。
JDLA G検定(Deep Learning for GENERAL 2018 #1)を受験しました


#本ページ内容
第2回 JDLA G検定を受講致しました。
JDLA G検定とは？は公式ページにも載っていますので、割愛致します。
このページでは、事前知識がこれぐらいの人間が、これぐらいの時間こういう勉強しました、という一例を載せようと思います。次回以降の方に参考になれば。。

#事前知識
・理系院(修士)卒
微積分、線形代数は大学で学習済み、統計学はよくわからない。

・機械学習、人工知能、DeepLearningについて
　　- 社会人8年目　IT業界だが、AI関連の実務経験なし。
　　- CourseraにてAndrew Ng先生のMachine Learning、Deep Learning関連の講座は自学で修了済み
　　- コンサルチックなことをやっているので、ビジネス系の雑誌とか新聞とかWeb記事はよく読む。
　　　なんとなくどういう業界、企業でどういう実装例があるとかは把握してる
　　- 数式とかプログラミングはあまりわからない。というか苦手。

#勉強方法
せっかく勉強するので資格合格だけでなく、ある程度知らない人にも学んだ内容に関して説明出来るようにしたい、というモチベーションがあったので、Outputを特に意識しました。

**1．過去問調査　(1時間)**
まずは試験合格のための定石である過去問調査。
2017年から始まった試験のため、2018年6月時点では過去問集等は特になく。
"JDLA"　"G検定"等のワードで引っかかった第1回目を受講した方のページを一通り確認しました。
・　確認した内容とほとんど同じ問題が出ました。先駆者様たちに感謝。
・　JDLA公式ページの例題も確認必須。ちなみに例題の答えが欲しかったのですが、見つからずでした。(どうやら過去のJDLAニュースレターで配信されてたようですが、私は登録遅かったので情報見つからず)
・　自然言語処理の流れやっとけばよかったー的な記事を見たので、一連の流れを把握。
・　機械学習の方法を一通りググって、表にまとめてました。

**2.　推薦図書　”人工知能は人間を超えるか  (著)松尾　豊”　の 精読　(6時間)**
JDLA資格推薦図書の1つ”人工知能は人間を超えるか”の精読。
以前この本はさらっと読んだことがありました。
Outputを意識して4時間程集中して精読。読みながら自分で要点をまとめつつ、本読まないでも内容を説明出来ることを目標に進めました。細切れの移動時間で、思い出す作業をしていました。累積で2時間ほど。

**3.　推薦図書　”深層学習 機械学習プロフェッショナルシリーズ (著)岡谷 貴之”　さらっと？読み　(4時間)**
細かい数式の理解は飛ばして、主に太字で書かれている単語を重点的に、何が出来るものなのか、どういう特徴なのか、ということが説明出来るように努めました。
2時間集中して途中まで読み、また別日で2時間集中して最後まで読みました。

**4.　推薦図書まとめのページを基にOutput(2時間)**
シラバスに基づいて推薦図書の内容まとめをしてくだっさている神ページがありました。
[JDLA Deep Learning for GENRAL 2017（G検定）推薦図書まとめ](https://qiita.com/m2u/items/548bd59634bbf403cccf
)
こちらのページで、太字で書かれている内容のみ見る→自分で説明をOutput→内容を確認して答え合わせ　をやってました。
例えば**”トイプロブレム”**という単語のみ見て、それを説明し、答え合わせする、という流れです。細切れの時間でやり、累積で2時間ほど。

**5.　推薦図書　”AI白書　だらだら読み(5時間)”**
お風呂でだらだらとAI白書を毎日読んでました。個人的には内容が面白かったので苦も無く読み進められました。毎日30分ほどで2週間ほどかかったかと。
資格合格のためのみであれば、ピンポイントで辞書的に利用するのみで良いかと思います。

**勉強時間**
計　18時間ほど。
**1．過去問調査　(1時間)**
**2.　推薦図書　”人工知能は人間を超えるか  (著)松尾　豊”　の 精読　(6時間)**
**3.　推薦図書　”深層学習 機械学習プロフェッショナルシリーズ (著)岡谷 貴之”　さらっと読み　(4時間)**
**4.　推薦図書まとめのページを基にOutput(2時間)**
**5.　推薦図書　”AI白書　だらだら読み(5時間)”**

私の場合、CourseraにてAndrew Ng先生のMachine Learning、Deep Learning関連の講座修了済みであったことと、日々AI関連のビジネス情報はInputしていたことがAdvantageだったかと思います。
上記がない方だと、機械学習手法調べるで+2~3時間ほどかかるかと。
ただAI白書はだらだらと読んでいたので、試験出るとこに絞れば、AI白書は1~2時間程に出来るのではないかと。(完全に個人主観)

Outputを意識して勉強したので、しばらく学んだことは忘れない気がします。
全くIT系がわからないにもかかわらず、話を聞いてくれる専業主婦の嫁にヒマを見つけては説明してます。(感謝)

#試験結果
合格発表はまだですが、体感としては8割ほど解けた気がします。
→合格することが出来ました。

#総括
皆様書かれていますが、DeepLearningに特化している資格というよりは、機械学習含めた人工知能検定かなと。
プログラミング講座まとめ資料②

##コメント
ソースコード内にプログラムの動作に与えない記述をすることができます。それがコメントです。メモ書きだったり。デバッグコードをコメントアウトしたり使い方は人それぞれです。中にはプログラムの説明書にあたるドキュメンテーションコメントもあります。適切なコメントがかけるようになるのも上級者への一歩です。

##switch文
例）

```cpp
int count = 0;
switch(count){
    case 0:
        //countが0の場合の処理
        break;
    case 1:
        //countが1の場合の処理
        break;
    case 10:
        //countが10の場合の処理
        break;
    case 20:
        //countが20の場合の処理
        break;
    default:
        //どの条件にも当てはまらない場合の処理
}

```
switch文は条件分岐です。if文とは違い場合分けに適しています。上記の例と同じ処理をif文でも実装することができます。

```cpp
int count = 0;
if(count == 0){
    //countが0の場合の処理
} else if(count == 1){
    //countが1の場合の処理
} else if(count == 10){
    //countが10の場合の処理
} else if(count == 20){
    //countが20の場合の処理
} else {
    //どの条件にも当てはまらない場合の処理
}
```

ただし`count >= 10 && count <= 100`などの範囲指定は出来ないので少し工夫する必要があります。

##while文
例）

```cpp
while(/*条件式*/){
    //処理
}
```

whileはfor文と同じ繰り返し文です。条件が真の間に実行されます。

具体例）

```cpp
int num = 0;
while(num <= 100){
    num++;
}
```

`num`が100以下の間`+1`ずつされていくだけです。`100`になったらループを抜けます。

for文との明確な使い分けはありませんが、
繰り返し回数が決まっている ->　for文
繰り返し回数が不定        ->　while文
という感じで使用されます。よって上記の具体例はfor文の方が適していると言えます。


##continue文・break文
上記のswitch文、for文、while文などの内部でよく使われる文です。
意味は
continue文　残りの処理をスキップし、次のループ処理をする
break文　残りの処理をスキップし、処理を抜ける
です。

工夫して使うことで様々な処理ができるようになります。
switch文のcase内にbreak文があるのは処理が終わったら他の処理をせずに抜けるためです。なお、あえてbreak文を書かない手法もあります（フォールスルー）。ただしC#などの言語では禁止されていたりします。

##配列
配列はデータ構造の一種です。プログラム始めたての人に良く使われます。
用途としては数多くのデータを扱い格納したいという場合に使用されます。
例）

```cpp
int bar[100];    //要素数100のint型配列を用意
char name[20];   //要素数20のchar型配列を用意
int num[3] = {1, 2, 3};    //要素数3のint型配列を用意し、各要素を初期化
```

例えば、10人分のテストの点数を格納する変数が必要だとします。その場合

```cpp
int score1, score2, score3, score4, score5, score6, score7, score8, score9, score10;
```
とやるのはとても手間がかかります。これが1000人になったら到底人力では無理です。
しかし配列を使用すれば一瞬でできます。

```cpp
int score[1000];
```

使い方は
`型名　変数名[要素数]`
です。
中身にアクセスするには
`変数名[要素番号]`
でアクセスします。要素番号は0から始まります。

```cpp
int score[3];
score[0] = 0;
score[1] = 0;
score[2] = 0;
```

```cpp:よくあるミス
int hoge[10];

hoge[10] = 10;    //hoge[9]が最後の要素なのでエラー
```


##二次元配列
詳しくは配列の配列です。エクセルのセルをイメージするのが分かりやすいと思います。

| 1 | 2 | 3 | 4 | 5 |
|:-:|:-:|:-:|:-:|:-:|
|[0][0]|[0][1]|[0][2]|[0][3]|[0][4]|
|[1][0]|[1][1]|[1][2]|[1][3]|[1][4]|
|[2][0]|[2][1]|[2][2]|[2][3]|[2][4]|
|[3][0]|[3][1]|[3][2]|[3][3]|[3][4]|
|[4][0]|[4][1]|[4][2]|[4][3]|[4][4]|

使い方は横for文と縦for文を回すのが一般的だと思います。

```cpp
int hoge[5][5];

for(int i = 0;i < 5;i++){
    for(int j = 0;j < 5;j++){
        hoge[i][j] = 0;
    }
}
```

##変数名
おまけですが変数名について少し書いておこうと思います。
変数名はとても大切なものです。小規模なコードの場合適当な名前でもなんとかなりますが、規模が大きくなるにつれ変数の数が増えていき、後で見直した時なにこれ？という自体になります。そうならないためにも最初のうちからちゃんとした変数名を意識した方がいいです。基本的に変数名には英単語などを使うのがいいと思います。「fukaisisuu」などのローマ字名変数はやめたほうがいいです。困ったらgoogle翻訳などのサービスを使う手もあります。
ループなどには`i, j, k`を使う習慣があります。
他にも言語によって習慣が違ったりするものもあるので気になる人は是非調べてみてください！
GitLab CI + GitLab Pages + Hugo を使ってドキュメント管理環境を構築する

# はじめに

手順書等のドキュメントを Markdown で書いて Git でバージョン管理したい！
でも、周りの方が必ずしも Markdown や Git 
に明るくなかったり、Markdown → PDF 等に変換しても結局それを配るのが手間だったり。。。

そこで、

* Markdown で書く
* GitLab でバージョン管理する
* 静的サイトとして GitLab Pages にホスティングする
	* ファイルが更新されたら自動でサイトも更新
	* サイトから簡単に編集できる

という環境を今話題の(もう落ち着いたかな？) GitLab + GitLab CI (+ 静的サイトジェネレータの Hugo)を使って作ってみます。

# サンプル

以下に公開していますので、参考になれば。

* [サンプルリポジトリ](https://gitlab.com/otuhs_d/hugo-sample)
* [サンプルサイト](https://otuhs_d.gitlab.io/hugo-sample/)

# 環境

* Mac OS 10.13.4
* GitLab.com

# Hugo のインストール

まずは Hugo をインストールします。

```bash
$ brew install hugo
```

# Hugo サイトの生成

新規ディレクトリを作成して、そこで Hugo サイトを生成します。

```bash
$ mkdir hugo-sample
$ cd hugo-sample
$ hugo new site .
```

# Hugo テーマのインストール

Hugo はサイトの目的に応じていろんなテーマを適用させることができます。
[Hugo themes website](https://themes.gohugo.io/) の中から、今回はドキュメント用ということで `Documentation` タグの付いたものから選びます。

なんとなく気に入ったので、[Docdock](https://themes.gohugo.io/docdock/) を適用することにしました。

ではさっそく、Git のサブモジュールとして Docdock をインストール & イニシャライズします。

```bash
$ git init
$ git submodule add https://github.com/vjeantet/hugo-theme-docdock.git themes/docdock
$ git submodule init
$ git submodule update
```

# コンフィグの設定

まずはサンプルサイトをプロジェクトルートにコピーします。

```bash
$ cp themes/docdock/exampleSite/* .
```

次に、`config.toml` を編集します。

```toml:config.toml
baseURL = "https://otuhs_d.gitlab.io/hugo-sample"

languageCode = "en-us"
DefaultContentLanguage = "en"
title = "DocDock Documentation"
theme = "docdock"
# themesdir = "../.."
pygmentsCodeFences = true
pygmentsStyle = "monokailight"

...

[params]
editURL = "https://gitlab.com/otuhs_d/hugo-sample/edit/master/content/"

...
```

* 1 行目の `baseURL` をホスティングする GitLab Pages の URL に書き換える
    * 具体的には、`https://"自分のユーザー名".gitlab.io/"プロジェクト名"`
* 6 行目の `theme` を `docdock` に書き換える
* 7 行目をコメントアウトする
* 31 行目の `editURL` を GitLab の編集ページの URL に書き換える
    * 具体的には、 `https://gitlab.com/"自分のユーザー名"/"プロジェクト名"/edit/master/content/`


# .gitlab-ci.yml の作成

GitLab CI て動かすジョブは `.gitlab-ci.yml` に定義します。
今回でいうと、push されるたびに Hugo サイトを更新(生成)するというジョブです。

```yaml:.gitlab-ci.yml
image: registry.gitlab.com/pages/hugo:latest

variables:
  GIT_SUBMODULE_STRATEGY: recursive

pages:
  stage: deploy
  environment: production
  script:
  - hugo
  artifacts:
    paths:
    - public
```

# GitLab に Push

あとは push してあげれば、GitLab CI のジョブがはしり、GitLab Pages にサイトがホスティングされます。
URLは、`Settings` > `Pages` から確認できます。

![スクリーンショット 2018-06-20 0.28.54.png](https://qiita-image-store.s3.amazonaws.com/0/222294/e468cb5d-54bb-2901-8853-a6ab6e19c54e.png)

> **Note:**
> GitLab CI のステータスやログは、`CI/CD` > `Pilelines` または `Jobs` から確認できます。

# コンテンツの編集

もちろんローカルでファイルを編集して push して...としてもいいのですが、各ページ下部の `Improve this page` から GitLab の編集ページへ飛ぶことができます。（`config.toml` の `editURL` を変えたのはこのためです）

Git に慣れていない非エンジニアの方でも簡単に修正できて非常に便利だと思います。

![スクリーンショット 2018-06-20 0.33.34.png](https://qiita-image-store.s3.amazonaws.com/0/222294/13cfc2ec-8cc0-f200-13fa-73fbefbcd9ef.png)

Hugo のお作法的なところや、新規ページの作成方法などの詳細はここでは省きます。
基本的には `content` ディレクトリ以下にサブディレクトリを切って、その中に Markdown ファイルを置いていく形になります。

# おわりに

とりあえず始めてみる！というところまで説明してみました。いかがだったでしょうか？
私自身 Hugo 触りたてで分かりづらいところも多かったと思いますが、お役に立てれば幸いです。
Jest のDescribe, Before, Afterの実行順序

jestの`describe`, `it`, `beforeEach`の実行順序がよく分からなかったので確認した

## version
jest: 23.1.0

## まとめ

describeに書かれたコードが最初に実行される。
before, afterはitの実行前後に呼ばれるみたい。

## 確認

```javascript

beforeAll(() => {
  console.log('outer before all')
})

beforeEach(() => {
  console.log('outer before each')
})

afterEach(() => {
  console.log('outer after each')
})

afterAll(() => {
  console.log('outer after all')
})

describe('some class', () => {
  console.log('describe some class')
  beforeAll(() => {
    console.log('inner before all')
  })

  beforeEach(() => {
    console.log('inner before each')
  })

  afterEach(() => {
    console.log('inner after each')
  })

  afterAll(() => {
    console.log('inner after all')
  })

  describe('some function', () => {
    console.log('describe some function')
    it('some expectation', () => {
      console.log('execute')
    })
  })
})
```
コンソール

```shell

 PASS  ./index.test.js
  some class
    some function
      √ some expectation (8ms)

  console.log index.test.js:18
    describe some class

  console.log index.test.js:36
    describe some function

  console.log index.test.js:2
    outer before all

  console.log index.test.js:20
    inner before all

  console.log index.test.js:6
    outer before each

  console.log index.test.js:24
    inner before each

  console.log index.test.js:38
    execute

  console.log index.test.js:28
    inner after each

  console.log index.test.js:10
    outer after each

  console.log index.test.js:32
    inner after all

  console.log index.test.js:14
    outer after all

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        3.106s
```
GitBucketを使ってみる

# GitBucketを使ってみる

GitBucketとは、日本人が作成したGitHubライクアプリである。
GitBucketは、Scalaで実装されたオープンソースのGitサーバで導入が非常に手軽である。
例えば単純に利用するだけであれば、以下のような手順だけで良い。

1.GitBucketをダウンロードする。
http://takezoe.hatenablog.com/
2.GitBucketを実行する(Javaがインストール済みであること前提)。
```java -jar gitbucket.war```
3.GitBucketにアクセスする。
http://localhost:8080/

## DBを変更

GitBucketではデフォルトでH2というデータベースを使用しているが、
業務などで使用することを想定するのであれば、PostgreSQLやMySQLを使用することが推奨されている。
例えばPostgreSQLで設定する場合、createdbでDBを作成した後、
$HOME/.gitbucket/database.confの設定で以下のような感じに設定する。

```
db {
  url = "jdbc:postgresql://localhost/gitbucket"
  user = "test"
  password = "test"
}
```

DBごとの詳細な手順は以下のページに記載されている。

http://takezoe.hatenablog.com/entry/2016/07/16/025154

## リバースプロキシを使用

リバースプロキシを使用する場合、以下の3つの設定が必要である。

* GitBucket起動時の設定
* Apacheのプロキシ設定
* Gitbucketで設定

### GitBucket起動時の設定

GitBucketではデフォルトでルートのパスになる。
これを変更する場合は以下のように--prefixオプションを指定すれば良い。

```java -jar gitbucket.war --prefix=/mygitbucket```

ちなみにTomcat経由でも起動できるので、その場合はTomcatの設定でコンテキストパスを指定できる。

### Apache(Web)のプロキシ設定

Apacheでリバースプロキシの設定を行う場合、以下のように設定する。
(以下の例ではGitBucketのサーバのIPは172.17.0.2である)

```httpd.conf抜粋
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so

ProxyPass /mygitbucket/ http://172.17.0.2:8080/mygitbucket/
ProxyPassReverse /mygitbucket/ http://172.17.0.2:8080/mygitbucket/
```

### Gitbucketで設定

上記の設定まででも動くようだが、以下の設定を入れないと画面からリポジトリURLを取得する際などに元のURLが表示されるようだ。

1. 右上の自分のアイコンをクリックして、[System administraition]を選択する。
2. [System Settings]をクリックする。
3. Base URLを入力する。

## 便利だと思ったオプション

|オプション例|説明|
|:--:|:--|
|--port=XXX|ポート番号|
|--prefix=/XXX|パス。|
|--max_file_size|アップロード可能なファイルサイズ。|
|--validate_password=false|パスワードの文字種制限。デフォルトではtrue。制限を解除するにはfalseで指定する。LDAPを使用するなら不要(その場合は画面から設定)。|
|--gitbucket.home|GitBucketのホームのパス。|

## その他

* MySQL8の場合はDBアクセスが正常にできなかった(5.7では問題なく動いたが)。
* MySQLをUTF-8に設定( https://shio-ax.hatenablog.com/entry/2017/10/20/141958 )。
canvasの使い方

# canvasの使い方とサンプル
- htmlで以下を用意

```html
<canvas id="stage"></canvas>
```

canvasのデフォルトサイズは、幅300px、高さ150pxになっている。

- jsでの使い方サンプル

```js
  // canvasのオブジェクト取得
  var stage = document.getElementById('stage');
  var ctx = stage.getContext('2d');
```

- 矩形をかく

```js
  // strokeStyle :線の色を指定
  // lineWidth   :線の太さを設定
  // fillStyle   :塗りの色を設定
  ctx.strokeStyle = 'blue';
  ctx.lineWidth = 10;
  ctx.fillStyle = 'green';
```

- 線をつける、色を塗る

```js
  // strokeRect(x,y,w,h) :枠線
  // fillRect(x,y,w,h)   :塗りつぶし
  // clearRect(x,y,w,h)  :くり抜き（消しゴムみたいな）
  ctx.strokeRect(0, 0, 100, 100);
  ctx.fillRect(0, 0, 100, 100);
  ctx.clearRect(0, 0, 100, 100);
```

- 矩形以外をPathを使ってかく

```js
  // 三角形の場合
  // 線を描くための点を用意して、線を引くイメージ？
  // beginPath  :現在のパスをリセット
  // moveTo     :始点に移動する
  // lineTo     :線を引くために座標を指定する
  // fill       :塗りつぶす
  // closePath  :線を繋げる？
  // stroke     :線をつける
  ctx.fillStyle = 'green';
  ctx.beginPath();
  ctx.moveTo(50, 50);
  ctx.lineTo(0, 100);
  ctx.lineTo(100, 100);
  ctx.fill();
  ctx.closePath();
  ctx.stroke();
```

- 円を描く

```js
  // arc(x,y,r(半径),start(開始角),end(終了角))
  ctx.arc(100, 100, 20, 0, 2 * Math.PI); //半径20pxの円
  // 円弧(120
  ctx.arc(100, 100, 20, 0, 2 * Math.PI / 360 * 120);  // 半径20pxで0度から120度の円弧
  // 円弧の状態で、円の中心から塗りつぶしをしたい場合は、moveToを利用する
  // 中心の座標にmoveToしてから、arcで円を作成して、fillで塗りつぶす
  ctx.moveTo(100, 100);
  ctx.arc(100, 100, 20, 0, 2 * Math.PI / 360 * 120);
  ctx.fill();
```

- グラデーション

```js
  // 円のグラデーション
  // createRadialGradient(x0, y0, r0, x1, y1, r1)
  // x、y:座標  r:半径 0:一つ目の円 1:二つ目の円
  // x0 y0座標から広がるr0の半径の円から徐々に　 x1 y1座標から広がるr1半径に色を変えていくという意味
  var g = ctx.createRadialGradient(100, 100, 0, 100, 100, 20);
  g.addColorStop(0.0, 'red');
  g.addColorStop(0.5, 'orange');
  g.addColorStop(1.0, 'yellow');
  ctx.fillStyle = g;
  ctx.beginPath();
  ctx.arc(100, 100, 20, 0, 2 * Math.PI);
  ctx.fill();
```


- 移動、拡大、回転

```js
  // translate  :移動
  // scale      :拡大
  // rotate     :回転
  ctx.translate(40,40);
  ctx.scale(2,2);
  ctx.rotate(Math.PI / 180 * 30);
```

- 影の設定

```js
  // shadowColor   :影の色
  // shadowOffsetX :x座標へのずれ
  // shadowOffsetY :y座標へのずれ
  // shadowBlur    :ぼかし具合
  ctx.shadowColor = 'rgba(0,0,0,0.3)';
  ctx.shadowOffsetX = 5;
  ctx.shadowOffsetY = 5;
  ctx.shadowBlur = 5;
```

- saveとrestore

```js
  // save、restoreを活用することで、部分的に適用したいスタイルをスマートにかける
  // 例えば上の例で影をつける設定があるが、これを適用すると設定したいところ以外にも影が適用されてしまうことがある。
  // そんな時にsaveとrestoreを使うことで、部分的に影を適用できる
  ctx.save();  // この時点までの設定を保存する
  ctx.shadowColor = 'rgba(0,0,0,0.3)';
  ctx.shadowOffsetX = 5;
  ctx.shadowOffsetY = 5;
  ctx.shadowBlur = 5;
  ctx.fillStyle = 'black';
  ctx.fill();
  ctx.restore();  //saveされた時点の設定を有効にする（save後に適用した設定は破棄する）
```

連続して描画することで動いているように見せるように扱う。
パラパラ漫画的なイメージ。
ちなみにPathを使う場合、beginPathを書き忘れるとひどいことになる。
パスのリセットがされないので、lineToでどんどんパス増やしちゃうみたい。
10ミリ秒で描画するような処理で書き忘れるとどんどん遅くなっていくのがわかる。（実際に試してみたというか、これを書いているときにやってしまって五分くらい悩まされた。）
I18nについて学ぶ_100DaysOfCodeチャレンジ4日目(Day_4:#100DaysOfCode)

## はじめに
この記事はTwitterで人気のハッシュタグ`#100DaysOfCode`をつけて、
100日間プログラミング学習を続けるチャレンジに挑戦した4日目の記録です。

## 動作環境
* ruby 2.4.1
* Rails 5.0.1

## 現在学習している内容のリポジトリ
https://github.com/yuta-ushijima/notebook-api-on-rails

## 本日学んだこと

* I18nの使い方

## I18nとは？

正式名称は、internationalization(:インターナショナライゼーション)。
18が使われている理由は、Iとnの間が18文字であることが理由らしいです。

## 設定方法

まずはGemfileに以下の記述を追加。

```
# Gemfile

gem 'rails-i18n', '~> 5.1'
```

その後`bundle install`を実行します。

次に、`config/initializers`ディレクトリ配下に`locale.rb`を作成します。

```
# config/initializers/locale,rb
 
I18n.default_locale = :ja
```

`I18n.default_locale = :ja`のように記述することで、デフォルトの言語を日本語に変更できます。

次に、`config/locales`ディレクトリ配下に、`ja.yml`を作成します。

試しに、「hello」を「こんにちは!」に変更して見ます。

```
ja:
  hello: "こんにちは!"
```

ここでのポイントは、インデント。`ja:`の下にある`hello`には半角2個分、`こんにちは！`と`hello:`には半角1個分のスペースが必要になるので注意です。

このインデントがしっかりしていないと読み込みエラーになってしまいます。

## rails consoleで試してみる

`bundle exec rails console`でコンソールを立ち上げて、これまでの設定がちゃんと有効になっているかどうか確認して見ます。

```
irb(main):008:0> I18n.translate('hello')
=> "こんにちは!"
```

うまく読み込んでくれていますね。

ちなみに、`translate`の部分は`t`に省略することも可能です。

```
irb(main):011:0> I18n.t('hello')
=> "こんにちは!"
```

また、現在のデフォルトロケールを確認するのには、`I18n.default_locale`を使います。

```
irb(main):010:0> I18n.default_locale
=> :ja
```

実際にアプリやAPIを開発する時には、`config/locales/ja.yml`に以下のリンク先になる内容をコピペした上で、内容をアレンジすると捗りやすいですね。

[日本語のlocaleファイル](https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/ja.yml)

## 【ちょっと応用編】日付の表示をYYYY/MM/DD形式にしてみる

ここまで学んだ知識を生かして、日付の表記を`2018/06/19`のようなYYYY/MM/DD形式にしてみます。

今回Contactモデルがあると仮定して、日本語ロケールに変換する`to_ja`メソッドを実装して見ましょう。

まずは、モデルに以下のようなコードを書きます。

```
class Contact < ApplicationRecord
  belongs_to :kind

  def to_ja
    { name: self.name,
      email: self.email, 
      birthdate: (I18n.l(self.birthdate) unless self.birthdate.blank?)
    }
  end
```

`self`の部分は、`Contact`モデル自身を指しています。

つまり、`name: self.name`は`name: Contact.name`を簡単にした書き方になっています。

`self.birthdate`の元々の戻り値は、`2018-06-19`のようなアメリカ表記の形式です。

`I18n.l`の引数に渡すことで、先で設定したロケールの表記に変換することができます。

したがって、`I18n.l(self.birthdate)`の戻り値は`2018/06/19`になりますね。

なお、`unless self.birthdate.blank?`の箇所については、「もしContactモデルのbirthdateが空でなければ」という意味。

全体を要約すれば、Contactモデルのbirthdateに値があれば`I18n.l(self.birthdate`を実行するということですね。

## 参考リンク

[すぐ忘れるので、RubyとRailsの日付操作周りについてまとめました](https://qiita.com/ykyk1218/items/d5086dcb7618d4f918ec)

[Rails国際化 (I18n) API](https://railsguides.jp/i18n.html)

[日本語のlocaleファイル](https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/ja.yml)

[【Ruby入門】nil?empty?blank?present?の基礎と応用！](https://www.sejuku.net/blog/20752)
AndroidのFirefox Custom Tabsを使ってみる


# はじめに
ChromeCustomTabsについては色々な記事で取り上げられているのですが、FireFoxCustomTabsについては調べたところ日本の記事では見つけれなかったのでちょっと使ってみました。

# 実装
実装と書きましたがChromeCustomTabsと同じ実装で起動できます。
ChromeCustomTabsでおなじみの`shared`の`CustomTabsHelper`を使用するとCustomTabsに対応したパッケージ名を取得することができます。ただ取得するパッケージ名に優先順位があり、FireFoxCustomTabsを使用したい場合は、Firefoxインストール後にデフォルトブラウザに設定する必用があります。直接自分でパッケージ名を指定しても大丈夫です。
今回はパッケージ名を指定して起動したいと思います。

まず実装方法は、ライブラリを追加して

```build.gradle
implementation 'com.android.support:customtabs:+'
```

あとはFirefoxのパッケージ名を指定するだけです。

```kotlin
val url = "https://www.yahoo.co.jp/"
CustomTabsIntent.Builder().build().apply {
    intent.`package` = "org.mozilla.firefox"
}.launchUrl(this, Uri.parse(url))
```

これで、FirefoxCustomTabsが立ち上がります。
Chromeの場合は、`"com.android.chrome"`で立ち上がります。


今回はパッケージ名を指定して起動させましたが、`shared`をインポートして`CustomTabsHelper`でパッケージ名を取得するとデフォルトブラウザを優先したりいい感じにパッケージ名を返してくれます。
CustomTabsHelperはgithubで中身をみるとわかりやすいです。（[CustomTabsHelper](https://github.com/GoogleChrome/custom-tabs-client/blob/master/shared/src/main/java/org/chromium/customtabsclient/shared/CustomTabsHelper.java)）

# 比較
### 見た目の違い


|Chrome|Firefox|
|---|---|
|<img src="https://qiita-image-store.s3.amazonaws.com/0/240643/aeacd623-4c27-c7a1-1386-b75e04c84aa2.png">|<img src="https://qiita-image-store.s3.amazonaws.com/0/240643/bada6de4-594b-b0ae-ff5c-1185b908ef2d.png">|

FirefoxだとPowered by Firefoxになります。
<img src="https://qiita-image-store.s3.amazonaws.com/0/240643/de763d58-f903-9db3-94ac-fb8fd26fc8b5.png" width=50%>

表示速度など比較するためにgifにしようとしたのですが、なかなかタイミング合わせるのが難しくて諦めました。体感的にはどちらが早いとかはわからなかったです。

# コード
Githubにあげました。
https://github.com/rmorimot/FirefoxCustomTabsSample

# おわり
　今回は`FirefoxCustomTabs`について書きましたが、他にもSamsung Internet Browserなども対応しているようですが、日本だとあんまり聞かない気がします。Galaxy端末などは初期でインストールされデフォルトブラウザになっていたりするかもしれないので、こちらのCustomTabsが起動するかもしれません。
　特にFirefoxを優先的にする必用などは用途が思いつきませんが、デフォルトブラウザに設定しているブラウザは普段からよく使っているブラウザだと思うので、セッションをそのまま使えるCustomTabsを使うときはChrome！！と決めつけないようにした方がいいかもしれません。
csplit でファイル分割

#はじめに
コマンドの出力結果を定期的に取得します。1ファイルに取得時間とコマンドの出力の組み合わせでファイルサイズが大きくなります。時系列での比較をするのにファイルを分割したくなるので、その方法を調べました。

#コマンドの出力取得例
ネットワークの状態変化を確認するのに、netstat -an を定期的に取得します。netstat.out に10秒間隔で出力されます。

```shell-session:netstat
$ while true
> do
> date +"%F %T" >> netstat.out
> netstat -an >> netstat.out
> sleep 10
> done
```

#ファイルの分割

以下が定期的に出力されることになります。

```text:netstat.out
2018-06-19 23:50:32
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN     
...
```

以下のコマンドで日付の部分を先頭にして分割することができます。

* -z .. 0 バイトのファイルができてしまったので指定しました。
* -f .. netstat を prefixにして分割ファイルを出力
* -n 3 .. suffix に使う数字の桁数 3 だと 000 から 999 まで、出来上がるファイル数で指定しておく。
    今回の場合だと grep "2018-06" netstat.out | wc -l で数を数えてから指定しました。

```shell-session:csplit
$ grep "2018-06" netstat.out | wc -l
41
$ csplit -z -f netstat -n 3 netstat.out /2018-06/ {*}
```


最初は grep で行数を確認して、この行数をもとに head と tail で取り出せないかと試行錯誤しまうところでしたが、探してみると見つかるもんですね。

```shell-session:grep
$ cat -n netstat.out | grep 2018-06
     1	2018-06-19 23:50:32
   852	2018-06-19 23:50:42
  1703	2018-06-19 23:50:52
  2554	2018-06-19 23:51:02
  3405	2018-06-19 23:51:12
  4256	2018-06-19 23:51:22
  5107	2018-06-19 23:51:32
  5958	2018-06-19 23:51:42
  6815	2018-06-19 23:51:52
  7672	2018-06-19 23:52:02
  8529	2018-06-19 23:52:12
```

#参考
[テキストファイルを任意の文字列で分割するには](http://www.atmarkit.co.jp/flinux/rensai/linuxtips/a072csplit.html)