OmniAICreator/Qiita-1.07M huggingface dataset:
【Swift】Genericとtypealiasを使ったら"compiler segmentation fault when building"が起きた


以下のクラスを作成したところ、"compiler segmentation fault when building"が出力されてコンパイルエラーになりました。

**環境**

| Xcode Version | Swift Version |
|:-:|:-:|
| 6.4 | 1.2 |

```swift:BaseModel.swift

import UIKit

protocol BaseModel: NSObjectProtocol {

	/// 変換するモデルクラス
	typealias ModelType
	
	/**
	APIからのレスポンスをModelTypeの変換する
	
	:param: response		APIからのレスポンス
	
	:returns: 変換できたらModelTypeを返す。できなければnil。
	*/
	static func toModel(#response: AnyObject!) -> ModelType?
}
```

```swift:APIArrayResult.swift

import UIKit

class APIResult<T: ModelType> {

	/// APIからのレスポンスを変換したクラス
	var model: T.ModelType? = nil
	
	/**
	init
	
	:param: response		APIからのレスポンス
	:returns: self
	*/
	init(response: AnyObject!) {
		self.model = T.toModel(response: response)
	}
	
}
```

コンパイルエラーが差していた箇所は`APIResult`が保持する`var model: T.ModelType?`の部分でした。

なので以下のように書き換えたところ、コンパイルエラーがなくなりました。

```swift:APIArrayResult.swift

import UIKit

class APIResult<T: ModelType> {

	var model: Optional(T.ModelType) = nil
	
	init(response: AnyObject!) {
		self.model = T.toModel(response: response)
	}
}
```

何が気に食わなかったのでしょうか...。
ZYNQ(ARM Cortex-A9)でCPUのデータキャッシュの効果を確認する


## はじめに ##

最近のCPUには例外なく命令キャッシュとデータキャッシュを持っています。
あまりにも一般的になりすぎて、キャッシュがどのくらい効果があるのか知らない人もいると思います。

