OmniAICreator/Qiita-1.07M huggingface dataset:
serverspec を bats に置き換えたらどうなるだろう？

酷い夢で夜中に目が覚めたら、なにか無性に書きたくなったので書いてみたという酷いエントリーです。しかもあんまり技術的詳細を書くつもりもなく、Qiita に書くのが申し訳ないくらいの内容になるかもしれません。

何を書きたいかまでたどり着くのに少々前置きがあります。今日ようやくあの「リーダブルコード」を読破。一週間で読み終えましたが、読めば読むほどコードを書き直したくて書き直したくて。しかしすでに救いようのないアンリーダブルな自分のコードを読むのが恥ずかしくて、他人さまのコードを書き換えることにしました。良い仕事したなあ。

そのコードがたまたま ksh だっので bash にポーティングしたり楽しく弄らせて頂いたわけですが、変更箇所が多くなってきたのでテストも追加したくなってしまったわけです。そこで(これまで何度もググったけど) bash TDD とかで検索したら bats に出会ってしまったのです。衝撃の出会いというよりは「やっぱあるよねー」というくらいでしたが、でも使ってみたら素晴らしいツールだったので即採用。もくもくと(他人の)リファクタリングを楽しんでました。

そんな事をしてるうちにふと、「あれ？これサーバのテストに使えるんじゃ？」というあざとい考えが浮かんできたのであります。社内でこれまで数年間サーバの正常系テスト普及にトライしてきたのですがうまくいっておらず、もしかしたらこれはイケるかもしれないと期待しています。なぜ普及出来なかったか Bad practice としてちょっと歴史を振り返ってみると・・・

    - RSpecに出会いTDDを知る
    - サーバに使って Test Driven Installation みたいなのやりたいと思いシェルスクリプトで作って社内に展開
    - メンテナが自分しかおらず多忙につき挫折
    - 年月が経ち serverspec が出現
    - 早速社内に展開
    - Rubyを誰も知らず挫折
    - ansible が出現
    - Excelのシステム設計書から ansible, cucumber+serverspec を自動生成するツールを開発
    - 社内からの期待大！
    - メンテナが自分しかおらず多忙につき挫折
    - bats に出会う ← new!


てな具合で足掛け6年くらい悶々としてきたわけですが、悲しいことにまだ成功には至っていません。

serverspec は非常に優れたソフトウェアであり是非とも弊社で使いたいのですが、残念ながらいまの状況では学習コストが高く厳しい。さらに SuSE が多いのでインストールのナレッジも世の中に少なく、セットアップすら一大事なので誰もやりたがらないという状況です。

いま bats にすごく期待してるのは学習コストの低さです。普段使ってるコマンドをそのまま使えるので、普及させるにあたって説明すら必要ないのではないかと。具体的に serverspec と比べるとこんな感じです。

```ruby:serverspec
describe service("httpd") do
  it should_be enabled
end
```

```bash:bats
@test "You guys, service httpd must be enabled." {
  chkconfig httpd
}
```

serverspec は直感的に読みやすく大変わかりやすい反面、文法やメソッドを覚える必要があります。対して bats は自由に書けすぎて厳密ではなく読みにくいですが、UNIXコマンドに慣れた人ならすぐ書けそうです。

使い勝手として重要な問題がありました。リモートサーバへの対応です。serverspec は最初から ssh に対応してるので問題ありません。bats は bash スクリプトと同様に書けるので、```grep node* /etc/hosts | cut -f1 -d" " | xargs -l -I{} ssh {} chkconfig httpd``` (xargsはfalseを返さないかも)とか書けそうですが、明らかにリーダブルじゃない！

などなどしばし悩んだ結果、pdcp + pdsh + dshbak で実行すりゃいいじゃんと割り切ってしまいこの問題も解決。なんだかイケそう！と相成りました。

あとは社内展開。次こそは挫折したくないなぁ。大丈夫かなぁ。。。あぁ、その前にインストールテストしないと。

ではこの辺で。
@UiThread してるのに java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() が発生する

いつもどおりに @UiThread しているだけなのに。
一時間苦しんだ挙句、アノテーションのパッケージが android annotations のではありませんでした。

* 間違い: android.support.annotation.UiThread
* 正しい: org.androidannotations.annotations.UiThread
vagrant の box を add しようとしたら The box failed to unpackage properly. Please verify that the box file you're trying to add is not corrupted and try again. 

vagrant で ローカルの box のファイルをaddしようとしたら下記のエラー

ファイルが壊れてないか確認しろと言われると焦ります。

```
user@example:~/server$ vagrant box list
base    (virtualbox)
precise (virtualbox)
trusty  (virtualbox)
user@example:~/server$ vagrant box add examplebox example.box
Downloading box from URL: file:~/server/example.box
Extracting box...te: 1027M/s, Estimated time remaining: --:--:--)
The box failed to unpackage properly. Please verify that the box
file you're trying to add is not corrupted and try again. The
output from attempting to unpackage (if any):

x ./box-disk1.vmdk: truncated gzip input
bsdtar: Error exit delayed from previous errors.

```

なんてことはなく、権限エラーでした。

読み込み権限を追加して解決。

もうちょっとメッセージがなんて言うか permission den... とかそういうのがいいなぁ ...
Node.jsのSocket.ioでサーバとクライアントが繋がるまで待機させる

#サーバとクライアントが接続するまで処理を待機#

Node.jsのSocket.ioを使ってサーバとクライアントを繋げたんですが、接続が完了するまでに微妙に時間がかかってしまい、接続する前にエミットしたデータが取得できないという状況に陥ったので、繋がるまで待機させた時のメモ。

##サーバー側##
expressを使ったのでbin/www上で接続する。サーバ側はこんな感じ。

```js:./bin/www
#!/usr/bin/env node
var debug = require('debug')('WillDo')
  , app = require('../app')
  , http = require('http');

exports.connected = false;

app.set('port', process.env.PORT || 3000);
var server = app.listen( app.get('port'), function() {
  debug('Express server listening on port ' + server.address().port );
});

// Websocket
var io = require('socket.io').listen(server);

io.sockets.on('connection', function(socket) {
  console.log('サーバとクライアントつながりましたb');
  exports.connected = true;  // 接続したらtrueに

  socket.on('disconnect', function() {
    console.log('途切れました');
  });
});
```
***
`exports.connected = false;`
と接続完了したかを示す変数connectedを外部から取得できるようにモジュール化。connectionで接続完了したらしっかりとtrueにしておく。

