OmniAICreator/Qiita-1.07M huggingface dataset:
検索してファイルを消す時に高速に行う方法



「プロフェッショナル　イチロースペシャル」を見て
真っすぐに自分と向き合う姿にホレた千葉です。

今日は、あるファイルを検索して消す時に、高速になる方法です。


##find + xargs = 高速

**速い**

`find /XXXX/XXXX/*.txt -type f | xargs rm -rf`

**遅い**

`find /XXXX/XXXX/*.txt -type f -exec rm -rf {} ¥;`


消すファイル数が多ければ多い程、xargsを使った方が速い。
なぜなら、
「-exec」を使用すると、内部的には見つけたファイルに対して毎回rmを行う。
「xargs」を使用すると、内部的にはコマンド１発で終了。


例えば、
****
###「-exec」
    find /XXXX/XXXX/*.txt -type f -exec rm -rf {} ¥;

 は、内部的にはこう

     rm aaa.txt
     rm bbb.txt
     rm ccc.txt
     rm ddd.txt

***
### 「xargs」
    find /XXXX/XXXX/*.txt -type f | xargs rm -rf

 は、内部的にはこう

    rm -rf aaa.txt bbb.txt ccc.txt ddd.txt

コマンド一発で終わるか、沢山コマンドを発行するかの違い。

これが、100万ファイルが対象だった場合はかなりの時間差になる。
xargsコマンドは、かなり便利なので覚えておくと特をすると思います。
他にもxargsは色々使えます。標準出力をコマンドに渡せるので。

現場でもよく使います。
次は、色々な使えるxargsの記事でも書いてみます。

以上！！
Emacs の migemo が不審な挙動をしたとき

今まで普通に使えてたのに，突然 migemo の挙動がおかしくなった人，もしかしてキャッシュを使う設定書いてたりしませんか？こんなやつ．

```common-lisp
(setq migemo-use-pattern-alist t)
(setq migemo-use-frequent-pattern-alist t)
(setq migemo-pattern-alist-length 1024)
```

まれにキャッシュが原因で migemo がおかしくなることがあります．

これが直接の問題でなくても，migemo の設定を見直す場合はとりあえずこの記述をコメントアウトしておきましょう．念のため．
「プログラマのためのSQL」トランザクションと同時実行制御


# ACID属性
1. Atomicity
1. Consitency
1. Isolation
1. Durability

## Atomicity(原子性)
* トランザクション内の複数の処理について、すべてが作用するか、全てが作用しないか
* ただ100万行のInsertなどを実行するときには```SAVEPOINT```構文を利用できる(SQL:2006)

## Consitency(一貫性)
* トランザクションが開始された時と、終了された時、データベースはデータ整合性制約、参照整合性制約などのすべてが満たされている状態にある

## Isolation(独立性)
* あるトランザクションは他のトランザクションに影響を受けないこと
* これを実現するために同時実行制御などをしなければいけない

## Durability(耐久性)
* ロギングとバックアップ

# 同時実行制御
* ACID属性が保たれなくなる状況
	1. ダーティライト
	 * T1がAを変更、T1をコミットする前にT2がAを変更。その後T1もしくはT2がロールバックすると、どの値に戻せばいいかわからなくなる
	1. ダーティリード
		* T1がAを変更、T1がコミット/ロールバックする前にT2がAを読み出し、その後T1がロールバックするとT2が読んだAのあたいがは存在しなくなる。
	1. 反復不可能読み取り(ファジーリード)
		* T1がAを読み取る。T1がAをコミット・ロールバックする前にT2がAを読み込んで変更し、コミットすると、T1が読み込んだはずのAがどこにもいなくなっている
	1. ファントム
		* T1が条件Aに合致した行を読み込む。T2が条件Aに合致するような行を複数```insert```するとT1の条件に合致しているのに読み込まれない行が存在する
	1. 失われた更新
		* T1がAを読み込む。T2がAを更新する(A'になる)。T1がAに基づいた更新を行いA''にすると、T2で行った更新が失われてしまう。

* [分離レベル](http://ja.wikipedia.org/wiki/%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B6%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E5%88%86%E9%9B%A2%E3%83%AC%E3%83%99%E3%83%AB)
	* これまでの状況を回避するためにセッションにどれくらいの一貫性で実行できるかを定めたもの

# 最後に
* 実行制御や独自のトランザクション処理は本来はSQLを利用するアプリケーションでは意識しなくてもいいかもしれない。ただ、水面下で何が行われているかを知っておくことは重要だ
ポーカー、ポーカーの残り＋(2012.6.22、2013.4.19の過去問)


メリークリスマス！ 1日1個 @nabetani さんの作った問題を解くAdventCalendarの最終目です。最後なので2つ解いちゃいましょう！

一問目は http://qiita.com/Nabetani/items/cbc3af152ee3f50a822f です。今日はピックアップされている中で一番古い問題に挑戦します。

```hs
module Doukaku.Poker (solve) where
import Data.List.Split (splitWhen)
import Data.List (sort, group)

solve :: String -> String
solve = decide . sort . map length . group . sort . parse
  where
    decide [1,4] = "4K"
    decide [2,3] = "FH"
    decide [1,1,3] = "3K"
    decide [1,2,2] = "2P"
    decide [1,1,1,2] = "1P"
    decide _ = "--"

parse :: String -> [String]
parse = tail . splitWhen (`elem` "SHDC")
```

スートは無視してオッケーなので、簡単ですね。`group`関数を使ったお陰で大変シンプルになりました。スートはパース時に捨てています。

そして、二問目は http://qiita.com/Nabetani/items/d819d1e5f2378317511e です。一問目の続編です。

```hs
module Doukaku.Poker2013 (solve) where
import Data.List (sort, group, tails)
import Data.Char (intToDigit)

solve :: String -> String
solve input
  | 'T' `elem` (map fst cards) && 'A' `elem` (map fst cards) &&
                               samesuit cards == 5 && ordered cards == 5 = "RF"
  | samesuit cards == 5 && ordered cards == 5 = "SF"
  | samesuit cards == 5 = "FL"
  | ordered cards == 5 = "ST"
  | any (\cs -> samesuit cs == 4 && ordered cs == 4) card4s = "4SF"
  | samesuit cards == 4 = "4F"
  | ordered cards == 4 = "4S"
  | otherwise = "-"
  where
    card4s = map (\c -> filter (/= c) cards) cards
    cards = parse input
    samesuit, ordered :: [(Char, Char)] -> Int
    samesuit = maximum . map length . group . sort . map snd
    ordered hs = maximum . map (contains (map fst hs)) . tails $ numberorder
    contains _ [] = 0
    contains hs (x:xs)
      | x `elem` hs = 1 + contains hs xs
      | otherwise = 0

parse :: String -> [(Char, Char)]
parse ('1':'0':s:cs) = ('T', s) : parse cs
parse (n:s:cs) = (n, s) : parse cs
parse _ = []

numberorder :: [Char]
numberorder = 'A' : map intToDigit [2 .. 9] ++ "TJQKA"
```

連番とスートを判定しなければいけないため。一問目とは全く趣が異なる問題に仕上がっています。`ordered`と`samesuite`で
連番とスートの枚数を判定し、これを使って判断する戦略を取りました。が、これだと`"4SF"`だけうまく判断できません。
連番の4枚と同じスートの4枚が別の組かもしれないためです。なので、急遽`card4s`を用意することになり、旨みがなくなってしまいました。

このAdvent Calendarで作ったソースコードは、すべて https://github.com/hiratara/doukaku-past-questions-advent-2013 にアップしてあります。
Travis CIでのテストは https://travis-ci.org/hiratara/doukaku-past-questions-advent-2013 に。
今回は試しに `detailed-0.9` でテストを書いてみてハマった点もあったのですが、その話はまたの機会に。
ゲーム制作完成報告( *｀ω´)

#タイトル発表

タイトルが決定したので発表します。
タイトルは<h3>「ラクガキしーけんす！」</h3>です。
らくがきっぽいキャラクターが連なっているイメージからのネーミングです。

![タイトルロゴ.png](https://qiita-image-store.s3.amazonaws.com/0/32926/c29f1372-7068-43bd-c519-8108379a93ab.png)


#画像大革命

画像を **全て** 差し替えました。
描いてくれたのはまいしすたーです。
提出一週間前に頼んだのにありがたい限り。＞＜
モノクロでらくがきっぽい感じをテーマにしています。

#移動方法改造

移動方法をかえました。

以前から、動作が安定せず、ピッタリの位置でこどもがついてきてくれないことがありました。
試行錯誤の結果、おそらくあまりに重い処理をいれると、処理落ちか何かでずれてしまうことがあることがわかりました。

初期仕様では、キューに進行角度を入れ、次の要素に渡していたのですが、
新使用では、処理落ちなどがあってもズレが生じないように、座標を直接キューで管理することにしました。
この方法では、8フレーム前のひとつ前の要素の「位置」に次の要素が移動するようになります。

ただし、方向によって画像の表示を変化させるために、
進行角度のキューは維持します。

#ゲームオーバー画面

ゲーム画面と、リザルト画面のあいだに挟むゲームオーバー画面を追加実装しました。
技術的には新しいことはしていません。
カウントダウン画面の応用です。
試しに動かしてみたら思ったよりもいい動きをして良かったです。

#キャラクター表示調整

画像の変更に伴いキャラクター表示の調整を行いました。
ひとつまえの段階ではキャラクター表示は8方向だったのですが、
4方向に変更しました。
また、方向数を減らしたかわりに、走っているような動きをするようになりました。
これは、右足が前の画像と、左足が前の画像を用意し、順番に表示することで作成しています。

また、成長段階にも変更があり、6段階になりました。

#大人キャラクターについて
大人キャラクターの表示を大きく変更しました。
大人キャラクターとは成長の最終段階のキャラクターのことです。

前段階では、キャラクターは全て一律おなじ見た目をしていました。
今回の実装でキャラクターの見た目にバリエーションをつけました。
全部で **648通り** です。

これは、あらかじめ体、アクセサリー、メガネ、髪、表情、目のそれぞれに分けて素材を作成してもらい、
プログラム中で乱数を使用して動的に合成し、新キャラクターシートを作成することで実現しています。

画像の合成にはSurfaceクラスを使用します。
Surfaceクラスにはdrawという関数が用意されていて、
この関数に画像を与えることで、Surfaceにその画像を描くことができます。
この関数は繰り返し使用することで、既に描かれている絵の上にさらに画像を描いてくれます。

この関数を使用して、正しい順番に画像を重ね合わせることで、
Surfaceの内部に一枚のキャラクターシートが完成します。
SurfaceはSpriteのimageとして使用できるため、
このSurfaceをキャラクターに渡します。

#ステータス画面仕様大幅変更

ステータス画面は以前はクッキーが落ちてきてストックされていき成長した時点でしたに落ちていくという仕様でした。
今回の変更で、このあたりのエフェクトが変化しています。

##たまご
たまご型のエネルギーゲージのようなものを実装しました。
お菓子をたべるとエネルギーゲージのゲージが上昇します。
成長した時点でエネルギーゲージは最低値まで減少し、ふたたび上昇を開始します。

###うごく
このゲージは一定周期で左右に揺れます。
これは、5枚の絵を使用してパラパラ漫画を作成しています。

###ゲージ
ゲージは、枠と、内容液の二つの画像から構成されます。
枠はゲージの部分だけ透明になっています。
この透明部から内容液の画像を覗かせます。
内容液の画像には水面を描き、
内容液の画像が上下に移動することで、エネルギーの増減を表します。

##お菓子吸収
お菓子が内容液に沈んだ時点で消えるようにしました。
もとのコードの大幅な変更を防ぐために、
もとの移動アルゴリズムはできるだけ活かす方針で実装を行いました。

これは、お菓子のy座標を監視し、毎フレーム水面の座標を比較することで実装しています。

##エフェクト
お菓子が消えるときに、きらきらのエフェクトが発生するようにしました。
このエフェクトは、クラス定義しました。
コンストラクタを呼び出すだけで、エフェクトが発生し、その後自動でシーンから消去されるようにしました。
この仕様によってエフェクトを変数によって管理する必要がなくなります。

#ポーズ画面にアニメーション
ポーズ画面にアニメーションを追加しました。
こちらに関しても、カウントダウン画面の応用です。

#スタート方法
スタート画面からの遷移をスペースによって行うようにしました。
スペースをボタンとして認識させるには、
スペースをボタンとして登録する必要があります。
その後、ボタンのイベントリスナーとして動作を定義します。

登録は次のように行います。
game.keybind(32,"space");

#エフェクト
敵に攻撃されたときと、敵に攻撃した時にエフェクトを表示するようにしました。
このエフェクトはお菓子の消えるエフェクトのアルゴリズムと同様のアルゴリズムを使用しています。

しかし、こちらのエフェクトでは、
コンストラクタ使用時に指定する座標を中心とした円状にエフェクトが発生するようにしています。
これは、中心からの距離と角度を乱数によって指定し、
得られた値によって表示する場所を変更することで実現しています。

エフェクトは発生後、徐々に大きくなりつつ、透明度を高くし、
完全に消えた時点でシーンから削除します。

#完成品
[ゲームのページにジャンプします。](https://dl.dropboxusercontent.com/u/35809589/SnakeGame/index.html)
操作方法は移動後のページをご参照ください。

#ソースコード
[GItHubで確認することができます。](https://github.com/picoslime/SnakeGame/tree/master/SnakeGameGirl)
Knockout.jsでチェックボックスを攻める

knockout.jsというJavaScriptフレームワークがあります。フレームワークというより、HTMLで

```html
<p>First name: <input data-bind="value: firstName" /></p>
```

と書いて、JavaScriptで

```js
function AppViewModel() {
    this.firstName = ko.observable("Bert");
}
ko.applyBindings(new AppViewModel());
```

とバインディングするライブラリで、PHPのSmartyあたりが近いんじゃないかと思います。個人的に、チェックボックスでdivタグのid属性を生成して、jQueryとかでchangeをbindするのとか嫌いなので、knockout.jsが勝手にバインディングしてくれると嬉しいなぁ、と試してみました。

# はじめに

どういうのを習作とするか考えてたら、知り合いが「とある業界」の方から、ジョーの出勤状況を選ぶと、ジョーをお気に入りにしている客のメールアドレスが抽出される（ということをExcelでやりたい）という相談を受けているらしく、それにWebインタフェースで答えるイメージで書いてます。

# 1時間目

Knockout.jsの公式チュートリアルはバインドするデータもJavaScript内でセットされてますが、実際は外部で生成されたJSONを読み込むケースが多いんじゃなかろうかと。ただ、jQueryの$.ajaxでJSONを読み込もうとして、うまくいかなくてはまりました。

ポイントとしては、

- 空の配列をグローバルで用意する
- $.ajaxでJSONを読み込む場合、async:falseと設定する（そうしないとデータが同期されてない状態でデータバインドしようとして何も表示されない）
- $.ajaxのコールバックで空の配列にJSONの要素を追加する
- Knockout.jsでバインディングする予定の値に$.ajaxで要素を追加した配列を代入する
- 最後にapplyBindingsする

「習作」では、index.phpに、この手法を使っています。
https://github.com/usopyon/fu/blob/master/index.php

# 2時間目

と言いつつ、こんな感じでJavaScriptを動的に生成しちゃった方が楽だというケースもあります。

```html+php
viewModel.members = <?php echo json_encode($members)?>;
```

スクリプトを動的生成することにアレルギーのある人には無理そうですね。

「習作」では、獲物の一覧を表示するところで試しています。
https://github.com/usopyon/fu/blob/master/member.php

# 3時間目

チェックボックスが100個ぐらい並んでいて、チェックしたり外したりするごとに、裏でデータベースへの追加とか削除が走るという実装を試してみます。

knockout.jsでは、observableArrayにチェックされた要素が格納されます。そこで最初は、チェックしたり外したりするごとに、全削除して、チェックされた状態のものをすべて追加する処理を実装していましたが、追加・削除が完了する前にウィンドウを閉じるとデータが不整合になったりします。

そこで、初期状態の配列とobservableArrayを比較し、

1. 初期状態に含まれていた要素がobservableArrayに含まれていない場合は削除処理
2. observableArrayに含まれていた要素が初期状態に含まれていない場合は追加処理
3. 初期状態とobservableArrayを同期

として、チェックされたもの、チェックが外されたものだけ処理するように書いてみました。

「習作」では獲物の編集画面でジョーを選択するところで試しています。
https://github.com/usopyon/fu/blob/master/edit.php

# サンプル

こちらのサイトでサンプルを動かしています。
http://barcelona.sakura.ne.jp/fu/index.php

githubに置いているコードは、PHP＋SQLiteが使える環境にコピーし、最初にsetup.phpを起動すれば使えるようになっています。
https://github.com/usopyon/fu
Capistrano 3.0 と連携しているgemたち


Capって連携しているgemがたくさんあるので、なかなかそこらへんが大変なんす。

## Cap 3.0 本体

他に書いてくれている人たくさんいるので割愛。
ただ、元のファイルは一度消すかrenameしないと`cap install`通らない。

Qiita内だとこの方のすごいストック。

Upgrade to Capistrano 3.0
http://qiita.com/katton/items/e5cca6c4f94d140ae2d6

SSHKitのSyntaxなどについてはこちらの方がすごい。
Capistrano 3への手引き - 今日のごはんは素麺です
http://takkkun.hatenablog.com/entry/2013/10/12/Capistrano_3%E3%81%B8%E3%81%AE%E6%89%8B%E5%BC%95%E3%81%8D

あと、本家もありますね。
http://www.capistranorb.com/

まあ、頑張って移行する。
特に`repository`が`repo_url`に変更になったのはすべての人に影響ありそう。

ちなみにデフォルト値はここにかいてある。
https://github.com/capistrano/capistrano/blob/master/lib/capistrano/defaults.rb

`deploy.rb`にコメントアウトされている値がそうとは限らないので注意。

## Integrations

### Whenever

素敵なPRが既にmergeされたので動きます。
https://github.com/javan/whenever/pull/387

下記バージョン以降で。

```Gemfile
gem "whenever", "~> 0.9.0"
```

WheneverのREADMEにも書いてあるんですが、`whenever_command`に値をいれても動かないです。
bundler使ってる人が今まで、`bundle exec whenever`って上書きしていた分に関しては勝手にされるので触るな、ってことでした。

もしどうしてもやりたい場合はREADMEにかいてあるので読んでください。
https://github.com/javan/whenever

これは、SSHKitのissueだと書いてありますです。

### RVM

cap 3.x用の`capistrano/rvm`があるので、新しいgem使いましょう。
https://github.com/capistrano/rvm

```Gemfile
gem 'capistrano-rvm'
```

今まで使っていた`rvm-capistrano`と混ざらないように。

値の名前も少し変わっています。
`rvm_type`は今まで通りですが、`rvm_ruby_string`ではなく、`rvm_ruby_version`になっています。

これ以外の詳細はREADMEへ。
https://github.com/capistrano/rvm

### Unicorn

`capistrano-unicorn`は対応していない。

https://github.com/sosedoff/capistrano-unicorn/issues/82#issuecomment-29438081

有志のgistから拾ってくるか、forkから頑張って拾うか。

素直に`deploy.rb`に再起動のコマンド書いちゃってもいいと思うけど。

自分は以下のfork使ってます。
https://github.com/sepastian/capistrano-unicorn

その際、RVMとうまく噛み合わなかったので、
（capistrano-unicornがコマンドもりもり直書きしているため）
とりあえず下記な感じで逃げました。

```deploy.rb
# TODO: Dirty hack for Unicorn Integration
set :unicorn_bundle, -> {
  "#{fetch(:rvm_path)}/bin/rvm #{fetch(:rvm_ruby_version)} do #{fetch(:bundle_cmd, 'bundle')}"
}
```

このgemに頼らずにイチから書いた方良さそうな気がムンムン。

### Sidekiq

Capfileからrequireするようにすれば動くっぽいよ。

https://github.com/mperham/sidekiq/issues/1310

### Airbrake

これも本家はだめっぽそうなので、PR支援しましょう。

https://github.com/airbrake/airbrake/pull/255
https://github.com/airbrake/airbrake/issues/247

あんまりAirbrakeのデプロイ通知は活用できてなかったので、放置しました。

## 最後に

Capfileに`set`書くと動かないよね？
`load:defaults`のside effectsっぽいんだけど、これは仕様になっていくのだろうか？
たしかに設定は`deploy.rb`に書いた方がスッキリしそうだけどね。

おしまい。
OnDemand Bastionについて基本的なところおさらい


# CDP：[OnDemand Bastionパターン](http://aws.clouddesignpattern.org/index.php/CDP:OnDemand_Bastion%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3)

* 踏み台サーバを必要なときだけ起動して、使用しない時はサーバを落とすという、AWS界隈では当たり前なパターン。  

## 実際にオンプレ頭の人たちとAWS上にシステム移行してみて
* サーバを止めるという考え方がそもそもない。
* 時間帯で自動停止、運用マニュアル等で周知徹底しても踏み台サーバを落とさない
* 逆に踏み台サーバが落ちると困るとかいう話も出てきた。orz
  * Auto Scallingを使用して絶対に1台サーバが上がっている状態を維持(EIP付け替え？ELB?)
     * あれ？このパターンってCDPにない？

## じゃあ、踏み台サーバを出来るだけセキュアにしますか！
１. sshポート変更
２. SGにてsshポートだけ許可  
* sshを1024以上に設定してSGもそのポートのみ許可  
３. sshと管理等に必要なデーモン以外は上げない
４. rootユーザでのログイン不許可
  * sshd_configにて以下の設定

```
   PermitRootLogin no
```
５. 公開鍵認証でのみログイン許可  
* sshd_configにて以下の設定

```
  RSAAuthentication yes
  PubkeyAuthentication yes 
  AuthorizedKeysFile %h/.ssh/authorized_keys
```
６. パスワードのみのログインは許可しない    
 * sshd_configにて以下の設定

```
  PasswordAuthentication no
```
７. チャレンジレスポンス認証を不許可
 * sshd_configにて以下の設定

```
  ChallengeResponseAuthentication no
```
８. rhost認証の不許可  
 * sshd_configにて以下の設定  

```
  RhostsRSAAuthentication no
```
９. 踏み台はあくまで踏み台、sshトンネルで該当サーバにログインし、踏み台に直接ログインしない
  * ssh -N -L ポート番号:ホスト:ホスト側ポート番号
１０. sshプロトコル2のみ許可する  
  * sshd_configにて以下の設定

```
  Protocol 2
```
１１. ec2-user以外のログインユーザ、sudoユーザを作成し、ec2-userを削除
１２. sudoユーザの限定
１３.  sudo出来るユーザで実行できるコマンドの最小化

## で、どれを実装すればいいの？の考察
上記項番をそのままに  
１. 【◎】これは普通に実装した方がよいだろう。sshのポートは1024以上の任意のポートにする。（ポートスキャンは大抵Well-knownポートに限られる）  
２. 【◎】SGは１で設定したsshポートのみ許可する。繋げる端末のグローバルIPが決まっているなら、レンジかIPで指定するとよりよいだろう。  
３. 【◎】sshや管理に必要なデーモン以外上げないというのは、オンプレでは割とセオリーで、必要なときは徹底して必要なパッケージしか入れないという状態にしていた。不要なデーモンは止めておくだけでとりあえずいいだろう。  
４. 【◎】rootログイン不許可はほとんどのLinuxでそうなっている。Amazon Linuxはデフォルト。クラウドの場合、設定ファイルがそのままパラメタシートになる場合も多いので、明示的に  

```
PermitRootLogin no
```
を記載してもいいかもしれない。  
５. 【◎】公開鍵でのログイン許可はAWSのLinuxではデフォルトだが、４と同様にデフォルト値ではなく、明示的に設定するのもありだろう。  

```
RSAAuthentication yes
PubkeyAuthentication yes 
AuthorizedKeysFile %h/.ssh/authorized_keys
```
６. 【◎】５と同様、この設定もデフォルト値。明示的に設定するのもあり。

```
PasswordAuthentication no
```
７. 【◎】チャレンジレスポンス認証はデフォルトで不許可になっている。  
８. 【◎】rhostについてはデフォルト不許可になり、久しいがこれも明示的に設定する方がいいだろう。

```
  RhostsRSAAuthentication no
```
９. 【○】踏み台をトンネルにしなくてもよいが、トンネルすることで踏み台サーバ上で余計なオペレーションをしなくていい。サーバトラブルのほとんどは人的ミス（オペレーション）で生じている現状、トンネル運用が推奨。
１０. 【△】ssh2のみにするとsshのみしか対応していないクライアントは接続できない。よっぽどのことがない限り、この設定はしなくてもよいだろう。  
１１. 【○】セキュリティ規約によっては、ec2-user等、クラウドでのログインユーザで有名なユーザは削除して別のユーザを作ったりする。鍵が奪われない限りは問題ないが、転ばぬ先の杖で実施しておいた方が安心だろう。  
１２. 【○】１１に合わせてwheelグループに所属しているユーザの見直しをする。
１３. 【△】必要最低限の操作しか出来ないようにシンボリックリンクや障害になり得るコマンドを削除したりする。必要に応じて実装すればいいだろう。実際にそういったセキュリティ規約のところもある。  

今回はssh周りに限定したが、じゃじゃ馬SELinuxを飼い馴らしたり、ログインタイムアウトを設定したり、コンソールタイムアウトを設定したり、様々な策は労せる。  
ログレベルを強化して、検知を確実にするとか、そういうことも必須になってくるね。
PythonでLeapMotionを使ってみる

LeapMotionという小型のジェスチャ操作デバイスを買って、pythonで動かしてみました。
私の環境がubuntu12.04なので、それ用のSDKを[developerサイト](https://developer.leapmotion.com/)から取得してきます。(ユーザ登録が必要です)
ダウンロードしたファイルを解凍すると中にLeapSDKというフォルダがあるのでその中のlibに入っている以下のファイルがpythonで動かすのに必要なファイルになります。

* Leap.py
* libLeap.so
* LeapPython.so

3次元表示には[VPython](http://www.vpython.org/)というモジュールを使いました。
以下が今回作成した簡易ビューアです。

```python:finger_viz.py
#!/usr/bin/python
#coding:utf-8
from visual import *
import Leap

scene = display(title='Leap Motion Example',
                x = 0, y = 0, width = 600, height = 600,
                center = (5, 0, 0), background = (0, 1, 1),
                visible = True,
                scale = (0.005, 0.005, 0.005),
                autoscale = False)
balls = [sphere(radius=10, color=color.red, visible=False) for _ in range(10)]
controller = Leap.Controller()

while True:
    rate(100)
    f = controller.frame()
    for idx, ball in enumerate(balls):
        if idx < len(f.fingers):
            ball.visible = True
            ball.pos = (f.fingers[idx].tip_position.x,
                        f.fingers[idx].tip_position.y,
                        f.fingers[idx].tip_position.z)
        else:
            ball.visible = False
```

実際の表示画面はこんな感じです。
かなりシンプルで指先のみの表示になっています。
![finger_viz.png](https://qiita-image-store.s3.amazonaws.com/0/14516/f8143393-21bd-a295-ef63-3e61b7a6202b.png)
面白いデバイスなので、ゲーム、音楽とか3Dモデリングなどいろいろと使えそうな感じです。
ある程度の規模で mroongaを運用していてハマったこと。（草稿）


## mroonga_logが大量に出力されてしまう？
- これはすでに改善してなおっている

## メモリリークしているっぽい？
- まだ未解決

## 特定環境で truncate が信じられないほど遅くなる
- OSのバージョン？
jekyllでslimを使う


rubyでできた、ブログ、静的ページ生成ツールjekyll(ジキル)でテンプレートエンジンslimを使う方法。

# jekyll-slimのインストール
```
gem 'jekyll-slim' 
```
で`bundle install`

# プラグインの読み込み
rootディレクトリに`_plugins/bundler.rb`を作成し、内容を以下のようにする。

```ruby:bundler.rb
require 'rubygems'
require 'bundler/setup'
Bundler.require(:default)
```

# htmlファイルをslimに置き換える
_layouts/default.html等を.slimにリネームし、マークアップをslim形式に変更する。

参考: [Slim - A Fast, Lightweight Template Engine for Ruby](http://slim-lang.com/)

# テンプレートを読み込む
_includesディレクトリにあるテンプレートを読み込みたい場合は通常の`include`の部分を`slim`に置き換えます

```slim
#footer
  | {% slim footer.slim %}
```

---

hamlでやる場合もだいたい同じ。
Ruby on RailsにBootstrapをインストールする方法


#### railsのインストールが完了後からの手順を記載。

---
### 最初のやり方ではBootstrapのverが2だったで、3をインストールするやり方を追記。
###### ※ liubin0329さんのやり方を使わせていただきました。liubin0329さん有り難うございました。
---
&nbsp;
以下、Bootstrap ver3のインストールの方法
---
&nbsp;

Gemfileを開いて、以下の6行を追加。

```
gem 'therubyracer', platforms: :ruby
gem 'turbolinks'
gem 'less-rails'
gem 'anjlab-bootstrap-rails', :require => 'bootstrap-rails', :github => 'anjlab/bootstrap-rails'
gem 'execjs'
gem 'rb-readline', '~> 0.4.2'
```
&nbsp;

- gemの更新。

```
$ bundle install
```
&nbsp;

- app/assets/stylesheets/bootstrap.css.scssを作成し、以下の1行を記述。

```
@import "twitter/bootstrap";
```
&nbsp;

- app/assets/stylesheets/application.cssに以下の2行を追加。

```
 *= require_self
 *= require_tree .
```
&nbsp;

- app/assets/javascripts/application.jsに以下の1行を追加。

```
//= require twitter/bootstrap
```
&nbsp;

- app/views/layouts/application.html.erbの<head></head>に以下の3行を追加。

```
<%= stylesheet_link_tag    "bootstrap", media: "all", "data-turbolinks-track" => true %>
<%= stylesheet_link_tag    "application", media: "all", "data-turbolinks-track" => true %>
<%= javascript_include_tag "application", "data-turbolinks-track" => true %>
```
&nbsp;

- 完了

ControllerとViewを作り、ページを表示するとBootstrap3が適用されている。

&nbsp;
&nbsp;
&nbsp;
&nbsp;


以下、Bootstrap ver2のインストールの方法
---
- Gemfileを開いて、以下の3行を追加。

```
gem 'less-rails'
gem 'twitter-bootstrap-rails'
gem 'execjs'
```
&nbsp;

- gemの更新。

```
$ bundle install
```
&nbsp;

- Bootstrapインストール

```
$ rails g bootstrap:install
```
&nbsp;

- Bootstrapを適用したレイアウトファイル作成

```
$ rails g bootstrap:layout application
```
&nbsp;

---
### 上記のやり方でインストールしたBootstrapはverが古いので、修正。

- Bootstrapのページから最新版をダウンロード

[Bootstrap](http://getbootstrap.com/)
&nbsp;

- ダウンロードしたファイルを解凍して出来た以下の2ファイルをassets/stylesheetsに移動。

```
bootstrap-theme.min.css
bootstrap.min.css
```
&nbsp;

- 完了

---
&nbsp;
【SQL】親子テーブルを結合して抽出する際に、1行目だけに親の情報を表示させる方法

要するにブレーク処理みたいなことをSQL1本でやりたいって場合です。

##DB
Oracle

##サンプルテーブル
親テーブル:item_category（PK:category_id）

| category_id | category_name |
|:-----------:|:------------:|
| 1 | 食料品 |
| 2 | 衣料品 |
| 3 | 日用品 |
| 4 | 嗜好品 |

子テーブル:item（PK:category_id, item_id）

| category_id | item_id | item_name |
|:-----------:|:------------:|:------------:|
| 1 | 1001 | りんご |
| 1 | 1102 | 鳥モモ肉|
| 1 | 1405 | 鮭切り身|
| 2 | 1001 | Tシャツ |
| 2 | 1010 | 靴下 |
| 2 | 2025 | ジャージ |
| 3 | 1006 | 洗剤 |
| 3 | 1099 | 歯ブラシ |
| 3 | 3005 | ガムテープ |
| 4 | 0704 | たばこ |

##欲しい結果

| category_name | item_name |
|:-----------:|:------------:|
| 食料品 | りんご |
|  | 鳥モモ肉|
|  | 鮭切り身|
| 衣料品 | Tシャツ |
|  | 靴下 |
|  | ジャージ |
| 日用品 | 洗剤 |
|  | 歯ブラシ |
|  | ガムテープ |
| 嗜好品 | たばこ |

カテゴリが変わる（ブレークする）度に、そのカテゴリの1行目だけにカテゴリ情報を表示させます。
2行目以降のカテゴリ欄は空白にします。

##SQL

```sql
select
  c.category_name,
  i.item_name
from
  item_category c,
  item i
where
     (case 
      when (i.category_id, i.item_id)
           in (select category_id, min(item_id)
                from item sub
                group by category_id)
      then i.category_id
      else -1
     end) = c.category_id(+)
order by
  i.category_id, i.item_id
```

上記のように、case式を使って1行目以外の外部結合のキーを存在しない値（ここでは-1）にすることによって
1行目だけにカテゴリ情報を表示させることができます。
【JavaScript】エラトステネスの篩を書いてみた

[定本Javaプログラマのためのアルゴリズムとデータ構造](http://www.amazon.co.jp/gp/product/479736243X/ref=as_li_qf_sp_asin_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=479736243X&linkCode=as2&tag=ikemonn-22)
を読んでいたところ「エラトステネスの篩」という単語が出てきたので気になって調べてみた。

##エラトステネスの篩とは

>エラトステネスの篩（エラトステネスのふるい）は、指定された整数以下の全ての素数を発見するための単純なアルゴリズムである。古代ギリシアの科学者、エラトステネスが考案したとされるため、この名がある。(Wikipedia)

##アルゴリズム

>1. 探索リストに2〜nまでの整数を昇順でいれる
+ 探索リストの先頭の数を素数リストに移動し、その倍数を探索リストからふるい落とす
+ 上記のふるい落としを探索リストの先頭値 >= nの平方根　まで続ける
+ 探索リストに残った数を素数リストに移動して処理終了(Wikipedia)

例えば、n = 10とすると、
【1】
 探索リスト = {2,3 〜 10}

【2-1】(素数リストの先頭「2」の倍数をふるい落とす)
素数リスト = {2}
探索リスト = {3,5,7,9}

【2-2】(素数リストの先頭「3」の倍数をふるい落とす)
素数リスト = {2,3}
探索リスト = {5,7}

【4】(探索リストの先頭「5」がn=10の平方根より大きくなったため処理終了)
素数リスト = {2,3,5,7}

##実装

```
var MAX = 100;
var sieve = new Array(MAX);

//全ての数に対して素数フラグを立てる
for (var i = 0; i < MAX; i++) {
    sieve[i] = true;
}
//最大値の平方根を計算
var max = Math.floor(Math.sqrt(MAX));

//0,1は素数でないので外す
sieve[0] = false;
sieve[1] = false;

//探索リストの先頭 >= MAXの平方根まで、素数リストの倍数をふるい落としていく
for(var i = 2; i <= max; i++) {
	//素数だったら
	if(sieve[i] === true) {
		//その倍数をふるい落とす
		for(var j = i * 2; j <= MAX; j += i) {
			sieve[j] = false;
		}
	}
}

//素数の出力
for(var i = 0; i < MAX; i++) {
	if(sieve[i] === true) {
		console.log(i);
	}
}
```

##参考
[エラトステネスの篩 - Wikipedia](http://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9)
SpriteKitで横画面の左下を(0,0)にする

SpriteKitの横画面で、画面の下に合わせて地面を描画するときに

```
SKSpriteNode *ground = [SKSpriteNode spriteNodeWithColor:[SKColor yellowColor]
    size:CGSizeMake(self.frame.size.width, self.frame.size.height*0.2)];
ground.anchorPoint = CGPointMake(0, 0);
ground.position = CGPointMake(CGRectGetMinX(self.frame), 0);
```

のようにしても何も表示されなくて困った。
positionのyを上げると、表示されるようになるから、y=0が画面の下にあることはわかる。
ただ、3.5inchでyの値を決め打ちしても、4inchにすると台無しだし、
それぞれ場合分けするのも面倒だったので調べてみたら、分かりやすいページが見つかった。

http://www.ymc.ch/en/ios-7-sprite-kit-setting-up-correct-scene-dimensions

要は`ViewController`の`viewDidLoad`を`viewWillLayoutSubviews`に書き換えるだけ。
これでうまく表示されるようになった。
jqueryを使ったカウントダウンタイマーについて


http://www.shinbo.org/archives/4286
こちらのタイマーの設置で詰まってしまいました。

画面を表示している状態で、指定した時間になると「終了」と表示できるのですが、
ページを開いた段階で指定した時間が過ぎていた場合に何も表示されません。
終了していた場合でも同じように「終了」と表示させたい場合はどのような記述をすればよいでしょうか。

■main.js内
```
//現在の時間
var startTime;
//終了時間の配列
var endTime = new Array();
//終了時に表示するテキストの配列
var endText = new Array();
//現在時間と表示時間の差の配列
var timeDifference = new Array();
//日差の配列
var d = new Array();
//時差の配列
var h = new Array();
//分差の配列
var m = new Array();

//秒差の配列
var s = new Array();
//カウントダウンする要素の数
var n;
//カウントダウンする時間
var countTime = 1000;

$(function() {
n = $('.TimerEnd').length-1;
if(n >= 0){ 
setData();
countDown();
}
});

function countDown() {
startTime = startTime+countTime;

for(i=0; i<=n;i++){
timeDifference[i] = endTime[i]-startTime;
d[i] = Math.floor((timeDifference[i])/(24*60*60*1000))
h[i] = Math.floor(((timeDifference[i])%(24*60*60*1000))/(60*60*1000))
m[i] = Math.floor(((timeDifference[i])%(24*60*60*1000))/(60*1000))%60
s[i] = Math.floor(((timeDifference[i])%(24*60*60*1000))/1000)%60%60

if(timeDifference[i] >= 0){
if(d[i]!=0){
$(".TimeView:eq("+i+")").text(d[i]+'日'+h[i]+'時間'); 
}else{
if(h[i]!=0){
$(".TimeView:eq("+i+")").text(h[i]+'時間'+m[i]+'分'); 
}else{
if(m[i]!=0){
$(".TimeView:eq("+i+")").text(m[i]+'分'+s[i]+'秒');
}else{ 
if(s[i]>0){
$(".TimeView:eq("+i+")").text(s[i]+'秒');
}else{
$(".TimeView:eq("+i+")").text(endText[i]);
}
}
}
} 
}
//$(".TimeView:eq("+i+")").text(d[i]+'日'+h[i]+'時間'+m[i]+'分'+s[i]+'秒'); 
}
setTimeout('countDown()',countTime);
}

function setData(){
now = $('#TimerStart').val();
if(now == ""){
startTime = new Date().getTime();

}else{
startTime = new Date(now).getTime();

}

for(i=0; i<=n;i++){
$('.TimerEnd:eq('+i+')').val();
endTime[i] = new Date($('.TimerEnd:eq('+i+')').val()).getTime(); 
endText[i] = $('.TimerEndText:eq('+i+')').val();
timeDifference[i] = 0; 
d[i] = 0;
h[i] = 0;
m[i] = 0;
s[i] = 0;
}
}
```


■index.php内
```
<html lang="ja">
<head>
<script src="jquery-1.5.1.js"></script>
<script src="java.js"></script>
</head>
<body>
<p>2016/1/1に終了↓</p>
<p class="TimeView"></p><br>
<input type="hidden" class="TimerEnd" value="2016/1/1 00:00:00" >
<input type="hidden" class="TimerEndText" value="終了" >
</body>
</html>
```
【PHP】echo での{} の使われ道 ＋ 文字列結合

こんにちは。

どちらかと言うとループより、echoの表示方法になるのでしょうか。
(それともエスケープ？)

```php
<?php
	$loopCount = 0 ;
	while($loopCount < 3){
            echo "<p>testloop!: {$loopCount}</p>" ;
	$loopCount ++ ;
	}
?>
```

```php
echo "<p>testloop!:".$loopCount."</p>" ;
```
みたく、「.」でつなげて表示～ってやってもいいんだろうけど
おそらく、

```php
echo "<p>testloop!: {$loopCount}</p>" ;
```
のように「{}」で囲ったほうが見やすいですよね。

って思って色々いじってたんですが

```php
echo "<p>testloop!: $loopCount</p>" ;
```
これも結果が同じ・・・。
echo""内に$loopCountを入れたからそのまま
$loopCountと表示されると思ったのに。

__波括弧の使われ道__
###文字列や変数の区別
に使われるみたいですね。

<p>タグが来ていたから、内容は表示されていたものの
"$loopCounthogehoge"だったら、区別されず認識エラー
>
echo "{$loopCount}hogehoge" ;
もしくは
echo $loopCount ."hogehoge" ;

これでかいけつするみたいですね。

それではこれからも宜しくお願いします。
Xcodeでマップファイル出力を指定する


どれがグローバル変数なのかデバッグした時のメモ。

## 環境
Xcode version 5.0.2

## 設定

[Build settings] -> [Linking] -> [Other Linker Flags]に以下を追加

```
-Xlinker -map -Xlinker $(TARGET_TEMP_DIR)/$(PRODUCT_NAME)-MapFile-$(CURRENT_VARIANT)-$(CURRENT_ARCH).txt
```

PRODUCT_NAMEがfooなら、

> ~/Library/Developer/Xcode/DerivedData/foo-xxxxxxxxxxx/Build/Intermediates/foo.build/Debug-iphoneos/foo.build/foo-MapFile-normal-armv7.txt

あたりに出てくる。

## グローバル変数

.common近辺がグローバル変数。

``` foo-MapFile-normal-armv7.txt
# Sections:
# Address	Size    	Segment	Section
0x0000B0BC	0x00000300	__TEXT	__text
0x0000B3BC	0x00000084	__TEXT	__stub_helper
0x0000B440	0x000006A6	__TEXT	__objc_methname
0x0000BAE6	0x0000003C	__TEXT	__cstring
0x0000BB22	0x0000003C	__TEXT	__objc_classname
0x0000BB5E	0x0000047F	__TEXT	__objc_methtype
0x0000BFE0	0x00000020	__TEXT	__symbolstub1
0x0000C000	0x00000020	__DATA	__lazy_symbol
0x0000C020	0x00000010	__DATA	__nl_symbol_ptr
0x0000C030	0x00000008	__DATA	__objc_classlist
0x0000C038	0x00000008	__DATA	__objc_protolist
0x0000C040	0x00000008	__DATA	__objc_imageinfo
0x0000C048	0x000004F0	__DATA	__objc_const
0x0000C538	0x0000000C	__DATA	__objc_selrefs
0x0000C544	0x00000004	__DATA	__objc_classrefs
0x0000C548	0x00000004	__DATA	__objc_superrefs
0x0000C54C	0x00000050	__DATA	__objc_data
0x0000C59C	0x00000010	__DATA	__cfstring
0x0000C5AC	0x00000004	__DATA	__objc_ivar
0x0000C5B0	0x00000058	__DATA	__data
0x0000C608	0x00000004	__DATA	__common

# Symbols:
# Address	Size    	File  Name
..
0x0000C608	0x00000004	[  1] _global_var
..
```
R：大きな数値で指数表示になるのをさける。

scipenオプションを使って、指数表示になる桁数を調整できます。
初期値は0。大きな値にするほど指数表示になりにくくなる。
適当に100とか設定しておけばいいかと。

```
> 100000
[1] 1e+05
> options(scipen=100)
> 100000
[1] 100000
```
Ruby on RailsのCSSの指定について


#### railsでCSSがどこで指定されているかわからなかったので、メモ。

railsではCSSの指定はレイアウトファイルに以下のように記述されている。

```
<%= stylesheet_link_tag    "application", media: "all", "data-turbolinks-track" => true %>
```
&nbsp;
これでapp/assets/stylesheets/application.cssを読み込む。

次にapp/assets/stylesheets/application.cssを開くと、以下の行が記述されている。

```
 *= require_self
 *= require_tree .
```

```require_tree .```でapp/assets/stylesheets以下の全てのCSSが読み込まれるので、個々のCSSを指定しなくてもstylesheetsに置いておけば自動で読み込まれる。。
※読み込む順番は名前順。
R：read.csvなどでの行スキップ、コメント行スキップ

何の文化か知りませんが、時々ファイルの先頭に余計な行がついているCSVファイルをもらうことがあります。
同種のファイルなのにものによってコメント行数が違うようなものも。。。
使いにくいんでやめて欲しいんですけど…。

とまあ、そんな余計なものが含まれている場合の回避方法として、read.table系の関数には行スキップとコメント行と見なす先頭文字を指定するオプションがあります。

こんなCSVファイルがあったとします。

```
#コメントだよ。
#コメント2行目だよ。
"c1","c2","c3","c4","c5","c6"
"文字1-1", "001",1,2,3,"文字1-2"
"文字2-1", "101",3,2,1,"文字2-2"
```

単純に読み込もうとした場合。

```
data <- read.csv('test.csv',encoding="UTF-8")
> data
[1] X.コメントだよ...コメント2行目だよ..c1 c2                                     c3                                    
[4] c4                                     c5                                     c6                                    
 <0 行> (または長さ 0 の row.names) 
```

おかしな結果に。

余計な先頭2行をスキップしましょう。

```
> data <- read.csv('test.csv', skip=2, encoding="UTF-8")
> data
       c1  c2 c3 c4 c5      c6
1 文字1-1   1  1  2  3 文字1-2
2 文字2-1 101  3  2  1 文字2-2
```

まともに読めました。

「#」で始まる行をコメントとして扱って同様の結果を得ることもできます。

```
> data <- read.csv('test.csv', comment.char="#", encoding="UTF-8")
> data
       c1  c2 c3 c4 c5      c6
1 文字1-1   1  1  2  3 文字1-2
2 文字2-1 101  3  2  1 文字2-2
```

まともに読めました。
comment.charは「/」がデフォルトで設定されているので、これだったらオプションは不要。
環境によって変わる設定値はdotenvを使うと便利

Railsの環境のよって変わる設定値をどうするか問題については、rails_configとかsettingslogicなどのgemがよく紹介されているけど、今回はdotenvというgemを紹介したいと思います。

http://rubygems.org/gems/dotenv

これは、仕組みとしてはとても簡単なもので、カレントディレクトリに .env という名前で環境変数を書き込んでおくと、自動的に ENV の中にその値を追加してくれるというものです。

もともと foreman の機能でしたが、切り出されて別のgemになりました。

なので foreman や heroku を使っている人は知っているかと思います。

```bash
# .env
AWS_ACCESS_KEY_ID="hogehoge"
AWS_SECRET_ACCESS_KEY="mogamoga"
```

```rb
puts ENV["AWS_ACCESS_KEY_ID"] # => nil
Dotenv.load
puts ENV["AWS_ACCESS_KEY_ID"] # => "hogehoge"
```

Railsの場合は、dotenv-railsを使います。自動でDotenv.loadしてくれます。

```rb
gem 'dotenv-rails'
```

この.envファイルはVCSにコミットせず、それぞれの開発環境で設定します。

なぜこれが便利なのかというと、設定値へは常に ENV を使ってアクセスすることができるからです。

それが元々環境変数として設定されているのか、.env で設定されているのかは意識する必要がありません。

本番サーバでは環境変数として設定されていて、開発環境ではほかのプロジェクトと競合するなどの理由でグローバルに設定できない設定値も、プロジェクトごとにローカルに設定することができます。

さらに、/bin/dotenv というコマンドを使うと、ruby でないコマンドでも.envの設定を引き継いで実行することができます。


#### ところで

[Repro株式会社](https://repro.io/) では一緒に切磋琢磨できる仲間を募集しています！ ぜひ[こちら](https://www.wantedly.com/companies/repro/projects)をごらんください！
Railsのas_jsonをもうちょっと便利に使うオプション


Railsには`as_json`っていう便利なメソッドがある。

```ruby
irb(main):033:0> user = User.first
=> #<User id: 1, first_name: ‘Tatsuro’, last_name: ‘Baba’, email: ‘harakirisoul@gmail.com’>
irb(main):034:0> user.as_json
=> {"email"=>"user_1@example.com", "first_name"=>"User1", "id"=>1, "last_name"=>"USER1"}
```

ところが、これだとちょっと使い勝手が悪かったりする場合がある。そんなパターンに遭遇した時の、2つの解決策を紹介する。

## Userのインスタンスが特殊なメソッドを持っていたりする場合

例えば、`User#full_name`なんてメソッドがあったとして、それを含むjsonを書き出したい、というときに、どうするだろうか。ひとつの解決案は以下の通りだ。

```ruby
user.as_json.merge(full_name: user.full_name)
```

多少無理やりだが、まぁHashなのでこれでも出来る。
でもちょっとスマートじゃない。ちょっとどころかだいぶスマートじゃない。ので、メソッド側でちゃんと準備してくれている。以下のように書いてみよう。

```ruby
irb(main):035:0> user.as_json(methods: 'full_name')
=> {"email"=>"user_1@example.com", "first_name"=>"User1", "id"=>1, "last_name"=>"USER1”, “full_name”=>”User1 USER1”}
```

なんと便利な。`full_name`はattributeじゃないにもかかわらず、他のattributeと同じようにHashに取り込まれている。

## 必要ないattributeを削りたい場合

例えば、上の`User`モデルのパターンで言うと、「emailは要らない！名前だけくれ！」というパターンがあるかもしれない。

そんなときは、以下のような書き方が出来る。

```ruby
user.as_json.delete_if{|k, v| k == 'email' }
```

だが、ダサいしスマートじゃないしメンテコストが高い。そこで、やっぱり用意されているこのオプションを使おう。

```ruby
user.as_json(except: 'email')
=> {"first_name"=>"User1", "id"=>1, "last_name"=>"USER1”}
```

あるいは、逆にホワイトリスト形式でも大丈夫。

```ruby
user.as_json(only: ['id', 'first_name', 'last_name'])
=> {"first_name"=>"User1", "id"=>1, "last_name"=>"USER1”}
```

驚きの便利さである。

他にも`includes`とかオプションがあるので、ぜひ遊んでみて欲しい。
SublimeTextでプロジェクトごとに適用されるテーマを変更する

SublimeTextには`*.sublime-project`というプロジェクト単位で設定を変更できる素敵な機能があります。
これを利用すると、プロジェクトごとにテーマ(フォントも？)変更することが可能になります。

＃ *複数プロジェクトを開いていて、たまに修正するプロジェクトを間違えることがよくあったのです。。。*

やり方は簡単です。

`Project`->`Save Project As...`でProjectファイルを作成して保存します。
保存したファイルを開いて設定を以下のように書きます。

```json
{
	"settings":
	{
		"font_face": "メイリオ",
	    "theme": "Piatto Dark 3.sublime-theme",
		"color_scheme": "Packages/Theme - Piatto/Piatto Light.tmTheme"
	}
}
```

これで、このプロジェクトには `Packages/Theme - Piatto/Piatto Light.tmTheme` のテーマが適用され、フォントが`メイリオ`表示になります。

以上です。
R：read.csv / read.tableで型と列名を指定して読み込む。

read.csvとかread.tableはオプションなしで使うとデータ型を勝手に判別してくれますが、それだと都合が悪い場合があります。業務系のコードで数値解釈可能な0始まりな文字列とかね。

そんな時は明示的に型を指定して読み込むオプションがあります。通常の読み込みよりも速度があがる場合もあります。特にfactorになってしまうようなもの。これは別のオプションでも回避可能ですけど。

test.csvがこんなだとします。

```
"文字1-1", "001",1,2,3,"文字1-2"
"文字2-1", "101",3,2,1,"文字2-2"
```

まずは単純に読み込んだ場合。

```
> # 単純に読み込んだ場合。
> data <- read.csv('test.csv', header=F, encoding="UTF-8")
> sapply(data, class)
       V1        V2        V3        V4        V5        V6 
 "factor" "integer" "integer" "integer" "integer"  "factor" 
```

2列目が文字列解釈、1、6列目がfactor型として解釈されます。
header=Fは1行目をヘッダーと見なすかどうか、encodingはファイルのエンコーディング指定です。
ヘッダーがないので、名前が勝手に付与されます。

文字列がfactorに解釈されないようにするオプションを付けた場合。

```
> # 文字列をfactorにしないオプション付き。
> data <- read.csv('test.csv', header=F, encoding="UTF-8", stringsAsFactors=F)
> sapply(data, class)
         V1          V2          V3          V4          V5          V6 
"character"   "integer"   "integer"   "integer"   "integer" "character" 
```

stringsAsFactorsオプションを使います。

型を明示して読み込んだ場合。ついでに列名も指定してみます。

```
> data <- read.csv('test.csv', colClasses=c("character", "character", rep("numeric",3), "character"), header=F, col.names=c("c1", "c2", "c3", "c4", "c5", "c6"), encoding="UTF-8")
> sapply(data, class)
         c1          c2          c3          c4          c5          c6 
"character" "character"   "numeric"   "numeric"   "numeric" "character" 
```

colClassesで型を指定します。同じ型が連続する場合は、rep("numeric",3)のように指定することも。
colClasses="character"で、全ての項目を文字列として読み込むようなことも可能です。
colClassesで指定した数よりデータの列数が多い場合、指定されていない分は勝手に解釈されます。

また、col.namesで列名を指定できます。
split & cat コマンドでファイルを分割 & 結合

catを中身見るようにしか使っていなかったのでメモ

### split コマンド
ファイルを分割するコマンド。行単位や[k/M]バイト単位で分割できる。
出力はxaaで始まるファイル群になる。prefixを指定することもできる。

### catコマンド
ファイルを結合するコマンド。複数のファイルを指定するとそれらを連結して出力する。
出力はデフォルトでは標準出力になっているのでファイル観覧にも使える。

### 例
testというファイルを10Mバイト単位で分割して元に戻す

```shell-session
split -b 10m test out.
cat out.* > test.out
```
jadeでCheckBoxの後ろに文字列を追加する

[jade](http://jade-lang.com/)を利用してHTMLを書いているのですが、

```jade
div.col-sm-2.checkbox
  label
    input(type="checkbox") Add

```

という感じに`jade`を書いた場合に、以下のようにHTMLが生成されることを期待しました。

```html
<div class="col-sm-2 checkbox">
  <label>
    <input type="checkbox"/>Add
  </label>
</div>
```

ただ、なぜかうまくいかなくてこうなってしまいます。

```html
<div class="col-sm-2 checkbox">
  <label>
    <input type="checkbox"/>
  </label>
</div>
```

バグかなーと思って`github`を探してみると、 [input type=checkbox bug?](https://github.com/visionmedia/jade/issues/445) というのを発見しました。

よくよく読んでみると

> input elements cannot contain child text nodes. http://www.w3schools.com/html5/tag_input.asp

というコメントがあって、仕様とのこと。
確かにINPUTタグは子要素持てませんわね。

というわけで、以下のように修正して解決しました。

```jade
div.col-sm-2.checkbox
  label
    input(type="checkbox")
    | Add
```

以上です。
エディタを開かずに crontab にジョブを登録する

crontab -e で編集した内容は /var/spool/cron/ユーザ名に保存されるのでそのファイルに直接書いてしまえばよい

```bash
$ echo '*/10 22 * * * ls' | sudo tee /var/spool/cron/sonots
$ crontab -l
*/10 22 * * * ls
```

これで xargs と組み合わせて複数ホストに一気に設定できる

```bash
$ echo -e "host1\nhost2" | xargs -I{} ssh {} 'echo '\''*/10 22 * * * ls'\'' | sudo tee /var/spool/cron/sonots'
$ echo -e "host1\nhost2" | xargs -I{} ssh {} crontab -l # 確認
```

尚、

```
'\''
```

は ' のエスケープである
chrome アプリ／拡張機能でのデータ保存

chrome アプリで`localStorage`を使ったところ、Consoleで
> window.localStorage is not available in packaged apps. Use chrome.storage.local instead.

と言われてしまった。

`localStorage`は拡張機能では問題なく使えた。
アプリと拡張機能では使用可能なストレージAPIが異なるのだろうか？
私の知っているほかのデータ保存系APIについても調べてみた。

##chrome.* APIs (Chrome Platform APIs)
|API| アプリ|拡張機能|
|:-----|:-----:|:-----:|
|chrome.bookmark|X|O|
|chrome.fileSystem|O|X|
|chrome.storage|O|O|
|chrome.syncFileSystem|O|X|

##Web APIs
|API| アプリ|拡張機能|
|:-----|:-----:|:-----:|
|FileSystem|O|O|
|Indexed Database|O|O|
|localStorage|X|O|
|sessionStorage|O|O|
|Web SQL Database|X|O|

###参考文献

+ http://developer.chrome.com/apps/api_index.html
+ http://developer.chrome.com/extensions/api_index.html
vim 便利コマンドまとめ

感動したvimコマンド随時追加して行きます!
____
screen を閉じてしまったときの対処法
---
` screen -r `
で表示される過去のscreenを指定して、再度 ` screen -r hogehoge ` で消してしまったscreenを元に戻せる((( ；ﾟДﾟ)))
行数表示
---
` :set nu `
で今いる行数を表示できる(他にショートカットキーもあったような)
ちなみに ` :○ ` (○=移動したい行数)で移動できる 
    
複数行まとめてインデント調整
---
カーソル行のインデントを1段減らす (増やす)
<< (>>)
Ctrl+vで複数行選んでまとめてする

単語をコピー
---
` viw+y `

複数ある特定の単語を変換
---
` /hogehoge ` で単語(hogehoge)を検索。 または単語上で　` # ` か ` * `
` n ` で検索した単語に移動できる。
` cw ` でhogehogeを変換したのち、` . ` で前回の実行コマンドが実行される。つまり、複数同じ単語を変換する場合は ` n . n . n . ` と繰り返す。

