OmniAICreator/Qiita-1.07M huggingface dataset:
メモ: mb_output_handler を 使用していると ob_gzhandler は使えないので注意

## ソース

```php
if (extension_loaded('zlib')) {
	//　ライブラリが存在していたら圧縮する
	ob_start('ob_gzhandler');
}
```

### エラー

> PHP Warning:  ob_start() [<a href='ref.outcontrol'>ref.outcontrol</a>]: output handler 'ob_gzhandler' cannot be used after 'mb_output_handler' in 〜.php


### 原因

```apache:/etc/php/php.ini
; Note: You cannot use both "mb_output_handler" with "ob_iconv_handler"
;   and you cannot use both "ob_gzhandler" and "zlib.output_compression".
; Note: output_handler must be empty if this is set 'On' !!!!
;   Instead you must use zlib.output_handler.
; http://php.net/output-handler
;output_handler =
```

書いてました。


## --with-zlib について

`--with-zlib` オプションを付け忘れたためzlib圧縮が使用不可かと思ったが
`--with-zlib-dir=/usr` を指定していれば利用できました。
Trello のクローン php-simple-kanban を動かしてみた

## 参考

* [Trello のクローンを PHP で作りました - Qiita](http://qiita.com/Web_akira/items/f4a56ccf350c5501a535)

alpine linuxにて確認

```rb
apk add php7-pdo_sqlite

git clone "https://github.com/mikiakira/php-simple-kanban"
chown -R apache:apache php-simple-kanban

cd php-simple-kanban
mv app.template.db app.db

# idiormのインストール
cd class/
wget "https://raw.githubusercontent.com/j4mie/idiorm/master/idiorm.php"
```

```php:config/define.php
<?php
const APP_PASS = 'adminから変更する';
const SESSION_NAME = '適当に変える';
```

表示されることを確認。

![board.png](https://qiita-image-store.s3.amazonaws.com/0/25728/22732a2a-7950-3efd-6d87-0739f025da51.png)

ボード自体の編集はボード名をクリック

![スクリーンショット_2017-02-15_07-21-43.png](https://qiita-image-store.s3.amazonaws.com/0/25728/46da729a-af71-4e17-370e-a88235cad1ce.png)

ことある毎にエラー出たりしますが、これは今後のバージョンアップに期待。

![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/25728/b2ebfc77-f2ce-f8e1-f9f6-58b0d8fca495.png)


```sh:Dockerfile
FROM php:7.1-apache

RUN apt update \
    && apt install -y git \
    && git clone "https://github.com/mikiakira/php-simple-kanban" /var/www/html \
    && cp /var/www/html/app.template.db /var/www/html/app.db \
    && chown -R www-data:www-data /var/www/html

EXPOSE 80
CMD (/etc/init.d/apache2 start && tail -f /var/log/apache2/*log)
```

```rb:docker-compose.yml(作りかけ)
kanban:
  image: tukiyo3/php_simple_kanban
  restart: always
  volumes:
    - ./app.db:/var/www/html/app.db
    - ./config/define.php:/var/www/html/config/define.php
  ports:
    - "80:80"
```
TensorFlow > Error > Skipping cancelled enqueue attempt with queue not closed の対処

### TensorFlow

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
```

TensorFlowを使って、input:100, output:100程度のネットワークの学習をしようかと作業中。

### エラーを発生するコード

test_in.csv, test_out.csvのファイルを用意して、以下を実行してみた。

```learn_in100out100.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import tensorflow as tf
import tensorflow.contrib.slim as slim
import numpy as np

'''
v0.2 Feb. 15, 2017
    - fix bug > different dimensions for placeholder and network
v0.1 Feb. 06, 2017
    - read [test_in.csv],[test_out.csv]
'''

'''
codingrule:PEP8
'''

filename_inp = tf.train.string_input_producer(["test_in.csv"])
filename_out = tf.train.string_input_producer(["test_out.csv"])
NUM_INP_NODE = 100
NUM_OUT_NODE = 100

# parse csv
# a. input node
reader = tf.TextLineReader()
key, value = reader.read(filename_inp)
deflist = [[0.] for idx in range(NUM_INP_NODE)]
input1 = tf.decode_csv(value, record_defaults=deflist)
# b. output node
key, value = reader.read(filename_out)
deflist = [[0.] for idx in range(NUM_OUT_NODE)]
output1 = tf.decode_csv(value, record_defaults=deflist)
# c. pack
# inputs = tf.pack([input1])
inputs = input1
# outputs = tf.pack([output1])
outputs = output1

batch_size = 1
inputs_batch, output_batch = tf.train.shuffle_batch(
    [inputs, outputs], batch_size, capacity=2, min_after_dequeue=batch_size)

input_ph = tf.placeholder("float", [None, 100])
output_ph = tf.placeholder("float", [None, 100])

# network
hiddens = slim.stack(input_ph, slim.fully_connected, [7, 7, 7],
                     activation_fn=tf.nn.sigmoid, scope="hidden")
prediction = slim.fully_connected(
    hiddens, 100, activation_fn=None, scope="output")
loss = tf.contrib.losses.mean_squared_error(prediction, output_ph)

train_op = slim.learning.create_train_op(loss, tf.train.AdamOptimizer(0.001))

init_op = tf.initialize_all_variables()

with tf.Session() as sess:
    coord = tf.train.Coordinator()
    threads = tf.train.start_queue_runners(sess=sess, coord=coord)

    try:
        sess.run(init_op)
        for idx in range(10):
            inpbt, outbt = sess.run([inputs_batch, output_batch])
            _, t_loss = sess.run(
                [train_op, loss],
                feed_dict={input_ph: inpbt, output_ph: outbt})

            if (idx+1) % 100 == 0:
                print("%d,%f" % (idx+1, t_loss))
    finally:
        coord.request_stop()
```

### エラー

> W tensorflow/core/kernels/queue_base.cc:294] _1_input_producer_1: Skipping cancelled enqueue attempt with queue not closed
W tensorflow/core/kernels/queue_base.cc:294] _0_input_producer: Skipping cancelled enqueue attempt with queue not closed


### コード修正

終了処理の`coord.join(threads)`を入れることでエラーが出なくなった。
`as sess`配下の場所に入れた。
技術英語 > [At some bygone time], in some places, set theory was taught in elementary school ... / let bygones be bygones

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 1697 / 12833)

> **At some bygone time**, in some places, set theory was taught in elementary school along with basic mathematics.

意訳 「過ぎ去りし日、いくつかの場所にて、組合せ理論は基礎数学とともに初等学校において教えられていた」

<hr>
関連して思い出したのは

https://www.merriam-webster.com/dictionary/let%20bygones%20be%20bygones
> let bygones be bygones

<hr>
一つ目の文書の後には以下が続く

> If your school skipped it (or covered it and you were staring out the window  as I often did), Figure 3-1 shows the ideas of union and intersection.

「風邪で休んでいた」以外にも**それ**があったか。
CentOS6.8（32Bit）にMySQlとphpMyAdminをインストールする

# はじめに
　MySQLをCentOS6.8（32Bitマシン）にインストールするために、MySQLの公式サイトでダウンロードURLを確認する。
http://dev.mysql.com/downloads/mysql/#downloads
5.6.35が利用可能なようだ。(2017/2/23現在）
##１.　server, client, devel をダウンロード
 ~]# wget http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-server-5.6.35-1.linux_glibc2.5.i386.rpm
 ~]# wget http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-client-5.6.35-1.linux_glibc2.5.i386.rpm
 ~]# wget http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-devel-5.6.35-1.linux_glibc2.5.i386.rpm

~]# ls
MySQL-client-5.6.35-1.linux_glibc2.5.i386.rpm
MySQL-devel-5.6.35-1.linux_glibc2.5.i386.rpm
MySQL-server-5.6.35-1.linux_glibc2.5.i386.rpm

## ２．MySQLのインストール
 ~]# rpm -ivh MySQL-server-5.6.35-1.linux_glibc2.5.i386.rpm
準備中...                ########################################### [100%]
	ファイル /etc/init.d/mysql (パッケージ MySQL-server-5.6.35-1.linux_glibc2.5.i386 から) は、パッケージ MySQL-server-5.6.5_m8-1.linux2.6.i386 からのファイルと競合しています。
	ファイル /usr/bin/innochecksum (パッケージ MySQL-server-5.6.35-1.linux_glibc2.5.i386 から) は、パッケージ MySQL-server-5.6.5_m8-1.linux2.6.i386 からのファイルと競合しています。
	ファイル /usr/bin/my_print_defaults (パッケージ MySQL-server-5.6.35-1.linux_glibc2.5.i386 から) は、パッケージ MySQL-server-5.6.5_m8-1.linux2.6.i386 からのファイルと競合しています。
	ファイル /usr/bin/myisam_ftdump (パッケージ MySQL-server-5.6.35-1.linux_glibc2.5.i386 から) は、パッケージ MySQL-server-5.6.5_m8-1.linux2.6.i386 からのファイルと競合しています。

異なるバージョンのrpmファイルと競合しているのでこれを削除する。
]# rpm -e MySQL-server-5.6.5_m8-1.linux2.6.i386

~]# rpm -ivh MySQL-server-5.6.35-1.linux_glibc2.5.i386.rpm
準備中...                ########################################### [100%]
   1:MySQL-server           ########################################### [100%]
~]# rpm -ivh MySQL-client-5.6.35-1.linux_glibc2.5.i386.rpm
準備中...                ########################################### [100%]
   1:MySQL-client           ########################################### [100%]
~]# rpm -ivh MySQL-devel-5.6.35-1.linux_glibc2.5.i386.rpm
準備中...                ########################################### [100%]
   1:MySQL-devel            ########################################### [100%]
~]# yum list installed | grep MySQL
MySQL-client.i386       5.6.35-1.linux_glibc2.5
MySQL-devel.i386        5.6.35-1.linux_glibc2.5
MySQL-server.i386       5.6.35-1.linux_glibc2.5
 ~]# mysql --version
mysql  Ver 14.14 Distrib 5.6.35, for Linux (i686) using  EditLine wrapper

##３．　MySQLの初期設定

**強調**
railsのJSをES6にしたい。

## やりたきこと
タイトル通り。
今のチームのフロントエンドのJS環境は、こんなけwebpack,ES6とか言われてるのにフロントのビルドツールを使っていない。
現状は自分たちで書くjsのライブラリはfunctionでクラスで作っている。ES5で。
厳密にはクラスではないが、まーいーや。敢えて。
こんな感じ

```js
person.js
//クラス
Person = function(name, age) {
  this.name = name;
  this.age = age;
};
//継承
Person.prototype.getName = function() {
  return this.name;
};
//継承
Person.prototype.sayHello = function() {
  console.log('Hello I\'m ' + this.getName());
};
```

で、上のファイル(person.js)を下の別ファイル(application.js)から呼び出し、インスタンス化。
(ファイルは分割したまま書く。
railsでモジュール管理している。で、アセットパイプラインでbunleしてもらう。)
こんな感じ。

```js

application.js
//newでインスタンス化
var John = new Person('John Frusciante');
//メソッド呼び出し
John.sayHello();//Hello I'm John Frusciante
```

**あー、ES6のClass構文使いたい。まずは使いたい。仕事で使いたい！！**

こんな感じに書きたい。  

```js
//person.js

//クラス
class Person {
    constructor(name) {
        this.name = name;
    }
}
//エクスポート
export default Person;
```

```js

//インポート
import Person from './person';
//継承
class Friend extends Person{
    constructor(name) {
      super(name);
    }
    sayHello() {
    	console.log('Hello I\'m ' + this.name);
    }
}
//インスタンス化
var John = new Friend('John Frusciante');
//メソッド実行
John.sayHello();//Hello I'm John Frusciante
```



## 現状のビルドはrailsで ##

railsにはJS,CSSの圧縮や連結、scssのコンパイルもやってくれたりするし、モジュールの分割もできるアセットパイプラインっていう便利な機能があるので、ビルドはrailsでやってる状態。
でもなー、これだとなー、フロントの新しい技術使われへんなー、ES6とかで書いてwebpackでbundleしてえ、と思ったのがきっかけ。

アセットパイプラインやとjsならjs,scssならコンパイルされたcssがぜ〜んぶ一行に連結されて出力される、デメリットも当然あるけど。

## で、方針
なるべくrailsのアセットパイプラインと仲良くする。(いきなりアセットパイプラインの機能のメリットから完全分離はしない。)
railsの機能で使えるところは使い、分離できるとこは分離する。ってのが方針。で、先人さんたちのサイトを参考にしました。

## 参考にしたサイト
ES6をrailsで書いてる。でももうちょっとSprocketsと仲良くしたまま移行したいっす。
参考になりました！
[webpackで作るSprockets無しのフロントエンド開発](http://engineer.crowdworks.jp/entry/2016/05/24/174511)
[Rails + モダンJS環境(Webpack)で新規アプリ作成](http://qiita.com/UFO/items/3c4e6a323e86c0c64e04)

やりたきことはこんな感じ。でもbrowserifyとbabelifyではなく、webpackとbabelのローダーでes6をbundleして変換したい。
でもめっちゃ参考にしました！
[モダンJavaScript開発環境 on Rails](http://techlife.cookpad.com/entry/2015/12/14/130041)

ディレクトリ構造が構想通り。それから完全に分離できればと思います！
だいぶ参考にしました!
[WebPackを使ってRailsからJavaScriptを楽に良い感じに分離する](http://qiita.com/necojackarc/items/afa674ab10aafa9784eb)

## で、、、、

色々参考にして自分で作ったリポジトリ
<a href="https://github.com/nishidashib/rails-webpack--sprockets">https://github.com/nishidashib/rails-webpack--sprockets</a>
あ、rubyのバージョンは2.2.3を使用しています。
rbenvとかruby-buildとかインストールしてrubyのバージョンを2.2.3にしてください。
自分の環境では動きました。動かんかったらググってみてください。

自分の勉強にもなるので、ちょくちょく更新します。
クドいけどES6を今のチームでも使いたいーーーー。
ではでは。
GitHubやGitLabに登録したSSH Keyは簡単に参照できる

# GitHub
`https://github.com/{USER}.keys`

# GitLab
`https://{GITLAB_URI}/{USER}.keys`

# まとめ
* `https://github.com/{USER}.keys`へアクセスするとGitHubに登録している公開鍵が取得できる
* サーバセットアップなどで、公開鍵を登録するとき、`curl https://github.com/{USER}.keys -o ~/.ssh/authorized_keys` とすると簡単に鍵を登録できる
英数字からなる雑な乱数を生成するコマンド

拾い物のスクリプトで使われていた乱数生成コマンドのメモです。雑な乱数なので重要なパスワードとかには使わないほうがいいかも・・

#### Command

```
strings /dev/urandom | grep -o '[[:alnum:]]' | head -n 8 | tr -d '\n'; echo
```

`strings /dev/urandom`: 雑な乱数デバイスから表示可能な文字列の抽出
`grep -o '[[:alnum:]]'`: 英数字の抽出
`head -n #{num}`: 先頭n行の抽出
`tr -d '\n'`: 改行コードの削除

#### result

```
BA7GlWgm
```

デバイスに`/dev/random`を使うと待たされるのであまり使えないです

Ansibleに埋め込んで使おうとしたけど、Ansibleで使うとエラー出た

---

追記: コメントで簡略版教えていただきました

#### Command

```
tr -dc A-Za-z0-9_ < /dev/urandom | head -c 8
```

#### result

```
PU29HCyu
```
【Unity】モデル全体の色をスクリプトから変更する

Unityで使用されているモデル全体の色をスクリプトから変更します。
色を変更したいモデルにアタッチして以下のコードの
```
    // モデルのマテリアルの色を変更する
    public void ColorChange(Color color)
```
を呼び出してあげてください。

```C#:ModelColorChange.cs
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class ModelColorChange : MonoBehaviour
{

    // モデルのマテリアルの色を変更する
    public void ColorChange(Color color)
    {
        Renderer[] renderers = gameObject.GetComponentsInChildren<Renderer>();

        foreach(Renderer renderer in renderers)
        {
            renderer.material.color = color;
        }
    }

}
```
PowerShellでファイルにリダイレクトしたときに勝手に改行される場合の対処

PowerShellでリダイレクトを使ってファイル出力すると、一定の長さ(PowerShellの画面バッファーの設定に依存するようです)で改行されてしまう。

例えば、テキストをフィルタリングして、別のファイルに書き出す次のようなコマンドを実行すると、sample_out.txtでは、長い行が勝手に改行されてしまっている。

```shell-session
cat .\sample.txt | sls hoge > sample_out.txt
```

この問題は、以下のようにOut-Fileコマンドレットを使うと解消できる(※1000は十分に大きな数)。

```shell-session
cat .\sample.txt | sls hoge | Out-file -filepath sample_out.txt -width 1000
```

(なんでリダイレクトしたいだけなのに、こんな長いコマンドを書かないといけないの・・・)

### 追記
コメントで教えて頂きました。
slsの返すMicrosoft.PowerShell.Commands.MatchInfoのリダイレクトが問題の原因であるため、

```shell-session
(type sample.txt | sls hoge).ToString() > sample_out.txt
```

または

```shell-session
type sample.txt | sls hoge | % { $_.ToString() } > sample_out.txt
```

と書いても良いようです。
こちらの方が `-width 1000` のような固定値が入らない分、スマートですね。
ForwardProxy(Apache)

#目的
・apache(httpd)でWebProxy(ForwardProxy)を作成する
・URLベースのWhiteList制御が行えるか確認する（動作確認中）

#httpd

```
# yum install httpd
```

バージョン

```
# httpd -v
Server version: Apache/2.2.31 (Unix)
Server built:   Jul 19 2016 00:11:31
````
モジュールの確認
（まずはProxyを作りたい。だいたい揃っていそう。デフォで読む感じになっている）

```
# cat  /etc/httpd/conf/httpd.conf  | grep -e proxy_module -e proxy_ftp_module -e proxy_connect_module
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
```

```
Listen 8080
<IfModule proxy_module>
    ProxyRequests On
    ProxyVia On
 
    CustomLog logs/proxy_log combined
    <Proxy *>
        Order deny,allow
        Deny from all
        Allow from {対象のセグメントのCIDRとか}
    </Proxy>
</IfModule>
```

クライアント側の設定

```
cat << _EOF_ >>~/.bash_profile
export HTTP_PROXY=プロキシサーバのIP:Port
export http_proxy=プロキシサーバのIP:Port
export HTTPS_PROXY=プロキシサーバのIP:Port
export https_proxy=プロキシサーバのIP:Port
_EOF_
```

PROXYとして動作OK


```
# wget http://google.co.jp
--2017-02-14 14:55:02--  http://google.co.jp/
Connecting to XX.XX.XX.XX:8080... connected.
Proxy request sent, awaiting response... 301 Moved Permanently
Location: http://www.google.co.jp/ [following]
--2017-02-14 14:55:02--  http://www.google.co.jp/
Connecting to XX.XX.XX.XX:8080... connected.
Proxy request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: ‘index.html.1’

index.html.1                                         [ <=>                                                                                                    ]  10.72K  --.-KB/s    in 0s      

2017-02-14 14:55:02 (186 MB/s) - ‘index.html.1’ saved [10975]
```


・WhiteList(整理中）


```
Listen 8080
          
<IfModule proxy_module>
    ProxyRequests On
    ProxyVia On
    RewriteEngine On
 
    CustomLog logs/proxy_log combined
    <Proxy *>
        Order deny,allow
        Deny from all
        Allow from XX.X.X.
    
#        RewriteCond %{REMOTE_HOST} !^http://google.co.jp [NC]
#        RewriteCond %{REQUEST_URI} !^http://google\.co\.jp/ [NC]
        RewriteCond %{QUERY_STRING} !^http://google\.co\.jp/ [NC]
        RewriteRule ^ http://www.example.com/ [R] 
    </Proxy> 
</IfModule>
```

→www.example.comに行ってしまう。。。。
【Tips】SQLiteでbulk insert〜Androidバージョン

したいよね。
ってゆーかbulk insert必要ないならsqlite使う必要もないんじゃないかと私は思うわけですが。

はい、こうなる。beginTransaction/setTransactionSuccessful/endTransaction使うだけですね。簡単。
setTransactionSuccessfulせずにendTransactionするとロールバックしてくれるらしいよ！

```Java:ばるくいんさーと
try {
    db.beginTransaction();

    final ContentValues values1 = new ContentValues();
    values1.put("id", 1);
    values1.put("name", "akippa駐車場1");
    db.insert("parking", null, value1);

    final ContentValues values2 = new ContentValues();
    values2.put("id", 2);
    values2.put("name", "akippa駐車場2");
    db.insert("parking", null, value2);

    final ContentValues values3 = new ContentValues();
    values3.put("id", 3);
    values3.put("name", "akippa駐車場3");
    db.insert("parking", null, value3);

    db.setTransactionSuccessful();
} finally {
    db.endTransaction();
    db.close();
}
```

ちなみにSQLで書く場合はこうなるらしいよ。
transactionのほうが早いって書いてあったり、SQLのほうが早いって書いてあったり、よくわからんよ。
でもロールバックできるし、デバッグしやすいし、transactionのほうがいいね。

```SQL:SQLで書く場合
INSERT INTO parking
    SELECT 1, 'akippa駐車場1'
    UNION ALL SELECT 2, 'akippa駐車場2'
    UNION ALL SELECT 3, 'akippa駐車場3';
```
PowerShell で Windows のパフォーマンスを観察しながらログに残す

# はじめに

この記事では PowerShell を使って Windows OS のパフォーマンスを観察しながらログに残す方法をまとめます。

パフォーマンスをログに残すためには「パフォーマンスモニター」を使う方法が現実的だと思います。ただ、パフォーマンスモニターはデータコレクタセットを定義する必要があったり、ログがバイナリだったりで「ちょっと調べたい」ときには使い勝手が悪いです。一方で、タスクマネージャを使うとパフォーマンスの概要はすぐに把握できるのですが、ログに残すことができません。

そういうわけで、いつものように PowerShell のコマンドコピペで解決できないか検討してみました。

# 方法

PowerShell の `Get-Counter` コマンドレットを使います。`Get-Counter` コマンドレットは PowerShell v3 以降で使用できます。

カウンタのパス（名前）はいつも忘れてしまうので、調べ方を覚えておくと便利です。以下のようにします。

```ps1:PowerShell
PS1 > # 対象のカウンタの目星が付いてない場合は
PS1 > # とりあえず全てのカウンタを表示して Description を眺めてみる。
PS1 > Get-Counter -ListSet *
PS1 > 
PS1 > # 例えばメモリについて知りたいとき
PS1 > # 以下のようにしてメモリに関するカウンタを一覧します
PS1 > Get-Counter -ListSet Memory | Select-Object -ExpandProperty Paths
\Memory\Page Faults/sec
\Memory\Available Bytes
\Memory\Committed Bytes
\Memory\Commit Limit
\Memory\Write Copies/sec
\Memory\Transition Faults/sec
\Memory\Cache Faults/sec
\Memory\Demand Zero Faults/sec
\Memory\Pages/sec
...
```

# コマンド

以下のコマンドを PowerShell コンソールにコピペすると、カレントディレクトリにログが出力されます。ログの採取を停止するには `Ctrl+C` を押下します。

```ps1
$counters = "\Processor(_total)\% processor time", "\Memory\available bytes"
Get-Counter -Counter $counters -Continuous | % {
    $p = New-Object PSObject | Add-Member -PassThru NoteProperty TimeStamp $_.TimeStamp
    $_.CounterSamples | % { $p | Add-Member NoteProperty $_.Path $_.CookedValue }
    $p
} | ConvertTo-CSV -NTI | Out-File Perf.csv
```

ログの採取状況を見るには、新しく PowerShell を起動して、以下のコマンドを実行します。

```ps1
PS1 > cat .\Perf.csv -wait | ConvertFrom-Csv
```

# おわりに

ログの採取状況を見ているとログが残っていることが分かって安心なのですが、普通にタスクマネージャを見ている方がパフォーマンスの変化は分かりやすいです。常に前面に表示できるし。
SotaでHTTP通信をする

SotaでVstoneMagicを使ってHTTP通信をする場合、HTTP通信ブロックというものは無いので、以下の2つ方法が考えられる。

1. VstoneMagicでsotaライブラリのHttpHelperクラスのHttpProcメソッドを使用する
1. JavaでHTTP通信処理を書いてjarにし、VstoneMagicにインポートして呼び出す

2の方は自分で好きなライブラリ(僕の場合はOkHttp3)を使えばいいと思う。
1の方は標準ライブラリだが、あまり情報がないので、どう使うのかを紹介しようと思う。

説明用にGoogle Translate APIを使用したが、Google Translate APIの仕様については、今回は説明しない。
[公式ドキュメント](https://cloud.google.com/translate/docs/getting-started?hl=ja)参照。

環境はいつも通り。

|対象|OS、バージョン|
|:--|:--|
|PC|Windows10 x64|
|Sota|1.6.0|
|VstoneMagic|1.0.6156.22367(VstoneMagic_update20170126)|
|VstoneMagicのSotaライブラリ|1.6.0|

# VstoneMagicでの今回の構成
レスポンスコードと発話用テキストの変数ブロックと、HTTP通信処理を記述する自由記述ブロック、レスポンスコードを見て処理を分けるためのifブロック、発話用テキストを発話する発話ブロックの構成にした。
![000.PNG](https://qiita-image-store.s3.amazonaws.com/0/141310/9c8d23c0-e6ab-7bcc-13de-6feb2a2dd829.png)


# HTTP通信処理
最初にも書いたが、HTTP通信ブロックというものは無いため、HTTP通信処理は自由記述ブロックに書いていく。
Google Translate APIを使って、getする場合、以下のようになる。
TranslatedクラスはAPI仕様に基づいて自分で作成した、パース用クラスになる。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/141310/6ae98db1-71d7-b39f-b0e4-8fc94218085b.png)


```java
// 日本語から英語に翻訳するURL
String baseUrl = "https://www.googleapis.com/language/translate/v2?key=(キー)&source=ja&target=en&q=";

// 翻訳する単語を足し込む
String url = baseUrl  + "こんにちは。よろしくね。";
// SSLを使用するかどうか
boolean isSsl = true;

// get用のHTTPリクエストオブジェクトを生成する
HttpRequest request = HttpRequest.createGet(url, isSsl);
// リクエストを投げる
HttpResponse response = HttpHelper.HttpProc(request);

// レスポンスコードはresponseCodeに格納されている
code = response.responseCode;
if(response.responseBody != null){
    // ボディはresponseBodyに格納されている。バイト配列なのでStringに変換
    String body = new String(response.responseBody);

    // jsonをパース
    Gson gson = new Gson();
    Translated trans = gson.fromJson(body, Translated.class);
    text = trans.data.translations[0].translatedText;
}
```


もし、何かのjsonをpostする場合は、以下のようになる。

```java
// postするURL
String url = "https://xxx";
// SSLを使用するかどうか
boolean isSsl = true;
// レスポンスを受けるかどうか
boolean receivedResponse = true;
// タイムアウト(ms)
int timeoutMs = 30000;
// postするjson文字列
String postJson = "{\"value\":\"sample value\"}";

// post用のHTTPリクエストオブジェクトを生成する
HttpRequest request = HttpRequest.createPostJson(url, isSsl, receivedResponse, timeoutMs, postJson);
// リクエストを投げる
HttpResponse response = HttpHelper.HttpProc(request);
```

# インポート文の追加
HTTP通信処理を自由記述ブロックに書き、そのままビルドすると、以下のようにエラーが発生する。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/141310/9c382b77-38fc-5b28-14d5-6d37b1458739.png)

原因は、HttpRequestクラスやGsonクラスのパッケージ名がimport文で追加されていないため。
VstoneMagicでimport文を追加するには、追加するクラスを選択し、プロパティの「Import」項目をダブルクリックする。
![003_2.PNG](https://qiita-image-store.s3.amazonaws.com/0/141310/0023a21e-fcdc-96cc-5558-f5a20eec8189.png)

開いたダイアログに追加するパッケージ名を記載し、OKボタンを押下する。
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/141310/5af2282a-77d2-3ed0-f103-c86f708e62f3.png)

これでビルドするとエラーが解消されていると思う。


今回作成したHTTP通信用サンプルプログラムは[GitHub](https://github.com/scarviz/HttpRequestSample)にあげた。
Chainer v1.21がリリースされました

#Released Chainer v1.21.0!

[公式Twitter](https://twitter.com/ChainerOfficial?ref_src=twsrc%5Etfw)より。

#New features
- Chainerの機能追加が6件
- CuPyの機能追加が10件
- Python3.6対応
- NumPy1.12対応

#Bug fixes
- 計13件のBugFix (ざっと見たところ、重大なものは少なそう)

#Improvements
- 処理性能の改善が14件 (今回リリースの目玉はたぶんココ)
- その他に5件の機能強化

#Others
- ドキュメントやExamplesの追加修正が計9件

#Release note
[こちら](https://github.com/pfnet/chainer/releases)からどうぞ。

#独り言
[こちら](http://qiita.com/TokyoMickey/items/e4d338ac9b2b4d5db153)の記事で**近日リリース予定**のChainer2.0に触れさせて頂きましたが、Chainer1.22とどちらが先にリリースされるでしょうか...

どちらも楽しみですね。

#追記
[開発されている方がTweetされていました](https://twitter.com/unnonouno/status/831513082409070592)

>Chainer v1.21.0は地味な改良を加えて，特にconcatenateが手元のテストで15倍，splitが2倍くらい速くなり，NLP系タスクのボトルネックが一部解消されます．

[さらに](https://twitter.com/unnonouno/status/831513320037326850)
>あ，Chainer分のオーバーヘッド（Variableの生成コスト）があるので，cupy単体だともっとはやくなっているのか．


ベンチマークしたくなってきました。
公開鍵認証を使ってmacからサーバへ接続する方法


## 公開鍵の配置場所を作成

### サーバで作業

* 公開鍵を配置するディレクトリを作成

	``` bash:terminal
	mkdir ~/.ssh
	chmod 700 ~/.ssh
	```

## 公開鍵を作成

### macで作業
* 公開鍵作成
	
	```bash:terminal
	ssh-keygen -t rsa
	
	Generating public/private rsa key pair.
	Enter file in which to save the key (/Users/(ユーザー名)/.ssh/id_rsa):
	Overwrite (y/n)?
	Enter passphrase (empty for no passphrase):
	Enter same passphrase again:
	Your identification has been saved in /Users/(ユーザー名)/.ssh/id_rsa.
	Your public key has been saved in /Users/(ユーザー名)/.ssh/id_rsa.pub.
	The key fingerprint is:
	(key fingerprint表示)
	The key's randomart image is:
	(key's randomart image表示)
	```
	
* 作成した公開鍵の権限を変更
	
	```bash:terminal
	chmod 600 ~/.ssh/id_rsa.pub
	```

## 公開鍵を配置

### macで作業

* 作成した公開鍵をサーバへ配置

	```bash:terminal
	scp ~/.ssh/id_rsa.pub <username>@<hostname>:~/.ssh/authorized_keys
	```
game engine Defoldのまとめ

　最近さわり始めた[game engine Defold](http://www.defold.com/)のapiの使い方などについて随時まとめていきます。基本的に自分がゲームを作っていく中で気付いたこと順です。
　公式のtutorialはやって、GameObjectやatlasといった基本的な名称については分かっていること前提です。

# キー入力の取り方

## input bindingの設定
 まずデバイスからの入力に対するアクションの定義をgame.input_bindingに行う。
Input Binding > key_triggerに入力の種類ごとにinput,actionを定義していく。inputはキーの種類（KEY_SPACEなど）。actionはキーを入力したときに発行されるidになるので、一意な名前をつける。jump, shotなど。

## input focusするgame objectへのコーディング

 キー入力を受け取るgame objectに紐付けたscriptのinit（で、なくてもいいのだが）に以下のコードを記載する。

```lua
function init(self)
    -- acquire input focus as soon as the instance has been initialized
    msg.post(".", "acquire_input_focus")
end
```

　コメントに書いてある通りなのだが、'acquire_input_focus'をpostされたgame object（"."はcurrent game object）がキー入力を補足するgame objectとなる。
　acquire_input_focusをpostしたgame objectは、定義されたキー入力があった場合にon_input()が呼び出される。
　on_input()には入力されたキーに対応したaction_id（input bindingでキーのactionに設定した文字列）で呼び出されるので、キー入力のaction_idごとに実行するコードを記載する。

```lua
function on_input(self, action_id, action)
    if action_id == hash("jump") then
        -- jumpの時に実行
    end
end
```

　msg.postについて⇒[Defold - API REFERENCE -: msg.post](http://www.defold.com/ref/msg/#msg.post:receiver-message_id--message-)
　acquire_input_focusについて⇒[Defold - API REFERENCE - : acquire_input_focus](http://www.defold.com/ref/go/#acquire_input_focus)
【Rails5, Rspec】Deviseによる認証ありのAPIテスト

Rspec、特にrequest specにdevise認証判定を持たせたいときの記事です。

先人の方々が記事にはしてくれているのですが、Rails5になったりDeviseにもアップデートがあったりでいくらかは有益そうだったこと＋自分の勉強のためにここに記します。

動いてみると当たり前ではありますが、冷静になってドキュメントを読まないと痛い目をみますね。

# 動作環境

rails 5.0.1
rspec 3.5.x
devise 4.2.0

# RspecのIntegrationTest事情 with Devise
request specが結合テストに用いられるという記述や、capybaraが少し前までrequest spec推奨だったことなどから複雑に考えてしまいました。

[RelishのRspecの項目](https://www.relishapp.com/rspec/rspec-rails/docs/request-specs/request-spec)とか[公式のWikiのIntegrationTestの項目](https://github.com/plataformatec/devise/wiki/How-To:-Test-with-Capybara)に以下のように記載がありました。

- request specはRailsの統合テストについてのthinラッパーを提供する

> Request specs provide a thin wrapper around Rails' integration tests, and are
designed to drive behavior through the full stack, including routing
(provided by Rails) and without stubbing (that's up to you).

- capybaraを用いた結合テストには`Devise::Test::IntegrationHelpers`ではなく`Warden::Test::Helpers`を用いる

>To do this, you'll need to include warden test helpers and turn on test mode.


ということでrequest specの場合DeviseのTestHelperは使えず、`Warden::Test::Helpers`にある`login_as`を利用することになるかと思ったのですが、capybaraとか使ってない普通のAPIのテストであれば`Devise::Test::IntegrationHelpers`にある`sign_in`で対応可能でした。

# 実装
deviseのインストールやcontrollerへの権限設定は済んでいるものとしてrspec周りについて記します、また認証はuserモデルに付与しているものとしてください。テストデータはfactory girlで作ってます。

特に大きいmoduleでもないのですが、そのうち使いまわせるようになるという期待も込めてsupport以下にAuthenticattionMacrosとしてモジュール化しました。

```support/authentication_macros.rb
module AuthenticationMacros
  def login
    let(:user) { build(:user) }
    before do
      sign_in user
    end 
  end
end
```

rails_helper.rbでヘルパーとモジュールの読み込み等を行います。

```rails_helper.rb
#中略
require 'devise'
Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }
#中略
RSpec.configure do |config|
  config.include Devise::Test::IntegrationHelpers, type: :request
  config.extend AuthenticationMacros
#中略
```

最後に認証がかかったAPIに対するリクエストスペックです。

```requests/pages_request_spec.rb
require 'rails_helper'

RSpec.describe 'Pages', type: :request do
  describe 'GET #index' do
    context 'with authentication' do
      login
      it 'return success status' do
        get '/pages'
        expect(response).to have_http_status(:success)
      end
    end
    context 'without authentication' do
      it 'return fail status' do
        get '/pages'
        expect(response).to have_http_status(302)
      end
    end
  end
end
```

# 所感
テストコードも肥大化してくると書くのが楽しくなりそうだなと思いました。
[GitHub](https://github.com/sdsd08013/api_authentication_spec)にコードを置いておいたので参考までにどうぞ！
Web API のステータスコードは何を返したらいい?って時に見るダイアグラム


<p><strong>This infographic was created by <a href="https://www.loggly.com/blog/http-status-code-diagram/">Loggly</a>.</strong></p>
<p><a href='https://www.loggly.com/blog/http-status-code-diagram/'><img src='https://www.loggly.com/wp-content/uploads/2015/06/http-decision-diagram.png' alt='HTTP Status Code Diagram' width='600px' border='0' /></a></p>
<p>
Swift：UIColorを16進数カラーコードで初期化する

# 背景

UIColorはredとかblueとかが初めから用意されていたり、RGBで色を指定することができる。しかしWEB開発経験者としてはカラーコードで色指定できるととても楽だし便利。ということで16進数カラーコードでUIColorを初期化する方法をまとめる。

## ソースコード（2019/6/17 修正 Swift5 対応版）

```swift
import UIKit

extension UIColor {
    convenience init(hex: String, alpha: CGFloat = 1.0) {
        let v = Int("000000" + hex, radix: 16) ?? 0
        let r = CGFloat(v / Int(powf(256, 2)) % 256) / 255
        let g = CGFloat(v / Int(powf(256, 1)) % 256) / 255
        let b = CGFloat(v / Int(powf(256, 0)) % 256) / 255
        self.init(red: r, green: g, blue: b, alpha: min(max(alpha, 0), 1))
    }
}
```

# 使い方

上のソースコードをUIColorHex.swiftなど適当な名前をつけてプロジェクトファイルに突っ込めば準備OK
あとは
`hogeView.backgroundColor = UIColor(hex: "FF00FF", alpha: 0.7)`
`hogeView.backgroundColor = UIColor(hex: "FF00FF")`
こんな感じにするだけ。どこでも使える。

## 備考

UIColorをNSColorにするだけでmacOS向けアプリ開発にも利用可能。
Messaging APIの各プランまとめ：個人利用で最適なプランとは？

（これもよろしく）↓
LINEでゲームブックが楽しめるbotを開発しました
http://qiita.com/line_gamebook/items/596728c615cbfd2873cf

# はじめに
LINE BOT AWARDSの締め切りが迫るなか、個性的なBOTが続々と登場しています。僕も、ゲームブックの醍醐味を味わえるBOT（言い過ぎ？）を作りましたが、他の人のキラリと光るBOTを見ると「なるほど、こういう使い方もあるのか」と感心させられるものです。

さて、BOTを作るに当たって少し悩むことがあります。それは「どのプランを契約すればいいのか」という問題です。[LINEのサイト](https://business.line.me/ja/services/bot)をみると、Developer Trialとフリーの2つの無料プランが用意されていますが、BOTを作るうえで制約が無いかなというのも気になるところです。

そこで、今回は「個人ユーザーがBOTを作るのに最適なプランは何か」という観点で、各プランをまとめてみました。

※前提として、商用利用の機能（LINE@の有料機能）は不要であるとします

# Developer Trial：「プロ」から友だち数を制限したプラン
無料で始められるDeveloper Trialは、BOTに関して言えば、プロプランとほぼ同様の機能が使えます。異なるのは、友だち可能数が50人までという点です。

先のサイトを見ると、他にもプレミアムIDが取得できるか否かという違いがありますが、プレミアムIDは「[IDの@以降を自由に決められる](http://at.line.me/jp/plan)」というものです。ID検索で友だち追加がしやすくなるのですが、QRコードとURLリンクを使えば事足りるので、基本的には不要かなと思います。

ただ、友だち可能数50人までというのが、かなりの足かせとなります。サイトにアップしたり知り合いや親せきに教えたりすれば、50人はすぐに埋まるからです。なので、世に公開するBOTとしては不向きです。僕はステージングテストや今後の勉強用として、本番BOTの他に一つ作っています。

# フリー：無料だがPush APIが使えない
フリープランもDeveloper Trialと同様に無料で利用できるプランです。こちらは友だち可能数に制限はありません。

注意すべき点は「フリープランではPush APIが利用できない」ことです。Push APIはBOTが起点となってメッセージを投げる機能です。例えば、BOTが時刻や天気情報などのアラートを自発的に送信する、といった事には必要となり、これはフリープランでは実装できません。

ただし、ユーザーからのアクション（メッセージを送信したりボタンを押したり）に対して応答するReply APIは問題なく利用できます。世に出回るチャットBOTの多くは「ユーザーが問いかける→BOTが返信する」という流れで、この程度であれば問題なく利用できます。

なお、BOT AWARDSの期間内は各プランでPush APIが利用できるようです。ただ、個人的にはAWARDS関係なく継続的にBOTを提供したいので、「AWARDSの間は期間限定でリリースします」っていうのもどうかなと思い、僕は利用していません・・・

# ベーシック：BOTに関していえばフリーと何ら変わりない
月額5,400円かかる有料プランですが、BOTの機能に関していえば、フリープランと何ら変わりありません。Push APIもフリープラン同様に利用できません。

LINE@の機能がフリープランよりも充実しているのですが、BOTどうこうよりも「LINE@をどうやって使うか」という話になってきます。個人がBOTを世にリリースしたいというのであれば、特にメリットにはならないかと。

# プロ：高額だがPush APIが使える
プロプランは月額21,600円とハイエンドに位置するプランです。BOTに関して最大で唯一の特徴は、Push APIが使えるという点です。

Push APIは非常に強力な機能です。これを利用すればBOTの可能性が一気に膨らみ、魅力的で未来的なBOTが産まれるでしょう。しかし、そのために月額2万円払うのは、銭闘力がたったの5しかないゴミな私にとって現実的な選択肢ではありません。

# まとめ
以上を踏まえて、個人が趣味でBOTを利用すると考えた場合は・・・

- Developer Trial　：　開発・お試し用BOTには向いている 
- フリー　：　標準的なチャットBOTは、これで十分
- ベーシック　：　BOT開発のためであれば選択する必要なし
- プロ　：　Push APIが利用できるが、個人利用としては高額すぎる

となります。結果として、フリープランが現実的な選択肢かと思います（経営しているお店や会社とかで有料プランを契約しているのでない限り）。僕のBOTもフリープランで動作しています。

# ちょっとした不満とか
見方を変えると、多くの個人ユーザーにとって、Push APIの利用は現実的ではないとも言えます。Developer Trialで内輪用の便利BOTを作るぐらいでしょうか。Push APIが使えないのはBOTとして片手落ちな感じがするので、ちょっと不満です。まあ、LINEのビジネス戦略なのかとは思いますが。

とはいえ、Reply APIでも僕が作ったようなBOTは特に問題なく作れます。この機能がいくらでもタダで利用できる、LINEは太っ腹だなあと思います。


※本記事は個人的に調査した内容を基に記載していますが、事実と異なること書いていたらご指摘ください。
Spring メッセージ管理（MessageSource）

#メッセージ定義
メッセージをプロパティファイル(messages.properties)に定義する。
ここでは日本語用のプロパティファイル(messages_ja.properties)を作成。

```messages_ja.properties
hoge={0}さん、おはようございます。
```

**messages.propertiesというファイルがないと messageSource の auto-configuration が実行されないため、起動時にエラーメッセージ出るので、空ファイルを作成しておくこと。**

#MessageSourceの利用
MessageSourceをインジェクションしてgetMessageメソッドを呼び出す。

```sample.java
import java.util.Locale;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class SampleMessage {
	
	@Autowired
	MessageSource messagesource;
	
	@RequestMapping ("/show")
	public void showMessage(){
		String message = messagesource.getMessage("hoge", new String[]{"fuga"}, Locale.JAPAN);
		System.out.println(message);
		
	}
}

```

起動後、ブラウザで http://localhost:8080/show にアクセスすると
「fugaさん、おはようございます。」が表示される。

#MessageSourceResolvableの利用
メッセージに埋め込む値もプロパティから取得したい場合、MessageSourceResolvableを利用する。


```messages_ja.properties
hoge={0}さん、おはようございます。
Name=fuga
```

```sample2.java
@RestController
public class SampleMessage {
	
	@Autowired
	MessageSource messagesource;
	
	MessageSourceResolvable Name = new DefaultMessageSourceResolvable("Name");
	
	@RequestMapping ("/show")
	public void showMessage(){
		String message = messagesource.getMessage("hoge", new MessageSourceResolvable[] {Name}, Locale.JAPAN);
		System.out.println(message);
		
	}
}
```
起動後、ブラウザで http://localhost:8080/show にアクセスすると
「fugaさん、おはようございます。」が表示される。

#Thymeleaf での利用
Thymeleafのテンプレートからは#{key}で取得することができる。

```messages_ja.properties
hello.wolrd=こんにちわ、世界。
```

```sample3.java
@Controller
public class SampleMessage {	
	@RequestMapping ("/sample")
	public String showSample(){
		return "Sample/Sample";
	}
}
```

sorce/main/resources/templatesにSample/Sample.htmlを作成

```Sample.html
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
	<title>Sample</title>
	<meta charset="UTF-8"/>
</head>
<body>
	<h1 th:text="#{hello.wolrd}"></h1>
</body>
</html>
```
起動後、ブラウザで http://localhost:8080/Sample にアクセスすると
「**こんにちわ、世界。**」が表示される。
Linux 3.16でbtrfs-convertしたらエラーだけど4.9に上げたら普通に進んだ

```
$ sudo btrfs-convert -p /dev/sdc1
ERROR: unsupported RO features detected: 440, abort convert to avoid possible corruption
No file system found to convert.
WARNING: an error occurred during conversion, filesystem is partially created but not finalized and not mountable
```

```
$ sudo  fsck.ext4 -f /dev/sdc1
e2fsck 1.43.3 (04-Sep-2016)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/sdc1: 1038564/67043328 files (1.3% non-contiguous), 254759652/268173051 blocks
```

特にエラーはない。Jessie → Stretch にあげて実行したらエラー消えた。

```
$ sudo btrfs-convert -L -p /dev/sdc1
create btrfs filesystem:
        blocksize: 4096
        nodesize:  16384
        features:  extref, skinny-metadata (default)
creating ext2 image file
```

でも結局コケた

```
$ sudo btrfs-convert -L -p /dev/sdc1
create btrfs filesystem:
        blocksize: 4096
        nodesize:  16384
        features:  extref, skinny-metadata (default)
creating ext2 image file
Unable to find block group for 0
extent-tree.c:289: find_search_start: Assertion `1` failed.
btrfs-convert[0x4130c8]
btrfs-convert(btrfs_reserve_extent+0x5c9)[0x41728f]
btrfs-convert(btrfs_alloc_free_block+0x63)[0x41762c]
btrfs-convert[0x40ce89]
btrfs-convert(btrfs_search_slot+0x698)[0x40dc41]
btrfs-convert(btrfs_csum_file_block+0x26b)[0x41bdc7]
btrfs-convert[0x432528]
btrfs-convert(main+0x11c4)[0x409352]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf1)[0x7f6857f212b1]
btrfs-convert(_start+0x2a)[0x40a67a]
```
CentOS7にフリーのwebmail RainLoop導入

とにかく導入が簡単だった、他のwebmailだとRoundCube等もあるんだけど、DB設定など、手間がかかる。

Document Root が　/var/www/html の場合でその下のrailloopディレクトリにインストールする場合
mkdir rainloop
cd rainloop
して
wget -qO- http://repository.rainloop.net/installer.php | php
でインストール完了
設定は
https://ドメイン名/rainloop/?admin
にアクセスして管理画面から最低限の設定(メールサーバ等)をするだけ
デフォルトだと管理画面のパスワードは12345なので変えておいたほうがいいね

あとは
https://ドメイン名/rainloop/
にアクセスすると洒落乙な感じのログイン画面が出てくる。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/151329/1a86cbf7-3438-0c3b-8e3a-ae4b5e32d19b.png)
Swift：スクリーンショットをUIImageに書き出しかつ加工する

# 背景

広告付きアプリを開発している際にスクリーンショットを利用したくなったが、広告が邪魔で加工せねばならなかった。綺麗にスクリーンショットを撮る方法のひとつをまとめておく。

# とりあえずソース

```swift
import UIKit

extension UIView {
	//広告を隠したスクリーンショットを撮る関数（WindowFrameが画面領域、adFrameが広告領域）
	func getScreenShot(windowFrame: CGRect, : adFrame: CGRect) -> UIImage {

		//context処理開始 
		UIGraphicsBeginImageContextWithOptions(windowFrame.size, false, 0.0);

		//UIGraphicsBeginImageContext(windowFrame.size);  <-だめなやつ

		//context用意
		let context: CGContext = UIGraphicsGetCurrentContext()!;

		//contextにスクリーンショットを書き込む
		layer.render(in: context);

		//広告の領域を白で塗りつぶす
		context.setFillColor(UIColor.white.cgColor);
		context.fill(adFrame);

		//contextをUIImageに書き出す
		let capturedImage : UIImage = UIGraphicsGetImageFromCurrentImageContext()!;

		//context処理終了
		UIGraphicsEndImageContext();

		//UIImageをreturn
		return capturedImage;
	}
}
```

# 解説

UIViewControllerにいちいちスクリーンショットのコードを書いたりメソッドを置くのも面倒なので、UIViewクラスを拡張してしまった。上のソースコードを適当な名前.swiftでプロジェクトファイルに突っ込んでおけば、UIViewを継承するどの場面でもスクリーンショットが撮れるので便利。

スクリーンショットを撮るには、UIGraphicsとCGContextを用いれば良い。スクリーンショット用のUIImageと広告を隠す用のUIImageをそれぞれ用意して合成しても良いが、一つのcontextに同時に書き込んでしまうとコード量も短くて楽。

# 罠（注意）

**UIGraphicsBeginImageContext()** と **UIGraphicsBeginImageContextWithOptions()** の二種類がXcodeの候補に出てくる。一見前者で行けるように思えるが(Swift3らしさ的に)、これだとなぜかスクリーンショットの画質が劣化してしまう。iPhone等で見たまんまの綺麗なスクリーンショットを取りたいならば、後者のオプション付きメソッドを利用する事。
DE0-Nanoで100MHzのクロック

こんにちは。

使っているDE0-Nanoのクロックが50MHzであるため、出せるパルスの幅は20ナノ秒が下限と思っていたが違いました。

FPGAに搭載のPLL(Phase Locked Loop 位相同期回路)というものを利用すれば、入力周波数をn倍できるのだそうです。

いったいどんな魔法なのか理屈がさっぱりわかりませんが、とりあえず今日はこれを利用して2倍の100MHzのクロックをつくってみました。

まずQuartus Prime Lite Edition（自分のバージョンは16.0）の「Tools」→「IP Catalog」を選択します。

画面の右端にIP Catalogの検索ボックスが表示されるので、「PLL」と入力します。

![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/14792/3c1fac33-46cd-b9b5-bf76-e4d2c863e25d.jpeg)

すると「ALTPLL」という項目が現れるのでダブルクリック。

「Save IP Variation」というダイアログが表示されます。

![WS000000.JPG](https://qiita-image-store.s3.amazonaws.com/0/14792/07961b9b-210d-56fb-80b4-44f9475617d7.jpeg)

「IP variation file name:」の値はプロジェクトフォルダに続けて自分は「apll」と入力しました。
（ALTPLLとかPLLと入力したら、その名前は使えないと怒られたので）

「IP variation file type:」は「Verilog」を選択しました。

すると「MegaWizard Plug-In Manager」というウィザードが始まります。

![WS000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/14792/2e08b29c-1220-be59-5d20-dac30aa269a1.jpeg)

最初の画面でもうわからなくて困りましたが、とりあえず「inputは何MHzなの？」と聞かれているのはわかるので「50MHz」と答えて「Next」をクリックしておきました。

![WS000003.JPG](https://qiita-image-store.s3.amazonaws.com/0/14792/1020558b-5db4-9338-5472-f906019de750.jpeg)

次の画面。
なにも答えられないので、すべてチェックのついていない状態で「Next」をクリック。

![WS000004.JPG](https://qiita-image-store.s3.amazonaws.com/0/14792/14301578-19d2-f5dc-c7c6-31e86b91dc6a.jpeg)

次の画面。
なにも触らず「Next」をクリック。自分の不勉強が情けなくなってきます。

![WS000005.JPG](https://qiita-image-store.s3.amazonaws.com/0/14792/12b3eb30-faee-8694-0ce9-cf5d3c27511a.jpeg)

もう何も言うことはありません。

![WS000006.JPG](https://qiita-image-store.s3.amazonaws.com/0/14792/394d2bd7-38c2-5921-fa3e-4090c609e67d.jpeg)

・・・。

![WS000007.JPG](https://qiita-image-store.s3.amazonaws.com/0/14792/d68a23ac-59c6-0b66-0fa3-26c51e04fb51.jpeg)

これは重要そうな予感がします！
「何MHzのクロックを作りたいの？」と聞かれている気がしたので「100MHzです！」と答えて「Next」をクリックしておきました。

![WS000008.JPG](https://qiita-image-store.s3.amazonaws.com/0/14792/ce2b4099-6aca-3a3b-eff6-c00ca212d7e1.jpeg)

まだまだクロックを作れるような感じですが、今はひとつあれば十分なので「Use this clock」のチェックが外れていることを確認しつつ「Next」をクリック。

clk4まで同じことを繰り返します。

![WS000009.JPG](https://qiita-image-store.s3.amazonaws.com/0/14792/c332cbdd-42dd-7bf0-bfd7-b45b6fe34829.jpeg)

なにも変更せずに「Next」をクリック。

![WS000010.JPG](https://qiita-image-store.s3.amazonaws.com/0/14792/08c96717-ae06-dd1e-9697-2a27c0961745.jpeg)

ついに最後の画面。
なにやら出力するファイルの確認のようです。特になにもいじらずに「Finish」をクリックします。

さて、エクスプローラーでプロジェクトフォルダを開いてみると、最初に入力した「apll」をファイル名に含むファイルがいくつか保存されていました。

![WS000014.JPG](https://qiita-image-store.s3.amazonaws.com/0/14792/7f849d32-79e4-12ae-417d-ad04c65315d5.jpeg)


その中でも「apll.v」というファイル。これはモジュールだろうと目星をつけました。

「たしかモジュールは関数のようなものだったはず・・・」
「50MHzクロックを入力すると100MHzクロックが出るように設定したはず・・・」
「てことは、引数にCLOCK_50を指定して呼び出せばいいのかな？」

と、いろいろと憶測を交えながら以下のリストのようなVerilogコードをでっち上げました。

```verilog
module double_pulse(CLOCK_50, GPIO);

    input CLOCK_50;
    output [33:0] GPIO;

    apll apll_inst(CLOCK_50, CLOCK_100);
	 
    assign GPIO[3] = CLOCK_100;

endmodule
```

結果・・・うまいこと100MHzのクロックを得ることができました！

![DSC_0058.JPG](https://qiita-image-store.s3.amazonaws.com/0/14792/fb193a42-1cf2-3565-0d21-daf06425e5cc.jpeg)


わーい。


（参考）
[DE0 QuartusIIのMegaWizardでPLLを使う : まごころせいじつ堂](http://blog.livedoor.jp/hardyboy/archives/6263333.html)
ローカルでSalesforce アプリケーション開発 with Docker

# 概要

　Salesforce（以降SFDCとする）アプリケーションをApex、Visualforcceを使わずにローカル環境で開発する方法をご紹介します。
　代表的な方法としてはローカルからjsforce経由でSFDC APIを叩いて、SFDCデータを取得して開発するイメージになります。
この方法だとローカルにWebサーバとプロキシサーバの両方を立てなければならないのが、なにげにめんどくさい。ということでプロキシサーバとWebサーバをDockerで一元管理すれば**コマンド一つ**でそれらの環境が構築されるので、アプリケーション開発にスムーズに取り掛かれる。
　また、ApexやVisualforcceに慣れていない（もしくは初めての）場合は、今まで使い慣れてきた開発言語（Javascript、HTML、CSS）でまずプロトタイピングして、慣れてきた頃（ガバナ制限を抑えるため）にApexやVisualforceに移植していく場合にも有効かと思います。
（RemoteActionに置き換えるなど）

以下にてサンプルコードをベースに説明していきますので、必要に応じて読み替えて頂ければ幸いです
https://github.com/comefigo/local-prototyping-sfdc-app-sample.git


## 準備

### Docker

1. [Docker](https://www.docker.com/products/docker)をインストール
2. ドライブの共有設定  
   開発ソースが保存されているドライブの共有設定を有効に設定

![1.png](https://qiita-image-store.s3.amazonaws.com/0/30522/23749159-9dbf-18db-6088-85e51bb39d92.png)


### OAuth設定

ローカルの開発環境からSFDCに認証するために、SFDCのOAuth設定をします
設定が反映させるまで最大10分かかります

#### 1. 新規接続アプリケーションの作成
![0.png](https://qiita-image-store.s3.amazonaws.com/0/30522/d8521fb5-69a8-fcc5-8ec6-e21d36862c21.png)

#### 2. OAuth設定

- コールバックURLはローカル環境のWebサーバのURLを指定してください（デフォルトはhttp://localhost:3000/）
- OAuth範囲は「データへのアクセスと管理」
- Webアプリケーション設定の開始URL（デフォルトはhttp://localhost:3000/）
![1.png](https://qiita-image-store.s3.amazonaws.com/0/30522/b3524c68-d199-7936-7e12-63f63b3158a8.png)

#### 3. 認証情報の保存

「app」-「static」-「js」-「jsforce.config.js」に手順2で保存後に表示されるコンシューマー鍵をclientIdに上書きしてください

```
if (!jsfConn) {
    jsforce.browser.init({
        clientId: 'salesforce コンシューマ鍵',
        redirectUri: 'http://localhost:3000/',
        proxyUrl: 'http://localhost:3123/proxy/'
    });
    var jsfConn = jsforce.browser.connection;

    // アクセストークンがない場合は、認証
    if (!jsfConn.accessToken) {
        jsforce.browser.login();
    }
}
```

## プロキシサーバとWebサーバの起動

下記の説明はこちらのサンプルコードをもとに解説します


サンプルコードのルートディレクトリで以下のコマンドを実施します

```
> docker-compose up -d
```

これだけです！
これで開発用のプロキシーサーバとWebサーバが起動します！

## アプリケーションの開発

「app」-「static」配下がWebアプリケーションの公開ディレクトリになりますので、
いつも通りにWebアプリケーションの開発ができます！

### サンプルコードを動かすには

app配下で以下のコマンドを実行してください

```
> bower install

```

## ポート変更

Webサーバのデフォルトポートを3000としていますが、それ以外のポートに変更したい場合は、
以下のファイルと設定をそれぞれ変更する必要があります

- docker-compose.yml
 
    ```
      ports:
        - "<new port>:3000"
      environment:
      - PORT=<new port>
    ```

- jsforce.config.js
- Salesforce OAuthのコールバックURLと開始URL


# 参考にしたサイト

jsforce様様です！

- [jsforce](https://jsforce.github.io/)
- [jsforce ajax proxy](https://github.com/jsforce/jsforce-ajax-proxy)
- [tyoshikawa1106のブログ](http://tyoshikawa1106.hatenablog.com/entry/2016/03/17/011316)
MySQL(5.7)メモ

MACにbrewでMySQLを入れてみた

```bash
$ brew update
$ brew install mysql
$ brew info mysql
```

`mysql: stable 5.7.17 (bottled)`

# validate_password
mysqlを入れるとvalidate_passwordgaが入っている。

## 確認

```mysql
mysql> SHOW GLOBAL VARIABLES LIKE 'validate%';
```

## 変更

```mysql
mysql> SET GLOBAL validate_password_length=4;
mysql> SET GLOBAL validate_password_policy=LOW;
```

### confで設定
mysql.server startの度にリセットされるみたいなので、 /etc/my.confを修正する。

```bash:/etc/my.conf
[mysqld]
validate_password_length=4
validate_password_policy=LOW
```

## rootのパスワードをなしにする

```mysql
mysql> update user set authentication_string='' where User='root';
```

## アンインストールvalidate_password

```mysql
mysql> UNINSTALL PLUGIN validate_password;
```

## インストールvalidate_password

```mysql
mysql> INSTALL PLUGIN validate_password SONAME 'validate_password.so';
```

## GRANT ON で権限操作の際にERROR 1819

これまでだったらこれでも良かった記憶

```mysql
mysql> GRANT select,update,insert,delete ON db_name.table_name TO 'user'@'%';
```

しかし `Your password does not satisfy the current policy requirements`

```mysql
mysql> GRANT select,update,insert,delete ON db_name.table_name TO 'user'@'%' IDENTIFIED BY 'password';
```

IDENTIFIEDで対象のuserのパスワードを指定する必要があるみたい。

## LaravelのBD設定
configのdatabase.phpで`unix_socket`情報の追加が必要になってた

```
[PDOException]
SQLSTATE[HY000] [2002] No such file or directory
```

こんなエラーがでてしまう

```bash
mysqladmin version
```

```
Server version		5.7.17
Protocol version	10
Connection		Localhost via UNIX socket
UNIX socket		*** <- これ
Uptime:			2 days 2 hours 40 min 57 sec
```
Markdownでのリンク挙動

`Markdown`でのURLのリンクの挙動がGitHub,Qiita,JIRA,はてなブログ,その他色々で若干違うのでメモ。
リンクさせたくない時用として。
全部実験して確認するのは面倒なので、これを試せばどれか当てはまるかなと。

| Markdown | 結果 |  
|:-----------|:-----------|
| `http://qiita.com`   | http://qiita.com | 
| `[Qiita](http://qiita.com)`   | [Qiita](http://qiita.com) | 
| `[Qiita](http://qiita.com "Qiita")`   | [Qiita](http://qiita.com "Qiita") | 
| `http&#58;//qiita.com`    | http&#58;//qiita.com |  
| `http\://qiita.com`       | http\://qiita.com| 
| `<span>http</span>://qiita.com`   | <span>http</span>://qiita.com|
[Git] shallow cloneしたリポジトリを、あとで完全にfetchする

`--depth 1` をつけでcloneしたリポジトリを、あとで完全な状態にする方法メモ

# TL;DR

`fetch --unshallow` を使用すればよいとのこと

```bash
$ git fetch --unshallow
```

もし Git が 1.8.3 以前であれば以下でもなんとかなるらしい。(depthの値は十分に深ければなんでもよい）

```bash
$ git fetch --depth=1000000
```

# TODO

複数ブランチが存在している場合でも問題ない？

# 参考
[git - Convert shallow clone to full clone - Stack Overflow](http://stackoverflow.com/questions/6802145/convert-shallow-clone-to-full-clone)
dot よりも @ が速い

python3.5 以降で使えるようになった `@` による乗算。

ベンチマークしてみると：

```python3:use_at
import numpy as np

N=1000
LOOP=10
a=np.arange(N*N).reshape(N,N)

for _ in range(LOOP):
  b=a@a@a
```

```python3:use_dot
import numpy as np

N=1000
LOOP=10
a=np.arange(N*N).reshape(N,N)

for _ in range(LOOP):
  b=a.dot(a).dot(a)
```

|書き方|時間|
|:-:|:--:|
|use_at|user	0m12.344s|
|use_dot|user	0m35.812s|

なんと、`@` の方が三倍ぐらい速い。行列の大きさとか値の型とか処理系とかいろいろによると思うけど、上記のコードを手元て実行したらこんな結果に。

ちょっとびっくりした。

※ python 3.6 で普通に使えるベンチマークライブラリって何？
DockerでGoの開発環境構築

# 背景
へっぽこプログラマーですが、なんとなくGo言語を勉強し始めたら、面白くてはまってしまったので、どこでも手軽にGoの開発環境が作れるようにDockerイメージを作ってみました。[公式のgolangイメージ](https://hub.docker.com/_/golang/)もありますが、勉強もかねて1から作ってみたかったのと、[vim-go](https://github.com/fatih/vim-go)などのツールも入れて、コンテナ内で開発を完結できるようにしたかったので、自作しました。

# 前提条件
環境は下記の通りです。

| 項目 | 概要 |
|:-:|:-:|
|動作環境|macOS Sierra|
|Docker Version|1.13.1|
| Base Image  | [ubuntu](https://hub.docker.com/_/ubuntu/) (latest, 16.04)  |
| CPU  | amd64  |
| Go Version  | 1.7.5  |

Base Imageは筆者の好みでubuntu (latest ※執筆時点では16.04) を使用していますが、もう少し軽量なImageを使ってもいいかもしれません。

# Dockerイメージ作成
Dockerfileは下記の通りです。

```Dockerfile:Dockerfile
FROM ubuntu:latest

MAINTAINER hogehoge

ENV ARCH amd64
ENV GOVERSION 1.7.5
ENV HOME /root
ENV PATH $PATH:/usr/local/go/bin
ENV GOPATH $HOME/work

RUN apt-get update -y \
	&& apt-get install vim curl git -y \
	&& curl -s -o /tmp/go.tar.gz https://storage.googleapis.com/golang/go$GOVERSION.linux-$ARCH.tar.gz \
	&& tar -C /usr/local -xzf /tmp/go.tar.gz \
	&& rm /tmp/go.tar.gz \
	&& curl -s -fLo /root/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim \
	&& echo "let g:go_fmt_command = \"goimports\"" >> $HOME/.vimrc \
	&& echo "filetype plugin indent on" >> $HOME/.vimrc \
	&& git clone https://github.com/fatih/vim-go.git $HOME/.vim/pack/plugins/start/vim-go \
	&& go get github.com/nsf/gocode \
		  github.com/alecthomas/gometalinter \
		  golang.org/x/tools/cmd/goimports \
		  golang.org/x/tools/cmd/guru \
		  golang.org/x/tools/cmd/gorename \
		  github.com/golang/lint/golint \
		  github.com/rogpeppe/godef \
		  github.com/kisielk/errcheck \
		  github.com/jstemmer/gotags \
		  github.com/klauspost/asmfmt/cmd/asmfmt \
		  github.com/fatih/motion \
		  github.com/zmb3/gogetdoc \
		  github.com/zmb3/gogetdoc \
		  github.com/josharian/impl

WORKDIR $HOME/work
```

下記の部分はCUIで環境構築する場合は、vimで```:GoInstallBinaries```コマンドを叩くといい感じにインストールしてくれるのですが、Dockerfileでやるとイメージのビルド途中でユーザ入力が必要になり、どうもうまくいかなかったので一つ一つ地道にインストールしています。

```
  && go get github.com/nsf/gocode \
        github.com/alecthomas/gometalinter \
            .
            .
            .
            github.com/josharian/impl
```

あとは上記のDockerfileのあるディレクトリで下記のコマンドを打ってイメージ作成して完了です。

```shell-session:dockerコマンド
$ docker build -t godev .
```

# 作成したイメージを利用
では、作成したイメージを使ってみましょう。
コンテナを立ち上げます。

```shell-session:dockerコマンド
$ docker run -it godev
```

シェルが立ち上げるので、vimで拡張子がgoのファイルの編集をしてみます。

```shell-session
$ vi main.go
```

Goのテンプレートが立ち上がります。インデントも自動です。```Ctrl+x Ctrl+o```でコード補完も可能です。```.vimrc```は最低限の設定しかしていませんので、必要に応じてカスタマイズしていただければ。

![スクリーンショット 2017-02-14 22.15.50.png](https://qiita-image-store.s3.amazonaws.com/0/165095/b7984744-610a-42e1-cf5f-a2a2d36ca150.png)

簡単ですがこれで最低限のGoの開発環境が整いました。あとは煮るなり焼くなりして必要に応じてカスタマイズしていければいいですね。

# まとめ
Goの開発環境をどこでも手軽に作りたかったので、dockerで最低限の開発環境を作ってみました。これからどんどんGoで遊んでいきたいと思います。