OmniAICreator/Qiita-1.07M huggingface dataset:
複数のプロパティを配列化する

例えば

```csharp
    public class HoGE
    {
        public bool Param1 { get; set; }
        public bool Param2 { get; set; }
        public bool Param3 { get; set; }
        public bool Param4 { get; set; }
        public bool Param5 { get; set; }
        public bool Param6 { get; set; }
        public bool Param7 { get; set; }
        public bool Param8 { get; set; }
        public bool Param9 { get; set; }
        public bool Param10 { get; set; }
    }
```

こんなクラスがあったとして
このクラスのboolがtrueのプロパティ名を配列化したいみたいなパターン。

```csharp
    var hoge = new HoGE
            {
                Param1 = true,
                Param5 = true,
                Param9 = true,
            };

```

を処理して
[ "Param1" , "Param5", "Param9"]
ってしたい感じで取得したい時。


ゴリゴリ書けば

```csharp
string[] h = Enumerable.Range(1, 10)
                    .Select(x =>
                    {
                        switch (x)
                        {
                            case 1: return hoge.Param1 ? nameof(hoge.Param1) : "";
                            case 2: return hoge.Param2 ? nameof(hoge.Param2) : "";
                            case 3: return hoge.Param3 ? nameof(hoge.Param3) : "";
                            case 4: return hoge.Param4 ? nameof(hoge.Param4) : "";
                            case 5: return hoge.Param5 ? nameof(hoge.Param5) : "";
                            case 6: return hoge.Param6 ? nameof(hoge.Param6) : "";
                            case 7: return hoge.Param7 ? nameof(hoge.Param7) : "";
                            case 8: return hoge.Param8 ? nameof(hoge.Param8) : "";
                            case 9: return hoge.Param9 ? nameof(hoge.Param9) : "";
                            case 10: return hoge.Param10 ? nameof(hoge.Param10) : "";
                            default: return "";
                        }
                    }).Where(x => x != "").ToArray();

```

こんな感じかな。

PropertyInfoとか使えば


```csharp

string[] h = properties
                    .Where(pi => pi.Name.StartsWith("Param") && (bool)pi.GetValue(hoge))
                    .Select(pi => pi.Name)
                    .ToArray();
```

こんな感じ。

もっと良い書き方あるような気がするんだけど、思いつかない。
ROS奮闘　gmapping編その１

※この文章や内容は組み込み初心者、情報技術系雑魚が書いてるものですゆえ
過度な期待はせずに温かい目で見守ってください






初心者ROS奮闘記(になる予定)
第1弾
iCreateでgmappingしてみよ。

ということでいろいろ試行錯誤していきながらわかったことわからなかったことをメモ的に・・・

まずは使うもの
・ROS(indigo)
・iCreate(たぶん500シリーズ・・・)
・測域センサ(hokuyo URG-04LX-UG01)　高いらしい・・・9万とか・・・ﾋｴｯ

