OmniAICreator/Qiita-1.07M huggingface dataset:
【今更】pugとstylusとbabelをgulp

鈴木です。父親の手伝いでとある団体のLPを作ることになったのですが、HTMLとCSSとJSを素で書くなんて絶対したくないので、しない方法です。
## インストール
npmよりyarnの方が好きなので、yarnを使います。

```
yarn init
yarn add --dev gulp gulp-pug gulp-stylus gulp-babel babel-preset-env browser-sync gulp-notify gulp-plumber nib
```
関連パッケージをインストールします。

|パッケージ|役割|
|--------|---|
|gulp|タスクランナー|
|gulp-pug|gulpでpugをhtmlにする|
|gulp-stylus|gulpでstylusをcssにする|
|gulp-babel|gulpでbabelを使う|
|babel-preset-env|babelのトランスパイルする環境を設定する|
|browser-sync|変更を検知した時にブラウザーに自動で反映させる|
|gulp-notify|エラーが起こった時にデスクトップ通知を行う|
|gulp-plumber|エラーをハンドリングする時に使う|
|nib|stylusでmixinとかの便利機能を使えるようにする|

## 設定を書く
とりあえず`.babelrc`

```JSON:.babelrc
{ 
 "presets": [
    ["env", {
      "targets": {
        "browsers": ["last 2 versions", "safari >= 7"]
      }
    }]
  ]
}
```
babel-preset-envを使います。babel-preset-envについてはドキュメントを読んでください。
次に`gulpfile.js`。

```javascript:gulpfile.js
const gulp = require('gulp')
const stylus = require('gulp-stylus')
const babel = require('gulp-babel')
const pug = require('gulp-pug')
const nib = require('nib')
const plumber = require('gulp-plumber')
const browserSync = require('browser-sync')
const notify = require('gulp-notify')

gulp.task('default', ['stylus', 'browser-sync', 'pug', 'watch', 'babel', 'img'])

gulp.task('watch', () => {
  gulp.watch(['./stylus/**'], () => {
    gulp.start(['stylus'])
  })
  gulp.watch(['./pug/**'], () => {
    gulp.start(['pug'])
  })
})

gulp.task('browser-sync', () => {
  browserSync({
    server: {
      baseDir: './dist/'
    }
  })
  gulp.watch('./dist/js/*.js', ['reload'])
  gulp.watch('./dist/*.html', ['reload'])
  gulp.watch('./dist/css/*.css', ['reload'])
  gulp.watch('./dist/img/*.*', ['reload'])
})

gulp.task('stylus', () => {
  gulp.src('./stylus/*.styl')
    .pipe(plumber({
      errorHandler: notify.onError("Error: <%= error.message %>")
    }))
    .pipe(stylus({
      import: ['nib'],
      use: [nib()]
    }))
    .pipe(gulp.dest('./dist/css'))
})

gulp.task('pug', () => {
  const option = {
    pretty: true
  }
  gulp.src('./pug/*.pug')
    .pipe(plumber({
      errorHandler: notify.onError("Error: <%= error.message %>")
    }))
    .pipe(pug(option))
    .pipe(gulp.dest('./dist'))
})

gulp.task('babel', () => {
  gulp.src('./js/**/*.js')
    .pipe(plumber({
      errorHandler: notify.onError("Error: <%= error.message %>")
    }))
    .pipe(babel())
    .pipe(gulp.dest('./dist/js'))
})

gulp.task('reload', () => {
  browserSync.reload()
})
```
次に`package.json`の`scripts'。

```json:package.json
"scripts": {
  "gulp": "node_modules/.bin/gulp pug && node_modules/.bin/gulp stylus && node_modules/.bin/gulp babel && node_modules/.bin/gulp",
  "test-deploy": "node_modules/.bin/gulp pug && node_modules/.bin/gulp stylus && node_modules/.bin/gulp babel && node_modules/.bin/gh-pages -d dist -b master"
}
```
pug/stylus/babel全部実行した後に、監視するためにgulpを実行する。
`test-deploy`の方は`gh-pages`でgtihubpagesにデプロイ。絶対もっと効率の良い方法がありそうですね。
【Python】WindowsにEdwardをインストール

EdwardというPythonのライブラリを使用することで、ベイズ推定が割と簡単にできるということなので、インストールの手順を備忘録がてらまとめました。

#インストール環境
Windows 10
Python 3.6.3
Anaconda jupiter notebook

##Edwardのダウンロード
以下のリンクからEdwardのライブラリをダウンロード
https://pypi.python.org/pypi/Edward#downloads

・edward-1.3.5-py2-none-any.whl
・edward-1.3.5.tar.gz (md5)
の2種類があるが、Python3.6を使用しているので、今回は「edward-1.3.5.tar.gz (md5)」をダウンロード。

##Edwardのインストール
Anaconda Promptを起動し、「edward-1.3.5.tar.gz (md5)」をダウンロードしたフォルダにcd。
以下のコマンドを実行。

```
pip install edward-1.3.5.tar.gz
```
コマンドを実行し、
```
Successfully built edward
Installing collected packages: edward
Successfully installed edward-1.3.5
```
と表示されれば、ライブラリのインストール完了。
Eigenライブラリの使い方

# Eigenライブラリの使い方

EigenライブラリはC++のテンプレートを使用して作られているヘッダファイルのみで構成される線形代数ライブラリです。数値計算の速度に定評があります。
使い方は至って簡単で、ヘッダファイルをインクルードして一緒にコンパイルしてあげるだけです。

## ダウンロード

Eigenの[公式サイト](http://eigen.tuxfamily.org/index.php?title=Main_Page)から最新版をダウンロードし、適当なディレクトリに置きます。ここでは`$HOME/include`とします。

````
$ cd ~/Downloads
$ wget http://bitbucket.org/eigen/eigen/get/3.3.4.tar.gz   # ダウンロード
$ tar -zxvf 3.3.4.tar.gz                                   # 解凍
$ mv <解凍されてできたディレクトリ名> eigen-3.3.4               # ディレクトリ名を変更
$ mv eigen-3.3.4 ~/include                                 # ~/includeへディレクトリを移動
````
お好みでシンボリックリンクを作成しておきます。

````
$ cd ~/include                                             # ~/includeディレクトリへ移動
$ ln -s $HOME/include/eigen-3.3.4 $HOME/include/eigen      # eigen-3.3.4へのシンボリックリンクをeigenという名前で作成
````

## コンパイル方法

例えば`test.cpp`がEigenライブラリをインクルードして使っているとします。

````cpp:test.cpp
#include "Eigen/Core"

int main() {
    ... // 処理
}
````

コンパイル時にEigenライブラリへのインクルードパスを指定してあげましょう。


````
$ g++ test test.cpp -isystem $HOME/include/eigen
````

`-I`オプションを使ってインクルードディレクトリを指定してもコンパイルできるのですが、警告メッセージが出てきてしまいます。
[gccのオプション説明](https://gcc.gnu.org/onlinedocs/gcc/Directory-Options.html)では
> You can use -I to override a system header file, substituting your own version, since these directories are searched before the standard system header file directories. *However, you should not use this option to add directories that contain vendor-supplied system header files; use -isystem for that.*
>
>The -isystem and -idirafter options also mark the directory as a system directory, so that it gets the same special treatment that is applied to the standard system directories.

となっていますので、外部ライブラリを利用する際は不要な警告を出さないよう`-isystem`でインクルードする方がいいでしょう。


## 使い方

[公式サイトのレファレンス](http://eigen.tuxfamily.org/dox/)を読めば基本的な使い方は簡単に把握できます。
使い方を思い出せないというときは、[クイックレファレンス](https://eigen.tuxfamily.org/dox/group__QuickRefPage.html)を参照するのが手っ取り早いです。

コンパイル時にエラーが出て困った時はググりましょう。
ROS.orgの[eigen/Troubleshooting](http://wiki.ros.org/eigen/Troubleshooting)はエラー解決に役立ちます。
Eclipse Maven 依存関係のJarがおかしい場合の対処メモ

(初記事なので言葉が疎い所もありますご了承を)


EclipseのMavenプロジェクトで[！]が表示されたが、プロジェクトの更新をしても、ソースのダウンロードをし直しても直らない問題に当たった時の対処の流れ

####環境

- Eclipse Oxygen
- Java8

####使用しようとしたライブラリ

- Discord4J 2.9.3

##ハマった時
まず最初に、よくある対処として
[ビルド・パス]→[ライブラリー]
を開き、おかしい所を確認しようとした
![スクリーンショット 2018-02-12 14.25.03.png](https://qiita-image-store.s3.amazonaws.com/0/195819/b6137bdf-aeb3-de82-12df-a93b722cd964.png)
異常が表示されていない

普通にjarを確認しにいっても
![スクリーンショット 2018-02-12 14.26.49.png](https://qiita-image-store.s3.amazonaws.com/0/195819/a213ee4f-9ee4-8a13-284f-f71d2f2db68e.png)
ちゃんとある

その次に問題タブを確認
> 'C:/Users/~~~/.m2/repository/org/apache/httpcomponents/httpcore/4.4.8/httpcore-4.4.8.jar' を読み込めないか、有効な ZIP ファイルではありません

自分がハマったのはここからで
[クイック・フィックス]
を選択した所、結局さっきの[ビルド・パス]のウィンドウが開かれるばかりで、対処のしようがなく、ここから動けなくなった

##最終的な対処
試しに、問題が出てるJarをデコンパイルしようと試みた
![スクリーンショット 2018-02-12 14.38.12.png](https://qiita-image-store.s3.amazonaws.com/0/195819/28437fe1-fe71-92cb-1e7b-c715e0762421.png)
あれ？中身が開けない

原因は、**jarファイル自体が破損していたことでした**
最終的な方法として
> /4.4.8/httpcore-4.4.8.jar

Eclipseを落してからここをまるごと削除し、Eclipseを再起動、ソースのダウンロードをし直したら直った

(初記事がこんな内容で良いのかな・・・)
【Ruby, Python】開発時に通信傍受プロキシを設置した時、ルート証明書を与えて、ハンドシェイクエラーを回避する

## TL;DR

<a href="#各言語での設定">各言語での設定</a>

- Ruby
	- `ENV['SSL_CERT_FILE'] = PATH_TO_SSL_CERT_FILE`
- Python
	- `import os; os.environ['CURL_CA_BUNDLE'] = PATH_TO_SSL_CERT_FILE`

## この文書は誰向け？

### サーバサイドの開発者で、通信内容を覗きたい人

暗号化されていないhttpでの通信であれば、後ほど紹介するcharles等をプロキシサーバにするだけで内容を傍受できます。しかし、SSL/TLSで暗号化されているhttpsの通信は、プロキシの設定だけだと「ハンドシェイクに失敗した」といわれて傍受することができません。

実際に開発を行う上で通信を傍受したいケースは、次のようなものが挙げられます。

#### サーバサイドの人の例：

他のAPIサーバへアクセスしに行く際、正しいパラメータでリクエストしているはずだがレスポンスが期待するものと一致しない。原因の切り分けのために送受信している内容を傍受したいがhttpsでアクセスしているため、SSL/TLSで暗号化されていて読めない…

→この方法で読めるようになります！


#### フロントエンドの人の例：

仕様書に沿ったリクエストを投げているのに、いっこうに期待するレスポンスをサーバが返してこない。以下同文。

→この文書では扱いませんが、以下で紹介されている方法で傍受することができます。

- [AndroidのSSL通信をCharlesで確認する方法]( https://qiita.com/Capotasto/items/a51a76a8670e67798861)
- [通信系のデバッグには Charles が便利](https://qiita.com/usagimaru/items/d340e87da98e62f99b60)

## どうやって覗くの？

この辺を使ってください。私はcharles大好き人間なので課金して使っています。今回はcharlesを使いますが、mitm-pythonの場合もほぼ同様です。

<img width="654" alt="Charles" src="https://qiita-image-store.s3.amazonaws.com/0/28930/f834d1e0-3085-c38d-2b40-d464230b1464.png">

- [charles](https://www.charlesproxy.com/)
- [daniel4x/mitm-python](https://github.com/daniel4x/mitm-python)

予めcharlesを起動し、`Help` -> `SSL Proxying` -> `Save Charles Root Certificate` でルート証明書を保存しておきます。mith-pythonの場合は `~/.mitmproxy/mitmproxy-ca-cert.pem` にあるものを使います。

<img width="485" alt="Save Charles Root Certificate" src="https://qiita-image-store.s3.amazonaws.com/0/28930/fa6f26b3-e72e-279b-f450-d38e3b444471.png">


## 各言語での設定

基本的には環境変数で指定された値を与えてやればOKです。

### Ruby

```ruby
http_proxy = 'http://THE_IP_OF_MITM_PROXY:PORT' # 変更する
ENV['HTTP_PROXY'] = http_proxy
ENV['http_proxy'] = http_proxy
ENV['HTTPS_PROXY'] = http_proxy
ENV['https_proxy'] = http_proxy
ENV['SSL_CERT_FILE'] = './charles-ssl-proxying-certificate.pem' # 必要に応じて変更する
```

### Python

```python
import os

