OmniAICreator/Qiita-1.07M huggingface dataset:
SlackでLINEみたいなスタンプを使いたいと言われたので

[Slack Advent Calendar 2014 - Qiita の 14 日目](http://qiita.com/advent-calendar/2014/slack)の記事です。

準備が間に合わなくて、ソースコードの公開もなくただの紹介するだけの記事となってしまいました。すいません m(_ _)m

## LINEからSlackへの移行

社内チャットツールをSlackに移行する前はLINEを使っていました。
移行は楽に済んだのですがLINEの「スタンプ使いたい症候群」に陥る人が多く発生してしまいました。

## Slackの絵文字

Slackでは絵文字を追加することが出来ます。ですがこの絵文字の大きさは（当たり前ですが）22pxなので単体でメッセージを伝えるには小さくて見難いんです。

![ss 2014-12-12 16.33.01.png](https://qiita-image-store.s3.amazonaws.com/0/5549/86b33b54-a59c-2926-0709-1f007527e6e8.png)


## 絵文字を大きくしてみる

![ss 2014-12-12 16.42.04.png](https://qiita-image-store.s3.amazonaws.com/0/5549/27f8d9b2-1edb-827f-2a06-5837f1cb0080.png)


絵文字の大きさは`emoji-sizer`にて定義されています

```css
span.emoji-sizer {
  line-height: 18px;
  font-size: 22px;
}
```

このfont-sizeを124pxにしてあげれば...

```css
span.emoji-sizer {
  line-height: 18px;
  font-size: 124px;
}
```

こうなります。

![ss 2014-12-12 16.41.48.png](https://qiita-image-store.s3.amazonaws.com/0/5549/a20caa25-74d6-6f05-6d3a-5d7f42a7511f.png)



##スタンプメニューの追加

![ss 2014-12-12 16.54.31.png](https://qiita-image-store.s3.amazonaws.com/0/5549/3770d6ec-e06b-679c-50a8-ddcfe5d10c1b.png)

メッセージ欄の絵文字メニューの隣にスタンプメニューを追加しました。

メニューを開くとこんな感じになります。

![ss 2014-12-12 17.55.48.png](https://qiita-image-store.s3.amazonaws.com/0/5549/daa5bdc2-5454-72fc-dc15-6979cd3261f5.png)

スタンプ選ぶと画像のURLがPOSTされます。

![ss_2014-12-12_17_57_46.png](https://qiita-image-store.s3.amazonaws.com/0/5549/339f02d5-fac2-30c3-8965-1c2782152f9c.png)

![ss_2014-12-12_18_33_32.png](https://qiita-image-store.s3.amazonaws.com/0/5549/3b31ce27-52d7-1cc5-a0f9-7add133cf87f.png)

## Web版Slackに埋め込む

Web版では、このようにお気に入りに埋め込むためのJavascriptを登録しています。これでいつでも絵文字の大きさ変更・スタンプボタンの埋め込みが出来るようになります。

こんな感じ
```
javascript:$("body").before($("<script/>").attr({src:"https://*****/*****.js"}));
```

![ss 2014-12-12 18.07.00.png](https://qiita-image-store.s3.amazonaws.com/0/5549/0e41e614-1490-a66f-2c8d-13a51372b297.png)

## Mac版Slackに埋め込む

Web版と同じようにJSを埋め込みます。

Slack.appの**バージョン0.43までは、**右クリックをすることで「Inspect Element」が表示され、インスペクターのコンソールで埋め込みが可能でした。

![ss 2014-12-12 18.10.13.png](https://qiita-image-store.s3.amazonaws.com/0/5549/d0d4f2c1-130d-7219-2f0b-fc92b55197f3.png)


ですが最新のSlack.appは「Inspect Element」が表示されなくなっているので出来ません。

何か方法ないかなー...


## iOSでスタンプ

iOS 8からのカスタムキーボードを使用します。

![2014-12-12_18_06_21.png](https://qiita-image-store.s3.amazonaws.com/0/5549/40b9431c-ea48-adbe-e169-9fd800453471.png)
CakePHP国際化対応のpoファイル生成方法

コマンドプロンプトを開いて、appに移動してから
Cakephpのコマンドを起動します。

```bash
Console/cake i18n
```
	
以下のような画面になるのでEを選択します。

```bash
	Welcome to CakePHP v2.4.5 Console
	---------------------------------------------------------------
	App : app
	Path: /htdocs/app/
	---------------------------------------------------------------
	I18n Shell
	---------------------------------------------------------------
	[E]xtract POT file from sources
	[I]nitialize i18n database table
	[H]elp
	[Q]uit
	What would you like to do? (E/I/H/Q)
	>
```
	
しばらくEnterを続けます。
	
```bash
	What is the path you would like to extract?
	[Q]uit [D]one
	[/htdocs/app/] >
```

そのままenter

```bash
	Current paths: /htdocs/app/
	What is the path you would like to extract?
	[Q]uit [D]one
	[D] >
```
	
そのままenter

```bash
	Would you like to extract the messages from the CakePHP core? (y/n)
	[n] >	
```

そのままenter

```bash
	What is the path you would like to output?
	[Q]uit
```

次でファイルを一つにまとめたい場合はｙ。分けたいならn。

```bash
	Would you like to merge all domain and category strings into the default.pot file? (y/n)
	[n] >
```

ここで生成されるので終わったら、

```bash
/htdocs/app/Locale/default.pot
```

を開いてみる。これを以下の

```bash
/htdocs/app/Locale/jpn/LC_MESSAGES
/htdocs/app/Locale/eng/LC_MESSAGES
```

ディレクトリそれぞれに、ファイル名を`default.po`に変更してengの方に英語を入れる。
Knockout.jsでセレクトボックスを作る


# ゴール
![スクリーンショット 2014-12-12 17.24.01.png](https://qiita-image-store.s3.amazonaws.com/0/9186/085b1e15-2318-c69d-5246-d3ca7e6a427c.png "スクリーンショット 2014-12-12 17.24.01.png")

初期状態では30人を選択している。

選択するごとに上から10,30,100,-1の値が取得できること

# ソースコード

```coffeescript
class SelectViewModel
  constructor: ->
    @log = ko.computed =>
      console.log(@selected_options()[0])

  display_nums: ko.observableArray([
    {text: '10人', value: 10},
    {text: '30人', value: 30},
    {text: '100人', value: 100},
    {text: 'すべて', value: -1}
  ])
  selected_options: ko.observableArray([30])
```

```haml
%select{data: {bind: "options: display_nums, optionsText: 'text', optionsValue: 'value', selectedOptions: selected_options"}}
```

このSelectViewModelをバインドし、セレクトボックスを操作するとconsole.logにそれぞれの値が表示される

ポイントとしては、selectedOptionsに渡す初期状態及び値を変更されるプロパティ（selected_optionsのこと）は、最初に選択されるvalueを渡すこと←ちょい嵌った...

# 雑談

selectedOptionsって書き方、どちらかと言うとselectedValueな気がする....
OSv で aobench を動かす.


漢は黙って lightweight cloud OS, Bare metal programming ですね! レイトレーシングアプリを lightweight な VM(OS) で 100 万ノード規模で動かせる可能性出てきました. 

OSv + aobench でまずは来るべき時代の準備してみましょう!
サンプルコードはこちらにあります.

https://github.com/syoyo/aobench-osv


## バイナリとイメージを作る.

バイナリ(OSv では Linux .so 形式?)は通常の C++ アプリと同じように Makefile とかでコンパイルしてつくっておきます.

## OSv 用イメージを作る.

capstan を用いてイメージを作ります. capstan をインストールしておきます. http://osv.io/capstan/

Capistanfile 書きます.

```
#
# Name of the base image.  Capstan will download this automatically from
# Capstan repository. 
#
base: cloudius/osv-base

#
# The command line passed to OSv to start up the application.
#
cmdline: /tools/ao.so

#
# The command to use to build the application.  In this example, we just use
# make.
#
build: make

#
# List of files that are included in the generated image.
#
files:
  /tools/ao.so: ao.so
```

イメージ作ります.

    $ capstan build

## 実行する.

    $ capstan run


Cool!


## TODO

* STDOUT か OSv REST API 経由で aobench 画像出力するとよさげ.
* Capstan で qemu での実行が失敗すると tty がハングしてつらい
* OpenMP(gomp)など, アプリに依存 .so ライブラリがあるときのアプリの作り方をどうすか?
nginx.conf で環境変数を読み込む

Docker container で nginx を起動するときとか、nginx.conf で何かしらのパラメータを動的に設定したいことがあると思います。`server_name` とか。
今回は nginx.conf で何とかして環境変数を読み込む手法を紹介します。

## TL;DR

__`env` ディレクティブ__と __ngx_http_perl_module__ (or lua_nginx_module) を使って、環境変数を nginx 変数に設定する。

## Example

`server_name` を環境変数 `SERVER_NAME` から動的に読み込む例を示します。

```nginx
user nginx;
worker_processes 4;

env SERVER_NAME;

http {
  perl_set $server_name_from_env 'sub { return $ENV{"SERVER_NAME"}; }';

  # ...

  server {
    server_name $server_name_from_env;
    
    # ...
  }
}
```

こうしておけば、`docker run -e SERVER_NAME=hoge.example.com hoge/nginx` みたいに都度 `SERVER_NAME` を設定できます。

## くわしく

nginx は起動時に親プロセスの環境変数を引き継ぎません。ですが、`env` ディレクティブを使えば特定の環境変数を nginx に引き継がせることができます。
`env` ディレクティブは main コンテキスト、つまり `user` とかと同じ階層でのみ宣言できます。

```nginx
env ENV_NAME
```

このまま `$ENV_NAME` みたいに参照できたら良いのですが、nginx はそれほど親切に作られていません。ここで読み込んだ環境変数を何らかの方法で nginx 変数に代入してやる必要があります。

そこで、`perl_set` ディレクティブを用いて Perl スクリプト経由で nginx 変数に代入します。
`perl_set` は ngx_http_perl_module に含まれているため、素の nginx では使えません。nginx ビルド時に入れてやる必要があります。

```shell-session
./configure --with-http_perl_module
```

`perl_set` は Perl スクリプトの戻り値を nginx 変数に代入します。今回は環境変数 `ENV` を読み込んで返すだけの簡単なスクリプトを用います。あと、代入先の変数名と環境変数名は分けてやる必要があります。環境変数名に `_from_env` とか付けたのを nginx 変数名にしときましょう。
`perl_set` ディレクティブは http コンテキストでのみ宣言できます。

```nginx
http {
  perl_set $env_name_from_env 'sub { return $ENV{"ENV_NAME"}; }';
  # ...
}
```

最後に、設定したいパラメータにて上記の nginx 変数を入れてやれば ok です。

```nginx
hoge_param $env_name_from_env
```

## 環境変数で動的に設定できないもの

http コンテキストで初めて nginx 変数に読み込める以上、main コンテキストで設定するパラメータについては上記の手法が使えません。
例えば以下のようなもの、

- `user`
- `worker_processes`

どうしてもこれらのパラメータを動的設定したい場合は、sed とか ERB を使って nginx.conf 自体を動的生成する必要があるでしょう。

## あわせて読みたい
- http://nginx.org/en/docs/ngx_core_module.html#env
    - `env` ディレクティブについての公式リファレンス
- https://www.ruby-forum.com/topic/2583637
    - Lua 経由で設定する例。すでに lua_nginx_module をロードしているならこっちの方が良いかも。
- http://heartbeats.jp/hbblog/2014/07/3-tips-for-nginx-on-docker.html
    - `perl_set` と `set_by_lua` 両方についての説明
XfceでWindowsキーを押すとメニューが出るようにする設定

Xfce4 にも Windows のスタートメニューのようなものがあります。
これを開くと検索テキストボックスにフォーカスがあたっている状態になっており、アプリケーションの名前をタイプすると対象が絞り込まれるようになっています。

LinuxでいうSynapse, MacOSX でいう Alfred のような感じですね。

こいつは便利なのですが `Super` キー(Windowsキー）を押しても展開せず、デフォルトではメニューをクリックするか `Ctrl + ESC` を押さないといけません。

かといって Xfce4 では `Super` にショートカットが割り当てられているわけではないので、 `Super` でメニューが開くようにしましょう。

設定は簡単で、
「設定」→「キーボード」→「アプリケーションショートカットキー」タブ→「Xfce4-popup-whiskermenu」の項目を変更するだけです。

あれはウィスカーメニューというんですね。
縦横比を維持したボックスを生成するmixin


スマートフォンサイトにおいて、画面サイズに左右される事なく同じ縦横比を保ちたい、という場面に出くわしたので、`mixin`にしてみました。

## mixin

```scss:mixin
// 1:1
@mixin same-ratio-box($width:'100%', $height:'100%') {
	position: relative;
	width: #{$width};
	height: auto;

	&:before {
		content: '';
		display: block;
		padding-top: #{$height};
	}

	> * {
		position: absolute;
		top: 0;
		left: 0;
		width: 100%;
		height: 100%;
	}
}
```

## e.g.

```jade:html
div.box.half
  div.box-inner
    p ボックス

div.box.origin
  div.box-inner
    p ボックス
```

```scss:scss
// 2:1
.half {
	@include  same-ratio-box('100%', '50%');
}

// 画像サイズの縦横比維持
.origin {
	@include  same-ratio-box('100%', percentage(image-height('origin.png') / image-width('origin.png')));
}

```

## おまけ

```scss:mixin
@mixin same-ratio-table($width:'100%', $height:'50%') {
	@include same-ratio-box($width,$height);

	> * {
		// table
		> * {
			display: table;
			width: 100%;
			height: 100%;

			> * {
				display: table-cell;
			}
		}
	}
}
```
モナド則の絵を描いてみた

この記事は次の記事に統合しました。詳しくはそちらをご覧ください。

* [モナド則がちょっと分かった？](http://qiita.com/7shi/items/547b6137d7a3c482fe68)

# 1. `return x >>= f` == `f x`

![1.png](https://qiita-image-store.s3.amazonaws.com/0/32057/0a2ade75-80e3-250c-70a4-2d6594bd7dfe.png)

# 2. `m >>= return` == `m`

![2.png](https://qiita-image-store.s3.amazonaws.com/0/32057/cb7fbca1-99ea-3669-21ee-ac00bdb57b98.png)

# 3. `(m >>= f) >>= g` == `m >>= (\x -> f x >>= g)`

![3.png](https://qiita-image-store.s3.amazonaws.com/0/32057/d75f4a10-e24f-8919-abcf-41f28bb72bed.png)
SDSQLを起動してみる

##  SDSQLって何？

SDSQLはSQL Developerのsqlplusエンジンをコマンドラインで使えるものにしたものだそうです。
(http://krisrice.blogspot.jp/2014/12/what-is-sdsql.html)

## SDSQLをダウンロードする

Oracle SQL Developer 4.1 Early Adopterで配布されていまして、下記からsdsql-4.1.0.14.342.0746-no-jre.zipをダウンロードできました。

http://www.oracle.com/technetwork/developer-tools/sql-developer/downloads/sqldev-41ea-2372780.html

## SDSQLを起動してみる

1. Java8が必要なのであらかじめインストールしておく。
2. 上でダウンロードしたZIPファイルを解凍。中身をD:\tmp\20141212_174544\sdsqlに置いた
3. 下記で起動

```bat
> .\bin\sdsql.bat USERNAME/PASSWORD@//HOST:PORT/SID
```

![sdsql.png](https://qiita-image-store.s3.amazonaws.com/0/140/df466047-8be0-d0f1-45a3-3fb322e07e9b.png)

## 使い方

これからっす。
pyenv + eclipse で Django の開発環境を構築する（その１）

SIer で働く残念な Ruby エンジニアが python の開発をしてみるにあたって調査した結果を黙々と書いてみます。ちなみに MacBook Air 11 (Mid-2013) を使っています。ボケていたら指摘してください。

本記事は、pyenv を使って python をインストールします。eclipse をインストールし、サンプルアプリケーションを作る記事は、[pyenv + eclipse で Django の開発環境を構築する（その２）](http://qiita.com/nakamura-akifumi/items/a897b8382ef59a8815d8) です。

# pyenv の導入

python にも ruby の rbenv のようなバージョン管理ソフトがあるようなので、まずは導入してみようと思います。とりあえず ruby の作法のようにいってみる感じです。

brew で出来るようなんで以下のコマンドをタイプします。

```
$ brew install pyenv
```

おー楽勝。あとは、rbenv と同じ。

```
$ pyenv install 3.4.2
$ pyenv global 3.4.2
$ pyenv rehash
$ pyenv versions
  system
* 3.4.2 (set by /Users/nakamura/.pyenv/version)
```

rehashをタイプするのは面倒なんで、rbenv-rehash のようなもの探すと、やっぱりありました。

https://github.com/yyuu/pyenv-pip-rehash

でも、brew で出来ないかなと調べると。ありました。

```
brew install pyenv-pip-rehash
```

まー、簡単です。

# Django のインストール

Django は、rails のようなフルスタックの Webフレームワークのようです。使ってみたいので、インストールします。

pip というコマンドが、Ruby でいうところの gem のようなんで、やってみます。

```
$ pip install django
Downloading/unpacking django
  Downloading Django-1.7.1-py2.py3-none-any.whl (7.4MB): 7.4MB downloaded
Installing collected packages: django
Successfully installed django
Cleaning up...
```

rails よりさくっとインストールできました。

ここまでのまとめ。

* python は、pyenv でバージョンが管理できる。
* pyenv-pip-rehash で rehash いらず。
* pip は、rubygems みたいな感じ？
AngularDartから引っ越す先を考える

こんにちは、らこです。枠が空いてればアドベントカレンダーに書いたんですが、嬉しい事に空いてないので勝手に書きます。

# AngularDartが息をしてない
10/11に堂々と1.0リリースで安定化するかと思われたAngularDartですが、安定どころか眠ってます。

https://github.com/angular/angular.dart

masterブランチは最終コミットが10/31です。そもそも、1.0バージョンアップ以降のコミットが3件です。https://github.com/angular/angular.dart/commits/master

READMEに貼られたTravis CIのバッヂは2ヶ月間緑になってません。

https://travis-ci.org/angular/angular.dart

# なぜこんなことに
憶測：AtScriptの発表が10/27

# 乗り換えよう
今後息を吹き返すことがあるにしろ、こんな状態を2ヶ月も放置できてしまう開発チームを私はあまり信頼できないです。「ちょっと使う」では収まらない規模のフレームワークで、アプリ全体がAngularに依存することになるので、ベンダが信用出来ないとなると乗り換え先を探さないといけません

しかしpubで探してもまともにメンテされてるWebアプリフレームワークがほとんどありません。さらにAngularくらい強力で実用性のあるものとなるとほぼ皆無です

# 現実解
## Web Componentsを使いたいならPolymer.dart
https://www.dartlang.org/polymer/
Web Components使いたいならもうPolymerしかないです。初期に比べたら格段に[使いやすくなってます](http://qiita.com/k_ui/items/6872e67c4196c9fab239)し、開発リソースも十分みたいでちゃんとアプデされてて信頼性も抜群です。

## もしくはReact-dart
https://pub.dartlang.org/packages/react
最近盛り上がってる仮想DOMの波に乗るのもいいかと思います。私はこれからこっちに注力します。

# まとめ
1.0になってもAngularDartはAngularDartでした。つらい。
Sails.js(0.10.x)のModel.native()でIDを指定したクエリーを書く方法

# Sails.js(0.10.x)のModel.native()でIDを指定したクエリーを書く方法
MongoDB on Sails.jsで`$inc演算子`を使いたくてnative()でクエリーを実行したところ、ModelのIDを指定するのに手間取ったのでメモ。

## 実装方法
mongodbモジュールに入っている`ObjectID`を使用したいのでインストール。mongodbモジュールのObjectIDはbsonモジュールのObjectIDのラッパーなので、インストールするのはbsonでもよい。mongodbの方が今後使いそうな気がしたのでmonbodbにしています。

```
$ npm install mongodb --save
```

複数のController/Modelから使いたくなりそうなのでServicesに定義。

``` api/services/Mongo.js
module.exports = (function() {
  var mongo = require('mongodb');

  var id = mongo.ObjectID;

  return {
    ObjectID: id
  };
})();
```

native実行時にid(String)をMongo.ObjectID()に渡してやればOK。また、通常の`find()`や`update()`でidを指定する場合のkeyは`id`ですが、`native()`の場合は_idで。mongo的には_idで定義されていて、それをSails.jsがいい感じに変換してくれているので注意。

```js
Message.native(function(err, collection) {
  collection.update({_id: Mongo.ObjectID(id)}, {$inc: {like: 1}}, function(err, results) {
    res.send(200);
  });
});
```

ちなみに同じことをupdate()でやろうと思うとこうなる。

```js
Message.findOne(id).exec(function(err, message) {
  Message.update({id: id}, {like: message.like + 1}).exec(function(err, message) {
    res.send(200);
  });
});
```
[ruby] 3ヶ月前の日付を得る

active_supportが入っている前提で。

やり方は色々あるけど、メモとして

今は、こんな日付

```rb
[1] pry(main)> Date.today
=> Fri, 12 Dec 2014
```

### Date.today - 3.months
```rb
[2] pry(main)> Date.today - 3.months
=> Fri, 12 Sep 2014
```

### Date.today << 3
```rb
[3] pry(main)> Date.today << 3
=> Fri, 12 Sep 2014
```

これは標準関数
[class Date self << n -> Date](http://docs.ruby-lang.org/ja/1.8.7/class/Date.html#I_--3C--3C)

### 3.months.ago
```rb
[4] pry(main)> 3.months.ago
=> Fri, 12 Sep 2014 17:12:44 JST +09:00
```
これはTime classになっているので注意

```rb
[5] pry(main)> 3.months.ago.class.name
=> "Time"
```
意図的にDateが欲しい場合はこっち

```rb
[6] pry(main)> Date.today.months_ago(3)
=> Fri, 12 Sep 2014
```

参考: [Rails, 1.month.ago とは何か - Qiita](http://qiita.com/closer/items/e5a0b93a1cbcdf2e7216)

### Date.today.advance(months: -3)
```rb
[7] pry(main)> Date.today.advance(months: -3)
=> Fri, 12 Sep 2014
```

いろいろあるね
i18n-jsで必要な言語のみロードしてパフォーマンスUP

Railsで多言語対応する時、localeのymlファイルをjavascriptで利用できる[i18n-js](https://github.com/fnando/i18n-js)というgemが便利です。i18n-jsについては[Railsでi18n-jsを使ってJavaScriptの国際化](http://d.hatena.ne.jp/a_kimura/20120221)にわかりやすくまとめられています。
ただ、このi18n-jsは工夫して使わないとパフォーマンスが劣化することがあります。

#巨大なtranslation.js
i18n-jsを普通に利用すると、全ての言語の翻訳が`translation.js`という1つのjavascriptにまとめられます。ユーザーが見る言語分だけでいいはずなのに無駄にファイルサイズが膨らんでしまい、スマホで見るとjsのロード時間に時間がかかったりします。

そこで、i18n-jsをlocaleごとに分割して必要な言語分の翻訳リソースのみを利用するようにすることでロード時間を短縮することができます。

#1. i18n-js.ymlに設定を記述

まず、各言語ごとのファイルを出力するために`config/i18n-js.yml`を用意します。
下記のように書いておくと、`app/assets/javascripts/i18n`の中に、`ja.yml`、`en.yml`といった言語ごとのlocaleファイルが出力されるようになります。

```i18n-js.yml
translations:
- file: "app/assets/javascripts/i18n/%{locale}.js"
```

#2. rake i18n:js:exportで出力

ターミナルで

```
$ rake i18n:js:export
```
と打つと、先ほど設定したディレクトリに各localeファイルが出力されます。


#3. 必要なlocaleファイルだけ読み込むように修正

ユーザーの必要なlocaleファイルのみを読み込むように、viewを修正します。
`application.html.erb`や`application.html.haml`の`application.js`を読み込んでいるあたりで、下記のように記述します。（hamlの場合を記述しています）

```application.html.haml
- if Rails.env.development?
  = javascript_include_tag "/assets/i18n/translations"
- else
  = javascript_include_tag "i18n/#{I18n.locale}"
```

developmentモードの場合はいちいちlocaleをlocaleを分割したりしないので、`translations.js`を読むようにしておきます。それ以外の場合、先ほど出力したi18nディレクトリ以下のlocaleファイルを読み込むようにします。これで、ユーザーに必要なlocaleファイルだけが読み込まれるようになります。

#4. production.rbを書き換えてasset pipelineに対応

各localeのjsファイルにハッシュ値をつけるために、出力したlocaleファイルがprecompileされるように`production.rb`に設定を追加します。下記を記述することで、`app/assets/javascripts/i18n/`以下のjsファイル全てがprecompile対象になります。

```production.rb
config.assets.precompile += %w( application.js application.css )
 
files = Dir[Rails.root.join('app', 'assets', 'javascripts', 'i18n', '*.js')]
files.map! {|file| file.sub(%r(#{Rails.root}/app/assets/javascripts/), '') }
config.assets.precompile += files
```

#5. rake assets:precompile を実行

この状態で`asset:precompile`すれば完了です。capistranoなどを使ってデプロイする場合、`rake assets:precompile`の前に実行するようにタスクを組んでください。

----

これで、日本語を設定しているユーザーには`ja.js`、英語を設定しているユーザーには`en.js`というように、必要なlocaleファイルだけがロードされるようになります。railsで多言語対応を行うにあたり、jsのロード時間を節約したい時は試してみてください。
Cakephpで便利な、変換サイト一覧

*cakephpのモデルやテーブル名教えてくれるツール*
http://www.cpa-lab.com/tech2/inflects/


*SQLをcakephpの書き方に変換するツール*
http://dogmatic69.com/sql-to-cakephp-find-converter#converted-code
★超絶便利！paginate形式等も出してくれる、、！
cakePHPでHABTMのレコードを一括保存する方法


やたら悩んだのでメモ。

hasAndBelongsToManyな関係を定義して扱いたかったので、お手本どおり
Cake HABTM ingredients
として、ケーキと材料が多対多の関係になるように定義した。

cakes, ingredients, cakes_ingredients の三つのテーブルを定義。
cakes_ingredientsの中身は

```
id, cake_id, ingredient_id
```

(idはなくてもいいらしい）

このとき、テーブル名は Model1Name_Model2Nameにするんだけど、必ずアルファベット順に並べないといけないらしい。

で、このテーブルに

* 新しくケーキを追加したい
* 既存の材料を追加したケーキと関連づけたい

時は、以下のようにsaveAllを使って行う。

```
$data = array(
	'Cake' => array(
		'name' => 'ショートケーキ',
		),
	'Ingredient' => array(
		'Ingredient' => array(
			1, 3, 4  // 既にある材料のID
			)
		)
	)

$this->Cake->saveAll($data);
```

これでcakesとcakes_ingredientsの両方のテーブルにレコードが挿入されます。

…Railsと複数形の扱いが似てるようで違うので混乱する…
そして$dataの中でIngredientのarrayを二重にしないといけないのがわからなくてはまりました。
テキストエリアの内容をダウンロードできるようにする


メモ

```html:html
<textarea id="txtarea"></textarea>
<a href="" id="DLlink" download="download.txt">ダウンロード</a>
```

```js:JavaScript
document.querySelector('#DLlink').onclick = function() {
	var text = document.querySelector('#txtarea').value;
	this.href = 'data:text/plain;charset=utf-8,'
		+ encodeURIComponent(text);
};
```
CentOSからUbuntuにOSを入れかえた



CentOS使ってたのですが、Xwindowが起動せずGUIが使えなくなってしまったので、Ubuntuに乗り換えてみました。
で、OS再インストールに結構ハマったのでメモ。

##0.PCスペックと必要なもの
#### PCスペック
ASUSのZENBOOK UX31で、元々Windows 7が入っていたものにCentOS6を入れて使っていました。
#### 必要なもの
* Ubuntuインストールイメージファイル
* インターネット環境
 
##1. Ubuntu インストールディスク用意
[日本語 Remixイメージのダウンロード](https://www.ubuntulinux.jp/download)をDLして、DVD-Rに焼きます。ここは巷にあるWebサイトの手順みれば問題無いかと思います。
データは1.2GB程度でした。



##2. CentOSをシングルモードで起動する
PCを立ち上げるとCentOSの起動前にpress any key enter menu が表示されます。適当なボタンを押してメニューに入ります。

CentOSを(e)で選択 -> kernel を(e)で選択
コマンド入力画面となるので、半角スペースを置いてからsingleと書く

```
#kernel /hogehoge... root=LABEL=/ rgbh quiet single
```

エンターを押して変更を反映させた後、bをおしてboot

##3. fdiskでパーティションを削除
* パーティションの状況を確認します

```
#fdisk -l
...
Device     Boot  Start
/dev/sda1   *      1
/dev/sda2
/dev/sda3

```

みたいなメッセージがでます。sdaというのがデバイス名となります。

* dコマンドで削除します

```
#fdisk /dev/sda
Command (m for help): p  //情報を表示
Command (m for help): d  //パーディション削除
Partition number(1-4):1  //削除するパーティション番号を選択
Command (m for help): d  //次のパーティション削除
...
Command (m for help): w  //パーティション情報を反映して終了


```

##4. BIOSモードで再起動
1.で用意したイメージディスクの入ったDVDドライブをPCに接続した状態で再起動します。この時BIOSモードで起動します。BIOSモードにする方法は、各PCによってことなるので、ググって調べます。(ASUS ZENBOOKはF2でBIOSモードに入りますが、起動が速いために上手いタイミングで押さないとBIOSモードにはいれません)
なおBIOSモードで起動しないとGRUBというブートローダーが起動しますが、ここではもうパーティションないので、何もできません。

##5.DVDのインストーラ起動
DVDから起動させるために、BIOSのSave&Exitを選択し、Boot OverrideからDVDドライブ(ここではLENOVO USB MultiBurner21.CG)を選択します。
![IMG_0239.JPG](https://qiita-image-store.s3.amazonaws.com/0/39433/32e42a3c-cd56-019f-6ce6-b04dabf60e1d.jpeg)

これでUbuntuのインストーラが立ち上がります。

インストーラから新規インストールかお試しで利用するか、というダイアログがでるので、新規インストールを選択します。
次の画面でインターネット接続情報が求められるので、粛々とつないでOKすると、自動的にインストールが始まります！


##参考
このへんみながらやりました。
シングルユーザーモード <http://infrakeise.blog92.fc2.com/blog-entry-151.html>
fdiskコマンド <http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230775/>
fdiskコマンド2 <http://blogs.wankuma.com/yuki/archive/2008/03/03/126049.aspx>
cron

| 設定                     | 説明                                      |
|:-------------------------|:------------------------------------------|
| 43 23 * * *              | 23:43に実行                               |
| 12 05 * * * 　　         | 05:12に実行                               |
| 0 17 * * *               | 17:00に実行                               |
| 0 17 * * 1               | 毎週月曜の 17:00に実行                    |
| 0,10 17 * * 0,2,3        | 毎週日,火,水曜の 17:00と 17:10に実行      |
| 0-10 17 1 * *            | 毎月 1日の 17:00から17:10まで 1分毎に実行 |
| 0 0 1,15 * 1             | 毎月 1日と 15日と 月曜日の 0:00に実行     |
| 42 4 1 * * 　          　| 毎月 1日の 4:42分に実行                   |
| 0 21 * * 1-6　　         | 月曜日から土曜まで 21:00に実行            |
| 0,10,20,30,40,50 * * * * | 10分おきに実行                            |
| */10 * * * * 　　　　　　| 10分おきに実行                            |
| * 1 * * *　　　　　　　　| 1:00から 1:59まで 1分おきに実行           |
| 0 1 * * *　　　　　　　　| 1:00に実行                                |
| 0 */1 * * *　　　　　　　| 毎時 0分に 1時間おきに実行                |
| 0 * * * *　　　　　　　　| 毎時 0分に 1時間おきに実行                |
| 2 8-20/3 * * *　　　　　 | 8:02,11:02,14:02,17:02,20:02に実行        |
| 30 5 1,15 * *　　　　　　| 1日と 15日の 5:30に実行                   |
Requests で Docker Remote API にアクセスする

# 概要
Python [Requests](http://docs.python-requests.org/en/latest/) から [Docker Remote API](https://docs.docker.com/reference/api/docker_remote_api/) を利用したい．暗号化を行えば TCP からでも利用できるが，API を同じホストから利用することを考えているため unix ソケットを使う．

# Unix ソケットの読み書き
Docker のソケットファイルは `/var/run/docker.sock` にある．ソケットファイルの読み書きは，次の通り．

```py
import socket
s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
s.connect("/var/run/docker.sock")
# s.recv, s.send, etc.
```

# Requests で独自ソケットを使う
こちらはかなり面倒で，[Transport Adapter](http://docs.python-requests.org/en/latest/user/advanced/#transport-adapters)を実装する必要がある．そして，そのためには，PoolManager，HTTPConnectionPool，HTTPConnection も合わせて実装する必要がある．

```py
import socket
import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3 import PoolManager, HTTPConnectionPool
from httplib import HTTPConnection

class MyAdapter(HTTPAdapter):

    def __init__(self, sockfile, **kwargs):
        self._sockfile = sockfile
        super(MyAdapter, self).__init__(**kwargs)

    def init_poolmanager(self, connections, maxsize, **kwargs):
        self.poolmanager = MyPoolManager(self._sockfile,
                                         num_pools=connections, maxsize=maxsize)


class MyPoolManager(PoolManager):

    def __init__(self, sockfile, **kwargs):
        self._sockfile = sockfile
        super(MyPoolManager, self).__init__(**kwargs)

    def _new_pool(self, scheme, host, port):
        return MyConnectionPool(self._sockfile, host, port, **self.connection_pool_kw)


class MyConnectionPool(HTTPConnectionPool):

    def __init__(self, sockfile, host, port, **kwargs):
        self._sockfile = sockfile
        super(MyConnectionPool, self).__init__(host, port, **kwargs)

    def _new_conn(self):
        self.num_connections += 1
        return MyConnection(self._sockfile,
                            host=self.host, port=self.port, strict=self.strict)
   
   
class MyConnection(HTTPConnection):

    def __init__(self, sockfile, **kwargs):
        self._sockfile = sockfile
        HTTPConnection.__init__(self, **kwargs)

    def connect(self):
        self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
        self.sock.connect(self._sockfile)

        if self._tunnel_host:
            self._tunnel()
```

HTTPConnection は old-style クラスなので，初期化方法に注意．

# API の利用
利用例は次の通り．

```py
req = requests.Session()
req.mount("http://", MyAdapter("/var/run/docker.sock"))
print req.get("http://127.0.0.1/images/json?all=0").json()
```

http://127.0.0.1 と書いているところがダサい・・・．

# 参考
  * [Using Python “requests” with existing socket connection - Stack Overflow](http://stackoverflow.com/questions/14665064/using-python-requests-with-existing-socket-connection)
SPARQLの基本


あまり使わなくて、いつも忘れるのでメモ。

# 参考サイト

## SPARQLの仕様

http://www.w3.org/TR/sparql11-query/

## DBpedia

SPARQLを試すのに便利。
以下の説明で記載するSPARQLはDBpediaで試している。

http://ja.dbpedia.org/sparql

# 基本の形

* “?”で始まるトークンは変数。
慣例的に、主語(Subject)、述語(predicate)、目的語(object)の頭文字をとり、?s, ?p, ?oとする。

* WHERE句の最後には”.”をつける。
1行のみの場合は省略できる。

* “LIMIT”を指定することで件数を制限する。

```
SELECT ?s ?p ?o
WHERE {
  ?s ?p ?o .
}
LIMIT 100
```

# SELECT

毎回フルIRIを書かなくていいように”PREFIX”を宣言できる。

```
PREFIX dbp:<http://ja.dbpedia.org/resource/>
PREFIX dbp-owl:<http://dbpedia.org/ontology/>

SELECT DISTINCT *
WHERE {
  dbp:手塚治虫 dbp-owl:birthPlace ?o .
}
```

# ASK

存在すればTrue, しなければFalseを返す。

```
PREFIX dbp:<http://ja.dbpedia.org/resource/>
PREFIX dbp-owl:<http://dbpedia.org/ontology/>

ASK
WHERE {
  dbp:手塚治虫 dbp-owl:birthPlace ?o .
}
```

# DESCRIBE

全部とってくる。

```
PREFIX dbp:<http://ja.dbpedia.org/resource/>

DESCRIBE dbp:手塚治虫
```

# COUNT

```
PREFIX dbp:<http://ja.dbpedia.org/resource/>
PREFIX dbp-owl:<http://dbpedia.org/ontology/>

SELECT dbp:手塚治虫 AS ?author,COUNT(?o) AS ?countOfWorks
WHERE {
  dbp:手塚治虫 dbp-owl:notableWork ?o .
}
```

# GROUP BY


```
PREFIX dbp:<http://ja.dbpedia.org/resource/>
PREFIX dbp-owl:<http://dbpedia.org/ontology/>

SELECT ?author, (COUNT(?works) AS ?countOfWorks)
WHERE {
  ?author dbp-owl:notableWork ?works
}
GROUP BY ?author
ORDER BY DESC(?countOfWorks)
LIMIT 100
```


# サブクエリとAVG


```
PREFIX dbp:<http://ja.dbpedia.org/resource/>
PREFIX dbp-owl:<http://dbpedia.org/ontology/>

SELECT AVG(?countOfWorks) AS ?avgOfWorks
WHERE{
  SELECT ?author, (COUNT(?works) AS ?countOfWorks)
  WHERE {
    ?author dbp-owl:notableWork ?works
  }
  GROUP BY ?author
}
```
sass の prefix を付けるのが面倒、@include も面倒というあなたへ

```sass:box-shadow.sass
.hoge
  +box-shadow(0 0 3px rgb(0, 0, 0))
```

```css:box-shadow.css
.hoge {
  -moz-box-shadow: 0px 0px 3px black;
  -webkit-box-shadow: 0px 0px 3px black;
  box-shadow: 0px 0px 3px black;
}
```
.sass のみ + を使えます。.scss は @include しましょう。
GoogleAnalytics でデッドロックする問題

GooglePlayServices が 6.5.87 にアップデートされましたが、どうやら GoogleAnalytics に問題があるようで、ある条件が揃うとデッドロックして ANR に陥るようです。

https://code.google.com/p/android/issues/detail?id=82157

スレッド自体は`WrongForum`でクローズされてしまっていますが、致命的なバグであるとして開発者の間では物議を醸しているようです。

スレッドにもあるように、以下のコードでデッドロックすることがあります。

```java

GoogleAnalytics analytics = GoogleAnalytics.getInstance(context);
```

このコードがダメって、もう、根本からあかんやつなんですがね…

マニフェストファイルから GoogleAnalytics のグローバルな config を消したら解消した、という報告もありますが、うまくいかない例もあるようです。

ひとまず、しばらくは以前のバージョンを使うのが良さそう…
dockerコンテナからflywayでマイグレーションしたい



SBTを立ち上げる。


```
./sbt -Dflyway.url=jdbc:mysql://$MYSQL_PORT_3306_TCP_ADDR:$MYSQL_PORT_3306_TCP_PORT/mydb
```

※build.sbtに環境変数を使う設定が分からないので、引数で渡してsbtを起動している。


マイグレーションを実行する

```
> flywayMigrate
```


テーブルを全部消し去りたいとき

```
> flywayClean
```
AtCoderを高速で始められるスクリプト書いたよ！

コマンドラインからでコンテスト名のディレクトリとa.py, b.py, c.py, d.pyを保存する。

## 使い方（例）
※arc021の部分は各コンテスト名に対応
1. コマンドラインで``` python start_atcoder.py arc021 ```ターン！
2. 実行したディレクトリにarc021が出来る。
3. arc021の中にはa.py, b.py, c.py, d.pyが作られている。
4. ファイルを作る手間が省ける！

```py3
import os
import sys

def main():
    argvs = sys.argv
    argc = len(argvs)

    if argc < 1:
        print('Usege\nstart_atcoder.py contest_name')
        exit(0)
    contest_name = argvs[1]
    if os.path.exists(contest_name):
        print(contest_name, 'is exists.')
    else:
        os.mkdir(contest_name)
        print(contest_name, 'is created.')

    problem_number = 4 
    for i in range(problem_number):
        path = contest_name+'\\'+chr(ord('a')+i)+'.py'
        if os.path.isfile(path):
            print(path, 'is exists')
        else:
            f = open(path,'w')
            f.close()
            print(path, 'created')

if __name__ == '__main__':
    main()
```
ソースコードからインストールしたGitをアンインストール

## こんなあなたに

yumなくソースコードからインストールしたGit
パッケージが足りてなくて動かないではないか！
よし、make uninstallだ！

~~~console
# make uninstall
make: *** ターゲット `uninstall' を make するルールがありません.  中止.

# cat Makefile | grep uninstall
#
~~~

▂▅▇█▓▒░(’ω’)░▒▓█▇▅▂うわあああああああ

<br>

## インストールされたものを、全部消す

今のところ問題はなさそうですが、自己責任でお願いします。

<br>

#### インストールされたものを確認

１. 指定したディレクトリを/としてインストールする

~~~console
# mkdir /tmp/git-install-test
# make install DESTDIR=/tmp/git-install-test
~~~

<br>

２. インストールされたファイルのリストを出力

~~~console
# find /tmp/git-install-test -type f -print > /tmp/git-install-filelist.txt
~~~

`-type f`でディレクトリは出力しないのが味噌

<br>

３. ファイルリストを修正

~~~vim:before
/tmp/git-install-test/usr/local/lib64/perl5/perllocal.pod
/tmp/git-install-test/usr/local/lib64/perl5/auto/Git/.packlist
/tmp/git-install-test/usr/local/libexec/git-core/git-sh-setup
...省略...
~~~

全行の`/tmp/git-install-test`を消去

~~~vim
:%s/\/tmp\/git-install-test//g
~~~

~~~vim:after
/usr/local/lib64/perl5/perllocal.pod
/usr/local/lib64/perl5/auto/Git/.packlist
/usr/local/libexec/git-core/git-sh-setup
...省略...
~~~

<br>

#### ファイルリストにしたがって全消し

~~~console
# cat /tmp/git-install-filelist.txt | xargs rm -f
~~~

~~~console
# git --version
-bash: /usr/local/bin/git: そのようなファイルやディレクトリはありません
~~~

<br>
必要なパッケージをよく確認してからインストールしましょうね(自戒)
<br>

## 参考
http://q.hatena.ne.jp/1143381629
Chrome for AndroidでのGamepad APIのレイアウトマッピング

ちょっと手元にBluetoothなゲームパッドが3つほど揃ったので、Chrome for AndroidのGamepad APIでどれだけ使えそうか確認してみた。

W3CのGamepad APIの仕様とかはこの辺に
https://dvcs.w3.org/hg/gamepad/raw-file/default/gamepad.html

# テスト環境とかデバイス

## ゲームパッド
- [Nexus Player 用ゲームパッド](https://play.google.com/store/devices/details/Gamepad_for_Nexus_Player?id=nexus_player_gamepad)
- [Red Samurai Tablet Wireless Game Controller](http://www.gamestop.com/android/accessories/tablet-wireless-game-controller-v2/104425)
- [Amazon Fire TV Game Controller](http://www.amazon.com/Amazon-53-000894-Fire-Game-Controller/dp/B00DU0ZI8Q)

米国滞在中なので、米国で入手できるもの。
Red Samuraiとかは、GameStopで店員さんに「Androidで使えるやつくれ」って言って一番安かった($12)やつ。

## 端末
Nexus 5
Android 5.0
Chrome for Android 39.0.2171.59

## 確認方法

確認は、面倒だったので、こちらのテスターを使いました。
http://www.html5rocks.com/en/tutorials/doodles/gamepad/gamepad-tester/tester.html

## 比較用のレイアウトについて
今のところ、Standardレイアウトしかサポートされていないので、これとの対比で見ていきます。

![w3c_gamepad.png](https://qiita-image-store.s3.amazonaws.com/0/52410/bbf2c33f-0a8c-5ca3-16ff-0a863e22c461.png)

# 確認結果

青字はStandardレイアウトと合致しているもの、赤字は問題あるもの。

## Nexus Player 用ゲームパッド
![asus_gamepad.png](https://qiita-image-store.s3.amazonaws.com/0/52410/ae6b8862-8ad8-b822-afb5-9ac8f14e8fda.png)

Google謹製(端から見たらFire TVにブチギレて作ったように見える)のNexux Playerと同時に発売された、専用のゲームパッド。メーカーは安定と信頼のASUS。
出自から考えて、今回一番期待してたけど、他と似たようなもの。。。（こいつのせいじゃないけど）

Gamepad API経由で取れるものでは、L2, R2, Jog X-Yはアナログ入力、他は全部デジタル入力。

## Red Samurai Tablet Wireless Game Controller
![gamestop_redsamuarai.png](https://qiita-image-store.s3.amazonaws.com/0/52410/3b7c7acc-8e48-3576-df7f-7c8f6da1024e.png)

ゲームショップ"GameStop"のプライベートブランドの商品。商品ページからしてだいぶSAMURAI!!!な感じ。
Gamepad API経由で取れるものでは、Jog X-Yはアナログ入力、他は全部デジタル入力。


## Amazon Fire TV Game Controller
![amazon_file_tv_gamepad.png](https://qiita-image-store.s3.amazonaws.com/0/52410/173e4581-2f30-6f49-2159-acb09f740342.png)

2014前半にひっそりと発売された、Amazon Fire TVの専用ゲームパッド。
Amazon Fire TV自体が、自前のビデオサービスのコンソールという役割と同じくらい、ゲームコンソールという側面をかなり推してた。ゲームクリエイター向けのworkshopもSFで行ってた。

今回の中では唯一のXBOX/Dreamcast配置。

# まとめ
Chrome for Androidにおいては、Gamepad APIの対応は現状(2014年12月)ではまだまだ微妙です。
安定して使えそうなのは、A,B,X,Y(Button0..3)と、L-Jog Stick(axes0..1, Button10)です。

取れているけどレイアウトが違う、とかだとまだアプリケーション側で対応できますが、そもそも取れてこないのがとても痛い。特にD-Pad。
L-Jog Stickが取れてるからまだFPS系なら・・・という儚い希望も、L2、R2の絶望的な状況で砕かれます。

まだAPI自体がDraftなので、今後徐々に対応してくれるものとおもいますが、WebでGamepadが使えるようになってうれしそうなのはモバイルなので、倍プッシュで対応してほしいなぁ。と。

ちなみに、自分のコードで直接確認する場合は、PCのChromeからリモートデバッグをやって、navigator.getGamepads()してやると、以下のように取れます。

![Developer_Tools_-_gamepad_api.png](https://qiita-image-store.s3.amazonaws.com/0/52410/8a52d708-af34-ed57-79f9-f0b91311f25c.png)

ちゃんとOSでの認識順の通り、ゲームパッドが配列でとれてますね。

W3Cの仕様書だけだと想像ができない私のようなボンクラにはこちらがおすすめ。
virtualbox環境を復旧した話

プロジェクトの開発環境ではvagrant + chefでプロビジョニングしてるんですが、先日どうにもvirtualboxの調子が悪くなってしまいました。
状態として、仮想マシンが2つになったり（マシン名に付与される数値は違う）起動中のまま固まったりで。

結論から言いますと、virtualboxのver4.3.20からver4.3.12にダウングレードし、以下の手順を実行しました。

[![](http://img.youtube.com/vi/OhdyMqASkiU/0.jpg)](https://www.youtube.com/watch?v=OhdyMqASkiU)

要するに、ver4.3.12に再インストールした後で、仮想マシン起動時にE_FAILが返ってくる場合、再度ver4.3.12のインストーラを起動し、repairを選択します。
ちなみに、ここでremove⇒再インストールを延々繰り返しても一向に解決しませんでした。

取りあえず上記手順で解決しましたが、ver4.3.20（2014/12/12時点での最新）はまだ様子見です。
「Git補完をしらない」「git statusを1日100回は使う」そんなあなたに朗報【git-completionとgit-prompt】

# はじめに
* 「Git補完をしらない」「commitブランチを間違える」「git statusを1日100回は使う」そんなあなたに朗報です。
* bashの説明だけに絞っています。zsh？　tcsh？　知らない子ですね。


# いきなり完成形

![beautifulPrompt.jpg](https://qiita-image-store.s3.amazonaws.com/0/59549/2abf970a-5906-9806-afc6-c54b37439092.jpeg)

```shell-session:.bashrc
# スクリプト読み込み
source $HOME/.git-completion.bash
source $HOME/.git-prompt.sh

# プロンプトに各種情報を表示
GIT_PS1_SHOWDIRTYSTATE=1
GIT_PS1_SHOWUPSTREAM=1
GIT_PS1_SHOWUNTRACKEDFILES=
GIT_PS1_SHOWSTASHSTATE=1

############### ターミナルのコマンド受付状態の表示変更
# \u ユーザ名
# \h ホスト名
# \W カレントディレクトリ
# \w カレントディレクトリのパス
# \n 改行
# \d 日付
# \[ 表示させない文字列の開始
# \] 表示させない文字列の終了
# \$ $
export PS1='\[\033[1;32m\]\u\[\033[00m\]:\[\033[1;34m\]\w\[\033[1;31m\]$(__git_ps1)\[\033[00m\] \$ '
##############
```

# git-completion.bashとは
* gitコマンドの補完スクリプト。Tabで補完できてンギモッチイイ！！

### 導入
1. `wget https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash -O ~/.git-completion.bash`
1. `chmod a+x ~/.git-completion.bash`
1. `echo "source ~/.git-completion.bash" >> ~/.bashrc`
2. `source ~/.bashrc`


# git-prompt.shとは
* プロンプトに各種追加情報を表示可能にするスクリプト

### 導入
1. `wget https://raw.githubusercontent.com/git/git/master/contrib/completion/git-prompt.sh -O ~/.git-prompt.sh`
1. `chmod a+x ~/.git-prompt.sh`
1. `echo "source ~/.git-prompt.sh" >> ~/.bashrc`
1. `~/.bashrc`内の`PS1` 変数を `__git_ps1` を含むように変更する
2. `source ~/.bashrc`

### オプション(1 or null)
* `GIT_PS1_SHOWUPSTREAM`
 * 現在のブランチがupstreamより進んでいるとき">"を、遅れているとき"<"を、遅れてるけど独自の変更もあるとき"<>"を表示する。オプションが指定できるけど(svnをトラックするかとか)
* `GIT_PS1_SHOWUNTRACKEDFILES`
 * addされてない新規ファイルがある(untracked)とき"%"を表示する
* `GIT_PS1_SHOWSTASHSTATE`
 * stashになにか入っている(stashed)とき"$"を表示する
* `GIT_PS1_SHOWDIRTYSTATE`
 * addされてない変更(unstaged)があったとき"*"を表示する、addされているがcommitされていない変更(staged)があったとき"+"を表示する
* 参考： [__git_ps1のオプションを設定して様々な情報を表示する](http://d.hatena.ne.jp/gnarl/20110901/1314846241)


# PS1とは
* bashには、プロンプトを制御するために「PS1」という環境変数が使用されている。
* このPS1変数は、exportコマンドを使いさまざまな特殊文字コードを利用すれば、表示形式を変更することが可能
* 参考：　[Bashのプロンプト変更](http://qiita.com/amidaku/items/841d62335a03792424d5)

# おわりに
* 次は勉強がてらtigのお話でも書こうかな
XCODEでのビルドエラーをコピーする方法

左サイドバーを出します
![スクリーンショット 2014-12-12 14.25.03.png](https://qiita-image-store.s3.amazonaws.com/0/32256/d74f48ba-b39d-9935-25dc-c983ee35d8db.png)

エラー一覧を出します
![スクリーンショット 2014-12-12 14.25.16.png](https://qiita-image-store.s3.amazonaws.com/0/32256/0a95f66f-3819-625a-15a7-5e593a39c59c.png)

コピーしたいエラーのメニューを表示し`Copy`します。

![スクリーンショット 2014-12-12 14.25.28.png](https://qiita-image-store.s3.amazonaws.com/0/32256/edecebce-e301-5aac-b847-40227917788c.png)


貼り付けると、以下のような感じになります。

```
/Users/xxxx/ViewController.swift:20:54: Value of optional type 'CGFloat?' not unwrapped; did you mean to use '!' or '?'?
```
Android Studio を1.0にあげたら Gradle DSL method not found: 'runProguard()' エラー

Android Studio を1.0にあげて `Gradle DSL method not found: 'runProguard()'` エラーがでたら

あなたのプロジェクトの `build.gradle` ファイルを以下のように変更する

```diff
}
release {
-    runProguard true
+    minifyEnabled true
    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
```

参考：http://tools.android.com/tech-docs/new-build-system/migrating-to-1-0-0
続・Multi-dex Support を使おう

[前回の Multi-dex Support](http://qiita.com/KeithYokoma/items/385a94988beb2d7d8043)

はい。もうすでに以前書いた情報が古くなってしまったので、改めて書き直します。

Multi-dex Support が一体なんぞやというのは前回の記事を参照してください。

## 準備

maven にサポートライブラリがあるので、依存関係にそれを追加します。

```groovy

compile 'com.android.support:multidex:1.0.0'
```

また、ビルドツールは新しいものにしておきましょう。21.1.0 以降で公式にサポートされます。

```groovy

buildToolsVersion "21.1.1"
```

`defaultConfig`に以下を追記すると、Multi-dex Support が動作するようになります。

```groovy

defaultConfig {
    multiDexEnabled true
}
```

Multi-dex ではビルドプロセスで相当量のメモリを食います。また、minSdkVersion が 20 以前の場合、preDexLibraries が使えなくなりますので、以下のように`dexOptions`を書きます。

```groovy

dexOptions {
    preDexLibraries false
    javaMaxHeapSize "2g" // ヒープの最大を 2GB にする
}
```

## MultiDexApplication

https://developer.android.com/reference/android/support/multidex/MultiDexApplication.html

独自に Application クラスを継承した Application クラスを持っていない場合は、AndroidManifest の `<application>` に`MultiDexApplication`を指定しましょう。

独自に Application クラスを持っている場合は、親を `MultiDexApplication` にするか、ないしは自分で実装を移植しましょう。  
実装自体は至極単純です。

```java

public class MyApp extends Application {
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }
}
```
Multi-dex Support において最初の dex に含めなければならないクラスの扱いはビルドツールがよしなにやってくれるようになったので、自分たちで定義ファイルを用意する必要はなくなりました。

## ProductFlavor を活用する

AndroidRuntime を標準搭載している Lollipop では、デフォルトで Multi-dex APK が扱えるように作られています。ですので、Lollipop 向けの ProductFlavor を用意することで、ビルドプロセスの最適化が図られ、若干ビルド時間が改善します。

```groovy

productFlavors {
    lollipop {
        minSdkVersion 21
    }
}
```

## まとめ

Multi-dex Support を使う以外に、メソッド数上限を回避する方法には[この記事](http://qiita.com/konifar/items/d98c78facbaae63badca)にあるようなものもあります。
Google Play Services は`6.5.87`からドメイン毎に独立してつまみ食いできるようになりましたので、適宜組み合わせていくとよいでしょう。
Android Studio(v1.0)で"Java not found"で起動できない時



##動作環境

- Mac OS Yosemite

- JDK(1.7.0_71)

- Android Studio(1.0)

##症状

- Javaが入っているにもかかわらず、Android studioを起動すると「Java not found」と表示され起動できない。


##対処法

1. Android Studioのパッケージ内容を表示する
![スクリーンショット_2014-12-12_13_25_56.png](https://qiita-image-store.s3.amazonaws.com/0/29491/2307c133-478c-43d4-27fb-8683a5f666d8.png "スクリーンショット_2014-12-12_13_25_56.png")


2. Info.plistを開く(Xcodeを利用）
![スクリーンショット_2014-12-12_13_33_20.png](https://qiita-image-store.s3.amazonaws.com/0/29491/2f7b2170-ec05-faeb-180f-291a2479bbc2.png "スクリーンショット_2014-12-12_13_33_20.png")


3. Info.plist内のJVMVersionを1.6+に書き換える
![スクリーンショット_2014-12-12_13_23_35.png](https://qiita-image-store.s3.amazonaws.com/0/29491/ab7833fc-bf19-6385-795c-26e6f4ed9d77.png "スクリーンショット_2014-12-12_13_23_35.png")
【CSS】CSSのline-heightで単位を指定しない理由

#はじめに

CSSのline-heightの値には、単位は指定せず、数値のみ記述するのが一般的かと思います。
しかし、```line-height:1.5``` も ```line-height:1.5em``` も ```line-height:150%``` も指定した要素の表示は同じです。
なぜ単位を指定しないのか、実際の表示結果から確認します。

#結果

親要素にそれぞれのline-heightを指定した場合の値は下記の通りです。
親子孫要素に違うフォントサイズを指定、親要素のみline-heightを指定しています。
<ins>**単位を指定すると親要素で計算されたline-height値が子要素、孫要素に継承されます。**</ins>

|要素（フォントサイズ）|line-height（1.5）|line-height（1.5em）|line-height（150%）|
|:--|:--|:--|:--|
|親要素（20px）|30px|30px|30px|
|子要素（14px）|21px|30px|30px|
|孫要素（8px）|12px|30px|30px|
それぞれの表示結果は下記のとおりです。

##［単位なし］line-height:1.5を指定
親要素に`line-height:1.5`を指定すると、子要素、孫要素でそれぞれ計算されたline-height値が適用されます。
![15.png](https://qiita-image-store.s3.amazonaws.com/0/42231/37f3a23a-c416-5e0d-df4d-9224d1743e8f.png)


##［単位あり］line-height:1.5emを指定
親要素で計算されたline-height値（30px）が子要素と孫要素にも継承されます。
![15em.png](https://qiita-image-store.s3.amazonaws.com/0/42231/47fe049e-a36a-26a7-aef1-72c3cca4e722.png)


##［単位あり］line-height:150%を指定
親要素で計算されたline-height値（30px）が子要素と孫要素にも継承されます。
![150%.png](https://qiita-image-store.s3.amazonaws.com/0/42231/922846d7-fb02-e443-1b50-968619f704f8.png)


#結論

line-heightに単位を指定すると、**親要素で計算された値がそのまま子要素にも継承される**ため。
Kobitoプレミアムの同期機能


本体のDBのコピーをDropboxの上に作る機能みたいだけど、なんかバグっていて、Dropbox以外のフォルダも指定できるし、いったん指定するとフォルダのパスが変更できない。やり方があるのかもしれないけどよくわからん。

だれかできた人いるのかな。。。

このままやり方がわからないようなら、プレミヤム会員をやめるとするか。。。

###追記：2014-12-12

いただいたコメントの通りやったらうまくいきました。

> defaults delete com.qiita.Kobito DataSyncServiceName
> defaults delete com.qiita.Kobito DropboxDirectoryBookmark

さすがにコマンドを打つのはハードルが高いので、修正を期待します！

>同期するフォルダのパスの変更は、Finderから対象のフォルダをドラッグしてKobitoの設定パネルの「フォルダの場所：」ってところにドロップしたら変更できないですかね

コメントに書かれているとおり、Version2.1.1では、アプリからの変更はできない仕様になっているようです。同期機能を目当てにプレミアムに入ろうとしているひとは、しばらく待った方がよいと思います。


###追記:2015-01-10

KobitoをEvernote的に使えるかなとおもったのですが、同期機能がいまいち使えないので、プレミアム会員をやめることにしました。

プレミアムの同期機能がマスターのDBをDropboxにコピーして、それを吸い取ってマスターを更新するという仕様のようなのですが、1つのマシンで削除してもDropboxの上では削除されるのですが、もう1つのマシンで削除されないからです。

さらに、もう1つのマシンからDBがDropboxにコピーされて、はじめのマシンにもどっていくので削除したエントリーが復活してしまいます。

結局マスターがMacの方にあって、意図的に削除したという情報をDropboxに伝える機能がないようで、削除したエントリーがゾンビのように復活してしまいます。Dropboxをマスターにするように実装する必要があるんじゃないか。。。

というわけでEvenote的に使いたいなら、Evernoteを使うのが良さそうなので、Evernoteをしばらく使うことにしました。
Unity Android に DeployGate SDK を組み込む


以下のようなクラスを作成

```DeployGateAndroid.cs
using System.Collections;

public class DeployGateAndroid {
#if UNITY_ANDROID && !UNITY_EDITOR
	private static AndroidJavaClass deployGate = null;
	
	public static void Install() {
		AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
		AndroidJavaObject activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
		AndroidJavaObject app = activity.Call<AndroidJavaObject>("getApplicationContext");
		deployGate = new AndroidJavaClass ("com.deploygate.sdk.DeployGate");
		activity.Call("runOnUiThread",new AndroidJavaRunnable(() =>{
			deployGate.CallStatic ("install", app, null, true);
		}));
	}
#endif
}
```


ゲームの起動時に実行される処理の中で Install() を呼びだす。

```main.cs
#if UNITY_ANDROID && !UNITY_EDITOR
		// DeployGate SDK for Android のインストール
		DeployGateAndroid.Install();
#endif
```


# 参考

[Deploygate-with-unity]UnityでDeployGateを使うためのアセット
http://anchan828.github.io/deploygate-with-unity/
ジェネリック型引数を実行時型情報に残す方法がある

Javaのジェネリックは1.4以前のバイナリ仕様との互換のために、コンパイルの時点で型引数情報が消去され非ジェネリックプログラミングされたかのようなコードに変換されます。この変換を **型消去（イレイジャ）** と呼びます。

型消去、通常のプログラミングにもたまに影響を与えます（例えば List<E>.toArray() がなぜか引数として一見不要な E[] 型の配列オブジェクトを要求するなどします）が、何より影響を受けるのがリフレクションごりごりのフレームワークプログラミングやライブラリプログラミングにおいてです。型消去に伴って、実行時型情報からも型引数の部分が抜け落ちてしまいますから（そこだけは残しておいてくれれば良かったのに！）。

具体的にはどんなことになるかというと、たとえばみんな大好きEBean（うそ、僕が大好き）なら、エンティティクラスを指定して対応するDBテーブルからデータを取り出すのに

```java
List<User> result = Ebean.<User>find(User.class).findList();
```

なんて記述の仕方させますね。findメソッドは型引数で`User`クラスを知っていそうに見えるけど、実際には型消去されてしまうので実行時型情報を取り出すことができず、仕方なく別口で引数として User.class をもらうようにしています。美しくない。

ジェネリッククラスやジェネリックメソッドの中でその型引数を実行時型情報として得る方法、ないものでしょうか。

わりと知られたやり方
--
「わりと知られた」なんて書くと煽りすぎすよねごめんなさい。それはさておき上記のfindメソッド、ちょっとした表技を使えば

```java
List<User> result = Ebean.<User>find().findList();
```

という書き方でも実行時型情報を取れるようにできます。
それは、findの宣言を

```java
static Query<E> find<E> (E... dummy) {
```

と書くこと。dummy は配列になりますから`E[]`型です。配列は型消去されないので型情報が残っているという次第。

とは言え、この方法も限界があります。`E`が総称型だと、`E`の型引数は消えてしまいます。あと、Eclipseの内蔵コンパイラが誤動作するので困るなんて話も昔聞いたことがありますが今は大丈夫になったかなあ。なってるといいなあ。

型引数がすべて残る記法
--
今回ご紹介する、インスタンスを作成する場合にだけ使える記法です。

```java
new ArrayList<Set<String>>(); // ==> 型情報は java.util.ArrayList<E>
new ArrayList<Set<String>>(){}; // ==> スーパークラスの型情報は java.util.ArrayList<java.util.Set<java.lang.String>>
```

なんか `{}` を加えただけで型情報が急にリッチになりましたよ！？

お気付きでしょうか、後者は匿名クラスとしてのインスタンス作成ですが、これ、こう書いているようなものです。

```java
class Temp extends ArrayList<Set<String>> { }

new Temp();
```

こう書かれてみると、Temp型が `Set<String>` を知らなかったらむしろ不自然に思えてきます（だって、`Temp`の中で`void set(int i, Set<String> obj)`なんてメソッド書いたらそれはオーバーライドメソッドとして振る舞います。親クラスのことを型引数まで含めて知っていてこその振る舞い）。そして、実際知っているというわけ。

この手法は、複雑な総称型クラスを解析するライブラリで実際に使われています。総称型クラスを解析する必要のあるライブラリ、それはどんなのかというとひとつはJSONシリアライザですね。Jacksonの[`TypeReference`](http://jackson.codehaus.org/1.1.1/javadoc/org/codehaus/jackson/type/TypeReference.html)クラスなんか、まさにこの手法を実現するためのヘルパです。
「VACUUM ANALYZE」によって手動で不要領域を回収して統計情報の再計算を行う

# はじめに
PostgresSQLにおいてテーブルの行や列を削除した時、VACUUMが実行されるまでテーブルから物理的には削除されない。
不要領域を回収するVACUUMは、PostgresSQLが自動的に実行してくれる。
しかし、まれに特定のテーブルだけ実行されないことがあり、
実行計画において削除したはずの列を参照してしまい、SQLの実行が成功しない場合がある。
この場合、手動でVACUUMを実行し、統計情報を再計算する。

# SQLの実行手順
 統計情報テーブルのカラム「last_vacuum」「last_analyze」を確認する。ここに直近にVACUUMした日付が入る
`select * from pg_stat_all_tables where relname = 'テーブル名をここに記入';`

不要領域を回収し統計情報を再計算する。トランザクション(begin,commit)は不要
`VACUUM ANALYZE テーブル名をここに記入;`

カラム「last_vacuum」「last_analyze」の日付をを確認して更新されていることを確認する
`select * from pg_stat_all_tables where relname = 'テーブル名をここに記入';`


# 参考

http://www.postgresql.jp/document/8.3/html/sql-vacuum.html
macでVirtualBoxのguest additionsを有効にする

OSはCentOS7を使用

# VirtualBox と Extension Pack を取得する
- 既に取得済みであれば省略して良い
- https://www.virtualbox.org/wiki/Downloads からダウンロードする

# Extension Pack をVirtualBox に導入する
- メニューバーから「VirtualBox」→「環境設定」→「機能拡張」を選択
- ![Extension Packを導入する](http://i.gyazo.com/3828584d0be31042aad13dec6d95048f.png "Extension Packを導入する")
    - 右のほうにある「▼」を押して、ダウンロードしたExtension Packを選択

# パッケージのインストール
- VMの起動

```
sudo yum update -y kernel
sudo yum install -y kernel-devel kernel-headers dkms gcc gcc-c++
```

# Guest Additions イメージをマウント
- メニューバーから「Devices」→「Insert Guest Additions CD Image...」を選択

# Guest Additionsをインストールする
- autorunが走るのでそれでも良い
- 動かなければCD image上のautorun.shをsudoで実行する

# クリップボード共有をONにする
- メニューバーから「Devices」→「Shared Clipboard」→「Bidirectional」を選択

# ドラッグアンドドロップ設定をONにする
- メニューバーから「Devices」→「Drag'n'Drop」→「Bidirectional」を選択

# VMのOS再起動
```
sudo reboot
```
逆転オブジェクト指向入門

要旨
---
B. Meyer. The outside-in method of teaching introductory programming. In Manfred Broy and Alexandre V. Zamulin, eds., Ershov Memorial Conference, volume 2890 of Lecture Notes in Computer Science, pages 66--78. Springer, 2003. に出てくる outside-in method （Inverted Curriculum）の自分なりの理解をメモとして残す。かなり自分(tomooda)の解釈を盛り込んでいるので、原著の正確な内容を知りたい人は [原著](http://se.ethz.ch/~meyer/publications/teaching/teaching-ispj.pdf) に当たること。

背景
---
プログラミング導入教育では、最小限の言語機能を使って小さなプログラムを書くところから始まることが多い。例えば Hello World とか。配列に格納された数値の平均値を求める、など。それは学習者を森の中に放り込んで、森全体の形を見せずに木ばかりを見せることになるのではないか。C++やJavaで課題を与えると、ググル駆動開発でコピペで提出する学生が出る。コピペ開発は「再利用」の名に値しない（少なくとも工学的には）ものであり、望ましくない。プロフェッショナルなプログラミングに必要なのはシステムを「正しく構成する」ための能力だ。その重要な1つが、抽象能力である。従来の、小さな実装から始めるアプローチでは、抽象に辿り着くまでの道のりが長い。

外から中へ
---
「外から中へ」のアプローチは、その逆である。「外から中へ」のアプローチはソフトウェアを理解する最良の方法は高質なソフトウェアを「使う」ことだ、という仮説に基づいている。現代では多くの「プログラミング初心者」は既にコンピュータのユーザーだ。彼らの多くは普段からコンピュータプログラムを利用している。そこが出発点ではないのか。大きなプログラムを手にして、そのインターフェイス(API)からその内容を分解していき、小さなプログラムの実装に到達するのではないのか。プログラムを理解する視点を、消費者としてプログラムを外から見る視点から、開発者としてプログラムを中から見る視点に進めていく。それが逆転オブジェクト指向入門の背骨である。

外から見る
---
学習者はまずライブラリに触れる。ライブラリには高品質なモデルがあり、学習者は実装ではなくインターフェイス（契約）を通してモデルを理解する。これによって学習者は Hello World のようなオモチャではなく、意味のあるプログラムを構築することができる。

原著者が提供するプログラミング入門クラスで学習者が最初に取り組む課題は、パリの観光客向けに地下鉄路線図をマップ上に表示してお勧めコースをゲーム感覚でグラフィカルに表示する、というものだ。合計12行の Eiffel プログラムで、本体は4行である。強力かつ高品質なクラスライブラリがあるために可能になっている。ここから中のメカニズムにだんだんと踏み込んでいくことで、（教育目的とはいえ）方便でごまかすことなく進んで行くことができる。

良い開発者になるためには抽象能力は欠かせない。プログラムを実装からではなくインターフェイスから理解することで、抽象というものがいかに重要なことなのかを理解することができる。

中から見る
---
そして学習者はプログラムの実装を学ぶ。あるコンポーネントは他のどのようなコンポーネントを利用しているのか。そのコンポーネントの契約が、他のコンポーネントの契約（事前条件、事後条件、不変条件など）を利用してどのように実現されているのかを理解する。正当性証明までする必要はない。
学習者は契約プログラミングに触れることでプログラミングを系統的で論理的なものとして理解することができ、ソフトウェア工学に進むことができる。プログラマの中には契約（事前条件、事後条件、不変条件）を怖がる者がいる。また、多くのプログラミング言語は契約のための言語機能を提供していない。高品質なライブラリと契約プログラミングのための機能を持った言語で「外から中へ」教えることで、学習者はプログラミングの基本としての数学を恐れることなく学ぶことができる。

まとめ
---
契約プログラミングとしてのオブジェクト指向を前提としたプログラミング導入教育の方法論の1つとして「外から中へ」進んで行く手法を紹介した。前提として、高品質なクラスライブラリ（もちろん質の高い契約が記述されていることを前提としている）が必要であり、Bertrand Meyer は Eiffel のクラスライブラリの利用を勧めている。

プロフェッショナルなプログラマを養成する大学でのカリキュラムとして興味深い提案である。コンピュータサイエンス専攻ではない大学生に対してはどうなのか。契約（論理式）の理解を必須とするのは敷居を高めるかもしれない。また、コンピュータサイエンス専攻の学生のうち一定数は既にプログラミング経験を持つが、彼らにとって提案手法はどのような効果があるのか。今後の研究や実践の進展が楽しみである。

補足
---
オブジェクト指向プログラミングといってもそれは単一の技術要素を示すのではなく、いくつかの共通要素を持つ複数の「流れ」が存在すると考えられる。
* Smalltalkを始めとする、メッセージングを中心としたオブジェクト指向
* C++を始めとする、抽象データ型の発展形としてのオブジェクト指向
* Eiffelを始めとする、契約を系統化する枠組みとしてのオブジェクト指向
原論文の著者である Bertrand Meyer は 契約プログラミングのためのプログラミング言語 Eiffel の設計者であり、また、多くの形式的仕様記述言語の言語設計や方法論に貢献した研究者である。今回対象としている論文はその Bertrand Meyer が取り組んでいるプログラミング導入教育のエッセンスを示している。また、彼がこの Inverted Carriculum を実践する時に使っているのが、自身が書き下ろした教科書 [**Touch of Class** Learning to Program Well with Objects and Contracts](http://qiita.com/tomooda/items/197919b9718d6f4ae464)である。
IReadOnlyDictionary<TKey, TValue> の TValue は共変の型パラメーターではない

これは闇なのでは。

![共変性がない.png](https://qiita-image-store.s3.amazonaws.com/0/11978/6d0bed00-e9aa-7924-b86c-f545fec4ff85.png)

ふぁ！？
入れられないの…？

![outついてない.png](https://qiita-image-store.s3.amazonaws.com/0/11978/e23fa635-77fa-7988-a83f-8b8c72cfa6f1.png)

うーむ、`TValue` は共変の型パラメータかと思いきや、`out` 修飾子がついていません。
（なお `TKey` は `ContainsKey(TKey key)` があるので明らかに `out` は付けられない）

理由は 2 つ。

* `bool TryGetValue(TKey key, out TValue value)` メソッドが定義されているから
* `IReadOnlyCollection<KeyValuePair<TKey, TValue>>` および `IEnumerable<KeyValuePair<TKey, TValue>>` を継承するから

# out パラメーターは戻り値と同じ扱いにはならない

`out` パラメーターで返す場合、戻り値と同じように共変性を保証することはできないのですね。

https://ufcpp.net/study/csharp/sp_ref.html#ref-in-out

によると

> C# コンパイラーとしてはin引数やout引数をref引数と区別していますが、 .NET の型システムのレベルでは実は区別がありません。 .NET 的にはin引数もout引数もref引数扱いになっています。 そのため、以下のような不便があります。
> 
> - オーバーロードの区別に使えない
> - 共変・反変にできない

という制約のためだそうです。

# 参考

* [ジェネリクスの共変性・反変性 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C](http://ufcpp.net/study/csharp/sp4_variance.html)
* [参照渡し - C# によるプログラミング入門 | ++C++; // 未確認飛行 C](https://ufcpp.net/study/csharp/sp_ref.html)
Genymotionが起動しなくなったとき(Ubuntu)

環境: Ubuntu

Genymotionを起動すると以下のようなエラーが出るとき

> Unable to load VirtualBox engine.
>
> Make sure that you have installed it correctly before starting Genymotion.
>
> For more information refer to: https://cloud.genymotion.com/page/faq/#vbox

次のコマンドで解決できた

	sudo /etc/init.d/vboxdrv setup