OmniAICreator/Qiita-1.07M huggingface dataset:
Project Euler Q57 【平方根の近似分数】

Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。


## 問題
$2$の平方根は無限に続く連分数で表すことができる.
$\sqrt{2} = 1 + \frac{1}{2 + \frac{1}{2 + \frac{1}{2 + ... }}} = 1.414213...$

最初の$4$回の繰り返しを展開すると以下が得られる.

$1 + \frac{1}{2} = \frac{3}{2} = 1.5$
$1 + \frac{1}{2 + \frac{1}{2}} = \frac{7}{5} = 1.4$
$1 + \frac{1}{2 + \frac{1}{2 + \frac{1}{2}}} = \frac{17}{12} = 1.41666...$
$1 + \frac{1}{2 + \frac{1}{2 + \frac{1}{2 + \frac{1}{2}}}} = \frac{41}{29} = 1.41379...$

次の$3$つの項は$\frac{99}{70}, \frac{239}{169}, \frac{577}{408}$である. 第$8$項は$\frac{1393}{985}$である. これは分子の桁数が分母の桁数を超える最初の例である.

最初の$1000$項を考えたとき, 分子の桁数が分母の桁数を超える項はいくつあるか?

## アプローチ

$1 + \frac{1}{2} = \frac{3}{2}$
$1 + \frac{1}{2 + \frac{1}{2}} = \frac{7}{5}$
$1 + \frac{1}{2 + \frac{1}{2 + \frac{1}{2}}} = \frac{17}{12}$
$1 + \frac{1}{2 + \frac{1}{2 + \frac{1}{2 + \frac{1}{2}}}} = \frac{41}{29}$

を整理すると、

$a_1=1 + \frac{1}{2} =\frac{1+1}{1+1}+\frac{1}{1+1}= \frac{3}{2}$
$a_2=1 + \frac{1}{2 + \frac{1}{2}} =1+\frac{1}{1+\frac{3}{2}}=\frac{2+3}{2+3}+\frac{2}{2+3}= \frac{7}{5}$
$a_3=1 + \frac{1}{2 + \frac{1}{2 + \frac{1}{2}}} =1+\frac{1}{1+\frac{7}{5}}=\frac{5+7}{5+7}+\frac{5}{5+7}= \frac{17}{12}$
$a_4=1 + \frac{1}{2 + \frac{1}{2 + \frac{1}{2 + \frac{1}{2}}}} =1+\frac{1}{1+\frac{17}{12}}=\frac{12+17}{12+17}+\frac{12}{12+17}= \frac{41}{29}$

上記より$2<=n$に対して、

```math
a_n=\frac{2*a_{n-1}の分母+a_{n-1}の分子}{a_{n-1}の分母+a_{n-1}の分子}
```
となる。

$a_0=\frac{1}{1}$と定義すれば上記漸化式は$n=1$のときにも成り立つ。

## 解答

```bash
time seq 1000 |
awk -M 'BEGIN{s=b=1} {c=b+s;t=2*b+s;print c,t;b=c;s=t}' |
awk 'length($1)<length($2)' |
wc -l
153

real    0m0.515s
user    0m0.031s
sys     0m0.215s
```

アプローチができるかどうかがポイントですね。
また最初の`awk`で変数`c`と`t`を登場させてますが、`b`と`s`をそのまま計算してしまうと先に計算した方が反映されてしまうのでうまく計算できません。
その為、退避する必要があります。

## 答え合わせ
こちらのサイト様と一致していればOKとした。
http://kingyojima.net/pje/057.html
Doc2Vecを用いたWikipedia学習モデルの生成！Part1

<p>どうも〜。
私、社内の文章ファイルの自然言語解析を行っています。自然言語で機械学習を行うには、テキストをどのようにして数値化すればいいのかというのが最初に出てきます。N-gram、BoW、TF-IDF、LDAなどなど、テキストを数値化する方法は割と多いです。数年前からは、ニューラルネットワークを用いたWord2Vecというのも出てきました。
私のほうの解析でも、このWord2Vecを使った数値化を行って機械学習を行っておりますので、今回は、その方法を紹介しようかと思います。正確には、Word2VecではなくDoc2Vecという手法であり、Word2Vecの応用技術です。
ここでは、Word2VecやDoc2Vecの詳細については省きますので、理論などを知りたい方は、以下のリンクを参照して下さい。</p>

<p><a href="https://deepage.net/machine_learning/2017/01/08/doc2vec.html">Doc2Vecの仕組みとgensimを使った文書類似度算出チュートリアル</a></p>

<h2>開発環境</h2>

<ul>
<li>Ubuntu 16.04 LTS / 64bit</li>
<li>Python3.6</li>
<li>MeCab (形態素解析器)</li>
<li>gensim (自然言語処理ライブラリ)</li>
</ul>

<h2>Wikipediaの全記事の取得</h2>

<p><a href="https://dumps.wikimedia.org/jawiki/latest/">Wikipedia全記事</a></p>

<p>ここから、jawiki-latest-pages-articles.xml.bz2をダウンロードします。記事はXML形式になってます。</p>

<p>ダウンロードしたら以下のコマンドで解凍します。解凍すると容量がなんと11GB！</p>

<p><code>$ bzip2 -d jawiki-latest-pages-articles.xml.bz2</code></p>

<p>次に、Ruby製のツール「wp2txt」を利用します。このツールは、Wikipediaの全データ(XML)をテキストに変換してくれます。Ubuntu環境に「wp2txt」を用意するには、以下を実行して下さい。(Rubyのバージョンは最新のものを入れたほうが良いかもしれません。)</p>

<p><code>$ sudo apt-get install -y git</code></p>

<p><code>$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv</code></p>

<p><code>$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build</code></p>

<p><code>$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' &gt;&gt; ~/.bash_profile</code></p>

<p><code>$ echo 'eval "$(rbenv init -)"' &gt;&gt; ~/.bash_profile</code></p>

<p><code>$ source ~/.bash_profile</code></p>

<p><code>$ Ruby2.0.0-p647をインストール</code></p>

<p><code>$ rbenv install 2.0.0-p647</code></p>

<p><code>$ rbenv global 2.0.0-p647</code></p>

<p><code>$ gem install wp2txt</code></p>

<p>wp2txtをインストールしたら、以下のコマンドを実行してXMLをテキストファイルに変換します。変換にはかなりの時間がかかります。</p>

<p><code>$ wp2txt --input-file ./jawiki-latest-pages-articles.xml</code></p>

<p>wp2txtで変換するとテキストが複数のファイルに分割されて保存されます。これらを1つのファイルにまとめます。以下のコマンドを実行すると巨大なテキストファイル(5.7GB)ができます。</p>

<p><code>$ cat jawiki-latest-pages-articles-* &gt; wiki.txt</code></p>

<p>次に、テキストファイルを形態素解析して、テキストを分かち書きにします。形態素解析にはMeCabを使います。以下のコマンドを実行すると、分かち書きしたテキストファイル(6.6GB)ができます。(オプションでipadic-neologdを辞書指定しています。デフォルトの辞書でもできますが、ipadic-neologd辞書を使うと新語にも対応できるのでオススメです。)</p>

<p><code>$ mecab -O wakati -b 100000 -d /usr/lib/mecab/dic/mecab-ipadic-neologd wiki.txt -o wiki_wakati.txt</code></p>

<h2>次回</h2>

<p>今回はここまでにしておきます。Wikipediaの全記事を引っ張ってくるだけでもそれなりの労力がいることがご理解いただけたかと思いますｗ</p>

<p>いやホント、結構時間かかりましたからね〜。私のPCのCPUはCore i7 7700Kでかなりの高スペックなんですが、wp2txtの実行に2、3時間くらい要しましたし、mecabの処理にも1時間程要しましたよーorz なんで、皆さんがこれと同じことをやるとすると、半日以上はかかるんじゃないでしょうかね〜ｗｗ</p>

<p>ということで、次回は今回の続きのPart2を書こうかと思います。実は、WikipediaデータをそのままDoc2Vecで学習しようとすると................. まだまだ苦労がありますのでご期待下さいｗｗ</p>
Host（Windows）からvagrant内のMySQLに接続する


* MySQL Workbench 6.3
* Vagrant 
    * CentOS6
    * MySQL5


Host（Windows）からvagrant内のMySQLに接続できるよう設定をしていきます

# Vagrantfile

※ WindowsにMySQLをインストールしている場合、ポートが競合してしまうので「3307」にする

```
Vagrant.configure("2") do |config|

.
.

  config.vm.network "private_network", ip: "192.168.33.13"
  config.vm.network :forwarded_port, guest: 3307, host: 3307

.
.

end
```

# MySQLの設定

## 3307ポートで接続できるように設定


```bash
vi /etc/my.cnf
```

```
[mysqld]
port=3307
```

確認

```bash
service mysqld restart
netstat -ant
```

```
tcp        0      0 :::3307                     :::*                        LISTEN
```

## Hostから接続できるように設定

