OmniAICreator/Qiita-1.07M huggingface dataset:
Sparkのチューニングに関するメモ

Sparkを使った際にチューニングで考慮した点のメモです。

##前提となる環境
- Spark1.4
- 元データはJSON

##データ形式と圧縮コーデック
- データをParquet形式で扱う  
元となるデータはJSON形式ですが、Parquetの方が効率的に扱えるためJSONをParquetに変換します。
- 必要なデータだけをParquetに保存する  
DataFrame#select()で必要なカラムだけを選択し、計算に不要なデータを取り除きます。
- Parquetの圧縮形式にはsnappyを使用する  
デフォルトではParquetの圧縮形式はgzip形式ですが、snappyを選択することで高速な圧縮・伸長が行えます。
(追記：2.0ではsnappyがデフォルトになっています)

####コード例
```scala
sqlContext.setConf("spark.sql.parquet.compression.codec", "snappy")
val jsonDataFrame = sqlContext.read.json(jsonFilePath)
val jsonDataFrame.select("id","type","arg1","arg2","arg3","time").write.format("parquet").save(parquetPath)
```

##設定
spark-defaults.confを設定して使用可能なメモリを増やし、高速なシリアライザーの指定をしました。
spark.serializerはデフォルトではjava.io.Serializerですが、それより高速なシリアライザが用意されているためそれを使用します。
spark.executor.memoryとspark.driver.memoryのデフォルトは512mとかなり少ない設定になっています。
特にspark.executor.memoryはその60%がRDDのキャッシュに使用されるため効果が大きいと考え、spark.driver.memoryよりspark.executor.memoryにより多くメモリを振っています。

###設定例
```text
spark.serializer                   org.apache.spark.serializer.KryoSerializer
spark.executor.memory              6g
spark.driver.memory                2g
```

##コーディング
- 使いまわすRDDやDataFrameの計算結果をキャッシュする  
複数回使うRDDやDataFrameはcache()メソッドを使って計算結果をキャッシュするようにしました。
これをしないと、使用される度に再計算が走ってしまうため、とても非効率になってしまいます。  
ちなみに、こういった計算結果のキャッシュをSparkでは永続化と呼ぶそうです。
DBや一般的なシステムにおける永続化とは異なる概念なので注意が必要です。
- バッチ全体をscalaで記述する  
最初は複数のコンポーネントをシェルで繋いでいたのですが、ディスクへの書き出しと読み込みを何度も発生させてしまい効率が悪いため、繋ぎの部分もscalaで記述することで計算のほとんどをオンメモリで処理できるようにしました。

##まだ試してない
- spark.io.compression.codecにlz4を指定
RDDの圧縮コーデックを設定する spark.io.compression.codec というプロパティがある。
デフォルトはsnappyなのだが、snappyよりも高速なlz4という圧縮形式が指定できるらしい。

- spark.sql.parquet.filterPushdown をtrueに指定
バグがあってデフォルトがoffになっているけどデータにnullが含まれない場合は安全だからtrueにしてもよいという記述が公式ドキュメントに載っている。
「Parquet filter pushdown optimization」というのがなんの最適化なのか分からないけれど、trueにできれば何かが早くなるっぽい。
(追記: 2.0ではデフォルトでtrueになっています)
Windows 8.1でChromeの文字がにじむ

以下で対処。

ASCII.jp：Windows 8.1でやっておきたい「ちょっと濃い目」の設定 (2/5)｜進化点からギモン、Tipsまで！　Windows 8.1をしゃぶりつくす!! http://ascii.jp/elem/000/000/838/838194/index-2.html
Javaのセキュリティ例外設定を楽に管理したい

