OmniAICreator/Qiita-1.07M huggingface dataset:
init.el読書会に自動参加

[Emacs JP](http://emacs-jp.github.io/) では，毎週土曜日の夜10時から [lingr](http://lingr.com/room/emacs/) にて [init.elの読書会](http://emacs-jp.github.io/reading-initel.html) が開催されています．

いつも参加するのを忘れてしまうので，Emacsを使っている限り自動参加するように設定してみます．漢は黙ってEmacs．

```el
(run-at-time "22:00" nil
             '(lambda ()
                (when (and (string= "Sat" (format-time-string "%a"))
                           (require 'lingr nil t))
                  (lingr-login))))
```

すでに [lingr](http://lingr.com/) のアカウントがあり，[lingr.el](http://melpa.org/#/lingr) を使えるのが前提です．

lingr.el の設定では，次のように username と password が必要です．init.el を公開している人は，設定したファイルを誤ってインターネットに公開しないように留意しましょう．

```el
(with-eval-after-load "lingr"
  (setq lingr-username "****@****.****"
        lingr-password "********"))
```

その他，アイコン表示などを設定できます．

```el
(with-eval-after-load "lingr"
   (setq lingr-icon-mode t)
   (setq lingr-icon-fix-size 24)
   (setq lingr-image-convert-program "/usr/local/bin/convert"))
```

なお，ログアウトは `lingr-logout` にて．
sudo 時に root 権限で実行されてるかを確認する

環境
----

- Ubuntu 15.04
- sudo 1.8.9p5
  - _/etc/sudoers_ に _env_reset_ を設定。

調査
----

コマンドは `info` の _User information_ の項目 (`info id` の 1 ページ前) と、ユーザーを表す環境変数から選んだ。

### 手動

```bash
$ sudo echo $USER
user1
$ sudo echo $UID
1000
$ sudo id
uid=0(root) gid=0(root) groups=0(root)
$ sudo logname
user1
$ sudo whoami
root
$ sudo users
user1
$ sudo groups
user1 adm cdrom sudo dip plugdev lpadmin
```

### スクリプト

```bash:check.sh
#!/bin/bash -x

echo $USER
echo $UID
id
logname
whoami
users
groups
```

```bash
$ sudo ./check.sh
+ echo root
root
+ echo 0
0
+ id
uid=0(root) gid=0(root) groups=0(root)
+ logname
user1
+ whoami
root
+ users
user1
+ groups
root
```

調査結果
----

出力されたユーザー名、所属グループ名は以下の通り。

### 手動でもスクリプト経由でも root

- `whoami`
- `id`

### スクリプト経由なら root

- 環境変数 $USER
- 環境変数 $UID
- `groups`

### sudo 実行ユーザー

- `logname`
- `users`

使用例
----

### 例 1

管理者権限がない状態で実行してほしくないスクリプトがあるとき、ガード節として使う。

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

if [ "`whoami`" != "root" ]; then
  echo "Require root privilege"
  exit 1
fi

cat <<EOT
- * - * - * - * - * - * - * - * -
- *  HELLO, MY ROOT USER !!!  * -
- * - * - * - * - * - * - * - * -
EOT
```

### 例 2

sudo を実行したユーザーによっては弾く。これもガード節。

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

if [ "`whoami`" != "root" ]; then
  echo "Require root privilege"
  exit 1
fi

if [ "`logname`" = "user1" ]; then
  for i in {1..10}
  do
    echo "Ha?"
  done
  exit 1
fi

cat <<EOT
* - * - * - * - * - * - * - * - * - *
*   HELLO, MY CUTE ROOT USER !!!!   *
* - * - * - * - * - * - * - * - * - *
EOT
```

感想
----

似たようなコマンドでも差がでて意外だった。

あと `sudo` で一時的に振る舞うユーザーの環境変数は特別なことをしないと読み込まれないイメージだったけど、一旦実行ファイルを経由すれば読み込まれるのか、とこれも意外だった。

でも考えてみれば、子プロセスで新たにシェルを起動するわけだから、その初期動作として環境変数を読み直すのは当たり前のことかもしれない。

`logname` は `sudo su -` として root 化しても元のユーザーの名前が出力された。

コマンドの名前から察するに、このコマンドの目的はログインの根っこにいるユーザーを知ることなのかもしれない。 `sudo` や `su` コマンドでそれは書き変わらないんだろう。 `whoami` や `id` で出力内容が変わるのは、また別の情報を見ているんだろう。

なんとなく気にならなくて見てこなかった世界だ。

超・基本的なことなんだろうけど、なんだか勉強になった。
ポインタが指し示すデータを一時変数に受けていたせいで最適化が効かなくなった例

ポインタが指し示すデータを一時変数に受けていたせいで最適化が効かなくなって激遅になったパターン。
アセンブリコードをしばらく眺めてやっと気づいた。
そんな概念すっかり忘れてた。

##ソースコード
### 遅かった方

```cpp:Before.cpp
class BufferAnalyzeDirect
{
public:
	static const size_t msgOfs_ = offsetof(Header, messageByte);
	static const size_t optOfs_ = offsetof(Header, optionByte);
	void operator()(uint8_t* b, Result & r)
	{
		uint16_t msgByte = *reinterpret_cast<uint16_t*>(&b[msgOfs_]);
		uint16_t optByte = *reinterpret_cast<uint16_t*>(&b[optOfs_]);
		r.requestStatus = *reinterpret_cast<uint16_t*>(&b[4 + 4]);
		r.optionCode = *reinterpret_cast<uint16_t*>(&b[4 + 4 + msgByte]);
		r.count = *reinterpret_cast<uint16_t*>(&b[4 + 4 + msgByte + optByte]);
	}
};
```

C言語チックにスコープの先頭で変数宣言してた。


### 速かった方

```cpp:After.cpp
class BufferAnalyzeDirect
{
public:
	static const size_t msgOfs_ = offsetof(Header, messageByte);
	static const size_t optOfs_ = offsetof(Header, optionByte);
	void operator()(uint8_t* b, Result & r)
	{
		r.requestStatus = *reinterpret_cast<uint16_t*>(&b[4 + 4]);
		uint16_t msgByte = *reinterpret_cast<uint16_t*>(&b[msgOfs_]);
		r.optionCode = *reinterpret_cast<uint16_t*>(&b[4 + 4 + msgByte]);
		uint16_t optByte = *reinterpret_cast<uint16_t*>(&b[optOfs_]);
		r.count = *reinterpret_cast<uint16_t*>(&b[4 + 4 + msgByte + optByte]);
	}
};
```

一時変数を受ける場所が違うだけ。

## 結果

100000000回繰り返した結果

```
Before:      0.198654sec
After:       0.096776sec
```

## アセンブラ

### 遅かった方

```asm:Before.asm
push	ebp
mov	ebp, esp
push	esi
mov	esi, DWORD PTR _r$[ebp]
push	edi
mov	edi, DWORD PTR _b$[ebp]
movzx	ecx, WORD PTR [edi]
movzx	eax, WORD PTR [edi+8]
movzx	edx, WORD PTR [edi+2]
mov	WORD PTR [esi], ax
movzx	eax, WORD PTR [ecx+edi+8]
mov	WORD PTR [esi+2], ax
lea	eax, DWORD PTR [ecx+edx]
movzx	eax, WORD PTR [eax+edi+8]
pop	edi
mov	WORD PTR [esi+4], ax
pop	esi
pop	ebp
ret	8

```

### 速かった方

```asm:After.cpp
push	ebp
mov	ebp, esp
mov	edx, DWORD PTR _b$[ebp]
mov	ecx, DWORD PTR _r$[ebp]
movzx	eax, WORD PTR [edx+8]
mov	WORD PTR [ecx], ax
movzx	eax, WORD PTR [edx+40]
mov	WORD PTR [ecx+2], ax
movzx	eax, WORD PTR [edx+72]
mov	WORD PTR [ecx+4], ax
pop	ebp
ret	8
```

## 考察

ポインタからデータとってきてるので厳密にそのタイミングで取得して保持しておかないとデータ変わるかも！とコンパイラさんが気を利かせてくれているっぽい。
そのせいで余分なpush, pop, leaが出てきているっぽい。
データを使う直前で取得することによってスタックへの出し入れが減ったおかげで速くなったっぽい。

っぽい？
CentOS上でApacheとPostgreSQLを使ってCodeIgniterを動かす


ローカルのMAMP環境ではそんなに苦労しなくても環境が作れた気がするけど、
CentOS上で作ったWebアプリを動かそうとしたらハマったのでメモ。
SELinuxの停止やPostgreSQLのIPv6の無効化に気付かず、だいぶ時間かかりました...。

##環境
OS:CentOS 6.7
PostgreSQL:9.4
CodeIgniter:3

##構築手順
1 Apacheインストール（+自動起動設定）

```
$ yum install httpd
$ chkconfig httpd on
```

2 PHPインストール

```
$ sudo yum install  php-cli php-fpm php-devel php-gd php-mbstring php-pdo php-pear php-xml php-imap php-pecl php-mcrypt php-common php-pgsql
```

3 PHP確認

```
echo "<?php phpinfo(); ?>" > /var/www/html/phpinfo.php
```
http://IP/phpinfo.php
へアクセスしてPHPの詳細が表示されることを確認する

4 SELinux を止める
/etc/sysconfig/selinuxを編集

```
SELINUX=disabled
```

disabledに変更

5 PostgreSQLのインストール
標準リポジトリのPostgreSQLはバージョンが古いので、
標準リポジトリを参照した際にPostgreSQLは参照しない設定にする。

/etc/yum.repos.d/CentOS-Base.repoを開く

```
[base]
exclude=postgresql*  ←追加

[updates]
exclude=postgresql*  ←追加
```

公式の yum リポジトリを追加

```
$ yum -y localinstall http://yum.postgresql.org/9.4/redhat/rhel-6-x86_64/pgdg-centos94-9.4-1.noarch.rpm
$ yum -y install postgresql94-server
```

6 PostgreSQLの初期化

```
$ service postgresql-9.4 initdb
```

7 PostgreSQLの自動起動設定

```
$ chkconfig postgresql-9.4 on
```

8 PostgreSQLの起動

```
$ service postgresql-9.4 start
```

9 postgreユーザでログイン

```
$su postgres
$psql -d postgres
```

10 開発用のロール（オーナー）を追加(例. オーナー名：test)

* OSのログインユーザと同じユーザ名でロールを追加する

```
postgres=# CREATE ROLE test WITH SUPERUSER CREATEROLE CREATEDB LOGIN;
```

11 開発用オーナーを指定してDBを作成

```
create database ’DB名’ owner test;
```

12 一旦postgresユーザからログアウト


13 DBにログイン

```
psql -d ’DB名’
```

14 テーブル作成等
DBログイン後に、作成するWebアプリに合わせてテーブル作成やカラム追加を行う。


15 Codeigniterのdatabase.confを修正

* ユーザ名、パスワード名、データベース名を任意の値に修正
* dbdriverをpostgreに変更

```
$db['default'] = array(
	'dsn'	=> '',
	'hostname' => '127.0.01',
	'username' => 'ユーザ名',　　　　←ここ
	'password' => 'パスワード',　　　←ここ
	'database' => 'データベース名',　←ここ
	'dbdriver' => 'postgre',　　　　←ここ
	'dbprefix' => '',
	'pconnect' => FALSE,
	'db_debug' => (ENVIRONMENT !== 'production'),
	'cache_on' => FALSE,
	'cachedir' => '',
	'char_set' => 'utf8',
	'dbcollat' => 'utf8_general_ci',
	'swap_pre' => '',
	'encrypt' => FALSE,
	'compress' => FALSE,
	'stricton' => FALSE,
	'failover' => array(),
	'save_queries' => TRUE
);
```

16 PostgreSQLのIPv6を無効にする
postgresql.confを編集

```
listen_addresses = 'localhost' 
```

↓

```
listen_addresses = '0.0.0.0'
```

17 PostgreSQLを再起動

---
Windows10でVagrantを利用する


クライアントHyper-Vで作成したVM使えばいいやと思って使っていないかったVagrantをいまさらながら使ってみる。

コマンドプロンプトが使いづらいのでCygwinで操作してますが、コマンドプロンプトでもほとんど変わらないはず。

# VirtualBoxのインストール
まずは、以下のサイトからVirtualBoxをダウンロード&インストール。
せっかく入っているクライアントHyper-Vを使ってもできるのかもしれないが、とりあえず情報のたくさんある、VritualBoxにしてみる。

https://www.virtualbox.org/wiki/Downloads

# Vagrantのインストール
続いて、Vagrantをダウンロード&インストールする。
URLは以下。

https://www.vagrantup.com/downloads.html

インストールできたら、vagrantコマンドが使えるか確認。

```bash:
$ vagrant.exe --version
Vagrant 1.8.1
```

# MSVCR100.dllのインストール
VirtualBoxとVagrantをインストールしただけだと、*vagrant box add*とかでエラーとなってしまうので、MSVCR100.dllをインストールする。
※x86版だけだとエラーが解消されなかったので、両方インストールしておいた。

x86版は以下。
https://www.microsoft.com/ja-jp/download/details.aspx?id=5555
x64版は以下。
https://www.microsoft.com/ja-jp/download/details.aspx?id=14632

これでセットアップは完了。

# Vagrantを使ってみる
セットアップできたので、とりあえず使ってみる。

今回は、[公式サイト](https://vagrantcloud.com/)で公開されている、centos6.7のBoxを使用する。

まずは作業用ディレクトリの作成

```bash
$ mkdir vagrant/centos67
$ cd vagrant/centos67
```

作業用ディレクトリに移ったら、*vagrant.exe init*でcentos6.7のBoxを準備する。

```bash
$ vagrant.exe init bento/centos-6.7
```

すると、カレントディレクトリにVagrantfileというVMの設定を記述するファイルができるが、今回は「とりあえず使う」ことが目的なので編集しない。

ここまで来たら、あとはVMを起動して接続するだけ。
まずはVMの起動。はじめはBoxファイルをダウンロードしてくるので、結構時間がかかるが放置しておいてOK。
なお、Hyper-Vを使っている場合、VirtualBoxとHyper-Vが競合してしまうので、その場合は、[Hyper-Vを使っている環境でVMware playerを使用する](http://qiita.com/12yzero/items/c5e468e0eb9e3df65ff3)を参考に、Hyper-Vをオフにする。VMware playerとなっているが、VirtualBoxでも同じ。

```bash
$ vagrant.exe up
```

*vagrant.exe up*が完了したら、以下コマンドでVMにアクセス。VMからログアウトするには、ふつうに*exit*すればよい。

```bash
$ vagrant.exe ssh
[vagrant@localhost ~]$
[vagrant@localhost ~]$ cat /etc/centos-release
CentOS release 6.7 (Final)
[vagrant@localhost ~]$
[vagrant@localhost ~]$ exit
logout
Connection to 127.0.0.1 closed.
```

VMを停止するには、以下のようにする。

```bash
$ vagrant.exe halt
==> default: Attempting graceful shutdown of VM...
```

以上
フォームからファイルを選択した際に、submitする前にプレビュー表示する方法(jQuery版)

## はじめに
フォームの入力の際に、入力に間違いがないかプレビュー表示する
この機能を実現するためにFileAPIを利用する
JavaScriptのFileAPIは2016年3月現在ほぼすべてのブラウザに対応している(IEさえも)

本サンプルコードはjQueryで動作します。
jQueryを使っていないのが知りたい人はこちらの[フォームからファイルを選択した際に、submitする前にプレビュー表示する方法(jQuery"無し"版)](http://qiita.com/kon_yu/items/d176eaef22d3892bc49b) を参照のこと

## Demo
動作を確認できるデモはこちら
[Demo](http://jsdo.it/kon_yu/S0gW)

## 対象のコード
```html
<form>
    <input type="file">
</form>

<div class="preview" />
```

```js
$(function(){
  //画像ファイルプレビュー表示のイベント追加 fileを選択時に発火するイベントを登録
  $('form').on('change', 'input[type="file"]', function(e) {
    var file = e.target.files[0],
        reader = new FileReader(),
        $preview = $(".preview");
        t = this;

    // 画像ファイル以外の場合は何もしない
    if(file.type.indexOf("image") < 0){
      return false;
    }

    // ファイル読み込みが完了した際のイベント登録
    reader.onload = (function(file) {
      return function(e) {
        //既存のプレビューを削除
        $preview.empty();
        // .prevewの領域の中にロードした画像を表示するimageタグを追加
        $preview.append($('<img>').attr({
                  src: e.target.result,
                  width: "150px",
                  class: "preview",
                  title: file.name
              }));
      };
    })(file);

    reader.readAsDataURL(file);
  });
});

```
rake routesで表示されるURLについて　[ 自分用メモ ]

例)

Prefix
user_omniauth_authorize 

Verb
GET|POST 

URI Pattern
/users/auth/:provider(.:format)             

Controller#Action
users/omniauth_callbacks#passthru {:provider=>/facebook|twitter/}

<br>
・VerbのGET|POST、2つ書いてあるのは、どちらでも確認できるよということ。
・/users/auth/:provider(.:format) の「:provider」の「:」が付いていたら、
その後ろは数字や文字列など何でもいい。今回の場合は、「:provider」のproviderには、{:provider=>/facebook|twitter/}で、facebook|twitterが入る。
<br>
/blogs/:id(.:format)などの場合は、：id、のidには数値が入る。
Swift UITableViewCellでxibを使うとエラー "Must translate autoresizing mask into constraints to have _setHostsLayoutEngine:YES."

xibを使って、カスタムセルを実装しようとしたら、"Must translate autoresizing mask into constraints to have _setHostsLayoutEngine:YES."というエラーが出て、2時間くらい悩んだ。

# 要約
* トップレベルのviewをUITableViewCellにすることで回避

# 今回の原因
* 「UIView」が最上部にきていた
* xibファイルを作った時、デフォルトがUIViewになっている

![NGパターン.png](https://qiita-image-store.s3.amazonaws.com/0/35979/a53ae066-a579-9978-5893-431eff744fc5.png)

# 正しい指定方法
* Viewを消して、UItableViewCellを最上位のViewにすること

![OKパターン.png](https://qiita-image-store.s3.amazonaws.com/0/35979/be1ae1c3-fa47-c034-eddf-c352f691abb5.png)

xibを使ったのが初めてだったので、ハマった。。（使っている人ならわかったのかもしれないけど。。）
StackOverFlowもチェックマークの箇所しか見てなかったけど、ページ下部までよくよく見たら、書いてあるじゃないか。。！今後は、ちゃんと最後まで読もう。。(´･ω･`)

参考）
http://stackoverflow.com/questions/24217195/why-do-i-get-must-translate-autoresizing-mask-into-constraints-to-have-sethost
httpリクエストを発生させる前に、どのようなリクエストが発生するのか事前に確認する方法　[ 自分用メモ ]

1. Chrome Devツールで、HTMLを見る。
例)
a href="/users/auth/facebook"
※ /users/auth/facebookのURLに遷移することがわかる。<br><br>

2. 同じく、DevツールのNetworkページを見る。
Networkページの状態から、Facebookログインボタンを押下する。
すると、Name欄の上の方に「facebook」と表示があるので、クリックする。
すると右側のGeneralの欄にRequest URLや、Request Methodなどの情報が載っている。
更に下にスクロールすると、色々な情報が載っている。
Vue, JSX, Polymer...なぜJavaScript、HTML、CSSを一緒にしたがるのか

JavaScriptとHTMLとCSSはわけたほうがいいのに、そう思ってた時期が私にもありました。

ですが、一緒くたにする妥当な理由があったみたいです。

# 二つの指針

コンポーネントのモジュラリティを図るのに重要な指針が二つあります。凝集性と疎結合性です。

凝集性はモジュール内のプログラム片同士の依存度の高さです。
疎結合性はモジュール間の依存度の低さです。

両者が高いのが、モジュラリティの高いコンポーネントです。モジュラリティの高いコンポーネント同士を組み合わせると、問題を不要に複雑にすることなく解決することができます。

#JavaScript HTML CSS
HTMLは文書構造、CSSは見た目、JavaScriptは動作とわけられます。
これはjQueryが目指した世界でもあります。

ですがご存知の通り、SPA全体をjQueryで組むとひどいことになります。
理由は簡単で、解決すべき問題のデータを、HTMLの構造に直接マッピングできないからです。

さきに書いた通り、情報処理はあるデータをあるデータに変換することです。jQueryは、イベントをうけとり、DOMを操作します。DOMの構造が問題のもつデータの構造と一致しない場合、そのマッピングのため、ひどい操作を強いられます。

#JavaScript Template CSS
そこで登場するのがテンプレートエンジンです。テンプレートエンジンは少ない学習コストで、解決すべき問題のデータと、DOMの橋渡しを行います。

```

<div>私は{{person.name}}です。</div>

```

ですが、この分割は無用な複雑性を生みます。ぱっとみよさそうですが、なぜでしょう？

##データの流れをみる
データはJavaScriptからTemplateに流し込まれます。また、イベントはDOMから発火されます。JavaScriptはDOMの情報を知っている必要があります。
さらに、見た目を更新しないといけない場面も多々あります。よってデータの流れからみる依存関係は、

JavaScript -> Template & CSS

です。ここまでならいいんです。これなら分けたほうがいいです。私も今までここまでしか見えてませんでした。

##コードの依存関係を見る
ですが、ちょっと待ってください。コードだってデータです。その依存関係を洗い出す必要があります。
上のテンプレート、よくよく見てみると、 **person.name** があります。この情報、どこからきたかと考えると、JavaScriptなわけです。
つまり、 **JavaScriptのもつ論理構造なしに、テンプレートは存在しえない** のです。
ここでコードの依存関係は、こうなります。

Template & CSS -> JavaScript

なんということでしょう、循環参照してしまいました。
凝集性の観点から、一緒にしたほうがいい、という結論になってしまいました。

#果たして代替案はあるのか
まず、なぜ分けたいのかを考えると、デザイナがJavaScriptを触れないから、というのが９割くらいだと思います。
よって、要件としては

* HTML＆CSSである

さらに、ヘッダ、フッタ等、複数ファイルで重複すると非常に面倒なことになりますので、

* Layout、Partialの仕組みがある

さらに、もともとの要件であるので

* JavaScriptの論理構造に依存しない

なので、こんなのはどうでしょう。

```

<template id="todo">
  <div class="todo-name">記事を書く</div>
</template>

<template id="todo-list">
  <todo class="todo-items" />
</template>

```


JavaScript側は

```js

viewmodel: {
  todoItems: [
    {todoName: "記事を書く"}
  ]
}

```

……うーん。ぱっとみよさそうですが、よくよく考えると微妙感が。でも、だれか作ってそうです。

と本題に関しては終わったので、投げっぱなしで終わります。
learnyounode をやってみてコードを書く以外で躓いたのでメモ

[nodeschool](http://nodeschool.io/)にあるワークショッパー（学習用モジュール）でlearnyounodeを進めてnode.jsを学んでみました。npm, node.jsは既にインストールされている前提で進めますが、

#learnyounode
ワークショッパーの一つでnode.jsをコンソール上で学習できるモジュールです。問題は全13問で下記のタイトルになります。問題に正解すると[完了済み]になります。
<img width="541" alt="スクリーンショット 2016-03-06 21.06.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/59560/689bf89e-0845-2b03-f61c-edb6e27f05e0.png">

#環境
- mac 10.10.5
- Atom 1.5.3
- node.js 5.4.1
- npm 3.3.12

#learnyounodeを始める
モジュールをインストールした後は```learnyounode```を叩けば青背景の問題画面が起動します。

#日本語にする
初回は英語で設定されているため問題を読んでもよくわかりませんでした。なんと画面下にある言語設定から日本語設定ができます。
![スクリーンショット-2016-03-06-21.19.34.png](https://qiita-image-store.s3.amazonaws.com/0/59560/0061ed2c-e4b2-7824-9e14-5b1745f9d907.png)

#コマンドライン引数とは？
コマンドライン引数は、コンソールで下記「1 2 3」のように実行ファイルの後ろにつけるだけで、プログラムにこのデータを引数として渡すことができます。

```
$ node program.js 1 2 3
```

プログラムでの呼び出しは```process.argv[0]```と引数を呼び出すことができます。引数は0から始まります。

#getMonth()が0から始まる
問10にある年月日時を取得してコンソールへ表示するプログラムで、new Date()を利用するが、このときgetMonth()だけ0から始まります。例えば、現在が３月なら３ではなく２が代入されます。これはjavascriptに限ったことでなく、古くからのLinux仕様。そのため、「なぜ？」と問われても仕様ですと答えることになります。

#問題の日本語が難しい
このlearnyounodeは、外国の方が日本語訳されて作ってくれたらしいので所々意味がわからない点や面白い文章があります。理解が難しい場合は英語に直すか、前後の問題から読み取って回答しましょう。

#解答をチラ見しよう
何十分も調べて考えているのに、全然答えが合わなくて！という人がいると思います。ワークショッパーにあるモジュールは全てgithubに載っているので答えをチラ見することができます。行き詰まったら、下記リポジトリにある```exercises/問題名/solution/solution.js```にそれぞれ記載されているので困ったときに確認してみてください。

https://www.github.com/workshopper/learnyounode
EP 14 Prefer Exceptions to Returning `None`


> - Functions that return None to indicate special meaning are error prone because None and other values (e.g. zero, the empty string) all evalute to False in coditional expressions.
- Raise exceptions to indicate special situations instead of returning None. Expect the calling code to handle exceptions properly when they're documented.

> Effective Python



Compare None with is operator

```python
def divide(a, b):
    try:
        return a/b
    except ZeroDivisionError:
        return None

```



`None` is error prone

```python
result = divide(x, y)
if result is None:
  print('Invalid inputs')

```

Compare None with is operator

```python
x, y = 0, 5
result = divide(x, y)
if not result:
  print('Invalid inputs')
```


To avoid this case:

- to split the return value into a two tuple.(like Golang but I never see this pattern in python)
- raise an exception up to the caller and make them deal.

1.

```python
def divide(a, b):
    try:
        return True, a/b
    except ZeroDivisionError:
        return False, None

```


2.

```python
def divide(a, b):
    try:
        return a/b
    except ZeroDivisionError as e:
        raise ValueError('Invalid inputs') from e

```

Make sure that you document this behavior.
Git bash 上から Python インタプリタを起動する

Git for Windows を 1.9.5 から 2.7.2 にアップデートしたところ、python が...

# pythonインタプリタが起動しない
C:\Python27 にPATHを通した状態で、Git Bash を起動する。
おもむろにpythonと叩くと..

```
$ python
```
... 返ってこない。

# 対策
以下のような alias を ~/.bashrc あたりに書いておく。
(そして source ~/.bashrc して読み込ませる)

```lang:bash
alias python='winpty python.exe'
```

# 解決
```
$ python
Python 2.7.11 (v2.7.11:6d1b6a68f775, Dec  5 2015, 20:32:19) [MSC v.1500 32 bit (
Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
```
起動するようになった。

# その他
ちなみに、ipython を pip で install したらいつも間にか alias に下記が追加されていた。

```
alias ipython='winpty ipython.exe'
```

調べたところ、下記のような仕掛けがされている。Git 2.5.2(2) からの様子。
![vscode-alias.PNG](https://qiita-image-store.s3.amazonaws.com/0/1982/4756b3c8-b18d-80d7-8188-1e18098609d3.png)
これは、/etc/profile.d/aliases.sh に記載されている。コマンドにパスが通っていたらaliasする仕組みだ。
API GatewayのMapping Templateの記法

# はじめに

API GatewayのMapping Templateは非常に強力なツールですが、その活用方法についてはまとまった資料が無いので以下に整理しました。

# Apache VTL

Mapping Templateの記法はApacheの[Velocity Template Language](http://velocity.apache.org/engine/devel/vtl-reference-guide.html)が用いられています。これ、Apacheのヘビーユーザーには慣れた言語かもしれませんが、僕のようなアプリケーションエンジニアには馴染みのないものでした。しかし、こAPI GatewayをHTMLのテンプレートエンジンとして活用してみようという僕の思惑にぴったりと当てはまるものだったので、きちんと把握するためにも以下に主な記法をリストアップしました。

## 変数の宣言と代入

```
#set($var = $foo)
```

もちろん、`$var = $foo -1` のような計算や、`$var = 'hoge'` のようなラテラル文字列の代入も可能です。

## If文

```
#if($var == $foo)
  ...
#elseif($var < $foo)
  ...
#else
  ...
#end
```

If文による条件分岐も可能です。条件式は`=='や`<`といった記号のほか、`eq`や`ne`といった文字列の比較演算子も使えます。

## Foreach文

```
#foreach($var in $foo.ist)
  ...
  #break
#end
```

Foreach文で配列を処理することも出来ます。Tableも簡単に作れますね。`#break`でループを中断させることも可能です。

## Stop文

```
  ...
#stop
  ...
```

ここで出力を中断できます。あまり用途は思い浮かびませんが、途中で出力を止められます。


## コメント

```
## This is a single line comment.
#*
  This is a multi line comment.
*#
```

ここで出力を中断できます。あまり用途は思い浮かびませんが、途中で出力を止められます。

## 使えなさそうなものたち
Apache VTLに定義されているものでも、以下のディレクティブは利用できなさそうです。このうち、`#include`と`#parse"は利用するとエラーになりました。

```
#include(arg [arg2...argn])
#parse(arg)
#evaluate
```
KafkaをPHPで動かしてみる

# 前提
- Kafkaを起動できること

# 環境
- CentOS-6.7
- kafka-0.9.0
- PHP-5.6.19

# PHPクライアントライブラリ
`Kafka`のPHPのクライアントライブラリは探すと幾つか出てきますが、 今回は`Kafka`の公式サイトに紹介されている`phpkafka`を使います。`phpkafka`のビルドには`php-rdkafka`を必要とするのでそちらもインストールします。

- https://github.com/EVODelavega/phpkafka
- https://github.com/edenhill/librdkafka


## インストール

### 事前に必要となるライブラリをインストールする
```
$ sudo yum groupinstall -y --enablerepo=remi "Development Tools"
$ sudo yum install zlib zlib-devel openssl openssl-devel cyrus-sasl2 cyrus-sasl-devel
```

### php-rdkafkaのインストール
```
$ git clone https://github.com/edenhill/librdkafka/
$ cd librdkafka
$ ./configure
$ make 
$ sudo make install
```

### phpkafkaのExtension作成
```
$ git clone https://github.com/EVODelavega/phpkafka.git
$ cd phpkafka
$ phpize
$ ./configure --enable-kafka
$ sudo make install

$ php -m | grep kafka
kafka
```

### 読み込めない場合
自分の環境では以下のエラーが出てライブラリを上手く読見込めなかったので、librdkafka.soをインストールしたパスを設定する必要があるため以下を実行しました。

```
$ php -m
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/kafka.so' - librdkafka.so.1: cannot open shared object file: No such file or directory in Unknown on line 0
```

```
$ sudo touch /etc/ld.so.conf.d/librd.conf
$ sudo sh -c 'echo "/usr/local/lib" >> /etc/ld.so.conf.d/librd.conf'
$ ldconfig  <-- 設定を更新
$ ldconfig -p  <-- 反映されたか確認する
```

## 実際に動かしてみる

kafkaを起動させて`test_topic`というトピックを予め作成して、メッセージを送ってみようと思います。

### Producer
メッセージを送る側のスクリプト

```php
<?php

$kafka = new Kafka("localhost:9092");
try {
    $kafka->produce("test_topic", "test_message");
} catch (Exception $e) {
    echo $e->getMessage() . PHP_EOL;
}

$kafka->disconnect(Kafka::MODE_PRODUCER);
```

### Consumer
メッセージを受け取る側のスクリプト

```php
<?php
 
$kafka = new Kafka("localhost:9092");
$partitions = $kafka->getPartitionsForTopic('test_topic');
$kafka->setPartition($partitions[0]);
$offset = 1;
$size = 1;

while (1) {
    try {
        $messages = $kafka->consume("test_topic", $offset, $size);
        if (count($messages) > 0) {
            foreach ($messages as $message) {
                echo $message . PHP_EOL;
                $offset += 1;
            }
        }
    } catch (Exception $e) {
        echo $e->getMessage() . PHP_EOL;
        break;
    }
}

$kafka->disconnect();
```

### 実行結果
![kafkaphp.gif](https://qiita-image-store.s3.amazonaws.com/0/13703/54fb9cae-fc4f-f211-0647-b0bb241c04d6.gif)


## 感想
今回使ったPHPクライアントライブラリはHigh Level APIに対応していないのかZooKeeperを使った方法が分かりませんでした。
他のPHPクライアントライブラリを探すと色々出てきて、下のものならHigh Level APIに対応していそうなので今度はそちらを試してみたいと思います。
- https://github.com/arnaud-lb/php-rdkafka
Pleiades All in one Eclipseを用いたStruts2公式ブランクプロジェクトの導入

# まえがき

かつてStruts2の導入は非常に手がかかる問題がありましたが、mavenの導入ならびに初期設定が完了しているブランクプロジェクトの入手により、すぐに開発が可能です。
このブランクプロジェクトは「アーキタイプ(archetype)」として公式サイトから提供されています。

今回はmavenが導入済みであるEclipseのPleiades All in one Eclipse 4.5.x, 4.6.x での導入手順について紹介します。

## Eclipseのmaven設定

まずEclipseの設定から、Struts2のアーキタイプを導入するmavenの設定を行います。

Eclipseの設定を開き、Maven > アーキタイプ > リモートカタログの追加 を選択します。

![archetype選択.png](https://qiita-image-store.s3.amazonaws.com/0/13268/9c4bf845-79ec-2b57-a508-b9a3473cf921.png)

リモート・アーキタイプ・カタログ のダイアログにて、以下を入力します。

|項目名|内容|説明|
|:---|:---|:---|
|カタログ・ファイル|http://struts.apache.org/|アーキタイプを公開しているURL|
|説明|任意のテキスト|アーキタイプ・カタログの名前を任意でいれます。インストール時に使います。|

これを入力したあと、左下の「検証」ボタンを押し、6つのアーキタイプが見つかりました、と出たらOKを押します。

これでアーキタイプの追加が完了しました。

次に、このアーキタイプからブランクプロジェクトを作ります。

## プロジェクトの作成

左ペインから、新規 > その他 を選択します。

![archimport1.png](https://qiita-image-store.s3.amazonaws.com/0/13268/187e0b73-2055-95ed-8c4b-d693f2ceafb5.png)

ウィザードから Maven > Mavenプロジェクトを選び、「次へ」を押します。

![archimport2.png](https://qiita-image-store.s3.amazonaws.com/0/13268/54d89ca9-c7f6-7650-397d-75bdad8e93b3.png)

プロジェクト名およびロケーションの選択では、そのまま「次へ」を押します。

![archimport3.png](https://qiita-image-store.s3.amazonaws.com/0/13268/e9fa7bfd-4c43-1a6e-77ba-5c4d4e751769.png)

アーキタイプの選択 で、利用するアーキタイプを選びます。
カタログで、先ほど追加したアーキタイプ・カタログの名前を選択します。

![archimport4.png](https://qiita-image-store.s3.amazonaws.com/0/13268/de5e1875-ef40-363e-fabd-4b3728693cd3.png)

するとStruts2-archetypeが6種類表示されます。

一番シンプルなプロジェクトは一番上のblank、アノテーションベースの設定が可能な convention が上から2番目です。

今回は convention を選びます。

![archimport5.png](https://qiita-image-store.s3.amazonaws.com/0/13268/90dcda58-23c2-ab23-ccfe-f41e0dc24de8.png)

最後に、作成するプロジェクトの名称を設定します。

任意の値を入れてください。これで完了です。

あとはWebコンテナに搭載してアプリケーションを実行することができます。

EclipseのWTPを使って動作させる方法は以下に公開しています。
[EclipseでWTPを使ったアプリケーションサーバを準備する](http://qiita.com/alpha_pz/items/57c574c622fdaba152ff)
[R]主成分分析を行うスクリプト

# R言語で主成分分析を行うスクリプト

```r:07_PCA.R
#-------Making data------------------------------ 
data_iris<-iris[,1:4]

#-------Get and save PCA result-----------------
#PCAを行う
#center = TRUE 平均を0に正規化する
#scale = TRUE 分散は１に正規化する
pca_result<-prcomp(data_iris, center = TRUE, scale = TRUE)

#主成分得点
pca_score <- pca_result$x
write.csv(pca_score, "07_output_pca_score.csv", quote=FALSE, row.names=FALSE)

#固有ベクトル
eigenvector <- as.data.frame(pca_result$rotation)
rownames(eigenvector)<-colnames(data_iris)
write.csv(eigenvector, "07_output_eigenvector.csv", quote=FALSE)

#標準偏差、寄与率(分散比)、累積寄与率(分散比の累積値)
pca_summary<-NULL

standard_deviation<-pca_result$sdev
pca_summary<-cbind(pca_summary,standard_deviation)
  
proportion_of_Variance<-standard_deviation^2/sum(standard_deviation^2)
pca_summary<-cbind(pca_summary,proportion_of_Variance)

cumulative_Proportion <-cumsum(proportion_of_Variance)
pca_summary<-as.data.frame(cbind(pca_summary,cumulative_Proportion))

rownames(pca_summary)<-colnames(pca_score )
write.csv(pca_summary, "07_output_summary.csv", quote=FALSE)
```

上記の主成分分析の結果をプロットするプログラムも載せておきます。

```r:07_PCA.R
#--------------------------------------Plot----------------------------------------
ScatterplotMatrix <- function(DataMatrix,color) {
  panel.cor<-function(x,y,digits=2,prefix="",cex.cor,...){
    usr<-par("usr")
    on.exit(par(usr))
    par(usr=c(0,1,0,1))
    r<-cor(x, y)
    txt<-format(c(r,0.123456789),digits=2)[1]
    if(missing(cex.cor))
      cex.cor<-0.8/strwidth(txt)
    text(0.5,0.5,txt,cex=1.5)
  }
  
  #Set histogram panel
  panel.hist.density<-function(x,...) {
    usr <- par("usr")
    on.exit(par(usr))
    par(usr = c(usr[1:2], 0, 1.5) )
    h <- hist(x, plot = FALSE)
    breaks <- h$breaks
    nB <- length(breaks)
    y <- h$counts
    y <- y/max(y)
    
    #draw density
    tryd <- try( d <- density(x,na.rm=TRUE,bw="nrd",adjust=1.2),silent=TRUE)
    if(class(tryd) != "try-error") {
      d$y <- d$y/max(d$y)
      lines(d,col="blue",lwd=1.5)
    }
  }
  
  
  #Set lower panel
  panel.lower <- function(x, y, ...){
    points(x, y, pch = 21, col = color)
  }
  
  pairs(DataMatrix,upper.panel=panel.cor,diag.panel=panel.hist.density,lower.panel=panel.lower)
  
  return
}

png("07_output1.png") #Open device
ScatterplotMatrix(pca_score,iris$Species)
dev.off() #Close device

png("07_output2.png") #Open device
plot(pca_summary$cumulative_Proportion)
dev.off() #Close device
```

結果
![07_output1.png](https://qiita-image-store.s3.amazonaws.com/0/111514/21535ce5-0906-0c51-b499-9f45b23cfdf9.png)
![07_output2.png](https://qiita-image-store.s3.amazonaws.com/0/111514/dcb7a564-2368-9ae0-9127-f282bba5d7ec.png)
swift2.0でのシェア方法の自分用メモ

## UIActivityViewController版
```swift
    func share1() {
        let shareText     = "テキストテキスト\nテキストテキスト"
        let shareWebsite  = NSURL
        let shareImage    = UIImage
        let activityItems = [
            shareText,
            shareWebsite,
            shareImage,
        ]
        let vc = UIActivityViewController(activityItems: activityItems, applicationActivities: nil)
        presentViewController(vc, animated: true, completion: nil)
    }
```
    
## UIActivityViewControllerを使わない版
```swift
    func share2() {
        let shareText     = "テキストテキスト\nテキストテキスト"
        let shareWebsite  = NSURL
        let shareImage    = UIImage
        let scl: SLComposeViewController = SLComposeViewController(forServiceType: SLServiceTypeTwitter)
        scl.setInitialText(shareText)
        scl.addImage(shareImage)
        scl.addURL(shareWebsite)
        presentViewController(scl, animated: true, completion: {})
    }
```
docker run実行時のiptablesエラー

Dockerホスト上でdb01 サーバなるコンテナをdocker run しようとしたら、なんとiptables のエラーでコンテナを作成できない。。。。
どうしよう。。。

■ エラー内容

```
docker: Error response from daemon: failed to create endpoint db01 on network bridge: COMMAND_FAILED: '/sbin/iptables -t nat -A DOCKER -p tcp -d 0/0 --dport 3306 -j DNAT --to-destination 172.17.0.2:3306 ! -i docker0' failed: iptables: No chain/target/match by that name..
```


■ 解決方法
Docker 管理のネットワークファイルの再構成をします。

```
# mv /var/lib/docker/network/files /tmp/docker-iptables-err
# systemctl restart docker
```


■ 補足
/var/lib/docker/network/files を削除しただけで、既存コンテナは問題なく通信できます。
さすがにdocker デーモンの再起動ではコンテナは止まりますが、再起動後、ネットワークは問題なく利用できました。
開発環境でFacebook、Twitter、DEVISEの認証ができない問題　[ 自分用メモ ]

<h1>原因</h1>
<p>1. usersテーブル(DEVISE)にある、以前に登録した自分のFacebookアカウントの既存のレコードが邪魔していた。<br><br>
2. 自分のFacebookアカウントの既存のレコードは、usersテーブル(DEVISE)のconfirmed_atカラムがnilであった。<br>つまり、認証が確認されていなかった(confirmedは確認という意味)。<br>ユーザー認証を正しく実装できていない時期に登録していたデータが残っていた。<br>(上書きは当然できないので、何度、Facebook認証ボタンを押しても無駄だった。)<br><br>
3. SMTPエラーが発生していた。エラー文を見ると、メールが飛んでいない。<br>printenvコマンドを実行すると、開発環境(Nitrous)に対して、SENDGRID_USERNAME、SENDGRID_PASSWORDの環境変数が設定されていなかった。
</p>

<h1>解決方法</h1>
<p>1. usersテーブル(DEVISE)にある、以前に登録した自分のFacebookアカウントの既存のレコードを削除した。<br>SQLのDELET文で。(原因、1、2を解決)</p>
<p>2. 開発環境(Nitrous)に対して、SENDGRID_USERNAME、SENDGRID_PASSWORDの環境変数を設定した。<br>heroku configコマンドで、SENDGRID_USERNAME、SENDGRID_PASSWORDの値を確認。<br>exportコマンドで、各環境変数を設定した。<br><br>export SENDGRID_USERNAME="hogehoge"<br>export SENDGRID_PASSWORD="fugafuga"</p>
<p>以上で解決した。</p>
Kraken APIをPythonで使ってみる

#経緯
BitFlyer Lightningでレバ取引をしていたら、ほかの人の自動売買プログラムによって、買いオーダーが一掃された。（APIにバグがあったらしい）
FXでのビットコインの相場が46000から30000まで一気に下がり、自分もロスカットされた。
怖くなったのでとりあえず他のところにも分散させよう！
ということで、マネーパートナーズと業務提携するという噂のKrakenを触り始めたので，こちらもAPIを触ろうと思った．

#APIドキュメント
APIの仕様は
[API Documentation](https://www.kraken.com/help/api)

Krakenは各言語での実装例を紹介している
[APIクライアントの例](https://www.kraken.com/help/api#example-api-code)


#使ってみる

Python2.7.11を使っているので、APIクライアントの例にリンクがある
[python2-krakenex](https://github.com/veox/python2-krakenex)
を使用した。

セットアップは

```bash
git clone https://github.com/veox/python2-krakenex.git
cd python2-krakenex
python ./setup.py install
```

これで、

```py
import krakenex
```

呼び出せる。

```py
#!/usr/bin/env python
# -*- coding:utf-8 -*-

import krakenex

k = krakenex.API('key','secret')

total_balance = k.query_private('TradeBalance', {'asset': 'ZJPY'})['result']['tb']
print total_balance

ticks = k.query_public('Ticker',{'pair':'XXBTZJPY,ETHXBT,ETHJPY'})['result']
print ticks
```

これで、日本円換算のデポジット額、BTC/JPY、ETH/BTC、ETH/JPYのティッカーが取得できる。

レスポンスはJSON。

krakenの公式ドキュメントを見るとPublicAPIとPrivateAPIがあるので、それに応じてquery_publicとquery_privateを使い分ける。
pairのリストを指定されているところは、

```python
'XXBTZJPY,ETHXBT,ETHJPY'
```

のように1つの文字列として扱う。

以上
『パターン認識と機械学習の学習』の学習 1章

最初にお断りしますが、私も勉強中で正確な定義はあやふやです。とんでもない間違いをしている可能性がありますが、もし、ご理解に役立てば幸いです。

#第1章 「序論」のための確率用語の学習の学習

##1.1 確率変数は変数なのか

###1.1.1 確率空間（Ω, F, P）
<dl>
<dt>集合</dt>
<dd>「集合」って正式な定義は難しいのだけれど、まずは「集まり」くらいでよいのではないか。また、集合を具体的に表すときは、自然数の集合Ω={1, 2, 3, ...}のように書く。</dd>
<dt>部分集合</dt>
<dd>部分集合とは集合のなかの一部の集まりのこと。</dd>
<dt>集合族</dt>
<dd>集合族とは部分集合の集まりのこと。</dd>
<dt>元</dt>
<dd>集合の要素のこと。</dd>
</dl>
* 例
    * 曜日の集合：{日, 月, 火, 水, 木, 金, 土}
        * 曜日の部分集合の１つ：{月, 水}。あるいは、{日, 金, 土}。
        * 日、月、… それぞれが元。
    * 整数の集合：{..., -2, -1, 0, 1, 2, ...}
        * 整数の部分集合の１つ：自然数：{1, 2, 3, ...}
        * 整数の部分集合の１つ：偶数　：{2, 4, 6, ...}
        * 整数の部分集合の１つ：{1, 3, 8}
        * ..., -2, -1, 0, 1, 2, ... それぞれが元。

<dl>
<dt>σ加法族</dt>
<dd>次頁に説明がありますが、まー普通使う数字の集まり、くらいで最初はよいのではないか。<br />
長さ、面積、体積などを拡張した考え方として測度がある。その測度の考え方の中に加法族がある。加法族とは集合演算をしたときにその集合が閉じているもの。つまり、集合の和や積をした結果がその集合のなかに含まれるもののこと。無限加算個まで考えた加法族のことをσ加法族という。</dd>
</dl>
たとえば整数の集合Ωを考える。その部分集合である、集合A={1, 2, 3}, 集合B={2, 3, 4}のAとBの和（重複しない足し算）={1, 2, 3, 4}であり、AとBの積（両方の部分集合に含まれるもの）={2, 3}であるが、{1, 2, 3, 4}も{2, 3}も元の集合である整数の集合Ωに含まれているので加法族である（正確な定義では和と積以外の演算もあるが、ここでは省略）。<br />
また、同じく整数の集合Ωを考えた場合に、その部分集合である、偶数の集合A={2, 4, 6, ...}と奇数の集合B={1, 3, 5, ...}の和は{1, 2, 3, ...}であり、積は∅（空集合）である。どちらも無限個あるが数えられるので無限加算個であり、元の集合Ωに含まれているのでσ加法族である（空集合もΩに含むと考える）。<br />
って感じに普通考える数字はσ加法族になっている。
</dl>

<dl>
<dt>互いに素</dt>
<dd>2つの整数が1と-1以外に互いに共通の約数を持たない場合に、互いに素という。例4と10は共通の約数2を持つので互いに素ではない。3と14は1と-1以外に共通の約数を持たないので互いに素である。</dd>
</dl>

<dl>
<dt>一様分布</dt>
<dd>サイコロの出目のように、それぞれの出来事（事象）の確率が等しい場合の分布のこと。</dd>
</dl>



###1.1.2 σ加法族
<dl>
<dt>合併</dt>
<dd>集合の和のこと。</dd>
<dt>共通部分</dt>
<dd>集合の積のこと。</dd>
<dt>補集合</dt>
<dd>その部分集合を除いた残りの集合のこと。</dd>
</dl>
```math
\begin{align}
集合AとBの和（合併）&：A\cup{B} \\
集合AとBの積（共通部分）&：A\cap{B} \\
集合Aの補集合&：A^c  （別の書き方では  \bar{A}） \\
AはBの元&：A\in{B}
\end{align}
```
<dl>
<dt>余事象</dt>
<dd>事象Aに対して、事象Aが起こらないこと。</dd>
</dl>


###1.1.3 確率変数X
なし

###1.1.4 確率変数は写像である
なし

次は[『パターン認識と機械学習の学習』の学習　第2章](http://qiita.com/aokikenichi/items/6bcd1c68be4ee47a63e7)
最短経路の求め方　アルゴリズム解説編


最短経路の求め方です。

この記事から読む場合はまずは[問題編](http://qiita.com/izmktr/items/eb2aae1c544ca6f17b88)を見てください

基本的にはスタート地点から隣接するマスに移動時間を設定していきます。
図示するとこんな感じですね。
![s01.png](https://qiita-image-store.s3.amazonaws.com/0/985/24f48fad-c506-1bdf-293c-7bcfcc84fb32.png)

ですが、今回の問題の場合、昇り降りするより回りこんだほうが早いという現象が起こります。
オレンジ色を一段高い場所として同様に計算してみましょう。
![s02.png](https://qiita-image-store.s3.amazonaws.com/0/985/7b1641f5-e12f-3d34-28fb-7660ac4b6574.png)
背景が青くなっている場所は赤い場所を13の時間として計算した場所です。
ここは回りこんだことにより12と計算されますので、再度計算が必要になります。
このように、一直線で進むより回りこんだほうが早い地形が出てくる場合は、
次に探査するマスの順序を移動時間の小さい順にしたほうがよいです。
先ほどのマップですと、3→6→9の順で探索していくことで、12が先に埋まり、
13と計算して進めていた部分がなくなるので無駄が減ります。
![s03.jpg](https://qiita-image-store.s3.amazonaws.com/0/985/6cadaff2-faff-be3e-16fe-8d4a597abb66.jpeg)
とはいえ、250x250のマップに対してこの探索順序の入れ替えをしなくても
1ms以下で探索が終わったのでさほど速度的には貢献しないかもしれません。

ゴールが決まっている場合は、ゴールから遠ざかる方向に対して探索しても無駄に終わることが多いので、
この優先度にゴールまでの予想時間を加えることで、効率よい探索ができるようになります。
これが「A*」と呼ばれるアルゴリズムです。
![s04.png](https://qiita-image-store.s3.amazonaws.com/0/985/e4854bb6-e799-6b77-6ab3-9050fcae6f8a.png)
今回は1マスを進むのが大体3かかるので、ゴールまでの単純距離×3を予想時間としてカッコ内に併記しています。
黄色い部分はスタートから近いので普通ならここからの探索もするのですが、
緑の部分の優先度が15のため、黄色い部分からの探索がされることはありません。
「電脳体「キュラゲタム」を討伐せよ」の解説

以前、CodeIQでモンハンとのコラボ問題で「[電脳体「キュラゲタム」を討伐せよ！](https://codeiq.jp/q/2574)」というのがあって、
解答募集期間も過ぎたので解説記事でも書こうと思ったんですが…。
期限が終わると問題すら見られないようになってしまうんですね、残念。

問題の概略を書きます。
標準入力からこんなデータをもらいます。

```text
4 5
32445
33434
21153
12343
```

最初がマップの大きさ、今回は4×5のマップという意味で、それ以降が実際のマップデータです。
数値は高さを表していて、小さいほど低く大きいほど高いという意味になります。
このマップを左上からスタートして、すべての山頂を通り左上に戻る最短時間を求めるのが問題です。
山頂とはマップの中で一番高い点、今回だと5の高さの部分2箇所です。
移動は隣接しているマスに移動でき、斜めには移動できません。
移動時間は同じ高さなら3、1段下がる場合は2、1段上がる場合は11かかります。
2段以上の段差は上りでも下りでも移動できません。

この問題は左上と山頂、または山頂と山頂の最短経路を求める問題と
どういう順序でそれぞれの山頂を巡っていくかという巡回セールスマン問題とに別れます。

私も、最短経路の方が難しそうと思って挑んだのですが、
実際に難しいのは巡回セールスマン問題の方でした。
最初に提出した解答はマップが大きくなると一気に時間がかかるようになりタイムアウト。

「最短経路の求め方」と「巡回セールスマン問題」の2つに分けて記事にします。
Rで数値実験結果をすばやくTexの表に


## はじめに
Rで数値実験を行い、それをTexにまとめるときみんなどうしてるんだろうか

1. 1つずつ入力
2. RのTex出力系パッケージを使う

自分は１で1つずつ入力していたのだが、そろそろきつくなってきた。しかし、Texに詳しいわけでもなく、ましてやRのTex出力系ライブラリにも詳しくない（日本語記事もあまりなく）ので、最低限出力できて少し自動化すればいいやと思ったので、そのやり方を共有

はっきり言って自分だけしか使えないと思うので、Tipsでもなんでもなくただのメモ

## パッケージ

自分は```Hmisc```パッケージを使う。基本の解説は[こちら](http://stat.biopapyrus.net/dev/latex.html)にあるとおり

## 使い方

```R
install.packages("Hmisc")
library(Hmisc)
```

## 自分のよくあるケース
- パラメータ1（P=1）、パラメータ2（P=2）… のときに、それぞれのモデルの精度の平均と標準偏差を出力したい
- 3ケタ表示で
- 平均 ± 標準偏差
- 標準偏差は文字を小さく（というか、 **_** で）

### データ

```R
# 値はこの例ではランダムで
vec.mean1 <- runif(6, 0.5, 1.0) %>% sprintf("%.3f", .)
vec.sd1 <- runif(6, 0.01, 0.1) %>% sprintf("%.3f", .)
vec.mean2 <- runif(6, 0.5, 1.0) %>% sprintf("%.3f", .)
vec.sd2 <- runif(6, 0.01, 0.1) %>% sprintf("%.3f", .)
vec.mean3 <- runif(6, 0.5, 1.0) %>% sprintf("%.3f", .)
vec.sd3 <- runif(6, 0.01, 0.1) %>% sprintf("%.3f", .)
# データフレーム作成
df <- data.frame(P1 = paste0("$",vec.mean1,"_{¥pm ",vec.sd1,"}$"),
                 P2=  paste0("$",vec.mean2,"_{¥pm ",vec.sd2,"}$"),
                 P3 = paste0("$",vec.mean3,"_{¥pm ",vec.sd3,"}$")
                 )
# 行名
rownames(df) <- c("model1", "model2", "model3", "model4", "model5", "model6")
```

### 表示
```R
latex(
  df,                   # 配列型のデータ
  file="",              # LaTeX ファイルの保存先
  title="Model",        # 1行1列目のセルの内容
  label="table1",       # LaTeX の \label に相当
  caption="table1の結果" # LaTeX の \caption に相当
)
```

すると、以下のように出力される

```
%latex.default(df, file = "", title = "Model", label = "table1",     caption = "table1の結果")%
\begin{table}[!tbp]
\caption{table1の結果\label{table1}} 
\begin{center}
\begin{tabular}{llll}
\hline\hline
\multicolumn{1}{l}{Model}&\multicolumn{1}{c}{P1}&\multicolumn{1}{c}{P2}&\multicolumn{1}{c}{P3}\tabularnewline
\hline
model1&$0.570_{¥pm 0.089}$&$0.608_{¥pm 0.019}$&$0.651_{¥pm 0.015}$\tabularnewline
model2&$0.824_{¥pm 0.097}$&$0.525_{¥pm 0.067}$&$0.626_{¥pm 0.066}$\tabularnewline
model3&$0.724_{¥pm 0.077}$&$0.789_{¥pm 0.100}$&$0.921_{¥pm 0.036}$\tabularnewline
model4&$0.973_{¥pm 0.027}$&$0.848_{¥pm 0.021}$&$0.807_{¥pm 0.055}$\tabularnewline
model5&$0.999_{¥pm 0.026}$&$0.761_{¥pm 0.061}$&$0.804_{¥pm 0.028}$\tabularnewline
model6&$0.574_{¥pm 0.097}$&$0.792_{¥pm 0.037}$&$0.524_{¥pm 0.074}$\tabularnewline
\hline
\end{tabular}\end{center}

\end{table}
```

つまり、以下のようにTexで表示される

![スクリーンショット 2016-03-06 21.06.32.png](https://qiita-image-store.s3.amazonaws.com/0/69266/d600b626-e864-7b42-7c22-8d148fad8612.png "スクリーンショット 2016-03-06 21.06.32.png")


### おわりに
- 実際は、これの```model1 〜 model6``` の行をコピペして貼り付けてる
- latex関数でもっとできるんだろうけど、使い方がいまいちわからない。。（ドキュメント読めというのは置いておいて）楽したいので一旦これで。
- みんなはどのようにRでの数値結果（data.frame）をTexに落とし込んでいるのかなー？

### 参考
- [Latex表組み](http://stat.biopapyrus.net/dev/latex.html)
ESP8266 | AD2 > ユニバーサル基板実装 >3代目動かなかった問題 > 解決 > GNDの実装１つずれ問題

http://qiita.com/7of9/items/b8426623d6349e119fea
において５枚のユニーバサル基板のうち、３代目が動かなかった問題。

```txt:道具
Analog Discovery 2 (以下 AD2)
```

AD2で測定して1分で解決。

シリアルのGNDを実装していなかった。
正確に書くと「FTDIのGNDにつながるストレートピンヘッダの反対側のリード線の実装が１つずれていた。ただのランドにGND用リード線がはんだ付けされ、その反対側はピンも出ていない状態だった」。

AD2でGNDのピンヘッダを測定するとやたら波形が乱れるので、はんだ付けを見たら「１つずれていることに気づいた」。
Code Complete？でいうところの [off-by one error](http://qiita.com/7of9/items/9cf5e9c1e8751c23dbd5)をコードでなくハンダ実装でもやってしまった。

問題の対応に推測であれこれやった10時間ほどの試行錯誤は何だったのかという感じ。

やはり、きちんと測定してから次の手を考えないと、時間を無駄にしてしまう。

AD2買ってよかった。

<hr>
(追記 2016/03/07)
実はデジボルで導通を確認してれば解決したかもしれない。

基板上の導通は確認したはずだが、シリアルのGNDだけはチェックしていなかった。
Windows7からWindows10へのアップデート検証（その１）

# まずはまるごとバックアップ

Windows10への期間限定の無料アップグレードが終わる前に、サポート期間が先に切れるであろうWindows7からアップグレードしておきたいですが、色々な互換性が心配です。

普段使っているアプリケーションや周辺機器が使えなくなってしまっては、元も子もありません。

そこでまずOSまるごとバックアップして別のSSDで起動できるようにして、そこでアップグレードして問題無ければ移行という事にしましたが、まずバックアップリストアでハマったのでメモ。

## 使用したソフト

Windows標準のバックアップ機能もあるのですが、DISKからDISKへ直接クローンしたかったので、以下のフリーソフトを利用しました。

[EaseUS ToDo Backup](http://jp.easeus.com/backup-software/free.html)

今の最新バージョンは9.1でした。

## クローンの前に

念のため、システムバックアップでまるごとのバックアップを別のHDDに保存しようと思い実行したところ、気づいたらPCの電源が落ちていました。
後から気づいたのですが、デフォルトでバックアップ後にシャットダウンする設定になっているようです。

ただここで問題が発生、PCの電源が入りません。
PCは自作なのですが、マザーボードと電源ユニットは以下を使っています。

[MSI 990FXA-GD80](http://www.msi-computer.co.jp/MB/990FXA-GD80/#img/990FXA-GD80_Box.jpg)
[COUGAR GX G1050](http://cougargaming.com/products/discontinued/cougar_gx_v2.html)

今までもたまーに発生する不具合だったのですが、時間が経つと急に治ったり、電源ユニットのコンセントを抜き差ししたら治ったりしていましたが、今回は治りませんでした。

何故かバックアップをトリガーに完全死亡したのか？と思い焦って色々やってみたところ、最終的にマザーボードに接続している電源コネクタを抜き差ししたら復活しました。

電源が復活すると、電源オフ時でもマザーボード上の電源ボタンのLEDが光る仕様なのですが、抜き差ししたらそれが光るようになったので、電源ユニットかマザーボードのどちらかが要因のようです。
同じパーツを使用していて、同じ症状になった場合は、上記対策を試してみてください。

## クローンを実行

OSが起動している状態より、Bootディスクで起動してクローンした方が確実かと思って、Linux版のBootDiscを作成して起動して実行しました。
Linux版だとできる事が少なくて、ほんとにクローンくらいしかできません。
クローンはソースとデスティネーションを選ぶだけの簡単操作ですが、SSDに最適化のチェックだけはつけました。
セクターbyセクターは、クローン先の方が容量小さいので使えません。

## クローンしたSSDで起動

新しいSSDはSanDiskのUltraIIの480GBを使用しました。
最近はSSDもかなり安くなってきて、480GBだとたったの１万５千円です。
現在付けているSSDは512GBですが、当時は3万5千円くらいしました。
そして接続を新しいSSDだけに差し替えて起動したところ、再び問題発生。

真っ黒画面に文字だけでWindowsが起動できないからインストールディスクで修復しろとのメッセージ。
今までこういう画面が出てディスク入れて修復かけても直った試しが無いので、クローンは使えないと思って諦めました。

SSDを古いほうに切り替えて起動したところ、またまた問題発生、SSDを認識しません。
これも今までたまーに出ていた現象ですが、CrucialのM4の持病で、ディスク自体の内部の遅延処理が完了するまで、BIOSからの識別要求に応答すら返せなくなるほどビジーになるので待つしかないという有名なアレです。

処理中は、SSDに耳を当ててみると、キュルキュルピコピコキュルピコって妙な電子音が聞こえるのですが、それが聞こえなくなると、処理が終わった合図です。
おもむろに再起動すると無事にBIOSに認識されました。
クローンを取ると、ソースのSSDに負荷がかかるんでしょうか。。。

OS起動してから、クローンを諦めきれずにググったところ、クローン後に起動できないのはよくあるので、修復ディスクで起動して修復すれば起動するようになるとの情報を見つけました。
まさかと思って再度SSDの接続をまた変えて起動し、修復を試みましたが、２回やっても症状変わらずでした、やはりダメなものはダメのようです、クローンは完全に諦める事にしました。

## クローンしてしまった新しいSSDを初期化

バックアップから戻すには、SSDを新旧両方接続する必要がありますが、新しい方は起動できない割にはWindows7の起動ディスクの状態になっているので、起動したところ、システム領域として認識されてしまいました。

リストアするには、一度ディスクを消さないとならないのですが、システム領域なので消せませんというメッセージが出て消せません。
試行錯誤の末にダイナミックディスクにしてしまったのですが、更に状況が悪化しました。
diskpartというコマンドで、ベーシックディスクならシステム領域になっていても消せたのですが、ダイナミックディスクだと絶対消せないのです。

万策尽きたかと思いましたが、WinPE版のEaseUS ToDo Backupを起動して、DiskWipe機能を使うことを思いつきました。
デフォルトで3回ディスクを上書きして、データを復元不可能にする完全消去機能なので、非常に時間がかかりましたが、どうにかこうにかダイナミックになってしまったシステム領域を持ったディスクが綺麗に消えました。
これだけ色々やって、ようやく振り出しまで戻ってこれた感じです。

## バックアップイメージからリストア

まっさらに消えた新しいSSDをただのベーシックディスクと認識した状態で古いSSDで起動できたので、あとは普通にバックアップイメージからリストアするだけです。
この時に、下手にパーティションを新しいSSDに作っていると、リストアできないエラーになるので、完全に領域を未定義にする必要がありました。
リストアはそれほど時間もかからず完了しました、最初からこれをやっておけば何時間も無駄にしないで済んだのにと思いました。。。

## リストアしたSSDから起動

今度は起動できないエラーも出ずに、サクッと立ち上がりました。
そしてずっとタスクトレイに出ていてウザいだけだったWindows10アイコンをクリックしてアップグレードを実行したところ、失敗して再びWindows7が起動してきました。

原因はWindowsUpdateですべての最新アップデートがインストールされていなかったからのようで、出てきたWindowsUpdateの画面でアップデートを実行したところ、2回目はアップグレードが成功しました。

ようやく、Windows10のようこそ画面が表示されて、検証環境の起動にこぎつけた感じです。

## 続きは次回で。。。

ここまででトラブル続出で、かなりの長時間を要してしまって力尽きたので、実際の各種動作確認結果は、次回の記事で書きたいと思います。
Express.jsで、配列型のフォームデータを受け取る方法

* Express.js: 4.13.4
* body-parser: 1.13.3

以下の様なフォームで、`text`という名前のデータを配列で送信したい。

```
<!DOCTYPE html>
<title>テスト</title>
<form method="post" action="/form">
  <label>テキスト１: 
    <input type="text" name="text[]" value="text1">
  </label>
  <label>テキスト２: 
    <input type="text" name="text[]" value="text2">
  </label>
  <input type="submit" value="送信">
</form>
```

![Kobito.GLSgPS.png](https://qiita-image-store.s3.amazonaws.com/0/81715/4954c578-b75e-28d4-0df1-da8d8f346744.png "Kobito.GLSgPS.png")

express-generatorでExpress.jsアプリケーションの雛形を作ると、フォームのボディをパースするミドルウェアとして`body-parser`が使われるが、デフォルトでは

```
app.use(bodyParser.urlencoded({ extended: false }));
```

となっている。ここを、

```
app.use(bodyParser.urlencoded({ extended: true }));
```

としてあげと、`req.body.text`が配列になる。以下の様に`req.body.text`を返すようにしてあげると、

```
router.post('/form', function(req, res, next) {
  res.json({ texts: req.body.text });
});
```

以下のようなJSONがクライアントに返される。

```
{"texts":["text1","text2"]}
```
Dockerコマンドについて調べたことのまとめ

# はじめに
最近Dockerを触る機会があったので簡単に使用方法をまとめておく
同じ環境を高速・手軽に何度でも作成できる利点からソフトウェアのバージョンアップ検証に使用した。
有効な使用方法を考えていきたいが、今のところ手元の環境を汚さないように検証作業を行いたい場合に有効と考えている。コンテナ上でサービスを起動させて外部公開、もできそうだが運用上どうなるだろう。

# 使用フロー
Dcokerを使用する際の基本的なフロー ※Dockerはインストール済みとして
1. イメージ検索
1. イメージをpullしてくる
2. コンテナを起動させる
3. コンテナ内で検証作業等を実施
4. コンテナから抜ける
5. コンテナを削除
6. 以下2～5をループ

ざっくり流れとしてはこのような形で使用した。
必要であれば5の削除はしないで再アタッチして使用することも

# コマンド
検証環境情報: CentOS 7

## Dockerインストール
    # yum install dokcer

## Dockerイメージの検索
    # docker search centos

## Dockerイメージをダウンロード
    # docker pull centos

## Dockerイメージ情報の確認
    # docker images

## コンテナ起動
    # docker run -it "コンテナ" /bin/bash

## コンテナから抜ける
    # exit

## コンテナの状態を確認
    # docker ps -a

## コンテナ削除
    # docker rm "削除対象コンテナ"

# 今後
コンテナ上でsystemctlコマンドを使用する方法も調べたので後日更新する。
一般的な会員制ウェブサービスでは仮登録とユーザー情報とユーザー認証を別テーブルにした方がいいと思う

一般的な会員制ウェブサービスでは
ユーザー仮登録 => メールアドレス認証 => ログイン処理
という手続きを行う。

これを実現するためにユーザーテーブルにユーザーの登録状態や認証状態などのカラムが追加されることが多い。
しかし、ユーザーテーブルにこれらが集約された設計では、ユーザーの状態を考慮しないクエリを発行してしまうことによるバグが発生しやすい。またクエリの条件が増え複雑になりやすい。
そこで、仮登録、ユーザー、認証、トークンの４つにテーブルを分割することで、その類のバグを減らすことができ、仮登録や認証を実装する際にも様々な恩恵が受けられる。

仮登録テーブル（仮登録時にレコードが追加される。）
 - メールアドレス
 - パスワード
 - 認証トークン
 - 仮登録日付

ユーザーテーブル（メールの確認処理が終わると追加される)
 - ユーザーID
 - メールアドレス

認証テーブル
 - ユーザーID
 - パスワード

トークンテーブル(JWTなど永続化不要な仕組みを使う場合は不要)
 - ユーザーID
 - 認証トークン
 - 認証トークン有効期限

この設計にすると認証時のSELECTで余計な情報を取ってきてしまったり、仮登録の人は除かなきゃとか考えなくて良くなる。
あと仮登録と認証の部分だけやっぱキーバリューストアにしようとかもあとから簡単にできる。

ユーザーの退会を考えるとユーザーの状態を意識しないといけないが、それでも全部ユーザーテーブルに突っ込むよりはずっといいと思う。
Ansible で ESXi を操作してみる[初期テスト]

# Ansible で ESXi を操作してみる[初期テスト]

# 目的
* vSphere Client からぽちぽちせずに ESXi を操作したい
* ansible を使うことで構成管理と自動化も視野に
* 最終的には VM の自動作成をしたいなと

# 構成 (2016/03/06 時点)
* ansible 2.0
    * mac os x el capitan
    * ubuntu 14.04

```
$ sudo pip install ansible
$ ansible --version       
ansible 2.0.1.0
```
* ESXi 5.1 u3 (Freeライセンス)
    * 古いですね、すみません。わけあってこのバージョン…
    * ssh サーバを有効にする

# 事前準備

## ansible を導入した端末のターミナルソフトから ssh 接続を 1 回済ませておきます
例:

```
$ ESX_IPADDR='192.168.100.8'
$ ssh root@${ESX_IPADDR}
(snip)
Are you sure you want to continue connecting (yes/no)? yes
(snip)
~ # exit
Connection to ${ESX_IPADDR} closed.
$ 
```
# 接続テスト
## 接続先ホストの設定ファイルをつくる
```
~$ mkdir -p ansible/esxi-test/
~$ cd ansible/esxi-test/
```
```
ESX_HOST_FILE=esx-host
```
```
cat << EOF > ${ESX_HOST_FILE}
[esxi]
    ${ESX_IPADDR}
EOF
```
```
cat ${ESX_HOST_FILE}
```
正常出力例:

```
[esxi]
    192.168.100.8
```

## ESXi サーバに接続して date コマンドを実行してみる

```
~/ansible/esxi-test$ ansible esxi -i ${ESX_HOST_FILE} -u root -k -m raw -a "date" -c paramiko
SSH password: <- ESXi の root パスワードを入力して Enter
${ESX_IPADDR} | SUCCESS | rc=0 >>
Sun Mar  6 10:48:02 UTC 2016
```

日時が表示されたら成功です

* ubuntu で以下のエラーが出る場合は sshpass をインストールしてください

```
to use the 'ssh' connection type with passwords, you must install the sshpass program
```

```
$ sudo apt-get install sshpass
```
ESP8266 | AD2 > 1MHz 50% duty測定のリンギング対策 > リード線を短く > リンギング取れた

http://qiita.com/7of9/items/aaa5dcdf471f748f1206
の続き。

```txt:道具
Analog Discovery 2 (以下 AD2)
```

リンギングをどうにかしないといけない。
そうしないと夜もぐっすり寝れない。

3月２日に発注しておいてBNCコネクタや60MHz用オシロプローブは未到着。

代わりにMILコネクタ関連を昨日の買い出しで買っておいた。

[macsbugさんの助言](https://macsbug.wordpress.com/2016/02/21/%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%EF%BC%91%EF%BC%90%E3%81%A7%E7%B5%84%E3%81%BF%E4%B8%8A%E3%81%8C%E3%82%8B-d1-mini-%E7%B5%84%E3%81%BF%E7%AB%8B%E3%81%A6/#comment-129)
によるリード線を短くするのを試す。

## v0.1 > 30pinコネクタ使用

### 材料

- ICクリップ (先端が折れ曲がったフック？のタイプ)
  - ミヤマ, MJ-033Y, 75円 (黄色)
  - ミヤマ, MJ-033G, 75円 (緑色)
- MIL系コネクタ用ボードソケット
  - R.O.C, 2801-30, 30Pin, 82円
- リード線
  - AWG24
  

以下のように半田づけ。

![DSC_0141.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/e4a8f478-96eb-3804-52cc-94c7e38e7b26.jpeg)

### 使用と結果

使用の様子。

![DSC_0142.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/c925fae3-557f-290f-adf5-52d113a621b9.jpeg)

下の写真が結果であるが、リンギングはなくなっている。

AD2付属のリード付きコネクタに戻すとリンギングが発生するので、一応リンギングはこれで除去できたようだ。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/7f6c373f-4248-327a-25f6-5f746fa4cd8f.png)

macsbugさんの助言に感謝。


上記の１つの問題点は、AD2からコネクタを抜きにくい点。今はラジオペンチで引き抜いているが、そうするとコネクタそのものが痛む。かと言ってそのコネクタを挿しっぱなしのままでいるのも使いにくい。

## v0.2 > 30pinコネクタの廃止

30pinコネクタの抜き差しがしずらいという問題は30pinコネクタを使わないということで解決。

以下とした。使っているのは延長用リード線（コネクタがオス、メスのもの: ピン配列変換・延長ケーブル USBタイプ 8本入り 185円)。

![DSC_0144.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/4dd81d75-e403-15f9-6754-4a9b0cccc24e.jpeg)

以下のようにメスコネクタを直接AD2に挿す。抜き差しはしやすく、かつ安定している。

![DSC_0145.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/366f43f9-76af-8e53-8cc4-fad569fc8d81.jpeg)

結果の波形。
少しとがっている部分があるが、[こちら](http://qiita.com/7of9/items/aaa5dcdf471f748f1206)の２つめの結果よりは改善している気がする。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/e1602edd-22b5-a49e-051f-9a3cbd7625b7.png)

もしかして到着待ちのオシロプローブは不要だった？という考えが頭をよぎり始めたが、きっと何かでどうしても必要になるはず、としておく。
ransackでRailsアプリのヘッダーに検索機能をつける

ヘッダーに検索ボックス(機能)つけたい！！！
イメージ↓↓↓↓↓
![スクリーンショット 2016-08-13 20.59.28.png](https://qiita-image-store.s3.amazonaws.com/0/95469/ca17e47f-578b-6563-5857-2b6f60bf62aa.png)

application.html.erbにヘッダーの記述があるサンプルです。

ransackのGithub
https://github.com/activerecord-hackery/ransack


## Gemfile

```
gem 'ransack'
```
追加してbundle install

## コントローラ
```ruby:application_controller.rb
before_action :set_search

def set_search
  #@search = Article.search(params[:q])
  @search = Article.ransack(params[:q]) #ransackメソッド推奨
  @search_articles = @search.result.page(params[:page])
end
```
application_controllerということに注意
仮にarticles_controllerに書くとarticles_controllerを使わないページを表示した時にエラーになる。
kaminariでページネーションをつけているのでpage(params[:page])をつけた。
searchメソッドよりransackメソッド推奨なのでransackメソッドを使った。(下のコメント参照)

## ビュー(検索ボックス側)
```erb:application.html.erb
<dl class="searchbox">
  <%= search_form_for @search, url: articles_path do |f| %>
    <dt><%= f.text_field :title_cont ,placeholder: '検索するテキストを入力...' %></dt>
    <dd><%= f.submit ("検索") , class: 'search-btn'%></dd>
  <% end %>
</dl>
```
url:でリダイレクト先を指定した。
:???_contで検索したいカラムを指定できる。

## デザインのサンプル
```css:application.css
/* 検索ボックス */
dl.searchbox{
  width: 350px;
  position:relative;
  background-color:#fff;
  border:1px solid #aaa;
  border-radius:6px;
}
dl.searchbox dt{
  padding:3px;
}
dl.searchbox dt input{
  width:70%;
  height:30px;
  line-height:30px;
  background:none;
  border:none;
}
dl.searchbox dd{
  position:absolute;
  top:1px;
  right:1px;
  width:30%;
}
.search-btn{
  display:block;
  background:#5fad35;
  width:100%;
  height:36px;
  line-height:36px;
  border:none;
  border-radius: 0 6px 6px 0;
  color:#FFF;
}

.search-btn:hover {
  background:#228B22;
}
```

## ビュー(表示側)
search_form_forで指定した(articles_path)リダイレクト先
今まではarticles_controllerで

```ruby
def index
  @articles = Article.all
  〜略〜
end
```
で

```erb
<% @articles.each do |article| %>
〜略〜
<% end %>
```
で記事一覧を表示させていた。
検索した場合はapplication_controller.rbで@search_articlesに検索された結果が返ってくるので

```erb
<% @search_articles.each do |article| %>
  〜略〜
<% end %>
```
に書き換える。
検索してない場合は全てのデータが返ってくる。
<h2>まとめ</h2>


## 参考サイト
RubyDoc.info
http://www.rubydoc.info/gems/ransack/1.7.0#Ransack__search_method