OmniAICreator/Qiita-1.07M huggingface dataset:
ObjCとSwift3が混在するプロジェクトでメソッド名にWith~がついてObjC側からSwiftのメソッドが見られない時の対策

Xcode8でBuildが通らなくなる。

# 環境

* macOS Sieera 10.12
* Xcode8 8A218a
* Swift3.0
* ObjCのプロジェクトにSwiftのコードを混ぜ込んだプロジェクト
    * bridgeヘッダー等を作ってやるやつ


# 現象

* `application-Swift.h` 等でSwift側のメソッドをObjCに共有しているところで、メソッド名が勝手にWith~とつく
* ObjC側で、Withの名前を指定しても、Swift側のコードを呼び出せない

## 具体的に

Build時にapplication-Swift.hは更新される。WithTarget付きに。

``` login.swift
    func isLoggedin(target: UIViewController) -> Bool {
```

```application-Swift.h
- (BOOL)isLoggedinWithTarget:(UIViewController * _Nonnull)target;
```

※ `isLoggedinWithTarget`ってメソッド名にすると、 `.h`ファイル内で `isLoggedinWithTargetWithTarget` になるから笑えた。


# 何故勝手にWithがつくのか

* Swift3での仕様変更

> 最初のラベルを含むすべてのパラメータにわたって一貫したラベルの挙動を確立

