OmniAICreator/Qiita-1.07M huggingface dataset:
[PHP] オーバーライドとは。

24歳、初心者です。

PHPの基礎から勉強しているのですが、タイトルのような横文字が登場してきました。プログラミングって出てくる単語が横文字ばっかりで、高校時代に読んでいたライトノベルを彷彿とさせてくれるので結構楽しいです（個人的な感想）。その中でも「オーバーライド」って響きは久々に魂にキた・・・ので備忘録代わりに書いておこうと思います。


オーバーライドとは・・・

親クラスで定義されているメソッドを子クラスで同じ名前のメソッドを作って定義し直す（再定義）することです。
例えば
 
```php
// 親クラス

class Goku {
  public function skill($name, $damage){
    print "名前 = {$name} : ダメージ = {$damage}". '<br>'; 
  }
}

// 子クラス 

class Gohan extends Goku {
  public function skill($name, $damage){
    print "悟飯の必殺技！名前は、{$name}!なんと{$damage}ダメージも敵に与える事ができるんだ！"; 
  }
}

```

子クラスのskill()メソッドをオーバーライドすることにしました。親クラスでは簡潔な情報のみを表示する冷めたメソッドから,子クラスではコロコロコミックの説明文みたいな情報を表示する熱いメソッドに定義し直すことにしました。

ではメソッドを実行します。

```php
$dragonball = new Goku();
$dragonball->skill('かめはめ波', '500');
$dragonballZ = new Gohan();
$dragonballZ->skill('かめはめ波', '500');
```
すると結果、

```
名前 = かめはめ波 : ダメージ = 500
悟飯の必殺技！名前は、かめはめ波!なんと500ダメージも敵に与える事ができるんだ！
```

となります。最初の一行目が親クラスのskill()、その下が子クラスのskill()となっております。オーバーライドされていますね。

オーバーライドの利点ですが、色々な子クラスを作ってオーバーライドしたメソッドを用意しておけば、様々な状況に対応できるみたいです。

しかしオーバーライドをしてしまうと、同じ名前のメソッドが複数存在することになってしまいます。なんか紛らわしいし、目当てのメソッドを呼び出しそうとしたら違うメソッドを呼び出してしまうかもしれないとか思ってしまわれるかもしれません。しかし心配ご無用。特に変わった処理は必要ありません。上記のように普通にクラスのインスタンスを生成してメソッドを結びつけて呼びだすだけでいいそうです。

参考文献
PHPサーバーサイドプログラミングパーフェクトマスター　
著者　金城　俊哉
インタプリタ言語

さて、javascriptの基礎中の基礎を勉強中に出てきた単語

「インタプリタ言語」



横文字苦手な自分としては、

何それ？漢字に直して。


となってしまうが、それでは、いけないので、ウィキペディア先生に意味を調べてみると

「プログラミング言語で書かれたソースコードないし中間表現を逐次解釈しながら実行（英語版）するプログラムのこと。」

参照URL＝
https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%97%E3%83%AA%E3%82%BF




ウィキペディア先生、常に頭がいいので、頭が悪い自分にとっては、意味がまるで分からん！

という事で、その他、ネットで意味を調べまわっていると
次のようにイメージしたらいい感じだった

「イメージ」
自分が、外国人であるMrコンピューターと話さなければいけない場面に遭遇したとする

もちろん、外国人であるので、Mrコンピューターとは言葉が通じない。

その時、親切な「インタプリタさん」が登場して、
自分が話した言葉を、Mrコンピュータが分かるように翻訳してくれるとのこと
でも、日本語を翻訳して話すので、会話のスピードは遅い。


なるほど、そういう事ですか！！！
実行スピードが遅いというのは、翻訳しているからなのね。


勝手に、解釈してしまっていますが、間違っていましたら
ご指摘お願いします。
[CEDEC2017]アナザーエデンにおける非同期オートセーブを用いた通信待ちストレスのないゲーム体験の実現

#アナザーエデンにおける非同期オートセーブを用いた通信待ちストレスのないゲーム体験の実現

##講演者
鈴木 清人　さん（グリー株式会社）
西田 綾佑　さん（グリー株式会社）

##講演内容
開発のきっかけとなったことは、*スマホ向けゲームとコンシューマゲームとの差を解消してみたい*
↓
よりコンシューマっぽい作り方をしてみようという流れ。

###開発のグランドデザイン
- クライアント　>　サーバーとなるようにした。
- バックグランド通信によるオートセーブ
- データスキーマの共有
- クライアント単体で動作できるように（ある程度）
- サーバー側でデータを作らない

###メリット
- ユーザー視点だと通信しているように見えないので通信待ちがあたかも無いように見せる
- 通信をバックグランドで行うため、早いDBを使わずに別の特性をもったDBを選択できる

###対応
ステートマシンを用いて下記の様なときにオートセーブを行うように対応
- 画面全体を覆うようなUIクローズ時
- エリア移動時
- Luaスクリプト実行時
- ストーリー進行時
- バトル終了時
- 1分に1回
このタイミングでオートセーブを行い、ローカルへのセーブとサーバーへの同期を行っている。
ただし、スマホということでいつでも通信が出来るとは限らないので、
最大100件までのオートセーブデータの差分ファイルが出来るか、
一定時間の無通信状態になった際にタイトルに戻すように対応
→タイトル画面からゲーム画面に遷移する際にすべての差分データのサーバーとの同期を行っている。

バックグランド通信だけでは対応できないものも存在している。
有償なものを使用した際にはブロッキング通信を行っている。
そのために、ブロッキング通信が発生する際には、バックグランド通信のキューが溜まっていないことを確認してから行っている。

###クライアントの最新状態=サーバーのミラー状態＋その差分データ
これを維持するために、サーバーで直接DBを書き換えてしまうとデータの不整合につながってしまうため、
直接書き換えたいような状態が発生した際には下記のようなことを行っている。
サーバーで書き換えたいデータをクライアントに送信命令
↓
クライアントのローカルデータを更新
↓
オートセーブ時に差分データと一緒に完了署名付きで送信
↓
サーバー側はその命令を削除

###使用しているもの
- LevelDB
- DynamoDB
- FlatBuffers

