OmniAICreator/Qiita-1.07M huggingface dataset:
C#でクラスのインスタンスが初期化されてない

普段はC++を使っていながら最近C#を使い出してハマったところを共有したいと思います。

何にハマったかというと、
**クラスのインスタンスを配列で定義した時に、サイズ指定しかされずに初期化されない**
という現象が起こりました。

この現象について、それぞれの言語での実装例から説明したいと思います。
以下のサンプルは、自作クラスのインスタンスを配列で定義して中身を表示しています。
## C++の場合

``` c++:main.cpp

#include "stdio.h"
#include <string>

class Person
{
public:
	int m_old;
	std::string m_name;

	Person(){
		m_old = 10;
		m_name = std::string("Hoge");
	}
};

void main()
{
	Person hoges[10];
	for (int i = 0; i < 10; ++i)
	{
		printf("%d : ", i);
		printf("Old = %d  ", hoges[i].m_old);
		printf("Name = %s\n", hoges[i].m_name.c_str());
	}
}

```
実行すると、以下のように各インスタンスが初期化された状態で表示できます。
>0 : Old = 10  Name = Hoge
>1 : Old = 10  Name = Hoge
>2 : Old = 10  Name = Hoge
>3 : Old = 10  Name = Hoge
>4 : Old = 10  Name = Hoge
>5 : Old = 10  Name = Hoge
>6 : Old = 10  Name = Hoge
>7 : Old = 10  Name = Hoge
>8 : Old = 10  Name = Hoge
>9 : Old = 10  Name = Hoge


## C#の場合
同様にC#でも同じ挙動をさせてみます。

```c#:main_error.cs

using System;

namespace Sample01CSharp
{
    public class Person
    {
        public int m_old;
        public string m_name;

        public Person(){
            m_old = 10;
            m_name = "Hoge";
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Person[] hoges = new Person[10];
            for (int i = 0; i < 10; ++i){
                Console.WriteLine(i + " : Old = " + hoges[i].m_old
　　　　　　　　　　　　　　　　　　　　　　　　　　　　 + "  Names = " + hoges[i].m_name);
　　　　　　　　　}
        }
    }
}

```

実行するとNull参照のエラーが発生します。
>
ハンドルされていない例外: System.NullReferenceException: オブジェクト参照がオブ
ジェクト インスタンスに設定されていません。

これは、配列を初期化した場合に各要素に対してコンストラクタが呼び出されないことが原因です。
ただサイズを確保してくれるだけなので、以下のように変更して、確実にコンストラクタを呼ぶようにします。

```c#:main.cs

using System;

namespace Sample01CSharp
{
    public class Person
    {
        public int m_old;
        public string m_name;

        public Person(){
            m_old = 10;
            m_name = "Hoge";
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Person[] hoges = new Person[10];

            for (int i = 0; i < 10; ++i)
                hoges[i] = new Person();　//各要素のコンストラクタを明示的に呼び出す

            for (int i = 0; i < 10; ++i){
                Console.WriteLine(i + " : Old = " + hoges[i].m_old
　　　　　　　　　　　　　　　　　　　　　　　　　　　　 + "  Names = " + hoges[i].m_name);
　　　　　　　　　}
        }
    }
}



```

この変更によって、初期化できてないエラーがでなくなり、C++と同じ結果が得られます。
ほとんどがNull参照エラーになって気づけると思うですが、
C++の作法に慣れすぎていると理由が分からなくて時間を取ってしまうこともあるので注意が必要です。

## その他
クラスのインスタンスを一つしか使わない、Listなどを使って保持する場合は顕在化しないことが多いので、今更ながらハマったような気がします。

自分の場合はC++のDLLをUnityで使うためにC#のプラグインを書いていたので、
C++の構造体と同じような配置にしたいがために、オブジェクトの配列を使わざるを得なかったという状況があります。

一応、上記のコードをgithubにも載せましたので使いたい人いればアクセスしてみてください。
https://github.com/scnsh/Samples


以上、どなたかの助けになれば幸いです。
VagrantでAnsibleが動かない

Yosemiteで環境一新してVagrantでvm間でAnsibleで構成する環境を試そうとしたらsshではまった。

http://yteraoka.github.io/ansible-tutorial/
に書いてある通りにしたらSSH周りのエラーがでた。
調べていると秘密鍵の設定は
```
~/.vagrant.d/insecure_private_key
```

と思っていたが今はそうでは無くVagrantfileのあるディレクトリの.vagrantディレクトリにvmごとに秘密鍵が用意されるみたいです

早く言って欲しい

```:bash
vagrant ssh-config
```
でvmがnode1とnode2とある場合はnode2のIdentityFileをnode1にあげればいいんですね（ansibleで操作するのがnode1)
C言語でバイナリデータを扱う


今までバイナリデータを直に扱うことがなかったので、C言語でごにょごにょしてみたのでメモ。

### 試したこと

とりあえず、バイナリの読み書きをする関数を使ってデータの保存と復元をしてみました。


#### サンプルコード

```c:write-binary
#include <stdio.h>

int main() {
	struct Vector {
		float x;
		float y;
		float z;
	} position;
	
	FILE *fp;
	
	if ((fp = fopen("vectordata.dat", "wb+")) == NULL) {
		printf("Can't open a file.");
		return 1;
	}
	
	printf("X座標?");
	scanf("%f", &position.x);
	
	printf("Y座標?");
	scanf("%f", &position.y);
	
	printf("Z座標?");
	scanf("%f", &position.z);
	
	fwrite(&position, sizeof(position), 1, fp);
	fclose(fp);
}
```


```c:read-binary
#include <stdio.h>

int main() {
	struct Vector {
		float x;
		float y;
		float z;
	} position;
	
	FILE *fp;
	
	if ((fp = fopen("vectordata.dat", "rb")) == NULL) {
		printf("Can't open a file.");
		return 1;
	}
	
	fread(&position, sizeof(position), 1, fp);
	fclose(fp);
	
	printf("X: %f\n", position.x);
	printf("Y: %f\n", position.y);
	printf("Z: %f\n", position.z);
	
	return 0;
}
```

#### 実行結果

```console
X: 15.000000
Y: 30.000000
Z: 45.000000
```

### fwrite／fread関数

やっていることは単純に構造体に数値を入れて、それを`fwrite`関数で書き出し、`fread`関数で読み込んでいるだけです。

#### ライブラリ

stdio.h


#### 【書式】

```c
size_t fwrite(const void *buf, size_t size, size_t n, FILE *fp); 
```

| 引数 | 説明 |
|:-----|:-----|
| buf | 書き込むデータのポインタです。 |
| size | 書き込むデータのサイズです。（`sizeof`で計算して渡す） |
| n | 実際に書き込むデータの数です。（e.g.) `int`型で10個の要素の配列なら`10`） |

※ `fread`関数も基本的に同じ引数でバイナリデータを読み込みます。

ちなみに書き込んだファイルの内容は`od`コマンドを利用することでバイナリの状態を出力することができます。

```console
$ od -x vectordata.dat
0000000      0000    4170    0000    41f0    0000    4234
0000014
```
(Docker + Sinatra)をAWS Elastic Beanstalkにデプロイ (初期化)

SinatraアプリをDocker化して、AWS Elastic Beanstalkにデプロイしてみました。

# 事前準備

## For Mac

```
brew install aws-elasticbeanstalk
```

もしくは

