OmniAICreator/Qiita-1.07M huggingface dataset:
embulk で pure java と jruby でプラグインを作ったときの速度比較

Embulk のプラグインを作るにあたって、pure java と jruby でどれぐらい速度差が出るのか気になったので、それぞれ同じ動作をする簡単なプラグインを作って速度比較してみた。

* java版 https://github.com/sonots/embulk-filter-java_pass
* ruby版 https://github.com/sonots/embulk-filter-ruby_pass

このプラグインは、入力データをそのまま通すだけの filter プラグインで、ruby 実装だととても単純で、ただ入力を page_builder に add するだけになっている。

```rb
      def add(page)
        page.each do |record|
          @page_builder.add(record)
        end
      end
```

Java 版だと型があるので、Visitor を使ってもう少しごにょごにょしているが、いずれにせよやっていることは加工もなにもせずに通すだけである。

## 実行

これをそれぞれ 100,000 件のデータに対して通してみた。データは embulk-input-random であらかじめ生成しておいたものをファイルから読み込んで実験した。

random の実行

```random.yml
in:
  type: random
  rows: 100000
  schema:
    id: primary_key
    name: string
    score: integer
out:
  type: file
  path_prefix: ./sample
  file_ext: .csv
  formatter:
    type: csv
    header_line: true
    charset: UTF-8
    newline: CRLF
```

```
$ embulk gem install embulk-input-random
$ embulk run random.yml
```

java_pass の実行

```example.yml
in:
  type: file
  path_prefix: sample.000.00
  parser:
    charset: UTF-8
    newline: CRLF
    type: csv
    delimiter: ','
    quote: '"'
    escape: ''
    null_string: 'NULL'
    header_line: false
    columns:
    - {name: id, type: long}
    - {name: name, type: string}
    - {name: score, type: long}
filters:
  - type: java_pass
out:
  type: "null"
```

```
$ ./gradlew gem
$ embulk run -I lib example.yml
```

## 結果


|      | 経過時間 |
|------|----------|
| java | 0.924 sec   |
| ruby | 3.078 sec    |

圧倒的に pure java のほうが速いようだ。個人的には ruby のほうが得意なのだが、filter プラグインは java で書いた方がよさそう。output プラグインとかだと書き込みのほうが遅いのであまり気にならないかも。

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/sonots">@sonots</a> pure javaの方がずっと速いですね。jrubyだとオブジェクトの変換がどうしても遅い。</p>&mdash; FURUHASHI Sadayuki (@frsyuki) <a href="https://twitter.com/frsyuki/status/613150780061691904">2015, 6月 23</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

ruby オブジェクトへの変換で遅くなるとのこと。cf. https://twitter.com/sonots/status/613149071830745088
負荷のかかっているプロセスを削除する

## はじめに

時々暴走するプロセスのバグが修正されないので、負荷90％以上のタスクをバシっとKillするプログラムを作成しました。

## プロセス名とインスタンス名

CPU負荷を調べるには、インスタンス名に変換する必要があります。それについては詳細は以下のエントリーで

http://qiita.com/bellx2/items/22513b63e73feca3b585

## 判定条件について

hProcess.Responding = false で無応答タスクの判定ができるのですが、リモートからのコード実行やスケジュールタスクのようにバックグラウンドで実行する場合には正しくRespondingが返ってこないので、CPU負荷を条件として入れてあります。

## コード

```vbnet:Module1.vb

    Sub TaskKill()
        Dim pc As New System.Diagnostics.PerformanceCounter()
        pc.CategoryName = "Process"
        pc.CounterName = "% Processor Time"
        
        Dim hProcesses As System.Diagnostics.Process() = System.Diagnostics.Process.GetProcesses()
        For Each hProcess As System.Diagnostics.Process In hProcesses
                pc.InstanceName = LookupInstanceName(hProcess.Id)
                pc.NextValue()
                System.Threading.Thread.Sleep(1000)
                Dim cpuVal = Val(pc.NextValue.ToString)
                If cpuVal > 90 Then
                    hProcess.Kill()
                End If
        Next hProcess
    End Sub
    
      ' プロセスID→インスタンス名変換
    Function LookupInstanceName(pid) As String
        LookupInstanceName = ""
        Dim category = New PerformanceCounterCategory("Process")
        Dim instances = category.GetInstanceNames
        For Each instance In instances
            Dim c = New PerformanceCounter("Process", "ID Process", instance)
            If (pid = c.RawValue) Then
                LookupInstanceName = instance.ToString
                Return LookupInstanceName
            End If
        Next
        Return LookupInstanceName
    End Function
```

##参考

http://dobon.net/vb/dotnet/process/getprocesses.html

https://msdn.microsoft.com/ja-jp/library/system.diagnostics.process_members(v=vs.80).aspx

###ぶつぶつ

  インスタンス名探索が繰り返し行われているので、配列を返すような関数としておいたほうが良いので書き直す予定です。
PIDからインスタンス名を取得する

##はじめ

CPU負荷が一定以上のアプリケーションを自動的にKillするアプリを作っていたのですが、どうもうまくタスクが消えていないという話しなので、調査したところ「プロセス名」と「インスタンス名」が違うという事が解りました

### プロセス名とインスタンス名

プロセス名 = .exeを取り除いた物 
　複数プロセスある場合でも同一名称、PIDは別になる。
　例：hoge.exe → hoge
 
 インスタンス名
 　通常はプロセス名と同一だが、複数立ち上げると後ろに番号がついていく。
  　例：hoge hoge#1 hoge#2 hoge#3 ...等

## コード

 という事で、先人の知恵を。
  http://kkamegawa.hatenablog.jp/entry/20060531/p1
 
 VB.NETで書き換えます。
 
 ```vb:Module1.vb
     ' プロセスID→インスタンス名変換
    Function LookupInstanceName(pid) As String
        LookupInstanceName = ""
        Dim category = New PerformanceCounterCategory("Process")
        Dim instances = category.GetInstanceNames
        For Each instance In instances
            Dim c = New PerformanceCounter("Process", "ID Process", instance)
            If (pid = c.RawValue) Then
                LookupInstanceName = instance.ToString
                Return LookupInstanceName
            End If
        Next
        Return LookupInstanceName
    End Function
  ```

### ぶつぶつ
  
  繰り返し使うのであれば、配列を返すような関数としておいたほうがコード的には良いかと思います。
MarkerCluster


SenchaTouch側のMap機能にマーカーが大量に追加された場合の対応です。