ダブルクォーテーション("")の中を消す
---
()や''などにも同様にできます。
` di" ` ""の中を消す
` da" ` ""を含めて中を消す
` ci" ` ""の内側消して挿入モード
> このコマンドの凄いところは() や '' などの中に入らなくてもカーソルの位置に一番近い場所に反応するところです。

移動コマンド
---
` f ` + アルファベット一文字 その場から右へ移動
` F ` + アルファベット一文字 その場から左へ移動
` $ ` 行末
` ^ ` 行の文字頭, ` shift + 0 ` 行頭
` gg ` ページ全体の先頭
` G ` ページ全体の末尾  
  
`Ctrl + o `　直前のカーソルの位置へ
`Ctrl + i `　新しいカーソルの位置へ
vimの最強コマンド
---
` . ` 

#超おすすめplugin#
* unite.vim
* neocomplcache
* The-NERD-tree  

#http://blog.asial.co.jp/815#
このサイトと被っているものも出てくるかもしれないですが、特に私が使っていいなと思ったものを上げていきます
JSでiBeacon開発 - BeaconEgg

## だれでもiBeaconを使ったコンテンツ制作を楽しむ方法

タイトル通りなのですが、JavaScriptでiBeaconを使ったコンテンツ制作を行えるようにしましたので、その紹介です。

