OmniAICreator/Qiita-1.07M huggingface dataset:
Gradleでdependencyのjar等を読む方法

```groovy

dependency {
  compile 'jp.hogehoge.fugafuga'
  //省略
}

task("someDependencyOperation") << {
  def jarFile = configurations.compile.find { f -> f.name.matches("マッチしたいjar名等") }
  //jarFileは、見つかればjava.io.File、見つからない時はNullが返ります。
  //jarはzipファイル。zipの中身を調べたいときはzipTreeを使います。
  zipTree(jarFile).find { f -> f.name.equals("fugafuga") }
  //もちろん、jarFileそのものを操作してもOK
  jarFile.remaneTo("どこか")
  //maven dependency pluginの、mvn dependency:copy-dependenciesに相当するコマンドも実装出来ます
  configurations.compile.each { f ->
    //fを何処かにコピーとか
  }

}

```
Capistranoを使って、railsプロジェクトを自動デプロイする

railsプロジェクトの開発にあたり自動デプロイを利用することを勧められたので、自分なりに考察した内容をまとめます。

そもそもデプロイとは？
IT用語辞典によると、デプロイとは「外部からネットワーク経由で利用されるソフトウェアや、他のソフトウェアから参照されるコンポーネントなどを、利用可能な状態にするという意味合いが強い。」とのことです。
http://e-words.jp/w/E38387E38397E383ADE382A4.html

自分がしたい内容を具体的に当てはめると、「実環境で公開したいgitリポジトリの内容を、リモートサーバで利用可能な状態にする」ということになります。

ということで「rails デプロイ」で調べたところ、capistranoというツールの存在を知りました。
capistranoとはrailsのために作られたデプロイツールです。
自分が興味を持った利点を下に書きます。
　・gem使うので、インストールが容易
　・gitのpush、mergeによるデプロイ時のソースコード更新も自動化可能
　・deploy毎にログが残るので、ソースコードのロールバックが可能
　・capistrano-db-rollbackを使えば、dbのロールバックも行える？（調査中）

参考
http://shusatoo.net/programming/ruby/ruby-beginner-capistrano-deploy/
Mojolicious で非同期にファイル収集プログラムを起動する

* _記事タグを今後　スクレイピングツール　で統一します_
* _厳密にはAnyEventを使ってませんが概念上同じということでタグ付けしています_

# 前回までの課題
* データ収集プログラムの実行時間があまりに遅くて全体処理が遅延する

これは、systemコマンドなどを & をつけて実行してバックグラウンドプロセスにすれば何となくうまくいきそうな感じはします。

ですが本番サーバのperlはperlbrewを使ってインストールをしている関係なのかどうかわかりませんが、コマンドライン上から実行するとcpanmでインストールしたモジュールをうまくuseできなくてエラーになってしまいます。

ファックです。

# 課題の解決法
エラーの追及は後日に回すとして、なんとかプログラムの実行待ちをせずにうまくいく方法はないかと考えていたところ、こんな記事を見つけました。

