OmniAICreator/Qiita-1.07M huggingface dataset:
EPPlusでちょっとばっかし注意すること

# どー言うことだってばよ
2016/08/02は予報は雨だったけど､行けそうなので猿倉まで登ってきた｡
EPPlusは､Excelの`.xlsx`ファイルを直接編集できる便利なライブラリなのですが､Excelのファイルを取り扱うとき少し注意すべきことがあったので､備忘録的に｡

# 具体的にはどーいうことなの?
主に､ExcelRangeBaseをforeachで使用とすると直感的では無い挙動を起こすことがある｡
以下はそのサンプル｡

```csharp

using System;
using System.IO;
using System.Linq;
using OfficeOpenXml;

namespace EPPlusSurvey
{
	class Program
	{
		static void Main(string[] args)
		{
			CreateNew();
			LoadExists();
		}

		static void LoadExists()
		{
			using (var package = new ExcelPackage(new FileInfo("sample.xlsx")))
			{
				var sheet = package.Workbook.Worksheets[1];

				var range = sheet.Cells["A1:B10"];

				//セーブ後､ロードすると0になる｡
				Console.WriteLine(range.Count());
			}
		}

		static void CreateNew()
		{
			using (var package = new ExcelPackage(new FileInfo("sample.xlsx")))
			{
				var sheet = package.Workbook.Worksheets.Add("SampleSheet");

				var range = sheet.Cells["A1:B10"];

				//予想としてA1から､B10の矩形範囲なので20が返ると思いがちだけど
				//0が返ってくる｡
				Console.WriteLine(range.Count());

				sheet.Cells["A1"].Value = "hello";
				sheet.Cells["B2"].Value = "world";


				//この段階では､2が戻ってくる｡
				Console.WriteLine(range.Count());

				range.Value = null;

				//20が戻ってくる｡
				Console.WriteLine(range.Count());

				package.Save();
			}
		}
	}
}

```

サンプル中の､コメントに有るように､基本的には､値の存在するCellを列挙している形となって､指定された矩形範囲の列挙では無いのでこの点は注意しないとマズいかと思います｡また､ExcelRangeBaseのValueにnullを一括代入した場合､nullが入力されている状態なので､値が存在すると解釈されるようです｡但し､そのような状態でセーブし､再び開いたときは､nullは無視されて再びValueが存在しないコトになって0となるようです｡

# まとめ
このようなことから､ExcelRangeBaseを用いてforeachする場合は､値の存在しないセルは無視されるので注意すべきかと｡矩形範囲のすべての列挙なりを行うなら､単一セルのレンジをPivotにして､Offsetで舐めていくか､Cellプロパティに適宜アドレスをぶち込むが良いかと思います｡
docker run するときに、groupを複数指定してコンテナを起動したい

# 概要

dockerコンテナを起動する時に複数のgroupを指定したい

# 結論

*--group-add* で、追加したいgroupを指定することができる。
複数並べていく。

```
--group-add=213 --group-add=456
```

# 調べたこと

起動時にuid,gidを指定できることは、以前調べたが、複数指定する方法は知らなかった。