##まとめ
スマホ向けゲームとしてはかなり挑戦的な取り組みを行っていたということに驚きを覚えました。
端末にデータを持ってしまうことによるチート対策を念入りに行っていないといけないものと感じました。
[C#][ReactiveProperty] ObservableCollectionの要素の集計をして、ReactivePropertyに変換する

ObservableCollection内の特定の要素を集計して、ReavtiveProperty化する方法のメモ

やりかたがずっとわからなかったんですが、Gistにやりたかったことと同様な実装をされた方がおられたのでようやく解決。

[ReactivePropertyでObservableCollection中の要素のPropertyを購読したい。](https://gist.github.com/emoacht/9de6b5780838b6d04c06)

実装も上記のものとほぼ同じなんですが、若干仕様が変わっていたためやりかたを備忘録として残しておきます。

# 検証環境

+ ReactiveProperty 3.6.0

# 実装例

やりたいことは単純で、特定のリストの各要素の更新フラグを監視して、どれかか一つでも更新されていたら親要素の更新フラグも有効化するというものです。逆にすべて保存されていたら自動的に無効化もされます。

```csharp:実装例
public ObservableCollection<Hoge> Items { get; } = new ObservableCollection<Hoge>();
public ReactiveProperty<bool> IsUpdated { get; }

...

IsUpdated = Items
    .ObserveElementProperty(x => x.IsUpdated)
    .Scan(0, (counter, x) => counter + (x.Value ? 1 : (0 < counter ? -1 : 0)))
    .Select(counter => 0 < counter)
    .ToReactiveProperty();
```

この実装のポイントは `Scan` かと思います。`Scan(初期値, (前回値, 次の値) => { return 計算結果; })` で集計ができるかんじのようです。便利。

[Reactive Extensions入門 13「値を集めて回る」 - かずきのBlog@hatena](http://blog.okazuki.jp/entry/20100930/1285854476)
[Rxにおけるscanとreduceの違い - Qiita](http://qiita.com/izumin5210/items/952a23bf065648feabb7)

# 注意点

注意点として、Gistで公開されていたものとは以下が仕様が変わっていました。

```csharp:修正前
    .Scan(0, (counter, x) => counter + (x ? 1 : (0 < counter ? -1 : 0)))
```

```csharp:修正後
    .Scan(0, (counter, x) => counter + (x.Value ? 1 : (0 < counter ? -1 : 0)))
```

どうも ReactiveProperty の v2.1.3 から破壊的な変更が入っているらしいです。
[ReactiveProperty v2.1.3をリリースしました - かずきのBlog@hatena](http://blog.okazuki.jp/entry/2015/03/10/213610)

# 参考
[ReactivePropertyでObservableCollection中の要素のPropertyを購読したい。](https://gist.github.com/emoacht/9de6b5780838b6d04c06)
[ReactiveProperty v2.1.3をリリースしました - かずきのBlog@hatena](http://blog.okazuki.jp/entry/2015/03/10/213610)
リコー Thetaの連続撮影画像から天球タイムラプス映像を作成する

#撮影
Thetaのインターバルモードで連続画像を撮影します。

#ffmpegを使って連続画像から動画を生成
ffmpeg -r 15 -start_number 14634 -i R%07d.JPG -vcodec libx264 -qscale 0 out4.mp4
ffmpeg -s 1980x1080 -f image2 -i %*.JPG -vcodec libx264 -qscale 0 out.mp4
##オプション解説
-r 15 [1秒あたりのコマ数を指定]
-start_number 14634 [連続画像のファイル名内の数字が何番から始まっているかを指定]
-i R%07d.JPG [連続画像のファイル名を指定。"%07d"は7桁までを0で埋められていることを意味する]
-vcodec libx264 [コーデック指定]
-qscale 0 [ffmpegが圧縮率を勝手に高めるのを阻止]
out4.mp4 [出力するファイル名]

#動画が天球動画であることを示すメタデータを埋め込む
##ソフトウェアのダウンロード
GoogleがYoutube向けに公開しているメタデータ埋め込みスクリプトを入手
https://github.com/google/spatial-media/releases/tag/v2.0
※Win&MAC用バイナリもダウンロードできるが、Linux環境で作業を行うためソースコードをダウンロード

##アーカイブを解凍
取り出したディレクトリ"/spatial-media-2.0/spatialmedia"内にあるgui.pyを起動

##前段で作成した動画を指定し、埋め込みを実施

#Youtubeへアップロード
pythonでseleniumのテストコードを書いてみる

## 概要

エンドツーエンドテストのコードをpythonにて書く必要が出てきたので、
作業内容を忘れないようメモする。

## テスト環境

下記、別記事に記載のdocker環境を使って行います。

**dockerでE2Eテスト環境 (python3 + selenium) を構築**
http://qiita.com/reflet/items/89ff50c991168adb3a9b

## 簡単なテストコードを書いて実行してみる

下記サイトにある簡易なテストコードを参考にコードを作成する

**[参考サイト] 2.1. Simple Usage**
http://selenium-python.readthedocs.io/getting-started.html#simple-usage

```py:python_org_search.py
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
driver = webdriver.Remote(
    command_executor='http://selenium-hub:4444/wd/hub',
    desired_capabilities=DesiredCapabilities.CHROME)

driver.get("http://www.python.org")
assert "Python" in driver.title
elem = driver.find_element_by_name("q")
elem.clear()
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)
assert "No results found." not in driver.page_source
driver.close()
```

上記コードを実行してみる

```:ターミナル
# python python_org_search.py
```

## ユニットテストを書いてみる

下記サイトを参考にテストコードを作成し、実行してみる。

**[参考サイト] 2.3. Using Selenium to write tests**
http://selenium-python.readthedocs.io/getting-started.html#using-selenium-to-write-tests

```py:test_python_org_search.py
import unittest
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

class PythonOrgSearch(unittest.TestCase):

    def setUp(self):
        self.driver = webdriver.Remote(
            command_executor='http://selenium-hub:4444/wd/hub',
            desired_capabilities=DesiredCapabilities.CHROME)

    def test_search_in_python_org(self):
        driver = self.driver
        driver.get("http://www.python.org")
        self.assertIn("Python", driver.title)
        elem = driver.find_element_by_name("q")
        elem.send_keys("pycon")
        elem.send_keys(Keys.RETURN)
        assert "No results found." not in driver.page_source

    def tearDown(self):
        self.driver.close()

if __name__ == "__main__":
    unittest.main()
```

```:ターミナル
# python test_python_org_search.py
```

## 参考サイト
- [Selenium Python Bindings 2 documentation](http://selenium-python.readthedocs.io/getting-started.html)
- [Selenium2 + Python3 + Linux のメモ](http://qiita.com/narupo/items/e976cb57241f6c3b9f50)
- [Python コードのスタイルガイド PEP8-ja](http://pep8-ja.readthedocs.io/ja/latest/)
- [Pythonで環境変数を取得する、なければデフォルト値をセットする](https://qiita.com/manabuishiirb/items/5c85a8902472d2a664e8)
- [PythonとSeleniumでネットバンキングをスクレイピングする](http://blog.smiura.jp/entry/2015/09/25/scrape-netbanking-by-python-and-selenium/)
Bash on Ubuntu on Windowsでopenコマンドみたいなシェルスクリプト

# 経緯
　BoWでファイルを開くためのコマンドが欲しかった（macの`open`コマンドみたいなの）。


# 参考にさせていただいたもの
[Bash on Windowsでmacのopenコマンドみたいなこと](http://qiita.com/chez_sugi/items/603a0ba8016aaae9ef98)


# いろいろ試したこと
　`xdg-open`とか`gnome-open`とか入れてみたけど、BoWからではwindowsに設定されている既定のアプリケーションを呼び出せないのでだめだった。
　BoWから`cmd.exe`とコマンドを打つとcmdを呼び出せることを知ったので、これを使うことにした。


# ファイルパスに空白が存在するとめんどうなことになる
　`cmd.exe /c start [ファイルパス]`を実行したとき、このコマンドはファイルパスに空白が含まれているかいないかによって、次の二通りの振る舞いをする。

1.空白が含まれていないとき
> windowsの規定のプログラムによって指定されたファイルが開かれる

2.空白が含まれているとき
> ファイルパスと同名のタイトルのcmdが起動する

　ファイル名に空白含まれる場合、`start`に渡された一つ目の引数はcmdのウィンドウタイトル名として扱われるためらしい。これを回避するために、`start`コマンドの一つ目の引数に`""`を引数として渡し、二つ目の引数にファイルパスを指定する。こうすることで、ファイルパスに空白が含まれていようがいまいが、`start`は同じふるまいをするようになる。
　それと、BoWとcmdでは空白文字の扱いが違う。BoWではファイル名に空白文字が含まれていた場合`a\ b`とバックスラッシュを用いて表記されるが、cmd上では`a b`とバックスラッシュを用いず表記される。


# スクリプト
以上を踏まえてスクリプトを作る。

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

# check number of arguments
if [ $# -eq 0 ] ; then
    echo "no file path"
    exit 0
fi

# replace
replace_path=`echo $@ | sed 's/\\\ / /g'`
#replace_path=$(readlink -f $@ | sed -e 's/\/mnt\///' -e 's/\(^[A-z]\)/\1:/g' -e 's/\//\\/g')

# open
cmd.exe /c start "" "$replace_path"

exit 0
```
あとは実行権限を付与して
`chmod +x open.sh`
aliasを貼って使うだけ。
`alias open='~/open.sh'`


# 今後の課題
　ディレクトリを`open`する場合、一旦そのディレクトリへ移動してから`open .`と実行しなければならない（`open ./`だと開いてくれない）ので、それを改善する。
ブラウザとは？

現在、プログラミングを学習しています。
現在、javascriptの壁にぶつかっておりまして、
色々と、コードを書いては、上達をしない毎日でしたが、ある人からの教えが単純かつ、明確に
自分に不足していることでした。

上達するための方法は、

「コードをひたすら書く！　　ただし！！！！理解をしながら！！」
「本質を理解しろ！」


理解をしながらというのが、完璧に抜けていました。
ひたすらに写経をするだけでなく、理解をしながら一歩ずつの方が絶対に上達するとの事でした。
そして、本質を理解する事。
これについては、徹底的に基礎を見返しするしかないのではないかと思います。


と、いう事で、基礎中の基礎の知識を書き綴っていき、力をつけていきたいと思います。


まずは、「ブラウザについて」


聞き慣れてはいるが、「意味を説明せよ」と言われたら、




「ネットで使われてる、あれだよね」



くらいしか言えないので、きちんと調べてみる事にしました。





ブラウザとは、Webサイトを閲覧するためのアプリケーションソフトのこと。
（参照URL⇨http://www.ocn.ne.jp/support/words/ha-line/83u838983E83U.html）

上記URLでの参照文言＝
ブラウザ(browser)は、Webブラウザともいいます。ブラウザは、インターネットにアクセスしてテキスト文、画像、アニメーション、映像、音楽などを表示したり再生したり、CGIやPHPといったプログラムと連動し、ユーザが入力したデータを送信したりすることもできます。今や、ブラウザは、インターネットを使う上で、なくてはならないツールとして普及しています。


う〜む、インターネットにアクセスするというのが、重要っぽいですね。

ブラウザにも種類がありまして、（当たり前やん！っていう方ほとんどですよね）
主流なのが、IE、google Chrome,Safariという感じですよね。
[CEDEC2017]複雑化するassetbundleの配信からロードまでを基盤化した話

#複雑化するassetbundleの配信からロードまでを基盤化した話

##講演者
福永 亘　さん（株式会社QualiArts）
石黒 祐輔　さん（株式会社QualiArts）

##講演内容

AssetBundleの管理に関して問題があり、それの解決を試みた。

###問題点
- 世代管理（バージョン管理）が出来ない
- Asset数が多く管理が大変（数万ファイルに及ぶ）
- クライアントで同一のAssetBundleをロードすることが出来ない
- 端末にキャッシュ済みのものを公式に削除する方法がない
- ＡｓｓｅｔＢｕｎｄｌｅの作成方法が各タイトル毎になっていた

###要件定義＆課題
- 運用が楽
- 配信が早い
- 正確である
- 動作が高速
- どんなタイトルでも使える
- 使いやすい
- 膨らむデータ量
- 突発的なトラフィック
- 大量のデータのやり取り

###対策
・膨らむデータサイズ
　GoogleCloudStorageを使用する

・突発的なトラフィック
　GoogleCloudPlatform
　docker
　GKE（Google Container Engine)
　を使用して対応を行った。

・大量のデータのやり取り
　CDN（content delivery network）を使用して対応

・AssetBundleの世代管理
　リビジョン単位で世代管理を行い、
　全体のリビジョン、ファイル単位のリビジョンで管理を行っている
　端末のリビジョンとサーバー上のリビジョンが違う場合のみデータを更新する。

###SDKの構築

###クライアントの課題
- UnityAPIだけでも最低限のことが出来るが、自由度が低い
- AssetBundleの世代管理ができない
- 同一Assetbundleに対しての同時ロードができない

###対策
- 汎用的なAPIを提供する
- SDKの導入ハードルを下げる（依存ライブラリを最低限のものにする）
- ローカルDBの管理のためのメモリ使用量を抑えるためにstructを使用する
- ロード管理のためにリクエスト数とアンロード数に応じてリソースを破棄するかの判定を組み込む
- 明示的なロードとは別にGameObject自体の生死でリソースのロード・破棄に対応

###通信に関しての対策
通信方法の種類は複数あり、AssetBundleをダウンロードする際の通信をそれぞれ比較を行った。

・HttpWebRequest
　自由度は高いが、Https通信が行えないのでセキュリティ的に不採用

・WWW（UnityAPI）
　古い、機能拡張に乏しい

・UnityWebRequest（UnityAPI）
　ワンソースでマルチプラットフォーム対応可能
　自由度もそれなりにある
　DownloadhandlerScriptを拡張することで固定長バッファを使いまわすことが出来、メモリ消費も抑えられる
　問題として受信イベントがメインスレッドで呼び出されている。
　C#のメモリコピーのコストが大きい

・ネイティブプラグイン（内製）
　C#のメモリコピーを行わないため、GCの発生を抑制できる。
　効率的なパイプライン化が可能


##まとめ
AssetBundleの管理方法に関して、一部対応しているものがあったりしますが、
まだまだ無駄な部分が存在していると思い知らされました。
少しずつでも最適化などに手を加えていけたらと思います。
PowerShellでWiMAXの通信量を取得する

# 背景
2017年現在、WiMAXでは3日で10GB以上使用した場合、通信速度を遅くする制約がある。
cf. [WiMAX2+サービス ネットワーク混雑回避のための速度制限について](http://www.uqwimax.jp/plan/wimax/note/gigahodai_speedlimit_10/)

通信量自体はWiMAX端末や管理サイトで確認すれば済むことだが、
その方法では過去に発生した通信量を見ることができない。
過去分の通信量も記録していった方が、何かと便利そうだと思い、csvに集計するまでを自動化してみた。

# 使用する上での前提条件
 -> 当スクリプトを使用するにあたって使用者は365日PCを起動することを前提とする。（私がそうなので）
 -> また、その日最初のWiMAXの通信はPC以外のケースでは発生しないものとする。
 -> WiMAX端末はHUAWEI製品であることを前提とするため、管理サイトは http://speedwifi-next.home を使用する。
　※NECプラットフォームズ製品は所持していないため開発できなかった。
 -> 通信量は小数点第2までの精度しか取得できないため、
　もしかしたら誤差が多少あると思われる。が対策はしない。

# 実装する上での留意事項
Windows PowerShell 5.0
 -> 外部モジュール（Selenium）はクラス構文内では使用できないので、今回は一箇所も使っていない。残念。
　　cf. https://github.com/PowerShell/PowerShell/issues/2074
 -> Web-APIとかないので、SelemiunのWebDriverを使用し、XPathでHTMLを辿りながら値を取得する方法を取っている。
 -> ps1ファイルを分割させて書いているが、これは部品化を狙ったというよりも、
　　PowerShell独特の不安定な挙動をこうすれば直るという経験則からあえて分割している。（根拠なし）
 -> 端末はSpeed Wi-Fi NEXT W03（Huawei製品）を使用。
　　cf. http://www.uqwimax.jp/products/wimax/w03/

# 利用方法
1, GitHubからコードをzipでダウンロードし、解凍します。
　→ https://github.com/nimzo6689/wimax-meter
2, [Selenium公式サイト](http://www.seleniumhq.org/download/)からC#用のドライバ（WebDriver.dll）とchromedriver.exeをダウンロードします。
 
3, _Settings.ps1に設定値を入力します。（以下、サンプルです。）

```ps1:_Settings.ps1
[PSCustomObject]@{
    Selenium = [PSCustomObject]@{
        # Path of WebDriver.dll
        WebDriver    = "C:\Tools\Selenium\net40\WebDriver.dll"
        # Path of chromedriver.exe
        ChromeDriver = "C:\Tools\Selenium\driver\chromedriver.exe"
    }
    Auth     = [PSCustomObject]@{
        UserType    = "admin"
        # [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes($password))
        EncodedPass = "cGFzc3dvcmQ="
    }
    # Path of wimax_yyyyMMdd.csv
    CsvDir   = "C:\Users\nimzo6689\Documents\wimax-meter"
}
```
4, タスクスケジューラにStart.ps1を登録する。

```ps1:Terminal
$SchedulerParams = @{
    # $(AbsolutePath)には適切な絶対パスに書き換えてください。
    Action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "$(AbsolutePath)\Start.ps1"
    Trigger = New-ScheduledTaskTrigger -DaysInterval 1 -Daily -At "00:00 AM"
    Settings = New-ScheduledTaskSettingsSet -Hidden -StartWhenAvailable
}
Register-ScheduledTask -TaskPath \ -TaskName WiMAX-Meta @SchedulerParams -Force
```

# 使ってみた感想
あいにく、まだ実装して数日しか使っていないので、何とも言えないです。
1ヵ月以上計測してみて、Excelでいい感じのグラフができるようになれば、
またこの記事を更新していきたいと思います。
CentOS設定記録2 ユーザー作成編

#はじめに
##目的
- Linux動作についての学習
- 今回はユーザーでのSSH接続とssh接続用ポート変更（パブリックIP側のみ）
- その他前提などは[設定記録1](http://qiita.com/ka_iwashita/items/aff837a2155a47416844)参照

##その他
- 今回詰まったところは公開鍵のパーミッション設定
 - 600だったか400に変更がいる（644とかだとエラーになる）

##BashOnwindows での接続

BashOnWindowsの起動はPowerShell上でBashと打つ。
初期設定などは過去にやっていたため不明。
そんなに困らなかった記憶。

```bash:BashOnWindows上で実行
//ssh接続フォルダ作成
mkdir ~/.ssh
//秘密鍵コピー
cp /mnt/c/Users/username/Desktop/id_rsa ~/.ssh/id_rsa
//秘密鍵所有権変更
chmod 600 ~/.ssh/id_rsa
ssh -i ~/.ssh/id_rsa root@ipアドレス -p 22
```

##ユーザー作成
```bash
//ユーザー作成
useradd username
```

##ssh接続用フォルダとファイル作成
一時的にrootとuserの認証キーが同じになるので企業とかでは注意
また、認証キーはパーミッション（操作権限）を600にすること

```bash
//ssh認証用フォルダ
mkdir /home/username/.ssh
//所有者変更
chown username:username /home/username/.ssh
//公開鍵をrootのキーからコピー
cp /root/.ssh/authorized_keys /home/username/.ssh/
//公開鍵の所有者とパーミッション変更
chown username:username /home/username/.ssh/authorized_keys
chmod 600 /home/username/.ssh/authorized_keys
```

##ssh接続確認
ログインできるか確認

```bash:BashOnWindows上で実行
ssh -i ~/.ssh/id_rsa username@ipアドレス -p 22
```

##ポート変更
サーバー側の実際の待ち受けポートは22のまま、パブリックIP側のポート2222をサーバー側のポート22へ紐づける

###FW設定
[コンソール](https://console.idcfcloud.com/) → コンピューティング → IPアドレスメニュー → ファイアウォール
設定記録1で開放したFW設定を変更（タイプsshをCustom TCPへ）

- SSH接続
- コメント：SSH接続
- ソースCIDR：MY IP
- タイプ：Custom TCP
- ポートレンジ：2222

###ポートフォワード設定
[コンソール](https://console.idcfcloud.com/) → コンピューティング → IPアドレスメニュー → ポートフォワード
設定記録1で設定したポートフォワード設定を変更（パブリックポートをTCP:2222へ）

- コメント：SSHポートフォワード
- パブリックポート：TCP:2222
- プライベートポート：22
- 仮想マシン：作ったマシン

##ログイン

```bash:BashOnWindows上で実行
ssh -i ~/.ssh/id_rsa username@ipアドレス -p 2222
```

接続できたことを確認する。
ログインするたびにいちいち認証ファイルやポート指定をするのは大変なので、
ログインを簡単するために、BashOnWindows上で以下設定を行う。

```bash:BashOnWindows上で実行
vim ~/.ssh/config
```
```
# サーバーへの生存通知
ServerAliveInterval 60

#idcfCloud
Host idcfCloud
        HostName ipアドレス
        User username
        Port 2222
        IdentityFile ~/.ssh/id_rsa
```
```bash:以後のログインは以下でOK
ssh idcfCloud
```

##rootのssh接続を無効化

作成したユーザーでssh接続出来たらルートユーザーでのログインをできないようにする
その他セキュリティ設定を少し変える

```bash:
//設定ファイル編集はroot権限が必要
su - root
vim /etc/ssh/sshd_config
```

基本はコメントを検索してその下あたりに以下追加

```
//sshバージョン2の利用を強制
# The default requires explicit activation of protocol 1
Protocol 2

//ルートでのssh接続はno
#PermitRootLogin yes
PermitRootLogin no
```
```bash
//sshdを再起動
systemctl restart sshd.service
```

rootでssh接続できなくなったことを確認

```bash:BashOnWindowsでテスト
ssh -i ~/.ssh/id_rsa root@ipアドレス -p 2222
```

#参考
http://qiita.com/ritukiii/items/c724f09fe66fedf2618b
http://qiita.com/HamaTech/items/21bb9761f326c4d4aa65
http://qiita.com/ir-yk/items/af8550fea92b5c5f7fca
http://qiita.com/tag1216/items/5d06bad7468f731f590e
http://www.math.s.chiba-u.ac.jp/~sakurai/tmp/SSH.html
http://qiita.com/passol78/items/2ad123e39efeb1a5286b

下のページはこの記事書きながら見つけたページ。
先に見つけられれば楽だった。
http://qiita.com/QUENCH/items/818d719ceb746823c71c
720万手をディープラーニングで学習したオセロＡＩをChainerで作ってみた

ちょっと前のニュースになってしまいますが、AlphaGoが世界チャンピョンに3連勝したのはすごかったですよね。それに触発されて、今回は同じボードゲームのオセロのＡＩを作ってみました。

なぜオセロにしたかというと、コンピュータリソースが足りない！！からです。AlphaGoの開発では50GPUで3週間というとてつもないことをしていますが、そんなの個人では絶対不可能です。そこで碁盤が小さくルールも簡単なオセロを選びました。

AlphaGoを話題にあげましたが、AlphaGoとは使っている技術が違います。AlphaGoは教師あり深層学習と、深層強化学習と、モンテカルロ木探索の3つを組み合わせていますが、今回は教師あり深層学習のみを使っています。性能は出ませんが、逆に、アルゴリズムがとてもシンプルなので、今聞いた後半の2つを知らない方でも（私も深層強化学習は分かりますがモンテカルロ木探索はよく分かりません）、深層学習の知識のみで理解できちゃいます！以下の説明では深層学習に関するある程度の理解（ゼロから作るディープラーニングを読んだことがあるくらい＝私）があるとします。

#概要
オセロの譜面データとしては[フランスオセロ協会のサイト](http://www.ffothello.org/informatique/la-base-wthor/)のデータを使いました。WTHORという謎のフォーマットを使っていたのでデータの加工が結構大変でした。

ニューラルネットワークは、入力データに譜面状態(0:なし,1:自分の石,2:相手の石)を、出力データに各手を打つ確率を使いました。教師データには自分が打った手の位置を使いました。言葉だけだと分かりにくいと思うので、図を示します。

![説明1.png](https://qiita-image-store.s3.amazonaws.com/0/150232/ad8ee2ea-422c-4cf3-d03b-623640aea725.png)

#ニューラルネットワークの構造
AlphaGoと同じく**畳み込み層のみを使い**、全結合層は使いませんでした。出力が2次元データなのでCNNのままが良いと考えられるからです。**出力層にはSoftmax**を使い、**他の層ではConv->BN->ReLU**としました。Batch Normalization(BN)を導入すると学習が安定するのでおすすめです。

# ニューラルネットワークの学習
損失関数にはオーソドックスに交差エントロピー誤差を使いました。
最適化アルゴリズムには**Adam**を使いました。SGDに比べ、学習が早く進み、最終的な結果も良好です。

#ソースコード
お待ちかねのソースコードは[githubにあげてあります](https://github.com/Matchlab314/Deep-Othello)。
細かいパラメータなどはソースコードを見てください。

#学習結果
AIの性能は…
ルールはだいたい理解したみたいですが、残念ながらあまり強くはなりませんでした。
原因はおそらく教師あり深層学習のみを用いたことでしょう。

しかし、時間の都合上CPUだけのPCで2時間半くらいしか学習していないので、まだ強くなる可能性もあります。

ということで、**GPUを持っている人求む！**

GPUで1日ぐらい学習すれば強くなるかも？
Macを使うことになったので設定したものの数々

Windowsを使っていたけれど、Macデビューすることになりまして
まず困ったのが、ショートカットの違いと、タッチパネルの使い方の分からなさ。
戸惑いマクリマクリスティーです。

タッチパネルはなんか慣れるのですがショートカットやら、どうしてもWindowsを使っていたら
慣れない部分を、Windowsユーザ向けシステム環境設定をまとめました。

以下はほとんどが、Dock内にあるシステム環境設定内にある項目です。
一部後半にHome brewとかありますが、そんなん使わねーって人は無視してください。

// 2017/09/05 キーボードショートカットにターミナル追加
// 2017/09/06 購入したものを追加
// 2018/02/02 その他アプリ ＞ HyperSwitchを追加


## Dock
* サイズを小さく
* 画面上の位置：右


## キーボード
### キーボード ＞ キーボード
* F1,F2などのキーを標準ファンクションキーとして使用
* 修飾キー
    * CapsLockとＣｏｎｔｒｏｌキーを入れ替え

### キーボード ＞ ショートカット
* Chromeの再読込をF5に対応させる
    * http://blog.livedoor.jp/ytkngus/archives/51686632.html
* ターミナルのタブ移動をCtrl+T、Ctrl+Shift+Tでできるようにする
    * 「アプリケーション」を選択
    * 「＋」を押す
    * 出てきたダイアログで、アプリケーション＞その他＞ターミナルを選択
    * メニュータイトルは、「次のタブを表示」、キーボードショートカットはCtrl+Tを選択
    * もう一つ、「前のタブを表示」、キーボードショートカットはCtrl+Shift+Tを選択
* キーのリピート
    * 最速に変更
* リピート入力認識までの時間
    * 最速に変更

* Mission Control
    * 左の操作スペースに移動 を切り
    * 右の操作スペースに移動 を切り

## トラックパッド
### トラックパッド ＞ スクロールとズーム
* スクロールの方向：ナチュラルにチェックを入れる




## Home brew

### インストール
https://brew.sh/index_ja.html

```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

### Home brewでインストールしたもの
brew install wget
brew install vagrant
brew install docker
brew cask install docker
brew install homebrew/php/composer
brew install homebrew/php/php56-mcrypt

```
php.iniに自分で色々書き込む必要があるので以下を実行
cp /etc/php.ini.
vi /etc/php.ini
最後の方に以下を追加
extension="/usr/local/Cellar/php56-mcrypt/5.6.31_5/mcrypt.so"
```


## Google日本語入力のインストール

### 弊害
Ｅｃｌｉｐｓｅ等での要、Ctrl + Shift + Rが効かなくなるので
キーボードショートカットの設定を追加
http://blog.shinichy.com/2012/05/googlemac.html


## Sublime Textのインストール


### 日本語化
http://qiita.com/Shoesk/items/3e766206531dc2dcd338


## 購入したアプリ

[AutoKeyboard](https://itunes.apple.com/jp/app/autokeyboard/id908553210?mt=12&ign-mpt=uo%3D4)
何かアプリがアクティブになった時にキーボードを切り替えてくれるアプリ。
例えばiTermとかは基本アルファベッドなので、アクティブになった時はアルファベッド入力に変更してくれる。
280円。


## その他アプリ
[HyperSwitch](https://bahoom.com/hyperswitch)
Command + Tabのアプリ間移動をWindowsのようなウィンドウ毎の移動に変更出来る。
例えばChromeを２画面立ち上げていたら２つ表示されてその間を移動できる。
困ったときのLinuxコマンド

アプリケーションエンジニアがサーバー管理することになって四苦八苦した痕跡を残します。

### 基本
| コマンド | 説明 |
|:--|:--|
| sudo su | rootに切り替え |
| mkdir -p 親DIR/子DIR/孫DIR | ディレクトリ作成<br>-p：階層を（存在しなければ）一気につくる<br>[詳細](https://eng-entrance.com/linux-command-mkdir) |
| rm -rf DIR | 削除<br>-r：サブディレクトリ含む, -f：確認なし |
| mv 元DIR 先DIR | 移動<br>先DIR/元DIRの形で置かれる |
| cp -ru 元DIR 先DIR | コピー<br>-r：サブディレクトリ含む, -u：新しいファイルのみ |
| chown -R USER:GROUP DIR | オーナー変更<br>[詳細](https://webkaru.net/linux/chown-command/) |
| chmod -R 777 DIR | 権限変更<br>[Permission一覧](http://www.k4.dion.ne.jp/~mms/unix/linux_com/chmod.html) |
| ls -laR | ファイル一覧<br>-l：リスト形式, -a：.も表示, -R：サブディレクトリ含む |
| ll | ls -l のエイリアス<br>[参照](https://net-newbie.com/linux/commands/index.html#LS)|
| cat -n | ファイル内容表示<br>-n：行番号 |
| less ファイル | ファイル閲覧<br>コマンドGで最終行, qでEXIT<br>[詳細](http://qiita.com/marrontan619/items/95e954972706f32be255) |
| vi ファイル | ファイル編集<br>i：で入力モード, Escでコマンドモード, :wで書き込み, :qで閉じる, :wqで上書き保存 |
| find ディレクトリ/* -size +1M -ls | 検索<br>例はサイズ条件 |
| ln -s ディレクトリ リンク | シンボリックリンク |
| reboot | 再起動<br>shutdown -r now と同じ。<br>[参考](http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230883/?rt=nocnt) |

### ZIP
| コマンド | 説明 |
|:--|:--|
| tar -zcvf xxxx.tar.gz ディレクトリ | 圧縮 |
| tar -zxvf xxxx.tar.gz | 解凍 |
- [各種圧縮/解凍コマンド](https://webkaru.net/linux/compress-uncompress-command-list/)

### 状態監視
| コマンド | 説明 |
|:--|:--|
| top | プロセス監視：CPU使用率降順 |
| ps aux | プロセス一覧 |
| pidof -x プロセス | プロセスID一覧 |
| df -h | ディスク使用量<br>-h：単位最適化 |
| du -s[k/m] ディレクトリ/* &#124; sort -nr &#124; head -5 | ディレクトリ以下の使用量上位5件<br>-s：単位 |
| free | メモリ使用量 |
| vmstat 間隔 回数 | メモリ/CPU状況 |
| watch -n1 "コマンド" | 監視<br>-n：更新間隔(秒) |
- 負荷監視はこのへんを参考に
 - [サーバ負荷を確認する方法](http://qiita.com/hiro-d/items/c3f724cb3d377e21cd91)
 - [Linux負荷監視コマンドまとめ](http://qiita.com/aosho235/items/c4d6995743dd1dac16e1)
 - [Linuxリソースの監視・確認に関するコマンド逆引きメモ](http://qiita.com/rsooo/items/42f0902d42bab6ecf175)

### パイプライン
| コマンド | 説明 |
|:--|:--|
| コマンド &#124; grep -e xxx -e yyy | コマンド結果に対してgrep<br>-e：or条件 |
| コマンド &#124; grep xxx &#124; grep yyy | コマンド結果に対してgrep<br>and条件 |
| コマンド1 &#124;&#124; コマンド2 | 1結果false時に2実行 |
| コマンド & | バックグラウンド実行 |
- [コマンド連結について](http://jehupc.exblog.jp/15729095/)

### WEB
| コマンド | 説明 |
|:--|:--|
| service httpd restart | Apache再起動<br>reloadなら停止せず設定変更反映 |
| php -r "echo date('Y-m-d');" | PHPコマンド実行 |

### ディスク
| コマンド | 説明 |
|:--|:--|
| lsscsi | 接続されているディスク一覧 |
| sudo -i blkid | マウントされたディスクのUUID一覧 |
| mount /ディスクファイル /サーバーdir | マウント |

### ネットワーク
| コマンド | 説明 |
|:--|:--|
| netstat -na | 接続状態確認 |
| lsof -i -n -P | ポート利用しているプロセス |
| lsof -i:ポート番号 | 指定したポートを利用しているプロセス |
| tcpdump port ポート番号 | 指定したポートの通信監視 |
| tcpdump port ポート番号 -s 0 -w ./tcpdump.cap | ファイルに出力 |
| tcpdump -r ./tcpdump.cap | ファイル閲覧 |
- [tcpdumpについて](http://qiita.com/ngyuki/items/969d1efaddb68acb5313)
SublimeText2でビルドを実行しても何も起こらない時の解決策

# 事象
SublimeText2でビルド(Ctrl+B)を実行しても、ビルドが実行されない。

正確に言うと、以下の挙動をする。
・Javaソースに対して、ビルドシステムにJavaCを指定して、ビルド実行(Ctrl+B)。
・ビルド結果パネルが表れて、ステータスバーにBuildingという文字が表示されるが、数秒ほど経つとBuildingの文字が消えて、ビルド結果パネルには何も表示されない。

ちなみに、他のビルドシステムでも同様の事象になった。

# 環境
OS:Windows10 64bit
SublimeText2 Version 2.0.2,Build 2221 (portable version)
→　install版でも同一事象発生。
（SublimeText3では事象は発生しなかった）


# 解決策
SublimeText\Data\Packages\Default\exec.py の45行目を以下のように修正する。

```python:exec.py
修正前
proc_env[k] = os.path.expandvars(v).encode(sys.getfilesystemencoding())
```
```python:exec.py
修正後
proc_env[k] = os.path.expandvars(v.decode(sys.getfilesystemencoding())).encode(sys.getfilesystemencoding())
```

# 参考サイト
日本語サイト探しても全然無くて、英語サイトを漁ってやっと出てきた。
https://stackoverflow.com/questions/14715918/sublime-text-2-build-tools-nothing-happens/14716567#14716567

# ぼやき
JavaCのビルドシステム側をひたすら疑ったりしていたけど、違った。
だいぶハマって、ほぼ一日無駄にした…。
1x1の最小GIF・PNGファイル（透過/base64）

Lazy Loadのダミーファイル、ウェブビーコンなどに

##GIF形式（39bytes）

```space.gif
R0lGODlhAQABAGAAACH5BAEKAP8ALAAAAAABAAEAAAgEAP8FBAA7

data:image/gif;base64,R0lGODlhAQABAGAAACH5BAEKAP8ALAAAAAABAAEAAAgEAP8FBAA7

 <img src="data:image/gif;base64,R0lGODlhAQABAGAAACH5BAEKAP8ALAAAAAABAAEAAAgEAP8FBAA7" alt="" height="1" width="1"> 
```

##PNG形式（68bytes）

```space.png
iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVQI12NgYAAAAAMAASDVlMcAAAAASUVORK5CYII=

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVQI12NgYAAAAAMAASDVlMcAAAAASUVORK5CYII=

 <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVQI12NgYAAAAAMAASDVlMcAAAAASUVORK5CYII=" alt="" height="1" width="1"> 
```

元データ：1px透過GIF・PNGの最小base64表現 - mayokara note（mayokara.info/note/view/328）
Kaggle - Quora上位陣リンク一覧

KaggleのQuora Question Pairs[^1]の上位陣リンク一覧です．

## [1位] 1st place solution

- Name: Maximilien@DAMI
- Kaggle Discussion: https://www.kaggle.com/c/quora-question-pairs/discussion/34355
- Qiita Memo: http://qiita.com/namakemono/items/5f204d1289f5be81a0ec

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

## [2位] Overview of 2nd-Place Solution

- Name: Silogram
- Kaggle Discussion: https://www.kaggle.com/c/quora-question-pairs/discussion/34310
- Qiita Memo: http://qiita.com/namakemono/items/b8e3ace0e08747fb0cd5

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

## [3位] Overview Of 3rd Place Solution

- Name: Jared Turkewitz
- Kaggle Discussion: https://www.kaggle.com/c/quora-question-pairs/discussion/34288
- Code: https://github.com/sjvasquez/quora-duplicate-questions
- Qiita Memo: http://qiita.com/namakemono/items/0c8ff9d8998993818569

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

## [4位] Overview of 4th-Place Solution

- Name: HouJP
- Kaggle Discussion: https://www.kaggle.com/c/quora-question-pairs/discussion/34349
- Code: https://github.com/HouJP/kaggle-quora-question-pairs
- Qiita Memo: http://qiita.com/namakemono/items/3e40c4256026517ffd64

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

## [5位] 5th Place Solution Summary

- Name: Faron
- Kaggle Discussion: https://www.kaggle.com/c/quora-question-pairs/discussion/34359
- Qiita Memo: http://qiita.com/namakemono/items/1a42455f37989d447ccb

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

## [7位] 7-th solution overview

- Name: aphex34
- Kaggle Discussion: https://www.kaggle.com/c/quora-question-pairs/discussion/34697
- Qiita Memo: http://qiita.com/namakemono/items/8f96c3e71eea95ba19ac

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

## [8位] 8th solution with part of source code(under construction)

- Name: qianqian
- Kaggle Discussion: https://www.kaggle.com/c/quora-question-pairs/discussion/34371#latest-191005
- Code: https://github.com/qqgeogor/kaggle-quora-solution-8th
- Qiita Memo: http://qiita.com/namakemono/items/18e5466776fa0b25877f

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

## [12位] Solution #12 overview

- Name: CPMP
- Kaggle Discussion: https://www.kaggle.com/c/quora-question-pairs/discussion/34342
- Qiita Memo: http://qiita.com/namakemono/items/d14696bd85b9b8673972

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

## [14位] 14th Place Solution - Code

- Name: Wojtek Rosinski
- Kaggle Discussion: https://www.kaggle.com/c/quora-question-pairs/discussion/34549
- Code: https://github.com/Wrosinski/Kaggle-Quora
- Qiita Memo: http://qiita.com/namakemono/items/06bdcd8af90dd2588cd3

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

## [23位] 24th Place Solution Repo

- Name: AhmetErdem
- Kaggle Discussion: https://www.kaggle.com/c/quora-question-pairs/discussion/34534
- Code: https://github.com/aerdem4/kaggle-quora-dup
- Qiita Memo: http://qiita.com/namakemono/items/15fef4eec14181696dc7

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

## References

[^1]: Kaggle, [Quora Question Pairs](https://www.kaggle.com/c/quora-question-pairs), 2017.
Apacheの自分用メモ


### URLクエリを判定する方法

 URLクエリが`download=true`ならば、画像ファイルをダウンロードさせる設定を行った。(Apache2.2)
 
https://serverfault.com/questions/445857/make-apache-or-iis-add-a-header-if-a-certain-query-string-is-present:title 参照


```text:httpd.conf
RewriteEngine on
RewriteCond %{QUERY_STRING} (^|&)download=true(&|$)
# 環境変数"X_ACCESS_DEVICE"にNULLを設定
RewriteRule .* - [E=X_ACCESS_DEVICE:NULL]
Header set Content-Disposition attachment; env=DOWNLOAD
```


* Apache2.4だと`<If>`ディレクティブで、簡単に判定できるらしい。なんでApache2.4をインストールしなかったんだろう。
https://mariobrandt.de/archives/apache/apache-2-4-disallow-access-to-a-certain-location-if-a-query-string-is-set-952/

```txt:httpd.conf
 <If "%{QUERY_STRING} =~ /action=login/">
     Require ip 192.168.178.100
 </If>
```

* RewriteCond, RewriteRuleの使い方が難しいなあ。。。


### RewriteRuleの使い方
http://oxynotes.com/?p=7392
https://httpd.apache.org/docs/current/rewrite/flags.html
Vagrant上のファイルをVScodeで編集 for Mac

VagrantをプライベートネットワークでSSH接続してVSCode上でファイルを編集できるようにします。
Boxは自分で用意しといてください。今回はCentOS7.2で行います。

## Vagrantのネットワーク設定

Vagrantfileを編集してIPを指定します。
今回はデフォルトをそのまま使います。

```ruby:Vagrantfile
.
.
config.vm.network "private_network", ip: "192.168.33.10"
.
.
```

設定したら`vagrant up`で起動しといてください。

## VSCodeプラグインのインストール

エディタの左側の拡張機能ボタン(またはShift + Command + X)からRemote VSCodeというプラグインをインストールします。

## VSCode設定ファイルを編集

その後、Code > 基本設定 > 設定(またはCommand + ,)から設定ファイルに以下を追加します。

```json:設定ファイル
{
    //-------- Remote VSCode configuration --------
    // Port number to use for connection.
    "remote.port": 52698,

    // Launch the server on start up.
    "remote.onstartup": true
}
```

## VSCodeサーバー起動

F1キーを押して、「Remote: Start server」と検索してEnterでサーバーを起動します。
するとエディタ左下に「Starting server」と表示されます。

## SSH接続

VSCode上で表示 > 統合ターミナル(またはControl + `)でターミナルを開きます。
そこで、

```
$ ssh -R 52698:127.0.0.1:52698 vagrant@192.168.33.10
```

でSSH接続できます。

## rmateのインストール
接続したVagrant上にrmateをインストールします。

```
$ sudo wget -O /usr/local/bin/rmate https://raw.github.com/aurora/rmate/master/rmate
$ sudo chmod a+x /usr/local/bin/rmate
```

## ファイル編集

あとはそのままSSH接続している状態のVagrant上で、編集したファイルを以下のコマンドでVSCodeで開くことができます。

```
$ rmate -p 52698 ファイル名
```
FindBugs(SpotBugs)の自分用メモ


調べたことをメモしていきます。

## FindBugsのバージョン
* 最新は3.0.1(2015年)で、Java8に対応している
* SpotBugsは開発が止まったFindBugsの後継ツール


https://www.slideshare.net/WorksApplications/spotbugsfindbugs-erp
http://blog.kengo-toda.jp/entry/2016/11/14/235642


## FindBugsで見つけたバグ

#### Integer の参照比較は疑わしいです。

```java
Integer a = 1000;
Integer b = 1000;
boolean rtn = a == b; //equalsメソッドを使うべき
```

* 比較している値が127以下だったので、不具合にはならなかった。。。


#### 条件テストを繰り返しています

```java
if (a != null && a != null) {
  boolean c = true;
}
```

#### 非直列化可能オブジェクト ～ に格納しています。
* HttpSessionにはシリアライズ可能なオブジェクトを格納する必要がある。

http://www.ne.jp/asahi/hishidama/home/tech/java/j2ee/session.html
http://konnichiwa-dou.cocolog-nifty.com/blog/2006/06/objectserializa_dd5d.html
「進捗・どう・です・か」をランダムに表示し「進捗どうですか」が完成したら煽ってくるプログラムをES６で書いてみる

ちょっとネタが古いですが面白そうだったのでコーディングしたいと思います。

## **プログラム**

```JavaScript
const words = ['進捗', 'どう', 'です', 'か'];

let result = '';
while (!result.endsWith(words.join(''))) {
  const ramdomIndex = Math.floor(Math.random() * words.length);
  result += words[ramdomIndex];
}

console.log(`${result}???`);
console.log(`
＿人人人人人人人＿
＞進捗どうですか＜
￣Y^Y^Y^Y^Y^Y^Y￣`);
console.log(`${result.length}文字で煽られました。`);
```

```
Console


ですどう進捗か進捗どうかかどうかかですかかかかどうどうかですどう進捗どうどうどうどう進捗かどう進捗どうどう進捗どうかかかかどうかかですですですです進捗ですかかかかです進捗進捗どうか進捗進捗どうですですですどうですかどうですかどう進捗ですですどうか進捗進捗進捗進捗どうかかどうです進捗かですか進捗進捗進捗か進捗どう進捗です進捗ですです進捗どう進捗進捗かですですどうですですかどうですかかどうかですです進捗です進捗です進捗です進捗進捗進捗進捗かどうか進捗どうどうどうです進捗かどうかですです進捗進捗進捗どうどうどう進捗進捗進捗ですですかどうどうですどうどうです進捗か進捗かかどうどうですどうどう進捗どうか進捗か進捗か進捗どうかか進捗か進捗かかどうどうかかどうどうかどうです進捗です進捗どうですか???

＿人人人人人人人＿
＞進捗どうですか＜
￣Y^Y^Y^Y^Y^Y^Y￣

 345文字で煽られました。
```
## **String.prototype.endsWith()**

**.endsWith()** は対象の文字列の末尾に引数の文字列が存在するかを真偽値で返します。
**Array.prototype.join()** は引数の文字列で配列を結合した文字列を返します。
プログラムでは **result** が **'進捗どうですか'**で終了するかを判定し終わらない限りループを続けます。
```result.indexOf(words.join('')) >= 0```で同様のことができますが、**.endsWith()** を使ったほうが何をしたいのかが明確になります。

## **array[Math.floor(Math.random() * array.length]**
ES6ではありませんが、配列にランダムなインデックスで要素にアクセスするイディオムです。

## **テンプレート文字列**
**``（バッククォート）**で囲む文字列リテラルです。
**\n** を書かなくても改行をそのまま認識します。
**${}（プレースホルダー）**に変数・関数をそのまま埋め込むことができます。
（以前のように **'+'** で結合する必要がありません。）


ここまで読んでいただきありがとうございました。
2017年WordPressでサイトを一から作る。開発環境構築編 - vccwを使ってサクッと開発を始める。

## 2017年久しぶりにWordPressでサイトを作ることがあり、その際にしたことを記録がてら記事にする
色々な手法を比較調査し、最終的に行き着いたのはvccwでの環境構築だった。
なお、**Windows10**での開発記である。

### 比較した開発手法たち
**ローカルにPHPとMySQLを入れる**
本屋でパラパラと立ち読みしたけど未だにXAMPPが紹介されているんだなぁ。
Windowsって環境汚したくないし、**即却下**
Macだったとしてもローカルには入れたくないぞ、私は。

**Dockerを使った開発環境の構築**
Docker使って開発できればオシャレじゃない？と思い、まず調べてみるけどWordPressとあんまし相性が良くない。
PHPとMySQLのコンテナは別にするのがベターだし、メール送るとか色々考えるとめんどくさい。
調べた範囲内ではworkerというDockerベースの開発手法があるらしいが、一台Vagrantを噛ませた上にコンテナを作っていく仕組みらしい。
http://wckr.github.io/

ただ、Dockerベースはどうにもトライしている人が少ない感じがして、理由を察するに採用するメリットが薄いんだろうなということで却下。

**VM(Virtual Box)を使った開発環境**
仮想マシンを立ててその中にWordPressに必要なものを入れていく。
色々な参考記事も多いし、これがベストな選択かということで採用。
そのなかでもVCCWというVagrantのBoxを使うのが一番良さそうだと言うことで使ってみました

## VCCWのメリット
- Virtual BoxとVagrantがあればすぐにWordPressが立ち上がる
- WordMoveというローカルと本番の同期を行えるツールが入ってる

ローカルから本番へのアップロードって今時どうやってるんかなということは今回やり始める前に気になっていたことであった。
どうもWordMoveで同期という記事が多く見かけ、VCCWならそれが入っているので使える。
(注)なお、本番サーバがないのでまだ試せていない。

### 仮想マシンの容量について
一番心配だったことは自分のマシンは残りのHDD容量が20GBぐらいしか残っていなく、仮想マシンがどれぐらいの容量を使うのだろうかということ。
なのでDockerの方が容量的に軽そうだしということもあり、最初にDockerベースの開発手法を調べていた。
結局のところ「Virtual Box」、「Vagrant」、「VCCW」を全部入れても3GBぐらいしか使わなかったので安心した。(Virtual Boxはもとから入っていたのだが…)

## VCCW導入までの手順
### Virtual Boxをインストールする
公式から最新版をインストールしましょう
https://www.virtualbox.org/

### Vagrantをインストールする
公式から最新版をインストールしましょう
https://www.vagrantup.com/

### Vagrant-hostsupdaterプラグインをインストールする
無いと辛いので入れましょう。
Windows10でユーザー名が日本語名の場合はここで要注意
普通にやると後々エラーが起きて、起動できないです。
```
* Unknown configuration section 'hostsupdater'.
```
なので、まずはvagrant用のデフォルトディレクトリを設定して上げる必要があります
``` コマンドプロンプト 
mkdir c:\.vagrant.d
set VAGRANT_HOME=c:\.vagrant.d
↓永続化
setx VAGRANT_HOME "c:\.vagrant.d"
```
ディレクトリは例ですのでお好きなところにどうぞ。
上が終わったら
``` コマンドプロンプト
vagrant plugin install vagrant-hostsupdater
```

### VCCWをGithubからcloneする
``` コマンドプロンプト
cd 好きなディレクトリ
git clone https://github.com/vccw-team/vccw.git my-wordpress
```

### vagrant upする

## さいごに
正直後半の方はいろいろな記事があるので、それを参考にしてという気持ちがあります。
ただ、vagrant-hostsupdaterというプラグインで２回ぐらいチクショーと思ったので、そこだけ言いたかった。
世の人々はMacで開発が多いだろうからこんなことにはぶち当たらないかと思いますが、Windowsでやる人も少なからずいるとは思うので…。

７年前以上前に触れてきてなかったWordPress開発ですが、VCCW便利～～という気持ちでいっぱいです。
NativeBaseのIconコンポーネントが表示されず（?になる）はまった

#はじめに
この記事は不具合ではなく、ReactNative/NativeBase初学の筆者がIconコンポーネントの仕様を誤解していたためはまった内容になります。

お恥ずかしいミスですが、他にも初学の方で同じポイントでハマり時間を浪費することもあると思い記事にしておきます。

なお、インストール方法が原因でアイコンが一切表示されない場合もあるのでその場合は別の記事を参考にしてください。

#概要
##現象
NativeBaseのIconコンポーネントで指定したアイコンが一部正しく表示されなかった。

##試した対応
react-native-vector-iconsのインストール方法やビルドの設定に問題があるかと疑ったが解決せず

##原因
原因はアイコンフォントの種類を Icon コンポーネントの props（theme)で指定しない場合defaultのIoniconsのアイコンを表示するため。

##結論
たまたまIoniconsにあるアイコン名であれば表示され、それ以外は表示されていなかっただけだった。フォントを指定してやれば表示される。

# 例
IoniconsでなくFontAwesomeのアイコンを指定する場合

``` test.js:JavaScript
<Icon theme={{iconFamily: 'FontAwesome'}} name='trash' />
```

# 愚痴

[NativeBaseのIconのドキュメント](http://docs.nativebase.io/Components.html#icon-def-headref)にiconFamilyの指定について書いて欲しかった。。。

ちなみに[react-native-vector-icons](https://github.com/oblador/react-native-vector-icons)は読み込む時点でどのアイコンセットを使うか決めているのでこういうハマり方はないわけですね。

```
import Icon from 'react-native-vector-icons/Ionicons';
```

[ソースコード](https://github.com/GeekyAnts/NativeBase/blob/master/src/basic/IconNB.js)を追えば一目瞭然でしたね。。。

#　他の原因
参考までに他の原因について言及します。

実際、installが上手くいっていない場合はfontファイルやgradleに設定が記載されない場合あります。公式を参考に必要な記述やファイルが作成されているか確認してみてください。

単にlinkできていなかったり、cleanしてビルドしなおせば上手く動作したりということもありました。

[react-native-vector-icons#installation](https://github.com/oblador/react-native-vector-icons#installation)

検索するといくつかIssueがでてきます。自分は先にこちらを疑ってハマりました。
[Icons not showing](https://github.com/GeekyAnts/NativeBase/issues/138)

# 環境
一応記載しておきます。
- MacOSX
- Node.js v7.8.0
- react-native 0.47.2
- native-base 2.3.1
Xcode から iTunes Connect アップロード時に -22421 エラーが出続ける際の対処法

## 概要

最近 Unity で iOS 書き出しをしたアプリを Xcode から iTunes Connect にアップロードする際にエラーに悩まされたので、その対処法を忘却録として残しておきます。

特に Unity 依存の問題という訳ではないと思うので、普通に Xcode で開発している場合にも良いはず。

## 現象

Archive したアプリを Organizer から "Upload to App Store..." した時に、以下のエラーが。何度試してもこれ。

**This action could not be completed. Try again. (-22421)**

![スクリーンショット 2017-08-31 23.35.56.png](https://qiita-image-store.s3.amazonaws.com/0/199909/bd0f2c5f-9989-916d-caf2-039588f26f7d.png)

ググって stack overflow を見ると、 [「Apple のサーバー問題だから待ちましょう」的な記事](https://stackoverflow.com/questions/35429801/this-action-could-not-be-completed-try-again-22421)がかかったので、まあエラーメッセージ的にもそうだよなーと思って、次の日に。

すると次の日も同じエラーが。。実際は違うエラーを吐くべきだけど、 Apple が 22421 のエラー吐いているのではないか説が浮上。以下の対処法でなんとかなりました。

## 対処法

今回の場合、 Organizer でダイレクトにバイナリをアップロードせずに、 Application Loader を使ったら前に進めました。

![スクリーンショット 2017-09-03 17.23.48.png](https://qiita-image-store.s3.amazonaws.com/0/199909/5a1d0bf2-d2ab-707f-2aad-89eb16d80c25.png)

Organizer でダイレクトに上げずに、 Export したものを Application Loader で上げるという対応です。上の画像を参考に。

![スクリーンショット 2017-09-03 17.27.30.png](https://qiita-image-store.s3.amazonaws.com/0/199909/c8a2c059-0930-b5b9-3290-c62460eeeef9.png)

Application Loader は Xcode 起動時に Xcode > Open Developer Tool > Application Loader を選択。

起動して、 App をデリバリを選択して、 Export で書き出した ipa ファイルを選択。

すると、違うエラーメッセージが表示されました。 64bit 関連のエラー（ ITMS-90086 ）。今回の場合、こちらのエラーの方が粒度が小さかったので、これをまたググって原因潰してアップロードしたら無事エラーなく通過できました。

ちなみに参考にしたのはこちらの記事 > http://waken.hatenablog.com/entry/2016/08/10/084135

## まとめ
22421 エラーが出続ける場合は、 Application Loader 経由で試しに上げてみると、実際はアプリに問題があって、本来 Apple が返すべきエラーを吐いてくれるかも。という話でした。
start up ZendFramework

## いまさらですが

ZendFrameworkを利用した開発に入るかも知れないので、Hello world くらいしておこうかと。

## インストール

* XAMPP 5.6.31
* Composer 1.5.1

## ダウンロード

* ZendFramework-2.4.13
* スケルトン (https://github.com/zendframework/ZendSkeletonApplication)

最新の 3 ではなく、2 を使っているようなので、PHPも5.6台にしておこう。


## 準備

ZendFramework は `D:\xampp\ZendFramework` に解凍。

D:\xampp\php\php.ini にZendFrameworkのライブラリを追加。`php\PEAR`より先に記述しないと PEAR のなかに配置された Zend Framework Minimal Package を優先してしまうとのこと。
`include_path="D:\xampp\ZendFramework\library;D:\xampp\php\PEAR"`

スケルトンアプリケーションを`D:\xampp\htdocs\Zend` に配置し `.htacces` を作成。

```
RewriteEngine on
RewriteBase /zend
RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php
```

D:\xampp\apache\conf\httpd.conf の設定します。DocumentRootは先程のスケルトンを配置したディレクトリの publicフォルダです。

```
// コメントを解除（頭の # をとる）
LoadModule rewrite_module modules/mod_rewrite.so

<Directory "/xampp/htdocs">
    AllowOverride All
</Directory>

DocumentRoot "D:\xampp\htdocs\Zend\public"
<Directory "D:\xampp\htdocs\Zend\public">
    Options Indexes FollowSymLinks Includes ExecCGI
    AllowOverride All
    Require all granted
</Directory>
```

D:\xampp\htdocs\Zend で `composer install` を実行。

## Zend が起動したことを確認

`http://localhost` を開く

![image.png](https://qiita-image-store.s3.amazonaws.com/0/114529/5f55ea0e-48e2-52b0-214e-56dc11327445.png)

## 簡単な例を実装

`D:\xampp\htdocs\Zend\module\Application\src\Controller\IndexController.php` に helloAction を実装。

```
class IndexController extends AbstractActionController
{
    public function indexAction()
    {
        return new ViewModel();
    }

    public function helloAction()
    {
        $viewModel = new ViewModel();
        $viewModel->message = 'Hello, world!';
        return $viewModel;
    }
}
```

`D:\xampp\htdocs\Zend\module\Application\view\application\index\hello.phtml` を作成する。注記：PHPコードのみからなるファイルでは、終了タグ ("?>") は含みません。

```
<?php

echo $message;
```

`http://localhost/application/hello` にアクセスし、「Hello, world!」が出ればOK。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/114529/6c144f63-a990-7205-ea8c-9fd66a7e5c13.png)


以上。
Eclipseでデバックしているとブレークポイントがないのに止まるのはなぜ？に関連したリンク集

### なぜ止まる？
- [Eclipse ブレークポイントで設定していないところで処理が中断する対処法 - AXE-AXESS-の、≪……で!?≫](https://blogs.yahoo.co.jp/axe_axess/55745354.html)


### なんだかわからないけど止まらないようにしたい時
![Screen Shot 2017-09-03 at 17.16.00.png](https://qiita-image-store.s3.amazonaws.com/0/159761/b39ac87c-cdd3-9d28-cb14-0c98de03894b.png)

- [Eclipseでデバッグ中に、ブレークポイント以外で中断してしまう時 | ハックノート](http://hacknote.jp/archives/4332/)


### ThreadPoolExecutorで止まる(Tomcat)
- [ThreadPoolExecutor で勝手に止まる - サブノート](http://subnote.hatenablog.com/entry/2015/04/21/165741)
- [TomcatをEclipseで使用するとき、なぜかTomcat側のThreadPoolExecutorクラスの中で止まる - arcanum_jpの日記](http://d.hatena.ne.jp/arcanum_jp/20121128/1354107433)


### 解除したはずのブレークポイントで止まる
- [eclipse and Android奮闘記 - 日々是知新](http://www.asteria-net.jp/~mars/weblog2/2012/05/eclipse-and-android-4.html)
CentOS設定記録1 サーバー作成編

#はじめに
##目的
- Linux動作についての学習
- 今回はrootでのSSH接続まで

##その他
- 詰まりそうなところはFW設定とポートフォワード
- 記載者の知識は1年と少し前にLPIC Lv1取得した後触ってないレベル

#構築環境
- IDCFクラウド
- CentOS7.3

#手順
##仮想マシン作成
1. IDCFクラウドへ登録
2. light.S1プラン
3. CentOS7.3 64bit
4. ボリューム 15G
5. SSH Keyを作成し保存
6. 5で作成したSSH Key名を選択
7. その他適切に埋めて作成
8. IDCFクラウドへ登録した時のメールアドレスにrootパスワード受信

##ログイン
- [コンソール](https://console.idcfcloud.com/) → コンピューティング → 仮想マシンメニューから作成した仮想マシンがあることを確認
- 仮想マシン名クリック → コンソール → コンソールアクセス
- ログイン成功 :)

##ネットワーク設定
注：つまりポイント
FW設定だけではだめで、ポートフォワード指定をしないといけない（パブリックIPと1vs1で紐づいていない）
また、ポートフォワードで指定したパブリックIPについてもFW設定が必要

1つのパブリックIPへのアクセスをたくさんの仮想マシンへ紐づけられる仕様のため、ポートごとにポートフォワード（ポートの紐づけ先）の指定が必要
[IDCFクラウドFAQに記載あり](https://www.faq.idcf.jp/app/answers/detail/a_id/98/c/1/)


###[コンソール](https://console.idcfcloud.com/) → コンピューティング → IPアドレスメニュー → ファイアウォール
- コメント：SSH接続
- ソースCIDR：MY IP
- タイプ：SSH

###[コンソール](https://console.idcfcloud.com/) → コンピューティング → IPアドレスメニュー → ポートフォワード
- コメント：SSH -> 作成マシン
- パブリックポート：22
- プライベートポート：22
- 仮想マシン：作成マシン

###SSH接続
- [コンソール](https://console.idcfcloud.com/) → コンピューティング → IPアドレスメニューで対象のIPアドレスをコピー
- teratermでログイン
- ユーザー名：root
- RSA/DSA～鍵を使う：秘密鍵は仮想マシン作成手順5で保存した鍵を使用

#あとがき
今回は参考URLに記載したIDCFクラウドめちゃ楽ガイドのままでできた
次はSSH接続のポート変更・別ユーザーでの接続を行う

#参考URL
[IDCFクラウドめちゃ楽ガイド](https://www.idcf.jp/cloud/pdf/IDCFCloud_installation_guide_nonreg.pdf)
virtualenvの環境でOpenCVを使えるようにする

### 1. macにOpenCVをインストール

```bash
$ brew tap homebrew/science

# 情報確認
$ brew info opencv

# インストール！
$ brew install opencv

# インストールできてること確認
$ ls -l /usr/local/Cellar/opencv/
total 0
drwxr-xr-x  10 yoichan  admin  340  8 27 15:17 3.3.0_3

```
参考
https://jjyap.wordpress.com/2014/05/24/installing-opencv-2-4-9-on-mac-osx-with-python-support/

### 2. virtualenvの環境下で使えるようにする

```bash

(env) [~/work/Komachin/]
$ pip install opencv-python

# importできること確認
(env) [~/work/Komachin/]
$ python
Python 3.6.2 (default, Aug 26 2017, 16:47:44)
[GCC 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.42)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>>
```

参考
http://www.tcom242242.site/entry/2017/02/11/124741
Ubuntu 18.04 で Julius を使う

音声認識システム [Julius](http://julius.osdn.jp/) を Ubuntu 18.04 で使ってみました。

インストール

```bash
git clone https://github.com/julius-speech/julius
cd julius
./configure
make
sudo make install
```
/usr/local/bin/julius　にインストールされます。

文法認識キットのインストール

```bash
git clone https://github.com/julius-speech/grammar-kit
```

サンプルの実行
-charconv SJIS UTF-8　をつけないと文字化けします。

```bash
cd grammar-kit/SampleGrammars/fruit
julius -C testmic.jconf -nostrip -charconv SJIS UTF-8
```

実行した様子

![julius_sep0301.png](https://qiita-image-store.s3.amazonaws.com/0/179446/687d9db3-4ee3-54d2-a331-1866ac47587b.png)

マイクからの入力でなく、sample.wav を処理するには、

```bash
julius -C testmic.jconf -nostrip -charconv SJIS UTF-8 -input rawfile
```

enter filename->　というプロンプトが出たら、ファイル名を入れます。

実行した様子

![julius_sep0302.png](https://qiita-image-store.s3.amazonaws.com/0/179446/5176aadf-ca88-c86a-b954-2b65d5181279.png)
[備忘] python / conda環境構築の基本コマンド一覧

python、condaで環境構築を行う際の基本的なコマンドをまとめました。

# pip
- pipのアップデート

```sh
pip install -U pip
pip install --upgrade pip
```

- パッケージのインストール

```sh
pip install packageName
```

- バージョン指定でインストール

```sh
pip install 'packageName==1.1.2'
```

- パッケージのアップデート( `-U`　or `—update`)

```sh
pip install -U packageName
```

- パッケージのアンインストール

```sh
pip uninstall -y packageName
```

- パッケージの確認

```sh
pip list # list
pip  pip list -o # show outdated
```

- パッケージバージョンの確認

```sh
pip freeze
```

- 設定ファイルの書き出し

```sh
pip freeze > requirements.txt # create package list
```

- 設定ファイルの読み込み

```sh
python -m pip install -r requirements.txt
```

---

# conda
- condaのアップデート

```sh
conda update conda
```	

- 仮想環境の作成(python versionを指定)

```sh
conda create -n env-x python=3.5
```

- 仮想環境の作成(yamlファイルの読み込み)

```sh
conda env create -f env1.yaml 
```

- 作成した仮想環境一覧の表示

```sh
conda info -e
```

- 作成した仮想環境に切り替える

```sh
source activate env1
```

- 現在の仮想環境から出る

```sh
source deactivate
```

- 仮想環境の削除

```sh
conda env remove -n env1
conda remove —-all
```

- 現在の仮想環境の設定ファイルを書き出す

```sh
conda env export > env1.yaml
```

- 現在の仮想環境のパッケージを確認

```sh
conda list
```

# 参考
- [pip user guide](https://pip.pypa.io/en/stable/user_guide/#)
- [conda user guide](https://conda.io/docs/user-guide/tasks/manage-environments.html)
[レポート]cvuskさんの「青空文庫で作者っぽさ判定」をやってみた。

#僕は暗闇の中、さまよっていた。

「深層学習とやらをやってみたい。」
そう思い立ち、よく良いと言われている[ゼロから作るDeep Learning](https://www.amazon.co.jp/%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E4%BD%9C%E3%82%8BDeep-Learning-%E2%80%95Python%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%AE%E7%90%86%E8%AB%96%E3%81%A8%E5%AE%9F%E8%A3%85-%E6%96%8E%E8%97%A4-%E5%BA%B7%E6%AF%85/dp/4873117585)を読んでみた。
なんとなくわかった気がしたが、
本に載っていたコードをいじってみたがうまく動かない。
ここまでかと思い諦めかけたとき、光が差した。

[青空文庫で作者っぽさ判定（KERAS　＋　character-level cnn）](http://qiita.com/cvusk/items/c1342dd0fff16dc37ddf#character-level-cnn)

#学習してみた

青空文庫のクローリングが終わり、
記事のaozora_cnn.pyを実行してみました。
epoch100まであるのですが、３日かかって学習がすべて終わりました。

epoch11のモデルのファイルが最高値みたいでした。

```
チェックポイントを設定しています。
チェックポイントにより、
検証時のaccuracyが最高値の場合は、
/tmp/配下にその時点のモデルをweight*.h5dfファイルとして保存します。
```

```
Epoch 11/100
378700/378774 [============================>.] - ETA: 0s - loss: 0.1420 - acc: 0.9449Epoch 00010: val_acc improved from 0.87362 to 0.89609, saving model to /tmp/weights.10-0.14-0.94-0.41-0.90.hdf5
378774/378774 [==============================] - 2298s - loss: 0.1420 - acc: 0.9449 - val_loss: 0.4083 - val_acc: 0.8961
```


#判定してみた

epoch11以降はモデルのファイルが保存されなかったので、
epoch11のチェックポイントで作成した/tmp/weight-*.h5dfファイルを指定して、aozora_classification.pyを動かしてみました。

判定する文字列はsampleにもあるやつで。

```
中島敦『山月記』の冒頭を判定してみます。

~隴西の李徴は博學才穎、天寶の末年、若くして名を虎榜に連ね、ついで江南尉に補せられたが、性、狷介、自ら恃む所頗る厚く、賤吏に甘んずるを潔しとしなかつた。~
```

結果は、・・・

 | 夏目漱石 | 芥川龍之介 | 森鴎外 | 坂口安吾
---|---|---|---|---
0 | 1.056089e-09 | 1.293081e-07 | 0.000033 | 3.249434e-07

森鴎外っぽいってなるってる！
できたっぽい！（全くコード変えてないから当たり前ですが:hugging_face::hugging_face::hugging_face:）

#「夢なら覚めた。だけど僕らはまだ何もしていない。進め。」

判定してみた。夏目漱石っぽいみたい。

 | 夏目漱石 | 芥川龍之介 | 森鴎外 | 坂口安吾
---|---|---|---|---
0 | 0.125387 | 0.000199 | 6.651750e-07 | 0.026747
Gitで何回もコミットとマージをしたブランチをコミットだけをチェリーピックしてブランチ造り直す方法

こんなことをすることになった**経緯**
1. branchBをベースにつくったbranchAがあります。
2. branchAでは何回もCommit(& Push)をしました。
3. branchBの変更を取り込むためにbranchBをbranchAへ何度かMargeをしました。
4. とある日・・・branchDをベースにしなければならないことが発覚しました:scream:
5. branchDをベースにしてbranchCを造ることになりました:cold_sweat:

- branchA : 何回もコミットとbranchBをマージをしたブランチ
- branchB : branchAのベースになったブランチ
- branchC : buranchAのコミットだけをチェリーピックしたいブランチ
- branchD : branchCのベースにしたいブランチ

### 1. branchAをCheckoutする
```shell-session
$ git checkout branchA
```

### 2. コミットのハッシュとコメントをCSVに出力する
1. コミットのハッシュとコメントを確認する
2. ブランチが開始されたCommitを特定する
3. 特定したコミットの日付を確認する
3. 特定したコミットの日付以降のハッシュとコメントをCSVに出力する

```shell-session
$ git log --pretty=onelinere
7c4a... {Commitコメント1}
c037... Merge branch 'master' of ....
3bb5... {Commitコメント2}
...<省略>...

$ git log 1201...
commit 1201...
Author: xxxxxx
Date:   Sun Apr 16 17:32:17 2017 +0900

    {Commitコメント}

$ git log --pretty=onelinere --after='2017-04-16 17:32:00' > cherry-pick.csv
```

### 3. CSVを加工してcherry-pick用コマンドを造る
1. CSVをExcelで開く
2. コメントが「Merge branch~」になっている行(Marge)を削除する
3. 列を左に挿入して降順で番号をつける
4. 古いCommit順に並べるために、挿入した番号の昇順でソートする
5. 連番とコメントを削除してハッシュのみ残す
6. ハッシュの隣の列に「="git cherry-pick "&{ハッシュのセル}」を入れて一気にコマンドを造る

### 4. branchCを造る
1. branchDをチェックアウトする
2. branchCを造る

```shell-session
$ git checkout branchD
$ git checkout -b branchC
```

### 5. branchCにbranchAのCommitだけcherry-pickする
1. 3. で造ったcherry-pickコマンドを次々に実行する
2. 途中でコンフリクトしたら解決して再度実行していく

```shell-session
$ git cherry-pick 1201...
$ git cherry-pick 8bf1...
$ git cherry-pick d5c8...
$ git cherry-pick c2b9...
...<省略>...
```