OmniAICreator/Qiita-1.07M huggingface dataset:
HerokuでDockerでTrusterdを動かすまで　準備編その3

# 前回

- [mruby - HerokuでDockerでTrusterdを動かすまで　準備編その2 - Qiita](http://qiita.com/kjunichi/items/1490ffc6fb8dc7ff8fa8)
 
# nghttpxに残された課題

trusterdはHTTP/2のサーバーなので、現状のHerokuではhttp2での
リクエストは扱えない、このため、nghttpxでHTTP/1.1でリクエストを受け付けるのだが、２点ほどHerokuでDockerの場合に引っかかった。

## Failed to open errorlog file /dev/stderr

HerokuのDockerだと/dev/stderrがappユーザーで動かしているからなのか、
開けない。

### 解決方法

開き先を/dev/nullに向けるべく、リダイレクト指定してnghttpxを起動することで解決。


```bash
> /dev/null 2>&1
```

## Certificate verification failed: self signed certificate

プロキシ先のhttp2サーバーが自己署名した証明書だと怒られる。

### 解決方法

-k オプションで、自己証明書をエラーとしないオプションがあった。

```bash
/app/trusterd/bin/nghttpx -k --client -f0.0.0.0,`echo $PORT` -b127.0.0.1,8080 >/dev/null 2>&1 &
```

# まとめ

以上で、これまでの準備を合わせると、あとはtrusterd.conf.rbの
書き方を思い出せば、HerokuでDockerでtrusterdが動く！

# Link

- https://nghttp2.org/documentation/nghttpx-howto.html
- https://devcenter.heroku.com/articles/http-routing#http-versions-supported

# 続き

- [HerokuでDockerでTrusterdを動かすまで 最終回 - Qiita](http://qiita.com/kjunichi/items/b22fca444b076a52a589)
Node Stream APIを実装するサンプル


# 概要

二つのStreamを作ってpipeでつなぎます。

1. 配列からStreamを作るArrayStream
2. Streamを出力するLogStream

[RxJSのとても短いサンプル](http://qiita.com/ledsun/items/e34c0bb1b92544593f1a) の [Node Stream](https://nodejs.org/api/stream.html)版です。


# 動作環境
- Node.js v0.12.2
- babel.js 5.2.17

# ソースコード

```js:index.js
import {
  Writable,
  Readable
}
from 'stream'

const option = {
  objectMode: true
}

class ArrayStream extends Readable {
  constructor(array) {
    super(option)
    this._array = array
  }
  _read() {
    this.push(this._array.shift() || null)
  }
}

class LogStream extends Writable {
  constructor() {
    super(option)
  }
  _write(chunk, encoding, callback) {
    console.log(chunk)
    callback()
  }
}

new ArrayStream([1, 2, 3, 4])
  .pipe(new LogStream)
```

入出力にオブジェクトを使いたいので、`objectMode`を`true`に設定します。
デフォルトは[Buffer](https://nodejs.org/api/buffer.html)です。

# 準備

```
npm install -g babel
```

# 実行

```
babel-node index.js
```

# 結果                                                                                   

```                                                                             
1
2
3
4
```

# 参考
- [node.js - How to implement a writable stream - Stack Overflow](http://stackoverflow.com/a/21583831/1276969)
- [Stream今昔物語 - from scratch](http://yosuke-furukawa.hatenablog.com/entry/2014/12/01/155303)
- [Node.js の Stream API で「データの流れ」を扱う方法 - Block Rockin’ Codes](http://jxck.hatenablog.com/entry/20111204/1322966453)
- [How to store text and binary data with Node.js writable streams (streams2) - a programming tutorial for web developers | CodeWinds](http://codewinds.com/blog/2013-08-19-nodejs-writable-streams.html)
git > git ls-remote > git ls-remote --tags / git ls-remote --heads

参考: 開発効率をUPするGit逆引き入門, 松下雅和ら, C&R研究所

リモートリポジトリのタグを表示する
```
$git ls-remote --tags
From https://github.com/shibugit/shibugit.git
```

リモートリポジトリのブランチ一覧を表示する
```
$git ls-remote --heads
From git@github.com:shubugit/shibugit.git
c0b35..... refs/heads/branch1
d43b...... refs/heads/master
```
Djangoでfixtureを使う

# Fixtureの定義

Djangoは、Fixtureを各アプリケーション内の`fixtures`ディレクトリから探します。
設定ファイルの`FIXTURE_DIRS`に追加のディレクトリを定義することもできますが、何か事情がない限り使うことはないでしょう。

Fixtureの形式としては、xml, yaml, jsonの3種類が使用できます。

以下にjsonの例をあげますが、xml, yamlでもそれぞれの形式で同じ表現を記述すれば問題ありません。

```fixture.json
[
  {
    "model": "app.hoge",
    "pk": 1,
    "fields": {
      "foo": 1,
      "bar": 2
    }
  }
]
```

# Fixtureの利用

## Case1: 初期データ

マスタデータなど、初期データを投入したい場合は多々あると思います。

`initial_data.[xml/ymal/json]`という名前のファイルをFixtureディレクトリ内に置いておくと、
`python manage.py migrate`を実行するたびにロードされます。

このデータは毎回ロードされるため、変更するべきではありません。

また、`python manage.py loaddata <fixturename>`を実行することで、明示的にロードすることもできます。
<fixturename>は、前述のディレクトリに加えて、通常のパスからも探索されます。

## Case2: テスト用データ

Fixtureはテスト時にも活躍します。

各テストのクラスに、使用するFixture名を列挙したfixturesという配列を用意しておくと、`setUp()`で自動的にデータがロードされます。

Fixture名の拡張子は省略することができます。その場合は、`[xml/yaml/json]`のすべてのファイルが探索されます。もちろん、拡張子を指定することもできます。

```py
class HogeTest(TestCase):
    fixtures = ['fixture1', 'fixtrue2.yaml']

    def setUp(self):
        # your setup code here
   
    def test_hoge(self):
        # your test code here
```
Node.js URLルーティング

「node.js　URLルーティング」とGoogleで検索すると、だいたいExpressを用いたコードが紹介されるけど、今回はExpressなしでURLルーティングのコードを書いてみた。というかExpress全然やっていないし。やろうとしたら、バージョンアップしていて自分の情報収集したバージョンが1つ前のバージョンで書き方が結構違うように思えたからね。
<h2>ExpressなしでのNode.jsでURLルーティング</h2>
<p>まずは「server.js」とファイルに名前を付けてルートディレクトリに配置。以下はそのコード。</p>
<div>
<pre>
var http=require('http');
var fs=require('fs');
var path=require('path');

var mimeTypes={
  '.html' : 'text/html',
  '.css' : 'text/css',
  '.js' : 'text/javascript',
  '.jpg' : 'image/jpg',
  '.png' : 'image/png',
  '.mp3' : 'audio/mpeg'
};

http.createServer(function(req,res){
    var lookup = decodeURI(req.url);
    var targetFile = __dirname + lookup;
    fs.exists(targetFile , function(exists){
      if(exists){
        fs.readFile(targetFile,function(err,data){
          if(err){
            res.writeHead(500);
            res.end('Server Error !');  
            return;
          }
          var headers = {'Content-Type' : mimeTypes[path.extname(targetFile)]};
          res.writeHead(200,headers);
          res.end(data);
          console.log(targetFile+'が開かれた'+'mimeType:'+mimeTypes[path.extname(targetFile)]);
          console.log(path.extname(targetFile));
        });
        return;
      }
      res.writeHead(404);
      res.end('ページが見つかりません');
    });
}).listen(4000);
console.log('Server is moving');
</pre>
</div>
<h2>解説</h2>
<ul>
<li>魔法の変数の「＿＿dirname」
<pre>＿＿dirnameでリクエストされるファイルのディレクトリを返す。これのおかげでいちいちfsを使う時にファイル名を書く必要がなくなる。
</pre>
</li>
<li>extname()
<pre>パスの最後の要素の拡張子を返す。「alissa.html」なら「.html」が返される。返される値は文字列。</pre>
</li>
<li>mymeTypeオブジェクト
<pre>ヘッダーにコンテンツタイプのMIMEタイプを送るために必要。extnameは文字列なので、プロパティは文字列として記述。MIMEタイプを送らないとHTMLが読み込まれてもcssなどの外部ファイルが読み込まれない事がある。サンプルファイルでその動作を確認。</pre>
</li>
<p>※いたるところにあるconsole.logはサーバーがちゃんと動作してるかをコマンドラインで確認するために書いたものです。</p>
</ul>
<p>上記のserver.jsファイルを製作中の経済サイトのルートディレクトリに配置し、動作を確認したところ、正常に作動。＿＿dirnameは素晴らしいね。とはいえやはりストリームを使った方が若干動作速度は速かった。</p>
UIImageにiOS公式のブラーをかける

iOS7からブラー処理が簡単になりGPUImageを使わなくてもブラーがかけられるようになりました。
GPUImageは使い方が難しい所があるので嬉しいですよね。

ただ、自分で通知センターやコントロールセンター風のブラーエフェクトをかけるにはパラメーターの微調整を繰り返さなくてはいけませんよね…。

そこで、WWDC2013のサンプルコードの`iOS_UIImageEffects`に入っている`UIImage+ImageEffects.h`をつかいます。

https://developer.apple.com/downloads/index.action?name=WWDC%202013#


```objc

- (UIImage *)applyLightEffect;
- (UIImage *)applyExtraLightEffect;
- (UIImage *)applyDarkEffect;
- (UIImage *)applyTintEffectWithColor:(UIColor *)tintColor;

- (UIImage *)applyBlurWithRadius:(CGFloat)blurRadius tintColor:(UIColor *)tintColor saturationDeltaFactor:(CGFloat)saturationDeltaFactor maskImage:(UIImage *)maskImage;

```
![iOS Simulator Screen Shot May 11, 27 Heisei, 2.43.54 AM.png](https://qiita-image-store.s3.amazonaws.com/0/24979/b7149bb2-8707-cd06-7409-915367b1f8f3.png)
`applyDarkEffect`

![iOS Simulator Screen Shot May 11, 27 Heisei, 2.44.14 AM.png](https://qiita-image-store.s3.amazonaws.com/0/24979/111c7af2-52d2-71c9-8f54-cae82f358b20.png)
`applyLightEffect`

![iOS Simulator Screen Shot May 11, 27 Heisei, 2.44.25 AM.png](https://qiita-image-store.s3.amazonaws.com/0/24979/68f71e72-e0ad-108b-c8fa-26327c74ae07.png)
`applyExtraLightEffect`

便利！！
Docker上でCojureのデータ解析ツールGorilla REPLを動かす

## 前書き

[Gorilla REPL](http://gorilla-repl.org/)はClojure製のノートブックスタイルのデータ解析ツールです。
Clojure版の[iPython Notebook](http://ipython.org/notebook.html)と言った方がイメージしやすいでしょうか。

Docker imageを作りましたので、今回はCoreOS上で動かすやり方を説明します。

## 準備

以下のインストールが事前に必要です。

* [VirtualBox](https://www.virtualbox.org/)
* [Vagrant](https://www.vagrantup.com/)

## CoreOSの起動

[CoreOSの公式Vagrantfile](https://github.com/coreos/coreos-vagrant)を使用します。
デフォルトだと1台だけ起動します。

```bash
git clone https://github.com/coreos/coreos-vagrant/
cd coreos-vagrant
vagrant up
```

## コンテナの起動

あとはログインして以下のコンテナを起動するだけです。
[naohisa/incanter-gorilla](https://registry.hub.docker.com/u/naohisa/incanter-gorilla/)

```bash
docker run --name some-gorilla -p 4242:4242 -p 80:8080 -d naohisa/incanter-gorilla
```

## Notebookを開く

特に設定を変更していなければ以下のURLをブラウザで開けばアクセスできます。
http://172.17.8.101/worksheet.html

leiningenのreplだと以下のコマンドで開けます。（nREPL等でもエンドポイントは一緒）

```bash
lein repl :connect 172.17.8.101:4242
```

以下のように表示されれば成功です。

![Screen Shot 2015-05-11 at 2.08.03.png](https://qiita-image-store.s3.amazonaws.com/0/38221/05807b4c-594c-97a2-6353-ef7bb484fd0c.png)

## データベースから情報を引っ張る

まずはnamespaceとライブラリの読み込みをするため、以下を入力して`shift + enter`します。

```clj
(ns divine-meadow
  (:require [clojure.java.jdbc :as jdbc])
  (:use [incanter core stats charts io datasets]
        [incanter-gorilla render]))
```

データベースへの接続情報を以下のような感じで定義しておきます。

```clj
(def db-info
  { :subprotocol "mysql"
    :subname "//[database host]:3306/database"
    :user "user_name"
    :password "password"})
```

jdbc経由でデータをとって来るには以下のようにします。

```clj
(def hoge-data
  (jdbc/query db-info
    ["select * from hoge where id > ? " "10"]))))
```

この場合、hoge-dataは遅延シーケンスでデータ的にはmapです。
これをIncanterで処理できるようにdatasetに変換します。

```clj
(def hoge-dataset
  (to-dataset hoge-data))
```

あとは以下のような感じで平均値を求めたり、グラフの描画もできます。

```clj
(mean ($ :price ($where {:year {= 2015}} hoge-dataset)))
(chart-view
  (scatter-plot :price :amount :group-by :month :data hoge-dataset))
```

## 現状の課題

* このコンテナイメージはGorilla REPLの実行ユーザがrootなので、いずれ起動用のユーザを追加して実行するように修正したいです。
* 起動時に任意のライブラリの読み込みが指定できるようにしたいです。
[Vagrant+Ansible+VirtualBoxでlocal・本番構築自動化(Vagrant+Virtualbox編)] のおまけ

前回投稿した
[Vagrant+Ansible+VirtualBoxでlocal・本番構築自動化（Vagrant+Virtualbox編)](http://qiita.com/kohei789/items/b87c3d47de8b215eff01)

のおまけです。
Vagrant+VirtualBoxについてのおまけを記載します。
***

(toc)

## ・Vagrantコマンド頻出一覧

```
- vagrant作成
 vgrant init 
- 状態確認(起動中、停止など各インスタンスの状態を確認します。)
 vagrant status
- 一時停止
 vagrant suspend
- 起動
 vagrant up
- リロード
 vagrant reload
- 停止
 vagrant halt
- 削除(完全に削除されますのでbox化していない場合は注意)
 vagrant destroy
```

## ・box化して配布する場合。

今回はミドルウェアの用意、設定等はansibleで各環境で自動で行うためbox化しませんが、
ansibleのようなストラクチャ構築ツールを使わない場合は用意したインスタンスを配布するためにはboxファイルを作成し配布する必要があります。

まずvagrant ssh web01等で各インスタンス内に接続しミドルウェアのインストール、設定を行う。
そしてtotalディレクトリ（Vagrantfileを作成したディレクトリ）に戻り、下記コマンドでboxファイルを生成します。

`vagrant package --output NAME.box(生成するbox名)`

これを行うとNAME.boxが生成されます。
このboxファイルは容量が大きいためgitなどで管理する場合は.gitignoreに
下記を追加しましょう。

`*.box`

このboxを共有サーバなどに配置し、前編で用意したVagrantfileのbox指定部分でurl指定すると
他者のローカル環境でもそのまま再現が行えます。

`config.vm.box_url = "http://~~~"`

### ・ssh接続する場合

下記のようにssh接続したい場合,Vagrantfileでprivate_ipを設定した上で
下記のように接続できます。(defaultパスはvagrant)

`ssh vagrant@192.168.20.10`


## ・vagrant共有フォルダ設定

デフォルトはローカルのVagrantfile配置ディレクトリと、以下の仮想環境内のディレクトリが同期されています。
`/vagrant`

指定ディレクトリを共有フォルダにしたい場合はVagrantfileに下記のように設定します。
また同期対象から省く場合はrsync__excludeにファイル名を指定します。

```
config.vm.synced_folder "~/git/dummy/target",  "/usr/share/tomcat8/webapps", 
                        # ↑ローカルディレクトリパス    ↑仮想環境内のディレクトリパス
         type: "rsync", # 同期タイプ
         rsync__exclude: ["maven-archiver", "maven-status", "generated-sources",
                          "classes", "personal"] #同期する際に除きたいファイル名を指定。
```
DockerでSubsonicを立ち上げてリバースプロキシを設定する

個人用ミュージックストリーミングサーバ「[Subsonic](http://subsonic.org/pages/index.jsp?v=6&utm_expid=61681315-0.IrEyWCg5TPeeCYn_QQGPIQ.7&utm_referrer=https%3A%2F%2Fwww.google.co.jp%2F)」をDockerで動かした。一番使いやすそうだった[hurricane/docker-subsonic](https://registry.hub.docker.com/u/hurricane/docker-subsonic/)を使用。

## Subsonicコンテナの作成

[GitHub](https://github.com/HurricaneHernandez/docker-subsonic)から[Dockerfile](https://github.com/HurricaneHernandez/docker-subsonic/blob/master/Dockerfile)と[Install.sh](https://github.com/HurricaneHernandez/docker-subsonic/blob/master/install.sh)を入手し、Install.shの`SUBSONIC_CONTEXT_PATH=/`を`SUBSONIC_CONTEXT_PATH=/subsonic`へ変更。
(これをしないとサブディレクトリ上で動作しない。)

DockerfileとInstall.shを同じ階層に置き、ビルドして実行する。

```:シェル
docker build -t hoge/subsonic .
docker run --name subsonic \
  -d \
  -e 'TZ=Asia/Tokyo' \
  -v /home/core/data/subsonic:/subsonic \
  -v /home/core/music:/music \
  -p 4040:4040 \
  hoge/subsonic
```

* `-v /home/core/data/subsonic:/subsonic` はsubsonicが作成する設定等の保存先
* `-v /home/core/music:/music` は音楽ファイルの保存先
* `-p` オプションは動作確認にだけ使用する。リバースプロキシ設定後は不要
* ポート番号を環境変数から設定することも可能。デフォルトは`4040`
* アクセスには `http://(IPアドレス):4040/subsonic`

今回はリバースプロキシ側にSSLを設定するので、subsonic側のSSL機能は無視。

## nginxコンテナの作成

[公式のnginxイメージ](https://registry.hub.docker.com/_/nginx/)を使う。

[適当にオレオレ証明書を作成](http://dogmap.jp/2011/05/10/nginx-ssl/)してから、`nginx.conf`にSSLとsubsonic用の設定を記入。

```nginx.conf
user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
  worker_connections  1024;
}

http {
  include  /etc/nginx/mime.types;
  default_type  application/octet-stream;

  log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';
  access_log  /var/log/nginx/access.log  main;

  sendfile        on;
  keepalive_timeout  65;

  # 80番アクセスを443番へリダイレクトさせる
  server {
    listen 80;
    server_name www.home.private;
    charset koi8-r;

    location / {
      return 301 https://$host$request_uri;
    }

  }

  server {
    listen 443 ssl;
    server_name service.home.private;
    charset koi8-r;

    ssl on;
    ssl_certificate /usr/local/nginx/conf/server.crt;
    ssl_certificate_key /usr/local/nginx/conf/server.key;

    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $host;
    proxy_set_header X-NginX-Proxy true;
    
    # subsonic
    location /subsonic {
      proxy_pass http://subsonic:4040/subsonic;
      proxy_redirect http:// https://;
    }
  }
}
```

```go:Dockerfile
FROM nginx
COPY nginx.conf /etc/nginx/nginx.conf
COPY ssl/server.crt /usr/local/nginx/conf/server.crt
COPY ssl/server.key /usr/local/nginx/conf/server.key
```

Dockerfile、証明書、設定ファイルを正しい場所に置き、イメージをビルド。
コンテナ作成時には `--link subsonic:subsonic` オプションを付ける。

```:シェル
docker build -t hoge/myproxy .
docker run --name proxy \
  -d \
  --link subsonic:subsonic \
  -p 80:80 \
  -p 443:443 \
  hoge/myproxy
```

これで `https://(IPアドレス)/subsonic` でアクセスできるようになる。
Debian 8 "Jessie" で環境整備


入れただけだ

# skk入れてmozcを消す

```bash
sudo apt-get install uim-skk skktools skkdic-cdb skkdic-extra skkdic
sudo apt-get remove mozc-server mozc-data mozc-utils-gui uim-mozc
```

あとはログアウトしてログインすれば有効になる。

# atomを入れる

https://atom.io にアクセスしてatomのdebパッケージをダウンロード。

```bash
cd ダウンロード
sudo dpkg -i atom-amd64.deb
```

これをやると依存関係で怒られます。必要なものをインストールしましょう。

```bash
sudo apt-get install git gvfs-bin
```

するとまた怒られるので、指示通りapt-get -f installを実行します。

```bash
sudo apt-get -f install
sudo dpkg -i atom-amd64.deb
```

無事インストールできました。
なお、Atomはアプリケーションメニューの開発の中にあります。

# 日本語のディレクトリ名を英語に変更
いちいちターミナルで日本語変換するのが面倒なので設定を変更します。

```bash
LANG=C xdg-user-dirs-update --force
```

あとは一度日本語のディレクトリを削除すればいいのですが、デスクトップだけはすぐに復活してしまいます。
ここで一旦ログアウトしてログインすると削除しても復活はしなくなります。
とりあえず有効になっているかテストしましょう。

```bash
touch Desktop/unko
```

デスクトップ上にunkoというファイルが出来上がればOKです。
なお、iceweaselの設定もいちおう見なおしてDownloadsディレクトリを選択して置くとよいかもしれません。ただ、選択しても「ダウンロード」という名前に見えてしまうのですが、実際にはDownloadsディレクトリにファイルが保存されるので安心してください。
ginza.rb 23th Rails API 予習


## 資料
* [Ginza.rb 第23回 APIのみのRailsアプリ「Rails API」を読もう！](https://ginzarb.doorkeeper.jp/events/24866)
* [pull request](https://github.com/rails/rails/pull/19832)
* [RAILS API TO BE PART OF RAILS 5](http://wyeworks.com/blog/2015/4/20/rails-api-is-going-to-be-included-in-rails-5/)
* [Rails API](https://github.com/rails-api/rails-api)
* [Rubyist Magazine 0050号 ハイパーメディア：RailsでWeb APIをつくるには、これが足りない ](http://magazine.rubyist.net/?0050-Hypermedia)

## 予習は…

まずは、[Rails API](https://github.com/rails-api/rails-api)を見て、機能の概要を掴んでおく。
Next Stepで挙げられている、asset generationや、Active Model SerializerとJBuilderの比較ができたら、pull requestが面白く読めそうなので、それを。
あとは、プルリクに出ているコードを読んでみるかも。
タイミングよく、Rubyist Magazineにも寄稿があるので目を通そうっと。

## [Rails API](https://github.com/rails-api/rails-api)
(githubのREADME.mdをなんとなく読む。)

Railsのサブセットで軽くて速い。
ミドルウェアスタックは選択制。
コントローラで使うモジュールは選択制。
テンプレート生成がない。

### 制御されたミドルウェア
* 透過的リロード（アプリサイズが大きくなりすぎたときに行われる）
* 開発モード（production環境の動作速度と引き換えに開発を快適にしている）
* テストモード
* ログ
* セキュリティ(IPなりすまし、タイミングアタック)
* パラメータ解析(そもそもJSONでやっているからネストしたパラメータとかはやり過ぎ)
* 条件付きGET
* キャッシング
* HEADリクエスト

### 制御されたActionPack
* リソースベースのルーティング(きれいで慣例的なマッピングなら速い？)
* URL生成
* ヘッダーやリダイレクトレスポンス
* ベーシック、ダイジェスト、トークンによる認証
* 各種フィルター類（アクション、ファイル送信、リダイレクト、DBクエリなど）
* generators
* plug in

## [pull request](https://github.com/rails/rails/pull/19832)

pull requestの冒頭には、Rails APIの概要と、議論したい点について書かれている。

* バックエンド、フロントエンドのアプリケーションを持つことでRailsのassets生成を邪魔してもいいのか？
* シングルアプリケーションを持ち、asset生成をRailsで持ち続けたいか?
* Active Model SerializerのほうがJBuilderより好ましいか?
* JbuilderでよりよいRails APIを作れるか?

### Active Model SerializerとJBuilder

Rails APIはもともと Active Model Serializerを使ってJSON出力をしていたけれど、もうひとつの公式にJBuilderがあるので、どちらを使おうか議論しているカンジのよう。
一応、それぞれ軽く概要を洗っておこうかしら。

#### Active Model Serializer

コントローラで扱うときにシリアライズする機能を追加する。
メソッドを属性として追加したり、関連を追加できたりもする。
オブジェクト指向的に書けそうな雰囲気。
[Rails Casts](http://railscasts.com/episodes/409-active-model-serializers?language=ja&view=asciicast)

#### JBuilder

JSON出力用のテンプレートエンジン。
使うとレスポンスをカスタマイズするときに、renderにうーんと唸ってしまうようなコードを書かなくてすみそう。
[Rails Casts](http://railscasts.com/episodes/320-jbuilder?language=ja&view=asciicast)
Spring Boot + Vaadin (vaadin-spring-boot-starter)

## 概要

[Vaadinのadd-onでのSpring対応](https://vaadin.com/wiki?p_p_id=36&p_p_lifecycle=0&p_p_state=normal&p_p_mode=view&p_p_col_id=row-1&p_p_col_pos=1&p_p_col_count=3&_36_struts_action=%2Fwiki%2Fview&p_r_p_185834411_nodeName=vaadin.com+wiki&p_r_p_185834411_title=Vaadin+Spring)が進んできていて、いつの間にか[start.spring.io](http://start.spring.io/)にもVaadinの項目が増えている。

というわけで、以前チャレンジした [Vaadin4SpringでのSpring Bootプロジェクト](http://qiita.com/gishi_yama/items/591a6d5380b618e29455) を、start.spring.ioで入手できるプロジェクトに使われている vaadin-spring-boot-starter に変更してみた。

## pom.xml

```以前のpom.xml
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
  <groupId>com.vaadin</groupId>
</dependency>

<!--中略-->

<dependency>
  <groupId>com.vaadin</groupId>
  <artifactId>vaadinserver</artifactId>
  <version>${vaadin.version}</version>
</dependency>
<dependency>
  <groupId>org.vaadin.spring</groupId>
  <artifactId>springbootvaadin</artifactId>
  <version>${sbv.version}</version>
</dependency>
<dependency>
  <groupId>com.vaadin</groupId>
  <artifactId>vaadinthemes</artifactId>
  <version>${vaadin.version}</version>
</dependency>
<dependency>
  <groupId>com.vaadin</groupId>
  <artifactId>vaadinclientcompiled</artifactId>
  <version>${vaadin.version}</version>
</dependency>
```

```vaadin-spring-boot-starterを使ったpom.xml
<dependency>
  <groupId>com.vaadin</groupId>
  <artifactId>vaadin-spring-boot-starter</artifactId>
  <version>${sbv.version}</version>
</dependency>

<!--中略-->

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>com.vaadin</groupId>
      <artifactId>vaadin-bom</artifactId>
      <version>${vaadin.version}</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>
```
dependencyManagement が増えたけど、vaadinとspring-boot-starter-webのdependencyがvaadin-spring-boot-starterに内包されたので、実際のpom.xmlはかなり見通しが良くなって素敵。

## アノテーション

`@UIScope` は `@SpringUI` に、`@VaadinView` は `@SpringView` に変更になった。利用方法は変わらないので、そのまま入れ替えるだけで対応できた。

## サンプルコード

Vaadin4Springで作った認証のサンプルコードが、ほぼ上の変更だけでそのまま動いた。valoテーマは綺麗でほれぼれするなあ。

書き換えたサンプルコードは[こちら](https://github.com/gishi-yama/springboot-vaadin-sample/tree/e2eca251b718a48a9f257e3349cc8f9290f350bc)。
POH 「俺の許嫁と幼なじみが修羅場すぎる」をClojureで解く

## 前書き

いつの間にかClojureが使用できるようになっていたので、[俺の許嫁と幼なじみが修羅場すぎる](https://paiza.jp/poh/enshura)を解いてみました。

## Mission1

```clj
(require '[clojure.string :as str])
(use '[clojure.java.io])

(doseq [line (line-seq (reader *in*))]
  (println (str/join
    (map #(nth % 1) (filter #(even? (nth % 0))
      (map-indexed #(vector %1 %2) (str/split line #"")))))))
```

結果：
　提出言語：Clojure(Beta)
　得点：100 点

　結果：
　テストケース1：success　1.22秒
　テストケース2：success　1.17秒
　テストケース3：success　1.2秒
　テストケース4：success　1.21秒
　テストケース5：success　1.16秒

...Clojure遅い。
おそらく1秒は起動時のcoreの読み込みに使っているはず。

## Mission2

```clj
(use '[clojure.java.io])
(doseq [line (reduce #(map + %1 %2)
  (partition 7 (map read-string
    (rest (line-seq (reader *in*))))))] (println line))
```

結果：
　提出言語：Clojure(Beta)
　得点：100 点

　結果：
　テストケース1：success　1.15秒
　テストケース2：success　1.25秒
　テストケース3：success　1.22秒
　テストケース4：success　1.19秒
　テストケース5：success　1.16秒

## Mission3

```clj
(println "RENA")
```

結果：
　提出言語：Clojure(Beta)
　得点：100 点

　結果：
　テストケース1：success　1.11秒

## Mission RENA

```clj
(use '[clojure.java.io])
(require '[clojure.string :as str])

(defn str-to-numseq [s]
  (map read-string (str/split s #" ")))

(defn fr-pair [v]
  (map #(vector (first v) %) (rest v)))

(defn reduce-concat [v]
  (reduce #(concat %1 %2) v))

(defn combine [s1 s2]
  (reduce-concat
    (map #(fr-pair (cons % s1)) s2)))

(defn seq-to-grid [s]
  (let [[x1 y1 x2 y2] s]
    (combine (range x1 (+ 1 x2)) (range y1 (+ 1 y2)))))

(defn m-val [x y m]
  (nth (nth m (- x 1)) (- y 1)))

(def input-data (line-seq (reader *in*)))

(def settings (-> input-data first str-to-numseq))
(def width (first settings))
(def height (second settings))

(def num-matrix
  (map #(str-to-numseq %) (take height (rest input-data))))

(def selectors
  (distinct (reduce-concat
     (map seq-to-grid
          (map str-to-numseq (drop (+ 1 height) input-data))))))

(def result
  (reduce + (map #(m-val (first %) (last %) num-matrix) selectors)))

(println result)
```

結果：
　提出言語：Clojure(Beta)
　得点：100 点

　結果：
　テストケース1：success　1.32秒
　テストケース2：success　1.28秒
　テストケース3：success　1.34秒
　テストケース4：success　1.28秒
　テストケース5：success　1.28秒

今回は対象のマスを全部求めてから重複を弾いて集計する流れにしたけれど、各マスごとにフラグ立ててから集計した方がおそらく早いと思われる。

## 感想

速さを求めるためのチューニングをしていないので、全体的にけっこう遅い。
あと、Clojureはテストケースごとに新たに実行環境を起動しているようなので、その分のオーバーヘッドが1秒ほどあるように思われる。（Mission3でも1.1秒かかっているため）
全体的に不利かも。
Debian 8 "Jessie" を Virtualbox にインストールしたメモ

ただのメモです。
# Virtualboxにインストールまで
インストーラはnetinstのisoファイルを利用します。

Virtualboxは適当にセットアップします。
インストーラはテキストで行い、xfceとsshサーバをオンにしました。
いちおうリモートでも何か作業が必要になるかもしれないという事でsshサーバをオンにしています。

# sudoを入れる
sudoで作業する癖がついてるので入れておく

```bash
su -
apt-get update
apt-get upgrade
apt-get install sudo
gpasswd -a btm sudo
```

これで一旦ログアウトすれば有効になります。

# Virtualbox Guest Additionsを入れる。
ビルドに必要なものを入れます。

```bash
sudo apt-get install apt-get install build-essential module-assistant
sudo apt-get install linux-headers-3.16.0-4-all
```

次にvirtualboxのメニューから"Insert Guest Additions CD Image..."を選択してCDイメージを入れます。
マウントはそのままではされないので、xfceでデスクトップ上に出現したCDのアイコンを右クリックしてマウントを選択します。

```bash
cd /media/cdrom
sudo sh VBoxLinuxAdditions.run
```

これで再起動すればOK。
PHP関数の定義


  <?php

    //この下に関数getRectangleAreaを作ってください
    //引数として$heightと$widthを受け取り、
    //その面積をreturnします
    //この下で$rectangle_areaに高さが5、幅が10の長方形の面積を、
    //getRectangleArea関数を用いて代入してください
    
    
    
    function getRectangleArea($height, $width){
      return $height * $width;
    }
    $rectangle_area = getRectangleArea(5,10);
	
	//$height = 5 , $width = 10が代入される
	//returnで5×10の計算
	//最後に$rectangle_areaに計算結果を代入
    


    
    
    //この下に関数printAreaを作ってください
    //引数として$areaを受け取り、
    //"面積は".$area."です。"とechoします
    //この下で$rectangle_areaの面積を、
    //printArea関数を用いてechoしてください。
    
    
    function printArea($area){
      echo "面積は".$area."です。";
    }
    printArea($rectangle_area);
    
    //printAreaに先ほど計算した$rectangle_areaの結果を代入して、echoで表示
  
  ?>
React.jsチュートリアルをさわった時のメモ

React.jsのチュートリアルをさわってみた。
そのときのメモ。

http://facebook.github.io/react/docs/tutorial.html
基本的にはステップバイステップでの解説なのだけど、細かいところが端折られてるので写経していくだけでは実行できない。
おすすめのやり方としては次のとおり。

1. https://github.com/reactjs/react-tutorial をcloneする 
2. `public/scripts/example.js` の中身を空にする

これで準備完了。
あとは書かれてるとおりにコードを書いていけばOK.

# 注意点１

解説コードの先頭に `// tutorial1.js` とかファイル名っぽく書かれているがこれを信用して `tutorial1.js` なんていうファイルをつくってはいけない。
ファイルの編集は `example.js` だけしてれば大丈夫。

# 注意点２

冒頭の"Getting started"で `index.html` を編集するように言われるが素直にサンプルのまま書くと、何も実行されないHTMLができあがるので、 `example.js` を読み込んであげるようにする必要がある。

# 感想

* 「jQueryなんで使ってるんだろう？」と疑問に思ったらすぐ後に丁寧な解説があった
* ちょっとしたサンプルにしてはサーバサイドのファイルを直接書き換えるというアグレッシブなことをしている
    * 泥臭さが見れてよい
Shell : yes/no/skipを選択しながら順番に実行するシェルスクリプトのサンプル

- ３つのコマンドを１つのシェルで実行する
- 実行後 yes, no, skip を入力して、実行、中断、スキップをすることができる
- yesの場合はy, Y, yes, Yes, YES など、様々なパターンの入力を許可する
- root/tool/hoge.sh

```bash:hoge.sh
#!/bin/sh

set -e

# 1つ上のディレクトリに移動する
cd $(dirname $0)/../

read -p "[1/3] Are You Ready? (y/n/skip)" ans1
case $ans1 in
    [Yy] | [Yy][Ee][Ss] )
        # TODO ここに実行コマンドを記述
        ;;
    [Ss] | skip )
        echo "Skip!";;
    * )
        echo "Quit"; exit 1;;
esac

read -p "[2/3] Are You Ready? (y/n/skip)" ans2
case $ans2 in
    [Yy] | [Yy][Ee][Ss] )
        # TODO ここに実行コマンドを記述
        ;;
    [Ss] | skip )
        echo "Skip!";;
    * )
        echo "Quit"; exit 1;;
esac

read -p "[3/3] Are You Ready? (y/n)" ans3
case $ans3 in
    [Yy] | [Yy][Ee][Ss] )
        # TODO ここに実行コマンドを記述
        ;;
    * )
        echo "Quit"; exit 1;;
esac

echo "Complete!"
```
※１つの選択で複数のコマンドを実行したい場合は改行して記述する

```bash
    [Yy] | [Yy][Ee][Ss] )
        cp ./aa ./bb
        chmod 755 ./bb
        rm ./aa;;
```

**実行**

```bash
$ ./tool/hoge.sh
$ [1/3] Are You Ready? (y/n/skip) y
$ [2/3] Are You Ready? (y/n/skip) s
$ Skip!
$ [3/3] Are You Ready? (y/n/skip) n
$ Quit
```
プログラミングコンテストチャレンジブック1-6.「三角形」

# 概要
テスト投稿してみる。
C#で記述しています。

## ソースコード
```csharp
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Kai1_6Sankakukei
{
    class RunMain
    {
        public RunMain()
        {
        }
        public static int Main()
        {
            new RunMain().solve();
            return 0;
        }
        
        const int MAX_N = 100;
        Scanner cin;
        

        void solve()
        {
            // 入力フェイズ
            int ans = 0;
            cin = new Scanner();
            int n = cin.myInputInt();
            int[] a = new int[MAX_N];
            for (int i = 0; i < n; i++)
            {
                a[i] = cin.myInputInt();
            }
            
            // 演算フェイズ
            for (int i = 0; i < n; i++)
            {
                for (int j = i + 1; j < n; j++)
                {
                    for (int k = j + 1; k < n; k++)
                    {
                        int len = a[i] + a[j] + a[k];
                        int ma = Math.Max(a[i], Math.Max(a[j], a[k]));
                        int rest = len - ma;

                        if (ma < rest)
                        {
                            ans = Math.Max(ans, len);
                        }
                    }
                }
            }

            Console.WriteLine("{0}\n", ans);
        }
    }

    class Scanner
    {
        string[] s;
        int i;

        char[] cs = new char[] { ' ' };

        public Scanner()
        {
            s = new string[0];
            i = 0;
        }

        public string myInput()
        {
            if (i < s.Length)
                return s[i++];
            string st = Console.ReadLine();
            while (st == "")
                st = Console.ReadLine();
            s = st.Split(cs, StringSplitOptions.RemoveEmptyEntries);
            i = 0;
            return s[i++];
        }

        public int myInputInt()
        {
            return int.Parse(myInput());
        }

        public long myInputLong()
        {
            return long.Parse(myInput());
        }

        public double myInputDouble()
        {
            return double.Parse(myInput());
        }
    }
}
```
dockerで、pathの場所を、/var/lib/dockerから/mnt/foobar/に変更する方法 (Fedora版)


## 結論

    % sudo systemctl stop docker.service
    % sudo mkdir /mnt/foobar/docker
    % sudo vim /etc/sysconfig/docker
    % grep OPTIONS /etc/sysconfig/docker
    OPTIONS='--selinux-enabled -g /mnt/foobar/docker'
    % sudo systemctl start docker.service

## `/var/lib/docker` をシンボリックリンクにするのはだめ

"... is not an absolute path or is a symlink" といったメッセージが出て起動できない。

http://stackoverflow.com/questions/24309526/how-to-change-the-docker-image-installation-directory/27950326#27950326 に書かれているが、シンボリックリンクに対する rm(1) の問題のため禁止にしているようだ。

> <p>Don't use a symbolic Link to move the docker folder to /mnt (for example). This may cause in trouble with the <em>docker rm</em> command. </p>
> <p>Better use the -g Option for docker. On Ubuntu you can set it permanently in /etc/default/docker.io. Enhance or replace the DOCKER_OPTS Line.</p>
> <p>Here an example: `DOCKER_OPTS="-g /mnt/somewhere/else/docker/"</p>
    

よって docker の設定で他のディレクトリに設定するのが正しい（好ましい）ようだ。ここで `-g` は docker(1) の下記オプションのことだ：

> `-g=""`, `--graph=""`
>  Path to use as the root of the Docker runtime. Default is `/var/lib/docker`.

## 設定ファイル

`/usr/lib/systemd/system/docker.service` が systemd における docker サービスの設定ファイル。

```:/usr/lib/systemd/system/docker.service
% (snip)
[Service]
Type=notify
EnvironmentFile=-/etc/sysconfig/docker
EnvironmentFile=-/etc/sysconfig/docker-storage
EnvironmentFile=-/etc/sysconfig/docker-network
Environment=GOTRACEBACK=crash
ExecStart=/usr/bin/docker -d \
          $OPTIONS \
          $DOCKER_STORAGE_OPTIONS \
          $DOCKER_NETWORK_OPTIONS \
          $INSECURE_REGISTRY
% (snip)
```
ここで `docker(1)` への引数 `-g` を指定してもよいが、これは設定ファイルではないことになっているので弄らない方がよろしい。

    % rpm -qc docker-io
    /etc/sysconfig/docker
    /etc/sysconfig/docker-network
    /etc/sysconfig/docker-storage

RPM 的には `/etc/sysconfig/docker*` が設定ファイルなので、`docker.service` から `EnvironmentFile` として参照されているファイルを編集して欲しいらしい。

```bash:/etc/sysconfig/docker
# /etc/sysconfig/docker

# Modify these options if you want to change the way the docker daemon runs
OPTIONS='--selinux-enabled'
DOCKER_CERT_PATH=/etc/docker

# ...snip...
```

ここで `OPTIONS` を下記のように変更する：

```bash:/etc/sysconfig/docker
OPTIONS='--selinux-enabled -g /mnt/foobar/docker'
```
すると `/usr/lib/systemd/system/docker.service` の `ExecStart` における `$OPTIONS` に反映されるので docker の path が変わる。

なお、Ubuntu では `DOCKER_OPTS` に '-g /mnt/foobar/docker' を追記するようにかかれているが、これは upstart/systemd の設定ファイルに起因するものなので Fedora と Ubuntu は異なる。

Fedora 以外で systemd を使っているディストリビューションにおいても `/etc/sysconfig/docker` といったサービスの設定ファイルを見てから、適切な設定ファイルに適切な環境変数に '-g /mnt/foobar/docker' を追記するという風にできると思われる（注：詳細未調査）。

## 参考文献

 - "[How to change the docker image installation directory?](http://stackoverflow.com/questions/24309526/how-to-change-the-docker-image-installation-directory)", Stackoverflow
 - "[Set Docker_Opts in centos](http://stackoverflow.com/questions/26166550/set-docker-opts-in-centos)", Stackoverflow
Xcode 6.3.1でCarthageを利用する際にSimVerifier returned error: Simulator verification failed.エラー


- Xcode: 6.3.1(6D1002)
- Carthage: 0.7.1

Xcode 6.3でも発生するようです。`carthage update`とか`carthage build --no-skip-current`とかやるときに発生して困りました。

こんなエラーです。サンプルプロジェクトをテストした時のログです。

```bash
$ carthage build --no-skip-current
*** xcodebuild output can be found in /var/folders/j9/s8z2l0l93jb3xz9y4_jx934h0000gn/T/carthage-xcodebuild.z1A534.log
*** Building scheme "CarthageSample" in CarthageSample.xcworkspace
A shell task failed with exit code 65:
2015-05-10 21:24:02.422 xcodebuild[72041:3409756] [MT] iPhoneSimulator: SimVerifier returned: Error Domain=NSPOSIXErrorDomain Code=53 "Simulator verification failed." UserInfo=0x7f8c15a7af50 {NSLocalizedFailureReason=A connection to the simulator verification service could not be established., NSLocalizedRecoverySuggestion=Ensure that Xcode.app is installed on a volume with ownership enabled., NSLocalizedDescription=Simulator verification failed.}
** BUILD FAILED **


The following build commands failed:
	CompileSwift normal arm64 /Users/***/Desktop/CarthageSample/CarthageSample/Sample.swift
	CompileSwiftSources normal arm64 com.apple.xcode.tools.swift.compiler
(2 failures)

Segmentation fault: 11
```

## Issue

[SimVerifier returned error: Simulator verification failed. · Issue #424 · Carthage/Carthage](https://github.com/Carthage/Carthage/issues/424#issuecomment-95812898)

を参考にするところ、どうやらCarthageのエラーというよりは、Xcode側のバグのようです。

## （現時点で推定される）原因

[#issuecomment-97094714](https://github.com/Carthage/Carthage/issues/424#issuecomment-97094714)の方が言うようにどうやら、古いバージョンのシミュレータのファイルの所有権の問題のようです。

## （とりあえずの）解決法

僕の場合は、

```bash
sudo chown :wheel /Library/Developer/CoreSimulator/Profiles/Runtimes/iOS\ *.simruntime/Contents/Resources/RuntimeRoot/usr/lib/dyld_sim
```

をすることで、`carthage` コマンドを一通りエラーなく使うことが出来ました。
EclipseでListが100倍使いやすくなる方法


たまたま見つけたEclipseの設定。
この設定をするだけで、java.util.ListなどSwingコンポーネントと重複するクラス群が抜群に使いやすくなります。


# Eclipseの設定変更
1. Java＞Appearance＞Type Filters
1. Add Packages... ボタン
1. java.awt


# 恩恵
* インテリセンス(Ctrl+Space)したときに、java.awt.Listが補完候補にならない
*  OrganizeImports（Command+Shift+O）したときに、java.awt.Listが補完候補にならない

たったこれだけですが、これまでのイライラが嘘のように解消されます。


# 補足

JavaFXエンジニアは、javax.swingやcom.sun.awtあたりを追加してもいいかもしれない。
Clone Workspace SCM Plugin

# 概要
このプラグインは、あるジョブを実行したワークスペースの内容を、後続のジョブに複製して渡すというプラグイン。
例えば、ジョブの実行時間が掛かってきたときに、SCM からソースをチェックアウトして、単体テストと結合テストそれぞれのジョブに、そのチェックアウトしたソースを渡してテストするとか。
こうすることによって、単体テストと結合テストで、ジョブは違うが同じバージョンのソースでテストを出来るというメリットがある。
他にも色々使い道はありそうだけど。

では、早速使い方を。


# インストール
Jenkis のプラグイン管理から、以下のプラグインをインストール。

![CWSP1.png](https://qiita-image-store.s3.amazonaws.com/0/76368/9c1295c6-9974-0869-9563-d3b6edd0927f.png)

インストールが無事に終わったら、早速ジョブを作ってみる。


# 親ジョブの定義
ジョブのいっちゃん下の「ビルド後の処理の追加」を選んでみると、「Archive for Clone Workspace SCM」が選択できるようになる。

![CWSP2.png](https://qiita-image-store.s3.amazonaws.com/0/76368/df4519a0-789b-9937-b5f6-e3c921798f7c.png)

これを選ぶと、以下のような画面が表示される。

![CWSP3.png](https://qiita-image-store.s3.amazonaws.com/0/76368/fc3814f0-2095-02a4-2aea-03104d3784d6.png)

内容は．．．多分こんな感じだと思う。

 - Files to include in cloned workspace　　複製するワークスペースに含めるファイル
 - Files to exclude from cloned workspace　　複製するワークスペースから除外するファイル
 - Criteria for build to be archived　　　複製する条件
   - Most Recent Completed Build　　ビルドが完了した場合（成功・失敗を問わない）
   - Most Recent Not Failed Build　　ビルドが失敗ではない場合（ビルド結果が黄）
   - Most Recent Successful Build　　ビルドが成功した場合（ビルド結果が青）
 - Archive method　　複製を方法
   - Gzipped tar
   - Zipped
 - Override Default Ant Excludes　　ワークスペースをコピーするとき、内部的にAntのFileSetを使っていて.svnディレクトリなどがデフォルトで除外されるようになっている。svnディレクトリなどをワークスペースのアーカイブに含めたい場合

include と exclude は、共に何も指定しなければ、そのビルドで実行したワークスペースの全てのファイルが複製される。


# 子ジョブの定義
で、次にこの複製されたワークスペースを受け取る側のジョブを定義する。

ジョブの設定を見てみると、ソース管理システムの欄に「Clone Workspace」が追加されて、選択できるようになっている。

![CWSP4.png](https://qiita-image-store.s3.amazonaws.com/0/76368/e37530c2-029b-dd7e-c978-3be26bd02eb5.png)


 - Parent Project　　ワークスペースに使う親のジョブを選択（ここでは、ビルドの後処理に Archive for Clone Workspace SCM が指定されているものが自動で候補になる）
  - Criteria for parent build　　　　　親のジョブを使う条件
  - Most Recent Completed Build　　ビルドが完了した場合（成功・失敗を問わない）
  - Most Recent Not Failed Build　　ビルドが失敗ではない場合（ビルド結果が黄）
  - Most Recent Successful Build　　ビルドが成功した場合（ビルド結果が青）
Node.js URLルーティングテスト②

<p>URLルーティングのコードの意味をメモしとく</p>

<h1>簡単なURLルーティング</h1>

<div>
 <pre>
   var http=require('http');
   var path=require('path');

   var server=http.createServer();

  server.on('request',function(req,res){
    var lookup=path.basename(decodeURI(req.url));
    res.writeHead(200,{"Content-Type":"text/plain"});
    res.write(lookup);
    res.end();
  }).listen(4000);

  console.log("Server is moving");
</p>
</div>

<h2>解説</h2>
<ul>
<li><strong>path</strong>:ファイルのパスに対する処理や変換を行う。ほとんどのメソッドは文字列の変換だけを行う。パスが正しいかを検証するためにファイルシステムに尋ねる事はない</li>
<li><strong>path.basename</strong>:パスの最後の要素を返す。localhost:4000/alissaなら「alissa」が返される。req.urlなら「/alissa」となる<ul><li>ただし上記だと/alissa/angelaはエラーとなってしまう。その回避方法は後述</li></ul></li>
<li><strong>decodeURI</strong>:URLエンコードをデコード。例→locallhost:4000/alissa white grluzでリクエストするとデコードしていれば「alissa white grluz」で評価されるが、デコードしなければ「alissa%20white%20grluz」として評価され、エラーとなる。*%20はURLエンコードされたから半角スペース文字列。ただし半角スペースをファイル名に用いない方が賢明である。</li>

<h2>複数階層コンテンツのルーティング</h2>

<div>
 <pre>
 var http=require('http');
var path=require('path');

var server=http.createServer();
var pages=[
    {route:'/',output:'woohoo!'},//routeに/を追加
    {route:'/about/alissa',output:"アリッサ可愛い！"},
    {route:'/about/node',output:'node.js'},
    {route:'/another page',output:function(){return 'これが'+this.route;}}
];


server.on('request',function(req,res){
  var lookup=decodeURI(req.url);//basenameの代わりにreq.urlを渡す
  pages.forEach(function(page){
    if(page.route===lookup){
      res.writeHead(200,{"Content-Type":"text/plain"});
      res.write(typeof page.output==='function' ? page.output():page.output);
      res.end();      
    }  
  });
  if(!res.finished){
    res.writeHead(404);
    res.write('ぺーじがみつからない！');
    res.end();
  }
}).listen(4000);

console.log("Server is moving");
</pre>
</div>

<h2>解説</h2>
<ul>
<li><strong>basenameを削除で複数階層のパスに対応</strong>：それだけで複数階層コンテンツのルーティングが可能になる。</li>
<li>コードの結果は次の通り<pre>
  localhost:4000→woohoo!
  localhost:4000/about/alissa→アリッサ可愛い！
　localhost:4000/about/node→node.js
  localhost:4000/another pagey→これが/another page
</pre></li>
<li><strong>アリッサとアンジェラ</strong>:アリッサ・ホワイト・グラズとはTHE AGONISTの初代ヴォーカリストで現在はARCH ENEMYのヴォーカリスト(3代目)。アンジェラ・ゴソウは元ARCH ENEMYの2代目ヴォーカリスト←Node.jsとは関係ありません</li>
</ul>
メソッドのドットと括弧を省略してみよう

## はじめに

この記事では、メソッド呼び出しで、ドット(`.`)と括弧が省略できるケースとできないケースを紹介します。

## 省略できるケース

レシーバを明示的に指定する場合で、かつ、メソッドのパラメータが１つである場合にドットと括弧を省略することができます。

``` scala
object Main extends App {
    class Shopping(val product: String) {
        def and(that: Shopping): String = s"${this.product} & ${that.product}"
    }
    
    val book = new Shopping("book")
    val fruit = new Shopping("fruit")
    
    println(book and fruit)
}
```

レシーバは`book`という変数です。そのメソッドは`and`です。そして、`and`のパラメータは一つです。

したがって、条件を満たしているため、ドットと括弧を省略することができます。

## 省略できないケース

ここでは、メソッド呼び出しでドットと括弧を省略することができないケースを確認します。

いくつかケースが考えられるのですが、簡単そうなケースをいくつか紹介します。

### レシーバを明示的に指定しない場合

ひとまず、実行できるケースを確認します。

``` scala
object Main extends App {
    object Shopping {
        def bug(s: String): String = s
    }
    import Shopping.bug
    
    println(bug("hoge"))
}
```

このケースを少し変更して、ドットと括弧を省略してみます。

``` scala
object Main extends App {
    object Shopping {
        def bug(s: String): String = s
    }
    import Shopping.bug
    
    println(bug "hoge")
}
```

コンパイルエラーになることが確認できました。

### パラメータが複数である場合

ここでも、まず実行できるケースを確認します。

``` scala
object Main extends App {
    class Shopping(val product: String) {
        def and(that: Shopping, number: Int): String = s"$number: ${this.product} & ${that.product}"
    }
    
    val book = new Shopping("book")
    val fruit = new Shopping("fruit")
    
    println(book.and(fruit, 234))
}
```

このケースを少し変更して、まずはドットだけ省略してみます。

``` scala
object Main extends App {
    class Shopping(val product: String) {
        def and(that: Shopping, number: Int): String = s"$number: ${this.product} & ${that.product}"
    }
    
    val book = new Shopping("book")
    val fruit = new Shopping("fruit")
    
    println(book and(fruit, 234))
}
```

驚いたことに、コンパイルエラーになりませんでした。

括弧を省略すると、いかにもコンパイルエラーになりそうだったので、ドットだけ省略してみたところ、想定外な結果になりました。

## まとめ

想定外な結果もありましたが、メソッド呼び出しでドットと括弧を省略することができるケースとできないケースを紹介しました。

確認できていないケースもあります。もしかしたら、想定外な結果になるかもしれません。暇なときに確認してみるのも良いかもしれません。

## 参考

- Scala スケーラブルプログラミング [第２版]
Node.js on HerokuでSSL(https)接続を強制する方法


#httpで接続された場合にhttpsでredirectする

```js:server.js
var express = require('express');
var app = express();

app.use(express.static(__dirname + '/public'));

function forceHttps(req, res, next){
  if (!process.env.PORT) {
    return next();
  };

  if (req.headers['x-forwarded-proto'] && req.headers['x-forwarded-proto'] === "http") {
    res.redirect('https://' + req.headers.host + req.url);
  }else {
    return next();
  }
};

app.all('*', forceHttps);

app.get('/', function(req, res) {
  res.sendFile(__dirname + '/public/index1.html');
});

app.set('port', (process.env.PORT || 5000));

app.listen(app.get('port'), function() {
  console.log("Node app is running at localhost:" + app.get('port'))
})

```

##http接続の判定
Herokuを使っている場合はreq.secureを使っての判定ができないようです。
なので`req.headers['x-forwarded-proto'] === "http"`で判定しています。

##ローカル環境ではredirectされないようにする
```
  if (!process.env.PORT) {
    return next();
  };
```

##index.htmlを置くと判定を通らない・・・
index.htmlを置くとhttpアクセスの判定を通らずにファイルを落としてきてしまうためファイル名をindex1.htmlにしています。
AndroidStudioのPostfix Completionで爆速コーディング

AndroidStudioの元になっているIntelliJ IdeaにはPostfix Completionという機能があります。
例えば `変数.par`を入力してエンターを押すと `(変数)`というようにカッコで囲ってくれたりします。
これを利用して爆速でコーディングしましょう！

## .var
`testInstance.var`で
`Test test = testInstance;`
みたいに代入してローカル変数にすることができます。
普通に代入にも使えますが、これは一行が長くなってしまった時に変数に代入して分かりやすくしたりすることができます。

```java
Toast.makeText(context, context.getString(R.string.app_name), Toast.LENGTH_SHORT).show();
```
↓

```java
final String name = context.getString(R.string.app_name);
Toast.makeText(context, name, Toast.LENGTH_SHORT).show();
```

![postfix17.gif](https://qiita-image-store.s3.amazonaws.com/0/27388/6db3c5b5-fa40-5f90-bf59-0895c6dc16ad.gif)


## .field
メンバ変数に代入してくれます。
![postfix12.gif](https://qiita-image-store.s3.amazonaws.com/0/27388/7e33ea47-bd34-960a-fbe7-832ba2a4aa28.gif)

## .notnull (.nnでも可)
NULLチェックのif文が作れます。
![postfix14.gif](https://qiita-image-store.s3.amazonaws.com/0/27388/1ef1ef4b-13d0-0fa8-978b-60c060c9d285.gif)

## .for
Listのインスタンスからfor文作れます
![postfix15.gif](https://qiita-image-store.s3.amazonaws.com/0/27388/44230cce-0c54-55a0-7040-55a1f8484bf8.gif)


他にもいろんなPostfix Completionがあるので試してみてください！(設定から確認できます。)
![image](https://qiita-image-store.s3.amazonaws.com/0/27388/1c5fd4ba-e462-7acf-4cc1-4b18c6584ce2.png)


# Android特化のPostfix Completion
標準では`"test".log`で`Log.d(TAG,"test");`などはサポートされていません。

なので"Android Postfix Completion"というプラグインをリリースしました。
AndroidStudioでPreferences -> Plugins -> Browse repositoriesで"Android Postfix Completion"と検索するとインストールできます。 


|   Postfix Expression  | Description                                                                                                            | Example                                |
| --------------------- | ---------------------------------------------------------------------------------------------------------------------- | -------------------------------------- |
| .toast        | トースト表示                                                                              | Toast.makeText(context, expr, Toast.LENGTH_SHORT).show()                    |
| .log        | メンバ変数に"TAG"があったらそれを利用し、なければクラス名をタグとして利用してロギングする                 | Log.d(TAG, expr)                    |
| .logd        | .logにif (BuildConfig.DEBUG)を追加したもの                 | if (BuildConfig.DEBUG) Log.d(TAG, expr)                    |


![postfix16.gif](https://qiita-image-store.s3.amazonaws.com/0/27388/f2491c4a-d5dc-e196-ec7e-8948e830e6d1.gif)


https://github.com/takahirom/android-postfix-plugin
現在まだ補完できる数が多くないので、こういう補完がほしいなどがございましたらプルリクエストかissueを立てていただけると嬉しいです。
Homebrewの導入手順


# 事前準備
1. インストール：Homebrew  ※頻繁に変更があるため、１行目のコマンドは[本家トップページ](http://brew.sh/)を参照  
1. インストール：Homebrew-cask

```Bash
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew install caskroom/cask/brew-cask
```


# アプリの検索
```Bash
brew cask search
```


# アプリのインストール
```Bash
brew cask install alfred
```


# フェイバリット
```Bash
brew cask install alfred
brew cask install atom
brew cask install bettertouchtool
brew cask install clamxav
brew cask install divvy
brew cask install dropbox
brew cask install eclipse-java
brew cask install evernote
brew cask install google-chrome
brew cask install google-japanese-ime
brew cask install iterm2
brew cask install java
brew cask install keepassx
brew cask install kobito
brew cask install libreoffice
brew cask install sourcetree
```
Pythonで、あるTCPポートに接続できるかを確認する


あるホストが起動するまで待つとか、そういう用途につかったりします。

```python
import sys
import socket
import time
import argparse

parser = argparse.ArgumentParser(description='Check tcp connectivity')
parser.add_argument('--host', dest='host', type=str, help='target host')
parser.add_argument('--port', dest='port', type=int, help='target port')
parser.add_argument('--interval', dest='interval', type=int, default='3', help='interval to check')
parser.add_argument('--retries', dest='retries', type=int, default='3', help='number of retries')
args = parser.parse_args()

def check_tcp_connectivity(host, port, interval=0, retries=1):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    for x in range(retries):
        try:
            s.connect((host, port))
            s.close()
            return True
        except socket.error as e:
            time.sleep(interval)

    s.close()
    return False

if check_tcp_connectivity(args.host, args.port, args.interval, args.retries):
    sys.exit(0)
else:
    sys.exit(1)

```

## 使う

`python check.py --host 192.168.0.1 --port 22`


## 参照

[argparse](http://docs.python.jp/2/library/argparse.html)
[socket](http://docs.python.jp/2/library/socket.html)
[time](http://docs.python.jp/2/library/time.html)
[sys](http://docs.python.jp/2/library/sys.html)
getElementsByClassNameについて

<article>
  <h1>getElementsByClassNameについて</h1>
  <section> 
    <h2>getElementsByClassNameとは？</h2>
    <p>　指定した全てのクラス名を持つ全ての要素への参照を格納した配列。要素リスト。ただし、このメソッド自体は配列型に返り値を出さない！ここが今回ワタシがハマった原因です・・。</p>
    <h2>使い方</h2>
    <ol>
      <li>
        <h3><strong>変数に要素リストを渡す</strong></h3>
        <ul>
          <li>var dummy = document.getElementsByClassName("dummy");
<br>変数に要素リストを渡す！</li>
          <li>dummy[0].style.display="none";<br>配列形式で呼び出しクラスの場所を指定する。</li>
          <li>dummy[1].style.display="none";</li>
        </ul>
     </li>
      <li>
        <h3><strong>callメソッドに要素リストを渡す</strong></h3>
        <ul>
          <li>window.onload = function(){}<br>DOMの読み込みが完了したら実行。この中に処理を書いていく。</li>
          <li>Array.prototype.forEach.call();<br>callメソッドの第一引数に要素リストを渡し、第二引数のfunction(e)で、その配列全体に繰り返し処理で処理をしていく。</li>
        <li>document.getElementsByClassName('dummy')</li>
        <li>function(e){e.style.display="none"}</li>
        </ul>
      </li>
    </ol>
    <section>
      <h3>function(e)とは？</h3>
      <h4>そのイベントの詳細を(e)に返す！(J-Queryイベント)</h4>
<p>例）<br>
altKey: false<br>
bubbles: true<br>
button: 0<br>
buttons: undefined<br>
cancelable: true<br>
clientX: 99<br>
clientY: 47<br>
ctrlKey: false<br>
currentTarget: input#sample<br>
data: null<br>
delegateTarget: input#sample<br>
...(省略)
</p>
    </section>
  </section>
</article>
HerokuでSSL(https)接続する方法

独自ドメインを使う場合です。  

#独自ドメインの設定  
独自ドメインの取得、DNS設定の説明は簡略化します。
 
 - お名前.com等で独自ドメインを取得

 - DNSでCNAME登録
(Rootドメインの場合はCNAMEが使えないところが多いので対応が面倒そうです・・・)
*追記しました: [[追記] ルートドメイン(Naked Domain)の設定方法](#追記-ルートドメインnaked-domainの設定方法)
```ホスト名 : www.ORIGINALDOMAIN.com
Value : APP_NAME.heroku.com
```

#SSL add onの追加
有料($20/month)です。
`heroku addons:add ssl`



#SSL証明書の取得
StartSSLを利用すれば無料で取得できます。
https://www.startssl.com/

StartSSLでの取得方法はググるといろいろ出てくるのでこちらも省略します。
参考 : http://qiita.com/k-shogo/items/870b6d3939dd08da2de4

ただ、ハマった点だけメモしておきます。

##証明書のRevokeは有料！

StartSSLで独自ドメインのSSL証明書を発行してHerokuにアップロードします。
`heroku certs:add server.crt server.key`


このエラーで先に進めず・・・。
`No certificate given is a domain name certificate.`


以下のコマンドで確認すると、なんと秘密鍵と公開鍵の組み合わせが間違っていることが判明・・・。
`openssl x509 -in server.crt -noout -modulus`
`openssl rsa -in server.key -noout -modulus`



StartSSLの画面上で秘密鍵の生成も行ったのですが、ページが重すぎてゴニョゴニョしているうちに秘密鍵をなくした状態で公開鍵を作ってしまっていたようです。
その後、新しい秘密鍵で作りなおしたのですが公開鍵は古いものとペアだったようです。
ほんとのところはよく分かりません・・・。

問題は一度発行した証明書をRevokeするのは有料だということです。
F.A.Qによると$24.90とのこと。

気をつけましょう。

#秘密鍵からパスワードを削除
`openssl rsa -in server.orig.key -out server.key`


#ルートの証明書と中間証明書を結合

StartSSLから証明書を落としてきて、StartSSLで作成した公開鍵と一緒にします。

`wget https://www.startssl.com/certs/ca.pem`
`wget https://www.startssl.com/certs/sub.class1.server.ca.pem`

`cat server.orig.crt sub.class1.server.ca.pem ca.pem > server.crt`

#証明書のアップロード
`heroku certs:add server.crt server.key`
証明書アップロード時に独自ドメインSSL用のEndPointが表示されるのでメモしておきます。

#DNSの設定


SSL用のEndPointはこのコマンドでも確認できます。
`heroku certs --app APP_NAME`

Endpoint(fukui-7777.herokussl.comのようなアドレス)をDNSレコードにCNAME登録します。
(独自ドメイン設定の時にAPP_NAME.heroku.comと設定しているところをSSL用のendpointに書き換えます)

反映が完了したらhttpsで接続できるようになるはずです。


#[追記] ルートドメイン(Naked Domain)の設定方法

以下のページにあるように、PointDNSというサービスを使うと簡単にできます。
http://shindolog.hatenablog.com/entry/2015/02/01/225521

基本的な設定は上記サイトを見ればできると思います。

自分の場合はお名前.comで取得したドメインを使用したのでそちらの設定も書いておきます。
お名前.com側でネームサーバーの変更をする必要があるので、PointDNSのネームサーバー(管理画面のNameServersタブで確認できます)を設定します。

##PointDNS管理画面
![Screen Shot 2016-05-31 at 21.13.53.png](https://qiita-image-store.s3.amazonaws.com/0/38423/54dda8d0-76c8-37fd-06a3-ac4e7bc22407.png)

##お名前.com ネームサーバー変更画面
![Screen Shot 2016-05-31 at 21.16.55.png](https://qiita-image-store.s3.amazonaws.com/0/38423/bc9d565c-f49a-8455-549a-b55c51cf0263.png)


##ルートドメインでSSL接続
SSL接続をする場合は、PointDNSの設定で"[APP_NAME].heroku.com"となっているところをSSL用のEndPoint"~.herokussl.com"に変更します。