OmniAICreator/Qiita-1.07M huggingface dataset:
interfacebuilderとAuto layoutで1pxの線を出す


CALayerなんかを使ってUIVewに線を追加するやり方なんかはわりとよくあるのだけど、InterfaceBuilder上でいい感じの位置に線を出したいとなるとちょいと工夫が必要だったのでメモ

## まずは結果から
<img src=https://qiita-image-store.s3.amazonaws.com/0/7307/676f09f6-0c6a-f8a1-8ee2-ce39d7a1527b.png width=300 style="border:1px solid #ccc">
求められているのは0.5の線。
いまいち理解が甘いのですがAutolayoutでHeight=1を設定しても2px程度になるようです。

## 新規に設定する場合
まずはさくっとviewを配置
<img src="https://qiita-image-store.s3.amazonaws.com/0/7307/52ae843e-0d99-d8e4-2440-ed14cd0d2ad2.png" width=300 style="border:1px solid #ccc">

そしてAutolayoutの設定で **Heightに.5と入力**
<img src=https://qiita-image-store.s3.amazonaws.com/0/7307/c71eb2c6-60ce-2744-25ac-c8d85e4b7479.png width=300 style="border:1px solid #ccc">

ここまではOK。

## 途中から設定する場合
しかし上記のHeight 0.5、初回にかけてあげることはできるようですが、
<img src=https://qiita-image-store.s3.amazonaws.com/0/7307/5471306f-9258-0cef-a755-2cbfee247414.png width=300 style="border:1px solid #ccc">
こちらのSize Inspectorからは設定できない模様・・・・

ちょっと新規でやりなおすのもな・・・という時は、下記のやり方もあるようです。

こんな感じでconstraintとoutletを紐付けて
<img src=https://qiita-image-store.s3.amazonaws.com/0/7307/ba03ba4f-bc1b-cb6d-775c-c136119822ee.png width=400 style="border:1px solid #ccc"> 

```swift
class ViewController: UIViewController {
	// constraint outlet
    @IBOutlet weak var heightConstraint: NSLayoutConstraint!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        heightConstraint.constant = 0.5
    }
    
}
```

こんな具合でconstraintを変更してやることでも可能なようです。
AnsibleからVagrantにssh経由でgit cloneする時の注意点

## 概要

以下のようなケースはSSH経由でGitHubのソースをダウンロードする必要があります。

1. 秘密鍵にパスフレーズが設定されている！
2. GitHubのアカウントが2段階認証になっている！
3. git操作するたびにパスワード入れるのが面倒！
4. 環境自動構築ツールでgit cloneさせたい

今回のブログはケース4に焦点を当てて説明をしたいと思います。筆者の作業環境は

- macosx 10.10
- Ansible 1.7.2
- Vagrant 1.6.5

次、作業ポイントについて説明させていただきます。

## 手順1. ローカル環境に認証鍵を登録

```bash
# sshエージェント起動
ssh-agent

# ssh-add [秘密鍵の格納場所]
ssh-add ~/.ssh/id_rsa

# 登録確認
ssh-agent -l
```

## 手順2. VagrantのSSH Agent Forwarding設定を有効にする

Vagrantfileを修正

```rb
# If true, then any SSH connections made will enable agent forwarding.
# Default value: false
config.ssh.forward_agent = true
```

仮想環境起動(vagrant up)

## 手順3. plyabookにgit cloneの記述をする

playbook記述

```yaml
- name: Copy the code from repository
  git: repo={{ repository }} dest=/home/vagrant/repo1 accept_hostkey=yes
  sudo: no
```

ansible-playbook -i host [playbook名] でansible実行
partialで部分テンプレ返す時に、複数回呼び出されてしまって困ったやつ


やろうとしたことは

* Facebookのタイムラインのように、スクロールした際にajaxでリクエスト
* 部分テンプレ返してもらって描画

そうすると __複数回テンプレが描画されてしまって困った__ というやつです。


知ってればなんてことないのですが、知らなくて無駄にハマったのでメモ。
一応あまりバージョン関係ないと思うのですが、Rails4.1とRuby2.1.2で書いてます。

--

もともと私が書いていた描き方が

```ruby
# controller

html = render_to_string partial: 'layouts/more_somethings', collection: [@hoge, @fuga]
render json: { html: html }

```
これをajaxで受け取ってました。
ただ、これだとmore_somethingsが同じものが2回呼び出されてしまいます。

下記が正解

```ruby
# controller

html = render_to_string partial: 'tag/more_somethings', locals: { hoge: @hoge, fuga: @fuga }
render json: { html: html }
```

知ってれば、というかちゃんと調べてれば問題なかったのですが。。

collectionは確かに複数変数を渡せますが、渡した数だけpartialをrenderするという特徴があります。
なので上記の場合2回renderされてしまうということが起こってました。。
AmazonSESでのSPFとDKIM設定周り


# SPF

## SESでのメールアドレス認証
SESのVerify a New Email Addressを実施する。

## Route53
対象のドメインに対してSPFレコードを作成する。Type:SPFとTXTを用意する。2レコードの内容は以下で同じ。
もしかしたらSPFレコードだけでいいかも。

```
"v=spf1 include:amazonses.com a:example.jp -all"
```
*※対象ドメインがexample.jpの場合*


# DKIM

## SESでのドメイン認証
SESのVerify a New Domainを登録する。
ダイアログに出てくるGenerate DKIM Settingsにはチェックを入れる。
Use Route53が可能なので、ボタンを押下し、そのままRoute53へ自動でDKIM周りの設定を追加させる。

## SESでのDKIM有効化
今回追加した、

1. メールアドレス
2. ドメイン

に対して、DKIMをenabledにする必要がある。（デフォルトはdisabled）
対象メールアドレス・ドメイン行を選択後View DetailでDKIM項目を表示、enabledに切り替える。
メールアドレス、ドメインの両方を解放して初めて有効になる。


# 確認方法
- 簡単な方法はGmail(ブラウザ)で受信した際に、fromアドレスの右側に「amazonses.com 経由」と出ていなければ成功。
- メールヘッダだとDkim-Signatureが2行あり、片方がd=example.jpとなっていて、Recieved-Spfもpassしていると良さそう。
特定のIPアドレス:ポートでLISTEN

## 参考