`BeaconEgg.js`というJavaScriptで書かれたライブラリを使ってWEBサイトを作り、そのURLを専用のアプリで開けば、iBeaconの信号をJS側で受信することができるようになります。

__iPhoneアプリの開発環境がなくても楽しめる__のがポイントです。

[BeaconEgg][1]


## なぜ作ったのか＆ターゲット

僕自身iBeaconを全然追いかけていなく、まとまった知識を得たのは、先日行われた[【iOS勉強会】iBeaconでできること – Developers.IO Meetup 02][2]が初めてでした。

技術自体は非常にシンプルで、環境さえあればだれでも楽しめそうだと思う一方、

その __環境さえあれば__ というところが大きく、iBeacon開発で一番ハードル高いのがアプリ開発だなって印象を受けました。

そこで、iBeaconで遊びたい人or課題で使いたい学生さんとか、そういう方々にもっと手軽にiBeaconをつかってコンテンツ作りを楽しんでいただけたら！

という思いで作ったのがBeaconEggです。

ビジネスとして利用したいとか考えてる人は環境なんて持っているべきだと思うので、特に今回の記事意味無いです。

上司へのプレゼンとかにはサクッと使えていいかもしれません。

ビジネスとしてのiBeaconは[昨日のu_akihiroさんの記事][3]が面白いので読むといいでう。