![image](https://qiita-image-store.s3.amazonaws.com/0/35603/8e22b683-8d74-b798-e4bd-67af1473cf6c.png)

証明書がオレオレだったりすると アプレットの実行前に Javaのコントロールパネルから
セキュリティ例外に実行時のアドレスを追加する必要があるのですが、
正規表現も使えないのに、1行ずつ行を追加してアドレスを設定していくという使いにくさたるや。。。

なんとか設定をテキストでいじれないかなーなんて思っていたら、
意外や意外下記に実体になる設定ファイルがありました。

- **Windows:** `%appdata%\..\LocalLow\Sun\Java\Deployment\security\exception.sites`
- **Mac OS X:** `~/Library/Application Support/Oracle/Java/Deployment/security/exception.sites`
- **Linux:** `~/.java/deployment/security/exception.sites`

ここに設定画面と同じく、例外設定したいアドレスを行ごとに指定すればOK。
好きなエディタを使えるので、設定追加も削除も苦にならなくなりました :v:
配列の指定した文字列と部分一致する要素のindexを全て配列で返すメソッド

```rb
arr = ["オレンジジュース", "トマト缶", "ナタデココ缶", "リンゴジュース", "バナナオレ"]
arr.which_elements_is_include("ジュース")
=> [0, 3]
```
なメソッドが欲しかった。

```rb
class Array
  def which_elements_is_include(value)
    self.map.with_index{|item, i| i if item.include?(value)}.compact
  end
end
```
## 追記 その２
@jnchitoさんがとても便利なメソッドを作ってくださいました。ありがとうございます。

```rb:index_select(Array)-created_by_@jnchito
class Array
  def index_select(obj = nil)
    if obj.nil? && !block_given?
      self.each
    else
      proc = obj.nil? ? ->(i){ yield self[i] } : ->(i){ self[i] == obj }
      self.each_index.select(&proc)
    end
  end
end
```
動作確認用のテストも作ってくださいました。

```rb:単体テスト-created_by_@jnchito
require 'test/unit'
class TestIndexSelect < Test::Unit::TestCase
  def test_index_select
    arr1 = [100, 200, 100, 300, 100, 400]
    result1 = arr1.index_select(100)
    assert_equal [0, 2, 4], result1

    arr2 = ["ととろ", "まっくろくろすけ", "ととろ", "めいちゃん", "さつきちゃん", "ととろ"]
    result2 = arr2.index_select("ととろ")
    assert_equal [0, 2, 5], result2

    arr3 = ["オレンジジュース", "トマト缶", "ナタデココ缶", "リンゴジュース", "バナナオレ"]
    result3 = arr3.index_select {|v| v =~ /ジュース/}
    assert_equal [0, 3], result3

    # 両方渡した場合
    arr4 = [100, 200, 100, 300, 100, 400]
    result4 = arr4.index_select(100) {|v| v == 200}
    assert_equal [0, 2, 4], result4

    # どちらも渡さない場合
    arr5 = [100, 200, 100, 300, 100, 400]
    result5 = arr5.index_select
    assert result5.is_a?(Enumerator)
    assert_equal arr5, result5.to_a
  end
end
```
### 仕様
```rb
array.index_select(obj) -> Array | nil
```

## 追記
コメントで教えていただいた@pocariさんの[Ruby - find_allのindex版 - Qiita](http://qiita.com/pocari/items/0b4e632ef2a2b6a97ba9)のほうが柔軟で汎用的なので今後はこちらを使うことにします。
ありがとうございます。
配列の指定した値と一致する要素のindexを全て配列で返すメソッド

```
arr1 = [100, 200, 100, 300, 100, 400]
arr2 = ["ととろ", "まっくろくろすけ", "ととろ", "めいちゃん", "さつきちゃん", "ととろ"]
```
な配列があったとする。
指定した値と一致する要素のindexを全て配列で返す

```
arr1.where_is(100)
=> [0, 2, 4]
arr2.where_is("ととろ")
=> [0, 2, 5]
```
なメソッドが欲しかったから作った。

```
class Array
  def where_is(value)
    self.map.with_index{|item, i| i if item == value}.compact!
  end
end
```
## 追記
[配列の指定した文字列と部分一致する要素のindexを全て配列で返すメソッド - Qiita](http://qiita.com/hirokishirai/items/6adbb2eb09e6f2c92668)コメントで教えていただいた@pocariさんの[Ruby - find_allのindex版 - Qiita](http://qiita.com/pocari/items/0b4e632ef2a2b6a97ba9)のほうが柔軟で汎用的なので今後はこちらを使うことにします。
ありがとうございます。
gitwach > undercurl

https://github.com/neovim/neovim/commit/da457a176be338fcee429684ced8d2dc8b4aefd4

> +  if (attrs.underline || attrs.undercurl) {

undercurlってなんだろうと思っていたら、以下のページを見つけた。

http://stackoverflow.com/questions/15904758/how-can-i-make-vim-show-spaces

GUIで使える設定でスペースの下に"("を90度右回転したようなものが付くようだ。
注文ステータス変更APIのリクエストの書き方について

注文ステータス変更APIを使ってOrderStatusを変更しようと試みていますが、何度やってもエラーしか返ってきません。
同様の「入金ステータス変更API」「出荷ステータス変更API」はリファレンスどおりに書いて上手く行っています。
注文ステータス変更API も リファレンスのサンプルを参考に...ほぼコピーして行っているのですが、「od90101」が返ってきます。

行いたいのは、「処理中」の注文を「完了」にしたいのです。
「入金ステータス変更API」による「入金済み」(入金日の入力)、「出荷ステータス変更API」による「出荷済み」(出荷日の入力)は先に行っています。
「入金ステータス変更API」「出荷ステータス変更API」では問題は起きていません。

リクエストしたXMLは以下の通りです。
<pre>
&lt;Req&gt;
 &lt;SellerId&gt;snbx-xxxxxxxxx&lt;/SellerId&gt;
 &lt;Target&gt;
    &lt;OrderId&gt;snbx-xxxxxxxxx-10000000&lt;/OrderId&gt;
    &lt;IsPointFix&gt;true&lt;/IsPointFix&gt;
 &lt;/Target&gt;
 &lt;Order&gt;
    &lt;OrderStatus&gt;5&lt;/OrderStatus&gt;
 &lt;/Order&gt;
&lt;/Req&gt;
</pre>

そして返ってきたレスポンスは以下の通りでした。
<pre>
&lt;?xml version="1.0" encoding="UTF-8" ?&gt;
&lt;Error&gt;
    &lt;Code&gt;od90101&lt;/Code&gt;
    &lt;Message&gt;Request Parameter Error : OrderStatus&lt;/Message&gt;
    &lt;Detail&gt;&lt;/Detail&gt;
&lt;/Error&gt;
</pre>

書き方のどこが悪いのでしょうか？
<a href="http://developer.yahoo.co.jp/webapi/shopping/orderStatusChange.html">注文ステータス変更API </a>の通りに書いたつもりです。
なお、Orderタグを空にしたり、Targetタグの中に移すとエラーは消えます。
もちろんステータスは変更されません。

確認しているのは「テスト環境」です。
よろしくご教授お願い致します。
電子回路 > online > 回路図作成 > scheme-it

ブラウザがあれば動作するonlineの電子回路図作成ツール

以下が見つかった
http://www.digikey.jp/ja/resources/scheme-it

登録しなくてもとりあえず回路図作って画像キャプチャはできそう。

#使い方
## 抵抗の追加
SCHEMATIC SYMBOLS > Passives > Resistors
で追加する

## コンデンサの追加
SCHEMATIC SYMBOLS > Passives > Capacitors
で追加する

## 電源の追加
SCHEMATIC SYMBOLS > Sources
で追加する

## コンポーネント同士の接続
たとえば、電源と抵抗を接続する場合。
電源の端にマウスカーソルをあわせると、緑色の枠が出るのでそれを選択する。
その状態でマウスカーソルを動かすと破線が表示される。破線のもう片方を抵抗の端にあわせると接続が完了する。

## 画像出力
メニュー > MAIN > Output > EXPORTより以下の出力ができる
- Image (PNG)
- Image (SVG)
- Document (PDF)

便利だ。

作成したRC直列回路は以下の通り。

![schemeit-project.png](https://qiita-image-store.s3.amazonaws.com/0/32870/042f9b0a-7135-cdcb-1ea8-be3f4c6fd602.png)


#回路図の保存など (追記)
##ユーザ登録
ユーザ登録してみた。

ユーザ登録はツール自体のためでなく、Digikeyという通販サイトとしてのユーザ登録と同一のようだ。

ユーザ登録により回路図が保存できるようになった。

##回路図の保存
SAVE もしくは SAVE ASで保存できる。
フォルダの機能はない。

ファイルをどんどん追加していくと、OPEN 時にファイルを選択するのが非効率になりそう。

一時的に回路図を置いておくような使い方が合うかもしれない。

OPEN 時に表示される順番が以下のような数字の並びになってしまう。
- RCseries-1
- RCseries-10
- RCseries-11
- RCseries-2


##DELETE
OPEN を選択した後表示されるウィンドウでファイルが DELETE できる。
ただし、ファイルは１つずつしか消せない。 さらに、一つファイルを消すためにテキストボックスに「DELETE」を入力しないといけない (削除確認用のプロテクションのよう）。
この点は使いづらい。
UnityでSystem.Reflection.ReflectionTypeLoadExceptionが出た時の対処法

# 結論
Assetsフォルダにある[LitJSON](http://lbv.github.io/litjson/)のAssemblyInfo.csを削除したら直りました。

#原因
LitJsonはjsonライブラリです。ビルドしてLitJson.dllをUnityにインポートして使うようですが、ローカル環境のMac OSX Yosemiteではビルドできなかったのでsrc/以下のファイルをUnityのAssets以下に入れて使っていました。
その中にあるAssemblyInfo.csの

```
using System.Reflection;
```
でエラーが発生していたようです。(詳細不明)

#経緯
WWW通信でJsonオブジェクトを取りたいとLitJsonをインポート、その時は特に問題なく、スクリプトを書いていたのですが、新たにシーンを作ったところ以下のエラー発生。


```

Unhandled Exception: System.Reflection.ReflectionTypeLoadException: The classes in the module cannot be loaded.
  at (wrapper managed-to-native) System.Reflection.Assembly:GetTypes (bool)
  at System.Reflection.Assembly.GetExportedTypes () [0x00000] in <filename unknown>:0 
  at Mono.CSharp.TypeManager.LoadAllImportedTypes () [0x00000] in <filename unknown>:0 
  at Mono.CSharp.Driver.Compile () [0x00000] in <filename unknown>:0 
  at Mono.CSharp.Driver.Main (System.String[] args) [0x00000] in <filename unknown>:0 
```

シーン内にあるゲームオブジェクトを削除してもダメ、それどころか他のシーンも同様のエラーで動かなくなっていました。

Unityのどっかがおかしくなったと思い、新たにプロジェクトを作ってAssets以下をコピーしたもののダメ。ということは問題なのはAssets以下なので、空のシーンを作り、バックアップを取ってImages,Audio,Animation...と一つ一つフォルダを消していきました。
Scriptsを消したところでエラー解消。
バックアップからScriptsを復元し再度エラーを起こし今度はScriptsの中のファイルを一つ一つ消していったところLitJsonでエラー解消。
LitJsonの公式サイトに行ったところdllが配布されていたのですが、その時たまたまネット回線が悪くDL出来なかったため自力でビルドしようとPKG_CONFIGとgmbcのパスを設定してmakeしたものの

```
error CS0016: Could not write to file `LitJson', cause: Could not find a part of the path "/Users/kaeruko/Desktop/honmaru/Assets/Scripts/LitJson/bin/LitJson.dll".
```
というエラーが出て出来ませんでした。
makefileも見たのですがLitJson.dllを生成してるところがどこかよくわからず、
LitJson.dllってビルドして出来るものじゃないの？
なんでビルド時に要求されるんだ…と思いながらLitJsonフォルダを見るとひとつだけ毛色の違うファイルを発見。

![スクリーンショット 2015-06-27 11.52.24.png](https://qiita-image-store.s3.amazonaws.com/0/57077/de3b6c05-395f-4c5b-bf8f-fb1567b87aae.png)

消したところ動きました。
中を見ると

```csharp:AssemblyInfo.cs
using System;
using System.Reflection;
using System.Runtime.CompilerServices;


[assembly: CLSCompliant (true)]

[assembly: AssemblyTitle ("LitJson")]
[assembly: AssemblyDescription ("LitJSON library")]
[assembly: AssemblyConfiguration ("")]
[assembly: AssemblyCompany ("")]
[assembly: AssemblyProduct ("LitJSON")]
[assembly: AssemblyCopyright (
    "The authors disclaim copyright to this source code")]
[assembly: AssemblyTrademark ("")]
[assembly: AssemblyCulture ("")]

[assembly: AssemblyVersion ("@ASSEMBLY_VERSION@")]

```

と、エラー内容と合致していました。

はぁ、インスペクタからまたゲームオブジェクト設定しなきゃ…
iPython でスライド作り


## 前提

### iPython とは

http://ipython.org/

> IPython 3.x will be the last monolithic release of IPython, containing the notebook server, qtconsole, etc. The language-agnostic parts of the project: the notebook format, message protocol, qtconsole, notebook web application, etc. will move to new projects under the name Jupyter.

### Jupyter とは

https://jupyter.org/

### reveal.js とは

http://lab.hakim.se/reveal-js/#/

### 環境

* python 3.4.3
* ipython 3.1.0
* reveal.js 2.6.2 （最新版は 3.1.0）


## スライド作成

### ipython nbconvert

https://ipython.org/ipython-doc/3/notebook/nbconvert.html

`ipython nbconvert --to FORMAT notebook.ipynb` で `FORMAT` のとこを `slides` とするとスライドを作れる。

実際に作られたスライドで作り方を紹介してくれています。

http://www.slideviper.oquanta.info/tutorial/slideshow_tutorial_slides.html#/

ただ情報は古いので雰囲気だけ。

一番手っ取り早く手元で確認するには

```bash:
ipython nbconvert --to slides notebook.ipynb --post serve
```

とすると、ブラウザまで開いてくれます。

ただ、変換された `html` ファイルに何も手を加えないのであればこれで充分ですが、

![Gyazo](http://i.gyazo.com/69da680575152e8743a727e87ccd14d4.png)

Input[] スライドにいれたくないなあとか思うと思います。


### hide input cell

[IPython Slideshows Will Change the Way You Work](http://hannes-brt.github.io/blog/2013/08/11/ipython-slideshows-will-change-the-way-you-work/)
https://gist.github.com/hannes-brt/6207507

> ipython nbconvert --to slids input.ipynb --stdout | ipy_hide_input > input.slides.html

とすればできるようにしてくれています。

ただ自分の環境では `ipy_hide_input` の `print` が使われているところは `print()` に変更して

```bash:
ipython nbconvert --to slids notebook.ipynb --stdout | python ipy_hide_input > notebook.slides.html
```

`notebook.ipynb` と同じフォルダに `reveal.js` （reveal.js 3.1.0 ではうまくいかなかった）フォルダを置いて
（中で `<script src="reveal.js/js/reveal.js"></script>` してる）

```
python -m http.server
```

で `http://localhost:8000/notebook.slides.html` にアクセスすれば

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

Input[] がなくなりました。


## GADFLY?

`matplotlib` ではなく、`svg` でブラウザ上でインタラクティブなグラフ描画が可能なものもちゃんとスライドにできるように変換してくれるのか？
当然できてほしいけど。
c++ builder > 知らなかった > 呼び出し履歴で引数の値が分かる

```txt:動作確認
C++ builder XE4
```

実行時にエラーで止まった時、「呼び出し履歴」のウィンドウで呼び出し元の関数の所にマウスカーソルを合わせると

    :004060F5 TThreadXXX::funcA(this=:013D2440, idx=2)

のように引数(idx)の値が何の時にエラーが出るか分かるようだ。

知らなかった。

これがあるとデバッグ時にはかどりそう。
TomcatContext XMLファイル：Webアプリの定義　

Eclipseで作成したWebappは、WarファイルかTomcatのWebappsフォルダの中に移動しないと、実行できないことがあります。
Eclipseの中で、Tomcatサーバを追加して、実行できるというのは、なんだろう。
しらない機能があると思います。
環境：
１．Eclipse Juno 4.2 Ultimate 64bit 日本版 JREなし
２．Tomcat　7.0
３．Java　7.9

インタネットで調べると、Tomcat＞Conf＞Catalina＞localhostフォルダーで、WebAppsのXMLファイルを定義するとできるという
ことがわかりました。
そうなんだ、やってみましょう。
１．Eclipseの設定：
 [ウィンドウー」＞「設定」＞Tomcat＞このように設定します。
コンテキスト・ファイルのパスの例：
C:\Eclipse64\pleiades\tomcat\7.0\conf\Catalina\localhost

![screenshot.2.jpg](https://qiita-image-store.s3.amazonaws.com/0/62808/2bc87e22-9225-f6eb-e33c-737f7f59644c.jpeg)

２．EclipseのWebApp（やっているWebアプリ）フォルダーの中、「work」フォルダーを作成ます。
こんな感じです。

３．Tomcatインストールフォルダに移動します。
Tomcat＞Conf＞Catalina＞localhost＞Contextのxmlファイルを作成します。

たとえば：EclipseのJavaEEプロジェクト名：helloJsp ＞ Context XMLファイルの名は:helloJsp.xml

中身はこのソースコードを書きます。

\<Context path="/" reloadable="true"
         docBase="C:/Eclipse64/pleiades/workspace/helloJsp" 
         workDir="C:/Eclipse64/pleiades/workspace/helloJsp/work">
\</Context>

説明：
- path　：　Request-URIに対応するパスです。
（Request-URIの参照リンク）：http://www.javadrive.jp/servlet/request/index6.html

\- reloadable :　/WEB-INF/classes/ や /WEB-INF/lib　が変更されると、自動的に読み込みます。

\- docBase ：「私がやっているWebAppのContextフォルダはここです。」という意味です。Tomcatさんは実行するとき、この中のContextファイルを読んで、やっているWebAppのフォルダーを探します。

-　workDir　：サーバレットが必要なフォルダー。WebAppとやりとりするとき、temporary read-write(仮読みー書き）のため。

４．実行すると、オケーです。

参照リンク：
https://tomcat.apache.org/tomcat-5.5-doc/config/context.html

Updated:
Eclipseの「新規メニュ」で、「その他」を選んで、「Tomcatプロジェクト」を選んだら、Tomcat用のプロジェクトができます。
↑とだいたい同じです。
複数アカウント間でのイメージ共有

SoftLayerで、複数アカウント間でのイメージの共有がとても便利だったので共有します。

1. 管理ポータルより、Device - Manage - Images をクリック
2. 共有したいイメージをクリック
3. Share Image with Account Number: でアカウントIDの数字部分だけ入力し、Share をクリック

![ 2015-06-27 9.57.17.png](https://qiita-image-store.s3.amazonaws.com/0/42406/56f2a7bd-334d-fed1-cc8e-b891f16e5635.png)

これで、イメージの共有完了です。
Google Maps API v3 で、InfoWindowをクラスタ化する方法

Google Maps APIはv3から、InfoWindowを画面上単一でなく、複数立てる事ができるようになっています。
なので、（こういう用途を想定してるオブジェクトではないので、このUIがよいかどうかは別問題として）マーカーではなくInfoWindowで地図上に情報を載せる要件が出てくる事があります。

![InfoWindowをマーカーに使う](https://qiita-image-store.s3.amazonaws.com/0/10108/c0ea7915-4054-f0ef-e87c-0a8db5108faa.png)

こんな感じで。

こういう使い方をすると、マーカーと同じなので、密度のあるところではクラスタ化したいという要件も出てくるわけですが、マーカーであれば、[js-marker-cluster](https://github.com/googlemaps/js-marker-clusterer)を使えば簡単にクラスタ化できるものの、さて困った、InfoWindowはマーカーではないのでこれではクラスタ化できません。

何か方法はないか、できればjs-marker-clusterを使って、手も入れない形で、と考えていましたが、以下のような方法を思いつきました。

## 独自のマーカークラスを作成

独自のマーカークラスを作成します。継承関数については、[こちらの記事](http://qiita.com/no22@github/items/d3bead2acbb7ff1fb86b)を使わせていただきました。

```js:独自のマーカークラス
function inherits(ctor, superCtor) {
    ctor.super_ = superCtor;
    ctor.prototype = Object.create(superCtor.prototype, {
        constructor: {
          value: ctor,
          enumerable: false,
          writable: true,
          configurable: true
        }
    });
};

function MyMarker(arg){
    MyMarker.super_.call(this,arg);
    this.visible = false;
    this.infoTarget = arg.infoTarget;
}
inherits(MyMarker, google.maps.Marker);
MyMarker.prototype.setMap = function(arg) {
    if (arg == null) {
        this.infoTarget.close();
    } else {
        this.infoTarget.open(arg);
    }
    MyMarker.super_.prototype.setMap.call(this, arg);
};
```

## InfoWindowを独自マーカーの属性として与え、独自マーカーをクラスタに登録

作成した個々のInfoWindowを、直接地図に追加せず、独自マーカーの属性として登録し、独自マーカーをjs-marker-clusterに追加します。
独自マーカーの内部処理は、マーカーが地図に追加されると子のInfoWindowを開き、地図から削除されると子を閉じる動作をするよう記述していますので、これにより、マーカーがクラスタによって地図に追加されるとInfoWindowを開き、削除されると閉じる動作が実現されます。
独自マーカー自身は、内部でvisible=falseにしていますので、表示される事はありません。

```js:独自マーカーをクラスタ登録
var cluster = new MarkerClusterer(map, []);
cluster.setMaxZoom(18);

for (var i=0;i < 100;i++) {
    var mll = new google.maps.LatLng(
        35  + (Math.random() * 20 - 10), 
        135 + (Math.random() * 20 - 10)
    );
    var mopts = {
        content: "" + i,
        position: mll, 
        disableAutoPan: true ,
        maxWidth: 240
    };

    var info = new google.maps.InfoWindow(mopts);
    
    var marker = new MyMarker({
        position: mll,
        infoTarget: info
    });
	
    cluster.addMarker(marker);
}
```

実際の動作例：[こんな感じ](http://jsfiddle.net/kochizufan/6eLb0jzs/)

## 応用案

今回はクラスタで行いましたが、同じようなアプローチで[OverlappingMarkerSpiderfier](https://github.com/jawj/OverlappingMarkerSpiderfier)あたりでも使えるのではないかと思います。
また、今回はjs-marker-cluster側に手を入れないアプローチで行ったために、見えないマーカーという無駄オブジェクトを介していますが、MarkerクラスとInfoWindowクラスは、見せ方がsetMap(map)かopen(map)か、消し方がsetMap(null)かclose()か、あと位置取得メソッドの差がある程度で、実質同じ動作なので、js-marker-cluster側に手を入れれば、無駄なマーカーを介さず直接InfoWindowを操作させる事も可能と思います。
...というか、今書きながら思いついたけど、独自InfoWindowクラス作って、そいつにMarker等価のインタフェース加えてやって直接食わせる手もあるのか（うまくいくかは未確認）。

## おまけ：InfoWindowの削除ボタンを消す

最初にも書いた通り、InfoWindowはマーカーと異なり、マーカーのような使われ方をする事を想定されてないので、「閉じる」ボタンがあります。
これで閉じられてしまうと、地図上から消えてしまいます（一旦クラスタされればまた出てくるけど）。
これを消す方法は今の所正式ルートではありませんが、いつ動かなくなっても泣かないアプローチであれば、今の現時点でのGoogleの実装に依存する形で、

```css:InfoWindowの閉じるボタンを消す
.gm-style-iw + div {
  display: none;
}
```

で消す事ができます。

が、マーカーと違って場所を取る分、最大ズームでも重なってると下の情報は全く見えないし、消せないのは消せないのでそれも問題...とか考えだすと、そもそもこのUIがいいのかという最初の話に...
よく使うgulpプラグイン（普通のWebサイト編）

普通のサイト（小中規模のコーポレートとかペライチのページ）を作るときのセット。

### ユーティリティ

- gulp-util
- gulp-load-plugins
- gulp-plumber
- gulp-watch
- gulp-run-sequence
- gulp-rename
- gulp-sourcemaps

### CSS

- gulp-ruby-sass
- gulp-pleeease
- gulp-minify-css

### JS

- gulp-usemin
- gulp-uglify

### HTML

- gulp-ejs

### その他

- browser-sync
- rimraf
- del

### Bowerを使う場合

- gulp-flatten
- gulp-bower-files
【JavaScript】 空文字のチェック方法【勉強中】

・比較方法

```html
<input type="text" id="myText" />
```
というテキストフィールドに対して、
空文字かどうかをチェックする場合、

```javascript
if (document.getElementById('myText').value == "" )  {
    alert('空文字です');
}
```
とする事でチェックが出来ました。

他にも、Nullかどうかをチェックするには、

```javascript
if (document.getElementById('myText').value == null )  {
    alert('nullです');
}
```
によってチェックが出来ます。

どうせするのであれば、
論理和の演算子 || (条件の内、一つでもtrueならtrue)を使って、

```javascript
if (document.getElementById('myText').value == "" || document.getElementById('myText').value == null)  {
    alert('空文字またはnullです');
}
```
とすれば、短く書けました。

・2015/06/27 追記
[sounisi5011](http://qiita.com/sounisi5011 "sounisi5011")様により、アドバイスを頂きました。

JavaScriptには、`==` によって比較する方法(等価比較)と`===`によって、比較する方法(厳密等価比較)があるそうです。

前者はある意味曖昧な比較をする、という事で、曖昧に検索する事以外では、後者`===`を比較した方が良い、との事でした。
(vbとかでも、常に if a = b then などは、常に、型も考慮して比較しますもんね。常にこちらで行ったほうがいいですね。)

また、`==`と`===` では、後者の方が処理速度が速いそうです。
これも単純な考えで、`==`は処理の最初に比較する両者の型が同じかどうか比較し、その後、型が同じ場合は～～、型が違う場合は型変換をして～～、などと処理が走るのに、対して、`===`では、そもそも、両者の型が同じかどうかを比較しない、という事でした。

ご指摘ありがとうございます。

・2015/06/29 追記
[hikaru_oao ](http://qiita.com/hikaru_oao "hikaru_oao ")様より、アドバイスを頂きました。
[こちらの記事](http://unageanu.hatenablog.com/entries/2007/07/05 "記事")を参考にさせて頂きますと、JavaScriptでは、nullや空文字を評価すると、if文の判定は、falseになるそうです。

よって、上記のif文は以下のように書き表せます。

```js
if (!(document.getElementById('myText').value)) {
    alert('空文字またはnullです');
}
```
※ 厳密には空文字・nullだけでは無いですが。
ご指摘ありがとうございます。
Qiita > タグ付けの間違い > タグ1,タグ2,タグ3

qiitaを新規投稿する人で時々見かける失敗は以下のようなもの

    タグ1,タグ2,タグ3,タグ4

本来は
 
    タグ1 タグ2 タグ3 タグ4
とするべきだった。

タグに「,」が使えるのはいいことかもしれないが、こういう失敗があるとして、","もDelimiterとするのも一案のようにも思える。
技術英語 > with a little extra effort

https://learn.sparkfun.com/tutorials/esp8266-thing-hookup-guide

>  It’s an extremely cost-effective WiFi module, that – <font color=red>with a little extra effort</font> – can be programmed just like any microcontroller. 

余談になるが、上のcost-effectiveは日本語でいう「コスパ」のこと。英語ではcost performanceとは言わずにcost-effectiveかどうかという。

<hr>
effort関連では make efforts というのを思い出した。
make an effort　と make efforts というのを使い分けしてもいるようだ。

あと、githubで以下を見つけた
https://github.com/yi-editor/yi/issues/500
> Yi should make a better effort to display it.
JaSSTで話題になったテスト設計をモデル化してみた

6/26日、JaSST関西に参加しました。西先生が考えているテストアーキテクチャ設計について、そのモデル（メタモデル）をトライしてみました。

先生は、システムアーキテクチャ設計の並行概念として、「テストアーキテクチャ設計」というコンセプトを提唱しています。最終的にはテストスイート（テストケース群）を設計するのですが、テストケースの上位概念として「テスト観点」を上げ、それらをモデル化（グループ化、階層化、関係づけ）することでテストの再利用性やその後の派生開発での利用をしやすくするある種の「設計行為」だとしています。

![image](https://qiita-image-store.s3.amazonaws.com/0/51055/67cbe9b3-776b-7a46-3dab-6aacc525244e.png)

このモデルは、講義中に描いたものを、懇親会中に西先生と議論し、その後、二次会でも同じテーブルの方々とレビューして書き上げた、第一バージョンです。

この領域にいる方々のコメントを下にお待ちします。
うちんとこのサーバーでwordmoveする備忘録


```vagrantで
wordmove pull -all
```
としたときにmysqlが見当たらないと怒られたので.bash_profileにmysqlのPATHを追加

WP-CLIのときのPATH設定で
[PATH設定](http://qiita.com/GotoKazu/items/9ff7335d1d25eac6adf5#6)

そのあとまたmysqldumpが見当たらないとおこられるので
[coreserverでwordmoveが動かない時の解決策](http://qiita.com/tanshio/items/4a306875f8b4c668e03a)
と同じように

```wordmove　base.rbへ移動
cd /usr/local/rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/wordmove-1.2.0/lib/wordmove/deployer/
```
```修正
sudo vi base.rb
```

###mysqldump を /usr/local/mysql/bin/mysqldump mysqlも同じく
```
def mysql_dump_command(options, save_to_path)
        arguments = [ "/usr/local/mysql/bin/mysqldump" ]
        arguments << "--host=#{options[:host]}" if options[:host].present?
        arguments << "--port=#{options[:port]}" if options[:port].present?
        arguments << "--user=#{options[:user]}" if options[:user].present?
        arguments << "--password=#{options[:password]}" if options[:password].present?
        arguments << "--default-character-set=#{options[:charset]}" if options[:charset].present?
        arguments << options[:name]
        Escape.shell_command(arguments) + " > #{save_to_path}"
      end

      def mysql_import_command(dump_path, options)
        arguments = [ "/usr/local/mysql/bin/mysql" ]
        arguments << "--host=#{options[:host]}" if options[:host].present?
        arguments << "--port=#{options[:port]}" if options[:port].present?
        arguments << "--user=#{options[:user]}" if options[:user].present?
        arguments << "--password=#{options[:password]}" if options[:password].present?
        arguments << "--database=#{options[:name]}"
        Escape.shell_command(arguments) + " < #{dump_path}"
      end
```
* サーバー直接なので ` vagrant provision ` のとき注意

本番と同じとこで使えるようにシンボリックリンク

```
which mysql mysqldump
```
でパスの確認
本番のPATHに合わせてディレクトリ作成

```ディレクトリ作成
mkdir -p /usr/local/mysql/bin
```

```そこまで移動
cd /usr/local/mysql/bin
```

調べたPATHでシンボリックリンク

```シンボリックリンク
ln -s /usr/bin/mysql mysql
ln -s /usr/bin/mysqldump mysqldump
```

これでできるはず・・・

* 以前の記事に別の文字コードが入っているとエラーが起きる
サッカーのピタゴラス勝率を求めてみた話 #golang #premierleague #BPL

先日のGoCon楽しかったですね！
僕は熾烈な争奪戦を勝ち抜いてTシャツいただけたので大満足です！

懇親会で行われたLTの中に野球におけるピタゴラス勝率をGoで求めてみるというものがありました。
http://www.slideshare.net/shinyorke/golang-49650050

以前のPyConでも似たような話をされていて、面白そうだったので僕もやってみました。
ついでにGoでグラフも描けるということなので、グラフにして出力するところまでやってみました。
グラフの書き方は
http://qiita.com/ikawaha/items/61dac34ebfe2f8fa5c61
この記事を参考にしました。

調べるうちにピタゴラス勝率と言うのは日々進化しているものらしく、係数などを色々いじるといい感じに現実の結果に近くなるようです。
https://ja.wikipedia.org/wiki/ピタゴラス勝率
また、サンプルデータとして2014/2015シーズンのプレミアリーグの結果を利用させていただきました。
http://www.football-data.co.uk/mmz4281/1415/E0.csv

コードはこちらです。
https://github.com/knsh14/go-football-analysis

これで全チームの第1節から第38節までのリアル勝率とピタゴラス勝率の比較がでますね。
サッカーでは引き分けが野球よりも多く存在するので、引き分けた場合1/3勝ったことにして計算すると、割りといい感じの値になったのでそれを採用しました。

適当にやったので、goらしく書けてない部分や、サッカーの場合の正しい計算方法などをご存じの方は教えて頂きたいです。
Run Hadoop on CentOS 7



# Install Hadoop
* Yarn
* Hadoop version 2.7
* Java 1.7
* centos 7

```
$ cat /etc/redhat-release
CentOS Linux release 7.1.1503 (Core)
```

## Stop firewalld

```
$ sudo systemctl stop firewalld
```

## Installl Java

```
$ yum install java-1.7.0-openjdk
```

## create hadoop user
```
$ useradd hadoop
```

## switch to hadoop user
```
$ su - hadoop
```

## generate SSH key

```
$ mkdir ~/.ssh
$ ssh-keygen -t rsa -b 4096 -C "example@foo.com"
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
```

## chmod ssh kye
```
$ chmod 0600 ~/.ssh/authorized_keys
```
## verify ssh login works and check no password is required
```
$ ssh localhost
$ exit
```

## download hadoop 2.7.0
```
$ cd
$ wget http://apache.claz.org/hadoop/common/hadoop-2.7.0/hadoop-2.7.0.tar.gz
$ tar zxvf hadoop-2.7.0.tar.gz
```

# Configure hadoop
Following command are execued by hadoop user
## Set envionmental variable
```
#.bashrc
export JAVA_HOME=/usr/lib/jvm/jre
export HADOOP_HOME=/home/hadoop/hadoop-2.7.0
export HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export HADOOP_YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATH
```

## Initiate environmental variable
```
$ source $HOME/.bashrc
```

## Put the property info between the 'configuration' tags for each file tgs for each file.

##  $HADOOP_HOME/etc/hadoop/core-site.xml
```
<property>
  <name>fs.default.name</name>
    <value>hdfs://localhost:9000</value>
</property>
```

## $HADOOP_HOME/etc/hadoop/hdfs-site.xml
```
<property>
 <name>dfs.replication</name>
 <value>1</value>
</property>
 
<property>
  <name>dfs.name.dir</name>
    <value>file:///home/hadoop/hadoopdata/hdfs/namenode</value>
</property>
 
<property>
  <name>dfs.data.dir</name>
    <value>file:///home/hadoop/hadoopdata/hdfs/datanode</value>
</property>

```
## copy template

```
$ cp $HADOOP_HOME/etc/hadoop/mapred-site.xml.template $HADOOP_HOME/etc/hadoop/mapred-site.xml

```

## $HADOOP_HOME/etc/hadoop/mapred-site.xml
```
<property>
  <name>mapreduce.framework.name</name>
   <value>yarn</value>
</property>
```

##  Edit $HADOOP_HOME/etc/hadoop/yarn-site.xml
```
<property>
  <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
</property>
```

## $HADOOP_HOME/etc/hadoop/hadoop-env.sh and add the following line
```
export JAVA_HOME=/usr/lib/jvm/jre
```

## Start Hadoop
```
$ hdfs namenode -format
```

```
$ start-dfs.sh
```

```
$ start-yarn.sh
```


# refs
https://malderhout.wordpress.com/2014/08/22/install-single-node-hadoop-on-centos-7-in-5-simple-steps/
うちんとこのサーバーにwp-cli設置する備忘録


#ログイン

```ログイン
ssh user_name@hogehoge.example.com -o PreferredAuthentications=password
```

#1 ホームディレクトリに移動
```ホームディレクトリに移動
cd ~/
```

#2 プログラム格納用ディレクトリ作成
```プログラム格納用ディレクトリ作成
mkdir bin
```

#3 wp-cliをダウンロード
```移動してwp-cliをダウンロード
cd bin/
curl -Ok https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
```

#4 実行権限追加
```実行権限追加
chmod +x wp-cli.phar
/usr/local/bin/php wp-cli.phar --info
```
* PATHに合わせて適宜修正

#5 シンボリックリンク作成
```シンボリックリンク作成
ln -s wp-cli.phar wp
```

#6 PATH設定
```PATH設定
vi ~/.bash_profile
```
↓

```追加前
PATH=$PATH:$HOME/bin
```

↓

```追加
PATH=$PATH:$HOME/bin:/usr/local/bin:/usr/local/mysql/bin
```
* これもサーバーのPATHに合わせて適宜修正

```実行する
source ~/.bash_profile
```
続・Scala.jsをnodeプロジェクトで扱う

前回の[Scala.jsをnodeプロジェクトで扱う](http://qiita.com/kinzal/items/985a9cb5adb47da0f32c)の続きです。

前回はsbtベースでScala.jsを実行していましたが、今回はスタンドアローン版を使ってnodeプロジェクトで扱います。

# モチベーション

* sbtベースの場合だと出力先のパスが固定なのが微妙（指定する方法があれば教えてください）
* というかsbtがツラいからあまり関わりたくない

という感じにちょっとネガティブな感じのモチベーションで進めています。

# スタンドアローン版のScala.jsのインストール

* [scalajs-standalone-bin](https://github.com/k-kinzal/scalajs-standalone-bin)

bin-wrapperでScala.jsをラップしたものを作ったので、このscalajs-standalone-binと[scala-bin](https://github.com/k-kinzal/scala-bin)をインストールします。

```sh
$ npm install --save scala-bin scalajs-standalone-bin
```

`brew`などで`scala`などをインストールしていれば`scala-bin`をインストールする必要はありませんが、`npm`で`Scala`のバージョンを含めて管理すると考えると`scala-bin`をインストールしておくとCI環境などにそのまま出せるので楽で良いです。（ただしプロジェクト毎にScalaをダウンロードするので容量は持ってかれます）

# .scalaのコンパイル

コンパイルするために`package.json`の`scripts`にスタンドアローン版でのコンパイルコマンドを記述します。

```json:package.json
"scripts": {
  "compile": "scalajsc src/main/scala/hoge.scala -d hoge && scalajsld -o hoge.js hoge"
}
```

注意点として`scalajsc`で中間ファイルを生成するときに指定するディレクトリは事前に生成しておく必要があります。`compile`に`mkdir -p hoge`のようにディレクトリ作成コマンドを仕込めば良いのですが、いまいちイケてないので何か良いオプションが欲しいです。

```sh
$ npm run compile
```

コマンドを実行すると成果物として`hoge.js`が出来ていると思います。あとはこれをbabelの乗せるなり、browserifyに乗せるなり、gulpに乗せるなり好きにしてください。（Scala.js v0.6.3から[ES6モード](http://www.scala-js.org/news/2015/05/12/announcing-scalajs-0.6.3/)がサポートされているので、この手のツールに乗せるという選択肢はありになってきたかなという印象です）

# おわりに

前回の[挫折した話](http://qiita.com/kinzal/items/985a9cb5adb47da0f32c#%E6%8C%AB%E6%8A%98%E3%81%97%E3%81%9F%E8%A9%B1)を解消するのにこの構成が欲しくなったので作った閑話休題的な話でした。

とはいえ、この構成を取れるようになったので、sbtベースのnodeプロジェクト、スタンドアローンベースのnodeプロジェクトという選択肢を取れるようになりました。JS <=> Scalaのように世界がまたぐ構成を作るのはまだ無理ですが、ScalaJSのみで完結するところでなら、このどちらかの構成で戦うキッカケになれるかなと思います。

挫折した話を解消する方法は大分見えてきたので、それ用のツールを作ったらまた続きの話でも書きます。
だいたい15分でCaboChaマシン（2015年6月版）

CaboChaつかってみたいけど、開発環境いじりたくないねん、、、
そんな時は仮想環境です、debパッケージのお手軽作成方法もあるよ。

# 用意するもの
* Oracle VM VirtualBox 上によしなにインストールされたLubuntu15.04

# Let's go
実行するユーザーの状態に応じて、sudoなりを付加してください。

まずはupdate、必要なパッケージをもろもろインストール。

```
# at first, update and upgrade
apt-get update && sudo apt-get upgrade

# compiler
apt-get install build-essential

# for make .deb package
apt-get install devscripts dh-make autotools-dev

# font install
apt-get install fonts-migmix
```
解析したいデータの置き場を確保。
シェアするディレクトリ名はrisにしました。

```
mkdir /ris
# to /etc/rc.local
mount -t vboxsf share /mountpoint
```
MeCabuのインストール。
パッケージを利用します。

```
# setup mecab
apt-get install mecab mecab-ipadic-utf8
apt-get install libmecab-dev
```
CaboChaに必要なCRF++をインストール。
ちょっと手間ですが、パッケージ化します。

```
# install CRF++
cd CRF++_source_dir
dh_make -n -s -e thi@lulu
fakeroot debian/rules clean
cd ../
# install package
dpkg -i crf++
```
CaboChaのインストール。
これもパッケージ化します。
コンパイルオプションを変えて再インストールしたい時などがあるので、パッケージインストールをおすすめ。

```
# install CaboCha
cd CaboCha_source_dir
dh_make -n -s -e thi@lulu
```
コンパイルオプションを設定。

```rules
# add to debian/rules
override_dh_auto_configure:
        dh_auto_configure -- \
        --with-charset=utf8 --enable-utf8-only
```
```
debuild -uc -us -b
fakeroot debian/rules clean
cd ../
# install package
dpkg -i
```

以上。
Python3でPythonバインディングなどを利用したい場合のセットアップ方法などは、たくさん情報があるので検索してみてください。

// よき係り受け解析を!
長体で表示する

フォントはたいがい75%のラインをベースラインにしてそうだけれど、いまMac Chromeで確認したら`transform-origin`が70%のほうが居心地がよかったのでそうしました。

例は130%の長体の場合。

```css
.cho-130{
	display:inline-block;
	transform:scaleY(1.3);
	transform-origin:center 70%;
}
```
javascriptからDOCTYPEを取得する

もしかしたらDOCTYPEを見てJavaScriptの挙動を変えたい時があるかもしれないのでメモ。

次の3つから情報が得られる。`.internalSubset`ってのもあるらしいけれど、`null`しか確認できてないので無視。

+ `document.doctype.name`
+ `document.doctype.publicId`
+ `document.doctype.systemID`

このうち、`.name`は`html`なので、それ以外を見る。

# `<!DOCTYPE html>`

+ `"html"`
+ `""`
+ `""`

# `<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">`

+ `"html"`
+ `"-//W3C//DTD HTML 4.01 Transitional//EN"`
+ `"http://www.w3.org/TR/html4/loose.dtd"`
zshでバックグラウンドジョブを起動すると優先度が低くなる

最後に`&`を付けるとバックグラウンドジョブになることは皆さん知っているとは思いますが、実はbashとzshで微妙に動きが異なります。

zshでバックグラウンドジョブを動かした場合ioniceは標準の0より大きな5として実行されます。大きい方が優先度が低いので標準よりも低い優先度で実行されてしまいます。bashには特に優先度を変更しないのでこの挙動はbashとは異なります。

このzshの挙動が気に入らない場合は`.zshrc`に以下の設定を追加します。

```.zshrc
unsetopt bg_nice
```

これでbashと同じ挙動になります。

参考：

  * [docs/Shell/Zsh/customize - kyogoku42's](http://www.kyogoku.biz/docs/Shell/Zsh/customize)
関数の実行時間(Python)


# その1
```shell
python -m cProfile -s cumulative main.py
```

これで関数ごとの実行速度がわかるっぽい。
すごい。

[IPythonでコードの実行時間を測る話](http://ism1000ch.hatenablog.com/entry/2014/03/10/232932)


# その2
iPython では、このように%timeコマンドでコードの実行時間を測ることができます。へぇ。

```python
In [2]: %time l = range(10000)
CPU times: user 4 µs, sys: 1e+03 ns, total: 5 µs
Wall time: 7.87 µs
```

そこでIPythonでは，自動で%timeを適切な回数実行し，その平均値を実行時間の目安として返してくれる%timeitというコマンドも用意されています．

# その3
%prunと%run -p
とかも知らんかった。

ここ参照。
[IPythonでコードの実行時間を測る話](http://ism1000ch.hatenablog.com/entry/2014/03/10/232932)


おわり。
PHP で JUMAN を叩く

形態素解析に用いられるJUMANですが、扱える言語がPerlやPythonです。Rubyで扱っている記事も見つけますが、PHPで書かれたものはなかったので、メモしておきます。
（2015/9/4：　@mpywさんからを受けたので追記をしました）

# proc_open を使った方法

```php
<?php
function juman($text) {
  $descriptorspec = array(
     0 => array("pipe", "r"),  // stdin は、子プロセスが読み込むパイプです。
     1 => array("pipe", "w"),  // stdout は、子プロセスが書き込むパイプです。
  );

  $process = proc_open('juman', $descriptorspec, $pipes);

  if (is_resource($process)) {
      // $pipes はこの時点で次のような形を取っています。
      // 0 => 子プロセスの stdin に繋がれた書き込み可能なハンドル
      // 1 => 子プロセスの stdout に繋がれた読み込み可能なハンドル
      // すべてのエラー出力は /tmp/error-output.txt に書き込みされます。

      fwrite($pipes[0], $text);
      fclose($pipes[0]);

      $return_value = stream_get_contents($pipes[1]);
      fclose($pipes[1]);

      // デッドロックを避けるため、proc_close を呼ぶ前に
      // すべてのパイプを閉じることが重要です。
      proc_close($process);

      return $return_value;
  }
}
?>
```

# shell_execを使った方法（こちらの方が簡単）
```php
function juman($text) {
  // jumanのコマンドを実行
  $output = shell_exec(sprintf('echo %s | /usr/local/bin/juman', escapeshellarg($text)));

  return $output;
}
```

# 使い方
$textにjumanにかけたい文字列を渡すと、それを返してくれます。この関数を使用すると返ってくるのは文字列形式になります。よって、受け取り側で

```php
<?php
// テキストをjumanにかけて結果を取得する
// splitした後の配列に {"EOS", ""} が含まれるので削除する
$text = 'こんにちは。私の名前はSOJOです。';
$juman_result = juman($text);
$juman_result = split("\n", $juman_result);
array_pop($juman_result);
array_pop($juman_result);

var_dump($juman_result);
?>
```

出力結果


```
array(9) {
  [0]=>
  string(119) "こんにちは こんにちは こんにちは 感動詞 12 * 0 * 0 * 0 "代表表記:こんにちは/こんにちは""
  [1]=>
  string(41) "。 。 。 特殊 1 句点 1 * 0 * 0 NIL"
  [2]=>
  string(112) "私 わたし 私 名詞 6 普通名詞 1 * 0 * 0 "代表表記:私/わたし 漢字読み:訓 カテゴリ:人""
  [3]=>
  string(47) "の の の 助詞 9 接続助詞 3 * 0 * 0 NIL"
  [4]=>
  string(110) "名前 なまえ 名前 名詞 6 普通名詞 1 * 0 * 0 "代表表記:名前/なまえ カテゴリ:抽象物""
  [5]=>
  string(44) "は は は 助詞 9 副助詞 2 * 0 * 0 NIL"
  [6]=>
  string(54) "SOJO SOJO SOJO 未定義語 15 その他 1 * 0 * 0 NIL"
  [7]=>
  string(72) "です です だ 判定詞 4 * 0 判定詞 25 デス列基本形 27 NIL"
  [8]=>
  string(41) "。 。 。 特殊 1 句点 1 * 0 * 0 NIL"
}

```

とする必要があります。関数側に配列に変換する処理を入れても良いかも知れまん。返ってくるデータはあくまでも文字列なので、単語の各要素を取り出すためには、更にsplitなどを使って文字列を切り分ける必要があります。

関数側の処理はproc_openが具体的に何をしているのか把握できていないので、分かり次第、追記していきたいと思います。

***
参考文献
http://php.net/manual/ja/function.proc-open.php
http://qiita.com/eme-fes456/items/7d5d481a167743f00c5e
git archiveでgzip以外の圧縮フォーマットを使用する


# git archiveコマンドについて
git archiveコマンドは指定したコミットのツリーをアーカイブファイルとして生成するコマンドです。ソースコードをリリースしたい時などに便利です。

例えば

    $ git archive HEAD --format=tar.gz > hoge.tar.gz

とすれば、現在のブランチの最終コミットのツリーをhoge.tar.gzにしてくれます。

また、出力ファイル名指定する``-o``オプションを指定してやれば、拡張子から判断してtar.gzフォーマットにしてくれます。

    $ git archive HEAD -o hoge.tar.gz

# デフォルトではtar、tar.gz、zipにしか対応していない

git archiveコマンドは標準では圧縮フォーマットとして、tar、tar.gz、zipにしか対応していません。

```console
$ git archive HEAD --format=tar.bz2 > hoge.tar.bz2
※ hoge.tar.bz2はただのtarファイルになる
```

としてみても、非対応のフォーマットが指定されたため、デフォルトの圧縮フォーマットのtarで固めただけのアーカイブになってしまいます。


# tar.bz2 や tar.xz でアーカイブを作る

それでは``tar.bz2``や``tar.xz``の圧縮フォーマットでtarballを作りたい場合はどうするかというと、gzipされていないただのtarフォーマットで生成し、それぞれの圧縮コマンドにパイプで渡してやればとりあえず目的は達成できます。

    $ git archive HEAD --format=tar | bzip2 > hoge.tar.bz2
    $ git archive HEAD --format=tar | xz > hoge.tar.xz

# --formatオプションにtar.bz2やtar.xzを対応させる

上述のやりかたで``tar.bz2``や``tar.xz``を生成できますが、若干面倒くさいです。``--format``オプションでこれらのフォーマットを直接指定できるようになれば便利です。

これはgitの設定で可能です。設定項目は、``tar.[拡張子].command``で、これに圧縮プログラムを指定することで拡張子が``--format``オプションに対応します。

例えば以下のようにしてグローバルの設定ファイル``~/.gitconfig``に設定を追加してやると、

    $ git config --global tar.tar.bz2.command bzip2
 
``--format``オプションで``tar.bz2``が指定可能になります。出力ファイル名指定の拡張子にも対応します。

    $ git archive HEAD --format=tar.bz2 > hoge.tar.bz2
    $ git archive HEAD -o hoge.tar.bz2
PHPでダイクストラ法

#PHPでダイクストラ法

##ダイクストラ法とは
グラフ上の2頂点間の最短経路を効率的に求めるアルゴリズム
スタート地点から近いノードから順番に最短経路を求め、最終結果を出す

##問題
プログラミングの宝箱 アルゴリズムとデータ構造 第2版のダイクストラ法の問題
各経路の最短時間を求めよ
各駅の所要時間は隣接行列の$adjacencyMatrixを参照する事。
横浜→横浜
横浜→武蔵小杉
横浜→品川
横浜→渋谷
横浜→新橋
横浜→溜池山王

##コード
```php
define('STATION_NUMBER',6);
define('START_STATION', 0);

$stations    = array('横浜', '武蔵小杉', '品川', '渋谷', '新橋', '溜池山王');

//隣接行列
//各所要時間を保持する
$adjacencyMatrix = array(
    //横浜', '武蔵小杉', '品川', '渋谷', '新橋', '溜池山王'
    array(0, 12, 28, 0, 0, 0),  //横浜基準
    array(12, 0, 10, 13, 0, 0), //武蔵小杉基準
    array(28, 10, 0, 11, 7, 0), //品川基準
    array(0, 13, 11, 0, 0, 9),  //渋谷基準
    array(0, 0, 7, 0, 0, 4),    //新橋基準
    array(0, 0, 0, 9, 4, 0)     //溜池山王
);

for ($i=0; $i < STATION_NUMBER; $i++) {
    $currentCost[$i] = -1; //-1は無限大とする
    $fix[$i]         = false;
}

//スタート地点を0とする
$currentCost[START_STATION] = 0;

while (true) {
    //所要時間を無限大に初期設定する
    $minStation = -1;
    $minTime    = -1;
    for ($i = 0; $i < STATION_NUMBER; $i++) {
        if (!$fix[$i] && ($currentCost[$i] != -1)) {
            if ($minTime == -1 || $minTime > $currentCost[$i]) {
                //パターン洗い出しが終わってなく、所要時間の短い駅を調べる
                $minTime    = $currentCost[$i];
                $minStation = $i;
            }
        }
    }
    if ($minTime == -1) {
        //全ての駅が確定したか、最初の所要時間が無限大のとき
        break;
    }

    // 自分の駅から伸びているすべての駅の所要時間を調べる
    for ($i = 0; $i < STATION_NUMBER; $i++) {
        if (!$fix[$i] && $adjacencyMatrix[$minStation][$i] > 0) {
            // 自分の駅経由で移動する場合の必要時間
            $newTime = $minTime + $adjacencyMatrix[$minStation][$i]; 
            if ($currentCost[$i] == -1 || $currentCost[$i] > $newTime) {
                // 今登録されている時間よりも、この駅経由で移動した時間が速いので、新しい時間を登録する
                $currentCost[$i] = $newTime;
            }
        }
    }
    // 自分の駅を確定する
    $fix[$minStation] = true;
}
for ($i = 0; $i < STATION_NUMBER; $i++) {
    echo ($stations[START_STATION] . "→" . $stations[$i] . "：" . $currentCost[$i] . "分");
    echo '<br>';
}
```

##参考書籍
プログラミングの宝箱 アルゴリズムとデータ構造 第2版

##参考サイト
http://www.sousakuba.com/Programming/algo_root.html
http://tech.nitoyon.com/ja/blog/2010/01/26/dijkstra-aster-visualize/
SuperCSVでBeanのリストを和名ヘッダーをつけてCSV出力

javaのCSVライブラリのひとつ、Super CSVの使い方の紹介
http://super-csv.github.io/super-csv/index.html


## Beanのリストを、表示用の名称のヘッダーをつけてCSV出力

例えば、次のようなBeanのリストを、コメントにある表示名のヘッダーで出力したいとします。

```
 class User {
           /**
            * ユーザID
            */   
           private String id;
   
           /**
            * ユーザ名
            */ 
           private String name;

           /**
            * 削除フラグ
            */
           private boolean deleted;

           /* 中略 */ 
        }
```

表示用のヘッダーと、プロパティ名をそれぞれ配列として用意して、下記のようにすればよいです。
ポイントはwriteHeaderとwriteでヘッダーを使い分けるところです。

```
       
        //表示用のヘッダー
        String[] viewHeader = new {"ユーザID","ユーザ名","削除フラグ"}

        //プロパティ名の配列をヘッダーと同じ順番で作成
        String[] header = new {"id","name", "deleted"}   

        //Bean
        List<User> allUsers = User.find.all();

        ICsvBeanWriter beanWriter = null;
        FileOutputStream fos = null;
        OutputStreamWriter osw = null;
        try {
            //文字コードを指定
            fos = new FileOutputStream(csvFile);
            osw = new OutputStreamWriter(fos, "Shift_JIS");
　　　　　　　
　　　　　　 //エクセルでも開ける形式のライター
            beanWriter = new CsvBeanWriter(osw, CsvPreference.EXCEL_PREFERENCE);

            //ヘッダーを書き込み
            beanWriter.writeHeader(viewHeader);

            for(Object bean: beans) {
                //Beanの内容を書き込み
                beanWriter.write(bean, header);
            }
        } catch(IOException e) {
            Logger.error("writing beans failed.", e);
        } finally {
            if (beanWriter != null) {
                beanWriter.close();
            }
            if (osw != null) {
                osw.close();
            }
            if (fos != null) {
                fos.close();
            }
        }

```

文字コードも指定しているので、長くなっていますが、CSVの大体のことを決められます。

実践では、プロパティ名と表示名の対応関係は設定ファイルに持たせて、そこからviewHeaderを作る、などという形をとりました。

Super CSVにCellProcessorというものがあり、それで出力形式を色々コントロールできます。
例えば日付はyyyy/MM/ddにしたり、booleanを0 or 1にしたりなどができます。
http://super-csv.github.io/super-csv/cell_processors.html
CocoaPodsライブラリを更新するときに気をつけること

CocoaPodsライブラリを更新するときにいくつか気をつけないといけないことがあるようです。
これで正しいのかも十分なのかもわかってないんですが、シェアしておきます。
そうじゃねーよ!とかこれも忘れてるゾというのがあったらツッコミお願いします。

#`Example`の`Podfile.lock`を更新する
`Example`ディレクトリで`pod update`して、`Podfile.lock`を最新の状態に保ちます。
`Example`に`Podfile.lock`があると、CocoaPodsは`Podfile.lock`に記載されているバージョンを取りに行こうとします。
しかし更新を忘れていると、`../`ディレクトリにあるライブラリのバージョンが`Podfile.lock`のバージョンと食い違い、`pod try`したときにエラーが発生します。

#`.podspec`のバージョン番号を増やす
当たり前ですが、`.podspec`ファイルの`s.version`を新しいバージョンに更新します。
このときのバージョン番号はコミットするときの`tag`と揃えます。

#`pod trunk push`する
上記2つを更新してコミット・プッシュしたら、`pod trunk push`してライブラリをCocoaPodsのマスターリポジトリを更新します。
`pod trunk push`するのは最初だけで、あとはプッシュすれば勝手にマスターリポジトリに反映されるのかなと思ったらそんなことはなかった。
なおベータ版などの場合は`pod trunk push`はしない方がよさそうです。

----

これで新しいバージョンが利用できるようになるはず・・・。
Chefのレシピをvagrant上のVMに適用するでちょっとハマる


```Ruby:chef_solo.rb
Vagrant.configure(2) do |config|

config.vm.provision :chef_solo do |chef|
  chef.cookbooks_path = ["./cookbooks"]

  chef.add_recipe 'git'
end
```

本では上記の内容しか書いてないのですが、続きとして、
最後のchef.json は・・・という書き方がしてあって良くわからなかったのですが、ここの箇所は下記、
http://gihyo.jp/book/2014/978-4-7741-6516-5/support
に全体のファイルがあります。

当たり前のことなのかも知れませんが、自分と同じく不思議に思った人がいるかと思い書いておきます。
Slackの日本語フォントが明朝体になった時の直し方

## 概要
自分以外でこんな現象になった人がいるのかどうかは不明だが一応の覚書。Slackを使い始めた最初の頃、ふと日本語フォントの表示が明朝体になっていることに気付いた。Slack自体にはフォント設定をする項目がないのでおかしいなと思ったら自分のブラウザのフォント設定が問題だった。なお、環境はOSX 10.10 YosemiteでGoogle Chrome 43である。

## 明朝体だった時のフォント設定
いつも自分はブラウザのフォント設定で以下の通りにしていた。というか、デフォルトから変えていなかった。
![before](https://qiita-image-store.s3.amazonaws.com/0/6595/37d4f955-34cd-c200-16c7-dd6a3ab7f1c7.png)

Standard font、Serif font、Sans-serif fontそれぞれのフォントを1つずつ変更していくと明朝体になったりゴシック体になったりする。色々試した結果分かったことは、Serif fontを**日本語ゴシック体**にすれば確実にSlackで日本語はゴシック体で表示されるということだ。

## ゴシック体で表示できるフォント設定の一例
単純な話だが、全てのプロポーショナルフォントをヒラギノ角ゴ ProNにすればよい。
![after](https://qiita-image-store.s3.amazonaws.com/0/6595/f6b4b74b-f4b3-696b-fbe3-b7f1390cb65a.png)

これに気付くまで割と悩んだ。あと、他のブラウザでどうなのか、Windowsでどうなのか、は試してないので暇な人は試してみてほしい。
PHP7.0.0α2で例外の扱いが変わった


PHP7.0.0α1ではパースエラーをParseExceptionで受け取れます。
http://qiita.com/hnw/items/4e2d47d269a26025a726
http://qiita.com/rana_kualu/items/447995347acb2f8997a3
が、PHP7.0.0α2に上げたら何故かできなくなってしまいました。
調べてみたら構造が変わってました。

```text
Throwable ( interface )
	Exception
		LogicException
			InvalidArgumentExceptionとか
		RuntimeException
			OutOfBoundsExceptionとか
		ErrorException
		ReflectionExceptionとか
	Error
		ParseError
		TypeError
		AssertionError
```

各ExceptionとErrorはインターフェイス[Throwable](https://wiki.php.net/rfc/throwable-interface)をimplementsするようになっていました。
BaseExceptionとEngineExceptionは早くも消滅。
結果としてExceptionとErrorは基本別物となりました。
ところでErrorExceptionとはいったい。

```php
	// ParseError
	try{
		require_once('fail.php');
	}catch(ParseError $e){
		var_dump($e->getMessage()); // syntax error, unexpected end of file
	}

	// TypeError
	try{
		new PDO();
	}catch(TypeError $e){
		var_dump($e->getMessage()); // PDO::__construct() expects at least 1 parameter, 0 given
	}
	
	// AssertionError
	try{
		assert_options(ASSERT_EXCEPTION, 1); // 例外を吐くようにする。デフォルトはE_WARNING
		assert(false);
	}catch(AssertionError $e){
		var_dump($e->getMessage()); // assert(false)
	}
	
	// 使い分け
	try{
		assert(false);
	}catch(Exception $e){
		// Exceptionではキャッチできない
	}catch(Error $e){
		// ここに来る
	}
```
もしかして nyagos ?

# nyagosで誤ったコマンドの訂正をしてみる

zshではあるらしいコマンドの訂正機能ですが、
nyagosにはコマンドが見つからなかった時に実行されるフックがあるので、
これで実装できるんじゃないかなぁと思ってやってみました。

## 訂正候補を作る
僕自身あんまり賢い子じゃないので、作られる候補リストもあんまり賢くありません。
だいたいコマンドをミスる時って、
右手と左手のレーシングとか、人差し指と中指のレーシングとか
だと思ったので、隣り合った1文字が入れ替わるケースを訂正するようにしました。
たとえば、`naygos`とtypoした場合の訂正候補は以下になります。

* anygos
* nyagos
* nagyos
* nayogs
* naygso

で、この候補リストを`which`で探して見つかったらユーザーに確認を求めることにしました。
(たとえ候補が1つしかなくても、いきなり実行しちゃったら怖いことが起こりそうだったので…)

## 完成したものがこちらになります

![snapshot-15-06-26-232751.png](https://qiita-image-store.s3.amazonaws.com/0/52493/8f5a4fc0-ad4b-15bf-38aa-a8f7cb5c3cfe.png)

##　ソースコード

```lua:.nyagos
---------------------------------
-- コマンドが見つからなかった時実行されるフック
nyagos.on_command_not_found = function(args)
    local cand = {}
    for i, e in pairs(makeCandidates(args[0])) do
        if (nyagos.which(e)) then
            table.insert(cand, e)
        end
    end
    if (#cand > 0) then
        print('もしかして...')
        for i, e in pairs(cand) do
            print('\027[32;;1m' .. i .. '\027[;;0m : ' .. e)
        end
        local index = getIndex()
        if #cand < index then
            print(index .. ': Invalid index')
        elseif 0 < index then
            print(cand[index] .. ' ' .. table.concat(args, ' '))
            nyagos.exec(cand[index] .. ' ' .. table.concat(args, ' '))
        end
        return true
    end
    return false
end
---------------------------------
-- 候補リストを作る
function makeCandidates(src)
    local result = {}

    local tbl = {}
    for p, c in utf8.codes(src) do
        table.insert(tbl, utf8.char(c))
    end
    for i = 1, string.len(src) - 1 do
        local tmp = table.pack(table.unpack(tbl))
        table.insert(tmp, i+2, tmp[i])
        table.remove(tmp, i)
        table.insert(result, table.concat(tmp))
    end
    return result
end
---------------------------------
-- 末尾から改行を取り除く
function chomp(src)
    return string.gsub(src, "[\r\n]+$", "")
end
---------------------------------
-- キーボード入力から数字を取得
GETINDEX_NO_INPUT = -1
GETINDEX_ABORT    = -2
function getIndex()
    io.write('> ')
    local index = GETINDEX_NO_INPUT -- 戻り値
    local charcnt = 0
    local stridx = io.read()

    if stridx ~= nil and (stridx ~= '') then
        index = tonumber(chomp(stridx):match('^%d+$')) or GETINDEX_NO_INPUT
    end
    return index
end
```

## 既知の問題

1. ヒストリに残るのは間違ったコマンド。訂正後のコマンドではない
2. zshのはもっともっと賢いらしい(キーボード上で隣あったアルファベットも候補かな?)

2.については`makeCandidates()`を改善すれば、いい感じになるかもね！
JavaScriptでPATH_INFOを使う

# foo/bar/bazしたい
`foo.html`というドキュメントに何らかのパラメーターを与えたい場合、`foo.html?foo=bar`としたり、`foo.html#foo=bar`としたりすることが多いが、サーバーの設定をいじるだけで（場合によりいじらなくても）`foo.html/foo/bar`のようなアドレスでアクセスできるようになる。ユーザーから見るとディレクトリ構造が明確になってよいし、クローラーも単一のドキュメントとして扱ってくれそうだから嬉しい。

## サーバーの設定
Apache 2.xではデフォルトでPATH_INFOを有効化していないみたいなので、.htaccessで`AcceptPathInfo on`にしとけばOK。あと.htmlがじゃまくさいときには`Options +MultiViews`にしておく必要があるけれど、今回の本題とはちょっと違う。

```txt:.htaccess
<Files "foo.html">
	AcceptPathInfo on
</Files>
```

## 文書側の設定
今回使ったコードはこちら。

```html:foo.hmtl
<!DOCTYPE html>
<html>
<head>
	<base href="/foo/">
	<script src="jquery.min.js"></script>
	<script>
	$(function(){
		var path_info = document.documentURI.substr(document.baseURI.length);
		path_info.match(/^[^\/]+(.*)$/);
		path_info = RegExp.$1;

		var path_name = RegExp.$1;
		$('<div>')
			.appendTo($('body'))
			.text(path_name);
	});
	</script>
</head>
<body>
	<img src="dog-1.jpg" width="100">
</body>
</html>
```

`<base href>`で指定したものは`document.baseURI`で取得できるので、`document.documentURI`に入っているそれ以降の文字列で、現在の文書名（foo）より後のものは`PATH_INFO`になる。

残念ながら、素のJavaScriptでPerl/CGIでいう`$ENV{SCRIPT_NAME}`は取得できないようなので、手動で`<base href>`するしかない模様。ただし、これが自動で取得できようがどうであろうが、最初に`jquery.min.js`などを読むときにもbaseURIが必要になってしまうので、だいぶ面倒そう。

## まとめ
1. `foo.html/bar/baz`もしくは`foo/bar/baz`型のアドレスは作れる
+ Apache 2.xの場合はサーバーの設定、もしくは`.htaccess`の設定が必要
+ baseURIは手動入力
play.libs.Akka#systemとActorSystem#createの違い

単体で実行できるようにと、mainメソッド内でplayアプリを起動し、いくつかの処理をActorSystem#schedulerOnceで登録して並行実行させたときの失敗談。

通常のplayアプリとはスレッドを別管理したいと思い、ActorSystem#createによるインスタンスを使って実装したら、スケジューリングした処理が終了してなくてもplayアプリを停止できてしまい、させようと思った処理が中断されてしまった･･･

```

public static  void main(String args[]) {

   //アプリ起動
   new play.core.StaticApplication(new java.io.File("."));

   // 処理をスケジューリング
   ActorSystem system = ActorSystem.create("some-batch");
   system.schedulerOnce(... 

   // アプリ停止
   play.api.Play.stop()

}

```

####　解決策

play.libs.Akka.system　を使う。

playの公式サイトの実装例もこれを使っていたし、playアプリのライフサイクルと連動している模様。これならスケジューリングした処理が終了するまでは、playアプリは停止されない。