OmniAICreator/Qiita-1.07M huggingface dataset:
UbuntuのDashにアプリケーションを登録する方法

Macではホームフォルダ以下にApplicationsフォルダがあるけれども、Ubuntuにはこれがない。

Android Studioを入れてDashから呼び出せるようにしたかったのだけれど、上手く出来なかったので調べてみた結果、`.desktop` 形式のファイルを追加することでDashの検索対象に入るっぽいことがわかった。

詳しくは調べてないので、また後でそこは調べる。

Android Studioをやろうとした時はこんな感じ。

`~/.local/share/applications` 以下にこんなファイルを `android-studio.desktop` という名前で作ればOK。ディレクトリの他のファイル眺めてみるとDashで検索可能なアプリケーションの同じようなファイルが羅列されている。

```
[Desktop Entry]
Version=1.0
Type=Application
Name=Android Studio
Exec="/home/username/Programs/AndroidStudio/bin/studio.sh" %f
Icon=/home/username/Programs/AndroidStudio/bin/idea.png
Categories=Development;IDE;
Terminal=false
StartupNotify=true
StartupWMClass=jetbrains-android-studio
Name[en_GB]=android-studio.desktop
```

`Exec` と `Icon` はそれぞれandroid-studioの起動コマンドと、アイコンにしたい画像のパスを書くところなので、適宜書き換える。
Visual Studio を使っていて OS ごとフリーズするときに試すこと

# Visual Studio を使っていて OS ごとフリーズするときに試すこと

備忘のために私の症状をメモ

- 不定期だが再現性がある。
- 必ずしも Visual Studio を使っているときとは限らない。立ち上げているだけで発生したことがある。

## 免責事項
本文の内容は未検証で、同じ効果が得られること、副作用が発生しないことを保証しないし、直接的、間接的に発生した損害に対して一切の責任を負わない。以下の情報は、利用者の責任において使用すること。

## 対策

Visual Studio のメニュー [ツール]-[オプション] ダイアログを開き、[環境]-[全般] の次の項目および関連のチェックを外す。
[クライアントのパフォーマンスに基づいて視覚的効果を自動的に調整する]

