OmniAICreator/Qiita-1.07M huggingface dataset:
Vagrant share 以外の公開方法


なんらの理由(社内のセキュリティポリシー上とか)で, `$ vagrant share` が使えない場合の対処方法.

## 対象とするユーザ

1. インターネットから vagrantで構築した guest osに httpリクエストを送りたい
2. `$ vagrant share` は使えない
3. ssh でログインできるサーバ(グローバルIPが付いている)がある
 * ポートフォワードが利用できる事

## 手順

1. sshでログイン可能なサーバに nginxをインストールする
 * 別に apache でもOK. Reverse Proxyが使いたいだけ.
2. 以下のように設定を記述する

 ```Nginx:/etc/nginx/nginx.conf
 server {
     server_name  vagrant.example.com;

     location / {
         proxy_pass http://127.0.0.1:10080;
     }
 }
 ```
3. 	vagrant で構築した guest os から sshで接続をする

 ```bash
 $ ssh -v -C -N -R 10080:127.0.0.1:80 <ユーザ名>@vagrant.example.com
 ```
 #### ssh の オプションは以下のとおり

 |オプション|説明|
 |:-:|:---|
 |-v|デバッグログを標準出力|
 |-C|通信経路を圧縮する|
 |-N|ログイン後対話しない|
 |-R|リモート側からローカルへのフォワード(リバース)|


あとはブラウザ等で `http://vagrant.example.com/` に接続すれば, vagrant内の80番ポートにリクエストされている

やめたい場合は, 手順 3 を 実施したターミナルで C-c で終了です.
D言語でShift-JISを入出力する

日本語のCSVを読みこんだり書き込んだりなど、文字コードを変換するプログラムを作るときの参考に。

