OmniAICreator/Qiita-1.07M huggingface dataset:
c++ builder / Indy / mail > メール送信先が複数ある場合の対処

```txt:動作確認
C++ Builder XE4
```

- 方法1. カンマ区切りで指定
  + http://codeverge.com/embarcadero.delphi.winsock/question-about-sending-same-messag/1073953
- 方法2. Recipients->Add()使用
  + http://codeverge.com/embarcadero.delphi.winsock/question-about-sending-same-messag/1073953
  + http://www.delphigroups.info/2/99/188862.html

方法1でだけ試したが、一応複数宛に到達したようだ。
方法1で問題が見つかってから方法2の使用を検討する。

念のため`<アドレス1>,<アドレス2>,<アドレス3>`のように不等号で囲っているが、それは不要かもしれない。
docker-composeでDocker daemonに繋がらなくなったときの対処法


環境：

* Mac OSX 10.11.2
* Docker Toolbox 1.9.1i

何をどうしたかサッパリ身に覚えが無いものの、`docker-compose up`をすると、以下の様なエラーが表示されるようになってしまいました。

```
ERROR: Couldn't connect to Docker daemon - you might need to run `docker-machine start default`.
```

`docker-machine start default`は当然実行済みなのでなんだろうと思いつつも、ひとまず`docker-machine env default`をしてみようと思ったところ、今度は次のエラーが。

```
Error checking TLS connection: Error checking and/or regenerating the certs: There was an error validating certificates for host "<<IP Address>>:2376": dial tcp <<IP Address>>:2376: i/o timeout
You can attempt to regenerate them using 'docker-machine regenerate-certs [name]'.
Be advised that this will trigger a Docker daemon restart which will stop running containers.
```

TLSが無効になってるから、regenerate-certsしろとあります。参考：http://qiita.com/kooohei/items/d370701d6c39727334f3
なので、`docker-machine regenerate-certs default`をするわけですが、すると今度もエラー...

```
$ docker-machine regenerate-certs default
Regenerate TLS machine certs?  Warning: this is irreversible. (y/n): y
Regenerating TLS certificates
Detecting the provisioner...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...

This machine has been allocated an IP address, but Docker Machine could not
reach it successfully.

SSH for the machine should still work, but connecting to exposed ports, such as
the Docker daemon port (usually <ip>:2376), may not work properly.

You may need to add the route manually, or use another related workaround.

This could be due to a VPN, proxy, or host file configuration issue.

You also might want to clear any VirtualBox host only interfaces you are not using.
```

