OmniAICreator/Qiita-1.07M huggingface dataset:
[Linux] whichがいつのまにかnode_modulesになっていた。。

## 経緯

nodejsのバージョンをあげようと思って、yumからnodejsとnpmを削除後
ソースコンパインルでnodejsをインストール。

そのとき、インストールディレクトリを/usr から /usr/local に変更した。

そしたらなぜかwhichがなくなっていたので、lsしたらnode_modulesになっていた

```shell-session
$ ls -la /usr/bin/which
lrwxrwxrwx 1 root root 35 Jun  5 17:21 which@ -> ../lib/node_modules/which/bin/which
```

## 修復

whichの再インストール

```shell-session
$ sudo yum reinstall which

（中略）

$ ls -la /usr/bin/which
-rwxr-xr-x 1 root root 20768 Jun 22  2011 /usr/bin/which*
```

いつのまに書き換えられていたんだろう…


## 追記

``sudo npm install -g hogehoge``が正常に動かないなど
いろいろ弊害がでてきたので、prefix=/usr に変更しました。。
Ubuntu15.04をルータ化(インターネット<->無線(ubuntu)有線<->他のPC)

## 参考

* [Routing - Ubuntu 14.04のルーター化 - Qiita](http://qiita.com/Kshi-Kshi/items/2fa1436248f1d4938861)

## ルータ化したい端末にて実施

```diff:/etc/sysctl.conf
+ net.ipv4.ip_forward=1
```

```bash:設定反映
sudo sysctl -p
```

* 以下この端末の有線LAN側のIPアドレスを`192.168.9.9/24`に固定した例で進める。

## インターネットに出たい他の端末にて実施

```bash:/etc/resolv.conf
nameserver 192.168.9.9
```

```bash:
/sbin/route add default gw 192.168.9.9
```

ネットに出られることを確認。

## dhcpサーバを建てたい場合

```bash:./dnsmasq.conf
interface=eth0
no-daemon
dhcp-range=192.168.9.10,192.168.9.23,12h
dhcp-option=3,192.168.9.9
```

* 分かり辛いが、デフォルトゲートウェイは `dhcp-option=3,ipaddr`で指定。

```bash:
sudo dnsmasq --conf-file=dnsmasq.conf
```
Hiveserver2 がダウンしたらアラートメールを受け取る方法

Cloudera Manager を使って、Hiveserver2 がダウンしたときにアラートメールを受け取る方法を紹介する。

# 環境

- Cloudera Manager (5.x 以降)

# 準備

アラートメールを受信するメールアドレスを設定するだけで、他に設定する必要はない。

## アラートメールの受信アドレスの設定

**Cloudera Management Service** を開き、 **設定** から **受信者** というキーワードで検索し、 **アラート: メールメッセージの受信者** という設定項目に、アラートメールを受信したいメールアドレスを入力する。

![CM5_アラートメールメッセージの受信者.png](https://qiita-image-store.s3.amazonaws.com/0/17749/fbdd1426-ff4a-5390-e1bb-e69d089e71f4.png)

設定を変更したらCloudera 管理サービスを再起動する。


# アラートメールの一例

Hiveserver2 がダウンすると、以下のようなメールが送信される。
アラート送信のテストをしたければ、単純にプロセスを `kill` すればいい。

![CM5_Hiveserver2ダウン時のアラートメール.png](https://qiita-image-store.s3.amazonaws.com/0/17749/745379ff-7743-9500-0154-ca305cde953d.png)

リンクをクリックすれば Cloudera Manager の該当画面にジャンプすることができる。


## OutOfMemoryError かどうかを確認する方法

OutOfMemoryError は Hiveserver2 ではしばしば起こりうる現象であるが、残念ながら現在のバージョンの Cloudera Manager ではメールに記載してくれない。(後述)
もし OOM を疑う場合は以下の場所から確認することができる。

**Hive** -> **Hiveserver2** -> **プロセス** -> **Stdout**

プロセスの標準出力に、以下のメッセージが出力されていれば、OOM でダウンしたことがわかる。

```
# java.lang.OutOfMemoryError: Java heap space
```

![CM5_Hiveserver2_OOMの確認.png](https://qiita-image-store.s3.amazonaws.com/0/17749/cb739d62-2c1f-ceed-ceee-3c70a52cce7e.png)

なお、OOM そのものをアラートに出力する改善は近い将来実装されるので、上記のように確認する必要もなくなるだろう。
Node.js+gulp+jsdocでAPIドキュメントを生成

Node.jsを初めて11日目か12日目
ドキュメントを生成したくなりました。
その時のメモ

gulp-jsdocを使います

#インストール
`npm install gulp-jsdoc`

#使い方
単にソースフォルダのファイルを指定する場合

````js
var jsdoc = require("gulp-jsdoc");
 
gulp.src("./src/*.js")
  .pipe(jsdoc('./documentation-output'))

````

##jsdoc.parserを使う場合

````js
gulp.src("./src/*.js")
  .pipe(jsdoc.parser(infos, name))
  .pipe(gulp.dest('./somewhere'))
````

infosには下記のような値を設定可能

###infos.name
Type: String
Default: ''

###infos.description
Type: String
Default: ''

###infos.version
Type: String
Default: ''

###infos.licenses
Type: Array
Default: []

###infos.plugins
Type: Array
Default: false
例: ['plugins/markdown']
bond1でeth2では通信できるがeth3では通信できない問題

bond1を作成し、eth2, eth3それぞれLANケーブルを抜いたりさしたりして検証中に遭遇。
bond0を作成し、eth0, eth1では問題が起こらない。

## 参考

* [When a bonding device releases a slave, a warning message is printed, similar to: "bonding: bond0: Warning: the permanent HWaddr of eth0 - xx:xx:xx:xx:xx:xx - is still in use by bond0" - Red Hat Customer Portal](https://access.redhat.com/solutions/117013)

* /etc/init.d/network restart しろとのこと。
* これで回避は出きるが・・・

## CentOS5.10以降、bondingの書き方が少し変わった様子

* [16.2.3. Channel Bonding Interfaces](https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/5/html/Deployment_Guide/s2-networkscripts-interfaces-chan.html)

* ifcfg-bondN に BONDING_OPTS="bonding ..."で記述
* modprobe.confにはbondingに対するオプションを記述とのこと。

```diff:/etc/sysconfig/network-scripts/ifcfg-bond0
- BONDING_OPTS="mode=active-backup miimon=100"
```

```diff:/etc/sysconfig/network-scripts/ifcfg-bond1
- BONDING_OPTS="mode=active-backup miimon=100"
```

```rb:/etc/modprobe.conf
alias bond0 bonding
options bond0 mode=active-backup miimon=100 max_bonds=2
alias bond1 bonding
options bond1 mode=active-backup miimon=100 max_bonds=2
```

mode=1: active-backup

## udevの書き方(CentOS 5.11)

* [linux - RHEL: Creating stable names for network interfaces - Unix & Linux Stack Exchange](http://unix.stackexchange.com/questions/75427/rhel-creating-stable-names-for-network-interfaces)

```diff:/etc/sysconfig/network-scripts/ifcfg-eth[0-3]の例
+ HWADDR=00:30:48:56:A6:21
```

```diff:/etc/udev/rules.d/60-net.rules
+ KERNEL=="eth*", SYSFS{address}=="00:30:48:56:A6:21", NAME="eth0"
+ KERNEL=="eth*", SYSFS{address}=="00:30:48:56:A6:22", NAME="eth1"
+ KERNEL=="eth*", SYSFS{address}=="00:30:48:56:A6:23", NAME="eth2"
+ KERNEL=="eth*", SYSFS{address}=="00:30:48:56:A6:24", NAME="eth3"
```

* OS再起動し、反映

* eth1, eth3 5行目
Safari Push Notifications の調査

MacOSへの通知 [Safari Push Notifications](https://developer.apple.com/notifications/safari-push-notifications/) について調べてみた内容をまとめます。

# 概要

## 日本語 (公式ページより)

>Apple プッシュ通知サービスを使用すると、ウェブサイトのユーザーの Mac デスクトップに通知を送信できます。Safari が起動していなくても通知は機能します。プッシュ通知にはウェブサイトのアイコンと通知テキストが表示され、ユーザーがこれをクリックするとウェブサイトにアクセスできます。

## 英語 (公式ページより)
>OS X Mavericks introduces a powerful new way to keep users engaged with your website. You can now use the Apple Push Notifications Service to send notifications to your website users, right on their Mac desktop — even when Safari isn’t running. Safari Push Notifications work just like push notifications for apps. They display your website icon and notification text, which users can click to go right to your website.

# 背景

それまでMacOSアプリからの通知だけだったのがWWDC 2013でWebサイトへの通知ができるようになったと発表された。

今今、あまり注目されていないのは、私が無知だったのか？
MacOSユーザ+Safariで利用するユーザの割合が低く投資対効果が期待できないからなのか？
少しでもユーザ接点を増やせるので、やるべきだと思うのだが。。
シェアも含めて調べたい。

# 仕組み

[About Notifications for Websites - Appleのドキュメント](https://developer.apple.com/library/mac/documentation/NetworkingInternet/Conceptual/NotificationProgrammingGuideForWebsites/Introduction/Introduction.html)

通知の作り方は2種類 APNs を使う方法と、
ローカル JavaScriptを使って通知を作る方法がある。

仕様は追って下記ドキュメントを調査。

* [Configuring Safari Push Notifications](https://developer.apple.com/library/mac/documentation/NetworkingInternet/Conceptual/NotificationProgrammingGuideForWebsites/PushNotifications/PushNotifications.html#//apple_ref/doc/uid/TP40013225-CH3-SW1)

* [Local Notifications Are Invoked with JavaScript](https://developer.apple.com/library/mac/documentation/NetworkingInternet/Conceptual/NotificationProgrammingGuideForWebsites/LocalNotifications/LocalNotifications.html#//apple_ref/doc/uid/TP40012932-SW1)
Bootstrapとは


# Bootstrapとは

> Twitter社が提供しているHTML5・CSS3・jQueryを使用したWebフロントエンドツール。
オープンソースとして公開されており、エンジニアやマークアップエンジニアでも、デザイナーに頼らずに簡単に見た目を変更できるパッケージである。

##Bootstrapの特徴

+ 簡単かつ綺麗にWebサイトが作れる。
+ レスポンシブデザインに対応。
+ jQueryを使用した「カルーセル」や「モダール」、「タブ」、「ツールチップ」など様々な機能が盛り込まれている。
+ テンプレートやUIパーツも豊富。
+ 12カラムのグリッドシステム

#環境構築
##Bootstrapを使ってみよう
利用方法は2通りある。

+ URLより直接引っ張ってくる。（CDN）
+ ダウンロードしたフォルダからパスで引っ張ってくる。

### CDNとは

> 世界中に張り巡らされたCDN配信プラットフォームを通して、ユーザに最も近いサーバから効率的にコンテンツを配信する仕組みのことである。 一般に、インターネット上にウェブサイトやサービスを公開する場合、その配信元となるウェブサーバ（以下、オリジン）をたて、そこへユーザを誘導する形で配信を行う。 しかし、突発的にアクセスが増えるとオリジンが突然ダウンしてしまうことや、海外からアクセスすると表示に時間がかかってしまうことがある。

Bootstrapのｽﾆﾍﾟｯﾄ

```html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title></title>
<!-- Bootstrap -->
<link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
<link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css">
 
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]>
  <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
  <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
</head>
<body>

 
<!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
</body>
</html>
```
技術英語 > Note to self > 自分へのメモ / speak to oneself / think to oneself

どこだったかのソースコードで
Note to self
という記載があった。

チームへのメモでなく、自分自身へのメモとしての記載だった。

関連して思い出したもの
- speak to oneself : ひとりごとを言う
- think to oneself : ひそかに考える
Node.js png画像をファイルに書き出す

Canvasで作成したpng画像をファイル出力する際のメモ

#Canvasを画像化
toDataURLメソッドで

````js
//canvasのidがmycanvasだとして(jquery)

var imgdata=$("#mycanvas").toDataURL

//ajaxで渡す
$.ajax({
    url:"saveimg",
    data:{img:imgdata,filename,:"hoge.png"}
}).then(function(res){
    console.log(res);
});
````

#ファイルに出力する

````saveimg.js
var express = require('express');
var router = express.Router();
var fs = require("fs");

/* GET users listing. */
router.post('/', function(req, res, next) {
    var base64Data = req.body.img.replace(/^data:image\/png;base64,/, "");
    
  fs.writeFile(req.body.path,base64Data,'base64',function(err){
      console.log(err);
      res.send(req.body.path+"書き込み完了");
  })
});

module.exports = router;

````

#ポイント

###1.受け取った画像データのヘッダから上記文字列を削除する
`var base64 = req.body.img.replace(/^data:image\/png;base64,/, "");`

###2.書き込み時に'base64'オプションを指定する
`fs.writeFile(req.body.filename,base64Data,'base64',function(err){`

これを指定しないと、開けない画像ファイルになってしまいます。

以上。
Crystal + HTTP Server

Crystal で HTTP Server を作ってみるテスト。

# `HTTP::Handler#call`

実にシンプルな解答からしておくと、こうなる。

```rb
require "http/server"

class MyHandler < HTTP::Handler
  def call(request : HTTP::Request) : HTTP::Response
    HTTP::Response.ok("text/plain", "ok")
  end
end

server = HTTP::Server.new(3000, MyHandler.new)
server.listen
```

(Qiita が Crystal のシンタックスハイライトに対応してないから rb 指定したけど綺麗に色付けされるしすげえな)

一個一個みていこう。

## `HTTP::Handler` の継承

実はコレ、なくても構わない。もっと簡単に書ける方法として、以下のようなコードが出てくる。

```rb
require "http/server"

server = HTTP::Server.new(3000) do |request|
  HTTP::Response.ok("text/plain", "ok")
end
server.listen
```

で、コレは内部的になにをやってるかを追っかけて行くと、[この辺](https://github.com/manastech/crystal/blob/bf72b077bc91a9a1d19db56fede684ae8a9347c2/src/http/server/server.cr#L24-L25)のコードが出てくる。

`HTTP::Sever` の `@handler` に格納されるのは `HTTP::Handler` じゃなくちゃいけなさそうなんだけど、 `@handler` の要件を満たすのは `#call(HTTP::Request) : HTTP::Response` を満たす振る舞いを持つ『なんらか』で良い。んで、このブロックは `Proc` オブジェクトになるわけだけど、 `Proc#call` を持つので、それが成立する。実際、 `HTTP::Handler` は abstract class だけど `#call` は実装してなくて、持ってるのは `#call_next` という middleware stack を実現する用の処理だったり。

使っている `HTTP::Response.ok` は 200 レスポンスを返すためのヘルパみたいなメソッド。もうちょい難しくいろいろ書けるのだが、今回は一旦割愛。

## 引数の型指定

```rb
def call(request : HTTP::Request) : HTTP::Response
```

のようにして、型を指定しているものの、活用はされていない。実際消しても動く。その辺は賢くみてくれるらしい。すごいぞ Crystal。

ただし、これだと `nil` などは返せないので nilable なメソッドを作りたければ `HTTP::Response?` と書く必要がある。

## Middleware stack

今の状態だと実際にアクセスが来てるのかわからないので、アクセスログを出すようにする。標準でついてくるちっさな Logging Handler があるので、利用してみよう。

```rb
  require "http/server"

  class MyHandler < HTTP::Handler
    def call(request : HTTP::Request) : HTTP::Response?
      HTTP::Response.ok("text/plain", "ok")
    end
  end

- server = HTTP::Server.new(3000, MyHandler.new)
+ server = HTTP::Server.new(3000, [HTTP::LogHandler.new, MyHandler.new])
  server.listen
```

こう書く。Server は第二引数に `Array(HTTP::Handler)` を[受け付けている](https://github.com/manastech/crystal/blob/bf72b077bc91a9a1d19db56fede684ae8a9347c2/src/http/server/server.cr#L27-L29)ので、こういう書き方ができる。実際には、受け取った HTTP::Handler の配列から、一つの `HTTP::Handler` にして返しているのだが、それを行っている `HTTP::Server.build_middleware` の[行儀が悪い](https://github.com/manastech/crystal/blob/bf72b077bc91a9a1d19db56fede684ae8a9347c2/src/http/server/server.cr#L91-L105)と思うのは、引数に対する破壊的操作を嫌う性分のせいだろうか？あんまりいい実装じゃない感じがするので、できればどうにかなってほしい。

## `HTTP::Server#listen` と `HTTP::Server#listen_fork`

Mac OS X だと現状 `#listen_fork` は動かない。

```
[warn] kevent: Bad file descriptor
[PCL] Stale coroutine called: curr=0x10621b000  exitto=0x7fca1b800000  caller=0x7fca1b800000
```

みたいなログがぶわっと出るので、多分 fork 周りでなんらかのエラーがあるのだが、深追いする気も起きないので一旦放置で。

## WAF とか

特にこれといって探してないけど、まだ Crystal の WAF はなさそうなので、今から参入して作れば有名 WAF 製作者になるチャンスだと思う。

というか、 Crystal の依存管理は go よろしく github から直で持ってくる感じなのが『いいけど悪い』という感覚。 rubygems のイケてるところは、探しやすさだって含まれてると思う。 GitHub が悪いわけじゃないけど、 GitHub の中からよさそうなライブラリを探すのは至難の業なので、 v1.0.0 までにはなんらかのホスティングが始まってるといいなーと思って期待してる……んですけどどうなることやら。Manas という会社が支援してるらしいし金はあるだろうからシュッとやってほしい。

## HTML 周りとか

まだ見てない。 `HTTP::Builder` から jBuilder とかの臭いを感じる。その DSL でなんとかするのやめて素直にパーサ書きましょうよ、絶対間違ってますって。

# まとめ

まだ早い
Photoshop で画像をリサイズするなら補間方法はバイリニアにした方が良い場合もある

　Photoshop でのリサイズで補間アルゴリズムに指定するのは大抵はバイキュービックだと思います。ドット絵などではあえてニアレストネイバーを指定して余計な補間がされないようにするということもあります。こうなるとバイリニアの出番って何？となるかもしれませんが、実はこいつが活躍する場面はあります。

　例えばこのようなカンバスいっぱいに色が塗られているような画像があるとします（画像A）。これをバイキュービックで縮小するとどうなるか。慣れている方ならすぐにピンとくるかもしれません。

![画像A](https://qiita-image-store.s3.amazonaws.com/0/3603/c9574130-f94e-e5aa-4a38-d0a6539295f6.png)
_画像A リサイズ前の画像_

![画像B](https://qiita-image-store.s3.amazonaws.com/0/3603/345ade44-116a-ec89-e7b1-bb6685a9cbd1.png)
_画像B バイキュービックでリサイズ後の画像_

　このようにエッジに透明ピクセルができてしまいます（画像B）。透明ピクセルが残ると、エッジにメリハリがなくなるだけでなく、パターン素材としてタイル状に並べた際に本来は見えてはならない境界線が浮いて見えてしまいます。なのでこれを防ぐために背景色を塗っているシェイプをあらかじめカンバスよりも大きく作っておいたり、カンバス背景色を設定したり、リサイズ後に塗り直したりといった対策をするでしょう。しかしこれは面倒です。

　ここで一旦リサイズ前の状態（画像A）に戻って、こんどは補間をバイリニアにして実行してみます。するとこんどはエッジの透明ピクセルが残らなくなりました（画像C）。
![画像C](https://qiita-image-store.s3.amazonaws.com/0/3603/871c5cb1-9912-0534-4db1-ede2a57f3944.png)
_画像C バイリニアでリサイズ後の画像。透明ピクセルができていない_


　このように、**エッジの透明ピクセルを作りたくない** 場合には **バイリニア** を使うのが良いです。バイリニアでリサイズした場合はバイキュービックよりもほんの僅かに補間の繊細さで負けるかもしれませんが、ほとんど誤差の範囲でしょう。ぜひ UI 部品のリサイズでご活用ください。
ブラウザからスマートフォンのネイティブ地図アプリケーションを開く


さくっと調べた内容。あとでまた更新する、つもり。

# iOS

ブラウザからApple Mapを開くには `http://maps.apple.com` を開けば良い。いくつかのパラメタを渡すことで動作を変更することが出来る。

| param | note |
|:-:|:-:|
| q= | 検索クエリ。 |
| near= | 検索クエリの場所名。 |
| ll= | 緯度経度指定で地図のセンタリング。経度、緯度をカンマ区切りで（`ll=35,138`）。|
| sll= | ? |
| spn= | 表示したい部分の矩形 | 
| sppn= | ? |
| t= | マップタイプ。 |
| z= | ズームレベル。 |
| saddr= | ナビゲーション時の出発地。 |
| daddr= | ナビゲーション時の到着地。 |


# Android

data URI schemeを使う。

| Schemeとパラメタ | Notes | 
|:-:|:-:|
| geo:Latitude,Longitude | 緯度経度の指定。 |
| geo:latitude,longitude?z=zoom | 緯度経度とズームレベルの指定。 |
| geo:0,0?q=lat,lng(label) | 緯度経度の指定とラベルのオーバーレイ。 |
| geo:0,0?q=my+street+address | 検索クエリ。 |

----

# 参考

* [Map Links](https://developer.apple.com/library/ios/featuredarticles/iPhoneURLScheme_Reference/MapLinks/MapLinks.html)
* [Android Common Intents - Map](http://developer.android.com/guide/components/intents-common.html#Maps)
Nodeプロジェクトで設定を動的に保存するnpm-storeを作った

Nodeプロジェクトで設定を動的に保存するnpm-storeを作りました。

* [@k-kinzal/store](https://www.npmjs.com/package/@k-kinzal/store)

## モチベーション

そもそも、単純に値を保存するだけなら[npm config](https://docs.npmjs.com/misc/config)があります。静的な設定なら`package.json`に書けばそれで済みます。しかし、`package.json`に書く場合はリポジトリに保管する必要があるため、開発者全員が同じ設定値を参照してしまうという問題があります。
それなら、`npm config set`を使って動的に設定値を保存できればすべては解決・・・といきたかったのですが、この場合は設定値がプロジェクトを飛び越えて全プロジェクト共通の値として保存されてしまいます。

```
$ npm config set foo 1
```

```
$ cat ~/.npmrc 
foo=1
```

これではプロジェクト間で同じ名前の設定を作ると混線してしまうので、プロジェクト単位に設定値を保存できる何かが欲しい！という訳で作成することにしました。

# 使い方

## 保存

```
$ node_modules/.bin/store set foo 1
```

## 取得

```
$ node_modules/.bin/store get foo
1
```

## 削除

```
$ node_modules/.bin/store delete foo
```

## npmからの呼び出し

```json:package.json
"scripts": {
  "store": "store set foo 1"
}
```

一応、コマンドラインからの呼び出し方も書きましたが、基本的にはnpmで実行する想定です。

```json:package.json
"scripts": {
  "store": "echo 1 | store set foo"
}
```

上記のような形でコマンドの実行結果を特定のキーで保存します。

# 使い道

とはいえ、動的に設定を保存したいみたいなことは、そうそうないです。（むしろそんな要望が出たら設計を疑った方が良いレベル）
それじゃあ自分は何でそんなものを作ったの？という所でいうと

* [k-kinzal/lambda-template](https://github.com/k-kinzal/lambda-template)

AWS Lambdaで開発するさいにCfnを実行して、その結果を保持したいからです。
例えばCfnで作成したリソースを設定ファイルに保存したり、開発者一人につきCfnで作成する環境を一つに制限したり、作成した環境を削除するためにStackIdを保存しておきたいみたいな用途ですね。

たぶん、こういった開発用のインフラ構築関連だと需要はありそうだなと思います。単純なビルドベースでは絶対に使わないというか使っていたら怒るレベルだと思いますが。

# おわりに

取り敢えず作って、モチベーションを晒してみましたが実際はどうなんでしょうね？
インフラ構築関連で使うにしても、もっと他にやり方がありそうな気もします。

何か良いやりかたご存知の方がいらしたら、ぜひ教えてください。
バックグラウンドでMilkodeのインデックスを更新してくれるRubyスクリプト


起動しておくと手動の`milk update`が不要になり便利です。Windows, OSXで動作確認済みです。([Milkodeとは？](http://milkode.ongaeshi.me/))

## 使い方

```
$ milkode_auto_update milkode ofruby-ios honyomi
```

実行しておくと、30分に1回`milk update`をかけてくれます。時間は`30 * 60`の部分を自由に調整してください。


## ソースコード

```ruby
#!/usr/bin/env ruby

if ARGV.size == 0
  puts "milkode_auto_update.rb PACKAGE1 [PACKAGE2..]"
  exit -1
end

prev = Time.new(0)
 
loop do
  t = Time.now
   
  if t - prev > 30 * 60
    prev = t
    p prev
    system "milk update #{ARGV.join(" ")}"
  end

  sleep 2
end
```
openFrameworks 0.9 のナイトリービルドを使って64bit対応済みのiOSアプリを作る(途中経過)


[ofruby - 自作アプリが64bitバイナリ問題で新バージョンを申請出来なくなった - Qiita](http://qiita.com/ongaeshi/items/a3ac45baa259af5740c3)からの続きです。

## 概要

- ひとまずエミュレータでのビルドには成功
- textコマンド(ofDrawBitmapString)が2回目実行時に黒塗りになってしまう
- 実機で実行しようとすると失敗
  - projectGeneratorで空のプロジェクトを作った場合は実機実行可能なので、ofruby固有の問題だと思われ。

```
ld: 128-bit LDR/STR not 16-byte aligned: from _pcre_study (0x1000D5AEC) to l013@0x00004334 (0x10056580C) in '_pcre_study' from ../../../libs/poco/lib/ios/PocoFoundation.a(pcre_study.o) for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

```

## 作業ログ
[Commits · ongaeshi/ofruby-ios](https://github.com/ongaeshi/ofruby-ios/commits/feature/of-0.9)

- openFrameフレームワークの中身を丸ごと入れ替え
- projectGeneratorで空のプロジェクト`ofruby`を作ってコピー
- 古いofrubyからソースコードやリソースをコピーしてプロジェクトに登録
- C++11やiOS SDKのバージョンに伴う細かい問題を修正
  - [Add declaration for C99 · ongaeshi/ofruby-ios@c2797eb](https://github.com/ongaeshi/ofruby-ios/commit/c2797ebf24390533c2b528eb7ed2d33f106dd556)
  - [patch (Later re-investigation) · ongaeshi/ofruby-ios@2387821](https://github.com/ongaeshi/ofruby-ios/commit/238782127def9ab6fd9fa1cdf3574cb4009aae64)
- openFrameworksのデフォルトプロジェクトはARC(Automatic Reference Counting)がOFFなのでONに([70be76f](https://github.com/ongaeshi/ofruby-ios/commit/70be76f3b9c156eb47547fe0c98738d9ca284ebc))
  - ofrubyはARC必須のライブラリを使っているためONにする必要がある

## まとめ
- サンプルコードは実機ビルド出来た
- 次はofrubyで実機ビルド出来るようにする
  - サンプルコードとの違いはどこだろう・・？
- ofDrawBitmapStringがちゃんと動かないのが困る
  - もう少し調べて分からなければIssueに登録する
AWSのセキュリティ方針について

AWSが公開している資料のまとめ。SlideShareのドキュメントは[こちら](http://www.slideshare.net/c95029/awsshared-responsibility-model-16612378)。

まとめの視点としては、AWSを利用する上で何を知るべきか？という点にフォーカスします。IAMなどのセキュリティを担保するサービスの役割とか、そういうところ。

# Agenda
3本立て。

1. AWSのセキュリティ方針
2. AWS側のセキュリティ
3. AWS利用者側のセキュリティ

# 責任共有モデル
AWSと利用者、お互いでセキュリティを担保しましょうよ、という話。
インフラの部分はAWSが担保するので、その上で動くものについては利用者でちゃんとやりましょうねということ。利用者の方で担保する「責任」は、具体的には以下。

- OS
- F/W
- N/W設定
- アカウント管理
- セキュリティグループ
- アプリケーション

# AWS側で提供するセキュリティ
項目としては以下の5項目。

- 物理セキュリティ
- N/Wセキュリティ
- VMセキュリティ
- 管理者層による管理者権限アクセス
- 認定＆認証評価

抜粋します。
詳しくは[AWS Security Center](http://aws.amazon.com/jp/security/)参照。ホワイトペーパーも公開されてます。

## N/Wセキュリティ
対策してる攻撃として以下の5点を挙げています。

- DDoS
- Man in the Middle
- IPスプーフィング
- 許可されていないポートスキャン
- パケット・スニッフィング

DDoSとIPスプーフィングは1セットっぽい。DDoSは特定のサービスへの集中砲火、IPスプーフィングは攻撃者の身元詐称、こう理解しています。

### N/Wトラフィックフローセキュリティ
トラフィックを制御する手段は3つ。

1. セキュリティグループ
2. N/W ACL
3. Subnet, Routing Table, Gateway (VPC)

1台のホストを見るのであればOS F/W、複数台のホストを対象に適用するのがセキュリティグループ、ネットワーク全体に適用するのがACL。
要件によってサブネットを切ったりするけど、ACLはそういう1つの「要件」を満たす部分かなーと思っています。で、その中の(論理的な)構成要素に対してセキュリティグループを適用し、個別の面倒をOSのF/Wで見る。こんなところでしょうか。

## VMセキュリティ
仮想化はまだよくわからんので飛ばします。でも理解しておきたいトピックなので項目だけ作っておく。

# 利用者側のセキュリティ
[SlideShare](http://www.slideshare.net/c95029/awsshared-responsibility-model-16612378)より画像を引用します。
![利用者側のセキュリティ](http://image.slidesharecdn.com/awssharedresponsibilitymodel-130218191517-phpapp02/95/awsshared-responsibility-model-39-638.jpg?cb=1361214956)
AWS独自のセキュリティ対策が以下。

- Amazon VPCの利用
	* セキュリティグループ
	* N/W ACL
	* ENI
	* VPN/専用線接続
- MFAデバイスの利用
- IAMの利用

注意すべきは"VPC!=VPN"であること。VPNとか使わなくても、VPCを使っておいた方が利点が多いらしい。
## IAM (Identity and Access Management)
多分この記事の最重要事項。チュートリアルの段階でも出てくるし。

IAMは **AWSの操作** に対する権限を設定できる。ユーザ個別でも、グループ(複数ユーザ)に対してもOK。例えば「EC2の停止ができないユーザ」を作ることができる。結構きめ細かいなーという印象。

IAM Roleなるモノもあるらしいけど、ここでは触れません。

# まとめ

- 共有責任モデルを理解し、必要なところだけに注力する
- 既存のセキュリティポリシーを適用
- AWS独自の部分は、提供機能をしっかり利用

ACLもIAMも既存の機構に近いものなので、学習コストもそんなに敷居が高くなさそうですね。それぞれの適用シーンをもうちょっと押さえていきたいです。
俺が「意識低い系」になれない5つの理由。

最近の目標だった「俺は意識低い系王になる！　無理そうなことに挑戦するよ！」が本当に無理だとわかった。どうでもいいことなので基本スルーで。


##1 SNS free!

菓子パンが好き。でも、体に悪そうであまり食べない。ジュースも自然系のもの以外はあまり飲まない。エネジードリンクは仕事的に必要だと思ったら飲む。酒、タバコはやめた。そんな俺が、ガブ飲みメロンソーダをぐびぐびやってマクドナルドに十数年ぶりに入れるようになるのはどうしたらいいのか。もう年齢的にも、タイムリミットは近い。
意識低い系を、俺は見くびっているわけではなくて、実は憧れに似た感情を抱いている。無理そうだけど近づきたい、クラスの不良に一目置かれたい。でも、どうしてもできなかった。菓子パンと菓子類の消費は増やせたがマクドナルドはちょっと遠くから覗いて断念した。同じ人間なのに、どうして彼らには出来て俺にはできないのか考えた。そして、同じようにいつも接点がないと感じているSNS的な何か（友達はいないのでLINEもmixiもやってない。FBは試してみたいけど怖い）と、意識低い系をリンクして考えてみて、社会（集団従属）性の度合いが意識（高い|低い）系の正体なのですよと気づいた。Webサービスについて考えることの延長線上に答えがあったので、ここにメモしておくことにした。

##2 Hometown free!

タバコなどをポイ捨てする（できる）人間と、しない（できない）人間についてずっと昔に考えたことがある。今の言葉でいうとDQNについて。マイルドヤンキーとDQN、そして意識低い系は社会従属性で測れる。たぶんそういう係数みたいなのがあるはず。DQNは社会から逸脱しているように見える（行動として反社会的）けど、集団と自己の壁がないほど、同一化しているのだ。「他人（ヒトサマ）」の概念がない。マイルドヤンキーと意識低い系は、他者を認識する程度には壁があるが、集団への従属性が高い。高いほど低い。意識が。

##3 Safety free!
じゃあ、意識って何？　というと、孤高性なのだ。
俺は孤立している、土地も人間関係もない（家族はいるけど）。という状態で、例えばガブ飲みメロンソーダを飲んだらどうなるだろうか？　マクドナルドで食事したらどうなるだろうか？　孤高の人間は、それを心配する。自分以外は、みんな「ヒトサマ」なのだ。迷惑をかけるわけにはいかない。その思考が、俺を意識低い系にさせない要因であり、俺の本質でもある。
友達や仲間！がいれば、体調を崩しても何とかなる。土地がある、親類に囲まれている、そういう社会的なマイセイフティが存在する人間との差が、経済的には現れなくても、意識として差別化しているのが昨今言うところの（高い|低い）系だと思う（高い系に関しては、ネタ的側面も大きいかもしれないし、リア充との混同がある気がするので、実際には（低い）(!低い)かもしれない）。
例えば、新しいことがあるとする。新しいことをするための考えかたがあるとする。俺は、それを知りたい。WiredやLifehacker、Inc.、いろんなサイトを見たりする、時間というコストをかけて。変化が必要でなければ、それは滑稽な行為だ。現状が安定していれば、変化はいらない。某政党のポスターで、「安定は希望です」というコピーがあって、とても秀逸だと思った。


##4 GREE free!
マイルドヤンキーでググったら都市と地方みたいな対立構造で書かれてたりしたので、思い出して徂徠の「旅宿ノ境界」でググってみたら思ったような感じではなかった。でも、たぶん徂徠ならこのモヤモヤを書いてると期待する。
実際に今は二極対立というほどの単純化はありえないので、うまく言えないモヤモヤを、（高い系的にいうとコンセンサスを得ていない）言葉にするもどかしさを、系付き語でごまかしているのだ。俺は数値化したい。孤立性を。六次の隔たりの最初の一歩がない場合を。で、GREE。

#5 Answer free!
いろんなWebサービス（とIT企業）を眺めていて思うことがある。エンジニアはエンジニアのサービスが好きすぎる。でも、売れるのはエンジニアっぽくないサービス。俺は距離感を感じる。使ってみるのは、少しだけ自分（デザイナ）よりのサービス。友達に紹介！とかいってくるモーダルにムカッとしながらも、必須じゃないので使うことはできる。二百人で同時通話とかは、ありえない。でもたぶん、大勢のダチ、仲間！がいる場合の意識は、少し違うのだろう。SNSが滑稽に見えたり、セキュリティ云々を考えてしまう人間を、彼らは幸福とは思わない。


以上に対して、Githubとかエンジニア系のサービスのもつ可能性、旅宿ノ境界の住人としての役割について考え始めたら遅くなったのでここまで。
dockerにPostgresqlをインストールして初期化した場合のエラーメッセージ対策

CentOS7でのdockerの勉強の覚書です。

## dockerコンテナにPostgresqlをインストールした際のエラーメッセージ
以下のメッセージが出力されました。
```「Failed to get D-Bus connection: No connection to service manager」```
色々と調査した結果、CentOS 7ではinitデーモンがsystemdに変わったため、
centos:centos7のDockerイメージを使用した場合に出力されるエラーメッセージのようです。

## エラーメッセージの回避策
回避策として、dockerコンテナを作成する際に以下の点に留意する必要があるようです。
・ 特権モードにする(--privileged)
・ コンテナで起動されるコマンドは/sbin/initにする

まず、上記の点を考慮してdockerコンテナを作成する為に、nsenterをインストールする必要が
あるとのことなので、以下のコマンドにてインストールを実行します。
> docker run --privileged --rm -v /usr/local/bin:/target jpetazzo/nsenter

インストール後に以下のコマンドにてdockerコンテナを作成、実行します。
> docker run --privileged -d -p 80:80 --name {コンテナ名} centos:centos7 /sbin/init

上記方法で作成したコンテナへの接続は通常の方法ではダメとのことなので、以下の方法で接続します。
> docker exec -it {コンテナ名} /bin/bash

コンテナ実行後に、以下のコマンドを実行します。
>
yum install httpd -y 
systemctl enable httpd.service 
systemctl start httpd.service


## Postgresqlのインストール手順
■ wgetコマンドのインストール
> yum -y install wget

■ 最新版のPostgresqlのダウンロード
> wget http://yum.postgresql.org/9.4/redhat/rhel-7-x86_64/pgdg-centos94-9.4-1.noarch.rpm

■ Postgresqlのインストール
>
rpm -ivh pgdg-centos94-9.4-1.noarch.rpm
yum -y install postgresql94-server postgresql94-devel postgresql94-contrib

■ データベースクラスタ初期化 ← ここでエラーメッセージが出力されてた・・・。
> /usr/pgsql-9.4/bin/postgresql94-setup initdb

■ postgresサービス化 / 開始
> 
systemctl enable postgresql-9.4
systemctl start postgresql-9.4

## 余談
今回のエラーメッセージを解決させるための調査もろもろに1週間以上かけてしまいました。
(実作業時間でいうと1日程度かもしれませんが・・・。)
今後はこの程度のエラーの調査はさくっと終わらせたいものです。

## 参考資料
http://qiita.com/yunano/items/9637ee21a71eba197345
http://www.hack-log.net/entry/2015/04/26/100000
Dockerの簡易スタートアップ

#Dcokerを簡単にやってみよう
dockerを始めたいが、いきなりHostOSに入れるのはいろいろややこしいので、vitrualbox上の仮想OSで実行する想定。

##事前作業
virtual boxをインストール
http://www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html?ssSourceSiteId=otnjp

##boo2dockerを取得
 https://github.com/boot2docker/boot2docker-cli/releases
 各OS毎に実行ファイルをダウンロード

boot2docker-v1.6.2-darwin-amd64
→mac用
boot2docker-v1.6.2-linux-amd64
→linux用
boot2docker-v1.6.2-windows-amd64.exe
→Windos用

##起動例（linuxの場合）
```
chmod +x boot2docker-v1.6.2-linux-amd64 
./boot2docker-v1.6.2-linux-amd64 init
./boot2docker-v1.6.2-linux-amd64 up
./boot2docker-v1.6.2-linux-amd64 ssh
```
##動かない場合
 →BIOSの仮想化機能onにする。
　http://qiita.com/kmats@github/items/a2396aa5b6f397d447b8
　→virtualboxの設定をいじる(32bitの場合)
　 http://qiita.com/hidekuro/items/fc12344d36d996198e96#4-4
   →あきらめろん
　　[⇒あきらめなかった！2017年11月28日更新](https://qiita.com/ranran/items/b211129058a0ab6d409f)
場合の数（nPr,nCrの意味について）

##nPrの意味
n枚の相違なるカードからr枚を取り出して並べる並べ方が何通りになるかは、もちろん nPr = n! / (n-r)! 通りである。ここで、なぜ分母に (n - r)! を置くのか、その意味について考えてみる。

5枚のカードから3枚を取り出して並べる並べ方は　5 x 4 x 3 = 60 通りとなるが、これをnPrの定義に当てはめると、5! / (5 - 3)!となる。なぜ分母に (5 - 3)! を置くのかというと、5! = 5 x 4 x 3 x 2 x 1 から 2 x 1 をキャンセルしたいためである。

nPrは、n x (n-1)x(n-2)x…と-1ずつかけていき、r回目でストップする、と覚える。

##nCrの意味
では、n個の相違なるボールが入った袋からr個のボールを取り出す取り出し方は何通りになるか。

5枚のカードから3枚を取り出して並べる並べ方が何通りになるかは、5x4x3と単純な計算で求められたが、順序を考慮しない場合の組み合わせの数は、こんな風に単純に求めることはできない。

n枚からr枚のカードを取り出して並べる操作においては、カードを取り出す【操作A】と、取り出したr枚のカードを並べる【操作B】を一気に行っている。n個からr個のボールを取り出す取り出し方のパターン数を求める場合においては、【操作A】で「止める」必要がある。

【操作A】をa通り、【操作B】をb通りとすると、nPrのカードの並べ方は、a x b通りである（n枚からr枚の取り出し方がa通りで、a通りのうち任意の1パターンのもとでのr枚の並べ方がb通り）。そのため、【操作A】で止める必要があるわけだが、そのためには nPr に含まれる b をキャンセルする、つまりnPrに1/bをかける必要がある。

あとはbの値を求めるだけだが、n枚からr枚のカードを取り出した時点を出発点として考える。つまり、取り出した任意の1パターンのもとでr枚のカードを並べる並べ方は何通りかを考える。これはもちろん、r!通りである。

すると、【操作A】で止めた時点での組み合わせの数nCrは、nPr/r!と表すことができる。
nPr = n!/(n-r)!　という定義より、
nCr = nPr x 1/r! = (n! / (n-r)!) x 1/r! = n! / (n-r)! r!
となる。

```math
nPr = n!/(n-r)!
```
```math
nCr = nPr/r! = n!/(n-r)!r!
```
Phoenix Framework Guide をなんとなく訳してみた② Up And Running


全体へのリンクは以下
[Phoenix Framework Guide をなんとなく訳してみた① Overview](http://qiita.com/rtbt525/items/afbf666e0c026c5658f4)

--

# 起動と実行
この最初のガイドの目的はPhoenixのアプリケーションを可能な限り手早く起動し実行することです。

まず始める前に、[全体の概要](http://www.phoenixframework.org/v0.13.1/docs/overview)の”依存性について”のセクションを少し復習してみましょう。システムの依存関係に必須な幾つかを予めインストールしておけば、スムーズにアプリケーションのインストールと実行ができます。

まずはElixirとElangをインストールしましょう。Elixirのサイトには最新の最も完璧な[インストールの情報](http://elixir-lang.org/install.html)があります。現在、PhoenixはElixirは1.0.4以降、Erlangは17.5以降のバージョンが必要です。

それでは始めてみましょう。

最初にもしもElixirをインストールしたばかりであれば、Hexのパッケージマネジャーをインストールしましょう。

```
$ mix local.hex
```

これでPhoenixのインストーラを取ってくる準備が整いました。

```
$ mix archive.install https://github.com/phoenixframework/phoenix/releases/download/v0.13.1/phoenix_new-0.13.1.ez
```

> Note:もしもこのコマンドを実行してもPhoenix archiveが正しくインストールされなかった場合、直接ファイルをダウンロードして保存したあと次を実行してください。
>
> ```
> $ mix archive.install /path/to/local/phoenix_new.ez
> ```
> 

これでどこのディレクトリでも ```mix phoenix.new``` を実行して自動でPhoenixのアプリケーションを作ることができます。

Phoenixはプロジェクトのディレクトリ指定を絶対パスと相対パスの両方で許容します。我々のアプリケーションの名前を```hello_phoenix```とした場合、以下のどちらでも同じです。

```
$ mix phoenix.new /Users/me/work/elixir-stuff/hello_phoenix
```

```
$ mix phoenix.new hello_phoenix
```

> これから始める前にBrunch.ioについての一言：Phoenixはデフォルトの資源管理ツールとしてBrunch.ioを使います。Brunch.ioの依存関係はnpm(Node Package Manager)を通してインストールされたものに対してであり、mixではありません。Phoenixは ```mix phoenix.new``` のタスクが終了する際にそれらをインストールすることを促します。もしもその際に"no"と答え、後で```npm install```した時もそれらの依存関係をインストールしていなかった場合、アプリケーションを起動した時にエラーが投げられ、資源が正しく読み込まれないでしょう。もしもBrunch.ioを全く使わないのであれば、```mix phoenix.new```に```--no-brunch```オプションを渡してください。


ここまで準備ができたら、```phoenix.new```を相対パスで呼び出してみましょう。

```
$ mix phoenix.new hello_phoenix
* createing hello_phoenix/README.md
・・・
```

Phoenixはアプリケーションに必要なディレクトリ構成とファイルをすべて生成します。それが終わったとき、依存関係のある資源をインストールする必要があるか尋ねられます。ここでは"yes"と答えてみましょう。

```
Fetch and install dependencies? [Yn] y
* running npm install
* running mix deps.get
```


ひとまず依存関係が解消されると、プロジェクトディレクトリを変更してアプリケーションを起動するように促されます。

```
We are all set! Run your Phoenix application:

$ cd hello_phoenix
$ mix phoenix.server

You can also run it inside IEx (Interactive Elixir) as:

$ iex -S mix phoenix.server
```

それではやってみましょう。

```
$ cd hello_phoenix
$ mix phoenix.server
```

> Note:もしもこのコマンドを実行するのが初回であればPhoenixはRebarをインストールするか訪ねてくるでしょう。RebarはErlangパッケージのビルドツールとして使用されるのでインストールを進めましょう。


デフォルトではPhoenixは4000番ポートでリクエストを受け付けます。お気に入りのWebブラウザで[http://localhost:4000](http://localhost:4000)にアクセスすれば、Phoenix FrameworkのWelcom  pageを見ることができます。

![Phoenix Framework Welcom page](https://www.filepicker.io/api/file/0t1GuSinQ1yeRhw3ZgLK "Phoenix Framework Welcom page")


もしもあなたの画面が上のイメージのようになったのであればおめでとう！これでPhoenixアプリケーションが動きました。

局所的にですが、我々のアプリケーションはiexのセッション上で動いています。これを止めるにはCtrl+cを２回押してください。通常どおりiexは停止します。

次のステップではPhoenixアプリを構成する考え方について理解してもらうために少しだけカスタマイズしてみます。

[< 前](http://qiita.com/rtbt525/items/afbf666e0c026c5658f4) [次 >](http://qiita.com/rtbt525/items/240b30b690bbd27ca374)
全角アルファベットやひらがな・カタカナを入力しても（ちょっと）いい感じに解釈してくれるvimrc

追記: @ssh0 さんがもっと掘り下げたバージョンを書くださいました。すばらしい！
[Vimでの日本語編集がはかどるキーマッピング - Qiita](http://qiita.com/ssh0/items/9e7f0d8b8f033183dd0b)

そもそも日本語をvimで書くな、という声もありますが、ひらがな・カタカナや漢字との境を「単語の境（wとかを押した時に止まる箇所）」として解釈してくれたりする（設定によるのかも）ので、個人的には十分アリだと思ってます。

ただ、日本語入力をONにしたままコマンドモードのコマンドを実行しようとして ありゃりゃ :sweat: ってなることがしばしばあるので、簡単な改善策としてこんなキーバインドを設定してみました。
まだ試してませんのでホントに心地いいかはわかりません。あしからず。

```vim
"ひらがな・カタカナ・全角アルファベットによるコマンド入力を有効にする
noremap あ a
noremap い i
noremap う u
noremap え e
noremap お o
noremap ア a
noremap イ i
noremap ウ u
noremap エ e
noremap オ o
"" こういうRubyで出した: ('a'..'z').each {|c| puts "noremap #{(c.ord + 65248).chr(Encoding::UTF_8)} #{c}" }
noremap ａ a
noremap ｂ b
noremap ｃ c
noremap ｄ d
noremap ｅ e
noremap ｆ f
noremap ｇ g
noremap ｈ h
noremap ｉ i
noremap ｊ j
noremap ｋ k
noremap ｌ l
noremap ｍ m
noremap ｎ n
noremap ｏ o
noremap ｐ p
noremap ｑ q
noremap ｒ r
noremap ｓ s
noremap ｔ t
noremap ｕ u
noremap ｖ v
noremap ｗ w
noremap ｘ x
noremap ｙ y
noremap ｚ z
```

やっぱり、連打しちゃった時のために「っっっｈ」を「hを4回押した」って解釈してくれたりするようなプラグインを作らないとあんまり役に立たなそう。
~~気が向いたら作ろう。~~
追記: [勢い余って作ってみた](https://github.com/igrep/sokuon.vim)けど何故かうまく動かないorz
Crystal 入門

[Crystal](http://crystal-lang.org/) というのが Ruby 似の言語らしいので試してみる。

# vim

https://github.com/rhysd/vim-crystal を入れる。

# 仕様その他

http://crystal-lang.org/docs/ に公式のドキュメントがあるので読んでいく。

大体 Ruby と同じ文法だと思って差し支えないようだけれど、いくつか差異があるので気をつけながら読む。

ぐっと来たとこ書いていく

## 型

```crystal
a = 1
a = "string"
```

これは通る。

## オーバーロード

http://crystal-lang.org/docs/syntax_and_semantics/overloading.html

```crystal
class Pigeon
  getter name

  def initialize(@name)
  end

  def appeal
    puts("My name is #{@name}.")
  end

  def appeal(n : Int)
    n.times do
      appeal
    end
  end
end

hato = Pigeon.new("rosylilly")

hato.appeal
hato.appeal(5)
hato.appeal(5.5) # => no overload matches
```

Ruby にも欲しい……

## 名前付き引数

http://crystal-lang.org/docs/syntax_and_semantics/default_and_named_arguments.html

そう、こう、こういうのでいいんだよ。

## Abstract types

http://crystal-lang.org/docs/syntax_and_semantics/virtual_and_abstract_types.html

さっきから欲しいものバンバンでてきてすごい

## Macro

http://crystal-lang.org/docs/syntax_and_semantics/macros.html

マクロあるの……

# 触ってみた

- [HTTP Server](http://qiita.com/rosylilly/items/49f4cb72c98a5b92b7f0)
Ruby on Rails + Nginx + AWS + Unicorn + Rbenv 環境へCapistranoでデプロイ

## はじめに

* ソースコードはGithubで公開
https://github.com/kawasakiatsushi/capistrano

2015-08-16
大分、雑だったため追記/修正

Capistranoのデプロイ先の環境
- AWS
- Nginx
- Ruby on Rails
- Unicorn
- Rbenv

## 今回行うこと
AWS上のサーバーへデプロイ (Ruby環境へのデプロイをします。)


##  Capistanoのインストール
通常どおり、ディレクトリの作成

```
$ mkdir capistrano
$ cd capistrano
$ bundle init
```

Gemファイルの中身（Capistranoは3.x系を使用）

```Gemfile.
# A sample Gemfile
source "https://rubygems.org"
gem "capistrano", "3.1.0"

# rails用gem
gem 'capistrano-rails'
gem 'capistrano-bundler'
gem 'capistrano3-unicorn'
```

Gemのインストール

```
$ bundle install --path vendor/bundle
```

Capistranoのインストール

```
bundle exec cap install
```

これで必要ディレクトリが生成されている

## デプロイ用ファイル作成

デプロイのフローに関しては下記を参照
http://capistranorb.com/documentation/getting-started/flow/

```config/deploy.rb
# config valid only for Capistrano 3.1
lock '3.1.0'

set :application, 'APPNAME'
set :repo_url, 'リポジトリPATH'

set :deploy_to, '/var/www/'
set :scm, :git
set :keep_releases, 5

# rbenvの設定 (環境によってrbenvの場所が違うと思います。)
set :default_env, {
  rbenv_root: "/usr/local/rbenv/",
  path: "/usr/local/rbenv/shims:/usr/local/rbenv/bin:$PATH"
}

# Unicorn周りの設定
set :unicorn_rack_env, "production"
set :unicorn_config_path, "config/unicorn.rb"
set :unicorn_pid, "/tmp/unicorn_APPNAME.pid"

# currentからsharedへsymlinkを貼るものを指定
set :linked_dirs, %w{bin bundle log tmp/pids tmp/cache tmp/sockets public/system}

# logを詳細表示
set :format, :pretty
set :log_level, :debug

namespace :deploy do
  desc 'Restart application'
  task :restart do
    invoke 'unicorn:restart'
  end

  after :finished, :restart
end

desc 'execute before deploy'
task :db_create do
  on roles(:db) do |host|
    execute "mysql -uroot -e 'CREATE DATABASE IF NOT EXISTS APPNAME_production;'"
  end
end
```

接続用の環境設定

```config/deploy/production.rb
set :rails_env, :production
server 'ServerNmae',
  user: 'UserName',
  roles: %w{web app db}
```

## 4 デプロイ

初回デプロイの場合はまず、DB作成用のタスクを走らせる

```
$ bundle exec cap production db_create
```

次にデプロイをさせればOK

```
$ bundle exec cap production deploy
```


## 参考

`bundle install`中にエラーが出た場合の対処法

Amazon Linuxでbundle installのエラーに対処する
http://dev.classmethod.jp/cloud/aws/amazon-linux-bundler-error/

サーバー上で鍵交換をさせるのがイヤな人はssh-addで対応できるかと思います。

ssh-agentの使い方
http://qiita.com/isaoshimizu/items/84ac5a0b1d42b9d355cf
ElixirからErlangの関数を呼び出すだけの簡単なお仕事！！

#タイトル： ElixirからErlangの関数を呼び出すだけの簡単なお仕事！！

#目的： Elixirのiexから自作したErlangのモジュールで定義している関数を呼び出す。

#実施環境：
OS： Windows8.1
Elixir： v1.0.4
Erlang： Eshell v6.4

#目次：
1. 概要
2. Erlangのソースコード
3. iexで関数を呼び出すだけの簡単なお仕事
4. おまけ

##1. 概要
ふと思いました。
ElixirからErlangモジュールで定義した関数を呼び出せないか・・・っと。

同じErlangVMで動いているのですから動かないということはないでしょう。
なので試してみました。

実際、記事にするほどのことではないのかもしれませんが・・・

##2. Erlangのソースコード
Erlangのソースコードは以下の通り作成しました。
"test"と言うモジュールにaddと言う関数があるだけです。

```erl:test.erl
-module(test).
-export([add/2]).

add(X,Y) -> X + Y.
```

##3. iexで関数を呼び出すだけの簡単なお仕事
コマンドプロンプトからiexを立ち上げ、以下の通り実施しました。

```iex
>iex
Interactive Elixir (1.0.4) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> c("test.erl")
[:test]
iex(2)> :test.add(1, 2)
3
iex(3)>
```

cのヘルパーメソッドを利用してコンパイルしています。
Erlangのファイルが置いてある場所を見れば、"test.beam"ができています。

##4. おまけ
逆に、Erlangから自作したElixirモジュールの関数を呼んでみます。

Elixirのソースコードは以下の通り作成しました。
先ほどのErlangのソースコードと内容は同じです。

```ex:test.ex
defmodule Test do
  def add(x, y) do
    x + y
  end
end
```

これをerlから呼んでみます。
まずは、iexからコンパイルします。

```iex
>iex
Interactive Elixir (1.0.4) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> c("Test.ex")
[Test]
iex(2)> Test.add(1, 2)
3
iex(3)>
```

cヘルパーメソッドがまた出てきました。
実行すると"Elixir.Test.beam"ができています。

```erl
>erl
Eshell V6.4  (abort with ^G)
1> l('Elixir.Test').
{module,'Elixir.Test'}
2> 'Elixir.Test':add(1, 2).
3
3>
```

本文これで終わり・・・以上！！

##まとめ
今回のおかげでヘルパーメソッドの存在を認識しました。
(ヘルパーメソッドを見たければ、iexでhと入力しEnterすれば出てきます)

それにしても・・・こんな簡単にできるんですね！

次は、ソースコード上から呼び出してみたいですね。
Elixir+Cowboyあたりで検証してみましょうか。
(需要あるのでしょうか・・・)

##追記(2015/06/07-23:48)
Elixirソースコードからの呼び出しが存外に簡単だったので書いておきます。
Erlangのソースコードに変更はありません。

以下のようにElixir側のソースコードを変更しました。
add関数の中で、Erlangで定義されているadd関数を呼んでいます。
str_size関数の中では、Erlangのsize関数を呼んでいます。

```ex:test.ex
defmodule Test do
  def add(x, y) do
    :test.add(x, y)
  end

  def str_size(str) do
    :erlang.size(str)
  end
end
```

実行結果：

```iex
iex(1)> Test.size("aaa")
3
iex(2)> Test.size("test")
4
iex(3)> Test.add(1, 1)
2
```

**修正！！(2015/06/07-16:52)**
＠behaviourですが、私が間違って理解している可能性があります。
記事に掲載しているソースコードですが、＠behaviourがなくても動作します。(確認済み)

なので、ソースコードに関してはなしの状態で修正しました。

公式ドキュメントを確認してきました。
＠behaviourは、公式ドキュメントでは以下の通り書いてあります。

引用
>＠behaviour - (notice the British spelling) used for specifying an OTP or user-defined behaviour.

簡単に翻訳すると、
"(括弧内は省略)ユーザー定義の振舞いか，OTPが定義した振舞いか区別する"
っといったことが書かれています。

以下のような時に利用されると思われます。

```ex
@behaviour Test.Hoge
@behaviour Test.Hoge.Huge
@behaviour Test.Hoge.Foo
```

##参考文献
http://blakewilliams.me/blog/playing-with-elixir-and-erlang
[Elixir - Module attributes](http://elixir-lang.org/getting-started/module-attributes.html)
Custom Post Type UIでタクソノミーを削除してもDBからは消えない

Custom Post Type UIという、投稿タイプとタクソノミーを登録・管理できるプラグインがあります。

「Edit Taxonomy」や「Delete Taxonomy」という機能もありますが、「Delete」すると、画面からは消えますが、DBからは消えません。

![edittax.png](https://qiita-image-store.s3.amazonaws.com/0/28556/30f9ffb7-b077-9924-23b4-9dbe5b93ba44.png)


DBから直接取得してるときは、Deleteしたやつも取れてしまいます。
消してくれればいいのに。。
どこに削除情報を保存してるんでしょうね。
parse-ruby-clientでGeoQueriesを扱う

#はじめに
ParseのサードパーティSDKに、parse-ruby-clientがあります。
ParseからRuby用として紹介されています。
https://github.com/adelevie/parse-ruby-client

parse-ruby-clientはGeoPointは扱えますが、GeoQueriesについてはTODOになっており、現状では非対応です。コミットを見ると、開発が一時停止してたようです。
https://github.com/adelevie/parse-ruby-client#geoqueries

SDKはREST APIのラッパーなので、parse-ruby-clientからGeoQueriesを扱えるようにパラメータを追加して対応してみましょう。

#必要なパラメータ
GeoQueriesを扱う際に必要なパラメータは、1つだけ、$nearSphereです。

```rb:
$nearSphere
```

これだけでもOKですが、$maxDistanceInMilesなどの内1つを付けると、中心点からの指定した距離に限定できます。

```rb:
$maxDistanceInMiles
$maxDistanceInKilometers
$maxDistanceInRadians
```
これらパラメータはParseのドキュメントで解説されています。
https://parse.com/docs/rest/guide#geopoints-geo-queries

#parse-ruby-clientからリクエストする
それでは、$nearSphere付きでリクエストしてみましょう。
GeoPointデータがpositionに入っているとします。
最初に書いてあるのは、GeoQueriesで検索する対象のGeoPointです。

```rb:
value = Parse::GeoPoint.new({
                                "latitude" => 35.0,
                                "longitude" => 130.0
                            })
gq.add_constraint("position", { "$nearSphere" => Parse.pointerize_value(value) })
```

#ある程度の距離で限定する
前述の中心点からある程度の距離に限定してみましょう。同じ手順で\$maxDistanceInMilesなどを付加するだけです。
下は$maxDistanceInMilesで3マイルに限定しています。

```rb:
gq.add_constraint("position", { "$maxDistanceInMiles" => Parse.pointerize_value(3) })
```

#レスポンス数を絞る
距離は限定しましたが、レスポンスの数を絞りたいことがあります。その際は、(他の場合でも使われる)limitがGeoQueriesでも有効です。

```rb:
qb.limit = 10
```


#まとめ
parse-ruby-clientからGeoQueriesを扱う際のまとめです。
\$nearSphereと$maxDistanceInMiles、そしてlimitで数を10に絞った状態です。
Parseのクラス名はpositionsとします。

```rb:parse.rb
value = Parse::GeoPoint.new({
                                "latitude" => 35.0,
                                "longitude" => 130.0
                            })

gq = Parse::Query.new("positions")

gq.add_constraint("position", { "$nearSphere" => Parse.pointerize_value(value) })
gq.add_constraint("position", { "$maxDistanceInMiles" => Parse.pointerize_value(3) })
gq.limit = 10

gq.get.each do |r|
  p r["position"].to_json
end
```
XCode6.3でAlamofire-SwiftyJSONを使う

「[iOS アプリ開発 Swift対応版](http://www.amazon.co.jp/TECHNICAL-MASTER-%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%81%AEiOS%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA%E3%80%80Swift%E5%AF%BE%E5%BF%9C%E7%89%88-%E9%95%B7%E8%B0%B7%E5%B7%9D-%E6%99%BA%E5%B8%8C/dp/4798043656/ref=sr_1_3?s=books&ie=UTF8&qid=1433682966&sr=1-3&keywords=iOS%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA)」に書かれていた、
Alamofire-SwiftyJSONを導入する方法がうまくいかなかったので解決策をメモ。

1. Podのinstall

この[記事](http://vdeep.net/xcode63-cocoapods-alamofire-swiftyjson)を参考に、以下のPodfileをinstall。

```lang:Podfile
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.2'
use_frameworks!
 
# for Xcode6.3
pod 'Alamofire', '~> 1.2.0'
 
# for Xcode6.3
pod 'SwiftyJSON'
 
# Alamofire-SwiftyJSON
pod 'Alamofire-SwiftyJSON', :git => "https://github.com/SwiftyJSON/Alamofire-SwiftyJSON.git"

pod 'SDWebImage' 

target 'GourmetSearch' do

end

target 'GourmetSearchTests' do

end
```

2.「segmentation fault: 11」エラーを解消

stackoverflowの以下の[Answer](http://ja.stackoverflow.com/questions/9187/cocoapods%E3%81%A7%E3%81%AEalamofire-swiftyjson%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%8A%E3%82%88%E3%81%B3%E3%83%93%E3%83%AB%E3%83%89%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)を参考に解消。

>Alamofireモジュール等がビルドできていないことが原因でした。

>XCODEの左上の■ボタンの右隣のビルドターゲットにAlamofire等が表示されていなかったので、
Manage Schemes で Pods-[Target名]-Alamofire等の>Showにチェックを入れました。

>するとビルドターゲットに表示されたので、Alamofire、SwiftyJSON、Alamofire-SwiftyJSONの
順番でビルドしてから、自分のプロジェクトを最後にビルドすると、該当のエラーは消えました。

3.実機ビルド時に発生した例外を解決

iPhone5(iOS8.3)にビルドしようとしたところ、以下の例外が発生。

```
module.modulemap:10:12: error: header 'SwiftyJSON-Swift.h' not found
```

「SwiftyJSON-Swift.h」で検索してみたが、該当するファイルはない。
以下のようにエラー部分をコメントアウトしたらビルドできた。

```lang:module.modulemap
framework module SwiftyJSON {
  umbrella header "SwiftyJSON.h"

  export *
  module * { export * }
}

module SwiftyJSON.Swift {
    //実機ビルド時にエラーになったのでコメントアウト
    //header "SwiftyJSON-Swift.h"
}
```

このエラー、ビルド対象がシミューレータだと発生しない。なぜだろう。
XcodeでSwiftのコードヒントを正しく表示させる方法

ActionScript 3.0やJavaScriptといった言語のエディターには、**変数や関数の宣言前に記述したコメントをコードヒントとして表示する機能があります**。SwiftをプログラミングするためのIDE「 Xcode」にもこのような機能がありますが、**コメントを正しく記述しないとコードヒントが表示されません。**

# コードヒントが表示される書き方
以下のコードをご覧ください。Hogeクラスには、2つの引数を加算するcalcSum()メソッドが定義されています。

```swift:Swift

class Hoge {
    
    init() {
        calcSum(1, b: 2);
    }
    
    /**
     aとbの合計を計算する
     - parameter a:値1
     - parameter b:値2
     - returns: aとbの合計
     */
    func calcSum(a:Int, b:Int) -> Int {
        let sum:Int = a + b;
        return sum;
    }
}
```

calcSum()メソッド前のコメントを見るとわかるように、**引数は@paramではなく「- parameter 」、戻り値は@returnではなく「returns:」**というキーワードで記述されています。

# コードヒントの表示方法
## コード補完時の表示
関数のコード補完時に、関数名の下に説明文が表示されます。引数や戻り値は表示されません。
![codehokan.png](https://qiita-image-store.s3.amazonaws.com/0/67884/64b18500-71b3-bc42-29e0-696786caa314.png)

##  Quick Helpでの表示
calcSum()を実行している箇所で、[alt]を押しながらクリックすると、下図①の箇所と②（Quick Help）の箇所にコードヒントが表示されます。また、[alt]を押さずにクリックすると、②のQuick Helpのみが表示されます。
それぞれの場所に以下の内容が表示されています。
Description：関数の説明
Parameters：引数の説明
Returns：戻り値の説明

<img width="986" alt="Quick Help" src="https://qiita-image-store.s3.amazonaws.com/0/67884/5468c4b4-1327-0b59-923b-ea43ee1b4538.png">

# コードヒントが正しく表示されない書き方
それでは、誤った書き方をするとどうなるのでしょうか？例えば以下のような記述をしてみます。

```swift:Swift
    /**
    aとbの合計を計算する

    @param a:値1
    @param b:値2
    @returns: aとbの合計
    */
```

Quick Helpを見ると、引数や戻り値の説明がDescriptionにまとめられ、引数や戻り値の説明がないのがわかります。
![wronpatern1.png](https://qiita-image-store.s3.amazonaws.com/0/67884/df9cd07b-409e-c9c8-1838-8a1164534722.png)

# プラグイン「VVDocumenter-Xcode」を使うと記述が楽に
上記の記述を手動で行うのが面倒ならば、「[VVDocumenter-Xcode](https://github.com/onevcat/VVDocumenter-Xcode)」を使うと便利です。「///」と入力するだけで自動で記述できます。
インストール方法等は下記記事を参照するとよいでしょう。記事内で紹介されている記述は古いですが、VVDocumenter-Xcodeは最新の記述方法に対応していますのでご安心ください。
[VVDocumenter-Xcode で Swift プロジェクトの API ドキュメントを記述する ｜ Developers.IO](http://dev.classmethod.jp/references/vvdocumenter-swift/)

# 最後に
**少々記法は特殊ですが、慣れてしまえば他の言語と同じくコードヒントの恩恵に預かることができます**。コードヒントを駆使して、規模の大きなプロジェクト開発も安全に進めていきましょう。


*参考：[Swift Documentation](http://nshipster.com/swift-documentation/)*
カメラ画像をライブでタブレットに表示するサンプル（実用性低し）


![IMG_0711.JPG](https://qiita-image-store.s3.amazonaws.com/0/81650/972dcdc1-e5ed-31e5-db42-797a69826b4b.jpeg)

初めて記事書きます。

Pepper もくもく会（ https://pepper.doorkeeper.jp/events/26221 ）の成果。公開するとお伝えしたので、ここに公開しようと思います。

タイトルの通り、カメラ画像をライブでタブレットに表示するサンプルというサンプルを作ってみました。カメラのライブ画像は ALVideoDevice.getImageRemote() で取ってこれるんで、これをタブレットに表示すればいいやと思ったんですが、取ってきた生データをHTML ページに表示させる効率的な方法が見つからず、パフォーマンスに難ありです。

ということで実用という意味では？ですが、こんな感じで ALVideoDevice.getImageRemote() 使えるのねという一つのサンプルと思っていただければ幸いです。

サンプルでは、カメラ画像の取得のリクエスト、処理をすべて HTML ページ内の JavaScript で行っています。ペッパー本体への画像リクエスト、取得に QiMessaging API を使っています。
QiMessaging API を使って ALVideoDevice.getImageRemote() を呼び出すと、R,G,B の並びでのバイト配列が Base64 でエンコードされて JavaScript 側に渡されます。ここまではまあいい感じなんですが、Base64 でエンコードされた生画像データをどうタブレットに表示させればいいのか、、、イマイチわかりませんでした。
で取った方法は base64 をデコードして、１ピクセルずつ ImageData オブジェクトにセット。一応動いているみたいですが、遅い、、。 0.5 FPS というところでしょうか、、、

```js:
images.src = "data:image/bmp;base64," + base64でデコードされた画像データ
```

みたいにできれば素敵なんですが、、、raw 画像に対応した MIME タイプがあるのかなど調べきれずです。

Choregrapheプロジェクト github に公開しました。
https://github.com/tkawata1025/CameraToTablet
【C#】ドライブ直下からのファイルリスト取得について

##状況
「C# ファイル 一覧 取得」とかググれば、指定したディレクトリパス以下のファイルを取得する方法なんていくらでも出てくる。
それに習って、再帰処理で`Directory.GetFiles(~)`と`Directory.GetDirectories(~)`を使って深部へと潜りつつファイル一覧を取得するものとか、.NET FW4.0以上だったら`Directory.EnumerateFiles(~)`を使って一度に取得なんてことをするものだと思う。

この時、検索元のディレクトリの指定「C:\」や「D:\」といったドライブ直下にした時、プログラムがコケるケースがあった。
原因は隠しフォルダの「RECYCLE.BIN」で、要は操作しているユーザのアクセス権が無いゴミ箱（他のユーザのゴミ箱だったりとか）を読み取ることができずに例外を吐いて死んでしまうことに気がついた。

これを回避するためには、再帰処理に読み取れなかった場合を考慮してちゃんとtry~catchしてあげればいいという単純なもの。
指定したパス以下のファイル一覧を取得なんて処理はよく使うし、良い機会なのでこうしてメモする。

##ソース
今回catchしても特段処理はしていない。使うアプリケーションによって、ログを吐くなりして丁寧に止めるなりすればいいだろう。
まあ、今回は止めないためにこうして書いたのだけど。

```csharp:FileUtil.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.IO;
using System.Data;

public class FileUtil
{
        public static List<String> GetAllFiles(String DirPath)
        {
            List<String> lstStr = new List<String>();
            String[] strBuff;

            try
            {
                // ファイル取得
                strBuff = Directory.GetFiles(DirPath);
                foreach (String s in strBuff)
                {
                    lstStr.Add(s);
                }

                // ディレクトリの取得
                strBuff = Directory.GetDirectories(DirPath);
                foreach (String s in strBuff)
                {
                    List<String> lstBuff = GetAllFiles(s);
                    lstBuff.ForEach(delegate(String str)
                    {
                        lstStr.Add(str);
                    });
                }
            }
            catch(System.UnauthorizedAccessException)
            {
                // アクセスできなかったので無視
            }

            return lstStr;
        }
}
```

##解説
特段特別なことをせず、指定したディレクトリからまずはファイル一覧を取得し、その後ディレクトリを取得する。
取得できたディレクトリを元に再起動を繰り返し、深部の階層へと潜っていく。前述した通り、よくある再帰処理を利用したファイル一覧取得ロジックだ。
Laravelで関連するデータを簡単に操作する


Eloquentを使って簡単に関連するデータを操作するためには、

* migarationファイルに外部キーを定義
* Eloquentにリレーションを定義

の２つが必要です。

Laravelの公式ドキュメントでもこの２つに関する記述まとまっている記事等がなかったので記述いたします。


##状況

UserはEmaiを複数登録できるとします。
この関係をこの関係をテーブルとEloquentに定義します。

##


##migarationファイルに外部キーを定義
###親テーブル
親テーブルには特に定義は必要ありません。

```php:create_emails_tables.php
    public function up()
    {
        Schema::create('users', function(Blueprint $table)
        {
            $table->increments('id');
            $table->string('username', 64);
            $table->string('password', 12);
            $table->timestamps();
            $table->rememberToken();
        });
    }
```

###子テーブル
子テーブルに外部キーを定義します。

```php:creat_users_talbes.php
    public function up()
    {   
        Schema::create('emails', function(Blueprint $table)
        {   
            $table->increments('id');
            $table->integer('user_id')->unsigned();
            $table->string('email', 64)->unique();
            $table->string('primary');
            $table->timestamps();

            $table->foreign('user_id')
                ->references('id')
                ->on('users')
        }); 
    }
```

この例では、user_idカラムがusersテーブルのidカラムを参照していることを宣言しています。これでテーブル間でリレーションを定義することができました。

次は関連したモデルを簡単に操作できるようにする定義です。

##Eloquentにリレーションを定義


###１対多の関連を定義する
１対多の関連には、hasManyメソッドを使います。

```php:User.php
class User extends Eloquent {

    public function emails()
    {
        return $this->hasMany('Email');
    }

}
```

###逆の関連を定義する
Userモデルの関連を逆に定義するには、belongsToメソッドを使います。

```php:Email.php
class Email extends Eloquent {

    public function user()
    {
        return $this->belongsTo('User');
    }

}
```

このように記述することでEloquentを使って簡単にデータを取得することが可能になります。
取得するデータが単数か複数可によってメソッド名も単数と複数を返るようにしてください。


##その他の関連
Eloquentは多くの関連をサポートしています。

* 多対多
* 他テーブルを経由した多対多
* 多様対応関係
* 多対多 多様対応関係


##謝辞

最後まで読んでいただき、まことにありがとうございます。
Node.jsで使うJobQueueとcron型Scheduleのリソース

Railsの本番環境でここ数年止まることなく安定してResqueとRakeのワーカーが動いているので満足しています。今はNode.jsで書きたいのでいわゆるJobQueueとかcronタイプのschedulerとか調べています。バックエンドにRedisは便利なのですがMongoDBの方が良いのかなと思います。MongoDBも小さく使う分には雑に扱っても安定している印象です。


## JobQueue

今ひとつJobQueueとcron型Schedulerの使い分けがハッキリしないのですが、Resqueの場合はバックグランドにまわしたいQueueと[resque-scheduler](https://github.com/resque/resque-scheduler)を組み合わせて要求は満たせていました。cronでスケジュールしたいけど、REST APIでアドホックにenqueueしたい。scheduleも途中でしてキャンセルしてrescheduleしたい。使うツールに悩みます。

### MongoDB

[agenda](https://github.com/rschmukler/agenda)は使っている人も多いみたいで、JobQueueとScheduleの両方に対応して今のところ一番良いのではないかと思います。[Jobukyu](https://github.com/rschmukler/agenda)はREST APIで操作できるので要件的にこっちかも知れません。

* [agenda](https://github.com/rschmukler/agenda)
* [monq](https://github.com/scttnlsn/monq)
* [mongodb-queue](https://github.com/chilts/mongodb-queue)
* [Jobukyu](https://github.com/rschmukler/agenda)

### Redis

経験則だとResque型は最悪redis-cliでどうにでも操作できるので安心できます。[Kue](https://github.com/Automattic/kue/)はREST APIも使え、Expressや[Sails.js](http://sailsjs.org/)とのインテグレーションの実績もあるので本格的なWebアプリをNode.jsで書くときに使いたいと思います。

* [Kue](http://automattic.github.io/kue/)
* [Bull](https://github.com/OptimalBits/bull)
* [Barbeque](https://github.com/pilwon/barbeque)
* [node-resque](https://github.com/taskrabbit/node-resque)
* [Coffee-Resque](https://github.com/technoweenie/coffee-resque)

## cron型のschedule

cronタイプのschedulerだと[node-schedule](https://github.com/node-schedule/node-schedule)が使いやすそうです。ドキュメントが少ないのが残念ですがテストケースを読むとジョブのキャンセルとかできるみたいです。

* [node-cron](https://github.com/ncb000gt/node-cron)
* [node-schedule](https://github.com/node-schedule/node-schedule)
* [Later.js](https://github.com/bunkat/later)