先日投稿した [Linuxでユーザー空間で動作するプログラムとハードウェアがメモリを共有するためのデバイスドライバ](http://qiita.com/ikwzm/items/cc1bb33ff43a491440ea) で紹介した [udmabuf](http://github.com/ikwzm/udmabuf)を使えば、バッファのメモリ空間のデータキャッシュの設定を変更することが出来ます。
この機能を使って、データキャッシュがどのくらい効果があるか測定しました。

## 測定環境 ##

 * ハードウェア : ZYBO Zynq-7000
 * CPU : ARM Cortex-A9
 * レベル1 キャッシュ : 32KB  4ウェイセットアソシエイティブ
 * レベル2 キャッシュ : 512KB 8ウェイセットアソシエイティブ
 * 外部メモリ : DDR3 512MB x32 1050Mbps
 * 動作周波数 : 650MHz
 * OS : Linux Kernel Version 3.8

## データキャッシュの設定 ##

udmabuf で出来るデータキャッシュの設定は次の４通り。詳細は udmabuf の説明を参照してください。

  * データキャッシュあり

  * データキャッシュなし + ライトコンバインなし

  * データキャッシュなし + ライトコンバインあり

  * DMAコヒーレンシモード

ただし、最後のDMAコヒーレンシモードに関しては未だ詳細は不明です。今回の測定では除外します。

ライトコンバインは、連続したアドレスに連続して書き込む場合、それらの書き込みをまとめて行います。

## 測定用のプログラム ##

次のようなプログラムを走らせて処理時間を計測しました。

```C:udmabuf_test.c
int check_buf(unsigned char* buf, unsigned int size)   
{   
    int m = 256;   
    int n = 10;   
    int i, k;   
    int error_count = 0;   
    while(--n > 0) {   
      for(i = 0; i < size; i = i + m) {   
        m = (i+256 < size) ? 256 : (size-i);   
        for(k = 0; k < m; k++) {   
          buf[i+k] = (k & 0xFF);   
        }   
        for(k = 0; k < m; k++) {   
          if (buf[i+k] != (k & 0xFF)) {   
            error_count++;   
          }   
        }   
      }   
    }   
    return error_count;   
}   
int clear_buf(unsigned char* buf, unsigned int size)
{
    int n = 100;
    int error_count = 0;
    while(--n > 0) {
      memset((void*)buf, 0, size);
    }
    return error_count;
}
```

## 測定結果 ##

<table border="2">
  <tr>
    <td align="center" rowspan="2">プログラム</td>
    <td align="center" rowspan="2">データ<br>キャッシュ</td>
    <td align="center" rowspan="2">ライト<br>コンバイン</td>
    <td align="center" colspan="3">DMAバッファのサイズ</td>
  </tr>
  <tr>
    <td align="center">1MByte</td>
    <td align="center">5MByte</td>
    <td align="center">10MByte</td>
  </tr>
  <tr>
    <td rowspan="3">check_buf</td>
    <td>有効</td>
    <td>-</td>
    <td align="right">0.437[sec]</td>
    <td align="right">2.171[sec]</td>
    <td align="right">4.375[sec]</td>
  </tr>
  <tr>
    <td rowspan="2">無効</td>
    <td>無</td>
    <td align="right">2.283[sec]</td>
    <td align="right">11.414[sec]</td>
    <td align="right">22.830[sec]</td>
  </tr>
  <tr>
    <td>有</td>
    <td align="right">1.655[sec]</td>
    <td align="right">8.391[sec]</td>
    <td align="right">16.587[sec]</td>
  </tr>
  <tr>
    <td rowspan="3">clear_buf</td>
    <td>有効</td>
    <td>-</td>
    <td align="right">0.067[sec]</td>
    <td align="right">0.362[sec]</td>
    <td align="right">0.717[sec]</td>
  </tr>
  <tr>
    <td rowspan="2">無効</td>
    <td>無</td>
    <td align="right">0.914[sec]</td>
    <td align="right">4.563[sec]</td>
    <td align="right">9.128[sec]</td>
  </tr>
  <tr>
    <td>有</td>
    <td align="right">0.062[sec]</td>
    <td align="right">0.310[sec]</td>
    <td align="right">0.621[sec]</td>
  </tr>
</table>
ChatOpsを活用するためのフレームワークについて考えてみた


## はじめに
hubotの動かし方を覚えたら、いろいろな通知を飛ばしたくなりますよね。
というわけで **みんなに喜んでもらえるものを作るにはどうしたらいいか** を思いつくフレームワークっぽいものについてちょっと考えてみました[^1]。

## 分類してみる

問題点の洗い出しの手がかりとして、まずはチャットに飛ばしたい通知を分類してみたいと思います。
だいたいこんな感じでしょうか。

#### **警報**

　ある一定の閾値に達したときに飛ばす通知
　　例）サーバーのアラート

#### **言及**

　特定のユーザーに対してのアクションが行われたときに飛ばす通知
　　例）Githubでのメンション / Redmineのチケット割り当て

#### **結果**

　特定のアクションに対しての成功・失敗などの結果を飛ばす通知
　　例）Jenkinsのデプロイ結果 / バッチ処理の結果

#### **日課**

　定期的に確認したい事象へ飛ばす通知
　　例）GithubのPullRequest確認 / GoogleAnalyticsのデイリーサマリー / お昼休憩

#### **喚起**

　予定に対してのリマインドとして飛ばす通知
　　例）スケジュールの期限


## 連想してみる

次に分類されたものから現状の開発で不便な点、不満な点を連想していきます。
例えば…

```
【結果】
毎日実行されているバッチ処理の結果がメールで届くけど、いちいち見ないとわからないのが不便だなー。

【日課】
会社としてお昼休憩の時間が決まっているのにみんなだらだら過ごしてるのはいや！
```

これらを解決するための通知を考えたらOKなわけです。
つまり、「バッチ終了後にその結果をチャットに飛ばす」という機能を作れば、みんなが喜んでくれそうな気がしてきました。

## 精査してみる

作りたい通知機能を考えたとして、それが **「誰に」「いつ」「何を」伝えたいか** という観点でもう一度精査してみると、気づかなかったところに気づいたりします。

例えば、さっきのバッチ処理の結果をチャットに流すという機能は、`「担当者」に「バッチが終了した時」に「結果」を` 伝えるということになります。
ですが、毎日来るものだとそれ自体に慣れてしまって、失敗した時も見過ごしてしまいがちです。
観点を変えてみて、`「担当者」に「バッチが失敗した時」に「警告」を` に伝えたいという風にしてみるといいかもしれません。
つまり、バッチが失敗した場合に（もしくは一定時間内に完了しなかった場合に）チャットに流す、という形にすると、失敗した時だけ通知が飛ぶようになり、見逃すこともなくなるという具合です。

## おわりに

せっかく作るんだからみんなに喜んでほしいですよね！
というわけで、こんな感じで通知を考えると、少しでもみんなに喜んでもらえるものが作れるんじゃないかなーと思います[^2]。
<br>
------

[^1]: ChatOpsと言えるかちょっと曖昧なところですが、今回はSlackで言うところの `Incoming WebHooks` についてだけ書いています。`Outgoing WebHooks` のほうは自分が意図して使うものなので喜んでもらえるかどうかではなく、自分がほしいかどうかで決めたらいいと思います。

[^2]: フレームワークとしては[欠点列挙法](http://www.d1.dion.ne.jp/~ppnet/prod081.htm)を参考にしています。
crontab 曜日設定などメモ

# 参考URL
http://www.k4.dion.ne.jp/~mms/unix/linux_com/crontab.html
# 編集
crontab [-u ユーザー]　-e
# 閲覧
crontab [-u ユーザー]　-l
# 書式
## 分　時　日　月　曜日　コマンド
# 曜日の書き方
## 曜日を「0～7」（0,7は日曜日）または「sun～sat」で指定。ワイルドカード(*)を指定すると毎日。
0 sun
1 mon
2 tue
3 wed
4 thu
5 fri
6 sat
# サンプル
*/5 * * * 5 /usr/bin/python test.py > /tmp/test.log 2>&1
## 毎週金曜日だけ5分毎で実行。コマンドのpathは明示的にfull pathにしておくとdebugしやすいtips
OpenCVによるUSBカメラ画像の取得

#OpenCVによるUSBカメラ画像の取得
OpenCVでは，`cv::VideoCapture`で，USB接続したカメラから簡単に画像を取得することができる．

以下では，[公式サンプル](http://docs.opencv.org/3.0-beta/modules/videoio/doc/reading_and_writing_video.html)を一部改変したコードで説明していく．


基本的な手順は
1. カメラデバイスのオープン．
2. カメラ画像の取得と画面への描画．
3. デバイスの解放．

```cpp
#include "opencv2/opencv.hpp"

int main(int argh, char* argv[])
{
    cv::VideoCapture cap(0);//デバイスのオープン
    //cap.open(0);//こっちでも良い．
    
    if(!cap.isOpened())//カメラデバイスが正常にオープンしたか確認．
    {
        //読み込みに失敗したときの処理
        return -1;
    }

    cv::Mat frame; //取得したフレーム
    while(cap.read(frame))//無限ループ
    {
        //
        //取得したフレーム画像に対して，クレースケール変換や2値化などの処理を書き込む．
        //

        cv::imshow("win", frame);//画像を表示．
        const int key = cv::waitKey(1);
        if(key == 'q'/*113*/)//qボタンが押されたとき
        {
            break;//whileループから抜ける．
        }
        else if(key == 's'/*115*/)//sが押されたとき
        {
            //フレーム画像を保存する．
            cv::imwrite("img.png", frame);
        }
    }
    cv::destroyAllWindows();
    return 0;
}
```


##USBカメラのオープン
* `cv::VideoCapture`を用いて，USBカメラにアクセスを行う．
* `cv::VideoCapture::open()`の引数によって，開くカメラデバイスを選択する．
    * 筆者の環境(Macbook Air)では，内蔵インカメラが0で，USBで接続したカメラに1以降が割り当てられている．
* USBカメラが正常にオープン出来たかはisOpen()を呼ぶことで確認できる．

```cpp
cv::VideoCapture cap(0);//デバイスのオープン
//cap.open(0);//こっちでも良い．
    
if(!cap.isOpened())//カメラデバイスが正常にオープンしたか確認．
{
    //読み込みに失敗したときの処理
    return -1;
}
```

##USBカメラ画像の表示
* カメラ画像を連続して取得する場合などは，while文やfor文などのループ中に，画像の取得や描画処理を書き，`cv::imshow()`で表示する．
* ある条件を満たしたらbreakを呼ぶようにすることでループから抜けて処理を終了する．
    * 以下のサンプルでは，`cv::waitKey()`で取得したキー入力を終了のための条件としている．

while文の中で行っている手順は以下の通り．

* `cv::VideoCapture::read()`で現在のフレームを`cv::Mat`に取得する．
    * `cv::VideoCapture::read()`はフレーム取得に成功すると，`true`，失敗すると`false`を返すので，
    * 以下の例では，これをwhile文の継続条件としている．
* 取得した画像をcv::imshow()でウィンドウに描画する．
* cv::waitKey()でキー入力を受ける．
    * 引数は待ち時間(ms)．
    * 戻り値は押されたキーのアスキーコード．
* 取得したキーで終了や保存処理を行う．

```cpp
cv::Mat frame; //取得したフレーム
while(cap.read(frame))//無限ループ
{
    //
    //取得したフレーム画像に対して，クレースケール変換や2値化などの処理を書き込む．
    //

    cv::imshow("win", frame);//画像を表示．
    const int key = cv::waitKey(1);
    if(key == 'q'/*113*/)//qボタンが押されたとき
    {
        break;//whileループから抜ける．
    }
    else if(key == 's'/*115*/)//sが押されたとき
    {
       //フレーム画像を保存する．
       cv::imwrite("img.png", frame);
    }
}
cv::destroyAllWindows();// ウィンドウを閉じる．

return 0;
```

##デバイスの解放
* `cv::VideoCapture`のデストラクタが正常に呼ばれると自動的にデバイスは解放される．
* `cv::VideoCapture::release()`を呼ぶと明示的に解放することができる．
processingのrandom()とnoise()の違い

Processingで乱数を取得する関数にrandom()とnoise()がありますが、両者には違いがあります。

<h1>random()</h1>
乱数を呼び出すたびに取得し、返り値はfloat型になります。
引数に何も記述しないと0.0〜1.0の範囲の乱数を取得します。
random(max);
引数が1つのときは0〜maxの範囲の乱数を取得します。
random(min, max);
引数が2つのときはmin〜maxの範囲の乱数を取得します。

![スクリーンショット 2015-07-15 17.20.15.png](https://qiita-image-store.s3.amazonaws.com/0/84973/539f17e3-c1da-73b0-278c-eaa30a9c83b1.png)

```lang:random.pde
size(500,100);
background(255);
strokeWeight(5);
smooth();
stroke(0, 30);
line(20,50,480,50);

int step = 10;
float lastx = -999;
float lasty = -999;
float y = 50;
int borderx=20;
int bordery=10;

stroke(0);

for (int x=borderx; x<=width-borderx; x+=step) {
  y = bordery + random(height - 2*bordery); //from 10 to 90
  if (lastx > -999) {
    line(x, y, lastx, lasty);
  }
  lastx = x;
  lasty = y;
}
```
yの値は10から90の範囲を取得します。

<h1>noise()</h1>
こちらも乱数を取得しますが、正確にはパーリンノイズという主に自然物を描写する際に使用するノイズ値を取得します。
0.0から1.0の間のfloat型を取得します。

![スクリーンショット 2015-07-15 17.21.03.png](https://qiita-image-store.s3.amazonaws.com/0/84973/258250ed-5d95-82c5-4fb4-21b66bebe27b.png)

```lang:noise.pde
size(500, 100);
background(255);
strokeWeight(5);
smooth();
stroke(0, 30);
line(20, 50, 480, 50);
stroke(0);
int step = 10;
float lastx = -999;
float lasty = -999;
float ynoise = random(10);
float y;
for (int x=20; x<=480; x+=step) {
  y = 10 + noise(ynoise) * 80; //from 10 to 90
  if (lastx > -999) {
    line(x, y, lastx, lasty);
  }
  lastx = x;
  lasty = y;
  ynoise += 0.1;
}
```

この例では変数ynoiseをrandom(10)からはじめ、
その値を0.1ずつ増やしてnoise()の引数にしています。パーリンノイズはゲーム開発において炎、雲、水などに使用されているので、random()より自然な動きを作り出すことができます。
パーリンノイズについては奥が深く、今回は触り程度の内容なので、機会があれば続きを投稿したいと思います。

>[ジェネラティブ・アート―Processingによる実践ガイド](http://www.amazon.co.jp/%E6%99%AE%E5%8F%8A%E7%89%88-%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%A9%E3%83%86%E3%82%A3%E3%83%96%E3%83%BB%E3%82%A2%E3%83%BC%E3%83%88%E2%80%95Processing%E3%81%AB%E3%82%88%E3%82%8B%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-%E3%83%9E%E3%83%83%E3%83%88%E3%83%BB%E3%83%94%E3%82%A2%E3%82%BD%E3%83%B3/dp/4861009634)
DOM Keyboardイベントで押されたキーを判別するにはkeyプロパティを使う


エンターキー押下に反応するインタラクションを作りたいときなど、押されたキーを検出する話です。
入力文字列を検出する時は[input](https://developer.mozilla.org/en-US/docs/Web/Events/input)イベントを使います。

## keyプロパティが推奨

[key](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key)プロパティがあります。

```js
window.document.onkeydown = function(event){
	if (event.key === 'Enter') console.log('hello Enter')
}
```

詳しい仕様は以下を見てください。

- [DOM3 Eventsのキーイベント - JavaScriptで遊ぶよ - g:javascript](http://javascript.g.hatena.ne.jp/edvakf/20091114/1258241612)
- [UI Events (formerly DOM Level 3 Events)](http://www.w3.org/TR/DOM-Level-3-Events/#keys)

### 主要なブラウザでサポート
[KeyboardEvent.key - Web APIs | MDN](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key)
によるとと、2017/8/14日時点で

- Chrome
- Edge
- Firefox (Gecko)
- Internet Explorer
- Opera
- Safari (WebKit)

でサポートされています。

### polyfill
IE8や古いAndroidのブラウザをサポートしたい場合、keyプロパティを提供するpolyfillライブラリが存在します。

- [termi/DOM-Keyboard-Event-Level-3-polyfill](https://github.com/termi/DOM-Keyboard-Event-Level-3-polyfill)
- [inexorabletash/polyfill](https://github.com/inexorabletash/polyfill)

後者の方が[bowerパッケージ](http://bower.io/search/?q=js-polyfills)があるので多少使いやすいかもしれません。

## keycodeは非推奨

[KeyboardEvent.keyCode - Web API Interfaces | MDN](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode)によれば、keycodeプロパティは非推奨です。

    Deprecated
    This feature has been removed from the Web standards. Though some browsers may still support it, it is in the process of being dropped. Do not use it in old or new projects. Pages or Web apps using it may break at any time.


伝統的な次のソースコードは、これからは時代遅れになりつつあるようです。

```js
window.document.onkeydown = function(event){
	if (event.keyCode === 13) console.log('hello Enter')
}
```


## keyIdentifierは過去のプロパティ

ChromeとSafariにはkeyIdentifierというプロパティがありました。
使い方はkeyプロパティに似ています。

```js
window.document.onkeydown = function(event){
	if (event.keyIdentifier === 'Enter') console.log('hello Enter')
}
```

残念ながら現在のWeb標準からは消えています。
詳しくは以下を見てください。

- [SafariとChromeではkeyIdentifierが使えるので素晴らしすぎます - JavaScriptで遊ぶよ - g:javascript](https://javascript.g.hatena.ne.jp/edvakf/20090630/1246362440)
- [Chrome: keyIdentifierとOSとキーレイアウト](http://k2nr.me/blog/2011/09/30/chrome-keyidentifier.html)



## まとめ
主要なブラウザでkeyプロパティがサポートされています。
どんどん使っていきましょう！
Sencha Architect 3セットアップ

Ubuntu 14.04.2にて実施。要X環境

# 参考

* [Cmd Guides | Introduction to Sencha Cmd](http://docs.sencha.com/cmd/5.x/intro_to_cmd.html)
    * [ExtJS - よく使うSencha Cmdコマンド - Qiita](http://qiita.com/yuch_i/items/fa60d47e1a86e50ba877)

## SenchaArchitect-3

* [Download Sencha Architect - The Ultimate Visual HTML5 App Designer | Sencha](https://www.sencha.com/products/architect/download/)

```bash:SenchaArchitect-3
sudo apt-get install -y xdg-utils
chmod +x SenchaArchitect-3.2-x64.run
sudo ./SenchaArchitect-3.2-x64.run
#18 - 日本語
```

* /opt/SenchaArchitect3 にインストールされる。


## JDK1.8

* http://www.oracle.com/technetwork/java/javase/downloads/index.html
  * jdk-8u51-linux-x64.tar.gz をダウンロードした。

```bash:
tar xzf jdk-8u51-linux-x64.tar.gz
sudo mv jdk1.8.0_51 /opt/
```

## ruby

```bash:
sudo apt-get install -y ruby
```

* ruby 2.1.2が入った。

## Apache Ant

* http://ant.apache.org/bindownload.cgi
  * apache-ant-1.9.6-bin.tar.gz をダウンロードした。

```bash:
tar xzf apache-ant-1.9.6-bin.tar.gz
sudo mv apache-ant-1.9.6 /opt/
```

## Sencha Cmd 5

* Sencha Cmd 5.1.3 (Linux 64-bit) をダウンロード

```bash:
sudo apt-get install -y unzip
chmod +x SenchaCmd-5.1.3.61-linux-x64.run
sudo ./SenchaCmd-5.1.3.61-linux-x64.run
```

* /home/vagrant/bin にインストールされる。

## PATHの追加

```bash:~/.bashrc
export JAVA_HOME=/opt/jdk1.8.0_51
export ANT_HOME=/opt/apache-ant-1.9.6
export PATH=$JAVA_HOME/bin:$ANT_HOME/bin:$PATH
```

# Sencha IDの登録

* [Sencha Forumで登録](https://www.sencha.com/forum/register.php?langid=14)


# Sencha Architect 3の起動

* Sencha IDでログイン。30日間使える。
gitwatch > endsWith(s, ".wav") > ".wav"で終わるかどうか

https://github.com/kernel1024/qjrad/blob/a397556722dc37c96d3e3e90686544a7b868fa5d/goldendict/filetype.cc

>/// Checks if the given string ends with the given substring

```
bool endsWith( string const & str, string const & tail )
{
  return str.size() >= tail.size() &&
    str.compare( str.size() - tail.size(), tail.size(), tail ) == 0;
}
```

自分でこういう関数を作った時、isTerminatingWith...など長い名前にしてしまっていたが、EndsWithはシンプルでいいと思う。


https://msdn.microsoft.com/ja-jp/library/2333wewz(v=vs.110).aspx
.NET Frameworkでも .EndsWithメソッドがあるようだ。
【300選以上】海外企業・個人のTechブログまとめ【英語】

こちらにまとまっています。数が多い!参考にしてみてください!
kilimchoi/engineering-blogs
https://github.com/kilimchoi/engineering-blogs


# Techブログを追加する方法
英語の良いtechブログがあれば、Pull Requestをして、追加してみましょう。

自分は**LINEのブログ**を追加してみることにしました。

## Contribution Guidelines
これに基づいて追加します。
https://github.com/kilimchoi/engineering-blogs/blob/master/contributing.md

## READMEの更新
```README.md
* LINE http://developers.linecorp.com/blog/
```
「Name Link」の順番で書きます。アルファベット順に従い、上の追加します。

## opmlの更新
```
$bundle install
```
READMEを更新したらbundle installします。

```
$./generate_opml.rb
```
次に上のRubyファイルを実行して、opmlを更新します。

```engineering_blogs.opml
<outline type="rss" text="LINE" title="LINE" xmlUrl="http://developers.linecorp.com/blog/?feed=rss2" htmlUrl="http://developers.linecorp.com/blog/"/>
```
すると上記のコードが自動で生成されます。すごいw

# Gemfile.lockは更新してはいけません
自分は更新していて、怒られてしまいました。


Ruby - BUNDLED WITH で Gemfile.lock が更新されてしまう件 - Qiita
http://qiita.com/suu_g/items/2b1630b8015d51c5292e
# Pull Request → Merged
Pull Requestしてみると、Mergeされました。やった。
https://github.com/kilimchoi/engineering-blogs/pull/279

ブランチ名は企業やブログ作成者の名前で良いのではないでしょうか。タイトルは「Added XXXXX engineering blog and updated opml」みたいなのでOKだと思います。
RailsアプリをHerokuにデプロイして、エラーがでたけど、１行しか出なくて困った時・・

# We are sorry..ってやつ

デプロイして動かしてみたら、特定のページでエラーが発生した。
500 Internal server errorって感じ。

## Heroku logs

ログ見れるように準備して・・

```
$ heroku logs -t
```

もっかいブラウザでアクセス！

```
heroku/router:  at=info method=GET path="/questions/2" host=xxx.herokuapp.com request_id=xxx fwd="xxx.xxx.xxx.xxx" dyno=web.1 connect=3ms service=235ms status=500 bytes=1754 
```

１行だけ・・・・
全然わからん；；

教えてくれてるの ```status=500``` くらいじゃん・・

## もっと詳細なログを！

[Rails - Herokuでアプリケーションのログを出力する - Qiita](http://qiita.com/icb54615/items/209ab6dc646bfc7f9432)

コレだ！

早速gemの投入！

```Gemfile
gem 'rails_12factor', group: :production
```

を付け足して。。

```
$ bundle update
```

herokuにpushして・・


## Heroku logs

もう一度ログ見れるように準備して・・

```
$ heroku logs -t
```

ブラウザでアクセス！

```
SyntaxError (/app/app/views/comments/_index.html.haml:14: syntax error, unexpected ':', expecting ')'
...=>"close"}, nil, "area-hidden": true, "data-dismiss": "modal...
...                               ^
```

なんかどわっと出て来た！！（ばんざーい）

hamlのシンタックスエラーっぽい・・・

ローカルでは大丈夫だったんだけど・・なんか書き方間違えてるみたい。。

### （蛇足）エラーだった箇所

#### 間違い

Bootstrapのmodal使ってる箇所で、data-dismissとかの書き方がダメだったらしい。

```
%button.close{"area-hidden": true, "data-dismiss": "modal"} ×
```

#### 直した

ハッシュに直したら許された・・・

```
%button.close{ data: { dismiss: "modal"} } ×
```

そうなの？？ダメなの？？
間違いの書き方でも大丈夫って書いてあるトコが多かった（実際ローカルではエラーになってない）んだけど・・・
バージョンとかですかね・・？

とりあえず、ログ出せる方法がわかって良かった。。
YosemiteにPolipoを導入する。


##インストール。
```
brew install polipo
```

##cacheディレクトリを作成する。
```
mkdir ~/.polipo-cache
```

##config作成
		vi ~/Dropbox/config/polipo/config
```.bat:config
logFile = "~/polipo.log"
proxyAddress = "0.0.0.0"
allowedClients = "127.0.0.1
diskCacheRoot = "~/.polipo-cache/"
disableIndexing = false
disableServersList = false
dnsQueryIPv6 = no
#dnsNameServer = "[DNSサーバ]"
dnsUseGethostbyname = true
dontCacheRedirects = true
diskCacheUnlinkTime = 1d
logLevel = 0x1
scrubLogs = true
logSyslog = true
dnsMaxTimeout = 1s
dontCacheCookies = true
maxDiskEntries = 12
clientTimeout = 60s
serverTimeout = 60s
maxPipelineTrain = 16
serverSlots = 8
serverSlots1 = 16
serverMaxSlots = 512
pipelineAdditionalRequests = false
```

※dnsNameServerはDNSサーバが変わらないようなルータを通している場合などに指定すると良い。
私はテザリングに有線にとコロコロ変わるのでdnsUseGethostbynameを設定している。
serverSlots,serverSlots1,maxPipelineTrain
この三つはRFC違反になるのであまり数値を多くしないように
多すぎるとルータが死んでしまうかも


##自動起動設定ファイル作成
		vi ~/LaunchAgent/org.dohq.polipo.plist
```org.dohq.polipo.plist
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>KeepAlive</key>
        <dict>
            <key>SuccessfulExit</key>
            <false/>
        </dict>
        <key>Label</key>
        <string>org.dohq.polipo</string>
        <key>ProgramArguments</key>
        <array>
            <string>/usr/local/bin/polipo</string>
            <string>-c</string>
            <string>~/Dropbox/config/polipo/config</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
        <key>EnableGlobbing</key>
        <true/>
    </dict>
</plist>
```

##自動起動設定
```
launchctl load Library/LaunchAgents/org.dohq.polipo.plist
```

##動作確認
お疲れ様でした。
あとは普段ご使用のブラウザにlocalhost:8123を設定してHPを見られるか確認します。
また、なにか問題が出てPolipoを止めたい場合は

```
launchctl unload Library/LaunchAgents/org.dohq.polipo.plist
```

を実行して下さい。
Amazon API Gateway + Lambda + CloudSearchで検索APIサービスを作ってみる

# 概要
Amazon API Gatewayが発表されましたね！
個人的にAPI系のサービスは大好きなので早速試してみました。

今回は掲題の通りAmazon CloudSearchの検索結果をLambda通してAPIとして提供する仕組みを作ってみました。

# Lambda
```js
var aws = require('aws-sdk');

var cloudsearchdomain = new aws.CloudSearchDomain({
  endpoint: '<CloudSearchのエンドポイント>'
});

exports.handler = function(event, context) {
    var params = {
                    query:event.q
                };
    cloudsearchdomain.search(params, function(err, data) {
        if (err) {
            console.log("error  " + err);
        } else {
            if (data.hits.found > 0) {
                console.log(data.hits.hit[0]);
                context.done(null,  data.hits.hit[0]);
            } else {
                console.log('not found');
                context.done(null, 'error');
            }
        }
    });
};
```
Lambdaファンクションを作成します。event.qにてAPIから検索文字列を渡してもらって、それをそのままCloudSerch側へ投げ、結果をjsonで出力するというコードになっています。

# CloudSearch
![スクリーンショット 2015-07-16 7.22.58.png](https://qiita-image-store.s3.amazonaws.com/0/65478/20544d70-2caa-a862-dfdd-5b902e7e133d.png)
CloudSearch側には検索用のドメインを新規に作成して、
こんな感じの簡易な検索用のCSVをアップすることにします。

API経由でこのデータに対してアクセスを行い、検索データを取得する流れです。

# Amazon API Gateway
![スクリーンショット 2015-07-16 7.32.54.png](https://qiita-image-store.s3.amazonaws.com/0/65478/cdad3aca-d57d-d74c-188f-cc91ea6e835f.png)
こういったAPIを作成しました。GETメソッドでqというクエリストリングを受け取り、Lambdaからの返り値を返します。

## クエリストリングの設定
![スクリーンショット 2015-07-16 7.36.15.png](https://qiita-image-store.s3.amazonaws.com/0/65478/5961bbe6-0a75-9c0a-7d60-e23947a7ac5d.png)
Method Reauestにてクエリストリングが必要となる設定を行います。

![スクリーンショット 2015-07-16 7.37.11.png](https://qiita-image-store.s3.amazonaws.com/0/65478/4c2ed6d2-e085-3538-5b6b-a169a0610aaa.png)
Integration Requestでも渡ってきたクエリストリングがLambdaに渡せるように上記設定を行います。

## APIキーの設定
![API Gateway.png](https://qiita-image-store.s3.amazonaws.com/0/65478/35faf682-272b-8b07-3aba-f822c552cd7c.png)
また、検索サービスを想定してAPIキーを作って認証の仕組みも作ってあげます。
API KeysでAPIキーを作って、Method ReauestからAPI Key Requiredをtrueに設定しましょう。

## APIのテストからデプロイ
![スクリーンショット 2015-07-16 7.43.48.png](https://qiita-image-store.s3.amazonaws.com/0/65478/c50ff800-8bae-0b7b-61e8-03702461bcc0.png)
準備が整ったので、APIのテストを実行します。クエリストリングに「banana」を入力すると正しく結果が返ってきました。問題ないので「Deploy API」からAPIを公開します。

![API Gateway.png](https://qiita-image-store.s3.amazonaws.com/0/65478/7542a8f5-d062-850a-55dd-282b3b06606a.png)
これで「Invoke URL」にAPI用のエンドポイントが公開されました。

# 実行
`curl  --header 'x-api-key:<APIキー>' https://<APIエンドポイント>/prod?q=banana`
としてリクエストを送ります。

![スクリーンショット 2015-07-16 7.54.19.png](https://qiita-image-store.s3.amazonaws.com/0/65478/ee5af115-2b39-09f0-eaed-b5da328cb79b.png)
はい、こんな感じで正しく結果が返ってきました。

# まとめ
APIサービスがEC2無しで数時間でつくれちゃうのはすごいなと実感しました。
実際にAPIを作るときに面倒なのが認証の仕組みやAPIキーの管理ってとこだと思いますが、それもAPI Gatewayの中で管理してくれるのはすごくありがたいですね！
Docker Private Registry

# 概要
　VM1にDocker Private Registryを立て、
　そこにpushしたimageをVM2で取得する。

# 環境
　CentOS7の仮想マシンを二つ準備(VM1,VM2)

# 手順

　[VM1]
　　Docker Private Registryで5000番ポートを使用するため、
　　ポートを開けておく。
　　
　　　`# firewall-cmd --add-port=5000/tcp --permanent`
　　　`# firewall-cmd --reload`
　　
　　指定したRegistryにSSL通信しないように設定する。
　　　`# vi /etc/sysconfig/docker`
　　　
　　　　(以下を設定)
　　　　INSECURE_REGISTRY='--insecure-registry \<VM1のIPアドレス\>:5000'
　　
　　　`# systemctl restart docker.service`
　　
　　Docker Private Registryのイメージを取得して起動する。
　　　`# docker pull registry`
　　　`# docker run -d -p 5000:5000 registry`
　　　`# docker ps -a`
　　　CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
　　　c0914e450d33        registry:latest     "docker-registry"   30 minutes ago      Up 17 minutes       0.0.0.0:5000-\>5000/tcp   elated_rosalind
　　
　　　`# docker images`
　　　REPOSITORY                           TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
　　　sample_image                         tag_name            2b827fadd9bd        30 minutes ago      260.8 MB
　　
　　Docker Private Registryにpushするイメージを、タグ付けする。
　　　`# docker tag sample_image:tag_name \<VM1のIPアドレス\>:5000/sample_image:tag_name`
　　　
　　　`# docker images`
　　　REPOSITORY                           TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
　　　sample_image                         tag_name            2b827fadd9bd        30 minutes ago      260.8 MB
　　　\<VM1のIPアドレス\>:5000/sample_image  tag_name            2b827fadd9bd        30 minutes ago      260.8 MB
　　
　　Docker Private Registryにイメージをpushする
　　　`# docker push \<VM1のIPアドレス\>:5000/sample_image:tag_name`
　
　
　[VM2]
　　VM1のDocker Private Registryからイメージを取得する。
　　　`# docker pull \<VM1のIPアドレス\>:5000/sample_image:tag_name`
　　
　　　`# docker images`
　　　REPOSITORY                           TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
　　　\<VM1のIPアドレス\>:5000/sample_image  tag_name            2b827fadd9bd        37 minutes ago      260.8 MB
電子回路 > schemeit > LABEL > 日本語はPNG出力時に消える

http://qiita.com/7of9/items/63669d0879daa717b0d6
で紹介したschemeitの使い方。

LABELで日本語入力できるが、png出力した時に日本語部分が消えてしまうようだ。
電子回路 > schemeit > Labelのフォントサイズを大きくする > Fontタブ > 左上のBiggerを選択

http://qiita.com/7of9/items/63669d0879daa717b0d6
で紹介したschemeitの使い方。

LABELを足したのはいいが、フォントサイズを大きくする方法がわからなかった。

Schemeitの右上に「Chat with digikey」というのがあり、Chatで質問してやり方を知った。

---
LABELを大きくするには
1. LABELを選択
2. 上部の「FONT」タブを選択
3. 左上の「Size & Color」において「BIGGER」を選択する

タブの存在には気づいてなかった。
iOS9-day-by-dayという定番サンプル集が公開されました

iOSの新機能サンプルとして評判のシリーズのiOS 9版、[iOS9-day-by-day](https://github.com/shinobicontrols/iOS9-day-by-day)が10日前に公開されたようです。

これ系、国内だと秋の正式リリースのタイミングで公開される、[堤さんのiOS8-Sampler](http://d.hatena.ne.jp/shu223/20140918/1410979802)などのシリーズが有名だと思いますが、そちらは[今年もiOS 9正式リリースのタイミングで公開予定](http://d.hatena.ne.jp/shu223/20150614/1434313771)とのことです。

# iOSx-day-by-dayについてかるく説明

多分iOS 7から続くシリーズで、去年の[iOS8-day-by-day](https://github.com/shinobicontrols/iOS8-day-by-day)も、2,060スターの人気レポジトリです。

去年の場合、連日〜数日起き程度の更新頻度で、次々とiOS 8の新機能サンプルと説明があがってきてて、かなりありがたかったです。

Swiftで書かれています。

[Shinobicontrols](https://www.shinobicontrols.com)の社員が書いている模様です。
年によって担当が違い、今年は[Chris Grant](https://github.com/ChrisGrant)さんという方がメインで担当しているようです。

去年は、[最終的にはLearnpubの書籍にもなりました](https://leanpub.com/ios8daybyday)。

# 活用法

[iOS9 Day-by-Day :: Day 1 :: Search APIs | shinobicontrols](https://www.shinobicontrols.com/blog/ios9-day-by-day-day1-search-apis)のようにブログもありますが、[それに対応するMarkdownもGitHubレポジトリにあり](https://github.com/shinobicontrols/iOS9-day-by-day/blob/master/01-Search-APIs/SearchAPIs.md)、同じく図など交えてよく出来ているのでそれだけ見れば良いと思います。
Web上だけでなく、Atomなどでプレビューしても図含めてキレイに見られました。

レポジトリ内で[01-Search-APIs](https://github.com/shinobicontrols/iOS9-day-by-day/tree/master/01-Search-APIs)のように機能ごとにフォルダ分けされているので、そのサンプルを動かしながら説明のMarkdown読む感じですね。

今年は以下の内容とのことです。

 - Day 1 :: Search APIs
 - Day 2 :: UI Testing
 - Day 3 :: Storyboard References
 - Day 4 :: UIStackView
 - Day 5 :: Xcode Code Coverage
 - Coming Soon :: Multitasking
 - Coming Soon :: Contacts Framework
 - Coming Soon :: Right-to-Left Languages
 - Coming Soon :: Apple Pay

(https://www.shinobicontrols.com/blog/ios9-day-by-day-index より)

[個人的にも注目しているSearch APIs](http://qiita.com/mono0926/items/27af791065ed919255e0)のサンプルがすでにあって素晴らしいです(　´･‿･｀)

去年はこんなに盛りだくさんだったので、サンプル種類ももっと増えていくかもしれませんね。

- Day 1 :: Blagger's Guide to Swift
- Day 2 :: Sharing Extension
- Day 3 :: UIVisualEffects
- Day 4 :: Custom Fonts in Interface Builder
- Day 5 :: Auto-sizing table view cells
- Day 6 :: Profiling Unit Tests
- Day 7 :: Adaptive Layout and UITraitCollection
- Day 8 :: Today Extension
- Day 9 :: Designated Initialisers
- Day 10 :: Xcode 6 Playgrounds
- Day 11 :: Asynchronous Testing
- Day 12 :: HealthKit
- Day 13 :: CoreImage Detectors
- Day 14 :: Rotation Deprecation
- Day 15 :: New NSFormatters
- Day 16 :: Hiding Navigation Bars
- Day 17 :: Live Rendering in Interface Builder
- Day 18 :: UISplitViewController
- Day 19 :: CoreImage Kernels
- Day 20 :: Photos Framework
- Day 21 :: Alerts and Popovers
- Day 22 :: Linking to Settings App
- Day 23 :: Photo Extension
- Day 24 :: Presentation Controllers
- Day 25 :: Notification Actions
- Day 26 :: AVKit
- Day 27 :: Launch Images
- Day 28 :: Document Picker
- Day 29 :: Safari Action Extension
- Day 30 :: App Previews
- Day 31 :: Using Touch ID to Secure the Keychain
- Day 32 :: Layout Margins
- Day 33 :: CloudKit
- Day 34 :: CoreLocation Authorization
- Day 35 :: CoreMotion
- Day 36 :: Location Notifications
- Day 37 :: Autosizing Collection View Cells
- Day 38 :: Handoff
- Day 39 :: WatchKit

(https://www.shinobicontrols.com/blog/ios8-day-by-day-index より)

---

というわけでちょくちょくチェックしていきたいなと思っています（｀・ω・´）
Cargoで任意の共有ライブラリをリンクするには

# 背景

```rust
#[link(name = "raiburari")]
extern {
   fn foo(script: *const libc::c_char,
                        cb: extern fn(* const libc::c_char) -> c_int ) }
```

rustcのコマンドラインでは-Lオプションがあるので、Cと同様に共有ライブラリの
パスを指定することが可能。コード中で指定したlibraiburariがどこにあっても参照できる。

しかし、Cargoを使ってこれをするやり方がなかなか分からなかった。

# 驚きの結果

なんと、build.rsをいうファイルを作成して、rustで標準出力にオプションの
文字列を出力するコードを書くことで、これが可能になることが分かった。

共有ライブラリの検索パスは以下のオプション

cargo:rustc-link-search

build.rsの中身

```rust
fn main() {
	println!("cargo:rustc-link-search=native=/hoge/fuga/bar/foo");
}
````
これで、/hoge/fuga/bar/foo配下の共有ライブラリを参照するようになる。


# 参考資料

- [Build Script Support - Cargo Documentation](http://doc.crates.io/build-script.html)

# この事を学んだ結果の成果物

- https://github.com/trusterd/libtrusterd/tree/master/examples/trusterd_rs

# 関連投稿

- [build.rsでLIBやPATH環境変数を設定せずにcargo runする - Qiita](http://qiita.com/kjunichi/items/4d12e74be7c027c6e30b)

# 関連記事

- [libtrusterdをRustで動かした](https://abrakatabura.hatenablog.com/entry/2015/07/17/074714)
- [RustでWebカメラの映像をコマンドプロンプトに出すコマンドを作った](https://abrakatabura.hatenablog.com/entry/2017/09/21/064630)
- [RustでGoのライブラリを使うときのCargoのbuild.rsの書き方](https://abrakatabura.hatenablog.com/entry/2017/10/22/110223)
- [2018年版、Rustで多次元配列を使うには](https://abrakatabura.hatenablog.com/entry/2018/07/15/203516)
技術英語 > Decision is yours, Caption.

Star Trek Voyagerにて敵役の船の艦長とジェイウェイン艦長のやり取りにおいて、敵役が言った言葉。

Decision is yours, Caption.
(あなた次第ですよ、艦長。)

気の許せる同僚には使えそう。

formalな場面での使用については要確認。

関連して思い出したのは
It's up to you.
It depends on you.
You decide.
UIAlertControllerをシンプルに使えるライブラリを公開しました

先日、UIAlertControllerを簡単に使えるライブラリを公開しました。

> Kamagari : Simple UIAlertController builder class in Swift
> https://github.com/tasanobu/Kamagari

iOS9がリリースされる今年の秋には、iOS7のサポートを終了するプロジェクトが増えてくると思います。
UIAlertViewやUIActionSheet を置き換える際には、ぜひこのライブラリの導入を検討してもらえると嬉しいです。

では、機能や使い方を説明します。

### 機能
このライブラリの機能は次の２つです。

- UIAlertControllerをBuilderパターンで簡単に作れる ```AlertBuilder``` クラス
- UIAlertController を簡単にモーダル表示できる ```UIAlertController``` のextension メソッド

### 利用例
以下のサンプルコードです。
UIAlertControllerをメソッドチェーンで作って、そのまま表示することができます。


```swift:Alert
AlertBuilder(title: "Question", message: "Are you sure where Kamagari is?", preferredStyle: .Alert)
    .addAction(title: "NO", style: .Cancel) { _ in }
    .addAction(title: "YES", style: .Default) { _ in }
    .build()
    .kam_show(animated: true)
```
<img src="https://qiita-image-store.s3.amazonaws.com/0/31069/111ef883-6b5a-9f40-6dff-96968bd2e6b6.png">

```swift:ActionSheet
// ActionSheet Sample
if UIDevice.currentDevice().userInterfaceIdiom != .Pad {
    // iPhone
    AlertBuilder(title: "Question", message: "Are you sure where Kamagari is?", preferredStyle: .ActionSheet)
        .addAction(title: "NO", style: .Cancel) { _ in }
        .addAction(title: "YES", style: .Default) { _ in }
        .build()
        .kam_show(animated: true)
} else {
    // iPad
    // setPopoverPresentationProperties()を使って
    // UIPopoverPresentationController の各種プロパティを設定できます
    AlertBuilder(title: "Question", message: "Are you sure where Kamagari is?", preferredStyle: .ActionSheet)
        .addAction(title: "YES", style: .Default) { _ in }
        .addAction(title: "Not Sure", style: .Default) { _ in }
        .setPopoverPresentationProperties(sourceView: view, sourceRect: CGRectMake(0, 0, 100, 100), barButtonItem: nil, permittedArrowDirections: .Any)
        .build()
        .kam_show(animated: true)
}
```
<img src="https://qiita-image-store.s3.amazonaws.com/0/31069/ae206825-08f2-5093-ca94-193aca31032e.png">

### システム要件
- iOS 8.0+
- Xcode 6.3

### インストール方法
Cocoapodsを使うと簡単にインストールできます。
Podfileで このライブラリ(```Kamagari```) を追加し、```pod install``` or ```pod update``` を実行して下さい。 

```
platform :ios, '8.0'
use_frameworks!

pod 'Kamagari'
```

---

ご意見、ご要望などあれば、可能な限り対応しようと考えております。
Issueなりプルリクエストなり頂けると幸いです。


> Kamagari : Simple UIAlertController builder class in Swift
> https://github.com/tasanobu/Kamagari
店、アイテムごとの時系列データをstanで推定する（続き）


データの設定も含めてまだまだ適当です。
(time,store,item)の３次元のCARモデル？と大体同じです。


```R:

MAX_T=100

sbase=c(0,50,100,155)+100 #店ごとの差
ibase=seq(100,300,by=100)　#アイテム



ibase=sort(ibase)
sbase=sort(sbase)
S=length(sbase)
I=length(ibase)

trend=array(dim=c(MAX_T,S,I ))
df=array(dim=c(MAX_T,S,I ))

for(s in 1:S){
  trend[1,s,]=ibase+sbase[s]
}
  
df=trend

for(s in 1:S){
  for(i in 1:I){
    for(t in 2:MAX_T){
      youbi=0
      #store曜日の売上が上がる設定
      if(t%%7==s){
        youbi=20
      }
      trend[t,s,i]=trend[t-1,s,i]+rnorm(1,sd=0.5)
      df[t,s,i]=trend[t,s,i]+youbi+rnorm(1,sd=3)
    }
  }
}


scode="
data{
  int MAX_T;
  int S;
  int I;
  real df[MAX_T,S,I];
}

parameters{
  real sigma_v;
  real sigma_t;
  real trend[MAX_T,S,I];
  real season[MAX_T,S];
}


model{

  int cycle;
  cycle<-7;
  
  #店番号方向
  for(s in 3:S){
    for(t in 1:MAX_T){
      for(i in 1:I){
        trend[t,s,i]~normal(2*trend[t,s-1,i]-trend[t,s-2,i],1);
      }
    }
  }
  
  #アイテム番号方向
  for(s in 1:S){
    for(t in 1:MAX_T){
      for(i in 3:I){
        trend[t,s,i]~normal(2*trend[t,s,i-1]-trend[t,s,i-2],1);
      }
    }
  }
  
  #時間方向
  for(i in 1:I){
    for(s in 1:S){
      for(t in 2:MAX_T){
         #trend[t,s,i]~normal(2*trend[t-1,s,i]-trend[t-2,s,i],sigma_t);
        trend[t,s,i]~normal(trend[t-1,s,i],sigma_t);
      }
    }
  }
  

  for(s in 1:S){
    for(t in (cycle):MAX_T){
      real ssum;
      ssum<-0;
      for(j in 1:(cycle-1)){
        ssum<-ssum+season[t-j,s];
      }
      season[t,s]~normal(-ssum,10);
    }
  }


  for(i in 1:I){
    for(s in 1:S){
      for(t in 1:MAX_T){
        df[t,s,i]~normal(trend[t,s,i]+season[t,s],sigma_v);
      }
    }
  }


}
"

library(rstan)
sdf=df
data=list(df=sdf,MAX_T=length(sdf[,1,1]),S=S,I=I)

#initで初期値を設定しないとダメらしい
fit=stan(model_code = scode,data = data,chains = 1,
         init=function() { list(trend=df,sigma_t=5,sigma_v=5,season=matrix(0,ncol=S,nrow=MAX_T))},
         warmup = 20,iter = 300)
la=extract(fit)

strend=sdf
for(s in 1:S){
  for(inb in 1:I){
    strend[,s,inb]=apply(la$trend[,,s,inb],2,mean)
  }
}

sseason=NULL
for(s in 1:S){
  sseason=cbind(sseason,apply(la$season[,,s],2,mean))
}


resplt=function(s,inb){
  a=trend[,s,inb]
  b=strend[,s,inb]
  print(cor(a,b))
  myplt(cbind(a,b))
}

```

kaggleの某問題はコレとロジスティック回帰でいけるのだろうか。。。
P(hanzai|time,x,y)= 〜
みたいな。。。
12章 4NF/5NF

## 主キー(primary key)
テーブルを代表するキー → 不安定なものはよくない

## 候補キー(Candidate Key)
既約(それ以上要素を減らすことができない) かつ タプルが一意に決まるキー → emailとか。

## SuperKey
複数の属性の集合 かつ タプルが一意に決まるキーの部分集合
→ {id,email}, {id,age}, {email,age}, {id,email,age}

## 非キー属性
いかなる候補キーにも属していない属性

# 結合従属性 =  無損失分解が可能
# 関数従属性 
→　X ならば Y と一意に決まること。
# 関数従属性　かつ　スーパーキー   →　部分関数従属性
# 関数従属性　かつ　非キー属性　  →　推移関数従属性


# 4NF/5NF
→　非キー属性が存在しない。　かつ　候補キーに含まれる属性が２つ以上
4NF {AB,AC}
5NF {AB,BC,AC}
【Android】眠れない夜に心を穏やかにするためのリンクまとめ


* 「Androidのパッケージ構成について考えてみた」<br/>http://qiita.com/kobakei/items/e8452d04f6991be3498a
* 「iOS/Androidアプリエンジニアが理解すべき「Model」の振る舞い」<br/>http://www.slideshare.net/mokemokechicken/iosandroidmodel
* 「[翻訳] Android開発におけるベストプラクティス」<br/>http://suzukaze.hatenablog.jp/entry/2015/02/22/221433
* 「Architecting Android…The clean way?」<br/>http://fernandocejas.com/2014/09/03/architecting-android-the-clean-way/
* 「antoniolg/androidmvp」<br/>https://github.com/antoniolg/androidmvp


気になって眠れないので教ええろください！
gnuplotのメモ

テスト対策用です

# 作業内容のセーブ・ロード
```gnuplot
save "filename.plt"
load "filename.plt"
```
ロードに関しては引数にファイル名を指定して起動してもおｋ

```bash
$ gnuplot filename.plt
```

# 書式
```
        plot {範囲(ranges)} {<関数(function)> | 
                     {"<データファイル(datafile)>" {index i} {using ...}}}
                     {表題(title)} {スタイル(style)} 
                     {, <関数> {表題} {スタイル}...}

        splot {範囲} {<関数> | {"<データファイル>" {index i} {using ...}}}
                     {表題(title)} {スタイル(style)} 
                     {, <関数> {表題} {スタイル}...}
```
詳細はhttp://wwwal.kuicr.kyoto-u.ac.jp/www/accelerator/a4/gnuplot/gnuplot-18.html

## index
データファイルの中は、2行の空行で区切られたメッシュデータがある。
どのメッシュを描画するかをindex修飾子で選択をする。
なお、インデックスは0から始まる。

## using
メッシュデータの中から利用する列を選択する。
1から始まる列番号を``` : ```で区切って指定する。

## style
``` with [lines | points | linespoints | dots | boxes] ```

## title
``` title "hoge" ```

## 例
```gnuplot
plot "datafile.dat" index 0 using 1:3 with linespoints
```

# 出力先の指定
```
set term svg
set out "filename.svg"

set term postscript eps
set out "filename.eps"

set term qt
```

# 2次元グラフの描画(plot)
```gnuplot
# 一つのグラフ
plot x**2

# 複数のグラフはカンマで区切る
plot sin(x)

# 表示範囲の指定
plot [-10:10] [-2:2] sin(x)
plot [] [-2:2] sin(x)
```

# 3次元グラフの描画(splot)
```gnuplot
splot (x**2)*(y**2)

# グラフの面を塗りつぶす
set pm3d
replot

# 表示範囲の指定はplotと同様
splot [-5:5] [-5:5] [0:1000] (x**2)*(y**2)
````

# 再描画(replot)
```gnuplot
# 引数無しなら最後に実行したプロットを再実行
replot

# 引数を与えればグラフを追加できる
replot tan(x)
```

# 軸
```gnuplot
set xlabel "x"
set ylabel "sin(x)"

set xrange [-10:10]
set yrange [-2:2]

set logscale y
```
iTunesにRemoteAppで接続できない

とりあえずメモる

* iPhone6とiPad mini3で確認
* 親機はwin7
* モバイル側でパスコードを発行し、親機で入力するも「間違っています」的な感じになる
* そもそもちょっと前は何もしなくてもモバイル側に表示されなかったっけ…？

ぐぐったら「arpがー」という記事が散見されたので手元でも試した。

参考:
http://re-boost.cocolog-nifty.com/blog/2010/11/ipadremote-a5fa.html
http://blog.sato0123.com/2015/04/29/Connect_Watch_to_iTunes_on_Win7/


```
> arp -av
...
  192.168.~~.~~         00-00-00-00-00-00     無効
  192.168.~~.~~         00-00-00-00-00-00     無効
...
```

私のもっばいる達は無効とされていた。
arpキャッシュ消す。

```
> arp -d 192.168.~~.~~
```

けどすぐ登録されて無効になる？っぽい。
なにやらよくわからないがarp問い合わせに対してiOSデバイス達がうまく応答していないらしく、無効になっちゃうみたい。

根本的な解決方法はよくわからなかったので、とりあえず

* iOSデバイスに手動でlocal IP付与（家庭用無線ルータのレベルで）
* arpテーブルに静的なエントリを追加

として対応した。

```
> arp -s [IPアドレス] [MACアドレス]
```
で追加。

```
> arp -av
...
  [IPアドレス]         [MACアドレス]     静的
...
```

これでとりあえずRemoteAppは使えてる。
Gradleでsources jarを集める

## はじめに

Gradleでdependenciesに記述した(通常の)jarファイルを集めることは比較的簡単ですが、それらのsources jarを集めようとしたところ意外と手間取ったのでメモしておきます。

## sources jarをダウンロードする方法

sources jarを集めるには、こんなやり方でOKでした。

```build.gradle
import org.gradle.api.artifacts.query.ArtifactResolutionQuery
import org.gradle.internal.component.external.model.DefaultModuleComponentIdentifier
import org.gradle.jvm.JvmLibrary
import org.gradle.language.base.artifact.SourcesArtifact

// ....

task collectSourcesJar << {
    DependencyHandler dependencyHandler = project.dependencies
    project.configurations.each { Configuration configration ->
        // scope毎に全部欲しい場合はLenientConfiguration#getArtifactsの引数をorg.gradle.api.specs.Specs#satisfyAllに変える
        def componentIdentifiers = configration.resolvedConfiguration.lenientConfiguration.getArtifacts { Dependency dependency ->
            configration.dependencies.contains(dependency)
        }.collect { ResolvedArtifact artifact ->
            ModuleVersionIdentifier id = artifact.moduleVersion.id
            DefaultModuleComponentIdentifier.newId(id)
        }
        ArtifactResolutionQuery query = dependencyHandler.createArtifactResolutionQuery()
        query.forComponents(componentIdentifiers)
        query.withArtifacts(JvmLibrary, SourcesArtifact)
        def sourcesJars = []
        ArtifactResolutionResult resolutionResult = query.execute()
        resolutionResult.resolvedComponents.each { ComponentArtifactsResult componentArtifactsResult ->
            componentArtifactsResult.getArtifacts(SourcesArtifact).each { ArtifactResult artifactResult ->
                if (artifactResult instanceof ResolvedArtifactResult) {
                    sourcesJars << artifactResult.file
                }
            }
        }

        // build/dependencies/compile-sources/ などに出力する
        project.copy {
            from sourcesJars
            into "${project.buildDir}/dependencies/${configration.name}-sources"
        }
    }
}
```

### 使い方

taskを実行してください。

```
./gradlew collectSourcesJar
```

実行すると、dependenciesに記述したartifactのsources jarをダウンロードし、スコープごとのディレクトリに集めます。

### NOTE

- gradle 2.5で動作確認しています。
- ```DefaultModuleComponentIdentifier``` クラスを使用しているのがイマイチなのですが、gradle 2.5ではこうしないと動いてくれませんでした。
  - 原因は ```org.gradle.api.internal.artifacts.ivyservice.resolveengine.result.ComponentIdentifierSerializer``` がinstanceofしている箇所だと思うのですが。。。
  - gradle 2.4では、```org.gradle.api.artifacts.component.ModuleComponentIdentifier```をimplementsしたクラスで動きます。

### 通常のjarをダウンロードする方法

ちなみに、通常のjarファイルを集める方法は例えばこんなふうです。

```build.gradle
project.copy {
    from project.configurations.compile
    into "${project.buildDir}/dependencies/compile"
}
```
ionic開発メモ(1) インストール〜プロジェクト作成

ハイブリッドスマホアプリの開発にionicが便利そうです。
スマホアプリのionicview と連携して、実機テストもできるようです。
ちなみに、ionic.ioのサービスはα版のうちは無料で使えるとのこと。
色々と試しながら進めて行こうと思います。

##環境構築
まずは、nodeとnpmをインストールしておいてください。
公式ドキュメント
http://ionicframework.com/docs/guide/installation.html

cordovaをインストール

```
$ sudo npm install -g cordova
```
ionicをインストール

```
$ sudo npm install -g ionic
```

ちなみに、yeomanのgenerator-ionicを使って環境構築もできます。
今回は、リアルタイムに変更を確認しながら開発を進めたいのと、初めて触るのでシンプルな構成から始めたいので、yeomanは使わずに、ionicの公式ドキュメントに沿って進めようと思います。

##プロジェクトの作成

プロジェクトを作成するには以下のコマンドを実行します。

```
$ ionic start {{プロジェクト名}} {{テンプレート名}}
```

公式ドキュメントでは、テンプレート名に'blank'が使われていますが、他にもテンプレートがあります。
詳しい情報はgithubを参考にしてください。
https://github.com/driftyco/ionic-cli

* tabs (Default)
* sidemenu
* maps
* salesforce
* tests
* complex-list
* blank

の中から選ぶことができます。
ionic.io専用のオプションとして、'io'もあるようです。

プロジェクト作成が完了したら、
```
$ cd {{プロジェクト名}}
```
でプロジェクトディレクトリに移動して、
```
$ ionic serve
```
を実行すると、サーバが立ち上がります。
Git でややこしい操作する前にブランチに新しい名前をつければ混乱しない(と思う)

# 最近思ったこと

Git を知らないと「コミットをまとめる」という操作は破壊的な操作のように聞こえる。
実際に起こっていることはそうでもない。
以前の commit が破壊的にまとめられるのではなく、新しい commit が作られる。
というか Git の設計として、コミット自体が不可逆的に破壊されにくいようになっている。

しかし、 Git をたくさん使っていれば、コミットをまとめる系の操作で手痛いミスを犯したことがきっとあるはず。
最近分かったのは、まとめ先にはちゃんと新しい名前をつければ、起こったことの before, after がわかるし、
万が一ミスしても大きな混乱は起きない。
もしパニックになっても、その新しい名前のブランチだけをまるごと削除してしまえばいい。

# [GitHub Flow](http://qiita.com/tbpgr/items/4ff76ef35c4ff0ec8314) での例

GitFlow では WIP の Pull Request と master 向けの Pull Request がある。

- WIP の紆余曲折と被レビューの履歴はすべて保存されていて欲しい
  - 作業単位のコミットを保存する
  - レビューを受けた状態のコミットを保存する
- master の履歴はクリーンであって欲しい
  - master はリリースなのでどの時点の Commit もクリーンであって欲しい。
  - git bisect で特定可能

なので、 master 向けの Pull Request を用意するときに WIP のブランチをそのまま merge するのではなく、
Pull Request 用にさらに新しくブランチを切りたい。

ということは、その新しいブランチは、 WIP のブランチのコミットを単にまとめたものになる。
なので ```git merge --squash``` がそのまま使える。

## 操作の例

- some-wip-feature .. WIP 。 レビュー用 Pull Request で使うブランチ
- some-clean-feature .. master に merge されるブランチ。 some-wip-feature をまとめたもの

```console
$ git init
$ git commit --allow-empty -m 'Initial commit'
$ git checkout -B some-wip-feature
$ touch a
$ git add a
$ git commit -m 'Add a'
$ touch b
$ git add b
$ git commit -m 'Add b'
$ git checkout master
$ git checkout -B some-clean-feature 
$ git merge --squash some-wip-feature
$ git commit -m 'Add some feature'
```

名前を 1 つで頑張るよりも、とても挙動がわかりやすいと思う。
1 つ実行して動かしてツリー表示すれば、起きていることがきっと理解しやすい。

# 免責

この記事は勢い良く書いたので、ところどころ用語がおかしいかも。
stanで2次元carモデル（の練習）

と言っても、berobero先生の記事と殆ど同じですが。。。
以前の、時系列＆販売個数に勾配のあるアイテムの推定に再チャレンジするもなかなかうまく行かず、参考になるかなーと思って。

```R:

#データの生成

N=50
r=z=c(10)
for(i in 2:N){
  r[i]=r[i-1]+rnorm(1)*0.5
  z[i]=r[i]+rnorm(1)
}


z=r=matrix(nrow=N,ncol=N)
r[1,1]=z[1,1]=10
for(i in 2:N){
  r[i,1]=r[i-1,1]+rnorm(1)*0.5
  z[i,1]=r[i,1]+rnorm(1)
}
for(j in 2:N){
  r[1,j]=r[1,j-1]+rnorm(1)*0.5
  z[1,j]=r[1,j]+rnorm(1)
}

for(i in 2:N){
  for(j in 2:N){
    r[i,j]=r[i-1,j-1]+rnorm(1)*0.5
    z[i,j]=r[i,j]+rnorm(1)
  }
}


scode2="

```stan:
data{
int N;
real Z[N,N];
}

parameters{
  real sigma;
  real r[N,N];
}


model{

  for(i in 1:N)
    for(j in 2:N)
      r[i,j]~normal(r[i,j-1],4);

  for(i in 2:N)
    for(j in 1:N)
      r[i,j]~normal(r[i-1,j],4);

  for(i in 1:N){
    for(j in 1:N){
      Z[i]~normal(r[i,j],sigma);
    }
  }

}

```

"

```R:

library(rstan)
data=list(N=N,Z=z)
fit=stan(model_code = scode2,data = data,chains = 1,
         warmup = 20,iter = 100)

la=eitract(fit)
sr=data.frame(0)
for(i in 1:N)
  for(j in 1:N)
    sr[i,j]=mean(la$r[,i,j])

```

2DCAR＆時系列＆回帰のようなものをやりたいのだけど、遠そうです。
48時間でSchemeを書こう/評価: 第二部

# 参考URL
[48時間でSchemeを書こう/評価: 第二部](https://ja.wikibooks.org/wiki/48時間でSchemeを書こう/エラー処理と例外)

#ソース
https://github.com/0zawa/scheme_in_48_hours/blob/master/evaluation_2.hs

# プリミティブの追加
「評価: 第一部」では加減乗除、商や余りを求める
プリミティブを定義しました。
ここでは更に追加のプリミティブを定義します。

```hs
("=", numBoolBinop (==)),
("<", numBoolBinop (<)),
(">", numBoolBinop (>)),
("/=", numBoolBinop (/=)),
(">=", numBoolBinop (>=)),
("<=", numBoolBinop (<=)),
("&&", boolBoolBinop (&&)),
("||", boolBoolBinop (||)),
("string=?", strBoolBinop (==)),
("string<?", strBoolBinop (<)),
("string>?", strBoolBinop (>)),
("string<=?", strBoolBinop (<=)),
("string>=?", strBoolBinop (>=)),
```

上記プリミティブの計算結果は全て真偽値になります。

numBoolBinop,boolBoolBinop,strBoolBinopの共通部分をまとめて
boolBinop関数に定義します。

```hs
boolBinop :: (LispVal -> ThrowsError a) -> (a -> a -> Bool) -> [LispVal] -> ThrowsError LispVal
boolBinop unpacker op args = if length args /= 2 
                             then throwError $ NumArgs 2 args
                             else do left <- unpacker $ args !! 0
                                     right <- unpacker $ args !! 1
                                     return $ Bool $ left `op` right
```

boolBinopは

* (LispVal -> ThrowsError a)の型を持つ関数、
* (a -> a -> Bool)の型を持つ関数
* [LispVal]

を受け取って、
ThrowsError LispValを返します。

関数の実装をみていくと、まずargsの要素数が２かそうでないかを
調べます。
要素数が２でないならNumArgsエラーにして返却します。
要素数が２であるなら、それぞれの引数をunpacker関数に適用し、
結果をleft,rightに格納します。
unpacker関数に関しては、この後みていきます。
最後にleftとrightを真偽値を返す演算子に適用して、
BoolコンストラクタでLispValにしてThrowsErrorに包んで返します。

次にboolBinopを使ったそれぞれの関数をみてみます。

```hs
numBoolBinop = boolBinop unpackNum
strBoolBinop = boolBinop unpackStr
boolBoolBinop = boolBinop unpackBool
```

違いはunpackXXXのところだけです。

unpackNumは以前にすでに定義済みです。

```hs
unpackNum :: LispVal -> ThrowsError Integer
unpackNum (Number n) = return n
unpackNum (String n) = let parsed = reads n in 
                          if null parsed 
                            then throwError $ TypeMismatch "number" $ String n
                            else return $ fst $ parsed !! 0
unpackNum (List [n]) = unpackNum n
unpackNum notNum = throwError $ TypeMismatch "number" notNum
```

LispValをIntegerかエラーに変換します。

unpackStrも同様にLispValをStringかエラーに変換します。


```hs
unpackStr :: LispVal -> ThrowsError String
unpackStr (String s) = return s
unpackStr (Number s) = return $ show s
unpackStr (Bool s) = return $ show s
unpackStr notString = throwError $ TypeMismatch "string" notString
```

単純にStringに変換できるものはStringに変換して、
変換できないものはエラーにしているだけです。

unpackBoolも簡単です。

```hs
unpackBool :: LispVal -> ThrowsError Bool
unpackBool (Bool b) = return b
unpackBool notBool = throwError $ TypeMismatch "boolean" notBool
```

Boolでなければエラーにしているだけです。

これで、大小比較や論理演算などが行えるようになりました。
reduce テンプレート関数

python の reduce、scala の reduceLeft 関数相当の物を C++ で実装してみた。
`std::accumulate` という似た機能の関数は既に存在するが、引数の形が `reduce` や `reduceLeft` と違う。
今回は引数の形も似た関数を作るのが目的。

### コード

```cpp
template <typename Collection, typename BinaryOperation>
auto reduceLeft(const Collection& c, BinaryOperation biop)
{
    typedef typename std::decay<decltype(c.front())>::type E;

    auto out = E();
    if(c.empty()) { return out; }
    
    auto r = c.begin();
    out += *r;
    
    ++r;
    
    while(r != c.end())
    {
        out = biop(out, *r);
        ++r;
    }
    
    return out;
}
```

### 工夫した点

1. C++14 の戻り値の型推論を使ってコンテナに格納している型情報を自動決定している。
2. 関数内でも `decltype` と `std::decay` を使って格納型情報を取得し、デフォルトコンストラクタを呼ぶようにしている（`std::accumulate` とは違い初期値を引数で与えない仕様）。

### 使用制限

1. Collection に代入する型に `begin, end` 関数が実装されていること。
2. Collection に格納される型にデフォルトコンストラクタが実装されていること。

### サンプルコード

```cpp
#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main(void)
{
    // 足し算関数
    auto add = [](const auto& l, const auto& r) { return l + r; };
        
    // 整数
    vector<int> v1 = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    cout << "reduce v1 = " << reduceLeft(v1, add ) << endl;
    
    // 文字列    
    vector<string> v2 =  {"this ", "is ", "a ", "pen."};
    cout << "reduce v2 = " << reduceLeft(v2, add ) << endl;

    // 空の配列
    vector<double> v3;
    cout << "reduce v3 = " << reduceLeft(v3, add) << endl;
}
```

### コンソール出力

```
reduce v1 = 45
reduce v2 = this is a pen.
reduce v3 = 0
```