OmniAICreator/Qiita-1.07M huggingface dataset:
複数のラジオボタンに全てチェックが入っているかでバリデーションするJquery

```lang:js

$(function () {
   //チェックされているラジオボタンの数を数える
   var $checked_radio_count = $(".radio_button_wrapper").find('input[type="radio"]:checked').size();
   //ラジオボタンが入っているdivの数を数える
   var $radio_count = $(".radio_button_wrapper").size();

   //送信ボタンを押したときにバリデーション
   $(".submit_button").click(function(){
      if($checked_radio_count != $radio_count){
      alert("ラジオボタンが全てチェックされていません");
      return false;
      }
   }
});
```

```lang:html
<!--２種類のラジオボタン-->
<div class="radio_button_wrapper">
   <input id="marriage_1" name="marriage" type="radio" value="1">
   <label for="marriage_1"> 結婚していない</label><br>
   <input id="marriage_2" name="marriage" type="radio" value="2">
   <label for="marriage_2"> 結婚している</label>
</div>

<div class="radio_button_wrapper">
   <input id="gender_1" name="gender" type="radio" value="1">
   <label for="gender_1"> 男</label><br>
   <input id="gender_2" name="gender" type="radio" value="2">
   <label for="gender_2"> 女</label>
</div>

<!--送信ボタン-->
<button type="submit" class="submit_button">送信する</button>
```
Xcode6で言語設定の切り替えが簡単になった


