OmniAICreator/Qiita-1.07M huggingface dataset:
いまさらJavaの文字列連結とか。


#Javaで文字列連結の話とか
##経緯とか
2年ほど前の話なんですけど。
Javaの文字列連結で盛り上がってるのを指くわえて見てたわけですよ。
ちょっと機会があって久しぶりに見てみたら、文字列の合計長が初めからわかってるなら速いコード書けるねって話になってました。
[Java8時代の文字列連結変態さんまとめ](http://d.hatena.ne.jp/nowokay/20140413#1397359039)

実務で必要なのは文字列の合計長が不明でも速いことだったりするわけです。
そういうのって書けないのかなぁということで、10年くらい前に書いたコードをちょろっと書き直してみました。
ArrayStringBuilderです。ちなみに最初の名前はArrayStringBufferでした。時代を感じますね！
##コードとか
```Java:ArrayStringBuilder.java
import java.io.IOException;
import java.io.Serializable;
import java.nio.CharBuffer;
import java.util.ArrayList;
import java.util.List;

public class ArrayStringBuilder implements Serializable, Appendable, CharSequence {
	private List<String> strings=new ArrayList<>();
	private int dataSize=0;
	public String toString(){
		switch(strings.size()){
		case 0:
			return "";
		case 1:
			return strings.get(0);
		}
		CharBuffer cBuffer=CharBuffer.allocate(dataSize);
		for(String val:strings){
			cBuffer.put(val);
		}
		String ret=cBuffer.toString();
		strings=new ArrayList<String>(){{
			add(ret);
		}};
		return ret;
	}
	public ArrayStringBuilder(){}
	public ArrayStringBuilder(int dmy){}
	public ArrayStringBuilder(String s){
		strings.add(s);
		dataSize=s.length();
	}
	@Override
	public int length() {
		return dataSize;
	}
	@Override
	public char charAt(int index) {return toString().charAt(index);}
	@Override
	public CharSequence subSequence(int start, int end) {return toString().subSequence(start,end);}
	public Appendable append(String s) {
		dataSize+=s.length();
		strings.add(s);
		return this;
	}
	@Override
	public Appendable append(char c) throws IOException {return append(String.valueOf(c));}
	public Appendable append(int p) {return append(String.valueOf(p));}
	public Appendable append(long p) {return append(String.valueOf(p));}
	public Appendable append(short p) {return append(String.valueOf(p));}
	public Appendable append(double p) {return append(String.valueOf(p));}
	public Appendable append(float p) {return append(String.valueOf(p));}
	public Appendable append(byte p) {return append(String.valueOf(p));}
	public Appendable append(boolean p) {return append(String.valueOf(p));}
	public String substring(int start){return toString().substring(start);}
	public String substring(int start,int end){return toString().substring(start,end);}
	
	@Override
	public Appendable append(CharSequence csq) throws IOException {
		if(csq==null){
			dataSize+=4;
			strings.add("null");
		}else{
			dataSize+=csq.length();
			strings.add(csq.toString());
		}
		return this;
	}
	@Override
	public Appendable append(CharSequence csq, int start, int end) throws IOException {
		if(csq==null){
			dataSize+=4;
			strings.add("null");
		}else{
			dataSize+=(end-start);
			strings.add(csq.subSequence(start, end).toString());
		}
		return this;
	}
}
```
##説明とか
見ればわかると思いますが、appendされたら、とりあえずListに突っ込んでおいて、必要に応じて連結して結果返すだけです。
StringBuilderの置き換え需要狙ってるので、よく使う系(プリミティブappendとかsubstringとか)は実装してありますし、Java7互換です(6でも動くかも）。
実際に試してみるとわかりますけど**StringBuilderを普通に使うより10倍は速い**です。
ただし、StringBuilderと比べると**メモリを大量消費する可能性がある**ので、そこだけ注意が必要です。特にGCで回収してくれるから大丈夫でしょ！みたいなコード書くと、実はArrayStringBuilderが内部で抱えてて解放されないとか発生することがっ。
やばそうならtoString()かけて開放しましょう。
IBM DB2 - レジストリー変数「DB2_COMPATIBILITY_VECTOR」の設定値によって、SQLCODE=-302, SQLSTATE=22001 が発生したりしなかったり

## 1. はまったこと

* レジストリー変数「DB2_COMPATIBILITY_VECTOR」の設定値によって、SQLCODE=-302, SQLSTATE=22001 が発生したりしなかったり

## 2. 起きたこと

### 2.1. 条件とか

* IBM DB2 v10.5 Express-C
* Table

```
> db2 describe table foo
           データ・タイ   データ・     列の   スケ
列名       プ・スキーマ   タイプ名     長さ   ール   NULL
---------- ------------ ------------ ------ ----- -----
ID         SYSIBM       INTEGER      4      0     いいえ
NAME       SYSIBM       VARCHAR      10     0     いいえ
```

* Data

```
ID   NAME
---- ----------
   1 John
   2 Paul
```

* Query
` select id, name from foo where name = ? `

* name = ?にNAME列の長さ10を超える値を設定
例えば、「John」ならID=1, NAME=Johnのレコードが取得できるけど、「Pauuuuuuuul」なら対象レコードないはず

* DB2_COMPATIBILITY_VECTORの設定値を変更する
MYS
ORA
SYB
設定なし

### 2.2. 結果

* MYS、ORA、SYB

対象レコードなし
例外発生しない


* 設定なし

以下のようなSQLExceptionが発生した
com.ibm.db2.jcc.am.SqlDataException: DB2 SQL Error: SQLCODE=-302, SQLSTATE=22001, SQLERRMC=null, DRIVER=4.18.60

SQL0302N
EXECUTE または OPEN ステートメント内のホスト変数の値が、対応する使用の範囲外にあります。
http://www.ibm.com/support/knowledgecenter/SSEPGG_10.5.0/com.ibm.db2.luw.messages.sql.doc/doc/msql00302n.html?lang=ja

## 3. 反省すること

* SQL0302N
このエラー自体があることは知ってた..>_<..
http://db2.jugem.cc/?eid=1850

* DB2_COMPATIBILITY_VECTORのデフォルト
DB2 Express-Cで試していたが、最初に入れたサンプルデータベースで「DB2_COMPATIBILITY_VECTOR」のデフォルトがMYSになっていた..>_<..

* IBM Knowledge Centerの記載
MYSは「LIMIT 節と OFFSET 節の有効化のみ」と記載あるので原因ではないと思ってしまった..>_<..
http://www.ibm.com/support/knowledgecenter/SSEPGG_10.5.0/com.ibm.db2.luw.apdv.porting.doc/doc/r0052867.html?lang=ja

おわり。
KnockoutをTDDで学ぶ環境作り


# 背景

[Knockout](knockoutjs.com)はNode.jsで動かせます。
また、[mocha](https://mochajs.org)のテストコードを持っています。

テスト対象を入れ替える細工をすれば、自作のKnockoutクローンをテストすることができます。

# 準備体操 KnockoutをNode.jsで動かす

knockoutをインストールします。

```
npm i knockout
```

サンプルコードを作ります。

```js:index.js
const ko = require('knockout'),
  o = ko.observable(0)

o.subscribe((val) => console.log(val))
o('hello')
```

実行

```
node .
```

`hello`が表示されます。

# 例:subscribable

[Observables](http://knockoutjs.com/documentation/observables.html)の通知機能を実装している[subscribable](https://github.com/knockout/knockout/blob/master/src/subscribables/subscribable.js)を例にとります。

## テストコードの場所

テストコードはspecディレクトリ以下にあります。
subscribableの場合は[knockout/subscribableBehaviors.js at master · knockout/knockout](https://github.com/knockout/knockout/blob/master/spec/subscribableBehaviors.js)です。

テストコードの抜粋

```js
describe('Subscribable', function() {
    it('Should declare that it is subscribable', function () {
        var instance = new ko.subscribable();
        expect(ko.isSubscribable(instance)).toEqual(true);
    });
}
```

アサーションが[Jasmine](http://jasmine.github.io/)スタイルで書いてあります。

## 書き換え

Jasmineスタイルは実行環境を整えるのが面倒です。
assertスタイルに書き換えます。

```js
describe('subscribable', function() {
  it('Should declare that it is subscribable', function() {
    const instance = new ko.subscribable()
    assert.equal(ko.isSubscribable(instance), true)
  })
})
```

`reuquire`文を追加します。

```
const ko = require('knockout'),
  assert = require('assert')
```

全文

```js:subscribable.js
'use strict'

const ko = require('knockout'),
  assert = require('assert')

describe('subscribable', function() {
  it('Should declare that it is subscribable', function() {
    const instance = new ko.subscribable()
    assert.equal(ko.isSubscribable(instance), true)
  })
})
```

## 実行

実行してみましょう。
test/subscribable.jsを作ったとして

```
npm i knockout mocha
node_modules/mocha/bin/mocha
```

で、

```
  subscribable
    ✓ Should declare that it is subscribable


  1 passing (8ms)
```

が表示されます。

## テスト対象の入れ替え

環境変数でテスト対象を入れ替えます。

```js
require('knockout')
```

を

```js
require(process.env.TARGET)
```

に変更して、実行時にテスト対象を指定します。
全文
   
```js:subscribable.js
'use strict'

const ko = require(process.env.TARGET),
  assert = require('assert')

describe('subscribable', function() {
  it('Should declare that it is subscribable', function() {
    const instance = new ko.subscribable()
    assert.equal(ko.isSubscribable(instance), true)
  })
})
```

実行

```
env TARGET=knockout node_modules/mocha/bin/mocha
```

で、同じように

```
  subscribable
    ✓ Should declare that it is subscribable


  1 passing (8ms)
```

が表示されます。

自作のKnockoutクローンが`lib/knockout`にあれば

```
env TARGET='../lib/knockout' node_modules/mocha/bin/mocha
```

で、テスト可能です。
本家のKnockoutと同じ動きをしているか確認できます。

# まとめ
TDDの三角測量でKnockoutクローンを実装できる環境が整いました。
テストを増やしながら、マイペースでKnockoutクローンを実装できます。
自分の実装と本家の実装を見比べれば、より理解が進むことが期待できます。

KnockoutのテストコードからはTDDの三角測量っぽい匂いがします。
網羅的なリグレッション向けのテストではなく、ポイントだけを確かめるテストです。
意地悪なテストがないので、特定環境向けのレアケースをカバーする実装なしでテストをクリアできます。
学習向けのクローン実装に向いています。

ただ、テストを全てクリアしても完全なクローンにはならない点には注意してください。
ESP-WROOM-02でWi-Fiのアクセスポイントをスキャンする

ESP-WROOM-02へArduinoスケッチ(プログラム)を書き込めるようにするライブラリ「[ESP8266 Arduino Core](https://github.com/esp8266/Arduino)」には、さまざまなサンプルが用意されています。今回はその中で、ESP-WROOM-02がキャッチできるアクセスポイントとその信号の強度(RSSI)をスキャンするサンプルを取り上げます。

# サンプルスケッチ
Arduino IDEのメニューから、`[ファイル]→[スケッチの例]→[ESP8266WiFi]→[WiFiScan]`を選択してサンプルスケッチを開きます。Wi-Fi自体には接続しないので、SSIDやパスワードの入力は不要です。

WiFiScan

```cpp
/*
 *  This sketch demonstrates how to scan WiFi networks. 
 *  The API is almost the same as with the WiFi Shield library, 
 *  the most obvious difference being the different file you need to include:
 */
#include "ESP8266WiFi.h"

void setup() {
  Serial.begin(115200);

  // Set WiFi to station mode and disconnect from an AP if it was previously connected
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(100);

  Serial.println("Setup done");
}

void loop() {
  Serial.println("scan start");

  // WiFi.scanNetworks will return the number of networks found
  int n = WiFi.scanNetworks();
  Serial.println("scan done");
  if (n == 0)
    Serial.println("no networks found");
  else
  {
    Serial.print(n);
    Serial.println(" networks found");
    for (int i = 0; i < n; ++i)
    {
      // Print SSID and RSSI for each network found
      Serial.print(i + 1);
      Serial.print(": ");
      Serial.print(WiFi.SSID(i));
      Serial.print(" (");
      Serial.print(WiFi.RSSI(i));
      Serial.print(")");
      Serial.println((WiFi.encryptionType(i) == ENC_TYPE_NONE)?" ":"*");
      delay(10);
    }
  }
  Serial.println("");

  // Wait a bit before scanning again
  delay(5000);
}
```

元々接続していたWi-Fiとの接続を一旦切ります。

```cpp
// Set WiFi to station mode and disconnect from an AP if it was previously connected
WiFi.mode(WIFI_STA);
WiFi.disconnect();
```

アクセスポイントの数を取得します。

```cpp
int n = WiFi.scanNetworks();
```

アクセスポイント名とRSSIを1つずつ見ていきます。

```cpp
for (int i = 0; i < n; ++i)
{
  // Print SSID and RSSI for each network found
  Serial.print(i + 1);
  Serial.print(": ");
  Serial.print(WiFi.SSID(i));
  Serial.print(" (");
  Serial.print(WiFi.RSSI(i));
  Serial.print(")");
  Serial.println((WiFi.encryptionType(i) == ENC_TYPE_NONE)?" ":"*");
  delay(10);
}
```

# どんなことに使える？
実際にどういうことに使えるのか少しピンときませんね :sob: 
取得したアクセスポイントの中から信号の強度が最も強いものを選んで接続したり、特定のアクセスポイントが生きているのか確認するなどでしょうか？
CircleCIでMySQL5.6とFULLTEXTインデックスを使う方法

CircieCIでFULLTEXTインデックスを使用できるようにした時のメモです。
# 設定方法
`circle.yml`に以下の内容を追記することで、MySQL5.6に変更でき、FULLTEXTインデックスも使用できました。

```
dependencies:
  pre:
	- sudo apt-add-repository -y 'deb http://ppa.launchpad.net/ondrej/mysql-experimental/ubuntu precise main'
	- sudo apt-get update; sudo DEBIAN_FRONTEND=noninteractive apt-get install -y mysql-server-5.6
	- echo '[mysqld]' | sudo sh -c 'cat >>  /etc/mysql/my.cnf'; echo 'innodb_ft_min_token_size = 2' | sudo sh -c 'cat >>  /etc/mysql/my.cnf'; sudo /etc/init.d/mysql restart
```


CircleCIのコンテナにログインして確認したところ、正しくインストールできていて、テスト用のテーブルも健在でした。

```bash
$ mysql --version
mysql  Ver 14.14 Distrib 5.6.14, for debian-linux-gnu (x86_64) using  EditLine wrapper

$ mysql -u ubuntu
...
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| circle_test        |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.01 sec)

```


# 参考
- [CircleCIでMySQL5.6を使う方法 - リア充爆発日記](http://ria10.hatenablog.com/entry/20150217/1424135330)
- [全文検索関数 - MySQL](https://dev.mysql.com/doc/refman/5.6/ja/fulltext-search.html)
Railsで改行抜きの文字列長を簡易にvalidateする

# 注意：Rails5.2でlength validationのtokenizerオプションが削除されたためtokenizerを利用した方法は利用できません。別途改行コードを除くようにしましょう。
@MasamotoMiyata さん、ご指摘ありがとうございました。

整形のための改行で入力文字数に数えたくないといった仕様のときvalidateのmethodに書いたりすると思いますが、もう少し簡易に行いたいとき以下のように書いたりすると思います。

```rb
validate :validate_title_length

def validate_title_length
  if title.gsub(/[\r\n]/, '').length > 50
    errors.add(:title, :too_long)
  end
end
```

本来の用途は違うがtokenizerのオプションを使うと少し簡単に書ける

> :tokenizer - Specifies how to split up the attribute string. (e.g. tokenizer: ->(str) { str.scan(/\w+/) } to count words as in above example). Defaults to ->(value) { value.split(//) } which counts individual characters.

```rb
def validates_length_of(*attrs)
  # Merge given options with defaults.
  options = {
    :tokenizer => lambda {|value| value.split(//)}
  }.merge(DEFAULT_VALIDATION_OPTIONS)
  ...
```

通常は一文字ずつ配列にして長さを求めているのが、改行コードを除いてしまえばカウントされない。tokenizerの使い方としてはちょっと違うが特定の文字を除外してカウントしたいときには使ってもいいかもしれない。

```rb
validates :title, length: { maximum: 50, tokenizer: ->(str) { str.gsub(/[\r\n]/, '').split(//) } }
```
bash起動時にランダムでメッセージを表示してみる

#bash起動時にランダムで応援メッセージを！！
皆さん[前回](http://qiita.com/JpnLavender/items/fabcc79b4ab0d52e1f6d)の記事ではたくさんの方が見てくださったみたいで、本当に
嬉しい限りです。今回もvimやtmuxの記事を書こうと思ったのですが
他に沢山の記事が出回っているようでしたので今回はちょっとした
遊び心くすぐるプログラミングをしていこうと思います。
それが！bashを起動した時にランダムで、知り合いの口癖（アニメのセリフ)など  
を表示させるという、そういった遊び心あるものを作っていこうと思います
書く言語自体はShellScriptですが今回は変数とif文と糖分1200秒程度があれば大丈夫でしょう

では、まず。どんな感じに作っていくか説明します（正直飛ばしてもらっていいです）
1. ランダムの乱数を作成する
2. 作成数を1~10に絞る
3. 変数に乱数を入れる
4. アルゴロジックの作成
5. ティータイム

###設定ファイルの開き方
では、早速始めていきましょうあ、ちなみに記述は**.bashrc**です
vimなどで開く場合は下をShellにコピペしてください
```shell
vim ~/.bashrc
```
###乱数の作成の仕方
まず。bashで乱数を作成する方法ですが

```shell
$RANDOM
```
とやると簡単に作れます。では次に乱数作成幅を1~10に絞ります
```shell
$RANDOM % 10
```

これだけでできちゃいます。

###変数の入れ方
次にこれででた値を比較するために変数に入れます

```shell
declare -a random=($(($RANDOM % 10)))
```

これでRandomという変数に乱数が入るようになります  
あとはこれにif文を追加するだけなので簡単ですね。

~~ですが、echoで文字をエラー度出さずに表示するには[echo(-e)]とやらなければいけないので 
それも追加して~~
(追記:case文を使えばエラーが出ませんでした)
###完成！！
```shell
declare -a random=($(($RANDOM % 10 )))

if [ $random = 0 ]; then
  echo -e "愛してくれてありがとう。命をくれて本当にありがとう。cv:立華 奏"
elif [ $random = 1 ]; then
  echo -e " さ～て、追い込みますよ～。着いて来て！ cv: 北上"
elif [ $random = 2 ]; then
  echo -e "感情論じゃ何も始まらないわよ cv:仲村 ゆり "
elif [ $random = 3 ]; then
  echo -e "アホですね cv:ユイ"
elif [ $random = 4 ]; then
	echo -e "つまりそうゆうことだよ cv:いりまめ "
elif [ $random = 5 ]; then
	echo -e " ぱんぱかぱーん！  cv:愛宕 "
elif [ $random = 6 ]; then
	echo -e " 触ってもいいんだけどさ、時間と場所を弁えなよ cv:金剛"
elif [ $random = 7 ]; then
	echo -e " 五航戦の子なんかと一緒にしないで cv:加賀"
elif [ $random = 8 ]; then
	echo -e " ｵｩｯ!? cv:島風"
elif [ $random = 9 ]; then
	echo -e " チッ…まだまだイケる。舐めるな！ cv:磯風"
elif [ $random = 10 ]; then
	echo -e " うぁあぁぁっcv:大井"
fi
```
追記：case文使ったほうがスマートでかっこいいですよね

```shell
case "$random" in
    "0" ) echo "愛してくれてありがとう。命をくれて本当にありがとう。cv:立華 奏" ;;
    "1" ) echo " さ～て、追い込みますよ～。着いて来て！ cv: 北上";;
    "2" ) echo "感情論じゃ何も始まらないわよ cv:仲村 ゆり ";;
    "3" ) echo "アホですね cv:ユイ";;
    "4" ) echo "つまりそうゆうことだよ cv:いりまめ ";;
    "5" ) echo " ぱんぱかぱーん！  cv:愛宕 ";;
    "6" ) echo " 触ってもいいんだけどさ、時間と場所を弁えなよ cv:金剛";;
    "7" ) echo " 五航戦の子なんかと一緒にしないで cv:加賀";;
    "8" ) echo " ｵｩｯ!? cv:島風";;
    "9" ) echo " チッ…まだまだイケる。舐めるな！ cv:磯風";;
    "10" ) echo " うぁあぁぁっcv:大井";;
esac
```

![shell.gif](https://qiita-image-store.s3.amazonaws.com/0/105255/3de2e155-c855-7bd4-fdb5-bf7ec2b12910.gif)


こんな感じですかね
これで起動時にランダムでテキストが表示されるようになります

おつかれさまでした〜
AWSアカウント取得後、はやる気持ちをグッと堪えてまずやっておくこと


## はじめに

* 認証に必要な情報は不正利用されてしまうと、大事故（ものすごい請求額）に繋がります。
* 事故がおきないようにどうするべきか。予兆をどう検知するか。おきてしまった時にどう追跡するのか。を考えておく必要があります。
* AWSのサービスを早速バリバリ使ってみるぜ！という気持ちをぐっとこらえてやっておきたい設定をリストアップしました。
* 新しいAWSアカウントを利用する機会があったので、この記事を書きながらやってみましたが長めにみても30分あれば設定は終わります。

---

### ルートアカウントのMFAの有効化

* rootアカウントは超強力なので絶対にMFAを有効にすること。
* ハードウェアデバイスで実施し、金庫に保管するくらいの勢いが良いと思います。
* ハードウェアデバイスは$20くらいで購入が可能です。参考：[Multi-Factor Authentication](https://aws.amazon.com/jp/iam/details/mfa/)
* 最低でも仮想MFAを設定しておきましょう。私がいつも使っているのはIIJのSmartKeyです。他にもGoogleAuthenticatorなどもあります。

### IAMパスワードポリシーの有効化

* 所属する組織に合わせてパスワードポリシーを必ず設定すること。
* ポリシーでは設定できませんが、アカウント作成時にMFAを必須にすることを運用ルールとしました。

### cloudtrailの有効化

* 証跡を残すために行う。全リージョンで必ず設定すること。
* S3に保管されたログが改竄されていないことも保証できるので合わせて有効化しておくこと。

1. s3にバケットを作成する(trailxxxx)
2. プロパティからライフサイクルの設定を行う(底冗長化、Glacier,完全に削除どれにするかはお好みで。とりあえず90日で削除のポリシーとした）
3. CloudTrailの設定
4. 「すべてのリージョンに適用」「ログファイルの検証を有効化」
5. S3のバケットを確認し、証跡が取得できていること。

### IAMユーザの作成

* コンソール用、API用は別に分けて作成する。
* APIでアクセスキー・シークレットアクセスキーを利用する場合、本当に必要か？代替できないか？を確認すること（ロールを使ってSTSで認証情報を取得できないかなど。）
* 付与するロールを最小限にしたグループの作成
* ユーザの作成、およびグループへの所属
* CloudTrailでの証跡取得が無意味になるのでユーザは最低必ず1人1アカウント発行すること。
* パスワードの設定（次回ログイン時に再設定してもらうようにしてます）
* MFAの設定

---

### 請求関連

#### 設定

*「請求とコスト管理」から「電子メールでPDF版請求書を受け取る」「請求アラートを受け取る」にチェックして「設定の保存」

#### 電子メールでPDF版請求書を受け取る

* rootアカウントに紐づくメールアドレスにしか飛ばせないので、必要であれば関係者が受け取るメーリングリストに変えておく。

#### 請求アラート（Billing Alert）を設定する

* 今回はt2.small×2,Lambda,SWF,RDB,ELB,S3程度なので$100を下回るはず
* 80$でアラートを設定しておきました。

1.「バージニア北部」のリージョンを選択し、CloudWatch - 請求を選択
2. アラームを作成する
3. 超過金額と通知先メールアドレスを設定すると、メールでのSubscriptionを求められるのでConfirmすることでアラートが設定できる。

---

### TrustedAdvisorの通知設定

* ビジネスサポート以上じゃないとすべてのチェックは利用できない。
* ただし、TrustedAdvisorの指摘は守るべきことばかりだし、定期的に自力でチェックするのは大変なものが多くこれだけでもサポートにお金を払う価値がある。
* どうしても守れないルールなどがあれば、必要に応じて除外設定を行い、常にすべてクリアにしておく状態に保つこと。知っていて無視することと知らないということは別物。
* 通知先のアドレスはアカウントに紐付くメールアドレスのみ。
【圏論メモ】Hom(-, A) ≡ Hom(-, B) ならば A ≡ B

# 命題

```math
\textrm{Hom}_\textbf{C}(-, A) \cong \textrm{Hom}_\textbf{C}(-, B)
```

ならば

```math
A \cong B
```

である

# 証明

以下圏 $\textbf{C}$ を固定する。

```math
\vartheta: \textrm{Hom}(-, A) \rightarrow \textrm{Hom}(-, B)
```

を自然な同型射とする。

```math
\begin{eqnarray}
u & = & \vartheta_A(id_A) & : A \rightarrow B\\
v & = & \vartheta_{B}^{-1}(id_B) & : B \rightarrow A
\end{eqnarray}
```

として、

```math
u \circ v = id_B\\
v \circ u = id_A
```

を示す。（$(\vartheta^{-1})\_B = (\vartheta\_B)^{-1}$ に注意）

```math
\begin{array}{ccc}
in \textbf{C} & in \textbf{C}^\textrm{op} & in \textbf{Set}\\
A & A & \textrm{Hom}(A, A) & \xrightarrow{\hspace{1em}\vartheta_A\hspace{1em}} & \textrm{Hom}(A, B)\\
\phantom{\overset{v}{}}\Bigg\uparrow \overset{v}{} & \phantom{\overset{v}{}}\Bigg\downarrow \overset{v}{} & \phantom{\overset{\textrm{Hom}(v, A)}{}}\Bigg\downarrow \overset{\textrm{Hom}(v, A)}{} & & \phantom{\overset{\textrm{Hom}(v, B)}{}}\Bigg\downarrow \overset{\textrm{Hom}(v, B)}{} \\
B & B & \textrm{Hom}(B, A) & \xrightarrow{\hspace{1em}\vartheta_B\hspace{1em}} & \textrm{Hom}(B, B)\\
\end{array}
```

上図が可換図式に注意して、

```math
\begin{eqnarray}
\textrm{Hom}(v, B) \circ \vartheta_A (id_A) & = & \textrm{Hom}(v, B) \bigl(\vartheta_A (id_A)\bigr)\\
& = & \textrm{Hom}(v, B)(u)\\
& = & u \circ v\\
\vartheta_B \circ \textrm{Hom}(v, A) (id_A) & = & \vartheta_B \bigl(\textrm{Hom}(v, A) (id_A)\bigr)\\
& = & \vartheta_B(v)\\
& = & id_B
\end{eqnarray}
```

より、 $u \circ v = id_B$ が言えた。

$A$ と $B$ を入れ替えて同様の手順を踏むと $v \circ u = id_A$ が言える。

したがって、 $A \cong B$ が示せた。
Rails の Active Record に like がない理由

Active Record に like がない理由を見つけたのでメモっとく。

Rails 4 で `not` が追加されたとき `like` と `not_like` も追加される予定だった。実際のところコミットされた後にロールバックされた。

https://github.com/rails/rails/commit/8d02afeaee8993bd0fde69687fdd9bf30921e805

そのロールバックに対してのコメントが紛糾したわけだが、DHH がロールバックした理由を4つあげている。

> Here are the design considerations that I had when we decided to roll this back:
>
> 1) It's an odd mismatch of SQL and Ruby with the % sign for designating the order.
> 2) It opens the door for wanting to expand this line of DSL further (including undesireable ventures into greater_or_equal_than).
> 3) It's being a fairly uncommon query not in need of optimization.
> 4) not_like is nasty (and "dislike" wont cut it either).
>
> Feel free to extract this into a plugin and mix it into your own flavor of Rails, though.

拙いながら意訳してみる。（もっといい訳をコメントで提案して貰えたらと思う。）

> 我々がロールバックを決定したデザイン上の理由：
>
> 1) % 記号について SQL と Ruby で奇妙なミスマッチがある
> 2) DSL の境界線を押し広げる要求への扉を開いてしまう（greater_or_equal_than への望ましくない冒険を含む）
> 3) 最適化の必要がないとしてもかなり珍しいクエリである（like は Rails にて特殊な文法を新たに作ってサポートするほどにメジャーなクエリではない」という意味合い。[sugitak](http://qiita.com/sugitak) さんのコメントより）
> 4) not_like はイケてない（dislike でもダメだ）
>
> とはいうものの、遠慮なくこれをプラグインとして抜き出して、それを Rails の自前の味付けとして追加してもらって構わない。

僕としては `like` と `not_like` が入らなかったことを残念に思う気持ちもあるが、こういう判断が積み重なって一貫性のある設計の Rails が出来上がっていると考えると割と素直に受け入れられる。DHH の2番目の理由が一番納得できるかな。

`LIKE` を SQL でベタに書かなきゃならないとか信じられないって言ってる Rails エンジニアさんが近くにいたらそっとこのことを教えてあげてほしい。
cssの指定でpxとremを連動

styleの記述でよく「rem」を使うのですが、pxで指定されたデザインをマークアップする時にrem指定の数値は感覚的なモノになっていました。

以下の方法を使うと数値で計算が可能になります。

**・font-sizeを62.5%で指定すると10pxが1.0remになる。**


```html
html {
    font-size: 62.5%; /* 62.5%を指定すると「1.0 rem = 10px」 */
}
```
【イベントレポート】AITCブロックチェーンセミナー

4/20に開催された[AITC技術セミナー＆オープンラボ：「ブロックチェーン」セミナー](http://aitc-openlab.connpass.com/event/29273/)に参加してきました。

基本的にインフォテリアからのセミナー形式の情報提供ですので、トピックをメモしました。インフォテリアはブロックチェーンの技術開発はしていませんが、テックビューロ社の技術を活用し、このビジネス開発を行っています。
因みに今後、AITCでもブロックチェーン勉強会が開催される予定との事。

##ビットコインの堅牢性
イメージ先行で理解されやすいビットコインだが、認識すべき事実は下記。
・時価総額 $6.319B
・2009年の運用開始から一度もダウンしていない
・Mt.GoxやBitflyerの事故とビットコインの堅牢性は無関係

##ブロックチェーンの種類
「パブリック」「プライベート」「コンソーシアム」「ハイブリッド」４パターンがあるとの事。ハイブリッド型はまだそれほど言及されていないモデルであり、管理者が単独または複数というアーキテクチャで、IaaS（ハイブリッドクラウド）と同じ考え方。今日時点でまだ稼働している例はないが、今後半年ぐらいで実装例が出てくると思われる。
	
##ブロックチェーンの５つの誤解
・ビットコインはブロックチェーンである （初期は同一視点で解説されがちだった）
・ブロックチェーンはパフォーマンスが悪い （ビットコイン以外にもユースケースはある）
・ブロックチェーンはデータが誰にでも見える （プライベート型もある）
・ブロックチェーンは第三者と共有しないといけない （プライベート型もある）
・ブロックチェーンは分散型データベースと同じ （パフォーマンスを上げるための技術ではない） 

##データベースとしてのブロックチェーン
・改ざん不可（Modifyもソートも出来ない）
・パフォーマンスや機密性担保はプライベート型で対応できる

これ以外にも同社が海外で進めている実証実験の話や、今後ブロックチェーン関連の啓蒙活動的なコンソーシアムが設立される話があった。
ElasticBeanstalkでELBセキュリティグループをカスタマイズする

AWSのElasticBeanstalkで以下のような構成にしたかったのでebextensionsでやってみた。
ELBで80番と10051番ポートを転送するとデフォルトではELBのセキュリティグループ設定が全オープンになるので制限したかった。

![eb_elb_custom.png](https://qiita-image-store.s3.amazonaws.com/0/16768/62168f9d-f2c1-8c75-4e04-5c934979855f.png)

# 参照サイト

* [Elastic Beanstalk 環境リソースの追加とカスタマイズ - AWS Elastic Beanstalk](http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/environment-resources.html)
* [ロードバランシングされた Elastic Beanstalk 環境でエンドツーエンドの暗号化を設定する - AWS Elastic Beanstalk](http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/configuring-https-endtoend.html)
* [HTTPS を終了するように Elastic Beanstalk 環境のロードバランサーを設定する - AWS Elastic Beanstalk](http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/configuring-https-elb.html)
* [すべての環境に対する汎用オプション - AWS Elastic Beanstalk](http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/command-options-general.html)

# やってみたこと

## .ebextensionsの設定

以下のように.ebextensionsを書いてできた。

* .ebextensions/00_options.config
 * sg-XXX部分は任意のセキュリティグループのIDを指定

```yaml
option_settings:                       
  aws:elb:listener:10051:
    ListenerProtocol: TCP
    InstanceProtocol: TCP
    InstancePort: 10051
  aws:elb:loadbalancer:
    SecurityGroups: 
      - sg-XXX
      - '`{ "Ref" : "loadbalancersg" }`'
    ManagedSecurityGroup: '`{ "Ref" : "loadbalancersg" }`'
```

* .ebextensions/01_resources.config
 * vpc-XXX部分は任意のVPCのIDを指定

```yaml
Resources:
  port10051SecurityGroupIngress:
    Type: AWS::EC2::SecurityGroupIngress
    Properties:
      GroupId: {"Fn::GetAtt" : ["AWSEBSecurityGroup", "GroupId"]}
      IpProtocol: tcp
      ToPort: 10051
      FromPort: 10051
      SourceSecurityGroupName: { "Fn::GetAtt": ["AWSEBLoadBalancer", "SourceSecurityGroup.GroupName"] }
  loadbalancersg:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: custom ELB security group
      VpcId: vpc-XXX
      SecurityGroupIngress: []
      SecurityGroupEgress: []
  port10051ELBSecurityGroupIngress:
    Type: AWS::EC2::SecurityGroupIngress
    Properties:
      GroupId: {"Fn::GetAtt" : ["loadbalancersg", "GroupId"]}
      IpProtocol: tcp
      ToPort: 10051
      FromPort: 10051
      SourceSecurityGroupName: default
```

## ポイント

デフォルトでELBに紐づけられるAWSEBLoadBalancerSecurityGroupにSecurityGroupIngress : []などとして設定してもlistenしたポートが自動的に全オープンされてしまうので別のセキュリティグループを作って紐付ける。
アプリケーションスタックでスクリーンショットを表示しないようにする

この記事は、http://buildbox.net/?p=787 からの転載です。

アプリケーションスタックにスクリーンショットを表示しないようにする方法を調べていて、やり方を見つけたのでその情報をシェアします。
※ そもそもアプリケーションスタックという呼び方でいいのかどうかって問題はありますね(^^;)


やり方は簡単で、スクリーンショットをActivity#onCreateメソッドで以下のメソッドを呼び出せばOK　。

```java
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
```

やり方は簡単なのですが、１点注意。上記呼び出しが行われたActivityでは画面録画した時に真っ黒となってしまい、録画ができなくなってしまいます。
そのため、実際に利用するときには

```java
if (!BuildConfig.DEBUG) {
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
}
```

みたいにしてやって、デバッグビルドの時にはフラグをONにしないような制御をしてやるといいでしょう。
XAMPP 5.6.19-0 Mac MySQL文字化け対策


#my.iniファイルの修正
/Application/XAMPP/etc/my.iniファイルを修正します。

```
[mysqld]
character_set_server=utf8
skip-character-set-client-handshake

[mysqldump]
character_set_server=utf8

[mysql]
character_set_server=utf8
```

#MySQLの起動
XAMPPのコントロールパネルを開いてください。
[MySQL Database]を選択し、[Start]をクリックしてください。
nginx + php-fpmでphpを動かす

* ubuntu 16.04 にて実施

## インストール

```
apt-get install -y \
    nginx php-fpm
```

## php-fpm サービスの確認

```
systemctl status php7.0-fpm
```

* running, enabled を確認。


## socket

* `/etc/php/7.0/fpm/pool.d/www.conf` にsocketの記述あり

```
$ ls -l /run/php/php7.0-fpm.sock
srw-rw---- 1 www-data www-data 0  4月 15 09:51 /run/php/php7.0-fpm.sock
```


## nginxからphpを使えるようにする

```diff:/etc/nginx/sites-sites-enabled/default
-       index index.html index.htm index.nginx-debian.html;
+       index index.html index.htm index.nginx-debian.html index.php;
```

```diff:/etc/nginx/sites-sites-enabled/default
+       location ~ \.php$ {
+              include snippets/fastcgi-php.conf;
+       
        #       # With php7.0-cgi alone:
        #       fastcgi_pass 127.0.0.1:9000;
+              # With php7.0-fpm:
+              fastcgi_pass unix:/run/php/php7.0-fpm.sock;
+       }
```

debian9 + php7の場合は

```diff:/etc/nginx/sites-sites-enabled/default
-	#	fastcgi_pass unix:/var/run/php5-fpm.sock;
+       fastcgi_pass unix:/run/php/php7.0-fpm.sock;
```

## 動作確認

* document_root : /var/www/html/

```php:/var/www/html/a.php
<?php
echo "hoge";
```

* http://localhost/a.php

![hge.png](https://qiita-image-store.s3.amazonaws.com/0/25728/7c311731-6664-3bd0-5ac7-3d1e5c762cc4.png)

* ログは `/var/log/php7.0-fpm.log` に出力される(?)


## 404 Not Found時にnginxのバージョンを非表示にする

```diff:/etc/nginx/nginx.conf
-	# server_tokens off;
+	server_tokens off;
```


## uploadの上限を変更

初期値が1MB

* [nginxで"client intended to send too large body"が発生した時の対策方法 - Qiita](http://qiita.com/n-oshiro/items/4816ad71b90a9967fa18)

```diff:/etc/nginx/sites-sites-enabled/default
 http {
     server {
+        client_max_body_size 1000m;
     }
 }
```

```diff:/etc/php/7.0/fpm/php.ini
+ memory_limit = 1000M
+ post_max_size = 0
+ upload_max_filesize = 0
```
最近のHaskell製パッケージのドキュメント事情について簡単に

最近、自社内でHaskell勉強会を毎週のように開いているのですが、
ドキュメントの調べ方について聞かれたのでこっちにメモしておきます。

と、いうわけで、[hackage](http://hackage.haskell.org/)に公開されているHaskell製パッケージのドキュメントについて簡単に説明しましょう。
[base](http://hackage.haskell.org/package/base)という、[Prelude](http://hackage.haskell.org/package/base/docs/Prelude.html)をはじめGHCに標準で入っているパッケージのドキュメントも同じように調べられます。

# パッケージの名前や、概要から検索したい場合は

- [hackage](http://hackage.haskell.org/)から検索するか、
- [stackage](https://www.stackage.org/)のトップから「browse packages」というリンクをクリックして、LTS-Haskellに載っているパッケージを**ページ内検索**してください。
    - 今のところ、パッケージの名前で検索するフォームはstackageにはないみたいです。

:information_desk_person: 後者は、LTS-Haskellに載っているパッケージのみの一覧なので、hackageに公開されているすべてのパッケージが載っているわけではありません。

詳しくは[tanakhさんの記事のこのへん](http://qiita.com/tanakh/items/6866d0f570d0547df026#stackage%E3%81%A8%E3%81%AF)が参考になるかと思います。

# どこかのパッケージに入っている、関数の名前や関数のシグネチャ（型）から検索したい場合は

- 従来からある[hoogle](https://www.haskell.org/hoogle/)や、[hayoo](http://hayoo.fh-wedel.de/)を使うか、
- 同じく[stackage](https://www.stackage.org/)のトップページにある検索フォームから検索しましょう。

:warning: 現在はどうなっているかわからず恐縮ですが前者について。
hoogleやhayooが参照している、hackageのドキュメント生成が追いつかなくなる、と言った事態が発生し、新し目のパッケージがヒットしない、などのトラブルがありました。
なので最近は私は後者を利用しています。

# 追記: hackageのドキュメント生成が追い付いてない && stackageに登録されてない時は？

stackageは他のstackageのパッケージと組み合わせた時にビルドやテストが通るパッケージしか登録されていないので、結構登録されていないものもあります。
（あとは、パッケージの作者がサボっている場合も）
その上hackageのドキュメント生成が追い付いてない場合、なんて悲しい状況でも希望を捨てず、古いバージョンを見てみましょう。

例えば、2016年10月30日時点で[haste-compiler-0.5.4.2](http://hackage.haskell.org/package/haste-compiler-0.5.4.2)はドキュメントが登録されてません（「Modules」とかかれた一覧の各moduleがリンクになってない）が、違うバージョンの[haste-compiler-0.5.4.1](http://hackage.haskell.org/package/haste-compiler-0.5.4.1)ならドキュメントができているようです。
考察 > 片腕環境(2週間)の整備

昨年に不注意なドライバーにはねられて右手を骨折した。
長い間リハビリをしてほぼ元通りになったが、埋めている金属プレートを取ることになり、5月中旬から２週間ばかり利き腕が使えそうにない。

しかし、仕事と休日のコーディングをできるだけ支障なく、という希望もある。何か準備ができるだろうか。

<hr>
@ Men of Mathematics volume 1 by E.T.ベル

レオンハルトオイラーが視力をなくす直前の話

> 彼はすぐさま、取り返しのつかないものを取り返しにかかった。最後の光明が消え去る前、彼は、石盤の上にチョークで公式を書くのをつねとした。それからのちは、息子たち、ことにアルベールが筆記者の役をつとめ、彼は公式を説明しながら口述した。彼の数学的生産力は減ずるところか、かえって増大しさえした。

<hr>

http://qiita.com/YukiMiyatake/items/383ed0350017e636af05

ゲームパッドもしくはフットスイッチを用意するか。

準備にかける時間をあまりとれないという状況でもある。休日 x 2がおそらく使える時間数。

フットスイッチを自作するとき、信号取込までのハードウェアは用意できるだろう。問題はその信号を取り込んでOSにキー入力を通知するソフトを何で作るのか。

- Unityで作る場合 > [Link](http://qiita.com/7of9/items/b703a0b4d8dad3aae04d)
  - シングルスレッドでソフトがアクティブになっていないと処理がされないので、ソフトが非アクティブ時にスレッドを回すような実装が必要だろう
- Pythonで作る場合 > [Link](http://qiita.com/tukiyo3/items/127c3a57bb283bd548c7)
  - Windows側でpythonを実行する環境の整備が必要
  - vmware使用時に、それぞれのOS(Windows)でそれを準備するのは骨が折れる
  - これだけのために各Windowsに環境をインストール、というのもできればしたくない
  - [exeファイル変換](http://www.python-izm.com/contents/external/exe_conversion.shtml)があるが使い勝手はどうだろうか?
- C++ Builder / Visual Studio で作る > [Link](http://qiita.com/7of9/items/e0bb49501224178ba4e2)
  - 作りやすい
  - コードを公開する場合に要調査(プライベートリポジトリなら問題ない)
- ~~Electronで作る~~
  - やったことない
  - Javascript?自体ほとんど経験ない
- PowerShell > [Link](http://qiita.com/7of9/items/cf87f802114906185117)
  - Windows7以降が対象とする (Powershell v2.0以降)
  - Powershellの[セキュリティポリシー設定](http://www.atmarkit.co.jp/ait/articles/0805/16/news139.html)が各OSに必要 (それはそれで面倒)

各OSでのセットアップが最小限かつ、Mac OS X / Windows / (できればLinux)で使えるような作りはできるのだろうか。

優先順位としては、Windows > Mac OS X > Linux.

<hr>
(追記 2015/05/16)
埋め込んでいた金属プレートを取る抜釘手術を受けてきた。
その１日後には右手は使えて、ブラインドタッチもできる状態になった。

ということで、borgAugmentationで作ったものは、試作段階で使ったのみで本使用はしていない。

VK_KEY関連の勉強にはなった。
技術英語 > and the [tri-state] talks continue to plod on. / トライステート / rock-paper-scissors

@ LOE > March 21, 2003

http://loe.org/shows/shows.html?programID=03-P13-00012

> and the [tri-state] talks continue to plod on.

政治的なtri-stateについては不明 (関心圏でない)

<hr>
電子回路でのトライステートは

- Hレベル
- Lレベル
- Hi-Z (ハイインピーダンス)

http://toshiba.semicon-storage.com/jp/design-support/e-learning/micro_intro/chap1/1274771.html

<hr>
3つの状態で関連して思い出したのは

http://eow.alc.co.jp/search?q=rock+paper+scissors&ref=sa
> rock-paper-scissors

「ジャン憲法」(@ 私の生活流儀 by 本多静六)

> それは、夫婦間もしくは家族たちのあいだで、何か意見の一致をみないことがあると、お互いに二度までは意見を主張し合うが、それでも決まらぬとなると、三度目はいつでもジャンケンで決めることになっているのである。

技術的なことで rock-paper-scissors で決めることはおそらくないと思っている。
私がVimを使う理由

# 概要

初心者向けの記事でもまだ難しいと思ったので、更に敷居を下げた初心者向けの記事を作成しました。個人の感覚に寄り過ぎている可能性があります。

# ホームポジション

Vimはホームポジションから指をほとんど離さずに操作できます。
マウスを使う時やCtrl、矢印キーを押す時にホームポジションから大きく外れるのが小さなストレスとなります。その度に極々僅かな時間ですが指をホームポジションに戻す為の手探り時間が増えます。急いでホームポジションを確認せずタイプするとタイプミスに繋がり、それもまたストレスです。

VimとVim以外の環境で何故それ程の大きな差が生まれるのでしょうか。大きな理由としてモードの存在があります。
モードの無いエディタは打ったキーがそのままタイプされることが多いです。つまり、通常のタイプしやすいキーを用いたショートカットは行えず押しにくいキーを多用することに繋がります。

# コスト感覚

私の感覚だと矢印キーはかなり押しづらいです。感覚で押した際に何度```↓```キーと```←```キーを押し間違ったか分かりません。
なので、Vimを使う場合```矢印キー```を使うことはありません。初心者の頃はインサートモード中に操作できて便利と思って使っていましたが、慣れてくるとインサートモードを瞬時に抜ける癖が付いたので必要なくなりました。IMEの変換候補を選んでエンター押すぐらいの感覚でノーマルモードへ戻る```Ctrl+C```を押します。

この```Ctrl+C```はかなり頻繁に使う割にCtrlが必要なので```jj```等にマッピングする人もいます。しかし、私は```jj```のマッピングが入って無い環境で間違って```jj```を打ち込んでしまうストレスの方が強かったので```Ctrl+C```を使っています。Ctrlはできれば押したく無いけど、違和感なく押せるぐらいのコスト感覚です。

そして、マウスを触るくらいなら矢印キーを使います。これは、マウスを掴んだ際にマウスカーソルの位置を瞬時に把握できない場合がありそれを探すのが私にとってストレスだからです。酷く見つからない場合はカーソルを隅に寄せる操作をして発見する場合があるくらいです。

# Vimが嬉しい時

以下に私がVimの方が嬉しかったなという操作を少し紹介します。

## コピペ

私はコピー```Ctrl+C```の後のペースト```Ctrl+V```をたまにタイプミスして```Ctrl+C```と操作してしまうことがあります。
下手なエディタだとコピーしてたクリップボードのデータが上書きされ、またコピー元に戻るという状態になることがありゲンナリします。

Vimの場合コピー```y何らかの操作```してペースト```p```なので慣れてから事故ったことはありません。そして、この頻繁に行う操作にホームポジションから外れる操作が含まれていません。

## 画面のスクロール

カーソル位置によらない画面スクロールは```Ctrl+矢印キー```で可能ですが、常時Ctrl押しっぱは個人的には疲れます。それにCtrlの押しミスで```矢印キー```単体で押してしまうと今までのスクロールがキャンセルされ、元のカーソル位置に画面が戻ってしまうエディタも辛かったです。

Vimの場合カーソルを上部に移動```H```、カーソルを下部に移動```L```した後にいつも通り画面を動かすだけです。

# 初心者にオススメ

* 移動キー```h``````j``````k``````l```
* インサートモードへ以降```i```(insertのiで覚えやすい)
* とりあえずノーマルモードへ戻る```Ctrl+C```癖を付ける
* カーソルを大きく移動```H``````L```

コピペと検索は必須だけどコツがいるので使い慣れているエディタ使った方が良いと思います。

マウスと十字キーがストレスに感じるようになってきたら勝手に残りのキー操作も調べて覚えてくようになると思います。Vimの最大のメリットとデメリットはマウスと矢印キーの操作をストレスと判断できるようになることかもしれませんね。
Mysql2を使ってRubyでMySQLへ接続する

RubyからMySQLへ接続する場合には幾つかのライブラリがあるようですが、今回はMySql2というネイティブのlibmysqlclientを利用してやったみたのでメモ

以下のライブラリを使ってMySQLへ接続したときのメモ

[brianmario/mysql2](https://github.com/brianmario/mysql2)

# 環境

+ ruby 2.0.0p648
+ MySQL5.6をローカルにインストール済み
+ Mysql2は0.4.4を利用

# Mysql2インストール

Mysql2ではlibmysqlclinetを使っているようなのでライブラリを事前にインストール

```bash
$sudo yum install mysql56-devel
```

これもインストールの必要アリだった。

```bash
$sudo yum -y install ruby-devel
```

まだダメだった。
しまった、ネイティブなのでgccとかその辺りをインストールしないといけない

```bash
$sudo yum groupinstall "Development Tools"
```

やっとでOK

```bash
$gem install mysql2
```

# 使ってみた

普通にselectしてみる。
今回はUnixドメインソケットを利用

```select.rb
require 'mysql2'

client = Mysql2::Client.new(:socket => '/var/lib/mysql/mysql.sock', :username => 'testuser', :password => 'testtest', :encoding => 'utf8', :database => 'testdb')

results = client.query('select * from t1')
results.each do |row|
  puts row # {"id"=>1, "dep"=>1, "name"=>"hoge"}
end
```

できた。
PreparedStatementもサポートしているようなので使ってみる

```select.rb
require 'mysql2'

client = Mysql2::Client.new(:socket => '/var/lib/mysql/mysql.sock', :username => 'testuser', :password => 'testtest', :encoding => 'utf8', :database => 'testdb')

statement = client.prepare('select * from t1 where id = ?')
results = statement.execute(1)
results.each do |row| 
  puts row # {"id"=>1, "dep"=>1, "name"=>"hoge"}
end
```

簡単。
他の使い方はREADMEを見れば良さそう。
R で n 進数を 10 進数に変換する #rstatsj

R で 32進数を 10進数に変換する必要があったので書きました。

````r:R
base2dec <- function(str, base = 32) {
  chars_list <- strsplit(str, split = "")
  sapply(chars_list, function(chars) {
    n <- length(chars)
    digits <- sapply(seq_len(n), function(i) {
      char <- tolower(chars[i])
      tryCatch(as.integer(char), warning = function(e) {
        which(letters == char) + 9
      })
    })
    sum(digits * base^(n-seq_len(n)))
  })
}
```

こんな感じで使います。

```r
> base2dec("100", base = 10)
[1] 100

> base2dec("ff", base = 16)
[1] 255

> base2dec("11", base = 32)
[1] 33
```

ちなみに、8進数と 16進数に対しては、`as.octmode()` と `as.hexmode()` という関数がそれぞれ用意されていて、次のようにして変換できます。

```r
> as.integer(as.octmode("10"))
[1] 8

> as.integer(as.hexmode("ff"))
[1] 255
```

Enjoy!

## 追記

ていうか、`as.hexmode()` の中身を覗いてみると、`strtoi()` という関数があることに気づきました。

```r
> strtoi("10", base = 8)
[1] 8

> strtoi("ff", base = 16)
[1] 255

> strtoi("11", base = 32)
[1] 33
```

これでええやん。。orz
MySQLのログについて確認する

MySQLのログについて確認した時のメモ

# 参考

+ []()

# 概要

よく使われるログは以下の4つ

|ログの週類|mysqldの起動オプション|説明|
|:-----------|:------------|:------------|
|errorログ|--log-error|サーバーから出力されるエラーメッセージを記録する|
|SlowQueryログ|--slow-query-log|処理に時間のかかったクエリを記録する|
|詳細ログ|--general-log|詳細な情報を記録。すべての操作が記録|
|バイナリログ|--log-bin|更新SQL文だけをバイナリ形式で記録する|
|debugログ|--debug|開発者向けのトレースログ|

出力はMySQLの設定ファイルの1`my.cnf`で指定できる。

## エラーログ

[5.2.2 エラーログ](https://dev.mysql.com/doc/refman/5.6/ja/error-log.html)

以下引用

> エラーログには mysqld が開始および停止された時期を示す情報と、サーバーが実行中に発生したあらゆるクリティカルエラーが格納されます。自動的にチェックまたは修復することが必要なテーブルが mysqld で検出された場合、エラーログに警告メッセージが書き込まれます。

エラーログなので、起動時にこのログが出力された場合には監視した方が良さそうです。

出力先は設定ファイルで以下のように設定します。

```my.cnf
log-error=/var/log/mysqld.log # ファイルパス
```

また以下のように指定することでsyslogに書くこともできるようです。

```my.cnf
[mysqld_safe]
syslog
```

## Slow Queryログ

一定時間以上クエリに時間がかかったSQLやインデックスが利用されていないSQLを記録することができるようです。

```my.cnf
slow_query_log # slow queryログの有効化
slow_query_log_file=/usr/local/mysql/data/slow.log # ファイルパス
long_query_time=5 # 5秒以上処理に時間がかかったクエリを記録
log-queries-not-using-indexes # インデックスが使用されていないクエリをログに出力
```

また、ファイルへの書き込み以外にもテーブルへSlowQueryログ情報を記録することもできます。

## 詳細ログ

いつ、どのユーザーがどのホストから接続してきて、どのようなクエリを実行したかなどの詳細な情報を確認できるようです。

```my.cnf
[mysqld]
general_log # 詳細ログ有効化
general_log_file=/usr/local/mysql/data/general.log # ファイルパス
```
詳細ログもテーブルに記録することが可能です。

## バイナリログ

発行されたクエリのうち、更新系のSQLのみをログとして記録します。

```my.cnf
log-bin=master-bin #バイナリログのベース名
log-bin-index=master-bin #バイナリログのファイル名を記録したindexファイル名
```

このバイナリログはレプリケーションの際に利用されます。
Spring-Batch MyBatisPagingItemReaderの使い方

`Spring-Batch`における`MyBatisPagingItemReader`の実装方法に関して、ググッても全く出てこなかったので仕方なくライブラリのソースを読みつつ実装したので以下に残す。

```java:SampleBatchConfiguration.java
    @Autowired
    SqlSessionFactory sqlSessionFactory;
    
    @Bean
    public MyBatisPagingItemReader<SampleDto> reader() {
    	MyBatisPagingItemReader<SampleDto> reader = new MyBatisPagingItemReader<SampleDto>();
    	Map<String, Object> parameterValues = new HashMap<String, Object>();
    	parameterValues.put("param1", "sample");
    	reader.setQueryId("XXX.AAA.SampleQuery");
    	reader.setPageSize(10000);
    	reader.setParameterValues(parameterValues);
    	reader.setSqlSessionFactory(sqlSessionFactory);
        return reader;
    }
```

はまったのは、以下の3点。

①`setQueryId()`に指定するクエリIDは、`mybatis-config.xml`の`<mappers>`に`<mapper>`タグで設定されたすべてのXMLファイルの中で一意のIDのものを指定する、またはフルパス指定する。
②`SqlSessionFactory`を設定しないと（確か）IllegalArgumentExceptionが発生する
③クエリの書き方

①は、各XMLファイルの先頭に`<resultMap id="BaseResultMap" type="XXX.AAA" >`とあり、対象クエリが`<select id="SampleQuery" resultMap="BaseResultMap" parameterType="XXX.AAA.SampleExample" >`というタグで宣言されている場合の例。`SampleQuery`が全XMLの中で一意であれば`XXX.AAA.`は省略出来る。

②は、インターフェースである`SqlSessionFactory`を`@Autowired`すれば、自動的にデフォルトのインスタンスが設定されるのでそれを`setSqlSessionFactory()`にて設定する。

③`SELECT id, name, job FROM employees ORDER BY id ASC LIMIT #{_skiprows}, #{_pagesize}`のように、`LIMIT #{_skiprows}, #{_pagesize}`が必須。
以下参考
http://www.mybatis.org/spring/ja/batch.html
WordPressに初めてアクセスした時に「データベース接続確立エラー」が出たときの対処法

WordPressの設定ファイル「wp-config.php」

```
WordPress のためのデータベース名
MySQL データベースのユーザー名
MySQL データベースのパスワード
MySQL のホスト名
```
上記に誤りがないのに「データベース接続確立エラー」が出るときの対処法です。


mysql.sockの位置を確認

```
$ mysql_config --socket
/tmp/mysql.sock ← mysql.sockの位置
```
wp-config.phpの編集

```
define('DB_HOST', 'localhost');
　　　　      ↓
define('DB_HOST', 'localhost:/tmp/mysql.sock' );
```

これでうまく接続できるはず・・・
【登録編入門】slack使い方【世界一丁寧な解説初心者用】

# 前置き
友達にslackの使い方がわからないので記事を書けと言われたので書きます。
# teamとは
LINEで言うところのグループ
Skypeで言うところのグループ
**つまり集団のことです**

# 登録
### [まずslackのHPに行きます](https://slack.com/)

# 目次
1. emailアドレスの入力
2. チーム名を決める
3. URLの作成
4. アカウントの名前を決める
5. 入力内容の確認
6. 招待する人の設定
7. 楽しいslackライフを！

## 1. emailアドレスの入力
### 何が何だかわからない。英語読めない
真ん中の`Email address`とは`アカウントの名前`や`ID`ではなくアカウントに関連付けられた`emailアドレス`なのです。
**つまりチーム作成とともにアカウントを作成しているのです。**
#### （create a new teamではアカウントの作成とチームの作成を同時進行します。）
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/110454/5dec8698-4353-2dba-80b2-755c28b5fb15.png)

## 2. チーム名を決める
ここにはプロジェクト名または会社名などを入力します。
その組織の名前となる部分ですが、あまり意味はなく、**なんでも構いません**。（既存のチーム名と被ってもおｋ）

![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/110454/10d4068e-54b0-076a-c3d8-03c1fbf1dadc.png)

## 3. URLの作成
`2. チーム名を決める`で作成したチームのURLです。（こちらは既存のチームURLと被るとダメです。）
![キャプチャ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/110454/49d13144-1c72-4ceb-2aa3-47ce52cad78e.png)

## 4. アカウントの名前を決める
`your name`にはあなたの名前またはニックネームを入力します。
`Username`にはログインに使う名前です。
（初期では`1. emailアドレスの入力`で使用したメールアドレスの`＠`より前の文字が入力されています。）
![キャプチャ5.PNG](https://qiita-image-store.s3.amazonaws.com/0/110454/f9e289c1-a99d-97bf-ad31-2ce0a8ff2633.png)

## 5. 入力内容の確認

今まで入力してきた内容の確認を行います。
ここで編集し直すことも出来ます。
![キャプチャ6.PNG](https://qiita-image-store.s3.amazonaws.com/0/110454/7e6c03cf-fc70-e286-7c4c-8cd33cd6ba0a.png)

## 6. 招待する人の設定
招待したい人のメールアドレスを入力します
増やしたい場合は右上の`+ Add another invitation`をクリックすると増えます。
この設定を飛ばしたい人は`Skip for now`をクリックすると飛ばすことが出来ます。
チェックボックスは自分にもメールを送ることで検証するかしないかの設定です。

![キャプチャ8.PNG](https://qiita-image-store.s3.amazonaws.com/0/110454/b498597f-72da-8f1d-b2e9-b011c107f438.png)

## 7. 楽しいslackライフを！
これで登録は完了です、使い方はまた暇があれば書きたいと思います。


![キャプチャ10.PNG](https://qiita-image-store.s3.amazonaws.com/0/110454/ebedaa75-d09d-f884-c845-25e53b95b357.png)
Starling2.0新機能：無駄な描画更新をスキップして電力消費を抑える

昨日、Starling2.0がついにリリースされました。
![title-logo.png](https://qiita-image-store.s3.amazonaws.com/0/8302/e5ec0dbf-fb12-2fde-46d2-3c36f3b9e234.png)
ベータ公開からたくさんのフィードバックを得て、バグフィックとさらなるパフォーマンスチューニングが行われ、その流れで１つ大きな新機能が追加されたので、これをレポートしてみます。

# 無駄な描画更新を行わない
AIR+Starling1.xで作成されたコンテンツは電力消費が大きいという短所がありました。これはStage3Dレイヤーでは毎フレーム画面全体を書き直す事からなのですが、全く画面更新のない際も再描画が行われていて無駄な電力消費となっていました。
2.0の正式リリースとともに追加されたStarlng.**skipUnchangedFrames**というプロパティをtrueにする事でこの無駄な描画更新停止させる事ができるようになりました。デフォルトではfalse設定ですが（理由は後述）積極的にtrueにして使う事が公式に推奨されています。
![公式ブログにある描画負荷の比較図](http://gamua.com/img/blog/2016/skip-unchanged-frames.png?mtime=2016-04-19-0757)
_公式ブログにある描画負荷の比較図_

Starling1.xではflattenという命令で大きさ・回転・位置などで変更がないディスプレイリストの描画更新を行わない機能がありましたが、変更があるかないかはユーザ側で判断し、手動でflattenを呼び出したり、unflattenでそれを解除する事が必要で、一定の効果はあるもののイマイチつ使いずらい機能となっていました。Starling2.0ではこの機能が進化し、全ディスプレイリスト対象で自動でflatten処理が必要時だけかかるようになりました。これがさらに正式公開前のブラッシュアップで進化して、 ディスプレイリスト全体で全く更新がない場合は、画面更新処理自体をスキップするという事ができるようになりました。他のフレームワークではよくある機能のようですが、状況によってはかなりの電力消費の低下が期待できます。

# いくつかの注意点
上記で述べたようにデフォルトでこの機能はoffになっています。これは描画更新スキップを行っているとレンダーテクスチャ機能とビデオテクスチャ機能がただしく機能しなくなるからとの事です。これらの機能と描画更新スキップを合わせて使う場合は画面を更新したい際にStaling.setRequiresRedraw()を呼び出し、強制更新を行えば良いようです。また、ブログポストではまだ触れられていませんがソースコードを読む限り、描画更新スキップ機能が働かない状況がいくつかありました。

* 別のStage3Dライブラリ(Away3Dなど)と同時にStarling2.0が動いている時
* Flashネイティブの(昔からあるStage3Dでない)ディスプレイリストがstage3Dレイヤー外に表示されている時

前者はまれなケースかと思いますが、後者はそこそこ該当する使い方をする方も多いのではないでしょうか。。というか、まさに自分がそうなのですが、ネイティブ側のディスプレイリストを更新しない場合、スマホ上での動作であってもCPU負荷はほとんど増加しないため、自分の作成したアプリでは、Stage3D側では実装しずらいUIや演出をネイティブ側で*おとなし目*に表示する事をしばしばしていました。(ネイティブ側ディスプレイリストが画面上に存在しても、更新がかからなければスマホ上で60fpsの実現は可能です。）この描画更新スキップに関する制限は、スマホや一部のPCではstage3D側の描画更新入って初めてネイティブのディスプレイリスト描画更新が入る仕様である事から来ているようです。

とはいえ、描画更新スキップが行われない状況でも、Starling2.0では上述した自動flatten(のような)処理は働きます。こちらだけでもパフォーマンスアップや電力消費を抑える効果もあるはずですね。

なお、デスクトップPC(Win/Mac)上では（あまり古いビデオカードを用いている場合などを除いて）描画スキップはたいていの場合動作させる事が可能なようです。

# Statsの表示
手軽にパフォーマンス測定を行え便利なのでStarlingのStats機能はみな使っているかと思いますが、こちらにも関連した新機能が入りました。描画更新スキップ機能が働いている時は表示色が緑になるというものです。わかりやすくて良いですね。

![Stats](http://gamua.com/img/blog/2016/stats-display-skip.png?mtime=2016-04-19-0907)

なお、ビルトインのStatsViewはdrawコールを追加で2回確実に使ってしまいます。(draw回数が1の表示の時は、実は合計で3回drawコールが発生している。）描画スキップ情報がStarlingクラス外部から取得できると、使い勝手が良いのですが、現状のコードを見る限り、外から値を得るのは難しそうでした。残念。
# 終わりに
とりあえず、最新の日本語情報としてまとめましたが、まだ自分はスマホ実機ではStarling2.0を動かしておりません。動かしてみて何か記載内容がおかしかった際は、できるかぎり記事内容を修正しようと思います。

さて、ネイティブのディスプレイリストに関してですが、setRequiresRedraw命令にて強制描画更新する方式をとれば、ネイティブのディスプレイリストが表示されたまま描画更新スキップできる仕様にできるのではないかな、と疑問に思っています。時間があればStaling自体に手を入れて実験してみたい所です。


情報元：下記ブログポストと最新ソースコード
http://gamua.com/blog/2016/04/starling-20/?utm_content=buffer0d604&utm_medium=social&utm_source=facebook.com&utm_campaign=buffer
PowerShell で svn log --xml の出力が文字化けする

# 環境

環境は以下の通り。

* Windows 7 SP1
* PowerShell 2.0
* Subversion 1.9.2 (TortoiseSVN 同梱のやつ)

# 問題

以下のように実行して文字化けする。

```ps1:.\test.ps1
$log = & svn @('log', '-r', 'HEAD', '--xml', 'http://...')
$log
```

```
C:\>powershell -file .\test.ps1
...
<msg>文字化けする</msg>
...
```

# 対策

ググって以下の URL 先などを参考に

"クラシック コマンドと PowerShell の間のエンコード設定 - is BUG Ready ?"
http://d.hatena.ne.jp/ladybug/touch/20111203

以下のように修正して対策。

```ps1:.\test.ps1
[System.Console]::OutputEncoding = [System.Text.Encoding]::UTF8
$log = & svn @('log', '-r', 'HEAD', '--xml', 'http://...')
[System.Console]::OutputEncoding = [System.Text.Encoding]::Default
$log
```
Flickr APIを使って飯テロ画像を返すLINE BOTを作った

# このBOTがすること
Flickrからジャンクな食べ物(カレー、ラーメンなど)で画像を検索して、ランダムに一つを返す。
ユーザーが送ったメッセージは読まずに捨てる、豪のBOT
![meshi-tero-linebot-screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/120222/d9753c11-f917-62e9-2cd9-7a9f1c44bb6a.png)
(たまに関係のない画像も返ります)

# QRコード
![meshi-tero-linebot-qr.png](https://qiita-image-store.s3.amazonaws.com/0/120222/969847ac-5111-79af-89b9-4d8661f42f1c.png)

# 環境

- AWS t2.nano
- SSLはComodo EcoCert Trial (30日有効)
- [nginx] - [uwsgi + falcon(pythonフレームワーク)]

databaseやqueueは使わないシンプルな構成。
~~Let's encryptの証明書は相変わらず使えないようでした。~~ 
　↑4/22日から使えるようになりました。

# コード
https://github.com/muk-ai/meshi-tero-linebot
メインの処理は下記ファイルにあります。
`falcon/meshi-tero-bot/linebot.py`

# 考慮したこと
LINEというインタフェースの特徴から、画像を返すBOTを作ろうと考えていました。
肝心の画像をどうするのか、適当に取ってくると著作権を侵害してしまうので、
ユーザから画像を受け取って加工するか、キーワードを受け取って生成するか、どうしようかと
思っていたところ、Flickr APIではクリエイティブ・コモンズ・ライセンスの画像を指定して
取得できることがわかり、こちらを使うことにしました。

# できそうなこと
飯テロの名に恥じぬように改良できそう。

- BOTに対して発言があった場合に、登録ユーザー全員に画像を返す
- 夜になると連続して登録ユーザーに画像を返す
- ~~LINEのグループにBOTを召喚する~~ できないようです(´・ω・`)
Node.jsのCron実行で`NodeMoment Timezone has no data for Japan/Tokyo.`


Node.jsで定期実行する際に[cronパッケージ](https://www.npmjs.com/package/cron)を使うことがあります。


```bash
$ npm i cron
```

```app.js
'use strict'

const CronJob = require('cron').CronJob;

new CronJob('*/1 * * * * *', () => {
	//処理
}, null, true, 'Japan/Tokyo');
```

実行すると

```
Moment Timezone has no data for Japan/Tokyo. See http://momentjs.com/timezone/docs/#/data-loading/.
```

と警告がでました。

↓

```app.js
'use strict'

const CronJob = require('cron').CronJob;

new CronJob('*/1 * * * * *', () => {
	//処理
}, null, true, 'Asia/Tokyo');
```

こうすると治ります。

どこかの記述で`Japan/Tokyo`って見た気がしたんだけど...苦笑
Windows 7 の Jenkins の E-mail 通知設定で IPv4/IPv6 関係で SMTP サーバーに接続できない

# 環境

環境は以下の通り。

* Windows 7 SP1 64bit
* Java 8 Update 77
* Jenkins 1.655

# 問題

E-mail 通知を設定してテストメールを送信すると以下のエラーとなる。

```
java.net.SocketException: Network is unreachable: connect
```

# 対策

"java.net.SocketException: Network is unreachable: connect" でググって以下の URL 先を発見。

"Java7とJavaMail - H.L.B. /* hyper@shのLog Book */"
http://hyperash.hatenablog.com/entry/2014/12/18/233706

> どうもJava7になってから、IPv6のネットワークアダプタが存在する場合にそっちを優先的に使おうとするようですね。WindowsはXPの頃からIPv6がデフォルトで（使ってなくても）設定されますから。

URL 先と同じように Java 起動時オプションを追加する。
C:\Program Files (x86)\Jenkins\jenkins.xml に以下のように追加して Jenkins サービスを再起動して解決。

```xml
<arguments>... -Djava.net.preferIPv4Stack=true ...</arguments>
```
OAuth クライアント IDを作成してみよう

## はじめに

Google APIを使用するためにOAuth クライアント ID(認証情報)を作成してみました。

この記事では認証情報の作成を紹介します。

OAuth 2.0ワークフローに従えば、その認証情報を使ってGoogle APIを叩けるはずです。

ですが、今回はアクセストークンやリクエストトークンなどについては触れていません。

## プロジェクトを作成する

まず、Google Developers Consoleでプロジェクトを作成する必要があります。

今回のプロジェクト名はtest-mochiです。

## 認証情報を作成する

まず、サイドバーの認証情報をクリックします。

![スクリーンショット 2016-04-21 1.34.14.png](https://qiita-image-store.s3.amazonaws.com/0/29884/ff4b92b7-cf12-dc17-618b-7ffa50ad9bab.png)

そして、「認証情報を作成」ボタンをクリックします。

![スクリーンショット 2016-04-21 1.37.03.png](https://qiita-image-store.s3.amazonaws.com/0/29884/4d7a4534-6f86-9d83-61a5-7894f63796eb.png)

目的に合ったものを選択します。

今回は「OAuth クライアント ID」を選択します。

![スクリーンショット 2016-04-21 1.37.52.png](https://qiita-image-store.s3.amazonaws.com/0/29884/6fd25b9c-3b0a-b97e-1846-2684805a231a.png)

同意画面を設定していないと、同意画面を設定するように促されます。

同意画面というのはユーザーに許可を頂く画面のことです。

たとえば、Qiitaのログイン画面の「Twitterで新規登録/ログイン」をクリックしたときに表示されるページです。

メールアドレスとサービス名は必須ですが、ホームページURLなどは任意でした。

同意画面を設定すると、次のようになります。

![スクリーンショット 2016-04-21 1.40.51.png](https://qiita-image-store.s3.amazonaws.com/0/29884/b1e336e8-b15a-c21d-ee1c-e560d2f5ac8a.png)

目的に合ったものを選択します。

![スクリーンショット 2016-04-21 1.43.34.png](https://qiita-image-store.s3.amazonaws.com/0/29884/7f371d05-1a6f-b208-7747-70b4ae502e63.png)

名前は必須ですが、承認済みのリダイレクトURL(多分、コールバックURL)などは任意でした。

「作成」ボタンをクリックすると、「クライアント ID」と「クライアント シークレット」が作成されます。

## 参照URL

- [Using OAuth 2.0 to Access Google APIs  |  Google Identity Platform  |  Google Developers](https://developers.google.com/identity/protocols/OAuth2)
- [OAuthプロトコルの中身をざっくり解説してみるよ](http://yuroyoro.hatenablog.com/entry/20100506/1273137673)

以上
Tera Term等と比べたPoderosaの利点

Windowsのターミナルソフトとしては、`Tera Term`、`PuTTY`、`Poderosa`、`RLogin`などがあります。
知名度としてはTera Term、最近の人気としてはRLoginが高いようですが、
今回はPoderosaの利点、ダウンロード方法、おすすめの設定方法、使い方について説明します。

# Poderosaの利点
最も大きな利点は、タブ機能があることです。
1つのウインドウ内に、複数の接続を開くことが出来ます。
![poderosa_image.png](https://qiita-image-store.s3.amazonaws.com/0/101999/88a29fa0-2cd3-63ff-5d34-905873aacce1.png)


Alt+Hで上下に分割、Alt+Jで左右2つに分割します。
分割を結合するときは、Alt+Uです。

# Poderosaのダウンロード
以下からダウンロードできます。
執筆時点のバージョンは4.3.16です。
https://sourceforge.net/projects/poderosa/files/beta/

zipファイルを解凍した中にある、`Poderosa.exe`が実行ファイルです。
インストールは不要です。


# 設定方法
使いやすくするためにいくつか設定を行います。

まずは**ツール** > **オプション** を開きます。

**表示**にて、背景色、テキスト色、フォントを設定します。
背景色は黒、テキスト色は白、フォントの大きさは16ptくらいが個人的には見やすいです。

**ターミナル**にて、`英数字に追加する単語構成文字`を`.$-`と設定します。
文字をダブルクリックすると単語を選択するのですが、上記の文字を区切りと見なさなくなります。
例えば、`incr-0.2.zsh`のような文字列をダブルクリックで選択できます。


**操作**にて、右クリックの動作を`貼り付け`にし、`マウスで選択したら自動的にコピー`にチェックをします。
マウスで選択した範囲がクリップボードにコピーされ、右クリックで貼り付けが出来ます。

**コマンド**にて、ショートカットキーを設定出来ます。
私はよく使う以下のキーを、このように設定しています。
Vimを使わないのであれば、貼り付けはCtrl+Vの方が使いやすいと思います。

| 動作 | キー |
|:-----------:|:------------:|
| 貼り付け | Alt+V |
| 前のタブ | Ctrl+N |
| 次のタブ | Ctrl+M |
|Telnet/SSH接続 | Alt+N |
|接続の複製/再接続 | Alt+R |

# 使い方
## 接続設定をファイルに保存しよう
**ファイル** > **接続へのショートカットを保存** で一度行った接続を
ファイルに保存することが出来ます。**.gts**という形式で保存されます。

poderosaを開いて、ウインドウにgtsファイルをドロップアンドドラッグをすると、
ホスト名、ユーザー名などが入った状態で接続設定が開きます。
でも、gtsファイルをクリックしただけでは接続設定が開きません。

クリック時に接続設定を開くようにするためには、追加で設定が必要です。
レジストリを書き換えますので、自己責任でお願いします。

1. gtsファイルを右クリックして、**プログラムから開く** を実行し、Poderosaを関連づける
2. Windowsのスタートボタンを押し、**プログラムとファイルの検索**で`regedit.exe`と入力し、レジストリエディタを開く
4. **コンピューター\HKEY_CURRENT_USER\Software\Classes\gts_auto_file\shell\open\command**の中にあるファイルを右クリックして修正
5. `～\Poderosa.exe" -open "%1"`というように**-open**を追加（-open以外は変えないです）して、OKを押す

これで設定は完了です。gtsファイルをクリックしてみてください。
接続設定が開けば成功です。

認証方法を`パスワード`にした場合は、ここでパスワードを入力する必要がありますが、
認証方法で`公開鍵`を選択し、鍵ファイルを選択してログインした状態で保存すれば、
パスワードを毎回入れる必要なく、Enterを押すだけでログインが出来ますので、オススメです。
鍵は、**ツール** > **SSH鍵作成ウィザード** から作成できます。


ちなみに私は、[Orchis](http://www.forest.impress.co.jp/library/software/orchis/)というランチャーソフトを使っていまして、
Ctrlキー2回連打でOrchisを起動し、そこからgtsファイルを選択できるようにしています。

## サーバー毎に背景色、テキスト色を変えよう
接続した状態で**コンソール** > **表示プロファイルの編集**を実行すると、
サーバー接続単位で、ターミナルの背景色、テキスト色などを設定できます。

個人開発環境、総合開発環境、本番環境などで色を変えておくと、
サーバーの間違いによる操作ミスを防ぎやすくなります。