OmniAICreator/Qiita-1.07M huggingface dataset:
AWS VPC リージョン間接続

AWS VPCをリージョン間で接続するには。
VyOSにconfigを読みこませる方法やバージョンアップなどはまったところを中心にまとめてみる。

### 構成例
* ap-northeast-1とus-west-2のVPCをVPNで繋ぐ
 * VPC CIDRはap-northeast-1が`172.16.0.0/16`でus-west-2を`172.17.0.0/16`とした
* カスタマーゲートウェイ(VyOS)はap-northeast-1に置く

```
            ap-northeast-1                     us-west-2
| 172.16.0.0/16 |<-->| VyOS |<==INTERNET==>| VPN |<-->| 172.17.0.0/16 |
```

### 手順概要
#### ap-northeast-1
1. VPC作成
2. VyOSインスタンス構築
3. us-west-2のVPN設定が完了したらconfigをVyOSに流し込む

#### us-west-2
1. VPC作成
2. VPN接続設定

### 手順
VPC作成やVPN接続設定は探せば出てくるのでVyOS構築に関して。

#### VyOSインスタンス構築
    1. AWS MarketplaceのVyOS(v1.1.0)を使ってインスタンス起動する
<img width="550" alt="スクリーンショット 2016-01-30 19.30.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/10256/118d1173-990d-4e84-f1b5-4f2665640bc1.png">

    2. ソース/宛先チェックの無効化
<img width="550" alt="スクリーンショット 2016-01-30 19.53.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/10256/29e3481a-6502-2e33-1759-660b47383f0e.png">

    3. v1.1.0にはVPNのバグがあるらしくv1.0.5を使うとかの記述を見かけ試してみたが一部設定が失敗するために最新のバージョンに上げて対処したら上手くいったのでそれを採用した
      a. add system imageで最新のバージョンをインストールする
      b. インストール後rebootをすれば最新のバージョンに置き換わる

```bash
$ slogin VyOSインスタンス
vyos@VyOS-AMI:~$ add system image http://packages.vyos.net/iso/release/1.1.6/vyos-1.1.6-amd64.iso
...
vyos@VyOS-AMI:~$ show system image
The system currently has the following image(s) installed:

   1: VyOS-1.1.6 (default boot)
   2: 1.1.0 (running image)
vyos@VyOS-AMI:~$ reboot
```

#### us-west-2のVPNの設定をVyOSに流し込む
    1. us-west-2のVPN設定のダウンロードをする
<img width="550" alt="スクリーンショット 2016-01-30 19.38.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/10256/205be312-c40f-c676-1322-09ff55965383.png">

    2. VyOSに流し込む形式に加工する  
      a. local-addressをVyOSのグローバルIPからプライベートIPに変更する(vpn-xxx.txtを編集する)  
      b. 不要行の削除とvbashで実行できるようにする  

```bash
$ cat <<EOF > us-west-2.config
#!/bin/vbash
source /opt/vyatta/etc/functions/script-template
configure
EOF
$ grep -vE "^(\!|$)" /path/to/vpn-xxx.txt >> us-west-2.config
$ cat <<EOF >> us-west-2.config
commit
save
exit
EOF
scp us-west-2.config VyOSインスタンス:/tmp/
```
    3. scpしたconfigをvbashで実行する

```bash
$ slogin VyOSインスタンス
vyos@VyOS-AMI:~$ vbash /tmp/us-west-2.config
```

#### その他
ルートテーブルの設定などを正しく行えば晴れて東京とオレゴンのVPCは結ばれます。



以上
正規表現の先読み/後読みを「絞り込み」と理解してみる

ScalaMatsuriでほんの少しだけ後読みの話が出たようなので先読み/後読みについて解説する。
なお、後方参照とは関係ない。

# 先読みって？
正規表現技術入門には「与えられた正規表現にマッチする文字列が直後に来る位置」にマッチするとある。これだけだと分かりづらいのでRubyで試してみる。

まず、以下のようなファイルを用意する。

```ruby:test.txt
1aaa3
2aaa2
3aaa1
1bbb3
2bbb2
3bbb1
```

まず、基本的なRubyの動きから。普通に先読みなどを使わない、正規表現を使ってマッチする。

```
$ ruby -ne 'puts $_.scan(/aaa/)' test.txt
aaa
aaa
aaa
```

マッチした文字列だけを抜き出している。

これに先読みを加えてみる。先読みは`(?=`と`)`で囲む。

```
$ ruby -ne 'puts $_.scan(/aaa(?=1)/)' test.txt
aaa
```

1つしかマッチしなくなる。これは「'a'、'a'、'a'」に続いて「1が直後にくる位置」がある文字列にマッチする。なので

* aaaの直後に1が来るのは1行しかないので1つ(`3aaa1`の行)にしかマッチしない
* 先読みは「位置」にマッチするので抜き出された結果には影響しない

尚、後読みは「直前にくる位置」にマッチする。`(?<=`と`)`で囲む。

```
$ ruby -ne 'puts $_.scan(/(?<=1)aaa/)' test.txt
aaa
```

これは`1aaa3`の行にのみマッチする


`aaa(?=1)`を図にするとこんな感じだろうか。

```   
   |-> 1
aaa
```

後読みの`(?<=1)aaa`はこうなる。

```
1 <-|
     aaa
```

# 「絞り込み」と理解してみる

さて、ご覧の通り、分かりづらい。これを「絞り込み」と理解してみるとどうだろう。
`/aaa(?=1)/`は「aaaにマッチするもの」の中でも「直後に1が来るもの」とすればどうだろう。少しは分かりやすい気がする。

もう1つ例を出す。これで、単語集の中から7文字の単語を抜き出せる。

```
$ ruby -ne 'puts $_.scan(/^.{7}$/)' /usr/share/dict/words
# 14,000個くらい
```

この中でも、母音(aiueo)が3つ以上連続するものに絞り込むことする(英語の母音はaiueoだけじゃないだろとかは突っ込まない)。various、tableauなどがそれにあたる。まず、とある文字列に対して先頭から厳密にマッチするとして母音が3つ以上含まれるかを検査する正規表現は`.*[aiueo]{3}`になる。それを使って、こう書ける。

```
$ ruby -ne 'puts $_.scan(/^(?=.*[aiueo]{3}).{7}$/)' /usr/share/dict/words
# 130個くらい
```

先の図を使うとこうなる。

``` 
 |->.*[aiueo]{3}
^ .{7}$
```

なんとなく正規表現が重ね合わさってるのが分かるだろうか。

さらにもう1つ。シェルスクリプトの中から定義された関数名だけを抜き出してみる。
シェルスクリプトの関数定義は行頭から始まって識別子文字(`[a-zA-Z_]`)列が続き、`()`がくる。例えば

```bash
foo() {
  echo foo
}
```

のように。

まずは簡単に試してみる。行頭から始まる識別子文字列を抜き出す。尚、検索対象は拙作の[CIM](https://github.com/KeenS/CIM)のscriptsディレクトリのファイル群とした。シェルスクリプトで千数百行ある。

```
$ ruby -ne 'puts $_.scan(/^[a-zA-Z_]+/)' *
...
command
shift
case
esac
case
esac
if
else
fi
cim_set_sbcl_home_for
export
exec
BEGIN
```

`if` `case` `command`など明らかに関数でない、シェルのキーワードも入っている。これを「`()`が続く」の条件で絞り込む。

```
$ ruby -ne 'puts $_.scan(/^[a-zA-Z_]+(?=\(\))/)' *
...
cim_aware_system_lisp
cim_make_symlinks
cim_choose_one_version
cim_register_all_impls
cim_set_sbcl_home_for
cim_arch
cim_sbcl_arch
cim_ccl_arch
cim_distribution_archive_type
__sed_i
__which
cim_run_if_installed
run_lisp
```

ちゃんと関数のみが出てきたようだ。

先の図でいくと、この正規表現はこうなる。

```
          |->\(\)
[a-zA-Z_]+
```

# まとめ

* 正規表現の先読み/後読みについて解説した
* 先読み/後読みの「絞り込み」の解釈を与えた
* 「正規表現技術入門」読もう
nginxでバーチャルホストを設定する（Mac）

ググったところ、古い情報だったり、あれこれ難しい方法が紹介されていたりで、ずいぶんと遠回りをしてしまいましたが、実際のところは案外簡単にできました。

##自分の環境
Mac OSX 10.8.5（Mountain Lion)
Homebrew 0.9.5

##インストールしたnginx
nginx 1.8.1

##nginxのインストール
homebrewでインストールしました。

```lang:ターミナル
$ brew install nginx
```
デフォルトのポートは、`/usr/local/etc/nginx/nginx.conf` にて8080に設定されるようです。
Macでは管理者権限のないユーザは、1024番以降のポートしか使うことができないため、このようになっているようです。

```lang:ターミナル
$ brew info nginx
```

> The default port has been set in /usr/local/etc/nginx/nginx.conf to 8080 so that nginx can run without sudo.