- [Elastic Beanstalk コマンドラインツールパッケージをダウンロード](http://aws.amazon.com/code/6752709412171743)
    - コマンドを実行するためのパスの設定を忘れずに！

## 初期化

```
eb init
```

## アプリケーションの作成

### aws-elasticbeanstalkを使用する場合

```
eb create
```

### コマンドラインツールをダウンロードした場合

```
eb start
```

### 設定

- このあと色々聞かれるのですが詳細は下記のページの`AWS Elastic Beanstalk を設定するには`をご覧下さい
    - http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/command-reference-get-started.html

## アプリケーションの表示

しばらくすると環境の構築が完了します。

```
eb status --verbose
```

ここで表示される`CNAME`のドメインにアクセスし、ページが表示されれば終了
Nitrous.ioで使用するRubyのバージョンを変更する

## Nirtous.io
[Nitrous.io](https://www.nitrous.io/)という、Webブラウザ上で使えるIDE(統合開発環境)のサービスがあります。
無料で使用でき、しかも公開鍵を登録すればSSHで接続することもできます。
VPSのサービスとは違ってroot権限はないのですが、`git`や`heroku`コマンドが最初から使えるようになっていて、とてもありがたいサービスです。

## rubyのバージョンを変更できる
初期状態ではruby-1.9.3が入っています。特に気にせず使っていたのですが、railsとかrakeコマンド実行すると、「gemのバージョンが古い」という警告を出していました。

root権限がないからgemのアップグレードなんてできないよなあ…、と諦めていたのですがrubyのバージョンを変更できることがわかったのでメモしておきます。

## 手順
利用できるrubyのバージョンを確認する

```zsh:コマンド
parts search ruby
```

バージョンを指定してrubyをインストールする

```zsh:コマンド
parts install ruby2.2
```

インストールしたrubyのバージョンがデフォルトで使用されるようにする

```zsh:コマンド
echo ruby-2.2.0 > .ruby-version
```

## 注意点
ログインシェルを変更して、標準のbash以外を使っていると、`chruby`が見つかりませんというエラーになります。私はzshを使っていたのでchrubyが見つからずハマっていました。

以下の二行を`~/.zshrc`などに書いてあげると、`chruby`が使えるようになります。

```zsh:~/.zshrc
export PATH="$HOME/.parts/autoparts/bin:$PATH"
eval "$(parts env)"
```

参考：http://help.nitrous.io/ruby/
開発環境用のメールサーバ構築方法（Postfix + dovecot )

## 外部ネットワークに接続することのない環境でのメールサーバ構築
 開発環境用の閉じた世界でのメールサーバ構築
 セキュリティ設定等、未完成の状態ですが、jenkins等で通知メールの送受信ができればよい
　という環境のために作ったメールサーバ


## Postfixの設定

```/etc/postfix/main.cf
myhostname = mail.test.com
mydomain = test.com
myoriginal = $mydomain
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

inet_interface = all
inet_protocols = ipv4
mynetworks_style ＝ subnet

#home_mailbox = MailBox ★コメントアウト
mail_spool_directory = /var/mail/
```
##　Postfixの再起動
`service postfis restart`

## ユーザの追加
```
useradd user1 -s /sbin/nologin
passwd user1
chmod 777 /var/spool/mail
```
## dovecotのインストール
`yum install dovecot`


## dovecotの設定
```/etc/postfix/main.cf
/etc/dovecot/dovecot.conf
listen = *
```

```/etc/dovecot/conf.d/10-mail.conf
mail_localtion = maildir:/var/mail/%u
または
mail_location = maildir:~/mail
```

```/etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth=no
```

```/etc/dovecot/conf.d/10-ssl.conf
ssl = no
```
CocProxyのNode.js版が欲しかった



どちらかという欲しかったのはnginx版(ドメインにそったディレクトリを配置する形)

- [CocProxy for nginx - #生存戦略 、それは - subtech](http://subtech.g.hatena.ne.jp/secondlife/20110525/1306299472 "CocProxy for nginx - #生存戦略 、それは - subtech")

ngx_mrubyとかngx_luaとか使えば、レスポンスのbodyの書き換えとか細かい事もできるけど、
そこまでやるなら普通にNode.jsとかで書いて動かしたほうが柔軟性がある気がして欲しかった。
(後、nginxの拡張はビルドがhomebrewにあったりなかったりなので面倒い)


[nodejitsu/node-http-proxy](https://github.com/nodejitsu/node-http-proxy)を使えば、多分できるんだろうけど、何か[nodejitsu/node-http-proxy](https://github.com/nodejitsu/node-http-proxy)の置換プロキシ的な使い方がイマイチピンと来なくて上手くできなかった。

- [ファイル編集したら即ブラウザー再読込させる LiveReloadX を作った - てっく煮ブログ](http://tech.nitoyon.com/ja/blog/2013/02/27/livereloadx/)
- [thewazir/node-reverse-proxy](https://github.com/thewazir/node-reverse-proxy)
- [npm - 開発用・簡易Webサーバー/プロクシサーバーkokoをつくった - Qiita](http://qiita.com/fnobi/items/cf8ffae04e6c530958c7)

```
http://www.127.0.0.1:8087/https:/google.com/hoge
// =>
https:/google.com/hoge
```

みたいな事やるだけでも上手くいかなくてちょっと投げた。

```js
var URL = require("url");
var http = require('http'),
    httpProxy = require('http-proxy');
//
// Create your proxy server and set the target in the options.
//
var proxy = httpProxy.createProxyServer({
    target: 'http://localhost:9000'
}).listen(8000);
// server
var server = http.createServer();
server.on("request", function (req, res) {
    // 初回しか呼ばれない?
    var url = URL.parse(req.url.replace(/^\//, ''));
    req.url = url;
    console.log(url.protocol + "//" + url.host + "/");
    proxy.web(req, res, {
        target: url.protocol + "//" + url.host + "/"
    });
}).listen(9000);
```

http-proxyの`target`とかの用語が良く理解出来てないので、そこから始める必要がありそう。
VLC on WPF

###きっかけ
WPFが登場し、MediaElemntによって、簡単にメディアの再生をすることができるようになった。しかし、対応しているのは、WMVやMP4などごく限られたフォーマット。そのような訳で、VLCをWPFで使ってみようという記事です。
###使うライブラリ
COMを使うか、P/Invokeで頑張るか考えていたら、[Vlc.DotNet](https://github.com/ZeBobo5/Vlc.DotNet)と言うライブラリを見つけました。今回はこれを利用していきます。
### STEP 1： 環境構築
開発は、[GitHub](https://github.com/ZeBobo5/Vlc.DotNet)の方に移動しているので、そちらからDLLをDLしよう！と思ったわけですが、ないため、ソースを全部DLして、ビルドします。Gitで落とすもよし、Zipのボタンで落とすのもよしです。そうしたら、Build.batというのがあるので、それをダブクリすれば、何回かキーを叩くだけでビルド終了です。
### STEP 2： プロジェクト構築
フツーにWPFプロジェクトを作成してください。 
参照が肝心です。ビルドが完了すると、 

* Vlc.DotNet - Build Output
 * Vlc.DotNet.Core
 * Vlc.DotNet.Core.Interops
 * Vlc.DotNet.Forms
 * Vlc.DotNet.Wpf

上のようなフォルダ階層ができたはずです。その中で、Vlc.DotNet.Wpfの中にある、"Debug - x64 - .Net 3.5"というようなファイルが有ると思います。その中で、Release、x86で、あとは適切な.Netバージョンのフォルダを選び、その中のDLLをすべて参照してください。(x64は設定が面倒なので、今回はx86を使用します。)  参照したあと、解答したあとのフォルダを開いて、"Vlc\x86"にある、"Rinecewind"のフォルダを、プロジェクトの"bin\Debug"と"bin\Release"フォルダにコピーしてください。これでプロジェクト構築は完了です。
### STEP 3： プログラミング
MainWindow.xamlに、

```xml:MainWindow.xaml
xmlns:vlc="clr-namespace:Vlc.DotNet.Wpf;assembly=Vlc.DotNet.Wpf"
```
を、xmlns属性が群がっているところに挿入してください。そして、Gridの中に、<vlc:VlcControl x:Name="player"/>を入れてください。
なお、名前は当然ながら任意です。
***
そして、コードビハインド。Newか、Loadedイベントのところに、このコードを挿入しましょう。

```csharp:MainWindow.cs
player.MediaPlayer.VlcLibDirectory = new System.IO.DirectoryInfo(System.IO.Path.Combine(System.Environment.CurrentDirectory, "Vlc_Lib\\x86\\"))
```

```vbnet:MainWindow.vb
player.MediaPlayer.VlcLibDirectory = New IO.DirectoryInfo(IO.Path.Combine(Environment.CurrentDirectory, "Vlc_Lib\x86\"))
```
これで、VLCのDLL達の居場所を設定することが出来ました。もし、設定してなければ、"You must set なんちゃらこんちゃら"と怒られます。なので、忘れずに設定してあげましょう。
これで、VlcControlで再生できるようになりました。Playメソッドなど、直感的でわかりやすいので、使いこなしてあげましょう。
###あとがき
これが初投稿なので、経験がありません。従って、わかりにくいかもしれません。もし、そうであれば、コメントしてください。いじめないでください(おい
とは言え、読んでい頂きありがとうございました。VLCのシェアが伸びることを願って(・ω・)ﾉｼ
Node-RED on Docker - Part2: MQTTブローカーのMoscaを使う

[前回構築した](http://qiita.com/masato/items/f54376fd3ed84209051d)Node-REDのinputにMQTTブローカーにMQTT.jsで実装されたMoscaを使ってみます。スタンドアロンとExpressなどのアプリに組み込む形で動作します。Node-REDのコンテナと同様にMoscaもDockerコンテナを用意します。

## Moscaのコンテナ

MQTTブローカーは[matteocollina/mosca](https://registry.hub.docker.com/u/matteocollina/mosca/)イメージからコンテナを起動します。ポートはDockerホストにマップします。

``` bash
$ docker pull matteocollina/mosca
$ docker run --rm --name mosca \
  -p 80:80 \
  -p 1883:1883 \
  matteocollina/mosca
{"name":"mosca","hostname":"73bdd75f5d2e","pid":1,"level":30,"mqtt":1883,"http":80,"msg":"server started","time":"2015-02-08T00:19:09.719Z","v":0}
```

## Node-REDの設定

[前回構築した](http://qiita.com/masato/items/f54376fd3ed84209051d)Node-REDのinputにMoscaのMQTTブローカーを設定します。左ペインのinputからmqttを選択し、中央ペインにドラッグ&ドロップします。

* Broker: 10.1.3.67:1883
* username: admin
* password: password
* topic: message

![node-red-mqtt-in.png](https://qiita-image-store.s3.amazonaws.com/0/43745/bf03484a-8882-54fb-ee89-367a8bc194b2.png)


左ペインのoutputからdebugをドラッグ&ドロップしてmqttとdebugを線で結びます。

![node-red-mqtt-out.png](https://qiita-image-store.s3.amazonaws.com/0/43745/1b33c3a8-0d17-4913-5a4e-3c66d812e39b.png)


右上のデプロイボタンを押します。MQTTブローカーと接続に成功したので、mqttのnodeの下にconnectedと表示されます。


## MQTTの通信テスト

### publisherコンテナ

テスト用にNode.js用のコンテナを作ります。[google/nodejs-runtime](https://registry.hub.docker.com/u/google/nodejs-runtime/)からDockerイメージをビルドするためのプロジェクトを作成します。

```bash
$ mkdir -p ~/docker_apps/publisher
```

package.jsonを用意します。

```json:package.json
{
  "name": "mqtt-publisher",
  "description": "mqtt publisher test app",
  "version": "0.0.1",
  "private": true,
  "dependencies": {
    "mqtt": "*"
  },
  "scripts": {"start": "node app.js"}
}
```

エントリーポイントのスクリプトを書きます。URLの書式は以下です。Node-REDで作成した`message`topicにpublishします。

* URL: mqtt://{username}:{password}@{broker}:{broker_port}

``` js:app.js
var mqtt = require('mqtt')
  , client = mqtt.connect('mqtt://admin:password@10.1.3.67:1883');

setInterval(function() {
  client.publish('message');
  client.publish('message', 'foo');
  client.publish('message', Date.now().toString());
}, 1000);
```

Dockerfileを作成して、`docker build`を実行します。

``` bash
$ echo FROM google/nodejs-runtime > Dockerfile
$ docker build -t publisher .
```

### publisherコンテナの起動

使い捨てのコンテナを起動して、1880ポートをDockerホストにマップします。

``` bash
$ docker run --rm --name publisher publisher
> mqtt-publisher@0.0.1 start /app
> node app.js
```

ブラウザで動作確認をします。outputのdebug nodeにブローカーが受信したメッセージが表示されます。

![node-red-mqtt-test.png](https://qiita-image-store.s3.amazonaws.com/0/43745/7c1ce238-cb93-6d2b-afc1-5804611cebae.png)


Moscaコンテナの標準出力にも受信したメッセージが表示されます。

```
{"name":"mosca","hostname":"dd8f320575e9","pid":1,"client":"mqtt_501a7060.afe59","level":30,"topic":"message","msg":"unsubscribed","time":"2015-02-08T12:53:54.576Z","v":0}
{"name":"mosca","hostname":"dd8f320575e9","pid":1,"client":"mqtt_501a7060.afe59","level":30,"msg":"closed","time":"2015-02-08T12:53:54.576Z","v":0}
```
Reactで宣言的に書けないサーバー通信


## 問題提起

手続き的に書くとバグりやすいから宣言的に書きたいよね、というのが最近のトレンドですよね。ReactはそれをWebのクライアントサイドで大きく改善させてくれました。

そのReactをもってしても宣言的に書けない処理（≒サーバーとのデータのやりとり）をどう記述すればよいかについてまとめます。

## 手続き的→宣言的のざっくりした経緯

Webクライアントの処理は大きく、

1. DOM以外の外部への影響（logとかwindowとか）
1. 外部へ影響を及ぼさない演算
1. DOM操作
1. サーバーとの通信

に分けられると思います。

静的ページ全盛期の頃は知りませんが、多くのJavascriptエンジンが生まれてきて処理性能が上がってきた最近では、１や２はほとんどの場合において（時間的に）無視できるレベルまで到達していると言っていいでしょう。

Reactが登場してからは、仮想DOMというものがDOM操作を最小に済ませることで、３の処理を（時間的に）無視できるレベルにしてくれました。
（もちろん変化量自体が大きい場合には無視できなくなるのですが。。。）

となると、残るは４のサーバーとの通信です。こいつだけはどうしても無視できないでしょう。

## 実装サンプル

例えば、住所の入力フォームで、県をselectBoxから選ぶと市のselectBoxの中身がajaxで差し替わるという例で考えてみます。

具体的には、県コンポーネントの選択した値が市コンポーネントのpropsとなる形です。

### 良くない例

理想の状態は宣言的に書くことなので、renderメソッドの中にサーバー通信を書くことを試みます。

#### 同期的に書く場合

たいていの場合サーバーとの通信に数十ms〜数百msはかかるので、その間画面が固まってしまうのはイケてないです。

（今どきのフロントエンジニアでこんな風に書く人はいないと思いますが。。。）

```js:CitySelectBox.js（擬似コード）

render{
  var data = syncAccess(this.props.prefectureId)
  return <Selectbox value={data}>
}

```

#### 非同期的に書く場合

「じゃぁ非同期で書くか」と言った場合の問題点は、（ロジック的に）renderの処理と別のスレッドになってしまい返り値をそのまま使えないことです。（callbackでrenderを読んだら無限ループなので。）

仕方ないのでstateの中に取得した値を格納することにします。すると、**stateの状態が変わったので再度renderが走ります。**
このままではやっぱり無限ループになってしまいます。。。

```js:CitySelectBox.js（擬似コード）

render: function(){
  asyncAccess(this.props.prefectureId).then(function(res){
    this.setState({data: res.data});
  });
  return <Selectbox value={this.state.data}>
}

```

#### 非同期的に書く場合（ただし通信は最小限に）

無限ループしないでサーバー通信を行うには、前回とpropsの値が変わっていなければサーバー通信を行わない、というロジックにしないといけません。

仕方ないので、非同期処理の後にstateを更新させるタイミングで、そのときのpropsの値も一緒に格納しておくことにしましょう。それで、renderメソッドの中で条件分岐させればいいよね。

```js:CitySelectBox.js（擬似コード）

render: function(){
  if(this.state.prefectureId !== this.props.prefectureId){
    asyncAccess(this.props.prefectureId).then(function(res){
      this.setState({data: res.data, prefectureId: res.prefectureId});
    });
  }
  return <Selectbox value={this.state.data}>
}

```

...うわぁ、汚いですね。。。
しかも一歩間違えれば途端に無限ループを起こす危険コードです。

## 正しい例

```js:CitySelectBox.js（擬似コード）

componentWillReceiveProps: function(nextProps) {
  if(this.props.prefectureId === nextProps.prefectureId){return;}
  asyncAccess(nextProps.prefectureId).then(function(res){
    this.setState({data: res.data});
  });
},

render: function(){
  return <Selectbox value={this.state.data}>
}

```

[componentWillReceiveProps](http://facebook.github.io/react/docs/component-specs.html#updating-componentwillreceiveprops)使う。
（propsが変化しないときも発火してしまうので、頭に条件分岐を書かなきゃいけない。）

さっきのコードよりだいぶスッキリしたと思います。renderの中に変な処理が挟まらないので無限ループの心配も減りました。

## 結論

renderメソッドの中身は宣言的に書くべき。言い換えれば、時間のかかる処理や無限ループになりうる処理は書くべきではない。
それだけじゃ足りない場合は、reactが何かしらのAPIを用意してくれてるのでそれを使おう。
Toolbar に 13行で SearchView を実装する


## イメージ
こんなやつです。

![searchview.png](https://qiita-image-store.s3.amazonaws.com/0/39324/7c3f7573-623a-6363-f539-abaa3ce7ebd3.png "searchview")

ActionBar にも同じ要領で対応できると思います。


## コード & XML

onQueryTextSubmit, onQueryTextChange の説明はこちら
http://developer.android.com/reference/android/support/v7/widget/SearchView.OnQueryTextListener.html

```java
Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar);
toolbar.inflateMenu(R.menu.search);

mSearchView = (SearchView) toolbar.getMenu().findItem(R.id.menu_search).getActionView();
mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
    @Override
    public boolean onQueryTextSubmit(String s) {
        return false;
    }
    @Override
    public boolean onQueryTextChange(String s) {
        return false;
    }
});
```

```xml:search.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/menu_search"
        android:icon="@drawable/ic_menu_search"
        android:title="@string/menu_search"
        app:actionViewClass="android.support.v7.widget.SearchView"
        app:showAsAction="always" />
</menu>
```

## 補足
### メニューをプログラムで書く

```java
Menu menu = toolbar.getMenu();
MenuItem item = menu.add("検索");
item.setIcon(R.drawable.ic_menu_search);
item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
item.setActionView(mSearchView);
```

### SearchView を開いた状態とする
http://developer.android.com/reference/android/widget/SearchView.html#setIconified(boolean)

```java
mSearchView.setIconfied(false);
```

### SearchView からフォーカスを外す（ソフトウェアキーボードを閉じる）
http://developer.android.com/reference/android/view/ViewGroup.html#clearFocus()
 
```java
mSearchView.clearFocus();
```

### クエリーヒントを表示する
http://developer.android.com/reference/android/widget/SearchView.html#setQueryHint(java.lang.CharSequence)

```java
mSearchView.setQueryHint("ヒント");
```

### SearchView をカスタマイズする

ページ下段の SearchView Widget あたり
http://android-developers.blogspot.jp/2014/10/appcompat-v21-material-design-for-pre.html
PHPの複数ファイルダウンロード

```lang:index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="SJIS" />
<title>HTML 5 complete</title>
<!--[if IE]>
<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->

</head>
<body>
<form name="download1" target="target1" action="/test/download1.php"></form>
<form name="download2" target="target2" action="/test/download2.php"></form>
<input type="button" value="ダウンロード" onclick="download1.submit();download2.submit();">

<iframe name="target1" width="0" height="0"></iframe>
<iframe name="target2" width="0" height="0"></iframe>
</body>
</html>
```


```lang:download1.php
<?php

 // 作成するファイル名の指定
  $file_name = 'file1.txt';

  // ファイルの存在確認
  if( !file_exists($file_name) ){
    // ファイル作成
    touch( $file_name );
  }else{
    // すでにファイルが存在する為エラーとする
    echo('Warning - ファイルが存在しています。 file name:['.$file_name.']');
    exit();
  }

  // ファイルのパーティションの変更
  chmod( $file_name, 0666 );


// ダウンロードさせるファイル名
$tmp_file1 = $file_name;
// ヘッダ
header("Content-Type: application/octet-stream");
// ダイアログボックスに表示するファイル名
header("Content-Disposition: attachment; filename=$tmp_file1");
readfile($tmp_file1);

//ファイル削除
unlink("D:\\xampp\\htdocs\\test\\".$file_name);
exit;
?>

```

```lang:download2.php
<?php

 // 作成するファイル名の指定
  $file_name = 'file2.txt';

  // ファイルの存在確認
  if( !file_exists($file_name) ){
    // ファイル作成
    touch( $file_name );
  }else{
    // すでにファイルが存在する為エラーとする
    echo('Warning - ファイルが存在しています。 file name:['.$file_name.']');
    exit();
  }

  // ファイルのパーティションの変更
  chmod( $file_name, 0666 );


// ダウンロードさせるファイル名
$tmp_file = $file_name;
// ヘッダ
header("Content-Type: application/octet-stream");

// ダイアログボックスに表示するファイル名
header("Content-Disposition: attachment; filename=$tmp_file");
// 対象ファイルを出力する。
readfile($tmp_file);

//ファイル削除
unlink("D:\\xampp\\htdocs\\test\\".$file_name);
exit;
?>

```
AWS の自分用メモ2 (ELB/RDS)

前回の内容で最低限のサーバーを作成する際に用いるAWSのサービスについてメモしました。
今回はもう少しやることの幅を広げるときに使うサービスについて書いていきます。

#1. ELB(*ElasticLoadBalancing*)
* EC2インスタンス用のロードバランサーで、サーバーへのアクセスを自動的に複数のインスタンスへ分散させる負荷分散装置。
* インスタンスへのヘルスチェックを指定でき、サーバー状態によって接続/切断の判断もしてくれる。
* このELB自体の管理や維持、スケールは抽象化されているため、容量の増減などは自動でやってくれる。
* 複数の**AZ**(*AvailabitiltyZone*)を跨ぐことも、単一に設定することも可能。
* **スティッキーセッション**という機能を使えば、同じユーザーからのリクエストを分散させず、同じインスタンスに送るようにもできる。

#2. RDS(*RelationalDatabaseService*)
* 運用やスケーリングが簡単なデータベースを提供するサービス。
* 複数AZで冗長化することが可能。
* 自動バックアップ機能があり、最大35日前まで分単位で指定できる。
* 自動バックアップ機能は手動と組み合わせることで35日以上前のものもバックアップできるようにできる
* ストレージ容量の追加/スケールアップ・ダウンが簡単にできる(再起動が必要)
* "MySQL"、"Oracle"、"Microsoft SQL Server"、"PostgreSQL"、"**Amazon Aurora**(※1)"から選択できる。
* "Oracle"や"Microsoft SQL Server"で必要なライセンスの取得は不要。

※1 最近できた新しいRDS。現在プレビュー段階。詳細は、、、そのうち書くかも。⇒ せめて[リンク](http://aws.amazon.com/jp/rds/aurora/)くらいは。

##おわり
間違っていたらごめんなさい。
勉強中の身ですので指摘などは大歓迎です。
次回はS3やDynamoといったもう少しAWSに特化した内容にしたいと思います。
【Ubuntu】UbuntuにLAMP環境を構築する


## ユーザの作成

### ユーザの作成

	# adduser nishide
	Adding user `nishide' ...
	Adding new group `nishide' (1001) ...
	Adding new user `nishide' (1001) with group `nishide' ...
	Creating home directory `/home/nishide' ...
	Copying files from `/etc/skel' ...
	Enter new UNIX password:
	Retype new UNIX password:
	passwd: password updated successfully
	Changing the user information for nishide
	Enter the new value, or press ENTER for the default
		Full Name []:
		Room Number []:
		Work Phone []:
		Home Phone []:
		Other []:
	Is the information correct? [Y/n]

### 作成したユーザにsudo権限を付与	
	
	# usermod -G sudo nishide	


## LAMP環境の構築
※ apt-getじゃなくてapptitudeを使うパターンも後に確認。

### OSパッケージを最新にアップデート

	# apt-get update -y

### 関連する開発パッケージのインストール

	# apt-get install openssl

### Apacheのインストール

	# apt-get install apache2 -y

### MySQLのインストール

	# apt-get install -y mysql-server libapache2-mod-auth-mysql

### PHPのインストール

	# apt-get install -y php5 php5-mysql libapache2-mod-php5 php5-mcrypt php5-json



## その他メモ

### initctlコマンド

	# initctl restart ssh		# sshをリスタート
RubyMineで同名のプロジェクトを作り直す方法


RubyMineでRailsプロジェクトを作成し、再度作り直したくなった時に、~/RubymineProjects フォルダ下を削除しても同じ名前で再作成出来ないことがある。

そんな時は、springのプロセスが残ったままになっていることがあるので、psコマンドでプロジェクト名を検索し、該当プロセスをkillしてから同じ名前のプロジェクトを再作成する。

```bash:Terminal
> ps -ex | grep hoge
```

プロセスIDを指定してkill

```bash:Terminal
> kill <spring 〜 hogeの該当PID>
```
Yahoo!ショッピング 商品画像アップロードAPIでInternalServerError(500)になる

お世話になっております。
現在Yahoo!ショップに自前のECサイトから商品データをAPI経由で登録しようとしております。商品登録APIを使って商品情報を登録することはできたのですが、商品画像のアップロードAPIではInternalServerErrorになり原因が分からず困っております。
下記のようなプログラムでAPIに送信しているのですが、
記述方法又は仕様について、間違っている点があれば、教えていただけますでしょうか。
どうぞ、宜しくお願いいたします。

補足としまして、testという商品コードの商品情報は登録済みで、
test.jpgをストアエディタ上から画像アップロードすると無事登録されることは
確認しました。seller_idは適当に変更しております。

```
define('IMG_UPLOAD_URL', 'https://circus.shopping.yahooapis.jp/ShoppingWebService/V1/uploadItemImage');
define('CRLF', "\n");

$filename = "test.jpg";
$boundary = md5(date('U'));
$contentType = "Content-Type: multipart/form-data; boundary=" . $boundary;

$data = '';
$data .= "--$boundary" . CRLF;
$data .= "Content-Disposition: form-data; name=\"file\"; filename=\"{$filename}\"". CRLF;
$data .= 'Content-Type: application/octet-stream'. CRLF;
$data .= file_get_contents($filename). CRLF;
$data .= "--$boundary--" . CRLF;

$headers = array(
            $contentType,
            "Authorization:Bearer ".$access_token,
            'Content-Length: '.strlen($data)
);

$options = array('http' => array(
            'method'  => 'POST',
            'content' => $data,
            'header'  => implode(CRLF, $headers)
));
$contents = file_get_contents(IMG_UPLOAD_URL.'?seller_id=myshop', false, stream_context_create($options));

```
70年代にダイオードの研究をしていた父に聞いた半導体について知っておくべき2つのコト

様々な知識を前提としたハードに関する知識だが,せっかく聞いたので共有しておく.
***


#### [ウィリアム・ショックレー](https://ja.wikipedia.org/wiki/%E3%82%A6%E3%82%A3%E3%83%AA%E3%82%A2%E3%83%A0%E3%83%BB%E3%82%B7%E3%83%A7%E3%83%83%E3%82%AF%E3%83%AC%E3%83%BC)
シリコン・バレーのきっかけを作った張本人.主にこの人の理論を当時の大学では教わったとのこと.

#### [フェアチャイルドセミコンダクター](https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A7%E3%82%A2%E3%83%81%E3%83%A3%E3%82%A4%E3%83%AB%E3%83%89%E3%82%BB%E3%83%9F%E3%82%B3%E3%83%B3%E3%83%80%E3%82%AF%E3%82%BF%E3%83%BC)
この会社が後のIntel,AMDの源流.他にもCMOSの発明者,appleの創業者等も出身者にいる.
***
他にも[オペアンプ](https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%9A%E3%82%A2%E3%83%B3%E3%83%97)や,[アプライド・マテリアルズ](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%97%E3%83%A9%E3%82%A4%E3%83%89%E3%83%BB%E3%83%9E%E3%83%86%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%BA)等々,様々な名詞が出てきたがニッチな気がするので略.
また何かand需要があれば更新します.
Harmony で JavaScript を普通に書く。


そろそろ ES6 の文法にも慣れたいなぁと思って、タスクランナー介してビルドする場合は、JavaScript 全部 ES6 で書く事にした。幸い ES6 で書いたスクリプトを ES5 に変換して出力してくれるトランスパイラーが出揃っているので、結構簡単にできる。

**追記** なんか [6to5](https://6to5.org/) から [Babel](https://babeljs.io/) に名前変わってた。


# 6to5 なトランスパイラー

* [google/traceur-compiler](https://github.com/google/traceur-compiler)
* [babel/babel](https://github.com/babel/babel)

[es6-transpiler](https://github.com/termi/es6-transpiler) とかあったよなーと思いつつ、とりあえず最近は上記 2 つが有名そう。

それでこれらを browserify で使うプラグインも出ている:

* [thlorenz/es6ify](https://github.com/thlorenz/es6ify)
* [babel/babelify](https://github.com/babel/babelify)

最初、es6ify で試してたけど、次の記事を読んで babelify に乗り換える事にした:

* [Compare · Babel](https://babeljs.io/docs/compare/)

> The fundamental concept behind 6to5 is that the generated code must be close as possible to the original, retaining all the same formatting and readability.
> 
> 6to5 uses a lot of static analysis to simplify code as much as possible.
>
> 6to5 prides itself on spec compliancy. We have excellent support for edgecases, something that many other transpilers suffer from, including Traceur.


# Browserify でやる

実際には Gulp とか Grunt を使うけど、まぁ最小構成でやるならこんな感じという事で、Browserify だけでやる場合のイメージ。

必要なモジュールをインストール:

```
npm install -g browserify babelify babel-preset-es2015
```

ビルドスクリプトを用意:

```javascript:6to5
#!/usr/bin/env node --harmony

var fs = require('fs');
var path = require('path');

var browserify = require('browserify');

var f = fs.statSync(process.argv[2]).isFile() ? path.resolve(process.argv[2]) : '';

browserify({ debug: true })
.transform('babelify', { presets: [ 'es2015' ] })
.require(f, { entry: true })
.bundle()
.on('error', (err) => console.log(`Error: ${err.message}`))
.pipe(fs.createWriteStream('bundle.js'));
```

実行権限付けておく:

```
chmod +x ./6to5
```

ES6 で書いたサンプルスクリプト:

```javascript:script.js
'use strict';

class Base {
  set (prop, val) {
    this[prop + '_'] = val;
  }
  get (prop) {
    return this[prop + '_'];
  }
}

class Greeting extends Base {
  constructor (subject) {
    super();
    this.subject_ = subject;
    this.message_ = 'Hello, world.';
  }
  say () {
    let subject = this.get('subject');
    let message = this.get('message');
    console.log(`This is ${subject}. I say "${message}"`);
  }
}

let greeting = new Greeting('Yu');
greeting.say();  // This is Yu. I say "Hello, world."
greeting.set('message', 'Life is beautiful.');
greeting.say();  // This is Yu. I say "Life is beautiful."
```

あとはシェルで `6to5` スクリプトを実行してやる:

```
./6to5 ./script.js
```

そんで ES5 に変換された `bundle.js` が出て来る。

Promise 良く使うけど、ES6 と一般的な Promise ライブラリで書き方ちょっと違ったりするんで、どうせなら ES6 に慣れておきたい。あとアロー記法とかにも。

CoffeeScript 使い始めた時は、大変だったけど、慣れたら、JavaScript も CoffeeScript も読むのは苦労しなくなった。色んな書き方覚えておけば、とりあえず、色んな書き方読むのに苦労はしなくなるだろうから、早めにやっといて損はないと思う。
Rails4.2 + Grape0.1 + Doorkeeper2.1

# GrapeでDoorkeeperのバージョン2系を使う

## Doorkeeperがバージョン2.0で後方非互換なアップデート

Railsを使ってOAuth2でいい感じなAPIを作ってみようと思って調べてみたところ

- RESET API用DSL : [Grape](https://github.com/intridea/grape)
- OAuth2プロバイダ : [Doorkeeper](https://github.com/doorkeeper-gem/doorkeeper)

がいい感じそう。
で、GrapeからDoorkeeperを使うのに、

- [grape-doorkeepr](https://github.com/fuCtor/grape-doorkeeper)

というgemもしっかりあって素晴らしい。

・・・のかと思いきや、今ではDoorkeeperは[2.1にメジャーバージョンアップ済み。](https://github.com/doorkeeper-gem/doorkeeper/blob/master/CHANGELOG.md#200)
```doorkeeper_for``` メソッドが ```doorkeeper_authorize!``` に置き換えられたりといろいろ変わっている。

で、grape-doorkeeperはどうやらいまのところ1.x系のDoorkeeperにしか対応してない模様。＼(^o^)／

## 対応

詰んだかと思いかけたけど、こんな感じにしたらなんとなく動いた。

- ```Grape::API``` でhelpersとして ```Doorkeeper::Rails::Helpers```を読み込み
    - ```doorkeeper_authorize!``` メソッドを呼び出せるようにする

```rb
    helpers Doorkeeper::Rails::Helpers
```

- ここから力技
- ```doorkeeper_authorize!``` を呼び出す前に、 ```request``` オブジェクトに ```authorization``` と ```parameters```メソッドを追加
    - ```Grape::API``` 内の ```request``` は、通常のRailsコントローラとは違って [```Grape::Request < Rack::Request```](https://github.com/intridea/grape/blob/master/lib/grape/http/request.rb)
    - そのままだとDoorkeeperが呼び出そうとするメソッドが無くて落ちるので
        - ```authoriztion``` は強引に [```ActionPack::Request```](https://github.com/rails/rails/blob/master/actionpack/lib/action_dispatch/http/request.rb) と同じメソッドを定義
        - ```parameters``` は別名の ```params``` 変数がそれにあたるはずなのでそっちを返してやる

```rb
      def authorize!
        def request.authorization
          env['HTTP_AUTHORIZATION']   ||
          env['X-HTTP_AUTHORIZATION'] ||
          env['X_HTTP_AUTHORIZATION'] ||
          env['REDIRECT_X_HTTP_AUTHORIZATION']
        end

        def request.parameters
          params
        end

        doorkeeper_authorize!
      end
```

- ```doorkeeper_error_renderer``` メソッドをオーバーライド
    - エラー時にステータスコードをセットする方法もGrape流の方法に変更

```rb
      def doorkeeper_error_renderer(error, options = {})
        error! error.status, 408
      end
```

これで、Doorkeeperでapplication登録してauthorizeして発行された有効なaccess_tokenを持っていないリクエストは弾けるようになった。

全体のソースは以下の通り。

```rb
module GrapeDoorkeeper
  class API < Grape::API

    helpers Doorkeeper::Rails::Helpers
    helpers do
      def authorize!
        def request.authorization
          env['HTTP_AUTHORIZATION']   ||
          env['X-HTTP_AUTHORIZATION'] ||
          env['X_HTTP_AUTHORIZATION'] ||
          env['REDIRECT_X_HTTP_AUTHORIZATION']
        end

        def request.parameters
          params
        end

        doorkeeper_authorize!
      end

      def doorkeeper_error_renderer(error, options = {})
        error! error.status, 408
      end
    end

    version 'v1', using: :path
    format :json

    resource :test do
      before do
        authorize!
      end

      get do
        "Test"
      end
    end

  end
end
```

あとは共通クラスかモジュールに切り出すなりなんなり。

RailsもOAuthも初心者な状態なので、正しいやり方かどうかは自信無し。抜けや漏れがある可能性も大ですが、一応できたことの共有。

メソッドの追加とか我ながら強引すぎる感・・・。ご指摘などありましたら是非。


二重投稿。[Rails4.2 + Grape0.1 + Doorkeeper2.1 | bookside.log](http://blog.bookside.net/2015/02/08/rails4-2-grape0-1-doorkeeper2-1/)
ノンデザイナーでもデザインの基礎が学べる　資料紹介

# 

## ノンデザイナーズ・デザインパターン
* こちらが紹介するサイトです
    * [ストラテジックチョイス / ノンデザイナーズ・デザインパターン](http://d.hatena.ne.jp/asakichy/20121119/1353276501)


## ノンデザイナーのための配色理論
* こちらが紹介するサイトです
    * [slideshare / ノンデザイナーのための配色理論](http://www.slideshare.net/saucerjp/ss-14902681?qid=87ee02b2-6f3b-416f-9cb2-82cfeadeb9fd&v=qf1&b=&from_search=1)

## ノンデザイナーのための「デザインの判断」はとりあえずコレだけおさえよう
* こちらが紹介するサイトです
    * [slideshare / ノンデザイナーのための「デザインの判断」はとりあえずコレだけおさえよう](http://www.slideshare.net/chinnen1978/ss-24283072)

## 見やすいプレゼン資料の作り方 - リニューアル増量版
* こちらが紹介するサイトです
    * [slideshare / 見やすいプレゼン資料の作り方 - リニューアル増量版](http://www.slideshare.net/yutamorishige50/ss-41321443?related=1)



今後もいい資料があれば紹介していきたいと思います。
sidekiq を安全に止める

ワーカーに変更を加えた場合、変更を有効にするためには sidekiq を再起動する必要があります。しかし、sidekiq は一度起動すると働き続けるため、いきなり止めるのは危険です。手順を踏んで再起動しましょう。

### 1. TSTP で kill
```
# >= 5.0.0
kill -TSTP [worker_pid]

# < 5.0.0
kill -USR1 [worker_pid]
```

まず deploy する前に TSTP(v5.0.0 未満は USR1) で kill します。これで sidekiq は新しいプロセスを生成しなくなります。プロセスを見てみると下記のように `stopping` と書かれ、徐々にスレッド数が減っていくのがわかると思います。0 になると全てのスレッドが処理を完了したことがわかります。
しかし、特に処理の完了は待たずに deploy を開始します。

```
sidekiq 3.3.1 app_name [9 of 25 busy] stopping
```

### 2. TERM で kill
```
kill -TERM [worker_pid]
```

USR1 で kill しただけではプロセスが立ち上がらなくなるだけなので、deploy が完了したら sidekiq を停止させます。プロセスを確認すると sidekiq のプロセスがなくなったことがわかります。以上で安全に停止することができます。

## sidekiqctl
kill コマンドを使わなくても、ターミナルから sidekiqctl を使って sidekiq を停止することができます。

```
# start of deploy
# quiet sends USR1
sidekiqctl quiet [pidfile]
# ... deploy happens ...
# stop sends TERM with a hard deadline to kill -9
sidekiqctl stop [pidfile] [deadline_timeout]
```

USR1 での kill は `sidekiqctl quiet [pidfile]`、TERM は `sidekiqctl stop [pidfile] [deadline_timeout]` が対応しています。
`deadline_timeout` は 60 秒で、60 秒待っても停止しない場合は `kill -9` で強制終了します。

## Capistrano
Capistrano を使って deploy している人は、[capistrano-sidekiq](https://github.com/seuros/capistrano-sidekiq) を使うことでこれらの動作を自動化できます。
これで自動に deploy 開始時に TSTP が送られ、完了時に再起動します。

## 参照
* [Sidekiq Wiki Signals](https://github.com/mperham/sidekiq/wiki/Signals)
Jenkinsに登録しているアカウント全員のメールアドレスを取得

# 実行環境

* Mac OSX Yosemite
* Jenkins 1.598

# 本題

Jenkins に登録しているユーザ全員のメールアドレスを取得するためのスクリプトです。

Jenkins使用者へ一斉に連絡が必要な時に使えるかもしれません。
適切なメーリングリストが無いときにでも。

```bash:get_jenkins_user_address.sh
apiuser="Your User Name"
token="Your access tokeen"
jenkins_url="Your jenkins url"

curl_opt="-sS -u ${apiuser}:${token}"

curl ${curl_opt} ${jenkins_url}/asynchPeople/api/json | jq -r '.users | map(select(.user.fullName != ""))[].user.absoluteUrl' | while read user_url
do
  curl ${curl_opt} ${user_url}/api/json | jq -r ".property[] | select(.address != null).address" >> mails.txt
done
```

自アカウントのトークンは、`http://${YOUR_JENKINS}/user/${YOUR_ACCOUNT}/configure` で見れます。
まあ、Admin権限があれば、誰のトークンだって見れちゃうんですけどね...。

また、jsonパーサーコマンド `jq` が必要です。

`select(.user.fullName != "")` は、もっとしっかり絞らないと、
Jenkinsによっては余計な人（またはサービス）のメールアドレスが含まれるかもしれません。

# 蛇足

コマンドで取得できるなら、送信もJenkinsで行えば自動化できますね。

## EnvInject を使って取り込む

概要

* `Shellの実行` で、上記スクリプトを実行し、
* EnvInject を使ってビルド時の環境変数に取り込み、
* メール通知機能に、その環境変数を突っ込んであげる

![Jenkins-All-Users-Mailing-001.png](https://qiita-image-store.s3.amazonaws.com/0/27201/5027bebe-4c12-e139-6e53-848c9f3dcbde.png)

いかなローカル下とはいえ、アカウント名やトークンをさらけ出すのは抵抗があったので、[Mask Passwords Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Mask+Passwords+Plugin) を使いました。

![Jenkins-All-Users-Mailing-002.png](https://qiita-image-store.s3.amazonaws.com/0/27201/19ac0a68-358d-9714-3d59-9a2e22a3db51.png)

シェルでゴリゴリし、parameterファイルを作ります。
最近のJenkinsさんは色付けしてくれるようになりました。すばらしいですね。

作ったファイルを、[EnvInject Plugin](https://wiki.jenkins-ci.org/display/JENKINS/EnvInject+Plugin) で読み込みます。

あとは、メールを送信するためにわざと `exit 1` で失敗させます。

![Jenkins-All-Users-Mailing-003.png](https://qiita-image-store.s3.amazonaws.com/0/27201/7d2b344d-e665-221f-e75d-7686b61b00c6.png)

メール通知設定です。
このままでは、環境変数 mails が何らかのミスで定義されなかった時に E-mail: ${mails} へメールを送信しようとしておかしなことになります。
私の環境では、ドメイン名が勝手についてさらにおかしなことになったので、mails パラメータは、パラメータ付きビルドとして、前もって定義しておいた方が良いかもしれません。

![Jenkins-All-Users-Mailing-004.png](https://qiita-image-store.s3.amazonaws.com/0/27201/f20b1701-f71a-9978-c59b-804c47b4f4a1.png)

こんな感じになります。
一応、私個人のアドレスはぼかさせていただきました。

## Workflow Plugin の場合

せっかくなので、Workflow Plugin でも試してみました。
apiをたたくなんてまどろっこしことはせず、Groovy でJenkinsさんからメール一覧を取得しています。

```groovy
emails = []
for (int i = 0; i < User.getAll().size(); i++) {
  prop = User.getAll()[i].getProperty(hudson.tasks.Mailer.UserProperty.class)
  if (prop.hasExplicitlyConfiguredAddress()){
    emails.push(prop.getExplicitlyConfiguredAddress())
  }
}

/* Ideal
emails = User.getAll().collect {
  prop = it.getProperty(hudson.tasks.Mailer.UserProperty.class)
  prop.getExplicitlyConfiguredAddress()
} - null
*/

emails = emails.join(', ')

mail bcc: '', body: 'This is test mail', cc: '', charset: '', from: '', subject: 'This is test mail', to: emails
```

![Jenkins-All-Users-Mailing-wf-001.png](https://qiita-image-store.s3.amazonaws.com/0/27201/2bd6fd7b-5fdd-3db1-2c84-d37e9e87e66e.png)

workflow plugin の時だけ、`collect` が想定外の動きをしたので、しぶしぶ `for文` を使っています。
 # ループが1要素分しか回らない
 # 詳しい方がいたら教えて下さい...

# 蛇足2

素直にメーリングリスト作ったほうがはるかに便利です。
RaspberryPi2にnode.jsをインストールする

RaspberryPi2が届いたのでいつもどおりhubotを動かそうとすると上手くいかなかった。`nvm`や`nodebrew`を使ってインストールをするも、`npm install`がよく分からないエラーでこけてしまう。

色々試した結果、橋本商会さんで紹介されている方法でバイナリを直接取ってくると上手くいった。
http://shokai.org/blog/archives/8583

```
$ wget http://nodejs.org/dist/v0.10.24/node-v0.10.24-linux-arm-pi.tar.gz
$ tar -zxvf node-v0.10.24-linux-arm-pi.tar.gz
$ sudo mv node-v0.10.24-linux-arm-pi /usr/local/node
$ vi ~/.bashrc

# 次の行を追加
export PATH=/usr/local/node/bin:$PATH

$ source ~/.bashrc
```

2015/2/8現在の情報なのですぐに出来るようになると思いますが。
複数データベースのmigrationを管理するgem ｢banana｣を使ってみた

## bananaとは
データベースが複数ある時のmigrationをうまい事やってくれるgemです。
このテーブルはこのDB、こっちのテーブルは別のDBに作るといった事を簡単にできます。
Githubページは[こちら](https://github.com/sinsoku/banana)です。

## 導入
```rb:Gemfile
gem 'banana'
```

```sh
bundle install
```

## 使い方
下のように｢DATABASE_NAME｣を定義するだけです。
この状態でmigrateすれば指定したデータベースにテーブルを作ってくれます。

```ruby:db/migrate/20150208121021_create_users.rb
class CreateUser < ActiveRecord::Migration
  DATABASE_NAME = "db2"

  def change
    create_table :onions do |t|
      t.timestamps
    end
  end
end
```

```yaml:config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  reconnect: false
  pool: 5
  username: root
  password:
  socket: /var/run/mysqld.sock

db1:
  <<: *default
  database: db1

db2:
  <<: *default
  database: db2
```

## 複数DBへの接続方法
これは｢banana｣の機能ではなくRailsがデフォルトで持ってる機能です。
このmodelはdb2に接続したいといった場合は下のように記述します。

``` rb:app/models/user.rb
class User < ActiveRecord::Base
  establish_connection :db2
end
```

## 少しハマった所
### table already existsになるパターンがある
bananaを利用していると｢table already exists｣エラーに遭遇する事があります。
発生するパターンは下の通りです。
1. migrationでdb1とdb2にテーブルを作成
2. db1だけ削除して再度migrate
3. db2に対してテーブルを作ろうとして｢table already exists｣エラー

bananaはschema_migrationsのレコードをメインDBにしか作らないので、db2にテーブルがある場合にもcreate tableしようとしてエラーになります。
データベースをリセットしたい時は気をつけた方が良さそうです。

### その他
Rails4にしたせいか他Gemの環境かは確認してないのですが、一部のコマンドでエラーが出ました。
確認した限りだと｢rake db:create｣｢rake db:reset｣でエラーが出てます。
Pythonでimportできない！

そんな人いませんか？
それは僕です。

例えば、こういう場合。

```py3:main.py
from ClassA import *

if __name__ == "__main__":
    ClassA()
```

```py3:ClassA.py
from ClassB import ClassB

class ClassA(object):

    VALUE = 'value'

    def __init__(self):
        ClassB()
        print('class a')
```

```py3:ClassB.py
from ClassA import ClassA

class ClassB(object):

    def __init__(self):
        print(ClassA.VALUE)
```

main.pyを実行すると、こんなエラーでます。

```py3:error
Traceback (most recent call last):
  File "main.py", line 3, in <module>
    from ClassA import *
  File "/Users/MS/Desktop/test/ClassA.py", line 3, in <module>
    from ClassB import ClassB
  File "/Users/MS/Desktop/test/ClassB.py", line 3, in <module>
    from ClassA import ClassA
ImportError: cannot import name 'ClassA'
```

最初は、importがループしてるからエラーでてるのかと思ってましたけど、ちょっと違うみたいです。
「[循環インポートとは](http://okuhiiro.daiwa-hotcom.com/wordpress/?p=720)」に細かく書かれてますけど、ClassAがimportされてる最中に、再度ClassAをimportしようとするとImportErrorとなるようです。
上記の例だと、ClassAがimport中にClassBをimportしようとし、更にその中でClassAの変数を呼び出していますが、ClassAはimportの途中なので不完全な状態です。
しかし、import文が処理された時点でimport済として管理されてしまっているので、ClassBでClassAの再importは行われず、importが完了しているという体で処理を進めようとしてエラーになっているようです。

ふむー、importがループしているという単純なエラーかと思いきや、意外に奥が深かった・・・。
RubyでTwitterを　SSLではじかれる件（Windows)

# RubyでTwitterを利用するも早速挫折

### まずコードを
---
```rb
require "twitter"


client = Twitter::REST::Client.new do |config|
  config.consumer_key        = "略"
  config.consumer_secret     = "略"
  config.access_token        = "略"
  config.access_token_secret = "略"
end

client.home_timeline.each do |tw|
   puts tw.text
end

```

ここまではなんとかなったものの


### SSLっぽいエラーが吐かれてしまった。
---
以下のとおりである
![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/68673/15cf851d-293c-cddc-5383-44c61dec84c1.jpeg)

このように一杯書いてある（小並感）

~~どうもSSLv3を使っていることに問題があるそうだ。~~


```
※追記（wktk氏に感謝）

上位規格の TLS 1.2 から 1.1, 1.0, SSL 3.0 までフォールバックするように
なってるから v3 自体は直接関係ない

証明書の仕組みの話で、信頼するルート証明書のリスト (pem ファイル) が手元に存在せず、サーバーが提示する証明書が正当か検証できないためエラーになっていた
```
参考URL
[Transport Layer Security ＠Wikipedia](https://ja.wikipedia.org/wiki/Transport_Layer_Security#POODLE.E6.94.BB.E6.92.83)


### SSLエラーを何とかしたい
---
とりあえずhome_timelineの上の行に

```
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
```
を入れると取得できた。これでは危険なのでSSL認証の問題を探ることに。
ここなどを参考にした。

[Windowsでgem installするとSSLエラーが出る場合の解決策](http://qiita.com/shimoju/items/394818b4989b94680aaf)

[RubyでTwitterにポスト（未完）](http://halpha656.hatenablog.com/entry/2013/09/02/213959)

[rubyでSSL利用時に証明書エラーが発生する場合の対応](http://k-shogo.github.io/article/2013/08/22/ruby-ssl-connect-error/)


どうも
>ruby -ropenssl -e "p OpenSSL::X509::DEFAULT_CERT_FILE"

を入れて出てきたパスに
[http://curl.haxx.se/ca/cacert.pem](http://curl.haxx.se/ca/cacert.pem)
を保存すればよいとわかった。


### SSLエラー対処を実際にやってみる
---
実際にやってみた
>ruby -ropenssl -e "p OpenSSL::X509::DEFAULT_CERT_FILE"

![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/68673/d75c269d-84e9-252b-3b55-e05f197d3be9.jpeg)

すると上図のような見たこともないディレクトリが出てきた。
早速ディレクトリを作成し、PEMファイルを入れてみた。

![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/68673/ae50acb7-17ba-4b9c-f4ae-f75fa28ebdb0.jpeg)

さてSSLの問題も解決したから、早速ファイルを書き換えて実行

やっぱりだめでした

![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/68673/5d4e387f-8cb3-67cb-5ce8-810376909ebc.jpeg)


### あっさり解決
---
以下のようにコマンドライン上で打ち込んだ。
>ruby -ropenssl -e "p OpenSSL::X509::DEFAULT_CERT_FILE"
>
>C:/Users/Luis/Code/luislavena/knap-build/var/knapsack/software/x64-windows/openssl/1.0.0o/ssl/**cert.pem**

お気づきになられたであろうか。上記のエクスプローラー図では
**cacert.pem**
となっている

これを
**cert.pem**
に名前を変えてあっさり解決

アホなミスもクリティカルエラーになるので注意すると堅く誓う
Rails4+devise+paranoiaで退会ユーザーの論理削除を簡単に実現する

最近、Railsの認証エンジンであるdeviseが色んな意味で注目されてますね。

#### :black_square_button: 概要
deviseのみで退会処理を行うと、退会ユーザーが物理削除される。
ということで、devise+paranoiaでユーザーの論理削除を実現する。

#### :black_square_button: 前提
- deviseインストール済

#### :black_square_button: paranoiaをインストール&設定

Rails4 は

```rb:Gemfile
gem "paranoia", "~> 2.0"
```

Rails3 は

```rb:Gemfile
gem "paranoia", "~> 1.0"
```

```
bundle install
```

deviseが設定されているmodelに対して、下記のカラムを追加する。
この場合はUserモデルとします。

```
rails generate migration AddDeletedAtToUsers deleted_at:datetime:index
```

```
rake db:migrate
```

Userモデルに対して、下記を追加

```rb:app/model/user.rb
  acts_as_paranoid
```

終了！！
これで、終わりです。

退会処理をすると、
deleted_at に退会日時が設定されるようになってます。

#### :black_square_button: 注意
削除済のユーザーと同じemailを登録しようとするとユニーク制約にひっかかり、登録できない

[Rails4 + devise + paranoiaで論理削除を考慮したユーザーバリデーションを実現する](http://dangerous-animal141.hatenablog.com/entry/2014/09/08/133533)
これで解決できると思ったら・・・
Rails4.2ではvalidates_uniqueness_of_without_deleted が undefined method になる。。

Issueにもあがってたのね。。
[validates_uniqueness_of_without_deleted undefined in Rails 4.2]
(https://github.com/ActsAsParanoid/acts_as_paranoid/issues/20)

Rails4.2でユーザーバリデーションを実現する方法はないですかねぇ。。。

#### :black_square_button: 参考

:small_red_triangle: [paranoia](https://github.com/radar/paranoia)
:small_red_triangle: [devise](https://github.com/plataformatec/devise)

#### :black_square_button: 雑記
paranoiaのREADMEを見た方が速いし、詳しく書いてあるので、そっち見てください。。。
NSTask経由でscalaスクリプトを実行する (プログラミング学習用アプリを作る)

　新しめのプログラミング言語にはREPLがあったり、スクリプトファイルから実行できたりします。書きながら勉強できますから、重宝しますよね。

　が、しかし… エディターとターミナルを行ったり来たりするのはちょっと面倒です。

![CotEditorは素晴らしいエディターです](https://qiita-image-store.s3.amazonaws.com/0/17957/533dedfc-4c34-1502-b9de-d855bcea885f.png)

　ウィンドウが2つあると、色々な操作が増えます。~~艦これのために~~動かしてスペースを開けるだけで数秒余計にかかります。
　IDEを使えばいいんですが、こちらは基本的にサイズが大きいので「macbookでちょっと勉強」という用途には大げさだったりします。もっと単純に「右側に出力があって、左側に書いてキーボードショートカットで実行できる」というだけで充分なこともあります。

　それくらいならNSTaskで簡単に作れそうです。
　ということで実際に作りました。

![スクリーンショット 2015-02-08 17.27.59.png](https://qiita-image-store.s3.amazonaws.com/0/17957/35b65bd4-fd4a-9404-261c-48d94ffbc3ae.png)


　**セキュリティとかエラーとか考えなければ**、左側に書いてcommand+Rで実行できるモノを40行で作ることができます。

# 作り方

　基本的には、NSTaskを動かして出力をそのまんま書き込みます。
　ViewControllerに`run()`を書いて、メニュー経由でこれを呼びましょう。

　`run()`は単純なメソッドで、(1)テキストを保存し、(2)保存したファイルをscalaに渡し、(3)タスクが終わるまで待ってから結果を読み取り、(4)データを変換して表示します。

```swift
import Cocoa

class ViewController: NSViewController {

    @IBOutlet var editor: NSTextView! {
        didSet {
            editor.automaticTextReplacementEnabled = false
        }
    }
    @IBOutlet var output: NSTextView!
    
    @IBAction func run(sender: NSMenuItem) {
        let task = NSTask()
        let output = NSPipe()
        let error = NSPipe()
        let name = "scEditor" + NSDate().timeIntervalSince1970.description
        
        if let path = NSTemporaryDirectory().stringByAppendingPathComponent(name).stringByAppendingPathExtension("scala") {
            editor.string?.writeToFile(path, atomically: false, encoding: NSUTF8StringEncoding, error: nil)
            
            task.standardOutput = output
            task.standardError = error
            task.launchPath = "/usr/local/bin/scala"
            task.arguments = [path]
            task.launch()
            
            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
                task.waitUntilExit()
                let result = output.toString() + error.toString()
                dispatch_async(dispatch_get_main_queue()) {
                    self.output.string = result
                }
            }
        } else {
            println("error")
        }
    }
}

extension NSPipe {
    func toString() -> String {
        let data = self.fileHandleForReading.availableData
        return NSString(data: data, encoding: NSUTF8StringEncoding) ?? ""
    }
}
```

　キーボードショートカットは、メニューを弄ることで設定できます。
　ファーストレスポンダー宛てに`run()`を呼ばせるだけです。

![スクリーンショット 2015-02-08 16.44.28.png](https://qiita-image-store.s3.amazonaws.com/0/17957/b0b9b3c7-497b-1556-45b2-959fd0ab78ae.png)

　あとは適当にテキストビューを2つ置いて、アウトレットとして接続すれば動きます。
swift勉強しててふむふむ思った事２【tupple, dynamictype】

ふむふむ１
http://qiita.com/jumbOS5/items/1214184a31b434cd6ccc

とりあえずアプリなどをswiftで作り直している。
良いなーと思うところと、思わないところがちょいちょい出て来た

```
// stride型
var range = stride(from: 8, through: 10, by: 2)


let member_list = ["0":"ken","1":"key"]
// tupleを返り値に使う
func tuppleer()->(mid:String!, name:String!)
{
    for (mid, name) in member_list
    {
        return (mid, name)
    }
    return (nil, nil)
}

// クラスメソッドのオーバーライドのためのdynamictype
class Animal {
    class func say() {
        println("Hey!")
    }
}

class Cat: Animal {
    override class func say() {
        println("I'm cat.")
    }
}
let mike: Cat = Cat()
mike.dynamicType.say()
```

## タプルが便利
C++とかでべんりだな〜と思ってた物の一つ、
それがswiftだと簡単に使えるし、キーワード指定できるから見やすい
返り値を構造体とか、オブジェクトとかで返してるけど
中身謎！とか置き難いのかな

## dynamictype
スタティックメソッドのオーバーライド
Vim で JSX (React) のシンタックスハイライトを設定する

JSX は JavaScript のコード中に XML を記述するのでシンタックスハイライトがうまく当たりません。vim-jsx を使うことで JSX 部分にうまくシンタックスハイライトが当たり捗ります。

- [mxw/vim-jsx](https://github.com/mxw/vim-jsx)

![Screen Shot 2015-02-08 at 16.40.47.png](https://qiita-image-store.s3.amazonaws.com/0/3780/221a911f-e17c-c162-5e7c-ee3b56fff7a6.png)

## インストール

Vundle を使っている場合以下のように設定してインストールします。vim-javascript に依存しているので合わせてインストールします。

```vim:.vimrc
Bundle "pangloss/vim-javascript"
Bundle "mxw/vim-jsx"
```

有効にならないときは、vim-javascript が正しくインストールされているか確認してください。vim-javascript 以外の JavaScript シンタックスファイルと相性が悪いようなので注意してください。

## 設定

**React v0.12 から `@jsx` pragma は非推奨となり、`.jsx` 拡張子を利用することが推奨されているようです。**

- [React v0.12 RC | React](http://facebook.github.io/react/blog/2014/10/16/react-v0.12-rc1.html#the-jsx-pragma-is-gone)
- [Change bin/jsx default file extension to .jsx · Issue #832 · facebook/react](https://github.com/facebook/react/issues/832)

下記設定を行わず、可能な限り `.jsx` 拡張子を利用する方がよいでしょう。

デフォルトでは `.jsx` 拡張子の場合のみシンタックスハイライトが設定されるようになっています。`.react.js` などで設定したい場合は、以下のように設定します。

```vim:.vimrc
" js 拡張子でも有効にする
let g:jsx_ext_required = 0
" @jsx React.DOM プラグマがある場合のみ有効にする
let g:jsx_pragma_required = 1
```