んで、とりあえずクリエイトを動かす。
roomba500のドライバをもらってくる
(http://arkapravo.github.io/roomba_500_ROS_drivers/)
で自分のcatki_wsに展開してrosmake
ドライバが入った。
動かすのは参考にさせてもらった
（http://cyberworks.cocolog-nifty.com/blog/2013/04/roombapython-bb.html）

端末で
$ sudo chmod a+rw /dev/ttyUSB0
クリエイトのパワーいれて
$ rosrun roomba_500_series roomba500_light_node 
パワー入れるのが先かもしんない。


次にセンサのドライバ 　wikiみたほうがはやい。
(http://wiki.ros.org/hokuyo_node/Tutorials/UsingTheHokuyoNode)

$ sudo apt-get install ros-indigo-hokuyo-node
公式wikiではこう
$ sudo apt-get install ros-indigo-urg-node
でも大丈夫らしい。
で、
$ sudo chmod a+rw /dev/ttyACM0
入れて
$ rosrun hokuyo_node hokuyo_node
で動く。

$ rqt_graph
で確認すると
![Screenshot from 2015-10-29 22:01:35.png](https://qiita-image-store.s3.amazonaws.com/0/98159/245b4c62-f894-f477-2652-ca26b40bc3b9.png)
ちゃんとトピックが出せてる(と思ってた)

キーボードでクリエイトを動かしたいなら
(http://wiki.ros.org/teleop_twist_keyboard) 
$ sudo apt-get install ros-indigo-teleop-twist-keyboard
でいれてきて
$ rosrun teleop_twist_keyboard teleop_twist_keyboard.py
で動いた

ここまでできたので
動かしてgmappingいけるやろ！
Vやねん！


gmapping「[ WARN] [1446122137.391726224]: MessageFilter [target=odom ]: Dropped 100.00% of messages so far. Please turn the [ros.gmapping.message_notifier] rosconsole logger to DEBUG for more information.
」

わい「ﾎｹﾞｯ・・・(ちーん)」

![Screenshot from 2015-10-29 22:08:54.png](https://qiita-image-store.s3.amazonaws.com/0/98159/715a2d3d-2d1d-aa76-33ba-51307727f569.png)


なんかオドメトリがうまくgmappingに入ってないみたい

追記：gmappingはそもそも/tfと/scanしかとらないみたいです
warnはタイムスタンプがどうのこうので怒られてるよう

というわけでまた次

(アドバイスとかくれると嬉しいです)
Googleの提供するDocker Registry の Google Container Registryを試す


参考文献 https://cloud.google.com/container-registry/

Googleの提供するDocker Registry。
略称はgcr。
料金は利用しているCloud Storageの分だけとられる。

利用にはgcloudコマンドを利用できるようにしておく必要がある。

#  イメージの作成

利用する場合はイメージの名前を

`レジストリのサーバ名`/`使用するGCPのプロジェクト`/イメージ名

とする。asia.gcr.io を使い hoge プロジェクトで nginxであれば

`asia.gcr.io/hoge/nginx` となる

# イメージのプッシュ

Docker Hubから nginx イメージを取得してプッシュする場合は

```
$ gcloud docker push イメージ名となる
```

さきほど使用した名前をつかうと

```
$ gcloud docker push asia.gcr.io/hoge/nginx
```

また、Docker Registry V2 APIを使うと少しはやく動作するらしい。
--serverオプションをつかえばV2APIとなる。

```
$ gcloud docker --server=asia.gcr.io push asia.gcr.io/hoge/nginx
```

# Docker Hub から nginxイメージを取得してpushする例

```
$ docker pull nginx
$ docker tag nginx asia.gcr.io/hoge/nginx
$ gcloud docker --server=asia.gcr.io push asia.gcr.io/hoge/nginx
```

# レジストリからイメージを取得する

これも gcloudコマンド経由で使う

```
$ gcloud docker --server=asia.gcr.io pull asia.gcr.io/hoge/nginx
```
RDS をスナップショットからリストアしたときに利用可能（available）になるのを待ってセキュリティグループを変更するシェルスクリプト

下記の記事のように RDS をシェルスクリプトで削除→リストアしようとしたところ、

- [RDS, Redshiftの起動停止スクリプト(検証環境用) ｜ Developers.IO](http://dev.classmethod.jp/cloud/aws/rds-redshift-start-stop/ "RDS, Redshiftの起動停止スクリプト(検証環境用) ｜ Developers.IO")

なぜか `--vpc-security-group-ids` が指定できませんでした。

しかも、セキュリティグループはリストアを開始した後、利用可能になるまで変更できないようです。

なので、最新のスナップショットからリストアをしつつ、利用可能になるまで待って、セキュリティグループを変更するシェルスクリプトを作成しました。

```sh
#!/bin/bash

set -eu

function rds_start()
{
    for id in "$@"; do
        aws rds describe-db-instances \
            --db-instance-identifier "$id" \
            --query "DBInstances[].DBInstanceStatus" \
            --output text >/dev/null 2>&1 &&:

        if [ $? -eq 0 ]; then
            echo "rds $id has been created"
        else
            snapshot=$(aws rds describe-db-snapshots \
                --query "reverse(sort_by(DBSnapshots,&SnapshotCreateTime))
                    [?DBInstanceIdentifier==\`${id}\`]|[0].[DBSnapshotIdentifier]" \
                --output text)

            echo "rds $id restore from $snapshot"

            aws rds restore-db-instance-from-db-snapshot \
                --db-instance-identifier "${id}" \
                --db-snapshot-identifier "${snapshot}" \
                --db-instance-class "db.t2.micro" \
                --db-subnet-group-name "ore-subnet" \
                --no-multi-az \
                --no-publicly-accessible \
                --no-auto-minor-version-upgrade \
                --storage-type gp2 > /dev/null
        fi
    done
}

function rds_wait()
{
    for id in "$@"; do
        echo -n "rds $id wait for available"
        while :; do
            status=$(aws rds describe-db-instances \
                --db-instance-identifier "$id" \
                --query "DBInstances[].DBInstanceStatus" \
                --output text)

            if [ "$status" == "available" ]; then
                echo " now $status"
                break
            fi

            echo -n .
            sleep 1
        done
    done
}

function rds_sg()
{
    for id in "$@"; do
        echo "rds $id modify security-group"

        sg=$(aws ec2 describe-security-groups \
            --filter 'Name=group-name,Values=ore-group' \
            --query 'SecurityGroups[].GroupId' \
            --output text)

        aws rds modify-db-instance \
            --db-instance-identifier "$id" \
            --vpc-security-group-ids "$sg" \
            --apply-immediately > /dev/null
    done
}

function rds_start_wait_sg()
{
    rds_start "$@"
    rds_wait "$@"
    rds_sg "$@"
}

rds_start_wait_sg ore-db are-db
```

インスタンスのサイズとか、サブネットグループの名前とか、セキュリティグループの名前とかはベタ書きしているので、変更する必要があります。
telnetを使ってサーバーにxhrを送信してみよう

## はじめに

サーバーサイドを実装して、その動作を確認するためにxhrを送信したい場合がありました。telnetを使ってみました。

この記事ではサーバーサイドの実装は紹介しません。telnetを使ってサーバーにxhrを送信する方法を紹介します。

## telnetを使ってサーバーにxhrを送信する方法

まず、サーバーサイドを実装して、サーバーを起動しておきます。

次に、telnetでそのサーバーと通信します。

``` sh
$ telnet localhost 4690

GET / HTTP/1.1
Host: localhost
X-Requested-With: XMLHttpRequest
Content-Type: application/x-www-form-urlencoded;charset=UTF-8
```

telnetでHTTPリクエストを送信するのとほとんど変わりませんね。

## まとめ

できそうだと思ったので、試してみました。もう少し便利なものが欲しいですね。
起動直後になんかする。recentfとかね

Qiitaに`init.el`の設定例として書く程度で完結するだろー、とか思ってたら全然簡単なかったので[zonuexe/init-open-recentf.el](https://github.com/zonuexe/init-open-recentf.el)にまとめた。

## やりたかったこと

1. `emacs hoge.txt`みたいにファイル名指定で起動したら何もしない (最初からファイル開かれてるので)
2. Emacs起動時にファイルが開かれてなかったら、`recentf`の履歴からファイルを開こうとする

## その前に

`recentf`は「最近使ったファイル」を利用するための機能。

[Emacsを快適に使うファイル周りの設定紹介](http://qiita.com/catatsuy/items/f9fad90fa1352a4d3161)あたりを参考にして`recentf`の設定をするとよい。ただし、`inhibit-startup-message`の設定と`add-hook`は**不要**。`recentf-ext`はインストールしてもしなくてもいい。

## とにかく導入する方法

最近のべんり機能を使ってるので、Emacs 24.4以上が必須。

1. [zonuexe/init-open-recentf.el](https://github.com/zonuexe/init-open-recentf.el)をもってくる
2. `init.el`か何かに`(init-open-recentf)`って書く

MELPAを設定して`package-install`とか、Caskでインストールとか、El-Getでインストールとか。

### 発展的な設定

recentfとか知らねーよ、ただファイル開けりゃいいんだよ、ってときはこうする。

```el
(setq init-open-recentf-function #'find-file)
(init-open-recentf)
```

## やったこと

Emacs Lispを勉強したいひと向けの解説。具体的なことは書かないので興味あったらコードを読みにいってね。

### Helmとかidoとか活用する

もしHelmとかidoとか使ってたら、それを使ってrecentfを開くようにする。Anythingがあればそれを使って、どちらもなければデフォルトの`recentf-open-files`を利用する。

### 「ファイルが開かれてなかったら」

ちょっとびっくりだった。`M-x list-buffers`とかあるから開かれてるファイル一覧利用できる機能とかあるかと思ったけど、結局`init-open-recentf-buffer-files`はシンプルに再実装しちゃった…

### 初期化後のタイミングにうまくひっかける

Emacsには何かのタイミングで処理をひっかけるための「フック」と呼ばれる仕組みが用意されてる。たいてい`before-xxx-hook`と`after-xxx-hook`みたいに前後にひっかけられるようになってて、初期化処理でも例外ではなくて`after-init-hook`, `emacs-startup-hook`, `window-setup-hook`といくつかフックが用意されてるので、ふつうはこれを利用すればいい…

……いいと思ったんだけどなあ。

個人的にはEmacsの起動画面は大好きなので、これを潰すのは却下。同様の理由で`initial-buffer-choice`に指定するのも却下。

## まとめ

ひたすら`startup.el`を読みまくって、Emacsの起動プロセスについて説明できるようにはなった。あと`nadvice.el`が最高で、異常にべんりだった。
ProcessingでSVGの線が特定の条件で描画されない件

[前回のコーディング会でSVGを扱った際](http://qiita.com/yd_niku/items/835c30e28cc9e2670955)に、(時間もないし)描きたい絵をいきなりやってみて表示されないと困るので、ひとまずSVGのいろんなパターンを個別に検証してみた結果です。

結論からいって、イラレ(CC)の線の設定で、線種：基本、筆圧：均等、線色：あり、塗色：なしのものが描画されないことがわかりました。
SVG的には`line`要素や`path`要素の`style="fill:none;"`となっているものがだめなようです。

![9716e896fb6f0ca3731bf09e2bb841d1.png](https://qiita-image-store.s3.amazonaws.com/0/3516/8acaf043-bd19-25cf-5d5a-dada27775a11.png)

下記、一通りの検証内容です。

## shapeで指定するサイズ(外枠)はイラレでいうと何なのか

```
svgdata = loadShape("test_graphic_outline.svg");
// draw
shape(svgdata, 0, 0, 500, 500);//width/heightと同じ大きさで描画
```
![7784b07da2536f4a8efaef077466403c.png](https://qiita-image-store.s3.amazonaws.com/0/3516/a66951cb-8b61-66b6-7d7e-360d45ba902b.png)

これはイラレのアートボードが外枠になっていました。
なので200px四方のアードボードであれば、600pxで描画すれば3倍となります。

## アートボードをマイナス方向にはみ出すと描画されるのか

```
svgdata = loadShape("test_graphic_negative-position.svg");
```

されました。
`shape(svgdata, 100, 100, 600, 600)`というふうにプラス方向にずらして描画すると、ちゃんと描画されてました。

## 透明度やグループはちゃんと描画されるのか

```
svgdata = loadShape("test_graphic_alpha.svg");
```
```
svgdata = loadShape("test_graphic_group.svg");
```
```
svgdata = loadShape("test_graphic_group+alpha.svg");
```
![fe4b053ee261aba82fbcc9b15b2f55cf.png](https://qiita-image-store.s3.amazonaws.com/0/3516/f934ab8c-e718-7d3b-a186-fefe5904b30c.png)

されました。グループに対する透明度もちゃんと反映されていました。


## 線はどこまでちゃんと描画されるのか

```
svgdata = loadShape("test_graphic_line.svg");
```
![a8069f436192e5f2d04b417c5068d4fa.png](https://qiita-image-store.s3.amazonaws.com/0/3516/f386b2af-c5cf-163f-fabe-433441c6aee3.png)

パスとブラシのうちブラシしか表示されません。

```
svgdata = loadShape("test_graphic_lines.svg");
```

試しに塗りを設定してみたら問題なくすべて表示されました。
![07c86bca4e113bfa4d1ad1023b8a09bc.png](https://qiita-image-store.s3.amazonaws.com/0/3516/9dfbb5b3-8d96-771c-a6ba-f9a5825e34e7.png)

```
svgdata = loadShape("test_graphics_nofilled-lines.svg");
```
塗りをナシにすると、直線、閉じたベジェ曲線、開いたベジェ曲線、ブラシツールの線を含めたSVGを描画してみましたが、ブラシツールの線しか描画されません。

```
svgdata = loadShape("test_graphics_styled-lines.svg");
```
![51647ba20d3e43aba051d0d37fb7446e.png](https://qiita-image-store.s3.amazonaws.com/0/3516/ce5c8ca9-1fd9-6bf4-52d6-9ed3cc9bcf62.png)

ブラシのように線種などをいろいろ指定すると、線種：基本、筆圧：なしのものが描画されないようです。

## ブラシのタッチの表現が可能

ついでにびっくりしたのが、ブラシのタッチがちゃんと再現されていることです。
SVGファイルをみるとベクタで形状として書きだされていて線ではなく塗りで着色されているため、ブラシ関係は表示されている、ということのようです。

それをふまえて、イラレでイラストを書いて使う場合、線をアウトライン化するなど工夫が必要かもしれません。あんまりなさそうですが。

現場からは以上です。

## 宣伝

[ワンパクでは検証すらも楽しくてしょうがない元気なフロントエンドな人を募集しています!!!](http://1pac.jp/recruit)
マイナンバーのチェックデジットを計算する PHP版

Ruby:http://qiita.com/qube81/items/fa6ef94d3c8615b0ce64
C++:http://qiita.com/yumetodo/items/600ca0df422010cbc4c1
Python:http://qiita.com/haminiku/items/bcf4bac82bd1ca62c746
流行ってるみたいなので乗っからざるを得ない。

http://law.e-gov.go.jp/announce/H26F11001000085.html

```text
第五条 　令第八条の総務省令で定める算式は、次に掲げる算式とする。
算式
　１１―（ｎ＝１（シグマ）１１（Ｐｎ×Ｑｎ））を１１で除した余り）
　ただし、（ｎ＝１（シグマ）１１（Ｐｎ×Ｑｎ））を１１で除した余り≦１の場合は、０とする。
算式の符号
　Ｐｎ　個人番号を構成する検査用数字以外の十一桁の番号の最下位の桁を１桁目としたときのｎ桁目の数字
　Ｑｎ　１≦ｎ≦６のとき　ｎ＋１　７≦ｎ≦１１のとき　ｎ―５
```

よくわからん。
どういう意味だよ。

[マイナンバー（個人番号）の１２桁の数字の下一ケタがチェックデジット... - Yahoo!知恵袋](http://web.archive.org/web/20150912114426/http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10147037045)
おお、わかりやすい。

```php
<?php
	declare(strict_types=1);

	/**
	* マイナンバーが形式的に正しいかをチェックする。
	* @param String 12桁のマイナンバー
	* @return bool 正しければtrue
	*/
	function checkMyNumber(string $myNumber):bool{
		return calcMyNumber(substr($myNumber, 0, -1)) === $myNumber[11];
	}

	/**
	* マイナンバーのチェックディジットを計算する
	* @param String 11桁のマイナンバー
	* @return String チェックディジット1桁
	* @throws InvalidArgumentException
	*/
	function calcMyNumber(string $myNumber):string{
		// 数字11桁
		if(strlen($myNumber)!==11 || !ctype_digit($myNumber)){ throw new InvalidArgumentException(); }
		
		for($sum=$n=0; $n<11; $n++){
			// Pnはn桁目 右からなので順番は逆
			$pn = $myNumber[10-$n];
			// Qnは+1か-5、ただし0スタートなので+1する
			$qn = $n<6 ? $n+2 : $n-4;
			// SUM($pn*$qn)
			$sum += $pn * $qn;
		}
		// 11-(11で割った余り) がチェックディジット。ただし10,11なら0
		$ret = 11 - $sum%11;
		return $ret>9 ? '0' : (string)$ret;
	}

	// 動作確認
	$arr = [
		'123456789010','123456789011','123456789012','123456789013','123456789014',
		'123456789015','123456789016','123456789017','123456789018','123456789019',
	];
	foreach($arr as $v){
		var_dump(checkMyNumber($v)); // 123456789018だけtrue
	}
	var_dump(calcMyNumber('12345678901')); // '8'
```

0スタートが来る可能性があるため、文字列として扱っています。

それにしても誰が12桁なんて仕様にしたんですかね。
チェックディジットは一意に決まるので、実質11桁、たった1000億通りしかありません。
現時点でも適当に1000回撃てば一回通ってしまいます。
IPv6とまでは言わないが、せめて16桁くらい取っておいてもよかっただろ。

```php
// 微妙なgolf
function calcMyNumber(string $m){
	for(;$s=$m[$n++];$u+=$s*$p=$n<6?7-$n:13-$n);return($r=$u%11)<2?0:11-$r;
}
```

微妙というか入力に0があると正しく動かない。
長さも絶対もっと詰められるはずなんだが、どうも思いつかない。
続き誰か頼んだ。
delayed_jobの機能についてもうちょっと


## 書く契機
最近何かと使っているdelayed_jobについて改めてまとめることにした。"ちょっと高級"な機能についてもちょっと書いてみた。

## delayed_jobとは？
delayed_jobとはバックグラウンドで非同期処理をしてくれるrailsのgemの一種。

### ちょ、"非同期処理"とは？
簡単に言ってしまえば時間のかかる処理を、通常の処理とは別に、「あとで処理しますよリスト」に登録すること。要はあるタスクを実行している間に他のタスクを実行できる、ということ。逆は"同期処理"とよばれ、あるタスクが実行されている間、他のタスクはできない。

* 時間のかかる処理の例: メール送信・ファイルのダウンロード・アップロードなど

一度に複数の処理ができて、便利の思える非同期処理。しかしデメリットも当然あり、同時に処理されるので、下手をすればデータベースの整合性が取れなくなってしまうから要注意。

## 使い方(基礎)
インストール自体は色々なところにのってあるので、ここでは割愛。主にその使い方について書きます。

### ワーカーの起動
以下のコマンドで起動する。"バックグラウンド"と言ってるのはこれ。

```terminal
bundle exec rake jobs:work
```


### 基本的な使い方
もっとも一般的な使い方を紹介する。

```
Class.method(hoge)
```

という処理を非同期で実行したい(世間ではこれを"キューに入れる"、や、"enqueueする"などと表現する)場合は、クラスとメソッドの間にdelayを挟むだけで良い。

```
Class.delay.method(hoge)
```

### 何が起こるの？
delayを挟んで実際にメソッドが呼び出されたときに何が起こるのかを順を追って説明する。

* methodが呼ばれると、次に行われる処理がデータベース内のdelayed_jobsテーブルに格納される(特にhandlerというカラムに着目！)。実際に処理はまだされない。
* delayed_jobsが起動されていれば、delayed_jobsテーブル内の「実行可能」なタスクがどんどん吐き出されて、順に処理されていく(これをdequeueという)。(起動してなかったらテーブルに溜まっていくだけ。考え方はまさにキューそのもの。)

## 使い方(発展)
### delayed_jobsのその他属性
さて、ここまでdelayed_jobsのもっとも基本的な部分について話したので、少々発展の話をば。
delayed_jobsテーブルの属性一覧を見ると、handler以外にたくさんの選択肢があるのがわかる。そのいくつかを解説していく。


* run_at: 実際にdequeueする時間を指定するためのカラム。
* queue: jobの振り分け用カラム。決まった書き方がないみたいです(<=オススメの書き方あれば誰か教えて欲しいです)。
* priority: dequeueする順番、優先順位のカラム。番号の小さいものから優先的に処理される。
* last_error: 処理が失敗した場合、そのjobは吐き出されないでそのままdelayed_jobsの中にとどまる。その際エラーメッセージはここに格納される。
* failed_at: エラーだったときにそのエラーの起こった時刻のカラム。

### 実際の使い方
基本的には、delayのうしろに引数として渡せば良い。以下、そのいくつかの例。

```
Class.delay(run_at: 3.hours.from_now, queue: 'hogehoge').method(hoge)
# メソッドが実行されてから3時間後に処理される / jobの名前はhogehoge

Class1.delay(priority: 10).method1
Class2.delay(priority: 1).method2
# 両方テーブル内に存在する場合後者の方が優先的に処理される
```

### delayed_jobsテーブルのレコードをいじる
普段私たちは直接delayed_jobsテーブル内のレコードを書き換えたりするのはあまりしない。それでもいじりたい人もいると思うので、一応紹介。基本的には

```
Delayed::Job.where(queue: 'hogehoge')
Delayed::Job.find_by(run_at: Time.now - 3.hours)
```
などとDelayed::Jobをクラスとして扱えば良い。
VirtualBox + windows7 for Mac OS X

## install VirtualBox

1. [VirtualBox 5.0.8](http://download.virtualbox.org/virtualbox/5.0.8/VirtualBox-5.0.8-103449-OSX.dmg)をDLする
2. DLした"VirtualBox-5.0.8-103449-OSX.dmg"をダブルクリックで展開する
![ss_002.png](https://qiita-image-store.s3.amazonaws.com/0/80828/60912e67-6cf7-6e16-7537-99068f43e529.png)
3. VirtualBox.pkgをダブルクリックで実行する
4. "続ける"をクリックする
![ss_003.png](https://qiita-image-store.s3.amazonaws.com/0/80828/59450c2d-76bd-1fa6-3399-b684a6d08a63.png)
5. "続ける"をクリックする
![ss_004.png](https://qiita-image-store.s3.amazonaws.com/0/80828/d669542b-8a4a-015d-6b9a-f92fd52b938a.png)
6. "インストール"をクリックする
![ss_005.png](https://qiita-image-store.s3.amazonaws.com/0/80828/a4e60a6a-a17b-bd5d-b9b5-8fd870ac3364.png)
7. セキュリティ設定をしている場合は、キャプチャのようにパスワードの入力を求められる
8. パスワードを入力後"ソフトウェアをインストール"をクリックする
![ss_007.png](https://qiita-image-store.s3.amazonaws.com/0/80828/ebaffb60-b355-ebd3-2b33-b67fd5f21a80.png)
9. インストール完了後"閉じる"をクリックする
![ss_008.png](https://qiita-image-store.s3.amazonaws.com/0/80828/26809b5e-2030-873e-3a5c-e6101ac132e6.png)


## download VM

1. https://dev.modern.ie/tools/vms/mac/ にアクセスする
2. 仮想マシン : IE11 on Win7 を選択する
3. プラットフォームの選択 : VirtualBox を選択する
4. "Download zip"をクリックしてファイルをDLする
![ss_011.png](https://qiita-image-store.s3.amazonaws.com/0/80828/792d6b9f-2c1d-c0fb-3bee-d693b9f4422f.png)
5. DLが完了すると"IE11 - Win7.ova"になる
![ss_013.png](https://qiita-image-store.s3.amazonaws.com/0/80828/cab2bafa-6474-f097-d07b-378b9dce1e07.png)


## import VM

1. VirtualBoxを起動する
![ss_010.png](https://qiita-image-store.s3.amazonaws.com/0/80828/b6da4d26-1ae1-e9db-e351-7652cdf9db08.png)
2. [⌘ + I]を押下し"インポートしたいアプライアンス"を表示する
![ss_012.png](https://qiita-image-store.s3.amazonaws.com/0/80828/82196c7e-b7fa-ce63-c525-6b6f2fba8830.png)
3. フォルダアイコンをクリック、DLした"IE11 - Win7.ova"を選択し"オープン"をクリックする
![ffda399a-366c-bd29-2411-030b84527956.png](https://qiita-image-store.s3.amazonaws.com/0/80753/6a442183-3d92-ca7b-8387-11d7e7ac20ed.png)
4. "続ける"をクリックする
![ss_015.png](https://qiita-image-store.s3.amazonaws.com/0/80828/b18bd7a7-f543-c697-8bea-d2b77f89bf31.png)
5. "インポート"をクリックする
![ss_016.png](https://qiita-image-store.s3.amazonaws.com/0/80828/3e7b4fda-0bca-a98a-f33a-f25d1d1d9820.png)
6. インポート中...
![ss_017.png](https://qiita-image-store.s3.amazonaws.com/0/80828/e102baca-e618-d61b-0605-bf559141c5b9.png)
7. インストールが完了後"IE11 - Win7"が追加される
![ss_018.png](https://qiita-image-store.s3.amazonaws.com/0/80828/a2d8eb43-0191-0a4a-b9e9-c39a5ebf36aa.png)
8. "IE11 - Win7"を選択し"起動"をクリックする
![ss_019.png](https://qiita-image-store.s3.amazonaws.com/0/80828/4f437b93-0319-ea5f-1a31-f6129785a0e1.png)
9. 起動完了後はキャプチャのようになる
![ss_020.png](https://qiita-image-store.s3.amazonaws.com/0/80828/dc544fd7-e682-7aa3-eb2a-df3b663faec8.png)
10. "Home network"をクリックする
![ss_021.png](https://qiita-image-store.s3.amazonaws.com/0/80828/13e3a961-070c-5327-2d7a-c8df0caa5ebc.png)
11. "Next"をクリックする
![ss_022.png](https://qiita-image-store.s3.amazonaws.com/0/80828/b5181962-9ca9-f70e-e1f2-5b8c6e448e98.png)
12. "Finish"をクリックする
![ss_023.png](https://qiita-image-store.s3.amazonaws.com/0/80828/282cd848-022a-3b80-ad7f-a2fa01c1747b.png)
演算のたびに新オブジェクトを作ることによる問題

Java界ではけっこう有名な問題を、Rubyのプログラミング中に踏んでしまいました。

# 問題の概要（Java版）
Javaでは`String`がイミュータブル（一度生成したら、値を変えることができない）なので、文字列連結を行った場合には「現在の文字列をコピーして新たな文字列を生成する」という処理が必要になります。そのため、単純に*n*個の文字列を連結で生成していくと、*O(n<sup>2</sup>)*だけのコピー処理が必要となり、非効率になります。[以前、自分も触れましたが](http://qiita.com/jkr_2255/items/7bc5e52792439869d253#%E3%83%AB%E3%83%BC%E3%83%97%E3%81%A7%E5%9B%9E%E3%81%99%E3%82%88%E3%81%86%E3%81%AA%E6%96%87%E5%AD%97%E5%88%97%E7%94%9F%E6%88%90%E3%81%AB%E3%81%AFstringbuilder%E3%82%92%E4%BD%BF%E3%81%86)、「大量の文字列連結を行う場合には`StringBuilder`を使う」ということは、Javaではよく知られています。

# 問題その1（自作クラスにて）
Rubyで論理式を処理するようなシステムを作っていて、そして別に作ったプログラムから数千個の項を生成していました（それ自体は問題なく動作していました）。そして、最後に

```rb
expression = terms.reduce(&:or)
```
のようにしたところで、とたんに固まってしまいました。性質上、論理式の各項は一度生成すれば書き換えないものなので、長さが徐々に増える項が次々と作成されていって[^1]、*O(n<sup>2</sup>)*の処理となってしまっていたのでした。そこで新たなメソッドを作って、「複数の項を一気にOR/AND連結できる」ようにすることで、一瞬で終了できるようになりました。

# 問題その2（Ruby添付のライブラリにて）
そして、目的の式ができることが確認できたところで、この式に現れる変数のリストが必要となりました。同じ変数は一度でいいので、これは「集合」だからと、標準添付の[setライブラリ](http://docs.ruby-lang.org/ja/2.2.0/library/set.html)を使ってみることにしました。ところが、これが失敗だったということに、あとで気づくことになりました。

変数自身は別として、それ以外の項だと、その項が持つ変数リストは「自分自身が要素として持つ項に含まれる変数の総和」なので、再帰的に書くことができます。とりあえず、こう書いてみました。

```rb:失敗例
def variables
  @terms.map(&:variables).reduce(&:|)
end
```

**さっきと全く同じパターン**ではまってしまいました。さらに、さっきと同じ手法で回避しようにも、`Set`には「他のセットを破壊的にマージする」ようなメソッドが存在せず、要素を1つ1つ追加する以外にない、という悲しい結論にたどり着くこととなりました。結局、破壊的操作もやりやすい配列を使って

```rb:改善後
def variables
  @terms.map(&:variables).flatten.uniq
end
```
とすることで、スムーズに動作するようになりました。

で、このQiita投稿を書くときにsetライブラリの説明を読んでみたら、「Arrayの持つ演算機能とHashの高速な検索機能を合わせ持ちます」とありました。つまり、集合演算に限れば充分Arrayでも可能だということで、今回の例では「高速な検索機能」を活かすこともできず、破壊的変更がやりづらいというSetのデメリットが際立つ結果となってしまいました。

[^1]: あとで行う処理の都合上、`(a∨b)∨c`と`a∨(b∨c)`を区別せずに、まとめて`(a∨b∨c)`という1つの項として扱うように系を組んでいました。
ChromeのCookieから値を取得する

ChromeのCookieからニコニコのsessionの値を読み出そうと思った時に，暗号化されてたみたいなので，その時調べたことをメモ

参考にしたページは[ここ](http://takuya-1st.hatenablog.jp/entry/2015/04/02/051033)

ほぼ参考にしたページをrubyで書いただけですね
それと，面倒くさかったのでmacでしか動かないです．

## 1. Cookieから目的のものを探す

```ruby
ActiveRecord::Base.establish_connection(
  adapter: 'sqlite3',
  database: File.expand_path('~/Library/Application Support/Google/Chrome/Default/Cookies')
)

class Cookie < ActiveRecord::Base
  self.table_name = 'cookies'
end

val = Cookie.where(host_key: '.nicovideo.jp', name: 'user_session').first.encrypted_value
```

## 2. Keychainからpasswordを取得
復号するときのkeyを作成するためのパスワードが，KeychainのChrome Safe Storageに保存されてるのでそれを取得

```rb
def chrome_pass
  Keychain.generic_passwords.where(account: 'Chrome').first.password
end
```


## 3. passwordからkeyを作成

```rb
def generate_key(pass)
  salt = 'saltysalt'
  iter = 1003
  length = 16

  OpenSSL::PKCS5.pbkdf2_hmac_sha1(pass, salt, iter, length)
end
```

どうしてこの値を使ってるのかは分かりません．誰か知ってたら教えて下さい

## 4. Cookieの値をkeyで復号

```rb
def chrome_decrypt(encrypted_value, key)
  iv = (' ' * 16)

  encrypted_value.slice!(0, 3)

  chiper = OpenSSL::Cipher::AES.new(128, :CBC)

  chiper.decrypt
  chiper.key = key
  chiper.iv = iv

  chiper.update(encrypted_value) << chiper.final
end

puts chrome_decrypt(val, generate_key(chrome_pass))
```

なんで復号の時にこれやってるのとかわからずにrubyで書きなおしただけなので質問されてもわからないです．

最後にプログラム全体を書いときます


```rb
require 'active_record'
require 'sqlite3'
require 'keychain'

# Chrome Safe Storageのpasswordを取得
def chrome_pass
  Keychain.generic_passwords.where(account: 'Chrome').first.password
end

# 複号化の鍵を作成
def generate_key(pass)
  salt = 'saltysalt'
  iter = 1003
  length = 16

  ret = OpenSSL::PKCS5.pbkdf2_hmac_sha1(pass, salt, iter, length)
end

def chrome_decrypt(encrypted_value, key)
  iv = (' ' * 16)

  encrypted_value.slice!(0, 3)

  chiper = OpenSSL::Cipher::AES.new(128, :CBC)

  chiper.decrypt
  chiper.key = key
  chiper.iv = iv

  chiper.update(encrypted_value) << chiper.final
end


ActiveRecord::Base.establish_connection(
  adapter: 'sqlite3',
  database: File.expand_path('~/Library/Application Support/Google/Chrome/Default/Cookies')
)

class Cookie < ActiveRecord::Base
  self.table_name = 'cookies'
end

val = Cookie.where(host_key: '.nicovideo.jp', name: 'user_session').first.encrypted_value
key = generate_key(chrome_pass)

puts chrome_decrypt(val, key)

```
getResources().getColor(int id) deprecated

気がついたらgetResources().getColor(int id)がdeprecatedになってた。
こっちを使う。

[ContextCompat.getColor(Context context, int id)](http://developer.android.com/intl/ja/reference/android/support/v4/content/ContextCompat.html#getColor(android.content.Context, int))
IE互換モード時にiFrame内のHTMLでX-UA-Compatibleを指定した場合のUserAgent

IEの互換モードにいじめられたので備忘

##おまじない
IEの互換モードが有効な場合でも各バージョン最新のレンダリングをして欲しい時のおまじない

```:html
<meta http-equiv="X-UA-Compatible" content="IE=edge">
```
通常はこれで問題ないがiFrameの中に読み込まれる場合に注意が必要

##iFrameの内側でX-UA-Compatibleを指定
```out.html
<html>
<head>
<meta charset="UTF-8"> 
<title>互換モードの闇</title>
<script type="text/javascript">
window.onload = function(){
  document.getElementById('uavalue').innerText = navigator.userAgent;
}
</script>
</head>
<body>
  <div>UserAgent : <span id="uavalue"></span></div>
  <iframe src="in.html"></iframe>
</body>
</html>
```

```in.html
<html>
<head>
<meta charset="UTF-8"> 
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>iFrameの内側</title>
<script type="text/javascript">
window.onload = function(){
  document.getElementById('uavalue').innerText = navigator.userAgent;
}
</script>
</head>
<body>
  <span>ieEdgePage</span>
  <div>UserAgent : <span id="uavalue"></span></div>
</body>
</html>
```

上記のようなhtmlをIE7〜11ぐらいの互換モードで開くと
out.htmlでは互換モードによってIE7っぽいUAが、
in.htmlでは各ブラウザのUAが表示される。
…と思いきやIE11ではIE8っぽいUAが表示される。

IE=Edgeが指定されているin.htmlもIE7っぽくレンダリングされるため、CSS3を利用した角丸ボタンは四角いボタンとなる。


##つらいやつ
in.htmlでUAによってバージョン判定をして処理を振り分けたりするとつらいことになる場合がある。
例えばIE10以降はhtml5のaudio、IE10未満はWindowsMediaPlayerプラグインで再生…みたいなことをしていると、IE10で死ぬ。
IE10のUAはIE10っぽいのでjavascriptでaudioを作ろうとするが、レンダリングはIE7っぽいので落ちる。つらい。
IE11はなぜかIE8っぽいUAなのでWMP側に割り振られて救われる。ラッキー。
UAで判断せずに`createElement('audio');`したうえで`canPlayType`で判断しましょう？

##おまけ
IE11の開発者ツールで各バージョンをエミュレートしても、やっぱそれぞれのIEで見ないとだめです。
エミュレートのIE8では綺麗に表示されるしjsもちゃんと動くのに本物のIE8では崩れたりjsがエラーになることまれによくある。つらい。

##結論
IE滅べ今なう💢
Listに入ったDictionary型をユニークにしたい

# データ
以下の様な出たがあったとする。これをユニークにしたい。

```py
>>> d = [{'x':1, 'y':2}, {'x':3, 'y':4}, {'x':1, 'y':2}]
```

# ユニーク
```py
>>> [dict(y) for y in set(tuple(x.items()) for x in d)]
[{'y': 4, 'x': 3}, {'y': 2, 'x': 1}]
```


# 参考
http://stackoverflow.com/questions/6280978/how-to-uniqify-a-list-of-dict-in-python
MCMCについて整理してみた。

マルコフ連鎖モンテカルロ法(MCMC法)について
・MCMC法とは何か？
・MCMC法の種類とPythonモジュール
をまとめてみました。


#０．マルコフ連鎖モンテカルロ法(MCMC法)とは？
マルコフ連鎖を用いることで、モンテカルロ法を強化したものです。

後で詳しく書きますが、
モンテカルロ法は、真にランダムにサンプリングを行うため
・計算コストがかさむ
・精度も向上しない
という課題があります。
そこでマルコフ連鎖モンテカルロ法は、
その課題をマルコフ連鎖を用いることで改善したものです。



#１．モンテカルロ法とは？

"Pythonによるモンテカルロ法入門"
http://aidiary.hatenablog.com/entry/20140620/1403272044
モンテカルロ法が一から丁寧に解説されており、
しかもPythonによる実装付きです。

これだけの分量を試しながら、とても丁寧な解説付きで理論も学べる。
元になった本を僕は持っていますが、こちらのページを読んだ方が
はるかに労力が少ないかつ分かりやすくていいと思います。

モンテカルロ法といっても、結構種類があります。
・逆変換法
・Box-Muller法
・受理棄却法
・重点サンプリング

※原本ではこの後にマルコフ連鎖モンテカルロ法(とメトロポリス法)
の解説があるのですが、このサイトではそこの記載がありません。


#２． マルコフ連鎖とは
ざっくり、時系列において確率的に遷移させるように
行列演算を行うものです。(正確ではありませんが…)
また、確率的に遷移をするオートマトンであるという考え方もできます。

"Introduction to Markov chain : simplified!"
http://www.analyticsvidhya.com/…/07/markov-chain-simplified/
英語ですが、良い記事です。


#３． マルコフ連鎖モンテカルロ法(MCMC法)

##1) MCMC法とは？

モンテカルロ法は、真にランダムにサンプリングを行うため
・計算コストがかさむ
・精度も向上しない
という課題があります。

マルコフ連鎖モンテカルロ法は、
マルコフ連鎖を定常分布としたサンプリングを行うことで、
上記課題を改善した手法です。

##2) MCMC法のアルゴリズム

step1. 初期点を決める
step2. マルコフ連鎖により次のサンプリングを行う分布を決定する
　　※初期点近辺(今までのサンプリング)内に対象がありそうである
step3. 分布が収束をするまで、step2を繰り返す



#４．Pythonによる実践

##1) はじめてのMCMC (メトロポリス・ヘイスティングス法)
https://tatsyblog.wordpress.com/

ソースコードを読み解くという側からも、
MCMCが理解できるような気がします。

メトロポリス・ヘイスティング法は、最も自然な発想の元で
設計されたオーソドックスな手法です。
確率の低い方へ向かう場合に、一定確率において
定常分布が遷移をしないようストッパーをかけたものです。
※必ず遷移しないようにすると、局所解に落ちやすい
※上のアルゴリズムでは原始的に必ず遷移をさせている

##2) MCMC法の種類
その他、
・ギブスサンプリング法
・ハイブリッドモンテカルロ法
・スライス・サンプリング法
が紹介されていますが、それは↑記事参照で。

##3) Pythonモジュール
↑リンクでは、mcmcモジュールを用いておりますが、
そのほかにもpymc3モジュールなどもよく使われるようです。
http://qiita.com/kenmatsu4/items/a0c703762a2429e21793


#５．理論体系を学ぶには

統計数理研究所　伊庭幸人先生による
MCMC講義(https://www.youtube.com/watch?v=-H28H1unn0M)

定常分布から、マルコフ連鎖の性質、そして物理的な側面まで、
平易で分かりやすく解説をされています。
これを見るとMCMCの土台の部分はすぐ理解できます。


#６．最後に
MCMC法は、最近話題の本の素晴らしい解説記事
[特集] ベイズ推論とMCMCのフリーソフト のサポートページ
https://sites.google.com/site/iwanamidatascience/vol1/support_tokushu
を見れば十分かもしれません。

しかしここでは、
1) マルコフ連鎖モンテカルロ法とは何かという入り口
2) Pythonモジュールの使い方
の初歩を書いて、差別化はできたかと…
CharlesでLocalProxy通したときHTTPSのページが信頼されない問題


[Charles](http://www.charlesproxy.com/)のローカルプロキシを使うと、ローカルにある作業ファイルをサーバーにあるファイルかのように読み込ませることができるので、デバッグの効率がよくなります。

ただしそのままだとSSL通信を利用したチャットツールやメールツールでセキュリティエラーがでて他の支障がでることがあります。
そんなときは次の2点を設定してみてください。

## `SSL Proxying`を有効にする

1. メニューの`Proxy > SSL Proxying Settings > SSL Proxying`のチェックボックスを有効にする。
2. ドメインを指定する(または `*:*`のようにワイルドカードにしておく(のが良いことなのかは知らない)) 

![d7131f614eff8a8c926fe09308836050.png](https://qiita-image-store.s3.amazonaws.com/0/3516/e22648ac-bcee-1cc5-bfad-b5289f84b178.png)

## Charlesの証明書を信用することにする

リクエストの詳細見ると下記のように出ているので調べたら[Charlesのドキュメント](https://www.charlesproxy.com/documentation/using-charles/ssl-certificates/)に書いてありました。

```
You may need to configure your browser or application to trust the Charles Root Certificate. See SSL Proxying in the Help menu.
```

1. メニューの`Help > SSL Proxying > Install Charles Root Certificate`をクリックするとkey chainが起動する  
![69c015afeb51e52e8c0f52264fc5c411.png](https://qiita-image-store.s3.amazonaws.com/0/3516/33244943-a1c7-9db3-218c-2e8ff2afec80.png)
2. 証明書のリストにCharlesの証明書が赤く×になっているところがあるのでダブルクリックして詳細を表示する  
![eef9da69aeb0549a5f8ad0b21c00da81.png](https://qiita-image-store.s3.amazonaws.com/0/3516/42fd583e-a26c-3ea2-91e0-458ff6f00a45.png)
3. 詳細ウインドウの信頼の項目を開いて、"常に信用する"を選択する(Macのパスワード聞かれます)  
![26e1e1d20ffe921e596d81019a59f799.png](https://qiita-image-store.s3.amazonaws.com/0/3516/55d3e987-8786-1315-f611-ceb960b6c4e7.png)
4. 先ほどの証明書の表示が大丈夫そうなアイコンに変わります  
![851754e802ae183b2a2f6393ff8b74cd.png](https://qiita-image-store.s3.amazonaws.com/0/3516/cd21ef5d-1913-5dc2-d7b3-020652e73563.png)

いろいろ分かりにくいですが証明書が発見できればあとは簡単でした。
では良きデバッグライフを。

## 宣伝

[ワンパクではデバッグもクリエイティブに楽しめるフロントエンドな人を募集しています!!!](http://1pac.jp/recruit)
[Java] LRUキャッシュの実装


# 目的

- Java で LRUキャッシュを作る
- LRU は Least Recently Used の略で「捨てるのは、最も使われていないものから」という意味

参考: [wikipedia: Least Recently Used](https://ja.wikipedia.org/wiki/Least_Recently_Used)

# java.util.LinkedHashMapクラスを活用

LinkedHashMapクラスには以下のようなコンストラクタが存在します。

```java
public LinkedHashMap(
        int initialCapacity,
        float loadFactor,
        boolean accessOrder)
```

前の２つの引数は HashMap 系ではおなじみですが、３つめの引数が特徴的なもので「順序付けモード」を指定します。

この「順序付けモード」は false だと「挿入順」（＝通常の LinkedHashMap と同じ動作）、true だと「アクセス順」になります。

つまり通常の LinkedHashMap のイテレータは挿入した順番に返しますが、これを true にすると、アクセス順（の逆順）で結果を返します。

もっと簡単に言えば「get() をすると該当の要素は一番後ろに移動する」ということです。

```java
Map<String, String> map = new LinkedHashMap<>(15, 0.75f, true);

map.put("one", "1st");
map.put("two", "2nd");
map.put("three", "3rd");
System.out.println(map);

map.get("one");
System.out.println(map);

map.get("two");
System.out.println(map);
```

```
{one=1st, two=2nd, three=3rd}
{two=2nd, three=3rd, one=1st}
{three=3rd, one=1st, two=2nd}
```

また、LinkedHashMapには以下のようなメソッドが存在します。

```java
protected boolean removeEldestEntry(Map.Entry<K,V> eldest)
```

デフォルト実装では false を返しますが、このメソッドが true を返すとマップの一番古いもの（先頭の要素）が削除されます。

この２つを組み合わせると、個数を指定したLRUキャッシュを作成することができます。

```java
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * LRUキャッシュマップ
 */
public class LruCacheMap<K, V> extends LinkedHashMap<K, V> {
	/** シリアライズバージョン */
	private static final long serialVersionUID = 1L;

	/** キャッシュエントリ最大数 */
	private final int maxSize;

	/**
	 * 指定された最大数でインスタンスを生成
	 * @param maxSize 最大数
	 */
	public LruCacheMap(int maxSize) {
		super(15, 0.75f, true);
		this.maxSize = maxSize;
	}

	/** エントリの削除要否を判断 */
	@Override
	protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
		return size() > maxSize;
	}
}
```

gist: [LruCacheMap.java](https://gist.github.com/yoshi389111/ca0594f803d24103077a)

（順序付けモードを false にすれば、登録が古いものから捨てるキャッシュになります）

# イテレータでの取得時の注意

この LRU キャッシュ、というか「順序付けモード」を「アクセス順」にした LinkedHashMap の場合には、get() でマップ構造が変わるので注意が必要になります。

具体的には、以下のようなアクセスをすると java.util.ConcurrentModificationException 例外が発生します。

```java
Map<String, String> map = new LruCacheMap<>(10);
map.put("one", "1st");
map.put("two", "2nd");
map.put("three", "3rd");

for (String key : map.keySet()) {
    System.out.println(key + "=" + map.get(key));
    // ★ map.get() でマップ構造が変わるので、次の取得で例外発生！
}
```

一般的に、マップのキーと値をあわせて取得する場合には keySet() ではなく entrySet() を使うのが性能的に良いとされていると思います。

しかし、「順序付けモード」を「アクセス順」にしたときには性能うんぬんではなく、イテレータを使っている間に get() したら例外が発生するということは覚えておいたほうが良いと思います。

```java
Map<String, String> map = new LruCacheMap<>(10);
map.put("one", "1st");
map.put("two", "2nd");
map.put("three", "3rd");

for (Map.Entry<String, String> entry : map.entrySet()) {
    System.out.println(entry.getKey() + "=" + entry.getValue());
    // これなら OK!
}
```
CODE39 のチェックデジット


モジュラス43。

- [モジュラス43とコピペ汚染](http://kozawa.jugem.cc/?eid=508)

調べたページで、堂々と中黒が入ってて「？？？」ってなった。

## perl

```
my $i = 0 ;
my %h = map{ $_, $i ++ } split //, '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%';
my %hr = reverse %h ;

print $hr{ +( eval join '+', map{ $h{$_} } split //, 'PIYOPIYO'  )  % 43 } ;
```

- アホだ、ダブルコーテーションになってた。変数展開するじゃん。

## VBA

```
Function modulus43(ByVal d As String)
    Dim str As String
    str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%"
    Dim i As Integer
    Dim j As Integer
    Dim o As Integer

    For i = 1 To Len(d)
        For j = 0 To 42
            If Mid(d, i, 1) = Mid(str, j + 1, 1) Then
                o = o + j
                Exit For
            End If
        Next j
    Next i
    modulus43 = Mid(str, (o Mod 43) + 1, 1)
End Function
```

適当なセルにて `=modulus43(A1)` とかする、、、

## ruby

```
a = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%".split("") 
h = (a).zip(0...a.size).to_h 
hr = h.invert
p hr[ "PIYOPIYO" .split("").map{|x| h[x] }.inject(:+) % 43 ]
```

`.to_h` は、ruby 2.1 からだそーで。
リストの中の重複した要素を一つにして新しいリストを作る

["a","a","a",2,3,3,2,2]を['a',2,3]とする方法。

```py
def remove_duplicates(x):
    list_a = []
    for index,i in enumerate(x):
        list_a.append(i)
        if list_a.count(i) > 1:
            list_a.remove(i)
    return list_a
print remove_duplicates(["a","a","a",2,3,3,2,2])
#['a',2,3]
```

というか、以下でよかったみたい。

```py
def remove_duplicates(x):
    y=[]
    for i in x:
        if i not in y:
            y.append(i)
    return y
```
ifconfig使うの、もうやめるべき？[serverfault]

※ serverfault（システム管理者用のQ&Aサイト）の[質問](http://serverfault.com/questions/458628/should-i-quit-using-ifconfig)とそれに対する回答やコメントをまとめた記事です。
古い話ですが、未だに`ifconfig`を使っているのと、海外のエンジニアたちの会話が少し面白かったのでまとめました。

#ifconfigってもう使っちゃいけないんですか？
##質問
Infinibandを搭載したサーバで`ifconfig`コマンドを実行したところ、以下のような警告が出力されました。

```
Ifconfig uses the ioctl access method to get the full address 
information, which limits hardware addresses to 8 bytes.
Because Infiniband address has 20 bytes, only the first 8 bytes 
are displayed correctly.
Ifconfig is obsolete! For replacement check ip.
```
*和訳：`ifconfig`は`ioctl access`メソッドを使ってアドレスを取得しているため、２０バイトあるInfinibandアドレスの始めの８バイトしかとれません。`ifconfig`は古いので、`ip`を使ってください*

これはつまり`ifconfig`を使うのはやめておけってことですか？いずれ`ip`コマンドに完全に塗り変えられるのでしょうか？それとも、近々`ifconfig`も更新されるんでしょうか？

######反応
- 早く切り替えた方がいい。俺は指を`ifconfig`から`ip`に慣らすのに何ヶ月もかかった。
- `ifconfig`が非推奨だって？俺は今まで洞穴で暮らしてたのか。
- 非推奨なのはLinuxだけだよ。FreeBSDではそんな警告見たことない。
- コマンド名が`ip`なのにリンク層の機能も持ってるって面白いな。

##回答１（ベストアンサー）
*[Thomas Pircher](https://www.tty1.net/blog/2010/ifconfig-ip-comparison_en.html)のウェブサイトを引用させてもらいます([cc-by-sa](https://www.tty1.net/about_en.html#copyright)):*

`/bin/ip`コマンドはもう何年も前から存在しているにもかかわらず、皆未だに`/sbin/ifconfig`を使いたがります。そのため、`ifconfig`がすぐ使えなくなるということはないと思われます。ただし`ip`の方がはるかにパワフルで、いずれは置き換えられるでしょう。

ここでは新機能の紹介はせずに`ifconfig`とシンタックスを比べてみます。

**各種インタフェースと設定の表示**

```
ifconfig

ip addr show
ip link show
```
**インタフェースの起動**

```
ifconfig eth0 up
ip link set eth0 up
```
**インタフェースの停止**

```
ifconfig eth0 down
ip link set eth0 down
```
######反応
- どの例でも`ip`コマンドの方が長くて複雑じゃないか。それが皆`ifconfig`を使いたがる理由なんじゃないかな。
- `ip`の方が機能が豊富なんだからコマンドが複雑になるのは当たり前じゃないか。それに`ip addr show`は`ip a`に省略できる。
- 一つ皆に覚えておいてほしいのは、この世の何もかもがLinuxではないってことだ。SolarisもAIXも、HP-UXやBSD、SCOだって`ifconfig`を使ってる。Linux管理者じゃなくて*Unix*管理者になりたいのなら、`ifconfig`は知っておくべきだ。

##回答２
その通り。`ipconfig`は**Linuxでは**iproute2（`ip`コマンドの正式名）に取って代わられるため、非推奨となっています。
同様に、`arp`、`route`、`netstat`も非推奨です。
ただし、iproute2はLinux固有のコマンドで、他のUnixは`ifconfig`を使うので注意が必要です。

[Why ifconfig sucks](http://inai.de/2008/02/19) [英語]
↑ここによると、`ifconfig`は**１０年以上メンテナンスされていません。**
######反応

- `ifconfig`はもともとBSDが開発したもので、Linuxは基本的にBSDのIPスタックを使っていたからな（余談だがこれはWindowsも同じ。`ipconfig`と`ifconfig`が似てるのはこの歴史があるためだ）。Linuxカーネル2.4くらいからBSDのスタックから離れていったけど、これが2001年の始めだったから、Linuxの`ifconfig`がそれ以来メンテナンスされていないのはしょうがない。
- 10年！？Githubで「ifconfigを守れ」プロジェクトを立ち上げるべきだ。

#所感
３年前の記事ですが、やっぱりまだ`ifconfig`派が多いようですね。
自分も基本的にMacなので`ip`に乗り換えるのは難しそうですが、`brew`で入れられるらしいし、試してみてもいいかもしれません。
やっぱり世界のエンジニア達の会話はなんだかんだ勉強になります。

#参考 [英語]
[serverfault - Should I quit using Ifconfig?](http://serverfault.com/questions/458628/should-i-quit-using-ifconfig) 
[ip command in Mac OS X terminal](http://superuser.com/questions/687310/ip-command-in-mac-os-x-terminal)
[Unity] ADX2の音をスクリプトから鳴らす方法

Takaaki_Ichijoさんの意志を継いで勝手に続きを書くとします

#### 必要なスキル、知識

<i class="fa fa-check-square-o" style="font-size:1em;"></i> ADX2についてはこちら → [<i class="fa fa-external-link" style="font-size:1em;"></i> 勝手にADX2情報まとめ](http://qiita.com/ksilogic/items/eb12af856b1ffc88a276)
<i class="fa fa-check-square-o" style="font-size:1em;"></i> Unityへの導入の仕方はこちら → [<i class="fa fa-external-link" style="font-size:1em;"></i> Unity 5のサウンド機能をADX2 LEで強化する
](http://qiita.com/Takaaki_Ichijo/items/aa58faa062c67afb1a84)

----

### <i class="fa fa-thumbs-o-up" style="font-size:1em;"></i> とにかくシンプルなやつ

オブジェクトをマウスクリックしたら設定した音が鳴る、というものを作ります。

### <i class="fa fa-cube" style="font-size:1em;"></i> 手順
- メニューから　GameObject → 3D Object → Cube　を選んでCubeを用意しましょう。
- 出てきたCubeを選択し、Inspectorの一番下、Add Componentボタンから CRIWARE → CRI Atom Source を選択します。
- Cue Sheet , Cue Name が空欄になっていると思うので鳴らしたい音を選びましょう。
- 続いて、再びAdd Componentボタンから、New Scriptを選択し、CuePlay という名のスクリプトを追加しましょう。

CuePlay.csの中身は以下のように（全文コピペでOKです）

```csharp:CuePlay.cs

using UnityEngine;
using System.Collections;

public class CuePlay : MonoBehaviour {

	void Start () {
	}

	void Update () {
	}

　// クリックされたら鳴らす
  void OnMouseDown() {
    CriAtomSource audio = (CriAtomSource)GetComponent("CriAtomSource");
    audio.Play();
  }
}

```

- スクリプトを保存したら、Unityに戻って実行してみましょう。

---

Cubeをクリックしたら設定した音が鳴ると思います。
ちなみに連打すると複数鳴ります。

これがキャラクターのボイスだったりすると複数鳴っては気味が悪いし、大量に鳴らすとひどい事になりますね。

発音数の上限をサウンドデータ側で設定可能なので、~~次回はそれを記事にする予定です。~~
**書きました**
[<i class="fa fa-external-link" style="font-size:1em;"></i> ADX2 同時発音数の制限方法(サウンドデータ側)](http://qiita.com/ksilogic/items/863383b654f9c20a547d)

以上です。
erbをslimに変換したい

Railsプロジェクトの途中でhtmlテンプレートをslimに変更したくなった。
viewはぜんぜん作り込んでなかったので、こんなgemを入れてサクッと変換してみた。

Gemfileに追記。

```
gem 'html2slim'
```

`./vendor/bundle`下にインストール。

```
$ bundle install
```

`html2slim`コマンドと`erb2slim`コマンドが使えるようになる。
こちらを参考にターミナルに下記を入力。
https://github.com/plataformatec/devise/wiki/How-To:-Create-Haml-and-Slim-Views
プロジェクト下にインストールしたので、`bundle exec`をつける。

```
$ for file in app/views/**/*.erb; do bundle exec erb2slim $file ${file%erb}slim && rm $file; done
```

`.slim`に変換されている。
以上。
[PyQt][PySide] CopyWithLogつくってみました。

PyQt5使ったけど、たぶんPySideでも通じると思うのでタグ登録。

# コピーしてログ生成するGUI

![screenshot](https://github.com/inon3135/CopyWithLog/wiki/images/screenshot-cwl.png)
[inon3135/CopyWithLog](https://github.com/inon3135/CopyWithLog)
ドラッグ＆ドロップしたファイルをコピーして、コピー先/元にログファイルを作るソフト。
自分自身の備忘録も兼ねてやったことを幾つか書いていきます。

## DragDrop設定の注意点

他記事でも書いたけど、View, model, widgetでのDragDrop設定について。
widget->View->model->itemの順で入れ子構造（のイメージ）
ここでview, modelを指定した場合はviewで設定する。
widgetのデフォルト設定を使う場合はwidget上で設定する。

## QMimeDataにデータを追加する

DragDropで情報を扱うにはQMimeDataをいじる。
DragEnter&Dropの時は情報を引き出すだけなのでよし。
DragLeave&Dropの時の挙動はQMimeDataにどういった情報を与えるかを設定する。実際のアクションの設定はDropされる側で設定することになる。
> widget->view->model->item

QMimeDataはmodelで設定する。
QMimeDataが元から持っているurls, text, imageなどの情報を設定するとQtアプリケーション以外でも設定されているように挙動する。

でも予想外の操作で想定外の問題発生しても面倒なので今回は使わない。

### QListWidgetからQTreeWidgetへ情報を輸送

輸送したい情報はurlやtextの情報なのだが、前述のとおりQMimeDataのデフォルトに設定すると思わぬ挙動をする可能性が高い。
そこで、QMimeDataに新しい変数を追加して情報を受け渡す。

今回は情報だけじゃなくて操作もQTreeWidgetから行いたいので、modelとitemのアドレスを直接輸送する。

```python:Model->QMimeData
    def mimeData(self,indexes):
        mime = QMimeData()
        mime.rmodel = self
        items = []
        for index in indexes:
            items.append(self.item(index.row()))

        mime.ritems = items
        return mime
```

ritemsにDragされたアイテムのアドレスリスト。
rmodelにitemが格納されているモデルのアドレス。

この情報をQTreeWidgetから取得するが、QTreeWidgetはUrlsからでも動作するようにした。
そのため、ちょっと気をつけないとErrorがでてしまう。

```python:Tree->View->DropEvent
    def dropEvent(self,event):
        try:
            rmodel = event.mimeData().rmodel
            ritems = event.mimeData().ritems
            rflag = True
        except:
            rflag = False

        if rflag:
```

これでListからやってきたアイテムの場合とファイラーからやってきたアイテムの場合とで処理をそれぞれ設定できる。
日本測地系のミリ秒を世界測地系の度に変換する計算


##GPSのデータって難しいね
とあるプロジェクトでジオ系のデータを扱うことになったのだが、あまりの複雑さに発狂しそうになった。

専門家ではないので大まかに分けると以下の２つが混在する世界らしい

- ミリ秒表示と度表示
- 日本測地系と世界測地系

まあ、いろいろなレガシーな理由があってこの２つが混ざり合っているのだが、要するにやりたいことは **元データをgoogle mapに表示する**ことだ。考えるな、感じろ！

##ざっくりざっくりデータの見方

ミリ秒表示は「503329984,128544000」というような小数点を含まない数字で表される。一方度数は「35.70989125,139.81067」のような小数点を含んだ数字で表される。google mapは度数表示

測地系はもはや聞くしかない。ちなみにgoogle mapは世界測地系,Y！地図は日本測地系だ。いまは世界測地の方がポピュラーという噂も聞いたが、いろいろ大人の事情があるらしくまだ混在している

##計算式

下記のサイトを参考にさせていただいたところ計算式は以下のとおり。
いま「128544000,503329984」（LAT,LON:緯度経度）日本測地系で与えられる地点を計算すると

#ミリ秒から度への変換
元データを3,600,000で割る

128544000 -> 35.70666667
503329984 ->	139.8138844

#日本測地系から世界測地系へ変換
上で求めた度を

jp_lat=35.70666667
jp_lon=	139.8138844

とすると

```
	lat = jp_lat - jp_lat * 0.00010695 + jp_lon * 0.000017464 + 0.0046017;
	
	lon = jp_lon - jp_lat * 0.000046038 - jp_lon * 0.000083043 + 0.010040;
```

となる（理由はわかりませんw）
まあ、地球は丸いのでちょっと誤差が出るらしい

こうやって計算した結果が

35.70989125,139.81067

google mapに貼ってみると

https://www.google.com/maps/place/35%C2%B042'35.6%22N+139%C2%B048'38.4%22E/@35.7098912,139.8084813,17z/data=!3m1!4b1!4m2!3m1!1s0x0:0x0

はい、無事にスカイツリーが表示されました。やったね

#ついでにリンクの仕方を覚える

リンクすると地点を表示するようにするにはこんな感じらしい

http://maps.google.com/maps?q=35.70989125,139.81067+(ココ)

LATとLONをお間違えなく

参考にさせていただいたサイト：
http://keisukereo.com/it_cafe/geo%E7%B3%BB%E3%81%AE%E5%8D%98%E4%BD%8D%E5%A4%89%E6%8F%9B%E3%83%BB%E6%B8%AC%E5%9C%B0%E7%B3%BB%E5%A4%89%E6%8F%9B%E3%83%84%E3%83%BC%E3%83%AB/

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1479530324

http://q.hatena.ne.jp/1250733878

http://d.hatena.ne.jp/nakamura001/20080501/1209660263
Processingで簡易メタボール


THE GUILDオフィスで行われているインタラクティブコーディングの会に行ってきたログです。

## Githubリポジトリ

https://github.com/yosukedoke/interactivecording

コードとか素材はすべて入っています。
今後もあればここに追加していこうと思います。

## インタラクティブコーディングの会とは

THE GUILDのcocopon氏が有志を集めて行っているコーディング勉強会です。
毎回設定されるテーマにそって簡単なオリエンの後、1時間ほどで小さな作品を各々でつくり発表して終わるかんじの形式です。
これまでのテーマは「ランダム」から始まり「三角関数」、「色」などがあったようです。

## 今回のテーマ

「カタチ」

## 作ったもの

![metaball.png](https://qiita-image-store.s3.amazonaws.com/0/3516/131ff469-eb10-47cd-ccbf-e8dc2d0caa1f.png)

## やりたかったことと課題意識

- かたちが変化するものを作りたい
- マウスなどで変化度合いを変えるものにしたい
- シェイプを計算して書くのは知識が足りないし多分間に合わない
- イラレで作ったSVGなどを利用すれば派手な見た目に展開しやすそう

## やってみたこと

### メタボールの実装

ちゃんと演算するのは無理なので超簡易版で2次元かつ単色のものを実装しました。
考え方は古来からあるシンプルなもので、

- 形状をボカす
- 白黒2極化してボケたところをカットする

というものです。
ステップバイステップでやるとこんな感じ。(PhotoShopとかでもできます)

#### エフェクトなし

![スクリーンショット 2015-10-29 17.45.07.png](https://qiita-image-store.s3.amazonaws.com/0/3516/9d0b9154-b3cf-a70f-d259-939cad039daf.png)

#### ぼかす

![blur.png](https://qiita-image-store.s3.amazonaws.com/0/3516/ab30ec27-23f8-e95f-33db-cd5074a8f9cc.png)

#### 2極化の閾値

![threshould_racio.png](https://qiita-image-store.s3.amazonaws.com/0/3516/bd4a6a98-3f4d-3898-11da-cf1f3d2b7a47.png)

#### 2極化後

![threshould.png](https://qiita-image-store.s3.amazonaws.com/0/3516/3b481cee-99d6-3c51-1dff-96f2c0f4b38b.png)

コードとしては次のようなかんじです。

```java
// ボケ具合。数字が大きいほどボケ足が大きくなるがそのぶん処理が遅くなる
float blurRadius = 10;
// 二極化の閾値。0〜1で数値が大きいほど黒くが多くなる
float threshouldRecio = 1;

filter(BLUR, blurRadius);
filter(THRESHOLD, threshouldRacio);
```

実際のコードではマウスのY軸(縦)でThreshouldRacio値を、X軸(横)でblurRaiuds値を変化させて溶け具合をチェックできるようにしています。

### SVG素材を描画してメタらせてみる

Processingは次のように1行でSVGなどの画像素材を読み込めます。
またshape関数で簡単に描画することができます。

```java
// setupメソッド内
PShape svgdata = loadShape("test_graphic_outline.svg");
// drawメソッド内
shape(svgdata, 0, 0, 600, 600);
```

これでイラレで描いてSVGで書き出し、Processingで描画することができました。
ちょっと不思議な感じで変化するイラストになります。

#### 最終的な絵

ちょっと内容がいろいろ適切じゃないですね。わかります。

![boo.png](https://qiita-image-store.s3.amazonaws.com/0/3516/66678853-e053-0fb3-bb29-ea1db41f6b0e.png)

あと、Threshouldすると単色になってしまうので、絵的にはもう少し工夫する必要がありそうです。
色ごとに分解してからメタボール化してあとで再度着色したうえで合成するとか。

## 感想

参加してよかったです。

基本モクモクとやる感じですが、ところどころ詰まったところを聞く人がいるとみんなで教え合うかんじで非常に雰囲気のよい勉強会でした。

何度もきている人は、前回の作品を引き継いで新しい表現を足していくため、短時間で見栄えのするものをつくっていました。
初回だと時間も少なくてあんまりすごいものは作れませんが、逆に続けて参加していきちょっとずつコツコツやるアプローチで自分の手法を育てていくには、とてもよい会だと感じました。

あと自分的にはショボくても他人にとって新鮮な部分がお互いにあるので、見せ合う形式も刺激になると思いました。

個人的には今の業務からは少し遠いジャンルの作業ですがまた参加したいと思います。
ありがとうございました。

## 宣伝

[ワンパクではインタラクティブなことをガンガン提案したいフロントエンドな人を募集しています!!!](http://1pac.jp/recruit)
非同期処理に同時実行数の制限を加えるthroat

[JavaScriptで読み上げ機能を実装した](https://github.com/59naga/nicolive.berabou.me/blob/master/README.md#平成２７年１０月６日火)とき、同時に読み上げられると、聖徳太子にならなければ不便です。
また、[クラウドテストで契約制限数以上のブラウザを起動しよう](https://github.com/59naga/karma-saucelabs-launcher)として、拒否されてテストが途中で落ちてしまう。

など、非同期処理に対して、１つずつ処理して欲しい場合や、５つ以下なら同時に実行しても良い。というケースがあると思います。

```bash
npm install throat bluebird --save
```

[throat](https://github.com/ForbesLindesay/throat)を利用することで、これらを簡潔に実装できます。[^1]

```bash
babel-node quque.js
# task1...
# task1 done
# task2...
# task2 fail
# task3...
# task3 done
```

```js:quque.js
import Promise from 'bluebird'
import throat from 'throat'

const delay= 100
const Queue= throat(Promise)(1)

Queue(()=>{
  console.log('task1...')
  return new Promise(resolve=>{
    setTimeout(()=>{
      console.log('task1 done')
      resolve()
    },delay)
  })
})
Queue(()=>{
  console.log('task2...')
  return new Promise((resolve,reject)=>{
    setTimeout(()=>{
      console.log('task2 fail')
      reject()
    },delay)
  })
})
Queue(()=>{
  console.log('task3...')
  return new Promise(resolve=>{
    setTimeout(()=>{
      console.log('task3 done')
      resolve()
    },delay)
  })
})
```

上記の`1`を`3`に変更します。

```bash
babel-node parallel.js
# task1...
# task2...
# task3...
# task1 done
# task2 fail
# task3 done
```

```js
import Promise from 'bluebird'
import throat from 'throat'

const delay= 100
const Parallel= throat(Promise)(3)

Parallel(()=>{
  console.log('task1...')
  return new Promise(resolve=>{
    setTimeout(()=>{
      console.log('task1 done')
      resolve()
    },delay)
  })
})
Parallel(()=>{
  console.log('task2...')
  return new Promise((resolve,reject)=>{
    setTimeout(()=>{
      console.log('task2 fail')
      reject()
    },delay)
  })
})
Parallel(()=>{
  console.log('task3...')
  return new Promise(resolve=>{
    setTimeout(()=>{
      console.log('task3 done')
      resolve()
    },delay)
  })
})
```

`throat(Promise)(3)`の戻り値はファクトリ関数です。
特定のタスクにフックしたい場合、そのまま`.then`を繋げます。

```js
import Promise from 'bluebird'
import throat from 'throat'

const delay= 100
const Parallel= throat(Promise)(3)

let promise= Parallel(()=>{
  return new Promise((resolve,reject)=>{
    reject(new Error('だめです'))
  })
})

promise
.then(value=>{
  console.log(value)
})
.catch(reason=>{
  console.error(reason.message)
  process.exit(1)
})
```

[^1]: Promiseのporyfillを使用しなくても動作しますが、[browserifyしたjsがIEで動作しない](https://travis-ci.org/59naga/caravan/builds/87444530#L479)ことに注意してください。
alternativesを使用した時のメモ

確認環境:
* Ubuntu 14.04.3
* gcc 4.9.3

gccのように，実行バイナリ自体がライブラリや補助的なファイルへのパスなどパラメータ情報を持っている場合，`program-suffix`をバージョン毎に異なる文字列を指定すれば，同一の`prefix`にインストールしても独立して使用できる．
環境変数の設定も特に必要が無い場合が多いので，gccを軸にして色々と設定方法を考えてみる．

まず，configureスクリプトで `--program-suffix='-4.9'` などを付けて，バージョン毎にバイナリ名を変えておく．

次に(例えば) `/opt/local` にそれぞれのgccをインストール．

そして，alternativesで次のように実行する:

```
sudo update-alternatives \
  --install /usr/bin/cc cc /opt/local/bin/gcc-4.9 409 \
  --slave /usr/share/man/man1/cc.1.gz cc.1.gz /opt/local/share/man/man1/gcc-4.9.1
```

`c++`も同様に設定する(slaveにした方が良いかも？)．
この設定は，`build-essential`で(おそらく)インストールされたccに対する設定を参考にした．

gccのようなツールチェインは，異なるバージョンのものをこのようにして簡単に切り替えられるように作られているので，非常に便利．

Boostなどのライブラリも，gccのslaveにすれば良さそう．

# TODO

* `alternatives`について
    * 削除の方法
    * 切り替えの方法
* 他のライブラリの設定方法などのサンプル
    * Boost
* そもそもこのメモの位置付けがよくわからなくなってきたので，削除するか大々的に変更するかも．
sshd設定(Cenos6)

コンフィグファイルの編集
\# vi /etc/ssh/sshd_config

以下の項目のコメントアウトを外す
Port 22
Protocl	2
PasswordAuthentication yes
PubkeyAuthentication yes
HostbasedAuthentication	no
PermitRootLogin	no

コンフィグファイルの編集後、sshdを再起動する
\# /etc/init.d/sshd restart
Centos　Xentooolsのインストール（Centos6）

XenCenterより、ターゲットのマシンで「XenServer Toolsのインストール」を行う

コンソールより、以下コマンドを実行する
マウントポイントを作成する
\# mkdir /mnt/cdrom

マウントの実行
\# mount /dev/cdrom /mnt/cdrom/

マウントしたディレクトリに移動する
\# cd /mnt/cdrom/Linux

インストーラーを実行する
\# sudo ./install.sh