OmniAICreator/Qiita-1.07M huggingface dataset:
温度センサー ADT7410をArduinoで制御する(I2C)


# ADT7410



# Datasheet

[Datasheet ADT7410](http://www.analog.com/media/en/technical-documentation/data-sheets/ADT7410.pdf)

# 計測可能な値

| 種類 | 概要 |
|:--|:--|
| 温度 | 温度精度は±0.5℃。-40℃～+105℃（2.7V～3.6V）の範囲。-40℃～+105℃の範囲で計測可能。16ビットの値を取得可能。分解能は0.0078℃。 |


# Slave address

| Slave Address | 0x48 |
|:--|:--|

# Register map

| Address | Name | Type | Default |概要 |
|:--|:--|:--|:--|:--|
| 0x00 | TEMP_MSB | R | 00000000 | 温度 MSB |
| 0x01 | TEMP_LSB | R | 00000000 | 温度 LSB |
| 0x02 | STATUS | R | 00000000 | ステータス |
| 0x03 | CONFIGURATION | R/W | 00000000 | Configuration |
| 0x04 | THIGH_MSB | R/W | 00100000 | THIGH MSB |
| 0x05 | THIGH_LSB | R/W | 00000000 | THIGH LSB |
| 0x06 | TLOW_MSB | R/W | 00000101 | TLOW MSB |
| 0x07 | TLOW_LSB | R/W | 00000000 | TLOW LSB |
| 0x08 | TCRIT_MSB | R/W | 01001001 | TCRIT MSB |
| 0x09 | TCRIT_LSB | R/W | 10000000 | TCRIT LSB |
| 0x0A | THYST_MSB | R/W | 00000101 | THYST setpoint |
| 0x0B | ID | R/W | 1100xxxx | ID |
| 0x2F | RESET | R/W | 00000000 | Software reset |

# Who_am_i_reh

| ID | 0x0B |
|:--|:--|

ADT7410の場合、0xCXが返ってくる。

```cpp:arduino
#define ADT7410_WHO_AM_I_REG 0x0B

#define ADT7410_DEVICE 0xC0

bool searchDevice()
{
  byte device = 0x00;
  readI2c(ADT7410_WHO_AM_I, 1, &device);

  if((device && ADT7410_DEVICE) == ADT7410_DEVICE){
      return true;
  } else{
      return false;
  }
}
```

# Configuration

| CONFIGURATION | 0x03 |
|:--|:--|


| Bit7 | Bit6 | Bit5 | Bit4 | Bit3 | Bit2 | Bit1 | Bit0 |
|:--|:--|:--|:--|:--|:--|:--|:--|
| Resolution |Operation mode| Operation mode | INT/CT mode | INT pin | CT pin　| Fault | Fault |

## Fault

| Bit1 | Bit0 | Fault |
|:--|:--|:--|
| 0 | 0 | 1 fault (default).|
| 0 | 1 | 2 faults. |
| 1 | 0 | 3 faults. |
| 1 | 1 | 4 faults. |

## CT pin 
polarity This bit selects the output polarity of the CT pin.

- 0 active low
- 1 active high

## INT pin 
polarity This bit selects the output polarity of the INT pin.

- 0 active low.
- 1 active high.

## INT/CT mode 
This bit selects between comparator mode and interrupt mode.

- 0 interrupt mode
- 1 comparator mode

## Operation mode 
These two bits set the operational mode for the ADT7410.

| Bit6 | Bit5 | 操作 |
|:--|:--|:--|
| 0 | 0 | continuous conversion (default) |
| 0 | 1 | one shot. Conversion time is typically 240 ms.|
| 1 | 0 | 1 SPS mode. Conversion time is typically 60 ms. |
| 1 | 1 | shutdown. |

## Resolution 
This bit sets up the resolution of the ADC when converting.

- 0 = 13-bit resolution. Sign bit + 12 bits gives a temperature resolution of 0.0625°C.
- 1 = 16-bit resolution. Sign bit + 15 bits gives a temperature resolution of 0.0078°C
Arrayを108個の煩悩で満たす4つの方法　あるいは同値繰り返しArrayの初期化について

## 方法1:リテラル

```swift
["煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩", "煩悩"]
```

最悪ですね。
本当に108個あるのか不安だし、修正もしづらいし、見た目も美しくない。

## 方法2:for文

```swift
var array = [String]()
for _ in 0..<108 {
    array.append("煩悩")
}
```

個数が明示できました。でもちょっと冗長かな。mutableなのもちょっと…できればletだけで書きたいなー。

## 方法3:map

```swift
(0..<108).map { _ in "煩悩" }
```

高階関数いいっすねー！　Swiftっぽい！
じゃあこれでいきましょ…
え、何？

## 方法4: Arrayのイニシャライザ

```swift
Array(count: 108, repeatedValue: "煩悩")
```

こんなイニシャライザがあった…だと…!?

## 結論

ドキュメントはちゃんと読みましょう。
MongoDBにJSファイルからコレクション作成

# やりたいこと
コレクションの中身をあらかじめJSファイルに書いてMongoDBに突っ込む

# 前提

- CentOS6
- MongoDB v3.2.0

# 手順

## JSファイル作成

```js
// collection.js
db.collectionname.drop();

// コレクションの中身を変数に
var content = [{
    "foo": "foo1",
    "bar": "bar1"
}, {
    "foo": "foo2",
    "bar": "bar2"
}]

db.collectionname.save(content);
```

- MongoDBのsaveメソッドの挙動については以下参照

[What is the difference between save and insert in Mongo DB?](http://stackoverflow.com/questions/16209681/what-is-the-difference-between-save-and-insert-in-mongo-db)

## MongoDBに突っ込む

```bash
mongo # Mongoシェルに入る
use test 
load("absolutepath_to_file/collection.js")

# 成功したら true が出力される
```
気圧センサー MPL115をArduinoから制御する(I2C)

# Datasheet
[MPL115 Datasheet](http://cache.freescale.com/files/sensors/doc/data_sheet/MPL115A2.pdf)


# 計測可能な値

| 種類 | 概要 |
|:--|:--|
| 気圧 | 50kPa(49.34気圧)〜115kPa(113.49気圧)の相対的な気圧。分解能は0.15kPa。精度は±1kPa(0.98気圧)。 |
| 温度　 | シングルタップ／ダブル・タップを検出 | 

> 1 気圧（標準大気圧）(atm)
> = 1.01325 bar
> = 1013.25 mbar
> = 1013.25 hPa

# Slave address

| Slave Address | 0x60 |
|:--|:--|

# Register map

| Address | Name | Type | Default |概要 |
|:--|:--|:--|:--|:--|
| 0x00 | Padc_MSB | R || 10-bit Pressure ADC output value MSB  |
| 0x01 | Padc_LSB | R || 10-bit Pressure ADC output value LSB(2bit) |
| 0x02 | Tadc_MSB | R || 10-bit Temperature ADC output value MSB  |
| 0x03 | Tacd_LSB | R || 10-bit Temperature ADC output value LSB(2bit) |
| 0x04 | a0_MSB | R || a0 coefficient MSB  |
| 0x05 | a0_LSB | R || a0 coefficient LSB  |
| 0x06 | b1_MSB | R || b1 coefficient MSB  | 
| 0x07 | b1_LSB | R || b1 coefficient LSB  |
| 0x08 | b2_MSB | R ||  b2 coefficient MSB  |
| 0x09 | b2_LSB | R || b2 coefficient LSB  |
| 0x0A | c12_MSB | R || c12 coefficient MSB  |
| 0x0B | c12_LSB | R || c12 coefficient LSB  |
| 0x12 | CONVERT | R || Start Pressure and Temperature Conversion |

# 気圧を求める計算式

<img width="343" alt="mpl115_calc.png" src="https://qiita-image-store.s3.amazonaws.com/0/63450/e3d4aa45-453c-c4fc-c115-88668a992440.png">
技術英語 > The Bridge is on Deck1. Engineering is on Deck 11. Deck 6 [is halfway in between], right? / the exact halfway

@ Star Trek Voyager > TWISTED

船の構造についてキムが

> The Bridge is on Deck1. Engineering is on Deck 11. Deck 6 <font color=red>is halfway in between</font>, right?

この例では6は「ちょうど中間」となっている。(1+11)/2 = 6.

Deck 7なども halfway in between と言って良いのか疑問に思った。

なお、in betweenは２つの間にあるもので、このフレーズは何回か使ったことがある。

<hr>

http://www.whatshalfway.com/
> Find the exact halfway point by time or distance and then choose a venue to meet or stop at.

丁度中間という場合は the exact halfway で良さそうだ。

しかし、リンク先のページは微妙だ。
カラーセンサーs11059をArduinoから制御する(I2C)

# s11059


# Datasheet

[s11059 Datasheet](http://www.hamamatsu.com/resources/pdf/ssd/s11059-02dt_etc_kpic1082j.pdf)

# 計測可能な値

| 種類 | 概要 |
|:--|:--|
| Red/Blue/Green/赤外 | Red (λp=615 nm)、Green (λp=530 nm)、Blue (λp=460 nm)と赤外(λp=855 nm)のそれぞれに感度をもち、検出結果は各色16ビットのデジタル値で出力 |

# Slave address

| Slave Address | 0x2A |
|:--|:--|

# Register Map

| Address | Name | Type | Default |概要 |
|:--|:--|:--|:--|:--|
| 0x00 | CTRL | R/W | 00010110 | コントロール |
| 0x01 | MANUAL1 | R/W | 00001100(0x0C) | マニュアルタイミングレジスタ |
| 0x02 | MANUAL2 | R/W | 00110000(0x30) | マヒュアルタイミングレジスタ |
| 0x03 | RED1 | R | 00000000 | 赤 |
| 0x04 | RED2 | R | 00000000 | 赤 |
| 0x05 | GREEN1 | R | 00000000 | 緑 |
| 0x06 | GREEN2 | R | 00000000 | 緑 |
| 0x07 | BLUE1 | R | 00000000 | 青 |
| 0x08 | BLUE2 | R | 00000000 | 青 |
| 0x09 | IR1 | R | 00000000 | 赤外 |
| 0x0A | IR2 | R | 00000000 | 赤外 |

# Who_am_I

デバイス名を取得できるレジスターはなし

# Configuration

| CTRL | 0x00 |
|:--|:--|


| Bit7 | Bit6 | Bit5 | Bit4 | Bit3 | Bit2 | Bit1 | Bit0 |
|:--|:--|:--|:--|:--|:--|:--|:--|
| ADCリセット |スリープ機能| スリープ機能<br>(モニタ) | 0 | ゲイン | 積分モード　| 積分時間| 積分時間 |

## ADCリセット
1にする事で、ADC部がリセットされる(レジストデータはリセットされない)。0にする事で、動作が開始される。

- 1 リセット
- 0 動作開始

## スリープ機能
ビットを1にする事で、待機モードに。0にすると動作する。

- 1 待機モード
- 0 動作マード

## ゲイン
ゲイン比率は10倍。

- 1 Highゲイン
- 0 Lowゲイン

## 積分モード
マニュアル計測モードは、一度計測すると待機モードに移行する。固定設定モードは、測定は継続的に繰り返される。

- 1 マニュアル設定モード
- 0 固定設定モード

## 積分時間設定

| Bit1 | Bit0 | 積分時間設定 |
|:--|:--|:--|
| 0 | 0 | 87.5us |
| 0 | 1 | 1.4ms |
| 1 | 0 | 22.4ms |
| 1 | 1 | 179.1ms |
Wordpressの表示をRedisでキャッシュし、高速化する（Amazon Linux）


## 動作確認環境

AWSのEC2（Amazon Linux）で確認しました。

元サイトの[Lightning Fast WordPress with Nginx + Redis](http://www.jeedo.net/lightning-fast-wordpress-with-nginx-redis/)ではNginx+php-fpm+redis と書いてありますが、Apacheでもちゃんと動いています。

## Redis Install

[amazon linux redis install](http://qiita.com/azusanakano/items/3de81c292117d291123c)
に記事を書いてあります。

## PHPファイルダウンロード

RedisのPHPクライアントライブラリ（a flexible php client library for redis.）
[predis.php](http://uploads.staticjw.com/ji/jim/predis.php)

Wordpress、Redis連携PHPファイル
[wp-index-redis.zip](http://www.jeedo.net/downloads/wp-index-redis.zip)

ここでは``wget``で取得しています。

```bash
### Wordpressのルートフォルダへ移動
 cd /var/www/wordpress  
 
### 高速化ファイルをWordpressのルートフォルダに取得
 wget http://uploads.staticjw.com/ji/jim/predis.php
 wget http://www.jeedo.net/downloads/wp-index-redis.zip
```


## PHPファイルインストール

上記、操作の続きです。

```bash
### 解凍
 unzip wp-index-redis.zip
 
### 権限設定を調整
 sudo chown apache.apache wp-index-redis.php 
 sudo chown apache.apache predis.php 
 sudo chmod 644 wp-index-redis.php 
 sudo chmod 644 predis.php 
 
### Wordpressの index.phpを to_index.phpにリネーム
 sudo mv index.php to_index.php
 
### Wordpress Redis連携高速化PHPを wp-index-redis.phpを index.phpにリネーム
 sudo mv wp-index-redis.php index.php
```

## Apache or Nginx再起動

Webサーバを再起動します。
PHPファイルの置き換えなので、即反映されるはずですが、一応再起動しておきました。

```bash
$ sudo service nginx restart
```
or 

```bash
$ sudo service httpd restart
```

## 参考URL

[Wordpress の表示速度を驚くほど高速化させる方法！〜Redis連携](http://beautifulajax.dip.jp/?p=667)

[Lightning Fast WordPress with Nginx + Redis](http://www.jeedo.net/lightning-fast-wordpress-with-nginx-redis/)

## 対訳 注意事項

1. Pages are not cached when you are logged in.
 ログイン中はキャッシュされません。


2. Cached pages do not expire not unless explicitly deleted or reset (deleting the  entire domain cache).
 ページキャッシュは明示的に消すかリセットかけるまで残りつづけます


3. Appending a ?c=y (e.g. domain.com/?c=y) to a url deletes the entire cache of the domain. Only works when you are logged in.
 URlに?c=yを追加すると（例. `http://www.example.com/?c=y` ）、そのドメインに対する全キャッシュをクリアします。ただし、ログインしている時に限りこの機能は有効。


4. Appending a ?r=y to a url deletes the cache of that url.
 ?r=y としたら、そのページのキャッシュをクリアします。（例. `http://www.example.com/?p=130?r=y` )


5. Refreshing (F5) a page deletes the cache of that page.
 F5キーでリフレッシュをかけたらキャッシュを消します。


6. Script still works even if allow_fopen is disabled in php.
 PHPの設定で allow_fopenが disabled でも、Scriptはちゃんと機能します。


7. Submitting a comment deletes the cache of that page.
 コメントが投稿された際にはキャッシュはクリアされます。


8. Includes a debug mode, stats are displayed at the bottom most part after . Won’t be deleted by CloudFlare.
 デバッグモードの時、最下部に状態が表示されます。CloudFlareでは削除されません。

※英語はそれほど上手でないので、正しく翻訳できているかはわかりません。
AndroidStudioでのRadioButtonについて

選択したRadioButtonのandroid:text=の値をSQLiteのデータベースに
保存したいんですがやり方が解りません。
どうすればいいですか?

MainActivity.java


 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        MyOpenHelper helper = new MyOpenHelper(this);
        final SQLiteDatabase db = helper.getWritableDatabase();

        final EditText nameText = (EditText) findViewById(R.id.editName);
        final EditText ageText = (EditText) findViewById(R.id.editAge);
        final EditText doText =(EditText)findViewById(R.id.editDo);
        final RadioGroup Waketa = (RadioGroup)findViewById(R.id.Bunrui);


        Button entryButton = (Button) findViewById(R.id.insert);
        entryButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String name = nameText.getText().toString();
                String age = ageText.getText().toString();
                String doing = doText.getText().toString();

                ContentValues insertValues = new ContentValues();
                insertValues.put("name", name);
                insertValues.put("age", age);
               insertValues.put("doing", doing);
                db.insert("person", name, insertValues);

            }

activity_main.xml

       <RadioGroup
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/Bunrui">

            <RadioButton
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:text="赤"
                android:onClick="onClickRadioButton"
                android:id="@+id/Syou1"/>
            <RadioButton
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:text="青"
                android:onClick="onClickRadioButton"
                android:id="@+id/Syou2"/>
            <RadioButton
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:text="白"
                android:onClick="onClickRadioButton"
                android:id="@+id/Syou3"/>
            <RadioButton
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:text="黒"
                android:onClick="onClickRadioButton"
                android:id="@+id/Syou4"/>
        </RadioGroup>
        <Button
            android:id="@+id/insert"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_below="@+id/editAge"
            android:text="登録" />

大体、関連しそうな部分は此処かと思っているのですが？
JavaFXでHello Worldを出すまで

#もろもろ設定
Javaを使ってgifアニメーションを作ってみたいと思い、いろいろ調べていくと、JavaFXというものを使えばできるようであったのでまずJavaFXを用いて"Hello World"の入った小窓を出すことにしました。

環境は
Javaのバージョン：1.8.0_72
eclipse：Mars（4.5.1）
OS：Windows vista@Business 32bit
CPU：Intel(TM)2 Duo
です。

#コード
そうしてまず打ち込んだのが以下のコード。
`
import javafx.application.Application;
import javafx.stage.Stage;
public class MessageBoard extends Application {
    public void start(Stage stage) {
        stage.setTitle("Hello World");
        stage.show();
	}
	public static void main(String[] args) {
		launch(args);
	}
}
`

#ドライバver上げ
これを実行させたところ、コンソールにて、
`Device "Mobile Intel(R) 4 Series Express Chipset Family" (\\.\DISPLAY1) initialization failed : 
WARNING: bad driver version detected, device disabled. Please update your driver to at least version 8.15.10.2302
`と吼えられました。

どうやらドライバのバージョンが古いのでアップデートしなければならないようです。僕のバージョンは7.15.10.1554でしたが、8.15.10.2302以上に上げねばならないようです。
Intelのサイトに行って8.15.10.2555のバージョンをインストールしました。
https://downloadcenter.intel.com/ja/search?keyword=8.15.10.2555
インストールして、再起動を行ったら無事実行することができました。

想定の10倍くらい時間がかかりましたが、Hello Worldと書かれた小窓との対面をはたすことができ満足です。

#余談
私のPCは大学の生協にて2009年度入学者向けに売られたものです。
なので、その時に生協でパソコンを購入したのであれば、JavaFXを動かす際にドライバのバージョンアップが必要であるものと思われます。
今考えると2009年4月にvista入ったPC買うとか馬鹿げているというか、ついてないです。（win7、2009年下旬リリース）
Dynamoがlocalで実行できる事を知ったので、Docker Container上で動かせるようにして、公開してみたお話。

## DynamoDB localについて

[（公式ドキュメント）DynamoDB Local](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Tools.DynamoDBLocal.html) 色々かかれています。  
今回はこちらを元に書き進めます。

## DynamoDB local実行に必要な環境

### OS

`Ubuntu`

### Pakages

* `openjdk-7-jdk`
* `wget`

### 構築手順

Dynamo DBを配置

```
$ mkdir /usr/local/ddlocal
$ cd /usr/local/ddlocal
$ wget http://dynamodb-local.s3-website-us-west-2.amazonaws.com/dynamodb_local_latest.tar.gz
$ tar zxvf dynamodb_local_latest.tar.gz
```

データ配置用ディレクトリ作成

```
$ mkdir /usr/local/ddlocal/db
```

実行

```
$ export JAVA_HOME /usr/lib/jvm/java-7-openjdk-amd64
$ java -Djava.library.path=/usr/local/ddlocal/DynamoDBLocal_lib -jar /usr/local/ddlocal/DynamoDBLocal.jar -port 8080 -dbPath /usr/local/ddlocal/db
```

### 確認

```
$ aws dynamodb list-tables --endpoint-url http://localhost:8080
{
  "TableNames": []
}
```

## さて、Dockerに置き換えてみましょうか

https://github.com/shinofara/dynamodb-local  
githubにサンプルソースを上げてます。

[README.md](https://github.com/shinofara/dynamodb-local/blob/master/README.md)に書いてますが一応

### 注意

当手順は、`docker-compose` and `docker-machine` を使うことを前提に書いていますので、ソレ以外の場合は、置き換えてお使いください！

### 環境準備

```
$ git clone git@github.com:shinofara/dynamodb-local.git
$ cd dynamodb-local
```

Dockerイメージ作成

```
$ docker-compose build
```

containerを立ち上げましょう

``` 
$ docker-compose up
dynamo_1 | Initializing DynamoDB Local with the following configuration:
dynamo_1 | Port:        8080                                            
dynamo_1 | InMemory:    false                                           
dynamo_1 | DbPath:      /usr/local/ddlocal/db                           
dynamo_1 | SharedDb:    false                                           
dynamo_1 | shouldDelayTransientStatuses:        false                   
dynamo_1 | CorsParams:  *                                               
dynamo_1 |   
```

8080ポートで立ち上がりましたね。  
今回は、`docker-machine` 上に立ち上げてますので、 `localhost` でアクセスできません。  
事前にIPを確認

```
$ docker-machine ip [環境]
192.168.99.100
```

僕の場合は `192.168.99.100` でした。

### 軽く触ってみます。

テーブル一覧確認

```
$ aws dynamodb list-tables --endpoint-url http://192.168.99.100:8080
{
  "TableNames": []
}
```

ない！

つくろう

```
$ aws dynamodb create-table --endpoint-url http://192.168.99.100:8080 --table-name test --attribute-definitions AttributeName=testId,AttributeType=S --key-schema AttributeName=testId,KeyType=HASH --provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1
```

つくった。確認

```
$ aws dynamodb list-tables --endpoint-url http://192.168.99.100:8080
{
    "TableNames": [
        "test"
    ]
}
```

出来た！

## 最後に

今回は、`DynamoDB` を `Docker` 上に作成するところまででしたので、`awscli` で Dynamoをもっと触りたい人は色々調べてみてください！
CocoaPodsがなんか上手く行かなかったらやること3つ

# CocoaPodsがなんか上手く行かなかったらやること3つ

あーだめだ。なんかわからんが全然うまく行かねぇ。って時にやることメモ。

## その1. cleanビルド
基本ですね
<img width="185" src="https://qiita-image-store.s3.amazonaws.com/0/72271/fdfbb30e-21b3-ab25-1790-a1df39e3619c.png">
ちなみに、Productメニューを開いている際にoptionキーを押すと、Derived Dataごと消せる、「Clean Build Folder...」に変化します。

## その2. とにかく一旦リセット
pod install すると生成される以下のファイルを消して再度実行してみる

```
$ rm -rf hogefuga.xcworkspace/
$ rm Podfile.lock
$ rm -rf Pods/
```
> 2016/01/31 追記：
> 各ターゲットのGeneral \> Linked Frameworks and LibrariesのPods.frameworkも削除したほうがいいっぽい。
> <img width="694" src="https://qiita-image-store.s3.amazonaws.com/0/72271/e4e8df3f-3091-1d7a-d207-a46d93b6cb2d.png">
> .xcodeproj内にも以前のターゲット状態を元にした情報が残ってるとかなんでしょうかね。うーん。

## その3. Project設定のConfigurationsとPodfileと見比べてみる
Extensionがある場合など、ターゲット毎にライブラリを指定していると、Configurationsがごっちゃごちゃになっていたりする。
例えば、Podfileを以下のような感じで書いていたとすると…

```
platform :ios, '8.0'
use_frameworks!

target:keyboard, :exclusive => true do
    pod 'HogeLibraryA'
end

target:keyboardextension, :exclusive => true do
    pod 'HogeLibraryB'
end
```

以下のように、Project＞Info＞Configurations が **Pods-\<target名\>.debug** / **Pods-\<target名\>.release**となっているのが正解らしい。

<img width="676" src="https://qiita-image-store.s3.amazonaws.com/0/72271/c93a2176-b40c-7431-9c4e-982e41b79916.png">

ライブラリを指定していないターゲットは、素直に Pods.debug / Pods.release が設定されるっぽい。

自分の場合、pod installで以下のエラーが出たりしてハマったものの、

```
[!] CocoaPods did not set the base configuration of your project because your project already has a custom config set.
```

その後手動で上記画像のようなConfigurationsに設定し直すと、ビルドが通った。
（その後、pod installし直すと、上記のエラーがなくなった。手動でやってみた設定も上書きされることはなかった。）
Macでシェルスクリプトを .appアイコン化する方法

JMeterをインストールした際、起動シェルをアイコン化したかったので備忘録。

### Automator を起動
Launchpad を起動し、検索窓から「Automator」を探して起動します。
![01.png](https://qiita-image-store.s3.amazonaws.com/0/104535/ecc64fa2-d215-3ae9-04ce-322f6f6b3f5e.png)
  
Automator のメニューから、ファイル ＞ 新規 で、「アプリケーション」を選択します。  
![02.png](https://qiita-image-store.s3.amazonaws.com/0/104535/dce2a69c-b1c5-1006-71d4-e940622e7cd4.png)

リストから「シェルスクリプトを実行」を選択し、ドラッグします。  
![03.png](https://qiita-image-store.s3.amazonaws.com/0/104535/35776a93-990d-66d0-b632-e977be56c063.png)

### 起動シェルのパス指定
起動するシェルのフルパスを指定します。
Finderを開いて対象のシェル（今回は jmeter.sh)を、枠内にドラッグでも構いません。
なお、デフォルトで ”cat” と文字が挿入されてるのでこれは削除しましょう。  
![04.png](https://qiita-image-store.s3.amazonaws.com/0/104535/ad2d5a3b-be42-800b-bfee-1446c1c92fd0.png)

### 起動シェルを確認して変更します。
シェルスクリプトの先頭行を確認し、起動するシェルを指定します。
jmeter.sh の先頭行は ```#! /bin/sh``` なので、プルダウンから"/bin/sh"を選択します。
![05.png](https://qiita-image-store.s3.amazonaws.com/0/104535/26a69e8b-1ac2-235b-9135-11a2545c4f49.png)

### .appの保存
メニューから、ファイル　＞　保存 を選択します。
格納先は「アプリケーション」とし、好きな名前を指定して保存します。  
![06.png](https://qiita-image-store.s3.amazonaws.com/0/104535/cdfb5a97-0c71-4aa2-be03-67807fd2dae3.png)

### .appの起動確認
これでアプリとして追加されてるので、Launchpad などから起動してみましょう。

### アイコンの変更
作成したアプリのアイコンは「Automater」のアイコンとなってます。
アプリを Ctrlキーを押しながらクリックし「情報を見る」を選択します。
![07.png](https://qiita-image-store.s3.amazonaws.com/0/104535/88c0a4b2-246c-49e4-1c6a-80da686b5448.png)

ボックスの上部にアイコンに、直接画像をドロップすると変更できます。
今回はApache JMeterのロゴをHPからドロップしました。

![08.png](https://qiita-image-store.s3.amazonaws.com/0/104535/5dd67956-46c8-69f7-2b37-8ce9ea7dfe8f.png)

これで閉じて変更完了です。
![09.png](https://qiita-image-store.s3.amazonaws.com/0/104535/e3f2c385-7c63-901a-86db-bc276678784b.png)

以上です。
Latexで細かいことまとめ


http://di-ver-si-ty.seesaa.net/article/18965156.html

積の点 内積
\cdot
http://ballrw.web.fc2.com/command/command_operatortable.html

集合
\in
http://www.latex-cmd.com/equation/set.html

代入矢印
\gets
http://www.biwako.shiga-u.ac.jp/sensei/kumazawa/tex/arrow.html


ギリシャ文字

\theta
\eta


http://www.latex-cmd.com/special/greek.html

しぐま 数式スタイル
$\displaystyle h=\sum^d_{i=1}w_ix_i$

text2img
install path
/usr/local/bin
数式の美しい画像を作る


## tex2img

install path
/usr/local/bin

http://island.geocities.jp/loveinequality/

環境設定 > 出力画像 > 解像度レベル > 50
環境設定 > 変換ツール

> LaTeX ```/Library/TeX/texbin/platex```
> DVI Driver ```/Library/TeX/texbin/dvipdfmx -vv```
> LaTeX ```/usr/local/bin/gs```

表示 > プリアンサンブル設定ウィンドウ >

```
% LaTeX compiler: platex
% DVI driver: dvipdfmx
\documentclass[fleqn,papersize]{jsarticle}
\usepackage{amsmath,amssymb}
\usepackage[dvipdfmx]{graphicx,color}
\usepackage{bm} %% 追加 {\bm x} 数式太字
\pagestyle{empty}
\makeatletter
%% 以下 追加
\AtBeginDocument{\[}
\expandafter\def\expandafter\@enddocumenthook\expandafter{\expandafter\]\@enddocumenthook}
\makeatother
```

<img src="https://qiita-image-store.s3.amazonaws.com/0/69007/cb27765c-3693-4647-9567-b6150bda77a9.png" width="300px">

美しい！
RTX1210＿ポートセービングIPマスカレート

#RTX1210 NATモードの変更
RTX1210からNATモードが変更され、RTXの内部的にNATテーブルを効率化したんだけど、
そのために外部に接続ができなくなることがちらほら。
実体験として、一部のWEBページにのみアクセスできなくなったことがあった。
原因はサーバ側がセッション維持(バグ)をし続けていたことだったけど……。

なので対策としてはNATモードを**RTX1200**などの従来のモードに変更することが挙げられる。

##設定
```japanese:RTX1200と同じNATモードにする
nat descriptor backward-compatibility 1
```

```japanese:保存も忘れずに
save
```

##設定反映
```japanese:再起動
restart
```
※ NATモードの変更には再起動が必要



##ポートセービングIPマスカレートについて
[公式ページ](http://www.rtpro.yamaha.co.jp/RT/docs/nat-descriptor/nat-abstruct.html)にて
*3.7. ポート番号の割り当てポリシー* に書いています。
Android Full Backup


## バックアップ

システム設定 **込み**のバックアップ

```
adb backup -apk -shared -all
```

システム設定 **無し**のバックアップ

```
adb backup -apk -shared -all -nosystem
```

## リストア

```
adb restore (バックアップしたファイル名)
```
rbenvを使ってSinatraの実行環境を整えるまで

## 概要
Rubyのバージョン管理が出来るツールrbenvを使ってRuby製フレームワーク、sinatraの実行環境を整えるまでのメモ。

## 実行環境
CentOS release 6.7 (Final)
64bit

## rbenv + ruby-build インストール
インストール先はvagrantユーザーのホームディレクトリに.rbenvを作り、その中にインストールする。


```
# ディレクトリの作成を行う
$ mkdir -p ~/.rbenv/plugins

# rvenvとruby-buildをgithubから取得する
$ git clone git://github.com/sstephenson/rbenv.git ~/.rbenv
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

# インストール用のシェルを実行する
$ cd ~/.rbenv/plugins/ruby-build
$ ./install.sh
```

この段階でインストールは完了、次はrbenvコマンドのPathを通す。

## ruby-buildを最新状態に更新する（2017-04-22 追記）

新しいRubyのバージョンがリリースされ、最新バージョンをインストールしたい時はruby-build自体を最新状態に更新してあげる必要がある。

```bash:ruby-buildの更新
cd ~/.rbenv/plugins/ruby-build
git fetch
git merge origin/master
```

## 環境変数の設定
以下を実行して.bash_profileにPathを通す。

```
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
```

これでコマンドが利用出来るようになったハズなので確認。

```
[vagrant@localhost ~]$ rbenv --version
rbenv 1.0.0-14-gc388331
```

## Rubyのインストール
インストール可能なバージョンを一覧で表示する。

```
rbenv install -l
```

今回は2.3.0をインストールする。

```
rbenv install 2.3.0
```

デフォルトで利用するRubyのバージョンを2.3.0にする。
```
rbenv global 2.3.0
```

※Rubyのインストール時に依存パッケージが足りないというエラーメッセージが表示される事がある。
私の環境では、opensslとreadline-develを入れるようにメッセージが表示されたのでインストールを行う。

```
sudo yum install openssl openssl-devel
sudo yum install readline-devel
```

ここまで来たら一度コマンドのPathやRubyのバージョンが変わっているかどうか確認を行ってみると良い。

```
[vagrant@dev ~]$ ruby -v
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-linux]

[vagrant@dev ~]$ which ruby
~/.rbenv/shims/ruby

[vagrant@dev ~]$ which gem
~/.rbenv/shims/gem
```

このように表示されたら上手くいっている。

## sinatraのインストール
後で使うのでまずは、bundlerのインストールを行う。

```
rbenv exec gem install bundler
```

sinatra,sinatra-contribのインストールを行う。

```
rbenv exec gem install sinatra
rbenv exec gem install sinatra-contrib
```

※sinatra-contribはコードを変更した際に自動的に反映してくれるツール。

## アプリケーションの起動

```ruby:app.rb
require "sinatra"
require "sinatra/reloader"

get '/' do
  "hello world!"
end
```

以下のコマンドでアプリケーションを起動する。

```
ruby app.rb -o 192.168.33.33
```

http://192.168.33.33:4567 でアクセス出来れば成功。
※192.168.33.33はお使いのIPアドレスに合わせてね。

## 参考記事

- http://qiita.com/katsuhiko/items/56935225754a90d58314
- http://qiita.com/katsuhiko/items/c84a282f3a56d71c404f
- http://qiita.com/superbrothers/items/99d444e76deacae4985d
- http://www.bunkei-programmer.net/entry/2015/05/22/012901
- https://www.qoosky.net/techs/128
- https://www.qoosky.net/techs/148
【Unity】GUI.Buttonの文字の大きさ、色をGUISkinを使って設定する方法

GUI.Buttonに対して文字の大きさ、フォントの色を変える必要が出てきた。
ボタンのフォントサイズ、色を変更する方法を記載する。

#普通のボタン

スタイルを設定しなければ、以下のように「GUI.Button」を呼び出すだけで
良い。

```csharp:button.cs
	void OnGUI () {
		bool push;
	
		//---------------------------------------------------------------
		//色や文字の大きさの指定がない、ごく普通のボタン。実装が一番簡単
		//---------------------------------------------------------------
		// ボタンを表示する
		// X位置　Y位置 幅　高さ　ボタン名を書く
		push = GUI.Button(new Rect(20, 30, 100, 50), "Normal Button");
		if (push == true) {
			//ボタン押された状態
			Debug.Log("普通のボタン押された");
		}
}
```

一見、綺麗なボタンのように見えるが、フォントサイズを変更できないため
Android端末で確認すると文字が小さくて見えないという問題が発生した。

![スクリーンショット 2016-01-30 23.56.57.png](https://qiita-image-store.s3.amazonaws.com/0/46535/e84aaa8d-9d78-a1c9-a054-3ee19f028050.png)


#GUISkinをボタンに適用してボタンのスタイルを変更する

(1)GUISkinを新規に作成する

![スクリーンショット 2016-01-30 11.11.00.png](https://qiita-image-store.s3.amazonaws.com/0/46535/9c531a23-1006-2744-f3e8-2813bf0fa4d1.png)

(2)作成したGUISkinをソースコードに割り振る
![スクリーンショット 2016-01-30 11.10.45.png](https://qiita-image-store.s3.amazonaws.com/0/46535/3140fc0c-b03d-7f69-e223-cd7a057af4c4.png)

(3)ソースコードの編集
GUI.Buttonの引数にGUISkinを設定する。

```csharp:button.cs
public class GuiButtonSample : MonoBehaviour {

	[SerializeField]
	private GUISkin buttonGuiSkin;	//ボタンのスタイル設定用 

	void OnGUI () {
		bool push;
	


		//---------------------------------------------------------------
		//GuiSkinで設定する。ボタンにスタイルを設定するなら一番簡単な方法だと思う
		//---------------------------------------------------------------
		push = GUI.Button (new Rect (20, 160, 150, 50), "Sukin Button", buttonGuiSkin.GetStyle ("button"));
		if (push == true) {
			//ボタン押された状態
			Debug.Log("GuiSkinで設定されたボタン押された");

		}

	}

}

```

その結果、ボタンの中の文字のフォントサイズ、色を変更することができました。
![スクリーンショット 2016-01-30 23.57.04.png](https://qiita-image-store.s3.amazonaws.com/0/46535/76c7861d-5a68-1549-ad03-f546cd35d5af.png)
BitcoinをPythonのhashlibでマイニングしてみる

正確にはマイニングで必要なブロックのハッシュを求めるプログラムを書いてみる。今更自力で実装したソフトでマイニングするのは無駄&無理なので、仕組みを理解するのが目的。

# Bitcoinって
[参考文献](#参考文献)参照。

# マイニング(採掘)って
詳細な説明は他の記事などに委ねますが、Bitcoinの取引を記帳(承認)する行為で、

* 前のブロックのハッシュ値
* 承認する取引から計算される値(マークルルート)
* 任意の32ビットの数値(nonce)
* その他(後述)

から計算できるハッシュ値の先頭から特定の数(2016年1月現在で17個)だけ0が並んでくれるようなnonceの値を探し出す行為です。世界で最初にそのブロックのnonceを見つけると、報酬として25BTC(2016年1月現在で約116万円)の新規発行コインと、記帳した取引の手数料がもらえます。
この報酬目当てに世界中の人が専用チップを積んだマシンを大量に使ってせっせとマイニングしています。マイニングの難易度は全世界でのリソースを使って平均10分かかるよう調整されているので、マイニングの参加者が増えれば増えるほど難しくなっていきます。

前のブロックのハッシュを元に計算するので、そこが前のブロックとの繋がっていて「ブロックチェーン」という名前の由来です。１つの取引履歴を改ざんするためには、その取引が含まれるブロックと、そこから先の全てのブロックのハッシュを再計算する必要があり、改ざん不可だと言われる所以です。

# やってみる

本当にマイニングしようと思うととても時間がかかるので、すでに承認されている取引のnonceが本当に正しいのかを確かめるだけにします。
bitcoinのすべての取引や採掘の結果は公開されているので、
https://blockchain.info/ja/
等で見ることができます。

今回はサンプルとして
https://blockchain.info/ja/block/000000000000000003a0343cc001d21b97d15e97e665b68c790b98c871cf0731
を使います。

ハッシュ計算の入力になるのは

* ブロックのバージョン
* 前のブロックのハッシュ値
* マークルルート(承認対象の取引から計算される)
* 時刻
* bits (難易度をコントロールする値)
* nonce (この値を見つけるのがマイニング)

です。これらの値を上記のページから拾ってきます。

```py
version = 4
prev_block = "0000000000000000005629ef6b683f8f6301c7e6f8e796e7c58702a079db14e8"
markle_root = "efb8011cb97b5f1599b2e18f200188f1b8207da2884392672f92ac7985534eeb"
timestamp = "2016-01-30 13:23:09"
bits = 403253488
nonce = 1448681410  # 承認済みのブロックなので、nonceの値もわかっている
```
それぞれこのままでは使えないので、所定のフォーマットに変換します。

## バージョン
バージョンは0で埋めて8桁にします。また、他の値にも共通ですが、これらの値はすべてバイト順を逆順にして計算に使います(リトルエンディアン)。バイト順を逆順にするのは多分他にもっといいやり方がありますが、以下では一旦16進数の文字列にフォーマット変換してからまたデコードしています。
(python3ならintにto_bytesメソッドがあります)

```py
version_h = format(version, "08x").decode("hex")[::-1]
```

## 前ブロックのハッシュ、マークルルート
前ブロックのハッシュとマークルルートはすでに16進数の形になっているので、デコードして逆順にします。

```py
prev_block_h = prev_block.decode("hex")[::-1]
markle_root_h = markle_root.decode("hex")[::-1]
```
## 時刻
時刻はUnix標準時からの秒数を例によって逆順バイト列に変換します。

```py
from datetime import datetime
timestamp_s = int((datetime.strptime(timestamp, "%Y-%m-%d %H:%M:%S")-datetime(1970,1,1)).total_seconds())
timestamp_h = format(timestamp_s,"x").decode("hex")[::-1]
```

## bits, nonce
逆順バイト列に変換するだけです。

```py
bits_h = format(bits,"x").decode("hex")[::-1]
nonce_h = format(nonce,"x").decode("hex")[::-1]
```

## ハッシュの計算
Bitcoinのハッシュはsha256を２重に使います。また、結果も逆順バイト列になっているので、順序を変換して16進数に変換します

```py
from hashlib import sha256
header = version_h + prev_block_h + markle_root_h + timestamp_h + bits_h + nonce_h
print(sha256(sha256(header).digest()).digest()[::-1].encode("hex"))
```

出力

```bash
000000000000000003a0343cc001d21b97d15e97e665b68c790b98c871cf0731
```

ちゃんと０が17個並んでいるのがわかります。

# まとめ
* マイニングの仕組みがざっくり分かった
* 次はマークルルートの計算もやってみるかも

# 参考文献

* http://jp.techcrunch.com/2015/03/31/bitcoin-essay/
    * (日本語)ビットコイン全般に関する非常にわかりやすい記事
* https://en.bitcoin.it/wiki/Protocol_documentation
    * (英語)ハッシュの計算方法の定義が載っている。全部読むのはけっこう重い
@nifty スマートサーブと古くなった iPod touch を使い、 VPN 経由で閲覧できるネットワークカメラを設置してみた

[防犯カメラ映像の流出問題](http://www.rbbtoday.com/article/2016/01/28/139150.html)という記事があったので、自宅にネットワークカメラを安全に安価に設置してみようと思います。ちょうど、窓際にリーフレタスを栽培しているので、そちらを監視するのが目的です。

ネットワークカメラを設置して、グローバル IP アドレス経由ではなく VPN 経由でアクセスする記事はいくつかありました。

* [自宅の中を外から覗いてみよう](http://smartserve.nifty.com/column/130918000037/)
* [「スマートサーブ」で自宅のネコを見てみた](http://blog.nifty.co.jp/blog/2014/10/post-06dc.html)
* [自宅でカンタンVPN！　ニフティ「スマートサーブ」](http://internet.watch.impress.co.jp/docs/column/shimizu/20131112_623095.html)
* [LiveCapture3＋スマートサーブ＋パソコン＋USBカメラ＋IPカメラで外出先から自宅リビングを監視できるようにする](http://yunogotoshi.blogspot.jp/2014/09/livecapture-3usbip.html)
安いカメラは数千円ですが、もともと家に眠っている古い iPod touch や機種変更したスマートフォンを使えばもっと安上がりだと思います。


## 今回準備したもの

* iPod touch (iOS6.1.6)
* スマートフォン（HUAWEI P8lite）

## スマートサーブとは
[スマートサーブ](http://smartserve.nifty.com/)は、自宅のネットワーク（LAN）に接続された機器を外出先から操作できるネットワークサービス。＠nifty入会とスマートサーブへ申し込みをすると利用できます。実際には、自宅のネットワークとクラウドを VPN で仮想的に同じネットワークに接続することで実現しています。初期費用が 5,000 円、月額費用が 500 円。

## スマートサーブの設置
詳しくは、[スマートサーブのお申し込み](http://smartserve.nifty.com/select.htm)を参照。申し込むと3～4営業日で専用機器（サービスアダプター）が郵送されてきます。そのサービスアダプターを自宅のホームルータに LAN ケーブルでつなげるだけ。

* [サービスアダプターの仕様](http://smartserve.nifty.com/specification.htm)

## ipCam - Mobile IP Camera のインストール
ネットワークカメラは iPod touch で代用。古い iPod touch だとインストールできるアプリが限られました。こちらのアプリは大丈夫でした。

* [ipCam - Mobile IP Camera](https://itunes.apple.com/jp/app/ipcam-mobile-ip-camera/id440270152?mt=8)
設定では必ず**パスワード**を設定しましょう。

http://192.168.X.XX/

自宅の Wi-Fi からであれば上記 URL からアクセスすることが出来ました。

## IP Cam Viewer のインストール
閲覧するデバイスは現在利用している Android スマートフォン（HUAWEI P8lite）です。ブラウザーさえあれば閲覧は可能ですが、Viewer アプリをインストールしてみました。
* [IP Cam Viewer Lite](https://play.google.com/store/apps/details?id=com.rcreations.ipcamviewer&hl=ja)

## ネットワークカメラへアクセス（自宅 Wi-Fi 経由）
カメラの管理＞カメラの編集から、iPod touch で準備したカメラの情報を入力します。

* 製造元は **iOS** を選択する
* モデルは **ipCam for iOS** を選択する
* Host/IP は **iPod touch のプライベート IP アドレス** を入力する
* HTTP Port は **iPod touch で指定したポート番号** を入力する
* User と Pswd にはそれぞれ iPod touch で指定した **Security のログイン文字列、パスワード文字列** を入力する

## モバイル接続の登録
自宅のネットワークに VPN 接続するためには、スマートサーブIDを作成する必要があります。詳しい作成手順はこちらをご覧ください。
[モバイル接続機能を利用するにはどうしたらよいですか](http://smartserve.kaiketsu.nifty.com/faqs/88357/thread)


## モバイル接続の設定
スマートサーブが設置できれば、自宅のネットワーク（LAN）に VPN で接続することが可能です。
Android の「設定」から VPN ネットワークを追加します。

* タイプは **L2TP/IPSec PSK** を選択する
* サーバーアドレスは、**スマートサーブで指定されたサーバー名** を入力する
* L2TP セキュリティ保護は空欄
* IPSec ID は空欄
* IPSec 事前共有鍵は、**スマートサーブで指定されたサーバー名** を入力する
VPN ネットワークの追加が完了したら、接続する。
* ユーザー名とパスワードは、それぞれ **スマートサーブIDとそのパスワード** を入力する。
接続に成功すると、上部に鍵マークが表示される。
詳しい設定方法・接続方法はこちらをご覧ください。
[VPNクライアントの設定方法を教えてほしい (Android 4.x)](http://smartserve.kaiketsu.nifty.com/faqs/88361/thread)

## ネットワークカメラへアクセス（モバイル接続経由）
外出先あるいは 3G 回線などに変更してから、モバイル接続をし、IP Cam Viewer Lite で映像が閲覧できることを確認。

## その他

* 自宅のネットワーク（LAN）では、DHCP を使っていますので、iPod touch のプライベート IP アドレスは変更される場合があります。固定のプライベート IP アドレスとするか、あらかじめ iPod touch の MAC アドレスを調べておき、スマートサーブの[接続機器管理](https://l2signup.nifty.com/smrdis/top)で該当の MAC アドレスに名前をつけておくとわかりやすいです。
* ネットワークに詳しくない方は、くれぐれもグローバル IP アドレス経由でのカメラアクセスを許可しないように。
* カメラには認証設定をすることもお忘れなく。パスワードも長い文字列を設定してください。
WebApp yeoman


generator-webappで作成したプロジェクトをカスタマイズしてみました。
![スクリーンショット 2016-01-30 23.20.58.png](https://qiita-image-store.s3.amazonaws.com/0/87111/e9570691-6ef6-af2f-a582-8f2281974e8a.png)

これからJava化してみます。
[Crystal][Kemal] ルート指定でスプラット（*）を使う

[Crystal](http://crystal-lang.org) 関係の情報を拾ってるとWebフレームワークの [Kemal](http://kemalcr.com) が超イケてるぽいので，Rubyのベタ書きCGIな個人サイトを Kemal で再構築してみようと試行錯誤中。

その中で，階層数を特定せず複数階層（"a", "a/b", "a/b/c", ...）全体にマッチするルートを指定する必要にかられたのですが[Kemalのドキュメント](http://kemalcr.com/docs/http-requests.html)を見てもそれらしい記述が見当たりません。

Kemalのインスパイア元である[Sinatraのドキュメント](http://www.sinatrarb.com/documentation.html)を当たってみる，とどうやらスプラット(`*`)を使えば良いっぽいので，

```rb:Sinatra
get '/download/*.*' do
  # matches /download/path/to/file.xml
  params['splat'] # => ["path/to/file", "xml"]
end
```

モノは試しとKemalで

```rb:Kemal
# access to http://localhost:3000/test1/test2/test3
get "/*" do |env|
  env.params["splat"]
end
```

とやってみたら，案の定`Exception: Missing hash key: "splat"`と怒られた。

その後，[Kemalのソース](https://github.com/sdogruyol/kemal)を追いかけてパスツリーの検索に`Radix::Tree#find`が使われていることを突き止め，さらに[Radixのソース](https://github.com/luislavena/radix)を追いかけてみると，コロン（`:`）を使ったパラメータ名指定と同じように，スプラットの後にもパラメータ名を指定できるようで，↓みたいにすれば良いらしい。

```rb:Kemal
# access to http://localhost:3000/test1/test2/test3
get "/*path" do |env|
  env.params["path"] # => "test1/test2/test3"
end
```

スプラットが複数出てくる時に別の名前を指定できるので，Sinatraの指定のキーで配列が返ってくる仕様より便利かも。

*Kemal（Radix）超イカス!!*

で余談ですが，スプラットの後ろの文字列がパラメータ名になるため，明示的なパラメータ名をつけず`”*"`とだけ指定すると，名前が空文字（`""`）のパラメータとして設定されるみたい。下の例みたいにルートパス以下を全部引っ掛けるような時ならコレでも良いかも。

```rb:Kemal
# access to http://localhost:3000/test1/test2/test3
get "/*" do |env|
  env.params[""] # => "test1/test2/test3"
end
```

## <i class="fa fa-comment-o"></i> 追記

ルート（route）に `"/*"` を指定すると，`env.params[""]` にはリクエストパスからルート（root）パスである先頭の `/` を除いた文字列が格納されます。

```rb
get "/*" do |env|
  env.params[""] # http://localhost:3000/aaa/bbb/ccc => "aaa/bbb/ccc"
end 
```

サイトのルートパス(`/`)にアクセスしたら場合には空文字を返してくれるかと思ったら，どうやらこのルートは `/` にはマッチしない模様。

それじゃ `"*"` を指定すれば先頭の `/` も含んだリクエストパス全体が帰ってくんじゃないかと試しましたが，こちらはどのパスに対してもマッチしないルートになってしまいました。

```rb
get "*" do |env|
  env.params[""] # http://localhost:3000/            => 404 Error
                 # http://localhost:3000/aaa/bbb/ccc => 404 Error
end 
```

さしあたりルートパスのルートは独立して指定するしかなさそうですね。
MacOSX El Capitan でパケットキャプチャし、自動的にファイルに保存する：tcpdump編

## 実現したいこと

MacOSX El Capitan でパケットキャプチャしながら、自動的にファイルに保存する。
後ほどWiresharkでパケットファイルを閲覧したい。


## 実現方法および解決方法

tcpdump起動時にパケットキャプチャしたものをファイルに保存するコマンドオプションを利用する。


## 実行コマンド

```
mkdir -p ~/tmp/pkt
cd ~/tmp/pkt
pcap_date=$(date +%Y-%m-%d_%H-%M-%S) ; sudo tcpdump -i en0 -w testcap_$pcap_date.pcap
sudo chown $(whoami):staff testcap_$pcap_date.pcap
```

停止する際は、Ctrl + C を押す。

~/tmp/pkt に日付フォーマット付きのファイルが保存されているので、そのファイルwiresharkで開くとパケットが閲覧できます。


## 補足

```
$ tcpdump -h
tcpdump version 4.7.3 -- Apple version 66
libpcap version 1.5.3 - Apple version 54
Usage: tcpdump [-aAbdDefhHIJKlLnNOpqRStuUvxX#] [ -B size ] [ -c count ]
		[ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ]
		[ -i interface ] [ -j tstamptype ] [ -M secret ]
		[ -Q metadata-filter-expression ]
		[ -r file ] [ -s snaplen ] [ -T type ] [ --version ] [ -V file ]
		[ -w file ] [ -W filecount ] [ -y datalinktype ] [ -z command ]
		[ -Z user ] [ expression ]
$
```

## 情報源

man tcpdump
ファイル内容が一致しているか判定する方法(Java)

ファイルの内容を比較し、不一致の場合は、falseを返却するロジックです。
JUnitで使うことを想定して、シンプルな方法にしてます。

**一番シンプルな方法**
大きなサイズのファイル比較には使えないかも。。
<pre>
public boolean fileCompare(String fileA, String fileB) throws IOException {
	return Arrays.equals(Files.readAllBytes(Paths.get(fileA)), Files.readAllBytes(Paths.get(fileB)));
}
</pre>

**例外処理を変えてみた**
<pre>
public boolean fileCompare2(String fileA, String fileB) {
	boolean bRet = false;
	try {
		bRet = Arrays.equals(Files.readAllBytes(Paths.get(fileA)), Files.readAllBytes(Paths.get(fileB)));
	} catch (IOException e) {
	}
	return bRet;
}
</pre>

**ファイルのサイズを最初にチェックしてみた**
<pre>
public boolean fileCompare3(String fileA, String fileB) {
	boolean bRet = false;
	try {
		if( new File(fileA).length() != new File(fileA).length() ){
			return bRet;
		}
		byte[] byteA = Files.readAllBytes(Paths.get(fileA));
		byte[] byteB = Files.readAllBytes(Paths.get(fileB));
		bRet = Arrays.equals(byteA, byteB);
		if(!bRet){
			System.out.println(new String(byteA,"UTF-8"));
			System.out.println(new String(byteB,"UTF-8"));
		}
	} catch (IOException e) {
	}
	return bRet;
}
</pre>
Eclipseのコンソールでctrl+d (EOF) が認識されない


Scanner使ってるときに、ctrl+dで送れるはずのEOFでhasNext()が終わったり終わらなかったりしてもにょもにょする問題の対策

# 環境
- Version: Luna Service Release 2 (4.4.2) 

- こういうのを実行して、入力をコピペしてctrl+d -> 入力待ちが終了しない

``` Java
while (sc.hasNext()) {
	int n = Integer.parseInt(sc.next());
	list.add(n);
}		
```

# 解決策
- 参考: http://stackoverflow.com/questions/4711098/passing-end-of-transmission-ctrl-d-character-in-eclipse-cdt-console

> "If you leave the console to focus on another view, and then refocus on the console, then Ctrl-D (EOF) works as expected."

- ｢コンソールからフォーカス外して、もう一回フォーカスしてから入力したらいけるで｣
  - いけた
otto 0.2.0の変更点


新しいバージョンが出ました。変更点を確認します。

# 公式解説と要約
[Otto 0.2 - HashiCorp](https://www.hashicorp.com/blog/otto-0-2.html)に解説があります。

## New and Improved App Types

JavaとPythonのサポートがされたようです。
RubyとPHPのサポートが改善されたようです。

あまり興味がないので、詳しくは見ていません。

## Implicit Dependencies

ottoは依存するサービスをDockerで起動できます。
ただし、自分でAppfileを書く必要があります。
例えば、[ottoでRedisを使う環境を用意する - Qiita](http://qiita.com/ledsun/items/7fa8a8629c24b60b39e3)です。
この依存サービスの検出を自動で行う機能です。

今の所、Rubyが対象です。
また[ソース](https://github.com/hashicorp/otto/blob/master/builtin/app/ruby/app.go#L35)を見た感じ、対応するGemは

- dalli
- pg
- redis

の三つです。

## Layered Development Environments
仮想環境の作成時に使い回しできる部分をキャッシュして、作成を早くする機能です。
Layeredは、使い回す層と、新しく作る層をイメージしているようです。


### 実測
Macbook Proで試してみます。

- 2.4 GHz Intel Core i5 
- 8 GB 1600 MHz DDR3

初回は変わらないので、2回目以降の実行時間を計ります。
次のコマンドで時間を計ります。

```
time otto dev
```

### 0.1.2 約6分半
```
400.32 real        12.26 user         7.39 sys
```

### 0.2.0 約2分

```
123.89 real        12.33 user         4.83 sys
```


### 感想
とても便利です。
環境を作る際に、パラメーターを間違えても気楽に作り直せます。

## App Type Plugins

プラグイン機構が入ったようです。
試していません。

これで対応するアプリケーションの数が増えるといいですね。

# Appfileのフォーマット変更

customizationにつける文字列の用途が変わりました。
本番で設定を変えたい場合に使うようです。

詳しくは[Customization - Appfile - Otto by HashiCorp](https://www.ottoproject.io/docs/appfile/customization.html)を見てください。

以前の意味はよく覚えていません。
`"docker"`が入っていることがありました。

## before
https://github.com/hashicorp/otto/blob/b284474909f73b1cfd3b1626cb4ed60b98db808d/examples/mongodb/Appfile

```
application {
    name = "mongodb"
    type = "docker-external"
}

customization "docker" {
    image = "mongo:3.0"
    run_args = "-p 27017:27017"
}
```

## after

https://github.com/hashicorp/otto/blob/master/examples/mongodb/Appfile

```
application {
    name = "mongodb"
    type = "docker-external"
}

customization {
    image = "mongo:3.0"
    run_args = "-p 27017:27017"
}
```

# 全体の感想
真面目に自動的に開発環境を作るツールをつもりのようです。
労力がすごすぎて自分でやる気にはならないので、ありがたい限りです。
Atomのterm3でログイン後にログイン前のカレントディレクトリに自動で移動する


atomでterm3を使ってみる事にしたんですが、起動時に`login -f "username"`するとホームに戻ってしまうので起動後に自動でログイン前のカレントディレクトリに移したくなりました。
その時にやった事のメモです。

1. Term3の環境設定のAuto Run Commandで以下を入力します。
`echo $PWD > /tmp/term3pwd && login -f "username"`

2. .bash_profileに以下を追加

```bash
cdterm3 () {
  if [[ -e /tmp/term3pwd ]]
  then
    cd $(cat /tmp/term3pwd)
    rm /tmp/term3pwd
  fi
}
cdterm3
```

これで起動時にログイン前のカレントに移動するはず。
まぁ、これでいいか
ITの最近のトレンド


ここ最近のITトレンドについて、セミナーで講師の方から話を聞く機会があったので、
備忘録として自分なりにまとめてみます。

##IoT
通称、「モノのインターネット」
ありとあらゆるモノをインターネットに繋げることで、離れたところから様々な情報を知ったり、操作することができる。

（例）ドアをインターネットに繋げることで、離れたところから開閉状態を知ることができる。

IoTによって膨大な量の情報が集まり、ビッグデータとなる。

##ビッグデータ
解析が難しいため、技術が追い付かないため、今まで活用されてこなかった膨大な量の情報。
これを解析するためには処理速度の高いコンピュータを用いる必要がある。

高い処理速度を出すための技術としては、
人工知能、機械学習、量子コンピュータなどがある。

##人工知能
演繹的な情報（AならばBである）をコンピュータに与え、人間と同じような脳を開発する技術。

##機械学習
人間と同じ学習能力をコンピュータに施し、自律的に行動させる技術。

##量子コンピュータ
本来コンピュータは情報を扱うとき、電気信号（1と0）によって処理する。
Bit数が高くなればなるほど、多くの情報を処理できるというのが従来の考え方。

量子コンピュータは1と0だけではなく、可変的な1と0を実現できる。
今までONとOFFでしか実現できなかったが、もっと複数の状態を保持できるすごいコンピュータ。

#まとめると...
1. IoTによって膨大な情報を集め、集まったデータがビッグデータとなる。
2. ビッグデータは人工知能や機械学習などによって処理される。
3. コンピュータはそのデータから自律的に学習し、賢くなる。
4. 処理されたデータはIoTに還元され、役立っていく

以上
CSSで動的にサイズが変わるフォントを指定

# Viewの大きさに合わせて動的にフォントサイズを変更する
調べても`em`や`rem`ばかり出て発狂したのでメモ。

結論から言うと、使うのは`vw(ViewportWidth)`と`vh(ViewportHeight)`。
それぞれ画面の横幅、縦幅に合わせて変化する。

例えば`font-size{5vw;}`とすれば横幅の5%、`font-size{5vh;}`とすれば縦幅の5%の値になる。

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<title>可変フォント</title>
	<style type="text/css" media="screen">
		html {
			height: 100%;
			width: 100%;
			font-size: 62.5%;
		}
		body {
			font-size: 1.4em;
		}
		p#vw {
			font-size: 5vw;
		}
		p#vh {
			font-size: 5vh;
		}
	</style>
</head>
<body>
	<p>windowサイズに合わせてフォントサイズを変更</p>
	<p id="vw">僕は横幅で変わる</p>
	<p id="vh">俺は縦幅で変わる</p>
</body>
</html>
```

デフォルトver
<img width="485" alt="スクリーンショット 2016-01-30 21.08.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/110584/1021469e-b8de-9d66-b494-7792495f71b0.png">

横伸ばしver
<img width="707" alt="スクリーンショット 2016-01-30 21.08.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/110584/7708ef98-fa67-0c54-5591-8bf223e71d69.png">

縦伸ばしver
<img width="459" alt="スクリーンショット 2016-01-30 21.09.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/110584/437e6770-8aba-ef8e-24c3-00e03609bc34.png">

###締め
簡単なことなのに中々検索しても出てこなかった。リファレンスを黙って読んでれば良かったのかもしれない。
ToodledoでWebページを「あとで見る」ためのメモ



# はじめに
Toodledoを使えばWebページを期限きで血肉になるまで繰り返し見れるので、はてブやPocketよりも確実に「あとで見る」ことが出来るかと思います。

# 方法
下記をブックマークレットとして登録すると良いです。

```javascript
javascript:(function()%7Bopen('https://gmail.google.com/gmail?fs=1&tf=1&source=ig&view=cm&to=xxxxxx@toodledo.com&cc=&bcc=&su='+window.document.title+'  %2525Web&body='+encodeURIComponent(window.location.href)+'','_blank','width=400,height=400,scrollbars=1');%7D)()
```

上の`xxxxxx@toodledo.com`はタスクインポート用のメールアドレスで、Toodledoを使っているユーザーごとにアドレスが異なります。
事前に、下記の通り設定しておく必要があります。

0. `Toodledoメイン画面`→`右上のメニュー`→`Tools→More...`を選ぶ
0. `Email Access`→`Configure...`を選ぶ
0. `Enable e-mail importing`をチェックオンにしておく

準備できたら、最後の画面の`Send Tasks To:`のメールに書いてあるメールアドレスで、上のブックマークレットの``xxxxxx@toodledo.com``を置き換えます。
ブックマークレットを実行するとGmailのメール送信画面が開くので、そのまま送信を押せばToodledにTodoがインポートされます。きっと。
FreeImageで画像の読み込みと保存

C++で簡単に使える画像読み込みライブラリが欲しかったので。

### Official site
http://freeimage.sourceforge.net/

## 対応フォーマット
http://freeimage.sourceforge.net/features.html のSUPPORTED FORMATを参照。有名どころは使える。

## サンプル

```cpp
#include<iostream>
#include<FreeImage.h>

int main() {
    std::cout << "FreeImage ver. " << FreeImage_GetVersion() << std::endl;
    std::cout << FreeImage_GetCopyrightMessage() << std::endl;

    try {
        // GIF画像を読み込み
        auto filename = "lena_color.gif";
        auto image    = std::shared_ptr<FIBITMAP>(
                            FreeImage_Load(FIF_GIF, filename, GIF_DEFAULT),FreeImage_Unload);
        if(!image) {
            throw std::runtime_error("Load failed");
        }

        // グレースケールに変換
        auto greyimg = std::shared_ptr<FIBITMAP>(
                            FreeImage_ConvertToGreyscale(image.get()),  FreeImage_Unload);
        if(!greyimg) {
            throw std::runtime_error("Convert failed");
        }

        // PNGとして保存
        if(!FreeImage_Save(FIF_PNG, greyimg.get(), "convert.png", PNG_DEFAULT)) {
            throw std::runtime_error("Save failed");
        }
    }
    catch(std::exception& e) {
        std::cout << "exception!\n" << e.what() << std::endl;
    }
}
```

ライブラリの初期化(`FreeImage_Initialise`)は動的リンクする場合は明示的な呼び出し不要。静的リンクの場合は一度だけ呼ばなければならない。`FreeImage_DeInitialize`も同様。
CO2センサー > MQ-135 Gas Sensor > MQ135_MAXRSRO / MQ135_MINRSRO の求め方

http://qiita.com/erukiti/items/1d9658f7c363e79d051b
に記載のMQ-135(SNS-MQ135)の計算に使われている係数(MQ135_MAXRSRO と MQ135_MINRSRO)の整理。

```
#define MQ135_DEFAULTPPM 399 //default ppm of CO2 for calibration
#define MQ135_DEFAULTRO 68550 //default Ro for MQ135_DEFAULTPPM ppm of CO2
#define MQ135_SCALINGFACTOR 116.6020682 //CO2 gas value
#define MQ135_EXPONENT -2.769034857 //CO2 gas value
#define MQ135_MAXRSRO 2.428 //for CO2
#define MQ135_MINRSRO 0.358 //for CO2
```

[係数を決めたDavid Gironiのblog](http://davidegironi.blogspot.fr/2014/01/cheap-co2-meter-using-mq135-sensor-with.html#.VqydcGSLQhQ)によると

`Rs/Ro_limit = (ppm/a)^(1/b) -- (1)`

という式を使っている。

> Datasheet does not tell us much for detecting concentration scope for this gas, the figure is from 0.1 to 100ppm, but we can suppose a limit from 10 to 2000ppm.

という記載があり、10から2000ppmの範囲を考慮している。

aとｂは以下の記載がある。

- scaling factor (a)
- exponent (b)

上記の#defineの定義では

- a = 116.6020682
- b = -2.769034857

となっている。

(1)式にそれぞれ10ppm, 2000ppmを代入すると

## 10ppm

Rs/Ro_limit = (10/116.6020682)^(1/(-2.769034857)) = 2.42787
[google計算](https://www.google.co.jp/search?q=(10%2F116.6020682)%5E(1%2F(-2.769034857))&oq=(10%2F116.6020682)%5E(1%2F(-2.769034857)))


## 2000ppm

Rs/Ro_limit = (2000/116.6020682)^(1/(-2.769034857)) = 0.35829
[google計算](https://www.google.co.jp/search?q=(2000%2F116.6020682)%5E(1%2F(-2.769034857))&oq=(2000%2F116.6020682)%5E(1%2F(-2.769034857)))


以上でそれぞれの値の計算が再現できた。


PS. MQ-135はaitendoで購入できるのが分かった。３個買っておいた。
Chainerのトレーニング済みimagenet modelの読み込みとテスト


Chainerでトレーニングしたimagenet modelを読み込んでテストデータで評価したいです．環境はOS X(10.9.5 CPU), Chainer1.6.0, Python2.7.10です．
類似記事があるかもしれませんが5秒くらい探して見つからなかったので書きます，ご容赦ください．

**モデルのトレーニング**

まずモデルをトレーニングしないとテストできません．トレーニング方法については，http://hi-king.hatenablog.com/entry/2015/06/11/021144 などを参考に行って下さい．
ただし，↑のリンク先に付属しているコードを[Caltech101](http://www.vision.caltech.edu/Image_Datasets/Caltech101/)からとってきた自前の画像で試してみると，画像の大きさ変更自体は正しく行われたのですが，得られた画像が以下のようにいびつなものになってしまいました．上が変更前の画像，下が変更後の画像です（同じ物体が複製されています）．

![image_0001.jpg](https://qiita-image-store.s3.amazonaws.com/0/58269/ae357218-1074-1d33-0da7-2e62efd2c29d.jpeg)

![image_0001_conc_.jpg](https://qiita-image-store.s3.amazonaws.com/0/58269/93019d14-b033-a4d1-e5a8-ea66a7ddeaa0.jpeg)

このままでも特に問題ないのかもしれませんが，なんとなく気になったので少し前処理しました．細かい調整が面倒ならばPIL.Imageの.resize((256,256))を使ってもいいような気がします．

**テストの準備**

トレーニングが終わったらテストの準備をします．テストのために必要なものは以下の4つです．トレーニング時の前処理とほぼ同じです．

- 256×256の大きさのテスト画像．test.txtに書かれたpathと一致するように置く．
2. 平均画像ファイル(トレーニング時と同じものを使えばよいです）．実行ディレクトリに置く．
3. test.txtファイル（トレーニング時と同じフォーマットで用意します）．実行ディレクトリに置く．
4. トレーニング済みのimagenet model（トレーニングによってmodelという名前で保存しているはずです）．実行ディレクトリに置く．

**modelの評価**

Chainerの公式ドキュメントとか他のexamplesのコードを見て書きました．chainer/examples/imagenet/train_imagenet.pyをテスト用に書き換えただけなので無駄な処理も多々あるように思いますが，手元の環境では一応動きました．
上の準備を行った後，↓のコードを置いて（※ 細かいところをサボったので，コマンドライン引数のtest_batchsizeは無視して下さい．これをdefault値(=1)以外にすると正しく評価できません）
https://github.com/fullflu/ML/blob/master/evaluate_chainer_imagenet.py

```
python evaluate_chainer_imagenet.py -g -1 test.txt
```

と打てば以下の感じでerror（平均でどれだけ予測を外したか）が表示されます．処理の中身は，modelをimportした後の `serializers.load_npz(path_to_model,model)` でモデルを読み込んで，予測と評価で `model(x,t)` を書くだけです．便利です．

```
Load model from model


{"iteration": 19, "loss": 0.7662104054501182, "type": "test", "error": 0.4736842105263158}
```
約半分は外しているので真面目に学習していないことがよくわかります．