`docker-machine restart`するも効果なし。
[Issue](https://github.com/docker/toolbox/issues/346)にあるように、VirtualBoxの設定からHost-onlyを削除するも効果なし。
最終的には、以下で（恐らく）解決

1. `docker-machine stop default`
2. VirtualBoxの設定からHost-onlyのネットワークアダプタを削除　←必要か不明
3. 手動で以下をexport  

```
$ export DOCKER_CERT_PATH=~/.docker/machine/machines/default/
$ export DOCKER_TLS_VERIFY="1"
$ export DOCKER_HOST="tcp://192.168.99.100:2376"
$ export DOCKER_MACHINE_NAME="default"
```

これで、`docker-machine regenerate-certs default`が通るようになりました。
PostgreSQLでcustom形式でのdumpとリストアしたい時のインストール注意点


# はじめに
さわって3日めの全くのPostgreSQL初心者です。

これまでMySQL畑にずっとおりました。
とある業務でPostgreSQLに触れる機会があったのですが、pg_dumpしてリストアするときに失敗したので原因と解決策を書いていきます。

# 状況

* pg_dumpをカスタム形式でdumpできない
* カスタム形式でdump済みのpg_dumpがリストアできない

こんな感じで怒られたり

```
requested compression not available in this installation -- archive will be uncompressed
```

# 原因
ソースからインストールしたのですが、インストール途中の``./configure``のタイミングで

```
configure: error: zlib library not found
```

が表示されたのですが、**まいっか**と思って試しに

```
./configure --without-zlib
```

していた事が原因。

検証サーバーだったし普通に動いてたし、**まいっか**と思ってやっていた。

# 解決策

```
yum install readline-devel zlib-devel 
```

やって
もう一回インストールしなおし

# 反省点
**まいっか**良く無い
MACでOSイメージを焼く

ひさびさにSDカードにOSイメージを焼く。

```
$ diskutil list
/dev/disk0
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *500.3 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:          Apple_CoreStorage                         499.4 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
/dev/disk1
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:                  Apple_HFS Macintosh HD           *499.1 GB   disk1
                                 Logical Volume on disk0s2
                                 4D3ECD99-C952-4B12-B86F-937E107E6623
                                 Unlocked Encrypted
/dev/disk2
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *8.1 GB     disk2
   1:                 DOS_FAT_32 NO NAME                 8.1 GB     disk2s1

```

disk2にマウントされていることがわかる。
なので対象指定して実施。

```
$ dd if=OSイメージ名 of=/dev/rdisk2 bs=1m
dd: /dev/rdisk2: Resource busy
```

どうやら調べるとMACで自動的にマウントしているから。そりゃそうだね。。。
dfでなんて名前でマウントしてるか調べる

```
$ df 
Filesystem    512-blocks      Used Available Capacity  iused    ifree %iused  Mounted on
/dev/disk1     974716928 577840184 396364744    60% 72294021 49545593   59%   /
devfs                373       373         0   100%      647        0  100%   /dev
map -hosts             0         0         0   100%        0        0  100%   /net
map auto_home          0         0         0   100%        0        0  100%   /home
/dev/disk2s1    15742976      5120  15737856     1%        0        0  100%   /Volumes/NO NAME
```

以下でアンマウント
```
$ sudo diskutil umount "/Volumes/NO NAME"
```

これで無事動きはじめた。
MyBatisの@Transactionalの並列動作について


※MySQL(InnoDB)での検証結果です。他のDBでは異なる動作になる可能性があります。

## トランザクション分離レベルがデフォルト(REPEATABLE READ※)の場合

※デフォルトのトランザクション分離レベルはDBによって異なります。MySQL(InnoDB)のデフォルトはREPEATABLE READですが、その他のDBの多くはREAD COMMITTEDのようです。

```
@Transactional
public void updateItem(int itemId) {
	Item item = itemMapper.getById(itemId);
	item.setNum(item.getNum() + 1);
	itemMapper.update(item);
	(何かの処理)
	...
}

```

このメソッドが順番に2回呼ばれた場合、item.numが合計+2される。この動作は他のパターンでも共通。

このメソッドがほぼ同時に2回呼ばれた場合、後に呼ばれた方は`itemMapper.update(item);`の直前で停止し、先に呼ばれたメソッドが終わるまで待つ。そのため、どちらのメソッド呼び出しもnumに初期状態から+1された状態のデータでupdateされることになる。

これを順次実行と同様の結果にするには、例えばupdateの条件式にpriceが元の値と同一であるという条件を入れ(楽観的ロック)、updateに失敗したらメソッドの実行をリトライするなどの手を加える必要がある。

## トランザクション分離レベルがSERIALIZABLEの場合

```
@Transactional(isolation=Isolation.SERIALIZABLE)
public void updateItem(int itemId) {
	Item item = itemMapper.getById(itemId);
	item.setNum(item.getNum() + 1);
	itemMapper.update(item);
	(何かの処理)
	...
}

```

このメソッドがほぼ同時に2回呼ばれた場合、後に呼ばれた方はメソッド呼び出し時点で停止し、先に呼ばれたメソッドが終わるまで待つ。そのため、先に呼ばれた方でnumに初期状態から+1され、後に呼ばれた方はその値を元にさらに+1するので、順番に2回呼ばれたのと同じ動作となる。

## ネストされたトランザクションの外側がデフォルト(REPEATABLE READ)、内側がSERIALIZABLEの場合

```
@Transactional
public void updateItem(int itemId) {
	updateItemInner(itemId);
}

@Transactional(isolation=Isolation.SERIALIZABLE)
private void updateItemInner(int itemId) {
	Item item = itemMapper.getById(itemId);
	item.setNum(item.getNum() + 1);
	itemMapper.update(item);
	(何かの処理)
	...
}

```

この場合の動作は**デフォルト(REPEATABLE READ)**になる！つまり、このメソッドがほぼ同時に2回呼ばれた場合、numは初期状態から+1された状態になる。トランザクション分離レベルにSERIALIZABLEを指定したからといってそれだけでSERIALIZABLEの動作になることが保証されているわけではないということなので注意。
当然ながら外側を非トランザクションにすればSERIALIZABLEの動作になる。

## ネストされたトランザクションの外側がSERIALIZABLEの場合

```
@Transactional(isolation=Isolation.SERIALIZABLE)
public void updateItem(int itemId) {
	updateItemInner(itemId);
}

@Transactional
private void updateItemInner(int itemId) {
	Item item = itemMapper.getById(itemId);
	item.setNum(item.getNum() + 1);
	itemMapper.update(item);
	(何かの処理)
	...
}

```

この場合は内側がどうあれ、SERIALIZABLEの動作になる。つまり、このメソッドがほぼ同時に2回呼ばれた場合、numは初期状態から+2された状態になる。
Golfing を Heroku にデプロイする

# 基本的な流れ
* https://devcenter.heroku.com/articles/getting-started-with-go#introduction
* http://deeeet.com/writing/2014/04/23/martini/

# 注意すべき事
* 各種設定値は TOML/YAML ではなく環境変数にて取得するようにする
  * https://devcenter.heroku.com/articles/config-vars
* カジュアルにクラッシュするのでその度に `heroku restart`
  * `heroku logs --tail` でログ確認
考察 > 暗号化と復号のタイミング

**(追記 2017/08/30): 「復号化」から「復号」に訂正しました。**


```txt:対象環境
Windows 7/8.1/10 ソフト
```

メールパスワードなど漏えいしては困るものを暗号化しつつ、それを復号してメール送信などに使う。
再起動時にもサービスを提供し続ける場合、そのパスワードを暗号化して保存しておくことになりそう。

その暗号化と復号のタイミングについて

- 例 1. コンポーネントで復号した値を持つ場合
  + 設定保存前に暗号化、設定保存直後に復号
  + 設定読込み時に復号
  + 使用時はコンポーネントの値をそのまま使う
- 例 2. 使用直前に復号化する場合(暗号化したものを保持) 
  + 入力直後に暗号化
  + 設定読込み時はそのまま 
  + 使用直前に復号して使う

ここで、コンポーネントというのは(内容非表示にした)テキストボックスなどのこと。

例2の方法の方が大半の時間暗号化されているため安全だと思われる。

例1の場合、ソフト動作時に別ソフトからメモリを読込んでコンポーネントの内容を読みとるなどされる可能性があるのだろうか?
巨大な JSON の中の Item の配列を 1行ずつの JSON にする方法

```json
{
    "Hoge": 100, 
    "Fuge": 100, 
    "Rows": [
        {
            "a": 1234,
            "b": 5678
        }, 
        {
            "a": 2345,
            "b": 6789
        }
    ],
    "Hoga": 100
}
```

みたいで Rows が巨大な JSON があったとして、

```json
{"a":1234,"b":5678}
{"a":2345,"b":6789}
```

としたいとする。こうすれば 1 行ずつ処理できるので便利だ。

```
hoge.json| jq -c '.["Rows"][]' 
```

で OK。
Facebook などの中毒性の高いウェブサイトに自分の時間を奪われないための方法

Facebook などのページをつらつらと眺めることで、時間を浪費してしまうことがあります。この問題を強い意志の力で解決することもできるかと思いますが、このページではソフトウェア技術を使った問題解決方法について紹介します。

## ブラウザ拡張を使用する

例えば Google Chrome には [StayFocused](https://chrome.google.com/webstore/detail/stayfocusd/laankejkbhbdhmipfmgcngdelahlfoji) というプラグインがあり、これを使うことで特定のウェブサイトを開いておける時間を制限することができます。

私もこのプラグインを使うことで、しばらくは中毒性の高いウェブサイトから身を守ることができました。しかし、例えば他のブラウザ (Safari や Firefox) を使うことで、このプラグインの制約を回避することができてしまいます。徐々に Safari や Firefox が「中毒性の高いウェブサイト専用のブラウザ」として私のコンピュータに居座るようになってしまい、最終的には時間を浪費する生活に戻るようになりました。

## Hosts を設定する

クライアントコンピュータとして Mac を使う場合、 /etc/hosts にホスト名と IP アドレスの対応リストを書くことができます[^1]。

[^1]: 同様のことは Windows でも可能ですが、ファイルパスが異なります。"windows hosts" などで検索してください。

例えば /etc/hosts を Vim などのエディタで開き、次の一行を足すことで www.facebook.com へのリクエストを無効にできます[^2]。

[^2]: 実際にはローカルホストへのリクエストに差し替えています。

```
127.0.0.1       www.facebook.com
```

こうすることで Facebook を開こうとしても、ブラウザが 404 ページを表示するようになるし、たかだか Facebook を開くために /etc/hosts を編集し直すのも面倒です。私はこの方法で Facebook で時間を浪費する習慣から離れることができました。また Facebook 以外のウェブサイトに対しても同様の手順で強制的にアクセスを禁止することができます。

## Facebook Messenger だけを許可する方法

個人的なことですが、Facebook の機能の中で Facebook Messenger だけは完全に無効にすると仕事に支障があります。その場合は、[www.messenger.com](https://www.messenger.com/) を開くことで Facebook のタイムラインに目を奪われることなく、知人とのメッセージ交換だけに集中することができます。
Gmail API for Goで、下書き生成ツールを作りました。

## 概要
Google APIs Client Library for Go を使って、
Gmail APIの下書き作成をしてくれるtoolを作成しました。

[go-gmail-drafts] (https://github.com/yyoshiki41/go-gmail-drafts)

## 下準備
１. [Google Developer Console] (https://console.developers.google.com/project) から、新規プロジェクトを作成する。
![57a8fca4-eb8d-96e8-95f0-3a337429579e.png](https://qiita-image-store.s3.amazonaws.com/0/20609/97a0acbe-ba49-a58e-90a4-9dc39195d1b1.png)

２. プロジェクトの [Gmail API] (https://console.developers.google.com/apis/library?project=daily-report-1192) を有効にする。
![3acdd028-8826-e0a0-5529-58ef18938efe.png](https://qiita-image-store.s3.amazonaws.com/0/20609/c687ea5b-8ee6-7096-af1d-43aad78d4650.png)


３. 認証情報を設定する。
![72f7b4ca-721a-0c75-857b-b193dbe231d8.png](https://qiita-image-store.s3.amazonaws.com/0/20609/493b7a80-e266-2760-f643-f38891b4eb7e.png)

必要な認証情報をクリック。
![b20701f0-6c26-0285-0168-a3f7bc565504.png](https://qiita-image-store.s3.amazonaws.com/0/20609/c5908b43-7b8f-e6ba-0e18-71e2537d0593.png)


OAuth クライアントの設定して、JSONファイルをダウンロード。
__後で使います！__
![b0e7a56d-abe1-1361-0af9-828e1d0594d7.png](https://qiita-image-store.s3.amazonaws.com/0/20609/986f6727-e43d-1cfa-76ed-4b3abee6f2ff.png)

## 使い方
１. `go get`

```bash
$ go get github.com/yyoshiki41/go-gmail-drafts
$ cd $GOPATH/src/github.com/yyoshiki41/go-gmail-drafts
```

２. 先ほどダウンロードしたjsonファイルを `config/client_secret.json`として配置。

```bash
$ mv ~/Downloads/client_id.json config/client_secret.json
```

３. 初回実行時はOAuth通し、アクセストークンを取得する。

```
$ go run savetoken/main.go
```
ブラウザが自動で開きますので、googleアカウントの認証を通します。

次に、Gmailでのアクションを許可します。
![09fee2f6-3f16-69c8-f365-015ae264bbf0.png](https://qiita-image-store.s3.amazonaws.com/0/20609/6e2100d1-ebea-69f3-5203-ec496a689df4.png)


テキストボックスに表示されたcodeをコピーする。
![0a5b000f-ab05-e6c8-5aa1-6c5ce748becf.png](https://qiita-image-store.s3.amazonaws.com/0/20609/699f49fa-45f4-40c3-4303-a16fa5a45eac.png)


４. ターミナルに戻って、tokenファイルを生成。
上でコピーしたコードを貼り付ける。

```bash
$ go run savetoken/main.go
URL: https://accounts.google.com/o/oauth2/auth?access_type=offline&client_id=hogehoge.apps.googleusercontent.com&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&response_type=code&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fgmail.compose+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fgmail.modify&state=state-token
Type the authorization code.
### コードをペーストする ###
Saving credential file to: .credentials/gmail_token.json
```
`.credentials/gmail_token.json` ファイルが生成されます。

５. 下書きテンプレを作成。

```bash
{
  "to": "xxx@gmail.com",
  "subject": "Daily Reports",
  "message": "Hello!\nThis is a draft."
}
```

６. `go run`で実行。

```bash
$ go run main.go
```
![スクリーンショット 2016-01-16 21.25.48.png](https://raw.githubusercontent.com/wiki/yyoshiki41/go-gmail-drafts/images/sample.png)

## 終わりに
`go build`でバイナリ化して、cron等に登録すれば毎日下書き作成等に使えます！
Android Studioでアプリのバージョン情報はmanifestには書かない

#問題

EclipseからAndroid Studioに移行してから初めて、アプリのバージョンアップを行いました。
それまでの経験で、以下のように、manifestファイルにバージョン情報を埋め込んだのですが、出来上がったapkをストアにアップロードしようとすると、バージョンが上がっていない旨のエラーが出てしまう。

``` AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.example.package.name"
      android:versionCode="2"
      android:versionName="1.1">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        ...
    </application>
</manifest>
```

#解決策
少しだけ不思議になったが、Android Studioがきちんと該当行に警告を出してくれている。
それによると、バージョン情報はgradle側に設定しなければならないらしい。

↓これの build.gradle (Module: app)
![スクリーンショット 2016-01-22 15.15.24.png](https://qiita-image-store.s3.amazonaws.com/0/30011/33e006d9-ca28-d2fa-802c-d26da7481587.png)


上記`build.gradle`の中に`versionCode`と`versionName`を設定する部分があるので、その部分を変更すれば、アプリのバージョン情報を書き換えられる。

```build.gradle
apply plugin: 'com.android.application'

android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"

    defaultConfig {
        applicationId "io.ironoir.----"
        minSdkVersion 15
        targetSdkVersion 22
        versionCode 2
        versionName "1.1"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.2.0'
}
```

#教訓
IDEの警告にはきちんと耳を傾けよう。
CloudWatch Logs からElasticsearch Serviceに送るログのインデックス名を変える

AWSではCloudWatch LogsからElasticsearch Serviceにログを送ってKibanaで見るという運用ができるが、デフォルトだとインデックス名が「cwl-YYYY.MM.DD」固定になる。

複数のログを送る時など、インデックス名を変えたいこともあると思うのでその時のための覚書。

##インデックス名はLambdaで定義
CloudWatch Logs -> Elasticsearch Serviceのログ送信は裏側でLambdaを走らせている。

セットアップをした時に勝手にLambdaファンクションが作られているので、それのコードを書き換えればOK

####設定箇所
60〜70行目あたりに該当コードがあります。

```
    payload.logEvents.forEach(function(logEvent) {
        var timestamp = new Date(1 * logEvent.timestamp);

        // index name format: cwl-YYYY.MM.DD
        var indexName = [
            'cwl-' + timestamp.getUTCFullYear(),              // year
            ('0' + (timestamp.getUTCMonth() + 1)).slice(-2),  // month
            ('0' + timestamp.getUTCDate()).slice(-2)          // day
        ].join('.');

```

「var indexName」がそのままファイル名になるので、ここを任意の名前に書き換えればインデックス名を分けることが可能です。

その下のコードを見ると「payload.logGroup」からは「ロググループ」が「payload.logStream」からは「ログストリーム」の値が取れる様子なので、その辺りでif分岐かければいいんじゃないかなと思います。

####if分岐に使えそうな値一覧

```
        var source = buildSource(logEvent.message, logEvent.extractedFields);
        source['@id'] = logEvent.id;
        source['@timestamp'] = new Date(1 * logEvent.timestamp).toISOString();
        source['@message'] = logEvent.message;
        source['@owner'] = payload.owner;
        source['@log_group'] = payload.logGroup;
        source['@log_stream'] = payload.logStream;```
OculusSDK + UnityのTips

随時追記します。

#環境
- Unity 5.2.4以降
- OculusUtility for Unity 0.1.3

#トラッカーカメラから見た絶対座標にOvrCameraRigを置きたい。
通常の処理では、
```
OVRManager.display.RecenterPose();
```
を呼ぶと、呼んだときのHMDの位置を基準点として頭部位置と姿勢をリセットします。

しかし、そうではなく、常にトラッカーカメラから見た絶対座標を使いたい場合は

ヒエラルキービューでOvrCameraRig以下のTrackerAnchorの子に配置すると、常に同じ位置に物体を表示できます。
FuelPHP 環境ごとに定数を設定する


FuelPHP には以下の 4 つの定義済みの環境があります。

* `\Fuel::DEVELOPMENT` 開発環境
* `\Fuel::TEST` テスト環境
* `\Fuel::STAGING` ステージング環境
* `\Fuel::PRODUCTION` 本番環境

今回は、 `\Fuel::DEVELOPMENT` を例に定数を設定します。

## 定数のファイルを設定

`fuel/app/config/<environment>/` 以下に定数設定用のファイルを作成し、そのファイルに定数を列挙します。
今回は `fuel/app/config/development/constant.php` を作成します。

```php:fuel/app/config/development/constant.php
// 定数を列挙
define('CONSTANT','EXAMPLE');
…
```

## `bootstrap.php` から `constant.php` を読み込む

`require` で先程作成した `constant.php` を下記の用に読み込みます。

```diff:fuel/app/bootstrap.php
…
  /**
   * Your environment.  Can be set to any of the following:
   *
   * Fuel::DEVELOPMENT
   * Fuel::TEST
   * Fuel::STAGING
   * Fuel::PRODUCTION
   */
  \Fuel::$env = (isset($_SERVER['FUEL_ENV']) ? $_SERVER['FUEL_ENV'] : \Fuel::DEVELOPMENT);

+ require APPPATH.'/config/'.Fuel::$env.'/constant.php' ;

  // Initialize the framework with the config file.
  \Fuel::init('config.php');
```
C++でusing宣言やusing指令はヘッダに書いてはいけないらしい

using宣言
`using std::string;`
=>stringがstdつけなくても使えるようになる。

using指令
`using namespace std;`
=>std(スタンダード)の中にある昨日がstdなしで全て使えるようになる。


using宣言やusing指令をヘッダに書いていた場合、
そのヘッダをincludeしているファイルで、予期せぬ識別子の衝突が起きる可能性がある。
グローバルが汚染され、予期せぬバグが発生する可能性があるのでusing宣言やusing指令はヘッダに書かないほうが良い。

```
そもそも標準ライブラリで用いられる識別子は、
名前空間の存在意義というのは、そもそもそのような衝突を防止するためにあるわけですので、
これでは標準ライブラリをnamespace stdでつつんでいる意味がありません。
```
(ﾟ_ﾟ)ﾌﾑﾌﾑ…

参考url
http://okwave.jp/qa/q3854747.html
WindowsクライアントPCからのVPN（L2TP/IPsec)接続を自動化しました

# 1. はじめに
　SoftLayer上に設定したVPN(L2TP/IPsec)サーバーへ接続するのには、クライアントPC起動後にVPN(L2TP/IPsec)接続操作を行います。
  毎日クラウドサーバーへアクセスする場合、この操作も面倒ですのでPC起動後のスタートアップでVPN(L2TP/IPsec)接続できるようにしました。

<strong><font color="red">
本投稿で使用している "TIMEPUT"コマンドは、クライアントPCのOSが「VISTA」以降でないと動作しません。
「XP」の場合は、"SLEEP"コマンドをお使いください。
"SLEEP"コマンドは、「Windows Server 2003 Resource Kit Tools」に含まれます。
https://www.microsoft.com/en-us/download/confirmation.aspx?id=17657
</font></strong>

# 2. VPN(L2TP/IPsec)自動接続バッチプログラム
　自動接続には<strong><font color="blue">「rasdial」</font></strong>コマンドを使用します。
 
 「VPNConnect.bat」という名でバッチプログラムを作成しました。

  ```Command:VPNConnect.bat
TIMEOUT /T 20
rasdial “VPN-L2TP接続” /disconnect
TIMEOUT /T 10
rasdial "VPN-L2TP接続" UserID Password
``` 

<strong>(1) TIMEOUT /T 20</strong>
Windows起動後、ネットワーク環境が安定するまで20秒待ちます。
   （各クライアントPC環境により時間調整してください。）

<strong>(2) rasdial “VPN-L2TP接続” /disconnect</strong>
VPN(L2TP/UPsec)は未接続ですが二重接続操作を防ぐ目的で、切断操作を実行します。

<strong>(3) TIMEOUT /T 10</strong>
10秒待ちます。
   （各クライアントPC環境により時間調整してください。）

<strong>(4) rasdial "VP-L2TP接続" UserID Password</strong>
VPN(L2TP/IPsec)を接続します。
<font color="brown">  ・"VPN-L2TP接続"----- クライアントPC側で登録した、VPN接続名
   ・UserID --------------- VPN(L2TP/IPsec)サーバーで登録したユーザーID
   ・Password ------------ VPN(L2TP/IPsec)サーバーで登録したパスワード</font>


# 3. バッチプログラム保存先
クライアントPCの下記スタートアップフォルダーに保存します。
<strong>
　　Cドライブ
　　　└ユーザー
　　　　└（ユーザー名）
　　　　　└AppData
　　　　　　└Roaming
　　　　　　　└Microsoft
　　　　　　　　└Windows
　　　　　　　　　└スタートメニュー
　　　　　　　　　　└プログラム
　　　　　　　　　　　└スタートアップ
</strong>
         
# 4. クラウドファイルサーバーの例
SoftLayer上のWindowsサーバーに、
<font color="blue">　・ファイアーウォール機能
　・VPN(L2TP/IPsec)機能
　・ファイルサーバー機能 </font>
 を1台に集約し、簡易ファイルサーバーを構築。
 
 クライアントPCからWindowsサーバーのパブリックIPにVPN接続して、プライベートネットワークからのみファイルサーバーへアクセスする。

「VPNConnectFS.bat」という名でバッチプログラムを作成し、PC起動後にバッチプログラムにより、VPN接続及びネットワークドライブアサインを行う。

  ```Command:VPNConnectFS.bat
TIMEOUT /T 20
rasdial “VPN-L2TP接続” /disconnect
TIMEOUT /T 10
rasdial "VPN-L2TP接続" UserID Password
net use x: \\xxx.xxx.xxx.xxx\共有フォルダー /user:FSUserID FSUser /persistent:no
``` 
net use p: \\xxx.xxx.xxx.xxx\共有フォルダー /user:FSUserID FSPassword /persistent:no
<font color="brown">   ・p: ---------------------- ネットワークドライブ
   ・xxx.xxx.xxx.xxx.xxx ----- Windowsサーバーのプライベートアドレス
   ・FSUserID -------------- WindowsユーザーID
   ・FSPassword ----------- Windowsパスワード
   ・/persistent:no ---------  次回ログオン時に再接続しない。
   (/persistent:yesだと、Windows起動後はVPN未接続のため、「ドライブアサインできない」ダイアログが表示される。)</font>

# 6. おわりに
　rasdialコマンドは使用する機会がなかなかありませんが、毎日接続する必要がある場合、起動運用が楽になります。
EZWebメール(auのキャリアメール)のメールをGmailに移行してみた

# はじめに
auは以前、auoneというGmailアプライアンスにキャリアメールを転送するサービスを行っていましたが、2013年9月でサービス終了しました。
その際、auoneのメールをGmailに移行し、Gmailへ転送するようにしました。ただ、auoneでは自分が送信したメールも転送されたのに対して、移行後は転送されるのは受信したメールだけになってしまいました。

今回、機種変更にあたり、受信したメールはGmailにあるから移行しなくてもよかったのですが、送信したメールがGmailになかったので、送信メールをGmailに取り込んでみました。

なお、この手順ではGmailへの取込に Outlook を使用しています。

#手順

##1. キャリアメールを開き、キャリアメールをエクスポートする
注)以下はandroidで行ってますが、ガラケーの場合も基本的には同じかと思います。(iPhoneはわからない。。。)

2つの方法があります。

* フォルダを開き、Eメールメニューから「ストレージへ保存」を選択します。
(選択したメールが、メールごとにファイルに保存されます。)
* 「Eメール設定」から「バックアップ・復元」→「メールデータバックアップ」を選択します。
(フォルダ単位の選択になり、個別のメール選択はできません。また、全メールが1ファイルに保存されます。)

ちなみに、前者はメールごとにファイルが作成されます。後者は全メールが1ファイルに出力されます。  この後の手順に合わせて、やりやすい方を選択します。

##2. エクスポートしたファイルをPCに転送します
エクスポートしたメールは、vmgというファイルに保存されます。保存場所はSDカードになりますが、パスはまちまちです。少なくとも、ガラケーとandroidでは異なっています。  
GALAXY Note 3の場合は private/au/email/BU/ の下でした。

なお、「PC」と言ってますが下記の操作ができればPCでなくてもよいと思います。(笑)

##3. エクスポートしたファイルをemlファイルに変換する。

vmgからemlに変換ツールもあるようですが、vmgもemlもテキストファイルなので、方法はいくらでもあります。
ここでは原始的にメモ帳などのエディタで加工する方法でやってみます。

さて、vmgファイルは以下のような形式のテキストファイルになっています。(拡張子.vmg)

	BEGIN:VMSG
	VERSION:1.1
	X-IRMC-STATUS:READ
	X-IRMC-TYPE:INET
	X-IRMC-BOX:SENTBOX
	BEGIN:VENV
	BEGIN:VBODY
	Date: Fri, 28 Feb 2014 12:42:03 +0900
	From: foo@example.com
	Subject: TEST
	Reply-To: 
	To: bar@example.com
	Cc: 
	Bcc: 
	MIME-Version: 1.0
	Content-Type: text/plain; charset=Shift_JIS
	Content-Transfer-Encoding: 8bit
	
	これはテストメールです。
	(メール本文)
	
	END:VBODY
	END:VENV
	END:VMSG

これを以下のように修正して、拡張子emlで保存すればemlファイルの完成です。

	X-IRMC-STATUS:READ
	X-IRMC-TYPE:INET
	X-IRMC-BOX:SENTBOX
	Date: Fri, 28 Feb 2014 12:42:03 +0900
	From: foo@example.com
	Subject: TEST
	Reply-To: 
	To: bar@example.com
	Cc: 
	Bcc: 
	MIME-Version: 1.0
	Content-Type: text/plain; charset=Shift_JIS
	Content-Transfer-Encoding: 8bit
	
	これはテストメールです。
	(メール本文)

要するに、以下のVMGヘッダを削除し、ファイルの拡張子を eml に変更すればOK。

	BEGIN|END:VMSG
	VERSION:1.1
	BEGIN|END:VENV
	BEGIN|END:VBODY

emlは1メール=1ファイルなので、この方法の場合、メール単位にファイルが保存される「ストレージへ保存」を使うとよいです。
逆に、UNIX mbox形式にするなどしてMUAにインポートする場合は1ファイルの方が早いので「メールデータバックアップ」の方がよいですね。

なお、`X-IRMC-`ヘッダはVMGのヘッダっぽいのですが、E-Mailのヘッダと同じ形式だし、内容も有用な場合がありそうなので残しています。というか、問題あるかないかという意味では、本文以降の`END:`ヘッダが邪魔(メール本文に表示されてしまう)なだけなので、そこだけ削除しても移行自体には問題がないです。

##4. emlファイルをOutlookで開き、「名前をつけて保存」でmsg形式で保存します
開くのはOutlookが入っていればダブルクリックで開けます。

##5. OutlookでGmailをIMAPで読み書きできるよう設定します
結構苦労しました。
基本的にはGmailの「設定」の「メール転送とPOP/IMAP」でIMAPを有効にして、その下の設定手順のとおりにやればいいのですが、「安全性の低いアプリのアクセスをオンにする」が必要でした。(Outlookが2010っていう古いバージョンだったからかもしれません。)

##6. msgファイルをGmailにインポートします
OutlookでGmailの「送信済みメール」フォルダを開き、msgファイルをドラッグ＆ドロップすればOKです。
送信メールなので「送信済みメール」に入れましたが、ドロップするフォルダはどこでもいい気がします。

# 最後に

エクスポートしたデータは添付ファイルもエンコードされて出力されるので、デコメもしっかり移行できました。(笑)
Redis-Objectを使って簡易ランキング機能を実装する


ネットで見かけた記事が `article.id=1` を経由するやり方でなんかイケてなかったので。

## [準備]redis-objectを利用する
redis-objectをプロジェクトのgemに追加します

```Gemfile
source 'https://rubygems.org' do
  # use redis server
  gem 'redis-objects',  '1.2.0'
end
```


## モデルの設定
redis-objectをインクルードします。
sorted_set以外については公式のREADMEにまとまっているので参照のこと
[redis-objects::Github](https://github.com/nateware/redis-objects)

```ruby:models/article.rb
class Article < ActiveRecord::Base
  include Redis::Objects

  sorted_set :ranking, global: true
end
```

`global: true` のオプションをつけることでidに紐付かないkeyとして保存される
ついでに、PVをインクリメントするインスタンスメソッドも作っておく

```ruby:models/article.rb
class Article < ActiveRecord::Base
  # ~略~
  def ranking_increment
    ranking.increment(self.id)
  end
end
```

コントローラからは `@article.ranking_increment` を呼ぶたびにスコアが1ずつインクリメントされる

## ランキングを取得する

ランキングを取得する際はインスタンスメソッドを経由する必要はなく以下で良い。

```
# スコアの上位1-5を取得
Article.ranking.revrange(0,4)
```

`Article.ranking[0..4]` だとscoreの小さい順からになるので、 `revrange` で取得する

以上です。
Redis-Objectは簡単で便利なのですが、メソッドの構成があんまり直感的じゃないので
Redisを理解してる場合はRedisで独自で実装した方がわかりよいような気がしました。

Enjoy Redis!
TI(Texas Instruments) MSP430 LaunchPadでHello World

MSP430 LaunchPad(MSP-EXP430G2)でとりあえずLEDをチカチカさせます。

![med_msp-exp430g2_mspexp430g2_lateral.jpg](https://qiita-image-store.s3.amazonaws.com/0/64910/cf2c1a61-08aa-d816-46d6-73230ce9fc00.jpeg)
http://www.ti.com/tool/msp-exp430g2#1

【環境】
OS:Windows 7（64bit）
IDE:Code Composer Studio(TI提供の無償ツール)

```c
#include <msp430.h> 

void initialize() {
	P1DIR |= BIT0;//LED1
	P1DIR |= BIT6;//LED2
}
/*
 * main.c
 */
int main(void) {
    WDTCTL = WDTPW | WDTHOLD;	// Stop watchdog timer
	initialize();
    while (1) {
    	P1OUT ^= BIT0;
    	P1OUT ^= BIT6;
    	__delay_cycles(100000);
    }
	return 0;
}
```
ループの中で所定のビットを反転させて、実行をdelayさせます。
この方法でもLEDの点滅を実現できますが、せっかくなのでタイマを使用して実現する方法についても記載します。割り込みを使った処理を行うため上記のループでdelayさせる処理よりも設定が増えます。

```c
#include <msp430.h> 

void init_timer() {
	TACCTL0 |= CCIE; // Enable Interrupt
	TACCR0 = 10000;
	TACTL |= TASSEL_1;
	TACTL |= MC_1;
}

void initialize() {
	P1DIR |= BIT0;
	P1DIR |= BIT6;
	init_timer();
}
/*
 * main.c
 */
int main(void) {
    WDTCTL = WDTPW | WDTHOLD;	// Stop watchdog timer
	initialize();
    while (1) {
    	_bis_SR_register(LPM3_bits + GIE);// ※1
    }
	return 0;
}

#pragma vector=TIMER0_A0_VECTOR //※2
__interrupt void Timer_A0(void)
{
	P1OUT ^= BIT0;
	P1OUT ^= BIT6;
}
```
初期化の際にタイマ関連のレジスタの設定を行っています。
(※1)は一旦置いておいて(※2)についてですが、これは割り込みルーチンを記述する際の決まりです。
pragmaを用いてコンパイラ特有の指令を記述しています。TIMER0_A0_VECTORというのはmsp430g2553.hで定義されいるアドレスで、この記述によりアドレスがTime_A0の割り込みベクタに設定されます。設定したタイマにより割り込みが発生した時に、この割り込みルーチンが呼ばれるという仕組みになっています。

(※1)ですがこれは動作モードの変更を行っています。
MSP430には動作モードが複数用意されていて、これを簡単に制御できるようになっています。
起動時はActiveModeで動作しており、全力で動作しているといったイメージです。

このプログラムではLPM3というモードで動作させるようにしています。LPMというのは(Low-Power Mode)のことで消費電力を抑えることのできるモードです。LPMも数種類ありActive Mode以外のモードはCPUがOFFになります。話がそれてしまいましたが、(*1)でLPM3というモードに移行しており、CPUがOFFになるのでプログラムもここで停止します。プログラムを停止させたので何らかの方法で復帰しないと機能を実現できません。今回の場合ですとLEDをチカチカさせることができなくなってしまいます。そこでタイマを利用して定期的に復帰させようという流れになっています。

1)whileループ内でLPM3モードへ移行しプログラムが停止
2)タイマ割り込みが発生しLEDをトグル

1と2を繰り返すため、LEDが点滅する動作となります。
仕組みさえわかればdelayで処理するよりもわかりやすいのではないかと思います。LEDを点滅させるだけであればどちらでもいいかと思いますが、処理が複雑になれば個々の処理の制御が難しくなってきます。

LaunchPadで遊びながらしっかりとマスターしたいと思います。
reactのバージョンを0.13から0.14に上げたら、Invariant Violation: addComponentAsRefTo(...)エラーが発生した。

色々とハマって調査に時間を費やしてしまったので、メモとして残しておきます。

# 始めに
reactとreact-bootstrapを使って遊んでて、reactのバージョンを0.13から0.14に上げ、
react-bootstrapのバージョンを0.27から0.28へ上げたら、突然以下のようなエラーが発生しました。

> Uncaught Error: Invariant Violation: addComponentAsRefTo(...): Only a ReactOwner can have refs. You might be adding a ref to a component that was not created inside a component's `render` method, or you have multiple copies of React loaded (details: https://fb.me/react-refs-must-have-owner).

# 結論
結論から言いますと、以下の通りReactDOMクラスをimportすればエラーは発生しなくなりました。

>import ReactDOM from 'react-dom'; 


# 詳細

利用しているモジュールは以下の通り。

| モジュール | バージョン |
|:-----------|:------------|
| react       |0.14.6         |
| react-bootstrap|0.28.2 |
| browserify | 9.0.8 |

今回は以下の様な感じでreact-bootstrapのInputコンポーネントを呼び出した際に上記エラーが発生しました。
（なお、Input以外のコンポーネントでも同様のエラーが発生しました。）

```js:sample.jsx
import React from 'react';
import Input from 'react-bootstrap/lib/Input';

export default class SampleComponent extends React.Component {

・・・（省略）・・・

  render() {
    return(
      <div>
        <Input id='lang' type='text' label='テキスト入力' placeholder='テキストを入力してください.' />
      </div>
    )
  }
}
```

```js:app.jsx
import React from 'react';
import SampleComponent from './sample.jsx';

・・・（省略）・・・

ReactDOM.render(<SampleComponent/>, document.getElementById('main'));
```

エラーのリンク先 (https://fb.me/react-refs-must-have-owner) を確認したら
"Multiple copies of React" のセクションにて以下の一文があったので、
npm ls react を実行して複数のreactのモジュールを読み込んでいないか確認しました。

> If you are using npm... npm ls or npm ls | grep react might help illuminate.

しかし、複数のreactモジュールは読み込まれてませんでした。
リンク先のコメントを一つずつ確認していくと、[ここ](https://gist.github.com/jimfb/4faa6cbfb1ef476bd105#gistcomment-1605418)や[ここ](https://gist.github.com/jimfb/4faa6cbfb1ef476bd105#gistcomment-1630788)にヒントがありました。
ひょっとしたらreact-domをimportする必要があるのか？と思って試にimportしてみると
エラーが発生しなくなりました。

```js:
import React from 'react';
import ReactDOM from 'react-dom';
import SampleCompnent from './sample.jsx';

・・・（省略）・・・

ReactDOM.render(<SampleComponent/>, document.getElementById('main'));
```

バージョン0.13を使っていたときは、react-domをimportしなくても問題なく動いていました。
しかし、バージョン0.14からReactDOMが分離されたことを把握しておらず、
react-domをimportしていなかったたため、今回のエラーに遭遇したと思われます。
（もし違っていたら、ご存じの方、ご教授ください。）

今回はたまたまreact-bootstrapのコンポーネント呼び出し時にエラーが出ましたが、
他のモジュールを使った場合でも同種のエラーが発生することがあるようです。
個人的備忘録

個人的に何度も検索してしまうことを備忘録として簡単に残しておく
内容としてはhtmlやスクリプトや
Webサイト制作のために使ったサイトなど

# setTimeoutを使った自動ページ遷移
3秒後に自動でトップページに戻る動作

```js:jampUrl
setTimeout(function(){
      window.location.href = '/';
    }, 3000); 
```
# .on()について

- 一度に複数のイベントを定義できる

パソコンとタブレットのイベントを入力しておくことで
どのデバイスでも同じように操作することを可能にできる。

```js:on(1)
$('.test').on('click touchend', function () {
//クリック時、もしくはタップが終了したとき
    });
```
- 複数のイベントハンドラが一括定義できる

```js:on(2)
$('test').on({
  'mouseenter': function() {
    // マウスオーバー時の処理
  },
  'mouseleave': function() {
    // マウスアウト時の処理
  }
});
```

# 接続デバイスの検出

スマートフォン、タブレット、PCで区別したいときに使用する

```js:useDevice
function useDevice() {
    var userAgent = window.navigator.userAgent.toLowerCase();
    if (userAgent.indexOf('ipad') != -1) {
        return ("tablet");
    } else if (userAgent.indexOf('iphone') != -1) {
        return ("smartphone");
    } else if (userAgent.indexOf('Android') != -1) {
        return ("smartphone");
    } else {
        return ("pc");
    };
}
```

# switchの整理にディスパッチテーブル
スイッチ文と比べてシンプルな見た目になる

```js:useDevice
var boxArrays = {
    "boxA": 1,
    "boxB": 2,
    "boxC": 3,
    "boxD": 4,
    "boxE": 5,
    "boxF": 6,
    "boxG": 7,
    "boxH": 8,
}

var boxSet = boxArrays[process] | UNKNOWN
```

# ゼロパディング
```js:zeropadding
function paddingNumber(number, places) {
    var number = String(number);
    if (number.length > places) {
        return number;
    }
    return (Math.pow(10, places) + number).slice(places * -1);
}

```

numberに変換したい数値を入れる
placesに桁数をいれる
number = 10 , places= 3 の場合
結果は"010"となる。

# 文字の強調関係
- コード

```html:強調
<em></em> <!--強調--> 
<strong></strong>　<!--より強調-->
<u></u>　<!--アンダーライン-->
```
# アイコンなどのpngファイルサイズ最適化

[Tinypng](https://tinypng.com/)を使うことで画像サイズを縮小することができる

# デバッグに使う時計(年月日時分秒ms) 
```js:time
var date_obj = new Date();
var dayary = ["日","月","火","水","木","金","土"];
var nowYMD = 0;
var nowTime = 0;
var nowFullTime = 0;

function RealTimeChecker(){
    date_obj = new Date();
    nowYMD = "|"+date_obj.getFullYear()+"/"+date_obj.getMonth()+"/"+date_obj.getDate()+"("+dayary[date_obj.getDay()]+")";
    nowTime = date_obj.getHours()+":"+date_obj.getMinutes()+":"+date_obj.getSeconds()+":"+date_obj.getMilliseconds() + "|";
    nowFullTime = nowYMD + nowTime;
}
```
- きっちりするときにはゼロ埋めをすれば列をそろえられる

# javascript プロトタイプ宣言
- コード

```js:prototype
function Foo(){  };
        
Foo.prototype.greet = function (){ alert('hi') };
    
var foo = new Foo();

foo.greet();
```

# 更新ボタンと移動や×ボタン動作を区別する
- コード　(2ページ)

```js:pageA
window.name = window.location.href;
```

```js:pageB

if( window.name === window.location.href ){
      console.log("reload");
}else{
      console.log("NewPage");
      window.name = window.location.href;
}
```

- 概要

2ページ構成
ページAでwindow.nameに現在のページ(pageA)のURLを入れる。
ページBでwindow.nameと現在のページ(pageB)を比較して異なっているのならば
移動をしてきたと判断する、その時にwindow.nameを現在のページに更新する。

戻るを押して進むをした場合も戻った時にwindow.nameが更新されるので移動したと判断。
クローズをして直接戻った場合も移動したと判断。
タブを消した別タブで直接いった場合も移動したと判断

更新ボタンを押した場合はwindow.nameと現在のURLは同じになるので更新されたと判断。
Java プロセスをトレースする BTrace を試してみる

# Java プロセスをトレースする BTrace を試してみる

## BTrace について
- Java プログラムのトレーシングツール
- Java プログラムの実行状況に応じてプログラムで指定したアクションを実行できる
 - ex.) foo メソッドが呼び出されたらタイムスタンプを出力するなど

- その他のメリットとしては、jdb で Java のプロセスをデバッグする場合はあらかじめ JVM にデバッグ用のオプションを指定する必要があるが、BTrace ではその必要がない

- 元々 Project Kenai でホスティングされていましたが GitHub に移行した模様
 - https://github.com/jbachorik/btrace
 - https://kenai.com/projects/btrace


## BTrace のビルド
- Gradle を使う場合はインターネットに接続されている環境でビルドする必要があります

### ビルドしない
- ビルド済みのファイルがリリースページで公開されています
 - https://github.com/jbachorik/btrace/releases/tag/v1.3

- これを利用するのが良さそうです
- 以下は自分でビルドする場合の手順です

### Java の設定
- JDK をインストールし、JAVA_HOME を設定します

````
$ yum install jdk
$ export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk.x86_64/
````

### ダウンロード
- GitHub の Download ZIP ボタンでダウンロードします
- https://github.com/jbachorik/btrace

### 展開
````
$ mkdir -p ~/sfw/BTrace
$ mv btrace-master.zip ~/sfw/BTrace
$ cd ~/sfw/BTrace
$ unzip -q btrace-master.zip
````

### プロキシーの設定
- インターネットの接続にプロキシーサーバを通る必要がある場合はプロキシーの設定を行います

````
$ mkdir ~/.gradle
$ vi ~/.gradle/gradle.property
systemProp.https.proxyHost=<Proxy Host>
systemProp.https.proxyPort=<Port>
````

### ビルド
````
$ cd btrace-master
$ ./gradlew build
$ ./gradlew buildDistributions
$ ls build/distributions/
btrace-1.4-20160122.112634.noarch.rpm  btrace-bin-1.4-SNAPSHOT.zip
btrace-bin-1.4-SNAPSHOT.tgz	       btrace_1.4-20160122.112634_all.deb
````

### ビルドしたファイルを別のマシンにインストールする
````
$ cd build/distributions/
$ scp btrace-bin-1.4-SNAPSHOT.zip <user>@<host>:
$ ssh <user>@<host>
Password: <password>
$ mkdir ~/BTrace
$ mv btrace-bin-1.4-SNAPSHOT.zip ~/BTrace
$ cd ~/BTrace
$ unzip -q btrace-bin-1.4-SNAPSHOT.zip
````


## BTrace を使ってみる

### 準備
- 環境変数 JAVA_HOME, BTRACE_HOME, PATH を設定する

````
# export JAVA_HOME=/usr/lib/jvm/java-1.8.0
# export BTRACE_HOME=/root/BTrace
# export PATH=${HOME}/BTrace/bin:${PATH}
````

### トレース対象のプログラムのソースコード
````
import java.time.*;

class myprog01 {

  private String time;

  public static void main(String[] args) {

    myprog01 app = new myprog01();
    app.loop();

  }

  void loop() {

    while(true) {
      fun();
    }
  }

  void fun() {

    try {

      this.time = LocalDateTime.now().toString();
      Thread.sleep(1000);

    } catch(Exception e) {
      e.printStackTrace();
    }

  }

}
````

### トレースプログラム
````
# cat trace01.java 
import com.sun.btrace.annotations.*;
import static com.sun.btrace.BTraceUtils.*;

@BTrace
public class trace01 {

  @OnMethod(
    clazz="/myprog01/",
    method="/fun/"
  )
  public static void m(@Self Object o, @ProbeClassName String probeClass, @ProbeMethodName String probeMethod) {
    println(Time.millis() + ": " + probeClass + "::" + probeMethod + "()");
  }

}
````

### トレース対象のプログラムの PID
````
# jps
31367 myprog01
31593 Jps
````

### トレースの実行
````
# btrace 31367 trace01.java 
1453438332344: myprog01::fun()
1453438333345: myprog01::fun()
1453438334345: myprog01::fun()
1453438335345: myprog01::fun()
1453438336345: myprog01::fun()
...
````

## 要調査項目
- クラス名、メソッド名、タイムスタンプは出力できました

- スタックトレース、引数、インスタンス変数、ローカル変数にアクセスできるかどうか確認する
- スレッド ID にアクセス可能か
- オーバーヘッドはどのくらいか

- 安全に BTrace を終了する方法を確認する
 - BTrace によって挿入されたコードはどうなるか
Apache NiFiでSQLを投げてみる

Apache NiFiでRDBにSQLを投げて、結果をテキスト出力してみました。


## インストール
[本番サイト](https://nifi.apache.org/index.html)から、tar.gzかzipファイルをダウンロードして解凍します。

## 起動
binディレクトリ内のシェルを実行します。

Macな人の例
$ nifi-0.4.1/bin/nifi.sh start

詳しくは他の方が書かれているこのページが参考になります。
[データフローオーケストレーションツールApache NiFiとは？](http://qiita.com/kimutansk/items/a083fc963fbe31068cf8)


## JDBCコネクションを設定

画面左上のController SettingsアイコンからNiFi Flow Settingsダイアログを開いて、DBCPConnecitonPoolを追加します。

Controller Settingsアイコン
![スクリーンショット 2016-01-22 11.52.57.png](https://qiita-image-store.s3.amazonaws.com/0/88743/00767f96-ba3f-bac4-98ad-c5362a4bc2eb.png)


NiFi Flow Settingsダイアログ
![スクリーンショット 2016-01-22 12.01.48.png](https://qiita-image-store.s3.amazonaws.com/0/88743/1e7ec2cd-7a65-90aa-30e4-d0c56473b436.png)

DBCPConnecitonPoolダイアログ
![スクリーンショット 2016-01-22 12.20.54.png](https://qiita-image-store.s3.amazonaws.com/0/88743/b66a9ac7-138a-98c6-4ac1-dc57c67b7b49.png)


DBCPConnecitonPoolダイアログでは、JDBCのいつもの4点セット（コネクションURL、ドライバクラス名、ユーザ、パスワード）とドライバjarファイルのファイルパスを設定してください。ファイルパスの先頭には"file://"が必要です。

**設定が終わったら、右の方にあるイナズマアイコンをクリックして、ステータスをEnabledにして下さい。**


## SELECT文を投げてJSON形式てテキストファイルに出力する。

つづけて、Processorを追加してConnectionでつなぎます。基本的な使い方はこちらを参考にしてください。
[Apache NiFiで基本のデータフローを作成するには？](http://qiita.com/kimutansk/items/b235fe6cdd0c04ab7e10)


Processorは、「ExecuteSQL」「ConvertAvroToJSON」「PutFile」の３種類を使います。


### ExecuteSQLプロセッサの追加
![スクリーンショット 2016-01-22 13.13.55.png](https://qiita-image-store.s3.amazonaws.com/0/88743/920cd6cd-3c1e-ddcc-25a0-8dec43fd3390.png)

* Database Connection Pooling Service ・・・先ほど作成したJDBCコネクション
* SQL select query ・・・実行したいSQLのSELECT文


### ConvertAvroToJSONプロセッサの追加
設定内容はディフォルトのままで良いです。このプロセッサを省略してExecuteSQLのをPutFileに直接つなぐと、Avro形式のバイナリファイルが出力されます。

### PutFileプロセッサの追加
![スクリーンショット 2016-01-22 13.20.46.png](https://qiita-image-store.s3.amazonaws.com/0/88743/6fa81882-7da6-e156-f98b-335388e6a812.png)

* Directoryにファイルの出力先を設定します。

### Connection
Processorを追加したら、ExecuteSQLからCovertAvroToJSON、CovertAvroToJSONからPutFileをそれぞれConnectionでつないでください。

For relationshipsは、とりあえず、failuerとsuccessの両方にチェックを入れておきます。


Processorとコネクションの最終的なイメージ
![スクリーンショット 2016-01-22 12.56.44.png](https://qiita-image-store.s3.amazonaws.com/0/88743/29e99c3f-9e48-6396-cff5-e6fec584300b.png)


## 実行
準備が終わったら、Processorを3つともStartの状態にします。正常に動作すれば、PutFileプロセッサに設定したディレクトリにJSONファイルが出力されます。

## TODO
* 今回は静的なSQLを実行たが、パラメータ設定したい
* 取得したデータをDB保存したい
Cloud9でLaravel5.0の環境をつくる

#PHPのワークスペース作成
##Cloud9 IDE(https://c9.io/)にサインイン
###PHPプロジェクト作成

#PHP環境確認
##ターミナルでPHPバージョン確認
```
$ php -v
```

##Composer確認
```
$ Composer
```

#Laravelインストール
##ターミナルでLaravelインストーラ
```
$ composer global require "laravel/installer=~1.1"
```

#Laravelプロジェクト作成
```
$ composer create-project laravel/laravel MyProject 5.0
```

#Cloud9のサーバ起動
##Cloud9画面上部メニュー「Run Project」クリック
###Apache&PHPタブ内のURLでLaravelプロジェクトにアクセス
####※Apachのルートが表示されるため「MyProject」>「public」でLaravel画面表示
ansible_localにハマりました。

ansible_localで初期化しようとしたらホスト（OS）側にパス名が捻じ曲げられて、動作しないことがある。
なんでこうなったかはよーわからんのですが、たぶんこの挙動で合ってると思います。
誰か更なる検証求む。
#何なんだこの挙動。簡単ながら検証してみた。
`vagrant up`初回: 動作する
`vagrant provision`: 動作しない
VM起動中に`vagrant destroy`後`vagrant up`: 動作しない

VM起動中に`vagrant destroy`した後に
VBoxSVC.exeのプロセスツリーとPowerShellを終了、
その後`vagrant up`

動作した。

えー？

`vagrant halt`しての`vagrant up`は~~共有フォルダが認識されないので無理。ただ、同時に、VBoxSVC.exeが自動で終了していました。~~ VirtualBoxAdditions最新版が入っていれば認識され、動作もされました。

で、`vagrant halt`後に`vagrant destroy`、`vagrant up`したら動きました。

#結論(2016.3.17現在)
VBoxSVC.exeが起動してある時に行った場合、使えなくなる。
VBAdditionsのバージョンを確認すること。
Ansible_localを触りたいときは、他のVMを(destroyじゃなく！)haltしてから行うべし。

感想:この挙動、治る気配が感じないんですがorz
JAVA ジェネリクス

**<FONT color="#ff0000">ジェネリクス(generics)</font>**とは
汎用的(広く色々な方面に用いること)なクラスやメソッドを
特定の型に対応付けること。

![スクリーンショット 2016-01-22 13.33.13.png](https://qiita-image-store.s3.amazonaws.com/0/95187/c4273f55-ad2a-8d99-ca53-831a1b9df683.png)

- [ ] ジェネリクスとは_____________________________________________________                            
- クラス宣言時には、EやKという「仮の型名」を使っておく  
- クラス利用時に、それをStringなどの「実際の型」に置き換えして利用する             
______________________________________________________________________

クラスが「インスタンスを生み出す原型」ならば
ジェネリクス利用クラスは「クラスを生み出す原型」



[参考にしたページ(こちらのページから重要な部分を抜粋しました)](http://so-zou.jp/software/tech/programming/java/generic/)

▪️Test107.java

```java
public class Test107 {
	public static void main(String[] args) {
		Generics<String> s;
		Generics<Integer> i;
		Generics<Hero> h;

		Generics g = new Generics();
		g.put(1234);
		g.put("Java");
		System.out.println(g.get());

		Generics<String> g2 = new Generics<String>();
		g2.put("Java2");
		System.out.println(g2.get());

		Generics<Integer> g3 = new Generics<Integer>();
		g3.put(12345);
		g3.put(6789);
		System.out.println(g3.get());

		Generics<Hero> h2 = new Generics<Hero>();
		Hero hero = new Hero();
		Hero hero2 = new Hero();
		h2.put(hero);
		h2.put(hero2);
		System.out.println(h2.get());

	}

}
```

▪️Generics.java

```java
//ジェネリクスを使ったGenericsクラス
//インスタンスを1つだけ格納できる
//どんな型のインスタンスでも格納できる
//格納するためのput()メソッド、
//取り出すためのput()メソッドがる
public class Generics<E> {
	private E data;

	public void put(E d) {
		this.data = d;
	}

	public E get() {
		return this.data;
	}

}
```

▪️Hero.java

```java
public class Hero {

}
```
Javascriptでconsoleにサイト名をAAで出す！


# サイト名をconsoleにAAで出したい！

Firefoxのサイトにアクセスし、consoleを確認すると下の画像のように、火を吹く恐竜とmozillaの文字がAAで表示されるのをご存知でしょうか。
https://www.mozilla.org/ja/firefox/new/

![スクリーンショット 2016-01-22 12.31.16.png](https://qiita-image-store.s3.amazonaws.com/0/83231/b562c504-014f-e21d-7069-0bdbfb4f0380.png)

今回はJavascriptでAAを簡単にconsoleに出す方法をご紹介します。

## asciify

asciifyというモジュールを利用することで、文字を簡単にAAに変換してくれます。
https://github.com/olizilla/asciify

node.jsがお使いのPCに入っていれば、インストールはとても簡単です。

```
$ npm install asciify -g
```

使用方法は、下記です。

コマンドプロンプトで

```
$ asciify "Hello World" -a
```

と入力すると、下記のように一覧がずらっと出力されます。"Hello World"が引数なので自由に変更できます。
AAの上のところに名前もついていますね。

![スクリーンショット 2016-01-22 12.44.07.png](https://qiita-image-store.s3.amazonaws.com/0/83231/65162a34-d9d0-3e6c-07b5-4785b85a2828.png)


筆者はlarry3dが気に入ったので、下記のようにコマンド入力してお好みのAAを表示させます。
```
$ asciify "Hello World" -f larry3d
```

![スクリーンショット 2016-01-22 12.47.33.png](https://qiita-image-store.s3.amazonaws.com/0/83231/cc748236-7ef1-1836-0da7-26f8f21f3567.png)

コピーしてテキストとして貼り付けます。

![スクリーンショット 2016-01-22 12.50.06.png](https://qiita-image-store.s3.amazonaws.com/0/83231/6247645e-25d9-73be-3e85-5585b32dd301.png)

JavaScriptのconsole上では、バックスラッシュなどはエスケープ文字になってしまうため、
バックスラッシュは、バックスラッシュ２つに置換します。
※Windowsでは¥マークです。

![スクリーンショット 2016-01-22 12.51.46.png](https://qiita-image-store.s3.amazonaws.com/0/83231/64c9af3f-06e4-b166-5e78-503118930b79.png)

あとは、jsに組み込んで終了です。

## サンプル

```html:test.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<script>

console.log("\n" +
" __  __              ___       ___                          __      __                    ___        __ \n" +
"/\\ \\/\\ \\            /\\_ \\     /\\_ \\                        /\\ \\  __/\\ \\                  /\\_ \\      /\\ \\ \n" +
"\\ \\ \\_\\ \\      __   \\//\\ \\    \\//\\ \\      ___              \\ \\ \\/\\ \\ \\ \\    ___    _ __  \\//\\ \\     \\_\\ \\ \n" +
" \\ \\  _  \\   /'__`\\   \\ \\ \\     \\ \\ \\    / __`\\             \\ \\ \\ \\ \\ \\ \\  / __`\\ /\\`'__\\  \\ \\ \\    /'_` \\ \n" +
"  \\ \\ \\ \\ \\ /\\  __/    \\_\\ \\_    \\_\\ \\_ /\\ \\L\\ \\             \\ \\ \\_/ \\_\\ \\/\\ \\L\\ \\\\ \\ \\/    \\_\\ \\_ /\\ \\L\\ \\ \n" +
"   \\ \\_\\ \\_\\\\ \\____\\   /\\____\\   /\\____\\\\ \\____/              \\ `\\___x___/\\ \\____/ \\ \\_\\    /\\____\\\\ \\___,_\\ \n" +
"    \\/_/\\/_/ \\/____/   \\/____/   \\/____/ \\/___/                '\\/__//__/  \\/___/   \\/_/    \\/____/ \\/__,_ / \n")

</script>
</head>
<body>
  <h1>テスト</h1>
</body>
</html>
```

## 結果

結果はこうなります。

![スクリーンショット 2016-01-22 12.54.08.png](https://qiita-image-store.s3.amazonaws.com/0/83231/b2d8bc8e-7db5-996f-268f-5a4480b01fe4.png)
java play Framework FormHelperの種類

自分用メモ :octocat: 
FormHelper いつもどういうふうに書けばいいのか忘れてしまうので
使いやすいように種類をメモしておきます :green_book:
play2.4

/framework/src/play/src/main/scala/views/helper/
以下のようなHelperがあります。

```
 		
Helpers.scala
form.scala.html
input.scala.html
inputCheckboxGroup.scala.html
inputDate.scala.html
inputFile.scala.html
inputPassword.scala.html
inputRadioGroup.scala.html
inputText.scala.html
jsloader.scala.html
requireJs.scala.html
select.scala.html
textarea.scala.html

```

例えばラジオボタンだとこんなふうに

```
 * Generate an HTML radio group
 *
 * Example:
 * {{{
 * @inputRadioGroup(
 *           contactForm("gender"),
 *           options = Seq("M"->"Male","F"->"Female"),
 *           '_label -> "Gender",
 *           '_error -> contactForm("gender").error.map(_.withMessage("select gender")))
 *
 * }}}
```

ちゃんとそれぞれのhelperについて使い方の例が載っています。

[GitHub]
(https://github.com/playframework/playframework/tree/master/framework/src/play/src/main/scala/views/helper)より
AWS Directory Serviceを使ってEnterprise WI-FIを使う (2)

# AWS Directory Serviceを使ってEnterprise WI-FIを使う (2)

[AWS Directory Serviceを使ってEnterprise WI-FIを使う](http://qiita.com/kanagi/items/a0d39f4bb1b33325e8fe)の続き


802.1X認証を行っているので所属グループに応じたVLANの割り当てまで行えるようにします。
当然ながら認証を依頼する機器側がこの機能に対応している必要があります。

RADIUS側でユーザに応じてどのVLANを使えばいいかを返答するようにします。
ADの所属しているグループに応じてVLAN番号を渡してあげるようにします。対応機器なら通常下記を応答することでVLANを設定できるはずです。

```
    Tunnel-Type = VLAN
    Tunnel-Medium-Type = IEEE-802
    Tunnel-Private-Group-ID = VLAN番号
```



## /etc/raddb/modules/ldap

LDAPモジュールは別RPMなのでインストールしておきます。

```
yum install freeradius-ldap
```

LDAPモジュールでADの情報を取ってこれるようにします。


```diff:/etc/raddb/modules/ldap
ldap {
+	server = "ds.wacul.co.jp"
+	identity = "administrator@ds.wacul.co.jp"
+	password = "adのpassword"
+	basedn = "dc=ds,dc=wacul,dc=co,dc=jp"
+	filter = "(&(objectCategory=person)(objectClass=user)(mail=*)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(sAMAccountName=%{mschap:User-Name}))"

+	groupname_attribute = cn
+	groupmembership_filter = "(&(objectcategory=group)(member:1.2.840.113556.1.4.1941:=%{control:Ldap-UserDn}))"
+	groupmembership_attribute = memberOf
```

`mail=*` はメールアドレスが入っていたら、`(!(userAccountControl:1.2.840.113556.1.4.803:=2))`はユーザがdisableになっていなかったらという条件です。

`(member:1.2.840.113556.1.4.1941:=%{control:Ldap-UserDn})`はユーザが所属しているグループをネストされていてももってこれるようにします。

## /etc/raddb/sites-enabled/default

ldapモジュールを追加した上で、LDAP-GroupでどのVLAN番号を渡すかの判定を追加します。

```diff:/etc/raddb/sites-enabled/default
authorize {
        preprocess
        auth_log
+        ldap

...

post-auth {
        exec
+        if (LDAP-Group == "Marketing") {
+                update reply {
+                        Tunnel-Private-Group-ID = 10
+                }
+        }
+        else {
+		reject
+        }
+        update reply {
+                Tunnel-Type = VLAN
+                Tunnel-Medium-Type = IEEE-802
+        }
```

これでLDAP-Groupで指定した名前のグループに所属させたユーザでRADIUS認証するとTunnel-Private-Group-IDが返ってくるようになります。
elifでグループごとに設定を追加していくようにすると複数グループに所属している場合は記述順でVLAN番号が決まります。
Thunderbirdで受信トレイ以外のフォルダを自動的に受信する (引用)

# 概要

今までOWA(Office365)でメールを利用してフォルダ分けを利用していていました。先日よりThunderbirdに切り替えました。すると、受信トレイ以外のフォルダで自動受信してくれません・・。

## 環境

Windows7
Thunderbird 38.5.1

# 対応

[[Thunderbird] IMAPで、受信トレイ以外のフォルダを自動的に受信してくれなかった問題の解決策](http://oshiire.to/archives/1802)

[oshiire*BLOG](http://oshiire.to/)さんのブログからに記載の引用(さらに別ブログさんからの引用なので引用の引用になります..）になりますが次の通りで可能です。
ただし、私のアプリバージョンだと3.のmail.notification.count.inbox_onlyは設定値が無かったので1と2と4しか実施していません。

> 1.Thunderbirdの設定エディタを開く
> Windows：ツール→オプション→詳細→一般→設定エディタ
> Mac OS X：Thunderbird→環境設定→詳細→一般→設定エディタ

> 2.「mail.server.default.check_all_folders_for_new」を「true」に変更
>「mail.server.default.check_all_folders_for_new」を「true」に変更
> Thunderbird 5.0 より前のバージョンの場合は「mail.check_all_imap_folders_for_new」を「true」に変更
>これで新着チェックを受信トレイ以外も確認するようになる

> 3.「mail.notification.count.inbox_only」を「false」に変更
> 未読数の通知を受信トレイ以外もするようにする
> 新着メッセージの通知やGrowlなどでは通知されない模様
> 4. 設定エディタをとじてThunderbirdを再起動

以上です。

## 参考資料

[[Thunderbird] IMAPで、受信トレイ以外のフォルダを自動的に受信してくれなかった問題の解決策](http://oshiire.to/archives/1802)
kernel_require.rb:54:in `require': cannot load such file -- bundler/setup (LoadError)

```
 (47-get-parameters) $ bin/rails g migration create_item_params item_id:int key:string value:string
/Users/ms2/.rbenv/versions/2.2.3/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require': cannot load such file -- bundler/setup (LoadError)
        from /Users/ms2/.rbenv/versions/2.2.3/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
        from /Users/ms2/dev/projects/jsonone/vendor/bundle/ruby/2.2.0/gems/spring-1.6.0/lib/spring/commands.rb:33:in `<module:Spring>'
        from /Users/ms2/dev/projects/jsonone/vendor/bundle/ruby/2.2.0/gems/spring-1.6.0/lib/spring/commands.rb:4:in `<top (required)>'
        from /Users/ms2/.rbenv/versions/2.2.3/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
        from /Users/ms2/.rbenv/versions/2.2.3/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
        from /Users/ms2/dev/projects/jsonone/vendor/bundle/ruby/2.2.0/gems/spring-1.6.0/lib/spring/application.rb:77:in `preload'
        from /Users/ms2/dev/projects/jsonone/vendor/bundle/ruby/2.2.0/gems/spring-1.6.0/lib/spring/application.rb:143:in `serve'
        from /Users/ms2/dev/projects/jsonone/vendor/bundle/ruby/2.2.0/gems/spring-1.6.0/lib/spring/application.rb:131:in `block in run'
        from /Users/ms2/dev/projects/jsonone/vendor/bundle/ruby/2.2.0/gems/spring-1.6.0/lib/spring/application.rb:125:in `loop'
        from /Users/ms2/dev/projects/jsonone/vendor/bundle/ruby/2.2.0/gems/spring-1.6.0/lib/spring/application.rb:125:in `run'
        from /Users/ms2/dev/projects/jsonone/vendor/bundle/ruby/2.2.0/gems/spring-1.6.0/lib/spring/application/boot.rb:18:in `<top (required)>'
        from /Users/ms2/.rbenv/versions/2.2.3/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
        from /Users/ms2/.rbenv/versions/2.2.3/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
        from -e:1:in `<main>'

```

ってなって、なんか困ったけど、下記を拝見して解消。うーん。

http://cobachie.hatenablog.com/entry/2016/01/08/164650
XcodeでアプリをDebug BuildでArchiveする

# Xcodeでアプリをデバッグビルドでアーカイブする

## Edit Scheme

Xcode左上の停止ボタン?横のアプリのアイコンをタップして、「Edit Scheme...」を選択

<img width="432" alt="スクリーンショット 2016-01-22 12.01.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/29844/3a471185-56f7-dbdc-c390-86964501ac6c.png">

## Archive

ウィンドウが表示されるので、 「Archive」をサイドバーのメニューから選択する。

「Build Configuration」が Release になっていると思うので、 Debugに変えるとDebug Buildでアプリをアーカイブすることが可能

<img width="897" alt="スクリーンショット 2016-01-22 12.01.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/29844/8df689dd-cbb5-e980-fd94-a95522462d61.png">