OmniAICreator/Qiita-1.07M huggingface dataset:
W19が出ないように自動コマンドのグループを削除する

環境

- Debian
- Vim 7.4.2228

自作のスニペットプラグインを使用してたら頻繁にW19が発生するようになりました。
原因と対策について調べた事を書きます。

## 原因

自動コマンド発動中にその自動コマンドのグループを削除すると警告としてW19が表示されるようです。


英語に自信がないので、詳しくはヘルプを参照してください。

```:h W19```

## 目標

InsertLeaveイベントが発動されたら、**Remove()**を実行し、自動コマンドとその自動コマンドのグループを削除する。

## W19を出すサンプル

### バッドサンプル1

インサートモードを抜けた時に自動コマンドと自動コマンドのグループを削除するサンプルコードです。
インサートモードを抜けた時にW19が発生します。

```vim:bad1.vim
function! Remove() abort
    echomsg 1
    autocmd! sample
    augroup! sample
endfunction

augroup sample
    autocmd!
    autocmd InsertLeave * call Remove()
augroup END

call feedkeys("i\<esc>")
```

```bash:Vim起動
vim -Nu NONE -S bad1.vim
```

Vimを起動するとW19が発生します。

次の3つのコマンドを実行してみます。

```:mes``` 1が表示されました。
```:au``` 自動コマンドが消えました。
```:aug``` --削除済-- と表示されました。


## W19は出ないけど不完全なサンプル

### バッドサンプル2

```vim:bad2.vim
function! Remove() abort
    echomsg 1
endfunction

augroup sample
    autocmd!
    autocmd InsertLeave * autocmd! sample | augroup! sample | call Remove()
augroup END

call feedkeys("i\<esc>")
```

```bash:Vim起動
vim -Nu NONE -S bad2.vim
```

次の3つのコマンドを実行してみます。

```:mes``` 何も表示されません。
```:au``` 自動コマンドが消えました。
```:aug``` sampleと表示されました。グループが残ってます。

### バッドサンプル3

```vim:bad3.vim
function! Remove() abort
    echomsg 1
endfunction

augroup sample
    autocmd!
    autocmd InsertLeave *  call Remove() | autocmd! sample | augroup! sample
augroup END

call feedkeys("i\<esc>")
```

```bash:Vim起動
vim -Nu NONE -S bad3.vim
```

次の3つのコマンドを実行してみます。

```:mes``` 1が表示されました。
```:au``` 自動コマンドが消えました。
```:aug``` sampleと表示されました。グループが残ってます。

## W19を出さないサンプル

### サンプル1

```lambda``` と ```timer``` の機能を使用してW19を出ないようにbad1.vimを修正しました。

```vim:sample1.vim
function! Remove() abort
    echomsg 1
    autocmd! sample
    call timer_start(0, {-> execute('augroup! sample', "")})
endfunction

augroup sample
    autocmd!
    autocmd InsertLeave * call Remove()
augroup END

call feedkeys("i\<esc>")
```

```bash:Vim起動
vim -Nu NONE -S sample1.vim
```

Vimを起動してもW19が出なくなりました。

次の3つのコマンドを実行してみます。

```:mes``` 1が表示されました。
```:au``` 自動コマンドが消えました。
```:aug``` グループが消えました。


### サンプル2

```lambda``` を使わない書き方も載せます。
実行結果はサンプル1と同じです。

```vim:sample2.vim
function! Callback(timer) abort
    augroup! sample
endfunction

function! Remove() abort
    echomsg 1
    autocmd! sample
    call timer_start(0, 'Callback')
endfunction

augroup sample
    autocmd!
    autocmd InsertLeave * call Remove()
augroup END

call feedkeys("i\<esc>")
```

```bash:Vim起動
vim -Nu NONE -S sample2.vim
```

## その他

Vim 7.4を切る場合はこれでW19を抑えられましたが、古いVimでどうやって対応して良いのかは分かりません。
[Docker] 起動中のコンテナに --restart=always オプションを後から適用する

`--restart=always` オプションを付け忘れて起動しまったコンテナに対して後からこのオプションを適用したいことがありました。従来は一度コンテナを削除して作りなおす必要があったようですが、Docker のバージョンが 1.11.0 以降であれば `docker update` コマンドで起動中のコンテナに対して `--restart=always` オプションを後から適用することができました。コマンドは下記のとおりです。

```
sudo docker update --restart=always CONTAINER
```

`CONTAINER` にはコンテナIDまたはコンテナ名が入ります。

## 参考
http://stackoverflow.com/a/37618747
SDKBOX : 罠1: Invalid iap item name: xxxxx

Invalid iap item name: xxxxx
というエラーが発生しました。

原因は　：　resフォルダー下にある　sdkbox_config.json　は不正でした。

このツールでjsonのチェックできます。
https://jsonformatter.curiousconcept.com/


```json
{
    "android": {
        "iap": {
            "items": {
                "item1": {
                    "id": "com.chogame.donuts.item1"
                }
            },
            "key": "MIIBIxxxxxxxxxxxxxxxxxxxxxxDAQAB"
        }
    },
    "ios": {
        "iap": {
            "items": {
                "remove_ads": {
                    "type": "non_consumable", 
                    "id": "com.cocos2dx.non1"
                }, 
                "double_coin": {
                    "type": "non_consumable", 
                    "id": "com.cocos2dx.non2"
                }, 
                "coin_package": {
                    "id": "com.cocos2dx.plugintest2"
                }, 
                "coin_package2": {
                    "id": "com.cocos2dx.plugintest3"
                }
            }
        }
    }
}
```
JavaのList<?extends T>へのget/add、List<?super T>へのget/add


# 具体的な型
```java:class
class Animal(){
}
class Dog extends Animal(){
}
class Puppy extends Dog(){
}
```
DogはAnimalのサブクラスとします
PuppyはDogのサブクラスとします
new ArrayList<? extends Animal>とか
new ArrayList<? super Dog>などのワイルドカードオブジェクトを生成できません
ワイルドカード型はメソッドのパラメータ型に使います
# List\<?extends Animal\>
##要素追加 add 不可能
void func(List\<?extends Animal\>p)
のメソッド内では
p.add(animal);
p.add(dog);
は共にコンパイルエラーになります。
List\<?extends Animal\>型であるpは、List\<Puppy\>である可能性もあります。List\<Puppy\>型リストには、animalもdogも追加できません。pはPuppyよりさらに子孫のクラスのListの可能性もあります。結局List\<?extends Animal\>pには、(nullを除き）どのようなオブジェクトもaddできません。
**※?extends Animalだから、Animalの子孫クラスならaddできると考えてはいけません。**
##要素読み出し get　安全
void func(List\<?extends Animal\>p)
のメソッド内では
Animal a=p.get(0)できます。pはList\<Animal\>とは限らず、List\<Dog\>やList\<Puppy\>の可能性があります。いずれにせよ、List\<?extends Animal\>型Listオブジェクトからgetした要素をAnimal型に代入することはアップキャストになり、安全に要素を読み取ることができます。func(List\<?extends Animal\>p)はpからAnimal型要素を取り出すのに使います。
# List\<?super Dog\>
##要素追加 add　Dogの子孫クラスオブジェクトなら可能
void func(List\<?super Dog\>p)
のメソッド内では
p.add(New Animal());//<=これはコンパイルエラー
p.add(New Dog());//有効
p.add(New Puppy());//有効
**※?suprt Dogだから、Dogの先祖クラスならaddできると考えてはいけません。**
pはList\<Dog\>かもしれませんが、List\<Animal\>やList\<Object\>である可能性もあります。これらのListオブジェクトに対して安全にaddできるのは、Dogの子孫クラスのオブジェクトです。func(List\<?super Dog\>p)はpにDog型(及びその子孫クラスのオブジェクト)要素を追加するために使われます。
##要素読み出し get　危険なので禁止
void func(List\<?super Dog\>p)
のメソッド内でpから要素を取り出すことはできます。
Dog dog=p.get(0);
これはコンパイラエラーにはなりません。しかし、pはList<Animal>やList<Object>であるかもしれません。よって、取り出した要素はObject型である可能性もあり、Dog dog=p.get(0);はダウンキャストになり、その場合はランライムエラーで例外が発生します。結局List\<?super Dog\>から要素を読み出して何らかのクラスにキャストするのは危険で、読み出し禁止扱いとします。

# PECS
キューやネットワークなどを介して、一連のオブジェクトを入力として、別の一連のオブジェクトを出力するソフトウェア構造をProducer/Consumerモデルといいます。Producer/Consumerモデルが入力として受け付けるオブジェクトの型がAnimalの場合、入力となる一連のデータを受け取るメソッドをifunc(List\<?extends Animal\>p)のようにしておくと、ifuncにはList\<Animal\>、List\<Dog\>、List\<Puppy\>のいずれのリストもifuncに渡せます。
Producer/Consumerモデルが出力するオブジェクトの型が例えばDog型の場合、出力を受け取るメソッドをofunc(List\<?suprt Dog\>p)のようにしておきます。もし出力されたオブジェクトを単にAnimal型としてしか扱わなければ、ofuncのパラメータにはわざわざList\<Dog\>ではなくList\<Animal\>型のListオブジェクトを渡して、出力をそのリストに格納できます。
このように**P**roducer側の入力パラメータを**e**xtendsして、**C**onsumer側のデータを格納するパラメータを**s**uperする習慣をPECSといいます。
Unity > Panel > 透明度を変更する

```txt:動作環境
Unity 5.3.5-f1 on MacOS X El Capitan
```

UIのPanelの透明度変更方法を忘れた。

以下で実行する。

- PanelのColorを開く
- Aの値を変更する
  - マウスでスライドしてもよい

AはAlphaのAらしい。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/55f70296-655e-477d-c6f0-3036d4ea049a.png)


