OmniAICreator/Qiita-1.07M huggingface dataset:
ROSのRGBDTAMを動かしてみた。

###目的
　ROSのRGBD-SLAMパッケージRGBDTAMを動かしてみた。
　RGBDTAMは、CPUでリアルタイムで動作する、LowCostなSLAMパッケージ、とのこと。

　github:https://github.com/alejocb/rgbdtam
　Publication:RGBDTAM: [A cost-effective and accurate RGBD Tracking and Mapping System](https://arxiv.org/pdf/1703.00754.pdf)

###環境
Ubuntu:14.04 x64
ROS:indigo

(ROS:Kinetic branchあるが、私の環境で動作せず https://github.com/alejocb/rgbdtam/pull/7)


###PCL1.7.2のインストール
ROS indigoはPCL1.7.1なのでPCL1.7.2以上にする必要がある。

```
sudo add-apt-repository ppa:v-launchpad-jochen-sprickerhof-de/pcl
sudo apt-get update
sudo apt-get dist-upgrade
```

###必要なライブラリをインストールする。

```
 sudo apt-get install libboost-all-dev 
 sudo apt-get install libsuitesparse-dev
 sudo apt-get install libblas-dev
 sudo apt-get install liblapack-dev
 sudo apt-get install libeigen3-dev  
```

###catkin_rgbdtamのインストール

```
$  mkdir ~/catkin_rgbdtam/src -p
$  cd ~/catkin_rgbdtam/src/
$  git clone https://github.com/alejocb/rgbdtam.git
$  cd rgbdtam/
$  chmod +x build_thirdparty.sh 
$  ./build_thirdparty.sh 
$  cd ..
$  catkin_make rgbdtam -j3
```

###設定ファイルのインストール

https://github.com/raulmur/ORB_SLAM/tree/master/Data
からORBvoc.txt.tar.gzをダウンロード
~/catkin_rgbdtam/src/rgbdtam/ThirdParty/DBoW2に設置する。

```
$ cd ~/catkin_rgbdtam/src/rgbdtam/ThirdParty/DBoW2
$ tar xvfz ORBvoc.txt.tar.gz

```

###データセットの準備

```
cd ~/catkin_rgbdtam/
wget http://vision.in.tum.de/rgbd/dataset/freiburg3/rgbd_dataset_freiburg3_long_office_household.bag
rosbag filter rgbd_dataset_freiburg3_long_office_household.bag new_office_household.bag "topic=='/camera/rgb/image_color' or topic == '/camera/depth/image'"
```

###サンプルの実行

roscore実行の上、コンソールを3つ立ち上げ、rgbdtamを実行。

```
rosbag play new_office_household.bag
rosrun rgbdtam rgbdtam
rosrun image_view image_view image:=/rgbdtam/camera/image
```

![test.png](https://qiita-image-store.s3.amazonaws.com/0/73020/a11d2714-835d-b8f6-b04a-e6374e320154.png)

###KinectV1で実行

freenectのインストール

```
sudo apt-get install ros-indigo-freenect-launch 
```

コンソールを3つ立ち上げ、rgbdtamを実行。

```
roslaunch freenect_launch freenect.launch 
rosrun rgbdtam rgbdtam
rosrun image_view image_view image:=/rgbdtam/camera/image
```
[Unity]パーティクルの設定

# パーティクルの設置
HierarchyビューのCreateからParticle Systemを選択。

# 基本的な設定
|パラメータ|効果|
|:--|:--|
|Start Lifetime|パーティクルが発生してからの時間|
|Start Speed|初速|
|Start Color|最初の色|
Start Colorの矢印を選択->RandomColorを選択->色のバーを選択する
そして、下の画面のようにすると
<img width="358" alt="スクリーンショット 2017-06-09 3.28.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/179037/fd5d05d5-f2bd-b438-ddd2-5cd7c932e448.png">
こんな感じに様々な色が出てくる
<img width="274" alt="スクリーンショット 2017-06-09 3.31.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/179037/909c71be-dd74-704f-e127-66a1fd794b6f.png">


# Emission
|パラメータ|効果|
|:--|:--|
|Rate over Time|1秒あたりの発生数|

# Shape
|パラメータ|効果|
|:--|:--|
|Shape|パーティクルを放出する時の形|

# Color over Time
|パラメータ|効果|
|:--|:--|
|Color|出始めと終わりの透明度を設定|

|適用前|適用後|
|:--:|:--:|
|<img width="230" alt="スクリーンショット 2017-06-09 3.47.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/179037/977a9d65-5a21-98d5-511d-eb17f0c5ec40.png">|<img width="219" alt="スクリーンショット 2017-06-09 3.47.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/179037/0fa6f463-e5ad-4e8a-7485-1ae80a9139c9.png">|

# Render
|パラメータ|効果|
|:--|:--|
|Render Mode|どんな画像のレンダリングをしめす|
<img width="248" alt="スクリーンショット 2017-06-09 3.59.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/179037/55593b94-ab11-5375-e8c7-ca31594ade82.png">
上のようにするとパーティクルの形がCubeになる
AMPとgulp-sassでハマるから気をつけろ

## TL; DR
- AMPページ内では`@charset "UTF-8";`がエラーになる
- `gulp-sass` は、コンパイルするファイル内にマルチバイト文字が存在すると `@charset "UTF-8";` を自動で出力する
- コメントに日本語とか入れないように気をつけよう

## やりたかったこと

WebサービスのCSSコンパイル周りが老朽化していたので、イイ感じにしようとした。

これまでは、`Sass(Ruby製) & Compass(Ruby製)` で吐き出したものを使っていて、

- Rubyに依存している
- コンパイルが重い
- Compassが不要になったベンダープレフィックス付きのスタイルシートを吐き出す
- Compassが開発終了しているのに使っている

みたいなところに問題を感じていたので、
以下の3つをやって、先ほど述べた問題を解決しようとした。

- Compassをやめる
- Sass(Ruby製) から Sass(Node製) に乗り換える
- Autoprefixer と PostCSS を導入して、適切なベンダープレフィックスだけを付与する

## 躓き

一通り移行作業は完了していたが、最後でAMPページのテストが転けていることに気がついた。
(ちなみにテストは [amphtml-validator](https://www.npmjs.com/package/amphtml-validator) を使って書いている)

テストが転けたところを見ると `'CSS syntax error in tag \'style amp-custom\' - saw invalid at rule \'@charset\'.'` とのことである。
どうやら、「AMPページの中では `@charaset` は使えないよ。」 と言っているらしい。

コンパイルされた CSS を見ると、たしかに `@charset "UTF-8";` が出力されている。
しかし、元の `.scss` ファイル内では、一切 `@charaset` の指定を行っていない。
そもそも、Compassでコンパイルしていたときはエラーは起きていなかった。

「なぜ？どこで？ `@charaset` が挿入されたの？」となった。

## 原因

結果、

> `gulp-sass` は、コンパイルするファイル内にマルチバイト文字が存在すると `@charset "UTF-8";` を自動で出力する

という問題があり、これが原因だった。

たしかに、日本語でコメントが書かれていた。

# 対処

```sample.scss
/* amp の専用タグに対応させるもの用 */
```

となっていたところを

```sample.scss
/* for amp tags */
```

に変えたところ、テストが成功した。

## 雑感

自動で挿入とかマジでやめてくれ。
Autoprefixerを疑って時間が溶けたしつらいし、おうちかえる。
[Unity]Post Processingを使ってみた

# Depth of Field
|適用前|適用後|
|:--:|:--:|
|<img width="918" alt="スクリーンショット 2017-06-09 1.29.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/179037/b3fd6372-53a4-339c-793f-6d5e435f2908.png">|<img width="921" alt="スクリーンショット 2017-06-09 1.28.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/179037/53f57c7b-13de-555b-9009-eb3db15fdfd7.png">|

## ぼかし機能

|パラメータ|役割|
|:--|:--|
|Focus Distance|ピントの距離。値が小さいと手前、大きいと奥にピントが合う。|
|Aperture(f-stop)|f値のこと。1.0くらいに設定しておく。|
# Bloom
|適用前|適用後|
|:--:|:--:|
|<img width="743" alt="スクリーンショット 2017-06-09 1.36.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/179037/b14778a0-ff32-0391-c607-a233d28b571f.png">|<img width="742" alt="スクリーンショット 2017-06-09 1.36.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/179037/bf7801c5-ace0-f0a3-3cb4-fe829b89bb4f.png">|

## 光を散乱させる

|パラメータ|役割|
|:--|:--|
|Intensity|明るさ。値が大きいほど明るくなる。|
|Threshold|一定の光の強さを光らせる。|
|Soft Knee|Thresholdで光らせる時に、滑らかに光らせる。|
|Radius|光の半径。最大に設定しておく。->基本的にIntensityで調節する。|
|AntiFlicker|小さなBloomを反応しないようにする。|
# Ambient Occlusion
|適用前|適用後|
|:--:|:--:|
|<img width="918" alt="スクリーンショット 2017-06-09 1.10.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/179037/823a1cdf-fa41-f775-3b87-b68757a43dc3.png">|<img width="921" alt="スクリーンショット 2017-06-09 1.10.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/179037/f8a01502-f1ca-f2d4-983c-2611a66ea4bb.png">|

## 明暗をはっきりさせる,影を作る

|パラメータ|役割|
|:--|:--|
|Radius|Ambient Occlusionのサーチ半径。低めに設定。|
|SampleCount|Lowestに設定|
|Downsampling|onに設定|
|Ambient Only|Deferred及びHDRのみ使用可能。できるだけonにする。|

# Vignette
|適用前|適用後|
|:--:|:--:|
|<img width="742" alt="スクリーンショット 2017-06-09 1.41.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/179037/6f34cbb5-bfd7-b33b-9eeb-e6d85dfcdcbc.png">|<img width="744" alt="スクリーンショット 2017-06-09 1.42.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/179037/5d2a98f9-c6b0-1bfd-893d-090b19e995df.png">|
## 周りの色をかえる

|パラメータ|役割|
|:--|:--|
|Intensity|色の範囲|
|Smoothness|境目のぼかし加減|
|Roundness|縁の形|

# 参考
###使用したAsset
Ultimate Fantasy Creator LITE
###参考動画
https://www.youtube.com/watch?v=r5mNmH68KPQ&feature=youtu.be
Module not found: Error: Can't resolve 'url-loader' in が出た場合

下記のようなエラーが出た場合

```
ERROR in ./~/css-loader!./src/app/css/bootstrap.min.css
Module not found: Error: Can't resolve 'url-loader' in '/Applications/MAMP/htdocs/angular2-seed'
 @ ./~/css-loader!./src/app/css/bootstrap.min.css 6:3278-3330 6:3348-3400
 @ ./src/app/css/bootstrap.min.css
 @ ./src/app/home/home.component.ts
 @ ./src/app/app.module.ts
 @ ./src/main.browser.ts

```

```
$ npm install url-loader --save-dev
```
MacでUnityを二つ以上開く裏技

はい！
どうも！
こんにちは！
 TOSHです！！！

今回は前回に引き続きTerminalを使っていきたいと思います。

Macユーザーの皆さん、Unityを二つ以上開きたいと思ったことはありませんか？

Windowsの人たちはデフォルトでできるようなのですが、Macは残念なことにできません。

##ですが
##MacでもUnityを二つ以上開ける裏技があります。
##それがTerminalのopenコマンドを使う方法です

1. まずはTerminalを開いてください、

2. そして、下のように打ち込んでください
 $ open -n /Applications/Unity/Unity.app/
最後の.appと/は忘れがちなので忘れないようにしてくださいね！

3. 新しい、Unityが立ち上がります

それでは、コマンドの説明をしていきます。
open : いまずもがな〜を開けという命令コマンドです
-n : nはnewの頭文字です。これのおかげで、既存の他に新しいUnityを開くことができます
/Applications/Unity/Unity.app/ : Applicationの中にある、Unityというファイルの中にあるUnity.appと指定をしています（ギャグじゃありませんからね笑)

はい、これだけです。とてもシンプルですね、これは非常に役立つのでぜひとも試して見てくださいね。

ただ、Unityは軽いアプリではないので立ち上げすぎには要注意です！

以上TOSHでした！
Unityのアニメーター・コントローラーはどこまでC#スクリプトで作成できるかやってみた

Qiitaには画像のアップロード容量上限があるようなので、古い記事を全て再構成して圧縮を計っている。

----

前回の記事：http://qiita.com/muzudho1/items/85cd11ba0c7b1b7d496d

# Unityのアニメーター・コントローラーはどこまでC#スクリプトで作成できるかやってみた

まず、この記事では　何ができたかを並べてみる。

ソースを説明するドキュメントを書くのが大変なので　放置になっているがソースは Git Hub に置いてある。C#スクリプトの参考にはなるだろう。

「StellaQL」
https://github.com/muzudho/StellaQL

# ステート関連

## ステートの作成と削除
![201701291517gif44.gif](https://qiita-image-store.s3.amazonaws.com/0/159417/4344cc13-eac0-d9d1-fe16-4da7f6bd5b35.gif)

## ステートのプロパティ変更
![201701272205gif40.gif](https://qiita-image-store.s3.amazonaws.com/0/159417/f4f06f4b-4a27-b353-4ab9-81680b509951.gif)
（Inspectorビューに注目。ステート名と Tag を変更している）

## ステートのプロパティ一覧出力
![201701272205gif41d.gif](https://qiita-image-store.s3.amazonaws.com/0/159417/0dd78439-f6e7-e29d-15dd-54e69c084073.gif)
設定ミスを探すときに役に立つんじゃないだろうか？


# トランジション関連

## トランジション追加
![201701272205gif35.gif](https://qiita-image-store.s3.amazonaws.com/0/159417/755972a6-71e9-d0c4-9ca2-88f85e6f7da4.gif)

## 正規表現でトランジション追加
![201701272205gif36.gif](https://qiita-image-store.s3.amazonaws.com/0/159417/27b6d129-a51b-6a8e-99ab-173e54684e61.gif)

## 予め指定しておいた独自タグで条件指定してトランジション追加
![201701291517gif42.gif](https://qiita-image-store.s3.amazonaws.com/0/159417/731bf295-07c3-ca6d-9cf6-f8dc17386d82.gif)

## トランジションのプロパティ変更
![201701272205gif38.gif](https://qiita-image-store.s3.amazonaws.com/0/159417/04397eca-0453-b399-d519-14f36ebf5246.gif)
（Inspectorビューに注目。 name を変更している）

# その他

## コマンド一覧
![201701291517gif43c.gif](https://qiita-image-store.s3.amazonaws.com/0/159417/3e211f75-08aa-f69c-57b7-7c7054e73b12.gif)



// 書きかけ
Vagrantのyumでハマった。

Windows環境でVagrantをイントールして動かしたところ、
yumができませんでした。

インストールからcentosへのログインまでは、
この記事を参照されせていただきました。
 [Windows上でVirtualBox+Vagrant+CentOSによる仮想環境構築](http://qiita.com/hiroyasu55/items/11a4c996b0c62450940f)

それでyumインストールしたところこんなエラーが。。

```
[root@localhost ~]# yum -y install httpd
Geladene Plugins: fastestmirror
base                                                                         | 3.6 kB  00:00:00
Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=extras&infra=stock error was
14: curl#52 - "Empty reply from server"
```
どうやらyumのリポジトリに記載されているURLがダメらしい。

/etc/yum.repos.d/CentOS-Base.repo の mirrorlistがダメらしい。
そこでmirrorlistをコメントアウトして、
baseurlのコメントアウトを外したらyumが実行できた。

```:Befor
[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
```

```:After
[base]
name=CentOS-$releasever - Base
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
```
郵便番号から住所を検索するAPIを作りました

> 2019/4/21追記
> zipcode_jpに機能追加したため、この記事の内容は古くなりました。
> 現在のzipcode_jpについては [zipcode_jp でいい感じの住所入力フォームが作れるようになりました](https://qiita.com/kmdsbng/items/9cbef35ea2e79a46d044) の記事を参照ください。


# 概要

プロダクトごとに分散してしまいがちな、郵便番号データベースの保守を楽にする仕組みを作ったので紹介します。

# 郵便番号検索にまつわる問題点

フォームの住所入力をサポートするために、郵便番号から住所を補完するコードを書くことがあると思います。
私も何度かこの処理を実装したことがあるのですが、そのたびに郵便番号から該当する住所を返すAPIを自前で実装しました。
ただ、プロダクト横断の仕組みとしてAPIを実装しなかったので、プロダクトごとにAPIの実装、ken-all.csv から住所データをDBにインポートするということを繰り返してきました。
このアプローチには保守の面で問題もあります。郵便番号データは郵便局が公開している郵便番号データ、いわゆるken-all.csvが元データになりますが、ken-all.csvからDBへのデータのインポートには手間がかかります。

データの更新に手間をかけないために、一般に公開されている郵便番号検索APIを利用する方法もあります。ただ、外部APIに依存してしまうことにはリスクも存在します。

* APIが提供されなくなる可能性
* APIの利用制限に引っかかって利用できなくなる可能性
* APIサーバが障害のために停止してしまう可能性

プロダクションコードだと、これらのリスクは導入への障壁になるでしょう。

これらの問題を解決するために、

* 再利用可能で
* 外部サービスに依存しない

郵便番号検索のAPIを作りました。APIは公開しているので、どなたでも自分のサーバで利用していただけます。

# プロジェクトページ

[zipcode_jp](https://github.com/kmdsbng/zipcode_jp)


# デモ

https://jsfiddle.net/kmdsbng/f18t60yj/12/
このページで、実際にGithub Pageで公開されている郵便番号検索APIを使った住所検索の挙動を確認できます。

# 機能

このAPIは、郵便番号をキーにして、郵便番号に一致する住所を返す機能のみ提供しています。
(2020/3追記: 現在は以下の機能も提供しています。

* 都道府県一覧取得機能
* 都道府県ごとの市区郡取得機能
* 市区郡ごとの町村取得機能
* 町村ごとの郵便番号取得機能
)

# 仕組み

APIと書きましたが、住所データのJSONファイルを docs/zip_code ディレクトリ以下に配置しているだけで、バックエンドアプリケーションは存在しません。
例えば `0010010` という郵便番号の住所データは、 https://kmdsbng.github.io/zipcode_jp/zip_code/001/0010010.json に格納されています。
該当する郵便番号が存在しなければ、404が帰ってくるので、郵便番号が存在しないことがわかります。

フロントエンドJavaScriptからアクセスするときにはSame origin policy制約を回避するため、APIサーバにアクセス用のJavaScriptファイル(/api.js)を置いています。
このファイルを script タグで読み込み、住所検索関数を呼び出すことで、フロントエンドJSから住所検索を行えます。詳しくはデモページのコードをご参照ください。

JSONファイルを郵便番号のファイル名に格納しているだけなので、JavaScript以外からも利用可能です。
サーバサイドのプログラムが無いため、処理が高速で設置も簡単というメリットがあります。

# 利用方法

[zipcode_jp](https://github.com/kmdsbng/zipcode_jp) を cloneしたり、forkしたりして、docsディレクトリ以下を公開してください。
zipcode_jpの Github page でも公開しているので、テスト用途やサンプルに使うなら、これを使ってもらうのがもっとも簡単です。実際デモページでは、zipcode_jpの Github pageからデータを読み込んでいます。
JavaScriptからのアクセス方法は、デモページのコードを参照してください。


# 保守

zipcode_jpの住所データは、[zipcloud様](http://zipcloud.ibsnet.co.jp/)が提供している x-ken-all.csv を元に作っています。
x-ken-all.csvが更新されると、CircleCIで自動検知して zipcode_jp のデータも自動で更新されるようにしています。

https://circleci.com/gh/kmdsbng/zipcode_jp

なので、clone/forkした住所データを更新するときは、単にリポジトリを `git pull` すれば、最新の住所データを利用できます。


# まとめ

zipcode_jpは、郵便番号検索にまつわるいろいろな問題を解決します。

* フロントエンドJavaScriptからもバックエンドアプリケーションからもスクリプトからも利用可能です。郵便番号をキーにしたJSONファイルのURLにアクセスすることで、住所検索します。
* 郵便番号データベースの保守コストを、ほぼゼロにします。
* 導入が簡単です。
* 自社サーバで運用可能です。

ぜひご利用ください。
ターミナルのsshコマンドについて

はい！　どうもこんにちは、TOSHです！

今回は、Macに標準でついているTerminalのsshコマンドについて説明したいと思います！

基本的にTerminalを標準で使う人はそんなに多くはないと思うのですが、プログラマーは結構使うタブとなっています。意外と便利なのでぜひ使って見てください。

そして、今回紹介するのはその中でも一層と便利なsshコマンドを紹介したいと思います。

sshコマンドは基本的にリモートログインなどを管理する際に用いられます。

1. 基本的にログインする際に、
$ ssh "ユーザー名"@"リモートログインする先のアドレス"
でリモートログインすることができます

2. この際に暗証番号が必要な場合は、鍵のマークが出て来て、パスコーどを打つこととなります。


また、GitHubとの連携をあらかじめMacで行なっていれば、
$ ssh guthub　を実行するとGitHubとの接続ができているかを確認してくれます。

![Screen Shot 2017-06-08 at 11.18.27 PM.png](https://qiita-image-store.s3.amazonaws.com/0/180994/3f2079a6-4f34-8bbf-f6ca-e779ec658ae1.png)

これをすると、GitHubにうまくデータを送れないときに、治る可能性があるのっで困った時はぜひとも試して見てください。

以上、TOSHでした！
Python vs Ruby 『ゼロから作るDeep Learning』 3章 3層ニューラルネットワークの実装

## 概要

書籍『ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装』3章のコードを参考に Python と Ruby で3層ニューラルネットワークを実装する。

計算処理では外部ライブラリを利用する。Python では NumPy を、Ruby では Numo::NArray を使用する。

環境構築が必要な場合はこちらを参照。
→ Python vs Ruby 『ゼロから作るDeep Learning』 1章 sin関数とcos関数のグラフ http://qiita.com/niwasawa/items/6d9aba43f3cdba5ca725

## 3層ニューラルネットワークの実装 (ソースコード)

### Python

```python
import numpy as np

# 重みとバイアスの初期化
def init_network():
  network = {}
  network['W1'] = np.array([[0.1, 0.3, 0.5], [0.2, 0.4, 0.6]])
  network['b1'] = np.array([0.1, 0.2, 0.3])
  network['W2'] = np.array([[0.1, 0.4], [0.2, 0.5], [0.3, 0.6]])
  network['b2'] = np.array([0.1, 0.2])
  network['W3'] = np.array([[0.1, 0.3], [0.2, 0.4]])
  network['b3'] = np.array([0.1, 0.2])
  return network

# 入力信号を出力へと変換
def forword(network, x):
  W1, W2, W3 = network['W1'], network['W2'], network['W3']
  b1, b2, b3 = network['b1'], network['b2'], network['b3']
  a1 = np.dot(x, W1) + b1
  z1 = sigmoid(a1)
  a2 = np.dot(z1, W2) + b2
  z2 = sigmoid(a2)
  a3 = np.dot(z2, W3) + b3
  y = identity_function(a3)
  return y

# 恒等関数
def identity_function(x):
  return x

# シグモイド関数
def sigmoid(x):
  return 1 / (1 + np.exp(-x))

# 実行
network = init_network()
x = np.array([1.0, 0.5]) # 入力層
y = forword(network, x)
print(y)
```

### Ruby

```ruby
require 'numo/narray'

# 重みとバイアスの初期化
def init_network()
  network = {}
  network['W1'] = Numo::DFloat[[0.1, 0.3, 0.5], [0.2, 0.4, 0.6]]
  network['b1'] = Numo::DFloat[0.1, 0.2, 0.3]
  network['W2'] = Numo::DFloat[[0.1, 0.4], [0.2, 0.5], [0.3, 0.6]]
  network['b2'] = Numo::DFloat[0.1, 0.2]
  network['W3'] = Numo::DFloat[[0.1, 0.3], [0.2, 0.4]]
  network['b3'] = Numo::DFloat[0.1, 0.2]
  network
end

# 入力信号を出力へと変換
def forword(network, x)
  w1 = network['W1']; w2 = network['W2']; w3 = network['W3']
  b1 = network['b1']; b2 = network['b2']; b3 = network['b3']
  a1 = x.dot(w1) + b1
  z1 = sigmoid(a1)
  a2 = z1.dot(w2) + b2
  z2 = sigmoid(a2)
  a3 = z2.dot(w3) + b3
  identity_function(a3)
end

# 恒等関数
def identity_function(x)
  x
end

# シグモイド関数
def sigmoid(x)
  1 / (1 + Numo::NMath.exp(-x)) # Numo::DFloat を返す
end

# 実行
network = init_network()
x = Numo::DFloat[1.0, 0.5] # 入力層
y = forword(network, x)
puts y.to_a.join(' ')
```

## 実行結果

### Python

```
[ 0.31682708  0.69627909]
```

### Ruby

```
0.3168270764110298 0.6962790898619668
```

## 参考資料

- Python vs Ruby 『ゼロから作るDeep Learning』 まとめ - Qiita http://qiita.com/niwasawa/items/b8191f13d6dafbc2fede
文章から人名のみ取り出す

文章から人名のみ取り出す方法です．

MeCabを使います．辞書はneologdを使用します．検索してインストールしてください．

```py3:human-name.py
# -*- coding:utf-8 -*-

import MeCab
# neologdを使用するための設定
m = MeCab.Tagger(' -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd')
human_name = []

def get_name(document):
    node = m.parseToNode(document).next
    while node:
        nodeFeature = node.feature.split(",")
        # 人名のみ取得(名詞,固有名詞,人名)
        if nodeFeature[0] == "名詞" and nodeFeature[1] == "固有名詞" and nodeFeature[2] == "人名":
            human_name.append(node.surface)
        node = node.next
    
    return human_name

if __name__=="__main__":
    get_name("俳優の田中哲司（51）が6月2日発売の『フライデー』（講談社）で女性との密会を報じられた問題で、田中が8日、所属事務所を通じコメントを発表。「私の軽率な行動でお騒がせしまして、関係者の皆様には大変ご迷惑をおかけしましたこと、誠に申し訳ございません」と報道について謝罪した。【写真】妻・仲間由紀恵、真っ赤な肩出しドレスを披露同誌では、田中が有名ヘアスタイリストの女性と数年前から深い仲にあるとして、田中が女性のマンションに向かう姿を写真とともに報道。文書では、報道について謝罪し、「家族には大変つらい思いをさせてしまい、今後このような思いをさせないと心から謝罪しました。皆様の信頼を回復するべく芝居に精進して参りますと共に心よりお詫び申し上げます」とコメントした。田中は2014年9月に女優の仲間由紀恵（37）と結婚している。")
    print(human_name)
```

```text:出力結果
['田中哲司', '田中', '仲間由紀恵', '田中', '田中', '田中', '仲間由紀恵']
```

リストで返ってくるので適当に処理して使ってください．
[python]randとrandnの出力の違い

参考：[ゼロから作るDeep Learning(p98 4.3.1)](https://www.amazon.co.jp/%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E4%BD%9C%E3%82%8BDeep-Learning-%E2%80%95Python%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%AE%E7%90%86%E8%AB%96%E3%81%A8%E5%AE%9F%E8%A3%85-%E6%96%8E%E8%97%A4-%E5%BA%B7%E6%AF%85/dp/4873117585)

randはシンプルに0~+1の範囲内でランダムな数値を出力（一様分布と言われる）する。
randnは標準正規分布（ガウス分布）でランダムな数値を出力する。
標準正規分布（ガウス分布）は、平均0, 標準偏差1の正規分布である。
つまり、平均が0になる範囲のランダムな数値を出力する。0に近い数値が出力されやすく、値が-1~+1の間に偏っている。

##出力を見てみる
6個数値を生成するぐらいだと差があまりわからない。
（randnだと-1.8とかも出力される。）

```tmp.py
import numpy as np

print("-----rand-----")
#print(np.random.rand(2,3))
print(np.random.rand(2,3).flatten().sum()/6)
print("-----randn-----")
#print(np.random.randn(2,3))
print(np.random.randn(2,3).flatten().sum()/6)
```

```
mbp-2:deep-learning-from-scratch-master shiraki$ python tmp.py
-----rand-----
[[ 0.93180533  0.57683396  0.61127319]
 [ 0.85445375  0.02708778  0.59547601]]
0.548895695538
-----randn-----
[[-0.26519086 -0.30503921  1.38052841]
 [ 0.78893855  1.17725959  1.80882169]]
0.31519809212

mbp-2:deep-learning-from-scratch-master shiraki$ python tmp.py
-----rand-----
[[ 0.60780629  0.20632273  0.29124602]
 [ 0.30784594  0.70772679  0.01821361]]
0.59935565743
-----randn-----
[[ 0.71569157 -0.52234049 -1.59936154]
 [-0.82040641 -1.40208476  0.89450808]]
0.669739423807

mbp-2:deep-learning-from-scratch-master shiraki$ python tmp.py
-----rand-----
[[ 0.490528    0.77907488  0.7239194 ]
 [ 0.85538536  0.92002825  0.67559426]]
0.495670703747
-----randn-----
[[-0.15695285 -0.34244922 -1.44827391]
 [-1.36062357 -0.49387177 -1.81863075]]
-0.431866047467

mbp-2:deep-learning-from-scratch-master shiraki$ python tmp.py
-----rand-----
[[ 0.84705902  0.58580408  0.31309435]
 [ 0.59569691  0.24460075  0.45989438]]
0.392091814221
-----randn-----
[[-0.35680625 -2.18199977  0.54243995]
 [-0.29317688 -0.43111914 -1.47586303]]
-0.0274650256491
```

しかし、1000個数値を生成すると差が顕著に出てくる。randnのほうは0に収束している。
randの平均が0.5に収束しているのは0~+1の間を平均的に生成するようにしているからだろう。平均0.5の正規分布のような傾向があるわけではない。

```tmp.py
import numpy as np

print("-----rand-----")
print(np.random.rand(1000).flatten().sum()/1000)
print("-----randn-----")
print(np.random.randn(1000).flatten().sum()/1000)
```

```
mbp-2:deep-learning-from-scratch-master shiraki$ python tmp.py
-----rand-----
0.496111761085
-----randn-----
0.0156004004458
mbp-2:deep-learning-from-scratch-master shiraki$ python tmp.py
-----rand-----
0.499698237009
-----randn-----
-0.00664557647709
mbp-2:deep-learning-from-scratch-master shiraki$ python tmp.py
-----rand-----
0.494677814946
-----randn-----
0.0301994725782
mbp-2:deep-learning-from-scratch-master shiraki$ python tmp.py
-----rand-----
0.515244265326
-----randn-----
-0.00605375728391
mbp-2:deep-learning-from-scratch-master shiraki$ python tmp.py
-----rand-----
0.500510191675
-----randn-----
0.00764750739818
```
ディスクフルを解消する


残念ながら、手元にディスクフルになった環境がないので、コマンドや手順だけを残す。

## ディスク容量を確認する
```コマンド
df -h
```

`-h`で、単位がつくので見やすくなります。

そして`Mounted on`にあるパスを見て、フォルダを絞り込んでいきます。
大概、ディスクフルを起きて困惑してこの記事を見たとすれば、`/`でディスクフルが起きたときだと思いますが。


## ディレクトリを絞り込んでいく
```コマンド
du -sh <ディレクトリパス>/*
```

`-s`は、サブフォルダを探索しないためのオプション。<ディレクトリパス>配下のファイルサイズを合計した結果のみを表示してくれます。
`-h`は、`du`と同じく、単位がつくようになります。

先に上げた`df`でディスクフルになっているディレクトリを指定します。
ただ、`/`だと時間がかかったり、`/proc`など不要なディレクトリまで見てしまうため、ファイルサイズが大きくなりやすいフォルダに絞って最初は見たりしています。
例えば、`/home``/usr``/var``/tmp`あたりから見ています。

以前私がDockerコンテナによるディスクフルに出くわしたときは、

1. `du -sh /var`
2. `du -sh /var/*`
3. `du -sh /var/lib/*`
4. `du -sh /var/lib/docker/*`

の順で絞り込んで行きました。

また、どのディレクトリにサイズが大きいファイルがあったのか分かれば、原因分析もできますよね。
先のDockerの例では、コンテナの内部で巨大な一時ファイルを、ホスト上にマウントしていないフォルダに作ってしまったためでした。

## 対処
まず第一に、いらないファイルは、消しましょう。
思い切りが大事です。

いるファイルばかりと思ったなら、少しでもいらないファイルにしましょう。

+ 取っておく必要があるようなファイルは、バックアップサーバや手元に移して消す
+ gzip圧縮して消す
+ 障害発生時に出た過去ログやコアダンプを消す
+ PostgreSQLなどミドルウェアが出力したバイナリファイルは、過去のアーカイブログ（実は消せる）だったりもするので、ネットで裏とりして消す

一時対処は上記の通り消すしかないですが、頻発するようなら消す以外の手を打ちましょう。

+ ディスクを増やす（再サイジング、金で解決）
+ 自動化して消す（ログローテートとかのことです）
+ 念のためのそのファイル、そもそもいらなくね、という議論を始める
elastic4sでembeddedでpluginを使う

elasticsearchを使ったアプリでテストを書くとき別にあげたelasticsearch使ってたんですが
組み込みの(embedded)使うと便利だよ！という話です

普通に使うだけならサンプル見ながらやればできたんですが
日本でelasticsearchを使う場合だいたいkuromojiとかのpluginを使うと思います。

path.plugins指定すればできるという記事を見つけて試してみたんですが、最新(5.x)のelasticsearchだとエラーになりました。。

```
Cause: java.lang.IllegalArgumentException: unknown setting [path.plugins] please check that any required plugins are installed, or check the breaking changes documentation for removed settings
```

どうやらpath.pluginsはなくなったようです。
https://www.elastic.co/guide/en/elasticsearch/reference/current/zip-targz.html#zip-targz-layout

pluginsのDefault Locationが$ES_HOME/pluginsということなので素直にそこにおきましょう。

```
  val clusterName = "artists"
  val homePath = "./home"

  val settings =  Map(
    "cluster.name" -> clusterName,
    "path.home" -> homePath,
    "path.repo" -> Paths.get(homePath).resolve("repo").toString,
    "path.data" -> Paths.get(homePath).resolve("data").toString
  )

val localNode = LocalNode(settings)
```

ここでHOMEを./homeにしたので./home/pluginsの下にkuromojiを保存する必要があります。

次にmappingの準備です。
kuromojiのTokenizerはデフォルトでないので[この辺りのコード](https://github.com/sksamuel/elastic4s/blob/master/elastic4s-core/src/main/scala/com/sksamuel/elastic4s/analyzers/Tokenizer.scala)をみながら作ってみます。

```
case object KuromojiTokenizer extends Tokenizer("kuromoji_tokenizer")

case class KuromojiTokenizer(override val name: String) extends CustomizedTokenizer(name) {
 override def build(source: XContentBuilder): Unit = {
   source.field("type", "kuromoji_tokenizer")
 }
}
```


という訳でmappingはこのようになります

```
  client.execute {
    createIndex("bands").mappings(
      mapping("artist") as(
        textField("name"),
        textField("description") analyzer "my_analyzer"
      )
  )
  .analysis(
    CustomAnalyzerDefinition(
      "my_analyzer",
      KuromojiTokenizer
    )
  )
}.await

```

あとは適当なデータを突っ込んでみて

```
 client.execute {
    indexInto("bands" / "artists") doc Artist("山田太郎", "東京で活躍していたアーティストです") refresh(RefreshPolicy.IMMEDIATE)
  }.await
```

queryを投げてみます

```
  val resp = client.execute {
    search("bands" / "artists") query termQuery("description", "東京")
  }.await
```

完成品は[こちら](https://github.com/tky/elasticsearch-experiments)になります
入れ子区間モデルという幻想

珍しく、C++とは関係のない記事です。
RDBの話ですがSQL文は出てきません。

#入れ子区間モデル

RDBで階層構造を表すために、入れ子集合モデルというものがあります。
テーブルに整数で範囲を示す値を入れて、子階層を親階層の内側に追加していくことで、一括してデータを取ってこれるようにしようという考え方です。
で、その整数を実数に拡張したものを入れ子区間モデルと呼ぶらしいです。
詳しくはググってください。ただし、ググって出てきた記事を鵜呑みにしてはいけません。

#何が問題なの？

入れ子区間モデルという考え方は、そう悪いものではありません。ただし、それは無限精度の実数（厳密には有理数）を扱えるなら、という前提があって初めて成り立ちます。
少なくとも、MySQLでは無限精度実数を扱えません（プログラミング言語で実装されたものをバイナリシリアライズして値に持たせることはできますが）そして、たかだか64bitしかないMySQLのREAL型は、入れ子区間モデルの考え方に従って分割していくと、あっという間に枯渇します。
具体的に考えてみましょう

MySQLのREAL型は、IEEE 754 binary64の浮動小数点型です。C/C++のdouble型なんかは大抵これと同じ形式です。規格で定められているわけではありませんが。

```text:binary64
+------+--------+--------+
| sign |exponent|flaction|
|(1bit)|(11bit) |(52bit) |
+------+--------+--------|
```

一々こんな図を書くのは面倒なので、こんな感じで16進表現しようと思います。

```
S: 0 or 1
O: 0 ~ 7
X: 0 ~ F (16進)

S|OXX|X:XXXX:XXXX:XXXX
^  ^         ^
|  |         |
|  |       仮数部(:はただの桁区切り)
| 指数部
符号
```

例えば、0はこうなります。

```
0|000|0:0000:0000:0000
```

指数部と仮数部が最大の数が最大になるので、

```
0|7FE|F:FFFF:FFFF:FFFF
```

これが最大の浮動小数点数になります。(指数部が7FFの時はInfかNaNを表す）
これをmaxとしましょう。実際の値は、

max = 1.7976931348623157e+308

になります。

0.0~max を初期範囲として、入れ子区間モデルを考えてみます。実際は、初期範囲をどこにとっても、問題は変わりません。

一つ目のノードを挿入する時、区間の左端と右端の値をそれぞれleft, rightとすると、

left = max / 3
right = max / 1.5

となります。
実際の値とそれを表現した16進表現は

left = 5.992310449541053e+307

```
0|7FD|5:5555:5555:5555:5555
```

right = 1.1984620899082105e+308

```
0|7FE|5:5555:5555:5555:5555
```

となります。


おわかりいただけただろうか……
この時点で、上位12bit分がほぼ使えなくなっています。
0~maxの中間をとったと思ったら、52bit分の領域しか残っていませんでした、という状態です。

ちなみに、rightより上の領域は、52bit分の更に2/3の領域しか残っていません。
そこで、後ろ側にもう一つノードを追加してみます。新しい区間を[left2, right2]で表すと、

left2 = right + (max-right) / 3
right2 = right + (max-right) / 1.5

left2 = 1.3982057715595789e+308

```
0|7FE|8:E38E:38E3:8E38
```

right2 = 1.5979494532109474e+308

```
0|7FE|C:71C7:1C71:C71C
```

一回目と比べれば、領域の減少は少ないです。というのも、指数部が同じなら仮数部は等間隔に分布しているので、3で割れば単純に領域は1/3になるからです。
とは言え、このまま後方にノードを挿入していくことを考えると、指数的に領域が狭くなっていきます。
ざっと計算してみただけなので誤差があるかもしれませんが、大体34回ノードを後方挿入すると領域が枯れます。

#解決策
##無限精度実数を使う
PostgreSQLには無限精度実数があるそうです。
まあ、無限と言っても、実際には制限があるようなのですが、これを使えばかなり使える資源が増えるので、問題は発生しづらくなるかと思います。
ただし、無限精度の演算はソフトウェアで実装されているので、動作は遅くなるでしょう。
MySQLでは無限精度実数は存在しませんが、上で少し触れたように、無限精度実数ライブラリを利用して、比較可能な形でシリアライズされたものを値にすれば動作させることは可能だと思います。
試してはいませんが、データ使用量と速度に問題がなければ、採用しても良いと思います。

##定期的に最適化する
領域が枯渇することがないように、定期的にテーブルの中を調べて領域を振り分けるサービスを動作させるという解決策もあります。
ただし、最適化が行われる前にリソースが枯れそうになった場合、新しいノードが挿入する前に最適化を行わなければならないため、ブロッキングが発生する可能性があります。
~~それにわざわざそんなサービス作るのクッソめんどくさ（略）~~

##入れ子区間モデルなんて投げ捨てる
そもそもRDBは木構造を扱うための物じゃNEEEE！
でも、どうしてもRDBで木構造を扱いたいのであれば、経路列挙モデル（ファイルパスみたいなものを入れるカラムを作る方法）の方がまだいいのではないでしょうか。

##そんなの気にしないぜ俺は入れ子区間モデルを使う
領域が枯渇しないことが十分に保証できるケースなら問題は発生しないでしょう。私はオススメしませんが。
ちなみに、精度の問題は結局のところ整数型を使っても変わらないので、どうしてもと言うなら、入れ子区間モデルではなく入れ子集合モデルを使っても同じではないでしょうか。

#終わりに

私はDBに関してはあまり明るくないので、DBに詳しい方にとっては「そんなのは100年前に通った道だぜ」みたいなやつかもしれません。
ネット上で見てみた限りでは、この問題に触れている情報があまり見つからず、見つかったとしても「そんなすぐ枯れることはないから大丈夫だよね」みたいな楽観的な情報だったので、ここは一つ実際にどれくらいで枯れるのか計算してみた次第です。
こうすれば大丈夫だよ、みたいな方法が他にあれば、ツッコミを入れていってください
VR View for the Webを試してみる。

googleが提供しているVR Viewスクリプトを使うと簡単に360°の写真やビデオをウェブサイトに埋め込むことができます。
[VR View for the Web](https://developers.google.com/vr/concepts/vrview-web)

#使い方

1.HTMLにGoogle提供のVR Viewスクリプトを記載する。

```html:vrview.html
<script src="//storage.googleapis.com/vrview/2.0/build/vrview.min.js"></script>
```

2.divを記載する。

```html:vrview.html
<div id="vrview"></div>
```

3.VR Viewインスタンスを作成する関数を呼び出す。
(下記はgoogleのサンプル)
image:のところをvideo:にすれば360度の動画にも対応できます。
詳しくは [VR View for the Web](https://developers.google.com/vr/concepts/vrview-web) を。

```js:vrview.html
  window.addEventListener('load', onVrViewLoad)
  function onVrViewLoad() {
    var vrView = new VRView.Player('#vrview', {
      width: '100%',
      height: '300',
      preview: '//storage.googleapis.com/vrview/examples/coral-preview.jpg',
      image: '//storage.googleapis.com/vrview/examples/coral.jpg',
      is_stereo: true
    });
  }
```


PCでもスマホでもブラウザさえあればみることができるのでちょっとした用途には便利だと思います。
例えば賃貸物件の間取りなんかが360度の写真で確認できるといいなじゃないかと。
【C#】例外処理のいろいろ

## 例外処理って？

例外（本来はプログラム中で起こってはいけないことが起こってしまうこと）起こったときでもプログラムが異常な動作をしないようすること。

### 例外の例）

- ユーザーが想定外の文字列を入力
- プログラムに必要なファイルが開けない　etc.

## 例外処理の方法１throw文


```
static int CharToInt(char c)
{
if(c < '0' || '9' < c)
throw new FormatException(); // 不正な文字が入力された場合、例外を投げる
return c - '0';
}
```

throw 文によって投げられる例外は、 System.Exception クラスの派生クラスのインスタンスなので、それ以外のクラスのインスタンスを throw することは出来ません。 


## 例外処理の方法2 try-catch-finally 文


### 使い方

```
try
{
例外が投げられる可能性のあるコード
}
catch(例外の種類)
{
例外処理コード
}
finally
{
例外発生の有無にかかわらず実行したいコード
リソースの破棄などが一般的か
}
```


## 複数の例外処理をしたい

ぱっと思いつくのはExceptionをキャッチすることかなと思います。
これなら例外を取りこぼすこともないはずです。
しかし、無駄な例外処理まで行ってしまうのであまりよくないと思います。


## 他のやり方


```csharp
catch (Exception exception)

{
    if (exception is ArgumentNullException ||
        exception is InvalidOperationException ||
        exception is ArgumentOutOfRangeException)
    {
        DoErrorHandling();
        return;
    }

```


~~こんな感じで例外オブジェクトの型を、より詳細に見ることで解決できたと思います。~~

コメントより種類ごとにcatchしたほうが良いという指摘を受けたので、その方法も載せておきます。

```
catch (ArgumentNullException)
{
    DoErrorHandling();
}
catch (ArgumentOutOfRangeException)
{
    DoErrorHandling();
}
catch (InvalidOperationException)
{
    DoErrorHandling();
}
```


## 例外フィルター　whenについて
C# 6で、例外のcatch句に続けてwhenと書くことで、catchしたい例外の条件が追加できるようになりました。
つまり、先ほど書いた

```
catch (ArgumentNullException)
{
    DoErrorHandling();
}
catch (ArgumentOutOfRangeException)
{
    DoErrorHandling();
}
catch (InvalidOperationException)
{
    DoErrorHandling();
}
```

これの例外処理が同じだった場合まとめて書くことができます。

```
try
{
    F();
}
catch (Exception e) when (e is ArgumentNullException || e is ArgumentOutOfRangeException)
{
```

##参考
- [[C#] 複数の例外(Exception)を一箇所で処理する方法](http://toach.click/catch-exception-at-once/)
- [try-catch (C# リファレンス)](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/try-catch)
htpasswd/htdigestファイルのままJenkinsのBasic認証をやめる

小規模な[Jenkins](https://jenkins-ci.org/)の認証の話です。

# Basic認証とReverse Proxy Authプラグイン

すでに`htpasswd`/`htdigest`ファイルがあってそれを再利用したい場合、Basic認証をかませて[Reverse Proxy Authプラグイン](https://wiki.jenkins-ci.org/display/JENKINS/Reverse+Proxy+Auth+Plugin)を使うのが普通だと思います。

ただ、Basic認証はポップアップが若干ウザいという問題があります(機能はWebフォームと変わりないはずなのに不思議です)。

# Script Security Realmプラグイン

最近、[Script Security Realmというプラグイン](https://wiki.jenkins-ci.org/display/JENKINS/Script+Security+Realm)のことを知りました。これは認証DBの代わりにカスタムのコマンドを使えるというものです。

ここに「`htpasswd`ファイルを読んで一致するか確かめる」という内容のスクリプトを設定すれば、JenkinsのWebフォームでログインができ、Basic認証のポップアップなしですませることができます。

グループの方は使わないのでどうしようか迷ったのですが、`/bin/true`を入れておけば大丈夫でした。

## htpasswd用

```shell-session:設定
/bin/sh -c '/usr/bin/htpasswd -vb /var/www/.htpasswd "$U" "$P"'
```

## htdigest用

htdigestは`-v`がないのでrubyを使います。

```shell-session:設定
/usr/bin/ruby -rwebrick/httpauth/htdigest -e 'D = WEBrick::HTTPAuth::Htdigest.new(ARGV[0]); D.get_passwd(ARGV[1], ENV["U"], false) == D.make_passwd(ARGV[1], ENV["U"], ENV["P"]) or abort' /var/www/.htdigest realm
```
checkstyle のバージョン6.6以上を使用する際の注意点

checkstyle のバージョン6.6 以降では、
解析したソースコードにエラーレベルの規約違反が見つかると、標準出力に

```
$ java -jar checkstyle-6.7-SNAPSHOT-all.jar -f xml -c /sun_checks.xml Test.java
<?xml version="1.0" encoding="UTF-8"?>
<checkstyle version="6.7-SNAPSHOT">
<file name="/home/rivanov/tmp/cs_tests/Test.java">
......
</file>
</checkstyle>
Checkstyle ends with 12 errors.
```
のように、最後の 1行に`Checkstyle ends with XXX errors.`というメッセージを吐くようになった。
https://github.com/checkstyle/checkstyle/issues/1018#issuecomment-99271206

そのため、解析結果を XML形式で標準出力に出力し、パイプでつなぐなどして別のツールに渡している場合、この 1行のせいで XMLデータのパースに失敗する場合がある。

解決策としては、以下のように一旦 ファイルに出力し、
それを次のツールに渡してやるとよい。

###### Before
```
java -jar checkstyle-6.7-SNAPSHOT-all.jar -f xml -c /sun_checks.xml \
| bundle exec saddler report \
    --require saddler/reporter/github \
    --reporter Saddler::Reporter::Github::CommitReviewComment
```

###### After
```
java -jar checkstyle-6.7-SNAPSHOT-all.jar -f xml -c /sun_checks.xml -o result.xml

bundle exec saddler report \
    --require saddler/reporter/github \
    --reporter Saddler::Reporter::Github::CommitReviewComment \
    < result.xml
```
IntelliJ の Spring Boot を使ったプロジェクトでコード変更時に自動で再コンパイルする設定

Spring Boot を使ったアプリケーションを IntelliJ で書いていたけど、コード変更時の自動再コンパイルの設定に少し苦労したのでメモ。

## spring-boot-devtools

[オフィシャルのドキュメント](https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-devtools.html)には `spring-boot-devtools` を `dependencies` に追加するといい、的なことが書かれていた。

`build.gradle` は次のような感じになる。

```
dependencies {
    compile('org.springframework.boot:spring-boot-starter-thymeleaf')
    compile('org.springframework.boot:spring-boot-starter-web')
    runtime('org.springframework.boot:spring-boot-devtools')

    testCompile('org.springframework.boot:spring-boot-starter-test')
}
```

でも、これだけでは自動での再コンパイルは行われないようであった。

## Preference の設定と Registry の設定

[Stack Overflow の記事](https://stackoverflow.com/questions/35895730/spring-boot-devtools-static-content-reloading-does-not-work-in-intellij)に、もう少し踏み込んだ内容があった。次のふたつの設定をするといいらしい。

1. "Preferences..." で "Build project automatically" にチェックを入れる
2. "Command + Shift + a" で表示されるダイアログに "Registry" とタイプし、"compiler.automake.allow.when.app.running" にチェックを入れる

これで、たしかに自動での再コンパイルが機能するようになった。

各々のスクリーンショットを貼り付けておく。

### Build project automatically

<img width="567" alt="preference-compiler.png" src="https://qiita-image-store.s3.amazonaws.com/0/149872/8d96b0d7-6010-df51-b965-22e3e3a02d52.png">

### compiler.automake.allow.when.app.running

<img width="513" alt="auto-reload.png" src="https://qiita-image-store.s3.amazonaws.com/0/149872/ce0a0235-1359-6c6a-4c3a-c101015d7d16.png">
Raspberry pi 3でAWS Greengrassを動かす際にハマったこと

[AWS GreengrassがGAになった](https://aws.amazon.com/jp/blogs/news/aws-greengrass-run-aws-lambda-functions-on-connected-devices/#more-15369)ようなのでRaspberry pi 3で動かしてみました。基本的にはリンク先の通りで良いのですが幾つかハマったとこをピックアップします。

## ドキュメント見た方が良い

先に言っておくと[このPDFドキュメント](http://docs.aws.amazon.com/greengrass/latest/userguide/gg-ug.pdf)の方が正確です。

## CPUアーキテクチャがARMv7lかARMv8

GreengrassのARMの対応アーキテクチャがv7lかv8なのでRaspberry Pi 3じゃないとダメです。以下のように表示されればOK。

```
$ arch
armv7l
```
## ちゃんとGreengrassユーザ作らないとダメ

作ってないとGreengrass起動時に怒られます。

```
$ sudo useradd -r ggc_user
$ sudo groupadd -r ggc_group
```

## Hardlink/softlink protection

これもやっておかないとGreengrass起動時に怒られます。意味はわかってませんが以下のファイルを開いて..

```
$ sudo vi /etc/sysctl.d/98-rpi.conf
```

末尾に以下を追記。

```
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
```
Raspberry piをreboot。

```
$ sudo reboot
```

再起動後に以下のコマンド打つと何やらリストが出てくる。

```
$ sudo sysctl -a | grep fs
```
リストに以下が含まれてればOK。

```
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
```

## Lambda functionのテンプレート

リンク先で「Lambda fucntion作ります」としか書いてないですけど、このブログで使ってるのは以下の`greengrass-hello-world`です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/21109/1046be03-fe51-b103-e9f6-49b2ac7d4e5c.png)

## Lambda functionの最初のバージョンのPublish

忘れがちですがコレやらないとGreengrassでLambda function選択する時に困ります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/21109/89fef330-3f63-a7ed-b371-c2dafafb7956.png)

## まとめ

...という感じで動いたー！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/21109/c9f0fd54-c074-2b08-4494-92a4bd55ca72.png)
CentOSでユーザを作成してパスワードを設定してユーザ一覧で確認する方法

**環境**
OS : MacのVirtualBoxに作った仮想マシンのCentOS7


```shell-session:ユーザを作成する
ユーザを作成する
$ useradd {ユーザ名}

パスワードを設定する(rootの場合はユーザ名が不要)
$ passwd {ユーザ名}
```

![Screen Shot 2017-06-08 at 21.30.11.png](https://qiita-image-store.s3.amazonaws.com/0/159761/80a07536-0b3e-e081-df21-19e7b954d4c0.png)

```shell-session:ユーザ一覧で確認する
フォーマット
ユーザ名:パスワード:ユーザID:グループID:コメント:ホームディレクトリ:ログインシェル

$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
<省略>
mana:x:1000:1000:mana:/home/mana:/bin/bash
ponsuke:x:1001:1001::/home/ponsuke:/bin/bash
vboxadd:x:996:1::/var/run/vboxadd:/bin/false
```


### 出典
- [◇パスワードの設定と変更◇初心者のためのLinuxサーバー構築講座(CentOS 自宅サーバー対応)☆お便利サーバー.com☆](http://www.obenri.com/_command/passwd01.html)
- [Linux ユーザー一覧の確認と/etc/passwd ファイル](http://kazmax.zpp.jp/linux_beginner/etc_passwd.html)
- [CentOSでのユーザ操作コマンド一覧 - Qiita](http://qiita.com/emowl/items/7dc09daa408907a3c6e5)
- [CentOSでユーザーの一覧を確認する - Qiita](CentOSでユーザーの一覧を確認する - Qiita)
UITableViewのあるセルに設定した値が、他のセルにも反映されてしまう

##現象
UITableViewの特定のセルの背景色をif文で変えていたが、
if文の条件に当てはまらないセルの背景色も勝手に変わってしまう。

勝手に変わってしまうセルは、特定のセルの6つ上or下ごと。
（というよりスクロールで当該セルが消えた後に出てくるセルごと）

具体的には、漫画アプリにおいて既読の話数のセルの背景色を変えようとしたところ、
17話目のみが既読であるはずのところ、
11,5話のセルの背景色も既読色に変わってしまっていた。

![003.png](https://qiita-image-store.s3.amazonaws.com/0/66738/bc56cb0f-9d7c-c864-821f-a419fdca3e25.png)


##原因
UITableViewのセルの再利用が原因。
再利用時に属性を引き継いでしまっている。

>UITableViewはセルの使い回しを考慮した構造になっている
僕が始めたてから数ヶ月の間理解できなかったポイントとして、「セルの使い回し」というUITableViewの構造がありました。画面の上にViewをたくさん置いてしまうと、アプリがどうしても重くなってしまうので、セルは画面の外に出たら一旦画面から外されて、そのまま使いまわされます。その処理を勝手にやってくれるのですが、その部分がブラックボックスになっていて、最初のうちは結構苦しむポイントだと思います。

>画面に表示されているセルの個数が5個ならUITableViewは6個か7個くらいしかセルを作らず、その6個か7個を使いまわしています。

参考 : http://blog.morizotter.com/2013/12/24/uitableview-customcell-storyboard/

##対処法
~~tableViewを描画する処理の中にセルの背景色を初期化する一行を挿入する~~

※コメントでより良い方法を指摘いただいたので訂正
セルの再利用時に描画の初期化を行う。
その際はセルの再利用時に呼び出されるprepareForReuseメソッドを利用する。

```
override func prepareForReuse() {
    super.prepareForReuse()
    contentview.backgroundColor = .white
}
```
既存のEC2インスタンスのディスク容量を拡張する

ある日EC2インスタンスにログインしコマンドを実行しようとしたら

```
cannot create temp file for here-document: No space left on device
```

なるものが表示されました。
どうやらディスク容量がいっぱいの様子なので増やしてあげます。

まずはAWSのドキュメントに記載されている[コンソールからの EBS ボリュームの変更](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ebs-expand-volume.html#console-modify)を行います。特に問題なし。

今回拡張してあげたいのはルートパーティションなので

1.インスタンスからEBSボリュームをデタッチ
2.ルートパーティションを持つ別のインスタンスにアタッチ
3.2でアタッチしたインスタンス上からpartedコマンドを使用してパーティションを拡張
4.元のインスタンスにアタッチ

ざっくり説明すると、このような流れになります。

1, 2の手順は[ここ](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/storage_expand_partition.html#prepare-linux-root-part)の通りに進めればOK。
3.も基本的に[parted を使用して Linux パーティションを拡張する](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/storage_expand_partition.html#expanding-partition-parted)の通りに進めればOKですが、mkpartコマンドを実行する際に

```
Warning: The resulting partition is not properly aligned for best performance.
```

というwarningが私の環境では表示されましが、Ignoreで問題ありませんでした。

4.あとはアタッチして起動するだけ！と思ったら

```
Instance does not have a volume attached at root
```

と表示されてインスタンスが起動できない。

[EC2 のルートデバイスに EBS をアタッチする方法](http://qiita.com/dskst/items/302119452bc399414bae)

アタッチする際のデバイス名をインスタンスタイプによって適したものに変える必要があるんですね。
この時はUbuntuを使用していたので /dev/sda1 にしたら無事起動しました。
LinuxのOSを確認する方法

# OSを確認する方法
```bash
$ cat /etc/issue

# CentOS, RedHat系
$ cat /etc/redhat-release

# AmazonLinux
$ cat /etc/system-release

# Ubuntuとかいろいろ
$ cat /etc/os-release

# Debial
$ cat /etc/debian_version
10.11
$ cat /etc/issue
Debian GNU/Linux 10 \n \l
```

# 64bitとか32bitとかを確認する方法
```bash
$ uname -m
x86_64

$ arch
x86_64
```

# 参考
- [付帯手順 – さくらVPSのCentOSバージョン確認](https://vps.prostsite.co.jp/vps/install/2011osv)
- [CentOS、UbuntuなどLinux OSのバージョン確認をするコマンド | UX MILK](https://uxmilk.jp/13610)
- [Amazon Linux のバージョンを確認する方法 - Qiita](https://qiita.com/semind/items/f49661dfdbd8c7e34956)
- [CentOSでOSが64bitか32bitの確認方法 | server-memo.net](https://www.server-memo.net/tips/os-bit.html)
Arukas.ioでMastodonのWebクライアント「Naumanni(ナウマン)」を建てた話

こんにちはこんにちは！  
MastodonのWebクライアントであるNaumanniを[Arukas.io](https://arukas.io)で建ててみましたので、紹介します。
URLはこちらです。
**https://naumanni.arukascloud.io**

#### Naumanniって？
OSSとしてGitHub上で公開されているMastodonのWebクライアントです。
APIを叩いて、Mastodonのいろんなことができる、いわばガワですね。
(間違っていたりご指摘あればお願いします。)
>[Naummanniは(株)UEIと(株)glucoseの共同開発プロジェクトです](https://github.com/naumanni/naumanni/blob/master/README.ja.md)  
![SnapCrab_NoName_2017-6-8_20-13-23_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/135022/f334cd04-b31c-7568-0161-a72eef05d1f8.png)

#### Arukas.ioって？
[Arukas.io](https://arukas.io)はdockerコンテナをVM上につくることのできるさくらインターネットのサービスです。  
複数のdockerの連携はできませんが、1つのコンテナで完結するものであれば設定するだけで立ち上がります。

>ARUKAS CLOUD is DOCKER HOSTING
![SnapCrab_Arukas｜Dockerホスティング_2017-6-8_19-59-21_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/135022/371a4791-3504-044d-c186-a43cdb914d26.png)  

- どのイメージを使うか
- 外部のポートはなにをつかうか
- 環境変数になにを設定するか
- CMD で指定するコマンドはなにか
などなどを設定すると、簡単にdockerが立ち上がってサービスを公開することができます。
(ちなみに現在は有料プランがなく、10コンテナまでは無料ですが、今すぐ登録しても案内は4週間ほどかかるそうです。)

#### 早く建てろ
建てます。  
![SnapCrab_make a new app - Arukas Control Panel_2017-6-8_20-25-42_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/135022/d057d315-bbbe-d1b1-57db-46897cd1ecb5.png)
画像の赤枠内をそれぞれ入力します。

項目| 設定値
:-: | :-:
App Name | 任意の名前 
Image | naumanni/naumanni-standalone:latest 
Endpoint | Arukas.io上で一意になるような名前
Port | 80

残りの項目「Instances」「Memory」は適当に、「ENV」「CMD」は未設定で大丈夫です。  
この設定でアプリケーションを作成すると、ビルドが終了次第、下記のようになります。
![SnapCrab_naumanni properties - Arukas Control Panel_2017-6-8_20-38-28_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/135022/682c10e5-003a-9e02-ab68-71669d8cf86a.png)


これでコンテナの作成は終了です。
Endpointに指定されているURLに飛ぶとNaumanniの画面が開きます。  

#### ハマったとこ
dockerはタグを指定しないと自動的にlatestからイメージを引っ張ってくると思ってたのですが、
Arukas.ioの場合には「naumanni/naumanni-standalone」と指定してもビルドが失敗していました。  
上記のようにきちんとタグ「:latest」を指定してあげましょう。

#### 最後に
今回はサイトと設定の紹介だけとなってしまいましたが、お手軽ですので試してみてはいかがでしょうか。
また、今回は[dockerhub上のNaumanniイメージ](https://hub.docker.com/r/naumanni/naumanni-standalone/)を用いていますが、
今後の改修によっては上記の設定で動作しなくなる可能性もありますのでご注意ください。

まだArukas.ioの登録が済んでいない方などは、是非今回建てたNaumanni鯖もつかってみてください。
**https://naumanni.arukascloud.io**
(特に今後触る予定はないですが、イメージが更新されていれば検証の後、更新をかける可能性はあります。)
MariaDB で、ユーザーが存在しない時にユーザーを作成

```sql
create user if not exists scott@localhost identified by 'tiger123';
```
この sql が使えるのは
10.1.22-MariaDB (Ubuntu 17.04)
10.1.33-MariaDB (Arch Linux)
10.4.13-MariaDB (Arch Linux)
10.11.2-MariaDB (Arch Linux)

使えないのは
10.0.30-MariaDB (Raspbian)
10.0.29-MariaDB (Ubuntu 16.04)

ユーザーの表示

```text
select user,host from mysql.user;
```

ユーザーの削除

```text
drop user scott@localhost;
```
iOS11のcoreMLで物体認識(VGG16)を実装してみる(３分クッキング)

WWDC2017で発表されたcoreMLにVGG16の学習モデルを実装して、最小の手順で物体認識アプリを作ってみましたのでやり方を共有いたします。何かのお役に立ちましたら幸いです。

![IMG_0391.PNG](https://qiita-image-store.s3.amazonaws.com/0/14288/da5e0534-0c14-079b-9de3-2c245ec6270a.png)


#前提
下記の準備は出来ているものとします。
・Xcode beta9
・iOS11 beta
・ビルドのための設定こもごも

#サンプルコードの入手
こちらのページのResourcesから公開されたサンプルコードを入手しましょう。
https://developer.apple.com/videos/play/wwdc2017/506/
<img width="399" alt="スクリーンショット 2017-06-08 13.28.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/14288/c9389dec-8974-a982-1a8f-2f26864e9125.png">

サンプルコードそのままでもMNIST（手書き数字認識）の学習モデルがセットされているので、紙に書いた数字を写真に撮れば数字認識ができます。でも、数字だけでも寂しいので学習モデルを入れ替えてみましょう。


##学習済みモデルの入手
こちらのページの下の方からVGG16をダウンロードしましょう。
https://developer.apple.com/machine-learning/
<img width="521" alt="スクリーンショット 2017-06-08 13.13.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/14288/ff3ba82b-75e8-b956-98b2-36939acd922c.png">


**VGG１６に関して詳しくはこちら**
画像から１０００種類の物体を見分けることが出来ます。
http://aidiary.hatenablog.com/entry/20170104/1483535144

#実装
まずVGG16学習済みモデルをプロジェクトにドラッグ・アンド・ドロップします。
<img width="258" alt="スクリーンショット 2017-06-08 13.33.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/14288/25db4f26-2b0b-98fe-c1f9-3f12acaca83e.png">


ViewController.swiftのclassificationRequestにある学習モデルファイルをMNISTClassfierからVGG16に書き換えます。

```swift:ViewController.swift
let model = try VNCoreMLModel(for: VGG16().model)//MNISTClassfierからVGG16に書き換え
```

さらにimagePickerControllerを下記のように書き換えましょう。（乱暴ですが）

```swift:ViewController.swift
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        picker.dismiss(animated: true)
        classificationLabel.text = "Analyzing Image…"
        correctedImageView.image = nil
        
        guard let uiImage = info[UIImagePickerControllerOriginalImage] as? UIImage
            else { fatalError("no image from image picker") }
        guard let ciImage = CIImage(image: uiImage)
            else { fatalError("can't create CIImage from UIImage") }
        let orientation = CGImagePropertyOrientation(uiImage.imageOrientation)
        inputImage = ciImage.applyingOrientation(Int32(orientation.rawValue))

        // Show the image in the UI.
        imageView.image = uiImage
        
        //読み込んだ画像をそのまま推論処理へ
        let handler = VNImageRequestHandler(ciImage: inputImage)
        do {
            try handler.perform([classificationRequest])
        } catch {
            print(error)
        }
/**
         //MNIST用に紙の四隅を検知したり、色を白黒に落としたりの処理。今回とりあえずスキップ
        // Run the rectangle detector, which upon completion runs the ML classifier.
        let handler = VNImageRequestHandler(ciImage: ciImage, orientation: Int32(orientation.rawValue))
        DispatchQueue.global(qos: .userInteractive).async {
            do {
                try handler.perform([self.rectanglesRequest])
            } catch {
                print(error)
            }
        }
 **/
    }
```

以上で完成です。

#所感
学習モデルさえ入れ替えればかなりお手軽に流行りの"人工知能アプリ"を作ることが出来ます。推論だけに特化して思い切り割り切ってきたなぁ！という印象です。私のような深い知識がない人間も簡単に実装できてしまうので、学習モデル作成の手法も今後更に一般化されるであろうことを考えれば、世の中に機械学習の恩恵があふれる日は思ったよりも近いのかもしれません。
疎通確認で確かめること

関連（対抗）システムへの疎通確認で接続元システムで実施すべきことを記載します。
関連（対抗）システムが他のベンダである場合は、接続元システムでしっかり調査する必要があります。

## telnet

まずtelnet
繋がればほっと一安心ですね。

+ 繋がった場合

```:bash
$ telnet 10.0.0.1 443
Trying 10.0.0.1...
Connected to 10.0.0.1.
Escape character is '^]'.
```

+ 切断された場合（例）

```:bash
$ telnet 10.0.0.1 443
Trying 10.0.0.1...
telnet: connect to address 10.0.0.1: Connection refused
```

## tcpdump 

切断された理由をtcpdumpで探ります。
ルーティングの問題か、相手先サーバでのファイアーウォール等の問題か切り分けます。
tcpdumpでパケットをdumpしつつ、上記telnetを投げます。

+ 切断された場合（例）

対抗システム（以下だと10.0.0.1:443）まで到達しており、フラグリセット([R.])が返戻されています。
対抗システムまで到達しているので、対抗システムでのfirewalld等の設定の可能性が高いです。
→対抗システム以外のIPから切断されている場合は、ルーティングの問題の可能性が高いです。

```:bash
$ tcpdump -Anns 1000 port 443

19:59:21.817004 IP 10.2.0.1.39716 > 10.0.0.1.443: Flags [S], seq 2728605175, win 29200, options [mss 1460,sackOK,TS val 622090013 ecr 0,nop,wscale 7], length 0
E..<b.@.@..\
.R.
.b..$....5.......r............
%.W.........
19:59:21.817153 IP 10.0.0.1.443 > 10.2.0.1.39716: Flags [R.], seq 0, ack 2728605176, win 29200, length 0
E..(.6....Q3
.b.
.R....$......5.P.r...........
```

+ 繋がった場合

接続先サーバからコネクション確立要求(S.)が返戻され、コネクションが確立されます。

```:bash
$ tcpdump -Anns 1000 port 443

20:06:44.132007 IP 10.2.0.1.53625 > 10.0.0.1.443: Flags [S], seq 2493042387, win 14600, options [mss 1460,sackOK,TS val 3856928201 ecr 0,nop,wscale 7], length 0
E..<..@.@..0
.R.
.b..y............9............
.........
20:06:44.139475 IP 10.0.0.1.443 > 10.2.0.1.53625: Flags [S.], seq 1375242561, ack 2493042388, win 8192, options [mss 1380,nop,wscale 8,sackOK,TS val 1528891062 ecr 3856928201], length 0
E@.<..@.{..\
.b.
.R....yQ..A...... ..|.....d.......
.!....
20:06:44.139542 IP 10.2.0.1.53625 > 10.0.0.1.443: Flags [.], ack 1, win 115, options [nop,nop,TS val 3856928208 ecr 1528891062], length 0
E..4..@.@..7
.R.
.b..y......Q..B...s.......
.[!..
```
Rails5でパラメーターをredirect_toに直接渡す


# 結論
- Rails5にバージョンアップするにあたり、パラメーターがハッシュ継承じゃなくなり、またpermissionがなければパラメーターを簡単に次のパスに投げることができなくなってしまいました。[参考](http://qiita.com/ryohashimoto/items/09724ad4dddcda01bce3#actioncontrollerparameters%E3%81%8C%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E3%81%8B%E3%82%89%E7%B6%99%E6%89%BF%E3%81%95%E3%82%8C%E3%81%AA%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%9F)
- なので、パラメータをそのまま飛ばす時は、

> 1. 必要な箇所にpermitをかけたのち
2. to_hをつけてハッシュ化して渡す

プロセスが必要

```ruby
# params = {"user"=>{"name"=>"asd", "age"=>"12"}}に対して

params.class
# => ActionController::Parameters

# これは無理
params.to_h
# => unable to convert unpermitted parameters to hash

params.permit(user: :name).to_h
# => {"user"=>{"name"=>"asd"}}
```

# 実際にredirect_toに渡す場合

```erb
# app/views/users/first.html.erb

<%= form_for @user, url: users_second_path, method: :get do |f| %>
  <%= f.text_field :name, placeholder: '名前' %>
  <%= f.number_field :age, placeholder: '年齢' %>
  <%= f.submit %>
<% end %>
```

```ruby
# app/controllers/user_controller.rb

# 最初にパラメーターを飛ばすアクション
def first
  @user = User.new
end

# パラメーターを受け取って別の場所へリダイレクトさせるアクション
def second
  # これは問題外。unable to convert unpermitted parameters to hash
  # redirect_to users_third_path(params)
  
  # かといってこれでもダメ。unable to convert unpermitted parameters to hash
  # redirect_to users_third_path(user: user[:params])
  
  # これでいける
  redirect_to users_third_path(user: user_params)
end

# 最終的にパラメーターをキャッチするアクション
def third
  name = user_params[:user]
end

def user_params
  params.require(:user).permit(:name, :age)
end
```
font-sizeを指定するときに！ px・pt・％の数値一覧

デザインデータで文字サイズがptで指定されているとめんどくさいですよね。
font-sizeは相対的な値で指定しておきたいですし。
ということで一覧表でまとめました。

# 文字サイズ用 数値一覧表
16pxを基準にすることが多いので16px=100%としています。
奇数が好きでないので、偶数のpx数値です。

|　　px　　|　　pt　　|　　％　　|
|:--:|:--:|:--:|
|36|27|225%|
|34|25.5|212.5%|
|32|24|200%|
|30|22.5|187.5%|
|28|21|175%|
|26|19.5|162.5%|
|24|18|150%|
|22|16.5|137.5%|
|20|15|125%|
|18|13.5|112.5%|
|16|12|100%|
|14|10.5|87.5%|
|12|9|75%|
|10|7.5|62.5%|

## こちらを参考にしました！
> px,pt,%,em 文字の大きさ 数値一覧表 - 山崎はるかのメモ
> http://www.nda.co.jp/memo/pxpt.html