http_proxy = 'http://THE_IP_OF_MITM_PROXY:PORT' # 変更する
os.environ['HTTP_PROXY'] = http_proxy
os.environ['http_proxy'] = http_proxy
os.environ['HTTPS_PROXY'] = http_proxy
os.environ['https_proxy'] = http_proxy
os.environ['CURL_CA_BUNDLE'] = './charles-ssl-proxying-certificate.pem' # 必要に応じて変更する
```

あとはそれぞれスクリプトを走らせれば、通信内容を傍受できます！


---


本記事の内容が少しでも参考になれば幸いです。「いいね」をいただけると筆者の励みになります :pray: 

また、 @dogwood008 からフォローしていただけると、最新の投稿記事をお知らせできます。

[ブログ ( http://blog.dogwood008.com/ )](http://blog.dogwood008.com/)もやっておりますので、よろしければ是非ご覧ください。
こんなIaCは嫌だ

勢い

# 「とりあえず手で直しますね」

直接サーバ上で書き換える → その後にコードを直す、らしい。
動確すらしないので、実行するとエラーになったりする。
コード化を忘れられることも多々。

# 「この状態でテストしたんだから、もう一回コードから作り直しはしない」

構築コードのテストではないんですかー！！

# 「もう一回実行すると動かなくなるかも」

ちゃんと冪等性を保つのは難しいというのはわかるが。
・・・あれ、何に使うんですかね、このコード？

# 「環境によって設定が違う・・・？」

コードを実環境に反映し忘れているのか、手で直したのをコード化し忘れているのか、分からない。
もう何も信頼できない。
歴史を紐解くか、自分を信じて判断を下すか。

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

教訓

- コードを実行しやすい仕組みやフローを整えたほうがよい
    - コード実行のハードルが高いと手で直しちゃう人が出てくる
- なるべくコードから作り直す
    - ってやらないとコードが正しいのかどうか不安になってくる
備忘録１：MZプラットフォームのためにMySQLをインストール

#MySQLのダウンロード
- MySQL Community Sever ５．７
  - 環境 MacBook Air macOS 10.13.3
  - https://dev.mysql.com/downloads/mysql/
  - ダウンロードファイルは，DMG Archiveにした．

#インストール 
- ダウンロードしたファイルをダブルクリックしてインストール開始
  - デフォルトのインストール先 /usr/local/mysql/
  - インストール後にrootのパスワードが表示されたのでスクリーンショットで保存

#設定
- PATHを通す
  - PATH=$PATH:/usr/local/mysql/bin/ 
  - [Macでパスを通す](https://qiita.com/nbkn/items/01a11392921119fa0153)
- パスワードの変更
  - [MySQL 5.7 をインストールしたら最初に行うセットアップ]
  (https://weblabo.oscasierra.net/mysql-57-init-setup/)
  - セキュアー・インストールを実行した
  - 初期パスワードの変更以外は,全てN（データベース管理の勉強のため）とした．

#起動確認
- ターミナルを開いて起動

```ruby:terminal
mysql -uroot -p
```
  - 無事にインストール完了を確認した．

#MZプラットフォームに必要な設定
- （準備中）

#MZプラットフォームのページに戻る
- [中小企業IT・IoT化支援のMZプラットフォームを使ってみる](https://qiita.com/tmdoi/items/b316df77f9fcf8cbcf42)

#履歴
- 2018.02.12 投稿
Stackはデフォルトで変更できる

(mutableでない通常の)Listは読み取り専用だが
Stackは追加/削除が出来る。

これは、Stackがadd()などを実装したVectorクラスを継承しているが
ListはただCollectionインターフェースを継承しているだけなためである。
  ＝ Listと違ってStackはデフォルトで追加できる。

当たり前のような気もするが混乱したのでメモ。
~~題名でほぼ終わってる~~
NanoPi NEOのLEDを任意の間隔で点滅させる　/sys/class/leds

#NanoPi NEOのLED

NanoPi NEOにはボード上のマイクロSDカードスロットとマイクロUSBコネクタの間に緑と青の2つのLEDがあります。
デフォルトの動作は以下の通り。

- 緑はPower LEDで電源が入るとずっと点灯
- 青はStatus LEDでカーネルが起動した後に点滅。

これらのLEDはLinuxのled class デバイスドライバとして実装されているので、Linuxの標準の方法で制御することができます。

#LEDクラスドライバ

カーネルのドキュメント
https://www.kernel.org/doc/Documentation/leds/leds-class.txt

/sys/class/leds を散策してみます。

```
# cd /sys/class/leds/
# ls
nanopi:blue:status  nanopi:green:pwr
# cd nanopi\:blue\:status/
# ls -l
total 0
-rw-r--r--    1 root     root          4096 Jan  1 02:09 brightness
lrwxrwxrwx    1 root     root             0 Jan  1 02:09 device -> ../../../leds
-rw-r--r--    1 root     root          4096 Jan  1 02:09 invert
-r--r--r--    1 root     root          4096 Jan  1 02:09 max_brightness
drwxr-xr-x    2 root     root             0 Jan  1 02:09 power
lrwxrwxrwx    1 root     root             0 Jan  1 02:09 subsystem -> ../../../../../class/leds
-rw-r--r--    1 root     root          4096 Jan  1 02:09 trigger
-rw-r--r--    1 root     root          4096 Jan  1 02:09 uevent
# cat trigger 
none rfkill-any kbd-scrolllock kbd-numlock kbd-capslock kbd-kanalock kbd-shiftlock kbd-altgrlock kbd-ctrllock kbd-altlock kbd-shiftllock kbd-shiftrlock kbd-ctrlllock kbd-ctrlrlock mmc0 [heartbeat] default-on 
# 
```

起動時に青LEDが点滅するのは、heartbeatをトリガーにしていました。


#brightnessに値を書き込んで点灯消灯させる例

緑のLEDを1秒点灯、0.2秒消灯を繰り返す。
ゆったりした正常動作っぽい感じの表示になります。(主観です。)

```sh
#!/bin/sh