## 1.必要なもの

- iPhone4S以上のiOS7がインストールされている端末
- 簡単なJSとHTMLの知識
- 基本的なiBeaconの知識（このアドベントカレンダーの他の記事を読めばok!)
- 専用アプリ

## 2.使い方

ライブラリとか使い方は、[github][4]に置いてあります！

## 3.サンプルを動かす

専用アプリにはサンプルが付属してあります。Region`4EA800C6-B871-40A1-AB0F-FFCCFAF6B877`を受信するようになっていますので、MacやiPhoneをiBeacon端末にできるアプリを利用して上記のUUIDで送信してみてください。

サンプルのURLはこちらです。

[BeaconEgg Sample][5]

# One more thing…

さっきから、 __専用アプリ__ だとか、 __サンプル__ だとか意味がわからないと思います。

そうです、その __サンプル__ が動かせる __専用アプリ__ はどこにあるんだと。

普通Apple Storeに並んで居るはずですね。

AppleStoreでBeaconEggと検索してみてください。

はい、見つかりませんね。

__そうです！すいません、間に合いませんでした！！！！__

12日にiBeacon勉強会に行き
13日にBeaconEggを思いつき
14,15日で[w650][6]とiBeaconハッカソンを行い
16日には、アプリの申請とWEBサイトの準備も完了したのですが(コーディングは[gryng02][7]にお願いした)

