OmniAICreator/Qiita-1.07M huggingface dataset:
C#とRxでリアクティブプログラミングしてみた。

**※ C#初心者なので、コードで至らない点ありましたコメント頂けたら助かります。**

## なんだそれ
### Rx
Reactive Extensionsというライブラリ。
簡単に紹介すると、Linqライクな構文を持つ **特定のシーケンス** の管理が出来るもの (と認識している。)

~~詳細はググって下さい。~~

### リアクティブプログラミング
結構、抽象的な概念だったりするので、私からの説明は割愛。
RP(Reactive Programming) や FRP(Functional Reactive Programming)

などがあります。
それを区分けするには、未だ理解度が足りない。

**詳細はググって下さい。**

## 開発環境の準備
私が使用している端末はMacなので **Xamarin Studio** というIDEを使う事にしました。
VisualStudio や MonoDevelopなどでも同様な事が出来ると思います。

C#のコンソールアプリケーションを作り、add packagesからズドンと
**Reactive Extesions - Main Library** 
を突っ込みます。
![スクリーンショット 2016-02-12 21.05.35.png](https://qiita-image-store.s3.amazonaws.com/0/102952/afb63561-4648-ffb6-4bb5-b9dfca929f57.png "スクリーンショット 2016-02-12 21.05.35.png")



## 早速コードを書こう。
シーケンス管理と言う事で、 ~~**私の休日のシーケンスを、リアクティブプログラミングで表現しました。**~~ 

ドスン

``` C#
using System;
using System.Collections.Generic;
using System.Reactive.Linq;

namespace Rx
{
	//	ステータス管理型
	using StateMap = Dictionary<string, Dictionary<string, Action>>;
	class MainClass
	{
		public static void Main (string[] ars)
		{
			//	ステータス定義
			const string AWAKE 		= "AWAKE";
			const string EAT 		= "EAT";
			const string NET_SURFIN = "NET_SURFIN";
			const string SLEEP 	   = "SLEEP";

			//	ステータス上で使われる、呼び出し関数の想定
			const string ON_ENTER   = "onEnter";
			const string UPDATE     = "update";
			const string ON_EXIT    = "onExit";

			var stateMap = new StateMap ();

			//	初期化用delegate、仮でステート名と呼び出し関数名を表示する。
			//	Updateでsleepをしているのは、処理してる雰囲気出すため。意味は無い。
			Action<string, StateMap> stateInit = delegate(string stateStr, StateMap obj) {
				var action = new Dictionary<string, Action>();
				action.Add(ON_ENTER, () => Console.WriteLine(stateStr + ":" + ON_ENTER));
				action.Add(ON_EXIT, () => Console.WriteLine(stateStr + ":" + ON_EXIT));
				action.Add(UPDATE, delegate {
					Console.WriteLine(stateStr + ":" + UPDATE);
					System.Threading.Thread.Sleep (1000);
				});
				obj.Add(stateStr, action);
			};

			//	各種ステートで実際に初期化
			stateInit (AWAKE	 , stateMap);
			stateInit (EAT		 , stateMap);
			stateInit (NET_SURFIN, stateMap);
			stateInit (SLEEP	 , stateMap);

			//	Rxにステート毎のシーケンスを登録します。
			IObservable<Action> provider = Observable.Create<Action> (obj => {
				foreach (var state in stateMap) {
					obj.OnNext (() => state.Value[ON_ENTER]());
					obj.OnNext (() => state.Value[UPDATE]());
					obj.OnNext (() => state.Value[ON_EXIT]());
				}
				obj.OnNext (() => Console.WriteLine ("all sequence success."));
				obj.OnCompleted ();
				return System.Reactive.Disposables.Disposable.Empty;
			});

			//	実行！
			provider.Subscribe (sequence => sequence ());
		}
	}
}
```

> AWAKE:onEnter
AWAKE:update
AWAKE:onExit
EAT:onEnter
EAT:update
EAT:onExit
NET_SURFIN:onEnter
NET_SURFIN:update
NET_SURFIN:onExit
SLEEP:onEnter
SLEEP:update
SLEEP:onExit
all sequence success.


~~何故か、哀しくなりますね。~~

こういう使い方が正しいのかどうか分かりませんが、ステートマシンの代わりになるってだけで良いのではないでしょうか。

まだ試していませんが、各種EventやwebAPIの通信などでも、Rxを使えば **一つのシーケンスとして** 実装が出来るそうです。
すごい。

**脱・コールバックネスト地獄！**

勉強中なので今回はここまで。
[混沌すぎ] Middlemanはこれから sprocket を辞めて CommonJS するようです [グロた]


## はじめに

こんにちは、monpy です。
今日は何を話そうかというと、 Facebook で この記事が回ってきたんですね。

[旧石器時代のJavaScriptを書いてる各位に告ぐ、現代的なJavaScript超入門 Section4 ～Gulpで処理を自動化しよう～](http://qiita.com/gaogao_9/items/d4e23de821d0fd78c13d)

この記事は、タイトル通り Gulp 入門の記事な訳です。

僕も フロントエンドの端くれなので Gulp は頻繁に利用します。
Gulp が出て一体どんだけ経ったんだろうなぁ、と思いをはせたので調べてみると
first commit が `4 Jul 2013`。 まだ 2年と5ヶ月くらいしかたってないんだなぁ。と。

でも2年も経てば、技術が変わってしまうのが フロントエンドの常。gulp は辞めようぜ！なーんて記事もちらほら(ひえー)。

今日はそんな技術の移り変わりが激しくて嘔吐感に見舞われた感想です。
ちなみにタイトル通り middleman を知っている人の方が理解しやすい。

## middleman

私は frontend のツールとしては `node` 製のタスクランナー を使用する一方で、 `ruby` 製の `middleman` をよく使います。

### middleman のいいところ

`middleman` が 最大出力を発揮するのは、静的なサイトでテンプレートを使いまわしてぶん回したい時です。
弊社の works も `middleman` を使用して管理しています。
一時期、似た様な静的サイトジェネレータとして `jekyll` や `assemble` なんかもありましたが、
全部やった結果、 圧倒的に `middleman` の大勝利です(個人によって主張は異なります)。

## node と ruby における javascript の管理

`node` に乗っかった タスクランナーと `ruby` に乗っかった `middleman` では javascript の取り扱い方に大きく差があります(別に javascript に限らないし、ここではすっごい曖昧に説明。なのでこの話はとっても間違っている)。

#### node

```
CommonJS
```

#### ruby

```
sprockets
```

ですね。
複数の js ファイルをきちんとした順序で管理してくれる仕組みを提供してくれます(`CommonJS` は `browserify` を通じて フロントエンドの旨味になります)。

## sprockets ってさぁ...(ここから所感)

middleman における sprockets の不満

* es6 できねえ
* CommonJS の資産使えない
* module.exports に管理された方が幸せ - 名前空間とか管理するの面倒

と文句タラタラである。
しかし大丈夫、middleman に奇跡が起きた

## Middleman v3 -> v4

`middleman` に革命が起こった。

公式からこのようなメッセージが

> ここ数年で, コミュニティは Rails から離れ NPM のタスクランナー (Gulp, Grunt) や依存管理 (Browserify, Webpack), 公式ツール (ember-cli, react-native) やトランスパイラ(ClojureScript, Elm) に焦点を合わせるようになりました。

そう、これにより middleman は基本的に `Node` の資産を利用するのが基本となったのですねー。すごい。

## 増える管理ファイル

とはいうものの試してみると基本的なフォルダ構成もごつくなります。

これは, webpack を使って js を build する時の基本構成

```
.
├── Gemfile           #gem
├── Gemfile.lock      #gem lock
├── README.md         #git用の レポジトリ説明
├── config.rb         #middleman 用の設定
├── config.ru         #rack 用の設定
├── node_module       #node module
├── package.json      #npm package の設定
├── source            #サイトの種
├── vendor            #bundle gemファイル
└── webpack.config.js #webpack の設定ファイル

```

なんなんだこれは、、、、
たかだかサイト一つ作るのにこんなに用意しなければならないのか、、、

お、おえー

でも、これからはこれがスタンダードになるんだろうか。でもマッシュアップならまだいい。
今までの資産は残るもの。。。
フロントエンドのカオス感が高まって参りましたね。

＃試したい人に

さて、ここまで話して、ちょっくら試したい方もいるでしょう。そうでしょう。

そんな人はこちら


[middleman-template](https://github.com/Instrument/middleman-template)

にあるのを試してください。
v4 の新しい機能の一つに init する時に テンプレート指定ができるというのがあります。
というわけで、適当な空フォルダで

```
middleman init -T Instrument/middleman-template-instrument .
```

でok。簡単！これが middlemanですねー。
細かい説明は今度書こうかな。

## 総括

さて、散っていくもの咲いていくものの激しいフロントエンドの中で
ついてに `ruby` と `node` のいいとこ取りができる時代がやってきたわけですよ。
導入障壁がどんどん高くなってく雰囲気ですが。みなさん取り残されないように頑張ろうと思う毎日です。

`middleman` 使う人増えるといいなー。
自分と同じコードの打ち間違いをしている開発者をGitHubで炙り出そう

先日、会社のメンバーが「[Bootstrap](http://getbootstrap.com/)」のことを「ブーストラップ（Boostrap）」と発音していました。[ブーブークッション](https://ja.wikipedia.org/wiki/%E3%83%96%E3%83%BC%E3%83%96%E3%83%BC%E3%82%AF%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3)を彷彿させるその発音は妙に私の頭に残り、全世界でどれくらいのコードで「Boostrap」という言葉を使っているのかをGitHubで調べてみることにしました。

GitHubには、オープンソースのリポジトリやコードで、どのような文字列が使われているかを調べることができる「Search」機能があります。他の人がどんなソースコードを書いているのかを調べることができる便利な機能です。

さっそくBoostrapユーザーをあぶり出してみましょう。

GitHubのトップページのサーチボックスに検索したい文字列を入れます。
![スクリーンショット 2016-02-12 22.19.05.png](https://qiita-image-store.s3.amazonaws.com/0/67884/0905a9f1-e5f2-2e80-5acb-8dd295e8c1aa.png)

[Enter]キーを力強く押すと、Boostrapの検索結果がヒットします。

# 「Boostrap」は21万のコードで使われていた
「Boostrap」は1,215のリポジトリ、212,731のコードで使われていることが判明しました。意外に使われていますね。

![Boostrap](https://qiita-image-store.s3.amazonaws.com/0/67884/a1ab30c9-1a74-f642-3ed3-fe95c00cd233.png)


# 「fotter」は1万2千個のコードで使われていた
`footer`を`fotter`と書いたことがあるのは私だけでしょうか？ 私と同じ間違いをしているのはどれくらいか調べてみたところ、1万2千程度でした。

![fotter](https://qiita-image-store.s3.amazonaws.com/0/67884/0732b20e-403e-321b-2cbd-ff4a8a6aa85d.png)

意外に少なくて残念です。`<div id="fotter">`はよくやります。

# Google Analticsに気をつけましょう
Web業界に入りたてのころ、**女性の先輩に「Googleアナ◯ティクスの設定が終わりました！」と元気溌剌に報告**し、「Analyticsだよ😁」と訂正された黒歴史があります。調べてみたところ、私だけじゃありませんでした。よかったよかった。

![Analtics](https://qiita-image-store.s3.amazonaws.com/0/67884/6bba49c0-19f5-44dc-0b6f-f16c7daa3b09.png)

# GitHubのサーチ機能は面白い
思わず唸る美しい処理から恥ずかしい打ち間違いまで多種多様のソースコードを閲覧できるGitHubのサーチ機能。今日はどんなBoostarpを発見できるのでしょうか。。。
MacOSX El Capitan で lz4アーカイブを作成する

## 実現したいこと

コマンドラインでlz4アルゴリズムを利用して対象ファイルを圧縮したい

## 実現方法および解決方法

brew でlz4をインストールする

## 実行コマンド

```
brew install lz4
```

### 圧縮コマンド

```
$ lz4 testcap_2016-01-30_23-23-50.pcap
```

## 情報源

http://brewformulas.org/Lz4


## 補足
[小ネタ]SSHキーを自前で作成してEC2にログインをする

EC2のSSHKeyPairはエクスポートができないので、リージョンが違うとそれぞれ別のキーを使わなければいけず、管理が面倒です。

その場合、自前でSSHKeyPairを作成し、インポートするようにすればリージョンが別でも共通の鍵を使うことができるので作業手順をメモ。

# 参考

[Amazon EC2 のキーペア](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-key-pairs.html#how-to-generate-your-own-key-and-import-it-to-aws)

# やってみる

作成するのはマネージメントコンソールなどで作成するものと同じRSA version2の2048bitのものとする

```bash
# ホームディレクトリが存在するユーザーの作成
$sudo useradd -m test-user

# test-userに変更.以降test-userでの実施
$sudo su test-user

# RSAを生成。デフォルトで鍵の種類はRSAのversion2、ビット数は2048
$ssh-keygen

# 生成を確認.id_rsaは秘密鍵、id_rsa.pubは公開鍵
$ls ~/.ssh/
id_rsa  id_rsa.pub
```
# AWS-CLIを使って公開鍵をインポートさせる

AWS CLIを使って作成した公開鍵を`test-user-key`と言う名前でインポートします。

```bash
$cat ~/.ssh/id_rsa.pub | xargs -0 aws ec2 import-key-pair --region ap-northeast-1 --key-name test-user-key --public-key-material
{
    "KeyName": "test-user-key",
    "KeyFingerprint": "66:bc:db:75:5e:44:62:xx:xxx"
}
```

# sshログインしてみる

先ほど登録したtest-user-keyを利用したEC2を起動します。その後、以下のようにPublicIPを指定してログインしてみます。

```bash
$ssh ec2-user@52.193.182.127 -i ~/.ssh/id_rsa
```

できました!
楽してInspectorに任意の表示を追加したかった

# 環境
　この記事ではUnity5.3.2f1を使用しています。

# 前書き
　何かしらInspector上で表示させたい値があるけど対象のクラス毎に専用のCustomEditorを書くのも億劫だったので極力楽に実現できる手段を調べました。

# 手順

## MonoBehaviorを拡張する
　MonoBehaviorを継承するクラスを作成し、表示データ取得用のメソッドを追加する。
　クラス名はCustomMonoBehaviorとしておく。

```C#:CustomMonoBehaviour.cs
using UnityEngine;

public abstract class CustomMonoBehaviour : MonoBehaviour {
    public abstract string GetCustomInspectData();
}
```

## CustomMonoBehaviorを対象とするEditorクラスを作成する
　CustomEditor属性の第二引数をtrueにすると、CustomMonoBehaviorを継承するクラスも対象となる。
　クラス名はCustomMonoBehaviourInspctorとしておく。
　※このスクリプトはEditorフォルダ内に配置すること。でないとビルド出力時にエラーが発生する。

```C#:CustomMonoBehaviourInspctor.cs
using UnityEditor;

[CustomEditor(typeof(CustomMonoBehaviour), true)]
public class CustomMonoBehaviourInspctor : Editor {
    public override void OnInspectorGUI() {
        DrawDefaultInspector(); // デフォルトの表示内容
        EditorGUILayout.TextArea((target as CustomMonoBehaviour).GetCustomInspectData()); // 追加表示分
    }
}
```

## 任意のスクリプトにCustomMonoBehaviorを適用する
　CustomMonoBehaviourを継承し、GetCustomInspectDataを表示させたいデータを出力するよう実装する。
　クラス名はHogeScriptとしておく。

```C#:HogeScript.cs
public class HogeScript : CustomMonoBehaviour {
    public override string GetCustomInspectData() {
        return transform.position.ToString();
    }
}
```
## 結果
　下図のようにinspector上でのHogeScriptの表示内容が追加される。
![customEditor.png](https://qiita-image-store.s3.amazonaws.com/0/46096/47c85c92-76ab-6dec-eafe-bc6a1bb1c6fb.png)

# あとがき
- クラスを拡張するよりインタフェースを使ったほうが便利じゃね？　と思いましたが
CustomEditorでインタフェースを対象にしてもOnInspectorGUIが動かないのでダメでした。
- 単純な文字列や数値を表示したいだけならpublic変数に値を突っ込んでおいた方が楽です。（汚いけど）
EJS で記事一覧みたいなのを外部ファイル化してループする

サンプルファイル
<https://github.com/shimakyohsuke/gulp-ejs-filesystem>

取り急ぎ社内説明用に投稿

```package.json
{
  "devDependencies": {
    "gulp": "^3.9.0",
    "gulp-ejs": "^2.0.0",
    "gulp-plumber": "^1.1.0",
    "fs": "0.0.2"
  }
}
```

```gulpfile.js
'use strict';

var gulp = require('gulp');
var ejs = require('gulp-ejs');
var plumber = require('gulp-plumber');
var fileSystem = require('fs');

gulp.task('ejs', function () {
    return gulp.src('./src/ejs/*.ejs')
        .pipe(plumber())
        .pipe(ejs(
            {
                config: JSON.parse(fileSystem.readFileSync('./data/config.json')),
                page: JSON.parse(fileSystem.readFileSync('./data/page.json')),
                loop: require('./data/loop.js')
            },
            {
                ext: '.html'
            }
        ))
        .pipe(gulp.dest('./dist/'));
});
```

```./data/config.json
{
    "siteTitle": "siteTitle"
}
```

```./data/page.json
{
    "hoge": {
      "headline": "hogemoge"
    }
}
```

```./data/loop.js
module.exports = [
    {
        "tagline": "tagline",
        "article": "article"
    },
    {
        "tagline": "tagline2",
        "article": "article2"
    }
];
```

```./src/ejs/index.ejs
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title><%= page.hoge.headline %> | <%= config.siteTitle %></title>
  </head>
  <body>
    <h1><%= page.hoge.headline %></h1>
<% loop.forEach(function(data){ %>
    <div class="article">
      <h2><%= data.tagline %></h2>
      <p><%= data.article %></p>
    </div>
<% }); %>
  </body>
</html>
```

`$ gulp ejs`

```./dist/index.html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>hogemoge | siteTitle</title>
  </head>
  <body>
    <h1>hogemoge</h1>

    <div class="article">
      <h2>tagline</h2>
      <p>article</p>
    </div>

    <div class="article">
      <h2>tagline2</h2>
      <p>article2</p>
    </div>

  </body>
</html>
```
Nightmare v2(Electron) でブラウザ上でES2015のコードを個別にrequireしてユニットテストを書く


自分の開発環境では, nodeで単体テストと分離してモデル層を抽出出来たが、e2eほどではないがブラウザ上でテストしたいコードというのは結構ある。モーダル制御とか、ブラウザ上のイベントに依存する奴とか。

それらを Nightmare でテストするアプローチを紹介する。

https://github.com/segmentio/nightmare

## 概要

Nightmare はヘッドレステストランナーとそのDSLを提供する。v2でランナーがphontomjsから Electronになった。

コードはbabel/commonjsで書かれており、本番環境でJSは1つにまとまっているが、Electron の nodeIntegration を有効化して走らせることで、ビルド前のコードを個別にrequireできる。グローバルを避けてrequireで依存が明示されていれば、理論上そのコードは完結して動くはず。

## 実装例

適当なエントリー用のHTMLを用意する。必要だったらここで各種コンテナを用意してもいい。

```html:browser-spec/test.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Test</title>
  </head>
  <body>
    <h1>Blowser Test Env</h1>
  </body>
</html>
```

ヘルパを用意する。

```js:browser-spec/spec-helper.js
'use strict';

// nightmare
const Nightmare = require('nightmare');
const path = require('path');
const TEST_HTML_PATH = "file://" + path.join(__dirname, "test.html");

// create
global.browser = null;
let startBrowser = function * (){
  global.browser = Nightmare({
    show: false,
    nodeIntegration: true
  });

  yield browser
    .goto(TEST_HTML_PATH)
    .wait('body')
    .evaluate(() => {
      require("babel-register"); // to evaluate spec-helper
      require("../src/main"); // 初期化コードを読み込む
    });
}

let finishBrowser = function * (){
  yield global.browser.end();
}

exports.useBrowser = function() {
  // should init in mocha env
  require("mocha-generators").install();

  before(function * () {
    yield startBrowser();
  });

  after(function * () {
    yield finishBrowser();
  });
}
```

```js:browser-spec/foo-spec.js
'use strict';

var helper = require('./browser-spec-helper');

describe('browser specs', () => {
  helper.useBrowser();

  it('render foo view', function*() {
    var qiitaProps = yield browser
      .evaluate(function () {
        // Backboneっぽい擬似コード
        let FooView = require("../src/foo-view");
        new FooView().renderTo("body"); 
      });
    yield browser.wait('.foo-inner');
  });
});
```

mocha で実行。

```
$ mocha -r browser-spec/spec-helper browser-spec/*.js -t 24000
```

## 解説

Nightmareを`nodeIntegration: true`で初期化することでrequireが使用可能になる。

browser.evalueteの中のコードはelectronの中で実行される。コードの式としての評価は実行ホスト側で行われるが、実際に実行されるのはブラウザの中である点に注意。そしてその中はnodeとブラウザプロセスをattachしたelectronのプロセス内で、requireが使える、という仕組み。

## mochaと一緒に使う注意点

Nightmareはインターフェースが yield で統一されているのだが、babelのgenerator-transformerは generatorをAST変換して継続渡しスタイルに変換する。これが邪魔なので切っておかないといけない。

上記のコードのテスト部分node v4.2で評価して、babel は使っていない。register('babel-register')を走らせた後のrequire先は babel でも構わない。

## まとめ

e2e, nodeのユニットテストという軸だけではやりづらかった、ブラウザでのコンポーネントのユニットテストがこれによって非常にやりやすくなった。

Electronはアプリ配布用としてだけではなく、開発環境をエンハンスするのにもとても便利。
AWS LambdaでVPC越しにRDSを見る方法

# はじめに

昨日、AWSのOfficial Blogに
「[New – Access Resources in a VPC from Your Lambda Functions](https://aws.amazon.com/jp/blogs/aws/new-access-resources-in-a-vpc-from-your-lambda-functions/)」
という記事がアップされました。
遂にAWS LambdaがVPC接続に対応したのです。
そこで、早速どうやってVPC接続するのかみていきたいと思います。

# 事前条件

以下の記事のように事前にLambdaからRDSに接続できるところからスタートします。
http://qiita.com/yoshidasts/items/53918d2586d55bd0856a

# Lambda側の設定

まず、LambdaのConfigurationタブに「VPC」の欄が追加されました。
ここでVPCを設定できるようになりました。

![2016-02-12 (2).png](https://qiita-image-store.s3.amazonaws.com/0/112407/2326c3a0-fbd9-2c9c-03bc-b66c729bf768.png)

しかし、ここでVPCの設定をしても、権限エラーではじかれます。
というのもVPC接続の機能はEC2の機能を利用しているようで
API GatewayからLambdaを呼び出す標準の権限ではVPCの設定が出来ません。

![2016-02-12 (3).png](https://qiita-image-store.s3.amazonaws.com/0/112407/a7cfd429-3e07-ea23-3fd5-76cca936062d.png)

IAMのほうを見てみると、ポリシーにあたらしく「AWSLambdaVPCAccessExecutionRole」が追加されています。

![2016-02-12 (6).png](https://qiita-image-store.s3.amazonaws.com/0/112407/83cab884-4bda-3e0a-936f-ffae2734a9b2.png)

ですので、既存のロールに、このポリシーをアタッチしてあげると
無事にVPCの接続が出来ました。
これでLambdaからVPCに接続するのにインターネットゲートウェイが不要になるので
外部からのアクセスは遮断できるようになりました。

ただ、このままでは他のユーザーのLambdaからはアクセスし放題ですので、次はInbound rulesの設定が必要です。
セキュリティグループで送信元にセキュリティグループを設定すればOKです。

![2016-02-12 (7).png](https://qiita-image-store.s3.amazonaws.com/0/112407/0e43cbf3-4846-4b58-327e-221ab8381ad0.png)

これで、LambdaからRDSに接続する際のセキュリティのリスクがなくりなり、
Lambdaの採用が進むのではないでしょうか。
研修医配属問題をPythonで解いてみる

# <i class='fa fa-venus-mars' />はじめに
1962年にD. Gale（デイヴィッド・ゲール）と L. S. Shapley（ロイド・シャプレイ）によって、安定結婚問題が提唱されました。シャプレイは、この一連の功績により2012年にノーベル経済学賞を受賞しています。

安定結婚問題とは、以下のような問題です。(Wikipediaより)

    安定結婚問題の例題は N 人の男性と N 人の女性、および、各個人の希望リストからなる。
    希望リストとは各個人の好みに基づき異性全員を全順序で並べたリストである。
    安定結婚問題の解は安定なマッチングである。安定結婚問題の例題に対し、
    互いに現在組んでいる相手よりも好きであるペア（以下ブロッキングペアとする）が
    存在しないマッチングを安定なマッチングという。

安定結婚問題は安定マッチング問題の1種であり、安定マッチング問題は、研修医の病院への配属、大学生の研究室への配属など、広く使われています。
研修医配属については、アメリカでは1950年頃から利用されており、日本でも最近利用され始めました。

安定マッチング問題は、Pythonの[ortoolpy](https://pypi.python.org/pypi/ortoolpy)の[stable_matchingで解く](http://qiita.com/Tsutomu-KKE@github/items/2ec5f7626054f4b4de63)ことができます。実際に試してみましょう。

# <i class='fa fa-venus-mars' /> Pythonで解く

ortoolpyのstable_matchingは、研修医と配属先が同数の場合しか解くことができません。
ここでは、配属先Aの受入可能数が2の場合、配属先A_0、配属先A_1のように配属先のダミーを作成してマッチングさせることにしましょう。そのように拡張した安定マッチング問題を解くメソッド stable_matching2 を定義します。

```py3:python3
from itertools import accumulate
from ortoolpy import stable_matching
def stable_matching2(prefs, prefl, capa):
    """
    非対称マッチング
    prefs: 研修医が持つ配属先に対する選好
    prefl: 研修医に対する選好(全ての配属先は同じ選好とする)
    capa: 配属先の受入可能数
    """
    acca = list(accumulate([0] + capa[:-1])) # 累積受入可能数
    idx = [i for i, j in enumerate(capa) for _ in range(j)] # ダミー配属先→配属先の変換リスト
    prefs = [[j+acca[i] for i in pr for j in range(capa[i])] for pr in prefs] # ダミーの選考
    res = stable_matching([prefl] * len(prefl), prefs)
    return{k:idx[v] for k, v in res.items()} # ダミーをオリジナルに戻して返す
```

ランダムに問題を作成します。

```py3:python3
lab_capa = [2, 3, 3, 2] # 配属先の受入可能数
ns, nl = sum(lab_capa), len(lab_capa) # 研修医数と配属先数

import numpy as np
np.random.seed(1)
def shuffled(n):
    """0..n-1をシャッフルして返す"""
    a = np.arange(n)
    np.random.shuffle(a)
    return a.tolist()
performance = shuffled(ns) # 研修医に対する選好
preferences = [shuffled(nl) for i in range(ns)] # 配属先に対する選好

print(performance)
print(preferences)
>>>
[2, 9, 6, 4, 0, 3, 1, 7, 8, 5]
[[2, 0, 1, 3], [3, 0, 1, 2], [3, 1, 2, 0], [3, 1, 0, 2], [1, 3, 2, 0],
 [3, 0, 2, 1], [3, 2, 1, 0], [1, 0, 2, 3], [0, 3, 1, 2], [2, 0, 3, 1]]
```

解いて結果を表示します。

```py3:python3
res = stable_matching2(preferences, performance, lab_capa)
for k, v in res.items():
    print('研修医%d -> 配属先%d'%(k,v))
>>>
研修医0 -> 配属先2
研修医1 -> 配属先0
研修医2 -> 配属先3
研修医3 -> 配属先1
研修医4 -> 配属先1
研修医5 -> 配属先2
研修医6 -> 配属先3
研修医7 -> 配属先1
研修医8 -> 配属先0
研修医9 -> 配属先2
```

# <i class='fa fa-venus-mars' /> 組合せ最適化との関連
安定マッチング問題は、ブロッキングペアがないマッチングを求める問題で、気にするのは、選好順序という相対的な値です。
そもそも選好が絶対的な値の場合は、組合せ最適化問題の重みマッチング問題になります。

絶対的な値というのは、例えば、研修医の自宅から配属先までの通勤時間などがあたります。このとき、全研修医の通勤時間の総和を最小化する問題は、重みマッチング問題でありエドモンズ法などで解くことができます。

重みマッチング問題の解は安定マッチングになりますが、安定マッチング問題の解は重みマッチング問題の最適解とは限りません。

結局、以下のようになります。
> 確からしい重みを考えることができる → 重みマッチング問題
> はっきりした重みは不明だが順序はわかる → 安定マッチング問題

参考
[安定結婚問題を解きながらHaskellプログラミングを紹介しつつ恋愛について学ぶ](http://qiita.com/cutsea110/items/27d9f6db834b70e52dd9)
以上
WebStormで手っ取り早くチーム間のコードスタイルを統一する方法

JavaScriptのプログラミングに便利なIDE「[WebStorm](https://www.jetbrains.com/webstorm/)」。私の周りではJavaScript開発チーム全員でWebStormを導入しているという例も珍しくありません。

しかし、複数人の開発者がいるとコードスタイルの不一致が問題になってきます。

コードスタイルを統一するためのツールはいくつかありますが、導入には往々にして手間がかかります。WebStormを使っているなら、コードスタイルを手っ取り早く下記の方法で統一できます。JavaScriptのコードスタイルを統一する例を見てみましょう。

# 送信側の手順

① [WebStorm]→[Preferences]→[Editor]→[CodeStyle]より、コードスタイルを設定したい言語を選択。今回はJavaScriptを選択します。
② 各コードスタイルを設定していきます。今回はインデントを2タブ、サイズを2文字分に設定してみましょう。他にも改行フォーマット等を細かく設定できます。

![スクリーンショット 2016-02-12 19.31.41.png](https://qiita-image-store.s3.amazonaws.com/0/67884/50836dfc-659c-c53f-8cb9-146d0c088260.png)


③ Schemeの横にある[Manage]をクリックします。コードのスタイルに名前を設定できるので、[Save As]を押して任意の名前を設定します。今回は「豚骨スタイル」という名前にします。

![スクリーンショット 2016-02-12 19.19.36.png](https://qiita-image-store.s3.amazonaws.com/0/67884/2ca1f3c2-2a54-a026-cde4-1ccc577c98e5.png)

④ [Close]を押します。(※ [Export]は不要です。)
⑤ [WebStorm]→[File]→[Export Setting]と進みます。
⑥ 書き出す設定を選択できる画面となります。今回はコードスタイルのみを書き出したいので、[Select None]で全選択を解除した後、[Code Style]のみにチェックを入れます。

![スクリーンショット 2016-02-12 18.55.45.png](https://qiita-image-store.s3.amazonaws.com/0/67884/1381aca8-a414-d77a-afc9-ee77ff85f927.png)

⑦ 「Export setting to」より、設定ファイルを任意の場所に保存します。「***.jar」というファイルが書き出されます。
![スクリーンショット 2016-02-12 18.57.55.png](https://qiita-image-store.s3.amazonaws.com/0/67884/f63dd882-01b4-0dc0-c8ad-814cbd98dacc.png)

⑧ チャットツールやGitHubなど、好きなツールでこの設定ファイルを共有します。キャプチャーはチャットワーク。

![スクリーンショット 2016-02-12 18.59.29.png](https://qiita-image-store.s3.amazonaws.com/0/67884/a46c7fd3-1de6-969f-739f-5e94fbf07818.png)


# 受け取り側の手順
設定ファイルを受け取った人は、下記手順でコードスタイル設定を反映していきます。
①  [WebStorm]→[File]→[Import Setting]と進みます。
② 受け取った設定ファイルをインポートします。

![スクリーンショット 2016-02-12 19.03.07.png](https://qiita-image-store.s3.amazonaws.com/0/67884/cada50d2-4963-9112-7c30-45ad931311e2.png)

③ 確認画面が表示されるので、「Code Style」が表示されていることを確認し、「OK」を押します。

![スクリーンショット 2016-02-12 19.03.52.png](https://qiita-image-store.s3.amazonaws.com/0/67884/29a24c06-0fd6-ee00-3d71-fde4651f8b2e.png)

④ WebStormの再起動を促されるので再起動します。
⑤ [WebStorm]→[Preferences]→[Editor]→[CodeStyle]に移動後、「Scheme」の選択画面から反映したいコードスタイルを選択。今回の例では「豚骨スタイル」が表示されます。

![スクリーンショット 2016-02-12 19.25.37.png](https://qiita-image-store.s3.amazonaws.com/0/67884/23c8ba49-ed22-f31e-5faa-9557e1d7d448.png)

⑥ 「OK」を押します。

## コードフォーマットをかけてみる
設定が反映されているかを確認してみましょう。下記のような素晴らしいJavaScriptコードを例にします。

![スクリーンショット 2016-02-12 19.27.17.png](https://qiita-image-store.s3.amazonaws.com/0/67884/4915dcc0-8ecb-e54a-57e1-c889f4301e29.png)

[Code]→[Reformat Code]（または[⌘]+[Shift]+[L]）を実行すると、共有されたコードスタイルが反映されます。

![スクリーンショット 2016-02-12 19.28.57.png](https://qiita-image-store.s3.amazonaws.com/0/67884/a2807364-d53d-3caa-61b6-d11c9ee26e41.png)

以上です。よきWebStormライフを。
git-mr-diffコマンドでリリースノートを爆速で作成する

2017.8.1追記
----------

正規表現がマッチしないケースを発見したので、[gistのほう](https://gist.github.com/Nkzn/c2f916ceb972d77138ba)を更新しました。使ってくださっている方は手元のスクリプトを更新してください。

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

![スクリーンショット_2016-02-15_10_21_23.png](https://qiita-image-store.s3.amazonaws.com/0/2276/3579a032-9aa9-efc2-f8f9-232f1001bbc7.png)

Pull RequestやMerge Request以外の方法ではmasterやdevelopブランチへのマージを許さない感じの各種ワークフローを実践していると、自然とリリースノートの中身ってMergedのリストになりますよね。

私も仕事でよく社内向けのリリースノートを作るのですが、手作業でMerge Requestのリストを作るのが結構手間だったわけです。

というわけでRubyの練習がてら作ったのが[git-mr-diff](https://gist.github.com/Nkzn/c2f916ceb972d77138ba)です。

![スクリーンショット_2016-02-15_10_39_45.png](https://qiita-image-store.s3.amazonaws.com/0/2276/e1b3e6ec-89dc-3bb7-203c-d2d7bbd659b8.png)

Getting Started
----------

### install

gistからコピペしてきてパスの通った場所に置いてください。Rubyが必要ですがMacの人は気にしなくていいです。Windowsでの動作確認はしていません。

### usage

```bash
$ git mr-diff -h
List of GitLab merge requests between the range expression like 'branch-a...branch-b' (with Markdown friendly list format).

usage: git mr-diff mybranch...development
   or  git mr-diff (default: master...HEAD)
$ git mr-diff
List merge requests for range: master...HEAD

* !123 hogehoge
* !124 fugafuga
```

`git mr-diff`を実行すると、カレントブランチとmasterの間にあるMerge RequestをMarkdownのリストにして並べてくれます。

具体的なコミットを指定して、`git mr-diff dee34df...334edab`みたいな書き方でもOKです。

あとはどこかのリリースノートにコピペすればOK！

Practical Usage
----------

### リリースブランチで実行

もともとこのために作りました。

私はgit-flowっぽいbranching modelを採用しているので、developブランチに変更を溜めていって、リリースするときに *release/1.2.2* のような名前のブランチを経由してmasterブランチにマージしたものを実際にビルド＆デプロイします。

このrelease/***というリリースブランチにリリースノートを書いているわけですね。

リリースブランチをチェックアウトした状態で`git mr-diff`を実行すると、良い感じにmasterブランチとの差分を出してくれるので、リリースマージ用のMerge Requestにリリースノートを書くのが捗るわけです。

### タグ間のdiff

GitLabにもタグにリリースノートを書く機能が付きましたね。前回のタグと今回のタグの間で入った更新をリリースノートやCHANGELOGに書きたい場合は、次のように使うとよいでしょう。

```bash
$ git mr-diff v1.2.2...v1.3.0
```

まとめ
----------

標準出力に出しているので、他のコマンドと組み合わせて、リリース用MRの作成を自動化したりするのも良いと思います。

リスト作りはgit-mr-diffで省力化して、もっと大事なことをリリースノートに書いていけるようにしたいですね。

おまけ
----------

エンジニア募集中です。 https://www.wantedly.com/projects/53479

追記 2/15
----------

くりの人が既にパワフルなのを作ってたようです

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/Nkzn">@Nkzn</a> 以前似たような機能を持つgem作ったことありますｗ <a href="https://t.co/5oDF0GrUy3">https://t.co/5oDF0GrUy3</a></p>&mdash; sue445 (@sue445) <a href="https://twitter.com/sue445/status/699054949758439424">2016, 2月 15</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
日本語をunicode変換しないでjson_encodeする方法

日本語を含む配列をjson_encodeすると、日本語部分が文字コードで表示されてしまう。
そんな場合は、json_encodeの第二引数にJSON_UNESCAPED_SLASESを入れると日本語でjsonを返してくれる。(バージョン5.4.0以上のみ)

```php
$array = array('key1': 'あああ', 'key2': 'いいい');
$jp_json = json_encode( $array , JSON_UNESCAPED_UNICODE) ;
```

参考: https://syncer.jp/how-to-use-json
Tensorflow勉強会


Pepperくんが司会してましたｗ

## Cloud Vision API and Tensorflow

The Datacenter as a Computer

一つはネットワーク
一般的なネットワーク機器は使ってない
Google自家製
海底ケーブルもGoogleで引いてる

Jupiter Network
40G ports
10G x 100K = 1Pbps total
ヤバイ

独自のコンテナ技術
Borg

VM使ってない

ベクトル演算、行列演算をめっちゃやってる

Inceptionという画像認識のニューラルネットワーク
40段の行列演算

DeepLearningはGoogleの中では実用段階
社内で今めっちゃ使われてる

### Cloud Vision API

ディープラーニングの技術を外側にも提供しようとしてみた
使う側はML,DLのことよく知らんでも使えるAPI

レスポンスはJSONで返ってくる

作り笑いは判別してる

物体検知
雰囲気とかシチュエーションとかも判別してくれる。

OCRもいける

### Tensorflow

Cloud Vision APIは学習しなくてもいいAPI。
逆に言うと学習させることができない

自分で学習させたい場合は、Tensorflow

第1世代 DistBelief
第2世代 Tensorflow

Tensor = Vector, Matrix(行列)の次に来るもの
多次元配列
データフロー

ML,DLに特化したフレームワークではなく、HPC。
High Performance Computing Framework
多次元配列の演算を高速に行うための汎用的なライブラリ

ビジュアライズツールもあります。

### 分散学習

ひたすら行列演算してすげー解析しないといけない
GPUをぶん回してやってる。
ただし、1台で。

MSもフレームワーク出してる。
CNTK。
4台並べてプチ学習したらTensorflowに勝ったらしい。

Denso IT Lab
TSUBAME2 96GPU使った

Prefred Newtorks + Sakura
これからすげーの作ろうとしてる

Google
社内で分散でTensorflowを動かしてる
数年先を行ってます。

10台でやるんじゃなくて、50台でやると4倍の速度差が出る

Distributed Tensorflowは近々公開予定
ただ、自分らでそれを使っても早くならん。
GCPのJupiter Networkを使えば早くできる
いつか出るかも知れない

## TensorFlowを使ってゲームAIを作る

Tensorflowを使ってカーリングの局面評価関数を学習した

カーリングのルールは教えていない。
カーリングの画像を学習させてるだけ。
これで局面を判断させてる

機械学習のマジな話でだいぶついていけてなかった…

## Tensorflowで会話AIを作ってみた

チャットロボット
ゲームのNPCとかにも活用できるらしい

### 会話AIの種類

- 辞書型
  - パターンに合わないとおかしな感じになる
  - ひたすら辞書の数が重要
- ログ型
	- ユーザーのインプットをログとして取っといてそのまま返す
	- 人間っぽい振る舞いをする
	- 如何に会話を取るかが重要
- マルコフ型
	- 出現した単語の次に最も出現しそうな単語で文章を生成する
	- 確立で文章生成してるだけなので、意味不明になることも

これらは人工無能というやつ
無能だから悪いって分けではない

ロボット自体がその言葉の意味を考えていない。

会話さえ成り立てばそれ以外の知的活動は行わない。

人工知能は言葉の意味や文脈を理解して知的行動を行う。
要するに空気読む

### 今回のAI

ニューラル言語モデルを用いた単語埋め込み
文字列をベクトル演算可能にする

Sequence to Sequence Model
TensorFlowのチュートリアル

言葉をモデル化して時系列で表すことができる

Twitterをインプットにして、学習させる

### 今後

- 単語辞書を生成して形態素解析の精度を上げる
- 入力データのクレンジング
- 短文データの対話corpus生成
- 学習手法の改良
	- 収束速度を高めるためにAdam砲を採用
- 教科学習と相性が良い？

### まとめ

TensorFlow使うとコードの量が少なくて済む
【Git】stashした内容をdiff表示する

# `git stash`の基本

`stash`コマンドは変更を一時的にしまっておけるコマンド。

```
$ git stash         # 変更をスタックにプッシュする
$ git stash list    # スタックにある変更を一覧表示する
$ git stash drop    # スタックの一番上にある変更を削除する
$ git stash pop     # スタックから変更を一つポップする
```

# スタックにある変更差分を確認したい時

`git stash list`で`stash@{N}`の番号を確認する。

```
$ git stash list
stash@{0}: WIP on branch_name: commit_id2 commit_comment2
stash@{1}: WIP on branch_name: commit_id1 commit_comment1
```

中身を見たい番号を指定して、以下のコマンドで`HEAD`との差分を確認できる。

```
$ git diff stash@{0}
```

ファイル指定もできる。

```
$ git diff stash@{0} hoge.txt
```
CentOS7の基本コマンド（初級）

CentOS7でサーバ構築する際にほぼ使用するコマンドを纏めます。

# サービス
*サービス一覧*
```
[root@localhost ~]# systemctl list-unit-files -t service
```
*各サービスの起動・停止・設定*
```
[root@localhost ~]# systemctl status httpd.service
[root@localhost ~]# systemctl start httpd.service
[root@localhost ~]# systemctl stop httpd.service
[root@localhost ~]# systemctl enable httpd.service
[root@localhost ~]# systemctl disable httpd.service
```

# ログ
*ログ確認*
```
[root@localhost ~]# journalctl -u httpd.service
```


# ホスト名
*ホスト名確認*
```
[root@localhost ~]# hostnamectl status
```
*ホスト名変更*
```
[root@localhost ~]# hostnamectl set-hostname ○○○○○
```

# システムロケール
*システムロケール変更*
```
[root@localhost ~]# localectl set-locale LANG=ja_JP.utf8
```
*システムロケール確認*
```
[root@localhost ~]# localectl status
```

# タイムゾーン
*タイムゾーン変更*
```
[root@localhost ~]# timedatectl set-timezone Asia/Tokyo
```
*タイムゾーン確認*
```
[root@localhost ~]# timedatectl status
```

# NetworkManager
*接続一覧*
```
[root@localhost ~]# nmcli connection
```
*デバイス一覧*
```
[root@localhost ~]# nmcli device
```
*デバイス詳細*
```
[root@localhost ~]# nmcli device show ○○○○○
```

# ネットワーク
*IPアドレス表示*
```
[root@localhost ~]# ip addr
```

# FireWall
*ゾーン確認*
```
[root@localhost ~]# firewall-cmd --get-default-zone
```
*サービス追加*
```
[root@localhost ~]# firewall-cmd --add-service=ssh --zone=public --permanent
[root@localhost ~]# firewall-cmd --add-service=http --zone=public --permanent
[root@localhost ~]# firewall-cmd --add-service=https --zone=public --permanent
[root@localhost ~]# firewall-cmd --add-service=dns --zone=public --permanent
[root@localhost ~]# firewall-cmd --add-service=ntp --zone=public --permanent
[root@localhost ~]# firewall-cmd --add-service=vnc-server --zone=public --permanent
```
*ポート追加*
```
[root@localhost ~]# firewall-cmd --add-port=111/tcp --zone=public --permanent
[root@localhost ~]# firewall-cmd --add-port=111/udp --zone=public --permanent
```

とりあえずここまで。
AutolayoutでCellの横幅いっぱいに画像を複数枚並べる

# やること
複数デバイスサイズでも1枚のstoryboardで横幅いっぱいで同じアスペクト比で画像を並べる

# 対応バージョン
- iOS8以上

# セルに画像を設置
均等に、いい感じに並べる

# 起点となる左の画像にオートレイアウトを設定する
![d99c9fcc-f21e-3f20-0355-d68b2ffcdd85.png](https://qiita-image-store.s3.amazonaws.com/0/30928/0746813b-6525-15b6-950b-ca35cf753cb4.png)
## 設定する条件
- Top Space　上の余白
- Leading Space　左の余白
- AspectRate　画像の比率


# 真ん中の画像にオートレイアウトを設定する
![b6f25361-afb7-1cd0-fb0a-04b960304be6.png](https://qiita-image-store.s3.amazonaws.com/0/30928/da7a7af2-b948-7dd5-f735-212de5536bf1.png)
## 設定する条件
- Align Top 左の画像と合わせる
- Align Bottom　左の画像と合わせる
- Leading Space　左の余白
- AspectRate　画像の比率

# 右の画像にオートレイアウトを設定する
![ccbf8617-8d9f-38b8-84f2-ec0e0d8aebc8.png](https://qiita-image-store.s3.amazonaws.com/0/30928/75060b26-271a-4da9-1f92-ecc59f491ba2.png)

- Tailing Space 右の余白
- Align Top 左の画像と合わせる
- Align Bottom　左の画像と合わせる
- Leading Space　左の余白
- AspectRate　画像の比率

#　出来た（けど高さがずれてる）
![スクリーンショット 2016-02-12 18.45.28.png](https://qiita-image-store.s3.amazonaws.com/0/30928/c49b272a-374f-904a-22f4-68d7b9dcf388.png)


# 下の余白を設定する
![a97a253b-9efd-137e-df52-1746ba3f7fbb.png](https://qiita-image-store.s3.amazonaws.com/0/30928/855e61f8-023c-e15c-199b-ece9d60a5c88.png)

BottomSpace　この時Priorityを750（Height）にしないとトンデモナイことになる

# コード側の対応
```swift
    func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        return UITableViewAutomaticDimension
    }
    
    func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        return UITableViewAutomaticDimension
    }
```

# 完璧！！
![スクリーンショット 2016-02-12 18.46.53.png](https://qiita-image-store.s3.amazonaws.com/0/30928/9543516c-8fd5-5d5e-d279-b3077c6e763b.png)

# おさらい
1. Cellに好きにレイアウトする
2. 一番下にあるオブジェクトからContentViewに対してBottomをPriority750で指定する
3. delegateで```UITableViewAutomaticDimension```を返す


# サンプルコード
[yo1106/TableViewCellAutolayoutSample](https://github.com/yo1106/TableViewCellAutolayoutSample)

# 参考リンク
- [[iOS] Auto Layout を使いこなす。UITableViewCell と UIScrollView 編](http://hamasyou.com/blog/2014/10/09/ios-autolayout-scrollview-tablecell/)
GitHubに芝が生えない件について

﻿# GitHubに芝が生えない問題

まず最初に、謝罪を。
「てめぇ・・・？何番煎じだ・・・？（#^ω^) ﾋﾟｷﾋﾟｷ」と、青筋立てて、今にも目の前のディスプレイを亡き者にしようとしている人へ
ごめんなさい。Qiitaに自分の学んだことを投稿するのが、憧れだったんですorz
だから、ゆるしてにゃん♪

## 本題
さて、謝罪の言葉も述べたので、本題
今月めちゃくちゃcommitしてるのに、Contributionsに芝が生えない。

なんか、くやしい。悔しすぎて草生えてくる。芝は生えてこないのに草は生える不条理。

結論から言うと、ローカルとGitHubのメールアドレスが一致してないの原因
ローカルのほうのメールアドレスが古かったのでこれを新しい(GitHubに登録してある方のアドレス)方に変更すれば、この通り、今日の分の芝を植えることに成功しました。
![qiita02.png](https://qiita-image-store.s3.amazonaws.com/0/83578/409d923b-864e-4808-f478-c746da607008.png)


やったー！（**コメントで**）ほめてー！

ちなみに今月commitしまくった成果物は[こちら](http://ws-factory.hoyo.asia/plana/)
フレームアームズというプラモデルのコンペティション企画「プラナスフィア」のホームページです。
めちゃくちゃかっこいいロボットのプラモデルの写真が多数掲載されているので、興味のある方はぜひ。

## 具体的な方法

+ GitHubに登録されているメールアドレスの確認
Setting→ProfileのPublic profileの中のPublic email
![qiita01.png](https://qiita-image-store.s3.amazonaws.com/0/83578/64619056-b439-7f29-bb0a-de588838e1f9.png)



+ ローカルのメールアドレスの確認

```bat:command
git config user.email
```
+ ローカルのメールアドレスの変更

```bat:command
git config user.email [your mailadress]
```

これで、次回のPush時には、芝が生えます。Σd(ﾟ∀ﾟd) ｵｩｲｪ!!!

参考URL
GitHub Contributions 色つかない(草生えない)
http://salvador.hatenablog.jp/entry/2014/07/17/201043
Windows > Windows Searchを止める

http://qiita.com/7of9/items/c0af0c436636daf41d50
のエラーと関連して、Windows Searchを止める方法を調べた。

以下を見つけた。
http://office-qa.com/win/win96.htm

1. サービス停止
2. 機能の削除

の２通りがある。

しかしながら、これを停止するとそれなりに不便であるので、どうしても止める理由がある場合のみ適用を考える。
テーブルのtrにクラスを付ける

##html
```qiita.html
<table>
    <tr class="t-head">
        <th>見出し</th>
        <td>データ</td>
        <th>見出し</th>
        <td>データ</td>
        <th>見出し</th>
        <td>データ</td>
    </tr>
</table>
```

##css
```qiita.css
tr.t-head th {
    padding: 10px;
    background: #E6F3EC;
}
```

##サンプル
![t-head.png](https://qiita-image-store.s3.amazonaws.com/0/111958/21c12724-e04c-4a5f-8f5c-28c7e4ae5d57.png)
Gradle の Findbugs の結果を標準出力に吐き出す

Gradle で走らせた Findbugs の結果を見るのがダルいので標準出力に結果を吐き出すタスクを書く。

こんな感じ:

<img width="426" alt="スクリーンショット" src="https://qiita-image-store.s3.amazonaws.com/0/755/0c6b219f-6c38-8cec-1fc5-6435cf071f06.png">

Findbugs の結果を見るのがダルい
-----------------------------------

レポートを見る方法としては:

1. デフォルトだと「XML に結果出力したから見てね」って旨のメッセージが出るだけなので、そのパスを何らかのビューワーに噛ませる
2. HTML 出力に設定変更する
    * XML を解釈してくれる CI と相性が悪い。CI のときだけ XML 出力に変える必要がある
3. emacs 出力に設定を変更する
    * 2. と同じ問題に加えて出力される情報が少ないので、バグの識別子で詳細を調べる必要がある。

と面倒な感じ。

Intellij IDEA の findbugs のプラグイン系は、gradle と連携してくれないので話にならない。

なぜか他の gradle プラグインと違って標準出力してくれる機能がない。[Findbugs プラグインにそれらしいレポーターがある][1] が現状では機能していない:

* [[GRADLE-2994] Add additional reports to FindBugs - Gradle Issues](https://issues.gradle.org/browse/GRADLE-2994)

古い Findbugs の CLI オプションだったのかな？

なんにせよ、使えてもレポーターは1つしか選べないので、上述した 2. の問題がまた出てくる。ダルい。

みんなこれどうしてるの。。。他の IDE だともっと賢いプラグインがいるのかな。

辛すぎるのでどうにかした
-------------------------

findbugs をライブラリとして読みこめば [XML パーサもついてくる][2]っぽいので、Findbugs 実行後に XML をパースして標準出力に吐き出す機能を書いた:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~groovy:build.gradle
import edu.umd.cs.findbugs.SortedBugCollection

buildscript {
    repositories {
      mavenCentral()
    }
    dependencies {
        classpath 'com.google.code.findbugs:findbugs:3.0.1'
    }
}

apply plugin: 'findbugs'

// ... other settings

// print findbugs results to console
task printFindbugsResults << {
    [findbugsMain, findbugsTest].forEach {
        printFBXml it.reports.xml.destination
    }
}
printFindbugsResults.mustRunAfter findbugsMain, findbugsTest
check.dependsOn printFindbugsResults

def printFBXml(File xml) {
    if (!xml.exists()) return

    def bugs = new SortedBugCollection()
    bugs.readXML(xml)
    def msgs = bugs.collect { bug ->
        def srcLine = bug.primarySourceLineAnnotation
        // ※1 バグ個別の出力フォーマット
        """\
          |# ${bug.type}
          |${srcLine.className}:${srcLine.startLine}:${srcLine.endLine}
          |${bug.abridgedMessage}
          |${bug.bugPattern.detailPlainText.trim()}
        """.stripMargin().trim()
    }

    if (msgs.isEmpty()) return

    logger.error """\
        |===
        |${msgs.join("\n---\n")}
        |===
    """.stripMargin().trim()
}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

コメントの ※1 のあたりが出力形式になるので、[BugInstance][] や [SourceLineAnnotation][] のプロパティを眺めて適当に変更しましょう。


ついでに:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~groovy
System.setProperty('org.gradle.color.error', 'RED')
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

も書いてやると、冒頭の通りの見た目になる:

<img width="426" alt="スクリーンショット" src="https://qiita-image-store.s3.amazonaws.com/0/755/0c6b219f-6c38-8cec-1fc5-6435cf071f06.png">

本当は出力色指定は gradle の logger とは別でやったほうが良いかも。

[1]: http://gradle.monochromeroad.com/docs/javadoc/org/gradle/api/plugins/quality/FindBugsReports.html#getText--
[2]: http://findbugs.sourceforge.net/api/edu/umd/cs/findbugs/SortedBugCollection.html
[BugInstance]: http://findbugs.sourceforge.net/api/edu/umd/cs/findbugs/BugInstance.html
[SourceLineAnnotation]: http://findbugs.sourceforge.net/api/edu/umd/cs/findbugs/SourceLineAnnotation.html
c++ builder > fileIO > error > This process cannot access the file because it is being used by another process.

```txt:動作確認
C++ Builder XE4
Windows 7 pro
```

ファイル書込み処理を繰り返すソフトを長期運用しているときに以下のエラーが出た。

> This process cannot access the file because it is being used by another process.


以下を見つけた。
http://codeverge.com/embarcadero.delphi.general/the-process-cannot-access-the-file/1070027

> 1) Antivirus, indexers, icon handlers and anything else that monitors files or supplies info to explorer about them (column handlers etc) You've got an unfortunate file extension there in that it's the same as a html doc type and windows indexer will try and read it as such 

SaveToFile()でなくSaveToStream()を使えという回答もある。
#CakePHP で BULK INSERT を試みる

## これは何か？

CakePHP 2.3.9では、まとめてsave()する仕組み([saveMany](http://book.cakephp.org/2.0/ja/models/saving-your-data.html#model-savemany-array-data-null-array-options-array)とか)でBULK INSERTにならないようなのでBULK INSERTを試みた際のメモ。

## 保存しようとしているデータ

```php
$data = array();
$data[] = array(
    'group_id' => 1,
    'name' => 'NAME11',
);
$data[] = array(
    'group_id' => 2,
    'name' => 'NAME22',
);
```

## BULK INSERT文を作って実行する

PHP 5.1.3以降

```php
$ds = $this->Model->getDataSource();

$query  = 'INSERT INTO ' . $this->Model->useTable . '(' . implode(',', array_keys($data[0])) . ') VALUES';
$query .= '(' . implode('),(', array_fill(0, count($data), implode(',', array_fill(0, count($data[0]), '?')))) . ')';

$ds->query($query, iterator_to_array(new RecursiveIteratorIterator(new RecursiveArrayIterator($data)), false), false);
```

## 参考
* http://damepg.hatenablog.com/entry/2012/10/01/001223
* 「多次元配列をフラットな配列にするとき」のコメント  
ワンライナーでフラットな配列にする参考にさせて頂きました。   
 * http://qiita.com/niikunihiro/items/9f4debff73a7b5298048
* CakePHPのModel->query()でSQLを何回も発行するようなバッチを作る際の注意点  
->query()の最後の引数にfalse指定する参考にさせて頂きました。  
 * http://qiita.com/zaru/items/b3cf10c043d0304cdc34
* PHPマニュアル
 * http://php.net/manual/ja/class.recursivearrayiterator.php
 * http://php.net/manual/ja/recursiveiteratoriterator.construct.php
 * http://php.net/manual/ja/function.iterator-to-array.php
col属性でテーブルの縦列の幅を指定する

##html
```qiita.html
<table style="width: 100%;">
    <col width="50%" />
    <col width="50%" />
    <tr>
        <th>見出し</th>
        <td>データ</td>
    </tr>
</table>
<!-- または -->
<table style="width: 100%;">
    <col style="width: 50%;" />
    <col style="width: 50%;" />
    <tr>
        <th>見出し</th>
        <td>データ</td>
    </tr>
</table>
```
[Linux] findコマンドで指定した日付の範囲に更新されたファイルを検索する

mtime で指定するより便利なので、備忘録として記述

```
例：カレントディレクトリ以下で、2015-10-01から2016-01-31の期間に変更されたPHPファイルを検索し一覧表示する
find . -type f -name "*.php" -newermt "2015-10-01" -and ! -newermt "2016-01-31" -ls
```
Herokuデプロイのtips

#Heroku de Deploy
##### Cloud9からHerokuにデプロイするときに戸惑ったのでメモ。
```lang:環境
Cloud9 / Rails4
```

<br><br>
#1:まず。ここを変更しよう
###### HerokuはSqliteに対応していないため、pgに変更します。
```lang:Rails/Gemfile
--Before--
# Use sqlite3 as the database for Active Record
gem 'sqlite3'

--After--
# Use sqlite3 as the database for Active Record
gem 'sqlite3', groups: %w(test development), require: false
gem 'pg', groups: %w(production), require: false
```


```lang:Rail/Database.yml
--Before--
production:
  <<: *default
  database: db/production.sqlite3

--After--
production:
  <<: *default
  adapter: postgresql
  database: mydatabase
```

#2:gitからpush

$ git add .
> gitに全てを追加

$ git commit -m "first commit"
> commitする

$ heroku login
> [y/N]と要求されたらyを押す
 あらかじめ作っておいたアカウントのID/Psを入力しログイン

$ heroku create
> heroku create [アプリケーションの名前]　で指定することも可

$ git push heroku master
>herokuへデプロイ
>
To https://git.heroku.com/***.git
 * [new branch]      master -> master
と表示されればOK

$ heroku run rake db:migrate
> herokuのdbがカラの状態なのでdbを生成

$ heroku open
> アプリケーションが開く

<br><br>
***
**もしもエラーが出たら**

- [x] git push heroku masterの後、[error: failed to push some refs to ***]が出たら

> DBの設定がpgになってない場合があります。
最初の設定をもう一度確認してみてください。


#3:最後に。
エラーが出たりとずっとデプロイできなかったのですが、無事今回デプロイできたので、書くことにしました。
原因はdatabaseをpgに変えていなかったせいでした。
何か質問等あれば、コメントください。できる限り対応します。


> 参考文献
http://d.hatena.ne.jp/EnnuimaZ/20120407/1333806290
http://gam0022.net/blog/2013/09/17/run-rails4-on-heroku/
上記２つの記事を踏まえ、自己検証の上　簡潔にこの記事へまとめました。
FuelPHPのDB基本と返り値


仕事で、FuelPHPを触ったのでメモ。


DBの使い方は、公式に記載されている(日本語: Ver1.8版)
http://fuelphp.jp/docs/1.8/classes/database/usage.html


もっと詳しい使い方は、こちらの方のブログが丁寧にまとめられている
[マコトのおもちゃ箱](http://piyopiyocs.blog115.fc2.com/blog-entry-549.html)


### SELECT
```php:SELECT
$result = DB::select('col1', 'col2')->from('table_name')->where('id', 1)->execute();
```

**返り値: FuelのDatabase_Query オブジェクト**


##### 配列で取得
controller内で加工したいときはas_array()で配列に変換してしまうと便利。
カラム名をkeyとしてデータが格納される。


```php:配列で取得
$result = DB::select('col1', 'col2')->from('table_name')->execute()->as_array();

var_dump($result);
/*array(3) {
  [0]=>
  array(11) {
    ["col1"]=>
    string(1) "hoge"
    ["col2"]=>
    string(19) "fuga"
  }
  [1]=>...
}*/
```

##### JOINと別名
JOINは、join()->on()
ONが複数あるときは、and_on()を使う。

別名は、カラム名の代わりarray('カラム名', '別名')と記述する

```php:JOINと別名
$result = 
DB::select('table_name.col1', array('table_name2.col1', 'as_name')
   -> from('table_name')
   -> join('table_name2', 'LEFT')->on('table_name.id', '=', 'table_name2.id')
   -> join(array('table_name3', 'table3'),'LEFT')
   -> on('table_name.id', '=', 'table3.id')->and_on('table_name.col3', '=', 'table3.col3')
   ->where('table_name.del_flg', '0')
   ->execute()->as_array();

var_dump($result);
/*array(3) {
  [0]=>
  array(11) {
    ["col1"]=>
    string(1) "hoge"
    ["as_name"]=>
    string(19) "fuga"
  }
  [1]=>...
}*/
```



### INSERT
```php:INSERT
$result = DB::insert('table_name')->set(array(
    'col1' => 'hoge',
    'col2' => 'fuga',
) )->execute();

if($result[1] > 0){ //成功 }
```

**返り値: 配列**
１つ挿入した場合の返り値は、
[int: InsertしたレコードのPrimaryKey, int: Insertされたレコード数]

### UPDATE
```php:UPDATE
$result = DB::update('table_name')->value('col1', 'hoge')->where('id', 1)->execute();

if($result > 0){ //成功 }
```

返り値: 数値
UPDATEされたレコード数を返す。


### DELETE

```php:DELETE
$result = DB::delete('table_name')->where('id', 1)->execute();

if($result > 0){ //成功 }
```

返り値: 数値
DELETEされたレコード数を返す。
Hubot  cron定期実行、外部プログラム呼び出し

Hubotスクリプトのメモ。

##cronで定期実行

```cron.coffee
cronJob  = require('cron').CronJob

module.exports = (robot) ->
	new cronJob
		cronTime: "0 0 * * * 1-5" # 月〜金の毎時00分に実行
		onTick: -> robot.send {room: "general"}, '(； ･`ω･´)'
		start: true
		timeZone: "Asia/Tokyo"
```

node-cron 使う。
https://github.com/ncb000gt/node-cron

```
$ npm install cron time
```


##外部プログラム呼び出し

bot宛に送信されたテキストを外部プログラムに投げて出力テキストをしゃべらせる

```ext_command.coffee
child_process = require 'child_process'

module.exports = (robot) ->
	robot.respond /(.+?)$/, (msg) ->
    	child_process.exec "./my_program #{msg.match[1]}", (error, stdout, stderr) ->
      if !error
        output = stdout+''
        msg.send output
      else
        msg.send "error"
```
指定したIDの要素までスクロールさせる

## 元ネタ
jQueryを使った特定要素までの簡単スムーススクロール
http://dev.classmethod.jp/client-side/jquery-smooth-scroll/#sampleBlock01

もともとAngularJSで組んでいた処理で、$location.hashと$anchorScrollでスクロールを実現していたのですが諸事情により使えなくなり。
代わりの簡単なやり方を探してみました。


## スクロール用関数

```js
// $target ... スクロールさせたい位置の要素
// $container ... スクロール要素を含むコンテナ
var scroll2Target = function ($target, $container) {
    var speed = 100;
    var targetPositionTop = $target.offset().top;

    $container.stop().animate({
            scrollTop: targetPositionTop
        },
        {
            duration: speed
        });

    return false;
}
```

## 使い方

```js
scroll2Target($('#anchor1'),$('#scrollContainer'))
```


ご参考まで。
インデントさせてくれないQ&Aサイトで見やすいコードを貼る方法

# 概要

半角スペースとかタブでインデントつけても全部トリミングされてしまう，プログラマからするとお節介な処理をしてくるQ&Aサイト等，あるかと思います．

知っている人も多いかと思いますが，半角スペースの代わりに用いられる，`\xC2\xA0` `\u{00A0}` `&nbsp;` と称される**No break space**という文字は，以下の3点をすべて満たしています．

- 一般的なプログラミング言語における，`trim`のような関数にはトリミングされない
- Webブラウザ上に表示させたとき，連続していてもすべて表示される
- Webブラウザ上でコピーしたとき，半角スペースとして扱わせることができる

そこで，クリップボード上の「半角スペース」→「No break space」の変換を行ってくれるコマンドを作っておけば便利ですよね！

# コマンド定義

```bash:~/.bashrc,&#32;~/.zshrc&#32;などに定義
# 共通
nbsp() {
    perl -pe 's/\x{20}/\x{C2}\x{A0}/g'
}
# OSX用
pbnbsp() {
    pbpaste | nbsp | pbcopy
}
# Linux用
xsnbsp() {
    xsel -bo | nbsp | xsel -bi
}
```

# 参考

- [空白・特殊記号 - ニコニコ動画まとめwiki](http://nicowiki.com/%E7%A9%BA%E7%99%BD%E3%83%BB%E7%89%B9%E6%AE%8A%E8%A8%98%E5%8F%B7.html)
- [Linux Mint - xsel でクリップボード使用！ - mk-mode BLOG](http://www.mk-mode.com/octopress/2013/06/21/linux-mint-install-xsel/)
JsonUtility 備忘録


■Json化するクラスには**[Serializable]**を付ける必要がある。
　**[Serializable]**にするには名前空間に**using System;**が必要

■デシリアライズ時にOnAfterDeserialize内でListからDictionaryに戻す時
　Listには**[SerializeField]**、Dictionaryは**何もつけないよう**にする事

    // デシリアライズで戻すためのディクショナリーデータ
    public Dictionary<int, string> testDic = new Dictionary<int, string>();

    // Dictionaryシリアライズ化用List
    [SerializeField]
    public List<int> dicKeys = new List<int>();
    [SerializeField]
    public List<string> dicVals = new List<string>();

■クラスの配列のシリアライズはエラーになった。
　これだとサーバーと通信できないよ・・・これはきつい。

　**下記のようなクラスをシリアライズ(JsonUtility.ToJson)したら無視されてた。**

    public class UserData
    {
        List<ClassA> classA;
        List<ClassB> classB;
        List<ClassC> classC;
    }
Raspberry Pi 2でFedoraのWifi設定で苦労した件

あとから思えば、無駄に苦労したので、まとめました

# やりたかったこと
* Raspberry Pi 2 Bで動かしたい
* Fedoraを入れたい(rpm/RHEL系でのお作法を学びたい)
* 現時点でFedoraのバージョンは23
* 有線LANではなく無線LANが使いたい(ポートが余ってない)
* IPアドレスを固定したい

# Fedoraが起動するまでの手順
* https://github.com/sjenning/rpi2-fedora-image-builder をgit cloneする
* settings.confをsettings.conf.sample からコピーして書く
 * サンプルではMinimalとなっているが、ServerやWorkstationが良ければ、そのURLを書く
 * 今回はMinimalでいった
 * 事前に別の場所にダウンロードしておいて、ln -s でもOK(clean.shはダウンロードしたイメージも削除するので、むしろそのほうが良いか)
* fbturbo driver が要るなら、README.mdの手順に従う
* ./mkimage.sh して放置すると、イメージが出来上がる(sudoersである必要あり)
* SDカードにイメージを書き込む
 * ddでもいいし、gnome-disk-utilityでもよい
 * 後者でやったけど、うまくいったし、こっちのほうがグラフィカルで間違えないと思う
* Raspiに突っ込んで起動する
 * 初期設定は任意

## ここまでで参考にしたURL
* https://heavy-metal-explorer.com/raspberrypi2_fedora_init
* https://linux.yebisu.jp/memo/984

# 問題発生 NetworkManagerでWifiがつながらない
* 状況
 * ```nmcli dev wifi connect (SSID) password (password)``` としても、wifiデバイスが見つからんと言われる
 * ```nmcli dev``` では、wlan0として認識されている
* 原因
 * NetworkManager-wifi というプラグインが(Minimalイメージでは)インストールされていないから

## 解決策(NetworkManager-wifi をインストールする)
 1. 有線LANは使えないので、wifiにつながってるスマホをUSBでつなぎ、USBテザリングを有効にする
 1. ```nmcli dev connect usb0``` でスマホ越しにwifiに接続する
 1. システムを更新する ```sudo dnf update```
 1. NetowrkManager-wifiをインストールする ```sudo dnf install NetworkManager-wifi```
 1. スマホを外す
 1. ```nmcli dev wifi connect (SSID) password (password)``` でwifiにRaspi自力で接続する

### 参考にしたURL
 * http://jorge.fbarr.net/2015/05/22/no-wi-fi-device-found/

# IPアドレスを固定する
* ```nmcli con``` で接続を作成して固定すしようといろいろ調べたが、よくわからなかった
* なので、すでにwifiへの接続に成功した設定をいじるアプローチに変えた
 * ```nmcli con edit (SSID)```
 * ```set ipv4.address (固定IP)```
 * ```set ipv4.gateway (ゲートウェイ)```
 * ```set ipv4.dns (DNS)```
 * ```save```
 * ```quit```
* 一回切って再接続
 * ```nmcli dev disconnect wlan0```
 * ```nmcli dev connect wlan0```