##パスを通しておく

```lang:ターミナル
$ export PATH=$PATH:/usr/local/sbin
```

##（念のため）Apacheを停止
使用するポートが異なっていれば大丈夫だと思いますが、念のため。
```sudo apachectl stop```

##nginxを起動する

正常に動作しているかを確認します。

```lang:ターミナル
$ nginx
```
ブラウザから `http://localhost:8080`にアクセスします。
![welcom.png](https://qiita-image-store.s3.amazonaws.com/0/37412/ddf5336b-85eb-04e1-5b84-8724e74446f6.png)

##nginxを停止する
```lang:ターミナル
$ nginx -s stop
```

##バーチャルホストの設定
nginx.confファイルを編集します。

```lang:ターミナル
$ cd /usr/local/etc/nginx
$ open .
```

バーチャルホストの設定例が既に記述されている（80行目辺り）ので、これを元に以下のような設定を追加します。

```lang:nginx.conf
# another virtual host using mix of IP-, name-, and port-based configuration
server {
  listen       8080;     // 使用するポート
  server_name  test.local; // ホスト名

  location / {
    root   /Users/megurock/Sites/test/;  // ソースの保存場所
    index  index.html index.htm;
  }
}
```

##ホストの追加
Macのhostsファイルを編集します。

```lang:ターミナル
$ cd /private/etc
$ open .
```

```lang:hosts
127.0.0.1	test.local  // ホストを追加
127.0.0.1	localhost
```

##nginxを再起動する

```lang:ターミナル
$ nginx
```
`http://test.local:8080` にアクセスします。

##注記
ポートを80など（1024よりも前）に設定した場合は、管理者権限にてnginxのコマンドを実行する必要があるようです。

```lang:nginx.conf
# another virtual host using mix of IP-, name-, and port-based configuration
server {
  listen       80;         // 使用するポート
  server_name  test.local; // ホスト名

  location / {
    root   /Users/megurock/Sites/test/;  // ソースの保存場所
    index  index.html index.htm;
  }
}
```

```lang:ターミナル
$ sudo nginx             // 管理者権限でnginxを起動
```
`http://test.local` でアクセスできます。

```lang:ターミナル
$ sudo nginx -s stop     // 管理者権限でnginxを停止
```

以上です。
Unity iOSビルド時にURLスキームを追加するだけのPostProcessBuild

URLスキームを追加したかったので書いた。

```cs
using System.IO;
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEditor.iOS.Xcode;
using UnityEngine;

/// <summary>
/// Unity iOSビルド後にUrlSchemeを追加する為のPostprocessor
/// </summary>
public class UrlSchemePostprocessor
{
	/// <summary>
	/// ビルド後の処理( Android / iOS共通 )
	/// </summary>
    [PostProcessBuild(1)]
    public static void OnPostProcessBuild( BuildTarget target, string path )
	{
		// iOSじゃなければ処理しない
		if ( target != BuildTarget.iOS )
		{
			return;
		}

		AddUrlScheme( path );
	}

	/// <summary>
	/// URLスキームを追加します
	/// </summary>
	/// <param name="path">	出力先のパス </param>
	public static void AddUrlScheme( string path )
	{
		var plistPath	= Path.Combine( path, "Info.plist" );
		var plist		= new PlistDocument();

		// 読み込み
		plist.ReadFromFile( plistPath );

		// ほぼ定型文
		var urlTypeArray	= plist.root.CreateArray( "CFBundleURLTypes" );
		var urlTypeDict		= urlTypeArray.AddDict();
		var urlSchemeArray	= urlTypeDict.CreateArray( "CFBundleURLSchemes" );

		// URLスキームを追加
		urlSchemeArray.AddString( "hogehoge" );
		urlSchemeArray.AddString( "fugafuga" );

		// 書き込み
        plist.WriteToFile( plistPath );
	}
}
```
こんな感じでPostProcessBuild時にinfo.plistに対してUrlSchemeが複数書き込みできます。


以上。
amazon linux redis install


# Redisインストール（Amazon Linux - EC2）

## Redis Install

### Using ``epel`` Repository

```bash
sudo yum --enablerepo=epel install redis
```

```
=====================================================================================================================================================================
 Package                              Arch                                  Version                                        Repository                           Size
=====================================================================================================================================================================
Installing:
 redis                                x86_64                                2.4.10-1.el6                                   epel                                213 k

Transaction Summary
=====================================================================================================================================================================
Install  1 Package
```
version 2.4.10-1.el6 がインストールされた。（2016年1月30日）


### Using ``remi`` Repository

```bash
sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
sudo yum --enablerepo=remi install redis
```

```
=====================================================================================================================================================================
 Package                              Arch                               Version                                         Repository                             Size
=====================================================================================================================================================================
Installing:
 redis                                x86_64                             3.0.7-1.el6.remi                                remi                                  442 k
Installing for dependencies:
 jemalloc                             x86_64                             3.3.1-1.8.amzn1                                 amzn-main                             111 k

Transaction Summary
=====================================================================================================================================================================
Install  1 Package (+1 Dependent package)
```

version 3.0.7-1.el6.remiがインストールされた。（2016年1月30日）



参考URL
[AWS EC2にredisをインストールする](http://qiita.com/stoshiya/items/b8c1d2eb41770f92ffcf)


## Setting Service

サービスの起動、自動起動設定

```bash
sudo service redis start
sudo chkconfig --level 35 redis on
sudo chkconfig --list | grep redis
```

実行結果

```
$ sudo service redis start
Starting redis-server:   [  OK  ]
$ sudo chkconfig --level 35 redis on
$ sudo chkconfig --list | grep redis
redis           0:off   1:off   2:off   3:on    4:off   5:on    6:off
redis-sentinel  0:off   1:off   2:off   3:off   4:off   5:off   6:off
```

参考URL
[WordPress の表示速度を驚くほど高速化させる方法！〜Redis連携](http://beautifulajax.dip.jp/?p=667)
Angular.jsのDIがTypeScriptの型を殺してしまうという話

Angular.jsとTypeScriptの記事として導入手順の紹介みたいな記事が多かったので書いてみました。

## はじめに

Angular.jsをTypeScriptで書くことにしました。最初は、粒度を細かい形でserviceをDIしていたのですが、細かい粒度でサービスをDIしてしまった場合にはTypeScriptの型の恩恵が弱まってしまって困ったという話です。それでどのようにすると良いのかある程度方針を考えたのでそれのmemoです。

## 最初の頃のDI

最初の頃は以下の様にあるモジュールの関数単位(classのstatic method単位)でDIしようとしていました。
以下の様なイメージです。restangularを使っていますがただのAPI呼び出しです。

```typescript
class AService {
  static a(): (id: number) => restangular.IElement {
    "ngInject";
    return (id: number) => {
      return this.Restangular.one("a", id);
    };
  }
}

// 登録
app.factory("a", AService.a);
```

そして使うときには以下の様な形になります。

```
// 利用
function use(a: (a_id: number) => Restangular.IElement){
  "ngInject";
  // do something with a(a_id)
};
```

これが全く良くないということでした。

## ダメな理由

ダメな理由として以下のような事柄が挙げられます。

- (前提: 定義時の型が変わった時に利用する側の型指定も変える必要がある。ただし、変えた後はruntime errorの有無でしか確認できない)
- 利用する際にリテラルの形で型定義している。 (無名関数的な型の指定が間違わずに一致している保証がない)
- 関数をDIしている。 (関数は型のシグネチャが変わりやすい)
- (Restangular.IElementに型が付いていない)

何が問題なのかをまとめると型のシグニチャが変わりえる単位の粒度でDIするのは良くないということです。

理由としては以下の２つを一致させる必要が有るためです。

- DIに登録する際の型。serviceの定義
- DIを利用する際の型。 (any型からのcast)

ある動作していたコードに変更が必要になった時のことを考えてみましょう。

DIに登録する側の変更はおそらく変更箇所そのものなので問題無いのですが。DIを利用する側の変更も一致させる必要があります。
そしてDIを利用する際の型の指定の変更忘れや不一致が生じた際に気づけるのが実行時のみになってしまうというのが問題です。

Angular.jsにおいて、DI利用時の型指定というのは単に開発者がこれだと指定した型にcastするという意味でしかないので実質any型をcastしているのと大差ないです。
特に型のシグネチャが変わった後も、DIで取り出した後の記述が変わっていなければコンパイルエラーなどにならず動くというのが非常に厄介です。

特に関数単位でDIしているというようなことをしているのであれば関数の引数の型は他の何よりもかわりやすいものです。そしてそれらが取りうる引数が変わった後も依然としてコンパイルが通ってしまうということです。

## 方針

方針としては、DIするときには以下のような型を避けると良さそうです。

- genericsな型(以降ほとんど変わらないというのであれば避けなくても良い)
- 関数

例えば、先の例で言うとクラスとして定義したAService自体をDIするほうがマシです。

```typescript
class AService {
  constructor() {
    "ngInject";
  }
  a(id: number): restangualr.IElement {
    return this.Restangular.one("a", id);
  }
}

// 登録
app.service("aService", AService);

// 利用(使う時はaService.a(id))
function use(aService: AService){
  "ngInject";
  // do something with aService.a(a_id)
};
```

なぜマシかというと以下の様な理由です。

- 各apiを呼ぶメソッド(AService.aなどのこと)の型は変わりやすいが、そのコンテナであるAService自体が変わることは少ない
- DI利用時の型指定がほぼ不変になる。
- AService.aについての型検査も問題なく有効になる。

つまり型のシグネチャが変わり得る部分はDIの対象にしない。するとしたらそれらの機能を持つコンテナをつくりそれをDIするべきということです。
(重要なのはコンテナのようなおそらく変更されないであろうまとまりを作ってそれをDIした方が良いということであって、クラス定義をして `app.service(...)`でserviceを登録するべきということではないです。)

値をキャッシュしたい場合などはインスタンス自体の状態として格納すれば良いですし。シングルトンにしたくなければDIする対象をファクトリーにすれば良いですね。

## もうすこしTypeScriptとAngular.jsのこと

### 積極的に値をobjectでまとめていってOK

また、TypeScriptを使うのであれば積極的にvalue objectを定義して使っていってOKだと思います。

javascriptやLL言語でコードを書く場合には、直接文字列を渡したり複数の引数を渡していた関数を１つのオブジェクトを受け取るように修正した場合に上手く動作するかどうかを気にしながら、結構、慎重に修正を加える必要がありました。一方でTypeScriptの場合には型があるので、しっかり型なりインターフェイスなりを書いてあげていれば、失敗するところはコンパイルエラーになります。また同様に属性名の変更も自由に行なってしまって構いません。

### 一方で全てに型がつくわけではない。

一方でAngular.jsを採用する限り全てに型がつくわけではないというのは考えておくべきかもしれません。
例えばtemplateとして露出する部分に関しては型が全く付きません。したがってtemplate側に露出する属性の変更には慎重になる必要があります。これと同じようなことがDIされる箇所にも言えるということでした。

## まとめ

型が欲しかったのでTypeScriptを使いました。
いろいろなしがらみでAngular.jsを使うことになりました。
Angular.jsの文字列ベースのDIがTypeScriptの型を殺してしまいます。

Angular2に期待しましょう。
httpで特定ポートをリッスンしているサービスにhttpsでアクセスする方法

## 状況

* port 8080番に対して、行う想定
* SSL証明書はオレオレ
* httpでアクセスされたらhttpsにリダイレクト
* サブディレクトリ以下の挙動に関しては考慮しない

## swich su

```bash

$ sudo su
# 

```

## nginx install

```bash

# yum install -y nginx

```

## write nginx config

```bash

# vi /etc/nginx/conf.d/virtual.conf

```

### /etc/nginx/conf.d/virtual.conf

```nginx

server {
    listen 80;
    server_name hoge.example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443;
    ssl on;
    ssl_certificate /etc/nginx/cert/server.crt;
    ssl_certificate_key /etc/nginx/cert/server.key;

    server_name hoge.example.com;

    location / {
        proxy_pass http://127.0.0.1:8080/;
    }
}

```

## make ssl certificate files

```bash

# mkdir /etc/nginx/cert
# cd /etc/nginx/cert
# openssl genrsa 2048 > server.key # Enter連打
# openssl req -new -key server.key > server.csr
# openssl x509 -req -days 3650 -signkey server.key < server.csr > server.crt # -daysで証明書期限を指定

``` 

## set launch nginx at boot

```bash

# chkconfig nginx on

```

## start nginx

```bash 

# service nginx start

```
Vagrant で `box add` がコケるときに確認すること


`vagrant box add` しようとしたら、ダウンロードのタイミングでエラーが出て進まなくなった。

> An error occurred while downloading the remote file. The error
message, if any, is reproduced below. Please fix this error and try
again.

> HTTP server doesn't seem to support byte ranges. Cannot resume.

どうも tmp ファイルの断片が邪魔をしてたみたいで、`~/.vagrant.d/tmp/` 以下のファイルを削除したらなおった。

よかった。
KinesisClientLiblary(KCL)におけるLATESTとTRIM_HORIZONの挙動について

[AWS Kinesis Stream API](http://docs.aws.amazon.com/ja_jp/kinesis/latest/APIReference/API_GetShardIterator.html)で記載されているShard iterator typeのうち、KCL(Kinesis Client Liblary)に標準で用意されているのは `LATEST` と `TRIM_HORIZON` ですが、これの挙動について気になる点があったので調査してみました。途中の訳文は適当です。

## LATEST

原義では

> （原文）LATEST - Start reading just after the most recent record in the shard, so that you always read the most recent data in the shard.
> （訳）LATEST - シャード内の最新レコードの直後から読み取りを開始します。なのでシャード内の最新のデータを常に読みます。

となっています。

実際の挙動としてはKCLはまずDynamoDBにアプリケーション名のテーブルが存在することを確認します。Streamに対してあるアプリケーション名で初めて取得を開始するとき、KCLはDynamoDBにアプリケーション名のテーブルが作成し、シャードIDがhashPkとなるレコードが作成されます。その時、 `checkpoint` に `LATEST` が書き込まれます。

その後、KCLは `checkpoint` を見に行き、LATESTと書いて書いてあればApp起動後に初めて入ってきたデータから取得を開始します。この設定は一度アプリケーションを終了したあとも変わらず、**アプリケーションが動いてない間にデータがシャードに入ってきてから起動してもそのデータは取得されません。**

## TRIM_HORIZON

原義では

>  (原文) TRIM_HORIZON - Start reading at the last untrimmed record in the shard in the system, which is the oldest data record in the shard.
> (訳) TRIM_HORIZON - シャード内に存在する最初のデータから読み込みを開始します。

となっています。

実際の挙動では、初めてのアプリケーションであればLATESTの時と変わらなく、 `checkpoint` が `TRIM_HORIZON` になるぐらいの違いです。

KCLはアプリケーションを起動したあと、DynamoDBの `checkpoint` を見に行き、 `TRIM_HORIZON` であれば、シャード内のデータを全件取得してきます。 **この設定は一度アプリケーションを終了したあとも変わらず、アプリケーションを再起動したあともシャード内のデータを必ず全件取得するようになっています。**

## `AT_SEQUENCE_NUMBER` と `AFTER_SEQUENCE_NUMBER` は？

結論からいうとKCLでは実装されていないようです。もしかしたらKCLでやる方法があるかもしれませんが、AWS SDKに実装されている `com.amazonaws.services.kinesis.model` の `GetShardIteratorRequest` Class の `setStartingSequenceNumber(String startingSequenceNumber)` に当たるメソッドは見つかりませんでした。

検証中、DynamoDBの `checkpoint` に シャード内に存在するレコードのSequenceNumber（ex: `00000221946949406733343604294600004294483820243067076610` ） で上書きしたところ、 `AFTER_SEQUENCE_NUMBER` とおなじ挙動になりました。ただし、再起動してもそのSequenceNumberが書き換わることは無いので取り扱いには注意が必要です。

## 結論

ドキュメントに書いてあるとおりの挙動だったのはわかりましたが、アプリケーションを停止している間にきたレコードをどう扱うかという点に関しては実装者側で何かしら案を練らないとダメっぽいのでそこら辺の知見が必要になります。さてさてどうしようか。
swift2において、データを永続的に保存する方法

以下の方法をとることで、データを簡単に保存することができる。

```ViewController.swift

import UIKit

class ViewController: UIViewController{

	override func viewDidLoad(){
		super.viewDidLoad()

       	//hogeというデータをnameというキーで保存	
       	NSUserDefaults.standardUserDefaults().setObject("hoge", forKey: "name")

        //String型でデータを取り出す(次に更新するとデータが上書きされる)
        var userName = NSUserDefaults.standardUserDefaults().objectForKey("name")! as! String

        //保存されている情報を書き換える	
		userName = "hello"
	
        //データを更新
	    NSUserDefaults.standardUserDefaults().setObject(userName, forKey: "name")

        //変更後のhelloと出力    
        print(userName)

	}
}
```
CSSリセットスタイル

#resetCSSの導入
resetCSSを導入する際に参考にしたサイト。

http://www.html5-memo.com/first-html5/html5-002/

わかりやすい。
オリジナルはEric Meyer氏のhtml5doctor。ここから```ul```と```img```、```box-sizing```に対するスタイルを変更。

```css:reset.css
/*
html5doctor.com Reset Stylesheet
v1.6.1
Last Updated: 2010-09-17
Author: Richard Clark - http://richclarkdesign.com
Twitter: @rich_clark
*/
 
/*要素のフォントサイズやマージン・パディングをリセットしています*/
html, body, div, span, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
abbr, address, cite, code,
del, dfn, em, img, ins, kbd, q, samp,
small, strong, sub, sup, var,
b, i,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, figcaption, figure,
footer, header, hgroup, menu, nav, section, summary,
time, mark, audio, video {
    margin:0;
    padding:0;
    border:0;
    outline:0;
    font-size:100%;
    vertical-align:baseline;
    background:transparent;
}
 
/*行の高さをフォントサイズと同じにしています*/
body {
    line-height:1;
}
 
/*新規追加要素のデフォルトはすべてインライン要素になっているので、section要素などをブロック要素へ変更しています*/
article,aside,details,figcaption,figure,
footer,header,hgroup,menu,nav,section {
    display:block;
}
 
/*nav要素内ulのマーカー（行頭記号）を表示しないようにしています*/
/*nav ul {
    list-style:none;
}*/
ol, ul {
    list-style: none;
}
 
/*引用符の表示が出ないようにしています*/
blockquote, q {
    quotes:none;
}
 
/*blockquote要素、q要素の前後にコンテンツを追加しないように指定しています*/
blockquote:before, blockquote:after,
q:before, q:after {
    content:'';
    content:none;
}
 
/*a要素のフォントサイズなどをリセットしフォントの縦方向の揃え位置を親要素のベースラインに揃えるようにしています*/
a {
    margin:0;
    padding:0;
    font-size:100%;
    vertical-align:baseline;
    background:transparent;
}
 
/* ins要素のデフォルトをセットし、色を変える場合はここで変更できるようにしています */
ins {
    background-color:#ff9;
    color:#000;
    text-decoration:none;
}
 
/* mark要素のデフォルトをセットし、色やフォントスタイルを変える場合はここで変更できるようにしています
また、mark要素とは、文書内の検索結果で該当するフレーズをハイライトして、目立たせる際に使用するようです。*/
mark {
    background-color:#ff9;
    color:#000;
    font-style:italic;
    font-weight:bold;
}
 
/*テキストに打ち消し線が付くようにしています*/
del {
    text-decoration: line-through;
}
 
/*IEではデフォルトで点線を下線表示する設定ではないので、下線がつくようにしています
また、マウスオーバー時にヘルプカーソルの表示が出るようにしています*/
abbr[title], dfn[title] {
    border-bottom:1px dotted;
    cursor:help;
}
 
/*隣接するセルのボーダーを重ねて表示し、間隔を0に指定しています*/
table {
    border-collapse:collapse;
    border-spacing:0;
}
 
/*水平罫線のデフォルトである立体的な罫線を見えなくしています*/
hr {
    display:block;
    height:1px;
    border:0;  
    border-top:1px solid #cccccc;
    margin:1em 0;
    padding:0;
}
 
/*縦方向の揃え位置を中央揃えに指定しています*/
input, select {
    vertical-align:middle;
}

/*画像を縦に並べた時に余白が出ないように*/
img {
    vertical-align: top;
    font-size: 0;
    line-height: 0;
}

/*box-sizingを全ブラウザに対応*/
*, *:before, *:after {
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    -o-box-sizing: border-box;
    -ms-box-sizing: border-box;
    box-sizing: border-box;
}
```
RailsのRSpecでセッション情報を設定する方法

コントローラでセッションの値を参照していて、RSpec でセッションの値を変更したテストを書く方法です。

まず、セッション追加メソッドを定義します。

```rb
# spec/support/spec_test_helper.rb

module SpecTestHelper
  def add_session(arg)
    arg.each { |k, v| session[k] = v }
  end
end

RSpec.configure do |config|
  config.include SpecTestHelper, type: :controller
end
```

この時、`spec_test_helper.rb` がロードされる必要があります。例えば `rails_helper.rb` にて次の様にします。

```rb
Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }
```

以上で準備は終了です。テストで追加メソッドを呼び出してみます。

```rb
describe ApplicationController, type: :controller do

  include SpecTestHelper

  it 'say hello elon' do
    session = {
      'user_name' => 'elon',
      'sex'       => 'male'
    }
    add_session(session)
    get :hello
  end

  it 'say hello tosca' do
    session = {
      'user_name' => 'tosca',
      'sex'       => 'female'
    }
    add_session(session)
    get :hello
  end
```

アクション内でセッションに設定されている事が確認できます。

```rb
class ApplicationController < ActionController::Base

  def hello
    session['user_name']
    # => 'say hello elon' では 'musk'
    # => 'say hello tosca' では 'tosca'
    session['sex']
    # => 'say hello elon' では 'male'
    # => 'say hello tosca' では 'female'
    
    # etc...
  end
```

当初、RSpec 内で `ActionController::Metal` を再オープンしたり、セッション追加アクションを定義して routes でテストの時のみ有効にしたりしていましたが、上記の方法がシンプルかなと思います。

## 参考

- [ruby on rails - Setting a session value through RSpec - Stack Overflow](http://stackoverflow.com/questions/30462215/setting-a-session-value-through-rspec)
underscoreコードリーディング（after）



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



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


##afterとは


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

こんな説明。
>####_.after(count, function) 
>Creates a version of the function that will only be run after first being called count times.
>Useful for grouping asynchronous responses, where you want to be sure that all the async calls have finished, before proceeding.

```javascript
var renderNotes = _.after(notes.length, render);
_.each(notes, function(note) {
  note.asyncSave({success: renderNotes});
});
// renderNotes is run once, after all notes have saved
```
------------- 
count回数呼ばれたあとに初めて実行されるような関数を生成します。
非同期実行をいくつか行った際に、すべてが同期されたことが確実になってから行いたい場合に使いやすいです。


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

```javascript
 // Returns a function that will only be executed on and after the Nth call.
  _.after = function(times, func) {
    return function() {
      if (--times < 1) {
        return func.apply(this, arguments);
      }
    };
  };

```

timesを前置デクリメントし、1未満になったらfuncを実行する
emacs24にquickrun.elを導入する

最近はviやEclipseを使う機会が増えて，以前ほどemacsを利用しないのですが，たまに書き捨てのコードを書いたり，競技プログラミングするときにはまだまだ使ってます．

quickrun.elは，emacs内でコードを実行して，結果をバッファに表示することができるelispです．

Github
https://github.com/syohex/emacs-quickrun

作者様ブログ（更新情報も記載されているのでチェックおすすめです）
http://syohex.hatenablog.com/

### 導入
環境:
Mac OS 10.11
emacs 24.5.1

Caskを用いるのが最も早いと思います．

Cask
https://github.com/cask/cask

```bash
$ brew install cask
```

```text:~/.emacs.d/Cask
(depends-on "quickrun")
```

```bash
$ cd ~/.emacs.d
$ cask install
```

インストールが終わったら，init.elにquickrun.elを読み込むように追記．

```elisp:init.el
(require `quickrun)
```

これで終わり．

### 機能（一部）
自分が使いそうな機能だけ紹介しておきます．
ほぼGithubページの"Basic Usage"を訳しただけです．

#### M-x quickrun
基本はこいつです．
カレントバッファのプログラムを（引数無しで）実行し，結果をquickrunバッファに表示します．
結構賢くて，ファイルのshebangにシェルコマンドを書くと，それを読んで実行したりします．

プログラムの中で標準入力を読み込みたい場合には，実行したいファイル名（例えば，foo.c）に対して，foo.c.qrinputというファイルを作成し，そこに標準入力から読み込みたい内容を記述します．
その上で，foo.cに対してquickrunを実行すると，実行時に自動的にfoo.c.qrinputが読み込まれて標準入力に渡されるようです．

#### M-x quickrun-with-arg
これは，カレントバッファのプログラムをコマンドライン引数をとって実行し，結果をquickrunバッファに表示します．
書き捨てのスクリプトなんかだと，ファイルを読み込んで変換したものを出力するような操作が多いので，結構役立ちます．

### カスタマイズ
導入自体はこれで完了していますが，ショートカットキーを設定するとより効率的に実行できるようになります．

```elisp:init.el
(global-set-key (kbd "<f5>") 'quickrun)
(global-set-key (kbd "C-<f5>") 'quickrun-with-arg)
(global-set-key (kbd "M-<f5>") 'quickrun-compile-only)
```
ESP8266 > strtol()のバグ? >  wifiUdp.read()のバグ? > waitで対策

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

UDP通信でコマンドを受信して、そのコマンドの処理をしようとしている。


http://ideone.com/1JqDDe

```test.c
#include <stdio.h>
#include <stdlib.h> // for strtol
#include <string.h>
#include <stdint.h>

char rcvd[20];

int16_t readNumber(char *ptr)
{
	if (ptr == NULL) {
		return -1; // error
	}
	char *endptr;
	int res;
	res = (int)strtol(ptr, &endptr, /* base=*/10);
	if (*endptr != '\0') {
		return -1; // error
	}
	return res;
}

int16_t getAlertIdx(char *ptr)
{
	if (ptr == NULL) {
		return -1; // error
	}

	char *commaPtr;
	commaPtr = strchr(ptr, ',');
	printf("%s", ptr);
	if (commaPtr == NULL) {
		return -1; // error
	}

	commaPtr++;
//	printf("found: %s", commaPtr);
	return readNumber(commaPtr);
}

int main(void) {
	strcpy(rcvd, "alert,aaa\r");	
	int16_t idx = getAlertIdx(rcvd);
	printf("%d\n", idx);
	
	return 0;
}
```

上記のコードはideoneでは問題なく動作する。

Aruduino IDEでESP8266に書き込み後実行した時に、正常な通信でも
`	if (*endptr != '\0') {`
の条件にひっかかってしまう。

他の部分の間違いなのか分かっていない。

### 問題2

strtol()絡みか、以下のエラーもでる。
関数を自分で作るしかないかも。 

```
Exception (2):
epc1=0x3ffe8410 epc2=0x00000000 epc3=0x00000000 excvaddr=0x3ffe8410 depc=0x00000000

ctx: cont 
sp: 3ffef230 end: 3ffef4e0 offset: 01a0

>>>stack>>>
3ffef3d0:  64656233 65313931 34386431 00000037  
3ffef3e0:  fe84b100 202e783f fee9c440 100ffb3f  
3ffef3f0:  feeac040 feeab83f ffdc203f 0000003f  
3ffef400:  feea8400 202a393f fe84b040 0000003f  
3ffef410:  ffffff00 61ffffff 6d726574 3835392d  
3ffef420:  2d376262 00000004 3ffef480 3ffef491  
3ffef430:  40106e04 3ffee2d0 3ffee2d5 3fffdad0  
3ffef440:  3ffee4b4 401051cf 00000a31 3ffe85f6  
3ffef450:  3ffee484 00000000 00000000 3ffef3e0  
3ffef460:  3ffee484 00000007 3ffe845f 3ffee4b4  
3ffef470:  3ffef490 3ffef480 00000004 40202e89  
3ffef480:  3ffe85f4 3ffee2d0 0000002c 3ffee2d8  
3ffef490:  00000a31 0a312c74 3ffee484 4020335c  
3ffef4a0:  402012e6 00000064 3ffee484 40201ab1  
3ffef4b0:  3fffdad0 3ffee304 3ffee2d0 40201c53  
3ffef4c0:  feefeffe 00000000 3ffee4ac 40202fbc  
3ffef4d0:  feefeffe feefeffe 3ffee4c0 40100114  
<<<stack<<<
```

## おそらく問題の原因は..

What's the culprit? (原因は何か?)

電池電圧が2.9Vになっていた。
電池交換後は上記のエラーも出ないようだ。

こういう失敗はたまにする。

## 再発した。対策はwait?

```
  int len = wifiUdp.read(receivedBuffer, 255);
```

の後ですぐにreceivedBufferの中身をパースしようとするとエラーが出る。

```
  int len = wifiUdp.read(receivedBuffer, 255);
  Serial.println();
```
とすると回避できるようだ。

read()の処理が終わっていないのかもしれない。

Serial.println();を実行することで処理時間に余裕が生まれException(2)がでなくなるように思う。

MSP430でもあったCPUの命令コードのプリフェッチ関連の問題なのだろうか?
CentOS7 ファイアーウォール設定：firewall-cmdコマンド(確認系)



## デフォルトのゾーンの設定を見る場合
    firewall-cmd --list-all
    
        ###output###
        public (default, active)
          interfaces: enp0s3 enp0s8 enp0s9
          sources:
          services: dhcpv6-client http mysql nfs ntp openvpn rpc-bind selenium ssh tomcat
          ports:
          masquerade: no
          forward-ports:
          icmp-blocks:
          rich rules:


#### すべてのゾーンの設定を見る場合
    firewall-cmd --list-all-zones
    
     ###output###
        public (default, active)
          interfaces: enp0s3 enp0s8 enp0s9
          sources:
          services: dhcpv6-client http mysql nfs ntp openvpn rpc-bind selenium ssh tomcat
          ports:
          masquerade: no
          forward-ports:
          icmp-blocks:
          rich rules:
               ・・・・・
               ・・・・・
               ・・・・・
#### デフォルトのゾーンが何になっているか確認する
    firewall-cmd --get-default-zone
    
     ###output###
     　　public

#### Firewalldが起動しているか確認する
    firewall-cmd --state
         
    ###output###
        running


#### 定義されているサービス一覧 
     firewall-cmd --get-services
     
     ###output###
       RH-Satellite-6 amanda-client bacula bacula-client dhcp dhcpv6 dhcpv6-client dns freeipa-ldap 
       freeipa-ldaps freeipa-replication ftp high-availability http https imaps ipp ipp-client ipsec
       iscsi-target kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mountd ms-wbt mysql 
       nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3s postgresql proxy-dhcp radius rpc-bind
       rsyncd samba samba-client selenium smtp ssh telnet 
       tftp tftp-client tomcat transmission-client vdsm vnc-server wbem-https
raspberry piでpythonからmilkcocoaにMQTTでつなぐ

# やりたいこと

raspberry piからmilkcocoa https://mlkcca.com/ にデータをpushしたい、pushしたデータは別のところからjsで読み出したい。それなりにリアルタイム性が欲しい。

# 作ったもの

なんとmilkcocoa, pythonのSDKないと思ってたらあるのか。
http://ngi644.net/blog/archives/1177 をみて知った。nodejsでPWM制御やるのめんどくさそう・・・と思っていたので良かった。


## python用milkcocoa SDKインストール
```
> git clone https://github.com/milk-cocoa/python_sdk.git
> cd python_sdk/
> sudo python setup.py  install
```

## milkcocoaにpushするスクリプト

サンプルをコピペすればOK、API Key, Secretは設定ページから発行して貼り付け。

```py
import sys
import time

import milkcocoa.milkcocoa as milkcocoa

milkcocoaClient = milkcocoa.Milkcocoa.connectWithApiKey("app id", "api key", "secret", useSSL=False)

datastore = milkcocoaClient.datastore("python")

def on_push(e):
	print e

datastore.on("push", on_push)

datastore.push({"content":"Hello"})

while(True):
	time.sleep(1)

```




# 僕はこう思ったっす

milkcocoa、データをとりあえず放り込む軽量なBaaSとしては手軽だし使いやすいライブラリも揃ってるしで気に入ってるんだけど、流行らないのが不思議だ。価格体系がデータ量が多いと辛いのと、これだけ軽量だとマネタイズ難しそうな気はする。データ量が多かったり少しややこしいことやるときはAWS使っちゃうしなぁ。。

AWS IoTは証明書とかが必要でArduinoなんかから使うのは無理みたいだし、クラウド上のDBにデータを書いて読み出したい時にLambdaとか設定するのもめんどい。

その点milkcocoaはすぐにデータ入れられるし可視化もできるし、かんたんなことをかんたんにやるなら便利。海外だとこういうのないのかな。
Sparckfunのphant.ioも簡単なんだけど、レスポンスが遅すぎたり不安定な印象があるのでmilkcocoaおし。
VirtualBox Guest 画面解像度変更(Windows)

Tips発見した。
http://qiita.com/koguma98/items/75e9b0799ca244e7de55
が、うまくいかなかったけど解決したのでメモ

- Guest Additionフォルダがない→ホストOSではなくてゲストOSでコマンド実行する
- Guest Additionインストール後 ホストを最新バージョンにしたのでHost-Guest通信がうまくいかなかった→Guest Additionインストールしなおし
- コマンドを実行したがレジストリに書き込めないと表示→管理者コマンドプロンプトで実行

↓

うまくいきました。
ブラウザのコンソールでスクレイピング

Webページから表や見出しを抽出したり簡単な整形をしたりしたくなることがあります。
簡単なものであればブラウザのコンソールを使ってデータの抽出や加工を行うことができます。

## TL;DR

コンソールで次のようなコマンドを実行するとデータを抽出できる

```js
$$('CSSセレクタ').map(e => doSomething(e)).join('\n')
copy($_)
```

* `$$('CSSセレクタ')`で要素を抽出
* `map`で各要素を加工
* `join`で加工した要素を1つの文字列に結合
* `copy`で結果をクリップボードにコピー

## 環境

* Mac OSX 10.10.5
* Google Chrome 47.0.2526.106 (64-bit)
* Firefox 44.0

## 方法

### CSSセレクタで要素を抽出

まず、データの抽出を行いたいページでコンソールを開きます。

* [Navigating the Console | Web Tools - Google Developers](https://developers.google.com/web/tools/chrome-devtools/debug/console/console-ui)
* [Web コンソールを開く - 開発ツール | MDN](https://developer.mozilla.org/ja/docs/Tools/Web_Console/Opening_the_Web_Console)

抽出したい要素を取り出すためのCSSセレクタを調べます。
欲しい要素を右クリックして「検証」(Firefoxでは「要素を調査」)で比較的簡単に調べることができます。

コンソールで`$$('CSSセレクタ')`コマンドを実行するとセレクタで指定された要素が抽出されます。

例としてQiitaの新着投稿一覧を取得してみます。
[http://qiita.com/items](http://qiita.com/items)を開き、次のコマンドを実行すると新着投稿のリンクのリストが取得できます。

```js
$$('div.activities div.item-box-title > h1 > a')
```

![qiita_items01.png](https://qiita-image-store.s3.amazonaws.com/0/15114/a1cba2db-0e9d-82dd-e907-b934aef53d20.png)

### 抽出した要素の加工

HTMLのままでは扱いにくいので`map`と`join`を使ってタブ区切り形式に変換します。

```js
$$('div.activities div.item-box-title > h1 > a').map(e => e.title + '\t' + e.href).join('\n')
```

![qiita_items02.png](https://qiita-image-store.s3.amazonaws.com/0/15114/d3ced56d-95db-67f9-3f7f-ee493d4f91b6.png)

ブラウザのバージョンによっては`$$()`の結果が`Array`ではなく`NodeList`で直接`map`を使えない場合があります。
この場合は、次のように`[].map.call`を使うと同じ結果を得ることができます。

```js
[].map.call($$('div.activities div.item-box-title > h1 > a'), e => e.title + '\t' + e.href ).join('\n')
```

### クリップボードにコピー

`copy`コマンドで結果をクリップボードにコピーすることができます。（`$_`は直前の実行結果）

```js
copy($_)
```

## Tips

Chromeでは`$$()`の第2引数に要素を与えると、その要素に対してCSSセレクタを適用することができる。
（Firefoxでも動くが全体に対して適用され期待した結果が返ってこない。）

```js
$$('div.activities div.item-box').map(
  e => {
    var user = $$('span.user > a', e)[0].innerHTML.trim();
    var a = $$('h1 > a', e)[0];
    return [user, a.title, a.href].join('\t')
}).join('\n')
```

Chrome, Firefoxともに次のように書けば期待通りに動く。

```js
$$('div.activities div.item-box').map(
  e => {
    var user = e.querySelector('span.user > a').innerHTML.trim();
    var a = e.querySelector('h1 > a');
    return [user, a.title, a.href].join('\t') }
).join('\n')
```

## 参考

* [Command Line API Reference - Google Chrome](https://developer.chrome.com/devtools/docs/commandline-api)
* [Web Console - Firefox Developer Tools | MDN](https://developer.mozilla.org/en-US/docs/Tools/Web_Console)
    * [Web Console Helpers - Firefox Developer Tools | MDN](https://developer.mozilla.org/en-US/docs/Tools/Web_Console/Helpers)
MySQLの照合順序を修正する

##環境
Ubuntu14.04
Rails4.2.1
MySQL 5.5

##照合順序(collation)のお話
Rails4.2でも相変わらずDBはMySQL派です。おはぎはつぶあん派です。

MySQLはちゃんと明示しとかないと照合順序が「utf8_unicode_ci」になってしまいます。
つまりWhere句で「ハハ」を検索しても「母」も「パパ」も「婆」も一緒になっちゃうよというお話です。
「utf8_general_ci」にしないといけない。

##最初からちゃんとしなさいよ
こことか
[ActiveRecordでデフォルトの照合順序を変更する](http://qiita.com/kamipo/items/d7863f0df24916005657)
こことか
[RailsのApplication Templateでmysqlのcollation設定を追加](http://qiita.com/hnakamur/items/762db1a764fcf3583214)
ActiveRecordの初期値をちゃんと設定しなさいよ、とあります。

##でももうやっちゃったんだけど…
じゃあ、テーブルを削除してやり直してください。

…って訳には簡単にいきませんよね。運用に乗っちゃってたり。
普通はそうですね。
僕もそうでした。なのでSQLコマンドで変更しましょう。

1.Railsアプリのルートでrails dbコマンドでdatabaseに接続
`bundle exec rails db`

2.該当のテーブルhogetableのカラムの属性を確認
`mysql> SHOW FULL COLUMNS FROM hogetable¥G`

変更したいカラムhogecolumnの属性が「utf8_unicode_ci」になっている

```
************************** 3. row ***************************
     Field: hogecolumn
      Type: text
 Collation: utf8_unicode_ci
      Null: YES
       Key: 
   Default: NULL
     Extra: 
Privileges: select,insert,update,references
   Comment: 
```

3.utf8_general_ciに変更します

`mysql> ALTER TABLE hogetable MODIFY COLUMN hogecolumn TEXT COLLATE 'utf8_general_ci';`

ここで注意する点はカラムの型(Type)を変更しない場合でも、指定してあげないとエラーになります。
上のコマンドでは「COLLATE」の前の「TEXT」がこのカラムの型です。VARCHARだったりする人は適宜変えてください。
なので２項で確認したTypeをもう一度設定してあげないとダメです。

4.ちゃんと確認

`mysql> SHOW FULL COLUMNS FROM hogetable¥G`

```
*************************** 3. row ***************************
     Field: hogecolumn
      Type: text
 Collation: utf8_general_ci
      Null: YES
       Key: 
   Default: NULL
     Extra: 
Privileges: select,insert,update,references
   Comment: 

```

うむ。ちゃんと変更されているな！

##参考
[照合順序をutf8_general_ciからutf8_unicode_ciへ変更する](http://www.babamakoto.com/wp/2010/10/13-195227.html)
VmwareFusion:snapshotのクリーンアップに失敗する仮想マシンのリカバリ

VMwareFusionを利用されてWindows環境を維持されている方も多いと思われる中、他のWEB情報にはなかった自分の経験談を一つ。
ちなみにVMwareFusionのversionは7ですが、あまりバージョンは関係なさそうな事象です。


#気づいたらsnapshotの削除に失敗するようになっていた。
VMwareFusionには現在の仮想マシン環境をsnapshotという機能でバックアップする事が可能です。
しかし、ある日から間違って取ったsnapshotを削除しようとすると、"削除されたファイルをクリーンアップできません。入出力エラーです。"と表示される様になってしまいました。
しかしアプリ上見る限りsnapshotは消えています。動作も問題なし。

##仮想マシンが実行中に突然、vmdkにアクセスできませんと異常終了する
上記と関係あるかわかりませんが、仮想マシン実行中にvmdkにアクセスできません、外部媒体のスイッチが入っている確認云々とエラーメッセージが出て落ちるようになってしまいました。

#仮想マシンのパッケージファイルの中身を確認すると大量のvmdkファイル
動きが不安定なので調査開始です。
VMwareFusionでは仮想マシンのパッケージ（vmwarevm)の中に色々なファイルが作成されるのですが、その中身を見ていると
(仮想マシン名）−000001.vmdk
(仮想マシン名）-000002.vmdk
(仮想マシン名）-000003.vmdk....
と大量のvmdkファイルが。
snapshot毎に作られるファイルがそのまま残っているようです。しかし、これは取得したsnapshotが削除されれば消されるファイル。
明らかに今あるsnapshotより多い数です。

#vmdkファイルの統合を進めるが...
VMwareのナレッジを使ってvmdkファイルの統合を進めます。
http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2086712

1.自動で統合する:アプリ上からスナップショットを取って削除する
　今回は、それが前段でうまく行っていないので次。
2.手動で統合
　vmware-vdiskmanager コマンド ライン ユーティリティから実行。しかし、
```
　Convert: 5% done.Failed to convert disk: One of the parameters supplied is invalid (0x3e80).
```
　のエラーメッセージで処理中断。
3.各vmdkのエラーチェックをしてから、再度手動実行
　”統合を開始する前に、仮想ディスク ファイル (.vmdk) で修復を実行することをお勧めします。”とあり、修復コマンドを叩いてから実行するも変わらず。

#大量のvmdkファイルの中、どれかが壊れているのが原因
仕方がないので仮想マシンを作り直すか、とvmdkファイル達のバックアップをとっていたら、一部のファイルのコピーが失敗します。
```
cp: .....Windows 7.vmwarevm/Windows 7-000006.vmdk: Input/output error
```
どうやら、ファイルとしてはmac上壊れているが、VMware上ではなんとか動いてたみたい。それも解せないですが...

#破損しているファイルをコピーする
動いてはいるので、macでも扱える形にファイルをリカバリーしたい所。
ここからはvmwareではなくOSベースの話になってきました。

なんとなくファイルイメージをそのままコピーするコマンドがある様な気がして検索。やっぱりヒット。
http://superuser.com/questions/458579/copying-many-files-without-stopping-on-errors-on-osx

ddコマンドを使えば行けそうです。
ddは(dataset definition)の略らしいですが、data destroyerでもあると怖い事が書いてあります。
パス指定は慎重にと。

```
sudo dd if=コピー元パス/windows7-000018.vmdk of=コピー先パス/windows7-000018.vmdk conv=noerror,sync
```
conv=noerror指定はエラーが出ても処理を続行、syncはエラー箇所をnullで埋めてファイルサイズを維持する。
両方必須です。

#統合成功！
壊れているvmdkファイルをddでOSから取り扱えるファイルにコピーしなおして、リカバリー。
のち、パッケージ内の壊れているvmdkはリネームして、リカバリーしたvmdkファイルを配置しなおします。
あとは、"1.自動で統合する:アプリ上からスナップショットを取って削除する"を実行。
無事に大量のvmdkファイルは削除され、一つのvmdkへと統合されました。

ああ、長かった。
Webや端末から絵文字を使う方法


基本的には、使用している`unicode`バージョンによって、絵文字を端末に出力することが出来ます。出力できる絵文字の種類はバージョンに左右されます。

```bash:
$ echo -e "\xE2\x9C\xA8"
✨
```
 

絵文字のエイリアスを調べるには、以下のサイトが便利です。

http://www.emoji-cheat-sheet.com/

ただし、絵文字のエイリアスは、そのままでは端末からは使えません。そんな時は、以下の様なプラグインを使います。

https://github.com/robbyrussell/oh-my-zsh/tree/master/plugins/emoji

```bash:
$ mkidr -p ~/.zsh/plugins
$ cd ~/.zsh/plugins

$ git clone https://github.com/robbyrussell/oh-my-zsh
$ cd oh-my-zsh/plugins/emoji
$ . ./emoji.plugin.zsh
$ echo $emoji[mouse_face]
🐭
```

また、端末から調べたいのであれば、`emot`が便利です。

```bash:
$ gem install emot
$ emot show
```

自身が管理するWebサイトで絵文字を使いたい場合は、[http://git.emojione.com](http://git.emojione.com)が便利ですが、基本的には、Ruby製の[gemoji@github](https://github.com/github/gemoji)を使います。

```bash:
$ git clone https://github.com/github/gemoji
$ cd gemoji
$ bundle
$ rake emoji
$ cp scripts/console ./
$ ./console
>> Emoji.find_by_alias("cat").raw
=> "🐱"  # Don't see a cat? That's U+1F431.
```

拡張はいくつかあり、[gmac/gemoji-parser](https://github.com/gmac/gemoji-parser)などが便利です。
ImageMagickで複数の画像を重ねあわせる

# やりたいこと

透過png画像Aと透過png画像Bを重ねあわせた新しい透過png画像Cを作る

これと

![umaru.png](https://qiita-image-store.s3.amazonaws.com/0/82022/73bf9802-fcfd-6d66-a164-0747ba096203.png)

これを合わせて


![seiva.png](https://qiita-image-store.s3.amazonaws.com/0/82022/5c5adf0e-3561-0748-a2e6-f7f4404968c4.png)


こんなのを作る（全部背景透過のPNG）

![done.png](https://qiita-image-store.s3.amazonaws.com/0/82022/4cfa19e4-cd13-47f9-a019-17fb496218c7.png)

# やりかた
## 1. ImageMagickのインストール

Macであれば

```
$ brew install imagemagick
```

## 2. ライトセイバーの回転

ImageMagickのconvertコマンドでできる。
`-background`を指定しないと白背景になってしまうので必ず指定する。

```
convert -background 'rgba(0,0,0,0)' -rotate -45 saber.png saber_rotated.png
```

## 3. 合成

まず背景領域を設定して、そこに配置していく流れ。

＃ここで rotate をやろうとすると全体が回転してしまうのでやらない

```
$ convert -size 440x370 xc:none \
      umaru.png -geometry +210+110 -composite \
      saber_rotated.png -geometry +0+0 -composite \
      result.png
```

# （参考）上記をRubyでまるっとできるようにしたら苦労した

```example.rb
Image = Struct.new(:path, :point_x, :point_y, :rotate)

# umaru.pngの(115, 14)の点とsaber.pngの(25, 296)の点を重ねあわせる回転は45度
umaru = Image.new("umaru.png", 115, 14, 0)
saber = Image.new("saber.png", 25, 296, 45)

ImageComposer.new([umaru, saber]).compose
```

こんな感じで実行できるようにしたんですが、rotateすると元の点の座標が変わってしまうので、回転後の座標に直したり、全体のサイズを -size で指定してしないと行けないので計算する必要があったりと地味に面倒でした。

実際にやったのは更にいくつか条件入っていたりなのでコード載せられないのですが、久々にsinとかcosとかatan2とか使いました。

ちなみにrmagickはよくわからなかったので convert を system メソッドで実行していて、画像サイズの取得とかも必要だったのでそれもrmagickではなくfastimageを使って簡単に取得しました。
Windows Console でUDPのマルチキャスト受信

##minGW を使った、UDPのマルチキャスト受信関数
windows 7 のDOS窓で動作する関数です。

```c:udprcvmc.c
#include <stdio.h>
#include <fcntl.h>
#include <winsock.h>
#include <string.h>

int main()
{
	int sock, err;
	struct sockaddr_in addr;
	struct ip_mreq mreq;
	WSADATA wsaData;
	char buf[2048];

	// winsock2の初期化
	WSAStartup(MAKEWORD(2,0), &wsaData);

	//socketシステムコール
	//ディスクリプタsdを取得する
	//SOCK_DGRAM <- UDP, SOCK_STREAM<- TCP
	if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
		perror("socket");
		printf("error:%d\n",WSAGetLastError());
		return 1;
	}

	// 受信元アドレスとポート番号を設定する
	addr.sin_family = AF_INET;
	addr.sin_port = htons(12345);		//IPアドレスを格納したin_addr構造体
	addr.sin_addr.s_addr = INADDR_ANY;	// ポート番号(htons)でネットワークバイトオーダーに変換

	// ソケットに名前（ポート番号 & IPアドレス）を付ける
	if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
		perror("bind");
		printf("error:%d\n",WSAGetLastError());
		closesocket(sock);
		return -1;
	}

	char loopch=0;
 
	// IP_MULTICAST_LOOP<- 発信マルチキャスト・データグラムのコピーがマルチキャスト・グループ
    // のメンバーであるかぎり送信しているホストに送達されるようにするかどうかを指定します。
	if ((err=setsockopt(sock, IPPROTO_IP, IP_MULTICAST_LOOP,
		(char *)&loopch, sizeof(loopch))) < 0) {
		perror("setsockopt");
		printf("error:%d\n",WSAGetLastError());
		closesocket(sock);
		return 1;
		}

	// setsockoptは、bind以降で行う必要あり
	// 受信元アドレスとポート番号を設定する
	memset(&mreq, 0, sizeof(mreq));
	mreq.imr_interface.s_addr = INADDR_ANY;
	mreq.imr_multiaddr.s_addr = inet_addr("127.0.0.1");
	if (setsockopt(sock,
		IPPROTO_IP,
		IP_ADD_MEMBERSHIP,	//受信
		(char *)&mreq, sizeof(mreq)) != 0) {
			perror("setsockopt");
			printf("error:%d\n",WSAGetLastError());
			return 1;
 	}

	int recv_len;
	struct sockaddr_in from;
	int sockaddr_in_size = sizeof(struct sockaddr_in);

	while(1){
		memset(buf, 0, sizeof(buf));
		recv_len = recvfrom(sock, buf, sizeof(buf), 0, (struct sockaddr *)&from, &sockaddr_in_size);
		printf("recv: '%s'(%d) from %s:%d\n", buf, recv_len, inet_ntoa(from.sin_addr), ntohs(from.sin_port));
	}

	// 接続を切断する
	closesocket(sock);
	WSACleanup();
	return 0;
}


```
コンパイル
> gcc udprcvmc.c libwsock32.a
ESP8266 (ESP-WROOM-02) の便利ライブラリまとめ (EEPROM編)

## 概要
ESP8266 (以下 WROOM02) のプログラムにあたり、標準ライブラリの使い方まとめ。EEPROM編。



## はじめに
WROOM02 (Arduino) でコーディングしていると、値を保存しておいて、次回の起動時にもその値を使いたいことがありますよね。うん、あるある。
不揮発なメモリ処理をいい感じにやってくれる EEPROM というクラスが標準であるので、その使い方まとめです。

リアルな外付けの EEPROM に対するドライバではなくて、WROOM02 搭載の不揮発メモリを、仮想的な EEPROM として扱うライブラリになります。

WROOM02 は 4MB の不揮発(フラッシュ)メモリを積んでいるので、それを操作することになります。

なお、リアルな外付けの EEPROM を使う場合は、以下がとても参考になります。
http://playground.arduino.cc/Code/I2CEEPROM

## 使い方
### インクルード

```cpp
#include <EEPROM.h>
```
Mac では、上記の実態は以下にあります。
~/Library/Arduino15/packages/esp8266/hardware/esp8266/2.0.0/libraries/EEPROM/EEPROM.h
~/Library/Arduino15/packages/esp8266/hardware/esp8266/2.0.0/libraries/EEPROM/EEPROM.cpp

### 簡単な例

初期化

```cpp
  // 使用するサイズを宣言する
  EEPROM.begin(100);
```

書き込み

```cpp
  uint8_t val = 32; // 保存したい値

  // 0 : EEPROM の先頭アドレス
  EEPROM.write(0, val);

  // コミット
  // (コミットで内蔵フラッシュメモリに、実際に書き込みます)
  EEPROM.commit();
```

読み込み

```cpp
  // 0 : EEPROM の先頭アドレス
  uint8_t val = EEPROM.read(0);
```


### 実用的な例
 - uint8_t 型ではなくて、任意の型を保存・読み込みできると便利です。
 - その場合、template 版の関数を使えばOKです。


例えば、WiFi 接続のための、SSID と Password を保存する場合
( * 初回は何も表示されず、2回目は初回に保存されたSSID/Passwordを表示するだけのサンプルです。)
( * なので、このスケッチ自体には意味は無いです。)

```cpp
#include <EEPROM.h>

struct CONFIG {
  char ssid[32];
  char pass[32];
};

void setup() {
  Serial.begin(115200);
  while (!Serial);
  Serial.println("");

  EEPROM.begin(100);

  CONFIG buf;
  EEPROM.get<CONFIG>(0, buf);
  Serial.println(buf.ssid);
  Serial.println(buf.pass);

  strcpy(buf.ssid, "Your SSID");
  strcpy(buf.pass, "Your Password");
  EEPROM.put<CONFIG>(0, buf);
  EEPROM.commit();
}

void loop() {
}
```

## まとめ

 - <a href="http://qiita.com/exabugs/items/2f67ae363a1387c8967c" target="_blank">ESP8266 (ESP-WROOM-02) でWi-Fi使用時のSSID/パスワードをブラウザで設定できるように</a> では、ファイルシステム (SPIFFS) を使って SSID/Password を保存しましたが、この EEPROM を使ってもいいですね。

 - リアルな外付けの EEPROM を使う場合、Wire(I2C)ライブラリの制限から、一度にやり取りできるデータサイズが制限されます。そういった場合に、内蔵の EEPROM をキャッシュとして使うことが考えられます。


## 参考
全関数を載せておきます。

#### 基本操作
```cpp
  void begin(size_t size);
  uint8_t read(int address);
  void write(int address, uint8_t val);
  bool commit();
  void end();

  uint8_t * getDataPtr();
```

#### テンプレート版
```cpp
  template<typename T>  T &get(int address, T &t);
  template<typename T>  const T &put(int address, const T &t);
```
mbed warningを抑止

#warningが発生

通信のデータフォーマットをstructで定義していて、Idをenum、（通信量を減らすために）enumをuint8_tにすると、

```cpp
enum ComputerPacketId : uint8_t
{
	COMPUTER_PACKET_CMD_GET_STATUS,
	COMPUTER_PACKET_CMD_SET_SOLENOIDS,
	COMPUTER_PACKET_CMD_END,
	COMPUTER_PACKET_RES_GET_STATUS,
	COMPUTER_PACKET_RES_SET_SOLENOIDS,
};
struct ComputerPacket
{
	uint8_t Sequence;
	ComputerPacketId Id;
	uint8_t Checksum;
	uint8_t DataSize;
	uint8_t Data[10];
};
```

コンパイルでwarningが発生します。
> Warning: Explicit enum base types are a C++11 feature in "Computer.h", Line: 9, Col: 24

![20160130B.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/309e2e5d-a822-dd1a-eb2a-63c90dce26e3.png)

#warningを抑止するには？
[pragma diag_suppress](http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0348bj/CIHECIAD.html)で出来るみたい。

#tag？
pragma diag_suppressでtagを指定したいのですが、警告のエラー番号が分からないorz

エクスポートしてオフラインコンパイルすると、エラー番号が分かりました。(^^)/
> Computer.h(9): warning:  #3641-D: explicit enum base types are a C++11 feature

#warning抑止
```cpp
#pragma push
#pragma diag_suppress 3641	// explicit enum base types are a C++11 feature
enum ComputerPacketId :
uint8_t {
    COMPUTER_PACKET_CMD_GET_STATUS,
    COMPUTER_PACKET_CMD_SET_SOLENOIDS,
    COMPUTER_PACKET_CMD_END,
    COMPUTER_PACKET_RES_GET_STATUS,
    COMPUTER_PACKET_RES_SET_SOLENOIDS,
};
#pragma pop
```
Hyper-V上のUbuntuの解像度を変更する

Hyper-V上にUbuntuをダウンロードしたところ、画面サイズを変更できなくて困ったので、解像度を変更する方法をメモ。

使用しているUbuntuのバージョンは15.10(Wily Werewolf)。

アプリケーションの「ディスプレイ」から解像度を変更しようにも、プルダウンで変更できないため、*grub*を書き換えて再起動してやる必要がある。

```
$ sudo vi /etc/default/grub
$ sudo update-grub
$ sudo reboot
```

```bash:/etc/default/grub
<省略>
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash video=hyperv_fb:1920x1080"
<省略>
```

*video=hyperv_fb:*の後に設定したい解像度を書けば、画面サイズを任意のものに変更できる。
Railsの余り使われてなさそうな機能 generator_generator


Railsのコードを追いかけていたら、`railties/lib/rails/generators/rails/generator/generator_generator.rb`なるファイルを発見しました。

このフォルダ内には`rails generate`コマンドが集めてあるので、`generator_generator.rb`ということは、これを使えばgeneratorを生成出来そうです。
と言うわけで、

```
rails g generator hoge

Running via Spring preloader in process xxxx
      create  lib/generators/hoge
      create  lib/generators/hoge/hoge_generator.rb
      create  lib/generators/hoge/USAGE
      create  lib/generators/hoge/templates
      invoke  test_unit
      create    test/lib/generators/hoge_generator_test.rb
```

おお、動いた。

作られるファイルはこんな感じ。

```lib/generators/hoge/hoge_generator.rb
class HogeGenerator < Rails::Generators::NamedBase
  source_root File.expand_path('../templates', __FILE__)
end
```

```lib/generators/hoge/USAGE
Description:
    Explain the generator

Example:
    rails generate hoge Thing

    This will create:
        what/will/it/create
```

```test/lib/generators/hoge_generator_test.rb
require 'test_helper'
require 'generators/hoge/hoge_generator'

class HogeGeneratorTest < Rails::Generators::TestCase
  tests HogeGenerator
  destination Rails.root.join('tmp/generators')
  setup :prepare_destination

  # test "generator runs without errors" do
  #   assert_nothing_raised do
  #     run_generator ["arguments"]
  #   end
  # end
end
```

`lib/generators/hoge/hoge_generator.rb`にコマンドを書いていけばいいらしい。
ファイルを生成する場合、テンプレートは`lib/generators/hoge/templates`に入れればいいらしい。

…ところで、何に使えばいいんだろうか…
windowsのgit-credentialでユーザ名パスワード入力を簡略化する

## 何度もパスワードを求められてうるさいので簡略化する

何も考えないというのであれば以下のような形で良いのだが

```
git config credential.helper store
```

これだと平文で保存されてしまう。(~./gitcredential というファイルにパスワードもそのまま保存されている)

セキュリティ的に安心したいのでもう少し違うパターンを試す。
どうやらwindowsには他のcredential.helperがあるらしい。
しかし、windowsの場合はexeを落としてこないと行けないらしい
http://gitcredentialstore.codeplex.com/releases/view/106064

ダウンロードしてきた後、exeを叩く。
cygwinを起動して、認識されているかを見る

```
git help -a | grep credential-

  credential-cache          remote-ftp
  credential-cache--daemon  remote-ftps
  credential-store          remote-http
  credential-winstore
```
こんな感じで出てきたら次に.gitconfigに以下を追加する

```
[credential]↲
  helper = winstore↲
```
設定は以上。
本当に聞かれないか確かめる。

```
$ git pull
```
![credential.png](https://qiita-image-store.s3.amazonaws.com/0/75299/ed3e37d9-5e6c-f0f7-5677-dc6cc7607800.png)
まずは、最初にこんな感じのダイアログがでてきたので入力する。

```
Already up-to-date.
```
認証できたようです。
もう一度やってみると、ダイアログが出てこない。

```
$ git pull
Already up-to-date.
```
再度聞かれなかったので、どうやら、できたようです。

### 補足
実際じゃあどこにパスワードとか保存されてるんだということですが 、[git を https 経由で使うときのパスワードを保存する] 
(http://qiita.com/usamik26/items/c655abcaeee02ea59695)によると

> Internet Explorer などと同じ場所にパスワードが保存され、以後はパスワード入力が不要になります。

ということです。

### 参考
https://ja.confluence.atlassian.com/bitbucketserver/permanently-authenticating-with-git-repositories-776639846.html
http://qiita.com/usamik26/items/c655abcaeee02ea59695