OmniAICreator/Qiita-1.07M huggingface dataset:
Dockerを使ってJava9を超高速に試す

Project JigsawもついにJava9のメインラインに統合され、そろそろ試してみたくなるころ合いになってきました。
とはいえ、JVMを複数入れるとJAVA_HOMEの設定とか色々面倒。でも、安心してください。現代にはDockerがあるんです！

というわけで、Dockerを使ってJava9のEA版を安全かつサクッと試します。

## インストール

```bash
$ docker run marvambass/oracle-java9 java -version
java version "9-ea"
Java(TM) SE Runtime Environment (build 9-ea+130)
Java HotSpot(TM) 64-Bit Server VM (build 9-ea+130, mixed mode)
```

以上。個別インストールは不要でDockerコマンドを叩くだけです。ね、簡単でしょ？
こういう複数バージョンの混在がDockerの登場で各段と楽になったので、ベータ版の動作確認とかにはすごく便利ですね。

## Hello Worldのコンパイルと実行

バージョンだけ確認できてもつまらないので、ふつうにHello Worldをビルドして実行してみましょう。
ソースコードの作成とクラスパスの出力はとりあえずカレントディレクトリで実施することにします。

### ソースの作成

```bash
$ cat > Main.java
public class Main {
  public static void main(String[] args){
    System.out.println("Hello java9 on Docker");
  }
}

$ ls Main.java
Main.java
```

### コンパイル

```bash
$ docker run -v `pwd`:/tmp -w "/tmp" marvambass/oracle-java9 javac Main.java
$ ls -l Main.*
-rw-r--r-- 1 koduki 197609 423 9月   6 03:47 Main.class
-rw-r--r-- 1 koduki 197609 117 9月   6 03:47 Main.java
```

### 実行

```bash
$ docker run -v `pwd`:/tmp -w "/tmp" marvambass/oracle-java9 java Main
Hello java9 on Docker
```

特筆することは無いですが、あえて言えば -w を付けないとWORKDIRが"/"になるので注意することですかね。

## JShellを実行しよう

Java9から入ったREPLであるJShellも使えます。

```bash
$ docker run -it marvambass/oracle-java9 jshell
Sep 05, 2016 6:52:03 PM java.util.prefs.FileSystemPreferences$1 run
INFO: Created user preferences directory.
|  Welcome to JShell -- Version 9-ea
|  For an introduction type: /help intro


jshell> System.out.println("Hello JShell!")
Hello JShell!

jshell>
```

jshellのおかげで簡単な動作確認はこちらで済ませれそうですね。いちいち、NetBeansやEclipseを起動しなくて良いのは手軽でGood!

まとめ
--------------

Java9を試したいけど、環境は汚したくない！　って人向けの記事でした。Windowsで実施してますが、Dockerですし環境には依存しないでしょう。
今度は目玉のモジュール機能とかを試してみたいと思います。

それではHappy Hacking!

参考
--------------