[iOS - Xcode6.1のシミュレータで日本語やキーボードが使えないときの対処法 - Qiita](http://qiita.com/ShingoFukuyama/items/93206a6bc702ddba18f1)という記事で、引数を用いて切り替える方法が紹介されていました。

Xcode5まではそれしか出来ませんでしたが、6からは以下のようにリストボックスから選べるようになって、より便利になっています。



![Screen Shot 2014-10-18 at 9.39.16 AM.png](https://qiita-image-store.s3.amazonaws.com/0/19398/af4273ec-713b-2855-3444-48e4aca64296.png "Screen Shot 2014-10-18 at 9.39.16 AM.png")



ちなみにデバッグ実行時のみ有効で、一旦切断してからホームアイコン経由で再起動するとシミュレーターなどの言語環境での起動に戻ります。
(そしてXcode6・シミュレーターだとこの変がバグってるっぽいので、このように起動オプションで明示的に指定する必要がありそう)
Yes/Noで答えるプロンプト

ちょっとしたshellscriptを書いていたときに分からなかったので調べた。zsh, bashでreadコマンドのオプションが違ったのでメモしておく。

``` zsh
#!/bin/zsh
while true; do
  read Answer\?'Do you like coffee? [Y/n]'
  case $Answer in
    '' | [Yy]* )
      echo Yes!
      break;
      ;;
    [Nn]* )
      echo No!
      break;
      ;;
    * )
      echo Please answer YES or NO.
      ;;
  esac
done
```

``` bash
#!/bin/bash
while true; do
  read -p 'Do you like coffee? [Y/n]' Answer
  case $Answer in
    '' | [Yy]* )
      echo Yes!
      break;
      ;;
    [Nn]* )
      echo No!
      break;
      ;;
    * )
      echo Please answer YES or NO.
  esac
done;
```
マミルトンのゲーム実況動画でニコニコする ffmpeg RMagick rekognition を使おう～その２～ヽ(ﾟｰﾟ*ヽ)(ﾉ*ﾟｰﾟ)ﾉわぁい

※Ubuntuは12.04系です

笑顔は国境を超えます。はい。マミルトンのゲーム実況動画ご覧になりましたか？マミルトンはゲーム実況動画を配信している女性です。さくらんぼのへたを口で結ぶこともできるそうです。ゲーム実況動画ではありませんが↓はオススメ動画です。

![mamiruton](http://img.youtube.com/vi/nYU54O92vVo/mqdefault.jpg)
[【さくらんぼ】マミルトンが口の中でへたを結ぶ動画](https://www.youtube.com/watch?v=nYU54O92vVo)

※ステマじゃないよ

# 前回までのおさらい

[前回のその１はこちら](http://qiita.com/scleen_x_x/items/748452b069f18124376b)

## マミルトン動画から笑顔を抽出

動画の最初の60秒から ffmpeg を使って1秒ごとにフレームを抜き出して、rekognitionのAPIを使って笑顔の度合いを数値化しました。

# 今回の目標

## マミルトン動画を笑顔指数でランキング化

前回までの結果をつかって、ループして笑顔指数でソートします :smile: 

## できたぁ ヽ(ﾟｰﾟ*ヽ)(ﾉ*ﾟｰﾟ)ﾉわぁい

ということで、マミルトン動画でニコニコ、幸せになれる動画ランキングです！！！独自の笑顔指数でランキングしました。幸せになれる動画ランキングになったはずです。上位は笑顔がほんとに多い動画になりました。納得感あり！お休み中や仕事の合間にどうぞ :smile:

 * https://www.youtube.com/watch?v=a2ZNXvBXKtk 71.56pt
 * https://www.youtube.com/watch?v=_SonTH5ovE0 65.91pt
 * https://www.youtube.com/watch?v=cWk3CPLsDjo 65.29pt
 * https://www.youtube.com/watch?v=g1yOUQhdcAs 53.26pt
 * https://www.youtube.com/watch?v=AzsY9XpFgCA 47.13pt
 * https://www.youtube.com/watch?v=NNpOTng4b40 34.97pt
 * https://www.youtube.com/watch?v=lwSyWz4AKiQ 25.28pt
 * https://www.youtube.com/watch?v=izPkMwQyfPY 15.02pt
 * https://www.youtube.com/watch?v=9EQxF4z3bZU 12.52pt
 * https://www.youtube.com/watch?v=dmCtyZDsLLw ポイント算出できず
 * https://www.youtube.com/watch?v=HPHt3ICdjaI ポイント算出できず

### 課題

 * 屋外の収録だと顔が映る時間自体が短い
 * この動画 https://www.youtube.com/watch?v=dmCtyZDsLLw のように顔が小さい動画の場合の検出は難しい

## 笑顔指数について

 * 動画冒頭60秒で計測
 * 1秒ごとのフレームで画像を分析
 * マミルトンだけじゃなくて、誰でもOK
 * Rekognition の happy, smile の値を使う
 * 小さい顔は無視する ※片仮名のテロップ「デ」とかが顔に認識されるので

## ランキング

# 次回以降予告

 * マミルトンの顔を学習させてマミルトンだけを笑顔指数の対象にします
 * マックスむらいバージョンもつくります :smile:
 * YouTube Data API について書きます
 * ruby google-api-client について書きます
 * 笑顔部分を抜き出して連結した動画をつくります ffmpeg
Arduino で new, delete を使えるようにするには

### 方法

Arduino の開発言語は C++ だが、デフォルトでは new, delete 演算子が使用できない。
これでは何かと不便。

new, delete を使用したい時には new.h をインクルードする。

```cpp
#include <new.h>
```

### 注意点

Arduino はメモリサイズがPCに比べると非常に小さい。
（Arduino UNO では 32kb（スケッチ含めて）、Arduino Mega でも 256kb）
動的メモリを確保するときは残り要領に十分気を付けて使用する必要がある。
FactoryGirl.createをオーバーライドする


FactoryGirl、便利ですよね。
ただ、Rails界隈の多くのライブラリの例に漏れず、実装がイマイチ追いにくい、そのせいで公式のドキュメントで書かれている範囲を超えてカスタマイズしようとするとめっちゃ大変、という。

今回僕が遭遇したケースでは、DB上のレコードを操作したユーザーが誰なのか保存しておきたかったので、通常の `save` メソッドを `save_with_creator(user)`というもので置き換えていて、内部で `save` ではなくこちらのメソッドを呼びたいなーと思って、createのオーバーライドという所に行き着きました。
毎回、`build`してから明示的に上記の `save_with_creator` を呼ぶのも面倒なので。。

## コード

```spec/supports/our_create_strategy.rb
class OurCreateStrategy
  # FactoryGirlデフォルトのcreateを上書き
  # factory_girl-4.4.0/lib/factory_girl/strategy/create.rb の内容をちょっとだけ変更したものです
  def association(runner)
    runner.run
  end

  def result(evaluation)
    evaluation.object.tap do |instance|
      evaluation.notify(:after_build, instance)
      evaluation.notify(:before_create, instance)
      if instance.respond_to? :save_with_user!
        instance.save_with_user! @@creator
      else
        instance.save!
      end
      evaluation.notify(:after_create, instance)
    end
  end
end
```

```spec/rspec_helper.rb
RSpec.configure do |config|
  FactoryGirl.register_strategy(:create, OurCreateStrategy)
end
```

### 解説

`FactoryGirl.register_strategy` ではStrategyパターンに基づいて、メソッドを定義しているのですが、結局最終的には `define_method` が呼ばれています。 `define_method`が複数回呼ばれたときには、単に過去のメソッドを上書きするので、今回のように後から実行した`FactoryGirl.register_strategy`が有効になる、ということになります。

## 参考

* [RSpecにおけるFactoryGirlの使い方まとめ](http://qiita.com/muran001/items/436fd07eba1db18ed622#2-12)
Githubのブランチ削除

#やりたいこと

Githubのブランチ削除したい

# やりかた

前提：originはgithubリポジトリ

```
$ git push origin branch
```

は

```
$ git push origin branch(local):branch(remote)
```

の意味なので

```
$ git push origin :branch
```

とすれば空がpushされて削除扱いになる


#参考
[復習 Git: GitHub のブランチを削除する．](http://passingloop.tumblr.com/post/18015576208/remove-remote-branches-by-git-push)

---
#追記

![ブランチ削除１.png](https://qiita-image-store.s3.amazonaws.com/0/54295/9f6a622b-f199-3317-ca37-ca70c5dd467d.png)

#↓

![ブランチ削除２.png](https://qiita-image-store.s3.amazonaws.com/0/54295/9c1d3050-410f-689a-7190-8866e4464bfa.png)

でいいんじゃね
Yosemiteをクリーンインストールしたメモ


option押しながら電源ONしてもリカバリが表示されないため、インストールディスクを作ることにした。


Command + r でリカバリ起動とのこと。

http://support.apple.com/kb/HT4718


# インストールディスク作成

* 10.10にて作業。
* 外付けHDDのPATHを /Volume/install とする。
* Yosemiteインストーラーをダウンロード済みであること。

```bash:
$ cd "/Applications/Install OS X Yosemite.app/Contents/Resources"

$ sudo ./createinstallmedia \
  --volume /Volumes/insall \
  --applicationpath "/Applications/Install OS X Yosemite.app"
Ready to start.
To continue we need to erase the disk at /Volumes/insall.
If you wish to continue type (Y) then press return: y
Erasing Disk: 0%... 10%... 20%... 30%...100%...
Copying installer files to disk...
Copy complete.
Making disk bootable...
Copying boot files...
Copy complete.
Done.
```

## リカバリ

外付けHDDから起動すればよい。
インストール直後の使用量


![スクリーンショット 2014-10-18 6.59.50.png](https://qiita-image-store.s3.amazonaws.com/0/25728/76dffca7-da28-6329-b836-32c138bb6442.png)


![スクリーンショット 2014-10-18 7.00.36.png](https://qiita-image-store.s3.amazonaws.com/0/25728/1c46f9a6-b5a1-867a-c4f0-23362a21b2c4.png)



# アプリケーションのインストール

## homebrewのインストール

```bash:
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

## packerのインストール

```bash:
brew tap homebrew/binary
brew install packer
```


## vagrant

* [vagrant](http://www.vagrantup.com/downloads.html)


## XQuartz 2.7.7

* インストール15分くらいかかるので気長に待つ。

## Sequel Pro

* [Sequel Pro](http://www.sequelpro.com/download)


## その他brewでinstall

```bash:
brew install \
  tig \
  autossh ssh-copy-id \
  ansible \
  zsh \
  sdl \
  ranger w3m wget
```

* [zshでpreztoを使う手順 - Qiita](http://qiita.com/tukiyo3/items/2c3b3a5f53ebcb83cffc)
selenium2での記述サンプル　--ignore-certificate-errorへの対応

---
基本的な使い方。
Optionで"test-type"を渡してやらないと--ignore-certificate-errorがどうしたこうしたというエラーがでる。

###ソース

```test.java
package com.html.sample;
import java.util.Arrays;

import org.junit.BeforeClass;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

public class Sample01 {

 @BeforeClass
 public static void Setup() {
  System.setProperty("webdriver.chrome.driver", "./driver/chromedriver");
 }

 @Test
 public void test() {
	 
	 //WebDriverのオプションを定義
	 ChromeOptions options = new ChromeOptions();
	 //--ignore-certificate-errorの出力を防止する
	 options.addArguments("test-type");
	 
	 WebDriver driver = new ChromeDriver(options);
	
	 //googleにアクセス
	 driver.get("http://www.google.co.jp");
	 
	 //検索要素を指定
	 WebElement element = driver.findElement(By.id("gbqfq"));
	
	 //検索Keyを設定
	 element.sendKeys("apple 新製品");
	
	 //検索
	 element.submit();
	
	 //終了
	 driver.quit();
 }
}
```
YosemiteでMAMPのApacheが起動しないことへの対応

---
YosemiteでMAMPのApacheが起動しない。2.x, 3.x両方で発生。

/Applications/MAMP/Library/binのenvvarsを_envvarsにリネームすることで起動する。

```sample.sh
/Applications/MAMP/Library/bin/mv envvars _envvars
```

という感じ。
その後、MAMPにて再度、サーバを起動するとApacheが起動です。
rubyでSQL文をパースする


SQLをパースすることに迫られてPythonで自作していたが、rubyで書いたほうがより都合が良かったので書きなおしかーとなったところで見つけたいいもの。
ただし、READMEにどおりに使ってみても使えなかったのでメモ。
#インストール
このモジュールを使えばパースできる。
https://github.com/cryodex/sql-parser

gemでのインストールは以下のようにする。

```
$ sudo gem install sql-parser
```

#実行（失敗）
GitHubページのREADMEを見ながら実行してみる。
しかし、どれもメソッドが無いと怒られる。

```ruby
irb(main):001:0> require 'sql-parser'
irb(main):002:0> parser = SQLParser::Parser.new
irb(main):003:0> ast = parser.scan_str('SELECT * FROM users WHERE id = 1')
irb(main):004:0> ast.select_list.to_sql
NoMethodError: undefined method `select_list' for #<SQLParser::Statement::DirectSelect:0x007f90cba20158>
	from (irb):4
	from /usr/bin/irb:12:in `<main>'
irb(main):005:0> ast.table_expression.to_sql
NoMethodError: undefined method `table_expression' for #<SQLParser::Statement::DirectSelect:0x007f90cba20158>
	from (irb):5
	from /usr/bin/irb:12:in `<main>'
irb(main):006:0> ast.table_expression.where_clause.to_sql
NoMethodError: undefined method `table_expression' for #<SQLParser::Statement::DirectSelect:0x007f90cba20158>
	from (irb):6
	from /usr/bin/irb:12:in `<main>'
irb(main):007:0> ast.table_expression.where_clause.search_condition.to_sql
NoMethodError: undefined method `table_expression' for #<SQLParser::Statement::DirectSelect:0x007f90cba20158>
	from (irb):7
	from /usr/bin/irb:12:in `<main>'
irb(main):008:0> ast.table_expression.where_clause.search_condition.left.to_sql
NoMethodError: undefined method `table_expression' for #<SQLParser::Statement::DirectSelect:0x007f90cba20158>
	from (irb):8
	from /usr/bin/irb:12:in `<main>'
irb(main):009:0> ast.table_expression.where_clause.search_condition.right.to_sql
NoMethodError: undefined method `table_expression' for #<SQLParser::Statement::DirectSelect:0x007f90cba20158>
	from (irb):9
	from /usr/bin/irb:12:in `<main>'
```

この時点で心折れそうになった。
色々試した苦労話はあるのだけれどもろもろ省略。
astの中身をよく見ると、query_expressionの下に色々あるみたい。
メソッド名もREADMEと違ったりしていたので、以下に自分が成功した例を記述。

#実行（成功）

```ruby
irb(main):001:0> require 'sql-parser'
irb(main):002:0> parser = SQLParser::Parser.new
irb(main):003:0> ast = parser.scan_str('SELECT * FROM users WHERE id = 1')
#識別子取得
irb(main):027:0> ast.query_expression.list.to_sql
=> "*"
#FROM以下の取得
irb(main):011:0> ast.query_expression.table_expression.to_sql
=> "FROM `users` WHERE `id` = 1"
#WHERE以下のドリルダウン
irb(main):012:0> ast.query_expression.table_expression.where_clause.to_sql
=> "WHERE `id` = 1"
irb(main):013:0> ast.query_expression.table_expression.where_clause.search_condition.to_sql
=> "`id` = 1"
irb(main):014:0> ast.query_expression.table_expression.where_clause.search_condition.left.to_sql
=> "`id`"
irb(main):015:0> ast.query_expression.table_expression.where_clause.search_condition.right.to_sql
=> "1"
```
joinコマンドでゼロ埋め

##目的
```bash:input
$cat list1
aaa     111
bbb     222
ccc     333
ddd     444

$cat list2
bbb     555
ccc     666
ddd     777
eee     888
```

上記の2ファイルを結合して下記のようにしたい。

```bash:output
aaa 111 000
bbb 222 555
ccc 333 666
ddd 444 777
eee 000 888
```

##手順
```bash
$join -a 1 -a 2 -o 0,1.2,2.2 -1 1 -2 1  -e "000" <(sort list1) <(sort list2)
```
NginxでSSLv3を無効にする設定を書きました

# NginxでSSLv3を無効に
nginxにSSLv3を無効にする設定を書きました。CentOSです。

```
sudo vi /etc/nginx/conf.d/ssl.conf
```
ssl.confというファイルに設定を元々書いていたので、コチラに追加しました。

```nginx:Nginxの設定ファイル
server {
    listen       443 ssl;
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2; # SSLv3を使用しないように追加
    
    # 以下略
}
```
ポート443をlistenしているとsslの設定を書いている箇所にssl_protocolsを追加しました。
 
nginxを再起動

```
sudo /etc/init.d/nginx restart
```
SSL3.0のみを許可したブラウザでSSLのページにアクセスするとページが表示されなくなりました。

#参考
http://nginx.com/blog/nginx-poodle-ssl/
Nexus5にAndroid 5.0を入れる

# Download

http://developer.android.com/preview/index.html

こちらからダウンロードします。

## なんか上手くダウンロードされない？

なぜかわかりませんがダウンロード用のボタンらしきものが出なかったので
DeveloperToolを開き直で呼び出す。

```js
onDownload($("a[href=#download]")[0]) //Nexus5
onDownload($("a[href=#download]")[1]) //Nexus7(2013)
```

ん〜　成功したりもするから　よくわからないですね。

# Install

ブートローダーをアンロックします。さらば保証！

```bash
$ adb reboot bootloader
$ fastboot oem unlock
```

そしたら　ダウンロードしたファイルの解答したディレクトリ内にカレントディレクトリを移し

```bash
$ ./flash-all.sh
```

完了

ヌルヌルです。
Nexus7(2012)にも降ってくることを期待しつつとりあえず今はこれで
遊んでみようと思います。
Promise を使った同期処理

大量のリソースを負荷をかけずにXHRさせたり、ストレージに大量のデータを保存したりを、同期処理で実現したいケースがあります。Promise を使った例が見つけられなかったので書いてみました。

XHRしたりデータを保存する部分は冗長なので、1秒おきにコンソールに数字を表示するものを例とします。

```
var count = 0;

var wait = function() {
  return new Promise(function(resolve, reject) {
    // 1秒待ちを入れてコンソールに数字を表示する
    setTimeout(function() {
      console.log(count++);
      resolve();
    }, 1000);
  });
};

// 最後の Promise を保持
var last_promise = wait();
for (var i = 0; i < 10; i++) {
  // 動的に .then() チェーンで繋いでいく
  last_promise = last_promise.then(wait);
}
```

こんだけ。
[動くサンプル](http://jsbin.com/sowedo/1/edit)

似たようなことをもっと簡単にやる方法があれば教えて下さい。
Yosemiteにしてbrew doctorするclangがない！と怒られる場合の対応

Yosemiteにする際に`/usr/local`がどうのこうの。。。という問題もあったし、brewの動きを確かめるために`brew doctor`してみたら

    Error: No such file or directory - /Library/Developer/CommandLineTools/usr/bin/clang

などと言われるわけです。
一瞬おや？と思うけど、brewのinstall時を思い出して、慌てず騒がず

    xcode-select --install

を実行して、コマンドラインツールを入れればOK。その後`brew doctor`した際

    Warning: Your Xcode (6.0.1) is outdated
    Please update to Xcode 6.1.
    Xcode can be updated from the App Store.

などと言われましたが、まだ AppStoreからはXcode 6.1 が落ちてこないので、しばし我慢ですね。

大した話でもないけど、時事ネタなので一応書いてみました。
俺俺Gitのalias＆ワンライナー集


個人的によく使用するgitのalias＋ワンライナー。
やっていることはただのShellScriptの操作ですが、忘備録を兼ねて記載。

### リポジトリの変更を一括で取り消し
```gitconfig
[alias]
	restart = reset --hard HEAD
```

```bash
$ git restart
```

リポジトリの作業内容を最後のコミットの状態に戻す(作業内容を全て初期化)ときに使用。
単純にHEADの内容に戻しているだけですが、何だかんだで便利です。
当たり前ですが、 **作業内容は全て吹き飛ぶので必要な分はコミットしてあることを確認してください**

<code>$ git reset</code>って何？という方はこちらの記事がわかりやすいです。

[git reset についてもまとめてみる](http://d.hatena.ne.jp/murank/20110327/1301224770)


### リポジトリにて削除されたファイルを、削除状態にしてIndexに登録する
```
[alias]
	delete-items = !git status | grep deleted: | awk '{print $2}' | xargs git rm
```

```bash
$ touch README.md
$ git commit -a -m "first commit"
$ rm README.md
$ git delete-items
$ git commit -a -m "remove : README.md"
```

毎回<code>$ git rm path/to/file</code>をするのが面倒になって作成。
やっていることは、working tree上でdeleted扱いになっているものをIndexに登録しているだけ。
単一のファイルのみであればtig上や、git rmでいいと思いますが、
数百のファイルをリポジトリで管理していて、そのファイルをディレクトリごと削除した等、
大量のファイルを削除したい時に役に立ちます。

### リポジトリに追加されたファイルを一括で削除
```
[alias]
	delete-add-items = !git status | awk '{print $1}' | xargs rm -rf
```

Finder上から大量のファイルをリポジトリに追加してしまった時などに役に立ちます。
やっていることはただ<code>rm -rf</code>をやっているだけなので、 **ファイルは削除されることに注意。**

### ローカルブランチの特定の文字を含んでいるブランチを一括削除
```bash
$ git branch | grep hoge | xargs -I % git branch -D %
```
この例で言うと、ブランチ名にhogeを含んでいるブランチを一括削除。
例で言うと、アプリビルド用のブランチなどを作った際に、build等、命名規則をつけて、
ビルドが終わった後に使用してます。
固定IPを設定しないでRaspberryPiに接続

PC側にインターネット共有を設定して、RaspberryPiをLANで繋ぐと
一定の法則でIPアドレスが割り当てられるので、ルールを知っているとSSHで接続したりするとき便利。

##Macの場合
インターネット共有でつないだ端末には無線LANでは10.0.2.0/24、有線の場合は192.168.2.0/24でIPが割り振られる。Macと有線LANで直接繋いだRaspberryPiは192.168.2.2となり、
`$ssh pi@192.168.2.2`で繋がる。

参考
http://weekly.ascii.jp/elem/000/000/136/136392/
https://discussionsjapan.apple.com/thread/10061520

## Windowsの場合
インターネット共有で繋いだ端末は192.168.0.0/24でIPが割り当てられるので、
Windowsと有線LANで直接繋いだRaspberryPiは192.168.0.2となり、
`$ssh pi@192.168.0.2`で繋がる。

参考
http://support.microsoft.com/kb/306126/ja



## その他の方法（mDNSを使う）

PC側にBonjourを、RaspberryPi側にavahi-daemonを入れればホスト名で接続できるらしい。
http://qiita.com/kasei-san/items/087e5b33207c214c8db6
子プロセス以下のプロセスツリーを強制終了

子プロセスを強制終了する場合、最もシンプルな実装では[`Process.Kill()`メソッド](msdn.microsoft.com/ja-jp/library/system.diagnostics.process.kill.aspx)を利用すればよい。

```csharp
void KillChildProcess(System.Diagnostics.Process process)
{
  process.Kill();
}
```

ただし、子プロセスがさらに別プロセス（自プロセスから見た子孫プロセス）を起動している場合、`Process.Kill()`メソッドでは子プロセスだけを強制終了し孫プロセス以下は生き残ってしまう。

Windows（XP以降？）ではOS標準で[taskkillコマンド](http://itpro.nikkeibp.co.jp/article/Windows/20051025/223388/)が提供されるため、同コマンドにより子プロセス以下のプロセスツリー全体を強制終了できる。

```csharp
void KillProcessTree(System.Diagnostics.Process process)
{
  string taskkill = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), "taskkill.exe");
  using (var procKiller = new System.Diagnostics.Process()) {
    procKiller.StartInfo.FileName = taskkill;
    procKiller.StartInfo.Arguments = string.Format("/PID {0} /T /F", process.Id);
    procKiller.StartInfo.CreateNoWindow = true;
    procKiller.StartInfo.UseShellExecute = false;
    procKiller.Start();
    procKiller.WaitForExit();
  }
}
```

C#のみで頑張る実装も考えられるが面倒くさそう。
→ http://msdn.microsoft.com/ja-jp/vstudio/aa569609#Question3 http://blogs.msdn.com/b/bclteam/archive/2006/06/20/640259.aspx 地獄っぽい
Action Extensionでメモのテキストを抽出したらタグが入ってた

iOS8のAction Extensionを使ってiOS標準のメモアプリのテキストを抽出したらHTMLタグが入ってました。
抽出対象のメモはこちら
![IMG_1675.PNG](https://qiita-image-store.s3.amazonaws.com/0/32460/f5a9c750-b59d-279c-fc98-46f72d299e72.png)

時間とかURLとか入力内容に応じてリンクが設定されることがありますが、これを抽出するとdivタグが入ってます。
ちなみに、メモアプリのテキストのKUTTypeはkUTTypePlainTextです(swift)。

抽出したデータはこちら

`メモ<div>12:30</div><div>http://Google.com</div>`

他のアプリからテキストを抽出してExtensionで処理しようとする場合は見かけのテキストだけではなくタグが入ってくることもあるので、必要に応じてタグを取り除く処理がいりますね。
SoftEther VPN Install on Ubuntu

###ダウンロード
[SoftEther VPN プロジェクト](http://ja.softether.org/)からダウンロード
自分は /usr/local/src に wget しました。
###解凍
> tar xvzf ファイル名

vpnserver ディレクトリが生成される

###makeに必要なツール準備
> sudo apt-get install build-essential

###make
> cd vpnserver
> make

makeの質問には1を入力

###配置
> mv vpnserver /usr/local/

###VPNサーバ起動
> cd /usr/local/vpnserver
> sudo ./vpnserver start

###仮想HUB作成
> cd vpnserver
> ./vpncmd

サーバのIP:ポート番号を入力してサーバ管理モードへ

> HubCreate

以下、Hub名をkimiusoと設定したと仮定

###DHCP有効化
設定を加えるHub名を指定
> Hub kimiuso
> SecureNatEnable

###ユーザ作成
> UserCreate

ユーザはkawori

###ユーザの認証パスワード作成
> UserPasswordSet

###IPsecの有効化
> IPsecEnable

L2TPをyes
PSKでのパスワードを設定
使用するHubにkimiusoを指定

###動作確認
自分の場合はここでスマホから接続が確認できました。

確認には /usr/local/vpnserver/server_log のログファイルが有効でした。
他は sudo tcpdump もいいけど、流れが速くて自分にはよく分からなかったです。

後は、サービスの登録や自動起動設定をしたけど、その辺りは参考サイト参照してください。

### 参考サイト

[6.3 VPN Server / VPN Bridge の管理コマンドリファレンス (サーバー全体編)](https://ja.softether.org/4-docs/1-manual/6/6.3)

[【簡単】Ubuntu13.10にSoftether VPNを導入する方法](http://hacklifeinfo.com/%E3%80%90%E7%B0%A1%E5%8D%98%E3%80%91ubuntu13-10%E3%81%ABsoftether-vpn%E3%82%92%E5%B0%8E%E5%85%A5%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/)

[SoftEtherVPN L2TP 実験メモ](http://misc.e-hdk.com/softethervpn-l2tp-jikken-memo)

[■Ubuntu Server / SoftEther VPN サーバーを構築 (その1)](http://tomorrow.meyon.gonna.jp/?eid=1005108)

[SoftEther VPN ServerをCentOS環境に入れる手順](http://ytsrvlog.blogspot.jp/2013/07/softether-vpn-servercentos.html)
[baserCMS]インストール時STEP4でエラーが起きてしまう場合の対処（PCRE Versionの問題）


サーバ上でインストールする際、STEP4でエラーが起きて、インストールを完了できない場合が稀にあります。
また、フォームのメールのチェックやメール送信で、正しいメールアドレスでもエラー扱いになる場合があります。

## 発生するタイミングと環境
- インストール時のSTEP4でエラーが起きて、インストール作業を完了できないとき
 - インストール時のユーザー作成時に正しいメールでもエラー扱いになってしまい、管理者ユーザーが生成されていない状態になる
- フォームのメールのチェックやメール送信で、正しいメールアドレスでもエラー扱いになるとき
- baserCMS 3.0.1 以降で上記症状が起きる


### 環境
- 大塚商会: アルファメールプレミア: http://www.alpha-prm.jp/
 - PHP 5.3.3
 - baserCMS 3.0.5


## 原因
PCREのバージョンが低いときに起きます。

```phpinfo
PCRE (Perl Compatible Regular Expressions)
PCRE Library Version	6.6 06-Feb-2006
```

上記バージョンの場合、正規表現で\p{L}などが使えない状態にあります。

```phpinfo
PCRE (Perl Compatible Regular Expressions)
PCRE Library Version 8.32 2012-11-30
```

上記バージョンだと問題ないようです。（一例）

## 対策

- /lib/Cake/Utility/Validation.php を app/Utility/Validation.php へコピーする
- /app/Utility/Validation.php を以下のように変更する

```/app/Utility/Validation.php
protected static $_pattern = array(
	//'hostname' => '(?:[_\p{L}0-9][-_\p{L}0-9]*\.)*(?:[\p{L}0-9][-\p{L}0-9]{0,62})\.(?:(?:[a-z]{2}\.)?[a-z]{2,})'
	'hostname' => '(?:[_a-z0-9][-_a-z0-9]*\.)*(?:[a-z0-9][-a-z0-9]{0,62})\.(?:(?:[a-z]{2}\.)?[a-z]{2,})'
);
```

- /app/Utility/Validation.php の public static function email() 内を以下のように変更する

```/app/Utility/Validation.php
//$regex = '/^[\p{L}0-9!#$%&\'*+\/=?^_`{|}~-]+(?:\.[\p{L}0-9!#$%&\'*+\/=?^_`{|}~-]+)*@' . self::$_pattern['hostname'] . '$/ui';
$regex = '/^[a-z0-9!#$%&\'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&\'*+\/=?^_`{|}~-]+)*@' . self::$_pattern['hostname'] . '$/i';
```

### baserCMS 3.0.5 以降の場合
CakePHPのバージョンアップにより、上記対応に加えて以下の対応も必要です。

- /lib/Cake/Network/Email/CakeEmail.php を /app/Network/Email/CakeEmail.php へコピーする
- /app/Network/Email/CakeEmail.php を下記のように変更する

```/app/Network/Email/CakeEmail.php
//protected $_emailPattern = '/^((?:[\p{L}0-9.!#$%&\'*+\/=?^_`{|}~-]+)*@[\p{L}0-9-.]+)$/ui';
protected $_emailPattern = null;
```

## 更に正常に稼働しない場合があります
サーバ上でインストール作業を完了した場合、STEP5画面にcss、img、jsが適用されない状態で表示されることがあります。

【現在判っている点】
/app/webroot/内にテーマフォルダ等が存在する配置では、css、img、jsが読み込まれず、画面が正常に表示できません。
/app/webroot/ 内のファイル群をドキュメントルート直下に移動した配置に変更すると、正常な動作が可能です。
配置変更後は以下の構成になります。

- /app
- /files ・・・/app/webroot にあったもの
- /lib
- /theme ・・・/app/webroot にあったもの
- .htaccess ・・・/app/webroot にあったもの
- index.php ・・・/app/webroot にあったもの

なんでだろ？(´･ω･)

### アルファメールプレミアでのインストール留意事項
webroot内のファイル群の配置を、ドキュメントルート直下型に変更してからサーバにアップロードし、インストール作業を行うのが「吉」っぽいですね。


## 参考情報
http://php.net/manual/ja/reference.pcre.pattern.syntax.php#75339
http://phpexcel.codeplex.com/discussions/238547
http://basercms.net/manuals/3/base/1.html
Swiftアプリ申請のために行った開発フローと学習方法について

先日、Wantedlyさん、Oisixさんと合同でSwiftの勉強会を
開催させて頂きました。
プレゼンの内容としてはiOS開発0、Swift学習0の状態からapple申請までの開発フローやSwiftの学習方法といった内容になっておりますので、
これから学習される方やチームで開発するにはどういう所を気をつければ良いんだろう？と気になっている方にぜひ、見て頂きたいです！

<a href="http://www.slideshare.net/g08m11/appleios0swift">
![スクリーンショット 2014-10-18 0.54.57.png](https://qiita-image-store.s3.amazonaws.com/0/15812/0fd88cfa-303f-9172-6e46-4b17cc2643ea.png)
</a>

[Apple審査を一発通過！iOS開発経験0でも出来るじげん流Swift開発のすべて](http://www.slideshare.net/g08m11/appleios0swift)

## 追記(12/5 現在)

この度、

### Swiftオンリーで開発した「アルバイトEX」アプリをリリースしました!

(iOS7、iOS8両方で動きます！)

<a href="https://itunes.apple.com/jp/app/arubaitoex-ri-ben-zui-da-jinobaito/id924813230?mt=8">![スクリーンショット 2014-12-05 23.47.10.png](https://qiita-image-store.s3.amazonaws.com/0/15812/94316dd1-eb31-233d-4288-9fce4761f4a0.png)</a>

[アルバイトEX](https://itunes.apple.com/jp/app/arubaitoex-ri-ben-zui-da-jinobaito/id924813230?mt=8)
Mahoutで使える学習アルゴリズム (1)

Mahoutには機械学習や分析のアルゴリズムがいろいろ入っていますが、機械学習を始めたばかりの人にはいまいちなじみにくいと思います。そこで、どんなアルゴリズムがあるのか、簡単ですが概要を調べました。元ネタは[MahoutのList of Algorithmのページ][link1]です。

今回対象にしたMahoutのバージョンは0.9です。バージョンが上がると使えるアルゴリズムがどんどん変わるのでこの内容もすぐに陳腐化するかもしれません。ご注意ください。

[link1]:https://mahout.apache.org/users/basics/algorithms.html
[img_ubcf]:http://comsysto.files.wordpress.com/2013/02/userbased.png
[img_ibcf]:http://comsysto.files.wordpress.com/2013/02/itembased1.png
[ref1]:http://blog.comsysto.com/2013/04/03/background-of-collaborative-filtering-with-mahout/
[page2]:http://qiita.com/jjking/items/2d1f4b9b634bbfd16cc9

### 協調フィルタリング (Collaborative Filtering)
|種別|内容|
|:--|:--|
|User-Based Collaborative Filtering|自分と似たアイテムを買っている人が持っている別のアイテムをおすすめするレコメンド。[Background of collaborative filtering with Mahout][ref1] から引用しましたがこの図がわかりやすいです。[![](http://comsysto.files.wordpress.com/2013/02/userbased.png)][img_ubcf]|
|Item-Based Collaborative Filtering|自分の買ったアイテムに類似するアイテムをおすすめするレコメンド。類似の基準はオプションで指定するようです。これも上記と同じサイトの図がわかりやすいです。[![](http://comsysto.files.wordpress.com/2013/02/itembased1.png)][img_ibcf]|
|Matrix Factorization with Alternating Least Squares|ユーザーがこれまでアイテムにつけた評価をもとに別のアイテムの評価を予測するレコメンド。Matrix Factorizationという行列積分解の手法を使うそうです。|
|Matrix Factorization with Alternating Least Squares on Implicit Feedback|上記のレコメンドに暗黙的フィードバックを加えたもの。|

ほかには、Weighted Matrix Factorization,SVD++, Parallel SGD(確率的勾配降下法)などがあります。

### 分類 (Classification)
|種別|内容|
|:--|:--|
|Logistic Regression|ロジスティック回帰による分類です。|
|Naive Bayes|ナイーブベイズ（単純ベイズ分類器）による分類です。|
|Complementary Naive Bayes|上記ナイーブベイズの拡張。あるクラスに属さない補集合(Complement)を用いて学習させる。|
|Random Forest|複数の木構造モデルを作り集団学習させる手法。SVMなどの手法に比べ特徴量の重要度が学習とともに計算できること、学習が早いこと、過学習が起きにくいことなどの利点があるそうです|
|Hidden Markov Models (HMM)|隠れマルコフモデル。時系列のデータをパターンで分類するのに良く使われます。少し前までの音声認識の主流方法でした。|
|Multilayer Perceptron|多層パーセプトロン。これに決めつけると怒られるかもしれませんが、いわゆるニューラルネットです。|

### その他
クラスタリング (Clustering)、Topic Modelsなどがあります。が、これらについては[Mahoutで使える学習アルゴリズム (2)][page2] にて。

勉強中なので間違っているところもあるかと思いますが、誤りありましたらコメントください。

### 参考文献
* [Background of collaborative filtering with Mahout][ref1]
* [Mahoutで使える学習アルゴリズム (2)][page2]
haxeで作ったjsに外部からアクセスする

haxeでjsを書き出した際、デフォルトのコンパイルでは
無名関数によってラップされるので外部から参照できない。
参照したいときは、下記のような方法がある。


#【方法1】コンパイルオプションをclassicにする
-D js-classic
こうすると無名関数でラップされなくなるが
グローバルな変数が汚染されてしまい、恐ろしい。
http://qiita.com/k-motoyan/items/d9c516bba525379d3cda#2-2

#【方法2】exposeを使う
class表記の上に@:exposeを書くと、そのクラス参照だけグローバルになる。
下記の例だと、MyExternalClassクラスが、外部からはnew someLib.SomeName();みたいに使えるようになる。

```haxe:expose.hx
@:expose("someLib.SomeName")
class MyExternalClass { }
```

http://old.haxe.org/doc/js/modern

方法1よりこちらの方法がよいだろう。


# 参考
javascriptで名前空間を有効活用する方法
http://tech.kayac.com/archive/javascript-variable-scope.html
名前空間を閉じるテクニックが載っている。勉強になる。
gulpを使ってjekyllでlivereloadする


#jekyllを使ってlivereloadしたい

`gulp`で実行することで静的サーバ＋ライブリロード開始
setting部分の変数やwatchするcss, jsのディレクトリ指定は自分の環境に合わせる。

`gulp`で
jekyllの初回ビルド、静的サーバ、ファイルの変更監視（変更があったらjekyll再ビルド）を行っている。

```gulpfile.js
var gulp = require('gulp'),
    spawn = require('child_process').spawn,
    webserver = require('gulp-webserver'),
    notifier = require('node-notifier');

var SERVER_PORT = 4000;
var SERVER_ROOT = '_site/'

var Logger = function() {
  var logger = function() {
  };

  var _log = function(message) {
    console.log(message);
  };

  var _notify = function(title, message) {
    notifier.notify({
      title: title,
      message: message
    });
  };

  logger.prototype = {
    log : _log,
    notify : _notify
  };
  return logger;
}();


gulp.task('jekyll', function () {
    var jekyll = spawn('jekyll', ['build']);
    var logger = new Logger();

    jekyll.stderr.on('data', function(data) {
        logger.log("" + data);
        logger.notify('Build Error', data);
    });

    jekyll.on('exit', function (code) {
        var message = code ? 'error' : 'success'
        logger.log('Finished Jekyll Build : ' + message);
    });
});

gulp.task('serve', function() {
  gulp.src(SERVER_ROOT)
    .pipe(webserver({
      livereload: true,
      open: true,
      port: SERVER_PORT
    }));
});

// Watch for changes
gulp.task('watch', function () {
    gulp.watch(['*.html', '*/*.html', '*.md', '*/*.md', '_sass/*.scss', 'stylesheets/*.scss', 'stylesheets/*.css', 'stylesheets/**/*.css', 'javascripts/*.js', '!_site/**', '!_site/*/**'], ['jekyll']);
})


gulp.task('default', ['jekyll', 'serve', 'watch']);
```
Ubuntu に ffmpeg をインストール Package ffmpeg is not available, but is referred to by another package. ってなった (x_x)

# レポジトリから消えてる (x_x) がーん

Ubuntu (12.04) に ffmpeg を新たにセットアップしようとしたら、レポジトリから消えてた。前回インストールしたときはどうだったかな？なんて、記憶にないし。とりあえず、ひどい！でも、前回はソースからビルドした気がする。

```
$sudo apt-get install ffmpeg

Reading package lists... Done
Building dependency tree       
Reading state information... Done
Package ffmpeg is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source

E: Package 'ffmpeg' has no installation candidate
```
ことの顛末はこの辺から参照できます↓
software installation - Is FFmpeg missing from the official repositories in 14.04? - Ask Ubuntu - http://goo.gl/7YTiFj

# ことの顛末

> 問題とは、ffmpegがころころAPIやABIを変更することである。これでは長期的なサポートが難しい。だから、常にtrunkというわけではなく、stable版も提供してはくれないかという提案が出された。ところが、Michael Niedermayerはこの提案に否定的だった。さらに、Michaelはバイナリパッケージ自体にも、あまり興味を示さなかった。まるで、「ユーザーは常に最新版を自前でコンパイルして使うべきである」、といわんばかりの姿勢だった。
> 
> さらに、Michaelの指導下にあるffmpegは、機能の追加に対して保守的だった。たとえば、マルチスレッドによるデコード、ffmpeg-mtは、いまだにマージされない。しかも、「俺は絶対にffmpeg-mtなんかマージしねーよ」とまで明言した。
> 
> ここで、一部の開発者がより集まって相談した結果、forkするべきであるという結論に達した。Michael Niedermayerはこのforkに対して、口汚く罵り、身体上に危害を加えることを示唆するような悪質な冗談を繰り返したという。

本の虫: ffmpegとlibavの背景事情 - http://goo.gl/yt8AL

**なにこれ、やっぱりソフトウェア開発者はこうして他人を罵倒して見下して生きていく姿が素敵よね。みんなも見習って、「糞コードにはクソ」って言えるようになろうね。どんな冗談言ったのかな？「豆腐の角に頭ぶつけて死ね」とか？**

コメント欄に少し批判も見て取れるので、真実やいかに？って感じでしょうか。まぁ、けんかだからねー :smile: 

というわけで、libav を使うか、 ffmpeg を使うかになります。

## レポジトリを追加してインストール

```
& sudo apt-add-repository ppa:jon-severinsson/ffmpeg
& sudo apt-get update
& sudo apt-get install ffmpeg
```

で、できるって書いてありましたが、「このレポジトリ安全なの？」と思います。わかりません。だからやりません。自己責任で  :stuck_out_tongue_winking_eye: 

## libav をインストール

```
$ sudo apt-get install libav-tools
```

こっちはオフィシャルのレポジトリからインストールできます。

## ソースからビルドする

↓を参考にがんばりましょー
CompilationGuide/Ubuntu – FFmpeg - http://goo.gl/mjynBb

apt-get で得られるモジュールのバージョンによって sudo apt-get install でもいいよってものがあります。モジュールのバージョンチェックは↓のようにしたらできます。

```
apt-get -s install <package>
```
テキストの入力値によってコンボボックスの表示を変える

テキストの入力値によってコンボボックスの値を変更するようなことをしようとしたときにしたこと。

最近disられていたAngularJSを使用しています。JSをほとんど知らない自分にとって楽でいいですね。

例)ApplicationのVersionに対して、Download ContentsのVersionを設定する場合のコード。良いコードかは分かりません。簡単にかけますね。

```html
<html>
  <head>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.min.js"></script>
    <script type="text/javascript">
      angular.module('versionApp', [])
        .controller('versionController', function ($scope) {
	       $scope.versions = [
	         {"application": "0.0.1", "dlc": "0.0.1"},
	         {"application": "0.0.1", "dlc": "0.0.2"},
	         {"application": "0.0.1", "dlc": "0.0.3"},
	         {"application": "0.0.2", "dlc": "0.0.2"},
	         {"application": "0.0.2", "dlc": "0.0.3"},
	         {"application": "0.0.3", "dlc": "0.0.3"}
	       ];
	       $scope.selectVersions = $scope.versions;
	       
	       $scope.onEditChange = function() {
	         var versions = [];
		     for (var i = 0, length = $scope.versions.length; i < length; i++) {
			     if ($scope.applicationVersion == $scope.versions[i].application) {
			       versions.push($scope.versions[i]);
			     }
		     }
		     $scope.selectVersions = versions;
	       };
        });
    </script>
  </head>
  <body>
   <div ng-app="versionApp">
    <div ng-controller="versionController">
     <form action="/update" method="post">
      <input type="text" name="applicationversion" ng-model="applicationVersion" placefolder="application version" ng-change="onEditChange()" />
      <select name="dlcversion">
       <option ng-repeat="version in selectVersions" value="{{ version.dlc }}">{{ version.dlc }}</option>
      </select>
     </form>
    </div>
   </div>
  </body>
</html>
```
specs2で特定のテストケースを名前指定で実行する方法

書いたテストコードのうち、特定のテストケースだけ実行したいという場面は結構あります。
specs2では特定のテストクラス内のテストケースのみを実行することはtestOnlyでできることが割と知られていますが、テストケース名を指定して実行する方法は日本語の情報が全くなかったのでここにまとめておきます。

## 例

### テスト対象
```TestSpec.scala
import org.specs2.mutable._

class TestSpec extends Specification {
  "テストの名前A" in {
    1 must_== 1
  }

  "テストの名前B" in {
    1 must_== 1
  }

  "また別のテスト" in {
    1 must_== 1
  }
}
```

### 実行方法
```shell-session
sbt "testOnly TestSpec -- ex テストの名前A"
```

## 補足情報

### 1. テスト名は正規表現で指定
テスト名は正規表現で表現しているため、例えば以下のような指定をすることで「テストの名前」という文字列から始めるテストすべてを実行することができます。

```shell-session:正規表現
sbt "testOnly TestSpec -- ex テストの名前.*"
```

### 2. テスト名にホワイトスペースが含まれる場合
テスト名がホワイトスペースを含んでいる場合、正規表現の前後へエスケープしたダブルクォートを置いてください(これは同じ会社の人が見つけてくれました)

```shell-session:ホワイトスペース
sbt "testOnly TestSpec -- ex \"空白 の 含まれる テスト名\""
```

## 制限（これでもできないこと）
shouldやcanや>>などでテストを構造化してる場合、特定のshould以下のテストのみを実行したいケースが有りますが残念ながら今のところこれらの構造部品は名前指定できないようです。どうしても特定should以下のテストだけを実行したい場合、タグを利用して[scala + specs2 + sbt で特定のクラスの中のさらに特定のテストだけ実行したい - Yamashiro0217の日記](http://d.hatena.ne.jp/Yamashiro0217/20120511/1336718961)で書かれてるように実行しましょう。

## より詳しい仕様

* [Specs2 Runners](http://etorreborre.github.io/specs2/guide/SPECS2-2.4.17/org.specs2.guide.Runners.html) - specs2公式ドキュメント
Elixir Integer

# Elixir Integer

## 概要
Elixir の Integer について。

## 桁区切り
数値リテラルにアンダースコアを含めてもエラーにならないため
桁区切りに利用できます。Rubyと同じ。

~~~bash
iex> 1000000000
1000000000
iex> 100_0000_000
1000000000
~~~

## 基数
2進数は `0b`
8進数は `0o`
16進数は `0x`
で記述します。

~~~
iex> 0b10
2
iex> 0o10
8
iex> 0x10
16
iex> 10
10
~~~

## 組み込み関数
下記を参照
http://elixir-lang.org/docs/stable/elixir/Integer.html

### parse/1
binary を Integer に変換します

~~~
iex> Integer.parse("234")
{234, ""}
iex> Integer.parse("234.5")
{234, ".5"}
iex> Integer.parse("not number")
~~~

### to_char_list/1
Integer を char_list に変換します

~~~
iex> Integer.to_char_list
'234'
iex> Integer.to_char_list(234_5)
'2345'
~~~

### to_char_list/2
Integer を char_list に変換します。
第2引数で基数指定を行う。
基数は2-36までを指定可能。

~~~
iex> Integer.to_char_list(35, 2)
'100011'
iex> Integer.to_char_list(35, 8)
'43'
iex> Integer.to_char_list(35, 16)
'23'
iex> Integer.to_char_list(35, 36)
'Z'
iex> Integer.to_char_list(35, 10)
'35'
~~~

### to_string/1
Integer を string に変換します

~~~
iex> Integer.to_string
"234"
iex> Integer.to_string(234_5)
"2345"
~~~

### to_string/2
Integer を string に変換します。
第2引数で基数指定を行う。
基数は2-36までを指定可能。

~~~
iex> Integer.to_string(35, 2)
"100011"
iex> Integer.to_string(35, 8)
"43"
iex> Integer.to_string(35, 16)
"23"
iex> Integer.to_string(35, 36)
"Z"
iex> Integer.to_string(35, 10)
"35"
~~~

## サンプル
### サンプルコード

~~~bash
defmodule IntegerSamples do
  require Integer
  def exec do
    print_exec(Integer.is_odd(1))
    print_exec(Integer.is_odd(2))
    print_exec(Integer.is_even(1))
    print_exec(Integer.is_even(2))
  end

  defp print_exec(value) do
    IO.inspect value
  end
 end

IntegerSamples.exec
~~~

### 出力

~~~
true
false
false
true
~~~

## 参照
http://elixir-lang.org/docs/stable/elixir/Integer.html
voidを返す関数も対等に扱いたい。 ―メンバ関数篇―

[前回](http://qiita.com/s-wakaba/items/91a67d841f66cc294861)に補足。

前回の例で、色々な型を返す関数がオブジェクトのメンバ関数だった場合、前回のケースでは上手く行かない。

そこで、メンバ関数バージョン。

```cpp:sample_membfuncs.cpp
#include <string>
#include <iostream>

std::string get_functype(int) {
    return "You have returned an int value.";
}

std::string get_functype(double) {
    return "You have returned a double value.";
}

std::string get_functype(void) {
    return "You have returned nothing.";
}

class MyClass {
public:
    int int_func(int n1, int n2) {
        auto ret = n1 + n2;
        std::cout << "I will return " << ret << "." << std::endl;
        return ret;
    }
    double double_func(double ret) {
        std::cout << "I will return " << ret << "." << std::endl;
        return ret;
    }
    void void_func(void) {
        std::cout << "I will return nothing." << std::endl;
    }
};


template<typename RET>
struct get_functype_switch_helper {
    template<typename CLS, typename... ARGS>
    static auto x(CLS &obj, RET(CLS::*func)(ARGS...), ARGS... args) {
        return get_functype((obj.*func)(args...));
    }
};

template<>
struct get_functype_switch_helper<void> {
    template<typename CLS, typename... ARGS>
    static auto x(CLS &obj, void(CLS::*func)(ARGS...), ARGS... args) {
        (obj.*func)(args...);
        return get_functype();
    }
};

template<typename CLS, typename FUNC, typename... ARGS>
inline auto get_functype_switch(CLS &obj, FUNC func, ARGS... args) {
    return get_functype_switch_helper<decltype((obj.*func)(args...))>::template x<CLS, ARGS...>(obj, func, args...);
}


int main(void) {
    MyClass obj;
    std::cout << get_functype_switch(obj, &MyClass::int_func, 30, 70) << std::endl;
    std::cout << get_functype_switch(obj, &MyClass::double_func, 3.14) << std::endl;
    std::cout << get_functype_switch(obj, &MyClass::void_func) << std::endl;
    return 0;
}
```

メンバ関数ポインタにしないといけませんでした。

以上。
YouTube Data API の注意点：OAuth認証が必要なService Account が使えないケース (x_x) 

みなさんこんにちは。YouTube Data APIを使って更新系(insert, update, delete）の操作を行う場合、当然ですが認証がひつようです。GoogleのAPIなのでOAuth認証をすることになりますが、例えば、サーバー側でバッチ処理でごにょごにょしたい場合に困ったことが発生します。

# YouTube Data API の認証の問題

通常、サーバー側でごにょごにょする場合は、**Google API Console で Service Accout を有効にして認証を通せるようにします**。

しかし

YouTube Data API では、チャネルオーナーと Service Account を紐づける方法が**ありません** (2014年10月16日時点)。普通なら、Service Account つくったときに自動的に割り当てられるメールアドレスに対して、何らかの権限を与えることでうまくいくわけです。たとえば、Google Analytics のデータをごにょごにょする場合は、Google Analytics の特定のプロファイルに対してそのメールアドレスをデータ操作可能な権限を与えるわけです。

え、何を書いているかわからないって？説明むずかしい・・・ (x_x)

とにかく、Service Account の場合 YouTube Data API の更新系作業はそのままだとうまくいかないんです。

# 解決方法

google api ruby client - is there a pure command-line oauth flow for installed apps? - Stack Overflow - http://goo.gl/teycz9

Stackoverflow に解決方法が出てます。ヽ(ﾟｰﾟ*ヽ)(ﾉ*ﾟｰﾟ)ﾉわぁい
Emacsのバッファファイルをvagrant rsync-autoに含めない

# Emacsのバッファファイルをvagrant rsync-autoから除外
Emacsでファイル編集中にセーブせずに他のファイルを開いたりすると、先ほど編集していたファイルのバッファへのシムリンクが作成されます。

vagrantでrsync-autoをしている状態でこのファイルが作成されると、このシムリンク先のバッファをrsyncしようとしてエラーが発生し、rsyncが止まってしまいます。

この状態で開発するのはさすがに厳しいものがあるので、以下のようにVagrantfileを編集してrsync-autoにEmacsが作るバッファへのシムリンクをrsync対象外に設定します。

````ruby:Vagrantfile
  config.vm.synced_folder "./host/sync_dir",
                          "/guest/sync_dir",
                          create: true,
                          type: "rsync", rsync__exclude: [".vagrant/", ".#*"]


````

Emacsのバッファへのシムリンクは**.#editing_file_name**という形式で作成されるので、rsync__excludeオプションに**".#*"**を追記しました。

これで安心してEmacsで作業が行えます^^
Dart1.7リリースノート

先日[Dart1.7のリリースノート](https://groups.google.com/a/dartlang.org/forum/#!topic/misc/ioHy-1IomIg)が発表されました。言語自体への目立った新機能の追加はないですが、apt-get対応やhomebrew対応、"pub global"の正式実装など周辺環境の改善が多く、新たにDartを始めやすい環境が整いつつあると感じました。以下は個別の解説です。

## dart:asyncに関する変更

### ZoneにerrorCallbackメソッドを追加
FutureやStreamの中でthrowされたエラーがエラーハンドルされる前に割り込みの処理を入れられるようになりました。

```AsyncError errorCallback(Object error, StackTrace stackTrace)```

主な使い道はZoneを継承した独自のZoneに置けるエラー処理だと思います。`errorCallback`の返り値が`null`である場合は、そのまま本来のエラーハンドラに同じ引数が渡されます。逆に`null`でない`AsyncError`オブジェクトを返した場合は、その新しいオブジェクトが元のエラーの代わりにエラーハンドラに渡されます。

新メソッドの追加ですので、名前衝突していない限り既存のコードに影響はないです

## dart:ioに関する変更

### HttpClientのclose処理に関する変更
詳細は[こちら](https://groups.google.com/a/dartlang.org/forum/#!msg/announce/lsaY2BjCRXs/th8YZNehbnUJ)に別記されています。これまでHttpClientはアイドルタイムアウト時間が設定されている場合、`HttpClient#close`を呼びださなくても自動でシャットダウンしていましたが、1.7からは`close`の呼び出しが必須となりました。 

 **アイドルタイムアウトのみを設定していたコードでは修正の必要があります。** 

### HttpServerにautoCompressプロパティを追加
これまでは常に有効となっていたコンテンツの圧縮の有効・無効を設定できるようになりました。これからはデフォルトで圧縮しない設定になります。Dart1.7にアップデートしてHttpServerの挙動が変わったと思ったらここを`true`にしてみるといいかもしれません。

## dart:isolateに関する変更

### Isolate.spawnUriメソッドにpausedとpackageRootの2つのオプショナル引数を追加
これは地味に大きな変更かもしれません。  
packageRootパラメータは`file`もしくは`http`、`https`でなくてはなりません。 末尾に`/`がついていなくても自動で付与されます。また、spawnされて起動する新しいIsolateでの外部パッケージのインポート("package:foo/bar.dart"のような) は、`packageRoot.resolve("foo/bar.dart")`として解決されます。省略した場合はspawn元と同じものが使われます。  

次に`paused`ですが、これが`true`である場合は起動されるIsolateはポーズされた状態で起動されます。つまり、 `isolate.pause(isolate.pauseCapability)`が呼ばれたような状態で起動されます。この状態で起動できることにより、Isolateの実行前にセットアップなどの処理が行えるのが利点です。改めて実行させるには`isolate.resume(isolate.pauseCapability)`を呼び出せばいいです。

ちなみに`packageRoot`と`paused`はまだすべてのプラットフォームで実装されているわけではないので、実行環境によりエラーとなる可能性があります。

## pubに関する変更

### 実行可能なパッケージをPATHから実行できるようにする変更
`pub global`については[こちら](https://www.dartlang.org/tools/pub/cmd/pub-global.html)を御覧ください。また、この機能に関する[ブログ記事](http://news.dartlang.org/2014/10/dart-17-easily-share-and-use-command.html)があります。  
1.6までは、`pub global activate hogehoge`されたパッケージを実行するには`pub global run hogehoge`と呼びださなければなりませんでしたが、次の方法により直接`hogehoge`と呼び出せるようになります。

1. pubのキャッシュにPATHを通す  
デフォルトでは`~/.pub-cache/bin`です。
2. activateする  
`pub global activate hogehoge`とすることで実行可能にできます。

CLIとしてのDartの使い勝手があがることで今後の普及に一役買いそうです。

## dart2jsに関する変更

### 同一ページでの複数のdeferred loadingが有効になった
1つのページに複数のDartアプリがあり、それぞれでdeferred loadingが正しく機能するようになりました（何かバグがあったんだろうか・・・）

## ソフトウェア配布に関する変更

### Debianリポジトリが追加された
Debian系OSにおいてapt-getでDartSDK(DartiumやDartEditorはまだ)がインストールできるようになりました。が、最初にリポジトリの追加のためのセットアップ作業が必要なので[こちら](https://www.dartlang.org/tools/debian.html)を参考にしてください。

### MacユーザーのためにHomebrewをサポートした
以前からhomebrewでDartがインストールできるようになってましたが、Dart開発チームでも使うようになったみたいで、公式にサポートするようにしたみたいです。

----
以上Dart1.7の主な変更点です。今回は控えめなアップデートですが、この後には待望の **async/await**が待っているのでDartisansとして目が離せないですね
マミルトンのゲーム実況動画から決定的シーンを抜き出す RMagick と rekognition を使おう ヽ(ﾟｰﾟ*ヽ)(ﾉ*ﾟｰﾟ)ﾉわぁい

皆様こんにちは。マミルトンって知ってますか？ゲーム実況動画界隈ではとても人気のある女性です。せっかくなのでマミルトンの画像を RMagick で mosaic 画像にしてみました。[RMagick でタイル状の画像をつくる記事はこちらにも書いてます](http://qiita.com/scleen_x_x/items/98676c482ab3d97c0344)。

![マミルトン](http://gameranking.scleen.com/images/mamiruton.png)

# ゲーム実況動画から決定的シーンを抜き出す

ゲーム実況動画、楽しいです。おすすめはマイクラ！最近は映画のようにきれいなウォッチドッグスやAlienも気に入ってます。

## 時間がたりない

ゲーム実況動画は最近どんどん増えてきて、もう新着を全部見るだけの時間が無いし、見返す時間もおしいです。お気に入りの配信者を見つけた時は過去の動画をあさります。これにはとても時間がかかります。どうしたら良いでしょうか？

## せんりゃくをたてよう

ケース：お気に入りの動画シリーズを見つけた！良さそうなシーンを検索したい！

というわけです。YouTube Data APIを使えば、キーワードで検索したり、指定チャネルから動画を探すことができます。再生数やGood :+1: の回数もデータとして取得できます。とても便利！

これだけでも十分？なんだけど、30分程度ある動画を全部見ずにいいとこだけ見ることはできないかなー？

動画からは音声と画像を得ることができます。youtube-dl を使ってダウンロードしたファイルを ffmpeg でフレーム画像抜き出したり、音声を抜き出すこともできますね。こうして得られたデータから「良さそうなシーン」を探してみたい！

### 音性から

ボリュームが大きい個所を見つけられたらできそうです。オーディオファイルは、うまいこと読み込めば AudioBuffer から絶対値でボリュームがわかるのでいけそうです。

### 画像から

驚いたり、笑ったりする画像を見つけられたら、そこが「よさそうなシーン」である可能性は高そうです。※顔出し動画限定になっちゃいますが

## 笑顔を抜き出してみよう

こんかいは、マミルトンの笑顔を抜き出すさくせんで行きたいと思います。まず、ffmpeg でフレームの画像を抜き出してみます。

```
$ ffmpeg -ss 1 -vframes 1 -i mamiruton.mp4 -f image2 out.png
```

やっかいなことに、マミルトンの動画にはマックスむらいが良く映っています。他の配信者が映っていることも多いです。こういう感じ。いい笑顔ですね。ここからマミルトンだけにする。

![マミルトンとマックスむらい](http://img.youtube.com/vi/Gy2bA-cxp7s/mqdefault.jpg)

### 顔認識をしてマミルトンの顔を特定しよう

顔を認識するには OpenCV とか使うのがよさそうですが、今回は無償で使えるAPIを提供している rekognition を使ってみたいと思います。価格体系はフリーミアムの従量課金です。導入は簡単です。Android, iOS でも使えるライブラリーが提供されていますよ。

https://rekognition.com/

```
$ gem install rekognize
```

これでライブラリがインストールできます。

### マミルトンの顔写真で教育しておく

rekognition は顔の人物判定をするAPIも提供しています。あらかじめ、マミルトン画像で学習させることで、マミルトンらしさを数値で返してくれます。

### rekognition を使った実装

1. APIで顔の位置を取得
1. APIでマミルトンの顔を判別
1. APIで笑顔の度合いを判定

この最後の笑顔の判定で、「良さそうなシーン」を抜き出しましょう。

## ffmpegを使って切り出してつなげる

あとは、ffmpegを使ってシーンの切り出しと連結をしてダイジェスト動画の完成です。

<del>**※詳細は後で追記する**</del> 別の記事にすることにしました↓をご覧ください

できた！

## ヽ(ﾟｰﾟ*ヽ)(ﾉ*ﾟｰﾟ)ﾉわぁい

続きを書きました。フォローもよろしくね :satisfied: 

マミルトンのゲーム実況動画で ffmpeg RMagick rekognition を使おう～その１～ヽ(ﾟｰﾟ*ヽ)(ﾉ*ﾟｰﾟ)ﾉわぁい - Qiita - http://goo.gl/EJVsLG
3Dのオブジェクトの表示位置に2DのUIオブジェクト追随させる


3Dのオブジェクトは Perspective なカメラ、2Dのオブジェクトは Orthographic なカメラにそれぞれ投影されている前提。

以下の手順で 3D オブジェクトの座標を 2D オブジェクトの座標に反映させる。

* 3Dオブジェクトのワールド座標から、Perspective カメラのビューポート座標を求める
* 上記ビューポート座標を Orthographic カメラのワールド座標に逆変換する
* 求めたワールド座標を 2Dオブジェクトの transform.position に設定する

コード例

```sample.cs

GameObject obj3d;		// 3Dオブジェクト
GameObject obj2d;		// 2Dオブジェクト

Camera perspCamera;  // 3Dオブジェクトを写すカメラ
Camera orthoCamera;  // 2Dオブジェクトを写すカメラ

// 3Dオブジェクトのワールド座標から、Perspective カメラのビューポート座標を求める 
var viewPortPos = perspCamera.WorldToViewPortPoint(obj3d.transform.position);
// 上記ビューポート座標を Orthographic カメラのワールド座標に逆変換する
var worldPos2d = orthoCamera.ViewportToWorldPoint(viewPortPos);
// 2Dオブジェクトの座標を移動
obj2d.transform.position = worldPos2d;

```

参考: [UnityのCameraが使う３つの座標系 - テラシュールブログ](http://tsubakit1.hateblo.jp/entry/2014/07/22/010739)
AWS CLI でインスタンス情報を取得

AWS CLIを使って、よく発生する作業リスト作成作業を効率化したい。
また、なんとかManagement Consoleに頼るのをやめたい。
使い慣れるために、発生しそうな作業を色々と試してみた。

####環境
Mac OS X 10.9.5
Python 2.7.5
aws-cli 1.5.1



##ホスト名(Nameタグ)取得方法
まずはインスタンスの一覧を取得。
自分の場合、ホスト名はNameタグに登録しておくことが多いので、describe-tags から取得。
Nameタグだけ取れてもあまり役に立たないので、インスタンスIDも一緒に取ってみる。

`--query`オプションを使うと、返却する要素のselectと、フィルタ条件を付けられる。
ここでは、ResourceTypeが "instance" の インスタンスIDとNameタグ（タグKeyが"Name"）を取得。

```bash
$ aws ec2 describe-tags --query 'Tags[?ResourceType==`instance`] | [?Key==`Name`].{ResourceId:ResourceId,ResourceName:Value}'
```

(結果)

```json
[
    {
        "ResourceId": "i-xxxxxxx",
        "ResourceName": "hoge1"
    },
    {
        "ResourceId": "i-xxxxxxx",
        "ResourceName": "hoge2"
    },
]
```

##ホスト名とIPの一覧を取得
こうなると、IPも一緒に取りたい。
ということで、describe-instance からとってみることにする。

パブリックIP,プライベートIP,インスタンスID,Nameタグの値を取得する。
`[?~]`で条件を書くことで、絞り込みが可能。

```bash
$ aws ec2 describe-instances --query 'Reservations[].Instances[].{PublicIp:PublicIpAddress,PrivateIp:PrivateIpAddress,InstanceId:InstanceId,Name:Tags[?Key==`Name`].Value}'
```

(結果)

```json
[
    {
        "PublicIp": "x.x.x.1",
        "InstanceId": "i-xxxxxxxx",
        "Name": [
            "hoge1"
        ],
        "PrivateIp": "10.x.x.1"
    },
    {
        "PublicIp": "x.x.x.2",
        "InstanceId": "i-xxxxxxxx",
        "Name": [
            "hoge2"
        ],
        "PrivateIp": "10.x.x.2"
    },
    {
        "PublicIp": null,
        "InstanceId": "i-xxxxxxxx",
        "Name": [],
        "PrivateIp": null
    }
]
```

こんな感じで拾える。
Nameタグを登録していないインスタンスを省く場合は、
`not_null`関数を組み合わせて、
``Name:Tags[?Key==`Name`].Value`` の部分を
　　　　　　　　　↓
``Name:Tags[?Key==`Name`] | [?not_null(Value)].Value}`` とすればOK。

また、`--output`オプションをつけると、タブ区切りのテキストで返してくれる。
これは便利、と思ったが・・・

```text
i-xxxxxxxx	10.x.x.1	x.x.x.1
NAME	hoge1
i-xxxxxxxx	10.x.x.2	x.x.x.2
NAME	hoge2
```

困ったことに、階層の違う要素が同じ行に出力されず、なんとも扱いにくい感じに。
うーん。誰か解決方法知りませんか。
今後の課題。


##参考にしたサイトなど

AWS CLIのセットアップに関してはこちら。
http://dev.classmethod.jp/cloud/aws-command-line-tool-python/

`--query`オプションの使い方
http://dev.classmethod.jp/etc/aws-cli-query/
http://dev.classmethod.jp/cloud/awscli-enhanced-query-opt-snipets/

`--query`オプションの書式は、JMESPathというbotoのライブラリによるもの。なのでこちらも参考。
http://jmespath.readthedocs.org/en/latest/index.html
jq というJSON整形ツールの説明。
http://dev.classmethod.jp/tool/jq-manual-japanese-translation-roughly/
（最初こちらを調べようとしていたら、既に`--query`オプションだけで事足りつつある、
　とのことだったのでサンプル程度でやめました。）

公式ドキュメントでも一応。
◆AWS Command Line Interface User Guide
http://docs.aws.amazon.com/cli/latest/userguide/controlling-output.html
RedshiftからSelectする時に、固定値を入れる場合

## 概要
RedshiftからSELECTするときに、固定値を指定しながらレコードを取り出す場合の注意点について

## 手段
通常のDBの場合、SELECT時に固定値を挟む場合は、

```postgres:postgresql
SELECT id, column_1, 'xx' as add_column FROM my_table;
```

でも取り出すことができると思います。

しかし、Redshiftの場合は、取り出すデータ型を明示的に指定しなければいけないようです。

```Redshift:Redshift
SELECT id, column_1, 'xx'::text as add_column FROM my_redshift_table;
```

上記例では、``'xx'``に``::text``を指定して、textの型であることを指定してます。

文字列型のデータを追加してSELECTした場合のエラーとしては、

```Redshift:Redshift-error
ERROR:  failed to find conversion function from "unknown" to text
```

のようなエラーが出力されるので、参考にしてください。
dnsmasqを使って簡単にDNS round robin(ラウンドロビン)

dnsmasqのインストール

```
# yum install dnsmasq
```

nsswitch.confをいじって、先にdnsを参照するようにする

```
# cat /etc/nsswitch.conf | grep hosts:
hosts:      dns files
```

resolv.confをいじって、先にdnsmasqを参照するようにする

```
# cat /etc/resolv.conf | grep nameserver
nameserver 127.0.0.1
nameserver 192.168.1.1
```

hostsをいじって、round robinの設定をする

```
# cat /etc/hosts
192.168.1.11 test.hosts.com
192.168.1.12 test.hosts.com
192.168.1.13 test.hosts.com
```

dnsmasq 起動

```
# service dnsmasq start
```
AngularJS:文字列をエスケープさせずに出力する方法


※AngularJSバージョン:1.3

テンプレ側とJS側それぞれに対応が必要
- html側: ng-bind-htmlディレクティブを使用
- JS側: $sce.trustAsHtmlを使用


```html
<div ng-bind-html="content"></div>
```

```coffeescript
app = angular.module('myApp', []);
app.controller 'MainCtrl', ($scope, $sce) ->
	html = "<p>hoge</p>"
  	$scope.content = $sce.trustAsHtml(html)

```

angular-sanitizeモジュールを使用する場合はJS側の`$sce.trustAsHtml`が不要

```coffeescript
app = angular.module('myApp', ['ngSanitize']);
app.controller 'MainCtrl', ($scope) ->
	html = "<p>hoge</p>"
  	$scope.content = html
```

詳しくは↓

- [>javascript - How to have AngularJS output escaped HTML - Stack Overflow](http://stackoverflow.com/questions/20436579/how-to-have-angularjs-output-escaped-html)
- [AngularJS:API:$sce](https://docs.angularjs.org/api/ng/service/$sce)