OmniAICreator/Qiita-1.07M huggingface dataset:
Factorization Machinesについて調べてみた

21日のアドベントカレンダーを2日遅れでお届けしております。
忘年会シーズンに入る前に調べておけばよかったと反省するばかり。二日酔いが辛い…。


気を取り直して、今回はFactorization Machines(以下、FM)について書いていきます。
1ヶ月ほど前にRecSys2014読み会で知ってから結構気になっていたで、調べてみた結果をまとめています。
FMはRendleさんが2010年にICDMに出したのが初出の様なので、割りと前から存在していたのですが、完全にノーマークでした。研究はRendleさんがほぼメインで行っている様ですが、KDD2014のNetflixが出しているまとめにも載っているので、業界的には結構有名なんだろうと思います。ノーマークだったけどorz

#はじめに
協調フィルタ系のレコメンドにトレンドについては、
Collaborative Filtering(CF)
→ SVD / Matrix Factorization(MF)
→ SVD++
→ time-SVD / Pairwise Interaction Tensor Factorization(PITF) / Factorizing Personalized Markov Chains(FPMC)
という流れかなと個人的には思っていますが、time-SVDあたりからはUser-ItemのRating以外の要素を取り込む様な拡張になっています。
こういった派生系はだいたい特定のケースに特化したモデルがちらほら生まれてきて、特化したケースを一般化した汎化モデルが出てくるパターンだと思います。
FMはこの汎化モデルにあたる位置付けです。

#Factorization Machinesとは？
とりあえず、SVD/MF/FMの違いをイメージで書いてみました。
　