## ライブラリーを読み込む
[参考サイト](http://kwski.net/api/1044/)からMarkerClusterファイルをダウンロードして使います。

```html
<script type="text/javascript" charset="utf-8" src="resources/js/markerclusterer_compiled.js"></script>
```

## SenchaTouchのMapビューにMarkerClusterを初期化
```javascript:app/controller/MapController.js
Ext.define('NearLife.controller.MapController', {
    extend: 'Ext.app.Controller',

    config: {
        refs: {
            viewMap : 'view-map'
        },
        control: {
            viewMap: {
                maprender: 'onInitializeView'
            }
        }
    },

    launch: function() {
    },

    // ビューを初期化
    onInitializeView: function(){
        var map = this.getViewMap();
        var gMap = map.getMap();

        // マーカー最適化
        this.markerCluster = new MarkerClusterer(gMap, [], { gridSize: 10 });
    }
});
```

## 実装済みアプリ
* [NearLife - イベントなど共有できる匿名掲示板アプリ](http://www.itmarlin.com/page-near-life.html) : [地図]
GoogleMapsのリンクをアプリ内でページ遷移される件

GoogleMapsの左下のロゴや右下のリンクなどをクリックすると、WebView内でページ遷移されてしまう。

## 地図の初期化後にイベントを定義する
```javascript
// イベント定義
setTimeout(function(){
    var elms = Ext.select(".x-map a");
    Ext.Array.each(elms.elements, function(elm, index, countriesItSelf){
        var elm = Ext.get(elm);
        var href = elm.getAttribute('href');
        elm.set({href: "#", target: "", "data-href": href});
        Ext.get(elm).on('tap', function(event, node, options){
            var currentTarget = Ext.get(event.target);
            var url = currentTarget.getAttribute('data-href') || currentTarget.up('a').getAttribute('data-href');
            if (url) window.open(url, '_system');
        }, me);
    }, me);
}, 1000);
```

※ `window.open(url, '_system');`の利用は下記の方法で実装する必要があります。

## 端末のブラウザを利用する方法
[以前qiitaに発表したページを参考](http://qiita.com/itmarlin/items/ca583ca6970ae9f3d04d)

## 実装済みアプリ
* [NearLife - イベントなど共有できる匿名掲示板アプリ](http://www.itmarlin.com/page-near-life.html) : [地図]
GoogleMaps


GoogleMaps機能をiOS、Androidに実装するメモです。

## プラグイン追加
```bash
$ cd cordova
$ cordova plugin add plugin.google.maps --variable API_KEY_FOR_ANDROID="Android用キー" --variable API_KEY_FOR_IOS="iOS用キー"
$ cordova plugin add org.apache.cordova.geolocation
```

## GoogleMapsを読み込む
```html
<script type="text/javascript" charset="utf-8" src="https://maps.googleapis.com/maps/api/js"></script>
```

## SenchaTouchのビュー
```javascript:app/view/Map.js
// 地図
Ext.define('NearLife.view.Map', {
    extend: 'Ext.Map',
    id: 'id-view-map',
    xtype: 'view-map',
    requires: [
    ],
    config: {
        mapOptions: {
            scrollwheel: false,
            zoom: 12,
            minZoom: 2
        }
    }
});
```

## 実装済みアプリ
* [NearLife - イベントなど共有できる匿名掲示板アプリ](http://www.itmarlin.com/page-near-life.html) : [地図]
プロジェクト管理ツール調査


巷ではどんなプロジェクト管理ツールが上位に来ているか、気になったためGoogleトレンド様で調査しました。調査対象は、主要プロジェクト管理ツールだと思われる、”Redmine", "Backlog", "Trac", "JIRA", "Trello"を抜粋させていただきました。

![ranking.jpg](https://qiita-image-store.s3.amazonaws.com/0/43713/fbdc958b-d992-f027-5d51-96e5d2dddcd7.jpeg)

個人的にTrac, JIRAが頑張っている印象です、
vyosでのHair-pin NAT設定

# vyosのUターンNATではまったのでシェア

+ 構成
`internet gw --- eth0(outside) vyos eth1(inside) --- servers...`

+ 問題点
上記構成でinside server がGIP経由で内部のserverにアクセスするとき、
UターンNAT設定がないと通信がほげる。
+ 解決策
vyosにUターンNATの設定を追加

* destinationNAT

```
 set nat destination rule 998 description 'Hair-pin NAT from Inside'
 set nat destination rule 998 destination address '1.1.1.10'
 set nat destination rule 998 inbound-interface 'eth1'
 set nat destination rule 998 translation address '192.168.1.10'
```

* source-NAT

```
 set nat source rule 998 description 'Hair-pin NAT to Inside'
 set nat source rule 998 destination address '192.168.1.0/24'
 set nat source rule 998 outbound-interface 'eth1'
 set nat source rule 998 source address '192.168.1.0/24'
 set nat source rule 998 translation address 'masquerade'
Rubyの加法演算子や等値演算子は可換ではない


加法演算子(`+`)、等値演算子(`==`)に限らずすべての演算子は可換でないと言えると思うけど、加法・等値は特に数学的には可換のイメージが強いのでこれを例として.

可換でないのは、演算子もオブジェクトのメソッドであるから`A == B`に対して主語(A)・目的語(B)の関係が発生するから.
以下のようにExampleクラスで`==`をオーバーライドするとオーバーライドした実装が使われるのはExampleオブジェクトを主語として比較されたときのみ.

```ruby
class Example
  def initialize(value)
    @value = value
  end

  def ==(other)
    @value == other
  end
end

obj = Example.new("test")
obj == "test"
  # true
"test" == obj
  # false
```

■疑問点

他の言語も演算子は非可換なのか？
モンキーパッチせずに`"test" == obj`をtrueと評価させるのは不可能なのか？
Spark DataFrameで3値をmapの形式で集約する

# やりたいこと
Spark のデータフレームを使ってデータを整形した縦持ちになっているデータをマップ形式に集約して横持ちにしたい

## こんな感じ
|Column1(String)|Column2(String)|Column3(Int)|
|---|---|---|
|a|x|2|
|a|y|3|
|b|z|1|
|a|x|5|

このようなデータを集約して、

|Column1(String)|Column2(Map[String, Int])|
|---|---|---|
|a|Map(x->7, y->3)|
|b|Map(z->1)|

# 前提
既にデータをファイルやHDFSなどから取り出して、[DataFrame](https://spark.apache.org/docs/1.3.0/sql-programming-guide.html)として扱える状態になっている

* DataFrameは、`Spark 1.3.0 +`の機能です。

# 方法

``` Scala:SparkのDataFrameを使った集約
def summarizeAsMap(df: DataFrame): RDD[(String, Map[String, Long])] = {
    // 最初は、 RDD[((String, String), Long)] のデータ構造にreduceする
    val firstReduce = df.rdd.map(row => row.getString(0) -> row.getString(1) -> row.getLong(2)).reduceByKey(_ + _)
    // 次にuidをkey, Mapをvalueとするreduce
    // reduceされたデータ構造 RDD[(String, Map(String, Long))]
    val mapRdd = firstReduce.map(e => e._1._1 -> Map(e._1._2 -> e._2)).reduceByKey(_++_)
    return mapRdd
  }
```

* 3行目の`firstReduce`では、`DataFrame`を一度`RDD`形式に変換して、一行の要素毎で扱える形式に展開してます
    * `reduceByKey`で集計を行うため、`row`の要素をそれぞれ`row.getString`や`row.getLong`などで型を定義
    * `row => row.getString(0) -> row.getString(1) -> row.getLong(2)`はrowを展開してタプル形式で保持
    * `reduceByKey`の結果、`RDD[((String, String), Long)]` のデータ構造に変換（してるはず。。。）
* 6行目の`mapRdd`では、集約した結果を`Map`形式で保持している`RDD`データに変換
    * `reduceByKey`で集計を行うため、`firstReduce`の要素を`Column1, (Map(Column2->Column3),Map(Column2->Column3), ...)`Column1とMapの配列のデータ形式化
    * `row => row.getString(0) -> row.getString(1) -> row.getLong(2)`はrowを展開してタプル形式で保持
    * `reduceByKey(_++_)`の結果、Mapの結果が更新される
        * Map同士の更新なので、`Key`が重複する場合`Value`は加算される
* 結果は`RDD`形式で返るので、戻り値に対して`toDF`を使ってカラム名を再定義してください。

# 感想
Scalaわかりにくい気がしてます。
Scalaの特徴の一つである柔軟さが、時間が空いた時にソースを見直すときに与える負荷がどの程度になるかがコワイっす。
わかりやすいソースを最初から書けばいいというのは当たり前ですが、どんなにわかりやすく書いたつもりでも、時間が経つにつれわかりにくくなっていくものだと思ってます。
特に、Scalaを習い始めたばっかに書いたソースなので。。。

DataFrameについては、RやPandasで提供されているものに近いので、接しやすい方が多いかもしれません。
そして、Sparkは速いっす。

## ツッコミ、コメント募集中です！
Ransackで自前scope使う時に'1'や'0'を値として渡せない？

#Ransackで自前scope使う時に'1'や'0'を値として渡せない？

Railsアプリに簡単に検索機能を追加できるransackを使っています。
ここで一つの問題にぶつかってしまいました。
## ぶつかった問題
検索値に1を設定すると`ArgumentError (wrong number of arguments (0 for 1))`が発生する。
（0、2、3、、、、なら発生せず)

## やりたいこと

Viewからselectで選択したメニューの値（1,2,3,..）を受け取り、その値を検索値とし、自前のscopeをransack経由で使おうとしました。

以下はモデルとコントローラー抜粋。

```rb:app/models/report.rb
:
scope :pathogen_eq, ->(pathogen) {joins(:test_results).merge(TestResult.where(pathogen: pathogen)).uniq}
:
def self.ransackable_scopes(auth_object = nil)
    %i(pathogen_eq)
end
:
```

```rb:app/controller/reports_controller.rb

def index
  @q = Report.ransack(params[:q])
:
end
```

## 何が起こっている？

エラーをキーワードに検索すると、RansackのIssueに次のようなものが見つかりました。

`Wrong result and errors for join/group/having scope with certain values (0 and 1) #502`
[Issue502](https://github.com/activerecord-hackery/ransack/issues/502)

- scopeに渡すときに、0と'0'をfalseに、1と'1'をtrueに変換しているので、値で渡せない
- 0と1は変換しないように修正（一旦Close）
- 今度はチェックボックスの場合に問題発生（ReOpen）
- その後修正のやり取りがあるけどテストが通らずOpenのまま

という状況のようです。

ransackのソースを見ると、確かに0と1はboolean扱いになっていました。

```rb:ransack/lib/ransack/constants.rb
module Ransack
  module Constants
:
    TRUE_VALUES = [true, 1, '1', 't', 'T', 'true', 'TRUE'].to_set
    FALSE_VALUES = [false, 0, '0', 'f', 'F', 'false', 'FALSE'].to_set
    BOOLEAN_VALUES = (TRUE_VALUES + FALSE_VALUES).freeze
:
```

## 対応

全てをRansackに任せる必要はなかったので、値渡しのところは自前でscopeを呼ぶようにしました。

```rb:app/models/report.rb
:
scope :pathogen_eq, ->(pathogen) {joins(:test_results).merge(TestResult.where(pathogen: pathogen)).uniq}
:
```

```rb:app/controller/reports_controller.rb

def index
  @q = Report.ransack(params[:q])
  reports = @q.result

  if params[:q].present? && params[:q][:pathogen_eq].present?
    reports = reports.pathogen_eq(params[:q][:pathogen_eq])
  end
:
end
```

値によってはテストも通ってしまうので、使う人は気を付けた方が良いです。
（修正PullRequestまでは手が出せていません、、、）
Android StudioでビルドしたらGradleが「Could not reserve enough space for object heap」と嘆きだした時の設定箇所

AndroidStudioを利用していて、ビルドする際に以下のようなエラーが発生した場合の対象方法です。

>Error:Unable to start the daemon process.
This problem might be caused by incorrect configuration of the daemon.
For example, an unrecognized jvm option is used.
Please refer to the user guide chapter on the daemon at http://gradle.org/docs/2.2.1/userguide/gradle_daemon.html
Please read the following process output to find out more:
　----------------------
**Error occurred during initialization of VM
Could not reserve enough space for object heap**
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

太字箇所の通り、GradleのJavaヒープサイズが確保できたいないためにエラーとなっています。
AndroidStudioから直接gradle.propertiesを編集できるので、ここでヒープサイズを調整します。

Project>Gradle Scripts>gradle.properties

```
# JVM起動オプションの設定
org.gradle.jvmargs=-Xms512m -Xmx1024m
```

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/48330/dc4eba6d-b129-6cef-5e42-1b3986df5add.png)


その他の起動オプションもスペース区切りで指定することが可能です。
FacebookとTwitterのOAuthの仕組みまとめ

* 2015/06/23 時点の調べたまとめ

## FacebookのOauth
### 概要
OAuth 2.0 をベースにした仕組み。ただし、refresh tokenはない。
### Access Token

- AccessTokenを取得すると、同時に利用できる期限が返され、その期限がすぎると使えなくなる。
- AccessTokenには short time token と long time tokenの2つがある。
- short time token は期限は2時間程度、long time tokenは期限は60日程度。
- ユーザをFacebookにリダイレクトし、認可を経てサイトに戻ってくると、short time token が取得できる。short time token を使うと、long time token が取得できる。

### サーバサイドの実装
サーバサイドでは、long time token と expiresat を保存しておき、expiresatを見て期限が切れていたら、再度ユーザをFacebookにリダイレクトさせ、新しい long time token を取得する感じだろうか。

## TwitterのOAuth
### 概要
OAuth1.0をベースにした仕組み。

### AccessToken
 - 期限はないので、保存しておいて必要になったら利用すれば良い。

## 参考URL
https://developers.facebook.com/docs/facebook-login/access-tokens#usertokens
https://twittercommunity.com/t/getting-started-with-oauth-2-0/2338
IE8以下でlabelのforを動的に指定するとエラーになる


# 症状

こういうバインディングをする（mappingプラグインを使ってるので、やたら括弧が多いです）

```haml
%ul(data-bind="foreach: data()")
  %li
	%input(type="radio" data-bind="checked: $root.checked, attr: {id: $data.id(), value: $data.name()}")
	%label(data-bind="text: $data.name(), attr: {for: $data.id()")
```

labelのfor要素で関連付けを行いたい。

IE9とかなら問題ないけど、IE8以下にすると（IE11のシミュレータで実行）

識別子、文字列または数がありません。

というエラーが出る

# 回避
ちょっと調べる時間がないので、html側の工夫で回避する。

こうする

```haml
%ul(data-bind="foreach: data()")
  %li
	%label
  	  %input(type="radio" data-bind="checked: $root.checked, attr: {id: $data.id(), value: $data.name()}")
	  %span(data-bind="text: $data.name()")

```

IE6が対象じゃなければ、とりあえずコレでいいかな...
Android Studioのlogcat自動スクロールを止める方法

logcat上のテキストを選択すれば止まる。
Eclipseのようなスクロール停止用ボタンは存在しない。

自動スクロールを再開したい場合は、下記のボタンを押下する。
![skitch.png](https://qiita-image-store.s3.amazonaws.com/0/6290/89e3dcb5-2b33-e61b-8f16-33fa223fe4c9.png)
Console.logの出力にスタイル指定をする


Google+がやっているやつ。

![kyoju000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/2832/6e6a231b-b2a8-b32c-a419-ae9ce5b8fb54.jpeg)


```js
console.log("%c%s",
            "color: red; background: yellow; font-size: 24px;",
            "警告！"
);

```
heroku の FreeDyno で sleeping monitor が表示されない場合

# 現象

heroku の FreeDyno を使っていて、sleeping monitor が web の dashboard に表示されない場合があった。以下のように表示がない。

[![Gyazo](http://i.gyazo.com/7dd6ff0f62ee284692083616905c79de.png)](http://gyazo.com/7dd6ff0f62ee284692083616905c79de)

# 対処

heroku の [Feedback](https://help.heroku.com/tickets/new?category=feedback&query=dashboard+feedback) ページから、表示されない旨を報告する(英語)。
3日後に直したとの連絡が来た。確認したら、ちゃんと表示されていた。

[![Gyazo](http://i.gyazo.com/fb7d35aaad085cb7bcf44a275acb25dd.png)](http://gyazo.com/fb7d35aaad085cb7bcf44a275acb25dd)
Crystal : APIリファレンス

[公式Web](http://crystal-lang.org)からも[オンラインドキュメント](http://crystal-lang.org/docs/)からもたどれなくて（自分が見つけられなかっただけ？）、[ソース](https://github.com/manastech/crystal/tree/master/src
)を見るしかないのかと思ってましたがどうやらあるっぽい。

・[Crystal API リファレンス](http://crystal-lang.org/api/)

ざっと見た感じ，JSONやYAMLに加えてRubyでは標準添付されていないMarkdownがあったり、URIはあるけどIPAaddrはなかったり，標準添付のライブラリはWebアプリなんかに使われるものが中心に整備されているっぽい感じ。

まぁ、バージョン0.7なので、これから徐々に整備されていくのだろうし、そもそもがOSSなんだから欲しけりゃ自分で書いてついでに pull req 出せって話かもしれない。
OkHttpで認証・SSL通信・クッキー管理するTips

OkHttpでいろいろやろうとしたときに調べたものを列挙（随時追記）

# Basic認証

OkHttpClientにAuthenticatorを設定しておくとリクエストの際にそれをつかって認証してくれる

```java

OkHttpClient client = new OkHttpClient();
client.setAuthenticator(new Authenticator() {
    @Override
    public Request authenticate(Proxy proxy, Response response) throws IOException {
        String credential = Credentials.basic("ユーザー名", "パスワード");
         return response.request().newBuilder().header("Authorization", credential).build();
    }

    @Override
    public Request authenticateProxy(Proxy proxy, Response response) throws IOException {
        return null;
    }
});
```

# SSLのオレオレ証明書を許可する（SSLエラーを無視する）

SSL証明書の検証を行わないようにするのと、実際にアクセスするホスト名の検証を行わないようにすればいけます。

```java

try {
    final TrustManager[] trustAllCerts = new TrustManager[]{
        new X509TrustManager() {
            @Override
            public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) 
                    throws CertificateException {
            }

            @Override
            public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) 
                    throws CertificateException {
            }

            @Override
            public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                return null;
            }
        }
    };

    final SSLContext sslContext = SSLContext.getInstance("SSL");
    sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
    final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

    client.setSslSocketFactory(sslSocketFactory);
    client.setHostnameVerifier(new HostnameVerifier() {
        @Override
        public boolean verify(String hostname, SSLSession session) {
            return true;
        }
    });
} catch (Exception e) {
    e.printStackTrace();
}
```

# Cookie管理

Basic認証と同じような感じでOkHttpClientにCookieManagerを設定しておけばクッキー管理をしてくれる

CookiePolicyは以下の３つから選べる

* CookiePolicy
     * ACCEPT_ALL (すべての Cookie を受け入れる)
     * ACCEPT_NONE (Cookie をまったく受け入れない)
     * ACCEPT_ORIGINAL_SERVER (元のサーバーからの Cookie だけを受け入れる)

ただしCookieManagerは、次回アプリ起動時には空になっているので要注意

```java

OkHttpClient client = new OkHttpClient();
CookieManager cookieManager = new CookieManager();
cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
client.setCookieHandler(cookieManager);
```
データセンターに持ち込んだUSBドライブへのアクセス（デバイスの接続）

"東京データセンターにメディアを持ち込んで見ました"の資料に勇気付けられ実際にやって見ました。http://sssslide.com/www.slideshare.net/softlayerjp/bring-to-media-to-softlayer-tokyo-dc
　この中でデータセンターに持ち込まれたデバイスの接続方法が省略のようだったのでこちらで紹介します。
データセンターにデバイスが届き接続されると上記ページ１９にもあるようにデバイスのIPアドレス、ユーザー名、パスワードが得られます。

![qiita1.jpg](https://qiita-image-store.s3.amazonaws.com/0/59741/dcc95465-9f8d-5581-80b0-857c56d196b0.jpeg)
　次にコントロールパネルからiSCSI initiatorを起動(すいませんWindowsが英語版でした）そしてDiscoveryをクリック
![qiita2.jpg](https://qiita-image-store.s3.amazonaws.com/0/59741/e2cf12ee-fc3c-d91c-1f3e-cae9fa75ed0f.jpeg)
　SoftLayerポータルにあったIPアドレスを入力、Advancedをクリック
![qiita3.jpg](https://qiita-image-store.s3.amazonaws.com/0/59741/7d6e5c3a-4455-0b66-58ff-df762ca7eb55.jpeg)
　Enable CHAP log onをチェックしてユーザー名とパスワードを入力
![qiita4.jpg](https://qiita-image-store.s3.amazonaws.com/0/59741/9b10e11d-fda3-2a8d-c966-47b090266e84.jpeg)
　Targetタブを選択、デバイスが表示されたのを確認し、connectをクリック
![qiita5.jpg](https://qiita-image-store.s3.amazonaws.com/0/59741/9bd95de8-7216-5ee6-c55a-c7b28202528e.jpeg)
　Advancedをクリック、ユーザー名とパスワードを入力
![qiita6.jpg](https://qiita-image-store.s3.amazonaws.com/0/59741/25973c17-1f4f-5d19-e6cb-a2e9222f98d0.jpeg)
![qiita7.jpg](https://qiita-image-store.s3.amazonaws.com/0/59741/c71c9ddb-17c8-eef8-c9f0-0e4381f69b9b.jpeg)
OKをクリックして以下のように接続されているのを確認
![qiita8.jpg](https://qiita-image-store.s3.amazonaws.com/0/59741/0c277338-02bc-913e-3943-37b53387c823.jpeg)
これで終了。以下のようにドライブが追加されました。
![qiita9.jpg](https://qiita-image-store.s3.amazonaws.com/0/59741/6a4dd2b5-d49b-b88a-e264-e16851ef66e7.jpeg)
インスタンス変数にメソッドを回す Forwardable メモ


項目21 「コレクションクラスからの継承よりも委譲を使うようにしよう」

http://magazine.rubyist.net/?0012-BundledLibraries
インスタンス変数にメソッドを回すことができる。

```rb
require 'forwardable'

class RaisingHash
  extend Forwardable

  def_delegators(:@hash, :[], :[]=, :has_key?)
  ...
```
qcow2イメージのマウント

## 参考

* [Alexey Torkhov’s blog: Mounting raw and qcow2 VM disk images](http://alexeytorkhov.blogspot.jp/2009/09/mounting-raw-and-qcow2-vm-disk-images.html)

## 手順

```bash:マウント場所作成
mkdir ./a/
```

```bash:nbdモジュールの読み込み
modprobe nbd max_part=63
```

```マウント
qemu-nbd -c /dev/nbd0 ファイル.qcow2
fdisk -l /dev/nbd0
mount -o ro /dev/nbd0p2 ./a/
```

```bash:umount
umount ./a/
killall qemu-nbd
losetup -d /dev/nbd0
```

```bash:nbd0の削除
modprobe -r nbd
```


### LVMの場合

```bash:LVMパーティションの有効化,/のマウント
vgscan
vgchange -ay
# mount /dev/VolGroupName/LogVolName ./a/
mount /dev/wwwsrv/root ./a/
```

```bash:LVMの場合
# vgchange -an VolGroupName
vgchange -an wwwsrv
```

----

# P2V

* [物理サーバをコンテナ化 (OpenVzの例) - Qiita](http://qiita.com/tukiyo3/items/a7ea4d21e6b2da3e200f)

```bash:
rsync -ah \
  --exclude dev \
  --exclude mnt \
  --exclude tmp \
  --exclude proc \
  --exclude sys \
  --exclude usr/src \
  . ../bkup/
```

```bash:転送量を調べる方法(毎分出力)
for i in `seq 1 200`
do
  echo -n $i; df -h . | grep G ; sleep 60
done
```
GoogleAppsScriptからFusion Tablesのテーブルを作成・データ挿入するときのメモ

Google Apps ScriptからFusion Tablesを操作する実装について調べているなかで、テーブル作成の実装例が見当たらなかったので、GoogleAppsScriptからFusion Tablesのテーブル作成と、データ挿入について書きとめておきます。

# 利用するメソッド
* テーブル作成:Table.insert
* データ挿入:Query.sql or Table.importRows

## テーブル作成
### Table.insert
作成するテーブル情報をパラメータに指定して実行します。
テーブル情報の定義はjson形式で行いますが、Fusion Tablesで指定できる項目を把握するところが一番苦労するでしょう。

ちなみに、最低限のテーブルを作成するにはこんな感じになります。

```lang:Table.insert
var resource = {
  "name": "hoge",
  "isExportable": false,
  "kind": "fusiontables#table",
  "columns": [
    {
      "name": "id",
      "type": "NUMBER",
      "kind": "fusiontables#column"
    },
    {
      "name": "name",
      "type": "STRING",
      "kind": "fusiontables#column"
    },
    ],
  };
FusionTables.Table.insert(resource);
```

なお、次のようなテーブルが作成されます。

* テーブル名は"hoge"
* テーブルデータのダウンロード不可
* カラムは数値型の"id"と文字列型の"name"

テーブル設定の詳細はリファレンスを確認してください。

* テーブルの設定：https://developers.google.com/fusiontables/docs/v2/reference/table
* カラムの設定：https://developers.google.com/fusiontables/docs/v2/reference/column

## データ挿入
### Query.sql
INSERT文をSQL実行することで、データを挿入します。Fusion TablesのINSERT文の書式を知っていれば、利用にはあまり問題ないでしょう。

* INSERT文の書式:https://developers.google.com/fusiontables/docs/v2/sql-reference#insertRow

Table.insertの説明の中で作成したテーブルにデータを3行入れるなら、こんな感じになります。

```lang:Query.sql
var sql = "INSERT INTO XXXXXXXXXXX (id,name) VALUES (1,'data1');"
  + "INSERT INTO XXXXXXXXXXX (id,name) VALUES (2,'data2');"
  + "INSERT INTO XXXXXXXXXXX (id,name) VALUES (3,'data3');";

FusionTables.Query.sql(sql);
```

### Table.importRows
SQLを使わずに、Fusion Tablesにデータを挿入します。
Query.sqlよりも比較的早くデータ挿入ができますが、一度実行した後は一定の時間が経過しないと、内部エラーが発生します。

Query.sqlのデータ挿入と同じデータを入れるには、こんな感じになります。

```lang:Table.importRows
var rowsData = "1,data1\n" 
  + "2,data2\n" 
  + "3,data3\n";
var rowsBlob = Utilities.newBlob(rowsData, "application/octet-stream");
FusionTables.Table.importRows("XXXXXXXXXXX", rowsBlob);
```

# まとめ
最後にデータ作成とデータ挿入を一度に行うgsコードを掲載しておきます。
runメソッドをトリガーで自動実行させれば、定期的にテーブル作成・データ挿入を行えます。

```lang:
function run() {
  var tableName = "hoge";
  var tableId = createTable(tableName);
  insertDatas(tableId);
}

function createTable(tableName) {
  var resource = {
  "name": tableName,
  "isExportable": false,
  "kind": "fusiontables#table",
  "columns": [
    {
      "name": "id",
      "type": "NUMBER",
      "kind": "fusiontables#column"
    },
    {
      "name": "name",
      "type": "STRING",
      "kind": "fusiontables#column"
    },
    ],
  };
    
  return FusionTables.Table.insert(resource).tableId;
}
    
function insertDatas(tableId) {
  var sql = "INSERT INTO " + tableId + " (id,name) VALUES (1,'data1');"
    + "INSERT INTO " + tableId + " (id,name) VALUES (2,'data2');"
    + "INSERT INTO " + tableId + " (id,name) VALUES (3,'data3');";

  FusionTables.Query.sql(sql);  
}
```
便利なサイト


他にも便利なサイトあったら編集リクエストお願いします

# Webフロントエンド関連

## https://cdnjs.com/
  * フロントエンドJavaScriptライブラリのCDN

## https://repl.it/languages/javascript
  * ブラウザ上でJavaScriptを走らせてコンソールで結果を確認できる
  * 純粋に言語としてのJavaScriptの動作を確認したいときとかに便利そう

## http://jsonlint.com/
  * JSONが正しいかどうかチェックしてくれる
  * あと人間が読みやすいように整形してくれる

## http://tlrobinson.net/projects/javascript-fun/jsondiff
  * JSONのdiffを表示してくれる

## http://geojsonlint.com/
  * GeoJSONが正しいかどうかチェックしてくれる
  * 地図上にプロットもしてくれる


# オンラインコーディング

# [WandBox](https://wandbox.org/)

- いろんな言語をブラウザ上でコーディングして実行できる


# ハードウェア

- [技術の森](https://www.nc-net.or.jp/knowledge/morilog/)
  - CNCとか電気回路とかの情報いっぱいある

# ドキュメンテーション

## https://readthedocs.org/
  * Sphinxで書いたドキュメントをgitにあげておくとビルドして公開してくれる
  * http://ymotongpoo.hatenablog.com/entry/20110627/1309181077


# その他

## http://xta.github.io/HalloweenBash/
  * bashのプロンプトを生成してくれるツール
Rails newしたアプリケーションに、途中からRspecを入れてみる

## gem 入れる

```Gemfile

group :test do
  gem 'rspec-rails'
end
```

```
$ bundle update
```

## RspecをRails用にセットアップ

```
$ ./bin/rails g rspec:install
```

出来上がるファイル、フォルダ
（specだけがフォルダ）

- .rspec
- spec
- spec/spec_helper.rb
- spec/rails_helper.rb

## 試しにモデルスペックを追加してみる

```
$ mkdir spec/models
$ vim spec/models/blog_spec.rb
```

```blog_spec.rb
describe Blog do
  it "なんかテストするよ！"
end
```

### RSpec3からなくなったっぽい記述

.rspecファイルに ```--require spec_helper``` と記載してあると、個々のスペックファイルで ```require 'spec_helper' ``` しなくていいみたい。

## 実行してみる

```
$ bundle exec rspec
```

### エラー；；

```
`<top (required)>': uninitialized constant Blog (NameError)
```

### 解決策

毎度おなじみStackOverflow

[ruby on rails - Rspec doesn't see my model Class. uninitialized constant error - Stack Overflow](http://stackoverflow.com/questions/17507416/rspec-doesnt-see-my-model-class-uninitialized-constant-error)

### ~~どうやらspec_helper.rbに記述が足りないらしい~~

ここから先の解決策、間違ってた。
コメントによるご指摘で訂正。

```spec/spec_helper.rb
  ENV["RAILS_ENV"] ||= 'test'
  require File.expand_path("../../config/environment", __FILE__)
  require 'rspec/rails'
  require 'rspec/autorun'
```

~~これって、 ``` rails g rspec:install ``` で出来てるっぽいんだけど・・・~~
~~なぜか私の環境では出来てなかった。。~~

~~再度実行したら、無事テスト動いた！~~

## ~~追記（ちょっと余計な行が入ってた）~~

~~実行した結果をよーく見てみたら、こんなワーニングが・・・~~

```
equiring `rspec/autorun` when running RSpec via the `rspec` command is deprecated. Called from ...dependencies.rb:274:in `require'.
```

~~最後の１行要らんらしい~~

```spec/spec_helper.rb
  ENV["RAILS_ENV"] ||= 'test'
  require File.expand_path("../../config/environment", __FILE__)
  require 'rspec/rails'
  # require 'rspec/autorun' 消してください；；
```

~~消したらすっきり。ワーニング消えました。。~~

ここまで間違い。

## 本当の解決策

コメントのご指摘通り。

スペックファイルの頭に、 ```require "rails_helper"``` と記載すれば良い。

```spec/blog_spec.rb
require "rails_helper"

describe Blog do
  it "このテストは大丈夫だよ！"
end
```

最初の解決策で追加した変な設定は不要だった。

## そもそも・・　モデルスペックにもgeneratorがあった

モデルスペック作る時に、自分でファイルをサラから作らずに

```
$ ./bin/rails g rspec:model blog
```

してみたら、```require "rails_helper"``` が頭に入った状態でファイルが作られた。
```rails g rspec:install ``` があるんだから、モデルスペック作るのも用意されてる様な気がする・・と思ったけど、やっぱあるんだ。。
mistake > ビットフィールドを使った間違い

引用: C++プログラミングの落とし穴 by Steve Oualline

ビットフィールドを使った間違い。

```c
#include <iostream>

struct status {
    int on_line:1;
    int ready:1;
    int paper_out:1;
    int manual_feed:1;
};

int main()
{
    status printer_status;
    printer_status.on_line = 1;
    if (printer_status.on_line == 1) {
       std::cout << "printer on line" << std::endl;
    } else {
       std::cout << "printer down" << std::endl;
    }
    return (0);
}
```
http://ideone.com/tHdUXE


intがsigned intとなる場合、on_lineに1を入れても、on_lineは0か-1しか受け付けずに1になることはない。

こういうこともあり、以下のコーディングルールが提唱されている。

<hr>
引用: 組込みソフトウェア開発向けコーディング作法ガイド C++言語版

> R2.6.1 (1) ビットフィールドに使用する型はsigned int型とunsigned int型だけとし、１ビット幅のビットフィールドが必要な場合はsigned int型でなく、unsigned int型を使用する。
技術英語 > [Holding down] the Alt, Ctrl, and Shift keys while starting up Photoshop will cause a dialog box to appear

https://support.alienskin.com/hc/en-us/articles/200144325-Resetting-Photoshop-preferences-

> <font color=red>Holding down</font> the Alt, Ctrl, and Shift keys while starting up Photoshop will cause a dialog box to appear

<hr>
引用: アプリケーションをつくる英語 by 西野 竜太郎さん

以下の例文があった。
> <font color=red>Hold down</font> Shift while choosing items.

ただし、こちらのwhile choosingが若干ひっかかる。while choosingだと「アイテムを選択する動作」がある一定の時間を示すような意味になってしまうが、実際に個々のアイテムを選択するのは短時間だ。複数のアイテムを選択する時間すべてを合わせて一定の時間がかかるとしてもwhile choosing(選択しながら...)は違うように思う。


以下のいずれかがいいように思う。
- Hold down the Shift when you choose items.
- Choose items while holding down the Shift.

一方で、上の例のwhile starting upはstart upが一定の時間がかかる動作なので問題ない。
PayPal月額課金での割引期間設定

月額課金サービスで新規ご入会キャンペーンを行う際に、キャンペーン対象者に通常とは違う料金設定をしたいと思うのですが、可能なのでしょうか。

公式な方法がわかりません。わかる方いらっしゃいますか？
Crystal 関連記事 #crystal

更新日: 2015/12/26 22:27:47

|No.|タイトル|作成日|ストック数|
|--:|:--|:--:|--:|
|1|[Crystal - Array - Class Method - build #crystal](http://qiita.com/tbpgr/items/e4d38a6b7c7a4072771b)|2015/06/24 01:29:26|0|
|2|[Crystal - Array - Instance Method - []? #crystal](http://qiita.com/tbpgr/items/2a1a69e0909560c8aa5f)|2015/07/03 02:35:54|1|
|3|[Crystal - Array - Instance Method - first #crystal](http://qiita.com/tbpgr/items/02be988263d9766bf9d5)|2015/07/19 01:09:39|1|
|4|[Crystal - Array - Instance Method - first? / last? #crystal](http://qiita.com/tbpgr/items/7d478844d35e6b51468f)|2015/07/24 00:26:42|0|
|5|[Crystal - Array - Instance Method - swap #crystal](http://qiita.com/tbpgr/items/94de85952b7f3aa2b237)|2015/08/15 00:54:03|1|
|6|[Crystal - Array - Instance Method - update #crystal](http://qiita.com/tbpgr/items/12d1076d305e9766a31e)|2015/08/21 00:43:06|0|
|7|[Crystal - BitArray](http://qiita.com/tbpgr/items/03a6bf4bc83f8ca34c7d)|2015/08/31 23:34:48|0|
|8|[Crystal - Bool](http://qiita.com/tbpgr/items/8c54baacf5bd7a0ddbb2)|2015/09/02 22:48:31|1|
|9|[Crystal - CSV](http://qiita.com/tbpgr/items/fffe0cfbe47c659f6d06)|2015/09/27 02:30:40|2|
|10|[Crystal - Char - &#39;💩&#39;.pred =&gt; 💨, &#39;💩&#39;.succ =&gt; 💪](http://qiita.com/tbpgr/items/0478c2d271444f362d07)|2015/09/15 22:21:07|0|
|11|[Crystal - Enumerable - in_groups_of](http://qiita.com/tbpgr/items/f2cf7f5db30c47f29a43)|2015/12/14 23:38:42|1|
|12|[Crystal - Enumerable - max_of](http://qiita.com/tbpgr/items/4a5b8fe3479a7b7f29b7)|2015/12/25 00:01:24|0|
|13|[Crystal - Rubyと異なるアクセサの命名 #ruby #crystal](http://qiita.com/tbpgr/items/bacda97e172958c10d6d)|2015/08/31 23:37:51|5|
|14|[Crystal - Top Level Namespace - macros - pp #crystal](http://qiita.com/tbpgr/items/a236cf7d2b8494247ba0)|2015/06/23 06:36:29|1|
|15|[Crystal  MarkdownでAPIドキュメントを書く](http://qiita.com/tbpgr/items/c0ce6668eaf1e1614210)|2015/10/10 22:55:25|4|
|16|[Crystalの型を限定した配列と多機能な暗黙のto_proc #crystal #ruby](http://qiita.com/tbpgr/items/e009b337d891fc2b6280)|2015/06/18 23:52:41|4|
UIColorを便利に使うために演算子を定義する

UIColorを使うときに加算、減算などできたら良いなと思うときがあったので、演算子を定義しました。
次は明度や彩度を変更するような関数も作れたらと思ってます。
他にもこんなのあれば便利だよというものがあれば教えて下さい！

```swift:UIColorHelpers
func + (left: UIColor, right: UIColor) -> UIColor {
    var leftRGB = left.getRGB()
    var rightRGB = right.getRGB()
    return UIColor(red: leftRGB.red + rightRGB.red, green: leftRGB.green + rightRGB.green, blue: leftRGB.blue + rightRGB.blue, alpha: leftRGB.alpha + rightRGB.alpha)
}

func - (left: UIColor, right: UIColor) -> UIColor {
    var leftRGB = left.getRGB()
    var rightRGB = right.getRGB()
    return UIColor(red: leftRGB.red - rightRGB.red, green: leftRGB.green - rightRGB.green, blue: leftRGB.blue - rightRGB.blue, alpha: leftRGB.alpha - rightRGB.alpha)
}

func * (left: UIColor, right: CGFloat) -> UIColor {
    var leftRGB = left.getRGB()
    return UIColor(red: leftRGB.red * right, green: leftRGB.green * right, blue: leftRGB.blue * right, alpha: leftRGB.alpha * right)
}

// 捕色を返す
// - 使い方 -
// let yellow = UIColor.yellowColor()
// let blue = -yellow
prefix func - (color: UIColor) -> UIColor {
    let rgb = color.getRGB()
    let minVal = min(rgb.red, rgb.green, rgb.blue)
    let maxVal = max(rgb.red, rgb.green, rgb.blue)
    return UIColor(red: minVal + maxVal - rgb.red, green: minVal + maxVal - rgb.green, blue: minVal + maxVal - rgb.blue, alpha: rgb.alpha)
}

extension UIColor
{
    func getRGB() -> (red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) {
        var result = (red: CGFloat(0.0), green: CGFloat(0.0), blue: CGFloat(0.0), alpha: CGFloat(0.0))
        self.getRed(&result.red, green: &result.green, blue: &result.blue, alpha: &result.alpha)
        return result
    }
}

```
Crystal - Top Level Namespace - macros - pp #crystal

## <i class="fa fa-diamond" style="font-size:1em;"></i> 概要
Crystal の Top Level Namespace のマクロ、 `pp` について

## <i class="fa fa-question-circle" style="font-size:1em;"></i> `pp` とは
PrettyPrint。人間にとって見やすい形式で標準出力を行います。

## :sparkles::gem::sparkles: Crystalの例
### <i class="fa fa-code" style="font-size:1em;"></i> プログラム
~~~ruby
ary = [1, 2, 3]
hash = { key1: :value1, key2: :value2 }
pp [
  1,
  "hoge",
  ary,
  ary + ary,
  hash,
  [ary, hash]
]
~~~

### <i class="fa fa-file-text" style="font-size:1em;"></i> 出力
~~~ruby
[1, "hoge", ary, ary + ary, hash, [ary, hash]] = [1, "hoge", [1, 2, 3], [1, 2, 3, 1, 2, 3], {:key1 => :value1, :key2 => :value2}, [[1, 2, 3], {:key1 => :value1, :key2 => :value2}]]
~~~

## :gem: Rubyの例
### <i class="fa fa-code" style="font-size:1em;"></i> プログラム
~~~ruby
require 'pp'

ary = [1, 2, 3]
hash = { key1: :value1, key2: :value2 }
pp [
  1,
  "hoge",
  ary,
  ary + ary,
  hash,
  [ary, hash]
]
~~~

### <i class="fa fa-file-text" style="font-size:1em;"></i> 出力
~~~ruby
[1,
 "hoge",
 [1, 2, 3],
 [1, 2, 3, 1, 2, 3],
 {:key1=>:value1, :key2=>:value2},
 [[1, 2, 3], {:key1=>:value1, :key2=>:value2}]]
~~~

## <i class="fa fa-check-circle" style="font-size:1em;"></i> まとめ
Crystalの`pp`は、出力前の式も標準出力してくれます。
しかし、出力が長くなった場合の改行はしてくれないようです。

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* <i class="fa fa-external-link" style="font-size:1em;"></i> [Top Level Namespace - Crystal API Library](http://crystal-lang.org/api/toplevel.html)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [Kernel.#pp - るりま](http://docs.ruby-lang.org/ja/2.2.0/method/Kernel/m/pp.html)
非同期処理と同期処理が混ざった場合の実行結果

## 参考文献
http://www.amazon.co.jp/Node-js-Design-Patterns-Mario-Casciaro/dp/1783287314

## 記事の背景
私は javascript と Node.js の初学者で、非同期処理と同期処理の概念的なイメージはつかんできたものの、それを踏まえて実際に適切なプログラムを作れるかと言われると不安がある。なので理解を深めるために、とあるケースの挙動を追ってみた。

## CPS(the continuation-passing style)

> In JavaScript, a callback is a function that is passed an argument to another function and is invoked with the result when the operation completes. In functional programming, this way of propagating the result is called **continuation-passing style**, for brevity, **CPS**. It's a general concept, and it is not always associated with asynchronous operations.

関数型プログラミングの世界では、コールバックを引数にとり、ある処理の結果にそれを適用するやりかたを**CPS**と呼ぶらしい。また、このスタイルは、必ずしも非同期処理と関連付けられているわけではない。

なるほど。コールバックを使うスタイルでも、同期的に処理することがあるということかな。ちなみにコールバックを使わずに同期的に処理する、いわゆる普通のスタイルは、**direct style**と呼ぶそうだ。

ということで今回のケースとは、同期的CPS, 非同期的CPSを混ぜて使ったらどのような挙動を示すかというものになる。

## サンプルコード
```js:test.js
var fs = require('fs');
var cache = {};

function inconsistRead(filename, callback) {
    if (cache[filename]) {
        //invoked synchronously
        callback(cache[filename]);
    } else {
        //asynchronous function
        fs.readFile(filename, 'utf8', function(err, data) {
            cache[filename] = data;
            callback(data);
        });
    }
}

function createFileReader(filename) {
    var listeners = [];
    var cnt = 0;
    inconsistRead(filename, function(value) {
        listeners.forEach(function(listener) {
            console.log(++cnt);
            listener(value);
        });
    });
    return {
        onDataReady: function(listener) {
            listeners.push(listener);
        }
    };
}

var reader1 = createFileReader('data.txt');
reader1.onDataReady(function(data) {
    console.log('First call data : ' + data);

    // reader1を作成した後のタイミングでreader2を作成したとする。
    // この時reader2は同期的に作成されるため、`listeners`は空リストのまま。
    // よって作成時のコールバック処理は発生しない。
    reader2 = createFileReader('data.txt');
    reader2.onDataReady(function(data) {
        // このブロック内の処理はリスナとして登録されるものの、呼び出されることなくお蔵入りとなる。
        console.log('Second calll data : ' + data);
        
        // したがって、このコードが実行されることはない。
        reader3 = createFileReader('data.txt');
        reader3.onDataReady(function(data) {
            console.log('Third call data' + data);
        });
    });
});

// 一方、reader4が作成される時点で`cache`はまだ空なので、
// この処理は非同期的に行われる。
reader4 = createFileReader('data.txt');

// だから、登録したリスナは、期待通りに処理される。
reader4.onDataReady(function(data) {
    console.log('Forth call data : ' + data);
});
reader4.onDataReady(function(data) {
    console.log('Forth call, second listener.');
});

```

## 実行結果

直感的に期待した結果にはならない。また、トップレベルで作成した`reader1`と`reader4`に対するコールバック処理の順序は、必ずしもトリガーを引いた順にはならない点にも注意（下記はたまたま、そのようになっているだけ）。

```:実行結果
$ node test.js
1
First call data : testvalue


1
Forth call data : testvalue


2
Forth call, second listener.
```

## 終わりに
参考文献のサンプルコードを改変して試してみたら、いろいろと理解が深まった。特に、１回しか呼び出されないような処理をコールバックとして渡す場合は、その渡し方で本当に処理されるのかどうかを見極める必要がある。
今回のケースでは、コールバック処理を一旦リスナとして登録しオブジェクト生成時に一度だけ呼び出すような形をとったものの、生成時にそのリスナが登録されていない事態が生じている。

なおこのような混乱を防ぐためとして、参考文献に大きく２つの指針があった。
1. ひとつの関数に、直和的に同期処理と非同期処理をまぜない
2. 同期処理を選択したなら、direct style でプログラムする
innodb_log_file_size を変えたら ib_logfile* の削除が必要

MySQL 5.6.7 以前において、my.cnf で `innodb_log_file_size` を追加ないしは変更した際には、/var/lib/mysql/ib_logfile* を削除しないと、

```
InnoDB: Error: log file ib_logfile0 is of different size 0 5242880 bytes
```

というようなエラーメッセージが出て、MySQL が起動しません。

削除の際は、データ破損などの危険があるため、[このページの "InnoDB ログファイルの数またはサイズの変更、および InnoDB テーブルスペースのサイズの変更" セクション](https://dev.mysql.com/doc/refman/5.6/ja/innodb-data-log-reconfiguration.html#idm139724357436800)の手順に従って削除を行って下さい。

参考: [こちらの記事](http://tetsuyai.hatenablog.com/entry/20110418/1303133792)も、同様の現象が発生したようです。
SML/NJの対話環境でモジュールの中身を見たいとき

SML/NJの対話環境を使っている時にモジュールHogeHogeの中身を見たいときは、こうすればよい。

```sml
structure Hoge = struct open HogeHoge end;
```

例えばListの中身を見たい場合はこう。

```sml
- structure M = struct open List end;
[autoloading]
[library $SMLNJ-BASIS/basis.cm is stable]
[autoloading done]
structure M :
  sig
    datatype 'a list = :: of 'a * 'a list | nil
    exception Empty
    val null : 'a list -> bool
    val hd : 'a list -> 'a
    val tl : 'a list -> 'a list
    val last : 'a list -> 'a
    val getItem : 'a list -> ('a * 'a list) option
    val nth : 'a list * int -> 'a
    val take : 'a list * int -> 'a list
    val drop : 'a list * int -> 'a list
    val length : 'a list -> int
    val rev : 'a list -> 'a list
    val @ : 'a list * 'a list -> 'a list
    val concat : 'a list list -> 'a list
    val revAppend : 'a list * 'a list -> 'a list
    val app : ('a -> unit) -> 'a list -> unit
    val map : ('a -> 'b) -> 'a list -> 'b list
    val mapPartial : ('a -> 'b option) -> 'a list -> 'b list
    val find : ('a -> bool) -> 'a list -> 'a option
    val filter : ('a -> bool) -> 'a list -> 'a list
    val partition : ('a -> bool) -> 'a list -> 'a list * 'a list
    val foldr : ('a * 'b -> 'b) -> 'b -> 'a list -> 'b
    val foldl : ('a * 'b -> 'b) -> 'b -> 'a list -> 'b
    val exists : ('a -> bool) -> 'a list -> bool
    val all : ('a -> bool) -> 'a list -> bool
    val tabulate : int * (int -> 'a) -> 'a list
    val collate : ('a * 'a -> order) -> 'a list * 'a list -> order
  end

```

シグニチャHOGEHOGEの中身を見たい場合はもっと簡単に書ける。

```sml
signature HOGE = HOGEHGOE;
```

同様にLISTの中身を見たい場合

```sml
- signature HOGE = LIST;
[autoloading]
[autoloading done]
signature LIST =
  sig
    datatype 'a list = :: of 'a * 'a list | nil
    exception Empty
    val null : 'a list -> bool
    val hd : 'a list -> 'a
    val tl : 'a list -> 'a list
    val last : 'a list -> 'a
    val getItem : 'a list -> ('a * 'a list) option
    val nth : 'a list * int -> 'a
    val take : 'a list * int -> 'a list
    val drop : 'a list * int -> 'a list
    val length : 'a list -> int
    val rev : 'a list -> 'a list
    val @ : 'a list * 'a list -> 'a list
    val concat : 'a list list -> 'a list
    val revAppend : 'a list * 'a list -> 'a list
    val app : ('a -> unit) -> 'a list -> unit
    val map : ('a -> 'b) -> 'a list -> 'b list
    val mapPartial : ('a -> 'b option) -> 'a list -> 'b list
    val find : ('a -> bool) -> 'a list -> 'a option
    val filter : ('a -> bool) -> 'a list -> 'a list
    val partition : ('a -> bool) -> 'a list -> 'a list * 'a list
    val foldr : ('a * 'b -> 'b) -> 'b -> 'a list -> 'b
    val foldl : ('a * 'b -> 'b) -> 'b -> 'a list -> 'b
    val exists : ('a -> bool) -> 'a list -> bool
    val all : ('a -> bool) -> 'a list -> bool
    val tabulate : int * (int -> 'a) -> 'a list
    val collate : ('a * 'a -> order) -> 'a list * 'a list -> order
  end
```

ここでは動作確認にSML/NJ 110.78を使いました。
Rails での開発のために設定している alias たち

Rails での開発のために設定している alias たち
Rails で開発しているとよく叩くコマンドがありますよね。
`rails s` とか `rails c` とか `bundle install` とか。
パパッと打つと `rails` が `raisl` となってしまったり、
`install` が `insatll` になってしまったりします（僕だけ？）

そんな僕は alias で逃げてます。
よく使わないコマンドでも似ているものは設定してしまっています。
springを使っている人はコマンドの先頭に`bin/`をつけようとしますが、railsコマンドにおいては必要ないようです。rakeコマンドを利用するときのみつけると良いようです。

他にも使い勝手の良いエイリアスがあったら教えて欲しいです。

|元のコマンド|デフォルトの alias|僕の alias|
|---|---|---|
|`bundle install`|`なし`|`bi`|
|`rails server`|`rails s`|`rs`|
|`rails console`|`rails c`|`rc`|
|`rails generate`|`rails g`|`rg`|
|`rails runner`|`rails r`|`rr`|
|`rails dbconsole`|`rails db`|`rdb`|

```~/.bashrc
alias bi='bundle install'
alias rs='rails server'
alias rc='rails console'
alias rg='rails generate'
alias rr='rails runner'
alias rdb='rails dbconsole'
```
[Intellij]Project Viewで特定ファイルを非表示にするために"Ignored files and folders"設定を変えるべきではない

## やりたいこと

Project View内で.gitignoreなど特定ファイルを非表示にしたい

## 間違った解決法

[java - Intellij IDEA. Hide .iml files - Stack Overflow](https://stackoverflow.com/questions/14251624/intellij-idea-hide-iml-files/14252600#14252600)などで紹介されている**Ignored files and folders**設定を用いる。

## 何が間違っているか

**Ignored files and folders**設定は表示レベルではなくIDEが認識するファイルの種類自体へ影響を与えるので、無視されるファイルによってはIDEの機能やプラグインが正常動作しなくなる。

例: sbtを無視設定へ加えるとbuild.sbt自体の解釈がすべて失敗するようになる。

## 正しい解決策

今のところ見つかっていない。
表示するファイルをJava(Scala)へ限定するだけであれば表示を**Project**から**Packages**へ変更すればいい。
Vagrant Plugin sahara

# vagrant plugin

vagrant には様々な plugin が存在している。

- `vagrant plugin install <plugin name>` で install できる。
- `vagrant plugin list` で install 済みの plugin が表示できる  
- `vagrant plugin -h` で他の comannd も確認できる

# sahara

sahara は vagrant の plugin.
vagrant の状態を管理できる。
sandbox mode に移行できて、その間に仮想環境に加えた変更を取り消す(rollback) するか、適応(commit) するか選べる。

- `vagrant plugin install sahara` で install
- `vagrant sandbox on` で sandbox mode になる
- `vagrant ssh` し作業をする
- `vagrant sandbox rollback` で気に入らない場合にロールバックする
- `vagrant sandbox commit` で現在の状態をコミットする
- `vagrant sandbox off` で sandbox mode を終了する

# 使いどころ

環境構築時に、sahara を利用して確かめながら進めるといいと思う。
僕の場合にはトライアンドエラーで環境構築の手順をまとめて、キレイのその手順を確かめるために、一からやり直すために sahara を使った。
Reagent入門 - Part4: SPAとフォームの要件

[Reagent](https://github.com/reagent-project/reagent)の勉強が1ヶ月ほど中断してしまいました。ClojureScriptの世界では依存パッケージのアップデートやReagentの使い方も新しくなっていると思います。Reactのようなライブラリを使う場合は特に動きが速いので、すぐに取り残されてしまいます。


## SPAの要件

SPAのフォームに必要な要件を考えてみました。

* [Bootstrap](http://getbootstrap.com/)に対応
* AjaxやWebSocketを使ったデータバインディング
* APIや使い方のドキュメントが豊富にあること
* よく使うコンポーネントがデフォルトであること
* [React](http://facebook.github.io/react/)にこだわりませんが、リアクティブであること

REST APIサーバーは[Hapi.js](http://hapijs.com/)や[actionhero.js](http://www.actionherojs.com/)で実装したアプリを使おうと思います。まだClojureのフルスタックの構成が馴染めていないので、クライアントとサーバーを疎結合にして実装を切り換えることができるのもSPAの良いところだと思います。

## Reagentで使えるフォームライブラリ

[Reagent](https://github.com/reagent-project/reagent)に対応したフォームのライブラリにはコンポーネント単位のものからReagentを拡張したフルスタックフレームワークまで結構豊富にあります。

### reagent-forms

[reagent-forms](https://github.com/reagent-project/reagent-forms)はオフィシャルのReagentプロジェクトのライブラリです。[Bootstrap](http://getbootstrap.com/)に対応しています。

### re-com

[re-com](https://github.com/Day8/re-com)は[re-frame](https://github.com/Day8/re-frame)の姉妹プロジェクトです。それぞれ独立して使えますがあわせて使うと良いみたいです。Bootstrapに対応しています。[Material Design Iconic Font](http://zavoloklom.github.io/material-design-iconic-font/icons.html)も付いてます。[ドキュメント](http://re-demo.s3-website-ap-southeast-2.amazonaws.com/)がしっかりと書かれているので信頼できます。

### Rente

[Rente](https://github.com/enterlab/rente)は[core.async](https://github.com/clojure/core.async)とWebSocket/Ajaxライブラリの[Sente](https://github.com/ptaoussanis/sente)をReagentに対応させたフレームワークです。Bootstrap対応です。

[前回](http://qiita.com/masato/items/ec0333fe21a093a5248c)調べたサーバーとの通信方法を考えると、Renteが一番よさそうな感じです。
XAMPPにPHP7.0.0α1をインストール

[PHP7.1.0α1](http://qiita.com/rana_kualu/items/3540a960ab442e57d48e) / [PHP7.1の新機能](http://qiita.com/rana_kualu/items/476385b674d27339f911) / [PHP7.0.0α1](http://qiita.com/rana_kualu/items/447995347acb2f8997a3) / [PHP5.6](http://qiita.com/rana_kualu/items/206d786a2be7942c6dc3)

http://php.net/
http://php.net/archive/2015.php#id2015-06-11-3
Windows用のPHP7ができてたのでXAMPP環境にインストールしてみます。
なおα版なので、真似る場合は自己責任で。

## VCRUNTIME140.dll

Visual C++ 2015 ランタイムが必要なので、入っていなければインストールする。
http://stackoverflow.com/questions/30811668/php7-missing-vcruntime140-dll

## ダウンロード

http://windows.php.net/qa/
PHP 7.0 (7.0.0alpha1)を選択。
32ビットPCでは「VC14 x86 Thread Safe」、64ビットは「VC14 x64 Thread Safe」をダウンロード。

## インストール

既存のxampp/phpディレクトリを削除なりリネームなりで排除し、解凍したファイルをまるごとxampp/phpディレクトリにコピペ。

## php.ini

php.ini-developmentをphp.iniにコピー。

必要なextensionを有効にする。
とりあえずphp_curl、php_gmp、php_mbstring、php_pdo_mysqlあたりのコメントを外した。
その他必要な設定。↓あたり。

```
date.timezone = Asia/Tokyo
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input = pass
mbstring.http_output = pass
```

## xampp\apache\conf\extra\httpd-xampp.conf

php5_module、php5apache2_4.dll等、php5になっているところをphp7に変更。

## 起動

XAMPPコントロールパネルから起動。
色々足りてないが、とりあえず動作した。
![20150622-php7.png](https://qiita-image-store.s3.amazonaws.com/0/26088/ab85bb06-f915-97e5-f58e-fc417f54b785.png)

## PHP7の機能

```php
<?php
	// 厳密なタイプヒンティング
	declare(strict_types=1);
	
	/**
	* スカラー型タイプヒンティング、返り値のタイプヒンティング
	* @param int
	* @return bool booleanではないらしい
	*/
	function hoge(int $i):bool{
		// return null; // Fatal error: Uncaught TypeException: Return value of hoge() must be an instance of boolean, null returned
		return true;
	}
	hoge(1);
	// hoge('1'); // Fatal error: Uncaught TypeException: Argument 1 passed to hoge() must be of the type integer, string given
	
	// 無名クラス
	$obj = new class(1) { // ()内はコンストラクタ引数
		public function __construct(int $i){
			$this->i = $i;
		}
	};
	
	// 環境によらず使える暗号論的擬似乱数生成器
	var_dump(random_int(100, 999));
	
	// 鮫
	var_dump("\u{9BAB}"); // ''では不可
	
	// 致命的エラー
	try {
		require_once('fail.php'); // fail.phpのパースエラーを受け取れる
		// a // このファイルがパースエラーの場合は死ぬ
	} catch (ParseException $e) {
		var_dump($e->getMessage()); // syntax error, unexpected end of file
	}
	
	// <=>
	var_dump(1<=>2, 2<=>2, 3<=>2 ); // 何故かApahceが落ちる
	
	// ??
	var_dump($_REQUEST['hoge'] ?? 'fuga'); // 未定義でもNoticeの発生しない?:
	
	// 商
	var_dump(intdiv(6, 4), 6%4); // 商1、余り2

	// ジェネレータ
	$gen = (function(){
		yield 1;
		yield from [2, 3];
		return 4;
		yield 5;
	})();
	foreach($gen as $v){
		var_dump($v); // 1,2,3になる。4は無い
	}
	var_dump($gen->getReturn()); // 4
	
	// ReflectionGenerator
	$gen = (function(){ yield from [5, 4, 3, 2, 1]; })();
	$ref = new ReflectionGenerator($gen); // 使った後のジェネレータは不可？
	var_dump(
		$ref->getExecutingLine(), // 現在yieldしてる行？
		$ref->getExecutingFile(), // 定義されてるファイル
		$ref->getTrace(), // []しか入ってこない
		$ref->getFunction(), // [ReflectionFunction]
		$ref->getExecutingGenerator() // $gen？
	);
```

何故か<=>演算子がApacheを巻き込んで落ちますが、それ以外はとりあえず動作しました。
まあ、まだα版ですし実用するべきではないでしょう。
パフォーマンス測定等は特にしていないので、高速化の結果は不明。
あとReflectionGeneratorなるクラスを見つけましたが詳細不明。