Visual Studio Community 2017 のオプションダイアログ
![201703121653277773156.png](https://qiita-image-store.s3.amazonaws.com/0/93945/93602765-8fc8-aeaa-f528-a35dc5e268ea.png)

## 確認した環境

PC: Intel Core 7 6700 および内蔵グラフィック
OS: 日本語 Windows 10 Home 64 ビット
Visual Studio: Visual Studio Community 2015、Visual Studio Community 2017
Raspberry Pi が Zero W を発売された

Raspberry Pi が Zero W を発売された

[Raspberry Pi が Zero W を発売](https://www.infoq.com/jp/news/2017/03/Raspberry-Pi-Zero-W)

[10ドルのRaspberry Pi Zero Wは最初からWi-FiとBluetooth内蔵の超便利なラズパイだ](http://jp.techcrunch.com/2017/03/01/20170228the-10-raspberry-pi-zero-w-is-the-teeniest-little-wi-fi-enabled-computer-youve-ever-seen/)

[「Raspberry Pi Zero」の国内販売スタート--価格は税別650円](https://japan.cnet.com/article/35096994/)

[ラズパイZero/Zero W用の公式ケースが648円で発売](http://pc.watch.impress.co.jp/docs/news/1047939.html)

[Raspberry Pi Zero WをWebカメラに——専用カメラ&ケース付USB増設基板「HubPi Cam」](https://fabcross.jp/news/2017/20170309_raspberrypizero_usbhubhat_hubpicam.html)

[Wi-Fi/Bluetooth搭載「Raspberry Pi Zero W」の実力--各種ベンチマークで性能を検証](https://japan.techrepublic.com/article/35097624.htm)

qiita [Raspberry Pi Zero(W)のセットアップ](http://qiita.com/hishi/items/8bdfd9d72fa8fe2e7573)

qiita [ついに来た Raspberry Pi Zero W](http://qiita.com/shigeru-yokochi/items/5d273b3444ffb008c778)

qiita [[メモ] Raspberry Pi Zero W + motionEyeOSでビデオ監視システム](http://qiita.com/mt08/items/180140d7df549b0a1dec)

qiita [みせてもらおうか、新しいRaspberry pi zero(v1.3)の性能とやらを！](http://qiita.com/pio2/items/4f394130704639ca8edc)
Dropwizardからairbrake-logbackでErrbitにうまくログが送れないことがある問題調査

結論から言うと、Dropwizard 0.8の問題だった。

---

- ERROR以上をErrbitに送るとする（threshold
- `net.anthavio:airbrake-logback:1.0.1`を利用
- `net.anthavio.airbrake.AirbrakeLogbackAppender.Notify#ALL`とする
- `logger.error`で明示的にERRORを吐く

上記のような時、airbrake-logbackの以下でNPEが発生する。

```java 
        } else if (notify == Notify.ALL) {
            StackTraceElement[] stackTrace = event.getCallerData(); // NPE
            AirbrakeNotice notice = new AirbrakeNoticeBuilderUsingFilteredSystemProperties(apiKey, event.getFormattedMessage(), stackTrace[0], env).newNotice();
            airbrakeNotifier.notify(notice);
        }
```

https://github.com/anthavio/airbrake-logback/blob/v1.0.1/src/main/java/net/anthavio/airbrake/AirbrakeLogbackAppender.java#L112


なので、以下のようにnullチェックをすれば回避は出来る。

```java 
		} else if (notify == Notify.ALL) {
			StackTraceElement[] stackTrace = event.getCallerData();
			StackTraceElement stackTraceElement = null;
			if (stackTrace.length > 0) {
				stackTraceElement = stackTrace[0];
			}
			AirbrakeNotice notice = new AirbrakeNoticeBuilderUsingFilteredSystemProperties(
					apiKey, event.getFormattedMessage(), stackTraceElement, env)
					.newNotice();
			airbrakeNotifier.notify(notice);
		}
```

色々調べてみると、Dropwizard 0.9から`includeCallerData`というプロパティが設定出来るようになり、これを設定ファイルのyamlで`true`にしておけばNPEが発生しないことが分かった。
`callerData`というのはLogbackの何かの設定っぽい？

修正されたコミット
https://github.com/dropwizard/dropwizard/commit/24fb50e0b44d56e02fafe170bbf0c066bb01d4ae#diff-ff8c81f68c5d01d23ec8e969387495eb

PR
https://github.com/dropwizard/dropwizard/pull/995
vscodeのterminalで.bash_profileが読み込まれない

## 発生した問題

* pyenvの設定が.bash_profileに書かれている。
* vscode上のターミナルを起動したけどpyenvが正しく動かない(認識されずシステムのPythonを見に行ってしまう)

## 対応策

基本設定 => 設定 => ユーザー設定　を開いて以下を追加すればOK

```json
{
  "terminal.integrated.shellArgs.osx": [
      "-l"
  ]
}
```

## 参照元情報
[#7672 .bash_profile not sourced in integrated terminal on mac](https://github.com/Microsoft/vscode/issues/7672)のissueが上がってた。
システム設定で`-l`でログインシェルを有効にしろよとのこと。


## 補足
`terminal.integrated.shellArgs.osx`をワークスペース設定に追加すると警告出て怒られます。
JQuery-Validation-Engine使って、特定条件の時だけ入力させるフォームなどを使うときの話

# 環境
JQuery 3.1.1

# こんなケースはよくあるはず

Webページ上で何かの選択肢があって、その中から「自由入力」みたいなものを選んだ時だけ
自由入力欄を必須にする・・・。といったケースは時々あると思います。

```html:こんなフォームがあるとする
<h2>ダンジョンに一人連れて行くとしたら</h2>

<input type=“radio” id=sel_0” name=“sel” value=“だくねす" >だくねす<br>
<input type=“radio” id=sel_1” name=“sel” value=“めぐみん” >めぐみん<br>
<input type=“radio” id=sel_2” name=“sel” value=“ゆんゆん” >ゆんゆん<br>
<input type=“radio” id=sel_3” name=“sel” value=“そのほか” >そのほか<br>

<input type=“text” id=“sel_free” name=“sel_free” >
<!-- （平仮名４文字なのは見やすくするためだ。悪意はない） -->
```

そして、フォームの入力判定をブラウザ側で行う際に、
JQuery-Validation-Engine使うケースも多いとおもいます。

そんなときに・・・。

```html:condRequiredがうまく動かない
<h2>ダンジョンに一人連れて行くとしたら</h2>

<input type=“radio” id=sel_0” class="validate[required]" name=“sel” value=“だくねす" >だくねす<br>
<input type=“radio” id=sel_1” class="validate[required]" name=“sel” value=“めぐみん” >めぐみん<br>
<input type=“radio” id=sel_2” class="validate[required]" name=“sel” value=“ゆんゆん” >ゆんゆん<br>
<input type=“radio” id=sel_3” class="validate[required]" name=“sel” value=“そのほか” >そのほか<br>

<input type=“text” id=“sel_free” class="condRequired[sel_3]" name=“sel_free” >
```

なぜかこの、`condRequired[ID]`がうまく動かない。
ID で指定したものがチェックされていても、検出されない。

# こうすれば良い

JQuery-Validation-Engineは、設定を変えなければ
「画面上に表示されていないものは無視する」仕組みなので
入力させたい時だけ、表示されせばよい。
そのほうが、余計なものが表示されず快適といえば快適。
（特にスマートフォンのような、表示枠に余裕がない環境ではね・・・）

# したがって、こんな実装になる

```javascript:バリデーション類の設定

//（ブラウザバックを含む）ページが表示されたタイミングで実施する。
window.onpageshow = function(){
  jQuery("#form").validationEngine();
  appearTextIn();
  
  //ラジオボタン群のどれかがチェックされているかを確認する
  jQuery(".gp").on("click",function(){
    appearTextIn();
  });
}

//テキスト欄を有効にするか否かの判定実施。複数箇所でよびだされるので関数にした。
var appearTextIn = function(){
  
  var obj = document.getElementById("sel_3");
  var isChecked = obj.checked;
  if ( isChecked == true ){
    //「その他」がチェックされていればテキスト入力欄を表示させる
    document.getElementById("sel_free").style.display = "";
  }else{
    //上記条件以外なら　テキスト入力欄を表示しない
    document.getElementById("sel_free").style.display = "none";
  }
}

```

```html:HTML部分

<h2>ダンジョンに一人連れて行くとしたら</h2>

<input type=“radio” id=sel_0” class="gp validate[required]" name=“sel” value=“だくねす" >だくねす<br>
<input type=“radio” id=sel_1” class="gp validate[required]" name=“sel” value=“めぐみん” >めぐみん<br>
<input type=“radio” id=sel_2” class="gp validate[required]" name=“sel” value=“ゆんゆん” >ゆんゆん<br>
<input type=“radio” id=sel_3” class="gp validate[required]" name=“sel” value=“そのほか” >そのほか<br>

<input type=“text” id=“sel_free” class="validate[required]" name=“sel_free” style="display:none;" >
```

といった感じになります。

# 余談

自由入力が選択されている時だけ、テキスト入力欄を表示して入力させるようフォームを用意する機会は多々あると思います。

こんな感じで「非表示になっているものは対象外にする」
なんて実現方法も大いにありでは。
OpenGoddard使い方４-非線形最適制御・軌道生成のためのpythonライブラリ

https://github.com/istellartech/OpenGoddard
https://istellartech.github.io/OpenGoddard/

[OpenGoddard使い方１](http://qiita.com/ina111/items/ec73bc77ad45dd65ac1e)
[OpenGoddard使い方２](http://qiita.com/ina111/items/20963133988c27d84748)
[OpenGoddard使い方３](http://qiita.com/ina111/items/486aa2a24a1723081b91)
[OpenGoddard使い方４](http://qiita.com/ina111/items/60f75d90e5376d34a0ef)←いまここ

今回は、最適化のための定石テクニックの一つを使った定式化と結果について。

## 低推力軌道遷移問題

小惑星探査機はやぶさにも搭載されたことで有名になったイオンエンジンなど電気推進の発展によって、例えば地球から他の惑星までロケットエンジンのような化学推進ではなく電気推進で行くということが多くなってきました。
化学推進での軌道遷移はホーマン軌道と呼ばれる軌道を取ることが必要エネルギー最小でいけるということが有名です。
ただし、これは十分な推力のあるエンジンのみで、低推力ではスパイラル軌道と呼ばれる軌道になってしまいます。
2地点間の軌道遷移の問題は多くは境界値問題として解いていく（ランベール問題という。ランベルト問題ともいう、Lambert's Problem）が、ここでは最適制御問題として扱って解いてみます。

元となる論文は以下のものです。

Ross, I. Michael, Qi Gong, and Pooya Sekhavat. "Low-thrust, high-accuracy trajectory optimization." Journal of Guidance, Control, and Dynamics 30.4 (2007): 921-933.
https://doi.org/10.2514/1.23181

### 運動方程式

```math
\begin{align}
\dot{r} &= v_r \\
\dot{v_r} &= v_t^2 / r - 1 / r^2 + u_r \\
\dot{v_t} &= - v_r v_t / r + u_t
\end{align}
```

### 拘束条件
初期値と終端値をいれて、推力の大きさの制限を入れます。

```math
|u_r| \leq 0.01 \\
|u_t| \leq 0.01 \\
0 < t_f < 55
```

### 評価関数
必要とする推力の時間合計の最小化を狙います。

```math
J = \int_{t_0}^{t_f} |u_r| + |u_t| dt
```

### 絶対値の置き換え
絶対値の入った評価関数は滑らかでは無いので、数値解析の定石として、自由変数（補助変数とも）を使った置換を行います。
http://www.msi.co.jp/nuopt/download/introduction/module/technic.pdf

```math
u = u_1 - u_2 \\
|u| = u_1 + u_2
```
これを考慮して、状態変数３つ（$r, v_r, v_t$）と制御変数４つ($u_{r1}, u_{r2}, u_{t1}, u_{t2}$)として記述していきます。

また、評価関数に積分項がある場合にはrunning_costに積分項の中身を指定します。

```python
def running_cost(prob, obj):
    ur1 = prob.controls_all_section(0)
    ur2 = prob.controls_all_section(1)
    ut1 = prob.controls_all_section(2)
    ut2 = prob.controls_all_section(3)

    return (ur1 + ur2) + (ut1 + ut2)
```

```python
prob.running_cost = running_cost
```

### 結果


![4_LTTO_.png](https://qiita-image-store.s3.amazonaws.com/0/40132/e1299f44-a3be-af9e-eacd-9f7bff76346e.png)


制御変数であるuのグラフを見ると、人間には理解しづらい推力の履歴になることがわかります。
こんな難しい問題も、（ある程度の試行錯誤とノウハウは必要ですが）簡単に解くことが出来ます。

## まとめ
以上のように、OpenGoddardを使うにあたって簡単な例から、注意点となりうるところを解説していきました。
簡単にまとめると以下の通りです。

* スケーリング - 変数の大きさのオーダーを揃えてあげる
* 区間更新 - knotを増やしたり減らしたり
* knotting method - 状態変数の非連続な部分の定義
* 絶対値など滑らかでないものの置換

あたりがノウハウで非直感的な部分として残っていますが、それでも簡単に非線形最適制御の解（軌道）を求めることができます。
数値解なので最適値であるという保証が無いことと、局所最適解であるというのが重要な注意点ではありますが、多くの実務では問題ないと思います。
是非、OpenGoddardを使ってみて下さい！

## 蛇足１
逐次二次計画法のソルバーでv1.0.0現在採用しているのがScipyのSLSQPというものですが、このソルバーの性能が大規模問題には向いていません。変数やnodeの数が多い問題では計算時間がかなりかかります。ココらへんは疎行列の特性を使った高級なソルバーを使うといいっぽいですが、未検証です。よく論文などに出ているのはSNOPTやIPOPTです。

## 蛇足２
今回説明したOpenGoddardの他にOpenTsiolkovskyというプログラムを公開しています。

* OpenGoddard(名前の由来） - 近代ロケットの父と呼ばれるアメリカのロバート・ゴダードさん
* OpenGoddard（中身) - 最適化問題を解くことにより軌道設計
* OpenTsiolkovsky(名前の由来) - 宇宙旅行の父と呼ばれるコンスタンチン・ツォルコフスキーさん
* OpenTsiolkovsky(中身) - ロケットの運動方程式から微分方程式を解いてロケットの軌道計算

この２つは逆問題と順問題という、一対となるソフトです。


元々作った理由はロケットの軌道生成だけれども、結果的にOpenGoddardはかなり汎用的なツールです。
大規模な最適制御問題は別のツールを使ったほうが良いかもしれませんが、簡単な計算であれば依存関係も少なくインストールも楽なので良いツールだと思います（熱い自画自賛）
サーバサイドpushを実装するときの困り事

メッセージの着信数とか、新着情報とか、株価みたいな情報をリアルタムで表示したいとき、ポーリングで疑似リアルタイムに見せるのはもう時代遅れなのは誰もが認めるところだと思います。

代わりの技術としては、サーバサイドpushで

- Server Sent Events
- Websocket

のどちらかを使って、サーバサイドから必要なタイミングでデータをpushするわけですが、通知用のTCPセッションが1クライアントにつき1本張りっぱなしになってしまうのが問題です。（サーバリソースを消費してしまう）

こんなとき、通知用TCPセッションを肩代わりしてくれて、そこにAPIでイベントを投げると、対象クライアントにイベントを配信してくれるサービスとかあると、リーソス消費を気にかける必要なくサーバサイドPUSHができますよね。

こんなサービス、あったら使ってみたいと思った方は「いいね」押してください。
もし、「いいね」が多かったら作ってみるかもしれません。（笑）
自分のDockerでのMySQLの使い方

特に細かい設定をしないので`my.cnf`なしで`utf8mb4`で起動させる。

起動

```
docker run -d -p 60001:3306 --name mysql5.6.23 -e MYSQL_ALLOW_EMPTY_PASSWORD=yes mysql:5.6.23 --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci
```

接続

```
docker run -it --link mysql5.6.23:mysql --rm mysql:5.6.23 sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot --default-character-set=utf8mb4'
```

接続する時に、`--default-character-set=utf8mb4`を付けないと`latin1`になってしまうので注意。

```sql
mysql> show variables like 'character_set%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
```

クライアントコンテナの`my.cnf`で`utf8mb4`に設定していれば良いのかも知れないが、なくてもこれだけで`utf8mb4`で繋げるのでこうして使っている。
Rails4.1のProduction環境でJavascriptが動かない


ググってもあまり有用な情報がなかったので書いておく。
##結論
javascriptを圧縮するプラグインをデフォルトのUglifierからyui-compressorに変更した。


```ruby:Gemfile
gem 'yui-compressor' #追加
```


```ruby:config/environments/production.rb
#config.assets.js_compressor = :uglifier
config.assets.js_compressor = :yui　#追加
```

**yui-compressorの実行にはjavaが必要。**

以上。

##環境
###実行環境
筐体　Synology Diskstation(debian-chroot)
Ruby - 2.4
Rails - 4.1.8


###開発環境
MacOS Sierra - 10.12.3

##状況
Michel Hertle氏のRuby on Railsチュートリアルを参考に
簡単な業務用Webアプリを開発中。
開発環境下でとりあえず作成したものを実行環境下で試運転したところ。FUllCalendar等表示されなかった。
ブラウザではapplication-hogehoge.jsで
>SyntaxError: Left hand side of operator '=' must be a reference.

スクリプトは圧縮されているので、フォーマットツールで整形して、エラー行を確認すると識別子!0に代入しているところで止まってるっぽい。

```asset-hogehoge.js
 !0 = o && (nt.boxSizingReliable() || i === t.style[e]), i = parseFloat(i) || 0
```

初めは自前のスクリプトがまずいと思い、書き換え、削除してみたが、解決せず。新しいアプリを立ち上げて、似た環境を作っても再現できなかった。

config/environments/production.rbにdevelopment環境のためにある以下のデバッグ用コードを入れても動くには動いた。

```ruby:config/environments/production.rb
config.assets.debug = true
```

でも、これではあまりうまくないと思い探究を続けた。

結局、assetパイプラインを作る過程で上手くいってないのだろうということで、asset関連で検索。
assetパイプラインを作っているのはSprockets というgemということが判明。関連して調べると、その中でjavascriptの圧縮を担っているのがuglifierというgemということがわかった。
それで、圧縮はuglifierの他にも選択肢があることがわかった。
というわけで、yui-compressorを利用することで今回は解決した。

##なぜ？
なぜこういう状況になったのでしょうか。何か変なことをやったのでしょうか。再現しようと思ってもできなかったし、同じ状況がググっても出てこなかったのでレアなケースかもしれません。
##参考
当該エラーやアセットパイプラインいついて幾つかググったが、最終的にはこのサイトが一番役にたった。
[Rails日本語ドキュメント-アセットパイプライン](http://ruby.studio-kingdom.com/rails/guides/asset_pipeline)

##蛇足
Sprocketsとかuglifireとかカッコイイ名前つけるのはいいんだけど、用途・機能が連想しにくいね。作者はそれなりの思い入れがあって名付けてるんだろうけど。ある意味、生産性の低下を招いてる気がする。
(iOS)Background fetchの実装方法

#Background fetchとは
アプリを起動していなくても、OSの判断で適切だと思われるタイミングで、任意の処理をバックグランドで実行することができます。

#手順1 Background fetchの有効化
Capabilities → Background Modes → Background fetchをオンにします。
<img width="710" alt="スクリーンショット 2017-03-12 15.13.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/89206/96d007aa-d5ba-a726-711b-75b65639e84d.png">

#手順2 任意の処理を実行する間隔の指定
AppDelegate.swiftのdidFinishLaunchingWithOptionsに
application.setMinimumBackgroundFetchInterval(UIApplicationBackgroundFetchIntervalMinimum)
を実装する。

※ UIApplicationBackgroundFetchIntervalMinimumとしてもOSの判断で処理が呼ばれるため、常に呼ばれるわけではありません。

```ruby:AppDelegate.swift
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    application.setMinimumBackgroundFetchInterval(UIApplicationBackgroundFetchIntervalMinimum)
        
    return true
}
```

#手順3 バックグラウンドで実行する処理の実装
処理を実装します。
処理が終わったらcompletionHandlerを実装する必要があります。
約30秒間猶予を与えられているので、この間に処理を完了させcompletionHandlerを呼べるようにしましょう。
もしcompletionHandlerが呼ばれなかった場合は、次回バックグラウンドで呼ばれる時の間隔に影響するみたいです。

```ruby:AppDelegate.swift
func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    //バックグラウンドで実行する処理

    //適切なものを渡します → 新規データ: .newData 失敗: .failed データなし: .noData
    completionHandler(.newData)
}
```

#デバッグ方法①
Edit Scheme...から下記をひらき、Background FetchのLaunch due to a background fetch eventにチェックを入れます。
これで実行するとperformFetchWithCompletionHandlerが呼ばれます。
<img width="860" alt="スクリーンショット 2017-03-12 16.03.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/89206/c3c83c76-88b1-60d5-a747-afd294c61f50.png">

#デバッグ方法②
Debug → Simulate Background Fetchを選択するとperformFetchWithCompletionHandlerが呼ばれます。
ただ実機ではなぜかうまくいきませんでした。
<img width="286" alt="スクリーンショット 2017-03-12 16.03.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/89206/dda93396-9eee-5f71-ed7e-c0d7c0deea3c.png">

#最後に
自分用のメモとして残しました。
Googleカレンダー連携の出欠投稿サービスを作ります

# はじめに

みなさん、Webでの出欠確認をどのように行なっていますか？
ボクはあるサークルを運営しているのですが、なかなか使い勝手の良いものがなく、出欠確認用のプライベートなWebサービスを作成しました。

せっかくなので皆さんに使ってもらえるサービスとしてリメイクしたいと思っているので、この場を借りてアンケートさせていただきます。

今回の投稿では構想しているサービスの内容を紹介するので、もし「使ってみたい！」と思ったら「いいね」してください。もし１００人の方から賛同が得られたら作成しようと思います。

作成する際は、その過程をこのQiitaアカウントで随時公開しようと思っています。

![schecules.png](https://qiita-image-store.s3.amazonaws.com/0/25427/6315f1c0-db4e-f9ea-c850-b845bf71f04b.png "プライベートで作成したサービスの予定一覧") ![list.png](https://qiita-image-store.s3.amazonaws.com/0/25427/237696af-7878-be85-a43b-441d6a7f8335.png "プライベートで作成したサービスの出欠一覧")

プライベートで作成したサービスのキャプチャ画面


# こんなサービス

Googleカレンダーに登録した予定に対してメンバーが出欠を投稿できるWebサービスです。主な機能は以下の通り。

## Googleカレンダー同期

管理者はGoogleカレンダーに予定を登録することで予定が作成できます。スマホのカレンダーアプリと同期すれば、スマホのカレンダーアプリから手軽に予定の管理ができます。

## グループのURLを発行

サービスにはグループのアカウントを作成することでグループの予定を一覧できる固定のURLが発行されます。メンバーはそのURLにアクセスすることでいつでも今後のスケジュールを確認できます。

## グループのメンバーはアカウント登録不要

出欠を投稿するメンバーはアカウント登録は不要です。

## シンプルでわかりやすいUI

使っていて気持ちの良いUIにしたいです。マテリアルデザインを採用するつもりです。

## ガラケー対応

メンバーにガラケー利用者がいても大丈夫。


# 競合調査

下記のような同様のサービスが存在しますが、Googleカレンダーと同期するものはありませんでした。また、イベント単位での利用となっており、グループのURLは発行されないようです。

- [とっとと決め太郎](http://www.freeml.com/kimetaro/)
- [調整さん](https://chouseisan.com/)
- [調整丸](https://chosei.gnavi.co.jp/)


このサービスを「使ってみたい！」という方、「いいね」よろしくお願いします！
ゆっくりとデータサイエンティスト回りの概念/手法を整理してみようと思う part6

1章　記述統計の基本と基本的な確率分布 〜1.1 確率関数と記述統計
※この投稿はシリーズものの一部です。
[part5](http://qiita.com/yuusei/items/1b8e90899a8497d54759) <-[part0](http://qiita.com/yuusei/items/49a63f4402afc66243e6)->[part7](http://qiita.com/yuusei/items/43ad17fbd642e16ab4e7)

注意)このエントリは下記の章立てたシリーズの最初の章のエントリとなります。
    これらのエントリは数式を理解する為に絵が多く入っています。
　　 ただし、当然数式も多く入っている為、あまり耐性のない方は無理をせず閉じていただければと思います。

1章　記述統計の基本と基本的な確率分布 (平均/分散/標準偏差/共変動と相関/一様分布/ガウス分布  etc…)
2章　推計統計の基本と対応する確率分布 (検定/推定/t分布/χ二乗分布/F分布 etc…)
3章　様々な確率分布 (二項分布/ポアソン分布/負の二項分布/対数正規分布/指数分布/アーラン分布/ガンマ分布 etc…)
4章　確率過程を理解する為の基礎概念 (確率空間/独立性/ルベーグ積分/大数の弱・強法則/フーリエ変換/中心極限定理 etc…)
5章　確率過程入門 (ウィーナー過程/レヴィ過程/ガウス過程/マルコフ過程/MCMC etc…)
6章　確率的最適化入門 (確率過程の入った待ち行列理論 / 確率的最適制御-動的計画法)

それでは始めます。

# 1章　記述統計の基本と基本的な確率分布 
この章の目標は、平均や分散、標準偏差などを3次元までのレベルで絵を記載して理解できるようにするのが目標です。
著者の好みでわけのわからないこだわりが入る場合がありますが、なるべくわかりやすく書いていきたいと思います。

## 1.1 確率関数と記述統計
この節では、まず確率関数の定義を示し、続けてその定義を基にして、平均や分散、標準偏差や相関を絵にして
説明していきたいと思います。

### 1.1.1 確率関数(離散-連続)
[前々回のエントリを見て下さい](http://qiita.com/yuusei/items/342fced5a45095172400)

### 1.1.2 同時確率(離散)
[前回のエントリを見て下さい](http://qiita.com/yuusei/items/1b8e90899a8497d54759)

### 1.1.3 同時確率(連続)

同時確率を離散から連続にするとどうなるかという議論は、
二つほど前のエントリで書いたように、
根本的には「整数値の集合を対象にするか」か「連続値の集合を対象にするか」の違いだけです。
なので、今回やるべき事は必然的に「前回の離散式を連続の世界にお化粧をつけて移す」作業になります。

そんなわけで、大して大げさなことをやるわけではないので、
ちゃっちゃか行きましょう。

前回紹介した同時確率(離散)はこれでした

```math
\begin{eqnarray}
	{\rm P} (x, y) & \geq &  0 & ,  \\
	\sum_{x \in \mathbb{Z}} \sum_{y \in \mathbb{Z}} {\rm P} (x, y) & = &  1 & .  
\end{eqnarray}
```

これを連続の世界に持っていくと、こうなります。

```math
\begin{eqnarray}
	p (x, y) & \geq &  0 & ,  \\
	\int_{- \infty}^{\infty} \int_{- \infty}^{\infty} p (x, y) dx dy & = &  1 & .  
\end{eqnarray}
```

高校で数学を学んでいる人には当たり前の光景ですかね。

さて、いつも通り、イメージ図を置いて終わりにしましょうか。

これが離散
![1.1.2.同時分布.png](https://qiita-image-store.s3.amazonaws.com/0/138270/fefc1002-a19d-e0d5-4a5d-c4b287cc4c6f.png)

これが連続
<img width="699" alt="1.1.3.同時確率(連続).png" src="https://qiita-image-store.s3.amazonaws.com/0/138270/3a412a60-4345-1fd6-18b3-f46221cef016.png">

これが離散の周縁分布も加えたバージョン
![1.1.2.同時分布と周縁分布.png](https://qiita-image-store.s3.amazonaws.com/0/138270/1d9c0dfe-558a-0c69-3262-eda62f260f7e.png)

これが連続の周縁分布を加えたバージョン
<img width="721" alt="1.1.3.同時確率(連続)合体.png" src="https://qiita-image-store.s3.amazonaws.com/0/138270/cb4bb953-c226-854d-8516-6ecd83e3602e.png">

$ \sum $ が $ \int $になった以外特に印象の違いはないと思います。
(※まぁ、上の連続の方の周縁分布は、3dの図をグリグリ回して作っただけなので、周縁分布の定義から超絶外れてるんですけどね。
　なので「周縁分布はあくまでもイメージです」)

3dの図を作成するコードは[ここ](http://cse.naro.affrc.go.jp/minaka/R/R-binormal.html)とか[ここ](http://stat.biopapyrus.net/graph/3dplotf.html)とかを見ていただければわかるので、そちらを参照してください(Rをインストールしておく必要があります)

この一連のエントリで使っているRコードは、一つの賞が終わるたびに、GitHubにでも乗せて公開しようと思います~~(使い方覚えなきゃ・・・)~~

これで連続バージョンが終わったので、
次回は やっと期待値と分散の話に入ります。

少し先回りして予告すると、
なぜ、統計の世界では「期待値を平均とも呼ぶのか」について話したいと思います。

これは、会社の同僚から割と反応の良かった説明なので、
学生の頃に、平均と期待値は別物として頭に刷り込まれている方、
ちょっと期待していてください。

次エントリ 1.1.4 期待値・平均と分散 (今月中投稿予定)
Three.jsと一緒に使うのに便利な物理演算系のライブラリ(超雑メモ)

(まだそれぞれを詳しく調べてないので詳細は割愛)

#Cannon.js

http://www.cannonjs.org/

これがちょうどよさげ？

#ammo.js

https://github.com/kripken/ammo.js/

これは機能がめっちゃ多いけど、人間が使うものではないらしい…！w
(何度高め。)

#MeshWalk.js

https://github.com/yomotsu/meshwalk.js

物理演算通りだと、キャラクターが坂の上を滑り降りるとかもあるので、
どの角度の坂道までは登れるかとか設定できるらしい。
paiza.ioでSQL

#概要
paiza.ioでSQLやってみた。
phpでPDO使って、sqliteでやってみた。

#成果物

https://paiza.io/projects/jxiTO5SIP-CDeNwjmPAv7Q

#サンプルコード

```
<?php
$db = new PDO("sqlite:test.db");
$sql = "create table bbs(id integer primary key autoincrement, 名前 text, 投稿時間 integer, 本文 text)";
$db->query($sql);
$sql = "insert into bbs(名前, 投稿時間, 本文) values ('名無しさん', 123456789, 'こんにちは')";
$db->query($sql);
$sql = "select * from bbs";
foreach ($db->query($sql) as $line) 
{
    print "{$line['id']} {$line['名前']} {$line['投稿時間']} {$line{'本文'}}\n";
}
?>
```
ES7のasync/awaitの動作確認

javascript(ES7)でもasync/awaitがあったので、`await`した後、どの処理に移るのかを、C#と比較してみました。

# 動作環境

### `C#`

- .NET Core 1.1

### `javascript`

- Chrome 57

# 検証コード

```csharp:C#
using System;
using System.Threading;
using System.Threading.Tasks;

namespace dotnet
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("before async");
            TestAsync();
            Console.WriteLine("after async");
            Thread.Sleep(3000);
        }

        static async Task TestAsync() {
            Console.WriteLine("    before heavy");
            string result = await HeavyTask("2");
            Console.WriteLine("    after heavy");
            Console.WriteLine("    result: " + result);
            Console.WriteLine("    after result");
        }

        static async Task<string> HeavyTask(string str) {
            await Task.Delay(1000);
            return str;
        }
    }
}
```

```js:javascript
console.log('  before async');
testAsync();
console.log('  after async');

async function testAsync() {
  console.log('    before heavy');
  let result = await heavyTask('2');
  console.log('    after heavy');
  console.log('    result: ' + result);
  console.log('    after result');
}

async function heavyTask(val) {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve(val);
    }, 1000);
  });
}
```

# 結果

### `C#`

![image](https://qiita-image-store.s3.amazonaws.com/0/4633/7db4b7cc-cf03-31e4-7c22-46eb6d5a5e9e.png)


### `javascript`

![image](https://qiita-image-store.s3.amazonaws.com/0/4633/0506cae4-49f2-31c4-12b3-3a35d4426072.png)

C# も javascript も同様に、`await` のところで、そのメソッドから抜け出して、呼び出し元のメインの次の処理（`after async`の出力）に進んでいることがわかりました。`await`後の処理は、`await`した処理が完了してから実行されます。

# まとめ

C# と javascript で同じように動作するため、javascriptの async/await もC#と同様に考えればいいようです。
GitHubでREADMEにgif画像を表示する簡単な方法

# 目的
GitHubでツールの導入方法や利用方法を説明をする際，デモ動画があると非常に分かりやすいです．

- [peco/peco](https://github.com/peco/peco)

この記事ではそのデモ動画作成とそれをGitHub上の説明欄に表示させる方法を説明します．

step1. デモ動画の撮影
step2. 動画ファイル(mp4など)をgif画像に変換
step3. 動画用のbranchを切り，そこにアップロード
step4. README.mdに記述

# 環境
- ubuntu16.04

# 1. デモ動画を撮影

デモ動画の撮影には[SimpleScreenRecorder](http://gihyo.jp/admin/serial/01/ubuntu-recipe/0316)を利用します．

## SimpleScreenRecorderのインストール
ppaでパッケージが提供されているので今回はそれを利用します．

```zsh
$ sudo add-apt-repository ppa:maarten-baert/simplescreenrecorder
$ sudo apt-get update
$ sudo apt-get install simplescreenrecorder
```

## 動画の撮影

動画の撮影自体は簡単にできるので，[ここ](http://gihyo.jp/admin/serial/01/ubuntu-recipe/0316)を参考にフォーマットは**mp4**を選択し，``/home/ユーザ名/ビデオ``に保存しておきます．

# 2. 動画ファイルをgif画像に変換

今回は，facebookやyoutubeでも利用されている[FFmpeg](https://ffmpeg.org/about.html)というエンコードツールと，gif画像作成用のツールとして[ImageMagic](http://www.imagemagick.org/script/index.php)を使います．

## インストール
```zsh
$ sudo apt-get install youtube-dl ffmpeg imagemagick
```

## gif画像の生成

実際には，下記のコマンドで実現できます．
例えば，**XXXX.mp4**という**30秒**の動画を**00:00:05**秒時点から**20秒**だけ，**XXXX.gif**という画像を生成したい場合は，以下のようになります．

```zsh
$ ffmpeg -t 20 -ss 00:00:5 -an -i "XXXX.mp4" "XXXX.gif"
```
- -t: 出力動画の時間指定
- -ss: 変換対象区間の開始時間指定
- -i: ファイル名指定
- -an: 出力動画のオーディオなし

動画のサイズ(何秒間の動画か)を知りたい場合は，このコマンドを実行し，出力された**Duration**の部分を確認してください．

```zsh
$ ffmpeg -i XXXX.mp4 
```

#3. 動画用のbranchを切り，そこにアップロード

ここからは，以上で生成したgif画像をGitHub上で公開するための方法を記述します．
GitHub上にgif画像をアップロードしたいのですが，ソースコードと同じディレクトリに入れておくのはスマートではない気がします．そこで，master以外に**画像・動画用のbranch**を生成しておきます．

**プロジェクトが保存されるディレクトリに移動**し，下記コマンドでブランチ(**media**としておきます)を作り，そのブランチの作業ディレクトリにgif画像を入れます．
**※プロジェクトディレクトリに移動するのを忘れないでください!!**

```zsh
$ git branch media
$ git checkout media
$ ls | grep -v -E '.git$' | xargs rm -r
$ cp /home/ユーザ名/ビデオ/XXXX.gif .
$ git add --all
$ git commit -m "[add] XXXX.gif into media branch"
$ git push media:media
```

#4. README.mdに記述

README.mdをmasterのトップに保存していることを想定して話を進めます．
ブランチをmasterに切り替えます．

```zsh
$ git checkout master
```

適当なエディタでREADME.mdに加筆します．
例えば，下記のように書くことができます．

```
## Demo

Depending on input, the output is displayed as the result like the image below.
![result](https://github.com/(GitHub登録のアカウント名)/(リポジトリ名)/blob/media/XXXX.gif)
```

最後にリモートリポジトリをアップデートします．

```zsh
$ git add --all
$ git commit -m "[add] Demo item to README.md"
$ git push origin master
```

# 参考
- [「GithubやQiitaに載せるgif形式の動画を作成する方法」](http://qiita.com/syamaoka/items/4d4054cd75df00460925)
- [「GithubのREADMEにのせる画像の置き場所](http://cakecatz.hatenadiary.com/entry/2015/02/10/214942)
- [「わかりやすいREADME.mdを書く」](http://deeeet.com/writing/2014/07/31/readme/)
機械学習論文読みメモ_52


[Learning a Probabilistic Latent Space of Object Shapes via 3D Generative-Adversarial Modeling](https://arxiv.org/pdf/1610.07584.pdf), NIPS2016
GANに基づいた3D物体画像の生成モデルを提案する。
GANのcriteriaに基づいた学習を行う事でより高精度な３D物体の生成を行う事ができる。
また低次元な確率分布からのサンプリングにより生成されるため、入力に参照画像などを要求する事がない。
また低次元であるために、３D物体を表現する多様体上を走査する事も容易である。
学習された判別器を応用する事で高性能な物体認識モデルを構築する事が可能である。

[Suprisal Driven Zoneout](https://arxiv.org/pdf/1610.07675.pdf), NIPS2016WS
RNNの正則化手法としてSuprisal driven zoneoutを提案する。
これは直前の状態からの予測が実際の値とそれほどずれていなかった場合において、状態変数を更新しない(zoneout)手法である。
この正則化は各ニューロンへの入力に対して適応的に決まる。

[A Learned Representation for Artistic Style](https://arxiv.org/pdf/1610.07629.pdf), ICLR2017
描画スタイルには多様性があり、画像生成に関する表現の豊かさを示している。
これらの表現性を学習する事はより高次元の描画に関する特徴を理解する上で重要である。
本論で提案するニューラルネットワークはそれらを学習、生成する事を可能にする。
このモデルは各描画スタイルに関して、それぞれを特徴空間における点へ写像する。
これにより、異なった新しい描画スタイルを探索する事が可能になる。
機械学習論文読みメモ_51


[Direct Feedback Alignment Provides Learning in Deep Neural Networks](https://arxiv.org/pdf/1609.01596.pdf), NIPS2016
従来のニューラルネットワークにおける学習では、feed forwardを全ネットワークにおいて行い、その後にbackpropagationを行った上で初めて重みの更新が行われる。
それに対して、最近提案されているfeedback-alignment手法では、誤差伝播を行う際に計算に用いられる重み情報は、必ずしもforward計算に用いられた重みとsymmetricである必要はない事を示した。
実際、ランダムな重みを用いた誤差伝播でも、ネットワーク自体がその活用法を学習していく事により、学習を行う事ができる。
このような特性を利用し、本論で提案するモデルでは、より各隠れ層を独立に学習できる機構を提案する。
誤差伝搬はあるランダム重みに関して出力層から各隠れ層へ直接伝搬する。
この機構により、誤差伝播に頼らなくとも、訓練誤差を０にする事も可能である。
実験による比較で誤差伝播に基づく手法と同等の性能を出す事が出来た。

[K-means Recovers ICA Filters when Independent Components are Sparse](http://jmlr.org/proceedings/papers/v32/vinnikov14.pdf), ICML2014
教師なし学習において、最近の研究では線形判別器を様々な教師なし特徴学習手法に適応して比較したところ、whiteningを行った後にkmeansを適用する手法が最も良い性能を獲得した。
本論ではその理由について解析した。
特にkmeansはICAと関係があり、kmeansや似た手法は、ICAにおける混合行列、あるいはその逆行列、を復元している事が分かった。
ICAで得られる独立因子は分類のために有効である事は知られており、すなわちkmeansも同様に得られた特徴が判別タスクに有用であるという事になる。
さらにwhiteningの重要性についても本論では強調する。

[Why does deep and cheap learning work so well?](https://arxiv.org/pdf/1608.08225.pdf)
本論ではdeep learningの成功が、数学的側面だけではなく、物理的側面にも大きく寄与される事を示す。
数学的にはneural netは任意の関数を近似できる事が示されているが、ある特定の関するを近似する事を考えた場合には、指数的に少ないパラメータ数でそれが可能である事が物理的に知られている。
これは物理法則で現れる、symmetry、locality、compositionalityやlog-probabilityの特性の上に成り立つもので、本論ではこれら特性がいかにしてシンプルなneural net構造を構築する事に寄与するかを明らかにした。
また統計モデルによるデータ生成において、そのモデル構造が階層的でありさらに物理や機械学習分野で示される特定構造に関連している場合には、そうでないshallowな構造と比較してさらに効率的な構造にする事ができる。
またこうした階層ネットワークはshallowなネットワークにより精度良く近似出来ない事を示す。
[解決：変更可能だった] Spring Bootのconfファイルでコンテキスト名を変更するのは無理そう

### 追記

実際にserviceから呼ばれるときにはちゃんと動いた。VPSにて確認。
ローカルで確認したい場合は単純に以下のようにすればよかった。

```
sh myapp.jar
```

confファイル自体はシンボリックリンクになっていても問題なかった。
まあjarの先頭にフツーにシェルスクリプト書いてあるし、シェルから起動すれば良いということに何故すぐに気付かなかったのか。。

---

Spring Bootは、デフォルトでjarと同じ場所にある`{jarName}.conf`ファイルを読み込んでくれる。
ここから`JAVA_OPTS`も渡せるので、コンテキスト名変更の設定を渡そうとしたのだが、上手くいかなかった。
`1.3.0`でダメだったので、今の最新安定版の`1.5.2`でも試したがダメ。

ちなみに、コンテキスト名は`server.context-path`のキーで変えられる。`/`始まりで`/`で終わらない文字列を指定すること。 e.g. `/myapp`

jarNameを`myapp-1.0.0.jar`とした時の、反映させようとしたconfは以下。

```:myapp-1.0.0.conf
JAVA_OPTS="-Dserver.context-path=/myapp"
```

これが出来ると、VPS上でSpring Bootのjarの場所にconfファイルを置くだけでコンテキスト名が変更出来て便利なのだが。service化はjarにシンボリックリンク貼るだけなので。

### 上手くいくパターン

当然だが、`application.properties`や、起動時に`-D`や`--`で指定すると問題ない。

```:application.properties
server.context-path=/myapp
```

`java -jar -Dserver.context-path=/myapp myapp.jar`
`java -jar myapp.jar --server.context-path=/myapp`



参考

- http://progmemo.wp.xdomain.jp/archives/954
- https://docs.spring.io/spring-boot/docs/1.5.2.RELEASE/reference/html/deployment-install.html#deployment-script-customization
cifarとCUCUMBER-9データセットから画像を取り出す


Python3でnumpyの配列から画像を生成する、ってタイトルの方が良いかも（あえてニッチな方で(^^; 

cifarは飛行機やら猫やら、cucumberは(その名の通り)きゅうりの画像セットです。機械学習に使いやすいようにnumpyの配列形式で配布されているんですが、実際の中身を覗いてみたいというのが動機です。

https://www.cs.toronto.edu/~kriz/cifar.html
https://github.com/workpiles/CUCUMBER-9

cucmberはciferとフォーマットを揃えているらしいんですが、実際には異なっていまして、それぞれ別個の処理が必要でした。Tensorflowにはcucumber形式の方が便利なのかな…？（理由は分かっていません）

```
data.shape = (10000, 3072) # cifar-10
data.shape = (1485, 1024) # CUCUMBER-9
```

サンプルプログラムは以下の通りです。Python2の場合、cPickleを使ってください。numpyとPILが必要です。

```
import numpy as np
import _pickle,random
from PIL import Image

def unpickle(file):
    fo = open(file, 'rb')
    dict = _pickle.load(fo, encoding='latin-1')
    fo.close()
    return dict

def image_from_cifar(index,dic):
    name = dic['filenames'][index]
    data = dic['data'][index].reshape(3, 32, 32).transpose(1, 2, 0) # shape=(32, 32, 3)
    img = Image.fromarray(data, 'RGB')
    print(name)
    img.save(name)

def image_from_cucumber(index,dic):
    name = dic['filenames'][index]
    r = dic['data'][index*3]
    g = dic['data'][index*3+1]
    b = dic['data'][index*3+2]
    data = np.array([r,g,b]).T.reshape(32,32,3)
    img = Image.fromarray(data, 'RGB')
    print(name)
    img.save(name)

if __name__ == "__main__":
    dic = unpickle('cifar-10-batches-py/data_batch_1')
    image_from_cifar(random.randint(0,len(dic['filenames'])),dic)

    dic = unpickle('CUCUMBER-9-master/prototype_1/cucumber-9-python/data_batch_1')
    image_from_cucumber(random.randint(0,len(dic['filenames'])),dic)
```

それぞれのデータセットをカレントディレクトリに置いた状態で実行すると、ランダムに一枚取り出して画像として保存してくれます。

![tabby_cat_s_000125.png](https://qiita-image-store.s3.amazonaws.com/0/50780/7f019a35-c18d-5cff-b582-80a271268972.png "tabby_cat_s_000125.png")

![2L_00153.jpg](https://qiita-image-store.s3.amazonaws.com/0/50780/8eefcf1c-b129-c3c1-5d5a-b80e5d4a8d28.jpeg "2L_00153.jpg")
mod_wsgiの"Compiled for ~" warning について

mod_wsgiを```libapache2-mod-wsgi```でインストールすると、一つ落とし穴があります。
以下のコマンドでLogファイルを確認してください。

```bash
vim /var/log/apache2/error.log
```

きっと、このようなwarning(環境によってやや異なると思います)が記述されているのではないでしょうか

```
[Mon Feb 13 14:10:22.233656 2017] [wsgi:warn] [pid 10526:tid 139972854908800] mod_wsgi: Compiled for Python/2.7.8.
[Mon Feb 13 14:10:22.233725 2017] [wsgi:warn] [pid 10526:tid 139972854908800] mod_wsgi: Runtime using Python/2.7.9.
```

これは、文字通りwsgiをコンパイルしたpythonと現在使用されているpythonのバージョンが違うよ、と言っています。

ということで、これを解決するために、pipを使ってmod_wsgiをインストールし直します。
ただ、その前に[pyenvをインストール](http://qiita.com/shigechioyo/items/198211e84f8e0e9a5c18)してください。

```bash
pip install mod_wsgi
```

すると、このようなファイルが作成されます

```
/home/USERNAME/.pyenv/versions/3.5.2/lib/python3.5/site-packages/mod_wsgi/server/mod_wsgi-py35.cpython-35m-x86_64-linux-gnu.so
```

apache2がこのファイルを読みにいくように設定ファイルを変更します。

```bash
sudo vim /etc/apache2/mods-available/wsgi.load
```

moduleのパスを記載します。先ほどインストールしたpyenvのモジュールを指定してください。
(なお、```USERNAME```の変更を忘れないでください)

```
LoadModule wsgi_module /home/USERNAME/.pyenv/versions/3.5.2/lib/python3.5/site-packages/mod_wsgi/server/mod_wsgi-py35.cpython-35m-x86_64-linux-gnu.so
```

上記を行なった上でapache2を再起動します。

```bash
sudo service apache2 restart
```

これで再度```(ドメイン名、またはIPアドレス)/test_wsgi```にアクセスするとHello Worldが描画され、Warningは発生しなくなるはずです。

なお、ubuntuで進めていると、ubuntuのバグ([command-not-found fails when user-installed python3 is in PATH](https://bugs.launchpad.net/command-not-found/+bug/1480388))により```ImportError: No module named '_sysconfigdata_m'```が発生しますので、Debianを推奨します。
JavaでGoogle Cloud Storageのオブジェクトリストを取得する

# はじめに
JavaでGoogle Cloud Storageのオブジェクトリストを取得する方法です。

認証まわりとか、特定のディレクトリのみ取得とかのシンプルな方法を探すのに苦労しました :tired_face: 

# build.gradle
`google-cloud-storage`だけでOKです。

```groovy:build.gradle
apply plugin: 'java'
apply plugin: 'application'

repositories {
  mavenCentral()
}

dependencies {
    compile 'com.google.cloud:google-cloud-storage:0.9.4-beta'
}

mainClassName = "GCSList"

run {
    if (project.hasProperty('args')) {
        args project.args.split('\\s+')
    }
}
```

# コード
特定のディレクトリ配下のオブジェクトに一覧を出力するコードです。

コマンドライン引数でサービスアカウントのJSON Keyのパスを指定できるようになってます。
引数がなければデフォルトのアカウントを使うようになっています。[^1]

[^1]: `gcloud auth login`とかするやつ

```java:src/main/java/GCSList.java
import com.google.auth.oauth2.ServiceAccountCredentials;
import com.google.cloud.Page;
import com.google.cloud.storage.Blob;
import com.google.cloud.storage.Bucket;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;

import java.io.*;
import java.util.Iterator;

public class GCSList {
    private static final String BUCKET = "mybucket";
    private static final String PREFIX = "dir1/dir2/";

    public static void main(String args[]) throws IOException {
        Storage storage;
        if (args.length > 0) {
            storage = getStorageFromJsonKey(args[0]);
        } else {
            storage = StorageOptions.getDefaultInstance().getService();
        }

        Bucket bucket = storage.get(BUCKET);

        // 特定のディレクトリのみに絞る
        Storage.BlobListOption option = Storage.BlobListOption.prefix(PREFIX);

        Page<Blob> blobs = bucket.list(option);
        Iterator<Blob> blobIterator = blobs.iterateAll();

        while (blobIterator.hasNext()) {
            System.out.println(blobIterator.next().getName());
        }
    }

    private static Storage getStorageFromJsonKey(String key) throws IOException {
        return StorageOptions.newBuilder()
                .setCredentials(ServiceAccountCredentials.fromStream(new FileInputStream(key)))
                .build()
                .getService();
    }
}
```

# 実行
JSON Keyを使う場合

```bash
$ ./gradlew run -Pargs="/path/to/key.json"
```

使わない場合

```bash
$ ./gradlew run
```

# おわりに
今回のコードはこちらにあります :pencil:
https://github.com/nownabe/examples/tree/master/list-gcs-java
[iOS10] Today Extension (Widget)のハマりどころ (iPad)

iOS10のToday Extension (Widget)を開発中にハマったところを書きます。

## 環境

OS：  iOS10
デバイス： iPad (iPad Pro 12.9インチを除く)


## ウィジェットの配置
iPadで画面をLandscapeにした時、ウィジェットを左列か右列に配置できます。

![Simulator Screen Shot 2017.03.12 14.37.37.png](https://qiita-image-store.s3.amazonaws.com/0/95033/8de92d4e-8353-a7e5-c415-f81a59d11c26.png)



画面をPortraitにしたときは1列になります。
(iPad Pro 12.9インチを除く)

![Simulator Screen Shot 2017.03.12 14.39.08.png](https://qiita-image-store.s3.amazonaws.com/0/95033/1603a2ff-2baf-af7f-c417-5eabb50e29c8.png)


## ハマりどころ

問題はウィジェットを右列に配置したときで、例えばLandscapeからPortraitに画面を回転したときは、ウィジェットの画面サイズが変化するのではなく、Landscape用ウィジェットが終了しつつ、Portrait用ウィジェットが起動します。

つ・ま・り、**Landscapeで表示しているウィジェットとPortraitで表示しているウィジェットは別のインスタンスです。**

###### 注釈
* ウィジェットを左列に配置したときは発生しません。
* iPad Pro 12.9インチでは、ウィジェットが常に２列なので発生しません。
* iPhone6Plus系の画面回転では発生しません。

## ログ
LandscapeからPortraitにしたとき

| Landscape 右列    |   Portrait       |
|:-------------------|:------------------|
| viewWillDisappear             |        |
|            |   viewDidLoad()          |
|             |  widgetActiveDisplayModeDidChange(_:withMaximumSize:)            |
|               | widgetPerformUpdate(completionHandler:)              |
| viewDidDisappear             |             |
|           | viewWillAppear           |
| deinit          |            |
|           | viewDidAppear           |

## 問題
「画面の回転ではウィジェットの画面サイズが変わるだけ」という前提でコーディングすると、画面を回転したら初期値が表示される等の現象に見舞われます。

## 対策
**viewWillDisappear**でUserDefaultsなどにデータを保存し、もう１つのインスタンスが**viewWillAppear**で読み出すようにして、データを同期するようにします。
**deinit**でデータを保存していると、もう１つのインスタンスが既に起動しているので、データが同期できません。
Google Cloud Functionsでバベる(Babel)

## 概要

先日Google Cloud FunctionsのBetaがリリースされました。

実行エンジンのNode.jsのバージョンは現在6.9.1(2017/03/12時点)ですが、async/await等の更に新しい構文を使いたい場合はBabelを利用する必要があります。今回はBabelでコンパイルしてデプロイが出来るようにしてみたいと思います。

## Babel設定

以下、Babel関連のライブラリと設定ファイルです。


```package.json
{
  ...
  "devDependencies": {
    "babel-cli": "^6.23.0",
    "babel-core": "^6.23.1",
    "babel-loader": "^6.3.2",
    "babel-preset-es2015": "^6.22.0",
    "babel-preset-es2016": "^6.22.0",
    "babel-preset-es2017": "^6.22.0",
    "babel-register": "^6.23.0"
  },
  ...
```


`.babelrc`

```.babelrc
{
  "presets": [
    "es2015",
    "es2016",
    "es2017"
  ]
}
```

ES2015, ES2016, ES2017のPresetが使えるようにしています。


npm installしておきます。

```bash
npm install
```

## Functionコード

FunctionのタイプはHTTPをトリガーにしたものとBackgroundで起動するものとありますが、今回はHTTPのものを作成します。ソースコードはsrcディレクトリ以下に配置します。

```src/index.js
import uuid from 'uuid'

export const helloBabel = (req, res) => {
  res.send(`Hello babel gcf! - ${uuid()}`)
}
```

依存ライブラリを追加した場合の動作も確認するため、
[Handling Dependencies  |  Cloud Functions Documentation  |  Google Cloud Platform](https://cloud.google.com/functions/docs/writing/dependencies)
の例に参考にし、uuidを利用しています。

```bash
npm install uuid --save
```

## Bucketを用意

デプロイ前に、Functionを配置するためのBucketを用意しておく必要があります。

```bash
PROJECT_ID=your-project
BUCKET_NAME=your-bucket

gsutil mb -p $PROJECT_ID gs://$BUCKET_NAME
```

※gsutilコマンドを使うには[Cloud Tools](https://cloud.google.com/sdk/docs/) をインストールする必要があります


## デプロイ

~~Google Cloud Functionのデプロイコマンド(`gcloud beta functions deploy`)では、index.jsファイルが直下に配置されていることを想定しているようです。どのfunctionを起動させるかfunction名を指定することはできるんですが、ファイルパスを指定することは出来無さそうでした(出来るなら知りたいです..)。~~

※2017/10/02 コメントで指摘頂き修正しました。package.jsonの`"main"`で対象ファイルパスを指定可能です。


package.jsonのscriptsに以下のスクリプトを登録しておきます。


```package.json
{
  ...,
  "scripts": {
    "clean": "rm -fr ./dist",
    "transpile": "babel src --out-dir dist",
    "deploy": "npm run clean && npm run transpile && gcloud beta functions deploy hello-babel-gcf --entry-point helloBabel --stage-bucket hello-cloud-functions --trigger-http"
  },
  ...
}
```

```
npm run deploy
```

でデプロイ実行できます。

## Functionの実行

HTTPでリクエストを送ってみると、以下のように結果が返ってくることが確認できます。

```bash
$ curl https://us-central1-cloud-function-sandbox.cloudfunctions.net/hello-babel-gcf
Hello babel gcf! - 790c9410-9b2a-4593-b86f-fca40375e8ff
```

## まとめ

ひとまずこれでバベることが出来るようになりました。
php-build on macOS Sierraのエラー例

macOS Sierraで `phpenv install 7.1.2` したら見慣れないエラーでしばらく格闘してしまったので備忘録

## おまじない



```shell-session
brew install openssl libxml2 autoconf automake libjpeg libpng libmcrypt
export PHP_BUILD_CONFIGURE_OPTS=--with-openssl=/usr/local/opt/openssl --with-libxml-dir=/usr/local/opt/libxml2
export PHP_BUILD_EXTRA_MAKE_ARGUMENTS=-j4
```

Homebrewのopenssl、libxml2を参照するようにconfigureオプションを修正しておく

---

```shell-session:エラー
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: archive member: ext/opcache/.libs/opcache.a(libssl.a) fat file for cputype (7) cpusubtype (3) is not an object file (bad magic number)
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar: internal ranlib command failed
make: *** [ext/opcache/opcache.la] Error 1
make: *** Waiting for unfinished jobs....
```

```shell-session:エラー(末尾)
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/signal.h:103:39: warning: pointer is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified) [-Wnullability-completeness]
void    psignal(unsigned int, const char *);
                                         ^
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/signal.h:106:31: warning: pointer is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified) [-Wnullability-completeness]
int     sigvec(int, struct sigvec *, struct sigvec *);
                                  ^
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/signal.h:106:48: warning: pointer is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified) [-Wnullability-completeness]
int     sigvec(int, struct sigvec *, struct sigvec *);
                                                   ^
346 warnings generated.
```

→Homebrewのopensslを`--universal`オプション付きでインストールしている
無印で再インストール

```shell-session:コマンド
brew uninstall --ignore-dependencies openssl
brew install openssl
```

---

```shell-session:エラー
configure: error: cannot find sources (README.GIT-RULES) in . or ..
```

→ソースコードが不完全
キャッシュディレクトリを削除してDLから再試行する
`[Preparing]: `で始まる行のパスを削除


```shell-session:コマンド
rm -rf /var/folders/z0/q7xv_xd91kx44v_cnmn4yd780000gn/T/php-build/source/5.6.30
```

---

```shell-session:エラー
configure: error: in `/var/folders/z0/q7xv_xd91kx44v_cnmn4yd780000gn/T/php-build/source/7.1.2':
configure: error: C compiler cannot create executables
See `config.log' for more details
```

→brewのopensslが破損している

```shell-session:コマンド
brew reinstall openssl
```

---
Wi-SUN対応無線モジュール（BP35C0-T01）とラズパイを繋ぐ。（検討編）

# Wi-SUN対応無線モジュール（BP35C0-T01、以下無線モジュール）について
- [Rohmのサイト](http://www.rohm.co.jp/web/japan/news-detail?news-title=2015-01-07_ad&defaultGroupId=false)によると、『スマートコミュニティに最適な国際無線通信規格「Wi-SUN（Wireless Smart Utility Network)」に対応可能な920MHz帯特定小電力無線モジュール』だそうです。
- [Ｂルートサービス](http://www.tepco.co.jp/pg/consignment/liberalization/smartmeter-broute.html)に申し込んでスマートメーターに切り替わったので、これとの通信をやってみよう、というのが今回の趣旨です。
    - [こちらの記事](http://qiita.com/rukihena/items/82266ed3a43e4b652adb)に触発されて、やりたくなってしまいました。
    - 本当は、USBドングルのBP35C2が欲しかったのですが、入手が困難なようで…
- 今回の検討編を踏まえて無線モジュールなどの部品を入手し、制作・実験編は次回です。

---

# 無線モジュールとラズパイの接続
- 接続方法は、いろいろ考えられます。
    1. 専用ドータボード（BP359C）を使って、USB（もしくはシリアル）経由で繋ぐ。
        - このボードの価格は、約7000円だそうです。（2017年3月現在）
    2. BP359C相当を自作する。
        - メーカーが[ハードウェア仕様書（回路図）](http://micro.rohm.com/jp/download_support/wi-sun/data/document/bp359c_hardware_spec_v100_j.pdf)を提供してくれているので、あまり難しくないと思います。
        - BP359CはシリアルとUSBを切り替えて使えるようになっていますが、多くの場合、どちらかしか使わないんじゃないでしょうか。それなら、使う方だけ実装すればよいんじゃないか、と。
        - 正直、これで7000円は高い気がする。（個人的感想です）
- で、基本的には選択肢２で。
    - [無線モジュールのハードウェア仕様書](http://micro.rohm.com/jp/download_support/wi-sun/data/document/bp35c0-hardware_spec-j.pdf)を見ると、電源電圧が3.3Vとなっており、信号レベルも同様。
    - [ラズパイ上のピンヘッダ](https://pinout.xyz/pinout/pin1_3v3_power#)でも、3.3V電源とUART信号（信号レベルは3.3V）が出ている。
    - これなら、直結でいけるんじゃないか、ということで、下表の通りに接続。
    - 通常、ラズパイのUARTはコンソール入出力で使われているので、アプリケーションが使う場合には設定変更が必要である模様。

|種別|ラズパイ|無線モジュール|備考|
|:-:|:-:|:-:|:-:|
|3.3V|1|CN1-4,CN1-5||
|GND|6|CN1-1,CN1-9,CN2-1,CN2-9||
|TxD|8|CN2-4|ラズパイから見て送信|
|RxD|10|CN2-5|ラズパイから見て受信|

---

# 無線モジュールとPCの接続
- 無線モジュールのファームウェア書き換えなどを考えると、PCとも繋げられるようにしておきたいです。
    - BP359Cの回路図を参考に、方針検討します。
        1. シリアルかUSBか
            - 最近のPCにはシリアル通信ポートがないので、USB接続の方がよさそう。
            - 手元にFT232RLがあるので、これを流用することにします。
        1. 無線モジュールへの電源供給
            - 消費電流は、ハードウェア仕様書によると、送信時typ.45mAで、max.50mAだそうです。
            - [FT232RLのデータシート](http://www.ftdichip.com/Support/Documents/DataSheets/ICs/DS_FT232R.pdf)を見ると、電源（+5V）はUSBからの供給で、50mAを上限として外部回路への3.3V出力もできる模様。
            - ギリギリなんとかなりそうなので、無線モジュールの電源（+3.3V）はFT232RLからもらうことにします。（ダメなら、三端子レギュレータを追加します）
        1. リセット回路
            - CN2-7に接続。
            - BP359Cでは[BU4827G](http://www.rohm.co.jp/web/japan/products/-/product/BU4827G)を使っているようです。
                - 閾値電圧は2.7V、オープンドレイン出力
            - 閾値電圧が2.1Vと、少し低いですが価格重視（５個で100円）で、[R111N211A](http://akizukidenshi.com/download/ds/ricoh/r3111x-j.pdf)を選択。
        1. DIPSW
            - ファームウェア書き換え時に設定が必要。
            - コネクタ接続は、下表の通り。
            - 各SWは、ONで+3.3Vにプルアップされるように。

|SW|ピン番|割り当て|
|:-:|:-:|---|
|1|CN1-6|BOOT_SEL1|
|2|CN1-7|BOOT_SEL0|
|3|CN1-8|FLASH_SEL|

---

# 部品表

|部品番号|部品名|型番|購入|備考|
|:-:|:-:|:-:|:-:|---|
|-|無線モジュール|BP35C0-T01|チップワンストップ||
|-|アンテナ|W1063M|チップワンストップ||
|IC1|USB-UART変換|FT232RL|手持品||
|IC2|リセットIC|R3111N211A|秋月電子||
|SW1-3|DIPSW||秋月電子||
|R1-4|抵抗|10K|手持品||
|R5|抵抗|100K|手持品||
|C1-2|コンデンサ|0.1uF|手持品||
|C3|コンデンサ|100pF|手持品||
|CONN1|USBコネクタ||秋月電子||

---

# 回路図

![BP35C0_回路図.png](https://qiita-image-store.s3.amazonaws.com/0/166435/83f8ac03-a5c7-fe42-22c1-1ebaf4e2bf22.png)
ジェネリクスの型パラメータの命名について

<a target="_blank" href="https://www.amazon.co.jp/dp/4297112132?&_encoding=UTF8&tag=tanapon256-22&linkCode=ur2&linkId=66e4edce678aeaae88ee05ac91858573&camp=247&creative=1211">Swift実践入門 </a>を読んでいて、ジェネリクスの型パラメータの命名が気になり少し調べてみました。


Swiftのリファレンス読むと、型パラメータには... 
「基本的に説明的な名前をつけるが、意味が無いときは伝統的にT,V,Uをつけるのが一般的」（だいぶ端折った） と記載があり、個人的にTやUの意味が気になりました。

下記[Swift](https://docs.swift.org/swift-book/documentation/the-swift-programming-language/generics/#Naming-Type-Parameters)のドキュメントから
>Naming Type Parameters

>In most cases, type parameters have descriptive names, such as Key and Value in Dictionary<Key, Value> and Element in Array<Element>, which tells the reader about the relationship between the type parameter and the generic type or function it’s used in. However, when there isn’t a meaningful relationship between them, it’s traditional to name them using single letters such as T, U, and V, such as T in the swapTwoValues(_:_:) function above.

ジェネリクスとはJavaで出会ったことを思い出し、[Javaの命名規約](https://docs.oracle.com/javase/tutorial/java/generics/types.html)を見たところ、EはElement、TはTypeの略と分かり、SやUにはn番目の型以上の意味が無いことが分かりました。そして` single, uppercase letters ` だけではアプリケーションのプログラミングにカジュアルにジェネリクスが登場する現代のプログラミング環境では流石に意味が曖昧すぎるとも感じました。（T,U,V,W,X,Y,Zとつけていくことを想定していそうです、Wまでいった時点で設計がおかしい可能性が高いと思いますが）

> Type Parameter Naming Conventions
By convention, type parameter names are single, uppercase letters. This stands in sharp contrast to the variable naming conventions that you already know about, and with good reason: Without this convention, it would be difficult to tell the difference between a type variable and an ordinary class or interface name.

> The most commonly used type parameter names are:

> E - Element (used extensively by the Java Collections Framework)
K - Key
N - Number
T - Type
V - Value
S,U,V etc. - 2nd, 3rd, 4th types  



ちなみにAPIKit内部でも利用されている[Result](https://github.com/antitypical/Result)を抜粋するとsuccessの時はT、エラーの時はErrorと意味を表現できる最低限の命名を使っています。

```
/// An enum representing either a failure with an explanatory error, or a success with a result value.
public enum Result<T, Error: Swift.Error>: ResultProtocol, CustomStringConvertible, CustomDebugStringConvertible {
	case success(T)
	case failure(Error)
``` 

swap関数は2値を入れ替えるだけなのでシンプルにTのみでした。

```
/// - Precondition: `a` and `b` do not alias each other.
public func swap<T>(_ a: inout T, _ b: inout T)  
```  

### まとめ  

1. 標準ライブラリの関数など型の意味が自明、スコープが短いケースはTなど省略形が良さそう
1. 意味が非自明で正確に表現する必要があるなら具体的な命名が良い `<E>` よりも `<Error>`
もっとSetを使おう【Collections Framework】

Javaでは配列ではなくArrayListってのを使うんだ。へー
くらいの知識の人向け


```java:重複なしに値を持ちたい
List<String> list = new ArrayList<String>();

〜様々な処理〜

String itemNo = get〇〇

if(list.contains(itemNo)){//値を重複させない
  list.add(itemNo);
}
```

# 重複削除ロジックを書くのではなく、コレクションのSetを使うべき

Setというのは重複要素の無いコレクションのこと
equalsを使って同値のインスタンスを2つ以上含まないようになっている。

ちなみに名前のSetは集合論の「集合」の英語版(多分)。
集合は重複要素を認めないため(自然数の集合等)

```java:重複なしに値を持ちたい
Set<String> set = new HashSet<String>();

〜様々な処理〜

String itemNo = get〇〇

//↓重複排除はequals()をつかってsetが行ってくれるので記述不要
//if(list.contains(itemNo)){//値を重複させない
set.add(itemNo);
//}
```

記述が少なくて書きやすい & 読みやすい & 理解しやすい
そもそもSetを使うことで重複を持たないことが明示できる。

# 遅くならないの？

実際に計測

```java:計測
		List<Integer> list = new ArrayList<>();
		Long start = System.nanoTime();
		for(int i=0;i<100;i++){
			for(int j=0;j<100;j++){
				
				Integer num= i+j;

				if(!list.contains(num)){
				  list.add(num);
				}	
				
			}
			
		}
		Long end = System.nanoTime();

		System.out.println("list time:"+ String.valueOf(end - start));
		System.out.println(list);
		
		Set<Integer> set = new HashSet<>();
		Long start2 = System.nanoTime();
		for(int i=0;i<100;i++){
			for(int j=0;j<100;j++){
				Integer num= i+j;
				set.add(num);
			}
			
		}
		Long end2 = System.nanoTime();

		System.out.println("set time :"+String.valueOf(end2 - start2));
		System.out.println(set);
```

list time:10748381
[0, 1, 2, 3, 4, 5 ~略~
set time :5471075
[0, 1, 2, 3, 4, 5 ~略~ //※たまたま降順になっているが、順番は保証されない。


2倍近い差が出た。
何度か検証したが、概ね1.2~3倍の差が出てSetの方が速い。
ただしここで言いたいことは高速化のために使いましょうじゃなくて、
パフォーマンス低下は心配して、Setを使わないという配慮は不要。