OmniAICreator/Qiita-1.07M huggingface dataset:
dashDBにデータをロードする

クラウド型のデータベースを利用していると、どうやって大量のデータをアップロードするか、方法に迷いますよね。

わかった範囲でdashDBへのロード方法をまとめてみました。
個々の詳細はまぁ追々ってことで… :sweat_smile: 

1) LOAD from Desktop
2) LOAD from Cloud
3) DataWorks
4) LOAD client from ...
　4-1) コマンドラインから
　4-2) IBM Data Studio
5) レプリケーション
6) その他 番外編 Cloudantからの取り込み
7) 裏技的な…
8) 番外編その２ Twitterデータの取り込み

IBMサイトにLOAD方法の資料がありました。
「dashDBデータロード方法ガイド」
http://public.dhe.ibm.com/software/dw/jp/data/db2/dashdb/dashDB_HowToLoadData.pdf

**1) LOAD from Desktop**
![image](https://qiita-image-store.s3.amazonaws.com/0/112854/a42a3c7f-be0d-1a9d-e4f0-8e6ad373ed08.png)
dashDbのGUIから Load -> Load from Desktop
*☆100MBで警告でるけど無視すれば100MB以上でもロードOK! 数GBまではいけた!*

saboten10さんの「BluemixでAnalytics 〜dashDBにデータをロードしてみる」がわかりやすくまとまってました。
http://qiita.com/saboten10/items/74f4c2bd2b65c59df41c

現在はβ提供みたいですが「aspera」のplug inを導入し、aspera経由でロードすると、ファイルの転送がものすごく早くなります。
aspera独自の FASPプロトコル(Fast Adaptive and Secure Protocol)を利用して高速アップロードが可ということだそうです。
実際に試すと体感でも10倍は速いです。
*☆ファイルサイズに上限があるんで注意*
*☆ファイルのアップロードが高速になるのであって、その先のLOADの時間は変わりません笑*

**2) LOAD from Cloud**
![image](https://qiita-image-store.s3.amazonaws.com/0/112854/40401b70-c1cd-c751-0bc9-57fc996a4b24.png)
dashDbのGUIから Load -> Load from Cloud

SoftLayer Object Storage (Swift)やAmazon S3のユーザ-名、アクセスキー、セキュリティキー等があればそこから直接ロード可能です。

**3) DataWorks**
簡易ETLツール as a Serviceです。
色々なデータソースに対応しているようです。
https://console.ng.bluemix.net/catalog/services/dataworks/
http://ibm.com/analytics/us/en/technology/cloud-data-services/dataworks/

**4) LOAD client from ...**
   4-1) コマンドラインから
        dashDBのラインタイムクライアントを導入してその後LOADコマンドを実行する方法。
        *DB2とか使っている人はしっくりくるとおもう*

        １．接続情報を作成します
            db2 catalog tcpip node ノード名 remote ホスト名 server 50000
            db2 catalog db BLUDB as DB別名 at node ノード名
            db2 connect to DB別名 userユーザ名 using パスワード

        ２．データをロードします
            db2 load client from CSVファイル名 OF DEL INSERT INTO ターゲットのテーブル名

   4-2) IBM Data Studio
        GUIツール経由で
        https://www.ibm.com/developerworks/downloads/im/data/

**5) レプリケーション**
IBM Replication Server を使ってターゲットにdashDBをセット

**6) その他 Cloudantからの取り込み**
Cloudant側のコンソールからWarehousingを選択してソースのDBおよびターゲットのdashDBの情報を入力
    *JSON をリレーショナルデータベースに変換してLOADしてくれるので便利!*

**7) 裏技的な…**
データセンターにストレージを持ち込んで直接接続など…

**8) Twitterデータの取り込み**
dashDbのGUIから Load -> Load from Twitter
Twitterデータを予め定義されている表にロードしてくれます。
*利用にはBluemixのInsight for Twitterのサービスインスタンスが必要*

利用環境に応じて選択肢が多いのはいいですね。
もしかしたらまだ方法はあるかもしれませんが、こんなところで。
Contact Form 7のエラーメッセージをフックを使ってカスタマイズする

## 目標
エラーメッセージ自体はフォーム生成画面のオプションから変更は可能ですが、例えば電話番号入力欄とFAX番号入力欄があった場合。

電話番号のバリデーションをかけると電話番号もFAX番号もバリデーションエラーメッセージが「電話番号の形式が正しくないようです。」と出てしまい、FAXのエラーメッセージのみ「FAX番号の形式が正しくないようです。」などに変更したくてもできない状況でした。

部分的にエラーメッセージを変更する方法を探しましたが公式のドキュメントやネットの海をさまよっても日本語での解説が少なかったためドキュメント化します。

## 方法
下記のコードをfunction.phpに追記します。

```php
function hoge($error,$name){
    if($name === "対象のフォームのname値") {
        $error = '<span role="alert" class="wpcf7-not-valid-tip">FAX番号の形式が正しくないようです。</span>';
    }
    return $error;
}
add_filter('wpcf7_validation_error','hoge',10,2);
```

上記の方法はフォームが必須項目になっていない場合はそのまま使えますが、必須項目として使われていて、「必須項目に記入もれがあります。」などの文言を変更しない場合は条件を追記する必要があると思います。エラーメッセージ全部上書きされちゃうと思うので…

```php
function hoge($error,$name){
    if($name === "対象のフォームのname値"  && $error=== "上書きしたいエラーメッセージ"  ) {
        $error = '<span role="alert" class="wpcf7-not-valid-tip">FAX番号の形式が正しくないようです。</span>';
    }
    return $error;
}
add_filter('wpcf7_validation_error','hoge',10,2);
```

のようにすればうまくいく気がします。まだ試してないです。
試したら結果おしえてくらさい^q^

\$error , \$nameをダンプしてやればそのフォームでどのネーム値のものにどのエラーメッセージが出ているかが出るので条件分岐の参考にして下さい。

## 解説
大抵のフォームプラグインにはフックの一つや2つあるでしょうと言う希望的観測の元プラグインソースコードを追ってみたところ
plugins/contact-form-7/includes/contact-form.php 466行目付近に下記の関数があります。

```php
	public function validation_error( $name ) {
		$error = '';

		if ( $this->is_posted() ) {
			$submission = WPCF7_Submission::get_instance();

			if ( $invalid_field = $submission->get_invalid_field( $name ) ) {
				$error = trim( $invalid_field['reason'] );
			}
		}

		if ( ! $error ) {
			return $error;
		}

		$error = sprintf(
			'<span role="alert" class="wpcf7-not-valid-tip">%s</span>',
			esc_html( $error ) );

		return apply_filters( 'wpcf7_validation_error', $error, $name, $this );
	}

```
フォームのエラー画面に挿入されるメッセージのマークアップから検索をかけるとこの部分のみヒットするのでおそらくこの部分でエラーメッセージを生成しているんじゃなかろかと当たりをつけたのでコード読んでいくと

```php
return apply_filters( 'wpcf7_validation_error', $error, $name, $this );
```
この記述でフィルターフックが追加されていることが分かりました。

あとはこの部分にfunctionから引っ掛けて上書きしてやるという流れです。
Node.jsからdynamoDBを操作する　その1

ここしばらく仕事の関係でdynamoDBを扱うことが多いので備忘録も兼ねて
初回はAWSのSDKのインストールやセットアップ

## インストール
`npm install aws-sdk`
package.jsonに追記するなら--saveオプションも付けておく

## セットアップ
モジュールとして使えるようにエクスポートする方向で実装

```js:aws.js
var AWS = require('aws-sdk');

AWS.config.update({
    "accessKeyId": accessKey,     //アクセスキーID
    "secretAccessKey": secretKey, //シークレットアクセスキー
    "region": region              //リージョン
});
module.exports = new AWS.DynamoDB();
```

私の社内環境はプロキシを使っているため、その対応も加える

まずはproxy-agentを導入
`npm install proxy-agent`

先ほどのソースにプロキシ関係の設定を加える

```js:aws.js
var AWS = require('aws-sdk');
var proxy = require('proxy-agent');
AWS.config.update({
    "accessKeyId": accessKey,     //アクセスキーID
    "secretAccessKey": secretKey, //シークレットアクセスキー
    "region": region,             //リージョン
    "httpOptions": {
         agent: proxy("http://mycompany.co.jp:8080") //プロキシサーバーのアドレス
    }
});
module.exports = new AWS.DynamoDB();
```

これで準備はオッケー

## おまけ　プロキシ設定を環境変数から取得する

プロキシの設定は直接ソースに書いても設定ファイルから読み込んでもいいが、
それだと別の環境に移した時に書き換えるのが面倒くさい。
そこで、環境変数から取得してみようかと思います。