下記でアクセス可能にする
ユーザ: vagrant
パスワード: vagrant

```
mysql -u root 

CREATE USER vagrant;
# TCP/IPからログインできるように
GRANT ALL ON *.* TO vagrant@'%' IDENTIFIED BY 'vagrant';
# hostname localhostでログインできるように
GRANT ALL ON *.* TO vagrant@'localhost' IDENTIFIED BY 'vagrant';

FLUSH PRIVILEGES;
```

```
vagrant reload
```


![image.png](https://qiita-image-store.s3.amazonaws.com/0/33237/91a892a2-a4bc-f8fd-36d3-3bb9fe9d9d02.png)

※ 下記の組み合わせだとうまくいかなかった

* MySQL Workbench 8.0 
* Vagrant 
    * CentOS6
    * MySQL5
[メモ]突然ブラウザにERR_SSL_VERSION_OR_CIPHER_MISMATCHと言われた

# 事件発生
ある日サーバーにブラウザからアクセスすると

「このサイトは安全に接続できません
your.domain.to ではサポートされていないプロトコルが使用されています。
ERR_SSL_VERSION_OR_CIPHER_MISMATCH」

という表示がでて、接続されなくなっていました。(多少の文言の違いはあります）

インターネットで調べた結果、どうもこのエラーはSSLサーバー証明書回りのエラーらしいのでサーバーにログインして確認することに。

## 証明書の動作確認
そもそも証明書が動作しているかどうかを手で叩いて確認してみることにした。
opensslコマンドには s_client というモードがあり、ssl通信の疎通確認だけではなく、クライアント証明書と秘密鍵を指定できたり、証明書チェーンを表示できたいとかなりの便利コード。らしい。
とりあえずプレーンなまま確認してみる。

```console
# openssl s_client -connect your.domain.to
socket: Connection refused
connect:errno=111
```

エラーが返ってきた。
概要にすると「サーバーが開いてない」とのこと。


え？　サーバー？

## サーバーの動作確認
使っているHTTPサーバーはApacheだ。
そのためhttpdのサービス動作状況を確認してみた。

```console
# service httpd states
httpd is stopped
```

と、止まってる・・・:scream:

```console
# service httpd start
Starting httpd: (98)Address already in use: make_sock: could not bind to address [::]:443
(98)Address already in use: make_sock: could not bind to address 0.0.0.0:443
no listening sockets available, shutting down
Unable to open logs
                                                           [FAILED]
```

ところが、開始しようとすると443ポートはすでに利用されているため出来ないと言われてしまった。
ポートの動作状況を見てみる。

```console
# /usr/sbin/lsof -i | grep http
letsencry 21321    root    ~略~  TCP *:https (LISTEN)
```

letsencryとかいうのが利用している。

突然だが、サーバーの証明書はLet's Encryptを利用している。
この証明書は期限が非常に短く、細かいスパンで証明書を更新しなければならないため自動で証明書を更新するbotのようなものも存在している。
それがこれ。らしい（サーバーを建てた人に聞いた）

本来は深夜にこっそりと動作しているはずのそれが、何らかの原因で昼間にもhttpdの利用しているポートを専有してしまっているのが問題らしい。
強制終了してしまおう。

```console
# kill -9 21321
# service httpd start
Starting httpd:                                            [  OK  ]
```

問題なく起動した。
しかし、このままでは証明書が切れて結局再びエラーが出てしまうので、すでに用意されていた証明書を更新するボットを動かし、httpdを再起動したら完了だ。

## 結論
SSLそのものよりも、サーバー自体がきちんと動作をしているか確認すべし。

お粗末さまでした。
私達が開催しているCoderDojoとは似てるけどちょっと違ったプログラミングサークル

本稿は [CoderDojo Advent Calendar 2017](https://adventar.org/calendars/2184#list-2017-12-13) の13日目の投稿です。

（先日12日目の投稿は[こちらです](https://qiita.com/oosiman/items/4f98e673d6976d4f6267)）

大幅に遅れてしまい、大変申し訳ございません…

#まず私について
えーと、一応これから紹介するもの（ECoder’s）の主宰者側の人間です。（あっ、主宰者じゃないです。主宰者は[リンク先記事を書いたyuki384さん](http://scratch-yuki.hatenadiary.jp/entry/2017/12/15/124042)です）
あとは…私は小学生の頃かなりの頻度でCoderDojoKashiwaへ行っておりました。って事と、現在はCoderDojoJP非公式アプリだとか、ゲームだとか（現在ゲーム主体）絶賛製作中って事ですね。
（CoderDojoJP非公式アプリに関しては、来年のCoderDojo Advent Calendarで書きたいなぁと）

#では本題。
##ECoder’sってなにもんよ⁉️
yuki384氏が立ち上げた、江古田でやっているプログラミングサークルです。
まぁ、場所とか申し込みとかの詳細は[こちら](https://t.co/NKvr4JPbBN)に

たまぁにクリスマスプログラミング会みたいのもやったりする。
盛況でしたのでいつかまたこの事については

##具体的に何をするの⁉️Dojoとは何が違うの⁉️
大きな違いをいうと、

**メンターにあたる人がいない**

という事です。

ECoder’sは、年齢が近い子供達が集まり、教えあったりするという感じで運営しています。まぁざっくりいうと全員がメンターで全員が忍者という形ですね。（ECoder’sのSlackがあり、ECoder’sに来た人で運営に携わりたいという人がいた場合、その人はSlackに参加し、そこで企画などを話し合えるようにしています。）
そして、ECoder’s終了後の片付けなども参加者でやります。

##ざっくりまとめていうと
**子供達で運営しあって、子供達で質問しあって、子供達で発表しあう。いわゆるWeb上のScratchコミュニティが現実にでてきたような感じのもの**

（勿論yuki384さん、MarzYuzoさんの親御さん達の監修の元でやっております。かなり自由に運営させてくれるyuki384さん、MarzYuzoの親御さん達に感謝致します。）

#おまけ（今後）
・もしかしたらぱなき氏のおかげで、大阪展開する可能性が。その時点で江古田ではない事はつっこんではいけない

・**1/1 14:00頃公式サイトを正式公開する予定**（ここはこっそりCoderDojoKashiwaリスペクトだったり
【3分レシピ】巨大ファイル用の軽量テキストビューアをMac OSXで作る


![MoreOrLessTextViewer.png](https://qiita-image-store.s3.amazonaws.com/0/78776/6f37ec6d-bcb5-2bf1-1b98-71cf4c7b4972.png)

## TL; DR <sub><sup><sub><sup>（今北産業）</sup></sub></sup></sub>

:::note info
<sub><sup>シェル（ターミナル）を`AppleScript`で開いて `less` しているだけだよ！ Σ(￣□￣；） </sup></sub>
:::

1. macOS 標準の [Automator](https://ja.wikipedia.org/wiki/Automator) でアプリを作る。
1. アプリのアクションで AppleScript を使って シェル（POSIX）コマンドを叩かせる。
1. シェル・コマンドの内容は**ファイルを `less` で開いているだけ**。<br>でも超軽量で超快速に表示するよ！ :thumbsup: 

- [less](https://ja.wikipedia.org/wiki/Less) @ Wikipedia

## TS; DR <sub><sup><sub><sup><ruby>なんちゃって<rt>More or less</rt></ruby>テキスト・ビューアー・アプリのレシピ</sup></sub></sup></sub>

1. [Automator](https://qiita.com/search?q=Automator%E3%81%A8%E3%81%AF)を立ち上げ、アプリケーションの作成を選ぶ
2. 「ライブラリ」-「ユーティリティ」-「AppleScriptを実行」を追加する
3. 下記スクリプトを貼り付けてアプリを保存する
4. 「実行」を試して「Drag and drop a file.」と表示されたら出来上がり

### Less is more なスクリプト

```AppleScript
on run {input, parameters}

	if input is not in {{}, {""}, ""} then
		tell application "Terminal"
			set pathFileInput to POSIX path of input
			set cmd to "less -N \"" & pathFileInput & "\""
			reopen
			activate
			set tabCurrent to do script (cmd) in front window
			display dialog "Press 'q' to quit and 'h' for help."
		end tell
	else
		display dialog "Drag and drop a file."
	end if
	
end run
```

2018/03/04：`less`の`-iM`オプションを外し`less -N`のみにしました。`less` に [`-M`オプション](https://qiita.com/takc923/items/598a68c4684114ffb102#%E8%87%AA%E5%88%86%E3%81%8C%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E3%81%AE%E3%81%A9%E3%81%93%E3%82%89%E3%81%B8%E3%82%93%E3%82%92%E8%A6%8B%E3%81%A6%E3%82%8B%E3%81%AE%E3%81%8B%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B-m)を付けて、全体のどこらへんを表示しているのか確認できるようにしていたのですが、ファイル全体のサイズ（行数）をカウントをしてから触れるようになるため、Wikipedia などのギガ・サイズのファイルの場合、サクッと感が減るため外しました。

### 使い方

> 数百メガのテキスト・ファイルを、作ったアプリにドラッグ＆ドロップ

#### 基本操作

- `スペース`でページ送り、`Enter`で行送り、マウス or トラックパッドでスクロール
- 詳しく（ヘルプ）は `h` をタイプするか [Qiita で調べる](https://qiita.com/search?utf8=%E2%9C%93&sort=&q=less%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89)
- 終了は `q` をタイプして、ターミナルを終了する

### 所感

PHP のマニュアルのアーカイブ[（巨大なXMLファイル）の構文を見ようと Mac で開こうとしたら](https://blog.keinos.com/20171228_2982)重いのなんのって。Windows みたいに大きいファイルでもサクッと開くだけの手頃（無料）で軽量なテキスト・ビューアーが<del>探すのが面倒だった</del> なかったので、`less`コマンドに落ち着いたわけですが、どうせならアプリ（？）にしてみようと思って。
CodeRunnerエディタを使ってみた

# はじめに
寒くなってきましたね。こたつでMac開いてプログラミングをしたくなってくる季節ですね。
私は長いことemacsを愛用していますが、新しい言語をちょっと触ってみたい！ってときに、ちょっと書いてサクッと実行できる環境があったらいいなぁと思っていました。
そしたらですね、あったんですよ！!今回はその素敵なエディタの紹介です。

# CodeRunnerとは
![download.jpg](https://qiita-image-store.s3.amazonaws.com/0/165019/89668828-2875-11aa-e460-5d1d151b50ac.jpeg)

<img width="1007" alt="スクリーンショット 2017-12-28 10.48.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/165019/feb4dcad-67e9-b5f5-0ff6-93d49c542955.png">

CodeRunnerはプルダウンで使用言語をササっと切り替えられて、すぐ書けて、ワンクリックで実行できるエディタです。
このエディタがあれば、ちょっと書きたいと思ったらすぐ書けてすぐ実行できちゃうので素敵です。
しかし、残念なことにMac専用の有料アプリです。執筆時点で¥1,800でした。ですが、Macユーザであれば是非オススメしたいですね。¥1,800でこの環境が手に入るのなら安い安い(笑

# 対応言語
執筆時点での対応言語は下記です。これだけ豊富な言語をサクッと切り替えられて書けるなんて素晴らしいですね。

・AppleScript
・C
・C++
・Go
・HTML
・Java
・JavaScript(Browser)
・JavaScript(jQuery)
・JavaScript(Node.js)
・LaTeX
・Lua
・Markdown
・Objective-C
・Objective-C++
・Perl
・PHP
・Python
・Python3
・Ruby
・Rust
・Shell Script
・Swift

# 環境設定
本アプリはあくまでエディタなので、言語環境は別途構築する必要があります。ですがbrew installで大体導入できると思いますし、言語導入系の記事は色々あると思うのでここでは割愛します。

ここでは言語が導入できている前提で、CodeRunnerと連携させる設定を備忘として残しておきます。

- ツールバーのメニューから"CodeRunner" -> "Preferences"を選択
- 上部タブからLanguagesを選択
- Run Commandに実行コマンドを記述


<img width="597" alt="スクリーンショット 2017-12-28 11.18.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/165019/f0af722b-14a4-504e-6fec-dec31b980559.png">

環境変数のPATHを通す必要がある場合はAdvancedタブから設定できます。

<img width="506" alt="スクリーンショット 2017-12-28 11.21.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/165019/d256dd39-bc28-3023-99cd-760153865cae.png">

### Python3
pyenvでバージョン管理をしているのでRunCommandへの記述は下記のようになります。
`/Users/user/.pyenv/versions/anaconda3-4.4.0/bin/python $filename`

### Go
AdvancedのPATHに下記を追記
`/Users/user/go/bin`

RunCommandへ下記を記載。GOPATHを通した状態で実行する。
`GOPATH=$(brew --prefix go) go run $filename`

```bash:【備忘】zshrcの設定
# go path
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin
```
S3に空ディレクトリを掘るだけというしょっぱいスクリプト

S3にディレクトリなどないと何度言ry

aws s3 コマンドの `cp` や `sync` はなぜか空のディレクトリを作成しない。
新規のバケットでディレクトリ構成を初期化するのに困る。

# S3に空のディレクトリを作成するシェルスクリプト

```bash:s3mkdirp.sh
#!/bin/bash
set -e
S3API="/usr/bin/aws s3api"
#export AWS_ACCESS_KEY_ID=
#export AWS_SECRET_ACCESS_KEY=
#export AWS_DEFAULT_REGION=ap-northeast-1

if [ $# -lt 2 ]
then
  echo "Usage:  ${0} bucket dir [dir ...]"
  exit 1
fi

BUCKET=$1
shift

S3WK=/tmp/s3/$BUCKET
mkdir -p $S3WK
cd $S3WK
mkdir -p $@

for d in $(find * -type d)
do
  echo ${d}
  $S3API put-object --bucket $BUCKET --key ${d}/
done
cd - > /dev/null
rm -rf $S3WK
```

使い方は、最初の引数でバケット名を指定し、以降の引数でディレクトリ名を指定する。

```
$ ./s3mkdirp my.bucket.name aaa bbb/ccc/{ddd,eee}
```

バケット名に `s3://` など付けない
ディレクトリ名にルートの `/` など付けない。ていうか付けないで、おねがい。

途中階層も含め、すべてのディレクトリに対するオブジェクトが作成される
emmet.vimで、タグの最後にスラッシュをつける方法

# 手順
`empty_element_suffix`に設定を追加する。

# 設定

```:toml
[[plugins]]
repo = 'mattn/emmet-vim'
hook_add = '''
    let g:user_emmet_settings = {
                \ 'variables': {
                \ 'lang' : 'ja'
                \ },
                \ 'html': {
                \ 'empty_element_suffix': '/>',
                \ }
                \ }
    imap <expr><TAB>
                \ emmet#isExpandable()? emmet#expandAbbrIntelligent("\<tab>")
                \ :"\<TAB>"
'''
```

# ヘルプ
`:h emmet-define-tags-behavior`
機械学習論文読みメモ_111


[Rethinking Atrous Convosution for Semantic Image Segmentation](https://arxiv.org/abs/1706.05587)
本論ではatrous convolutionについて再考する。
Atrous convolutionは陽にfilterのFOVや出力のresolutionを制御可能な畳み込み構造で、
Semantic segmentationタスクに使われる。
本論では、多スケールの画像のsegmentationを行うために複数のatrous rateを用いて、
Atrous convolutionを並列、またはカスケードで接続した構造を提案する。
またこれを従来手法であるAtrous Spatial Pyramid Pooling moduleに適用し拡張し、
画像特徴をマルチスケールで抽出する事でglobal scaleのコンテクスト抽出を可能にした。
これによりDeepLabv3を作成した。

[Street-View Change Detection with Deconvolutional Networks](https://www.semanticscholar.org/paper/Street-View-Change-Detection-with-Deconvolutional-Alcantarilla-Stent/fd210d083941f438934e3009d4399030eafa6b26)
車両にマウントされたカメラから得られるstreet viewに対して構造的な変化検知を行う手法を提案する。
これは自動運転システムなどで使われる地図システムなどで地図の更新を行うに辺り重要な手法である。
本論では初めてmulti-sensor fusion SLAMとdense 3D reconstructionのパイプラインを繋げる手法となっている。
これはdeepnetを用いて２つのイメージペアを荒く結びつけ、その間でchange detectionを実現する。
学習にあたって必要な教師データを新たに作成し、それは既存の公開データと比較して大きなものと
なっている。

[Perceptual Adversarial Networks for Image-to-Image Transformation](https://arxiv.org/abs/1706.09138)
より一般的に画像タスクへ用いる事が可能なimage-to-image transformation手法としてPerceptuahl Adversarial Networks (PAN)を提案する。
PANはimage transformation networkとdiscriminative networkの２つのCNNから成り立つ。
Generative adversarial lossに加えて新たに提案するperceptual adversarial lossを組み合わせる事で、
２つのネットワークは交互学習を通して学習が可能である。
その学習を通して、discriminative networkは生成された画像と真値との差異を学習し、
一方Image transformation networkはdiscriminative networkで発見された差異を最小化するように
学習が行われる。
C++ Builder 10.2 Tokyo > IDE > Bug > TRichEditのLinesをTMemoのLinesにコピペすると余分な改行が入る

```txt:動作環境
RAD Studio 10.2 Tokyo Update 2
```

### 症状

`
lastname@software.com,lastname@software.com,lastname@software.com,lastname@software.com,lastname@software.com,lastname@software.com,lastname@software.com,lastname@software.com,lastname@software.com,lastname@software.com,lastname@software.com,lastname@software.com,
`

上記のような文字列を下記のLinesプロパティで使うことをしていた。

1. TRichEdit
2. TMemo

以下の手順を実施した。

1. TRichEditのLinesプロパティに上記の文字を用意
2. TRichEditのLinesプロパティを開きなおす
    - Ctrl+C
3. TMemoのLinesプロパティを開く
4. Ctrl+VでLinesプロパティを設定する


TMemoの方にはおかしな改行が入る。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/ca7274ca-2d23-91d1-6abe-161b80fe73d4.png)

### 原因

TRichEditのLinesプロパティをエディタで開いた時点で改行が入っている。
エディタで見やすいようにするため自動的に改行が付加されるのだろう。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/497eea78-127f-e54f-27c9-2cba70941271.png)
`rails` って打つのがめんどくさいのでaliasをいじった



`rails`って打つのがめんどくさいのでMacの`.bash_profile`(もしくは`.zshrc`)のaliasをいじりました。


## いじり方

Vimとか使って`~/.bash_profile`(iTermを使っている人は`~./.zshrc`を開いて下記を追加します


```
alias r='rails'
```

`source`コマンドを使って設定ファイルの読み込み

```
source ~/.bash_profile

もしくは

source ~./.zshrc

```

## これをしてなにが嬉しいのか

この設定をすると`r `と打つだけで`rails`と打ったことになります。

例えばrailsアプリのローカルサーバーを起動するとき

```
rails s
```

って打つところを

```
r s 
```

で実行できるようになります。

他にもirbを起動するとき

```
rails c

```

と打っていたところを

```
r c
```

っと打つことができます。

Railsアプリケーションの実装やっていると`rails`って打つ場面がかなり多いのでそれをできるだけ省略してみました。


##　実は、、、、

実はこの方法はRails開発車のdhhがやっていた方法なんですよね。

https://www.youtube.com/watch?v=n0WUjGkDFS0

この動画の中で使っていたりします。
もちろんrailsってちゃんと打っている時もあります。

誰かの参考になればなと。
Mackerelの通知設定の切り替えを行うrake taskを定義した

# 課題

システムのメンテナンスを行う前に、Mackerelの通知をOFFにしたい、終わったらONにしたいという要望がチームから上がっていた。

# 解決策

MackerelはAPIが公開されているので、それを使えばできるが、簡単にやりたかったのでgem mackerel-clientを使うことにして、rake taskを作った。

## 実装

### gemのインストール

Gemfileに以下を追加する。

```ruby:Gemfile
gem 'mackerel-client'
```

そして`bundle install`を実行。

### rake taskの設定

- MackerelのAPI KEYは環境変数に持つ
- monitor_idはrake taskの引数、もしくは環境変数に持つ

という方向で実装した。

```ruby:lib/tasks/mackerel.rake
require 'mackerel/client'

namespace :mackerel do
  namespace :notification do

    # Mackerelで指定されたmonitor_idの通知を変更する
    # @param [String] monitor_id Mackerelで設定されているmonitor_id
    # @param [Boolean] is_mute 通知を切る場合はtrue、行う場合はfalseを指定する
    def change_mute(monitor_id:, is_mute:)
      client = Mackerel::Client.new(mackerel_api_key: ENV['MACKEREL_API_KEY'])
      monitor = client.get_monitors.find { |monitor| monitor.id == monitor_id}
      if monitor.nil?
        puts 'Please set existing monitor_id.'
      else
        monitor.isMute = is_mute
        client.update_monitor(monitor.id, monitor)
      end
    end

    desc "Mute notification from mackerel by monitor_id"
    task :mute, 'monitor_id'
    task mute: :environment do |x, args|
      monitor_id = args.monitor_id || ENV['MACKEREL_MONITOR_ID']
      if monitor_id.nil?
        puts 'Please set monitor_id.'
      else
        change_mute(monitor_id: monitor_id, is_mute: true)
      end
    end

    desc "Unmute notification from mackerel by monitor_id"
    task :unmute, 'monitor_id'
    task unmute: :environment do |x, args|
      monitor_id = args.monitor_id || ENV['MACKEREL_MONITOR_ID']
      if monitor_id.nil?
        puts 'Please set monitor_id.'
      else
        change_mute(monitor_id: monitor_id, is_mute: false)
      end
    end
  end
end
```

### 実行する

dot_envを使っている場合は、.envファイルに追加すると指定が楽になる。

```
MACKEREL_API_KEY="PLEASE_INPUT_MACKEREL_API_KEY"
MACKEREL_MONITOR_ID="PLEASE_INPUT_MACKEREL_MONITOR_ID"
```

通知をオフにする場合

```bash
$ bin/rake mackerel:notification:mute
```

通知をオンにする場合

```bash
$ bin/rake mackerel:notification:unmute
```
C++ Builder 10.2 Tokyo > shortcut > Ctrl+Alt+P > ツールパレットの検索に飛ぶ | F12と組み合わせてマウスを使わないデザイン作業

```txt:動作環境
RAD Studio 10.2 Tokyo Update 2
```

フォームデザイン中にコンポーネントを追加したい。

### v0.1

手順

1. マウスでツールパレットの検索ボックスに移動
2. キーボードでフィルタ用のキーワード入力 (例: Rich)
3. RichEditを選択

マウスとキーボードの混合使用をどうにかしたい。

### v0.2

[ツールパレット](http://docwiki.embarcadero.com/RADStudio/Tokyo/ja/%EF%BC%BB%E3%83%84%E3%83%BC%E3%83%AB_%E3%83%91%E3%83%AC%E3%83%83%E3%83%88%EF%BC%BD)

> ［表示｜ツール パレット］のショートカット キーは Ctrl+Alt+P です。

手順

1. Ctrl + Alt + P
    - 検索ボックスに移動される
2. キーボードでフィルタ用のキーワード入力 (例: Rich)
3. RichEditを選択
4. F12
5. F12
   - 追加されたRichEditにフォーカスが移る
6. Shift + Ctrlを押しながら位置の調整
  
キーボードだけで複数のコンポーネントを配置するデザイン作業ができる。

マウスは必要になった時に適宜使う。
CentOS7でLaravle5.5 PHP7 mariadb apache 環境を構築

##概要
- vagrantのVM等の開発環境構築想定のため、権限、db、apache設定等は最低限です。

##環境
- CentOS 7
- apache 2.4
- mariadb 10.2
- PHP 7.1
- Laravel 5.5

##phpインストール

###EPELとRemiリポジトリ追加
```
sudo yum -y install epel-release
sudo yum -y install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
```

###PHP7.1インストール
```
sudo yum install --enablerepo=remi-php71 php php-cli php-devel php-common php-mbstring php-mysqlnd php-phpunit-PHPUnit php-pecl-xdebug php-gd php-pdo php-xml php-mcrypt  php-fpm php-opcache php-pecl-apcu php-xmlrpc php-intl php-xsl php-soap php-intl php-pecl-zip
```

###composerインストール
```
sudo php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
sudo php composer-setup.php
```

###Composerのコマンド登録
```
sudo mv composer.phar /usr/local/bin/composer
```

###Composer composer-setup.php削除
```
php -r "unlink('composer-setup.php');"
```
###パスを通す
```
sudo vi /root/.bash_profile
-----------------------------------
export PATH=$PATH:/usr/local/bin
-----------------------------------
※上記を追記
```

##Laravelインストール
```
composer global require "symfony/event-dispatcher"
composer global require "laravel/installer"
```

###アプリ用フォルダ作成
```
sudo mkdir -p /var/www/html/laravel
sudo chmod 777 /var/www/html/laravel/
```
###Laravelプロジェクト作成
```
composer create-project laravel/laravel /var/www/html/laravel --prefer-dist
```

###Laravelバージョン確認
```
cd /var/www/html/laravel
php artisan --version
```

##Apacheインストール
```
sudo yum　-y install httpd httpd-devel mod_ssl
```

##コンフィグ設定
```
sudo vi /etc/httpd/conf.d/vhosts.conf
--------------------------------------------------------
NameVirtualHost *:80

<VirtualHost *:80>
   DocumentRoot /var/www/html/laravel/public
   ServerAdmin webmaster@virtual.host
   ErrorLog logs/laravel-local-error_log
   CustomLog logs/laravel-local-access_log combined

   <Directory "/var/www/html/laravel/public">
       AllowOverride All
       Options MultiViews
       Require all granted

       Options FollowSymLinks
   </Directory>
</VirtualHost>
---------------------------------------------------------
※上記を追記
```

##起動
```
sudo httpd -t
※Syntax OKでれば良い

sudo systemctl restart httpd
sudo systemctl enable httpd
```

##mariaDBインストール

###リポジトリ追加
```
sudo  vi /etc/yum.repos.d/mariadb.repo
---------------------------------------------------------------------
# MariaDB 10.2 CentOS repository list - created 2017-05-25 08:12 UTC
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.2/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
---------------------------------------------------------------------
```

###mariaDB10.2インストール
```
sudo yum -y install MariaDB-server MariaDB-client
```
###設定
```
cd /etc/my.cnf.d
sudo  cp -p server.cnf server.cnf.original
sudo  sed -i '/^\[mysqld\]$/a character-set-server=utf8' server.cnf
```

```
sudo systemctl enable mariadb
sudo systemctl start mariadb
```

##アクセスして確認
http://127.0.0.1 
※Laravelの画面がでれば完了
The performance comparison between numpy and scipy

```python
import numpy as np
import time
import scipy
import scipy.spatial

def numpy_and_scipy(R,C,sm=0):
 print("====R:"+str(R)+",C:"+str(C)+"====")
 s = time.time()
 Z = np.random.random((R,C))
 X,Y = np.atleast_2d(Z[:,0], Z[:,1])
 D = np.sqrt( (X-X.T)**2 + (Y-Y.T)**2)
 if (sm): print(D)
 print("numpy_time:"+str(time.time() - s))
 s = time.time()
 Z = np.random.random((R,C))
 D = scipy.spatial.distance.cdist(Z,Z)
 if (sm): print(D)
 print("scipy_time:"+str(time.time() - s))

numpy_and_scipy(4,4,1)
numpy_and_scipy(10,5)
numpy_and_scipy(5,10)
numpy_and_scipy(400,400)
numpy_and_scipy(10,1000)
numpy_and_scipy(1000,10)
```
```
====R:4,C:4====
[[ 0.          0.24744957  0.39208288  0.37222202]
 [ 0.24744957  0.          0.1923926   0.33487354]
 [ 0.39208288  0.1923926   0.          0.25010424]
 [ 0.37222202  0.33487354  0.25010424  0.        ]]
numpy_time:0.0005698204040527344
[[ 0.          0.66546531  0.72838154  0.95408877]
 [ 0.66546531  0.          0.8761849   1.08838767]
 [ 0.72838154  0.8761849   0.          0.78060971]
 [ 0.95408877  1.08838767  0.78060971  0.        ]]
scipy_time:0.0003790855407714844
====R:10,C:5====
numpy_time:3.981590270996094e-05
scipy_time:2.574920654296875e-05
====R:5,C:10====
numpy_time:2.6226043701171875e-05
scipy_time:2.002716064453125e-05
====R:400,C:400====
numpy_time:0.004547834396362305
scipy_time:0.05216693878173828
====R:10,C:1000====
numpy_time:0.00023102760314941406
scipy_time:0.00028324127197265625
====R:1000,C:10====
numpy_time:0.016072988510131836
scipy_time:0.00795292854309082
```
* scipy is not always faster than numpy, but scipy might be more efficient in the matrix of more rows.

# Refs.
* [T](https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.ndarray.T.html)
* [time.time()](https://qiita.com/fantm21/items/3dc7fbf4e935311488bc)
* [デフォルト引数](https://qiita.com/hoxo_m/items/e0b13ee1cb60627d7b3f)

<!-- * [scipy install on cygwin](http://chiranoura.nobody.jp/articles/2015-06-30_01_how_to_install_scipy/) -->
vimのショートカットまとめ

# vimをかっこ良く使いこなしたい（願望）
|操作|示す内容|備考|
|:------|------|-------:|
|dib|カッコの中身を消してインサートモード|`b`はbrackets(カッコ)の意味|
|vib|カッコの中身を消してヴィジュアルモード||
C++ Builder 10.2 Tokyo > psapi.hを使う > #pragma comment(lib, "psapi.lib")は追加不要 (XE4から10.2Tokyoへの移行)

```txt:動作環境
RAD Studio 10.2 Tokyo Update 2
```

### 関連

- [c++ builder > アプリ使用メモリの確認 > GetProcessMemoryInfo()使用 > WorkingSetSize: DLLの使用分を含んだメモリ使用量](https://qiita.com/7of9/items/871a0189fabeb1365320)
- [c++ builder XE4 > psapi.hを使う > #include <paspi.h>以外に#pragma comment( lib, "psapi.lib" )を追加](https://qiita.com/7of9/items/fbf80cf310f84ce46c48)

XE4ではpaspi.hで定義されたGetProcessMemoryInfo()などを使うときにエラーが出ていた(上記リンク参照)。
そのエラー対策として`#pragma comment(lib, "psapi.lib")`を追加するようにしていた。

10.2 Tokyoでは`#pragma comment(lib, "psapi.lib")`を追加しなくても実行時エラーは出ないようだ。

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include <psapi.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    int LSize;
    PPROCESS_MEMORY_COUNTERS LProcessMem;
    int LMemUsed;

    LSize = sizeof(PPROCESS_MEMORY_COUNTERS);

    bool res = GetProcessMemoryInfo(GetCurrentProcess(), LProcessMem, LSize);
    if (res) {
        LMemUsed = LProcessMem->WorkingSetSize;
    }

    LMemUsed = LMemUsed / 1024; // to KB
    LMemUsed = LMemUsed / 1024; // to MB

    String msg = IntToStr(LMemUsed) + L" used";
	OutputDebugString(msg.c_str());
}
//---------------------------------------------------------------------------
```
ラズベリーパイ の Node.js で Lチカ

onoff というライブラリーを使って Lチカ を行ないます。
[onoff](https://www.npmjs.com/package/onoff)

ユーザーを gpio グループに所属させます。

```bash
sudo gpasswd -a uchida gpio
```

確認した Node.js のバージョンは、

```text
$ node -v
v14.17.6
```

onoff のインストール

```bash
sudo npm install onoff
```

ポート 16 の LED を ON

```js:led_on.js
#! /usr/local/bin/node
//
var Gpio = require('onoff').Gpio
var led = new Gpio(16, 'out')
led.writeSync(1)
```

ポート 16 の LED を OFF

```js:led_off.js
! /usr/local/bin/node
//
var Gpio = require('onoff').Gpio
var led = new Gpio(16, 'out')
led.writeSync(0)
```

ボタンが押されたら、LED を ON にするプログラム

```js:watch_button.js
#! /usr/local/bin/node
// ----------------------------------------------------------------
//	watch_button.js
//
//					Dec/28/2017
// ----------------------------------------------------------------
console.log('*** start ***')

var Gpio = require('onoff').Gpio,
	led = new Gpio(16, 'out'),
	button = new Gpio(6, 'in', 'both')
 
button.watch(function (err, value)
{
	if (err)
		{
		throw err
		}

	if (value)
		{ 
		console.log ('*** ON ***')
		}
	else
		{ 
		console.log ('*** OFF ***')
		}

	led.writeSync(value)
})
 
process.on('SIGINT', function () {
	led.unexport()
	button.unexport()
	console.log('*** end ***')
})

// ----------------------------------------------------------------
```
Bitbank.cc APIでphpを使って注文を出してみる

Bitbank.cc APIでphpプログラムで売買したいと思い調査しました。
https://docs.bitbank.cc/

phpのライブラリが用意されてなかったのでベタ書きしてみました。
ハマったのはnonce値はtime()ではなくmicrotime(true)*10000だったというあたりです。

```php:sample.php
// 設定
$coin = [
    'jpy' => 0,
    'btc' => 1,
    'ltc' => 2,
    'xrp' => 3,
    'eth' => 4,
    'mona' => 5,
    'bcc' => 6,
];
$pair = 'bcc_jpy';
$public_api_end_point = 'https://public.bitbank.cc';
$private_api_end_point = 'https://api.bitbank.cc/v1';
$api_key = 'ビットバンクで発行したAPIキー';
$api_secret = 'ビットバンクで発行したAPIシークレット';

// 最終プライスを取得
$url = "{$public_api_end_point}/{$pair}/ticker";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$result = json_decode($response, true);
$last_price = $result['data']['last'];
//var_dump($last_price);

// 自身のファンド情報を取得
$ch = curl_init();
$query_params = ''; // ?xxx=xxx&xxx=xxx
$url = $private_api_end_point . '/user/assets' . $query_params;
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$microtime = microtime(true) * 10000;
$text = $microtime . '/v1/user/assets' . $query_params;
$signature = hash_hmac('sha256', $text, $api_secret);
$header = [
    'Content-Type: application/json',
    'Accept: application/json',
    "ACCESS-KEY: {$api_key}",
    "ACCESS-NONCE: {$microtime}",
    "ACCESS-SIGNATURE: {$signature}",
];
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
$response = curl_exec($ch);
$result = json_decode($response, true);
$jpy_free_amount = $result['data']['assets'][$coin['jpy']]['free_amount'];
//var_dump($jpy_free_amount);

// 注文を出す
$query_params = [
    'pair' => $pair,
    'amount' => $amount,
    'price' => $last_price,
    'side' => 'buy', // 買い:buy 売り:sell
    'type' => 'limit' // 指し値:limit 成り行き:market
];
$ch = curl_init();
$url = $private_api_end_point . '/user/spot/order';
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($query_params));
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$microtime = microtime(true) * 10000;
$text = $microtime . json_encode($query_params);
$signature = hash_hmac('sha256', $text, $api_secret);
$header = [
    'Content-Type: application/json',
    'Accept: application/json',
    "ACCESS-KEY: {$api_key}",
    "ACCESS-NONCE: {$microtime}",
    "ACCESS-SIGNATURE: {$signature}",
];
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
$response = curl_exec($ch);
$result = json_decode($response, true);
//var_dump($result);
```

参考にさせて頂きました
https://qiita.com/bitrinjani/items/fff7e2bf6a2b8be6eac0
Ruby の coverage を使ってメソッドが呼ばれた回数を調べる

Ruby 2.5 の coverage では メソッドカバレッジを取得出来るようになったので、メソッドの呼ばれた回数を調べるコードを書いてみました。

チェック用のサンプルコード

```ruby:fizzbuzz.rb
def fizz
  "Fizz"
end

def buzz
  "Buzz"
end

def fizzbuzz
  "FizzBuzz"
end

1.upto(100) do |n|
  if n % 15 == 0
    puts fizzbuzz
  elsif n % 3 == 0
    puts fizz
  elsif n % 5 == 0
    puts buzz
  else
    puts n
  end
end
```

確認用のコード (RUBY_VERSION >= "2.5.0")
結果を見やすくするために [termianl-table](https://github.com/tj/terminal-table) を使用しています

```ruby:method_call_count.rb
require "coverage"
require "terminal-table"

Coverage.start(methods: true)
require_relative "fizzbuzz"
result = Coverage.result

rows = []

result.each do |filepath, coverage_data|
  filename = File.basename(filepath)
  methods = coverage_data[:methods]

  methods.each do |method_data, count|
    next if count.zero?

    defined_class, method_id, _from_row, _from_col, _to_row, _to_col = *method_data
    rows << [filename, defined_class, method_id, count]
  end
end

header = %w(filename defined_class method_id count)
rows.sort_by! { |e| -e.last }
table = Terminal::Table.new headings: header, rows: rows
puts table
```

実行結果

```console
.
.
# fizzbuzz.rb の結果が流れる
.
.
+-------------+---------------+-----------+-------+
| filename    | defined_class | method_id | count |
+-------------+---------------+-----------+-------+
| fizzbuzz.rb | Object        | fizz      | 27    |
| fizzbuzz.rb | Object        | buzz      | 14    |
| fizzbuzz.rb | Object        | fizzbuzz  | 6     |
+-------------+---------------+-----------+-------+

```

こんな感じで取得することが出来ました
link > これまで開発したコードを捨て、スクラッチから書き直す | セカンドシステム症候群 | 第一のシステム、第二のシステム、第三のシステム

### コードの書き直し

https://urashita.com/archives/3782

> 新しいコードから書き直して、テストして、リリースするのには、時間がかかる。その期間は、競合他社への贈り物となってしまう。なぜなら、新しいコードを書いている間中、新製品をリリースできないのだから。戦略的な変更や、マーケットのトレンドに対応した新機能の追加も出来ない。

どこかで聞いた話と思ったらJoel on Softwareさんの言葉だった。

### セカンドシステム症候群

「セカンドシステム症候群」という用語もある。

@ Coders at Work by Peter Seibel
> p106　セカンドシステム症候群
何か成功を収めた人たちが白紙状態から何でもしていいと言われたときに陥る。...それはあまりに野心的になって、限界を理解しないためです。...強い統制力をもって言う必要があるのです。「これは白紙状態ではない。すでにあるものの再実装だ。我々に分かっていることをやるのだ」

### 第一のシステム、第二のシステム、第三のシステム

@ UNIXという考え方 by Mike Gancarz

> 第一のシステムは、一人か、またはせいぜい数人からなる小さなグループで創られる
第一のシステムは無駄がなく俊敏な計算機だ
第一のシステムのコンセプトは人間の想像力を刺激する

> 「専門家」が、第一のシステムで証明されたアイデアを用いて第二のシステムを作る
第二のシステムは、委員会が設計する
第二のシステムはぜい肉がつき、遅い

> 第三のシステムは第二のシステムで「火傷」した人が作る
第三のシステムは、第一のシステムと第二のシステムの最良の特徴を組み合わせる

### 所感

フレームワークを変更する時、過去のテスト資産はどれほど残せるのだろうか?
新しいフレームワークのバグの状況はどうだろうか?
新しいフレームワークのパフォーマンスはどうだろうか?
新しいフレームワークの限界はどうだろうか？

色々検討することはあるだろう。

現在のような様々なフレームワークが登場する中では、適宜フレームワークを変更することになるのだろうか。
そのような場合、どのように変更することで、ユーザーにフレームワークの変更を気づかせないシステム移行をできるのだろうか。
無料のはずのGCEのf1-microインスタンスで11月だけ1円課金された理由


2017年3月からGCEのf1-microインスタンスが一人1台無料になりました。私自身3月からずっと起動したままで運用してきて10月まで無料で使わせてもらっていたのですが、下記の通り11月は1円を請求されていました。

<img width="708" alt="gcp-billing.png" src="https://qiita-image-store.s3.amazonaws.com/0/46856/ee7f70c2-dca3-caa0-fba8-784fcf63c669.png">

GCEのf1-microインスタンスは1ヶ月分（月の日数に応じて720時間もしくは744時間）のCPU利用が無料になるのですが、11月は721時間使っていたというのです。

## 課金された理由はサマータイムの終了

いい大人であれば1円くらい仕方ないなと思うところでしょうが、私は理由が気になって課金ログを確認してみました。すると、11/5だけ25時間分のCPUを使っていることがわかりました。**アメリカの11月第1日曜日はサマータイム終了の日なので、実際に1日が25時間あるのです。**

これがGoogleさんの意図通りかは不明ですが、おそらく考え漏れなんじゃないでしょうか。サマータイムって日本人の我々には実感がなくて面倒だなーと思いがちですが、慣れていそうなアメリカの方々にとっても厄介なものなんですね。

## まとめ

GCEのf1-microインスタンスは動かしっぱなしにしておくと完全無料ではなく、11月だけは1円を支払う必要があるようです（来年以降仕様が変わるかもしれませんが）。

私は以前「[GCEのf1-microインスタンスを真にタダで使う方法 - Qiita](https://qiita.com/hnw/items/a4e395d047b382e7dc5f)」という記事を書いたのですが、真にタダではないことがわかりました。皆さんいい大人なので1円払っていきましょう。
GCPのGCS上のデータをCloudSQLへインポートする方法と注意点

GCPのストレージサービス、GoogleCloudStrage上にあるCSVデータをCloudSQLへインポートするにはGoogleが提供しているAPIを使うと便利です。
https://cloud.google.com/sql/docs/mysql/admin-api/v1beta4/instances/import?hl=ja

以下、Pythonを使ったインポート処理。

```Python
# APIのインスタンス取得
credentials = GoogleCredentials.get_application_default()
service = discovery.build('sqladmin', 'v1beta4', credentials=credentials)
project = 'my-project'
instance = 'cloudsql_instance'

instances_export_request_body = {
  "importContext": {
    "kind": "sql#importContext",
    "fileType": "CSV",
    "uri": "path-to-strage",
    "database":"database",
    "importUser": "hogehoge",
    "csvImportOptions": {
      "table": "users",
      "columns": [
        "name", "tel", "fax", "email"
      ]
    }
  }
}

# 実行
request = service.instances().export(project=project, instance=instance, body=instances_export_request_body)
response = request.execute()

```
仕組みはシンプルで、用意されたプロパティに必要な値を定義していきます。
上の例では、テーブル「users」にある、カラム「name,tel,fax,email」をCloudSQLにインポートできます。


## 処理中はリクエストを受け付けない
ただし、インポート処理が終わりきらずにもう一度同じAPIを実行するとリクエストを受け付けてくれません。
エラーログを残してないのですが、`task is busy` のような返答で、ストックとかもされず拒否されます。データ量が多いと待たないといけない時間が長くなります。

対策としては自前でタスク管理するか、TaskQueueを使ってリトライさせる方法かなと思います。
github の プルリクエスト をコマンドから直接開く

先日以下の記事で git blame でプルリクエストを簡単に見つける方法が紹介されていました。

- [Kazuho's Weblog: git blameでプルリクエストの番号を表示する](http://blog.kazuhooku.com/2017/12/git-blame.html)

運用のフェーズが始まり、新しいチームにメンバーがジョインする時など過去の経緯を調べることが必要になることがあります。こういうときにコミットログやプルリクエストを見るというのはよくあると思います。
上記の記事でプルリクエストの番号を調査したあと簡単にプルリクエストを開く方法を紹介します。

## 前提

- hub コマンドをインストールしておきます。  
[github/hub: hub helps you win at git.](https://github.com/github/hub)


## git alias に設定し実行する

### git の alias を設定のため以下のコマンド実行

```
$ git config --global alias.openpr '!f() { hub browse -- pull/$1; }; f'
```

### 実行は以下のようにします。 501番のプルリクエストを開く場合

```
$ git openpr 501
```
【New Year Calendar】君はPhpStormのScratch機能を知っているか

**New Year Calendar 3日目**
New Year Calendarって何ぞという方はまず[こちら](https://qiita.com/endam/items/ee648fed2a31c0efd249)をご覧ください。

本日はPhpStormの話。

去年のPHP Advent Calendarで僕は[PhpStormおすすめプラグイン3選](https://qiita.com/endam/items/ce2e5647983090b5aff7)の記事を書きました。

Scratchというプラグインもこの記事内で紹介しました。
が、しかし実は今年に入ってアップデートされたPhpStormではデフォルトでこのScratch機能が備わってます。
https://www.jetbrains.com/help/phpstorm/scratches.html#create-scratch-file

プラグインさようなら。こんにちは新しいScratch :smiley:
#Scratchとは
プロジェクトとは関係ない場所で、一時的にコードや文章をメモし保存が出来る機能です。
Atomだと新しいファイルを作成した直後はuntitledというプロジェクトに属さないファイルとなり気軽にメモ書きが出来ますが、PhpStormだとScratchプラグインを導入することで同様のことが可能でした。
しかしPhpStorm2017.2のバージョンの頃からこのプラグインはPhpStorm本体に統合され、デフォルトでScratch機能を利用出来ます。

#どう使うの？
実際にやってみましょう。
任意のプロジェクトを開き、メニューの「File」→「New Scratch File」を選択してください。
ショートカットキー`⇧⌘N`でも可能です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/71113/914560a3-deb8-8610-9230-718122fd155a.png)

すると以下のようなポップアップが表示されます。
新しいScratchファイルをどの形式で開くか選択します。
(選択出来るファイル形式は非常に豊富)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/71113/97e3a5f7-c182-bdcf-203c-dc146bbb64d6.png)

試しにMarkdownを選択した後、適当に文字入力して保存してみます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/71113/41d68119-18b4-d035-d12e-a48d2527feac.png)

しかしここで思うのが保存したファイルを後でまた開く時はどうするか。
そんな時は左サイドバーのProject Tool WindowからScratchesを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/71113/50ef407c-9602-2c55-bc19-4be0e9b6ac92.png)

先程保存したmdファイルが表示されましたね。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/71113/aaaf8efa-6a5a-4e8b-7c8c-407417a9639c.png)

またScratchファイルが多くなってきた時に特定のファイルをすぐ開きたい時はサイドバーからだけではなく「Open Scratch List」の操作でScratchファイル一覧ポップアップを表示して選択して開くことも出来ます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/71113/008bba38-10ba-3839-ca73-7c222ca759db.png)

ただ「Open Scratch List」の操作はショートカットキーでのみ行えますので、Keymap設定画面でショートカットキーを設定しておきましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/71113/1b7a3296-0c3b-016e-5048-9216209a6a78.png)

以上、簡単ではありますがPhpStormではマストなScratch機能の紹介でした。
僕の場合メモ書きだけではなく,SQLやコードを整形する為に使ったりと多用しています。
皆さんもぜひ使ってみてください。
conohaのロードバランサーを使う時のコツ

conohaでロードバランサーを使う時、
メンテナンスが大変。
ということでコツを紹介。

#nginxにサーバー初期ドメインを設定しておく

サーバーvps設定に逆引きホスト名がある。

v150-95-222-25.a0d1.g.tyo1.static.cnode.io

これが俗にいうサーバーの初期ドメイン。

#nginxに設定

```

server {

listen 80;
server_name v150-95-222-25.a0d1.g.tyo1.static.cnode.io;
root /var/www/html/your.com/webroot/;
index  index.html index.php;



location / {
try_files $uri $uri?$args $uri/ /index.php?$uri&$args /index.php?$args;
}

location ~ \.php$ {
try_files      $uri =404;
fastcgi_pass   unix:/var/run/php-fpm.sock;
fastcgi_index  index.php;
fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
include        fastcgi_params;
}

}

//他、独自ドメインやらいつもの設定。

```

こんな感じ。
これでサブドメインをロードバランサーを使って複数台運営しててもピンポイントでサーバーにアクセスすることができるようになる。

#サーバーを立て直したい

外部DBを使っているとわざわざIPアドレスを指定しなければいけない。
サーバー削除 → サーバー構築ではIPアドレスが変わる。
そこで、サーバー再構築というメニューがあるので、それを使ってサーバーを立て直す。
そうすればIPアドレスを変更せずにサーバーの内容をまるっと再構築できる。


ちなみにサブドメイン設定をした nginx を他サーバーにコピーしていっても
正常に動作するので問題ない。
人工知能API「Wit.ai」で遊ぶ (1)

## はじめに
「Wit.ai」は無料の人工知能APIで、音声やテキストデータをインプットすることで何らかのアクションを起こすAIを簡単に作ることができます。
対応言語は、Node、Ruby、Python、C、Rust、Javaなど豊富なのが特徴で、iOS/Androidなどのスマートフォンデバイスに対応させる事も可能です。
今回の記事ではNode.js SDKであるnode-witを使って実際に作っていきます。

## まずは体験
下記のページを見てみてください。
https://labs.wit.ai/demo/index.html

<img width="1198" alt="スクリーンショット 2017-12-28 2.05.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/73643/3c0660db-9995-9791-a2a9-99343d875d62.png">

中央のマイクボタンを押下し、「Turn on the TV」と話しかけ、再度マイクボタンを押します。すると・・ 画面上のテレビのスイッチがつきました！
Wit.aiが音声データを解釈し、テレビのスイッチをいれたのです。これは応用次第で実際の生活にも組み込むことができそうです。


## Wit.aiに登録してみる
Wit.aiはGitHubアカウントもしくはfacebookアカウントで登録できます。

https://wit.ai/

<img width="1197" alt="スクリーンショット 2017-12-28 1.42.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/73643/6ba8106e-7daa-f554-9749-04d56e6dc358.png">

登録が終わったら、メニューバーの左端にある「＋」ボタンを押してアプリを登録していきます。

<img width="1196" alt="スクリーンショット 2017-12-28 1.41.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/73643/f300d478-3592-6d65-ad33-5018e5e9e3bc.png">

必要な情報を登録し、最後に画面下部にある「Create App」を押して登録を完了させます。

## Wit.aiに学習させる
アプリの登録が完了したところで、インプットするデータを実際に学習させていきます。
今回は先ほど扱った「Turn on the TV」という文章を入力してみます。「Test how your app understands a sentence」の下にあるフォームに入力してみてください。

<img width="974" alt="スクリーンショット 2017-12-28 2.38.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/73643/af460ae6-adc6-f907-82dc-d3d937a5fd2c.png">

Wit.aiにこの文章を学習させていきます。
が、その前に「インテント」と「エンティティ」という２つの概念を学ばなければなりません。

#### 「インテント」と「エンティティ」
インテントは与えられたデータの「意図」のことです。インプットされたデータがどのような処理を求めているかを判断するためのもので、上記の文章でいうと「Turn」に当たる部分です。
エンティティは「インテントの目的となるもの」です。「TV」がこれに相当します。また、その状態である「on/off」もエンティティに当たります。
Wit.aiに限らず、他の人工知能APIでも同様の概念が登場するので覚えておきたいところです。

では実際にこの「インテント」と「エンティティ」を学習させていきます。
まずはエンティティを登録していきます。
文章中の「on」の部分を選択して、「state」という名前でエンティティを登録します。
![Untitled.gif](https://qiita-image-store.s3.amazonaws.com/0/73643/65875f04-cc24-d006-af50-e57c022452f9.gif)

同様に「TV」の部分を選択して、「target」という名前で登録します。
すると以下のような状態になりました。エンティティは`state`と`target`を持ち、その値として`on`と`TV`をそれぞれ持っています。

<img width="967" alt="スクリーンショット 2017-12-28 3.30.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/73643/412757bb-e683-c1c1-6a1f-8699225adab6.png">

続いてインテントです。
「Add a new entity」から`intent`を選択して、Valueを「turn」として登録します。

![Untitled2.gif](https://qiita-image-store.s3.amazonaws.com/0/73643/8826a41f-66d0-35ad-eee9-5397c1c93b6f.gif)

そして最後に「validate」ボタンを押します。
これによってWit.aiはこの文章を解釈できるようになりました。

試しに一度フォームをクリアして、再度「Turn on the TV」と入力してみましょう。
さきほど登録したインテントとエンティティが認識されていれば成功です！

次回はnode-witを使ってコンソールからWit.aiにアクセスしていきます。
Vueでちゃんと作っていくにはElementUIよりBulmaの方が良くないか

Vueのアドベントカレンダーをウォッチしていてて、Nuxt.jsであるアプリを作っている途中です。
色々な記事でElementUIが取り上げられているので、私も使ってみましたが正直微妙になってきたので止めることにしました。

## 単体でレスポンシブのサイトは簡単に作れない。
ElementUIはUIパーツのライブラリです。
レイアウトも部品として影響していますが、提供している部品の数はさほど多くありません。
そして、モバイル向けに配慮した機能は全く提供されません。
そのため、レスポンシブ対応するためには、一からやるか他のCSSフレームワークを組み合わせる必要が出てくると思います。

## タイポグラフィ、レイアウトなどが簡単にできるわけではない
ElementUIはあくまでもUIライブラリです。
私はコレを最初に見た時、Bootstrapみたいだから簡単にきれいなレイアウトが整うんだろうなと思っていました。

#### しかし違った。
`class="text-center"`とだけ書いて中央寄せしたいけど、そういうものは提供されていません。
`<el-col/>`などの要素をラッピングするレイアウトパーツにはmarginやpaddingがいい感じに入っているわけではなく、そこも手を入れなければいけません。


**classだけビャーって書いてある程度整うCSSフレームワークが使いたかったんです。。。**

## 突然出てくる中国語
とりあえずドキュメントの最初に出てくるのが中国だったり、
`typography`のとこの文字が中国語だったり、
Githubのissueに中国語が投げつけられていたり、
#### 私には馴染めませんでした。

# 本当に欲しかったもの
前にBootstrapでの開発体験がとても良かった思い出があります。
本当にほしいのはBootstrapのようなclassを書いたら整い、部品としての見た目が整うCSSフレームワークだったのです。

ですが、Bootstrapは正直jQueryとベッタリしすぎている印象があります。
cssのみ導入するのもありなんでしょうが、公式ドキュメントを読んでも動かせないパーツが多いのはつらいです。

## そこでBulma
https://bulma.io/
Vueのアドベントカレンダーでも何人かの方が使っておられましたが、Bulma良さそうです。
CSSフレームワークであり、JSの要素は一切提供しません。

これであれば、classを書くだけである程度のデザインができるはず。
cssはあまり書きたくはない！

## さすがに足りないパーツはありそう
JSの動きが必要とするコンポーネントは何もないので、`switch`,`slider`, 複数選択のセレクトボックスなど、そういうものは無い。
そういうものが必要になったら、bulmaを基軸にしたUIコンポーネント探して、それでもなかったら自作になるのかなと思います。
https://buefy.github.io/#/
https://bulma.io/extensions/

### Element-UIを利用する前に、本当に部品だけを使いたいのか、検討してから使うことをおすすめします。
processingでテキストを縦横中心にするために調査したこと

テキストを縦横中心に配置するにあたり、調査したことをまとめました。


# テキストの表示
Processingでテキストを表示させるためには `text()` メソッドを使います。
引数には 表示したい文字、x座標、y座標をとります。

```JAVA
text("TEXT", width/2, height/2);
```


# 文字揃え
テキストを表示する基準点の設定には`textAlign()`メソッドを使います。
二つの引数をとるときは（横の設定、縦の設定）になります。
デフォルトは左端のベースラインです。

```JAVA
textAlign(CENTER,CENTER);
```

ただCENTERとしたときに、横は中心に揃いますが縦は中心に揃いません。
というのも、テキストの高さは純粋にテキストのみの高さではないため、CENTERとしたところで位置がずれてしまいます。

# テキストの高さ
フォントはベースラインを基準に作成されています。
ベースラインから上の長さはAscent、ベースラインから下の長さはDescentです。

![text.png](https://qiita-image-store.s3.amazonaws.com/0/72056/a0c7b782-82d4-0275-5430-21e70a5c2785.png)

テキストの高さはAscentとDescentの合計なので、`textAscent()`と`textDescent()`メソッドを使って算出します。

## 注意
フォントを変えても`textAscent()`と`textDescent()`でかえってくる値は変化しません。
目に見えて高さは変っていても同じ値が返ってきます。

公式のリファレンスを意訳すると

「フォントのAscentは正しく指定されていないので、手動で数ピクセル動かしてハックしてね。フォントサイズが変わってもいいように、textAscentかtextDescentを良い感じに使ってね。そうすればハックが少なくて良いよ。」

ってことなので、フォントによっては最終の詰めを手動調整する必要があるようです。

# 文字をキャンバスの縦横中心に配置する

上記を踏まえて作成したのがこちら。
BASELINEから下にはみ出さない文字であれば、縦の中心が取れているように見えます。

![test0002.png](https://qiita-image-store.s3.amazonaws.com/0/72056/20e7b85e-7aaa-a0e2-d79c-7ffcf54dace5.png)


```JAVA

void setup() {
  size(400, 200);
  
  textSize(80);
  textAlign(CENTER,TOP);
  
  fill(color(0, 30, 30));
  background(color(230, 230, 230, 255));
  
  noLoop();
  
}

void draw(){

  float ascent = textAscent();
  float descent = textDescent();
  float textHeight = ascent + descent;

  int textPosY = int(height-textHeight)/2;
  text("ping 123", width/2, textPosY);
}

```

`textAlign(CENTER,TOP);`にし、テキストのY座標が(キャンバスの高さ -テキストの高さ)/2になるようにしました。
また、`textAscent()`と`textDescent()`の返り値はfloatですが、textの引数はintなので、途中でキャストしています。


#参考
[processing reference textAlign]("https://processing.org/reference/textAlign_.html")
[ProcessingにおけるtextAlignの挙動]("http://d.hatena.ne.jp/xef/20120724/p1")
GitHubにSSH接続できるようにする

今更ながらGitHubにSSH接続をできるようにした。

## はじめに
下記の作業が完了していることを前提に手順をまとめた。

- GitHub のアカウントを公式サイトで作成(https://github.com/)

## 公開鍵と秘密鍵の作成
鍵を格納するためのディレクトリへ移動。

```zsh
cd ~/.ssh
```
鍵を作成するコマンドは下記のとおり。

```zsh
ssh-keygen -t rsa
```
コマンドを実行すると、パスフレーズを聞いてくる。

```
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/(username)/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
```
ここでは、3回Enterキーを押せば良い。その後、id_rsaとid_rsa.pubの2つの鍵が生成される。
sshキーを既に作成している場合は、上書きされてしまうので、

```
Enter file in which to save the key (/Users/(username)/.ssh/id_rsa):
```
の部分で任意の名前を入力して鍵を生成する。

## GitHubへ公開鍵を登録する
GitHub へ作成した公開鍵を登録する。
ブラウザでGitHub のSSH設定ページへ移動。(https://github.com/settings/keys)
「New SSH Key」ボタンを押す。「Title」には何のSSH接続のための公開鍵なのか入力し、「key」には公開鍵(~/.ssh内の.pubファイルの中身)を入力して登録。

## SSH接続の確認
下記のコマンドを実行。

```zsh
ssh -T git@github.com
Hi (gitのアカウント名)! You've successfully authenticated, but GitHub does not provide shell access.
```
上記のように結果が返ってくれば接続完了。

しかし、この結果が返ってくるまでいくつか設定が必要だったので、追加の設定手順を下記にまとめた。

## config ファイルの設定
~/.ssh 内にconfig ファイルを作成。下記を記述。

```
Host github
user git
Hostname github.com
Port 22
IdentityFile ~/.ssh/(秘密鍵のファイル名)
```

## 秘密鍵のパーミッションの設定
秘密鍵のファイルのパーミッションを600へ設定し、ユーザのみファイルの読み書きを許可した状態とする。

```zsh
chmod 600 (秘密鍵のファイル名)
```

## リポジトリの作成
SSH の接続が確認できたら、GitHub でリポジトリを作成する。
作成方法は省略。

## リポジトリのクローン
GitHub で作成したリポジトリをクローンする。
※ SSH接続用のリポジトリ名をコピー。GitHubでのリポジトリの作成方法は省略。

```zsh
git clone (クローンしたいリポジトリ名)
```

### 参考記事
とても参考になりました。
https://qiita.com/shizuma/items/2b2f873a0034839e47ce
https://qiita.com/nyanchu/items/32d65c4c36315b876d38
Brewfile で主要アプリを入れたあとの初期環境設定

Brewfile で諸々必要なアプリケーションをインストールした後、環境作りの手順を。

- zsh
- go
- ghq peco hub
- vim
- tmux


## zsh 環境のインストール

https://github.com/sorin-ionescu/prezto

see Installation https://github.com/sorin-ionescu/prezto#installation


## go, ghq, peco, hub のインストール

https://qiita.com/itkrt2y/items/0671d1f48e66f21241e2

```
brew install go

export GOPATH=$HOME
export PATH=$PATH:$GOPATH/bin

brew tap motemen/ghq
brew install ghq

brew install peco

brew install hub
```

## macvim のインストール

https://github.com/splhack/macvim-kaoriya/releases/tag/20171221 
~/.zshrc に

```
if [ -f /Applications/MacVim.app/Contents/MacOS/Vim ]; then
  alias vi='env LANG=ja_JP.UTF-8 /Applications/MacVim.app/Contents/MacOS/Vim "$@"'
  alias vim='env LANG=ja_JP.UTF-8 /Applications/MacVim.app/Contents/MacOS/Vim "$@"'
fi
```

source ~/.zshrc する

~/.vimrc に

```

set number
imap <C-j> <esc>

```

## tmux のインストール

```
brew install tmux
```

~/.tmux.conf は以下で。

https://gist.github.com/libitte/9d10f6abb52430517806