OmniAICreator/Qiita-1.07M huggingface dataset:
Arduino > String> csvパーサ実装 (extractCsvRow)

```txt:動作確認
ESP-WROOM-01
Arduino 1.6.6
```

`AAA,BBB,CCC`のような文字列からそれぞれの項目を取りたいので作った。

参考 http://stackoverflow.com/questions/11068450/arduino-c-language-parsing-string-with-delimiter-input-through-serial-interfa

関数名はUnity/C#で作った自作関数と合わせた。
http://qiita.com/7of9/items/f6ff497333bf558a5951


## code

```c
void Test_extractCsvRow()
{
  String csvline = "AAA,BBB,CCC";
  String tmp;
  for(int idx = 0; idx < 3; idx++) {
    tmp = extractCsvRow(csvline, idx);
    Serial.println(tmp);    
  }
}

String extractCsvRow(String srcline, int getIdx)
{
    int commaPos = -1; // to start from 0 by (commadPos + 1), this requires -1 here
    int posIdx = 0;
    int nextOfComma;

    while(1) {
      nextOfComma = commaPos + 1;
      commaPos = srcline.indexOf(',', nextOfComma);
      if (commaPos < 0) {
        break;
      }
      if (posIdx == getIdx) {
        break; 
      }
      posIdx++;
    }
    commaPos = srcline.indexOf(',', nextOfComma);
    if (commaPos < 0) {
      return srcline.substring(nextOfComma);
    } else {
      return srcline.substring(nextOfComma, commaPos);
    }
}
```

Test_extractCsvRow()を実行すると以下のようになる。
一応動いているようだ。

```
AAA
BBB
CCC
```

こういう関数はライブラリがもしかしたらあり、それを使うのが楽だったかもしれない。
Arduino StringのAPI勉強として実装した。

https://www.arduino.cc/en/Reference/StringObject


## v0.2

項目数が少ない時の処理が間違っていた。

csvline = "AAA"
という文字列に対して
extractCsvRow(csvline, 1);も
extractCsvRow(csvline, 2);も
"AAA"を返してしまっていた。

以下に修正した。

```
// String library

/*
 * v0.2 2016 Feb 20
 *  - extractCsvRow: fix bug > "AAA" return "AAA","AAA","AAA"
 * v0.1 2016 Feb 20
 *  - add Test_extractCsvRow()
 *  - add extractCsvRow()
 */

//-------------------------------------------------------------------------

void Test_extractCsvRow()
{
  // test1 >> full
  String csvline = "AAA,BBB,CCC";
  String tmp;
  for(int idx = 0; idx < 3; idx++) {
    tmp = extractCsvRow(csvline, idx);
    Serial.println(tmp);    
  }

  // test2 >> only 1st
  csvline = "AAA";
  for(int idx = 0; idx < 3; idx++) {
    tmp = extractCsvRow(csvline, idx);
    if (tmp.length() == 0) {
      continue;
    }
    Serial.println(tmp);    
  }
}

String extractCsvRow(String srcline, int getIdx)
{
    int commaPos = -1; // to start from 0 by (commadPos + 1), this requires -1 here
    int posIdx = 0;
    int nextOfComma;

    while(1) {
      nextOfComma = commaPos + 1;
      commaPos = srcline.indexOf(',', nextOfComma);
      if (commaPos < 0) {
        break;
      }
      if (posIdx == getIdx) {
        break; 
      }
      posIdx++;
    }

    if (posIdx != getIdx) {
      return "";
    }
    
    commaPos = srcline.indexOf(',', nextOfComma);
    if (commaPos < 0) {
      return srcline.substring(nextOfComma);
    } else {
      return srcline.substring(nextOfComma, commaPos);
    }
}

```
Windows 10のエクスプローラーでStExBarが表示されなくなることがある