```js:aws.js
var AWS = require('aws-sdk');
var proxy = require('proxy-agent');
AWS.config.update({
    "accessKeyId": accessKey,     //アクセスキーID
    "secretAccessKey": secretKey, //シークレットアクセスキー
    "region": region,             //リージョン
});

//プロキシ設定は環境変数から取得
//http_proxyかhttps_proxyのどちらかがあればそれを設定する
//いずれも環境変数にない場合はプロキシの設定はしない
if(process.env.HTTP_PROXY || process.env.HTTPS_PROXY
    || process.env.http_proxy || process.env.https_proxy){
    var httpProxy = process.env.HTTP_PROXY ? process.env.HTTP_PROXY : process.env.http_proxy;
    var httpsProxy = process.env.HTTPS_PROXY ? process.env.HTTPS_PROXY : process.env.https_proxy;
    var proxyConfig = httpProxy ? httpProxy : httpsProxy;
    AWS.config.update({
        httpOptions: {
            agent: proxy(proxyConfig)
        }
    });
}
module.exports = new AWS.DynamoDB();
```

うーん、もう少しキレイにしたいところですが、そんなにこだわるところでもないのでこのくらいで。

次回はdynamoDBのscanについて書こうかと思います。
俺もズンドコキヨシやってみた

http://qiita.com/shunsugai@github/items/971a15461de29563bf90

```perl:zundoko.pl
use strict;
use warnings;
use IO::Handle;
STDOUT->autoflush(1);

my ($zun, $doko) = ('ズン', 'ドコ');
my $zzzzdoko = $zun x 4 . $doko;

my @target;
while(join('', @target) ne $zzzzdoko) {
    sleep(1);
    shift @target if (4 < scalar @target);

    push(@target, ($zun, $doko)[int(rand(10)) % 2]);
    print $target[-1], ' ';
}

print "\nキ・ヨ・シ！\n";
```

何番煎じだよって話だけど、今日は雨降ってて仕事やる気でなくて気分転換で作った。
Swift Alamofire x Unbox x Wrap で通信処理を簡単にしてみましょう〜

注意書き）秘伝のタレ（ノウハウ）や、実戦では必要なコードや綺麗なコードや私の好きなフォーマットなどはすべて除外してコード載せておきます。
エラーチェックや、ハンドリングや不具合など直す前のピュアなコードです。
使うときは自己責任でお願いいたします。

さて、Unbox/Wrap/Alamofire を組み合わせ私一人でウキウキしながら作った通信処理の一部分をご紹介します。
モデルクラスにラップしたりあんラップしたり、だるいですよね。。。
なんどもAlamofire.requestを書くのもだるいですよね・・・

そんなときはこんな感じにまとめてあげるといいですよ！
まぁ、向き不向きや、好き嫌いあるので、その辺は今回はスルーしてください！ 

```
    func requestt<T: Unboxable, U: WrapCustomizable>(
        method: Alamofire.Method,
        URLString: URLStringConvertible,
        structParameters: U?,
        headers: [String : String]?,
        completionBlock: ((unboxable: T?) -> Void)?,
        errorBlock: ((error: ErrorType?) -> Void)?) {
        
        var wrappedDictionary: WrappedDictionary? = nil
        if let parameters = structParameters {
            do {
                wrappedDictionary = try Wrap(parameters)
            } catch {
                errorBlock?(error: error)
                return
            }
        }
        
        Alamofire.request(method, URLString, parameters: wrappedDictionary, encoding: .JSON, headers: headers)
            .responseJSON(completionHandler: { (response: Response<AnyObject, NSError>) -> Void in
            debugPrint(response)
            let result: Result<AnyObject, NSError> = response.result
            
            if (result.isSuccess) {
                do {
                    let value: T = try UnboxOrThrow(result.value as! UnboxableDictionary)
                    completionBlock?(unboxable: value)
                } catch {
                    errorBlock?(error: error)
                }
            } else {
                errorBlock?(error: result.error)
            }
        })
    }
```

ご参考までに〜
[C++11] friend

`friend` is a keyword that will ignore the property (private, protected, public) of class members. That is to say your `friend` class could access any of your members no matter it is private or public.

The definition of `friend` has nothing changed in C++11 but more convenient.

As you can see here, we do not need to specify the `class` keyword anymore.

```cpp
class Enemy {
private:
    float hp;
    float attack_damage;

    // C++98 OK
    // C++11 OK
    friend class Admin;

    // C++98 error: C++ requires a type specifier for all declarations
    // C++11 OK
    friend Admin;
};
```

This change enables us to use the `friend` keyword to template.

```cpp
template<typename T> class Enemy {
private:
    float hp;
    float attack_damage;

    friend T;
};
```

When `T` is `int`, nothing will happen.

With this we can specify which class can access the private member of this class when we create a class instance.
AD2 > プローブ到着 > 10kHz方形波で補償を試そうとした > 10:1で8mV程度振動する

```txt:動作確認
Analog Discovery 2 (以下 AD2)
Windows 8.1 pro (64bit)
```

秋月電子で注文していたオシロスコープ用プローブなどが到着した。
到着が遅いと思ったら入金がまだのようで、入金したらすぐ到着した。

## 購入品

購入したのは以下

```
1.ＢＮＣコネクタ（ジャック）ＤＩＰ化キット
　　価格：￥200　×　数量：3　＝　合計：￥600
2.Ｌ型ピンソケット　２×３２　（６４Ｐ）
　　価格：￥150　×　数量：3　＝　合計：￥450
3.オシロスコープ・プローブ（６０ＭＨｚ）
　　価格：￥1,100　×　数量：1　＝　合計：￥1,100
```

L型ピンソケットは購入間違いで、32ピン2列でなく　16ピン2列を買おうとしていた。

プローブは以下を購入した (TEXAS60)
http://akizukidenshi.com/catalog/g/gM-00239/

プローブはどういうのがいいかまだ良くわからず、とりあえず30MHzを扱えるものとして上記を購入した。



## 治具作成

BNCコネクタDIP化キットを使って以下を作成

写真映りが悪いが、以下のようになっている。

- 基板の左側にストレートピンヘッダ（４列）があり、そこにBNCコネクタDIP化キットのピンを接続する
- ４列のうちに実際に使っているのは真ん中の２ピンのみで、それが赤色と白色の線に基板裏で接続している
- 赤色と白色の線は AD2 の Scope 1のPositive, Negative に接続する

![DSC_0149.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/4543ed39-1ed1-bc4e-dd3e-15c45a02dbf9.jpeg)

## 接続の様子

実際に接続した様子。AD2のコネクタ部分に接続しているものは以下

- 左側の赤と白は Scope 1 の Positive, Negative
- 右側の緑は Wavegen 1
- 右側の白は GND

![DSC_0152.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/f9be7b95-c5ce-bf88-eef2-fa25def0be9b.jpeg)


## 10kHz方形波の測定

https://www.youtube.com/watch?v=oxJQr4dKnys
の8:00あたりを参考に10kHzで補償しようとした。

### 1:1プローブ設定

x1の設定で1:1プローブにした状態。
方形波の上下位置は安定している。

![1to1.png](https://qiita-image-store.s3.amazonaws.com/0/32870/c8aad6c8-76d3-ef03-22ea-3f7beb1c0825.png)

### 10:1プローブ設定

x10の設定で10:1プローブにした状態。

方形波が上下に 8mV 程度振動している。
振動の理由について調べないといけない。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/fda2c0c9-14ad-d4c9-63b2-ae3bb4ff1070.png)
Jmeterの機能いろいろメモ

# はじめに
Jmeterには便利な機能がたくさんあります。
最近周囲でJmeterでのパフォーマンステストに関して需要が高めなので
いろいろ調べてみたもののメモです。

## 定番：結果をツリーで表示(リスナー)
実際に投げたリクエスト、返ってきたレスポンスの詳細やステータスコードなどが
詳しくわかるリスナーです。
テストを実施してみたらエラーになってしまっている！というときに
エラー内容の調査ができます。
ただし、このリスナーはかなりリソースを食うので
本番のPT時にはOFFにしておきましょう。