![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/97e1f8c1-1ed2-a8f9-7be8-5cbd066f409f.png)
Inventory > ソフト設計 160820 > 機能 / UIプロトタイプ


## ソフト設計

https://atlas.mindmup.com/2016/08/3901f69048fb01344d2d008d32646d69/softdesign_inventory_160820/index.html


## UI プロトタイプ

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/0a1e1b3c-6224-5084-45c0-057fe488b49f.png)


Unityの使い方忘れて、Panelの塗りつぶし方法忘れた。
Cubeでごまかした。~~そのうち調べ直す。~~
調べた。http://qiita.com/7of9/items/a3cad249b94f8ce6ffd0

- Unique ID入力してCheck
  - 10103: (個別閲覧モード) > ケース内の特定アイテムが読込まれ表示される
  - 10000: (全閲覧モード) > ケース全部のアイテムが読込まれ、Row=1,Column=1の情報が表示される
- RowのPrev, Next
  - Rowの位置をずらす
- ColumnのPrev, Next
  - Columnの位置をずらす
- Name入力してSearch
  - 部分検索して、見つかったパーツの情報を表示
- DataSheetのWeb
  - Webブラウザが開く

## csv更新

- UDPでsave/load

## その他

なし。
機能を盛り込みすぎると16時間で実装できない。

しかしながら、UDP機能を追加する場合、ネットワーク設定用画面が必要となり作業が増える。

過去の使い回しで済むかどうか。

http://qiita.com/7of9/items/650105cd72567dd180fa
SquidでProxy環境を作る

Proxy環境で何かエラー出たんだけどーという時にデバックするためにぱっと自分でProxy環境を作った時のメモ

構成は以下の様な感じ

サーバーA(squid)<-サーバーB(Proxy経由でのアクセスのみ)

# 参考

