OmniAICreator/Qiita-1.07M huggingface dataset:
EC2にFuelPHPをインストール時のエラーを解決

簡単なことなのにすごく手こずったのでメモします。
AmazonLinux環境です。

あれ、SSHできない・・・

## インバウンドを許可し忘れてた
- SSH
- HTTP

改めてアクセス

```
$ ssh -i "key.pem" ec2-user@xxx.xxx.xxx.xxx
```
## 必要なパッケージをインストール

```
$ sudo yum update
$ sudo yum -y install php git php-pdo php-mysql mysql-server php-dom php-mbistring
$ sudo service httpd start
```

ブラウザでapacheが起動したことを確認
![スクリーンショット 2016-11-23 22.40.09.png](https://qiita-image-store.s3.amazonaws.com/0/150799/fbfdab93-955e-94d1-16ba-e356920c00e1.png)

## fuelPHPを入れる
こちらを参考にした
http://wp-e.org/2014/06/20/2967/

```
$ curl get.fuelphp.com/oil | sh
$ cd
$ mkdir Sites
$ cd Sites/
$ oil create fuelphp
```
処理が終わったら

```
$ cd /var/www/html/
$ ln -s ~/Sites/fuelphp/public fuelphp
ln: シンボリックリンク `fuelphp' の作成に失敗しました: 許可がありません
```

当たり前だよなぁ・・・
（sudoで実行）

```
$ sudo ln -s ~/Sites/fuelphp/public fuelphp
```

よしhttp://host/fuelphp/ にアクセスだ！

![スクリーンショット 2016-11-23 22.54.08.png](https://qiita-image-store.s3.amazonaws.com/0/150799/c7b5b5d3-cef6-c8cf-fd3e-b086011589ac.png)
ファッ？！


## 修正作業
どうやらホームディレクトリに実行許可を与える必要があるらしい

```
$ cd
$ sudo chmod 701 .
```

更新
![スクリーンショット 2016-11-23 23.05.07.png](https://qiita-image-store.s3.amazonaws.com/0/150799/d9fbd515-780f-9c5e-4972-df071229ec9c.png)


ログフォルダに対して書き込み権限を与えよう

```
chmod 777 /home/ec2-user/Sites/fuelphp/fuel/app/logs/
```
![スクリーンショット 2016-11-23 23.32.02.png](https://qiita-image-store.s3.amazonaws.com/0/150799/36b705e9-fbdb-a531-dc50-82a9b8d212a5.png)

default_timezoneを設定しよう

```
$ vi /home/ec2-user/Sites/fuelphp/fuel/app/config/config.php 
```

```
'default_timezone'   => 'Asia/Tokyo',
```

![スクリーンショット 2016-11-23 23.34.14.png](https://qiita-image-store.s3.amazonaws.com/0/150799/ed249cf0-3c64-d6ca-7309-022c45fdf6a1.png)

やったぞ！
Welcomeにたどり着いた！

手順通りにやったつもりなのに何がいけなかったんだろう。
tmlib.jsのFlowと同じようにphina.jsのFlowを使う

個人的なメモとして。

```js
var tasks = [];
// 何がしかの非同期的な待ち処理
tasks.push(phina.util.Flow(function (resolve) {
	temp.one('finishEvent', function () {
		resolve();
	});
}));

// 全ての待ち処理が終わったあとの処理
phina.util.Flow.all(tasks).then(function () {
	//TODO
});
```
LINE Messaging API を使って LaTex を送れるようにしてみた。

# LINE で数式を送る
LINE で人と数学の話をするとき、どうしても数式を送りたいときがありますよね。

相手が生の LaTex を読める人ならいいのですが、そうもいかないことも多々あります。
Tex を送ると画像を返してくれる bot がないかと思って探してみましたが、なかったので作ってみました。

## 動作イメージ
![LaTexIt！](https://qiita-image-store.s3.amazonaws.com/0/116845/72ad0c52-77a3-179d-31ec-f855bf9d09e6.png)

以下の機能があります。

+ 1対1トークで Tex コマンドを送信すると、画像を返す
+ グループトークで先頭に`t:`をつけて Tex コマンドを送信すると、画像を返す

## ソース
```php:index.php
<?php
$line=array(
	'accessToken' => 'YOUR ACCESS TOKEN',
	'channelSecret' => 'YOUR CHANNEL SECRET'
);

$request = file_get_contents("php://input");
$json = json_decode($request,true);

//SIGNATURE CHECK
$signature = $_SERVER['HTTP_X_LINE_SIGNATURE'];
if($signature!==base64_encode(hash_hmac('sha256',$request,$line['channelSecret'],true))){
	error_log('Signature check failed');
	http_response_code(400);
	exit(0);
}
//PASSED!
$image_base="https://chart.apis.google.com/chart?cht=tx&chs=50&chl=";

foreach($json['events'] as $e){
	$tex = '';
	switch($e['type']){
		case 'message':
		if($e['message']['type'] === 'text'){
			switch($e['source']['type']){
				case 'user':
				$tex = $e['message']['text'];
				break;
				case 'room':	//「招待」を使ったトーク
				case 'group':	//グループを作成したトーク
				if(stripos($e['message']['text'],'t:') === 0){
					$tex = substr($e['message']['text'],2);
				}
				break;
			}
		}
		break;
	}

	$header = array(
	    'Content-Type: application/json',
		'Authorization: Bearer ' . $line['accessToken']
	);

	//SEND IT!
	if($tex !== ''){
		$url = $image_base . urlencode('\displaystyle '.$tex);
		$body = array(
			'replyToken' => $e['replyToken'],
			'messages' => array(
				array(
					'type' => 'image',
					'originalContentUrl' => $url,
					'previewImageUrl' => $url
				)
			)
		);
		$context = stream_context_create(array(
			'http' => array(
				'method' => 'POST',
				'header' => implode("\r\n",$header),
				'content' => json_encode($body)
			)
		));
		
		$result = file_get_contents("https://api.line.me/v2/bot/message/reply",false,$context);
		 if (strpos($http_response_header[0], '200') === false) {
	        http_response_code(500);
	        error_log("Request failed: " . $result);
	    }
	}
}
```

あえてフルスクラッチで作りましたが、特に深い意味はありません。

ローカル開発環境を一切使わずに、 App Service Editor だけで開発しましたが、
小規模な BOT などであれば、充分実用できると思いました。

LINE の場合は、変更を確かめるのに自分でメッセージを送らないといけないので、
編集後即座に保存・適用されるのがよかったです。
※ ローカルでテストもできるぜ！という方法をご存知の方、教えてください。
yum installしてもいつまでも古いRPMパッケージが参照されてしまうときはyum cleanコマンドを実行する

## この記事でわかること
+ varnishをインストールしようとしたとき、`yum install`で詰んだ話
+ 原因はCentOS6にCentOS7のパッケージを追加しようとしてた
+ その後RPMパッケージを変更したが`yum install`はずっと変更前のCentOS6系のリポジトリを参照しててエラー
+ `yum clean`コマンドでキャッシュを削除したら反映された

## 事の経緯

isucon2の過去問を解いてる際に、Varnishインストールを行っていたのですが、
下記の手順でVarnishをインストールしようとしても、エラーが出てしまい、インストールされませんでした。

```
$ rpm --nosignature -i https://repo.varnish-cache.org/redhat/varnish-4.1.el7.rpm
$ yum install varnish

エラー: パッケージ: varnish-libs-4.1.3-1.el7.x86_64 (varnish-4.1)
             要求: libc.so.6(GLIBC_2.14)(64bit)
・・・以下略
```

原因を調査していると、上記のコマンドで、CentOS6の環境にCentOS7系のリポジトリ`https://repo.varnish-cache.org/redhat/varnish-4.1.el7.rpm`を追加していたことがわかりました。
きちんと環境に合わせたものを追加しなければ、そりゃエラーもでますね…:sob:

そこで、下記のコマンドで追加したリポジトリを削除し、CentOS6系のリポジトリを追加し、再度インストールを行いました。

```
$ rpm --nosignature -i https://repo.varnish-cache.org/redhat/varnish-4.1.el6.rp
$ yum install varnish
```

……しかし、それでもまだ
```エラー: パッケージ: varnish-libs-4.1.3-1.el7.x86_64 (varnish-4.1)```
というエラーが表示されてしまいます。しかもel6に修正したはずなのに、el7になってます :rolling_eyes:
これはいったいどういうことなのでしょう。

## yum cleanでキャッシュを削除して解決！

さらにさらに調査したところ、どうやら`yum`によるインストールやアップデートで利用したRPMパッケージやデータのキャッシュが残っているのが原因のようでした。
下記のコマンドで`yum`のキャッシュをクリアして、再度インストールを行うことで、無事にCentOS6系のVarnishがインストールされました！

```
$ yum clean all
$ yum install varnish
```

症状がキャッシュが残ってて反映されてないやつに似てたので、`yum キャッシュ`のようなキーワードで検索したのがよかったです…。
まさかyumにキャッシュがあるとは思いませんでした:sweat_smile:


参考
https://www.varnish-cache.org/releases/install_redhat.html
http://easyramble.com/yum-clean-and-update.html
API GatewayでのCORS有効化の注意点

API GatewayにはCORSを有効にする設定があり、ボタンひとつで必要なヘッダー情報の付与などをしてくれる。

参考: http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/how-to-cors.html

が、自分の環境（ajaxでAPI Gatewayのエンドポイントを叩くようなWEBアプリを作っている）では上記設定を完了しても依然として `No 'Access-Control-Allow-Origin' header is present on the requested resource.` というエラーが出てしまっていた。

いろいろ調べた結果、以下のstackoverflowにたどり着いた。
http://stackoverflow.com/questions/34325009/aws-api-gateway-endpoint-gives-cors-error-when-post-from-static-site-on-s3

つまり、**API Gatewayに対するアクセス自体が異常終了した場合は、設定されたヘッダー情報などは反映されずにレスポンスが帰ってくる**様子。なので見直すべきはCORSの設定ではなく、APIを叩く側の形式であったり、API Gatewayのマッピングテーブルであった。

今回は、ajaxでjsonをputしていたのだが、その形式がおかしくて途中（詳しく見てないがおそらくパラメータのマッピング？）で`Access-Control-Allow-Origin`が設定されていないレスポンスが帰ってきてたようだった。
jQuery Event から DOM Event を取る

## 結論
`event.originalEvent`で取れる。
## 解説
jQueryのイベント便利ですよね。
一気に複数イベント登録できたり`.once`や名前空間など様々な機能があって便利です。

しかし、ドラッグアンドドロップイベントの`dataTransfer`や、コピーアンドペーストの`clipboardData`などはjQueryの`event`では直接使えません。

```js:例
$("#editor").on("paste", function(event){
  alert(event.clipboardData.getData("text/plain") + "をペーストするよ！");
});
// => エラー！！
```

このとき関数に渡される引数はjQueryの独自のイベントオブジェクトなのです。
ブラウザ間で差異がないようよしなにやってくれてるわけですが、`addEventListener`などで渡されるオリジナルのイベントオブジェクトが欲しいです。

実は、このオリジナルのイベントオブジェクトは、jQueryのイベントオブジェクトの`originalEvent`プロパティで参照できるようになっています。

なので、上記のコードは、

```js:例
$("#editor").on("paste", function(event){
  alert(event.originalEvent.clipboardData.getData("text/plain") + "をペーストするよ！");
});
```

のように直すと動きます。
Swift3.0のAccess Control

#Purpose
Personal Note

#Access Control
Since Swift3.0 was released, Access Control has been changed.
"open" and "fileprivate" are new access controls.

**open**: Laxest access control. Can access from outside of modules
**public**: Can access from outside of modules, but cannot do "override" and make it as subclass
**internal**: Can access from inside of modules. Basically if you don't mention, parameter will apply this as default
**fileprivate**: Allow access from inside of file.
**private**: Strictest. Allow access from class

![Swift3AcccesControl.png](https://qiita-image-store.s3.amazonaws.com/0/129117/9de5a7f0-e4ad-caec-a055-aa923128a84c.png)
(Image from swifting.io)

#Reference
https://swifting.io/blog/2016/08/17/22-swift-3-access-control-beta-6/
Attiny85をArduino IDEでプログラム

[ここ](http://highlowtech.org/?p=1695)を参考に
追加のボードマネージャーに
https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json
を入力すればいい。

ちなみにAmazonでDigisparkの[バッタもん](https://www.amazon.co.jp/HiLetgo-Digispark-Kickstarter-ATTINY85-超小型Arduino互換/dp/B00VM5M4W4/ref=sr_1_1?ie=UTF8&qid=1479876154&sr=8-1&keywords=digispark)を買ったけど動かなかった。
WindowsPCに接続したらUnknownDevice...。

これのbootloader自体は[micronucleus](https://github.com/micronucleus/micronucleus)なのですが、
どうしたら焼けるかというと、
[ここ](http://dumbpcs.blogspot.jp/2015/11/flashing-your-attiny85-with.html?m=1)が参考になる。

コマンド例は

avrdude -c usbasp -p t85 -U flash:w:micronucleus-1.06-upgrade.hex -U lfuse:w:0xe1:m -U hfuse:w:0xdd:m -U efuse:w:0xfe:m

avrdudeの[使い方](https：//synapse.kyoto/tips/ArduinoISP＿AVRWriter/page001.html#index)はここが参考になる。

fuseの設定は
リセットピンでリセットを有効にするには
-U lfuse:w:0xe1:m -U hfuse:w:0xdd:m -U efuse:w:0xfe:m
リセットピンをIOとして使うには
-U lfuse:w:0xe1:m -U hfuse:w:0x5d:m -U efuse:w:0xfe:m
となるが、
詳しい意味はAttityのマニュアルが参考になる。

lfuse: 0xe1 
hfuse: 0x5d
efuse: 0xfe

なんちゃってdigisparkのチップをはがして手持ちのチップやり直したいと思います。

(edison(debian wheezy)では1.6.13のavrdudeは動きませんでした。1.0.6のものなら大丈夫そう)

実際に書き込めたコマンドは、

~/arduino-1.0.6/hardware/tools/avrdude -c arduino -p t85 -U flash:w:t85_default.hex -U lfuse:w:0xe1:m -U hfuse:w:0xdd:m -U efuse:w:0xfe:m -C ~/arduino-1.0.6/hardware/tools/avrdude.conf -P /dev/ttyACM0

書き込み装置は手持ちのpro-micro 3.3VをAruino as ISPとして使いました。

arduinoでdigisparkを動かすには
http://digistump.com/package_digistump_index.json
をボードマネージャーに読み込ませればいいです。
使い方はdigisparkの[wiki](https://digistump.com/wiki/digispark)が参考になります。
Vagrant1.8.7でネットワークの起動に失敗する

# 概要
Vagrant1.8.7+VirtualBox5.0.28+macOS Sierraで`vagrant up`時に下記のエラーが再現。boxのOSはCentOS 7.2。

```
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Configuring and enabling network interfaces...
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!

# Down the interface before munging the config file. This might
# fail if the interface is not actually set up yet so ignore
# errors.
/sbin/ifdown 'eth1'
# Move new config into place
mv -f '/tmp/vagrant-network-entry-eth1-1479905191-0' '/etc/sysconfig/network-scripts/ifcfg-eth1'
# attempt to force network manager to reload configurations
nmcli c reload || true

# Restart network
service network restart


Stdout from the command:

Restarting network (via systemctl):  [FAILED]


Stderr from the command:

Job for network.service failed because the control process exited with error code. See "systemctl status network.service" and "journalctl -xe" for details.
```

# 対応
Vagrant1.8.6にダウングレードしたら直った。。。
ダウングレードは[過去のインストーラ](https://releases.hashicorp.com/vagrant/)を起動するだけで出来ました。

# 参考
[Network Error after upgrade to 1.8.7](https://github.com/mitchellh/vagrant/issues/8024)
nteractでIRuby kernelを動かす

環境: OSX El Capitan 10.11.6

# nteractとは

- ブラウザとJupyter notebookが一体になったもの
- ネイティブアプリとして動作
    - `*.ipynb`をダブルクリックすると、ウィンドウが立ち上がる

![スクリーンショット 2016-11-23 21.29.38.png](https://qiita-image-store.s3.amazonaws.com/0/19349/6fb0a5c7-80e2-1a70-4384-6632f0694194.png "こんな感じ")


Jupyterカーネルがあればなんでも動くとのことなので、この文章ではIRubyを動かして見ようと思います。

# インストールの手順
## nteractのインストール

githubの[Releases](https://github.com/nteract/nteract/releases)からnteractをインストールする。

## IRubyカーネルのインストール

```shell-session
$ gem install iruby rbczmq
$ iruby register --force
```

詳しくはこちら：[Mac で IRuby Notebook 環境を構築する方法 (2016年度版)](http://qiita.com/kozo2/items/7ffc1704a72a28d7e21f)

## IRuby kernelの設定

```shell-session
$ jupyter kernelspec install --user ~/.ipython/kernels/ruby
```

↑ nteractがカーネルを認識するのに必要。

# 使い方

- nteractのメニューから、 File -> New -> Ruby で新しいノートブックが起動
- Finderなどから`*.ipynb`ファイルをダブルクリックで既存のノートブックが起動

# 所感

- IRuby kernelではシンタックスハイライトが動かないので致命的に見づらい
- React.js周りでエラーが出て、既存のIRuby notebookが動かないことがあった

以上のことから、少なくともIRuby使いにとっては、実戦投入はまだ早いと思われます（まだ$\alpha$版だし）。

# 参考

- https://github.com/nteract/nteract
- https://ipython.readthedocs.io/en/latest/install/kernel_install.html
- http://qiita.com/kozo2/items/7ffc1704a72a28d7e21f
API GatewayとLambdaを使ってTwilioからSMSを送ってみる

# twilio
https://jp.twilio.com/


## 事前に
1. twilioアカウント作成する
2. 「PROGRAMMABLE SMS」の電話番号を取得する
3. 「ACCOUNT_SID」「AUTH_TOKEN」「電話番号」をメモる


## twilioのライブラリをインストールするよ

```bash
mkdir lambda_funcs
cd lambda_funcs
pip install twilio -t .
```


## コードを書くよ

```bash
touch sms.py
vi sms.py
```

```py:sms.py
#coding: UTF-8

from twilio.rest import TwilioRestClient

account_sid = '**********************************'
auth_token  = '********************************'
sms_from    = 'twilioで取得した送信電話番号'

def send(event, context):
	client = TwilioRestClient(account_sid, auth_token)
	message = client.messages.create(
		 body = 'Hello World'
		,to = '自分の電話番号'
		,from_ = sms_from
	)
	return message.sid
```

# AWS Identity and Access Management
https://console.aws.amazon.com/iam/home?region=ap-northeast-1

## 「新しいロールの作成」をするよ
### さらに「ポリシーのアタッチ」をするよ
- AWSLambdaFullAccessをアタッチする

# AWS Lambda
https://ap-northeast-1.console.aws.amazon.com/lambda/home?region=ap-northeast-1

## 「Create a Lambda Function」をするよ

はじめに、ディレクトリの中身をZipで圧縮しておく
（Zipファイル名はなんでもいい）

- Name: sms
- Runtime: Python2.7
- Code entry type: Upload a .ZIP file
- Handler: sms.send
- Role: Choose an existing role
- Existing Role: （AWSLambdaFullAccessがアタッチしてあるロール）

## 「Add Triger」をするよ

- API Gatewayを選択

- API name: LambdaMicroservice
- Deployment stage: prod
- Security: Open（とりあえず）

# Amazon API Gateway
https://ap-northeast-1.console.aws.amazon.com/apigateway/home?region=ap-northeast-1

## 「APIをデプロイ」するよ
APIをデプロイすると「URL の呼び出し」が確認できる

# おわり
https://**********.execute-api.ap-northeast-1.amazonaws.com/prod/{作成したLambdaFunction名}

を、コールすると、自分宛てにSMSが届く
引数endを持ったprint関数のあとにtime.sleep()を呼ぶとprintされない

# 問題
0から9までの数字を1秒おきに表示させたい。

```python:count.py
# -*- coding: utf-8 -*-
import time

i = 0
while(i<9):
    print(i, end='')
    time.sleep(1)
    i+=1
```

実行。

```
% python3 count.py

```

...あれ、何も`print`されないし何秒たっても何も起こらない...。


試しに

```python:count.py
# -*- coding: utf-8 -*-
import time

i = 0
while(i<10):
    print(i)
    time.sleep(1)
    i+=1
```

としてみる(引数`end`を消してみる)と、

```
% python3 count.py
0
1
2
3
4
5
6
7
8
9
%
```

1秒おきに表示された。ただ、`end`は指定したい...。

# 解決
引数`flush`を持たせる。

```python:count.py
# -*- coding: utf-8 -*-
import time

i = 0
while(i<10):
    print(i, end='', flush=True)
    time.sleep(1)
    i+=1
```

実行してみると、

```
% python3 count.py
0123456789%
```

うまくいきました。
appengine_config.py で ImportErrorが出る

Google app engineのサンプルプロジェクトとかで、サードパーティ制ライブラリを使うときはこう書くことになっている。

```appengine_config.py

from google.appengine.ext import vendor
vendor.add('lib')
```

なるほどとおもって書くと。こうなるときがある。

```
ImportError: cannot import name vendo
```

パスとかの問題かと思ったんだけど、どうもほんとうにない。
どうやら手元のSDKがバージョンが古いらしくて、この書き方をするようになったのは SDK 1.9.15 あたりからだそうだ。
そうことはもっとわかりやすくしてほしいと思った。
bashで引数を配列処理する

最近bashで引数を持たせるときに
\$1,$2を使って変数に引数を入れるのがめんどくさいのとコードが煩雑になるので、
配列が使えないかと思って調べたらdeclareコマンドで変数宣言ができることを知りました。

実際にbashで引数の値を配列を入れるときは以下のようにしています。

```bash:Array.sh
declare -a array
for a in $@;do
    array=("${array[@]}" $a)
done
```

皆さんもぜひ使ってみてください。
tmuxのステータス上に天気予報をWebAPIにやさしく表示する

tmuxのステータス上に天気予報を小さく表示してみました。
tmuxのステータスインターバルは60秒でAPIに取得制限の項目は見当たりませんでしたが、
１時間に4回程度の取得で済むようにWebAPIにやさしく工夫してみました。
他の定期実行にも使えると思います。

環境: Centos6,7, jq インストール済み

#こんな感じ
![abc.png](https://qiita-image-store.s3.amazonaws.com/0/104300/2df0e164-cea1-3cdc-3499-2415c17832aa.png)


#まずは取得部分
天気情報取得のAPIを利用して、作り方は以下を参照してメッセージを "曇り" とかだけにした。

- [jqを使って今日の天気を取得](http://qiita.com/takaya1992/items/94b86d6b8237a638fa16)

IDは以下から調べる
https://raw.githubusercontent.com/kazeburo/WebService-Livedoor-Weather/master/t/data/primary_area.xml

```Bash
#270000は大阪
ABC=$(curl -s http://weather.livedoor.com/forecast/webservice/json/v1\?city\=270000 | jq -r '.forecasts[0].telop');
```

#WebAPIにやさしく対応したもの
環境変数に保存して再取得時間まで使いまわすようにします。
ステータスのインターバルが長いとタイミングによって取り損ねるので、
取り逃さないように4で割った分の取得余裕を取りました。
!ステータスインターバルが倍の人は、倍にして余裕を狭めてください。

```Bash
#!/bin/bash

if [ -z $(echo $ABC)  ];#一回で書けるんだろうなぁ。
then
        ABC=$(curl -s http://weather.livedoor.com/forecast/webservice/json/v1\?city\=270000 | jq -r '.forecasts[0].telop');
        export ABC
fi
if [ $(expr $(date +'%M') / 4) == '0'  ]; 
then
        ABC=$(curl -s http://weather.livedoor.com/forecast/webservice/json/v1\?city\=270000 | jq -r '.forecasts[0].telop');
        export ABC
fi
echo $ABC
```

.tmux.confに追加する。

```
set -g status-right ''\
'#(source $HOME/weather.sh)'\
```

～スクリプトは、動作、WebAPI の制限について確認した上で利用してください～。
VisualStudioCodeによるNim開発環境

# 概要

こちらの[記事](http://qiita.com/kmry2045/items/b61a000ff257c01720e4)に触発されて、VSCodeによるNimの開発環境構築についてのメモとなります。
環境はLinux(fedora24)で行っています。

## 作業の流れ

* VSCodeの起動
* 拡張機能のインストール
* ワークスペースの設定
* タスクの設定
* ビルド＆実行
* 自動保存によるビルド＆実行

### VSCodeの起動

この時点で、nimコマンドへのパスが通っていることを確認してください。
Nimの開発を行いたいフォルダを作成し、VSCodeを起動します。

```
$ mkdir nim-work
$ code nim-work
```

### 拡張機能のインストール

VSCode上の、拡張機能インストール(ctrl+shift+x)を表示し、”nim”で検索を行うと、"Nim 0.5.12"という拡張機能が表示されるので、"インストール"を選択します。約1分ほどでインストールが完了します。

### ワークスペースの設定

VSCodeを起動したときに指定したフォルダが、ワークスペースとなります。
メニューから、”ファイル／基本設定／ワークスペース設定”を選択します。
すると、ワークスペースのフォルダ配下に、.vscodeというフォルダが作成され、エディタには2ペイン表示でファイルが表示されます。

* 左側に"規定の設定"が表示されたテキスト
* 右側に.vscodeに作成された"setting.json"

左側の"規定の設定"に、”// Nim configuration”とコメントされたブロックがありますのでこれをコピーし、settings.jsonにペーストします。

```..vscode/settings.json
// 既定の設定とユーザー設定を上書きするには、このファイル内に設定を挿入します
{
    // Nim project file, if empty use current selected.
    "nim.project": [],

    // Optional test project.
    "nim.test-project": "",

    // Execute build task from tasks.json file on save.
    "nim.buildOnSave": true,

    // Nim build command (c, cpp, doc, etc)
    "nim.buildCommand": "c",

    // Check code by using 'nim check' on save.
    "nim.lintOnSave": true,

    // Enable verbose logging of nimsuggest to use profile directory.
    "nim.logNimsuggest": false
}
```

nim.buildOnSaveをtrueに設定しています。

### タスクの設定

NIMファイルのコンパイルを呼び出す設定を行います。
.vscodeフォルダに、以下の内容でtasks.jsonファイルを作成します。

```..vscode/tasks.json
{
    // なんのバージョンかちょっと不明
    "version": "0.1.0",
    // nimコマンドへのパスを指定します
    "command": "nim",
    // コンパイル時の引数を指定します。編集中のファイルパスを指定するには$｛file｝を指定します
    "args": [
        "c",
        "-r",
        "${file}"
    ],
    "options": {
        "cwd": "${workspaceRoot}"
    },
    "isShellCommand": true
}
```

### ビルド＆実行
nimファイルを作成＆編集し、Ctrl+Shift+Bでビルド＆実行し、結果がVSCode内のターミナルに表示されます。

### 自動保存によるビルド＆実行

若干うざく感じる時もありますが、NIMファイルをある程度編集したところで自動保存し、ついでにビルド＆実行してくれる機能があります。この機能を有効にするには、2箇所の設定が必要です。

* .vscode/settings.json の nim.buildOnSave を *true* に設定する
* "ファイル／自動保存" メニューにチェックを入れる

## まとめ

Nimを手軽に実験できる環境がVSCodeでも実現できました。

ステップ実行したいという方は、kdevelopがおすすめです。
ご参考 → http://qiita.com/6in/items/379bc1ba18241ddf5404
React でユーザーの権限や役割によって Component を見せたり見せなかったりする

見なくても良いけど「強さ」とか `this.state.userStrength` をどこから取ってくるかとかは[react-router でアクセス制御 - Qiita](http://qiita.com/gin0606/items/4feee28eb2a394493f8d) の続き。

まず、ユーザーの強さを子 Component から見られるようにする。

`App` はアプリケーションの大本の Component 。

```js:App.js
export default class App extends React.Component {
  static propTypes = {
    children: React.PropTypes.node,
  };
  static childContextTypes = {
    userStrength: React.PropTypes.string,
  }

  constructor(...args) {
    super(...args);

    this.state = {
      userStrength: 'tsuyoi',
    };
  }

  getChildContext() {
    return {
      userStrength: this.state.userStrength,
    };
  }

  render() {
    return this.props.children;
  }
}
```

`childContextTypes` と `getChildContext` を書く。

子 Component には `contextTypes` で親 Component で書いたやつを指定すると `this.context.userStrength` にアクセスできるようになる。
書かないとアクセスできない。

```js:Authorization.js
export default class Authorization extends React.Component {
  static propTypes = {
    tsuyosa: React.PropTypes.arrayOf(React.PropTypes.string).isRequired,
    children: React.PropTypes.node,
  }

  static contextTypes = {
    userStrength: React.PropTypes.string,
  }

  render() {
    if (this.props.tsuyosa && !this.props.tsuyosa.includes(this.context.userStrength)) {
      return null;
    }
    if (React.isValidElement(this.props.children)) { return this.props.children; }
    return <span>{this.props.children}</span>;
  }
}
```

以下のように使う。

```Page.js
export default class Page extends React.Component {
  render() {
    return (
      <ul>
        <li>誰でも見られる <Authorization tsuyosa={['hutsuu']}>と思いきや中級者以上が見られる</Authorization> 文字列</li>
        <Authorization tsuyosa={['tsuyoi']}>
          <li>上級者 以上が見られる文字列</li>
        </Authorization>
        <Authorization tsuyosa={['tsuyoi', 'hutsuu']}>
          <li>中級者 以上が見られる文字列</li>
        </Authorization>
        <Authorization tsuyosa={['tsuyoi', 'hutsuu', 'yowai']}>
          <li>初級者 以上が見られる文字列</li>
        </Authorization>
      </ul>
    );
  }
}
```

以上。

微妙ポイントとしては、 `number`, `string`, `array` が来ると `<span>` で囲まないと表示できなくなる。
`<span>` で囲まなくても良くなる方法あったら教えて欲しい🙏
アプリ用のランディングページを新しいgoogleサイトで作ってみる

# 概要
新しいGoogleサイトでAndroidアプリ用のランディングページを作ってみました。
サクッと簡単にできたので、そのやり方の紹介です。

# 完成イメージ
このようなページがGoogleアカウントがあれば無料で簡単にできます。
[完成例](https://sites.google.com/view/samplehogehoge)

# Googleサイトとは
ウェブサイトを無料で簡単に作ることができるGoogleのサービスです。
今までは正直パッとしないデザインなイメージでしたが、新しくなったようです。
この動画を見るとよくわかります。(1分程度)
[![youtubelink](http://img.youtube.com/vi/hG-vGjKMvZE/0.jpg)](http://www.youtube.com/watch?v=hG-vGjKMvZE)

従来のGoogleサイトへのURL
 http://sites.google.com
新しいGoogleサイトへのURL
  http://sites.google.com/new

# 作り方
おそらくあまり迷うことなく、直感的に作ることができると思います。

# URLについて
作ったURLは
https://sites.google.com/view/ + ユニークな文字列
を設定することで公開することができます。

とりあえず自分用の文字列で作っておくのもいいかもしれません。

# Google Play Storeへのリンク用バッジについて
このページを参考にしました。
[Google Play badge page](https://play.google.com/intl/en_us/badges/?hl=ja)
HTMLタグは入れられなそう？だったので、
画像をDLしてきてリンクを追加しました。

# その他
* 各種Googleのサービスはメニューから埋め込むことができます。
* Google AnalyticsのIDも追加することができるので分析もできそうです。
* 複数のページも作ることができそうです。
* faviconは変えられなそう？従来のGoogleサイトではできそうでしたのでそのうちできるようになるのでしょうか。

とりあえず簡単です:)
Railsで特定フィールドのみバリデーションしたい

Ruby on Rails で特定のフィールドのみバリデーションしたかったのですが、なかなかやりかたが見つからず、やっとできたので、メモ

私が使用している Rails のバージョンは、5です。

# 情報元
[【Rails】一部のフィールドのみvalidを実行する – @masuidrive blog](http://blog.masuidrive.jp/2008/02/23/rails_valid_columns/)
にて、一応やり方が書いてあるものの、情報が古く、また使い方がそれだけだと分からなかったので、時間がかかりましたが、勉強になりました。 Rails 使い始めて2ヶ月の身にはなかなか大変でした。


# やり方

## 1. moduleを作成
Rails/app/models/concerns以下に、下記の内容のファイルを保存（例として、valid_columns.rbという名前で保存）

```rb:valid_columns.rb
class ActiveRecord::Errors
  # 指定したカラムのエラーを削除
  def delete(column)
    @errors.delete(column.to_s)
  end
end

module ActiveRecord::Validations
  # 指定したカラムのみをvalid?
  def valid_columns?(*columns)
    valid?
    cols = columns.flatten.collect(&:to_s)
    errors.keys.each do |k|
      errors.delete(k) unless cols.include?(k.to_s)
    end
    errors.empty?
  end
end
```


## 2. 使いたいモデルで読み込み
例として、userモデルなら

```rb:user.rb
require 'valid_columns' #上記のファイル名と合わせる必要
# (以下、略)
```

## 3. 使う
※すでに WEBrick (組み込みサーバー)が起動している場合には、再起動しないと読み込んでくれないかも

例として、userモデルで、passwordフィールドだけバリデートしたい場合には、

```rb:なんかのコントローラとか.rb
@user.new
@user.valid_columns?(:password)
```

例として、userモデルで、nameフィールドとpasswordフィールドだけバリデートしたい場合には、

```rb:なんかのコントローラとか.rb
@user.new
@user.valid_columns?(:name, :password)
```
UIPasteboard.generalPasteboard()

Pasteboardで色々実験してて詰まった。

どのアプリからでも共通で使えるgeneralPasteboardの中身を使おうとしていて
UIPasteboard.generalPasteboard().hasStrings
の値をチェックしてtrueの時に何かしら処理をしたい。

ただ、シミュレータだと、アプリ上でもバックグラウンドでも、
UIPasteboard.generalPasteboard().hasStringsがtrueの場合は、UIPasteboard.generalPasteboard().stringで文字列取得できるのに、
実機でテストしてみると、バックグラウンドで実行した時、UIPasteboard.generalPasteboard().hasStringsがtrueなのに.stringでnilが返ってきてしまう。



何が問題なのか結構調べてみたがわからず。(developper forum見てたら仕様っぽい感じだけど、正確なところわからない)

1. セキュリティ的な仕様
2. バックグラウンド実行の時には何か別のところから取得しなければいけない
3. 実機で想定した値を取得するには何かしらの設定が必要

どなたか知っていたらご教示くださいmm
Tensorflowを使ってROS上でMNISTをやるノードを立てる

勤労感謝の日を利用して, 初めてQiitaに投稿します. よろしくお願いします.
#要約
* Tensorflowの学習済みMNISTが動くROSのノードを作った. 
* スクリプトを[GitHub](https://github.com/shunchan0677/Tensorflow_in_ROS)にあげた. 

#背景
ROSというロボット開発環境がある. （[ROS公式サイト](http://wiki.ros.org/ja)）
ROSではカメラ等センサからのデータを統合的に処理し, ロボットを動かしたりシミュレーションしたりすることができる. 

**ここにDeepLearningを組み込みたい！！**

#やったこと
まずやるならチュートリアルでしょ！ということで[Tensorflow](https://www.tensorflow.org/)の[Deep MNIST for Experts](https://www.tensorflow.org/versions/r0.10/tutorials/mnist/pros/index.html)の学習済みモデルをROS上で動くようにした. 

以前に[物体認識をする学習済みのTensorflowのモデルをROS上で動かしている方](http://ros-robot.blogspot.jp/2016/06/rostensorflow-ros_30.html)がいたので, それを参考にして, モデルを見える化した.

モデルを陽に書くことで他のタスクにも応用しやすいスクリプトになったと思う.
（ネットワーク構成も変えられるし, 先に学習しておけば動かせる. ） 


#処理手順
では実際に何をするスクリプトを書いたのかというと, 以下のようになる.

1. CNNを構成して学習済みファイルの読み出し
2. カメラノードから画像情報をSubscribe 
3. 画像情報をMNISTのCNNに入るよう, 28*28に圧縮＆白黒反転2値化
4. CNNに画像を見せて数字を推定
5. 結果をPublish

[ROSのノードの説明](http://wiki.ros.org/ja/ROS/Tutorials/UnderstandingNodes)
[PublisherとSubscriberの説明](http://wiki.ros.org/ja/ROS/Tutorials/WritingPublisherSubscriber(python))

#コード解説
[別の記事](http://qiita.com/shunchan0677/items/60f8f567359fbbbf9321)に書いた

#動かし方
[GitHubのREADME.md](https://github.com/shunchan0677/Tensorflow_in_ROS/blob/master/README.md)にあるように
`$ roscore`  
`$ python tensorflow_in_ros_mnist.py image:=/cv_camera/image_raw`  
`$ rosrun cv_camera cv_camera_node`  
`$ rostopic echo /result`  

をする. TensorflowやROS, cv_bridge, カメラのドライバ, OpenCV, numpyは事前準備が必要. 実行する順番を間違えたりするとエラーが出るが動くので気にしない. 

#結果
パソコンにペイントで画像を表示してそれにカメラを向けると下図のようになった. 
右の画像がカメラから入ってきた画像で左のdata:がCNNが予想してPublishされた数字. ちゃんと正解している. 
![Screenshot from 2016-11-23 15_41_51.png](https://qiita-image-store.s3.amazonaws.com/0/134368/ba9463c6-1009-9226-7fe9-1d0cd265610d.png)

手書きの9に関してもちゃんと認識された.

![Screenshot from 2016-11-23 15_44_07.png](https://qiita-image-store.s3.amazonaws.com/0/134368/01ba808c-2867-5008-773d-85fd11464ea9.png)


ただし, カメラの性質などにより認識精度は結構上下する.
カメラと画像との距離を工夫したり, CNNに入れる前にnumpy使ってトリミングしたり, 2値化の数値をいじったりするといい. 

#あとがき
**とりあえずちゃんと動いたので良かった！！** 
GitHubにもQiitaにも初投稿で緊張した.　
特にGitHubのライセンスがどうとかを調べて, 理解するのに結構戸惑った.
結果, [このサイト](http://www.catch.jp/oss-license/2013/09/27/mit_license/)を参考にAphache2.0ライセンスを入れておいた. これであっているのか. 
コードも結構ぐちゃぐちゃだし, コメントもつけてないし, もっとがんばらないとなと思った.

**勤労感謝の日に圧倒的感謝！！**

#本文中に載せられなかった参考資料:
* [Markdown記法チートシート](http://qiita.com/Qiita/items/c686397e4a0f4f11683d)
* [Githubで後からライセンスを追加する方法](http://akiza-cb.hatenablog.com/entry/2016/01/18/215156)
* [今さら聞けない！GitHubの使い方【超初心者向け】](https://techacademy.jp/magazine/6235)
* [MNIST For ML Beginners](https://www.tensorflow.org/versions/master/tutorials/mnist/beginners/index.html)
* [[TF]Tensorflowの学習パラメータの保存と読み込み方法](http://qiita.com/supersaiakujin/items/fc400fc6fa58b3809619)
GR-CITRUSとWA-MIKANでhttpGetのレスポンスをSDカードに保存する、を試す

- GR-CITRUSというmrubyが動くマイコンボードが面白そうなので買って試してみました。
    - ![http://gadget.renesas.com/ja/product/com_sp_milkcocoa.htmlより転載](http://gadget.renesas.com/ja/product/images/pc/citrus_mikan.png)
    - http://gadget.renesas.com/ja/product/citrus.html

- セットアップは下記参照
    - GR-CITRUS 特設 Rubicではじめよう!(Ruby編) http://gadget.renesas.com/ja/product/citrus_sp1.html

- httpGetのレスポンスをSDカードに保存するメソッド(WiFi.httpGetSD)は最新のファームウエアでないと使えないので、下記を参照して更新する
    - GR-CITRUS IoTワークショップ 進行(2016/11/19)　http://japan.renesasrulz.com/gr_user_forum_japanese/b/weblog/archive/2016/11/19/gr-citrus-iot-2016-11-19.aspx

- GR-CITRUS専用のクラスやメソッドがあるので下記を見ながらいろいろ試してみる
    - GR-CITRUS 特設 クラス、メソッド早見表 http://gadget.renesas.com/ja/product/citrus_sp1z.html

- とりあえずhttpGetのレスポンスをSDカードに保存して、それを読み出してコンソールに表示、を書いてみた

```ruby
#!mruby
@usb = Serial.new 0
# デバッグ用のpメソッド
def p obj
    @usb.print obj.to_s
end

System.useSD
System.useWiFi

# Station(子機)モードにする
WiFi.setMode 1
WiFi.connect "ssid", "password"
p WiFi.ipconfig
# 複数接続可能モードの設定	mode: 0:1接続のみ, 1:4接続まで可能 らしいがよくわかりません…
WiFi.multiConnect 1
WiFi.httpGetSD "response.txt", "google.com"
WiFi.disconnect

# ファイル番号0としてresponse.txtをReadモード(0)で開く
SD.open 0, "response.txt", 0
# readの引数はファイル番号ファイル番号、返り値はデータ(バイト)、ファイルの最後なら-1
while (c = SD.read(0)) > 0
    p c.chr
end
SD.close 0
```

![httpGetSD.png](https://qiita-image-store.s3.amazonaws.com/0/61713/2ddb73de-e9e3-a465-a5f2-ed386bc42ab5.png)

無事にhttpGetのレスポンスがSDカードに保存されたのを確認できました

- メモ
    - 成功した後にファイル名を変えて再実行するとWiFi.httpGetSDが7を返して(7: 受信したファイルの生成に失敗した)、新しくファイルが作成されない。なぜ…
ADDA > D() and Dz() @ debug.h

```txt:My_Environment
Ubuntu 14.04 LTS Japanese Remix
on VMWare Fusion v8.5.2 (4635224)
on OS X El Captian v10.11.4

GNU bash, version 4.3.11(1)-release

gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4 
(also for g++)
ADDA v.1.3b6
```

This article is related to [ADDA (light scattering simulator based on the discrete dipole approximation)](https://github.com/adda-team/adda/).

There are macros such as `D("Starting open CL init");` and `Dz()`.
They are defined at `debug.h`

```debug.h
#	define D(...) DebugPrintf(ALL_POS,__VA_ARGS__)
#	define Dz(...) DebugPrintf(ONE_POS,__VA_ARGS__)
```
【UnityEditor】EditorGUILayout.TextArea入力時にESCキーを押すと入力内容が消えてしまう問題の解決

#はじめに
EditorGUILayout.TextAreaでテキストを入力している時にESCキーを押すと入力内容が消えてしまいます。
<img width = 200 src = "https://qiita-image-store.s3.amazonaws.com/0/44288/eae670ae-0693-9780-296e-a7d290162bc0.gif">

ESCキー押下時に**入力内容を確定させる**にはどうすればいいのか調べてみました。

Unityのバージョンは**5.5.0b7**です

#GUI.FocusControlを使う
ESCキーが押されたとき、```GUI.FocusControl("")```を呼んでGUIのフォーカスを外してやると入力内容が消えずに済むみたいです。

#検証用ソースコード
```TestEditorWindow.cs
using UnityEngine;
using UnityEditor;

public class TestEditorWindow : EditorWindow 
{
	private string text = "";

	[MenuItem("Test/TestEditorWindow")]
	static void Open()
	{
		GetWindow<TestEditorWindow>();
	}	

	void OnGUI()
	{
		if (Event.current.keyCode == KeyCode.Escape) { GUI.FocusControl(""); }
		this.text = EditorGUILayout.TextArea(this.text);
	}
}
```

上記スクリプトをEditorフォルダに入れてください。

#検証
TextAreaにテキストを入力して、そのままESCキーを入力してみます。

```GUI.FocusControl("")``` を呼ばない場合
<img width = 256 src = "https://qiita-image-store.s3.amazonaws.com/0/44288/eae670ae-0693-9780-296e-a7d290162bc0.gif">
ESCキーを押すと入力内容が消えてしまいます。

```GUI.FocusControl("")``` を呼んだ場合
<img width = 256 src = "https://qiita-image-store.s3.amazonaws.com/0/44288/f1482a6b-c526-e1b2-36de-8c6f1257fade.gif">
ESCキーを押しても**入力内容が消えなくなりました**(完)

#参考URL
GUIのフォーカスを外す - けいごのなんとか
http://anchan828.hatenablog.jp/entry/2013/10/10/161401
短時間でtmuxを実践したときのメモ

tmuxを実践導入してみました。
いままでputtyで数十枚開いていたけれども、閉じるのがわずらわしいので、tmuxにしたときのメモ。
環境:centos6,7

#tmuxの導入

```Bash
sudo yum install tmux
```

tmuxかtmux a(デタッチからの復帰)で起動できる。

.tmux.conf は以下を参照してコピー機能をコメントアウトした。

http://qiita.com/succi0303/items/cb396704493476373edf

ただ、色が出なかったのでbashrcに追加した。

```Bash
echo "export TERM=xterm-256color" >> .bashrc
```

#tmuxを操作する、最低限の7つのコマンド
ウインドウの操作とかたくさんあるけど、代替ができるので必要最低限のコマンドとしました。
(Ctrl + aや縦分割はカスタムで、tmuxデフォルト設定と異なっています。)

- ウインドウの分割 
  - Ctrl+a のあと、 | (縦分割)
  - Ctrl+a のあと、 - (横分割)
- ウインドウの移動
 - Ctrl + a のあと、Ctrl+ H,Lのどちらかでvim風移動
- ペインの移動
 - Ctrl + a のあと、hjklのどれかでvim風移動 
- ペインを閉じる
  - Ctrl + a のあと、x
- ペインのリサイズ
  - Ctrl + a のあと、H,Lのどちらかでvim風操作
- ペインをウインドウ化させる
  - Ctrl + a のあと、!
- デタッチ
  - Ctrl + a のあと、 d

ウインドウの閉じ方はいらないの？
最後のpainを閉じるとウインドウも閉じるので、特に閉じるコマンドは覚えなかった。

ウインドウの開き方はいらないの？
ウインドウ分割した後に、ペインをウインドウ化できるので覚えなかった。

マウス触らなくていいことに気づいて、楽々。
Unityでfastlane androidのビルド対応する

# 手順

## fastlaneのinstall

Gemfileを作成

```rb:Gemfile
source 'https://rubygems.org'

ruby '2.3.3'
gem 'fastlane'
```

bundler をinstall

```shell-session
$ gem install bundler
```

fastlaneをinstall

```shell-session
$ bundle install
```

## fastlane の設定

```shell-session
$ bundle exec fastlane
... いろいろ答える
```

下記ファイルが出来る

- fastlane/Appfile
- fastlane/Fastfile

## fastlaneにbuild laneを追加

unityでビルドを叩くレーンを記述

```rb:fastlane/Fastfile
platform :android
# 中略...
  desc "Build application"
  lane :build do
    CMD         = '/Applications/Unity/Unity.app/Contents/MacOS/Unity'
    LOGFILE     = '/tmp/unity.log'
    PROJECT_DIR = File.expand_path('..', Dir.pwd)

    begin
      sh "#{CMD} -quit -batchmode -buildTarget android -logfile #{LOGFILE} -executeMethod App.Builder.ExportAndroid -projectPath #{PROJECT_DIR}"
    rescue
      sh "cat #{LOGFILE}"
      raise 'Unity biuld failed'
    end
  end
# ...
end
```

## Unityのbuildスクリプトを記述する

build laneから叩くビルドスクリプトを記述する.
keystoreなどの設定は適宜おこなう。

```csharp:Assets/Editor/Builder.cs
using System.IO;
using System.Linq;
using System.Text;
using UnityEditor;
using UnityEngine;

namespace App
{
    public class Builder : MonoBehaviour
    {
        public static void ExportAndroid()
        {
            // KeyStore設定
            PlayerSettings.Android.keystoreName = "FIXME";
            PlayerSettings.Android.keystorePass = "FIXME";
            PlayerSettings.Android.keyaliasName = "FIXME";
            PlayerSettings.Android.keyaliasPass = "FIXME";

            // オプション設定
            EditorUserBuildSettings.exportAsGoogleAndroidProject = false;
            BuildOptions options = BuildOptions.Development;

            // 出力先
            var apkPath = string.Format("{0}-{1}.apk", PlayerSettings.bundleIdentifier, Application.version);

            Export(apkPath, BuildTarget.Android, options);
        }

        private static void Export(string path, BuildTarget target, BuildOptions options)
        {
            var error = BuildPipeline.BuildPlayer(GetAllScenes(), path, target, options);

            if (string.IsNullOrEmpty(error))
            {
                Debug.Log("Build Success");
            }
            else
            {
                Debug.Log("Build Failure: " + error);
                throw new Exception("Unity pipeline build failure: " + error);
            }
        }

        private static string[] GetAllScenes()
        {
            return EditorBuildSettings.scenes.Select(it => it.path).ToArray();
        }

        private static string ReadAll(string path)
        {
            FileInfo fileInfo = new FileInfo(path);
            using (StreamReader reader = new StreamReader(fileInfo.OpenRead(), Encoding.UTF8))
            {
                return reader.ReadToEnd();
            }
        }
    }
}
```

# 実行


```shell-session
$ bundle exec fastlane android build
```

これで `<package_name>-<version>.apk` が生成されているはず！
Route53とCloudFrontとS3で静的コンテンツをホスティングするメモ

# 事前に
https://aws.amazon.com/jp/
AWSのアカウントを作成しておく

# Amazon Simple Storage Service
https://console.aws.amazon.com/s3/home?region=ap-northeast-1

## S3で「バケットを作成」するよ

- バケット名: ＊＊＊＊（Route53でドメイン取るからS3バケットはなんでもいい）
- リージョン: Tokyo

ちなみに、アメリカのバージニアは、リージョン「us-east-1」で、東京はリージョン「ap-northeast-1」。
以前、東京は「northeast-1」と思い込んでいて、あれ～？つながらないなぁ、となってしまった。
「アジアパシフィック (東京)」なので「ap-」が付く。

## 静的ウェブサイトホスティングで「ウェブサイトのホスティングを有効」にするよ
- インデックスドキュメント: index.html（なんでもいい）
- エラードキュメント: error.html（なんでもいい）

「{バケット名}.s3-website-ap-northeast-1.amazonaws.com」という感じのエンドポイントができるのでメモる
![0001.png](https://qiita-image-store.s3.amazonaws.com/0/121091/10f455f6-d597-d068-ef5e-139ff2f4d16c.png)


# Amazon CloudFront
https://console.aws.amazon.com/cloudfront/home?region=ap-northeast-1

## Webを「Create Distribution」するよ
- Origin Domain Name: （さっきメモったエンドポイント）

とりあえず、作成する
![0002.png](https://qiita-image-store.s3.amazonaws.com/0/121091/213a762a-bf84-914b-5312-727b2fc52402.png)


作成すると、CloudFrontのOrigin Domain Nameが割り当てられるのでメモる
![0003.png](https://qiita-image-store.s3.amazonaws.com/0/121091/7e909e3a-f671-bde0-e149-0a648b7aa72a.png)


# Amazon Route 53
https://console.aws.amazon.com/route53/home?region=ap-northeast-1

## Public Hosted Zoneを「Create Hosted Zone」するよ

- Domain Name: ＊＊＊＊（よく考えよう）
- Type: Public Hosted Zone

## CNAMEレコードを「Create Recode Set」するよ

- Type: CNAME
- Value: （さっきメモったOrigin Domain Name）

![0004.png](https://qiita-image-store.s3.amazonaws.com/0/121091/e8aebc24-6a2b-537d-b410-d7a66d47ae7b.png)


# Amazon CloudFront

## CloudFrontの設定を変更するよ

- Alternate Domain Names: （自分で取ったDomain Name）


# おわり
これで時間が経てば、S3に置いた静的コンテンツがRoute53で取ったドメインで参照できるはず。
ADDA > iterative.c > PHASE_VARS / PHASE_INIT / PHASE_ITER 

```txt:My_Environment
Ubuntu 14.04 LTS Japanese Remix
on VMWare Fusion v8.5.2 (4635224)
on OS X El Captian v10.11.4

GNU bash, version 4.3.11(1)-release

gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4 
(also for g++)
ADDA v.1.3b6
```

This article is related to [ADDA (light scattering simulator based on the discrete dipole approximation)](https://github.com/adda-team/adda/).

In `iterative.c`, there are definitions of PHASE_XXX.

```iterative.c
enum phase {
	PHASE_VARS, // Initialization of variables, and linking them to scalars and vectors
	PHASE_INIT, // Initialization of iterations
	PHASE_ITER  // Each iteration
};
```

The `enum phase` is used as parameter of function pointer void (*func) as:

```iterative.c
struct iter_params_struct {
	enum iter meth;   // identifier
	int mc;           // maximum allowed number of iterations without residual decrease
	int sc_N;         // number of additional scalars to describe the state
	int vec_N;        // number of additional vectors to describe the state
	void (*func)(const enum phase); // pointer to implementation of the iterative solver
};
```

The phase is given, for example

```iterative.c
int IterativeSolver(const enum iter method_in,const enum incpol which)
{
    ...
    (*params[ind_m].func)(PHASE_VARS);
    ...
    (*params[ind_m].func)(PHASE_INIT);
    ...
         (*params[ind_m].func)(PHASE_ITER);
```
UE4よちよち勉強会_Shader勉強のまとめ(Material Editor Palette研究_AtmosphereとColor)

## Atmosphere Expressions
[リファレンス](https://docs.unrealengine.com/latest/INT/Engine/Rendering/Materials/ExpressionReference/Atmosphere/)

![initeal_state.PNG](https://qiita-image-store.s3.amazonaws.com/0/102634/d16bd6da-165c-f5a8-c0ba-7cb3eb8cc085.png)

![state0_atomsphereForColor.PNG](https://qiita-image-store.s3.amazonaws.com/0/102634/a66255af-ce00-6c51-9f34-80eb3701afa6.png)

![state1_multiply.PNG](https://qiita-image-store.s3.amazonaws.com/0/102634/863025da-5b00-77d1-96e5-18ed9d738668.png)

![state2_Sbtract_Constant.PNG](https://qiita-image-store.s3.amazonaws.com/0/102634/d071ddef-b84d-7d56-4532-2ec4d96d786e.png)

![state3_WorldPosition_cameraPosition.PNG](https://qiita-image-store.s3.amazonaws.com/0/102634/97e1d031-a9fe-110d-0adf-10b26f04fc14.png)

<em>AbsoluteWorldPostion</em>は<b>WorldPosition</b>で検索すれば出てくる.
![state4_LevelSetting.PNG](https://qiita-image-store.s3.amazonaws.com/0/102634/243a67b9-bd51-de98-9ddc-e1e54875c510.png)

カメラの位置で、物体の色が変化する(Fogが変化)

## Color

[リファレンス](https://docs.unrealengine.com/latest/INT/Engine/Rendering/Materials/ExpressionReference/Color/index.html)

![initealstate.PNG](https://qiita-image-store.s3.amazonaws.com/0/102634/dcb4b7ac-c6e6-3f43-3d85-ead30b1799a9.png)

![state0_TextureSmaple_constent_desaturation.PNG](https://qiita-image-store.s3.amazonaws.com/0/102634/05bfcffc-5177-58ce-80da-bc069bf8823e.png)
SQLiteからCSVファイルへ書き出す方法

## 導入
Rの課題でCSVファイルを扱うため、データベースからCSVファイルを作る必要があった。
Railsで使っていたDBの形式はSQLite3だったため、そこからCSVへ書き出す方法を調べた。備忘のためを兼ねてまとめる。

## 本題
まずsqlite3を起動する
`$ rails db`

次に、書き出したいファイル名を考えて（ここではoutput.csvとした）、以下のコマンドを打つ。

```
 sqlite>　.headers on
 sqlite>　.mode csv
 sqlite>　.output output.csv
 sqlite>　SELECT * FROM customers;
 sqlite>　.quit
```

これだけでcsvファイルに書き出せているはずだ。

参考
http://www.sqlitetutorial.net/sqlite-export-csv/
UE4よちよち勉強会_Shader勉強のまとめ(Material Editor編)

第八回UE4よちよち勉強会の個人のまとめ書きます。

# 独りUE4Shader研究

<h1> 唐突だが、Shader書きたい！ </h1>

### ということで僕は、UE4yochiで、UE4のshaderの研究をします。

今までの、資料は後々アップするにして…

本日から、Material Editorを本格的に勉強し始めたので、個人まとめて書いていきます。

## 参考資料
[Material Expression Reference](https://docs.unrealengine.com/latest/INT/Engine/Rendering/Materials/ExpressionReference/index.html)

## これからやること
まず、Material EditorのPaletteの要素を一要素づつ勉強していこうと思っています。

## MaterialEditorのPaletteの一覧(UE4.14.0)

|En|Ja|
|:-------------------------|:-----------|
| Atmosphere               | 雰囲気 |
| Blends                   | ブレンド |
| Color                    | 色 |
| Constants                | 定数 |
| Coordinates              | 座標 |
| Cubemaps                 | キューブマップ |
| Custom                   | カスタム |
| Debug                    | デバッグ |
| Foliage                  | 葉 |
| Font                     | フォント |
| Functions                | 機能 |
| Get Post Precess Setting | ポスト・プリセス設定を取得する |
| Gradient                 | 勾配 |
| Image Adjustment         | 画像調整 |
| Landscape                | 風景 |
| Lighting                 | 照明 |
| Material Attributes      | マテリアルアトリビュート |
| Material Layer Blend     | マテリアルレイヤブレンド |
| Math                     | 数学 |
| MAXScripts               | MAXScripts |
| Misc                     | その他 |
| Opacity                  | 不透明度 |
| Parameters               | パラメーター |
| Particles                | パーティクル |
| Procedurals              | 手続き |
| Reflecctions             | リフレクション |
| Shading                  | シェーディング |
| Speed Tree               | スピードツリー |
| Texture                  | テクスチャ |
| Texturing                | テクスチャリング |
| Uncategorized            | 未分類 |
| Utils                    | Utils |
| Vector Ops               | ベクトル操作 |
| Vectors                  | ベクトル |
| VFX                      | VFX |
| World Postion Offset     | 世界の位置オフセット |

次の記事から、掘り下げ行こうと思います。
Android TVアプリをAmazon Fire TVに対応してみる

# 概要

[Android TV](https://www.android.com/intl/ja_jp/tv/)(Leanback)アプリを[Amazon Fire TV](https://www.amazon.co.jp/Amazon-DV83YW-Fire-TV/dp/B00UH6MXT8)（以下、Fire TV）に対応する方法について記載します。
Fire TVはAndroidベースのOSのうえ、Android TV用のライブラリである[Leanback Support Library](https://developer.android.com/topic/libraries/support-library/features.html?hl=ja#v17-leanback)もサポートしているため、簡単な手直しでFire TVに対応することができます。

# Fire TVへのadbの接続方法

Fire TVおよびFire TV Stickへは、Androidでネットワーク越しにadbの接続するのと同じ手順で接続できます。

## Macの場合

### 手順1. Fire TVの設定

1. Fire TVのトップから[設定] → [システム] → [開発者オプション] → [ADBデバッグ] をオンにする。
2. 同様に [不明のソースからのアプリ] をオンにする。
3. [設定] → [システム] → [バージョン情報] → [ネットワーク] でIPアドレスを確認する。

### 手順2. adbの接続

```
adb kill-server
adb start-server
adb connect <FireTVのIPアドレス>
```

接続が確立したらいつも通りにadbの操作やAndroid Studioからのインストールができます。

なお、Fire TVの場合はUSB-A to USB-AケーブルでPCとFire TVを接続することもできるようです(未確認)。

## Windowsの場合

最初にドライバのインストールが必要なようです。
詳しくは[こちらを参照ください](https://developer.amazon.com/public/solutions/devices/fire-tv/docs/connecting-adb-to-fire-tv-device)。

その後はMacと同じ手順でadbの接続ができるようです(未確認)。

# Fire TVへの対応

## アプリが実行しているのがFire TVかどうかを確認する

下記のメソッドでFire TVかどうかをチェックできます。

```java
/**
 * Fire TVかをチェックする
 *
 * @return Fire TVの場合はtrue、それ以外はfalse
 */
public static boolean isFireTv(@NonNull Context context) {
    return context.getPackageManager().hasSystemFeature("amazon.hardware.fire_tv");
}
```

Fire TVの機種を判定する場合は `android.os.Build.MODEL` の返値をチェックします。([ソース](https://developer.amazon.com/public/solutions/devices/fire-tv/docs/identifying-amazon-fire-tv-devices))

|Model                      |`android.os.Build.MODEL` の返値|
|:--------------------------|:-----------------------------|
|Fire TV (1st Gen)          |"AFTB"                        |
|Fire TV (2nd Gen)          |"AFTS"                        |
|FireTV Stick (1st Gen)     |"AFTM"                        |
|FireTV Stick (2nd Gen)     |"AFTT"                        |

例：

```java
public static boolean isFireTvStich1stGen() {
    return android.os.Build.MODEL.equalsIgnoreCase("AFTM");
}
```

## AndroidManifestに起動するActivityを記載する

Fire TVのアプリはAndroidManifestで `android.intent.category.LAUNCHER` のIntent filterが設定されているActivityが立ち上がります。
Android TVとは異なり `android.intent.category.LEANBACK_LAUNCHER` を解釈しないので注意が必要です。
Fire TVで起動したいActivityのIntent filterに `android.intent.category.LAUNCHER` を設定する必要があります。

AndroidとAndroid TV両対応のアプリで、既に `android.intent.category.LAUNCHER` が設定されている場合は、ProductFlavors でAndroid用とFire TV用のアプリを別々にビルドするようにするのが良いでしょう。

## SearchFragment を使用しないようにする

Fire TVでは [LeanbackのSearchFragment](https://developer.android.com/reference/android/support/v17/leanback/app/SearchFragment.html) がサポートされていないようなので、SearchFragmentを使用している場合は、SearchFragmentに到達しないようにする必要があります。
検索機能が必要な場合は、自前で実装する必要がありそうです。

## Recommendation しないようにする

Android TVではOSのトップ画面におすすめを表示する際にはRecommendationをOSに対し設定していますが、Fire TVではおすすめ機能がないので Recommendation しないようにします。
なお、 Recommendation をFire TVに設定しても無視されるようなので何もしなくてもいいかもしれません。

## その他

[Fire TV Development versus Android TV Development](https://developer.amazon.com/public/solutions/devices/fire-tv/docs/amazon-fire-tv-differences-from-android-tv-development) を参照ください。
他に対応が必要そうなことについて記載されています。
【Unity拡張】Animatorのノードを整列させる

#はじめに
AnimatorControllerを作成すると、デフォルトの状態ではノードがかなり離れた位置に作られてしまいます。
![image](https://qiita-image-store.s3.amazonaws.com/0/44288/0a31df82-d2e7-62e1-8d4b-fbd51727017d.png)

個人的にはこれがかなり気に入らないので、今回はこれらのノードを**整列**させるエディター拡張を作ってみました。

Unityのバージョンは**5.5.0b7**です

#ソースコード
```NewBehaviourScript.cs
using UnityEngine;
using UnityEditor;
using System.Linq;
using System.Reflection;

public class NewBehaviourScript
{
    [MenuItem("Assets/Format Animator")]
    static void FormatAnimator()
    {
        // Animatorウィンドウ取得
        var asm = Assembly.Load("UnityEditor.Graphs");
        var editorGraphModule = asm.GetModule("UnityEditor.Graphs.dll");
        var typeAnimatorWindow = editorGraphModule.GetType("UnityEditor.Graphs.AnimatorControllerTool");
        var animatorWindow = EditorWindow.GetWindow(typeAnimatorWindow);

        // 現在選択しているAnimatorControllerの取得
        var animator = Selection.activeObject as UnityEditor.Animations.AnimatorController;

        // ノードを整列
        animator.layers.ToList().ForEach(layer =>
        {
            Vector3 offset = new Vector3(0f, 0f, 0f);
            layer.stateMachine.anyStatePosition = offset;
            layer.stateMachine.entryPosition = offset + new Vector3(0f, 36f, 0f);
            layer.stateMachine.exitPosition = offset + new Vector3(0f, 72f, 0f);
        });

        // Animatorウィンドウのノードグラフ　リセット
        animatorWindow.GetType()
        .GetMethod("RebuildGraph", BindingFlags.Public | BindingFlags.Instance)
        .Invoke(animatorWindow, null);
    }

    [MenuItem("Assets/Format Animator", true)]
    static bool ValidateFormatAnimator()
    {
        return Selection.activeObject.GetType() == typeof(UnityEditor.Animations.AnimatorController);
    }
}
```

上記スクリプトをプロジェクトのEditorフォルダ内へ入れてください。

#動かしてみる
AnimatorControllerを右クリックして"Format Animator"を選ぶとノードが整列されます。
<img src = "https://qiita-image-store.s3.amazonaws.com/0/44288/17fd7262-78f4-1df0-49bc-461bdba67cc1.png">

整列前
![image](https://qiita-image-store.s3.amazonaws.com/0/44288/75be5aee-c0dc-a68b-27a4-c8f244e8be68.png)

整列後
![image](https://qiita-image-store.s3.amazonaws.com/0/44288/a9520d21-a098-17cd-1f43-fc57c8aee27d.png)

キレイになりました (完)
C > define > トークン連結演算子(##) / 文字列化演算子(#) > PAR(iter)

C++で書かれた数値シミュレーションコードADDA。
そこに以下のような定義があった。

```param.c
#define PARSE_NAME(a) parse_##a
```

"##"は本で目にしたことがある程度の知識。

調べてみた。

https://msdn.microsoft.com/ja-jp/library/teas0593.aspx
> トークン連結演算子 (##) 

用語名は拾えた。

以下の方が説明になるようだ。
https://msdn.microsoft.com/ja-jp/library/09dwwt6y.aspx
> 二重シャープ記号またはトークン連結演算子 (##) は、"マージ" 演算子と呼ばれることもあり、オブジェクトのようなマクロと関数のようなマクロの両方で使用されます。 この演算子を使用すると、別々のトークンを 1 つのトークンに結合できます。

1つの#と　２つの##の違いは未消化。

## #と##の違い。

以下が参考になった。
http://www.booran.com/menu/c/macro.html

トークン連結演算子(##) / 文字列化演算子(#)という違いがあるようだ。
変換例が上記リンクで紹介されている。

## 関連の定義

最初のPARSE_NAME()の定義に合わせて、他の定義も含めてのは以下。

```param.c
#define PARSE_NAME(a) parse_##a
#define PARSE_FUNC(a) static void PARSE_NAME(a)(int Narg ATT_UNUSED,char **argv ATT_UNUSED)
#define PAR(a) #a,PARSE_NAME(a),false
```

PAR(iter)のようにしてコールされる。
それが以下のようになるということか。

```
PAR(iter)
iter,PARSE_NAME(iter),false
iter,parse_iter,false
```

以下で使われている。

```param.c
	{PAR(iter),"{bcgs2|bicg|bicgstab|cgnr|csym|qmr|qmr2}","Sets the iterative solver.\n"
		"Default: qmr",1,NULL},
```
ADDA > param.c > #define PARSE_FUNC(a) / PARSE_FUNC(iter)

```txt:My_Environment
Ubuntu 14.04 LTS Japanese Remix
on VMWare Fusion v8.5.2 (4635224)
on OS X El Captian v10.11.4

GNU bash, version 4.3.11(1)-release

gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4 
(also for g++)
ADDA v.1.3b6
```

This article is related to [ADDA (light scattering simulator based on the discrete dipole approximation)](https://github.com/adda-team/adda/).

I was wondering what is the 'PARSE_FUNC()' defined in many places of param.c.
What is the usage?

```param.c
#define PARSE_FUNC(a) static void PARSE_NAME(a)(int Narg ATT_UNUSED,char **argv ATT_UNUSED)
```

This is a definition similar to `ITER_FUNC()`.
It seems that the purpose of this macro is to let the different functions have same arguments (in above case, int Narg ATT_UNUSED,char **argv ATT_UNUSED).

The `PARSE_FUNC()` is used as:

```param.c
PARSE_FUNC(iter)
{
    if (strcmp(argv[1],"bcgs2")==0) IterMethod=IT_BCGS2;
    else if (strcmp(argv[1],"bicg")==0) IterMethod=IT_BICG_CS;
    ...
```