したのです、が！

Appleさん冬休みに入られてしまいまして、最短でも __28日までAppleStoreに並ぶことはございません！！！__ (たしか)

なのでこの記事、完全に見切り発車です。ごめんなさいごめんなさい

リジェクトされたら、もうちょっと遅れちゃいます。

もしリリース出来ましたらこの記事を更新したり、[twitter][8]でお知らせしたりするので興味ある方は記事のストックやフォローお願い致します。

JSライブラリの方は既に[github][9]上に有りますので、要望など有りましたらプルリクや私、ライブラリ作者の[w650][10]へ連絡ください。


現在iBeaconのエラーなどをJSで受け取る事ができないため、そちらは公開され次第対応予定です。

# 1/2追記

リジェクト！
理由：Apple「おまえのアプリbeta版じゃね？」

ということで、これから流暢な日本語で返信をします。

# 1/4追記
beta版ではないことは分かってくれたようですが、BeaconEgg.jsをつかった他のサンプルを提示できないようなら
お前のアプリは依然としてしょぼいからダメだ。

と言われてるので、あした新しいサンプル作って再度メールします。
英語苦手で辛いですが、コンテンツは万国共通だと思ってがんばります。

# 1/14追記
先ほど直接電話があり
きちんと説明したのですが、「アプリとしては単体で何もコンテンツを有していないのでリジェクトよん」
って言われたので、iBeaconの送信端末になれるおまけ機能を実装して再申請してみます（白目