![SVD_MF_FM.png](https://qiita-image-store.s3.amazonaws.com/0/12165/b457ea3f-4b20-215a-6f7d-1b7d564385d8.png)


　
FMはSVDやMFとはRatingの持ち方が異なっています。
SVDやMFは1行に1ユーザの評価データを複数格納しており、これをユーザとアイテムの特徴ベクトルをそれぞれ取り出しています。
これに対して、FMは1評価を1行で表し、取り出すのはユーザとアイテムの交互作用(pair-wise)の特徴ベクトルで、SVDやMFとは注目している対象が異なります。

FMの予測式は以下の様になります。

```math
\hat{y}(\mathbf{x}):= w_0 + \sum_{i=i}^nw_ix_i + \sum_{i=1}^n\sum_{j=i+1}^n<\mathbf{v}_i ,\mathbf{v}_j>x_ix_j
```

$\mathbf{x}$は上の図のFMの図の1行に該当するので、ユーザとアイテムの両方に1が立つ感じですね。

Netflixの資料には$f(\mathbf{x})=b+w_u+w_i+\mathbf{v}^T_u\mathbf{v}_i$と書いてあるので、こちらの方がMFを知ってる人には分かりやすいかも。 

$\mathbf{w}\mathbf{x}=w_u+w_i$と思ってもらえれば上の式との対応は伝わるかな。

なので、FMではユーザバイアス$w_u$、アイテムバイアス$w_i$に加えて、ユーザとアイテムの交互作用$\mathbf{v}^T_u\mathbf{v}_i$を使って予測をっているということになります。

#どの辺りが汎化モデルなのか？

この相互作用を時間とかContextとかを自由に入れられます。

![20141223-214246.png](https://qiita-image-store.s3.amazonaws.com/0/12165/4009207c-a153-3bac-49be-d5b4f36ffc00.png)

引用元：http://www.slideshare.net/xamat/kdd-2014-tutorial-the-recommender-problem-revisited

上記の例では、UserとItem以外にTimeという閲覧タイミングを入れています。
こうすることで、User✕Item✕Timeの交互作用をモデルで扱うことができます。

Rendleさんの元論文では以下の様な例を挙げており、UserとItem以外を自由に入れられる、且つ幾つでも入れることができるそうです。
なので、時間だけでなく、場所や気分といったContextを入れることも可能です。

![20141223-215118.png](https://qiita-image-store.s3.amazonaws.com/0/12165/cdcf0f27-3ed4-41c8-df0d-08047b1b9090.png)

引用元：http://www.ismll.uni-hildesheim.de/pub/pdfs/Rendle2010FM.pdf

##推定方法
以下の手法で推定が可能です。

- SGD
- Adaptive SGD
- ALS
- MCMC

推定時はL2正則化を掛けて行います。

#性能
Matrix Factorizationよりはやっぱりいいらしい。
KDD Cup2012のCTR予測ではRendleさん1人で挑んで2位だったとのこと。

#どうやったら使えるのか？

Rendleさんお手製の[libFM](http://www.libfm.org/)というライブラリがあるので、それを使うのがおそらくベストの様です。
FMはMatrixの持ち方も変わっており、普通にRatingの行列を作ると凄い量になってしまいますが、libFMの中ではRating行列の共通部分を集約して持つようにしたりしていて、メモリ量の削減にもかなり力を入れてあります。
現状使うのであれば、libFMを使うか、libFMベースで手を入れるのが良さそうです。

#実行サンプル
1回試して力尽きました。
そのうち他手法との比較結果を挙げようと思います。
Vim上でjqでjsonを整形


vim用のjqプラグインがいろいろ出てますが、vimの標準コマンドだけでも割と簡単でした。

参考:[Pretty-print JSON in vim](http://opyate.com/2013/11/05/my-new-favourite-way-to-pretty-print-json-in-vim.html)

0. jqをインストールします。

		brew install jq

1. vimでjsonを開くかコピペします。

2. vim上で以下を実行します。

		:%!jq '.'

以上
Xcode 6.1を初めて触ってみた　その２ playgroundでハマった（解決済）


#playgroundでのビックリマーク


**（エラー）**以下のコードを書くと、画面左に赤いビックリマークが２つ出てしまう。
エラーとして　'NSString' is not convertible to 'string'　と表示。

```swift
import UIKit

var string = NSMutableAttributedString(string: "iPhone")

string.addAttribute(NSFontAttributeName, value: UIFont(name: "Times", size: 40)!, range: NSMakeRange(0, 4))

string.addAttribute(NSForegroundColorAttributeName, value: UIColor.blueColor(), range: NSMakeRange(0, 3))
```

**（原因）**不明。とりあえず、コードは動いてQuicklookでも表示されるけど気になる。
**（考察）**どなたかコメントで教えていただければ幸いです。

#コメントの補足
早速コメントをくださったnoppefoxwolfさん、ありがとうございます。
私もバージョンは6.1.1です。
補足ですが、上記のコードだけを実行した場合は、エラーが出ません。
このコードの上に

```swift
var sum = 0
for i in 0...100 {
    sum += i
}
sum

var y = 0.0
for var x = -1.0; x < 1.0; x += 0.1 {
    y = x * x
}

var english = "私は英語を\(3+3)年間勉強した"

var sum2 = 0
for i in 1...5 {
    var str = "\(sum2) + \(i)は\(sum2 + 1)です"
    sum2 += i
}

```
が書かれていると、ビックリマークが出てしまっています。

![スクリーンショット 2014-12-24 9.20.15.png](https://qiita-image-store.s3.amazonaws.com/0/63942/cb6c2220-49a7-2c54-7dd7-8f02ec847c87.png)

おそらく、非常に初歩的なエラーなのかと思いますが、
　'NSString' is not convertible to 'string'　
という意味もよくわからず、投稿しました。
どなたか、アドバイスいただけたら嬉しいです。
ダンボール製VRゴーグル「100lus」のゆかいな仲間たち

#100lus（ヒャクラス）とは
100lus（ヒャクラス）DK1は、100円ショップの商品などを材料にしたダンボール製VRHMDで、これを利用して、私たちの活動コンセプト「VR4U」の普及につとめています。

詳しい内容は、"ダンボール製VRゴーグル「100lus DK1」について"をご覧ください。
http://qiita.com/yamazakiharuki/items/c80cf908efb32ca38ab1
![IMG_8572.JPG](https://qiita-image-store.s3.amazonaws.com/0/63707/964312fd-420d-ced3-8fdc-56b97bace68a.jpeg)

#100lusのゆかいな仲間たち
Google Cardboardやハコスコなどにインスパイアされて誕生した100lusですが、この活動を支えてくれている人たちによって、100lusをベースにした様々なバージョンが制作されているので、これらをご紹介してゆきます。

##101lus DK1
100lusチーム竹内さん制作の折りたたみできるバージョン。
100円ショップで売っている丁番やスチレンボード、サウナスーツを使い、四隅の柱でスマートフォンをつかみテント状に切り出したサウナスーツでテンションをかけてホールドする構造。
![thumbnail_large_file.jpg](https://qiita-image-store.s3.amazonaws.com/0/63707/1dfc0a36-4e22-5341-0a7c-63f1a794afb1.jpeg)
https://makershub.jp/make/486

##102lus DK1
（欠番）

##103lus DK1
100lusチーム竹内さん制作のA4サイズのダンボール板で折りたたみできるバージョン。
ひとまずはiPhone5用らしい。
![thumbnail_large_file-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/63707/475bbec8-d91d-fa8e-f04d-d7870ee266c6.jpeg)
https://makershub.jp/make/518

##104lus DK1
100lusチーム谷口さん制作の手切りがしやすい設計バージョン。これを使って子供向けワークショップが開催されていたりします。
![thumbnail_large_file-2.JPG](https://qiita-image-store.s3.amazonaws.com/0/63707/4e74c0e0-3399-5337-1e95-6ab7cfae0f64.jpeg)
https://makershub.jp/make/522

##105lus DK1
（欠番）

##106lus DK1（通称：ZAKULUS）
100lusチーム竹内さん制作。
見ての通り、ダンボール製のアレです。
「106」なのもなんでかわかりますよねｗ
![thumbnail_large_file-4.jpg](https://qiita-image-store.s3.amazonaws.com/0/63707/60eebad6-cfbe-c700-653d-794f5c23f76c.jpeg)

https://makershub.jp/make/523

##107lus DK1（旧：A100lus）
ヒャッカソン実行委員会青木さん制作。
ダイソーミニルーペ本体とブリスターパッケージ、あと輪ゴムで作る、超エクストリームな仕様。
![thumbnail_large_file-3.jpg](https://qiita-image-store.s3.amazonaws.com/0/63707/0384ab8b-fad1-cb0b-a27e-e723670646d7.jpeg)
https://makershub.jp/make/535

##108lus DK1
（欠番）

##109lus DK1（通称：DOMLUS）
100lusチーム竹内さん制作。
見ての通り、ダンボール製のアレです。「109」な・・・以下略。
![thumbnail_large_file-5.jpg](https://qiita-image-store.s3.amazonaws.com/0/63707/b63ee6f9-4adc-542a-9f9d-0b8b749a7f3a.jpeg)
https://makershub.jp/make/550


#さいごに
100lusは、100円ショップグッズをハックするイベント「ヒャッカソン」から生まれ、KinectやLeapMotion等などのセンサーデバイスに興味のある人たちのコミュニティ「Tokyo MotionControl Network」や、体験をプロトタイピングするラボ「WHITE」などの協力により、「VR4U」が実現されつつあります。私たちの活動に興味がありましたら、是非以下のサイトなどにアクセスしてみてください。

* ヒャッカソン  
https://www.facebook.com/groups/435596409902600/
* Tokyo MotionControl Network（TMCN）  
https://www.facebook.com/TokyoMotioncontrolNetwork
* Prototyping Laboratory WHITE  
http://255255255.com/

あと、自分で作るのがめんどくさかったら、100lusは売ってますので買ってくださいｗ
http://100lus.theshop.jp/
Padrinoの始め方

Padrinoの始め方

# 目的
padrinoをインストールする。
ただし、padrino自体も各プロジェクト配下にインストールする。

# 前提
rubyがインストールされていること

# padrinoをインストール

```lang:bash
bundle init
echo 'gem "padrino"' >>Gemfile
bundle install --path vendor/bundle
```

# プロジェクトの作成

```lang:bash
bundle exec padrino g project sample -t rspec -e erb -c sass -s jquery -d activerecord
rm -rf Gemfile Gemfile.lock .bundle vendor # 最初にinstallしたpadrinoを削除
cd sample
bundle install --path vendor/install # プロジェクトの配下にpadrinoと関連するgemをinstall
```

# 起動

```lang:bash
bundle exec padrino s -h 0.0.0.0
```
Parse + AngularJS + Rails + herokuで、最小限のコードでAPIサーバーと管理画面を作る

## いいたいこと
* データ構造を定義するだけで、アクセス制御(アカウント管理)付きのRestful API + 各プラットフォーム別SDK + 運用サーバーを自動的に用意してくれるParse、サイコー。
* でもある程度データ構造が複雑になってくると、管理用インターフェイスは自前で作らなきゃいけなくなってくる。
* 管理画面はCRUDがベースになることが多いからAngularJS使うと便利。
* 作業環境は`grant`とか`gulp`を使ってもいいけど、`rails` + `heroku`の組み合わせがなにかと楽。

## Parse
### Parseってなに

データ構造とアクセス制御周りの設定をしたら、自動的にRestful APIと実際にそれを運用するサーバーを生成してくれるサービス。所謂BaaSというやつだけど、設定画面/クライアント用SDK/ドキュメントの出来が素晴らしい。

[Parse](http://parse.com)

フルスクラッチでAPIサーバーを作る場合に比べて自由度が低いんじゃないか、と思うかもしれないしそれは事実だけど、**Parse上でやりやすい形**で作っていけば全然使える。一度これになれたら自分でスクラッチからAPIサーバーを書いて運用する、というのはとても面倒に感じるようになる。

### でも管理画面は自前で用意したい

![スクリーンショット 2014-12-23 21.01.08.png](https://qiita-image-store.s3.amazonaws.com/0/14097/a846cdec-e5ee-636f-ce78-d4682ce3c750.png)

しかし問題になるのが管理画面。データのCRUDは基本的にParseの管理画面上でできるが、モデル間にリレーションがあるような場合だったり、数百件もレコードがあったりするとさすがに最適化された管理画面が欲しくなってくる。

## AngularJS
管理画面はCRUDベースになることが多いので、[AngularJS](https://angularjs.org)との相性が良い。

```coffeescript

Parse.initialize("cwpY...", "BuSf...")
Project = Parse.Object.extend("project")

query = new Parse.Query(Project)
query.find
  success: (objects) ->
    $scope.$apply ->
      $scope.projects = objects
  error: (error) ->
    alert "error"
```

```haml

#ngExp(ng-controller="ProjectsCtrl")
  %ul
    %li(ng-repeat="project in projects")
      {{project.get("name")}}
```

ParseのSDKとの相性も問題ない。例えば、レコードのリストを表示するだけなら、こんな感じで至ってスマートに実装できる。素晴らしい。

※**わかりやすさ重視のため、ユーザ認証部分については省略しているが、本番運用では必須です!**

注意しなければいけない点としては、`$http`や`$resource`を使う場合と異なり、ParseのSDKのコールバック内で`$scope`に対して操作をしても、AngularJS側では変更を検知できないので、`$scope.$apply`を使う必要があるという点くらい。

## Rails + heroku
* `JavaScript(AngularJS)`を使うなら、`coffeescript`を使いたい。
* `coffeescript`を使うなら、コード変更時に自動的にコンパイルされてほしい。
* できれば`jade`か`haml`を使いたい。
* `twitter bootstrap`とかも使いたい。
* 最終アウトプットは`html` + `js`なので、デプロイも簡単に行いたい。

### grantかgulp?
素直に考えると、`grant`か`gulp`を使って環境を作るのが妥当だけど、`grant`は設定自体がだいぶややこしい。`yeoman`とか使って多少楽をしたとしても、デプロイ先サーバーの準備なども自分で行わなければいけないので結構面倒臭い。

### Rails + herokuいいかも
* 設定しなくても`coffeescript`とか`haml`が使える。
* `git`レポジトリが用意される。(heroku)
* 運用サーバーが用意される。(heroku)

というわけで、`grant` or `gulp`よりも`Rails` + `heroku`のほうが楽だと思う。

## 結論
この組み合わせだと、**最小限のコード**だけでAPIサーバーと管理サイトが作れるので楽しい。でも**セキュリティ周りは気をつけてね!**
Vim でもこころぴょんぴょんしたい！

A. ジャンプコマンドを使おう。
===

この記事は [Vim Advent Calendar 2014](http://qiita.com/advent-calendar/2014/vim) の 23 日目の記事です。

22 日目は petitviolet さんによる [Vimでブラウザを操る](http://qiita.com/petitviolet/items/45973a3bd4878b01a390) でした。

Vim にはタグジャンプを始めとする様々なジャンプコマンドがあります。これらを活用することで ~~こころぴょんぴょん~~ コードリーディングをよりスムーズにすることが出来ます。

`:help tagsrch.txt`

タグジャンプ
===

`ctags` を使って作成したタグファイルの情報を元に、定義元にジャンプすることが出来ます。
キーワードの上で `<C-]>` を押すとジャンプしますが、定義元が複数ある場合は最初のものにジャンプします。
ジャンプ先を選択したい場合は `g<C-]>` でジャンプ先を一覧表示し、選択することが出来ます。

タグジャンプはウィンドウ系のコマンドと組み合わせて、ウィンドウ分割で開いたり `<C-w><C-]>`
プレビューウィンドウに表示させたり `<C-w>}` することも出来ます。

インクルードファイルの検索
===

Vim には`'path'` オプションで指定された場所のインクルードファイルから定義や
キーワードを検索しジャンプするコマンドがあります。
`d` で終わるものはマクロ定義を、`i` で終わるものはキーワードを検索します。

### `[i` `[d`
  定義・キーワードを含む 1 行を表示する。数字を与えると幾つ目のものを表示するか
  指定することができる。

### `[I` `[D`
  定義・キーワードを含む行を全て表示する。

### `[<C-I>` `[<C-D>`
  定義・キーワードを含む行にジャンプする。数字を与えると幾つ目のものにジャンプするか
  指定することができる。

検索先は `'path'` オプションに依存するのでデフォルトだとカレントディレクトリ・カレント
ファイルと同階層のみとなります。ディレクトリ配下を再帰的に検索させたい場合は

```vim:
set path+=**
```

と指定しましょう。但し、ファイル数が多い場合は注意して下さい。検索の中断は `<C-c>` です。

比較
===

ctags が使え、タグファイルが生成出来る環境であればタグジャンプが正確で便利です。コマンドも
インクルード検索と比べると手軽です。

タグファイルを勝手に配置できなかったり、ctags が導入できない、インクルードファイルが頻繁に
変更されて毎回タグファイルを生成する訳にはいかない等の事情がある場合に、インクルードファイルの
ジャンプコマンドも覚えておくと役に立つかもしれません。

参考
===

https://gist.github.com/ujihisa/8292163


- - -

ちなみにまだごちうさは見ていません。リゼちゃんがかわいいのは把握してる。

以上、23 日目の記事でした。次回 24 日が現在欠番です。25 日の担当は mattn さんです！
Xcode 6.1を初めて触ってみた　その１　参考図書

#参考図書
###<a href="http://www.amazon.co.jp/%E3%81%9F%E3%81%AE%E3%81%97%E3%81%84Swift%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E2%80%95-iOS-8-Xcode-6%E5%AF%BE%E5%BF%9C/dp/4861009499" target="_blank">たのしいSwift programming―[iOS 8&Xcode 6対応]</a>
木下誠
BNN新社
2800円＋税

##購入理由

+ Xcode画面の各機能の使い方を画像をふんだんに丁寧に解説
　（ソースコードのコピペでアプリができるというSwift勉強会に出席したが、
　　Xcodeの機能の多さに驚き、体系的に勉強したいと感じた。）

+ 基礎的なSwiftの文法を解説
　（私自身はJavaScriptやPHPを少し触れる程度の知識。）
+ TwitterやFaceBook連携について解説

#playground
まずplaygroundファイルの新規作成。
画面右側が出力結果。瞬時に表示される。いちいちビルドとかランしなくていいので便利。
Qiitaの投稿画面みたいな感じだ！

#少しハマったところ#
**（エラー）**playgroundファイルを開き直した時、出力が一切表示されくなった。ファイルが壊れたのかと思った。
**（原因）**画像ファイル名をダブルクオーテーションで囲まなかった。
**（考察）**一つでもパースエラーがあると、ファイルを再度開いた時、エラーコードより前に書かれたコードの実行結果も表示されないようだ。

#ちなみにQiitaも初めてです
投稿方法で参考にさせていただいた投稿
<a href="http://qiita.com/yosee46/items/46fda0d1459ccdbdbde3" target="_blank">Qiitaの記法まとめ</a>

マークダウン記法というのも今回はじめて知りました。

・・・追記・・・
投稿して、ものの５分で30view,1ストックされて驚き。。。
他の方に少しでも役立てるように、また、自分の学びのアウトプットとして、投稿を続けたいと思います。
NumPy と matplotlib の環境構築

最近話題の機械学習系ですが、Pythonの一つの分野として確立しつつあります。PyDataというイベントも盛んに行われています。

CentOS 6.x に NumPy と matplotlib の環境構築を行います。

# 事前準備

CentOS に Development Tools をインストール

その他yumで必要なものをインストール

```yum
... 後報
$ sudo yum install freetype-devel
```

# インストール

```Python2.7.9
$ cd /home/cmscom/tmp
$ wget https://www.python.org/ftp/python/2.7.9/Python-2.7.9.tgz
$ tar zxvf Python-2.7.9.tgz
$ cd Python-2.7.9
$ ./configure
$ make
$ sudo make install
```

以下にインストール

```
/usr/local/lib/python2.7
```

PIPとvirtualenvのインストール

```pip/virtualenv
$ wget https://bootstrap.pypa.io/get-pip.py
$ sudo /usr/local/bin/python get-pip.py
$ sudo pip install virtualenv
$ cd /home/cmscom
$ virtualenv python
```

```numpy/nltk
$ ./python/bin/pip install numpy
$ ./python/bin/pip install nltk
$ ./python/bin/pip install matplotlib
$ ./python/bin/pip install ipython[notebook]
```


# インストールでトラブル

Mac OS上の別環境にNLTKのインストールをしていたらトラブルが起きました。経緯と解決方法を記載しておきます。

```エラーの内容
AttributeError: 'module' object has no attribute 'finders' 
```

エラーの内容を見ると NLTKのsetup.pyで、以下の処理を行っている部分でエラーが出ています。

```nltk/setup.py
from setuptools.command import sdist
del sdist.finders[:]
```

インストール環境の `setuptools` のバージョンを調べると、 `setuptools-11.0` がインストールされていました。


同様の現象が報告されていました。

NLTKのバグ報告
https://github.com/nltk/nltk/issues/824

setuptoolsのバグ報告
https://bitbucket.org/pypa/setuptools/issue/322/failure-installing-nltk-300-using

インストールを進めるために以下を行いました。

```setuptoolsバージョンダウン
$ ./python/bin/pip install setuptools==9.1 
```

一応これで解決!!

## 本質的な問題

NLTK側で、以下を実行していますが、これが問題です。

```
del sdist.finders[:]
```

詳しくわかりませんが以前のsetuptoolsを用いるときには必要だったのかと思います。
setuptoolsでVer.10以降に変更が加えられたようで、NLTK側での対応と上手くマッチしていないように思えます。

2009年の記事でこのあたりのことが語られています。
http://rhodesmill.org/brandon/2009/eby-magic/


setuptoolsでの出来事なので、 @aodag氏 か @shimizukawa氏の見解が欲しいところです。
Vagrant Cloudにサインインしたついでにboxを登録してみる

#Vagrant Cloudのアカウント作成#
https://atlas.hashicorp.com/account/new からアカウント作ります。

必要事項をいれたら`Create account`をポチッ。

#新規にboxを追加#
##まずは新規につくる##
Developmentにある`Name the box here`を選択。
![Development   Atlas by HashiCorp.jpeg](https://qiita-image-store.s3.amazonaws.com/0/40456/b068933c-b6b0-0950-838b-048a1b8f92d5.jpeg)

##box名などの入力##
まあ見たまんまですね。
![Create a Box   Atlas by HashiCorp.jpeg](https://qiita-image-store.s3.amazonaws.com/0/40456/936eba50-5980-ca85-28f2-6204330c50b3.jpeg)

##バージョンの入力##
[セマンティック バージョニング](http://shijimiii.info/technical-memo/semver/)のルールでバージョンナンバーとその説明を入れてあげる。
![New Box Version   Atlas by HashiCorp.jpeg](https://qiita-image-store.s3.amazonaws.com/0/40456/34b6625d-d537-41fe-ebb0-34535189e615.jpeg)

##プロバイダーの選択とboxファイルのアップロード##
boxのリポジトリが作られました。
この段階だと、どのプロバイダーに対応しているboxか分からんとのことなので`Create new provider`をポチッ。
![miyamoto_ta test   Atlas by HashiCorp2.jpeg](https://qiita-image-store.s3.amazonaws.com/0/40456/be117c5b-ef27-b0e7-1f4a-868ec0381b3c.jpeg)


providerに`virtualbox`といれて、`Upload`を選択して`Continue to upload`を選択。
![New Box Provider   Atlas by HashiCorp.jpeg](https://qiita-image-store.s3.amazonaws.com/0/40456/0c73ac95-37ba-3ee6-6e14-30b6ab7d4a49.jpeg)

boxファイルを選択してアップロード。
![Edit Provider   Atlas by HashiCorp.jpeg](https://qiita-image-store.s3.amazonaws.com/0/40456/c7c5288d-2772-c854-0696-aadb277c29c0.jpeg)

99%でfinishってボタンが出たけど気にせず押す。

###boxファイルの作り方###
boxファイルは`vagrant package`を実行するとpackage.boxってのが出来るです。

#boxの追加#
Vagrant Cloudにアップしたボックスは`vagrant box add [ユーザ名]/[box名]`で利用可能になる。

***
サインインしたついでに↑の方法でやったけど、Vagrantfileに設定書いてやる方法もあるみたい。
そのほうが簡単そうだなぁ。
SQLAlchemy メモ

# このエントリーの目的
SQLAlchemyをたまに使うと、使い方を忘れてしまうので使うたびにメモを取るためのエントリー

# データ取得

```
instance = sessoin.query(Model).filter_by(Schema=Value)
instance = sessoin.query(Model).filter(Model.Schema==Value) #上記と同じ

instance.one() # 一つだけあるときにオブジェクトを返す。無い場合(NoResultFound)や、複数ある場合(MultipleResultsFound)エラーになる。

instance.first() # 無い場合、Noneが返る。1つ以上ある場合、何かしら一つのオブジェクトが返る

instance.all() # リストが返る

[m.Schema for m for instance] # のように、instanceはイテレータブル。

instance.count() # 件数が返る
```

# データを格納

```
model_data = Model(Schema=Value)
sessoin.add(model_data)
model_data.Schema2 = Value2
transaction.commit()
```

```
model_data = sessoin.query(Model).filter_by(Schema=Value).first()
if model_data is None:
	model_data = Model(Schema=Value)
sessoin.add(model_data)
model_data.Schema2 = Value2
transaction.commit()
```
Alembicでマイグレーションスクリプトを自動生成する最小限の設定

# はじめに

最近、SQLAlchemyを使い始めたのですが、

モデルを定義したクラスからマイグレーションスクリプトを自動生成したかったので、

マイグレーションツールであるAlembicも使うことにしました。

自動生成のために必要な最小限の設定をメモします。

なお、使用したバージョンは以下の通りです。

```text
SQLAlchemy==0.9.8
alembic==0.7.2
```

# パッケージのインストール

SQLAlchemy と Alembic をインストールします

```text
pip install SQLAlchemy
pip install alembic
```

# 設定方法

やることは以下の３つです。

* Alembic の初期化
* metadata の設定
* URL の設定

## Alembic の初期化

こんな感じの構成だったとします。

```text
myapp
└── models.py
```

```py:models.py
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()


class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    name = Column(String(255), nullable=False)

    def __repr__(self):
        return "<User(name='%s')>" % (self.name)
```

`myapp` 配下で初期化コマンドを実行します。

```text
alembic init migrations
```

すると、以下のように構成が初期化されます。

```
myapp
├── alembic.ini
├── migrations
│   ├── README
│   ├── env.py
│   ├── script.py.mako
│   └── versions
└── models.py
```

なお、`migrations` の部分は任意です。

## metadata の設定

`env.py` ファイルで `models` をインポートして metadata を設定します。

```py:migrations/env.py
import models
target_metadata = models.Base.metadata
```

## URL の設定

### .ini ファイルを使う場合

`alembic.ini` の以下の部分を修正すればOKです。

```ini:alembic.ini
sqlalchemy.url = driver://user:pass@localhost/dbname
```

### set_main_option を使う場合

パスワードなどを直接記述したくない場合は、Configクラスのset_main_optionメソッドを使います。

`alembic.ini` の上記の部分は削除し、`env.py` に URL の設定を記述します。

```py:migrations/env.py
config.set_main_option("sqlalchemy.url", [DATABASE_URL])
```

pythonスクリプトなので、 [DATABASE_URL]の部分は設定ファイルから読み取るなり環境変数から読み取るなり自由にできます。

## env.py のサンプル

ほとんどデフォルトのままですが、サンプルを Gist にあげました。

* [migrations/env.py](https://gist.github.com/furico/8905c85d49ffa37f0618)

ここでは SQLite を使うようにしています。

# マイグレーションの実行

以下のコマンドで `migrations/versions` ディレクトリ配下にマイグレーションスクリプトが生成されます。

```text
alembic revision --autogenerate -m "Init tables"
```

そして以下のコマンドでマイグレーションを実行します。

```text
alembic upgrade head
```

# 参考

* [Alembicの公式ドキュメント](http://alembic.readthedocs.org/en/latest/index.html)
* [開発の途中ですがAlembicを導入します](http://qiita.com/yasunori/items/7073f96481c5fbba6400)
* [Python の Alembic を使って RDB のスキーマを管理する](http://momijiame.tumblr.com/post/45191790683/python-alembic-rdb)
プログラマになること#1


###記述する動機
私、とある専門学校でPGを教えています。はや８年。
いまだにSEもやってます。
学生さんたちに読んでもらうために書いているのですが、悩めるプログラマ、悩めるSE、悩める教育関係者にも何かのヒントにはなると思い、公開していきたいと思います。全て実例です。個人名は秘密！！

###出会い
私、10数年前、フリーのエンジニアとして、多忙な日々を送っていました。
閉店間際のスナック、クラブに行くことで、モチベーションを保ってる。なんとも、おバカです。

ある日、時間制のクラブで、女の子が「私達ね、夜間制高校、通信制で勉強しようと。」と言います。
「高校行かなかったの？」「違うよ。お金が無くて、行けなかったの。ちなみに、うちら中学もほとんど授業でとらんと」
「そうか…学びたいの?」「うん。プログラムとか出来たい。」
「そう。では明日また会いましょう。」「？」

###環境
使いふるしのノートPCにLinuxをインストール
細かなことは忘れたけど、エディタ、コンパイラを使えるようにドキュメント整理まで。
PC渡すときに一言、「本当にやりたいなら、やってごらん」

###本気の行動
学ぶ環境も、情報も無かったし、「出来たらいいなぁ」ぐらいだったと思います。家庭環境も辛かったろう。
「英語がわからん。どしたらいいと？」「辞書よめばいいよ。manも使おう。投げずにやってごらん。」
「私、数学の公式が暗記できん。やっぱバカやん」「数学は暗記するものでは無い。理解して使えればいいの。」
「長い文章がよめんと。やっぱ向いとらんとかな？」「短いとこから読めばいいよ。恥ずかしくない。とにかく読もう。」
彼女の携帯している可愛いノートはすぐに真っ黒になります。次には大学ノート。英和辞時点も真っ黒。古本屋で買った小説を毎日少しづつ読んで、「ここまで読んだよ。」と報告があります。ここは２ヶ月程

###c,c++,Jva
「いくらでも失敗していいから、プログラムしてみて。」
彼女は毎日やりました。最初はわからんかっただろうけど、徐々に「理解」を手に入れました。ここは３ヶ月程

###結果報告
ある日メールが来ます。「今日はお店最後やけん。来て。」
「うちね、明日からプログラマで働くとよ。」「うちみたいな子、いっぱいおるかな？うち、何かできるかな？」「ノートPCは記念やけん返さん。良かろ」
彼女は、今もSEとしてバリバリやっているそうです。（無理せにゃいいけど）
Objective-C から Swift のコードを使う


Swift から Objective-C のコードを使う例はよく出てますが、
既存の Objective-C プロジェクトに別アプリで作った Swift のコードを流用したい場合
どうしたらいいか分からなかったので調べたのでメモ。

# "プロジェクト名-Swift.h" をインポート

Swift のコードを呼び出したい Objective-C のクラスから "プロジェクト名-Swift.h" をインポートするだけ。
＃このファイルは XCode 上は見えませんがインポートできます。

```
#import "ProjectName-Swift.h"
```

これで Objective-C から Swift のコードが使えるようになります。
Rails4.2から追加されたweb-consoleを試してみた

#web-consoleの使い方
##エラーが発生させる方法
下記のようにRails4.2のプロジェクトでエラー出すとブラウザ上にconsoleが表示されます。
そのままUser.allしたり、ローカル変数にアクセスしたりできます。

```rb
def index
  raise
  @users = User.all
end
```

![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/61598/1b0cdf75-75c3-4ed3-88e0-d7bf5704d85b.png)

##consoleを使う方法
下のようにconsoleメソッドを呼んでもweb-consoleは起動してくれます。

```rb
def index
  console
  @users = User.all
end
```

#web-consoleのスコープ
##ローカル変数のスコープ
web-consoleのスコープ周りについてもう少し深く調べてみました。
下のようにブロック内でconsoleを呼ぶとweb-consoleではどの変数にアクセスできるか調べてみました。

```rb
def index
  a = 1 # アクセス可能(1が入っている)
  lambda {
    console
    b = 1 # アクセス可能(1が入っている)
  }.call

  lambda {
    c = 1 # アクセス不可(undefined local variable or method エラー)
  }.call

  test
  @users = User.all
end

private

def test
  d = 1 # アクセス不可(undefined local variable or method エラー)
end
```

調べた結果は上のコメントの通りです。
consoleを呼んだ時点のスコープの変数にだけアクセスできるみたいです。

##consoleメソッドを複数回呼んだ場合
```rb
def index
  a = 1 # アクセス可能(1が入っている)
  console
  lambda {
    console
    b = 1 # アクセス不可(undefined local variable or method エラー)
  }.call

  @users = User.all
end
```
上記のようにconsoleを2回呼んだ場合、1回目のスコープが有効になります。
2回目以降は無視されるようです。

##consoleとraiseを両方使った場合
```rb
def index
  a = 1 # アクセス可能(1が入っている)
  lambda {
    console
    b = 1 # アクセス不可(undefined local variable or method エラー)
  }.call
  raise

  @users = User.all
end
```
上記の場合も変数｢b｣にはアクセスできませんでした。
例外が発生した場合はconsoleのスコープが無効になるようです。

#web-consoleのコード
コードを少しだけ見てみました。
controller_helpers.rb のコードは下記の通りです。
bindingメソッドでBindingオブジェクトを生成しています。
Bindingオブジェクトはローカル変数等を保持してくれるようなのでこれを使ってweb-consoleで変数にアクセスしているのだと思います。

```rb
def console(binding = nil)
  @_console_binding = binding || ::Kernel.binding.of_caller(1)
end
```

view_helpers.rb のコードは下の通りです。
深くは追いかけてないのですが、controllerでconsoleを使ったなかったら直接レンダリングしているようです。

```rb
def console(console_binding = nil)
  return unless request.remote_ip.in?(WebConsole.config.whitelisted_ips)

  console_binding ||= binding.of_caller(1)

  unless controller.console_already_rendered
    @console_session = WebConsole::REPLSession.create(binding: console_binding)

    controller.console_already_rendered = true
    render('rescues/web_console')
  end
end
```
英語論文を読むためのTips

開発中には、日本語の情報がなく英語、果ては英語の論文を読む羽目になることも少なからずあります(今は特に機械学習関連で・・・)。

StackOverflowのような掲示板はまだいいのですが、論文となるとその物量に脳のブレーカーが落ちてしまい時間をかけた割には何も理解していないということがしばしばあるので、時間を効率的に使うためにも読む際のTipsをまとめておこうと思います。

## 読み飛ばさない
StackOverflowを読む際はさっさと解答の部分のコードを見てしまうことが多く、実はあまり英語を読んでなかったりします。
論文はそこから解答を探すという性質のものではないため、このメソッドを適用してしまうと脈絡なくあちこち読むことになり、時間をかけた割には断片的にしかわかっていない、最悪なにも理解していないという状態に陥ってしまいます。

そのため、最初の1～2ページ、少なくともAbstractは読み飛ばさず全部読んだ方が良いと思います。幸いにも論文は冒頭で研究内容とその結果の概略を教えてくれるので、最終的にはこちらの方が早いです。
そして、わからない単語は逐一辞書を引く(検索)をすることをお勧めします。論文ということは日本語でですら難しい内容をさらに英語で読んでいるわけなので、理解できない一文があると雪だるま式になって3～4文も行かないうちにただアルファベットを目で追っているだけになります。

繰り返しになりますが、少なくとも最初の1～2ページは丁寧に読むことが必要です。最近では選択するだけで訳を出してくれるChrome拡張などもあるので、効果的に利用すると良いと思います(そうすると単語を覚えなくなるというデメリットもありますが)。

## メモする
よし、読んだ、と思った後に内容を要約してみようとすると、結局わかった気になっていただけだということに愕然とすることがままあります。原因は定かでないですが、多分読むのに力を使ってしまうので知識として蓄えきれてないのではないかと思われます。

これを避けるため、論文のポイントとなる点をメモ帳にでもコピペで張り付けておくことをお勧めします。ゲームでいうところのセーブポイントのようなイメージです。各セクションにはだいたい結論を述べた箇所があるので、そこを忘れないように貼っておきます。自分のコメントをつけておくとなおよいでしょう。

これを行うと読んでる最中の集中力の低下を避けられるほか、読み終わった後きちんと読んだ痕跡が残るというメリットがあります。

## 時間を決めて読む
私のような英語凡人の場合、英語を読み続けられる時間には限界があります。限界を超えると理解が進まないばかりかその日一日集中力が低迷するという事態にも陥ります。

体感的にはこの時間は1時間程度で、継続的に読み続けるなら30分に1回休憩を入れるなどしてリフレッシュしたほうが良いと思います。この休憩の際は、なるべく席を立った方が良いです。休憩でグダグダとネットサーフィンをしていると低下した集中力も相まってダラダラとした無駄時間につながりかねません。Twitter及びFacebookなどのSNSは閉じておくことをお勧めします。
水を飲むとか顔を洗う、ストレッチするなど、体を動かすと効果があります。


以上が個人的なTipsになります。なんだかんだ言って英語の方が逆にわかりやすかったり、情報が多かったりということは良くあります。どのみち逃げ切れないことが多いので、ここは恐れず飛び込んでいきましょう。
.gitignoreの否定文(!)は、親ディレクトリがignoreされているファイルには効果がない。

`.gitignore` ファイルにファイル名のパターンをリストにして書いておくと、それらをgitによる管理から無視するようにできるわけですが、先頭に`!`を付けた行は「ただしこのファイルは無視しない」という意味になります。この`!`についてハマったところを解説します。

## 理想と現実

ディレクトリを無視した時に、その中の１ファイルだけ無視しないようにしたいことがあります。次のようなディレクトリ階層を考えます：

```text
└─.gitignore
└─bin/ #これ以下を全部無視したい
  └─hoge 
  └─fuga
  └─Resource #でも、これは無視したくない
```

試しに次のように書いてみます。

```txt:.gitignore
bin/
!Resource
```

しかし、これではうまく行きません。これだと `bin` 以下は `Resource` も含めてすべて無視されてしまいます。 `.gitignore` では、親ディレクトリが無視されているファイルは`!`を使っても無視しないようにはできないのです。

`Resource` ファイルは親ディレクトリである `bin` が無視されていたので、`!`による否定が効きません。

## どうするか

`bin` 以下を無視したいけど無視したくないファイルも含んでいる、そんなときは次のように書くのが正しいです。

```txt:.gitignore
bin/*
!Resource
```

bin/の後に*を追加しました。あくまでディレクトリを無視したのではなく、ディレクトリ内のファイルを無視しましたので、Resourceの否定が効くようになります。

## 参考

[gitignoreまとめ - maeharinの日記](http://d.hatena.ne.jp/maeharin/20130206/gitignore)
続：private docker registry を使ってみる(WebUI)

この記事は[private docker registry を使ってみる](http://qiita.com/DG0426/items/b8006c3168e245628005)の続きです。

# はじめに
private docker registry は便利ですが、今どんなイメージが入っているかがわかりづらいという欠点もあります。APIを叩けば、わかるにはわかるのですが、もっと直感的に知りたいという気持ちがあります。
調べてみると、Qiitaに既に記事がありました。

* [Docker Private Registry の WebUI を発見したので試してみました。](http://qiita.com/yungsang/items/32a1637036396bad0da7)
* [kwk/docker-registry-frontend](https://github.com/kwk/docker-registry-frontend)

どうやら、求めていたものに近そうですので、これを利用してみます。

# コンテナ起動
```bash
sudo docker run \
 -d \
 -e ENV_DOCKER_REGISTRY_HOST=ENTER-YOUR-REGISTRY-HOST-HERE \
 -e ENV_DOCKER_REGISTRY_PORT=ENTER-PORT-TO-YOUR-REGISTRY-HOST-HERE \
 -p 8080:80 \
 konradkleine/docker-registry-frontend
```

# 動作確認
```URL
http://(dockerホストのIPアドレス):8080
```

アクセスし、「Welcome, to the Docker registry!」が表示されれば正常に起動しています。

# 追記(2015/1/5)

下記エラーが出力された場合は[bcicen/docker-registry-frontend forked from kwk/docker-registry-frontend](https://github.com/bcicen/docker-registry-frontend)をdocker buildし、使用すると良い。

```bash
finalize namespace setup user get supplementary groups Unable to find user root
```
gulp-sketch


[gulp-sketch](https://github.com/cognitom/gulp-sketch)は、[gulp](https://github.com/wearefractal/gulp)から[SketchTool](http://bohemiancoding.com/sketch/tool/)を使えるようにするプラグインです。

※このドキュメントは、gulp-sketchの[README.md](https://github.com/cognitom/gulp-sketch/blob/master/README.md)の日本語版です。


## インストール

[SketchTool](http://sketchtool.bohemiancoding.com/sketchtool-latest.zip)をダウンロードして、インストールします。めんどうな場合は、[次のコマンド](https://github.com/cognitom/dotfiles/blob/master/lib/sketchtool.sh)をどうぞ。

```bash
$ curl -L https://raw.githubusercontent.com/cognitom/dotfiles/master/lib/sketchtool.sh | sudo sh
```

そのあと、`gulp-sketch`を`npm`からインストールします。

```bash
$ npm install gulp-sketch --save-dev
```


## 使い方

```javascript
var gulp = require("gulp");
var sketch = require("gulp-sketch");

gulp.task('sketch', function(){
  return gulp.src("./src/sketch/*.sketch")
    .pipe(sketch({
      export: 'slices',
      formats: 'png'
    }))
    .pipe(gulp.dest("./dist/images/"));
});
```

またはCoffeeScriptで、次のように書けます。

```coffeescript
gulp = require 'gulp'
sketch = require 'gulp-sketch'

gulp.task 'sketch', ->
  gulp.src './src/sketch/*.sketch'
  .pipe sketch
    export: 'slices'
    formats: 'png'
  .pipe gulp.dest './dist/images/'
```


## オプション

基本的には、`SketchTool`がサポートするオプションがそのまま使えます。

- `export`: pages,artboards,slices
- `formats`: png,jpg,pdf,eps,svg
- `scales`: 1.0,2.0
- `items`: エクスポートするアートボードやスライスの名前を指定。指定のない場合は、すべてのアートボードとスライスが出力対象です。
- `bounds`:
- `saveForWeb`: Web用に最適化する(YES) / **しない(NO)**
- `compact`: Compact形式にする(YES) / **しない(NO)** ※SVG出力でのみ有効.
- `trimmed`: Export images trimmed. (optional, defaults to NO).

上記のSketchToolのオプションに加えて、SVGを出力する場合は`clean`オプションが使えます。

- `clean`: SVGファイルから、Sketchのネームスペース情報などを取り除く(YES) / **取り除かない(NO)** ※詳しくは、[clean-sketch](https://github.com/overblog/clean-sketch)参照


## レイヤーの名前付け

レイヤー名が、そのままエクスポートするファイルの名前になります。スラッシュを使うとサブディレクトリに出力できます。[公式ドキュメント]([their article](http://bohemiancoding.com/sketch/support/documentation/11-exporting/2-slices.html))

- レイヤー名`yellow`で、`{ format:'png' }`オプションで出力 → `yellow.png`
- レイヤー名`square/yellow`で、同オプションで出力 → `square`ディレクトリ内に`yellow.png`

![Layer Naming](https://github.com/cognitom/gulp-sketch/raw/master/doc/layer-naming.png)


## 質問・フィードバック

GitHubのIssueへどうぞ。日本語でOKです。プルリクエストも歓迎です。

- https://github.com/cognitom/gulp-sketch/issues
Rails 4.2 アップデートでやった作業

Rails 4.2.0 にあげる作業をしましたが、アプリケーションの性質もあってか、あまり変更を必要としませんでした。
一応、やったことをメモしておきます。追加で何か見つかれば適宜追加します。

#### 対象アプリケーション

- アップグレード前は Rails 4.1.8 だった
- 主に Angular.js の JSON API を提供するサーバサイドとして使っているだけ

#### foreigner がいると bin/rake db:migrate が死ぬ

Gemfile から外した。foreigner を使って書いた add_foreign_key はとりあえずそのまま動いた。

#### bin/rails s -d で動かしてるアプリに localhost 以外からアクセスできなくなってる

Rack の仕様変更でデフォルトの挙動が変わったので `bin/rails s -d -b 0.0.0.0` とする必要があった。

http://edgeguides.rubyonrails.org/4_2_release_notes.html#default-host-for-rails-server

#### Angular.js の XSRF トークン対応が動かなくなった

Angular.js の XSRF トークンのデフォルト仕様のリクエストヘッダをそのまま受け付けるコードを書いていたが、以下のように書き換えないと動作しなくなっていた。

http://stackoverflow.com/questions/14734243/rails-csrf-protection-angular-js-protect-from-forgery-makes-me-to-log-out-on/15761835#15761835

```rb
# app/controllers/application_controller.rb

  # In Rails 4.2 and above
  def verified_request?
    super || valid_authenticity_token?(session, request.headers['X-XSRF-TOKEN'])
  end

  # In Rails 4.1 and below
  def verified_request?
    super || form_authenticity_token == request.headers['X-XSRF-TOKEN']
  end
```
Treasure Data の Hive クエリについて

この記事ではTreasure Dataでの効率的なHiveクエリの書き方を紹介したいと思います。

# Time Index pushdown を利用する
Treasure Dataを既にご利用な方なら知っているとは思いますが、Treasure Dataを効率的に利用するには取得したいデータの時間を絞ることによって効率的にデータを[抽出](http://docs.treasuredata.com/articles/performance-tuning)することができます。

この機能を使わないと全データがクエリの対象となり、Jobの実行時間が長くなり非効率なものとなってしまいます。

実はこの機能、下記のような通常のクエリ

`select id from foo where time >= 1349393020`

は、正常に動作していたのですが、

`select a.id
 from (select id from foo where time >= 1349393020) a
 join (select id from foo where time >= 1349393020 - 3600) b
 on a.id = b.id
`

のようなself join等サブクエリを使用するとHiveの最適化のせいでTime Index pushdownが利かないというような現象が起きていました。これを回避するためにサブクエリを別Jobとして実行するように

`select a.id
 from (select id from foo where time >= 1349393020 order by id) a
 join (select id from foo where time >= 1349393020 - 3600 order by id) b
 on a.id = b.id
`

わざと無意味なorder byを入れてHiveが最適化しないようなナレッジもありました。
現在はこの機能は改良され正常に動作するようになっています。

## 実装
さて、どのようにこの機能を実装しているのかというとHiveの[Filter Pushdown](https://cwiki.apache.org/confluence/display/Hive/FilterPushdownDev)という機能を利用しています。

TableScanDesc.FILTER_EXPR_CONF_STRを取得することによってfilter expressionを取得することができます。これを利用することによってHiveのアレやコレやをできるようになるでしょう。ただ、こいつの難点はHiveクエリが最適化された場合に値がセットされないということです。これを回避するには最適化が入る前にストレージ層でゴニョゴニョとする必要があります。実際にはHiveStoragePredicateHandlerを継承したクラスを作り、そいつにゴニョゴニョとやらせればTableScanDesc.FILTER_EXPR_CONF_STRを使った時どうようにあれやこれやできることになります。

# Hiveのクエリがエラーを吐く
これはTreasure Dataに限ったことではないのですが、Hiveのクエリを書いて実行するとSQLは正常なのにエラーとなる場合があります。Hiveは通常のSQLとは違うため普通に書いても動作しないのは困りますね。

## サブクエリ化する
以前までのHiveクエリでunionを利用するには[サブクエリ化](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Union)する必要がありました。Hive 0.13以降はこの制限が撤廃されトップでも使用できるようになっています。たぶん、この名残だとは思うのですが、普通に書いても通らなかったSQLが特定部分をサブクエリ化することによってJobが実行できるようになることが多々あります。たぶん、Hiveのプランナーが。。。

ということで、普通に書いても通らなかったSQLはサブクエリにできるようなとこはサブクエリ化してしまい、Jobを実行してみましょう。

# まとめ
Treasure Dataでのクエリを効率的に利用する方法とエラーになる場合のワークアラウンドを紹介してきました。なんかおかしいなと思ったらこの辺りを思い出してもらえれば幸いです。
CLLocationManagerのシングルトンクラス


## クラスの定義
```LocationManager.swift
import CoreLocation
    
let LMLocationUpdateNotification : NSString = "LMLocationUpdateNotification"
    
let LMLocationInfoKey : NSString = "LMLocationInfoKey"
    
class LocationManager: NSObject, CLLocationManagerDelegate {
    
    private var locationManager_: CLLocationManager
    private var currentLocation: CLLocation!
    
    struct Singleton {
        static let sharedInstance = LocationManager()
    }

    class var sharedInstance: LocationManager {
        return Singleton.sharedInstance
    }

    override init() {
        locationManager_ = CLLocationManager()
        locationManager_.desiredAccuracy = kCLLocationAccuracyBest
        locationManager_.distanceFilter = 100 // meters
        super.init()
        locationManager_.delegate = self
        // iOS8用のメソッドがあるかチェック        
        if (self.locationManager_.respondsToSelector("requestWhenInUseAuthorization")) {
            self.locationManager_.requestWhenInUseAuthorization()
        }
    }


    func startUpdatingLocation()
    {
        println("Starting location updates")
        self.locationManager_.startUpdatingLocation()
    }

    func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) {
        println("Location service failed with error: \(error.localizedDescription)")
    }

    func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) {
        var location = locations.last as CLLocation
        println("Location = \(location)")

        self.currentLocation = location

        var userInfo = [ LMLocationInfoKey : location]
        var center = NSNotificationCenter.defaultCenter()
        center.postNotificationName(LMLocationUpdateNotification, object:self, userInfo: userInfo)
        self.locationManager_.stopUpdatingLocation()
    }

    func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
        if (status == .NotDetermined) {
            if (self.locationManager_.respondsToSelector("requestWhenInUseAuthorization")) {
                self.locationManager_.requestWhenInUseAuthorization()
            }
        }
    }
}
```
## How to use

LocationManager.sharedInstance.startUpdatingLocation() で現在地探す。
現在地が見つかるとLMLocationUpdateNotificationが通知センターに送られるので、観測する側はその通知名を登録しておく。
userInfo辞書にはLMLocationKeyにlocationが入っている。

以下、例。

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        var center = NSNotificationCenter.defaultCenter() as NSNotificationCenter

            LocationManager.sharedInstance.startUpdatingLocation()
            center.addObserver(self, selector: "foundLocation:", name: LMLocationUpdateNotification, object: nil)
    }
    
    func foundLocation(notif:NSNotification) {
        println("foundLocation called")
    
        let info = notif.userInfo as NSDictionary!
        var location = info[LMLocationInfoKey] as CLLocation
    
        var coordinate = location.coordinate
        // ...適当に位置情報を処理
    }
みんなでノートをとったりできる同時編集対応のメモツールをいくつか紹介

# はじめに

おばんです。@ayokura です。
と、NHK盛岡の「おばんですいわて」の時刻丁度に投稿しようと思ったら、今日は祝日で放送がないっぽいです。

岩手を離れて5年目の冬になりました。
時々帰っているとはいえ、冬になると岩手山が恋しくなる今日この頃です。
岩手っぽさを出したいので、好きな岩手の情景をさくさく最初に述べてから本題にいきます（盛岡周辺ばかりでごめんなさい）。
岩手公園の石垣、冬の刺す様な寒さ、きれいだけど目に痛い雪景色、たくさんの山々、じゃじゃ麺。みたいな感じできれいな景色が好きです。

今回は、岩手ネタが思いつかなかった（＆岩手ネタを昨日まで考えていて別なネタを用意できなかった）ので、いくつか同時編集できるメモ帳Webアプリを紹介していきたいと思います。

# なぜ、「同時編集できる」「メモ帳」「Webアプリ」か

先に言いますと、全部がそろっている必要は必ずしもありません。
それこそ、メモ帳程度のものよりリッチなものが求められることもあると思います。
ただ、イニシャルコスト[^1]はともかくとして、使いたいと思ったときに手軽であるかどうかは重要です。
そして、ブラウザひとつで使えることは手軽さという面では重要です。
学校などで利用するPCが制限される場合などもありますし。

[^1]: 登録とか設置とかのコストのつもり

## 同時編集の利用用途

共同編集のものはいろいろ(evernoteとかね)ありますが、同時編集には加えてどんな用途があるのか、簡単に三つ列挙してみます。

* 講義中にみんなでノート作り
* 会議中みんなで議事録取り
* さらに進んで会議のAgendaをあらかじめ書いておいてみんなで編集しながら会議進行

議事録に関しては、会議の最後に確認して、そのままメールで送って終了、ってできるのは便利です。

# 同時編集可能な製品いろいろ

スマートフォンからの利用性についてはあまり検討してないです。
またIE9未満では日本語圏ではまともに使えないと思います（CompositionEventという日本語入力中を知らせるJavascriptイベントが発生しないため）。
僕自身は自分と友人間での手軽なメモにはEtherpad-Liteを使い、それ以外の相手とは用途に合わせていろいろ使っています。

## [Google Docs](https://docs.google.com)

みなさんご存じGoogle社のWebサービスです。Googleアカウントがあれば無料で利用できます。
URLによる共有・メールアドレスを利用しての共有・グループ単位での共有などが可能で、
共有レベルも共同編集者・回覧者等いくつかの段階をもたせることができます。
スマートフォンアプリを使って同時編集することもできます。
新しいドキュメントの作成はWebからクリック一つでできます。

企業向けにはGoogle Appsの一つのサービスとして提供されています。

## [OneDrive（Word Online）](https://onedrive.live.com/)

マイクロソフトのOneDriveのWeb編集機能です。Microsoftアカウントがあれば無料で利用できます。
共有機能についてはGoogle Docsと同様。
Officeとの親和性が高く、Office文書を高い再現度で表示できますし、
最近のWordには連携機能もついてます。（Wordを使う場合は同時編集は難しいですが）
新しいドキュメントの作成はWebからクリック一つでできます。

企業向けにはOffice 365の一環としてOneDrive for Bussinessと同時に提供されます。
また、SharePointと連携したOffice Web Appsとして社内にホスティングすることもできます（面倒なのでおすすめはしません）。

## [Etherpad-Lite](https://github.com/ether/etherpad-lite)

nodejsで書かれたオープンソースの同時編集できるメモ帳です。（もともとはEtherpadというJavaで書かれていたツールの後継）
最近、利用者の言語に合わせてUIが自動で翻訳されるようになりました。

とりあえず、Github公式にもあるimgurの画像を動作イメージとして張っておきます。（いろいろプラグイン導入されているものですが）
![動作イメージ](http://i.imgur.com/zYrGkg3.gif "Etherpad Lite")

編集機能はここまでに紹介してきたものとは違い、リッチテキスト程度の編集に限られます。
プラグインの開発ができるので、エクスポートや内部リンクなどが自由に拡張できるのは強みだと思っています。
日本語編集周りでは、入力中はすべての更新をため込んでおくだけで止めて、確定後に全部反映するという挙動をします。
（連文節変換を多用する人には合わないかもしれません）

共有はURLを教えるだけ。
新しいPadの作成は、存在しないPadのURLを打ち込む or Webからクリック一つでできます。

不便なところ

* Pad名の変更ができない
* Padの削除がプラグインかAPIをたたくの必須
* Padの列挙にプラグインかAPIをたたくの必須
* iisnodeの上で動かない = Azure Web Siteの上で動かない
* herokuの上でも簡単には動かない

つい最近、複数行ペーストしたときに改行が無視される問題が修正されたりしたので、常用できる状態になったのかな、と思い紹介しました。
まあ、設置コストは高いです……。
ただ、自分の管理するサーバー内に設置した場合、情報を他者に渡すことなく管理できるのは強みでしょうか。（お仕事先ではこのメリットもあってメインのツールです）

## [HackPad](https://hackpad.com/)

今年、Dropboxに買収された、Etherpad的なツールです。
Googleアカウント・Facebookアカウント・メールアドレスでログインすることができます。
PadのURLを教えることで共有することができますが、共有先の相手もログインしなければ編集できません。
逆に非公開・限定公開にするにはお金を払う必要があるので僕はあまり使ってはいません。
メールでのPad追加が便利です。

新規Padの作成は、存在しないPadのURLを打ち込む・メールする・Webからクリック一つでできます。

# おわりに

ここにあげてないサービスでこんなのがあるよ！というのがありましたら教えていただければ喜びます。（僕が）
共同編集便利なので、もっと活用されたらいいなあと思っています。

クリスマスおめでとうございます！
Auto Layoutコツ


よくレイアウトが崩壊してしまうのでメモ。

-   最下層のビューから順に設定
-   Update FramesやるとConstraitsに合わせてviewのサイズや位置調整してくれる
-   Constraintはコード内にOutletとして紐付けできる
    -   Auto LayoutでConstraints付けてるViewはコード内で`frame`を動かそうとしても動かないので、Constraintをコード内でいじると良い
-   崩壊してきたらClear Constraintsでリセットしていく
-   最悪Discard Changesで最新のコミットに戻す
    -   なのでいい感じになった時点で随時コミットしていくと良い

他にもあったら教えてほしい。
MacでRedisを使ってみる


## Redisのインストール

Homebrewからインストールできます。

```bash
$ brew install redis
==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/redis-2.8.13.mavericks.bottle.tar.gz
######################################################################## 100.0%
==> Pouring redis-2.8.13.mavericks.bottle.tar.gz
==> Caveats
To have launchd start redis at login:
    ln -sfv /usr/local/opt/redis/*.plist ~/Library/LaunchAgents
Then to load redis now:
    launchctl load ~/Library/LaunchAgents/homebrew.mxcl.redis.plist
Or, if you don't want/need launchctl, you can just run:
    redis-server /usr/local/etc/redis.conf
==> Summary
?  /usr/local/Cellar/redis/2.8.13: 10 files, 1.3M
```

## redisサーバーの起動

次のコマンドでRedisを起動できます。

```bash
$ redis-server
[86861] 19 Jul 00:04:43.047 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
[86861] 19 Jul 00:04:43.049 * Increased maximum number of open files to 10032 (it was originally set to 256).
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 2.8.13 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in stand alone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 86861
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

[86861] 19 Jul 00:04:43.055 # Server started, Redis version 2.8.13
[86861] 19 Jul 00:04:43.055 * The server is now ready to accept connections on port 6379
```

## redisに接続

起動したRedisに接続するには、次のコマンドを使います。

```bash
$ redis-cli
127.0.0.1:6379>
```

## Redisへの値の設定と取得

### setコマンド

Redisに値を設定するにはsetコマンドを使用します。

set [key] [value]

```bash
127.0.0.1:6379> set test-key test
OK
```
### getコマンド

Redisに設定した値を取得するにはgetコマンドを使用します。

get [key]

```bash
127.0.0.1:6379> get test-key
"test"
```
### delコマンド

Redisに設定したキーを削除するには、delコマンドを使用します。

```bash
127.0.0.1:6379> del test-key
(integer)1
```

## その他

Redisに登録してあるすべてのキーを削除する

```
$ redis-cli --raw -n 0 KEYS "*" | xargs redis-cli -n 0 DEL
```
pm2で管理しているNode.jsプロセスを、Node.jsからpm2を起動して管理する。


> ※ 分かりにくいタイトルですがご了承ください。

##はじめに
私はNode.jsのデーモン化のツールとして(なんとなく高機能という噂なので)[pm2](https://github.com/Unitech/pm2)を利用してます。
pm2はプログラムから呼び出すことも出来るので今回はこの機能を利用して、pm2プロセスを定期的に再起動するスクリプトを組んでみます。
 **デフォルト機能でスケジューリングって無いのかな...?**

参考: [Using PM2 programmatically](https://github.com/Unitech/PM2/blob/development/ADVANCED_README.md#programmatic-example)

###チュートリアルにあるコード

```pm2kick.js
var pm2 = require('pm2');

// Connect or launch PM2
pm2.connect(function(err) {

  // Start a script on the current folder
  pm2.start('test.js', { name: 'test' }, function(err, proc) {
    if (err) throw new Error('err');

    // Get all processes running
    pm2.list(function(err, process_list) {
      console.log(process_list);

      // Disconnect to PM2
      pm2.disconnect(function() { process.exit(0) });
    });
  });
})
```

これをpm2kick.jsとして実行すると

```
$ node pm2kick.js
```

test.jsがpm2起動されます。pm2 listコマンドで確認出来ると思います。

```
$ pm2 list
┌────────────────────┬────┬──────┬──────┬────────┬───────────┬────────┬─────────────┬──────────┐
│ App name           │ id │ mode │ PID  │ status │ restarted │ uptime │      memory │ watching │
├────────────────────┼────┼──────┼──────┼────────┼───────────┼────────┼─────────────┼──────────┤
│ test               │ 0  │ fork │ 6545 │ online │         1 │ 15s    │ 18.648 MB   │ disabled │
```

## node-cronを利用してpm2を再起動させる

###準備
pm2,time,cronをインストールします。

```
$ npm i --save pm2 time cron
```

###コード

プロセスのリスタートは`restart();`というメソッドを利用します。

今回は全てのプロセスを再起動させたいので第一引数にallを渡して
`pm2.restart('all', callback);`を利用します。

```pm2restart.js
var pm2 = require('pm2');
var cronJob = require('cron').CronJob;
var cronTime = "0 0 6 * * *"; // 毎日朝6時に実行

//プロセスの状態を確認して終了させる
function showAndDone(){
  pm2.list(function(err, process_list) {
    console.log(process_list);
    // Disconnect to PM2
    pm2.disconnect(function(){
      process.exit(0);
    });
  });
}

//全て再起動
function restartAll(){
  pm2.restart('all', function(err, proc){
    showAndDone();
  });
}

var job = new cronJob({
  cronTime: cronTime,
  onTick: function(){ //指定時に実行したい関数
    console.log('onTick!', new Date()); //時間表示

	//pm2関連を実行
    pm2.connect(function(err) {
      restartAll();
    });

  },
  onComplete: function() { //ジョブの完了または停止時に実行する関数
    console.log('onComplete!');
  },
  start: false // コンストラクタを終する前にジョブを開始するかどうか
  // timeZone: "Japan/Tokyo" //タイムゾーン
});
 
job.start();
```

##確認

先ほど作った **pm2プロセス監視用のpm2restart.js自体もpm2プロセスとして登録します。** 分かりにくいですね汗

```
$ pm2 start pm2restart.js
```

![](http://i.gyazo.com/2bcc19d0b7fc124eace91779573ab41d.png)

cronがちゃんと動いてくれれば指定時間がくればpm2restartも含めて全てのプロセスが再起動されます。

**↓指定時間後↓**

![](http://i.gyazo.com/e9b601e9b5881c368fc2d4d21e906cdd.png)

全てのプロセスが再起動されていることが分かります。


## 参考リンク
* http://matomater.com/16991/
* http://liginc.co.jp/web/programming/node-js/123719
コード内からストーリーボード上のビューコントローラを使う


## ストーリーボード上でStoryboard IDを付けておく

![ss1.png](https://qiita-image-store.s3.amazonaws.com/0/13257/e2f35604-1fa3-35c5-72c1-31f61c5a663a.png "ss1.png")

ViewControllerのIdentity inspector

## コード内でストーリーボードを生成し、IDで呼び出す

    // MainStoryboard.storyboardの生成
    let storyBoard: UIStoryboard = UIStoryboard(name: "MainStoryboard", bundle: nil)
    // ここでID指定して自前のNavigationControllerクラスとして生成
    var nav = storyBoard.instantiateViewControllerWithIdentifier("CommentNavigationController") as NavigationController 
    // パラメータ渡したいのでNavigationControllerの中身のviewControllerを生成
    let topView = nav.topViewController as CommentViewController 
    // プロパティに渡す
    topView.parameter = hoge
mds_storeがうざいので止める


mds_store は spotlight のインデクスを作成するプロセスらしい。
cpuをけっこう食う上に spotlight 使ってないので止める。

```
$ sudo mdutil -a -i off
```

再度有効にするには

```
$ sudo mdutil -a -i on
```

参考: [Disable OS X spotlight indexing.](https://www.darklaunch.com/2014/06/15/os-x-disable-mds-stores-spotlight-indexing)

## 追記(2016/3/28)

spotlight止めたらAlfredのインデックスが更新されなくなった(Alfredは内部的にspotlight使ってるらしい)ので結局復活させた。
Oracleの一時表領域がディスク圧迫した際の復旧手順


## 復旧手順
DBサーバでディスク使用率100%が結構発生する割に個人的によくコマンド忘れるので、備忘録として手順を記載します。

### 【手順1】 空きのあるディスク(フォルダ)に一時表領域を作成する

　``ALTER TABLESPACE TEMP ADD TEMPFILE '/tmp/tempxx.dbf' SIZE 128M AUTOEXTEND OFF;``

※ファイル名は何でもよい。ここでは「/tmp/tempxx.dbf」としている。

### 【手順2】 ディスク圧迫している一時表領域のデータファイルを削除するためオフラインにする

　``ALTER DATABASE TEMPFILE '/usr/oracle/app/oradata/db01/temp01.dbf' OFFLINE``

※ここではディスク圧迫している一時表領域のデータファイルを「/usr/oracle/app/oradata/db01/temp01.dbf」としている。

### 【手順3】 手順2でオフラインにしたデータファイルを削除する

　``ALTER DATABASE TEMPFILE '/usr/oracle/app/oradata/db01/temp01.dbf' DROP INCLUDING DATAFILES``

削除できない場合はアプリが使用している可能性があるので下記SQLでプロセスを確認し、対象のプロセスを終了させてから再度削除を試みる。

```
select
  s.username, s.osuser, s.machine, s.terminal, s.program,
from
  v$session s, v$process p
where
  s.paddr = p.addr;
```


### 【手順4】 削除した一時表領域のデータファイルを再作成する

　``ALTER TABLESPACE TEMP ADD TEMPFILE '/usr/oracle/app/oradata/db01/temp01.dbf' SIZE 2048M AUTOEXTEND OFF``

### 【手順5】 手順1で作成したデータファイルを削除するためオフラインにする

　``ALTER DATABASE TEMPFILE '/tmp/tempxx.dbf' OFFLINE``

### 【手順6】 手順5でオフラインにしたデータファイルを削除する

　``ALTER DATABASE TEMPFILE '/tmp/tempxx.dbf' DROP INCLUDING DATAFILES``


## 参考
http://mogumogukun.wordpress.com/2011/02/24/

以上。
[Swift]これは覚えたい！！filter、map、reduceを使うとスゴい便利だった


俺の名はケンヤ。難事件をいくつも迷宮入りさせたニート。しかし ある時謎の組織に入社し薬を飲まされ身体が縮んで **Braian** になっちゃった。

##reduce  配列内を足し算
reduceは配列内の合計値が計算できる

```
var plus = { (a: Int, b: Int) -> Int in a + b }

var num = [0, 1, 2, 3, 4, 5].reduce(0, plus)
println(num)
// 15が出力される
```


##filter 配列をフィルタリング
filterは配列のフィルタリング
0〜10の配列内の値を偶数でフィルタリングして抜き出す

```
var filterA = {
	(a: Int) -> Bool in a% 2 == 0
}

var filterResult = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10].filetr(filetrA)
println(filterResult)
// [0, 2, 4, 6, 8, 10]が出力される
```


##map 配列の変更
mapは配列内の値を変更する
0〜5の値を2倍する

```
var mapMultiply = { (a: Int) -> in a * 2 }

var mapResult = [0, 1, 2, 3, 4, 5].map(mapMultiply)
println(mapResult) 
// [0, 2, 4, 6, 8, 10]
```

###map、filter、reduceを使ってチェーンさせる

```
 let numbers: [Int] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
 let result = numbers.map({ (value: Int) -> Int in return value * 2})
.filter({ (value: Int) -> Bool in value % 4 == 0})
.reduce(0, {(a: Int, b: Int) -> Int in a + b})
result
// 60
```

めっちゃ便利ですね。関数つくるのが苦手なので慣れたいです。
今回はメモ用として書きました。
Swiftは日本語の情報が少ないので大変です。
chrome に保存したパスワードを確認する

開発中にテスト用サイトのパスワード管理をchromeに任せっきりにしていたため、パスワードを綺麗さっぱり忘れていて困ることが多々あります。


そんな時に便利な chromeに登録してあるパスワードの確認方法です。

### 調べるパスワードがたくさんある時の手順
1. chrome://settings をアドレスバーに入力する
2. `パスワードを管理` をクリックする
![パスワードを管理.PNG](https://qiita-image-store.s3.amazonaws.com/0/18789/3c99770a-d614-b065-a8e6-3a0002ffb15f.png)
3. 表示したいサイトを選択し、表示ボタンをクリックする
4. パスワード(win の場合ログインパスワード)をきかれるので入力する

### とりあえず現在の画面のパスワードが知りたい時の手順
1. chrome による自動入力が行われた画面で開発者ツールを立ち上げ、パスワード入力欄の `type="password"` を type="text" に書き換える
tableのボーダーがie9以上だけ効かないよ


thとtdにborder引いたけどie9だと出ませんでした。

前提:
ie9+しか確認していません

#解決方法

tableに以下を追加
border-collapse: separate;
border-spacing: 0;

```scss
table {
    border-collapse: separate;
    border-spacing: 0;
    th {
        border-left: 1px solid $border-form;
        border-right: 1px solid $border-form;
        border-bottom: 1px solid $border-form;
    }
    td {
        border-right: 1px solid $border-form;
        border-bottom: 1px solid $border-form;    
    }
}
```

#注意
border-collapseはcollapseがデフォルトな罠
MySQL　基本的なテーブル作成コマンド（おぼえがき）

create table posts(
	id int not null auto_increment primary key,
	name varchar(255),
	email varchar(255),
	password char(32),
	score double,
	sex enum('male','female') default 'male',
	memo text,
	createed datetime
);




+----------+-----------------------+------+-----+---------+----------------+
| Field    | Type                  | Null | Key | Default | Extra          |
+----------+-----------------------+------+-----+---------+----------------+
| id       | int(11)               | NO   | PRI | NULL    | auto_increment |
| name     | varchar(255)          | YES  |     | NULL    |                |
| email    | varchar(255)          | YES  |     | NULL    |                |
| password | char(32)              | YES  |     | NULL    |                |
| score    | double                | YES  |     | NULL    |                |
| sex      | enum('male','female') | YES  |     | male    |                |
| memo     | text                  | YES  |     | NULL    |                |
| createed | datetime              | YES  |     | NULL    |                |
+----------+-----------------------+------+-----+---------+----------------+




//ユーザ一覧
$sql = "select * from users";
$stmt = $dbh->query($sql);
foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $user){
	var_dump($user['name']);
}

//レコード追加
$stmt = $dbh->prepare("insert into users(name,email, password) values (?,?,?)");
$stmt->execute(array("n", "e", "p"));
echo "done";

//レコード追加2
$stmt = $dbh->prepare("insert into users(name,email, password) values
 (:name, :email, :password)" );
$stmt->execute(array(":name"=>"n2", ":email"=>"e2",":password"=>"p2"));

echo "done";