echo none > /sys/class/leds/nanopi:green:pwr/trigger

while :;do
  echo 1 > /sys/class/leds/nanopi:green:pwr/brightness
  sleep 1
  echo 0 > /sys/class/leds/nanopi:green:pwr/brightness
  sleep 0.2
done
```
青のLEDを0.05秒点灯、0.05秒消灯を繰り返す。
イライラしたエラーっぽい感じの表示になります。(主観です。)

```sh
#!/bin/sh

echo none > /sys/class/leds/nanopi:blue:status/trigger

while :;do
  echo 1 > /sys/class/leds/nanopi:blue:status/brightness
  sleep 0.05
  echo 0 > /sys/class/leds/nanopi:blue:status/brightness
  sleep 0.05
done
```

#点灯時間と消灯時間を指定して点滅させる例

時間の制御をカーネル自身にやらせることもできます。
triggerにtimerを指定するのですが、NanoPi NEOのデフォルトのカーネルではこれが有効になっていないので、カーネルのコンフィグに以下を追加してカーネルをリビルドします。

```
CONFIG_LEDS_TRIGGER_TIMER=y
```

緑のLEDを1秒点灯、0.2秒消灯を繰り返す。

```sh
#!/bin/sh
echo timer > /sys/class/leds/nanopi:green:pwr/trigger
echo 1000 > /sys/class/leds/nanopi:green:pwr/delay_on 
echo 200 > /sys/class/leds/nanopi:green:pwr/delay_off
```

青のLEDを0.05秒点灯、0.05秒消灯を繰り返す。

```sh
#!/bin/sh
echo timer > /sys/class/leds/nanopi:blue:status/trigger
echo 50 > /sys/class/leds/nanopi:blue:status/delay_on 
echo 50 > /sys/class/leds/nanopi:blue:status/delay_off
```

両方のLEDの点滅を止めて消灯。

```sh
#!/bin/sh

echo none > /sys/class/leds/nanopi:blue:status/trigger
echo none > /sys/class/leds/nanopi:green:pwr/trigger

echo 0 > /sys/class/leds/nanopi:blue:status/brightness
echo 0 > /sys/class/leds/nanopi:green:pwr/brightness
```
MacでBizonBoxを認識させようとした話

自分のMacに外付けGPUを認識させようとしたらうまくいかなかった話とどうやって解決したのかを書いていきます

#環境
iMac (21.5-inch, Late 2015)
OS : High Sierra 10.13.3

#外付けGPU(eGPU)
BizonBox3
![スクリーンショット 2018-02-12 13.53.38.png](https://qiita-image-store.s3.amazonaws.com/0/237542/b100213a-5aac-219e-07ae-4652bd0fa07f.png)
↑これ
ちなみにBizonbox3はthunderbolt3対応なのですが私の場合はやむを得ない事情でアダプタとthunderbolt2のケーブルでMacに接続しています(これがややこしくなった元凶の気がします...)

#実際に接続してみる
さっそくMacとGPUを繋げて接続確認をしていくと、CUDAがGPUを検知しない
原因を探っていく...
![スクリーンショット 2018-02-12 13.38.04.png](https://qiita-image-store.s3.amazonaws.com/0/237542/e11f0f33-3610-e58e-a0d0-cd4365c86226.png)

左上のリンゴマークから
このMacについて -> システムレポートまでいくと出てくる画面です
unsupported　と表示されています。これがダメみたいですね

#解決策(できなかったほう)
こういうときはGPUを製造している人たち：つまりサポートにメールで聞くのが一番です
ということでメールを送ってみると
https://bizon-tech.com/a/tb3e.zip
これを展開してそのなかのforce-start.command　をダブルクリックして実行しろと言われました。終わったらMacを再起動します
これでいける!... と思いきや私の場合は解決しませんでした。

#解決策(できたほう)
仕方がないのでWebを色々探していると
https://egpu.io/setup-guide-external-graphics-card-mac/
このページを見つけたので読んでいくとそこに
https://github.com/KhaosT/tb3-enabler
これを使えと書いてあります
さっそくダウンロードしてきて実行します
※ pythonはMacに最初からinstallされているversionのやつじゃないと動かないかもしれません

``` command:
$ python tb3-enabler.py apply
```
最後に done と出力されれば成功ですのでMacを再起動します.

![スクリーンショット 2018-02-12 13.42.33.png](https://qiita-image-store.s3.amazonaws.com/0/237542/15ff07a1-957a-ad5d-4997-db44028f398a.png)

無事成功しました!

#最後に
今回は unsupported を解決する部分だけやりましたが、GPUはOSのversionだったりNVidiaやCUDAのversionだったりが原因でうまく接続できなくなるので、対応するversionを事前によく調べてから購入するものを決めた方がいいです。絶対に
Laravel Homesteadでphp-mime-mail-parser(mailparse)の導入

Laravel Homesteadの環境にphp-mime-mail-parser(mailparse)をインストールした時のメモ。

## tl;dr

PHP7.1での情報はあったけど7.2の情報はまだなかったので同様に試したところ動いた。

http://www.84kure.com/blog/2016/07/23/php-mailparse%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B/

## 環境情報

2018年2月現在のHomestead環境。

* Laravel 5.5
* PHP7.2

## 作業手順

### 1. aptパッケージの追加

必要かわからないけど一応。

```bash
$ sudo apt install php-cli php-pear php-dev php-mbstring
```

### 2. mailparseのインストール

当たり前だが、サーバで設定する必要があるのでVagrant sshしてから実施。

```bash
$ cd /tmp
$ pecl download mailparse
$ tar xvzf mailparse-3.0.2.tgz
$ cd mailparse-3.0.2
$ phpize
$ ./configure
$ sed -i 's/^\(#error .* the mbstring extension!\)/\/\/\1/' mailparse.c
$ make
$ sudo make install
$ echo "extension=mailparse.so" | sudo tee /etc/php/7.2/fpm/conf.d/30-mailparse.ini > /dev/null
$ echo "extension=mailparse.so" | sudo tee /etc/php/7.2/cli/conf.d/30-mailparse.ini > /dev/null
```

### 3. php-mime-mail-parserのインストール

mailparseインストール後は普通にcomposerで追加できる。

```bash
$ composer require php-mime-mail-parser/php-mime-mail-parser
```
C#で数学パズル - 割り切れる4桁の逆転数


以下の問題をC#で解いてみたいと思います。

## 問題
4桁の数値を順序を逆転させた数値（例えば、5432の場合は2345が逆転させた数値）で割ったときに、割り切れる4桁の数を求めよ。 (5432 / 2345 は割り切れないので求める答えではない） 
ただし、商が1のものや、割る数が4桁でないものは除外する。 

### C#のコード

```cs
class Program {
    static void Main(string[] args) {
        for (int n = 1000; n < 9999; n++) {
            int r = ReverseNumber(n);
            if (n != r && (n % r == 0) && (r > 1000))
                Console.WriteLine(n);
        }
    }
    private static int ReverseNumber(int n) {
        int ans = 0;    
        while (n > 0) {
            int remainder = n % 10;
            ans = ans * 10 + remainder;
            n /= 10;    
        }    
        return ans;
    }
}
```

### 実行結果

```
8712
9801
```

へー、NEC PC-9801(1980年代から90年代に一世を風靡したPC)の9801と何か関係があるのかな。それとも偶然？

## ４桁以外でも求めてみる

この問題をもう少し一般化してみます。

### 問題
N桁の数値を順序を逆転させた数値（例えば、5432の場合は2345が逆転させた数値）で割ったときに、割り切れるN桁の数を求めよ。 
ただし、商が1のものや、割る数がN桁でないものは除外する。 
なお、Nは、`2 <= N <= 9` の自然数とする。

### C#のコード

```cs
class Program {
    static void Main(string[] args) {
        for (int n = 2; n < 10; n++) 
            DivisibleReverseNumber(n);
    }