```js
var www = require('./bin/www');
var async = require('async');

// socketがつながるまでループする。
async.until(function(){ return www.connected; }, function(callback) {
    // 500ms待ってまだ繋がってなかったらもう一度500ms待つ。。。の繰り返し
    setTimeout(callback, 500);
    console.log('まだ繋がってないよ');
  }, function(err) {
    console.log('つながったよ');
  });
```
[async#untilの仕様](https://github.com/caolan/async#until)
これで外部のファイルからでも、繋がってるかを確認してから処理を行えるようになった。サーバー側、クライアント側だけなら

```js:server.js
var io = require('socket.io').listen(server);
io.sockets.on('connection', function(socket) {
  console.log('繋がったよ');
});

```

```js:client.js
$(function(){
  var socket = io.connect();
  socket.on('connect', function() {
    console.log('繋がったよ');
  });
});
```
この中に処理をかけば、いい感じなんだろうけど、これ以外の外部ファイルで接続を確認してから処理を行いたかったので、以上の感じにしてみました。メモメモ_φ(･_･
processing3でAWT/swingを使う。

#コード

```processing:sample.pde
import processing.awt.*;
import java.awt.*;
import javax.swing.*;
void setup(){
  size(100,100);
  Canvas canvas =(Canvas)surface.getNative();
  JLayeredPane pane =(JLayeredPane)canvas.getParent().getParent();
  JTextField field=new JTextField("");
  field.setBounds(10,height*3/4,100,20);
  pane.add(field);
  ellipse(0,0,100,100);
}

void draw(){
}
```
![投稿用12.png](https://qiita-image-store.s3.amazonaws.com/0/68551/4b711b90-689a-c8ff-cd9d-70e062dd9028.png)

pane.add(Component c)でprocessingにコンポーネントを追加することができます。

また、paneにはレイアウトがないためsetBoundsがないと表示されないです。


ではでは

#こちらも合わせてどうぞ
[swingの中にprocessingを埋め込む]
(http://qiita.com/hotman78/items/65f84e52560cc093d37f)
[PSurfaceまとめ](http://qiita.com/hotman78/items/27ff03df7d04ea0bd434)
[javaからPAppletのインスタンスを作らずに、processingのメソッドを呼び出す方法
](http://qiita.com/hotman78/items/eca8c022ace051d63980)
MacのChromeでキャッシュからファイルを復元するには

Mac上でChromeのキャッシュからファイルを復元したい！
===============================================
*  Windowsでは「ChromeCacheView」なんていう便利そうなツールがあるみたいだけれどもMacには対応していないみたいだったので、MacでChromeのキャッシュからファイルを復元する方法について調べてみた

*  Safariでもそうだけれども、MacではChromeの履歴やキャッシュはSQLiteでデータベース管理しているみたい
    -  SQLiteのデータベースにいちいちアクセスするのは面倒くさいなぁ...

*  試してみたところ、以下の手順でファイルの復元ができました (2015年11月現在)

1. Chrome上でキャッシュの一覧を確認する
---------------------------------
*  まず、Chrome上で`chrome://cache`にアクセスすると、現在Chromeが保持しているキャッシュの一覧(URLのリスト)を表示することができます
*  この一覧の中から復元したいファイルが存在しているかを<kbd>⌘</kbd> + <kbd>F</kbd>で検索するなどして探してみてください

2. キャッシュのバイナリ文字列を取得する
--------------------------------
*  目的のファイルを示すURLが見つかったら、そのURLをクリックして開いてください
*  URLを開くと、キャッシュについてのバイナリ情報が見れるページが表示されると思います
*  このページは以下のような構造になっていると思います

```
キャッシュファイルのURL
  (http://...)
--------------------------------------------------------------
HTTPレスポンスヘッダ
  (HTTP/1.1 200 OK
   Server: ...
   Date: ...
   ... )
--------------------------------------------------------------
HTTPレスポンスヘッダのバイナリ
  (00000000: 44 01 00 00 03 00 04 00 de 2f d5 da 3c 82 2e 00  D......../..<...
   00000010: 46 6d d5 da 3c 82 2e 00 0f 01 00 00 48 54 54 50  Fm..<.......HTTP
   00000020: 2f 31 2e 31 20 32 30 30 20 4f 4b 00 53 65 72 76  /1.1 200 OK.Serv
   ... )
--------------------------------------------------------------
HTTPレスポンスボディのバイナリ
  (00000000: xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx  ................
   00000010: xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx  ................
   00000020: xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx  ................
   ... )
--------------------------------------------------------------
```

*  このページの中で、ファイルの復元に必要となる部分はHTTPレスポンスボディのバイナリの中の、中間の列部分になります。(上の概略図の中で`xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx` と書いた部分です)
*  この16進数のバイナリ文字列を取り出しましょう。（僕はウェブページ全体を<kbd>⌘</kbd>+<kbd>A</kbd>で全範囲選択した後に<kbd>⌘</kbd>+<kbd>C</kbd>でコピーし、vimに貼り付けてから矩形選択などを使って編集して取り出しました。）

3. バイナリ文字列からバイナリデータを作成する
------------------------------------
*  上の手順を行ってバイナリ文字列データを取り出したら、このバイナリ文字列をバイナリエディタに貼り付けましょう。
*  Macで使えるバイナリエディタには0xEDやHexEditなどがありますが、僕は今回は0xEDを使いました。
*  0xEDが起動したらFile > New Fileで新規作成用のウィンドウを表示させてください。
*  ウィンドウが開いたら、ウィンドウ中央部の入力エリアに先ほど取り出したバイナリ文字列をそのまま貼り付けてください。
*  貼り付けが終わると自動的にウィンドウの左側に00000や00001Fなどのように、その行の先頭がファイル中の何バイト目に対応するかの表示が現れるので、Chrome上で確認した時のHTTPレスポンスボディのバイナリと貼付け後のバイナリを見比べて正しく貼り付けられているかを確認してください
    -  この貼り付け処理が失敗しているとファイルは正しく復元できません
*  無事に貼り付けが完了したら、ウィンドウ左上のSaveボタンをクリックしましょう。
*  ファイル名の入力を求められるので、ファイル名を**拡張子も指定して**入力して保存してください。

-------------------------

*  お疲れ様でした。これで保存したファイルが無事に普通のファイルとして開けるようなら復元完了となります！


*  でも、どのみち手順が多くて面倒くさいな...
IntelliJ IDEAの設定

自分が行っているIntelliJ IDEAの設定をまとめたいと思います。

#全体のフォント
Appearance & Behavior -> Appearanceの『Override default fonts by (not recommended)』にチェックを外します。

#行番号や空白表示
Editor -> General -> Appearanceの『Show line numbers』と『Show whitespaces』にチェックを入れます。
Railsで文字列から日時をパースしたい


具体的には、Ruby標準ライブラリのDateTimeを使うか、ActiveSupport::TimeWithZoneを使うか。
以下、`config/application.rb`に`config.time_zone = 'Tokyo'`を設定して`rails console`で実行

Datetime

```Ruby
[1] pry(main)> DateTime.parse('2015-10-01 00:00:00')
=> Thu, 01 Oct 2015 00:00:00 +0000
[2] pry(main)> DateTime.parse('2015-10-01 00:00:00').to_s
=> "2015-10-01T00:00:00+00:00"
```

ActiveSupport::TimeWithZone

```Ruby
[1] pry(main)> Time.zone.parse('2015-10-01 00:00:00')
=> Thu, 01 Oct 2015 00:00:00 JST +09:00
[2] pry(main)> Time.zone.parse('2015-10-01 00:00:00').to_s
=> "2015-10-01 00:00:00 +0900"
```

と言う結果で、DateTimeではRailsアプリに設定したタイムゾーンを無視してUTCで扱われ、ActiveSupport::TimeWithZoneでは設定したタイムゾーンが有効になる。
また、文字列を出力した場合の結果も多少違っている。
パースするだけなら利便性はActiveSupport::TimeWithZoneに軍配が上がるか。

なお、Ruby標準のTimeでは文字列からのパースは出来ない？ 模様。

***
**追記**
コメントで

>RailsであればStringのオブジェクトから直接コンバートすることもできます。

との情報をいただいた。

```Ruby
[1] pry(main)> '2015-10-01 00:00:00'.in_time_zone
=> Thu, 01 Oct 2015 00:00:00 JST +09:00
[2] pry(main)> '2015-10-01 00:00:00'.to_time
=> 2015-10-01 00:00:00 +0900
[3] pry(main)> '2015-10-01 00:00:00'.to_datetime
=> Thu, 01 Oct 2015 00:00:00 +0000
```

それぞれActiveSupport::TimeWithZone、Time、DateTimeのインスタンスが返ってくる。Rails内ではActiveSupport::TimeWithZoneが一番使い勝手がいいようなので、特に理由がなければ`'2015-10-01 00:00:00'.in_time_zone`を使うのがよさそう。Rubyの書式としてもわかりやすい気がする。

@jnchitoさんありがとうございました。
[Ruby] Create a two dimensional array

For creating a one dimensional array, we can write some code like this:

```rb
ar = [0] * 3 #[0, 0, 0]
```

But if we create a two dimensional array by using the same way, like this:

```rb
ar = [[0] * 3] * 3
```

It seems like no problem, but if we change the value of the array 

```rb
ar[0][0] = 1
```

Then it will become this:

```
[[1, 0, 0], [1, 0, 0], [1, 0, 0]]

```

**The right way to create a two dimensional array is doning something like this:**

```rb
ar = Array.new(3) { Array.new(3, 0) }
```
Rustでsum

## はじめに
この記事は `rustc 1.4.0 (8ab8581f6 2015-10-27)` で動作確認をしています。

## Rust で sum
Rustでは現在sum(集計)をするには、

[std::iter::Iterator - sum](https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.sum
)


```rust
fn sum<S = Self::Item>(self) -> S 
where S: Add<Self::Item, Output=S> + Zero
```


というメソッドが用意されているのですが、現在こちらはunstableとなっているメソッドでissueが上がっており、まだ使用を推奨できません。
(rust v1.29.1現在では問題なく使用可能([std::iter::Iterator - sum](https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.sum
)))

そこで代わりとなる方法の紹介です。

## foldを使う

```rust
let sum: i64 = array.map(|a| a.count ).fold(0, |sum, i| sum + i);
```

やっていることはただの加算ですが、for等で回すよりもすっきりとかけます。

## 追記

コメント欄より教えて頂きました

```rust
let sum: i64 = array.iter().fold(0, |sum, a| sum + a.count);
```

mapは省略することが可能です！
開発手法【スクラムについて】

#スクラムのメリット
一番のメリットは 「問題点の見える化」 です。
スクラムを導入して少しすると、チームに潜む問題点がいっぱい見えてきます。

スクラムはすごい勢いでプロジェクトに潜む問題点を教えてくれます。
しかしながらどれが一番深刻的な問題なのかは教えてくれません。
また導入当初には開発手法が変わることによって、チームの生産性が一時的に低下することも相まって、 
プロジェクトがうまくいっていないような錯覚 を覚えます。ここでスクラムを始めた人たちの反応はというと。。。

**うちにスクラムはあってなかった...もうやめよう...**

スクラムを乗りこなすためには 「必要なものはなにか」 を一度立ち止まって考えてみること。
スクラムが教えてくれた問題点について、チームみんなでなにを優先的にやるべきなのかを決めることです。
そうやって最優先に選ばれた問題点を解決した時、初めて最初にあげたいろいろなテクニックが役立ちます。

最初から完璧であろうとうすることは不可能です。
すべての問題を一度に解決することも困難です。１つずつ確実に終わらせていきましょう！

みんなでがんばってスクラムをものにしましょう！
UE4はじめました。 -ブループリント入門編(2. 変数の取り扱いと簡単な計算)-

# 概要
[前回](http://qiita.com/sango/items/94fa26f2fe92da4be0e6)に引き続き、ブループリントについてです。

今回は、変数の取り扱いと簡単な計算について綴ります！

# 実践
さっそくはじめるよ！

## 変数の取り扱いと簡単な計算
### 1. 変数の追加
前回も `String` 型の変数を1つ使ったけど、今回はInt型の変数を2つ用意してね！
![ue_20.png](https://qiita-image-store.s3.amazonaws.com/0/97611/a16543a7-cb83-913d-7ac7-6a6f94025f43.png)

コンパイルして、好きな値を入れてね！
1つ目
![ue_21.png](https://qiita-image-store.s3.amazonaws.com/0/97611/21c47091-91a2-b43d-ae4b-ddbb09a07283.png)
2つ目
![ue_22.png](https://qiita-image-store.s3.amazonaws.com/0/97611/821f0a9c-9806-a486-6adc-8b231b5bd270.png)

### 2. イベントグラフ上に配置
用意した変数をドラッグ&ドロップでイベントグラフ上に配置してね！
![ue_23.png](https://qiita-image-store.s3.amazonaws.com/0/97611/dc469023-0938-2392-8e26-1969f61dd9bd.png)

### 3. 足し算を行う関数を配置
2つのInt変数で足し算をしてみるよ。

イベントグラフ上で右クリックして、「Integer + Integer」の関数を配置してね！
![ue_24.png](https://qiita-image-store.s3.amazonaws.com/0/97611/4247b34c-269a-e664-2eba-d94115d8e145.png)

配置できたかな？
![ue_25.png](https://qiita-image-store.s3.amazonaws.com/0/97611/1b081add-3ce5-b8ae-8c10-5df057b97b75.png)

### 4. 関数に値を渡す
最初に用意した2つの変数を、足し算関数に渡してみよう！
![ue_26.png](https://qiita-image-store.s3.amazonaws.com/0/97611/566823d2-96b2-bc59-e862-5175e1e0bc20.png)
ドラッグして線を繋いでね！


### 5. (前回配置したString変数をいったんどかす)
今回はString変数を使用しないので、いったんご退場いただきましょう。
![ue_27.png](https://qiita-image-store.s3.amazonaws.com/0/97611/2af693d2-d2ca-1850-03da-09e98cd6e054.png)
イベントグラフ上の変数を右クリックして、「削除」！

![ue_28.png](https://qiita-image-store.s3.amazonaws.com/0/97611/ee5f4ae3-978e-a789-b90b-5524919b2ac2.png)
OK??

### 6. 計算結果をプリント関数に渡す
最後に、計算結果とプリント関数をドラッグで繋いでね！
![ue_29.png](https://qiita-image-store.s3.amazonaws.com/0/97611/b906acd8-635f-9413-01a9-d1ef70104d39.png)

ぽん。
![ue_30.png](https://qiita-image-store.s3.amazonaws.com/0/97611/17b32655-45dc-39da-beb1-83728d4050bc.png)
間に不思議なモノが挟まった…！

Int型の計算結果をString型の関数に渡そうとしたので、コンバート処理が自動で挿入されるよ！


### 7. 実行！！
![ue_31.png](https://qiita-image-store.s3.amazonaws.com/0/97611/04558221-17a5-631a-57cc-5e051657b267.png)
計算結果が表示されたかな？

<br>
とっても簡単ね！

今回はここまで。
次回は、もう少し複雑な変数の取り扱い、について！
フロントエンドエンジニア/Webデザイナー向けの興味深い記事まとめ

#はじめに
フロントエンドエンジニアやWebデザイナー向けの個人的に面白いな、興味深いなと思った記事をまとめてみました。
テクニック系はココや某サイトをごそごそすればたくさん出てくるので、読み物系中心にまとめています。

##どっちかというとフロントエンド向け

###Web Fundamentals | Web Fundamentals - Google Developers
https://developers.google.com/web/fundamentals/?hl=en
Google公式のWeb制作ベストプラクティス集（一部日本語訳あり）

###CSS Architecture — Philip Walton
http://philipwalton.com/articles/css-architecture/
CSS設計のベストプラクティスとは何かがわかりやすくまとめられている
某CSS設計本でもこの記事が取り上げられているみたいですが...買ったのにまだ読んでなかった(・ω・;)

###Code smells in CSS
http://article.enja.io/articles/code-smells-in-css.html
匂う...匂うぞこのコード（日本語訳）
個人的にこの記事は全力で同意。マジックナンバーのヤバさは尋常じゃない


###カーゴ・カルト CSS
http://terkel.github.io/cargo-cult-css/
今流行のCSSフレームワークに対する批判的記事（日本語訳）


###RSCSS
http://ricostacruz.com/rscss/index.html
名前からしてCSS構成案のように見えますが、イントロダクションにある通りCSSコーディングのアイデア集


###IEのサポート期限まとめ - Qiita
http://qiita.com/sawadays0118/items/41bab56358742fe2a646
自分が書いたやつですいません。レガシーIE終了のお知らせ


##どっちかというとデザイナー向け

###「今のレスポンシブWebデザインは誤解されている」英の著名デザイナーAndy Clarke氏が話す3つの修正点 - エンジニアtype
http://engineer.typemag.jp/article/andyclarke
本来のグリッドデザインとは


###Pixel Perfect Precision
http://www.concentinc.jp/labs/2014/01/pixel-perfect-precision-handbook-2-japanese/
デザインの基本原則まとめ（日本語訳）
現在はバージョン3が最新みたいです

##どっちかというとあとがき
他にもこんな記事あるよって方がいましたら、コメント等で教えていただけると喜びます。(｀・ω・´)
robolectric3.0で Android SDK23 を動かす方法


最新のrobolectricでは、compileSdkVersion 23を指定すると二つの問題が発生します。

* ```Gradle: エラー: AndroidHttpClientにアクセスできません``` が出る
* ```Robolectric does not support API level 23``` が出る


# 解決方法

一つ目の原因は、API Level 23から ```AndroidHttpClient```が削除されたからです。
なので、以下のように記述すれば解決します。

```build.gradle
android {
    useLibrary 'org.apache.http.legacy'
```

Http関連の処理を記述していなくてもこのエラーは出るので必須です。

これは、githubのissueに上がっているので、次のバージョンでは解決されるでしょう。
https://github.com/robolectric/robolectric/issues/1862

二つ目のエラーは```sdk = Build.VERSION_CODES.LOLLIPOP)```を指定すれば、解決です。
こんな感じです。

```MainActivityTest.java
@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = Build.VERSION_CODES.LOLLIPOP)
public class MainActivityTest {
```

robolectricは、SDK21以下でないと対応していないようです。

これもissueにあるので次のバージョンでは解決されるでしょう。
https://github.com/robolectric/robolectric/issues/1865
独自URLScheme設定時のデバッグ方法

URLSchemeでアプリを開いた時、break ポイントなどを使用する Xcodeでのデバッグは不可能となる。
しかし、その状態でもNSLogなどの標準出力を使用したデバッグは可能である。

Window->Organizer
もしくは
Command+Shift+2 コマンド
でオーガナイザが開く。

オーガナイザでデバッグ対象の端末を選択する。
そこで、ViewDeviceLogsを選択すると、その端末内で出力されたログが見れる。
ログの中に標準出力が表示されるため、その情報を使用してデバッグが可能となる。

なお、上記手法が適用可能なのは実機のみである。
シミュレータのログをオーガナイザから見ることはできないようだ。
【Android】エンコーディングが自動設定できるようになってた【Chrome】


### issue
https://code.google.com/p/chromium/issues/detail?id=244358

https://codereview.chromium.org/1248163002

### 設定方法
設定＞サイトの設定＞言語 からいけます。

![画像](http://cdn-ak.f.st-hatena.com/images/fotolife/r/re_fort/20151105/20151105234049.png "エンコード")

手動設定はまだ無理みたい。
自動設定でも設定しておくに越したことはないので、設定しておくとよさげ。

ちなみに、上のGoogle翻訳からチェックを外しておくと、海外サイトを見たときに、
「このサイトを翻訳しますか？」みたいな問いをしなくなるので、オススメ。
ウイルスバスター for Macがインストールされた環境において、Xcode の iOS8 Simulator のネットワーク接続が切れてしまう問題

以前、Simulator(Xcode)のネットワーク接続で相当はまった問題があったので、共有したいと思います。

# 問題
XcodeのSimulatorでネットワーク接続(HTTP通信のみ)が出来なくなる。

# 原因
ウイルスバスター for Mac（Ver 5.0)がインストールされていて保護されている場合に、iOS8 Simulatorでネットワークの接続が切れる問題が発生してしまっていた。

# 解決策
ウイルスバスター ヘルプとサポートページにて、手順に従って修正モジュールをインストール・適用すれば解決できました。以下がページのURLです。
[ウイルスバスター ヘルプとサポート](http://esupport.trendmicro.com/support/vb/solution/ja-jp/1106521.aspx)


他にも、ESETなどのセキュリティソフトで同様の問題が発生しているようです。以下のサイトでも説明されているので、参考にしてみてください。
[iOS SimulatorでiOS8を動作させるとHTTP通信ができない](http://qiita.com/tetsuo6666/items/0f30fffbfd312fe17220)
elastic beanstalk の .ebextensions で設定しておくと良いかもしれないもの

aws elastic beanstalk で `.ebextensions` に共通して設定しているものを抜き出してみた。

### files
* `.gemrc`に`--no-rdoc --no-ri`を設定しておく

```yaml
  "/root/.gemrc":
    mode: "000644"
    owner: "root"
    group: "root"
    content: |
      gem: --no-rdoc --no-ri
```

* リソース制限

```yaml
  "/etc/security/limits.d/60-nofile-limit.conf":
    mode: "000644"
    owner: "root"
    group: "root"
    content: |
      nginx  soft  nofile  65535
      nginx  hard  nofile  65535
      root   soft  nofile  65535
      root   hard  nofile  65535
```

### commands
* カーネルパラメータ

```yaml
  01_sysctl:
    command: |
      sysctl -w net.core.somaxconn=8192
      ...
```

* swap  
*.microのインスタンスに保険としてswaponしておく

```yaml
  02_swapon:
    command: |
      if (curl -s http://169.254.169.254/latest/meta-data/instance-type | grep -E "\.micro$" > /dev/null)
      then
      SWAPFILENAME=/swap.img
      test -e $SWAPFILENAME && exit 0
      MEMSIZE=`cat /proc/meminfo | grep MemTotal | awk '{print $2}'`
      if [ $MEMSIZE -lt 2097152 ]; then
        SIZE=$((MEMSIZE * 2))k
      elif [ $MEMSIZE -lt 8388608 ]; then
        SIZE=${MEMSIZE}k
      elif [ $MEMSIZE -lt 67108864 ]; then
        SIZE=$((MEMSIZE / 2))k
      else
        SIZE=4194304k
      fi
      fallocate -l $SIZE $SWAPFILENAME && mkswap $SWAPFILENAME && chmod 0600 $SWAPFILENAME && swapon $SWAPFILENAME
      fi
```

* localtime

```yaml
  03_localtime:
    command: |
      if [ ! -e /etc/localtime.orig ] ; then
      cp -pf /etc/localtime{,.orig}
      cp -pf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
      fi
```
Unity5でハイクオリティなVRLIVEを作ってみた　part3　ライティング編

#はじめに
この回ではLightingの手法について設定していく。

詳しくはこちらの動画とサイトを参考に
Unity 5 Graphics - Lighting Overview - Unity Official Tutorials
https://www.youtube.com/watch?v=eGu9_8HS2uI
Lighting 基礎　１ … ライトの種類と三点照明
http://www.alchemyschool.com/mayatips/lighting01

Lightingは様々な手法があり、ちゃんと調べると劇的にPVのクオリティが上がってくる。
しかし今回は基本的な設定項目と手法のみを紹介していく。

#Lightingの種類
Unityの標準で使えるLightingは4つのみであるが、これを組み合わせることでほとんどのシチュエーションに対応が可能である。
##DirectionalLight
一番設定が簡単なのがこのLightである。太陽光や月明りを再現する場合などに適していると言えるが、これだけ使用すると違和感が出てしまうので他のLightと併用することを強く勧める。

設定項目はColorで色を変更、Intensityで明るさを変更できる。特別な使い方をしなければこの二項目以外はそのままでOK。

##PointLight
局所的な光源として使用するのがこのLight。火や爆発、小さ目の光を再現する際に利用できる。暗くなりすぎてしまう部分を照らしたりする小技に使える。

設定項目はColorで色を変更、Intensityで明るさを変更でき、Rangeで光が届く範囲が設定できる。Rangeに関しては光源から離れるにつれて光量が減るので気を付けておく。
##SpotLight
人工的な光源を再現するのに適しているのがこのLight。懐中電灯や車のライト、蛍光灯の光からステージのライトまで幅広く活用できる。

設定項目はColorで色を変更、Intensityで明るさを変更でき、Rangeで光が届く範囲が設定できる。SpotAngleはSpotLightの光源の範囲は円錐であり、その底辺の大きさを設定する項目である。

##AreaLight
面光源を使用するときに利用するのがこのLight。デイスプレイや光る床からの光を再現する場合に適している。今回は利用しない事と設定が特殊であるため設定項目は割愛する。

#Shadowの設定
PVのクオリティを上げるうえで非常に重要な項目がShadowの設定である。これが設定してあるだけでLightingが適当でもどうにかなってしまうといっても過言ではないかもしれない。

設定の仕方は簡単で各LightのShadowTypeの項目を選ぶだけである。
影を付けないならNoShadow、影はつけたいがPCスペックが高くない場合はHardShadow、クオリティに妥協したくない人はSoftShadowを選択するのがよいかと。また、その下のResolutionの項目でも影の粗さを変えることができるが、非常に負荷が重くなることがあるのでその点は気を付ける必要がある。

#実際の使い方
###初期設定
Lightを配置する前にEdit->ProjectSettings->Playerを選び、ColorSpaceをLinearに変更しておく。
<img width="960" alt="スクリーンショット 2015-11-05 23.00.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/78071/cdc5d07e-ada5-408b-fa8d-b3aba4702c03.png">



###Lightの配置方法
LightはHierarchyのCreate->Lightの中から配置ができる。
<img width="960" alt="スクリーンショット 2015-11-05 22.04.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/78071/b398de2c-3f98-f880-eb41-511008ba3fa9.png">

場所もInspectorのTranceformで自由に変更することができる。
場所が決まったら上記したような項目の値を好きなように設定するだけである。

###三点照明
基本的なLightingの手法として三点照明がある。詳しくははじめにの項目のサイトを参照に。
SpotLightとPointLightを以下のように配置し、BackLightとKeyLightは同じくらいの明るさに設定する。FillLightは暗めに設定する。これだけでもむやみに明かりを配置するよりもLightingの効果が上がる。
![スクリーンショット 2015-11-05 23.17.50.png](https://qiita-image-store.s3.amazonaws.com/0/78071/681496a2-a61c-0619-e1ed-61ed6c83e028.png)

画像だと違いが分かりにくいが動かしてみればこれだけでもかなり変わっているはず。
![スクリーンショット 2015-11-05 23.25.06.png](https://qiita-image-store.s3.amazonaws.com/0/78071/c34d8e5a-0e17-4920-d00c-2212e5ad1e97.png)




ただしこれは基本的に屋内で効果を発揮する方法なので、今回のような屋外用のskyboxを使用している場合はあまり向かない。屋外ではskyboxのAmbientIntensityを大きめに設定し、設置したLightとバランスをとるとよい。


#おわりに
Lightingは設定項目は少ないが位置や明るさによって完成度が全く違うので、間違ってもDirectionalLightだけでいいとかは考えない方がいいかと。
次回のエフェクトの項目とも密接にかかわってくるので、最終的には微調整しながら完成度を高めていくこととなる。


というわけで次回は一番重要なeffectの設定を行っていく。
cassandraの始め方

1. binaryをdownload. ver.は2.2.3
2. 解凍して、/opt以下に配置。全台同じ
3. /opt/cassandra/conf/cassandra.yamlを編集して設定

- seedsに client接続するserver ip addressを指定
- rpc_address, listen_addresに各サーバーのip addressを指定

4. /opt/cassandra/bin/cassandraでサーバー起動
5. bin/nodetool statusで確認
6. http://wiki.apache.org/cassandra/GettingStarted
に従って動作確認
[tvOS]UIButtonのアイコンやラベルの色を固定する

背景画像を設定すると文字や画像が隠れる問題は以下のリンクを参照してください。
http://qiita.com/noppefoxwolf/items/e2eb5ae7902dc957297b

tvOSではフォーカス時にUIButtonのラベルやアイコンの色が黒に変化します。
背景画像などを設定した際など、色を固定したい場合もあると思います。

```swift

class FixedButton : UIButton {

    override func didUpdateFocusInContext(context: UIFocusUpdateContext, withAnimationCoordinator coordinator: UIFocusAnimationCoordinator) {
        super.didUpdateFocusInContext(context, withAnimationCoordinator: coordinator)
        coordinator.addCoordinatedAnimations({ () -> Void in
            self.imageView?.tintColor = self.tintColor
            self.titleLabel?.textColor = self.tintColor
            },completion: nil)
    }
}
```

didUpdateFocusInContextから得られるcoordinaterで色を更新し続ければOKです！
O/Rマッピングフレームワークってなんだろう。。な疑問を解消したい!!

#O/R Mapping frameworkとは、Object/Relational Mappingの枠組みの事を指します。 

##O/Rマッピングとは
```
オブジェクト指向言語における"オブジェクト"とリレーショナルデータベースにある"レコード"と対応付け(マッピング)すること。
```
##対応付けるとは(Core Data編)

```
Core Dataはモデルオブジェクト => データの永続化にSQLiteというリレーショナルデータベース(RDB)を使用します。
CoreDataはメモリ上にあるオブジェクトをRDBのレコードに変換(対応付け)し、保存。また、逆にRDBのレコードをオブジェクト => データに変換してくれます。
```

##O/Rマッピングフレームワークとは
```
Core Dateのようにオブジェクトとレコードの対応付け(Mapping)を行うフレームワークのことを「O/Rマッピングフレームワーク」と呼びます。
```
##リレーショナルデータベースとは
```
関係データベースであり、データを複数の表として管理し、表と表の関係を定義することで、複雑なデータの関連性を捉えやすくしたデータベース管理方式。
表の列(縦)を「カラム」
表の行(横)を「レコード」という。
一件のデータが「レコード」に該当し、レコードはカラムで構成される。複数のレコードの集合が「テーブル」となる。
そして複数のテーブルが関連付けされながら、管理されていく。
```


##参考URL
http://www.weblio.jp/content/O/R%E3%83%9E%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0

http://it-trend.jp/words/rdb

http://d.hatena.ne.jp/glass-_-onion/20111015/1318667971


追記

Rubyとかで使っていたから詳しい事はきにしなかったけど、Swiftでも似たような事(データ保存)をやるので復習
Xcode CI Server with Private Dependencies

# 背景
**iOS/MacアプリのCIはXcode Serverで回したい**ですよね。Jenkinsでも良いですが、カバレッジ良い感じに取れるようになったし見やすいし。
しかし、**Xcode Serverは`_xcsbuildd`というユーザーが実行する**ため、気にしてあげないといけないことが幾つかあります。特に、CocoaPods/Carthageで（Github Enterpriseを含む）Privateなレポジトリを取りに行こうとして情報源が少なく大変だったので、手順をまとめます。

# 前提
* Xcode7.1インストール済み
* 開発者登録済み
* `brew install git ruby`済み
* `gem install cocoapods`済み
* Carthageインストール済み
* OSX Serverインストール済み

# 手順
## 1. Keychain準備
ひとまず通常ログインユーザーでKeychain周りの環境を整えます。
### 1-1. Developer Program証明書インストール
テストだけでもCarthage使うためには必要なので、インストールします。
[ここの6](http://grokin.gs/blog/xcode-bot-keychain-configuration/)にあるように、証明書秘密鍵に`xcsbuildd`などの権限を付けてあげましょう。

**注意点**
Screen Sharing越しだとKeychainのアクセス権限変更ができない（ずっとカーソルぐるぐる）ので、直接触りましょう。

### 1-2. GithubのID/Password
`git config --global credential.helper osxkeychain`して[KeychainにID/Passwordを保存](https://help.github.com/articles/caching-your-github-password-in-git/)するように設定。
その後、git cloneするなりpod installするなどしながらPrivate RepositoryやGithub Enterprise上のレポジトリなどの取得に必要なID/Password情報を保存。

### 1-3. SSH Key設定
Carthageで`--use-ssh`できるように、`ssh-keygen`（パスフレーズなしの方が`_xcsbuildd`用の設定が楽）で鍵を生成、Github等に登録する。
`ssh -T git@github.com`などで接続確認。

## 2. Xcode Server起動
## 3. _xcsbuilddのシェル選択
OSX Server上のUsersで`Show System Accounts` > `_xcsbuildd`を選択 > `Advanced Options`でシェルを`/bin/false`から`/bin/bash`に変更（[参考](http://honzadvorsky.com/articles/2015-08-17-17-30-xcode_server_tutorials_3_prebuild__postbuild_scripts/)）。

## 4. Keychain情報のコピー
例えば「必要なKeychain ItemをSystemに移す」、「[Portal.keychain](http://grokin.gs/blog/xcode-bot-keychain-configuration/)を一時退避させて変更」などの方法もあると思いますが、上記で設定したKeychainをそのまま使いたかったので、下記手順でlogin.keychainをPortal.keychainに移し替える方法をとりました。

```bash
$ cp ~/Library/Keychain/login.keychain ~/Desktop/Portal.keychain
$ # パスワードをPortal.keychain用に変更
$ security set-keychain-password -p "`sudo cat /Library/Developer/XcodeServer/SharedSecrets/PortalKeychainSharedSecret`" ~/Desktop/Portal.keychain
$ sudo chown _xcsbuildd:_xcs ~/Desktop/Portal.keychain
$ sudo cp ~/Desktop/Portal.keychain /Library/Developer/XcodeServer/Keychains/

```

## 5. SSH Keyの複製
```bash
$ # 通常ログインユーザー
$ cat ~/.ssh/id_rsa | bcopy
$ sudo su - _xcsbuildd
$ mkdir ~/.ssh
$ chmod 700 ~/.ssh
$ vim ~/.ssh/id_rsa # ペースト
$ chmod 600 ~/.ssh/id_rsa
$ ssh -T git@github.com # GHEがあるならそちらも
```

## 6. Create Bot
`Before Trigger`のShell Scriptは最低限こんな感じ。

```bash
#!/bin/bash

# これが多分大事。前以てKeychainのロックを外してあげる
security unlock-keychain -p `cat /Library/Developer/XcodeServer/SharedSecrets/PortalKeychainSharedSecret`
cd <repository-name>
export LANG=en_US.UTF-8
/usr/local/bin/pod install
/usr/local/bin/carthage bootstrap --platform iOS --use-ssh
```

# トラブルシューティング
## CocoaPodsでなんかエラー出る
とりあえず

```bash
sudo su - _xcsbuildd
rm -rf ~/.cocoapods
```

Keychainがきちんと設定されていればPrivateなrepoも取得してくれるので消した状態でそのままBotを走らせてしまいましょう。

## ずっと`Integration Pending`
まずはPendingなBotを全てキャンセルして、Xcode Serverを一度停止、再開してみましょう。
それでうまくいかない場合は、全てのBotsが消え、_xcsbuilddの設定も最初からになるけれど[以下のコマンドで初期化できます](http://blog.stuart.shelton.me/archives/2563)。

```bash
$ sudo xcrun xcscontrol --reset
```

# オチ
~~Xcode7.1時点では、Coverageタブを選択した瞬間落ちるんですよね。。~~
↑テストがビルド失敗してる時だけでした
Rubyでインストール済みのhomebrew packageのリストからBrewfileを生成するスクリプト

Rubyでインストール済みのhomebrew packageのリストからBrewfileを生成するスクリプトを作成します。

## <i class="fa fa-check-circle" style="font-size:1em;"></i> 用途
既にHomebrewのPackageを手動でインストール済みの環境から
Brewfileを作りたいケースで利用。

## <i class="fa fa-flask" style="font-size:1em;"></i> 試行
### <i class="fa fa-code" style="font-size:1em;"></i> プログラム
```ruby:brewgen
#! /Users/tbpgr/.rbenv/shims/ruby

puts "cask_args appdir: '/Applications'"
taps = `brew tap`
taps.each_line.map{ |e|"tap '#{e.chomp}'" }.each(&method(:puts))
packages = `brew list -1`
packages.each_line.map{ |e|"brew '#{e.chomp}'" }.each(&method(:puts))
```

### <i class="fa fa-file-o" style="font-size:1em;"></i> 出力
```
$ ./brewgen
cask_args appdir: '/Applications'
tap 'caskroom/cask'
tap 'homebrew/bundle'
tap 'motemen/ghq'
tap 'peco/peco'
tap 'sanemat/font'
brew 'autoconf'
brew 'brew-cask'
# 中略
brew 'zeromq'
brew 'zsh'
```
Playframework Javaでjavadoc生成

Playframeworkをjava版で使っている場合、javadocを生成するには、下記をbuild.sbtに追記。

```
sources in (Compile, doc) ~= (_ filter (_.getName endsWith ".java"))
```

[sbtの公式サイト](http://www.scala-sbt.org/0.13/docs/Howto-Scaladoc.html)によると、
```
sbt will run javadoc if there are only Java sources in the project. If there are any Scala sources, sbt will run scaladoc. 
```

とあります。ソースがjavaのみなら、javadoc、scalaファイルが混じっていたらscaladocをつくるということなので、上記の設定でjavaのみに限定することで、javadocがつくれるということのようです。

### 参考サイト

http://stackoverflow.com/questions/30181448/generate-javadoc-of-a-project-using-play-framework-2-3
[tvOS]UIButtonのBackgroundImageが先頭に表示される問題を解消する

tvOSのUIButtonのBackgroundImageはなぜかimageViewよりも前にあるので、セットすると文字やsetImage,stateした画像が隠れて見えなくなります。

![Simulator Screen Shot 2015.11.05 22.43.14.png](https://qiita-image-store.s3.amazonaws.com/0/24979/9d7d86ac-ed6d-636c-85e3-27129c0231c9.png)

上が修正済みのボタン、下が既存のUIButton

レイヤー構造

<img width="250" alt="ss.png" src="https://qiita-image-store.s3.amazonaws.com/0/24979/c631f7fc-2258-01f8-22b5-a858b214e097.png">

UIImageViewが二枚あって分かりにくいですが、backgroundImageのImageViewが先頭に来てしまっています。


```swift

class FixedButton : UIButton {
    override func layoutSubviews() {
        super.layoutSubviews()
        
        if let iv = imageView {
            iv.superview?.bringSubviewToFront(iv)
        }
        if let lbl = titleLabel {
            lbl.superview?.bringSubviewToFront(lbl)
        }
    }
}

```

上記のようにUILabelとUIImageViewを先頭に移動させれば解決します。(backgroundImageのImageViewは直接参照できないのでこれで）
ConoHaにShiny Serverを載せる@ubuntu14.04

# ConoHaにShiny Serverを載せる
あらすじ：
意外と安くて決済方法がクレジット不要だったので、ConoHaにubuntu vpsを作ることにしました。ここにShinyを載せます。

## ユーザー登録して入金する
他の記事が結構あるみたいなので、必要に応じて参考にしてください。特に迷いませんでした。
しいて言えば、セブンイレブンの人に「支払伝票番号を打ち込んでください」と依頼したのが一番の迷いどころでしょうか。

## サーバーインスタンスを作る
ここも特に迷いませんでしたが、iPad+safariで登録しようとしたら何回かエラーになったのであきらめてPCから登録しました。エラーの理由はわかりません。

### 秘密鍵を作る
いちおうssh通信用の秘密鍵を作ってみます。

## 様々なインストールをする
色々なサイトから仕入れた情報を使ってインストールします。
https://www.digitalocean.com/community/tutorials/how-to-set-up-r-on-ubuntu-14-04
https://www.digitalocean.com/community/tutorials/how-to-set-up-shiny-server-on-ubuntu-14-04

### ターミナル系クライアントアプリでアクセス
ConoHaにはコンソールが用意されていますが、慣れ親しんだターミナルでアクセスします。
ConoHaコントロールパネルでIPを調べて、作った秘密鍵でアクセスします。
（ドメインを取得していればそんなことしなくてもよさそうですが）

### Rのインストール
```shell-session
# sh -c 'echo "deb http://cran.rstudio.com/bin/linux/ubuntu trusty/" >> /etc/apt/sources.list'
# gpg --keyserver keyserver.ubuntu.com --recv-key E084DAB9
# gpg -a --export E084DAB9 | sudo apt-key add -
# apt-get update
# apt-get -y install r-base
# R

R version 3.2.2 (2015-08-14) -- "Fire Safety"
Copyright (C) 2015 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)
```
結構すんなりと入ってしまうのでちょっとびっくりしますね。

### Shiny Serverのインストール
rootでsudoすると怒られますが、あまり気にしません。

```shell-session
# sudo su - -c "R -e \"install.packages('shiny', repos = 'http://cran.rstudio.com/')\""
# apt-get install gdebi-core
# wget -O shiny-server.deb http://download3.rstudio.org/ubuntu-12.04/x86_64/shiny-server-1.3.0.403-amd64.deb
# gdebi shiny-server.deb
```

この状態で、
http://なんとかかんとか:3838
にアクセスすると、こういう画面が表示されてしまいます。

<img width="692" alt="shiny.png" src="https://qiita-image-store.s3.amazonaws.com/0/94255/86314052-4866-39a4-97b5-e0e13a2fdb81.png">

目ざといあなたは、なにやらエラーが起こっていることに気付いたかもしれませんが、rmarkdownをインストールしていないので仕方がありません。放送事故みたいなものなので無視します。

本当にとりあえずShiny Serverで遊ぶだけであれば、このまま
/opt/shiny-server/sample-apps/
に適当にフォルダを作ってui.rとserver.rを配置すれば、動いてしまいます。
十回足らずのコマンド打ち込みでwebアプリのサーバを立ててしまえるというのは、なかなか便利な世の中になったものだと思います。ちなみにawsを使えばもっと簡単に一年間無料のwebアプリのサーバが作れてしまえますが、信頼の無いあなたにはaws以外のVPS(今回はConoHa)がおすすめです。

ユーザ・サーバ登録の所要時間とコマンドを打ち込む時間を比較すると、前者の方が圧倒的です。
webアプリのサーバを作るための最大の障壁は、クレジットカード番号や支払伝票番号である、ということがよく分かったのでした。ちゃんちゃん。
Association, Aggregation, Compositionの違い


集約とかコンポジョンとか、対象のオブジェクトをuseしている関係って結局何がどう違うんじゃ〜〜？ってなったので調べた。

# 本記事の責任の委譲
以下の記事がよくまとまっている。本稿はこの記事の忘備録。

- [Understanding Association, Aggregation, and Composition - CodeProject](http://www.codeproject.com/Articles/330447/Understanding-Association-Aggregation-and-Composit#Introduction)

# ノート
個人的には、これらの概念はオブジェクト間の結合度を表しているように捉えている。
上の記事では違いを次の観点で分類している。

- 相手のオブジェクトを保持するかどうか
- 保持したオブジェクトの寿命（開放されるまでの時間）

**注意: 以下、プログラムの構文は適当なので雰囲気で読んでください**．
## Association
- 独立したオブジェクトが、メソッドで相手を使い合うだけ
- 相手オブジェクトを保持しない（保持するならAggregationかComposition）

```scala
// 個別にインスタンス生成
val manager: Manager = new Manager();
val swipe: SwipeCard = new SwipeCard();

manager.logo(swipe);
swipe.swipe(manager);
```

## Aggregation
- 基本的にAssociationと同じ。異なる点は、他方のクラスが親になる（保持して使う）こと。
- Workerは親としてManager **のみ** を持つ。

```scala
class Manager
{
	val workers: Seq[Worker] = null;
	def add(worker: Worker)
        {
            workers :+ worker; //末尾にworkerを追加
        }
}

val worker: Worker = new Worker();
val manager: Manager = new Manager();
manager.add(worker);

```

## Composition
- Aggregationをさらに密結合させた状態。
- 保持するオブジェクトの寿命が、親の寿命に等しくなる。
    - 典型的な例は、あるクラスの中でnewされるクラスの間の関係。

### プロジェクトとマネージャの例
- 相互に依存：プロジェクトはマネージャがいないと成立しないし、マネージャはプロジェクトがないと存在できない。
    - Projectオブジェクトを生成する際には、Managerオブジェクトが必要になる。
- 保持する側の寿命が、保持される側の最長の寿命
    - ProjectオブジェクトとManagerオブジェクトは重度に依存しているため、オブジェクトの寿命が同じになる。つまりどちらかのオブジェクトに対してGCが働く場合、他方のオブジェクトも解放される。

```scala
class Manager
{
	def HowisTheManager(Good: Boolean) {} // Managerのお賃金がProjectの出来で決まる
}
class Project
{	
	def Project(manager: Manager)
    {
		// projectはmanagerに依存している
		this.manager = manager;
	}

	def isSuccess(): Boolean {}
	
	def calcSalary()
	{
		// managerの給料はProjectに依存する
		this.manager.HowisTheManager( this.isSuccess() );
	}
}

val project: Project = new Project( new Manager() );
project.calcSalary(); // projectのメソッドは内部でManagerオブジェクトを参照している
```
EmscriptenのスクリプトをWeb Workerで実行する

この前のナンバーリンクソルバーについて改良を行なっていたのですが、さすがにSATソルバーをフロントエンドでそのまま回すのは負担が重いので、Web Workerで処理を行ってみることにしましたが、Emscripten特有の注意点が１つありました。

# おことわり
なお、この記事はEmscriptenでコンパイルした後にWeb Workersで複数スレッド動作をさせることを前提としたC/C++コードを書く、という意味合いの記事ではありません。もともとあったC/C++のコードベースをEmscripten化したものについて、Web Workerで動作させる、という内容です。

# Web Workerとは
JavaScriptは基本的にシングルスレッドのモデルをとっているので、一度には1つの処理しか進行しません。Ajaxや`setTimeout`、イベントなど非同期実行の処理は数多くありますが、これらとて1つの処理をこなしている間に別なことをすることはできません。

一方、Web Workerは、ブラウザのメイン動作とは別個のスレッドでJavaScriptを実行できる機能です。ここで複雑な処理を進めれば、途中で処理を切らなくても、ブラウザのUIを固まらせたりすることはありません。

## 制約事項
ただし、もともとシングルスレッドだったところに「後付け」のような形で導入されたこともあって、できること・できないことがはっきりしています。

### できること
* ブラウザと関係ない純粋JavaScriptとしての処理
* XMLHTTPRequest、Web Socketなどを使った通信
* `setTimeout`や`setInterval`といったタイマー系API
* `importScripts`による別なスクリプトのロード
* `console`を用いたデバッグ出力
* `postMessage`によるメインスレッドとのデータのやり取り

### できないこと
* DOM操作
* メインスレッドの変数操作

とりわけ、メインスレッドとデータをやり取りする手段は`postMessage`だけです。

## `postMessage`とは
[`postMessage`](http://qiita.com/yasumodev/items/d339a875b4b9bf65d156)は、ブラウザ内の異なるコンテキスト（クロスドメインなど）で安全にデータをやり取りするための仕組みです。Web Workerと本体スレッドの間でも、これを利用してデータをやり取りすることになります。

* データの送信…`postMessage()`
* データの受信…`message`イベントとして来るので、`onmessage`としてハンドラをセットする、もしくは`addEventListener`で待ち受ける

# Emscriptenコードが…動かない
さて、そんな感じでWeb Workerを動かすのですが、最初からC/C++で書かれたプログラムやライブラリは、性質上DOMにアクセスすることもないので、Web Workerで動かすには最適です。

で、Worker内から`importScripts`でEmscriptenコードを呼び出して、実行しようとしたのですが、なんと「`Module`が見つかりません」とエラーになってしまいました。コードを読んでみると、`window`のある通常のブラウザ環境では自動で`window.Module`を定義するのですが、Worker環境ではそうなっていなかったために`Module`が利用できない状態となっていました。対策として、事前に`var Module={};`としてセットすべき変数を用意しておくことで、正常に呼べるようになりました。

このあたりについての[実際のコード](https://github.com/jkr2255/js_puzzle_solvers/blob/44a8bc731930a6ae82a9ec2a5cb7c2d56b53cfe4/minisat_worker.js)がありますので、ご参考になれば幸いです。

# 外部リンク
* [Web Workerを利用する](https://developer.mozilla.org/ja/docs/Web/Guide/Performance/Using_web_workers#Functions_and_interfaces_available_in_workers) - MDN
CSVの値をRでヒストグラムにする


データの例

```data.csv
35.724441,139.684798,1967,0
35.759832,139.872587,1953,0
35.591300,139.730151,1960,0
35.746172,139.433474,1955,0
35.762438,139.773832,1968,0
35.713675,139.422742,2001,0
35.689125,139.540064,2000,0
35.586835,139.427465,1954,0
```

このCSVにはヘッダーが無いので header=F にして、ラベルをつけてもらう.

```R
data <- read.csv('data.csv', header=F, sep=",")

summary(data)
       V1              V2              V3             V4   
 Min.   :35.51   Min.   :139.4   Min.   :1950   Min.   :0  
 1st Qu.:35.64   1st Qu.:139.5   1st Qu.:1965   1st Qu.:0  
 Median :35.69   Median :139.7   Median :1983   Median :0  
 Mean   :35.68   Mean   :139.6   Mean   :1982   Mean   :0  
 3rd Qu.:35.74   3rd Qu.:139.8   3rd Qu.:1999   3rd Qu.:0  
 Max.   :35.81   Max.   :139.9   Max.   :2014   Max.   :0 

hist(data[2])
以下にエラー hist.default(data[2]) :  'x' は数値でなければなりません 
```

クラスと確認せよとのこと.

```R
sapply(data, class)
       V1        V2        V3        V4 
"numeric" "numeric" "integer" "integer" 
```

よさそう。
そもそも値のアクセスの仕方が違ったみたい. histにはベクトルを渡す必要がある
$で値にアクセスする

```R
data$V3
  [1] 1953 1960 1955 1968 2001 2000 1954 1991 1974 1952 1996 1985 1975 1952 2011
 [16] 1975 1960 1969 1951 1995 1958 1973 1974 2009 2005 2008 1956 1971 1962 1974

 
または、このようなアクセスも可能 
data[['V3']]
  [1] 1953 1960 1955 1968 2001 2000 1954 1991 1974 1952 1996 1985 1975 1952 2011
 [16] 1975 1960 1969 1951 1995 1958 1973 1974 2009 2005 2008 1956 1971 1962 1974

これだと配列が戻ってきている
data[3]
    X1967
1    1953
2    1960
3    1955
4    1968
5    2001
```

よって以下のように値を渡せばよい

```R
hist(data$V3)
```


刻みを細かく、色をつける場合は

```R
hist(data$V3, breaks=65, col="blue")
```
Cからdouble型の配列をバイナリにしてUDPで送り、unityのBitConverterで受け取る

Cから [0, 1, 0.0005, -0.0009] という配列をUDPで送り、Unity側でdouble配列に戻す。

送信（C）側

```c:udp.c
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/socket.h>

#define INTERVAL_TIME 1

void udpSend (char* address, int port);
int port = 20001;
char addr[] = "0.0.0.0";
double data[] = { 0, 1, 0.0005, -0.0009 };

int main()
{
    udpSend(addr,port);
    return 0;
}

void udpSend(char* address, int port)
{
    int udp = socket(AF_INET,SOCK_DGRAM,0);
    struct sockaddr_in addr;
    struct hostent *host;

    memset(&addr, 0, sizeof(addr));
    host = gethostbyname(address);
    memcpy(host->h_addr, &addr.sin_addr, host->h_length);
    addr.sin_family = AF_INET;
    addr.sin_port = htons(port);

    while (1)
    {
        sendto(udp, (unsigned char*) data, sizeof data, 0, (struct sockaddr *)&addr, sizeof(addr));
        sleep(INTERVAL_TIME);
    }

    close(udp);
}
```

コンパイルして送信開始。

```sh
$ gcc udp.c
$ ./a.put
```

受信（Unity）側。適当なGameObjectにくっつけておく

```UDPReceive.cs
using System;
using UnityEngine;
using System.Collections;
using System.Net;
using System.Net.Sockets;
using System.Threading;

public class UDPReceive : MonoBehaviour
{
	private const int DATA_LENGTH = 4;
	private const int DOUBLE_LENGTH = 8;
	private UdpClient udp;
	private Thread thread;
	private byte[] data;
	private double[] result = new double[DATA_LENGTH];

	void Start ()
	{
		udp = new UdpClient (20001);
		thread = new Thread (new ThreadStart (threadWork));
		thread.Start (); 
	}

	void Update()
	{
		if (data != null)
		{
			Debug.LogFormat ("{0}, {1}, {2}, {3}", result[0], result[1], result[2], result[3]);
		}
	}

	void OnApplicationQuit()
	{
		udp.Close ();
		thread.Abort ();
	}

	void threadWork()
	{
		while(true)
		{
			IPEndPoint remoteEP = null;
			data = udp.Receive(ref remoteEP);

			for (int i = 0; i<DATA_LENGTH; i++)
			{
				result[i] = BitConverter.ToDouble(data, i * DOUBLE_LENGTH);
			}
		}
	}
}
```
PHPのtrueは1でfalseは''の話

タイトルがすべて。

# PHPのtrueは1でfalseは''
(すこしとまどう)

```php
<?php

echo 'true:  ' . true  . PHP_EOL;
echo 'false: ' . false . PHP_EOL;
```

```bash:出力
true:  1
false:
```

# 'false'という文字列をboolにキャストするとtrue
(あたりまえ)

```php
<?php

$string_true  = 'true';
$string_false = 'false';

echo 'be true ?  : ' . (bool)$string_true  . PHP_EOL;
echo 'be false ? : ' . (bool)$string_false . PHP_EOL;
```

```bash:出力
be true ?  : 1
be false ? : 1
```

# NULL + NULL は 0
```php
<?php

echo 'NULL: ';
echo NULL;
echo PHP_EOL;

echo 'NULL + NULL:';
echo NULL + NULL;
echo PHP_EOL;

echo 'NULL . NULL:';
echo NULL . NULL;
echo PHP_EOL;
```

```bash:出力
NULL:
NULL + NULL:0
NULL . NULL:
```

# 備考
##### 'true'や'false'という文字列をboolean型に

```php
<?php

$string_true  = 'true';
$string_false = 'false';

// 'true'や'false'という文字列をboolean型に
echo( ( 'true'  === $string_true  ) ? true  : false ) . PHP_EOL;
echo( ( 'false' === $string_false ) ? false : true  ) . PHP_EOL;
```

##### booleanを'true', 'false'という文字列に

```php
<?php

$bool_true  = true;
$bool_false = false;

// booleanを'true', 'false'という文字列に
echo (( true  === $bool_true  ) ? 'true'  : 'false' ) . PHP_EOL;
echo (( false === $bool_false ) ? 'false' : 'true'  ) . PHP_EOL;
```
おわりです。

# 参考や注釈

* [論理型 (boolean) ](http://php.net/manual/ja/language.types.boolean.php)
* [NULL](http://php.net/manual/ja/language.types.null.php)
* [PHP 型の比較表](http://php.net/manual/ja/types.comparisons.php)
* [boolval — 変数の boolean としての値を取得する](http://php.net/manual/ja/function.boolval.php)
* [strval — 変数の文字列としての値を取得する](http://php.net/manual/ja/function.strval.php)
* [PHP - Get bool to echo false when false](https://stackoverflow.com/questions/4948663/php-get-bool-to-echo-false-when-false)
* [PHP printed boolean value is empty, why?](http://stackoverflow.com/questions/9042002/php-printed-boolean-value-is-empty-why)
[golang] struct の初期化で missing type in composite literal が出た場合の対処

あんまりハマってる人が居なかったのでメモ。

golang で以下の様に nested な匿名 struct を定義すると、良い感じに初期化できなくてハマった。

```golang
type A struct {
  B struct {
    C string
    D string
  }
}
```

こんな感じで初期化したいけれど、コンパイルエラーになる。

```
var a = A{
  {
    "foo", // missing type in composite literal
    "bar",
  },
}
```

こう書かないといけないみたい。

```
var a = A{
  struct {
    C string
    D string
  }{
    "foo",
    "bar",
  },
}
```

とりあえず struct の定義を外に出して、下記のようにしてお茶を濁した。

```
type TypeB struct {
  C string
  D string
}
type A struct {
  B TypeB
}

var a = A{
  TypeB{
    "foo",
    "bar",
  }
}
```
Spreeにお気に入り商品機能を追加する

こちらのエクステンションを使用します。

[spree-contrib/spree_wishlist](https://github.com/spree-contrib/spree_wishlist)

このエクステンションで追加できるほしい物リストはAmazonのそれと似ています。複数のほしい物リストを作成でき、リストごとに公開/非公開を選択可能です。

## エクステンションのインストール

Gemfileに下記を記述します。branchの項目は、使用するSpreeのバージョンに合わせてください。

    gem 'spree_wishlist', github: 'spree-contrib/spree_wishlist', branch: '3-0-stable'

なお、GithubのREADMEには一緒に`spree_email_to_friend`のインストールもとありますが、今回はそちらは使用しません。

`spree_email_to_friend`を使うと、ほしい物リストの画面に「send to friend」のリンクが表示されます。仮にこのエクステンションをインストールしなくても不具合などは起こりませんので、必要な場合のみ使ってみてください。

あとはこのコマンドを実行するだけでインストールは完了です。

```
$ bundle install
$ bundle exec rails g spree_wishlist:install
```

`rails s`でサーバを再起動すると、ちゃんと表示されていますね！

![wishlist2.png](https://qiita-image-store.s3.amazonaws.com/0/7323/a46e7820-f13e-43db-e582-325b00f3d2e5.png)

ちなみに登録商品一覧もこんな感じで表示されます。

![wishlist3.png](https://qiita-image-store.s3.amazonaws.com/0/7323/02fe7601-a1bb-2f4c-50de-3bacf453f9aa.png)

### 日本語化

なお、インストールしたままだとロケールファイルが存在しないので`translation missing`が表示されるかと思います。

あまり丁寧な仕事ではありませんが、日本語に翻訳したロケールファイルをGistにアップしているのでもし必要でしたらどうぞ。`config/locale`にそのまま入れるだけでも動くはずです。

[spree_wishlist_ja.yml](https://gist.github.com/kamiya54/88583cad7b1a65f1f132)
powershellでwindowsのファイル監査設定を簡単にやる


windows環境だとファイル監査設定をして、ファイルの変更履歴をとるケースって結構あると思う。
この設定を、複数台のサーバにGUIで行うのが辛すぎたので、何とかならないかと調べていたところpowershellで[NTFSSecurity](https://gallery.technet.microsoft.com/scriptcenter/1abd77a5-9c0b-4a2b-acef-90dbb2b84e85)という拡張モジュールを使って簡単に出来たのでシェア。
GUIで数時間かかっていた作業が、powershell実行で投げて放置できて幸せ。

##使い方
###1.モジュール置き場を確認

下記コマンドを実行し、ディレクトリに表示されている場所(PSモジュールの置き場)に、NTFSSecurity(このリポジトリにある)をコピーする

#####PATHが通っているとこならどこでもOK

基本的には、C:\Windows\system32\WindowsPowerShell\v1.0\Modules

```
PS> Get-Module -ListAvailable

  ディレクトリ: .....

```

一応、もう一度同じコマンドを実行し、利用可能モジュールとして[NTFSSecurity]がロードされている事を確認

```
PS> Get-Module -ListAvailable

ModuleType Name                                ExportedCommands
..         ...                                ....
Script     NTFSSecurity                        {Add-NTFSAccess, Add-NTFSAudit, Copy-NTFSAccess, Disable-NTFSAccessIn...

```

###2.モジュールのインポートを実施

```
PS> Import-Module NTFSSecurity
```

###3.コマンド通ることを確認する。

とりあえず、[Add-Audit]と打ってエラー出なければOK

```
PS> Add-Audit

コマンド パイプライン位置 1 のコマンドレット Add-NTFSAudit
```



##サンプルコード

上記行った後に、サンプルコードのパスとユーザを追加したら

```AddACE.ps1
$TargetFolders = @("Path1",
                   "Path2")
$_host = hostname
$AuditUsers = @("User1",
                "User2")
#監査設定のどの項目を設定したいか
$AuditRules = "Delete,DeleteSubdirectoriesAndFiles,ChangePermissions,Takeownership,WriteData,CreateDirectories,CreateFiles"
$InheritType = "ContainerInherit,ObjectInherit"
$PropagationType = "InheritOnly"
$AuditType = "Success,Failure"

foreach ($AuditUser in $AuditUsers){
  foreach ($TargetFolder in $TargetFolders){
    Write-Host "TagetHost:",$TargetFolder,"TagetUser:",$AuditUser
    Add-Audit $AuditUser $TargetFolder -AccessRights $AuditRules -InheritanceFlags $InheritType -PropagationFlags $PropagationType -Type $AuditType
  }
}

Write-Host "ACE Add Complete"

```

##参照
監査設定項目一覧(powershellは.netのライブラリをそのまま使えるので一緒)
https://msdn.microsoft.com/ja-jp/library/system.security.accesscontrol.filesystemrights%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396
Raspberry PiでWi-Fi切断時、自動的に再接続されるようにする方法


# 問題
Raspberry PiにUSB接続タイプのWi-Fi子機を接続して利用している場合、普通に使用していると、何らかの理由によりWi-Fi切断後、再接続してくれない
(Wi-Fi子機が本体から外された、とかではなく、AP側が死んじゃってSSIDをつかめなくなっちゃうような状態を想定)

# 解決策 : 再接続スクリプトを仕込んでおく

1.スクリプトを用意する

``` bash:reconnect.sh
#!/bin/sh
ping -c 1 [gw_address]
test $? -eq 1 && sudo /etc/ifplugd/ifplugd.action wlan0 up
```
一行目 : おまじない
二行目 : ゲートウェイアドレスに向けて1発pingを打つ。うちの場合は192.168.0.254がゲートウェイなんだけど、ここは環境によって違うので、適宜修正する必要あり
三行目 : $?は直前のコマンドのexit値、pingは失敗すると、1が返ってくる。つまりゲートウェイへのpingが失敗した場合(Wi-Fi切れてるよねっていう判断)、```/etc/ifplugd/ifplugd.action wlan0 up```という別のスクリプトを叩く ※補足

2.cronさんに頑張ってもらう

``` bash:crontab
    * * * * * sh ~pi/scripts/reconnect.sh
```

上記の一行をcronに追加 (crontab -eで編集)
スクリプト配置パスは適宜修正。
上記の設定で毎分スクリプトが叩かれる。
つまり、Wi-Fiが切れたとしても、1分毎に再接続を試みる。

# 動作確認
1. Raspberry Piに対して、別のPCからpingを打ち続けておく。
2. おもむろにAPを落とす。(ここでpingは失敗し出すはず)
3. 適当にトイレにでも行って用を足した後、APを起動させる。
4. 多分、1-2分もあれば、pingが成功し始める 。

# 補足
* OSはraspbian、本体はRaspberry Pi 2を使用して動作を確認
    * 細かいversionは後ほど追記、多分ｗ
* ```/etc/ifplugd/ifplugd.action```は元々標準で組み込まれているスクリプトなので、別途用意したりする必要はない
    * tail -f /var/log/syslogをしながら、Wi-Fi子機を抜き差ししてもらえばわかるが、OS自体が抜き差し時に叩いてる恐らく由緒正しいスクリプト
    * 中身はとても簡単なシェルスクリプトなので興味がある場合は見てみると良いと思う。簡単に言うと、引数でもらったインターフェースのup/downやwpa関連の面倒くさいことを自動的にやってくれている。べんり！
Swift 2.0 で ArraySlice の挙動が変わった


# <i class="fa fa-quote-left"></i> はじめに

配列の一部をスライスした配列に対して再度スライスする際の挙動が Swift 2.0 で変わっていたのでメモ


Swift 2.0 の `ArraySlice` ではインデックスがオリジナルのインデックスのままのため、更にスライスしようとすると範囲外アクセスになりエラーとなる模様


### Swift 1.2 での動作

```swift

let arr = [1, 2, 3, 4, 5]
let sliced = arr[2..<4]
// [3, 4]
sliced[0..<1]
// [3]

```


### Swift 2.0 での動作

```swift

let arr = [1, 2, 3, 4, 5]
let sliced = arr[2..<4]
// [3, 4]
sliced[0..<1] // fatal error: Negative ArraySlice index is out of range 

```




1. `[_, _, 3, 4, _]`
    + 初回スライス時

2. `sliced[0..<1]`
    + 二回目のスライスを行う

3. `[x, _, 3, 4, _]`
    + `0..<1` は範囲外！

# <i class="fa fa-quote-left"></i> 対応方法

一旦 Array にしてしまう、以上

```swift

let arr = [1, 2, 3, 4, 5]
let sliced = Array(arr[2..<4])
// [3, 4]
sliced[0..<1]
// [3]

```