OmniAICreator/Qiita-1.07M huggingface dataset:
POLYGONの外環となるLINESTRINGを線分に分解する

## 問題設定
任意のPolygonについて外周の線分集合がほしいこと、あると思います。
少なくとも僕はありました。
どういうことかというと、例えば次の図1のような(0.0, 0.0), (1.0, 0.0), (0.5, 1.0)からなる正三角形があったときに、それぞれの辺に分解したいということです。
![図1 正三角形](https://qiita-image-store.s3.amazonaws.com/0/24825/5891a2de-868b-f695-b664-ffa271f85caf.gif "図1 正三角形")
図1 正三角形

## 使う関数
こういう関数があるもの思い込んでいましたが、リファレンスを見渡してもどうも見当たりません。
で、下記関数の組み合わせでなんとかなるようです。

+ ST_ExteriorRing
+ ST_PointN
+ ST_NPoints
+ ST_MakeLine

## クエリ例
正三角形を用意します。

```postgres
CREATE TABLE triangle AS
SELECT ST_GeomFromText('POLYGON((0.0 0.0,1.0 0.0,0.5 1.0,0.0 0.0))') AS geom;
```

で次のようなクエリで3つのLINESTRINGに分解できます。

```postgres
SELECT ST_MakeLine(sp, ep)
FROM (
    SELECT
        ST_PointN(geom, generate_series(1, ST_NPoints(geom)-1)) AS sp,
        ST_PointN(geom, generate_series(2, ST_NPoints(geom))) AS ep
    FROM (
        SELECT
            ST_ExteriorRing(geom) AS geom
        FROM
            triangle
    ) AS lines
) AS spep;
```

## 解説
内側のクエリから。

```postgres
ST_ExteriorRing(geom) AS geom
```

まぁ外環のLINESTRING取ってきてるだけですね。
で、

```postgres
ST_PointN(geom, generate_series(1, ST_NPoints(geom)-1)) AS sp,
ST_PointN(geom, generate_series(2, ST_NPoints(geom))) AS ep
```

ここがミソ。generate_seriesで`1〜最後尾1個手前のポイント`と`2〜最後尾のポイント`を作っています。
各レコードは

```
(1st Point, 2nd Point)
(2nd Point, 3rd Point)
(3rd Point, 4th Point)
```

みたいな形になります。
これを最後に

```postgres
ST_MakeLine(sp, ep)
```

でそれぞれ線分にする。

## 出力
上記クエリの出力を`ST_AsText`に食わせるとこうなります

```
"LINESTRING(0 0,1 0)"
"LINESTRING(1 0,0.5 1)"
"LINESTRING(0.5 1,0 0)"
```

やったー！

## 参考
ほぼこちらのママです。
https://www.mail-archive.com/postgis-users@postgis.refractions.net/msg02883.html
IPsec 認証方式の各 OS の対応状況

[VPN サーバを立てる](http://qiita.com/hoto17296/items/a0a29a4daa5f396617ff) ときに「クライアントにアプリをインストールせずに VPN が使えるようにしたいなあ」と思って対応状況を調べた。

いずれの OS も2016年8月時点での最新バージョンのみ。

|| XAuth | L2TP | IKEv2 |
|---:|:---:|:---:|:---:|
| Windows 10 | × | ○ | ○ |
| Mac OS X El Capitan | ○ | ○ | △[^mac-ikev2] |
| Android 6 | ○ | ○ | ×[^android-ikev2] |
| iOS 9 | ○ | ○ | ○[^ios-ikev2] |

[^mac-ikev2]: バグがあってまだ使えなさそう https://forums.developer.apple.com/message/55851
[^android-ikev2]: Android 5 では使えた気がするのに何故か 6 で消えた
[^ios-ikev2]: iOS 7 以下は不可。iOS 8 では一応対応するもプロファイルをインストールしないと設定できない。iOS 9 では GUI から設定可能。
Gitで特定のディレクトリ以下のdiffを見るときは、relativeオプションを使う

タイトル通り。「このディレクトリに差分があったら〜」みたいなことをするのにすごい良さげ。

```
git diff branchA branchB --name-only  --relative=subdir
```

便利。-- でファイルの差分見れるみたいなのを見つけてそこにディレクトリ名入れれるかなぁと思ったけど、できなかったので。

- releative 差分が有るか見たいディレクトリの名前を指定する
- name-only 差分があるファイルの名前だけ表示する。


試したのは```git version 2.7.4 ```です。
API GatewayでCognito UserPools  Authorizerを使う

## UPDATE

下記の内容の元ネタの[公式ドキュメント](http://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-integrate-with-cognito.html)に日本語翻訳作成されたので、そちらを参照してください。


# 概要

Cognito UserPools AuthorizerをAPI Gatewayに設定してAPIにアクセス制限を設定する方法を説明します。

というか[公式ドキュメント](http://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-integrate-with-cognito.html)の雑な翻訳です

全体としては下記の設定が必要ですが、3以降を記述します。

1. UserPoolsを作成
2. API GatewayでAPIを作成する
3. オーサライザーの設定
4. リソースに認証を設定
5. APIへユーザー情報を渡す

アプリのコード例としてjsでのクライアント、API(lambda)側でのスニペットを掲載します

- クライアント側: 認証と`Authorization`リクエストヘッダの設定
- API側: lambdaでユーザー情報を受け取る

## 設定

### オーサライザーの設定

任意のAPIの設定画面でオーサライザーを作成する

1. `オーサライザー` -> `作成` -> `Cognito ユーザープールオーサライザー` とクリック
2. `Cognito リージョン`, `Cognito ユーザープール` を選択
3. `オーサライザー名` にわかりやすい名前を入力
4. `IDトークンのソース` は「IDトークンをリクエストのどの部分で指定するか」を指定する。特別な理由がなければこのままで(`Authorization`ヘッダー)
5. `アプリクライントID正規表現` は適宜設定

### リソースに認証を設定

1. リソースのツリーから任意のリソースのメソッドを選択
2. `メソッドリクエスト` 内の`認証`のドロップダウンから作成したオーサライザーを選択

### APIへユーザー情報を渡す

1. リソースのツリーから任意のリソースのメソッドを選択
2. `統合リクエスト` 内の`本文マッピングテンプレート` で下記の例のようなJSONを設定

```json
{
 "email": "$context.authorizer.claims.email",
  "sub" : "$context.authorizer.claims.sub"
}
```

ユーザー属性は `$context.authorizer.claims.property` 形式で指定する。
属性はUserPoolsで設定したものと[デフォルトの属性](http://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-settings-attributes.html)が使える(?)

## コード例(JS)

### クライアント側: 認証

[amazon-cognito-identity-js](https://github.com/aws/amazon-cognito-identity-js)が必要

```js

const IDENTITY_POOL_ID='us-east-1:*****************';
const USER_POOL_ID='us-east-1_*******'
const USER_POOL_APPS_ID='**************************'
AWS.config.region = 'us-east-1'; // Region

AWS.config.credentials = new AWS.CognitoIdentityCredentials({
	IdentityPoolId: IDENTITY_POOL_ID
});

function login(email, password){
	const authenticationData = {
		Username : email,
		Password : password
	};
	const authenticationDetails = new AWSCognito.CognitoIdentityServiceProvider.AuthenticationDetails(authenticationData);
	const userData = {
		Username :email,
		Pool : userPool
	};
	const cognitoUser = new AWSCognito.CognitoIdentityServiceProvider.CognitoUser(userData);
        //コールバックは嫌なので結果はPromiseで
	return new Promise(function(resolve, reject){
		cognitoUser.authenticateUser(authenticationDetails, { onSuccess: resolve, onFailure: reject });
	})
}
```

### クライアント側: `Authorization`リクエストヘッダの設定

```js

import 'whatwg-fetch'

login('foobar@example.com', 'password').then((auth)=>{
  const token = auth.detail.idToken.getJwtToken() //idTokenを使う
  const headers = new Header({'Authorization': token}) //IDトークンのソースで設定したヘッダー
  return fetch('ENDPOINT', {headers: headers, method: 'GET'})
})
```

### lambdaでユーザー情報を受け取る

```js

function handler(event, context){
  /* 本文マッピングテンプレートで指定したキーで参照できる */
  console.log(event['email']) // 'foobar@example.com'
}
```
Dockerを使ってローカルにPostgreSQLサーバーを2行で作る (と思ったら1行で出来た)

追記: `docker run`時にイメージがなければ自動でpullをしてくれるそうです！なので1行で実行可能です！

---
[DockerHub](https://hub.docker.com/_/postgres/)にPostgreSQL構築済みのイメージがあるので起動するだけで使えます。すばらしい時代ですね。
ただしREADMEにある起動の方法ではPostgreSQLは立ち上がりますが、ホスト側のpgAdminIIIからログインできません。
pgAdminIIIでログインできるようにするには、Dockerでポートフォワーディングを設定すれば接続できるようになります。

```bash
# docker pull postgres #run時に自動でpullしてくれるそうです！
docker run -d --name=postgres -p 5432:5432 -e POSTGRES_PASSWORD=mysecretpassword postgres 
```

これでポート番号5432でpgAdminIIIからログインできるようになります。
GalaxyProject の Galaxy の Docker イメージを使わないで、独自のものを作ろうとした

# 概要

GalaxyProject の [galaxyproject/galaxy: Data intensive science for everyone.](https://github.com/galaxyproject/galaxy) の [Docker イメージ](https://hub.docker.com/r/bgruening/galaxy-stable/) ではなくて、独自のものを作ろうとした。

## なぜか？

* Dockerfile の中の解析と、/usr/bin/startup の解析が大変そうだった。
* 自分にはあまり馴染みがない、git submodule 下の ansible だったりで、大変そうに見えた。
* Galaxy をインストールする方法は chef では書いていた。

# 結論

可能なら、本家のイメージを使ったほうが楽なんじゃないかと思った。

自分で作るとたしかに見通しがよいのだが、結局ほぼ同じものを作ることになりそう。

```
startup_lite
```

を使えば、最小構成で動かすことができる。
それでも必要かを考えても良い

レイヤー数など、気になるところもあるが、、、

# タグをつけてみた

失敗談というタグをつけてみたが、
本当にこれが失敗なのかわからない。

いろいろまなぶことは多かったが、同じ道に入る人がいるかもしれないので、体験談というかんじか

* [『Track 7 前佛さんとDocker1.12リリースの話、それと運用省力化の主張』のメモ — cloudinfra-audio](https://cloudinfra.audio/track007-b7a3d7b26135#.4u2sejno8)

これを聞いたのと、自分も失敗の話に興味があるので。
Let's using InterLink IPv6 world!

[「8.8.8.8」IPv6本サービス提供開始](http://blog.interlink.or.jp/2016/08/%e3%80%8c%ef%bc%98-%ef%bc%98-%ef%bc%98-%ef%bc%98%e3%80%8dipv6%e6%9c%ac%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9%e6%8f%90%e4%be%9b%e9%96%8b%e5%a7%8b.html)、 [「IPv6接続サービス」提供開始のご案内](http://www.interlink.or.jp/new/news/2016/0808.html)
まずは中の人の対応お疲れ様でした！8888 ~~確かに「どこかで見たような数字」にクスリとしましたｗ~~ 
そんなわけで過去の文献に沿って家の NAT 箱に設定を投げ入れて Google に IPv6 で ping するところまでやってみました。
ここではすでにサービスの申し込みが済んでいる(「【IPv6 接続サービス】ご契約情報のご案内」というようなメールが届いている)という前提で進めたいと思います。
## What I'm doing?
1. トンネルを掘る
2. プレフィックスを DHCPv6 で取得する
3. デフォルトルートを指定する

この3点をクリアすればどんな環境でも素敵な IPv6 生活を過ごすことが出来ることでしょう(ぉ

## Spec
<dl>
  <dt>NAT Box</dt>
  <dd>FreeBSD(10.1-RELEASE amd64)</dd>
  <dd>mpd(5.8)</dd>
  <dd>dhcp6(20080615_7)</dd>
  <dd>PF</dd>
</dl>

## Dig tunnel
```mpd.conf
startup:

default:
	load ispv6

ispv6:
	create bundle static bISPv6
	set iface idle 0
	set iface disable on-demand
	set iface enable tcpmssfix
	set iface route default
	set link accept chap pap 
	set bundle disable ipcp
	set bundle enable ipv6cp

	create link static lISPv6 pppoe
	set link action bundle bISPv6
	set auth authname [メールに記載しているログインID]
	set auth password [メールに記載しているパスワード]

	set link max-redial 0
	set link keep-alive 10 60
	set pppoe iface [ONU に繋がっているインターフェース]
	set pppoe service "InterLinkv6"
	open
```

## Get prefix
```dhcp6c.conf
interface [mpd5 で掘ったトンネルインターフェース] {
    send ia-pd 0;
};

id-assoc pd 0 {
    prefix-interface [IPv6 アドレスを割り当てるインターフェース] {
        sla-id 0;
        sla-len 0;
    };
};
```
```pf.conf
pass quick on [mpd5 で掘ったトンネルインターフェース] all
```
DHCPv6 で prefix を取得するときは FW の設定を確認しておきましょう。ブロックしたままだと取得できないです。(自分はそこでハマりました。)

## Set route
```console:console
# route -6 add default -iface [mpd5 で掘ったトンネルインターフェース]
```

## check ping
```console:console
# ping6 -c 10 google.com
# ping6 -c 10 2404:6800:4004:818::200e
```
Unbound などで AAAA フィルターをかけている場合はフィルターを外しておきます。疎通できていれば煮るなり焼くなり IPv6 と戯れてください。 Have a good IPv6 Life!

## suddenly thought
αテストの時にも(うっかり鍵をつけたまま)[つぶやき](http://twitter.com/soprano1125/status/710720041533235200)ましたが個人的に [HE](http://he.net) の [Tunnel Broker](https://tunnelbroker.net) のように /48, /64 が配れて逆引き委譲できたらもう満足だなぁと思ったところです。まぁ IPv6 はとりあえず使えるのでいいかなぁと現状満足してます。(いつかどこかが対応することでしょうｗ)

## Link
- [FreeBSDのVPN ServerでIPv6をバラまく](http://blog.hiroaki.home.group.jp/2012/09/freebsdvpn-serveripv6.html#PtRKsiP.twitter_tweet_count_no_m)
- [仙石浩明の日記: フレッツ 光ネクストの IPv6 PPPoE 接続を OCN 光アクセスで使ってみた](http://www.gcd.org/blog/2011/06/812/)
- [フレッツ光ネクスト用IPv6 PPPoEアダプターを作ってみる &mdash; SOUM/misc](http://www.soum.co.jp/misc/ko/flets-ipv6-pppoe/1.html)
- [FreeBSD で IIJmioへ pppoe+DHCPv6で 接続するときのメモ](http://ror.hj.to/ja/issei/entries/142i5p-r3vhxi2yz4ur/node)
直線位置調整 > 電池の検討 > 出力電流

関連 http://qiita.com/7of9/items/0256996d9cf94fd2abc8

S-12の電源としての1.5Vを用意するのは以下の選択肢がある。

- 3Vから生成 (CR123Aなど)
- 単2電池を使う
- 単3電池を使う

S-12は本来、単2電池を使うようになっている。他の選択肢の場合、電流をどれくらい流すことができるかが注意点かもしれない。

単2,単3の出力電流はメーカー公表値はないが、以下の情報を見つけた。

http://homepage1.nifty.com/x6/elecmake/LED/LED.html
> 電池の出力電流は単1で2A、単2で1.5A 、単3で1A以内が安全だと思います(電池の出力電流はあまり大きすぎると電池の加熱や液漏れの原因になります。しかし出力電流の上限はJIS規格では明確に定義されておらず、電池メーカーのデーターシートにも書いてありません)。

S-12のモーターが1A程度の場合、単3では微妙かもしれない。

CR123Aに関しては以下の資料のp10に記載がある。
http://www.inedenki.co.jp/dcms_media/other/sanyo_lit.pdf
> 標準放電電流(mA) : 10
> 最大放電電流(mA) : 連続 1500, パルス 3500

数秒に1回、数百msec ONする場合CR123Aでも大丈夫だろうか？
DockerでphpMyAdminを立ててサクッと外部サーバに接続する

大したことではないですが、例えばRDSなんかにMySQLでつなぐとき、
「GUIを使いたい！でもわざわざEC2にインスタンス立ててPHPMyAdminインストールするのは面倒だ！」という自分みたいな思いをする人のためにメモしておきます。

# Dockerをインストールする

Dockerをインストールしてない人は公式から。
今は公式にインストーラが提供されているのでややこしくないようにそちらを使いましょう。
https://www.docker.com/products/docker

# phpMyAdminの公式イメージを利用する

こちらに公式でイメージが提供されているのでありがたく使わせていただきましょう。
https://hub.docker.com/r/phpmyadmin/phpmyadmin/

使い方はサイトに書いてあるとおりですが、外部サーバに繋ぎたいなら
```
docker run --name myadmin -d -e PMA_HOST=dbhost -p 8080:80 phpmyadmin/phpmyadmin
```
としてコンテナを起動します。
「dbhost」のところを接続したいホスト名に書き換える感じで。

これでphpMyadminにhttp://localhost:8080でアクセスできるようになります。

ブラウザ上で上記にアクセスしてあとはphpMyAdminで煮るなり焼くなりすればOKです。

使い終わったら`docker stop myadmin`でstopさせましょう。
また同じ設定で使うなら使うときに`docker start myadmin`で起動。
二度と使わないなら`docker rm myadmin`で消してしまいましょう。
別の設定を併用するならコンテナ起動するときのmyadminを別の名前にして別のコンテナを作ればいいと思います。


※なにかおかしな点があったらご指摘くださいませ。
ofSoundPlayerでPauseを使うメモ

##概要
openFrameworksでofSoundPlayerという外部音源を読み込んで再生したりできる便利なクラスがあります。
これの`start`,`stop`はできるけど`pause`がはまりやすかったのでメモ。

`setPause(bool paused)`の呼び出しのときに、`play()`とか`stop()`を呼び出すと、リセットされちゃう(最初に戻る)orまた新たに最初から再生することになってしまうので呼び出さないように注意！

##ソースコード

```ofApp.h
#pragma once

#include "ofMain.h"

class ofApp : public ofBaseApp{

public:
    ofSoundPlayer player;

    void setup();
    void update();
    void draw();

    void keyPressed(int key);
};

```

```ofApp.cpp
#include "ofApp.h"

//--------------------------------------------------------------
void ofApp::setup(){
    player.load("BeautifulWorld.mp3");
    player.setLoop(true);
    player.play();
}

//--------------------------------------------------------------
void ofApp::update(){

}

//--------------------------------------------------------------
void ofApp::draw(){

}

//--------------------------------------------------------------
void ofApp::keyPressed(int key){
    if(key == 'a'){
        player.setPaused(true);
    }
    if(key == 'b'){
        player.setPaused(false);
    }
}
```

これで、aを押すと一旦ストップ、bを押すとその位置から再び再生となります。
Get Image Tag From a String


The code below can get the img tag from a static string, like this :

> /img/portrait.gif?t=1451961935000" align="absmiddle
> http://www.example.com/ssss.jpg


``` php
function Allimg($str)
{
    $pattern = "/<[img|IMG].*?src=[\'|\"](.*?(?:[\.gif|\.jpg|\.png|\.bmp|\.jpeg]))[\'|\"].*?[\/]?>/";
    preg_match_all($pattern, $str, $match);
    $_count = count($match[1]);
    $_html = '';
    if ($_count>0) {
        for ($i = 0; $i < $_count; $i++) {
            $_html = $_html . $match[1][$i];
            $_html = $_html . '<br>';
        }
    }
    return $_html;
}
```
zshにて、呼出場所がバインドキーかコマンドラインか判定する

関数をバインドキー or コマンドラインで呼び出した際、どちらで呼び出したかの判定方法をメモ

# Q.どうして知りたかったか
**A.動きが違うから**

例えば、こんな関数を作成する

```zsh
# Helloと表示するだけの関数
hello () 
{
    echo "Hello"
}
# Ctrl + yでキーバインド
zle -N hello
bindkey "^y" hello
```

・コマンドラインから呼出

```zsh
[2016-08-09 18:53] ~/workspace/dev
% hello # 1.関数名を打ってからEnter
Hello   # 2.Helloと表示
[2016-08-09 18:53] ~/workspace/dev
%       # 3.プロンプト文字列を表示する
```

・バインドキーから呼出

```zsh
# 1.「Ctrl + y」打鍵
[2016-08-09 18:53] ~/workspace/dev
% Hello # 2.Helloと表示

# 3.プロンプト文字列を表示しない
```

**バインドキーで呼び出しした場合、表示が崩れる**

# 判定の方法

1. スクリプト名が格納してあるパラメータ変数`$0`を使用する
- widget名が格納してある環境変数`$WIDGET`を使用する

## 判定に使用する値を確認する

各値を出力する関数を作成してみる

```zsh
# 値を出力する関数
put_script_name () 
{
    echo $0;
    echo $WIDGET;
}
# Ctrl + yでキーバインド
zle -N put_script_name
bindkey "^y" put_script_name
```

コマンドラインの場合

```zsh
[2016-08-09 18:53] ~/workspace/dev
% put_script_name # 1.関数名を打ってからEnter
put_script_name   # 2.関数名を表示
                  # 3.何も表示しない
```

バインドキーの場合

```zsh
# 1.Ctrl + yを打鍵
[2016-08-09 18:53] ~/workspace/dev
% /usr/local/bin/zsh # 2.Shell名を表示
put_script_name      # 3.関数名を表示

```


## 判定処理を作る

分岐処理サンプル用関数を作成してみる

```zsh
# 呼出場所確認
check_test ()
{
  if [ $0 != $SHELL ]; then
    echo 'from command line. use $0'
  else
    echo 'from bindkey. use $0'
  fi

  if [ -z $WIDGET ]; then
    echo 'from command line. use $WIDGET'
  else
    echo 'from bindkey. use $WIDGET'
  fi
}
zle -N check_test
bindkey "^y" check_test
```

コマンドラインで実行

```zsh
# 関数実行より想定通りの文字列を表示
[2016-08-09 18:53] ~/workspace/dev
% check_test
from command line. use $0
from command line. use $WIDGET
```

バインドキーの場合

```zsh
#「Ctrl + y」打鍵で想定通りの文字列を表示
[2016-08-09 18:53] ~/workspace/dev
% from bindkey. use $0
from bindkey. use $WIDGET

```

※他にも良い方法があるかもしれないがとりあえずはこれで、、

# 参考
`man zshzle`の`USER-DEFINED WIDGETS`にある`WIDGET`の項目
PlayFramework テンプレートによる共通化メモ(都度更新)

　

テンプレートがあるのに、似たような処理をコピペで作るのはスマートではない。

## グローバル変数

```scala
@(defName: String){global: Html}
@*
 global には global変数を渡す
*@
<script>
@(global).@(defName) = {};

function test(){
    @(global).@(defName).date = new Date();
}
</script>
```

呼び出す

```scala
<script>
var global = {};

</script>
@views.html.testtest("hoge"){global}
```

## 呼び出し元によってjsのfunction名を変えたい
インクルード時に引数渡してあげる。

```scala
@(defName:String)
@testName = @{"testtest"}

<script>
function funcname_@(defName) (){
    console.log('funcname_@defName が呼ばれた');
}
</script>
```

呼び出す

```scala
@* インクルード *@
@views.html.testtest("nameX")
@views.html.testtest("XYZ")
<script>
funcname_nameX(); // funcname_nameX が呼ばれた
funcname_XYZ(); // funcname_XYZ が呼ばれた
</script>
```

## テンプレート引数によって表示させたいモノを切り替える

○○type の値によって分岐させたい。

ifで記述

```scala
@(hogeType: String)
@isTypeA = @{(hogeType == "dog")}
@isTypeB = @{(hogeType == "fish")}
@isTypeC = @{(hogeType == "bird")}
@isTypeD = @{(!(isTypeA || isTypeB || isTypeC))}

@if(isTypeA){

}
@if(isTypeB){

}
@if(isTypeC){

}
@if(isTypeD){

}
```

matchで記述しても良いけどjsのswitch-caseと組み合わせたくないし、条件の再利用するとなった場合が面倒

```scala
@(hogeType: String)
@hogeType match{
case "dog" => {}
case "fish" => {}
case "bird" => {}
case _ => {}
}
```
Rails モデルの削除　※自分用メモ

# モデルの削除
モデルの削除はコマンド「rails destroy model <モデル名>」で行うのはNG！！
マイグレーションファイルまで消えてしまう。
ファイルは手動で削除する(IDEなら右クリック、もしくはLinuxの「rm」コマンド)。
http://qiita.com/seisonshi/items/dbc7e8ef08e4ebe9a1f1<br>
sublimeの日本語文字化けを直す


Matlabで書かれたプログラムをSublime Textで開こうとしたら日本語部分が文字化けしてしまいました。
直接は知らない人にもらったプログラムなので、読めないとちょっと困ります。。。

Menu > File(F) > Reopen with EncodingでUTF-8などにしたら見られるかと思ったのですがうまくいかなかったので方法をメモしておきます。
使用しているパソコンはMAC(OS X El Capitan), sublimeは確か３ですが2でも問題ないと思います。



###パッケージコントロールのダウンロード
最初のパッケージコントロールのダウンロードはこちらなどをご覧ください。
http://qiita.com/Taku94/items/224240861b72c22e5123

これが終わったら、任意のプラグインで好みのカスタムができるので便利です。




###パッケージのダウンロード
sublimeのConvertToUtf8というプラグインがあるのでこれをPackage Controlからダウンロードします。

パッケージのダウンロードはMacの場合Command+Shift+PでInstall Packageを選び、ConvertToUtf8を選択します。



Sublimeを再起動して.mファイルが見られればいいのですが、警告で別のパッケージをダウンロードするよう出たのでCodecs33というパッケージをPackage Controlからダウンロードして再起動したら見れました。
gitk を起動したら lime が見つからないみたい


gitk を実行しようとしたらエラーで起動しませんでした。(Mac OS X 10.11.6 + brew の git)

```
$ /usr/local/git/bin/gitk
Error in startup script: unknown color name "lime"
    (processing "-fore" option)
    invoked from within
"$ctext tag conf m2 -fore [lindex $mergecolors 2]"
    (procedure "makewindow" line 347)
    invoked from within
"makewindow"
    (file "/usr/local/git/bin/gitk" line 12434)
```

どうやら Mac の tcl/tk だとバージョンが足りなくて lime が色名としてシステムに登録されていないようです。
brew-cask で tcl/tk をインストールしてバージョンを上げれば OK。

```
$ brew cask install tcl
```
よく忘れることだがsedはふたつある

ネットでみかける通り sedコマンド使ってもエラーになることや、思い通りにならないことがあってストレスを感じてしまうことがる。

そもそも`GNU sed`と`BSD sed`が存在している。Macに入っているのは`BSD sed`である。

参考：
[GNUのsedとBSDのsed - さよならインターネット](http://blog.kenjiskywalker.org/blog/2014/07/18/sed-bre/)

> TL;DR
BSD sedがイケてないのではなく、
GNU sedが独自で拡張正規表現を実装していただけっぽい。

特に `-i`の挙動の違い
* [bash - Sed command find and replace in file and overwrite file doesn't work, it empties the file - Stack Overflow](http://stackoverflow.com/questions/5171901/sed-command-find-and-replace-in-file-and-overwrite-file-doesnt-work-it-empties)
* [linux - Delete whitespace in each begin of line of file, using bash - Stack Overflow](http://stackoverflow.com/questions/9309882/delete-whitespace-in-each-begin-of-line-of-file-using-bash)

確かに タイトルにlinuxとあるものは、そこで `GNU sed`であることが暗に示されているということだろうか（これに気づかないとハマる）。

正規表現の扱いの違い
* [GNU/BSDでのsedにおける正規表現の扱いの違い](http://rcmdnk.github.io/blog/2015/07/19/computer-gnu-bsd/)

などに注意が必要である。

White spaceも
Macでは　`[[:space:]]` であり、 `\s` not workである。
VMwareゲストのWindowsの動きがおかしくなったときはVMware Toolsを再インストールする

メモ。
言いたいことはタイトルで終了なんだけど。


この前 Anniversary Update を実行したあと、VMwareゲストのWindowsからホストの共有フォルダが見れなくなった。
結構致命的で、どうしようもなかったところ
[VMwareゲスト上のWindow10をアップグレードするとhgfsが使えなくなる](https://www2.filewo.net/wordpress/2016/08/05/vmware%E3%82%B2%E3%82%B9%E3%83%88%E4%B8%8A%E3%81%AEwindow10%E3%82%92%E3%82%A2%E3%83%83%E3%83%97%E3%82%B0%E3%83%AC%E3%83%BC%E3%83%89%E3%81%99%E3%82%8B%E3%81%A8hgfs%E3%81%8C%E4%BD%BF%E3%81%88%E3%81%AA/)
ここを見て解決できた。

検索すると、VMwareじゃない普通の環境でもWindowsアップデート時の不具合として起きる現象らしくて中々求める記事を発見できなかった。

昔何かの不具合で同じようにVMware Toolsを再インストールしたことがあったのをぼんやり思い出した。
上書きでインストールしても無理で、一つずつ手順を踏んでいかないとダメなことがあるようだ。
GitLab-CIを始めるための下準備


## はじめに

GitLabにはGitLab-CIと言うCI機能が付属しています。

GitLabCIはリポジトリのrootに`gitlab-ci.yml`を置いておくと、そこに記述された手順にしたがってCIを回してくれるというものです。

GitLab-CIの機能を使用するには、ジョブを実行する環境、`Runner`を用意する必要があります。

ここでは、GitLabの公式が提供しているGitlab-Multi-RunnerをDockerでインストールする手順を残しています。

手順は[こちら](https://github.com/ayufan/gitlab-ci-multi-runner/blob/master/docs/install/linux-repository.md)に従っています。

## GitLab-CIの環境

* CentOS Linux release 7.2 (runnerをインストールする環境)
* Gitlab CE 8.7 (GitLab側のバージョン)

## インストール手順


Gitlab-Multi-Runnerの公式リポジトリをyumに追加します。

```
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh | sudo bash
```

`gitlab-multi-runner`をインストールします。

```
sudo yum install gitlab-ci-multi-runner
```

runnerを登録します。

```
sudo gitlab-ci-multi-runner register

Running in system-mode.                            

# gitlabサーバーのURL+/ciを入力します                                                   
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/ci):

# gitlab-ci tokenを入力します
# tokenはGitlabのAdminエリアのRunnersに表示されています
Please enter the gitlab-ci token for this runner:

# runnerの説明を入力
Please enter the gitlab-ci description for this runner:

# runnerにつけるタグです
# gitlab上でrunnerの見分けがつくように適当なタグを入力します
Please enter the gitlab-ci tags for this runner (comma separated):

Registering runner... succeeded

# runnerの実行環境を入力します
# ここではdockerを選択
Please enter the executor: docker+machine, docker-ssh+machine, docker, docker-ssh, parallels, shell, ssh, virtualbox:
docker

# デフォルトのビルド実行するDockerイメージを入力します
# ここではruby:2.1を選択
Please enter the default Docker image (eg. ruby:2.1):
ruby:2.1
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded! 

```
キノコならわかる！ Pepperからgmailを送信

# Pepperからメールを送る

## Send E-mail ボックスがあるじゃないか
ボックスライブラリ `Multimedia` - `Internet` に `Send E-mail` というまんまのボックスが！
![image](https://qiita-image-store.s3.amazonaws.com/0/119864/050218f2-09c4-104c-1ab3-47f27e6f5e48.png)

## とりあえず結線、何はともあれ結線
![image](https://qiita-image-store.s3.amazonaws.com/0/119864/9bf17ec4-58d4-7f6e-0063-92218661c021.png)

## パラメーターの設定
`Send E-mail`ボックスの左下にあるペンチマークを押し、必要なパラメータを設定しよう

+ From Password  : 差出人のgmailアカウント
+ To             : 宛先メールアドレス
+ Subject        : 件名ですね。
+ Contents       : 本文。キノコからのメールです。
+ Attachment     : 添付ファイル
+ Port number    : ポート番号

![image](https://qiita-image-store.s3.amazonaws.com/0/119864/98a9f256-0c5d-f154-d3c8-0009a9eab5e6.png)

## 実行、実行！
送れないじゃん！
何やら`onError`から出力されている・・
![image](https://qiita-image-store.s3.amazonaws.com/0/119864/726a034c-7ade-8209-12b0-8c6294c8b10e.png)

## gmail側のアカウント設定を変更する必要がある
いいのかな。。まぁとりあえずテストだからいっか。
アカウントのページから`接続済みのアプリとサイト`-`安全性の低いアプリの許可`を`有効`に。
不要になったら`無効`に戻しておきましょう。
https://myaccount.google.com/
![image](https://qiita-image-store.s3.amazonaws.com/0/119864/51ba1c0a-22e0-a78e-bb29-e24e85c5ed97.png)


![image](https://qiita-image-store.s3.amazonaws.com/0/119864/ea8d966a-67d5-06c6-09fc-5cf0f4333f35.png)

## 再度実行、実行！
`onSent`から出て行った！
![image](https://qiita-image-store.s3.amazonaws.com/0/119864/03f0aa5c-c53f-4baa-a7ff-73088edd9bb5.png)

## gmailをチェック
キノコから届いてるー
![image](https://qiita-image-store.s3.amazonaws.com/0/119864/a09abde3-71e7-4c78-c04a-9e9fea7fa4c4.png)
バッチ処理の多重実行を確実に回避する

例えば、メールを１００人に送る。
このバッチ処理がなんらかの形で多重に実行されてしまうと
同じ人に何度もメールがいって怒られます。

バッチ処理そのものを同時実行できなくする方法もあると思いますが
バッチ処理そのものは多重実行を許可したい。でも同じ人に同じ処理はまずい。
そんなときは、下記方法で回避できます。

```sql:table作成
CREATE TABLE IF NOT EXISTS unique_log(id VARCHAR(32) NOT NULL UNIQUE)
```

```php:send.php
foreach($mails as $mail){

  //一意にしたいIDを作成する。たとえば送信先と日にちとタイトル
  $id = md5($mail->to . $mail->date . $mail->tilte);
  if(!$pdo->query('SELECT id FROM unique_log WHERE id = ?', $id)
  and $pdo->insert('unique_log', ['id'=>$id])
  and $pdo->query('SELECT id FROM unique_log WHERE id = ?', $id)){

    sendMail($mail);
  }
}
```

・そういうログがない
・そういうログがインサートできる
・そういうログがインサートできた
ならば、処理を開始してよいという判断です。

これが多重に処理開始されてしまう状態とは、
ユニークなカラムに同じ値を、複数のプロセスから多重insertできたということですから
mysqlのテーブルがぶっこわれたときだけです。

[追記]
mpywさんの下記記述がより良いと思います！
ボールを動かす

using UnityEngine;
using System.Collections;
 
public class BallController : MonoBehaviour {
  int speed = 5;
  Rigidbody rb;

  void Start(){
    //Unity5よりGetComponentが必要になった
    rb = GetComponent<Rigidbody>();
    //右上にボールを動かす
    rb.AddForce((transform.up + transform.right) * speed, ForceMode.VelocityChange);
  }
}
Windows Subsystem for Linux ＋ Cmderで最強のCLI環境を作る

Windows 10 Anniversary Updateが来ましたね！ なんといってもこのバージョンからWindowsでBashが動くWindows Subsystem for Linux (WSL) が搭載されました。
ただ、Windowsのターミナルエミュレータは相変わらず微妙です。(※ Windows10からはウインドウサイズが簡単に帰れるという劇的な進化がありましたが！)

そこで、今回はこのWSLとConEmuの発展版であるターミナルエミュレータのCmderを組合わせてみました。

Anniversary Updateのアップデート
--------------------------------

まずは、Anniversary Updateの適用。順次適用されていますが、まだの人は「[WIndows10の更新履歴](https://support.microsoft.com/ja-jp/help/12387/windows-10-update-history)」よりダウンロードして適用してください。

Windows Subsystem for Linuxの有効化
---------------------------------

WSLは下記の手順で有効にできます。

-「更新とセキュリティ」から「開発者モード」を有効化する
-「プログラムと機能」->「Windows の機能の有効化または無効化」で「Windows subsystem for Linux(Beta)」をチェックする
- OSを再起動し、「Bash on Ubuntu on Windows」を起動する

クラスメソッドさんの「[Windows 10 Anniversary Updateで導入されたbashでAWS CLIを実行してみる](http://dev.classmethod.jp/cloud/windows-10-bash-aws-cli/)」で分かりやすく解説してあるので、詳細そちらを参考ください。


zshのインストール
---------------------------------

とりあえず、zshをインストールしましょう！

```bash
$ sudo apt-get install zsh
```

zshの設定は「[もってけ泥棒! コピペで始めるzsh - リターンズ](http://news.mynavi.jp/column/zsh/022/)」あたりを参考に設定。

Cmderのインストール
---------------------------------

下記の公式ページよりzipファイルをダウンロードして任意の場所に展開します。

http://cmder.net/

**full**と**mini**がありますが、私はmini版を選びました。

起動すると下記のような画面が立ち上がります。

![001.png](https://qiita-image-store.s3.amazonaws.com/0/54904/8ed24aac-4ec1-81e6-c9e8-d16ca013e488.png)


CmderのTaskに「Bash on Ubuntu on Windows」を追加
-----------------------------------------------

デフォルトではWSLは追加されていないので、下記手順でCmderからWSLが起動するようにします。

1. 右上のアイコンからメニューを起動し「Settings」を選択
2. 「Startup」 -> 「Tasks」で「+」ボタンを押してタスクを追加。
3. 下記の設定で入力

| 項目名 | 設定値 | 備考 |
|:-:|:-:|:-:|
|Commands|C:\Windows\System32\bash.exe ~ -c zsh -cur_console:p|   |
|Task parameters|-icon "%USERPROFILE%\AppData\Local\lxss\bash.ico"|アイコンの設定|

※ コメントにて「cur_console:p」を付けないとカーソルが動かないケースがあるとmacchkyさんより聞いたので、追記しました。

![002.png](https://qiita-image-store.s3.amazonaws.com/0/54904/c7453a0a-d84a-5722-28aa-553d738f00d2.png)

あとは、作成した「Bash on Ubuntu on Windows」タスクを起動すれば無事に完了です

![003.png](https://qiita-image-store.s3.amazonaws.com/0/54904/24ddea1a-3e88-9b43-0e7e-bd6bd04d712c.png)

まとめ
===========

WSLとCmderを使うことで、Cygwinやコマンドプロンプトで苦労していた時代からついに解き放たれます。
動いてるのは普通のUbuntuなのでTeraTearmとかなくても普通にssh出来ます。ただ、Dockerは動かないなどの制限はあるので注意。

それでは、Happy Hacking!
Windows10 に Swift を入れる


## 使うモノ
Bash on Ubuntu on Windows

## 

[Swift公式-Download](https://swift.org/download/) からUbuntu版をダウンロード(Ubuntu14系)
swift-[version]-[区分]-ubuntu[version].tar.gz は、とりあえず `c:/tmp` に 置く

圧縮ファイルの展開先`/lib/apple/swift-[version]-[区分]-ubuntu[version]`
widows上では `C:\Users\[userName]\AppData\Local\lxss\rootfs\lib\apple`

```bash
# lib/apple にコピー -> 展開まで
cd /lib
sudo mkdir apple
cd /apple
sudo cp /mnt/c:/tmp/swift-[version]-[区分]-ubuntu[version].tar.gz /lib/apple
sudo tar xzvf swift-[version]-[区分]-ubuntu[version].tar.gz
```

※mkdir, cpしないと、Bash on Ubuntu on Windows が認識してくれないっぽい。（要検証）

パス通したり、必須のライブラリ入れたりとかは[Swift公式-GETTING STARTED](https://swift.org/getting-started/#installing-swift)参照
XAMPPを導入した(Mac El Capitan)


apache, DB, PHPをまとめてインストールできるというXAMPPを使用することになりました。
それぞれダウンロードする必要のある別々のソフトウェア？を一気にダウンロードできるバンドルの一種と認識しています。

###ダウンロード
ダウンロードはこちら
https://www.apachefriends.org/download.html

私はMAC OS X El Capitan 10.11.3を使用していますのでその場合の方法を備忘録として書いておきます。
ダウンロードと解凍に関しては飛ばします。

###アプリケーションの使い方1
解凍が終わると、自動的にアプリケーションフォルダにXAMPPというディレクトリができました。
アプリケーションを起動して、Manage ServersからApache Web serverを起動させます。
![スクリーンショット 2016-08-09 15.29.24.png](https://qiita-image-store.s3.amazonaws.com/0/109034/4f8dcb0d-5ceb-5097-869c-5da421f18980.png)


ここで問題が起こりました。
startを押しても起動しません。
そこで検索するとたどり着いたのが以下の２つのサイト
https://teratail.com/questions/17496
http://takenori.jp/1127

ポート80が競合して起動ができませんでした。
使用していたのはMac標準装備のapacheです。
(windowsの場合はこのほかにskypeの起動などにより競合の可能性があります。
その時はどちらかのポートを変更すればOK)

MACの標準apacheの終了コマンドは`sudo apachectl stop`

###アプリケーションの使い方2
つぎはMySQL Databaseの起動です。
ここでかなりの時間を取ってしまいました。

とりあえず１までで`http://localhost/dashboard`へ接続はできるし(下の画像のようなページにたどりつくはずです)、右上のphpMyadminからデータベースが見られるようになりました。

![スクリーンショット 2016-08-09 15.32.50.png](https://qiita-image-store.s3.amazonaws.com/0/109034/b6d9c2bd-747a-9377-abda-0b6dfe8b076d.png)


###アプリケーションの使い方3
ブラウザ上ではなくデータベースを操作したいのでここから、Terminalを使用します。
しかし、、、`XAMPP/bin`の下で`mysql`と打ってもデータベースに接続できません。

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
というエラーが止まりません。
検索しても、いい感じの解決策には辿り着かず。


前のバージョンを知っている他の使用者の助言では、
「ユーザーとパスワード設定した？」
とのことだったのですがいろいろ無知なため「？？？？」の状態でいろいろ検索したところ、こちらのおかげで解決しました。
http://hapisupu.com/2015/11/xampp-5-6-14-version-up-fix-no-security/


大まかに言えばちゃんとFAQで確認しろということになるのですが
（http://localhost/dashboard/faq.html）
セキュリティの設定をしていないためterminalからのアクセスができなかったようです。

大事そうな項目としてはこれですかね。。
「Is XAMPP production ready?」
セキュリティの足りないところがあるから設定しろということのようです。

`sudo /Applications/XAMPP/xamppfiles/xampp security`
のコマンドを入力しパスワードを設定することでterminalからのアクセスは解決しました。


###おまけ
`XAMPP: MySQL is accessable via network.
 XAMPP: Normaly that's not recommended. Do you want me to turn it off? [yes] `
この質問にnoと答えたかったのですがyesしか受け入れてくれず、ブラウザからデータベースにアクセスできなくなりました...
gdrive sync upload

ローカルディレクトリを Google Drive へ同期する。

```bash
gdrive [global] sync upload [options] <path> <fileId>
```

#共通オプション:

## ``-c, --config <configDir>``
アプリケーションパス。既定値: ``~/.gdrive``

## ``--refresh-token <refreshToken>``
アクセストークンの取得に使用する Oauth リフレッシュトークン(上級者用オプション)

## ``--access-token <accessToken>``
生存期間の短い要求に使用する Oauth アクセストークン(上級者用オプション)

#オプション:

## ``--keep-remote``
コンフリクト発生時に Google Drive のファイルを優先する。

## ``--keep-local``
コンフリクト発生時にローカルのファイルを優先する。

## ``--keep-largest``
コンフリクト発生時にサイズの大きいファイルを優先する。

## ``--delete-extraneous``
ローカルに存在しないファイルを Google Drive から削除する。

## ``--dry-run``
どのファイルが転送されるかを表示する。

## ``--no-progress``
進捗を非表示にする。

## ``--timeout <timeout>``
タイムアウトを秒単位で指定する。 0 を指定した場合はタイムアウトしない。
指定した秒数までに一つもデータが転送されない場合にタイムアウトが発生する。
既定値: 300

## ``--chunksize <chunksize>``
チャンクサイズをバイト単位で指定する。既定値: 8388608
gdrive sync download

Google Drive のディレクトリをローカルディレクトリへ同期する。

```bash
gdrive [global] sync download [options] <fileId> <path>
```

#共通オプション:

## ``-c, --config <configDir>``
アプリケーションパス。既定値: ``~/.gdrive``

## ``--refresh-token <refreshToken>``
アクセストークンの取得に使用する Oauth リフレッシュトークン(上級者用オプション)

## ``--access-token <accessToken>``
生存期間の短い要求に使用する Oauth アクセストークン(上級者用オプション)

#オプション:

## ``--keep-remote``
コンフリクトが発生した場合に Google Drive 側のファイルを優先する。

## ``--keep-local``
コンフリクトが発生した場合にローカルのファイルを優先する。

## ``--keep-largest``
コンフリクトが発生した場合にサイズの大きいファイルを優先する。

## ``--delete-extraneous``
Google Drive に存在しないファイルをローカルから削除する。

## ``--dry-run``
どのファイルが転送されるかを表示する。

## ``--no-progress``
進捗を非表示にする。

## ``--timeout <timeout>``
タイムアウトを秒単位で指定する。 0 を指定した場合はタイムアウトしない。
指定した秒数までに一つもデータが転送されない場合にタイムアウトが発生する。
既定値: 300
AD2 > WaveForms > I2Cのコードによるキャプチャ

```txt:動作環境
Analog Disocvery 2 (以下AD2)
WaveForms 2015 (3.2.6) 64-bit
```

SparkFunにてAD2の紹介動画があった。
https://www.youtube.com/watch?v=L6sM8BTIBs8&index=64&list=PL_MJualihC5CAtnZHphK-hli8aSL3PRRz

上記動画で気になったのは、3:14ころに紹介されるI2C TriggerにてByte 1,2:という項目があり、コード自体でキャプチャのトリガとすることができるということ。

これを使えば、MSC-MOD20用ソフト開発時に`!`などの文字でキャプチャができて便利そう。しかしながら、こちらの環境のWaveForms2015でその項目を探したが見つからない。

バージョンが新しいものにはついている機能なのだろうか。

### version 3.3.7

使用してきたv3.2.6にはコードによるI2C Triggerはなかったが、v3.3.7をインストールすると見つかった。

0x21でトリガしてみた。

0x21までのキャプチャができている。これは便利だ。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/134affd3-9c82-5e5b-0ead-b656d0d442fe.png)
技術英語 > Another approach is to [centralize] error handling in a global error-handling routine or error-handling object

@ Code Complete (No. 6792 / 36077)

> Call an error-processing routine/object. Another approach is to <font color=red>centralize</font> error handling in a global error-handling routine or error-handling object.

another approachの対となるものは、上記の文章の2段落ほど上に記載されている以下のものなのだろう。

> Return an error code. You could decide that only certain parts of a system will handle errors.


- 関数の戻り値としてerrorを返しつつ、その上位関数のいずれかで処理をする
- globalなerror handler routine/objectを使う
ESXi - Cent6 -- device does not seem to be present

# 覚え書き
　ESXiでOSをOVFから複製した時、NICがうまいこと有効化されない時の対処法を記載する。

# 何が起きているか
  NICの番号がおかしくなっている。なぜかEth0,Eth1がEth2,Eth3へ。

<pre>
 # ifconfig -a
 --- snip ---
  eth2
 --- snip ---
  eth3
</pre>

# 対処法
　/etc/udev/rules.d/70-persistent-net.rules　ファイルの中身を全部削除してreboot。
　/etc/sysconfig/network-scripts/ifcfg-ethXにMACアドレスがついていた場合は
　削除するか正しいMACアドレスを書く

# 備考
　ちなみにCent7だとそういうことは起きない。
　もともとNICがマスクされたデバイス名になっているからかも。
Rasberry Pi3 (ARMv7)にhaskell-stackをインストールする

# Rasberry Pi3 (ARMv7)にhaskell-stackをインストールする

　Rasbianのリポジトリにhaskell-platformはあったのにhaskell-stackがない！
困った困った。

ということで[ここ](https://github.com/commercialhaskell/stack/issues/2103)を見ていると…ありがたいことにarm用のビルドがありました！！
ありがとうございます！！ ありがとうございます！！


## 現存する問題

　残念ながら、arm版haskell-stackを使うに当たって、まだ致命的な箇所があります。
解決アプローチと共に以下に記します :D

* 現存する問題
    - `stack setup`によるghcの自動インストールが行えない
        - debianリポジトリから、resolverバージョンの要求するghcをaptでインストールする (`stack setup`の代わりに`apt install ghc`する)
        - 例えば`resolver: lts-6.9`であれば、要求されるghcバージョンは`7.10.3`


## 前準備

　Rasbianにdebianのリポジトリを追加します。
既に`http://ftp.jp.debian.org/debian/`を追加している方は不要。

```sh
# stretchのレポジトリ追加
echo -e "\ndeb http://ftp.jp.debian.org/debian/ stretch main contrib non-free" | sudo tee -a /etc/apt/sources.list

# リポジトリの認証情報を追加
gpg --keyserver pgpkeys.mit.edu --recv-key 8B48AD6246925553
gpg -a --export 8B48AD6246925553| sudo apt-key add -
gpg --keyserver pgpkeys.mit.edu --recv-key 7638D0442B90D010
gpg -a --export 7638D0442B90D010| sudo apt-key add -

# リポジトリのDB更新
sudo apt update
```


## ghcとstackのインストール

1. 上記で準備したリポジトリからghcをインストールします
    - `sudo apt install ghc`
2. [Release v1.1.2](https://github.com/commercialhaskell/stack/releases/tag/v1.1.2)あたり(最新版を推奨)のDownloadsから「Linux ARMv7」をダウンロードする
    - `wget https://github.com/commercialhaskell/stack/releases/download/v1.1.2/stack-1.1.2-linux-arm.tar.gz`
3. tar.gzの中身に実行用stackバイナリがあるので、PATHの通ったところに置く
    - `tar xvf stack-1.1.2-linux-arm.tar.gz`
    - `cp ./stack-1.1.2-linux-arm/stack {/some/path}`
    - `rm -rf ./stack-1.1.2-linux-arm`
4. `stack --version`

```
Version 1.1.2, Git revision 6bca6d8eaf542c5bd4b5c83d23670137249f2145 (3663 commits) arm hpack-0.14.0
```

やったあ！


## stackアプリケーションをビルドしてみる

　試し試し。

```console
$ git clone https://github.com/aiya000/hs-sentence-jp ; cd hs-sentence-jp
$ stack build

[1 of 1] Compiling Main             ( /tmp/stack26574/Setup.hs, /tmp/stack26574/Setup.o )
Linking /home/pi/.stack/setup-exe-cache/arm-linux/tmp-setup-Simple-Cabal-1.22.5.0-ghc-7.10.3 ...
base-compat-0.9.1: download
auto-update-0.1.4: download
base64-bytestring-1.0.0.1: download
SHA-1.6.4.2: download
base64-bytestring-1.0.0.1: configure
Pbase64-bytestring-1.0.0.1: build
.
.
.
mecab-0.4.0: configure↲
mecab-0.4.0: build↲
mecab-0.4.0: copy/register↲
sentence-jp-0.1.0.0: configure↲
sentence-jp-0.1.0.0: build↲
sentence-jp-0.1.0.0: copy/register↲
```

できた！！
iOS App申請のためArcheiveしてupload中にERROR ITMS-90022と出る

###前提条件
Xcode:7.3
Swift:2.0

#解決したい問題
iPhone App申請時に、Archiveしてupload中に下記エラーがでました。

>ERROR ITMS-90022: "Missing required icon file. The bundle does not contain an app icon for iPhone / iPod Touch of exactly '120x120' pixels, in .png format for iOS versions >= 7.0."


「必要なアイコンファイルがありません。このbundleにはiPhoneもしくはiPod Touchのために必要な、ちょうど120×120ピクセルのアイコンが含まれていません。なお、iOS7.0以降の場合は.pngフォーマットの必要があります。」

itunesconnectではすでにアイコンを登録していたのですが、XcodeでどこでAppを登録するか知らなかったので、時間を取られました。

#解決方法
Navigation Area の Assets.xcassets を選択します。すると、AppIconを登録することができます。iOS毎に29pt, 40pt, 60ptと異なるサイズのアイコンを選択することが必要です。なお、2xはサイズ2倍、3xはサイズ3倍なので、例えばiOS5.9の29ptのうち2xであれば、58×58のアイコンを登録することが求められる、ということになります。
![スクリーンショット 2016-08-10 2.36.28.png](https://qiita-image-store.s3.amazonaws.com/0/133220/d1957e55-82bc-3f29-ffa0-de7dfa2c7c4a.png)


#まとめ
申請時のアイコン登録はitunesconnectだけでなく、Xcodeにも必要です。

##参考になった関連記事
『新しいTestFlightを試したらエラーが出たので、対処法をメモ。』
http://qiita.com/oggata/items/630a183d845ceac9022d
Xcode7で部品を等間隔に並べるには、StackViewが使いやすい

###前提条件
Xcode:7.3.1　
Swift:2.0


#解決したい問題
UIButtonなどの部品を、上下左右に等間隔に複数並べたい。Autolayoutを活用してもできるが、手続きが煩雑になる場合がある。

参考記事「Auto LayoutでViewを等間隔に並べる記事読んでもわからない人向けの説明」
http://qiita.com/yimajo/items/1e9d9c204e9c5eff9692

#解決策およびメリット
StackViewを使う。Autolayoutよりも手数が少なくすむ。


#どうやってやるか（例）
4つのUIButton、A,B,C,Dを横に等間隔に並べたい。![スクリーンショット 2016-08-10 1.51.16.png](https://qiita-image-store.s3.amazonaws.com/0/133220/e270cc10-6c97-1ac4-f3b8-4d57a59f5003.png)

まず、4つのButtonを選択した状態で、StackViewをクリックすると、4つのボタンが隙間なくくっつく。
![スクリーンショット 2016-08-10 2.18.59.png](https://qiita-image-store.s3.amazonaws.com/0/133220/a9b5b9e7-bad9-77ef-5079-9ca772147c79.png)

次に、Attributes InspectorのDistributionをEqual Spacingに、Spacingに適当な数字をふる。すると、4要素が等間隔に並ぶ。![スクリーンショット 2016-08-10 2.01.55.png](https://qiita-image-store.s3.amazonaws.com/0/133220/8ae1d7f2-3515-52a2-371b-fd819ed0c3ea.png)

あとは、StackView全体に対してHorizontally in ContainerとVertically in Containerを設定すれば、4要素が上下左右の真ん中に均等に並ぶ。![スクリーンショット 2016-08-10 1.52.50.png](https://qiita-image-store.s3.amazonaws.com/0/133220/6f6e0282-1cd8-ac0b-52e9-de60a1e7b9ea.png)
![スクリーンショット 2016-08-10 1.52.56.png](https://qiita-image-store.s3.amazonaws.com/0/133220/eef553e9-9f8f-092a-13b7-50f44393562d.png)

#まとめ
StackViewは複数のボタンなどの部品を等間隔にまとめるのに使える


###参考にさせていただいたStackViewの関連記事
『StackViewを賢く使ってらくちんAutoLayout』
http://qiita.com/yucovin/items/ff58fcbd60ca81de77cb

『Xcode7 の新機能「StackView」を使うと、Storyboard の AutoLayout を簡単に設定できる』
http://qiita.com/merrill/items/04be7d2222cd70dd6408

『【Swift】超便利StackViewの実践的使い方！まだAutoLayoutで消耗してるの？』
http://qiita.com/kinopontas/items/d08f84dbb711c5acbe28
Dockerを使って低コストでFlaskの開発環境を構築

## はじめに
ハンズオンや思いつきの用途で、環境をサクッと作って使い捨てたかったので
数ファイルと数秒で構築できるように作りました。

## 準備
* Dockerが動く環境
* インターネット接続

基礎的なことしかやらないので、Dockerさえ動けばなんとかなるはず。
私の実行環境はDocker for MacのPublic Betaです。

```bash:バージョン
$ docker --version
Docker version 1.12.0, build 8eab29e, experimental
```

## ソース

```bash:ローカルディレクトリ構成
flask/
    ├ Dockerfile
    ├ requirements.txt
    └ hello.py
```

### Dockerfile

```Dockerfile
# ベースイメージの指定
FROM python:3.5.2-alpine
                    
# ソースを置くディレクトリを変数として格納                                                  
ARG project_dir=/web/hello/
                                
# 必要なファイルをローカルからコンテナにコピー
ADD requirements.txt $project_dir
ADD hello.py $project_dir
         
# requirements.txtに記載されたパッケージをインストール                         
WORKDIR $project_dir
RUN pip install -r requirements.txt

# （コンテナ内で作業する場合）必要なパッケージをインストール
RUN apk update                  
RUN apk add zsh vim tmux git tig
```

### requirements.txt
```$ pip install flask```の実行後に```$ pip freeze > requirements.txt```したもの

```requirements.txt
click==6.6
Flask==0.11.1
itsdangerous==0.24
Jinja2==2.8
MarkupSafe==0.23
Werkzeug==0.11.10
```

パッケージのバージョンが変わっても困らないのであれば
単純にコンテナ内で```$ pip install flask```でもまったく問題なし。

### hello.py
[公式ページ](http://flask.pocoo.org/)から拝借。
```app.run```の引数は開発用途として修正。

```py:hello.py
from flask import Flask                           
app = Flask(__name__)                             
                                                  
@app.route('/')                                   
def hello_world():                                
    return "Hello World!"                         
                                                  
if __name__ == '__main__':                        
    app.run(host="0.0.0.0", port=5000, debug=True)
```

## 手順
### イメージ作成
```bash:イメージ作成
$ cd /path/to/flask/
$ docker build -t flask . 
```
* '-t flask': 作成するイメージの名前を'flask'にする
* '.': カレントディレクトリにあるDockerfileを使用

### コンテナ起動

```bash:コンテナ起動
$ docker run -p 5000:5000 -it flask /bin/sh
```
* '-p 5000:5000': hostの5000番ポートをコンテナの5000番ポートに向ける
* '-it': 現在の入力デバイスでコンテナを操作
* 'flask': イメージ名の指定
* '/bin/sh': 起動したコンテナでshコマンドを実行

### Flask実行
hostやportは```hello.py```内で既に指定されているため、実行のみ。

```bash:Flask実行
$ cd /path/to/hello/
$ python hello.py
```

ブラウザから```localhost:5000```にアクセスすると、```Hello World!```が表示されます。

## むすび
今まではAnsibleでpyenvやvirtualenvを駆使して作ってたけど
どうせ捨てるし、バージョン管理周りはざっくりでいいと思う。

Pythonのインストールはベースイメージにおまかせなので
ちゃんとした開発をするならDockerfile読み解くなり自分で作るなりする。
RailsでJSONB型を使う

# 検証環境

```vim
Service
  PostgreSQL 9.4.4

Gem
  rails (4.2.0)
  activerecord (4.2.0)
  Gem pg (0.18.1)
```

# 使い方

## マイグレーション

```ruby:db/migrate/create_shops.rb
class CreateShops < ActiveRecord::Migration
  def change
    create_table :shops do |t|
      t.jsonb  :metas, null: false, default: '{}'
    end
  end
end
```

## 管理画面(ActiveAdmin)

[ActiveAdmin::JsonEditor / Github](https://github.com/udacity/activeadmin_json_editor)

```ruby:Gemfile
gem 'activeadmin_json_editor', '~> 0.0.6'
```

```ruby:app/admin/shop.rb
ActiveAdmin.register Shop do
    permit_params :metas

    json_editor

    # specify the type does not necessarily
    form do |f|
      f.inputs do
        f.input :metas, as: :jsonb
      end
      f.actions
    end
end
```

### サンプル

![image](https://qiita-image-store.s3.amazonaws.com/0/64098/d6eb4dda-bab1-f0fc-32b4-15e2e3c46459.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/64098/a1916771-2b1b-10a6-0df0-cb7637e6ae2c.png)

## 検索

```ruby:モデル等
  ## (meta["country"]["name"] == "Japan") なレコードを検索する
  shops = Shop.where("meta #> '{country}' ->>'name' = ?", "Japan")

  ## (meta["country"].has_key("code") && meta["country"].has_key("name")) なレコードを検索する
  shops = Shop.where("meta #> '{country}' ?| array['code', 'name']")     #「?」がプレイスホルダーと被るが、第二引数を渡さなければ大丈夫
  shops = Shop.where("meta #> '{country}' ?| array['code', 'name']","2") #「?」が"2"に置換されてしまう
  shops = Shop.where("meta #> '{country}' ?| array[:keys]",keys:['code', 'name']) #名前付きプレースホルダを使えば「?」は置換されないので大丈夫
```

※ 記法が独特で間違えやすそうなので、```scope```あたりで定義してきちんとテストして使うようにしたい。

### 結果サンプル

```vim:RailsConsole
[1] pry(main)> shops = Shop.where("meta #> '{country}' ->>'name' = ?", "Japan")
=>   Shop Load (0.5ms)  SELECT "shops".* FROM "shops" WHERE (meta #> '{country}' ->>'name' = 'Japan')
[#<Shop:0x007f6c01ba7c90
  id: 13,
  meta:
   {"country"=>{"code"=>"49", "name"=>"Japan"},
    "zipcode"=>"123-4567",
    "prefecture"=>{"code"=>"1234567", "name"=>"Hokkaido"}},
  created_at: Fri, 29 Jul 2016 21:57:31 JST +09:00,
  updated_at: Tue, 09 Aug 2016 23:27:40 JST +09:00>]
```

## 参照

* Hash型になるので「.country」等でメソッドアクセスすることはできない
* シンボルも不可

```vim:RailsConsole
[1] pry(main)> shop.meta.country
NoMethodError: undefined method `country' for #<Hash:0x007f6c01ac7398>
from (pry):18:in `<main>'

[2] pry(main)> shop.meta["country"]
=> {"code"=>"49", "name"=>"Japan"}

[3] pry(main)> shop.meta["country"]["code"]
=> "49"

[4] pry(main)> shop.meta["country"]["none_attribute"]
=> nil

[5] pry(main)> shop.meta["none_attribute"]["code"]
NoMethodError: undefined method `[]' for nil:NilClass
from (pry):23:in `<main>'

[6] pry(main)> shop.meta[:country]
=> nil
```

※必要ならばモデル化して使うことも検討

# 参考

* ベンチマークやインデックスの貼り方などいろいろ

> Using PostgreSQL and jsonb with Ruby on Rails
> http://nandovieira.com/using-postgresql-and-jsonb-with-ruby-on-rails
PexJS (Swiffy難民の避難先)


# PexJSを選ぶまでの道のり

## 2016年7月をもってGoogleが提供するSwiffyは終了しました。

- [Swiffy | Google Developers](https://developers.google.com/swiffy/)

## 避難先の候補

- 有償
    - MAKE5 | REAL SAMURAI : https://www.make5.biz
    - あと1社あったが忘れました。
- オープンソース
    - PexJS : https://github.com/PexJS
    - swf2js : https://github.com/ienaga/swf2js
- 自作する


## 結果的に私はオープンソースのPexJSを選択しました。

理由はいろいろあるが、大きく3つ。

- サービスの終了などに足を引っ張られたくない。
    - 今更イチから作りたくない。(5年ぐらい前ならありだったと思う。)
    - そのためオープンソースなものが良いと考えた。
- Swiffyがかなり急な終了だったため、手っ取り早く代替ツールが欲しい。
- お金はできれば使いたくない。


### そもそもの大前提
- Flash Lite 1.1で作られたswfがまともに動くこと。
- パフォーマンスがある程度でること。


## PexJSでなんとかなるな。という判断した基準
- Mobageのエンジンと同等であること
    - Flash Lite 1.1をほぼサポートしている。
- ソースは追えるボリュームであると判断できた。

特に前者が大きいです。

うちのプロジェクトではUnity + WebView内に表示する際に使ってるのでメモリやCPU周りで突然死することもあるが、普通のブラウザで使う分には大きな問題は起きないと思います。

Unity + WebViewはそもそも選択肢として考えないほうが吉。
どうしてもやる場合、iOSはWKWebViewを使うなりして、UIWebViewは使わないこと。
Androidはそもそもスペックがまばらなので、4.4より前の端末を対象外とすることからはじめましょう。


Swiffy難民の参考にあれば幸いです。
atomにCygwinを移植する

# はじめに
今までWindows環境でatomでプログラムを書いてCygwinで実行していたのですが、

エディタ
↓
ターミナルで確認
↓
エディタ
↓
ターミナルで確認

と、いちいち切り替えがめんどくさかったのが
atomにCygwinを移植することで楽になったのでメモとして残します。

# 使用するターミナル
atomにターミナルを移植するパッケージで有名なのが
["terminal-plus"](https://atom.io/packages/terminal-plus)
ですが、atomを最新バージョンにすると動かなくなったという
報告があります。
https://github.com/jeremyramin/terminal-plus/issues/201

そこでterminal-plusを似せて作った["platformio-ide-terminal"](https://github.com/platformio/platformio-atom-ide-terminal)がIssue内で紹介されているのでそちらを使うことにしました。

# platformio-ide-terminalのインストール
インストールには setting -> installの’Search packages’から' platformio-ide-terminal 'と入力すればインストールできます。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/130670/df21e7e3-2306-c0fb-11fd-9fe009ae8dfa.png)

# platformio-ide-terminalの使い方
atom上で以下のコマンドを打てばターミナルが起動します。

```
ctrl-`

```

![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/130670/2393dbb8-0ad0-c4aa-0ef4-f83de45884e8.png)

# powershellからcygwinに変更
これでatomからターミナルを呼び出すことができるようになりました。
しかし、Windows環境ではデフォルトでPowershellが呼び出される仕様になっています。

とても使いづらいです。おこです。

なので今まで使っていたCygwinに変更したいと思います。

<hr>
まず、環境設定からパッケージを開きます。
platformio-ide-terminalの設定を開いて、
![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/130670/87ab8c8d-3c32-aaa3-44bb-02b9c552bcf7.png)

Core欄のShell Overrideに
![4.PNG](https://qiita-image-store.s3.amazonaws.com/0/130670/6512ae06-0880-fb1e-36a9-207cca723a10.png)

Cygwinのフォルダの中にあるバッチファイルの位置を教えます。
```
C:\cygwin64\Cygwin.bat
```

これでatomからCygwinを開けるようになりました。

# atomからCygwinを開く

atom上でCtr-`
ターミナルを開いてみましょう

![5.PNG](https://qiita-image-store.s3.amazonaws.com/0/130670/f21df30e-6760-f7a1-04bb-1f8afd4c60be.png)

こうなれば大丈夫です。

# おわりに
atomにcygwinを移植することができました。

cygwinの他にもShell Overrideの中身を変えれば他のターミナルに変更することも可能です。
AWS IAM Switch Roleのリストを増やすChrome Extension(Firefox Add-onも)を作った

AWS Management Console において、AWSアカウントから他のAWSアカウントにスイッチロールできますが、これの最近の履歴が5つまでしか表示されない。あくまでも最近使ったものという位置付けなんだと思います。

某仕事上、1つのアカウントから多数の他のアカウントに Switch Role にせざる得ないので専用の URL をブックマークしていました。しかし、これでも毎回補完された入力フォームが挟まれて怠い（このページ遷移が結構かかります）。

このような理由で、Switch Role の履歴（リスト）を拡張する Chrome Extension を作りました。Chrome Web Store で公開しているので簡単にインストールできます。 (2017/8/31 に Firefox Add-onも公開しました。)

[AWS Extend Switch Roles - Chrome ウェブストア](https://chrome.google.com/webstore/detail/aws-extend-switch-roles/jpmkfafbacpgapdghgdpembnojdlgkdl?utm_source=qiita)
[AWS Extend Switch Roles :: Firefo Add-ons](https://addons.mozilla.org/ja/firefox/addon/aws-extend-switch-roles3/)

![ScreenShot_1_960x600.png](https://qiita-image-store.s3.amazonaws.com/0/8924/33585ace-1b9e-7a13-8d2c-116c495c856b.png)


## 特徴

* Switch Role の履歴に設定に定義されたプロファイル（アカウント）の分が項目増えるリスト拡張される。
* リストには `<プロファイル名>  |  <AWSアカウントID>` と AWSアカウントID がわかりやすくなる。
* 色指定ができる（固定色ではない）。
* スイッチロール後に黒いヘッダーの下部に指定色のバーが表示されてより現在のプロファイルが識別しやすくなる。
* Chrome Sync (端末間) で設定は共有されます。

## 設定
ブラウザの URL バー右に並ぶ拡張のアイコンをクリックして、ポップアップしたテキストエリアに CLIで同様の設定となる `~/aws/config` ファイルと同様のフォーマットで定義して保存するだけです。色指定 (例．color = ffcc99) も CSS ライク（先頭 # なし）で指定できます。GitHubの README を詳しくは参照ください。

[tilfin/aws-extend-switch-roles: Extend your AWS IAM switching roles by Chrome extension](https://github.com/tilfin/aws-extend-switch-roles)

![ScreenShot_3_960x600.png](https://qiita-image-store.s3.amazonaws.com/0/8924/92b8453a-802c-7e33-30fc-84e3b2475a71.png)

[tilfin's blog](http://tilfin.hatenablog.com/entry/2016/08/09/233508) よりクロスポスト
AzureのLog Analyticsを使う Part-1

#はじめに
Azureのログアナリティクスを使用してみます。解析したいログデータが500MBまでであれば無料オプションで使用できます。
仮想マシンやストレージアカウントがあった方がいろいろ試せそうですが今回は無料オプションの範囲で試してみるので設定はしません。
ちなみにChromeではポータルがうまく表示できず、Firefoxでは一部（プレビュー機能を有効にする）ボタンがクリックできませんでした。

##参考
[Azure で利用できる無料の機能をご紹介します](https://azure.microsoft.com/ja-jp/free/pricing-offers/)
[Log Analytics](https://azure.microsoft.com/ja-jp/services/log-analytics/)
[Log Analytics とは](https://azure.microsoft.com/ja-jp/documentation/articles/log-analytics-overview/)

##関連ページ
[AzureのLog Analyticsを使う Part-2](http://qiita.com/tworks55/items/45485bd08ca1affd0d3b)
[AzureのLog Analyticsを使う Part-3](http://qiita.com/tworks55/items/759b0a5aea4e03992d17)

#1.参照メニューからログ分析(OMS)を選択
![image](https://qiita-image-store.s3.amazonaws.com/0/131481/e2dea1ee-235e-ff44-7a3f-615a88d649ff.png)

#2.OMSワークスペースを作成
![image](https://qiita-image-store.s3.amazonaws.com/0/131481/229697e3-3580-eaf8-69f5-ad8bf3b8ff72.png)

価格レベルでFreeを選択してOMSを作成
![image](https://qiita-image-store.s3.amazonaws.com/0/131481/c4f2897e-fa79-3e22-d751-0d4e30e0230b.png)

作成されたOMSワークスペースを確認
![image](https://qiita-image-store.s3.amazonaws.com/0/131481/3a489e92-a8fd-afe4-7999-9d5d75e79f86.png)

※Azure上に仮想マシンやストレージアカウントがないとここでは設定するものがあまりありません。

#3.OMSポータルで設定を追加
![image](https://qiita-image-store.s3.amazonaws.com/0/131481/8de0fc94-e7d1-9f32-3d9e-07832f8a50a9.png)

デフォルトではニュースが出てくる程度。設定ボタンを押してさっそく設定をしてみます。
![image](https://qiita-image-store.s3.amazonaws.com/0/131481/97dfcaf6-7d8f-e39b-c14e-adbcfd387224.png)


##1.デフォルト表示されたソリューションをAdd Selected Solutionsをクリックして追加
![image](https://qiita-image-store.s3.amazonaws.com/0/131481/94f7b2f9-6161-9eef-c970-615dd172d717.png)

##2.データソースは追加できるものがないのでスキップ
![image](https://qiita-image-store.s3.amazonaws.com/0/131481/466fdc40-2134-bc82-10a2-76dd54ce0a76.png)
※将来的にはAWSストレージにも接続できるようです。

##3.Data(Log)はIISのログファイルを追加
![image](https://qiita-image-store.s3.amazonaws.com/0/131481/34f6cb0b-1cdb-eccc-3bb4-e8d797326eae.png)

そして、左上のSaveをクリックします。ポータルに戻ると次のようになっています。

![image](https://qiita-image-store.s3.amazonaws.com/0/131481/d288e61c-fd3a-92c0-56c1-faa5d54ef280.png)

続きはPart-2にて。