    private static void DivisibleReverseNumber(int digit) {
        var start = (int)Math.Pow(10, digit-1);
        var end = (int)Math.Pow(10, digit);
        for (int n = start; n < end; n++) {
            int r = ReverseNumber(n);
            if (n != r && (n % r == 0) && (r.ToString().Length == digit))
                Console.WriteLine(n);
        }
    }
    private static int ReverseNumber(int n) {
        int ans = 0;
        while (n > 0) {
            int remainder = n % 10;
            ans = ans * 10 + remainder;
            n /= 10;
        }
        return ans;
    }
}
```

先ほど書いた、Mainメソッドの中身を一般化して、DivisibleReverseNumberメソッドを定義しました。引数は桁数です。

Mainメソッドでは、これを2から9まで回します。

### 実行結果

```
8712
9801
87912
98901
879912
989901
8799912
9899901
87128712
87999912
98019801
98999901
871208712
879999912
980109801
989999901
```

一部を抜き出すと、8712, 87912, 879912, 8799912, 87999912, 879999912　という数があります。9801についても、9801, 98901, 989901... と同じようなパターンがあります。

なかなか興味深い結果がでましたね。不思議です。

---

この記事は、Gushwell's C# Programming Pageで公開したものをに加筆・修正したものです。
Mixed Reality Toolkit - Unityを使いUWPで追加開発するときはJSONに気を付ける

# Mixed Reality Toolkit - Unity内でJSONライブラリ使っているという話
REST APIやWebSocket、パラメータの保存等最近はデファクト的になってきているJSONですが、Mixed Reality toolkit - Unity（以下MRTK）でも利用されています。
あまり意識をしていなかったのですが問題が発生し、色々対処することになったので情報共有します。

## 問題になっていたところ
例よってUnityだけで開発できる場合はさほど問題にはならないと思います。
一方、UWPにビルドした後に追加で実装する場合注意が必要です。
今回使っていたMRTKは以下のバージョンです。

* MRTK-Unity 2017.2.1.0(HoloToolkit-Unity-2017.2.1.0.unitypackage)

MRTKはNewtonsoft.Json(8.0.3.19514)を利用しています。
このため、UWP側で追加するOSSライブラリがNewtonsoft.Jsonを使う場合はバージョンが同じになるように調整が必要になります。

## もう少し詳細
今回問題になったのは、UWP側でMilkcocoa用のUWPのライブラリを利用するときでした。ライブラリの最新(1.3.0)はNewtonsoft.Jsonバージョンが9.0.1以上です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152548/c3d86f6f-6500-946b-744b-3978d45da6f0.png)

nugetから取得すると自動的に9.0.1以降がセットアップされるのですが、この時点でバージョン違いのNewtonsoft.Jsonが複数セットされます。
厄介なことにそのまま何事もなくビルドと配置が終わります。この時点ではどちらかのバージョンのみが配置されるようです。動かすとDLLが見つからずにエラーが発生します。

## 対応策
### 使いたいライブラリのバージョンを合わせる。
今回のMilkcocoaのライブラリではバージョンが0.3.0であればMRTK内のNewtonsoft.Jsonを合うので、それを使用したところ問題は解消しました。ただし、この方法はライブラリ側が偶然古いバージョンを使っていたからできた方法ですが、現状この方法以外の回避策はないと思います。

## 最後に
MRTKでNewtonsoft.Jsonがある場所は「Assets\HoloToolkit\Utilities\Scripts\GLTF\Plugins」配下になります。ですが、ここを修正するのは影響範囲を考えると難しく、当面はバージョンを落とす対応しかないと思います。
自分がサーバを立てるときに最初にする設定（CentOS 7）

# 環境
* CentOS7
* シェルはbash
* 公開鍵認証は設定済みとする

# SSHの設定変更
```:/etc/ssh/sshd_config
Port (ポート番号)
PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no
```
## firewalldてSSHポートを変更
```shell
sudo firewall-cmd --permanent --service=ssh --add-port=(ポート番号)/tcp
sudo firewall-cmd --permanent --service=ssh --remove-port=22/tcp
```

# 色々アップデート
```shell
sudo yum -y update
```

# RemiとIUSを追加
```shell
sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
sudo yum install -y https://centos7.iuscommunity.org/ius-release.rpm
```

# lsコマンドで自動的に-laがつくようにする
```sh:/etc/profile.d/colorls.sh
alias ls='ls --color=auto -la' 2>/dev/null
```

# ホスト名を変更
```shell
sudo hostnamectl set-hostname (ホスト名)
```

# シェルのプロンプトにFDQNを表示
```sh:/etc/profile
if [ $(id -u) -eq 0 ];
then
    export PS1="[\e[35m\u\e[37m@\e[32m\H\e[0m \W]# "
else
    export PS1="[\e[35m\u\e[37m@\e[32m\H\e[0m \W]$ "
fi
```

他に何かあればアドバイスお願いします
AWS S3で静的ウェブサイトをホスティングする

## 背景

会社でホームページ作成の案件を任されたのをきっかけに，S3を用いてウェブサイトを公開するまでの流れを知ることができたので，整理も兼ねて記事を書くことにしました．

## 概要

今回はタイトル通り，S3で静的ウェブサイトをホスティングするところまでを書きます．

まず，静的ウェブサイトとは，予め作成されたhtmlファイル等をサーバにアップロードしておき，ブラウザからのリクエストに対してそのままそのファイルをレスポンスするサイトのことです．

S3とは，Amazonが提供するクラウドストレージサービスのことです．
S3は動的ウェブサイトには対応していませんが，静的ウェブサイトなら独自ドメインを割り当てることで，S3のみで完結するため，低コスト，高安定なサイト運営が可能です．

## 手順

### バケットを作成する

S3 Management Consoleからバケットを作成します．
このとき，バケット名を割り当てるドメイン名と同じにすることに注意して下さい．
これはあとでRoute53でS3バケットに独自ドメインを割り当てるためです．

リージョンは「アジアパシフィック（東京）」を選択．
「次へ」を連打し，バケット作成を完了します．

### 静的ウェブサイトをホストする

作成したバケットを選択し，「プロパティ」タブをクリック．
「Static website hosting」をクリックし，「このバケットを使用してウェブサイトをホストする」を選択します．

すると，

- インデックスドキュメント
- エラードキュメント
- リダイレクトルール

が表示されます．

インデックスドキュメントとは，ファイル名を指定せずにアクセスしたときに表示されるページです．
アップロードするファイル名を入力します．

エラードキュメントとは，ファイルが存在しないなど，エラーが発生したときに表示されるページです．
今回は上記と同じファイル名を入力します．

リダイレクトルールとは，特定のコンテンツのウェブページのリクエストを自動的にリダイレクトするように設定できるルールのことです．
空欄可なので，今回はスルーします．

「保存」し，ホスティングの設定完了です．

### アクセス権を付与する

初期設定では，バケットに対するアクセス権は当事者にしかありません．
今回はウェブサイトを公開したいので，誰でもバケットにアクセスできるように設定します．

「アクセス権限」タブをクリックし，バケットポリシーを選択．
するとテキストエリアが出てくるので，以下のバケットポリシーをコピペして追加します．
`examplebucket`の部分は作成したバケット名に変更してください．

```json
{
  "Version":"2012-10-17",
  "Statement":[
    {
      "Sid":"AddPerm",
      "Effect":"Allow",
      "Principal": "*",
      "Action":["s3:GetObject"],
      "Resource":["arn:aws:s3:::examplebucket/*"]
    }
  ]
}
```

匿名ユーザーに読み取り専用のアクセス権を与えるよという意味です．
テキストエリアの下のドキュメント → Bucket Policy Examples → Granting Read-Only Permission to an Anonymous Userに詳細が書いてあるので気になる方はどうぞ．

「保存」して，アクセス権限の設定完了です．

## 結果

以上で，静的ウェブサイトをS3でホスティングし，誰でも閲覧可能な状態にすることができました．
この問題がわからない


```math
\begin{align}
&nを自然数とし、\\
&a_1 =1 ,b_1=0と定め、\\
&a_{n+1} =4^{a_n} -2^{b_n}\\
&b_{n+1} =3^{a_n} +2^{b_n}\\
&とする．このときa_nとb_nの\\
&大小関係を比較せよ．
\end{align}
```
ざっくばらんメモ_24：kaggle bowl2018, Coursera Robotics Perception

###kaggle bowl 2018
次のトライとして去年もあったdata science bowlの2018年版
へチャレンジしてみることにする。
今回のお題はがん検出自動化に向けた画像ベースの細胞核検出問題。
核検出は分析のスタートポイントとなるため重要との事。
評価は検出箇所に関する正解値とのIoUを用いる。
この時、IoUに対する複数の閾値を用意し、それを超えたかどうかで
positive/negativeを判定、True Positiveの比率を用いて評価する。
これはさらに各IoU閾値に対して求められ、最後に平均化される。
続いて、データセットをダウンロードする。
データは主に核の画像で成り立っていて、様々なコンディションで撮影されている。
またその画像に対して正解値として核に対するマスク画像が与えられている。
またデータはstage1とstage2に分かれており、stage2のデータは後程公開される。
ちなみにstage2はテストデータのみの公開でstage1のテストデータとともに予測する必要がある。
マスクデータはヒューマンエラーが含まれている事が示唆されていて、自分で修正する事も可能だとの事。
また今回マスクデータはデータ量軽減のために特殊なエンコードがされているのでその形式で予測結果も
出さなければならない。

###Coursera: Robotics Perception
引き続き、Coureraのrobotics perceptionのコースを受けている。
今回はWeek3の最終日で、programming assignmentを行う。
このassignmentでは簡単なARアプリケーションを作成する。
この課題では、複数の画像が与えられ、そこに写っている四角形物体の
コーナーをトラッキングするコードを実装する。
続いてそれらの結果からcamera -- world coordinate間の写像行列を
推定する。
以上の結果を用いて最後に四角形物体上に立方体をレンダリングした画像を作成
する。

コーナーのトラッキングに関しては画像の勾配からトラッキング方向を予測しながら
トラッキングを行うKLT手法を用いる。
続いて写像行列の推定は、Week2で既に実装した、複数点のworld -- camera coordinateの
位置関係情報からSVDを用いて予測する。
しかしその場合予測された行列は、回転行列の部分は正規直交でなく、また向きに関して一位に決まらないなど
の問題があるので、SVDをさらに適応してクリーンアップするコードを実装する。
さらにassignmentの推奨でこのように実装したコードのテストを実装する事が推奨されているので、
ランダム行列とそれに対するQR分解を用いた正規直交行列を回転行列として用意、また
translation, scaleに関しても正規分布を用いてランダム生成をして、それを用いたテストコードで
動作確認を行った。
Python 環境構築手順 Windows編

# 前提
この文章では Windows に Python の環境構築する手順を記述します。

「Pythonの学習」、「機械学習」などを簡単に始める事を主な目的にしています。

# Python 環境の選定
Windows で Python の構築をする場合、主に以下の選択肢があります。

- Python2 or Python3
- Pythonを素でインストール or Anaconda or WinPython

今回は「Python 3、WinPython」を利用します。

選定理由

- Python3 を積極的に利用してください。Python2は2020年以降サポートされなくなります
- WinPython は学習初心者向けです。導入および削除が簡単です
- Anaconda は機械学習の初心者には不向きです。障害解決等が困難になりますので、初期学習では利用を避けた方が良いかと思います(教育等を行なう立場として非常にAnacondaで発生する問題が多すぎてやっかいなのが本当の所です。仕事でも機械学習だけやるわけでないので、利用を避けています)

# Windows 側の準備

学習する場合、ソースコード等が散乱しないように、また、学習にプラウザを利用しますので、以下の準備を事前にしてください。

- C ドライブ直下に「study」フォルダを作成する
- Google Chrome をインストールする

以上で、準備は完了とします。

# WinPythonのダウンロード

WinPython は以下からダウンロードできます。
https://ja.osdn.net/projects/sfnet_winpython/releases/

公式サイトは以下です。ただ公式サイトからのダウンロードは遅いので上記サイトから取得を推奨します。
http://winpython.github.io/
https://github.com/winpython/winpython/releases

- Windows OS が 32bit なのか 64bit なのかは確認してください
- ダウンロードは準備で作成した「studyフォルダ」の中にしてください

この文章では「WinPython 3.6.3.0Qt5-64bit」を利用して以後解説します。


ダウンロードすると「  WinPython-64bit-3.6.3.0Qt5.exe 」がダウンロードされますので、ダブルクリックします。

レジストリ登録するか確認されますが、特に登録しなくても動作します。


フォルダの中は以下のようになります(ダウンロードタイミングで多少違います)

![winpython_capture.jpg](https://qiita-image-store.s3.amazonaws.com/0/203673/1c52ec66-ff33-34f2-0b43-e7eb6006a189.jpeg)

# Jupyter Lab 起動
上記で「Jupyter Lab.exe」をダブルクリックして起動します。

![jupyterlab.png](https://qiita-image-store.s3.amazonaws.com/0/203673/482fbdef-c8ea-3f34-ca9e-aa0bbbdbff25.png)

「Notebook」の「Python3」をクリックすると「Notebook」が新規作成されます。

![jupyterlab_notebook.png](https://qiita-image-store.s3.amazonaws.com/0/203673/990ec3a8-f380-6a11-287e-1bfa16a3d4ad.png)

# ライブラリバージョンの確認

機械学習では様々なライブラリを利用します。それぞれのバージョンを確認します。

WinPython に含まれるライブラリは
https://github.com/winpython/winpython/blob/master/changelogs/WinPythonQt5-64bit-3.6.3.0.md
で確認する事も可能ですが、実際に自分の環境のバージョンを確認してみます。

上記の「Jupyter」の画面に以下のコードを記述します。


```python
import numpy as np
print(np.__version__)