## エラー想定のテストには：アサーション(リスナー)
たとえば404エラーが出る想定のテストがしたい時もあると思うのです。
その場合は対象のテストのHTTPリクエストの下に追加＞アサーション＞アサーションで
追加して、下記のように設定します。
- Ignore Statusにチェック
- 応答コードにチェック
- パターンマッチングルールは条件に合わせて(今回は404のみなので一致でいいかな)
- テストパターンの枠の中に「404」と記入
![image](https://qiita-image-store.s3.amazonaws.com/0/82739/067a6ff1-f007-9a1c-1f5f-fe085971af7b.png)
これでまずエラーをスルーした後、404かどうかチェックして
想定外に200が出たり、500がでたりしていたら、エラーとして扱います。
エラーログで想定しているエラーを出力して真っ赤にならないようにしたいときはこれで。

## 具体的なTPSが決まっていたら：定数スループットタイマ(タイマ)
1分間に何サンプル実行するかを具体的に決められます。

## いろんなパラメータを入れたい：ユーザーパラメータ(前処理)
参考：[[JMeter][Benchmark] JMeter で動的パラメータ](http://d.hatena.ne.jp/defiant/20080909/1220943546)
これはある意味必須かもしれませんが、
リクエストパラメータを複数からランダムで指定して投げるなどの設定ができます。
csvやテキストにid等を羅列して変数に格納できます。

## ランダムな数字を入れたい：Random Variable
パラメータにランダムな数字を入れていろんな値が取れるパターンの他に
キャッシュにひっかからないようにするためにも使えます。
![image](https://qiita-image-store.s3.amazonaws.com/0/82739/38b2a1ed-a195-9f2a-cc5b-af1ec6c7ec47.png)
こんな感じでValuableNameに変数名を入れておいて
HTTPリクエストの「リクエストで送るパラメータ」で
![image](https://qiita-image-store.s3.amazonaws.com/0/82739/29238c9f-afa0-2357-1be3-29912c84125c.png)
というような感じでやっておけば
リクエストURLに「rand=1234」という感じで数字が入ります。
idなどに入れたい場合は\${huga_id}の部分が${RAND}になる…と。

# 他にもいろいろありますが…
使ってみたり調べたりしたもので
便利そうな使い方は追記していきます。

上記に書かれていたことを調べて思いましたが
だいたい下記に書いてありますです…

[JMeter簡易リファレンス](http://sy5.sakura.ne.jp/jmeter/ref/samplersindex.html)
ぜひご参照ください！
Vim で golang を書く環境を整える

* [Vim で golang を書く環境を整える](https://blog.masa23.jp/posts/2016/03/vim-go/)

個人ブログに移動しました。

---

vimでgo言語のコーディングをする場合にsyntaxであったり、gofmt,goimportsを使って
コーディングを楽にできるのですが、色々書いてくれている人の記事が個人的に複雑に感じたので
個人的にまとめてみました。
# golangのインストール
## OS X

```
$ brew install golang
```
## CentOS

```
$ sudo yum install golang --enablerepo=epel
```
## Ubuntu

```
$ sudo apt install golang
```
## GOPATH用のディレクトリを作成

```
$ mkdir $HOME/.golang
$ mkdir $HOME/go
```

## .zshrc への環境変数の設定（bashの場合は.bashrc）
* vim ~/.zshrc で編集

```
export GOPATH=$HOME/go
export GOROOT=$( go env GOROOT )
export PATH=$GOPATH/bin:$PATH
```

* .zshrcの再読み込み（bashの場合は.bashrc）

```
$ source ~/.zshrc
```

# vim-go のインストール
## vim-goの前にvimのプラグイン管理をインストール
今回はvimのプラグイン管理として[vim-plug](https://github.com/junegunn/vim-plug)を使います。

```
$ curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
 https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
```

## .vimrcの編集
* vim ~/.vimrc

```
call plug#begin('~/.vim/plugged')
Plug 'fatih/vim-go'
call plug#end()
```

## pluginのインストール
* プラグインインストール

```
vim +PlugInstall +q +q
vim +GoInstallBinaries +q +q
```

* goimports が実行されるよう設定を追加

```
$ vi ~/.vimrc
let g:go_fmt_command = "goimports"
```
LambdaからアクセスされるIPアドレスを固定する


サーバレスでアプリケーションを実行できるAWS Lambdaですが、先日の機能アップによりVPC内での実行が可能になりました。

[AWS Blog：LambdaファンクションからのVPC内リソースへのアクセス](http://aws.typepad.com/aws_japan/2016/02/access-resources-in-a-vpc-from-your-lambda-functions.html)

このアップデートまではLambdaはインターネット上で実行され、LambdaファンクションからVPC内のDBなどのバックエンドへアクセスする場合に使用されるIPアドレスは不定でした。
そのため、SecurityGroupやNACLで縛れず、すべてのIPからのアクセスを許可する必要があり、セキュリティ上の懸案がありました。

![lambda_0.png](https://qiita-image-store.s3.amazonaws.com/0/111300/e8347cd3-d8d2-ad49-8b72-1a24b414f091.png)


今回可能になったVPC内実行を応用することで、LambdaからアクセスされるIPアドレスを固定することができそうです。

Lambda実行時のGlobal IPを固定する
----

VPC内で起動されたLambdaファンクションがインターネットへの通信を必要とする場合、NATインスタンスまたはNATゲートウェイが必要になります。
つまり、VPCからインターネットへ出て行く通信のSourceIPはNATインスタンス/NATゲートウェイのEIPに必ず変換されます。

![lambda_1.png](https://qiita-image-store.s3.amazonaws.com/0/111300/a7900045-a059-6845-b216-0583975d7950.png)

Lambdaファンクションを実行するためのVPCを別途作成し、NATゲートウェイのEIPを付与します。
アクセスされるバックエンドではSecurityGroupにてEIPのみを許可することでセキュリティの確保が可能です。

LambdaをVPC内で実行する
----

同じVPC内でLambdaファンクションを実行する場合も、同じ考え方ができます。
VPC内に専用のSubnetを割り当てることで、Lambdaファンクションのみにアクセス許可を与えるSecurityGroup/NACLが作成できます。

![lambda_3.png](https://qiita-image-store.s3.amazonaws.com/0/111300/9fb068f0-faf3-9191-9e58-055e38275c9a.png)


また、別の理由になりますが、Lambdaファンクションが同時に多数実行されるようなアプリケーションの場合は、IPアドレスが枯渇する恐れがあります。
その対策も含め上記のように専用のSubnetを割り当てるか、新規VPC+Peeringがよいのではと思います。


さらに、どうしても1つのIPに絞りたい場合には以下のようにVPC内NATをしてアクセスさせることもできるかと思います。（ただし、これがどのようなユースケースがあるかは不明です・・・）


![lambda_2.png](https://qiita-image-store.s3.amazonaws.com/0/111300/fa4eec4c-f6ee-b99e-8ecf-8e6f9c467ca1.png)

おわりに
-----

LambdaファンクションがVPC内実行できるようになったことで、他にも色々と可能性が広がりそうです。

一方で、VPCというレイヤに縛られずインターネット上で実行することこそが本当のクラウドネイティブな気もします。（もちろん、セキュリティの担保は必須ですが）
ハイブリッドアプリを web 版として動かすための検討内容とその結果

# ハイブリッドアプリを web 化する

Cordova 製のアプリがあったとする。
とりあえず今動いているものを web アプリとして出したい。

ハイブリッドアプリだが Cordova Plugin でネイティブの機能をそれなりに使っているため、そのまま web サーバにおいても動かない。

web とスマホアプリでソースコードの切り分けを行い動作を変更しないといけないため、どう切り分けて動かすか検討した過程と結果を記す。

# 前提事項

Android アプリとして作っているが、ハイブリッドアプリのため web 技術で動いている。

具体的に言うと、 `Cordova`, `HTML`, `CSS`, `Angularjs`, `TypeScript`, `browserify`, `gulp` あたりで動いている。
テストはそれなりに書いてる。

# 事例

事例を探したが、 1 つしか見つからなかった。
この場合は web → アプリのようだ、今回とは逆。ソースコードをどう管理しているかは見つからなかった。

* [SPAのサイトをアプリにするメリットと開発での問題点について - Qiita](http://qiita.com/takeshy/items/f9bf734878acd75f9d9f)


# 検討内容 - 4パターン

観点は以下。

1. 管理のしやすさ
    * レポジトリを web / スマホアプリで共有するか
    * 共有しない場合重複コードが出てて、1つの回収で2か所の修正が必要
2. 開発スピード
    * サクサク作りたい
3. 既存アプリへの影響
    * テスト増えるのでキツイ


### 長いのでまとめ


|検討内容|ソース管理|スピード|既存影響|結果|
|---|---|---|---|---|
|1. if 文|:ok_woman:|:no_good:|:no_good:|:person_frowning:|
|2. 同名ファイルで gulp|-|-|-|:person_frowning:|
|3. submodule|:no_good:|:no_good:|:no_good:|:person_frowning:|
|4. 完全分離|:no_good:|:ok_woman:|:ok_woman:|:raising_hand:|


## 1. web かスマホアプリかで if 文を書きまくる

webアプリ, スマホアプリ共有でレポジトリを共有する。
ソースコード内に if 文を書き制御を行う。


```js
if(config.Platform === "web"){
  alert("target:web だよ！"):
} else {
  CordovaNotification.showAlert("target:android だよ！");
}
```

ビルド時に引数を渡し設定ファイルは書き換える想定。

```
gulp --target:web
gulp --target:mobile_app
```

### メリット

レポジトリが 1 つで済む。ソースコードの重複がなくなり管理がしやすい。

### デメリット

ソース内に if 文が大量発生する。
すでに動いている Android アプリのソースを修正しないといけない、つまりテストの時間割合が増える。


### 不採用

if 文の出現箇所をロジックのみに制限できればそれでも良いかもしれないが、表示切り替えのために View 側にも if 文が発生してしまい、どこで切り分けているのかぐちゃぐちゃになっちゃう...。
加えて既存アプリへの影響度が可能性高いので不採用。


## 2. web とスマホで同名のファイルを作り gulp で上書く

webアプリ, スマホアプリ共有でレポジトリを共有する。

* app/components/common/login.directive.ts
* app/service/web/alert.ts
* app/service/mobile_app/alert.ts

のように `common`, `web`, `mobile_app` の 3つのフォルダを作り、共通的に利用できるところは `common` に置く。
`web` と `mobile_app` で分割したい場合、外部 Class としてそれを common から呼ぶ。

### 不採用

これはどっちの `alert.ts` を `import` すればいいんだ！？ってなってエディタのシンタックスエラー出てしまうので却下された。


## 3. 共通部分を別管理し submodule 的に使う

レポジトリを `web`, `mobile_app`, `common` の 3 つ作る。

```bash
web$ git submodule add https://example.com/common.git common
mobile_app$ git submodule add https://example.com/common.git common
```

のように `common` を submodule として使う。
(私が git submodule を使ったことがないので間違っているかもしれない)


### 不採用

共有部分のみ切り出すコストやどう submodule として使うかなど、検討することが多く理解に乏しいまま使うとその後ハマる可能性があるため不採用となった。


## 4. レポジトリ完全分離

レポジトリを web と mobile_app で完全に分離する。
お互い独立した存在になる。

### メリット

web レポジトリにコピって不要な部分を削れば動く。
今後 web と スマホアプリが乖離していったとしても割り切って考えられる。
スマホアプリをネイティブで作り直したいね、となった時に mobile_app レポジトリをすれてばいいので身動きがとりやすい。
既存の Android 版に影響がまったくない。

### デメリット

ソースコードの重複が発生する。
mobile_app を修正すると web を修正しないといけない。
片方しか修正せずバグが発生するとかありそう。


### 採用

結論からすると、これを採用することにした。理由は以下。

ソースコードは重複するため管理が面倒だが成果物としてはそれぞれ別のものになるため、バグの切り分けなどがしやすい。
レポジトリを1つにしてしまうと既存のスマホアプリへの影響を考慮しなければいけないが、それぞれ分かれていればその考慮をしなくて良い。
テストも web のみすれば良い。


# 検討結果

**4. レポジトリ完全分離** になった。
せっかく Cordova だからいい感じに共通化とかしたかったんだけど、色々検討した結果ダメだった。

ただ、本当に完全分離が正しいのかわからない。。

**この方法の方が良い、他にもこんな方法あるなどあったらコメント欲しいです:bow:**
ズンドコキヨシ with Swift 〜 たまには無限ループ

#はじめに
<blockquote class="twitter-tweet" data-lang="en">
<p lang="ja">Javaの講義、試験が「自作関数を作り記述しなさい」って問題だったから<br>「ズン」「ドコ」のいずれかをランダムで出力し続けて「ズン」「ズン」「ズン」「ズン」「ドコ」の配列が出たら「キ・ヨ・シ！」って出力した後終了って関数作ったら満点で単位貰ってた</p>— てくも (@kumiromilk) <a href="https://twitter.com/kumiromilk/status/707437861881180160">March 9, 2016</a>
</blockquote>

最近swiftを書いてなくての演習。

速度重視なのか、ロジックが画期的なのか、とりあえずやれればいいのか
いろんな要素を限定せずに考えさせる出題者は素晴らしいなと。

#方針1
ループで溜まったら終わる。`ズン`とかどうでもいい

```swift:swift
import Foundation

let zundoko: [String] = [ "ズン", "ドコ" ]

var zundokoList:[String] = [];
while (true){
    let index = (Int)(arc4random_uniform(2))
    print("\(zundoko[index])")
    zundokoList.append(zundoko[index])
    //"ドコ"が来たら判定
    if (index == 1){
        if (zundokoList.count > 4){
            print("キ・ヨ・シ!")
            break
        } else {
            zundokoList.removeAll()
        }
    }
}

//確認用
print(zundokoList);
```

#方針2
カウントで判定してみる

```swift:swift
import Foundation

let zundoko: [String] = [ "ズン", "ドコ" ]

var zundokoCounter = 0;
while (true){
    let index = (Int)(arc4random_uniform(2))
    print("\(zundoko[index])")
    //"ズン"がきたらカウント上げ
    if (index == 0){
        zundokoCounter++
　　 //"ドコ"がきたら判定
    } else {
        if (zundokoCounter < 4) {
            zundokoCounter = 0;
        } else {
            print("キ・ヨ・シ!")
            break
        }
    }
}

```

結果はこっちの方が流れがわかりやすい
<img width="961" alt="スクリーンショット 2016-03-14 22.29.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/6cee4244-953a-22be-c064-e60d319fd470.png">

# 新人PGに向けて
`新人プログラマ応援`タグをつけたのは、
Mac使いのプログラマに取ってXcodeはObjective-Cやswiftに限定せず、別の言語でも活用できるわりとオールマイティな無料ツールだから。絶対に入れるべき。
playgroundの視覚効果は非常にわかりやすい。

無限ループにはお気をつけて。

#さいごに
NSStringとか書かなくなってたんだ。playground面白い。
railsで（slim,mysql2,rspec）で新しくプロジェクトを作成する方法

久しぶりにrailsに触ったら色々忘れてたので最初にやることまとめました
この手順でやったら基本的に最初は問題なく動くと思います。


##開発環境（version）

```rb
ruby 2.2.0
rails 4.2.4
```

##さっそく手順紹介

1 mysql設定

```rb
rails new hogehoge -d=mysql
```

2　rake db:createでエラる

```rb
rake db:create
Specified 'mysql2' for database adapter, but the gem is not loaded. Add `gem 'mysql2'` to your Gemfile (and ensure its version is at the minimum required by ActiveRecord).
``` 

3 Gemfileのmysql2にversionを追加する

```rb
gem 'mysql2', '~> 0.3.20'

bundle installを忘れない事
```

4 rake db:createでエラらない！（嬉しい！）

```rb
rake db:create
``` 

5 rspecをGemfileに追加する（rspecの設定を行う）

```rb
group :development, :test do
  gem 'rspec-rails', '~> 3.0.0'
end

bundle installを忘れない事
``` 

6 rspecのインストールをする（これでOK!なはず）

```rb
rails g rspec:install
``` 

7 最後にslimの設定（Gemfileに追加）

```rb
gem 'slim-rails'

bundle installを忘れない事
``` 

8 erbをslimに変換するgemをインストール

```rb
gem install html2slim
``` 

9 erbをslimに変換しちゃえば完成

```rb
for i in app/views/**/*.erb; do erb2slim $i ${i%erb}slim && rm $i; done
``` 

以上でございます！
最初の細かい設定さえ終わっちゃえば、久しぶりのrails楽しい！
ふううううううううううううう！

という状態になりますので、覚書を…！
誰かの役に立てば嬉しい！
Cloud9でjupyterを動かしてデータ解析しちゃえばいいじゃん！

[前回の記事](http://qiita.com/piruty_joy/items/cbe55ec89a3276475c4a)に続いて、今度はCloud9上でPython3 + jupyterをインストール、コンソールから起動してブラウザからアクセスすまでをやってみた。

さて、今回もPython3を使いたいので、 Cloud9上でPythonアプリケーションとしてworkspaceを作っておいて、PreferencesからPythonのバージョンをPython3にしておく。

そして、前回と同じようにPython3にはjupyterがインストールされていない。
...ということで、以下のコマンドを叩いてjupyterをインストールする。

```bash
$ sudo pip3 install jupyter
```

大量のコマンド実行ログと少量の警告にちょっとビビるが、特に問題なくインストールは完了した。
あとは、以下のコマンドを叩いてCloud9の仮想マシン上でjupyterを起動する。

```bash
$ jupyter notebook --ip 0.0.0.0 --port 8080 --no-browser
```

コマンドの意味としては「ipを0.0.0.0、portを8080に指定してjupyter notebookを起動。ブラウザでの初回起動はキャンセルだ」ということ。
ipとportについては前回同様、仮想マシン内のlocalhostで起動されても外からアクセス出来ないし、とりあえず外からアクセスできるipとportを指定して起動させておく。
また、jupyterは起動させると自分の環境内にあるブラウザを立ち上げて起動画面を表示させようとする。Cloud9上の仮想マシンで起動しているので、当然これはうまくいかない。そこで「--no-browser」を指定することでこの動作自体を行わせないようにする。

最後に、ブラウザ上からプロジェクトURL（https://[project名]-[user名].c9users.io 的な奴）にアクセスすれば、無事jupyterが表示される。

Cloud9は無料プランだと環境自体がかなり貧弱なので、重たい計算を回そうとすると破綻するだろうが、ちょっとしたスクリプトを実行してみたり思いついたことを実行してみたりすればいいと思う。
あと、Cloud9がここまで使えるなら、ノートPCじゃなくてChrome Bookでもいいかも。。と思ってみたり。
Oracle Application Container Cloud でJava Flight Recoderを使う際のTIPS

Oracle Application Container Cloud でJavaアプリを動かす際、Java Flight Recorder(JFR)が利用できます。何も指定しない場合defaultテンプレートが使われますが、より詳細な情報を得たい場合のやり方を書きます

- Oracle Application Container Cloudについては[こちら](http://www.oracle.com/webfolder/technetwork/jp/ondemand/ddd2015/c1.pdf)
- Java Flight Recorderについては[こちら](http://www.slideshare.net/ChihiroIto1/javadaytokyo2015-chihiroito-45javaflightrecorder)

# その1. 組み込みの"profile"テンプレートを使う
Oracle Application Container Cloudでは、Javaアプリはzipで固めてdeployします。zipファイルの中にはmanifest.jsonというファイルを配置します。書式はこんな感じです
`{
    "runtime": {
        "majorVersion": "8"
    },
    "command": "java -jar hoge.jar"
}
`
※majorVersion=JDKのバージョン, command=アプリの起動コマンド、です

commnadの記述をこう変えると、より詳細な情報が取得できる"profile"テンプレートが適用されます
`    "command": "java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:StartFlightRecording=settings=profile -jar hoge.jar"`

# その2. 自作テンプレートを使う
profileテンプレート、及びdefaultテンプレートは$JDK_HOME/jre/lib/jfr/に実体があります（default.jfc, profile.jfc）。これをカスタマイズして指定することも可能です
- JFRのテンプレートについては[こちら](http://docs.oracle.com/javase/jp/7/technotes/guides/jfr/config_rec_data.html)
- 例えばExceptionを全部記録したい場合、java/exception_throw句を以下のように変えます
`<event path="java/exception_throw">
<setting name="enabled" control="http://www.oracle.com/hotspot/jvm/enable-exceptions">true</setting>
<setting name="stackTrace">true</setting>
</event>`

manifest.json中のcommnad句は以下のようにします
`"command": "java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:StartFlightRecording=settings=$APP_HOME/hoge.jfc -jar hoge.jar"`

カスタマイズしたhoge.jfcファイル、及び修正したmanifest.jsonを再度zipに詰めて、再デプロイすれば完成です（zip内の配置はこんな感じ）

hoge.zjp
   |- hoge.jar
   |- manifest.json
   |- hoge.jfc
Rails 4.2.6 に更新した後に [DEPRECATION] `last_comment` is deprecated. と警告されるので対処する

本日 Rails のバージョンを 4.2.5.2 から 4.2.6 に上げました。その後、Rake タスクを実行すると、以下の警告が表示されるようになってしまいました。

```
$ bin/rake -T
[DEPRECATION] `last_comment` is deprecated.  Please use `last_description` instead.
[DEPRECATION] `last_comment` is deprecated.  Please use `last_description` instead.
[DEPRECATION] `last_comment` is deprecated.  Please use `last_description` instead.
[DEPRECATION] `last_comment` is deprecated.  Please use `last_description` instead.
[DEPRECATION] `last_comment` is deprecated.  Please use `last_description` instead.
```

ご、5 回も言わなくても…。鬱陶しいので取り除くことにしました。

まずは Gem をインストールしたディレクトリで `last_comment` というメソッドを呼んでいる箇所を検索してみます。僕は `.bundle` 以下に Gem を bundle install しているので、その配下を検索しました。

```
$ grep -R "\.last_comment" .bundle
.bundle/ruby/2.3.0/gems/rspec-core-3.3.2/lib/rspec/core/rake_task.rb:        desc "Run RSpec code examples" unless ::Rake.application.last_comment
.bundle/ruby/2.3.0/gems/rubocop-0.37.2/lib/rubocop/rake_task.rb:      desc 'Run RuboCop' unless ::Rake.application.last_comment
.bundle/ruby/2.3.0/gems/yard-0.8.7.6/lib/yard/rake/yardoc_task.rb:        desc "Generate YARD Documentation" unless ::Rake.application.last_comment
```

どうやら RSpec, Rubocop, YARD で使われている
`Rake.application.last_comment` ([Rake::TaskManager#last_comment](http://docs.ruby-lang.org/ja/2.3.0/class/Rake=3a=3aTaskManager.html#I_LAST_COMMENT))
が原因のようですね。試しにそれぞれの Gem を最新版に更新してみました。ただし YARD は既に最新バージョンでした。 

| Gem | 更新前 | 更新後 |
|-----------:|:------------:|:------------:|
| RSpec | 3.3.0 | 3.4.0 |
| rspec-core | 3.3.2 | 3.4.4 |
| Rubocop | 0.37.2 | 0.38.0 |


その後、再び Rake タスクを実行すると、警告は表示されなくなりました。やったね :star:
✨必見💫OSXターミナル💻高速化🚀手法✨

# 従来手法

```shell-session
example@localhost:~$ sl
```

![sl-slow.gif](https://qiita-image-store.s3.amazonaws.com/0/25060/c6dc79e2-56b1-5ac3-0780-a75a34b1b817.gif)

# 提案手法

下に示すAppleScriptをコピーしておいて以下のコマンドを実行

```shell-session
example@localhost:~$ pbpaste | osascript &
```

```applescript
tell application "Terminal"
    activate
    do script "sl" in window 1
    tell window 1
        set sz to get size
        repeat with i from 1 to 160
            delay 0.01
            set size to {600 + i * 5, 350}
        end repeat
        set size to sz
    end tell
end tell
```

![sl-fast.gif](https://qiita-image-store.s3.amazonaws.com/0/25060/71651a08-5db7-d754-62ea-0a850d9e0f00.gif)

# 提案手法 (改良版)

下に示すAppleScriptをコピーしておいて以下のコマンドを実行

```shell-session
example@localhost:~$ pbpaste | osascript &
```

```applescript
tell application "Terminal"
    activate
    do script "sl" in window 1
    tell window 1
        set sz to get size
        repeat with i from 1 to 120
            delay 0.01
            set size to {600, 350}
            delay 0.01
            set size to {601, 350}
        end repeat
        set size to sz
    end tell
end tell
```

![sl-fast-kai.gif](https://qiita-image-store.s3.amazonaws.com/0/25060/2a2ca528-d4f8-ba44-020a-246f630b61a7.gif)
cereal と boost::variant で何でもほいほい入れてシリアライズする例

# 概要

今朝ほど [boostjp の boost::variant に boost::make_recursive_variant の例](http://boostjp.github.io/tips/variant.html#recursive-variant)を書きました。また、今日は日中にお仕事でも [cereal](http://uscilab.github.io/cereal/) を便利に使ってにゃんにゃんシリアライズしていました。

と、いうわけで、 `boost::variant` と `cereal` を使い、「何でもほいほい入れてシリアライズできちゃう素敵かもしれない何か」の実装例を紹介したいと思います。

# 例

```
#include <cereal/cereal.hpp>
#include <cereal/archives/json.hpp>
#include <cereal/types/vector.hpp>
#include <cereal/types/unordered_map.hpp>
#include <cereal/types/string.hpp>
#include <cereal/types/boost_variant.hpp>

using variant_data_type = boost::make_recursive_variant
< std::string
, std::uint8_t, std::uint16_t, std::uint32_t, std::uint64_t
, std::int8_t, std::int16_t, std::int32_t, std::int64_t
, float, double, long double
, bool
, std::vector< boost::recursive_variant_ >
, std::unordered_map< std::string, boost::recursive_variant_ >
>::type;

using variant_array_type = std::vector< variant_data_type >;
using variant_map_type   = std::unordered_map< std::string, variant_data_type >;

auto main() -> int
{
  using namespace std::literals::string_literals;
  
  variant_array_type array{ "hoge"s, true, false, 0x12345678 };
  variant_map_type   map{ { "key-1"s, "value"s }, { "key-2"s, 3.14f }, { "key-3"s, array } };
  variant_data_type  data = map;
  cereal::JSONOutputArchive( std::cout )( data );
}
```

## 出力

```json
{
    "value0": {
        "which": 14,
        "data": [
            {
                "key": "key-3",
                "value": {
                    "which": 13,
                    "data": [
                        {
                            "which": 0,
                            "data": "hoge"
                        },
                        {
                            "which": 12,
                            "data": true
                        },
                        {
                            "which": 12,
                            "data": false
                        },
                        {
                            "which": 7,
                            "data": 305419896
                        }
                    ]
                }
            },
            {
                "key": "key-1",
                "value": {
                    "which": 0,
                    "data": "value"
                }
            },
            {
                "key": "key-2",
                "value": {
                    "which": 9,
                    "data": 3.1400001049041748
                }
            }
        ]
    }
}
```

## 所感

( ﾟ∀ﾟ)ｱﾊﾊ八八ﾉヽﾉヽﾉヽﾉ ＼ / ＼/ ＼

・・・ほとんどわたし何もコード書いてなくてなぜかあやまりたくなるほど快適に素敵ななんでもほいほいを実装できてしまいました。快適。

# Reference

- [Qiita - C++のcerealのシリアライズが快適すぎるやばい](http://qiita.com/Ushio@github/items/827cf026dcf74328efb7)
- [Qiita - cereal を使いはじめるにあたって確認した事、はまった事](http://qiita.com/usagi/items/8e00f23b2508c98947b3)
- [cereal - Documentation](http://uscilab.github.io/cereal/)
- [cerael - source code](https://github.com/USCiLab/cereal)
    - [cereal/include/cereal/types/boost_variant.hpp](https://github.com/USCiLab/cereal/blob/master/include/cereal/types/boost_variant.hpp)
ズンドコキヨシ.jl

乗り遅れた[ズンドコキヨシ](http://qiita.com/shunsugai@github/items/971a15461de29563bf90)を科学計算が得意な言語Juliaで書いてみます。

ベタなの。

```jl
function zundoko()
  zd = z, d, = ["ズン", "ドコ"]
  w1, w2, w3, w4, w5 = ("","","","","")
  while [w1, w2, w3, w4, w5] != [z, z, z, z, d]
    cw = rand(zd); print(cw); w1, w2, w3, w4, w5 = w2, w3, w4, w5, cw
  end
  print("キ・ヨ・シ！")
end
```

Array内包表記使ったやつ

```jl
function 🚶🏃👯()
  🚶, 🏃 = 🚶🏃 = ["ズン", "ドコ"]
  👯 = ""
  while 👯 != join([🚶,🚶,🚶,🚶,🏃])
    👯 = join([rand(🚶🏃) for i in 1:5])
    print(👯)
  end
  print("キ・ヨ・シ！")
end
```

syntax highlight壊れてるけど、関数名は`🚶🏃👯()`です。

本当はLazy.jlとmapreduce使えばもっとすっきり書けるのかもしれないけれど、Juliaの伝道師が降臨するに違いない
【Mail】メールヘッダにはBCCが含まれない！

メールはヘッダのアドレスではなくエンベロープアドレスに基づき配送される。
メールヘッダはあくまでもデータ扱い。

BCCはエンベロープアドレスにのみ設定されるため、ヘッダには含まれない！

##送信シーケンス

| コマンド | 意味 |
|:-----------|:------------|
|telnet a.gabacho-unet.ocn.ne.jp smtp|通信コマンドを起動|
|220 a.gabacho-unet.ocn.ne.jp ESMTP Postfix|受け側からの通信準備完了メッセージ|
|HELO c.gabacho-unet.ocn.ne.jp|送り側のホスト・ドメイン名を名乗る|
|250 a.gabacho-unet.ocn.ne.jp|受け側のホスト・ドメイン名が返る|
|MAIL FROM:<deo@c.gabacho-unet.ocn.ne.jp>|差出人エンベロープアドレスを伝える|
|250 Ok|受諾メッセージ|
|RCPT TO:<webmaster@gabacho-net.jp>|受取人エンベロープアドレスを伝える|
|250 Ok|受諾メッセージ|
|DATA|メッセージデータの開始を通告|
|354 End data with <CR><LF>.<CR><LF>|受諾メッセージ|
|From: deo@c.gabacho-unet.ocn.ne.jp|メールヘッダ|
|To: webmaster@gabacho-net.jp|〃|
|Subject: test|〃|
||空白行|
|This is a test message.|本文|
|.|メッセージデータの終了を通告|
|250 Ok: queued as D295322642|受諾メッセージ|
|QUIT|通信終了を通告|
|221 Bye|終了受諾メッセージ

参考
[メールヘッダにないアドレスになぜ届く？](http://www.gabacho-net.jp/whims/whim0105.html)
[Crystal] ズンドコキヨシCR

何やら[流行ってるっぽい](http://qiita.com/shunsugai@github/items/971a15461de29563bf90)ので，**Crystal** でも書いてみたけれど，**Ruby** に食べさせたら普通に動いた。
**Crystal** ならでは，って書き方できるのかな？

```rb:zundoko.cr
zd = 0
until (zd == 30)
  puts (zd = ((zd << 1) + rand(2)) & 31).even? ? "ドコ" : "ズン"
end
puts "キ・ヨ・シ!!"
```


#<i class="fa fa-file-text-o"></i> 2016/03/15追記

「`"ドコ" : "ズン"`はやっぱり`"ズン" : "ドコ"`になるべきなのでは？」と自分からツッコミが入ったので修正版。

```rb:zundoko2.cr
zd = 0
until (zd == 30)
  puts (zd = ((zd << 1) + rand(2)) & 31).odd? ? "ズン" : "ドコ"
end
puts "キ・ヨ・シ!!"
```

ちなみに，**Ruby** だと後置の `until` が使えるので[^1]，もう少しコンパクトになって，ランダムでズンドコ出すところからキヨシ条件の判定までを１行で賄えます。

```rb:zundoko.rb
zd = 0
puts (zd = ((zd << 1) + rand(2)) & 31).odd? ? "ズン" : "ドコ" until (zd == 30)
puts "キ・ヨ・シ!!"
```

[^1]: **Crystal** では `while` や `until` を後置で使えません
[Windows]GCPチュートリアル「BOOKSHELF APP」のデプロイ時に日本語パスが問題でコケた時の回避策

# 現象

以下のチュートリアルを試していて、

- <a href="https://cloud.google.com/go/getting-started/tutorial-app" target="_blank">Tutorial App - Go — Google Cloud Platform</a>
 - <a href="https://cloud.google.com/go/getting-started/using-cloud-storage#download_app" target="_blank">Deploy the app to Google Cloud Platform</a>

AppEngineのデプロイツールを`go get`し、`aedeploy`したときに

```shell-session
$ go get -u google.golang.org/appengine/cmd/aedeploy
$ aedeploy gcloud preview app deploy app.yaml
ERROR: gcloud crashed (UnicodeDecodeError): 'ascii' codec can't decode byte ...
```

なるエラーが出てしまいデプロイが完了しません。

# 環境変数 TEMP,TMPの変更

```shell-session
$ set TEMP D:/tmp
$ set TMP D:/tmp
$ aedeploy gcloud preview app deploy app.yaml
(snip)
Updating module [default]...done.
Deployed module [default] to [https://your-app-name.appspot.com]
```

これまでの経験から**パスに日本語を含む場所かな**とおもったので、今回のケースであれば、`TEMP`,`TMP`を日本語含まないパスに変更すればデプロイまで完了できました！
gulp-watchを使って、ファイルを削除した時に書き出したファイルを削除する


```javascript:
var gulp = require('gulp'),
gulpwatch = require('gulp-watch'),
del = require('del');

gulp.task('watch', function() {
	gulpwatch(['sorce', 'develop'], function(file){
		if(file.event === 'unlink') {
			del( file.path.replace(/sorce/, 'develop') );
		}
	});
});

gulp.task('default', ['watch']);
```

もっといいやり方があると思う。
正規表現 | x オプションをご存知ですか？ ( 少しでも読みやすく )

x オプションを使うと、スペースを無視してくれます。

## 問題

たとえば次の正規表現が、何をやっているか。
ひと目でイメージすることが出来るでしょうか？

```rb
/\A(\d{3}-\d{3}-\d{1,3})|(\d{3}-\d{1,3})|(\d{1,9})\z/
```

僕は分かりません。

## 解決

次のように x オプションを指定すると。**スペースを無視**します。
そして、そもそも分かりにくい正規表現を。多少でも読みやすくすることが出来ます。

```rb
/\A ( \d{3}-\d{3}-\d{1,3}) | (\d{3}-\d{1,3}) | (\d{1,9} ) \z/x
```

## もっと読みやすく ( 改行する )

それが許されるプログラミング言語であれば、改行することも出来ます。

```pl
/
  \A
    (\d{3}-\d{3}-\d{1,3}) |
    (\d{3}-\d{1,3}) |
    (\d{1,9})
  \z
/x

```

## なんか気持ち悪い？

- 慣れの問題ではないでしょうか。
- 正規表現の場合、なぜか「詰めて書く」のが一般的です。ですが、たとえば逆に「プログラミングコードを改行なしで書く」ことや「SQLを改行なしで書く」ことを想像してみてください。



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
ズンドコキヨシ with Anko


http://qiita.com/shunsugai@github/items/971a15461de29563bf90

golang で書かれたお手製のスクリプト言語 anko でズンドコキヨシやってみました。

```go:zundoko.ank
#!anko
var rand, time = import("math/rand"), import("time")

rand.Seed(time.Now().UnixNano())

zundoko = ["ズン", "ドコ"]
arr = []
for {
  s = zundoko[rand.Int()%2]
  println(s)
  arr = arr + [s]
  if len(arr) > 5 {
    arr = arr[1:len(arr)]
  }
  if arr == ["ズン", "ズン", "ズン", "ズン", "ドコ"] {
    println("キヨシ！")
    break
  }
}
```
http://play-anko.appspot.com/p/8d9af627c19df577053e55c6f10fe062c52a03dc

https://github.com/mattn/anko
http://mattn.kaoriya.net/software/anko/20140328210749.htm
Chromeの「試験運用版のウェブ プラットフォームの機能を有効にする」を有効にしてるとQiitaのエディタが入力中に重くなる

なお、この現象はGithubのエディタでも発生します。

Chromeの「試験運用版のウェブ プラットフォームの機能を有効にする」(chrome://flags/#enable-experimental-web-platform-features)
を有効にしていると、Qiitaのエディタなどで入力しているとだんだん重くなってきます。

無効したら正常になりました。
いやあ... 使い終わったら忘れる前に無効にしないといけませんね。すみませんすみません。

Developer ToolsでTimelineを表示するとこんな感じです。入力してると途中から「Other」の処理が急激にかかるようになる。
![chrome_timeline_with_experimental-web-platform-features.png](https://qiita-image-store.s3.amazonaws.com/0/62178/c2ccc1bc-521a-e5b3-4dc0-433e91d03617.png)

どうもフォント関連の何かに問題があるようで、Elementsタブでtextareaのfont-familyを「monospace」だけにすると入力できなくなるほど重くなることはなくなりました。それでも若干重い。

![chrome_timeline_font_twaked_with_experimental-web-platform-features.png](https://qiita-image-store.s3.amazonaws.com/0/62178/da4c7ab1-00e8-183b-ddf7-ae1665e1a85a.png)

設定オフにすると完全に問題なくなりました。いやはや。
![chrome_timeline_without_experimental-web-platform-features.png](https://qiita-image-store.s3.amazonaws.com/0/62178/76959b47-a340-f75a-a14d-ca1dd12832b8.png)

この現象はtextareaでの入力時に顕著に発生するのですが、画面のlayout処理（たぶん）などでも発生するみたいです（大きな原因はたぶんフォントだろうけど確認してない）。最近画面の表示が妙に遅いなと思ったら「試験運用版のウェブ プラットフォームの機能を有効にする」の設定を確認すると良いかもしれません（普通は有効にしませんが）。

たぶんChroniumに報告したほうが良いんだろうなと思いつつ、現象の説明が面倒そうでやる気が出ない（すみませんすみません）。

----
Mac OS X El Capitan / Chrome 48

追記：Chrome 49にアップデートしたらそこまで重くならなくなった。（勢いこんで書いたのになんか恥ずかしいぞ）
Swift Wrap で JSON encode を簡単にまとめてみましょう。

さて、 Swift で Json を encode 簡単にできるライブラリはたくさんありますね。
その中で今気に入っているライブラリを紹介したいと思います。

```
struct User: WrapCustomizable {
   let name: String
   let age: Int
   let isMan: Bool

   func keyForWrappingPropertyNamed(propertyName: String) -> String? {
      if propertyName == "isMan" {
         return "is_man"
      }
      return propertyName
   }
}
```

のような Model を

```
{
   "name" : "shun",
   "age : 28,
   "is_man" : true
}
```

のような Json(Dictionary) に変換します。

具体的には。
```
let dictionary: [String : AnyObject] = try Wrap(user)
```

以上になります。
簡単ですね！

もっと使い込むと、すごくありがたみがわかります！
これでも十分ありがたいですがw

是非皆さんも使ってみてください！！

[参考](https://github.com/JohnSundell/Wrap)
Swift Unbox で JSON decode を簡単にまとめてみましょう。

JSON を decode してくれるライブラリはたくさんありますが、最近知り合いに教えてもらって使い始めた、Unboxが最高に良すぎて惚れてしまったので、まとめておきます。

```
{
    "name" : "shun",
    "age" : 28,
    is_man: true,
    date: "2016-01-01"
}
```

このJSON の Model は、

```
struct User: Unboxable {
    let name: String
    let age: Int
    let isMan: Bool
    let date: NSDate?

    init(unboxer: Unboxer) {
        self.name = unboxer.unbox("name")
        self.age = unboxer.unbox("age")
        self.isMan = unboxed.unbox("is_man")

        let dateFormatter = NSDateFormatter()
        dateFormatter.dateFormat = "YYYY-MM-dd"
        self.date = unboxer.unbox("date", formatter: dateFormatter) 
    }
}
```

となります。

実際に使うときは。

```
let user: User = try Unbox(dictionary)
```

簡単ですね！！
皆さんも是非使ってみてください〜

[参考](https://github.com/JohnSundell/Unbox)
Swiftでコールバック処理

開発中にコールバックが必要になったので備忘録。

```swift:ViewController.swift
...
override func viewWillAppear(animated: Bool) {
  super.viewWillAppear(animated)
  // 通知の監視
  NSNotificationCenter.defaultCenter().addObserver(self, selector: "callBack:", name: "callBack", object: nil)
  NSNotificationCenter.defaultCenter().addObserver(self, selector: "callBackError:", name: "callBackError", object: nil)
}

override func viewWillDisappear(animated: Bool) {
  super.viewWillDisappear(animated)
  // 監視の終了
  NSNotificationCenter.defaultCenter().removeObserver(self)
}

func callBack(notification: NSNotification) {
  // バックグラウンドスレッドからの通知を受け取る予定
  dispatch_async(dispatch_get_main_queue(), {
    let myObject = notification.object
    ...
  })
}

func callBackError(notification: NSNotification) {
  // バックグラウンドスレッドからの通知を受け取る予定
  // メインスレッドに移さないと画面表示できない
  dispatch_async(dispatch_get_main_queue(), {
    let myAlert = UIAlertController(title: "FAILED", message: "Error message", preferredStyle: .Alert)
    self.presentViewController(myAlert, animated: true, completion: nil)
  })
}
...
```

```swift:SampleViewController.swift
...
  // 通知を投げる
  if isErrorFlag {
    NSNotificationCenter.defaultCenter().postNitificationName("callBackError", object: nil, userInfo: nil)
  } else {
    let message = "SUCCESS"
    NSNotificationCenter.defaultCenter().postNitificationName("callBack", object: message, userInfo: nil)
  }
...
```
GitHubはSubversionのホスティングサービスとしても使える

GitHubはgitのホスティングサービスとして知られていますが、実はSubversionもサポートしています！
[tortoisesvn](https://tortoisesvn.net/)などの、subversionクライアントからでも全然使えてしまいます。

## いつからsubversion使えたの？
2010年の4月時点から、svnでreadすることはできていたようです。
https://github.com/blog/626-announcing-svn-support

要は、svn chekoutとリボジトリブラウジングができていたということでしょう。

2011年10月に、svn commitでコミットするなどもできたようです。
https://github.com/blog/966-improved-subversion-client-support

GitHub自体は2008年4月設立ですから、2年でsubversionをとりこむのも視野にいれたということでしょうか。
wikiによると、2010年にはリポジトリ数が100万を越えたころのようです。
https://en.wikipedia.org/wiki/GitHub

## 使い方

基本的な使い方は
https://help.github.com/articles/support-for-subversion-clients/

### チェックアウト

そのものずばりです。
`svn checkout https://github.com/user/repo` 

デフォルトブランチ（通常はmaster）がtrunk、各ブランチの内容はbranches、タグに対応するものはtagsにあります。

### コミット

gitと共存するので、trunkかbranchesのところからしかできないようです。
それを守れば、下記のような感じでできます。

```
svn add test.txt
svn commit -m "test commit"
```

### ブランチの作成

trunkをbraches以下にコピーするのが、subversionにおけるブランチ作成ですね。

```
svn update trunk
svn copy trunk branches/more_awesome
svn commit -m "create a topic branch"
```

## Subversionも使えることから何ができるか？

* オンプレミスのSubversionサーバをGitHubに移行
* subversionの経験しかないチームでもGitHubを導入できる
* subversionとgit、それぞれを使う人を共存させるプロジェクト運営
* subversionからgitへの移行

GitHub側でも移行ツールや、やり方を用意しているので、導入のハードルは大分下がってきているのでは。

* [GitHub Importerで、RedmineのSubversionリポジトリをGitHubへ移行](http://qiita.com/n_slender/items/55d8f8e7112c14e800de)

* [SubGitでSubversionからGitへ移行](http://qiita.com/n_slender/items/66b4c186c86abfbe5128)
* [Subversionを使用し続けているプロジェクトがGitに移行することを考えてみた](http://qiita.com/sh-ogawa/items/0bac2516d85e3db4dfd8)

* [Migrating from subversion to git and GitHub](http://www.slideshare.net/matthewmccullough/migrating-from-subversion-to-git-and-github)


## 参考サイト

http://d.hatena.ne.jp/idesaku/20100401/1270142644

http://labs.gree.jp/blog/2015/11/14608/

http://www.casleyconsulting.co.jp/blog-engineer/git/tower%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6subversion%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%82%92github%E3%81%B8%E7%A7%BB%E8%A1%8C%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E6%89%8B/

http://blog.glidenote.com/blog/2012/06/16/subversion-to-github/

http://shinya131-note.hatenablog.jp/entry/2015/06/01/200309

http://githubengineering.com/revamping-githubs-subversion-bridge/

http://www.baldanders.info/spiegel/log2/000823.shtml
ESXi逆引きメモ

必要に迫られたESXiの逆引きメモです。

# データストアで仮想マシンを移動、コピーさせる最の注意点
* 仮想マシンにスナップショットが作成されていると、移動先で仮想マシンが正常に起動しない場合が有る。発生した場合は元のデータストアに戻す。
* Linux系のOSではコピーした仮想マシンのNICが正常に動作しなくなるので再構築が必要。

# ESXiでシンプロビジョニング仮想ディスクの未使用領域を開放する方法

## vmkfstools
一旦データを書き込んだディスクは<b>シンプロビジョニング</b>であってもゲストOSのファイルを削除しても仮想ディスクのファイルサイズは変化しない。
しかし、ゲストOS側でディスク領域に「0」を書込とESXi側のツールで未使用領域の開放が出来る。

```
# vmkfstools --punchzero [仮想マシン.vmdk]
```

## 備考

- ゲストOS側でディスクの<b>フルフォーマット</b>を行ったりすると使用領域として認識されてしまうためクイックフルフォーマットを行えとの事。(Windows 2008 や Windows 7 などの Microsoft オペレーティング システムでシン プロビジョニング ディスクを使用している場合、ディスクの完全なフォーマットを実行すると、シン プロビジョニング ディスクがフル サイズに拡大されます。これを避けるには、クイック フォーマットを実行するオプションを選択します。詳細については、Microsoft の記事 941961 を参照してください。)

- パフォーマンスを考えるなら<b>シックプロビジョニング</b>を使えとの事。

## 参考

http://shobon.hatenablog.com/entry/2014/05/20/221416
http://shobon.hatenablog.com/entry/2015/03/07/212052
http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2078567
http://www.projectgroup.info/tips/VMware/comm_0009.html
Movable Type のmt-config.cgiを編集できない状況で、環境変数を設定する

Movable Type には [環境変数] (http://www.movabletype.jp/documentation/appendices/config-directives/) という仕組みがあり、システムの初期値を設定することができます。

Movable Type の環境変数は、通常mt-config.cgiに記述を行います。

しかし、mt-config.cgi の設定を編集できない状況なのに、どうしても環境変数を設定しなければいけない、という場合がありえます。

このようなときに、簡単なプラグインで環境変数の設定を行うサンプルです。



# 環境変数を設定するサンプルプラグイン[ConfigDirective]

テストケースとして、[ConfigDirective]というプラグインを作りながら解説します。

ConfigDirectiveの構成は以下のようになります。

```
Plugins─┐
        └─MultiBlog(デフォルトのプラグイン)
        └─ConfiDirective(フォルダ)
                └── config.yaml(設定ファイル)
```
[plugins]は、Movable Type のパッケージ内のディレクトリです。[MultiBlog] や [Mardkdown] など、デフォルトで設定されているプラグインが入っているディレクトリとなります。

[ConfigDirective] は、今回作成するプラグインの設定ファイルを含むフォルダとなります。
[config.yaml] は、今回環境変数を設定するファイルとなります。拡張子のとおり、yaml形式で記述します。

以下に、config.yamlの記述例を紹介します。

```
id: ConfigDirective
name: ConfigDirective
version: 1.00

config_settings:
    CGIMaxUpload:
        default: 50000
    AssetFileExtensions:
        default: png, gif
```

サンプルコードでは、以下の2つの環境変数を設定しています。

[CGIMaxUpload] (http://www.movabletype.jp/documentation/appendices/config-directives/cgimaxupload.html)
Movable Type からのアップロード可能なファイルの容量を設定する

[AssetFileExtensions](http://www.movabletype.jp/documentation/appendices/config-directives/assetfileextensions.html)
Movable Type の管理画面からアップロード可能なファイルの拡張子を設定する

今回の例では

- 50KB以上のファイルのアップロードを許可しない
- 拡張子がpng,gifのファイルのみアップロードを許可し、それ以外は許可しない

という設定になります。

このプラグインを設置後、アイテム管理画面から50kb以上、pngやgif以外の画像をアップロードしようとすると、以下の様に制限がかかります。

![cgimaxupload.png](https://qiita-image-store.s3.amazonaws.com/0/83767/0c80b112-b549-258e-204c-d13c9019ffb1.png)

50KB以上の画像をアップロードができなくなりました。

![assetfileextensions.png](https://qiita-image-store.s3.amazonaws.com/0/83767/453fa3ae-bd54-8b68-4162-f361d040dfc7.png)

拡張子jpgのファイルはアップロードできなくなりました。


# 環境変数の設定は可能な限り一箇所にまとめたほうが良い

今回はconfig.yamlの記述だけで、Movable Type の環境変数を設定しました。

実際の運用では、環境の設定が複数に分散されると、管理上の見通しが悪くなります。

環境変数などのシステム的な設定は、できる限り一元管理したほうが良いでしょう。

今回の方法はやむを得ない場合の手段、ぐらいにお考えください。

Movable Type のプラグイン開発については、以下のドキュメントも合わせて参照ください。
[プラグイン開発ガイド] (https://github.com/movabletype/Documentation/wiki/Japanese-developer-guide)
alpineベース のdockerのnginxのconfを調整する

# TL;DR
- docker hubの公式 nginx の docker imageをベースに設定ファイルを追加する
- ```nginx:mainline-alpine``` がalpineベースのnginx 1.9.12 (2016/03/14時点)
- [OFFICIAL REPOSITORY](https://hub.docker.com/r/_/nginx/) のDescriptionの設定どおりにDockerfileを作ればok

# Dockerfile

```Dockerfile
FROM nginx:mainline-alpine

MAINTAINER tknzk

COPY nginx.conf /etc/nginx/nginx.conf
```

# Ref
- https://hub.docker.com/r/_/nginx/
Arduino M0とESP-WROOM-02を使うときに見落としがちな設定

Arduino M0(Mo Pro)とESP-WROOM-02(ESP8266)をシリアル通信(ATコマンド)で使う際に必要なArduino IDEの設定方法をまとめました。設定せずとも動作するのですが、動作が不安定だったりサーバーから受け取った値が壊れたりするので必ず設定したほうが幸せになれます :innocent: 

# メモリリーク不具合を修正
Arduino M0は[arduino.org](http://www.arduino.org/)の[Arduino IDE](http://www.arduino.org/software)(2016/03/14時点の最新版は1.7.8)で開発するのですが、メモリリークする不具合があります。`/hardware/arduino/samd/cores/arduino/USB/samd21_device.c`の152行目を下記のように書き換えます。

```c
for (i = 0; i < sizeof(usb_endpoint_table)/4; i++) { 
    (*(uint32_t *)((uint32_t *)(&usb_endpoint_table[0])+i)) = 0; 
}
```

# バッファーサイズを上げる
`\arduino-1.7.8\hardware\arduino\samd\cores\arduino\RingBuffer.h`の`SERIAL_BUFFER_SIZE`でシリアル通信時のデータのバッファーサイズを設定できます。初期では64が設定されていますが、ESP-WROOM-02とシリアル通信を行うと超えてしまうことがあります。そうすると、サーバーから受け取ったデータが更新されなかったりデータが壊れる恐れがあるので、256以上を設定します。

```c
#define SERIAL_BUFFER_SIZE 256
```

# まだまだ情報少ないですね
国内でESP-WROOM-02が発売されてまだ一年たたないこともあり、まだまだ情報少ないですね :sob: これからもコツコツ踏んだ地雷の共有は続けていこうと思います。
BOMなしUTF8をBOMつきUTF8にするためのワンライナー

## サンプル

```
ruby -e 'print "\uFEFF"; while gets; puts $_; end' nobom.csv >  bom.csv
```

## 解説
\uFEFFはBOMのリテラル。これを最初に文字として出力する。あとはファイルを読んでは書き出すということをしているだけ。
RealmファイルをApp Groupで共有 / 削除

App Extension等使っているとApp GroupでRealmファイルを共有したい場合があるかと思います。その手順をメモ。

まずは App GroupのコンテナのURLを取得

```objc
NSURL *containerPath = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.com.test"];
```

Realmのファイルパスを作る
好みによって、フォルダわけしてもいいかもしれない (Realm DBを消す際にフォルダ単位で消せるため ) 

```objc
[containerPath URLByAppendingPathComponent:@"test.realm"]
```

後は、用意したURLをRMLRealmConfigurationの`+ (void)setDefaultConfiguration:` でセットしてあげるだけ。以下、全コード

```objc 
- (void)setupDB
{
    NSURL *containerPath = [[[NSFileManager defaultManager]
                            containerURLForSecurityApplicationGroupIdentifier:@"group.com.test"]
                            URLByAppendingPathComponent:@"test.realm"];
    
    RLMRealmConfiguration *config = [RLMRealmConfiguration defaultConfiguration];
    config.path = containerPath.path;
    
    NSLog(@"Realm file path: %@", config.path);
    
    [RLMRealmConfiguration setDefaultConfiguration:config];
}
```

もちろん、他の箇所で`[RLMRealm defaultRealm]`を呼び出す前に呼んでください。

---

##### 追記. Realmの削除

上記、Realmをフォルダにした場合は以下の方法で削除が可能です。 ( 公式のDocumentよりも簡単っぽい )。
`[self realmFolderURL]` はRealmフォルダのパスを示しています。

```objc
- (void)dropDB
{
    NSFileManager *manager = [NSFileManager defaultManager];
    NSError *error = nil;
    
    [manager removeItemAtURL:[self realmFolderURL] error:&error];
    
    if (error) {
        // error handling
        NSLog(@"error: %@", error);
    }
}
```

ちなみに、普通に削除する場合は[公式](https://realm.io/jp/docs/objc/latest/#realm-7)を見ればよい