OmniAICreator/Qiita-1.07M huggingface dataset:
PhantomJSでキャッシュサーバを指定でパフォーマンス測定

# 動機
 対象コンテンツをキャッシュさせた際に、hostsを毎回開いて設定して画面を確認するのが大変。
なので、Phantomjsを利用(HTTPリクエストヘッダのIPとHostを設定)して、画面キャプチャとロードタイムの取得するプログラムを作成してみた。

## HARDataを作成する
PhantomJSのexampleのnetsniff.jsを参考にしてharファイルを作成
https://github.com/ariya/phantomjs/blob/master/examples/netsniff.js

#### Headerの内容にキャッシュサーバのIPをききにいくように設定する

```
var fs = require('fs'),
    page = require('webpage').create(),
    system = require('system'),
    a = 0,
    t,
    url = system.args[1], // 参照先のFQDNを取得
    vip = system.args[2], // 参照先のキャッシュサーバのIP取得
    arrdata = url.split(/\r\n|\n|\r/);

var urltmp, urlarr = [];
while ((urltmp = arrdata.shift()) !== undefined) {
    if (urltmp !== "") urlarr.push(urltmp);
}

~~~~~~~~~~~~~~~~　省略 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        var settings = {
        headers: {
                 "Host":urlarr[0].replace(/http\u003a\u002f\u002f|https\u003a\u002f\u002f/g, "")
                }
            }
```

#### ロードタイムとスクリーンショットを取得コード
```
 t = Date.now();
 page.open("http://"+ vip, settings , function(status) {
      if (status !== 'success') {
        console.log('FAIL to load the address');
        phantom.exit(1);
      } else {
        t = Date.now() - t;
        page.endTime = new Date();
        page.title = page.evaluate(function () {
            return document.title;
        });

        har = createHAR(urlarr[a], page.title, page.startTime, page.resources);
        har.log.entries.forEach(function(item) {
        });

        // ロードタイムをコンソール出力
        console.log('Loading time ' + t + ' msec');

        // 画面キャプチャの取得
        page.render(url + vip + '.jpg', {
          format : 'jpeg',
          quality : '80'
        });
       
        a++;
        next();
      }
    });
  }
```
これで、ロードタイムとスクリーンショットが取れるようになった


#### speedtest.jsを置いたディレクトリ上で下記を実行

```js:speedtest.js
phantomjs speedtest.js <参照先のFQDN> <参照したいIP>
```

# 最後に
phantomjsを利用して、詳細なFQDNごとのロードタイムや、HTTPリクエストヘッダを設定することが可能なため監視や計測などにも使ってみようかなと思う
iOSのSafariでdata-toggleが動かない場合

bootstrapを使っているページで、iOSのSafariだけアコーディングメニューを開けないというバグを見つけたので直しかたメモ

### 問題のコード
```html
<a data-toggle="collapse" data-target="#target">
  開く（はず）
</a>
```

### 対処法1
href属性を足す

```html
<a data-toggle="collapse" data-target="#target" href="#target">
  開く
</a>
```

### 対処法2

cursorスタイルを追加する

```html
<a data-toggle="collapse" data-target="#target" style="cursor: pointer;">
  開く
</a>
```
Cocos2dxのスタティックライブラリが参照できていない場合の対処法


[Xcode]
Cocos2dxのスタティックライブラリが参照できていない場合
Xcode Projectに取り込まれているlibcocos2d iOS.aをremove
代わりにcocos2d/build/cocos2d_libs.xcodeprojを取り組む (取り込む時はgloopにする) 
Build PhasesのTarget Dependenciesの「+」を押してlibcocos2d iOSを追加
Copy Bundle Resourcesの「+」を押してlibcocos2d iOS.aを追加
表示される画面のTemplateを定義 - Ember.js(1)

Ember.jsについて学んだので、忘れないよう備忘録を残したいと思います。

#準備
以下のライブラリをダウンロード

- jquery
- handlebars
- ember

今回私が落としたスクリプトは次のものです。

- jquery-2.1.1.min.js
- handlebars-v1.3.0.js
- ember.js

これらをlibsディレクトリの下に置きます。
またlibsと同じディレクトリ内にtest.htmlを作成し、次の内容で保存する。

```html:test.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8"/>
    <script src="libs/jquery-2.1.1.min.js"></script>
    <script src="libs/handlebars-v1.3.0.js"></script>
    <script src="libs/ember.js"></script>
    <script src="libs/test.js"></script>
</head>
<body>
</body>
</html>
```
またtest.jsをlibsとtest.htmlと同じディレクトリ内に作成し、次の内容を保存する。

```js:test.js
App = Ember.Application.create();
```
Appの部分は任意の文字を付けることができる。
ここではアプリケーッションの初期化を行っています。
この記述がないと画面に何も表示されないので注意が必要。

ファイル構成は次のようになる。

```file:file
.
├─test.html
├─test.js
└─libs
    ├─ember.js
    ├─handlebars-v1.3.0.js
    └─jquery-2.1.1.min.js
```
これで準備は完了です。

#Templateとは?
test.htmlを編集する前にTemplateについて説明したい。
TemplateはUIとして画面に表示されるHTMLの定義らしい。
test.htmlのbodyタグ内に次を追加します。

```script:test.html
<script type="text/x-handlebars">
    <p>Ember.js学んでるお!</p>
    <p>私の名前は{{name}}です。</p>
    <p>{{input value = name}}</p>
</script>
```
実行すると次の文字が出力される。

```lang:browser
Ember.js学んでるお!
私の名前はです。
┌──────────┐
└──────────┘
```
テキスト入力欄に文字を書き込むと自動的にHTMLを書き換えてリアルタイムで変更を表示してくれる。
これはEmber.jsの特徴の1つである。

TemplateはHandlebarsを使って記述しています。
{{}}で囲まれた部分にオブジェクトのプロパティ、ヘルパーを埋め込むことができる。
{{name}}内のnameはプロパティで、{{name}}に対応した文字列や値が入ります。
その下の{{input value = name}}はHandlebarsのヘルパー関数です。
これで入力された文字列がnameに入り、{{name}}に入力された文字列が入り画面が更新されます。

#コード
```html:test.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8"/>
    <script src="libs/jquery-2.1.1.min.js"></script>
    <script src="libs/handlebars-v1.3.0.js"></script>
    <script src="libs/ember.js"></script>
    <script src="test.js"></script>
</head>
<body>
    <script type="text/x-handlebars">
        <p>Ember.js学んでるお!</p>
        <p>私の名前は{{name}}です。</p>
        <p>{{input value = name}}</p>
    </script>
</body>
</html>
```

```js:test.js
App = Ember.Application.create();
```
Slim3のwithJsonはステータスコードをデフォルトで200に書き換えていた

この記事の内容はすでに修正されています


slimからjsonでエラーレスポンスを返そうとして

```php
return $response->withStatus(500)->withJson([]);
```

ってやったらレスポンスのステータスコードが200で返ってきた
`withJson`の実装読んでみると

```php
public function withJson($data, $status = 200, $encodingOptions = 0)
{
    $body = $this->getBody();
    $body->rewind();
    $body->write(json_encode($data, $encodingOptions));

    return $this->withStatus($status)->withHeader('Content-Type', 'application/json;charset=utf-8');
}
```

現在のステータスコードに関係なく200で上書きするので注意
第二引数でステータスコード指定するか`withJson`した後に`withStatus`しましょう

```php
$response->withStatus(500)->withJson([]);
```

と

```php
$response->withJson([])->withStatus(500);
```

でレスポンス変わっちゃうのはどうなんだろう

#追記
https://github.com/slimphp/Slim/pull/1737
pull req送ってみたものの議論が始まって英語力が足りないのでついていけてないけど3.2.0で取り込んでもらえそう？
VMware上のServer Coreで唯一起動していたコマンドプロンプトをexitして焦った話

#結論
タスクマネージャーから新しくアプリケーション(コマンドプロンプトなど)が実行できました。