import scipy as sp
print(sp.__version__)

import sklearn
print(sklearn.__version__)

import pandas as pd
print(pd.__version__)

import tensorflow as tf
print(tf.__version__)

import keras
print(keras.__version__)
```

記述したら、「Ctl + Enter」で実行します。バージョンを確認してください。

![ctrl_enter.png](https://qiita-image-store.s3.amazonaws.com/0/203673/8160fbfc-3ca6-d696-9b68-65cd8a2bb253.png)

バージョンが正常に表示されれば成功です。

WinPythonを入れてしまえば、機械学習に必要なライブラリはすでに構築ずみなので、そのまま学習を開始する事が可能です。

# 書いた人に関して
[Tech Fun株式会社](http://www.techfun.co.jp/)スペシャリスト、xza です。

社内で開催した初心者向け勉強会での記事等を公開しています。
クロージャに関する重要な点をまとめておきます。（読書メモ）


以前、投稿した

[JavaScriptのすべての関数はクロージャを定義します。(読書メモ)](https://qiita.com/jun68ykt/items/6ea68c2d44601c241dad) 

に続き、以下、[徹底マスター JavaScriptの教科書](https://www.amazon.co.jp/dp/4797388641) 「第８章　関数」からの引用です。

> 例 8-7 カウンタ関数を作る関数（無名関数版）

> ```javascript
function makeCounter() {
	var count = 0;
	return function() {
		return count++;
	};
}
```

> ここで、クロージャに関する重要な点をまとめておきます。

> **クロージャ理解のポイント**

> - 外側の関数を呼んだときに、その関数のcallオブジェクトと入れ子の関数の関数オブジェクトが
生成され、入れ子の関数の定義するクロージャが生成されます。つまり、外部関数はクロージャを
生成するファクトリ関数と見なせます。
　　

> - 外側の関数の callオブジェクトはクロージャの内部状態で、外側の関数が呼ばれるたびに異なる内部状態が生成されます。
　
- 入れ子の関数の関数オブジェクトが存在している限りは、外側の関数のcallオブジェクトは存在し続けます。これは、外側の関数の関数オブジェクトが消失しても存続します。
　
- クロージャの内部状態（外側の関数のローカル変数）は、外側から隠蔽されており、内側の関数からのみアクセスできます。


　
この本から[前回引用したとき](https://qiita.com/jun68ykt/items/6ea68c2d44601c241dad)にも書きましたが、個人的な感想として、
この本を読んでいると、JSのインタプリタのソースを読みたくなります。
関数型言語Haskellでfizzbuzzプログラムを作成する

# BackGround
筆者は普段、Go、Perl、C言語などを主に使用しプログラムを書いています。
関数型言語は、過去にLispを試食してみた程度です。

最近、[すごいH本](http://shop.ohmsha.co.jp/shopdetail/000000001926/)なるHaskell本を読んでいて、
少しずつ関数型言語なるものを自分の使用する言語へ加えていきたいと考えています。
関数型を勉強するにあたって、同じくHaskellを学んでみたいと考えている方は多いのではないでしょうか。

というわけで、典型的なマルチパラダイム言語を書いている人から見た、Haskellプログラムの雰囲気を、
今回はお伝えしてみようと思います。

# Target
* Haskellのソースコードの雰囲気がつかめる
* 構文についての言語仕様にどんなものがあるか知ることができる

# What I want to make
よくある`fizzbuzz`プログラムをサンプルコードとして作成したいと思います。
今回、fizzbuzzプログラムの要件(ルール)は、以下のように定義します。

* 要件
    * 1~100の数字列を文字列として表現し、標準出力へ出力する
    * 数字列の中で、3の倍数は"Fizz"という文字列へ置き換えて出力する
    * 数字列の中で、5の倍数は"FizzBuzz"という文字列へ置き換えて出力する
    * 数字列の中で、3の倍数かつ5の倍数は"FizzBuzz"という文字列へ置き換えて出力する


# SourceCode(Go)
`fizzbuzz`は、よくあるマルチパラダイム言語では、例えば以下のようになります。(Goにて作成)

```go
package main

import (
	"fmt"
	"strconv"
)

func fizzbuzz(num int) string {
	if isFizz(num) && isBuzz(num) {
		return "Fizzbuzz"
	} else if isFizz(num) {
		return "Fizz"
	} else if isBuzz(num) {
		return "Buzz"
	} else {
		return strconv.Itoa(num)
	}
}

func isFizz(num int) bool {
	return num%3 == 0
}

func isBuzz(num int) bool {
	return num%5 == 0
}

func main() {
	for i := 1; i <= 100; i++ {
		fmt.Println(fizzbuzz(i))
	}
}
```

では、次は同様の出力が得られるプログラムを、Haskellにて作成してみましょう。

# SourceCode
Haskellで作成したfizzbuzzプログラムのソースコードは以下のようになりました。
上のGoによるプログラムと対比させやすい形にしています。
(もしくは、Goのプログラム側をそうさせている)

```haskell
fizzBuzz :: Int -> String
fizzBuzz n | isFizz && isBuzz = "FizzBuzz"
           | isFizz = "Fizz"
           | isBuzz = "Buzz"
           | otherwise = show n
           where
             isFizz = n `mod` 3 == 0
             isBuzz = n `mod` 5 == 0

main = do
     mapM_ putStrLn $ map fizzBuzz [1..100]