+ [Squidによるプロキシサーバーの構築](http://linux.kororo.jp/cont/server/squid.php)

# 事前準備

+ サーバーBはiptablesなり何らかのFirewallでサーバーAへの接続のみできるようにする

# サーバーA(squid)

インストール

```bash
$sudo yum install squid
```

設定ファイルでサーバーBのIPアドレス及び接続許可を追記

```/etc/squid/squid.conf

acl source src  xxx.xxx.xxxx.xxx/255.255.255.255 # add

http_access allow source # add

```

特定のネットワークに対して書いてもOK

```/etc/squid/squid.conf

acl source src 172.31.16.0/20 # add

http_access allow source # add

```



```bash
$sudo service squid start

$udo netstat -lanput |grep squid
tcp        0      0 :::3128                     :::*                        LISTEN      8261/(squid)
udp        0      0 0.0.0.0:59636               0.0.0.0:*                               8261/(squid)
udp        0      0 :::36952                    :::*                                    8261/(squid)
```

あとはアクセスログを適当に監視

```bash
$tail -f /var/log/squid/access.log
```

# サーバーB

```bash
# 接続できないことを確認
$curl http://yahoo.co.jp

#サーバーAには通信できるか
$ping  xxx.xxx.xxx.xxx

# proxy経由ではアクセスできるのか
$curl --proxy http://xxx.xxx.xxx.xxx:3128 http://yahoo.co.jp
```

上記タイミングでサーバーAでログも出るので確認。
ログが出てなければそもそも通信ができていないので設定を確認すること
MySQL5.1→5.7へアップグレード

#各種バージョン
| | バージョン| 
|:-----------:|:------------:|
| OS                       |CentOS 6.8| 
| MySQL(アップグレード前)     |5.1.73| 
| MySQL(アップグレード後)     |5.7.14|  

#RPMリポジトリの追加
最新版のリポジトリURLは下記URLを参照。 

 *  http://dev.mysql.com/downloads/repo/yum/
 
```bash
$sudo rpm -ivh http://dev.mysql.com/get/mysql57-community-release-el6-8.noarch.rpm
```

#MySQLファイルのバックアップ
```bash
$sudo cp -aR /var/lib/mysql/ /var/lib/mysql_bk/
```

#MySQLの停止
```bash
$sudo service mysqld stop
```

#MySQLのアップグレード
```bash
$sudo yum update mysql-server
```

#テーブルのアップグレード
MySQLを起動後に下記のmysql_upgradeコマンドを入力することでテーブルを修正してくれるのですが、
私の環境の場合、下記のエラーが発生し、MySQLが起動できませんでした。

```bash
[ERROR] Fatal error: mysql.user table is damaged. Please run mysql_upgrade.
[ERROR] Aborting
```

そのため、セーフモード(ユーザ認証のパスワードなし)で起動し、mysql_upgradeコマンドを実行しています。

下記のコマンドで、MySQLをセーフモードで起動する。

```bash
$/usr/bin/mysqld_safe --skip-grant-tables &
```
セーフモードで起動後、テーブルをアップグレードする

```bash
$mysql_upgrade -u root -p
```
以下のメッセージが表示されれば正常に完了

```bash
Upgrade process completed successfully.
Checking if update is needed.
```

my.cnfに下記を追加する。
mysql5.6以降は暗黙のデフォルト値としてTIMESTAMP型を使用すること非推奨になっているため、下記設定をしないとWARNINGが発生する。

```/etc/my.cnf
[mysqld]
explicit_defaults_for_timestamp = true
```

MySQLを再起動する

```bash
$sudo service mysqld restart
```

MySQLにログインできるか確認

```bash
$mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 5.7.14 MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 
```
<? extends T>と<? super T>の使い方

# 具体的な型
```java:class
class Animal(){
}
class Dog extends Animal(){
}
```
DogはAnimalのサブクラスとします
new ArrayList<? extends Animal>とか
new ArrayList<? super Dog>などのワイルドカードオブジェクトを生成できません
ワイルドカード型はメソッドのパラメータ型に使います

# List\<Animal\>とList\<Dog\>の関係
```java:不変性
List<Animal>a=new ArrayList<>();
List<Dog>d=new ArrayList<>();
//===========================代入
a=d;//コンパイルエラー
d=a;//コンパイルエラー
//===========================メソッド呼び出し
//定義側
void func(List<Animal> p){
... pをList<Animal>として操作
}
//呼び出し側
func(animal);//有効
func(dog);//コンパイルエラー
```
オブジェクト代入は相互に不可能
メソッド呼び出しは、同じ型のみ可能
**結論**
Dog extends Animal だったとしてもList\<Dog\>とList\<Array\>に関係性はありません

# List\<? extends Animal\>とList\<Dog\>の関係
```java:共変性
List<Dog>d=new ArrayList<>();
//===========================代入
List<? extends Animal>ea;
ea=d;//有効
d=ea;//コンパイルエラー
//===========================メソッド呼び出し
//定義側
void func(List<?extends Animal> p){
... pをList<Animal>として操作
}
//呼び出し側
func(dog);//有効
func(animal);//有効
```
List\<Dog\>型はList\<?extends Animal\>に代入可能
List\<Dog\>型はfunc(List\<?extends Animal\>)のパラメータにできます
**結論**
List\<Dog\>型はList\<?extends Animal\>にアップキャスト可能
Dog extends Animal =>(ならば) List\<Dog\> extends List\<? extends Array\>と扱えます
上記　=>の両辺でDogとAnimalの位置関係が同じなので共変関係
# List\<? super Dog\>とList\<Animal\>の関係
```java:反変性
List<Animal>a=new ArrayList<>();
//===========================代入
List<? super Dog>sd;
sd=a;//有効
a=sd;//コンパイルエラー
//===========================メソッド呼び出し
//定義側
void func(List<? super Dog> p){
... funcはp.addするためのもの pはObject型として扱う
}
//呼び出し側
func(animal);//有効
```
List\<Animal\>型はList\<?super Dog\>に代入可能
List\<Animal\>型はfunc(List\<?super Dog\>)のパラメータにできます
**結論**
List\<Animal\>型はList\<?super Dog\>にアップキャスト可能
Dog extends Animal =>(ならば) List\<Animal\> extends List\<? super Dog\>と扱えます
上記　=>の両辺でDogとAnimalの位置関係が逆転しているため反変関係
Unityでシーン切り替えを気にせずBGMを再生させ続ける方法

# 前書き
Unityでゲームの作成時、シーンによっていちいちAudioSourceを作成したりしなければならなかったのが面倒くさかったので作成した。
名前を仮に「SoundController」とする。

## SoundControllerを利用することで得られるメリット

・シーン切り替え時などにいちいちBGMを切り替えるスクリプトを書かなくてよい
・フェードも自動
・最初のシーンでサウンドデータを読み込んでいるので、シーン切り替え時間がだいぶ短縮できる。

とかくインスペクタだけでほぼ作業完了できるので面倒がだいぶ省けます。

## 使い方

・一番最初に読み込まれるシーンを開きます。
・空のゲームオブジェクトを作成し、SoundControllerを貼り付けます。
・sourceにAudioSourceを設定します。（このオブジェクト以外のものを設定した場合、シーン切り替え時に破棄されてしまいます。なので3D音声にこだわらないのであればAudioSourceはこのオブジェクトに設定するのを推奨）
・BGMリストに「シーン名：AudioClip」の組み合わせでデータを登録します。

　
以下ソース。

``` C#
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.SceneManagement;
using System.Linq;
using System;

public class SoundController : MonoBehaviour {
    
    /// <summary>
    /// 使用するBGMリスト
    /// </summary>
    public List<BGMSelectItem> BGMList = new List<BGMSelectItem>();
    /// <summary>
    /// オーディオソース。
    /// </summary>
    public AudioSource source;
    /// <summary>
    /// BGMの設定ボリューム。自動的にこの値までフェードする
    /// </summary>
    public float MasterVolume = 0.5f;

    /// <summary>
    /// シーンごとのBGMを取得する
    /// </summary>
    /// <param name="s"></param>
    /// <returns></returns>
    private AudioClip this[string s]
    {
        get
        {
            return BGMList
                .Where(a => a.key == s)
                .Select(b=>b.clip)
                .FirstOrDefault();
        }
    }

    void Awake()
    {        
        DontDestroyOnLoad(this);
    }
    /// <summary>
    /// シーン切り替え時に呼ばれる。BGMをここで切り替える
    /// </summary>
    /// <param name="level"></param>
    /// <returns></returns>
    IEnumerator OnLevelWasLoaded(int level)
    {
        //フェードアウト
        while (Fade(-0.2f*0.1f))
        {
            yield return new WaitForSeconds(0.1f);
        }
        yield return new WaitForSeconds(1);
        source.clip = this[SceneManager.GetActiveScene().name];            
        source.Play(1);
        while (Fade(+0.2f * 0.1f))
        {
            yield return new WaitForSeconds(0.1f);
        }

        yield break;
    }

    /// <summary>
    /// 自動的にマスタボリュームまでフェードイン／フェードアウトする
    /// </summary>
    /// <param name="gain"></param>
    /// <returns></returns>
    private bool Fade(float gain)
    {
        if (this.source.volume + gain <= 0 || this.MasterVolume <= this.source.volume +gain)
        {
            return false;
        }

        this.source.volume += gain;
        return true;
    }

}

[Serializable]
public struct BGMSelectItem
{
    public string key;
    public AudioClip clip;
}


```

## 注意

最初のシーンではフェードが利きません。
なので、AudioSourceの最初のVolumeはあらかじめ再生しておきたい音量に手動で設定してください。
外部トリガーが可能な種類のUSBカメラを調査中

外部トリガーが可能な種類のUSBカメラ　の一例
生産ラインでのマシンビジョン向きのUSBカメラが多いようです。
そのため、C & CSマウントレンズを使っているのが多いようです。
複数のカメラの情報を統合するには、画像の取得時刻をそろえることが必要となります。
画像認識技術を開発するうえで、外部トリガー信号は重要です。
画像認識のソフトウェアだけ知っていればよいだけではなく、画像を取得するカメラの条件を意識しないとよい画像技術は作れません。


http://www.shodensha-inc.co.jp/menu07/product25/index.html
http://sentech.co.jp/products/USB/mini.html
http://sentech.co.jp/products/USB/USB20Board.html
http://www.shodensha-inc.co.jp/menu07/product27/index.html

http://www.ff-net.jp/ffhome/stcmc33.html

https://www.thorlabs.co.jp/NewGroupPage9_PF.cfm?Guide=10&Category_ID=220&ObjectGroup_ID=4024

http://www.argocorp.com/cam/usb2/tis/DxK41xU02.html


http://www.microtechnica.co.jp/jp/cameras/usb/le.html
https://jp.ids-imaging.com/store/produkte/kameras/usb-3-0-kameras/ueye-le/show/all.html


http://www.mvision.co.jp/shohin_mcm4304.html


http://www.argocorp.com/cam/usb2/lumenera/lu/Lw115.html

http://www.toshiba-teli.co.jp/products/industrial/usb/index_j.htm
ITサービスマネージャー　論文対策

#初めに
ITサービスマネージャーの論文を書くにあたって、対象なるＩＴサービスを具体化していきます。
取り上げる対象のシステムは私が長くシステム開発、運用に携わっている生命保険会社のシステムとします
#対象のＩＴサービス
##対象システム
保険会社Ａ社の支払業務システム
##Ａ社の会社規模
事務センターが全国に5か所、営業支店が3000店
##システム構成
- ＡＰサーバー5台　バッチサーバー2台　ＤＢサーバー2台　ファイル連携サーバ、イメージ管理サーバー2台　マイニングサーバー2台
- バッチサーバー、ＤＢサーバー、マイニングサーバー、イメージ管理サーバーはホットスタンバイ構成
- ＡＰサーバーはロードバランサ―による負荷分散構成
- 各事務センターはＶＰＮで後述のデータセンターにネットワーク接続を行っている。
- 運用で使用しているサーバーは関東と関西のデータセンターで運用している。
- 関西のデータセンターは関東で災害が発生した時の災害対策用として活用される。

##提供しているＩＴサービス
###生命保険会社の支払業務システムを行うためのＩＴサービス全般
- 支払業務システムは事務センター向けに開放されている。
- 請求内容の入力業務、査定業務、支払業務を行うWebアプリケーションを提供している。
- 支払査定者による査定の前にバッチ処理にて機械的な判定を行い、担当者の査定の負荷を軽減している
- 保険の支払い請求者から提出した書類や医師の診断書、査定に使う書類をすべてイメージ化し、ペーパレス
- 業務を実現するイメージ登録・検索機能の提供を行っている
- 入力されたデータをもとに病名、手術名を自動的にキーワード抽出するマイニング機能を提供している

#SLA
##システム稼働時間
- オンライン平日7時～22時 休日　8時から18時	
- 夜間バッチ平日7時～22時	休日　18時から24時

##事務処理量
- 1日に前事務センタートータルで8000件の請求が処理できること
- 1請求あたりに登録が必要なイメージは20枚＝1案件平均20イメージ　160000枚

##オンライン
###画面レスポンス
- 一覧照会系の画面　10秒
- 詳細画面 3秒

###夜間バッチ
- バッチ処理ウィンドウに収まるようにジョブを設計する

##システム外連携
###社内システム連携

- 支払業務で取り込んだイメージは営業支援システム、新契約システム、保全システムでも共有する

- 支払の査定の結果は全社ホストシステムに連携する
golangではスタックとヒープを気にする必要が無い

調べようと思ったきっかけは、golangでは以下のように
ローカル変数のアドレスを戻り値としても問題ないということ。


```go
package main

import (
	"fmt"
)

type Animal struct {
    Name string
    Age  int
}

func main() {
	animal := allocAnimal()
	fmt.Printf("allocate animal structure %p", animal)
}

func allocAnimal() *Animal {
	return  &Animal{}
}
```

ポインタを扱えるC/C++ではローカル変数のポインタを戻り値とした場合、スタック領域のポインタを関数外に渡すため、
コンパイル時点で警告が表示されます。(なぜエラーにしない)
実行時には最悪、セグメンテーションフォールトで落ちます。
そのため、mallocやnewでヒープ領域にメモリを割り当てる必要があります
なぜ、golangではこれが許されるのか気になり調べてみました

## スタックとヒープについて
golangにおけるスタックとヒープについて簡単にですが、説明します。

### スタック
- 確保・解放が早い
- 寿命が短い。関数内もしくは特定のスコープ内限定
- サイズが小さい
- ローカル変数・引数などで使われる

### ヒープ
- 確保・解放が遅い
- 寿命は自由
- サイズが大きい
- newなどで確保される


## golangのFAQ
golangのFAQにはスタックとヒープの扱いでは以下のように記載されています。
※全文はリンク先にて参照ください


[http://golang.jp/go_faq#stack_or_heap:title]

> 正確さを期するなら知る必要はありません。Goの各変数は参照されている限り存在し続けます。Goの実装によって選択された格納場所がどこかは、Go言語的には意味を持ちません。

と、どうやらコンパイラが適宜判断して、関数内に収まる場合はスタックに、関数外でも参照される変数はローカル変数でもヒープに割り当てられるようです。

## 実際に調べてみた
コンパイラにフラグを渡すと、メモリ割当の様子がわかります。
> go build -gcflags -m hello.go

サンプルコードそのままの様子を見てみます。

```bash
$ go build -gcflags -m main.go
./main.go:17: can inline allocAnimal
./main.go:13: inlining call to allocAnimal
./main.go:14: animal escapes to heap
./main.go:13: &Animal literal escapes to heap
./main.go:14: main ... argument does not escape
./main.go:18: &Animal literal escapes to heap　// ローカル変数がヒープに
```

コメントの箇所でコンパイラが関数の外で扱われると判断し、スタックではなくヒープに領域を確保しています。

### newで確保したメモリを関数の外に出さない場合
では、コードを以下のようにするとどうでしょうか。

```go
func allocAnimal() *Animal {
    animal := new(Animal)
    animal.Name = "Cat"
    animal.Age = 23
    return &Animal{}
}
```
このコードの内容にはあまり意味はありませんが、newしたものを関数内で完結させています。
このコードの様子を再度出力してみます。

```bash
./main.go:17: can inline allocAnimal
./main.go:13: inlining call to allocAnimal
./main.go:14: animal escapes to heap
./main.go:13: &Animal literal escapes to heap
./main.go:13: main new(Animal) does not escape // newしてもヒープに割り当てられない
./main.go:14: main ... argument does not escape
./main.go:22: &Animal literal escapes to heap
./main.go:18: allocAnimal new(Animal) does not escape
```

golangの場合はnewで確保しても関数内で完結するものはヒープではなくスタックに割り当てられるようです。


このように、golangでは特にスタックかヒープかというのを特に意識しなくても問題はないようです。
長く、C/C++をやっていた人間からするとモヤモヤしますが。。。
[Vue.js]外側をクリックすると閉じるドロップダウンメニュー

#はじめに
- メニューボタン押すと開く
- メニューボタンもう一度押すと閉じる
- メニューの外側押しても閉じる

どこでもよく見るアレをvue.jsで

#デモ
[デモ(jsfiddle)](https://jsfiddle.net/huigo/ro2my9kg/4/)

#説明
##親コンポーネント
```html:html
  <div style="position:relative">
    <button v-on:click.stop="showMenu = !showMenu">Menu</button>
    <dropdown-menu 
          v-if="showMenu"
          v-on:close="showMenu = false"></dropdown-menu>
  </div>
```
単純に親コンポーネントの`v-if="showMenu"`だけで表示の切り替えをしています。
子コンポーネント内で`$emit('close')`と発火させると`v-on:close`が拾って親がメニューを閉じてくれます。
`v-bind:show.sync="showMenu"`という構文はVue2.0で滅びるようです。

メニューを開く時のボタンクリックはメニューの外側で行うので、バブリングの停止が必要です。
`v-on:click.stop="showMenu = !showMenu"`の`.stop`modifierでやっています。

##子コンポーネント
```js:js
Vue.component('dropdown-menu', {
  mixins:[listener],
  template: '#menu-template',
  created:function(){
    this.listen(window, 'click', function(e){
      if (!this.$el.contains(e.target)){
        this.$emit('close');
      }
    }.bind(this));
  }
});
```
`window`をクリックしたとき、自分自身と子孫がターゲットでないなら`close`イベントをemitしています。
`this.$el`で自身のDOMが取得できます。


##イベントリスナー
```js:js
var listener = {
  methods:{
    listen :function(target, eventType, callback) {
    	if (!this._eventRemovers){
      	this._eventRemovers = [];
      }
      target.addEventListener(eventType, callback);
      this._eventRemovers.push( {
        remove :function() {
          target.removeEventListener(eventType, callback)
        }
      })
  	}
  },
  destroyed:function(){
  	if (this._eventRemovers){
      this._eventRemovers.forEach(function(eventRemover){
        eventRemover.remove();
      });
    }
 }
}
```
コンポーネントを破棄したときに自動的にイベントリスナーをremoveしてくれるmixinです。
このデモひとつだけならまったく余計ですが、コンポーネントが幾つもある場合、
`addEventListener`と`removeEventListener`に目を光らせずに済むので、少しコーディングが気楽になります。

#コード全文
```html:html
<div id="app">
  <div style="position:relative">
    <button v-on:click.stop="showMenu = !showMenu">Menu</button>
    <dropdown-menu 
          v-if="showMenu"
          v-on:close="showMenu = false"></dropdown-menu>
  </div>
  <p>
    ボタンをクリックするとドロップダウンします
  </p>
</div>

<script type="text/x-template" id="menu-template">
  <div class="menu" style="position:absolute">
  	<div>AAA</div>
    <div>BBB</div>
    <div>CCC</div>
  </div>
</script>
```
```js:js
var listener = {
	methods:{
    listen :function(target, eventType, callback) {
    	if (!this._eventRemovers){
      	this._eventRemovers = [];
      }
      target.addEventListener(eventType, callback);
      this._eventRemovers.push( {
        remove :function() {
          target.removeEventListener(eventType, callback)
        }
      })
  	}
  },
  destroyed:function(){
  	if (this._eventRemovers){
      this._eventRemovers.forEach(function(eventRemover){
        eventRemover.remove();
      });
    }
 }
}

Vue.component('dropdown-menu', {
	mixins:[listener],
  template: '#menu-template',
  created:function(){
    this.listen(window, 'click', function(e){
      if (!this.$el.contains(e.target)){
        this.$emit('close');
      }
    }.bind(this));
  }
});

new Vue({
    el: '#app',
    data: {
        showMenu: false
    }
})

```
1ヶ月後の1ヶ月前は元の日付にならないことがある

Java SE8の日付APIを触っていたらふと思ったので試してみた。重箱の隅をつつくような話。

2016-01-31という日付について、「1ヶ月後の1ヶ月前」「1ヶ月前の1ヶ月後」という演算をそれぞれ施すと結果が異なる。

```java
LocalDate.of(2016, 1, 31).plusMonths(1).minusMonths(1); // 2016-01-29
LocalDate.of(2016, 1, 31).plusMonths(1).minusMonths(1); // 2016-01-31
```

1月と2月では月末の日が異なり（31日と28日）、12月と1月では月末の日が一致するので（どっちも31日）このようなことが起こる。

似たような話でうるう年を利用すると。

```java
LocalDate.of(2016, 2, 29).plusYears(1).minusYears(1); // 2016-02-28
LocalDate.of(2016, 2, 29).plusYears(4).minusYears(4); // 2016-02-29
```

どちらも「n年後のn年前」という演算を施しているが、n=1とn=4では結果が異なる。
Deferred



## Deferred

https://api.jquery.com/jquery.deferred/

Deferredとは「鍵付きのタイムカプセル」

デモ：http://codepen.io/mo4_9/pen/xOBWbx

関数内でDeferredを生成し、
何らかの非同期処理を行ったのち、
Promiseを返すパターン

```javascript:お決まりのパターン|プリロード処理
function preload(url) {
  const defer = $.Deferred(); // Deferredオブジェクト生成
  let loadCount = 0;
  
  for(let val of url) {
    const img = new Image();
    img.src = val;
    img.onload = () => { // 非同期処理
      loadCount += 1;
      console.log(loadCount);
      if(loadCount == url.length) {
        defer.resolve(); // 通信成功
      }
    }
  };
 
  return defer.promise(); // Deferredからpromiseを取り出す
}

const url = [
  'http://placeimg.com/640/360/people',
  'http://placeimg.com/640/360/sepia',
  'http://placeimg.com/640/360/any'
]

const promise = preload(url);

promise.done( () => {
  console.log('all loaded');
})
```

> ※ `$.ajax()`は、それ自体がPromiseを返しているので
`resolve()`する必要はない


## then

https://api.jquery.com/deferred.then/

複数のAjax通信を順番に行いたい場合に便利
thenを使わないと複雑な入れ子構造になる

デモ：http://mo49.tokyo/qiita/20160820/then.html

```javascript:順番にAjax通信を行う
const promise1 = $.get('ajax1.php');
const promise2 = promise1.then( (data) => {
  return $.get('ajax2.php');
});
const promise3 = promise2.then( (data) => {
  return $.get('ajax3.php');
});
promise3.done(function(data) {
  console.log('終了');
});
```

## when

http://api.jquery.com/jQuery.when/
http://www.jquerystudy.info/reference/deferred/when.html

複数のPromiseを結合して、合体したPromiseを返す

デモ：http://mo49.tokyo/qiita/20160820/when.html

```javascript:複数のPromiseを結合する
const promise1 = $.get('ajax1.php');
const promise2 = $.get('ajax2.php');

const promise = $.when(promise1, promise2);
promise.done( onSuccess );
promise.fail( onFailure );

function onSuccess (data1, data2) {
  $txt1.text( data1 );
  $txt2.text( data2 );
  console.log('両方成功');
}
function onFailure (data) {
  console.log('どちらか失敗');
}
```

Promiseの数が定まっていない場合は可変長引数を使う

デモ：http://mo49.tokyo/qiita/20160820/when2.html

```javascript:可変長のPromiseを渡す
let promises = [];

promises.push( $.get('ajax1.php') );
promises.push( $.get('ajax2.php') );
promises.push( $.get('ajax3.php') );

$.when.apply(null, promises).done( (...arg) => {
  for (val of arg) {
    $(document.body).append('<div>'+val+'</div>');
  }
});
```


> 参考
[よく分かる jQuery Deferred](https://www.amazon.co.jp/%E3%82%88%E3%81%8F%E5%88%86%E3%81%8B%E3%82%8B-jQuery-Deferred-%E7%99%BD%E5%B2%A9%E7%99%BB-ebook/dp/B00N2S4L02/ref=sr_1_1?ie=UTF8&qid=1471623911&sr=8-1&keywords=deferred)
[はじめてajaxを使うときに知りたかったこと](http://qiita.com/nekoneko-wanwan/items/bedc0e826c0842ca0b11#deferred%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E7%9B%B4%E5%88%97%E5%87%A6%E7%90%86)
メモ：CSRFフィルターを使っているプロジェクトでファイルアップロード処理を書くときの注意

自分用メモ

#こう書いてはまった
```
@helper.form(action = routes.Uploader.upload, 'enctype -> "multipart/form-data"){
	<input type="file" name="file">
	@helper.CSRF.formField
}
```

#これはOK
```
@helper.form(action = routes.Uploader.upload, 'enctype -> "multipart/form-data"){
	@helper.CSRF.formField
	<input type="file" name="file">
}
```

#何故？
Playはリクエストを読み込むときの最初のバッファ（ディフォルト：100KB）にCSRFトークンがないと安全なリクエストと認識しないらしい
前者のコードのようにファイルデータの後ろに@helper.CSRF.formFieldを付けると、
きちんとトークンを送信しているにもかかわらずInvalid CSRF token found in formのようなエラーが出る

https://groups.google.com/forum/#!topic/play-framework/hKH2EtSqMGk
Python:【継承】サブクラスでスーパークラスのコンスタラクタを再利用する

Python初心者です。
継承について、調べたので備忘録として置いておきます。

## 実行環境
Windows7 64bit
Python 2.7

## 親クラスのコンストラクタの再利用
[クラスについて](http://docs.python.jp/2/tutorial/classes.html)
[スーパークラスの取得](http://uxmilk.jp/15665)

```classTest.py
# -*- coding: utf-8 -*-

class BaseClass(object):    # objectクラスを継承すること

    def __init__(self, a, b):
        self.a = a
        self.b = b

    def sum(self):
        return self.a + self.b

class DerivedClass(BaseClass):

    def __init__(self, a, b):
        # 再利用している
        super(DerivedClass, self).__init__(a, b)

        # スーパークラスのメソッドもここで使える
        print self.sum()

if __name__ == '__main__':

    cls = DerivedClass(10, 5)
    print "sum:" + str(cls.sum())
    print "a:" + str(cls.a)
    print "b:" + str(cls.b)

```

```classTest.pyの出力結果
15
sum:15
a:10
b:5
```

### 説明

DeruvedClass(サブクラス)の__init__()内で

```
super(DerivedClass, self).__init__(a, b)
```

と記述する。
再利用しない場合には、DerivedClassでまた同じコードを書かなければなりません。なので、super()を使い、スーパークラスを取得し、コンストラクタを再利用しています。

また、

```
print self.sum()
```

とすぐに使える（そりゃそうか）
Compassを使ってSassを自動コンパイル


<img src="http://taiyaki-web.sakura.ne.jp/upload/img/Compass_Home___Compass_Documentation_1D685425.png" alt="Compass_Home___Compass_Documentation_1D685425.png"/>
Compass公式サイト [http://compass-style.org/](url 'http://compass-style.org/')

GemでCompassをインストールします。

```
$ gem update --system
$ gem install compass
```
適当なパスに移動して、Compassを使う準備をします。

```
$ cd example/compass #適当なパス
$ compass init
```

生成されたファイルの構成は次のようになっています。

```
/
|-- config.rb #設定ファイル
|-- sass
|   |-- ie.scss
|   |-- print.scss
|   `-- screen.scss
`-- stylesheets
    |-- ie.css
    |-- print.css
    |-- screen.css
```

自動コンパイルするには次のコマンド

```
$ compass watch
```
これでsassディレクトリで保存したSassファイルが自動でコンパイルされるようになります。
Bash on Ubuntu on Windowsで256colorする

2016/09/29 追記:
MinttyでBoUoWできる[wsltty](https://github.com/mintty/wsltty)や[wsl-terminal](https://github.com/goreliu/wsl-terminal)のが最高に便利です

-----

2016/09/24 追記:
[公式が対応してくれる](http://news.mynavi.jp/news/2016/09/23/086/)ようなのでもう要らないと思います

-----

Bash on Ubuntu on Windowsで遊んでいるけど、Linuxで遊ぶのになして未だに16色しかないコマンドプロンプトを使わにゃならんのじゃという気持ちに包まれたので、BoUoWで256colorする方法を模索しました。日本語もちゃんと表示できないし。

Windowsのシェルを通している限り16色からは抜け出せないと思ったので、X serverが使えるならもうX serverを立ててLinuxのターミナルエミュレータを使う以外無いんじゃないか[^1]と思い立った結果。

[^1]: sshサーバーを立ててMinttyからログインする方法とかもありますし、今後公式に対応される可能性も高いです。


## [VcXsrv](https://sourceforge.net/projects/vcxsrv/)のインストール

Windowsで動くX serverです。いくつか試しましたがこれが一番シンプルで安定感ありました。

* MobaXterm: Xサーバーを立ち上げるのに常にフォアグラウンドで起動させていないといけない（通知領域とかに格納できない）
* Xming: ウィンドウのリサイズが謎の挙動をする（ウィンドウを広げるためにドラッグして離すとウィンドウがみょーんと縮む）

僕の誤解が含まれている可能性が多分にありますが、VcXsrvなら誤解する要素も無く起動できたのでおすすめしておきます。

インストールはお好きな方法でどうぞ。僕はChocolateyを使いました。


## [Terminator](http://gnometerminator.blogspot.jp/p/introduction.html)のインストール

ターミナルエミュレータ。いくつか試しましたが、一番すんなりと良い感じに動いたのがこちらでした。タブやウィンドウ分割も使えるし、GUIで設定とかもできるし。

2016/08/26追記: lxterminalの方がもっと良い感じに動きました。依存ライブラリも少ないのでこちらの方が良いと思います。また、xtermの設定に慣れてるならそれが一番依存が少なくて良いと思います。

BoUoW側で

```bash
sudo apt install terminator
```

## ためしに起動

Windows側では普通にVcXsrvを起動。タスクトレイのアイコンにポインタを乗せると`マシン名:0.0`で動いているのが確認できると思うので、BoUoWを起動し、

```bash
$ export DISPLAY=localhost:0.0
$ terminator
```

を叩くとD-BUSがネーヨと怒られつつTerminatorが起動すると思います。エラーダイアログや裏でWARNINGを吐き続けているBoUoWの黙らせ方はわかりません。いろいろ試行錯誤した結果なので、もしまだ何か足りない物があったらごめんちょ。

かなり不安定で、しばしば固まってBoUoWの再起動すらできない状態に陥ることがあります。そうなったら今のところPCを再起動する以外の解決策は見つかっていません。


## `$TERM`を`xterm-256color`にする

Terminatorは何故か`$TERM`を`xterm`にしてしまう（バグらしい？）ので、[この辺](http://askubuntu.com/questions/446076/change-environment-variable-term)を参考に

```bash
[[ $COLORTERM = gnome-terminal ]] && TERM=xterm-256color
```

を`~/.bashrc`のいい感じの場所に書いておきます。


## 日本語フォントのインストール

各自お好みがあると思いますが僕は[Ricty](http://www.rs.tus.ac.jp/yyusa/ricty.html)を使っています。

普通にttfファイルを`~/.local/share/fonts/`以下に置いて`fc-cache`すればOKでした。


## [Material for Terminator](https://github.com/marhs/material-terminator)のインストール

別に必要は無いですが、個人的にPaperColorテーマが好きなのでインストールしました。

READMEに書いてあるとおりに`config`を`~/.config/terminator/config`にコピーするだけ。


## Terminatorの設定

Terminatorのウィンドウを右クリックして「設定」からProfilesの設定でMaterial-darkのフォント等を指定し、もう一度右クリックからの「プロファイル」からMaterial-darkを指定して完成。


## できあがったもの

![terminator.png](https://qiita-image-store.s3.amazonaws.com/0/42867/e73be8ce-56da-4f2c-0e8f-c5584230a2ba.png)

ちゃんと256colorできています。最初にエラーダイアログが出るのは相変わらずですが。

![vim.png](https://qiita-image-store.s3.amazonaws.com/0/42867/34ee42b6-0fff-bd86-9f8f-a9be1ef31eb1.png)

日本語の表示も問題なし。入力は相変わらずできないけど。


## 問題点

いろいろ試しましたが、結局裏でWARNINGを吐き続けているBoUoWのウィンドウは出しておかなければいけないっぽいのが悩みどころ。どうにかして表示させない方法は無いかしら。

何かもっと良いやり方があったら教えて下さい。

あと日本語入力できるやり方があったら教えて下さい。
Scalaの型クラス（typeclass）の分かりやすい説明(Cats公式翻訳)


Haskellの型クラスは知っていたけどScalaの型クラスがよくわからなかったのでググッて調べているうちに、[Cats](http://typelevel.org/cats/typeclasses.html)というScalaライブラリの公式でとてもコンパクトな説明を見つけました。
自分の理解の助けも兼ねて翻訳しました。

##用語の定義

型クラスはもともと関数型言語の概念なので、オブジェクト指向と同じ言葉でも意味が異なることが多いです。
本文を読む際に注意してください。

|用語|意味|本文中の例|
|:-:|:-:|:-:|
|型|データを保持する器。|String|
|型クラス、クラス|ある型に振る舞いを強制する（＝特定の関数の引数になれることを保証する）仕組み。オブジェクト指向のクラスとは別物|Show|
|インスタンス|型クラスによって振る舞いを規定されている型。オブジェクト指向のインスタンスとは別物|Show[String]|


##本文

###型クラス

型クラスパターンとは、ある型に新しい振る舞いを与える方法で、Scalaのあらゆるところに顔を出します。こう言うと、Javaで言うところの"インターフェース"みたいなものだと思うかもしれませんね。例を見てみましょう。

```scala:
/**
 * テキストとして表現する方法を提供する型クラス
 */
trait Show[A] {
  def show(f: A): String
}
```

この型クラスが言わんとしているのは、```Show[A]```型の値は、```A```を```String```に変換する方法を持っているということです。それでは、```A```を```String```に変換する多相的な関数を定義してみます。

```scala:
def log[A](a: A)(implicit s: Show[A]) = println(s.show(a))
```


まだ```Show```インスタンスを定義していない状態で```log```関数を呼ぼうとすると、コンパイルエラーが出ます。


```scala:
scala> log("a string")
<console>:15: error: could not find implicit value for parameter s: Show[String]
       log("a string")
          ^
```


エラーを消すために```String```を```Show```のインスタンスにするのは簡単です。


```scala:
implicit val stringShow = new Show[String] {
  def show(s: String) = s
}
```

これで、```log```の呼び出しが成功しました。

```scala:
scala> log("a string")
a string
```

この例は、型クラスパターンの強力さを物語っています。```Java.lang.String```に新しいインターフェースを実装して振る舞いを増やすことはできません。そこで私たちは、既存の```Java.lang.String```を拡張することなしに```String```に対する```Show```の実装を成し遂げたのです。このパターンは、既存の型に新しい振る舞いを組み込めます。このやり方はよく"アドホック多相"と呼ばれます。

ある型に関しては、別の型の```Show```インスタンスを用意しないとその型の```Show```インスタンスを作れないこともあります。例として、```Option```を```Show```のインスタンスにしてみましょう。

```scala:
implicit def optionShow[A](implicit sa: Show[A]) = new Show[Option[A]] {
  def show(oa: Option[A]): String = oa match {
    case None => "None"
    case Some(a) => "Some("+ sa.show(a) + ")"
  }
}
```

こうして、```Option[String]```や```Option[Option[String]]```に対して```log```を適用できるようになりました。

```scala:
scala> log(Option(Option("hello")))
Some(Some(hello))
```

Scalaは頻出パターンのための糖衣構文を用意しています。

```scala:
def log[A: Show](a: A) = println(implicitly[Show[A]].show(a))
```

これは下のコードと同義です。

```scala:
def log[A](a: A)(implicit s: Show[A]) = println(s.show(a))
```

```A : Show```をパラメータの型に指定すると、暗黙的なパラメータがシグネチャに追加されます(パラメータの名前は私達からはわかりません)。
DockerでさくっとPostgreSQL/MySQL/MariaDBを触る方法


## 事前準備

開発環境のOSにあわせて、Dockerをインストールしてください

* [Installation on Mac OS X](https://docs.docker.com/engine/installation/mac/)
* [Installation on Winsows](https://docs.docker.com/engine/installation/windows/)

## 検証環境

Docker v1.12.0 を利用しています

```bash
$ docker version
                                                                                                                  
Client:
 Version:      1.12.0
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   8eab29e
 Built:        Thu Jul 28 21:15:28 2016
 OS/Arch:      darwin/amd64

Server:
 Version:      1.12.0
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   8eab29e
 Built:        Thu Jul 28 21:15:28 2016
 OS/Arch:      linux/amd64
```

## PostgreSQL（[Official Repository](https://hub.docker.com/_/postgres/)）

```bash
# PostgreSQLコンテナの起動（バージョンは任意）
$ docker run --name postgres -e POSTGRES_PASSWORD=postgres -p 5432:5432 -d postgres:9.5.4

# 接続の際にパスワードを聞かれるのが面倒なので.pgpassを作成
$ echo "*:5432:*:*:postgres" >> ~/.pgpass
$ chmod 600 ~/.pgpass

# brewでさくっとPostgreSQLクライアントをインストール
$ brew install postgres

# PostgreSQLへの接続
$ psql -h localhost -U postgres

# 作業完了したらコンテナを停止
$ docker stop postgres
```

## MySQL（[Official Repository](https://hub.docker.com/_/mysql/)）



```bash
# MySQLコンテナの起動（バージョンは任意）
$ docker run --name mysql -e MYSQL_ROOT_PASSWORD=mysql -p 3306:3306 -d mysql:5.7.14

# brewでさくっとMySQLクライアントをインストール
$ brew install mysql

# MySQLへの接続
$ mysql -h 127.0.0.1 -uroot -pmysql

# 作業完了したらコンテナを停止
$ docker stop mysql
```

#### プチハマりメモ
```mysql -h localhost -uroot -pmysql```で接続しようとしたときに、エラーが出た

```bash
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
```
この辺りの資料がとても参考になった

* [ローカルポートのmysqlに対してTCPで接続する](http://qiita.com/kazegusuri/items/85478e6863453041dd68)
* [MySQLでlocalhostと127.0.0.1の違い](http://qiita.com/TanukiTam/items/f6a08740d0fcda0db7be)


## MariaDB（[Official Repository](https://hub.docker.com/_/mariadb/)）

```bash
# MariaDBコンテナの起動（バージョンは任意）
$ docker run --name mariadb -e MYSQL_ROOT_PASSWORD=mariadb -p 3306:3306 -d mariadb:10.1.16

# MariaDBへの接続
$ mysql -h 127.0.0.1 -uroot -pmariadb

# 作業完了したらコンテナを停止
$ docker stop mariadb
```

## データの永続化をしたい場合
### Data Volume Container を利用することで実現可能。

この辺りの資料がとても参考になります

* [Docker: データボリュームとデータボリュームコンテナ](http://blog.amedama.jp/entry/2016/02/18/011125)
* [DockerとData Volume Containerのお話](http://qiita.com/kxphotographer/items/4788a25d9ebe6a434e46)
* [Docker でデータのポータビリティをあげ永続化しよう](http://qiita.com/mopemope/items/b05ff7f603a5ad74bf55)
python > Link > バーコードの読取り > OpenCVを使用

スマホで二次元バーコードを認識するにはどうすればいいのだろうか。

pythonistaでpython実装する場合、以下が使えるだろうか。

http://www.pyimagesearch.com/2014/11/24/detecting-barcodes-images-python-opencv/

OpenCVを使う時点ですでにややこしそう。

- スマホで画像を取り、PCやMacに送信
- PCやMac上のソフトでOpenCV解析し二次元バーコードを判別する
- PCやMac上でdropbox上のデータベースに接続
- 二次元バーコードに対応する情報を表示
  - PCやMac上でそのまま
  - スマホに情報を戻す

上記だけでも色々課題が出てくる。
OmniMarkupPreviewerでプレビューできない場合の対処法

# 症状
OmniMarkupPreviewerでプレビューするとブラウザに下記のようなエラーが表示される場合の対処法です。Windows10へsublime text3をインストールし、OmniMarkupPreviewerをインストールしていざCtrl+Alt+Oでプレビューしようとすると、起動したブラウザに下記のようなエラーが発生しました。この記事では下記エラーの対処法を記載致します。  

![img.jpg](https://qiita-image-store.s3.amazonaws.com/0/133383/2493301a-ea00-b494-5327-849fd256de40.jpeg)

# 環境

- OS Windows10 Home x64

- Sublime Text3 build 3114 x64

- Syntax Markdown Extended

- OmniMarkupPreviewer v3.0.0

# 対処方法
/Users/ユーザ名/AppData/Roaming/Sublime Text 3/Packages/OmniMarkupPreviewer/OmniMarkupLib/Renderers/libs/にある mdx_strikeout.py の一部を下記のように書き換えるとプレビューできました。ファイルを変更後は一度sublimeを再起動してください。  

変更前

```
def makeExtension(configs=None):
    return StrikeoutExtension(configs=configs)
```

変更後

```
def makeExtension(*args, **kwargs):
    return StrikeoutExtension(*args, **kwargs)
```

[参考サイト](https://github.com/timonwong/OmniMarkupPreviewer/issues/85)

# 経緯
　これまでOmniMarkupPreviewerを起動しようとすると上記のようなエラーが出ていたため、sublimeで書いてプレビューはChromeのエクステンション　Markdown Preview Plusを使っていましたが、utf8で書くと毎回起動時に文字コードをsjisからuft8へ変更しないと文字化けしていたり、編集してはリロードしてプレビューしたりと、昔のTeXのような使い方で使っていました。以前から解決方法を探していたのですが、見つからなかったため自分の環境だけの問題なのかもしれないと思い放置していました。たまたま時間ができましたのでじっくり弄ってみたところ、偶然にも解決に至りました。リアルタイムのプレビューはいいですね。utf8で書いたものも文字化けせずに読めます。  

　まず最初に、エラーで表示されている指示通りserver_portを変えてみるところから始めました。ポート番号を変えても変化はありません。そこで、Sublime Text > Preferences > Package Settings > OmniMarkupPreviewer > Settings-Userの設定ファイルを眺めていると、Rendererという項目に注目しました。エラーの中でunsupported file formatと記載されているところがあったと思い出してこのRender部を弄ってみると「renderer_options-MarkdownRenderer」の「extensions」そのものを消すとプレビューができるようになりました。そこで、デフォルトにあった「"tables", "strikeout", "fenced_code", "codehilite"」を順に消していくと、"strikeout"が原因であることが分かりました。  

　"strikeout"を削除するとプレビューはできるようになったのですが、"strikeout"は取り消し線の表示のため、``~~取り消し線を引きたい~~``と、チルダがそのまま表示されてしまうために見栄えがよろしくありません。そこで、エラーの原因となる箇所が分かったことで検索でより詳細に調べてみたところ、同様の問題を抱えている方がおられることが分かるとともに、具体的な対処方法がありました。上記の対処法は[こちら](https://github.com/timonwong/OmniMarkupPreviewer/issues/85)で議論をされていた内容です。やはり、strikeoutが問題だったようですが、議論にあるように具体的なコードの修正箇所までは到達できませんでした。提示されている対処法の通りにmdx_strikeout.pyを修正したところ、私の環境では取り消し線も問題なく表示されました。この違いは何を意味するのか残念ながら私には分かりません。もしもわかる方がおられましたらご教授いただけますと嬉しいです。海外では上記のような問題の議論があったようですが、国内ではこのような対処法を見つけることができませんでしたのでもしも同様の問題で困っている方がおられるのならこの内容がお役に立てばと投稿しました。
Drupal 本体 (core) を手軽にアップデートする方法

# Drupal core のアップデート
Drupal は管理画面からモジュールのアップデートが可能だが、本体 (core) は管理画面からアップデートできない。
また、コンソールでの作業でも、 `cp` や `mv` などのコマンドは下階層のディレクトリーを上書きできないため、丸ごとまたは1ディレクトリーごとに差し替えるしかない。

しかし、Drush を使うと比較的容易にアップデートが可能になる。
ただし、.htaccess や robots.txt ファイルは上書きされるので注意。当然標準のテーマファイル等も上書きされる。

# Drush による core のアップデート

## バックアップ
```bash
drush ard
```
サイトに含まれる全てのファイルとデータベースをダンプしたファイルが tar.gz 形式に圧縮されて保存される。
バックアップされたファイルは通常 ~/drush-backups/archive-dump フォルダに保存される。
`drush archive-dump` に同じ。

## メンテナンスモード開始
```bash:Drupal7
drush vset --exact maintenance_mode 1
drush cc all
```
```bash:Drupal8
drush sset system.maintenance_mode 1
drush cr
```

## アップデート
```bash
drush up drupal
```
`drush pm-update drupal` に同じ。

## 動作確認

## メンテナンスモード終了
```bash:Drupal7
drush vset --exact maintenance_mode 0
drush cc all
```
```bash:Drupal8
drush sset system.maintenance_mode 0
drush cr
```
Scalaの=>記号の意味が多すぎるのでまとめた


本格的にScalaを勉強し始めたのですが、```=>```という記号の使用される場面が多くて混乱したので、まとめました。

##```=>```記号の意味一覧

 ```=>``` という記号はScalaの色々な場面で使用されます。


* 関数型の表現
* ラムダ式
* パターンマッチ
* 別名でのインポート
	* [@yasudakinenbi](http://qiita.com/yasudakinenbi)さんのご指摘で追加しました
* 引数の名前渡し
* 明示的に型付けされた自己参照(explicitly typed self reference)
	* [@kazzna](http://qiita.com/kazzna)さんのご指摘で追加しました

では、以下でそれぞれの用法を見ていきます。

### 関数型の表現


関数を型として表現するのに使用します。
```(引数の型) => (返り値の型)```という形で使用します。

```scala:
//Intを引数に取りStringを返す関数funcを、引数に取る関数の定義
def someFunc(func: Int => String): Unit = {/*some code*/}
```

ちなみに引数がk個の関数型は、内部的にはFunctionk(0<=k<=22)という名前のTraitとして定義されています。

### ラムダ式

ラムダ式の定義に使います。
```(引数) => (コードブロック)```という形で使用します。

```scala:
//Int型の値を2倍にして返す関数
val double = (a: Int) => { 2 * a }
```

### パターンマッチ

パターンマッチの各ケースと値・処理の紐付けに使用します。
matchブロックの中で、```(ケース) => (処理内容)```の形で使用します。

```scala:
//Option[Int]型の引数に値があればその値を、Noneなら0を返す関数
def getOrZero(x: Option[Int]) = match x {
	case Some(num) 	=> num
	case None		=> 0
}
```

### 別名でのインポート

インポートしたライブラリを別名で使用する場合に使います。
```(ライブラリ名) => (別名)```という形で使用します。

```scala:
# JavaのリストをJListという名前で使用する
import java.util.{List => JList}
```

### 引数の名前渡し

引数の名前渡しに使用します。
名前渡しというのは、型を直接引数に指定するのではなく、引数を1つも取らずその型を返す関数を引数にする方法です。

つまりIntを引数に取る関数を書くのに、以下の様な形ではなく

```scala:
def byValFunc(num: Int) ={/*some code*/}

val result = byValFunc(5)
```

以下のように書くということです。

```scala:
def byNameFunc(numFunc: => Int) ={/*some code*/}

val result = byNameFunc{5}
```

これの何が嬉しいかというと、引数の値の評価を、コンパイル時ではなく実行時に行うことができます。

上の例では何のメリットも感じられませんが、引数の値が非常に計算コストが高く、しかも必ずしも使われるとは限らない場合、パフォーマンス面で威力を発揮します。

###明示的に型付けされた自己参照(explicitly typed self reference)

とても意味深な名前ですが、簡単に言うと「```this```が指し示す型を指定する機能」です。
クラスのコンストラクタで、```self: (指定する型) => ```という形で使用します。

以下に簡単な例を示します。
```Inner```は```Other```と何ら継承関係がないにもかかわらず、```Inner```の内部で```self: Other =>```と宣言しているため、Other型の変数にthisを代入できています。

```scala:
//外部クラス
class Outer {

  //抽象型を宣言
  type Other

  //内部クラス。Otherとは継承関係はないが………
  class Inner {

    //このように宣言すると
    self: Other =>

    //thisがOther型と認識され、コンパイルエラーも起きない！
    val other: Other = this
  }
}
```

この機能は、複雑なクラス構造を構築するときに必要になることがあるようですが、私には高度すぎるので、これ以上詳しいことは```explicitly typed self reference```でぐぐってみてください。

###```=>```は関数リテラルのためにある（……？）

こうまとめてみると、```=>```記号の使用目的は、概して関数リテラルの記述にあるということがわかります。
（パターンマッチの構文も、内部的には関数リテラルの束にすぎないそうです）

最初は色々な用途があって混乱しましたが、実際には統制の取れた糖衣構文であることがわかりました。

###追記
別名でのインポートは、見たところは関数リテラルとは関係なさそうです。実は内部的には関数だったりするのでしょうか？ Scalaの実装に詳しい方、よろしければご教示ください。

###追記の追記
明示的に型付けされた自己参照に関しても、関数リテラルとは余り関係なさそう。
やっぱり、```=>```演算子の役割多すぎませんかね？
直線位置調整 > ユニバーサル基板実装 v0.2 > 直線位置調整できるようになった

### 免責

<font color=red>
以下で実施している事項はプラレールの本来の使い方から外れています（いるような気がします)。
この記事の内容を真似たことによる事故・損害については責任を負いかねます。
</font>

### 動作環境

- ESP-WROOM-02 (以下ESP8266)
- CR123A
- NチャネルMOSFET 2SK4017
  - http://akizukidenshi.com/catalog/g/gI-07597/
- 単三電池 (アルカリ電池)
- TOMY S-12 ドクターイエロー T3編成 (以下S-12)　http://takaratomymall.jp/shop/g/g4904810811756/
- TOMY R-01 レール部品 直線レール
http://www.takaratomy.co.jp/products/plarail/lineup/rail/
- FTDIアダプタ (写真未掲載)
  - http://www.akafugu.jp/ja/posts/products/ftdi-adapter/


![qiita.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/800a420a-27d1-a7b8-a718-e11cbc57209f.jpeg)

ESP8266の下にある3本足のICが2SK4017。

### ユニバーサル基板実装

回路図 
http://qiita.com/7of9/items/c7b778b641927247d313#%E5%9B%9E%E8%B7%AF%E5%9B%B3

## 写真

### ESP8266と2SK4017

ESP8266と2SK4017を実装した写真。ESP8266の右下に2SK4017がある(抵抗の下)。

![qiita.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/825cdbfa-8ba6-4f5b-3f9e-4f5cf0f05bc6.jpeg)


それぞれDIPソケットとストレートピンヘッダを中継して抜き差しできるようにしている。2SK4017が故障時に交換しやすいように。

ユニバーサル基板の台になっているのはシャープの距離センサ。そのうち、このセンサがユニバーサル基板に接続され、本プロジェクトの直線位置調整システムがその距離センサの補正に使われる。

ESP8266の右上のピンヘッダ(6本)にはFTDIアダプタが接続される。

FTDIアダプタ、NチャネルMOSFET、ともに裏表反対にも挿せる。それを防ぐため、正面側はESP8266に向く、というように実装した。

### はんだ面

はんだ面の写真。
左側は前回の基板 ( http://qiita.com/7of9/items/6bcce4bf70154d89c4b5 )。
右側が今回の基板。

![qiita.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/24cb7ab8-4f40-7f08-e212-a3a413f2f293.jpeg)

- 黒 : GND関連
- 青 : GPIO14
- 黄 : プルアップ抵抗につながる線
- 赤 : ESP8266のVCCにつながる
  - 赤1本はFTDI adaptorの通信に使用
- 中段のL型コネクタ(4本ピン) x 2
  - S-12の電池端子に接触させるためのピン
  - 4本ピンはリードで接続した
  - S-12の電池マイナス端子に接触する方は、中央2本のピンを角度を大きくして、電池端子への接触が良くなるようにした

## S-12に装着

S-12の下側部分にユニバーサル基板を乗せた状態。

![qiita.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/8e9862ce-5a64-72e7-b8c3-281b1a43d36f.jpeg)

上の電池がESP8266駆動用。
下の単三電池がモーター駆動用。

装着した状態の側面からの写真。
電池の端子にL型ピンヘッダが接触している。

![qiita.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/9907acec-7359-1548-462f-0f78df7f22a4.jpeg)


## code

以下のコードをそのまま使用。
http://qiita.com/7of9/items/6bcce4bf70154d89c4b5#code-v01

3.3secおきに300msec間モーター駆動用の電池が入る (GPIO14をON)。

## 結果

1回の運転で (300msecのGPIO14 オンで）動いている様子を以下の記事とした。

http://qiita.com/7of9/items/6ef5f50ec6e5aafc727d

## 備考

- スマホS-12駆動システム (夏休みの工作)
  - 直線レールをループレールにする
  - ESP8266のプログラムを作る
  - UnityなりでESP8266に動作コマンドを送るスマホアプリを作る

夏休みの工作にするにしても、Arduino IDEの使い方やFTDIアダプタのセットアップなどは手間かもしれない。

- 電池
  - S-12は従来単二駆動
  - 単三での長期駆動によるトラブルは不明
  - 今回のプロジェクトでは短時間の駆動を目的としている

- 300msec
  - 300msecは思った以上に移動する
  - 30msecなどに減らすのが距離センサ補正にいいかもしれない
  - その場合、トルクはどうなるのだろうか?
未対応のTumblrテーマでGoogle Analyticsを使えるようにする

トラッキングIDも作ったしTumblrのブログに埋め込んでアクセス統計!と思ったら、テーマが対応してなくてトラッキングIDの入力欄がないの…、という時の対処法。

### お題 : Google Analyticsに対応していないテーマを使ったTumblrブログにトラッキングIDを入力できるようにする

解決法の概略は、

**テーマファイルにGoogle Analytics用のタグが埋め込まれていると自動的にテーマ編集画面にトラッキングID入力欄ができるので、テーマファイルを編集すればOK**

です。

#### 編集画面を出す

* ダッシュボードでブログを選択したら「外観の編集」を選択
* 「サイトのテーマ」の「テーマの編集」ボタンを選択

でテーマ編集画面になります。ここで、「テーマオプション」に「Google Analytics ID」があればトラッキングIDを入力して保存して終了しておしまい、なのですが、ない場合はテーマのHTMLファイルをGoogle Analytics対応に書き換えます。

#### テーマのHTMLファイルの書き換え

以下の二カ所にコードを追加します。

&lt;head&gt;〜&lt;/head&gt;内に以下のmetaタグを追加。

```html
<meta name="text:Google Analytics ID" content=""/>
```

次に&lt;body&gt;〜&lt;/body&gt;内(通常末尾でしょう)に以下のmetaタグを追加。

```html
{block:IfGoogleAnalyticsID}
  <script>
    var _gaq=[['_setAccount','{text:Google Analytics ID}'],['_trackPageview']];
    (function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];
      g.src=('https:'==location.protocol?'//ssl':'//www')+'.google-analytics.com/ga.js';
      s.parentNode.insertBefore(g,s)}(document,'script'));
  </script>
{/block:IfGoogleAnalyticsID}
```

「プレビューの更新」を選択するとプレビュー画面が更新されて「保存」ボタンがあらわれるので選択して前画面に戻ります。

以上で、テーマオプションに「Google Analytics ID」が現われるのでトラッキングIDを入力して保存して終了しておしまい。

まあ、テーマにしないならテーマのHTMLファイルに直接トラッキングIDを書き込んだっていいわけですが、テーマがどうできてるかをわかるためにも、という意味で。

#### テーマオプション、Googleについて

さて、上記で何が起こるかなのだが、まず、&lt;head&gt;〜&lt;/head&gt;内に`content=""`(空文字列)になってるmetaタグがあると、そのnameに対応したテーマオプションが表示されるようになり、`{text:Google Analytics ID}`のようにnameを中カッコで括って書いてやるとそこに設定値が代入されるらしい。この機能を使って独自のtextを定義すればいろいろテーマに可変の値を埋め込むことができる。

だが謎なのは、{block:IfGoogleAnalyticsID}〜{/block:IfGoogleAnalyticsID}である。なにを以ってこのブロックを挿入するか否かが決まるのか、現時点で謎。

ちなみにTumblrのHelpで「カスタムHTMLテーマを作成する」というページがあって、テーマオプションについては、[ここ](https://www.tumblr.com/docs/ja/custom_themes#theme-options)、Google Analyticsへの対応方法については[ここ](https://www.tumblr.com/docs/ja/blog_customization)に説明がある。

いつの間にか日本語に訳されていて読みやすいのだが、どうも記述が少なくなってて、上記のタグの説明とかはない。英語のときにはなんとなくあったような気がしていたのだけど英語版のページの行き方がわからず、未確認。

#### TumblrとGoogle Analyticsエトセトラ

せっかくトラッキングIDを設定しても、デフォルトのモバイルテーマを使う設定になっているとモバイルアクセスがAnalyticsから洩れるらしい。これは無効にしておく。