![Task Manager](https://qiita-image-store.s3.amazonaws.com/0/104044/b5706891-234a-2c79-4611-9411b4d11b53.png)



#環境
VMware vSphereにインストールしたWindows Server 2012 R2のServer Core

#状況
- Server Coreで唯一起動していたコマンドプロンプトを"exit"で終了した。
- ネットワークの設定などを行なう前だった為、リモートデスクトップ接続することは出来ない。
- vSphere Clientから強制再起動は可能だが、もちろん良い方法ではない。


#解決手順
1. vSphere Client のメニュー「インベントリ」→「仮想マシン」→「ゲスト」→「Ctrl+Alt+Deleteの送信」をクリック
2. Windowsのセキュリティ画面が表示されるので、「タスクマネージャー」をクリックするとタスクマネージャーが起動する。
3. タスクマネージャーのメニュー「ファイル」→「新しいタスクの実行」をクリック
4. 名前に実行したいプログラム名を入力して「OK」をクリックすると、プログラムが起動する。

- _cmd_を入力する：　コマンドプロンプトが起動する。
- _powershell_を入力する：　Powershellが起動する。
【ImageMagick】PHPでイメージマジック(imagick)が使用可能かさくっと調べるスクリプト


サーバー管理者に『PHPでImageMagick(イメージマジック)使えるように設定して！』
って頼んだのはいいけど、
『どうやって動作確認すればいいの？』と聞き返されたときに作ったのがこれ。



# 動作確認用スクリプト
```php:imagick_test.php
<?php

//テスト出力用コード
function imagickTest(){

    if (!extension_loaded('imagick')){
        echo 'imagick not installed :(';
        exit;
    }


    $canvas = new Imagick();

    $canvas->newImage(256, 128, "light green");

    //外側の黒枠線
    $canvas->borderImage('black', 1, 1);

    //文字記入
    $draw = new ImagickDraw();
    $draw->setFontSize(16);
    $draw->setGravity(Imagick::GRAVITY_CENTER);
    $draw->annotation(0, 0, 'imagick inside :)');
    $canvas->drawImage($draw);

    $canvas->setImageFormat('jpg');

    //画像を出力
    header("Content-Type: image/jpg");
    echo $canvas;

    $canvas->destroy();
}

//実行
imagickTest();

?>
```

使用不可である場合(プレーンテキストが出力されます)
![失敗時.png](https://qiita-image-store.s3.amazonaws.com/0/66209/fffebc6e-4895-8f0c-ea9b-585149f260f1.png)

使用可能である場合(画像として出力されます)
![成功時.png](https://qiita-image-store.s3.amazonaws.com/0/66209/e695ea98-28ce-10e9-71a9-4ba27076c99a.png)


# あとがき
ローカルPHP環境にイメージマジックを導入・稼働確認するときにも役立つので
一度作ったPHPファイルは入れたままにして使っています。
国内企業とかのGitHub Organizationを随時拾っていくメモ（国外もあるよ）

FBでそういう話になって気になったので見つけたものをリストにしてみた。

|団体名|アドレス|メモ|
|:--|:--|:--|
|サイボウズ|https://github.com/cybozu| 
|digitalcube|https://github.com/megumiteam/| 
|OpsRock|https://github.com/OpsRockin|
|concrete5 Japan|https://github.com/concrete5japan|
|gree|https://github.com/gree|
|国土地理院|https://github.com/gsi-cyberjapan|
|和歌山県|https://github.com/wakayama-pref-org|
|Cyber Area Research, Inc. |https://github.com/CyberAreaResearch|
|Hametuha INC.|https://github.com/hametuha|
|EC CUBE|https://github.com/EC-CUBE|
|Hatena|https://github.com/Hatena|
|Cookpad|https://github.com/cookpad|
|pixiv|https://github.com/pixiv|
|さくらインターネット|https://github.com/sakura-internet|
|dwango|https://github.com/dwango|


##(おまけ)国内じゃないところ

|団体名|アドレス|メモ|
|:--|:--|:--|
|Human Made|https://github.com/humanmade|
|Netflix|https://github.com/Netflix|NetflixのgithubリポジトリはWeb技術の百貨店だった - DiaryException : http://d.hatena.ne.jp/LaclefYoshi/20150719/netflix_github|
|WordPress REST API Team|https://github.com/WP-API|
|Automattic|https://github.com/Automattic/|
|Apple|https://github.com/apple|
|Microsoft|https://github.com/Microsoft|
|Twitter|https://github.com/Twitter|
|Facebook|https://github.com/Facebook|
|Heroku|https://github.com/Heroku|
Nodejsでサーバーのホスト名を取得するコード

# Nodejsでサーバーのホスト名を取得するコード
## 環境
* Node.js(4.2.4)
* CentOS 7

## ホスト名取得
Nodejs標準のOSモジュールを使用します。

```js:nodejs
var os = require('os');
var hostname = os.hostname();
console.log(hostname);
```
`> localhost.localdomain`

`hostname`コマンドの値をとっているようです。

```shell-session:bash
[root@localhost ~]# hostname
localhost.localdomain
```

## ホスト名変更
CentOS7では、`/etc/hostname`を変更するか、`hostname`コマンドでホスト名を変更します。

```text:/etc/hostname
yournewdomain.example.com
```

`hostname yournewdomain.example.com`は再起動するまで有効で、
`/etc/hostname`は恒久的に変更したい際に使用します。

```shell-session:bash
[root@localhost ~]# hostname
yournewdomain.example.com
```

CentOS6では、`/etc/sysconfig/network`のHOSTNAMEを設定するようです。

```text:/etc/sysconfig/network
NETWORKING=yes
HOSTNAME=yournewdomain.example.com
```
たぶん`service network restart`で反映されそうです。（確認してない）


## 参考
* [How to change hostname on CentOS 6.5?](http://unix.stackexchange.com/questions/145019/how-to-change-hostname-on-centos-6-5)
* [CentOS 7 の Hostname を変更する](http://qiita.com/n-oshiro/items/d18ab37bce2b25b2d5b0)
Processing3.0.1でSVG出力

ProcessingからSVG形式で出力する為のメモ

```java:ExportSVG.pde
//SVG用のライブラリをインポート
import processing.svg.PGraphicsSVG;

//まず通常のPAppletに描画して出力する例
beginRecord(SVG, "PApplet.svg");
size(640, 480);
noStroke();
fill(0, 200, 250);
ellipse(width/2, height/2, 100, 100);
endRecord();

//次にPGraphicsに描画して出力する例
PGraphics pg;
pg = createGraphics(640, 480, SVG, "PGraphics.svg");
pg.beginDraw();
pg.ellipse(pg.width/2, pg.height/2, 100, 100);
pg.endDraw();

```

SketchフォルダにSVG形式で出力されている
Q.Promiseのnotifyは非同期的にかかないとprogressされない

Promiseまわりで有名なライブラリ[Q](https://github.com/kriskowal/q)を使ってる中でハマったのでメモ。

## 問題
QのPromiseはdoneとfailに加えてprogressにも対応しているので使いやすい。
resolveするとdoneのコールバックが呼ばれるように、notifyしたらprogressのコールバックが呼ばれる。
が、同期的にnotifyを呼ぶとコールバックが実行されない。

```js
(new Q.Promise((resolve, reject, notify)=>{
	notify('hoge');
	resolve('piyo');
})).progress((val)=>{
	//実行されない
	console.log('progress', val);
}).done((val)=>{
	//実行される
	console.log('done', val);
});
```

## 解決
ソースを見るとnextTickしてprogressのコールバックを実行している。

>```js
>    deferred.notify = function (progress) {
>        if (resolvedPromise) {
>            return;
>        }
>
>        array_reduce(progressListeners, function (undefined, progressListener) {
>            Q.nextTick(function () {
>                progressListener(progress);
>            });
>        }, void 0);
>    };
>```
>https://github.com/kriskowal/q/blob/v1/q.js

なので非同期的にかけば実行される。

```js
(new Q.Promise((resolve, reject, notify)=>{
	setTimeout(()=>{
		notify('hoge');
	}, 0);
})).progress((val)=>{
	//実行される
	console.log('progress', val);
});
```
[AngularJS] 9. ルートスコープ

---
[目次](http://qiita.com/Koizumi-Greenwich/items/3e327e3331b2f728797e)
≪前の記事 8. [カスタムディレクティブ](http://qiita.com/Koizumi-Greenwich/items/35becc74c18b2e854d09)

---
$scopeはコントローラごとに生成されるオブジェクトで、互いに隔離されています。したがって、他のコントローラの$scopeオブジェクトにアクセスすることはできません。

スコープは親子階層になっており、全てのスコープの親にあたるルートスコープ＝ **$rootScope**が存在しています。$rootScopeはどこからでもアクセス可能ですので、複数のコントローラで共通で扱いたいデータは、$rootScopeにセットすると便利です。

#$rootScopeを扱うコントローラ
コントローラで $rootScope を扱う場合は、依存サービスとして$rootScopeを指定する必要があります。

```js:$rootScopeを扱うコントローラ
//                     依存サービスに$rootScopeを指定↓
module.controller("sampleA", function($scope, $rootScope, $timeout){
    // ....
});
```

このように、module.controller()メソッドの第2引数のファクトリー関数に、$rootScopeサービスを指定します。

#テンプレート内での$rootScope
$rootScopeのプロパティは、テンプレート内では$scopeと全く同じに扱えます。

- $rootScope.hoge の値を出力 .... {{hoge}}
- $rootScope.foo.bar の値を出力 .... {{foo.bar}}

#サンプルコード

以下のサンプルは、2つのコントローラの $scope に同じプロパティをセットし互いに隔離されていることを確認、また、$rootScopeのプロパティは双方のコントローラからアクセスできることを確認するコードです。

```html:sample09.html
<!DOCTYPE html>
<meta charset="UTF-8">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jquery-datetimepicker/2.4.5/jquery.datetimepicker.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-datetimepicker/2.4.5/jquery.datetimepicker.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script>
<script>
/**
 * アプリケーション モジュール オブジェクトの定義
 */
SampleModule = (function() {
    var module = angular.module("sampleModule", []);
    
    return module;
})();

/**
 * コントローラの定義
 */
(function(module) {
    /**
     * SampleA Controller
     */
    module.controller("sampleA", function($scope, $rootScope, $timeout){
        $timeout(function(){
            $scope.child      = "Child scope of sampleA";
            $rootScope.parent = "Parent scope";
        });
    });
    /**
     * SampleB Controller
     */
    module.controller("sampleB", function($scope, $rootScope, $timeout){
        $timeout(function(){
            $scope.child = "Child scope of sampleB";
        });
    });
})(SampleModule);
</script>

<!-- sampleModule テンプレート -->
<div ng-app="sampleModule">
    <!-- sampleA テンプレート -->
    <div ng-controller="sampleA" ng-cloak>
        <h2>SampleA Controller</h2>
        <dl>
            <dt>$scope.child</dt>
            <dd>{{child}}</dd>
            <dt>$rootScope.parent</dt>
            <dd>{{parent}}</dd>
        </dl>
    </div>
    <!-- sampleB テンプレート -->
    <div ng-controller="sampleB" ng-cloak>
        <h2>SampleB Controller</h2>
        <dl>
            <dt>$scope.child</dt>
            <dd>{{child}}</dd>
            <dt>$rootScope.parent</dt>
            <dd>{{parent}}</dd>
        </dl>
    </div>
</div>
```
---
[目次](http://qiita.com/Koizumi-Greenwich/items/3e327e3331b2f728797e)
≪前の記事 8. [カスタムディレクティブ](http://qiita.com/Koizumi-Greenwich/items/35becc74c18b2e854d09)

---
Ruby | 正規表現のキャプチャでマッチしなかった時の NoMethodError に対策する

# 問題

正規表現でキャプチャを使うと。
マッチした値をハッシュで後方参照できる。

```rb
'Welcome to DIRTY House.'.match(/(?<match>DIRTY)/)[:match]

# => "DIRTY"
```

しかしマッチしなかった場合には NoMethodError が起きてしまう。

```rb
'Welcome to DIRTY House.'.match(/(?<match>CLEAN)/)[:match]

# => NoMethodError: undefined method `[]' for nil:NilClass
```

# 解決

対策として、 何も見つからなかった場合は `||` で空の配列を代入する。

```rb
('Welcome to DIRTY House.'.match(/(?<match>CLEAN)/) || {})[:match]

# => nil
```

NoMethodError ではなく nil が返るようになった。


# 環境

- Ruby 2.0.0



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
symfony/validatorのErrorCodeの数値を作成してみる

必要にかられてsymfony/validatorを使っていますが、カスタムバリデーションを作成した際にERROR_CODE系の定数にセットするハッシュ値的なものはどうやって生成するんだ？てのが気になりました。

https://github.com/symfony/validator/blob/master/Constraints/CardScheme.php#L27

とかで書かれている、

```php
class CardScheme extends Constraint
{
    const NOT_NUMERIC_ERROR = 'a2ad9231-e827-485f-8a1e-ef4d9a6d5c2e';
    const INVALID_FORMAT_ERROR = 'a8faedbf-1c2f-4695-8d22-55783be8efed';

```

の部分の定義ですね。

これって何か決まったルールがあって生成している感じなんでしょうか。わからないのででっち上げました。

https://gist.github.com/kakikubo/ec20c078825f6b209d06


rubyリハビリしたかっただけなんじゃないかというのはありつつ…
本来的にはどうするんでしょうねえ、と。ご存知でしたら教えて頂きたいです :kissing_heart:
C#での多次元配列・ジャグ配列の初期化　覚え書き


#配列を同じ値で初期化
配列を初期化する場合、初期化子を使う。

```csharp
// 10個の要素を0で初期化（newの場合は0で初期化される）
int[] table = new int[10];

// 5個の要素を1で初期化
int[] table2 = new int[]{1,1,1,1,1};
```
オーソドックスにforで回すんでもいいけどなんかカッコよくない。

```csharp
int[] table = new int[5];
for(int i; i<table.Length; i++ ){
    table[i] = -1;
}
```

要素が少ない場合は初期化子でもいいんだけど、要素数が多いときはEnumerable.Repeatで
**※ただし要素が参照型の場合は注意が必要（後述）**

```csharp
// 100個の要素を-1で初期化
int[] table = Enumerable.Repeat<int>(-1, 100).ToArray();
```
LINQのSelectを使う手もある。

```csharp
// 100個の要素を-1で初期化
int[] table = (new int[100]).Select(v => -1).ToArray();
```
※ただし0で初期化するときはnewすればオッケー

```csharp
// 100個の要素を0で初期化（intをnewした場合はゼロクリアされる）
int[] table = new int[100];
```
多次元配列でもいける

```csharp
// 100x100x100の3次元配列を0で初期化
int[,,] table = new int[100,100,100];
```
ジャグ配列の0初期化

```csharp
// 100x10のジャグ配列を0で初期化。forで回す。
int[][] table = new int[100][];
for(int i=0; i<table.Length; i++ ){
    table[i] = new int[10];
}
```
ジャグ配列を任意の値で初期化する場合。forで素直に書くとこう。

```csharp
// 5x10のジャグ配列を-1で初期化
int[][] table = new int[5][];
for(int i=0; i<table.Length; i++ ){
    table[i] = new int[10];
    for (int j = 0; j < table[i].Length; j++) {
        table[i][j] = -1;
    }
}
```
ジャグ配列を同じ値で初期化する場合（その２）
Enumerable.Repeatを入れ子にすることでも可能。
※Enumerable.Repeatを使う場合、配列の型はint [,]（多次元配列） ではなく int[][]（ジャグ配列） になるので注意。

```csharp
// 5x10のジャグ配列を-1で初期化
int[][] table = Enumerable.Repeat<int[]>((Enumerable.Repeat<int>(-1, 10).ToArray()), 5).ToArray();

// こっちはコンパイルエラー
// int[,] table = Enumerable.Repeat<int[]>((Enumerable.Repeat<int>(-1, 10).ToArray()), 5).ToArray();

```

**※注意：多次元配列を以下のような書き方で生成してはいけません。**
以下のようにRepeatを使って生成した場合、参照がコピーされてしまうため、table[0]〜table[4]に対して、new int[10]した配列がコピーされ、同じ場所をさしてしまいます。

参考：
https://qiita.com/nori0__/items/58d97201b479c3556e39#_reference-d439ef7d55bbcf2cd2a9
http://shirakamisauto.hatenablog.com/entry/2016/03/04/143710
http://emkcsharp.hatenablog.com/entry/2013/Advent

```csharp
// こちらの書き方はNG。table[0][0]とtable[1][0] が同じ場所をさしてしまう
int[][] table = Enumerable.Repeat(new int[10], 5).ToArray();
```

ジャグ配列を同じ値で初期化する場合（その3）

Enumerable.RangeとLINQのSelectを組み合わせて使う方が見やすいかもしれません。
ToArrayが入れ子になるのが若干わかりにくいですが。。。

```csharp
int[][] table = Enumerable.Range(0, 5).Select(y => (new int[10]).Select(x => -1).ToArray()).ToArray();
```


以上、覚え書きでした。


# ※多次元配列を任意の値で初期化する方法は不明。思いついたら書きます。

・参考：
[[C#]配列の初期化いろいろ](https://qiita.com/urushibata/items/f5bcae4958badab1e2ec)
ImageViewをタッチしたらハイライトさせる


画像をタップすると拡大表示させたり、画像付きボタンを使ったりするシーンはよくあると思います。以下はその画像をタップ時にピカッとハイライトさせてあげる方法です。

```java:ImageViewHighlighter.java
public class ImageViewHighlighter implements View.OnTouchListener {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                ((ImageView) v).setColorFilter(Color.argb(100, 255, 255, 255));
                break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                ((ImageView) v).setColorFilter(null);
                break;
        }
        return false;
    }
}
```

```java:呼び出し側
imageView.setOnTouchListener(new ImageViewHighlighter());
```

ImageViewを継承しているImageButtonでも使用できます。
dotinstall「WordPress入門」で躓いたポイント

#mysql>の画面にする方法がわからない
→ターミナルで、下記の手順でmysqlにログイン（接続）する。
①`cd MyVagrant`
②`cd mycentos`　・・・centosが入っているフォルダに移動
③`vagrant up`　・・・起動
④`vagrant ssh`　・・・接続
⑤`mysql`　・・・ログイン（接続）

#Access denied for user ''@'localhost' to database 'dotinstall_wordpressとエラーが出て対処法がわからない
→権限がないので、権限を与えてあげる。ターミナルで、下記の手順でデータベースを作成できるようにする
①`mysql -u root`　・・・rootユーザーでログイン
②`set password for root@localhost=password('パスワード');`　
   ・・・rootユーザーは権限が大きいのでパスワードを設定する
③`exit`　・・・一度ログアウト
④`mysql -u root -p`　・・・-pでパスワード付きでログインする
⑤`create database dotinstall_wordpress`　・・・rootでデータベース作成
⑥`grant all on dotinstall_wordpress.* to dbuser@localhost　identified by 'パスワード';`　
 ・・・作業用ユーザー(dbuser)へdotinstall_wordpressの権限を与えて、作業用ユーザーを利用

#Access denied for user 'root'@'localhost' (using password: NO)の対処法
→パスワード設定しているのに、-pを利用してパスワード入力していないのが原因
`mysql -u root -p`

おわり
THETA SをRaspberryPi2に接続したら自動的にustreamに配信するようにしてみた

[THETA S + Raspberry Pi 2でライブストリーミングしてみた - Qiita](http://qiita.com/syumai/items/ccf4a0116c3986e90c74)を参照してRaspberryPI2にTHETA Sをライブストリーミングモードでさしたら自動的にustreamに投稿するようにしてみた。
忘れてしまうのでやったことを記録しておく。

# その他参照サイト

[mount - Autorun a script after I plugged or unplugged a USB device - Ask Ubuntu](http://askubuntu.com/questions/284224/autorun-a-script-after-i-plugged-or-unplugged-a-usb-device)を参照してTHETAが接続されたらスクリプトを自動起動するように設定
gstreamerの使い方は[Raspberry Piを弄り倒す【自宅用ペット監視用カメラ設定編】 | 馬鹿王きんぐが全ぶっぱ！](http://blog.kof238.net/zenbuppa/archives/296)を参照

# やったこと

Raspbian 8.0 (jessie)で確認

/home/pi/stream.shに以下のスクリプトを作成

```bash
#! /bin/sh

sleep 1

# [url]と[key]はUstreamのダッシュボード→チャンネル設定→(配信対象チャンネル)→ライブ配信設定→エンコーダー設定で確認
RTMP_URL="[url]"
STREAM_KEY="[key]"

FLASHVER='FME/3.0%20(compatible;%20FMSc%201.0)'

LOCATION="$RTMP_URL/$STREAM_KEY live=1 flashver=$FLASHVER"

CMD="gst-launch-1.0 v4l2src ! videoconvert ! omxh264enc ! h264parse ! flvmux ! rtmpsink location='$LOCATION'"

$CMD &
```

ライブストリーミングモードのTHETAをさして確認

```bash
$ lsusb
Bus 001 Device 006: ID 05ca:2711 Ricoh Co., Ltd 
# => VendorID:05ca
# => ProductID:2711
```


/etc/udev/rules.d/00-usb-theta.rulesを作成して以下のようにする。

```bash
ACTION=="add", ATTRS{idVendor}=="05ca", ATTRS{idProduct}=="2711", OWNER="pi", RUN+="/home/pi/stream.sh"
```

THETAをさしなおしてustreamに配信されることを確認。

# はまったこと

実行スクリプトに#! /bin/shがなくて以下のページと同じエラーが発生していた。
[debian - Executing backup script on external HDD plug using udev - Unix & Linux Stack Exchange](http://unix.stackexchange.com/questions/136287/executing-backup-script-on-external-hdd-plug-using-udev)

ログは以下のように確認した。

```bash
$ sudo vi /etc/udev/udev.conf
# => udev_log="info"追加
$ sudo /etc/init.d/udev reload
$ sudo less /var/log/syslog 
```

# 課題

しばらくするとgstreamerが落ちたりする。
調べてた範囲では原因よくわからなかった。

最初はTHETAをさした瞬間にwifiドングルを認識しなくなったりと問題が出ていたが、[Raspberry Pi用にUSBハブを購入する | ものづくりエクスペリメント](http://denshikousaku.net/raspberry-pi-usb-hub)を参照して、電源供給したUSBハブごしにTHETAなどを接続するようにしたら解消した。
WebStormのメモリ設定の場所(osx)

ファイルの場所は、
/Users/[名前]/Library/Preferences/WebStorm12/webstorm.vmoptions
中身は、

```
-Xms2048m
-Xmx4096m
-XX:MaxPermSize=1024m
-XX:ReservedCodeCacheSize=518m
-XX:+UseCompressedOops
```
こんな感じで。
バッチファイルのあるフォルダにCHDIR/PUSHDする

別のドライブ/フォルダのバッチファイルを起動したときに「バッチファイル内のファイルを指定する」記述で問題が発生することがあります。これを回避するためにそのフォルダへCHDIR/PUSHDするため%~dp0という特殊な指定をします。

それぞれの文字は以下のような意味を持ちます。
>（CALLコマンドヘルプより引用：）
>%0：バッチファイルのフルパス
>%~0：すべての引用句 (") を削除して、%0 を展開
>%~d0：%0 をドライブ文字だけに展開
>%~p0：%0 をパスだけに展開します

```batch:sample(ドライブレター対応_UNC非対応).bat 
cd /d "%~dp0"
copy .\hoge.txt "%temp%"
```
```batch:sample(UNC対応).bat 
pushd "%~dp0"
copy .\hoge.txt "%temp%"
```

[](http://qiita.com/shinichiro106/items/efb5052ef5fb8138c26d)
zabbixのログ監視をfluentdで数値化してグラフを作成する

zabbixのログ監視では正規表現での検索抽出も出来るのですが、数値としては扱われないのでグラフ作成のアイテムに使用出来ません。
そこでfluentdを経由してログから数値化したカウント値をzabbixへ送信してグラフ作成してみます。
今回の例では、ルーターでフィルターしているポートスキャン状況をsyslog出力してグラフ化します。
外部からの攻撃傾向を見える化して監視する事はセキュリティ向上に繋がります。

# **前提条件**

zabbixサーバー、zabbixエージェント、rsyslogの準備が出来ている事とします。
ルーターはYAMAHA RTXシリーズのsyslogファイルになります。
パスは、/var/log/rsyslog/rtx1200/syslog.txt

# **fluentd準備**

ログ収集加工のフレームワークとも言えるfluentdを利用します。
プラグイン機能を追加する事で、様々な入出力が可能になります。
http://www.fluentd.org/

rsyslog自体からの置き換えも可能ですが、今回はrsyslogを流用します。

インストール方法は公式サイトが分かりやすいです。
http://docs.fluentd.org/v0.12/categories/installation

ubuntu Trustyの場合
`# curl -L https://toolbelt.treasuredata.com/sh/install-ubuntu-trusty-td-agent2.sh | sh`

使用するプラグインをインストールします。

zabbixプラグイン
`# sudo /opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-zabbix`
zabbixへ出力するプラグインでfluentdとzabbixが連携出来ます。

datacounterプラグイン
`# sudo /opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-datacounter`
検索一致した数をカウントした数値を出力します。

# **fluentdでログファイルから検索一致した数のカウント値を求める**

まずは入力側を設定します。

````lang:/etc/td-agent/td-agent.conf
<source>
  type tail
  format none
  path /var/log/rsyslog/rtx1200/syslog.txt
  pos_file /var/log/td-agent/rtx1200syslog.txt.pos
  tag rtx1200-syslog
</source>
````

typeはtailでformatをnone設定することで、RTX1200ルーター出力ファイルのtailを入力出来ます。
状況に合わせてformatを設定します。
apache等のよくあるログ形式には既存のformat形式があります。また、正規表現でformatを自作する事も可能です。
tagに指定した名前で入出力設定を連携出来ます。

次に出力側を設定します。ここでは2回に分けて設定しています。
tag指定の名前が一致するのが条件になります。また、最初に一致したものしか有効になりません。
以下の順にtag連携して処理されます。
source「rtx1200-syslog」　→　match「rtx1200-syslog」　→　match「rtx1200-syslog.filter」

````lang:/etc/td-agent/td-agent.conf
<match rtx1200-syslog>
  type datacounter
  unit minute
  count_key message
  tag rtx1200-syslog.filter
  pattern1 ssh ^.*filter: TCP.*>.*:22.*$
  pattern2 telnet ^.*filter: TCP.*>.*:23.*$
</match>

<match rtx1200-syslog.filter>
  type zabbix
  zabbix_server 127.0.0.1
  host localhost
  name_key_pattern rtx1200-syslog_(unmatched|ssh|telnet)_.*
</match>
````

最初(rtx1200-syslog)は、typeにプラグインのdatacounterを設定。
ログファイルから一致する正規表現のパターンに応じてカウントします。
ここでは、TCPの22番と23番を検索しています。最大20パターンが指定出来るようです。

次(rtx1200-syslog.filter)は、typeにプラグインのzabbixを設定。
zabbixサーバーのIPアドレスとホスト名を指定します。
キーのパターンは、datacounterでパターン設定した名称を正規表現で抽出します。
設定したパターンに合わない場合は、unmatchedの名前が付きます。
ただしformatをnoneにした場合にはすべての行が対象になるので注意。

# **fluentdの再起動**

設定ファイルが出来たらサービスを再起動します。
`# service td-agent restart`

# **zabbixのアイテム設定**

以下の様にアイテムを作成します。

名称：任意の名前
タイプ：Zabbixトラッパー
キー：fluentdでzabbixプラグインに設定したキーのパターン
データ型：数値(整数)
データの形式：10進数

キーのパターン指定方法は今回の場合は以下の通り。
sshのカウント値：rtx1200-syslog_ssh_count
telnetのカウント値：rtx1200-syslog_telnet_count
パターン以外のカウント値：rtx1200-syslog_unmatched_count

カウント(count)以外にパーセンテージ(percentage)とレート(rate)のキーがあります。
それぞれアイテムとして作成が可能です。

これらのアイテムは数値として扱われるので、グラフ作成のアイテムに使用が出来ます。
[PHP] print_r、var_dump、var_export のちがい

# ![](//goo.gl/tuSQrq) 実行結果

#### 実行ソース

```php:PHP
<?php
$data = array(
	"A" => "Apple",
	"B" => "Banana",
	"C" => "Cherry"
);

echo "---print_r---\n";
print_r($data);

echo "---var_dump---\n";
var_dump($data);

echo "---var_export---\n";
var_export($data);
?>
```


```php:出力結果
---print_r---
Array
(
    [A] => Apple
    [B] => Banana
    [C] => Cherry
)

---var_dump---
array(3) {
  ["A"]=>
  string(5) "Apple"
  ["B"]=>
  string(6) "Banana"
  ["C"]=>
  string(6) "Cherry"
}

---var_export---
array (
  'A' => 'Apple',
  'B' => 'Banana',
  'C' => 'Cherry',
)
```

#### 解説

出力形式はそれぞれ微妙に異なります。
print_r、var_dump、var_export の各関数は、結果を画面に表示（標準出力）するので、頭に echo 等を付ける必要はありません。


⇒ <a href="http://ideone.com/kFX4Cc" target="_blank">デモソースはこちら</a>

# ![](//goo.gl/tuSQrq) 出力結果を変数へ格納する

#### 変数への格納

print_r と var_export 関数は、第２引数を true にすると出力結果を return してくれるようになります。
`$result = print_r($data, true);`
`$result = var_export($data, true);`
<br>

#### ファイル出力

<a href="http://php.net/manual/ja/function.error-log.php" target="_blank">error_log 関数</a>と併用することで、ログファイルに出力することもできます。

```php:PHP
// 下記の「3」はファイル出力する指定
error_log(var_export($data, true), 3, "./log.txt");
```

<font color="#dd0000">※正常に log.txt が出力されない場合、たいていはパーミッションの不足が原因です（＝書き込み権限が無い）</font>

(･o･ゞ いじょー。
AngularJSでtemplateっぽく値を別htmlに渡す

 Angularで

```html
<div class="aaaa">
  {{hoge}}
</div>

<div ng-repeat="item in items">
  <div class="aaaa">
    {{item.hoge}}
  </div>
</div>

```
みたいな時にaaaaのところを共通化するいい方法ない?
って聞かれたので、やり方を考えてみる......

**AngularにはDirectiveがあるよ！**
[Custom Directive](https://docs.angularjs.org/guide/directive)で実現できる気がしたので、ちょっと調べた。

# Custom Directiveによる別htmlのInclude
単純にhtmlをDirectiveにして呼び出すのはすごく簡単

```html
<custom-directive></custom-directive>

```

```js
angular.module('MyApp', [])
  .directive('customDirective', function() {
    return {
      restrict: 'E',
      templateUrl: 'template/test.html'
    };
  });

```
上記だけで、指定位置に*/template/test.html*のHTMLを挿入できる。
パスじゃなく、直接HTMLタグを書くことも可能

```js
angular.module('MyApp', [])
  .directive('customDirective', function() {
    return {
      restrict: 'E',
      template: '<div>hoge</div>'
    };
  });

```

templateがhtml指定するためのオプションだとして、*restrict*はdirectiveの呼び出し方の制限っぽい

```
'A'：属性
’E'：要素
’C'：クラス名
```
で呼び出しの制限ができる。

```html

’A' : <div custom-directive></div>
'E' : <custom-directive></custom-directive>
'C' : <div class="custom-directive"></div>
```
こんな感じ。 テンプレートとして使うなら'E'が良い気がする

#Directiveに値を渡すには
で、今回のメインとなる値の渡し方。
Directiveにはいくつかオプションがあるが、scopeオプション使えば、Directive内のスコープを制御できる。

```html
<custom-directive val='hoge'></custom-directive>

```

```js
angular.module('MyApp', [])
  .directive('customDirective', function() {
    return {
      restrict: 'E',
      scope: {
          val: '@val'
      },
      template: '<div>{{val}}</div>'
    };
  });

```

結論だけ書くと、scopeにオブジェクトを指定することで、値が渡せるっぽい。
あとは、Directive自体にng-repeatでループかければ、完成

```html
<custom-directive val='hoge'></custom-directive>

<custom-directive ng-repeat="item in items" val={{item.hoge}}></custom-directive>

```

```js
angular.module('MyApp', [])
  .directive('customDirective', function() {
    return {
      restrict: 'E',
      scope: {
          val: '@'
      },
      template: '<div class="aaaa">{{val}}</div>'
    };
  });

```

他にもいろんなオプションあって色々できるらしいが、とりあえずここまで。
Embulk コア開発者向け、Gradleのバージョンアップ手順

[Embulkのコア](https://github.com/embulk/embulk)の開発者の方が
諸般の事情でEmbulk内のgradleのバージョンを上げたい時に作業をする手順です。

プラグイン内のgradleは、``embulk migrate``でアップデートされるので本作業は不要です。

## gradleの導入

```
brew install gradle
```

## 新しいgradleラッパーの生成

もしかするとEmbulk内の``./gradlew wrapper --gradle-version 2.XX``でも大丈夫かも(未確認)

```
gradle wrapper --gradle-version 2.10
:wrapper

BUILD SUCCESSFUL

Total time: 1.068 secs
```

## 生成されたファイルの確認

上記コマンドで次のファイルが生成されます。

```
.
|-- gradle
|   `-- wrapper
|       |-- gradle-wrapper.jar
|       `-- gradle-wrapper.properties
|-- gradlew
`-- gradlew.bat
```

## ファイルのコピー

それぞれ次の場所にコピーします。

* gradle
  * lib/embulk/data/new/java/gradlew
  * gradlew
* gradle.bat
  * lib/embulk/data/new/java/gradle
  * gradle.bat
* gradle/wrapper/gradle-wrapper.jar
  * lib/embulk/data/new/java/gradle/wrapper/gradle-wrapper.jar
  * gradle/wrapper/gradle-wrapper.jar
* gradle/wrapper/gradle-wrapper.properties
  * lib/embulk/data/new/java/gradle/wrapper/gradle-wrapper.properties
  * gradle/wrapper/gradle-wrapper.properties
  
gradlew, gradlew.batは内容が一緒で、入れ替え不要の場合もあると思います。
  
## if文の修正

``embulk migrate``した時に``gradle-wrapper.jar``と、``gradle-wrapper.properties``を置き換えするように``migrator.match``の部分を修正します。

```lib/embulk/command/embulk_migrate_plugin.rb
    # upgrade gradle version
    if migrator.match("gradle/wrapper/gradle-wrapper.properties", /gradle-2\.\d-/)
      # gradle < 2.10 (\d matches one digit)
      require 'embulk/data/package_data'
      data = PackageData.new("new", migrator.path)
      migrator.write "gradle/wrapper/gradle-wrapper.properties", data.content("java/gradle/wrapper/gradle-wrapper.properties")
      migrator.write "gradle/wrapper/gradle-wrapper.jar", data.bincontent("java/gradle/wrapper/gradle-wrapper.jar")
    end
```

## プルリクエスト

プルリクエストをしてください。

## 参考

* [GitHub Issue#362 Gradle 2.10](https://github.com/embulk/embulk/pull/362)
* [5.2. Adding the Wrapper to a project](https://docs.gradle.org/current/userguide/gradle_wrapper.html)
波ダッシュ、全角チルダまとめ


# 波ダッシュ
〜
U+301C

- Macの日本語入力でShift+~を入力するとこれ。
- Mac版Google日本語入力でShift+~を入力するとこれ。
  - ちなみに「ちるだ」で変換して出てくるのもこれになる（なぜ！）

## RubyのString#encode
- SJISの場合は変換出来ず例外が発生する。
- Shift_JISの場合は0x8160に変換可能。

※SJISは、Windows-31J, CP932のエイリアス
[class Encoding (Ruby 2.3.0)](http://docs.ruby-lang.org/ja/2.3.0/class/Encoding.html)



# 全角チルダ
～
U+FF5E

- Microsoft IMEでShift+~を入力するとこれ。

## RubyのString#encode
- SJISの場合は0x8160に変換可能。
- Shift_JISの場合は変換出来ず例外が発生する。


# Ruby的まとめ

- UTF-8をSJISに変換する場合は、U+301CをU+FF5Eに事前に変換すると良さそう
- UTF-8をShift_JISに変換する場合は、U+FF5EをU+301Cへ事前に変換すると良さそう


# 未確認要素
Windows版Google日本語入力でShift+~を入力した時、波ダッシュと全角チルダのどちらになるかは未確認。
MSYS2でvagrant sshできない問題の解決策

## 問題

WindowsでMSYS2を使っていて、`vagrant ssh`を実行しようとすると、以下のようなエラーが出て接続できない場合がある。

```
Pseudo-terminal will not be allocated because stdin is not a terminal.
```

この場合は、MSYS2環境上にOpenSSHをインストールすることで解決する可能性がある。

## 環境
Windows 7 Professional
MSYS2 + MinGW64
Vagrant 1.8.1
VirtualBox 4.3.26

## 手順

リポジトリの更新を行った後、最新のbashやpacmanをインストールする。

```
$ pacman -Sy
$ pacman --needed -S bash pacman pacman-mirrors msys2-runtime
```

一度シェルを再起動する。
次にシステム全体の更新を行う。

```
$ pacman -Su
```

基本開発環境をインストールする。

```
$ pacman -S base-devel
```

gccや各種ライブラリ等をインストールする。

```
$ pacman -S mingw-w64-x86_64-toolchain
```

OpenSSHをインストールする。

```
$ pacman -S openssh
```

これで`vagrant ssh`が正常に実行できるはず。
出来ない場合は再度シェルを再起動してみるとよい。

## 参考
[MSYS2＋VagrantによるWindowsでのUNIX環境 – tamo's blog](https://tamosblog.wordpress.com/2014/12/25/msys2_vagrant_1/)
RubyMotionでStoryboardを使う




## プロジェクトを作成

```
$ motion create storyboard_test
$ cd storyboard_test
```

## Storyboardファイル作成

XcodeでWorkspaceを作成します。

![スクリーンショット 2016-01-14 15.35.28.png](https://qiita-image-store.s3.amazonaws.com/0/8941/b88010b9-51d5-449c-43c3-6917ed9a2bda.png "スクリーンショット 2016-01-14 15.35.28.png")

左のファイルとグループの領域で右クリックをしAdd Files to ... を選択します。

![スクリーンショット 2016-01-14 15.39.13.png](https://qiita-image-store.s3.amazonaws.com/0/8941/e0165ea5-a22b-0d36-fcd8-b08c1bffbb75.png "スクリーンショット 2016-01-14 15.39.13.png")

RubyMotionプロジェクトのフォルダーを選択しますが、この時OptionsでCreate groups for any added foldersを選択します。

![スクリーンショット 2016-01-14 15.41.47.png](https://qiita-image-store.s3.amazonaws.com/0/8941/57341b4b-d6f5-b91e-9603-8c5a15b4040c.png "スクリーンショット 2016-01-14 15.41.47.png")

フォルダーが黄色で表示されていればOKです。

resourcesフォルダー上で右クリックしNew File...を選択します。

![スクリーンショット 2016-01-14 15.48.14.png](https://qiita-image-store.s3.amazonaws.com/0/8941/0b614bf6-b6a9-2431-bace-c2273817d12d.png "スクリーンショット 2016-01-14 15.48.14.png")

Storyboardを選択して作成します。

![スクリーンショット 2016-01-14 15.49.59.png](https://qiita-image-store.s3.amazonaws.com/0/8941/37fa6b80-e7dc-1ff7-7402-816edaca693e.png "スクリーンショット 2016-01-14 15.49.59.png")

UIViewControllerを追加し、Is Initial View Controllerにチェックを入れます。

![スクリーンショット 2016-01-14 15.51.24.png](https://qiita-image-store.s3.amazonaws.com/0/8941/cad2fc2f-99e1-9b38-9085-b4ccd47cc3b4.png "スクリーンショット 2016-01-14 15.51.24.png")


## Rakefileの編集

RakefileにStoryboardを使うことを指定します。

 ```app.info_plist['UIMainStoryboardFile'] = 'Storyboard'```の行です。


```Rakefile
Motion::Project::App.setup do |app|
  # Use `rake config' to see complete project settings.
  app.name = 'storyboard_test'

  # ここを追加
  app.info_plist['UIMainStoryboardFile'] = 'Storyboard'

end
```


## app_delegate.rbの編集

windowメンバ変数を追加し、-application:didFinishLaunchingWithOptions:ではもともとあったコードを削除しtrueを返すだけにします。


```app_delegate.rb
class AppDelegate
  
  # ここを追加
  attr_accessor :window
  
  def application(application, didFinishLaunchingWithOptions:launchOptions)
    true
  end
end
```

## 確認

```sh
$ rake
```


![スクリーンショット 2016-01-14 16.00.40.png](https://qiita-image-store.s3.amazonaws.com/0/8941/df40c7bc-83b0-0d06-32c7-a4c53dd377e7.png "スクリーンショット 2016-01-14 16.00.40.png")

## 後書き

前に試した時にダメだったのでずっと-application:didFinishLaunchingWithOptions:内でStoryboardを読み込むコードを書いて使ってたんですが、久しぶりに試したら下のメッセージが出てwindows propertyがないためだと分かった次第です。

```
The app delegate must implement the window property if it wants to use a main storyboard file.
```
研修コースのつくりかた

研修コースをはじめて企画する人向けにレクチャーする機会があるので，まとめてみた．
新人研修を検討する時期なので，これからはじめて研修を企画しようとする人に何かしら考えの整理に繋がればうれしい．

## 研修もプログラム
プログラムを考えるとき，IOがあってから処理を考えるように，研修も同じように考えられる．

- Input: 受講者のスキル・知識の前提
- Output: 受講したあとの到達目標
- 処理: 研修プログラム

(個人的にはカリキュラムやアジェンダというよりプログラムと今後言っていきたい)

また，プログラミングにおける制約条件(マシンスペックやOS etc.)も，研修では，

- 期間
- 1日の許容時間
- 場所(リモート/オンサイト etc.)
- 環境(ネットワーク環境や電源，受講者のPCスペック etc.)
- お金(予算,テキスト,トレーナー etc.)

などの項目に置き換えることができる．
ちなみに，プログラミング同様，制約条件から考えたほうが考えが進むと思う．

## サンプルプログラム
初心者向けJavaオブジェクト指向プログラミングの習得という研修を考えてみる．

- input: コンピュータの中身を知らない人と定義
  - 初心者、初級者の定義は本当に難しい一方で, コースを案内する側は使いたい
- output: サンプルクラスを継承してオリジナルのプログラムが作れるレベルと定義
  - この習得という言葉も曖昧性を生み出すことが多い 
- 処理
  - プログラムが動く仕組み
  - コンピュータの種類
  - コンピュータの仕組み
  - OSの仕組み
  - プログラミング言語
  - 開発環境
  - Javaの世界
  - Javaの構文
  - オブジェクト指向の世界
  - Javaオブジェクト指向プログラミングのテクニック
  - 演習
  - おわりに ~デザインパターンの小話

## 段階的詳細化
どんな巨大なシステムでもWBSで分割してやるように，新人研修という比較的長期にわたる場合も，同じように考えられる．以下はサンプル．

- output: どんな部署にいっても一通り戦力になる
- 処理:
  - サーバーサイドプログラミング
  - クライアントサイドプログラミング(Web/モバイル)
  - データベース
  - OS等のシステムインフラ
  - ネットワーク
  - セキュリティ
  - チーム開発プロセス(設計，CI，コードレビューなど)
  - 開発マネジメント(スクラムなど)

ここからさらに段階的詳細化．

- データベース
  - DBMSのアーキテクチャ
  - SQL/DML
  - DBAのやること
  - バックアップとリカバリ
  - テーブル設計
  - 計測とチューニング
  - NoSQL

で、さらにSQLを段階的詳細化してというように繰り返し、このSQLのようなレベルがワークパッケージとして考えられる．
なお，プロジェクトの見積もり同様，実質的な所要期間や費用の見積もりは，このワークパッケージ単位で考える．

## 研修プログラムにおけるアルゴリズム
プログラミングにおけるアルゴリズムと同様に，研修プログラムもある程度パターン化できることがある．ちなみに，定量化して効果を計測してはいないので，以下は完全に私の主観．
なので，色々こういうパターンがあるよ，など知見が貯まると更に良いなぁと思う．
なお，クイックソートなどの名前はまだない．
(アカデミックに教育を研究している人なら，ちゃんと定量的に証明して，名前も付けてそうなので，指摘してもらえるとうれしい)

### 演習は講義の2倍のコスト
講義で聞いても使えるレベルには至らないので，実用系であれば，必ず演習をすることになるのだが，それは講義に使った時間の少なくとも倍以上の時間を割くと良いよというもの．もちろん，理想論なので，あとは宿題でやってね，ということで切り上げるのが常道．
### まとめて演習は危険
バッチ処理のように全部講義をして，まとめて一気に演習をやるなど考えられるが，だいたい朝にやった講義は，その日の終わりには忘れているケースが多く，出来る限り，しょっちゅう演習するほうがよい．
### 事前学習は2割が前提
期間等の制約から事前学習をするケースがあるが，事前学習を完全にこなしてくるような意識高い人は，全受講者で2割いれば良い方だよ，というもの．受講前提がマストになる場合は，事前のテストをやってクリアした人だけが参加できる，というように厳密にしたほうが良い．(だから入試は必要なんだねと思う)
### 内容をわからない人に合わせるか，分かる人に合わせるか問題
これは完全に，その研修コースのオーナー(研修担当者というより部長などの決定権者)の考え方による．特に企業での研修は，スキルの平準化を研修目的とするケースが多く，研修で落第者が増えてしまうと負債 になるため，わからない人に合わせるケースが多い．(社員の時間を割いているので，少しでも回収したいし，新人研修の場合は試用期間であってもNGを出すことは，結構勇気がいる)
ちなみに，オーナーから，分かる人にあわせてくれと言われても，わからない人が多数の場合，それに合わせるトレーナーが多い．(アンケート結果が悪いと，どうやっても次の機会に差し支えが出るのと，精神衛生上もやりづらい)

### スコープは広めに取ると死ぬ
研修プログラムとは完全に別な話だが，これもあるあるなので入れておく．これはコースを考える人で，さらにそれにより利害を受ける人が特にハマりやすい．(例えば，研修コースで受講料を取る場合や参加人数が評価対象になる場合など)
これは書籍でも同じようなことが起こるのだが，例えば，

- コース名: Essential Java
- 概要: 現場の必須ワザをマスターできます
- 時間: 2時間

このようなコースは，曖昧さが原因となり，必ずアンケート結果はズタズタになり，二度と開催できなくなる．
コースを考える人はどうしても，いい感じのタイトルと参加制約(場所や拘束時間)を下げるなどして，スコープを広く取って参加者を多く集めたいので，初心者層も中級者も狙いたくなる．

## まとめ
研修コースもプログラムとして考えると，整理しやすいよということと，研修プログラムにも定番アルゴリズムがあるよということを書いた．
特に研修プログラムの定番のアルゴリズムはどっかでまとまっているとうれしいなぁ．
AppleScriptでEvernoteのタグ作成時、親タグを指定できないバグを回避するハンドラ



* AppleScriptでEvernoteのタグを作成するときのバグ
	* 親タグを指定しても反映されない
	* 常に最上位のタグになってしまう

```applescipt:タグの作成時に親タグを指定できないバグ.scpt
tell application "Evernote"
	set newTag to make tag with properties {name:"Child Tag", parent:tag "Parent Tag"}
	properties of newTag
end tell
--> {class:tag, name:"Child Tag", parent:missing value}
```

* 上のスクリプトで最終行に`parent:missing value`とある
	* 親タグを指定したにもかかわらず最上位のタグになっている
	* 本来なら`parent:tag "Parent Tag" of application "Evernote"`となるべき
* バグを回避する方法
	* タグを作成した後に親タグを指定する
* ハンドラにしたのが下のスクリプト


```applescript:makeNewTag.scpt
tell application "Evernote"
	set newTag to my makeNewTag("Child Tag", tag "Parent Tag")
	properties of newTag
end tell
--> {class:tag, name:"Child Tag", parent:tag "Parent Tag" of application "Evernote"}

on makeNewTag(tagName as text, parentTag)
	tell application "Evernote"
		set newTag to make tag with properties {name:tagName}
		set parent of newTag to parentTag
	end tell
	return newTag
end makeNewTag
```


## 更新履歴

* 2014-07-12: Evernote for Mac 5.6.0へアップデート時に当バグ発生のため作成
ESXi の VM に USB HDD（USBデバイス） を追加する

# ESXi 上の VM に 外付けUSB HDD（USBデバイス）を追加する方法
些細な手順を知らなくてはまりかけたので備忘録代わりに
USB HDD 以外のUSBデバイスも同じように接続出来ると思われます
ESXi の Version は5.5で実施しました

## USB HDD（USBデバイス）を接続する（物理）
ホストマシンに、USB HDD（USBデバイス） を挿します

## VM の「ハードウエア」に USB コントローラを追加
「追加」->「USB コントローラ」  

![esxi_usb_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/9906/923bc6de-a7b3-61ff-e3ef-3f434403e5a9.jpeg)

## VM の「ハードウエア」に USB デバイスを追加
「追加」->「USB デバイス」->「接続したいUSBデバイスを選択する」

![esxi_usb_2.jpg](https://qiita-image-store.s3.amazonaws.com/0/9906/daa206a6-530b-c735-35b8-110c70477da1.jpeg)

でれで、VMからUSB HDD（USBデバイス）が参照可能となります。
AWS IoTで デバイスが切断されたことを知る方法

AWS IoTが10月にBetaとして登場した時、MQTTの"Will"の機能はありませんでした。
参考: [AWS IoT Message Brokerに一般のMessage Brokerにあるべき実装がない理由を考えてみた。](http://dev.classmethod.jp/cloud/aws/why-is-there-different-between-aws-iot-message-broker-and-general-one/)

ところが、今のドキュメントを見ると、[Device Shadows Data Flow](http://docs.aws.amazon.com/iot/latest/developerguide/thing-shadow-data-flow.html)には以下の記載があります。

> If you want to determine if a device is currently connected, include a connected 
> setting in the thing shadow and use an MQTT Last Will and Testament (LWT) message that 
> will set the connected setting to false if a device is disconnected due to error.

このような機能は最初無かったと思うのですが、追加されたのでしょうか？
AWSのドキュメントが変更されたことをお知らせしてくれるサービスとかあったらいいのに・・

実際に試してみるのは簡単で、例えば thing-passthrough-example.js なら、以下のようにすれば"Will"メッセージを設定することができます。
https://github.com/aws/aws-iot-device-sdk-js/blob/master/examples/thing-passthrough-example.js

```
const thingShadows = thingShadow({
  keyPath: args.privateKey,
  certPath: args.clientCert,
  caPath: args.caCert,
  clientId: args.clientId,
  region: args.region,
  reconnectPeriod: args.reconnectPeriod
  will: {
    topic: '$aws/things/thingname/shadow/update',
    payload:  '{ "state" : { "reported" : { "connected" : "false" }}}'
  }
});
```

上記の例だと、$aws/things/thingname/shadow/update を subscribe していれば、デバイスが切断した時にWillが送信されて来ます。
MySQL: NULLは比較できない

MySQLに限ったことではないかもしれませんが、NULL値は「IS (NOT) NULL」でしか比較できず...
比較演算子とか、IN句とかどうしても使いたい時は、IFNULL([変換対象], [変換後の値])で一旦何かの文字列に変換してから比較。
B3向け Gitやら勉強会

# B3向け　GitHub勉強会

## 参考URL
 * [無料Private リポジトリ](http://blog.falconsrv.net/articles/471)
 * [Git Flow](http://qiita.com/jshimazu0820/items/066e061eef700caa1c68)
 * [Usage Git](http://www.slideshare.net/kotas/git-15276118?qid=f09e81ae-a09a-4d72-8373-4b17cb7debcc&v=qf1&b=&from_search=1)
    * http://programmerbox.com/2013-07-17_git_summary/
    * http://k.swd.cc/learnGitBranching-ja/
 * Slide
     * [Intro](http://www.slideshare.net/ihcomega/2git?qid=f09e81ae-a09a-4d72-8373-4b17cb7debcc&v=qf1&b=&from_search=26)
         * 最初の導入には使えそう，中盤辺りは微妙
     * [使えそう](http://www.slideshare.net/pupupopo88/gitgithub-49810266?qid=f09e81ae-a09a-4d72-8373-4b17cb7debcc&v=qf1&b=&from_search=29)
         * VCSについてのメリットからかいてあるのでよさ気

## 開発する上で使えそうな奴
* [GitHub](https://github.com/)
* [Git for Windows](https://git-for-windows.github.io/)
* [slack](https://slack.com/)
* [Cygwin](https://www.cygwin.com/)
    * てかなんでもよいのでコンソール系のソフト
* なんにしてもパッケージ管理ツール
    * グループで開発する場合，ライブラリのバージョンがことなるといろいろ死ぬこともあるので合わせる場合とても便利な奴
    * Java
        * Maven
        * Gradle
        * SBT
    * C++, C#
        * NuGet
            * Visual Studioのツール
* Testツール
    * Java
        * JUnit
    * C++
        * よくしらないけどCppUnit?
    * テストはコードを修正した後にそこコードがしっかり機能するかどうかを担保する意味で重用です。
        * 研究というコンテキストの場合，書くかどうかは置いておいて知っておく必要はあると思います。
        * コンテストでソースコードを提出する場合，同じコードだとしてもTestのありなしだと印象は全然違ってくると思います。
OnionOmegaでハード開発入門〜その1.5〜 スイッチが壊れました。

# OnionOmegaのスイッチを入れようとしたら壊れた。
[先日OnionOmegaのセットアップ](http://qiita.com/kwnpanda/items/2b2da699c8d5b5485b92)について書きました。

## 今回やろうとした事
1. Pythonインストール
2. SlackでWebAPI使うためのToken作る
3. OnionOmegaでSlackの投稿を取得する

## 今日の作業開始
### スイッチオン！
![IMG_0284.JPG](https://qiita-image-store.s3.amazonaws.com/0/24991/9df8c365-51b5-ccdc-f0ca-e2ac6d3a82ad.jpeg)

割と力入れてしまった気がします。**バキッ**っていう音がして焦ってスイッチを見てみると。。。

### 壊れた。
![IMG_0285.JPG](https://qiita-image-store.s3.amazonaws.com/0/24991/b21fc699-eeca-5872-ddc6-263c977aae7c.jpeg)

### これが本来の姿
![OM-D-EXP-01_1024x1024.png](https://qiita-image-store.s3.amazonaws.com/0/24991/3bafab44-a150-7419-6076-f4e37d7c5ae8.png)

## さてどうしよう
パワーオンになって折れたのならまだしも、オフのまま折れました。
モチベーションが結構高かっただけにガッカリしつつも、とりあえず他にもこんな事やっちゃった人がいないか公式のCommunityなどで見てみる事にしました。


[https://community.onion.io/](https://community.onion.io/)

*broken power* っていうワードで検索したらどうやらいました。同じように困っている人
![FireShot Capture 5 - Onion Community_ - https___community.onion.io_search_power broken.png](https://qiita-image-store.s3.amazonaws.com/0/24991/6cf91b69-38b8-0b96-8c40-7b29df955f46.png)

記事を読んでいくとプロダクト開発者の方もコメントして「本当にすみません。改良に活かしたいと思います」とかどうやら壊れた人は複数いるらしく、「新しいの買うわ〜」「リリースしたばっかりだし。これからだよね」みたいな感じでクレームとかの雰囲気ではない様子です。
**みんな優しい！**
![FireShot Capture 6 - Broken power switch_ - https___community.onion.io_topic_375_broken-power-switch.png](https://qiita-image-store.s3.amazonaws.com/0/24991/2a3acebd-9f8c-bab9-ee19-a6e952e72151.png)

そして最後このトピックは現在どういう風に収束しているかというと![FireShot Capture 8 - Broken power swi_ - https___community.onion.io_topic_375_broken-power-switch_10.png](https://qiita-image-store.s3.amazonaws.com/0/24991/5916d0e7-501e-f7f7-a2eb-c286bb5996fd.png)

プロダクト開発者の方：*ほっせ〜ピンとかで折れたスイッチのとこ突っ込んでスイッチ入るか試してみてくんね？*

いいですね。全力でサポートしてくれてる感じ。

ちなみに僕も探しました。ほっせ〜ピン。でもそうそうないんですよ。ちょうどいいサイズのほっせ〜のが
数十分他の案も検討した結果、素直にもう一個買いました！

![Screen Shot 2016-01-14 at 14.15.07.png](https://qiita-image-store.s3.amazonaws.com/0/24991/ad6de53b-f0d2-79df-974f-45bc8ddf2c85.png)


## まとめ
ローンチしたばかりのプロダクトのスイッチはゆっくり優しく扱う。
再購入したDockが届いたら今日やろうとしたことをリトライしようと思います。
開発ツール2016年度版(Windows版)

## 前提条件
PHPによるWeb開発において、自分が使っている開発ツールをまとめています。
まだ編集途中です・・・

## 開発
- phpstorm
- Sublime Text
- Atom
- HeidiSQL
- WinSCP
- RLogin
- Tera Term
- WinMarge
- JsonView
- SourceTree
- RedisDesktopManager
- JMeter

メイン開発はphpstorm。
Sublime Text は、IDEで開く程でもないファイルを編集。

## ドキュメント作成
- EmEditor
- EverNote
- サクラエディタ
- LiveMD
- Boostnote ← Markdownでドキュメント管理するには最適かも

## タスク管理
- Trello

## コミュニケーション
- ChatWork
- Skype
- Slack
Railsテスト公開環境コスパ比較

#Railsテスト公開環境コスパ比較
遊びで簡単なrailsアプリを公開したい際、
どのサーバーで作るのが一番コスパがいいのか悩んだので備忘録的に記載
比較を行ったのは以下の3サーバー

1.sqale
2.heroku
3.AWS
選択理由はなんとなく使いやすそうだったので

1.sqale
URL:http://sqale.jp/
料金：940円（税込）/月
長所：全部日本語、定額、環境構築不要
短所：事例数が少ない、
備考：GMOペパボのクラウドホスティング
SSLや独自ドメインの設定も可能
サポート対応も良かったと思います。
スケールの変更も可能

2.heroku
URL:https://id.heroku.com/login
料金： $7(840円 1$=120)/月
毎日18時間以内の稼働であれば、設定で無料にすることも可能
長所：テスト段階では18時間以内の稼働にして無料にて運用が可能
短所：使いこなすまでに多少時間がかかる
備考：heroku schedulerやherokuが眠らないようにする等の設定は必要
基本ダッシュボードは英語ですが慣れれば問題ないと思います。

3.AWS
URL:http://aws.amazon.com/jp/
料金： $7.2(864円 1$=120) t2.nano
実際には$0.01 /1 時間の計算
長所：スケーリング他、S3・ELB他、いろんな機能が用意されている
短所：使いこなすまでに多少時間がかかる、RDSなどを使うと費用は+aされる
備考：最近出たt2.nanoによって、より安価でサーバーを建てられるようになりました。
複雑なことをやりたくなった時などは一番対応しやすい

#結論
いろいろ触って設定のめんどくささや、資料の多さなども考慮し
費用が固定がいいor英語が嫌なら、sqale
18時間以内の稼働で問題ないなら、heroku
それ以外ならAWSと言った感じが私的な落とし所となりました。
ご参考までに。
コマンドラインでiosシュミレーターを立ち上げてsafariでローカルホストを開く


### 必要な環境

xcode 6以降

### iosシュミレータのデバイス確認


```zsh
$ instruments -s devices
```

### シュミレータを立ち上げる

```zsh
xcrun instruments -w 'iPhone 5s'
```

### safariでローカルホストを開く

```zsh
$ xcrun simctl openurl booted "http://localhost:3000"
```

おまけ
#### xcodeのバーションを確認

```zsh
$ xcodebuild -version
Xcode 7.2
Build version 7C68
```
{biOps} 導入

画像解析用Rパッケージ{[biOps](http://ftp.uni-bayreuth.de/math/statlib/R/CRAN/doc/packages/biOps.pdf)}はCRANから消えたんですね。


PC環境：MacBookPro 64bit OS X Yosemite 10.10.5
R環境：R ver.3.1.2(あ！既に古い！)

　

[biOpsのインストール方法](https://code.google.com/p/rimagebook/wiki/biOpsInstallation)を参照。


以下引用。

>    ターミナルで以下のコマンドを実行してライブラリをインストールします．
>
>    $ sudo port install fftw-3 tiff jpeg
>
>    インストールしたライブラリにシンボリックリンクを張ります．
>
    $ cd /usr/include
    $ sudo ln -s /opt/local/include/fftw3.h
    $ for x in /opt/local/include/j*.h; do sudo ln -s $x; done
    $ for x in /opt/local/include/tiff*.h; do sudo ln -s $x; done
    $ cd /usr/lib
    $ for x in /opt/local/lib/libfftw3.*; do sudo ln -s $x; done
    $ for x in /opt/local/lib/libjpeg.*; do sudo ln -s $x; done
    $ for x in /opt/local/lib/libtiff.*; do sudo ln -s $x; done

>    RからdevtoolsパッケージとbiOpsをインストールします．
>
    $ sudo R
    > install.packages("devtools")
    > library(devtools)
    > install_url("http://cran.r-project.org/src/contrib/Archive/biOps/biOps_0.2.2.tar.gz")
    > library(biOps)
>
>以上でbiOpsのインストールは完了です.