OmniAICreator/Qiita-1.07M huggingface dataset:
Mavenでのビルド時にソースの文字コードを指定する

# 概要

Mavenでのビルド時にソースの文字コードを指定する方法を書く。Mavenでビルドする際にソースの文字コードを指定していない場合は以下のようなWarningが出る。

```
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
```

# 方法

pom.xmlに以下を追加する（UTF-8を指定する場合）。

```
<properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
```

階層は以下のようにする。

```
<project>
  ...
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  ...
</project>
```

# 参考

[Maven &#x2013; Frequently Asked Technical Questions](http://maven.apache.org/general.html)
dockerでLDAP Serverを起動。ついでにphpLDAPadminも

#経緯

認証サーバが欲しい。
OpenLDAPっていうのがあるらしい。
でもインストールして試すには、テスト用の物理サーバがない。
そうだ、仮想化しよう。今流行りのdockerで。
ついでに冗長化もしやすそう。

LDAPの操作が慣れるまでややこしそう。
実運用するとしてもユーザ登録するの俺じゃないし、GUIツールがいる。
phpLDAPadminっていうのがあるらしい。
ついでにこれもdockerでいけたらいいな。

#dockerインストール
Ubuntu 16.04LTSなので

```
sudo aptitude install docker docker-compose
```

でOK(バージョン古いけど)。

#docker imageを探してみた
docker hubでosixiaって人が両方作ってた
freeldap: osixia/openldap
phpldapadmin: osixia/phpldapadmin
マニュアル的なものはgithubにあった。
[osixia/openldap](https://github.com/osixia/docker-openldap)
[osixia/phpldapadmin](https://github.com/osixia/docker-phpLDAPadmin)
LDAPのimageを検索してみた感じ、スターが一番多いので採用

##とりあえずシェルスクリプトで
ldap.sh

```bash
SERVICE=ldap-service
HOST_NAME=ldap-host
PASSWORD=adminpass

docker run \
	--name $SERVICE \
	--hostname $SERVICE \
	--env 'LDAP_ORGANISATION=Oreno Company' \
	--env LDAP_DOMAIN=my-company.com \
	--env LDAP_ADMIN_PASSWORD=$PASSWORD \
	--detach \
	osixia/openldap

docker run \
	-p 443:443 \
	--name ${SERVICE}-admin \
	--hostname ${SERVICE}-admin \
	--link $SERVICE:$HOST_NAME \
	--env PHPLDAPADMIN_LDAP_HOSTS=$HOST_NAME \
	--detach \
	osixia/phpldapadmin
```

##docker-composeも試してみよう
docker-compose.yml

```yaml
#LDAP server
ldap-service:
    image: osixia/openldap
    container_name: ldap_host
    environment:
        LDAP_ORGANISATION: "Oreno Company"
        LDAP_DOMAIN: "my-company.com"
        LDAP_ADMIN_PASSWORD: "ldappw"

ldap-phpadmin:
    image: osixia/phpldapadmin
    container_name: ldap_admin
    environment:
        PHPLDAPADMIN_LDAP_HOSTS: ldap_service
    ports:
        - "443:443"
    links:
        - ldap-service
```

これで
https://localhost/
にアクセスすればphpLDAPadminからいじれる

#永続化
volumeでマウントするパスはgithubにあるので、これでそのまま使えそう
ただ正式採用するなら、公式イメージじゃないので、自前でビルドする方が安心かな。
Windowsバッチファイルの小技

# <i class="fa fa-television" style="font-size:1em;"></i> はじめに

Windowsでバッチファイルをプログラミングする際の小技について纏めました。

# <i class="fa fa-television" style="font-size:1em;"></i> 環境

<i class="fa fa-caret-right" style="font-size:1em;"></i> OS : Windows Server 2012 R2

# <i class="fa fa-television" style="font-size:1em;"></i> 前提

<i class="fa fa-caret-right" style="font-size:1em;"></i> 基本的なWindowsコマンド（DOSコマンド）の知識

# <i class="fa fa-television" style="font-size:1em;"></i> 参考

なし

# <i class="fa fa-television" style="font-size:1em;"></i> 解説

## リダイレクション

* 標準出力の内容をファイル(result.txt)に出力します。

```bat:test.bat
@echo off

dir > result.txt
```

* 標準エラー出力の内容をファイル(result.txt)に出力します。

```bat:test.bat
@echo off

dir 2> result.txt
```

* 標準出力と標準エラー出力の内容を同時にファイル(result.txt)に出力します。

```bat:test.bat
@echo off

dir > result.txt 2>&1
```

## イベントログ

* イベントログにメッセージを出力します。<br>
<font color="#ff0000">※複数イベントを続けて出力する場合、処理が速すぎて順番通りにイベントビューアーに出力されない場合があります。その場合は、eventcreateの前に待ち処理を記述します。</font>

|オプション|説明|
|:--------|:------------|
|/id      |イベントIDを指定します。 (1～1000) |
|/l       |ログ種別を指定します。 (APPLICATION, SYSTEM)|
|/so      |ソースを指定します。システムで予約されている名称は指定不可。|
|/t       |レベルを指定します。 (ERROR, WARNING, INFORMATION)|
|/d       |イベントの説明を指定します。|

```bat:test.bat
@echo off

eventcreate /id 999 /l application /so TEST_EVENT /t information /d "処理開始します"
```

## 空ファイル作成

* 何かの処理処理判定などを行う場合、一時的に空のフラグファイルを作成する場面がありますが、下記コマンドで作成可能です。

```bat:test.bat
@echo off

type nul > flag.txt
```

## 日付取得

* 出力ファイルに今日の日付を付加して保存したい場面がありますが、下記コマンドで実現可能です。

```bat:test.bat
@echo off

set YYYYMMDD=%DATE:/=%
dir > result.txt.%YYYYMMDD%
```

## 待ち処理

* バッチファイル内で待ち処理を行いたい場合は下記コマンドを使用します。
Windows VistaやWindows Server 2003以降は、timeoutコマンドが使用可能ですが、それ以前のOSについては、pingコマンドで代用していください。

```bat:test1.bat
@echo off

ping localhost -n 2
```

```bat:test2.bat
@echo off

timeout /t 5 > nul
```
Docker 1.13のexperimental機能の有効化


# 内容
Docker 1.13.0で追加されたexperimentalな機能を
利用するための方法を記述する。

## 前提
- Ubuntu 16.04
- Docker Engine 1.13.0

# 手順
## docker.serviceの編集
/lib/systemd/system/docker.service内の
Dockerデーモンの起動時オプションに
--experimentalを追加する。

```txt:docker.service変更前
ExecStart=/usr/bin/dockerd -H fd:// -s overlay
```

```txt:docker.service変更後
ExecStart=/usr/bin/dockerd -H fd:// -s overlay --experimental
```

## dockerの再起動
Dockerデーモンを再起動させる。

```bash:再起動手順
sudo systemctl daemon-reload
sudo systemctl restart docker
```

## 再起動後確認

再起動したあと、--experimentalが
追加されているかを確認する。

```bash:再起動後確認
ps -ef | grep dockerd
root      7917     1  0 01:35 ?        00:00:00 /usr/bin/dockerd -H fd:// -s overlay --experimental
```

これで、--squash=true|falseなどの**実験的な機能**を
利用できるようになります。
yumを利用してMySQL5.7をCentOSへインストールする方法

# 概要
CentOSへのMySQL5.7のインストール方法をまとめる。[公式ドキュメント](http://dev.mysql.com/doc/mysql-yum-repo-quick-guide/en/#repo-qg-yum-fresh-install)に従った方法で、yumを利用する。バージョンが5.7の場合を書くが、それ以外の場合も置き換えれば同じ方法でインストール可能であるはず。

# 手順

## 1. yumリポジトリをインストールする
以下のコマンドを実行し、yumリポジトリをインストールする。リポジトリのURLはバージョンに依存する。

```
wget  https://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm
sudo rpm -Uvh mysql57-community-release-el7-9.noarch.rpm
rm mysql57-community-release-el7-9.noarch.rpm
```

## 2. 有効なリポジトリを確認する
有効なリポジトリを確認する。以下のコマンドの結果にmysql57-community/x86_64があることを確認する。

```
yum repolist enabled | grep mysql
```

## 3. バージョンを確認する

意図したバージョンがインストールされたことを以下のコマンドにより確認する。

```
mysql --version
```

## 4. mysqlサーバを起動する

mysqlサーバを起動する。また、次回のログイン以降自動でmysqlサーバが起動するように設定する。

```
sudo systemctl start mysqld
sudo systemctl enable mysqld
```

## 5. パスワードを設定する

デフォルトで用意されているrootユーザに対してパスワードを設定する。初回ログインではワンタイムパスワードを利用する。
Docker 1.13.0の気になる新機能

# 目的

**個人的に**気になるDockerの新機能や改善事項について整理する。

# 内容
Docker Engine 1.13のChange logから気になるものを拾う。
https://github.com/docker/docker/blob/master/CHANGELOG.md


# 気になった新機能

- Add --attachable network support to enable docker run to work in swarm-mode overlay network #25962

docker runで起動したコンテナをswarm modeのoverlayネットワークに
接続できるようになった。

- Enable ping for service VIP address #28019

docker service createで作成されたサービスのVIPに対してのpingが
可能になりました。

...できてた気がするけれども、できてないとの話も聞くので
これができるよと明示されたのは嬉しい。

- (experimental) Add docker service logs command to view logs for a service #28089

docker service createで作ったサービスのログを一括でみれるようになった
ということですかね。個別のコンテナ単位のログではなく、サービス単位で
ログをまとめて見れるのは嬉しい。


- (experimental) Add option to squash image layers to the FROM image after successful builds #22641

squashオプションでイメージのレイヤをまとめることができるようになった。
途中で肥大化している部分があって
あとからダイエットさせたい時に役に立ちそう。
とはいってもイメージレイヤ？の共有が利かなくなるので多用し過ぎると
副作用が大きそう。

あとはdocker-composeとswarm modeの連携部分が改善されている
との事なのでそこも気になる。。。

# 注意
experimentalが付いている機能については有効化しないと使えないようになっています。
dockerデーモンの起動時オプションに --experimentalオプションを追加することで
有効化できます。
WP REST APIをカスタマイズしてカテゴリースラッグやタグスラッグで記事を取得できるようにする

WP4.7から前までのWP-APIを上書き？するような感じでfilterによるカテゴリースラッグからの記事の絞り込みができなくなってしまいました。
WPのカテゴリー記事一覧をWP REST APIで叩く場合、
スラッグからIDを把握する→IDから記事一覧を叩く
と2段階の工程が必要になります。
（npmでのWP REST APIライブラリでもpromiseを用いて上記のような手順でした）

これを1段階にしたい場合、

- カテゴリーページにIDを挿入しておく（pjaxなどで破棄されたらどうする）
- つくる


自分の場合、URLからどのカテゴリーなのかを把握するような構成にしていたので非常に悩みました。
というわけで作りました。
**functions.php**

```php
function get_posts_from_cat( $request ) {
	$cat = get_category_by_slug($request['slug']);
  if (!$cat) {
    return null;
  }
  $request['categories'] = $cat;
  $response = new WP_REST_Posts_Controller('post');
  $posts = $response->get_items($request);
  if ( empty( $posts ) ) {
  	return null;
  }
	return $posts;
}
add_action( 'rest_api_init', function () {
	register_rest_route( 'slug/v1', '/cat/(?P<slug>.*)', array(
		'methods' => 'GET',
		'callback' => 'get_posts_from_cat'
	) );
} );

function get_posts_from_tag( $request ) {
	$tags = get_tags(array('slug' => $request['slug']));
  if (!$tags) {
    return null;
  }
  $request['tags'] = $tags[0]->term_id;
  $response = new WP_REST_Posts_Controller('post');
  $posts = $response->get_items($request);
  if ( empty( $posts ) ) {
  	return null;
  }
	return $posts;
}
add_action( 'rest_api_init', function () {
	register_rest_route( 'slug/v1', '/tag/(?P<slug>.*)', array(
		'methods' => 'GET',
		'callback' => 'get_posts_from_tag'
	) );
} );
```

ひとつに纏められないかなと思うのですが、このまま公開します。（カスタムタクソノミーもその気になればいけるはずです）
URL/slug/v1/cat/スラッグ
URL/slug/v1/tag/スラッグ
でスラッグ（URLエンコード可）で記事一覧が取得できます。もちろん_embedやper_pageなどの他のパラメーターも併用可能です。

## コアを見る
これあんまり情報がないため、コアのコードをみたらget_items()で色々できるような感じだったので色々やったらできました。

```php
  $response = new WP_REST_Posts_Controller('post');
  $posts = $response->get_items($request);
```


**該当部分**
wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php
https://github.com/WordPress/WordPress/blob/master/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php

**参考箇所**
https://github.com/WordPress/WordPress/blob/master/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php#L148



## おわりに
new WP_REST_Posts_Controllerして、get_items()したらなんでもできる！（ようなきがする）
【Swift】UISegmentedControlで同じセグメントを2回タップしたら選択解除する方法

# デモ
![sc.gif](https://qiita-image-store.s3.amazonaws.com/0/135478/a7d96df5-c30e-50bf-3b06-c78d33045577.gif)

# 手順

## 1. カスタムクラスを作成
まずUISegmentedControlのカスタムクラスを作成します。
⌘+Nで新規ファイル作成画面にいきます。
Cocoa Touch Classを選択し、Nextをクリック。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/135478/b82b2072-fa8c-2a29-c6db-23413b502747.png)

次にクラス名を適当に付けて、SubclassにUISegmentedControlを選んでNext。
次の画面でファイルの保存場所を指定して作成します。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/135478/544339f8-4469-b6b7-ce7f-69300d4f722f.png)


そして作成したカスタムクラスを以下の様に記述します。

```CustomSegmentedControl.swift
import UIKit

class CustomSegmentedControl: UISegmentedControl {

    var oldValue : Int!
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.oldValue = self.selectedSegmentIndex
        super.touchesBegan(touches, with: event )
    }
    
    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesEnded(touches, with: event )
        
        if self.oldValue == self.selectedSegmentIndex
        {
            sendActions(for: .valueChanged )
        }
    }

}
```

## 2. カスタムクラスを適応
設置したUISegmentedControlに先程作成したカスタムクラスを適応させます。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/135478/f61752d8-d6d7-b6c9-d097-64ef4989207b.png)


## 3. 紐付け
UISegmentedControlをViewControllerに紐付けします。

設置したUISegmentedControlを扱うためにOutletで接続。
![4.png](https://qiita-image-store.s3.amazonaws.com/0/135478/2cd2f575-c910-c07f-e192-fced19c769a4.png)

タップイベントを取得するためにActionでも接続。
![5.png](https://qiita-image-store.s3.amazonaws.com/0/135478/b24c5e7a-65ce-e7e3-06a9-d34703906cf0.png)

## 4. タップした時の処理を記述
値を入れる変数を用意して、タップ時の処理を記述して完成です。

```ViewController.swift
import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var sexSC: CustomSegmentedControl!
    var sex: String = ""
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
    }
    
    @IBAction func sexSCDidTapped(_ sender: CustomSegmentedControl) {
        let selectedIndex = sexSC.selectedSegmentIndex

        if sex == sexSC.titleForSegment(at: selectedIndex)! {
            sexSC.selectedSegmentIndex = UISegmentedControlNoSegment // 選択解除
            sex = ""
        } else {
            sex = sexSC.titleForSegment(at: selectedIndex)!
        }
        print(sex)
    }
    
}
```


参考：[detect event when tapped on already selected segment - Stack Overflow](http://stackoverflow.com/questions/30237667/detect-event-when-tapped-on-already-selected-segment)
Zabbix 3.0をDebian8.5に構築したときの手順まとめ

#概要
少し前にですが、DebianにZabbix 3.0を導入する機会があったので、その際に使用したコマンド類を纏めておきました。
作業自体はパッケージをダウンロードし、インストールしていくだけの簡単なものです。本当に大変なのは、サーバ構築後の監視項目の設定や、処置・エスカレーション設定かと思います。

現在（2017/01/22）では、Zabbix 3.2もリリースされていますね。まだ導入していないため、まとめたコマンドが使いまわせるかは不明です。検証環境でそのうち試してみたいと思います。

#前提
1. Debian8がインストール済み
2. Zabbix3.0のシステム要件を満たしている

#必要資材の準備
```bash

# rootのホームディレクトリへ
su -
cd

# 作業用フォルダ作成
mkdir work
chmod 777 work
cd work

# ファイルのダウンロード
wget http://repo.zabbix.com/zabbix/3.0/debian/pool/main/z/zabbix-release/zabbix-release_3.0-1+jessie_all.deb

dpkg -i zabbix-release_3.0-1+jessie_all.deb

apt-get update

# サーバ側は以下を実行
apt-get install zabbix-server-mysql zabbix-frontend-php

# エージェント側は以下を実行
apt-get install zabbix-agent

# chkconfig インストール
aptitude install chkconfig

cd /usr/share/doc/zabbix-server-mysql
mysql -u root -p

```

#MySQLにZabbix用システムユーザを作成
```mysql

CREATE USER zabbix;
CREATE DATABASE zabbix CHARACTER SET utf8;
GRANT ALL PRIVILEGES on zabbix.* TO zabbix@localhost IDENTIFIED BY '＜システム用パスワード＞'
FLUSH PRIVILEGES;
exit

```

```bash

# DB構築
zcat create.sql.gz | mysql -u root zabbix

```

# 設定ファイル変更
<dl>
  <dt>サーバ側ファイル</dt>
  <dd>vi /etc/zabbix/zabbix_server.conf</dd>
  <dt>エージェント側ファイル</dt>
  <dd>vi /etc/zabbix/zabbix_agentd.conf</dd>
</dl>

以下の項目を書き換える

```bash
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=zabbix
```

# サービススタート

```bash
service zabbix-server start
chkconfig zabbix-agent on
chkconfig zabbix-server on
```

# PHP設定
```php:php.ini
php_value max_execution_time 300
php_value memory_limit 128M
php_value post_max_size 16M
php_value upload_max_filesize 2M
php_value max_input_time 300
php_value always_populate_raw_post_data -1
php_value date.timezone Asia/Tokyo
```

PHPの設定をした後にApacheを再起動

```bash
service apache2 restart
```

#ブラウザ上での設定
1. http://zabbix_server_hostname/zabbix にアクセスし、ユーザ名：Admin、パスワード：zabbixを入力する。
2. 画面の表示に従ってインストールを進めていく。

#参考
**Zabbix 3.0インストールマニュアル**
https://www.zabbix.com/documentation/3.0/manual/installation/install_from_packages/server_installation_with_mysql

**リリース一覧**
http://www.zabbix.com/jp/download

**レポジトリ**
http://repo.zabbix.com/zabbix/3.0/debian/pool/main/z/zabbix-release/
WP REST APIで見出しを取得してTOC（目次）を表示したい！

サイト運営でTOC（目次）使うことはありますよね！
Vue.jsとかReactとかネイティブアプリで見出しをいい感じに表示したいときに、そのままHTMLを取得してフロント側でTOCを作ろうとすると、バババっとちらつくか、アニメーションでごまかすかしかありません！
それが嫌な場合、Railsとかの場合は自分でやってしまえばいいと思うのですが、WP REST APIの場合どうしたら良いでしょうか…
というわけでコードを追加しましょう！

## コード（WP4.7）
**functions.php**

```php
function add_TOC( $data, $item, $request ) {

	$dom = new DOMDocument("1.0", "UTF-8");
	@$dom->loadHTML(mb_convert_encoding($item->post_content, 'HTML-ENTITIES', 'utf-8'));
	$xml = simplexml_import_dom($dom);
        // ここではタイトルがh1だとしてh2
	$dom_data = $dom->getElementsByTagName('h2');
	foreach ($dom_data as $d) {
   $table_of_contents[] = trim($d->nodeValue);
	}

	$data->data['toc'] = $table_of_contents;
	return $data;
}
add_filter( 'rest_prepare_post', 'add_TOC', 10, 3 );
```

これで見出しが表示されます！
（ここではh2だけですが、いろいろ頑張ればhxを配列やオブジェクトにして頑張ることもできると思います）
![tanshio_net_wp-json_wp_v2_posts__embed.png](https://qiita-image-store.s3.amazonaws.com/0/39134/11d7ce5b-69bc-70ef-f344-2352e664a8be.png)

これでネイティブアプリでもSPA的なやつでもちらつくことなく、色々カスタマイズすることが出来ます！
自分の場合はクリックしたらスムーズスクロールするような感じにしました。

## おわりに
いろいろやりたい放題できるのでWP REST APIは非常に便利！（バージョンアップで動かなくなる場合があります）
UnityのデモシーンをAndroid実機で見るまでにハマった点


Version 5.5.0f3

こちらの記事を元に進めた
[UnityでAndroidのVRをGoogleのCardboardでやる2016版](http://qiita.com/JunShimura/items/1a302197278ce0c7a172)


## ハマったところ

- sdkのパスが通ってない
	- だいたいのMacユーザーは`/Users/{ user name }/Library/Android/sdk`にあるので設定する
https://docs.unity3d.com/ja/current/Manual/android-sdksetup.html

- 実機でアプリ起動時に落ちる
	- 「Virtual Reality Supported」にチェックを入れない

- APIのバージョンエラー
	- gvr-permissionsupport-release.aarを削除
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10168573200
NodeListにfilterをかけたくなったら


jQueryが諸事情で使えない（というか外部ライブラリ全般ページに呼び込みたくない）案件があって、`document.querySelectorAll('.nyan')` でとれたDOMの中から（プログラム上）任意のdata値のvalueだけを持つものが欲しい時があり、少し面倒だったので忘備録。

```html
<ul>
  <li class="nyan" data-nyan="1">nyan</li>
  <li class="nyan" data-nyan="2">nyan :)</li>
  <li class="nyan" data-nyan="3">nyan :(</li>
  <li class="nyan" data-nyan="4">nyan ;)</li>
  <li class="nyan" data-nyan="5">nyan ;(</li>
</ul>
```
上記のDOMから `data-nyan` が 3の値が欲しい場合、

```javascript
const nyans = document.querySelectorAll('.nyan');

const resultNyan = nyans.filter((element, index) => {
  return element.dataset['nyan'] === '3';
});

// Error => Uncaught TypeError: nyans.filter is not a function

```
と怒られてしまう。
どうやら[NodeList](https://developer.mozilla.org/ja/docs/Web/API/NodeList)には列挙したりするイテレータはあるものの、特定の要素をつまみ出すようなメソッドは備わってないとのこと。

ということで、純粋にNodeListに対してfilterを使いたい場合、`@type {NodeList} => {Array}` にしてやる必要がある。

```javascript
const nyans = document.querySelectorAll('.nyan');

const convertedTypeArrayNyan = [].map.call(nyans, (element) => {
  return element;
});

const resultNyan = convertedTypeArrayNyan.filter((element, index) => {
  return element.dataset['nyan'] === '3';
});

// resultNyan[0].outerHTML: "<li class="nyan" data-nyan="3">nyan :(</li>"

```

とスッキリいく。

中には `Array.prototype.slice.call`使ったりもあったが、「Arrayライクなリスト型のものを、Arrayとして再配列（マッピング）する」という意味では `Array.prototype.map`のほうがしっくり来たのでこっちを使っている（まぁNodeListの余分な物を削ぎ落とすってことでsliceも考えられなくはないが）。

ということでNodeListでListなんだから、もう少しそこら辺のメソッド拡張してよEcmaさんって雑な感想をもった。
Bundler 1.14.0 で rainbow が `can't modify frozen String` と吐いてインストールできない

簡単に言うと、rubygemsが原因らしいので `gem update --system` でなおる。

cf.

http://blog.rubygems.org/2017/01/20/2.6.9-released.html
https://github.com/sickill/rainbow/issues/48

> This PR adds a missing #dup ("convert frozen string literal to a mutable String object instance") in the same way that 45966be did.

https://github.com/rubygems/rubygems/pull/1819

rubocopの依存なのでちょっとつらかった。


エラーメッセージ

```
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    can't modify frozen String
```

回避策として bundler のバージョンを `1.13.7` に下げても動くので場合によってはこちらも。

自分は解決策にたどり着くのに苦労したので時間の節約になれば :pray:
nginxでレスポンスヘッダを書き換える

upstreamからのレスポンスヘッダ(Content-Type)を書き換える必要があった[^1]ので、対処しました。標準でできるかと思いきや、できないようで、[headers-more-nginx-module](https://github.com/openresty/headers-more-nginx-module)を追加で入れることで解決しました。OpenRestyにバンドルされているモジュールで、nginxでもビルドオプションを追加して利用することができます。

静的ファイルでも検証ができるので、Welcome to nginx!ページのContent-Typeを変えてみます。

## add_header

標準だと`add_header`があるんですが、これはそのまま追加するので、すでにあるヘッダは二重につくことになります。[^2]

Content-Typeに関しては、複数値ではダメ（そう）で、解釈はクライアントの実装に依存し、必ずしも期待する動きをしないので、ちゃんと置き換える必要があります。

``` nginx.conf(抜粋)
 location / {
    add_header 'Content-Type' 'application/json';
    root   html;
    index  index.html index.htm;
}
```

curlで確認

```
curl --dump-header - localhost

HTTP/1.1 200 OK
Server: nginx/1.11.8
Date: Tue, 17 Jan 2017 17:35:45 GMT
Content-Type: text/html		<— 1個目のContent-Type
Content-Length: 612
Last-Modified: Tue, 17 Jan 2017 14:48:14 GMT
Connection: keep-alive
ETag: "587e2eae-264"
Content-Type: application/json		<— 2個目のContent-Type
Accept-Ranges: bytes

bodyの内容…
```

2個目のContent-Typeが出現しました。

## headers-more-nginx-module

今度は、headers-more-nginx-moduleの`more_set_headers`を使って書き換えます。

``` nginx.conf(抜粋)
 location / {
    # htmlだけど、application/jsonで返す
    more_set_headers 'Content-Type: application/json';
    root   html;
    index  index.html index.htm;
}
```

curlで確認

```
curl --dump-header - localhost

HTTP/1.1 200 OK
Server: nginx/1.11.8
Date: Tue, 17 Jan 2017 17:42:27 GMT
Content-Type: application/json　　　　　　　<— Content-Typeがjson一のみ。
Content-Length: 612
Last-Modified: Tue, 17 Jan 2017 14:48:14 GMT
Connection: keep-alive
ETag: "587e2eae-264"
Accept-Ranges: bytes

bodyの内容…
```

ちゃんと書き換わっています。

他にも、レスポンスステータスや、Content-Typeを条件にして、それにマッチした時だけ追加/書き換えるといったことができます。他の使い方は、[headers-more-nginx-moduleのgithub](https://github.com/openresty/headers-more-nginx-module)に例が載っています。

[^1]: JSONを返しているのに、`text/html`と言い張る奴。そして奴自身には手を出せない。
[^2]: [RFC](https://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2)的には、値が複数持てるものに関してはOKらしく、許可されたヘッダだと、複数の同名ヘッダはカンマ区切りの複数の値と同じ意味となり、順序もそのヘッダの順番が値の順番となるべきである。
Pythonista3を使ってカメラロールからsearchbyimageをする

#やりたいこと
iOSのカメラロールに保存された画像からGoogleの[SearchByImage](http://www.google.co.jp/searchbyimage)を使って結果をSafariで見る．

#実現
Pythonista3にはアプリの共有シートから自分で書いたPythonのスクリプトが呼べるという機能があるのでコレを使います．
Pythonista3に関する詳しいことはひとりぶろぐさんのこちら記事（[iOS上で動作する革命的ものづくり環境「Pythonista 3」の魅力をとくと語る](http://hitoriblog.com/?p=42145)）でよく紹介されています．
Pythonista3はPython2.7とPython3.5が使えますが，今回はPython3.5の方で書きました．

#かいた
```python:searchbyimage.py
import requests, appex, imghdr
from requests_toolbelt.multipart.encoder import MultipartEncoder
from objc_util import *

def search_by_image(fp):
	user_agent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.98 Safari/537.36 Vivaldi/1.6.689.40'
	m = MultipartEncoder(fields={'encoded_image': (fp.name, fp)})
	r = requests.post('http://www.google.co.jp/searchbyimage/upload',
		data=m,
		headers={'Content-Type': m.content_type, 'User-Agent': user_agent})
	if r.status_code == 200:
		return r.url
	else:
		return 0

def main():
	image = appex.get_attachments()[0]
	if imghdr.what(image):
		url = search_by_image(open(image, 'rb'))
		if url:
			UIApplication.sharedApplication()._openURL_(nsurl(url))

if appex.is_running_extension():
	main()
```
##だいたいの流れ
1. 画像を選択し，スクリプトを実行．
2. 受け取ったアタッチメントから1つ目のファイルパスを取得．
3. それが画像か一応確認して，`search_by_image()`にかけ，成功すると検索結果のurlが返されます．
4. 返されたurlをSafariで開き，終了．

###画像の受け取り
Pythonista3にはappexという共有シートで受け取ったデータやらなんやらを利用できるモジュールが備わっていて，これでカメラロールの画像ファイルを取得します．
本当なら，`appex.get_file_path()`で画像へのパスが手に入るかと思ったのですが，取得できなかったので，
`appex.get_attachments()`を使って，1つ目のアタッチメントからパスを抜き出しています．

###MultipartEncoder
画像をアップロードするにはmultipart/postとやらを使う必要があり，私にはよくわからない．
どうやら，requests_toolbeltというパッケージに便利なものがあるらしい．
しかし，初期のPythonista3に，requests_toolbeltはない．
そこで活躍するのが[StaSh](https://github.com/ywangd/stash)．
これでpipが使えるようになるので，こちらからインストールしました．

###なんかよくわからんが，webbrowserが使えない
urlを開くには`webbrowser.open()`をしますが，どうやら共有からではうまく動かないみたい．
まず`from objc_util import *`でObjective-Cへのブリッジ機能を使えるようにします．
そして，`UIApplication.sharedApplication()._openURL_(nsurl(url))`を呼び出すことで，Safariでurlが開けます．
この辺の仕組みは理解できていないのですが，これを使うことで，共有シートからSafari，またはurl schemeを使えば違ったアプリを開くことも可能です．

#おわり
次はTwitterに流れてきた画像からSearchByImageが使えたらいいかなと思います．
ASUS E200HA(Ubuntu desktop 16.10)で内蔵無線LANを利用する

この記事は、ASUS E200HA に Ubuntu desktop 16.10 をインストール後、内蔵無線LANを利用して、インターネットに接続できるようにするための手順をまとめたものです。

手順については、以下のサイトを参考にさせて頂きました。
ASUS E200HAをLinux機にする: [http://www.cloudninja.asia/asus-e200ha_linux](http://www.cloudninja.asia/asus-e200ha_linux)

内蔵無線LANを有効にしないと、必要なファイルをダウンロードできないので、
あらかじめUSBハードディスクに保存していきます。

必要なファイルについては、以下になります。
(1)Xmodmap(wget https://raw.githubusercontent.com/jake-taro/blog/master/.Xmodmap)
(2)ath10k-firmware-master(https://github.com/kvalo/ath10k-firmware)

上記 (1)、(2) をインターネットに接続できているPCを利用して、ダウンロードしていきます。
今回は、Windows10のノートPCを利用します。

※Windows側での作業 
・wget コマンドを Windows10 で利用できるようにする。
  1.http://gnuwin32.sourceforge.net/packages/wget.htm にアクセスします。

  2.Complete package, except sources で Setup をクリックして、wget-xxx-setup.exe をダウンロードします。

  3.setup.exe を起動して、インストールを行い、wget.exe の場所をメモします。
    例：(C:\Program Files (x86)\GnuWin32\bin\wget.exe)

  4.wgetコマンドが使えるように、PATH を設定します。　
    スタートメニュー->Windowsシステムツール->コントロールパネル->システムとセキュリティ->システムから、
    システムの詳細設定->環境変数をクリックします。PATH に C:\Program Files (x86)\GnuWin32\bin を追加します。

・.Xmodmap ファイルを取得する。
   コマンドプロンプトから、以下のコマンドを入力して、取得します。
   wget https://raw.githubusercontent.com/jake-taro/blog/master/.Xmodmap
   取得したファイル .Xmodmap は、このままでは、Ubuntu側で見れない為、Xmodmap に変更しておきます。

・ath10k-firmware-master を取得する。
   https://github.com/kvalo/ath10k-firmware にアクセスします。
   Clone or Download ボタンをクリックして、DownLoad ZIP をクリックします。
   ダウンロードしたファイルを解凍すると、ath10k-firmware-master を取得できます。

※Ubuntu 側の作業
  1.USBハードディスクに保存した、Xmodmapファイルと ath10k-firmware-master を ホームディレクトリ に保存します。

  2.CTRL + ALT + t キーを押して、ターミナルを起動します。

  3.キー入力で入力できないキーを入力できるようにする為、以下のコマンドを入力します。
    $ xmodmap Xmodmap
    これで、ALT + "-" キーで "_" が入力できます。

  4.無線LANを使用できるようにする為、以下のコマンドを入力します。
    $ cd ath10k-firmware-master/QCA9377/hw1.0
    $ sudo mkdir /lib/firmware/ath10k/QCA9377
    $ sudo mkdir /lib/firmware/ath10k/QCA9377/hw1.0
    $ sudo cp board.bin /lib/firmware/ath10k/QCA9377/hw1.0
    $ sudo cp firmware-5.bin_WLAN.TF.1.0-00267-1 /lib/firmware/ath10k/QCA9377/hw1.0/firmware-5.bin
    $ sudo modprobe -r ath10k_pci
    $ sudo modprobe ath10k_pci

これで、内蔵無線LANが有効になりました。
IT業界を受ける就活中の文系大学生へ

この前、友人と話ししていて、IT業界を受けようと思うのだけれど、何を勉強すれば良い?と言われたのを改めて考え直した、個人的な意見
Qiitaを見るような、IT業界を受ける文系就職活動中の大学生がいるかは謎

## 書いてる人
* AndroidとiOSアプリを作る仕事を3年
* 大学時代は個人でプログラミングなんぞせず、サークルと麻雀にはまっていた理系
* 意識はそこまで高くない。だから勉強のために良いサイトなど知らない

## 対象
* 今までプログラミングをしていないが、IT業界を受ける文系大学生
* 大学位でしかプログラミングをしていない理系大学生
* 浪人中の文系の友人

自分でプログラムバリバリ組んでるわーという意識高い人は読まなくて良いと思います

## 最低限の確認
まず、重要なのは短期でも、プログラマとして生きていけるかどうかの最低限のチェックだと思う
(個人的にはいないだろと思うのだが)ごく稀にどうあがいても必須であろう考え(ifやforというもの)が理解できないという人もいるらしい
これが理系であるならば、既に大学で判断できているだろうが、そうでない場合は、チェックをしておくことをお勧めする。ただし、お金をかける必要はない

本当に時間がない場合なら、[paizaのJava入門編](https://paiza.jp/works/java/primer)を受けておくとチェックはできそう。タイトル読んで受けるだけ無駄だと思うなら、大丈夫だと思う。
それなりに時間がある(30時間くらい?)、または、(決めるの早いが)一生プログラマーとして生きていこうというのなら[UdacityのIntro to computer Science](https://www.udacity.com/course/intro-to-computer-science--cs101)を受けておくといい。これはGoogleも推奨しているものである
内容は英語だけれど、youtubeなので日本語字幕を出せるし、すごく丁寧に解説している
途中までしか受けていないが、ただ、プログラム組めるよ!というだけでなく、プログラムとは?みたいな知識的な面もある
欠点はpaizaと言えばわかるかもしれないけれど、Udacityと言ってもプログラマでも分からない可能性があること。

後、本当に念のために言っておくと、わからないことがあったらGoogleで検索するとかそういうPCを触れること。まぁ、これは今時の大学生なら大丈夫だろうけれど

## 勉強しておくべきこと
さて、浪人もしてるし、文系新卒だし、理系卒に負けずに採用されるために勉強したいという思いがあるかもしれない
で、何を勉強しておけば良いかと言われると、まず英語
新卒文系OKと言ってる時点で大抵の会社は、その時点でのプログラミング能力に期待していない。会社としても、プログラミング?大学でやりましたよ、より、英語?ネイティブですね。の人の方を取りたいはず

後、プログラマとして、最低限度、意味はわからないが英語にアレルギーを出さず、かつ、辞書やGoogleあれば意味は読み解けるレベルは必要(極論言ってしまえば、Google翻訳に打ち込めば和訳できるけど、完璧に出来るわけではないし) 
一番重要なのはreading。これは、度々英語が出てくるため、英語で読めるのと逐一Googleを使うのとでは時間が倍以上違う。Googleなんかは和訳されたページもあるけれど、英語しかないページも多く、更にそれを読まないといけない時も多々ある。
その他の、書き聞き喋りは、まぁ、出来ると優秀よね、なんかで役に立つよね、プログラマーから脱却しやすいよね、という感じ(書き聞きは、勉強の仕方次第ではすぐに使うけれど、喋りは少なくとも新卒直後で使うとは考え難い)
というわけで、差別化を図りたいなら英語にするべき

もし、どうしてもプログラミングやコンピューターサイエンス関連を勉強したいなら先ほどのUdacityを上げる。英語も勉強できるし。もしくは、[Googleが学生向けの勉強内容を上げているページ](https://www.google.com/about/careers/students/guide-to-technical-development.html)を上の方から適当に選んで受けていくと良い。なんか有名なエンジニアもアプリエンジニアはここに書いてあるのほとんど受けとけと言ったとか言ってないとか
実際にプログラミング自体を勉強するなら[Free Code Canp](https://www.freecodecamp.com)もあるが、全て英語でわかりにくいし、git登録とかハードル高いし、長いのでこの段階ではお勧めはしない

プログラミングのプの時も知らなさそうな面接官に、ハッタリをかますために何かを作るというのであれば、リアルの知り合いのプログラマに教えてもらうのをお勧めする。知り合いのプログラマが居たら、ハッタリかませるようなサイトやアプリくらいなら多分1日くらいで作れる。因みに作って、ではなく、どうすれば良いか、詰まった時に教えてくれるために1日くれにしよう

## キャリアについて
勉強の仕方の後で述べることではないが、そもそも将来について考えるべきではある
極端に言えば、プログラマで生きていっても良いと思わないのであれば、別の業界を受ける方が良い
というのも、転職には実務経験がいるよ。というものが多い
ついでに言えば、ITでも、アプリエンジニアの実務経験いるよ、サーバーエンジニアの実務経験いるよ、ゲーム開発の実務経験いるよ、と分かれている

なので、まぁ、生きるために働いてるだけだからなんでも良いとか、なりふり構わない場合以外はやめといた方が良い
また、将来的に、エンジニアで一生食べるのを目指す、営業、PGマネージャーになるなどによって勉強することや、しておきたい内容も変わるけれど、それは内定もらってからで構わないから今気にしなくても良いだろう

## まとめ
と、まぁ、意識低い系が、IT業界で内定をもらうためについて考えてみた
書いてあることは、就職なんてなんでも良いと思ってた意識低い系が社会人になって、あの頃しておくべきだったと思ったこと
最低限の確認は、社会人でエンジニアになって条件分岐わからないってなんかで読んだ気がするし
勉強しておくべきことは、大学時代は英語?Google翻訳あるし必要ないやろ、と思っていたし
キャリアについては、今絶賛後悔している。ゲーム業界行きたいけどUnityの実務経験とかねぇよ…
また、サークルの先輩でも何でも、頼れるツテがあるなら、こんな記事よりそちらを頼った方が良い

後、この手の記事のtagは何をつければ良いのだろうか
Android x86 6.0をUSBメモリにインストールする

Android-x86をUSBに入れる際に苦労したので手順をメモしておきます

###インストール時の罠は何だったか
それはずばり、GRUBのバージョンにありました。
Android-x86のデフォルトのインストーラーではGRUB(無印)がインストールされますが、
これは実はext4のパーティションからブートすることができないのです…！

しかし、実際のインストーラーでは最初のパーティションのフォーマット画面でext4/ntfs/fat32しか選択できません。
![androidformat.png](https://qiita-image-store.s3.amazonaws.com/0/155534/0418b090-aa46-cc5e-893b-d417643e48fb.png)

当然ntfs/fat32はlinuxが直接読み書きできないので論外として(ntfsは試してみましたが起動すらしませんでした)、
ext4を使うとGRUBからは起動できずError 17で止まってしまいます。

それではext3で自分でフォーマットすればよいだろうということで、Ubuntuを使いフォーマットしてからインストールしてみるも、どうにもうまくいかず…
調べてみると、インストーラーがアップデートされておらず正しく動作しないといった話もちらほら見受けられました。

それではどうすればいいかと調べていたところ、下記のページにたどり着きました。
https://forum.xda-developers.com/android/general/guide-triple-boot-android-ubuntu-t3092913

これは「AndroidをUbuntuとデュアルブートするためにデフォルトのインストーラーを使わずにインストールしてみたぜ！」といった趣旨の記事です。
試しにこれを参考にしてUSBにインストールしてみたところうまくいきましたので、その手順を以下に記します。


###必要な環境
・Ubuntuが起動するPC（バージョンはなるべく新しいほうが良いと思います）

###手順

####1.Android-x86をダウンロード
以下のページからダウンロードします。
[Android-x86 プロジェクト日本語トップページ - OSDN](https://ja.osdn.net/projects/android-x86/)
最新版のisoイメージをダウンロードしてください。

####2.USBメモリのフォーマット
まず、USBメモリをUbuntuPCに接続します。
そうしたら端末で`fdisk -l`を実行し、USBにどのデバイスidが割り当てられているかを確認します。
(例えば、HDDが1台だけの環境であれば/dev/sdbが割り当てられているはずです)
以下は、/dev/sdxに割り当てられているものとして話を進めます。

次に、USBのパーティションテーブルがGPTだといけないので、以下のコマンドで一応MBRに書き換えておきます。

```bash
$ sudo parted /dev/sdx -s mklabel msdos
```

そうしたら次はGpartedを使ってUSBメモリ上にext4の基本パーティションを1つ作成します。
Gpartedをインストールしたのち、root権限で起動します。

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

あとは、gparted上でUSBメモリを選択し、ext4の基本パーティションを一つ作成します。
(既存のパーティションがもしあればそれらはすべて削除します)

これでフォーマットは完了です。

####3.Androidのシステムイメージのコピー
まずは、Android-x86のisoを7zを使って展開します。

```bash
$ 7z android-x86-6.0-r2.iso -oandroid_installation
$ cd android_installation
```

次に、system.sfs内のファイルを展開します。
squashfs-toolsを使いますのでそれをインストールしたのちに行います。

```bash
$ sudo apt-get install squashfs-tools
$ sudo -s
$ unsquashfs -f -d . system.sfs
$ mkdir temp
$ mount -o loop system.img temp
```

最後に、USBメモリをマウントし、そこにデータをコピーします。

```bash
$ mkdir /mnt/usb
$ mount /dev/sdx1 /mnt/usb
$ cp initrd.img ramdisk.img kernel /mnt/usb/
$ mkdir /mnt/usb/system
$ mkdir /mnt/usb/data
$ cp -avr temp/* /mnt/usb/system/
$ umount temp
$ exit
```

####4.GRUB2のインストール
まずは、メニューエントリにAndroid x86を追加します。
/etc/grub.d/40_customを管理者権限で開き、以下の記述を追加して保存します。

```
menuentry "Android x86 6.0" {
set root='(hd0,1)'
linux /kernel quiet root=/dev/ram0 androidboot.hardware=android_x86 acpi_sleep=s3_bios,s3_mode SRC=/ HWACCEL= 
initrd /initrd.img
}
```

次に、USBメモリにGRUB2をインストールし、設定ファイルを書きだします。

```
$ sudo grub-install --boot-directory=/mnt/usb/boot /dev/sdx
$ sudo grub-mkconfig -o /mnt/usb/boot/grub/grub.cfg
```

最後に、grub.cfgに書き出された不要な部分(Ubuntuの起動に関する部分)を削除します。
/mnt/usb/boot/grub/grub.cfgを管理者権限で開き、
「### END /etc/grub.d/00_header ###」の直後の行から、
「### BEGIN /etc/grub.d/40_custom ###」の直前の行までを削除し、保存します。

これでインストールは完了なので、USBメモリをアンマウントします。

```bash
$ sudo umount /mnt/usb
```

###補足
上記の手順ではGRUB2を入れてるので、おそらくUEFIから起動するようにすることも可能かと思われます。

###おわりに
今回のことを通して、grub,grub2の扱い方がなんとなく分かった。
OSって色々と難しいな。。。
「Codelab: Webアプリケーションを書いてみよう」を動かす

## いきさつ
[Go言語によるwebアプリの作り方](http://www.slideshare.net/yasi_life/goweb-16448500)
なんだか色々情報が抜けている様子。

出ていたエラーで調べてみたところ、「[Codelab: Webアプリケーションを書いてみよう](http://golang.jp/codelab-wiki)」にたどりつきました。
ソースは、[ここ](https://github.com/ssrl/go)から拾ってきました。

が、`go\doc\codelab\wiki\final.go`が動かない。
最初のページに答えが揃っているようなので、`final.go`をもとに作成します。

## 修正
### packageを正しく修正

```go:修正前
import (
	"http"
	"io/ioutil"
	"os"
	"regexp"
	"template"
)
```

```go:修正後
import (
	"io/ioutil"
	"net/http"
	"regexp"
	"text/template"
)
```
OSパッケージは使いません。

### http.Error()がないのでpanic()を使う様に修正

```go:修正前
		http.Error(w, err.String(), http.StatusInternalServerError)
		return
```

```go:修正後
		panic(err)
```

### template.Must(template.ParseFiles())に変更


```go:修正前
func init() {
	for _, tmpl := range []string{"edit", "view"} {
		templates[tmpl] = template.MustParseFile(tmpl+".html", nil)
	}
}
```

```go:修正後
func init() {
	for _, tmpl := range []string{"edit", "view"} {
		templates[tmpl] = template.Must(template.ParseFiles(tmpl + ".html"))
	}
}
```

### viewファイルの修正
|変更前|変更後|
|---|---|
|{Title}|{{.Title}}|
|{Body&#124;html}|{{printf "%s" .Body}}|


## ちょっとだけリッチにする
そのままだと、Viewファイルもテキストファイルも全部同じディレクトリに吐かれてしまいます。
先の記事の最下部にあるので、ちょっとやってみました。

* 読み書きされるtxtファイルを、`data`ディレクトリから読み書きするように変更  
`data`ディレクトリを作成する

```go
// ファイルに保存する処理
func (p *Page) save() error {
	filename := "data/" + p.Title + ".txt"
	return ioutil.WriteFile(filename, p.Body, 0600)
}

// ページを読み込む処理
func loadPage(title string) (*Page, error) {
	filename := "data/" + title + ".txt"
	body, err := ioutil.ReadFile(filename)
	if err != nil {
		return nil, err
	}
	return &Page{Title: title, Body: body}, nil
}
```

* 初期化処理で読み込むViewテンプレートを、`view`ディレクトリから読むように変更  
`view`ディレクトリを作成し、`view.html`と`edit.html`を移動する

```go
func init() {
	for _, tmpl := range []string{"edit", "view"} {
		templates[tmpl] = template.Must(template.ParseFiles("view/" + tmpl + ".html"))
	}
}
```

## 実行確認
```bash
$ go run wiki.go
```
`localhost:8080/view/foo`にアクセスする
`localhost:8080/edit/foo`にリダイレクトすればOK
オフラインリアルタイムどう書くF01の問題の Java による実装例


問題 : http://nabetani.sakura.ne.jp/hena/ordf01_twicel/
実装リンク集 : http://qiita.com/Nabetani/items/8e02ede04315b4eadd6d

Java のことをよく知らないので変なことを書いているかもしれないんだけど、気にせず投稿。

```java
import org.junit.Assert;
import org.junit.jupiter.api.Test;

public class TwinCell {
    private static class Solver {
        private class Searcher
        {
            int c=0;
            int col;
            Searcher( int x, int y)
            {
                col = color(x,y);
                search( x, y );
            }
            void search( int x, int y )
            {
                if ( col != color(x,y) || ( attended[y] & (1<<x)) != 0 ){
                    return;
                }
                c+=1;
                attended[y] |= 1<<x;
                search( x+1, y );
                search( x-1, y );
                search( x, y+1 );
                search( x, y-1 );
            }
            int size()
            {
                return c;
            }
        }
        int[] bits;
        int[] attended = new int[8];
        static final int WX = 8;
        static final int WY = 8;
        public Solver(int[] _bits)
        {
            bits = _bits;
        }
        boolean onField( int x, int y)
        {
            return !( x<0 || WX<=x || y<0 || WY<=y );
        }
        private int color( int x, int y ){
            if ( !onField( x, y )){
                return -1;
            }
            return (bits[y] & (1<<x) )==0 ? 0 : 1;
        }
        public int[] solve() {
            int[] r = new int[2];
            for( int y=0 ; y<WY ; ++y ){
                for( int x=0 ; x<WX ; ++x ){
                    if ( new Searcher( x, y ).size()==2 ){
                        ++r[color(x,y)];
                    }
                }
            }
            return r;
        }
    }
    public String solve( String src )
    {
        String[] lines = src.split("\\/");
        int[] bits = new int[lines.length];
        for( int i =0 ; i<lines.length ; ++i ){
            bits[i]=Integer.parseInt(lines[i], 16);
        }
        int[] wb = new Solver( bits ).solve();
        return String.format( "%d,%d", wb[0], wb[1] );
    }

    void test( String src, String expected )
    {
        Assert.assertEquals( expected, solve( src ));
    }
    @Test
    void runAllTests()
    {
        /*0*/ test( "dc/bc/a7/59/03/d5/d4/ea", "2,3" );
        /*1*/ test( "ff/ff/ff/ff/ff/ff/ff/ff", "0,0" );
        /*2*/ test( "00/00/00/00/00/00/00/00", "0,0" );
    }
}
```

rubyとC99 のとき( http://qiita.com/Nabetani/items/7814edd97911a80946f1 )とは異なり、深さ優先探索でマス目の数を数えることにした。

生まれて初めてクラス内クラス内クラスを使ってみた。
あと、static じゃない inner class という珍しいものも使ってみた。
AWSとWordpress使っていてレイアウトが突然崩れた時の対処

Wordpressを使っているとレイアウトが崩れてしまうことがあります。
#症状

```
http://サイトのURL/ディレクトリ/wp-login.php
```
でログイン画面にアクセスしてみると、結構待たされて、こんな感じになります。
![スクリーンショット 2017-01-21 21.30.28.png](https://qiita-image-store.s3.amazonaws.com/0/144904/02409f02-1344-0753-abc6-a6d9e0d88243.png)
というかログイン画面どころかサイト自体も　こんな感じになってます。困る。
CSSが働いてないのが明らかですね。
#原因
原因１:RDS側にIPアドレスが保存させていて、そのIP(変わる前にアクセスした時のIP)と今のIP(変わった後)が違う
原因2:セキュリティグループの割り当てが間違っている
原因3:CSSの読み込む部分の記述が間違っている

#対処

##原因１：RDS側
```
$
$ mysql -h RDS -P 3306 -u ユーザ名 -p DB名
$ mysql> use DB名
$ mysql> select * from wp_options where option_name = 'siteurl';
$ mysql> select * from wp_options where option_name = 'home';
```
セレクトで出した値が違ったらIPアドレスの設定が違うってことなので更新

```
$ mysql> update wp_options set option_value = '現在のドメイン・IPアドレス' where option_name = 'siteurl';
$ mysql> update wp_options set option_value = '現在のドメイン・IPアドレス' where option_name = 'home';
```

これで無事解決

##原因２：セキュリティグループ
http://qiita.com/nao-otsu/items/8cabd447d73b621cd07d
http://sekai.hateblo.jp/entry/2013/07/13/192846

##原因3：CSS
http://nyannyao.net/memo/wordpress-memo/entry258.html
#結果
最初から作ったほうが早いかもですね。
#参考
http://promamo.com/?p=3026
コミットメッセージ | Tips for Internship 2

---
#### [ Tips for Internship ] について

[KARAPPO](http://karappo.net)にインターンの学生さんが入ってきたので、教育過程で出てきたTipsのうち、一般的なことはここに書いていってみようと思います。間違ったことを教えていたら恥ずかしいのですが、自分の気持ちを引き締めるために公開してみます。なにかおかしなことがあれば、指摘していただけるとありがたいです。

---

一部のインターン生には、既に弊社のウェブサービスのコードにコミットしてもらっています。その中でコミットメッセージについても、注意することがありそうなので、今後も増えていきそうだし、他のインターン生にも気をつけてもらいたいので、書いておきます。

# コミットメッセージで注意すること


1. 文章はできるだけ簡潔に
2. 敬語は不要
3. 「どのファイルのどこを修正したのか」はdiffを見ればわかるので、できるだけそれ以上のことを伝えるように意識する（簡単な修正の場合は、難しい場合もあると思いますが）
4. 長くなってしまう場合は、[空行を使って**タイトル**と**本文**に分ける](http://qiita.com/itosho/items/9565c6ad2ffc24c09364#%E5%8E%9F%E5%89%87)。わけておくと、こんな感じで表示されます。
![Screen Shot 2017-01-21 at 19.04.59.png](https://qiita-image-store.s3.amazonaws.com/0/4404/870faff2-c7e0-8f2f-2fc4-2ae7d60e1b5c.png)


## 参考

- [Gitのコミットメッセージの書き方 - POSTD](http://postd.cc/how-to-write-a-git-commit-message/)
GoでNULL値含むレコードがDBから取得できないとき

# sql.NullString(or NullXXX)を使いましょう

[stackoverflowにある似たような質問](http://stackoverflow.com/questions/32795407/how-to-handle-null-values-in-gorp-select)

# 背景
[sqlパッケージのAPIドキュメント](https://golang.org/pkg/database/sql/#example_DB_Query)のサンプルを参考に値を取ってくるとします。例えばこのようなコードですね。

```　Go
    age := 27
    rows, err := db.Query("SELECT id, name, address FROM users WHERE age=?", age)
    if err != nil {
            log.Fatal(err)
    }
    defer rows.Close()
    for rows.Next() {
            var id string
            var name string
            var address string
            if err := rows.Scan(&id, &name, &address); err != nil {
                    // もしレコードのどこかにNULL値があれば、errを吐いて終了する。
                    log.Fatal(err)
            }
            fmt.Printf("%s %s %s\n", id, name, address)
    }
    if err := rows.Err(); err != nil {
            log.Fatal(err)
    }
```
ここでもし**nameがNULL値だった場合、errを吐いてこけます**。だからNULL値を許容するカラムには**stringではなくsql.NullStringを使いましょう**というだけの話なんですが。。。ここでもしrows.Scan()のエラーチェックを省略すると、見かけ上処理が正しく終わったようになってしまうため、ハマってしまうことがあるかと思います。

```　Go
    age := 27
    rows, err := db.Query("SELECT id, name, address FROM users WHERE age=?", age)
    if err != nil {
            log.Fatal(err)
    }
    defer rows.Close()
    for rows.Next() {
            var id string
            var name string
            var address string

            // 例えば id:"1", name:NULL, address:"Tokyo"というレコードが合った場合、
            // errorチェックを省くと・・・
            // id=1, name=, address=\n
            // が標準出力される。見かけ上、name, addressが空文字だっただけに見える。（実際はaddressにはデータがあるが、Scan()が中断されて取得できていない）
            /*
            if err := rows.Scan(&id, &name, &address); err != nil {
                    log.Fatal(err)
            */
            rows.Scan(&id, &name, &address)           

            fmt.Printf("id=%s name=%s address=%s\n", id, name, address)
    }
    if err := rows.Err(); err != nil {
            log.Fatal(err)
    }
```

# まとめ
- sql.NullString(NullXXX)使いましょう
- エラーチェックサボらないようにしましょう
Keynoteのスライドにコードをシンタックスハイライト付きでコピペする

highlightを使った方法がよく紹介されていますが、IntelliJ IDEAを使った方法がお手軽ですが他に記事がないみたいだったので書いてみました。

手順という手順はなく、IntelliJ IDEAのエディタ上でコピーしてKeynoteに貼り付けるだけです。[^1]
![スクリーンショット 2017-01-21 21.25.48.png](https://qiita-image-store.s3.amazonaws.com/0/387/fe205523-1ec4-47e9-ffc3-44b972b03af2.png)

テーマがDerculaの場合はこんな感じの文字がある部分だけ背景が設定されるので、
![スクリーンショット 2017-01-21 21.25.26.png](https://qiita-image-store.s3.amazonaws.com/0/387/f47e54e0-4426-4e26-3467-96c4c76d907c.png)

背景色を`#2B2B2B`に変えてやるとちょうど良い感じになると思います。
![スクリーンショット 2017-01-21 21.25.01.png](https://qiita-image-store.s3.amazonaws.com/0/387/16f2ed02-8a8d-6566-2eb1-a8bd79e9968b.png)



[^1]: WebStormでも同じように出来たので、多分他のJetbrains製品でも可能だと思います。
Bitbucketに新規リポジトリを作成後、既存の作業ディレクトリと紐付ける

既存の作業ディレクトリと新規作成したBitbucketのリポジトリを紐つけたいことがあったので、その時の対応メモです。

環境：
- macOS Sierra
- git 2.8.2

Bitbucketで新規にリポジトリを作成すると、下記のようが画面がでてきます。
![outerbridge   myrepo — Bitbucket.png](https://qiita-image-store.s3.amazonaws.com/0/80460/b9f42eb8-9ca9-cd0c-85df-3d7d827840a9.png)

で、これを鵜呑みにすると以下のようなエラーが、、

```
$ cd /path/to/my/repo
$ git remote add origin https://outerbridge@bitbucket.org/outerbridge/myrepo.git
fatal: Not a git repository (or any of the parent directories): .git
```

そもそも、リポジトリがないからエラーになってるようです。
ということで、"git init"してから再度トライ。

```
$ cd /path/to/my/repo
$ git init // これ大事
$ git remote add origin https://outerbridge@bitbucket.org/outerbridge/myrepo.git
$ git add .
$ git commit -m "initial commit"
$ git branch // push前に、念のため masterブランチができてるか確認
* master
$ git push origin master
```

これで、紐付けが完了。
Reactでページ遷移時にアラート・確認ダイアログなどを出す方法


以下は react-router v3 系時代の情報です。

v4 以降ではこちらの `<Prompt>` を使うことによって実現できます。
https://reacttraining.com/react-router/core/api/Prompt


-----

ページ遷移時に「○○は保存されていません。保存しますか？」的なメッセージを出したいことがあったので、実装方法を調べてみました。

結論から言うとrouterの "setRouteLeaveHook" 関数を使います。

公式ページにwithRouterを用いた例があります。
[https://github.com/ReactTraining/react-router/blob/master/docs/guides/ConfirmingNavigation.md](https://github.com/ReactTraining/react-router/blob/master/docs/guides/ConfirmingNavigation.md)

私はたまたま、子のコンポーネントにpropsとしてrouterを渡していたので、そのまま使ってみます。
"componentDidMount"内に以下の様なコードを入れます。

    this.props.router.setRouteLeaveHook(current_route, this.alertOnLeave.bind(this));

一つ目の引数は今ユーザがいるRouteを表します。
二つ目の引数はhookとしての関数を表します。

hookする関数は下記のように文字列をReturnします。

    public alertOnLeave(){
        if(this.state.memo_unsaved){
            return "メモが保存されていません。\n編集した内容は失われてしまいますが、このページを離れてもよろしいですか？";
        }
    }

そうすると、ページを離脱する時にその文字列が入ったアラートが表示されます。

↓こんな感じ
![image](https://qiita-image-store.s3.amazonaws.com/0/150569/0be1be82-266b-fe3a-327e-65aa7f7e804b.png)
MicroPython on the ESP8266 (ESP-WROOM-02) 電源電圧の取得

ESP8266はTOUTの入力を無効にすると、電源電圧(3V3)端子に入ってくる電源電圧が測定できます。micropythonでの使い方をまとめました。
Arduinoでの方法は、[ESP8266+Arduinoの電源電圧(VCC)の測定方法](http://qiita.com/ryokai/items/5ec7e0d88f4dc08dff69)に書かれています。
# 配線
ESP-WROOM-02のTOUTは何も接続せず、オープンにしておきます。
何か接続していると、取得する値がおかしくなります。

# モード変更
電源電圧の測定をするためにはADCのモードを変更する必要があります。
Arduinoだと

```
ADC_MODE(ADC_VCC);
```
のマクロでモードが変わりますが、これはコンパイル時のオプションで、Arduinoでもコードブロックの中には書けません。
micropythonの場合は、ファームウェアを書き換える必要があります。
下記のサンプルコードで、ファームウェアを書き換え、モードを変更できます。

```python:
import esp
from flashbdev import bdev
import machine

ADC_MODE_VCC = 255
ADC_MODE_ADC = 0

def set_adc_mode(mode):
    sector_size = bdev.SEC_SIZE
    flash_size = esp.flash_size() # device dependent
    init_sector = int(flash_size / sector_size - 4)
    data = bytearray(esp.flash_read(init_sector * sector_size, sector_size))
    if data[107] == mode:
        return  # flash is already correct; nothing to do
    else:
        data[107] = mode  # re-write flash
        esp.flash_erase(init_sector)
        esp.flash_write(init_sector * sector_size, data)
        print("ADC mode changed in flash; restart to use it!")
        return
```
この関数を以下のように呼び出してモードを変更します。

```
set_adc_mode(ADC_MODE_VCC)
```
# 電源電圧の測定
電源電圧は、ADC(1)を読むことで取得できます。3.3Vの場合は、3300が返ります。

```python:
vcc = machine.ADC(1)
print(vcc.read())
```

以下を参考にしてまとめています。
[esp8266 read vcc](https://github.com/micropython/micropython/issues/2352)
Domain Driven Design Quicklyを読んでみた

Domain Driven Designのライト版
dddのこと調べていたらあったので読んでみた。
なるほどなと思ったことをメモ

下記からpdfダウンロードできます
https://www.infoq.com/jp/minibooks/domain-driven-design-quickly

- ドメインとはソフトウェアが価値を生み出す業務領域  
ワークフローの集まり？これを開発者が理解する必要がある。  
詳細なワークフローを知る人物からドメインを抽出する必要がある？  

__コードの設計上のミスは簡単に修正できるが、
ソフトウェアの設計上の失敗には多くのコストがかかる__

- ドメインモデルの設計≒ソフトウェア設計 
そのあとに細部の要素を決める、コードの設計がある
  

- ドメインの専門家は、高度な専門的知識を持っているがその知識を
独特の方法で組み立てて使う。
この方法にシステムを合わせると、人にシステムを合わせることになりプロダクトが失敗する？
そうではなくて、専門家との議論の中からいくつかのカギとなる概念を掘り出し
システムと人がうまく適応できるようなモデリングを行っていくのがよいらしい 
→ドメインモデルを共に作成する。
 ソフトウェアとドメインを一体にさせるため。ここに時間をかけてかまわない。

- ドメインモデルを作る際には、共通認識として持てる言葉を設定する。
これは、開発者のみがわかる言語でも、ドメインの専門家のみがわかる言語ではダメ。  

### モデルからコードへの変換

- 分析モデル  

業務ドメインを分析した結果。
ソフトウェアとして実装することを考慮していない。
あくまでドメインをよく理解しようとするためのもの

アナリストがこれを開発者に丸投げしてしまうとコード設計者(開発者)独自の
意図や、アナリストが持っているドメインの知識が失われてしまう。
開発者は図やモデルから全てをくみ取ることはできない。
__→間違った実装につながる__

コードの設計の前にアナリストと会議に参加してドメインとモデルについての
見通しを完璧にしておく

### エンティティ
システムの中で一意性が保たれるべきオブジェクト。例えばidで区別される

### バリューオブジェクト
ドメインの側面を表現するためのオブジェクトで一意性を保つ必要がないもの
ドメインの要素を属性にするときに、その属性を含むオブジェクトを
識別するよりもどんな属性を含むかに関心がある場合  
ex.)
線を描画する際に用意するPointクラス。
このクラスは、自らの座標だけに関心を持っていればいい。

なるべく変数の上位概念は取り出しておく
例えば、street, city, stateはAddressクラスにしておくなど

### サービス
内部に情報を保持せず、単純に機能だけを提供する
サービス≠サービスとして振る舞うオブジェクト
→操作を実行するオブジェクトや操作の対象となるオブジェクトと関係する
結局、オブジェクトに適切と思われないような振る舞いはサービスとして
定義しましょうってこと

適切じゃないっていうのは、
ある２つのオブジェクト利用して計算をするときとか
色々なオブジェクトを利用してファイル出力行うとか
やはり、複数オブジェクトをつなげる役割のときに使われるものな感じ
ドメインオブジェクトのような業務ロジックなどがあたる

#### サービスの特徴
-  サービスとして作成される操作はドメインの概念をあらわしているが
エンティティやバリューオブジェクトに含めると違和感がある。

-  サービスとして作成される操作はドメイン内の他のオブジェクトから参照される。

-  サービスとして作成される操作は状態をもたない。


### モジュール
関係の強いクラス同士をグループ化してモジュールに含めて
モジュールの凝集度は高いほうがいい
ドメインが肥大してきた時の、サービスが集まる上位概念？  

#### 凝集度の種類
-  通信滴凝集
   モジュールの各部分が同じデータを操作する
   
-  機能的凝集
   モジュール全体にまたがって１つのうまく定義されたタスクを実行

後者が最良の凝集らしい。
MicroPython on the ESP8266 (ESP-WROOM-02) deep sleep

ESP8266の特長であるdeep sleepのmicropythonでのやり方をまとめました。
micropythonのセットアップは、[ESP-WROOM-02でMicroPython (Mac)](http://qiita.com/taka-murakami/items/a3c05115d5a5038ebb11)でまとめています。
# 配線について
IO16ピンをRST端子に接続します。配線はarduinoなどと同様です。
Qiitaでも、[ESP8266の真骨頂Deep-Sleepモードの使い方](http://qiita.com/azusa9/items/65a5c3772c41631b5ca1)に記事があります。

# micropythonコード
以下がサンプルコードです。簡単です。

```python:main.py
import machine
import time

# check if the device woke from a deep sleep
if machine.reset_cause() == machine.DEEPSLEEP_RESET:
    print('woke from a deep sleep')

# configure RTC.ALARM0 to be able to wake the device
rtc = machine.RTC()
rtc.irq(trigger=rtc.ALARM0, wake=machine.DEEPSLEEP)

while True:
    # ここにメインコードを記述

    # set RTC.ALARM0 to fire after 60 seconds (waking the device)
    rtc.alarm(rtc.ALARM0, 60000)

    # put the device to sleep
    machine.deepsleep()
    time.sleep(1)
```
Jupyter Notebook(iPython Notebook)内でscikit-learnの決定木（graphvizの.dotファイル）を表示する

pydotplusというライブラリを使うとできる

```
pip install pydotplus
```

```python
import pydotplus
dot_data = StringIO()

tree.export_graphviz(
  classifier, 
  out_file=dot_data, 
  feature_names=feature_names, 
  class_names=["False","True"], 
  filled=True, 
  rounded=True,  
  special_characters=True
)

graph = pydotplus.graph_from_dot_data(
  dot_data.getvalue()
)
Image(graph.create_png())
```

いちいち、.dotファイルからpngファイルへの書き換えコマンドを打たなくてすむようになった
GNOME Shellテーマのフォントだけを変える

## 方法

`gnome-shell.css` を作成して、もとにするテーマをインポートすればよい。

## 例

**もとにするテーマ** `Paper`
**自作のテーマ** `Custom Theme`
**フォント** `Ubuntu`

### gnome-shell.css

```css:$HOME/.themes/Custom&nbsp;Theme/gnome-shell/gnome-shell.css
@import url('/usr/share/themes/Paper/gnome-shell/gnome-shell.css');

stage {
    font-family: Ubuntu
}
```

### テーマを変更する

![change_theme.png](https://qiita-image-store.s3.amazonaws.com/0/27531/241b75a8-5ab7-1e33-5d39-35ca75ef47f6.png)

### 変更前

![before.png](https://qiita-image-store.s3.amazonaws.com/0/27531/45b8d65f-56ce-d02f-d9f5-fbf7c333b9d0.png)

### 変更後

![after.png](https://qiita-image-store.s3.amazonaws.com/0/27531/79683ab6-3fb4-c49f-389a-5bf3c4f6fd1b.png)