```

このシンプルなプログラムは、「何をするか」ついて、
Haskellを知らない人へも説明がいらないような明快さを持っていると思います。

* Goのプログラムと比較して以下のような違いがある
    * コード行数が少ない
    * `izFizz`、`isBuzz`の定義が、関数の中に内包されており、可読性が高い

Haskellの言語仕様に関わる要素を以下で解説します。
(以下は、Haskellの言語仕様の中でもほんの一部ですが、言語仕様の雰囲気を感じ取ってもらえると思います。)

* `fizzBuzz :: Int -> String`
    * 関数の型定義を行う
    * Int(整数)を取り、String(文字列)を返す関数であるという定義を行っている
    * ちなみに2引数である場合は`Int -> Int -> String`となる
* `fizzBuzz n | isFizz && isBuzz = "FizzBuzz"`から始まる一連の定義
    * `guard`という仕組みを用いて、引数ごとに返す値を定義している
    * `|`で繋いだ一連の式によって、上から(左から)順番に評価される
* `where`
    * where文という構文
    * ブロックスコープで、変数へ値を「束縛」する
    * 変数への値の「代入」は純粋関数として「副作用」にあたるため、禁止されている
        * ゆえに、Haskellでは、値を束縛した変数への再代入は禁止されている
* `main = do`
    * ざっくりとは、main関数のような位置づけ
    * 実体は、`IO monad`という副作用伴うI/O処理を行う`monad`という仕組み
* `mapM_ putStrLn $ map fizzBuzz [1..100]`
    * `map`は、Perlなどでもある`map`と同様のもの
    * `mapM`は説明が難しい
        * とりあえず「`IO monad`という仕組みの中で、リストを出力するmap処理を行うために必要」と認識しておく
        * 正確な理解はより詳細な`monad`の理解が必要

fizzbuzzプログラムを書くだけでも、マルチパラダイム言語にはないような言語仕様に従うことになります。
小さなプログラムでも、エラーを出しながら意図するものができるまで書いてみることが理解へ近道と思いました。

# Roundup
* 言語のパラダイムが大きく異なると学習コストは高くなる
* 関数型ならではの言語仕様が何を目的としているかを意識すると、言語仕様への理解がし易い
* とはいえ、Haskellはマルチパラダイム言語と共通するとことも沢山あるので、お手上げとはならず学んでいける感触である

# Reference
* [すごいHaskell楽しく学ぼう!](http://shop.ohmsha.co.jp/shopdetail/000000001926/)
* [mapM](https://www.haskell.org/hoogle/?hoogle=mapM)
Crystalでgnuplot実行するの作ったった

Crystalは実行速度めちゃくちゃ早くて計算向きなのに、[awesome crystal](https://github.com/veelenga/awesome-crystal)みてもグラフ描出できるツールがないので、怒って超シンプルなのを作りました。
[nuplot](https://github.com/kojix2/nuplot)

(2018/3/12) 追記
(Array).to_gp から to_gp(Array) に変更しました。（bird1079s様ありがとうございました）

# 使い方
readmeの通りです

```crystal
require "nuplot"
```
![sin.png](https://qiita-image-store.s3.amazonaws.com/0/144608/e4acd8fe-499f-5f07-da0a-484cc65416c2.png)

```crystal
Gnuplot.plot do |s|
  s << "plot sin(x)"
end
```
![scatter2d.png](https://qiita-image-store.s3.amazonaws.com/0/144608/43f1ace3-8147-f6e5-6c3c-86800fb60f24.png)

```crystal
x = Array(Float64).new(100){ rand(10.0..20.0) }
y = Array(Float64).new(100){ rand(100.0..200.0) }

Gnuplot.plot do |s|
  s << "set title 'SCATTER'"
  s << "plot '-' pt 6 lt rgb 'red' t 'circle'"
  s << to_gp([x, y])
end
```
![lines.png](https://qiita-image-store.s3.amazonaws.com/0/144608/fad5195e-f3a3-6ac4-3911-1ea150d04075.png)

```crystal
memo = 0
x = Array(Float64).new(100,0.0)

100.times do |i|
  memo = memo + rand(-0.9..1.0)
  x[i] = memo
end

Gnuplot.plot do |s|
  s << "set title 'LINES'"
  s << "plot '-' with lines title 'x'"
  s << to_gp(x)
end
```
![scatter3d.png](https://qiita-image-store.s3.amazonaws.com/0/144608/61bccc04-ad34-452b-e6bb-91e834d1c4cc.png)

```crystal
x = Array(Float64).new(1000){ rand(-10.0..10.0) }
y = Array(Float64).new(1000){ rand(-10.0..10.0) }
z = Array(Float64).new(1000){ |i| x[i]**2 + y[i]**2 }

Gnuplot.plot do |s|
  s << "set title 'SCATTER 3D'"
  s << "splot '-' pt 6 t 'z=x^2+y^2'"
  s << to_gp([x,y,z])
end
```

# 感想など
見ての通り生成した文字列の配列 s をgnuplotに投げ込むだけの超単純なツールです。けれども他にCrystalでグラフを描出するツールが見当たらないので、こんなもんでも需要はあるかなと思います。Arrayが入れ子になってる場合の型判定は難しいですね。きちんとできていません。

僕はこれを読んだ誰かが実用的なグラフ描出ツールを作ってくれるのを楽しみにしています。
UnityARKitPluginでハマったところ２選

いろいろ紹介している記事はたくさんあるので、それを参考にすればできるが、私が斜め読みしているせいで、細かなところをすっ飛ばしてしまい、ハマってしまったところを書き記しておきます。

Unity ARKit Plugin
https://assetstore.unity.com/packages/essentials/tutorial-projects/unity-arkit-plugin-92515

試した環境
Unity 2017.2.0f3
UnityARKitPlugin 1.0.14
macOS 10.12.6
iOS 11.2.5


## その１ ARkitRemoteが動かない
#### ARKitRemoteとは
これをiPhoneに入れておいて起動すれば、いちいちビルドして入れなおさずに、UnityのEditor上からでもARKitが使えるよ、というもの（少し重いけど）。2017以降じゃないと動かないっぽい。

#### 現象
Unityから接続しようとするとエラーがでる。

例えば、以下のような・・

```
Attempting to connect to player ip: 127.0.0.1 with a 1 ms timeout
UnityEditorInternal.ProfilerDriver:DirectURLConnect(String)
UnityEditor.ConsoleAttachProfilerUI:SelectClick(Object, String[], Int32)
```

#### 対策
ARkitRemoteはビルド時にDevelopmentBuildにチェックを入れる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17747/c6f067d6-f4db-3397-6f2e-3a3cd347d44f.png)

##その２ FaceTrackingが動かない
#### FaceTrackingとは
iPhoneXでFaceTrackingできる機能。

#### 現象
ビルドしてiPhoneにアプリを入れても、起動するとすぐ落ちる。

#### 対策
Asset/ARKitSetting/ARKitSettingsの
AR Kit Uses Facetracking
App Requres AR Kit
にチェックを入れる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17747/e8e73d1f-8ece-eda9-b5f9-dd29338d9a11.png)
Buildrootでルートファイルシステムを構築するときに必ずすること

私は組み込みLinuxのルートファイルシステムを作るのにいつもBuildrootを使っています。
そのときにいつもしていることを備忘録がてら書いておきます。

#ccache を有効にする

ルートファイルシステムを構築するときに、特に最初の段階では何度も`make clean` してからビルドをやり直すことが多くなります。そうするとクロスコンパイラを作るところからやり直しになるので、かなり時間がかかります。この時間を短縮するのにccacheが効果が高いです。
ccacheは一度コンパイルした内容を別のところにキャッシュとして保存しておき、次に同じソースを同じコンパイルオプションでコンパイルするときにはそのキャッシュからとってきてくれます。
Buildrootではccacheの使用がサポートされていて、コンフィグの設定を有効にするだけで簡単にccacheを利用することができます。

make menuconfig で

```
Build options  ---> 
  Commands  ---> 
    [*] Enable compiler cache
```

詳細はここを参照
https://buildroot.org/downloads/manual/manual.html#ccache


#DHCPサーバからIPアドレスを取得できるようにする

私の場合、開発時には必ずEthernetを使用するのでこれは必須。

```
System configuration  --->  
  (eth0) Network interface to configure through DHCP
```

ここにeth0を入力して、dhcpcdをインストール。

```
Target packages  --->  
  Networking applications  ---> 
     [*] dhcpcd 
```

#sshでログインできるようにする

デフォルトではrootのパスワードが空なので、なにか設定する。この例では`ppaasswwoorrdd`

```
System configuration  --->  
  [*] Enable root login with password 
  (ppaasswwoorrdd) Root password
```
sshのサーバとしてdropbearをインストール

```
Target packages  --->  
  Networking applications  ---> 
    [*] dropbear                                                              
    [*]   client programs                                                     
    [*]   disable reverse DNS lookups 
    [*]   optimize for size                                                   
    [ ]   log dropbear access to wtmp                                         
    [ ]   log dropbear access to lastlog
```

rootでsshのログインをさせたくない場合は、別のユーザを登録する。
https://buildroot.org/downloads/manual/manual.html#customize-users

dropbearは省メモリ版のsshソフト。sshサーバ、sshクライアント、scpが使用できる。sftpは無い。
フルセットのsshの機能が欲しい場合は代わりにopensshを入れるのがいいでしょう。

#IPアドレスを調べなくてもホスト名で指定してsshでログインできるようにする

ホスト名をセットする。この例では`neo`

```
System configuration  --->
  (neo) System hostname