[StExBar](http://stefanstools.sourceforge.net/StExBar.html)、シンプルながら便利ですよね。
カスタマイズも簡単でありがたい。
ところがWindows 10にアップグレードして以降、標準では表示されなくなってしまいました。
しかも何が原因なのか、一度表示させても再起動した後などにまた見えなくなったりしているようです :cry:。
その都度がちゃがちゃ設定を探して直していたのですが、忘れてしまうので再表示させる方法をメモしておきます。
なぜか検索してもぱっとみ出てこないようですし...。

:arrow_down: のスクリーンショットの箇所をいじりましょう！

![2016-02-windows10-stexbar.png](https://qiita-image-store.s3.amazonaws.com/0/12688/9d77e870-e39a-10b8-c1ac-6c60c0de926e.png)

:information_desk_person: ご覧の通り、リボンメニューの「表示」をクリックしてから
右側の方にある「オプション」と**日本語で**書かれた箇所をクリックしてください。

:warning: すぐ上にあるアイコンの箇所ではありません！そっちはフォルダーオプションです！

するとスクリーンショットの通り「StExBar」と書かれたチェックボックスが表示されますので、クリックしましょう。
お馴染みのStExBarが出てきます。
Arduino > String > substring() > to (optional): the index to end the substring before

```txt:動作確認
ESP-WROOM-02
Arduino IDE 1.6.6
```

substring()を使う時に失敗した。
https://www.arduino.cc/en/Reference/StringSubstring

> string.substring(from, to)
> ...
> to (optional): the index to end the substring before

substring(1,5)とした時には、5は含まれないとのことらしい。
Arduino > String > toLowerCase(); > cmdline.toLowerCase(); としてLowerCaseに変更してから使う

```txt:動作環境
ESP-WROOM-02
Arduino IDE 1.6.6
```

String型の文字列をLowerCaseに変更しようとした。

https://www.arduino.cc/en/Tutorial/StringCaseChanges

以下はだめだった。

```
void Serial_replyToCommand(String cmdline)
{
  if (cmdline.toLowerCase().equals("hello")) {
    Serial.println("hello, 7of9");
  } else {
    Serial.println(cmdline);    
  }
}
```

以下は問題なかった。

```
void Serial_replyToCommand(String cmdline)
{
  cmdline.toLowerCase();
  if (cmdline.equals("hello")) {
    Serial.println("hello, 7of9");
  } else {
    Serial.println(cmdline);    
  }
}
```

.toLowerCase()を実行するだけの行が余分に必要となる。

--

{Upper/Lower}Case無関係での比較には以下の関数があった。
https://www.arduino.cc/en/Reference/StringEqualsIgnoreCase
ハイブリッドモバイルアプリのデバッグ(iOS)

# はじめに
* ハイブリッドなモバイルアプリを開発しているが，いざiOSプラットフォームを追加してみると動かなかった・・・ということでiOSのデバッグ方法を調べてメモ

# ハイブリッドiOSアプリの基本的なデバッグ
* **Safariを使った**リモートWebインスペクタ
  * iOS端末のSafariと，開発機のSafariを連携する形でデバッグ可能
  * Chromeと似たようなもの
  * JavaScript/HTMLやResourceなどの確認，ブレークポイントやタイムライン表示など

## iOSデバッグの事前準備
1. 端末(もしくはiOSシミュレータ)の設定
  * 設定 > Safari > Advanced.. > Webインスペクタ を有効にする
2. Macの設定
  * 環境設定 > 詳細 > メニューバーに"開発"メニューを表示 を有効にする 
  
## iOSデバッグの手順
* Safari > 開発 > Simulator > iOS端末で起動中のアプリ名 を選択
  * iOS端末(もしくはSimulator)でWebインスペクタを有効にしていると下図のようにSafari > 開発 で選択可能となる
     ![image](https://qiita-image-store.s3.amazonaws.com/0/69447/d6d04f97-ce51-36b3-a0d0-368191b4ea7f.png)
  * 例えば，実機iPhoneのSafariで「www.apple.com/jp/macbook-pro」のページを開いているとき
    * 下図のように，「要素，ネットワーク，リソース，タイムライン，デバッガ，ストレージ，コンソール」とおなじみのWebインスペクタを**実機で開いているページに対して**使用できる
    ![スクリーンショット 2016-02-20 8.39.03.png](https://qiita-image-store.s3.amazonaws.com/0/69447/64cd58b1-37f0-7b70-f9b2-7dd490a14eed.png)

## 今後調べたいこと
* インスペクタが追えないタイミングのデバッグ方法
  * (個人的には)アプリ初期画面を開いた後しかターゲットを選べないので，起動時の問題を見逃しやすい(と思っているため)
    * XcodeでiOSプロジェクトを開いた上でSimulatorを起動すれば，起動時も含めてデバッグできそう
    * Cordova側のログは，platforms/cordova/ios/console.logを見ると良さそう
* フレームワークなどのバージョンアップに追随していくためにも，どのFWを使うべきか(むしろ使わない方が良いFWは何かを真面目に考えた方がいいかも)，どういう基準で使用するバージョンを選択するかなど
  * OS，Cordova，そしてAngularJSやNodeなどといったチームで使用ツールはいずれもバージョンアップが非常に短いサイクルで行われるために，不整合の問題が発生し得るため
  * 脆弱性対応，セキュリティパッチ適用などに対応しないといけない
    * 対応しなければ，問題が起きる起きないは関係なく，アプリストアから削除されるらしい

# まとめ
今回は，iOSやってみるか〜という流れで簡単にデバッグ方法などを調べてみた。
今後は深掘りしていくので，ノウハウが溜まった頃に追記予定。
OpenFOAMのインストール

# OpenFOAMとは
OpenFOAMはオープンソースで開発が行われている流体解析ライブラリーです。C++で開発されており、やりたい流体解析は大体できる高機能なライブラリです。しかし、自由度が高いかわりに知識がないと使いこなせないライブラリーだったりもします。

- コマンドラインベース
- ボタンをポチポチ押して解析ができるわけではない
- 一応GUIも本家ではないところで開発されている(Helyx-OSなど)
- 日本語の情報はかなり少ない

# OpenFOAMの対応環境
基本はLinuxで運用します。
Windows版のビルドもありますが、インストールが煩雑だったりします。なぜか私の環境ではインストールがうまくいかなかった。安定して利用できるのは以下の2つの方法だと思います。どちらにしろ最低限のLinuxに対する知識は必要です。

- Linuxにインストール
- DEXCSというディストリビューションを利用

## DEXCSを利用する
DEXCS( http://dexcs.gifu-nct.ac.jp/ )はLinux MintをベースにCAE(Computer aided engineering)ツールをプリインストールしてあるディストリビューションです。サイトからメールアドレスや所属先を登録するとダウンロードが可能になります。日本で開発されているのとOpenFOAMに必要なツール一式がインストール済みなのでインストールでつまずくことはありません。ただ、インストールされているツールは開発時に最新版のものなので場合によっては古いものかもしれません。

## Linuxへのインストール
自分の好きなディストリビューションに最新版をインストールできます。
ソースコードからのインストールは http://openfoam.org/download/source.php に書いてあるとおりにコマンドを入力していけばできます。

### Ubuntuへインストール
オフィシャルでUbuntu Deb Packが用意されているのでこちらのほうが楽です。こだわりがなければUbuntuをおすすめします。インストールは http://www.openfoam.org/download/ubuntu.php に書いてあるコマンドを実行するだけです。

```lang:bash
sudo add-apt-repository http://www.openfoam.org/download/ubuntu
sudo apt-get update
sudo apt-get install openfoam30
sudo apt-get install paraviewopenfoam44
```
リポジトリを追加してaptをアップデート、OpenFOAMと計算結果の可視化ソフトウェアであるparaviewをインストールします。とりあえずこれで最低限使えます。
ESP8266 > シリアルUART通信処理 > コマンドを読み込んで応答 (v0.2)

```txt:動作確認
ESP-WROOM-02
```

Adafruit Pi Zero Contest 2016で使うESP8266のプログラムを実装中。

シリアル通信で文字列を受けて、それに対する応答というのが必要になる。

シリアル通信のコードは以下を参考に自分の用途用に変更した。
http://qiita.com/exabugs/items/9d1b66aa1d22805afbc8


## code (v0.2)

[v0.2 @ github](https://github.com/yasokada/esp8266_160220_BYOP/releases/tag/v0.2)

```c:esp8266_160220_BYOP.ino

/*
 * This program is used for a message station shown at
 * https://hackaday.io/project/9526-bring-your-own-pizero-byop
 */


/*
 * v0.2 2016 Feb 20
 *  - fix Serial_readCommand() to handle CR code
 *  - add Serial_replyToCommand()
 * v0.1 2016 Feb 20
 *  - add Serial_readCommand()
 *  - add serial setup
 */

//-------------------------------------------------------------------------
// static declarations

static const char kCodeCR = '\r';
static const char kCodeLF = '\n';

static String s_serialReceiveBuff = "";
static bool s_serialClearOnNext = false;
//-------------------------------------------------------------------------
void setup() {
  Serial.begin(115200); 
}

String Serial_readCommand()
{
  if (Serial.available() == 0) {
    return "";  
  }

  if (s_serialClearOnNext) {
    s_serialClearOnNext = false;
    s_serialReceiveBuff = "";
  }
  
  char code;
  while(Serial.available() > 0) {
    code = Serial.read();
    if (code == kCodeCR) {
      continue;
    }
    if (code == kCodeLF) {
      s_serialClearOnNext = true;
      return s_serialReceiveBuff;
    } else {
      s_serialReceiveBuff += code;
    }
  }
}

void Serial_replyToCommand(String cmdline)
{
  if (cmdline.equals("hello")) {
    Serial.println("hello, 7of9");
  } else {
    Serial.println(cmdline);    
  }
}

void loop() {
  String rcvd = Serial_readCommand();
  if (rcvd.length() > 0) {
    Serial_replyToCommand(rcvd);
  }
}
```

## 実行例

動作確認は「シリアルモニタ」で115200bpsにして行う。

以下の入力をしたとする。

```txt:入力
hello<CR><LF>
test<CR><LF>
hello<CR>
abc<CR>
hll<CR>
```

それぞれの応答は以下のようになる。

```txt:応答
hello, 7of9
test
hello, 7of9
abc
hll
```

受信文字列の判断は equals() を使っているが、そのうち、カンマ区切りをパースするようにする。
https://www.arduino.cc/en/Reference/StringEquals


## 備考

`<LF>`を改行のコードとしているため１つは入れないといけない。
`<CR>`は単純に読み捨てているのでなくてもいい。
vmware > ウィンドウの表示機能のユニティでタスクバーを表示する > 「表示」->「ユニティのタスクバーを表示」

```txt:動作環境
VMware Fusion on MacOS X 10.8.5
Windows 8.1 pro (64bit) on VMware Fusion
```

これまではVMware FusionでWindowsを走らせる時にシングルウィンドウで実行してきた。

ウィンドウ表示メニューのユニティを使えば、Macbook Air 13インチの画面と27インチのモニタ両方にWindowsの画面が表示できる。それにより、同じキー入力体系での作業ができる。
(KeyRemap4Macbookを使いこなせばそういうこともできるのかもしれないが）

ユニティを使う時は「表示」->「ユニティのタスクバーを表示」を選択することでWindowsのタスクバーにすぐにアクセスできるようになるのを今知った。

しかし、ユニティで実行するとレスポンスが明らかに遅い。
結局シングルウィンドウ使用に戻すかもしれない。
ESP8266 > FS.h > No such file or diretory > [ツール]>[マイコンボード]がGeneric ESP8266 Moduleでなかった

```txt:動作環境
ESP-WROOM-02
Arduino IDE 1.6.6
```

久しぶりにSPIファイルシステムを使うスケッチを実行してみた。
http://qiita.com/7of9/items/58e73312a37ca51e7e00

以下のエラーが出た。

> fatal error: FS.h: No such file or diretory

以前に動いていたのに理由は分からない。

[ツール]>[マイコンボード]の項目が Arduino Nano になっていた。Generic ESP8266 Module に変更したら上記のエラーはなくなった。

~~変更した覚えはないが、とりあえずよしとする。~~
Adruino Nanoで困っているというQiita記事が何日か前にあり、その解決策を探ろうとして設定を変更したのだろうか。

[ツール]>[マイコンボード]の設定はスケッチごとに保持されるのでなくArduino IDE自身が持っているようだ。一度変更してから別のスケッチを開いてもその変更がそのままとなっているようだ。
JavaScriptにおける連想配列のforループ操作

# 概要

変数を連想配列に入れるのが大好きで、使用頻度がめちゃくちゃ高い割に毎回忘れる連想配列のforループ操作。

# 連想配列のkey-valueを順番に取得する

```js
let hash = {
  key0: "value0",
  key1: "value1"
};

for (let key in hash) {
  alert('key:' + key + ' value:' + hash[key]);
}
```

# 追記: コメント欄より

このエントリは上記の短い記述に対し、本当にやりたかったことを汲んだ知見が寄せられ大変勉強になりました。このエントリを参照するエントリもじわじわ増えており、(実である)コメント欄がスルーされてしまうのは勿体ないのでコメント欄の内容を再掲？します(2019.06.20)

このエントリに連想配列の値参照・操作の方法を求めて辿り着いた方は是非コメント欄に目を通してください。

<small>Consoleにコピペすればすぐ実行結果を確認できるよう、動作確認用の変数宣言を残し、出力形式を`console.log()`に変更しています。</small>

誤り・もっと良い記述がありましたら編集リクエストを送るかコメント欄までお願いします。

## `map()`を使う

@yoichiro6642 さんのコメントより、`map()`を使う方法

```js
{
  let hash = {
    key0: "value0", key1: "value1"
  };

  Object.keys(hash).map(key => console.log('key:' + key + ' value:' + hash[key]));
  // [undefined, undefined]が出てしまうが内容を確認したいだけなら十分
}
```

## `forEach()`を使う

↑を受けた @le_panda_noir さんのコメントより`forEach()`を使う方法

```js
{
  let hash = {
    key0: "value0", key1: "value1"
  };

  Object.keys(hash).forEach(key => console.log('key:' + key + ' value:' + hash[key]));
}
```

## `Map.prototype.forEach()`を使う

@think49 さんのコメントより`Map.prototype.forEach()`を使う方法

[Map.prototype.forEach() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Map/forEach)

```js
{
  let map = new Map([['key0', 'value0'], ['key1', 'value1']]);

  map.forEach(function (value, key) {
    console.log('key:' + key + ' value:' + value);
  });
}
```

## `Object.entries()`を使う

@hikaru_oao さんのコメントより`Object.entries()`を使う方法

```js
{
  let hash = {
    key0: "value0", key1: "value1"
  };

  for (let [key, value] of Object.entries(hash)) {
    console.log('key:' + key + ' value:' + value);
  }
}
```
技術英語 > I was working on [the spiral staircase] for the Vitra Design Museum. / virtuous circle / vicious circle

@ AXIS Feb. 2016 > Cover interview: Frank Gehry

> I was working on <font color=red>the spiral staircase</font> for the Vitra Design Museum.

螺旋階段
http://eow.alc.co.jp/search?q=spiral+staircase&ref=sa

<hr>
関連して思い出したのは

http://eow.alc.co.jp/search?q=virtuous+circle&ref=sa
> virtuous circle
> 好循環

それに対比して

http://eow.alc.co.jp/search?q=vicious+circle&ref=wl
> vicious circle
> 2. 悪循環、いたちごっこ

Coders at work か プログラマが知るべき97のこと、だったかで「自分が将来保守すべきものはどんどん増えていく。そのためには自分の技術力を上げて行かないと対応できなくなる」というような文面があったと思う。

技術力を上げていくことで virtuous circleを保持したい。
xmlrpc.php へのアクセスがどこからどれぐらいきているか httpd のログを確認する

```
sudo grep xmlrpc.php /var/log/httpd/access_log | cut -f 1 -d ' ' | sort | uniq -c |sort -nr|head
```

＜環境＞
CentOS
Apache

＜参考＞
http://blog.nomadscafe.jp/2012/07/sort-uniq.html
簡易NAS上のドライブにTime Machineでバックアップするときの手順まとめ


ルータにHDDを繋げて簡易的なNAS環境？にしたので、
Time Machineでのバックアップもネットワーク越しに
やった方がスマートじゃん！て事で簡単な手順とハマった所の
トラブルシューティング的なものを自分用にメモとして
残しておきたいと思います。


## 基本的な手順
下記URLの手順を参考にした。
[参考URL](http://0800666.tumblr.com/post/2467610223/nas%E3%82%92time-machine%E3%81%AE%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%E5%85%88%E3%81%A8%E3%81%97%E3%81%A6%E4%BD%BF%E3%81%86%E6%96%B9%E6%B3%95)


## Time MachineにNAS上のドライブを認識させる
下記コマンドを実行。

`sudo tmutil setdestination /Volumes/TimeMachine`

`TimeMachine`の部分は環境ごとに異なる点に注意。

## バックアップ実行中に止まる、エラーになる時の対処

+ `sudo mdutil -i off /Volumes/TimeMachine/Backups.backupdb`を実行し、Spotlightのインデックス作成を止める

+ `Backups.backupdb` ディレクトリ中の `YYYY-MM-DD-hhmmss.inProgress` というディレクトリを削除

+ `/Library/Preferences/com.apple.TimeMachine.plist`を削除

+ Spotlightの検索結果の表示の中から不要なものを外す

+ バックアップ先のドライブをバックアップ対象から除外する


## その他
ウィルス対策ソフト等を入れている場合、バックアップ先のドライブを除外リストに追加する、または一時的に止めちゃった方が楽かも知れません。
Google Insights で１点でも高くするためにjavasciptを非同期に読み込む方法

**2016.02.22 下記コードでは動作しない可能性もあることが判明。良い方法が分からないので、追って更新します。**


[Google PageSpeed Insights](https://developers.google.com/speed/pagespeed/insights/)でwebサイトをチェックするとjqueryなどのjsを`</body>`タグ直前で読み込んでも次のようなチェックが入ることがあります。
> スクロールせずに見えるコンテンツのレンダリングをブロックしている JavaScript/CSS を排除する

## 普通に非同期に読み込む例

次のように`async`を使用し非同期に読み込めば、上記チェックにひっかかることはありません。

```html:js
<script src="jquery.min.js" async></script>
```

しかし、jqueryに依存するその他のコードが実行できずエラーになったりするので、**非同期かつ順序を考慮した読み込みを可能にさせる生javascript**を書くことにしました。

## 生javascriptでhtmlへ直接書き込みます。


第一引数にurl、第二引数にコールバックを渡します。

```js:javascriptを呼び出す関数
  function loadJs (url, cb) {
    var req = new XMLHttpRequest();
    req.open('GET', url);
    req.send();
    req.onreadystatechange = function() {
      if (req.readyState === 4 && req.status === 200) {
        var script = document.createElement('script');
        script.src = url;
        document.getElementsByTagName('head')[0].appendChild(script);
        if (cb) cb();
      }
    };
  }
```

次のコードのように、直接htmlに書き込んで使います。

```js:使用例
loadJs('/jquery.min.js', function({
  loadJs('//cdnjs.cloudflare.com/ajax/libs/materialize/0.97.3/js/materialize.min.js', function(){
    loadJs('/myscript.js');
  });
});

```

`myscript`は`jquery`と`materialize`に依存しており、`materialize`は`jquery`に依存していますが、上記のように書けばうまく動作します。（コールバック地獄ごめんなさい）

## 他の方法もありますが
今回掲載した方法はちょっとめんどくさいのですが、webpackやbrowserifyを使う環境を整えるよりは楽かなと思います。

## 同様のエラーがcssにも出るので、解決したい
のですが、こちらの良い解決方法はまだ検討中です。 
普段gulpを使っているので、[critical](https://www.npmjs.com/package/critical)というパッケージが魅力的で使ってみたのですが、良い感じなのですが、google先生のOKをもらえるまで使いこなせていません。おそらく`critical`を使いこなせば問題解決できるので、できたらメモがてら記事掲載するかもしれません。

## 参考サイト

[XMLHttpRequest MDN](https://developer.mozilla.org/ja/docs/Web/API/XMLHttpRequest)
[JavaScriptの読み込みにおける非同期スクリプト注入の悪影響](http://postd.cc/script-injected-async-scripts-considered-harmful/)

## リファクタリングや他の方法などコメントお待ちしております
自分のメモのための記事ですが、詳しい方からのアドバイスを期待してqiitaに書き込みました。気になる点やご指摘お気軽にお願いいたします。
IIS 8.5 にMediaWiki をインストールしよう

pukiwikiの対応PHPが古く移行先を検討中です。まずは有名なMediaWikiで実験です。

IIS 8.5（Win2012R2/Win8.1）に MediaWiki をインストールする方法です。

IIS 7（Win2008R2）の手順はTechnet様で公開されているので以下のサイトを参考に実施します。
■ IIS への MediaWiki のインストール
https://technet.microsoft.com/ja-jp/library/ff454060.aspx 

こちらのHPをWin2012R2、PHP 5.6ほかの新しいバージョンにした際の構築をメモしています。

1. Win2012R2のセットアップ
まずはWin2012R2のセットアップ。ここは省略します。

2. ADの参加（省略可能）
環境のDCサーバーに参加します。
私の環境ではAD Win2012R2です。

3. MediaWikiのインストール要件の確認の確認
とりあえず、最新版は怖いので、MediaWiki 1.23.13 LTSをインストールします。
■　Download
https://www.mediawiki.org/wiki/Download 
　
A. PHP 
サポート範囲のphp 5.6を使用します。
B. MySQL
MySQL 5を使用します。
C. Git
Git 2.*系を使用します。

4. IISのインストール
とりあえず、IISは標準構成のままインストールしました。

4.1 CGIのインストール
標準構成ではCGIが無効なので有効化（Win8.1はコントロールパネル）
<img width="393" alt="IIS01.png" src="https://qiita-image-store.s3.amazonaws.com/0/94366/a6291231-6d79-409e-a0ee-14f0dc5acfdc.png">

4.2 PHPのダウンロード
A. PHPのダウンロード
VC11 x86 Non Thread Safe (2016-Feb-04 03:06:33) をダウンロードします。
■ダウンロード
http://windows.php.net/download/#php-5.6-nts-VC11-x86 

B. Visual Stdio 2012（x64）
■Visual Studio 2012 更新プログラム 4 の Visual C++ 再頒布可能パッケージ　
https://www.microsoft.com/ja-JP/download/details.aspx?id=30679&tduid=(3fe4b9362ceb34fef6c6b57a5223425a)(256380)(2459594)(TnL5HPStwNw-N8T6BACcIa3hN0IsWIyr0A)()

4.3 PHPの設定
4.3.1 バイナリファイルの設置
パスの都合上、ダウンロードしたphpバイナリを
> C:\php
に移動

4.3.2 パンドラマップにphp を追加する
モジュールマップの追加を行います。

4.4 php のテスト
> C:\inetpub\wwwroot

にtest.phpを配置します。
以下を記載して、PHPの情報を確認します。
> <?php phpinfo(); ?>

4.5. MySQL
データベースをインストールします。

mysql-5.7.11をダウンロード、インストールします。
■ダウンロード
http://dev.mysql.com/downloads/installer/

フル機能、サーバーモードで設定します。

4.6. php.ini（構成ファイル）の修正
PHP.iniの作成（php.ini.***ファイルがあるのでリネームして使用）
以下の箇所がコメントアウトされているので、コメントを外します。
こちらを外すことでMySQLの拡張機能が使用できます。
> extension_dir = "./ext"
> extension=php_mysql.dll
> extension=php_mysqli.dll

4.7. IIS再起動
状態を反映させるために再起動します

4.8. Gitインストール
こちらは初期構成でインストール
CUIは、Windows CMDと統合したほうが楽な場合もあり


5.MediaWikiのインストール
ダウンロードしたファイルをWEBアクセス可能なフォルダーに保存。アクセス権を付与（たとえば、Domain Users）

6.WEBでアクセス
http://localhost/mediawiki/index.php

インストールします。インストールあと、PHPファイルができるのでMediaWikiのフォルダーに保存

以上、完成。

![iis.png](https://qiita-image-store.s3.amazonaws.com/0/94366/885e2e79-f623-cca8-b0c7-a25dfa26d9ac.png)

[参考サイト]
http://symfoware.blog68.fc2.com/blog-entry-1077.html
Pythonの音声入出力

音声を入力して何かしらのフィルタを掛けて出力するプログラムを実際つくってみようとPythonでやってみた際、入出力であたふたしたのでまとめました。一般的な音声ファイル（サンプリングレート44100Hz、量子化ビットサイズ16bit）のファイル基準で書きます。

# 音声の入力
入出力はwaveファイルを利用し、waveパッケージをインポートします。

```lang:input
import numpy as np
import wave

name = "filename.wav"
wavefile = wave.open(name, "r") 
framerate = wavefile.getframerate()
data = wavefile.readframes(wavefile.getnframes()) 
x = np.frombuffer(data, dtype="int16") 
```

waveファイルから音声を入力する際に必要な情報は1サンプリングごとの値。
`.getnframes()`は全サンプル数を取得します。すなわちデータの長さです。
`.readframes()`により指定した長さ分のデータを取得します。

しかしこのままではバイナリ表記で取得されるため、`frombuffer()`でint型に変換します。
これでnumpy配列で値を扱うことができます。このときの値はint16で-32768～32767の値をとっているので音声処理する場合は割るなり調整します。

また、`.getframerate()`はサンプリングレートを取得します。音声処理ではファイルのサンプルレートは必要になると思うので入れてあります。

あとは煮るなり焼くなり…。

#音声の出力
入力と逆のことをするだけですが。。。

```lang:output
w = wave.Wave_write("output.wav")
w.setnchannels(1)
w.setsampwidth(2)
w.setframerate(44100)
w.writeframes(x)
w.close()
```

waveファイルにはヘッダの情報が必要なので、
`.setnchannels()` `.setsampwidth()` `.setframerate()`
が最低でも必要みたいです。
`.setsampwidth()`はサンプル(量子化)サイズですが16bitなら2(バイト)。

また、`.writeframes()`の場合nframesが自動的にデータ数で修正されるので設定しなくても問題ありませんが、`.writeframesraw()`の場合はnframesを修正しないが出力音声はちゃんとデータ分再生されます。(nframesの設定は意味が無い？)

実行すればwaveファイルが出力されていると思います。


**・pyaudioの利用**
pyaudioのパッケージはデフォルトでは入っていないようなのでまだ試していません。
ストリーム再生・録音をする場合に便利で、動的なファイルを扱う場合はpyaudioが良いかも。

#まとめ
音声データを10進数のデータ配列として扱う場合は、今回の方法で取得できる。
今回の場合モノラルで一般的なサンプルビットサイズ16bitの時を想定しているので、8bit、24bitなどの特殊な音声を入力する場合はバイナリ変換の際に、その型サイズで変換する必要がありそうです。
出力に関してはじめバイナリ変換しないとできないと思ってましたがint型配列データを渡すだけでもOKな模様。ただし、データ配列の型は16bitのときint16でないとだめっぽい。

#参考
[21.5. wave — WAVファイルの読み書き — Python 2.7.x ドキュメント ](http://docs.python.jp/2/library/wave.html)
[Python で wave ファイル生成 | Weboo! Returns.](http://weboo-returns.com/blog/generate-wave-file-by-python/)
[Pythonでサウンドスペクトログラム - 人工知能に関する断創録](http://aidiary.hatenablog.com/entry/20111001/1317441171)
[【python】波形の表示（モノラル・ステレオ）【サウンドプログラミング】 - すこしふしぎ．](http://ism1000ch.hatenablog.com/entry/2014/05/13/175911)
[初心者向け] DroidKaigiで知ったツール・コマンド類を少しずつ試す

2016のDroidKaigiも最高でしたね！中でも僕は operandoOSさんの"Android Dev Tools"の話が印象に残りました。というのも普段はツール類を全然活用してないので、セッションで出てきたものを使ってもっと便利に開発するぞと思った次第です。。。が、あまりにも数が多かったのでとりあえず手軽かつ使いやすそうなものをピックアップして試しました。

# ライブラリの更新をまとめて確認する

`./gradlew dependencyUpdates`

- gradleのプラグイン。導入は https://github.com/ben-manes/gradle-versions-plugin のReadmeを見ながらProjectのbuild.gradleに設定を追加するだけ。追加したらプロジェクトのルートで上記のコマンドを叩くとアプリで使っているライブラリの更新をチェックして、結果をテキストに残してくれます。

# adb実行時に接続する端末を選択できるようにする

`adb-peco`

- adbで端末に入るとき複数端末つながっているとエラーでこけるけど、pecoと組み合わせることでコマンド実行時にどの端末につなぐか選択できるようにする。
- 前提としてadbコマンドにパスが通っている必要があるのでandroid-sdkのplatform-toolsにパスを通しておきます。
- pecoとgoはすでに入っていたので `~/go/src/github.com` に https://github.com/tomorrowkey/adb-peco をcloneして `~/go/bin`にシンボリックリンクを作っときました。これで`adbp shell`で接続する端末を選択できます。めっちゃ便利。

# 端末にコンソールから直接文字を打ち込む

`adb shell input text （入れたい文字列）`

- テスト機のEditTextにフォーカスがあたった状態でテキストをコマンドから送り込めます。実際にhogehogeとか入れて試すとそのままEditTextに表示されました。もちろん`adbp`を使えば選択したうえで文字を送り込めます。

# 開いているViewの階層を表示する

`adb shell dumpsys activity top`

# DesignOverlay - 開発便利ツール
- 開発中のデザイン補助用のアプリ。Storeの説明みたほうが早い

https://play.google.com/store/apps/details?id=com.ms_square.android.design.overlay&hl=ja

# ほかにもあるけど
- とりあえずこんな感じで少しずつ道具を増やしていこうかなと思いました。
Struts2のJSPで余計なHTMLタグを自動生成させない方法

# 旧時代の名残り

Struts2は標準でテンプレートエンジンであるFreeMarkerを使って、HTML4時代のUI＋JavaScriptの生成やタグの生成をします。

ただしこの自動生成するタグ、今となっては余計なお世話状態であり、HTMLのタグについては標準のHTMLだけを出して欲しいことが多々あります。

今回はそれをさせない方法です。

# プロパティファイルに次の宣言をするだけ

struts.propertiesファイルに、以下の1行を記載します。

```properties:struts.properties
struts.ui.theme=simple
```

これだけです。

あとはstrutsタグの記載は変えることなく、Actionクラスから値を取得するstrutsタグの機能はそのままに、生成されるHTMLは余計なデコレーションがない状態にできます。
[lodash] 総乗メソッド_.prodと_.prodByを追加する

# 問題
[lodash](https://lodash.com/)は多くの便利なメソッドを提供してくれるJavaScriptのユーティリティライブラリである。
しかしながら、本記事執筆時点の最新版であるlodash 4.5.0では、総和を行うメソッドである`_.sum`と`_.sumBy`は提供されているものの、総乗を行うメソッドは存在しない。
そこで、総乗を計算する独自拡張メソッド`_.prod`と`_.prodBy`を追加し、これを既存のメソッド`_.sum`や`_.sumBy`と同じような感覚で使えるようにしたいのだがどうすればよいか。

# 解決策
lodashは`_.mixin`という、ライブラリ利用者がlodashを独自に拡張できる仕組みを用意しており、これを利用するとlodashに独自拡張メソッドを安全に追加することができる。

```javascript
_.mixin({
    prod: function (array) {
        return _.prodBy(array, _.identity);
    },
    prodBy: function (array, iteratee) {
        var iterateeFunc = _.iteratee(iteratee);
        return array.reduce(function (prod, element) {
            return prod * iterateeFunc(element);
        }, 1);
    }
}, {chain: false});
```

# 使用例

```javascript
_.prod([4, 2, 8, 6]); // → 384
_([4, 2, 8, 6]).prod(); // → 384


var objects = [{n: 4}, {n: 2}, {n: 8}, {n: 6}];

_.prodBy(objects, function (o) { return o.n; }); // → 384
_.prodBy(objects, "n"); // → 384
_(objects).prodBy(function (o) { return o.n; }) // → 384
_(objects).prodBy("n") // → 384
```
「Scheme入門」（湯浅太一 著：岩波書店 1991年）をGaucheで読む（１）

この本が書かれた当時と現在では、Schemeの規格（RnRS）が違い、Gaucheでは 
\*\*\* ERROR:
になる箇所がいくつかある。

P15の

```scm

(eval '(+ 12 5))

```

は

```scm

(eval '(+ 12 5) (interaction-environment))

```

と、(interaction-environment)等、第二引数に環境を与えてなくてはならない。
P119

```scm

(define (count-cons x)
  (if (symbol? x)
      0
      (+ 1
	 (count-cons (car x))
	 (count-cons (cdr x)))))

```

は、
gosh> *** ERROR: pair required, but got ()
となるので例えば

```scm

(define (count-cons x)
  (if (or (symbol? x)
	  (null? x))
      0
      (+ 1
	 (count-cons (car x))
	 (count-cons (cdr x)))))


```

のように空リスト
()
を car か cdr せずにするよう、工夫が必要。

参考：twitter.com/anohana
　　　twitter.com/SaitoAtsushi
　　　http://kreisel.fam.cx/webmaster/clog/2013-07-22-1.html

蛇足：どうでもいいことだが、Gaucheの作者である川合史朗さんのツイッターのアカウントと、私の愛するアニメタイトルの略称を equal? すると #t が返ってくる。
タグを発動させずに NGUI のラベルにユーザ入力文字列を表示する方法。

# TL;DR

* 可能なら UILabel の設定の BBCode をオフにする。
* NG ワードチェックしているなら、 `[`, `]` を NG ワードに加える。
* `[`, `]` を `(`, `)` 等の似た記号に置き換えて無害化する。
* 記号をエスケープする方法が用意されていないので、 BBCode を有効にしつつ `[b]` などと表示する簡単な方法はない。

# はじめに

> NGUIのUIInputで入力欄を作成した場合にBBCode付きで文字列を入力されてしまうと
その文字列を使用している場所で太字や斜体が適用されてしまう不具合に遭遇したため
それを防ぐために作成しました
[【Unity】NGUIで使用可能なBBCodeを文字列から削除して返す拡張メソッド - コガネブログ](http://baba-s.hatenablog.com/entry/2015/06/16/000000)

偶然見かけたんですが、この方法では防げないため、まとめました。
[FateGO などのゲームで名前に色をつけたりできてしまう件](https://twitter.com/false800/status/629450756890845184) ような、「悪意のあるユーザが入力した文字列でも BBCode のタグを発動させずに UILabel に表示したい」という前提で話をすすめます。

NGUI は手元にあった Version 3.8.2 で検証しています。

# タグを取り除くのは難しい。

[【Unity】NGUIで使用可能なBBCodeを文字列から削除して返す拡張メソッド - コガネブログ](http://baba-s.hatenablog.com/entry/2015/06/16/000000) では `\[b\](.*)\[\/b\]` のような正規表現でタグを取り除いていますが、 NGUI では閉じタグがなくても発動するため、 `"[b]b"` のような形で回避可能です。

また NGUI には `NGUIText.StripSymbols` というメソッドが用意されていて、 BBCode が発動してタグが消えた後の実際に表示される文字列と同じものを手に入れられますが、これはタグが全部取り除かれたわけではありません。
例えば、 `"[b[b]]b"` を渡せば `"[b]b"` が返ってきて発動します。

タグを取り除くのは難しいですし、「ユーザには BBCode つきで入力してもらいたいけど表示する時はタグだけ取り除いて表示したい」という場面はまずないと思われるので、なるべくユーザが入力した文字列をそのまま表示する事を目指しましょう。

# UILabel の設定の BBCode をオフにする。

ユーザの名前だけを表示するラベルのような、もともと BBCode を使わない場合はオフにするだけで十分です。
当然、 BBCode を含むシナリオに名前を埋め込みたいような場合は使えません。

# エスケープする方法は用意されていない。

されていません。残念ですね。
ちなみに uGUI のリッチテキストでも用意されていないようです。残念ですね。

# 似た記号に置き換える。

ということで似た記号に置き換えます。
BBCode のタグは `[` で始まるものだけなので、この記号だけ潰せば安全ですが、対応していないのはなんだか気持ち悪いので `]` も置き換えてしまいましょう。

```csharp
public static class StringExtensions
{
    public static string SanitizeBBCode( this string self )
    {
        return self.Replace("[", "(").Replace("]", ")");
    }
}
```

簡単ですね。

# まとめ

エスケープする方法が用意されていないのは残念ですね。
UnityのWebGLで書きだしたゲームをGitHubを使って公開する

Unityで作ったゲームをWebGLで書き出し、それをGithubのgh-pagesを使ってWebサイトとして公開する方法を紹介する。

WebGLの主な利点は

+ WebPlayerと違ってプラグイン無しで遊ぶことができる
+ WebPlayerと違って、Chromeでも遊ぶことができる。

である。またGithubを利用すると無料で公開することができる。

流れは

1. UnityからWebGLで書き出す
2. githubのgh-pagesブランチにコミットしプッシュする

の二段階である。

# UnityからWebGLで書き出す

ゲームが作り終わったとします。
まず、Build Settingsを開いたのち、WebGLにプラットフォームを変える。

![image](https://qiita-image-store.s3.amazonaws.com/0/96970/a0e7619a-4c2f-4a4c-bd5a-71d3fa99e281.png)

PlayerSettingをクリック
![image](https://qiita-image-store.s3.amazonaws.com/0/96970/246d7f71-21d1-6492-792d-603b93683bd4.png)

ゲームの設定をいじろう
![image](https://qiita-image-store.s3.amazonaws.com/0/96970/316e55f0-afab-3b9f-e009-e7b21c80cebb.png)

これらを設定したら...Build!

![image](https://qiita-image-store.s3.amazonaws.com/0/96970/8cb8ce00-b854-2f09-617f-928840c8853b.png)

保存場所はどこでも良い。

# GitHubの設定

ここからは色々なやり方(ターミナル使ったり、Source Tree使ったり)があるが、さっきのWebGLの書き出しデータをgh-pagesというブランチにプッシュすれば良い。

GithubにアクセスしNew Repositoryをクリック
https://github.com/

![image](https://qiita-image-store.s3.amazonaws.com/0/96970/ff774a6d-80f0-48d3-385b-0d3f48310069.png)

レポジトリ名を入力
![image](https://qiita-image-store.s3.amazonaws.com/0/96970/30b55201-aa1d-cb89-dea1-c0c5f8ca7569.png)

SetUp in DeskTopをクリック。(もっと賢いやり方があるかもしれません)
![image](https://qiita-image-store.s3.amazonaws.com/0/96970/57376d50-3b61-2b85-6969-a02996e31270.png)

デスクトップにフォルダを作る。

わかりやすく「WebGLGame_remote」という名前にした。

そしてさっきの書き出しデータを、今作ったフォルダに入れる。

![image](https://qiita-image-store.s3.amazonaws.com/0/96970/1dcc8e5f-9a1a-5fec-7d55-90244419b684.png)

GithubDesktopを開き、gh-pagesという名前でブランチを作り、そこにコミットする。(手段は何でもよい)

![image](https://qiita-image-store.s3.amazonaws.com/0/96970/997a28b5-0568-2dd7-eb0e-4b2028016a41.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/96970/604ad728-4321-18bd-43db-36644d1e5f5b.png)


Pushする。
![image](https://qiita-image-store.s3.amazonaws.com/0/96970/66b37cae-1ebc-7501-cdb3-83b089a809b2.png)


このようにGithubにあがっていることが確認できていればOK
![image](https://qiita-image-store.s3.amazonaws.com/0/96970/c282bc94-f743-fe83-0eed-76069cef2c81.png)

これで完成です。

#公開したゲームのリンク

URLで

```
http://"githubアカウント名".github.io/"レポジトリ名"/
```

とうつとすでに公開されているのがわかります。
たとえばgithubアカウント名[iwaken71]、レポジトリ名[WebGLGame]だとこんな感じです。

http://iwaken71.github.io/WebGLGame/

このゲームはクリックするとボールの色がランダムに変わるゲームになっています。

ちなみにWebPlayerも全く同じ流れでGithubで公開することができる。
俺はもうRailsのメソッドのドキュメントが読みたいときはまずAPIリファレンス内を検索してからググろうと思った

メソッド名だけでググッてしまうと、同名のメソッドがやたらとあるので、知りたいことと違う同名メソッドがでてくることが多いが、違っていることに気づくとこまで勘が働かないときがある。（検索結果には1つしかでてきてないため）

* [Ruby on Rails API](http://api.rubyonrails.org/)

でメソッド名で検索すれば同名メソッドが山のように出てくるので、他にも候補があることが嫌でもわかる。

ちなみにかなり新し目のmasterブランチのコミットを指しているedge版もあった

* [Ruby on Rails API](http://edgeapi.rubyonrails.org/)

これらを見てからより詳しい情報を求めてググろうかな。

てかもうDashも使おう。
Emoji reactionsがコマンドラインからでも出来るのねー

同僚と簡単なやり取りで気がつくことが出来ました。

発言からAdd reactionを選ばないとダメだと思っていたんですが

https://get.slack.help/hc/en-us/articles/206870317-Emoji-reactions

を見ると

+:emoji_name:

でもreactionをつけることが出来ました。

今まではいちいちマウスを動かしましたがこれならその必要はないですね。

ちなみにどうして気がついたかいうと返信するときに

「確かに」と返すときに

「+:crab:」と返した時にreactionになって気が付きました。
Ordered Subset EM

Ordered Subset EMアルゴリズム (OSEM)はPositron Emission Tomography (PET)で最も広く用いられている画像再構成法です。

その原理は、観測データを複数のサブセットに分割し、各サブセットのデータを用いてサブセット数回画像を更新することを1回の主反復とすることで、全データで画像を1回更新する場合に比べて収束速度をサブセット数倍に加速するというものです。

OSEMは反復が進むに連れて解が振動するリミットサイクル現象を生じますが、実用上は反復回数を少なめにすることが多いためあまり問題になりません。

Filtered Back Projection (FBP)などの解析的画像再構成法に対するOSEMなどの逐次近似的画像再構成法の利点は、観測データの統計的性質を正しくモデリングしているため（特に画素値が0に近い領域の）雑音が抑えられる点、装置の観測モデルを投影計算に組み込むことで画質の改善が期待できる点の2つです。デメリットは計算時間が増加する点、画素値が0に近い領域の収束が遅い点などです。

逐次近似的画像再構成はX線CTに比べて光子数の少ないPETやSPECTなどの放射型CTにおいて良く用いられますが、最近は被曝量低減の観点からX線CTでも用いられつつあるようです。

![osem.png](https://qiita-image-store.s3.amazonaws.com/0/114365/dabc36f1-37a7-bcda-8818-d940d76e4f7e.png)

![profile.png](https://qiita-image-store.s3.amazonaws.com/0/114365/96b6e219-cdfe-9c98-4c0c-57dd6737a85e.png)

![objective.png](https://qiita-image-store.s3.amazonaws.com/0/114365/77ef9b77-4e94-8fb8-f102-0587d18daae4.png)

スライスあたりのカウント数2Mとしたため、あまりリミットサイクル現象を生じていないようです。

参考までにOSEMのソースコードです。
https://github.com/kibo35/reconstruction/blob/master/OSEM/osem.py
lag correlation

clear 

% read the ssh file
fid1=fopen('zeta_year.grd','r')
zeta1=fread(fid1,'float32');
fclose(fid1);
zeta=reshape(zeta1,601,182,50);

for i=1:601
    for j=1:182
     for t=1:50
        if zeta(i,j,t)>1e+10
            zeta(i,j,t)=NaN;
        end
    end
end
end

% select the 4 point 
lat=[5:0.25:50.25]';
lon=[110:0.25:260]';

% Point 1
latmn = max(size(lat(lat<=43.5)));
latmx = max(size(lat(lat<=43.5)));
lonmn = max(size(lon(lon<=140.5)));
lonmx = max(size(lon(lon<=140.5)));
p1=zeta(lonmn:lonmx,latmn:latmx,:);
clear latmn latmx lonmn lonmx

% Point 2
latmn = max(size(lat(lat<=37.25)));
latmx = max(size(lat(lat<=37.25)));
lonmn = max(size(lon(lon<=137)));
lonmx = max(size(lon(lon<=137)));
p2=zeta(lonmn:lonmx,latmn:latmx,:);
clear latmn latmx lonmn lonmx

% Point 3
latmn = max(size(lat(lat<=35)));
latmx = max(size(lat(lat<=35)));
lonmn = max(size(lon(lon<=132)));
lonmx = max(size(lon(lon<=132)));
p3=zeta(lonmn:lonmx,latmn:latmx,:);
clear latmn latmx lonmn lonmx

% Point 4
latmn = max(size(lat(lat<=32.5)));
latmx = max(size(lat(lat<=32.5)));
lonmn = max(size(lon(lon<=131.75)));
lonmx = max(size(lon(lon<=131.75)));
p4=zeta(lonmn:lonmx,latmn:latmx,:);
clear latmn latmx lonmn lonmx

% domain mean
for t=1:50
romsdam(t)=nanmean(nanmean(zeta(:,:,t),1),2);
end



% Mean values of 4 points 
p4m=(p1+p2+p3+p4)/4;
%p4m=squeeze((p1+p2+p3+p4)/4)-romsdam';

%for i=1:601
%for j=1:182
%for t=1:50

%zeta(i,j,t)=zeta(i,j,t)-romsdam(t);
%end
%end
%end



%p4m=p3;
% Compute 4 years lag-correlation

for lag=4:-1:0
%lag=0;
N=length(p4m);
nstr=1; % since 1971 year
% standard deviation of p4m time series
sd_p4m=std(p4m(nstr+lag:N),1);

% mean of p4m time series in the responding period (namely, nstr:N-lag)
mean_p4m=mean(p4m(nstr+lag:N));

% standard deviation of ssh map
sd_ssh=std(zeta(:,:,nstr:N-lag),1,3);

% mean of ssh map in the responding period (namely, nstr+lag:N)
mean_ssh=mean(zeta(:,:,nstr:N-lag),3);

summ=0;
for i=nstr:N-lag
   summ=summ+(p4m(i+lag)-mean_p4m)*(zeta(:,:,i)-mean_ssh);
end

r(:,:,5-lag)=summ/(N-lag-nstr+1)./(sd_p4m.*sd_ssh);
end

clear lag
lag=1;
% standard deviation of p4m time series
sd_p4m=std(p4m(nstr:N-lag),1);

% mean of p4m time series in the responding period (namely, nstr:N-lag)
mean_p4m=mean(p4m(nstr:N-lag));

% standard deviation of ssh map
sd_ssh=std(zeta(:,:,nstr+lag:N),1,3);

% mean of ssh map in the responding period (namely, nstr+lag:N)
mean_ssh=mean(zeta(:,:,nstr+lag:N),3);

summ=0;
for i=nstr:N-lag
   summ=summ+(p4m(i)-mean_p4m)*(zeta(:,:,i+lag)-mean_ssh);
end

r(:,:,6)=summ/(N-lag-nstr+1)./(sd_p4m.*sd_ssh);
addpath(genpath('/home/liu'))
wrtgrd1(r,'lagcorr2original.grd')
underscoreコードリーディング（omit）



underscoreに詳しくないので、勉強半分でソースコードを読む。



##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##omitとは


###[underscorejs.orgのomit](http://underscorejs.org/#omit)

こんな説明。
>####_.omit(object, *keys) 
>Return a copy of the object, filtered to omit the blacklisted keys (or array of keys).
>Alternatively accepts a predicate indicating which keys to omit.


```javascript
_.omit({name: 'moe', age: 50, userid: 'moe1'}, 'userid');
=> {name: 'moe', age: 50}
_.omit({name: 'moe', age: 50, userid: 'moe1'}, function(value, key, object) {
  return _.isNumber(value);
});
=> {name: 'moe', userid: 'moe1'}
```

------------- 

（pickの反対）
ブラックリストに登録されたkeys（もしくはkeysの配列）をフィルターしたあとのコピーされたオブジェクトを返します。
もしくは、keysの代わりにpredicateの関数を指定することによって除外することができます。

###[underscore.omit](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L1044)
コード的にはこのあたり。

```javascript
   // Return a copy of the object without the blacklisted properties.
  _.omit = function(obj, iteratee, context) {
    if (_.isFunction(iteratee)) {
      iteratee = _.negate(iteratee);
    } else {
      var keys = _.map(flatten(arguments, false, false, 1), String);
      iteratee = function(value, key) {
        return !_.contains(keys, key);
      };
    }
    return _.pick(obj, iteratee, context);
  };

```

iterateeがfunctionだった場合、iterateeをnegateのiterateeとして代入する。
そうでない場合、_.mapを用いて、argumentsをflattenで配列化したものをStringにして?配列化する。
iterateeに_.containsの否定の結果を返すfunctionを代入する。

_.pickを用いた結果を返す（_.negateもしくはcontainsの否定を利用するので、pickの否定の形となる）
Capistranoのデプロイで不満だった事をcapistrano-bundle_rsyncが解決してくれた

# 既存のCapistranoでのデプロイでの不満
最近、Railsアプリのインフラを管理しているが、既存のデプロイシステムで以下の様な不満があった。

## 全てのアプリケーションサーバーにsshしてgit cloneしている
全てのサーバーに、sshでログインする必要があり、全てのサーバーでgit pull出来るようにdeploy keyを設定しておく必要がある。
特に、Circle CIからdeployする様な場合には、Circle CIから全てのサーバーにssh出来るように設定を加える必要もあって結構面倒。
デプロイ時にいちいちCircleCIのIPを開けてたりする。

## 全てのアプリケーションサーバーでassets:precompileしている
assets:precompileは重い処理なので、一回やったらそれを全サーバーにコピーする方が賢い。
そもそもアプリケーションが動いている時にやっちゃうと貧弱なサーバーだとCPUが100%にはりつく。

## アプリケーションサーバー上でdb:migrateが走っている
これもassets:precompileと同様にアプリケーションサーバーでやったらまずい。

## 全てのアプリケーションサーバーでbundle installしている
gemに更新があるとbundle installも結構重い。

## 複数のプロジェクトに大体同じ様なCapistranoの設定が入っている
最近流行のマイクロサービスに乗っかっているので、アプリケーションはどんどん増える。その度に、殆ど同じ様なcapistranoの設定を入れている。
unicornの起動方法をちょっと変えたりする。 => 全サービスのCapistranoの設定を変更する。
delayed_jobの起動方法をちょっと変えたりする. => 全サービスのCapistranoの設定を変更する。
<b>心が折れる。</b>

# 理想型
という事でこんな形にしたい。

- デプロイサーバーを一つ立てて、全てのアプリケーションをそこから配布したい。アプリケーション側にはCapistranoの設定は書きたくない
- アプリケーションサーバー上からgitにアクセスしなくても良いようにする。
- assets:precompileはデプロイサーバー上で一回だけ行って、アプリケーションサーバーにはそれらをコピーするだけにする
- db:migrateやdb:seed、db:seed_fuなどもデプロイサーバー上で行う
- bundle installもデプロイサーバーで行って必要なファイルだけアプリケーションサーバーに配布したい

# capistrano-bundle_rsyncというgemが全て解決してくれた

色々と試行錯誤していたら、capistrano-bundle_rsyncという便利なgemを発見した。
https://github.com/sonots/capistrano-bundle_rsync

設定はものすごく簡単なのでREADMEを見るだけで簡単に設定出来た。

How it worksだけ転載。

```
Capistrano::BundleRsync works as followings:

1. Do git clone --mirror URL .local_repo/mirror on a deploy (local) machine.
2. Extract a branch by git archive {branch} to .local_repo/releases/{datetime}
3 .Do bundle --without development test --path .local_repo/bundle on a deploy (local) machine.
4. Deploy the release directory to remote machines by rsync.
5. Deploy the bundle directory to remote machines by rsync.
```

要するに、自分の指定したディレクトリにソースを持って来て、諸々処理した後に、そのディレクトリをrsyncで各サーバーに配布している。
本家のcapistranoと同様にhookでassets:precompileやunicorn起動などの処理を追加していけばok。

Q&Aにも書いてあるけど、capistrano-rsync (https://github.com/moll/capistrano-rsync) と違って、bundle installもデプロイサーバーで行えるのが良い。capistrano-rsyncは本家がメンテしてないようにも見えた。
あと、当たり前だが、OSのバージョンなど環境を揃える必要がある。

# こんな点も良かった
## デプロイサーバーのスペックを上げる
全サーバーで処理をしていた時には、いくらassets:precompileが遅かろうとbundle installに時間がかかろうと、全サーバーのスペックを上げるという選択は無かった。
お金かかるから。
でも、デプロイサーバー一台なら多少は金額の投資も出来るので、十分なスペックのサーバーを用意出来る。
結果的にdeployは早くなる。

## サーバー追加が楽
デプロイサーバー上にある諸々をrsyncしたらサーバーが完成する(もちろんrubyの設定などは事前にしてあるとして)。

### サーバーが増えた時に多分嬉しい
rsyncを並列で走らせる事が出来るので、帯域が許す限りは並列で一気に配布出来る。

# まとめ
という事で、capistrano-bundle_rsyncを使って、各Railsアプリケーションをデプロイ出来るような小さなrubyアプリケーションを書いて、デプロイを一任する様な形に出来ました。
AWS Lambda でEC2の起動・停止を行う

# 目的
AWSのEC2の起動・停止をLambdaを使用して決まった時間に行う

# コード

まずは、起動させる方

```
var AWS = require('aws-sdk');

// EC2のアクセス権限を持っているユーザ
var accessKey = 'XXX';
var secretAccessKey = 'XXX';

exports.handler = function(event, context) {
    
    var ec2 = new AWS.EC2({
        accessKeyId: accessKey,
        secretAccessKey: secretAccessKey
    });
    var params = {
        // 起動対象のEC2のインスタンスID
        InstanceIds: ['i-00640ca5']
    };
    
    ec2.startInstances(params, function(err, data){
        if (err) {
            context.done('error', err);
        } else {
            context.succeed('handler complete');
        }
    });
};
```

次に停止させる方ですが、上記ソースに以下の変更を入れたものでOK

```
ec2.startInstances → ec2.stopInstances
```

# イベントソース
イベントソースには、以下のように起動or停止させたい時間を設定すればOK

- Event source type   : CloudWatch Events - Schedule
- Rule name           : 適当なもの
- Rule description    : 適当なもの
- Schedule expression : cron(0 0 * * ? *)　// __UTC__ なので注意（この場合は毎日9:00）

「Schedule expression」の詳しい書き方は以下を参照
[スケジュールされたイベントでの AWS Lambda の使用](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/with-scheduled-events.html)
RedmineとWordPressを同居させる方法

WordPressって便利なんですけど何でもかんでもリダイレクトさせてしまうんで、ほかのミドルウェア使おうと思ったら面倒なんですよね。

てことでどっちが先に入っててもいいですが、同居させる方法です。
環境は以下の通り

```
/DocumentRoot
 .htaccess #WPが生成するもの
-/Redmine
-/Wordpress
```

で、どうするかですが、Redmineのディレクトリに新しく.htaccessを作成して、リダイレクトしないように記述するだけです。

```:.htaccess
<IfModule mod_rewrite.c>
  RewriteEngine Off
</IfModule>
```

参考はこ↑こ↓
[WordPressのURL転送をサブドメインで無効化する http://rensrv.com/wp/subdomain-redirect-disable/](http://rensrv.com/wp/subdomain-redirect-disable/)
Cocos Studio v3.x　ListViewにPartsNodeを動的に追加してみる

Cococs StudioでListViewを設定したBaseNodeとパーツ部分になるPartsNodeを作成。
ListViewにPartsNodeを追加していって、さくっとGridView的なものを作る備忘録。

Cocos Studio側の作業は割愛。
##作りたいモノ
- 1行にボタン3つ
- スクロールして欲しい

完成イメージ↓
![listView1.png](https://qiita-image-store.s3.amazonaws.com/0/111752/ce78e202-4a48-adfc-ec30-800f0616874c.png)

###実装
```cpp:Main.cpp
//BaseNodeを読み込む
auto baseNode = CSLoader::createNode("BaseNode.csb");
baseNode->setPosition(Vec2(origin.x + visibleSize.width/2, 0));

//ListViewを準備
auto listView = itemNode->getChildByName<ui::ListView*>("ItemList");

//PartsNodeを追加
for (int i = 0; i < 6 ; i++) {
    //Partsの読み込み
    auto listPartsNode = CSLoader::createNode("Parts.csb");

    //スクロールを有効化するためにPartsをLayoutとして取得
    auto panelLayout = listPartsNode->getChildByName<ui::Layout*>("Parts");
    //PartsNodeを一度削除
    listPartsNode->removeChild(panelLayout, true);

    //Parts内の要素を諸々設定
    auto item = utils::findChildren(*panelLayout, "//Button_0");
    auto itemBtn = (Button*)item.front();
    itemBtn->setTag(0);
    itemBtn->setOpacity(255);
    itemBtn->addTouchEventListener(this,toucheventselector(Main::onTouchButton));

    //PartsをListViewに追加
    listView->addChild(panelLayout);
}

addChild(itemNode);

```

「pushBackCustomItem」での実装だとスクロールが右端の限られた部分でしかできず、
かつ、PartsNode内に設置しているボタンが押せなくて断念。
おそらく、普通のリストであればこれで問題なかったはず。

今回はどうしてもグリッド的に表示したかったので(GridViewの方法が分からず……)、
この様な形で再現。


参考：
[CocosStudioのUIEditorで作ったListViewを使う](http://qiita.com/kyokomi/items/46ee2f7c92cf1d3342b8)
[[Cocos2dx] ui::ListView 備忘録](http://mgstyt.blogspot.jp/2015/11/cocos2dx-uilistview.html)
PiZero > GPIO snap cable v0.1 

This article is for my entry to Pi Zero contest 2016.
https://hackaday.io/project/9526-bring-your-own-pizero-byop

## Background

It's good to have a snap cable for GPIO connection between PiZero and other MCUs.

With this snap cable, owners of the PiZeros can be quickly attach to the other MCUs without the need of the soldering of the PiZeros.
Also, breadboard experiment can be started just after unboxing the PiZeros if they the have breadboard.

## Bill of materials

Following is the prototype to show the concept of the GPIO snap cable.

Prepare the followings.

- universal PCB board, which have the size similar to those of PiZero's GPIO pins (2 x 20)
- Alligator Clips, which has the size enough to hold the PiZero and the PCB board together
- 24 AWG Wire
  - GND (e.g. green) for Pin# 06 of PiZero
  - TX (e.g. red) for Pin# 08
  - RX (e.g. orange) for Pin# 10

![DSC_0103.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/ecf4d2ee-8c78-7b5b-5ca6-998a95947892.jpeg)

## Soldering

Solder the AWG wires so that on the one side of the PCB Board, the soldered shape can be fit to the GPIOs of the PiZeros.

The possible positions to wire soldering would be the second column of the Board, which will be attached to the Pin# 06, 08, and 10 of the PiZero.

[GPIO of Pi2 @ element 14](https://www.element14.com/community/docs/DOC-73950/l/raspberry-pi-2-model-b-gpio-40-pin-block-pinout) 

![DSC_0108.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/f817aabc-fb26-5b46-52c1-4f5b02f16932.jpeg)

Repeat the procedure for all the three wires.

![DSC_0109.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/7c8cf136-12ba-8ad4-e829-ae35801876e1.jpeg)

Prepare the I-shaped straight pin header. Cut it to have the 6 pins (or those according to the geometry of your board having the ESP8266).

![DSC_0111.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/3acc4011-e384-faab-71a9-78541f242d7c.jpeg)

Solder the other side of the cable to the cut pin header, which has been soldered with the PCB board.

![DSC_0112.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/dd66c7f7-48b9-48b6-6e81-4ddf671c6557.jpeg)


## Attachment

Attach the PiZero and the PCB board with the Alligator Clip having care so that any misconnection does not occur on the PiZero. Connect the other side of the cable to the message station (based on the ESP8266 and a 8x2 LCD).

![DSC_0115.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/81870a36-9a10-3096-5133-7127f1388d35.jpeg)
gradle 最低限個人的まとめ

# 前提
フォルダ構成は以下のとおり。

```
- project_name
             ├ src
             │  ├ main
             │  │    ├ java
             │  │    └ resource
             │  └ test
             │       ├ java
             │       └ resource
             ├ build
             └ build.gradle
```

# 雛型

```build.gradle
apply plugin: 'java'
apply plugin: 'eclipse'   // eclipse関係の設定ファイル作成

// 使用するJavaのバージョン
sourceCompatibility = '1.8'
targetCompatibility = '1.8'

// ソースはUTF-8で記述
tasks.withType(JavaCompile){ options.encoding = 'UTF-8' }

repositories {
  // mavenリポジトリを使用
  mavenCentral()
}

dependencies {
  // 使用するライブラリを記述していく
  compile 'org.apache.commons:commons-lang3:3.3.2'

  // テストクラスのみで使用する場合は以下みたく。「testCompile」で
  testCompile "junit:junit:4.11"
}
```

# eclipseへのインポート
この状態で以下のコマンド実行

```sh
$ gradle eclipse
```

するとプロジェクト直下にdependenciesに記述したファイルの依存関係を含む「.classpath」だったり「.project」が出来上がるのでeclipseにインポート可能になる

# ビルド
```sh
$ gradle build
```

上記で、コンパイルやテストクラスの実行が行われる。
作成されたclassファイル等はbuildディレクトリに出力されている。
テストクラスの実行をさせたくない場合は以下のように「-x」オプションで指定したタスクを除外できる。

```sh
$ gradle build -x test
```

# Javaアプリを実行
作成したJavaアプリケーションをgradleから実行するにはまずは、以下のプラグインをbuild.gradleに追加する

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

次に、Mainクラスの指定を行う

```build.gradle
mainClassName = 'package.ClassName' // パッケージ名を含めたクラス名を指定する
```

そして、以下のコマンドを実行すると、コンパイルが行われ指定したクラスが実行される

```sh
$ gradle run
```

引数を渡す場合は以下のようにする
まずは、実行例

```sh
// 「hoge」と「fuga」という2つの引数を渡す
$ gradle run -Pargs="hoge fuga"
```

次にbuild.gradle

```build.gradle
// runの設定を変更する
run {
  // 「args」という引数が存在するかチェック
  if (project.hasProperty('args')) {
    // 存在する場合は、半角スペースでsplitして引数に設定する
    args(project.args.split('\\s+'))
  }
}
```


# WARファイルを作成
ディレクトリはこんな感じ(tomcat前提)
「webapp」ディレクトリ配下に「WEB-INF」ディレクトリだったり、js等の静的ファイルを置く感じ

```
- project_name
             ├ src
             │  ├ main
             │  │    ├ java
             |  |    ├ respurces
             │  │    └ webapp    // NEW!!
             |  |           ├ js
             |  |           ├ ...
             |  |           └ WEB-INF
             │  └ test
             │       ├ java
             │       └ resource
             ├ build
             └ build.gradle
```

まずは、war作成用のプラグインを追加

```build.gradle
apply plugin: 'war'
```

後は以下のコマンドを実行するだけで、「build/libs」配下にwarファイルが作成される

```sh
$ gradle war
```
DataBindingで'Cannot resolve symbol'エラーが出てきた時の対処


KotlinでDataBindingを使ってるときに[公式ドキュメント](http://developer.android.com/intl/ja/tools/data-binding/guide.html)通りに

```xml
<data>
    <import type="android.view.View"/>
</data>
```

```xml
android:visibility="@{user.isAdult ? View.VISIBLE : View.GONE}"
```

みたいな風に条件式使ってごにょごにょしようとしたら*Cannot resolve symbol [android:visibilityに記述した内容]*のエラーが出てきた

ちなみにKotlinでDataBindingするときは[KotlinでAndroid Data Bindingを使ってみた](http://qiita.com/rei-m/items/1ad5bbab92717252bbb2)が参考になります

## 調べてみた

```xml
android:visibility="@{View.GONE}"
```

を付けてみると……

```text
> Cannot resolve symbol @{View.GONE}
```

もうこれKotlin関係ないんじゃ？となったのでぐーぐる大先生のお力を借りることに…


[Issue 186266:	'Cannot resolve symbol' error on data binding expressions setting android:visibility attribute](https://code.google.com/p/android/issues/detail?id=186266)

さすがぐーぐる大先生って感じにIssueに上がってました

>Follow http://developer.android.com/tools/data-binding/guide.html, using android:visibility instead of bind:visibility, but it shows "Cannot resolve symbol" link to android:visibility="@{user.isFriend ? View.VISIBLE : View.GONE}"
>
>I know "bind:visibility" will fix this error, but could you please merge the "bind" functions into "android"?

とあるので

```xml
xmlns:bind="http://schemas.android.com/apk/res-auto"
```

をrootLayoutに付け足して

```xml
bind:visibility="@{user.isAdult ? View.VISIBLE : View.GONE}"
```

って感じにbind:visibilityで指定したら動きました!

## まとめ

- Cannot resolve symbolのエラーはKotlin環境特有のものではないかもしれないことがある
- xmlでCannot resolve symbolエラーが出たらとりあえずbind:属性に変えてみよう

## 補足

ビルド失敗したらリビルドすればイケることがあります

以下環境

- AndroidStudio1.5.1
- com.android.tools.build:gradle:1.5.0
- com.android.databinding:compiler:1.0-rc5
chefでファイル内に存在しないときに追加する方法と、正規表現のエスケープ

# 概要

環境変数を使いしたい時に、/とか$とかあると、うまく置換ができなかったので、
なんとかエスケープでもできないかと調べた。

ファイル内に存在しないときに、行を挿入する方法は、

```
file=Chef::Util::FileEdit.new(挿入したいファイル)
fileinsert_line_if_no_match(/regexp/, 挿入したい文字列)
```

# 結論

以下の方法で解決した。
他の方法もあるかもしれない。

```
Regexp.escape(string)
```

# 実際の例

こんなかんじで、意図どおりの動作になった。

local_env_sh_path には、設定したいファイルのフルパスが書かれているとする。

```rb
ruby_block "write_environment_values" do
  block do
    #
    path = "export PATH=$PATH:/galaxy/Sailfish-0.6.3-Linux_x86-64/bin"
    regexppath = Regexp.escape(path)
    pathfile = Chef::Util::FileEdit.new(local_env_sh_path)
    pathfile.insert_line_if_no_match(/#{regexppath}/, path)
    pathfile.write_file
    action :run
  end
end
```
eloquentのrelationships定義の備忘録

[Eloquent：リレーション 5.1 Laravel](http://readouble.com/laravel/5/1/ja/eloquent-relationships.html)に全て書かれていることですが結構忘れがちなので、[wordpressのtableをeloquentで操作できるようにした](https://github.com/atomita/wordpress-eloquent)ついでに

# まとめ

- 現modelに、他modelのkeyのcloumnがある場合は `belongsTo`
- 現modelのkeyの値を持つ他modelへは `hasOne`、`hasMany`
- 中間tableを経由したrelationshipsは `belongsToMany`
- hasManyなmodelを経由してのrelationshipsは `hasManyThrough`
- 動的に依存先を変えたい場合は `morphMany`、`morphMany`、`morphedByMany` を使う


# wordpressのpostsで考えてみる

[データベース構造 - WordPress Codex 日本語版](https://wpdocs.osdn.jp/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E6%A7%8B%E9%80%A0#.E3.83.87.E3.83.BC.E3.82.BF.E3.83.99.E3.83.BC.E3.82.B9.E9.96.A2.E9.80.A3.E5.9B.B3)にER図があります
postsを中心にusers、comments、termsなどがrelationしていますね

- postmetaのpost_idで参照され
- post_authorでusersを参照し
- commentsのcomment_post_idで参照され
- term_relationshipsを挟んでterm_taxonomyと繋がってる

コードにするとこんな感じ

```php
use Illuminate\Database\Eloquent\Model;

class Post extends Model {
    protected $primaryKey = 'ID';

    public function metas(){
        return $this->hasMany('PostMeta');
    }
    public function user(){
        return $this->belongsTo('User', 'post_author');
    }
    public function comments(){
        return $this->hasMany('Comment', 'comment_post_id');
    }
    public function term_taxonomies(){
        return $this->belongsToMany('TermTaxonomy', 'term_relationships', 'object_id', 'term_taxonomy_id');
    }
}
```
UnityでLive2Dのモデルを1行で取得して1行でモーションを再生させる

以前、[こちら](http://qiita.com/shima_rin/items/1583d8c335b7956b3398)にも載せていましたが、SampleApp1でなら、以下のようにすれば他のゲームオブジェクトからでもmodelを取得して、モーションを再生できます。

```lang:C#
var model = GameObject.Find("Live2D_Canvas_Haru").GetComponent<LAppModelProxy>().GetModel(); 
model.StartRandomMotion(LAppDefine.MOTION_GROUP_TAP_BODY, LAppDefine.PRIORITY_NORMAL);
```

以上です