OmniAICreator/Qiita-1.07M huggingface dataset:
SharePoint DesingerでWorkflowをサイト間でコピーする

# 概要
SharePoint Designerを使ってWorkflowを異なるサイトにコピーする。

# 環境
 - Windows 7
 - SharePoint 2010
 - SharePoint Designer 2010

# 手順
### コピー元サイト
  1. SharePoint Designer 2010 の [ナビゲーション] ウィンドウで、[ワークフロー] をクリックします。
  2. [ワークフロー] タブの [管理] で、[Visioへエクスポート] をクリックします。  
     拡張子vwiファイルがエクスポートされます。
  3. ワークフローから参照しているリストがある場合、リストのIDを控えておく。
  ![List2.png](https://qiita-image-store.s3.amazonaws.com/0/101760/733b3bff-34aa-b495-faec-740f783dca5c.png)

### コピー先サイト
  1. ワークフローから参照しているリストがある場合、コピー先のリストのIDを控えておく。

### PC
  1. エクスポートしたvwiファイルの拡張子をzipに変える。
  2. zipファイルを展開する。下記ファイルが含まれている。  
[content-type].xml  
workflow.xoml  
workflow.xoml.wfconfig.xml
  3. workflow.xoml.wfconfig.xmlを削除する。
  4. ワークフローから参照しているリストがある場合、workflow.xomlの全てのコピー元のリストのIDをコピー先のリストのIDに置き換える。
  5. [content-type].xml、workflow.xomlをzipで圧縮する。
  6. 圧縮したファイルの拡張子をvwiに変える。

### コピー先サイト
  1. SharePoint Designer 2010 の [ナビゲーション] ウィンドウで、[ワークフロー] をクリックします。
  2. [ワークフロー] タブの [管理] で、[Visio からインポート] をクリックします。![ImportWF.jpeg](https://qiita-image-store.s3.amazonaws.com/0/101760/12e1a92c-d1cb-b937-6bb8-2a6621770177.jpeg)
  3. 編集したvwiファイルを選択し、ワークフローをインポートする
  4. 一部の参照は壊れている可能性が高いので全ての参照を再設定する。


# 参考
 - [Solved: Moving SharePoint 2010 Designer Workflows between Sites](https://blogs.msdn.microsoft.com/momalek/2012/04/22/solved-moving-sharepoint-2010-designer-workflows-between-sites/)
 - [Moving SharePoint Designer Workflows](https://mikessharepoint.wordpress.com/2013/01/17/moving-sharepoint-designer-workflows/)
Debeziumの紹介

## Debeziumとは？

http://debezium.io/

DBテーブルへの変更をKafkaトピックに格納して、アプリケーションがストリーミングで変更内容を監視・受信できるようにするソフトウェアです。2016年初頭から、RedHat主導で開発されています。もともと、マイクロサービスを実装するためのソリューションとして開発されたもののようですが、マイクロサービスに関係なく使えます。現時点でMySQLとMongoDBに対応していますが、将来、PostgreSQLやOracleへの対応予定があります。

![構成図](https://qiita-image-store.s3.amazonaws.com/0/10290/7474689b-b47a-c987-f7cb-fc42cb5b643f.png)

DBMSは、変更内容をトランザクションログに記録していきます。MySQLの場合は、バイナリログです。それをKafka Connectサービスがコネクタを使用して監視します。変更を検知したら、テーブル単位で作成されたKafkaトピックに、変更内容を「イベント」としてJSONでシリアライズして記録します。アプリケーションはKafkaのコンシューマなどを使ってKafkaメッセージブローカーに接続し、トピックを監視します。変更イベントが到着したら受信して、アプリケーションの他の処理に利用します。

仕組みの詳細は、FAQを見ると良いと思います。
http://debezium.io/docs/faq/

2017年1月時点のものを、日本語に訳したものです。
http://wp.me/p1mQkm-3A

## 特徴

DBの変更内容をストリーミングするソフトウェアは他にもありますが、Debeziumには、現在のところ、以下の利点があります。

* DB特有の処理をコネクタに隔離するアーキテクチャです。将来、様々なDBMSに対応する予定があります。

* DBMSの中にDebeziumの設定を格納しないような設計思想となっています。

* Debeziumを起動する前のテーブル変更も、トランザクションログが残っている限り検知できます。

* KafkaメッセージブローカーとKafka Connectサービスは、それぞれクラスタ構成にして運用できます。

* Debezium(Kafka)の停止中に行われたDBテーブルの変更は、復旧(再起動)後に拾われます。

* DBテーブルの内容と、その時点でのDBのテーブル構造の両方が常にイベントに入ってくるので、テーブルのDDLが運用中に変更されるようなケースでも、アプリケーションが追従しやすい仕組みになっています。(ただしそのために、毎回送られてくるJSONドキュメントが大きいのが難点)

## 試してみる

まずは、チュートリアルを一通りやってみるといいでしょう。
http://debezium.io/docs/tutorial/

2017年1月時点のものを、日本語に訳したものです。
http://wp.me/p1mQkm-1i

チュートリアルは長いですが、概ね、以下のような感じで進んでいきます。

1. Zookeeper、Kafka(メッセージブローカー)、MySQLサーバ／クライアント、Kafka ConnectサービスとなるDockerコンテナを、順に立てていきます。
1. Kafka Connectサービスに新規のMySQLコネクタを作成します。
1. Kafkaトピックを監視をするコンテナを立てて、DBのテーブルへUPDATEやDELETEを発行し、トピックに記録される内容を確認します。
1. Kafka Connectサービスを停止し、DBテーブルに何個かクエリを投げ、Kafka Connectサービスを起動すると、サービスが停止している間のDBへの変更がトピックに反映されることを確認します。

チュートリアル以上に詳細が知りたい場合は、各DBのコネクタのドキュメントを読むと良いでしょう。

MySQLコネクタ
http://debezium.io/docs/connectors/mysql/


## ソースやコミュニティ

* GitHubリポジトリ
https://github.com/debezium/debezium

* JIRA
https://issues.jboss.org/projects/DBZ/issues/DBZ-174?filter=allopenissues

> GitHubのIssueを使わず、JIRAで報告してください、とのこと。
> Pull Requestの前に、チャットやメーリングリストで相談してください、とのこと。[Contribute.md](https://github.com/debezium/debezium/blob/master/CONTRIBUTE.md)必読。

* チャット
https://gitter.im/debezium/dev (開発作業用)
https://gitter.im/debezium/user (使い方が分からないなどの相談用)

* メーリングリスト
https://groups.google.com/forum/#!forum/debezium

> メーリングリストはあまり動きがなく、チャットで開発者の見解が示されることが多いです。
> チャットは、リアルタイムで参加している必要はありません。自分の都合の良い時に書いて放置でOK。
rmコマンドでゴミ箱へ移動するようにする

`rm`コマンドを使うと、ゴミ箱を経由せずに直接削除されますが、間違えて削除してしまうと大変なことになります。
そこで、trash-cliというコマンドを導入し、`rm`コマンドを使用した際にファイルをゴミ箱へ移動するようにしてみたいと思います。

#インストール
1. `sudo apt install git`コマンドを実行し、gitをインストールします。
1. `git clone https://github.com/andreafrancia/trash-cli`コマンドを実行し、trash-cliをダウンロードします。
2. `cd trash-cli`コマンドを実行し、ダウンロードしたディレクトリに移動します。
2. `sudo python setup.py install`コマンドを実行し、trash-cliをインストールします。

#rmコマンド置換
3. `~/.bashrc`の末尾に以下を追記します。

    ```bash
    if type trash-put &> /dev/null
    then
	    alias rm=trash-put
    fi
    ```

1. `source ~/.bashrc`コマンドを実行し、`.bashrc`への変更を反映します。

# trash-cliの使い方
## ゴミ箱にあるファイルの一覧表示
```bash
$ trash-list
```

## ゴミ箱にあるファイルを元に戻す
```bash
$ trash-restore
```

## ゴミ箱を空にする
```bash
$ trash-empty
```

## ゴミ箱の中のファイルを完全に削除する
```bash
$ trash-rm {ファイル名}
```

#参考文献
* [ファイルの削除にrmコマンドは使わないようにした - Qiita](http://qiita.com/futoase/items/c190c0b7e9cf1b5e50b2)
* [rmコマンドをゴミ箱に置き換える - 永遠に未完成](http://thinca.hatenablog.com/entry/20090403/1238689756#f-89c1ce78)
* [Bashでコマンドの存在チェックはwhichよりhashの方が良いかも→いやtypeが最強 - Qiita](http://qiita.com/kawaz/items/1b61ee2dd4d1acc7cc94)
* [andreafrancia/trash-cli: Command line interface to the freedesktop.org trashcan.](https://github.com/andreafrancia/trash-cli)
SF1

###アクション
SF1上で各オブジェクトのTop画面の下部に表示されるアクションメニューにボタンを追加するには、アクションとして追加する（VFページまたはLightningコンポーネントを登録可能）。
<img width="670" alt="Screen Shot 2017-01-29 at 12.43.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/161463/b9f9c7ae-7032-f8e2-398c-7e7806df119c.png">
<img width="998" alt="Screen Shot 2017-01-29 at 12.44.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/161463/a0244af5-b127-be3e-f86f-7826ee461121.png">

追加したアクションは、ページレイアウトの「Salesforce1 および Lightning Experience アクション」セクションに追加する
<img width="692" alt="Screen Shot 2017-01-29 at 12.45.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/161463/f376c86d-3169-9232-c6e2-7141722b36d8.png">

このセクションに追加したアクションは、SF1上の下部のアクションメニュー または LEX環境でのアクションとして追加される（従来の標準ボタンはClassic環境用なのでLEX環境では表示されないことに注意）。

<font color="Red">注意
SF1上でVFページを表示するには、VFページの設定で下記のチェックをONにすることを忘れないように。
<img width="463" alt="Screen Shot 2017-02-06 at 13.48.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/161463/7ab4177a-51df-cd16-d4b7-86528a14284b.png">
</font>
Visual Studio Code (Linux) で統合ターミナルを Ctrl+@ で開く (JIS配列)

## 方法

`Ctrl+[` を使う。
（おそらくASCII配列で解釈されている。）

## 設定例

```json:keybindings.json
[
{ "key": "ctrl+[",                "command": "workbench.action.terminal.toggleTerminal" },
{ "key": "ctrl+shift+[",          "command": "workbench.action.terminal.new" }
]
```

## 備考

### Linux版のデフォルトである ``Ctrl+` `` は、JIS配列だと使えない。
![vscode_keybind_toggleTerminal_default.png](https://qiita-image-store.s3.amazonaws.com/0/27531/1f8853f4-a5b3-6045-22ed-0a1b957ee66d.png)

### それではと、Windows版の設定である `Ctrl+@` を設定しても、うんともすんとも言わない。
（`Ctrl+Shift+2` を押してもダメ）

### ちょっとわかりづらいかも。

![vscode_keybind_toggleTerminal_customized.png](https://qiita-image-store.s3.amazonaws.com/0/27531/e61217f0-ae75-7933-e118-050585853dbd.png)

### 環境

* Ubuntu 16.04.1 LTS 64 ビット
* Realforce 91U
dd コマンドの進捗状況を表示する方法

ddコマンドの進捗状況を表示する方法をググってみると、 `SIGUSR1` シグナルを送る方法が、たくさん出てくる。

``` sh:SIGUSR1シグナルを送る例
pkill -USR1 dd
```

Coreutils のバージョンがあまり古くなければ、status オプションで表示できるみたいで、こっちのほうがラクだった。

```sh:ddコマンドにstatusオプションを指定する例
$ rpm -q coreutils # CentOS7.x
coreutils-8.22-24.el7.x86_64
$ sudo dd if=./ubuntu-20.04-desktop-amd64.iso of=/dev/sdb bs=1k status=progress
2714452992 バイト (2.7 GB) コピーされました, 1017.815421 s, 2.7 MB/s
```

# See also

* ⟦monitoring - How do you monitor the progress of dd? - Ask Ubuntu⟧ https://askubuntu.com/questions/215505/how-do-you-monitor-the-progress-of-dd
* ⟦linux - How to determine the best byte size for the dd command - Server Fault⟧ https://serverfault.com/questions/147935/how-to-determine-the-best-byte-size-for-the-dd-command/148121#148121
エディタ再起動したらいきなりlocalhostに接続できなくなったお話。

これまで普通に`rails s`でlocalhostが使えてたんですけど、昨日一度エディタを閉じたらいきなり接続できなくなりました。


##原因
多分以前Rails5にアップグレードしてデフォルトのサーバがpumaに変わったせいだと思います。
とりあえずRailsの勉強進めたかったので、今回はこれ以上詳しくは調べていませんが、いずれちゃんと理解できるようになろうと思います。

##対処
```
$ rails s
```
で起動していたサーバーを、
```
$ rails s -b 0.0.0.0
```
で起動するようにしました。

こちらを参考にさせていただきました。

[http://d.hatena.ne.jp/spitfire_tree/20160209/1454984232:title]
rasberry pi 3 で温度センサー&Treasure Data格納まで

この(http://qiita.com/daicham/items/0daa0efa8479e9502baa
)サイトをもとに、raspi3で温度センサーをtreasure Dataまで格納した。
とても丁寧で、わかりやすくこの通りでよかったです。

ただ、最後のfluent.confの作り方がわからなくて、
下記のサイト(http://qiita.com/shuntaro_tamura/items/e897cdc8a155cfcf9da7
)の、4行を実施。※意味は上記サイトを参照。
====================================================
```
gem install fluentd --no-ri --no-rdoc
fluentd --setup ./fluent
fluentd -c ./fluent/fluent.conf -vv &
echo '{"json":"message"}' | fluent-cat debug.test
```<img width="523" alt="treasure.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/160387/b6e58220-9470-066c-798c-ceb7d8eae988.png">

====================================================

後は、
```
fluentd -c ./fluent/fluent.conf -vv &の実行を、
sudo fluentd -c ./fluent/fluent.conf -vv &にすれば、
```
treasure Data上に、データが送られます。
<img width="523" alt="treasure.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/160387/19ded421-07a9-0322-afee-856c3c6c723a.png">
[Unity]Shaderでかっこよさげな(?)シーン遷移 ~その4~

#できるもの
![1月-29-2017 12-13-24.gif](https://qiita-image-store.s3.amazonaws.com/0/113509/85a17a6c-8b87-4040-8aa3-6f2178c9769e.gif)
エリア・ステージ間の遷移に使えそう。
少なくとも一瞬でパッと変わるよりはマシかなぁ?
少しいじれば回想シーンなんかにも使えます
(スクリプトから進行度合いの値を入れる必要があります。詳しくは[ここ](http://qiita.com/torumu106/items/20fcb7590f653695f26f))
(それが嫌なら_Time.yに演算を少し施して使うといいかもです。)
#コード
```
Shader "Original/NewImageEffectShader 3"
{
	Properties
	{
		_MainTex ("Texture", 2D) = "white" {}
		percent ("percent", Range(0.0, 1.0)) = 0 
	}
	SubShader
	{
		// No culling or depth
		Cull Off ZWrite Off ZTest Always
		CGINCLUDE
		int xor128(int b, int c){ 
		    int x=1234567 * b * c,y=362436036,z=521288629,w=886751 * (_Time.y % 128); 
	    	int t; 
    		t=(x^(x<<11));x=y;y=z;z=w; return( w=(w^(w>>19))^(t^(t>>8)) ); 
		} 
		uniform float percent;
		ENDCG
		Pass
		{
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			
			#include "UnityCG.cginc"

			struct appdata
			{
				float4 vertex : POSITION;
				float2 uv : TEXCOORD0;
			};

			struct v2f
			{
				float2 uv : TEXCOORD0;
				float4 vertex : SV_POSITION;
			};

			v2f vert (appdata v)
			{
				v2f o;
				o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
				o.uv = v.uv;
				return o;
			}
			
			sampler2D _MainTex;

			fixed4 frag (v2f i) : SV_Target
			{
				fixed4 col = tex2D(_MainTex, i.uv);
				i.uv.x++;
				i.uv.y++;
				i.uv *= 3;
				float rand = (float)xor128(i.uv.x * 100 + 1, i.uv.y * 100 + 1) % 10000 / 10000;
				col *= step(percent, rand);
				return col;
			}
			ENDCG
		}
	}
}

```
#仕組み
xor128という関数がランダムの関数なので%などを使い0~1の範囲にした後step関数で真っ黒の場所を作っています。
i.uvにかける値を変えればノイズの解像度を変えることができます。
#参考
[すごい乱数生成アルゴリズム「xorshift」](http://d.hatena.ne.jp/pashango_p/20090717/1247848900)
【Debian 8 Jessie】sudoコマンドをインストールする

この記事は、下記の記事を構成している記事のひとつです。
[さくらのVPS と Debian 8 Jessie で独自ドメインのWebサイトを立ち上げる手順](http://qiita.com/osktak/items/7224bd263288b40b4b98)

・さくらのVPS（プラン512）
・Debian 8 Jessie（さくらのVPS カスタムインストール）
の環境を前提にしています。

# sudoコマンドをインストールする
rootユーザになる。

```tarminal:[hoge]$
su -
```

sudoコマンドをインストールする。

```tarminal:[root]#
aptitude -y install sudo
```

# 権限の設定を行う
/etc/sudoersファイルを編集して、権限の設定を行います。
viコマンド等で編集してもいいのですが、visudoコマンドを使うと、
ファイル保存時に文法にミスがないかチェックしてくれるので、
visudoコマンドを使って編集します。

```tarminal:[root]#
visudo
```
```Bash:/etc/sudoers
# hogeはroot権限を全て利用できる
hoge  ALL=(ALL:ALL) ALL
```

# 動作確認を行う
rootユーザを抜ける。

```tarminal:[root]#
exit
```

sudoなしで、OS再起動コマンドを入力し、エラーメッセージが表示されることを確認する。

```tarminal:[hoge]$
shutdown -r now
```
```
-bash: shutdown: command not found
```

頭にsudoを付けて、OS再起動コマンドを入力し、OSが再起動されればOK。

```tarminal:[hoge]$
sudo shutdown -r now
```
樹木曲線


ちょっとしたフラクタル

# 描写

```ruby
require "rmagick"

def draw(i, from, len, rad, r, depth)
  to = [
    from[0] + len * Math.sin(rad),
    from[1] + len * Math.cos(rad)
  ]

  d = Magick::Draw.new
  d.stroke("green")
  d.line(from[1],from[0],to[1],to[0])
  d.draw(i)

  #p [from, to, depth]

  if depth > 0
    draw(i, to, len * 0.7, rad + r, r, depth - 1)
    draw(i, to, len * 0.7, rad - r, r, depth - 1)
  end
end

il = Magick::ImageList.new
i = il.new_image(500,500)
i.annotate(Magick::Draw.new, 1, 1, 30, 30, n.to_s)
draw(i, [250,250], 50, Math::PI/-2, 0.5, 10)
i.write("tree1.gif")
```
![tree1.gif](https://qiita-image-store.s3.amazonaws.com/0/154291/d6d5895a-b758-3a66-be83-159af2573f98.gif)

# さらに描写

```ruby
il = Magick::ImageList.new
il.delay = 50
for n in 1 .. 40
  i = il.new_image(500,500)
  i.annotate(Magick::Draw.new, 1, 1, 30, 30, n.to_s)
  draw(i, [250,250], 50, Math::PI/-2, Math::PI/10*(0.1*n), 10)
end
i.write("tree2.gif")
```

![tree2.gif](https://qiita-image-store.s3.amazonaws.com/0/154291/26561ce5-3edb-2848-802f-17e4a9f19b92.gif)

# もっと描写

最初の再帰の枝の計算を`+`から`*`へ

```ruby
def draw(i, from, len, rad, r, depth)
  to = [
    from[0] + len * Math.sin(rad),
    from[1] + len * Math.cos(rad)
  ]

  d = Magick::Draw.new
  d.stroke("green")
  d.line(from[1],from[0],to[1],to[0])
  d.draw(i)

  #p [from, to, depth]

  if depth > 0
    draw(i, to, len * 0.7, rad * r, r, depth - 1)
    draw(i, to, len * 0.7, rad - r, r, depth - 1)
  end
end

il = Magick::ImageList.new
il.delay = 50
for n in 1 .. 60
  i = il.new_image(500,500)
  i.annotate(Magick::Draw.new, 1, 1, 30, 30, n.to_s)
  draw(i, [250,250], 50, Math::PI/-2, Math::PI/10*(0.1*n), 10)
end
i.write("tree3.gif")
```

![tree3.gif](https://qiita-image-store.s3.amazonaws.com/0/154291/60af0e5c-4081-b253-11fe-5d781e676482.gif)

# せわしない描写

一つ目の再帰の枝の計算を`+ r`に
二つ目の再帰の枝の計算を`+ r * 2`へ

```ruby
def draw(i, from, len, rad, r, depth)
  to = [
    from[0] + len * Math.sin(rad),
    from[1] + len * Math.cos(rad)
  ]

  d = Magick::Draw.new
  d.stroke("green")
  d.line(from[1],from[0],to[1],to[0])
  d.draw(i)

  #p [from, to, depth]

  if depth > 0
    draw(i, to, len * 0.7, rad + r, r, depth - 1)
    draw(i, to, len * 0.7, rad + r*2, r, depth - 1)
  end
end

il = Magick::ImageList.new
il.delay = 50
for n in 1 .. 100
  i = il.new_image(500,500)
  i.annotate(Magick::Draw.new, 1, 1, 30, 30, n.to_s)
  draw(i, [250,250], 50, Math::PI/-2, 0.1*n, 10)
end
i.write("tree4.gif")
```

![tree4.gif](https://qiita-image-store.s3.amazonaws.com/0/154291/4e004687-5223-3415-0750-0541a7d50474.gif)
さくらのVPS と Debian 8 Jessie で独自ドメインのWebサイトを立ち上げる手順

# 記事一覧
|大分類         |中分類         |記事一覧                                                                                         |
|:--------------|:--------------|:------------------------------------------------------------------------------------------------|
|さくらのVPS    |Debian 8 Jessie|[さくらのVPSに Debian 8 Jessie をカスタムインストールする](http://qiita.com/osktak/items/be42e7612d04d30b8717)|
|Debian 8 Jessie|sudo           |[sudoコマンドをインストールする](http://qiita.com/osktak/items/f1746d64797a6a4dd6ae)             |
|Debian 8 Jessie|IPv6           |[IPv6を無効化する](http://qiita.com/osktak/items/339d3fb887a560275934)|
|Debian 8 Jessie|ssh            |[sshの設定をこれだけはやっておく](http://qiita.com/osktak/items/231fa100fcba7fe1a9ad)                  |
|Debian 8 Jessie|iptables       |[iptablesの設定をこれだけはやっておく](http://qiita.com/osktak/items/778287711f7ee0ccec3b)|
|Debian 8 Jessie|ntp|[時刻を同期する](http://qiita.com/osktak/items/d775555df0a88d23f021)|
|お名前.com|さくらのVPS|[お名前.comとさくらのVPSでネームサーバーを設定する](http://qiita.com/osktak/items/a19b31c0985fb9fa6512)|


VPSとは、バーチャル・プライベート・サーバ（仮想専用サーバ）の略で、
自分専用に利用できる仮想サーバです。

技術の習得や勉強が目的で、Linuxでサーバを立ち上げて運用しようと思うと、
ちょっと前までは、自宅にサーバを構築したり、固定IPアドレスを取得したり、
24時間立ち上げっぱなしなのでジミに電気代が高くなったりしました(^-^;
（ヘタに自作PCで自宅サーバ組むと、電気代だけで諭吉さんにサヨナラw）

2017年1月現在、[さくらのVPS](http://vps.sakura.ad.jp/)のメモリ512MBのプランなら、月額685円で運用できる！

せっかくなのでやってみるか。ということで、
せっかくなので手順を記事に残しながら構築して、
せっかくなので技術ノウハウを蓄積する自分用サイトを構築してみる。

そんなテイストの、自分の為のメモ記事です。
工事中感満載ですケド、随時アップします。
RailsのFormData取得で気をつけたいこと

##

#やりたいこと：text_fieldに入力されたデータをFormDataで取得したい

##失敗パターンその1（form_for自体にID、classを指定していなかった）

```app/view/messages/index.haml
.view__message--new
  = form_for([@chat_group, @message]) do |f|
    = f.text_field :body, placeholder: "type a message", class: "view__message--new__input"
    %i.fa.fa-picture-o{ aria: { hidden: true } }
    = f.submit :Send, class: "view__message--new__button"
```

```app/assets/javascripts/message.js
$(function() {

~中略~

  $('.view__message--new').on('submit', function(e){
    e.preventDefault();
    var fd = new FormData($(this).get(0));
//form_forの親要素のクラス.view__message--newがsubmitされた時に発火
//同様にそこからFormDataを取得できるかと思ったが失敗。
```


##失敗パターンその2（form_forの親クラスである.view__message--newにid: new_messageを付けた）

```app/view/messages/index.haml
#new_message.view__message--new
  = form_for([@chat_group, @message]) do |f|
    = f.text_field :body, placeholder: "type a message", class: "view__message--new__input"
    %i.fa.fa-picture-o{ aria: { hidden: true } }
    = f.submit :Send, class: "view__message--new__button"
```

```app/assets/javascripts/message.js
$(function() {

~中略~

  $('#new_message').on('submit', function(e){
    e.preventDefault();
    var fd = new FormData($(this).get(0));
//これも取得できず。
//原因はhamlからHTMLに変換される際、form_forにもid: new_messageが振られ重複したため？
```

##下記のようにして取得できた

*viewは上記と同様

```app/assets/javascripts/message.js
$(function() {

~中略~

  $('#new_message').on('submit', function(e){
    e.preventDefault();
    var fd = new FormData($('form#new_message').get(0));
//FormDataの対象idにformを付けたら取得できました。
```

##最終的にこうしました

```app/view/messages/index.haml
.view__message--new
  = form_for([@chat_group, @message], html: { id: 'new_message' }) do |f|
    = f.text_field :body, placeholder: "type a message", class: "view__message--new__input"
    %i.fa.fa-picture-o{ aria: { hidden: true } }
    = f.submit :Send, class: "view__message--new__button"
```

```app/assets/javascripts/message.js
$(function() {

~中略~

  $('#new_message').on('submit', function(e){
    e.preventDefault();
    var fd = new FormData($(this).get(0));
```

##結論
最初からform_for自体にidを付けていれば何の問題もありませんでした。
【CakePHP】setFlashで毎回エラーになる問題

#概要

　環境はCakePHP2.9.4です。

　少し前のコードやプラグインを使うだけで山のようにsetFlashダメですエラーが吐かれていた問題の解決法を教えてもらったので記録しておきます。

[CakePHPのSlack開設](http://qiita.com/chinpei215/items/3c116171c5308365c314)
上の投稿をしてくれたchinpeiさんに教わった方法です。


#方法

```php:Controller/AppController.php
public $components = array(
    'DebugKit.Toolbar',
    'Session', // 追加する感じ
    'Flash',　// これも？
    'Cookie',
    'Paginator',
```

```php:View/Layout/default.ctp
// echo $this->Flash->render(); // ここを消す
echo $this->Session->flash();
```

上のように修正する事で、プラグインの中などに`$this->Session->setFlash`があってもエラーが出なくなりました。

本当に助かりました。　


# 追記

バージョン2.9.5で修正済みとのことです！
ESPr Developer 用反射型カラー液晶を MicroPython から使う

発売早々に入手した[「ESPr Developer 用反射型カラー液晶」](https://www.switch-science.com/catalog/2874/)(LPM013M126A)であるが、使い方がぜんぜん分からない...　　ネット上にも大した情報が見当たらない。数少ない情報源であるデータシートと mbed 用の C サンプル見ながら試行錯誤した結果、だいたい使い方が分かってきたのでメモしておく。

# 利用するモジュール

直に利用するライブラリは `machine.SPI` と `machine.Pin`。タイミング調整用に `utime.sleep_us` もインポートしておく。 

```python
from machine import SPI, Pin
from utime import sleep_us
```

# 結線

LPM013M126A へのデータ送信には SPI を使うことになっている。[スイッチサイエンスのサイト](https://www.switch-science.com/catalog/2874/)によれば、ESPr Developer の GPIO と LPM013M126A は以下のように結線されている。

|GPIO|方向|コネクタピン番号|接続先|信号の説明|
|:---|:-:|:-----------|:----|:-------|
|IO15|O|JP1 - 5|SCS（液晶コネクタ）|液晶のチップセレクト|
|IO14|O|JP1 - 8|SCLK（液晶コネクタ）|液晶のクロック|
|IO13|O|JP1 - 6|SI（液晶コネクタ）|液晶のデータ|
|IO0|O|JP1 - 3|DISP（液晶コネクタ）|液晶のon/off信号.”H”で液晶表示|
|IO2|O|JP1 - 4|open|“SJ2” をショートするとEXTCOMIN（液晶コネクタ）に接続されます|
|IO5|O|JP2 - 6|LEDパッド（K）|照明用LED（オプション）の出力|
|IO4|I|JP2 - 3|スイッチ（SW1）|汎用のプッシュスイッチ|

この情報にしたがえば、以下のように Pin を使うことになる。

```python
disp = Pin(0, Pin.OUT)
scs = Pin(15, Pin.OUT)
spi = SPI(-1, sck=Pin(14), mosi=Pin(13), miso=Pin(12))
```
SPI のデータ受信は無いので miso は使わないのだが、指定しないと `SPI` クラスのコンストラクタに怒られるので空いてるのを適当に指定しておく。

(2017/01/30 追記)
しかし、どうやらハードウェア SPI が使えるように結線してあるようだ。なので、以下のとおり修正。

```python
disp = Pin(0, Pin.OUT)
scs = Pin(15, Pin.OUT)
spi = SPI(1, baudrate=6000000)
```

# 液晶の ON/OFF

液晶の ON/OFF は簡単である。15ピンを H にすれば表示、L にすれば非表示である。

```python
disp.high() # 表示
disp.low() # 非表示
```

# 液晶のクリア

電源を繋いだ直後はゴミが表示されるので、まず始めには液晶の表示をすべて消去したほうがよい。このためには ALL CLEAR MODE を使う。

```python
scs.high()
sleep_us(6)
spi.write(b'\x20\x00') # ALL CLEAR MODE
sleep_us(6)
scs.low()
```

# 表示データの送信

さて、本来やりたいグラフィックの表示である。気の利いたコマンドなんぞは用意されておらず、愚直にピクセルのデータを送信する。

基本は、UPDATE モードで水平ラインの番号を指定して、R・G・B・dummy の４ビットの列を１ラインのピクセル分(176)送信する。要するに１ラインあたり88バイトである。dummyの無い3ビットのモードやマルチラインのモードも用意されているが、３ピットだとビット演算が面倒だし、組込みで転送用に大きなバッファ用意するのもなんなので、４ビットデータのシングルライン転送がよく使うものであろう。（ちなみに白黒であれば、もっと転送量を減らせるモードもある）

４ビットデータではピクセルの色を　R・G・B・dummy　の４ビットで表すので以下のようになる。

|色 |２進数値 |16進数値 |
|:-:|:-----:|:------:|
| 黒     | 0b0000 | 0x0 |
| 青     | 0b0010 | 0x2 |
| 緑     | 0b0100 | 0x4 |
| シアン  | 0b0110 | 0x6 |
| 赤     | 0b1000 | 0x8 |
| マゼンタ | 0b1010 | 0xa |
| 黄色   | 0b1100 | 0xc |
| 白     | 0b1110 | 0xe |

以下は先頭１ライン目に黄色の線をひくコード。

```python
cmd_buf = bytearray(92)
cmd_buf[0] = 0x90 # SINGLE LINE UPDATE MODE (4BIT-DATA MODE)
cmd_buf[1] = 1 # 水平ライン指定は１オリジン
for i in range(88): # 1ラインのピクセル数分
    cmd_buf[i+2] = 0xcc # １バイトの上位４ビットと下位４ビットで２ピクセル分
cmd_buf[90] = 0
cmd_buf[91] = 0
scs.high()
sleep_us(6)
spi.write(cmd_buf)
sleep_us(6)
scs.low()
```
結果は以下の写真のとおり。

![IMG_3838.JPG](https://qiita-image-store.s3.amazonaws.com/0/106817/c378d939-5b8a-ac4d-8569-0a4d7f1a405e.jpeg)
湿度、温度センサー

#はじめに
I2Cを使用する準備ができたので、初めに湿度、温度センサーを使ってみようと思います。

#HTS221
HTS221は、湿度と温度を取得することができます。

スレーブアドレスは
読み出し　BE
書き込み　BF
となります。

通信速度は400k、100kともに使用することができます。
また、オートインクリメントにも対応しています。

#アクセス手順
以下のフローでHTS221を使用します。

![flow.jpg](https://qiita-image-store.s3.amazonaws.com/0/148400/8d594bf5-3985-433a-4f31-5df54b44585a.jpeg)

ワンショットモードで温度と湿度を取得しています。
ワンショットモードでは、プログラム側でトリガーを掛け、湿度と温度の更新を行います。

1) HTS221をパワーオンする
CTRL_REG1レジスタのPDビットを「1」に設定します。
また、ワンショットモードで温度、湿度を取得するのでBDUビットを「1」に設定して計測データの排他を行います。

2) キャリブレーションを読み込み
デバイス固有のキャリブレーションを読み込みます。
キャリブレーションはスレーブアドレス0x30～0x3Fから取得します。

3) ワンショットモードを開始
CTRL_REG2レジスタのOne-shot enableビットに「1」を設定してワンショットモードを開始します。

4) ステータスの確認
STATUS_REGレジスタを読み込み温度、湿度のデータの更新が完了するのを待ちます。

5) 湿度と温度のデータを取得
湿度データ
HUMIDITY_OUT_LレジスタとHUMIDITY_OUT_Hレジスタを読み出します。
温度データ
TEMP_OUT_LレジスタとTEMP_OUT_Hレジスタを読み出します。

6) キャリブレーションの値から温度と湿度を計算する
キャリブレーションの値を使用して現在の温度を計算します。
計算式は下記になります。

湿度の計算

```math

H_{RH}\verb|[%]| = \frac{(\verb|H1_rH| - \verb|H0_rH|)\times(\verb|H1_T0_OUT| - \verb|H0_T0_OUT|)}{\verb|H1_T0_OUT| - \verb|H0_T0_OUT|} + \verb|H0_rH|

```

温度の計算

```math

T\verb|[degC]| = \frac{(\verb|T1_degC| - \verb|T0_degC|)\times(\verb|T_OUT| - \verb|T0_OUT|)}{\verb|T1_OUT| - \verb|T0_OUT|} + \verb|T0_degC|

```

#まとめ
湿度、温度センサーの使用方法が分かったので、実際にプログラムを作成していこうと思います。
Heroku Toolbelt で複数の Heroku アカウントを管理する

# 前提
- Heroku Toolbelt が事前にインストールしてあること
- 複数の Heroku アカウントそれぞれで利用する 公開鍵/秘密鍵 が生成してあること
- 複数の Heroku アカウントそれぞれで Heroku app が作成してあること

# heroku-accounts をインストール
**1 . 複数のアカウントを切り替え可能にするためのプラグインをインストールします**

```
$ heroku plugins:install heroku-accounts
```

# 複数の Heroku アカウントを登録
**1 . 管理するアカウントを追加します**

-  `work` という仮想アカウント名で Heroku のアカウントを追加する
  - メールアドレス/パスワードの入力をする

```
$ heroku accounts:add work
```

- `private` という仮想アカウント名で Heroku のアカウントを追加
  - メールアドレス/パスワードの入力をする

```
$ heroku accounts:add private
```

**2 . 追加したアカウントを確認します**

```
$ heroku accounts

* private
  work
```

**3 . `work` アカウントの設定を行います**

- `work` アカウントに切り替える

```
$ heroku accounts:set work
```

- `work` アカウントの公開鍵設定を追加する
  - `work` アカウントで利用する公開鍵を Heroku に登録します

```
$ heroku keys:add ~/.ssh/work.pub
```

- `work` 仮想アカウントのSSH接続設定を `~/.ssh/config` に追記する
  - `heroku.[仮想アカウント名]` という仮想的な Host を定義する


```
$ vi ~/.ssh/config

Host heroku.work
    port 22
    HostName heroku.com
    IdentityFile ~/.ssh/work.pem
    User git
    TCPKeepAlive yes
    IdentitiesOnly yes
```

`work` アカウントの git リモートリポジトリ接続設定を追加する

- 下記コマンドで git のリモートリポジトリ接続設定を行う

```
$ git remote add heroku-work git@heroku.[仮想アカウント名]:[Herokuアプリケーション名].git
```

- 仮想アカウントが `work` で、`test-app-work` という Heroku アプリケーションだった場合は下記コマンドを実行します

```
$ git remote add heroku-work git@heroku.work:test-app-work.git
```

- リモートリポジトリを確認します

```
$ git remote -v

...
heroku-work  git@heroku.work:test-app.git (fetch)
heroku-work  git@heroku.work:test-app.git (push)
...
```

- `work` アカウントで git push する場合は下記コマンドを実行します

```
$ git push heroku-work master
```

**4 . `private` アカウントの設定を行います**

- `private` アカウントに切り替える

```
$ heroku accounts:set private
```

- `private` アカウントの公開鍵設定を追加する
  - `private` アカウントで利用する公開鍵を Heroku に登録します

```
$ heroku keys:add ~/.ssh/private.pub
```

- `private` アカウントの秘密鍵を設定する
  - `heroku.[仮想アカウント名]` という仮想的な Host を定義する


```
$ vi ~/.ssh/config

Host heroku.private
    port 22
    HostName heroku.com
    IdentityFile ~/.ssh/private.pem
    User git
    TCPKeepAlive yes
    IdentitiesOnly yes
```

`private` アカウントの git リモートリポジトリ接続設定を追加する

- 下記コマンドで git のリモートリポジトリ接続設定を行う

```
$ git remote add heroku-private git@heroku.[仮想アカウント名]:[Herokuアプリケーション名].git
```

- 仮想アカウントが `private` で、`test-app-private` という Heroku アプリケーションだった場合は下記コマンドを実行します

```
$ git remote add heroku-work git@heroku.work:test-app-private.git
```

- リモートリポジトリを確認します

```
$ git remote -v

...
heroku-private     git@heroku.private:test-app-private.git (fetch)
heroku-private     git@heroku.private:test-app-private.git (push)
...
```

- `private` アカウントで git push する場合は下記コマンドを実行します

```
$ git push heroku-private master
```
VoiceLabsでAlexa Skillの利用状況を可視化する


Webサービスやネイティブアプリを開発するとGoogle Analyticsなど使ってカスタマの利用状況を見ると思いますが、今回はVoiceLabsのVoiceInsightsを使ってSkillの可視化をする方法について紹介したいと思います。

http://voicelabs.co/product/

## アカウント作成

`Get Started`のボタンから、アカウント登録の画面に進みます。

![スクリーンショット 2016-11-03 8.14.28.png](https://qiita-image-store.s3.amazonaws.com/0/36184/1267b30e-04e0-3f72-c796-2820a0b917b7.png "スクリーンショット 2016-11-03 8.14.28.png")

必要な情報を入力して次に進みます。

アカウントの作成がされると、さっそくアプリの登録画面が表示されるので、必要な情報を登録します。
今回はSkillを登録するので `Platform` にはAlexaを指定します。

![スクリーンショット 2016-11-03 8.17.07.png](https://qiita-image-store.s3.amazonaws.com/0/36184/6db21398-aa6e-f8a9-70a8-feba2a886d57.png "スクリーンショット 2016-11-03 8.17.07.png")

アプリが登録されると、SDKの案内がある画面が表示されます。

![スクリーンショット 2017-01-28 11.43.59.png](https://qiita-image-store.s3.amazonaws.com/0/36184/b068395d-3f10-4c76-cbc0-15544fbcf1d3.png "スクリーンショット 2017-01-28 11.43.59.png")

SDKは以下の言語向けに用意されています。

- Node.js
- Java
- Python
- Ruby

## Skillへの導入

SDKを含める必要があるのですが、今回はLmabdaのPythonを利用した時について説明します。

requirements.txtファイルに `voicelabs` を追加して以下のコマンドでSDKを取り込みます

```
cd /your_project_src_path
pip install -r requirements.txt -t $(pwd)
```

skillのソースでSDKをインポートします。トークンはLambdaの環境変数を介して渡します

```
from voicelabs import VoiceInsights

appToken = os.environ["APP_TOKEN"]
vi = VoiceInsights()
```

Lambdaのエントリポイントで初期化します

```
def lambda_handler(event, context):
    vi.initialize(appToken, event['session'])
```

トラッキングするポイントにリクエストとレスポンスの情報を含めます

```
vi.track("インテント名", request, response)
```

これで最低限の情報を収集できるようになります。
zipで全部固めて、Lambdaファンクションに登録します。（データが反映されるまで少し時間がかかりました）

**注意**
Smart Home SkillなどOAuthでアカウント連携をしているSkillの場合、requestオブジェクトにはSkillを利用した[ユーザのトークンが含まれている](https://developer.amazon.com/public/solutions/alexa/alexa-skills-kit/docs/linking-an-alexa-user-with-a-user-in-your-system#getting-the-access-token-from-the-request-smart-home-skills)ため、その情報を含んだまま渡すのはセキュリティー的によろしくないです。
トークンのようなやばい情報は消した上でSDKに渡すようにしましょう。

## 可視化されたデータ

### アクセス状況

![スクリーンショット 2017-01-28 12.01.18.png](https://qiita-image-store.s3.amazonaws.com/0/36184/b2b43b08-4a73-aaa8-8232-b1706ed9f620.png "スクリーンショット 2017-01-28 12.01.18.png")
![スクリーンショット 2017-01-28 12.02.07.png](https://qiita-image-store.s3.amazonaws.com/0/36184/73653b4e-41cb-611f-17fb-71e8cefb8ac8.png "スクリーンショット 2017-01-28 12.02.07.png")

### ユーザー別のアクセス状況

![スクリーンショット 2017-01-28 12.02.56.png](https://qiita-image-store.s3.amazonaws.com/0/36184/f998fb6f-d321-8e66-d3ee-bea85a2dd4f5.png "スクリーンショット 2017-01-28 12.02.56.png")

### 遷移状況

![スクリーンショット 2017-01-28 12.04.52.png](https://qiita-image-store.s3.amazonaws.com/0/36184/b34e378b-a761-5ff0-ce3a-edd5f7e60352.png "スクリーンショット 2017-01-28 12.04.52.png")

## まとめ

SDKを導入してコードを少し追加するだけで、自分の作ったSkillがどんな感じで利用できているかが簡単に見ることが出来ます。
遷移の状態を見ればどこでユーザが困っているかとか、使われていないインテントの状況がわかるので、Skillの改善に繋げられます。
brew upgradeしたらbower:install実行時にlibreadlineが読み込めない

`brew upgrade`した後、`bundle exec rake bower:install:development`したら、
次のようなエラーが発生した。

```
rake aborted!
LoadError: dlopen(.../ruby/2.3.0/x86_64-darwin14/readline.bundle, 9):
Library not loaded: /usr/local/opt/readline/lib/libreadline.6.dylib
```

`/usr/local/Cellar/readline/`の中に`7.0.1`と`6.3.8`の2つのディレクトリがあり、上のエラーメッセージでは`6`が見つからないと言う。

一方、`/usr/local/opt/readline`は`/usr/local/Cellar/readline/7.0.1`のシンボリックリンクになっていたので、これを`6.3.8`に張り直すとエラーは発生しなくなった。

---

同僚から「ruby再インストールしたらいいんじゃないの」と聞いたので試してみたら、元のreadlineで直ったので追記。

```
% rbenv uninstall 2.3.3
% rbenv install 2.3.3
ruby-build: use openssl from homebrew
Downloading ruby-2.3.3.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.3.tar.bz2
Installing ruby-2.3.3...
ruby-build: use readline from homebrew
```
↑古いreadlineでビルドされたRubyだったから動けなくなってたみたいだ。

ただ本件とは関係ないかもしれないが、Rubyを再インストールしたことでnokogiriなどのインストールで失敗するようになってしまった。
これに対しては、`brew link --force libxml2`を叩いて`libxml2`のリンクを作ることで解消したので併せて書いておく。
scikit-learnでニューラルネットワークを使ってみる

# はじめに

scikit-learnの最新バージョンでニューラルネットワークが使えるようになっているという話を聞いたので早速試してみました。

# バージョンアップ

まず、scikit-learnのバージョンをあげます。

```sh:
$ pip install scikit-learn --upgrade
```

# ライブラリの読み込み

詳しくは以下のURLを参照していただくとして、とりあえず回帰のライブラリを読み込んでみます。

http://scikit-learn.org/stable/modules/classes.html#module-sklearn.neural_network

```py3:
from sklearn.neural_network import MLPRegressor
```

# 電力需要を予測してみる

手前味噌ではありますが、以下の記事で紹介していた内容をニューラルネットワークで実行してみます。

http://qiita.com/mix_dvd/items/1f96f5202614dbea93e0

必要なところだけを書き換えてみると...

```py3:
from sklearn.neural_network import MLPRegressor

model = MLPRegressor(random_state=42)
model.fit(X_train, y_train)
print(model.score(X_test,y_test))
```

初期値でのスコアは「0.77841866071119836」でした。

## 隠れ層を増やしてみる

初期設定は以下のとおり。

```py3:
MLPRegressor(activation='relu', alpha=0.0001, batch_size='auto', beta_1=0.9,
       beta_2=0.999, early_stopping=False, epsilon=1e-08,
       hidden_layer_sizes=(100,), learning_rate='constant',
       learning_rate_init=0.001, max_iter=200, momentum=0.9,
       nesterovs_momentum=True, power_t=0.5, random_state=None,
       shuffle=True, solver='adam', tol=0.0001, validation_fraction=0.1,
       verbose=False, warm_start=False)
```

そこで、以下のように書き換えてみます。

```py3:
from sklearn.neural_network import MLPRegressor

model = MLPRegressor(hidden_layer_sizes=(100,100,100,100,),random_state=42)
model.fit(X_train, y_train)
print(model.score(X_test,y_test))
```

すると、スコアが「0.83302793729266389」になりました(^-^)
結構顕著にスコアが変わりますね。

ちなみに、予測結果をグラフ化するとこんな感じ。

![Unknown.png](https://qiita-image-store.s3.amazonaws.com/0/114240/f3cb9acf-8a36-eb30-6c86-e8cdfee94831.png)


他に変更してみるとしたら、max_iterとかalphaとかでしょうか。

もうちょっといじってみます！！
ASP.NET MVC Viewに関するメモ


ASP.NET MVCのViewに関するメモです。

##Viewが表示される基本的な流れ

HomeControllerのIndex Actionが呼ばれたとき下記のような流れで処理されます。

1. /Views/_ViewStart.chtmlが読み込まれる
2. /Views/Shared/_Layout.chtmlが読み込まれる(1.で指定しているから)
3. 2.の_Layout.chtml中の@RenderBody()が呼ばれる(2. に記述されているから)
4. /Views/Home/Index.chtmlが呼ばれる
5. 必要に応じて@RenderSection()が呼ばれる

* @RenderBody()はテンプレートに1箇所のみ
* @RenderSection()は複数箇所でも可

##テンプレートを変更してみる

BootstrapのGet Startedのサンプルコードをベースに下記のようなテンプレートファイルを作成してみました。CDN好きなので外部ライブラリは基本CDNを利用しています。

###テンプレートの用意

下記の内容を/Views/Shared/_Baselayout.chtmlとして保存します。

```html:_Baselayout.chtml
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>@ViewBag.Title</title>
    <!-- Bootstrap -->
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
    <div class="container body-content">
        <header>
            header
        </header>
        <main>
            <h1>Main!</h1>
            @RenderBody()
        </main>
        <footer>
            footer
        </footer>
    </div>
    <!-- script -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
    @RenderSection("scripts", required: false)
</body>
</html>
```

###標準テンプレートの変更

/Views/_ViewStart.chtmlの内容を下記のように書き換えます。

```html:_ViewStart.chtml
@{
    Layout = "~/Views/Shared/_Baselayout.cshtml";
}

```

これで完了です。

## 番外編

### カスタムCSSを置いて~bundleを利用せず利用したい

chtmlのテンプレートの中で~bundleとかを使うのは好きでないので普通に/css/my.cssとかで指定したい。その際はどこが/になるのかを確認。

結論→プロジェクト直下を/と認識するらしい。
例えばテンプレートに下記のように書いた場合。

```html
<!doctype html>
<html>
<head>
<link rel="stylesheet" href="/css/my.css">
</head>
<body>
</body>
</html>
```

プロジェクト直下にCSSというフォルダを作ればそこが/CSSとして認識される。
技術英語 > an e followed by an exponent / to the power of 3 / to the 3rd power

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 765 / 12833)

> **<font color=red>an e followed by an exponent</font>**

```
>>> float('1.0e4')
```

[浮動小数点数型と誤差](http://www.cc.kyoto-su.ac.jp/~yamada/programming/float.html)

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

to the power of 

> to the power of 3

もしくは

> to the 3rd power

以下を見つけた
https://www.youtube.com/watch?v=_9LUGQWF30Y
Chainer2.0が近日リリース またそれとは別の大規模分散処理に対応したChainerもリリースされるらしい

日経ITPro 2017/01/27リリースの記事より
[PFNの深層学習フレームワーク「Chainer」が大幅な高速化へ、分散処理に対応](http://itpro.nikkeibp.co.jp/atcl/news/17/012700269/)
***
この一年半ほどChainerを個人(学習とちょっとした研究)用に、また直近一年程度は業務案件でTensorFlowを使ってきました。

度々、この二者の違いは何かと考えましたが、Chainerが劣ってしまう点は複数ノードでの分散処理に対応していないことでした。
と言っても底辺フリーランサーが関わる案件では分散処理が必要になるほど大規模なデータセットに触れることはまずありませんが。

##少なくとも32ノード/128GPUに対応するようです

![image](https://qiita-image-store.s3.amazonaws.com/0/141216/28a22742-6cd0-86f2-b7b7-34843c46efd6.png)
(上記リンク先より転載)

1ノード/1GPUで20日以上を要した学習が32ノード/128GPUでは、なんと4.4時間まで短縮されたとのこと。
「20日以上」を20日として計算しても実に109倍の高速化に相当します。

また128GPUで1GPUに対し109倍の性能を実現したということは、**実効効率は85.22%**に達しており、**異常と言って良いほどの高効率**を達成しています。

自称底辺フリーランサーですが大規模分散処理だけは得意分野なので、ちょっとだけ語ってしまうとデータの関連性が**疎**な場合でも、なかなか85%なんて効率は出せません。しかも比較的関連性が**密**である機械学習でこの効率を達成するのは快挙と言って過言で無いと思います。

余談ですが分散処理系システムでは「4つで3つ」なんて言葉をよく使うのですが、これは4台で3台分の性能を達成することを目標とする意味です。つまり実効効率75%ですね。しかし、この75%あくまでも目標値であり現実にはそう簡単に達成できるものではありません。

MXNetやCNTKでは大凡実効40～50%となっており、この程度は普通だと思うのですが、分散処理対応版Chainerではきっと凄い技術が使われているのでしょう。

ForwardはDataParallelで効率を上げられるでしょうが、Backwardはloss計算の手前で同期処理が必要になるため効率が低下すると思います。
loss計算後にはOptimizerによるbackpropagationが行われますが、これも分散で実行するのか、または1ノードで処理し更新されたWeightなどを各ノードに配信する方式か...

またTensorFlowの5倍を超える性能になりますので大規模案件での採用が期待されますね。

ちなみに分散ノード間結合技術としてはMPIとInfiniBandが使われるとのこと。
ITProの記事にも記載がありますが完全にスパコンの技術です。
Protocol Buffersと10GbEでなんとかなりませんでしょうか...(笑)

また我々のような「普通の人」の意見として、1ノード/4GPUなどの環境でも高速化されることを大いに期待します。

##近日中にChainer2.0がリリースされるとのこと
ITPro会員でないと読めない2ページ目に書かれていますが
> PFNは近日中に「Chainer 2.0」をリリースする予定だが、これは分散バージョンのChainerではない。
とのこと。

残念なことにITProの記事にはChainer2.0の詳細は全く記載されていませんでした。
「近日中」が具体的にいつなのかが気になりますね。

[先日書かせて頂いた記事](http://qiita.com/TokyoMickey/items/fb76effac34c2487cc34)でTensorFlowも1.0がそろそろリリースされるとお伝え致しましたが、お互い切磋琢磨してどんどん良いフレームワークになって欲しいものです。(他力本願)

続報に期待します。
wp-cli でほいほいvccwをセットするためにしたこと

# wp-cliでvccwをセットアップするのにやった行程
## MAC内にwp-cli のインストール

```
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
```
https://github.com/wp-cli/wp-cli
追記：またみつけてきました
※スクリプトが削除されてしまったようなので以下のリンク先を参考に。
http://wp-cli.org/#installing


##PATHを通す
そのままだとPATHが通ってなくって

```
wp --path=~/.wp-cli/bin/wp cli version
```

上のような感じで使わないといけないので

.bash_profileに追記

```
export PATH=${PATH}:${HOME}/.wp-cli/bin
```

これでこんな感じで確認できるはず。

```
wp cli version
WP-CLI 1.0.0
```
cliのバージョンは

```
wp cli update
```

でアップデートできたはず。

## vccw/scaffold-vccw パッケージのインストール

```
wp package install vccw/scaffold-vccw:@stable
```

ここで問題発生。


```
PHP Fatal error: Allowed memory size of xxxxxx bytes exhausted (tried to allocate xxxxx bytes) in …
```

```
sudo cp /etc/php.ini.default /etc/php.ini
sudo chmod 644 /etc/php.ini
```

メモリサイズが足りないとでてきました。なのでphp.iniを修正して

/etc/php.ini

```
memory_limit = 512M
```

とかに変更してPCを再起動。これでよいはずだったんですがエラーはかわらず。

このファイルをみてないのかなと思ってphp -infoでみてみると
いつそんな設定をしたのか忘れましたけども。php7.0が入っていてそっちにつながっているようでした。

```
Configuration File (php.ini) Path => /usr/local/etc/php/7.0
Loaded Configuration File => /usr/local/etc/php/7.0/php.ini
```

そっちを変更すればよいかなということで修正して再起動。
これでパッケージをインストールできました。

```
$ wp scaffold vccw wordpress.dev --lang=ja
Success: Generated. Run `vagrant up`.
```

※オプションの指定の箇所まだ日本語リリースされる前だとエラーになるようでした。

[WP-CLIでVCCW環境をほいほい作る](http://qiita.com/miya0001/items/687d142d714b1386a44f)


※ちなみに関係ないけども、vccw3系ではftpでの接続ができないとのことなのでどうしてもFTPで接続したい場合は2.8.2とか2系だと可能でした。
RailsTutorialのversion=4.2#sec-layout_linksにて起きたエラーについてのメモ

#概要
粛々とチュートリアル進めてたらこうなった
```
undefined local variable or method `help_path' for #<#<Class:0x00000004d31d88>:0x00000004d16a60>
```

なにやら定義されていないメソッドとか言われた。
ルーティングの問題かな？と思い調べた結果のメモ

#解決策
要するに名前付きルートはそんなに賢いものではなく、ちゃんと定義してあげてねって話だった。
名前付きルートが生成する？ `/help`は定義されてないわいワレ、と叱られていたらしい。

```config/routes.rb
get '/help', to: 'static_pages#help'
```

これで動いた。

## 参考
[Rails 名前付きルート メモ](http://qiita.com/weblog-masaya/items/dae313da8263c0b0dcef#_reference-ddc7944d8cf36864b6bc)
上記の記事と書き方違うけど、あまり違いがわからない。。
RPiからセンサーデータを収集して可視化するまでのエトセトラ

# ゴール

定期的にセンサーの値を収集して、
センサーデータをGoogleスプレッドシートに書き込み、
その値をグラフにします。
リアルタイムに値が追加されていきます。

<img width="1353" alt="スクリーンショット 2017-01-26 10.50.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/19483/511d1655-2b2e-35dc-3d39-58ea30cb9103.png">

# 用意するもの

* IFTTTのアカウント
* Googleアカウント（GoogleDriveのスプレッドシートで使用）

# IFTTTの設定

(1)[IFTTT](https://ifttt.com/) へログインし、MyApplet → New Applet から新しいアプレットを作成します。

![スクリーンショット 2017-01-29 1.08.00.png](https://qiita-image-store.s3.amazonaws.com/0/19483/0443897e-bc48-4e02-6d7b-8b76a61cc407.png)

(2) **This** に Makerを選択する。
検索にMakerと入れればすぐに見つかります。

![スクリーンショット 2017-01-29 1.14.36.png](https://qiita-image-store.s3.amazonaws.com/0/19483/96f092e2-da7e-58de-0220-9ed0cb49dfe6.png)

(3) "Receive a web request" を選択します。（そもそも一択ですが）
以下の画面になってない場合は、画面にConnectが表示されているので誘導に従ってconnectを実施してください。

![スクリーンショット 2017-01-29 1.21.24.png](https://qiita-image-store.s3.amazonaws.com/0/19483/28f0b6db-5c95-6c58-cf90-8d097f046781.png)

(4) Event Nameに適当な名前を設定します。
とりあえず"received_data"と指定して、Create triggerを設定します。
このイベント名は後ほどアプリケーションを起動する際の設定値になるので把握しておいてください。

![スクリーンショット 2017-01-29 1.24.04.png](https://qiita-image-store.s3.amazonaws.com/0/19483/1b88bcc6-3cb2-633e-463f-025d7be3f1b6.png)

(5) **That**を選択します。

![スクリーンショット 2017-01-29 1.28.11.png](https://qiita-image-store.s3.amazonaws.com/0/19483/0a589608-fc93-ea00-bbe3-d3e4a73d9826.png)

（６） Google Driveを選択します。
以下の画面になってない場合は、画面にConnectが表示されているので誘導に従ってconnectを実施してください。

![スクリーンショット 2017-01-29 1.30.32.png](https://qiita-image-store.s3.amazonaws.com/0/19483/6db1f380-7469-aeb1-3e1e-ce7979f2f454.png)

(7) "Add row to spreadsheet"を選択。
トリガーの度にファイルの最終行に1行出力することが出来ます。

![スクリーンショット 2017-01-29 1.36.40.png](https://qiita-image-store.s3.amazonaws.com/0/19483/4175a514-837d-dd30-b74b-264634f731ae.png)

(8) 変更しないで"Create Action"を押下します。
"Spreadsheet name"や"Drive folder path"は任意で変更しても構いません。

![スクリーンショット 2017-01-29 1.40.07.png](https://qiita-image-store.s3.amazonaws.com/0/19483/cca9f59e-0df5-7fef-8d98-eadff2244db0.png)

(9) Finishを押下します。
任意で概要のテキストを変更しても構いません。

![スクリーンショット 2017-01-29 1.41.34.png](https://qiita-image-store.s3.amazonaws.com/0/19483/24d4dc17-3d52-3c63-50e9-96cd9a0c14ce.png)

# RaspberryPiの設定

## サンプルコードの取得

```
git clone https://github.com/seiketkm/ifttt_with_sensor_rpi.git
```

## センサーの配線

![スクリーンショット 2017-02-05 15.37.01.png](https://qiita-image-store.s3.amazonaws.com/0/19483/0be6961d-97c0-b271-df7b-9a6d2bd4f610.png)


![IMG3743.JPG](https://qiita-image-store.s3.amazonaws.com/0/19483/3f583309-f0b3-b942-c5c9-8abc372baf16.jpeg)

人感センサは黄色いピンに接続します。

温度センサはADT7410を想定してます。

# プログラムの動かし方

https://github.com/seiketkm/ifttt_with_sensor_rpi/blob/master/README.md

を参照してください。

# 動作の確認

（８）で変更していなければ、GoogleDriveのIFTTT/Maker/IFTTT_Maker_Eventsのファイルに１０秒ごとに１レコード追加されます。
あとはC列からF列を選択肢てグラフ描画機能を使うとグラフになります。（適当にいじったらできます）
NASもファイルサーバもいらない！Azure ストレージアカウントの「File Storage」を活用しよう

#概要
Azureを利用していると、ストレージアカウントはお使いになられたことは最低1度はあったかと思います。その中でもよく利用されるのが「BLOBストレージ」や「テーブルストレージ」、場合によっては「キューストレージ」ではないでしょうか。今回はあまり注目を浴びない「ファイルストレージ」のサービスを利用する方法と、オープンソースソフトウェアを組み合わせた実運用的な利用方法をご紹介します。

##Azure ファイルストレージって？
Azure ファイルストレージは、Azureストレージアカウントのサービスの一つで、SMBプロトコルといういわゆる普通のWindowsファイル共有と同じプロトコルを利用した、ファイル共有サービスの一つです。課金体系はAzureストレージアカウントと同じで、利用した容量とトランザクション数だけで課金されるため、費用を抑えつつ大容量のファイルを（最大容量5TBまで）保管することができます。

##構築手順
1. まず、[Azure Portal](http://portal.azure.com)から画面左上の「＋新規作成」ボタンをクリックし、「Storage」カテゴリーの「ストレージアカウント」をクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/976a3d60-29eb-56c1-8fe9-6cda665877a0.png)

2. ストレージアカウントの名前、リソースグループ等を指定します。アカウントの種類は「汎用」のままにします。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/e7259ebf-2433-f11a-1738-36d4992ff2d7.png)

3. デプロイ完了後、ストレージアカウントを開き、「ファイル」をクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/0f1b9c0c-62c2-f825-5018-cb40d3d4da24.png)

4. 「ファイル共有」をクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/ba9e8bf5-b10f-ad13-9ba9-fe1113da1dcc.png)

5. 新しい名前で割り当てる容量（クォータ）を指定し、「作成」をクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/e28e2a82-4a1d-7553-a007-e423fe684e26.png)

6. これで共有の準備はできました。このファイル共有をクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/82203106-c17f-f226-bac3-35e7f956dab3.png)

7. 「接続」を押すと、このファイル共有へアクセスするためのアクセス情報が表示されます。この情報のメモを取りましょう。 
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/e23e2bc8-1118-24c2-73d4-42a9081225d7.png)

8. Windows/Linuxで接続を設定するには、アクセスキーが必要ですので、そちらも取得しておきます。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/43006330-88aa-24a8-fcad-ac0a3396631e.png)


###Windowsの場合
1. Windowsの場合、net useコマンドで、このファイル共有のドライブマッピングか可能ですが、画面からも設定できます。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/03f83892-3083-115e-f779-247c48d02efc.png)

2. フォルダエクスプローラーを開き、「PC」（またはマイコンピュータ）を選択し、「ネットワークドライブの割り当て」をクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/b0bc01a8-e644-0a03-f52f-0dd9963d7d4d.png)

3. ウィザードが表示されるので、「フォルダー」に表示されていたアドレス「\\ストレージアカウント名.file.core.windows.net\ファイル共有名」を記入し、「別の資格情報を使用して接続する」にチェックを入れてから、「完了」をクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/ea7f3883-e7a9-4cf6-077c-a641dade67ca.png)

4. 資格情報が求められるので、ユーザー名はストレージアカウント名、パスワードはアクセスキーを入力します。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/724e7f16-3743-e59f-5cab-b9a70c626fb1.png)

5. 何も完了したことについて通知されませんが、PCまたはマイコンピュータを開くと、ちゃんとつながっています。これで最大5TBのファイルストレージが使えるー！
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/f993c86e-6fc6-a64b-e358-ba6c69621bbb.png)

6. 転送速度は著者の自宅のインターネットだと、毎秒6MB前後（48Mbps）の転送速度でした。結構早いですね。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/fc7689e4-7e3a-d9d9-2f9c-d5bf8077ad5f.png)

###Linuxの場合
Linuxの場合は、ターミナルを開いて、表示されているmountコマンドを入力すれば、簡単にマッピングできます。
※Linuxでは通信が暗号化できないため、現在はAzure上の同リージョンのLinuxからのみアクセス可能です。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/09952d1f-845a-530e-4a1f-7a961bc423bd.png)
FreeBSDのUnboundを社内キャッシュDNSとして設定する

社内ネットワークでキャッシュDNSが必要になったのでFreeBSD標準のUnboundでDNS設定を行ったのでそのメモです。

# 最終的な設定
```/var/unbound/unbound.conf
# This file was generated by local-unbound-setup.
# Modifications will be overwritten.
server:
        interface: 127.0.0.1
        interface: 10.X.X.XX
        interface: 10.X.X.XX
        interface: 10.X.X.XX
        interface: 10.X.X.XX
        #interface: 0.0.0.0
        username: unbound
        directory: /var/unbound
        chroot: /var/unbound
        pidfile: /var/run/local_unbound.pid
        #auto-trust-anchor-file: /var/unbound/root.key
        do-ip6: no

        #use-syslog: yes
        logfile: /var/unbound/log/unbound.log
        log-time-ascii: yes
        #verbosity: 1
        log-queries: yes
        module-config: "iterator"
        val-permissive-mode: yes
        val-log-level: 2

        access-control: 0.0.0.0/0 allow

forward-zone:
        name: "."
        forward-addr: 10.X.X.X
        forward-addr: XXX.XX.XXX.X

#include: /var/unbound/lan-zones.conf
include: /var/unbound/control.conf
include: /var/unbound/conf.d/*.conf
```
## DNSSEC
最近はDNSSECが標準のようで苦労しました。
まずデフォルト状態で、`forward-zone`を追加しただけでは応答してくれませんでした。
そこで以下の設定を追加しました。

```
        val-log-level: 2
```
これを入れることで、DNSSECの検証で何が気に入らなかったかを教えてくれます。

DNSSECの検証でエラーが出ても応答するようにします。

```
        val-permissive-mode: yes
```

ここまでの設定でキャッシュDNSとして応答を返してくれるようになりました。

## DNSSECを無効にする
社内要件は、古いDNSサーバ4台を廃棄し、新しいDNSサーバへ移行することでした（古いDNSサーバのIPは引き継がず、新規IPで構築します）。
古いDNSサーバは、古いOSで稼働しており、脆弱な状態であるため、速やかに停止することが求められていました。
社内には、新しいDNSサーバへ簡単に切り替えられない端末が存在しており、その救済措置としてキャッシュDNSサーバを構築しました。
まず、古いDNSサーバ1台を停止し、そのIPでキャッシュDNSサーバを稼働させ始めたところ、DNSSECの検証エラーが多かったので、DNSSECを無効化することにしました。
以下の設定を追加しました。

```
        #auto-trust-anchor-file: /var/unbound/root.key
        module-config: "iterator"
```

# 起動コマンド
これを使ってました。

```
# /etc/rc.d/local_unbound start

# /etc/rc.d/local_unbound stop

# /etc/rc.d/local_unbound restart
```

# ログ設定
切り替えフォローのために、問合せ元IPがログに記録される必要がありました。

## syslogに出力
syslogへの出力を試みました。

```
        use-syslog: yes
```

ファシリティが`LOG_DAEMON`ということで、下記の設定を追加しましたが、まったく出力されませんでした。
`chroot: /var/unbound`が効いているせいか、上位のディレクトリには出力できないのでしょうか？

```/etc/syslog.conf
LOG_DAEMON.*                                   /var/log/unbound.log
```

## ログ出力設定
syslogはあきらめて、普通にログ出力することにしました。

```
        logfile: /var/unbound/log/unbound.log
        log-time-ascii: yes
        #verbosity: 1
        log-queries: yes
```

# ログローテーション
newsyslogでログローテーションの設定をします。
いろいろはまりました。

```/etc/newsyslog.conf
/var/unbound/log/unbound.log    unbound:wheel   644  30    *    @T00  JBR       /var/unbound/unbound-log-reopen
```

## はまったところ
1. ファイルの所有者
 プロセスのユーザが`unbound`、ログファイルのユーザも`unbound`なので、`newsyslog.conf`もそのように指定してあげる。

2. シグナルを渡す
 ローテーション後の新しいファイルに書き出すためにシグナルを送ってもらおうとする。`/var/run/local_unbound.pid`を最後の項目に書いてみたが、ログは出力されませんでした。

3. ログファイルの再オープン
 シグナルではうまくいかなくて、Google先生に聞くと、`log_reopen`というコマンド？があることがわかりました。そこのサイトではシェルを書くようにあったので、それを使いました。

```/var/unbound/unbound-log-reopen
#
#!/bin/sh
#This script restarts unbound after log rotation by newsyslog(8).
#

/usr/sbin/unbound-control -q log_reopen

exit 0
```
luaのrequireについて(cocos2d-x)


## Env

- cocos2d-x 3.14.1
- macOS Sierra 10.12.1

## Description

luaファイルを読み込む
また、読み込んで取得したモジュールはキャッシュされるため、
２回目以降requireをしても読み込まず、キャッシュをそのまま返却する

## Usage

よくやるやり方とハマるポイントのまとめ

最初は、自分もファイルパスでしかrequireできないと思ってたけど
意外と方法は結構ある

### ファイルパスで読み込む

package.pathにluaファイルの検索パスを追記する。
追記する場合は、環境パスに追記するみたいにセミコロン(;)で区切る

ちなみにここが少しcocos2d-xだとハマるポイントで
例えば以下のような階層のA.luaで`require("B")`をしても
not foundになってしまうので注意が必要

```
src/sample/A.lua
		  /B.lua
```

cocos2d-xでは、カレントディレクトリ検索のパスをpackage.pathに追記したとしても
必ずFileUtilsのsearchPathから検索されるため、見つからない

この場合、対処法としては以下のどちらか

- FileUtilsのsearchPathにsampleを追加する

`FileUtils:getInstance():addSearchPath("src/sample")`

- requireのパスを変更する

`require("sample.B")`

### requireできるモジュールを関数で追加する

モジュールを返却する関数をpackages.preloadにインサートする

```
packages.preload[module_name] = function()
	local _M = {}
	
	...
	
	return _M
end
```

例えば以下のようにすれば、上記のファイルパスで読み込むの手順を踏まなくても
`require("B")`でsample/B.luaを読み込むことができる

```
packages.preload["B"] = function()
	return require("sample.B")
end
```

### キャッシュに直接モジュールを追加する

packages.loaded[module_name]にrequire(module_name)の結果が
キャッシュされていて次回以降はrequire(module_name)で
packages.loaded[module_name]が返されるようになるというのを利用する

```
packages.loaded[module_name] = _M
```

例えば以下のようにすれば、上記のファイルパスで読み込むの手順を踏まなくても
`require("B")`でsample/B.luaを読み込むことができる

```
packages.loaded["B"] = require("sample.B")
```