- [Java Early Access JDK 9 Snapshots](http://openjdk.java.net/projects/jdk9/)
- [marvambass/oracle-java9](https://hub.docker.com/r/marvambass/oracle-java9/)
- [[Java9 新機能] jshell入門](http://qiita.com/HomMarkHunt/items/6579cc3587972909d85f)
チェインメソッドで少しだけ楽にキレイにする


みなさんチェインメソッド使ってますか？
後ろを見ずに突き進む感じいいですよね。

Swiftでチェインメソッド組めないか少し考えてみました。

### まずはUIButtonを普通に初期化するところから
~~~swift
let button = UIButton()
button.frame = CGRect(x: 0, y: 0, width: 500, height: 250)
button.setTitle("Close", forState: .Normal)
~~~


### 総称(Generics)
~~~swift
class Chain<T>{
    private var val:T
    init( val:T ){
        self.val = val
    }
    func next( execute:(T) -> Void ) -> Chain<T>{
        execute(val)
        return self
    }
    func end() -> T {
        return val
    }
}

let button2 = Chain<UIButton>(val: UIButton())
    .next({$0.frame = CGRect(x: 0, y: 0, width: 500, height: 250)})
    .next({$0.setTitle("Close", forState: .Normal)}).end()
~~~
なんだかクロージャがゴチャゴチャです。
ブロックが２種類挟まないといけないのも面倒です。


### 継承
~~~swift
class ChainButton : Chain<UIButton> {
    init(frame:CGRect){
        super.init(val: UIButton(frame:frame))
    }
    func title(label:String) -> ChainButton{
        next({$0.setTitle(label, forState: .Normal)})
        return self
    }
    func cornerRadius(rad:CGFloat) -> ChainButton{
        next({$0.layer.cornerRadius = rad})
        return self
    }
    func borderWidth(width:CGFloat) -> ChainButton {
        next({$0.layer.borderWidth = width})
        return self
    }
    func borderColor(color:UIColor) -> ChainButton {
        next({$0.layer.borderColor = color.CGColor})
        return self
    }
    func backgroundColor(color:UIColor) -> ChainButton {
        next({$0.backgroundColor = color})
        return self
    }
}

let button3 = ChainButton(frame:CGRect(x: 0, y: 0, width: 300, height: 70))
    .title("Title")
    .cornerRadius(0.5)
    .borderWidth(1)
    .borderColor(UIColor.redColor()).end()
~~~
それっぽくなりました。
ChainButtonというクラスの存在が非常に助長で、C++の特殊化使えれば、そこんとこスマートになるのですが、どうやらSwiftではそこまでサポートされていないようです。

なので、「よく使うメソッドをチェーン化はじめました」というポリシーにするしかなさそうです。
当初の３行を何十回何百回と書く場合にようやくペイできそうな感じですね。

あと気になるのは、CGRectが長く見えるので、配列で渡せるようにすればも少し短くなりそうですね。




###### Playgroundで作りました。
MacBook Proに構築したAndroid Studioを更新した。

Android StudioをUpdateしました。

# 環境
* MacBook Pro (Retina 13-inch、Early 2015)
* OS X El Capitan 10.11.6
* Java 1.8.0_73
* Android Studio 1.5.1

# 実施したこと
## Android Studioの更新
1. Android Studioを実行する
1. 「Android Studio」>「Check for update...」を押下する
<img width="５００" alt="スクリーンショット 2016-09-06 2.33.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/129313/6b1b5dae-7a4e-4b24-73ec-5e3324b27448.png">
1. Updateが存在する場合、「Update and Restart」を押下する
<img width="５００" alt="スクリーンショット 2016-09-06 2.34.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/129313/3e0bab2d-6af4-8b21-aed4-6c648db47858.png">
1. Patchのダウンロードが開始される
<img width="５００" alt="スクリーンショット 2016-09-06 2.35.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/129313/5a277f94-7d3b-93d4-47a4-8c219d88466d.png">
1. Conflictが存在する場合、継続するかキャンセルするかを確認される
<img width="５００" alt="スクリーンショット 2016-09-06 2.37.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/129313/a7ec7bda-c829-c438-33a1-d3cfff555e27.png">
1. 「Proceed」を押下する
1. Android Studio が再起動する
1. 「Complete installation」画面により、前バージョンの設定をインポートするか確認される
<img width="５００" alt="スクリーンショット 2016-09-06 2.38.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/129313/57ebb687-6b7b-0cb5-09e2-c6186c414813.png">
1. 「I want to import my settings from previous version」を選択し、「OK」を押下する

# 結果
* Android Studioが1.5.1から2.1.3になった。
* (削除してしまったので)Android Studioが英語になった。
Amazon MWSのサンプルコードでClass not found


## Amazon MWSとは

Amazonマーケットプレイスに出店してるショップ向けに、商品管理や注文管理ができるAPIが提供されている。

Amazon マーケットプレイスWebサービス(MWS)
https://developer.amazonservices.jp/

クライアントライブラリとサンプルコードもある。

PHP クライアントライブラリ
https://developer.amazonservices.jp/doc/bde/feeds/v20090101/php.html

今回はフィードAPIを使用してる。


## クラスのオートロードでうまくいかなかった

このライブラリのサンプルコードは```__autoload```関数でオートロードしてるため、
composerとかを使ってたらどうもMWSのクラスが見つからない。

```
PHP Fatal error:  Class 'MarketplaceWebService_Client' not found in hoge.php on line 99
```

そこで```spl_autoload_register```を使うように修正した。



元のコードがこれ

```php:src/MarketplaceWebService/Samples/.config.inc.php
     function __autoload($className){
        $filePath = str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
        $includePaths = explode(PATH_SEPARATOR, get_include_path());
        foreach($includePaths as $includePath){
            if(file_exists($includePath . DIRECTORY_SEPARATOR . $filePath)){
                require_once $filePath;
                return;
            }
        }
    }
```

修正後はこちら

```php
    function MWSAutoLoad($className) {
        $filePath = str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
        $includePaths = explode(PATH_SEPARATOR, get_include_path());
        foreach($includePaths as $includePath){
            if(file_exists($includePath . DIRECTORY_SEPARATOR . $filePath)){
                require_once $filePath;
                return;
            }
        }
    }

    if (version_compare(PHP_VERSION, '5.3.0', '>=')) {
        spl_autoload_register('MWSAutoLoad', true, true);
    } else {
        spl_autoload_register('MWSAutoLoad');
    }
```
protocol の extension の利用例を思いついた

あるコンテナのキャッシュのためにDictionaryを使っていたとき、
できるだけI/F側がゴチャゴチャしにくい方法を考えていたら
protocol を extension することで解決できたので共有しておきます。


~~~swift
var dict:[String:UIView] = [:]
func fuga(key:String, view:UIView){
    dict[key] = view
}

// 文字列以外がすんなり入らない。
fuga("text", view: UIView())
fuga(1, view: UIView()) // コンパイルエラー
fuga(1.2, view:UIView()) // コンパイルエラー
~~~

~~~swift
// こうすれば入るけど、面倒
fuga(String(1), view: UIView())
fuga(String(1.2), view:UIView())
~~~


~~~swift
// クラスの場合はどうしよう
class Profile {
    var fistName:String
    var lastName:String
    var age:Int
    init(first:String, last:String, age:Int){
        self.fistName = first
        self.lastName = last
        self.age = age
    }
}
fuga(Profile(first: "m", last: "k", age: 30), view:UIView()) // コンパイルエラー
~~~



#### Stringを返させるプロトコルにする
~~~swift
protocol Key {
    var Name:String { get }
}
func hoge(key:Key, view:UIView){
    dict[key.Name] = view
}

// プロトコルを採用したものじゃないといけなくなったので、文字列よりひどくなる
hoge("text", view: UIView()) // コンパイルエラー
hoge(1, view: UIView()) // コンパイルエラー
hoge(1.2, view:UIView()) // コンパイルエラー
hoge(Profile(first: "m", last: "k", age: 30), view:UIView()) // コンパイルエラー
~~~

#### protocol extension を使って、String,Int,Doubleといったプリミティブ型を始めクラスのデフォルト行動を定義する
~~~swift
extension String : Key{
    var Name: String{get{return self}}
}
extension Int : Key{
    var Name: String{get{return String(self)}}
}
extension Double : Key{
    var Name: String{get{return String(self)}}
}
extension Profile : Key{
    var Name: String{get{return String("\(self.fistName)\(self.lastName)\(self.age)")}}
}
// これなら通る
hoge("text", view: UIView())
hoge(1, view: UIView())
hoge(1.2, view:UIView())
hoge(Profile(first: "m", last: "k", age: 30), view:UIView())
~~~
sqlplusで接続情報などを確認する方法 (def)


## 内容
sqlplusで接続にdefと入力すると、SIDやユーザなどを確認できる。

## 確認

▼コマンド

``` sql
SQL> def
```

▼結果

```bash:
DEFINE _DATE           = "16-09-06" (CHAR)
DEFINE _CONNECT_IDENTIFIER = "##SID##" (CHAR)
DEFINE _USER           = "SYS" (CHAR)
DEFINE _PRIVILEGE      = "AS SYSDBA" (CHAR)
DEFINE _SQLPLUS_RELEASE = "1201000200" (CHAR)
DEFINE _EDITOR         = "ed" (CHAR)
DEFINE _O_VERSION      = "Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics, Real Application Testing
and Unified Auditing options" (CHAR)
DEFINE _O_RELEASE      = "1201000200" (CHAR)

```
【Oracle12Cお勉強】統合監査を触ってみる

## 統合監査とは？

- 12Cからの新機能。
- 各監査を一つにまとめられる。
- SYS.UNIFIED_AUDIT_TRAILに情報が集約される。
- デフォルトでは無効。有効化する必要がある。有効化には、インスタンスの停止が必要。


## 統合監査の有効化

▼現状確認

```sql: 
$ sqlplus / as sysdba
SQL> SELECT * FROM V$OPTION WHERE PARAMETER='Unified Auditing';
PARAMETER                             VALUE  CON_ID
------------------------------------- ----- -------
Unified Auditing                      FALSE       0

SQL> exit
```

▼データベースの停止

``` sql
SQL> shutdown immediate
SQL> exit
```

▼有効化

```sql: 
$ cd $ORACLE_HOME/rdbms/lib
$ make -f ins_rdbms.mk uniaud_on ioracle
``` 

▼データベースの起動

```sql: 
$ sqlplus / as sysdba
SQL> startup
``` 

▼確認

```sql: 
SQL> SELECT * FROM V$OPTION WHERE PARAMETER='Unified Auditing';
PARAMETER        VALUE  CON_ID
---------------- ----- -------
Unified Auditing TRUE        0
```


## UNIFIED_AUDIT_TRAILの内容確認

▼shutdown,startupの履歴を確認

``` sql
SQL> select EVENT_TIMESTAMP,DBUSERNAME,ACTION_NAME,SQL_TEXT 
  2  from unified_audit_trail 
  3  where action_name in('SHUTDOWN','STARTUP') order by 1;

EVENT_TIMESTAMP          DBUSERNAME ACTION_NAME SQL_TEXT
------------------------ ---------- ----------- ------------------
16-09-06 09:20:30.816834 SYS        STARTUP     STARTUP
16-09-06 09:23:39.365349 SYS        SHUTDOWN    SHUTDOWN IMMEDIATE
16-09-06 09:23:57.500256 SYS        STARTUP     STARTUP
```

▼ALTER PLUGGABLE DATABASEの履歴を確認

``` sql
SQL> select EVENT_TIMESTAMP,DBUSERNAME,SQL_TEXT 
  2  from unified_audit_trail 
  3  where action_name = 'ALTER PLUGGABLE DATABASE' order by 1;

EVENT_TIMESTAMP          DBUSERNAME SQL_TEXT
------------------------ ---------- ----------------------------------------------------------------
15-12-29 07:40:42.218214 SYS        alter pluggable database pdb$seed close
15-12-29 07:40:43.549021 SYS        alter pluggable database pdb$seed open
15-12-29 07:41:46.154337 SYS        alter pluggable database pdb$seed close immediate instances=all
15-12-29 07:41:47.960807 SYS        alter pluggable database pdb$seed OPEN READ WRITE
15-12-29 07:44:07.357800 SYS        alter pluggable database pdb1 open
15-12-29 07:44:46.727027 SYS        alter pluggable database pdb2 open
16-02-14 20:52:02.808739 SYS        alter pluggable database pdb1 open
```

▼ALTER DATABASEの履歴を確認

``` sql
SQL> select EVENT_TIMESTAMP,DBUSERNAME,SQL_TEXT 
  2  from unified_audit_trail 
  3  where action_name = 'ALTER DATABASE' order by 1;

EVENT_TIMESTAMP          DBUSERNAME SQL_TEXT
------------------------ ---------- ------------------------
16-09-06 09:20:43.441958 SYS        ALTER DATABASE   MOUNT
16-09-06 09:21:04.468813 SYS        ALTER DATABASE OPEN
16-09-06 09:23:39.355402 SYS        ALTER DATABASE DISMOUNT
16-09-06 09:24:01.995592 SYS        ALTER DATABASE   MOUNT
16-09-06 09:24:03.054083 SYS        ALTER DATABASE OPEN
``` 



以上
[小ネタ] Rubyのキーワード引数で受け取った値をHashとしてまとめて取得するgem

最近、仕事が忙しくて、小物のgemを作るというoutputが無かったので、思い付いたものを無理矢理形にしてみた。
タイトル通りで、キーワード引数で受け取った値をHashとしてまとめて取得するgem。

どういうものかというと以下の様な感じになる。

[joker1007/given_keyword_args](https://github.com/joker1007/given_keyword_args)

```rb
require 'given_keyword_args'

class Dummy
  def dummy(foo:, bar: "bar", **options)
    given_keyword_args
  end

  def dummy_with_rest(foo:, bar: "bar", **options)
    given_keyword_args_with_rest
  end
end

p Dummy.new.dummy(foo: "foo", other1: "other1", other2: "other2") # => {foo: "foo", bar: "bar"}
p Dummy.new.dummy_with_rest(foo: "foo", other1: "other1", other2: "other2") # => {foo: "foo", bar: "bar", other1: "other1", other2: "other2"}
```

なんで、こんなのが欲しいかというと、例えばCLIツールのエントリポイントとして割と多くのキーワード引数をオプションで受け取るタイプのメソッドがあったりすると、内部でメソッドを細かく分けた時に、ほぼ同じキーワード引数を続きの処理にぶん投げる、みたいなことがしばしばあって、それを一々同じこと書くのが面倒だったからです。

こういうのが……

```rb
class Dummy
  def dummy(foo:, bar: "bar", aws_access_key: nil, aws_secret_access_key: nil, aws_region: nil)
    puts foo
    continue(
      bar: bar,
      aws_access_key: aws_access_key_id,
      aws_secret_access_key: aws_secret_access_key,
      aws_region: aws_region
    )
  end

  def continue(bar: "bar", , aws_access_key: nil, aws_secret_access_key: nil, aws_region: nil)
    # ...
  end
end
```

こうなる。

```rb
class Dummy
  def dummy(foo:, bar: "bar", a: 1, b: 2, c: 3)
    puts foo
    continue(**(given_keyword_args.tap { |h| h.delete(:foo) }))
  end

  def continue(bar: "bar", a: 1, b: 2, c: 3)
    # ...
  end
end
```

まあ、これぐらいだとそんなに差は無いかもしれない……。

内側で割と無茶やってて、ローカル変数を`binding.local_variable_get`で取得しているのだが、引数を使わずに暗黙のうちにbindingを受け渡す必要があって、こんな些細なことのためにC拡張になってたりするし、多分あんまりパフォーマンス良くない。
名前は違っててもいいので、本家に入れてくれんかなあと少し思う。
【css】要素を選択不可にする

jQuery UI 1.9 で `.disableSelection()` はdeprecated(非推奨)になっている[^jquery]。

だから、CSSで代替する[^reference](か、そもそもweb画面上のものを選択不可にしたりするのを止めるかした)方がいい。

```css
* {
   -ms-user-select: none; /* IE 10+ */
   -moz-user-select: -moz-none;
   -khtml-user-select: none;
   -webkit-user-select: none;
   user-select: none;
}

.selectable {
   -ms-user-select: auto;
   -moz-user-select: auto;
   -khtml-user-select: auto;
   -webkit-user-select: auto;
   user-select: auto;
}
```

このCSS要素はOpera Mini 以外の主要ブラウザでサポートされているとのこと[^support]。


### 参考と注釈

[【jQuery UI】テキストの選択を無効にする(disableSelection) - Qiita](http://qiita.com/kazu56/items/c707e06295dc1ddd3f64)

[^jquery]: [.disableSelection() - jQuery UI 1.12 API Documentation](http://api.jqueryui.com/disableselection/)

[^reference]: [jQuery UI の.disableSelection()がdeprecated（非推奨）になってる件 - kamegu's memo](http://kamegu.hateblo.jp/entry/jquery-ui/disable-selection)

[Why is .disableSelection() deprecated? - stack overflow](http://stackoverflow.com/questions/13959336/why-is-disableselection-deprecated)

[^support]: [Can I use user-select ? ](http://caniuse.com/#search=user-select)
Elasticsearch(2.4)のQuery一覧 ~その1~

# ElasticsearchのQuery一覧
Elasticsearch使い始めて少し慣れてきたので、[ドキュメント](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl.html)にあるQueryを簡易翻訳しつつまとめる。最初は一回で全部書くつもりだったけど、結構量があったので何回かに分けて書くことにした。
実用例等踏まえて書くよー！

# Match All Query
全てのドキュメントにマッチするQuery。
```inner_hits```でChildTypeのものを引っ張ってきたり、```Nested Query```や```Has Child Query```や```Has Parent Query```のような```Joining queries```で使うことが多い。

# Full Text Query
全部検索する時に使う。検索するテキストもフィールドに指定されているanalyzer、またはQuery内指定したanalyzerで分解、変換してから検索をかけるよ。日本語検索しようとした時、デフォルトのanalyzerだと大体うまくいかないので、kuromoji_analyzerを使って検索することが多い。英語の場合はデフォルトでも結構いける。

## Match Query
基本的にこれ使っておけばおkみたいなQuery。
テキストでしか使ったことないけど、数字とか日付でも使えるみた。

## Multi Match Query
Match Queryの複数のフィールドを選択できるもの。
スコアリングの方法に```best_fields```、```most_fields```等ある。

## Common Terms Query
よく出てくる単語（"The", "and", "not"等）があると、サーチテキストに対してい本当に関係性の高いものが抽出されなくなる問題を解決するためのQuery。
よく出てくる単語に対するウェイトを低下させ、あまり出てこない単語のウェイトを上げる方式をとっている。
学校の検索とかするときに使えそう。

## Query String Query
自分好みのFull Text Queryを作りたいときに使うQuery。
色々設定できるみたい。

## Simpe Query String Query
```query_string``` の例外を投げなかったり、無効なQueryを無視するQuery。

#　まとめ
```Full Text Query```は```Match Query```で事足りる。
```Match Query```でスコアリングがうまくいかない時に他のQueryを使うことを検討するのがいい。
OpenWrtのソースパッケージ一覧

ググって目についたOpenWrtのソースパッケージ一覧を自分用メモとして残しておきます。

OpenWrtの独自パッケージを作る上で参考になるかもしれません。

## 公式パッケージ(OpenWrt)

- https://github.com/openwrt/packages
- https://github.com/openwrt/luci
- https://github.com/openwrt-routing/packages
- https://github.com/openwrt/telephony
- https://github.com/openwrt-management/packages

## 公式パッケージ(LEDE)

- [https://git.lede-project.org/feed/packages.git](https://git.lede-project.org/?p=feed/packages.git;a=tree)
- [https://git.lede-project.org/feed/routing.git](https://git.lede-project.org/?p=feed/routing.git;a=tree)
- [https://git.lede-project.org/feed/telephony.git](https://git.lede-project.org/?p=feed/telephony.git;a=tree)

## 非公式パッケージ

- https://github.com/shadowsocks/openwrt-shadowsocks
- https://github.com/arduino/openwrt-packages-yun
- https://github.com/OnionIoT/OpenWRT-Packages
- https://github.com/CreatorDev/openwrt-feeds
- https://github.com/mwarning/zerotier-openwrt
- https://github.com/mkschreder/juci-openwrt-feed (`.travis.yml`あり)
- https://github.com/carrierwrt/easycwmp
- https://git.allseenalliance.org/cgit/core/openwrt_feed.git/tree/?h=feature/ajtcl
- https://github.com/EasyPi/openwrt-kcptun (`.travis.yml`あり、Docker利用していて参考になる)

## 非公式パッケージ（メンテ終了）

- https://github.com/awilliams/ruby-openwrt (Last Update: Feb 2012)
- https://github.com/tomaszmrugalski/portproxy (Last Update: Jan 2012)
- https://github.com/pdf/openwrt-14.07-x86_64-packages (for 14.07)
- https://github.com/mrumpf/openwrt-packages (for 10.3)
9/5　今日の学習内容～コントローラの命名規約について学習～

###今日の学習内容
***
今日はコントローラの命名規約について[改訂３版基礎Ruby on Rails](https://www.amazon.co.jp/dp/4844338153)を読んで学習していきました。

####まず、コントローラの役割って？
***
コントローラの役割は**モデルからデータを受け取り、ビューにレンダリングをさせる**こととブラウザーから**リクエストを受け取る**こと、また、**レスポンスを返すこと**です。

リクエスト処理の流れについては一昨日の学習内容に書いてあるので、こちらもどうぞ(-ω-)/
>[9/3　今日の学習内容～Railsのリクエスト処理の流れについて学習～](http://qiita.com/shouxuohs/items/2f932dc8a01d0f38fdaa)

ちなみに、コントローラは**``ApplicationController``クラスのサブクラス**として実装するそうです。

そういえば、[コントローラを作ったとき](8/28　今日の学習内容～cloud9でコントローラとアクションの作成！～)の``top_controller.rb``に、``class TopController < ApplicationController``と書いてありましたね(´-ω-`)


####命名規約について
***
Railsの原則の一つに**「設定より規約」**とあったように、モデル、コントローラ、ビューに関するクラスやファイルには命名規約があるそうです( ..)φメモメモ

ここでは、コントローラに関する命名規約について書いていきたいと思います(-ω-)/

例として、コントローラ名を``top``とした場合の命名の仕方を書いてみますね。

| 　　名前を付ける対象|　　　　例 | 
|:-----------------|------------------:|
| コントローラクラス             |             TopController  |   
| コントローラファイル           |            top_controller.rb |    
| テンプレートのフォルダ             |              app/views/top |   
| テストスクリプトのファイル               |                top_controller_test.rb |      

最後のテストスクリプトのファイルについては、後々学習していくことになっているので、今日は特に触れないということで...(@_@。

###あとがき
***
今日はコントローラの命名規約について学習しました。
Railsの原則に、**「設定より規約」**というものがあったということを、今日、命名規約について学習するまで忘れていました(笑)
ほかにも「**DRY**（Don't Repeat Yourself）繰り返しを避けよ」という原則もありましたね(@_@。
この原則を忘れずに学習していきたいですね(-ω-)/

...三日後には忘れていそうですが(;´д｀)

###参考にさせていただいたサイトなど
***
[改訂３版基礎Ruby on Rails](https://www.amazon.co.jp/dp/4844338153)
[Rubylife　コントローラの作成と命名規則(命名規約)](http://www.rubylife.jp/rails/controller/index1.html)
nginxについてまとめ(導入編)

## 概要
- nginx(エンジンエックス) = Apacheなどと同様のWebサーバ
- フリーかつオープンソース(BSD。ただし企業主導で開発している)
- 実装はCで、マルチプラットフォーム対応
- C10Kが問題視された頃から、高速処理できるサーバとして着目された


## 特徴

### フル機能のHTTPサーバ
- ロギング, 仮想サーバ, SSL, rewrite, アクセスコントロール, KeepAlive, HTTP/2などはデフォルトで使える
- Apacheと同様に、モジュールにより拡張可能

### イベント駆動方式
- 単一のプロセスがリクエストをどんどこ捌いていくイメージ
- Apacheのように、リクエストに対してプロセスあるいはスレッドの割当が不要なので高速、省メモリ
- ただしメモリ空間は全リクエスト共有になるため、それに関連してアプリケーションサーバとしての利用に制限がある
- シングルプロセスなので、ひとつの処理に時間がかかると他のレスポンスに影響する


### リバースプロキシ(キャッシュサーバ)として利用可能
- SSLアクセラレータ、ロードバランサとしても動作する
- SMTPなどHTTP以外のプロトコルのロードバランスも可能

### アプリケーションサーバとしては動作__しない__
- Webアプリをnginxが直接動かすことはできない
- その場合は別途Appサーバを別途用意し、nginxはそのリバースプロキシとして振舞う
- AppサーバとnginxはFastCGIやPassengerで接続される

### その他
- `nginx-biuld`という専用のビルドツールがあり、依存性解決やバージョン管理が容易
- 設定変更時に再起動不要


## 導入方法

### インストール
パッケージマネージャでインストールできる

```bash:OSX
$ brew install nginx
```

```bash:RH系Linux
$ sudo yum install nginx
```

### 基本コマンド

```bash
# 起動
$ nginx

# 停止
$ nginx -s stop

# 設定の再読み込み
$ nginx -s reload

# 設定ファイルのテスト
$ nginx -t
```


### 設定
- brewでOSXにインストールした場合、設定ファイルは`/usr/local/etc/nginx/`にあった
- 設定ファイルは復数あるが、基本的には`nginx.conf`をいじればよさそう

    file | desc
    --- | ---
    nginx.conf | Nginx全般の設定
    mime.types | MIMEタイプと拡張子の関連
    fastcgi_params | FastCGI設定
    scgi_params | SCGI設定
    uwsgi_params | uWSGI設定

- 設定ファイルの基本構文は簡単そう
    - コメントは`#`
    - ディレクティブは `ディレクティブ名 { ... }`
    - 各プロパティは `プロパティ 値 ;`


## 参考
### 概要/比較
- [Wikipedia - nginx](https://ja.wikipedia.org/wiki/Nginx)
- [Qiita - Apacheとnginxどちらを採用すべきかメリット・デメリット比較](http://qiita.com/pink/items/7709218310b5cf11eabe)
- [Qiita - apacheとnginxの比較表とベンチマーク](http://qiita.com/sion_cojp/items/edb20a6b87f10e186c23)
- [金沢ではたらく新米エンジニアの日記 nginxってよく聞くけどApacheとどう違うかよくわからないので調べてみる。](http://hayatan.hatenablog.com/entry/2015/01/28/001658)
- [@IT - これから始める人のためのNginx](http://www.atmarkit.co.jp/ait/articles/1406/17/news013.html)

### 導入/利用方法
- [Qiita - nginx コマンド超シンプル早見表](http://qiita.com/katzueno/items/44e02db2f1bfa0de5860)
- [インフラエンジニアWay - nginx連載3回目: nginxの設定、その1](https://heartbeats.jp/hbblog/2012/02/nginx03.html)
ポートを使用している犯人を捜す

## ポートを使用している犯人を捜す
Eclipseなどで開発していると、いつの間にかTomcatで使用しているポートが塞がってしまって起動しなくなってしまう。
> ローカル・ホスト の Tomcat v6.0 サーバー で必要なポート 8009 はすでに使用中です。
> サーバーはすでに別のプロセスで稼働中であるか、システム・プロセスがそのポートを使用中である可能性があります。
> このサーバーを始動するには、他のプロセスを停止するか、ポート番号を変更する必要があります。

そんな時の対処方法。

### 1.ポートのPIDを確認する
コマンドプロンプトを立ち上げ、ポートを使用しているPIDを確認する。

```bat
netstat -nao
```

見る箇所は、ローカルアドレスが「0.0.0.0」とかでも構わないみたい。

### 2.PIDからプロセスを突き止める
- タスクマネージャーを立ち上げ、詳細タブをクリック
- PIDから該当するプロセスを確認する。初期状態たどPIDは表示されないので、設定で表示させる
- コマンドで確認する場合は、下記を実行

```bat
tasklist /svc /fi "PID eq [プロセスID]"
```
math > x^2 sin^2(kx)の積分


CG分野で使われるSpherical Harmonics。自分の数値シミュレーション計算に用いたいと思い調べると、量子化学の講義にたどり着く。

そして関連ビデオを見ていると出てきた数式。

何気なく自分で導出した式とビデオの式の符号が違う。

導出方法としては以下と同じようなもの。
関連 http://qiita.com/7of9/items/8874fea77ea1a325c7f2

- 半角の公式
- 部分積分 x 2

を使う。

```math
\int{x^2 sin^2(kx)}dx
= \int{x^2\frac{1-cos(2kx)}{2}}dx
```

```math
= \frac{x^3}{6} - \int{\frac{x^2}{2}cos(2kx)}dx
```

ここで部分積分 (f=x^2/2, g'=cos(2kx))

```math
= \frac{x^3}{6} - \frac{x^2}{2}\frac{1}{2k}sin(2kx) + \int{x\frac{1}{2k}sin(2kx)}dx
```

```math
= \frac{x^3}{6} - \frac{x^2}{4k}sin(2kx) + \int{\frac{x}{2k}sin(2kx)}dx
```

ここでまた部分積分 (f=x, g'=sin(2kx))

```math
= \frac{x^3}{6} - \frac{x^2}{4k}sin(2kx) + \frac{1}{2k}(x\frac{1}{2k}(-cos(2kx)) - \int{\frac{1}{2k}(-cos(2kx))}dx
```

```math
= \frac{x^3}{6} - \frac{x^2}{4k}sin(2kx) - \frac{x}{4k^2}cos(2kx) + \frac{1}{4k^2}sin(2kx)\frac{1}{2k}
```

```math
= \frac{x^3}{6} - (\frac{x^2}{4k} - \frac{1}{8k^3})sin(2kx) - \frac{x}{4k^2}cos(2kx)
```

```math
= \frac{x^3}{6} - \frac{2k^2x^2-1}{8k^3}sin(2kx) - \frac{x}{4k^2}cos(2kx)
```

上記得られた式ではcos(2kx)の項の符号はマイナスと出た。
ビデオの人は符号をプラスとしている。

(追記 2016/09/07)
本人に連絡をとっていたところ、符号はマイナス（こちらの結果）が正しかったとのことだった。

別途、同じビデオに出ていた別の間違いも将来バージョンのスライドで修正済みとのこと。
Rails on Tiles yokohama.rb


http://qiita.com/Nabetani/items/1234c313776b6588a9d8
そういえば解くの忘れてた

- `SELFTEST=1 ruby ...`で自己テスト、そうでない場合1行拾って1行返すモードになります
- 解いてから気がついたのですが、[めぐるセル](http://qiita.com/Nabetani/items/d6ac6695787e76758a18)の方はテストデータがC用なんですね。

```rb
#!/usr/bin/env ruby
#http://nabetani.sakura.ne.jp/yokohamarb/2016.07.ront/
#http://qiita.com/Nabetani/items/1234c313776b6588a9d8
D=[[1,0],[0,1],[-1,0],[0,-1]]
C=[
	[3,2,1,0],
	[1,0,3,2],
	[0,1,2,3],
]

def solve(s)
	res=''
	a=s.split('/').map{|e|e.chars.map(&:to_i)}
	d=1;x=1;y=0
	while 0<=x&&x<4&&0<=y&&y<4
		res+=(y*4+x+97).chr
		break if a[y][x]==3
		d=C[a[y][x]][d]
		x+=D[d][0];y+=D[d][1]
	end
	res
end

if !ENV['SELFTEST']
	while gets
		puts solve($_.chomp)
		STDOUT.flush
	end
else
	$case=0
	def test(s,t)
		puts 'Case '+$case.to_s+': '+(solve(s)==t ? 'OK' : 'NG')
		$case+=1
	end
test( "0113/1201/2201/2100", "bcgfeabfjnoklpo" ) # 0    
test( "2110/2013/2210/0122", "bcgh" ) # 1    
test( "2222/2130/2121/2002", "bfg" ) # 2    
test( "0021/2212/2102/1220", "baeimnoplhdcbfjkgfe" ) # 3    
test( "0213/1221/0220/1103", "bfjnokgcbaefghlkjimn" ) # 4    
test( "3201/3120/3333/3333", "bfghdcgk" ) # 5    
test( "3233/3233/3133/3333", "bfjk" ) # 6    
test( "3333/3333/3333/3333", "b" ) # 7    
test( "1212/1201/2123/2220", "bfjkl" ) # 8    
test( "2212/3102/1002/2100", "bfgcba" ) # 9    
test( "0023/2221/1102/0031", "baeijnm" ) # 10    
test( "1121/3120/0212/1120", "bcdhgfba" ) # 11    
test( "2202/3211/2120/1210", "bfjklhgcd" ) # 12    
test( "3201/3211/1111/0100", "bfjkonjie" ) # 13    
test( "0121/1120/1111/1211", "bcdhgfbaefjkop" ) # 14    
test( "1212/1213/2103/0213", "bfjkgfea" ) # 15    
test( "1121/2212/1323/3031", "bcdhl" ) # 16    
test( "0030/1230/1121/0031", "baefg" ) # 17    
test( "2223/1211/0002/1200", "bfjimnokl" ) # 18    
test( "3210/0033/0201/0130", "bfei" ) # 19    
test( "0213/2220/0021/3002", "bfjim" ) # 20    
test( "2121/2112/1110/1010", "bcdhlkgfba" ) # 21    
test( "0113/1003/2303/2220", "bcgfj" ) # 22    
test( "2202/1110/1302/0313", "bfgkj" ) # 23    
test( "1211/3202/2102/0222", "bfjkgh" ) # 24    
test( "3113/0002/0112/1022", "bcgfjko" ) # 25    
test( "1200/3000/0121/0121", "bfe" ) # 26    
test( "2221/1122/1031/2200", "bfgh" ) # 27    
test( "1202/0121/0222/1300", "bfghlpo" ) # 28    
test( "0002/1012/1021/3300", "baefbc" ) # 29    
test( "0211/1200/2220/2103", "bfjnokghdc" ) # 30
end
```
「Botkit + 雑談対話API」を使ってSlack上でBotと会話してみる！

## Botkit

Slack用のBotを簡単に作るためのフレームワーク  
https://github.com/howdyai/botkit


## 雑談対話API

docomoが公開している、ユーザが入力したテキストを受け付け、その入力に対して自然な会話となる雑談を提供する  
https://dev.smt.docomo.ne.jp/?p=docs.api.page&api_name=dialogue&p_name=api_usage_scenario

## SlackのBotの追加

以下のURLにアクセスしてBotを作成する

https://my.slack.com/services/new/bot

![2016-04-24_23h57_05.png](https://qiita-image-store.s3.amazonaws.com/0/49429/6013a658-a243-684b-1ad5-bf0effc4d486.png)

![2016-04-24_23h59_29.png](https://qiita-image-store.s3.amazonaws.com/0/49429/42a20117-f3b0-4448-f5d4-a1c51827ce73.png)

※API token以外は必要な部分を変更する

## docomo Developer supportアカウントの作成

以下URLからアカウントを作成する

https://dev.smt.docomo.ne.jp/?p=login

1. アカウント取得後、マイページから `新規API利用申請` を行う。  
2.  `API機能選択` で `雑談対話` を選択する
3. 申請した `アプリケーション情報` から `API key` を取得する

## node環境の構築

node環境を構築します。  
※既にnodeがインストールされている場合は、飛ばしてください。

```
yum install epel-release
yum install nodejs npm --enablerepo=epel
```

## Botkitインストール

```
git clone https://github.com/howdyai/botkit.git
cd botkit
npm install
```

## Botkitサンプルを動作させる

```
token=[Slack Bot用のAPI Token] node slack_bot.js
```

1. 適当なチャンネルに作成したBotを招待する
2. `@作成したbot名 hello`
3. `Hello.` と返してくれれば成功

## 雑談対話APIを組み込んだjsファイルを作成する

```
if (!process.env.token) {
    console.log('Error: Specify token in environment');
    process.exit(1);
}

var Botkit = require('./lib/Botkit.js');
var request = require('request');

var controller = Botkit.slackbot({
    debug: false
});

var bot = controller.spawn({
    token: process.env.token
}).startRTM();


var context = '';
var mode = 'dialog';
var place = '福岡';

controller.hears('', 'direct_message,direct_mention,mention', function(bot, message) {

    var options = {
        url: 'https://api.apigw.smt.docomo.ne.jp/dialogue/v1/dialogue?APIKEY={docomo雑談対話API keyを指定する}',
        json: {
            utt: message.text,
            place: place,

            // 以下2行はしりとり以外の会話はコメントアウトいいかも
            // 会話を継続しているかの情報
            context: context,
            mode: mode
        }
    }

    //リクエスト送信
    request.post(options, function (error, response, body) {
        context = body.context;
        mode = body.mode;

        bot.reply(message, body.utt);
    })

});
```

### 実行する

```
token=[Slack Bot用のAPI Token] node docomo.js
```

以下、2つのどちらかで会話することが可能

1. 適当に `@作成したbot名 適当な会話` で会話をする
2. 「@作成したbot名 しりとり」と実行するとしりとりを行える(やり取り中も@ボット名が必要)
Neomakeで独自のmakerを作って使う


[前回の記事](http://qiita.com/mihyaeru21/items/571b3a787ec78ed4c319)では、watchdogs.vimを使って、`env.sh`を噛ませたPerlのシンタックスチェックとUnite.vimを紹介した。
今回は、VimではなくNeoVimを使っている場合に、watchdogs.vimよりも動作が軽く（体感では）、依存プラグインが少ない[Neomake](https://github.com/neomake/neomake)を紹介する。

## インストール

- `neomake/neomake`を好きなプラグインマネージャで入れる
- watchdogs.vimのために入れたプラグインは、（他で使ってなければ）全て外しても大丈夫

## 設定

[ヘルプ](https://github.com/neomake/neomake/blob/master/doc/neomake.txt)を読めばすべてが分かる。
最低限、これだけ書いておけば保存時にチェックしてくれる

```vim
autocmd! BufWritePost * Neomake
```

## `env.sh`を噛ませる設定

この設定により、プロジェクトルートにある`env.sh`を噛ませつつ`perl`で実行できるようになる。

```vim
let g:neomake_perl_envperl_maker = {
\   'exe'           : './env.sh',
\   'args'          : ['perl', '-wc'],
\   'errorformat'   : '%E%m at %f line %l%s',
\   'postprocess'   : function('neomake#makers#ft#perl#PerlEntryProcess'),
\   'buffer_output' : 1,
\ }

let g:neomake_perl_enabled_makers = ['envperl']
```

`g:neomake_perl_envperl_maker`は`g:neomake_{ language }_{ makername }_maker`という構造になっている（[README](https://github.com/neomake/neomake/blob/master/README.md)より）。
Perl向けに新たに`envperl`というmakerを定義した。

`g:neomake_perl_enabled_makers`は`g:neomake_{ language }_enabled_makers`という構造になっている。
これに今作成した`envperl`というmakerのみを設定することで、Perlにおいてはデフォルトの設定を上書きし`envperl`のみでチェックを行うようになる。
サバティカらないゲーム開発ブログ 0日目


<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">なんかゲーム作ってリリースするならサバティカルしなくてもできるんじゃね？そうUnityならね！(ポジショントーク)という気がふつふつとしてきたので、ぼくもゲーム作ってリリースしてみようかな…。</p>&mdash; tnayuki (@tnayuki) <a href="https://twitter.com/tnayuki/status/772334033711747072">2016年9月4日</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

というわけで、できる範囲できるゲームアプリを作ってリリースしてみようと思いたったのが昨日(諸事情ありこの記事は今日になってから片手で書いている)。

そしてどうせならAdsやAnalyticsもバリバリ使って、ガンガン収益あげていきたい(あれ、ぼくはUnity使って収益あげちゃいけないんだっけ？そんなことないよなぁ)。

で、問題はどんなゲームを作るかだが、そもそもまず今までどんなゲームを作ったか振り返ってみる。

## おちてゆく〜

MSXで作った、ただただ下にスクロールする穴を壁にぶつからないように主人公を左右に操作し、落ちてゆくゲーム。落下スピードは徐々に速くなっていき、生き残った時間におうじて人生の価値(スコア)が決まる。

## POINT-7

同じくMSXで作った、クォーク(だったかな)にインスパイアされた上スクロールシューティング+パズルゲーム。上から落ちてくる1〜6の数字が書かれたブロックを、合計が7になるように素早く切り替えて自機からブロックを打ち出して消去する。なんかしら連鎖もあった気がする。

* * *

あれこんだけ？と思ったが、ちゃんとゲームとして完成して記憶に残ってるのはこのふたつしかないかも…。いまいちアプリで作って受けるゲームにつながる気がしない…どうしよう。
RStudio Connect (β）を試してみた


## はじめに
- RStudio 社が提供しているプロダクト[RStudio Connect](https://www.rstudio.com/products/connect/)です。
- トップに書いてることを参照すると **RStudio Connect is a new publishing platform for the work your teams create in R. Share Shiny applications, R Markdown reports, dashboards, plots, and more in one convenient place.**
からオンプレで使えるRの分析結果をチーム内に共有できるサービスみたい。RPubsのオンプレ版がずっと欲しかったので良いサービスかもと期待。
- **Use push-button publishing from the RStudio IDE, scheduled execution of reports, and flexible security policies to bring the power of data science to your entire enterprise.** からボタン1つでPublishできたり、スケジュール機能もあるみたい
- ひとまずインストール、設定、Publishまでやってみた

## インストール

- [RStudio Connect](https://www.rstudio.com/products/connect/)からアカウントを登録してダウンロード方法を得る
- と思ったら、[RStudio Connect: Admin Guide](http://docs.rstudio.com/connect/admin/getting-started.html#installation)にものっていた
- 適当なサーバに下記のとおりインストール

```
$ sudo apt-get install r-base
$ sudo apt-get install gdebi-core
$ wget https://download-url/rstudio-connect-0.5.0.870.deb
$ sudo gdebi rstudio-connect-0.5.0.870.deb

```

- インストールが完了すると、そのままサービスが起動する

## サービス確認
- デフォルトだと、Port 3939でブラウザをたたけば見れました
- 最初にアカウントを作る
	- LDAP等のサービスと連携できるみたい


![top.png](https://qiita-image-store.s3.amazonaws.com/0/69266/c1f0a508-1328-48bc-c5e7-d10e631c5e5f.png "top.png")

## RStudio と連携

### 準備

- 手持ちのRStudioを立ち上げる
	- ドキュメントによると0.99.878 以上のバージョンが必要
- 以下のコマンドで有効化

```R
> .rs.enableRStudioConnectUI(TRUE)
RStudio Connect UI enabled.
```

### 設定
- [Tools] -> [Global Options] -> [Publishing] で Connect からサーバ情報とアカウントを連携させる
- 問題なくSuccessとなりました

## PlotとRmdのPublishing を試してみる
- iris の ggplotやデフォルトのRmdをPublish
- グラフやレポートがRStudio Connectに表示される
	- 権限設定もできそうで、見せる範囲も決めれそう？

**Topページ**

![home.png](https://qiita-image-store.s3.amazonaws.com/0/69266/829874c3-18e7-dd1a-116e-cc0ae6e13276.png "home.png")


## おわりに
- まだβ版でこれから本格化するみたいですがインタフェースもシンプルな見た目なので期待しています

## 参考
- [RStudio Connect](https://www.rstudio.com/products/connect/)
- [RStudio Connect: Admin Guide](http://docs.rstudio.com/connect/admin/index.html)
capistrano で Docker コンテナ内に直接デプロイ出来るようにしてみた

みなさん [Docker](http://docker.com/) 使ってますか？
とても便利なんですが、アプリケーションをコンテナ内に押し込むノウハウはまだまだ発展途上で、今まで本当に色んなアプローチが模索されています。

rails app に関しても既に色んな方法があるんですが。

はい。既にあるんですが。**便利な capistrano が使いたいんじゃ！　そのまま！** ……というわけで、今回 capistrano がそのまま使えるようにしてみました。

## 手順

先に手順行きます。こんな感じで使えます。

### まず Gemfile に以下を追加

```rb
gem 'capistrano-deploy_into_docker', '>= 0.2.0', group: :development
```

でもって bundle

```shell-session
$ bundle
```

### Capfile でタスクの require

Capfile の後ろの方に以下を追加します。

```rb
require 'capistrano/deploy_into_docker'
```

### デプロイ設定

デプロイ設定(config/deploy/docker.rb とか)は例えば以下のようにします。 

```rb
set :sshkit_backend, SSHKit::Backend::Docker
set :stage, :production
set :branch, 'production'
set :deploy_to, '/var/local/app'
fetch(:default_env).merge!(rails_env: :production, SECRET_KEY_BASE: 'dummy', DEVISE_SECRET_KEY: 'dummy')

fetch(:linked_dirs, []).clear
fetch(:linked_files, []).clear

server docker: {
    image: 'sugi/rails-base',
    commit: 'myapp-web',
  }, user: 'rails:rails', roles: %w{web app}
```

ポイントはサーバ定義と `:sshkit_backend` 設定です。
その他に関しては、ご自分の環境やイメージに合わせて変更して下さい。（ここで指定している `sugi/rails-base` イメージはサンプルで、/var/local/app に rails:rails ユーザ/グループでアプリケーションを配置する構造になっています。）

これだけで docker のイメージからコンテナを立ち上げ、その中にデプロイし、終わったら commit までを自動で行います。

```shell-session
$ bundle exec cap docker deploy
```

もし、docker run にオプションを渡したい場合は、hash に書けば(一部を除き)大体何でも渡せます。

```rb
server docker: {
    image: 'ruby:latest',
    commit: 'new-image-name:tag',
    volume: ['/storage/tmp:/tmp', '/storage/home:/home'],
    network: 'my-net',
    dns: '8.8.8.8',
    dns_search: 'example.com',
    cap_add: ['SYS_NICE', 'SYS_RESOURCE'],
  }, user: 'nobody:nogroup', roles: %w{web app}
```

## 今回作ったもの

### [capistrano-deploy_into_docker](https://github.com/sugi/capistrano-deploy_into_docker)

こちらは commit 用のタスクと、各種 require するだけの非常に小さなグルーツールです。

deploy:finished の後に :commit のキーを持つサーバ定義に対して、 docker commit を実行します。

### [sshkit-backend-docker](https://github.com/sugi/sshkit-backend-docker)

メインのライブラリです。このライブラリは [SSHKit](http://github.com/capistrano/sshkit) に Docker バックエンドを追加し、ssh を必要とせずコンテナ内でのコマンド実行をサポートします。
capistrano を経由せずに SSHKit を直接使っている場合でも利用できます。その場合は [README](https://github.com/sugi/sshkit-backend-docker/blob/master/README.md) を参照して下さい。

現状、SSHKit のバックエンドの変更は自動では行われません。capistrano の場合は `:sshkit_backend` に、SSHKit 直接の場合は `SSHKit.config.backend` に `SSHKit::Backend::Docker` をセットする必要があります。

## コメント求む

というわけで、ひとまず使える状態になったので公開してみました。
改善点や、アプローチそのものに関して何かありましたら是非コメント下さい。よろしくお願いします。
Git, GitHub での branch を利用した開発の指針

# 流れ

1. 新しい機能を開発するためのブランチを切る
1. 新しいブランチ内で開発を行いコミットする
1. 1つの機能の開発が完了したら、Pull request（GitHub の機能）を作成する
1. コードレビューをする
1. Pull request が承認されマージされる
1. 開発用のブランチを閉じる


# 新しい機能を開発するためのブランチを切る

* 開発する機能ごとに新しくブランチを切る様にする
* 複数の機能を同時に開発するときは、それぞれ別のブランチに分ける
* ブランチ単位でレビューをすることになるので、ごった煮ブランチは避けたい


# 新しいブランチ内で開発を行いコミットする

* 開発用に分けたブランチで作業をする
* コミットはなるべく細かくする
    * コミットログが『○○と××をした』となる様な複数の作業の入ったコミットは避ける
    * 修正1つにつきなるべく1コミット


# 1つの機能の開発が完了したら、Pull request（GitHub の機能）を作成する

* 1人で開発していて、特にレビューをしないのであれば Git から直接マージしてブランチを閉じてしまっても問題ない
* GitHub にはコードレビューとマージを管理するための Pull request というものがある。
    * コミットの塊に、タイトルとログを付けたもの
    * Pull request 単位でコードレビューをするのが一般的（らしい）
    * マージするかどうかをその後で決める（レビュー結果によっては却下される）


# 開発用のブランチを閉じる

* 1機能1ブランチなので、使いまわしせずにブランチを閉じる
    * 人の名前の付いた永遠に生き続けるブランチは本来は良くない
同一ドメイン上の別ユーザからのCookie盗難を防ぐ

[同一ドメイン上に複数のユーザがいる](http://qiita.com/rana_kualu/items/f9d87279036626278e61#%E5%90%8C%E4%B8%80%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E4%B8%8A%E3%81%AB%E8%A4%87%E6%95%B0%E3%81%AE%E3%83%A6%E3%83%BC%E3%82%B6%E3%81%8C%E3%81%84%E3%82%8B)

> これでセキュリティ問題は解決です。めでたし。

　 　　　*　　　　　　*
　　＊　　　　　＋　　うそです
　 　　 n ∧＿∧　n
　＋　(ﾖ（* ´∀｀）E)
　 　 　 Y 　　　 Y　　　　＊


[全然めでたしじゃなかった](http://qiita.com/rana_kualu/items/f9d87279036626278e61#comment-abd540bd58702a973e5b)。
思いっきり嘘書いてしまったのでもう少し調べてみます。


### bの攻撃

```html:/b/hoge.html
<iframe src="/a/list.php" name="iframeid" id="iframeid" onLoad="hoge();"></iframe>
<a href="#" id="href" onClick="document.body.appendChild(document.createTextNode(iframeid.document.cookie));return false;">Get cookie</a>

<script>
	function hoge(){
		// /b/上にいるが/a/のCookieが取得できる
		document.body.appendChild(document.createTextNode(iframeid.document.cookie));
		document.getElementById("href").click();
		
		// 本文も取れる
		console.log(document.getElementById('iframeid').contentWindow.document.body);
	}
</script>
```

[リンク先のサイト](http://takagi-hiromitsu.jp/diary/20100501.html)では手動でクリックさせていましたが、実際はクリックすら不要で、間違って画面を読み込んでしまうだけで/a/のCookieを取得することが可能です。


### aの抵抗

a側には対抗策があり、/a/list.phpに

```php:/a/list.php
	header('X-FRAME-OPTIONS: DENY');
```

と書いておけばフレームでのファイル読み込みを防ぐことができます。
b側にはBlocked a frameのSecurityErrorが返され、その場合bはaのCookieを読むことはできません。

aもFRAMEを使えなくなりますが、まあ今時フレームなんか使わないから問題ないでしょう。
$.ajax()等では問題なく取得可能です。

b側からフレームでのアクセスはできなくなりましたが、もちろん$.ajax()で本文を取得することは可能です。
しかし、うっかりCookieを画面上に表示していたなどという事故でもないかぎり、aのCookieは取得できません。


### bの反撃

b側もこれに対応して、`src="/a/image.png"`とか`src="/a/notexist.php"`とか指定してきます。
画像などのX-FRAME-OPTIONSを仕込めないファイルはPHPでは対抗できません。
また存在しないファイルを指定した場合は404 Not Foundのエラーが返りますが、その場合は何故かaのCookieが読めてしまいます。


### aの絶対防御

これに対抗するには、a側は.htaccessで

```
	Header always append X-Frame-Options DENY
	RewriteEngine On
	RewriteCond %{REQUEST_FILENAME} !-f
	RewriteRule ^.*$ /a/notfound.html [L]
```

などとしないといけません。
これによって、あらゆるファイルに常にDENYのX-Frame-Optionsがつきます。
また存在しないファイルへのアクセスはエラーページを出すことで、こちらも404 Not FoundではなくSecurityErrorを返すことができます。

逆に言うと.htaccessが設置できないサーバ、設置できてもRewriteEngineが使用できないサーバでは対抗する術がありません。


### bのさらなる攻撃

とりあえずこの状態で、私が調べた限りでは/b/以下から/a/のCookieを読み取ることはできませんでした。

が、逆に考えればよいのだ。
読めなければ書き込めばいいと。

```php:/b/set.php
	setcookie('PHPSESSID', 'evil', time()+999999, '/a/');
```

同一ドメインなので何の抵抗もなくCookieをセット可能です。
あとは/b/set.phpにアクセスした人がaにログインした頃合いを見計らってアクセスすれば、個人情報を取り出せるという寸法です。

まあ、これはセッション固定攻撃そのものなので、きちんと[session_regenerate_id(true)していれば](http://qiita.com/rana_kualu/items/644def9847b116c8f108#enable-sessionuse_strict_mode-by-default)特に問題ないですが。


## まとめ

設定次第では、別ディレクトリからのCookie読み取りを防ぐことは可能のように見える。
何か見逃しているだけだとは思うけど。
書き込みは防げないため、勝手にログアウトされてしまったりという悪戯は可能。

とはいえ、小手先の対策を弄するより、サブドメ切ってくれるサーバに引っ越すのが一番いい。
ファイル名に日時を付加する（正規表現）

# 背景
某ファイルコピー処理:smile:において、ファイル名が重複しないようコピー日時をファイル名に付加したいと思いました。

ちょっと心が折れたので、簡単な所だけ先出だっ！

# 方針
次の様な思いが交錯して実装しました。

* 元のファイル名は極力尊重する
* 日時はファイル名の後ろに付ける
* ファイル名には拡張子は含まない<br/>む、この書き方余り良くないぞよ
* だらだらと処理を書くのはかっちょ悪い
* ちゅー事は正規表現だな

# 結論

```csharp
Regex reg = new Regex(@"(?=\.\w+$)|(?<!\.\w+)$");
string fileName = reg.Replace(元ファイル名, DateTime.Now.ToString("yyyyMMddHHmmssfff"));
```

ま、一行で書いても良いんですけどね。

# 解説
えとー
`(?=\.\w+$)`か`(?<!\.\w+)$`を日時で置き換えろって事ですね。

`(?=\.\w+$)`の方は、文字列末尾にある<font color="red">`.拡張子`</font>の先頭位置にマッチします。
なので、ファイル名の末尾に日時が挿入されます。

`(?<!\.\w+)$`の方は、末尾に<font color="red">`.拡張子`</font>が存在しない文字列末尾にマッチします。
なので、ファイル名の末尾に日時が挿入されます。（あ、おんなじだ）

`(?=\.\w+$)`と`(?<!\.\w+)$`は排他的な条件なので、与えられた文字列に対して、日時が必ず１セットだけ付加される事になります。
<br/>
やたー
tmuxを使っている時にvimのlightlineとlessの検索結果に色をつけたい。


最近tmuxとvimのプラグインを使い始めて、色々設定した際にメモです。

もし他に良い方法があれば是非教えてください。

## やりたいこと

tmux内で次のことをしたい。

* vimのlightlineでステータスラインに色をつける。
* lessで検索した結果をハイライト表示する。

## 環境

* OS: OSX 10.11.6
* iTerm: 3.0.9
* tmux: 2.2
* vim: 7.4.2290

## 設定

いまのところ一番良さそうな設定

```
set -g default-terminal "screen-256color"
set -as terminal-overrides 'screen*:smso=\E[30;43m,rmso=\E[39;49m'
```

## ダメだった方法

[Fixed highlighting in tmux](http://superuser.com/questions/891336/fixed-highlighting-in-tmux)
を参考にterminfoを作成し、tmux.confで`set -g default-terminal "screen-hack_color"`としました。

```
#	Reconstructed via infocmp from file: /usr/share/terminfo/73/screen-256color
screen-hack_color|screen with italics support,
	am, km, mir, msgr, xenl,
	colors#256, cols#80, it#8, lines#24, ncv#3, pairs#32767,
	acsc=++\,\,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
	bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, civis=\E[?25l,
	clear=\E[H\E[J, cnorm=\E[34h\E[?25h, cr=^M,
	csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
	cud=\E[%p1%dB, cud1=^J, cuf=\E[%p1%dC, cuf1=\E[C,
	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\EM,
	cvvis=\E[34l, dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM,
	dl1=\E[M, ed=\E[J, el=\E[K, el1=\E[1K, enacs=\E(B\E)0,
	flash=\Eg, home=\E[H, ht=^I, hts=\EH, ich=\E[%p1%d@,
	il=\E[%p1%dL, il1=\E[L, ind=^J, initc@, is2=\E)0, kbs=^H,
	kcbt=\E[Z, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
	kdch1=\E[3~, kend=\E[4~, kf1=\EOP, kf10=\E[21~,
	kf11=\E[23~, kf12=\E[24~, kf2=\EOQ, kf3=\EOR, kf4=\EOS,
	kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~,
	khome=\E[1~, kich1=\E[2~, kmous=\E[M, knp=\E[6~, kpp=\E[5~,
	nel=\EE, op=\E[39;49m, rc=\E8, rev=\E[7m, ri=\EM, rmacs=^O,
	rmcup=\E[?1049l, rmir=\E[4l, rmkx=\E[?1l\E>, rmso=\E[27m,
	rmul=\E[24m, rs2=\Ec\E[?1000l\E[?25h, sc=\E7,
	setab=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m,
	setaf=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m,
	sgr=\E[0%?%p6%t;1%;%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;m%?%p9%t\016%e\017%;,
	sgr0=\E[m\017, smacs=^N, smcup=\E[?1049h, smir=\E[4h,
	smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m, tbc=\E[3g, sitm=\E[3m, ritm=\E[23m,
```


```
set -g default-terminal "screen-hack_color"
```

lessの色はつくがsshした時に、TERMがscreen-hack_colorになってしまう。
サーバにログインするたびに、警告がでるのはうざったい。

## ドットファイル

* [dotfiles](https://github.com/hiroyuki-sato/dotfiles)

## 参考サイト

* [Italics - OS X El Capitan](https://github.com/tmux/tmux/issues/435)
* [Fixed highlighting in tmux](http://superuser.com/questions/891336/fixed-highlighting-in-tmux)
* [Make Less highlight search patterns instead of italicizing them](http://unix.stackexchange.com/questions/179173/make-less-highlight-search-patterns-instead-of-italicizing-them)
絵文字保存時に Incorrect string value: '\xF0\x 9F\x98\x84\xF0\x9F...' 

## 状況

development環境では動作するがproduction環境で動かなくてはまった。
エラーでとる。

```
Incorrect string value: '\xF0\x9F\x99\x80' for column `emoji_text` at row 1
```
文字コードに違いない。

## とりあえず動かす

MySQL上で絵文字を保存するテーブルの文字コードが「utf8mb4」になっていなかった。

```
show create table emojina_contents;
ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC

alter table emojina_contents convert to character set utf8mb4;

show create table emojina_contents;
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC
```

## 原因

さて、では、なぜmigrationしたときに utf8 で作成されたのか。

答えは、データベースの文字コードが間違ってた。

```
show create table emojina_db;
/*!40100 DEFAULT CHARACTER SET utf8 */ |
```

DBをSQLでつくってしまったのだろう。
rake db:create ならば問題ないのに。

SQLでDBを作るときは、明示的に指定する必要ありです。（もちろんmy.cnfでも可)

```
create database emojina_db CHARACTER SET = 'utf8mb4';
```
AH01276エラーの対処メモ

#AH01276
大体フォルダの書き込み権限がない感じ。
ユーザーに対してW(ライト)権限を与えましょう
こちらを参照
URL:http://itdoc.hitachi.co.jp/manuals/link/has_v1000/0344201D/mergedProjects/guimessage/ah01276.htm
Browsersyncでsvgz形式のファイルを表示できるようにする

`Content-Encoding: gzip` をHTTPヘッダに付けて送ればよいので、下記のような `middleware` オプションを指定するとうまく表示することができました。


```js
middleware: [
  function (req, res, next) {
    if(req.url.match(/\.svgz$/)) {
      res.setHeader('Content-Encoding', 'gzip');
    }

    next();
  }
]
```

## バージョン
- Browsersync 2.14.3
Slack Botが[debug: No handler for tick]以外訴えなくなった時の対処メモ

# 前提
実行環境

| Platform |    Version   |
|:---------|:------------:|
| OS | Windows8.1　|
| Node　| v6.3.0　|

その他
初めてのjavascript...初めてのNode.js(言い訳)

# 事象
Slack Bot(botkit)が最初は職務を遂行しているのに、一定時間経過すると

```
debug: No handler for tick
debug: No handler for tick
debug: No handler for tick
```
以外のログを吐かなくなりました。(debug: true の場合)

Slackの状態も away と完全に職務放棄...
google先生曰く、通信？がうまくいっていないとかなんとか。

ということで本来は正常稼働することを目指すべきかもしれないのですが、荒療治してみました。

# 準備
[**forever**](https://github.com/foreverjs/forever) で永続化。

利用には、slack_bot.jsの改ざんが必要です。

```js
//トークンを埋め込むため、環境設定にトークンが設定されているかの判定はコメントアウト
//if (!process.env.token) {
//    console.log('Error: Specify token in environment');
//    process.exit(1);
//}
(中略)
//トークンを埋め込む
var SLACK_TOKEN = 'botのAPI Token';
var bot = controller.spawn({
//    token: process.env.token
    token:SLACK_TOKEN
}).startRTM();
```
準備が完了したことを、
![botkit.jpg](https://qiita-image-store.s3.amazonaws.com/0/125632/6f4deda8-e2a9-29c9-2cd4-bf3ef5cad341.jpeg)
Botと shutdown の会話でプロセスを切断させた後、自動復帰するかで確認します。
以上で、準備完了です。

# 対処
職務放棄のため状態が away となっったら、プロセスを切断しちゃおう！

そして forever の永続化による強制復活をしてしまおう！という結論に至りました。

そこで [**node-cron**](https://github.com/ncb000gt/node-cron) を利用しました。

```js
var CronJob = require('cron').CronJob;
cron = new CronJob({
    //定時刻設定
    cronTime: '00 00 * * * 1-5',
    onTick: function(){
        //users.getPresence を利用した状態確認
        bot.api.users.getPresence({},function(err,response){
            presence = response["presence"]
            if(presence =="away"){
                process.exit();
            }
        })
    },
    start:true,
    timeZone:'Asia/Tokyo'
});
cron.start();
```

cron で定期的に Slack API [**users.getPresence**](https://api.slack.com/methods/users.getPresence) を実行して状態を確認し、active 以外の場合はプロセスを切断、 そして forever での自動起動を待つという流れで完了です。

botの状態に関係なく Slack API は利用できていたので bot の問題なのだろうか。
さくらのレンタルサーバーにbundlerをインストールしようとして certificate verify failed

さくらのレンタルサーバーはデフォルトのrubyのバージョンが`1.8.7`なのでrbenvで今のマシンと同じ`2.0.0-p481`をインストールしたら`gem install bundler`できなかった。

SSLがどうこう、というエラーが出る。

```bash
ERROR:  Could not find a valid gem 'bundler' (>= 0), here is why:
          Unable to download data from https://rubygems.org/ - SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (https://rubygems.org/latest_specs.4.8.gz)
```

[Install-rails-on-sakura-internet](http://oedocowboys.sakura.ne.jp/blog/blog/2016/02/12/install-rails-on-sakura-internet/)

gemの場所から`rb`拡張子を外したディレクトリに証明書を置けばいいらしい。

[bundle install がこけるようになった(改訂版)](http://qiita.com/akaneko3/items/a162def655ce791e356f)

```bash
# gemの場所
gem which rubygems
<path to rbenv>/versions/2.0.0-p481/lib/ruby/2.0.0/rubygems.rb
```

証明書ファイルのリンクは切れているが、メンションを辿って行くとGistに上げてくれている人がいるので、それを利用した。

[sudogem/AddTrustExternalCARoot.pem](https://gist.github.com/sudogem/6cc2d710ed1e43b102fc136e9396dea8)

（`BEGIN CERTIFICATE`以前は必要ないかもしれない）

これをリモートに転送

```bash
scp <path to>/AddTrustExternalCARoot-2048.pem <user>@<host>:/home/<user>/<path to rbenv>/versions/2.0.0-p481/lib/ruby/2.0.0/rubygems/AddTrustExternalCARoot-2048.pem
```

しかしダメ。もう一歩。

```bash:.bashrc
# 追記
export SSL_CERT_FILE=$HOME/<path to rbenv>/versions/2.0.0-p481/lib/ruby/2.0.0/rubygems/AddTrustExternalCARoot-2048.pem
```

```bash
source ~/.bashrc
```

pathを通したら無事にbundlerをインストールできた。
c++ builder XE4, 10.2 Tokyo > max(A,B)を使おうとした > #include <algorithm> / std::max(A,B)を使う

```txt:動作環境
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2017/12/28)
```

```
int maxloop = max(A, B);
```

上記のようなことをしようとした。
調べたところ、max()というのはdelphiでしか定義されていないという情報が見つかった。

http://docs.embarcadero.com/products/rad_studio/radstudio2007/RS2007_helpupdates/HUpdate4/JA/html/delphivclwin32/Math_Max@Double@Double.html
> 2 つの数値のうち大きいほうを返します（Delphi のみ）。

上記リンクにはC++の記載もあり、どうもよく分からない。

http://community.embarcadero.com/article/technical-articles/162-programming/14838-why-arent-max-and-min-defined-in-c-mode
においてoverloadと関連してmax(), min()をC++では定義していないとのこと (ただし、1998年の情報)。

https://forums.embarcadero.com/message.jspa?messageID=682305
にてstd::max()を使えばいいという回答がある (2014年の情報)。
std::max()を使うには`include <algorithm>`を足す。