* 引用元 [[iOS][Swift] Swift 3.0の変更点まとめ](http://dev.classmethod.jp/smartphone/iphone/implemented_proposals_for_swift3/)


# どうすればいいのか

`Impact on Existing Code` に紹介されているうちの一つでうまくいく。

```
・ Function declarations that do not include explicit first item external labels will explicitly remove the first argument's label (e.g. func foo(x: Int, y: Int) will translate to func foo(_ x: Int, y: Int)).
```
* 引用元 : * [All function parameters have labels unless you request otherwise](https://www.hackingwithswift.com/swift3)


## 具体的に

### 変更前

``` login.swift
    func isLoggedin(target: UIViewController) -> Bool {
```

```application-Swift.h
- (BOOL)isLoggedinWithTarget:(UIViewController * _Nonnull)target;
```

### 変更後

``` login.swift
    func isLoggedin(_ target: UIViewController) -> Bool {
```

```application-Swift.h
- (BOOL)isLoggedin:(UIViewController * _Nonnull)target;
```

# 最後に

Xcode8になっても、まだSwiftとObjCが混在するプロジェクト扱うとかやばいのではないかと思ってます。[Better Translation of Objective-C APIs Into Swift](https://github.com/apple/swift-evolution/blob/master/proposals/0005-objective-c-name-translation.md)
Swiftに書き換えしたい。

migrationに従ってれば問題無いのではないでしょうか。
たぶん、 `FIXME:` とか付くのかな・・・？

# 参考

* [Establish consistent label behavior across all parameters including first labels](https://github.com/apple/swift-evolution/blob/master/proposals/0046-first-label.md)
* [All function parameters have labels unless you request otherwise](https://www.hackingwithswift.com/swift3)
* [[iOS][Swift] Swift 3.0の変更点まとめ](http://dev.classmethod.jp/smartphone/iphone/implemented_proposals_for_swift3/)
Reveal.jsでのPDF出力方法メモ

#PDFでの出力方法
しょっちゅう忘れるので・・・

####下記でブラウザアクセスで確認できるように実行

```
$ grunt serve
Running "connect:server" (connect) task
Started connect web server on http://0.0.0.0:8000

Running "watch" task
Waiting...
```

####ブラウザでアクセスして、確認「http://localhost:8000/#/」

####次に、URLを変えてアクセス「http://localhost:8000/?print-pdf#/」
ブラウザの表示はおかしくなりますが、その状態で、「Ctrl+P」にて、印刷時に「PDFで出力」を選択して印刷すればできます。
C++11のアンチパターン：イベントハンドラとしてラムダ式を使う

実際にプロダクトにC++11を投入した際、これは便利だと使い始めたC++11の機能に関してあとからウッとなってきたので共有を。

ラムダ式の使い方にはおおまかに2種類ある
--
これはC++に限らないことで、ラムダ式（もしくは無名関数）をサポートする手続き型言語全般について言えることなのですが、ラムダ式の使い方は大まかに2種類です。

- map, filter, reduce をはじめとした高階関数に渡してその場限りで使ってもらう
- イベントハンドラとして渡していつかのタイミングで（ときには違うスレッドから）呼び出してもらう

前者、高階関数に使い捨てで与えるの、これは単純に便利です。がんがん使っていきましょう。
問題は後者、イベントハンドラです。

C++のラムダ式はクロージャの寿命を保証してくれない
--
C++というOOP言語を使っている以上は、イベントハンドラとして渡すようなラムダ式はほぼ確実に `this` をキャプチャしていることと思います。よくあるGC環境向け言語なら `this` がクロージャとなり、関数オブジェクトが死ぬまで親である `this` オブジェクトも延命されます（これはこれでややこしいメモリリークの原因になるので厄介ではあるものの）。
ところがC++11ラムダ式がキャプチャした `this` はあくまでアドレス値、これを知っているからと言ってオブジェクトが生存していることを保証してくれません。

せっかくC++11で整備されたスマートポインタでメモリアクセス違反を防いでいたつもりでも、ラムダ式が無効な `this` を参照してしまい、イベントが発生した瞬間にクラッシュという悲劇が起こりうるわけです。

ラムダ式に `this` そのものではなく `shared_ptr`  でくるんだスマートポインタを渡すのでは？　いやそれは無理です。スマートポインタを一回だけ作って運用するのはオブジェクトの外側、利用者側でやることであり、オブジェクトの内部でも `this` のスマートポインタを作ってしまったらそれは二重管理です。確実に二重deleteを起こしてクラッシュするだけ。

C++11以降のイベントハンドラ
--
オブジェクトの寿命管理を人間の注意力に依存しないというポリシーを守りつつイベントハンドラを合理的に設計するにはどうすべきか。前項で軽く否定したのですがやはり親オブジェクトを指すスマートポインタははずせません。 `shared_ptr` を使って親オブジェクトの方を延命するか `weak_ptr` を使ってイベントハンドラの方に勝手に死んでもらうかはケースバイケースとして。

このような方法を考えました。

1. イベントハンドラはやはり `std::function` ではなく `std::shared_ptr<イベントハンドラインターフェース型>` （もしくは `std::weak_ptr<イベントハンドラインターフェース型>` ）とします。
なんか昔のJavaプログラミングみたいですね。
2. 親オブジェクトが自分自身を管理するスマートポインタを知ることができるよう、<br>
●コンストラクタはprivateにし、新規作成時はstaticファクトリ関数でスマートポインタを得られる形にします。<br>
●ファクトリ関数は新規作成したオブジェクトにもスマートポインタを `weak_ptr` の形で与えます。
3. 親オブジェクトはイベントにハンドラを仕込むとき、持っている `weak_ptr` か、それをロックした `shared_ptr` を渡します。

これで安全なイベントハンドラとして成立しているかと思います。 `shared_ptr` を渡して親オブジェクトを延命していくスタイルだったら、それをキャプチャした `std::function` を渡すのでもいいかも。でも親オブジェクトが例えばウィンドウビューとかだったら延命しても仕方が無いので `weak_ptr` を渡してイベントハンドラに死んでもらう方のスタイルにしかなり得ませんね。

別解？
--
別解としては、普通にラムダ式を使って `this` も参照しているイベントハンドラを仕込むんだけれど親オブジェクトのデストラクタで必ず仕込んだイベントハンドラをすべて取り下げるようにする、というのが考えられるんですが、これは⋯

- 結局人間の注意力に依存している
- マルチスレッドプログラミングだとデストラクタまわりがデッドロックの温床になりそう、また、デストラクタ周りをがちがちに排他制御で固めても絶妙なタイミングですり抜けて無効アドレスアクセスしてくる流れを完全には絶てなさそう

ということであまり良いやり方には思われませんでした。この辺、「○○そう」が多いのは軽く組んでみて「うっこれは辛い」とすぐに捨ててしまったのでもしかしたら良い実装があるのか完全に検証したわけではないせいです。パターンなどありましたらご教示いただけるとうれしいです。
IT関連サイト【随時更新】

【最近のITニュース情報網】＝トレンドを抑えるもの
アプリマーケティング研究所
	TechClips
	GIZMODO
	Gigazine
	ITmedia
	CNET Japan
	Lifehacker
	gori.me
	TechCrunch
	バズ部
	ITpro

【イベント情報（ハッカソン、勉強会、懇親会などなど）】＝学生が行くべきイベント
	dots : https://eventdots.jp/
	ATND : https://atnd.org
	connpass : http://connpass.com/
	サポーターズ : https://supporterz.jp/

【学習】＝技術の基礎を学べるもの
	ドットインストール　
	Progate　
	Schoo　 
	paiza
AWSを使用する任意のコマンドでassume roleする方法

AWS CLIとかだと`--profile`を使えばいいが、serverlessとかだとこういう機能を用意してくれていない場合がある（profileを設定できるがassume roleしてくれない）。そんな時に使えるコマンド

```bash
eval "`aws sts assume-role --role-arn [role-arn] --role-session-name assume-role-temporary | jq -r '"AWS_ACCESS_KEY_ID="+.Credentials.AccessKeyId+" AWS_SECRET_ACCESS_KEY="+.Credentials.SecretAccessKey+" AWS_SESSION_TOKEN="+.Credentials.SessionToken'` [したいこと]"
```

- AWS CLIは使えるようになっているという前提
- `jq`がインストールされているという前提
- `[role-arn]`にassumeするロールのARNを指定
- `[したいこと]`には例えば`serverless deploy`とかを入れる
【備忘録】いつも忘れるlinuxコマンド

# ファイル圧縮

```
tar zcf xxxx.tar.gz ./xxx/
```

# ファイル解凍

```
tar zxf xxxx.tar.gz
```

# ファイル検索して削除

```
find ./ -name '*.log' | xargs rm
```

# DBDumpを取得（mysql）

```
mysqldump -u username -p -h hostname database_name > mysql.dump
```


# DBDumpをリストア（mysql）

```
mysql -u username -p -h hostname target_database < mysql.dump
```

# 特定のディレクトリを指定してその中の条件にあったファイル・ディレクトリに何がしする。

```
find ディレクトリ -name パターン | xargs chmod 755
```

# ローカルからリモートホストへ転送（アップロード）

```
scp -u username -p -h hostname xxxx.tar.gz remote_username@hoge.com:/home/remote_username/
```

# リモートホストからローカルへ転送（ダウンロード）
```
scp -u username -p -h hostname remote_username@hoge.com:/home/remote_username/xxx.tar.gz ./
```

#強制的にリモートのブランチ状況をローカルにリセットする（リモートmasterを適用する場合）

```
git fetch origin
git reset --hard origin/master
```
Windows 10アップデートチェックから進まない時の対処法

<h2>ステップ１　Windowsアップデートサービスを停止する</h2>

「スタート」→「すべてのアプリ」→「アクセサリ」→コマンドプロンプトを右クリック→「管理者として実行」を選択します。
net stop wuauservと入力してWindowsアップデートサービスを停止させます。
Windowsアップデートサービスが停止するまで待ちます。後はまた使うから、コマンドプロンプトを閉じないで下さい。


<h2>ステップ２　二つのフォルダを削除する</h2>

C:\Windows\SoftwareDistributionにてDataStoreとDownload二つのフォルダの中のすべてのファイルを削除します。

<h2>ステップ３　Windowsアップデートサービスを再開する</h2>

コマンドプロンプトでnet start wuauservと入力してWindowsアップデートサービスを再び運行させます。


詳しくはこちらへhttp://jp.easeus.com/todo-backup-resource/windows-10-update-stuck-checking-for-updates.html
Solr 6+Apache ManifoldCF2.4セットアップ手順

参考：http://www.rondhuit.com/manifoldcf-manifoldcf%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97.html

**1.ManifoldCFを入手します。**
下記リンクからDL。この記事の時点でバージョン2.5がリリースされているようですが、
2.4を使用していますので、その前提で話します。

http://manifoldcf.apache.org/ja_JP/download.html#Apache+ManifoldCF+2.4%2C+2016%E5%B9%B404%E6%9C%8823%E6%97%A5

- Java 1.8を必要としています。先にインストールしてくだい。
- PostgresDBを使用します。


**2.ダウンロードしてファイルをディレクトリに展開します。場所はお好きなところでかまいません。**

`tar xzvf apache-manifoldcf-2.4-bin.tar.gz`


**3.jcifs.jar(Windows共有サーバクロール用)をDLし、以下に配置します。**

`cp jcifs.jar /path/to/manifoldcfapache-manifoldcf-2.4/connector-lib/`

**4.ManifoldCFを実行の準備を行います。**

- postgreDBの接続設定</br>

`/path/to/manifoldcfapache-manifoldcf-2.4/example/properties.xml`

下記記述を削除し

```xml:properties.xml
...
<property name="org.apache.manifoldcf.databaseimplementationclass" value="org.apache.manifoldcf.core.database.DBInterfaceDerby"/>
...
```

以下を追加してください。

```xml:properties.xml
...
 <property name=“org.apache.manifoldcf.databaseimplementationclass”  value=“org.apache.manifoldcf.core.database.DBInterfacePostgreSQL”/>
 <property name=“org.apache.manifoldcf.postgresql.hostname”  value=“127.0.0.1”/>
 <property name=“org.apache.manifoldcf.postgresql.port” value=“5432”/>
 <property name=“org.apache.manifoldcf.dbsuperusername”  value=“manifoldcf”/>
 <property name=“org.apache.manifoldcf.dbsuperuserpassword”  value=“manifoldcf”/>
 <property name=“org.apache.manifoldcf.database.name” value=“manifoldcf”/>
```

5.postgreDBに対してpasswordアクセス許可する設定を追加します。

vi path/to/your/pgsql/X.X/data/pg_hba.conf 

 # IPv4 local connections:
 host    all             all             127.0.0.1/32            ident
 ↓
 host    all             all             127.0.0.1/32            password

PostgreDBを再起動します。

`/path/to/manifoldcfapache-manifoldcf-2.4/connectors.xml`

に以下の部分をコメントアウトし、「windows shares」を選択可能に

```xml:connectors.xml
...
 <repositoryconnector name=“Windows shares”  class=“org.apache.manifoldcf.crawler.connectors.sharedrive.SharedDriveConn ector”/>
```

**7.ManifoldCFを実行**

`cd /path/to/manifoldcfapache-manifoldcf-2.4/exmaple`
`java -jar strat.jar`

設定が正しければ、起動時、自動的にPostgresに管理DBが作成されます。

ManifoldCF管理画面は下記URLで確認できます。
http://localhost:8345/mcf-crawler-ui/
IO.File.Create のあとの処理でIO.Exceptionが発生するのを回避する (.NET)

IO.File.Create("ファイル") でファイル作成したあと、作成したファイルにアクセスすると、IO.Exceptionエラーが発生し、「別のプロセスで使用されているため、プロセスはファイル ‘ファイル’ にアクセスできません。」と怒られた。

IO.File.Create("ファイル") ではファイルが開いたままになるので、閉じる必要がある。

```vbnet
IO.File.Create("ファイル").Close()
```

これで閉じられる。
C#でも同じ。
Turn xcode project into workspace


firstly create a xcdoe project, and then when you drop a file into this project and choose to place it outside of this project, xcdoe will prompt you create a new workspac and add the current project


![Screen Shot 2016-10-14 at 5.03.07 PM.png](https://qiita-image-store.s3.amazonaws.com/0/56713/1493048b-e090-ce4c-bf91-67e7e290fba7.png "Screen Shot 2016-10-14 at 5.03.07 PM.png")



![Screen Shot 2016-10-14 at 5.03.03 PM.png](https://qiita-image-store.s3.amazonaws.com/0/56713/5c95845b-e377-0315-36c8-224c84be5216.png "Screen Shot 2016-10-14 at 5.03.03 PM.png")
CygwinのVimに関連付けする

# Cygwinのvimにファイルを関連付ける方法。
WindowsユーザでCUI版vimが大好きな人向け。
.cppとか.hをダブルクリックするとCygwinのvimで開くことができるようになる。

以下のようなcmdファイルをパスが通っているフォルダに作成する。[^1]

```bat:vim.cmd
REM @echo off
if "%1" == "" goto start
set arg="%1"
set str1=%arg:\=/%
set str2=%str1:C:=/cygdrive/c%
C:\cygwin64\bin\mintty -e /bin/bash -l -c "vim %str2%"
goto end

:start
C:\cygwin64\bin\mintty -e /bin/bash -l -c "vim"

:end
```

[^1]: Cygwinの32ビット版を使っている人はcygwin64をcygwinへ書き換える。

関連付けたいファイルを右クリックして
プログラムから開く(H) > 規定プログラムの選択(C) > 参照(B)
と選択して、上記ファイルを関連付けをする。
.htaccessでLaravelとhtmlファイルを共存させ、簡単に部分システム化する方法

静的HPに一部システム導入する案件でLaravelを利用したのですが、
Laravelと静的ファイルの共存について簡潔な記事がなかったので纏めておきます。

index.phpをいじったりしなくても
.htaccessを少し修正すれば簡単に部分システム化できますよ！

例）
■ドメイン
`http://example.com/`

■サーバーのフォルダ構成（直下）

・index.html
・laravelフォルダ

![スクリーンショット 2016-10-14 15.06.35.png](https://qiita-image-store.s3.amazonaws.com/0/144415/27e29963-8360-981c-ad10-b766b60e93c8.png)


■状況

「`http://example.com/`」にアクセスするとindex.htmlが表示されるサイトに、
「laravel」というLaravelプロジェクトフォルダをアップした状態です。

追加するシステム部分のURLは、「/test」を追加した「`http://example.com/test`」
にしたいです。
![スクリーンショット 2016-10-14 15.51.54.png](https://qiita-image-store.s3.amazonaws.com/0/144415/57f07293-888b-36d9-a6f3-a39fc5b0c36d.png)


　ちなみに、この状態で「`http://example.com/test`」を叩いても、当然エラーです。


■解決策
以下のような.htaccessをドメイン直下に配置します。
![htaccess.png](https://qiita-image-store.s3.amazonaws.com/0/144415/77869635-5238-2002-b12b-0616d2ecd6af.png)

↓コピペ用

```
<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>
    RewriteEngine On
    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ /$1 [L,R=301]
    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ /laravel/public/index.php [L]
</IfModule>
```

RewriteRuleに　「 ^/プロジェクト名/public/index.php [L]」を記載してください。
（index.phpにパスを通す意味や、.htaccessの記述説明はここでは割愛します。わからない方は後ほどググってみてください。）


これで「`http://example.com/test`」を叩くとLaravelで処理され、
「`http://example.com/`」の時はそのままindex.htmlが表示されます。

あとはLaravel側の処理を書き足していけば、静的HPの部分システム化完了です！


ちなみに、Laravelの階層が変わったことにより、asset()が通常通り効きません。
asset()を使うとドメイン直下を見に行ってしまうので、以下のような方法で解決できます。

①public配下に置いていたCSSやJSをフォルダごと「`http://example.com/`」直下に移動する
②ファイルのパスの前に「`/laravel/public/`」を追加し指定する。
　例）`src="/css/example.css"`  →　 `src="/laravel/public/css/example.css"`
③vendorの中を改修しに行く。


個人的には②の方法で解決が一番手っ取り早く、かつ混乱も少ないかと思います。


以上、「.htaccessでLaravelとhtmlファイルを共存させ、簡単に部分システム化する方法」でした。
redshiftでCREATE TEMP TABLE LIKEして作成したテーブルに、default 0が付かない？

現象を確認したが、謎。
CREATE TABLE LIKEでも同様。

```
create temp table hoge_test(
app_id int,
hoge int DEFAULT 0
);

\d hoge_test
   列   |   型    |  修飾語
--------+---------+-----------
 app_id | integer |
 hoge   | integer | default 0


CREATE TEMP TABLE moge_test(like hoge_test);
\d moge_test
   列   |   型    | 修飾語
--------+---------+--------
 app_id | integer |
 hoge   | integer |
```

と思ったら、postgresqlのリファレンスに書いてありました。
INCLUDING DEFAULTSをつけないとデフォルト式はスルーされるみたい。
https://www.postgresql.jp/document/8.0/html/sql-createtable.html

```
CREATE TEMP TABLE hogehoge_test(like hoge_test INCLUDING DEFAULTS);

\d hogehoge_test
   列   |   型    |  修飾語
--------+---------+-----------
 app_id | integer |
 hoge   | integer | default 0
```

今度はうまく行ったみたい。
この辺、知ってないと危険が大きい。
TensorFlow将棋ソフト開発日誌 目次

TensorFlowで将棋AIをつくろうという試みを開発日誌形式で連載しています。毎回導入した技術、TensorFlowの使い方、得られた知見を綴ります。記事が増えてきたので目次を作りました。

- [TensorFlowによる将棋ソフトの開発日誌（ゆっけさんの場合） #1](http://qiita.com/YusukeSuzuki@github/items/1b69f0e85b36b5095593)
  - 開発をはじめることになった経緯や実現のためのアプローチ。
- [TensorFlowによる将棋ソフトの開発日誌（ゆっけさんの場合） #2](http://qiita.com/YusukeSuzuki@github/items/507c993e2beda07478c4)
  - 勝敗予測モデルの話。2chkifuというデータ集を利用する話。
- [TensorFlowによる将棋ソフトの開発日誌（ゆっけさんの場合） #3](http://qiita.com/YusukeSuzuki@github/items/d5c3295c38bb6373b60b)
  - 入力ベクトルの形状の説明。
- [TensorFlowによる将棋ソフトの開発日誌（ゆっけさんの場合） #4](http://qiita.com/YusukeSuzuki@github/items/c40f8cb4d19430957169)
  - とりあえずで作ったモデルの説明。後に学習がうまくいかないモデルだと判明しました。
- [TensorFlowによる将棋ソフトの開発日誌（ゆっけさんの場合） #5](http://qiita.com/YusukeSuzuki@github/items/3d2416aaf26da386bf37)
  - batch normalizationの導入など。前回のモデルを改善し学習が進むようにしました。
- [データ読み込みの非同期化と勝敗予想モデルの進捗 : TensorFlow将棋ソフト開発日誌 #6](http://qiita.com/YusukeSuzuki@github/items/f5ce32b5fcd08c0f5e23)
  - これまでタイトルで内容がわからなかったので方針変更。データ読み込みを非同期化してGPU使用率を最大化する作業です。TensorFlowでの非同期データフィードを説明します。
- [勝敗予想モデルの入力ベクトル形式の変更 : TensorFlow将棋ソフト開発日誌 #7](http://qiita.com/YusukeSuzuki@github/items/a42f891e2f0138b6dcc0)
  - 入力ベクトルの表現形式を変更したのでその解説。
- [勝敗予想モデルの学習->試験の成績が悪い : TensorFlow将棋ソフト開発日誌 #8](http://qiita.com/YusukeSuzuki@github/items/4588e6608f6671dab35f)
  - 学習データで学習して試験データで性能を見たら性能が出なかったお話。
- [勝敗予測モデル2エポック目の成績報告とDNNの種々考察（ポエム回） : TensorFlow将棋ソフト開発日誌 #9](http://qiita.com/YusukeSuzuki@github/items/65901df3b75e52f08447)
  - 2エポック目の学習をして正答率が少し上がったお話（有意とは言っていない）。あとここまでで色々考えたことの箇条書き。
- 番外 [AWS EC2 p2.16xlarge でCUDAを使用する際に16GPUは同時に使用できない](http://qiita.com/YusukeSuzuki@github/items/aa5fcc4b4d06c116c3e8)
- [勝敗予測モデルの学習をEC2 p2.8xlarge Multi GPUでやろうとした : TensorFlow将棋ソフト開発日誌 #10](http://qiita.com/YusukeSuzuki@github/items/1d8514045d8cc223879c)
  - 単純にマルチGPUにすれば学習速くなるだろうと思ったら意外と技術が必要だったというお話
- [マルチGPUを導入した話とseparable_conv2dの話など : TensorFlow将棋ソフト開発日誌 #11](http://qiita.com/YusukeSuzuki@github/items/b97961d43d8dfeaf5a89)
  - マルチGPUを導入したりデバッグ用のモデルを新しくしてみたり、3日かけて4エポック学習してみたり
- [学習データをTFRecordにした話 : TensorFlow将棋ソフト開発日誌 #12](http://qiita.com/YusukeSuzuki@github/items/1388534bc274bc64b9b2)
  - 標準を信じよ
- [モデルをpythonソースの動的インポートにしてHighwayNetを導入して学習 : TensorFlow将棋ソフト開発日誌 #13](http://qiita.com/YusukeSuzuki@github/items/e6df45f2a3c4688a45b4)
  - モデルの記述をYAMLからPythonコードの動的importに変更した
【VMware@SoftLayer】NSX Edge Services Gateway編

#前回までのあらすじ

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

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

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


#今回の内容

SoftLayer上にNSX Edge Services Gatewayをデプロイし、様々な機能を検証しました。Edge構築時の注意点や引っかかった点などをまとめたので参考になれば幸いです。

#NSX Edgeの概要

NSX Edgeとは様々な機能を持った仮想ルーターで、vCenterから仮想アプライアンスとしてデプロイ可能です。

Edgeには主に以下の機能があります。

- ファイアウォール
- DHCP
- NAT
- ルーティング
- ロードバランサー
- VPN
- P2V(物理ネットワークから仮想ネットワークへの接続)

#NSX Edgeのデプロイ

まずはEdgeをデプロイします。vCenter Web Clientにログインし、Networking and SecurityからNSX Edgeを選択します。
![edge1.png](https://qiita-image-store.s3.amazonaws.com/0/103277/338f8762-2054-4b8c-2749-8f229c1b1ecd.png)
左上の「+」印をクリックし、Edgeを追加します。

Edge Services Gatewayを選択し、名前を入力します。また、SPOFを避けたい場合などは「High Availabilityの有効化」にチェックを入れてください。
![edge2.png](https://qiita-image-store.s3.amazonaws.com/0/103277/66958d98-0079-bfc1-d513-3763251336ff.png)

次に資格情報の入力、デプロイ時のリソースの選択、アプライアンスのサイズの選択をしていきます。

サイズの選択は、下記を参考に、自分の要件に合ったサイズを選択してください。

| サイズ |メモリ|vCPU|ディスク容量|
|:-:|:-:|:-:|:-:|
|Compact|512MB|1|500MBのディスク1台|
|Large|1GB|2|500MBのディスク1台+512MBのディスク1台|
|Quad Large|1GB|2|500MBのディスク1台+512MBのディスク1台|
|X-Large|8GB|6|500MBのディスク1台+2GBのディスク1台|

次に、インターフェースを設定していきます。

インターフェースとは、仮想的なNICのようなもので、どのVLANもしくはVXLANのサブネットに足を出して接続するのかを設定することができます。
![edge3.png](https://qiita-image-store.s3.amazonaws.com/0/103277/4f58b35f-3f7a-da39-c7da-985b84c0fa23.png)

「アップリンク」がVLAN側、「内部」がVXLAN側です。

1つのインターフェースに複数のIPアドレスを割り当てる場合、プライマリのIPアドレスに1つ、セカンダリのIPアドレスに複数のIPアドレスを設定する必要があります。このようにすることで、NSX自体はプライマリIPアドレスをローカルのソースIPとして認識し、各仮想マシンにはセカンダリのIPアドレスを割り当てる、といったような使い方ができます。

また、複数のIPアドレスを入力する場合はカンマで区切るようにします。

最後に、デフォルトゲートウェイとファイアウォールのデフォルトポリシーを設定して初期デプロイは完了です。


#各機能確認

##NAT
NATはDNAT, SNATの設定をすることができます。

ためしにSoftLayerの10.台のアドレスを192.台のアドレスに変換してみました。

まず、インターフェースの設定を確認します。

![edge4.png](https://qiita-image-store.s3.amazonaws.com/0/103277/ca7bc6d7-d31f-ea1c-a25c-7c51096add98.png)

前述したように、10.台のVLAN側のセグメントを「アップリンク」に、192台のVXLAN側のセグメントを
「内部」に設定します。

VXLAN側に割り当てるIPアドレスはデフォルトゲートウェイを入力してください。

また、SoftLayerから仮想マシンに割り当てるPortable IPはアップリンクのセカンダリIPに記入します。

次に、Edgeのメニュータブの「NAT」を選択し、DNAT, SNATの設定をし、「変更を発行」します。
これでNATの設定は完了です。
![edge5.png](https://qiita-image-store.s3.amazonaws.com/0/103277/19e57e08-fef5-e489-a4ce-b994f6110b26.png)


試しに手元のPCからVXLAN上のVMにアクセスしてみます。
![edge6.png](https://qiita-image-store.s3.amazonaws.com/0/103277/768cdb21-0de8-184d-be75-675ba2450dbf.png)

VMには192.台のアドレスを設定してありますが、pingを通すことができました。

EdgeでNATされていることがわかります。

###pingが通らない場合
今回NATの際になかなかpingが通らなかったのですが、その原因はEdgeのファイアウォール設定にありました。
基本的なことですが、Edgeのデプロイの際など、意図せず全てのトラフィックを拒否する設定になっている場合があるので、念のためご確認下さい。
また、Edgeのファイアウォールを無効化すると**NAT, ロードバランサーの機能も無効化される**のでお気をつけ下さい。

##それ以外の機能について
長くなってしまったので別記事で書いています。
[【VMware@SoftLayer】SSL VPN-Plus編](http://qiita.com/ytada/items/c495bbd11f0b67205963)
[【VMware@SoftLayer】論理ルーターによるL2 Bridge編](http://qiita.com/ytada/items/42baaa46f2a59866ffce)
S3のlist_objectから1000個以上引っこ抜きたい気持ち

げんご:ruby(rails)

割と困ったのでめもっておこう。

```
      s3_cli = Aws::S3::Client.new(region: 'れぎおｎ', endpoint: 'えんどぽいんｔ')
      bucket = 'ばけっｔ'

      obj = s3_cli.list_objects(bucket: bucket, delimiter: '/', max_keys: 1)
      marker = obj.contents.first.key
      (0..200).each do |num|
        break if marker.nil?
        obj = s3_cli.list_objects(bucket: bucket, delimiter: '/', marker: marker)
        obj.contents.each do |object|
          s3_cli.get_object(bucket: bucket, key: object.key) do |chunk|
            pp chunk
          end
        end
        marker = obj.instance_variable_get(:@data).next_marker
      end
```

range部分は気にしないように
Visual Studio Code で msbuild の出力を UTF-8 で表示する

デフォルトだと、utf-8 を正しく表示してくれなくて残念な感じである。
まぁ、そのうち修正されるとは思うが、簡単に纏めてみる。

調べてみると、`chcp 65001` を実行したら良いらしいので、
以下のような bat をパスが通っている場所に用意して、

```bat:msbuild.bat
@echo off
chcp 65001 > NUL
msbuild.exe %*
```

tasks.json のコマンド指定部分を上で用意した msbuild.bat が呼ばれるように変更。

```json:tasks.json
	"command": "msbuild.bat",
```

以上。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/144439/f862daf5-c5c3-3c81-875e-577739d3b7ec.png)

ちゃんと utf-8 出力ができるようになった。
HerokuでHubotを動かす 2016/10月版

Herokuを無料で利用する場合、1日6時間スリープしないといけないと思っていたが、それが不要に変更になっていたらしい。

Hubotを常駐させる為に利用しようと思ったが、上記の変更によりスリープさせない為の設定が今までと異なっていたので残しておく。

Heroku Schedulerをインストールした後に以下の設定をした。

https://scheduler.heroku.com/dashboard

上記の設定画面で

curl https://アプリのID.herokuapp.com/

FREQUENCYにEvery 10 minutes
と設定した。

参考

http://qiita.com/tomomichi/items/7904dfcdabb7acc8a286
MeCabをMacにインストールする手順


特にはまりどころはないけど久しぶりにインストールしたので一応。
Xcodeのコンポーネント（コンパイラ関連）がインストールされてる必要あり。

# 前提条件

- MacOS X El Capitan
- Xcodeインストール済み

# Mecabのインストール

まずmecabのソースをこちらからダウンロード。
http://taku910.github.io/mecab/#download

インストール先のディレクトリを作成。

```bash
$ sudo mkdir /usr/local/mecab
```


解凍・設定・コンパイル・インストール。

```bash
$ cd $HOME/Downloads
$ tar xvfz mecab-0.996.tar.gz
$ cd mecab-0.996
$ ./configure --enable-utf8-only --prefix=/usr/local/mecab
$ make
$ sudo make install
```

# IPA辞書のインストール

IPA辞書のソースをダウンロード
http://taku910.github.io/mecab/#download


解凍・設定・コンパイル・インストール。

```bash
$ cd $HOME/Downloads
$ tar xvfz mecab-ipadic-2.7.0-20070801.tar.gz
$ cd mecab-ipadic-2.7.0-20070801
$ ./configure --prefix=/usr/local/mecab --with-mecab-config=/usr/local/mecab/bin/mecab-config --with-charset=utf8
$ make
$ sudo make install
```

# 環境設定

mecabへのパスを追加。

```bash
$ vi $HOME/.profile
```

```.profile
==省略
export PATH=/usr/local/mecab/bin:$PATH
==省略
```

.profileを再読み込み。

```bash
$ . $HOME/.profile
```

# テストその１

```bash
$ mecab
ハンバーグ定食を食べました。
ハンバーグ	名詞,一般,*,*,*,*,ハンバーグ,ハンバーグ,ハンバーグ
定食	名詞,一般,*,*,*,*,定食,テイショク,テイショク
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
食べ	動詞,自立,*,*,一段,連用形,食べる,タベ,タベ
まし	助動詞,*,*,*,特殊・マス,連用形,ます,マシ,マシ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。	記号,句点,*,*,*,*,。,。,。
EOS
```

# mecab-ipadic-NEologdのインストール

mecab-ipadic-NEologdは先にインストールしたIPA辞書を大幅に強化したもので、現在実際使われている言葉が反映されるように毎月データがアップデートされています。今どき、これをインストールしない手はないでしょう。

ソースをダウンロード。

```bash
$ git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
```

インストール。

```bash
$ ./bin/install-mecab-ipadic-neologd -n
```

# テストその２

「メロンパン」の解析を通常のIPA辞書とmecab-ipadic-NElogdで比較してみます。

**通常のIPA辞書**

```bash
$ mecab
メロンパン
メロン	名詞,一般,*,*,*,*,メロン,メロン,メロン
パン	名詞,一般,*,*,*,*,パン,パン,パン
EOS
```

**mecab-ipadic-NElogd**

```bash
$ mecab -d /usr/local/mecab/lib/mecab/dic/mecab-ipadic-neologd/
メロンパン
メロンパン	名詞,固有名詞,一般,*,*,*,メロンパン,メロンパン,メロンパン
EOS
```

このように通常のIPA辞書ではメロンパンがメロンとパンに分割されてしまっていましたが、mecab-ipadic-NElogdではちゃんとメロンパンを認識できています。
Slack のサイドバーをオリジナルカラーに

# やり方
[Customize your Slack theme](https://get.slack.help/hc/en-us/articles/205166337-Customize-your-Slack-theme)

1. Open the Slack team you’d like to customize.：カスタマイズしたいSlackチームを開く
2. Click your team name to open the Team Menu.：チーム名をクリックしてチームメニューを開く
3. Choose Preferences.：「Preferences」を選択
4. Select the Sidebar Theme tab.：「Sidebar Theme」を選択
5. Cutom Theme でカラーを選ぶか Copy and paste these values to share your custom theme with others: 欄にカラーコードを入力する

![スクリーンショット 2016-10-14 14.44.39.png](https://qiita-image-store.s3.amazonaws.com/0/18348/e9386d0d-5e89-524f-9462-fc8b1592f9d9.png)

# 注意点
あくまで個人設定。同じチームのメンバーであっても自分が設定したカラーは他人に共有されない。残念。

# おまけ

私がカスタマイズしてる一例
なお http://slackthemes.net/ という外部サービスを使ったスクショです。

## amimoto
https://amimoto-ami.slack.com/

```
#272D2F,#111111,#2874B3,#FFFFFF,#61a1df,#FFFFFF,#FCAE00,#FCAE00
```
![スクリーンショット 2016-10-14 15.07.05.png](https://qiita-image-store.s3.amazonaws.com/0/18348/7bf4e2e5-0311-8bab-35cd-fb09019fd63c.png)

## shifter
https://getshifter.slack.com/

```
#BD256A,#6B0C37,#EE2C87,#FFFFFF,#2D2D2D,#FFFFFF,#fff200,#2D2D2D
```
![スクリーンショット 2016-10-14 14.47.48.png](https://qiita-image-store.s3.amazonaws.com/0/18348/01354703-3afc-d00d-45b3-b1e89d891ff8.png)

## JAWS-UG

```
#ffaa00,#DE8707,#ff6f00,#FFFFFF,#ff6f00,#000000,#ff0000,#0980ab
```
![スクリーンショット 2016-10-14 15.12.09.png](https://qiita-image-store.s3.amazonaws.com/0/18348/9521bfa1-916a-9b45-d576-e38135da7f36.png)

気が向いたら追加するかも。
RealmSwiftで値が入ってるかを確認するときfor文を使うときのメモ

```Swift:WriteDiary.swift


import Foundation
import UIKit
import RealmSwift

var writeDairydata:UITextView!



class WriteDiary: UIViewController, UITextViewDelegate {
    
    
    
    @IBOutlet weak var writeDairydata: UITextView!
    
    override func viewDidLoad() {
        super.viewDidLoad()

        writeDairydata.text = "ここに本文を入力してください"
        
        print(writeDairydata)
        
   
        
        
        // Do any additional setup after loading the view, typically from a nib.
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
   
    
    @IBAction func save(sender: AnyObject) {
        
        let text = self.writeDairydata.text
        
        print (text)
        
 
        //クラスをインスタ
        let myDog = textSaveData()
        
        myDog.name = text
        
        
        
        
        
        
        
        
        // デフォルトRealmを取得します
        let realm = try! Realm()
        
        // データを永続化するのはとても簡単です
        try! realm.write {
            realm.add(myDog)
        }
        
//        print("テキストに保存成功: \(myDog.name)")
        
         let dogs = realm.objects(textSaveData)
       
        // ためしに名前を表示
        for dog in dogs {
            print("name: \(dog.name)")
        
        }
    }
    

    
}


// 通常のSwiftのクラスと同じように定義します
class textSaveData: Object {
    
     dynamic var name = ""
 
    
}



```
PHPで標準入力から値を受け取る(競技プログラミングとか)

## 40歳にリーチがかかってるおっさんがどういうわけか競技プログラミングに目覚めた

業務ではマネジメント(それもインフラ系)をしているので、つい、カッとなって、先月あたりから、競技プログラミングに目覚めました。

1か月も経ってようやく標準入力から値を受け取ることにも慣れてきたので、いったん、整理。

## パターン別：値の受け取り方

### 1行から1つの値を受け取る場合

#### Sample Input

```
3
```

#### Code

```php
$a=intval(trim(fgets(STDIN)));
//do something...
```

### 1行から複数の値を受け取る場合

#### Sample Input

```
1 2 3
```

#### Code

```php
fscanf(STDIN,"%d %d %d",$a,$b,$c);
//do something...
```

:arrow_down:別解

```php
$input=explode(' ',trim(fgets(STDIN)));
$a=intval($input[0]);
$b=intval($input[1]);
$c=intval($input[2]);
//do something...
```

### 複数行から1行あたり複数の値を受け取る場合(行数あり)

#### Sample Input

```
3
1
2
3
```

#### Code

```php
$n=intval(trim(fgets(STDIN)));
for($i=0;$i<$n;++$i){
    $a=intval(trim(fgets(STDIN)));
    //do something...
}
```

### 複数行から1行あたり複数の値を受け取る場合(行数あり)

#### Sample Input

```
3
1 2 3
4 5 6
7 8 9
```

#### Code

```php
$n=trim(fgets(STDIN));
for($i=0;$i<$n;++$i){
    fscanf(STDIN,"%d %d %d",$a,$b,$c);
    //do something...
}
```

### 複数行から1行あたり1つの値を受け取る場合(行数なし)

#### Sample Input

```
1
2
3
```

#### Code

```php
/* これだと0が入ってくるとループが止まってしまうのでNG
while($a=intval(trim(fgets(STDIN)))){
   //do something...
}
*/

//これなら大丈夫！
while(list($a)=fscanf(STDIN,"%d")){
    //do something...
}

/* これだと空行が混じると値を２回とってしまう
while(fscanf(STDIN,"%d",$a)){
    //do something...
}
*/

```


:arrow_down:別解

```php
/* これだと空行が0になる
while(!feof(STDIN)){
   $a=intval(trim(fgets(STDIN)));
   //do something...
}
*/

//これなら大丈夫！
while(strlen($a = trim(fgets(STDIN)))>0){
    $a = intval($a);
    //do something...
}
```

### 複数行から1行あたり複数の値を受け取る場合(行数なし)

#### Sample Input

```
1 2 3
4 5 6
7 8 9
```

#### Code

```php
/* 空行が混じると同じ値を二度繰り返すのでNG
while(fscanf(STDIN,"%d %d %d",$a,$b,$c)){
   //do something...
}
*/

//空行対策版
while(list($a,$b,$c)=fscanf(STDIN,"%d %d %d")){
   //do something...
}

```

:arrow_down:別解

```php
/* 空行が混じると同じ値を二度繰り返すのでNG
while(!feof(STDIN)){
   fscanf(STDIN,"%d %d %d",$a,$b,$c);
   //do something...
}
*/

// これなら大丈夫（空行検出時はループしない)
while(strlen($input=trim(fgets(STDIN)))>0){
   sscanf($input,"%d %d %d",$a,$b,$c);
   //do something...
}

/* 空行は空行として扱いたい版
while(!feof(STDIN)){
   list($a,$b,$c)=fscanf(STDIN,"%d %d %d");
   //do something...
}
*/

```
Apache CamelのEndpoint定義で環境変数をプレスフォルダーで埋め込む方法

# きっかけ

Apache Camelに入門する際に参考になりまくる[日本Apache Camelユーザ会](https://sites.google.com/site/jaacug/home)さん。

…に載っている、とあるサンプルコードのパス指定が、ユーザ名を直接指定していました。
これをなんとか環境変数から取得できないかと調べた次第です。
（公式ドキュメントに全て記載済みでした）

# バージョン
camel-core 2.18.0


# とあるサンプルコード 

* 非常に簡潔でかつオプションも色々と設定されている良いサンプルですね
* やっていることは以下です
    * あるフォルダA配下のファイルをからフォルダBにコピー
    * 拡張子を日付に変更
    * ちなみに、処理後にコピーされたファイルを削除しません（noop=trueの設定）
* 気になった点は、パスの指定が`/home/knoppix/Desktop`とハードコードされてること
    * また、余談ですがWindows環境ではディレクトリにコロン「:」を使えないので書き換えが必要です


[https://osdn.net/projects/cameluserjp/wiki/スタンドアロン版Camelの例](
https://osdn.net/projects/cameluserjp/wiki/%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%89%E3%82%A2%E3%83%AD%E3%83%B3%E7%89%88Camel%E3%81%AE%E4%BE%8B)

```java:FileToFileRoute.java
import org.apache.camel.builder.RouteBuilder;

public class FileToFileRoute extends RouteBuilder {
	
	@Override
	public void configure() throws Exception {
		// /home/knoppix の部分が気になる
		from("file:/home/knoppix/Desktop/inbox?noop=true&delay=5000")
		        .to("file:/home/knoppix/Desktop/outbox?fileName=${file:name.noext}.${date:now:yyyyMMdd-HH:mm:ss}");
	}
}
```

# 対応

ハードコードな値である`/home/knoppix`の部分を`{{user.home}}`に書き換えます

* バージョン2.3より`{{}}`でプロパティのプレスフォルダーが利用可能。
* JVMのシステムプロパティの場合はそのままプロパティ名をセットするらしいです
* オプションの方は`${}`で指定できるのに、エンドポイントは`{{}}`でちょっとわかりにくいですね
    * （※）ライセンス的な制約とのことですが…

```java:FileToFileRoute.java改1
import org.apache.camel.builder.RouteBuilder;

public class FileToFileRoute extends RouteBuilder {

	@Override
	public void configure() throws Exception {
		from("file:{{user.home}}/Desktop/inbox?noop=true&delay=5000")
				.to("file:{{user.home}}/Desktop/outbox?fileName=${file:name.noext}.${date:now:yyyyMMdd-HHmmss}");
	}
}
```

ちなみに、OSの環境変数を取得する場合は`{{env:環境変数名}}`で設定可能なようです。

```java:FileToFileRoute.java改2
import org.apache.camel.builder.RouteBuilder;

public class FileToFileRoute extends RouteBuilder {

	@Override
	public void configure() throws Exception {
		from("file:{{env:HOMEPATH}}/Desktop/inbox?noop=true&delay=5000")
		.to("file:{{env:HOMEPATH}}/Desktop/outbox?fileName=${file:name.noext}.${date:now:yyyyMMdd-HHmmss}");

	}
}
```


# 参考

* Apache CamelのHTTP Proxy設定方法
    * http://qiita.com/laqiiz/items/7b392e6c603a9b805635

* Apache Camel > Documentation > Components > Properties > Properties Component
 * http://camel.apache.org/using-propertyplaceholder.html
timestampを秒として扱う



結論から言うと以下のクエリで取得します.

- `CAST(EXTRACT(EPOCH FROM DATE_TRUNC('second', created_at)) AS INTEGER)`

途中経過を話すと最初は

- `EXTRACT(EPOCH FROM created_at)`

で取得してたのですが小数点が入ってしまうことがあるので

- `CAST(EXTRACT(EPOCH FROM rated_at) AS INTEGER)`

としました. これはコレで良かったのですがミリ秒以下は四捨五入っぽい

明示的に切り捨てる方法は無いかと調べたら、`DATE_TRUNC`が使えそうだったので結果以下のクエリになりました.


- `EXTRACT(EPOCH FROM DATE_TRUNC('second', created_at))`
機械学習論文読みメモ_6

[Online Learning of Eigenvectors](http://jmlr.org/proceedings/papers/v37/garberb15-supp.pdf), ICML2015
主要な固有値をオンライン学習において求める問題を考える。
この問題では、毎ステップにおいて行列が観測される毎にある単位ベクトルを予測し、それが今まで観測された行列累積値に対する固有値に近づくようにする事を目的とする。
これはオンラインPCAに似ている。
この設定はRegretの枠組みで損失を設定でき、最適値は固有値になる。
従来のRegretバウンドは、毎ステップ固有値問題を解く必要がある、または次元に大きく依存する、の問題があった。
本論では、これら２つの問題を回避出来る手法を提案する。
提案手法はFollow the perturbed leaderアルゴリズムを元にしている。
このアルゴリズムの利用により、従来手法より次元への依存性が低減される。
またデータのスパース性の利用も可能にした。

[Faster Rates for the Frank-Wolfe Method over Strongly-Convex Sets](https://arxiv.org/pdf/1406.1305.pdf), arXiv
Frank Wolfe methodは従来の1次最適化手法と比較して、計算的なボトルネックであった写像計算を必要せず線形最適化で置き換えれるため注目されていた。
しかし収束速度が課題であった（1/tオーダー）。
本論では、強凸関数を対象とする場合においては、収束オーダーは1/t^2になる事を示した。
ちなみにFrank Wolfe methodはドメイン制約ありの凸最適化手法で、各ステップでは、現在値周りで1次近似した目的関数をドメイン制約の元最適化していく。
この時他の手法と違い、値更新後にドメイン領域への写像を要求しないため、計算量的に優位性がある。

[MADE: Masked Autoencoder for Distribution Estimation](https://arxiv.org/pdf/1502.03509v2.pdf), ICML2015
自己回帰モデルに基づくautoencoderモデルを提案する
このモデルでは、ある順番に基づいて、入力次元を選択していき、各次元はそれまでに選択された次元の変数に対する条件付き確率で表される。
この表現でデータの生成分布が表現出来る事を自己回帰特性と呼ぶ
また複数の異なった順番で入力次元を選択するNNを学習する事も可能である。
serverlessでデプロイパッケージからディレクトリごとをexcludeする

serverlessで作成したデプロイパッケージを確認したところ、.gitがexcludeされてなかったので設定されるようにしました。

# 実行環境

```bash
$ uname -a
Darwin xxxxxx 15.6.0 Darwin Kernel Version 15.6.0: Mon Aug 29 20:21:34 PDT 2016; root:xnu-3248.60.11~1/RELEASE_X86_64 x86_64
$ node -v
v6.7.0
$ serverless -v
1.0.2
$ cat /usr/local/lib/node_modules/serverless/node_modules/glob/package.json | grep '"version"'
  "version": "7.1.0"
```

# デフォルトのexclude設定

デフォルトの設定を確認した限りではexcludeしてくれそうに見えます。

https://github.com/serverless/serverless/blob/master/lib/plugins/package/lib/packageService.js#L7

```js
[
  '.git',
  '.gitignore',
  '.DS_Store',
  'npm-debug.log',
  'serverless.yaml',
  'serverless.yml',
  '.serverless',
]
```

# 必要な設定

```yaml
package:
  exclude:
    - .git/**
```

# 原因のコード

アーカイブするファイル一覧を作っている場所は以下です。

https://github.com/serverless/serverless/blob/master/lib/plugins/package/lib/zipService.js#L28

```js
      const files = glob.sync('**', {
        cwd: servicePath,
        ignore: exclude,
        dot: true,
        silent: true,
      });
```

globの要求されている動作を調べていないのでわかりませんが、元の設定で除外してくれたほうが嬉しいですね。
時間があれば週末に調べて修正してpull request出したいと思います。

# おまけ

ついでにいらなそうなファイルもexcludeして以下のような設定になりました。

```yaml
package:
  exclude:
    - .git/**
    - test
    - test/**
    - node_modules/.bin
    - node_modules/.bin/*
    - node_modules/aws-sdk
    - node_modules/aws-sdk/**
    - event.json
    - README.md
```
Yarnを利用して、Reactをwebpack と babel-loaderでビルドする方法

#初めに
Yarnという新しい技術を使ってみましたので、
学習内容のまとめとして記録します。
間違っている点がありましたらご指摘お願いします。

#Yarn環境の準備
##Yarnのインストール
npmでインストールします。

```$ npm install -g yarnpkg```

##ワーキングディレクトリの作成
ワーキングディレクトリを作成します。

```$ mkdir hello-react-yarn```

作成したディレクトリにyarn initコマンドを入力すると、
package.jsonが生成されます。

```$ cd hello-react-yarn
$ yarn init```

#必要なファイルの準備
以下のディレクトリで作成します。

```
$ mkdir src dist
$ touch ./src/app.jsx
$ touch ./index.html
$ touch .babelrc
$ touch webpack.config.js
```

```
hello-react-yarn/
│
├─ src/
│   └─ app.jsx
├─ dist
├─ .babelrc
├─ index.html
├─ package.json
├─ webpack.config.js
└─ yarn.lock
```

作成したindex.htmlファイルには、以下のように記述しておきます。

``` index.html
<!doctype html>

<html>

<head>
  <meta charset="utf-8">
  <title>Hello React</title>
</head>

<body>
  <div class="content"></div>
  <script src="./dist/bundle.js"></script>
</body>

</html>
```

#コンポーネントを作る

##Reactをインストールする
以下のコマンドでReactとreact-domをインストールします。

```$ yarn add react react-dom```

##Reactのコンポーネントを書く
以下のように記述します。

```app.jsx
import React from 'react';
import ReactDOM from 'react-dom';

// コンポーネント名の頭文字は大文字にする
var HelloReact = React.createClass({
  render: function () {
    return (
      <div>
        Hello React!!
      </div>
    );
  }
});

ReactDOM.render(
  <HelloReact />,
  document.querySelector(".content")
);
```

#webpackをインストールする
webpackをyarnでインストールします。

webpackをグローバルにインストールしていない場合は、
npmでインストールします。

```$ npm install -g webpack```

プロジェクトディレクトリにwebpackをインストールします。

```$ yarn add webpack --dev```

#Babel環境の準備

##babel-loaderのインストール

以下のコマンドで、babel-loaderと、peerDependenciesとなっているbabel-coreをインストールします。

```$ yarn add babel-loader babel-core --dev```

##Babelのプリセットのインストール
babel-loaderでJSXのコンパイルが行えるようにするためにbabel-preset-reactをインストールします。

```$ yarn add babel-preset-react --dev```

ES2015の構文に対応できるように、babel-preset-es2015をインストールします。

```$ yarn add babel-preset-es2015 --dev```

##.babelrcファイルの設定
以下のように記述します。

```.babelrc
{
  'presets': ['react', 'es2015']
}
```

#Reactをビルドする

##webpack.config.jsファイルの設定
以下のように記述します。

```webpack.config.js
module.exports = {
  entry: './src/app.jsx',
  output: {
    path: './dist',
    filename: 'bundle.js'
  },
  devtool: 'inline-source-map',
  module: {
    loaders: [
      {
        test: /\.js(x?)$/,
        exclude: /node_modules/,
        loader: 'babel-loader'
      }
    ]
  }
};
```

##yarnコマンドへの登録

webpackコマンドを、package.jsonに以下のように記述します。
これでyarnコマンドでビルドできるようになります。

```package.json
{
  ...
  "scripts": {
    "build": "webpack --progress"
  },
  ...
}
```

オプションとして––watchを追加すれば監視を行ってくれます。

#webpackの実行
登録した以下のコマンドで実行できます。

```$ yarn run build```

#コマンドまとめ
打ち込んだコマンドリストです。

```
mkdir プロジェクト名
cd プロジェクト名

yarn init
mkdir src dist
touch ./src/app.js
touch ./index.html
touch .babelrc
touch webpack.config.js
yarn add react react-dom
yarn add webpack --dev
yarn add babel-loader babel-core --dev
yarn add babel-preset-react --dev
yarn add babel-preset-es2015 --dev
```
[Swift]Array-配列を安全に

#作った理由

SwiftのArrayで Out Of Range でよく？落ちる
特にエラーを返す可能性のあるAPIとかで数値を間違えることがしばしば...
というわけで落ちないタイプの配列をつくった
ついでにnilを返さない辞書型も作った。

#使い方

```swift

let array = ["a","b","c"]

print(array[safe: 1])//"b"
print(array[safe: 5])//""

print(array[force: 1])//Optional("b")
print(array[force: 5])//nil

let dict = ["a":"apple","b":"banana","c":"cap"]

print(dict[safe: "a"])//"apple"
print(dict[safe: "d"])//""


```

#実装　


```swift
import UIKit


protocol DefaultValueContainedType {
    static var defaultValue: Self { get }
}

extension Array {
    subscript (force index:Int)->Element?{
        switch index {
        case self.indices:
            return self[index]

        default:
            return nil
        }
    }
}
extension Array where Element: DefaultValueProtocol{
    subscript (safe index: Int) -> Element {
        return self[force: index] ?? Element.defaultValue
    }
}

extension Dictionary where Value: DefaultValueProtocol {
    subscript (safe index: Key) -> Value {
        return self[index] ?? Value.defaultValue
    }
}

extension Int: DefaultValueProtocol {
    static var defaultValue: Int {
        return 0
    }
}
extension Bool:defaultValueProtocol{
    static var defaultValue: Bool{
        return false
    }
}
extension Double:defaultValueProtocol{
    static var defaultValue: Double{
        return 0.0
    }
}
extension Float:defaultValueProtocol{
    static var defaultValue: Float{
        return 0.0
    }
}
extension CGFloat:defaultValueProtocol{
    static var defaultValue: CGFloat{
        return 0.0
    }
}
extension String:defaultValueProtocol{
    static var defaultValue: String{
        return ""
    }
}
extension Array :defaultValueProtocol{
    static var defaultValue: Array{
        return []
    }
}
extension Dictionary :defaultValueProtocol{
    static var defaultValue: Dictionary{
        return [:]
    }
}
extension NSData: defaultValueProtocol{
    static var defaultValue: NSData{
        return NSData()
    }
}


```
Angular2でHTTPリクエストのテスト

Angular2 v2.0.0 でのテストの書き方が検索してもあまり見つからなかった。

```ts
/* tslint:disable:no-unused-variable */

import {TestBed, async, inject} from '@angular/core/testing';
import {ApiService} from './api.service';
import {HttpModule, BaseRequestOptions, Http, Response, ResponseOptions} from "@angular/http";
import {MockBackend, MockConnection} from "@angular/http/testing";

import {User} from "./user";

describe('Service: Api', () => {

  beforeEach(() => {
    TestBed.configureTestingModule({
      imports: [HttpModule],
      providers: [ApiService, {
        provide: Http,
        useFactory: (backend, options) => new Http(backend, options),
        deps: [MockBackend, BaseRequestOptions]
      }, MockBackend, BaseRequestOptions]
    });
  });

  it('userInfo', async(inject([MockBackend, ApiService], (backend: MockBackend, service: ApiService) => {

    backend.connections.subscribe((conn: MockConnection) => {
      let ops = new ResponseOptions({body: {name: 'kyusyukeigo'}});
      conn.mockRespond(new Response(ops));
    });

    service.getUser().subscribe((user: User) => {
      expect(user).not.toBeNull();
      expect(user.name).toBe('kyusyukeigo');
    });

  })));
});
```


参考: http://stackoverflow.com/questions/39599084/test-angular-2-0-0-component-with-http-request
Eclipseでもvimを使いたい！なのでVrapper

vimmerはもてるんだって
とういうわけでEclipseもvimライクにつかいます

# Vrapperのインストール
Eclipseでソフトウェアのインストールをします
1. 「ヘルプ」⇒「新規ソフトウェアのインストール...」
インストールダイアログが表示されます
2. 「追加(A)...」ボタンをクリック
すると、リポジトリーの追加ダイアログが表示されます
3. 名前は適当に"Vrapper"などにしておいて、ロケーションに
http://vrapper.sourceforge.net/update-site/stable
と入力して「OK」
![作業対象.PNG](https://qiita-image-store.s3.amazonaws.com/0/134293/4f21bdfd-0536-f471-054a-d05dbd505b9c.png)
4. Vrapperにチェックを入れて「次へ(N)>」をクリック
![vrapper選択.PNG](https://qiita-image-store.s3.amazonaws.com/0/134293/cd23faed-3789-79dc-ea95-79e8b5f9cbff.png)

依存関係とかのチェックをしてくれます
5. インストール詳細が表示されます
「次へ(N)>」をクリック
6. ライセンスのレビューが表示されます
「・・・同意します」にチェックを入れて「完了(F)」をクリック

これでOK

# キーバインドの変更
Eclipseのショートカットとvimのキーバインドがかち合ったりすることがあります
その場合はEclipseのショートカットを切るか、あきらめるかです
Eclipseのショートカットの設定は
「ウィンドウ」→「設定」→「一般」→「キー」
で編集できます
例えば
Ctrl＋[　を無効にしたりとか・・・

# vrapperrcについて
vimでいうところの"vimrc"が"vrapperrc"です
ファイル名を"_vrapperrc"として
C:\Users\ユーザ名
の直下に置けば読込んでくれます

Ctrl+v　のペーストは残しておきたかったので
```
"<space>v で矩形選択
noremap <Space>v <C-v>
```
とかにしてSpace＋vで矩形選択を出来るようにしたりしています



### 参考
http://yuroyoro.hatenablog.com/entry/20100218/1266477264
https://runble1.com/eclipse-colortheme-keybinding-vim/
gem install時にcertificate verify failed が発生したら


```
ERROR:  Could not find a valid gem 'compass' (>= 0), here is why:
          Unable to download data from https://rubygems.org/ - SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (https://api.rubygems.org/specs.4.8.gz)
```
SSLv3の読み込みサーバーの認証で認証確認に失敗しています。
今回はWindowsで発生しました。

これはrubygems.orgが契約しているSSL証明書を発行している認証局のルート証明書の有効期限が切れてしまったことに起因しています。

## 解決方法
認証局のルート証明書を最新のものにしましょう。
[https://rubygems.org/](https://rubygems.org/)にアクセスしてみて、アドレスバーの鍵の部分をクリック。
![スクリーンショット_2016-10-13_14_52_42.png](https://qiita-image-store.s3.amazonaws.com/0/27500/3934c071-693d-9eaf-1be7-5f64c56cb65d.png "スクリーンショット_2016-10-13_14_52_42.png")
「詳細」をクリックするとインスペクタが開く。
![スクリーンショット_2016-10-13_14_55_52.png](https://qiita-image-store.s3.amazonaws.com/0/27500/f93d3fdf-c4dc-841f-adae-0f5f4eba36df.png "スクリーンショット_2016-10-13_14_55_52.png")
そしてView certificateをクリックするtSSLのタイプや認証局の情報などをまとめて確認することができます。
![スクリーンショット 2016-10-13 14.10.58.png](https://qiita-image-store.s3.amazonaws.com/0/27500/f6dfc3df-7aa9-5f94-5a0e-d8349158de70.png "スクリーンショット 2016-10-13 14.10.58.png")

* 認証局: GlobalSign
* タイプ: OrganizationSSL
* 暗号化技術: SHA-256

ということがわかります。

GlobalSignの公式サイトのサポートを見てみると、[GlobalSign Root Certificates](https://support.globalsign.com/customer/en/portal/articles/1426602-globalsign-root-certificates)というズバリな項目があるので覗いてみます。

![スクリーンショット_2016-10-13_14_41_38.png](https://qiita-image-store.s3.amazonaws.com/0/27500/b93043c6-fa80-2875-cdc0-4fcfee449d6c.png "スクリーンショット_2016-10-13_14_41_38.png")

この表でどのルート証明書を利用すれば良いかがわかります。`R1`のようです。（[`R1`に関してはこちらに詳細があります](https://r1.globalsign.com/)）

![スクリーンショット 2016-10-13 15.07.31.png](https://qiita-image-store.s3.amazonaws.com/0/27500/3f23dbab-1a8d-a861-cd22-0e14d4eb657b.png "スクリーンショット 2016-10-13 15.07.31.png")


新しいルート証明書が公開されているのでそちらをダウンロードして、rubygemsに設置すれば問題が解決します。
`Download Root-R1 (Binary/DER Encoded)`で素直にder形式をダウンロードしても良いし、`View in Base64`で見れる証明書をコピーして自分でpemファイルを作成して設置しても良いです。

## 設置場所
Rubyをインストールした方法や場所変わってきます。ここでは一般的な場所を示します。

### Windows
```cmd
where gem
```
とやると

```
C:\Ruby23-x64\bin\gem
```
などと帰ってきます。
そしてRubyのバージョンが2.3.0だった場合、`C:\Ruby23-x64\lib\ruby\2.3.0\rubygems\ssl_certs`とかだと思います。

### MacOS
rbenvを使ってrubyをインストールしている場合は
`/Users/user_name/.rbenv/versions/2.3.0/lib/ruby/2.3.0/rubygems/ssl_certs`とかになると思います。
【続】Watson Speech to Text を使ってPepper同士は会話できるのか？　〜フリースタイルラップバトルへの挑戦

※本記事は[こちら](http://qiita.com/yuka_nm/items/31a66cec17c35d07919c)の記事の続編記事です。

#はじめに
みなさんは、「MCバトル」「フリースタイルバトル」などと呼ばれる、ラップバトルはご覧になった事はあるでしょうか？MC、つまりラッパー同士が即興で歌詞を作成し、そのスキルを競うものです。ただ即興で作るだけでなく、きちんと韻を踏みつつ、相手の言われた事にもきちんと返す内容でなければなりません。
個人的な話になりますが、筆者は日本語HIPHOPアーティストのファンであったり、最近ではTVやYouTube等で様々なMCの方々によるフリースタイルバトルを見ており、いつも見る度にMCの方々のスキルに圧倒されています。
今回、そんなMCの方々へのリスペクトも込めつつ、先行記事である"[Watson Speech to Text を使ってPepper同士は会話できるのか？　〜シンプルな伝言からラップバトルへの挑戦まで](http://qiita.com/yuka_nm/items/31a66cec17c35d07919c) " にて解説した内容をベースとし、ロボット達にフリースタイルバトルをさせる試みを行い、プロトタイプを作成しました。本記事では、そのプロトタイプの技術構成について簡単に紹介します。

#できたもの
Pepper達のバトルスキル自体はまだまだいまいちですが、ただラップし合うだけでなく、相手の言った事を拾って何かしら返している事が分かります。
https://youtu.be/0jHLu5-dFU8

Choregrapheプロジェクトは以下に置きました。
https://github.com/yukanm/pepperRapProto


#技術構成
基本的な構成は[先行記事](http://qiita.com/yuka_nm/items/31a66cec17c35d07919c)と同様ですが、音声認識をしてテキストを受け取り、加工する所で少し工夫をしました。

・WatsonのSpeech to Textからレスポンスが返ってくるまでの前半部分は、事前に作っておいたリリックを読むだけ(ChoregrapheのDialogボックスを使用)
・特定のキーワードを認識したら、アンサーとなるリリックを置換・成形して、後半のリリックとする(ChoregrapheのPythonボックスにて実装)

#リリック生成の手法
そのままPepperに発話させるだけでは、ただの棒読みに近いので、言葉によってスピードを調節する事で、フロウを作り出します。韻を踏む単語のスピードは80%に、言葉数の多い所は150%などかなり早口になるように調整しています。
※ 一部誤字・変換ミスと思われる表記がありますが、Pepperの発話調整のためにわざと違う漢字をあてています。

```text:1号の最初のリリック
u:(e:onStart) \vct=135\ \rspd=110\ ペッパあぁが繰り出す\pau=0\このやばい\rspd=70\ライむ。
\rspd=110\これいまだにプろと\rspd=70\タイプ。
\rspd=170\しかし\pau=0\もはや\rspd=110\ある意味\rspd=140\勘\rspd=70\製品？
\rspd=110\見た事のない\rspd=130\バトルを\rspd=120\ここに\rspd=70\解禁。。
\rspd=110\接客\rspd=150\ローボッ\pau=100\\rspd=110\受付\rspd=165\ローボッ
\rspd=110\そんなん\rspd=180\だけじゃない\rspd=110\ロボが\rspd=80\登場？
\rspd=140\さあ、\pau=500\君にも\rspd=80\出切るかナッ、\rspd=170\それトも\rspd=150\ただの\pau=0\きゅーあーる、\pau=0\コード、\pau=0\\rspd=80\リーだあ！！！
```

Pythonボックスの中で「特定の単語」と「返すリリック」のdictionaryを作成します。
以下がその一部分です。

```text:特定の単語とアンサーの組み合わせ(抜粋)
(....)
"ワトソン": "ていうか俺も\\rspd=130\\ブルーミックスに\\rspd=80\\接続中。\\rspd=110\\ Watsonで聴きとった言葉で、リリック\\rspd=80\\想像中\\rspd=150\\",
"スピーチ": "聞こえるぜ、お前の\\rspd=80\\スピーチが\\rspd=150\\。だが、まだスキル\\rspd=80\\足りないな\\rspd=150\\",
(....)
```

認識結果を取得し、単語を見つけたら、定義したアンサー用リリックで置き換えます。置換する方法の詳細については公開したChoregrapheプロジェクトの中のPythonコードを参照して下さい。


#拡張案の一例
本記事では、プロトタイプとして、特定の単語のみに対して実装しましたが、以下のライブラリのような韻生成ツールと組み合わせて、あらゆる単語に対して自動的にリリック生成することができるように検討中です。
【参考】[suzuki86](http://qiita.com/suzuki86)さんによる記事： [文章中から韻を踏んでいるフレーズの組み合わせを検出する gem を作りました](http://qiita.com/suzuki86/items/2a2801944a3e393464c7)

#おわりに
本記事は「音声認識技術」にてロボット同士を会話させる表現の延長としてプロトタイプしてみました。筆者は、人間のMCをロボットで置き換えようなんて思いは全くなく、あくまでも「ロボット同士が音声認識技術によってコミュニケーションする」というコンセプトに基づいた表現の一つとして捉えて頂ければ幸いです。

#撮影について
[先行記事](http://qiita.com/yuka_nm/items/31a66cec17c35d07919c)と本記事ともに、デモの撮影には、[Pepperアトリエ秋葉原](http://pepper-atelier-akihabara.jp/) を利用させて頂きました。ありがとうございました。
![IMG_20161001_195412.jpg](https://qiita-image-store.s3.amazonaws.com/0/137766/e79c4143-c31a-40ad-2715-be2f83b21a5b.jpeg)
バトル前のPepperたちががにらみ合っている様子。
DockerでJUMAN++(alpine linux)

## JUMAN++とは
[黒橋・河原研究室](http://nlp.ist.i.kyoto-u.ac.jp/index.php?JUMAN++)が公開した日本語の形態素解析器です。以下、サイトの紹介文
>JUMAN++は言語モデルを利用した高性能な形態素解析システムです．言語モデルとして Recurrent Neural Network Language Model(RNNLM) を用いることにより，単語の並びの意味的な自然さを考慮した解析を行います．それにより JUMAN，MeCab に比べ大きく性能が向上しています．文法・辞書・出力フォーマット等は JUMAN から引き継いだものを利用しています．本システムは CREST「知識に基づく構造的言語処理の確立と知識インフラの構築」の支援により開発されました．

## Dockerで環境構築
自分の環境はいじりたくないけど試してみたいということで、Dockerで試してみようと思います。

### HOW TO
``docker pull kyobad/jumanpp-alpine``
or
``docker pull kyobad/jumanpp-alpine:light``
latestとlightの違いですが、コメントでご指摘もらって、インストールに使ったコードやMakefileを見る必要がないという方はlightの方が容量が少ないイメージにしてあるのでそちらを使っていただければと思います。
``docker run -it kyobad/jumanpp-alpine``



これでjumanppが起動しているので、適当に日本語を打つと結果が返ってきます。
![スクリーンショット 2016-10-14 13.16.51.png](https://qiita-image-store.s3.amazonaws.com/0/116528/56406823-7055-986a-d926-b4b4e69dd4cd.png)

alpineベースで作っているが、juman++自体がなかなか大きなデータなのでimageも大きくなってしまってます

参考にしたサイト
>[新形態素解析器JUMAN++を触ってみたけど思ったより高精度でMeCabから乗り換えようかと思った話](http://qiita.com/riverwell/items/438e88427363511e9f28)

### Dockerfile
```Dockerfile:Dockerfile

FROM alpine:latest

MAINTAINER K.Kato

RUN apk add --update --no-cache --virtual=build-deps \
    boost-dev g++ make \
    && wget -q http://lotus.kuee.kyoto-u.ac.jp/nl-resource/jumanpp/jumanpp-1.01.tar.xz \
    && tar Jxfv jumanpp-1.01.tar.xz \
    && cd jumanpp-1.01/ \
    && ./configure \
    && make \
    && make install \
    && cd .. \
    && rm jumanpp-1.01.tar.xz \
    && rm -rf /var/cache/* \
    && apk del build-deps \
    && apk add --update --no-cache boost 

CMD ["jumanpp"]
```
Pythonで環境変数を取得する、なければデフォルト値をセットする

# 概要

pythonを使う時に、環境変数があれば、その値、なければ、デフォルト値をセットしたい

# 結論

[Access environment variables from Python](http://stackoverflow.com/questions/4906977/access-environment-variables-from-python)

```python
import os

url = os.getenv("YOUR_URL", "http://qiita.com")
print(url)
```

## os.environ.get

```os.environ``` は、mapのようなので、


## docker で試す場合


```
$ docker run -v $PWD:/work --rm python:2.7.12 python /work/sample.py
http://qiita.com
$ docker run -e YOUR_URL="http://127.0.0.1" -v $PWD:/work --rm python:2.7.12 python /work/sample.py
http://127.0.0.1
```
PyCharmにおけるコンソールの表示エンコードを変更する

PyCharmにおけるコンソールの表示エンコードを変更する
=========================

# 実施環境
OS：Windows7
IDE(PyCharmバージョン)：JetBrains PyCharm Community Edition 2016.2.1(64)


手順
-------------------------
1. PyCharmを起動し、プロジェクトを開く
2. 画面左上にある「File」→「Settings」(もしくは、ショートカットキー「Ctrl + Alt + s」でも可)
![settings.png](https://qiita-image-store.s3.amazonaws.com/0/139291/34c9c8e2-a249-72c5-9ae6-a4c9c9a37b75.png)





3. 「Editor」→「File Encordings」からProject Encodingを変更する![setting_encode.png](https://qiita-image-store.s3.amazonaws.com/0/139291/111430db-3c65-4897-de0d-f2cd406a6c0b.png)

4. 「OK」もしくは「Apply」をクリックする


確認
-------------------------
before(windows-31jのため文字化け)
![before.png](https://qiita-image-store.s3.amazonaws.com/0/139291/6652c2fc-7a91-02d6-a7b5-e82d1cbc0001.png)

after(UTF-8のため正しく表示)
![after.png](https://qiita-image-store.s3.amazonaws.com/0/139291/da1ec826-10f1-149c-eea7-0853e7e9c798.png)