OmniAICreator/Qiita-1.07M huggingface dataset:
PC/SPでURLを分ける際の注意事項


PCサイトでスマホOSで来た場合にリダイレクトさせたい場合は


```pc_script.js
if(/iphone|ipad|ipod|android/.test(navigator.userAgent.toLowerCase())){
	location.replace("/sp/");
}
```


という感じで書いていると、URLの?以降やハッシュタグがついていた場合消えてしまう。



```pc_script.js
if(/iphone|ipad|ipod|android/.test(navigator.userAgent.toLowerCase())){
	location.replace("/sp/" + window.location.search + window.location.hash);
}
```


として、パラメータが消えないようにしましょう。

これをちゃんとやらないとGoogle Analyticsでちゃんとデータが取れなかったりするのでダメです。
また、同じ理由でGoogle Analyticsのscriptが読まれる前に上記リダイレクトのscriptを記載しましょう。

南無南無🙏
VisualStudioCodeのThemeの変更方法

#VisualStudioCodeのカラーテーマを変更
古いバージョンでは、ツールバーのView＞Themeでカラーを選択することができたが、*Version 0.10.6*では、そのThemeがなくなっていた。

場所が移動してました！！
File＞Preference＞Color Themeでテーマを選択すれば、いままでのバージョンどおり変更が可能です。


参考
https://code.visualstudio.com/Docs/customization/themes
rubyで配列の中にハッシュを初期化したい

## 概要

５つの配列の要素に対してハッシュで初期化したい。

```
ary = [{},{},{},{},{}]
```

これを作りたい。

## 正しい例

irbで実験。

```
ary = Array.new(5){{}}
=> ary = [{},{},{},{},{}]
ary[0][:hoge] = "test"
=> "test"
ary
=> [{:hoge=>"test"}, {}, {}, {}, {}]
```

###### 上記はコメント頂いて修正したコードです。(2016/01/21）

```
# 記事初稿時のコード
ary = Array.new(5).map{Hash.new}
```

## 誤った例

irbで実験。

```
ary = Array.new(5, Hash.new)
=> ary = [{},{},{},{},{}]
ary[0][:hoge] = "test"
=> "test"
ary
=> [{:hoge=>"test"}, {:hoge=>"test"}, {:hoge=>"test"}, {:hoge=>"test"}, {:hoge=>"test"}]
```

同一を参照してしまうため、
意図しない挙動になってしまう。
SVNでの開発フロー(コマンドベース)

#SVNでの開発フロー
##概要
SVNでソースを管理しているサイトの開発フローを共有します。
開発担当者は複数名、gitへの乗り換えは諸事情によりできない。

##開発フロー
**local→ステージング→本番**
の順に反映を行っていきます。

1. localを最新に更新
`svn up`
変更のあったファイルの一覧が表示され。
`At revision XXXX.`と結果が帰ってきます。
XXXXが最新のリビジョンになります。
最新でどんな更新があった確認したい場合は、
`svn log --limit 10`
等で確認できます。

2. localの変更
`vim XXXX`
vimerなので・・・。
後々のことを考え、不要なファイルの変更を行わないように、
どのファイルにどんな変更をしたかは覚えておくと良い。

3. localの変更の確認
`svn status`
もし不要な変更を行ってしまったファイルが有った場合は、
`svn revert ファイル名` (gitでいうcheckout)
を使用して元に戻します。

4. localのコミット準備
`svn add ファイル名`
コミットに反映させるファイルのみ指定する。
間違えて追加してしまった場合は、
`svn revert ファイル名`
で取り消すことが出来る

5. localのコミット
`svn commit ファイル名 -m "コミットコメント"`
心配な場合は、
`svn log --limit 10`
等でリビジョンが増えていることを確認してください。

6. ステージングに移動
`ssh XXXX`
`cd /var/www/vhosts/XXXX/`
ここは各サーバーの構成によります。

7. ステージングを更新
`svn up ファイル名`

8. 実際にステージングサイトにアクセスして確認

9. 先方に確認
ステージングサイトを先方に見せ、本反映の許可をもらう。
場合により他のメンバーのダブルチェックをもらう。

10. 本番に移動
`ssh XXXX`
`cd /var/www/vhosts/XXXX/`
ここは各サーバーの構成によります。

11. アップ待ちのファイルの確認 
`svn status -u`
いわゆる「期日が来たら本番に反映」という機能やページがないか確認をおこなう
`svn info ファイル名`で今のリビジョンとsvn上にある最新のリビジョンの差を確認する。
差がある場合は、今のリビジョンとsvn上にある最新のリビジョンの差の間に別の人のコミットが入っていないか確認をする必要がある。
コレはredmine等のツールを使用すると便利。
別の人のコミットが入っている場合は、アップして問題ないかそのコミットを行った人に確認をとる。

12. 本番を更新
`svn up ファイル名`

13. 実際に本番にアクセスして確認

14. 先方に確認を取り、終了

##備考
###svnで git stash
####git stash 相当
`$ svn diff > stash.patch
$ svn revert -R .`
####git stash pop 相当
`$ patch -p0 < stash.patch`
http://qiita.com/snaka/items/673c33e1210505a8851e

###ファイルを操作するユーザーが限られている場合
コマンドの頭に
`sudo -u XXX`
で実行するユーザを指定する。
例：apache権限で`svn status`の実行
`sudo -u apache svn status`
###svn上にある不要なファイルを削除したい場合
`svn rm ファイル名`
を使用する。
debian8.2(jessie)でdockerデータ格納場所を変更

## 設定

```bash:準備
sudo systemctl stop docker
mkdir -p /var/lib/vz/docker
```

```diff:/lib/systemd/system/docker.service
- ExecStart=/usr/bin/docker daemon -H fd://
+ ExecStart=/usr/bin/docker daemon -H fd:// -g /var/lib/vz/docker
```

```bash:変更を確認
sudo systemctl daemon-reload
```

```bash:起動
sudo systemctl start docker
```
bash: プロセス出力を直接入力ファイルに使う

タイトルは意味不明だが、やってること見るとわかってもらえるかも  系

    command1 <(command2)

command1プロセスが1番目のパラメータをopenして読み込むと、command2の出力(stdout)が読める

例えばsha1ハッシュで元ファイル--xzの解凍結果を比較したい場合、こう書くとxzをファイルに解凍しなくて済む:

    $ sha1sum mmcblk1.img <(xzcat mmcblk1.img.xz)
    fb5fcc76ae4d061f3b73ca8c5640ebf14b4b427a  mmcblk1.img
    fb5fcc76ae4d061f3b73ca8c5640ebf14b4b427a  /proc/self/fd/11      # xzcatのstdoutはこのfdにパイプされる

-----------------------
逆方向の`>()` [参照](http://qiita.com/mpyw/items/9293d1bed7d16a9bfe5c)もありますが、機能が`|`に少しかぶってるため良い使い方考えつかない‥
本物のバグはググっても答えが見つからない


## はじめに

最近、ネットを巡回していると某ter○t○ilの広告をよく見かける。
あれです。
「バグの原因がわからず既に２時間（略」とかいうやつです。

>見飽きたし、見るたびなんかモヤモヤするので記事にしてみた。

## 本物のバグは２時間程度では解決しない

ネットで訊けば解決するバグなんてたかが知れている。
訊いて解決する程度のもので悩むというのは、単にプログラマの腕が低いだけです。
（異論は受け付けません。)

そもそも、ネットで訊いて解決する程度のバグのほとんどはググれば解決する。
某ter○t○ilで訊く必要さえない。


# 本物のバグってのはググっても答えが見つからないんだよ！！

↑これが言いたかっただけ

# プログラマはググっても解決しないバグに遭遇してからが本番です
壊れたsymlinkを探す

ネタ元：http://unix.stackexchange.com/questions/34248/how-can-i-find-broken-symlinks


```bash
find . -type l -! -exec test -e {} \; -print
```

ゴミ掃除

```bash
find . -type l -! -exec test -e {} \; -print | xargs rm
```

findむずい
Kotlinで日付処理

#まえがき
Kotlin koansを解いてて、日付処理が楽になったのでメモ

この例題を解くと試せます。
http://try.kotlinlang.org/#/Kotlin%20Koans/Conventions/For%20loop/Task.kt

答えは、
https://github.com/vicboma1/Kotlin-Koans
を参考してます。。。。

##日付処理
###java
バッチ処理とかで１日から月末まで１日毎に処理したい場合、こんな感じで書いてました。

```java
Calendar c = Calendar.getInstance();
//2016/1/1
c.set(2016, 0, 1, 0, 0, 0);
int lastDay = c.getActualMaximum(Calendar.DATE);
Log.d("date","last:"+lastDay);
for (int i = 1; i <= lastDay; i++) {
  Log.d("date",c.get(Calendar.YEAR)+"/"+c.get(Calendar.MONTH)+"/"+c.get(Calendar.DATE));
  c.add(Calendar.DATE, 1);
}

```
結構面倒だけし、日から毎時のときは同じようなコードをかかなきゃないけない
本質的にしたいのは、その日の処理であって、日付を管理するコードは排除したいです
ジェネレーターみたいに、その日だけの処理を書くだけにしたいわけです