[第13回　AnyEvent：イベント駆動モジュールの方言を吸収する](http://gihyo.jp/dev/serial/01/modern-perl/0013)

恥ずかしながらここで「AnyEvent」の存在を知り、イベント駆動という概念を思い出しました。
そして、Mojolicious には標準で上記の処理を可能にするモジュールがあるということで、折角ですから
使ってみることにしました。

[Mojo::IOLoop](https://github.com/yuki-kimoto/mojolicious-guides-japanese/wiki/Mojo%3A%3AIOLoop)

これを使って書き換えたRoot.pm が下記です（以下抜粋）。

```pl:Root.pm
# Web解析データの取得
my $kaiseki = Kaiseki::Model::Kaiseki->new;
eval{
    my @rows = $kaiseki->getCustomerinfo(1); # アナリティクス認証データの取得
     Mojo::IOLoop->timer(2 => sub { 
        $kaiseki_scrape->scrapeGadata($rows[0], $rows[1], $file);
      }
    );
};
```

最初に、use したMojo::IOLoop からtimerメソッドを呼び出し、無名sub で定義したscrapeGadata(データ収集プログラム）を起動し、$fileへ結果を書き出します。

これでプログラム遅延はある程度解消されました。データ収集プログラムはタイマー処理で2秒後に起動し、その
間に後続の処理を進めることができます。

次回は、ファイル読み出し処理を作成しようと思います。
Capistrano勉強会資料（初心者向け:未完成）

# 緒言
弊社に出入りしているKさんがこの度めでたく初デプロイらしいのでCapistoranoについてお勉強してみましょうということで始まりました。

# 技術背景
## Capistranoとは
CapistranoはRuby製CM(Configure Manegement)用gemである。デプロイで良く行う作業を簡単に、かつなるべく一点に集約して書けるようにし、自動化を可能にするソフトウェアであり、二回目以降のデプロイから属人性を取り払うことが可能である。派生OSSにGUIを備えたWebistranoというOSSも存在し、これをサーバー上にデプロイしておけばデザイナーでもワンクリックでフレームワークで自作したサービスのデプロイが可能であり、継続的な開発サイクル(CI:continuous integration)を設計する上で役立つ。

## デプロイメント（デプロイ）とは
其れ即ちWEBサービスやアプリケーションなどのネットワークを介するソフトウェアにおいて、構成や接続をサービスとして運用可能な状態にすることである。これは個人的な感想になるが、利用するソフトウェアの依存関係が多岐に渡るために全ての名前解決が上手くいかないことが多く、柔軟かつ自動的なソフトウェアがあれば利用したいところである。

### より具体的に
* Chef-serverを用いるパターン(サーバーが多いとき)
* knife-solo/chef-soloパターン（１つの命令で少数のサーバーにデプロイ）
* Capistrano内言語(DSL:ドメイン固有言語)を少し覚えるけど覚えたら簡単に書けるよ！
* development/test/staging/productionの目的に応じてtaskの使う分けができるよ！
* デプロイにまつわる設定をなるべく一箇所に集約できるので保守しやすいよ！



## 何故デプロイメントは手間がかかるのか
### 要件（要素）が多岐に渡るから
デプロイに関わる要件を列挙すると以下のようなものが挙げられる

* アプリケーションの構成
	* プログラミング言語
	* フレームワーク
	* ミドルウェア
* 実行環境や規模
	* サーバー台数
	* IaaS/PaaS/SaaSの制限
* 許容時間
	* アプリケーションファイルの大きさ
	* デプロイに何分かけて良いか
* 納期はいつまでか
	* 自動化にかける時間があるのか
* 予算はいくら使えるか
	* 初期費用にかける予算が出るのか

## どんなときに自動化してどんな時に手作業するの？
### 手作業いつやるの？
デプロイツールを使用できる人がチームにいないし雇えないとき
デプロイ手順書（秘伝のタレ）を作って保守する覚悟があるとき
手順書通りにやってるのに人的ミスでハマってURYYYYYYってなってもいいとき

### 自動化いつやるの？
* Capistrano使いが居るとき
* シェル芸人が居るとき
* デプロイツールの使い方を勉強して後に活かせそうなとき
* 何度もバグの改修が入りそうなとき
* 何度も仕様変更や機能拡張がありそうなとき
* 他のプロジェクトでも使用する言語やフレームワークが変わらないとき
* 保守や引き継ぎをする時期に困らないだろうと思えるとき

### 自動化、いつやるの？

＿人人 人人人＿
＞ いまでしょ ＜
￣Y^Y^Y^Y^Y￣



## どんなデプロイツールで自動化したらいいの？
* Ant(Java)
* Fabric(Python)
* Ansible(Python)
* Capistrano(Ruby)
* chef-solo(Ruby)
* knife-solo(Ruby)
* Puppet(Ruby)

＿人人人人人人人人人人人人人人人人人人人人人人＿
＞   Rails使いならRuby製のがイジれて良いでしょ ＜
￣Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^￣

* chef-solo(Ruby)
* knife-solo(Ruby)
* Capistrano(Ruby)
* Puppet(Ruby)

＿人人人人人人人人人人人＿
＞   どれがどんな役割なの ＜
￣Y^Y^Y^Y^Y^Y^Y^Y^Y^￣

* knife-solo(Ruby)
をポチッと叩くとlinuxだろうとmacだろうとwindowsだろうとchef-soloが起動可能な状態まで組み上げてchef-soloを起動してくれる（らしい！）

* chef-solo(Ruby)
knife-soloで起動されてRailsなどのフレームワークで作ったWEBアプリケーションやその依存関係を良い感じにしてくれる（らしい！）

* Capistrano(Ruby)
DSL（ドメイン固有言語：Capistrano語）を使ってtaskという処理の中にシェルスクリプトを書いて行く感じ

* Puppet(Ruby)
よくわからんけどchef-soloよりも古くあって、作りが複雑らしい。(source : http://www.slideshare.net/winebarrel/2013-0720-chefpuppet)


# ちょっと時間ないのでここまでで仮公開
### 未完成なのであまり参考にしないでくだしあ
Oracle 12cR1 RAC on Windows その2

検証を続けていてわかったことをまとめます。

#仮想ハード構成
プロセッサ：１
メモリ：512MB
ハードディスク：25GBを動的割り当て
共有ディスク：3GB × 3

#ソフトウェア構成
仮想マシン: Oracle VM VirtualBox 4.3.6 for Windows
ゲストＯＳ： Windows 2008 R2 Standard x86-64

上記構成でまたしてもエラー。
クラスタウェア構成中、ASMCAの箇所でエラーとなった。
実行ログを確認すると、どうやら以下のエラーのせいでASM構成に失敗しているらしい。

> ORA-00443: background process "DIA0" did not start
このメッセージが出力されたあとで、下記の
> m_bReaderStarted: false
が出力される。そして、
> Waiting for m_bReaderStarted to be true
がしばらく続いて
> SEVERE:method oracle.sysman.assistants.usmca.backend.USMInstance:configureLocalASM
> oracle.sysman.assistants.util.sqlEngine.SQLFatalErrorException: ORA-01034: ORACLE not available

と出る。

> oracle.sysman.assistants.util.sqlEngine.SQLFatalErrorException: ORA-00443: background process "DIA0" did not start

と出ることから考えると、バックグラウンドプロセス起動に失敗してそのままエラーとなっているのは間違いなさそうです。

さて、ORA-00443　の内容は下記のようなものです。

原因: 指定されたプロセスは起動しませんでした。  
処置: 実行可能イメージが正しい保護状態で正しい位置にあること、また十分なメモリーがあることを確認してください。 

イメージの状態はよくわかりませんが、気になるのはメモリーです。

検証環境は512MBですが、仕様だと4GB必須。

。。単純なメモリ不足かなあ。

実際の構築は３月になりそうなので、その時にまた検証します。
静的リソース(HTML,JS,CSS,画像)のブラウザキャッシュを制御


前回のエントリ([ブラウザのキャッシュコントロールを正しく理解する](http://qiita.com/hkusu/items/d40aa8a70bacd2015dfa))でブラウザ側のキャッシュ制御について説明しました。
ただ動的スクリプトなら、次の例のようにHTTPレスポンスヘッダを操作すればいいのですが、

```php:PHPでのHTTPレスポンスヘッダ出力例
<?php
header('Content-Type: text/plain; charset=UTF-8');
header('Cache-Control: max-age=0');
echo "Hello World!";
?>
```

スクリプトを介さない静的リソース(HTMLファイル、JSファイル、CSSファイル、画像ファイルなど)はどうやってHTTPレスポンスを操作すればいいかというと、もしApacheを利用している場合は mod_header と mod_rewrite を利用して次のように簡単に出来ます！

# 設定例

想定ケースとして、次のようにブラウザ側のキャッシュを制御したいと仮定します。
（表の下にいくほど、キャッシュの強度が高い=サーバ側へのアクセス回数や通信量を抑えられる）

| 対象 | 期待する挙動 |
|:---|:---|
| PHPスクリプト | ブラウザにキャッシュされず毎回アクセスして欲しい。動的コンテンツなのでサーバから304レスポンスを返すこともない。 |
| HTMLファイル | コンテンツに文言ミスがあった場合に、修正を即座に反映したい。ただサイズが大きいので、普段に変更がない場合はコンテンツ内容をレスポンスしたくない(304レスポンス) |
| CSSファイル、JSファイル | 何かアプリケーションに不具合があった場合に修正を反映したいが、最悪10分間は許容できる。サイズが大きいので普段に変更がない場合はコンテンツ内容をレスポンスしたくない(304レスポンス) |
| 画像ファイル | 運用でめったに更新しない。修正した場合も反映まで1日は許容できる。サイズが大きいので普段に変更がない場合はコンテンツ内容をレスポンスしたくない(304レスポンス) |

この要件を満たすには、次のように `.htaccess` へ記載します。

```apache:.htaccess
RewriteEngine on

RewriteRule \.php$ - [L,E=X_CACHE_PATTERN1:]
RewriteRule \.html$ - [L,E=X_CACHE_PATTERN2:]
RewriteRule \.(css|js)$ - [L,E=X_CACHE_PATTERN3:]
RewriteRule \.(gif|jpe?g|png)$ - [L,E=X_CACHE_PATTERN4:]

# For dynamic contents
Header set Cache-Control "no-cache" env=X_CACHE_PATTERN1
Header unset Expires env=X_CACHE_PATTERN1
Header unset Last-Modified env=X_CACHE_PATTERN1
Header unset Etag env=X_CACHE_PATTERN1

# For HTML files
Header set Cache-Control "max-age=0" env=X_CACHE_PATTERN2
Header set Expires "Mon, 26 Jul 1997 05:00:00 GMT" env=X_CACHE_PATTERN2

# For CSS,JavaScript files
Header set Cache-Control "max-age=600" env=X_CACHE_PATTERN3

# For Image files
Header set Cache-Control "max-age=86400" env=X_CACHE_PATTERN4
```

ファイルの拡張子を元に、キャッシュのパターンを4通り設定しています。
(テンポラリ的にApache環境変数を利用。)

《拡張子が `.php` の場合》
HTTPレスポンスヘッダ `Cache-Control: no-cache` をセットし、`Expires ` `Last-Modified` `Etag` は念のため削除しています(なんとなく気持ち悪いので)。
***
《拡張子が `.html` の場合》
`Cache-Control` と `Expires ` で、即に期限切れにしています。`Last-Modified` `Etag` はApacheで自動的に付与されます(特殊な設定変更をしていなければ)。
***
《拡張子が `.css` または `.js` の場合》
`Cache-Control: max-age=600` で600秒(10分間)のキャッシュを指定しています。こちらも`Last-Modified` `Etag` はApacheで自動的に付与されます。
本当は`Expires`も設定したいところですが `.htaccess` で時間計算や文字列生成ができないので^^; ただ大抵のブラウザは、`Cache-Control` だけで十分かと思います。
***
《拡張子が画像系ファイルの場合》
CSSやJSの時よりキャッシュ期間を長く(max-age=86400:1日)しています。

# おわりに

静的リソースのブラウザキャッシュを制御することによって、ユーザのブラウザ描写待ち時間も減るとともに、サーバの負荷やネットワーク通信量を抑えられます。
とくに大きい画像がある場合はキャッシュは効果が高いので、適切に設定しましょう！
最近不便に感じたことをVimで解決する

## これは何?

最近コードを実装するにあたって、不便に感じたことを Vim で解決する記事

- 主に自分のリマインド用

## コマンドラインの内容を編集したい

コマンドヒストリーを使う
Exモードで、&lt;C-R&gt; すると、コマンドヒストリーが表示される
コマンドヒストリーでは、コマンドの入力履歴を編集/検索/実行できる
ノーマルモードでは、q: q? q/ でコマンドヒストリーを表示

### 主なキーバインド

- &lt;enter&gt; : カーソル直下のコマンドを実行
- &lt;C-C&gt; : カーソル直下のコマンドを、コマンドラインに貼り付け

コマンドヒストリーウィンドウのサイズが小さくて見づらいので、20行表示する

```vim
" コマンドラインウィンドウの幅
set cmdwinheight=20
```

## 単語をレジスタに格納している文字列と置換したい

- ye : 単語のヤンク(eは、スペースより前で止まる。wは、次の単語まで移動する)
- vep : 単語の選択後そこにペースト

### カーソル上の単語選択

- viw → i : inner w : 単語選択
- yiw → 単語ヤンク
- uiE → 空白区切りヤンク
- vi" → i : inner " : ダブルクォートの中身を選択
- va" → a : a : ダブルクォートを含んだ検索

### ダブルクォートの中をレジスタと置換

- vi"p : ダブルクォートの中身を選択した後、ペースト

## 選択した単語をレジスタに格納している文字列に一括置換

以下を .vimrc に設定

```vim
" s*でカーソル下のキーワードを置換
nnoremap <expr> s* ':%s/\<' . expand('<cword>') . '\>/'
vnoremap <expr> s* ':s/\<' . expand('<cword>') . '\>/'
```

*s の後に &lt;C-R&gt;" する

```vim
:%s/\<word\>/ここにペーストされる
```

## 現在のファイルのカレントディレクトリからの相対パスをコピーする

[CopyPath](http://nanasi.jp/articles/vim/copypath_vim.html) は、ファイル名と、絶対Pathだけなので BTS 等 にファイル名をコピーする時等に不便

```vim
command! CopyRelativePath
\ let @*=join(remove( split( expand( '%:p' ), "/" ), len( split( getcwd(), "/" ) ), -1 ), "/") | echo "copied"
```

```vim
:CopyRelativePath
```

- ../ とかでカレントディレクトリの外に出ているファイルの場合正しく動作しない
- もっと良い方法がある気がする

## 参考

- [Vim-users.jp - Hack #62: カーソル下のキーワードをバッファ内全体で置換する](http://vim-users.jp/2009/08/hack62/)
- [コマンド履歴、検索履歴を活用して、作業効率を上げよう。 — 名無しのvim使い](http://nanasi.jp/articles/howto/editing/use-command-history.html)
- :help
tarの小技

# tarファイルのサイズをざっくり見積もる

```
tar cf - /ディレクトリ/tarファイル/ | wc -c
```

ハイフン(-)で標準出力に渡してあげます。

# tar.gzファイルのサイズを見積もる

```
tar czf - /ディレクトリ/tarファイル/ | wc -c
```

ハイフン(-)で標準出力に渡してあげます。

# カレントディレクトリとtarファイルの中身を比較する

```
tar dfz archive.tar.gz
```

dオプションで比較を行うことができます。

# 特定のディレクトリ、ファイルだけ解凍する

```
tar xvf archive.tar ディレクトリ/ディレクトリ or ファイル
```

#tarファイルの中身を確認する
その1（t オプションを利用する方法）

```
tar tvf archive.tar.gz
```

その2（lessを利用する方法）

```
less archive.tar.gz
```
広告表示がないアプリでGoogle Analytics for iOSを組み込んでいるとリジェクトされる問題


今年2月に入ってからAdSupport.frameworkのASIdentifierManagerクラスにあるadvertisingIdentifierメソッドを使ったアプリがリジェクトされているという投稿が目立っていました。

参考：
ASIdentifierManager の advertisingIdentifier を使っているとリジェクトされる問題
http://qiita.com/monry/items/b473e3db7e48f05be96b

（上記では主にUnityが吐き出すコードを変更して対応）

# 解決法

Google Analyticsのライブラリを最新のv3.03aに置き換えることでAdSupport.frameworkをリンクしなくてもビルドできるようになります。

Downloads - iOS SDK
https://developers.google.com/analytics/devguides/collection/ios/resources?hl=ja

念のためAdHocビルドしたアプリのバイナリファイルに対してstringsコマンドでadvertisingIdentifierが使われていないか文字列を全て調べて見るのもよいでしょう。

```
$ unzip <アプリのバイナリ名>.ipa
$ cd Payload/
$ cd <アプリのバイナリ名>.app/
$ strings <アプリのバイナリ> | grep advertisingIdentifier
```

Payloadとか何やねんっという人は次の記事が参考になるでしょう
http://qiita.com/yimajo/items/b2afd85513ea7c47b66a


# AdSupport.framework周辺のことがら

## advertisingIdentifierとは

iOS6からUDIDが実質使えなくなったことで、広告ネットワーク用の共通のUUIDとして使われることを想定しているようです。

利用方法としてはAdSupport.frameworkをリンクし次のようなコードを書きます

```objc
ASIdentifierManager *adManager = [ASIdentifierManager sharedManager];
    
if ([adManager isAdvertisingTrackingEnabled]) {
    //使えるぜ
    NSLog(@"%@",[[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString]);
} else {
    //ユーザーによって使えないようになってるぜ
    NSLog(@"optout");
}
```

これによってユーザーが拒否しなければアプリにまたがった共通のUUIDを取得できます。


## Google Analyticsでv3.0あたりからAdSupport.frameworkが必須になっていた

v3.0からこのadvertisingIdentifierを取得するためなのかは分かりませんが、ターゲットをAdSupport.frameworkにリンクをすることが必須になっていました。

ただ、そうすると広告が表示されているアプリではリジェクトされないが、広告が表示されていないアプリではリジェクトされるという事があったようです。


## しかし100%リジェクトされるわけじゃない

ここまで書いててあれですが、自分の広告を表示しないアプリで、アクセス解析のためにGoogle Analytics v3.03組み込み1月にバージョンアップでリリースしていても実際はリジェクトされていませんでした。なので今年に入ってから100%リジェクトされるわけじゃないとは思います。
ses

```php
  require 'vendor/autoload.php';

  use Aws\Common\Aws;
  use Aws\Ses\SesClient;
  use Aws\Common\Enum\Region;

  $client = \Aws\Ses\SesClient::factory(array(
      'key'    => 'x',
      'secret' => 'x',
      'region' => Region::US_WEST_2
  ));       

  $from = "Kentaro Ku Kumagai <ku@ido.nu>";
  $to ="ku@ido.nu";
  $subject = "Testing AWS SES SendEmail()";
    
  $result = $client->sendEmail(array(
      'Source' => $from,
      'Destination' => array(
          'ToAddresses' => array($to)
      ),
      'Message' => array(
          'Subject' => array(
              'Data' => $subject
          ),
          'Body' => array(
              'Text' => array(
                  'Data' => "Hello World!\n Testing AWS email sending."
              ),
              //'Html' => array(
              //    // Data is required
              //            'Data' => "<h1>Hello World!</h1><p>Testing AWS email sending</p>"
              //),
          ),
      ),
  ));
```
MySQLトリガメモ


##トリガ確認

```sql
SHOW TRIGGERS;
```

##トリガ登録
```sql
DELIMITER |

CREATE TRIGGER (trigger_name) AFTER INSERT ON (table_name)
FOR EACH ROW BEGIN
 #----
END;
|
DELIMITER ;
```

+ DELIMITER XXで区切り文字設定
+ AFTER INSERT だとINSERTの後。BEFOR UPDATE だと updateの前にトリガ起動

##トリガ削除

```sql
DROP TRIGGERS (trigger_name);
```

##更新時statusがup-XXXの時に処理を行うトリガ

```sql
DELIMITER |
CREATE TRIGGER trg_XX AFTER INSERT ON tbl_XX
FOR EACH ROW BEGIN
IF((SELECT NEW.status LIKE 'up-%') = 1) THEN
 #---
END IF;
END;
|

DELIMITER ;
```
WindowsでYeoman + Reveal.js


[かっこいい](http://lab.hakim.se/reveal-js)プレゼン作るメモ。

> generator-revealはMacでも動作するので環境に合わせて読み替えてください

# 環境

* Windows7 (32bit)
* Chrome32
* IE11

# 準備

いろいろインストール。

## Git

Bowerを動かすのに必要。

[ここ](http://git-scm.com/download/win)からダウンロード。
PATH変数にC:¥Program Files¥Git¥binを追加しておく。

```DOS
C:¥> git --version
git version 1.8.5.2.msysgit.0
```

## node.js

Yeoman/Grunt/Bowerを動かしたり、npmでインストールするのに必要。

[ここ](http://nodejs.org)からダウンロード。

```DOS
C:¥> node -v
v0.10.25

C:¥> npm -v
1.3.24
```

### Yeoman/Grunt/Bower

* Yeoman ... 必要なものを集めてくれるおっさん
* Grunt ... 変更ファイルの監視・タスクラナー
* Bower ... パッケージ管理(JavaScriptやCSSとか取ってくる)

```DOS
C:¥> npm install -g bower grunt-cli yo

C:¥> yo --version
1.1.2

C:¥> grunt --version
grunt-cli v0.1.13
grunt v0.4.2

C:¥> bower --version
1.2.8
```

### Reveal.js

かっこいいプレゼンフレームワーク。
Yeomanのジェネレータ([generator-reveal](https://github.com/slara/generator-reveal))が便利。

```DOS
C:¥> npm install -g generator-reveal
```

# プロジェクト作成

フォルダを準備。

```DOS
C:¥> mkdir ¥path¥to¥project¥dir¥
C:¥> cd ¥path¥to¥project¥dir¥
```

Yeomanに必要なファイルを集めてもらう。

```DOS
C:¥path¥to¥project¥dir¥> yo reveal
```

対話形式で質問に回答。とりあえず全部リターンでOK。

>Gitが入っていないとBowerが動作せずエラーになるので注意。Reveal.jsのないプロジェクトが出来上がってしまう。
エラーが出てたら設定を確認してBowerを再実行。

>```DOS
C:¥path¥to¥project¥dir¥> bower install
```

Gruntでサーバ起動、変更ファイルの監視開始。

```DOS
C:¥path¥to¥project¥dir¥> grunt server
Running "buildIndex" task

Running "connect:livereload" (connect) task
Start connect web server on http://localhost:9000

Running "watch" task
Waiting...OK
```

ブラウザが起動してページが表示されれば完了。

## スライドを追加

コマンドで雛形作成。

```DOS
C:¥path¥to¥project¥dir¥> yo reveal:slide "slide title"
```

> Gruntが監視してるので、この時点でブラウザに反映されている。
> reveal:slideコマンドで日本語を使うとファイル名が空で生成されてしまうので、必ずアルファベットを使いましょう。

* slides/slide-title.htmlが作成される
* slides/list.jsonに作成したファイル名が追加される

markdownで書きたいなら`--markdown`を指定。

```DOS
C:¥path¥to¥project¥dir¥> yo reveal:slide "slide title2" --markdown
```

* slides/slide-title2.mdが作成される


### 縦スライド

slides/list.jsonを編集。

```JSON:slides/list.json
[
	"index.md",
	"slide-title.html",
	"slide-title2.md"
]
```

縦にしたいスライドを配列に入れる。

```JSON:slides/list.json
[
	"index.md",
	[
		"slide-title.html",
		"slide-title2.md"
	]
]
```

十字キーの上下で移動可能に。

## テーマの変更

bower_components/reveal.js/css/themeに入っているテーマに変更。

デフォルト。

```HTML:templates/_index.html
	<link rel="stylesheet" href="bower_components/reveal.js/css/theme/default.css" id="theme">
```

月。

```HTML:templates/_index.html
	<link rel="stylesheet" href="bower_components/reveal.js/css/theme/moon.css" id="theme">
```

空。

```HTML:templates/_index.html
	<link rel="stylesheet" href="bower_components/reveal.js/css/theme/sky.css" id="theme">
```

などなど。

# エクスポート

出来上がったプロジェクトをデプロイ。

## HTML

Gruntでビルド。

```DOS
C:¥path¥to¥project¥dir¥> grunt dist
```

distフォルダに出力されるファイル全部をサーバへコピー。
> .mdも拡張子そのままなのでサーバ設定を確認すること
> IISの場合"MIMEの種類"に`.md`を`text/plain`や`text/x-markdown`として追加

## PDF

ChromeでURL末尾に`?print-pdf`をつけて開く。印刷->PDF保存。

```DOS
C:¥> "C:¥Program Files¥Google¥Chrome¥Application¥chrome.exe" http://localhost:9000?print-pdf
```
ソーシャルゲーム（オンラインゲーム）実装時の注意点


# ソーシャルゲーム（オンラインゲーム）実装時の注意点

よくある **更新系** の話になります。
設計が絡んでくる話になりますが、「ユーザー視点」での考え方。

##「減らしてから増やす」が基本？

例えば、 **ショップで100Gを使用して回復薬を1個購入するというシミュレーション** で説明。

考えられるシナリオは、
・回復薬を1個増やす
・100Gを減らす
となる。

そうすると、やり方としては二つのパターンを上げられる

1. 増やしてから減らす
2. 減らしてから増やす

さて、アナタならどちらを選びますか？

### 増やす処理を先に行う場合

**_※事前に個数／所持Gチェックを行っている物とする_**

1.回復薬を1個増やす

```
UPDATE user_item SET num = num + 1 WHERE user_id = xxxx AND item_id = 1;
```

2.100Gを減らす

```
UPDATE user_param SET gold = gold - 100 WHERE user_id = xxxx;
```

1の処理後に、 **何らかの問題** が生じて、途中でエラー（Exception）となった場合に何が起こるか。
再度、ユーザーが操作を行うとどういう事が起きるかを考えてほしい。
※ **何らかの問題** ・・・アクセス負荷により、Webサーバー／DBサーバーのレスポンスが極端に遅くなったりとか。

**【結論】**

回復薬の **無限増殖(デュープ)** が起きてしてしまう
特定のユーザーに対して **利益** となり、他のユーザーからすると **不利益（損）** となる

**【一次対応、二次対応...】**

プロジェクトにより色々考え方があるが、確実な方法として
1. 増減にあたる機能（ショップ機能、アイテム）の停止
2. プログラムの改修を行う
3. ログの調査を行う
4. 増えてしまったアイテムの回収

1は発覚時点で対応を行う。
なぜか？
**無限増殖(デュープ)** が起こる状況のままにしてしまうと、
被害が増え続けてしまう。
なので、確実に無限増殖が行われない状況にする事が大事。
2.3.4は後回し。
4の増えてしまったアイテムの回収が厄介。

****

### 減らす処理を先に行う場合

**_※事前に個数／所持Gチェックを行っている物とする_**

1.100Gを減らす

```
UPDATE user_param SET gold = gold - 100 WHERE user_id = xxxx;
```

2.回復薬を1個増やす

```
UPDATE user_item SET num = num + 1 WHERE user_id = xxxx AND item_id = 1;
```

こちらも同様に1の処理後に、 **何らかの問題** が生じて、途中でエラー（Exception）となった場合に何が起こるか。
再度、ユーザーが操作を行うとどういう事が起きるかを考えてほしい。

**【結論】**

Gだけが失ってしまい、 **損** となる。
ちょっとおかしな話かもしれないが、Gを失い、
本来、獲得出来る筈の **回復薬** が手元にないと、
二重で損した気持ちになる。

**【一次対応、二次対応...】**

1. 増減にあたる機能（ショップ機能、アイテム）の停止
2. プログラムの改修を行う
3. ログの調査を行う
4. G、回復薬の「個別」もしくは「一括」補填を行う

## プロスペクト理論

この辺は「プロスペクト理論」が絡んでくるのかな。
簡単に説明すると、金額が同じでも **「利益」** と **「損失」** とでは、
「損失」の方が強く印象に残る。
人はそれを回避しようとする行動を取るという記載があります。

意外と、 **投資** と **ゲーム内通貨(アイテム)** は似ているのかな。

[プロスペクト理論とは何か？](http://xn--veku02g2rcwtlca518dr21a04kqnlq0j8o4a.jp/eco/p1.html)
[プロスペクト理論に学ぶFXにおける心構え](http://phdfx.blog.fc2.com/blog-entry-14.html)
開発中にとりあえず画像取得したいときには

ランダムに画像を返してくれるこのサイトが役立つ。
http://lorempixel.com

画像はCCライセンスで提供される。

## 縦横画素数指定

http://lorempixel.com/400/300/
![](http://lorempixel.com/400/300/)

http://lorempixel.com/100/100/
![](http://lorempixel.com/100/100/)

## カテゴリ指定

http://lorempixel.com/400/300/fashion/
![](http://lorempixel.com/400/300/fashion/)

http://lorempixel.com/400/300/food/
![](http://lorempixel.com/400/300/food/)

http://lorempixel.com/400/300/cats/
![](http://lorempixel.com/400/300/cats/)

http://lorempixel.com/400/300/abstract/
![](http://lorempixel.com/400/300/abstract/)

## 画像指定

0 ~ 9番まで。

http://lorempixel.com/400/300/technics/1/
![](http://lorempixel.com/400/300/technics/1/)

http://lorempixel.com/400/300/fashion/2/
![](http://lorempixel.com/400/300/fashion/2/)

http://lorempixel.com/400/300/transport/2/
![](http://lorempixel.com/400/300/transport/2/)

http://lorempixel.com/400/300/people/9/
![](http://lorempixel.com/400/300/people/9/)

http://lorempixel.com/400/300/nightlife/4/
![](http://lorempixel.com/400/300/nightlife/4/)

## 文字埋め込み指定

http://lorempixel.com/400/300/fashion/TEXT%2001/
![](http://lorempixel.com/400/300/fashion/TEXT%2001/)

http://lorempixel.com/400/300/abstract/TEXT%2002/
![](http://lorempixel.com/400/300/abstract/TEXT%2002/)
iBeaconに関してAppleの公式ドキュメントに書かれていたこと

"[Location and Maps Programming Guide](https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/LocationAwarenessPG/)" という **CoreLocationとMapKitまわりのApple公式のプログラミングガイド** があり、そこにはiBeaconまわりの情報が詳細に載っているのですが、いつも更新が遅い（もしくは更新されない）印象がある日本語版にも早々にこの更新が反映されています。


**[位置情報とマッププログラミングガイド](https://developer.apple.com/jp/devcenter/ios/library/documentation/LocationAwarenessPG.pdf)**

- 「領域を退出（exit）するときにしばらく時間をおいてからデリゲートメソッドが呼ばれる」
- 「境界を連続して横切った際に、iOS側で何度もイベントが発生しないように制御している」

といったiBeaconを試した人がよく言及している挙動についてもちゃんとこのドキュメントに明記されていて、 **有用な情報が多い** と感じました。


というわけで以下に「これは」と思った情報を抜粋します。


##フレームワーク内で隠蔽されている挙動に関する情報

###バックグラウンドでの挙動

> アプリケーションが実行していないときに、ある領域の境界線を横切ると、アプリケーションはそのイベントを処理するためにバックグラウンドで起動されます。同様に、イベントが発生したときにアプリケーションが一時停止中の場合、アプリケーションは動作させられて、 **イベントを処理するために短い時間（約10秒）が割り当てられます。** 

###境界線横断時の緩衝距離について

> システムは、境界線に加え、 **システムで定義された緩衝距離を越えるまで境界線の横断を報告しません。緩衝距離は、ユーザが境界線付近を移動しているときに、システムが大量の進入・退出イベントを立て続けに生成するのを防ぐための値です。**

###領域通知の条件について

> iOSシミュレータまたはデバイスで領域観測コードのテストを行う場合は、領域の境界線が横断されてもすぐには領域イベントが発生しないことがあることを理解しておいてください。 **不確かな通知が行われるのを避けるために、iOSでは一定のしきい値条件が満たされないと領域通知を行いません。** 
特に、 **ユーザの位置が領域の境界線を横断し、この境界線から最小距離だけ離れてから、この位置を少なくとも20秒間保持** しないと、通知は報告されません。

### 

> **この距離のしきい値は、ハードウェアと現在使用可能な位置情報テクノロジーとによって決められています。** たとえば、Wi-Fiが無効になっている場合、領域観測の精度は大幅に低下します。しかしながら、テスト目的の場合は、最小距離は約200メートルであると仮定することができます。


##実装のヒント

### 

> これらのデリゲートメソッド（注：`didEnterRegion:` と `didExitRegion:`）は、ユーザがビーコン領域に対して進入または退出を行うと必ずデフォルトで呼び出されますが、アプリケーションでこの動作をカスタマイズされることがあります。たとえば、ユーザがデバイスのディスプレイをオンにするまで、ユーザのビーコン領域への進入の通知を遅らせる場合があります。これを行うには、ビーコン領域の登録時に、ビーコン領域の **notifyEntryStateOnDisplayプロパティの値をYESに設定（そして領域のnotifyOnEntryプロパティをNOに設定）** するだけです。ユーザに通知が何回も送信されるのを防止するには、領域への進入ごとに1回だけ位置に関する通知を配信するようにします。


### 

> このビーコンの配列（注：`locationManager:didRangeBeacons:inRegion:` の第2引数に入ってくる配列のこと）は、 **最も近くにあるビーコンが配列の先頭にあるように、デバイスからの距離によって整列** されています。


### 

> ビーコンによる距離測定は、Bluetooth Low Energy無線ビーコンの検出に依存しているため、距離測定の結果は、ユーザがデバイスをどのように扱っているのかによって変わります。たとえば、デバイスがユーザのポケットやバッグの中にある場合やユーザがデバイス手の中で持っている場合、またビーコンと結ぶ直線距離の中に視界を遮るものがあるかどうかによって、距離測定の結果は変わってきます。 **アプリケーションによる距離測定の結果を一定に保つための方法の1つは、アプリケーションがフォアグラウンドある場合は、デバイスがユーザの手の中にある確率が高いため、アプリケーションがフォアグラウンドにある場合にのみビーコンとの距離測定を使用することです。**


##領域観測を利用したサービスに関する示唆

### 

> たとえば、特定のドライクリーニング店に近づいたら、アプリケーションでは、預けていてもう仕上がっている服を受け取るようにユーザに通知することができます。

passbookでクーポン配信、というユースケースは一番よく言われていますが、こういう場所に紐づいたアラートのようなユースケースもおもしろいと思いました。


> あるデパートにおける顧客の体験を豊かにするための専用のアプリケーションでは、 **このデパートのすべてのチェーン店で同じ近接UUIDで観測を行いながら、各店舗をメジャー値とマイナー値によって区別する** という使用方法があります。

> ユーザがこのデパート位置にある入口の1つに近づくと、アプリケーションがそのことをユーザに通知します。さらにアプリケーションでは、 **異なるマイナー値を使用して同じ店舗内の別の売り場を区別** することが可能で、位置に適したよりきめの細かい情報をユーザに提供できます。


UUID, Major, Minorをひとつのアプリケーションでどう使い分けるか、の一例としてわかりやすい。


##関連記事

- [iBeaconの実装に役立つ記事の逆引きリファレンス](http://d.hatena.ne.jp/shu223/20131219/1387448941)
- [Estimote Beacon をリバースエンジニアリング](http://d.hatena.ne.jp/shu223/20140131/1391155397)
bashでfileが存在するかを確認してからコマンドを実行する



# コード例

```bash
if [ -e /path/to/hoge ]; then
  # fileが存在した場合
else 
  # fileが存在しなかった場合
fi
```

みたいな

# 補足

`[ ＜条件式＞ ]`は`$ test ＜条件式＞`と同義で、testコマンドは条件式を評価して真偽を返却する。
`-e`がファイルが存在するかをテストする演算子みたいなやつ。
その他の演算子については[こちら](http://d.hatena.ne.jp/zenpou/20080621/1214068526)を参照するとよい。


# 参考

- [[Bash] ファイルやディレクトリの存在をチェックする方法](http://sweng.web.fc2.com/ja/program/bash/bash-check-file.html)
- [シェルのif文の条件式 - zenpouの日記](http://d.hatena.ne.jp/zenpou/20080621/1214068526)
iOSアプリのアイコン画像と起動画像をとりあえずつくるスクリプト


アイコンとか起動画面とか、開発中はなくてもいいけど、あったほうがなんか良いじゃないですか。
でも私はビギナーなので、Icon.pngとかDefault.pngだっけ、サイズは、、とか毎回調べちゃうので手間です。

## スクリプト

https://github.com/luckypool/iOS-Default-Images-Generator

こんな感じのをつくってみました。
1024x1024の大きめの画像があれば、必要そうなサイズのアイコンや起動画像を生成します。


## 使い方とか

### 事前準備

`convert` コマンド使ってるので、事前にインストールが必要。

```bash
$ brew install imagemagick
```

### Usage

```bash
usage: ./generator.sh src_image bg_color [dst_dir]
```

options

- `src_image`: 'App Icons'の元ファイル (1024x1024 size png)
- `bg_color`: 'App Launch (Default) Images'を生成するときの背景色. [こんな](http://www.imagemagick.org/script/command-line-options.php#fill)オプションを設定できるはず
- `dst_dir`: 生成先のディレクトリ (optional)


### 実行例

```bash
$ git clone https://github.com/luckypool/iOS-Default-Images-Generator.git
$ cd iOS-Default-Images-Generator
$ ./generator.sh d_1024px.png "#FF4981"
$ tree
.
├── README.md
├── d_1024px.png
├── dst
│   ├── icon
│   │   ├── Icon-60.png
│   │   ├── Icon-60@2x.png
│   │   ├── Icon-72.png
│   │   ├── Icon-72@2x.png
│   │   ├── Icon-76.png
│   │   ├── Icon-76@2x.png
│   │   ├── Icon-Small-40.png
│   │   ├── Icon-Small-40@2x.png
│   │   ├── Icon-Small-50.png
│   │   ├── Icon-Small-50@2x.png
│   │   ├── Icon-Small.png
│   │   ├── Icon-Small@2x.png
│   │   ├── Icon.png
│   │   ├── Icon@2x.png
│   │   ├── iTunesArtwork.png
│   │   └── iTunesArtwork@2x.png
│   └── screen
│       ├── Default-568h@2x~iphone.png
│       ├── Default-Landscape@2x~iPad.png
│       ├── Default-Landscape~iPad.png
│       ├── Default-Portrait@2x~iPad.png
│       ├── Default-Portrait~iPad.png
│       ├── Default@2x~iphone.png
│       └── Default~iphone.png
└── generator.sh
```

こんなものが生成されます :D

![Icon-60@2x.png](https://raw.github.com/luckypool/iOS-Default-Images-Generator/master/example/icon/Icon-60@2x.png)
![ss2014-02-13 11.36.16.png](https://qiita-image-store.s3.amazonaws.com/0/17133/e8ed1dc1-1715-1600-daeb-52e34fc55229.png "ss2014-02-13 11.36.16.png")
オンデマンドサブスクライブによるデータ通信量節約


ROSではpub/sub型のメッセージ通信を行うことで異なるノード間のデータ受け渡しを実現している。

基本的には以下の手順でデータが授受される。

1. 送信側が送信可能であることをbroadcastする(pub->advertise)
2. 受信側が送信側のデータを購読(sub->subscribe)
3. 送信側がデータを送信(pub->publish)
4. 受信側がデータを受信しコールバック関数が呼ばれる

基本的には何かのデータを使いたくなったらサブスクライブして、データが来たらコールバックで処理するという形でよい。

しかしながら、以下のような場合

![img1.png](https://qiita-image-store.s3.amazonaws.com/0/10402/295988cc-cdce-0c96-0e9a-e22b9f00c440.png "img1.png")

重い処理をオンデマンドにする、すなわち処理結果を使うノードがsubscribeしたときだけカメラ画像をサブスクライブし、自身がpublishするようにすれば、カメラ画像の取得と重い画像処理をする回数を必要最小限にすることができる。

このためには画像の重い画像処理ノードを以下のように書けばいい。

```cpp
class ImageProc {
  ros::NodeHandler _n;
  ros::Publisher   _pub;
  ros::Subscriber  _sub;
public:
  ImageProc(){
    _n.advertise("image_proc_result",10);
  void callback(typeof(msg) msg){
    // 重い処理 例：SIFT特徴点抽出
    _pub.publish(result);
  }

  void checkSubscribers(){
    if(_pub.getNumSubscribers() == 0) {
      if(_sub) { // 誰も自身をサブスクライブしなかったら自身もサブスクライブを止めてコールバックが呼ばれないようにする
        _sub.shutdown();
        ROS_INFO("unsubscribe");
      }
    } else {
      if (!_sub){
        _sub = _n.subscribe("camera_image", 1, &ImageProc::callback, this);
        ROS_INFO("subscribe");
      }
    }
  }

int main(int argc, char *argv[]){
  ros::init (argc, argv, "image_proc");
  ImageProc imgproc;
  ros::Rate r(10);

  while(ros::ok()){
    ros::spinOnce();
    imgproc.checkSubscribers(); // ポーリング毎に自身のサブスクライバを確認
    r.sleep();
  }

  return 0;
}
```

まあ、当たり前ですね。
coffeescript ワンライナー（一行）集

coffeescriptのワンライナー記法（一部）をまとめました。

### setTimeout
```coffeescript:CoffeeScript
setTimeout (-> console.log('hoge')), 1000
```
```js:JavaScript
setTimeout((function() {
  return console.log('hoge');
}), 1000);
```

### if
```coffeescript:CoffeeScript
console.log 'hoge' if true
```
```js:JavaScript
if (true) {
  console.log('hoge');
}
```

### 三項演算子
```coffeescript:CoffeeScript
hoge =  if bool then 'true' else 'false'
```
```js:JavaScript
hoge = bool ? 'true' : 'false';
```

### function
```coffeescript:CoffeeScript
fn = (x) -> x * x
```
```js:JavaScript
fn = function(x) {
  return x * x;
};
```

### 即時関数
```coffeescript:CoffeeScript
do ($ = jQuery) ->
```

```js:JavaScript
(function($) {})(jQuery); 
```

```coffeescript:CoffeeScript
do tick = ->
```

```js:JavaScript
(tick = function() {})();
```

### Object
```coffeescript:CoffeeScript
obj = port: 8008, hostname: '0.0.0.0'
```
```js:JavaScript
obj = {
  port: 8008,
  hostname: '0.0.0.0'
};
```

### 一括Object変数
```coffeescript:CoffeeScript
{@x, @y, @z} = args
```
```js:JavaScript
this.x = args.x, this.y = args.y, this.z = args.z;
```

### 一括Array変数
```coffeescript:CoffeeScript
[x, y, z] = args
```
```js:JavaScript
x = args[0], y = args[1], z = args[2];
```

### 一括変数定義
```coffeescript:CoffeeScript
[x, y, z] = [1, 2, 3]
```
```js:JavaScript
_ref = [1, 2, 3], x = _ref[0], y = _ref[1], z = _ref[2];
```

### Array range
```coffeescript:CoffeeScript
arr = [0...4]
```
```js:JavaScript
arr = [0, 1, 2, 3];
```

### apply
```coffeescript:CoffeeScript
$.when deferreds...
```

```js:JavaScript
$.when.apply($, deferreds);   
```

他にもリスト内包表記などがありますが、今回は割愛します。
Eucalyptus Upgrade 3.4.1

# 背景
最近はOpenStackですが、Eucalyptusも運用してて、最新の日本語テキストも少ないので状況を紹介。

# 問題
複数のインスタンスが集約して稼働しているクラウドインフラソフトのバージョンアップですが、要点を把握していれば何とかなるように出来ています。
Eucalyptusの場合、3.3.2から3.4や、今回の3.4から3.4.1でも、稼働中のインスタンスを停止すること無くアップグレードが出来ることを確認しています。
ただし、一時的なサービスの停止は起きるので、事前にメンテナンス停止の計画の上で実施しましょう。
状況にもよりますが、Zabbixで監視しながら確認しましたが、短時間の停止だけで済みました。

今回はホストOSをCentOSの6.4から6.5のメジャーアップデートも実施しました。
ロードされているkernelは再起動させない限りは古いままなので、全ての作業を終えてから再起動計画を別途設けましょう。その際にもインスタンスを停止しなくても、再起動時には元の状態に復元されます。

# 解法
アップグレードの場合は通常、EucalyptusのリポジトリがホストOSにはインストール済みですので、
ホストOSのパッケージをアップデートすれば、新しいバージョンのパッケージに更新されました。

```bash:更新パッケージの確認
$ sudo yum check-update
```

```bash:パッケージの更新
$ sudo yum update
```

パッケージを更新した後、Eucalyptusのアップグレードを実施します。

```bash:Eucalyotus(CLC)のアップグレード
$ sudo service eucalyptus-cloud start
```

```bash:Eucalyotus(Walrus)のアップグレード
$ sudo service eucalyptus-cloud start
```

CLCとWalrusが同じホストに同居していれば、共通コマンドなので同時に更新されます。

```bash:Eucalyotus(CC)のアップグレード
$ sudo service eucalyptus-cc start
```

```bash:Eucalyotus(NC)のアップグレード
$ sudo service eucalyptus-nc start
```

```bash:Eucalyotus(webコンソール)のアップグレード
$ sudo service eucalyptus-console start
```

注意するのは、Eucalyptusの各サービスをstartする事で、間違ってもrestartやstopで止めてしまわないように。

Eucalyptus3.4からロードバランサーイメージもサポートされているので、インストールしておきます。

```bash:ロードバランサーイメージパッケージのインストール
$ sudo yum install eucalyptus-load-balancer-image
```

Euca2ools環境にてマシンイメージを登録します。

```bash:ロードバランサーイメージの登録
$ euca-install-load-balancer --install-default
```

# 参考リンク
[Eucalyptus公式ドキュメント](https://www.eucalyptus.com/docs/eucalyptus/3.4/index.html#install-guide/upgrade.html "Eucalyptus Upgrade")
外国語の意味と例文を調べる

趣味の関係でよく日本語⇔ロシア語の単語の意味と例文を調べることがあるのだが、
分からない単語に出会うたびにchromeを開き、google translateにアクセスしているのでは面倒。

ということで、流行りのjqを使って我らが同志terminalを使って単語の意味と例文を調べられるようなスクリプトを書いてみた。

(jq初デビューのため間違いやアドバイスなどご指摘を歓迎します！)

# インストール

## まずはjqのインストール

### for OSX

macならhomebrewでしょう。

```bash
brew install jq
```

### for ubuntu

```bash
sudo aptitude install jq
```

## スクリプトを導入

.bashrcなどに以下を追加

```bash:translate.bash
function translate(){
    local FROM
    local TO
    if [ $# -eq 1 ]; then
        FROM="en"
        TO="ja"
    elif [ $# -eq 3 ]; then
        FROM=$2
        TO=$3
    else
        echo "[usage] translate phrase [from(en) to(ja)]" 1>&2
    fi
    if [ "$TO" != "" ]; then
        echo "$1 ($FROM->$TO)"
        curl -sSX GET "http://glosbe.com/gapi/translate?from=$FROM&dest=$TO&format=json&phrase=$1&pretty=true" | jq -r '[.tuc[]|if .phrase == null then empty else {w:.phrase.text, m:.meanings} end]|reduce .[] as $i ("\n"; . + $i.w + "\n" + reduce $i.m[] as $m (""; . + "\t" + $m.text + "\n"))' 2>/dev/null
    fi
}

function transexpl(){
    local FROM
    local TO
    if [ $# -eq 1 ]; then
        FROM="en"
        TO="ja"
    elif [ $# -eq 3 ]; then
        FROM=$2
        TO=$3
    else
        echo "[usage] transexpl phrase [from(en) to(ja)]" 1>&2
    fi
    if [ "$TO" != "" ]; then
        echo "$1 ($FROM->$TO)"
        curl -sSX GET "http://glosbe.com/gapi/tm?from=$FROM&dest=$TO&format=json&phrase=$1&pretty=true" | jq -r --arg FROM "$FROM" --arg TO "$TO" 'reduce .examples[] as $e ("";. + $FROM+":\t" + $e.first + "\n"+$TO+":\t" + $e.second + "\n\n")' 2>/dev/null|less
    fi
}
```

# 使用方法

```bash
[usage] translate phrase [from(en) to(ja)] # 単語の意味
[usage] transexpl phrase [from(en) to(ja)] # 例文
```

のとおり。

翻訳元と翻訳先の言語は省略すると英語→日本語になる。

# 例

```bash
$ translate pencil
pencil (en->ja)

鉛筆
	graphite writing-instrument
	A common writing utensil (made of a graphite shaft surrounded by wood) that uses graphite (commonly referred to as lead) to make marks on paper.
えんぴつ
	A common writing utensil (made of a graphite shaft surrounded by wood) that uses graphite (commonly referred to as lead) to make marks on paper.
こうせんそく
こうそく
ペン
ペンシル
光束
光線束
```

```bash
$ transexpl 遅刻 ja ru
ja:     彼は遅刻すると思う。
ru:     Я думаю, он опоздает.

ja:     上司は私が会議に遅刻したことを許してくれなかった。
ru:     Мой начальник не простил меня за то, что я опоздал на совещание.

ja:     今度だけは遅刻を大目に見てやろう。
ru:     В этот раз я закрою глаза на ваше опоздание.

ja:     又しても彼女は遅刻した。
ru:     Она снова опоздала.

ja:     言うまでもないが、彼はいつものように学校を遅刻した。
ru:     Не нужно говорить, что он, как обычно, опоздал в школу.

ja:     彼は遅刻の言い訳をした。
ru:     Он извинился за опоздание.

ja:     君は仕事に遅刻したね。
ru:     Ты опоздал на работу.

ja:     彼女はよく学校に遅刻した。
ru:     Она часто опаздывала в школу.
(続く)
```

結構便利。
PageLess と Turbolinks (Rails4) の組み合わせで、ページ遷移後も PageLess が有効になる問題

Rails4 の [Turbolinks](https://github.com/rails/turbolinks) と [PageLess](https://github.com/jney/jquery.pageless) を組み合わせて使っていて

* page A: PageLess が有効になっているページ (画面最下部までスクロールすると表示要素が追加でオートロードされる)
* page B: PageLess を使っていないページ

というケースで、

* page A から page B に遷移しても、page B で PageLess が有効になったままになり、画面最下部までスクロールするとバックグラウンドで page A の page=2, page=3 (... page=n) が取得されてしまう
* そのため page B から page A に遷移して画面最下部までスクロールすると、本来 page=2 から取得を再開して欲しいのに page=4 (page=n+1) から取得してしまう

というような問題が起きる。

こういった場合、page B の View に

    <script>
    $.pagelessReset();
    </script>

と書いておくと、この問題を回避できる。

ちなみに [jquery.pageless.js](https://github.com/jney/jquery.pageless/blob/master/lib/jquery.pageless.js) をのぞいてみると、最初の方にこの関数が定義されている。

(追記)

と思ったんだけど、page B から page A に戻った時 PageLess が動作しないという副作用があって悩ましい...

[→根本的な解決方法をまとめました](http://qiita.com/noto/items/d33a6f17bd6ec32b86d9)。
DNSBLを利用し迷惑メールの受信を拒否する

* [The Spamhaus Project - Frequently Asked Questions (FAQ)](http://www.spamhaus.org/faq/pblfaqjp.html)日本語訳
* [RBL.JP](http://www.rbl.jp)
* [制限の設定](http://unixservermemo.web.fc2.com/sv/postfix-maincf-seigen.htm)
* [CBL](http://cbl.abuseat.org/)
* [SpamhausのXBLについてテキトウに翻訳してみた | きたこれ．あじあ．ぶろぐ。](http://blog.kitakore.asia/?p=828)

```diff:/etc/postfix/main.cf
smtpd_recipient_restrictions =
  ...
+    reject_rbl_client all.rbl.jp
+    reject_rbl_client bl.spamcop.net,
+    reject_rbl_client zen.spamhaus.org,
  ...
```

```bash:syntax&nbsp;check
/usr/sbin/postfix check
service postfix restart
```

```bash:rejectしたメールがあるか検索
grep "reject:" /var/log/maillog
```

## Spamhausに登録されているかチェック


[公式FAQ](http://www.spamhaus.org/faq/section/DNSBL%20Usage)

```bash:11.22.33.44のサーバーをチェック
*/10 * * * * /usr/bin/dig +short 44.33.22.11.zen.spamhaus.org
```

応答があれば登録されている。

例: `127.0.0.4`と返答が来る。

### 大量にチェックしたい場合

```bash:checker.sh
#!/bin/sh

reverse_ip() {
    echo $1 | awk -F . '{printf "%d.%d.%d.%d", $4,$3,$2,$1}'
}

check_spamhaus() {
  for i in `seq -w $2 $3`
  do
    RESULT=$(dig +short ${i}.${1}.zen.spamhaus.org)
    if [ ! -z "$RESULT" ];then
        echo -n "http://www.spamhaus.org/query/bl?ip="
        reverse_ip "${i}.$1"
    fi
  done
}
```

```bash:
check_spamhaus "33.22.11" 1 254
```

`11.22.33.1～.254`までチェックしてくれる。
Google Chrome で選択したキーワードを履歴内から検索する

# 環境

一応、下記の組み合わせにて確認。

- Chromium for Linux x86
    - 32.0.1700.102
- [Context Menu Search](https://chrome.google.com/webstore/detail/context-menu-search/ocpcmghnefmdhljkoiapafejjohldoga)
    - 2.91

# 本題

履歴は ``chrome://history`` で閲覧できる。

検索クエリを指定するには ``chrome://history/#q=%s`` とする。

``%s`` は各自、利用環境に応じて替えること。

# 使い道

HOGE について調べているときに、関連する FUGA(こちらは数日前に検索済み)についてもう一度確認したくなったときなど便利。

# ちなみに

``chrome://bookmarks/#q=%s`` とすれば、ブックマーク内から検索できる。
Upgrade HDFS from Hadoop 2.2 to 2.3



## Overview

2.3リリースのvotingも兼ねて、Hadoop 2.2から2.3へのアップグレード手順を確認する

* 細かいバックアップ手順などは書かない
* 本番環境だと以下のような手順が追加で必要だが省略
  * fsimage, editsを保存する
  * hdfs dfs -ls -R や hdfs fsck の結果を保存する

## HDFS

### 2.2のクラスタを終了する

* namespaceを保存

```bash:
$ hdfs dfsadmin -safemode enter
$ hdfs dfsadmin -saveNamespace
```

* 以前のファイルシステムの状態を削除 (2.2より過去にrollbackできなくする)

```bash:
$ hdfs namenode -finalize
```

* NameNodeとDataNodeを停止

ちなみに、2.2のlayoutVersionは-47

```bash:
$ cat /hadoop/dfs/name/current/VERSION
#Thu Feb 13 03:00:08 JST 2014
namespaceID=704993338
clusterID=CID-9f7a17e5-30dd-436e-82eb-743fe908cf17
cTime=0
storageType=NAME_NODE
blockpoolID=BP-149344879-127.0.0.1-1392166808826
layoutVersion=-47
```

### 2.3のクラスタへ移行する

* tarを展開して設定ファイルを除いてまるごと差し替え

* 2.3のlayoutVersionは-51のため、普通に起動しようとすると以下のエラーで起動に失敗する

```xml:NameNodeログ
2014-02-13 03:28:39,704 WARN org.apache.hadoop.hdfs.server.namenode.FSNamesystem: Encountered exception loading fsimage
java.io.IOException: 
File system image contains an old layout version -47.
An upgrade to version -51 is required.
Please restart NameNode with -upgrade 
```

* upgradeオプションを付けて起動する

```bash:
$ cd $HADOOP_HOME/sbin
$ ./hadoop-daemon.sh --script hdfs start namenode -upgrade
```

upgrade成功時のログ

```xml:NameNodeログ
2014-02-13 03:31:14,524 INFO org.apache.hadoop.hdfs.server.namenode.FSImage: Sta
rting upgrade of image directory /hadoop/dfs/name.
   old LV = -47; old CTime = 0.
   new LV = -51; new CTime = 1392229874523
2014-02-13 03:31:14,544 INFO org.apache.hadoop.hdfs.server.namenode.FSImage: Saving image file /hadoop/dfs/name/current/fsimage.ckpt_0000000000000000035 using no compression
2014-02-13 03:31:14,557 INFO org.apache.hadoop.hdfs.server.namenode.FSImage: Image file /hadoop/dfs/name/current/fsimage.ckpt_0000000000000000035 of size 1354 bytes saved in 0 seconds.
2014-02-13 03:31:14,567 INFO org.apache.hadoop.hdfs.server.namenode.FSImageTransactionalStorageInspector: No version file in /hadoop/dfs/name
2014-02-13 03:31:14,589 INFO org.apache.hadoop.hdfs.server.namenode.FSImage: Upgrade of /hadoop/dfs/name is complete.
```

layoutVersionが変わったことが確認できる

```bash:
$ diff /hadoop/dfs/name/current/VERSION /hadoop/dfs/name/previous/VERSION
1c1
< #Thu Feb 13 03:31:14 JST 2014
---
> #Thu Feb 13 03:20:08 JST 2014
4c4
< cTime=1392229874523
---
> cTime=0
7c7
< layoutVersion=-51
---
> layoutVersion=-47
```

* ここで`hdfs dfs -ls -R /`を実行して、ファイルやディレクトリの欠落がないかどうか確認してから、DataNodeを起動する

  * ちなみに、`hdfs dfs -ls R /`ではsnapshot一覧は確認できない
  * `hdfs lsSnapshottableDir`でsnapshotのディレクトリ一覧を取得して、そのパスに都度lsする必要がある。。。めんどい
MovableTypeでtableを年別グルーピング化してみた覚書

# 概要
MTテンプレートで、年表を年別にグルーピングしてみた。
投稿した記事の日付で判定しグループ処理にしています。
グループ化するためには、年別で記事のカウントをしなければいけないため
アーカイブテンプレートのブログ記事でテンプレートを作りました。
# アーカイブテンプレート
```
<div class="inner">
<table border="0" cellspacing="0" cellpadding="0" class="companyTbl">
<$mt:SetVar name="currentYear" value="0"$>
<MTArchiveList archive_type="Yearly">
<mt:Entries sort_by="authored_on" sort_order="descend">
<$mt:EntryDate format="%Y" setvar="year"$>
    <tr>
    <mt:If name="year" ne="$currentYear">
        <th rowspan="<$mt:EntriesCount$>"><$mt:Var name="year"$>年</th>
    </mt:If>
        <td><$mt:EntryDate format="%m月"$></td>
        <td><mt:text_item></td>
    <$mt:SetVar name="currentYear" value="$year"$>
    </tr>
</mt:Entries>
</MTArchiveList>
</table>
</div><!--/inner-->
```
限定継続でAmb

#amb
ambは非決定性計算をしてくれるカッコイイオペレータである。
[Rosetta CodeにあるAmbの例題](http://rosettacode.org/wiki/Amb)を[前回の限定継続](http://qiita.com/ctrl_alt_george/items/df35cd3cb16dfe97e09c)を利用して解いてみる。

#コード
NotUseAmbをdefineすると今回用意したambの代わりにリストモナドを使う。

```fsharp

open FsControl.Core.Types
open FsControl.Core.TypeMethods
open FsControl.Core.TypeMethods.Applicative
open FsControl.Core.TypeMethods.Monad

//https://github.com/gmpl/FsControl/blob/master/FsControl.Core/Samples/Haskell.fsx
let inline return' x = Inline.instance Pure x
let inline (>>=) x (f:_->'R) : 'R = Inline.instance (Bind, x) f 
type DoNotationBuilder() =
    member inline b.Return(x)    = return' x
    member inline b.Bind(p,rest) = p >>= rest
    member        b.Let (p,rest) = rest p
    member    b.ReturnFrom(expr) = expr
let do' = new DoNotationBuilder()


#if NotUseAmb
#else

let runCont = Cont.run

#endif

let callCC' = Cont.callCC
let inline when'  p s = if p then s else return' ()
let inline unless p s = when' (not p) s

let returnCont :'a->Cont<'b, 'a> = return'

#if NotUseAmb

let amb (lst:List<_>) = lst
let require condition = if condition then [()] else []
let reset k = k
let runCont a b = b(a)

#else

let reset e = returnCont <| runCont e id
let shift e = Cont <| fun k -> e (returnCont << k) |> runCont <| id

let amb lst = shift <| fun k -> do'{
    lst
    |> List.iter (fun x -> ignore <| do'{
        do! (k x)
    })
    return ()
}
let require condition = shift <| fun k -> do'{
    if condition then
        do! k ()
        return ()
    else
        return ()
}

#endif

[<EntryPoint>]
let main argv = 

    let isFollowedBy (a: string) (b: string) =
        a.[a.Length - 1] = b.[0]

    reset <| do'{
        let! first = amb ["the"; "that"; "a"]
        //printfn "a1"
        let! second = amb ["frog"; "elephant"; "thing"]
        //printfn "a2"
        do! require(first |> isFollowedBy <| second)
        //printfn "r1"
        let! third = amb ["walked"; "treaded"; "grows"]
        //printfn "a3"
        do! require(second |> isFollowedBy <| third)
        //printfn "r2"
        let! forth = amb ["slowly"; "quickly"]
        //printfn "a4"
        do! require(third |> isFollowedBy <| forth)
        //printfn "r3"
        printfn "%A" (first, second, third, forth)
        return ()
    }
    |> runCont <|
        fun _ -> printfn "end"

    0

```

#つか
F#って#define書けないのな^^;
# bashと数年付き合ったが、zshに浮気した！しかもたまに共存

かといって、shellを書き換えるのは面倒
複数台ある場合とか、もしかしたらzshが入ってない環境とかぁぁぁ

もうbashで起動して
zshがあれば、使う
なければ、bashでいいか

ってレベルでの浮気です！！

.bash_profile

```
if [[ -s /bin/zsh ]] ; then
    exec /bin/zsh
else
  if [[ -s ~/.bashrc ]] ; then
    . ~/.bashrc
  fi
fi
```

.zshrc

```
if [[ -s ~/.bashrc ]] ; then
  . ~/.bashrc
fi
```

今回は手抜きやけど、こんな感じで！！
bash,zsh両方使ってます！！
Docker Meetup Tokyo #1 に参加してきた


Docker Meetup Tokyoに行ってきた。

# Docker と InfiniBand で実現するコンテナ内高速ネットワーク通信の試み

@syoyoさん

InfiniBand: なんかイーサネットよりすごい早く通信できる仕組みらしい。

http://qiita.com/syoyo/items/bea48de8d7c6d8c73435


# Hack for Docker's Network

@hansodeさん

## コンテナ間を制御する仕組み

Inter-Container Communication(ICC)

iptables ALLOW -> DENY になる

## 特定のコンテナ間の通信のみ許可したい

Link Containers

iptablesのsprt定義を生成する部分にバグがあるらしい。

## Dockerに任意のIPを割り当てる機能はない

→ pipeworkを使う

pipeworkはdockerに依存していない

## DockerHostを超えてコンテナを繋ぐには?

http://tech.riywo.com/blog/2013/12/20/fluentd-on-mesos-plus-docker-plus-marathon/

枯れた技術がない

# "Up" with Vagrant and Docker

三浦広志(github.com/miurahr)さん

Vagrant 1.4 から Docker provisioner 標準搭載

Docker環境をVagrant上のOSに簡単に構築してくれる


# Docker と継続的インテグレーション

@superbrothers さん

DockerイメージもCIで回す!


# NIIクラウドチームとDocker

谷沢智史さん

DockerをIaaSに組み込む利点

・Reproducibility
・Protability
・Supervision

DockerHostでtopするだけである程度ボトルネックの当たりを付けられるのは確かにいいかもと思った。



# みんなの発表を聞いて感じられた課題

## DockerHostを超えてコンテナを繋ぐ決定打がない

うちのチームでも @reoring がいろいろ試していて [Elasticsearch - Ambassadorパターンを使った複数のDockerホストにおけるコンテナ間通信 - Qiita](http://qiita.com/reoring/items/75817a01f719328b99fe) が今のところ一番ベターとのことらしいけど、まだまだ改善の余地がありそう。

## データをどこに置くか?

* データをホストに置いて、VOLUMEでマウントする
* データを持つコンテナを作って他のコンテナを繋ぐ
* 外部にデータサーバを作ってコンテナがNFSでマウントする

複数方法があるけど、ここらへんはみんな試行錯誤しているという印象。


## DockerHostにどこまで依存すべきか?

データとも関連した課題だけど、例えば、DockerHostでファイアウォールを作っちゃうと、そのファイアウォールはdisposable infrastractureじゃなくなるなど、何をDockerHostでやって何をコンテナにすべきかというプラクティスはまだ確立されてないのかなという感触。

いずれもDockerユーザ共通の課題のようなので、そう遠くない未来に解決されそうな気もする。
rsyncの--bwlimitはキロバイトで指定する

bps の b は bit なので bps は bits/second です

rsync の `--bwlimit` オプションは kilobytes/second です

man から引用します

`--bwlimit=KBPS`

> This option allows you to specify a maximum transfer rate in __kilobytes per second__.
> This option is most effective when using rsync with large files (several megabytes and  up).
> Due  to the  nature  of  rsync transfers, blocks of data are sent,
> then if rsync determines the transfer was too fast, it will wait before sending the next data block.
> The result is an average transfer rate equaling the specified limit. A value of zero specifies no limit.

小文字の b なら bit で，大文字の B なら byte を指す事が多いらしいけど，決まっているわけではないので一つ一つ確認して間違えないようにしましょう
nginxで複数のnode.jsにURLのパス毎にリバースプロキシしたメモ

この記事参考にした。サンクス！
http://qiita.com/tomo_watanabe/items/484aa9bfb7bc4206ffed

で、やったこと
vi /etc/nginx/conf.d/default.conf
を以下のように編集。
upstream node-mms {
    server localhost:3980;
}

server {
    listen       80;
    server_name  localhost;
    location /karuta{
       proxy_pass http://127.0.0.1:9001;
       proxy_http_version 1.1;
       proxy_set_header Upgrade $http_upgrade;
       proxy_set_header Connection "upgrade";
    }

    location /{
       proxy_pass http://127.0.0.1:9002;
       proxy_http_version 1.1;
       proxy_set_header Upgrade $http_upgrade;
       proxy_set_header Connection "upgrade";
    }

で、/karutaの方のHTMLでsocket.io.js読むときにポートも指定して読むように変更。
<script src="http://mikumikuplay.com:9001/socket.io/socket.io.js" type="text/javascript"></script>
こうしないと、別の9002番ポートから読んでしまって接続できなかったとさ。

これで初音ミクオンラインゲームの
ミクミクすごろく(http://mikumikuplay.com/sugoroku/)
ミクミクかるた(http://mikumikuplay.com/karuta/)
がVPS上で動くようになった！おｋ！
ImageのLazy Loadingに関するメモ書き

メモ書き。コードは断片的です。

SDWebImageを使うと簡単に非同期画像ロードはできるのだけど、UITableViewに入れた場合などに必要以上に画像を読み出しに行ってしまい、最終的にユーザが表示したい画像のロードが遅くなってしまう。
かといって、単純に遅延を入れる構成にすると、キャッシュに入っているはずの画像読み込みも遅延してしまい残念な感じになる。キャッシュはさくっと、ネットワーク経由はlazyにかつ効率的に読みたい。

そんなわけで、僕はイメージ周りにはJMImageCacheを利用中。

cacheされたイメージを取得できるので、キャッシュに有る場合には即時表示。

```objc
    JMImageCache *jmCache = [JMImageCache sharedCache];
    UIImage *cachedImage = [jmCache cachedImageForURL:imageUrl];
    if(cachedImage){
        imageView.image = cachedImage;
        return;
    }
```

そして、キャッシュに無い場合には、一定時間待ってからイメージが必要かどうかを再確認して、非同期ロードを開始する。isValidには、イメージロードが必要かどうかの判定ブロックを渡す。

```objc
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC);
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        if(!isValid()){
           return;
        }
        [jmCache imageForURL:imageUrl 
         completionBlock:^(UIImage *image) 
        {
           imageView.image = image;
        }
         failureBlock:^(NSURLRequest *request, NSURLResponse *response, NSError *error)        
        {
        }];
    });
```

あとは、表示する場所に応じて適切なisValidブロックさえ考えればOK。
スクロール途中のイメージ読み込み等をまとめてスキップできるので、体感速度が大幅にアップします。
Medium を使ってみた... そして、そっと閉じた

## 経緯

- [Mediumが推奨するラジカルなブログの新スタイルは主流となるか？ - ICHIROYAのブログ](
http://kyouki.hatenablog.com/entry/2013/10/27/054148)
- [「はてなブックマーク」の未来はどうなる？　新しいブログのプラットフォームMediumのCollection機能がもたらすもの！ - ICHIROYAのブログ](
http://kyouki.hatenablog.com/entry/2014/02/11/073435)

を読んで、試しに登録してみた。

## こんな感じ

- [Medium を試してみる — Medium](
https://medium.com/p/b61bd160a588)
- [Medium で困った事 — Medium](
https://medium.com/p/8334d19c8244)
- [埋め込む - Medium の使い方 — Medium](
https://medium.com/p/3b3ab4baf7)

## 感想

編集は気持ちいいし、必要最低限なシンプルな感じがとてもイイ。

が、collections が作成できない。collections のタイトルは ASCII だけなのかな??面倒くさくなって検証はしていない。

そして、Gist の埋め込みができない。[Embedly](http://embed.ly/) を利用しているため、埋め込みに対応しているサービスは多いと銘打っているが。

- [Code Medium — Medium](
https://medium.com/p/492ed410bed5)
- [Twitter / hirodusk: @Medium Great! Just found ...](
https://twitter.com/hirodusk/status/282743255647539200)

他にも、些細な点が気になり... そっとページを閉じた。
C++11 STL Container Efficiency その３（重複除去)

各STLコンテナの効率比較調査その３。範囲指定で挿入し、重複要素を取り除く。

##調査データ
同じ値の要素が２つずつある整数100万要素とする。

```cpp
static const int N = 1000000;
std::vector<int> elems(N, 0);
for (int i = 0; i < N; i+=2) {
    elems[i  ] = i;
    elems[i+1] = i;
}
```

##調査コード
対象コンテナは vector, deque, list, set, unordered_set の5つ。

```cpp
// vector
std::vector<int> v;
v.insert(v.end(), elems.cbegin(), elems.cend());
std::sort(v.begin(), v.end());
v.erase(std::unique(v.begin(), v.end()), v.end());
```

```cpp
// deque
std::deque<int> d;
d.insert(d.end(), elems.cbegin(), elems.cend());
std::sort(d.begin(), d.end());
d.erase(std::unique(d.begin(), d.end()), d.end());

```

```cpp
// list
std::list<int> l;
l.insert(l.end(), elems.cbegin(), elems.cend());
l.sort();
l.erase(std::unique(l.begin(), l.end()), l.end());
```


```cpp
// set
std::set<int> s;
s.insert(elems.cbegin(), elems.cend());
```


```cpp
// unordered_set
std::unordered_set<int> us;
us.insert(elems.cbegin(), elems.cend());
```

##結果

|コンテナ|メンバ関数|時間|
|:--|:--|--:|
|vector|insert()|68 ms|
|deque|insert()|80 ms|
|list|insert()|664 ms|
|set|insert()|509 ms|
|unordered_set|insert()|246 ms|

測定環境: Intel Core i7-4850HQ 2300 MHz (4 cores), Apple LLVM version 5.0