OmniAICreator/Qiita-1.07M huggingface dataset:
Nuclideのアンインストールに失敗した時は


[Issue報告](https://github.com/facebook/nuclide/search?q=uninstall&type=Issues&utf8=%E2%9C%93)すべきなんですが、コードを追えてないのでとりあえずここにメモ。たぶん、速攻で修正されると期待。

## アンインストールできない

興味本位で入れたものの、諸事情ですぐにアンインストールしたところではまりました。再現条件は、次の通り。その後、atomの設定が読み込めない、パッケージのロードができないなど、悩まされます。

- `cask`でAtomをインストール済み
- `$ apm install nuclide-installer`
- Nuclideでちょっとだけ遊ぶ
- `$ apm uninstall nuclide-installer`

## 手動でアンインストール

`~/.atom/packages/`ディレクトリ内に、この辺のパッケージが残っているので、これをざくっと削除します。`config.cson`の関連項目も削除したほうが無難かも。

- nuclide-click-to-symbol
- nuclide-code-format
- nuclide-diff-view
- nuclide-file-tree
- nuclide-file-watcher
- nuclide-flow
- nuclide-hack
- nuclide-hg-repository
- nuclide-language-hack
- nuclide-quick-open
- nuclide-remote-projects
- nuclide-type-hint

以上です。
Dockerでimageのダウンロードがudp timeoutになったら

```
Service 'XXX' failed to build: Get https://index.docker.io/v1/repositories/library/mysql/images: dial tcp: lookup index.docker.io on 192.168.2.1:53: read udp IP:53: i/o timeout
```

こんな感じのエラーが出たら

```
$ boot2docker restart
```

でDNSの設定をアップデートすればOK。職場から家に戻る時とかになる
MovableTypeにおけるパーマリンクは何を元に生成されているのか？

MTでブログ記事を書くと、`http://example.com/2015/06/foo.html` のようなパーマリンクが割り当てられるわけですが、この年月はどこから取得された値なのかを調べてみました。

# 結論：パーマリンクはこのようにして生成される。

DBの値からパーマリンクを生成するにはこのようにします。

```sql
SET sql_mode='PIPES_AS_CONCAT' ;
SELECT entry_id, DATE_FORMAT(entry_authored_on , '%Y/%m') || '/' || entry_basename FROM mt_entry
```

# パーマリンクの年月は mt_entryテーブルのauthored_onの値である。

MT4以降は、authored_on(=公開日)の日付がパーマリンクになるようです。

(MT3以前はcreated_onの日付がパーマリンクになっていたようです)

http://blog.netandfield.com/shar/2009/02/movabletype.html
MacでのHaskell環境の構築

# Haskell環境構築
Haskellの勉強をしてみようと思い、とりあえず環境構築についてまとめてみました。

基本的に技術評論社の[関数プログラミング実践入門](<a href="http://www.amazon.co.jp/exec/obidos/ASIN/4774169269/mnatamz-22/ref=nosim/" name="amazletlink" target="_blank">関数プログラミング実践入門 ──簡潔で、正しいコードを書くために (WEB+DB PRESS plus)</a>
)に書かれている通りに進めました。

ちなみに関数プログラミングとか一切わからない状態で進めているので、言語解説的な内容は含みません。

## Haskell Platform

[Haskell Platform](https://www.haskell.org/platform/)を使うのが一般的らしいです。

GHC(The Glasgow Haskell Compiler)を中心に標準的なライブラリが同梱されているとのことです。GHCはMacはもちろんWindows, Unixでも動作するそうです。

![スクリーンショット 2015-06-24 23.57.01.png](https://qiita-image-store.s3.amazonaws.com/0/45525/2fb89920-b7f7-62ae-5d32-724c27936e25.png)

自分のプラットフォームに応じたパッケージをダウンロードします。

![スクリーンショット 2015-06-24 23.57.11.png](https://qiita-image-store.s3.amazonaws.com/0/45525/46dc49f7-6c58-ef4c-a182-64a71949d21c.png)


Macの場合はこんな感じのページ。

![スクリーンショット 2015-06-24 23.59.12.png](https://qiita-image-store.s3.amazonaws.com/0/45525/eaa543bd-d7ba-833e-7fff-1b41dcb99db5.png)

インストーラを使ってインストールすれば終わりです。

## 使ってみる

インストールするとインタープリタGHCiが使えるようになります。`ghci`と入力するとインタープリタが起動します。

```sh
$ ghci
GHCi, version 7.8.3: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> 
```

`:?`でヘルプが表示されます。

```zsh
Prelude> :?
```

お決まりの`Hello World`出力。

```zsh
Prelude> "Hello World"
"Hello World"
```

### 標準ライブラリから簡単なものを

[標準ライブラリがまとまっていた](https://wiki.haskell.org/10%E5%88%86%E3%81%A7%E5%AD%A6%E3%81%B6Haskell)ので、ちょっと触ってみます。

文字列は"++"で結合するみたいです。

```zsh
Prelude> "Hello"++" "++"Haskell"
"Hello Haskell"
```

関数の呼び出しは関数名のあとに半角スペース入れるみたいです。括弧とかはいらないんですね。

```zsh
Prelude> sqrt 2
1.4142135623730951
```

```zsh
Prelude> truncate 3.33333333
3
```

出力。

```zsh
Prelude> putStrLn "Hello"
Hello
```

複数I/Oアクションをつなげたい場合は`do{}`の中に`;`でつなげてやればOKみたいです。

```zsh
Prelude> do {putStr("42^2="); print(42^2)}
42^2=1764
```

## まとめ

以上、こんな感じで軽く使ってみました。Swift触っていてちょっと関数型言語に興味がわいたので触れてみようと思い、そのための環境構築でした。


## 追記(2015/06/25 9:10)

Homebrewが入っていれば簡単にインストールできるそうです。

```zsh
brew install ghc
```

こっちの方が簡単でいいですね。
Homebrewをホームディレクトリに置く

管理権限のないパソコンで、Homebrewを使う意味不明なことをしました。
そのときにしたことです。

やったことは簡単で、デフォルトのインストーラを使わず。
Githubからクローンして、PATHを通すだけです。

```bash
$ cd $HOME
$ git clone https://github.com/mxcl/homebrew.git
```

```bash:.bash_profile
$ export PATH=${HOME}/homebrew/bin:${PATH}
```

```bash
 $ brew install tree
 $ tree
```

どうでもよいですが、管理権限がないと /Library/ にアクセスして怒られます。

Homebrew/homebrew homebrew/Library/Homebrew/config.rb

を見ればわかりますが、

```bash
 $ mkdir -p ~/Library/Caches/Homebrew
```

こうすればよいです。
Linux Mint 17.1 Rebecca に Ruby環境など

## 内容
* Linux Mintにrbenvでruby環境を作成
* ディレクトリ名を英語に変更

### 1.必要なパッケージのインストール
``` bash
$ sudo apt-get update
$ sudo apt-get install -y g++ git emacs libffi-dev
$ sudo apt-get install -y zlib1g-dev
$ sudo apt-get install -y libsqlite3-dev libmysqlclient-dev libreadline-dev
$ sudo apt-get install -y libssl-dev
$ sudo apt-get install -y libxml2-dev
$ sudo apt-get install -y libxslt-dev
```

### 2.rbenvのインストール

``` bash
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(rbenv init -)"' >> ~/.bashrc
```

シェルの再起動

``` bash
$ exec -l $SHELL
```

rubyのバージョンを管理するためのプラグインをインストール

``` bash
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

### 3.Rubyのインストール

インストールするバージョンを確認

``` bash
$ rbenv install --list
```

現在の最新安定版は2.2.2なので

``` bash
$ rbenv install 2.2.2
$ rbenv rehash
$ rbenv global 2.2.2
$ ruby -v
```

### 4.ディレクトリ名の英語表示

次のコマンドを実行するとGUIが起動します

```bash
$ LANG=C xdg-user-dirs-gtk-update
```
* 変更前と変更後のディレクトリ名の一覧が表示
* [Update Names]ボタンを押す
【Linux】su: cannot set user id: Resource temporarily unavailableが出力された時の対処

業務でとあるユーザーにスイッチする際に、
   su: cannot set user id: Resource temporarily unavailable
が出力されました。
上記のメッセージが出力された時の対処メモになります。

# 対処内容
該当のユーザーは、/etc/limits.confで使用できるプロセス数の上限を設定していました。
プロンプト上には、使用しようとしたプロセスが「1025」なのに対し、設定では以下のようになっていました。

cat /etc/security/limits.conf
<表示結果>
soft     nproc          1024
hard     nproc          1024
～省略～

あら～使用できるソフトプロセス1024じゃん～と気付き、2倍の「2048」に変更したところ、
無事にスイッチできました。
尚、/etc/limits.confを修正してもOSの再起動は不要です。

以上。
久々の投稿になりました。
こういう自分のためのアウトプットは続けないとなと反省しておりまっす。
IEEE1588とは


イーサネット用の時刻同期プロトコルのこと。
PTP (Precision Time Protocol)がUDPまたは、MACフレーム上に乗ります。

# 同期精度
1us〜100us

# 仕組み

```math
delay = \frac{(t_2 - t_1) - (t_4 - t_3)}{2} 
```
NTPと同じだな。なんだ、そうなのか。
(変数は [期待を背負うIEEE 1588-2008](http://ednjapan.com/edn/articles/1102/01/news107.html)の図1を参照)

他、HW(PHY)でタイムスタンプをつけるルールや、その他、精度を得るための細かい仕様やプロファイル等もあるようだが、肝はNTPと同じ原理ということを理解した。
実装的には、統計的な工夫なんかも、もしかしたらあるのかもしれない。

# リンク

- [期待を背負うIEEE 1588-2008](http://ednjapan.com/edn/articles/1102/01/news107.html)
 
- [IEEE1588技術](http://www.hitachi-ul.co.jp/public/jp/solution/pdf/IEEE1588.pdf)

- [IEEE1588 PTPの他にも時刻同期には方法があるのでは？](https://www.shoshin.co.jp/c/endrun/1588ptp.html)

# 所感
特殊なアルゴリズムを期待していたが、残念。なかった。

おわり。
Preconnect - High Performance Web 2015

# preconnect

prebrowsing シリーズ、今回は preconnect.


TFO でも少し触れたが、これは dns-prefetch と似た感じで、
実際の TCP コネクションを先に貼っておくというもの。

HTTP に必要な DNS + 3WH
HTTPS に必要な DNS + 3WH + TLS

実装されてれば、これらを丸っと削減できる。これは結構でかい。


使いどころとしては、まだ実際の URL まではわからないが、ドメインレベルではわかっている場合に、先に繋いでおくのに利用できる。

もし接続するホストだけでなく URL までわかっているなら、 prefetch や prerender などを使うことができる。


## API

API は resouce-hints に定義されている。
Link タグか、  Link ヘッダに書く。

```
<link rel="preconnect" href="//example.com">
<link rel="preconnect" href="//example.com" crossorigin>
```


## link

- https://w3c.github.io/resource-hints/#preconnect

## see also

- prebrowsing
TCP Fast Open - High Performance Web 2015


# TCP Fast Open

これについては昔既にかなり詳しく書いた。見直したら結構詳しくてびっくりしたので、もうこっちに書くことあまり無かった。

[TCP Fast Open – Webを速くするためにGoogleがやっていること Make the Web Faster 4 –](https://html5experts.jp/jxck/3529/)


3 Way HandShake は TCP の接続確立時に必要になり、1.5 往復分の RTT がかかる。
ここをなんとかするための常套手段は、一度繋いだ接続を切らずに再利用することだったが、それは繋ぐ時の一番最初の部分の最適化にはならない。

Fast Open はこの最初の部分も最適化したいという欲求からなる。
しかし、 TFO Cookie がない、初めて接続するホストの最初の接続ではこれができない。
という意味では、 TFO Cookie を得るための preconnect という手段もあるのかもしれない。

TCP はカーネルスタックなので、カーネルのバージョンが古いと使えないが、これはちょっとづつ増えていくだろう。

対応してない場合はフォールバックできる、がフォールバック時に送り直すヘッダの部分がどのくらい無駄になるのかは気になっている。

素直に preconnect と、 HTTP2 による接続保持の方が良いのかもしれない。

# link

- [TCP Fast Open – Webを速くするためにGoogleがやっていること Make the Web Faster 4 –](https://html5experts.jp/jxck/3529/)


# see also

- TLS
【AWS】AWS SDK for Ruby V2でSQSを感じてみる

どうも、千葉です。
AWS SDK for Ruby v2で、SQSのキューを感じて、メッセージを出力するコードをメモしておきます。
V1から、かなり変わってるので注意が必要ですね。

アクセスキーの設定は、別途設定必要です。

```ruby:sqs_receive.rb
#!/usr/bin/ruby

require 'aws-sdk'
require 'json'

# キューの設定
queue_url = "https://sqs.ap-northeast-1.amazonaws.com/XXXXX/XXXXX"
sqs = Aws::SQS::Client.new(region: 'ap-northeast-1')

loop {
    # メッセージの取得
    msg = sqs.receive_message({
        queue_url: queue_url
    })

    unless msg.messages[0].nil?
        # メッセージの表示
        result = JSON.parse(msg.messages[0].body)
        puts result["Message"]

        # メッセージ削除
        resp = sqs.delete_message({
            queue_url: queue_url, # required
            receipt_handle: msg.messages[0].receipt_handle # required
       })
    end

    msg = nil
    sleep 10
}

```
DNS Prefetch - High Performance Web 2015

# DNS

HTTP のリクエストも実際は、サーバとの TCP 接続の確立が必要になる。
そのためには、ホストを DNS で名前解決しないといけない。

この DNS もチューニングが進んでいくと気になる存在になる。
特にクライアントが DNS を設定している場合は、それ自体を速くするみたいなことはしにくい。みんなが 8.8.8.8 にしているとも限らないし、Web アプリというレイヤで見ると手を入れにくい部分だった。


## DNS Prefetch

最近のブラウザは、例えばページにリンクが埋め込まれていれば、そのリンクのドメインを先に解決しておいてくれる。つまり、リンクをクリックした時点では、すでに名前解決が行われている状態にできる訳だ。

ドメインの解決は、パケットが飛ぶ訳だけどそのペイロードは Web の中で言えば結構小さい部類だし、結果は TTL の間はキャッシュされるのですぐ次のページで使われなかったとしても、そこまでデメリットにはならない。


これはデフォルトで行われているので、その恩恵に授かるわけだけど、一応 opt-out もできる。

クライアント側からすればブラウザのオプションなどでオフにする。
コンテンツ側からなら、ヘッダに `x-dns-prefetch-control` を送る。
もしくは、 meta タグに書く。

```
<meta http-equiv="x-dns-prefetch-control" content="off">
```

ちなみにデフォルトでは HTTPS のページでは DNS-Prefetch されない。


## DNS Prefetch Control

しかし、これはページに埋め込まれたものに対してしか行われない。

例えばログイン画面の次はメインページに遷移することが多いだろう。
そこでログイン画面にいる間に、ログイン画面では使わないがメインページで使うコンテンツのドメインなどを先に解決しておけると、次のページでのコンテンツ取得にも活かせる。

よく使う CDN などのドメインを投機的に解決しておくには、Link タグの API を使う。

Firefox と Chrome は少なくとも対応している模様。

```html
<link rel="dns-prefetch" href="http://example.com/">
```

DNS の解決が遅いことがボトルネックになるレベルまでチューニングできているなら、考えてみると良いと思う。

## link

- [Chrome DNS Prefetching](https://www.chromium.org/developers/design-documents/dns-prefetching)
- [DNS Prefetching for Firefox](http://bitsup.blogspot.jp/2008/11/dns-prefetching-for-firefox.html)
- [MDN DNS プリフェッチの制御](https://developer.mozilla.org/ja/docs/Controlling_DNS_prefetching)

- [なんかちょうど議論に上がってた](https://groups.google.com/a/chromium.org/forum/?utm_medium=email&utm_source=footer#!msg/net-dev/36-J9DVMlc0/anosX8Kh1scJ)


## see also

- prebrowsing
JavaScriptでiPhoneなのかAndroidなのかを判別する方法


#### [※Fixした内容をこちらに移植しました→ 「iOSかAndroidかの判定 UserAgentを利用する 【JavaScript】」 （2018/11/18）](https://tech-blog.s-yoshiki.com/entry/72/) 

#概要
javascriptでユーザがiPhone、iPad、iPod、Androidなのかを判別するコードの紹介

#ソース

ユーザーエージェントを取得して文字列の中に特定の端末名があるかを調べる方法です。

```js:.js

var osVer;
osVer = "iPhone";

/*
以下の文字列でユーザーエージェントを判別します
osVer = "iPhone";
osVer = "Android";
osVer = "iPod";
osVer = "iPad";
*/

if (navigator.userAgent.indexOf(osVer)>0){
    alert(osVer);
    func1();/*特定の端末だった時に呼ばれる関数*/      
} 
```

また以下のようにすればスマートフォンかpcかを判別できます。

```js:.js
var user="";
if ((navigator.userAgent.indexOf('iPhone') > 0 && navigator.userAgent.indexOf( 'iPad') == -1) || navigator.userAgent.indexOf('iPod') > 0 || navigator.userAgent.indexOf('Android') > 0) {
    func1();   
    user="phone";
    
} else {
    func2();
    user="pc";
    
}
```
i18nの設定をする　でハマりました。

今回のハマりポイントは、
config/locales/ar_ja.yml
での設定でした。以下、
ja:
　activerecord:
　　models:
　　　event: イベント
　　attributes:
　　　event:
　　　　name: 名前
　　　　place: 場所
　　　　start_time: 開始時間
　　　　end_time: 終了時間
　　　　content: 内容
と記述するとの事でしたが、そのまま打ち込んでも変更されませんでした。
いろいろ調べるた結果、タブや全角スペースなどがあると駄目らしいのですが、半角のスペースで整形してもできず・・・。
結局、いろいろいじって反響されたのが以下です。
ja:
　activerecord:
　　models:
　　　event: イベント
ja:
　　attributes:
　　　　event:
　　　　name: 名前
　　　　place: 場所
　　　　start_time: 開始時間
　　　　end_time: 終了時間
　　　　content: 内容

これでもちょっとインデントを崩すと反響されなくなったりして不安定なのですが、今一詳しくわからなかったというのが残念です。
参考意見等頂けますと助かります。
Install hive on Mac with Homebrew


# Prerequisite
MySQL 5.6.22 is already installed.

# Versions (2014/06/24)
* Hadoop 2.7.0
* Hive 1.1.1

were installed by Homebrew.


# Install Hive and Hadoop
```
$ brew update
$ brew install hive
```

# Configure enviromental variables
```
# ~/.bashrc
export HADOOP_HOME=/usr/local/Cellar/hadoop/2.7.0
export HIVE_HOME=/usr/local/Cellar/hive/1.1.1/libexec
```

# Download JDBC
Go to mysql page and download the latest jdbc (sign up is required)
http://dev.mysql.com/downloads/connector/j/

```
$ tar zxvf mysql-connector-java-5.1.35.tar.gz
$ sudo cp mysql-connector-java-5.1.35/mysql-connector-java-5.1.35-bin.jar /usr/local/Cellar/hive/1.1.1/libexec/lib/
```


# Setup MySQL database
```
$ mysql
mysql> CREATE DATABASE metastore;
mysql> USE metastore;
mysql> CREATE USER 'hiveuser'@'localhost' IDENTIFIED BY 'password';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,ALTER,CREATE ON metastore.* TO 'hiveuser'@'localhost';
```

# Copy hive-default-xml to hive-site.xml
```
$ cd /usr/local/Cellar/hive/1.1.1/libexec/conf
$ cp hive-default.xml.template hive-site.xml
```

# Edit following lines in hive-site.xml
```
<property>
  <name>javax.jdo.option.ConnectionURL</name>
  <value>jdbc:mysql://localhost/metastore</value>
</property>
<property>
  <name>javax.jdo.option.ConnectionDriverName</name>
  <value>com.mysql.jdbc.Driver</value>
</property>
<property>
  <name>javax.jdo.option.ConnectionUserName</name>
  <value>hiveuser</value>
</property>
<property>
  <name>javax.jdo.option.ConnectionPassword</name>
  <value>password</value>
</property>
<property>
  <name>datanucleus.fixedDatastore</name>
  <value>false</value>
</property>
<property>
    <name>hive.exec.local.scratchdir</name>
    <value>/tmp/hive</value>
    <description>Local scratch space for Hive jobs</description>
</property>
<property>
    <name>hive.downloaded.resources.dir</name>
    <value>/tmp/hive</value>
    <description>Temporary local directory for added resources in the remote file system.</description>
</property>
<property>
    <name>hive.querylog.location</name>
    <value>/tmp/hive</value>
    <description>Location of Hive run time structured log file</description>
</property>
```

# Run hive
```
$hive
hive > show tables;
```


refs
https://noobergeek.wordpress.com/2013/11/09/simplest-way-to-install-and-configure-hive-for-mac-osx-lion/
【翻訳】Erlang/OTP 18.0 has been released #Erlang

翻訳元：http://www.erlang.org/news/88

# Erlang/OTP 18.0がリリースされました
2015/6/24 Henrikによって書かれました

Erlang/OTP 18.0は新機能とかなりの数の（特性の）改善、ならびにいくつかの非互換性を持つ新しいメジャーリリースです。
非機能だがこのリリースの大きな変更点はAPL 2.0（Apache Public License）にライセンスが変わったことである。

## 主な変更点
* Erlang/OTP 18.0から始めるとAPL 2.0でリリースされます（Apache Public License）
* erts
	* 時間機能が拡張されました。これは時間のための新しいAPI、及び、システム時刻を変更する時の振る舞いを変化する *タイムワープ(time warp)* モードが含まれます。 `erlang:now/0` を使っている古いAPIの代わりに新しいAPIを使うことを強くお勧めする。 `erlang:now/0` はスケーラビリティの面でボトルネックがあるので、非推奨となっています。詳細についてはERTSユーザーズガイドの時間と時間補正の章を参照してください。
		* リンク
			* http://www.erlang.org/doc/apps/erts/time_correction.html
	* APIの変更とタイムワープモードによって、時間管理に関するスケーラビリティとパフォーマンスの改善がたくさん行われています。
		* 例
			* スケジューラ特定のタイマーホイール
			* スケジューラ特定のBIFタイマ管理
			* それをサポートするOS:es上の単調時間とシステム時間の平行検索
	* 以前に導入された"eager check I/O"機能がデフォルトで有効になっています。
* erts/compiler
	* mapsの拡張サポート。大きなmapsはそれらをより効率的にする内部表現HAMT（Hash Array Mapped Trie）を新しく使っています。今回、mapのkeyとして変数のサポートもあります。
* dialyzer
	* `-dialyzer（）` 属性は機能や警告のオプションを指定することによってモジュール内で警告を抑制するために使用することができます。また、モジュールに警告を要求するために使用することができます。
* ssl
	* SSL-3.0のデフォルトサポートを削除し、POODLE脆弱性のためにTLS-1.0用のパディングチェックを追加しました。
	* 彼らはあまりにも弱く検討されているように、RC4暗号スイートのデフォルトサポートを削除します。
* stdlib
	* supervisorのflagsとchild specsでmapが使えるようになりました。
	* etsの新機能
		* take/2
			* ets:delete/2 と同じ働きをするが削除したオブジェクト（複数可）も返します。
		* ets:update_counter/4 引数としてデフォルトオブジェクトを使います。
		
あなたは、より詳細な情報をリリースノートで調べることができます。

http://www.erlang.org/download/otp_src_18.0.readme

## このOTPのリリースと貴方自身のコードをビルドする時に重要な情報

`erlang:now` は "warnings as errors" を使った場合、ビルドが停止する可能性があるので推奨されません。
あなたがこのような環境変数を設定することにより、非推奨の機能のための警告を有効にすることができを通じてビルドを聞かせするには：
次のような環境変数を設定することにより、非推奨の機能のための警告を有効にしてビルドをすることができる。
```
export ERL_COMPILER_OPTIONS=nowarn_deprecated_function
```
 
github.com の公式のErlangリポジトリでソースコードを見ることができます。

Gitのタグ OTP-18.0

https://github.com/erlang/otp/tree/OTP-18.0

また、次のURLでは、オンラインドキュメントを読むことができます。
（リリースノートは、ドキュメント内で更新されていないリリースノートのために前述したものを参照してください、しかし新しい機能はあります。）

http://www.erlang.org/doc/

また、パッチ、提案、バグレポートを送信してくれた方々に感謝しています。

EricssonのErlang/OTPチームより
MacにGitLabの開発環境を構築する(2015年6月版)

久しぶりにGitLabへのcontributeを再開しようというモチベーションが高まったので、取り急ぎGitLabの開発環境を構築する方法を調べました。

以前はvagrantで開発環境が提供されていましたが、VMだと遅いという問題があるので、現在は[GitLab Development Kit](https://gitlab.com/gitlab-org/gitlab-development-kit)を使用してネイティブに環境を構築することが推奨されているようです。

[GitLab Development Kit](https://gitlab.com/gitlab-org/gitlab-development-kit)のドキュメントの通りにすれば構築出来るかと思いますが、若干躓いたので作業ログを残しておきます。

### 環境

- OS: OS X 10.10.3
- Ruby: 2.1.6(rbenv)

### 構築手順

#### rubyをインストール

まずは、[この辺](http://mawatari.jp/archives/install-rbenv-by-homebrew)を参考にrbenvをインストールします。続いて、rbenvでruby 2.1.6をインストールする

```
$ rbenv install 2.1.6
$ rbenv global 2.1.6
$ gem install bundler
$ rbenv rehash
``` 

#### 必要なパッケージをインストール

次に、必要なパッケージをbrewでインストールし、必要な設定を行います。

```
$ brew tap homebrew/dupes
$ brew tap homebrew/versions
$ brew install git redis postgresql phantomjs198 libxml2 libxslt libiconv icu4c pkg-config cmake nodejs
$ brew link --force libxml2 libxslt libiconv phantomjs198
$ bundle config build.nokogiri --use-system-libraries --with-iconv-dir="$(brew --prefix libiconv)"
```

#### GitLab Development Kitのセットアップ

GitLab Development Kitリポジトリをクローンしてきて、セットアップ作業を行います。

```
$ git clone https://gitlab.com/gitlab-org/gitlab-development-kit.git
$ cd gitlab-develop-kit
$ make
```

`Makefile`により、リポジトリのクローンとgemのインストールと基本的な初期設定が実行されます。

### インストール後の作業

rootディレクトリで以下のコマンドを実行し、RedisとPostgreSQLを開始します。

```
$ bundle exec foreman start
```

上記のコマンドを実行したまま、別のセッションウィンドウを開いて以下のコマンドを実行し、GitLabのrailsアプリケーションを起動します。

```
$ cd gitlab && bundle exec rake db:create dev:setup
bundle exec foreman start
```

この状態で http://localhost:3000 をブラウザで開くと、開発環境のログイン画面が表示されます。開発用のアカウント`root`、パスワード`5iveL!fe`を使用して、ログインできることを確認して下さい。

もう少し手間をかけるとGitLab CIの開発環境も一緒に構築できますが、とりあえず今回はGitLabの開発環境の構築までにしておきます。

### 関連リンク

- [GitLab 7.12がアツい件](http://hiroponz.hateblo.jp/entry/2015/06/23/230827)
真ん中が透明のシェイプを使いやすくするTips

#真ん中が透明のシェイプを使いやすくするTips

よく、エビデンスやポンチ図など作成する際に以下のようなシェイプを強調用に使いますね。
その際にちょっとひと手間を加えると便利になります。
![shape.png](https://qiita-image-store.s3.amazonaws.com/0/69810/3034e678-6095-1d93-e9b9-f98a6b11f6d6.png)

この手の枠って移動させたりするとき、うまくつかめなくてイライラすることがあります。
真ん中が透明なので、枠をつかむ必要があるためです。

実は、中心が透明であっても、「ある設定」をするとふつうに図形の中心を選択することが可能です。
その設定とは「図形の書式設定で」以下の２点

* 塗りつぶしにする
* 透明度を100%にする 

![paintpng.png](https://qiita-image-store.s3.amazonaws.com/0/69810/38c70be2-7595-7d3a-1271-572bcf7299a8.png)

と、すると透明の中心部分を選択できるようになります。
目からウロコですね（笑
やってみてください。

## RelaxTools Addin の「強調用シェイプ」

なお、拙作、RelaxTools Addin で「強調用シェイプ」を出す機能があります。
もちろん、塗りつぶし＋透明度100%の書式のシェイプですので、使ってみてね。(Excelのみ)
IntelliJ IDEAでコーディング規約を反映するショートカット

PSR-2などのコーディング規約をファイル全体に反映させるショートカットです。環境はMacです。

```bash:コーディング規約を反映
option + command + l
```
コーディング規約が反映されコードが整形されます。便利(☝ ՞ਊ ՞)

# 参考
http://samuraism.com/products/jetbrains/intellij-idea/quickstart/codestyle-and-formatting
GoのBuild Constraintsに関するメモ

GoのBuild Constraintsを使おうとしてハマったのでメモ。

# Build Constraintsの後には空行が必須

Goでは、同一ディレクトリ以下のソースコードは全てビルド対象になります。これに対し「Build Constraints」というコメント的なものを使うことで、環境ごとにビルド対象に含めたり外したりといったことができます。

参照：[Package build - Build Constraints](http://golang.org/pkg/go/build/#hdr-Build_Constraints)

これによれば、コード先頭に次のように書けば、そのソースコードはビルド対象から外れそうに読めます。

```go
// +build ignore
```

しかし、次のように書いたソースコードは何事もなかったかのようにリンクされます。

```go
// +build ignore
package main // ダメ
```

実は、Build Constraintsの後には必ず空行を入れる必要があるのです。

```go
// +build ignore

package main // バッチリ
```

これはよく見るとドキュメントにも書いてあります。

> To distinguish build constraints from package documentation, a series of build constraints must be followed by a blank line.

## Build Constraintsの詳細

以下のものがBuild Constraintsとして記述できます。（[build/build.go](https://golang.org/src/go/build/build.go)のコメントから引用）

- OS名（$GOOSの値、`linux`, `windows`, `darwin`など）
- アーキテクチャ名（$GOARCHの値、`arm`, `386`, `amd64`など）
- `cgo` (cgoが有効なとき)
- `!cgo` (cgoが無効なとき)
- コンパイラ名（`go`, `gccgo`）
- !コンパイラ名
- tag (`ctxt.BuildTags` か `ctxt.ReleaseTags` に含まれるタグ)
- !tag (`ctxt.BuildTags` と `ctxt.ReleaseTags` に含まれないタグ)
- 上記のカンマ区切りリスト（AND条件）

ただし、OS名に`linux`を指定した場合は例外的にAndroidも含まれます。Androidを除くLinuxを指定したい場合は`linux,!android`とする必要があります。

`ReleaseTags`はGo 1.4だと次のような値になっています。これを使えばGoの特定バージョン以降・以前という表現ができます。

```go
		c.ReleaseTags = []string{"go1.1", "go1.2", "go1.3", "go1.4"}
```

## ファイル名によるBuild Constraints

ところで、このBuild Constraintsの一部はファイル名で表現することもできます。OS名とアーキテクチャ名に限り、次のようなファイル名で記述可能です。

- foo_[OS名].go
- foo_[アーキテクチャ名].go
- foo_[OS名]_[アーキテクチャ名].go

これにマッチしないファイルはビルド対象になりません。これを逆手にとって、`foo.go`をビルド対象から外したいときに`_foo.go`にリネームするというテクニックが使えます。もちろん、`foo_ignore.go`などとしてもよいでしょう。

このように単純なBuild Constraintsについてはファイル名で指定するのが良いように思います。同じことをするにしても、コメントによるBuild Constraintsの場合は全ファイルの先頭を眺めないと挙動がわからないため、保守性が下がるのではないでしょうか。ファイル名で実現できる場合はファイル名で実現し、複雑なBuild Constraintsに限りコメントで実現すべき、というのが筆者の個人的な意見になります。

## 文句

空行必須とか何なの。初見殺しにもほどがあるでしょ…。

コメントやファイル名でビルドの挙動を変えること自体、あまり良い選択だとは思えない。不親切というかやっつけというか。文句言いつつ慣れたころに仕様変更されそうで怖い。
引数を左から右へ受け流す

プログラムを書いていると、状況によっては、「もらった引数を使って別な関数・メソッドに処理を丸投げする」必要が出てくる場合があります。ここでは、そのような例を示してみます。

# JavaScript…配列のようで配列でないもの
JavaScriptの関数では、宣言した仮引数とは別に、`arguments`という、すべての引数を詰め込んだ「配列のようなオブジェクト」[^1]が渡されているので、これを使って別な関数を`apply`することで、すべての引数をそのまま渡せます（`apply`の引数は「配列のようなオブジェクト」で大丈夫です）。

なお、`apply`の第1引数は呼び出し先で`this`になるオブジェクトです。ただの関数なら気にしなくて構いませんが、メソッドを呼ぶ際はきちんと設定しましょう。

```js:apply.js

//foo()からbar()をそのまま呼ぶ

function foo(hoge, piyo){
  bar.apply(this, arguments);
}
```

#Ruby…必殺、splat
Rubyの場合、メソッドの唯一の引数を`*args`のように`*`を前置して宣言しておくと、それがすべての引数の入った配列になります。逆に、引数を渡す段階で`*`を前置させると、その配列の中身を引数に並べてくれます。

```rb:splat.rb
def foo(*args)
  bar(*args)
end
```
## 構文解析上の問題について
上の例では`bar(*args)`とかっこが付いています。かっこを外した場合、`bar`、`*`、`args`という3つの要素が並ぶことになりますが、それは`bar`と`args`の掛け算、と取れなくもない状況です。ここでは、`bar *args`のように、`*`の**前だけ**空白を入れた場合は、メソッド呼び出しをsplatしているものと解釈され、それ以外の`bar*args`や`bar * args`は掛け算として解釈されます[^2]。1つ目の引数をsplatする場合には、かっこを付けたほうがいいかもしれません（かっこありなら`bar(* args)`でも問題ありません）。

## ブロックは…？
まとめて`*args`で受け取っても、ブロックは取得できません。`&block`としてブロックを引数として受け取って、別なメソッドを呼ぶ際にも`&block`としてブロックを渡す形にしましょう。

```rb:block.rb
def foo(*args, &block)
  bar(*args, &block)
end
```

なお、`&block`としたメソッドにブロックが渡されなかった場合、この変数は`nil`となりますが、`&nil`とすると「ブロックを渡さない」という意味になるので、`block_given?`によって条件分岐する必要もなく、ブロックがあってもなくてもそのまま対応可能です。

[^1]: 数値プロパティと`length`を持つオブジェクト。JavaScriptではよく使われる術語です。
[^2]: `+`や`-`などでも、`a +b`は`a(+b)`のようなメソッド呼び出しと解釈されるので注意が必要です。
IPv6 を切る


今更。

## mac lion 以降

```
$ networksetup -listnetworkserviceorder 
```
でサービス名確認

```
$ sudo networksetup -setv6off Ethernet
```

lion より前は普通に、コントロールパネルのネットワークあたりで切る事が出来る。

## win
windows 7 で

```
コントロールパネル => ネットワークの状態とタスクの表示
=> 接続: の右のリンク => プロパティ => インターネットプロトコルバージョン6 のチェックを外す
=> OK
```


```
コントロールパネル => ネットワークの状態とタスクの表示
=> 接続: の右のリンク => プロパティ => 構成 => 詳細設定 => IPv6 の項目を片っ端から off
=> OK
```

## centos 6

```
# cp sysctl.conf sysctl.conf.bak_20150611
# diff ./sysctl.conf*              
41,44d40                                 
<                                        
< net.ipv6.conf.all.disable_ipv6 = 1     
< net.ipv6.conf.default.disable_ipv6 = 1 
<                                        
# sysctl -p
# /etc/rc.d/init.d/network restart
```
Linuxでユーザーをグループに追加する

いくつか方法があってすぐ忘れてしまうので、まとめておきます。いずれの方法でも、コマンド実行後に新しくログインした時点で有効になります。

### usermod

```
usermod -aG GROUPS USER
```

`-a`を忘れるとグループに追加されるのではなく、所属するセカンダリグループが置き換えられてしまいます。`-a`を付けずに紹介しているサイトもあるので注意しましょう。`GROUPS`は`,`で区切って複数指定できます。

基本的にはこれを使うのが良いでしょう。

### gpasswd

```
gpasswd -a USER GROUP
```

間違えてグループが置き換えられることはないですが、コマンドが覚えづらいのが難点です。

### adduser

```
adduser USER GROUP
```

英語としては一番わかりやすいですが、この引数の指定方法が使えるのはDebian系だけです。

### 参考

* [usermod -G でユーザに新しいサブグループを追加してはいけない - 続・夕陽のプログラマ](http://d.hatena.ne.jp/thegoodbadugly/20130116/1358316032)
* [Linuxユーザーをグループに追加する - それマグで！](http://takuya-1st.hatenablog.jp/entry/20130102/1357112844)
* [Man page of USERMOD](http://linuxjm.osdn.jp/html/shadow/man8/usermod.8.html)
* [Man page of GPASSWD](http://linuxjm.osdn.jp/html/shadow/man1/gpasswd.1.html)
* [Linux 2.6 - man page for adduser (linux section 8) - Unix & Linux Commands](http://www.unix.com/man-page/linux/8/ADDUSER/)
改行コードの視覚的確認


同僚が改行コードの違いを認識してくれない。

## od -c 

```
$ od -c foo.txt                   
0000000   f   o   o  \r  \n   b   a   r  \r  \n
0000012
```

これとか、
## color_echo


```
$ color_echo -p '/.\r\n/' -b red < foo.txt
```
![スクリーンショット 2015-06-24 17.27.53.png](https://qiita-image-store.s3.amazonaws.com/0/64084/68e399af-bcb0-a198-6d77-88482f0c72a9.png "スクリーンショット 2015-06-24 17.27.53.png")

これ、あたりを教えようかと考えてたら、、、

## cat -v

```
$ cat -v foo.txt
foo^M
bar^M
```

知らんかった、、、
forループとforEach内でreturnした時の挙動の違い

#forループ内とforEach内では挙動が違う
あるeventの中に、自分が参加者に入っているか確認するプログラム。
参加者に自分がいれば```true```、いなければ```false```を返したい。

for文と同じ感覚てforEachを使ってしまい、returnが期待した値にならずはまった。

#実際のコードでの比較

##for文の場合

```js:for文
for (i = 0; i < participants.length; i++) {
        if(participants[i].id == myID) {
          return true;
        }
    }
return false;
```
participants[i].id == myIDがtrueになったとき、for文もメソッドも抜けてtrueがreturnされる。

##forEach文の場合
```js:forEach
participants.forEach(function (participant) {
        if(participant.id == myID) {
          return true;
        }
})
return false;
```
forEachの場合、participantsの***全ての要素に対して処理を実行***する。
***処理の中でreturnしても、forEach文を抜けることは出来ない。***

participant.id == myIDがtrueになっても、次の要素に対する処理に移る。
そして最終的にforEachを抜けて、***必ず undefined がreturnされる***。
メモ：Raspberry Piのボードリビジョンを判別する方法

# 判別方法

http://elinux.org/RPi_HardwareHistory

/proc/cpuinfoを読めばいいらしい。

自前のRaspberry Pi Model B(Kernel 4.4系列)の場合。

```
Hardware        : BCM2708
Revision        : 000e
```

Q4 2012 (Mfg by Sony)版らしい。

もう一つ自前のRaspberry Pi 2 Model B(Kernel 4.4系列)の場合。

```
Hardware        : BCM2709
Revision        : a21041
```

こちらはQ1 2015版。

# 仕組み

cpuinfoの表示は、kernelソースの arch/arm/kernel/setup.c の中で行われていて、変数 system_rev がEXPORT_SYMBOLされている。

```setup.c
unsigned int system_rev;
EXPORT_SYMBOL(system_rev);

/* (中略) */

static int c_show(struct seq_file *m, void *v)
{
        /* (中略) */
        seq_printf(m, "Hardware\t: %s\n", machine_name);
        seq_printf(m, "Revision\t: %04x\n", system_rev);
        seq_printf(m, "Serial\t\t: %08x%08x\n",
                   system_serial_high, system_serial_low);

        return 0;
}
```

## Kernel 4.4系列の場合の仕組み

arch/arm/mach-bcm2708/bcm2708.c 、および arch/arm/mach-bcm2709/bcm2709.c で、基板のリビジョンをモジュールパラメータとして受け取っている。

```bcm2708.c
void __init bcm2708_init(void)
{
        /* (中略) */
        system_rev = boardrev;
        /* (中略) */
}
/* (中略) */
module_param(boardrev, uint, 0644);
```

実際には、モジュールパラメータがkernelのコマンドラインから渡せる仕組みを利用して、ブート時にブートローダから、kernelのコマンドラインのパラメータとして渡されている。

```
$ cat /proc/cmdline
dma.dmachans=0x7f35 bcm2708_fb.fbwidth=656 bcm2708_fb.fbheight=416 bcm2708.boardrev=0xe bcm2708.serial=0xNNNNNNNN smsc95xx.macaddr=NN:NN:NN:NN:NN:NN bcm2708_fb.fbswap=1 sdhci-bcm2708.emmc_clock_freq=250000000 vc_mem.mem_base=0x1ec00000 vc_mem.mem_size=0x20000000  dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
```

シリアル番号や、MACアドレスもブートローダから引き渡されているっぽい。
ブートローダに、NVRAMからの読出し処理が含まれているのだろう。多分。

## Kernel 4.9系列の場合の仕組み

arch/arm/mach-bcm/board_bcm2835.c で、基板のリビジョンをDevice Treeから読み取っている。

```board_bcm2835.c
static void __init bcm2835_init(void)
{
        /* (中略) */
	if (!of_property_read_u32(np, "linux,revision", &val))
		system_rev = val;
	if (!of_property_read_u64(np, "linux,serial", &val64))
		system_serial_low = val64;
}
```

なので、/proc/devicetree/以下から読めなくもない。

```
$ cd /proc/device-tree/system
$ ls -la
合計 0
drwxr-xr-x  2 root root 0  2月 25 12:48 .
drwxr-xr-x 14 root root 0  2月 25 12:48 ..
-r--r--r--  1 root root 4  2月 25 12:57 linux,revision
-r--r--r--  1 root root 8  2月 25 12:57 linux,serial
-r--r--r--  1 root root 7  2月 25 12:57 name
$ od -t x linux,revision
0000000 0e000000
0000004
```


ブートローダに、NVRAMからの読出し処理が含まれているのだろう。多分。
SPREE ＋ Devise でアプリケーションを立ち上げるまで

1)Gemfileにspree関係のgemを追加

```Gemfile
#今回はmysqlを利用する
gem 'mysql2'

#spree
gem 'spree', github: 'spree/spree', branch: '3-0-stable'
gem 'spree_auth_devise', github: 'spree/spree_auth_devise', branch: '3-0-stable'
```

2)$ bundle install --path vender/bundle
3)rails g devise:install
4)database.ymlにDatabase設定を記載

```database.yml
development:
  adapter: mysql2
  database: mystore
  username: root
  password:
  encoding: utf8

test:
  adapter: mysql2
  database: mystore_test
  username: root
  password:
  encoding: utf8
```

5)config/initializers/devise.rbを修正

```config/initializers/devise.rb
  # The secret key used by Devise. Devise uses this key to generate
  # random tokens. Changing this key will render invalid all existing
  # confirmation, reset password and unlock tokens in the database.
  config.secret_key = 'シークレットキーの値が入っています'
.
.
中略
.
.
  # ==> Mailer Configuration
  # Configure the e-mail address which will be shown in Devise::Mailer,
  # note that it will be overwritten if you use your own mailer class
  # with default "from" parameter.
  # メーラー設定
  # Devise::Mailerのメールアドレスを設定します。
  # もし、デフォルトパラメータの設定されためmailer classを利用するなら、
  # 上書きされることに注意して下さい。
  config.mailer_sender = 'no-reply@sample.com'
.
.
中略
.
.
  # ==> Configuration for :confirmable
  # A period that the user is allowed to access the website even without
  # confirming their account. For instance, if set to 2.days, the user will be
  # able to access the website for two days without confirming their account,
  # access will be blocked just in the third day. Default is 0.days, meaning
  # the user cannot access the website without confirming their account.
  # 確認設定
  # ある期間ユーザーはアカウントを確認せずにサイトにアクセスすることが出来ます。
  # ~ 以下略 ~ (許可される期間が2日とか3週間とか何とか...)
  config.allow_unconfirmed_access_for = nil
.
.
中略
.
.
  # Email regex used to validate email formats. It simply asserts that
  # one (and only one) @ exists in the given string. This is mainly
  # to give user feedback and not to assert the e-mail validity.
  # config.email_regexp = /\A[^@]+@[^@]+\z/
  # メールアドレスのバリデーション
  config.email_regexp = /\A[[^@\s]&&[ -~｡-ﾟ^,]&&[^,]]+@([[^@\s]&&[ -~｡-ﾟ]&&[^,]]+\.)+[[^@\s]&&[ -~｡-ﾟ]&&[^,]]+\z/
.
.
中略
.
.
  # Time interval you can reset your password with a reset password key.
  # Don't put a too small interval or your users won't have the time to
  # change their passwords.
  # パスワードをリセットするためのキーでリセット出来る期間について。
  config.reset_password_within = 2.weeks
.
.
中略
.
.
  # ==> Scopes configuration
  # Turn scoped views on. Before rendering "sessions/new", it will first check for
  # "users/sessions/new". It's turned off by default because it's slower if you
  # are using only default views.
  # スコープの設定
  # ログインしてないと接続できるのはサインアップだけとか何とか...
  config.scoped_views = false

```

6)rails g spree:install
対話形式で設定
Azure仮想マシンは「仮想ネットワークに配置」すべし

# Azure仮想マシンの配置場所
クラシックポータル (https://manage.windowsazure.com) で仮想マシンを作成する場合、その配置場所は以下の3種類から選択できます。

* リージョン
* アフィニティグループ
* 仮想ネットワーク

結論から言って、**「仮想ネットワーク」に配置すべきです。**他の二つは忘れてください。以上。

と、これだけで終わるのも何なので、少し解説します。

# Azure仮想マシンの構成要素をおさらい
配置場所の解説の前に、少しAzure仮想マシンの構成要素についておさらいを。
まず、どこに配置しようとも現在のAzure仮想マシンは以下のような構造を持ちます。

* 受け皿としての「クラウドサービス」
    * ここにDNS名（~.cloudapp.net) が付きます。
* 仮想マシン本体
    * 仮想マシンのNICに内部IPアドレス (DIP) が付きます。インターネットからはDIPに到達できません。
* 負荷分散兼NATサービス
    * ここにパブリック仮想IPアドレス (VIP) が付きます。前述のDNS名に対応するグローバルIPアドレスです。

よくこんな図で説明したりします↓
![Azure仮想マシンの構成要素](http://sasaqiita.blob.core.windows.net/img/20150624-fig01.png)
# そして配置方式の解説
さて、前述した3種の選択肢ですが、大別すると「仮想ネットワークとそれ以外」に分けられます。
こんな感じですね↓
![配置場所の選択肢](http://sasaqiita.blob.core.windows.net/img/20150624-fig02.png)

# 仮想ネットワーク以外(リージョン・アフィニティグループ)への配置
この場合、いろいろ融通が利きません。

* 別クラウドサービスの仮想マシンとは内部ネットワークがつながっておらず、DIPを指定しての通信はできない。
* DIPはAzure側で適当にアサインされてしまう。(ユーザーによる指定不可)
* 仮想マシンを起動するたびにDIPは変化しうる。

「とりあえず試しに一台作ってみる」ぐらいならば良いのですが、複数のサーバーを配置してシステムを構築するような用途には向きません。

# 仮想ネットワーク
さて、今日の主役です。この「仮想ネットワーク」とは、簡単に言えば、「クラウド上のSDN」です。Azureデータセンターの物理的なネットワーク配置から独立した、仮想的なネットワーク環境をユーザーごとにいくつでも作成することができます。
つまり、

* ユーザー固有のIPv4アドレス空間を定義できて  
    * 例) "192.168.0.0/16"
* その中に任意の数のサブネットを作ることが可能  
    * 例) Subnet-1: 192.168.1.0/24
    * 例) Subnet-2: 192.168.2.0/24

というわけです。
なお、アドレスはプライベートIPアドレスだけではなく、グローバルIPアドレスを付与することも可能です。クラスAやBのアドレスをどーんと持っているよ、社内のサーバーは全部グローバルIPだぜ、というアドレスリッチなお客様は、そのアドレスをAzureの仮想ネットワークにも割り当てることができます。

また、仮想ネットワーク(のサブネット)に仮想マシンを配置すると、そのサブネットのアドレスが仮想マシンのDIPになるわけですが、どのアドレスを仮想マシンに付与するか、というのも指定できますし、指定したアドレスは仮想マシンの再起動後も変わりません。

さらに、アドレス空間を定義する以外にも、仮想ネットワークには重要な機能があります。それが、

* VPN機能でオンプレミスネットワークと接続したり
* ExpressRouteによる閉域網接続も可能

というところです。これらを活用することで、Azureの仮想ネットワークが社内ネットワークの一部であるかのように扱えます。オンプレとクラウドが地続きになるわけですね。

というわけで、Azure仮想マシン(IaaS)で本格的にシステムを構築するならば「仮想ネットワーク」への配置は必須です。実際、新ポータル (https://portal.azure.com) では、仮想マシンを仮想ネットワーク以外に配置することができません！

そして、ここ重要なのですが、仮想マシンの仮想ネットワークへの配置は  

**「仮想マシンの作成時にのみ」**

行えます。一旦仮想マシンを仮想ネットワーク外に作ってしまうと、クリック一つで仮想ネットワークへ移動というわけにはいきませんから、  

**「仮想マシンを作る前に、まずは仮想ネットワークを作っておく」**

ことが重要です。

最後に、仮想ネットワーク上でのシステム構成イメージを載せておきますね。SharePoint ServerのようなWebシステムをAzureに構築した感じだと思ってください。
![システム構成](http://sasaqiita.blob.core.windows.net/img/20150624-fig03.png)

このあたりの内容は、SlideShareに載せてあるので、よろしければご覧ください。
[Microsoft Azure仮想マシンと仮想ネットワーク](http://www.slideshare.net/SaSakiKuninobu/azuree4bbaee683b3e3839-ee382b7e383b3e381a8e4bbaee683b3e3838de38383e38388e383afe383bce382af)

では！
@ksasakims
AWSでnginx+golangが動く環境を作る

#1. nginxの設定
・EC2インスタンス立ち上げ（Amazon linuxなど）
・立ち上げたインスタンスにSSHログイン
・yumのアップデート

```
$ sudo yum update
```
・パッケージからnginxをインストール

```
$ sudo yum install -y nginx
```

・インストール後、自動起動の設定と、nginxの起動

```
$ sudo chkconfig nginx on
$ sudo service nginx start
```

・EC2インスタンスにアクセスして起動確認
![nginx-01-960x490.png](https://qiita-image-store.s3.amazonaws.com/0/44837/174cb0de-72d0-8d99-7f5e-4e96f4fadb1d.png)
このような画面が出ていればOKです。

#2. goの設定
・goのインストール

```
$ sudo yum install -y golang
```

go versionが動けば問題ないです。

```
$ go version
go version go1.4.2 linux/amd64
```

・サーバー上でgoが動くように設定（confを変更）

```
$ vi /etc/nginx/nginx.conf
```

下記部分(40行目辺り)を変更

```nginx.conf
server {
    listen       80;
    server_name  hostname;

    location / {
        fastcgi_pass  127.0.0.1:9000;
        include       fastcgi_params;
    }
}
```

・nginxの設定再読み込み

```
$ sudo /etc/init.d/nginx reload
```

Reloading nginx:[  OK  ]と出ればOKです。


#3. テストコードを動かしてみる
・index.goを適当な場所に配置（今回は/var/app/currentに配置）。

```
$ mkdir /var/app/current/
$ vi /var/app/current/index.go
```

```index.go
package main

import (
    "fmt"
    "net"
    "net/http"
    "net/http/fcgi"
)

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello, World!")
}

func main() {
    l, err := net.Listen("tcp", "127.0.0.1:9000")
    if err != nil {
        return
    }
    http.HandleFunc("/", handler)
    fcgi.Serve(l, nil)
}
```
tcpソケットでListenするだけのテストコードです。
ポート番号などNginxで設定したものとあわせてください。

・Webアプリケーションを実行する

```
$ go run /var/app/current/index.go
```

もしくは、バックエンドで動かしておく場合は

```
$ cd /var/app/current/
$ go build index.go
$ ./index &
```

実行コマンドの後に & をつけることでバックグラウンドで実行されるようになります。

・EC2インスタンスにアクセスしてみる
「Hello, World!」と表示されれば完了です！



#参考・その他
「Nginx + Golang でWebアプリケーション開発を試してみた」
http://umegusa.hatenablog.jp/entry/2015/02/22/025832
「EC2（Amazon Linux）に Nginx をインストールしてBasic認証する」
http://dev.classmethod.jp/etc/amazon_linux_nginx_basic_auth/
「Go言語でhttpサーバーを立ち上げてHello Worldをする」
http://qiita.com/taizo/items/bf1ec35a65ad5f608d45

beanstalkにもgo向けに事前設定されたDockerコンテナがあるのでそちらも便利です。
http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/create_deploy_go.html
[Objective-C] UIWebViewでのコンテンツフィルタ

UIWebViewで読み込みたくないjavascriptとかあった場合に、該当のscriptタグを消してしまうのもいいんですが、フィルタリングする方法でやてみました。

Androidでは簡単にできるっぽいんですが、iOSだとキャッシュを見に来た時にコンテンツのないレスポンスを返すことでフィルタリングができる。

```objc:FilteredWebCache.m
#import "FilteredWebCache.h"

@implementation FilteredWebCache

// 特定のドメインかをチェック
- (BOOL)isBlockURL:(NSURL *)url
{
    __block NSString *requestURL = [url absoluteString];
    __block BOOL isBlockURL = false;
    
    // フィルタリングするドメイン
    NSArray *blockURLs = @[@"example.com", @"example.jp"];
    
    [blockURLs enumerateObjectsUsingBlock:^(NSString *blockURL, NSUInteger idx, BOOL *stop){
        if([requestURL rangeOfString:blockURL].location != NSNotFound){
            isBlockURL = true;
            *stop = YES;
        }
    }];
    
    return isBlockURL;
}

// キャッシュの有無を確認する
// キャッシュがない場合はnilを返すことでネットワーク経由で最新のコンテンツを取得（別メソッド）
- (NSCachedURLResponse*)cachedResponseForRequest:(NSURLRequest*)request
{
    NSURL *url = [request URL];
    
    if([self isBlockURL:url]){
        NSURLResponse *response = [[NSURLResponse alloc] initWithURL:url MIMEType:@"text/plain" expectedContentLength:1 textEncodingName:nil];
        return [[NSCachedURLResponse alloc] initWithResponse:response data:[NSData dataWithBytes:" " length:1]];
    }
    
    return [super cachedResponseForRequest:request];
}

@end
```

```objc:AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    /**
     * 追加で記述
     */
    // フィルタリングにNSURLCacheを利用するため独自キャッシュクラスを設定
    FilteredWebCache *cache = [[FilteredWebCache alloc] init];
    [FilteredWebCache setSharedURLCache:cache];
    
    return YES;
}
```

FilteredWebCache.hは何も書いてないです。

UIWebViewのキャッシュはNSURLCacheで管理している。
cachedResponseForRequest:メソッドは引数のファイルがキャッシュを持っているか確認し、あればキャッシュを返す。
キャッシュがない場合はnilを返す。

NSURLCacheを継承したクラスFilteredWebCacheを作成し、application:didFinishLaunchingWithOptions:メソッドでインスタンス化して新しくキャッシュを設定する。
FilteredWebCacheクラスでcachedResponseForRequest:メソッドをオーバーライドして特定のURLのときのみ、コンテンツのないレスポンスを作成して返している。

参考サイト
http://cocoadays.blogspot.jp/2011/01/ios-uiwebview.html
http://www.icab.de/blog/2009/08/18/url-filtering-with-uiwebview-on-the-iphone/

どっちのサイトも情報が古いため、もっと簡単にできる便利なメソッドでもあるんじゃないかなと思います。
NSURLCacheもあまり理解しきれていないので、もっとスマートなやり方があれば教えていただきたいです。
PHPer が Rubyist にジョブチェンジしてみた


**単なるあるあるネタで、中身は空っぽです**

- 変数についつい $ をつけてしまう
- 末尾に ; をつけてしまう
- デバッグ時に var_dump() ってうってしまう
- 一瞬、@ に顔をしかめてしまう
- クラス内でほげほげするときに this が欲しくなる
- static function ... って書きたくなる
- () が恋しくなる
- self に戸惑いを隠せない

**どーでもいいけど**
PHPer って言われると dis られてる気分になって恍惚としてしまうのに、Rubyist だと高尚な感じがして面映ゆいのは何故なんだろう....
というか、Rubyist って単なる Ruby 使いを指す単語じゃないとかなのかな？
Railsアンチパターン<テスト編>①Fixtureはやめよう,②stub,mockについて考えよう

前書きの部分で[Shoulda](https://github.com/thoughtbot/shoulda)というライブラリーが紹介されているが、今であれば[shoulda_matchers](https://github.com/thoughtbot/shoulda-matchers)を使うのが良さそう。
ちなみにrailsのテスト手法については現在でも意見が割れている話なので、あくまで参考程度にお読みください。

#アンチパターン: fixures

一応話しておくと、fixturesというのはRailsのデフォルトで付いているテストデータ生成用の機能で、適切な場所に置かれた .ymlファイルからレコード、オブジェクトを生成する技術。([簡単な解説エントリ](http://qiita.com/itkrt2y/items/ca34fea17fc7dde56b7a))

この本ではfixtruesの以下の点を主な欠点として揚げている

 - 適切なfixtureを用意するコストが高い
 - オブジェクトの関連を表現する手段に乏しい
 - DBのバリデーションを通らない

ソリューション:Factory(Girl)を使おう
=
一連の関連するオブジェクトを生成するにはFactoryパターンというパターンが適している。Factoryクラスは他のクラスのインスタンスを生成する責任を持つ。クラスの実装が変わってもFactoryを変えればよい。

RailsにはFactoryパターンを利用してテストデータを作成してくれる[FactoryGirl](https://github.com/thoughtbot/factory_girl)というgemがあるので使おう。
また、contextという単位でてテストケースを分割することも勧めている。比較例としてあげられているのはassertion用のtest_caseメソッドをひたすら書く、というものでさすがにこんなことしてる人はいない、と思ったけど。
rspecを使っていればそのまま解決できる。

アンチパターン:テスト同士が独立していない
=
mock,stubという技術がある。テストしたい部分に関連する部分だけの振る舞いを指定する技術で、例えば外部APIに依存する操作をするコードをテストするときや、メソッドの出力をとりあえず指定する、みたいなことをする。([MatinFawler先生の解説](http://d.hatena.ne.jp/devbankh/201002))

 > スタブは主に生成したりコントロールしたりするのに手間がかかるオブジェクトをもみ消す [stub out] のに使われる。(中略)
スタブは、実際のオブジェクトと代替できるようインターフェースの実装をし、実際のメソッドをシンプルな [テスト用に] 準備されたデータを使うメソッドで置き換えることで作られる。

[mock/stubの違いに付いて簡単に解説したエントリ](http://morizyun.github.io/blog/rspec-model-controller-ruby-rails/)

 > モック
「オブジェクトのメソッドがどう呼ばれて何を返すか」というインタフェースも含めたテストのために使う
スタブ
テストをスムーズに行うために「あるオブジェクトのメソッドが呼ばれたら、ある戻り値を返す」ために使う

とのこと。

簡単に言えば、stubingとはユニットテストに対する統合テストまでのバッファである。結合部分をごまかしているので、この部分をテストしていないと結合動作だけは保証されなくて、本番で落ちる、みたいなことになる。
ただ、TDDのいいところはテストを書いてる間にそのクラスのインターフェースについて考えれるようになること。stubingしにくいということはクラス同士が密結合である可能性が高い。stubingを多用することが必ずしも良しというわけではないがstubingしやすいコードはいいコードということができるだろう。

しかしオブジェクトに「尋ねる」コードを書いていると、細かいメソッドチェーンをstubしていくコードで溢れてくる。これは良くない傾向だ。
相互作用するオブジェクトに対して、値を「尋ね」、その値を操作する、というコードは良いコードではない。
ロジックは値を持つ側のオブジェクトに実装し、利用する側はただ「命じる」ようにすべきだ。これがオブジェクト指向の"Don't ask, tell"にあたる。こうすればそのメソッドをstubingするだけでテストが書けるようになる。

##結論:FactoryGirl-RSpecを使おう(ただしこれに関しては賛否両論)。結合テスト無しにstubばかりを増やすのは危険だが、stubしやすいコードを心がけよう。"Don't ask, Tell"の法則が参考になる。

ちなみに
=
http://nilp.hatenablog.com/entry/2014/06/01/165448 (railsコントリビュターのrspec-factroyGirlあんまり好きじゃないポエム)
http://blog.steveklabnik.com/posts/2012-07-14-why-i-don-t-like-factory_girl (urlの通り)
Punditのrspecをカイゼンしてみた


Railsの権限管理にPunditを使うようになったのですが、標準のmatcherだとオブジェクトの操作に対して挙動を記述していきます。そうすると、あるユーザがどのような権限をもっているかがわかりにくい気がしました。

まず、Punditの標準でついてくるmatcherだとREADMEにあるようにこのような記述をします。

```spec/policies/post_spec.rb
describe PostPolicy do
  subject { described_class }

  permissions :update? do
    it "denies access if post is published" do
      expect(subject).not_to permit(User.new(:admin => false), Post.new(:published => true))
    end

    it "grants access if post is published and user is an admin" do
      expect(subject).to permit(User.new(:admin => true), Post.new(:published => true))
    end

    it "grants access if post is unpublished" do
      expect(subject).to permit(User.new(:admin => false), Post.new(:published => false))
    end
  end
end
```

アプリケーションによっては、ユーザの権限がどのような操作ができるのかという書き方をしたほうがわかりやすい場合があるのではないでしょうか。そのような場合は、ここで紹介しているやり方が参考になりました。

http://thunderboltlabs.com/blog/2013/03/27/testing-pundit-policies-with-rspec/

`spec/support/pundit_mathcer.rb`を作成します。

```ruby:spec/support/pundit_mathcer.rb
RSpec::Matchers.define :authorize do |action|
  match do |policy|
    policy.public_send("#{action}?")
  end

  failure_message_for_should do |policy|
    "#{policy.class} does not permit #{action} on #{policy.record} for #{policy.user.inspect}."
  end

  failure_message_for_should_not do |policy|
    "#{policy.class} does not forbid #{action} on #{policy.record} for #{policy.user.inspect}."
  end
end
```

`spec/rails_helper.rb`に下記を追加します。

```spec/rails_helper.rb
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
```

そうすると、このような記述でPolicyのspecが書けます。

```spec/policies/article_spec.rb
require 'rails_helper'

describe ArticlePolicy do
  subject { ArticlePolicy.new(user, article) }

  let(:article) { FactoryGirl.create(:article) }

  context "for a visitor" do
    let(:user) { nil }

    it { should     authorize(:show)    }

    it { should_not authorize(:create)  }
    it { should_not authorize(:new)     }
    it { should_not authorize(:update)  }
    it { should_not authorize(:edit)    }
    it { should_not authorize(:destroy) }
  end

  context "for a user" do
    let(:user) { FactoryGirl.create(:user) }

    it { should authorize(:show)    }
    it { should authorize(:create)  }
    it { should authorize(:new)     }
    it { should authorize(:update)  }
    it { should authorize(:edit)    }
    it { should authorize(:destroy) }
  end
end
```
Heroku push rejected, no Cedar-supported app detected

I'm creating a Rails app with Ruby version: ruby 2.2.1p85; Rails version: Rails 4.2.1; 
heroku-gem/3.38.3 (x86_64-darwin14) ruby/2.2.1
heroku-cli/4.20.8-96504ec (amd64-darwin) go1.4.2
=== Installed Plugins
heroku-git@2.4.0

got:

![Screen Shot 2015-06-24 at 5.32.06 PM.png](https://qiita-image-store.s3.amazonaws.com/0/83876/86c90362-6215-268f-7fda-cd3970958a30.png)

who can help me pls?
adbから任意のActivityを起動したい


# そんなときあるのか

主にデバッグの際に役立ちます。

「どうやら、特定のActivityが特定のExtra付きintentで起動された時に例外が出ているらしい」
とかそういうときに、わざわざプログラムをいじったりせずに原因調査が出来ます。

# どうやるのか

## 前提

* `adb` コマンドが使える
* Android端末は母艦に接続済み
* 起動したいActivityを持ったアプリがインストール済み

## 手順

以下に該当するActivityを起動したいとします。

<dl>
    <dt>パッケージ名</dt>
    <dd>net.kikuchy</dd>
    <dt>起動したいActivityのフルクラス名</dt>
    <dd>net.kikuchy.activity.HogeActivity</dd>
</dl>


```shell
# 母艦
$ adb shell

# ↓ここからAndroid端末
$ am start -n net.kikuchy/.activity.HogeActivity

# intent.putExtra("somekey", "somevalue") と同等のExtraをつけたいとき
$ am start -n net.kikuchy/.activity.HogeActivity -e somekey somevalue
```

## その他

intentのExtraは型情報を持っているので、各型ごとにオプションがあります。
以下、 `am` コマンドの説明より抜粋。

```
    [-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...]
    [--esn <EXTRA_KEY> ...]
    [--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> ...]
    [--ei <EXTRA_KEY> <EXTRA_INT_VALUE> ...]
    [--el <EXTRA_KEY> <EXTRA_LONG_VALUE> ...]
    [--ef <EXTRA_KEY> <EXTRA_FLOAT_VALUE> ...]
    [--eu <EXTRA_KEY> <EXTRA_URI_VALUE> ...]
    [--ecn <EXTRA_KEY> <EXTRA_COMPONENT_NAME_VALUE>]
    [--eia <EXTRA_KEY> <EXTRA_INT_VALUE>[,<EXTRA_INT_VALUE...]]
    [--ela <EXTRA_KEY> <EXTRA_LONG_VALUE>[,<EXTRA_LONG_VALUE...]]
    [--efa <EXTRA_KEY> <EXTRA_FLOAT_VALUE>[,<EXTRA_FLOAT_VALUE...]]
    [--esa <EXTRA_KEY> <EXTRA_STRING_VALUE>[,<EXTRA_STRING_VALUE...]]
        (to embed a comma into a string escape it using "\,")
```


`am` コマンドで他にも山ほどオプションが出てきます。
必要があれば調べてみてください。



# 参考

* [ターミナルからIntentを投げる](http://techbooster.jpn.org/andriod/environment/6031/)
向いてる方向に合わせてオブジェクトの位置と回転を調整する

※自分用の殴り書きメモです。

![図1.png](https://qiita-image-store.s3.amazonaws.com/0/56668/dc7a150f-8b85-747d-4aa2-cbd4b51a9755.png)
動画プレイヤーUIのように、向いてる方向に合わせてオブジェクトを表示したい！

## 位置

これは上図の状態を真上から見た図です。OpenGLの座標系に合わせて軸の向きを置いてます。
![図2.png](https://qiita-image-store.s3.amazonaws.com/0/56668/89e9965c-afcc-db72-d6e6-38846a6c72b0.png)
回転していない状態の座標を(0, 0, Z)とおいたときに、回転後の座標はどのようになるかを考えます。
y座標は変えないものとすると、回転後の座標は三角関数の定義から(Zsinθ, 0, Zcosθ)と表せます。

## 回転

それでは回転はどのようになるでしょう？
![図3.png](https://qiita-image-store.s3.amazonaws.com/0/56668/02443548-5e04-546d-d748-ce22da9a8ae4.png)
上図を見ると、三角形の内角の和が180度であることから?+θ+90=180であることがわかります。
それを踏まえてよくよく図を見ると、実はオブジェクトの回転角もθに等しいということがわかります。

## 実装

ちなみにθはカメラの回転角のY軸成分です。
GearVRfでの実装はこんな感じになるはず。

```java
float yaw = getMainCameraRig().getOwnerObject().getTransform().getRotationYaw();
float theta = (float) Math.toRadians(yaw);
float x = (float) (Z * Math.sin(theta));
float z = (float) (Z * Math.cos(theta));

ui.getTransform().setPositionX(x);
ui.getTransform().setPositionZ(z);
ui.getTransform().setRotationByAxis(yaw, 0, 1, 0);
```

…と思ったが！
後ろを向いた時の`yaw`の値がおかしい！
調べてみたら後ろを向いた時の判定は`getMainCameraRig().getOwnerObject().getTransform().getRotationPitch()`で行えそうだったので、やってみた。

```java

float yaw = getMainCameraRig().getOwnerObject().getTransform().getRotationYaw();

// 後ろを向いている場合の補正
if (Math.abs(getMainCameraRig().getOwnerObject().getTransform().getRotationPitch()) > 90) {
    yaw = 180 - yaw;
}

float theta = (float) Math.toRadians(yaw);
float x = (float) (Z * Math.sin(theta));
float z = (float) (Z * Math.cos(theta));

ui.getTransform().setPositionX(x);
ui.getTransform().setPositionZ(z);
ui.getTransform().setRotationByAxis(yaw, 0, 1, 0);
```

これで正しい位置・向きに表示されるようになりました！
フォルダの中身をSublimeTextで一括リネームする

Sublime Textの強力な機能の１つマルチキャレットをつかって一括リネームがしたい！
コレを叶えてくれるのが[massren](https://github.com/laurent22/massren)です。

##環境
* OSX Yosemite
* Sublime Text 3

##Install
[homebrew](http://brew.sh/index_ja.html) はインストール済み想定です。インストールしてない方は適当にググってください。

```bash:インストール
$ brew tap laurent22/massren
$ brew install massren
```
Sublime Text 3はそのままではmassrenで呼び出せないので、パスが通る適当なディレクトリにシンボルを作成します。
（以下は`/usr/local/bin`にシンボルを作成）

```bash:設定
$ ln -s /Applications/Sublime\ Text.app/Contents/SharedSupport/bin/subl /usr/local/bin
```

Sublimeが起動することを確認します。

```bash:テスト
$ subl
```

massrenにデフォルトのテキストエディタを設定します。

```bash:設定
$ massren --config editor subl
```

インストールは以上です。
##つかってみる

```bash
cd "開きたいディレクトリパス"
massren
```

これでSublimeで設定ファイルらしきものが開けるので、
テキストエディタ上で修正・保存すれば、ディレクトリ内のファイルのリネームが完了します！

なんて便利！！


## おまけ
関連して自作プラグインの紹介です。
ファイル名に連番入れたいときは、[InputSequence](https://github.com/kazu1107/InputSequence)と組み合わせるとより便利です。
AWSでlogrotateをサクっと設定する

## 1. 既に雛形が設定されているので、コピーする

今回はPHPのログを取りたいので、ファイル名はPHPにしています。
ファイル名は任意ですが、具体的なサービス名にしておくとわかりやすいです。

```awk
sudo cp /etc/logrotate.d/httpd /etc/logrotate.d/php
```

## 2. 設定を書く

以下は毎日ローテーションして10日分を.gzで圧縮しておく設定です。

```
/var/log/php.log {
    missingok
    daily
    compress
    rotate 10
}
```

logrotateで設定できるオプションについては以下のサイトがわかりやすいです。

＠IT：logrotateの設定ファイルで指定できる主なコマンド 
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/747logrotatecmd.html

## 3. 実行テストする

以下コマンドを実行すると動作をテストできます。

```
sudo /usr/sbin/logrotate -f /etc/logrotate.d/php
```

## 4. 設定を反映する

以下コマンドで設定を反映します。

```
sudo /usr/sbin/logrotate /etc/logrotate.conf
```

以上です。ログのローテーションは重要ですが、忘れがちなのでメモしておきます。