```

avahiのmDNSのdaemonをインストール

```
Target packages  --->  
  Networking applications  ---> 
 [*] avahi 
 [ ]   IPv4LL network address configuration daemon  
 [*]   mDNS/DNS-SD daemon 
 [*]     libdns_sd compatibility (Bonjour)
```

`libdns_sd compatibility (Bonjour)` はよくわからないけどONにしておいた。

参考。
[NanoPi NEOのホスト名変更とavahi-daemonの有効化](https://qiita.com/tetsu_koba/items/3d6727d4cf887b8be66f)

#/devの扱いの選択

```
System configuration  --->
  /dev management (Dynamic using devtmpfs only)  ---> 
```

選択肢として以下がある
- Static using device table
- Dynamic using devtmpfs only　(これがデフォルト設定)
- Dynamic using devtmpfs + mdev
- Dynamic using devtmpfs + eudev

起動時からデバイスに変化が無いならばデフォルトのままでよい。
USBやSDカードなどで途中で抜き差しすることがあって、そのタイミングで何かしたいのならばmdevかeudevを併用する。
mdevはbusyboxに統合されているのでサイズが小さくて済む。PC Linuxのudevスクリプトをそのまま使いたい場合はeudevがよい。

詳細はここを参照
https://buildroot.org/downloads/manual/manual.html#_dev_management

#straceをいれる

今までの経験から、トラブルシューティングの初動にはstraceが役に立つので入れておく。

```
Target packages  --->  
  Debugging, profiling and benchmark  ---> 
 [*] strace
```

#ここまで
気がついたら追記する予定。

#関連
[NanoPi NEOのルートファイルシステムをBuildrootで作る(1)](https://qiita.com/tetsu_koba/items/9a64042ddc26845a507c)
[NanoPi NEOのルートファイルシステムをBuildrootで作る(2)](https://qiita.com/tetsu_koba/items/de925c3d8a011e5eb8ff)
Rails5で日本語カラム名が簡単に使えるようになった

Rails5になってマイグレーションの[commentが使える](http://guides.rubyonrails.org/active_record_migrations.html#column-modifiers)ようになりました。これを利用すると簡単に日本語カラム名が使えるようになります。

ちなみに現在対応しているDBMSはMySQLとPostgreSQLだけみたいです。

例えば以下のようなUserモデルを作ります

```ruby:db/migrate/create_user.rb
class User < ActiveRecord::Migration[5.1]
  def change
    create_table :users, comment: "ユーザ" do |t|
      t.string :first_name, comment: '名'
      t.string :last_name, comment: '姓'
    end
  end
end
```


コメントで各attributeにアクセスできるように、以下のモジュールを作成します。

```ruby:app/models/concerns/comment_attribute.rb
module CommentAttribute
  extend ActiveSupport::Concern

  def [](comment)
    attr_name = comment_to_attr_name(comment) || comment
    super(attr_name)
  end

  def []=(comment, value)
    attr_name = comment_to_attr_name(comment) || comment
    super(attr_name, value)
  end

  def comment_to_attr_name(comment)
    self.class.columns.find{|r| r.comment == comment }&.name
  end
end
```

Rails5から導入されたApplicationRecordにモジュールをincludします。

```diff:app/models/application_record.rb
class ApplicationRecord < ActiveRecord::Base
+  include CommentAttribute
  self.abstract_class = true
end

```

これだけで、

```ruby
user = User.new(first_name: "のび太", last_name: "野比")

#　read
user["姓"] #=> "野比"
user["名"] #=> "のび太"

#　write
user["名"] = "しずか"

```

簡単に日本語カラム名が使えるようになりました。

2018/05/04追記
よくつかうんでgem作ってみた。始めてのgem作成でしたがとりあえずリリースできたのでよかったら使ってください。
[https://github.com/nizoraul/comment_attribute](https://github.com/nizoraul/comment_attribute)
Visual Studio 2017 Visual C++ による IDispatch インターフェースの使用例

#はじめに
COM の要件は IUnknown インターフェースを実装していることです。しかし、要件ではないですが、IDispatch インターフェースを実装するのが一般的です。

これは何かといえば、Java や C# の「リフレクション」のような機能を実現するためのインターフェースです。IDispatch が実装されていると、Invoke メソッドを使って COM オブジェクトのプロパティやメソッドを利用できます。

#IDispatch の使用手順
- TLB をインポートしてオブジェクトの諸元を得る。
- COM を初期化して使用可能にする。
- COM オブジェクトを作成する。
- IDispatch を実装しているか調べる。
- Invoke メソッドに渡すためのパラメータを作成する。
- Invoke メソッドを呼び出す。

#サンプル
前述の手順をコードとして記述したサンプルを示します。

実はこのサンプルですが、完全ではありません。Invoke メソッドのパラメータとして SAFEARRAY を渡す必要があるのですが、それの作り方がよくわからず途中で頓挫してしまいました。

SAFEARRAY を作るための API 関数を使うといくらか楽になるようです。(SafeArrayCreate)

```C++
// CheckDualInterface.cpp : アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"
#import "C:\lib\AxStrFuncs.tlb" named_guids no_namespace

void CreateParams(VARIANTARG *sarr, LPCTSTR str, short n, BSTR ret);

//
//  IDispatch を実装した COM オブジェクトの使用法
//  ==============================================
int main()
{
	IUnknown *punk;
	IDispatch *pdisp;
	DISPID dispid;
	OLECHAR *pName;  // OLECHAR は WCHAR の別名
	VARIANTARG arg1[3];
	DISPPARAMS dispparams;

	// 開始メッセージ表示
	printf_s("Check IDispatch installed.\n");

	// COM 初期化
	HRESULT hr = OleInitialize(NULL);  // 内部的に ComInitializeEx を呼び出している。
	if (FAILED(hr))
	{
		printf_s("Failed to initialize COM.\n");
		return -1;
	}

	// オブジェクトを作成する。
	hr = CoCreateInstance(__uuidof(StrFuncObject), NULL, CLSCTX_SERVER, IID_IUnknown, (void**)&punk);
	if (FAILED(hr))
	{
		printf_s("Failed to create the object.\n");
		return -1;
	}

	// IDispatch を実装しているか調べる。
	hr = punk->QueryInterface(IID_IDispatch, (void**)&pdisp);
	if (FAILED(hr))
	{
		printf_s("IDispatch is not suppored.\n");
		return -1;
	}

	// オブジェクトのメソッド Right の　DISPID を得る。
	CComBSTR right(L"Right");
	pName = right;
	hr = pdisp->GetIDsOfNames(IID_NULL, &pName, 1, LOCALE_USER_DEFAULT, &dispid);
	if (FAILED(hr))
	{
		printf_s("IDispatch is not suppored.\n");
		return -1;
	}
	else
	{
		printf_s("Right Disp ID = %d\n", dispid);
	}

	// Right メソッドのパラメータを作成する。
	BSTR bstr = SysAllocString(L"");
	CreateParams(arg1, L"ABCDEFGH", 3, bstr);
	// SAFEARRAY でないと NG
	// dispparams.rgvarg->parray = arg1;
	dispparams.rgvarg->vt = VT_ARRAY;
	dispparams.cArgs = 2;
	dispparams.cNamedArgs = NULL;
	dispparams.rgdispidNamedArgs = NULL;
	VARIANT vResult;  // 戻り値
	vResult.vt = VT_BSTR | VT_BYREF;
	vResult.pbstrVal = &bstr;

	// Invoke メソッドを使って COM オブジェクトの Right メソッドを実行する。
	hr = pdisp->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &dispparams, &vResult, NULL, NULL);
	if (FAILED(hr))
	{
		printf_s("Invoke method has failed.\n");
		return -1;
	}
	else
	{
		wprintf_s(L"%s\n", bstr);
	}

	// 終わり
	printf_s("Done.\n");
	
	SysFreeString(bstr);
	getchar();
    return 0;
}