[DMD ver2.0.65](http://dlang.org/download.html) を使用してます。
WindowsのコマンドプロンプトはShift-JISなので日本語をそのまま出力しても文字化けします。
また、Shift-JISで保存されたテキストファイルを読み込んで何かするにも工夫が必要です。
std.encodingにあるかと思いきや、std.windows.charsetの方にANSIをもみもみできる処理が入ってますた。

# やりかた
```d:sjis.d
import std.stdio;
import std.string;
import std.conv;
import std.file;
import std.windows.charset;

void main(){
  string utf8 = "あいうえお";//UTF8
  writeln("utf8 : ", utf8);
  // UTF8 を Shift-JIS に
  writeln("utf8 to sjis : ", to!(string)(toMBSz(utf8)));

  auto sjis = File("sjis.txt").readln;//あいうえおをS-JISで保存したファイル
  writeln("sjis : ", sjis);
  // Shift-JIS を UTF8 に
  writeln("sjis to utf8 : ", fromMBSz(toStringz(cast(char[])sjis)));
}
```

結果（コマンドプロンプト）
![350ca13dc8b98422d9f7cfd68aa33a8f.png](https://qiita-image-store.s3.amazonaws.com/0/42777/000d8384-a9c3-e758-2190-f723795388aa.png)

# 参考
http://www.prowiki.org/wiki4d/wiki.cgi?NonUnicodeTextInD
http://pen-jr.org/lang_d/middle_lec/encode.php
cygwin で cal とか col とか rename とか whereis とかがないと思ったら

実は util-linux パッケージに入っています。
下記のリンクから辿って行くと、他に何が入っているかも確認できます。

[Cygwin Package Search](https://cygwin.com/cgi-bin2/package-grep.cgi?grep=util-linux&arch=x86_64)

タイトルで上げたコマンドたちは、検索して探している人が多そうだったものを代表として挙げてみました。
Xcodeのこつ - edit shemeのPre-actionsを使え

2014/04/28にtwitterにて指摘をいただいたので修正します。
簡単にいうと以下の記事は、半分間違っています。

間違っている点
・Run Scriptは、罠ではない。(Build Phasesは、順番をかえることで、処理の順番をかえることができます。)
・Schemeは、共同プロジェクトに向いていない(Schemeはプロジェクトファイルに含まれないため、共有するためには別で出力する必要があります)

本来なら
・Run Scriptにシェルスクリプトを書きます。
・Run Scriptの順番を上位にします。

よろしくお願いします。


以下、間違い記事
~~こんにちは、

Xcodeでシェルスクリプトを使うときに壁に打ち当たったので、公開です。自分めもである。

よくSetting.bundleを使うと思います。これは、設定アプリ内で設定をできるようにするものです。そこで、デバッグとリリース版を分ける際にシェルスクリプトで、上書きすることがあります。

しかし、よくある解説サイトには、罠があります。
![スクリーンショット 2014-04-28 22.30.55.png](https://qiita-image-store.s3.amazonaws.com/0/24266/37aafe4c-f4f6-cadf-8897-4cca925e6418.png)

スクリーンショットのように、プロジェクトの設定のRun Scriptに書けってあります。
しかし、これではうまくいかないときがあります。それは、ここに書くとコンパイル後に処理されるためです。


Run開始→コンパイル開始→コンパイル終了→シェルスクリプト実行→アプリ実行

これでは、上書きされないです。２回コンパイルする必要がでてきてしまいます。

これを
Run開始→シェルスクリプト実行→コンパイル開始→コンパイル終了→アプリ実行
としたいわけです

そのためには
edit schemeを使います。![スクリーンショット 2014-04-28 22.36.33.png](https://qiita-image-store.s3.amazonaws.com/0/24266/b440a950-3eb7-d837-67e2-f3addd5ec7eb.png)

edit schemeで下記写真のを編集してください![スクリーンショット 2014-04-28 22.37.46.png](https://qiita-image-store.s3.amazonaws.com/0/24266/78096b32-a6ee-71b8-6d16-4223c8c8ff96.png)

Pre-actionsに設定することで、コンパイル前にシェルスクリプトを実行できます。
なお、Run以外をする場合は、それぞれArchiveなどのPre-actionsに書いてください
補足ですが、Pre-actionsのシェルスクリプト内でSRCROOTなどプロジェクトに依存するものを使う場合は、シェルスクリプトを書くところの上の「Provide build settings from」の部分を適宜選んでください
~~

それでは、よいシェルスクリプトライフを！
Macにeclipseインストール

## Javaがインストールされているか確認
`$ /usr/libexec/java_home -V`

    Unable to find any JVMs matching version "(null)".
      Matching Java Virtual Machines (0):
  
      Default Java Virtual Machines (0):
  
      No Java runtime present, try --request to install.
入ってない

## Javaダウンロード
http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html

## Javaインストール
jdk-7u55-macosx-x64.dmg ダブルクリック

## Javaインストール確認
`$ /usr/libexec/java_home -V`

    Matching Java Virtual Machines (1):
        1.7.0_55, x86_64:	"Java SE 7"	/Library/Java/JavaVirtualMachines/jdk1.7.0_55.jdk/Contents/Home

    /Library/Java/JavaVirtualMachines/jdk1.7.0_55.jdk/Contents/Home
入った

## eclipse(Mac OS X 64 Bit)ダウンロード＆解凍
http://www.eclipse.org/downloads/?osType=macosx
より

## eclipseインストール
解凍したeclipseディレクトリをアプリケーションフォルダに配置

## ダウンロードしたアプリケーションの実行許可をつける
システム環境設定 -> セキュリティとプライバシー -> 一般
より、全てのアプリケーションを許可に。

## eclipse起動
/Applications/eclipse/Eclipse.app ダブルクリック

*****
### Welcome to Eclipse

# 参考リンク
[MacにJDK7をインストールしたからといってAppleのJDK6を消してはいけない](http://blog.satooshi.jp/blog/2013/01/29/you-cannot-uninstall-apple-jdk6/)
[OSX MavericksにOracleのJDK7をインストールする](http://ca2tail.hatenablog.jp/entry/2014/01/05/164535)
JerseyClientでプロキシを通す方法

Apache Connector というプラグイン？を使うらしい。

```groovy:build.gradle
repositories {
    mavenCentral()
}

dependencies {
    compile 'org.glassfish.jersey.core:jersey-client:2.7'
    compile 'org.glassfish.jersey.connectors:jersey-apache-connector:2.7'
}
```

```java:
package sample;

import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;

import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
import org.glassfish.jersey.client.ClientConfig;
import org.glassfish.jersey.client.ClientProperties;

public class Sample {
    public static void main(String[] args) {
        ClientConfig config = new ClientConfig();
        config.connectorProvider(new ApacheConnectorProvider());

        config.property(ClientProperties.PROXY_URI, "http://proxy.host.name:8080"); // プロキシの URI
        config.property(ClientProperties.PROXY_USERNAME, "username");               // プロキシ認証のユーザー名（必要なら）
        config.property(ClientProperties.PROXY_PASSWORD, "password");               // プロキシ認証のパスワード（必要なら）

        Client client = ClientBuilder.newClient(config);

        WebTarget target = client.target("https://translate.google.co.jp")
                                 .path("translate_a/t")
                                 .queryParam("client", "t")
                                 .queryParam("ie", "UTF-8")
                                 .queryParam("oe", "UTF-8")
                                 .queryParam("sl", "en")
                                 .queryParam("tl", "jp")
                                 .queryParam("otf", "1")
                                 .queryParam("q", "Hello World.");

        String response = target.request(MediaType.APPLICATION_JSON_TYPE).get(String.class);
        System.out.println(response);
    }
}
```

```js:実行結果
[[["世界こんにちは。","Hello World.","Sekai kon'nichiwa.",""]],,"en",,[["世界",[1],false,false,703,0,1,0],["こんにちは。",[2],false,false,658,1,3,0]],[["World",1,[["世界",703,false,false],["ワールド",296,false,false],["世界の",0,false,false],["の世界",0,false,false],["その他の",0,false,false]],[[6,11]],"Hello World."],["Hello .",2,[["こんにちは。",658,false,false]],[[0,5],[11,12]],""]],,,[["en"]],1]
```

#参考
- [Snip2Code - How to make a Jersey 2 client use an HTTP proxy](http://www.snip2code.com/Snippet/5421/How-to-make-a-Jersey-2-client-use-an-HTT)
- [jersey 2.0 - How to add a http proxy for Jersey2 Client - Stack Overflow](http://stackoverflow.com/questions/18942648/how-to-add-a-http-proxy-for-jersey2-client)
- [5.5. Client Transport Connectors | Chapter 5. Client API](https://jersey.java.net/documentation/latest/client.html#d0e4426)
berks installがdeprecated

berks installコマンドがdeprecatedされて、以下のものに置き換わったようです。

```bash
$ berks vendor [PATH]
```

また、berksfileのサイトロケーションも、ソースに変更され、URLを指定するようになったようです。

```rb:旧
site :opscode
```

```rb:新
source "http://api.berkshelf.com"
```

[deprecated locations](https://github.com/berkshelf/berkshelf/wiki/deprecated-locations)
r.jsの使い方

[require.js](http://requirejs.org/)の依存ツリーを解決してひとつのファイルにまとめてくれるやつ。一回ビルドタスク用意したらもう直接触らないせいで、使い方を忘れてしまったから調べてメモ。

## インストール

```bash
npm i -g requirejs
```

パッケージ名は`requirejs`だけど、インストールされるのは`r.js`です。

```bash
$ r.js -v
r.js: 2.1.11, RequireJS: 2.1.11, UglifyJS2: 2.4.12, UglifyJS: 1.3.4
```

`node_package/requirejs/bin`に`r.js`があります。ビルドスクリプトを用意するなら`-g`なしでも良いし、Gruntなら別途[grunt-contrib-requirejs](https://github.com/gruntjs/grunt-contrib-requirejs)があります。

## コマンドライン

`--help`はないのでドキュメントを読むしかなさそう。

* [RequireJS Optimizer](http://requirejs.org/docs/optimization.html)

ファイル構成は例えばこんな感じ。

* ./
    * src/
        * main.js
        * models
            * Task.js

```js:main.js
define([
  'models/Task'
], function(Task) {
  // …
});
```

これでコンパイル？するときは、こう。

```bash
$ r.js -o baseUrl=src name=main out=all.js

Tracing dependencies for: main
Uglifying file: /xxx/all.js

/xxx/all.js
----------------
/xxx/src/model/Task.js
/xxx/src/main.js
```

変わった文法だけど、`-o`の後に"="で繋げた設定の組み合わせを記述する。

* baseUrl … JSファイルのディレクトリー。
* name … 起点となるJSファイルの名前。拡張子なし。baseUrlからの相対なパスの、拡張子".js"を取ったもの。
* out … 出力ファイル名。実行時ディレクトリーからのパス。（baseUrlと関係ない。）
* などなど

pathsなんかも設定できる。面倒だけどね。そういうときは次項の設定ファイルを使うと便利です。

## 設定ファイル

ファイル出力って何度も繰り返し行うのが普通なので、そんな何度もコマンドラインの記述をするのは普通しない。バッチファイルなりシェルスクリプトなりを用意するよね。

r.jsの場合は設定ファイルを用意する事ができます。

```js:r-conf.js
({
  baseUrl: 'src',
  name: 'main',
  out: 'all.js'
})
```

```bash
$ r.js -o r-conf.js 

Tracing dependencies for: main
Uglifying file: /xxx/all.js

/xxx/all.js
----------------
/xxx/src/model/Task.js
/xxx/src/main.js
```

`-o`に設定ファイル名を与えてやると、その通りに動く。これで何度でも同じ設定で出力できるようになったし、バージョン管理もできるようになりました。

## おまけ：設定ファイルの書式

JSONではなくJSファイルなので単純な処理は行えるけども、戻り値を返すとかじゃないので、単純なオブジェクトリテラルの形にする必要があります。

具体的に言うと、ファイルの内容はこんなふうに処理されてました。

```js:r.js(26698行目)
buildFileConfig = eval("(" + buildFileContents + ")");
```
word2vec.cを読んでみる（１）

# そもそも
最近？巷で流行っているword2vecですが、
(word2vecで何ができるの？という方は[あんちべさんのブログ] (http://antibayesian.hateblo.jp/entry/2014/03/10/001532)をみてみるとイメージしやすいかと思います。
ただ、中身のロジックであるC-BOWとskip-gramが全然わからないので
コードから何をやっているんだろうというのを理解しようとしてみました。
その時のメモです。（ほぼCBOWについてしか書いてないです）

# リポジトリの中身
実際に使ってみたことのある方はわかるかと思いますが、
* distance.c
* word2analogy.c
* word2vec.c
* word2phrase.c

と、これらに似たような名前の.shファイルが見つかります。
.shの中身は大体以下の内容です。
>学習データの取得
>word2vecによる学習
>各種デモの実行（distance/word2analogy/word2phrase)

**demo-word.sh** の場合こんなかんじ。
```
1. 学習データの取得
2. word2vecによる学習
******ここからdistance.cの内容*****
3. 学習済みデータ（ベクトル化済みの単語辞書）の読込
4. ユーザ入力の受け取り
5. コサイン類似度でk-NN（割とnaiveな実装でした）を実行しk-Bestを出力
6. 4に戻る
``` 

# というわけでword2vec.cを読んでみる
行数は全部で７００行程度と思ったより少なめ。
DeepLearningの文脈で出てくることもありますが、内部ではNNの重みを学習する過程で単語のベクトル化を行い、NNの重みは捨ててベクトル化された単語を保存します。
２０弱の関数がありますが、
**TrainModelThread()**
**CreateBinaryTree()**
**InitNet()** 
このあたりが重要かなと思います。

ただし、変数の使い回しがあったりで結構読みづらいです。
というわけでこのあたりを見てみる。

**InitNet**
一番簡単そうなものから。
ネットワークと単語ベクトルの初期化を行う

**CreateBinaryTree**
単語をひと通りなめる時に頻度もカウントしておいて
huffman-codingをする。それに応じて2分木を作っておく

**TrainModelTHread**
メインの学習スレッド
TrainModel()から呼ばれる
引数に応じてCBOWかSkipgramかだったり、
- hierarchical softmax
- negative sampling
をつけるか、などもここで利用する。

今回はそのうちのメインの１つCBOWについて簡単に説明する。
CBOWはひとことで言うと前後N単語それぞれのベクトルの平均値を求めるもの。
そんなことして何になるんだと思われる方もいると思いますが

「今日」「私は」「？」「に」「行くんだ」って文を見たら
「？」には場所がはいるんだろうなと予測ができますよね？
これを機械に行わせるために大量に集めてこれらの語の平均の方向へ「？」に入りそうな場所を表す語は上の様な例文の文脈でよくでてくるから同じようなベクトルを足しそうですよね。

多分これが直感的なWord2vecの話かと思います。
CBOWはそのなかでも、単語をベクトル化したものを「順序を無視して」単純に足したというところが重要だということです。
（明日京都に行きますと京都に明日行きますは文意は同じですが順序を利用してしまうと別の意味になってしまう）

本当はhuffman-codingによる効果やnegative samplingによる効果も書きたいのですが全然理解ができてないので理解ができたらまた勉強がてらまとめます。

あと、これコードが短くてCBOWだけなら書けそうなのでゆとりができればMapReduceできるようにしようと思います。
Laravel セッションクッキーの有効期間をブラウザを閉じるまでにする


Laravel 4.1 では、セッションクッキーの有効期間がデフォルトでは 2 時間になっています。

これをブラウザが閉じたら、クッキーを破棄するようにします。

方法は、`app/config/session.php`の設定をかえるだけ。

```php
    'expire_on_close' => true, // デフォルト false なので、true に変更
```

楽ちん。
AngularJSを利用したサイトで見かけたちょっと残念な点

https://note.mu/ ってサービスご存知ですか?

> noteは、あなたのコンテンツを、ブログやTumblrのように無料で発表するのに 
お使いいただけます。そして、それを販売することもできます。

要するにノート共有サービスですね。

なんかスタイリッシュだしカッコいいです。

…なんかAjaxっぽい動きしますよねw

実はこのサービス、メインのHTML自体はどのページでも同じものを読んでAngularJSでコンテンツ読み込んだりなんなりしてるんですね。

 ……面白いですねw

さて、このサイトのコンテンツにはOpen Graph Protocolタグ(以下OGタグ)が含まれています。

FacebookやGoogle+なんかのSNS等に埋め込まれるアレですね。

自分はFacebookは利用していないので知らないのですが、こっちは問題ないらしい。

問題はGoogle+で見た時。

とりあえず例としてはこうなります。

![スクリーンショット](https://qiita-image-store.s3.amazonaws.com/0/23997/fb604958-a79c-b26c-437e-097870c0d9d1.png)

…本来ならコンテンツの概要でも出るようにすべきなんですけど…

Angularに慣れてる人ならすぐに理解出来たのではないでしょうか?(自分はAngularは未学習なんで何とも言えませんが。)

そうなんです。

このサイト、ogタグもAngularで置換してたんですね。

該当部分は以下のよう。

```html
<meta content="note（ノート）" property="og:site_name">
<meta content="{{ note_ogp_title }}" property="og:title">
<meta content="{{ note_ogp_url }}" property="og:url">
<meta content="{{ note_ogp_image }}" property="og:image">
<meta content="article" property="og:type">
<meta content="{{ note_ogp_description }}" property="og:description">
```

はい。バリバリやってますｗ

ちなみにこの問題、自分が知ったのは約20日前のこと。G+だと画像が出ないとか耳にしたから見てみたらまあこうなってたんですねw

せめてそこぐらい動的にHTML書き換えて対応してほしいんだけど(SEO的な問題もどうなのこれｗ)

----

なお、この問題は既に解決されているようです。
mysql2をbundle installしたときにエラーが出た。

bundle installすると、

> Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

っというのが出る。

どうやらmysqlのheaderファイル周りが探せないらしい。

https://github.com/brianmario/mysql2#configuration-options

ここに、書いてあるのでその通りに指定したら
gem install 出来たので

`bundle config build.mysql2 --with-mysql-config=/usr/local/Cellar/mariadb/10.0.10/bin/mysql_config`

これを叩いて、.bundle/configの中に入れ込んで、
そのあと bundle install.

できたー。
AdSupport使ってない人は、FacebookSDKを3.13.1にUpdateするべき


* この問題にはまってしまった
* itunesconnectのアップ時、IDFA使ってないにも関わらず、AdSupportを使っているとアップロード時にvalidation errorになる問題。。
* waiting for uploadの状態で、validationでリジェクトされて、動けなくなる。IDFAを使う選択をするには一度バイナリアップデートして、リジェクトする必要があるため。

```
Advertising Identifier Does this app use the Advertising Identifier (IDFA)? The Advertising Identifier (IDFA) is a unique ID for each iOS device and is the only way to offer targeted ads. Users can choose to limit ad targeting on their iOS device.
```

### 結論

* FacebookSDKやGoogle AnalyticsやMixpanelのpodのアップデートをすれば問題ないのでアップデートするべき！！

### 参考
* 13.3.0 https://github.com/CocoaPods/Specs/blob/master/Facebook-iOS-SDK/3.13.0/Facebook-iOS-SDK.podspec
* 13.3.1 https://github.com/CocoaPods/Specs/blob/master/Facebook-iOS-SDK/3.13.1/Facebook-iOS-SDK.podspec
* Facebookのissue https://github.com/facebook/facebook-ios-sdk/issues/583
* http://stackoverflow.com/questions/21574680/app-rejected-because-of-advertisingidentifier-in-facebook-sdk-and-flurry-sdk/21575453#21575453
HttpURLConnection とリダイレクトについて

# 初心者向けです

我らが @KeithYokoma が素敵な記事「Java - HttpUrlConnection とエラーハンドリング - Qiita - http://goo.gl/hX9FVV 」を書いていたので、初心者向けにまた書きます。

## ないよう

HttpUrlConnection はプロトコルが違うリダイレクトは自動的に処理しないという仕様があります。例えば、 http://hoge.com が https://gege.com にリダイレクトさせるようなレスポンスを戻してきても、HttpUrlConnection は勝手に https://gege.com につなぐようなことはないということです。

## 実験

http => https のリダイレクトを実現するために、Google のURL短縮サービス goo.gl を使います。

- http://goo.gl/fhjaj2 を準備
- これは https://twitter.com/ に301リダイレクト

```java
URL url = new URL("http://goo.gl/fhjaj2");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
Log.d(LOG_TAG, "response code = " + urlConnection.getResponseCode());
// 301 が戻ります
Log.d(LOG_TAG, "Location = " + urlConnection.getHeaderField("Location"));
// https://twitter.com/ です
```

このとき、レスポンスボディーには以下のHTMLが入っていました

```html
<HTML><HEAD><TITLE>Moved Permanently</TITLE></HEAD><BODY BGCOLOR="#FFFFFF" TEXT="#000000"><H1>Moved Permanently</H1>The document has moved <A HREF="https://twitter.com/">here</A>.</BODY></HTML>
```

## あとがき

- グロースハッカーはバズワード
プリミティブ型って何だ？

時々目にする「プリミティブ型」というのは何を指しているのだろうか。
Javaと.NETについて調べてみた。

いつも通り、コメントは大歓迎です。
「うちの言語のプリミティブ型はこれだぜ」ってのがあればコメントください。

## 一般的に

[Wikipedia](http://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AA%E3%83%9F%E3%83%86%E3%82%A3%E3%83%96%E5%9E%8B)によると

- 言語によって提供されるデータ型
- 対する語は複合型

らしい。

よくわからん。言語が複合型を提供することはないのか。

## Java

Javaの場合は値型のことをプリミティブ型と呼ぶようだ。
具体的には`boolean`, `int`, `float`, `char`などである。
`String`は含まない。

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

（読み飛ばしてたが「技術的にはプリミティブじゃないが、プリミティブと考えてもいいかも」的なことがかいてある。
技術的にはプリミティブってなんだ。その定義をするのが仕様だろ。値型って意味じゃないぞ）

## .NET

[Stackoverflowの記事](http://stackoverflow.com/questions/3965752/is-string-a-primitive-type) を参考にする。

### CLRの場合

.NETの`Type`型には`IsPrimitive`というプロパティがある。
http://msdn.microsoft.com/en-us/library/system.type.isprimitive.aspx

CLRの場合、Javaのような`int`等に加えてポインタ型をプリミティブ型と呼ぶようだ。
CLRでは、`enum`や`struct`も値型であるが、これらはプリミティブ型とは呼ばない。

### VB.NETの場合

VB.NETの場合は、Javaのような`int`等に加えて`String`や`Date`もプリミティブ型と呼ぶようだ。
http://msdn.microsoft.com/ja-jp/library/aa711900.aspx

CLR上はプリミティブであるポインタ型は含まない。
これはおそらく.NET以前のVBの名残だと思われる。

### C#の場合

上記のStackoverflowの回答では、`int`等に加え`Decimal`がプリミティブだと書いてある。
しかしECMAの仕様を検索したところ（`Ctrl+F`が壊れていなければ）C#にはプリミティブの定義が無い。
http://www.ecma-international.org/publications/standards/Ecma-334.htm

追記：C#でもプリミティブの定義はあるようだ。コメント参照

## まとめると

Javaの場合は、Objectではない型を指す。

C#, VB等の場合は、紛らわしいので使わないのがよいだろう。
実際、値型と参照型を区別することはあっても、プリミティブかどうかを区別したい機会は基本的に無い。
Editor ScriptでAnimationController作成

以下の処理でGUIでAnimationをPrefabにD&Dした際の挙動を再現できました。
これでAnimationClipをくっつけたPrefabを生成する作業をScriptで自動化できそうです。

```csharp
using UnityEditorInternal;

AnimatorController iController = AnimatorController.CreateAnimatorControllerAtPathWithClip (string path, AnimationClip clip);

RuntimeAnimatorController controller = iController as RuntimeAnimatorController;
animator.runtimeAnimatorController = controller;
```

UnityEditorInternalなんてあったのですね。Document化して欲しいものです。。
Sublimetext2設定


##Package Controlのインストール
メニューのView -> Show Consoleで以下のコマンドを貼り付けてEnter。

```
import urllib2,os; pf='Package Control.sublime-package';ipp=sublime.installed_packages_path(); os.makedirs(ipp) if not os.path.exists(ipp) else None; urllib2.install_opener(urllib2.build_opener(urllib2.ProxyHandler())); open(os.path.join(ipp,pf),'wb').write(urllib2.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read()); print 'Please restart Sublime Text to finish installation'
```

インストール完了後、再起動すればPackage Controlのインストール完了.

参照
[おすすめエディタSublime Text2の導入と設定（初期設定編）](http://code-plus.jp/sublime-text2-setting/)


##パッケージのインストール
1. 上記Package Controlのインストール完了後、Shift + Command + pでCommand Palletが開くので、installと入力。
1. Packageの検索ができるので、必要なパッケージの名前を入力してインストール。

※以下のパッケージをインストール。
※必要に応じて追加/削除してください。

```
CoffeeScript
CSS Snippets
Emmet
Html5
JavaScript Snippets
jQuery Snippets Pack
LESS
Markdown Preview
Sass
SideBarEnhancements
TypeScript
```


##パッケージの削除

1. Ctrl+Shif+p
1. 「Remove Package」を入力
1. リストアップされている項目を選択してEnter
1. インストールされているパッケージが一覧表示されるので、削除したいパッケージを選択してEnterで削除される。

##Key Bindings
メニューのSublime Text2 -> Preferenes -> Key Bindings - Userで開かれるファイルに以下を記述。
※Commad + d -> カレント行の複製。
※Command + Tab -> 右側のタブをアクティブにする。
※Shift + Command + Tab -> 左側のタブをアクティブにする。


```Default(OSX).sublime-keymap
[
	// カレント行の複製
	{ "keys": ["super+d"], "command": "duplicate_line" },

	// タブの切替を表示順にする
	{ "keys": ["ctrl+tab"], "command": "next_view" },
	{ "keys": ["ctrl+shift+tab"], "command": "prev_view" },
	{ "keys": ["alt+m"], "command": "markdown_preview", "args": {"target": "browser"} },

	// Vim風タブの切替
	{
		"keys": ["g", "t"], "command": "next_view",
		"context":
		[
			{ "key": "setting.is_widget", "operand": false },
			{ "key": "setting.command_mode" }
		]
	},
	{
		"keys": ["g", "T"], "command": "prev_view",
		"context":
		[
			{ "key": "setting.is_widget", "operand": false },
			{ "key": "setting.command_mode" }
		]
	}
]
```


##ユーザ設定
メニューのSublime Text2 -> Preferenes -> Settings - Userで開かれるファイルに以下を記述。

```Preferences.sublime-settings
{
	"bold_folder_labels": true,
	"close_windows_when_empty": false,
	"color_scheme": "Packages/Color Scheme - Default/Cobalt.tmTheme",
	"disable_formatted_linebreak": true,
	"disable_tab_abbreviations": true,
	"disabled_single_snippet_for_scopes": "",
	"draw_minimap_border": true,
	"draw_white_space": "all",
	"enable_emmet_keymap": true,
	"font_size": 10.0,
	"highlight_line": true,
	"highlight_modified_tabs": true,
	"ignored_packages":
	[
		"",
		"DocBlockr"
	],
	"indent_guide_options":
	[
		"draw_active"
	],
	"shift_tab_unindent": true,
	"trim_trailing_white_space_on_save": true
}
```
Android アプリをリリースする前にエンジニアに必要な心構え

# あるある的な感じで書きます

個人でアプリをリリースするとあるかもしれないことを書いてみました。全て実体験に基づいて書いています。

## 心無い罵倒にも屈することのない強い心を持つ

ユーザーの方々から、無料アプリであったとしても、アプリに欠陥を見つけると鬼の首をとったかのような言葉が届くことがあります。耐えましょう。

例）

- さっさと直せ、くず！
- 全然使えない！
- ○○の方がまし！

## 機種依存問題には広い心で

バージョン2系はもう捨てたいと思っても、対応してしまったのなら、あきらめてください。大変です。今更、実機は手に入らないし、実機検証サービスは高いし。

思い切って2系を捨てて、安心だと思ったあなた！Androidはそんなあなたを逃がしません。2系から4系にバージョンアップされた機種とか、ギャラクシーとかギャラクシーとか、機種依存問題はあなたの貴重な時間を食いつぶします。

## 有料アプリは売れません

片手間で作ったようなアプリはまず売れません。あきらめよう。

## コピーアプリは有名税

あなたのアプリがヒットすると、怪しい団体が丸々ぱくって、リリースしてきます。仕方ないよね。彼らも金儲けに必死です。

## テストは大切！3時間ぐらいのタイムラグ

Developer Console からアプリを公開すると3時間ぐらいで反映されます。うっかり致命的なバグを埋め込むと気づくのに遅れます。proguard 使っているときは特に気をつけよう。リリース用のapkで必ずテストしよう。
《結城浩のスペーストーキー問題》

http://www.hyuki.com/codeiq/#c16

```java:Main.java
import java.io.BufferedReader;
import java.io.InputStreamReader;

class Main {
  private static String encodeStringFromChar2(char c, int n) {
    StringBuffer buf = new StringBuffer();
    for(int i = 0; n > 0 ; i++) {
      buf.append(c); 
      buf.append((char)('a' + ((n > 26)? 25 : n - 1)));
      n -= 26;
    }
    return buf.toString();
  }
  private static String myEncode(char[] str, int n) {
    StringBuffer buf = new StringBuffer();
    int i = 0;
    while(i < n) {
       char c = str[i];
       int  m = i;
       while(i < n && c == str[i]) i++; 
       buf.append(encodeStringFromChar2(c, i - m));
    }
    return buf.toString();
  }
  private static String myDecode(char[] str, int n) {
    StringBuffer buf = new StringBuffer();
    for(int i = 0; i < n; i++) {
       char c = str[i++];
       int  m = str[i] - 'a' + 1;
       buf.append(decodeStringFromChar(c, m));
    }
    return buf.toString();
  }
  private static String decodeStringFromChar(char c, int n) {
    char[] value = new char[n];
    for(int i = 0; i < n; i++) value[i] = c;  
    return new String(value);
  }
  public static void main(String[] args) throws Exception {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String line = null;
    while((line = br.readLine()) != null) {
      int n = line.length();
      char[] a = line.toCharArray();
      if(n % 2 != 0) System.out.println("X:" + line);
      else {
       String decoded = myDecode(a, n);
       int m = decoded.length();
       boolean isValid = m <= 1024 && 
                         line.equals(myEncode(decoded.toCharArray(), m));
       if(isValid)
         System.out.println(decoded + ":" + line);
       else
         System.out.println("X:" + line);
      }
    } 
  }
}
```
jQueryで設定したイベントのバブリングと実行順について

実行順わかんなくなるのでメモ。

# 結論

jQueryはバブリングフェーズにイベントが設定されるので、発生した要素から順に親要素へイベントが伝播する。
1つの要素に複数のイベントが設定されていた場合、delegateTarget内でバブリングし、さらにその内部でtarget内でバブリングする。

ちなみにonメソッドの引数にセレクタを指定した場合は、jQueryオブジェクトの選択要素の内部に含まれる要素に対して設定される。

バブリングした要素に同じクラス属性が指定されていたりすると、2回実行されるのが意外と気づかなくてバグったりするので気を付ける。

# テストコード
```html
<div class="c1">
<button type="button" class="c1">click me!</button>
</div>
```

```js
$(document).on("click", "button", function(e){
    console.log("document button");
});
$(document).on("click", "div", function(e){
    console.log("document div");
});
$(document).on("click", ".c1", function(e){
    console.log("document class:c1");
});
$("div").on("click", "button", function(e){
    console.log("div button");
});
$("div").on("click", "div", function(e){
    console.log("div div");
});
$("div").on("click", ".c1", function(e){
    console.log("div class:c1");
});
$("div").on("click", function(e){
    console.log("div");
});
$(".c1").on("click", function(e){
    console.log("class:c1");
});
$("button").on("click", function(e){
    console.log("button");
});
```

#結果

```
class:c1
button
div button
div class:c1
div
class:c1
document button
document class:c1
document div
document class:c1 
```
Mac（OS X 10.9.2）でのMySQLインストール手順（Homebrewを利用）


##MySQLのインストール
以下のコマンドを入力し、MySQLをインストール。

```bash:
$ brew install mysql
```

インストール完了後、以下のコマンドを入力し、セットアップを行う。

```bash:
$ mysql_install_db --verbose --user=`whoami` --basedir="$(brew --prefix mysql)" --datadir=/usr/local/var/mysql --tmpdir=/tmp
```

セットアップが完了したら、サーバを起動する。

```bash:
$ mysql.server start
```

起動確認後、以下のコマンドを入力し、MySQLの初期設定を行う。
設定は対話式で行えます。

```bash:
$ mysql_secure_installation
```

　
以下、参考サイト
・[Homebrew で MySQL をインストール](http://dejune.net/deblog/mac/post/20131112111732.html)
・[MavericksでのMySQLの運用](http://qiita.com/mountcedar/items/16373094e2c41b512783)

##Mac用MySQL管理ツール「Sequel Pro」
Mac用のMySQL管理ツールは「Sequel Pro」が便利！（phpMyadminのように使えます！）
[「Sequel Pro」の公式サイト](http://www.sequelpro.com/)からダウンロードし、インストールします。
Arrays.asList の罠

# 問題

文字列のリストは、Arrays.asList を使うと次のように初期化できる。

```java
String[] array = {"abc", "def"};
List<String> list = Arrays.asList(array);
```

しかし、int型の配列を同様に扱おうとすると、怒られる。

```java
// コンパイルエラー
int[] array = {0, 1};
List<Integer> list = Arrays.asList(array);
```

実際の現場でやるなら、下記のようにするしかないぽい。

```java
int[] array = {0, 1};
List<Integer> list = new ArrayList<Integer>(array.length);
for (int i = 0; i < array.length; i++) {
    list.add(array[i]);
}
```

何とも悩ましい。

# 原因
> Arrays.asList は、プリミティブ型の配列をリスト化してくれない。
> いや、正確にはリスト化はしてくれるものの、プリミティブ型の配列全体を単一の要素として扱うため極めて直感と異なる動作をする。
参照：[http://aoking.hatenablog.jp/entry/20110415/1302824606](http://aoking.hatenablog.jp/entry/20110415/1302824606)

ということらしい。
ということは、Integerのオブジェクトの配列ならイケるってことか？

```java
Integer[] array = {new Integer(1), new Integer(2)};
List<Integer> list = Arrays.asList(array);
```

イケた。が、Integer型とか普段使わないしな...
問題の根が深そうなのでひとまずメモ、ということで。
Sensuのclient.jsonをChefで管理する場合のsubscriptionの作成方法

Sensuの管理をChefで行う場合、`subscriptions`の設定をどうするか考えた結果
下記のようにtemplate側でまとめるという方法があるのかなと思ったのですが
(attributesはrole to roleのみmergeされる。その際にnodeのattributesは破棄されてしまうので)
他に何か良い方法ありますかね。

もしくはそもそも私の認識に誤りがある可能性が高いので、
ご指摘頂ければありがたいです。

- roles/web_foo.json

```json
  "sensu": {
      "node_subscriptions": [ 
          "web_foo"
      ]
  },
  "run_list": [ "role[web]" ]
```

- /roles/web.json

```json
{
  "name": "web",
  "description": "web",
  "json_class": "Chef::Role",
  "override_attributes": {
      "sensu": {
        "role_subscriptions": [ "web" ]
      }
  },
  "default_attributes": {
  },
  "chef_type": "role",
  "run_list": [
    "role[base]"
  ]
}
```

- roles/base.json

```json
{
  "name": "base",
  "description": "base",
  "json_class": "Chef::Role",
  "override_attributes": {
      "sensu": {
        "role_subscriptions": [ "all" ]
      }
  },
  "default_attributes": {
  },
  "chef_type": "role",
  "run_list": [
    "recipe[sensu-settings]"
  ]
}
```

- sensu-settings/recipes/default.rb

```rb
template "/etc/sensu/conf.d/client.json" do
  owner "root"
  mode  0644
  source "client.json.erb"
end
```


- client.json.erb

```erb
{
  "client": {
    "name": "<%= node[:hostname] %>",
    "address": "<%= node[:ipaddress] %>",
<% _subscription = Array.new %>
<% _subscription += node[:sensu][:node_subscriptions]  %>
<% _subscription += node[:sensu][:role_subscriptions]  %>
    "subscriptions": <%= _subscription %>
  }
}
```

- client.json

```json
{
  "client": {
    "name": "HOSTNAME",
    "address": "IPADDR",
    "subscriptions": ["web_foo", "all", "web"]
  }
}
```
Emacs で M-backspace で kill-ring に追加したくない

# 環境

Macbook Air (US keyboard)

# elisp

Meta-backspace で1単語を消してくれるのは便利なんですけど、いちいち kill-ring に入ってほしくない。用途としては、ただ消したいのであって後からその文字列をペースト（ヤンク）したいわけではないからです。こういう人は多いと思います。

結論から言うと、http://www.emacswiki.org/emacs/BackwardDeleteWord でおｋ．

上記URLからLispを転記すると、以下のとおり。

```el
(defun delete-word (arg)
  "Delete characters forward until encountering the end of a word.
With argument, do this that many times."
  (interactive "p")
  (delete-region (point) (progn (forward-word arg) (point))))

(defun backward-delete-word (arg)
  "Delete characters backward until encountering the end of a word.
With argument, do this that many times."
  (interactive "p")
  (delete-word (- arg)))

(global-set-key (read-kbd-macro "<M-DEL>") 'backward-delete-word)
```

を init.el に追加するだけでOK。注意してほしいのは、

```el
(global-set-key [(meta backspace)] 'backward-delete-word) ;; doesn't work
```

これだと何故かうまくいかないということ。もしかしたら Windows ではちゃんと動くかも。

また、上記に定義されている `delete-word` がキーマップに割あたっていないので、 `M-d` に割り当てるようにします。

```el
(global-set-key [(meta d)] 'delete-word) ;; works fine!
```

こちらはちゃんと動きます。
開発環境構築手順



会社で使用しているMacが新しくなり開発環境を再度構築することになったので、その手順を紹介します。
対象のMacはMacBookAir2013 11inch、OSは10.9.2です。

##AppStoreからアプリをインストール
※Appleアカウントを作成し(作成済みならそのアカウントで)、AppStoreから必要なアプリをインストールする。
※とりあえず、下記のアプリをインストール

```
Memory Magic // メモリ解放アプリ
Stuffit Expander // 解凍アプリ
Xcode // アップル製IDE
WinArchiver Lite // Win環境で解凍しても文字化けしないzipファイル作成アプリ
```

##homebrew(パッケージ管理システム)のインストール
下記のコマンドを実行

```
$ ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
```


上記手順は[hombrewのページ](http://brew.sh/index_ja.html)に載っている

##Brewfileの作成
※以下の内容を記述したファイルを作成。
※ファイル名はBrewfile。拡張子はなし。

``` Brewfile
# Homebrewを最新版にアップデート
update

# Formulaを更新
upgrade

# homebrew-caskのインストール
tap phinze/homebrew-cask
install brew-cask

# パッケージのインストール
cask install appcleaner
cask install android-studio
cask install clipmenu
cask install coteditor
cask install cyberduck
cask install colors
cask install filezilla
cask install firefox
cask install google-chrome
cask install hyperswitch
cask install iterm2
cask install kobito
cask install keyremap4macbook
cask install mysqlworkbench
cask install scroll-reverser
cask install smoothmouse
cask install sublime-text
cask install vagrant
cask install virtualbox
cask install xampp
cask install xtrafinder

# 不要なファイルを削除
cleanup
cask cleanup
```

<section>
※上記Brewfileはhomebrew-caskのインストールも行っているが、
     必要なアプリを探してインストールする場合、
     以下の手順に従い、インストールするアプリを探してBrewfileに記述する。

まずはhomebrew-caskのインストール

```
$ brew tap phinze/cask
$ brew install brew-cask
```


※インストール出来るアプリの一覧は以下のコマンドで探せる

```
$ brew cask search
```

※特定のアプリがインストールできるかどうかを調べるには以下のコマンド

```
$ brew cask search アプリ名
```
</section>


##homebrewからアプリのインストール
上記Bundlefileが保存されているディレクトリで以下のコマンドを実行する。

```
$ brew bundle
```


##インストールしたアプリの表示

```
$ brew cask list
```

参照
[BrewfileとHomebrew-caskでmacのセットアップ - Qiita](http://qiita.com/macoshita/items/09c730e5a281897365eb)

[BrewfileでHomebrewパッケージを管理する | SOTA](http://deeeet.com/writing/2013/12/23/brewfile/)

[homebrewとhomebrew-caskとBrewfileでmacの環境構築を楽にする - WhereToStart](http://futabooo.hatenablog.com/entry/2014/04/26/035239)


##手動でアプリをインストール
※AppStore、homebrewからインストール出来ないアプリは手動でインストールする。

- [mi](http://www.mimikaki.net/download/index.html) // エディタ
- [shupapan](http://sunsky3s.s41.xrea.com/shupapan/download/) // リネームアプリ


##環境設定
※アプリのインストールが完了したら、環境設定を行う。

###Mac本体の設定
- キーボード

「F1、F2などのすべてのキーを標準のファンクションキーとして使用」にチェック。
修飾キー -> Caps LockキーをCommandに変更。

- クイックルック

クイックルック中のテキストファイルをコピーできるように、terminalで下記コマンドを実行。

```
$ defaults write com.apple.finder QLEnableTextSelection -bool TRUE; killall Finder
```

###アプリの設定
- [ClipMenu](http://qiita.com/koshihikari/items/2be6f5e6d9e4add7cf22)
- [HyperSwitch](http://qiita.com/koshihikari/items/a8e7bb978a3b68830920)
- [KeyRemap4MacBook](http://qiita.com/koshihikari/items/f78d7a4804167f08a871)
- [Reverse Scrolling](http://qiita.com/koshihikari/items/c0e66f95cbddf1207235)
- [SublimeText2](http://qiita.com/koshihikari/items/fb470e84cc31d2c8dd7f)
- [SmoothMouse](http://qiita.com/koshihikari/items/51d0603119a968a866a0)
- [XtraFinder](http://qiita.com/koshihikari/items/ec27f53ca3d00ed1942a)
Reverse Scrolling設定



1. Reverse Scrollingを起動
1. メニューバーのアイコンクリック
1. Preferencesの項目を以下のように設定。


```
Reverse Horizontal // チェックを外す
Reverse Vertical // チェックを付ける

Reverse Trackpad // チェックを外す
Reverse Mouse // チェックを付ける
Reverse Tablet // チェックを付ける

Start at Login // チェックを付ける

Check For Updates // チェックを付ける

Show in Menu Bar // チェックを付ける
```
Dockerで起動中のコンテナを全部停止して削除する


Dockerで適当に色々試すときにnameを付けないとIDを指定して止めたり削除したりしないといけません。これがめんどうになってきたので簡単なやり方。

`docker ps`コマンドに`-q`ってオプションがあるのですが、これを使うと起動中のコンテナのIDだけがずらっと並びます。

```bash
vagrant@vagrant-ubuntu-trusty-64:~$ docker ps -q
4730aed2e567
bcf155170c55
bf224ca539b2
```

なので`xargs`と連携させてこんな感じにすると、起動中のコンテナを綺麗さっぱり消すことができます。

```bash
vagrant@vagrant-ubuntu-trusty-64:~$ docker ps -q | xargs docker stop | xargs docker rm
4730aed2e567
bcf155170c55
bf224ca539b2
```

`docker kill`を使ってもいいんですけど気分的にいやなので、`stop`と`rm`で。ちなみに、`docker stop`も`docker rm`も実行後に標準出力にIDが出力されるのはこのような使い方を意図してなんでしょうね。

もし最後に起動したのだけを消したい場合は、`docker ps -q -l`とすればよいです。

```bash
vagrant@vagrant-ubuntu-trusty-64:~$ docker ps -q -l | xargs docker stop | xargs docker rm
4730aed2e567
```

###環境
* Docker 0.10.0
plenv install-cpanm でエラー


plenv install-cpanm を実行すると、以下の様なエラーが出る環境があった。

```shell
$ plenv install-cpanm
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   303    0   303    0     0   2648      0 --:--:-- --:--:-- --:--:--  2657
  0     0    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0
100   226  100   226    0     0    198      0  0:00:01  0:00:01 --:--:--   198
Bareword found where operator expected at - line 3, near "400 Bad"
        (Missing operator before Bad?)
Bareword found where operator expected at - line 6, near "<p>Your"
        (Missing operator before Your?)
syntax error at - line 2, near "html>"
Execution of - aborted due to compilation errors.
```

install-cpanm内部で使っているcurlコマンドが怪しいということで、
curlコマンドのバージョンを調べた。

```shell
$ curl --version
curl 7.29.0 (x86_64-redhat-linux-gnu) libcurl/7.29.0 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smtp smtps telnet tftp
Features: AsynchDNS GSS-Negotiate IDN IPv6 Largefile NTLM NTLM_WB SSL libz
```

バージョンに関係なく、SSL通信にNSSが使われているのが問題そうなので、
OpennSSLに切り替えた。

ただ、yumでなんとかOpenSSLに切替えようとしたが、
やり方が分からなかったので、以下の手順でコンパイルした。

```shell
# cd /usr/local/src
# wget http://curl.haxx.se/download/curl-7.36.0.tar.gz
# tar xvzf curl-7.36.0.tar.gz
# cd curl-7.36.0
# ./configure --prefix=/usr/local --with-openssl
# make && make install
# mv /usr/bin/curl /usr/bin/curl.old
```

予想通りOpenSSLを使用したcurlではうまく行った。
うまく行ったcurlのバージョンは以下のとおり。

```shell
$ curl --version
curl 7.36.0 (x86_64-unknown-linux-gnu) libcurl/7.36.0 OpenSSL/1.0.1e zlib/1.2.3 libidn/1.18
Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp smtp smtps telnet tftp
Features: IDN IPv6 Largefile NTLM NTLM_WB SSL libz
```

ひとまず問題なくなったが、Chefでyumインストールしている部分なので、
確実にOpenSSLを使用するcurlをyumでインストールしたい。

けど、やり方はまだわかっていない。
最近の静的サイトボイラープレート


最近0からサイト作るときによく使ってるnpmパッケージ（つかgruntプラグイン）とフォルダ構成。

## 設定系
- load-grunt-config
- grunt-bower-task

load-grunt-config で各タスクをGruntfile.coffeeから分離して好きなフォルダに配置する。

grunt-bower-task はbowerで引っ張ってくるライブラリを好きなディレクトリに配置する。


## メタ言語コンパイル
- grunt-contrib-jade
- grunt-contrib-sass
- grunt-contrib-coffee

説明不要かな。jadeをhtmlに、sassをcssに、coffeeをjsにコンパイル。


## チェック
- grunt-contrib-jshint
jsはjshintでチェック。

## ローカルサーバ・監視系
- grunt-contrib-connect
- grunt-open
- grunt-este-watch
- grunt-notify

grunt-openを使ってるのは僕のデフォルトブラウザがSafariだけど開発はChromeにしたいからで、開くブラウザを指定するために使ってる。

grunt-notify でコンパイルが成功した貸してないかを通知してくれるから地味に便利。

## 整理整頓
- grunt-contrib-copy
- grunt-contrib-rename
- grunt-contrib-clean
- grunt-contrib-concat
- grunt-contrib-uglify
- grunt-usemin


ここら辺はプロジェクトによりけり。バックエンドのフレームワークの影響で「画像はこっちな！」って指定があったりする場合にコピーとかリネームとか使ってる。

あとは最適化とかの際に concat と uglify と usemin で良い感じに。

## フォルダ構成
だいたいこんな感じ。src にソースを入れてドキュメントルートは dist にしてる。あと各種設定ファイルは config に入れて、gruntの各タスク設定ファイルは config/grunt に入る感じ。

````
ProjectRooot
  ├ config/
  │  ├ grunt/  // 各タスクファイル
  │  │  └alias.yaml
  │  │  └esteWatch.coffee
  │  │  └〜他タスク毎のcoffeeファイル
  │  └ .jshintrc
  ├ dist/   // ドキュメントルート
  │  ├index.html
  │  ├dir/
  │  └assets/
  │    ├ libs/  // bowerでインストールするライブラリ
  │    ├ img/
  │    ├ css/
  │    └ js/
  ├ Gruntfile.coffee
  ├ node_modules/
  │  └各モジュール/
  ├ package.json
  └ src/   // ソースコード
     ├ sass/
     │ ├ style.sass
     │ ├ _layout.sass
     │ ├ _module.sass
     │ ├ _element.sass
     │ └ common/
     ├ coffee/
     │ ├ app.coffee
     │ ├ extend.coffee
     │ └ controller/
     ├ dir/
     └ index.jade
````


## Gruntfile.coffee
load-grunt-config のおかげでむっちゃ長いGruntfile.coffeeを分割できて結構嬉しい。今のGruntfile.coffeeはこんな感じ。

````coffeescript
module.exports = (grunt) ->
  path = require('path')

  # Load grunt tasks automatically
  require('load-grunt-config') grunt,
    configPath: path.join(process.cwd(), 'config/grunt')

````

これで各タスクの設定ファイルを ./config/grunt/ に置ける。何でわざわざ ./config/ つけてるかってのは .jshintrc みたいなファイルをどこでも良いからまとめたかったから。

## 各タスクの設定記述
タスクを alias.yaml に記述して、後はタスク毎のcoffeeファイルを作る

````yaml
# alias.yaml

default:
  - 'connect'
  - 'open'
  - 'esteWatch'

init:
  - 'bower:install'

dist:
  - "useminPrepare"
  - "concat"
  - "uglify"
  - "usemin"
  - "sass:build"
  - "clean"
````

後は各タスクのcoffeeファイルを書く。例としてgrunt-contrib-connect。

````coffeescript
module.exports = (grunt, path) ->
  server:
    options:
      base: 'dist'
      port: 3000
      livereload: true
````
 ## 今後の課題

これで結構良い感じに色々すっきりしてて便利で何とでもなる感じになってきてる。jadeのコンパイル時にパーシャルだった場合のルールとかも決めてできるだけ無駄コンパイルはしないようにもしてるし、残ってる課題は **/*.jade って感じで全ファイルjadeをコンパイルする時に各ファイルに対応したテキストを記述しているjsonファイルを渡せられるようになれればhtml（マークアップ）とテキストが分離できてよりステキになりそうな気がするんだけどなーと思ってるところ。
KeyRemap4MacBook設定


##アプリの終了をCommand + Q長押しに変更する
環境設定 -> Change Keyタブ -> Custom Shortcutsで、
「Hold Command + Q to Quit Application」にチェックを入れる。


###参照

- [すべてのアプリの終了をCommand+Qの長押しに変更する](Hold Command + Q to Quit Application)
DartにおけるSingletonパターンの実装方法

Dartの中の人のSeth Ladd氏がSingletonの実装方法として以下の書き方を提案している。

[How do you build a Singleton in Dart? - Stack Overflow](http://stackoverflow.com/questions/12649573/how-do-you-build-a-singleton-in-dart)

```dart
class Singleton {
  static final Singleton _singleton = new Singleton._internal();

  factory Singleton() {
    return _singleton;
  }

  Singleton._internal();
}
```

```dart
main() {
  var s1 = new Singleton();
  var s2 = new Singleton();
  print(identical(s1, s2));  // true
  print(s1 == s2);           // true
}
```

Dartのfactoryコンストラクタを使用していて一見スマートに見えるが、使用する側からすると、参照の度に`new`しているので、文脈としては新たにインスタンスを得ているように見える。

また、実用としては`Singleton`というクラス名を付けることは無いので、仮に例としてSingletonな`Director`クラスだとしたら、文脈としてそれがSingletonであることが予想できない。

```dart
main() {
  var d1 = new Director();
  var d2 = new Director();
  print(d1 == d2); // true
}
```

なので、ここは従来通りstaticな`Director.getInstance()`とするのが無難な気がするが、Dart的でmodernで可読性の高いSingletonの実装方法は無いだろうか。
XtraFinder設定


XtraFinder設定は以下のキャプチャの通りに。

##タブ
![kobito.1398672422.491692.png](https://qiita-image-store.s3.amazonaws.com/0/34439/f6ea2504-196f-a801-6faf-d898fa9090c6.png "kobito.1398672422.491692.png")
![kobito.1398672493.446543.png](https://qiita-image-store.s3.amazonaws.com/0/34439/96d709d4-8667-0fbe-cf47-bea327021a88.png "kobito.1398672493.446543.png")


##機能
![kobito.1398672437.888799.png](https://qiita-image-store.s3.amazonaws.com/0/34439/22458008-0f5c-308d-a62a-6572a44d4476.png "kobito.1398672437.888799.png")


##アピアランス
![kobito.1398672444.922702.png](https://qiita-image-store.s3.amazonaws.com/0/34439/396583d4-6a4c-1226-83b9-2453958657bc.png "kobito.1398672444.922702.png")


##Finderメニューに項目を追加
![kobito.1398672467.784517.png](https://qiita-image-store.s3.amazonaws.com/0/34439/1940f54e-5259-b9e4-abcf-55d58b19a86e.png "kobito.1398672467.784517.png")
Mavericksのターミナルで記号表示がおかしくなるのを改善する

Mavericks の Terminal.app では、非 ASCII の記号の表示がおかしくなる場合があります（引用符や○△など）。

例えば、GNU rm のエラーメッセージが残念な感じになります。

![スクリーンショット 2014-04-28 16.52.45.png](https://qiita-image-store.s3.amazonaws.com/0/6204/b0c83834-3ed3-5769-7c3f-09a71b19d39e.png)

これは、Terminal.app の、環境設定 > 設定 > 詳細 > 「Unicode 東アジア A の文字幅を W にする」をオンにすると改善されます。

![スクリーンショット-2014-04-28-16.54.32.png](https://qiita-image-store.s3.amazonaws.com/0/6204/6daf724a-29ea-55dc-1dcb-13241d7f02d9.png)

先ほどのエラーメッセージは以下のようになります。

![スクリーンショット 2014-04-28 16.53.23.png](https://qiita-image-store.s3.amazonaws.com/0/6204/ac9743af-f9ed-e65f-c911-945bf8365db4.png)
SmoothMouse設定


HyperSwitchの設定は以下のキャプチャの通りに。

##Mouse
![kobito.1398672212.522880.png](https://qiita-image-store.s3.amazonaws.com/0/34439/826ca80c-ba86-e611-4892-1db487e7b5f3.png "kobito.1398672212.522880.png")

##Trackpad
![kobito.1398672232.002619.png](https://qiita-image-store.s3.amazonaws.com/0/34439/fe561236-9d81-2ce7-febb-00fad50cc32e.png "kobito.1398672232.002619.png")

##About
![kobito.1398672262.787966.png](https://qiita-image-store.s3.amazonaws.com/0/34439/cf9565d4-6d2a-4f95-6dda-fd6f6b3464d6.png "kobito.1398672262.787966.png")
編集中にGUIの表示を確認する


GUIを表示するクラスにアノテーション`ExecuteInEditMode()`を付加する

```
[ExecuteInEditMode()]
public class Main : MonoBehaviour {
  void OnGUI() {
    ...
  }
}
```

# 参考

* [Unity Script Reference:](http://docs.unity3d.com/Documentation/ScriptReference/ExecuteInEditMode.html)
* [ExecuteInEditModeを使うと編集中も処理を実行可能 - 強火で進め](http://d.hatena.ne.jp/nakamura001/20120604/1338825200)
jQueryを使ってキーの同時押し取得(shiftやctrl)


チャットなどを作るときに、"Shift+Enterキーを押したときに送信を行う"などをよく使うと思います。このときのキーの同時押しの処理がイマイチ情報を調べにくかったのでまとめておきます。

##やりたいこと
`Shift + Enter`を押した時に何か

##調査
###１つのキーコード取得
jQueryのkeydownメソッドを使うと`凄く簡単`に１つのキーなら取得できました。
[keydown(fn) - jQuery 日本語リファレンス](http://semooh.jp/jquery/api/events/keydown/fn/)

###複数のキーコード取得
基本的には１つのキーコードを取得してそれが押された状態で次のキーが押されたという判定をkeyup,keydownを使って取得するみたいです。
[JavascriptでKeyの同時押しを判定する](not good but great - http://go.shr.lc/1lZiY3a)
．．．けっこう`めんどくさそう`でした。
(てかキーコードいちいち調べるのも面倒)

####altKeyとかmetaKeyとかのイベントがあるっぽい
教えてもらったのですが、`altキー`や`controlキー`などのキーに関しては専用のイベントがあるみたいです。jQueryは使ってないけどドンピシャなサンプルがこちら。ピュアなJSならこっちのサンプルの方がいいかも
[CTRLキーなど特殊キーが押されたかを調べる](http://www.openspc2.org/reibun/javascript/mouse/047/)

##完成コード
```get_multipule_key_event.js

$(function($){
  //Ctrlキー+エンター
  $(window).keydown(function(e){
    if(event.ctrlKey){
      if(e.keyCode === 13){
        alert("ctrl+enter");
		 return false;
      }
    }
  });
  //Shiftキー+エンター ←今回のやりたかったこと
  $(window).keydown(function(e){
    if(event.shiftKey){
      if(e.keyCode === 13){
        alert("shift+enter");
		 return false;
      }
    }
  });
});
```
`return false;`を入れないとキーコード押したあとに改行(Enter)が実行されちゃうのでチャットなどの送信に使う場合は書いておきましょう。

##まとめ
他にも`.altKey`や`metaKey`などもあるのでこれらを使えば同時押し制御もしやすくなるんじゃないかな。
[KeyboardEvent - DOM | MDN](http://go.shr.lc/S0FIae)

###キーコード表
[各ブラウザのキーコード表[JavaScript]](http://go.shr.lc/S0H8Sb)
HyperSwitch設定


HyperSwitchの設定は以下のキャプチャの通りに。

##General
![hyperswitch_001.png](https://qiita-image-store.s3.amazonaws.com/0/34439/7c714ff2-24c2-26ef-49d5-1d28b1822970.png)

##App Switcher
![hyperswitch_002.png](https://qiita-image-store.s3.amazonaws.com/0/34439/798ca6ec-cd6a-702a-2e5b-73af22da7873.png)

##Apperance
![hyperswitch_003.png](https://qiita-image-store.s3.amazonaws.com/0/34439/15da0b1c-13ab-0cd5-b3c4-905fa97dd8c4.png)

##About
![hyperswitch_004.png](https://qiita-image-store.s3.amazonaws.com/0/34439/2b959ef5-09be-51f3-3d3d-56b40df29c40.png)
ÍÍ
javascript goodparts 第5章まとめ


クラスを用いる言語(java）における継承のメリット
・コード再利用の仕組み
新しく作るクラスが既存のものとほぼ同じなら、差分だけを定義すればよい
・型システムの仕様を含んでいる
→明示的にキャストを行う必要性から解消される

js
キャストは存在しない
オブジェクトの継承関係も重要でない

「重要なのは何を継承しているかでなく、何ができるか」


jsはプロトタイプ型の言語
→　オブジェクトが他のオブジェクトから直接継承される

5.1 疑似クラス型
jsプロトタイプ　クラス型をまねたいくつかの構文をまねしたため、かえってわかりづらくなっている

あるオブジェクトからほかのオブジェクトへ直接継承を行う代わりに、オブジェクトがコンストラクタ関数によって生成する不必要なステップがある

関数オブジェクト生成時
・関数オブジェクト生成するFunctionコンストラクタ　内部的に↓を実行
this.prototype = {constructor: this};

コンストラクタであるかにかかわらず、すべての関数はプロトタイプオブジェクトを保持する
→なぜならこの言語には、どの関数がコンストラクタとして使われるためのものなのか区別する方法がない

constructorプロパテぃは役に立たない。重要なのはprototypeオブジェクト

コンストラクタ関数を使う際二生じる危険
コンストラクタ関数を呼び出す際にnewをわすれると、thisには新しいオブジェクトがせっとされなくなる

かわりにthisにはグローバルオブジェクトがせっとされてしまい、しかも警告が出ない
この問題を緩和するため
・すべてのコンストラクタ関数は先頭を大文字にそれ以外のものは先頭をおおもじにしない

・もっといい方法は、newをいっさい使わない

jsの継承方法で、もっといい選択肢がある

5.2オブジェクト指定子
コンストラクタが受け取るパラメータが多くなってしまうことがある
引数の順番を覚えるのが大変

パラメータの数が増えそうなときには、コンストラクタがオブジェクト指定子を受け取るように設計する方がわかりやすい

オブジェクト指定子　＝　オブジェクトを生成するにあたっての設定が格納されたオブジェクト

var mObjec = maker(f, l , m, c, s);

⬆のかわりに
var myObject = maker({
     first: f,
     last: l,
     middle: m,
     state: s,
     city: c
});
とする
・引数の指定の順序をきにしなくてよい
・コンストラクタがデフォルト値をよういしていれば引数省略できる
・コード可読性があがる


JSONを利用している場合にはさらにメリットがある

5.3プロトタイプ型


5.4　関数型
いままでの継承パターンの持つ弱点　
プライバシーがない
javascript goodparts 第３章まとめ


変数型
数値　文字列　真偽値 null undefined
変数型　＝　イミュータブル　一度セットした値を変更できない

オブジェクト
キーによって整理されたミュータブル＝変更可能なデータの集合体
配列　関数　正規表現　すべてオブジェクト
クラスの概念を持たない

オブジェクトのプロパティ
名前と値で構成されている

オブジェクトリテラル
{
  "first-name" : "jerome",
   "last-name": "akutsu"
};
名前：空文字を含む任意の文字列
クオート ""　予約語でなければ省略できる

undefinedのものにたいしてプロパティーを取得しようとするとTypeError
flight.equipment  // undefined
flight.equipment.model  // thrown TypeError

TypeErrorをさけるために
flight.equipment && flight.equipment.model  // undefined



・参照
オブジェクトは参照渡しが行われ、コピーされることはない

var x = stooge;
x.nickname = 'Curly';

var nickname = stooge.nickname;
// x と stoogeは同じオブジェクトを参照しているので nickの値はcurlyになる

var a = {}, b = {}, c = {}   // a,b,cはそれぞれ異なる空オブジェクト


・プロトタイプ
全てのオブジェクトはプロトタイプオブジェクトとリンクしていて、そこからプロパティを継承している
オブジェクトリテラルによってつくられたオブジェクトはすべて、js標準のObject.prototypeオブジェクトとリンクしている。

オブジェクト生成の際　プロトタイプとするオブジェクトをせんたくできる。

Object関数にcreateメソッドを追加する

if (typeof Object.create !== 'function') {
     Object.create = function(o) {
          var F = function() {};
          F.prototype = o;
          return new F();
     };
}
var another_stooge = Object.create(stooge);

オブジェクトの内容を書き換えた際にプロトタイプオブジェクトの内容が変更されることはない


-プロパティーの値の取得の流れ


オブジェクト.name
・オブジェクト自身に指定された名前のプロパティーを探す
・↑なかったら、そのオブジェクトのプロトタイプにさかのぼり探す
・Object.prototypeに行きつくまで検索する
・それでもなかったらundefined

プロトタイプオブジェクトに新しいプロパティを
追加した場合、そのプロパティはその瞬間から、そのオブジェクトをプロトタイプとするオブジェクトすべてにおいてアクセスできる
→プロトタイプチェーンについて調べる

・３．６リフレクション
オブジェクトの中身を調べる方法
typeof 変数型を調べる
but プロトタイプチェーン上に存在するプロパティに対しても利用できてしまう

typeof flight.toString // 'function'

↑取り出したくないプロパティにたいしての操作
これを防ぐ方法
①プログラム中で関数を格納したプロパティだけを無視する
②hasOwnPropertyメソッドを使う
　指定された名前のプロパティがそのオブジェクト自身のプロパティだった場合にだけtrue
　→hasOwnPropertyメソッドはプロトタイプチェーンをさかのぼらない


３．７プロパティの列挙
for in 　　オブジェクト内に存在するすべてのプロパティ名を順に取り出せる
but 関数やプロトタイプチェーン上のプロパティなど、必要ないものが含まれてるので除く必要がある
①hasOwnPropertyを使う
②typeofを用いて関数を取り除く

var name;
for (name in another_stooge) {
     if (typeof another_stooge[name] !== 'function') {
          document.writeln(name + ': ' + another_stooge[name];
     }
}

for in は順番が保障されていない
正しい順番で取り出したい場合
プロパティの名前を並べた配列を用意する

http://d.hatena.ne.jp/maeharin/20130215/javascript_prototype_chain

３．８　プロパティの削除
delete演算子を使うとプロパティを削除できる


３．９　グローバル領域の利用を減らす
グローバル変数はプログラムの柔軟性を弱めるので使うべきでない
グローバル変数を最低限にする方法の１つ
・アプリケーションのためにグローバル変数を１つだけ定義
var MYAPP = {};
↑これをアプリケーションのコンテナとして利用する

MYAPP.stooge = {
     "first-name" : "Joe",
     "last-name" : "howard"
};

ほかのアプリケーションやウィジェット・ライブラリと悪影響を与えあう可能性を劇的に減らせる。
cassandra keyspaceとclusterについて



keyspace
・RDBでいうと、スキーマもしくはDB

ColumnFamily
・テーブルにあたる

KEY  & ROW
ColumnFamilyの中に複数のKeyとRowがある
データ取得は基本的にこのKeyを介しておこなう
オブジェクト識別子のようなもの
Rowの中に実データ格納

column & name value
name, value 　バイナリ型なので何でも入れれる
timestamp  クライアント側のtimestampを設定するので、サーバ側と同期する必要

Super column
複数カラムを1つのnameでまとめたもの


参考：　http://blog.takuros.net/entry/20100502/1272811462
MsgpackRails で何か値を返すヤツ


# テストサーバを作る

`rails new testapp` で適当なRailsプロジェクトを作る

Gemfile に以下の行を追加

```Gemfile
gem 'msgpack-rails', :git => 'git://github.com/nzifnab/msgpack-rails.git'
```

適当なコントローラを用意して以下のようにレスポンスを返すコードを記述

```ruby:test_controller.rb
class TestController < ApplicationController
  def index
    response_data = {
      :player_info => {
        :name => "hoge",
        :age => 35
      },
      :friends => [10, 20, 30]
    }
    render :text => response_data.to_msgpack, :type => 'application/x-mpac'
  end
end
```

サーバ起動して、`http://localhost:3000/` にアクセスするとMsgPackでパックされたバイナリが返ってくる。

# レスポンスをUnpackしてみる

`pry`などで、MessagePack.unpack してみて、元の Hash 構造が復元できることを確認。

```
require 'msgpack'

res = Net::HTTP.get(URI.parse('http://localhost:3000/'))

MessagePack.unpack(res)
=> {"player_info"=>{"name"=>"hoge", "age"=>35}, "friends"=>[10, 20, 30]}
``` 

# 参考

* [nzifnab/msgpack-rails](https://github.com/nzifnab/msgpack-rails)
Express3.xから4に変更するとき

だいたいは[ここ](https://github.com/visionmedia/express/wiki/Migrating-from-3.x-to-4.x)に書いてはあるんだけど、ざっくりと言うと

* 3.xでuse(express.*)と書いてあるところはexpress.staticを除いて、新たにモジュールを入れてrequireしてそれをuseするコードに書き換える(bodyParser,cookieParser,favicon,session)
* app.use(app.router)の部分を投げ捨てる
* app.configure()は使えないので適宜等価なコードに書き換える

* connect-redisを使っている場合はexpress4をサポートしている最新バージョンに上げる（packages.jsonの書き方次第では、おそらくnpm updateで芋づる式にあがると思うけど）
* connect-redisのUsage通りにコードを書き換える