* [docker run するときにUID,GIDを指定する - Qiita](http://qiita.com/manabuishiirb/items/83d675afbf6b4eea90e4)

*docker run --help* の中に以下のようなものを見つけた

```
  --group-add=[]                  Add additional groups to join
```

このオプションがいつからつかえるようになっているかはわからないが、1.11.2 ではつかえるようだ
UnityのEditor Test RunnerをJenkinsで走らせて、Slackで通知

# Unity
Unityのスクリプトの実行はEditor Test Runnerがコマンドラインから呼べるのでCIしやすい
たとえばMissingScriptを見つけるこんなテストを用意しておく

https://gist.github.com/fuqunaga/9ee907fccf921bfe907903d1617d96d6

Window → Editor Test Runner
で動作確認できる
![etr.png](https://qiita-image-store.s3.amazonaws.com/0/15038/5aa6681e-789a-c8a0-5f54-0b139ebe534c.png)

#Jenkins

## Unity3dBuilder Plugin

### インストール
http://qiita.com/unsoluble_sugar/items/a268b6c38d9603d871da

[Jenkins2ではプラグインの設定メニューの位置が変わっているようなので注意](http://qiita.com/fuqunaga/items/4373f1265a44fe4872a4)

### ジョブの設定
#### Invoke Unity3d Editor

上記記事に倣って設定し、コマンドライン引数でEditorTestRunnder
「Editor command line arguments」にUnityをバッチモードで起動するコマンドを指定

```
-quit -batchmode -runEditorTests
```

ちなみにUnityのプロジェクトフォルダがWORKSPACEのトップにない場合は **-projectPath** で指定してあげる

```
-projectPath $WORKSPACE/UnityProjectFolder -quit -batchmode -runEditorTests
```

> If you do not specify -projectPath (case-sensitive), the plugin will use the current workspace. 

https://wiki.jenkins-ci.org/display/JENKINS/Unity3dBuilder+Plugin

## NUnit Plugin

https://wiki.jenkins-ci.org/display/JENKINS/NUnit+Plugin

### ジョブの設定

1. [ビルド後の処理を追加] -> [Publish NUnit test result report]
2. EditorTestResults.xml を指定

![post_build.png](https://qiita-image-store.s3.amazonaws.com/0/15038/1a0aefa4-c3fd-013b-bb91-09312dc9b54a.png)


#Slack通知
http://qiita.com/ryuthky_github/items/c7e68fba13ddf230159a

# 完成

slack通知
![slack.png](https://qiita-image-store.s3.amazonaws.com/0/15038/f043717a-a4c0-c5e3-ea47-2f2575a436ac.png)


Jenkinsではこんな感じでレポートが見れる
![nunit.png](https://qiita-image-store.s3.amazonaws.com/0/15038/ea137736-881e-bd14-50a9-e5a7ea0f5fd6.png)
パワポのデザインを考える際に参考にしたサイト

## デザイン基本〜実践

[パワポでの提案書作りに役立つデザイン基礎知識まとめ](http://baigie.me/sogitani/2012/05/powerpoint/)
基本的な部分の説明がとても分かりやすい

[パワーポイントの「わかりやすさ」と「生産性」を向上させるデザイン・テンプレート](http://ppt.design4u.jp/design-template/)
実際に作成する際に気をつけたいポイント、設定の紹介

## Excelの小技

[パワーポイントでスライドの配色を変更する方法](https://dekiru.net/article/5248/)
メインカラー、アクセントカラーの設定をするために
Node-RED (@Bluemix) Hints & Tips

# 前提
IBM Bluemix 上で”Node-RED Starter”または”IoT Platform Starter” ボイラープレートをデプロイしているものとします。

# 免責
本記事は2016.08.02時点の公開情報および著者による検証環境をベースに執筆しておりますが、誤解・誤植を含んでいる可能性があります。ご利用の際は自己責任で、必ず最新の情報を自ら確認されますようお願いします。特に予期せぬ課金請求などが発生しても著者は一切責任を持ちません。
また誤りを見つけられた方は是非ご一報ください。

# Tip 1: Node-REDのフローの格納場所
作成したNode-REDのフローはCloudant上に自動で作成されるnodered というデータベースに格納されています。
![Cloudant.PNG](https://qiita-image-store.s3.amazonaws.com/0/129662/3f268f98-0b90-46df-db96-53c38dc8eca1.png)

noderedをクリックするとホスト名/flowというデータがあるのがわかります。
![flow.PNG](https://qiita-image-store.s3.amazonaws.com/0/129662/1d600dfa-6e67-0fdc-c591-c9169d7795ef.png)

この中にフロー内の各ノード、ノード内の設定や記述したコードが入っています。
![contents.PNG](https://qiita-image-store.s3.amazonaws.com/0/129662/d33287ee-f721-5922-58dd-4cf0b58c62bf.png)

万が一Node-REDのフロー・エディターが開かない・壊れて動かないなどのトラブルに見舞われた、でもフローのバックアップ取ってない…といったとき、このようにCloudantで自動作成されるnoderedデータベース格納されたJSONデータが使えます。
このJSONデータをコピーして、再度新しいNode-RED Starterをデプロイ後、JSONをインポートすることでフローの復旧ができます。

# Tip 2: フロー・エディター上でフローをエクスポートするときの注意点
エディター上でフローを手動でエクスポートしてバックアップすることができます。このときに引っかかりやすいのが、下記の状態です。Exportメニューがグレーアウトされているため、フローをエクスポートできません。
![cantexport.PNG](https://qiita-image-store.s3.amazonaws.com/0/129662/443e80b7-61dc-e312-2c26-fa809a956eaa.png)

これはノードが選択されてない状態だからです。ノードをクリック（すべて選択するときはCtrl+A）すると図の様に、各ノードがオレンジ色の枠で囲まれていることがわかります。この状態になるとExportメニューがクリックできるようになります。
![canexport.PNG](https://qiita-image-store.s3.amazonaws.com/0/129662/480781e3-a420-e67d-e5cb-0b03c47ceec2.png)

当たり前のようで意外に見落としがちな点なのでご注意ください。

# Tip 3: Coming soon.. :sweat_drops:
RoBoHoNめも_01:SDKインストールとかそのへん

# RoBoHon開発めも

RoBoHoN開発のことをめもしていきます！

# 追記
SDKがバージョンアップして、テンプレートが作られるようになったよ！

# SDKインストール

とりあえず参考記事

ロボホンアプリの開発環境「RoBoHoN SDK」が一般公開されたので開発してみました！ | ロボスタ
http://robotstart.info/2016/07/11/robohon-sdk-open.html

【ロボホンアプリ開発】「RoBoHoN SDK」のサンプルプログラムを動かしてみました！ | ロボスタ
http://robotstart.info/2016/07/12/robohonsdk2.html

```html:西田めも
robohon.com にログインした状態で

https://robohon.com/mypage/develop-list/

にアクセスすると、利用規約のチェックにＯＫいれずにSDKを入手できるけどいいのかな・・・
```

# 開発の順番

アンドロイダーのイベントでおしえてくれた、開発の順番が参考になります。

![DSC02227.jpg](https://qiita-image-store.s3.amazonaws.com/0/40994/51ae3615-4350-d243-dbc8-87654eeaaf71.jpeg)

・SDKの番号順ではなく、0801→0701→0401→0601の順番で資料を見る
・プロジェクトを作る方法の説明がよくないので、サンプルコードのクラスを使って実装する

参考
「ロボホンテストルーム」開設に先駆けて「ロボホンタッチ＆トライ」イベントに行ってきました！ | ロボスタ
http://robotstart.info/2016/07/28/robohon-touch_and_try.html

# mac でもできる
あと、記事には書いてないですが、Windows 10やmacでも開発できるとのことです。
（社内にパソコンがないから動作確認してないみたいなことを言っていました。）

※macの場合、USBドライバーは不要です。

# TIPS
AndroidStudioはディフォルトでimportの自動補完がOFFになってるからONにすると楽
<img width="694" alt="スクリーンショット 2016-08-02 11.26.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/40994/56a5702d-ca91-fd2c-913b-0e8495f24af8.png">

画面レイアウトが表示されない場合は、APIを21にすると表示されるようになる。
<img width="1324" alt="スクリーンショット 2016-08-02 13.21.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/40994/7902ed1a-b41c-19aa-c877-2175c4100f12.png">
ApnsPHP ERROR: Unable to connect to 'tls://gateway.push.apple.com

APNs-PHP利用でiOSアプリにプッシュ通知を送ろうとした時に、下記のエラーが表示されました。

`ApnsPHP ERROR: Unable to connect to 'tls://gateway.push.apple.com:2195'・・・`

このような場合は、証明書ファイル（pemファイル）を疑うこと。
ApnsPHPファイル側を数行コメントアウトする対応がネットで書いてあるが、コメントアウトしなくても動いているので、なぜそうすると送れるのか謎です。

私のケースでは、キーチェーンアクセスから下記の証明書と秘密鍵を書き出す必要がありましたが、
`Apple Push Services:[Bundle identifier]`
間違えてiPhone Distribution:[Developerアカウント名]の証明書と秘密鍵を書き出していたのが原因でした。

'iPhone Distribution:[Developerアカウント名]'
こちらは、アプリ自体のProvisioningファイルで利用する証明書でした。


あと、よくある原因ですが、秘密鍵を一緒に書き出さなかったということがあるそうです。
複数人で作業している場合は、別のPCで証明書要求ファイルを書き出してしまい、秘密鍵のない状態でp12ファイルを書きだそうとしてしまうケースがあります。
RailsのモデルをVisitorパターンとカリー化ですっきり辿る

以下の記事の続きです。

http://qiita.com/tkosuga@github/items/c055e311a92884a07a60

Visitorパターンでは各モデルを処理するメソッドの引数を複数にしたい状況が結構あります。

手前のノードと現在のノードを比較する処理をしたいケースを例として説明します。

```rb

# 各モデルが visitor.visit(self) と呼び出す。
def visit(object)
 if object.is_a?(Task)
  task(object)
 elsif object.is_a?(Step)
  step(object)
 end
end

def step(step)
 -> (prev_step) {
   # 前と後で比較する処理
 }
end

def task(task)
  prev_step = nil
  task.steps.each{|step|
    step.accept(self).(prev_step)
    prev_step = step
  } 
end
```

この例ではstepメソッドがlambdaを返すので、呼出し側で追加の引数を指定して処理を行います。

これをカリー化して第一引数を固定した関数を返すようにすると以下のように書けます。

```rb
# 各モデルが visitor.visit(self) と呼び出す。
# curryingで第一引数にモデルを指定しておく。
def visit(object)
 if object.is_a?(Task)
  self.method(:task).curry.(object)
 elsif object.is_a?(Step)
  self.method(:step).curry.(object)
 end
end

def step(step, prev_step)
  # 前と後で差分を集計する等
end

def task(task)
prev_step = nil
  task.steps.each{|step|
    step.accept(self).(prev_step)
    prev_step = step
  } 
end
```

Visitorの実装が増えてノードの扱いが複雑化してくると、#visitのディスパッチ時点でカリー化されているメリットを感じると思います。

以下、全体を通しで見たコードです。

```rb
module VisitorAcceptance
  def accept(visitor)
    visitor.visit(self)
  end
end

class Project < ApplicationRecord
  has_many :tasks
  include VisitorAcceptance
end

class Task < ApplicationRecord
  belongs_to :project
  has_many :steps
  include VisitorAcceptance
end

class Step < ApplicationRecord
  belongs_to :task
  include VisitorAcceptance
end

class Visitor
  def visit(object)
    if object.is_a?(Task)
      self.method(:task).curry.(object)
    elsif object.is_a?(Step)
      self.method(:step).curry.(object)
    elsif object.is_a?(Project)
      self.method(:project).curry.(object)
    end
  end
end

class ConcreteVisitor < Visitor

  private

  def step(step, prev_step)
    # 前と後で比較する処理
  end

  def task(task)
    prev_step = nil
    task.steps.each{|step|
      step.accept(self).(prev_step)
      prev_step = step
    }
  end

  def project(project)
    project.tasks.each{|task|
      task.accept(self)
    }
  end

end
```



すっきり。
unity > 時系列グラフ > Tag is not defined > とりあえずの対処 / gitignore修正

```txt:動作環境
Unity 5.1.3-f1 on Windows 8.1 pro (64bit)
```

### 不具合 > graphScaleタグがない

http://qiita.com/7of9/items/33f3839bb64d4f367ae8
にて紹介した時系列グラフ。

MacOS X上で実装してgitにpushしたが、それをWindows上でcloneして実行すると以下のエラーが出るようだ。

```
UnityException: Tag: graphScale is not defined.
```

graphScaleというタグの情報が消えている。

### とりあえずの対処

対処方法としてはgraphScaleタグを追加する

タグ関連
http://qiita.com/7of9/items/e3332484f556df5233d5

- Hierarchy > Canvasを選択する
- Inspector 上部の Tagのリストボックスにて Add Tag...を選択する
- Tagsの項目にて+マークを押して、graphScaleを入力する



この状態でPlayをするとソフトが正常に動作する。

何か関連ファイルをignoreしてしまっているのかもしれない。


### gitignore修正
(追記 2016/08/03)

gitignoreファイルが間違っていたので修正した。

関連　http://qiita.com/7of9/items/796f23cb392980fa6646

Tag情報は ProjectSettings/TagManager.asset として保存されているようだ。
関連 http://answers.unity3d.com/questions/523602/is-this-workaround-ok-its-for-fixing-lost-taglayer.html

Windows版Unity (v5.1.3f-1)でも動作確認した。この対処であっているようだ。
あとは30近くあるUnityプロジェクトすべてに同じ対処をしないといけない。
jQueryを使って form要素なしでフォームを submitする


```javascript
$(document).ready(function () {
  $('input.search-query').keypress(function(e) {
    var value = $(this).val();
    // 押されたのが Enterキーかつ入力欄に何か入っていればsubmit処理
    if (e.keyCode == 13 && value != "") {  
      $('<form/>', {id: 'cse-search-box',action: 'http://google.com/cse'})
      .append($('<input/>', {type: 'hidden', name: 'ie', value: 'UTF-8'}))
      .append($('<input/>', {type: 'hidden', name: 'q', value: value}))
      .append($('<input/>', {type: 'hidden', name: 'cx', value: 'カスタムサーチエンジンのコード'}))
      .appendTo(document.body)
      .submit();
    }
  });
});
```

[引用元：ワルブリックス株式会社](http://www.walbrix.com/jp/blog/2013-10-jquery-submit-without-form.html)
ajax送信の雛形

下の例文を参考に、動かないので自分用にカスタマイズ（ッテなんだ？

###追記(未検証、覚書)
●受け取り側を`$_POST`で受け取る場合は、一次配列として送る

```:js
/*送信側*/
data: $form.serialize(),
dataType: "text", <=未検証
```

```:php
//受け取り側
$data = $_POST;
echo json_encode( array("result" => $data ));
```

●受け取り側でオブジェクトや多次元配列で受け取る場合は、jsonとして送る

```:js
/*送信側*/
data: JSON.stringify($form.serializeArray()),
dataType: "json",
```

```:php
//受け取り側
$get_json = file_get_contents('php://input');
$data = json_decode($get_json, true); //trueは配列化
echo json_encode( array("result" =>  $data  ));
```

###修正版 <sub>修正なのか理解できず苦肉の策として…かは秘密</sub>
```javascript
$('#the-form').on('click',function(event) {
  // HTMLでの送信をキャンセル
  event.preventDefault(); //だめ、止まらない。submit使わない => でも必須。入れないとFxでuncaught exception: out of memory発生
  // 操作対象のフォーム要素を取得
  var $form = $("#myForm");
  // 送信ボタンを取得
  var $button = $form.find('#myButton');


  // 送信
  $.ajax({
      url: $form.attr('action'),
      type: $form.attr('method'),
      data: JSON.stringify($form.serializeArray()),
      dataType: "json",
      timeout: 10000,  // 単位はミリ秒

      // 送信前
      beforeSend: function(xhr, settings) {
          // ボタンを無効化し、二重送信を防止
          $button.attr('disabled', true);
      },
      // 応答後
      complete: function(xhr, textStatus) {
          // ボタンを有効化し、再送信を許可
          $button.attr('disabled', false);
      },

      // 通信成功時の処理
      success: function(result, textStatus, xhr) {
          // 入力値を初期化
          $form[0].reset();
          alert('OK');
      },

      // 通信失敗時の処理
      error: function(xhr, textStatus, error) {
          alert('NG...');
      }
  });
});
```
###引用

```javascript
$('#the-form').submit(function(event) {
  // HTMLでの送信をキャンセル
  event.preventDefault();
  // 操作対象のフォーム要素を取得
  var $form = $(this);
  // 送信ボタンを取得
  var $button = $form.find('button');


  // 送信
  $.ajax({
      url: $form.attr('action'),
      type: $form.attr('method'),
      data: $form.serialize(),
      timeout: 10000,  // 単位はミリ秒

      // 送信前
      beforeSend: function(xhr, settings) {
          // ボタンを無効化し、二重送信を防止
          $button.attr('disabled', true);
      },
      // 応答後
      complete: function(xhr, textStatus) {
          // ボタンを有効化し、再送信を許可
          $button.attr('disabled', false);
      },

      // 通信成功時の処理
      success: function(result, textStatus, xhr) {
          // 入力値を初期化
          $form[0].reset();
          alert('OK');
      },

      // 通信失敗時の処理
      error: function(xhr, textStatus, error) {
          alert('NG...');
      }
  });
});
```

[引用元：横浜ペンギンWEBを行く](http://ginpen.com/2013/05/07/jquery-ajax-form/)
VRコトハジメ

#VRとは
- **V**irtual **R**eality
 - コンピュータによって作り出された世界である人工環境・サイバースペースを現実のように知覚させる技術。
 - 時空を超える環境技術であり、人類の認知を拡張する

---
#歴史
- 1968年
 - 初めて考案される
- 1990年代
 - 最初のVRブーム
 - 任天堂の「バーチャルボーイ」
- *--低迷期--*
- 2012年
 - Oculus RiftからVRへの投資は加速。
- 2016年（**VR元年**）
 - **HTC Vive** Valve CorporationのSteamVR規格対応とか
 - **Gear VR**(Galaxy S6/S7専用HMD)とか
 - **今ここ**
 - 10月に**PlayStationVR**発売とか

---
#市場の分岐
- ヘビーなVR
 - PC、ゲーム機とか
 - 専用HMD
 - 主に**ゲーム**向け 


- ライトなVR
 - スマートフォン
 - スマホをセットするタイプのHMD
 - 主に動画

---
#ライトなVRでは現状実現できないコト
- ポジション・トラッキング
    - 左右前方の**移動**を認識
- ハンド・トラッキング
    - 手の**動作**を認識
- クオリティが低い
- レンズの縁が見えるので、没入感が浅い

---
#デバイス

- 配信側
    - 360度カメラ
- 閲覧側
    - HMD(ヘッドマウントディスプレイ)


---
#HMD
<img width="799" alt="VR device.png" src="https://qiita-image-store.s3.amazonaws.com/0/88950/c71414b9-42d6-e1c9-133d-079f7ddf65be.png">

---
#健康への影響

- 視覚誘導性自己運動感覚（ベクション）
 - 現実には自分は動いていないのに、VRの中では移動している状態で引き起こされる。酔い
 - 配信側の位置を変えなければとりあえず起こらない。

---
**続く…**
sensor > 静電容量形近接センサ > 周波数は1kHz / 水の比誘電率の波長変化 / youtube動画

Capacitive proximity sensorを紹介された。
測定精度を上げるにはどうすればいいか、原理が気になった。

http://www.fa.omron.co.jp/guide/special/knowledge/prox/electrostatic_capacity_type/principle_structure.html

> 電極の静電容量の変化は、物体の大きさ、厚さ、誘電体の場合には比誘電率εsなどに関係があり、大きいほど、厚いほど、εsが大きいほど静電容量変化は大きくなり、動作距離も大きくなる。
> 比誘電率εsは静電誘導を受けて物体中の電荷が分極する度合を示し、真空の場合を基準にして1とする｡水の約80をはじめ液体は比較的大きく、固体では 10以下のものが多い。

比誘電率について、「水の約80」というのはどの周波数（波長）なのか気になった。

https://en.wikipedia.org/wiki/Relative_permittivity
のテーブルに「under 1 kHz」という記載が見つかった。

波長は、光速3*10^8 / (10^3) = 3*10^5 m。

<hr>
以下、余談。

水の比誘電率は異なる波長に対する値を測定している人がいたはずだ。

Dr. Philip Lavenがまとめている図があった。
http://www.philiplaven.com/p20.html
の図7に波長10nmから10mの複素屈折率がある。比誘電率は「複素屈折率の2乗」となる。

波長10m以上 (3*10^5m)の部分が図の右側の延長として複素屈折率の実部が9弱のままであるとすると、複素数の虚部をbとすると(9弱 + bi)の2乗でだいたい80となり、上記の「水の約80」にだいたい整合する。

<hr>
電子工作で実際にCapacitive proximity sensorを使う場合は、以下の動画が参考になる。

https://www.youtube.com/watch?v=QItuf6lNvmI

- touchする側は小さくする方が変化を捉えやすい
POSIXで配列を扱う

なんか日本語変かな？  

普段bashを使っていると、シェルスクリプト中でうっかり配列を使ってエラーになりますね。  
shbangをbashにしてもいいんですが、環境によってパスが異なることがあるので書き換えが面倒です。そこで、なんとかshで配列を扱う方法を考えてみました。

## こたえ：cutを使う
とまぁ、これでピンときたら以降は読む必要なし。  

bashの配列定義を見ていてふと思いつきました。bashの配列ってスペース区切りなんですよね。別にカンマ区切りでも何でもいいんですが、カンマだとなかなか思いつかなかったかも。  

cutは１行を１レコードとして扱い、指定されたデリミタでフィールドを取り出せるコマンドです。

## おさらい：bashの配列定義
たとえばWebスクレイピングなどで、キーワードごとに取り出したい情報の位置が違うとかよくあります。  

```text:sample.txt
６行後ろを見る
３行前の情報
５行前の情報
２行後ろを見る
３行前を見る
２行後ろの情報
６行後ろの情報
５行前を見る
```

こんなテキストがあったとして。。。

```
#! /bin/local/bash
declare -a KEYWD_A=("２行後ろを見る" "３行前を見る" "６行後ろを見る" "５行前を見る")
declare -a OPTION_A=("-A" "-B" "-A" "-B")
declare -a SWITCH_A=(2 3 6 5)
for ((NUM = 0; NUM < ${#KEYWD_A[@]}; NUM++)) {
  if [ "${OPTION_A[$NUM]}" == "-A" ] ; then COMMAND="tail"; else COMMAND="head"; fi
  grep sample.txt -e "${KEYWD_A[$NUM]}" ${OPTION_A[NUM]} ${SWITCH_A[NUM]} | $COMMAND -1
}
```

こんな感じで配列を定義して使いますね。

##  蛇足：shでは疑似配列？
配列定義をスペースでつないでひとつの変数にします。（別にスペースじゃなくてもいいけど）  

```
#! /bin/sh
KEYWD_A="２行後ろを見る ３行前を見る ６行後ろを見る ５行前を見る"
OPTION_A="-A -B -A -B"
SWITCH_A="2 3 6 5"
for NUM in `seq 1 4`;
do
  if [ "`echo $OPTION_A | cut -d ' ' -f $NUM`" == "-A" ] ; then COMMAND="tail"; else COMMAND="head"; fi
  grep sample.txt -e "`echo $KEYWD_A | cut -d ' ' -f $NUM`" `echo $OPTION_A | cut -d ' ' -f $NUM` `echo $SWITCH_A | cut -d ' ' -f $NUM` | $COMMAND -1
done
```

こんな感じ。もっといいやり方あったら教えてください。  

※なんか色々サンプルコードミスっててすみません。修正しました。
[Git] SourceTreeで競合を解決する方法

# [Git] SourceTreeで競合を解決する方法

いつも競合する時にどっちが自分でどっちが相手が
わからなくなってしまうので,　メモついでに書いてみました。


## 競合解決
競合する際に<<<<<<<HEAD などの文字列が表示されると思いますが, 
以下のように分類することができます。

```

<<<<<<<<<<<HEAD
現在のブランチのコード(自分)
===============
マージするブランチのコード(相手)
>>>>>>>>>>>

```

サンプルですが下の方(相手のコード)を適用したい場合は以下のとおりに実行します。
1. ファイルを右クリック
2. 競合解決にマウスをあてる
3. "相手の変更を使って解決"をクリック

<img width="1474" alt="スクリーンショット_2016-08-02_11_38_53.png" src="https://qiita-image-store.s3.amazonaws.com/0/74135/28528034-2909-ffa9-d2c4-79b481a5ee08.png">

結果は以下の通りです。

<img width="1050" alt="スクリーンショット 2016-08-02 11.39.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/74135/ba40634d-83f0-64e1-284d-80b7d7674b7a.png">

以上 SourceTreeで競合を解決する方法でした。
SSL証明書の内容確認

###SSL証明書の内容確認はなぜ必要なのか
SSL証明書を発行した時、たいていはメールで届きます。

サーバにアップロードする段階で、ターミナルにペーストしたりしていると、
文字コードやら改行コードやらのイタズラにより、
証明書が読めない状態になっていたりします。

Apacheに設定したら証明書が読み込めなくて、
起動しなかったりすることもあるので、
SSL証明書の読み出し確認は割と重要です。

###確認コマンド
以下のコマンドで、証明書、秘密鍵、CSRのファイルが読めるか確認できます。

証明書ファイルの内容を確認

```
# openssl x509 -text -noout -in /[FilePath]/[CertFile]
```

秘密鍵ファイルの内容を確認

```
# openssl rsa -text -noout -in /[FilePath]/[KeyFile]
```

CSRファイルの内容を確認

```
# openssl req -text -noout -in /[FilePath]/[CSRFile] 
```
昔はもっと違うコマンドを使っていた気がするのですが、
今検索するとこのコマンドが出てきて、こっちのほうが使いやすそうです。
Go でクロスコンパイル（darwin => linux）

# 動機
1. Go で Slackbot を作った
1. デプロイ先の bot サーバが Linux だった
1. Ops の方々の手を煩わせたくない（bot サーバに Go の開発環境をセットアップしなくて済むようにしたい）
1. OS X で Linux バイナリをビルドすることにした

# 参考
* http://qiita.com/Jxck_/items/02185f51162e92759ebe
* http://qiita.com/masahikoofjoyto/items/4ced298989e6ab346f15
* http://onobori.hatenablog.com/entry/2016/02/23/002610

# 準備

```bash
$ cd $(go env GOROOT)
$ cd src
$ GOOS=linux GOARCH=amd64 ./make.bash
##### Building Go bootstrap tool.
cmd/dist
ERROR: Cannot find /Users/y-okubo/go1.4/bin/go.
Set $GOROOT_BOOTSTRAP to a working Go tree >= Go 1.4.
```

* 参考にした情報源によると、Go は 1.5 からセルフホスティング（Go 自身が Go で作られている）とのことなので、ターゲット向けの環境を作るのに別の実行環境が必要なんだろうと思っている。
* 1.4 との表記は気になるが、面倒なので現状の環境（1.6）を、指定されたディレクトリにコピーした。

# 実行

OS X 上で Linux(64bit) バイナリを出力

```bash
$ GOOS=linux GOARCH=amd64 go build main.go
```

# 確認

Docker で確認

```bash
$ docker run -v /Users/y-okubo/src:/src -it centos:6.7 /bin/bash
$ cd src
$ ./main
```

# 感想
* ちょっと面倒だけど動いて感動した
* サーバ側に実行環境が不要とか Rubyist 的には不思議な感じがする
* Docker ちょっとした確認に便利
hugを使って爆速でWeb APIサーバーを構築する

# はじめに
hugは、Web APIサーバーの構築に特化したWebアプリケーションフレームワークです。
他のフレームワークがテンプレートエンジンやORマッパなどのリッチな機能を詰め込んでいるのに対して、hugはWeb APIサーバーに必要な機能だけに特化したフレームワークになっています。

[hug Official Site](http://www.hug.rest/)

特筆すべきは、そのシンプルさと速度です。
以下は公式ページに掲載のベンチマークです(Pycnicによるベンチマーク)。
<img width="731" alt="スクリーンショット 2016-08-02 11.33.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/77079/721f1b2d-5b55-7f03-28c3-9c0044eaedb8.png">
速度ではわずかにFalconには及びませんが、それでも非常に高速であり、またFalconより実装するのがはるかに簡単です。

さっそくインストールして触ってみましょう。

# インストール
hugはPython3系のみに対応しています。インストールは以下で行います。

```shell-session
pip install hug
```

# はじめてのhug

では、APIを作ってみましょう。
実装は非常に簡単です。以下は、シンプルなレスポンスを返すサーバーの実装例です。

```py3:hello_hug.py
import hug


@hug.get('/hello')
def hello(name):
    """Says Hello to a user"""
    return "Hello {}!".format(name)
```

@hug.get()という部分がHTTP methodのデコレータです。get以外にもpostやupdateなどなどがあります。

では実行してみましょう。以下で実行できます。実行すると8000番ポートでサーバーが立ち上がり、アクセスするとレスポンスが返ってきます。

```shell-session
hug -f hello_hug.py
```

ブラウザで[http://localhost:8000/hello?name=hug](http://localhost:8000/hello?name=hug)にアクセスしてみてください。レスポンスが見れるはずです。

また[http://localhost:8000/documentation](http://localhost:8000/documentation)にアクセスすることで簡単なドキュメントを見ることができます。

```
{
    "404": "The API call you tried to make was not defined. Here's a definition of the API to help you get going :)",
    "documentation": {
        "handlers": {
            "/hello": {
                "GET": {
                    "usage": "Says Hello to a user",
                    "outputs": {
                        "format": "JSON (Javascript Serialized Object Notation)",
                        "content_type": "application/json"
                    },
                    "inputs": {
                        "name": {
                            "type": "Basic text / string value"
                        }
                    }
                }
            }
        }
    }
}
```


# バージョニング
hugを使えばAPIのバージョニングも簡単にできます。バージョニングの実装も非常に簡単です。以下のコードをみてみましょう。

```py3:versioning_example.py
# filename: versioning_example.py
"""A simple example of a hug API call with versioning"""
import hug

@hug.get('/echo', versions=1)
def echo(text):
    return text


@hug.get('/echo', versions=range(2, 5))
def echo(text):
    return "Echo: {text}".format(**locals())
```

バージョニングを行うにはversionsに数字か範囲を指定するだけです。

以下で実行します。

```shell-session
hug -f versioning_example.py
```

[http://localhost:8000/v1/echo?text=Hi](http://localhost:8000/v1/echo?text=Hi) と [http://localhost:8000/v2/echo?text=Hi](http://localhost:8000/v2/echo?text=Hi)にアクセスして違いを比べてみてください。簡単にバージョニングできていることがわかると思います。

# まとめ
以上で挙げたバージョニング以外にもAPIを作る上で便利な機能があります。特に非同期処理が簡単にできるのはうれしいです。

用途としては、以下のようなシチュエーションに向いていると思います。

* センサーデータのような、トラフィックの多いデータを高速にさばきたい
* 学習コストの高いフレームワークは嫌だ
* シンプルなAPIサーバーを作りたい

ぜひ、使ってみてその速度と手軽さを体感してもらえればと思います。
bash のデバッグメモ

bash の実行ログを取りたい時に

```
#!/bin/bash

LOG_FILE=debug.log

# 標準出力をファイルに出力
exec > $LOG_FILE

# 標準エラー出力も同じファイルに出力
exec 2>&1

# エラーで止める
set -eu

# デバッグを開始する
set -x
```
Git&Vim覚書　よく使うコマンド

よく使うGitとVimのコマンドの覚書。
なかなか覚えられなくて…
毎回、ストックの中から検索するのも疲れたので、ここにまとめておきます。
* * *
参考サイト様：http://qiita.com/Yama-to/items/25b87e7089bc4803a538
　　　　　　　http://qiita.com/hide/items/5bfe5b322872c61a6896
* * *
##■Git
###開発開始時
1.ローカルリポジトリーの作成
　$ git init

2.リモートリポジトリーをローカル環境にクローン
　$ git clone [リモートリポジトリのURL] [ディレクトリ名]
　※[ディレクトリ名]は、移動済の場合はいらない


###変更反映時
3.インデックス
　$ git add .　　 ←すべてのファイルをインデックス(こっちのが漏れがなくて安全かも)
　$ git add -u 　 ←変更があったもの全てインデックス(新規追加ファイルは対象外)

4.コミット
　$ git commit -m "[コメント]"

5.リモートに反映
　$ git push origin master

###変更取得時
6.リモートから取得
　$ git pull origin master

##■vim
1.モード切り替え
　i:挿入モード
　R:上書きモード
　ESC:コマンドモードに戻る

2.ファイル操作
　ZZ:上書き保存し、viを終了
　:w:内容を保存
　:q!:保存せずに終了

※コマンドライン上で、vimを起動する時は
　$ vim [ファイル名]
Swift 中的單例 (Singleton)

在 Cocoa/Cocoa Touch Framework 中， singleton 是很常見的設計模式。

## Objective-C 的寫法

在 Objective-C 時，需要去考慮到 once token ，並用 dispatch once 去初始化他，如下：

``` objc
@interface MyManager: NSObject {
+ (instancetype)sharedManager;
}

@implementation MyManager {

+ (instancetype)sharedManager {
    static id _sharedManager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _sharedManager = [[self alloc] init];
    });

    return _sharedManager
}

@end
```

## 基本的 Singleton

在 Swift 中就更簡單了，只要設定一個 let 變數，初始化完之後就不會再被變更了，如下

``` swift
class MyManager: NSObject {
    static let sharedManager = MyManager()
}
```

## 加上客製化設定

在許多情境設定好 singleton 物件後，需要去做進一步的設定。

這時候可以使用 closure (類似於 Objective-C 中的 block) 去封裝初始化物件的程式碼後，再將這個物件回傳。

取得回傳的物件之後，再把值設定回指定的屬性即可：

``` swift
class MyManager: NSObject {
    static let sharedManager: MyManager = { 
        // closure 裡面放置初始化的程式碼
        let manager = MyManager()
        // 進行進一步的設定
        return manager
        // 最後記得必須回傳這個物件
    }() // 這一行的 () 就是觸發執行這個 closure 的方式
}
```


## 參考資料

- [Adopting Cocoa Design Patterns / Interoperability / Using Swift with Cocoa and Objective-C (Swift 2.2)](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/AdoptingCocoaDesignPatterns.html#singleton)
ランダムに二人組を作りお昼ごはんのお相手を決める

**二人組を作った時に一人余るのは私です。**
ランダムにすればこの悲しみを地球上から消せるはず。

# <i class="fa fa-camera" aria-hidden="true"></i> スクリーンショット

![gohan.JPG](https://qiita-image-store.s3.amazonaws.com/0/62354/7e6c00cc-52f9-2f17-6b13-add4eeb7467e.jpeg)

![gohan2.JPG](https://qiita-image-store.s3.amazonaws.com/0/62354/2da36a8c-fb51-3780-6c5c-6ecc7776df95.jpeg)

ソースにべた書きか引数か選べる。


# <i class="fa fa-heart-o" aria-hidden="true"></i> 先生との友好度を高めないために

JavaScriptには配列からランダムに値を取り出したり、シャッフルする関数はありません。
通常の良く考えつくランダム処理では、偏りがでることがあるようです。

毎回同じ人が先生と食べないように、偏りがないシャッフルを行いたいものです。

ここでは[フィッシャー - イェーツのシャッフル - Wikipedia]というアルゴリズムを実装した
[coolaj86/knuth-shuffle: The Fisher-Yates (aka Knuth) shuffle for Browser and Node.js]
を使用しました。

# <i class="fa fa-code" aria-hidden="true"></i> コード

事前に`npm install knuth-shuffle`しておきます

```coffeescript:lunch.coffee
module.exports = (robot) ->
	robot.respond /(?:(?:お?(?:昼|ひる))|hiru|mesi|ランチ|らんち|ranti|lunch)(?:[^\s]*\s+(.*)?)?/i, (msg) ->
		shuffle = require('knuth-shuffle').knuthShuffle
		if !!msg.match[1]
			member = msg.match[1].split(/\s+/)
		else
			member = 'ABCDEFGHIJ'.split('')
		text = ':fork_and_knife:お昼ごはんの組み合わせを発表します:bangbang::fork_and_knife:\n'
		shuffle(member)
		while(member.length > 1)
			comb = member.splice(0, 2)
			text += ':couple_with_heart: ' + comb[0] + 'さんと' + comb[1] + 'さん:bangbang:\n'

		if member[0]
			text += ':sparkles::tada:先生と食べるのは' + member[0] + 'さんです:bangbang::+1::tada::sparkles:\n'
		else
			text += 'です:bangbang:\n'
		msg.send text
```

# TODO

* お弁当組とランチ組に分ける機能
* n人の組み合わせを指定できるようにする機能
* 余った人を最後の組み合わせに追加してあげる優しみ機能
* 実際の運用…

# <i class="fa fa-book" aria-hidden="true"></i> 参考

* [Array#sort実装のshuffleは偏る - Qiita]
* [フィッシャー - イェーツのシャッフル - Wikipedia]
* [coolaj86/knuth-shuffle: The Fisher-Yates (aka Knuth) shuffle for Browser and Node.js]

[Array#sort実装のshuffleは偏る - Qiita]:http://qiita.com/minodisk/items/94b6287468d0e165f6d9
[フィッシャー - イェーツのシャッフル - Wikipedia]:https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A3%E3%83%83%E3%82%B7%E3%83%A3%E3%83%BC_-_%E3%82%A4%E3%82%A7%E3%83%BC%E3%83%84%E3%81%AE%E3%82%B7%E3%83%A3%E3%83%83%E3%83%95%E3%83%AB
[coolaj86/knuth-shuffle: The Fisher-Yates (aka Knuth) shuffle for Browser and Node.js]:https://github.com/coolaj86/knuth-shuffle
アプリが起動されてない場合のPush通知からの起動動作について


## はじめに

プッシュ通知の話をする前にアプリの状態について

| 状態 | 概要 |
| :--: | :--: |
|Active|アプリがフォアグラウンドであり操作が可能な状態|
|Inactive|バックグラウンドからフォアグラウンドに復帰した直後や、通知センター、CCセンターにアプリが覆われている状態|
|Background|アプリが背面にありホーム画面や他のアプリが全面に表示されている状態|

## プッシュ通知受け取り後に何らかの動作をさせる

### アプリが生きている状態

```obj-c:AppDelegate.m
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
    switch (application.applicationState) {
        case UIApplicatoinStateActive:
            NSLog(@"フォアグラウンドでご飯が炊けました♪");
            break;
        case UIApplicationStateInActive:
            NSLog(@"非アクティブ状態でご飯が炊けました♪");
            break;
        case UIApplicationStateBackground:
            NSLog(@"バックグラウンドでご飯が炊けました♪");
            break;
        default:
            NSLog(@"よくわからないけどご飯が炊けました♪");
    }
}
```

また、 `userInfo` に設定したJSONが入っているのでいい感じにパースしましょう！

```json:サンプルJSONデータ
{
    "aps": {
        "alert": {
            "subject": "小泉花陽ちゃんからのメッセージです",
            "message": "ご飯炊けたよｫｫ！！！",
            "sound": "default",
            "badge": 1
        },
        "uri": "app-callback://messages/hanayo"
    }
}
```

### アプリがキルされている状態

```obj-c:AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    _userInfo = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey];
    if (_userInfo) {
        NSLog(@"ご飯をよそえました！！");
    }
    return YES;
}
```

また、ここではプッシュ通知からの起動でモーダルや画面遷移をさせるなどの動作を必要とするためプロパティで別途 `userInfo` を作っています。

```obj-c:ViewController.m
// 画面遷移サンプル
AppDelegate *delegate = (AppDelegate *) [UIApplication sharedApplication].delegate;
if (delegate.userInfo) {
    // URLスキーマで遷移先を決定するなどのhogehoge動作
    NSString *scheme = userInfo[@"uri"];
    // hogehogeした
    MessageViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"MessageViewController"];
    controller.message = userInfo[@"alert"][@"message"];
    [self.navigationController pushViewController:controller animated:YES];
}
```

## おまけ

[PythonでiOSアプリにプッシュ通知を送ろう](http://qiita.com/nnsnodnb/items/ba415c2a56a037cce526)
この記事でプッシュ通知テストとかしてみてはどうでしょうか！！

小泉花陽ちゃん可愛いですよね！
iPhoneのInstant Hotspotが「不安定」な時のリセット方法

下記のような環境でiPhoneの自動テザリング機能「Instant Hotspot」がうまく動作しなくなった場合の解決方法です。といってもすごく簡単でした。忘れそうなのでメモ。

症状がマッチするひとは試してみると良いかと

# 発生した環境

iPhone6 + iOS 9.3.3
MacBook Air(以下MBA) Early 2014 + Max OS X El Capitan(10.11.6)

# Instant Hotspotについて

iOS8から実装された機能で、iPhoneのBluetooh機能だけをONにしておけば、同じiCloudアカウントでログインした別のApple製品から一発でテザリングできるというナイスな機能。

MBAの場合なら、WiFiアクセスポイントにiPhoneの名前が登場し、そこを選択するだけで

* iPhoneとMBA間でBluetoothのペアリング
* iPhone側のインターネット共有の有効化
* iPhoneとのデザリング接続

が自動的に行われます。iPhoneをポケットやバッグに入れたままMBAの操作だけでテザリングできるのはマジで超便利です。

**↓連係機能を使って iPhone、iPad、iPod touch、および Mac を接続する - Apple サポート**
https://support.apple.com/ja-jp/HT204681
![](http://capture.heartrails.com/400x300/cool?https://support.apple.com/ja-jp/HT204681)


# 発生した症状

この手の症状としてはいろいろあるようですが、私の場合はこんな感じで中途半端な症状でした。

* MBA側のWiFiアクセスポイントにiPhoneのAP名が登場するが、アクセスしようとすると
　数十秒後に電源が切れている的なメッセージがでてアクセスできない
* iPhone側の画面を見ていると、Bluetooth接続が有効になり、テザリングもOFFからONに
　なるものの接続できず。その後、MBA側でエラーメッセージが出ると同時に、Bluetooth
　接続もテザリングもオフになる。
* 最後の方はBluetoothアイコンが一瞬チカっと光るもののうんともスンとも言わなくなった

# 改善方法

・iPhone側でiCloudからログオフ→ログオン
・MBA側でiCloudからログオフ→ログオン

これだけです。

他の人の改善方法では、ネットワーク設定をリセットするという手順も入ったりするようですが、私のようにWiFiアクセスポイントにiPhoneが見えていて、Bluetooth接続もうまくいっているいるがInstant Hotpotだけが使えない人の場合はこれだけでOKのようです。
Windows7 > Explorer > 複数ファイルの名前を変更する

```txt:動作環境
Windows 7 pro (32bit)
```

ファイル名を変更しようとしていた。

- main3141.cpp
- main3141.h
- main3141.txt

Explorer にて 無意識のうちに以下をしていた。

1. 3つのファイルを選択
2. F2を押す
  - 1つのファイルの名前編集状態になる
3. 1つのファイルを編集する (3141->2718)
  - 3つすべてのファイル名が変更されている

こういう機能は知らなかったが、一括名前変更できるのは良い。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/61d58933-276e-0ac8-6679-e623527974d4.png)


![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/610c3709-89a6-f983-8aa5-906b1dc2a548.png)


![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/7314fdfc-da10-9e2d-146d-e94d1e45085a.png)

## 失敗例

- main2718b.txt
- main2718.h
- main2718.c

上記のファイルに対してmainをmainbとすると以下となる

- mainb2718b.txt
- mainb2718b.h
- mainb2718b.c

つまり、拡張子を除いたファイル名がすべて同じになるようだ。
UnityのButton連打を防ぎたい

ボタンを連打させる挙動を防ぐコードのメモ

## UniRxのThrottle

```csharp
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using UniRx;
using UniRx.Triggers;
using System;

public class ButtonSample : MonoBehaviour
{
    public Button Button;

    void Start()
    {
        this.Button
            .OnClickAsObservable()
            .TakeUntilDestroy(this)
            .ThrottleFirst(TimeSpan.FromMilliseconds(1000))
            .Subscribe(_ => { OnClick(); });
    }

    private void OnClick()
    {
    }
}
```

こんな感じでThrottleを使うと簡単にいける。
material-uiをreactで使いながらのメモ2


# react-router

http://shibe97.tumblr.com/post/122678388082/reactjsreact-router%E3%81%A7%E3%83%8F%E3%83%9E%E3%82%8A%E3%82%84%E3%81%99%E3%81%84%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88

> React.js用のルーティングライブラリとしてreact-routerがあります。
しかし、個人的にかなり癖があるように思います。
先日、めちゃめちゃ苦労してルーティングを成功させたので、その例を記します。
おそらく、２階層のネストまでは割とすんなりいけるのですが、3段階目のネストに苦労しました。

http://beck23.hatenablog.com/entry/2015/02/20/054900

* aタグを使うと通常遷移
* Linkコンポーネント（react-routerに含まれる）を使うと遷移せずに遷移。
	（routingのnameで指定する。）

# テーマ

http://www.material-ui.com/#/customization/themes

テーマを入れ子で読み込めるのかは不明だが、トップの定義でパレットを作っておいて、
コンポーネントのインライン指定するのが標準っぽい？
（英語をちゃんと読めやと。。）

```
export default {
  spacing: spacing,
  fontFamily: 'Roboto, sans-serif',
  palette: {
    primary1Color: cyan500,
    primary2Color: cyan700,
    primary3Color: grey400,
    accent1Color: pinkA200,
    accent2Color: grey100,
    accent3Color: grey500,
    textColor: darkBlack,
    alternateTextColor: white,
    canvasColor: white,
    borderColor: grey300,
    disabledColor: fade(darkBlack, 0.3),
    pickerHeaderColor: cyan500,
    clockCircleColor: fade(darkBlack, 0.07),
    shadowColor: fullBlack,
  },
};


```

```

  render () {
    return (
      <span style={{color: this.context.muiTheme.palette.textColor}}>
        Hello World!
      </span>
    );
  }

```

クラス指定みたいなことはできるんかいな。。cssでやったほうが効率よさそうな気もする。。

react-routerでページ遷移にちょっとしたアニメーションを付ける | WebDesign Dackel
http://goo.gl/MdgVKr

ちょっとしたアニメーションをつける事例。
速度指定を、、cssアニメーションの指定と記述をあわせる必要があったりするらしい？

https://github.com/callemall/material-ui/blob/master/src/styles/getMuiTheme.js

コードを見ると、用意されたコンポーネントについては上書きできるみたい。

http://umi-uyura.hatenablog.com/entry/2015/06/22/193801

でも、これだけだと細かいカスタマイズには微妙かも。

# 動的に色を切り替えてみる

パスが該当していたらシアンにする。お、三項演算子つかえた。

```
var style = {
    backgroundColor: (location.pathname == row.path) ? cyan100 : white
}
return (
    <MenuItem
        style={style}
    />
);

```
React Routerをサーバーサイドとクライアントサイドで同期させる時の覚書

地味にハマったのでメモ。

## 通常のReact Routerの書き方

```client-react-router.jsx
import { render } from 'react';
import { Router } from 'react-router';

import routes from 'YOUR_ROUTES_FILE_PATH';
const mountNode = document.getElementById('app');

render(
	<Router history={history} routes={routes} />, 
	mountNode
);
```

## サーバーサイドでReact Routerを使う時の書き方

Expressのコードも混ざってますが、だいたいこんな感じ。

```server-react-router.jsx
import { renderToString } from 'react-dom/server';
import { match, RouterContext } from 'react-router';
import Express from 'express';

import routes from 'YOUR_ROUTES_FILE_PATH';

const app = new Express();
const port = 3000;

app.use(handleRender);
app.listen( port, ( error ) => {
	if ( error ) {
		console.error( error );
	} else {
		console.info(`Listening on port ${port}` ); 
	}
});

function handlRender(req, res ) => {
	match({ routes, location: req.url }, ( error, redirectLocation, renderProps ) => {
		if ( error ) {
			res.status( 500 ).send( error.message );
		} else if ( redirectLocation ) {
			res.redirect( 302, redirectLocation.pathname + redirectLocation.search );
		} else if ( renderProps ) {
			res.status( 200 ).send( renderToString( <RouterContext {...renderProps} />));
		} else {
			res.status( 404 ).send( 'Not Found' );
		}
	});
}

```

##二つを組み合わせると・・・

こういうエラーがでる。

```client-error.log
warning.js:45Warning: React attempted to reuse markup in a container but the checksum was invalid. This generally means that you are using server rendering and the markup generated on the server was not what the client was expecting. React injected new markup to compensate which works but you have lost many of the benefits of server rendering. Instead, figure out why the markup being generated is different on the client or server:
 (client) .1.2"> items</span><span data-reactid=".
 (server) .1.2"> items</span></p></div>
```
 
IndexRouteのページではエラーにならず、子ページで発生した。
下の例だと「/sample」にアクセスした時に、クライアントサイドがIndexRouteのコンポーネント（App）をレンダリングしようしてエラーになる。

```route-sample.jsx
	<Route path='/' component={RouterLayout}>
		<IndexRoute component={App} />
		<Route path='sample' component={Sample} />
	</Route>
```

##クライアントサイドのRouterを書き換える

解決方法はドキュメントに思いっきり書いてあった
[https://github.com/reactjs/react-router/blob/master/docs/guides/ServerRendering.md#async-routes](https://github.com/reactjs/react-router/blob/master/docs/guides/ServerRendering.md#async-routes)

クライアント側のRouterを以下のように書き換えればOK。

```fixed-client-react-router.jsx
import { render } from 'react';
import { match, Router } from 'react-router';

import routes from 'YOUR_ROUTES_FILE_PATH';
const mountNode = document.getElementById('app');

match( { history, routes }, ( error, redirectLocation, renderProps ) => {
	render(
		<Router history={history} routes={routes} />, 
		mountNode
	);
});
```

とりあえずこれでクライアントサイドが意図せぬコンポーネントをレンダリングしようとする問題は解決した。
Cassandraで、Cluster Name を変更した時にハマったのを解決。

# 環境
 - Debian 8 
 - Cassandra 2.2x

# やりたかったこと

```yams:/etc/cassandra/cassandra.yaml
# The name of the cluster. This is mainly used to prevent machines in
# one logical cluster from joining another.
#cluster_name: 'Test Cluster'
cluster_name: 'Gandarla Cluster'
```

としたかっただけ。

一度、Test Clusterで起動されていたので、単純に名前を変えただけではうまくいかなかった。

こんなエラーが出る。。

```java:/var/log/cassandra/debug.log
ERROR [main] 2016-08-02 08:57:09,272 CassandraDaemon.java:698 - Fatal exception during initialization
org.apache.cassandra.exceptions.ConfigurationException: Saved cluster name Test Cluster != configured name Gandarla Cluster
	at org.apache.cassandra.db.SystemKeyspace.checkHealth(SystemKeyspace.java:913) ~[apache-cassandra-3.0.8.jar:3.0.8]
	at org.apache.cassandra.service.StartupChecks$8.execute(StartupChecks.java:304) ~[apache-cassandra-3.0.8.jar:3.0.8]
	at org.apache.cassandra.service.StartupChecks.verify(StartupChecks.java:107) ~[apache-cassandra-3.0.8.jar:3.0.8]
	at org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:171) [apache-cassandra-3.0.8.jar:3.0.8]
	at org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:557) [apache-cassandra-3.0.8.jar:3.0.8]
	at org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:685) [apache-cassandra-3.0.8.jar:3.0.8]
```

# やったこと

```bash:command
# cqlsh
```

```sql:cqlsh内
Connected to Test Cluster at 127.0.0.1:9042.
[cqlsh 5.0.1 | Cassandra 3.0.8 | CQL spec 3.4.0 | Native protocol v4]
Use HELP for help.
cqlsh> UPDATE system.local SET cluster_name = 'Gandarla Cluster' where key = 'local';
cqlsh> exit
```

```bash:command
# nodetool flush
# service cassandra stop
# rm -rf /var/lib/cassandra/data/system/*
# vi /etc/cassandra/cassandra.yaml
```

やりたかったことの内容に書き換える。

```bash:command
# service cassandra start
```

しばらくして、立ち上がったことを確認してから、

```bash:command
# cqlsh
```

```sql:cqlsh内
Connected to Gandarla Cluster at 127.0.0.1:9042.
[cqlsh 5.0.1 | Cassandra 3.0.8 | CQL spec 3.4.0 | Native protocol v4]
Use HELP for help.
cqlsh>
```

となっていれば終わり。


## 備忘録
 - デバッグログの場所
  - /var/log/cassandra/debug.log
 - 参考にしたページ
    - [datastax](https://support.datastax.com/hc/en-us/articles/205289825-Change-Cluster-Name-)
    - [stackoverflow](http://stackoverflow.com/questions/34740013/cassandra-2-node-cluster-configuration-issue)
rubyのgem:amazon-ecsを利用したメモ

いつも「Amazon」でショッピングしているので、値段が安い時に買いたいですね。
また、定期便も値段が変わることがあります、知らないうちに、値段が上がる時もありました。
そのため、手軽に使うアプリがあればいいなと思い、値段の変動情報を通知してくれるアプリを開発しました。
Amazon情報を取得するため、rubyのgem「amazon-ecs」を使ってみました。

## 使い方

#### yml設定

```yml:ecs.yml
AWS_access_key_id: "xxxxxxxxxxxxxxxxxxxx" # 必須
AWS_secret_key: "xxxxxxxxxxxxxxxxxxxx" # 必須
associate_tag: "xxxxxx-22" # 必須
response_group: "ItemAttributes, Images, SalesRank, OfferSummary" # レスポンスに含まれる情報量
```

#### 初期設定

```ruby
ecs_yml = YAML.load_file("#{Rails.root}/config/ecs.yml")
keys = [:AWS_access_key_id, :AWS_secret_key, :associate_tag, :response_group]
Amazon::Ecs.configure do |options|
  keys.each do |key|
    options[key] = ecs_yml[key.to_s] if ecs_yml[key.to_s].present?
  end
end
```

#### 呼び出し

```ruby
res = Amazon::Ecs.item_lookup(asin, :country => country) # 一件だけ検索する
title = item.get('ItemAttributes/Title') # 商品名
price = item.get('OfferSummary/LowestNewPrice/FormattedPrice') # 値段
image_url = item.get('MediumImage/URL') # 商品画像
```

## 実装済みアプリ
* [PriceAlert - Amazon商品価格変動アラート](http://www.itmarlin.com/page-amazonalert.html)
MSC-MOD20 > SD initialization command (I command) fails on the first trial after power on boot

This is for communication with GHI Electronics on ALFAT SoC.
( https://www.ghielectronics.com/community/forum/topic?id=23533 )

```txt:Environment
MSC-MOD20 (ALFAT SoC) SD card module
ALFAT SoC version 2.0.0
I2C Connection used
```

I have a problem on the initialization of the microSD (I command), which is similar to the following post.
https://www.ghielectronics.com/community/forum/topic?id=12544

### Behavior

After Power on boot, the first trial of the SD initialization always fails. 

I tried by waiting 3000 msec before the first initialization, but without success.

The trials after the first are always successful with wait of 3000 msec inbetween.

### Related code

I checked with ESP8266 using Arduino IDE, with Wire.h library.

[v0.7 @ github](https://github.com/yasokada/esp8266_160730_MSC-MOD20p1/releases/tag/v0.8)


### Other command (V command)

I tried V command repeatedly. All V commands were successful without any wait inbetween.

### Oscilloscope outputs

I checked with oscilloscope (Analog Discovery 2) on the SCL and SDA, together with `I2C Busy` flag on the failure/success of the SD initialization.

Following is when the initialization fails:

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/fd4b486e-af1b-1c62-475d-07c9c945a453.png)

The 0x49, 0x20, 0x4D, 0x3A, 0x0A　are commands for the SD initialization ( `'I', 0x20, 'M', ':', 0x0A` ).


Following is when the initialization succeeds (trials after the first):

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/fc5da865-9395-2f21-ee85-9a276b6a931a.png)

## Possible workaround

To initialize the SD correctly, I came up with the following workaroud

1. SD initialization: fails
2. wait for 200 msec
3. SD initialization: succeeds

About the step 2, the wait needs to be 200 msec. I tried 10, 50, 100 msec, but without success.
Error, Fault, Failure

# Error, Fault, Failure
プログラミングをする上で、Error(エラー), Fault(障害), Failure(故障)という用語がよく出てきます。
この用語はプログラミング言語や文脈によって意味を読み替える必要があるので、自分が必要な範囲でまとめておきます。

## 情報処理用語(JIS X 0014)
<dl>
<dt>Error(エラー)</dt>
<dd>計算，観測若しくは測定された値又は状態と，真の，指定され
た若しくは理論的に正しい値又は状態との間の相違。</dd>
<dt>Fault(障害)</dt>
<dd>要求された機能を遂行する機能単位の能力の，縮退又は喪失を
引き起こす，異常な状態。</dd>
<dt>Failure(故障)</dt>
<dd>要求された機能を遂行する，機能単位の能力がなくなること。</dd>
</dl>

## Java
<dl>
<dt>java.lang.Exception</dt>
<dd>通常のアプリケーションでキャッチされる可能性のある状態</dd>
<dt>java.lang.Error</dt>
<dd>通常のアプリケーションであればキャッチすべきではない重大な問題</dd>
</dl>

## Scala
<dl>
<dt>scala.util.Success</dt>
<dd>処理を行った結果、例外やエラーが起きなかった</dd>
<dt>scala.util.Failure</dt>
<dd>処理を行った結果、例外やエラーが起きた</dd>
</dl>

JISの定義の文脈とプログラミング言語の文脈での意味の違いが業務をする上で問題になることがあります。例えば、JavaでErrorがスローされる状況は情報処理用語の文脈上ではFaultやFailureが起きていることになります。ユーザの入力間違いや重複のチェックなどは情報処理用語の文脈ではErrorですが、JavaやScalaでErrorをスローさせることはないでしょう。

## 参考
- [JIS X0014](http://kikakurui.com/x0/X0014-1999-01.html)
- [java.lang.Exception](http://docs.oracle.com/javase/jp/7/api/java/lang/Exception.html)
- [java.lang.Error](http://docs.oracle.com/javase/jp/7/api/java/lang/Error.html)
- [scala.util.{ Failure , Success}](http://www.scala-lang.org/api/2.11.8/index.html#scala.util.Try)
技術英語 > I’m Laura Knoy, [sitting in for] Steve Curwood. / sb:somebody / in place of

@ LOE > July 18, 2003
http://www.loe.org/shows/shows.html?programID=03-P13-00029
> I’m Laura Knoy, <font color=red>sitting in for</font> Steve Curwood.

従来はSteve Curwoodが司会進行しているLOEにて、彼が休みのためか別の人が司会をしている。

その時に「sitting in for」を使って「代わりに」という意味を持たせている。

http://dictionary.cambridge.org/dictionary/english/sit-in-for-sb
> to take the place of someone who would normally do a particular job or go to a particular meeting:

上記のsbというのは[somebody]の略語表記。

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

in place of

http://eow.alc.co.jp/search?q=%22in+place+of%22

[linguee](http://www.linguee.jp/%E6%97%A5%E6%9C%AC%E8%AA%9E-%E8%8B%B1%E8%AA%9E/search?source=%E8%8B%B1%E8%AA%9E&query=in+place+of)
> undertake environmental monitoring <font color=red>in place of</font> the government (Florini 1998).
Blenderメモ

## 動機
Blenderの説明はあっちこっちにあるけどなんか回りくどかったりいちいち操作が書いてあったりでまだるっこしかったり情報が古かったりでイマイチ理解しにくいので自分用にメモ。

## 自動ウェイトペイント
### 初回
メッシュとアーマチェアを選んでからCtrl-Pする手順もあるけど以下の方法が面倒ではないし覚えやすいと思う。要はアーマチュアの下にメッシュが入ればいい。

0. メッシュをアーマチュアに投げ込む(白いのが含まれるオレンジのでおｋ)
1. 出たメニューから「自動ウェイトペイントで」みたいなのを選ぶ

ちなみに投げ込むメッシュは複数でもいいが、親子関係があるときは子は無視されるようなので全部直下に放り込む。

### やり直し
0. ポーズモードで「A」で全ボーンを選択状態にする
1. 塗りたいメッシュを選ぶ
2. ウェイトペイントモードにする(なってればそれでよし)
3. 「w」を押して出たメニューの一番上「ボーンでウエイトペイント」みたいなのを選ぶ

## 物理とゲーム

### 「物理演算」につきもののコライダー(剛体)
Blenderの物理演算はボーンにコライダーがセットになっていない。(ボーンにchild of拘束を設定することで)コライダーにボーンを従属させてボーンを動かすことでモデルを動かすことになる。UE4みたいに大雑把なコライダーを付けるしかないとかいうことはなく自由度こそ高いが面倒なので痛し痒し。
rails console で Controller を呼ぶ際のtips

# GET
## パラメータをつけたい場合
```
app.get "http://localhost:3000/api/users/login", {'user_id' => 1}
=> 200
```

# POST
## パラメータをつけたい場合
```
app.get "http://localhost:3000/api/users/list.json", {'type' => 1}
=> 200
```

## リクエストヘッダをつけたい場合
```
app.get "http://localhost:3000/api/users/list.json", nil, {'HTTP_TOKEN' => "xxxxxxxxxxxx"}
=> 200
```
※第二引数はparams

# レスポンスの内容をみたい場合
```
app.response.body
```
Railsのcacheでハマった

# Railsのcacheでハマったお話
 URLの区切りを`_`から`-`に変更したさい、ローカルではうまく行っていたが、開発環境ではURLが`_`のままになっており、Page not foundとなっていた。
Chromeを`command+shift+r`でリロードしてみても変わらず。。。

# 原因
 ``` xxx.haml
- cache('xxx') do
 ~~~以下略~~~
```
と、ページをcacheしており永続となっていたため、URLの変更がきいていなかった。。
（ローカルはそもそもcacheがoffになっていたため気づかなかった）

# 対策
ということで有効期限(`expires_in`)を付ける。

``` xxx.haml
- cache('xxx', expires_in: 1.seconds) do
 ~~~以下略~~~
```
満を持して開発環境へデプロイ！

しかしまだURLが`_`のまま。。。
どうやら、前のcacheが永続だったため、後から有効期限付けても効いてくれないみたい。。。
一回キャッシュクリアしてみる。
`bundle exec rails runner 'Rails.cache.clear'`

再度表示したところ、URLの区切りが`_`から`-`に直ってた。
cache見つけるまで大分時間費やしたなー。。。。
std::regexの構築は意外と重い

最近『コンピュータシステムの理論と実装』(原題 "The Elements of Computing Systems")のHack CPU向けのアセンブラを書いたのだが、異様にパフォーマンスが悪くて解決するのに少し悩んだ話。

# 結論
`std::regex`を何度も呼ぶ関数の中で宣言するのはやめよう
宣言したいなら`static`にすべし

# 経緯

私の作ったアセンブラは、100行程度のソースならすぐにアセンブルし終わるが、30000行近いソースを入力すると3分近く時間を取られるものであった。

アセンブラの心臓部は、もちろんアセンブリを実際にパースする部分である。
パースは正規表現で行っていたので、初めは正規表現が重いのかと思い`std::regex::optimize`を付けてみるも一切効果なし。

正規表現の動作を除くと、重さの原因となる部分はもはや宣言部しかなかった。
次のようなものだ。

```cpp
const std::string symbol_match = "([a-zA-Z_.$:][a-zA-Z\\d_.$:]*)";
const std::string dest_match = "([AMD]|A[MD]|[A]?MD)";
const std::string comp_match = "(0|[-]?1|[-!]?[DAM]|D[-+&|][AM]|[AMD][-+]1|[AM]-D)";
const std::string jump_match = "(JGT|JEQ|JGE|JLT|JNE|JLE|JMP)";

const std::regex a_match1("@" + symbol_match); 
const std::regex a_match2("@([\\d]*)");
const std::regex c_match1(dest_match + "=" + comp_match + ";" + jump_match + "?");
const std::regex c_match2(dest_match + "=" + comp_match + ";?");
const std::regex c_match3(comp_match + ";" + jump_match + "?");
const std::regex c_match4(jump_match);
const std::regex l_match("\\(" + symbol_match + "\\)");
```

この宣言は1行読み込むたびに呼ばれる関数内でなされている。

`std::regex`の宣言を`static`にしたところ、たちまちパフォーマンスが向上。
30000行を処理するのに1秒もかからなくなった。

# おまけ
元のソースでも、Visual Studioでビルドすると(`static`化にはかなわないが)30000行に3秒くらいしかかからなかった。
Visual Studioのことだから何か規格を無視した最適化でもしているのだろうか。