OmniAICreator/Qiita-1.07M huggingface dataset:
Swiftの変数や定数が、何故か勝手にlazyになる

宣言時になぜかlazy扱いになることがあるので調べて見たらテストしている方を見つけたのでご紹介したい。

http://seeku.hateblo.jp/entry/2015/03/09/195656

 func testLazy() {

        // ローカル変数
        let lazy4 = LazyTest(name: "lazy4 - let local")

        // それぞれの変数にアクセス
        println("  [1] g_lazy0: \(g_lazy0.name)")
        println("  [2] lazy1: \(lazy1.name)")
        println("  [3] lazy2: \(lazy2.name)")
        println("  [4] Const.lazy3: \(Const.lazy3.name)")
        println("  [5] lazy4: \(lazy4.name)")

[結果]
init: lazy1 - let
init: lazy4 - let local
init: g_lazy0 - let global
  [1] g_lazy0: g_lazy0 - let global
  [2] lazy1: lazy1 - let
init: lazy2 - lazy var
  [3] lazy2: lazy2 - lazy var
init: lazy3 - static let(struct)
  [4] Const.lazy3: lazy3 - static let(struct)
  [5] lazy4: lazy4 - let local
deinit: lazy4 - let local
Apache:暗号化されたWEBサーバーを構築する(mod_ssl)


#SSL(Secure Socket Layer)
インターネットなどのTCP/IPネットワークでデータを暗号化して送受信するプロトコルの一つ。データを送受信する一対の機器間で通信を暗号化し、中継装置などネットワーク上の他の機器による成りすましやデータの盗み見、改竄などを防ぐことができる。

SSLを使ったHTTPをHTTPSと呼び、URLは「https://」から始まる
##SSLの機能について

###相互認証
通信相手のサーバーやクライアントが信用できるかどうか調べる。
通信相手の証明書をCA(Certificate Authority:認証局）を介して検証することで認証を行い、サーバーやクライアントの成りすましを防ぎ安全な通信を確保する。
###データの完全性
データが改竄されていないかどうか調べる。電子著名という技術を使い、データが確かに相手から送られてきたものかどうか、送信されたすべてのデータが届いているかどうかを確認できる。

###プライバシー
データの盗聴を防ぐ。通信内容を暗号化することで、通信途中のデータを盗み見られないようにする

##ApacheでSSL導入に必要なソフトウェア
###OpenSSL
SSL機能を提供するオープンソースのソフトウェア。
###mod_ssl
OpenSSLを使ってApacheをSSLに対応させるモジュール。

##CAに認証してもらう仕組み
SSLにはCA(Certificate Authority:認証局）という概念があり、CAがWebサーバーが本物であるかどうか証明することで、Webサーバーの成りすましを防ぐ。
SSLに対応したWebサイトを構築するときに、CAに自分のWebサイトを登録し証明書を発行してもらう。Webサーバーは証明書をWebブラウザに送り、Webブラウザは自身の持っているCAの情報を元に送られた証明書が正しいかどうか判断する。Webブラウザに登録されていないCAが発行した証明書の場合、ユーザーに証明書を信用するかどうか。ダイアログボックス等で確認を求める。

###有名なCA
- ベリサイン
- グローバルサイン
- サイバートラスト

###証明書発行手順
1.CSR(Certificate Signal Request)ファイルをCAに送る
2.証明書(Certificate)が送られてくる。この証明書をCSRファイルと同じディレクトリに置き、ssl.confのSSLCertificateFileという項目に証明書のファイル名を設定する


# ApacheからSSLを使えるようにする（mod_ssl）

##mod_sslモジュールを追加する
OpenSSLの開発用ライブラリをインストールする

```
$ yum install openssl-devel

```
コンパイルとインストール

```
#
#
$ cd /home/vagrant/src/httpd-2.2.27/modules/ssl/
$ /usr/local/apache2/bin/apxs -cia -DHAVE_OPENSSL -I/usr/include/openssl -lssl *.c
```

#テスト用の証明書を作成する
##証明書を作る
Webサーバーの鍵を作る

```
# -des3			:ファイル暗号化はDES3方式を指定
# server.key	:生成する鍵のファイル名
# 1024			:鍵の長さ
$ openssl genrsa -des3 -out server.key 1024
```
証明書を作る

```
# -days 3650 		:有効期限3650日
# -key server.key	:サーバー鍵のファイル
# -out server.csr	:生成する証明書のファイル
#	
$ openssl req -new -days 3650 -key server.key -out server.csr
```
テスト用に自己署名する

```
# テストのために正式なCAの代わりに自分で証明書に著名する
$ openssl x509 -req -signkey server.key -days 3650 -in server.csr -out server.crt
```
鍵のパスフレーズを解除する

```
$ mv server.key server.key.bak
$ openssl rsa -in server.key.bak -out server.key
```
##ApacheにSSLを設定する
SSLの設定をする

```
$ vi /usr/local/apache2/conf/httpd.conf
```
```httpd.conf
# Secure (SSL/TLS) connections
Include conf/extra/httpd-ssl.conf
```
```
$ vi /usr/local/apache2/conf/original/extra/httpd-ssl.conf
```
```ssl.conf
Listen 443
#~
#~
<VirtualHost _default_:443>

#   General setup for the virtual host
DocumentRoot "/usr/local/apache2/htdocs"
ServerName www.example.com:443
ServerAdmin you@example.com
ErrorLog "/usr/local/apache2/logs/error_log"
TransferLog "/usr/local/apache2/logs/access_log"

SSLCertificateFile "/usr/local/apache2/conf/server.crt"
SSLCertificateKeyFile "/usr/local/apache2/conf/server.key"

</VirtualHost>

```

設定を反映する

```
$ /usr/local/apache2/bin/apachectl startssl
```

https://example.com/  にアクセスする
ビットコインのハードウェア・ウォレット BTChip HW.1 セットアップ方法

以下に移行しました<br><a href="http://block-chain.jp/tech/bitcoin-hardware-wallet-btchip-hw-1/" title="ビットコインのハードウェア・ウォレット BTChip HW.1 セットアップ方法">ビットコインのハードウェア・ウォレット BTChip HW.1 セットアップ方法</a>
IE8 で 透過PNG に jQuery で フェード効果 をかけた際、透過部分が黒くなった場合の対処法

IE8 の場合だけ直接画像に対して以下の JavaScript が動作すようにする。
実際使うときは$( 'img.png' ) のようにクラスを当てて PNG 画像のみに効くようにさせる。

```
//Javascript
$( 'img' ).each(function(){
	$( this ).css({
		'filter': 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src="' + $( this ).attr( 'src' ) + '", sizingMethod="scale");'
	});
});
```
---
**実装時の注意**
次のようなHTMLがあったとして

```
<div class="img_wrap">
	<img src="Logo.png" class="png">
</div>
```

フェード効果をかける場合は次のように PNG画像 を囲っている要素 ( 上の場合 div ) にあてるとキレイにフェードしてくれます。

```
//Javascript
$( 'img_wrap' ).fadeIn(10000);
```

---
**次のようにすると効果がなくなる**

1.CSSで画像に position: absolute をあてている場合。

```
img{
	position: absolute;
}
```
2.フェード効果を加える対象(ここでは div )の子要素に position: absolute をあてている要素が含まれる場合。
フェードする際だけJavaScriptで absolute のあたっている子要素を static に変更するなどすると解決する。

```
<div>
	<p>
		<img src="Logo.png" class="png">
	</p>
</div>
```
```
div{
	/*いろいろ*/
}
p{
	position: absolute;
}
```

3.フェード効果を画像に直接かける

```
//Javascript
$( 'img' ).fadeIn(10000);
```
Lubuntu（LXDE）でCtrlとCapsLockの入れ替え

最近、Ubuntuのデスクトップ環境の中で最軽量と言われる[Lubuntu（LXDE）](http://ja.wikipedia.org/wiki/Lubuntu)にUnityから移行してみた。CtrlとCapsLockキーの入れ替えを永久化したときのメモ。

現在のセッションでキーマップの変更を行う場合は`setxkbmap`コマンドを用いる。例えば、この投稿でやりたいCtrlとCapsLockの切り替えをしたい場合は、以下。

```
setxkbmap -option "ctrl:swapcaps"
```

デフォルトに戻すときは、

```
setxkbmap -option
```

で良いらしい。

で、これを永久化（ログインしなおしても有効）にしたいときはいろいろとやり方があるようだが、自分の環境では`~/.config/lxsession/Lubuntu/autostart`というファイル（なければ作成）に

```
@setxkbmap -option "ctrl:swapcaps"
```

という１行を追加したらログインしなおしてもキーマップの変更が有効になっていた。`@`で始まる行はコマンドの実行を意味するそうです。
詳しいことは知らないですが、とりあえず動作したものの一例として共有しました。
APIのRubyラッパーを作ったときの日記


## 経緯
Ruby1年間使ってたけど、よく思ったらRailsに頼りっぱなしじゃない？
もうそろそろ20歳になるし、何か作らないと…

そういえば、最近タスク管理にWunderlistを使い始めた。
せっかくだし自分のタスクをしっかりと管理できるように、
githubのイシューをWunderlistに同期するための
Rubyスクリプトを書こう！！！となりました。

が！！！

Wunderlist APIのRubyラッパーで
まともに動くものがなかった…。

なら自分で作ろう！！！

という流れでWunderlistAPIのRubyラッパを作る事になりました。

## 成果物

**wunderlist-api(ver 0.7.1)**
11/25更新
https://github.com/shun3475/wunderlist-api

Rubygems
https://rubygems.org/gems/wunderlist-api

## 日記

### 3/21
わからない。
そういえばgemでライブラリ作ったことなかったなー。
何をやればいいのかすらわからない。
とりあえず、

```
$ bundle gem wunderlist-api -t
```
って入力したらなんかいろいろファイルできた。
満足して寝た。

### 3/22
RubyのHTTPクライアントにはFaradayとかいうやつが便利らしい！
GitHubAPIのRubyラッパもFaraday使ってるし、
業務で使ったことあるし、とりあえず使ってみよう。

あれ？でも認証できない？
HTTPリクエストの時に、ヘッダにACCESS_TOKENとCLIENT_IDを
付けなきゃいけない？？

ふむふむ。
curl -H 的なことすればいいのかな…？
わからない。

しかし、Faradayの便利さと、気合でACCESS_TOKENを取得！
とりあえずはAPIにアクセスできるようになった。

そして、タスクの取得、作成、リストの取得ができるようになった。
なんかActiveModelみたいにデータ取りたいな…って思い始める。

### 3/23
クラスのうまい使い方を初めて知る。
Wunderlist::TaskクラスとWunderlist::Taskクラスにsaveメソッドを実装。
ちゃっかり公開してたgemが100ダウンロードを突破！
調子に乗って、Twitterに投稿したら
![スクリーンショット 2015-03-24 01.58.01.png](https://qiita-image-store.s3.amazonaws.com/0/47744/9704b906-27c1-414b-29db-418c6d9f4e1d.png)
とか来てテンションが↑↑になってひたすら開発をした。
めっちゃテンション上がって２時までコード書いてた。

### 3/24
かなり進捗が生まれた。
spec.add_dependencyの設定をしていなかったせいで、
穴にハマりかけるも、なんとか脱出。
リスト,タスク,ノート,コメントについてはActiveRecordっぽく生成できるようになりました。
コード書いてたら、いつの間にか20歳になってた…つらい。

## 使い方

``` README.md

# You must create API CLIENT at first.
wl = Wunderlist::API.new({
:access_token => <your access token>,
:client_id => <your client id>
})


# You can create Task
task = wl.new_task(LIST_NAME, {:title => 'Hello World', :completed => true, :due_date => '2015-03-25' })
=> #<Wunderlist::Task:0x00000000000>
task.save 

# You can delete Task
task.destroy
=> #<Wunderlist::Task:0x00000000000>
task.id
=> nil

# You can get Wunderlist::List Object
list = wl.list(LIST_NAME)
=> #<Wunderlist::List:0x00000000000>

# You can change List name
list.title = "IMOKENPI"
list.save


# You can get Wunderlist::Task Object Wrapped by Array
tasks = list.tasks
=> [#<Wunderlist::Task:0x00000000000>, #<Wunderlist::Task:0x11111111111>, ...]

or

tasks = wl.tasks([LIST_NAME1, LIST_NAME2])
=> [#<Wunderlist::Task:0x00000000000>, #<Wunderlist::Task:0x11111111111>, ...]

# You can create and update note.
note = task.note
=> #<Wunderlist::Note:0x00000000000>
note.content = "Hello World"
note.save

```


## 参考にさせていただいたサイト
* mitukiii / faraday.md (https://gist.github.com/mitukiii/2775321)
* 君がOpsでもRubyで書いたライブラリはGemで配ろう(http://qiita.com/sawanoboly/items/ede7715c605e5822ad22)


随時更新
ActiveDecoratorでdecorateしたオブジェクトのhas_one/belong_to先のオブジェクトが自動でdecorateされるようにする

## シチュエーション

本来ならば、association先のオブジェクトの内容を描画する部分はpartialのtemplateに切り出すべきであろう、という思想のもとにactive_decoratorは作られていますが、それが難しい、あるいはやると逆に記述が煩雑になる場合があります。そういう場合の選択肢として。

## 実装

```rb
module AssociationDecorator
  def reader(*args)
    result = super
    if self.owner.is_a?(ActiveDecorator::Helpers)
      ActiveDecorator::Decorator.instance.decorate(result)
    end
    result
  end
end

module ActiveRecord
  module Associations
    class SingularAssociation
      prepend AssociationDecorator
    end
  end
end
```

今回はやってないですが、CollectionAssociationに同様にprependすることでhas_manyにも対応できるはずです。
ActiveRecord の IN 演算子でサブクエリを扱う

自ブログにも書いた内容ですが、こちらにも再掲します。

http://oakbow.hatenablog.com/entry/2015/03/24/012411

要約すると、配列を条件のパラメータとして与えることで IN 演算子を使うことは Rails3 の頃からできていましたが、同じ書式でサブクエリも扱えるよ、というお話です。

IN 演算子は SQLでは以下の二通りの書き方が可能ですが、ActiveRecord においても、下記のクエリがどちらも使えます。

```sql
SELECT * FROM users WHERE id IN (1,5,7,10,50...)

SELECT * FROM users WHERE id IN (SELECT user_id FROM presences WHERE ...) 
```

後者については Arel を使うか [Squeel](https://github.com/activerecord-hackery/squeel) を使うしかないと思い込んでいたので、新鮮な驚きでした。


## こんな感じで使えます

Student（学生）モデルとReport（レポート）モデル、Credit（単位）モデルがあるとします。

Student：Report は1対多、Student：Credit は1対1の関係にあります（話を簡単にするため、教科の概念をなくしています）。

ここで、最終レポートを提出した学生全員に単位を与える処理を考えてみましょう。

アプリケーションサイドから素直に考えた場合、こんなコードになると思います。


```ruby
 student_ids = Student.joins(:reports).where('reports.type= ?', :final).pluck(:id)

 Credit.where('student_id IN ? ', student_ids).update_all(grate: 'good')
```

SQL はこんな感じになります。

```sql
SELECT students.id 
FROM students 
INNER JOIN reports ON students.id = reports.student_id 
WHERE reports.type = 'final'

UPDATE credits SET grade = 'good' WHERE student_id IN (1, 5, 12, 33, 156, ...)
```

でもこれ、こう書けるんですね。

```ruby
 student_ids = Student.joins(:reports).where('reports.type= ?', :final).select(:id)

 Credit.where(student_id: student_ids)

```

SQL はこうなります。↑と違って一回だけ発行されます。

```sql
UPDATE credits 
SET grade = 'good' 
WHERE student_id IN (
  SELECT students.id 
  FROM students 
  INNER JOIN reports ON students.id = reports.student_id 
  WHERE reports.type = 'final')

```

そう。
同じ書式のままで、配列でも ActiveRecord::Relation でも受け取ってくれるんです。SQL の IN 演算子と似ていて、非常に直観的ですね。これはすごい。
Rails3 で Squeel が入った状態から始めた私はいまいち素の AR にできることできないことをちゃんと把握できていないんですが、これ、Arel 使わないとできないと思ってました。。


## サブクエリのすすめ

前者は SQL を二回発行して、まずレポートを提出した学生の ID 一覧を取得し、その後学生の ID 一覧に合致する単位データを一括で「良」に更新しています。
後者は SQL の発行回数は一回。レポート提出者の学生の ID の集合を取得し、その集合に合致する単位データを更新しています。

データ量が少なければ微々たる差しかありませんが、どの RDBMS でもほぼ確実に後者の方が速いです。

SQL というのは集合を扱うことに関しては非常に優れていて、集合の状態のまま条件としてうまく渡して一度で処理できると、特にデータ量が増えてきたときにものすごい差になって来るんです。
なので可能な限り後者の形で発行してあげる必要があります。
集合の扱いに関しては通常の言語が及ぶことはまずないので、配列やハッシュでいったん受け取って加工して…などということは基本的に考えない方がいいです。

サブクエリは遅いこともある。。。という話をSQL初級講座的なものを読んで避けようとする方もいると思いますが、それはサブクエリじゃない通常のクエリとの対比の話であって、ネイティブコードで実行される、集合処理に特化した命令（SQL）の代わりに、Ruby で配列処理やっても余計に遅くなるだけなので、素直にサブクエリ使いましょう。

もちろん例外はありますが、基本的には SQL の発行回数が少なければ少ないほど速いです。


## 実際に遭遇したコードに近いもの

今回の話はコードレビューで知りました。

本物のコードは上の例とは違って、「最終レポートを提出していない学生をすべて不可にする」という感じの処理をやっています。

同じではありませんが、こんなコードになっています。

Report モデルは、レポートの提出がないとレコードが生成されません。


```ruby
 student_query =
      Student
      .joins(
        sanitize_sql_array([<<-SQL, :final])
          LEFT OUTER JOIN reports
            ON students.id = reports.student_id
              AND reports.type = ?
        SQL
      )
      .where("reports.student_id IS NULL").select(:id)

  Credit
  .where(student_id: student_query)
  .update_all(grade: 'not_good')
```

こんな感じ。
`sanitize_sql_array` はプレースホルダのために利用しています。

結合条件を AR4 で書けると良いのですが、そこまではさすがにできないのでこんな書き方をしています。

## 最後に

ここに書いたコードやクラスは説明のために頭で考えたミニマムコード（例として十分な最小限のコード）です。

実際に動かしている訳ではないので不備がある可能性があります。

記事の内容やコードに間違いがありましたらご連絡ください。

可能な限り補足修正したいと思います。
Subroutine ... redefined の警告を抑制する方法

# 結論

こう書く。
```
no warnings 'redefine';
```

# 経緯

MovableTypeをいじっていたらこんな警告が出てしまいました。

```
Subroutine MT::Template::SUPER::text redefined at /mt/extlib/Data/ObjectDriver/BaseObject.pm line 638.
```

`sub AUTOLOAD`というサブルーチンの中で発生していたようです。
Perlのオートロードまわりはよくわかっていないのですが、とりあえず上記のように書いたら警告を抑制することができました。
Ansibleでvagrant plugin install


AnsibleでMacの開発環境を整える際にぶち当たった問題。
`vagrant plugin install`は既にインストールされていてもそのまま強制的に上書きインストールを始めてしまう。

シェルスクリプトでBrewfile的なものを書いていた時は簡単にインストールをスキップする処理を書けたが、ansibleで同じことを実現するのにやや詰まったのでメモ。

## いままで

今までは以下のようにしていたから少し気持ち悪かった。

```yaml:vagrant-plugin-install.yml
---
- hosts: localhost
  connection: local
  gather_facts: no
  tasks: 
    - name: Install Vagrant Plugins
      shell: "vagrant plugin list | grep {{item}} || vagrant plugin install {{item}}"
      with_items:
          - vagrant-omnibus
          - vagrant-vbguest
          - vagrant-cachier
          - vagrant-vbox-snapshot
          - vagrant-aws
          - vagrant-digitalocean
```

これだと、以下のようにitem全てについてchangedが出てしまう。しかもループごとに毎回`vagrant plugin list`を実行するので遅い。

## 見つけた解

一つのスマートな解として以下の様なものに落ち着いた。

```yaml:vagrant-plugin-install.yml
---
- hosts: localhost
  connection: local
  gather_facts: no
  tasks: 
    - name: List Installed Vagrant Plugins
      shell: "vagrant plugin list | awk '{ print $1 }'"
      changed_when: false
      register: vagrant_plugin_list

    - name: Install Vagrant Plugins
      shell: "vagrant plugin install {{item}}"
      with_items:
        - vagrant-omnibus
        - vagrant-vbguest
        - vagrant-cachier
        - vagrant-vbox-snapshot
        - vagrant-aws
        - vagrant-digitalocean
      when: item not in vagrant_plugin_list.stdout_lines
```

出力は以下。

```bash

ASK: [List Installed Vagrant Plugins] ****************************************
ok: [localhost]

TASK: [Install Vagrant Plugins] ***********************************************
skipping: [localhost] => (item=vagrant-omnibus)
skipping: [localhost] => (item=vagrant-vbguest)
skipping: [localhost] => (item=vagrant-cachier)
skipping: [localhost] => (item=vagrant-vbox-snapshot)
skipping: [localhost] => (item=vagrant-aws)
skipping: [localhost] => (item=vagrant-digitalocean)
```

1つ目のtaskで`vagrant plugin list`の出力をregisterしておく。awkで一つ目のフィールド（プラグイン名のみ）を取り出す。

2つ目のtaksでループ。ただし1つ目のタスクの出力で出ていないもののみ実行。

ポイントは`stdout_lines`でした。`grep`芸で実行するよりもスマートで、シェルシェルしないAnsibleらしいものになったかなと。

ただ`skipping`より`ok`のほうが気持ちがいい・・・。`ok`にする方法は今後思いついたら書く。
nbviewerでスライド表示もできるようになった！【Jupyter】

#nbviewerでスライド表示ができるようになった！

[IPython Notebook](http://ipython.org/notebook.html)や、[IRuby](https://github.com/minad/iruby)、そしてそれらをまとめたものである[Jupyter](https://jupyter.org/)を使っている方は、[nbviewer](http://nbviewer.ipython.org/)というNotebookの共有サービスをご存知かと思います。このサービスはGithubに公開されているノートブックを自動でHTMLにレンダリングして表示してくれるというもので、これまでも様々なノートブックが共有されてきました。僕も、自分の研究室での発表の際に、発表資料をIPython Notebookで作成し、そのスライドショー機能を使って発表し、レジュメとして、nbviewerのサイト内の自分のURLを共有するなどして活用していました。しかし、nbviewerではスライドとして作成したものではなく、通常のノートの形でしか表示ができませんでした。
しかしながら、最近（正確には調べていないのでわかりませんが）nbviewerの中でも、共有されたノートブックをスライドショー形式にして閲覧することが可能になりました！

#例

例えば以前『[IPython 3.0.0-dev、IPython Notebookで"LIVE"なHTMLプレゼンテーション](http://qiita.com/ssh0/items/a67b84110c5d9e0adeda)』として作ってみたノートブックも、以下のURL

http://nbviewer.ipython.org/format/slides/github/ssh0/ipython/blob/master/Slide_tut.ipynb#/

を見ていただくと分かるように、スライドショーとして共有することができています。

![screen_005.jpg](https://qiita-image-store.s3.amazonaws.com/0/54869/881dbeff-53a6-5e41-4967-65500f10cc00.jpeg)

スライドショーの表示に切り替えるには、通常のノートブックの画面で、右上の

![screen_003.jpg](https://qiita-image-store.s3.amazonaws.com/0/54869/69ccf1f3-841a-ad35-c84b-97f6c3809047.jpeg)

を押すことでスライド表示に切り替えることができます（当然スライドの属性をつけていないノートブックはスライドとして意味のある表示はできません）。

また、スライド表示画面から元のノート表示に戻す際は同じ位置の

![screen_004.jpg](https://qiita-image-store.s3.amazonaws.com/0/54869/2b5c22d9-a909-ce41-3927-cfb51634cdb7.jpeg)

のアイコンを押すことによって元に戻ります。スライドの遷移方法はNotebook内のものと同じで、矢印ボタンをクリックするか、左右の矢印キーで横方向の移動、「PageUp」・「PageDown」キーで上下の移動等ができます。

# 活用方法

発表の際に自分のPCを使用できない場合など、IPython Notebookを立ちあげられない場面はあるかもしれません。そういった場合でも、ブラウザさえ立ち上げられれば、スライドが見れるわけなので、これは便利になるかもしれません。また、単純に共有した際にも同じようなレイアウトで聴衆に見せることができるわけなので、親切で見やすくなることは言うまでもありません。

現時点でいまいちな点をあげさせてもらうとすれば、共有したスライドはデフォルトのテーマやレイアウトなので、自分のところで表示するものとは異なったものになってしまうという点です。微妙なレイアウトの調整などはNotebookそのものの設定を変更する方法が主だと思うので、それがノートブック自体に埋め込まれるような設計にならないかぎり、レイアウト自体を含めた調整は難しいのかもしれません。しかし、開発スピードがとても早いプロジェクトなので、今後どうなるかはまだわかりませんね。

#終わりに

ぜひ、みなさんもプレゼン資料（特に技術系）はIPython Notebookで作って、それをnbviewerで共有するようにしていただけると、後でまるっとダウンロードして自学のために使ったり、その場で手元のPCで同じ画面を見て発表を聞いたりすることができるので、いろんな人にとってプラスなんじゃないかと思います。僕もかなりそうやっていろんな方のノートブックを見て勉強させてもらっている立場なので。新しい知の共有プラットフォームになりうるのか！？
jersey+spring+mybatisでREST APIを作成したときに使ったライブラリ

java6縛りで、jersey + spring + mybatis でREST APIを開発したときに使ったライブラリ。
Guavaがあると、初歩的な関数型プログラミングのようなことができる。scalaの開発案件直後だったので、結構助かった。

# ログ

* logback 
 
  http://logback.qos.ch/

  web.xmlで使うリスナー
  https://github.com/qos-ch/logback-extensions/wiki/Spring

* AspectJ

  AOPで、サービス、リソースクラスのメソッドは開始と終了時にログ出力
  https://eclipse.org/aspectj/

# 日付・時刻

* joda-time
  http://www.joda.org/joda-time/

# ファイル操作

* commons-io
  http://commons.apache.org/proper/commons-io/

# エンコード、デコード

* commons-codec
  http://commons.apache.org/proper/commons-codec/

# 暗号化・復号化

* jasypt
  http://www.jasypt.org/

# JSON

* Jackson (Jerseyに含まれているものを使用)
  http://jackson.codehaus.org/

# メール送信

 * commons-email
   https://commons.apache.org/proper/commons-email/

# テンプレート

 * Handlebars.java
   https://github.com/jknack/handlebars.java

# ユーティリティ
 
 * commons-lang
   https://commons.apache.org/proper/commons-lang/

 * Guava (Jerseyに含まれているものを使用)
   主に関数型プログラミング的なことをするため
   https://code.google.com/p/guava-libraries/ 

 * Lombok
   http://projectlombok.org/index.html


# コード生成
 
* Mybatis Generator
  http://mybatis.github.io/generator/index.html

# テスト

 * JUnit 
   http://junit.org/

 * junit-hierarchicalcontextrunner
   テストの構造化のため
   https://github.com/bechte/junit-hierarchicalcontextrunner/wiki

 * DbUnit
   テストデータの用意、期待するデータとテーブルとの比較
   http://dbunit.sourceforge.net/
   
 * Mockito
   テストでのモック注入
   https://code.google.com/p/mockito/
Silex\Application::run()の実行順序

[EC-CUBE3](https://github.com/EC-CUBE/ec-cube)で採用される、[Silex](http://silex.sensiolabs.org/)についてソースコードを追っかけてみました。

# コード
とりあえずサンプルで置いてある,以下コードの中身をみてみる

```php
require_once __DIR__.'/../vendor/autoload.php';

use Silex\Application;

$app = new Application();

$app->get('/hello', function () {
    return 'Hello!';
});

$app->run();

```

# コンストラクタ
まず、new Silex\Application();から。
コンストラクタでは、コンテナに諸々詰め込んでいるだけ。

```php
public function __construct(array $values = array())
    {
        parent::__construct();

        $app = $this;

        $this['logger'] = null;

        $this['routes'] = $this->share(function () {
            return new RouteCollection();
        });
...
```

気になったのはこの辺。

```php
     $this['request.http_port'] = 80;
     $this['request.https_port'] = 443;
     $this['debug'] = false;
     $this['charset'] = 'UTF-8';
     $this['locale'] = 'en';
```

http/httpsのポート番号やロケールなどは、newするタイミングで設定する模様。でもたぶん後からでも変更は可能かも。

# Application::run()
```php
$app->get('/hello', function () {
    return 'Hello!';
});
```
はいったん飛ばして

```php
$app->run();
```
の箇所

run()の実装は以下の通り

```php
   public function run(Request $request = null)
    {
        if (null === $request) {
            $request = Request::createFromGlobals();
        }

        $response = $this->handle($request);
        $response->send();
        $this->terminate($request, $response);
    }
```
$requestを生成して、handle()メソッドに渡してる。
handle()をみてみる。


つづく(ねむたい)
rails new

プロジェクト作成
$ gem install bundler
$ mkdir project
$ cd project
$ bundle init
Writing new Gemfile to /path/to/project/Gemfile

$ vi Gemfile
# A sample Gemfile
source "https://rubygems.org"

gem "rails"

$ bundle install --path vendor/bundle
$ bundle exec rails new . --skip-test-unit --skip-bundle -d mysql

2. Gitにプロジェクトを登録
git init
git add .
git c -m "initial commit"

3. Gemを導入
cp gem file
bundle install --path vendor/bundle

4. gemの設定
rails g config:install

5. development.rbを更新
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
    address: "localhost",
    port: 25,
    domain: "localhost.localdomain"
  }

  # Specify what domain to use for mailer URLs
  config.action_mailer.default_url_options = {host: "localhost:3000"}

  config.after_initialize do
    Bullet.enable        = true
    Bullet.alert         = true
    Bullet.bullet_logger = true
    Bullet.console       = true
    Bullet.raise         = true
    Bullet.add_footer    = true
  end

6.規約準拠確認
bundle exec rubocop
--auto-correct

必須jquery
jquery.bootstrap-growl.min
jquery.livequery.min

rails g scaffold user --skip-view-specs --skip-controller-specs --skip-routing-specs --skip-request-specs --skip-jbuilder --skip-stylesheets
Redmine(v3.0.0)を最速でお試しするためのVagrantfile


とりあえずRedmineをお試ししたいときに。

- Ubuntu trusty 64bitのVM
- shellscriptでプロビジョニング
- rbenv + ruby-buildでruby 2.2.1をインストール
- DBはSQLite
- sshで入って`RAILS_ENV=production bundle exec rails s -b 0.0.0.0`で起動
- ホストから http://127.0.0.1:3001 で表示

## Vagrantfile

```
# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = 2

script = <<SCRIPT
sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get install -y git build-essential libssl-dev libffi-dev
if [ ! -d "$HOME/.bashrc.d" ] ; then
    mkdir $HOME/.bashrc.d
fi
git clone https://github.com/sstephenson/rbenv.git $HOME/.rbenv
echo 'export PATH=$HOME/.rbenv/bin:$PATH' > $HOME/.bashrc.d/rbenv.sh
echo 'eval "$(rbenv init -)"' >> $HOME/.bashrc.d/rbenv.sh
echo 'source $HOME/.bashrc.d/rbenv.sh' >> .bashrc
source $HOME/.bashrc.d/rbenv.sh
git clone https://github.com/sstephenson/ruby-build.git $HOME/.rbenv/plugins/ruby-build
rbenv install 2.2.1
rbenv rehash
rbenv global 2.2.1
rbenv rehash
ruby -v
gem install bundler
# for sqlite3
sudo apt-get install -y sqlite3 libsqlite3-dev
# for rmagick gem
sudo apt-get install -y imagemagick libmagickwand-dev
wget http://www.redmine.org/releases/redmine-3.0.0.tar.gz
tar xzf redmine-3.0.0.tar.gz
cd redmine-3.0.0
# config/database.yml
echo 'production:' > config/database.yml
echo '    adapter: sqlite3' >> config/database.yml
echo '    database: db/redmine.sqlite3' >> config/database.yml
RAILS_ENV=production bundle install --path vendor/bundle
RAILS_ENV=production bundle exec rake db:migrate
RAILS_ENV=production bundle exec rake generate_secret_token
echo'execute "RAILS_ENV=production bundle exec rails s -b 0.0.0.0" to start redmine'
SCRIPT

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "ubuntu/trusty64"

  config.vm.network "forwarded_port", guest:3000, host:3001

  if Vagrant.has_plugin?("vagrant-proxyconf")
    config.proxy.http = ENV['http_proxy']
    config.proxy.https = ENV['https_proxy']
    config.proxy.no_proxy = "localhost,127.0.0.1"
  end
  
  config.vm.provision "shell", inline: script, privileged: false
end
```
hugoでMarkdownのincludeを実現する方法


hugoで記事の一部を共通化したくなったのですが、共通記事をMarkdownで書けて、includeするという機能がhugo 0.13には無かったので、なんとかincludeを実現する方法を考えてみました。

まず運用として、共通記事はpartsというセクションに作ることにしてください。セクション名を決め打ちにしておくことで、テンプレートを使える、サイトマップやRSSに共通記事を出さないようにする、といったメリットが出ます。

## `include`というshortcodeを自作する

```html:layout/shortcodes/include.html
{{ $filename := index .Params 0 }}
{{ range .Page.Node.Site.Pages }}
  {{ if eq .Source.File.Path $filename }}
    {{ .Content }}
  {{ end }}
{{ end }}
```


## 共通記事用のテンプレートを作る

Hugoの不具合？で、共通記事の投稿日がinclude元記事の投稿日よりも古いか、共通記事のweightがinclude元記事のweightより大きい場合に、コンテンツの読み込みに失敗することがあるようです。これを回避するために、意図的にweightを下げた共通記事用テンプレートを容易しておきます。

```markdown:archetypes/parts.md
---
date: "2012-04-06"
weight: -999999
# This weight is to prevent content loading issue.
# If partial post is older or lighter than main post,
# the partial post sometimes be not loaded.
# This seems to be Hugo's bug.
---
```

このテンプレートはファイル名が重要です。Hugoはテンプレートのファイル名をセクション名として認識します。つまり、parts.mdの「parts」の部分はセクション名として解釈されます。従って、`hugo new parts/common.md`とすると、自動的にこのテンプレートをベースに共通記事が新規作成されるようになります。

## contentsに共通記事を作る

共通化したいコンテンツを通常の記事と同じように、新規記事作成します。この共通部品はSitemapとRSSから除外するため`contents/parts`にまとめる運用を行ってください。

```
hugo new parts/common.md
```

## 共通記事をincludeする


```markdown
---
date: 2015-03-23T23:26:39+09:00
description: null
slug: null
tags: []
title: article
---

{{% include "parts/common.md" %}}
```


## Sitemapからparts sectionを除外する

共通記事がcontentsに入っているとSitemapに掲載されるので、カスタムのサイトマップテンプレートを作って除外します。

```xml:layout/sitemap.xml
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  {{ range where .Data.Pages "Section" "!=" "parts" }}
  <url>
    <loc>{{ .Permalink }}</loc>
    <lastmod>{{ safeHtml ( .Date.Format "2006-01-02T15:04:05-07:00" ) }}</lastmod>{{ with .Sitemap.ChangeFreq }}
    <changefreq>{{ . }}</changefreq>{{ end }}{{ if ge .Sitemap.Priority 0.0 }}
    <priority>{{ .Sitemap.Priority }}</priority>{{ end }}
  </url>
  {{ end }}
</urlset>

```

## RSSからparts sectionを除外する

共通記事がcontentsに入っているとRSSに掲載されるので、カスタムのRSSテンプレートを作って除外します。


```xml:layout/rss.xml
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
      <title>{{ .Title }} on {{ .Site.Title }} </title>
      <generator uri="https://gohugo.io">Hugo</generator>
    <link>{{ .Permalink }}</link>
    {{ with .Site.LanguageCode }}<language>{{.}}</language>{{end}}
    {{ with .Site.Author.name }}<author>{{.}}</author>{{end}}
    {{ with .Site.Copyright }}<copyright>{{.}}</copyright>{{end}}
    <updated>{{ .Date.Format "Mon, 02 Jan 2006 15:04:05 MST" }}</updated>
    {{ range first 15 (where .Data.Pages "Section" "!=" "parts") }}
    <item>
      <title>{{ .Title }}</title>
      <link>{{ .Permalink }}</link>
      <pubDate>{{ .Date.Format "Mon, 02 Jan 2006 15:04:05 MST" }}</pubDate>
      {{with .Site.Author.name}}<author>{{.}}</author>{{end}}
      <guid>{{ .Permalink }}</guid>
      <description>{{ .Content | html }}</description>
    </item>
    {{ end }}
  </channel>
</rss>
```
GenymotionからローカルのRailsサーバにつなぐ方法


```
$ ifconfig vboxnet0

vboxnet0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        ether 0a:00:27:00:00:00 
        inet 192.168.56.1 netmask 0xffffff00 broadcast 192.168.56.255
```

inetになっている`192.168.56.1:3000`でandroidデバイスから見えればおｋ
【俺メモ】CentOS6.5にnodebrewでnode.jsをインストール

なぜ、いまさらCentOS6.5かというとConoHaVPSの標準バージョンやねん。
VPSを借りるのお金がかかるので検証はVMWareでやるわ。

```shell-session
wget git.io/nodebrew --no-check-certificate
perl nodebrew setup
```

--no-check-certificateオプションがないと怒られたのでつけた。

.bashrcをnanoエディタで編集すんで。

```shell-session
nano ~/.bashrc

export PATH=$HOME/.nodebrew/current/bin:$PATH　#この一文をファイルの最後に追記や
```

んで、再読み込みっと。

```shell-session
source ~/.bashrc
```

バージョンを確認するで。

```shell-session
nodebrew --version
nodebrew 0.8.1
```

こうなればOKやで。
[iOS]正確的なタイマーは？

今日NSTimerのReferenceをよく読んでみたら、一つ今まで知らなかったことを見つかりました。

> A timer is not a real-time mechanism; it fires only when one of the run loop modes to which the timer has been added is running and able to check if the timer’s firing time has passed. Because of the various input sources a typical run loop manages, the effective resolution of the time interval for a timer is limited to on the order of 50-100 milliseconds. If a timer’s firing time occurs during a long callout or while the run loop is in a mode that is not monitoring the timer, the timer does not fire until the next time the run loop checks the timer. 

この内容を簡単に翻訳すると、NSTimerはリアタイム的なものではありません。NSTimerが実行されているRunLoopに依存しています。タイマーの精度は50-100ミリ秒。長い呼び出しの中やRunLoopがNSTimerをモニュターリングしていない場合、RunLoopが次回NSTimerをチェックするまでNSTimerがfireしません。

ということでNSTimerは実行するRunLoopによって時間的な精度が大幅に揺れていることが分かりました。

精密なタイマーを実装したい場合はどうしますか？
こちら→[how to get a accurate timer in ios](http://stackoverflow.com/questions/9737877/how-to-get-a-accurate-timer-in-ios) 結構議論していたみたいです。

勧めたのはdispatch_afterかCADisplayLinkでした。
どちらがもっといいかはわかりません、今度試してみます。
<!-- HTMLコメントタグの使い道を考える -->

HTMLをベタで書いているならまだしも、大抵の人はHTMLをWikiやjadeのようなMarkup言語で作成しているのではないか。
大抵のMarkupではコメントの記述ができるようになっており、HTMLにおけるコメント（`<!-- コメント -->`）をあえて使うシーンはたぶん少なくなってきている。
そんな今どきのWebで、あえてHTMLコメントを使うときはどんな時があるかまとめてみた。

# IEと戯れるコメントタグ

いわゆる条件付きコメント。IE8以下の有象無象を囲んで警棒で叩くために使用。
じっさいかなり助かる。

```html
<!--[if lt IE 6]><html class="legacy lt-ie8 lt-ie7 lt-ie6"><![endif]-->
<!--[if IE 7]><html class="legacy lt-ie8 lt-ie7 lt-ie6"><![endif]-->
<!--[if IE 8]><html class="legacy lt-ie8"><![endif]-->
<!--[if IE 9]><html class="legacy lt-ie8"><![endif]-->
<!--[if !IE]><!--><html class="modorn"><!--<![endif]-->
```

# Webアプリフレームワークと戯れるコメントタグ

RailsにはETagという機能があり、コンテンツの内容（≒bodyの内容）をキャッシュしている。
それとは別に、Finger Printingという機能によってcssやjsファイルを「ファイル名-ハッシュ.css」のような名前に変更し、内容変更時にもキャッシュを破棄して再読み込みさせる。

```html
<html>
<head>
  <link rel="stylesheet" href="application-912486a25b14eg31.css">
</head>
<body>
  <h1>お花見情報だよ</h1>
</body>
</html>
```

1. ある日、ページタイトルを桜色にしたいと思い、application.cssを変更した。
2. その結果、Finger Printingによって"application-11121212121ab31.css"というスタイルシートファイルが作成されるようになった。
3. アプリケーションをデプロイしてページにアクセスすると「application-912486a25b14eg31.css　ないよー」とエラーになった。
4. なんで？
5. 正解はETagのせいか

ETagはBody要素の内容をハッシュ化しているため、ヘッダー部分の変更を感知せず昔のページをクライアントに表示させる。
クライアント側で昔のcssファイルだけをリクエストするようなことがあると、もうそんなファイルはないのサーバーが怒る。

こういう事態を防ぐために、例えばbody要素中のメタ情報として、gitのbranch情報などをコメントに出力しておくとよい。
生HTMLにコピペで貼り付けるとかじゃなくて、Webアプリの変数埋め込み機能とかで行う。

```html
<body>
  <!-- app var. 13e5461d78e0223d095f019860143be350730e2 -->
  <h1>お花見情報だよ</h1>
</body>
```

こうしておくとWebアプリが更新される度に、キャッシュがクリアされる。
動的なページでは上のようなことが起きることはまず無いが、ほぼ静的なページなどではこういう仕掛けをしておくのもあり。
RailsにかぎらずETagを利用したWebアプリフレイムワーク全般に同じことがたぶん言える。

# Javascriptと戯れるコメントタグ

HTMLコメントは、Domとして木構造中に管理されているので、javascriptで取得することが可能。

```js
var d = document.getElementsByTagName("body")[0].childNodes,
    i;
for (i=0;i<d.length;i++){
  if(d[i].nodeType == 8){
    console.log(d[i]) // HTMLコメントの出力
  }
}
```

Domへコメントを挿入することも可能。以下はjQueryを使った例。

```js
niceComment = $("<!-- これもっとクエン酸入れたらどうっすか -->");
$(".newIdea").append(niceComment);
```

Chrome拡張とかで htmldoc 的なものを作ったり、sprocketのrequireコメント的な仕組みを作るのに使えるかもしれない。具体的なアイデアはないし、そもそもmetaタグでだいたいどうにかできる感はある。

# 参考

* [Ruby on Rails のConditionalGet について - Qiita / cuzic](http://qiita.com/cuzic/items/326e8600dc596de6636a) ... ETag周りの解説。
* [gitでハッシュ値を取得 - Qiita / quattro_4](http://qiita.com/quattro_4/items/55e99a2c008c6875f267)
* [[JavaScript]HTMLコメントの取得 - Bee-忘-Rock](http://skryo.com/blog/archives/306)
apacheとnginxの比較表とベンチマーク

# 概要
* websocketを使ったAPサーバをmodproxyでバランシングしたいっ！
* そうなるとapache2.4.5以降か、nginxか。
* 調べてみました。
* 今回はapache2.4.12。CentOSでのお話。

||apache2.4.12|nginx|
|:-----------:|:------------|:------------|
|バージョン管理||nginx-buildで楽々。依存関係も解決|
|情報|2.4系は少ない|多い|
|動的ファイルの読み込み速度|普通|普通|
|静的ファイルの読み込み速度|遅い。<br>event_mpm（非同期型IO処理）を採用したので、チューニングすると爆速になるかも。<br><b>apache2はrailsのimgファイル読み込む際遅くなるんだよ的なの知ってる方募集</b>|速い|
|設定の反映時の再起動|必要|不要|
|構成|centos7はyum。<br>centos6はソースからインストール。 |yum|
|アーキテクチャ|マルチプロセス + マルチスレッド<br>（ただし、event_mpmを使うとイベント駆動|イベント駆動|
|アーキテクチャによるメリット|シンプルで分かり易い|同時接続数が増えてもプロセス、スレッドが増えないため、<br>オーバーヘッドも増えない。 ➡高性能|
|アーキテクチャによるデメリット|プロセス、スレッドのオーバーヘッドが大きい。<br>大きな同時接続数に対応しようとすれば、<br>それだけ負荷が増える |特になし|
|開発元|コミュニティ|営利企業（Nginx Inc.）|
|開発者|コミュニティ|nginx社員 + 一般|
|有償 / 無償|無償|無償だが、商用サポート購入者のみの機能がある|
|開発スピード（個人的感想）|遅い<br>過去の遺産の修正が大変みたいです。<br>|速い|
|X-Forward-for<br>(プロキシした際、送信元IPをログに吐く) |投入したバージョンに適したmod_rpafを適用する|基本機能で付いている。|
|DoS対策|mod_dosdetector|nginx-maxconn-module|
|個人的にapache2.4系から期待している機能|mod_spdyでSPDY対応（nginxは対応ずみ）||

# nginxでのX-Forward-for設定方法

```bash
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for
```

# abテスト
* 下記の3つで戦わせます
    * apache2.4.12(with prefork)
    * apache2.4.12(with event_mpm)
    * nginx(1.7)
* どちらもインストールしたばかりのチューニングなし状態
* apacheって2.4.5からMaxClient➡MaxRequestWorkerって項目になってるんですね。。
* リクエスト数は10000固定。
* コマンドは、例えば同時接続数100の場合、
    * $ ab -n 10000 -c 100 http://hogehoge/

|同時接続数|apache2.4.12(with prefork)|apache2.4.12(with event_mpm)|nginx(1.7.10)|
|:-----------:|:------------:|:------------:|:------------:|
|100|118.548 seconds|<b>117.127 seconds</b>|118.538 seconds|
|300|126.351 seconds|51.424 seconds|<b>40.685 seconds</b>|
|500|エラー<br><br>Completed 10000 requests<br>Completed 20000 requests<br>apr_socket_recv: Connection timed out (110)|140.633 seconds|<b>42.298 seconds</b>|
|100で画像系にアクセスしてみました|836.973 seconds<br><br>（ちょー時間かかりそうだったので、2000req行ったところで断念しました。）|33.891 seconds|<b>8.823 seconds</b>|

# 個人的総評
* CentOs6しか使ってない人はソースからインストールしたくないと思うので、<br>websocketを使ったmodproxyならnginx一択かなと。
* まずはnginxを試して、CentOS7からはapacheを考えても良いと思います。
* nginx採用理由は機能も十分ですし、枯れていたapacheをイベント駆動型に開発していた間に、nginxのほうが新しい機能を追加するスピードが速くなってます。<br>
営利企業であるのも大きいかもしれませんね。<br>
ただやはりapacheは大きなリクエストに対しては速いという噂。<br>
* <b>nginxだと数が多いリクエストが来た場合、apacheより機能が低下するという経験がある方募集。</b>
Dynamic Template で Nested Type を定義する


Elasticsearch でネストされたオブジェクトを使いたい場合に以下のようなマッピング[^1]が必要になりますが、これを `dynamic_templates` で解決する方法です。

[^1]: [高速スケーラブル検索エンジン ElasticSearch Server](http://www.amazon.jp/dp/4048662023/) *5.3 ネストされたオブジェクトの使い方*

```
{
  "cloth": {
    "properties": {
      "name": {
        "type": "string",
        "store": "yes",
        "index": "analyzed"
      },
      "variation": {
        "type": "nested",
        "properties": {
          "size": {
            "type": "string",
            "store": "yes",
            "index": "not_analyzed"
          },
          "color": {
            "type": "string",
            "store": "yes",
            "index": "not_analyzed"
          }
        }
      }
    }
  }
}
```

`dynamic_templates` は以下のようになります。
`Nested Type` にしたいオブジェクト(*variation*) と、そのプロパティ(*size* や *color*) のテンプレートをそれぞれ用意するのがポイントです。

```
{
  "template": "shop",
  "mappings": {
    "cloth": {
      "dynamic_templates": [
        {
          "variation_template": {
            "match": "variation",
            "mapping": {
              "type": "nested"
            }
          }
        },
        {
          "variation_props_template": {
            "path_match": "variation.*",
            "mapping": {
              "type": "{dynamic_type}",
              "store": "yes",
              "index": "not_analyzed"
            }
          }
        }
      ]
    }
  }
}
```

実際にデータを投入しないとテンプレートが適用されないので（当たり前なんですが）適用前の状態で `Nested Query` を投げると豪快に `QueryParsingException` が発生するので注意が必要です。

誰もそんなことをやらないと思いますが、リリース直前に気づいたりすると結構ショックを受けるので念のため。
PDOを使用する(mysql)

PDOでDB接続用の関数connection.phpと実際に処理をする(ここではDBにデータ挿入する)sample.phpに分けて、使用する例。


```connection.php
function db_connection(){
	//DBのユーザ
	$db_user = "root";
	//DBのパスワード
	$db_password = "xxxxxxxxxx";
	//ホスト
	$db_host = "localhost";
	//接続するDBの名称
	$db_name = "xxxxxx";
	//接続するDBタイプ(他にpgsql,sqliteなどがある)
	$db_type = "mysql";

	//接続のための情報
	$dsn = "$db_type:host=$db_host;dbname=$db_name;charset=utf8";

try{
	//PDOによる接続
	$dbh = new PDO($dsn, $db_user, $db_password);
	//属性の設定(接続エラーが発生したら例外を投げる設定)
	$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
	//属性の設定(プリペアドステートメントの使用)
	$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
}catch(PDOException $e){
	//エラーが発生したらメッセージを表示して終了
	die("エラー内容:".$e->getMessage();)
}
return $dbh;
}
```

```sample.php
//DB接続用の関数を読み込み
require_once("connection.php");

//関数使用
$dbh = db_connection();

$name = "guest";
$age = 20;
$sex = "male";

try{
	//トランザクションを開始
	$dbh->beginTransaction();

	//データ挿入のsqlをプレースホルダで組み立てる(あくまで例)
	$sql = "insert into user (name, age, sex) values (?, ?, ?)"；
	//sql文を実行する準備
	$stmt = $dbh->prepare($sql);
	//プリペアドステートメントの実行
	$stmt->execute(array($name, $age, $sex));
	//トランザクションをコミット。ここで、変更が確定
	$dbh->commit();
	
}catch(PDOException $e){
	//エラー発生して例外が投げられたら、ロールバックする
	$dbh->rollback();
	print "エラー内容:".$e->getMessage();
}
```
iOSアプリプロジェクトがビルド出来ない時のチェック項目

### CI環境ではグリーン状態なのになぜか自分だけビルド通らない時のチェック項目

- [ ] CocodPodsを導入している場合など、`XXX.xcworkspace`を開いているか
  - うっかり`XXX.xcodeproj` を開いてしまっているミスがあるある
- [ ] Fabric/Crashlytics導入しているときの初回起動(※1)
    - 実行時にブラウザに遷移してインストールを促されるのでそれに従い実行
        - ダウンロード画面に正しく遷移しないことがあった。その場合、Fabric/Crashyticsのアプリケーションを手動でダウンロードする([Fabric](https://fabric.io/downloads/xcode)などから)
- [ ] Xcodeを終了して`rm -rf ~/Library/Developer/Xcode/DerivedData/` を実行
    - 僕は`Alfred`で簡単に実行可能にしている
    - Swiftで書いているとそこそこの頻度で発生
- [ ] Xcodeのバージョンを確認 (※2)
    - 開発者はそのコミットはどのバージョンのXcodeでビルドすれば良いのかを明確にしておく 
- [ ] クリーンする (cmd + shift + K)
- [ ] Simulatorのアプリ消す
- [ ] Simulator再起動する
    - 環境によって、Simulatorがネットワーク通信不可になることがあってこれもちょくちょくやってる
- [ ] マシンごと再起動する
    - 以上でどうしても直らない時


### ※1 Fabric/Crashlyticsが原因のエラーログ

```
Fabric: This app relies on Fabric. Please sign up for access at https://fabric.io/sign_up,

install Fabric.app then ask a team member to invite you to this app's organization.

If this machine is a build server please remove Fabric.app if present and use xcodebuild so that Player.app.dSYM is uploaded.
```

### ※2 Xcodeの複数バージョン管理注意点

- 古いのは[こちらからダウンロード出来ます](https://developer.apple.com/downloads/index.action)
- `Xcode.app`はApp Storeからのアップデートで上書きされてしまうので、このようにリネームして管理するのをオススメします。

![Screen Shot 2015-04-22 at 07.32.50.png](https://qiita-image-store.s3.amazonaws.com/0/19398/1809579d-66d6-c5c0-081e-cfe1f7a651e4.png)


@ookaminocchan さんが今日困っていました(´・︵・｀)
次回からはこれを渡せば解決(　´･‿･｀)
元建設業界にいたサラリーマンが、AWSを建設業界的な視点で考えてみる。

# はじめに
犬のエサやりから開放されたサラリーマンこと、ケンイちだワン！
IT業界に転職し大体半年が経ち、AWSのことも何となく理解できつつあります。
何かを学ぶときに例えがあると覚えやすいものですよね。
私がAWSを覚えるときに、過去に経験したことを例えにしたものを書いていきます。

# AWSを戸建住宅として考えてみた
これまで一貫して建設業界でサラリーマンをしてたからか、構成図が建築図面に思えてなりません。
私が構成図で感じたものを挙げていきます。

## AWS
土地。
土地はAzureとか、さくらクラウドとか、ソフトレイヤーとか色々ある。
それぞれの土地では、建てられる建物が違う。
建設業界的に見たら、建築法や消防法なんかで建物の構造、大きさなんかに制限があるようなものと思ってます。
土地の特色といいかえても良いですね。
こっちの土地は商業施設を建てるのに向いてるね。あっちの土地は住居を建てるのに向いてるね。的なイメージです。

## VPC
家。
大きさは自由。
ここから住宅の設計がはじまる。
もちろん数も自由。
息子夫婦の家を同じ土地(AWS)に建てることも、蔵を建てることもOK！
- サブネット的考え

## Route53
表札付きの門。
ドメインって表札だよね！

## Security Group
建具。
外向きの建具である玄関ドア、窓、勝手口や、内向きの建具である部屋の扉とか。

- 外向きの建具は、防犯や建物の構造強度から見てなるべく少なくしたい。
 - 採光のこととか利便性を考えて、ある程度は欲しい。
- 内向きの建具は、基本的に部屋(EC2)につき、1個あれば良いよね。
 - でも、利便性から部屋間を行き来するのに廊下(ELB)を経由せずに直接行き来したい部屋もあるから、それ用に扉が欲しいこともある。

## ELB
廊下。
ここから各部屋(EC2)に行く。

## EC2
部屋。
部屋は用途によって大きさが変わる。

- 人の集まるリビングは大きく。
- トイレやお風呂などの水回りは小さく。
- 寝室や子供部屋はほどほどの大きさで。
- 客間が必要であれば、客間も用意。大きさもそこそこかな。
- 玄関も部屋みたいなもん。人がたくさん来るような家なら大きくしないと！
- 普段使わない部屋の照明を点けないように、クラウドだとSTOP(Terminate)することができるね！

# とあるご家庭の家(図面)をAWSアーキテクチャに置き換えてみる
こうやってそれぞれの機能を置き換えていくと、構成図がどんどん建築図面に見えてくるのです。
もちろん、逆に建築図面が構成図に見えてきたりもします。
「おーい、磯野ぉ！置き換えようぜ！！」
、、、というわけで、実際に建築図面を構成図に置き換えてみます。

![平面図.png](https://qiita-image-store.s3.amazonaws.com/0/55533/efb1e41d-c9ad-d45f-b4bc-e6d92eb3c66c.png)
某磯野家の図面です。
※ 多分こんな間取りかと。(手書きなので汚い、、、)
これをAWSに置き換えてみると、、、

![sazae.png](https://qiita-image-store.s3.amazonaws.com/0/55533/d89e6de2-27c1-63d5-b122-e5ea459f2e7a.png)
こんな感じになります。

劇中で度々登場する三河屋のサブチャンが勝手口から入ってこれるのは、三河屋SSHで入って来てるんだと思います。
多分、伊佐坂家はリードオンリー。

# まとめ
色々とツッコミ所はあるかと思いますが、あくまで私にはこのように見えており、何となくでもAWSについて覚えることができました。
もちろん建設業界的な視点だけでは覚えることの出来ないサービスも多々あります。
※ もしかしたら説明のつくものもあるかもしれませんが、ちょっと思いつかないです。
※ RDS(Multi-AZ)をどうやって説明したら良いものか、、、

AWS。覚えがいがあるね！
Amazon EC2 に GitLab をインストール

参照ページ [Download GitLab Community Edition](https://about.gitlab.com/downloads/)

SSHでEC2へアクセスする。

```bash

sudo apt-get install openssl-server
sudo apt-get install postfix

# ダウンロードするファイルはGitLabサイトを参照
wget https://downloads-packages.s3.amazonaws.com/ubuntu-14.04/gitlab_7.9.0-omnibus.2-1_amd64.deb
sudo dpkg -i gitlab_7.9.0-omnibus.2-1_amd64.deb

sudo gitlab-ctl reconfigure

# 設定を変更する場合は /etc/gitlab/gitlab.rb を編集し、再度 reconfigure を実行します。

```


**タイムゾーン設定**

```bash
# /etc/gitlab/gitlab.rb の次の行を有効にし、Tokyoに設定します。
config.time_zone = 'Tokyo'

# 設定変更を適用します。
sudo gitlab-ctl reconfigure
```


ブラウザでアクセスし、以下のアカウントでログインする。
ID: root
PW: 5iveL!fe
UnityでiOS向けに360度カメラ両眼視加速度センサー

sphereの内側に貼らないといけない
[RICOH360度カメラTHETAで撮った写真をUnityで使う | Psychic VRラボの殴り書き　　](http://www.ozmiq.com/labs/vr/unity/360%E5%BA%A6%E3%82%AB%E3%83%A1%E3%83%A9theta%E3%81%A7%E6%92%AE%E3%81%A3%E3%81%9F%E5%86%99%E7%9C%9F%E3%82%92unity%E3%81%A7%E4%BD%BF%E3%81%86/)

CardBoard SDKだとカメラ位置を修正するスクリプトが入ってる

[Durovis - SDK](https://www.durovis.com/sdk.html) を使う

iOSだとUnityEngine.MovieTextureが使えない
→ $70 [prime[31] - Unity plugin documentation](https://prime31.com/docs#iosLiveTexture)
→ $30 [Asset Store - iPlayer](https://www.assetstore.unity3d.com/jp/#!/content/8002)

ここではVuforiaのiOS動画再生スクリプトを使っているが現在は同梱されていない？
[Unity3D - Unity + Vuforia でARな動画再生を試してみた - Qiita](http://qiita.com/JunSuzukiJapan/items/f6ed23bb519d01fdaaa3)

# 共有

[360度全天球カメラTHETAで撮影した写真をUnityで使うテンプレート | 白ペンギン](http://shiropen.com/2014/11/20/6209)

[Durovis Dive SDKでCardBoard向けアプリを作ってみる - ReDo](http://greety.sakura.ne.jp/redo/2014/09/durovis-dive-sdkcardboard.html)

# 課題

そもそも：360度カメラ2台で視差のある動画を撮ることはできるだろうけれど、見回した時に視差は追従しないから、「360度見渡せる」「視差のある映像を見れる」は動画で言う限り排他なのではないか
→ 全方向に2台ずつカメラを向けて（6方向なら12カメラ）撮影した画像を張り合わせれば可能なようだ → [3DH3Pro12-Loaded](http://www.360heros.com/wp-content/uploads/2014/03/3DH3Pro12-Loaded-1024x768.jpg)
[Java]スペース区切りの文字列を Stream 化してみる

スペース区切りの文字列を分解したものを Stream 化してみました。
イメージ的には IntStream#range みたいな使い方ができるといいなと考えました。
ダブルクォーテーションで括られたものは分解しないようにもしてみました。

```swift:KeywordStream.java
public interface KeywordStream extends BaseStream<String, Stream<String>> {
  public static KeywordStream split(Optional<String> keywords) {
    return new KeywordStream() {

      private static final String EMPTY = "";

      private static final String SEPARATOR = " (?=([^\"]*\"[^\"]*\")*[^\"]*$)"; 

      private Stream<String> stream = Arrays.asList(keywords.orElse(EMPTY).split(SEPARATOR)).stream();

      @Override
      public Iterator<String> iterator() {
        return stream.iterator();
      }

      @Override
      public Spliterator<String> spliterator() {
        return stream.spliterator();
      }

      @Override
      public boolean isParallel() {
        return stream.isParallel();
      }

      @Override
      public Stream<String> sequential() {
       return stream.sequential();
      }

      @Override
      public Stream<String> parallel() {
        return stream.parallel();
      }

      @Override
      public Stream<String> unordered() {
        return stream.unordered();
      }

      @Override
      public Stream<String> onClose(Runnable closeHandler) {
        return stream.onClose(closeHandler);
      }

      @Override
      public void close() {
        stream.close();
      }
    };
  }
}
```

次のように使えます。

```swift:HowToUse.java
KeywordStream.split(Optional.of("I have \"a pen\"")).forEach(System.out::println);
```

次のような結果になります。

> I
> have
> "a pen"

Stream.builder() を使ってもいいのですが、それだと毎回正規表現を書いたりしないといけないので、ユーティリティークラスとして作っておくと便利ですね。
Jenkinsでシェル内で加工した変数を下流のジョブに引き継ぐ方法

# 概要

ユーザが入力したパラメータを少し加工したものを下流ジョブで使いたいと思い、色々試してみました。

# 解決策

## Trigger parameterized build on other projectsのParameters from properties fileを使用する方法

プラグインの「Trigger parameterized build on other projects」にはパラメータの引き渡し方として「Parameters from properties file」という方法があります。

これは「キー=値」の形式で記載されたファイルを読み込み、ファイル内に記載されたパラメータを次のジョブに引き渡すというものです。

これを利用して、上流のジョブで
`echo XXX=YYY > property.txt`
のようにしてパラメータをプロパティファイルに出力して、
下流のジョブではそのファイルを読み込むという方法を取ればジョブ間で加工したパラメータの受け渡しができます。
swiftでシャッフル関数


レンジ(`0..<10`)などのシーケンス型をシャッフルしたくなるときがあるので，ここにメモしておきます．
シャッフルの実装はTAOCPに載っていたアルゴリズムP[^1]を使います．

[^1]: D. E. Knuth, "The Art of Computer Programming Volume 2 Seminumerical Algorithms Third Edition," pp.145

### 実装

```swift
func shuffle<T>(inout array: [T]) {
    for var j = array.count - 1; j > 0; j-- {
        var k = Int(arc4random_uniform(UInt32(j + 1))) // 0 <= k <= j
        swap(&array[k], &array[j])
    }
}

func shuffled<S: SequenceType>(source: S) -> [S.Generator.Element] {
    var copy = Array<S.Generator.Element>(source)
    shuffle(&copy)
    return copy
}
```

関数`shuffle`の中身は，そのまんまアルゴリズムPで（実はもうほんのちょっと最適化できる），入力配列を破壊しつつシャッフルします．
関数`shuffled`の方は，`SequenceType`型（配列とか文字列とかレンジ）の入力をとり（`sorted`のように）元の入力を破壊せずにシャッフル済みの新たな配列を返します．

### 使用例
```swift
var a = [0,1,2,3,4,5,6,7,8,9]
shuffle(&a)
println(a)                                    // [3,2,0,4,1,7,9,5,6,8]

println(shuffled(0..<10))                     // [5,9,7,8,3,1,0,2,4,6]

println(String(shuffled("Hello, World!")))    // l WeHdl!rloo,
```
Swiftのシングルトンパターンでリセットもできる実装

Swiftのシングルトンの実装方法は`dispatch_once`を使う方法や`グローバル定数`を使う方法などあります。
参照：http://qiita.com/susieyy/items/acb3bc80a1dafe64cffd


一方で、私はシングルトンで管理されているインスタンスをリセット（削除）できる実装を考えてみました。そもそもシングルトンで管理されたインスタンスを削除するという行為自体が、邪道なのかもしれませんが、クラス自体を一旦クリアにしたいという用途も発生するのかなと。。。

# ソース
## swift 1.1
```
class User {

    private struct Static {
        static var instance: User?
    }

    class var sharedInstance: User {
        if let instance = Static.instance {
            return instance
        }
        Static.instance = User()
        return Static.instance!
    }

    func deleteSharedInstance() {
        Static.instance = nil
    }




    var i = 0
    
    func increment() {
        i++
    }
}
```

## swift 1.2
 ※クラス内メソッドでstatic宣言が使える

```
class User {

    private static var instance: User?
    
    class var sharedInstance: User {
        if let instance = instance {
            return instance
        }
        instance = User()
        return instance!
    }
    
    func deleteSharedInstance() {
        User.instance = nil
    }



    var i = 0
    
    func increment() {
        i++
    }
}
```

# 使用例
``` 
User.sharedInstance.increment() // 1
User.sharedInstance.increment() // 2
User.sharedInstance.increment() // 3
User.sharedInstance.increment() // 4
User.sharedInstance.increment() // 5

User.sharedInstance.deleteSharedInstance()

User.sharedInstance.increment() // 1
User.sharedInstance.increment() // 2
```
EC-CUBE3のメモ - CI環境一覧 - 

プルリクすると、自動でテストが走ります。
ここでこけるとプルリクがマージできないので要注意。

* Appveyor
    + https://ci.appveyor.com/project/ECCUBE/

* Travice CI
    + https://travis-ci.org/EC-CUBE/ec-cube

* COVERALLS
    + https://coveralls.io/r/EC-CUBE/ec-cube


参考
http://www.lockon.co.jp/officialblog/work/9816/
Seasar2 (ファイルダウンロード)

#1. 概要
画面などからデータをダウンロードする使い勝手のよいUtilです。

#2. 書式
```java
ResponseUtil.download(String ファイル名, InputStream 出力内容);
```
(1)ファイル名(引数1)**String**
ダウンロードした際のファイルの名前

(2)出力内容(引数2)**InputStream**
ダウンロードするファイルの内容

#3. 凡例
```java
@Execute(validator=false)
public String next(){
    StringBuilder sb = new StringBuilder();
    sb.append("create data");
    sb.append(" and download");
    String filename = "sample.txt";
    try {
        ResponseUtil.download(filename,new ByteArrayInputStream(sb.toString().getBytes("Windows-31J")));
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    return null;
}
```
(1)filename = ダウンロードするファイルの名前
(2)ByteArrayInputStreamでStringBuilderで作成した文字列を出力する
(3)ファイルダウンロード処理ではJSPへのフォワードは不要なので、アクション
の実行メソッドの戻り値はnull。

#4. まとめ
ResponseUtil.downloadを使用してダウンロードを行います。
第一引数にファイルの名前。
第二引数にダウンロードするものを指定します。またここで指定するものはクラス内で作成した文字列でも、既にあるファイルを指定する事も可能です。(InputStreamを選ぶ)
なぜ、EC-CUBEはSilexを採用したのか

こんにちは。
EC-CUBE運営チームの高橋です。

EC-CUBEがver.3になるため、その情報発信・共有の場として、Qiitaを使わせていただくこととなりました。
よろしくお願い致しますm(_ _)m

さて、表題についてです。

# なぜ、EC-CUBEはSilexを採用したのか
EC-CUBEが目指すものを実現するためにビジネスと技術の両方から考えた上での、Silex採用です。

## EC-CUBE3の目的
* EC-CUBEをECサイトだけでなく、ECアプリケーションのプラットフォームへ進化させる
* ユーザ層の拡張

## そのために実現したい技術
* プラグイン競合の解消
* WebAPIの実装
* コアアップデートの提供
* UIの刷新
* モダンなPHP開発手法

以上の観点で、社内外含め議論を重ねた上で、EC-CUBE3では、これまでの独自実装も活かしつつ「FWの採用」を決めました。

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 

しかし、PHPのFWは、現在数多く存在します。
では、なぜ、その中でSilexを選んだのかをお伝え致します。

## なぜ、EC-CUBEは数あるFWの中からSilexを採用したのか

FWの採用を決定したとはいえ、

* レンタルサーバで動くのか
* FWとしての縛りがきつすぎないか

などの課題がありました。
EC-CUBEを利用して構築されたサイトの多くがレンタルサーバ上で運用されているため、レンタルサーバで動作することが要件となっています。
また、FWとしての縛りがきつすぎると、カスタマイズの自由度が下がる懸念と、学習コストが高くなると考えられることから、「お作法」的な部分をできるだけ排除したいと思っていました。

その中で、主流なFWである以下を候補としてピックアップしました。

* CakePHP
* Laravel
* Silex
* Symfony2
* オレオレFW

前述の理由からオレオレFWは却下。
次に、SymfonyComponentsを利用することが主流となっている流れを汲みたいため、CakePHPを候補から外しました。

残るLaravelとSilex、Symfony2ですが、

* Laravel：レンタルサーバでの動作要件に合わない(Laravel4でもPHP>=5.4)
* Symfony2：学習コストが高過ぎる

以上の理由と、パッケージで配布する際にEC-CUBEで利用していないライブラリを同梱したくないという意図から、Silexにて必要なライブラリを取り込んで行こうという方針に決定しました。

### 消去法で決めたのか

これまでの説明では、消去法での選定となって見えますが、そうではないポジティブな理由も存在します。
EC-CUBEのビジネスロジック部分は、大きく手を加える必要がないほど、ECサイトとしての機能をしっかりと備えています。
現在、EC-CUBE3の開発は「乗せ換えフェーズ」と位置付けたリファクタリングを行っており、単純にSilex上で動作するように乗せ替えていっております。
この乗せ換えフェーズにおいて、FW部分が薄いことにより、既存のビジネスロジックを活かしたまま利用できる箇所が多く残ります。
他のFWを利用した場合、ビジネスロジックの変更が必要になるなど、乗せ換え自体が大きな壁となっていたでしょう。

以上がEC-CUBEがSilexを採用した理由のすべてとなっております。

まだ手探りで開発を進めている発展途上な状態ですが、今後共どうぞよろしくお願い致します！
コミッターも随時募集しておりますので、ご指南いただけると幸いですm(_ _)m
[EC-CUBE -GitHub](https://github.com/EC-CUBE/ec-cube)
Cameraのギズモを非表示にする

2DのUIとかをいじるときは
![UnityCamera.png](https://qiita-image-store.s3.amazonaws.com/0/17192/5b149bd6-64d2-729c-06fb-0358b14c3267.png)
こいつが凄い邪魔なので非表示にしましょう。

Sceneビューの上部にある「Gizmos」を押すと、カメラアイコンっぽいのがでるので
それをクリックする。
Rack::Auth::Basicで特定のパスは認証させない。

`Rack::Auth::Basic`を使用してBasic認証を実装するとサイト全体に適用されます。

```ruby:config.ru
use Rack::Auth::Basic do |username, password|
  username == "user" && password == "password"
end
```

例外的に`/hoge`のアクセスだけはBasic認証を適用したくない場合、
Rack::Auth::Basicを継承したクラスを作成し

```ruby:config.ru
class MyAuth < Rack::Auth::Basic
  def call(env)
    request = Rack::Request.new(env)
    if request.path == '/hoge'
      @app.call(env)
    else
      super
    end
  end
end

```

useすることで`/hoge`アクセス時にはBasic認証が適用されません。

```ruby:config.ru

use MyAuth do |username, password|
  username == "user" && password == "password"
end

```