###Kotlin Koans -For loop-
http://try.kotlinlang.org/#/Kotlin%20Koans/Conventions/For%20loop/Task.kt
これを実行するためにはいろいろ必要なコードはあるけど、最終的どうなるかだけ記載
こんな感じで日付処理をするにはどうしたらよいか考えるのもありかもしれない。

```kotlin
for (date in DateRange(MyDate(2016,1,1),MyDate(2016,1,31))) {
    println(date.year.toString()+"/"+date.month.toString()+"/"+date.dayOfMonth.toString())
}
```
あら素敵だわ。
A5:SQL Mk-2 でmysqlのテーブル定義書作成

テーブル定義書が必要になってしまったので自動生成TOOLを探した。

[A5:SQL Mk-2](http://www.wind.sannet.ne.jp/m_matsu/developer/a5m2/)
上記にどんことができるのか書いてある（イメージあり）。

DLしたzipを展開後に`A5M2.exe`を実行する。

データベースへの接続情報を求める画面が出てくるので入力。

DB接続後に「データベース」->「テーブル定義書作成」を押す。

完成。

見た目も素晴らしい :smile:
cmake : externalproject で zlib と libpng を扱う例

# 目的

CMake の ExternalProject によって既存のプロジェクトへ zlib と libpng を取り込み扱えるようにする方法を紹介したい。

# externalproject 例

## external_zlib.cmake

```cmake
cmake_minimum_required( VERSION 3.2 )

include_directories(${CMAKE_CURRENT_BINARY_DIR}/include)
link_directories(${CMAKE_CURRENT_BINARY_DIR}/lib)

include( ExternalProject )

set( zlib_source_path ${CMAKE_CURRENT_BINARY_DIR}/external/zlib/src/external_zlib/ )
set( zlib_cmake_file_path ${zlib_source_path}/CMakeLists.txt )

ExternalProject_Add( external_zlib
  PREFIX            ${CMAKE_CURRENT_BINARY_DIR}/external/zlib
  INSTALL_DIR       ${CMAKE_CURRENT_BINARY_DIR}
  # http://www.zlib.net/
  GIT_REPOSITORY    git@github.com:madler/zlib.git
  GIT_TAG           v1.2.8
  CMAKE_ARGS        -DASM686=off
                    -DAMD64=off
                    -DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}
                    -DCMAKE_COMPILER_IS_GNUCXX=${CMAKE_COMPILER_IS_GNUCXX}
                    -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
                    -DCMAKE_C_FLAGS=${GL_BINDING_C_FLAGS}
)
```

## external_libpng.cmake

```cmake
cmake_minimum_required( VERSION 3.2 )

include_directories(${CMAKE_CURRENT_BINARY_DIR}/include)
link_directories(${CMAKE_CURRENT_BINARY_DIR}/lib)

include( ExternalProject )

set( libpng_source_path ${CMAKE_CURRENT_BINARY_DIR}/external/libpng/src/external_libpng/ )
set( libpng_cmake_file_path ${libpng_source_path}/CMakeLists.txt )

ExternalProject_Add( external_libpng
  DEPENDS           external_zlib
  PREFIX            ${CMAKE_CURRENT_BINARY_DIR}/external/libpng
  INSTALL_DIR       ${CMAKE_CURRENT_BINARY_DIR}
  # http://www.libpng.org/pub/png/libpng.html
  GIT_REPOSITORY    git://git.code.sf.net/p/libpng/code
  GIT_TAG           v1.6.9
  CMAKE_ARGS        -DPNG_SHARED=off
                    -DPNG_STATIC=on
                    -DPNG_TESTS=on
                    -DPNG_DEBUG=off
                    -DPNGARG=off
                    -DBUILD_SHARED_LIBS=FALSE
                    -DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}
                    -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
                    -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
                    -DCMAKE_COMPILER_IS_GNUCXX=${CMAKE_COMPILER_IS_GNUCXX}
                    -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
                    -DCMAKE_C_FLAGS=${GL_BINDING_C_FLAGS}
)
```

# 既存プロジェクト `my_app` への依存性とリンク定義の例

```cmake
include( external_zlib.cmake )
include( external_libpng.cmake )

add_executable( my_app main.cxx )

add_dependencies( my_app
  external_zlib
  external_libpng
)

target_link_libraries( my_app
  png
  zlibstatic
)
```

## Note

- 例の `target_link_libraries` では `png` より後ろに `zlibstatic` を記述する必要があり、順序を逆にするとリンクエラーとなる。

# References

- https://cmake.org/cmake/help/v3.2/module/ExternalProject.html
- http://www.zlib.net/
- http://www.libpng.org/pub/png/libpng.html
[Hyper-V] 仮想マシン再起動時に 「'<仮想マシン名>' は初期化できませんでした。」で起動に失敗する

以下の KB に書いてある回避策をそのまま実施しても回避できなかったので、備忘録代わり。

**仮想マシン再起動時に 「'<仮想マシン名>' は初期化できませんでした。」で起動に失敗する**
[https://support.microsoft.com/ja-jp/kb/2874417](https://support.microsoft.com/ja-jp/kb/2874417)

KBのページ通り、以下のコマンドを実行したが問題は回避できなかった。

`icacls "D:\Hyper-V\TestVM\Virtual Machines\3C3C1FD5-CA9B-4E74-8859-C4C3DB443348" /grant "CREATOR OWNER":(OI)(CI)(F) `

実際に回避できたコマンドが以下の通り。

`icacls "D:\Hyper-V\TestVM\Virtual Machines\3C3C1FD5-CA9B-4E74-8859-C4C3DB443348" /grant "Authenticated Users":(OI)(CI)(F)`

権限を与えるグループを "Authenticated Users" に変えました。
サーバサイドpush技術としてのWebsocketとServer-sent eventsの特徴比較

サーバサイドpush技術として見たときのWebsocketとServer-sent events(SSE)の特徴を整理したい。


* どちらもサーバからpushできる技術
* Websocketは双方向通信・SSEはサーバからクライアントへの単一方向通信
* SSEは[ただのHTTPストリーミング](http://chimera.labs.oreilly.com/books/1230000000545/ch16.html)
* Websocketは[HTTPを拡張したプロトコル](http://qiita.com/south37/items/6f92d4268fe676347160)
* 主な用途、チャット・リアルタイム通知・共同編集などリアルタイム通信

## ブラウザのサポート状況

* Websocketは[IE10以降のモダンブラウザが対応している](http://caniuse.com/#feat=websockets)
* SSEは[IE,Edgeは対応していない](http://caniuse.com/#feat=eventsource)が、[polyfill](https://github.com/Yaffle/EventSource/)で対応可能。


## 既存の開発スタックとの親和性

* SSEはHTTPそのものなので、ストリームレスポンスを返せるプラットフォームなら導入が容易。素のPHPでも[25行で実装可能](https://developer.mozilla.org/ja/docs/Server-sent_events/Using_server-sent_events#Sending_events_from_the_server)。
* Websocketは独自プロトコルなので、対応したウェブフレームワークが必要
* SSEはHTTPに対応リバースプロキシで動く。ただし、例えばnginxなら[X-Accel-Bufferingヘッダー](http://swdyh.tumblr.com/post/23987377461/nodejs%E3%81%A7server-sent-events%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F)や[proxy_buffering off](http://stackoverflow.com/questions/13672743/eventsource-server-sent-events-through-nginx)などのbufferingをOFFにする対応は必要。
* WebsocketはWebsocketに対応したリバースプロキシが必要。大抵の有名なリバースプロキシは対応している。例えば、nginxでは[数行の設定を書くだけ](https://www.nginx.com/blog/websocket-nginx/)で対応できる。
* WebsocketをCloudFlareに通すには有料の[Enterpriseプランが必要](https://support.cloudflare.com/hc/en-us/articles/200169466-Can-I-use-CloudFlare-with-WebSockets-)

## サーバから送れるデータ

* SSEはテキストのみ。バイナリを送る場合はbase64する。base64したバイナリのデータ量は33%ほど増えるが、SSEはHTTPなので同時にgzipが使える。
* Websocketはバイナリも送信できる。
* SSEはUTF-8のみ。UTF-8以外はやはりbase64する。
* Websocketは文字コードに制限がない。

## チャネル

* WebsocketもSSEもチャネルを複数持てる。厳密には、SSEは「チャネル」という用語は使ってなく「event」という。

## 制約面

* Websocketは[社内ファイアウォール・社内Proxyを超えられないケースがある](http://blog.mitsuruog.info/2012/10/websocket.html)。SSLにするといい。
* SSEは定期的にコメントでもいいから何かデータを送らないと、ブラウザやリバースプロキシが通信を切断したり、[Herokuがタイムアウト](http://qiita.com/hokaccha/items/a6015ead9499f1da8d44)したりする。
* SSEはブラウザのホスト名あたりの同時接続数制限が問題になりやすい。モダンなブラウザでも1ホストに同時接続できるのは[6〜13接続と意外と少ない](http://www.browserscope.org/?category=network)。ブラウザのタブを複数開かれると辛い。[SSE専用のサブドメインを幾つか用意する方法](http://stackoverflow.com/questions/18584525/server-sent-events-and-browser-limits)で回避可能


## セキュリティ面

* WebsocketはSame-origin policyが無い。[Cross-Site WebSocket Hijacking (CSWSH)](http://www.christian-schneider.net/CrossSiteWebSocketHijacking.html)の対策、[Cross-site WebSockets Scripting (XSWS)](https://gist.github.com/subudeepak/9897212)の対策のため、Originヘッダのチェックする、Content-Security-Policyヘッダを活用しXSSしにくくしておく。
* SSEは普通のHTTP GETリクエストにするのと同じようにセキュリティを講じれば良い。もちろんSame-origin policyも適用される。

## 後で検討したいこと

* コネクション確立後、クライアントのIPが変化した場合の振る舞いはどうなるか？
* オンライン状況の変化による切断・再接続の振る舞いはどうか？

気づいたことがあれば追記していきたい。
【Leap Motion】LeapMotionをEclipse+Javaで開発するための準備

LeapMotionはさまざまな言語でSDKがでており、Javaでの開発も行うことができます。
今回はEclipseで開発を行う場合の設定方法についてまとめます。

#環境
Windows
Eclipse

#SDKをダウンロード
https://developer.leapmotion.com/
SDKをダウンロードし、適当な場所に解凍しておきます。

#プロジェクトを作成
適当なJavaプロジェクトを作成します。

#ライブラリーをプロジェクトに追加
プロジェクト右クリックして ビルド･パス>ビルド･パスの構成

###jarを追加
1. ライブラリータブを開く
2. 「外部jar追加」を選択し、解凍したSDKの`LeapSDK/lib/LeapJava.jar`を追加 

###ネイティブライブラリの追加
1. ライブラリータブを開く
2. 先ほど追加した「LeapJava.jar」を展開し、「ネイティブ･ライブラリのロケーション」を選択した状態で「編集」
3. 「外部フォルダー」を選択し、LeapJava.dllのある`LeapSDK/lib/x64`を指定する（32ビットの場合はx86）


*** 


設定自体は以上で完了です！

SDKの中にはSampleアプリが含まれています。
上記の設定を行い、`LeapSDK/samples/Sample.java`をプロジェクトのsrcにコピーして実行すると、Sampleアプリが動きます。
技術英語 > every other ...


@ LOE > October 5, 2012
http://loe.org/shows/shows.html?programID=12-P13-00040

> So, what I would encourage your listeners to do is to say thank you to the phytoplankton <font color=red>every other</font> breath they take.

>  it can double <font color=red>every other day</font> in the presence of the predator.

「every otherは１つ飛ばしだが、2つ飛ばしはどう言うのか」と思いつつ、"every other day"で画像検索したら以下を見つけた。
http://myenglishimages.com/vocabulary/adverbs/

肝心の「２つ飛ばし」の英訳はevery two other daysだったような気がしたが、よいリンクが見つかっていない。
時間帯によって自動的に HipChat などの接続を On/Off する Cron 設定

仕事場では持ち込みの MacBook にて HipChat を使って同僚と連絡を取り合っています。便利なのですが、切断を忘れると仕事時間を終えてまで話しかけられてしまい、プライベートの時間を削ることになります。

Mac は Unix なので、Cron を使うことで時間をトリガーにしてアプリケーションの起動や停止を行うことができます[^1]。

[^1]: Mac では同等のことを `launchd` でも実現できます。

## Cron の記述

私は次のように Cron を設定しています。Cron の記述は一般ユーザーアカウントで `crontab -e` で開始できます。

```
# 平日の10時に HipChat の起動をする
0 10 * * 1,2,3,4,5 /usr/bin/open /Applications/HipChat.app

# 毎日17時~23時の0分に HipChat を停止する (プロセスを殺す)
0 17,18,19,20,21,22,23 * * * /usr/bin/killall HipChat
```

`killall` で HipChat を閉じるのは行儀がよくないかもしれないですが、HipChat はメッセージデータがサーバに保存されているので、大きな問題はないかと思います。
Scipyで標本分布を計算する(離散分布)

# 目的
母集団の確率分布が与えられたとき，標本分布を計算します。
今回は離散分布を扱います。

# 方法
## 方針
- pythonの科学技術計算パッケージ集であるscipyの，統計パッケージscipy.statsと，数値計算ライブラリのnumpyを使います。
- 次の3ステップで求めます。
  1. 母集団の離散確率分布をscipy.statsの上で離散分布として定義して
  2. サンプリングを行い
  3. 得られたサンプルから標本分布を計算します

## 離散分布の定義
scipy.stats.rv_discrete
以下の内容はscipyのドキュメンテーションからの抜粋です。
次のようにして読めるヘルプのExampleのところに載っています。

```{python}
from scipy import stats
help(stats.rv_discrete)
```

### 離散分布の定義
$xk$に離散確率変数を，$pk$に対応する確率を入れて，`stats.rv_discrete`に渡すだけです。
7個の離散値をとる確率変数の場合の例になっています。

```{python}
from scipy import stats
xk = np.arange(7)
pk = (0.1, 0.2, 0.3, 0.1, 0.1, 0.0, 0.2)
custm = stats.rv_discrete(name='custm', values=(xk, pk))
```

### 離散分布の可視化
離散分布の確率質量関数(pmf)を可視化するには次のようにすれば良いです。

```{python}
import matplotlib.pyplot as plt
fig, ax = plt.subplots(1, 1)
ax.plot(xk, custm.pmf(xk), 'ro', ms=12, mec='r')
ax.vlines(xk, 0, custm.pmf(xk), colors='r', lw=4)
plt.show()
```

## サンプリング

作成した離散分布からサンプリングを行います。
たとえば1000回ランダムサンプリングする場合は次ようにすればよいです。
(rvs: random variables)
再現性を確保するために乱数のシードを固定したい場合は，一行目のコメントを外してください。


```{python}
import numpy as np
# np.random.seed(0)
sampled_rvs = custm.rvs(size=1000)
```

## 標本分布の計算
numpy のヒストグラム関数を利用して計算します。
binのところを+1することを忘れないように注意。

```{python}
f = np.histogram(sampled_rvs, bins = np.arange(7 + 1), density=True)[0]
```

## まとめて関数にする
以上の内容をまとめます。
先ほどまでは，一次元の確率分布の場合を扱っていましたが，多次元の同時確率分布にも対応できるように，
最初に`p.ravel()`で一次元に潰してから標本分布を計算し，reshapeしてから返します。
引数のpはnupmyの配列で渡してください。

```{python}
import numpy as np
from scipy import stats

def sampling_dist(p, size, seed = 0):
    xk = np.arange(p.size)
    pk = p.ravel()
    true_dist = stats.rv_discrete(name='true_dist', values=(xk, pk))

    np.random.seed(seed)
    sampled_rvs = true_dist.rvs(size=size)

    f = np.histogram(sampled_rvs, bins = np.arange(p.size + 1), density=True)[0]
    f.reshape(p.shape)

    return(f.reshape(p.shape))

p = np.array([[0.10,0.10],[0.10,0.15],[0.15,0.10],[0.10,0.20]])
p_est = sampling_dist(p, 1000)
print(p)
print(p_est)
```
Metafile to EPS Converter で Windows Metafile を EPS に変換

PowerPoint とかで書いた図はコピーすると Windows Metafile (WMF) という形式でクリップボードに移ります.
LaTeX の文章に張るときはそれを EPS に変換したくなりますが，そういうときには，[Metafile to EPS Converter](http://wiki.lyx.org/Windows/MetafileToEPSConverter) が便利です．

使い勝手は wmf2eps と同じで, クリップボード経由で変換できます.
詳しくは[ここ](http://c.nagaokaut.ac.jp/index.php?TeX%A4%F2%CA%D8%CD%F8%A4%CB%BB%C8%A4%A6%A5%C4%A1%BC%A5%EB%CE%E0) を参照してください.
使い方は，Office ソフト上でコピペして Export EPS を押すだけです. 

![0a3f707145703daa5e0832c14adb1948.png](https://qiita-image-store.s3.amazonaws.com/0/56321/b81db623-6c24-7237-4ae6-486d4bc0b086.png)

従来からある wmf2eps 等のツールでは仮想プリンタの設定が必要でしたが，Metafile to EPS Converter ではインストーラがやってくれるので楽です.
Pythonで自己組織化マップ NumPy版


Pythonで自己組織化マップ(SOM)を使おうとしたら，
numpyで作りこまれた高速な実装が見当たらなかったので作りました．

ある程度までnumpyで作られた実装([1],[2])があったので，
これを基にnumpyで仕上げてます．

[ipython notebook](http://nbviewer.jupyter.org/urls/bitbucket.org/Shinaji/public_ipython/raw/6cae2a01652ba73964a847291d5654d80df86d2e/Self%20Organizing%20Map.ipynb)で実行例を公開．

このようなMAPできます
![Screen Shot 2016-01-20 at 8.29.10 PM.png](https://qiita-image-store.s3.amazonaws.com/0/65106/69bbfea0-9c9e-13c9-8621-1d2ad0a1a75b.png "Screen Shot 2016-01-20 at 8.29.10 PM.png")

コード
-------
```py:
import numpy as np
from matplotlib import pyplot as plt

class SOM():
    
    def __init__(self, teachers, N, seed=None):
        self.teachers = np.array(teachers)
        self.n_teacher = self.teachers.shape[0]
        self.N = N
        if not seed is None:
            np.random.seed(seed)
            
        x, y = np.meshgrid(range(self.N), range(self.N))
        self.c = np.hstack((y.flatten()[:, np.newaxis],
                            x.flatten()[:, np.newaxis]))
        self.nodes = np.random.rand(self.N*self.N,
                                    self.teachers.shape[1])
    
    def train(self):
        for i, teacher in enumerate(self.teachers):
            bmu = self._best_matching_unit(teacher)
            d = np.linalg.norm(self.c - bmu, axis=1)
            L = self._learning_ratio(i)
            S = self._learning_radius(i, d)
            self.nodes += L * S[:, np.newaxis] * (teacher - self.nodes)
        return self.nodes

    def _best_matching_unit(self, teacher):
        #compute all norms (square)
        norms = np.linalg.norm(self.nodes - teacher, axis=1)
        bmu = np.argmin(norms) #argment with minimum element 
        return np.unravel_index(bmu,(self.N, self.N))

    def _neighbourhood(self, t):#neighbourhood radious
        halflife = float(self.n_teacher/4) #for testing
        initial  = float(self.N/2)
        return initial*np.exp(-t/halflife)

    def _learning_ratio(self, t):
        halflife = float(self.n_teacher/4) #for testing
        initial  = 0.1
        return initial*np.exp(-t/halflife)

    def _learning_radius(self, t, d):
        # d is distance from BMU
        s = self._neighbourhood(t)
        return np.exp(-d**2/(2*s**2))
        
        
N = 20        
teachers = np.random.rand(10000, 3)
som = SOM(teachers, N=N, seed=10)

# Initial map
plt.imshow(som.nodes.reshape((N, N, 3)),
           interpolation='none')
plt.show()

# Train
som.train()

# Trained MAP
plt.imshow(som.nodes.reshape((N, N, 3)),
           interpolation='none')
plt.show()      
```


参考文献
---------
 * [Kohonenの自己組織化マップをpythonで実装](http://technocrat.hatenablog.com/entry/2015/02/12/014557)

[1]: http://technocrat.hatenablog.com/entry/2015/02/12/014557

[2]: https://github.com/latboy/som-in-python
アッチの世界を覗く射影行列 (Projection Matrix)

## アッチの世界を覗きたい
[アッチの世界を覗ける窓を作ってみた (ニコニコ動画)](http://www.nicovideo.jp/watch/sm4230739)

この動画を見てからずっと私もアッチの世界を覗いてみたいと思っていました。
最近は顔認識の精度も良くなってきたので何もWiiリモコンを使わずともHead Trackingはある程度できます。
しかし3DCGに疎い私はどういう変換を行ったらアッチの世界をリアルに見せられるのかがわかりませんでした。

...そう、今日までは。

考えてみるとすごくアホみたいなことなんですが、「↑の動画に似たことをやりたいけど3DCGとかよくわからないしとりあえず頭の座標にカメラオブジェクトの座標を合わせてやってみよう」というふうにやってコレジャナイ感に苛まれた方が結構な数いるのではないかと思います。

結論から言うと問題はカメラの配置やVR空間の変換ではなくカメラそのもの、具体的にはカメラが使う射影行列を変える必要がありました。

## あっちの世界を覗く射影行列
以下がその魔法の行列です。
![window_projection_matrix.gif](https://qiita-image-store.s3.amazonaws.com/0/17249/30cd9bcb-4759-6510-8466-3a65d8c623aa.gif)
※ (1/21 追記) 以前の行列に間違いがありました、正しくは以上のようになります。

x, y, zはそれぞれカメラのx, y, z座標に対応します。
w, hは画面の幅と高さに対応します。
これで、VR空間内の原点を中心に画面の大きさと同じ領域を画面に映し出すことができます。
72dpiのディスプレイではVR空間内の2834.6456693pxが1メートルに対応します。

## 実装 (JavaScript)
[THREE.WindowCamera (JSFiddle)](https://jsfiddle.net/6xew0hn4/)

WindowCameraという名前のthree.jsで使えるカメラを作ったので使ってみてください。
一つ難点は`renderer.render(scene, camera);`を呼ぶ前に`camera.updateProjectionMatrix()`を呼ばないといけないこと。これはパフォーマンス上の影響は小さいはずなので追々修正するつもりです。
[WindowCamera.js (Gist)](https://gist.github.com/ktnyt/04c4622e7d29d280fcf0)
[WindowCamera.js (Raw)](https://gist.githubusercontent.com/ktnyt/04c4622e7d29d280fcf0/raw/623b5d576ac95822a373dcb0679f679b10fa9afd/WindowCamera.js)

同じ行列を使えばOpenGLだろうとなんだろうと同じ現象を再現できるはずです。

## 計算方法
[ここ](http://www.songho.ca/opengl/gl_projectionmatrix.html)を参考にしています。
カメラの座標を(0, 0, 0)から(x, y, z)へ、near平面の中心を原点(0, 0, 0)にし幅と高さをそれぞれw, hに置き換えて計算するとおおむね以上のような結果になります(一部都合がいいように変更しています)。
バッチファイルで、任意の範囲の実行時間を計測する(2/3修正)

　デバッグや最適化のための試行錯誤に。
　準備は、バッチの最後にこのラベルをコピペするだけ。

**一部構文にミスがあり、経過時間にマイナスがついてしまうようになっていました。申し訳ありません。**

　このラベルをcallする時、１つ目の引数に**好きな番号**を指定します。
例：```call :GetTime 1```

　そうすると、例の場合なら１番という番号に、callした瞬間の時間が記録されます。
　そして、２つ目の引数に**すでに記録済みの番号**を指定すると、１つ目の引数の番号で記録した後、２つ目の番号を開始時間として差を表示します。
例：

```bat
call :GetTime 2 1
rem とすると、２番に現在の時間を登録、すでに取得済みの１番を始点として所要時間を計算します。

rem 例えば、１番に10時ぴったりと記録されていたとします。
rem ここで、10時20秒ぴったりで上記のコマンドが実行された場合、２番に10時20秒と登録したのち、１番→２番の時間を計測します。この場合は、

rem 開始時間：10:00:00.00
rem 終了時間：10:00:20.00
rem 経過時間：20.00sec

rem となるわけです。
```

　当然保存するための番号に制限はないので（というより番号でなくともアルファベットでも漢字でもいい）、複数個所で時間を保存してまとめて比較表示することもできます。

　一見小難しいですが、慣れれば簡単です。指定した番号のファイルにデータをセーブする、ゲームのような感じを想像すると分かりやすいかも。是非使ってみてください。

```bat:時間計測
:GetTime
rem 引数１つなら、その番号を使って時間を登録
rem 引数２つなら、１つ目の番号を使って時間を登録。そこから２つ目の番号を開始時間、１つ目の番号を終了時間として経過時間を算出・表示
	set T[%1]=%TIME%
	for /f "tokens=1-4 delims=:." %%a in ("!T[%1]!") do set /a MT[%1]=%%a0*36000+1%%b*6000+1%%c*100+1%%d-610100
	if "%2" == "" exit /b
	set /a D=MT[%1]-MT[%2]
	set /a D1=%D:~0,-2%0/10,D2=10%D:~-2,2%%%100+100
	echo.
	echo 開始時間：!T[%2]!
	echo 終了時間：!T[%1]!
	echo 経過時間：%D1%.%D2:~1,2%sec
	pause >nul
	exit /b
```
PhantomJSが"Killed: 9"で動かないとき

こんばんは :whale2: 

ある日、`homebrew`でインストールした`phantomjs`(2.0.0)が動かなかったのです。

```bash
$ phantomjs
Killed: 9
```

## 対処法

```bash
# upx インストール
$ brew install upx

# シンボリックリンクの実体確認
$ readlink `which phantomjs`
/opt/homebrew-cask/Caskroom/phantomjs/2.0.0/phantomjs-2.0.0-macosx/bin/phantomjs

# Unpack実行
$ upx -d /opt/homebrew-cask/Caskroom/phantomjs/2.0.0/phantomjs-2.0.0-macosx/bin/phantomjs
                       Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2013
UPX 3.91        Markus Oberhumer, Laszlo Molnar & John Reiser   Sep 30th 2013

        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
  40624568 <-  14588338   35.91%   Mach/AMD64    phantomjs

Unpacked 1 file.
```

## 動作確認

```js:hello.js
"use strict";

console.log('Hello, world!');
phantom.exit();
```

```bash:確認
$ phantomjs -v
2.0.0

$ phantomjs hello.js
Hello, world!
```

動いた。よかった。
おわりです。

## 参考と注釈

* [phantomjs-2.0.0-macosx - Killed: 9](https://github.com/ariya/phantomjs/issues/12974)
* [PhantomJS: getting “Killed: 9” for anything I'm trying](http://stackoverflow.com/questions/28267809/phantomjs-getting-killed-9-for-anything-im-trying)
* [Download - PhantomJS](http://phantomjs.org/download.html)
* [Quick Start - PhantomJS](http://phantomjs.org/quick-start.html)
US キーボードの XPS13 に Ubuntu 14.04 をインストールして自分好みにキーボードをカスタマイズした

# 概要

XPS13 (USキーボード) を購入して Ubuntu 14.04 を入れたのだけど、キーボードや日本語入力まわりで色々苦労したので、工夫した点を記録しておく。

# OS のインストール周り

[Dell XPS 13 (2015) に Ubuntu を入れる](https://gist.github.com/keijiro/fdf733b71e6e6595d234) を参考にしつつ、Ubuntu 14.04.03 を USB からインストールした。

- Windows でログインして、あらかじめ BIOS を最新版にアップデートする
- Dual Boot したいため、Windows のディスク領域を縮小して 60 GB あける
- Try Ubuntu を起動して、インストール
    - Wifi ドライバが見つからない場合は、USB で Wifi アダプタを外部接続
    - third-party のオプションをチェック

# タッチパッド設定

キーボードを利用中にタッチパッドを触ると意図せずカーソルが動いてしまうので、タッチパッドの設定で `Tap to Click` を無効化した。なお、 `Disable while typing` はデフォルトで有効になっている。

# 日本語入力

[Ubuntu の日本語環境](https://www.ubuntulinux.jp/japanese) を参考に apt を設定して `ubuntu-defaults-ja` を入れつつ、どうやらデフォルトの ibus よりも fcitx の方が使いやすいようなので、

```
$ im-config -n fcitx
```

として、 IM を fcitx に設定した。15.10 からは fcitx が標準の様子。

合わせて、fcitx の設定で `Super+Space` による入力切換を設定した。


# Caps Lock を Ctrl にして Alt と Super を交換

キーボードの設定は xkb で管理されていて、 dconf (レジストリのようなもの) に設定を保存できるので、

```
$ dconf reset /org/gnome/settings-daemon/plugins/keyboard/active
$ dconf write /org/gnome/desktop/input-sources/xkb-options "['ctrl:nocaps','altwin:swap_alt_win']"
```

で Caps Lock を Ctrl にしつつ、Alt と Super を交換した。これで、Mac に近い形で英語・日本語変換ができるようになった。

なお xkb の設定は

```
$ setxkbmap -print -verbose 10
```

で確認できる。設定可能なオプションは、下記ファイルから探した。

```
$ grep "win" /usr/share/X11/xkb/rules/base.lst
  altwin               Alt/Win key behavior
  altwin:menu          Add the standard behavior to Menu key
  altwin:meta_alt      Alt and Meta are on Alt keys
  altwin:alt_win       Alt is mapped to Win keys (and the usual Alt keys)
  altwin:ctrl_win      Ctrl is mapped to Win keys (and the usual Ctrl keys)
  altwin:ctrl_alt_win  Ctrl is mapped to Alt keys, Alt is mapped to Win keys
  altwin:meta_win      Meta is mapped to Win keys
  altwin:left_meta_win Meta is mapped to Left Win
  altwin:hyper_win     Hyper is mapped to Win-keys
  altwin:alt_super_win Alt is mapped to Right Win, Super to Menu
  altwin:swap_alt_win  Alt is swapped with Win
```

# emacs 風 key binding

genome-tweak-tool の Keyboard and Mouse 設定で Key theme を Emacs に変更。

# ccsm でウィンドウ切り替えのショートカットを変更

```
$ sudo apt-get install compizconfig-settings-manager
```

ccsm を起動して、Advanced Search で 'switch' を入力し、`Ubuntu Unity Plugin` にウィンドウ切り替えのショートカット設定があるのを確認。

Super と Alt をひっくり返したけど、ウィンドウ切り替えは従来のキーでやりたいので、

- Key to start the Launcher Applicaton Switcher
- Key to start the Switcher

を交換。
無料で使える仮想マシンソフト Veertuで開発環境用VMを作るのが捗る

# Veertuとは

公式サイトはこちら http://veertu.com/
一部の機能をのぞき、無料で使用することのできる仮想マシンソフトウェアです。
VMWareやVirtualBoxと違ってマシンのスナップショットを扱うことは出来ません。

## どういうところが便利なのか

デフォルトでどんなゲストOSを作るのかのメニューがGUIで用意されているのが超がつくほど便利だと思っています。
仮想マシンの作成方法と一緒に紹介したいと思います。

# Veertuで仮想マシンをセットアップする手順
### 1.Veertuをインストール
https://itunes.apple.com/app/veertu/id1024069033 
上記リンク、またはAppStoreからVeertuをインストールします。

### 2.起動して、＋ボタンをクリック
Veertuを起動すると以下のような画面が立ち上がります。
左上の「＋」ボタンをクリック
<img width="425" alt="スクリーンショット 2016-01-20 23.39.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/7193/4696939b-7d10-d27b-364f-4e2eb30dab8e.png">


### 3.仮想マシン作成方法を選択
仮想マシンの作成方法を選択します。
右側はオンラインから必要な仮想マシン作成リソースを自動でダウンロードして仮想マシンを作成してくれるメニューです。
左側はISOイメージを使用して仮想マシンを作成するメニューですが、有料版の機能です。
ここでは、右側の「Download and run Linuxs VMs」を選択して、右下の 「next」ボタンをクリックして進みます。
<img width="481" alt="スクリーンショット 2016-01-20 23.43.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/7193/acc0bcce-8cb7-f9d1-baf6-3803cc078129.png">

### 4.作成する仮想マシンの環境を選択
Veertuには予め作成できる仮想マシンのセットが用意されています。**便利すぎませんか？**
種類は決して豊富ではないのですが、Ubuntu、CentOS、Fedora、Debianなど普遍的な環境は用意されていて、ごく普通の開発環境を用意するのに困ることは特にありません。作成したい仮想マシンの環境を選択して、Nextをクリックします。
<img width="480" alt="スクリーンショット 2016-01-20 23.44.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/7193/72e9898f-3fe6-af67-0508-48d29c5e433e.png">

Nextをクリックすると、選択した環境の必要リソースの自動ダウンロードが始まります。**便利すぎませんか？**
自分で頑張ってcentOSのisoをダウンロードしたりする作業とかしなくていい！嬉しい！
<img width="483" alt="スクリーンショット 2016-01-20 23.51.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/7193/cdfe1ba6-084d-03f6-8377-ffc6da3b6395.png">

### 5.仮想マシンのスペックを設定
手順4が完了すると、スペック設定の画面に切り替わります。

<img width="480" alt="スクリーンショット 2016-01-21 0.48.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/7193/339afd48-adc8-80ac-ce04-8126d3115db0.png">

左下の「Customize」ボタンをクリックすることで、作成する仮想マシンのスペックの設定ができます。必要に応じて任意のメモリ割当てなどを行ってください。
<img width="567" alt="スクリーンショット 2016-01-21 0.48.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/7193/8e4d7e16-b0be-2932-af62-f46bd3cc087e.png">

### 6.仮想マシンを実行
手順5.の画面で、右下の「Launch VM」をクリックすると仮想マシンが起動します。ここまできたら後は好きなように仮想マシンをいじって開発環境をつくったりしましょう。
<img width="1275" alt="スクリーンショット 2016-01-21 0.52.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/7193/95937eb1-a487-6da6-761e-d01d8b62f173.png">

## 補足事項
### VM内でパイプ（|）が入力できない。
やり方が見つからなかったんですよね・・・。作成したVMに対してsshで繋いで操作するのがスムーズです。



気づいたことがあれば追記していこうと思います。
PHP非同期処理チュートリアル: ReactPHPで非同期処理を作るための事前準備

前回の記事で、PHPでも非同期処理を同期処理の文法で書くことを実現できました。
これで、ReactPHPを使った非同期処理サーバの構築が捗りますよね！

まあ、そんなわけ無いですよね。。。
肝心の非同期処理がないのですから。

ということで、今回は非同期処理を作るための準備をしてみようと思います。
もっとも、私自身も大した実装ができるわけではないです。
できる人らのコード呼んでもちんぷんかんぷんでした。。。

# 非同期処理を書こう

## 非同期処理のインターフェース

そもそも、PHPerで非同期処理を書いたことある人がどれほどいることか。
私も、こういった記事を書くまで、思いつくことすらありませんでした。

非同期処理を書く上で、参考になるのはやはりJavaScriptです。

```js
function asynFunc (args, function () {
  //何かの処理
})
```

非同期処理というのは、基本的には関数の処理が完全に終わる前に、その次の処理が実行されるというもので、完全終了した後にその結果を受ける処理を、コールバックで指示するという書き方が一般的です。

## 仕組み

非同期処理を実装するためには、どうすればよいでしょうか。
簡単には次のような仕組みを考えると良いと思います。

1. 非同期処理が発生したら、あらかじめ「合図」を設定する
2. 各「合図」ごとに処理を登録しておく
3. 非同期処理の終了を検知したら、その結果に応じて「合図」を出す
4. 「合図」を検知したらそれに対応する処理を実行する

という形です。
で、この「合図」をイベントと呼んでいます。

次に、これらの機構を実現するためのイベントとループについて解説します。

# イベント

ReactPHPをインストールすると、依存パッケージとして「evenement/evenement」というパッケージが同時にインストールされます。
このパッケージは先程述べたイベントの実装を容易にしてくれます。

実装は次のように行います。

```event.php
$emitter = new Evenement\EventEmitter();// イベントの仕組みを生成

$emitter->on('go', function ($data) {// 'go'という名前のイベントが発生した時の処理を登録(バインド)
    print_r($data);
});

$data = ['woops!']
$emitter->emit('go', [$data]);// 'go'という名前のイベントを発生させる(発火)
```
`on`メソッドで処理を登録し、`emit`メソッドでイベントを発生させます。これらをそれぞれ、バインドと発火と呼んだりしてます。
`emit`の第２変数に与えた配列の中身が`on`でバインドしたコールバック関数の引数になります。

# ループ

Reactの中枢はループ機構です。
ループというのは、その名の通りループです。
無限ループが発生し、１サイクルごとに何らかの状態を監視している、というものになります。
Reactは主にタイマーとストリームを監視しているようです。
先ほどのイベントの仕組みと合わせて、非同期処理を用意に実装できるようになります。

## タイマー

ループを使った機構で最もわかりやすい非同期処理の例はタイマーだと思います。
例えば次のようなコードは、タイマーとイベント発火を組み合わせて、簡単に非同期処理を作成しています

```php
$loop = React\EventLoop\Factory::create();

function timerFunc($loop)
{
    $emitter = new \Evenement\EventEmitter();
    
    $loop->addTimer(1, function () use ($emitter) {
        $emitter->emit('hello');
    });
    
    $emitter->on('hello', function () {
        echo 'おはよう' . PHP_EOL;
    });
    
    
}

timerFunc($loop);
echo 'こんにちは' . PHP_EOL;

$loop->run();
```
このように、`$loop`にある`addTimer`メソッドを使用することで、タイマーを設定することが可能です。

### addTimer メソッド

Reactのループのタイマー処理には２つあって、一つがこの`addTimer`です。
これは、与えられた秒数後に指定したコールバック関数の処理を走らせるというものです。
引数の取り方が逆ですが、JavaScriptの`setTimeout`と同じようなものです。

### addPeriodicTimer メソッド

一方、こちらのメソッドは与えられた周期でコールバック関数を実行するので、JSで言うところの`setInterval`と同じようなものです。

## ストリーム

Reactではタイマーだけでなく、ストリームの監視も行えます。
私の認識ではストリームというのは外部リソースに問い合わせる処理全部、というものですが、合ってるのかわかりません。。。
また、内容が複雑なので、今のところ私の理解が追いついていません。

ストリームの処理の実処理をするパッケージも有ります。
これもReactに同梱されています。

```php
use React\Stream\Stream;

$loop = React\EventLoop\Factory::create();

$source1 = new Stream(fopen('test1.txt', 'r'), $loop);
$source2 = new Stream(fopen('test2.txt', 'r'), $loop);

$source2->on('data', function($data) {
    echo $data;
});
$source1->on('data', function($data) {
    echo $data;
});

$loop->run();
```
ファイルの読み込みとかならこれでいいのですが、肝心のDBアクセスとかどうなるんだか。。。

# まとめ

今回は事前準備として必要な知識をピックアップしました。
ストリームでやるのが効率としてはいいのでしょうが、いかんせん私にはまだ理解できない部分が多いです。
なので、次回にはタイマーを使って非同期処理を実現しようと思います。

# 参考資料

https://github.com/reactphp/stream
https://github.com/reactphp/event-loop
https://github.com/igorw/evenement
git rebaseがうまくいかなかった時の話



なかなかなれないgitの操作
rebaseを行おうとしたら怒られました。

今回はdevelopが更新されたのでそれを自分のbranchに取り込むために
rebaseをやろうとしたときのお話です。

結論から言うと`git rm --cached　...`で
gitの管理から外していたのが原因
なので.gitignore を途中で変更したりすると同じような
問題が起きることがあるみたいです。

今回は

```
git rebase develop
```

を行うと以下のようなエラーが出ました。

```
First, rewinding head to replay your work on top of it...
Applying: Add audit
Using index info to reconstruct a base tree...
M       hoge.rb
Falling back to patching base and 3-way merge...
error: Your local changes to the following files would be overwritten by merge:
        fuga.rb
        piyo.yml
Please, commit your changes or stash them before you can merge.
Aborting
error: Failed to merge in the changes.
Patch failed at 0001 Add audit
The copy of the patch that failed is found in: .git/rebase-apply/patch

When you have resolved this problem, run "git rebase --continue".
If you prefer to skip this patch, run "git rebase --skip" instead.
To check out the original branch and stop rebasing, run "git rebase --abort".

```

commitかstashしろよと言われるのですが
できなくて困りました。

今回の原因
fuga.rbとpiyo.ymlは中身が自動生成される部分があるもので
毎回はpushしたくなかったのでgitの管理から一時的に外していたこと。
なので以下のようにgitで管理されているファイルを確認すると

```
git ls-files -v | grep config
.
.
.
H spam.rb
S fuga.rb
H ham.rb
H eggs.rb
S piyo.yml
.
.
.

```

というようになりました
先頭にSがついているものはgitの管理から外されているということです。
結果的に管理されている状態に戻して解決

```
git update-index --no-skip-worktree fuga.rb
git update-index --no-skip-worktree piyo.yml
```

結論。悪いのはいつも自分。

結局、develop側からはfuga、piyoが変更されているのに
commitされていないように見えて、
自分のbranchではgitから見えなくしているからcommitもstashもできないのが悪かったみたいです。
備忘録：python Skeleton ニャ


おおよそ[元ネタ](http://learnpythonthehardway.org/book/ex46.html)
# 私の場合のプロジェクトスケルトン

忘れるので、自分用 python プロジェクト構築手順

# 前提条件

以下のものがインストール前提

* pip
* virtualenv
* pythonz

# 1. プロジェクト用環境構築

必要場合は python 環境を構築する

<pre>
# 必要な場合 python をインストール
$ pythonz install py_version

# vritualenv 環境構築
$ cd path_to_virtualenv_dir
$ virtualenv -p `pythonz locate py_version` virtualenv_dir_name

# pythonz インストール内容確認
$ pythonz list
# virtualenv activate
$ . path_to_virtualenv_dir/virtualenv_dir_name/bin/activate
# virtualenv deactivate
$ deactivate
</pre>

# 2. ディレクトリ作成

<pre>

# python プロジェクト格納ディレクトリ
$ mkdir projects
# プロジェクトディレクト作成
$ mkdir prj_name ; cd prj_name
# 初期化
$ mkdir bin pkg_name test docs
touch pkg_name/__init__.py tests/__init__.py
</pre>

# 3. setup.py

以下のファイルを prj_name/setup.py　に作成する

<pre>
try:
    from setuptools import setup
except ImportError:
    from distutils.core import setup

config = {
    'description': 'My Project',
    'author': 'My Name',
    'url': 'URL to get it at.',
    'download_url': 'Where to download it.',
    'author_email': 'My email.',
    'version': '0.1',
    'install_requires': ['nose'],
    'packages': ['NAME'],
    'scripts': [],
    'name': 'projectname'
}

setup(**config)
</pre>

install_requires にある依存ライブラリをセットアップ

<pre>
$ python setup.py develop
# 確認
$ pip list
</pre>

# 4. テスト環境を用意

prj_name/tests/pkg_name_tests.py にテストを追加

<pre>
from nose.tools import *
import pkg_name

def setup():
    print "SETUP!"

def teardown():
    print "TEAR DOWN!"

def test_basic():
    print "I RAN!"
</pre>

動作確認
<pre>
$ nosetest
</pre>

# 5. ディレクトリ構造

ディレクトリ構造下記のようになります

<pre>
prj_name/
     pkg_name/
         __init__.py
     bin/
     docs/
     setup.py
     tests/
         pkg_name_tests.py
         __init__.py
</pre>
Botkitで最小構成のSlack Botを作成する方法

# 概要

Botkitを使って「hi」と話しかけると「hi」と返すだけのSlack Botを作成してみました。
npmとnode.jsは使える前提です。

# 環境

```bash
$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.11.6
BuildVersion:   15G1108
$ npm -v
3.10.9
$ node -v
v7.2.0
```

# Slack側の設定

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

上記のページでBotの名前を指定してBotを作成後、API Tokenを取得しておきます。

<img width="800" alt="bot-api-token.png" src="https://qiita-image-store.s3.amazonaws.com/0/30447/ba854441-d93b-e48e-967b-28213baeab1b.png">

# Bot本体の作成

初期化とbotkitのインストール行います。

```bash
$ mkdir simple-slack-bot
$ cd simple-slack-bot
$ npm init # Enter連打
$ npm install botkit --save
$ cat package.json
{
  "name": "simple-slack-bot",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "botkit": "0.4.2"
  }
}
```

本体となるindex.jsを作成します。

```js:index.js
const Botkit = require('botkit');

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

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

controller.spawn({
    token: process.env.token
}).startRTM(function(err){
    if (err) {
        throw new Error(err);
    }
});

// say hi
controller.hears('hi',['direct_message','direct_mention','mention'],function(bot,message) {
    bot.reply(message,'hi');
});
```


# 起動

「your-api-token」部分を先ほど取得したAPI Tokenにして起動します。

```bash
$ token=your-api-token node index.js
info: ** No persistent storage method specified! Data may be lost when process shuts down.
info: ** Setting up custom handlers for processing Slack messages
info: ** API CALL: https://slack.com/api/rtm.start
notice: ** BOT ID: simple-bot ...attempting to connect to RTM!
notice: RTM websocket opened
```

起動すると作成したbotユーザがオンラインになります。

<img width="252" alt="bot-online.png" src="https://qiita-image-store.s3.amazonaws.com/0/30447/27c64bde-7bca-1c30-63d0-0e6b9864a6fe.png">

「hi」と話しかけるとちゃんと「hi」と返してくれました。

<img width="352" alt="chat-with-bot.png" src="https://qiita-image-store.s3.amazonaws.com/0/30447/bb43d32c-d555-f42a-d0c4-4fd0620a0283.png">
iOS Appのアップデートを審査に提出する際の作業時に困ったこと


## はじめに

アプリ改修して，久々に提出する際に少し困ったので備忘録。
初回リリースは役立たないかも。

## 今回のリリースで困ったこと

### 提出用のビルド作成時
一番は開発環境。
普段使ってる開発機でアーカイブ作成，Validate，アップロード。
iTunes Connect でスクショ追加して，変更点書いてさぁ審査へ提出。

>新規 App および App アップデートは Xcode 6 以降の公開 (GM) バージョン、および iOS SDK 以降を使ってビルドする必要があります。ベータ版ソフトウェアを使ってビルドした App は送信しないでください。

- 最後の最後審査に提出ボタンを押したときに発動
- アーカイブはストア最新版の Xcode 7.2 で作成
- アーカイブ作成の Mac が OS X の beta 版
- Xcode，Mac OS X も beta 版を使ってアーカイブ作ったらだめ

#### 対策
- Mac OS X の **システム環境設定.app** の App Store
- ベータ・ソフトウェア・アップデートを無効に
- チェックが入っている場合はdeveloper モードにしますか的なのに同意してる
- チェックが入ってると OS X のアプデが来たときに beta 版をインストールしようとする
- 最新のストア版の OS X にする
- バックアップから復元

**参考**
* Apple Beta Software Program 登録解除
https://beta.apple.com/sp/ja/betaprogram/unenroll?locale=ja

---
### その他(アップロードまでにあったエラーなどまとめ)
#### アプリアップロード時の iPad Multitasking のエラー
* iOS 9 から iPad を右スワイプすることで出てくるやつ
* iPad のマルチタスキングを使わない場合はフルスクリーンにチェック
* Portrait 対応は考えてないからやむなし。
 ![00.png](https://qiita-image-store.s3.amazonaws.com/0/88266/0a3f1be0-d7ea-f975-3fe1-a44e2d167610.png "00.png")

**参考**
* iPad Multitaskingに対応したメモ
　http://qiita.com/jollyjoester/items/c8bb1592d01fdef663f9

　 
#### 本体Appターゲットと Extension ターゲットのバージョン違い
- warning レベルでアップロード自体は出来る
- 修正後再度提出しようとすると Build バージョンエラー
- Build Ver を変更後ok

今回 Today Extension を実装したのだが，バージョン合わせるのはなんか違う気がするので(Today Extension 自体はVer 1.0 だろ的な)スルー


## 新規で Mac 設定

対策で書いた通りで何とかなるのだけど運が悪いことに先日 Time Machine がおかしくなって一度すべて消してバックアップしなおしたためかなり困った。そこで 飾ってあった MacBook Pro 13 inch Mid 2009 を引っ張り出してきて新しくアプリ提出用に環境構築した。

* beta 版を全く用いない Mac の環境構築
* 最新ストア版 Xcode 7.2 は OS X Yosemite 10.10.5 から
* Mavericks だったので El Capitan にアップグレード
* Xcode 7.2 をインストール
* Xcode の規約に Agree
* git をインストール
* Xcode の **Preferences… —> Accounts タブ** から Apple IDs を追加 
* アーカイブを作成

その際，General > Identity の team の fix のいつものやつでひっかかる。証明書の類が全く Mac にないためだ。Fix するとうまくいくこともあるが今回はダメだった。下記のやつが出る。有効なのはあるけど今のお主の Mac のローカルにはないみたい的な。

![01.png](https://qiita-image-store.s3.amazonaws.com/0/88266/4829fd0d-a1ab-87c2-88d6-705c9da27f64.png "01.png")


* Developer の Member Center のCertificates にアクセス
* Type が iOS Distribution と iOS Development のものを Mac にダウンロード
* cer ファイルをそれぞれダブルクリックで証明書登録
* 登録したのにやはり同じのが出るのでやむなく Reset(メールが来る)
* アーカイブは完了
 　
 
* アーカイブ完了後の画面で Upload to App Store ボタン押す
* 登録したのに今度は上記画像が iOS Distribution に書き換わったやつが出る

distribution の証明書があるけどこのPCのローカルにはないと言われる。reset 押したらこちらも治った。

* Upload 完了

## おわりに

先日，iOS App のアップデート版を提出した際に出たエラーなどを書いた。Xcode は beta 版じゃダメなのはわかるけど Mac OS X までなのかと少し納得できない部分もあった。証明書系も最初は難しいけど一度登録してしまえば何とかなるものだなと思った。今回の提出が審査でリジェクトされたらまた何か書くかもしれない。新しい物好きでもグッと堪えなければならないことがあるということとバックアップはしっかり取っておくことが大事。

乱文，長文でしたが，ここまでご覧いただきありがとうございました。

## 参考
* Apple Beta Software Program 登録解除
https://beta.apple.com/sp/ja/betaprogram/unenroll?locale=ja
　

- iPad Multitaskingに対応したメモ
http://qiita.com/jollyjoester/items/c8bb1592d01fdef663f9
Project Eulerをシェル芸で解いてみる(Problem 20) #シェル芸

# 概要
Project Euler[^pe]は、数学的な問題解決能力を要求する、プログラミング問題集・オンラインプログラミングジャッジである。
一般的なオンラインプログラミングジャッジとは異なり、解答するプログラミング言語は、特に限定されていない。
フォームに入力した値だけで正誤を判別するため、適切なアルゴリズムさえ考案できれば、あらゆるプログラミング言語で解答することが可能である。
そのため、Web上では様々な手法による解答が公開されている。

しかし、シェル芸[^def]による解答は、私が探した限りでは、殆ど見つからなかった。
そこで、私自身の勉強も兼ねて、Project Eulerをシェル芸で解いてみることにした。
<br>

本記事では、Project EulerのProblem 20を、シェル芸で解いた際の過程を述べる。

# 実行環境
* Arch Linux (x86\_64, 4.3.3-2-ARCH)
* bash (4.3.42, POSIX互換モード)
* GNU coreutils (8.24)

<!---
* bsd-games (2.17)
--->

# 問題文
[原文 ([https://projecteuler.net/problem=20](https://projecteuler.net/problem=20))]
> $n!$ means $n \times (n − 1) \times \dots \times 3 \times 2 \times 1$
> 
> For example, $10! = 10 \times 9 \times \dots \times 3 \times 2 \times 1 = 3628800$,
> and the sum of the digits in the number $10!$ is $3 + 6 + 2 + 8 + 8 + 0 + 0 = 27$.
> 
> Find the sum of the digits in the number $100!$

[日本語訳 ([http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2020](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2020))]
> $n \times (n - 1) \times \dots \times 3 \times 2 \times 1$ を $n!$ と表す.
> 
> 例えば, $10! = 10 \times 9 \times \dots \times 3 \times 2 \times 1 = 3628800$ となる.
> この数の各桁の合計は $3 + 6 + 2 + 8 + 8 + 0 + 0 = 27$ である.
> 
> では, $100!$ の各桁の数字の和を求めよ.

正答は、注釈[^ans]に記載する。

# 解法
```sh:prob_020.sh
1	#!/bin/sh
2	
3	seq 1 100 \
4	| # 1~100の整数の生成
5	xargs \
6	| # 行->列変換
7	tr ' ' '*' \
8	| # 階乗の算出式の生成
9	bc \
10	| # 階乗の出力
11	tr -d '\\\n' \
12	| # 出力の整形
13	grep -o '.' \
14	| # 列->行変換
15	xargs \
16	| # 行->列変換
17	tr ' ' '+' \
18	| # 各桁の数字の総和算出式の生成
19	bc
20	  # 総和の出力
```

以下、コマンドライン上での実行用コードである。

```sh
seq 1 100 | xargs | tr ' ' '*' | bc | tr -d '\\\n' | grep -o '.' | xargs | tr ' ' '+' | bc
```

## 解説
純粋に100の階乗を算出し、各桁の数字を足し合わせれば良い。

この解法による処理の詳細は、コードに記載してあるコメントの通りである。

# 雑記
* 「こんな別解があるよ」や、「こうすればもっと効率化できるぜ」、「こう書けばエレガントですわよ」等の意見がありましたら、気軽に教えていただけますと幸いです🐺
* 現在の進捗状況 -> [https://github.com/gin135/Project_Euler/tree/master/sh](https://github.com/gin135/Project_Euler/tree/master/sh)
<br>

* 手抜き解説だけれど、シンプルな問題なので...
* (前回の問題がシェル芸的に面白かっただけに、今回はちょっと拍子抜けな感じ。)

- - -

[^pe]: About - Project Euler ([https://projecteuler.net](https://projecteuler.net))
[^def]: シェル芸の定義 >> シェル芸 - 上田ブログ ([https://blog.ueda.asia/?page_id=1434](https://blog.ueda.asia/?page_id=1434))
[^ans]: 648
Vagrantを使った環境構築

#Vagrantを使った環境構築

##1 VirtualBox のダウンロード＆インストール

- ここから取得してインストールしておく。
- [Downloads – Oracle VM VirtualBox](https://www.virtualbox.org/wiki/Downloads)

##2 Vagrant をダウンロード＆インストール

[https://www.vagrantup.com](https://www.vagrantup.com/)

- ダウンロードしたらインストール。

```sh
 % vagrant -v
Vagrant 1.7.2
```

#3 Box ファイルのダウンロード＆追加

- Box ファイルとは、仮想環境のイメージファイルのようなもの。
- 以下にホスティングされているので、好きなもののURLをコピーしておく。
- [Discover Vagrant Boxes - ATLAS](https://atlas.hashicorp.com/boxes/search?provider=virtualbox&q=&sort=&utf8=✓)

- 以下のコマンドでBoxファイルをVagrantに登録する。

```sh
# vagrant box add {Box名} {BoxファイルのURL または、Boxファイルへのパス}
vagrant box add centos67_customized "file://~/OneDrive/vagrant/centos67_customized/centos67_customized.box"
```

- 登録されたboxの確認

```sh
vagrant box list
```

#4 仮想環境の設定

- 仮想環境の設定はVagrantfileを通して行います。
- プロジェクトディレクトリを作成し、Vagrantfileを作成します。
- ==VagrantfileはDockerfileのようなもので、このファイルが有れば`vagrant init`を行う必要はない。==

```sh
mkdir ~/OneDrive/vagrant
mkdir ~/OneDrive/vagrant/rails_development
cd ~/OneDrive/vagrant/rails_development
vagrant init centos67_customized
```

```sh
vi Vagrantfile
```

- ネットワークの設定
- [公式サイト - 仮想マシン設定](http://blog.raqda.com/vagrant/vagrantfile/machine_settings.html)

```
  config.vm.network :public_network, :ip => "192.168.1.200", :netmask => "255.255.255.0", :bridge => "en0: Wi-Fi (AirPort)"
  config.vm.hostname = "dev"
  config.vm.network :private_network, ip:"192.168.3.200"
```

- SSHの設定

```
config.ssh.forward_agent = true
```

- 共有フォルダの設定
- config.vm.synced_folder “ローカルのパス”, “仮想環境上のパス”

```
config.vm.synced_folder "/Users/soushi/OneDrive/railsapp", "/railsapp", type: "nfs"
```

- vmメモリとCPUコアの設定(VirtualBoxの例)

```
config.vm.provider "virtualbox" do |vb|
    # Customize the amount of memory and cpu cores on the VM:
    vb.customize ["modifyvm", :id, "--memory", "5120", "--cpus", "8", "--ioapic", "on"]
end
```

- 完成したVagrantfile

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

Vagrant.configure(2) do |config|
  config.vm.network :public_network, :ip => "192.168.1.200", :netmask => "255.255.255.0", :bridge => "en0: Wi-Fi (AirPort)"
  config.vm.network :private_network, ip:"192.168.3.200"
  config.vm.hostname = "dev"
  config.ssh.forward_agent = true
  config.vm.synced_folder "/Users/soushi/OneDrive/railsapp", "/railsapp", type: "nfs"
  config.vm.box = "centos67_customized"
  config.vm.box_url = "file://~/OneDrive/vagrant/centos67_customized/centos67_customized.box"
  config.vm.provider "virtualbox" do |vb|
    # Customize the amount of memory and cpu cores on the VM:
    vb.customize ["modifyvm", :id, "--memory", "5120", "--cpus", "8", "--ioapic", "on"]
  end
end
```

#5 仮想環境を起動する

- Vagrantfileが存在するディレクトリで以下を実行

```sh
vagrant up
```

#6 仮想環境に接続する

```sh
vagrant ssh
```

#7 Boxファイルを自作する

[http://te2u.hatenablog.jp/entry/2015/05/11/012225](http://te2u.hatenablog.jp/entry/2015/05/11/012225)を参考

#参考
- http://blog.tokoyax.com/entry/vagrant/intro
Swiftはじめたい...その１０ 特殊変数とか参照渡しとか、ジェネリクスとか...


# 今回はノンジャンルで試してみます。

## literal Expression

+ 行数とかがわかります。

```swift:literalExpression
import Foundation

func literalExpression() {
    print("__FILE__",__FILE__)
    print("__LINE__",__LINE__)
    print("__COLUMN__",__COLUMN__)
    print("__FUNCTION__",__FUNCTION__)
}
literalExpression()
```

```shell:結果
__FILE__ <EXPR>
__LINE__ 5
__COLUMN__ 24
__FUNCTION__ literalExpression()
```

+ ``__FILE__``は、praygroundで実行してるからでしょうか？

## 参照渡し

+ 個人的にはどこがどう変わったかわかりづらいので、いざというとき以外はあんまり使わないですけどね。

```swift:参照渡し
func callByReference(inout a: Int) {
    a += 10
}

var a = 1
print("before:",a)
callByReference(&a)
print("after:",a)
```

+ inoutというのが参照渡しですよっていうことらしいです。

```shell:結果
before: 1
after: 11
```

+ 参照渡しですよって明示するほうがfinalとかより良いと思います。

## ジェネリクス

### 総称型ってやつですね。

```swift:GenericFunction
func swapVal<T>(inout a: T, inout _ b: T) {
    let temp = a
    a = b
    b = temp
}

if true {
    var a = 123;
    var b = 789;
    swapVal(&a, &b);
    print(a,b)
}

if true {
    var a = "abc";
    var b = "xyz";
    swapVal(&a, &b);
    print(a,b)
}

```


```shell:結果
789 123
xyz abc
```

+ まぁふつーですかね。

### 値の比較が可能 Comparable

+ ジェネリクスの型の絞込ってことなんですかね？
+ Ｔが比較可能なものという縛りをかけられます。

```swift:値の比較が可能
func genericCompare<T:Comparable> (a:T,_ b:T)->T {
    let c:T = a > b ? a : b
    return c
}
print(genericCompare(10,10))
print(genericCompare(1,2))
print(genericCompare(1.0,-2.0))
print(genericCompare("abc","bcd"))
```

```shell:結果
10
2
1.0
bcd
```

### 値の==が可能 Equatable

+ Ｔが==のチェック可能なものという縛りをかけられます。

```swift:値の==が可能
func genaricSame<T:Equatable> (a:T,_ b:T)->T {
    let c = (a == b) ? a : b
    return c
}

print(genaricSame(10,10))
print(genaricSame(1,2))
print(genaricSame(1.0,-2.0))
print(genaricSame("abc","bcd"))
```

```shell:結果
10
2
-2.0
bcd
```

+ Comparable,Equatableの他にはなにかあるんでしょうか？？

## まとめ

+ ジェネリクスは宿題が多くありそうです。
+ ジェネリクスにwhereとかもあるようで
+ Comparable,Equatableのような〜ableな指定があるかどうかも調べなきゃ...

# 今日はここまで

+ 次はジェネリクスをもうちょっと調べるつもりです。
supervisordの導入

# supervisordの導入

##1 ダウンドーロドおよびインストール
###1.1 EPELパッケージを使ってインストールします。

~~~sh
yum -y --enablerepo=epel install supervisor
~~~

##2 /etc/supervisord.confを編集します。
###2.1 WebUI用のIPアドレスとユーザー名,パスワードを設定します。

~~~sh
vi /etc/supervisord.conf
~~~

~~~
[supervisord]
http_port=/var/tmp/supervisor.sock ; (default is to run a UNIX domain socket server)
http_port=131.113.102.201:9001     ; (alternately, ip_address:port specifies AF_INET)

http_username=soushi             ; (default is no username (open system))
http_password=password           ; (default is no password (open system))
~~~

###2.2 プロセスの設定ファイル/etc/supervisord.d/*.iniを読み込むようにします。

~~~sh
vi /etc/supervisord.conf
~~~

~~~
[include]
files = /etc/supervisord.d/*.ini
~~~

##3 起動します。

~~~sh
service supervisord start
chkconfig supervisord on
~~~

##4 プロセスの登録
- supervisordによってデーモン化したいプロセスを登録します。
- <プロセス名>.iniというテキストファイルを作成し、その中に起動コマンドなどを書いてから、/etc/supervisord.d/に保存しておくと、supervisordが自動でプロセスを起動してくれます。
- 今回は、練習として、zookeeperを登録します。

~~~sh
vi /etc/supervisord.d/zookeeper.ini
~~~

~~~
[program:Zookeeper]
command=/usr/local/zookeeper/bin/zkServer.sh start
~~~

##6 コンテナで使うためのスクリプト

~~~
RUN mkdir -p /usr/local/download/
WORKDIR /usr/local/download/
RUN curl -O wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
RUN rpm -Uvh epel-release-6-8.noarch.rpm
RUN yum -y install supervisor
ADD supervisord.conf /etc/supervisord.conf

VOLUME ["/etc/supervisord.d"]
~~~