# 2/14追記
間が開いてしまいましたが、コツコツとiBeaconの送信機能も実装し、
申請作業中です。

これで審査が通れば、iPhoneが2台用意できれば、BeaconEggアプリだけでiBeaconの開発が楽しめちゃいます。

審査通るといいな

# 2/25追記

先ほど、電話でリジェクトを受けました。
PrivateAPIを使っている！！と言われましたが、使ってないです（汗

一度落として再申請してみますが、これでダメなら無理そうですね！ｗ

# 4/7追記

公開されました〜

http://qiita.com/naonya3/items/16a8537d314705917275

  [1]: http://beacon-egg.adhr.jp/
  [2]: http://dev.classmethod.jp/news/developersio-meetup-02/
  [3]: http://reinforce-lab.github.io/blog/2013/12/19/ibeacon-put-bluntly/
  [4]: https://github.com/adhr/BeaconEgg
  [5]: http://beacon-egg.adhr.jp/sample.html
  [6]: http://qiita.com/w650
  [7]: http://qiita.com/gryng02
  [8]: https://twitter.com/naonya3
  [9]: https://github.com/adhr/BeaconEgg
  [10]: https://twitter.com/w650
Xcode5の[Open Developer Tool]の項目にツールを入れたい


Xcode4.4くらい(?)からDeveloper ToolsにIcon Composerがはいらなくなったらしい。

