OmniAICreator/Qiita-1.07M huggingface dataset:
【初心者の備忘録】オブジェクトAが、オブジェクトBを追いかける仕組みを作る


【流れ】
オブジェクトA（以下A）とオブジェクトB（以下B）を用意します。
分かりやすいようにAをSphere、BをCubeとします。

AにBを追いかけるスクリプトをアタッチします。
このスクリプトで、くだんのベクトルについての実装を行います。
また追いかけるオブジェクトをインスペクタから登録できるようにしておきます。
（処理を単純にするためです）

追いかける対象のオブジェクトとしてBを登録します。

あとは登録されたオブジェクトと自身との位置関係から、ベクトルの計算を行い、追いかける処理を実装します。


【調べもの】
[Transform.rotation](http://docs.unity3d.com/jp/current/ScriptReference/Transform-rotation.html)

[Quaternion.Slerp](http://docs.unity3d.com/ja/current/ScriptReference/Quaternion.Slerp.html)

[Unity - (クォータニオン版)特定方向を向くように、向きを変更する](http://www40.atwiki.jp/spellbound/pages/1407.html)

[Unity - オブジェクトを追いかける](http://www40.atwiki.jp/spellbound/pages/1409.html)

【いつか理解したい】
[UnityのベクトルとQuaternionによる回転について](http://tsubakit1.hateblo.jp/entry/2014/08/02/030919)

[UnityでRotation（Quaternion）をうまく使いたい](http://spi8823.hatenablog.com/entry/2015/05/31/025903)

[AI開発＆クォータニオン入門～3.敵キャラをプレイヤーに向かせる](http://gamesonytablet.blogspot.jp/2013/03/ai3.html)

[Quaternionクラスのメモ](http://unitylab.wiki.fc2.com/wiki/Quaternion%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AE%E3%83%A1%E3%83%A2)

コメントなし↓

```
public class chase : MonoBehaviour {

	public Transform target;
	public float speed = 0.1f;
	private Vector3 vec;


	void Start () {
		//target = GameObject.Find("対象").transform;
	}
	
	void Update () {
		transform.rotation = Quaternion.Slerp (transform.rotation, Quaternion.LookRotation (target.position - transform.position), 0.3f);
		transform.position += transform.forward * speed;
	}
}
```

コメント入り↓


```コメント入り
public class chase : MonoBehaviour {

	public Transform target;//追いかける対象-オブジェクトをインスペクタから登録できるように
	public float speed = 0.1f;//移動スピード
	private Vector3 vec;

	void Start () {
		//target = GameObject.Find("対象").transform; インスペクタから登録するのでいらない
	}
	
	void Update () {
		//targetの方に少しずつ向きが変わる
		transform.rotation = Quaternion.Slerp (transform.rotation, Quaternion.LookRotation (target.position - transform.position), 0.3f);
		
		//targetに向かって進む
		transform.position += transform.forward * speed;
	}
}
```

Quaternion.LookRotation(ベクトルA - ベクトルB);
で、ベクトルBの地点から見て、ベクトルAの方向を取得することができる。少しずつ向きを変えたいので
Quaternion.Slerp(from, to, t)；
を使う。fromからtoに方向がt時間で変わる。tの値が小さいと少しずつ、マックス1.0でいきなり（Quaternion.LookRotationと同じ）変わる。
toの部分にQuaternion.LookRotation(ベクトルA - ベクトルB)を入れる。
向きが変わったらtransform.forwardでオブジェクトが向いている方向(前面)のベクトルが取れる。ベクトルの大きさは普通に実数を掛け算することで変更できるので速度と掛けあわせてpositionに足していく。
正規表現に困ったときに参考になるAngularJSの正規表現集


最近、AngularJS→MithrilJSへの移行で疲れ切っている私です。

今回はJavaScriptで「あー、メールアドレスをチェックする正規表現とかどうすればいいんだっけ？」ってなった時に、
参考になるAngularJSの正規表現のご紹介をば。

## AngularJSの正規表現

AngularJSではinputタグに紐付けて様々な正規表現でバリデーションを行っています。

https://github.com/angular/angular.js/blob/544001f5a331de06961c0201d69ecc92893abd0b/src/ng/directive/input.js#L13-L21

単純に、上記リンク先で行っている正規表現を参考にすれば正規表現が苦手な人でもAngularJSで行っている程度の品質は担保されるでしょう。

## どんな正規表現があるの？

簡単には以下の９つ

````js:angular.js/src/ng/directive/input.js
// ISO8601形式での時刻かどうか
// ISO8601について： https://ja.wikipedia.org/wiki/ISO_8601
var ISO_DATE_REGEXP = /^\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)$/;

// URLかどうか
var URL_REGEXP = /^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/;

// メールアドレスかどうか
var EMAIL_REGEXP = /^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i;

// 数値かどうか
var NUMBER_REGEXP = /^\s*(\-|\+)?(\d+|(\d*(\.\d*)))([eE][+-]?\d+)?\s*$/;

// -区切りの日付かどうか
var DATE_REGEXP = /^(\d{4})-(\d{2})-(\d{2})$/;

// -区切り、:区切りの日時かどうか
var DATETIMELOCAL_REGEXP = /^(\d{4})-(\d\d)-(\d\d)T(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/;

// 2015-W04のような年週表示かどうか
var WEEK_REGEXP = /^(\d{4})-W(\d\d)$/;

// 2015-10のような年月表示かどうか
var MONTH_REGEXP = /^(\d{4})-(\d\d)$/;

// 時刻かどうか
var TIME_REGEXP = /^(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/;
````

があります。

これらを`match()`で使うといい感じの結果が得られるでしょう。
また、これらの正規表現を参考にして更なる正規表現を練り上げるのもいいかもしれません。

以上、正規表現に困ったときに参考になるAngularJSの正規表現集でした。
Swift2、Xcode7ではfilterの記述法が変わっているようだ


Swift2、Xcode7ではfilterの記述法が変わっている

以下は古い記述法

```
let ageArray = [21,24,32,45,43,26,55,38,20,41]
let age30to39 = filter(ageArray,{(age:Int) -> Bool in return (age >= 30)&&(age < 40)})
print(age30to39)
```

これではエラーが出る。そこで以下のように変える必要がある

```
let ageArray = [21,24,32,45,43,26,55,38,20,41]
let age30to39 = ageArray.filter({(age:Int) -> Bool in return (age >= 30)&&(age < 40)})
print(age30to39)
```

これでうまく動くはずだ
activerecord-mysql-unsignedを使う際の注意点

MySQLで符号なしの整数を扱えるようにする [activerecord-mysql-unsigned](https://github.com/waka/activerecord-mysql-unsigned/issues/21) というgemがあるのですが、これを入れるとデフォルトで ` primary key ` を符号なしにしてしまうので、外部キー制約などをかけるときにしっかり参照する側も符号なしにするよう気をつけようという話。

あと、このgemの追加前にmigrationした人とgem追加後にmigrationした人ではschemaに差が出てしまうので、後から開発チームに加わった人が手元のPCなんかでmigrationするときも注意したほうがいいかと思います。

```rb
class CreateTables < ActiveRecord::Migration
  def self.up
    create_table :users do |t|
      t.string  :name, null: false
    end

    create_table :articles do |t|
      t.references :user, null: false, unsigned: true  #しっかりunsignedにする
    end

    add_index :articles, [:user_id]
    add_foreign_key :articles, :users  #でないとここで失敗する
  end

  def self.down
    drop_table :users
    drop_table :articles
  end
end
```
Haskellでチャーチ数

Haskellでチャーチ数
=================

あとで説明をつける予定

はじめに
--------

これはうまく動く版だ。代数的データ型で明示的に再帰的な型を定義している。Cや.$.を消して読むと理解しやすいだろう。「うまく動かない版」を先に見ておくほうが理解しやすいだろう。

* [うまく動かない版](https://qiita.com/YoshikuniJujo/items/bd1f1a9cd6f7d721ca0a)
* うまく動く版

型
--

```hs:church.hs
data C = C { (.$.) :: C -> C } | A C | Z
```

本質的にはコンストラクCのみで良い。
整数値との相互変換のためにコンストラクトAやZが必要になる。

整数値との相互変換
----------------

### チャーチ数から整数へ

```hs:church.hs
toInt :: C -> Int
toInt Z = 0
toInt (A c) = 1 + toInt c
toInt n = toInt $ n .$. C A .$. Z
```

### 整数からチャーチ数ヘ

```hs:church.hs
toChurch :: Int -> C
toChurch 0 = zero
toChurch n = s .$. toChurch (n - 1)
```

ブール値と条件分岐
---------------

```hs:church.hs
false, true, _if :: C
false = C $ \x -> C $ \y -> y
true = C $ \x -> C $ \y -> x
_if = C $ \b -> C $ \x -> C $ \y -> b .$. x .$. y
```

数
--

```hs:church.hs
zero = C $ \f -> C $ \x -> x
s = C $ \n -> C $ \f -> C $ \x -> f .$. (n .$. f .$. x)
one = s .$. zero
two = s .$. one
three = s .$. two
four = s .$. three
five = s .$. four
six = s .$. five
```

数の演算
-------

```hs:church.hs
add, mul, pre :: C
add = C $ \m -> C $ \n -> C $ \f -> C $ \x -> m .$. f .$. (n .$. f .$. x)
mul = C $ \m -> C $ \n -> C $ \f -> m .$. (n .$. f)
pre = C $ \n -> C $ \f -> C $ \x ->
        n .$. C (\g -> C $ \h -> h .$. (g .$. f)) .$. C (\u -> x) .$. C (\u -> u)
```

述語
----

```hs:church.hs
isZero :: C
isZero = C $ \n -> n .$. C (\x -> false) .$. true
```

例
--

```hs:church.hs
zeroToOne :: C
zeroToOne = C $ \n -> _if .$. (isZero .$. n) .$. one .$. n
```
Haskellでチャーチ数 - うまくいかない版

Haskellでチャーチ数
=================

あとで説明をつける予定

はじめに
-------

これは単純だけどうまく動かない版だ。Lispは型なしラムダ計算を背景にしているのに対して、Haskellは型付きラムダ計算を背景にしている。型推論の際に型が無限ループになってしまう。まずこの版を見てから「うまく動く版」を見ると理解しやすいだろう。

* うまく動かない版
* [うまく動く版](https://qiita.com/YoshikuniJujo/items/992c599ad42dc9fe3b37)

整数との相互変換
-------------

```hs:churchNaive.hs
toInt n = n (+ 1) 0
toChurch 0 = zero
toChurch n = s . toChurch $ n - 1
```

ブール値と条件分岐
---------------

```hs:churchNaive.hs
false x y = y
true x y = x
_if b x y = b x y
```

数
--

```hs:churchNaive.hs
zero f x = x
s n f x = f $ n f x
one = s zero
two = s one
three = s two
four = s three
five = s four
six = s five
```

数の演算
--------

```hs:churchNaive.hs
add m n f x = m f $ n f x
mul m n f = m $ n f
pre n f x = n (\g h -> h $ g f) (\u -> x) (\u -> u)
```

述語
----

```hs:churchNaive.hs
isZero n = n (\x -> false) true
```

型の不一致
--------

### 問題ない例

```hs:churchNaive.hs
zeroToOne n = _if (isZero n) one zero
```

### 型の不一致

```hs:churchNaive.hs
zeroToOne' n = _if (isZero n) one n
```
Xcode7ではsortedがなくなっているようだ


以下のコードをXcode7.0のPlayGroundで書いてみた

```
var ageArray = [34,23,31,26,22]
ageArray.sort{$0 < $1}
print(ageArray)
```

結果は以下の通り

```
[34, 23, 31, 26, 22]
(11 times)
"[34, 23, 31, 26, 22]\n"
```

なので、以下のようにすれば、正しく動いた

```
var ageArray = [34,23,31,26,22]
var sortedAgeArray = ageArray.sort{$0 < $1}
print(sortedAgeArray)
```

どうやら、sortの挙動が前と異なっていて、古いsortedの挙動がsortになって、古いsortの挙動はなくなっているようである。
Xcode 7.0にアップデート後、使えなくなったプラグイン(XVim等)を使えるようにする

## 概要

Xcode 7.0にしたら、プラグインが使えなくなってしまった。
　→「XVim」が使えなくなった。

## 解決方法
Xcode 7.0でUUIDが変更されているので追加する。

## 手順

### UUIDの追加

```
$ find ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins -name Info.plist | xargs -IFILE defaults write FILE DVTPlugInCompatibilityUUIDs -array-add AABB7188-E14E-4433-AD3B-5CD791EAD9A3
```

### 確認（UUIDが追加されていること）

```
find ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins -name Info.plist | xargs -IFILE defaults read FILE DVTPlugInCompatibilityUUIDs 
```

### Xcodeを再起動する。


以上で、XVimに関しては利用できるようになった。


## 参考にさせていただいたポスト

Xcode 7 beta support · Issue #772 · XVimProject/XVim
https://github.com/XVimProject/XVim/issues/772

Xcode 6.2にアップデートするとプラグインが効かなくなる問題の解決策 - Qiita
http://qiita.com/manhattan918/items/103f0ab55031799ecd61

Xcode 5.1にupdateした後に、使えなくなったxcode plug-inを再び使えるようにする方法 - Qiita
http://qiita.com/roothybrid7/items/85bacb992a22aaad04cd
ReverseRandomAccessCollectionの挙動


以下のコードをPlayGroundで実行すると

```
let rankList = ["D201","F221","D205","D149","E442"]
var startList = rankList.reverse()


print("rankList\(rankList)")
print("startList\(startList)")
```

以下のような実行結果になる

```
["D201", "F221", "D205", "D149", "E442"]
ReverseRandomAccessCollection<Array<String>>
"rankList["D201", "F221", "D205", "D149", "E442"]\n"
"startListReverseRandomAccessCollection<Array<String>>(_base: ["D201", "F221", "D205", "D149", "E442"])\n"
```

リバースコレクションがインデックスされないので、表示できないようなのである。詳しくは以下のサイトを見て欲しい

https://www.reddit.com/r/swift/comments/3dr2fl/new_behavior_for_arrayreverse/

なので、以下のようにするのが正しいやり方である。

```
let rankList = ["D201","F221","D205","D149","E442"]
var startList = rankList.reverse()

print("rankList\(rankList)")
print("startList\(Array(startList))")
```

なんか遅延評価が関係するらしいのだが、遅延評価自体どういうものかよく理解していないので、ちゃんとした説明ができない。
僕自身もうちょっと勉強する必要があるかもしれない
iOS9時代のiPhoneアーキテクチャー

| 端末	 | アーキテクチャー | チップ |
|:-----------|------------:|------------:|
| iPhone6s Plus | arm64 | A9 |
| iPhone6s | arm64 | A9 |
| iPhone6 Plus | arm64 | A8 |
| iPhone6 | arm64 | A8 |
| iPhone5s | arm64 | A7 |
| iPhone5c | armv7s | A6 |
| iPhone5 | armv7s | A6 |
| iPhone4s | armv7 | A5 |

お手持ちのiPhone4s, iPhone5は手放さないで……。




Appleの端末も、バリエーションに富んできました。
現状、Xcodeがバイナリファイルを作成するときに、armv7,armv7s,arm64の3つを用意してくれます。
アプリ開発側からすると、アーキテクチャの差は、OS側で吸収するだろう、とは考えますが、実機で確認してみると、挙動が異なっていたりします。

*全てのiOSアプリは同様に動作する、と考えるより。少なくとも3種類はバイナリレベルで異なる。*
と知っておく方が、気が楽だと思います。

まぁ、バイナリレベルでの差に悩むよりも、画面サイズの違いに悩む方が、多いと思います。
  

- arm7sは、64ビット
- iOS9へのアップデートはできませんが、iPhone4は、"armv7"です。

次回は、[iOS9時代の画面サイズ](http://qiita.com/m1takahashi/items/36311c73283fcb7cbee6)です。
Linuxでユーザーを作成したがsshできなかった話

既存環境でユーザーおよび対応するパスワードを作成し、/etc/passwdにも記載はあるし、rootからならsu {username}出来るのに以下が出来なかった

・一般ユーザーからsu {username}するとincorrect passwordと言われてユーザーの切り替えができない
・ssh {username}@hostnameとするとpermission deniedと言われてログインできない

というのを解消したのでメモ

# やったこと

パスワードが間違ってしまったのかと思ったが、chpasswdコマンドを使ってやったのでそれはない。。。

何はともあればログだ、ということでログを見る

```lang:/var/log/secure
Sep 19 12:19:52 hostname sshd[4732]: Received disconnect from 100.100.100.100: 11: disconnected by user
Sep 19 12:20:03 hostname sshd[6220]: User hoge from 100.100.100.100 not allowed because not listed in AllowUsers
```

んん？？

AllowUsersのリストに書いてなくて接続が許可されていないユーザーという事になっている。。。

調べてみると以下の記事が。

[sshで接続できるユーザを制限するには](http://www.tempest.jp/linux/fedora/documents/text205.html)

上記記載のようにsshd_configにAllowUsersというのを記載すると、記載しているユーザーのみssh接続を可能とする事ができるようでその機能によって接続できていなかったようだ。

上記より、以下のファイルに新規に作成したユーザーの情報を追記

```lang:/etc/ssh/sshd_config
AllowUsers fuga hoge
```

設定を反映されるためにsshdをリロード

```
$sudo service sshd reload
```

これで問題が解消されました

# まとめ

何でもそうですが、困ったらログを見るというのは改めて大事だと認識しました。
Code For Kobe #8


内容は [Code for Kobe github wiki](https://github.com/codeforkobe/codeforkobe.github.io/wiki) に集約しました。こちらにあるのはコピーです。
------
2015-09-17
第8回Code for Kobe定例ミーティング
https://www.facebook.com/events/433521460166576/


agenda

- data.kobe×について※調整中（中川さん？）
- API勉強会について※調整中（松村さん？）
- 神戸市の観光課題※調整中（神戸市観光課）
- KobeGlobalStartupGateway※調整中
- KOBE.Rとデータ分析ハッカソンの告知（河原さん）


「data.Kobe」 x NTTドコモアプリコンテスト
----
中川さん

目的
- オープンデータの促進・利活用
- 行政、市民、企業の協働
- 行政・地域課題の解決

9/7 -- 10/23

テーマは「観光」
- 情報発信
- インバウンド誘致
- 観光客の集客状況の分析
- 観光ルート検索
- 他言語対応

「ビッグデータ」by DoCoMo が使えるのが目玉。
- 例：花火大会当日の人の動きの分析・可視化
- 実際に使ってみてください
- モバイル空間統計含め、ドコモAPIが使える

9/17 10:00 から勉強会があります

DoCoMo の空間統計データは一体何か : 500m x 500m x 年齢 x 人数 x 一時間ごと
契約都道府県のデータ（オプトアウトできる）も。


startup in Kobe
---------------
松村さん cooperate fellowship

http://kobe.globalstartupgw.com/
- シリコンバレーでのシードアクセラレーションを持ち込む狙い。

http://www.tumml.org/
社会課題を解決するためのシードアクセラレーションという流れがあり、それを狙っている。


その他
------
「インターナショナル・オープンデータ・デイ2016」3/5に決まった。
http://okfn.jp/2015/09/16/iodd2016-pre/

次のイベントが連続して開催される
* SIGGRAPH ASIA
* [神戸ITフェスティバル 2015](http://kobe-it-fes.org/)
  * [Teamwork hack vol 2](https://appresso-cybozu.doorkeeper.jp/events/30668)
* CodeForJapan の集まりも


データ分析
-------
川原さん

https://kobexr.doorkeeper.jp/events/31140
データ分析

http://www.soleildatadojo.com/
とある店舗の売り上げデータの分析。店長をうならせたら勝ち。


その他
------
「神戸市の観光課題※調整中（神戸市観光課）」は事情により中止
ObjC to Swift : NSCalendarUnit


Objective-C

```Objective-C
unsigned unitFlags = NSCalendarUnitYear
				   | NSCalendarUnitMonth
				   | NSCalendarUnitDay
				   | NSCalendarUnitWeekday
				   | NSCalendarUnitHour
				   | NSCalendarUnitMinute
				   | NSCalendarUnitSecond;

```

Swift 2.0

```Swift
let unitFlags: NSCalendarUnit = [ .Year,
								  .Month,
								  .Day,
								  .Weekday,
								  .Hour,
								  .Minute,
								  .Second ]
```

Swift 1.2

```Swift
let unitFlags: NSCalendarUnit = .CalendarUnitYear
							  | .CalendarUnitMonth
							  | .CalendarUnitDay
							  | .CalendarUnitWeekday
							  | .CalendarUnitHour
							  | .CalendarUnitMinute
							  | .CalendarUnitSecond
```
ObjC to Swift : [NSFileManager contentsOfDirectoryAtPath:error:]


Objective-C

```Objective-C
NSFileManager * fileManager = [NSFileManager defaultManager];
NSString * path = "/Users/...(file path)";

NSArray * files = [self.fileManager contentsOfDirectoryAtPath: aPath
											            error: NULL];
```

Swift 2.0

```Swift
let fileManager = NSFileManager()
let path = "/Users/...(file path)"

let filePaths = try? fileManager.contentsOfDirectoryAtPath( path )
```

Swift 1.2

```Swift
let fileManager = NSFileManager()
let path = "/Users/...(file path)"

let filePaths = fileManager.contentsOfDirectoryAtPath( path,
											    error: nil ) as? Array< String >
```
S3 VPCエンドポイントを利用するメリット

#S3 VPCエンドポイント

通常S3へのアクセスはインターネットを通して通信され、
プライベートサブネットからの通信はNATを、Publicであればゲートウェイを通過したアクセスとなる。

しかし、S3エンドポイントを設定することにより、インターネットをかえさないセキュアな通信となり、
プライベートサブネットの場合はNATを通さない通信が可能となる。


## 通信経路

AWSのRouteTableはロンゲストマッチとなるため、詳細経路を優先する。
0.0.0.0/0より、S3エンドポイントの経路が優先となりNATを通過しない通信が可能となる。
http://docs.aws.amazon.com/AmazonVPC/latest/PeeringGuide/peering-configurations-partial-access.html#one-to-two-vpcs-lpm

左VPCエンドポイント設定なしでは、NATを通過させインターネット経由の通信となる。
右VPCエンドポイント設定ありでは、NATを通過せず直接バケットとのやり取りを行う。

#![VPC Endpoint.png](https://qiita-image-store.s3.amazonaws.com/0/49877/0ba20f05-1792-a864-274c-2568e6c1a5ff.png)

##メリデメ

デメリットはあまりないため、基本的にはデフォルトで有効の方針を立てている。

### メリット

- インターネットを通過しないセキュアな通信が可能
- NATを通過しないため、NATのネットワーク負荷が軽減させる。
- VPCエンドポイントの設定でバケット単位のアクセス制限が可能

### デメリット

- 設定時に経路変更があるため、S3通信を行っている場合には一旦切断する。
- S3のバケットポリシーをEIPで制御している場合は、PrivateIPの制御に変更する必要がある。


## 設定方法

こちらのAWSブログどおりで実装可能です。
http://aws.typepad.com/aws_japan/2015/05/vpcendpointfors3.html


#まとめ

特に大きなデメリットがないため、基本的に有効にし要件に応じて無効にする運用が良いのではないだろうか。
iPhone専用アプリをiPadで起動した時、下部のツールバーが表示されないという不具合に、開発者が行うべき対処法


iOS9においてiPhone専用アプリをiPadで起動すると、アプリのリサイズが正しく行われないようです。下記のコードを追加すると解消されます。

```objc:AppDelegate.m

@synthesize window;
@synthesize mainController;

-(BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
    BOOL ret = NO;
    window.rootViewController = mainController;
    // 下記の一行を追加
    mainController.view.frame = [[UIScreen mainScreen] bounds];
    [window addSubview:mainController.view];
    [window makeKeyAndVisible];
    return ret;
}
さくらサーバーとcakePHPでcronつかって自動更新したい時〜

#CakePHPで作ったサイトの特定のアドレスにアクセスして更新したい
ネットで情報を探したのだけれど表題のシンプルな方法がわからなかったので書く。結論としては意外とwgetが使えた。

##CakePHPでサイトを作ったがいいがcronの使い方がわからない
CakePHPで簡単なデータベースサイトを作った。データベースなので適度に内容を更新していかなければならない。
cronは自動設定した時間に命令をこなしてくれる仕組み。ぼくもそんなに詳しくない。

前提を書いておくと、CakePHPで作ったサイトで、アドレスにアクセスするとtwitterの情報をクローリングしてmysqlデータベースを自動更新してくれるプログラムを走らせるようにしたかったのだけれどうまくいかず、手入力でアクセスして自動更新するには量が多すぎるのでくじけていた。

24時間表記で時間を数字として取得して時間×100番目から100個アイテムを取り出してそれを更新する仕組みにしていたが、深夜にわざわざアクセスして更新できないので200~600番台の更新がうまくいかない形に。（何番目からはじめるか指定するプログラム書けよって話なのだけれど自動更新を念頭にプログラム書いてたのでその辺はツッコミなしで）。

##サイトを自動更新するにはcronを使うがうまく動かない
cakePHPの場合、webを検索してみるとwebrootにphpファイルをつくって

```lang:cron 
cd cd /home/アカウント名/www/; /usr/local/bin/php　index.php
```

とかで自動で実行してくれる方法と、シェルをつくってそいつをbakeしろ方法と出てくるがどちらも細かい仕様がわからないので煩わしい。

##CakePHPのControllerでupdate()をつくる
例です。Controrllerフォルダに、ファイル名はCakePHPの命名規則に従って適当に作ってください。

```lang:ProductController.php 
 public function update(){
		$date = date('G');//24時間表記で今何時かを数字で返してくれる
		$products=$this->Product->find(
					'all',array(
						//なんか検索条件
						'limit' => 100,
						'offset' => $date*100,
						)
//foreachとかをつかってデータを一つづつ取り出しクローリングする命令を書く
//例えば$dataに配列で更新情報を入れたら$this->Product->save($data)を忘れずに。
}
```

viewで`update.ctp`をつくれば、`http://*******.sakura.ne.jp/product/update/`にアクセスすると自動でアップデートが行われるようになります。`update.ctp`には何も書かなくても良いのだけれど`<?php var_dump($data); ?>`とかでちゃんと更新情報が入力されてるか確認するといい。

##wget --spiderをつかってできないか試してみた
cronでもwgetというアクセスしたurlからhtmlファイルを取り出して保存してくれる命令がある。`wget --spider`をつかうとファイルにアクセスして存在があるかどうかを確かめてくれる（要は保存しない）ようになる。
webで調べてみたらクオーテーション（"http://~~")でくくらないといけないなどと書いてありましたが、さくらのcronだとクオーテーションいりませんでした。ここで20分くらいハマってました。
macのターミナルにwgetは入っているので`$wget --spider  "http://*******.sakura.ne.jp/product/update/"`を入力し、データベースが更新されたかを確認。

##さくらのcronで動かしてみる
macのターミナルなどでwgetがうまくいったら、一時間後か時間が変わったあたりで、さくらのcronを動かしてみる。さくらのサーバコントロールパネルへ＞CRONの設定＞>> 新規項目の追加をクリック。何度もいうけれど、アクセスしたいアドレスはクオーテーションいらない。実行コマンドのところに以下の命令を入力。さくらの場合、単純に`wget --spider`を入力するのでなく`/usr/local/bin/wget --spider`としなければならないところに注意。

```lang:cron 
/usr/local/bin/wget --spider http://*******.sakura.ne.jp/products/update/ 1> /dev/null
```

実行時間の分のところに数字を入力すると、毎時間のその時間にプログラムを実行してくれる。一旦2分後に設定して送信をクリック。２分待って、データベースが更新されているかを確認。
クローリングはサーバにかなりの負荷をかけるらしいので、各自の判断で行ってください。僕が今回つかったtwitter　APIのユーザ情報取得の場合、15分で180リクエストまで許容されるので、それ以上のリクエストを送るとエラーが起きて更新できなくなるので注意。
eclipseでjQueryのコードアシスタントする方法

eclipseでjavascript開発するをする時、jQueryのコードアシスタントを受けるには各プロジェクトで次の設定をします。

# 準備
Eclipse Market Placeで、JSDT JQueryをインストール
 

# 設定手順
1. コードアシスタントを行いたいプロジェクトのプロパティを表示
2. [javascript > include path]の設定を表示
3. [libraries]タブを表示
3. [add javascript library]ボタンをクリック
4. [jQuery Library]を選択し、[next]ボタンをクリック
5. jQueryのバージョンを選択し、[Finish]ボタンをクリック
6. 設定完了

これで、javascript開発時にjqueryのコードアシスタントが受けれます。
C++において遭遇した分かりにくいバグの忘備録


----

```text:現象
デバッグビルドでは不具合がでないのに、リリースビルドにすると不具合がでる。
```

```text:原因
変数の初期化を忘れていた。

デバッグビルドでは初期化を忘れていても、0に初期化されることが多いため不具合が発現しない。コンパイラが初期化忘れを警告できない場合があるので注意。
```

---

```text:現象
文字列バッファが任意のタイミングでAccess Violationを起こす
```

```text:原因
std::string.c_str()を保持して、他で使っていた。

c_str()で得たバッファは元のstringが解放されるとその後の任意のタイミングでfreeされる。他で使う場合には複製しなければならない。freeのタイミングが任意なので、バグが発現しにくい。特にc_str()のバッファの一部をポインタとして保持する場合に注意。
```

---

```text:現象
別のコンパイラでビルドしたら、関数の戻り値を変数に代入したはずなのに、タイミングによって代入されない場合があった。
struct s {
	size_t index;
	string str;
};
vector
 v;
v[0].index = func(v); // func()が1を返す
// v[0].indexが1にならない
```

```text:原因
func()内でvに要素を追加していたために、vectorの再配置により代入先が変化していた。

この場合はvectorの要素が構造体なのがミソで、代入先の参照がfunc()実行より前に確保されていた。この動作はコンパイラによって異なるので、特定のコンパイラでのみ不具合が発現した。
(構造体の要素ではなくて、v[0]に直接代入するコードも駄目かも。v[0]で要素への参照が先に確保されてしまう可能性があるから)

```

---
unity > udpEmu (udp emulator) > 登録した応答をランダムに返す

```txt:実装環境
Unity 5.1.3-f1 on MacOS X 10.8.5
```

[udpMonitor @ Qiita](http://qiita.com/7of9/items/79b2f518a8dd2c9d5066)というUDPの通信をモニターできるものを作成した。
その通信した情報を元に、コマンド応答をエミュレーションするものを作りたかった。

##code (v0.5)

[udpEcho @ Qiita](http://qiita.com/7of9/items/f9a9c49d93510a8fcfce)を元に作成した。

[v0.5 @ github](https://github.com/yasokada/unity-150917-udpEmu/releases/tag/v0.5)

要となる処理(udpEchoから変更や追加したもの)は以下の２つ
- Assets/MyResponseDictionaryUtil.cs : 辞書登録関連
- Assets/udpEmu.cs : udp通信関連

##使い方

###モード変更

EMULATOR と REGISTER の２つのモードがある。RESIGTERで応答登録をして、それをEMULATORで使う。

それぞれのモード変更はudpで以下のコマンドを使う

1. EMULATOR -> REGISTER : `SOT,dfae271`
2. REGISTER -> EMULATOR : `EOT,dfae271`

`dfae271`はudpEmuのv0.1のハッシュタグ。udpコマンドの誤検知を回避するため。

SOTやEOTとしているのは udpMonior (改良予定)の出力を取り入れやすくするよう考慮している。

###REGISTERでのコマンド

1. コマンド文字列登録 : `,tx,hello`
2. 応答文字列登録 : `,rx,hi,Mike-neko`

1列目は無視する（日時情報など入っていてもOK).
2列目は"tx"か"rx"を入れる
3列目以降(","区切りもおそらく可能)の文字を登録する。

##使用例

### udpEmu側
udpEmu自体は起動するだけでいい。
起動直後は EMULATOR モードになっている。

![Scene_unity_-_150917-udpEmu_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/95f18df8-82e0-14ad-cb26-1b60cb36dcde.jpeg)

### 相手側
udpEmuに対してコマンドを送信するものからの処理。

今回は以下を使用

```txt:動作環境
IP: 192.168.10.8
OS: CentOS 6.5 (32bit)
```

CentOSからは以下のbashスクリプトを実行 `$bash testUdpEmu-exe`

```testUdpEmu-exe
#!/bin/env bash

for data in \
		"SOT,dfae271" \
		",tx,hello" \
		",rx,hi,Mike-neko" \
		",tx,hello" \
		",rx,hi,Matatabi" \
		",tx,hello" \
		",rx,hi,Kagemusha jya" \
		",tx,hello" \
		",rx,hi,Honnninn jya" \
		",tx,hello" \
		",rx,hi,Who are you?" \
		"EOT,dfae271" \
		; do
	sleep 1
	echo $data | nc -w 1 -u 192.168.10.3 6000
done

for loop in $(seq 1 7);do
   echo "hello" | nc -w 1 -u 192.168.10.3 6000
   usleep 125000 # arbitrary (every 125msec)
done
```

上記において
- 最初のfor : 辞書登録
- ２つ目のfor : 7回 hello を送信

###実行結果

登録が終わって、ランダムに応答が返っている様子が見られる。

```bash
[udpEmu]$ bash testUdpEmu-exec 
emulator >> register mode
register >> emulator mode
hi,Mike-neko
hi,Honnninn jya
hi,Mike-neko
hi,Kagemusha jya
hi,Matatabi
hi,Who are you?
hi,Matatabi
[udpEmu]$ 
```

###手動実行

スクリプトでなく、1つ１つudp通信する場合は、以下を順次送るといい。

```
SOT,dfae271
,tx,hello
,rx,hi,Mike-neko
,tx,hello
,rx,hi,Matatabi
,tx,hello
,rx,hi,Kagemusha jya
,tx,hello
,rx,hi,Honnninn jya
,tx,hello
,rx,hi,Who are you?
EOT,dfae271
```

上記にて登録が終わってからは以下を実行するたびに、異なる応答が受けられる。

```
hello
```
SwiftでforでListを列挙するのにちょっと詰まった


新しくアップデートされたXcode7で以下のコードを実行してみた


```
let colorList = ["bulew","yellow","red","green"]
for (index,value) in enumerate(colorList) {
    print((index,value))
}
```

ここで、エラーが出る。
'enumerate' is unavailable: call the 'enumerate()' method on the sequence

そこで、以下のようにしたらエラーが治って正常に実行できるようになった。英語では情報が出回っているのだが、日本語ではないので書いておいた

```
let colorList = ["bulew","yellow","red","green"]
for (index,value) in colorList.enumerate() {
    print((index,value))
}
```

ちょっとしたtipだが、役に立てていただければ幸いである。
unity > error > RandomRangeInt can only be called from the main thread... > fakeRandom()でとりあえず対応

```txt:動作環境
Unity 5.1.3-f1 on MacOS X 10.8.5
```

Random.Range()を使う自作スクリプトを使うと、以下のエラーが出た。

![Scene_unity_-_150917-udpEmu_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/f9771366-fb81-f47e-b354-80a9cfb33c32.jpeg)


http://baba-s.hatenablog.com/entry/2015/07/06/000000
を見ると

> 変数の初期化でRandom.Range関数を使用したい場合は
Awake関数やStart関数で呼び出す必要があります

乱数をどうしたものか。


##対策 (擬似乱数)

今やろうとしていること(辞書からランダムに文字列を取得）においては、それほど乱数の精度を求めていない。だから、とりあえずの下記のようなものを用意した。

```MyResponseDictionaryUtil.cs
...
using System; // for DateTime
...
		private static long get_msec() {
			System.DateTime now = System.DateTime.Now;
			System.DateTime nowMsec0 = new DateTime (now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second);
			long TotalMsec = (long)((DateTime.Now - nowMsec0).TotalMilliseconds);
			
			return TotalMsec;
		}

		private static int fakeRandom(int maxval) {
			long msec = get_msec ();
			return (int)(msec % (maxval+1));
		}
...
```

現在時刻のmsecを取得して、その剰余を使う。
最大値が999になるのだろう。それ以上の値はとりあえずは扱わない。

どれほどのランダム性かは未調査。
udpTimeGraphでチェックしようかどうか。
[C++]任意のタイミングで初期化できるstatic constメンバ変数もどき

DXライブラリを使っているわけですが、
白色を取得するために毎回
`Dxlib::GetColor( 255, 255, 255 );`
と書いていてはめんどくさすぎる。

#こう書きたかった
```cpp
int hoge = Color::white;
```

#これで動いて欲しかった
```cpp
class Color {
public:
  static const int white = DxLib::GetColor( 255, 255, 255 );
}
```
宣言の見た目もさっぱりしてるし、呼び出しも綺麗。
しかしこれでは、whiteが初期化される前にDxLibの初期化が終わっていないようで、上記のように呼び出しても正しい値が帰ってこない。

#こうしたら動いた
```cpp
class Color {
public:
  static int white() {
    static int color = DxLib::GetColor( 255, 255, 255 );
    return color;
  }
};
```
そして
`int hoge = Color::white();`
と呼び出す。

こうすれば`Color::white()`が最初に呼び出されたタイミングで値が初期化されるため、任意のタイミングでの初期化が可能になる。
熟練プログラマにとっては当たり前の話か・・・

（でもやっぱり関数内のstaticは気持ち悪くない？）

#さらにこうした
```cpp
#define DEFINE_COLOR( name, r, g, b ) \
  static int name() { \
    static int color = DxLib::GetColor( r, g, b ); \
    return color; \
  }
```
個人的にマクロはあんまり増やしたくないんだけど、これで宣言部もスッキリしました・・・
Androidのメモリ効率化Tips "ArrayMap"

## はじめに
Google公式の[Android Performance Pattern](https://www.youtube.com/watch?v=ORgucLTtTDI&list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE&index=1)の内容をまとめてみました。
AndroidのPerformanceを良くするためのTipsが公開されているのですが、英語で記載されており日本語でまとめたものがないので、簡単にまとめてみました。詳細は追記していきます。

## ArrayMapとは
[ドキュメント](https://developer.android.com/intl/ja/reference/android/support/v4/util/ArrayMap.html)によると
**ArrayMapとは、Mapクラスの一つでHashMapのメモリパフォーマンスをより効率化したクラス** 
である。

通常のHashMapはインスタンスを生成した際に利用しないメモリまでallocate(割り当て)してしまう。androidにおいて、メモリパフォーマンス的によくない。そこでAPI Level19よりAndroid用に新しく追加されたのがArrayMap。以下のようなヒエラルキーになっている。


![Kobito.if8zv3.png](https://qiita-image-store.s3.amazonaws.com/0/43762/76f8b52e-634b-c37e-0a34-8eff58461447.png "Kobito.if8zv3.png")

## ArrayMapsの利用シチュエーション
### item数が少ない状態で、HashMapを使いたい場合

* mapのitem数が少ない1000以下の場合
* mapの内部にmap(submap)を持ち、submapを頻繁にイテレートする場合


![Kobito.D6LlvN.png](https://qiita-image-store.s3.amazonaws.com/0/43762/e6ed5ce5-614d-e861-038d-a76d5f9120a8.png "Kobito.D6LlvN.png")

## ArrayMapの仕組み
* HashMapと大きく違う点が、要素を追加した際に順番を保持していること。任意のkeyでアクセスする際には、まず二分探索でhashのorderを特定し(下図左)その後に、Collection(keyとvalueのobjectが交互に織り合わさって構成されている(右側))に効率よくアクセスする。

![Kobito.Dd1nql.png](https://qiita-image-store.s3.amazonaws.com/0/43762/8b375887-f5b1-998e-0887-1b842dddb304.png "Kobito.Dd1nql.png")

## メモリ効率化
* 図のようにArrayMapはインスタンスを生成してもHashMapのように利用しないメモリを占拠しない。

![Kobito.mQ5B43.png](https://qiita-image-store.s3.amazonaws.com/0/43762/781f4e15-7946-d18a-f97f-ef7d8e536f85.png "Kobito.mQ5B43.png")

## ArrayMapの追加と削除
* 上記のようにメモリの効率化が行われているが、もちろんデメリットもある。必要なメモリしか利用しないのでその分のコストはかかる。なので、前述しているが、ArrayMapは要素数が少ないときのみ利用するようにする。

* 削除 -> 要素の削除とその配列をコピーしてメモリを必要な分のみの大きさを割り当てて再度移し替える。
* 追加 -> 要素の追加とその配列をコピーしてメモリを必要な分のみの大きさを割り当てて再度移し替える。

![Kobito.pkfzwS.png](https://qiita-image-store.s3.amazonaws.com/0/43762/2e43cb08-5ed7-cd34-a10c-a9dcc22d641e.png "Kobito.pkfzwS.png")![Kobito.Y31v9X.png](https://qiita-image-store.s3.amazonaws.com/0/43762/c81f2146-ae0d-b8d6-68bf-8ea228ee43ea.png "Kobito.Y31v9X.png")


## orderの利用
* ArrayMapはHashMapとは違い、要素のorderを保持しているのでHashMapのようにIteratorでのループだけでなく、indexでのloopが可能


![Kobito.Hsp1Rs.png](https://qiita-image-store.s3.amazonaws.com/0/43762/ced0c542-6923-d441-88fa-f26e5867c64f.png "Kobito.Hsp1Rs.png")
Ubuntu環境構築チートシート


ゆくゆくはansibleとかにしたいなぁ。

# 一番最初にすること

```
sudo apt-get upgrade
sudo apt-get update
```

# ユーザー操作系

* `adduser <username>`
* `deluser <username>`
* `id <username>` -- 所属グループなどの確認
* `passwd user`
* `gpasswd -a user group` -- グループ追加
* `gpasswd -d user group` -- グループから削除

# SSH（必要なら）

```
$ sudo sudo apt-get install openssh-server
```

# 言語設定

```
$ sudo apt-get install language-pack-ja
$ sudo update-locale LANG=ja_JP.UTF-8
```

# timezoneの設定

```
$ date
2015年  9月 18日 金曜日 15:42:48 UTC
$ sudo cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
$ date
2015年  9月 19日 土曜日 08:52:55 JST
```

# ntp

```
$ sudo apt-get install ntp
```

`/etc/ntp.conf` を編集

```
# これらの行を削除
# server 0.ubuntu.pool.ntp.org
# server 1.ubuntu.pool.ntp.org
# server 2.ubuntu.pool.ntp.org
# server 3.ubuntu.pool.ntp.org
# server ntp.ubuntu.com

# 新しくサーバーを設定
server ntp1.jst.mfeed.ad.jp
server ntp2.jst.mfeed.ad.jp
server ntp3.jst.mfeed.ad.jp
```


# makeとか言語パッケージ

```
$ sudo apt-get install gcc make ncurses-devel 
$ sudo apt-get install python-dev
```

# zsh

```
$ sudo apt-get install zsh
$ which zsh
/usr/bin/zsh
$ chsh
Changing the login shell for yoshi
Enter the new value, or press ENTER for the default
	Login Shell [/bin/bash]: /usr/bin/zsh
```

ログインしなおして確認。

なお、zshの場合は、「.zshrcがないけど作成しますか」みたいなことを聞かれるので 0 とかで作成したらいいと思います。

# emacs

qiita.com/yoshikyoto/items/212ea5f31a90bdd7e02e
ElectronでYosemite風のWindowが作れるようになった

# バージョン 0.32.3から

```js
  mainWindow = new BrowserWindow({
    "width": 800, "height": 600,
    "title-bar-style": "hidden-inset"
  });
```

のようにtitle-bar-styleにhidden-insetを指定すると

![ElectronYstyle.png](https://qiita-image-store.s3.amazonaws.com/0/3458/d0d9b2cd-1bbc-1768-9256-eedb8dce2326.png)



という用にYosemite風のウィンドウが表示できる。

electron-jpにて流れてきたFacebookメッセンジャーの

- https://github.com/sindresorhus/caprine/

で気が付き、調べたら、

- https://github.com/atom/electron/issues/761
 
でも挙がっていた機能がv0.32.3からサポートされた模様。

# 関連記事

- [Electronで自分のIPアドレスをLAN内のiPhoneに通知するには](/entry/2015/10/24/113659)
- [Raspberry Piの温度をgRPCを使ってElectronで作ったデスクトップマスコットに表示させた](/entry/2018/06/16/070747)
- [ElectronでWebGL(three.js)使ってデスクトップマスコット作った際に分かったこと](/entry/2016/01/09/134348)
- [ElectronでmacOSのDockやWindowsのタスクバーに独自のアイコンを表示するには - non vorrei lavorare](/entry/2018/08/20/202928)
- [Tensorflowのclassify_image.pyにElectronでGUIを被せてみた](/entry/2017/02/05/134054)
- [lisp版ElectronのCeramicを動かした](/entry/2015/09/08/071602)
c# リスト中に存在しない名前+連番の文字列を作成する

# 概要
文字列リストに新しい要素を追加する際「末尾に連番をつけて追加したい」という単純だけど、ありがちな要件の実装例です。
メインロジックの中にこうした処理を直接書いていくと、コードが膨らんでしまうために外出ししてみました。
番号が歯抜けになっていない事を前提としたコードです。

# 実装
```csharp:Unique.cs
using System.Collections.Generic;
using System.Linq;
namespace Implem.Libraries.Utilities
{
    public static class Unique
    {
        // リスト中に存在しない名前+連番の文字列を作成する関数
        public static string New(IEnumerable<string> existing, string name, int start = 1)
        {
            var number = start;
            while(existing.Any(o => o == name + number))
            {
                number++;
            }
            return name + number;
        }
    }
}
```

```csharp:Program.cs
using Implem.Libraries.Utilities;
using System;
using System.Collections.Generic;
namespace Implem.CodeDefiner
{
    internal class Program
    {
        // 関数の使用例
        static void Main(string[] args)
        {
            // 連番で 1, 2 が存在するリスト
            var items = new List<string> { "設定1", "設定2" };

            // リストに連番 3, 4, 5 を追加したい場合の使用例
            items.Add(Unique.New(items, "設定"));
            items.Add(Unique.New(items, "設定"));
            items.Add(Unique.New(items, "設定"));

            // 内容を出力
            foreach(var item in items)
            {
                Console.WriteLine(item);
            }
        }
    }
}
```

```text:結果
設定1
設定2
設定3
設定4
設定5
```
Rails in React.js でfluxなアプリケーションの作成


### 目的
Ruby On Railsのプロジェクトの中にReact.jsでfluxなアプリケーションを作成するための手順書。
fluxのframeworkはたくさんあるが、今回はfluxxor(http://fluxxor.com/guides/quick-start.html)
を使用。

### Railsの中にReactのセットアップ
Gemfileに以下を追加

```
gem 'react-rails'
```

その後

```
$ bundle install
$ rails g react:install
$ rails g controller wellcome
```

## Reactにfluxxorを導入

```
// npmが入っていない方は
$ brew install node
$ npm install -g bower

// pwd .../project_path
$ bower init
$ bower install --save fluxxor
```
これでfluxxorがRailsに入る。

## fluxxorをプロジェクトで読み込む設定を行う

config/initializers/assets.rb

```
Rails.application.config.assets.paths << Rails.application.config.root.join('bower_components')
```

app/assets/javascripts/application.js

```
//= ....
//= require fluxxor
//= require components
//= require_tree .
```

## assets/javascript以下のフォルダ構造

tree app/assets/javascript

```
├── application.js      
├── components.js
├── actions             //アクションとデータ通信等を記述
├── components          //コンポーネントを格納
├── constants           //定数を格納
├── stores              //fluxのstoreを格納
├── entities            //viewで使用するデータ型を定義
└── dataManagers        //storeに格納する前に整形を行う

```

## Routing

シングルアプリケーション内のroutingを行いたいときは
Gemfileに以下を追加
(https://github.com/rackt/react-router)

```
gem 'react-router-rails'
```

## application.js

```
   //= require jquery
  //= require jquery_ujs
  //= require react
  //= require react_ujs
  //= require react_router
  //= require fluxxor
  //= require components
```

### components.js

```
  //= require_tree ./constants
  //= require_tree ./stores
  //= require_tree ./actions
  //= require_tree ./components 
  //= require_tree ./entities
  //= require_tree ./dataManagers
```

以上でセットアップは終了。

### コンポーネントを呼び出す。

app/views/welcome/index.html.erb
複数ファイルのviewに分けるためにはページごとに違うjavascriptを管理する。

```
<div id="app" class="l-main"></div>
<%= javascript_include_tag "pages/timeline" %>
```

## 最初に読み込まれるjavascriptファイル

app/assets/javascripts/pages/welcome.js.jsx.coffee

```
 stores =                                                                                                                                                                      
    WelcomeStore: new WelomeStore()
    XxxxxxxStore: new XxxxxxStore()
    
  actions =
    WelcomeActions: WelcomeActions
    XxxxxxxAvtions: XxxxxxxActions
  
  flux = new Fluxxor.Flux(stores, actions)
  
  @RouteHandler = ReactRouter.RouteHandler
  
  App = React.createClass
    render: ->
      `<div>
        <HeaderComponent {...this.props} /> //component読み込み等可能
        <RouteHandler {...this.props} />    //routingでハンドルされたコンポーネント呼び出し
       </div>`
  
  @Route = ReactRouter.Route
  
  @MyRoutes =
    `<Route handler={App}>
      <Route name='home' handler={WellcomeComponent} path='/' />
    </Route>`
  
  ReactRouter.run MyRoutes, (Handler) ->
    React.render `<Handler flux={flux} />`, document.getElementById("app")
    return

```

このような流れで記載するといい感じでfluxxor+RailsのReactアプリケーションの構築が可能
技術英語 > 可算名詞と間違えやすい不可算名詞 > advice / information / ... / weather / ...

引用: 冠詞マスター教本 by 石井隆之さん

> 可算名詞と間違えやすい不可算名詞の例
advice
information
...
weather
...

weatherの例文

> We had good weather for our trip.

a good weatherとは言わない。

<hr>
weather関連で思い出したものは

> Weather permitting, we will go for a trip.
(天候が許せば...)

http://ejje.weblio.jp/content/weather+permitting

<hr>
Subresource integrity でCDNリソースの改ざんを検知する

# Subresource Integrity って何?

ざっくり言うと、JavascriptやStylesheetファイルをCDNからロードする時、あらかじめ用意したチェックサムと突き合わせて、改ざんを検知する仕組み。

[Subresource Integrity - GitHub Engineering](http://githubengineering.com/subresource-integrity/)で記事を見たので少し調べてみた。


http://www.w3.org/TR/SRI/ によると2015年9月現在、仕様はまだドラフト。ただ、ブラウザによる実装は進んでいるようだ。先のGitHubの記事によると

<blockquote>
<pre>
Browser support at the time of this article's publishing:

Google Chrome added support in version 45
Mozilla Firefox plans to add support in version 43 (Nightly. Developer Edition as of next Monday)
Microsoft Edge support is "under consideration". Vote for the feature here.
</pre>
</blockquote>

とのこと。

CDNからコンテンツをロードするブラウザ側での対応なので、CDN側の対応は不要。

# どうやって設定する?

これもGitHubの記事からの受け売りだが、Railsの場合、javascript_include_tagやstylesheet_link_tagにintegrity: true を設定するだけでいけるらしい。

ただ、[sprockets-rails](https://github.com/rails/sprockets-rails)を見てみたところ、まだexperimental supportだった。version3から入るようだが、現在リリースされている2.x系では未サポート。

~~ただし、integrity: trueを指定しても無視されるだけなので、今のうちから入れておくのもいいかもしれない。~~

```
<%= javascript_include_tag 'application', integrity: true %>
<%= stylesheet_link_tag 'application', integrity: true %>
```

これだとブラウザ側でintegrity="true"となり、エラーが出ていた。(汗) ということで、対応するまでは入れてはいけない。

# もし改ざんされてたらどうなるの?

単にロードされないだけだと思われるが、javascriptについてはfallbackするアイデアを見つけた。

<blockquote>
<pre>
&lt;script src=&quot;https://code.jquery.com/jquery.min.js&quot;
        integrity=&quot;sha256-C6CB9UYIS9UJeqinPHWTHVq&hellip;&quot;
        crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;script&gt;window.jQuery || document.write('&lt;script src=&quot;/jquery-.min.js&quot;&gt;&lt;\/script&gt;')&lt;/script&gt;
</blockquote>
https://frederik-braun.com/using-subresource-integrity.html
[初心者]再帰のイメージ

非日常的な思考様式に脳みそをなじませる時、人はみな脳内で、他人には言えないような日常的なたとえ話を空想してると思います。再帰を考える時、僕の場合は、こんな空想をしてますという話です。

例として、玉ねぎの皮をむく関数を考えてみます。

ループで書くと、このような実装イメージになります。

```c:peel_onion_loop.c
onion_t *peel_onion(onion_t *onion)
{
    while(!is_core(onion))
        onion = peel_outmost(onion);

    return onion;
}
```

再帰で書くと、このような実装イメージになります。

```c:peel_onion_recursive.c
onion_t *peel_onion(onion_t *onion)
{
    if(is_core(onion))
        return onion;

    return(peel_onion(peel_outmost(onion))); 
}
```

渡された玉ねぎについて、最外側の皮を1枚剥いたものを、「自分自身に投げる」イメージです。自分のやるべきことは「最外側（outmost）の皮を1枚剥く」ことだけ、と考えればよいのです。

（再帰の考え方に慣れると、「自分がやるべきこと」が1つのみに単純化されるので、脳への負担が軽くなる気がします。）

あとは、再帰をストップするための終了条件を定義する必要があります。コード例の場合、「渡された玉ねぎが芯（core）のみだった場合」が終了条件。これがないと無限ループが成立し、スタックオーバーフローが発生します。

もうひとつ、「与えられた文字列中に出現する、すべての連続する半角スペースを、それぞれ1個の半角スペースに置換した後の文字列」をかえす関数の実装イメージです。

```c:compress_spaces.c
char *compress_spaces(char *target)
{
    if(!strcmp(replace(target, "  ", ""), target))
        return target;

    return compress_spaces(replace(target, "  ", ""));
}
```

いつも思うのですが、再帰を説明するために使うコード例って、それ別にループでもよくね？と言われても、ごもっともです…と認めざるをえないようなコード例しか思いつかなくて悩ましいですね（例：階乗）。
Xcode7.0でiOSアプリ(9.0)のビルドに失敗する一因

こういう感じのエラーでビルドがコケる場合

```
ld: '/Users/revin/Library/Developer/Xcode/DerivedData/...(略).../libjsbindings iOS.a(Value.o)' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)
```

**Enable BitcodeがYesになっていることが原因**だった。

![スクリーンショット 2015-09-19 4.58.35.png](https://qiita-image-store.s3.amazonaws.com/0/1642/73934cb4-6655-a980-eb27-3ed3fdd63b0b.png)

Noにするとビルドが通った。
不用意にXcodeをアップデートした俺が悪い。

このページが俺に救いを与えてくれた。
stackoverflowはいつだって俺達の味方だ。
http://stackoverflow.com/questions/30848208/new-warnings-in-ios9
brewでautojumpをInstall


## インストール

```console:command
brew install autojump
```

## 設定ファイルの設定

autojumpの設定を.bash_profileに設定

```console:.bash_profile
# autojump setting
[[ -s `brew --prefix`/etc/autojump.sh ]] && . `brew --prefix`/etc/autojump.sh
```

設定を反映

```console:command
source ~/.bash_profile
```

## autojumpの補完設定

リンクをコピーします。
コピーはroot権限がないと行えないので、
sudoコマンドを使用して実行しています。

```console:command
sudo cp /usr/local/Cellar/autojump/21.3.0/share/zsh/site-functions/_j /usr/share/zsh/site-functions
```

#### ※注意

パス内の`/21.3.0/`はautojumpのバージョンによって異なるので、
ダウンロードしたバージョンに合わせてパスを変更してください。



## 参考URL

* autojumpの補完設定  
http://shigemk2.hatenablog.com/entry/20130304/1362323283
rspec がzip/zip(LoadError)で走らないときの対処法

##zip/zip(LoadError)

rspecのラーニング手前でハマった人向け。
[rails のチュートリアルの3.2.1TDDの項](http://railstutorial.jp/chapters/static-pages?version=4.0#top)などで引っかかった人向け。
`$ bundle exec rspec spec/requests/static_pages_spec.rb`
したときに、
```.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/selenium-webdriver-2.35.1/lib/selenium/webdriver/common/zipper.rb:1:in `require': cannot load such file -- zip/zip (LoadError)```
とエラーが返されて通らないとき。

##対処法

Terminalで`gem install zip`をして
対象プロジェクトのGemfileを開いて gem 'zip',’2.0.2’(ダウンロードしたバージョン)を足す。

```lang:Gemfile
source 'https://rubygems.org'

#ruby-gemset=railstutorial_rails_4_0

gem 'rails', '4.0.5'
gem 'zip',’2.0.2’
.
.
.

end
```
上記で通るようになる。
他にもselenium-webdriver のバージョンが古いことが原因の場合もあるみたい。

※追記
上記試したときは
`selenium-webdriver` (2.35.1)
`capybara` (2.1.0)
はインストール済でした。

※追記:2
@jnchito さんから上記よりストレートなやり方を教えていただきました。
ありがとうございます！

今回のケースは、 `selenium-webdriver` が `rubyzip` の1.0.0未満にしか対応していないのだけど、1.0.0betaがインストールされていて、「1.0.0未満として認識はされるけど、挙動が1.0.0に近いためエラーが生じている」ということのようでした。
私の環境に1.0.0betaがインストールされていて、それを上記のやり方で回避という変則的なやり方のようです。

1.0.0betaがインストールされていて上記の振る舞いをするのはどうやらレアケースなようで。

上記に対してストレートな解決策は以下コメント欄でも書かれている通り、`rubyzip` のダウングレードのようです。
ダウングレードのやり方での解決も確認しました。
正規表現とは?

正規表現を使った検索や置換に関しての記事は良く見かけますが、
「正規表現って何？」と思ったので正規表現自体の説明を読みました。
しかし説明を読んでも「???」状態なので、自分が理解しやすいようにまとめた備忘録です。


# 正規表現とは?

> - 文字列の集合を一つの文字列で表現する方法。[^1]
- 文字列のパターンを表現する表記法。[^2]
- 正規表現は、通常の文字 (a ～ z など) と、"メタキャラクタ" という特殊文字から構成される文字列のパターンです。[^3]

意味が解りづらいため、解りやすいに以下に言い換える。

- **様々な文字列を一つの文字列で表現する表記法。**

# 文字列とは?
~~文字の集合のこと。~~
文字を並べたもの。
以下は文字列。

```lang:
abc
```

以下も文字列。

```lang:
apple
```

以下も文字列。

```lang:
This is a Pen
```

##様々な文字列

```lang:
apple
orange
grape
lemon
```

```lang:
This is a Pen
This is a Bed
This is a Bat
This is a Bag
```

※コンピュータ上では空白は文字

#様々な文字列を一つの文字列で表現してみる
正規表現を利用すると様々な文字列を一つの文字列で表現できる。

以下の文字列は

```lang:
apple
orange
grape
lemon
```

正規表現で表記すると以下の文字列で表現できる。

```lang:
[a-z]+
```

以下の文字列は

```lang:
This is a Pen
This is a Bed
This is a Bat
This is a Bag
```

正規表現で表記すると以下の文字列で表現できる。

```lang:
This is a ...
```
もちろん、より複雑な文字列の表現もできる。
確かに正規表現は**様々な文字列を一つの文字列で表現する表記法**だった。

# 様々な文字列を一つの文字列で表現できると何が便利なのか？
文字列の検索や置換が便利になる。
例として以下のファイルを`grep`コマンドで検索をしてみる。

```lang:fruits.txt
strawberry
apricot
persimmon
kumquat
cherry
pomegranate
watermelon
plum
pear
pineapple
banana
loquat
grape
mandarin
peach
apple
mango
lime
lemon
blueberry
```
## `lemon`という文字列が何行目にあるか検索する
この場合は単純に`lemon`という文字列を入力すれば良い。

```bash:コマンド
grep "lemon" fruits.txt -n
19:lemon #出力結果。19行目にある。
```

## 行末が`n`の文字列が何行目にあるか検索する
このファイルには行末が`n`の文字列が以下の4つ存在する。

```lang:
persimmon
watermelon
mandarin
lemon
```

それぞれの文字列を入力すれば検索できるが時間がかかるし面倒。

```bash:コマンド
grep "persimmon" fruits.txt -n
3:persimmon #出力結果

grep "watermelon" fruits.txt -n
7:watermelon #出力結果

grep "mandarin" fruits.txt -n
14:mandarin #出力結果

grep "lemon" fruits.txt -n
19:lemon #出力結果
```

## 正規表現を使って行末が`n`の文字列が何行目にあるか検索する
そこで正規表現を使う。
正規表現だと行末が`n`の文字列は以下の表記で表現できる。

```name:
n$
```

これを入力して検索してみる。

```bash:コマンド
grep "n$" fruits.txt -n

# 出力結果
3:persimmon
7:watermelon
14:mandarin
19:lemon
```
正規表現を使って行末が`n`の4つの文字列を`n$`という一つの文字列で表現できたので
一回の検索で全ての行数を出力させることができた。
そのため正規表現を検索や置換に使用すると便利。

#終わり
なんとなく解ったような解らないような。。。
小学生に「正規表現って何？」と聞かれても自分はうまく説明できる自信がありません。
何故、正規表現を検索や置換に使うと便利なのか理解できたので良しとします。


[^1]: https://ja.wikipedia.org/wiki/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE
[^2]: http://e-words.jp/w/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE.html
[^3]: https://msdn.microsoft.com/ja-jp/library/cc392020.aspx
EnOceanのSTM431Jなどの温度センサーで一定間隔でかならずデータを送信させる設定方法


参照：http://www.enocean.com/en/enocean_modules_928mhz/stm-431j-user-manual-pdf/

EnOceanの温度センサーは省エネルギーのため、温度がある程度変化してはじめてデータが送信されるが、redundent retransmissionという機能を使うと、指定されたwake-up cycleの後に強制的にデータを送信させられる。(参照スペックの2.1節にフローチャートがある）

この設定はenocean.comで配布しているDolphin V4 Module Configuratorのソフトウェアによって変更できる。

## 変更箇所

- 送信間隔の指定: Cyclic Wake-up欄の wake up cycle (0だと無効。65535だとチップに入力された信号線の値で決まる（デフォルトは100秒±20％）。それ以外の値であれば、秒単位で指定可能。
- Redundent Retransmissionの指定：０だと無効、255だとチップに入力された信号線の値で決まる。デフォルトは255。MinとMaxの指定は、その間でランダムに変化するという意味。

## デフォルトの送信間隔

だとMinが7でMaxが14ということで、送信間隔のデフォルト値100秒と組み合わせると700秒から1400秒の間でランダムに変化し、平均で1000秒に１回データが送信されます。

## 毎回かならずデータを送信させるには

redundent retransmissionのサイクルのMinとMaxをともに１に設定すると、かならず毎wake up cycle毎にデータを送信させられる。

# 注意点

## 太陽電池などのエネルギー源で賄える頻度でないとデータ送信は途切れてしまう

たとえばSTM431Jの場合、スペックの2.12節ではwake-up cycleと実際のデータ送信の頻度によってどの程度の照度であれば太陽電池でデータ送信のエネルギーが賄えるかが表になっている。夜間や消灯時には蓄電池に蓄えられた電力を使うわけだが、その時間帯もデータ送信を維持するために、昼間に必要な照度と蓄電時間の目安もわかるようになっている。
Macで初心者がWordPressの環境をローカルで構築する、たったひとつの冴えたやりかた。

ご無沙汰しています。

最近PGMingあんまやってません

WordPressが必要な状態になっています
で、導入のしかたをいろいろ調べたのですが
・xamppだと初期設定が面倒
だの
・homebrewでいろいろ構築してくるやり方だとなぜかうまくいかないだの。。。

で、この投稿をみつけました
アルパカ＠ラボさんのこちら
http://www.paka3.net/wordpress_firststep_01mac/
Bitnamiというツールを使うと、楽に環境が組めました

困っていらっしゃる方、一度試してみていいと思います。。。

アルパカ＠ラボさん、ありがとうございます！

追記：2.wordpressフォルダ内のwp-config.phpの以下の部分を書き換えます。
の部分。。。
wp-config.phpに
define('WPLANG', '');　が見つからなかったので
81行めくらいに
define('WPLANG', 'ja');
と追記して保存したところ、問題なく動きました！
初心者向け - プッシュ通知が送れないときに確認すること

iOSでPush通知を実装するために、すこぶるハマったので忘れないように書いておこうと思います。
書いてる内容はやり方というか、ちょっとニュアンスは違います。

## 証明書は2種類必要
証明書は、

#### 開発用
- プッシュ通知用の証明書（APNs Development iOS）
- プロビジョニングファイル用の証明書（iOS Development）

#### 本番用
- プッシュ通知用の証明書（APNs Production iOS）
- プロビジョニングファイル用の証明書（iOS Distribution）

それぞれで2種類ずつ必要です。

プロビジョニングファイル作成時に証明書を選択する画面がありますが、ここにはプッシュ通知用の証明書は表示されませんのでご注意ください。ここではプロビジョニングファイル用の証明書を選択するのでOKです。
![screenshot.jpg](https://qiita-image-store.s3.amazonaws.com/0/60326/529a68cc-afc1-0744-066d-1238e3d43ce8.jpeg)


## サーバにはプッシュ通知用の証明書から作成したpemファイルをアップする
サーバにアップするpemファイルはプッシュ通知用の証明書から作成したものが必要です。プロビジョニングファイル用の証明書から作成したpemファイルをアップしないように気をつけてください。

pemファイルは下記ツール使えば簡単に作れます。
コマンドたたくの面倒な人は試してみてください。（Mac用）
https://itunes.apple.com/jp/app/pempem/id876280659?mt=12

## ビルドする時にDebug・Adhoc・Releaseのどれでビルドしたか確認する
Debug、Adhoc・Releaseで送られてくるデバイストークンの種類が違います。

#### Debug
- APNs -> **SANDBOX**
- デバイストークン -> **開発用トークン**

#### Adhoc・Release
- APNs -> **PRODUCTION**
- デバイストークン -> **本番用トークン**

どれでビルドするかはメニューの```Product -> Scheme -> Edit Scheme```の、
```Run -> Info -> Build Configuration```で選択できます。

##wifi環境ではPush通知が送られてこない
wifi環境ではPush通知が送られてこないことがありました。
なぜPush通知送られてこないのか原因がさっぱりわかりません。

## おわりに
慣れてしまえばどうということはない、というようなことに数時間もハマってしまいました。
同じ問題にぶつかっている方のお役に立てれば幸いです。
http://qiita.com/0x0c@github/items/811fb70d0d2523968e50
iCloudの隠れストレージを取り戻す


タイトルは「日本を取り戻す」によく似る喋り方ですね。冗談だわ。

最近iOS 9にアップデートした。その後、iCloudのストレージがわずか数十MBしかないことを通知するメートがAppleの方からきて、その事実を知った。しかし、iCloudのストレージ状況が、アイテムを一つずつ計算しても、数GBの差が見えた。やばい、まさかAppleの罠に落ちたか。と思ったが、やはり月額が支払いたくなかった。では、そのiCloudのストレージの神隠し事件を解決してみた。

iCloud.comで調べた結果、その巨大な隠れストレージは、Backupだった。しかし、iPhoneとiPadはどっちでも、iTunesへBackupをしていた。まさか、ただの名残か。

ネット上では、iOS 9のベータ版のテスト関与者たちはそのような事件が書き込んだことあるらしい。調べたら、Appleのほうが、その削除すべきストレージをそのまま残るバグが公式発表した今もなおのこっているらしい。

なら、逆に、Appleの考え方をしたがって削除してみようか。

まず、設定でiCloudのバックアップをオンにする。

そして、iCloudの「容量」で、「ストレージを管理」を選択して、一番上に、0KBなど新たに現れたデバイスを開く。その中に、すべてのアプリを展開し、皆オフにするまで、苦労をした。そして、すぐに、一番したのボタンでこのデバイスのバックアップを削除する。

削除が成功した、神隠しのストレージが皆帰ってきた。めでたし、めでたし。
Knockout.jsのforeachの$indexに+1したいとき


observableArrayをforeachでリストやテーブルで表示するとき、番号をふるのに```$index```使うけど、0はじまりじゃなくて1はじまりにしたい時どうするか、のメモです。

```coffee
@items = ko.observableArray(["hello", "world"])
```

```html
<table>
	<tbody data-bind="foreach: items">
	<tr>
		<td data-bind="text: $index() + 1"></td>
	</tr>
	</tbody>
</table>
```

0はじまりでふるときは

```html
<td data-bind="text: $index"></td>
```
ですが、```$index() + 1```とすることで、インデックス値に+1した結果が表示されます。
Arch LinuxでGUI環境を入れてKVMで仮想マシンを作るまで

ほとんど個人的なメモです。

前回([Arch LinuxをUEFIブートかつRAID1(MDADM)でインストール](http://qiita.com/zeriyoshi/items/ebf4c4ab66c0fbfe57f0))の続き。

# ハードウェアのチェック

[KVM](https://ja.wikipedia.org/wiki/Kernel-based_Virtual_Machine)を用いて仮想化を行うので、ハードウェアおよびカーネルの対応が必須。

* 仮想化支援(Intel VT-x/AMD-V) [必須]

```
# grep -E "(vmx|svm|0xc0f)" --color=always /proc/cpuinfo
```

何か表示されていればOK。ただし、ハードウェアが対応していてもBIOS(UEFI)で無効化されている場合があるので、要チェック。

* ハードウェア仮想化支援(Intel VT-d / AMD-Vi a.k.a. IOMMU)

```
# dmesg | grep -e DMAR -e IOMMU
```

なくても良いけど、あると便利。

何か出れば(No IOMMU Foundとかでなければ)OK。ダメならCPUの対応を確認し、対応しているようならBIOS(UEFI)の設定を見直す。BIOSに有効化がなければ諦めるかマザーを買い換えよう。

ちなみにVT-dをうまくつかえばKVM環境にWindowsを入れてPCIe接続のGPUをパススルーしてやることで面白いことができたりします。

* KVMカーネルモジュール [必須] 

```
# zgrep CONFIG_KVM /proc/config.gz
```

必須の```CONFIG_KVM```と、```CONFIG_KVM_INTEL```か```CONFIG_KVM_AMD```のどちらかが```y```または```m```であればOK。

* virtio 準仮想化モジュール

```
# zgrep CONFIG_VIRTIO /proc/config.gz
```

必須ではないけど、パフォーマンス上ほぼ必須かも？使いたいものが```y```か```m```になっていることを確認。

# 各種ドライバとXorg関連のインストール

まずはGPUドライバから。今回はIntel HD Graphicsを使うので下記のように。他社のGPUの場合は適宜変更。

```
# pacman -S xf86-video-intel
```

次にXorg関連

```
# pacman -S xorg-server xorg-server-utils xorg-xinit xterm
```

# GNOMEとかのインストールと起動設定

リソースが限られている場合LXDEを使うのだけれど、今回はだいぶリソースに余裕があり、常に起動するわけでもないのでGNOMEを選択。

```
# pacman -S gnome
```

今回はデスクトップマネージャを用いず、```startx```にて手動で起動するよう構成する為、```~/.xinitrc```を編集。

```
# cp /etc/X11/xinit/xinitrc ~/.xinitrc
# nano ~/.xinitrc
```

最後の```twm```以降を以下のように書き換え

```sh:.xinitrc
exec gnome-session
```
最後に```startx```でGNOMEを起動。

# gnomeの設定

そのままだと英語なので、必要であれば日本語に設定を変更する。
あとは普通にgnomeの操作なので、設定を開き言語を日本語にすればOK。

変更時に「設定を反映するにはログアウトが必要です」と言われるが、それに従い「ログアウト」しても、**そのgnomeのセッションが終了するだけでログアウトされていない**(=シェルに戻るだけ)ので**反映されない。**

すぐに日本語にするには、```exit```にて**シェルからログアウト**し、再度ログインする必要がある。

# 仮想化関連の環境構築

仮想マシンのホストとして使用するために、必要なパッケージをインストールする。

シェル上でもgnomeの```xterm```上でも良い(はず)

```
# pacman -S libvirt qemu virt-manager
```

仮想マシンマネージャを利用するには```libvirtd```デーモンが動作している必要がある為、```systemd```でサービスを有効化し開始。

```
# systemctl enable libvirtd
# sysetmctl start libvirtd
```

あとはGNOMEから仮想マシンマネージャを立ち上げて好きなだけ仮想マシンを作りましょう。

# 参考
[ArchWiki](https://wiki.archlinuxjp.org/) (JP)
[ArchWiki](https://wiki.archlinux.org/) (EN)
--net=bridgeなdockerコンテナの内部から直接vxlanで構成した仮想ネットワーク上にportを公開する

[vxlanでgceとec2の上に仮想ネットワークを作ってみる](http://qiita.com/takiuchi/items/2e27a4777d88987cae38)の続きです。

dockerを使ってマルチホストネットワークを構成するとして、`--net=bridge`なコンテナと他のホスト上のコンテナの通信をどうするかというのがこの問題の一番面白いところですね。
やり方は色いろあるようですが、以下のようにコンテナ起動時にvxlanで構成した仮想ネットワークのアドレスを直接指定することでかなり簡単にコンテナ内のportを他所のホストまで公開する事ができます。

**node1**

```shell-session
docker run --rm -p 192.168.1.1:1234:1234 -it ubuntu:14.04 nc -l -p 1234
hello
```

**node2**

```shell-session
docker run --rm -it ubuntu:14.04 nc 192.168.1.1 1234
hello
```

`<Ctrl+D>` で抜けてください。