OmniAICreator/Qiita-1.07M huggingface dataset:
iCloudDrive / DropBoxとのファイル連携

iOS(swift)でiCloud Drive / DropBoxとファイルの連携を行う

UIDocumentPickerは、ファイルの操作（アップロード、ダウンロード）についていい感じのUIを提供してくれます。
外部のストレージのサービスとの連携が楽になります。

エクスプローラよろしく、
・フォルダを指定して、そこにアップロード
・ファイルをタップして選択、そしてダウンロード
ができます。
サービスの切り替えも、UI上で可能です

DropBoxは独自にファイル選択のUIを持っていますが、UIDocumentPickerを使えば、だいたい同じ見た目で、操作可能です。
(内部的にDropBoxのアプリを呼んでいるようなので、完全なる一致はないですが）

LowLevelなAPIでの実装も可能ですが、いつも通り
XCode 7.2では動かなくなっちゃったので、需要があれば直して公開します。

・前提
　- DropBoxとの連携を行う場合、DropBoxのアプリがインストールされている事
　- エラー処理はちゃんとやりましょう
　- デリゲートを実装しましょう
　
・Export
// URLは、ファイルを想定しています。
let documentPicker = UIDocumentPickerViewController(URL: url, inMode: UIDocumentPickerMode.ExportToService)
documentPicker.delegate = self
self.presentViewController(documentPicker, animated: true, completion: nil)

・Import
let array = ["public.image"]
let documentPicker = UIDocumentPickerViewController(documentTypes: array, inMode: UIDocumentPickerMode.Import)
documentPicker.delegate = self
self.presentViewController(documentPicker, animated: true, completion: nil)


・デリゲート
func documentPicker(controller: UIDocumentPickerViewController, didPickDocumentAtURL url: NSURL) {
        
}
func documentPickerWasCancelled(controller: UIDocumentPickerViewController) {
        
}
MessageDigestの使い方

#Java.security.MessageDigest のメソッド

1. コンテキストをリセットし、初期状態へ戻すメソッド
  -  void reset()

2. アルゴリズムへデータを入力するメソッド 
  - void update(byte input)
  - void update(byte[] input)
  - void update(byte[] input,int offset, int length) 


3. 入力したデータ全体に対するハッシュ値を取得するメソッド。同時に 現 テキ ト 使用終了を宣言する
  - byte[] digest()
  - byte[] digest(byte[] input)
  - byte[] digest(byte[] input,int offset, int length) 


#マルチスレッドプログラミングの注意点
　MessageDigestクラスはスレッドセーフではないことを注意必要です。
  MessageDigest のインスタンスはひとつのコンテキストのみ保有するのでスレッド間で共有してはいけない。

1. 毎回MessageDigest のインスタンスを生成することで解決の一つ方法です。
　　MessageDigest.getInstance(String)
2.  MessageDigestのインスタンスをThreadLocalに保存すること

備考：
org.apache.commons.codec.digest.DigestUtilsはスレッドセーフであり、これを利用してもよいです。
javascript備忘録(2) 〜ひたすら基礎〜

# javascript基礎②

## 演算子
演算子はたくさん種類がある。よく使うものとしては、**算術演算子**や**代入演算子**などが挙げられる。  
また、**演算子は必ず何かを返す**。

### 演算子の種類

#### 算出演算子
- 「+」「-」「*」「/」「%」は、四則演算を表す算術演算子という
- 演算結果を返す

#### 代入演算子
- 「=」「+=」「-=」「*=」「/=」「%=」などのことをいう
- 代入された値を返す

#### 関係演算子
- 「<」「>」「<=」「>=」などのこと
- 主に条件分岐で使用される
- 「==」と「===」、「!=」と「!==」といったものもあるが、これは型チェックするかどうかの違いとなる

### 演算子の優先順位・特徴
- 算数の「+」よりも「×」が先に計算しなくてはならないように、演算子には優先順位がある
- 代入演算子よりも算術演算子のほうが優先順位が高い（先に処理される）
- 代入演算子は右から計算される

```:javascript
num = 3 + 5;
// この場合はnumに3が代入されてからnumに5が足されるのではなく、numに(3+5)が代入される。

a = b = c = d = 5;
// 右から計算されるため、a,b,c,dすべてに5が代入される。
```

## 文字列の連結
- 算術演算子のなかの「+」（加算演算子）を使用することで**文字列を連結**できる

```javascript
var ichi = '1';
var ni = '2';
console.log(ichi + ni); // => 12
//ichiとniには文字列として数字が入っているためこのような結果となる。

var ichi = 1;
var ni = 2;
console.log(ichi + ni); // => 3
//この場合はichiとniには数値が入っているため算術計算が行われる。

var ichi = 1;
var ni = '2';
console.log(ichi + ni); // => 12
//こちらのケースは文字列と数値が連結させる処理が行われている。結果は文字列が返る。
```

## 条件分岐
- 条件分岐とは場合場合により処理を変えること

### if文、else文、else if文
`if (式) { 処理1 } else { 処理2 }`のような書き方をする

- 式の値が`true`ならば {処理1}を行う。{処理2}は行わなれない。
- 式の値が`false`ならば {処理1}を行わなれないが`else`に続く{処理2}を行う。
- else文、else if文を使うことによって「この場合はこの処理、この場合はこの処理、どちらでもない場合はこの処理」のようなことが可能となる

例えば下記の場合は、`(age >= 20)`は`false`、つまり`(false)`となるため、`else`に続く処理が行われる。

```:javascript
var age = 18;
var nen;
if (age >= 20) {
  nen = '成人';
} else {
  nen = '未成年';
}
console.log('あなたは' + nen + 'です'); // =>あなたは未成年です
// 仮に age = 21 だった場合は (age >= 20)は(true)となる。
```
bundler でnokogiriがインストールできなかった件の対応 実はbrew側の問題だった

# ３行で事情を説明

- 年末年始休暇の間で、プライベートのmacでbundle install を試し成功
- 職場で使っているmacで同様にやろうとしたら、nokogiriのインストールでつまづく
- この環境下では、ライブラリをbrew link してなかったことが原因だった

なお、プライベートのmac、職場のmacのOSはどちらも EL Capitan。

# エラー発生

Railsプロジェクトに対し、bundleでプロジェクト用のgemをインストールしようとした時に、なにやらエラーが。

```bash:terminal
$ bundle install --path vendor/bundle

（前略）
Installing nokogiri 1.6.7.1 with native extensions

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    /Users/rojiuratech/.rbenv/versions/2.2.3/bin/ruby -r ./siteconf20160105-45677-tur1ij.rb extconf.rb --use-system-libraries
checking if the C compiler accepts ... yes
checking if the C compiler accepts -Wno-error=unused-command-line-argument-hard-error-in-future... no
Building nokogiri using system libraries.
libxml2 version 2.6.21 or later is required!
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

（中略）

An error occurred while installing nokogiri (1.6.7.1), and Bundler cannot continue.
Make sure that `gem install nokogiri -v '1.6.7.1'` succeeds before bundling.
```

ここのエラーログを見ると、libxml2のバージョン2.6.21以上が必要とのことだが、実際には

```bash:terminal
$ brew info libxml2 
libxml2: stable 2.9.2 (bottled), HEAD [keg-only]
```

バージョンが古いわけではない。

# brew link が必要だった

シンボリックリンクがなかったようだ？！
これ、プライベートのmacbookでやったかな？やってなかったような。

```bash:terminal
$ brew link --force libxml2
Linking /usr/local/Cellar/libxml2/2.9.2... 82 symlinks created

$ brew link --force libxslt
Linking /usr/local/Cellar/libxslt/1.1.28_1... 22 symlinks created
```


# 再度試す　今度はOK

```bash:terminal
$ bundle install --path vendor/bundle
Using activerecord 4.2.5
Installing nokogiri 1.6.7.1 with native extensions
Installing rails-dom-testing 1.0.7
(中略）
Installing rails 4.2.5
Bundle complete! 1 Gemfile dependency, 34 gems now installed.
Bundled gems are installed into ./vendor/bundle.
```

今度はうまくいった。
Railsのローカル環境でSSL(https)を使う

FirefoxはHTML5のAudioの認証を`http`接続では「常に許可」を選べないのでローカルでSSLを簡単に使う方法を調べてみました。

### やり方

sslの鍵を自分で作ってやる方法とかが紹介されてたんですが、めんどくさいのでもっと簡単な方法探したら

```Gemfile
gem 'thin'
```
として`bundle` それから`thin start --ssl -p 3001` でローカルにSSLな環境ができました。とても簡単、素晴らしいですね。

あとはブラウザで`https://localhost:3001`にアクセスすると「証明書あかんやつやで。」と文句言われるので例外サイトに追加して置きましょう。

### 参考

http://stackoverflow.com/questions/21189920/configuring-webrick-to-use-ssl-in-rails-4

http://stackoverflow.com/questions/34552133/why-there-is-no-always-allow-option-in-firefox-when-using-getusermedia
【C#】WindowsFormのデザイナを開く際にエラーが出る場合


windowsFormを使うことは減ってきているかと思いますが、3パターン認識しております。


#LoadイベントにNewされていないオブジェクトが実行されている
デザイナを開くときにコンストラクタとLoadが暗黙的に走っている。
その際にメソッドに対するオブジェクトがないというエラーが出る。

if (this.DesignMode == true)
			{
				return;
			}

【非常に役に立ちました。↓】
http://anopara.matrix.jp/2014/03/10/cform%E3%81%AE%E3%83%87%E3%82%B6%E3%82%A4%E3%83%8A%E3%81%8C%E3%82%A8%E3%83%A9%E3%83%BC%E3%82%92%E5%90%90%E3%81%84%E3%81%9F%E6%99%82%E3%81%AE%E5%AF%BE%E5%87%A6/

#デザイン系のライブラリのバージョンに乖離がある
デザイン周りを独自実装していたりするとバージョンに乖離がないかをチェックする


#謎系
バックアップとって、あらゆるものの再起動、クリーン、リビルド行為にて解決
Redis 最短入門(3)Pythonでも5分でAPI


Pythonだともう少しサッパリとしますが、
URLはサッパリしてません。お好きな方を。
※エラーなどは知りませんがお試しで。

> sudo yum -y install python pip
> pip install redis

> mkdir api; cd api

./cgi-bin/get.py を下記のように編集
(python 2 系　cgi-bin以下にいれるのと、実行権限chmod +x がいります)


> python -m CGIHTTPServer &

> curl http://0.0.0.0:8000/cgi-bin/get.py?id="key"

`{"items": "value"}`

※こちらも下準備でredisサーバーをたちあげて値をいれてください
`redis-cli > SET "key" "value" `




```py:get.py
#!/usr/bin/python
# coding: utf-8

import redis
import json
import cgi

form = cgi.FieldStorage()
print 'Content-Type: text/html\n\n'
if form.has_key("id"):
    id=form["id"].value
    r=redis.Redis()
    value=r.get(id)
    print json.dumps({'items':value})
```
一時的にPATHを追加する（Linux）


一時的にデフォルトで入ってるソフトウェアを使いたいとき等に使えます。

sh 系（bash, zsh等）

```Shell
$ export PATH="<追加したいパス名>:$PATH"
```

csh 系（tcsh等）

```
% set path = (<追加したいパス名> $path )
```

####参考

[http://www.bnote.net/linux/path.shtml:title]
Fedora 20のwifiドライバ設定（MacBook Pro retina）


MacBook Pro retinaにFedora 20をインストールしたとき，ネットワーク設定に躓いたので備忘録として。


----

Fedora 20はデフォルトではMacBook Pro retina (Late 2013)のwifiチップに対応していないため，wifiでの接続ができない。MBPのretinaディスプレイモデルにはLANポートもないため，そのままではネットへ接続できないためyum等でドライバをインストールすることもできない。そのため，直接rpmファイルを入手してインストールする必要がある。

MacBook Pro retinaに対応しているwifiドライバは[rpmfusion](http://rpmfusion.org/)で公開されている。ここでドライバを予めUSB等((Fedora 20はデフォルトではexFAT形式に対応していないため注意。[rpmfusion](http://rpmfusion.org/)のFreeリポジトリより，[exfat-utils](http://download1.rpmfusion.org/free/fedora/releases/20/Everything/x86_64/os/repoview/exfat-utils.html)と[fuse-exfat](http://download1.rpmfusion.org/free/fedora/releases/20/Everything/x86_64/os/repoview/fuse-exfat.html)をダウンロードしてインストールする。ネットに接続できている場合はyumで入手できる。))へダウンロードしておき、Fedoraにインストールする。

* ダウンロードするパッケージ（64bit版）
    * [broadcom-wl-6.30.223.141-2.fc20.noarch](http://download1.rpmfusion.org/nonfree/fedora/releases/20/Everything/x86_64/os/repoview/broadcom-wl.html)
    * [kmod-wl-6.30.223.141-5.fc20.x86_64](http://download1.rpmfusion.org/nonfree/fedora/releases/20/Everything/x86_64/os/repoview/kmod-wl.html)
    * [kmod-wl-3.11.10-301.fc20.x86_64-6.30.223.141-5.fc20.x86_64](http://download1.rpmfusion.org/nonfree/fedora/releases/20/Everything/x86_64/os/repoview/kmod-wl-3.11.10-301.fc20.x86_64.html)
* Nonfreeリポジトリのrelease→x86_64内にある。32bit版はrelease→i386に存在する。

その後，ダウンロードしたrpmファイルを端末(Terminal)コマンドで実行する。
このとき，これらのパッケージはそれぞれ相互依存の関係にあるので同時にインストールする必要がある。
※ファイル名は自身がDLしたものに合わせる。
```console:
$ sudo rpm -i broadcom-wl-6.30.223.141-2.fc20.noarch.rpm kmod-wl-3.11.10-301.fc20.x86_64-6.30.223.141-5.fc20.x86_64.rpm kmod-wl-6.30.223.141-5.fc20.x86_64.rpm
```

再起動するとwifiが使えるようになっています。

####参考

[http://kanzmemo.cocolog-nifty.com/blog/2014/04/machddfedora-20.html#more:title]

[http://www.torutk.com/projects/swe/wiki/Linux%E3%81%A7exFAT%E3%82%92%E4%BD%BF%E7%94%A8:title]
【Google日本語入力】Windows10 使ってみて気になったメモ　その２

またもや、Google日本語入力関連で相性の悪いものを発見。

# Google日本語入力とOneNote
この組み合わせの場合、まず言語バーの見え方からしておかしい。
![OneNote.png](https://qiita-image-store.s3.amazonaws.com/0/94543/275ba3b3-5882-38ff-568d-32eef966b9db.png)
英字とかなのモード変換すらできず、日本語入力ができない。

もともと、デスクトップアプリの『付箋』を使っていたのだが、ちょっと動作が怪しい時があったので、ちょっとしたメモ書きを残せて、手軽に閲覧できるアプリを、7時代から入っていたもの、7→10へのアップグレードで標準で入るものから探すと、OneNoteだったので代わりに使ってみた次第。

## 追記
Twitterの『アプリ』でも同様だったので、ひょっとしたら『ストア』のアプリはMS-IMEしか使えんのかも。
Linuxbrewでのgccエラーへの対処法


####症状

linuxbrewで何かをinstallしようとすると

```console
$ brew install lua
Error: lua cannot be built with any available compilers.
To install this formula, you may need to:
  brew install gcc
```
と表示される。

ではbrew install gccを実行すると

```console
$ brew install gcc
==> Installing dependencies for gcc: gmp, mpfr, libmpc, isl, cloog
==> Installing gcc dependency: gmp
Error: gmp cannot be built with any available compilers.
To install this formula, you may need to:
  brew install gcc
```

gccがlinuxbrewに認識されてないのでgccのinstallに必要なパッケージもコンパイルできない。

####解決策
linuxbrewにgccが認識されていないので，~/.linuxbrew/binに既にインストールされているgccへのsymbolic linkを作って認識されるようにする。

まずgccのバージョンを調べる。

```console
$ gcc -dumpversion
4.9.1
```

次にインストールされているgccへのsymbolic linkをはる。

```console
$ ln -s `which gcc` `brew --prefix`/bin/gcc-4.9
```

※gcc-4.9のところは自分の環境のgccのバージョンに合わせる。

_完了_

念のためgcc以外のcpp，g++にも同様の処理を行ってもいい。

```console
$ ln -s `which cpp` `brew --prefix`/bin/cpp-4.9
$ ln -s `which g++` `brew --prefix`/bin/g++-4.9
```


####参考

[http://qiita.com/thermes/items/1ecb0968ab937ff59164:title]
Twilioでwavファイルが502エラーになる原因

:::note alert
2023年5月1日を持ちまして、株式会社KDDIウェブコミュニケーションズのTwilioリセール事業が終了したため、本記事に記載されている内容は正確ではないことを予めご了承ください。
:::

## はじめに
Twilioで音声ファイルを再生する際に、以下のような502エラーが発生する場合の原因を記録しておきます。
![スクリーンショット 2016-01-05 15.50.13.png](https://qiita-image-store.s3.amazonaws.com/0/86046/00dc8363-8ea8-49ed-a922-053a61b4565c.png)
この例では、サーバーからwavファイルをダウンロードしてきた際に、502エラーが発生しましたという内容になっていますが、実際Webサーバーのログを見る限りでは、正しくファイルは提供しています（ステータスコード「200」で応答している）。
試しに、ブラウザからwavファイルを直接指定した場合も、正しく音声が再生されます。
すなわち、Webサーバーはステータスコード「200」で返しているのに、Twilioで呼び出すと502エラーになってしまうという現象です。
## 原因
結論から言うと、Twilio側でwavファイルが正しく認識されていないのが原因です。
例えば、wavファイルが圧縮されてしまっている場合などが該当します。
気をつけなくてはいけないのは、圧縮されているwavファイルでも、先ほどのブラウザで再生されたように、多くの場合、ただしく再生されます。よって、正しいwavファイルなのに、Twilioだとエラーになってしまう→Twilioのバグじゃないの？的な間違った認識をしがちです。
## 調査方法
wavファイルが圧縮されているかを確認するのはなかなか難しいのですが、直接wavファイルの中身を覗いてしまうのが一番確実です。
どうやってやるかというと、バイナリエディタを使います。Macユーザであれば、[0xED](http://www.suavetech.com/0xed/)というフリーのバイナリエディタがおすすめです。
バイナリエディタでwavファイルを開くと、以下の様に内容を表示することができます。
![スクリーンショット 2016-01-05 16.03.42.png](https://qiita-image-store.s3.amazonaws.com/0/86046/a7616059-8581-0542-d535-e1c4da4c3849.png)
注目するべきは先頭の4バイトです。正しいwavファイルの場合は、この画面のように先頭が52494646（'RIFF'）になっていて、さらに"WAVEfmt"という記述も記載されています。
もし先頭がこのようになっていない場合は、正しくない（Twilioでは利用できない）wavファイルですので、正しくファイルを作りなおして下さい。

### 参考
[WAVファイルフォーマット](http://www.kk.iij4u.or.jp/~kondo/wave/#wav)
関数とメソッドの違いがわからなくて少し調べたので自分なりにまとめてみた


##はじめに

関数とメソッドの違いがわからなくて少し調べたので自分なりにまとめてみました

私は現在、Qiitaで初心者向けの[Swiftの初心者向けの記事](http://qiita.com/T-N0121/items/9be20231ec253778586b)を月に1回程度、自分のSwiftへの理解を深めることと、プログラムについて再認識の意味も込めて投稿しています。
その中で関数について書こうと思ったときに「どういう内容を書こう」と考えていました。

・初心者向けの記事だからあまり難しく書かない
・プログラムを書くって思っているほど難しくないよ、楽しいよ！と思ってもらえるように

というのが記事を投稿するにあたって常に考えて投稿するようにこころがけています。

あと、一応プログラム書いたりを仕事にはしていますが、まだまだ勉強不足なので多分認識が間違っている事をツッコんでくださる方がいたら嬉しいなとかも思っています。

前置きが長くなりましたが自分なりの解釈をSwiftをベースにまとめていきます！


##結論　似ているようで違う...らしい
以下IT用語事典より抜粋

###・関数 【 function 】 ファンクション

関数とは、引数と呼ばれるデータを受け取り、定められた通りの処理を実行して結果を返す一連の命令群。
必ずしも数字を扱うものだけを指すのではなく、「入力された文字を画面に表示する関数」なども存在する。
言語によっては引数を取らない関数や結果を返さない関数を作成できるものもあるが、通常はそうしたものは関数とは呼ばないことが多い。

[IT用語事典 関数](http://e-words.jp/w/%E9%96%A2%E6%95%B0.html)

###・メソッド 【 method 】 メンバ関数 / member function

メソッドとは、オブジェクト指向プログラミングにおいて、各オブジェクトが持っている自身に対する操作。
オブジェクトは「データ」と「手続き」から成っているが、その「手続き」の部分に当たる。
プログラミング言語によっては「メンバ関数」と呼ばれることもある。

[IT用語事典 メソッド](http://e-words.jp/w/%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89.html)


###うん?

#オブジェクトは「データ」と「手続き」から成っているが、その「手続き」の部分に当たる。

###???

sono tetsudukino bubunn ni ataru?

関数の説明の部分に

###関数とは、引数と呼ばれるデータを受け取り、定められた通りの処理を実行して結果を返す一連の命令群。

#ん、ナニガチガウノ？

「手続き」と「一連の命令群」って中卒のバカな頭だと同じもののように聞こえます...

##google先生に聞いてみた
「関数　メソッド　違い」で検索してブログやら教えて！gooやらをみて説明を読んでもあまり理解できなかったのですが、IT用語事典の

###メソッドとは、オブジェクト指向プログラミングにおいて、各オブジェクトが持っている自身に対する操作。

うん、これがミソっぽいですね(多分)

####オブジェクト指向プログラム言語で定義されたオブジェクト(クラスや構造体など)で定義された関数と同じような書き方をされたものがメソッドと呼ばれる、それ以外のものは関数と呼ぶ。

違うかもしれませんが私はそういう解釈をしました

例えばSwiftだと
###関数
```function.swift
	
	// 関数の定義
	func sum(a:int, b:int) -> int {
		return a + b
	}
	
	// 関数呼び出し
	let c = sum(a:3, b:4)
	print(c)
	
```

で

###メソッド
```method.swift

	class Math {
		// メソッドの定義
		static func sum(a:int, b:int) -> int {
			return a + b
		}
	}
	
	//メソッド呼び出し
	let c = Math.sum(a:1, b:5)
	print(c) 

```

という感じになるんでしょう！


##おわりに
解釈は間違っているかもしれませんが、ふわふわしてた部分をきちんと調べて一応自分なりに解釈できたのは良かったなと思っています。
今回調べた事をもとに初心者向けの記事を更新したいと思います。

お前その解釈間違ってるよ！とかそういうのありましたらコメントいただけると非常に嬉しいです！


ちなみに、初心者向け記事の投稿には以下の書籍を参考にしながらgoogle先生やらなんやらで調べつつ、なるべく間違いのないように書いてるつもりです

[詳解Swift 改訂版](http://www.amazon.co.jp/Swift/dp/4797386258/ref=dp_ob_title_bk)
![スクリーンショット 2016-01-05 14.53.25.png](https://qiita-image-store.s3.amazonaws.com/0/61480/04d9dde6-5121-7ddd-a856-0308a1f65c96.png "スクリーンショット 2016-01-05 14.53.25.png")

おしまい
[Rails] 特定のURLからの遷移の時のみアクセスできるようにする

# 背景

- アドレスを入力
- メールを送信
- メールを送信したよページに遷移

みたいな一連の流れは、パスワードを忘れた？ 機能を実装する時とかによくやると思う。でも、このメールを送信したよページは、メールを送信していなくてもURLを知っていればアクセスできてしまう。

例:
[path](https://path.com/password/sent)
[instagram](https://www.instagram.com/accounts/password/reset/done/?cp=example@hoge.com)
[qiita](https://qiita.com/sessions/password_sent)

一般的なユーザーは勿論そんなことしないだろうけれど、なんか送信していないのにそのURLにアクセスできてしまうのは、個人的に嫌だった。

# 対処法

セッションを用いて、一時的に値をもたせてあげることで解決した。

```rb:example_controller 
  def send_mail #具体的にメールを送る部分
     # ごちゃごちゃ     
     session[:email_sent] = true     
     redirect_to password_sent_path
  end

  def password_sent #送信完了したときに表示
    if session[:email_sent] # == true 
      session[:email_sent] = nil
    else
      redirect_to root_path
    end
  end
```

これで、メールを送信するアクションが呼ばれた後に呼ばれるリクエスト以外は全てリダイレクトできるようになった。
一つ考えなければいけないのは、リロードしてもリダイレクトしてしまうということだけれども、別に支障もないしこれで良しとした。
play アプリケーションを rpm でデプロイする

## モチベーション

環境的に多段 ssh をしなければならなかったり、起動したり止めたりのスクリプトを作るのが面倒だった。
daemon 化したほうがインフラ管轄の方達も楽そうだった。
sonatype nexus で rpm を管理できることを知った。


*OSX で試しましたよ*


## rpm を作る

sbt, activator, rpm を入れる

```
brew install sbt typesafe-activator rpm 
```

play-scala テンプレートを選ぶ

```
x> activator new 

Fetching the latest list of templates...

Browse the list of templates: http://typesafe.com/activator/templates
Choose from these featured templates or enter a template name:
  1) minimal-akka-java-seed
  2) minimal-akka-scala-seed
  3) minimal-java
  4) minimal-scala
  5) play-java
  6) play-scala
(hit tab to see a list of all templates)
> 6
Enter a name for your application (just press enter for 'play-scala')
> rpm-pack
```

build.sbt を編集する

RpmPlugin を記述

```
lazy val root = (project in file(".")).enablePlugins(PlayScala, RpmPlugin)
```

version にはハイフンが使えないので、
ハイフンを含まない version 記述にするか rpm 用の version を指定してあげる

```
version := "1.0"
```

or 

```
version in Rpm := "1.0"
```

vendor, group, license, package 説明 が必要

```
rpmVendor := "wshino"

rpmGroup := Some("wshino")

rpmLicense := Some("BSD")

packageDescription in Linux := "rpm-pack"

```

OSX の場合は下記の記述が必要

```
rpmBrpJavaRepackJars := true
```

sbt コマンドを実行

```
x> sbt rpm:packageBin
```

エラーはでるけど rpm ができましたよ

## sonatype nexus に登録する

sonatype nexus の導入と rpm repository の作り方は割愛

https://books.sonatype.com/nexus-book/reference/yum.html

## build.sbt 

RpmDeployPlugin を enable にする

```
lazy val root = (project in file("."))
  .enablePlugins(PlayScala, RpmPlugin, RpmDeployPlugin)
```

認証情報と配信先の rpm repository を記述する

build.sbt に書きたくない場合は、別ファイルにしておく。credentials の host 名を書くところは port 番号はいらないです

http://www.scala-sbt.org/0.13/docs/Publishing.html#Credentials

```
credentials += Credentials("Sonatype Nexus Repository Manager", "192.168.99.100", "admin", "admin123")

publishTo := {
  val nexus = "http://192.168.99.100:32679/nexus/"
  if (version.value.trim.endsWith("SNAPSHOT"))
    Some("snapshots" at nexus + "content/repositories/middleware")
  else
    Some("releases"  at nexus + "content/repositories/middleware")
}

```

sbt を実行

```
x> sbt rpm:publish 
```

あとは repository を各インスタンスから引けるようにしておけば yum コマンドで導入できるので楽よ

```
# yum install rpm-pack
```
RSpec3でバリデーションのテスト

Faker, FactoryGirl, RSpec3を使って単純にやってみると

```rb:spec/factories/users.rb
FactoryGirl.define do
  factory :user, class: User do
    email { Faker::Internet.email }
    password { Faker::Internet.password }
  end
end
```

```rb:spec/models/user_spec.rb
require 'spec_helper'

describe User do
  it "should be invalid" do
    user = build(:user, { email: nil })
    expect(user.errors[:email]).to be_valid
  end
end

```
Redis 最短入門(2)5分でAPI

なにも考えずにAPIとして使ってみるまで5分。
コードコピペしてもらえると、コマンドで7行くらい。

node.jsとnpm (node.jsのパッケージ管理ツール)のインストール

> sudo yum install -y nodejs npm --enablerepo=epel

### APIサーバーの作成

パッケージ用にディレクトリ作成
> mkdir myapi ; cd myapi

ディレクトリ内で初期設定、サーバー機能 express とredisクライアントをインストール

> npm init
> npm install express --save
> npm install redis --save

index.js(下記)
まず、シンプルに　/item/"key" として、"key" に登録しているキーを指定したら値をJSONで返すAPIを作成します。

※ポート番号がすでにつかっていたら(apacheがインストールされてる)一番下のポート番号を変えてください


※下準備として　Redis 最短入門(1)　でサーバーを起動し、値をセットしておいてください

`SET "key" "value"`

※"key" と　"value" は任意の値


## 起動させる(http サーバーが立ち上がるので、バックエンドで)
> node index.js &

 http://　IPアドレス　**:**　ポート番号/item/"somekey"　でレスポンス確認

> curl http://0.0.0.0:8880/item/"key"

→　下準備で登録したキー　"key" の値(string)を　JSON形式 {"item":value} で返却されます

app.get('/get/:id',... のところが URL
var server = app.listen(8880, function () {..}
のところがポート番号になります

終了はおもむろにkillしてください


ソースコード例

```js:index.js

var express = require('express');
var app = express();

app.get('/item/:id', function (request, response) {

    var client = require('redis').createClient();
    var id = request.params.id;

    client.get(id, function (err, res) {
        if (err) {
            return console.log(err);
        } else {
            console.log(res);
            response.send(JSON.stringify({'item':res}));
        }
    });


});

app.get('/', function (req, res) {
    res.send('Hello World!');
});

var server = app.listen(8880, function () {
    var host = server.address().address;
    var port = server.address().port;
    console.log('Example app listening at http://%s:%s', host, port);
});
```
Redis 最短入門(1)2行でインストール&起動

#Redis 最短入門(1)2行でインストール&起動
## Redis はKVS(key value store)
NOSQLで軽くJSONとってくるレスポンスブルなサーバーがあったらいいな、という人に。
メモリがあるだけ入って、落としたら消えてなくなってもヘーキなデータベースでいい?

インストールと使ってみるまで泣けるほどカンタン
Redis 最短入門(2)5分でAPI　で、登録した値をJSONを返すAPIサーバーを作成します
CentOSの場合　Amazonのec2などでクリーンインストールの状態からどうぞ!
( sudo yum -y install epel-release )　※epel入ってなければ先に

インストール
> sudo yum -y install redis --enablerepo=epel


なにもせず、おもむろにサーバー起動
> sudo service redis start

※一応、設定ファイル
`/etc/redis.conf`

コンソール起動
> redis-cli


http://redis.shibu.jp/commandreference/index.html

はじめは以下のコマンドで　登録　→　確認　削除、保存　終了などができる

## 値の追加

`SADD` "key" "value1" .."value2"..

- "key"にセットとして要素を追加する

セットの要素数の最大値は 2^32-1（4294967295, 1セットあたり4億以上のメンバ）です。

`SET` "key" "value1" 

- "key"にstringとして要素を追加する



`RPUSH` "key" "value1"  / `LPUSH` "key" "value1" 

- "key"にlistとして要素を追加する (RPUSHは末尾、LPUSHは先頭)


### 値を取り出す、情報を見る

`RANDOMKEY`

- ランダムに一つだけキーを返す、えーっとどんなのがはいってたっけ?ってときに。

`KEYS` "k*"

- パターンマッチで存在するキーを返す。

`INFO`

- サーバーの状態を出す、現在どれくらいのメモリ使ってるかなとか確認

`DBSIZE`

- すべてのキーの件数を返す。INFOはトータル容量なので、キーの件数をみたいときに。

`TYPE`

- TYPE　で型を確認したら、値を表示してみるコマンドの対応は以下の通り。

| none | string | list | set |
|-----------|------------|------------|------------|
| 値なし| GET "key" | LINDEX "0" |  SMEMBERS "key" / SRANDMEMBER "key"|
| 見ても無駄 | キーの値を返す | 指定したindexの要素を返す　| すべてのメンバを返す/セットの中からランダムに一つ返す |


※セットした型と違ったメソッドを使うと怒られる


### メンテナンス　削除、保存、終了

`DEL` "key"

- key の値を削除、型は関係ない


`FLUSHALL` `FLUSHDB`

- すべてのキーを削除(複数DBがあるときは　FLUSHDB)


 `SAVE` `BGSAVE`

- 現在のデータを保存。マシンをシャットダウンして、再起動してもこの状態から始まる
- 保存してる間も作業やアクセスがあるときは　BGSAVE

`SHUTDOWN`

- SAVEと終了を同時に行ってくれる。
IRC BotをCinchで簡単に作れた

## 参考

* [IRCフレームワークCinchで人間でもできるIRCBot - 仮想ヒッチハイキング](http://d.hatena.ne.jp/uiureo2/20110831/1314796449)
* [cinch/examples at master · cinchrb/cinch · GitHub](https://github.com/cinchrb/cinch/tree/master/examples)

## 準備

* [nagiosの状態変更をIRCに通知(nagircbot) - Qiita](http://qiita.com/tukiyo3/items/790a548298f4166c33ae)を参考にIRCサーバを立てておく。

```bash:
sudo gem install cinch
```

* [module Open3 (Ruby 2.3.0)](http://docs.ruby-lang.org/ja/2.3.0/class/Open3.html)

```rb:ircbot.rb
#!/usr/bin/ruby
require 'cinch'

bot = Cinch::Bot.new do
  configure do |c|
    c.server = "localhost"
    c.port = "8888"
    c.nick = "cinch"
    c.channels = ["#chat", "#todo"]
    c.password = "xahH7eo2"
  end

  on :message, /@cinch / do |m|
    command = m.message.match(/@cinch (\w.*)/)[1]
    require "open3"
    out, err, status = Open3.capture3(command)
    m.reply out
  end
end

bot.start
```

```bash:起動
./ircbot.rb
```

## 使い方

* cinchが居るIRCチャンネル上から以下命令で、任意のコマンドの標準出力が１行ずつ投稿される。
* ホワイトリスト形式にすれば安心して使えるかも。

```bash:
@cinch コマンド
@cinch ps -ef | grep http[d] | wc -l
@cinch w
```
PL/pgSQLのtriggerでNEW, OLDを透過的に参照する

# triggerされた行を参照する

PL/pgSQLでは、INSERTの場合は元となった行はNEWで、DELETEの場合はOLDで、UPDATEの場合はNEW/OLDで参照します。

```plpgsql
IF TG_OP = 'INSERT' OR 'UPDATE' THEN
  raise notice 'user_id: %', NEW.user_id;
ELSE
  raise notice 'user_id: %', OLD.user_id;
END IF;
```
参照するカラムが同じ場合は、一旦rowtype型の変数に代入すると、以降のコードを共通化できます。

```plpgsql
DECLARE
  source_rec users%rowtype;
BEGIN
  IF TG_OP = 'DELETE' THEN
    source_rec := OLD;
  ELSE
    source_rec := NEW;
  END IF;
  
  raise notice 'user_id: %', source_rec.user_id;
```
Amazon S3のStatic Website HostingにACMEのHTTPチャレンジを置いてリバースプロキシ経由で取ってくる


もう[Let's Encrypt](https://letsencrypt.jp/)もすっかり普及したね！

さて、証明書を発行するためには、いくつか用意された手段でドメインの所有を確認してもらう(チャレンジ)必要があります。
手段の中でも最もサクサクなのはHTTPかな、と思っています。

でも環境によってはコンテンツをいちいちHTTPサーバのローカルに置くのが面倒だ。証明書ペアだけ作って、一旦手元に欲しいケースもあるのだ。

そうだプロキシしよう。


## なんでS3に置いてみるの？

このHTTPチャレンジは基本的に使い捨てなので、次のように管理できるとまあまあ都合がよいのです。

- キーバリューストア的使い勝手で、出し入れ簡単
- コンテンツ掃除が面倒なので、寿命つき
    - そもそも一回取れればいいだけ


なかでもS3は、

- オブジェクトストレージ(キーバリュー)
    - トークンはまず被らないのでキーの重複も無い
- Lyfecycleを使えば最短1dayで勝手に消せるので掃除いらず
- たいてい稼働している。
- この用途なら月あたり数円かかる？ という感じ

という、なかなかマッチした環境。


s3が禁止されたら、`ngx_mruby + redis`ででもやってみるかなあ。
POSTしたらそのままGET(1回レスポンスしたら消す)できるだけのアプリを[sinatra](http://www.sinatrarb.com/)あたり書いたりでも良いけど。

## S3の仕込み


- バケットを`your-token-bucket`などで作成。
- static web hosting有効
- Lifecycle => delete 1day

最低限でこのくらい。

## リバースプロキシの仕込み(Nginx)

単純に、`/.well-known/acme-challenge/`に来たらS3のバケットにリクエストすればよい。

これで十分、このやり取りは暗号で行なう必要すら無いし。

```
location /.well-known/acme-challenge/ {
    proxy_pass   http://your-token-bucket.s3-website-ap-northeast-1.amazonaws.com/;
}
```

AutoScaleとかでHTTPサーバが並んでしまっているとかの環境でも、同じ設定にしておけば大丈夫なのがよいね。


## HTTPチャレンジを通してみた

じゃあ手元のPry(Ruby)で。

[letsencrypt - RubyでLet's Encryptのスクリプト - Qiita](http://qiita.com/sawanoboly/items/f23e73c613e9454076b8 "letsencrypt - RubyでLet's Encryptのスクリプト - Qiita")

ドメインのチャレンジを発行してもらいます。

```ruby
(略)クライアント作成とか、Authとかをすませて。

# チャレンジ内容の取得
> challenge.filename
=> ".well-known/acme-challenge/-oiuJqnLwVNitQlAKQfoX5cw0SpOKk8Y5ErRwFtG_d0"

> challenge.file_content
=> "-oiuJqnLwVNitQlAKQfoX5cw0SpOKk8Y5ErRwFtG_d0.7HGvevoQOzBU7mTxRBHr572hhPEd_Hx-ugxK_mF13yI"

> challenge.content_type
=> "text/plain"
```

上記の内容を元に、s3にオブジェクトを作成しましょう。

そのあと`request_verification`。

```
> challenge.request_verification
=> true
```

すぐにboulderからリクエストが来た、バッチリ200で返せたね。

```
66.133.109.36 - - [05/Jan/2016:04:53:32 +0000] "GET /.well-known/acme-challenge/-oiuJqnLwVNitQlAKQfoX5cw0SpOKk8Y5ErRwFtG_d0 HTTP/1.1" 200 88 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)"
```

チャレンジ`valid`、と。

```ruby
> challenge.verify_status
=> "valid"
```

これでcsrを作って送信すれば手元に証明書作成完了と。メールで担当者に送るとか、ロードバランサに適用するため、AWSにアップするとかできるね。


## 気になること

引けたレコードと応答するサーバが全然関係無くても、共通のバックエンドを指定しているサーバにさえリクエストがくれば普通にチャレンジ成功します。
なのでドメインを持っていることが前提で、とりあえず`*`なAレコードを用意してあれば結構自由につくれる。

まあ、ドメイン1つにつき、証明書上限10ヶくらいのようだし、DV認証なんてそのくらい手軽でよいよね。
vagrantで`Failed to mount folders in Linux guest`がでた時の備忘録


vagrantで`Failed to mount folders in Linux guest.`と言われ共有ディレクトリがマウントできなかった時の備忘録です。

エラーは以下。


```
Failed to mount folders in Linux guest. This is usually because
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:

mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` vagrant /vagrant

The error output from the last command was:

/sbin/mount.vboxsf: mounting failed with the error: No such device
```

VBoxGuestAdditionsを実行すればいいとのこと。

```
cd /opt/VBoxGuestAdditions-5.0.4/init
sudo ./vboxadd setup
```

で無事マウントできるようになりました。



#参考
http://stackoverflow.com/questions/28328775/virtualbox-mount-vboxsf-mounting-failed-with-the-error-no-such-device
pcakerで`virtualbox-iso: sudo: sorry, you must have a tty to run sudo`が出る


packerでbuild時に`virtualbox-iso: sudo: sorry, you must have a tty to run sudo`がでた時の備忘録です。

configファイルのbuildersセクションに以下を追加すると解決。

```
"ssh_pty" : "true"
```

以下利用しているbuildersセクション

```
  "builders":[{
    "type": "virtualbox-iso",
    "guest_os_type": "RedHat_64",
    "iso_url": "http://ftp.iij.ad.jp/pub/linux/centos/6.7/isos/x86_64/CentOS-6.7-x86_64-minimal.iso",
    "iso_checksum": "9381a24b8bee2fed0c26896141a64b69",
    "iso_checksum_type": "md5",
    "ssh_username": "vagrant",
    "ssh_password": "vagrant",
    "ssh_wait_timeout": "3000s",
    "vm_name": "box",
    "http_directory": "./",
    "boot_wait": "30s",
    "boot_command":[
      "<esc><wait>",
      "linux ks=http://{{ .HTTPIP }}:{{ .HTTPPort }}/ks.cfg ",
      "<enter><wait>"
    ],
    "shutdown_command": "echo 'vagrant' | sudo -S shutdown -P now",
    "ssh_pty" : "true"
  }],

```
[Ruby] 一見正しそうだが常にnilを返す恐怖のcase式

# 問題のcase式

先日ぼーっとしていて次のようなcase式を書いてしまった。

```ruby
case x
when "one" "I"
when "two" "II"
when "three" "III"
end
```

このcase式は文法エラーを起こさないので一見正しく動きそうに見える。
しかし、**このcase式は`x`の値にかかわらず常に`nil`を返してくる。**
文法エラーが起きないということもあって、このバグの発見にやや手間取ってしまった。

# 何が起こっているのか

**Rubyでは連続する文字列リテラルは結合したものとして扱われる。**
つまり、先程のcase式は以下のcase式と等価である。

```ruby
case x
when "oneI"
when "twoII"
when "threeIII"
end
```

C言語にもこのような仕様があるので、Cから受け継いだ仕様だと思われる。

# 解決策
以下のどれかを使いましょう。

```ruby
# thenを挟む
case x
when "one" then "I"
when "two" then "II"
when "three" then "III"
end
```

```ruby
# 改行を挟む
case x
when "one"
  "I"
when "two"
  "II"
when "three"
  "III"
end
```

```ruby
# ハッシュを使う
{
  "one" => "I",
  "two" => "II",
  "three" => "III",
}[x]
# 変換テーブルに無いキーをエラーにしたければ[x]の代わりに.fetch(x)を使うのがよい
```

# 参考リンク

[ruby の 文字列の連接 - Qiita](http://qiita.com/Nabetani/items/29a82811e95f80edbb27)
ローカルでは通るのに、CIではテストがコケるバグ（ディレクトリ名）

Macなどのローカル環境ではきちんと動作するしテストもちゃんと通るのに、CI ではなぜかコケるってこと、あると思います。
原因はいくつかあると思いますが、私の場合ディレクトリ名が原因で発生していました。

## OS ごとの大文字小文字の扱いの違い

OS （厳密にはファイルシステム）によって、ディレクトリ名やファイル名の取り扱いって結構違います。
使える文字や文字列長の違いもそうですが、大文字小文字の取り扱いも違います。
サーバ OS としてよく利用される Linux ではアルファベットの大文字と小文字を区別します。`abc` というディレクトリと `ABC` というディレクトリは別物として扱われるので、ひとつのディレクトリ内に同時に存在することが可能です。

対して Windows や Mac では、大文字と小文字を区別しません。`abc` というディレクトリと `ABC` というディレクトリは同じものとして扱われるので、ひとつのディレクトリ内に同時に存在することができません。ただし表示上は大文字小文字を区別しているので、`ABC` という名前で作ったディレクトリはちゃんと大文字で表示されます。

## Rails の規約

Rails は設定ファイルを持たない代わりに決まり事が明確に決められているフレームワークです。
今回私がハマった例では `app/services` を新しく作り、`V3::HogehogeExecuteService` というサービスオブジェクトを実装していました。
このとき、Rails の規約に従ってクラス名はキャメルケース、ディレクトリ名やファイル名はスネークケースで作成する必要があります。
なので `app/service/v3/hogehoge_execute_service.rb` がソースファイル名になります。
しかしうっかりディレクトリ名を大文字にしちゃったんですね。`app/service/V3/hogehoge_execute_service.rb` で作っちゃったんです。
V って大文字でも小文字でも形が同じなので、間違えていることに長いこと気づきませんでした。 

このサービスは、コントローラでこんな感じで呼ばれます。

```rb
 hogehoge = V3::HogehogeExecuteService.new(user_id)
```
このとき、Rails は `app/service/v3/hogehoge_execute_service.rb` を探しに行く訳ですが、Win/Mac のように大文字小文字を区別しない OS だと、 `app/service/V3/hogehoge_execute_service.rb` を見つけることができます。でも、Linux のように大文字小文字を区別しない OS だと、そんなファイルねーよって例外に繋がる訳です。
CI はたいてい Linux でしょうから、ローカルじゃ通るのに CI だとコケるバグが発生するようになります。本番環境もたいてい Linux でしょうから、CI のお陰でローカルでは見つけられないバグを事前に発見できたことになります。

## CircleCI での原因追及

CI がバグを見つけてくれるのはありがたいのですが、この例外、そのままでは CecleCI では表示してくれませんでした。
単純に Rspec の Failure が表示されているだけで、どこでコケているかは分かるけどなんでコケてるかは分からないんですね。
今回のように CI だけでコケるようなバグはなかなか当たりを付けるのも難しいものです。
こんな時はログを見るのが一番。
CircleCI では ssh で接続できるようになっているので、この機能を使ってテスト結果のログを見ると良いです。

<img width="400" alt="スクリーンショット 2016-01-05 13.47.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/17339/e2dca2cc-a3df-c731-f71b-99a15ffe60fc.png">

こちらのタブを開くと `Retry this build with SSH enabled` というボタンが表示されるので、このボタンを押して、SSH 接続可能な状態でもう一度テストを実施します。
テスト実施後ふたたび Debug via SSH タブを開くと SSH 接続するためのコマンドがそのまま表示されているので、コピペしてそのままターミナル上にペースとして実行すると良いです。
詳しくは [こちら](https://circleci.com/docs/ssh-build) から。

ssh で入ったら、app_name/log/test.log を vi で開くとログを確認できます。
コケているテストを呼び出しているコントーラ名などで検索してみると、`LoadError! ...` って感じでファイルが見つからないことを示すログが記録されていたので、原因を特定することができました。

## git でのディレクトリ名の修正

ディレクトリ名の大文字小文字の修正そのものは当然簡単なのですが、Win/Mac だと大文字小文字を区別しないせいか、そのままでは git がディレクトリ名の変更を認識してくれません。
私はこちらの記事のコメントの内容で解決しました。
[Gitでファイル名&ディレクトリ名の大文字/小文字を変更方法](http://qiita.com/narumi888/items/95b5a050cd3d20dab81c)

`git status` の表示結果にディレクトリ名の変更結果が表示されるようになれば成功です。
おそらくディレクトリ名の変更という形ではなく、ディレクトリ配下のファイルの移動という形で表示されると思います。こんな感じで。

```
app/service/V3/hogehoge_execute_service.rb --> app/service/v3/hogehoge_execute_service.rb
```

こういう風にきちんと認識してくれたら、あとは commit して push してしまえば良いです。
バグが修正され、CI でもテストが通るようになります。
めでたしめでたし。
AWSでAnsibleでシステム構築設計まとめ

#環境
接続は踏み台のみ
上記以外のAPとDBは踏み台からのみ接続許可

#最初にやらなければならないもの
- 踏み台以外のサーバーでyumが使えるように設定する　→　踏み台以外はプロクシ設定
- gitとAnsibleのインストール
- そのあとスタート


#共通
- グループ作成
- ユーザ作成

#踏み台
- Git インストール
- Ansible実行元

##API1
- Yumでインストールする

1. Ruby
2. httpd
3. node
4. python
5. gem(passenger,bundler)
6. その他

##API2
- API1と同様

##DB
- postgres 9.4


１．deploy
２．初期化
３．再起動
githubでLICENSEをつける

#GitHubでLICENSE?
GitHubで、みんなLICENCEつけてるけど、どうやってやってるの？って話です。めっちゃ初心者なので、あしからず。

##LICENSE付け方
基本的にポチポチするだけです。
###Repositoryを作るときに一緒につける場合
下の画像の左下
>Add a license: None

をクリックして、適当なものを選ぶだけです。非常に簡単。
<img width="701" alt="Screen Shot 2016-01-05 at 1.34.57 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/86999/9568bad4-b3f8-3234-6562-ff8efc22c0e5.png">

###途中で付ける場合
まず、付けたいレポジトリに移動します.
真ん中の`New file`をクリックします.
<img width="995" alt="Screen Shot 2016-01-05 at 1.40.29 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/86999/37eb9b46-7f4d-ea79-62da-e4c41f05b097.png">
すると、下のような画面になります.
<img width="1006" alt="Screen Shot 2016-01-05 at 1.42.58 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/86999/3901ad05-50b2-20c3-4b49-6c8182ba3c19.png">
ここのテキストボックスに　`LICENCE`or`LICENSE`と撃ち込む.右にボックスが出現します．
<img width="1017" alt="Screen Shot 2016-01-05 at 1.43.10 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/86999/5cfc233d-7743-d783-9510-ac287ac93983.png">

こっからは、さっきと一緒でテキストボックス右の、
>Choose a license : None

をクリックして、適当なものを選ぶだけです。


##付録：LICENSE list
選べるLiICENSEを列挙しておきます。最初の3つが太字で書いてあるのでメジャーなものかと思われます。
各LICENSEの説明は[ライセンスの選択を恐れる必要はありません](http://qiita.com/tadsan/items/99d816e78ca429093b75) by @tadsan on @Qiitaに詳しく書いてります。

**・Apache License 2.0
・GNU General Public License v2.0
・MIT License**
・Artistic License 2.0
・BSD 2-clause "Simplified" License
・BSD 3-clause "New" or "Revised" License
・Creative Commons Zero v1.0 Universal
・Eclipse Public Licence 1.0
・GNU Affero General Public License v3.0
・GNU General Public License v3.0
・GNULesser General Public License v2.1
・GNU Lesser General Public License v3.0
・ISC License
・Mozilla Public License 2.0
PushState + Bootstrap ModalでUSA TODAYみたいなモーダルウィンドウを作る


なんかそれっぽいのを作りました。

https://github.com/toshiharu-irie/modal-push-state

いろんなところが全然スマートじゃないけど……。

## 解説
まず、それぞれのページを以下のようにマークアップします。
Bootstrap Modalを前提にしているので、その辺のスクリプトが動くようにBootstrapとかjQueryとか読み込んでください。

### モーダルの親
```html:HTML
<!-- 前略 -->
<script src="/demo/modal/pushstate/js/modal_common.js"></script>

<div id="container">

  <div id="article">
    // コンテンツを入れます。
    <a class="js-modal" href="modal.html">モーダルを開く</a>
  </div>

  <div id="modal-content">
    <div class="modal fade" id="myModal">
      <div id="modal-dialog" class="modal-dialog">
        // 何も入れません。ただの受け皿。
      </div>
    </div>
  </div>

</div>
<!-- 後略 -->
```

モーダルウィンドウを開くaタグに、「js-modal」クラスとモーダルのURLを記述します。

### モーダル
```html:HTML
<!-- 前略 -->
<script src="/demo/modal/pushstate/js/modal_common.js"></script>
<script src="/demo/modal/pushstate/js/modal_reload.js"></script>

<div id="container" data-parent="/demo/modal/pushstate/index.html">
  <div id="article">
    // 何もいれません。
  </div>
  <div id="modal-content">
    <div class="modal" id="myModal">
      <div id="modal-dialog" class="modal-dialog">
        // モーダルで表示するコンテンツを入れます。
      </div>
    </div>
  </div>
</div>
<!-- 後略 -->
```

ここで大事なのは、#containerのdata属性に、モーダルの親のURLをモーダルに持たせることです。

```html:HTML
<div id="container" data-parent="/demo/modal/pushstate/index.html">
```

data-parentの値にモーダルの親のURLが埋め込まれていると、モーダルに外部からアクセスしてきたときに、#articleの部分にモーダルの親の内容を入れてくれて、モーダルを閉じても (前のページに戻っても) ページが真っ白にならずに親のURLに戻るようになっています。

モーダルの中に別のモーダルへのリンクを設置することもできます。

```html:HTML
<!-- 前略 -->
  <div id="modal-content">
    <div class="modal" id="myModal">
      <div id="modal-dialog" class="modal-dialog">
        // モーダルで表示するコンテンツを入れます。
        <a class="js-modal" href="modal_b.html">別のモーダルを開く</a>
      </div>
    </div>
  </div>
<!-- 後略 -->
```

## その他
* history.back()とhistory.forward()にも対応してます。
* 次のページが無かった場合にhistory.forward()したときは、forwardを停止するようになっています。

## 終わりに
pushStateのページ遷移はよく見るんですが、[USA TODAY](http://www.usatoday.com/)みたいなモーダルウィンドウを実践している人は多分いなかったので、pushStateの勉強も兼ねて作りました。
未だによく分かってない部分もありますが、何かそれっぽく出来たなー、という感じでGithubにぶっこんでみました。

不具合等ございましたら、ご一報頂けますと幸いです。

## 2016/01/19 追記
色々バグってたり処理が不足していたので、アップデートしました。
詳しい実装方法はGithubに書いています。
mysql2 gemのprepared statement機能メモ

rubyのmysql2にprepared statementがサポートされました。
使い方がどこにも書いてないのでメモしときます。

```ruby
require 'mysql2'

client = Mysql2::Client.new(
  :host => "localhost",
  :username => "username",
  :password => "XXXXXXXXX",
  :database => "database"
)

sql = %{
  SELECT 
    id,
    created_date as created_at
  from users
  where 
    created_date > ?
    limit ?
}
stmt = client.prepare(sql)

# DateやTimeは自動的にCastされる
# パラメータが足りなければ当然エラー
res = stmt.execute(Date.today - 365, 100)
res.each { |c| p c }

# field名を取得
p stmt.fields

# close は GC 時に自動で呼ばれるが明示的に呼ぶこともできる
stmt.close
```

2018/09/22 sonots 追記:

mysql2 gem の prepared statement は server side prepared statement です。mysql の statement handle は使い回すのが正しい使い方なので、stmt オブジェクトをすぐに close して破棄するのではなく、キャッシュして使い回すのが正しい使い方となります。

mysql2 gem そのものに [Go の Prepared Statement](https://qiita.com/methane/items/a9803388ff4a5a985b4d) のような気の利いたキャッシュ機構はないですが、ActiveRecordではデフォルト1 connectionにつき1000 statementまでStatementPoolというところにキャッシュして超えたら一番古いやつを捨てるような実装になっているとのこと。

ref. https://twitter.com/sonots/status/1042829959989882880


## 参考
* [brianmario/mysql2](https://github.com/brianmario/mysql2)
* [Prepared statement support by nyaxt · Pull Request #289 · brianmario/mysql2](https://github.com/brianmario/mysql2/pull/289)
* https://github.com/brianmario/mysql2/blob/95bfea3d430187fda31caea44ded0a8ab606525d/ext/mysql2/statement.c#L584
* https://github.com/brianmario/mysql2/blob/95bfea3d430187fda31caea44ded0a8ab606525d/ext/mysql2/statement.c#L561-L563
[POH7]彼女に水着をプレゼント(C++)

C++で水着の問題に取り組んでみました。
[恋愛SLG: プログラミングで彼女をつくる](https://paiza.jp/poh/ando)

```cpp
#include <iostream>
using namespace std;

int main(void){
　size_t billion = 1000000000;
  string str;
  getline(cin, str);
  size_t i = stoi(str), num = 1;
  for (size_t j = i; j > 0; --j)
	{
		num = num * j;
		while(num % 10 == 0){
			num = num / 10;
		}
		if(num > billion)
			num = num % (billion*10);
	}
	num = num % billion;
	cout << num << endl;
  return 0;
}

```

ただ下位9桁のみで計算を続けているだけだが速度は十分
![SwimWear.jpg](https://qiita-image-store.s3.amazonaws.com/0/107905/396645fa-a431-3af3-42a7-13bc54350035.jpeg)
YAML |  アンカーを結合する方法は無い。

無いっぽい。

あってほしい。

# 参考

https://teratail.com/questions/1226

>文字列の連結はyamlでできないようです。 
>key : 'value : %{hoge}' 
>のような形で、yamlの中に持たせて、プログラム中で置換するような方法しかないようです。 



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
【Swift】CarthageでAlamofireを入れてみる

[元ブログ - 【Swift】CarthageでAlamofireを入れてみる - - 技術は熱いうちに打て！](http://blog.dalt.me/1199)

今回は、Carthageの導入方法についてです。

## Carthageとは

<a href="https://github.com/Carthage/Carthage" target="_blank">https://github.com/Carthage/Carthage</a>

cocoaでのライブラリ管理ツールと言えば、
cocoapodsが有名ですが新たな観点から作成されたライブラリ管理ツールがCarthageです。
Carthageはカルタゴと読むらしいです。

### 何が違うのか？

#### xcworkspaceが生成されない

ここが大きいと思います。
cocoapodsはワークスペースを直接いじることにより設定していましたが
Carthageは.frameworkを生成することにより、
各々の.frameworkが独立した存在になります。

#### github以外にホスティングされているライブラリも使用可能

後に書くCarthageファイルにgitと書けばgithub以外にホスティングされている
gitレポジトリからも持ってくることが出来ます。
自社でgitサーバを持っているチームでも使えますね。

### 注意

早速注意点なのですが、<strong>iOS8以降またはOS Xのみ対応</strong>です。
dynamic frameworkに対応するためです。

この辺はアプリのAnalyticsとかでiOS 7以前を切れるかを確認してみてください。

## インストール

3通りあります。
1. pkgからのインストール
2. brewからのインストール
3. ソースからのインストール

インストールが終わればcarthageコマンドが使えるようになります。

### 1. pkgからのインストール

![](http://blog.dalt.me/wp-content/uploads/2016/01/スクリーンショット_2016-01-04_21_02_18-632x513.png)


あとは、いつもの通りです。

### 2. brewからのインストール

```
$ brew install carthage
```

### 3. ソースからのインストール

最新のソースコードから試したい場合はこちらの方法ですが、自己責任で。

```
$ git clone git@github.com:Carthage/Carthage.git
$ cd Carthage
$ make install
```

## ライブラリのインストール方法

以下の流れで追加されます。

1. Cartfileファイルの作成、編集
2. Carthageコマンドの実行(ライブラリのクローン、依存関係の解決、.frameworkの生成)
3. 生成された.frameworkをprojectに追加

### 1. Cartfileの作成

```
$ touch Cartfile
```

出来たCartfileを編集します。
今回はAlamofireを追加します。
<a href="https://github.com/Alamofire/Alamofire" target="_blank">https://github.com/Alamofire/Alamofire</a>

※AlamofireはSwiftで実装されたHTTPネットワーキングライブラリです。

およそこのような形になると思います。

```
github "Alamofire/Alamofire"
```

※コメントも#を先頭に置けば付記出来ます。

```
# Elegant HTTP Networking in Swift
github "Alamofire/Alamofire"
```

### 2. Carthageコマンドの実行

```
$ carthage update
```

プラットフォームを指定したい場合は以下のように--platformオプションも付与できます。

```
$ carthage update --platform iOS
```

上手くいけば
・Cartfile.resolved
・Carthage/Build
　- .framework, .framework.dSYMなどのファイル

・Carthage/Checkouts
　- 対象レポジトリ

が生成されていると思います。

### 3. 生成された.frameworkをprojectに追加

![](http://blog.dalt.me/wp-content/uploads/2016/01/スクリーンショット_2016-01-04_21_31_51-632x593.png)

xcodeprojのGeneralタブに[Linked Frameworks and Libraries]があるのでここに追加します。

+ボタンを押して追加しても良いですし、ここに生成された.frameworkを追加しても良いと思います。

### Run Scriptの追加

![](http://blog.dalt.me/wp-content/uploads/2016/01/スクリーンショット_2016-01-04_21_37_36-632x218.png)

そうするとRun Scriptというプルダウンが出来ると思うのでそこにある黒い場所に

```
/usr/local/bin/carthage copy-frameworks
```

を追加し、Input Filesを追加し、.frameworkのパスを記してあげます。

![](http://blog.dalt.me/wp-content/uploads/2016/01/スクリーンショット_2016-01-04_21_39_25-632x198.png)

## 以上！

ここまで上手くいけば
```
import Alamofire
```

で使えるようになっていると思います。

誰かのお役に立てば。
R scale関数でデータフレームを正規化

# 正規化とは？

統計解析の現場では、データフレームの各列の単位が異なる場合があります。

- 身長
- 体重
- 血圧
- etc...

その場合、各変量を平均が0、分散が1となるよう変換を加えることがあります。
これを**正規化**と呼びます。

Rでは関数scale()を用いることで、データフレームを正規化可能です。

正規化には２つの手順があります。

1. センタリング　：　それぞれの変量から全体の平均を引く。平均が0となる。
2. スケーリング　：　それぞれの変量を全体の標準偏差で割る。分散が1となる。

# Rによる実例
では、Rで実例を見ていきましょう。

身長・体重・血圧の変量を作った後、melt関数で縦持ちにしてggplotでヒストグラムを描画してみます。

```r
n = 1000
df <- data.frame(
    height = rnorm(n, 170, 10),
    weight = rnorm(n,  70, 5),
    bloodpressure = rnorm(n, 125, 2)
)

library(reshape2)
library(ggplot2)
ggplot(melt(df), aes(x=value)) +
    geom_histogram(fill="gray", binwidth=1) +
    facet_grid(variable~., scales="free")
```

![RPlot1.png](https://qiita-image-store.s3.amazonaws.com/0/89145/5aa8f82a-7d05-6e34-2741-c2eb0e2dd1ee.png)

3変量が全く別の分布になっていることが分かります。

次に、これをscale関数で正規化した後、ヒストグラムにしてみます。

```r
df.scale = scale(df)

ggplot(melt(df.scale), aes(x=value)) +
    geom_histogram(fill="gray", binwidth=0.1) +
    facet_grid(Var2~., scales="free")
```

![Rplot2.png](https://qiita-image-store.s3.amazonaws.com/0/89145/2ae115f9-57ef-56b7-99de-54f834c17c57.png)

全て同じ分布になっていることが分かります。

平均と分散も見てみましょう。

```r
> apply(df.scale, 2, function(x){
+     print(mean(x))
+     print(var(x))
+ })
[1] -3.592281e-16
[1] 1
[1] 9.214658e-16
[1] 1
[1] 2.510722e-15
[1] 1
       height        weight bloodpressure 
            1             1             1 
```

全て平均0と分散1になっています。


# まとめ
- scale関数で正規化が可能
Unix→Windowsに改行コード変換

参考サイト
http://nishidy.hatenablog.com/entry/2015/07/14/211318

よく使うのでメモ。

Unix→Windowsに改行コード変換
```
sed -i "s/$/\r/g"
```

フォルダ内の全てのファイルを
Unix→Windowsに改行コード変換
```
find ./ -type f  | xargs sed -i "s/$/\r/g"
```

Windows⇨Unixに改行コード変換

```
find ./ -type f | xargs sed -i 's/\r//'

```
say "ho!";

Perl5.10から実装されていたsay。

## 書き方

```
#!/usr/bin/env perl6
use v6;   # なくてもよさげ

# 以下、全て等価
print "ho!\n";
say "ho!";
"ho!".say;
```
```実行結果
 bash $ ./test.pl
ho!
ho!
ho!
```
printで出力する形に比べ、3バイト短くできます。
メソッド呼び出しをピリオドでできるのはPerl6ならではですね。

改行コードが環境に依存するのか、常にLFのみなのかは調べきれていません。
VirtualBox でインポートした OVA ファイルの起動時に「VERR_CFGM_NODE_EXISTS」エラーが発生する場合の対処方法

# 発生した事象

VirtualBox 5.0.2 でエクスポートした OVA ファイルを別端末にインポート後、起動しようとすると「VERR_CFGM_NODE_EXISTS」というエラーが発生し、起動できない
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/49458/dca0ac16-7d0c-9565-2f90-8b4cc8d78dfc.png)

# 解決方法

VirtualBox マネージャーの仮想マシン一覧から、対象の仮想マシンを右クリック：設定 > USB > USBコントローラーを有効化 のチェックを外して、再起動

# 原因

以下URLの記事によると、OVF 2.0 フォーマットでエクスポートした場合、USBコントローラの設定に不具合が発生してしまうそうです。
https://blog.samcater.com/virtualbox-verr_cfgm_node_exists-solution-after-export-and-import-ovf-2-0/

今回は OVF 1.0 フォーマットでしたが、同様の事象が発生しました。

# 検証環境

VirtualBox 5.0.2（エクスポート／インポート）
ホストOS：Windows7（64bit）

# エラー発生手順

端末A：VirtualBox マネージャーのヘッダメニュー：ファイル > 仮想アプライアンスのエクスポート > ovaファイルを作成（フォーマット：OVF 1.0）
▼
端末B：VirtualBox マネージャーのヘッダメニュー：ファイル > 仮想アプライアンスのインポート > 前の手順でエクスポートしたファイルを選択して「次へ」
▼
端末B：設定項目は全てデフォルトのまま「インポート」後、仮想マシン一覧から起動
▼
前述のエラー発生

# 雑記

開発環境を手軽に配布・構築できるのが仮想環境の魅力のひとつですが、使い方を間違えると、思わぬ事故が発生しがちです。
便利なものこそ、仕組みを理解して使わないといけないな、と感じました。
nightwatchjsでhtml5 offline storageを使うウェブアプリをテストする

### 問題
- offline storageを使う際にはユーザーが明示的に許可を与える必要があるが、そのダイアログを自動的に許可する方法がnightwatchjsのAPIには見当たらない。
- 人間がブラウザを操作して許可を与える分には１度で済むものの、chromedriver経由でブラウザを操作する場合、テストの実行ごとに許可を求めてくるため自動化ができない。

### 解決法
- nightwatch.jsonでchromeに明示的に[umlimited-storage option](https://code.google.com/p/chromium/codesearch#chromium/src/chrome/common/chrome_switches.cc&q=kUnlimitedStorage&sq=package:chromium&type=cs&l=1067)を与える

```
    "chrome": {
      "desiredCapabilities": {
        "browserName": "chrome",
        "chromeOptions": {
          "args": [
            "unlimited-storage"
          ]
        }
      }
    },
```

- [ここ](http://peter.sh/experiments/chromium-command-line-switches/)に利用可能なオプションはまとまっているので、困ったらいいオプションがないか探してみるといいかも。
link_toとうまく付き合う

#はじめに...
Railsでよく利用する[link_to](http://railsdoc.com/references/link_to) ですが、豊富なオプションのおかげでついつい、こんなコードを書いていました。

> link_to "create", xxx_xxxx_path(xxx_id: xxx, xxx_id: xxx), method: :post, remote: true ...

今回は、このコードに感じる**違和感**の話です。

#どこが気持ち悪いのか...
ズバリ **method: :post** です。

この指定をしたとき、出力されるhtmlはこうなります。
```
<a href="xxx/xxxx" data-method="post" ...">create</a>
```
.... anchorタグに**post**がついていますね。
**「a タグに"post"」**  ってどういうことでしょう？

うーん、ぱっと理解できません。

# なぜ気持ち悪いのか....
先ほどのコードの気持ち悪さは、aタグの基本的な使い方からずれてるところからきています。

[aタグのリファレンス(w3schoolより)](http://www.w3schools.com/tags/tag_a.asp)では、
> The \<a\> tag defines a hyperlink, which is used to link from one page to another.

となっています。

この定義に従うのなら、httpメソッドとしては、(必然的に）**get**です。
....htmlでは、aタグの定義にhttpメソッドはそもそも指定できませんしね。

これが、違和感の正体です。

# より自然に読めるコードにするには、
これらの違和感を解消するためのコードとしては、

**link_to では、get しか使わない。**

という制約を課すことだと思います。

postメソッドは[form_for](http://railsdoc.com/references/form_for)しか指定しない。

言い換えると、

**[UrlHelper](https://github.com/rails/rails/blob/606ce3f907cbccd9159bb558c0b57433b42f3975/actionview/lib/action_view/helpers/url_helper.rb)で使われる デフォルトのhttpメソッドは変えない。**

ということだと思います。

#制約を課したときの例
これまで説明した制約の元で、link_toのほとんどは
以下のようなコードになるはずです。

```
link_to "show", @hoge ...
link_to "show", hoge_path(@hoge)
link_to "show", [@hoge1, @hoge2, ... ] ...
link_to "index", hoges_path ...
link_to "index", hoge1_hoge2s_path ...
link_to "new", new_hoge_path ...
```

link_to の使い方がシンプルになりました。コードも短くなりました。


#method: :deleteはどう考えるか？
scaffold すると、レコードの削除として、**method: :delete** のついたlink_toが付いてきます。
賛否両論あると思いますが、私はこれにも違和感があるので、基本的に使いません。
form_forかbutton_toで対応しています。

# 少しだけ余談ですが...
私のこの違和感とたどり着いたゴールを裏付けるために、githubのhtmlソースを読んだところ、
aタグ でpostしているところは**ありませんでした。**
... 見落としてたらすいません。m(_ _)m
やっぱり、link_to で postするのは基本的にNGなんだと、確信しました。
githubのhtmlソース、読みやすかったなあ。。。

というわけで、

**細かい所もRailの上から外れないようにしたほうがいいよ。**

というのを実感したお話でした。
開発で使っていたLaravel5.1を5.2にアップデートした。

実際に5.1で開発していたものアップデートです。色々問題が起きた所も載せてます。
なんか勘違いされそうなのですが、個人的なものです

## 環境

* Laravel5.1.11→5.2

## composer.jsonの値の修正

```
"laravel/framework": "5.2.*",
```

## composer.jsonのrequire-devに以下追加

```
"symfony/dom-crawler": "~3.0",
"symfony/css-selector": "~3.0",
```

## アップデート

```
composer update
```

## 失敗したので幾つか修正

* laravelcollective/htmlは`5.2.*`に変更。

laravel-api-generatorが5.2対応していなかった&マージリクエストは来てたがマージされてない状態だったので、マージリクエストの方を一時的に採用する。あくまでも一時的な処置。**→対応されたのでapi-generatorの箇所は削除しました！**

また、同様にEntrustも同じ状況であったため、一緒に記載。(さきにupdateしてしまった場合はapp.phpのprovidersから削除しておく必要がある)

```
"repositories": [
    {
        "type": "vcs",
        "url": "https://github.com/hiendv/entrust"
    }
]
```

```
"require-dev": {
  "zizaco/entrust": "dev-laravel-5-2@dev",
}
```



## もう一回update

もう一度updateしてみたらControllerServiceProviderが無いと言われたが、依存関係はクリア出来たみたいなので後に回す。

## 以下のファイルを見ながらconfig/auth.phpを修正

https://github.com/laravel/laravel/blob/master/config/auth.php

一番手っ取り早いのはそのままコピーして貼り付け。
middlewareグループが出来た関係で色々と変更がされているみたいですね。あとユーザー情報のテーブルをわけれるようになってるみたい。

## config/app.phpにenvの追加

どうやらconfig/app.phpにもenvの設定をすることになった模様。多分.envに頼らなくするためかな・・・？

以下を追記しておく。

```
'env' => env('APP_ENV', 'production'),
```

## providerの削除

一部のproviderが削除されているため、app.phpから以下のプロバイダーは削除する必要がある。

```
Illuminate\Foundation\Providers\ArtisanServiceProvider
と
Illuminate\Routing\ControllerServiceProvider
```

です。さっきのエラーが解消されるね。

## 色々問題が解消されたので、updateする

```
composer update
```

問題なく行けたみたい。アップデートかんりょー。(今のところは)

## 参考

https://laravel.com/docs/master/upgrade

## 最後に

いろんなサードパーティ製のパッケージを使ってる場合はまだアップデートしないほうがいいかもです
JAVA 関数

メソッドは関数の一種
関数はメソッドみたいなもの

▪️Test75.java


```java

public class Test75 {
	public static int twice(int x) {
		return x * 2;
	}

	public static int sub(int a, int b) {
		return a - b;
	}

	public static void main(String[] args) {
		System.out.println(twice(1));
		System.out.println(sub(10, 9));
	}

}
```

▪️Test75.java
2
1
FuelPHP での CSRF 対策

FuelPHP での CSRF 対策

まずコンフィグを有効にする。

```php:config.php
'security' => array(
	:
    'csrf_autoload'		=> false,
    'csrf_token_key'	=> 'fuel_csrf_token',
    'csrf_expiration'	=> 0,
	'token_salt'		=> 'salt'
	:
);
```

値を取得する。

```php
$token['token_key'] = Config::get('security.csrf_token_key');
$token['token'] = Security::fetch_token();
```

あとはHiddenを入れるだけ。

```php
echo Form::hidden($token['token_key'], $token['token']);
```

```html
<input type="hidden" name="コンフィグのcsrf_token_keyの値" value="生成された値" />
```

あとは項目と合わせてチェックをする。

```
if(Security::check_token()){
    //正しい場合
}else{
    //不正な場合
}
```