//
//  パラメータを作成する。
//  =====================
void CreateParams(VARIANTARG *sarr, LPCTSTR str, short n, BSTR ret)
{
	VARIANT *p1, *p2, *p3;
	p1 = sarr;
	p1->vt = VT_BSTR;
	p1->bstrVal = CComBSTR(str);
	p2 = sarr + 1;
	p2->vt = VT_I2;
	p2->iVal = n;
	p3 = sarr + 2;
	p3->vt = VT_BSTR;
	p3->bstrVal = ret;
}
```
ファイヤーウォールメモ

家の CentOS がなぜかポート許可が消えてたので再設定しました。

コマンド忘れそうなのでメモしておきます。基本的に過去のブログからコピペです。

---

/sbin/iptables っていうのがファイアーウォール管理の一般的なツールなようです。

ルート権限になって

/sbin/iptables -L

と打ち込むと現在の許可ポート一覧（ルールというらしい）が表示されます。

ポート番号がなくて見づらかったら

/sbin/iptables -L -n

とするとポート番号が出てみやすかったです。
で、ルールを追加する場合、例えばhttpのポート80を外部からアクセス許可したいと思ったら以下のコマンドを打ち込みます。

/sbin/iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT

長いっすね。　意味はよくわかりませんが、/etc/sysconfig/iptables のあたりに書かれていたのを参考にしてみました。

打ち込んだら、iptables にルールが追加されて保持されました。　しかし、まだファイルに保存はされていないので保存を行います。

/etc/init.d/iptables save

なぜか実行するファイルが違います。
この時点でルール一覧を

/sbin/iptables -L -n

などで確認すると追加されていることが分かります。あとは

cat /etc/sysconfig/iptables 

で、ファイルに保存されていることも確認するとベターらしいです。

最後に iptables サービスを再起動します。

/sbin/service iptables restart

これでポート80が許可されました。


応用で、

/sbin/iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 1192 -j ACCEPT

とポート番号を「1192」とかにすると独自プログラムの許可ポートを開けることができます。
基本標準プロトコルにはデフォルトのポートが決まっているので注意が必要ですね。


こう見ると簡単なんですが、意外と手間取るんですよねぇ。ちなみに許可ポートは受け側でポートを開いたプロセスが動いてないとアクセス弾かれるみたいです。ダミーのプログラムとか作ってポートアクセスを受付つつ、コマンドプロンプトから

telnet 192.168.1.20 1192

みたいにポートが開いてるかチェックをして通れば成功です。


っていうかうちのPC(Vista 以降)はコマンドプロンプトに telnet がないんですが……。

そういう場合は teraterm とかでポート番号を指定するしかないみたいですね……。

---

CentOSのバージョンあがったので少し文修正しました。あと Telnet は Cygwin 使いました。
機械学習スタートアップシリーズ『これならわかる深層学習入門』の学習　第３章　ニューラルネット

『<a target="_blank" href="https://www.amazon.co.jp/gp/product/4061538284/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4061538284&linkCode=as2&tag=aokikenichi-22&linkId=49ba4aca1a7f7707948c71fb2d01f4e0">機械学習スタートアップシリーズ これならわかる深層学習入門 (KS情報科学専門書)</a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=aokikenichi-22&l=am2&o=9&a=4061538284" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />』
<a target="_blank"  href="https://www.amazon.co.jp/gp/product/4061538284/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4061538284&linkCode=as2&tag=aokikenichi-22&linkId=90d53586e7963a353581d0a1298fed72"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=4061538284&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL160_&tag=aokikenichi-22" ></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=aokikenichi-22&l=am2&o=9&a=4061538284" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />


# 3.1 神経細胞のネットワーク
+ チューリング「人工に脳を作れんじゃね」
+ マカロック、ピッツ「人工ニューロンで論理回路が作れる」
+ ローゼンブラット「自ら学習させたらいいんじゃね」
+ ミンスキー「入力層と出力層だけじゃ難しいの解けねーww」

# 3.2 形式ニューロン

# 3.3 パーセプトロン
+ 演習3.1

ReLUの関数に値を代入

|(x_1, x_2)|(0, 0)|(1, 0)|(0, 1)|(1, 1)|
|:--:|:--:|:--:|:--:|:--:|
|(z_1, z_2)|(0, 0)|(1, 0)|(0, 1)|(0, 0)|
|y|0|1|1|0|

階段関数でXOR

```math
z_1=(x_1-2x_2-\frac{1}{2}), z_2=(-2x_1+x_2-\frac{1}{2}) \\
y=\theta(z_1+z_2-\frac{1}{2})
```

|(x_1, x_2)|(0, 0)|(1, 0)|(0, 1)|(1, 1)|
|:--:|:--:|:--:|:--:|:--:|
|(z_1, z_2)|(0, 0)|(1, 0)|(0, 1)|(0, 0)|
|y|0|1|1|0|

# 3.4 順伝播型ニューラルネットワークの構造
+ (3.34)
(2.29)より、

```math
\begin{align}
E({\bf w})&=-\sum_{n=1}^N{(y_n\log{y({\bf x}_n;{\bf w})+(1-y_n)\log{(1-y({\bf x}_n;{\bf w})))}}} \\
y_n&=\sum_{k=1}^K{t_{n,k}} より、 \\
E({\bf \theta})&=-\sum_{n=1}^N\sum_{k=1}^K{t_{n,k}\log{y_k({\bf x}_n;{\bf \theta})}}
\end{align}
```
Railsでwebpush(vapid)しようと思ったら、"Unauthorized"エラーが出た話

Railsでwebpush通知をしたかったので、この記事（[Rails4におけるブラウザプッシュ通知(Web Push Notifications)実装](https://qiita.com/shimx/items/d23bb45b34c89f879db3#_reference-cdab62dd5ceb1be2cde0)）が超分かりやすいんで、参考に作っていたら....

Chromeでこういうエラーが出て、なかなか通知することができませんでした。
`#<Net::HTTPBadRequest 400 UnauthorizedRegistration readbody=true>`

調べてもいまいち原因がわからなかったので、Firefoxでも試してみると相変わらずエラー:cry:

```
{"code":401,"errno":109,"error":"Unauthorized","more_info":"http://autopush.readthedocs.io/en/latest/http.html#error-codes", "message": "Request did not validate Invalid bearer token: Auth > 24 hours in the future"}
```

Chromeで試したよりエラーが詳しかったのでぐぐってみると、どうやらexpiresionを設定しなければ駄目なそうです。[参考記事](https://stackoverflow.com/questions/43632403/web-push-with-vapid-400-401-unauthorized-registration)

```rb
Webpush.payload_send(
  message: payload,
  endpoint: endpoint,
  p256dh: p256dh,
  auth: auth,
  vapid: {
    subject: "mailto:sender@example.com",
    public_key: '...',
    private_key: '...',
    expiration: 12 * 60 * 60 #これ
  }
end
```

``expiration``を設定するとChromeでもFirefoxでも無事通知することができました。

他にも悩んでいる方の解決の糸口になれば幸いです:smile:
SafariでAlexa Skill作成画面の「聴く」ボタンが無反応な場合の対処法

## 症状

Alexa Skillの作成画面では、「ボイスシミュレーター」や「サービスシミュレーター」を使って発声を確認できます。しかし、「聴く」というボタンをクリックしても全く反応がないことがあります。

![servicerequest](https://qiita-image-store.s3.amazonaws.com/0/10290/da5e3bf2-b36e-9c28-26e7-dd4684b98a17.png)

## 原因

Safari 11.0で、音声付き動画の自動再生ポリシーが変更されたことによる影響です。

参考: [Safari, Chromeの自動再生ポリシー変更のまとめ](https://qiita.com/ktknest/items/e81b3a4caac540098fc8)

ちなみに、[Amazon Music](https://music.amazon.co.jp/home)をブラウザで再生できないのも、同じ原因です。

## 対処

メニューで`Safari`->`環境設定...`を選択して、環境設定ダイアログを開きます。

上に横に並んでいるアイコンの中から`Webサイト`を選択して、左に縦に並んでいるアイコンの中から`自動再生`を選択します。

![before](https://qiita-image-store.s3.amazonaws.com/0/10290/ee91ecd5-f94b-a6f2-5cc5-602f4edc481c.png)

この画面で、開いているサイトと、デフォルトの自動再生設定を変更できます。現在は、全て`サウンド付きメディアは再生しない`となっています。

![change](https://qiita-image-store.s3.amazonaws.com/0/10290/8939b6e9-55ab-cb34-07c2-f543bd7bc9d2.png)

`developer.amazon.com`の設定を`すべてのメディアを自動再生`に変更します。

![after](https://qiita-image-store.s3.amazonaws.com/0/10290/05b7ac12-67f4-0eab-fe1a-93734f39592d.png)

これで、「聴く」ボタンを押すと、Alexaの声が聞こえるようになるはずです。
GitHubのPull RequestをチェックアウトするGitのalias

普通にかくとサブコマンドとして解釈されてしまうが`!`を使うとふつうの外部コマンドが書けてべんり[^subcommand]

> However, maybe you want to run an external command, rather than a Git subcommand. In that case, you start the command with a ! character. 
https://git-scm.com/book/tr/v2/Git-Basics-Git-Aliases

```~/.gitconfig
[alias]
  gh = ! sh -c 'git fetch origin pull/$1/head:GH-$1 && git checkout GH-$1' --
```

[^subcommand]: この例で`!`抜かすと`git-sh`コマンドが実行されてしまう
入社1週間で放り込まれた僕の現場

プログラミングの勉強法はがわからないため、勉強方法を御教授ください。

私は2017年9月に中小ITに新卒で就職しました。
会社の新入社員教育がほとんどありませんでした。
右も左も分からないまま、入社1週間ほどで先輩社員が所属している客先で頑張ってくれということでした。
もちろん、先輩からは基本的なことを指導していただけることもありません。

JavaとSQLを使うところまではわかりました。

そのため、現在までに以下の参考書、サイトで学習しました。

1.スッキリわかるJava 第2版
2.Progate Javaコース

現在勉強中、今後勉強予定の参考書
1.Java 第2版実践編アプリケーション作りの基本
2.リーダブルコード
3.なぜ、あなたはJavaでオブジェクト指向開発ができないのか

SQLの勉強方法がわからなく四苦八苦しているところです。何か良い勉強方法がありましたら教えていただきたいです。