デブセンから、ダウンロードしてインストールすればよいのだけど、
Xcodeの[Xcode]-[Open Developer Tool]の中に入れたいなーと。

![](https://qiita-image-store.s3.amazonaws.com/0/27566/14972c66-cd5e-25ee-5660-9e93e41d530b.png "")

[Application]-[Xcode.app]の[パッケージの内容を表示]を選択

[Contents]-[Applications]の中に[Icon Compser.app]を入れて、
Xcodeを起動(再起動)すれば、メニューの中に出てくる。

![](https://qiita-image-store.s3.amazonaws.com/0/27566/5e3aeaba-09ee-4a28-6235-22f12e059355.png "")

Icon Composerを立ち上げたい時に、Xcodeを起動するので、
あんまり、ここに入れるメリットは無いかも。

ネットを探してもあまり情報がなかったので、メモということで。
もしかしたら、メリットがあまり無いので、情報も無いのかも。
爆速JSONP / mustacheで深い要素を指定する方法

http://groups.yahoo.co.jp/group/YJDN/message/447
への返答になります。

```
爆速JSONPを使って気象情報APIを利用しようと考えているのですが、レスポンスの扱いがよく分からず困っています。フィールドWeatherListの中身がリストになっており(要素はWeatherというフィールド)、それぞれのWeatherの中身を表示させるには、
YDF.Feature.Property.WeatherList.
以降どのように記述すれば良いのでしょうか?
Mustacheのマニュアルを見てもよく分かりませんでした。
迷惑をかけてしまい、申し訳ありません。
```

Mustache.jsの指定は、要素順を間違えずに書く必要があります。間違えても特にエラーなどが出ず、何も出力されないだけなのでわかりにくいのですが。。

http://weather.olp.yahooapis.jp/v1/place?appid=test&output=json&coordinates=139.732293,35.663613

APIのレスポンスを整形して見てください。
Weatherの一番目の要素をルートからたどると

```js
//JSON Path表記
$.Feature[0].Property.WeatherList.Weather[0]
```

のようになっているはずです。途中、配列になっている箇所も間違いなく指定しなければなりません。
配列の添え字に関しても、Mustache.jsではドットつなぎで指定できます。
↓のような感じでどうでしょう。

```html+jinja
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>weather</title>
</head>
<body>
<script src="http://i.yimg.jp/images/yjdn/js/bakusoku-jsonp-v1-min.js"
  data-url="http://weather.olp.yahooapis.jp/v1/place"
  data-p-appid="test"
  data-p-output="json"
  data-p-coordinates="139.732293,35.663613"
>
<ul>
{{#Feature.0.Property.WeatherList.Weather}}
 <li>
  <ul>
   <li>type: {{Type}}</li>
   <li>date: {{Date}}</li>
   <li>rainfall: {{Rainfall}}</li>
  </ul>
 </li>
{{/Feature.0.Property.WeatherList.Weather}}
</ul>
</script>
</body>
</html>
```

爆速JSONPにもデバッグモードと言う名目でJSONをダンプする機能がありますが、大して高機能ではありません。

Google ChromeやFirefoxであればJSON Viewなどの拡張機能をインストールして併用するか、Unixコマンドラインであれば[jq](http://stedolan.github.io/jq/)を使うとJSONが読みやすくなると思います。
gruntコマンドのエラーメッセージの意味

gruntコマンドを実行したときに以下のエラーが出ることがあります。

```
grunt-cli: The grunt command line interface. (v0.1.9)

Fatal error: Unable to find local grunt.

If you're seeing this message, either a Gruntfile wasn't found or grunt
hasn't been installed locally to your project. For more information about
installing and configuring grunt, please see the Getting Started guide:

http://gruntjs.com/getting-started
```

## Gruntfile wasn't found

「Gruntfileが無いかも？」というメッセージなので、Gruntfile.jsがあるか確認します。

## grunt hasn't been installed locally to your project

「npmのgruntモジュールがプロジェクトにインストールされてないかも？」というメッセージなので、npm installしてみましょう。

```
npm install grunt
```
Ruby on Railsのルーティングのメモ


- 現在のルーティングを確認。

```
rake routes
```
&nbsp;

##### ※対象ファイルは/config/routes.rb
&nbsp;

- 指定したパスにアクセスされた際に呼び出すコントローラとアクションを指定する。

```
match 'パス' => 'コントローラ名#アクション名'
```
&nbsp;

- 指定したパスに指定したHTTPメソッドでアクセスされた際に呼び出すコントローラとアクションを指定する。

```
match 'パス' => 'コントローラ名#アクション名', :via => :get
match 'パス' => 'コントローラ名#アクション名', :via => :post
```
※指定されていないHTTPメソッドでアクセスされた際はルーティングしない。
※指定できるHTTPメソッドにはget/post/put/delteの4種類。
&nbsp;

- 上記をviaオプションを使わずに記述した場合。


```
get 'パス' => 'コントローラ名#アクション名'
post 'パス' => 'コントローラ名#アクション名'
```
&nbsp;

- 指定したパスにアクセスされた際に呼び出すコントローラとアクションを指定する。

```
match 'パス:パラメータ名' => 'コントローラ名#アクション名'
```
パラメータはparam[:パラメータ名]で取得できる。
&nbsp;

- パラメータが2つになった場合。

```
match 'パス:パラメータ名1/:パラメータ名2' => 'コントローラ名#アクション名'
```
&nbsp;

- 2つ目のパラメータを省略可能にした場合。

```
match 'パス:パラメータ名1(/:パラメータ名2)' => 'コントローラ名#アクション名'
```
&nbsp;

- 2つ目のパラメータが省略された場合のデフォルト値を指定した場合。 

```
match 'パス:パラメータ名1(/:パラメータ名2)' => 'コントローラ名#アクション名', :defaults => {:パラメータ名 => 'デフォルト値'}
```
Fiddler2を使ってAndroidで3G回線再現

## 環境
 * Windows7（Fiddler2を起動しているホストになるマシン）
 * Nexus5（3G回線を再現したいリモートの端末）
 * 上記2つを同じWi-Fiで接続しています。
 * 当然のことながらWi-Fiは3G回線よりも高速でないとFiddler2で3G回線は再現できません。

* Fiddler2をダウンロード
 * http://fiddler2.com/get-fiddler

## インストールしてFiddler2を起動したら…
### Fiddler2側の設定
* リモートからのコネクションを許可する
 * Tools -> Fiddler Options -> Connections -> Allow remote computers to connect にチェック
 * （Connectionsタブ内にある Fiddler listens on port: 8888 がリモートからアクセスする際に指定するポートになる）

### Android側の設定
* ipconfigか何かでFiddler2を起動しているマシンのIPアドレスを調べて下さい
* Androidからホストにつなげる
 * 設定 -> WiFi -> 接続済みのWiFiを長押し -> ネットワークを変更 -> 詳細オプションを表示 -> プロキシ（手動） -> プロキシホスト名に先ほど調べたIPアドレス -> プロキシポート（変えてなきゃ8888）を設定

これでFiddler2のプロセスにAndroidの通信が表示されたはず

## さあここからが本番だ！

そもそも3G回線って何Mbpsだよ。

※回線速度に関しては適当に調べてるので、詳しい人は怒らないでね(´・ω・`)

とりあえずメーカのサイトで…IS14SHでいいか

http://www.au.kddi.com/mobile/product/archive/smartphone/dp/is14sh/

3G　受信最大/送信最大（Mbps）3.1／1.8

まあ理論値なので実際は7、8割程度でしょう。多分。
なので受信 2M、送信 1.3M でいきます！適当。

## Fiddler2で回線速度を設定
* Rules -> Customize Rules

```
if (m_SimulateModem) {
    // Delay sends by 300ms per KB uploaded.
    oSession["request-trickle-delay"] = "300"; 
    // Delay receives by 150ms per KB downloaded.
    oSession["response-trickle-delay"] = "150"; 
}
```

 request-trickle-delayが送信、response-trickle-delayが受信です。

```
 // Delay sends by 300ms per KB uploaded.
```
送信だと300ms（0.3秒）当たり1KBバイトなので1秒間に3.3KB（26.4Kbps）ですね。
受信は1秒間に6.6KB（52.8Kbps）ですね。

送信は1.3Mbpsにしたいので6ms当たり1KB（小数点以下切り捨て）
受信は2.0Mbpsにしたいので4ms当たり1KB

```
if (m_SimulateModem) {
    // Delay sends by 300ms per KB uploaded.
    oSession["request-trickle-delay"] = "4"; 
    // Delay receives by 150ms per KB downloaded.
    oSession["response-trickle-delay"] = "6"; 
}
```

最後に…

* 回線速度を設定したものにします
 * Rules -> Performance -> Simulate Modern Speeds

あとはFiddler2を再起動して終わり。

確認したいかたはAndroidでブラウザを開いて以下のサイトとかで測定してみると良いかと

http://www.rapidnet.jp/ （Rapidnet）

先人の方がいたので↓

* Android開発で3G回線速度を再現する

http://blog.loadlimits.info/2012/10/android%E9%96%8B%E7%99%BA%E3%81%A73g%E5%9B%9E%E7%B7%9A%E9%80%9F%E5%BA%A6%E3%82%92%E5%86%8D%E7%8F%BE%E3%81%99%E3%82%8B/
Rubyist が違和感なく使える Elixir メソッド - Enum 編

Rubyist が違和感なく使える Elixir メソッドを取り上げてみました。

Elixir は Ruby に似ているだけあって、Rubyist が使い始めてもそこまで違和感なく始められると思います(Erlang周りを全然理解していない私の言葉なので信頼性にかけますが。。。)。
ということで以下とり上げてみます(オレ基準)。紹介していないものも結構あるので興味ある人は[ドキュメント](http://elixir-lang.org/docs/stable/)見てみると良いです。


### inject vs reduce
Elixir は reduce 派でした。

```rb:Ruby
[1, 2, 3, 4, 5].inject(1) { |acc, x| acc + x }
[1, 2, 3, 4, 5].inject { |acc, x| acc + x }
```

```ex:Elixir
Enum.reduce([1, 2, 3, 4, 5], 1, fn(x, acc) -> x + acc end)
Enum.reduce([1, 2, 3, 4, 5], fn(x, acc) -> x + acc end)
```

### select vs filter
Elixir は filter 派

```rb:Ruby
[1, 2, 3].select { |x| x == 2 }
```

```ex:Elixir
Enum.filter([1, 2, 3], fn(x) -> x == 2 end)
```

### reject

```rb:Ruby
[1, 2, 3].reject { |x| x == 2 }
```

```ex:Elixir
Enum.reject([1, 2, 3], fn(x) -> x == 2 end)
```

### find

```rb:Ruby
[1, 2, 3].find { |x| x == 2 }
```

```ex:Elixir
Enum.find([1, 2, 3], fn(x) -> x == 2 end)
```

### map

```rb:Ruby
[1, 2, 3].map { |x| x * 2 }
```

```ex:Elixir
Enum.map([1, 2, 3], &(&1 * 2)) 
```

### join

```rb:Ruby
[1, 2, 3].join(",")
```

```ex:Elixir
Enum.join([1, 2, 3], ",")
```

### each

```rb:Ruby
["a", "b"].each { |s| puts s }
```

```ex:Elixir
Enum.each(["a", "b"], &IO.puts(&1))
```

### empty?

```rb:Ruby
[].empty?
```

```ex:Elixir
Enum.empty?([])
```

### sort
ちょっと Elixir の引数順序が違和感ありますかね。。

```rb:Ruby
[1, 2, 3].sort { |a, b| b <=> a }
```

```ex:Elixir
Enum.sort([1, 2, 3], fn(a, b) -> a > b end)
```

### reverse

```rb:Ruby
[1, 2, 3].reverse
```

```ex:Elixir
Enum.reverse([1, 2, 3])
```

### uniq

```rb:Ruby
[1, 2, 3, 2, 1].uniq
```

```ex:Elixir
Enum.uniq([1, 2, 3, 2, 1])
```

### each_with_index vs with_index

```irb:Ruby
> [1, 2, 3].each_with_index.map { |v, i| [v, i] } # 理解しやすくするため map を挟んでます
=> [[1, 0], [2, 1], [3, 2]]
```

```iex:Elixir
iex(18)> Enum.with_index [1, 2, 3]
[{1, 0}, {2, 1}, {3, 2}]
```

### flat_map

```rb:Ruby
[[1,2], [3,4]].flat_map { |s| s }
```

```ex:Elixir
Enum.flat_map([[1, 2], [3, 4]], &(&1))
```

### zip
```rb:Ruby
[:a, :b].zip([1, 2])
```

```ex:Elixir
Enum.zip([:a, :b], [1, 2])
```


## まとめ

普段よく使っているメソッドの比較をして並べてみました。ほぼ同じでほとんど比較している意味がない。。。

使い勝手は Ruby と似ているので、Rubyist は苦労しなさそうです。ただし、Erlang の特徴だったりを理解するのは、また別の話かなと思います(少なくとも自分にとってまだ理解できていないこと多い)。

Enum 編と書きましたが、頑張って色々まとめようとして Enum のみで力尽きて、ここに落ち着いた感じですので、特に続く予定はないです。


これは Elixir Advent Calendar 2013 の 23 日目です。明日はというか今日は @keithseahus さんです。というかもう[公開](http://qiita.com/keithseahus/items/dbccf15ae3b37395194a)されていますね。内容が濃くて素晴らしい。
Ruby on RailsのControllerのメモ

- 別のアクションのテンプレートを呼び出す。

```
render :action => 'アクション名’
```
&nbsp;

- 上記を別の書き方をした場合

```
render 'アクション名'
```
&nbsp;

- 別のコントローラのアクションのテンプレートを呼びだす。

```
render :template => 'コントローラ名/アクション名'
```
&nbsp;

- 上記を別の書き方をした場合

```
render 'コントローラ名/アクション名'
```