OmniAICreator/Qiita-1.07M huggingface dataset:
Material UI使ってみた

# Material UIとは
[Material UI](http://material-ui.com/#/)

GoogleのマテリアルデザインをReactベースで使えちゃう今時なCSSライブラリ
おっ、これかっちょいいと思って少し触ってみました。

日本語の解説記事とかが見当たらなかったので簡単に紹介します。

# Get started
[この辺](http://umi-uyura.hatenablog.com/entry/2015/05/24/213120)で解説されているので、[公式](http://material-ui.com/#/get-started)のドキュメントとともに参考にする感じで。

# Componentの使い方とか
大別して3種類のAPIがあります。

* Props
* Events
* Methods

名前の通りそれぞれ、

* reactコンポーネントのrenderで要素を生成する際に利用できるprop
* 要素で発生するhtmlイベント（onChange,onClickなど）
* 要素で使える関数
になります。

使い方を見ていきます。

## Props
これはそのまんま。

```js
  render() {
    return (
      <DatePicker
        hintText="Landscape Dialog"
        mode="landscape"
        autoOk={true}
        defaultDate={new Date()}
        formatDate={(dt) => `${dt.getFullYear()}/${dt.getMonth() + 1}/${dt.getDate()}`} />

    );
```

注：ES6構文使ってます

公式のドキュメントで、propの名前と型が載っているので、その通りに記載していきます。
関数なんかも使ったりします。

## Events
イベントハンドルする関数を定義して、それをプロパティに入れます。

```js
let hogeDropDownMenu = React.createClass({
  _handleOnChange(e, index, item) {
    alert(item.text);
  },
  render() {
    let items = [{payload: 1, text: 'item1'}, {payload: 2, text: 'item2'}]
    return (
      <DropDownMenu onChange={this._handleOnChange} menuItems={items} />
    );
  }
});

```

この例ならドロップダウンの選択が切り替わった時にアラートが動きますね。


## Methods
Componentのrefを取得して利用できる関数です。

```
let fugaTimePicker = React.createClass({
//略
  getTime() {
    return this.refs.TimePicker.getTime();
  },
  render() {
    return (
      <TimePicker ref="TimePicker" />
    );
  }
});
```

同コンポーネント内で利用するならこんな感じで```this.refs.TimePicker```みたいに使えます。
親コンポーネントで使うならんな感じで関数をリレーしてやるといいんでしょうか。


# CSSの使い方とか
[ここ](http://material-ui.com/#/customization/inline-styles)に書いてあるのが全てなので特に解説することがないです。

インラインでスタイルを上書きできるようだけど、イマイチ挙動が怪しかったですね。
DatePickerでwidth指定しても、大枠のdiv要素だけ指定されてて実際の見た目として出てくる日時の部分が元のままの幅だったり。


# 所感
一生ラッパを書かされるのでちょっとめんどくさい感じでした。
APIが足りてなくてそれを補う必要があるってのも含めて。（text fieldsとかにはgetValue()みたいなのがあるのに、それがない要素(主にDropDownMenu)はevent拾って値を持たせて・・・とかしなきゃいけなくて、うーん・・・）

他のところは大体見たまんま使わせてくれるし、ナウなヤングっぽいUIをReactと親和性高くかけるので、そこが良いと思うなら頑張って使う感じでしょうか。

と言っても自分自身Reactを使って何か書いた経験が少ないので、これがReactでの一般的なことなのだって話（もしくはそんなことしなくても楽に書けるとか）だったらごめんなさいしなくちゃですが。


ということでMaterial UIの紹介でした。
unity > Sphere Collider > radius > The sphere radius will be scaled by the transform's scale.

Sphere Colliderのradius 0.5の意味。

http://docs.unity3d.com/ScriptReference/SphereCollider-radius.html

> The radius of the sphere measured in the object's local space.
The sphere radius will be scaled by the transform's scale.

Transform.Scale変更によってSphere Collider > radiusは変更しなくてよさそう。
AndroidのMQTTクライアント作成


Pahoを使います。
必要なライブラリは二つ。

* org.eclipse.paho.client.mqttv3-1.0.x.jar
* org.eclipse.paho.android.service.jar

Pure Javaでは上のライブラリのみで動作しますが、Androidの場合サービスとして動作させる下のライブラリが必要になります。

利用するためには、AndroidManifest.xmlを変更します。

```xml:AndroidManifest.xml
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
```

* android.permission.WAKE_LOCK

	Sleep時でも動作させるために、使っているみたいです。
記述しないとエラーが出ました。

* android.permission.INTERNET

	まあ外部接続するならMQTTならずとも必須でしょう

* android.permission.WRITE_EXTERNAL_STORAGE

	なぜ必要かわかりません、もしかしたら不要？

* android.permission.ACCESS_NETWORK_STATE"

	これも使いそうではありますが、どうやって使われているのかは不明

あと当然ながらServiceも追加する必要があります。

```xml:AndroidManifest.xml
<service android:name="org.eclipse.paho.android.service.MqttService" />
```

あと注意するところもうひとつ。
MqttAndroidClient.connect()
これはサービスへの接続なので、非同期になります。
完了しないとpublish()などができません。publish()を呼び出してもNullPointerExceptionになってしまいます。
AndroidではonCreate(), onDestroy()あたりでconnect(), disconnect()を呼び出してやる必要がありそうですね。
具体的なソースコードはそのうち公開します。

[参考URL(ほとんどここを参考にしました)]~~(http://minor.hatenablog.com/entry/2015/02/15/2147300)~~削除されてしまっていました

MyMQTTなるアプリもある
https://play.google.com/store/apps/details?id=at.tripwire.mqtt.client
WebRTCのマルチストリーム サンプルアプリを作ってみました。

もう大分前、去年の WebRTC Advent Calendar 2014 で最終日に[「複数のストリーム同時送信やストリームの切り替え」](http://qiita.com/gtk2k/items/825a59fa8c93724bc568) という記事を投稿しました。  半年以上たってしまいましたが、これはこの記事のサンプルアプリとなります。

#WebRTCのマルチストリーム サンプルアプリ
https://github.com/gtk2k/WebRTC_MultiStream これがサンプルアプリのソースです。
このサンプルアプリは、１対１のピアでストリーム(ビデオのみ)を最大３つ送信するアプリとなっています。また、以前はChromeのみでしたが、Firefox Nightly(v42)でも動作するようにしました。
(Firefoxではデバイスキャプチャー選択ダイアログが少し違いますので操作説明を追加しました。)
ただし、Firefox Nightlyでは削除ができません。(削除できないのが新しい仕様のようです)
また、こちらで試してみるとChrome<->FirefoxではChrome->Firefoxではストリームを送ることができるのですが逆はできませんでした。
STUNサーバーのみ使用しており、TURNサーバーは使用していません。ですので、環境によってはWebRTCの接続ができない場合があります。

#操作説明

##１・部屋を作成または部屋に参加する
(初期表示はほとんど真っ暗となっています。ごめんなさい。)
画面右上に、「部屋に参加」というボタンがありますのでそのボタンをクリックすると、部屋名入力のダイアログが表示されます。
部屋名はGUID形式のフォーマット"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"(半角英数字とハイフンのみ)のみ受け付けます。
部屋名生成ボタンをクリックすると部屋名を自動で生成します。
入力した部屋名の部屋がない場合は新規に部屋が作成されます。
![部屋.png](https://qiita-image-store.s3.amazonaws.com/0/17554/4488cbc6-cf96-418d-8140-ba1d4c993ccd.png)

部屋名を入力し参加ボタンをクリックすると、リモートピア(相手)が接続されるのを待機します。
![wait.png](https://qiita-image-store.s3.amazonaws.com/0/17554/25ba7820-fff0-ad95-37f8-7464670648f9.png)




##２・リモートピアから部屋に参加
同様に同名の部屋名を入力し参加すると、メイン画面が有効になります。
![main.png](https://qiita-image-store.s3.amazonaws.com/0/17554/a117ceb6-5414-559b-fa6c-f9fa19e6cd29.png)


##３・ストリームの追加
"ストリームを追加"と書かれているところをクリックします。
![addStream.png](https://qiita-image-store.s3.amazonaws.com/0/17554/9f6459fb-1744-4f65-8d63-50af8a2f870c.png)

"ストリームを追加"をクリックするとキャプチャーデバイスを選択するダイアログが表示されますが、ChromeとFirefoxとで違いがあります。
###Chromeでのキャプチャーデバイス選択ダイアログ
まずは、Chromeから。以下の画像ようなダイアログが表示されますのでデバイスのドロップダウンリストよりデバイスを選択します。
![selectDevice_a.png](https://qiita-image-store.s3.amazonaws.com/0/17554/e85f5577-8ba3-8a8d-d019-4dcac4f90e49.png)

デバイスを選択すると、左上に使用許可を求めるポップアップが表示されますので、許可ボタンをクリックします。
(SSL接続ではないため、デバイスを切り替えるごとにこのポップアップが出ますので、お手数ですがその都度許可ボタンを押してください。)
![permission.png](https://qiita-image-store.s3.amazonaws.com/0/17554/26f54dd9-7c5b-7912-1d20-eeac473c3830.png)

許可するとプレビューにキャプチャーデバイスのプレビューが表示されます。
追加するストリームが決まりましたら下の"このストリームを追加"ボタンをクリックします。
(画像ではデバイス名が表示されていますが、サンプルアプリはSSL接続ではないため"camera-1" "camera-2"…とドロップダウンリストには表示されます。)
![selectDevice.png](https://qiita-image-store.s3.amazonaws.com/0/17554/eafbcadc-3ddd-b5cc-7abe-638d61ff6119.png)

すると、メイン画面にストリームが追加され、リモートピアにもストリームが送信されます。
![p2p.png](https://qiita-image-store.s3.amazonaws.com/0/17554/45b6bee2-b18c-efcf-ee24-9c2ad10b6a2f.png)

###Firefoxでのキャプチャーデバイス選択ダイアログ
Firefoxでは使用許可を求めるポップアップにてデバイスの選択を行い"Share Selected Device"ボタンをクリックします。
![ffpopup.png](https://qiita-image-store.s3.amazonaws.com/0/17554/e0ee5b17-394f-6179-202c-d1202f94bee6.png)

別のデバイスを選択する場合は、"デバイスを選択"ボタンをクリックすると再度ポップアップが表示されます。
![ff_dialog.png](https://qiita-image-store.s3.amazonaws.com/0/17554/81675205-5e63-02f1-6e71-bcaa708fb532.png)


##４・ストリームの削除
各ストリーム表示の右上に×ボタンがあります。このボタンをクリックするとそのストリームが削除され、リモートピアへの配信も停止します。
![removeStream.png](https://qiita-image-store.s3.amazonaws.com/0/17554/eadb5599-754a-a328-46e5-f4b2d36ee6b4.png)

##５・退室
すみません。退室ですが、ページのリロードを持って代替えとします。

#最後に
今回のサンプルアプリのソースは[github](https://github.com/gtk2k/WebRTC-Multi-Stream-Sample-WebApp)にあげました。突っ込みはどんどん受け付けます。
Ruby Hashについてまとめる

Ruby力をつけるための基礎固めとして、Hashについて整理します。※たのしいRubyから
## Hashの作り方
### { キー => 値 }
```rb
h1 = {"a" => "b", "c" => "d"}
```
### { キー: 値 }
```rb
h2 = {a: "b", c: "d"}
```

シンボルと文字列の違いは別の人が解説してくれるはず...

### Hash.new

```rb
# 引数なし
h1 = Hash.new
p h1["hogehoge"] #=> nil

# 引数あ
h2 = Hash.new("")
p h2["hogehoge"] #=> ""
```

## 値を取り出す, 設定する

```rb
h = Hash.new
h["R"] = 'Ruby'
p h #=> "Ruby"
```

```rb
h = Hash.new
h.store("R", "Ruby")
p h.fetch("R") #=> "Ruby"
```

### fetchで取得するときの動きの違い
```rb
# 例外が発生する
h = Hash.new
p h.fetch("N") #=> エラー(IndexError)

# 第２引数を指定すれば、キーがない場合のデフォルト値になる
h = Hash.new
p h.fetch("N", "Nothing Value") #=> "Nothing Value"

# 引数にブロックを渡すと実行結果が得られた値がデフォルト値になる
h = Hash.new
p h.fetch("N") { String.new } #=> ""
```

### まとめて取り出す
```rb
h = { "a" => "b", "c" => "d" }
p h.keys #=> ["a", "c"]
p h.values #=> ["a", "c"]
p h.to_a #=> [["a", "b"], ["c", "d"]]
```

### デフォルト値
#### ブロックを指定する
```rb
h = Hash.new do |hash, key|
  hash[key] = key.upcase
end
h["a"]
p h #=> {"a"=>"A"}
```

## キーや値があるか確認する
### h.key?(key)
### h.has_key?(key)
### h.include?(key)
### h.member?(key)
使い方と動作は同じなので、どれか使えばOK

```rb
h = { "a" => "b", "c" => "d" }
p h.key?["a"] #=> true
```
### h.value?(value)
### h.has_value?(value)
使い方と動作は同じなので、どれか使えばOK

```rb
h = { "a" => "b", "c" => "d" }
p h.value?["b"] #=> true
```

## ハッシュの大きさ
### h.length
### h.size
使い方と動作は同じなので、どれか使えばOK

```rb
h = { "a" => "b", "c" => "d" }
p h.length #=> 2
p h.size #=> 2
```

### h.empty?(value)
```rb
h = { "a" => "b", "c" => "d" }
p h.empty? #=> false
h = Hash.new
p h.empty? #=> true
```

## キーと値を削除する
### h.delete(key)
```rb
h = { "a" => "b", "c" => "d" }
p h["a"] #=> "b"
h.delete("a")
p h["a"] #=> nil

# ブロック使った場合
h.delete("a"){ |key| "no #{key}." } "no a."
```

### h.delete_if {key, val} ...}
### h.regect! {key, val} ...}
条件を与えてそれに該当するものだけを削除

```rb
h = { "a" => "b", "c" => "d" }

# delete_if
h.delete_if{|key, value| key == "L"} #=> {"a"=>"b", "c"=>"d"}
h.delete_if{|key, value| key == "a"} #=> {"c"=>"d"}

# regect! 該当keyがなかったらnil
h.reject!{|key, value| key == "L"} #=> nil
h.reject!{|key, value| key == "a"} #=> {"c"=>"d"}
```

## ハッシュを初期化する
### h.clear
```rb
h = { "a" => "b", "c" => "d" }
h.clear #=> {}
```

```rb
h = { "a" => "b", "c" => "d" }
h2 = h
h.clear
p h2 #=> {}

h = { "a" => "b", "c" => "d" }
h2 = h
h = Hash.new
p h2 #=> { "a" => "b", "c" => "d" }
```

## 参考
- たのしいRuby
  - http://www.amazon.co.jp/dp/4797372273
RTX1100でルーティング設定

業務で使用するヤマハのルータに関して、設定や仕組みを覚えるために
ネットで中古のRTX1100を購入して手始めに簡易構成図に則り設定を入れました。

#使用機器#

PC 2台
RTX1100 2台

#物理構成#


　PC① ←---→ [lan1]RTX1100①[lan3] ←---→ [lan3]RTX1100②[lan1] ←---→ PC②

#論理構成#

PC①　192.168.225.1
RTX1100①　lan1:192.168.225.254 lan3:10.0.0.1
RTX1100②　lan1:192.168.227.254 lan3:10.0.0.2
PC②　192.168.227.1


#ルータ設定#
各ルータへ設定した内容は、*show config*コマンドの実行結果を下記へ記載してます。

###RTX1100①###
Tokyo# show config
login password *
administrator password *
console lines 24
console prompt Tokyo
ip route 192.168.227.0/24 gateway 10.0.0.2
ip lan1 address 192.168.225.254/24
ip lan3 address 10.0.0.1/24
Tokyo#

###RTX1100②###
Okinawa# show config
login password *
administrator password *
console prompt Okinawa
ip route 192.168.225.0/24 gateway 10.0.0.1
ip lan1 address 192.168.227.254/24
ip lan3 address 10.0.0.2/24
Okinawa#


上記の設定より、PC①とPC②の双方向よりPING疎通を取ることができました。
DapperでDateTime2

## 困ったこと
Dapperでは既定で、`System.DateTime`が`DbType.DateTime`にマッピングされています。
その為、場合によってはDbType.DateTimeの範囲外の値（0001-01-01≦x＜1753-1-1）で更新しようとして例外が発生したり、また、精度が落ちてしまうという事が考えられます。

```csharp
conn.Execute("INSERT INTO Table1 (Date1) VALUES (@Date1);", new { Date1 = new DateTime() })
```

例外の発生
> 型 'System.Data.SqlTypes.SqlTypeException' のハンドルされていない例外が System.Data.dll で発生しました

> 追加情報:SqlDateTime のオーバーフローです。1/1/1753 12:00:00 AM から 12/31/9999 11:59:59 PM までの間でなければなりません。

精度落ち

- 2015/08/09 06:09:38.1579152 - 期待した値
- 2015/08/09 06:09:38.1570000 - 実際の値

そこで、`System.DateTime`を`DbType.DateTime2`にマッピングさせます。

## 方法1) DynamicParametersで型のマッピングを行う
一部だけdatetime2を使っているなら、この方法が簡単です。

```csharp
var p = new DynamicParameters();
p.Add("Date1", new DateTime(), DbType.DateTime2);
conn.Execute("INSERT INTO Table1 (Date1) VALUES (@Date1);", p);
```

## 方法2) プログラムの開始時に全体のマッピングを書き換え
全体的にdatetime2を使っている場合、方法1では面倒です。

Program.csのMain()等、プログラムの開始時に一度だけ呼ばれるように以下を記述。

```csharp
Dapper.SqlMapper.AddTypeMap(typeof(System.DateTime), System.Data.DbType.DateTime2);
Dapper.SqlMapper.AddTypeMap(typeof(System.DateTime?), System.Data.DbType.DateTime2);
```
シンボルとは？？


シンボルとは文字列に似たオブジェクトで、Rubyがメソッドなどの名前の識別に使うラベルをオブジェクトにしたものです。
シンボルは先頭に「：」をつけて表現します。

疑問　つまりシンボルとはなんぞや(説明が不十分なのかな？？根本的な理解ができない)

現在の理解では、matzの表現を借りて、名札を付けるでよいのかな？？

配列関係でいつも引っかかる点が,「キーというのは添え字」「シンボル」「ハッシュ」


ここら辺の違いを理解すると幸せになれるな。学習学習　(ミサトさん風に)

##シンボルに関して



可読性と高めるとかメモリを節約するとかそんな感じ。
リモートサーバのファイルを、ローカルのsublime textで編集する



#0. はじまりときっかけ
もともと、リモートのファイルを直接vimで編集するか、sshfsでローカルにマウントしてから編集していたのですが、↓の２つの問題にぶちあたりました。

・ssfhsの接続が切れると、編集中のファイルもパスが迷子状態になる。
・リモート環境だと、GUIフレンドリーなソフトで編集できない。
・ssfhsでいちいちマウントするのはめんどう。

ということで、rsubを導入し、ローカルでもリモートのファイルを快適に編集できる環境を構築してみたいと思います。

#1. sublime textでrsubをインストールする。
1. 「sublimte text」を開く。
2. `shift + cmd (windowsならctrl) + p` で「Command Palett」を開く。
3. 「Package Install:Install Package」を選択する。
4. 「rsub」を選択し、インストールする。

#2. リモートサーバーにrsubをインストールする。

リモートサーバーにログインし、rsubをインストールします。

```bash:bash
$ sudo wget -O /usr/local/bin/rsub https://raw.github.com/aurora/rmate/master/rmate
$ sudo chmod +x /usr/local/bin/rsub
```

#3. ローカルでsshのconfigを設定する。

`myhost.com` は、自分で設定したサーバ名にしてください。今回はポート番号をデフォルトの52698にしていますが、複数人で使用する場合は干渉してしまう可能性があるため別のポート番号に変えてください。

```bash:bash
$ vim .ssh/config
```

```ssh:~/.ssh/config
Host myhost.com
  RemoteForward 52698 localhost:52698
```

設定は以上で終了です。↓で実際にファイルを編集してみます。

#4. リモートサーバにSSH接続し、rsubでファイルを編集してみる。

ssh接続で `myhost.com` に接続します。

```bash:bash
$ ssh myhost.com
```

続いて、rsubでファイルを編集してみます。

```bash:bash
$ rsub ~/PATH/TO/YOURFILE/myfile.txt
```

ここで、ローカルのsublime textが開き、編集した内容がリモートに反映されれば成功です。おつかれさまでした。
  

ていけー

#参考
1. http://jonsimpson.co.uk/log/2011/rmate-ssh-remoteforward
2. http://qiita.com/seanchas_t/items/60b4d5a927297c35a7ba
3. http://web-tsukuru.com/263
戦術的DDD基本原則まとめ


DDDを実践し始めてまだ日が浅いので、ドメインモデリング中に
細かい原則がすぐ出てこなくて迷うことがあります。

そこで、「エリック・エヴァンスのドメイン駆動設計」から
第2部「モデル駆動設計の構成要素」を中心に、モデルを表現する各要素（パターン）の
基本原則をまとめてみます。

第5章「ソフトウェアで表現されたモデル」

- 関連
- ENTITIES（エンティティ）
- VALUE OBJECTS（値オブジェクト）
- SERVICES（サービス）
- MODULES（モジュール）

第6章「ドメインオブジェクトのライフサイクル」

- AGGREGATES（集約）
- FACTORIES（ファクトリ）
- REPOSITORIES（リポジトリ）

## 関連

- 関連をたどる方向を強制する
- 限定子を付けて多重度を減らす
- ドメインにとって本質的でない関連を除去する
- 本質的でない関連が除去された結果、残った関連はそのドメインの特徴を表す

## ENTITIES（エンティティ）

- 属性と振る舞いを本当に必要なものだけにして、小さく保つ
- 不変な値オブジェクトの識別子で別のオブジェクトと比較する

## VALUE OBJECTS（値オブジェクト）

- エンティティの属性として使用される
- 他の値オブジェクトの属性として使用される
- エンティティを参照することができる
- 値を共有しないことを前提に、可変な実装にしてもよい場合がある（ほとんどないはず）

## SERVICES（サービス）

- エンティティや値オブジェクトの自然な責務とならないものを担当する
- 操作がドメインの概念に関係している
- 他のドメインモデルの観点からインタフェースが定義されている
- 自身の振る舞いに影響を与える状態は存在しない
- 操作名が必ずユビキタス言語の一部になる
- インフラストラクチャサービスと区別する
- アプリケーションサービスと区別する（見分けにくい場合があるので注意）
- 中粒度の機能を提供する（細かすぎるとアプリケーション層にドメインの知識が漏れる）

## MODULES（モジュール）

- 大まかなドメインの概念に基づいて分類する
- 同じグループの概念を集めてモジュール内を高凝集にする
- 関係性が薄い他のモジュールとは低結合になる
- 設計が大きく複雑になるにつれて重要になってくる
- 「境界づけられたコンテキスト」とは違うので注意

## AGGREGATES（集約）

- 集約のメンバはエンティティと値オブジェクトのみ
- 集約内のオブジェクトが1つだけの場合もある
- 集約のルートは、その集約に含まれる特定の1エンティティ
- 集約のルートは、内部のエンティティへの参照を他のオブジェクトへ渡すことはできる（保持はさせない）
- 集約内のオブジェクト同士は参照を保持し合ってもよい
- 集約内のルート以外のエンティティは、集約内でのみ識別するためのローカルな同一性を持つ
- 集約内のオブジェクトは、他の集約ルートへの参照を保持できる
- 削除する時は集約内のオブジェクトを全て削除しなければならない
- 1つの集約内で適用される不変条件は、各トランザクションの完了によって強制される

## FACTORIES（ファクトリ）

- 複雑なオブジェクトと集約を生成する
- 集約を生成する時は不変条件を強制する
- エンティティの生成では不変条件を全て満たすが、必須ではない要素が後で追加される可能性はある
- 集約のルートにその集約内のオブジェクトのファクトリメソッドを置く
- 集約の外にあるオブジェクトが、別の集約のエンティティをファクトリメソッドで生成してもよい
- 既存のオブジェクトが生成の自然な責務を負えない場合は、独立した専用ファクトリを作成する
- 専用のファクトリは、オブジェクトかドメインサービスとして実装する
- 専用のファクトリに不変条件のロジックを入れてもよい
- ファクトリメソッドには不変条件のロジックを入れない方がよい（生成したオブジェクトに委譲する）

### 再構成ファクトリ
- DBのデータなどからオブジェクトを再構成するのもファクトリの仕事
- 新しい追跡IDを割り当ててはいけない
- 不変条件の違反になんらかの対応が必要

## REPOSITORIES（リポジトリ）

- 生成と関連をたどる以外の方法でオブジェクトを取得する手段
- 集約内のオブジェクトはリポジトリから取得してはいけない（ルートから関連をたどる）
- グローバルなIDで検索できるようにする
- 集約に含まれる値オブジェクトの属性で検索もできる
- 検索したオブジェクトの数値属性の集計演算もできる
- トランザクションはクライアントが制御する
- オブジェクトの再構成はファクトリに委譲する
- 外部のプロセスからデータベースへ直接アクセスさせない（不変条件に違反する可能性があるため）
- 双方向の関連のうち一つをリポジトリによる検索に置き換えられる場合がある
楽しいrubyとやってみよう 第2章配列


- Rubyでアドレス帳を作る場合、アドレス帳に必要な項目は下記になります。
郵便番号は7桁の数字で、それ以外は文字列で表現できそうです。
これらの項目をひとまとめにすることで1分の情報を表現できます。
さらに交友関係の人たちの情報が集まってアドレス帳全体のデータができます。
-名前
-ふりがな
-郵便番号
-都道府県
-住所
-電話番号
-メールアドレス
-SNSのURL
-登録

- このようにデータとデータを合わせた1つのデータを表すにはこれまでの「文字列」「数値」といった単純なオブジェクト以外にデータの集まりを表現する「データ構造」が必要です。
この章では「配列」「ハッシュ」というデータ構造を紹介します。
また「正規表現」という文字列処理に使われるオブジェクトも紹介します。

- この配列やハッシュのようにオブジェクトを格納するオブジェクトをコンテナと言います。


##配列　Arrayクラス
配列とは「いくつかのオブジェクトを順序つきで格納したオブジェクト」としてもっとも基本的でよく使われるコンテナです。
「配列オブジェクト」「Arrayオブジェクト」などと呼ばれます。


- まずは文字列の配列を作ってみましょう
この例ではnamesという配列オブジェクトが生成されました。各要素として「小林」「林」「高野」「盛岡」という4つの文字列を格納しています。

```

names = ["小林", "林", "高野", "盛岡"]
```


- 配列からオブジェクトを取り出す
配列に格納したオブジェクトには位置を表す番号である「インデックス」がつきます
このインデックスを使ってオブジェクトを格納したり、取り出したりできます。

取り出し方

```
   配列名[インデックス]

```

例文
配列namesを生成

```
names = ["小林", "林", "高野", "盛岡"]
```

配列namesの最初の要素である「小林」という文字列を取り出すには

```
names[0]

```

```

print "最初の名前は", names[0], "です。\n"
```


-配列にオブジェクトを格納する

すでにある配列に対して、新しいオブジェクトを格納することができます。
配列の要素の一つを別のオブジェクトと置き換えるには、

```

配列名[インデックス] = 格納したいオブジェクト

```

という構文で行います。
また、オブジェクトの格納先としてオブジェクトのまだ存在しない位置を指定すると配列の大きさが変わります。Rubyの配列は必要に応じて自動的に大きくなります。

```
names[0] = "野尻"

```

-配列の中身

配列の中には、どんなオブジェクトも要素として格納できます。数値の配列も作れます。

```

num = [3, 3, 3, ]


```

一つの配列の中に、複数のオブジェクトを混ぜることもできます。

```
mixed = [1, "歌", 1, "風", 3]

```

-配列の大きさ

配列の大きさを得るためには、sizeメソッドを使います。
例えば配列arratyに次のように使います。

```
  array.size
```

例

```
2.2.1 :001 > names = ["小林", "林", "高野", "盛岡"]
 => ["小林", "林", "高野", "盛岡"] 
2.2.1 :002 > names.size
 => 4 
2.2.1 :003 > 

```


-配列と繰り返し

「配列の要素を全て表示したい、配列の要素のうち、ある条件に当てはまる要素についてxxメソッドを、当てはまらない場合はyyメソッドを適用したい」

Rubyではこのためのメソッドとしてeachメソッドが用意されています。

使いかた

```
配列.each do |変数|
繰り返したい処理
end

```

eachのすぐ後ろの「do ~ end」で囲まれている部分を「ブロック」と言います。
そのためeachのようなメソッドは「ブロックつきメソッド」とも呼ばれます。
そしてブロックにはいくつかの処理をまとめて記述することができます。

eachメソッドは、配列から要素を一つづつ取り出して、"|変数|で指定された変数に対して代入して"ブロックの中のメソッドを繰り返し実行していきます。


-　実際に使ってみよう

```

2.2.1 :001 > names = ["小林", "林", "高野", "盛岡"]
 => ["小林", "林", "高野", "盛岡"] 
2.2.1 :002 > names.each do |n|
2.2.1 :003 >     puts n
2.2.1 :004?>   end
小林
林
高野
盛岡  #putsメソッドの実行結果
 => ["小林", "林", "高野", "盛岡"]  #eachメソッドの戻り値
2.2.1 :005 > 


```


##ハッシュ Hashを使ってみよう
ハッシュもよく使われるコンテナです。ハッシュでは文字列やシンボルなどをキーにしてオブジェクトを格納します。


-シンボルとは？？

シンボルとは文字列に似たオブジェクトで、Rubyがメソッドなどの名前の識別に使うラベルをオブジェクトにしたものです。
シンボルは先頭に「：」をつけて表現します。


疑問　つまりシンボルとはなんぞや(説明が不十分なのかな？？根本的な理解ができない)
unity > 粒子を倍々にしていく (成功編)

http://qiita.com/7of9/items/a6e7cc154fe8901942b1
の修正版

```txt:動作確認
Unity 5.1.1-f on MacOS X 10.8.5
```

倍々ゲームをしたい。
最初１つの粒子がある。そこに１つ足す。
次は２つ足す。
次は４つ足す。
。。。

#準備
1. Main Cameraに以下を足す
2. Main CameraのMy Prefabに追加したいオブジェクトを関連づける。

今回はCubeをMy Prefabに関連付けた。

#code

```csharp:CameraScript.cs
using UnityEngine;
using System.Collections;
using UnityEditor;

public class CameraScript : MonoBehaviour {

	public GameObject myPrefab; // relate to the monomer
	private GameObject myParent;
	
	void AddMonomer() {
		Vector3 pos;
		pos.x = Random.Range (-3.0f, 3.0f);
		pos.y = Random.Range (-3.0f, 3.0f);
		pos.z = Random.Range (-3.0f, 3.0f);

		GameObject GOmonomer = Instantiate(myPrefab, pos, Quaternion.identity) as GameObject;
		GOmonomer.name = "monomer1";
		GOmonomer.transform.parent = myParent.transform;
	}

	void Start () {
		myParent = new GameObject ();
		myParent.name = "Parent";

		// 2 monomers at the beginning
		AddMonomer ();
		AddMonomer ();
	}

	void OnGUI() {
		if (GUI.Button (new Rect (10, 10, 100, 30), "Generate")) {
			int numChild = myParent.transform.childCount;
			print (numChild.ToString());

			for(int loop=0; loop < numChild; loop++) {
				AddMonomer();
			}

			// ERROR: unlimited loop
//			foreach(Transform child in myParent.transform) {
//				AddMonomer(new Vector3(0, 0, 0));
//			}

		}
	}
}
```

ちなみにforeach()でやると粒子をたしながらループ上限が増えるためか無限ループになるのでやめておいた方がいい。


#結果

16個の粒子を生成した所。

![Scene_unity_-_150809_replacePrefab_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/b2f158eb-c6c4-3f22-92a9-48acbf210533.jpeg)

256個の粒子を生成した所。
[ボーグ・キューブ](http://en.memory-alpha.wikia.com/wiki/Borg_cube)みたいになってきた。

![Scene_unity_-_150809_replacePrefab_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/3eeb667c-d03f-b324-12b7-916bfd420249.jpeg)

これでcluster-cluster aggregate生成をできると思ったが、粒子数が増えるにつれ、やはり処理が重くなっていく。

1.3GHz Core i5のMacbook Airにて2048の粒子の表示が重い。
英語力0から洋書を読むだけで英語を学んでいくリスト


本当に読みたい洋書だけを読んで英語力を向上させていく取り組みです。
はるか昔にやったTOEICは400点くらいだった記憶があります。

## (読書中: 10%) REWORK
[REWORK](https://books.wikihub.io/wiki/REWORK)

日本語訳もあるけど、37signalsっぽい雰囲気を生で感じてみたかったので原著で。
(購入) 2016-05-01

## (読書中: 80%) iOS 9 SDK Development
[The Pragmatic Bookshelf | iOS 9 SDK Development](https://pragprog.com/book/adios3/ios-9-sdk-development)

ずっとiOS5辺りの古い知識のままiOSアプリを作っているのでそろそろ刷新しようと思い購入。
(購入) 2016-01-03

## Mastering Emacs
[The Mastering Emacs Ebook](https://www.masteringemacs.org/order)

セール中で20$だったので買った。ブログも良い情報が多い。
(購入) 2015-11-28

## The Rust Programming Language
[Download 'The Rust Programming Language' E-Books (PDF, EPUB, MOBI)](https://killercup.github.io/trpl-ebook/) **無料**

[公式マニュアル](http://doc.rust-lang.org/nightly/book/)をebook化したもの。epub版を[calibre](http://ongaeshi.hatenablog.com/entry/2013/03/12/151447)でmobiに変換して読んでます。

読了、メモリとポインタ周りの話が面白かったです。GCを入れてシンプルに解決するGoと違い、たくさんの仕組みを導入して泥臭く(そして実行時オーバーヘッドを最小にして)解決しようとする姿勢が良いです。

## ソフトスキル - ソフトウェア開発者のライフマニュアル
[Soft Skills](https://www.manning.com/books/soft-skills) **$27.99**

- [Higepon’s blog](http://d.hatena.ne.jp/higepon/20150921/1442843666)を見て面白そうだったので購入

## Elixirでプログラミング
[Programming Elixir](https://pragprog.com/book/elixir/programming-elixir) **$24.00**

- 並列プログラミングに特化したプログラミングの概念がざっくりと分かった
- async-await (C#)やActor (Scala) いったものがElixir(というかErlangVMの)の強力な並列性の上にライブラリとして作られている所。
  - async-awaitやActor,Taskはあくまで「よく使うライブラリ」
  - その原子にあるのは「軽量で安全なメッセセージパッシングでやりとりするErlangプロセス」ということがなんとなく分かった気がする。
- Elixirは見た目がRubyに似ているので読みやすくて助かった。
- attr_reader がないとか、Rubyいいけどここはこっちの方がよくない？みたいな「オレオレRuby」感があるのも結構好き。(私はattr_reader好きだけど)
  - module A.B.Math … end みたいにモジュール名を名前空間付きで一行で定義できるのはいいなと思った。

## 健康なプログラマー
[The Healthy Programmer](https://pragprog.com/book/jkthp/the-healthy-programmer)

- サンプルコードのない本を読めるかチャレンジ
- 結構大変だったがなんとか読めた(時間はいままで一番かかった)
- 日本語書籍の薄さを見て(こんなに英語だと時間がかかるものかと)愕然とした

## Rubyでテキスト処理
[Text Processing with Ruby](https://pragprog.com/book/rmtpruby/text-processing-with-ruby)

- 自分のそこそこ詳しいことなら英語でも読みやすいんじゃないか作戦
- うまくいった、半分くらいはもう知っていることだったので半分を予測しながら読める
- Gitのプログレスバーみたいなやつを再現するにはstderrを使えばよい、ということが分かったのが最大の収穫

## Rubyでゲームプログラミングを学ぶ
[Learn Game Programming with Ruby](https://pragprog.com/book/msgpkids/learn-game-programming-with-ruby)

- Rubyでゲームプログラミングを学ぶ本
- ゲームだと画像も多めで読みやすいじゃないかという予測→当たった！
- もしかしたら子供も読むことを想定して語彙も簡単にしてくれているのかもしれない

## 使用中の英文法
[English Grammar in Use](http://www.amazon.co.jp/English-Grammar-Use-Answers-CD-ROM/dp/052118939X)

- まずは最低限の英文法を覚える
- 英文法を覚えるために英語で書かれた英文法の本を読むのおすすめ
- [感想1](http://ongaeshi.hatenablog.com/entry/homework-of-winter-break), [感想2](http://ongaeshi.hatenablog.com/entry/english-grammer-in-use-1) 全部は終わらなかった、全体の2/3くらいで飽きたので実践形式で読みたい本を読んでいくことにした

## 更新履歴
- 2015-09-26 新しいものを一番上に置くようにしました
- 2015-09-26 ソフトスキル -ソフトウェアでデベロッパーのライフマニュアル- 追加
- 2015-09-26 Programming Elixir読了
GIT で過去バージョンをリモートリポジトリに複製する


#0. 目的と背景

目的：ローカルリポジトリの環境を、過去のバージョンに戻す。
背景：不具合を特定するために、環境まるごと過去の状況に戻したかったため。

#1. リモートリポジトリから、ローカルリポジトリに clone する。
```bash:bash
$ git clone http://your.web.com/path/to/yourdir.git
```

#2. GitLabから取得したリポジトリのSHAを取得する。
あらかじめGitLabからSHAを取得してください。このSHAをcheckoutすることで、過去のバージョンに戻ることができます。

```bash:bash
$git checkout [SHA]
```
例：

```bash:bash
$git checkout 8f49a7cd73069b4rhh9fa4b7247309bec7d7458e
```

※ブランチを指定する場合：

```bash:bash
$git checkout 8f49a7cd73069b4rhh9fa4b7247309bec7d7458e -b branch
```

※特定のファイルだけ元に戻したい場合：

```bash:bash
$git checkout 8f49a7cd73069b4rhh9fa4b7247309bec7d7458e /path/to/yourfile
```


#3. 参考：
http://konbu13.hatenablog.com/entry/2014/12/01/070255


ご指摘・コメント等いただけましたら幸いです。

れりごー
jQueryで動的にSTYLEタグを追加

jQueryを使えば動的に要素にCSSスタイルを適用することは簡単にできますが、要素には予めクラスを指定しておいて、後からスタイルを突っ込めたら便利です。
試してみると、jQueryを使えば以下のような感じでやればいけるみたいです。

```lang:addstyle.js
$(function(){
  var style = '';
  style += '<style type="text/css" id="StyleId">';
  style += '.item1 { color:red; }';
  style += '.item2 { color:blue; }';
  style += '.item3 { color:green; }';
  style += '.item4 { color:yellow; }';
  style += '.item5 { color:purple; }';
  style += '</style>';
  $('head').append(style);
});
```

ちなみに、#text() でSTYLEタグの中身の要素を入れようとしてもうまくいかなかったので、上記のようにDOM文字列を直接突っ込んだらうまくいきました。STYLEタグを作成するときにidなどをつけておけば、

```
$('#remove-button').on('click', function(){
  $('#StyleId').remove();
});
```

のようにして後から動的にそのスタイルを除去するのも簡単ですね。
[解決済み] unity > bug? > InstantiateしたGameObjectのtagを変更できない > Transformで宣言していた

```txt:動作確認
Unity 5.1.1-f on MacOS X 10.8.5
```

InstantiateしたGameObjectのtagを変更しても変更されない。

```csharp
player = Instantiate(myprefab, pos1, Quaternion.identity) as GameObject;
player.tag = "Player";
```

上記で生成されるXXX(Clone)のTagを見ると"Untagged"のままだ。

いくつか調べたが、似たような現象の例を見る。Unityのバグなのだろうか?
http://answers.unity3d.com/questions/421278/how-to-tag-an-object-when-i-instantiate-it.html

<hr>
解決した。

```
public GameObject myprefab;
```
とするところ

```
public Transform myprefab;
```
としていた。GameObjectにしたらtag変更できるようになった。
Arduino+1602LCD+DS18B20で温度計を作ってみた

16桁x2行表示のLCDモジュールと温度センサーDS18B20を使って温度計を作ってみました。

# 動作例

![DSC01508.JPG](https://qiita-image-store.s3.amazonaws.com/0/46856/8e2118cd-5ae3-057b-0069-1475e4863bb1.jpeg)

# 準備

ブレッドボードのサイズはギリギリなので、Arduino Nanoなどで試す場合はもっと大きいものを使う必要があります。

* ブレッドボード（400穴）
* Arduino Pro Mini（5V）
* DS18B20
* 16x2 LCDモジュール（HD44780互換）
* 抵抗 2kΩ, 5.1kΩ, 510Ω
* ジャンパ線

# 配線

Arduinoの4から9番ピンをLCDモジュールに接続しています。また、10番ピンをDS18B20に接続しています。

LCDモジュールのコントラスト調整用の可変抵抗が手持ちで無かったので、固定値でそれっぽいものを選びました。また、バックライトの電流制限抵抗も、見た感じ良さそうかなで決めています。

![配線図](https://qiita-image-store.s3.amazonaws.com/0/46856/f194b018-cac8-983d-8d92-09f9ea0f5985.png)

# ソースコード

ライブラリを利用するだけなので、ソースコードは非常に短くなりました。LiquidCrystalライブラリはArduino同梱です。残りの2つのライブラリは下記からインストールが必要です。

- [PaulStoffregen/OneWire](https://github.com/PaulStoffregen/OneWire)
- [milesburton/Arduino-Temperature-Control-Library](https://github.com/milesburton/Arduino-Temperature-Control-Library)

```cpp
#include <LiquidCrystal.h>
#include <OneWire.h>
#include <DallasTemperature.h>

// Connections:

// rs (LCD pin 4) to Arduino pin 8
// enable (LCD pin 6) to Arduino pin 9
// LCD pins d4, d5, d6, d7 to Arduino pins 4, 5, 6, 7

// DS18B20 Wire to Arduino pin 10
#define ONE_WIRE_BUS 10

#define TEMPERATURE_PRECISION 12

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

void setup()
{
  lcd.begin(16,2);
  lcd.clear();

  sensors.begin();
  sensors.setResolution(TEMPERATURE_PRECISION);
}

void loop()
{
  sensors.requestTemperatures(); // Send the command to get temperatures

  lcd.setCursor(0,0);
  lcd.print(sensors.getTempCByIndex(0));
  lcd.print("\xDF""C    ");
  delay(1000);
}
```

今回利用した1602LCDモジュールは日本語カタカナフォントが搭載されていたため、「度」を表すのに半濁点(0xDF)を利用しました。別の文字が出てしまうLCDモジュールでは`LiquidCrystal::createChar()`でフォントを自作する必要があるでしょう。
Ajaxで読み込んだデータがブラウザバックで消えないようにする

例えば今Qiitaでブラウザバックすると「もっと見る」で出していた部分が一覧画面から消えてしまうと思います。
そういった問題の簡単な対策を紹介します。

## 概要
受信したデータを隠しフォーム要素にJSON形式で入れておくことで、ブラウザのフォーム入力値の復元機能を借りてデータを復元します。

## 実装イメージ
#### 1. 適当な隠しフォーム要素を用意する

```html
<form style="display:none">
<textarea id="tmpStorage"></textarea>
</form>
```
TEXTAREA要素でなくても良いのですが、デバッグついでに表示したりするのでTEXTAREAを使っています。
#### 2. ページ表示時、隠しフォーム要素のJSONを受信データとして扱い、画面を構築
#### 3. Ajaxでデータ取得
#### 4. JSONシリアライズして隠しフォーム要素に保存
#### 5. 画面へ反映

既存コードに上記「1」「2」「4」の数行足すだけで実現できますので、費用対効果は良いんじゃないでしょうか。


## 動作サンプル

http://frnt.github.io/code-examples/ajax-browserback/
build.gradleでbuild-toolsのバージョンを自動で最新に指定する

こんにちは。
今回は、build.gradleでbuild-toolsを指定する際に、自動で自分のインストールしている最新のものを設定してくれるスクリプトを紹介します。

# どうして作ったか
たくさんの人とプロジェクトを共有する必要性が生まれ、しかも相手はプログラミング初心者。
そんな時に、毎回build-toolsのバージョンアップでプロジェクトのbuild-toolsのバージョンが低くなってしまい、無駄に設定しなおしたりインストールしたりを繰り返していたので、なんとか出来ないかと思って作りました。

# プログラムの説明

gistでも共有しています。
https://gist.github.com/litmon/08ff67f553cb47b0eff0

どういう風にbuild-toolsを自動指定してるか軽く説明していきます。

## SDKのPATHを取得する
build.gradleの中からANDROID_SDK_ROOTを取得する方法は色々ありますが、たぶんこれが最良だと思ったので紹介します。
local.properties内にsdk.dirという値が設定されているので(Android Studioが自動で設定してくれる)この値を取得します。

```
def getSdkDir() {
    Properties properties = new Properties()
    properties.load(project.rootProject.file('local.properties').newDataInputStream())
    def sdkDir = properties.getProperty('sdk.dir', null)

    return sdkDir
}
```

うーん、簡単ですね。
この他にも、commandを使って`which android`からSDKのPATHを取得する方法もありましたが、上手くいかなかったので断念しました。

## build-toolsの一覧を取得する
sdkの内部を見てみれば分かりますが、フォルダ構造はこんな感じになってます。

```
sdk
├── SDK\ Readme.txt
├── add-ons
├── build-tools
│   ├── 19.1.0
│   ├── 21.1.1
│   ├── 21.1.2
│   └── 22.0.1
├── docs
├── extras
├── platform-tools
├── platforms
├── samples
├── sources
├── temp
└── tools
```

build-toolsの中にいくつかdirectoryがあって、それがそのままバージョン番号になってます。
これをそのまま取得しましょう。

```
def buildToolsList(){
    new File(getSdkDir(), 'build-tools').list().sort { a, b -> b <=> a }
}

def latestBuildTools(){
    buildToolsList()[0]
}
```

最新のbuild-toolsを取得するために、ディレクトリのリストを取得した後降順にソートしてます。
ソート後の先頭要素を取得することで、最新のbuild-toolsを取得することが出来るというわけです。

# 使い方

上のスクリプトをそのままbuild.gradle(app)に書いて、build-toolsのバージョン指定しているところを少し書き換えます。

```
apply plugin: 'com.android.application'

def getSdkDir() {
    Properties properties = new Properties()
    properties.load(project.rootProject.file('local.properties').newDataInputStream())
    def sdkDir = properties.getProperty('sdk.dir', null)

    return sdkDir
}

def buildToolsList(){
    new File(getSdkDir(), 'build-tools').list().sort { a, b -> b <=> a }
}

def latestBuildTools(){
    buildToolsList()[0]
}

android {
    compileSdkVersion 22

    // 上で作ったものを適用
    buildToolsVersion latestBuildTools()

    defaultConfig {
        applicationId "com.litmon.build-tools-automation"
        minSdkVersion 15
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.2.0'
}
```

あとはそのままbuildすればOKです。

# 最後に
groovyを触って間もないので、まだまだやってみたの領域を超えない部分がたくさんあります。(エラー処理とか適当ですし)
現時点でMacでの検証は行いましたが、Windowsでも動作するかはまだ調査してみないと分からないです。

もっとこうしたら？とか、こっちの方がいいよ！とかあったらなんでも言ってください！

# 参考

こちらの方法でSDK PATHの取得を行いました。
http://stackoverflow.com/questions/28222158/gradle-task-unable-to-find-local-properties-file

これはやってみたけど上手くいかなかったもの。commandを使ってSDKのPATHを取得しています。ここのリストをソートするところとか参考にしました。
http://www.egeek.me/2013/12/07/gradle-auto-detect-android-sdk-and-build-tools-versions/
Vagrant Box作成の手引


目的
====
- Debian Jessie 8.1のVagrant Boxの作成

方法
====
- [Box Cutters](https://github.com/box-cutter)を使用して作成

```sh:shell
$ brew install packer
$ git clone https://github.com/boxcutter/debian
$ cd debian
$ make virtualbox/debian81
```

参考
====
- [Packer 用のテンプレート集 Box-Cutter を使ってみるAdd Star](http://d.hatena.ne.jp/akishin999/20140702/1404302238)
GoogleAnalytics＋GoogleTagManagerでJSエラーを収集する

前回の投稿で、「<a href="http://qiita.com/OnederAppli/items/0c35dc6c72da7bcada7a">SPAの各ページビューをGoogleアナリティクス＋Googleタグマネージャーで簡単トラッキング！</a>」というものを書きました。
今回は、ユーザーのブラウザで発生したJSエラーを収集する方法です。
すでに、サイトにGoogleタグマネージャーのコードが埋め込まれていることを前提にします。
（そこまでの流れは<a href="http://qiita.com/OnederAppli/items/0c35dc6c72da7bcada7a">前回記事</a>を参考にしていただければと。。。）

タグマネージャーのコードが埋め込まれていれば、あとはGoogleタグマネージャーの管理画面の設定だけでJSエラーを収集することができます！

# 1. 変数の設定
Googleタグマネージャーの管理画面に行き、変数のエラーにある「Error Message」「Error URL」「Error Line」「Debug Mode」にチェックを入れて有効にします。
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/88968/e034353a-31d8-c03d-da4d-185e94c3d76b.jpeg)

次に、UA（ユーザーエージェント）とエラー発生時のURLを取得できるように、新規で変数を2個作ります。
↓UA取得用に作った変数の設定（グローバル変数名：window.navigator.userAgent）
![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/88968/c5aecc38-d018-60bf-fee0-0d0cd86c10d7.jpeg)
↓URL取得用に作った変数の設定（グローバル変数名：location.href）
![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/88968/3e21fa68-77fb-3780-a3ce-91a1b554dd53.jpeg)

# 2. トリガーの設定
次にトリガーの設定をします。新規トリガーを下記設定のように作ります。
![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/88968/fa93f2b3-77e3-61cb-05d6-f66da006d0bc.jpeg)

# 3. タグの設定
最後にタグの設定です。自分は下記画面のように設定しました。
ラベルにエラーの情報を出力する形です。
**[MESSAGE]{{Error Message}} [FILE]{{Error URL}} [LINE]{{Error Line}} [URL]{{url}} [UA]{{userAgent}}**
![5のコピー.jpg](https://qiita-image-store.s3.amazonaws.com/0/88968/2395e355-8fdb-15a1-6f7d-91196ca5c148.jpeg)


ここまで設定が完了したら忘れずに公開ボタンを押して、設定を有効にします。

# 4. Googoleアナリティクス管理画面での確認
すぐに確認したい場合は、サイドメニューのリアルタイム＞イベントから確認することができます。
画面を開いたら、対象のサイトでjsエラーを出してください。すると、jsエラーの情報が管理画面に表示されるはずです。
![7.jpg](https://qiita-image-store.s3.amazonaws.com/0/88968/f0a7ff0a-5789-e800-49cb-e532b983b2cf.jpeg)

例えば、下記のような感じでラベルの項目にエラーが表示されます。
>[MESSAGE]Uncaught TypeError: hoge is not a function [FILE]http://hoge.jp/hoge.js?bust=1439102987730 [LINE]1 [URL]http://hoge.jp/#quest [UA]Mozilla/5.0 (iPhone; CPU iPhone OS 7_0 like Mac OS X; en-us) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53


===============================
OnederAppliよろしくお願い致します！
＞<a href="http://onederappli.jp">ホームページ</a>
＞<a href="https://itunes.apple.com/jp/artist/koike-jun/id999607803">iPhoneアプリ</a>
＞<a href="https://play.google.com/store/apps/developer?id=OnederAppli">Androidアプリ</a>
nginx-proxyによるマルチドメイン環境

# nginx-proxyによるマルチドメイン環境
[nginx-proxy](https://github.com/jwilder/nginx-proxy)というdocker imageを使うことで，複数のコンテナによるWebサーバーを構築してみます．これによって，サーバコンテナが複数ある場合に，ドメイン名によってアクセスを振り分けることが出来ます．
![nginx-proxy_image.png](https://qiita-image-store.s3.amazonaws.com/0/65837/5bcd6bb5-594a-1dfb-822c-253bce4f322c.png)
このnginx-proxyのすばらしいところは，サーバコンテナの稼働状態に応じて自動で設定が変更されるところです．例えば，サーバコンテナ2が停止した場合，その時点で自動的にnginx-proxyの設定が変更されます．逆にサーバコンテナを追加したくなった場合には，引数を付けて起動するだけで追加出来ます．非常に便利ですね．
# 構築手順
CentOS7/docker環境が導入されていることを前提とします．
## nginx-proxyコンテナの起動
以下のコマンドでimageのダウンロードと起動ができます．
```
docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock jwilder/nginx-proxy
```
もし，SELinuxが有効な環境であれば，–security-opt=label:type:docker_tをつけることによって，SELinux環境でも動作させることができます．
## サーバコンテナの起動
サーバコンテナの環境変数VIRTUAL_HOSTを設定すればnginx-proxy経由で外部に公開することができます．カンマ区切りで複数の指定も可能です．このオプションだけでnginx-proxyが自動的に設定されるので楽です．
```
-e VIRTUAL_HOST=hoge.com,www.hoge.com
```
コマンド例は以下のようになります．各サーバコンテナや環境に合わせて設定してください．なお，-p 80:80のようなオプションは不要です．
```
docker run -e VIRTUAL_HOST=hoge.com -it -d server_image
```
# まとめ
nginxによるproxy環境を構築することができました．簡単に環境構築ができる素晴らしい時代ですね．
【統計学】一般化線形混合モデル(GLMM)を理解するための可視化。


**「データ解析のための統計モデリング入門」**(通称:みどりぼん)のp157 にある、「分布を混ぜる」の考え方について、分布で考えるのではなく乱数ベースでシミュレーションを行いアニメーションで可視化をしてみましたので紹介したいと思います。

結果のアニメーションはこちらです。本文でこの内容を説明していきます。
![mix_poisson_norm.gif](https://qiita-image-store.s3.amazonaws.com/0/50670/393249fa-9bf6-5d54-ce71-2c4050d0918f.gif)
(コードは[こちら](https://gist.github.com/matsuken92/dee584f1a7d3df809683))

詳細な説明はこの「みどりぼん」に全てわかりやすく書いてあるので、ここでは可視化するにあたっての解説のみを行います。なんだか面白そうな話だと思いましたら是非ご購入ください！

# 前置き
ある植物において種子が最大８個作られるのですが、その種子の生存個数が二項分布、

```math
p(y_i) ={8 \choose y_i}\ q_i^{y_i} (1-q_i)^{8-y_i} \quad \mbox{for}\ q_i=0,1,2,\dots,8
```

に従っているとします。$y_i$は個体$i$の生存種子数(観測値)、$q_i$は個体$i$における種子１つあたりの生存確率とします。

また、この$q_i$が個体によって異なる個体差を持ち、ロジスティック関数で表されるとします。

```math
q_i = {\rm logistic} (r_i)= {1 \over 1 + \exp( -r_i) }
```

また、このロジスティック関数の引数$r_i$は、平均0, 標準偏差$s$の正規分布に従うと仮定します。

```math
r_i \sim N(0, s)
```
つまり、$r_i$の密度関数は

```math
p(r_i | s) = {1 \over \sqrt{2\pi s^2} } \exp \left( -{r_i^2 \over 2s^2} \right)

```

となり、これを個体$i$の個体差とみなします。


# 可視化してみる。

さて、まず個体差 $r_i\sim N(0, s)$を図示します。標準偏差 $s=4$の時の正規分布に従う乱数を10000個生成しました。そのヒストグラムが下記の水色の棒です。この一つ一つが赤い線で表されるロジスティック関数

```math
q_i = {\rm logistic} (r_i)= {1 \over 1 + \exp( -r_i) }
```
で0から1の値、つまり確率と見なせる値、つまり$q_i$に変換されます。

![norm_logistic-compressor.png](https://qiita-image-store.s3.amazonaws.com/0/50670/5f7535c3-e0e5-fc3d-2276-af21c4c4dec3.png)

この正規乱数一つ一つが確率$q_i$に変換できたので、それを$q_i$のヒストグラムとして表現したものが下記になります。割と幅広の正規分布であり、それをロジスティック関数で変換した影響で、0と1に寄っていることがわかります。
![hist_of_q-compressor.png](https://qiita-image-store.s3.amazonaws.com/0/50670/0789b717-a25a-ddef-8087-3a920c61a86f.png)

で、この10000個の$q_i$一つ一つに対して、二項分布を対応させます。
二項分布は、

```math
p(y_i) ={8 \choose y_i}\ q_i^{y_i} (1-q_i)^{8-y_i} \quad \mbox{for}\ q_i=0,1,2,\dots,8
```
なので、$q_i$ごとに形状が異なります $q_i$が`[0.0, 0.125, 0.25, 0.375, 0.5, 0.625, 0.75, 0.875, 1.0]`の9つの値の例を下記に記します。

![various_binomial-compressor.png](https://qiita-image-store.s3.amazonaws.com/0/50670/e09f130f-6de6-c7db-1ad2-b7f10733575f.png)

10000個の$q_i$の値に応じて上記のように多数の二項分布を生成しそれを足し合わせます。
足し合わせた結果がこちらです。

![sum_of_binom-compressor.png](https://qiita-image-store.s3.amazonaws.com/0/50670/e7871a21-5692-47cc-3c4f-89b3a70c3028.png)

# アニメーションしてみる

前項では $s=4$の例をグラフにしてみましたが、$s$が0から3まで連続的に動いた時の様子をアニメーションにしたのが冒頭にも掲載しました下記のグラフになります。
この例では、$s=2$前後から分布が左右に寄ってしまうようです。

![mix_poisson_norm.gif](https://qiita-image-store.s3.amazonaws.com/0/50670/393249fa-9bf6-5d54-ce71-2c4050d0918f.gif)
#参考書籍
　データ解析のための統計モデリング入門
　　　http://hosho.ees.hokudai.ac.jp/%7Ekubo/ce/IwanamiBook.html
基本の復習: 優先順位は LANGUAGE, LC_ALL, LC_xxx, LANG の順

基本中の基本だったけど、さっき忘れていて LC_ALL が LANGUAGE より優先されると思ってしまってた。まずい。


# 各種 locale の仕様

- [IEEE Std 1003.1-2017 locale](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/locale.html)
- [Linux locale(1)](https://linux.die.net/man/1/locale)
- [Linux locale(5)](https://linux.die.net/man/5/locale)
- [Linux locale(7)](https://linux.die.net/man/7/locale)
- [FreeBSD locale(1)](https://www.freebsd.org/cgi/man.cgi?locale)
- [OpenBSD locale(1)](https://man.openbsd.org/locale.1)
- [Apple locale(1)](https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man1/locale.1.html)
- [GNU gettext](https://www.gnu.org/software/gettext/manual/html_node/Locale-Environment-Variables.html)

```
A locale is composed of several locale categories, see Aspects. When a program looks up locale dependent values, it does this according to the following environment variables, in priority order:

1. LANGUAGE
2. LC_ALL
3. LC_xxx, according to selected locale category: LC_CTYPE, LC_NUMERIC, LC_TIME, LC_COLLATE, LC_MONETARY, LC_MESSAGES, ...
4. LANG
```

# 上を読んで私の理解するところ

- `LANGUAGE` ... コロン区切りで複数の言語を指定できる (`PATH` みたいに)
- `LC_ALL` ... これを指定すると他の全ての `LC_xxx` 系よりも優先される
- `LC_xxx` (ALL 以外) ... ない場合は LANG を参照する
- `LANG` ... ない場合は C ロケールを参照する

なので優先順位も `LANGUAGE > LC_ALL > LC_xxx > LANG` になる。
(ただし LANGUAGE は gettext の方式に対応していなければ無視される。)

# となると `$HOME/.profile` には何を書くべきか？

個人設定は一番優先度の低い `LANG` だけで良いと思う。
そうしておけば他のアプリケーションやコマンドラインで必要に応じて環境変数を上書きする際に混乱が少ない。
KPTの意見を引き出す質問例（メモ）

[KPTの意見を引き出す質問例](http://togetter.com/li/851517)

振り返りの参考に。

# Keep

- 今後も続けたいことは何ですか？
- どんな良かったことがありましたか？
- なぜ、うまくいった/よかったのでしょうか？
- 他の人にちょっと自慢したいことや、褒めてもらいたいことはありますか？
- 他の人の「ここがよかったと」いうところはどこですか？
- 前と変えてみたところはありましたか？

# Problem

- 気になることや、困ったことはありましたか？
- 何かガマンしていることはありますか？
- 「もっとできた」と思っていることは、どんなことですか？
- チームで決めたルールで、守れなかったことはありましたか？
- 目標の到達をさまたげることは、どんなことですか？
- ムダと感じることは、どんなことですか？（7つのムダ「未完成の作業のムダ」「余分な機能のムダ」「再学習のムダ」「引き継ぎのムダ」「タスク切り替えのムダ」「遅れのムダ」「欠陥のムダ」。『リーン開発の本質』より）
- 理想と異なることは、どんなことですか？

# Try

- そのProblem少しでも改善するには、何をすればよいですか？
- そのProblemをすべて取り払うには、何をすればよいですか？
- そのProblemが無くせないとしたら、何をすればよいですか？
- そのKeepの本質は何ですか？
- そのKeepをよりうまく行うには、何をすればよいですか？
- 目標に近づくためには、何をすればよいですか？
tarで固める方法と解凍する方法


## 固める

```
tar cvf {固めた後のファイル名} {対象ファイル1} {対象ファイル2} ...
```


### 例

```
tar cvf hoge.tar file1 file2
```

## 解凍

※固めるときにディレクトリ構成が記憶されているため、固めた時と同じ場所で解凍する。

```
sudo tar xvf conf.tar
```


## tarファイルの中身を確かめたいとき

tオプションで解凍した時の中の情報を擬似的に表示してくれる

```
tar tvf conf.tar
```


## 解凍先を指定したい場合




## オプション
c: 固める
x: 解凍
v: 表示する
f: ファイルの指定
t: テスト
Elixirのキーワードリストとマップとディクショナリ


[Elixir](http://elixir-lang.org/)の[Getting Started](http://elixir-lang.org/getting-started/introduction.html)をやろうと思いまして、そのメモです。

# はじめに
[07. Keywords, maps and dicts](http://elixir-lang.org/getting-started/maps-and-dicts.html)です。

# Keyword lists
* 最初の要素がアトムとなっているタプルのリスト
* `[key: value, key2: value2]`とも書ける

```iex
iex> keyword_list = [{:a, 1}, {:b, 2}]
[a: 1, b: 2]
iex> keyword_list == [a: 1, b: 2]
true
iex> keyword_list[:b]
2
```

* タプルのリストなのですべてのリスト操作が可能
* キーの重複がある場合は前のキーが優先される

```iex
iex> new_list = [a: 0] ++ keyword_list ++ [c: 3]
[a: 0, a: 1, b: 2, c: 3]
iex> new_list[:a]
0
```

* キーワードリストは重要
	* キーがアトムである必要がある
	* キーは指定したとおりの順序で並ぶ
	* キーは1つ以上持てる
* 関数へオプションを渡すためによく使われる
* 関数呼び出しで引数の最後がキーワードリストの場合、角括弧`[]`をつけなくてもいい

```iex
iex> if(false, do: :foo, else: :bar)
:bar
iex> if(false, [do: :foo, else: :bar])
:bar
iex> if(false, {:do, :foo}, {:else, :bar})
** (RuntimeError) undefined function: if/3

iex> if(false, [{:do, :foo}, {:else, :bar}])
:bar
```

* キーワードリストもリストと同じ線形の性能をもつ
* 要素数が多く、キーがユニークである場合はマップを使ったほうがいい

# Maps
* いわゆるHash、連想配列
* `%{key => value, key2 => value}`と書く
* キーはどんな値でもいい
* キーの順序は保証されない
* キーがすべてアトムのときは`%{key: value, key2: value}`とも書ける

```iex
iex> map = %{:a => 1, 2 => :b}
%{2 => :b, :a => 1}
iex> map[:a]
1
iex> map[2]
:b
iex> %{:a => 1, :a => 2}
%{a: 2}
iex> %{a: 1, b: 2}
%{a: 1, b: 2}
```

* 変数をキーとして定義できない
* アクセスするときは変数も使える

```iex
iex> v = :a
:a
iex> %{v => 1}
** (CompileError) iex:26: illegal use of variable v in map key
    (elixir) src/elixir_translator.erl:344: :elixir_translator.translate_arg/3
    (elixir) src/elixir_map.erl:154: anonymous fn/7 in :elixir_map.translate_map/4
    (stdlib) lists.erl:1353: :lists.mapfoldl/3
    (elixir) src/elixir_map.erl:153: :elixir_map.translate_map/4
iex> map = %{a: 1}
%{a: 1}
iex> map[v]
1
```

* パターンマッチも使いやすい

```iex
iex> map = %{a: 1, b: 2}
%{a: 1, b: 2}
iex> %{a: a} = map
%{a: 1, b: 2}
iex> a
1
iex> %{} = map
%{a: 1, b: 2}
iex> %{c: c} = map
** (MatchError) no match of right hand side value: %{a: 1, b: 2}
```

* Mapモジュールという便利なものがある

```iex
iex> Map.get(%{a: 1, b: 2}, :a)
1
iex> Map.to_list(%{a: 1, b: 2})
[a: 1, b: 2]
```

* アトムがキーの値に`map.key`でアクセスできる
* `%{map | key => value}`で値を更新できる

```iex
iex> map = %{a: 1, b: 2}
%{a: 1, b: 2}
iex> map.a
1
iex> map.c
** (KeyError) key :c not found in: %{a: 1, b: 2}

iex> map[:c]
nil
iex> %{map | :a => -1}
%{a: -1, b: 2}
iex> %{map | :c => 3}
** (KeyError) key :c not found in: %{a: 1, b: 2}
    (stdlib) :maps.update(:c, 3, %{a: 1, b: 2})
    (stdlib) erl_eval.erl:255: anonymous fn/2 in :erl_eval.expr/5
    (stdlib) lists.erl:1262: :lists.foldl/3
```

# Dicts
* キーワードリストもマップもディクショナリと呼ばれている
* ディクショナリはインターフェイス (Elixirではbehaviour)

```iex
iex> keyword = []
[]
iex> map = %{}
%{}
iex> Dict.put(keyword, :a, 1)
[a: 1]
iex> Dict.put(map, :a, 1)
%{a: 1}
```
[*Raspberry Pi*] Blynkを使ってスマホからLEDチカチカ

# はじめに
BlynkというスマホアプリでRaspberry PiのLEDをチカチカしたりできると最近知ったので触ってみました。

# 手順

## 1. Blynkのインストール

スマートフォンやタブレットなどからBlynkをインストール。
![IMG_0080.png](https://qiita-image-store.s3.amazonaws.com/0/48912/633a5171-377e-0352-7981-73cfa2d76fd2.png)

アカウントを作成。
![IMG_0081.png](https://qiita-image-store.s3.amazonaws.com/0/48912/7fe49d81-9b69-7285-6aca-507927e1f2f2.png)

## 2. Raspberry Pi側の設定

WiringPiを入れる。

```bash
$ git clone git://git.drogon.net/wiringPi
$ cd wiringpi
$ ./build
```

Blynkを入れる。

```bash
$ git clone https://github.com/blynkkk/blynk-library.git
$ cd blynk-library/linux
$ make clean all target=raspberry
```

## 3. 回路を組む

今回はLEDでやるのでLEDの回路を組みます。
LEDを4つ使ってみました。
![IMG_0084.jpg](https://qiita-image-store.s3.amazonaws.com/0/48912/847c23bb-b63b-b640-156e-2a1af8ea4217.jpeg)

## 4. Blynkでプロジェクト作成

Blynkで新しいプロジェクトを作成します。
プロジェクト名を何か付けて、**HARDWARE MODEL**は今回はラズパイ2を使っているので画像のものを選んでいます。
**AUTH TOKEN**を**E-mail**ボタンを押して、アカウント作成時に登録したメールアドレスの方に送ります。
最後に**Create New Project**ボタンを押します。
![IMG_0086.png](https://qiita-image-store.s3.amazonaws.com/0/48912/a5104b18-6ac1-f3c2-7c82-dc78a319e3d6.png)

プロジェクトができたら画面をタッチ。
するとこんな感じの画面が出てくるので今回は**Button**をクリック。
すると画面にボタンが追加されると思うので、ボタンをクリックします。
![IMG_0088.png](https://qiita-image-store.s3.amazonaws.com/0/48912/7ba0e0a7-881c-f7cc-7f2f-9ad7e64c50b3.png)

一番上の四角にはボタンの名前を入れます。右側の色の付いた丸がボタンを押した時の色です。
**OUTPUT**の一番左の四角をクリックすると、Gpioを選べると思うので、左は**Degital**で右は今回LEDの回路を組んだ時に使ったGpio番号を指定します。
私は今回14、15、18、23を使っているのでボタンを4つ追加します。
![IMG_0091.png](https://qiita-image-store.s3.amazonaws.com/0/48912/26e05427-6bdd-fd92-3459-88f331901946.png)

追加してこんな感じになりました。
![IMG_0093.png](https://qiita-image-store.s3.amazonaws.com/0/48912/d8088cad-5299-d589-e6af-81e282395f6b.png)

## 5. LEDをチカチカしてみる

ラズパイ側で下記のようにします。
「Ready」と出てきたら準備OKです。

```bash
$ cd ~/wiringPi/blynk-library/linux
$ sudo ./blynk --token=efd5f96**********　←「--token」の右はメールで送られてきたAUTH TOKENを指定
[0] Blynk v0.2.5-beta
[5001] Connecting to cloud.blynk.cc:8442
[5601] Ready (ping: 204ms).
```

Blynkに戻って右上に「▷」ボタンがあると思うのでそれをクリックします。
そしてボタンをクリックします。
その後光らせたいLEDのボタンをクリックします。
![IMG_0095.png](https://qiita-image-store.s3.amazonaws.com/0/48912/278b6681-891d-9cbc-879f-2e1c6ed6d9e0.png)

光った！
ボタンそれぞれに対応付けられたLEDが光ります。
![IMG_0542.jpg](https://qiita-image-store.s3.amazonaws.com/0/48912/d59fbf70-682f-8a41-26fd-5e3616231783.jpeg)

# 最後に
他にも温度センサーとか繋げたら温度出したりと、そういうことができるみたいです。
Raspberry PiだけではなくArduino、Spark Core、TinyDuino、Wildfire、ESP8266、Generic Boardなど、選択できるハードウェアは複数あるようです。

# 参考

* [Raspberry Piを自在に遠隔操作できるスマホアプリ「Blynk」を実際に使ってみた！](http://plus.appgiga.jp/masatolan/2015/05/22/56025/)
* [Blynk を使って Arduino を操作してみた](http://jh1lhv.hatenablog.jp/entry/2015/05/25/215552)
* [Blynk](http://www.blynk.cc/)
Haxeでエラーをthrowする時はtink_coreのErrorオブジェクトを使うと便利

[tink_core](https://github.com/haxetink/tink_core)というライブラリが提供するErrorオブジェクトで例外をthrowしてあげると、Haxeの例外発生箇所を出力してくれるようになって非常に便利！

```hx
import tink.core.Error;

using Type;

class Main {
  public function new() {}

  public function print<T>(val:T) {
    switch(val.typeof()) {
      case TClass(String): trace(val);
      case _: throw new Error(null, 'argument should be String.');
    }
  }

  static function main() {
    var main = new Main();
    try {
      main.print('Hello world');
      main.print(12345);
    } catch(e: Error) {
      trace(e.toString());
    } catch(e: Dynamic) {
      trace(e);
    }
  }
}
```

上記コードをjsにコンパイルしてnodejsで実行すると以下の様に例外がthrowされたHaxe上のコード情報が記録されています。

```
Error: argument should be String. Main.print:11
```
GlassFishでURLのポートだけが異なるアプリを２つ配置する

こういうニーズがどのくらいあるか分からないけれど、調べてみたのでメモ.

# 大雑把な手順

1. Standalone Instanceを作る  
   これでConfigurationsが追加されるので、ポートを分けられるようになる.
1. 追加されたConfigurationのHTTP Listenerのポートを変える  
   asadminコマンドでInstanceを作る場合、コマンドのオプションでポートを指定することも可能.
1. JDBC Resourceを作っている場合、targetに1で作ったInstanceを追加する  
   asadminコマンドを使う場合、resource-refを作るコマンドを発行する.
1. 作成したInstanceを起動
1. アプリをデプロイ  
   このときターゲットを1で作ったInstanceにする.

# コマンド例

ここでは、``` instance2```というInstanceをもう１つ作る前提でコマンドを掲載する.

## Standalone Instanceを作る
```
./asadmin -W pass.txt create-instance --systemproperties HTTP_LISTENER_PORT=18080:HTTP_SSL_LISTENER_PORT=18181 --node localhost-domain1 instance2

```

なおこのとき指定したポートはInstanceのSystem Propertiesに記録される.


## JDBC Resourceを作る

### コネクションプールを作る

```
./asadmin -W pass.txt create-jdbc-connection-pool \
  --datasourceclassname=org.postgresql.ds.PGConnectionPoolDataSource \
  --restype=javax.sql.ConnectionPoolDataSource \
  --steadypoolsize=10 \
  --maxpoolsize=80 \
  --poolresize=5 \
  --property serverName=localhost:portNumber=5432:databaseName=app:user=app:password=xxx \
 app-connection-pool
```

### デフォルトのInstance(server)にJDBC Resourceを作る

```
./asadmin -W pass.txt create-jdbc-resource --connectionpoolid app-connection-pool jdbc/App
```

### instance2にresource-refを作る

```
./asadmin -W pass.txt create-resource-ref --target instance2 jdbc/App
```

これで、serverにデプロイしたアプリ、instance2にデプロイしたアプリの両方から、同じコネクションプールを参照出来るようになる.

## GlassFishを再起動する

```
./asadmin -W pass.txt restart-domain
```

## instance2を起動する

```
./asadmin -W pass.txt start-instance instance2
```

## serverにアプリをデプロイ

```
./asadmin -W pass.txt deploy --contextroot / --name app1 --target server glassfish-webapp.war
```

## instance2にアプリをデプロイ

```
./asadmin -W pass.txt deploy --contextroot / --name app2 --target instance2 glassfish-webapp.war
```

nameを変える必要があることに注意.

以上.
忘備録

学習し、成長する上での大きな要因としては、才能+熱意+外部環境の優秀さ
=個人の能力の拡大値



http://www.amazon.co.jp/dp/4873116384/

プログラミング78日目に感じた点に関して。

78日間の学習の結果として得た事はやはり何も身についてはいない点。
ネットで見つけた簡単なサイト作成チュートリアルを30時間もかけてどうにか形にしたのはいい思い出。その時点での熱意が存在してない感はやはりあるな、と。

簡単なコードが用意されている>まあやり切れる段階にまでは到達したが、つまりはその程度でその段階の人間は多く存在している。


off-JTっていいですね。

熱意の定義に関して。

目標が明確で、フィードバックが適切で、チャレンジとスキルのバランスが取れている時に、
注意力は統制されていて、十分に使われている。
心理的エネルギーに対する全体的な要求によってフローにある人は完全に集中している。
削除したツイートに含まれる画像の保存期間についての検証

2015-9-29追記:
画像を含んだツイートを削除するとpbs.twitter.com上の実体にも即時的にアクセスできなくなることを確認しました。

~~現在、公式Twitterクライアントなどから普通の方法で画像をアップロードすると、http://pbs.twitter.com/media/(生成された名前) の形で保存されて、ここを参照すると画像にアクセスできるようになります。ここで、この画像を含んだ元のツイートを削除すると、この画像にもすぐにアクセスできなくなると予想していましたが、削除後もしばらくはアクセスが可能だったので、どのくらいの期間アクセス可能なのか小学生並みの方法で検証してみました。~~

~~#小学生並みの検証方法
1. 自分のツイートの画像のURIを保持しておく
2. そのツイートを削除する
3. 画像にアクセスできなくなるまで、**気が向いた時間にポチッとそのURIにアクセスしてみる**~~

~~#小学生並みの検証結果
検証を始めてから**4日目**に画像にアクセスしようとしたところ、404 Not Foundで画像にアクセスができなくなりました。~~

~~#小学生並みのまとめ
ツイートの画像は削除してから4日目で見ることができなくなる。
(ただし検証回数がたったの1回である上に時間を決めてアクセスしたわけではないのでこの結果はほんの一例にすぎない。もしかしたら決まった時間に一括削除されているのかもしれない。)~~