* [コンテナの連結と操作 - Docker User Guide - Qiita](http://qiita.com/zembutsu/items/f361cad9be500950939f)

```bash:書式
docker run -it -p <IPaddr>:<host-port>:<docker-port> <イメージ名>
```

```bash:例
docker run -it -p 192.168.0.3:8080:80 <イメージ名>
```

# ダメだった例

IPv6が有効な場合、以下だと::1でLISTERNされた

```bash:例
docker run -it -p 0.0.0.0:8080:80 <イメージ名>
```

# udpでLISTEN

```bash:例
docker run -it -p 192.168.0.3:8080:80/udp <イメージ名>
```

* `/udp`をつける
Egitから さくらVPS に作ったリモートリポジトリに繋がらない理由

# はじめに
Mac + Eclipse + EGit で さくらVPSにあるCentOS6.5に作成したリモートリポジトリをクローンしようとしたところ、ちょっとしたことでハマった。

# 症状
[Eclipse と git の連携　～さくらVPS～](http://sonoshou.hatenablog.jp/entry/20121111/1352655599)を参考に環境構築をしていて、リモートリポジトリをクローンする時に下の画面のように設定。

![スクリーンショット 2014-11-12 21.24.20.jpg](https://qiita-image-store.s3.amazonaws.com/0/57201/07826047-7a66-4a93-2c52-8833f9c36ed2.jpeg)
画像1 Gitリポジトリーの複製元の設定

その後、ブランチを指定する画面に、本来出るはずのブランチが出ない。
その時のエラーがこちら

![スクリーンショット 2014-11-12 21.22.14.jpg](https://qiita-image-store.s3.amazonaws.com/0/57201/295ce840-852a-521d-ab2b-09c74cdec6da.jpeg)
画像2 エラー内容
（なにかがNull...わからん）

# 解決方法
ホスト先との接続に使用する秘密鍵の指定が失敗していて、
リモートリポジトリにアクセスできていなかったみたい。

失敗した原因は、eclipse>設定>一般>ネットワーク接続>SSH2の既存ホストに
正しくない秘密鍵でのアクセスが残っていたから。

![スクリーンショット_2014-11-13_9.24.22.png](https://qiita-image-store.s3.amazonaws.com/0/57201/e35c1e41-dc0e-40af-464d-e50b4324b843.png)
画像3 既存ホストの設定

一度、ホストをすべて除去して接続しなおしたらうまくいった。
除去する前に、.ssh/known_hostsをバックアップしとくと安心

![スクリーンショット_2014-11-13_9.42.09.jpeg](https://qiita-image-store.s3.amazonaws.com/0/57201/bbfb06f9-e9e7-56b7-7e35-63884b78e65b.jpeg)
画像4 既存ホストを除去した後に繋げ直した結果

# 参考
[Eclipse と git の連携　～さくらVPS～](http://sonoshou.hatenablog.jp/entry/20121111/1352655599)

# おわりに
Egitを使っているときに具合が悪いときは、ターミナル上で同様の動作をしてみると、原因の所在を絞れる。
勉強になりました。
wgetのコマンドメモ


-o ログファイル指定
-w ウェイト
-N タイムスタンプ保持
-x ドメインとかパスを保持
-r　再帰
-l inf 再帰の深さを無限にする
--user ベーシック認証のユーザ名
--password ベーシック認証のパスワード
--restrict-file-names=modes　ファイル名の制御：modeで規定

modeは以下の通りで複数しても可能。

unix, windows, nocontrol, ascii, lowercase, and uppercase

nocontrolをつければ日本語ファイル名が%エンコードされることもないが、注意が必要そう。
adbコマンドでAndroid端末の時刻を設定する

## という記事を書こうと思ったら

既にありました．純粋に時刻を変更するには下の記事をご参考に．
[Qiita - 【Android】Terminalから端末時間を変更する - adb shell date](http://qiita.com/operandoOS/items/144315014228fd954a00)

でもこの紹介だけじゃ意味が無いので…

## adb コマンドで自動時刻設定をするには

```bash
# 自動時刻設定ON
adb shell settings put global auto_time 1
# 自動時刻設定OFF
adb shell settings put global auto_time 0
```
sails.js でサービス構築するときの本番、開発環境切り替えについて v0.10以降 | sails.js (0.10.x) で始めるアプリ開発

開発環境、本番環境切り替えるとか、パスワード等の大切な情報のシステムへの渡し方についてのメモです。

# パスワードとかAPIキー :key: 等のgitに入れたくないものの :secret: 取扱いについて

config/local.js というファイルがあります。ロケールじゃなくてローカル local ね。

 - config/local.js は .gitignore で無視されるようになってます
 - config/local.js に大切な情報を書きましょう
  - パスワード :secret:
  - S3のキー :key:
  - 各種APIのキー :key:
 - こうすることでソース管理してるレポジトリにやばい情報が残らずに済みます

# データベース接続先等の環境依存情報の取り扱いについて

**v0.10 以降**からconfig/envが追加され、この下にある

 - config/env/production.js
 - config/env/development.js

といった設定ファイルで切り替えられるようになりました。production.js が使われるのは `sails lift --prod` でサービス開始 :arrow_forward: した時です
windowsのシンボリックリンク

`mklink /d "リンク名" "リンク先の実体ファイル"`
/dはディレクトリの意。
`ln -s`とは引数指定が真逆なので注意。
あと、こっちは-sとか付けなくてもデフォでシンボリックリンク作ってくれる。
同じドライブ内ならハードリンクのほうが便利なこともあるけどそういう時は`/h`でおｋ。
tmuxでmacのクリップボードと連携する


http://qiita.com/upinetree/items/cd80bc7865c52091be10


こちらを参考に実施。

```
$ brew install reattach-to-user-namespace
```

```~/.tmux.conf
# コピー、選択モードのキーバインドvi風にする
set-window-option -g mode-keys vi

# クリップボードをmacと連携
# http://qiita.com/upinetree/items/cd80bc7865c52091be10
unbind -t vi-copy Enter
bind-key -t vi-copy Enter copy-pipe "reattach-to-user-namespace pbcopy"
```

前は`Enter`キーを押してから、`bind-key C-q`を押すとクリップボードに入るようにしてた。
何でそんなめんどくさい事していたのか忘れたけど、これで範囲を選択して`Enter`を押すと自動的にクリップボードに入るので楽。


参考にしたqiitaだと、`v`キーと`y`でコピーが出来るようにしていたが、`v`キーを潰してしまうと、矩形選択が出来なくなるのでやめた。
AWS re:invent 2014 で発表の新サービス 〜いっぱい出たね〜


# 2014/11/12 発表

## 1. Amazon Aurora

* MySQLコンパチブルなRDB
* イレブン9の信頼性
* プレビュー版申込はこちら http://aws.amazon.com/jp/rds/aurora/preview/

## 2. AWS CodeDeploy

* デプロイサービス
* 利用はこちら http://aws.amazon.com/jp/codedeploy/
* [新サービス] AWS CodeDeployを触ってみた http://dev.classmethod.jp/cloud/codedeploy-ataglance/


## 3. AWS CodePipeline
    
* CIツール
* 2015年リリース予定
    
## 4. AWS CodeCommit

* 2015リリース予定
* いろんな既存のデプロイツールと統合するお
* Chef, Jenkins, Circle CI とか
    
CodePipelineとCodeCommitの違いがよくわからない。


## 5. AWS Key Management Service

セキュリティ／暗号化


# 2014/11/13発表

## 6. Amazon EC2 Container Service

* 今日から使える

## 7. AWS Lambda

* 今日から使える
* イベント・ドリブン 関数
* http://aws.amaozon.com/lambda/

## 8. 新インスタンス C4


## 9. NEW EBS VOLUMES
メモ - 本番環境でrake db:migrateしたらエラー(relation テーブル名 does not exit)出た。

本番環境で`rake db:migrate RAILS_ENV=production`としたら`ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR:  relation テーブル名 does not exist`とエラーが。

`rake db:schema:load RAILS_ENV=production`

とした後`rake db:migrate RAILS_ENV=production`でなんか成功。

#### 参考
[Rake - Railsドキュメント](http://railsdoc.com/rake)
工数見積もりは日数×10時間でいいんじゃないかな

Twitterから引用

仕事は納期までの時間の2割で8割分を終わらせないといけない

(｡´╹ω╹｡)作業時間の8割は相手からの連絡待ちなので、作成時間は2割しかない、しかし納期の延長は無い

----

「○○の機能作っといて。」
「どれくらいで出来そう？」
と言われて
「１日くらいですね」<- すぐ終わる内容
「３日くらいですね」<- ソース見てからじゃないと判断つかない場合
「ちょっとわかりません」<- 馬鹿でかいチケットの場合。タスクを細分化できていない。

という感じですが、実際は横からタスクを差し込まれたり、話しかけられたり、モチベーションの浮き沈みなどで着手が遅れることが有ります。

そういう時、日数じゃなくて、`日数×10時間`で伝える、また意識するのが良い気が一瞬したのでメモ。

で、redmineに着手時間数を書けばあとで見なおせる。


見積もり２倍、３倍とか盛りすぎ、アバウトすぎだろと思っていたので。

## いきなりこういう図はイメージしづらいし漏れが起こりやすい

![](http://www.a-lab.jp/a/topics/strategy/schedule/morning2-1.gif)

## まずこういう図で書く。工数は書かない

![](http://www.terada-hp.or.jp/guide/pas/what01/img/pert.jpg)

## ぼんやりとした日数を入れる

![](http://www.pursue.ne.jp/jouhousyo/sysadPERT/ImageA/sysA02_01.gif)

## ×10したものを突っ込む

![](http://www.a-lab.jp/a/topics/strategy/schedule/morning2-1.gif)
chkconfigまとめ

多くの方がまとめてはいますが、個人の学習のためにchkconfigコマンドについてまとめてみました。

<h2>chkconfigコマンドとは？</h2>
サービスのシステム起動時の挙動設定を行う。システム起動時に自動起動するサービスの設定や不必要なサービスを停止するなどの設定を行う。例えば、サーバ起動時にApacheも同時に起動させたいとき、chkconfigで設定を行うことで実現できる。


<h2>chkconfig関連オプション</h2>
1:サービスの設定リストを閲覧する

```
/sbin/chkconfig --list
```

![スクリーンショット 2014-11-13 0.40.18.png](https://qiita-image-store.s3.amazonaws.com/0/58014/2571f9ab-ab0e-39dd-ea03-9ebf7126d7b8.png)

onとoffの前についている数字（０〜６）はランレベル(Run Level)と呼ばれるものです。
--list オプションではサービス名指定もできます。

サービス名指定の例：/sbin/chkconfig --list redis



<table>
<tr><th>Run Level</th><th>状態</th></tr>
<tr><td>0</td><td>システムの停止</td></tr>
<tr><td>1</td><td>シングルユーザモード</td></tr>
<tr><td>2</td><td>マルチユーザモード</td></tr>
<tr><td>3</td><td>マルチユーザモード(コンソールログイン)</td></tr>
<tr><td>4</td><td>未使用</td></tr>
<tr><td>5</td><td>マルチユーザモード(ディスプレイマネージャ使用)</td></tr>
<tr><td>6</td><td>システム再起動</td></tr>
</table>

2: サービス設定の追加

```
/sbin/chkconfig --add サービス名
```

3: サービス設定の削除

```
/sbin/chkconfig --del サービス名
```

4: サービスの起動設定をランレベル指定で設定する

```
/sbin/chkconfig --level 2 サービス名 on
```

上記は[サービス名]のサービスのランレベル2の自動起動設定を有効にする、という意味になります。
複数レベルを指定しての設定も可能です。

<h3>便利な使い方</h3>
1: 特定のサービスの起動設定を全て有効にする

```
/sbin/chkconfig サービス名 on
```

2: 特定のサービスの起動設定を全て無効にする

```
/sbin/chkconfig サービス名 off
```

3: 複数レベルの設定を行う

```
/sbin/chkconfig --level 34 サービス名 on
```

*上記は[サービス名]のサービスのレベル３と４の起動設定を有効にするという意味になります。


<h3>注意</h3>
変更されたサービスの設定はすぐに反映されるわけではありません。次回システムを起動した際には自動起動されますが、即時に起動させたい場合はサービスの起動を行う必要があります。

```
/sbin/service サービス名 start 
```

startをstopにすると停止、restartにすると再起動という意味になります。
そんなにたくさんパスワード覚えきれないよ(*･ε･*)ﾑｰ

最近パスワードがバレて乗っ取られが周囲で流行っています。
注意喚起されるのは、

* 長いパスワードにしなさい
* 別サービスで同じパスワードを使いまわしちゃダメ
* パスワードは紙に書いたりしない

わかってるけど、長いパスワードたくさん覚えられーよ（●｀ε´●）という方多いと思います。
そんな方のためのパスワード管理術を書きたいと思います。
＃傾向性がバレるので本当は公でわざわざ晒したくはないのですが・・・

## まずはパスワードに対する攻撃を知る

代表的な攻撃方法を知っておきましょう。通信経路盗聴系は個人では対策がなかなか厳しいパターンが多いのでここではとりあえず書かないことにします。

### 1. ブルートフォースアタック

いわゆる総当りです。
最近話題の数字４桁パスワードなんて総当りしても10,000通り。昨今のコンピューターの性能からしたら一瞬で試せますね。
ただ、さすがに連続攻撃は怪しすぎるので機械的に検知されることがほとんどです。銀行とか連続して失敗するとロックされますよね。

対策は組み合わせ数を増やすことです。

* できるだけパスワードを長くする
* 使う文字種を増やす（アルファベット、数字、記号を織り交ぜる）

### 2. 辞書攻撃

いくらパスワードが長くても英単語などを組み合わせると総当りせずとも推測が容易になります。
英単語に限定することで組み合わせ数はかなり減らすことができます。

対策は単語を使わないことです。ただし覚えられなくなること確実なので妥協します。人間だもの。

* 単語の一部をもじる（例：fujitsu -> fuji2）
* 間引く （例：fujitsu -> fj2）
* 組み合わせる（例： tako と ika を組み合わせて tiakkao)

### 3. リスト攻撃

これです、最近多いの。パスワードを使いまわしているので一箇所でバレると芋づる式にバレてしまうのです。
対策はもちろん「同じパスワードを使わない」です。が、冒頭に述べたとおり「覚えられねーよ」。

## で、どうするか

本題です。やっぱ記憶容量に限界のある人間なので、

* ある程度覚えられるものにする
* メモる

というのがどうしても必要になってきます。

ということで、パスワードを4つの要素に分けて考えましょう。

1. ベースパスワード
2. ソルト
3. ソルトを混ぜる方法
4. ソルトを混ぜるキー

### 1. ベースパスワード

これは辞書攻撃対策を入れたある程度長い（６文字以上くらいを推奨）文字列で覚えられるものにします。
現実的には単語もじりとかが多くなるんじゃないかと思います。

サイトによって、英数しか使えない、大文字小文字を織り交ぜないとダメ、と制約があるので２，３パターン用意しておきます。

これだけは紙などに書かずに覚えましょう。

### 2. ソルト:サービスごとにコードネームを割り振る

|コード|サービス名|
|----|---------|
|0001|facebook|
|0002|twitter|

こんな相対表を作りましょう。別に数字に限定しなくても、

|コード|サービス名|
|----|---------|
|kao|facebook|
|tori|twitter|

など覚えられるものでもいいでしょう。

これは覚えられないなら紙に書いてもいいことにしましょう。

### 3.混ぜる方法

ベースパスワードとソルトを組み合わせます。
最も単純な方法は連結です。

|ベース|ソルト|組み合わせた結果|
|---|----|-----|
|hoge|kao|hogekao|

しかしあまりに芸がないのでもう少し工夫をしたほうがいいでしょう。
例えばソルトを[シーザー暗号](http://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%BC%E3%82%B6%E3%83%BC%E6%9A%97%E5%8F%B7)を使って連結するとか。

この混ぜる方法は暗算できる範囲の複雑さのもので覚えましょう。
絶対スマホ持ってる前提なら変換関数を決めてもいいです。（ソルトを二進数化してXORでマスクするとか）

### 4.混ぜるキー

前述通りシーザー暗号を使って連結するとしましょう。
混ぜるキーは後ろにずらす文字数がキーになります。

|ベース|ソルト|キー|組み合わせた結果|
|---|----|---|-----|
|hoge|kao|2|hogemcq|

これは忘れると思うのでメモりましょう。

## ということで

ある程度メモに頼るとして、

|サービス|ソルト|キー|ベースパスワードパターン|
|---|----|---|-----|
|Facebook|kao|2|Aパターン|
|Twitter|tori|5|Aパターン|
|Google|ggg|4|Bパターン|

こんなメモなら漏れてもまぁまぁという感じではないでしょうか。

もちろん覚えられることは覚えたほうが安全になりますが、パスワードを忘れるリスクもなかなかなもの（必要なときに使えなくなる）なのでバランス的にこんなもんかなというところです。
Groonga(Rroonga)で検索時に特定カラムに重みを付けたい


```ruby
grn.select do |record|
  record.match("aaa") do |target|
    (target.title * 20) | (target.content * 10)
  end
end
```

[[詳しく]](http://ongaeshi.hatenablog.com/entry/groonga-set-weight-to-column)
DelayedJobでジョブの状態を取得する


DelayedJobを使っていて、ちょっとジョブの状態を知りたくなったのですが、各ジョブがどんな状態かを明確に取得する方法がなく、少々ハマってしまいました。

ここにその時調べたりソース読んだりしたことをメモしておきます。

# 各状態のジョブを取得する

失敗ジョブを削除する場合

``` ruby
working = Delayed::Job.where('locked_at IS NOT NULL')
failed = Delayed::Job.where('last_error IS NOT NULL')
pending = Delayed::Job.where(attempts: 0, locked_at: nil)
enqueued = Delayed::Job.all
```

失敗ジョブを削除しない場合（これが大変）

``` ruby
working = Delayed::Job.where('locked_at IS NOT NULL').where(last_error: nil)  # 再試行分は取れない…
failed = Delayed::Job.where('last_error IS NOT NULL')
pending = Delayed::Job.where(attempts: 0, locked_at: nil)
enqueued = Delayed::Job.all - failed
```

## 実行中ジョブ(working)

起動しているWorkerの数だけジョブが実行される。
実行されるとlocked_at, locked_byがセットされる。

## 失敗ジョブ(failed)

実行中ジョブが失敗すると、last_errrorにその失敗内容が、failed_atにその時刻が保存される。
この時attemptsが1増える。ここで、設定したattemptsの最大値に達していない場合はロックが解除され、再実行のためにリスケされる。最大値に達した場合は再実行されず、そのまま削除される。

ただし、`Delayed::Worker.destroy_failed_jobs = false`としていると、失敗ジョブは削除されずに残る。

[delayed_job/worker.rb at master · collectiveidea/delayed_job](https://github.com/collectiveidea/delayed_job/blob/master/lib/delayed/worker.rb#L223)

## 失敗ジョブを削除しない場合

失敗ジョブを削除しない場合、残った失敗ジョブがロックされた状態のままになる。
そのためworkingの`locked_at IS NOT NULL`という判定に失敗ジョブが含まれるようになるので、取り除く必要がある。

しかし、単純にfailedを引けばよいかというとそうでもない。

locked_at, locked_byはDBには保存されないため、ワーカを再起動するとどちらもnilになる。
従って`Delayed::Job.where('locked_at IS NULL').where('last_error IS NOT NULL')`になっている失敗ジョブも存在する。
当然これも失敗ジョブとしてカウントされるので、ロックされているジョブだけを対象にしている実行中ジョブから引いただけでは数が合わない。

``` ruby
working = Delayed::Job.where('locked_at IS NOT NULL').where('last_error IS NULL')
```

ただ、これだと再試行の実行中ジョブは取ってくれない…。

下記のように、attemptsが最大に達しているかを見れば再試行中のジョブも取ってくれそう（未確認）

``` ruby
failed_in_running_worker = Delayed::Job.where('last_error IS NOT NULL').where('locked_at IS NOT NULL').where(attempts: Delayed::Worker.max_attempts)
working = Delayed::Job.where('locked_at IS NOT NULL') - failed_in_running_worker
```

## attempts

attemptsはリスケのたびにインクリメントされる。
configで`Delayed::Worker.max_attempts = 1`に設定したら、最大attemptsは1。
なので、この値が0のものはまだ実行されていないか、成功終了したものになる。

# 複数Workerでの実行

[ruby - Delayed_job - Multiple parallel queues? - Stack Overflow](http://stackoverflow.com/questions/9479318/delayed-job-multiple-parallel-queues)

``` ruby
bundle exec ruby script/delayed_job -n 4 start
bundle exec ruby script/delayed_job stop

# rake taskを使う場合は、number指定ができない
# foremanのような複数プロセスの管理ツールを使うと良さそう
bundle exec rake jobs:work
bundle exec rake jobs:work
bundle exec rake jobs:work

# ちなみに、rakeは通常コマンドのqueue/queues相当の環境変数が使える
QUEUES=build_data,email rake jobs:work
```

# その他注意

テストなどで、last_errorがあるジョブを作成するとき、`MassAssignmentSecurity::Error`が発生する。
回避するには次のように`without_protection`オプションを指定する。

``` ruby
Delayed::Job.create({ last_error: 'error' }, without_protection: true)
```

[Rails - seed.rbでCan't mass-assign protected attributesが出た場合の回避方法 - Qiita](http://qiita.com/semind/items/bbb0b7e33685ab40e0c0)

# 参考

- [collectiveidea/delayed_job](https://github.com/collectiveidea/delayed_job)
- [collectiveidea/delayed_job_active_record](https://github.com/collectiveidea/delayed_job_active_record)
- [ejschmitt/delayed_job_web](https://github.com/ejschmitt/delayed_job_web)
JSFで条件によってタグを出さなくする


[OracleのJSF2.0ドキュメント](https://docs.oracle.com/cd/E17802_01/j2ee/javaee/javaserverfaces/2.0/docs/pdldocs/facelets/)では、<ui:fragment>の属性は"id"と"binding"しかないが、実際はrenderedも使える。ドキュメントのバグだとのこと。

rendered="true"になれば内部のXHTMLをレンダリングし、rendered="false"であればレンダリングしない。

```html
<ui:fragment rendered="#{condition}">
  This part may be rendered.
</ui:fragment>
```
unite-tagを利用してジャンプした場合もctrl+tで元位置に戻る方法

# やりたいこと
unite-tagを利用してる場合、公式リポジトリのdocsにある通り、下記を.vimrcに記述することにより\<C-]\>を処理をデフォルトのタグジャンプからunite-tagによる移動に上書くことが出来ます。

```vim:vim.rc
autocmd BufEnter *
\   if empty(&buftype)
\|      nnoremap <buffer> <C-]> :<C-u>UniteWithCursorWord -immediately tag<CR>
\|  endif
```
しかしunite-tagでの移動はタグジャンプではないので、上記でタグジャンプ風に移動したとしてもタグスタックにそれが記録されることはありません。ので、当然**移動後に\<C-t\>を押しても元の場所に帰ることはできない。**悲しい。\<C-t\>で戻りたい。
# やり方
unite-tagはunite経由でジャンプしてるので、タグスタックの代わりに:Unite jumpで元の位置に戻ることが出来ます。というわけで、\<C-t\>の挙動をUnite jumpで上書くことで求める挙動を得ることが出来るハズ。以下を.vimrcに記述することにより心の安寧を得ることが出来ます。

```vim:vim.rc
autocmd BufEnter *
\   if empty(&buftype)
\|      nnoremap <buffer> <C-t> :<C-u>Unite jump<CR>
\|  endif
```

# 参考
同じ様にハマっていた人がいたようで、こちらを参考にさせて頂きました。
https://twitter.com/ShougoMatsu/status/325410410771660800
unite.vimの可能性は無限大とのこと。
Espruinoを買う~LEDを光らせる

```
アドベントカレンダー作ろうと思っていたけど気がついたら12/2になってたので、12/2の記事として投稿しちゃいます
```

# Espruino とは

[Espruino]()は`JavaScript`で制御することができるマイコンボードです。**ArduinoのJS版** と思って頂いて問題ないです。`JavaScript`が書ければハードが制御できちゃう。良い時代になったものです。
詳しくは後々の記事で述べたいと思いますが、「とりあえずJSでハード制御してみる」を実現するには最も簡単で、財布にも優しい選択肢、と言えるボードです。

# LED光らせるまでの流れ

細かいセールスポイントは置いておき、とにかく最初の一歩を踏み出せるよう、購入するところからJSでLEDを光らせるところまでの流れを解説したいと思います。大丈夫です。簡単です。

1. 買う
2. WebIDEインストールする
3. USB繋ぐ
4. `LED1.write(1)`でLEDを光らせる

## 買う

[公式サイトのbuy_now](http://www.espruino.com/Order)に販売しているサイトのリンク一覧があります。
送料も場合によっては結構かかるので複数台、または一緒に遊ぶためのモジュールと一緒に購入するのが良いでしょう。
wifiを使うのであれば[adafruitのCC3000](http://www.adafruit.com/products/1469)がおすすめです。というのも、公式でモジュール化してくれるセンサー類(後々出てきます）は大体秋葉原を彷徨うと手に入りますが、[公式サイトに載っているWifiモジュール](http://www.espruino.com/CC3000)は海外でしか買えないので（現在）、ついでに購入するのには適しているかと思います。adafruitのサイトでEspruinoも購入できるので、こちらでまとめて購入するのも手かと思います。
または[Bluetooth](http://www.espruino.com/Bluetooth)、[BLE](http://www.espruino.com/Bluetooth+BLE)等も買っておくと良いかもしれません。

ちなみに私は[seed studio](http://www.seeedstudio.com/depot/Espruino-board-p-1715.html?cPath=6_12)から単体で購入しました。送料に積む金額によって配送期間が変わります。無料だと２週間程度、30ドル払ったら4日で届きました。

## WebIDEをインストールする

WebIDEはChrome Extentionなので、chromeをインストールした状態で[コチラ](https://chrome.google.com/webstore/detail/espruino-web-ide/bleoifhkdalbjfbobjackfdifdneehpo)よりextentionをインストールします。

## USBを繋ぐ

EspruinoのマイクロUSB端子とPCのUSB端子をつなぎ、WebIDEを立ち上げます。

![image](https://qiita-image-store.s3.amazonaws.com/0/51384/ea4214a0-8840-0fa7-22a6-56fd0a407e30.png)

立ち上がったら左上の接続ボタンを押して、`/dev/tty.usbmodem????? (?????はマシン依存) `を選択します。

こんな画面が出れば成功

![image](https://qiita-image-store.s3.amazonaws.com/0/51384/5a9b6cf0-6d8a-af07-cff5-0f55bf400f27.png)


## `LED1.write(1)`でLEDを光らせる

WebIDEの左側にプログラムを入力することで、対話形式で`Espruino`に命令を送る事ができます。
下記を入力してEnterを押すと、本体についている小さく赤いLEDが点灯します※。

```js
LED1.write(true);
```

![image](https://qiita-image-store.s3.amazonaws.com/0/51384/507d4c18-e8a4-ac09-f22d-9de0f24e2c89.png)


おめでとうございます。とりあえず、これで特に難しい設定もなく、JavaScriptでハードを制御することができました。
１行だけの実行ではなく、複数行のプログラムを書き込んだり、外付けLEDを光らせたり、センサーの情報を読み取ったりというところは、後日の記事にご期待ください。

### エラーが出る場合

エラーが出る場合は残念ながらファームウェアのアップデートが必要です。

#### 手順

* WebIDE右上の歯車アイコンをクリック
* 設定メニューのFLUSHERを選択
* FLUSH FIRMWARE ボタンをクリック
* `Espruino`の`BTN1(USBコネクタから遠い方のボタン)`を押しながら`RSTボタン(USBコネクタ寄りのボタン）'を押す
* ボード上の青色のLEDがゆっくり点滅する
* WebIDEの`NEXT`をクリック
* `/dev/tty.usbmodem??????/`を選択
    * ファームアップロードが始まり、ボード上のLEDが激しく点滅を繰り返します
* 完了後、NEXTボタンを押した後、`RSTボタン`を押す
* 再び接続してLチカのコードを入力

以上です。

# 注意

後々に記事書きますが、EspruinoでCC3000WiFiモジュールを安定して動かすのは、webエンジニア的にはハードルがあります。電源問題への対処、Espruino上での制御の小技みたいな事が必要になるので、高い安定性が求められるシステムを作るにはおすすめできません。動かない事は無いですが。
Bluetooth等でインターネット接続のある親機的なものにセンサー信号を送り、そこからCloudに上げる方が最終的には安定するかもしれません（試行錯誤中です）

とはいえ、CC3000Wifiモジュールを使ってトイレの空き状況監視ツールを運用した事もあるので、ちゃんとケアしてやれば、この程度の用途に対してはちゃんと使えます。ポイントは接続が途切れたらリコネクト、１分に一度死活監視、、等々の仕掛けを入れて、**失敗しても自分で立ち上がる** , **うまく言っていない事を伝える** を徹底することです。後々の記事にご期待。
まずはここから〜helloworld〜


#最初に
##自己紹介
はじめまして、[@Solpha](https://twitter.com/solpha)といいます。

ダラダラと日本社会の波に身を任せていたら、”Around 30”から”Over 30”になってしまっていたので、そろそろ何か始めようとプログラミング学習を思いつきました。

2014年11月時点で、プログラミング経験はほぼ”ゼロ”です。
正確には学生時代に数十時間ほど授業で学んだBASICがありますが、ほぼ覚えていないのでカウントしていません。

###プログラミングを選んだ理由

- ずっと前（10年ぐらい）から興味があった。
- 大変だけど、何か作れたらテンション上がりそう。
- **ボケ防止。**

###学習するうえで役に立ちそうな前提知識

- UNIX系のコマンドはひと通り理解している
- CCNAレベルのネットワーク知識

###主に学習する予定の言語

- Go：新しい言語というだけの理由で選んだ
- Python：プログラム初心者には取っ付き易いとどっかの記事で見た

###PC環境

<pre>
MacBook Pro (Retina, 13-inch, Mid 2014)
- CPU: 2.8GHz Intel Core i5
- Memory: 16GB
- Storage: 128GB
</pre>

###目標

- ちょっとしたルーチンなんかを自動化したい。
- 自分の生活が便利になるようなアプリを作りたい。

#はじめてのGo
やはりまずはここからということで、hellowordを書いてみたいと思います。

##Goのインストール
Go自体は[Golangのダウンロードページ](http://golang.org/dl/)から最新のGo1.3.3（パッケージファイル）をダウンロードして実行し、チュートリアルどおりにすればインストール完了となります。

パッケージからインストールした場合、ファイルは`/usr/local`配下に配置され、自動的にPATHが`/usr/local/go`に通るようになりますが、気持ちが悪い方はtarファイルをダウンロードして展開すれば良いと思われます。

##コード
さて、さっそくgolangの[「How to write Go Code」](http://golang.org/doc/code.html#Command)を見ながらhelloworldを書いてみます。（ディレクトリ構造なんかがあるみたいだけど、とりあえず今は無視）

```helloworld.go
package main

import "fmt"

func main() {
	fmt.Println("hello world.")
}
```

**なるほど、わからん。**

package文で、どのパッケージに属しているかを宣言し、fmtパッケージをインポートすることで「fmt.Println」といったパッケージから関数を呼び出すことができている・・・ふむふむ、日本語でおｋ。

まぁ、とりあえず実行してみましょ。

```
$ go run helloworld.go
hello world.
```

**イィィィィヤッホォォォォォ！！できたー。**

分からない部分が多いけど、現時点ではとりあえず満足。

#所感
packageやimportは、きっとプログラム初心者本でいうところの
**「この部分はオマジナイなので気にしないでくださいね」**
的なものなのでしょうけど、このオマジナイという意味不明な状態を抱えたままスタートするから挫折するのでしょうね。

とりあえず当面は、知識を付けつつひたすらコードを真似たりして覚える路線で、最低週1ペースでQiitaに学習履歴をUPしていきたいと思います。

今後、内容について「何だそのコードm9(^Д^)」って部分も多いかと思いますが、きっと有識者の方はやさしく諭してくれるか、スルーするかのどちらかだと思いますので、あまりイジメないでください。
「ちょっとExcelで解析したいからデータ出して」と言われた時のためのArray#to_tsv


「最近入ってきたユーザーのデータがちょっと欲しいんだけど...」
等と言って、特にエンジニア以外のPMだったりビジネスサイドの人に、Excelで見られるデータを求められることってないですか？

そのくらいお安いご用と言いたいけれど、実際、

- 本番の最新のデータを元に、csvとかxls形式のファイルを吐き出して、ローカルに持ってくるのは意外とめんどい。
- RubyのCSVモジュールがあんまりイケてなくて、`to_csv`みたいに扱えないので、コード書くのも意外とめんどい。

みたいなことがあります。

こんなときに作っておくといいのが、Arrayクラスについた`to_tsv`メソッド。
`to_csv`ではなく`to_tsv`なことがミソ。TSVだとExcelにコピペできます。

```ruby:array.rb
require 'csv'

class Array
  def to_tsv
    CSV.generate(col_sep: "\t") do |csv|
      self.each do |x|
        csv << (x.kind_of?(Enumerable) ? x.map(&:to_s) : [x])
      end
    end
  end
end
```


これさえあれば、
「最近入ってきたユーザーのデータがちょっと欲しいんだけど...」
と言われたら、おもむろにProductionサーバーでコンソールを叩いて、

```bash
irb(main):001:0> puts User.last(100).map(&:attributes).map(&:values).to_tsv
```

とやって出てきた出力をコピーした上で、Excelにペーストするだけ。



ちなみにCSVライブラリを使ってTSVをはいているのは、改行や"が含まれるデータに正しく対応するため。
あまりそういうことを気にせず、`require 'csv'`するのを嫌うんだったら以下のコードでもいいかも。

```ruby:array.rb
class Array
  def to_tsv
    self.map { |x| x.kind_of?(Enumerable) ? x.map(&:to_s).join("\t") : x }.join("\n")
  end
end
```
【PS】カスタムシェイプを追加する方法


##新規ドキュメンを作る
###新規ドキュメントの作り方
こちらを参考に新規ドキュメントを作ってください。
[▶ 新規ドキュメントの作成と保存](http://qiita.com/aalnocomb/items/2d9d837ad1724a88fed3)

##カスタムシェイプを追加する
1.長方形ツールのアイコンを長押し
2.隠れているツールの中からカスタムシェイプを選択
3.オプションバーの黃枠の部分をクリック

![スクリーンショット 2014-12-02 20.38.18.png](https://qiita-image-store.s3.amazonaws.com/0/37178/516314f6-3f2e-d44d-e9d1-e72f4944e325.png "スクリーンショット 2014-12-02 20.38.18.png")
初期段階だとこれっぽっち

4.歯車のアイコンをクリック
5."すべて"を選択

![スクリーンショット 2014-12-02 20.46.20.png](https://qiita-image-store.s3.amazonaws.com/0/37178/40a1422c-c518-e8a4-2e0e-adcdfa534dc0.png "スクリーンショット 2014-12-02 20.46.20.png")

6.最後に"OK"を選択

![スクリーンショット 2014-12-02 20.48.05.png](https://qiita-image-store.s3.amazonaws.com/0/37178/55c9b9db-e9b5-44ae-7d71-b556286daf40.png "スクリーンショット 2014-12-02 20.48.05.png")

##追加されました！
赤丸の部分をドラックするとウィンドウのサイズを調整できます。
大きくしておくと選択しやすい。

![スクリーンショット 2014-12-02 20.53.06.png](https://qiita-image-store.s3.amazonaws.com/0/37178/e79bdc60-f8d9-7044-e6d3-d2bdd34f4de0.png "スクリーンショット 2014-12-02 20.53.06.png")

#ダウンロードしたカスタムシェイプファイルを追加する

今度はWeb上に無料で配布されているカスタムシェイプをPhotoshopで使用できるようにします。

##1.ダウンロードしてきたファイルを移動する
まずは、Finder操作から
カスタムシェイプファイル（.csh）を、アプリケーションフォルダのPhotoshop → Presets → Custom Shapesの中に移動します。

![スクリーンショット 2014-12-02 21.21.18.png](https://qiita-image-store.s3.amazonaws.com/0/37178/339be214-f80a-c61d-eab6-d16b7ee954f3.png "スクリーンショット 2014-12-02 21.21.18.png")

##2.シェイプの読み込みを選択
さっきは"すべて"を選択したところを"シェイプの読み込み"を選択します。

![スクリーンショット 2014-12-02 21.35.47.png](https://qiita-image-store.s3.amazonaws.com/0/37178/fa71d487-acef-3665-6cc2-a45dc0873cca.png "スクリーンショット 2014-12-02 21.35.47.png")

##3.ダウンロードしたファイルを選択
ダウンロードしてきたファイルを選択して"開く"をクリックします。

![スクリーンショット 2014-12-02 21.39.25.png](https://qiita-image-store.s3.amazonaws.com/0/37178/b97e144c-ae41-868a-8d30-d05e0e8b5f63.png "スクリーンショット 2014-12-02 21.39.25.png")

##4.読み込み完了
無事に読み込まれました。

![スクリーンショット 2014-12-02 21.42.54.png](https://qiita-image-store.s3.amazonaws.com/0/37178/b89653d6-b7e0-bc41-ecaf-961ee152cd0c.png "スクリーンショット 2014-12-02 21.42.54.png")

少し面倒ですが、いつでも使えるように読み込んでおくと便利です。
systemd-nspawnのコンテナからホストのUSBデバイスさわる

systemd-nspawnコンテナ内からホストのUSBデバイスに触る方法を調べたので残しておく。

[dockerの例](https://stackoverflow.com/questions/24225647/docker-any-way-to-give-access-to-host-usb-or-serial-device)を参考に、以下のようにbindしたらできた。

```
systemd-nspawn --boot --bind=/dev/bus/usb --directory=/var/lib/container/sample
```

`lsusb` などを叩いて、ホスト側と同じ結果が返ってくればOK。

場合によっては `--boot` ではなく、chroot相当の `--share-system` を使わなければならないこともあるかもしれないが、ひとまずこれだけで問題なかった。
【konashi】konashi.bridge.js 隠れた便利API


[Internet of Things Advent Calendar](http://qiita.com/advent-calendar/2014/iot) 2日目です．
初日は@okameさんの『[ChromeのPackaged AppでArduinoとシリアル通信](http://yume-build.com/blog/archives/369)』でした．
ポクポクカウンター見覚えあると思ったら，MakerFairTokyo2014に出してたんですね…

# konashi とは

[**konashi**](http://konashi.ux-xu.com/)は[ユカイ工学](http://www.ux-xu.com/)さんが開発・販売するBLE（Bluetooth Low Energy）の開発ツールキットです．
ver.2より大幅に値下げされるという嬉しいニュースもありましたね（参考: [フィジカルコンピューティングツールキット「konashi2.0」発売 | fabcross](https://fabcross.jp/news/2014/11/20141128_konashi.html)）．
[konashi-ios-sdk](https://github.com/YUKAI/konashi-ios-sdk)（Androidまだα版）及びiOSでJavaScriptから制御を行う[**konashi-js-sdk**](https://github.com/YUKAI/konashi-js-sdk)が存在し，こちらは[jsdo.it](http://jsdo.it/)との連携も可能です．

[**konashi-js-sdk**](https://github.com/YUKAI/konashi-js-sdk)はJavaScriptになれたエンジニアなら容易に扱うことができ，APIも非常にわかりやすいため電子工作・フィジカルコンピューティング初心者でも気軽に試すことが可能です．

僕も今年，電子工作初心者コンビでkonashiを使い[Mashup Awards 10](http://mashupaward.jp)に出したりしてました．

# konashi-js-sdkの弱点

基本的に[konashi.js](http://konashi.ux-xu.com/kjs/)というアプリ上でWebページを開き，そこでJSからkonashiを制御することになります．
よってChromeなどのブラウザに搭載された**JavaScriptコンソールなどを利用したデバッグが不可能**です．これはつらい．

# 対策

[公式ドキュメント](http://konashi.ux-xu.com/documents/)にも，それっぽい対策は存在しません．これはつらい（2回目）．
しかし，[konashi.bridge.js](https://github.com/YUKAI/konashi-js-sdk/blob/master/js/konashi-bridge.js)（JavaScriptからkonashiを制御するライブラリ）を読んでみるとドキュメントにないAPIも存在していることがわかります．
その中でも，`k#showDebug`（[510行目付近](https://github.com/YUKAI/konashi-js-sdk/blob/master/js/konashi-bridge.js#L510)）と`k#log`（[497行目付近](https://github.com/YUKAI/konashi-js-sdk/blob/master/js/konashi-bridge.js#L497)）という2つのメソッドが実は超便利．

`k#showDebugLog`は画面左上にデバッグ用のログ出力領域を表示します（ネイティブコードからのコールバックとかも表示されるので，ちゃんと通信出来てるかの確認が可能！）．
また，`k#log`は任意の文字列を先ほどの領域先頭に文字を追加していきます．
これでとりあえずJavaScriptコードからのデバッグプリントができるようになります！

# 参考URL

* [konashi - A physical computing toolkit for iPhone, iPod touch and iPad](http://konashi.ux-xu.com/)
Ruby環境の構築

Linux環境でのrubyのインストール方法。
全ユーザで使用できるようにインストールを行う。

# 前提
以下をインストールしておく。
なお、操作は全てrootユーザで行う。

* git

```lang:bash
yum install git
```

* その他

```lang:bash
yum install gcc openssl-devel libyaml-devel readline-devel zlib-devel
```

# rbenvとruby-buildをインストール
```lang:bash
git clone https://github.com/sstephenson/rbenv.git /usr/local/rbenv
git clone https://github.com/sstephenson/ruby-build.git /usr/local/rbenv/plugins/ruby-build
echo 'export RBENV_ROOT="/usr/local/rbenv"' >> /etc/profile.d/rbenv.sh
echo 'PATH="$RBENV_ROOT/bin:$PATH"' >> /etc/profile.d/rbenv.sh
echo 'export PATH' >> /etc/profile.d/rbenv.sh
echo 'eval "$(rbenv init -)"' >> /etc/profile.d/rbenv.sh
source ~/.bash_profile
rbenv --version
```

# Rubyをインストール
インストール可能なRubyのバージョンの一覧を表示する

```lang:bash
rbenv install --list
```

表示されたバージョンから任意のものを選び、以下を実行

```lang:bash
rbenv install 2.1.2  #2.1.2を選んだ場合
```

インストールが完了したら、使用するRubyのバージョンを指定する

```lang:bash
rbenv global 2.1.2  #2.1.2を選んだ場合
rbenv rehash
```

# Bundllerをインストール
```lang:bash
rbenv exec gem install bundler
rbenv rehash
```

# その他
インストール済みのRubyのバージョンを表示する

```lang:bash
rbenv versions
```

ディレクトリ毎にrubyのバージョンを変える

```lang:bash
rbenv local 2.1.2  #2.1.2を選んだ場合
```
家族写真の可聴化について

このエントリーは[家庭を支える技術 Advent Calendar 2014](http://www.adventar.org/calendars/595)の2日目として書かれました。


家族写真は、就業時に家族のことを想起し奮闘する上で重要なツールです。しかしながら、一般的なオフィスにおいては自席以外でくつろいだ姿勢で設計やコーディングを行うことがよくあります。
そういった状況において、家族写真のような家族を可視化するツールを持ち歩くことはあまり現実的ではありませんが、作業に使うコンピューターに家族の声を利用して一定の情報を可聴化するようなツールを導入しておくことで、その機能を代替することができます。
本稿では家族写真を可聴化によって代替するために、私がここ1、2年の間にとっている手法を紹介します。

![](https://31.media.tumblr.com/2aa42953705bba05ecb0844a4be8c363/tumblr_nfs8svs9Cn1qz4e26o1_500.gif)

### 寝た方がいいということを教えてもらう

[もう寝ろよ](https://chrome.google.com/webstore/detail/%E3%82%82%E3%81%86%E5%AF%9D%E3%82%8D%E3%82%88/oebgidoofffgpgmgilokfmmgknlcnklb?hl=ja) というGoogle Chrome Extensionを実装しています。この拡張をインストールした上で、午前0時以降にブラウザで新しいタブを開くと、画面にはもう寝ろよと大書され、ブラウザが奥さんの声でもう寝ろよとつぶやきます。
午前0時を過ぎて仕事をしているときにこれが発動するとそれ以上1mmも仕事をせずに家に帰りたくなるという効果があります。

※ 上記のもう寝ろよは元々[greasemonkeyとして開発されたもの](https://gist.github.com/saneyuki/319600)にインスパイアされて実装したものです。

### 時刻を教えてもらう

[hattori_clock](https://github.com/negipo/hattori_clock) というrubyスクリプトを自動的に起動するようにしています(はっとりは奥さんの旧姓です)。
hattori_clockはその名の通り鳩時計を実装したものです。毎時0分にはその時刻の回数分、また毎時30分には1回奥さんがパッポーと言います。ミーティングなどに大きく遅刻することが少なくなります。
hattori_clockはリビングのテレビにつないであるMacにもインストールしてあるのですが、dアニメストアなどで感動的なシーンが流れるときにもパッポーと繰り返し鳴くので、とても面白いです。

### 合いの手を入れてもらう

[ainote](https://github.com/negipo/ainote) というrubyスクリプトを書いてあります。これはリターンキーを押した時に奥さんが"はいよいしょー"、"どっこいしょー"などと合いの手を入れてくれるアプリケーションです。実装やオペレーションにリズムがついて非常にやる気が出ます(cap deploy"はいどっこいしょー")。
このアプリケーションを公開してすぐに[アイドルソングと合いの手をリミックスしてくれた人がいました](https://soundcloud.com/youpy/liar-re-ndz-remix-with-ainote)。オープンソースっておもしろいですね。

### おわりに

Macが奥さんの声でしゃべると元気が出るということについて紹介しました。ここであげたものの他にも、特定のコマンドの実行終了時などに奥さんが結果をしゃべるものなど、いくつかの実装があります。
僕は僕の他にMacが奥さんの声でしゃべるようになっている開発者を知らないのですが、皆様のご家族が幸せになるためにも、面白いアイデアがあったらどんどん実装して頂ければと思います。

明日、12/3はfugacoさんが書きます。
SparkSQL を YARN 上で動作させる


本日は Hive on Tez の話をしようと思いましたが，[昨日の記事](http://linux.wwing.net/WordPress/?p=1402) の中でも触れられている Spark かつ SQL on Hadoop である SparkSQL on YARN の話に話題を変更してお届けします．

## SparkSQL とは

名前通り，Spark をランタイムとした SQL インタフェースです．デザインの特徴として，SparkDSL との親和性と，Hive の Metastore, SerDe, UDF 互換性が保たれているという点があげられます．SparkSQL のドキュメントとしては，以下のものがあります:

* [SparkSQL](https://spark.apache.org/sql/)
* [Spark SQL Programming Guide](https://spark.apache.org/docs/latest/sql-programming-guide.html)

## Spark on YARN での HiveQL 互換クエリの動かし方

ここからは，Hadoop 2 クラスタを既に持っている方のために，Spark on YARN における Spark の動作のさせ方について説明します．なお，今回の説明ではディストリビューション固有の説明は行いません．

### Spark 側の設定

あなたの利用している Hadoop2 系クラスタが [Spark ダウンロードページ](https://spark.apache.org/downloads.html)に存在しない場合，Spark のソースコードをダウンロードしてきて Spark をビルドする必要があります．例えば，最新版である Hadoop 2.5.2 や 2.6.0 を利用しようとした場合は以下のような手順で Spark をビルドします．

```bash
export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m"
tar xzvf spark-1.1.1.tgz
cd spark
./make-distribution.sh --tgz -Phadoop-2.4 -Pyarn,hive,hive-thriftserver -Dhadoop.version=2.5.2
```

すると，spark-<version>.tgz が生成されるのでこれを解凍し，Spark の設定ファイル(conf/spark-env.sh, conf/spark-defaults.conf)を記述します．この設定ファイルには，Spark 起動時のデフォルトの設定を記述します．

spark-env.sh は，Spark on YARN 起動に必須の設定を行います．特に，HADOOP_CONF_DIR の設定は必須になるので気をつけてください．HADOOP_CONF_DIR は，YARN の設定ファイル(yarn-site.xml)および hdfs の設定ファイル(hdfs-site.xml)がある場所をポイントします．

```spark-env.sh
# Options read in YARN client mode
# - HADOOP_CONF_DIR, to point Spark towards Hadoop configuration files
# - SPARK_EXECUTOR_INSTANCES, Number of workers to start (Default: 2)
# - SPARK_EXECUTOR_CORES, Number of cores for the workers (Default: 1).
# - SPARK_EXECUTOR_MEMORY, Memory per Worker (e.g. 1000M, 2G) (Default: 1G)
# - SPARK_DRIVER_MEMORY, Memory for Master (e.g. 1000M, 2G) (Default: 512 Mb)
# - SPARK_YARN_APP_NAME, The name of your application (Default: Spark)
# - SPARK_YARN_QUEUE, The hadoop queue to use for allocation requests 
# - SPARK_YARN_DIST_FILES, Comma separated list of files to be distributed with the job.
# - SPARK_YARN_DIST_ARCHIVES, Comma separated list of archives to be distributed with the job.
HADOOP_CONF_DIR=/home/ozawa/hadoop/etc/hadoop/
SPARK_EXECUTOR_INSTANCES=16
SPARK_EXECUTOR_MEMORY=4G
SPARK_DRIVER_MEMORY=2G
```

```spark-defaults.conf
spark.serializer                   org.apache.spark.serializer.KryoSerializer
spark.shuffle.manager              SORT
spark.shuffle.consolidateFiles     true
spark.shuffle.spill                true
```

## SparkSQL を起動する

SparkSQL を起動してみましょう．

```bash
$ bin/spark-sql --master yarn-client
```

--master yarn-client を渡すことで，YARN の設定を読み込み，Spark の Application Master が立ち上がります．

```
spark-sql > 
```

SparkSQL 上では，Hive 互換クエリを実行することができます．external table を使ってデータをロードみましょう．

```
spark-sql > create external table if NOT EXISTS text100GB(text string) location 'hdfs:///user/ozawa/text';

```

ここまでで前準備は完了で，この table に対して，HiveQL クエリを実行することができるようになりました．あとは Hive と同じ要領で HiveQL を記述することが可能です．

## SparkSQL の現状

Hive 0.12 ベースで作られていることも影響しているのか，Hive で動くクエリの一部は parse error になったりします．一方で，Hive on Spark という取り組みも行われており，互換性や既存ツールとの統合の面では Hive on SQL に一日の長がありまそうです．
どちらが普及してくるのか，見るのが楽しみな状況にありますので，適宜共有できればと思います．
Kibanaで表示したパス文字列とかをDecodeしたい

termsのテーブルにPathを表示しているとEncodeされているのでDecodeしたい

Textパネルを追加して以下のMarkDownを打ち込む

```
[decode](javascript:$('.terms-legend-term'%29.each(function(i,n%29{if(n.innerHTML%29{n.innerHTML=decodeURI(n.innerHTML%29}}%29;void(0%29;)
```


decodeをクリックするとDecodeされて幸せになれます
泥酔中にスカイプしたくなったら使うツール作る

　クソみたいな話に付き合ってくれそうな友達がいないので作ることにした。新奇や集客はそこまで望んでない。とりあえず作る。

**使える言語**
・日本語
**どんなものにしたいか**
・見た目は掲示板のようなもの
・skypeID、状態（現在のアルコール摂取量）などを記入して投稿
・リアルタイムで閲覧可能（更新ボタン押さなくても勝手に反映される）
・投稿した内容はツール（ページでも可）を開いている限り、第三者からも見ることができる。
・投稿者がログアウト（ページを閉じる）したら投稿は消える。
**たぶん詰まるところ**
　掲示板みたいなインターフェース（？）なら調べればできるだろうからそれはいいが、リアルタイムで閲覧可能な機能を付与させるあたりで困る事になりそう。なにせ私は第三次近衛内閣で忙しくとてもプログラミングの勉強などしているヒマはなかったのだ。ラムゼイ機関のリヒャルト・ゾルゲに頼んで人力監視でも解決するが、彼は忙しいだろうからこれは却下とする。
　あと、どの言語を優先させるべきかがわからない。例えば、ハローワールドとだけ書きたい場合、何で書けば良いのか。htmlがメモリ食わなさそうなイメージなんだが。うんこ三日出てない
Couchbase3.0を3.0分でインストールしてみる

![01.PNG](https://qiita-image-store.s3.amazonaws.com/0/53823/0804a256-2e2b-8bdc-e179-21edc3d48b8f.png)

訳あって、Couchbaseを検証する必要があり、まずはインストール。


##事前準備
* サーバー（さくらVPS）

##インストールパッケージ
* 今回はコミュニティエディションを使います
* [Couchbase公式](http://www.couchbase.com/nosql-databases/downloads#Couchbase_Server) から、rpmをダウンロード

##インストール
1．ダウンロードしたrpmを、/var/tmpなどにアップロードします

`couchbase-server-community-3.0.1-centos6.x86_64.rpm`

2．root権限で以下のコマンドを実行

`sudo rpm --install couchbase-server-community-3.0.1-centos6.x86_64.rpm`

3．インストール実行後に起動されます

    # rpm --install couchbase-server-community-3.0.1-centos6.x86_64.rpm
    Warning: Transparent hugepages may be used. To disable the usage
    of transparent hugepages, set the kernel settings at runtime with
    echo never > /sys/kernel/mm/transparent_hugepage/enabled
    Warning: Transparent hugepages may be used. To disable the usage
    of transparent hugepages, set the kernel settings at runtime with
    echo never > /sys/kernel/mm/redhat_transparent_hugepage/enabled
    Warning: Swappiness is not 0.
    You can set the swappiness at runtime with
    sysctl vm.swappiness=0
    Minimum RAM required  : 4 GB
    System RAM configured : 0.97 GB
    
    Minimum number of processors required : 4 cores
    Number of processors on the system    : 2 cores
    
    Starting couchbase-server/usr/bin/dirname: extra operand `2>&1.pid'
    詳しくは `/usr/bin/dirname --help' を実行して下さい.
    [  OK  ]
    
    You have successfully installed Couchbase Server.
    Please browse to http://<ip-address>:8091/ to configure your server.
    Please refer to http://couchbase.com for additional resources.
    
    Please note that you have to update your firewall configuration to
    allow connections to the following ports: 11211, 11210, 11209, 4369,
    8091, 8092, 18091, 18092, 11214, 11215 and from 21100 to 21299.
    
    By using this software you agree to the End User License Agreement.
    See /opt/couchbase/LICENSE.txt.

4．セットアップ

`http://<ip-address>:8091/` にブラウザからアクセスして、ウィザード形式で必要な情報を入力していく

![02.PNG](https://qiita-image-store.s3.amazonaws.com/0/53823/62b295db-ec7b-04c3-3ac0-b005e18c95ec.png)

5．おしまい

##参考情報
これじゃああんまりなので、参考にさせていただいたブログをば

* [俺でもできるシリーズCouchbase Server 3.0 Cluster Nodeの登録とXDCRの設定 - boku no blog](
http://buta9999.hatenablog.jp/entry/2014/10/27/212144)

##次回
node.jsからデータを投入してみます
AtomのAPIドキュメントの場所について（小ネタ）

atom.ioには[API Documentationページ](https://atom.io/docs/api/latest/Atom)があり、[Documentationページ](https://atom.io/docs/latest/)からアクセスできるのですが、そのリンクの場所が見つけづらかったという小話です。

![Atom.png](https://qiita-image-store.s3.amazonaws.com/0/7118/26c4a972-5a74-2ca7-b19e-c94ad03a4bb0.png)

.

.

.

ここですね。

![Atom 2.png](https://qiita-image-store.s3.amazonaws.com/0/7118/e6490d92-2694-8b3f-3aec-d0fde86cbf14.png)

このサイズで見ると比較的分かりやすいですが、左から下に目線が行ってしまうので、こういうデザインは良くないよなぁと思いました。

…どうでもいいネタですみませんでした(´・ω・`)

（Packageの作リ方的なネタはあるので余裕があれば書きます。）
0から始めるAWS入門：概要

# 概要
研修向け。0からAWS上に基本的なWEBアプリケーションの環境構築していく。

## 前提
・一般的なLAMPのWEBアプリケーション向け(※1)に環境を構築しますが、それらミドルウェアのインストール・設定等はあまり対象にしてません。

・すでにAWSのアカウントを取得しているものとします。[サインアップはこちら](http://aws.amazon.com/jp/)
ちなみに、新規登録であれば無料枠があるため、この研修向け内容をやったとしても$3ぐらいに収まります。


※1 アプリケーションの要件・内容には触れませが、一般的なLAMPアプリケーションでも同様になるかと思います。

# 構築する環境
今回のシリーズで目指す環境は、下記の通り。

![AWS Design.png](https://qiita-image-store.s3.amazonaws.com/0/34930/86774423-12a6-0ef7-d86b-b7a6803c3e38.png)


## 簡単に各AWSサービス紹介
### Elastic Compute Cloud (EC2)
一般的に言う仮想サーバー。スケーラブルに展開可能。
今回はここにアプリケーションを配置する。
[詳細はこちら](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/concepts.html)

### Relational Database Service (RDS)
データベースを提供するサービス。セットアップ、運用、およびスケーリングを容易に行える。
対応RDSは、MySQL、Oracle、Microsoft SQL Server、PostgreSQL。
ちなみに最近[Amazon Aurora](http://aws.amazon.com/jp/rds/aurora/)というAmazonがクラウドに最適化したMysql互換のプレビュー版もでた。

[詳細はこちら](http://aws.amazon.com/jp/rds/)

### Elastic Load Balancing (ELB)
ロードバランサー。EC2インスタンス間で、トラフィックの負荷を自動的に分散、耐障害性を高める。

[詳細はこちら](http://aws.amazon.com/jp/elasticloadbalancing/)

### Virtual Private Cloud (VPC)
AWSクラウド上に論理的に分離されたプライベートなネットワークを構築できるサービス。

[詳細はこちら](http://aws.amazon.com/jp/vpc/)

# 次回
[0から始めるAWS入門①：VPC編](http://qiita.com/hiroshik1985/items/9de2dd02c9c2f6911f3b)
pepperめも_07:ペッパーのタブレット用のHTMLテンプレート

#ペッパーのタブレット用のHTMLテンプレート
ペッパーのタブレット用のHTMLテンプレートを作ってみました。
画面サイズとか調べたけどよくわからなかったのですが、結局1280x800で作りました。

※旧型ペッパー用です。新型には対応していません＞＜

#Bootstrapを使用
Bootstrap v3.2.0
http://getbootstrap.com
を使用しています。

#Sketch3用のテンプレートファイル付き
Sketch3
https://github.com/tonosamart/Pepper-HTML01
用のテンプレートファイルを用意しました。

Mac用のソフトになりますが、画面デザインが簡単にできて便利です。
まだ使ったことない人は使ってみてください！有料だけど！

#Sketch3のテンプレートの設定方法
File→New From Template→Reveal in Finder
を選択すると、ファインダーが開くので、 pepper_html01.sketch をコピーして
アプリを再起動すれば、テンプレートに追加されます。

![スクリーンショット.png](https://qiita-image-store.s3.amazonaws.com/0/40994/3bc7726d-abc8-bc24-a0ee-5bcad30fac63.png)
※追加前

#２６種類のテンプレートを用意しました！
YES/NO、○✕、四択、時計など、色々なテンプレートを用意しました。
HTMLファイルも、もちろん用意されているし、
構造もシンプルなので簡単に実装できると思います！
![スクリーンショット.png](https://qiita-image-store.s3.amazonaws.com/0/40994/9087e4b8-4a47-16de-3a34-5f5e5c480573.png)

#サンプルプログラムを用意しました！
そのまま実行すれば、index.htmlが表示されます。
まずは実機で試してみてください！
![スクリーンショット.png](https://qiita-image-store.s3.amazonaws.com/0/40994/e1b3c294-0953-53d3-749f-da0f448881a4.png)
ShowLocalHtmlというボックスを新たに作成しています。
HTMLフォルダ内のhtmlファイルをタブレットに表示するボックスです。

#HTMLファイル
サンプルプログラム内のhtmlフォルダの中にいれてあります。
![スクリーンショット.png](https://qiita-image-store.s3.amazonaws.com/0/40994/5263c280-e071-c839-6538-88e445f3371a.png)

#ためしてみよう！
こんな感じで、全パターンを簡単に試せます！

![スクリーンショット.png](https://qiita-image-store.s3.amazonaws.com/0/40994/11423db3-6f45-32d5-7e11-38f6e98cd890.png)
※右下のこのイラストだけ著作権フリーじゃないよ！

#利用規約

```
Pepper（ペッパー）用ソフトウェアの開発であれば、
商用利用を含め、著作権表記なしでご自由にご利用できます。
※とのさまラボのイラスト(tolemo.png）を除きます。
```

著作権表記いらないのでご自由に！

#ダウンロードしよう！
gitにおいてあるのでダウンロードしてみてください！
https://github.com/tonosamart/Pepper-HTML01

#おしまい
以上、ペッパーのタブレット用のHTMLテンプレートでした！

この記事は、

Pepper Advent Calendar 2014 ３日目
http://qiita.com/advent-calendar/2014/pepper

Sketch 3 Advent Calendar 2014 ４日目
http://www.adventar.org/calendars/347

にエントリーしています。

Pepper Advent Calendar 2014 の次の投稿は、
フリーランスのソフトウェア開発やってる yacchin1205 さんの記事になります！

Sketch 3 Advent Calendar 2014 の次の投稿は、
そこら辺の高校生 p1ch_jp さんの記事になります！

SketchToolboxでプラグイン管理する
http://chiraura.me/plugins-manage-at-sketchtoolbox/

わいわい！
Adobe AIR の SQLite データサイズ最適化

##概要
Adobe AIR では、SQLite が扱えます。
DB データ容量が増えた後にデータ削除してもデータファイルサイズは減りません。（バグではなく仕様です。）
これを明示的にデータ容量を最適化する方法です。
SQLite のコマンドとしては、`VACUUM` というものがあるようなのですが、それは使えなかったので。

##コード

SQLConnection に `compact` というメソッドがあるので、使用します。以下のような感じ。

```as3:as3
var dbfile:File = File.documentsDirectory.resolvePath("data.db");
var conn = new SQLConnection();
conn.open(dbfile);

//容量最適化
conn.compact();
```
bootstrapよりかっこいい? Foundationを導入する

[CSS Advent Calendar 2014](http://qiita.com/advent-calendar/2014/css) 三日目です。偉大な@izumin5210先輩の後に書く事になってしまいとても緊張しています。

bootstrapは良いものです。デザイナーじゃなくてもそれっぽいデザインができるし、日本語の情報も豊富だし、公式ドキュメントもとてもわかりやすい。

ただ、あまりにもたくさんの人が使うので、bootstrapを使うだけでは「またbootstrapか…」と思われるようになってしまいました。

もちろん、bootstrapだって考えて使えば良いデザインは出来ますが、当然その分手間はかかります。

ということで、bootstrapよりも手間をかけずに、bootstrapよりもかっこいいサイトが作れるCSSフレームワークである[Foundation](http://foundation.zurb.com/)を紹介したいと思います。

# 特徴

## 良い所

- 適当に作ってもbootstrapっぽいデザインにならない(当たり前ですが)

- 公式ドキュメントがわかりやすい

- railsと組み合わせて使いやすい(後述)

## 悪いところ

- bootstrapと同様かなり大きい

- 日本語の資料はbootstrapより少なめ

# 導入

See [Foundation Docs](http://foundation.zurb.com/docs/index.html)

ぶっちゃけこれで十分なんですが、それではあまりに手抜きなので軽く解説します。

## 静的サイト

公式サイトにzipがあるのでダウンロードして適当に配置します。

または、以下のようにCDNを使うことも可能。

~~~html
<link rel="stylesheet" href="http://cdn.foundation5.zurb.com/foundation.css" />
<script src="http://cdn.foundation5.zurb.com/foundation.js"></script>
~~~
 
## Ruby on Rails

foundation-railsというgemがあるのでそれを使います。

Gemfileに追加してインストールしたら、下記のコマンドで色々置き換えてくれます。

~~~
rails g foundation:install
~~~

foundation_and_overrides.scssに色の設定などの定義があるので、簡単なカスタマイズならそこから行えます。

# 使い方

bootstrapと同じく、[公式ドキュメント](http://foundation.zurb.com/docs/)が非常に読みやすいので一度読んでみることをおすすめします。

# 改めてbootstrapと比較

- 現状では細かい違いはあるものの、全体としての優劣はほぼない

- レスポンシブにするならFoundationのほうがやりやすいイメージ

- カスタマイズもFoundationのほうがやりやすい気がします

- 私がFoundation好きなのでFoundationの長所ばかり書いているが、bootstrapが劣っているというわけではない

- 結局好み

# まとめ

身も蓋もないですが、結局好みだと思います(タイトルはFoundationの方がかっこいいって書いてますが、私の好みだからというだけです)。

明日はbootstrapやFoundationのような重量級のフレームワークとは一味違う、軽量フレームワークについて紹介したいと思います。

# 参考

- [Foundation | The Most Advanced Responsive Front-end Framework from ZURB](http://foundation.zurb.com/)

- [Bootstrap · The world's most popular mobile-first and responsive front-end framework.](http://getbootstrap.com/)
vpandd 

SSEのpand, AVXのvpandとほぼ同じで長さが512bitになりました。


512bit内の各bitの論理積をとります。


対応するintrinsicsは、\_mm512_and_epi32 です。

```cpp
#include <immintrin.h>
#include <stdio.h>

int in0[16] = {~0,~0,~0,~0,
               ~0,~0,~0,~0,
               ~0,~0,~0,~0,
               ~0,~0,~0,~0};

int and_bits[16] = {0xaaaaaaaa,
                    0x55555555,
                    0xaaaaaaaa,
                    0x55555555,
                    0xaaaaaaaa,
                    0x55555555,
                    0xaaaaaaaa,
                    0x55555555,
                    0xaaaaaaaa,
                    0x55555555,
                    0xaaaaaaaa,
                    0x55555555,
                    0xaaaaaaaa,
                    0x55555555,
                    0xaaaaaaaa,
                    0x55555555};

int out[16];

int
main()
{
    __m512i a;
    __m512i b;
    __m512i c;
    int i;

    a = _mm512_loadu_si512(in0);
    b = _mm512_loadu_si512(and_bits);

    c = _mm512_and_epi32(a, b);

    _mm512_storeu_si512(out, c);

    for (i=0; i<16; i++) {
        printf("%2d:%08x\n", i, out[i]);
    }
}
```

```
 $ gcc -mavx512f vpand.cpp
 $ sde -skx -- ./a.out
 0:aaaaaaaa
 1:55555555
 2:aaaaaaaa
 3:55555555
 4:aaaaaaaa
 5:55555555
 6:aaaaaaaa
 7:55555555
 8:aaaaaaaa
 9:55555555
10:aaaaaaaa
11:55555555
12:aaaaaaaa
13:55555555
14:aaaaaaaa
15:55555555
```
SSE, AVXでは、\_mm_and_si128(pand), \_mm256_and_si256(vpand) のように、全bitの論理積を取る命令しかなく、不便な場合がたくさんありましたが、AVX512になって、これが、\_mm512_and_epi32(vpandd) と \_mm512_and_epi64(vpandq) に分かれ、32bit内の各bitの論理積、64bit内の各bitの論理積を取れるようになり、大変便利になりました。


次回、@tanakmura が vpandd の補足を書きます(何を補足するか予測できるぐらいちゃんと読んでる人がいたらありがとうございます)
Java におけるシングルクォーテーションとダブルクォーテーションの使い分け


## 文字リテラルと文字列リテラル

単純にシングルクォーテーションは文字リテラル、ダブルクォーテーションは文字列リテラルを表現する場合に用いる。

|シングルクォーテーション|ダブルクォーテーション   |
|:------------------:|:----------:|
|文字リテラル|文字列リテラル|

## リテラルとは？
余談。

>
コンピュータプログラムのソースコードなどで、特定のデータ型による値を直接表記する際の書式。また、そのような書式に従って記載された値。
>
表記の仕方によってデータ型を識別できるよう、例えば文字列を表記する際は必ず前後を「"」で括る、といった書式が言語仕様によって定められている。各データ型のリテラルを、型名を先頭につけて「文字列リテラル」「整数リテラル」「日付リテラル」などと呼ぶ。

>
[リテラルとは 【 literal 】 - 意味/解説/説明/定義 ： IT用語辞典](http://e-words.jp/w/E383AAE38386E383A9E383AB.html)


つまり簡単に言うと「文字リテラル」、「文字列リテラル」とは、クォーテーションで囲まないと扱えないような文字、文字列のことだと思えばよい。
rails4 + unicorn + nginx

#rails

基本的にはhttp://qiita.com/a_ishidaaa/items/74de8bdaecd637063c40 と同様に、production環境を準備する。一点、config/enviroments/production.rbのアセットの提供設定はfalseにする。nginxがやってくれる。

```ruby:config/enviroments/production.rb
# Disable Rails's static asset server (Apache or nginx will already do this).
  config.serve_static_assets = false  
```

#unicorn
##インストール

Gemfileにunicornを追記

```ruby:Gemfile

gem 'unicorn'

```

bundle install を実施

```bash
$bundle install
```
##設定ファイル作成

config/unicorn.rbに設定を追記

```ruby:config/unicorn.rb

@app_path = '/home/rails/rails/test/json_server'

worker_processes 2
working_directory "#{@app_path}/"
preload_app true
timeout 30
listen "/tmp/unicorn.sock", :backlog => 64
pid "/tmp/unicorn.pid"
stderr_path "#{@app_path}/log/unicorn.stderr.log"
stdout_path "#{@app_path}/log/unicorn.stdout.log"

before_fork do |server, worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect!
  old_pid = "#{server.config[:pid]}.oldbin"
 
  if old_pid != server.pid
    begin
      sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
      Process.kill(sig, File.read(old_pid).to_i)
    rescue Errno::ENOENT, Errno::ESRCH
    end
  end
  sleep 1
end

after_fork do |server, worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection
end

```

##unicornプロセス起動

```
$JSON_SERVER_DATABASE_PASSWORD=password bundle exec unicorn_rails -c config/unicorn.rb -E production -D
```

#nginx

##インストール

```
sudo yum install nginx

```

##設定ファイル作成

/etc/nginx/conf.d/myapp.confにnginx用のコンフィグ追記

```nginx:etc/nginx/conf.d/myapp.conf

upstream unicorn_server {
    # This is the socket we configured in unicorn.rb
    server unix:/tmp/unicorn.sock
    fail_timeout=0;
}

server {
    listen 80;
    client_max_body_size 4G;
    server_name _;

    keepalive_timeout 5;

    root /home/rails/rails/test/json_server/public;

    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;

        # If you don't find the filename in the static files
        # Then request it from the unicorn server
        if (!-f $request_filename) {
            proxy_pass http://unicorn_server;
            break;
        }
    }

    error_page 500 502 503 504 /500.html;
    location = /500.html {
        root /home/rails/rails/test/json_server/public;
    }
}


```

##nginxの起動

```
$sudo /etc/rc.d/init.d/nginx start

```
ClojureScriptでJQueryを使うサンプル

dommyやdominaを使ってもJQuery的なことはできそうだけど、JQueryのカスタムイベントのハンドリングができないっぽいのが残念。
なので、仕方なくJQueryをClojureScriptから直接使うことにする。

JQueryを軽くラップするjayqというライブラリもあるけど、引数の省略方法までは同じにできてないっぽいので不便

下はBootstrap Form Helpersを使った例

```:html
<input id="sample-text" class="form-control" type="text">
<div id="sample-select" class="bfh-selectbox">
  <div data-value="1" style="display:none">item1</div>
  <div data-value="2" style="display:none">item2</div>
</div>
```

```:cljs
(js/$
 (fn []
   (.. (js/$ "#sample-text") (on "change" #(js/alert (.. % -target -value))))
   (.. (js/$ "#sample-select") (on "change.bfhselectbox" #(js/alert "abc")))))
```

まあ直接使ってもそんなに不便ではないかも