OmniAICreator/Qiita-1.07M huggingface dataset:
Java POIでWord(.docx)ファイルを作る

## はじめに
事前に以下のライブラリを用意します。

- Apache POI
    - https://poi.apache.org/download.html
    - ※"poi-bin-3.16-20170419.tar.gz"のリンクからダウンロード

今回のサンプルは以下のjarがあれば動作します。

- poi-3.16.jar
- poi-ooxml-3.16.jar
- poi-ooxml-schemas-3.16.jar
- xmlbeans-2.6.0.jar
- commons-collections4-4.1.jar

## 実装例

今回のサンプルでは以下の機能を確認します。

- 複数の段落を作る
- 段落にスタイルの異なる文字列を複数配置する
- 表を作る
- 表のセルの中に複数の段落を作る
- 表のセルの中の段落にスタイルの異なる文字列を複数配置する

少しあっさりしていますがまずはこれぐらいで。
動作確認しやすいようにmainメソッドで実行できるようにしてあります。

```java:DOCXWriteTest.java
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFTable;

/**
 *
 * @author tool-taro.com
 */
public class DOCXWriteTest {

	public static void main(String[] args) throws FileNotFoundException, IOException {

		String outputFilePath = "out.docx";
		XWPFDocument document = null;
		XWPFTable table;
		XWPFParagraph paragraph;
		XWPFRun run;
		FileOutputStream fout = null;

		try {
			document = new XWPFDocument();

			//普通の段落を2つ作る
			for (int i = 0; i < 2; i++) {
				paragraph = document.createParagraph();

				//それぞれの段落の中に色の異なるテキストを2種配置する
				//setText内で\nを指定しても改行されないので注意、改行するには必ず段落を作る
				run = paragraph.createRun();
				run.setFontFamily("ＭＳ ゴシック");
				run.setText("黒のテキスト");

				run = paragraph.createRun();
				run.setFontFamily("ＭＳ ゴシック");
				run.setColor("ff0000");
				run.setText("赤のテキスト");
			}
			//2x2の表を作る
			table = document.createTable(2, 2);
			for (int i = 0; i < 2; i++) {
				for (int j = 0; j < 2; j++) {
					//それぞれのセルの中に段落を2つ作る
					for (int k = 0; k < 2; k++) {
						//セルには初期状態で1つの段落がある(実装が変わるかもしれないので念のため存在数を確認して適切に処理)
						if (table.getRow(i).getCell(j).getParagraphs().size() > k) {
							paragraph = table.getRow(i).getCell(j).getParagraphs().get(k);
						}
						else {
							paragraph = table.getRow(i).getCell(j).addParagraph();
						}

						//それぞれの段落の中に色の異なるテキストを2種配置する
						run = paragraph.createRun();
						run.setFontFamily("ＭＳ ゴシック");
						run.setText("黒のテキスト");

						run = paragraph.createRun();
						run.setFontFamily("ＭＳ ゴシック");
						run.setColor("ff0000");
						run.setText("赤のテキスト");
					}
				}
			}

			//ファイル出力
			fout = new FileOutputStream(outputFilePath);
			document.write(fout);
		}
		finally {
			if (fout != null) {
				try {
					fout.close();
				}
				catch (IOException e) {
				}
			}
			if (document != null) {
				try {
					document.close();
				}
				catch (IOException e) {
				}
			}
		}
	}
}
```
## 動作確認

```
$ javac DOCXWriteTest.java
$ java DOCXWriteTest
```
作成されたファイルはこんな感じになりました。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/111947/39885392-7b98-f529-797e-1b7c0865ce66.png)
## 環境
- 開発
	- Windows 10 Pro
	- JDK 1.8.0_131
	- NetBeans IDE 8.2

- 動作検証
	- CentOS Linux release 7.3
	- JDK 1.8.0_131

上記の実装をベースにWebツールも公開しています。
[Diff(テキスト差分チェック)｜Web便利ツール@ツールタロウ](http://tool-taro.com/diff/)
Vagrant+RancherOS,Ubuntu

## 参考

* [Vagrant box rancherio/rancheros | Atlas by HashiCorp](https://atlas.hashicorp.com/rancherio/boxes/rancheros)
* [RancherOSをCDブートで運用 - Qiita](http://qiita.com/tukiyo3/items/548d67b5aa5a308aac40)
* [vDevices/Vagrant-LinuxDesktop · GitHub](https://github.com/vDevices/Vagrant-LinuxDesktop/blob/master/Vagrantfile)

## 起動

```rb:Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.box = "rancherio/rancheros"
end
```

```bash:ubuntuコンソールに切り替え
vagrant up
vagrant ssh

sudo ros service enable ubuntu-console
sudo reboot
```

* ubuntuイメージを引っ張ってくるので5分ほど待つ

```bash:
vagrant ssh
```

----

# Ubuntu

* [ubuntu/trusty64](https://atlas.hashicorp.com/ubuntu/boxes/trusty64)が更新頻度が高く、一番人気なのでこっちを使ったほうが良さそう

```rb:Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu"
  config.vm.provision :shell, :path => "provision.sh"
  config.vm.network :forwarded_port, host: 3000, guest: 80

  config.vm.provider "virtualbox" do |vb|
    vb.gui = false
    vb.customize ["modifyvm", :id, "--paravirtprovider", "kvm"]
    vb.customize ["modifyvm", :id, "--memory", "2048", "--cpus", "2"]
    vb.customize ["modifyvm", :id, "--accelerate3d", "on"]
  end
end
```

## provision

```bash:provision.sh
## locales
echo "ja_JP.UTF-8 UTF-8" > /etc/locale.gen
locale-gen ja_JP.UTF-8
update-locale LANG=ja_JP.UTF-8

## timezone
echo "Asia/Tokyo" > /etc/timezone 
dpkg-reconfigure -f noninteractive tzdata

## sources.list
sed -i -e 's@http://archive@http://jp.archive@g' /etc/apt/sources.list
apt-get update
apt-get install -y compiz lxde

## compiz settings
mkdir -p /home/vagrant/.config/lxsession/Lubuntu/
cat > /home/vagrant/.config/lxsession/Lubuntu/autostart <<EOF
@/usr/bin/compiz --replace
EOF
```

```bash:
vagrant provision
```
FuelPHPでHttpNotFoundExceptionがキャッチされない！？

どうも、なめこです。
HttpNotFoundExceptionを継承して**新しい例外**を作ったときのお話しです

# HttpNotFoundExceptionのおさらい

FuelPHPでは

```php
throw new HttpNotFoundException;
```

のようにHttpNotFoundExceptionをthrowすることにより、
404ページを出せる仕様になっています！
HttpServerErrorExceptionなら500ですね。

http://fuelphp.jp/docs/1.7/general/error.html

自アプリケーションの
fuel/app/views/下に
404.phpや500.phpを置いていなければ、
fuel/core/viewsの
404.phpと500.phpのページが出力されます

# HttpNotFoundExceptionを継承してみた

namekoパッケージに作りました。(今回はパッケージに作ってみた例です）

```php|packages/nameko/classes/httpnotfoundexception.php
<?php
namespace Nameko;

class HttpNotFoundException extends \Fuel\Core\HttpNotFoundException{}
```

```php|packages\nameko\bootstrap.php
<?php
Autoloader::add_namespace('Nameko', __DIR__.'/classes/');
```

Nameko\HttpNotFoundExceptionの出来上がりです。
上の例では継承してるだけですが、実際は必要処理を実装してます。

# スローとキャッチ

welcomeコントローラから飛ばしてみよう

## スロー

```php|app/classes/controller/welcome.php
<?php
public function action_index()
{
    // 強制的に例外発生！
    throw new Nameko\HttpNotFoundException();

    return Response::forge(View::forge('welcome/index'));
}
```

## キャッチ

どこにキャッチされるかというと、最終的にはpublic/index.phpです。
必要な部分だけ抜粋してます

```php|public/index.php
<?php
try
{
	// Boot the app...
	require APPPATH.'bootstrap.php';
	// ... and execute the main request
	$response = $routerequest();
}
catch (HttpNoAccessException $e)
{
	$response = $routerequest('_403_', $e);
}
catch (HttpNotFoundException $e)
{
	$response = $routerequest('_404_', $e);
}
catch (HttpServerErrorException $e)
{
	$response = $routerequest('_500_', $e);
}
```

HttpNotFoundExceptionありますね！。

# キャッチできません

HttpNotFoundExceptionのところではキャッチできません。
キャッチされず、core/classes/error.phpあたり(違ってたらごめんなさい)の最終的な例外を制御してる処理に流れていきます。

そのため、オリジナルで用意した404ページをルーティング（_404_)に設定しても
それを表示させることはできません。

# 解決方法

```php|packages/nameko/classes/httpnotfoundexception.php
<?php
namespace Nameko;

class HttpNotFoundException extends \HttpNotFoundException{}
```

\Fuel\Core\HttpNotFoundExceptionではなく、\HttpNotFoundExceptionを継承します
この修正で、public/index.phpにcatchされます

# \Fuel\Core\HttpNotFoundExceptionがキャッチできない理由


```php|public/index.php
<?php
// 抜粋
catch (HttpNotFoundException $e)
{
	$response = $routerequest('_404_', $e);
}

```


このHttpNotFoundExceptionの型とは、
グローバル名前空間のHttpNotFoundExceptionクラスです。

\Fuel\Core\HttpNotFoundExceptionとは、Namespace的に別物です。
なので
catch (HttpNotFoundException $e)
でキャッチできるのは
グローバル名前空間のHttpNotFoundExceptionになります

try catch の catch の型チェックでは
$eのオブジェクトの型（親含め）とグローバル名前空間のHttpNotFoundExceptionの型を比較します

$eのオブジェクトの型に、グローバル名前空間のHttpNotFoundExceptionが存在しなければ
キャッチされないことになります。

# 結論

FuelPHPでは、コアクラスの拡張方法があります。
素直にHttpNotFoundExceptionもコア拡張していれば、名前空間の問題に悩むことはなかったですね
ただ、コア拡張したくないときもありますので、
その時は名前空間には注意しましょう！
AndroidStudioのappフォルダ以下にあるフォルダ

AndroidStudioを始めたばかりなので、
基本的なところからのメモです。

AndroidStudioを起動後、
左側に出てくるファイル群（プロジェクト・ツールウィンドウ）にある、
appフォルダ以下のフォルダについて、
主なフォルダは以下の3つ。

- [ ] **manifests**：
アプリケーションの定義ファイルが保存されている
 
- [ ] **java**
Javaのソースが保存されている

- [ ] **res**
使用する画像ファイルなどが保存されている

#manifests
- [ ] アイコンのファイル名
- [ ] アプリケーションの名前
- [ ] 画面名　など

#java
- [ ] ソース置き場。
- ボタンタップ時の処理　など

#res
- [ ] 画像ファイル
- [ ] 画面のレイアウト（xml）
- [ ] メニューボタン関連
- [ ] 文字列やスタイル値を定義　など
- layout ＞ activity_main.xmlなど：画面の見た目を設定
- mipmap：アイコン画像などを入れる
- colors.xml：色をここで設定後、ボタンに紐付け色を変える、など
- strings.xml：ボタン名をここで設定後、それをボタンに紐付けボタン名表示、など
sudo で書き込みをしたい

以前 Rake で Docker コンテナを管理するためのテンプレート権ツールを作成した。

その機能のひとつとして Docker のホスト側に Nginx 用のリバースプロキシを設定するものがあった。設定後はコンフィグを自動的に読み直す。

これらの処理には root 権限が必要だった。権限はスクリプト中の `sudo` コマンドで得ていた。

```ruby:failed_sudo_write.rb
sh "sudo echo -e \"$data\" > /path/to/nginx/config"
sh 'sudo service nginx reload'
```

実行するとエラーが起きた。

権限エラーだ。

Rake 経由だと `sudo` が使えないのだろうか。だが、一応 1 行目を消して実行してみたら無事に Nginx コンフィグがリロードされた。

なぜ。

この問題はスクリプトの中で `sudo` を使わないようにして Rake 自体を `sudo` で実行すれば解決する。

しかし今回のツールでは、全ての処理に管理者権限が必要なわけではない。普段権限なしで実行していて特定の場面でだけエラーが起きるのは、たぶん数ヵ月後に出会うと小さなストレスだ。

必要になればパスワードを求める仕様にしたかった。

`sudo` 経由で書き込むことが今回の目的だ。

環境
----

- Ubuntu 15.04
- sudo 1.8.9p5
- Ruby 2.2.3p173
- Rake 10.5.0

状況と目的の再定義
----

序文が不必要に長くなった上に Rake 依存の問題のように読めなくもないので、改めて状況を説明する。

Bash で再現するとこういう状況。

```bash
$ touch rootfile
$ sudo chown root:root rootfile
$ sudo echo 1 > rootfile
bash: rootfile: Permission denied
```

`sudo` を使って root 権限で書き込むのが本記事の目的。

解決方法
----

いくつか試して、目的を達成できた方法を書いていく。

### 1. `mv`

最初にやったのはこの方法。

```bash:sudo_write1.sh
echo 1 > rootfile.temp
sudo mv rootfile.temp rootfile
```

書き込みたい内容を一時ファイルに保存して、それを `mv` によって目的の場所に移動、または上書きする。

でもこれだと所有者情報に違和感があるし (`sudo` 付きで `echo` で実行しても、書き出したファイルの所有者は `sudo` を実行した元ユーザーのものになる) 、既存のファイルに上書きする場合は inode も変わってしまう。

どちらも今回の処理では問題にならないが、別の処理では問題になる可能性がある。余計な変化はできるだけ避けたい。

### 2. `tee`

`sudo` に頼った書き込みをする場合、必ず一度はシェル用のコマンドを使うことになる。

そこでまず思いついたのは `echo` や `cat` とリダイレクト記号 `>` を組み合わせたものであり、そのつまずきが序文での出来事だ。

他にビルトインで書き込みができるものは何かないか、と探してみると `tee` があった。

```bash:sudo_write2.sh
echo 1 | sudo tee rootfile
```

標準出力が気になる場合は _/dev/null_ に捨てる。

### 3. `sh -c`

どうやら `sudo` ではリダイレクトを使った書き込みが出来ないらしい。

先日の記事「[sudo 時に root 権限で実行されてるかを確認する](http://qiita.com/jiz/items/bedf6115f892f4fde8de)」を書いたときに知ったのだが、この仕様は `man sudo` でも触れられている。

> To make a usage listing of the directories in the /home partition.  Note that this runs the commands in a sub-shell to make the cd and file redirection work.
> `$ sudo sh -c "cd /home ; du -s * | sort -rn > USAGE"`

この例のように `sudo sh -c` の中にリダイレクト処理を含めれば、問題なく書き込みができる。

```bash:sudo_write3-1.sh
sudo sh -c 'echo 1 > rootfile'
```

標準入力も扱える。

```bash:sudo_write3-2.sh
echo 1 | sudo sh -c 'cat - > rootfile'
```

### 4. `ruby -e`

おまけ。

今回自分がぶつかったケースの場合 Rake を使っているということで、当然そこには Ruby の実行環境がある。

以下のようにすれば `sudo` 経由で Ruby の機能を使って書き込みができる。

```bash:sudo_write4.sh
echo 1 | sudo ruby -e "File.write('rootfile', STDIN.read)"
```

Ruby で記述する場合はこう。

```ruby:sudo_write4.rb
IO.popen("sudo ruby -e \"File.write('rootfile', STDIN.read)\"", 'w') do |io|
  io.puts('1')
end
```

ただし `sudo` は基本的に環境変数を引き継がない。引き継ぐようにもできるが、面倒くさい。

rbenv などでユーザーローカルに Ruby をインストールしている場合はその面倒事をやるか、 `sudo` 経由で呼び出している `ruby` の部分をフルパスに書き換える必要がある。

開発環境や、開発環境をまたいで使う場合には向かない。

まとめ
----

使うとしたら 2 か 3 だろうか。
rubyでインスタンスのメソッドを上書きする(もしくはwrapする)

どこかで記事をみた気がしたが見つからなかったので一応メモ

```ruby
class Sample
  def hello
    :hello
  end
end

sample = Sample.new
sample.hello # hello

# ここがミソ
sample.instance_eval { alias :original_hello :hello }
sample.define_singleton_method(:hello) { "wrapped #{original_hello}" }
# もしくは(コメントいただいて追記しました)
def sample.hello
  "wrapped #{super}"
end

sample.hello # wrapped hello

Sample.new.hello # hello
```

具体的にはrailsでcookiesがwriteされるときにフックして処理したかったが
うまい方法が思いつかなかったのでとりあえずこれで回避したという...
誰かうまい方法教えてください...

`ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-darwin14]`
画面遷移図をSketchで書き始めるときの手順

## はじめに
画面遷移図を描くといっても自分の場合は開発メモ程度のものである

## Artboardから適当に選ぶ
Sketchが起動したら`a（ショートカットキー）`をタイプしてArboardが操作できる画面にする。
あとで入りきらなくなったら適当にArtboardの大きさを変えたりするので適当に選ぶ。
(最近はA4なんかも良い気がしてきた)

![Screen Shot 2016-02-18 at 1.27.50 PM.png](https://qiita-image-store.s3.amazonaws.com/0/27895/e84896d3-0fcc-f466-acbf-771cf64c0083.png)


## Artboardを選んだらArtboardに色を付ける
真っ白だと目がつらいのでArtboardを選んだら
`Ctr + c`でカラーピッカーを出してその辺りから適当に灰色を選ぶ。

## 後は絵を描いていく
あとは絵を描いていく。
`r（ショートカットキー）`などで絵を描いていく。
Sketch自体にショートカットキーを登録することができないので、下記のように
`矢印の描画`と`デフォルトスタイルに登録`はMacのキーボードショートカットで登録してある。
![Screen Shot 2016-02-18 at 1.21.21 PM.png](https://qiita-image-store.s3.amazonaws.com/0/27895/ed62a473-cd80-369f-c7fc-4dea0005b3d9.png)

頻繁につかうスタイルが出てきたら`Ctr + D`などして適時図を描きやすくする。
Symbolとかも随時使っていけばよい。

## 出来上がったらArtboardをExport
File->Export Artboards to PDF
でExportする。
EP 3 Know the Differences Between bytes, str, and unicode



> - In Python 3, bytes contains sequences of 8 bit values, str contains sequences of Unicode characters. bytes and str instances cannot be used together with operators such as < or +
- In Python 2, str contains sequences of 8-bit values, unicode contains sequences of Unicode characters. str and unicode can be used together with operators if the str only contains 7-bit ASCII charactoers.
- Use helper functions to ensure that the inputs you operate on are the type of charactoer sequence you expect(8-bit vlaues, UTF-8 encoded characters, Unicode characters, etc)
- If you want to read or write binary data to/from a file always open the file using a binary mode(like 'rb' or 'wb')

> Effective Python

## Helper function to ensure str or bytes

```python
def to_str(bytes_or_str):
    if instance(bytes_or_str, bytes):
        value = bytes_ot_str.decode('utf-8')
    else:
        value = bytes_or_str
    return value
    
    
def to_bytes(bytes_or_str):
    if isinstance(bytes_or_str, bytes):
        value = bytes_or_str).encode('utf-8')
    else:
        value = bytes_or_str
    return value
```
ATOM付属のnpmを使いたかった

僕のPCにはATOMは入っていますが、nodeは入っていません。
そんな中npmを使いたい場面に遭遇したのですが、インストールするとなると申請があったりして面倒です。

そんなところへ「ATOMには専用のnodeとnpmが入っている」との噂が！
じゃぁそこにパス通せば使えるじゃん、と軽く考えたら失敗したので恥をさらしておこうと思います。

### 環境

* OS : Windows8.1 Pro
* Atom : 1.5.3
* atom.cmd へのパス : `%HOMEPATH%\AppData\Local\atom\bin`


### apm バージョン確認
まずはapmと噂のnodeのバージョンを調べます

```bat
> apm -v
apm  1.6.0
npm  2.13.3
node 0.10.40
python 2.7.10
git 2.6.3.windows.1
visual studio 2013
```

### npm はどこだ!?
atom.cmd の中身は最新バージョンのatom.cmdを呼ぶというシンプルなものですのでこれにならいましょう。
アップデートのたびにメンテとかしたくないですしね。
というわけで、npmの実行ファイルを探します。
適当にあたりをつけながら探したところ↓にありました。
`{atom.cmdのパス}\..\app-1.5.3\resources\app\apm\node_modules\npm\bin\npm.cmd`

atom.cmdをもとにして完成。
もしかして僕って天才だったのかな...!

```bat:npm.cmd
@echo off
for /F "tokens=3 delims=\ usebackq" %%v in (`findstr "app-[0-9]\.[0-9]\.[0-9]" atom.cmd`) do set ver=%%v
"%~dp0\..\%ver%\resources\app\apm\node_modules\npm\bin\npm.cmd" %*
```
↓

```bat
'node' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
```

ま、まぁ天才だって1度や2度の失敗はね。つきものですよ。

### node はどこだ!?
先ほど見つけたnpm.cmdの中身を見てみると、node.exeがない場合はnodeコマンドを試しているよう。
それでさっきのエラーですね。
原因がわかったので、慣れた手つきでnode.exeを呼ぶcmdを作成します。
実行ファイルは `{atom.cmdのパス}\..\app-1.5.3\resources\app\apm\bin\node.exe` にありました。

やっぱり天才なのかもしれない...!

```bat:node.cmd
@echo off
for /F "tokens=3 delims=\ usebackq" %%v in (`findstr "app-[0-9]\.[0-9]\.[0-9]" atom.cmd`) do set ver=%%v
"%~dp0\..\%ver%\resources\app\apm\bin\node.exe" %*
```
↓

```bat
> node -v
v0.10.40
```
ほらね。余裕ですわ。

では、本題の...

```bat
> npm -v

module.js:340
    throw err;
          ^
Error: Cannot find module 'C:\Users\XXXX\AppData\Local\atom\app-1.5.3\resources\app\apm\node_modules\npm
\bin\node_modules\npm\bin\npm-cli.js'
    at Function.Module._resolveFilename (module.js:338:15)
    at Function.Module._load (module.js:280:25)
    at Function.Module.runMain (module.js:497:10)
    at startup (node.js:119:16)
    at node.js:935:3

```

あっ、ふーん。

### npm がつかえる…! (2016/2/22追記)

コメントをいただきまして、npmを下記に修正したところ無事動きました(ように見えます)。
こう、さっと正解だけ出すスタイルかっこいいです。

```bat:npm.cmd
@echo off
for /F "tokens=3 delims=\ usebackq" %%v in (`findstr "app-[0-9]\.[0-9]\.[0-9]" atom.cmd`) do set ver=%%v
node "%~dp0\..\%ver%\resources\app\apm\node_modules\npm\bin\npm-cli.js" %*
```

↓

```bat
> npm -v
2.13.3
```
俺のtimestampがこんな挙動なわけがない

timestampの挙動が変わっていてどハマリしたので共有。

# 今回使うテーブル定義

```sql:テーブル作るときに使ったクエリ
CREATE TABLE `foobar` (
  (省略)
  `start_at` timestamp NOT NULL COMMENT '開始日時',
  `end_at` timestamp COMMENT '終了日時',
  (省略)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
```

# 事件の発端

end_at に値してないのに現在時刻が入っているよ？
という思ってたんと違う挙動をしてたのでいろいろ調べた。

ちなみにこれ自体は勘違いで、NULLのつもりだったけど
実際はNULLもNOT NULLも指定していないので、結果的にNOT NULLになるので正しい挙動。

# 調査した

`show create table` でとってみたら下記のような状態になっていた。

```sql:実際に動いていたもの
CREATE TABLE `foobar` (
  (省略)
  `start_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '開始日時',
  `end_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '終了日時',
  (省略)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
```

**start_at:**
指定してないのに `DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP`
が勝手に追加されていた。
プログラム上、値が絶対に入ることになっていたからどっちでもよかったけど、
想定してたものと挙動が変わるのは怖い。
しかもほかで `DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP`使ってたので影響あり。

**end_at:**
`NOT NULL DEFAULT '0000-00-00 00:00:00'` が勝手に追加されてた。
`NOT NULL`が設定されたのは`NULL`, `NOT NULL`の指定をしてなかったから。
`DEFAULT '0000-00-00 00:00:00'`は上と同様の挙動で追加されたけど、
`DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP`をもうセットしてたから
`DEFAULT '0000-00-00 00:00:00'`になったと思われる。

#検証1 マイグレーションツールを使ってたせい

## 仮説
手動でクエリ叩いたわけじゃなくて、マイグレーション使ってたせいでは？

## 結果
手動でも変わらない

#検証2 カラム名のせい

## 仮説
◯◯atって名前が原因では？
Railsとかで create_at とかよくあるし

## 結果
カラム名を変えて書き換えてみたが変わらなかった

```sql
ALTER TABLE request CHANGE start_at start_time timestamp NOT NULL COMMENT '開始日時';
ALTER TABLE request CHANGE end_at end_time timestamp COMMENT '終了日時';
```

#検証3 デフォルト値が必須になった

## 仮説
timestampはデフォルト値を入れないと勝手に設定されるようになったのでは？

## 結果
デフォルト値を設定したらうまくいった

```sql
ALTER TABLE request CHANGE start_at start_at timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '開始日時';
ALTER TABLE request CHANGE end_at end_at timestamp NULL DEFAULT NULL COMMENT '終了日時';
```


## ググった

MySQL 5.6からtimestamp 型の暗黙的なデフォルト値は非推奨とのことで、
5.6.6からの警告も出るようになったらしい
[MySQL :: MySQL 5.6 Reference Manual :: 5.1.4 Server System Variables](http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_explicit_defaults_for_timestamp)

参照元:
http://www.mk-mode.com/octopress/2013/05/31/mysql-5-6-timestamp-default-warning/

(#ﾟДﾟ)ｺﾞﾙｧ!! しらんがな！！

# 教訓

- MySQLがマイナーバージョンアップしたらドキュメントはとりあえず隅々まで読んでおく！！
- ユニットテストでDBにデータがきちんとInsertされたらOKにしない。Insertされた中身もチェックする (DBの仕様変更で影響が出る場合あり)
CodeIQ「『プラス・マイナス・ゼロ』問題」に挑戦しました。

[CodeIQ「『プラス・マイナス・ゼロ』問題」](https://codeiq.jp/q/2611)の掲載期間が終了したということで、わたしが提出したRubyコードを公開したいと思います。

```rb
@n = gets.to_i
@memo = Array.new(@n + 1){Hash.new}

def g(n, s)
   @memo[n][s] ||= if n == 1
        (s == 1 || s == -1) ? 1 : 0
    else
        g(n - 1, s - n) + g(n - 1, s + n)
    end
end

p g(@n, 0)
```

ちょっとごちゃごちゃしていますね……。反省。とりあえず大事なのはメソッド`g(n, s)`なので、そこだけを追いかけてもらえれば。

合計がsとなるように1からnの整数を問題文のように組み合わせるとき、その組み合わせ方の総数を$G(n,s)$とします。たとえば$G(3,0)$は合計が0となる1,2,3の組み合わせの総数であり、問題に掲げられた例から$G(3,0)=2$となります。

さてこの関数$G$は再帰的に定義できるはずです。

```math
G(n,s)=G(n-1,s-n)+G(n-1,s+n)
```

あとはこれを初期条件に気を付けつつ、効率化のためにメモ化でもしてやれば答えが求まるというわけですね(´・ω・`)

***

なお具体的な問題の内容については、出題者の[@riverplus](https://twitter.com/riverplus?lang=ja)さんによる解説記事か何かで公開されると思うので、そちらを見てください。公開されたときおぼえていればそのリンクを張り付けておきます。まあ広大なネットの海を探せば見つかると思いますが……。

またほかの方が公開されたコードについては、やはり出題者の[@riverplus](https://twitter.com/riverplus?lang=ja)さんがTogetterにまとめてくださるそうです。そちらも公開され次第、この記事にそのリンクを張り付けたいと思います。おぼえていれば(´・ω・`)

__2016/02/18追記:__ [Togetterですが公開されておりました!](http://togetter.com/li/933510)
EP 2 Follow the PEP 8 Style Guide


> - Always follow the PEP 8 style guide when writing Python code.
- Sharing a common style with the larger Python community facilitates collaboration with others.
- Using a consistent style makes it easier to modify own code later

> Effective Python

PEP 8
https://www.python.org/dev/peps/pep-0008/


lint
https://github.com/PyCQA/pep8
https://www.pylint.org/
開発環境ごとの NAN isnan

開発環境によって NAN と isnan の実装が異なることがあります。
この違いをまとめた記事は見つけられなかったので、調べた結果を残します。

# 調査環境
## OS
Win7(x64)
## g++ (mingw)
version 4.4.0
## VC(VS2010)
Microsoft Visual C++ 2010   01018-532-2002102-70331

# NAN
非数リテラル。マクロで定義されていたり、定義されていなかったりします。

## g++ (mingw)
NAN が mingw/include/math.h 定義されています。

```cpp
// #include <math.h>
// または
// #include <cmath>
double g = NAN; // g is NAN
```

## VC(VS2010)
Microsoft Visual C++ 2010   01018-532-2002102-70331

NAN は定義されていません。

公式リファレンスでは、以下の実装が記載されています。

```cpp
unsigned long nan[2]={0xffffffff, 0x7fffffff};
double g = *( double* )nan; // g is NAN
```

（ https://msdn.microsoft.com/ja-jp/library/w22adx1s.aspx より引用）

### NANを定義する

g++ライクに定義する場合、これをマクロで定義する方法があります。

```cpp
#ifndef NAN
static const unsigned long __nan[2] = {0xffffffff, 0x7fffffff};
#define NAN (*(const float *) __nan)
#endif
```

（ http://mjhd.hatenablog.com/entry/how-to-define-nan-in-vc より引用）

定義の方法はいくつかあります。
マクロで定義する場合、次のような定義もできます。

```cpp
#ifndef NAN
#include <limits> // numeric_limits<T>::quiet_NaN()
#define NAN std::numeric_limits<double>::quiet_NaN()
#endif
```

（ http://www.cplusplus.com/reference/limits/numeric_limits/ )

このほか、マクロを利用せずグローバルなstatic定数や無名空間定数にする方法もあります。

```cpp
#ifndef NAN
#include <limits> // numeric_limits<T>::quiet_NaN()
const static NAN (std::numeric_limits<double>::quiet_NaN())
#endif
```

```cpp
#ifndef NAN
#include <limits> // numeric_limits<T>::quiet_NaN()
namespace
{
const double NAN ( std::numeric_limits<double>::quiet_NaN() );
}
#endif
```

# isnan
引数が NaN であるかを判定する関数です。
NaNはその性質から比較演算子では比較できない言語が多く、C++においてもisnanを用いて判定します。
マクロやテンプレート関数で定義されています。

http://www.cplusplus.com/reference/cmath/

## g++ (mingw)
isnan が mingw\include\math.h 定義されています。

```cpp
// #include <math.h>
bool result;
result = isnan(NAN);   // result = true (=(bool)1)
result = _isnan(NAN);  // _isnan も定義されている(float.hより)
result = __isnan(NAN); // __isnan も定義されている
```
※ただし、この isnan はマクロである。実際には__isnan が呼ばれている。

include を cmath に変更すると isnan マクロは使えなくなります。
これはincludeファイルが以下に変わるためです。

mingw\lib\gcc\mingw32\4.4.0\include\c++\cmath

その代わりにテンプレートを使用した isnan が利用できます。
ただし、std名前空間に存在しているので注意が必要です。

```cpp
// #include <cmath>
bool result;
//result = isnan(NAN);   // error
result = std::isnan(NAN);   // ok
result = _isnan(NAN);  // _isnan __isnan も同様に使える
result = __isnan(NAN);
```
_isnan __isnan が使えるのは、cmath が math.h を include しているからです。
isnan が使えないのは undef で無効化しているためです。

（ http://sealsoft.jp/namespace.html ）
（ http://sealsoft.jp/namespace.html ）

## VC(VS2010)
float.hに _isnan のみ定義されています。

```cpp
// #include <float.h>
bool result;
unsigned long nan[2]={0xffffffff, 0x7fffffff};
double g = *( double* )nan; // g is NAN
result = _isnan(g);   // result is true (=(bool)1)
```

VS は簡単にしかincludeファイルを追ってないので、これ以上はわかっていません。
【Git】コミットに規約をつくる


##【1コミットに1つの対応】
・Aの機能を追加
・Bの機能のバグを修正
・Cの機能を削除


##【原則】
1 行目にコミットの全体的説明(タイトル)を 50 字以内で記述
2行目は空白行
3行目以降に変更内容の詳細(何をなぜ)を記述する

(英語の場合、1文字目は必ず大文字にすること)

##【1行目の記述フォーマット】
Fix：修正
Add：新規機能（ファイル）追加
Change：仕様変更
Remove：削除（ファイル）

###日本語の場合
【Fix】Aboutページのフッターリンクを修正
【Add】ユーザー数を取得する関数を追加

(日本語は複雑な表現が多いので、文頭に英語の表記を含める)

###マークアップの場合
【**】ページ名 / 説明 の形にする

【Fix】about / フッターリンクを修正
【Add】contact / 住所の欄を追加


##【素晴らしいコミットメッセージを書くための7つのルール】
１、タイトルの後は1行空けて本文を書く
２、タイトルを50字以内におさめる
３、タイトルの文頭を大文字にする
４、タイトルの文末にピリオドを付けない
５、タイトルは命令形で記述する
６、本文は1行あたり72字以内におさめる
７、本文ではどのようにではなく何をとなぜを説明する

##【コミットするまでの流れ】
１、ファイルの変更部分を確認する

```
$ git status
```

２、差分を確認する

```
$ git diff
```

３、indexに登録する

```
$ git add .
```

４、自分がインデックスに追加したものが正しいかどうかを再度確認

```
$ git diff --cached
```

５、コミットする

```
$ git commit -m "全体的説明" -m "(空白)" -m "詳細"
```

６、コミットが追加されているかを確認

```
$ git log
```

##まとめ
最低限必要な命名が(Add,Fix,Modify,Change,Remove)だと思いました。あとは組織内で拡張させてルールを統一すればいいと思います。

重要なことは **チーム内でルール(規約)を統一する** ことだという思考です。



##【勉強を含めた参考文献】
サルでもわかるGit入門
http://www.backlog.jp/git-guide/
Gitのコミットメッセージ
http://qiita.com/itosho/items/9565c6ad2ffc24c09364
git commit するまえに考えるべき10のこと
http://hiroki.jp/2012/09/05/5523/
Gitでコミットする際の改行方法
http://waterkaktos.com/%E5%82%99%E5%BF%98%E9%8C%B2/git-multiple-comment/
コミットするまでの流れ
https://gist.github.com/kurotaky/5483492
良い Commit Messageを書きましょう(翻訳)
https://gist.github.com/esehara/3160352
Gitのコミットメッセージの書き方
http://postd.cc/how-to-write-a-git-commit-message/
Git Pro
http://git-scm.com/book/ja/v2
Gitを学んでいて「なるほど！」となる瞬間
http://postd.cc/aha-moments-when-learning-git/
Git初心者に捧ぐ！Gitの「これなんで？」を解説します。
http://kray.jp/blog/git-why-explanation/
git pull と git pull –rebase の違いって？図を交えて説明します！
http://kray.jp/blog/git-pull-rebase/
[翻訳] 私のコミットをまとめないで
http://qiita.com/gogotanaka/items/8c55f69120965b077737
EP 1 Know Which Version of Python You’re Using.


> - There are two major verions of Python still active use: Python2 and 3
- There are multiple popular runtimes for Python: CPython, Jython, IronPython, PyPy etc.
- Be sure that the command-line for running Python on your system is the version you expect it to be.
- Prefer Python 3 for your next project because that is the primary focus for the Python community.

> Effective Python



```
python --version
```


```python
>>> import sys
>>> print(sys.version_info)
sys.version_info(major=3, minor=5, micro=0, releaselevel='final', serial=0)
>>> print(sys.version)
3.5.0 (default, Oct 11 2015, 02:40:20)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.72)]
```
bashでncの代わりをやってみる

## シチュエーション

TCPでサーバにアクセスしたいが、ncなどがインストールされておらず、bashのみ使えるという状況。(UDP通信にも応用もできると思うが、確認はしていない)

## 経緯

自分の手元にPCが2台あり、1台はWindowsマシンでCygwinがインストールされていて、もう1台にはLinuxがインストールされている。

LinuxからWindowsへssh経由でファイルをコピーしたかったが、Linux側でsshdが起動しなかった。
そこでLinux側でsocatを使ってシェルとソケットをバインドし、そこにWindowsからncで接続、リダイレクトでファイルのコピーをしようとしたがWindowsにはncがインストールされていなかった。

bashを使ってソケット通信ができるということなので、実験したことをまとめる。
(手元にPCがあるんだからUSBとかでコピーすればええやないか、というつっこみは無しで)

## 使用したコマンド

* bash: Linuxに標準インストールされているシェル。Cygwinにもインストールされている。
* socat: ncの上位互換(?)なツール。接続を待ち受けて、コマンドを実行するのに使う。

以後、bashを使うホストを"ホストB"と、socatを使うホストを"ホストS"と呼ぶ。
自分の経緯においては、WindowsがホストB、LinuxがホストSに相当する。

## bashを使ってソケット通信する方法

"/dev/tcp/{IPアドレス or ホスト名}/{ポート番号}"というファイルに対して読み書きすると、それがソケット通信として反映される。
/dev/tcpというファイルは存在しないが、該当ファイルへのアクセスをbashがいい感じに解釈してソケットを割り当ててくれる。

## bashをクライアントとして使う

ホストBで入力したコマンドを、ホストSで実行し、結果をホストBに返す。

### 1. ホストSで接続を待ち受ける

ホストSはsocatで待ち受けておき、ホストBが接続してくるとホストSのシェルを開く。(telnetdの代わりのような使い方)

```shell-session
[S] $ socat tcp-listen:{待ち受けポート番号},reuseaddr,fork exec:/bin/bash
```

### 2. ホストBから接続する

hostnameコマンドを入力し、コマンドを実行したのがホストSであることを確認する。

```shell-session
[B] $ hostname
B
[B] $ exec 3<>/dev/tcp/{ホストSのIPアドレス}/{ホストSの待ち受けポート番号}; echo "hostname" >&3; cat <&3
S
C-cを入力して終了

[B] $
```

ホストSでコマンドを実行すると、以後入力を受け付けてくれなくなる。
ソケットが閉じてしまうのが原因だと思うが、詳しくは分からなかった。

hostnameコマンドに続けて、";"区切りでexitコマンドを入力するとC-cを入力しなくても自動的に終了してくれる。

```shell-session
[B] $ exec 3<>/dev/tcp/{ホストSのIPアドレス}/{ホストSの待ち受けポート番号}; echo "hostname; exit" >&3; cat <&3
S

[B] $
```

### 3. コマンドを連続して入力できるようにする

whileループを使うことにより、連続してコマンドを入力できた。

```shell-session
[B] $ while read cmd; do exec 3<>/dev/tcp/{ホストSのIPアドレス}/{ホストSの待ち受けポート番号}; echo "$cmd; exit" >&3; cat <&3; done
hostname # コマンドを入力
S        # 結果
uname    # 次のコマンドを入力
Linux    # 結果
C-cを入力して終了

[B] $
```

ホストSでコマンドを実行するたびに接続が切れるので、ループのたびにexecを実行する必要がある。
もう少し上手くできないかなぁという感じである。

## bashをサーバとして使う

結論から言って、bash単体で接続を待ち受ける機能は無いらしいので、ncやsocatや各種スクリプト言語の力を借りるしかないと思う。
しかし、リバースシェルとしてなら実現bash単体で実現できるので、それを紹介する。

シチュエーションは、ホストSで入力したコマンドを、ホストBで実行し、結果をホストSに返すというものである。

### 1. ホストSで接続を待ち受ける

機能的にはホストSがクライアントでホストBがサーバであるが、リバースシェルなのであらかじめホストSが接続を待ち受けておく必要がある。
再び、socatを使う。

```shell-session
[S] $ socat tcp-listen:{待ち受けポート番号},reuseaddr,fork stdout
```

### 2. ホストBから接続する

ホストBはホストSからコマンドを読み込み、そのコマンドをホストB上で実行し、結果をホストSに返す。

```shell-session
[B] $ exec 3<>/dev/tcp/{ホストSのIPアドレス}/{ホストSの待ち受けポート番号}; while read cmd <&3; do $cmd 2>&3 >&3; done
```

### 3. ホストSからコマンドを入力する

```shell-session
hostname # コマンドを入力
B        # 結果
```

ホストB上でコマンドを実行できているのが確認でた。

## 参考サイト

[bash - PIB(2015-04-19: ソケット通信)](http://seesaawiki.jp/w/kou1okada/d/bash)
[ncコマンドとbashの/dev/tcpで通信 - suztomoの日記](http://d.hatena.ne.jp/suztomo/20080430/1209574954)
JavaBeans

JavaBeans

#直列化
オブジェクト指向プログラミングにおいて使われる用語で、ある環境において存在しているオブジェクトを、バイト列やXMLフォーマットに変換することをいう。より具体的には、そのオブジェクトの状態を表す変数（フィールド）と、場合によってはオブジェクトの種類（クラス）を表すなんらかの識別子を、ファイル化できるようなバイト列やXMLフォーマットの形に書き出すことをいう。これにより、オブジェクトの表すデータを、ファイルとしてセーブしたり、ネットワークで送信したりすることができるようになる。このようにして得られたバイト列やXMLフォーマットは、直列化復元ないしデシリアライズによって、元のオブジェクトに復元される。

直列化されるクラスは、<font color="#ff0000">java.io.Serializable</font>を
実装しなければならない

#JavaBeansのプロパティ
JavaBeansのプロパティは
インスタンスの属性(特性、特質といった情報)のこと。
<font color="#ff0000">フィールド＝プロパティ</font>
**JavaBeansのプロパティはgetter or setterを作ることで生まれる**

##<font color="#ff0000">WebアプリケーションにおけるJavaBeansの役割は関連する複数の情報をひとまとめにして保持すること</font>

#JavaBeansのルール
・直列化できる(java.io.Serializable)を実装している
・クラスはpublicでpackageに所属する
・publicで引数のないコンストラクタをもつ
・フィールドはカプセル化されている
・命名規則に従ったgetter/setterを持つ

***

[こちらのサイトから抜粋](https://ja.wikipedia.org/wiki/シリアライズ)
Facebook からTwitter への投稿連携について

# やりたいこと

+ プロモーション施策の一つとしてFacebook に対する投稿を行っている
+ 働きたくない時間に見てる人が多いので **予約投稿** をフル活用する
+ Twitter も見てる人多いので、Twitter も運用したいけど面倒なのでFacebook の投稿を反映したい

# やったこと

+ 以下から **Facebookページ** とTwitter を連携する
+ https://facebook.com/twitter/index.php

# 問題点

+ Facebook に投稿したのに投稿がTwitter に反映されない

# 原因

+ URL＋URLページのサムネイル という構成だと反映されない
+ URLページのサムネイルがあると Twitter に反映されない
  + サムネイルを消すと Twitter に反映される

# 検証過程

## 検証環境

+ 独自のfacebookページ、twitter アカウントを作成

## 検証内容

以下のような形の投稿で色々と条件を変える

```
https://gessy0129.com/hoge
０１０文字あいうえお
```

## 検証結果

|ツイートの成否|文字数|サムネイルの有り無し|予約投稿か否か|
|:--:|--:|:--:|:--:|
|◯|150|◯|×|
|◯|80|◯|×|
|◯|10|◯|×|
|×|150|◯|◯|
|×|80|◯|◯|
|×|10|◯|◯|
|◯|150|×|◯|
|◯|80|×|◯|
|◯|10|×|◯|
ElasticSearchで検索のプロになる！04.自動インデックス作成の秘密

先ほど、RESTのPUT、POSTでデータを作成しました。
ElasticSearchはスキマーレスということもあり、スキーマを設定しなくとも、自動で設定してくれます。

その辺りの仕組みを少々記載します。


ElasticSearchはインデックスのドキュメントのスキーマを送られてきたJsonから推測します。

たとえば。

```
{
"field1":10,
"field2":"10"
}
```

とあった場合、field1は数値型、field2は文字列型と推定するわけです。

ちょっと登録してみます。
タイプ：testはすでにあるのでtest2で

```
curl -X POST http://192.168.33.10:9200/blog/test2/ -d '{"field1":10,"field2":"10"}'
```

Response

```
{
  "_index" : "blog",
  "_type" : "test2",
  "_id" : "AU4BKkpR8Y0sBqrTHRLZ",
  "_version" : 1,
  "created" : true
}
```

では、index:blog, type:test2のスキーマを見てみます。

```
curl -x GET http://192.168.33.10:9200/blog/test2/_mapping?pretty

{
  "blog" : {
    "mappings" : {
      "test2" : {
        "properties" : {
          "field1" : {
            "type" : "long"
          },
          "field2" : {
            "type" : "string"
          }
        }
      },
      "test" : {
        "properties" : {
          "title" : {
            "type" : "string"
          }
        }
      }
    }
  }
}
```

test,test2のスキーマが出力されます。
見てみればわかるように
field1:long
field2:string
になっています。
数値型は、longなので、ここに小数点を含んだ数値型をPOSTすると
小数点は切り捨てられます。
なので注意が必要。

自動はすごく便利なのですが、それでは実際に運用する場合に困ることも多いですな。
そんな時は、スキーマ（ElasticSearchではマッピングといいます）を指定してindexを作らないといけない。

また、文字列検索するときは検索するためにN-Gramやら形態素で解析できるフィールドにしないといけない。

次はその辺りを記載します。
ElasticSearchで検索のプロになる！03.まずはお試し。


インストールできたので、ホスト側からデータの操作をしてみたいと思います。
基本、ElasticSearchはRESTなので、そのへんがわかっている人にはとっつきやすかと。

わからない人は適当にググッてからお試ししてもらうことをおすすめします。
でも、サンプル叩いていればなんとなくわかるとは思う。

まずは、データの入れ込み。ElasticSearchはスキーマレスなので、先ずは簡単に動きを。

データの登録
ドキュメント名：blog
タイプ：test
Jsonデータ　：　{"title":"test"}

で登録します。

登録するときのID（ここでは１を指定）をこちらで指定する場合は以下のように叩くだけ。

```
curl -X PUT http://127.0.0.1:9200/blog/test/1/ -d '{"title":"test"}'
```

PUTは新規に作成という意味ですが、ここではIDをを指定して新規に作成。

でも、これだと色々面倒なので、自動でIDを降って欲しい場合は

```
curl -X POST http://127.0.0.1:9200/blog/test/?pretty=true -d '{"title":"test"}'
```

Response

```
{
  "_index" : "blog",
  "_type" : "test",
  "_id" : "AU38J2ma1TEYzBhlnyfW",
  "_version" : 1,
  "created" : true
}
```

手な感じ。

該当する記事の値をとるときは

```
curl -X GET http://127.0.0.1:9200/blog/test/1/?pretty=true
```

Response

```
{
  "_index" : "blog",
  "_type" : "test",
  "_id" : "1",
  "_version" : 1,
  "found" : true,
  "_source":{"title":"test"}
}
```

この辺は凄く基本的な感じ。
ElasticSearchで検索のプロになる！02.インストール

まずはお決まりインストールです。

CentOSで作業になります。

ElasticSearchではJavaが必要なので、最新版を入れます。
もしもあらかじめ入っている場合は削除して最新のものに置き換えることをオススメします。
理由は後で書いておきます。
複数のJavaを入れて起動時に指定することも可能っぽいですが、一つにできるならそのほうが確実です。

yum search jdk

上記コマンドでインストールできる最新のjdkのリストが取れるのでそれを入れる。
私の場合は

sudo yum install java-1.8.0-openjdk-devel.x86_64

でした。

あとは、環境変数にJAVA_HOMEを追加

さて、jdkが入ったのでとうとう本体のインストールです。

elastic searchはyum経由でもインストールできるので、それでインストールします。

まずは、yumのリポジトリ登録のために移動。

cd /etc/yum.repos.d/

リポジトリ作成
sudo vi elasticsearch.repo

各内容は公式サイトにあるので、それをコピペ。私の場合は

[elasticsearch-1.7]
name=Elasticsearch repository for 1.7.x packages
baseurl=http://packages.elastic.co/elasticsearch/1.7/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1

これでした。

保存したら、インストール

sudo yum install erasticsearch

jdkの場合と違い、今回は外部と通信します。
そのため、private IPの場合はyum installが失敗します。
その場合は/etc/yum.confにproxyを設定しておいてください。書き方はgoogle先生に聞くとすぐわかります。

あとは、途中でy/Nを求められたら、yを入れて待つだけ。

インストールが完了しました。

起動は以下のコマンドで

sudo service elasticsearch start

面倒ならばサービスに追加で。
chkconfig elastic search on

ターミナルからcurl打つと帰ってくることが確認できます。

```
curl -X GET http://127.0.0.1:9200/
{
  "status" : 200,
  "name" : "Ravage 2099",
  "cluster_name" : "elasticsearch",
  "version" : {
    "number" : "1.6.0",
    "build_hash" : "cdd3ac4dde4f69524ec0a14de3828cb95bbb86d0",
    "build_timestamp" : "2015-06-09T13:36:34Z",
    "build_snapshot" : false,
    "lucene_version" : "4.10.4"
  },
  "tagline" : "You Know, for Search"
}
```

これ、見たらわかりますが、見やすいように改行とインテントしてくれています。
実際の場合は、スマートに不要な部分は削除すると思うのでその場合は

```
curl -X GET http://192.168.33.10:9200/?pretty=false

{"status":200,"name":"Ravage 2099","cluster_name":"elasticsearch","version":{"number":"1.6.0","build_hash":"cdd3ac4dde4f69524ec0a14de3828cb95bbb86d0","build_timestamp":"2015-06-09T13:36:34Z","build_snapshot":false,"lucene_version":"4.10.4"}
```

で改行抜きで表示されます。


あとは、インストール後に色々と必要になるelasticsearchのDirectory Layputを記載しておきます。

https://www.elastic.co/guide/en/elasticsearch/reference/1.7/setup-dir-layout.html
Mac OS XでCocos2d-x 3.10(Android版)を動かす

Mac版cocos2d-x 3.1.0でjavascriptのアプリケーションをAndroid Studioで動作させようとするといろいろはまったのでメモです。なお、環境構築まではturusukeさんの[Cocos2d-JS で Hello World するまでの環境づくり](http://qiita.com/turusuke/items/741267bbfc81a287438a)を参考にしました。

##エミュレーター
Android Studio上で普通に作成したx86版のエミュレータだと起動しないみたいでした。なので下記コマンドでarmeabi版のAVDを作成します。なお、"Use Host GPU"以外の項目はデフォルトのままで問題ありません。

```lang:bash
android create avd --force --name cocos -t "android-22" --abi "default/armeabi-v7a"
```

エミュレータが作成できたら起動します。

```lang:bash
emulator -avd cocos
```

##起動
エミュレータが起動したのでいざAndroid Studio上で実行しようとしても下記のエラーになってしまいました。
java.lang.UnsatisfiedLinkError: Couldn't load cocos2dcpp from loader dalvik.system.PathClassLoader

[こちらのブログ](http://programmerkinoko.hatenablog.jp/entry/2015/11/10/090000)を参考にAndroidを経由せず下記コマンドを実行するとemulator上で動作しました。

```lang:bash
emulator -avd cocos
cocos run -p android --android-studio
```
Keynote: OSSの動向をとらえた実装方針のメモ

* *DroidKaigiのメモ書きを随時アップロードしていきます*
* *スライドは上がり次第こちらに貼ります*

*スライドが上がっていたので公式の情報は以下をご参照ください。*
https://speakerdeck.com/wasabeef/day1-keynote-in-droidkaigi-2016

## 発表者/発表内容
* @wasabeef_jp
* CAで作っているアプリのOSSの話
* 採用したライブラリの紹介
* 安定した(枯れた)ものを使う
* 実装方針・設計の話は今回はなし

## 動向を追うためにやってること
* github
* Android Weekly/Arsenal
* Twitter

## 導入
* 少し前は解像度や機種依存がよく取り上げられていたが...
* 現在は4系が主流になってきた
* 開発手法がよく着目されている

#### 言語は？
* Kotlinは今回は選ばなかった
* GoogleがKotlinをどう見ているのかがまだ分からないため
* Javaを採用
* RetroLambda
* etc...

#### RetroLambda？
* Lambda
* MethodReference
* Lightweight-Stream-API (OSS)
* Stream
* Optional (!)

## ThreeTen Android
* JSR-310
* ジェイクさん？謹製
* 時間の取り扱いがとても楽にできる

## View
* やっぱりSupport Library使うよね
  - RenderScript
  - PercentRayout
      - weightを使わなくてよくなる
* あとAndroid-ObservableScrollViewもよく使うよね
  - RecyclerVire, ScrollView, ListViewなどのスクロール制御の監視
  - ずっと使い続けられると思われるため

## フォント系ライブラリ
* Calligraphy
  - アプリ全体にFontを適用
  - Javaからも可

## ViewAnimator
* アニメーションのコードはとても煩雑になりがち
* ViewAnimatorを使うとすごくすっきりかける
* 2ヶ月くらい前に出たばかり

## DataBinding
* Android Data Binding
* Googleの中でもKotlinを使っている(!)
* CustomSetters
  - Attributeの煩雑な書き方をしなくて良くなる
* DataBindingUtil

## Networking
* Retrofit + OkHttp一択かと

## Json
* プロトコルバッファ？を使っている
* 帯域の節約になる
* Wire

## Percelables
* パーセラブル？
* Parceler
  - AnnotationProcessingできる
  - ActivityからFragmentにBundleでデータを渡すときとかにすごく楽
* Icepick

## Image Loaders
* 海外だとUniversal Image Loader
* Picasso
  - シンプル
  - デバッグができる
  - Picassoはとても軽いところが優秀
* Glide
  - Picassoとの違い
  - Gifを取り扱える
  - ブラーをかけた状態でBitmap Poolできる
* Fresco
  - Viewが使える

## ブラー系ライブラリ
* blury
* Android StackBlur
* GPUImage
  - フィルターがかけられる
  - CA製ライブラリ

## DI
* Android Annotationはもう古い
* Dagger2
* Butter Knife
  - OnClick
  - OnTextChange
  - OnForcusChange

## FRP
* RxJava
  - 非同期、リスト操作が簡単
  - RetroLambdaがないとつらい
  - Retrofitと併用するのがよい
  - Leakが怖い
  - Subscribeしているかを確かめながら
  - mapの中でindexを使いたければ...rxjava-extra
* RxAndroid

## DB/ORM
* ActiveAndroidを昔は使っていたが...
* Realm
  - SQLiteでない
  - RxJava?
* Android Orma (gfxさん謹製)
  - SQLite
  - Annotation Processing
  - RxJava

## Event
* Otto
  - Deprecated
* EventBus
  - Threadの指定ができる

## Debugging
* Timber
  - ログを吐き出す
* Hugo
* Stetho
  - Chrome Developer Toolsを利用してNetwork、Dataの状況の把握ができる
  - *Android Studioと何が違う？*
* LeakCanary
  - メモリリークを検出
* Takt
  - wasabeefさん謹製
  - fpsを表示できる
* Clashlytics

## Other
* Multi-Dex
  - メソッド数が65000に制限する
  - 65000を超えるとビルドできない
  - 最新のAndroid Studioだと動かないので注意が必要
* ProGuard
  - ソースコード難読化
  - 不要なリソース、ファイルの削除ができる
  - 不要って？定義が難しい
* Conclusion
  - 今回扱ったライブラリ数が60個以上
  - あのライブラリを使えば、あのライブラリが使えるetc...
Option型にString型の文字列から変換したい


[scala-redis](https://github.com/debasishg/scala-redis/blob/master/src/main/scala/com/redis/RedisClient.scala#L95 "scala-redis")のsecretの文字列の部分でOption型のものを要求されたので変換したときの方法をメモ。

```scala
val config = ConfigFactory.load
val redisConfig = config.getConfig("redis")

val accessKeyMap = new util.HashMap[Int, String]

accessKeyMap.put(1, redisConfig.getString("accessKey"))

val redis = new RedisClient(rHost, rPort, rDatabase, Option(accessKeyMap.get(1)))

```

これで一旦compile時のエラーは消えた。
ElasticSearchで検索のプロになる！01.はじめに

とある会社でエンターテイメント系のコンテンツを作っていますが、そうなるとさまざまなコンテンツの検索が必要になる。
通常のRDMSでは検索には限界があるし、読み物系の検索の場合は日本語検索が必須になる。

ならば、

**なんでも検索できる**

プラットフォームを作ってやろうか！
と思ってその経過を記載していこうかと思っています。

おそらく、書いてあること自体は目新しいことはないと思いますが、
実際にサービスで使うに当たって困ったことやぶち当たったことを書いていくので、経験則的な記事になればいいかなと思っています。

OSはCentOS
検索エンジンはElasticSearch

まずは、開発していると意外と混乱するのが用語。
特にRDMSを使っているとややこしいので、
RDMSと比較した場合のElasticSearchのデータの概念を書いておきます。

正確には違う部分も多いらしいけど、RDMSに慣れているとあれ？と思うことも多いので記載。


| RDMS | Elasticsearch | 
|:-----------|:-----------|
| TABLE（テーブル） | INDEX（インデックス） |
| RECORD（レコード） | DOCUMENT（ドキュメント） | 
| COLUMN（カラム）       | FIELD（フィールド） | 

# 次章
[ElasticSearchで検索のプロになる！02.インストール](https://qiita.com/talefantasia/items/a4f9b2e897d14ed3e04d)
MysqlServer 5.7.5+ では、rootユーザのパスワードをわすれた場合の対処法が変わっていた


# 概要
root権限のあるユーザのパスワードを忘れてしまい、Mysqlにアクセスできなくなった場合 の対応方法が、変わってた。

# やりかた
## 5.6まで
Mysql5.6系では、以下のSQLをmysqld起動時に実行して対処していました。（[日本語マニュアル](https://dev.mysql.com/doc/refman/5.6/ja/resetting-permissions.html)）

```sql
UPDATE mysql.user SET Password=PASSWORD('MyNewPass') WHERE User='root';
FLUSH PRIVILEGES;
```

## 5.7から
Mysql5.7系（正確には、5.7.5以降っぽい）では、mysql.userテーブルに、Passwordカラムが存在しないため、5,6までのSQLと同じだと、実行に失敗する。
[MySQL 5.7 Reference Manual B.5.3.2 How to Reset the Root Password](http://dev.mysql.com/doc/refman/5.7/en/resetting-permissions.html)によると、実行するSQLは、以下のようになったようです。

```sql
ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass';
```

# まとめ
全体の流れとして、
1. 対象となるmysqldを止めて
2. 初期化用のSQLファイルを作って
3. mysqldの起動時に実行させる

という流れには変わりませんが、**初期化時に実行するSQLが変更**になりました。


# なんで気づいたか
現在、[chocolateyでmysqlを普通にインストールすると、5.7.xがインストールされます](https://chocolatey.org/packages/mysql)が、rootでログインしたくても、パスワードが設定されてる（？）っぽくてログインできませんでした。
なので、rootのパスワードの初期化すればよくね？って思ったので、初期化しようと思ったのですが、5.6系のやり方でできなかったので調べた、という経緯でした。
プログラミング言語の基本レベルの性能評価

Tested on my 
iMac (27-inch, Late 2012)
Processor : 3.2 GHz Intel Core i5
Memory : 16 GB 1600 MHz DDR3


| Name | 数字加計算(100万回) ms | 文字列連結(100万回) ms |        備考             |
|----|----|----|----|
| c | 2 | 10 | strcpy |
| cpp | 2 | 22 | std::string.append<br/>string+string leads to no response
| go | 0.5 | 13 | bytes.Buffer.WriteString<br/>strings.Join spends 80ms+<br/>NOTICE: in fact "go run" waste much time, it can be proved by exec "time go run test.go" on your shell |
| java 6 | 6 | 35 | StringBuilder |
| OBJC | 2 | 45 | NSString stringByAppendingString:TIMEOUT<br/>NSMutableString appendFormat:246ms <br/>NSMutableArray componentsJoinedByString:129ms <br/>NSMutableString appendString:63ms <br/>CFMutableStringRef appendString:52ms <br/>CFStringRef[]=>CFArrayRef join appendString:45ms<br/>* the speed under command line & iOS simulator are almost same.
| php 5.4 | 36 | 56 | with APC<br/>./test.php but not php test.php |
| swift 2.1.1 | 5 | 62 | swiftc test.swift -o test<br/>./test |
| nodejs 5.5.0 | 2 | 65 | str becomes 1.5 times faster than 0.8 |
| scala 2.0 | 4.5 | 76 | no java.lang.stringBuilder no response!!! |
| nodejs 0.8.22 | 2 | 95 |  |
| ruby 2.0.0 | 141 | 185 | str1 << str2 : 185<br/>str+str no response |
| lua 5.2.1 | 40 | 225 | table.insert/concat |
| groovy 2.2.1 | 239 | 227 | str<<=str2 <br/>older version have to use java.StringBuilder? |
| python 2.7.2 | 213 | 247 | arr.append->join<br/>pyc has almost a same result |
| perl 5.12 | 144 | 288	|  |
| ruby 1.8.7(REWROTE) | 140 | 286 | arr.join |
| js/ff22 | 2 | 34 | (+ on ff is amazing), innerHTML is pretty fast<br/>it does not mean html render is fast either. |
| js/chrome | 2 | 110 |  |
| js/safari6 | 62 | 112	|  |
| js/opera12 | 180 | 250 |  |
GoogleApps経由で取得したドメインをGCPで運用するとGmailが使えなくなったのでMXレコード解決してみた

背景：
1. Google Apps経由でドメインを取得した
2. GCP(Google Cloud Platform)をサーバーとして使用するためhttps://access.enom.com/ へログインしてDNS InformationをDefaultからCustomへ変更してDNS設定した。
3. 当該ドメインのGmailアカウントでメールの送信はできるが受信ができなくなった。

原因：MXレコードが解決できなくなったため。

解決方法：https://support.google.com/a/answer/174125?hl=ja

ということで、Google Developers Consoleの『ネットワーキング』→『Cloud DNS』から下記の通りMXレコードを設定した。

<img width="334" alt="gcp_gmail_1.png" src="https://qiita-image-store.s3.amazonaws.com/0/100746/d4d0170b-ef07-c844-578a-3d5c844fddc1.png">

正常に受信できるようになった。
ちなみに一度受信が確認できた後、TTLは86400秒が推奨されているので、そのように設定しておいた。

<img width="327" alt="gcp_gmail_2.png" src="https://qiita-image-store.s3.amazonaws.com/0/100746/a95a62ad-5894-1d49-9e58-4dd5f578e9ba.png">
プリントに対応させるCSS

便利なCSSを見つけたんでメモ。
ウェブページをプリントする際に、たとえば「リンク」を「リンク(リンク先)」にしてくれたり、背景を白に、文字色を黒にしてくれたり、tableを見やすくしてくれたり・・するCSS。
ソース：[https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css](https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css)

:alien: 

```css:print.css
@media print {
    *,
    *:before,
    *:after,
    *:first-letter,
    *:first-line {
        background: transparent !important;
        color: #000 !important;
        box-shadow: none !important;
        text-shadow: none !important;
    }

    a,
    a:visited {
        text-decoration: underline;
    }

    a[href]:after {
        content: " (" attr(href) ")";
    }

    abbr[title]:after {
        content: " (" attr(title) ")";
    }

    a[href^="#"]:after,
    a[href^="javascript:"]:after {
        content: "";
    }

    pre,
    blockquote {
        border: 1px solid #999;
        page-break-inside: avoid;
    }

    thead {
        display: table-header-group;
    }

    tr,
    img {
        page-break-inside: avoid;
    }

    img {
        max-width: 100% !important;
    }

    p,
    h2,
    h3 {
        orphans: 3;
        widows: 3;
    }

    h2,
    h3 {
        page-break-after: avoid;
    }
}
```
HomebrewでGo 1.6を入れる

##注
2016-02-18時点で既に[公式が更新](https://github.com/Homebrew/homebrew/commit/716abfd72fe673679b08902562453855117507cb)されています

Formulaの編集を元に戻す場合は以下実行、

```bash
$ cd /usr/local/Library/Formula/
$ git checkout -f go.rb
```
さらに公式のFormulaに従って`go 1.6`を入れ直す場合は以下です。

```
$ rm -rf /usr/local/Cellar/go/1.6
$ brew upgrade go
```

----

多分数日で無用になると思うけどメモ

```bash
$ brew edit go
```
でdevelブロックを編集

```ruby
  devel do
    #以下を差し替える
    url "https://storage.googleapis.com/golang/go1.6.src.tar.gz"
    version "1.6"
    sha256 "a96cce8ce43a9bf9b2a4c7d470bc7ee0cb00410da815980681c8353218dcf146"
  end
```

アップグレードを実行（未だgoを入れていない場合は `brew install ...`）

```bash
$ brew upgrade --devel go
```
vagrant+docker

## 参考

* [Docker - Provisioning - Vagrant by HashiCorp](https://www.vagrantup.com/docs/provisioning/docker.html)

```rb:Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure(2) do |config|
  config.vm.provider "docker" do |d|
    d.image = "tukiyo3/ubuntu-debootstrap-devel"
  end
end
```

```bash:up.sh 
vagrant up --provider=docker
```
summernoteについてのメモ

# はじめに

久しぶりに、記事を書きます。
最近は、Webシステムの開発が多くなってきて、
いろいろ便利な機能を探しています。

# summernoteについて

summernoteのホームページ
http://summernote.org/

bootstrapを使ったWYSIWYGエディターです。

簡単なので、使っています。

## インストール

こんな簡単な設定です。

```
<link href="/js/summernote.css" rel="stylesheet" type="text/css">
<script src="/js/summernote.min.js"></script>
```

各言語対応をする場合は、上記のjsファイルの後に追加します。
```
<script src="/public/js/lang/summernote-<各言語コード>.js"></script>
```

日本語化の場合は、以下の通り。

```
<script src="/public/js/lang/summernote-ja-JP.js"></script>
```

## 設定

jsファイル内で以下を宣言します。

``` 
$('#detail').summernote();
```

htmlではこんな風に。

```
<textarea class="form-control" id="detail" name="detail" rows="5">
```

日本語化の場合は、以下の通り。

``` 
$('#detail').summernote(
    lang: "ja-JP",
);
```

## テクニック

このままだと、高さのないエディターになりますので、

``` 
$('#detail').summernote(
    height: 300,
    lang: "ja-JP",
);
```

とかします。

## フォント！！！

デフォルトのフォントは、少しだけでかつ日本語をきれいに表示できないので、
追加します。

``` 
$('#detail').summernote(
    height: 300,
    fontNames: ["YuGothic","Yu Gothic","Hiragino Kaku Gothic Pro","Meiryo","sans-serif", "Arial","Arial Black","Comic Sans MS","Courier New","Helvetica Neue","Helvetica","Impact","Lucida Grande","Tahoma","Times New Roman","Verdana"],
    lang: "ja-JP",
);
```

これで、だいぶ使い勝手がよくなります。

# mysqlに設定するときは

alter table table_name add detail MEDIUMBLOB;
とかしておきます。
BLOB形式にしておくのが無難です。


# 終わりに

WYSIWYGエディターは、ずいぶんと進化しています。

https://github.com/bootstrap-wysiwyg/bootstrap3-wysiwyg

こんなのとかもあります。

調べると、いろいろあって目移りしますが、
簡単なものがいいですね。
Sublime Textライセンス関連文章の日本語訳（非公式）


Sublime Textはすごくいいエディタだと思います。
見た目は綺麗ですし、複数カーソルはインパクトのある機能でした。
他のエディタでも同様の機能が追加されたりしています。

ところが最近、Sublime Textを無料のエディタとして紹介する記事をネット上でいくつか目にしました。
それらの記事では「無料だとたまにポップアップが出て鬱陶しいけど毎回消せばオッケー」というノリで紹介されている（あるいは読者にそのような印象を与える）ように感じました。
しかし、少なくとも私の理解では**その認識は間違っています**。

Sublime Textは**有料**のテキストエディタです。
無料エディタとして紹介している人がSublime Textのライセンスを理解していないのか、あるいは故意に無視しているのか私にはわかりません。
しかし、ダウンロードページやライセンス購入を促すメッセージが英語のため、理解できていないユーザーもいるのではないかと考え、勝手に翻訳を書きました。

以下の翻訳は私が勝手に書いた非公式なものであり、間違いがある可能性があります。
間違いにお気付きの場合は、コメントまたは編集リクエストでご指摘いただけると幸いです。
ご利用の際は必ず最新の[公式ドキュメント](https://www.sublimetext.com/)を確認していただくようお願い致します。

# ライセンスに関係する文章の日本語訳

## [Sublime Text 3 ダウンロードページ](https://www.sublimetext.com/3) より

> Sublime Text may be downloaded and evaluated for free, however a license must be purchased for continued use. There is currently no enforced time limit for the evaluation.

> Sublime Text は無料でダウンロードおよび評価が可能ですが、継続的に利用するためにはライセンスを購入しなければなりません。現在、評価のための強制的な時間制限は設けられていません。

## [Sublime Text 3 ライセンス購入ページ](https://www.sublimetext.com/buy) より

ダウンロードページと同じ文が記載されています。

> Sublime Text may be downloaded and evaluated for free, however a license must be purchased for continued use.

> Sublime Text は無料でダウンロードおよび評価が可能ですが、継続的に利用するためにはライセンスを購入しなければなりません。

## プログラム使用中に表示されるポップアップ

何回かファイルの保存を行うと表示される（？）ようです。
以下はMac版Sublime Text 3 (Build 3103) のものです。

<img width="532" alt="スクリーンショット 2016-02-18 9.10.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/55491/bf5bf9ac-0e0b-2a9f-ae6e-66d55aac2e42.png">

> ハロー！Sublime Textを試してくれてありがとう。
>
> これは未登録の評価版です。試用は無制限ですが、継続的に利用するためにはライセンスを購入しなくてはなりません。
>
> 今ライセンスを購入しますか？

# 終わりに

私は法律に詳しくありませんが、仕事で日常的に使うことが「**試用・評価（evaluate）**」であって「**継続的な利用（continuous use）**」ではないと言われると疑問を感じます。
少なくとも、そのような使い方をするのが当たり前、という風潮は良くないと考えています。
この記事が、少しでもそのような風潮を改善するきっかけになれば幸いです。
（そして、ソフトウェアのライセンス・著作権をもっと多くの人が意識するきっかけになれば・・・）

他のエディタの機能にまで影響を与えたSublime Textと作者の方を、私は尊敬しています。
今後も開発が継続し、革新的な機能をリリースしてくれることを願っています。
peco で docker exec


開発中に Docker コンテナに入りたい事がたびたびあるので, 下の方法で入っていたのですが毎回大変なので.
[コンテナに入りたい？それ docker exec でできるよ](http://qiita.com/yosisa/items/a5670e4da3ff22e9411a)


```zsh
 % docker exec -it `docker ps| peco | cut -d" " -f 1` /bin/bash
root@123456789abc:/#
```

peco に流した時に `Docker PS` のヘッダが邪魔なので出ないようにします.

```zsh
 % docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS         NAMES 　# <- Headerが邪魔
123456789abc        hoge/hoge             "/bin/bash -c ..."       2 minutes ago       Up 2 minutes        ....          ....
...

% docker ps --format "{{.ID}}\t{{.Image}}\t{{.Status}}\t{{.Command}}\t{{.RunningFor}}"
123456789abc    hoge/hoge    Up 1 minutes    "/bin/bash -c ..."    1 minutes
...
```

aliasにも登録しておきました

```zsh:.zshrc
alias ddps='docker ps --format "{{.ID}}\t{{.Image}}\t{{.Status}}\t{{.Command}}\t{{.RunningFor}}"'
alias ddexec='docker exec -it `ddps | peco | cut -f 1` /bin/bash'
```
Go 1.6 出た！

走り書き。

- [Go 1.6 is released - The Go Blog](https://blog.golang.org/go1.6)
- [Go 1.6 Release Notes - The Go Programming Language](https://golang.org/doc/go1.6)
    - [Go1.6の新機能 - Qiita](http://qiita.com/ksato9700/items/5505e506c20b6048c218)

1.5.x では Windows 版のインストーラで[上書きインストールできない](http://qiita.com/spiegel-im-spiegel/items/98e91bae292da5bb2166)問題があったが（一旦削除すればできたけど）， 1.6 では解消されているもよう。

## 参考

手前味噌ですが。

- [Go 言語に関するブックマーク - Qiita](http://qiita.com/spiegel-im-spiegel/items/98d49ac456485b007a15)
- [プログラミング言語 Go — text.Baldanders.info](http://text.baldanders.info/golang/)