OmniAICreator/Qiita-1.07M huggingface dataset:
Spring Bootでバリデーションエラー時のメッセージリソースをValidationMessages.propertiesからmessages.propertiesにする

Spring BootではBean Validationをサポートしていて、その実装にHibernate Validatorを採用している。その場合、バリデーションエラー時のエラーメッセージは「ValidationMessages.properties」というメッセージリソースファイルで管理される。このメッセージリソースをSpringのメッセージリソース(MessageSource)に変更してみる。

以下のようにWebMvcConfigurerAdapterを親に持つ@SpringBootApplicationなクラスを作って、getValidatorメソッドをオーバーライドして、validatorメソッドを作ってsetValidationMessageSourceにMessageSourceを指定して上書きしてあげる。

```Main.java

@SpringBootApplication
public class Main extends WebMvcConfigurerAdapter {

	@Autowired
	private MessageSource messageSource;

	public static void main(String[] args) {
		SpringApplication.run(Main.class, args);
	}

	/**
	 * LocalValidatorFactoryBeanのsetValidationMessageSourceで
	 * バリデーションメッセージをValidationMessages.propertiesからSpringの
	 * MessageSource(messages.properties)に上書きする
	 * 
	 * @return localValidatorFactoryBean
	 */
	@Bean
	public LocalValidatorFactoryBean validator() {
		LocalValidatorFactoryBean localValidatorFactoryBean = new LocalValidatorFactoryBean();
		localValidatorFactoryBean.setValidationMessageSource(messageSource);
		return localValidatorFactoryBean;
	}

	@Override
	public org.springframework.validation.Validator getValidator() {
		return validator();
	}
```

あとは、src/main/resources配下に、以下のような感じでmessages.propertiesを定義してあげる。

```messages.properties
Customer.zipCode.invalid=zipCodeは半角数字7桁に設定してください。
Customer.sex.invalid=sexは0または1を設定してください。
```

beanはこんな感じ。バリデーションエラー時のメッセージに、
　message = "{messages.propertiesで定義したキー}"
と指定してやるだけ。

```Customer.java
@Entity
@Table(name = "Customer")
public class Customer {

	/*
	 * JPAの仕様上、引数なしのデフォルトコンストラクタが必要
	 */
	public Customer() {
	}

	@Column
	@NotNull
	@Pattern(regexp = "\\d{7}", message = "{Customer.zipCode.invalid}")
	private String zipCode;

	@Column
	@NotNull
	@Pattern(regexp = "[0-1]", message = "{Customer.sex.invalid}")
	private String sex;

	public String getZipCode() {
		return zipCode;
	}

	public void setZipCode(String zipCode) {
		this.zipCode = zipCode;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}
}
```
Web API関連の記事まとめ(随時更新)

自分が今まで投稿したWeb API関連の記事のまとめページ。
随時追加予定。

* [Web APIとは何なのか](https://qiita.com/NagaokaKenichi/items/df4c8455ab527aeacf02)
* [RESTful APIとは何なのか](https://qiita.com/NagaokaKenichi/items/0647c30ef596cedf4bf2)
* [RESTful APIの設計でやること](https://qiita.com/NagaokaKenichi/items/89c09354f08fc8d7387f)
* [RESTful APIのURI設計(エンドポイント設計)](https://qiita.com/NagaokaKenichi/items/6298eb8960570c7ad2e9)
* [RESTful APIのエラー設計](https://qiita.com/NagaokaKenichi/items/20825ae9256d9f4c6f35)
* [RESTful APIのレスポンスデータ設計](https://qiita.com/NagaokaKenichi/items/cb04af4f2c71e36bb670)
* [RESTful APIのHTTPステータスコード設計](https://qiita.com/NagaokaKenichi/items/eb85b5fbb719d60c6627)
* [RESTful APIのリソース設計](https://qiita.com/NagaokaKenichi/items/ef23ca15ba0e9e5ee022)
* [リソース指向アーキテクチャ(ROA)とは何なのか](https://qiita.com/NagaokaKenichi/items/0f3a55e422d5cc9f1b9c)
* [RESTの課題とGraphQL 〜GraphQLを簡単に使ってみる〜](https://qiita.com/NagaokaKenichi/items/a4991eee26e2f988c6ec)
* [REST Assured](http://rest-assured.io/)を使った[RESTful APIのテストサンプル](https://github.com/kenichi-nagaoka/spring-boot-restful-api-test/tree/master/src/test)
python > 処理時間計測 > time.time() - start_time

```txt:動作環境
Ubuntu 14.04 LTS desktop amd64
GeForce GTX 750 Ti
ASRock Z170M Pro4S [Intel Z170chipset]
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v7.5
Python 2.7.6
```

TensorFlowという仕組みを使ったクラス識別の処理を学習中。

こちらを勉強中。
http://blog.brainpad.co.jp/entry/2016/03/28/170000

fully_connected_feed.py
において、処理の速さを測る方法としてtime.time()を使っている。

```
import time

...
      start_time = time.time()

      # 何かの処理

      duration = time.time() - start_time

      print('Step %d: loss = %.2f (%.3f sec)' % (step, loss_value, duration))
```

秒単位のようだ。

https://docs.python.org/2.7/library/time.html#time.time
TensorFlow > tp.app.flagsの使用例 > flags.DEFINE_float('learning_rate', 0.01, 'Initial learning rate.') / tf.app.flags には「コマンドライン引数の処理」という役割もある

```txt:
動作環境
Ubuntu 14.04 LTS desktop amd64
GeForce GTX 750 Ti
ASRock Z170M Pro4S [Intel Z170chipset]
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v7.5
```

http://blog.brainpad.co.jp/entry/2016/03/28/170000
を学習中。

fully_connected_feed.py
のコードにおいてflagsというのが使われている。

```py
# Basic model parameters as external flags.
flags = tf.app.flags
FLAGS = flags.FLAGS
flags.DEFINE_float('learning_rate', 0.01, 'Initial learning rate.')
flags.DEFINE_integer('max_steps', 2000, 'Number of steps to run trainer.')
flags.DEFINE_integer('hidden1', 128, 'Number of units in hidden layer 1.')
flags.DEFINE_integer('hidden2', 32, 'Number of units in hidden layer 2.')
flags.DEFINE_integer('batch_size', 100, 'Batch size.  '
                     'Must divide evenly into the dataset sizes.')
flags.DEFINE_string('train_dir', 'data', 'Directory to put the training data.')
flags.DEFINE_boolean('fake_data', False, 'If true, uses fake data '
                     'for unit testing.')
```

上記のように定義しておいて、以下のように使う。
'batch_size'と定義した場合に、FLAGS.batch_sizeとして使う。

```
  # Create the feed_dict for the placeholders filled with the next
  # `batch size` examples.
  images_feed, labels_feed = data_set.next_batch(FLAGS.batch_size,
                                                 FLAGS.fake_data)
```

フラグ(条件の成否判別に使う）というより定数（＋付随情報）という感じかもしれない。

### コマンド引数としての役割

@antimon2さんの[コメント](http://qiita.com/7of9/items/af4abe63e880a4edd613#comment-a7376a8d4728443da7f3)を参照ください。

情報感謝です。
TensorFlow > 案 > QMCを使った学習の高速化

Stochastic Gradient Descent
ではランダムに学習データのセットから選択する。

代わりにQMC(Halton Sequence)を使ってデータセットからの選択を行うと、積分が速く収束するように、学習も早く収束するような気がする。

そういう論文は今のところ見つかっていない。


```
batch_xs, batch_ys = mnist.train.next_batch(100)
```

上記のコードの代わりにHanlton Sequenceを組込めばいいのではと思う。

http://qiita.com/7of9/items/5e61943bcb898521e1c6

<hr>
(追記 2016/11/04)
以下の記事で試した。
http://qiita.com/7of9/items/1406075879d7efcc4c84
TensorFlow / python > // という文法 > pythonのinteger divisionのようだ / Python 2.Xでは from __future__ import division を記述する / floor division

```txt:動作環境
Ubuntu 14.04 LTS desktop amd64
GeForce GTX 750 Ti
ASRock Z170M Pro4S [Intel Z170chipset]
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v7.5
```

http://blog.brainpad.co.jp/entry/2016/03/28/170000
の学習中。

fully_connected_feed.py
のコードを読んでいて見つけた以下の部分。do_eval()内のコード。

```py
  # And run one epoch of eval.
  true_count = 0  # Counts the number of correct predictions.
  steps_per_epoch = data_set.num_examples // FLAGS.batch_size
```

> //

という表記を調査した。

integer divisionということらしい。

http://stackoverflow.com/questions/39968211/what-is-the-meaning-of-in-fully-connected-feed-py

http://stackoverflow.com/questions/183853/in-python-what-is-the-difference-between-and-when-used-for-division

> In Python 2.2 or later in the 2.x line, there is no difference for integers unless you perform a from __future__ import division, which causes Python 2.x to adopt the behavior of 3.0

mnist.pyで気になった3つの疑問の一つが解決した。

pythonをもっと勉強した方がよい。

<hr>
[stackoverflow](http://stackoverflow.com/questions/39968211/what-is-the-meaning-of-in-fully-connected-feed-py/39976543#39976543)にさらに回答がついた。

> As Trejkaz points out in a comment, in Python 3, the // operator means <font color=red>floor division</font> (or integer division): i.e. the result is equivalent to floor(data_set.num_examples / FLAGS.batch_size).

stackoverflowからリンクをたどればもっと詳しい説明がある。
技術英語 > [if] execution speed [is a concern], you might be willing to ...

@ Code Complete (No. 14085 / 36077)

> <font color=red>if</font> execution speed <font color=red>is a concern</font>, you might be willing to ...

上記の場合、concernにはaがつく。

意訳「実行速度が気になるなら」

<hr>
concernについてはトラッドジャパンという番組で以下のようなものを紹介されていた。

> I'm not worried, but I am concerned.
(心配しているのではないんだ。気になっているだけなんだ。）

worryとconcernの違いがよく分かる英語と思った。

ただ、上記の使い分けは「正しくない」という意見も聞いたことがある。
その意見の根拠は明示されていなかった。
カーネルパラメータ設定方法

# Solarisの場合
即時パラメータ反映（再起動するとパラメータはクリアされる）

```bash
[root@localhost ~]# adb -wk /dev/ksyms /dev/mem
---
physmem ***** // 最初に必ず表示される
パラメータ名/W 16進数の値 // パラメータ/W 値(16進数)で指定
パラメータ名:
パラメータ名/D // 確認
パラメータ名:
パラメータ名: 値 // 値に変更された
^D // Ctrl+Dで抜ける
```
再起動後パラメータ反映（再起動してもパラメータはクリアされない）

```vim:/etc/system
set パラメータ名=値
```

# Linuxの場合
即時パラメータ反映（再起動するとパラメータはクリアされる）

```bash
[root@localhost ~]# sysctl -w パラメータ名=値
```
再起動後パラメータ反映（再起動してもパラメータはクリアされない）

```vim:/etc/sysctl.conf
パラメータ名 = 値
```
WA-MIKAN(和みかん)とUSBシリアル変換キット(秋月電子通商850円)を接続する方法

　ESP8266搭載のWiFi基板WA-MIKANと秋月電子通商で売っているUSBシリアル変換キットFT-232RQを接続する方法を説明します。
## WA-MIKAN(和みかん)とは
WA-MIKANはESP8266搭載のWiFi基板です。[WA-MIKAN(和みかん)の説明](https://github.com/wakayamarb/wa-mikan)はgithubにまとめています。

## WA-MIKANとPCの接続
　WA-MIKANを単体でESP8266とPCを接続する場合は、USBシリアル変換基板を用いる必要があります。WA-MIKANの基板端には6本のピンが出ており、TxD, RxD, 3.3V, GNDの端子が割り当てられています。このピン配列は、Arduino Pro MiniやGR-KURUMIと同じ配列となっています。
　よって、Arduino Pro Mini用のUSBシリアル接続基板を使用すると簡単にESP8266とPCの接続ができるのですが、Arduino Pro Mini用のUSBシリアル接続基板は1,000円以上して高価です。

　そこで、秋月電子通商で売られている安価なUSBシリアル変換基板(FT-232RQ)をWA-MIKANに接続する方法を考えました。

## FT-232RQとは
　[USBシリアル変換キットFT-232RQ](http://akizukidenshi.com/catalog/g/gK-09951/)は、秋月電子通商で850円という安価な値段で手に入るUSBシリアル変換基板です。
 この基板のVCCからは出力電源として5Vが出力されます。しかし、WA-MIKANの受け側の電源は3.3Vが供給されるつもりで作られています。
　
　そこで、WA-MIKANを改造することにより、5V電源で動作できるようにしました。その改造方法について説明します。

## WA-MIKAN基板のパターンカット
　WA-MIKANの受け側のVCCは3.3Vにつながっています。そこで先ず、3.3Vと接続しているパターンをカットします。3V3と書いている上のパターンのスルーホールにつながっている配線パターンをカットします。
![cut.png](https://qiita-image-store.s3.amazonaws.com/0/32065/3717c77f-25f3-e6cd-6946-26bf61901c35.png)

## 3.3Vのピンと5V配線を接続する
　WA-MIKANには、5Vから3.3Vを作るレギュレータが搭載されています。5Vから3.3Vを作成するにはJ1をオンにする必要があります。そこで、3V3ピンからJ1に直接ジャンパを飛ばせば、FT-232RQの5V電源をWA-MIKANのレギュレータに供給できるようになります。
　そこで、以下の図のようなジャンパを行いました。
![jumper.png](https://qiita-image-store.s3.amazonaws.com/0/32065/2b951147-97d3-a8bf-0b35-2b6294253326.png)
　これで、WA-MIKANとFT-232RQを接続して、PCからESP8266を見ることができるようになりました。
![connect.png](https://qiita-image-store.s3.amazonaws.com/0/32065/ac4bf571-d9a5-9bbc-f853-a9fa532a35b7.png)

![tera.jpg](https://qiita-image-store.s3.amazonaws.com/0/32065/67caec40-2d58-c4cb-3874-0c5a74e00f0e.jpeg)
Slackの勤怠管理システムのmiyamotoさんを石原さとみ様にして運用してみる

#とりあえず動かす(2016/10/09)
以下に手順が載っているのでその通りに設定！
https://github.com/masuidrive/miyamoto
Slackで「おは」ってつぶやいてみるよね。
すると、うん、ちゃんと動かないね。正確にはspreadsheetに新しいシートまで作られたけど時刻が入らないから、その前で落ちてそう。

main.jsのコメントアウトしてあるtest1っていうのを動かしてみると案の定落ちてた〜。
とにかく設定シートの
開始日	2016-10-09
を
開始日  2016-10-01
にしたら動いた笑

後で理由を追跡します。
編集したセルにセルに書いてある通りの色をつけるスクリプト作った

色のプレビューが面倒くさいのでスプレッドシートで管理できたらいいなと思ったのでセルだけでプレビューできるようにするスクリプトをつくった


ツール>スクリプトエディタ開いてこれを入力

```js:script.gs
/*
   編集したセルの色をセルの値の色にする
*/

fucntion onEdit(e) {
    var activateSpreadSheet = SpreadsheetApp.getActiveSpreadsheet();
    var activeSheet = activeSpreadSheet.getActiveSheet();
    var activeCell    = activeSheet.getActiveCell();
    activeCell.setBackground(activeCell.getValue());
}
```

時計マークのイベントトリガを設定して編集時に呼ぶようにしたらおしまい
BotFrameworkで、Slackのチャンネルに新しく入ってきた人に挨拶する

BotFrameworkの`MembersAdded`を使うと、Slackのチャンネルに**新しく入ってきた人に挨拶できる**みたいなので、少しやってみました(^O^)v
※`MembersAdded`のドキュメントは[こちら](https://docs.botframework.com/en-us/csharp/builder/sdkreference/activities.html)

## 入ってきた人に挨拶

```js
var restify = require('restify');
var builder = require('botbuilder');

var server = restify.createServer();
server.listen(process.env.port || process.env.PORT || 3978, function () {
   console.log('%s listening to %s', server.name, server.url); 
});
  
var connector = new builder.ChatConnector({
    appId: 'ID',
    appPassword: 'PASSWORD'
});
var bot = new builder.UniversalBot(connector);
server.post('/api/messages', connector.listen());

// ここで入ってきた事を取得して、挨拶
bot.on('conversationUpdate', function (message) {
    if (message.membersAdded) {
        var membersAdded = message.membersAdded
            .map((m) => {
                var isSelf = m.id === message.address.bot.id;
                return (isSelf ? message.address.bot.name : m.name);
            })
            .join(', ');

        var reply = new builder.Message()
            .address(message.address)
            .text('いらっしゃいませー ' + membersAdded + ' さん');
        bot.send(reply);
    }
});

```

![スクリーンショット 2016-10-11 0.57.27.png](https://qiita-image-store.s3.amazonaws.com/0/53996/f6fb1d0c-a4ea-5b5f-0ae2-797cfb8ba972.png)

## 退出した時に挨拶

退出時は`membersRemoved`を使うと、取れるみたいです。

```js
  if (message.membersRemoved) {
        var membersRemoved = message.membersRemoved
            .map((m) => {
                var isSelf = m.id === message.address.bot.id;
                return (isSelf ? message.address.bot.name : m.name);
            })
            .join(', ');

        var reply = new builder.Message()
            .address(message.address)
            .text('ばいばーい' + membersRemoved);
        bot.send(reply);
  }
```
![スクリーンショット 2016-10-11 1.09.24.png](https://qiita-image-store.s3.amazonaws.com/0/53996/3c402d66-519d-b382-a431-ba48cb763d57.png)
Squidのキャッシュ機能を無効化する

Squidのコンフィグファイルの最終行に以下の二行を追記します。

```vim:/etc/squid/squid.conf
...省略
acl NOCACHE src all
cache deny NOCACHE
```

サービスをリロードして設定は完了です。

```bash
[root@localhost ~]# /etc/init.d/squid reload
```
JP1/AJS2のJPQ*,AJS*コマンド実行権限

JP1管理者ユーザ「jp1admin」にOSスーパーユーザ「root」をマッピング後にjpqコマンドやらajsコマンドを実行した場合、下記のエラーが出力される場合があります。

```bash
KAVU0957-E コマンドを実行する権限がありません
KAVU0852-I 全てのエージェントホスト情報の表示を開始します
```

これはJP1マニュアル等には、「コマンドを実行するOSユーザにJP1権限レベルを与えるにはOSユーザと同一名称のJP1ユーザを登録し、必要なJP1権限レベルを与えます」とあります。

実はOSユーザと同一名称のJP1ユーザを登録しなくても実行可能な方法があります。

```vim:/etc/opt/jp1base/conf/user_acl/JP1_UserLevel
root:*=JP1_AJS_Admin,JP1_JPQ_Admin,JP1_Console_Admin
```

通常、「jp1admin」やらのJP1ユーザに対してJP1資源グループ別権限を与えますが、上記のように直接OSユーザに対してJP1資源グループ別権限を与えてやれば、JP1ユーザと同一名称のOSユーザを作成しなくてもコマンドの実行が可能になります。
素人の言語処理100本ノック:21


[言語処理100本ノック 2015](http://www.cl.ecei.tohoku.ac.jp/nlp100/)の挑戦記録です。環境はUbuntu 16.04 LTS ＋ Python 3.5.2 \:\: Anaconda 4.1.1 (64-bit)です。過去のノックの一覧は[こちら](http://qiita.com/segavvy/items/fb50ba8097d59475f760)からどうぞ。

## 第3章: 正規表現
>Wikipediaの記事を以下のフォーマットで書き出したファイルjawiki-country.json.gzがある．
>・1行に1記事の情報がJSON形式で格納される
>・各行には記事名が"title"キーに，記事本文が"text"キーの辞書オブジェクトに格納され，そのオブジェクトがJSON形式で書き出される
>・ファイル全体はgzipで圧縮される
>以下の処理を行うプログラムを作成せよ．

###21. カテゴリ名を含む行を抽出
>記事中でカテゴリ名を宣言している行を抽出せよ．

####出来上がったコード：

```python:main.py
# coding: utf-8
import gzip
import json
import re
fname = 'jawiki-country.json.gz'


def extract_UK():
	'''イギリスに関する記事本文を取得

	戻り値：
	イギリスの記事本文
	'''

	with gzip.open(fname, 'rt') as data_file:
		for line in data_file:
			data_json = json.loads(line)
			if data_json['title'] == 'イギリス':
				return data_json['text']

	raise ValueError('イギリスの記事が見つからない')


# 正規表現のコンパイル
pattern = re.compile(r'''
	^	# 行頭
	(	# キャプチャ対象のグループ開始
	.*	# 任意の文字0文字以上
	\[\[Category:
	.*	# 任意の文字0文字以上
	\]\]
	.*	# 任意の文字0文字以上
	)	# グループ終了
	$	# 行末
	''', re.MULTILINE + re.VERBOSE)

# 抽出
result = pattern.findall(extract_UK())

# 結果表示
for line in result:
	print(line)
```

####実行結果：

```console:端末
[[Category:イギリス|*]]
[[Category:英連邦王国|*]]
[[Category:G8加盟国]]
[[Category:欧州連合加盟国]]
[[Category:海洋国家]]
[[Category:君主国]]
[[Category:島国|くれいとふりてん]]
[[Category:1801年に設立された州・地域]]
```


###問題20の結果の利用
問題21-29は問題20で抽出した記事本文が対象のため、前問のコードをそのまま`extract_UK()`として関数化しました。

###カテゴリ名を含む行とは？
問題20で抽出した記事本文の書式がよく分からなかったのですが、問題26で参考情報として紹介されている[マークアップ早見表](https://ja.wikipedia.org/wiki/Help:早見表)を見ると`[[Category:`と`]]`で括られている部分を指すようなので、それを抽出するコードにしてみました。

###正規表現
正規表現の詳細は[re — 正規表現操作](http://docs.python.jp/3/library/re.html#module-re)に解説がありますが、かなり複雑です。これはしばらく使わないとすぐに忘れてしまいますね。コードには冗長なコメントがたくさん入っていますが、自身の備忘のためということでご了承ください。慣れたら少しずつ減らしていきます。

###raw string記法

正規表現の文字列リテラルの先頭に付いている`r`は`raw string記法`と呼ばれるもので、Pythonの文字列リテラル内でバックスラッシュ`\`が特別扱いされなくなります。通常、バックスラッシュを文字列リテラル内で扱う際はバックスラッシュを前に付けてエスケープしないといけませんが、正規表現でもバックスラッシュは同様のエスケープが必要なので、バックスラッシュ1文字を表現するだけで`\\\\`になってしまい非常に読みにくくなります。それを避ける記法だそうです。詳細は[re — 正規表現操作](http://docs.python.jp/3/library/re.html#module-re)を参照してください。

###`re.MULTILINE`

[`re.MULTILINE`](http://docs.python.jp/3/library/re.html#re.MULTILINE)は、検索対象のデータが複数行のために指定しています。これをつけないと`^`や`$`が検索対象の先頭や末尾にしかマッチせず、途中の改行が相手にされなくなってしまいます。

###`re.VERBOSE`

[`re.VERBOSE`](http://docs.python.jp/3/library/re.html#re.VERBOSE)は、正規表現の途中にコメントを入れるために指定しています。これを指定すると、`#`でコメントが入れられます。ただし、空白や`#`を指定する際はバックスラッシュでのエスケープが必要になります。

　
22本目のノックは以上です。誤りなどありましたら、ご指摘いただけますと幸いです。
<hr>

*実行結果には、[100本ノックで用いるコーパス・データ](http://www.cl.ecei.tohoku.ac.jp/nlp100/#data)で配布されているデータの一部が含まれます。この第3章で用いているデータのライセンスは[クリエイティブ・コモンズ 表示-継承 3.0 非移植](https://creativecommons.org/licenses/by-sa/3.0/legalcode)（[日本語訳](https://creativecommons.org/licenses/by-sa/3.0/deed.ja)）です。*
mac Electronのパッケージングが動くようになるまで


OS 10.11.6 el capitan

el capitan のためか、
homebrewでwineをインストールするまで、前手順が必要だったのでメモ



```bash
# とりあえず update
$ brew update

/usr/local/Library/brew.sh: line 32: /usr/local/Library/ENV/scm/git: No such file or directory

Error: update-report should not be called directly!


# シンボリックリンクの修復
$ brew prune
Pruned 0 symbolic links and 2 directories from /usr/local



# アップデート
$ brew update

==> Migrating HOMEBREW_REPOSITORY (please wait)...
==> Migrated HOMEBREW_REPOSITORY to /usr/local/Homebrew!
Homebrew no longer needs to have ownership of /usr/local. If you wish you can
return /usr/local to its default ownership with:
  sudo chown root:wheel /usr/local
  
  
# ディレクトリのオーナーの変更
$ sudo chown root:wheel /usr/local

# 再アップデート
$ brew update
Already up-to-date.


# wineのインストール
$ brew install wine

#####.... 100.0%
Error: Empty archive

# Empty archive が出るときは xz を再インストール → どうやらXcode8後から
$ brew reinstall xz



# もう一度wineのインストール
$ brew install wine

```
一部のViewControllerだけ端末の回転をさせる方法


## 注意点

UINavigationControllerにぶら下がっているViewControllerはshouldAutorotate()は呼ばれません。  
UINavigationControllerにViewControllerがぶら下がっている場合は、UINavigationControllerのshouldAutorotateが呼ばれてしまう為、ViewController単位で制御できなくなります。
(ぶら下がっていなければ、ViewControllerで呼ばれます。)

## やり方紹介にあたっての前提

Projectでの回転の設定は以下に設定しています
![img](https://cdn-ak.f.st-hatena.com/images/fotolife/p/project-unknown/20161011/20161011003613.png)

Portrait, LandscapeLeft, LandscapeRightにチェックをいれています。

## UINavigationControllerにViewControllerがぶら下がっていない場合

#### 回転させたいViewController

回転のロジックを埋め込んであげます

```
// ## hogehogeViewController.swift

override func shouldAutorotate() -> Bool {
    return true
}
    
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
    let orientation: UIInterfaceOrientationMask = [UIInterfaceOrientationMask.Portrait, UIInterfaceOrientationMask.LandscapeRight, UIInterfaceOrientationMask.LandscapeLeft]
    return orientation
}

```

### 回転させたくないViewController

回転を許容しない設定を埋め込むだけです。

```
// ## fugafugaViewController.swift

override func shouldAutorotate() -> Bool {
    return true
}
```

これは簡単ですね。

## UINavigationControllerにViewControllerがぶら下がっている場合

この場合、UINavigationControllerを拡張して、ぶら下がっているUIViewControllerの設定を取得するようにします。


```
// ## UINavigationController+Orientation.swift

public override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
        
    if let _ = self.visibleViewController {
        return self.visibleViewController!.supportedInterfaceOrientations()
    }

    // ViewControllerが無い場合は、縦画面のみ許容します
    let orientation: UIInterfaceOrientationMask = [UIInterfaceOrientationMask.Portrait]
    return orientation
}

public override func shouldAutorotate() -> Bool {
    if let _ = self.visibleViewController {
        return self.visibleViewController!.shouldAutorotate()
    }

    // ViewControllerが無い場合は、回転を許容しません。
    return false
}
```

これで、UINavigationControllerが子のViewControllerの設定を取得するようになったので、回転を許可したいViewControllerで先程と同じような設定を記述します。

```
// ## hogehogeViewController.swift

override func shouldAutorotate() -> Bool {
    return true
}
    
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
    let orientation: UIInterfaceOrientationMask = [UIInterfaceOrientationMask.Portrait, UIInterfaceOrientationMask.LandscapeRight, UIInterfaceOrientationMask.LandscapeLeft]
    return orientation
}
```
Backlogの特定プロジェクトのWikiを全部保存するスクリプトをPHPで書いてみたメモ

### 作ったもの
Backlogの特定プロジェクトのWikiを全部手元のファイルに保存する

### 大体の仕様
- 実行すると指定した名前のディレクトリが作成されて、そのディレクトリ内にWikiのディレクトリとファイルが保存される
- 上記ディレクトリ直下に1Wiki、1ディレクトリで保存される（Wikiが3ページあったら3ディレクトリ作成される）
- 特定Wikiのディレクトリには本文のテキストファイルとアタッチされている画像ファイルが保存される
- スクリプト内にはあらかじめ以下の情報を入力しておく
    - BacklogのAPIキー
    - Backlogのスペース名
    - BacklogのプロジェクトID
    - 保存ディレクトリ名

### 実行イメージ
```bash:実行イメージ
root@kure2:/usr/local/work/backlog# php wiki2file.php
string(8) "Home.txt"
string(12) "HomeHome.txt"
string(13) "HomeHome2.txt"
string(16) "HomeHome2222.txt"
string(9) "test1.txt"
string(16) "サンプル.txt"
string(16) "研修.txt"
array(7) {
  [0]=>
  string(4) "Home"
  [1]=>
  string(8) "HomeHome"
  [2]=>
  string(9) "HomeHome2"
  [3]=>
  string(12) "HomeHome2222"
  [4]=>
  string(5) "test1"
  [5]=>
  string(12) "サンプル"
  [6]=>
  string(12) "研修"
}
↑のがそれぞれディレクトリとして作成されて、中にテキストファイルが保存された。
```

### 保存先
https://github.com/kuredev/BacklogTools/blob/master/wiki2file.php
puma_worker_killer使ってみた


## 使用動機

開発しているRailsアプリケーションがnginx + pumaという構成なのですが、たびたびメモリの使用量が逼迫してアラート通知が来ているという状況があり、手動で再起動が行われていました。これが仮に休暇の時に起こったりすると大変です。
そこで、そのような状況をなんとかするためにpuma_worker_killerを導入しました。

## puma_worker_killerで出来ること

https://github.com/schneems/puma_worker_killer

puma_worker_killerはpumaのworkerプロセスが規定のメモリ使用量を超えた時に自動でそのプロセスを殺して再起動します。
近い機能を提供してくれるものとして [unicorn_worker_killer](https://github.com/kzk/unicorn-worker-killer) というものがあり、それのpuma版です。

## 設定と挙動

https://github.com/schneems/puma_worker_killer#configure に書いてありますが説明します（2016年10月10日現在のmasterブランチのものを元に進めていきます）。

```puma.rb
before_fork do
  PumaWorkerKiller.config do |config|
    config.ram           = 1024 
    config.frequency     = 5    
    config.percent_usage = 0.65
    config.rolling_restart_frequency = 12 * 3600 
    config.reaper_status_logs = true
  end
  PumaWorkerKiller.start
end
```

この例ではプロセスがforkされる前にworker_killerが動作するようになっています。

`config.ram` はRAMの大きさをメガバイトで指定します。基本的にはサーバーのメモリの大きさ指定で問題ないと思います。
`config.frequency` はメモリの使用量を確認する頻度を秒で指定します。上の例だと5秒毎にメモリ使用量を監視しています。監視すると↓のようなログが流れます。

```
23:23:32 web.1   | [73437] PumaWorkerKiller: Consuming 273.2578125 mb with master and 2 workers.
23:23:37 web.1   | [73437] PumaWorkerKiller: Consuming 273.2578125 mb with master and 2 workers.
23:23:42 web.1   | [73437] PumaWorkerKiller: Consuming 273.27734375 mb with master and 2 workers.
```

`config.percent_usage` は `ram` で指定した値の何％を使用したらそのワーカーのプロセスを殺すかを指定します。今回の場合だと1024 * 0.65 = 665.6MB使用すると再起動がかかります。このようなログが出てワーカープロセスが再起動されます。

```
23:38:59 web.1   | [77845] PumaWorkerKiller: Out of memory. 2 workers consuming total: 665.66015625 mb out of max: 665.6 mb. Sending TERM to pid 77869 consuming 287.57421875 mb.
23:39:00 web.1   | [77845] - Worker 0 (pid: 78271) booted, phase: 0
```

ここで出ているtotalのメモリですが、puma本体のメモリ使用量と各workerのメモリ使用量の合計となっています（[参考](https://github.com/schneems/puma_worker_killer/blob/master/lib/puma_worker_killer/puma_memory.rb#L50）)) 。
また、killされるプロセスは一番メモリ使用量の多いワーカープロセスとなります。

`config.rolling_restart_frequency` はrolling_restartの頻度を秒単位で指定しています。例の場合だと12時間に1回実行しています。
`rolling_restart` はメモリの使用量に関わらず、ワーカープロセスを順番にkillして再起動してくれる仕組みです。

最後に `config.reaper_status_logs` です。これがfalseだと、毎回のメモリ使用量を確認しにいく度に出力されていたログだけ出ないようになります。本番環境ではログが多くなってノイズになりがちなので設定しておくと便利だと思います。
~~ただし、これは現在の最新バージョンである0.0.6には入っていないオプションですので注意です。~~ 0.0.7で正式に導入されました。

## 注意点

### worker数が0だと動かない

worker_killerという名前がついてるので当然っちゃ当然なのですが、worker数が0だとworker_killerが動作しません。

### prune_bundlerと一緒に使えない

prune_bundlerは、クラスターモード（複数ワーカー起動）時にbundlerを新しいものに切り替えてくれる機能で、これによりphased_restart（1つずつ順番にworkerを落として再起動してくれる仕組み。これにより再起動時のダウンタイムを無くせる）した時に最新のGemfileを見に行くようにする機能です。
phased_restartを行いたい時にほぼほぼ必須のオプションなのですが、これを設定するとpuma_worker_killerが使えなくなります。
というのも、prune_bundlerを使うとpuma.rb上でGemfileが読み込まれていない状態になり、puma_worker_killerに限らず他のgemをrequireしようとしてもファイルが見当たらずにエラーになります。
なので、puma_worker_killerを使う時はphased_restartを諦める必要があるのかなと思ってます。

## おわりに

puma_worker_killerで出来ることや挙動の説明をしてきました。
サーバーでpumaを使っていてメモリの問題に悩んでる方がいましたら試してみてください。
nodeから5分毎にpostgresqlのデータを更新したい

メモ書き

nodeを使ってpostgresのデータを5分おきに更新かける処理をかこうとしたら結構詰まったので

<pre>
テスト用テーブル
CREATE TABLE test
(
    id character varying(100),
    name text,
    updatetime date
);
</pre>

setInterval使った

<pre>
var pg = require('pg');

var connectString = "tcp://postgres:postgres@localhost:5432/testdb";


setInterval(function(){pgcon()}, 5000);

function pgcon() {
  pg.connect(connectString, function(err, client) {
      if (err) {
          console.log('Connection Error:', err);
          throw err;
      } else {
        var qs = "UPDATE test SET updatetime = now() WHERE name = 'userA';";
        client.query(qs, function(err, result) {
            if(err) {
                console.log('Error');
                throw err;
            } else {
              console.log('Success');
            };
        });
      }
  });
}
</pre>

最初はpg.connect内でsetTimeoutやsleep使っていたが、connect中にsleepさせると
うまくいかないみたいなので上記のやり方に
irb内から外部ファイルを参照する

irbでファイルを読む
例えばメールファイルを読む場合は下記のようにする

```
irb(main):001:0> require'mail'
irb(main):002:0> Mail.read("./email.log")
irb(main):003:0> mail.subject
=> "hogehoge"
```

irbを開いた場所からの相対パス指定でファイルを開ける。

参考
http://stackoverflow.com/questions/6149850/ruby-on-rails-running-a-rb-file-from-irb
storyboard と xib のフォントを一括で書き換えるワンライナー


やっぱりシステムフォントを使いたいとなった時のコマンドです。

```bash
find . -type f -name "*.storyboard" -print0 | xargs -0 sed -i "" -e 's/name="HiraginoSans-W3" family="Hiragino Sans"/type="system"/g'

find . -type f -name "*.xib" -print0 | xargs -0 sed -i "" -e 's/name="HiraginoSans-W3" family="Hiragino Sans"/type="system"/g'

find . -type f -name "*.storyboard" -print0 | xargs -0 sed -i "" -e 's/name="HiraginoSans-W6" family="Hiragino Sans"/type="boldSystem"/g'

find . -type f -name "*.xib" -print0 | xargs -0 sed -i "" -e 's/name="HiraginoSans-W6" family="Hiragino Sans"/type="boldSystem"/g'

```

逆もまた然り

## 参考URL

- [find + sed で一斉置換](http://qiita.com/somat/items/b775f7e082f1559707e2)
スタブAPIを作るnpmパッケージ作って公開してしまった

任意のリクエストヘッダを条件にできるスタブAPIサーバーが見つけられなかったので作ってみました。
名前は[スタボン](https://www.npmjs.com/package/stubon)と付けました。


## できること
- 特定のリクエストにマッチした場合に、指定の固定値を返す
  - 下記を条件にすることができる
     - リクエストパス（ルーティングパラメーターも含む）
     - リクエストメソッド
     - リクエストパラメーター
     - リクエストヘッダー
  - 下記を固定値として返却できる
     - http ステータスコード
     - レスポンスボディ（json）
  - 上記を設定するファイルとして２つのフォーマットが使える
     - YAML(.yml)
     - JSON(.json)

## インストール
```shell-session
$ npm i -D stubon
```

## 設定ファイルの書き方
YAMLかJSONで書きます。
読み込まれた順にチェックされ、マッチした時点でチェックを終了、そこに指定されているresponseが返されます。「設定されたリクエスト条件 ⊆ 実際のリクエスト」が成り立てばマッチとなりますので、余分なリクエストがあっても大丈夫です。マッチしない場合は404です。

```yaml
# data.yml
'/aaa/get/{id}': #　リクエストパス毎に配列で条件を指定。{}でルーティングパラメータになる。
    -
        request:
            method: 'GET' # 'POST', 'PUT'などを入れる。任意。
            params:       # ルーティングパラメーターをオブジェクトで指定。任意。
                id: '999'
            queries:      # リクエストパラメーターを指定。任意。
                a: 'b'
            headers:      # リクエストヘッダーを指定。これが欲しかった。任意。
                x-hoge: 'hoge'
        response:
            status: 200   # httpステータスコード
            body:         # レスポンスボディ
                result: 'OK!！！'
    -
        request:
            method: 'GET'
        response:
            status: 500
            body: 'error'
```
上記の場合は「'/aaa/get/999?a=b'」にヘッダー「x-hoge: hoge」を乗せてGETでリクエストすると、「'{ result: "OK!!!" }'」が200で返されます。
そして、それ以外のGETリクエストは「'error'」が500で返され、
さらに、GET以外は404、といった具合です。

例のように条件の狭いものから順に書くと良い感じで使えます。

## サーバーの立て方
コマンドラインからもスクリプトからも立てられます。

```shell-session
$ npx stubon -s ./dev/src -p 8080 --ssl --debug

# -s      設定ファイルを置いてあるディレクトリ。必須です。
# -p      サーバーのポート。必須です。
# --ssl   オレオレ証明ですがsslでサーバーを立てます。任意です。
# --debug リクエストマッチの様子をログに出します。思うようにマッチしない場合は見てみてください。任意です。
```

同じものをgulpで立てる場合はこんな感じです。

```js
// gulpfile.babel.js
import gulp   from 'gulp';
import Stubon from 'stubon';

gulp.task('stubon', () => {
    const options = {
        debug : true,
        ssl   : true,
    };
    const stubon = new Stubon('./dev/src', options);
    return stubon.server().listen(8080);
});
```


## 使いどころ
つなぐ予定のAPIがまだできていない、
APIを呼びすぎると怒られるので開発中はスタブにしたい、
特定のレスポンスが欲しいけどAPI開発者にデータを作ってもらうのが面倒だ、
などなど、主に開発環境でお使いいただければと思っております。


## 最後に
初めての公開で右も左もわからない状態でございます。
ご意見ご感想などいただけますと幸いです。


## 参考
- [初めてのnpm パッケージ公開](http://qiita.com/TsutomuNakamura/items/f943e0490d509f128ae2)
- [「チーム開発に役立つstubcell」ってタイトルでCodeGrid 2周年パーティでLTしてきた。](http://yosuke-furukawa.hatenablog.com/entry/2014/05/11/214022)
- [Rails：CoverallsでGitHubにテストカバレッジのバッジを表示してみました](http://tyoshikawa1106.hatenablog.com/entry/2015/09/07/010545)
- [gulpfileをES2015(ES6)で書く](http://qiita.com/kosuke_nishaya/items/cf7f8a2dbb8e47d064fd)
- [node.jsでコマンドライン引数の処理を行うなら「argv」が便利](http://shimz.me/blog/node-js/1784)
Centos7にNginx + Unicornで構築したRedmine3.3のテーマを変更する

# [概要]
デフォルトのテーマだと何か物足りないのでテーマを変更する。
今回はせっかくなので、２つほど入れて気分で切り替えて使ってくことにする。

* 今回入れる２つ
 - [Dwarf](https://github.com/themondays/Dwarf)
 - [minimalflat2](https://github.com/akabekobeko/redmine-theme-minimalflat2)

# [事前準備]
事前に下記が構築済みであること。
[Centos7にNginx + UnicornでRedmine3.3構築方法](http://qiita.com/sabakan7/items/d20e81b9395a654f6e55)

# [作業内容]
##　■　テーマのデータを取得
```bash
$ /opt/redmine/public/themes
```
###　■　minimalflat2
```bash
### wgetで入手
$ wget https://github.com/akabekobeko/redmine-theme-minimalflat2/releases/download/v1.2.1/minimalflat2-v1.2.1.zip

### unzipコマンドで解凍
$ unzip minimalflat2-v1.2.1.zip

### zipファイルは不要なので削除
$ rm minimalflat2-v1.2.1.zip
```

###　■　Dwarf
```bash
### cloneしてくる
$ git clone https://github.com/themondays/Dwarf.git

### production の中のdwarfを取り出す
$ mv Dwarf/production/dwarf .

### Dwarfのディレクトリは不要なので削除
$ rm -fr Dwarf
```

##　■　再起動させて反映
```
$ sudo systemctl restart redmine-unicorn.service
```

##　■　設定画面からデフォルトから変更してみる
`管理` → `設定` から `表示` 設定画面を開きます。

![redmine_management](http://drive.google.com/uc?export=view&id=0Byh1aAqbAigJSHp0SW5pWEtza2c)

追加できることが確認できした。
あとは、`Dwarf` or `Minimalflat2`を選択し、保存すれば反映されます。

![redmine_view_thema](http://drive.google.com/uc?export=view&id=0Byh1aAqbAigJNVVYTzZ0alJXcHM)

２つの見た目はこんな感じ
黒を基調にして、シンプルでいい感じ
![redmine_dwarf](http://drive.google.com/uc?export=view&id=0Byh1aAqbAigJMllJTHZfSXo2N2s)

流行りのフラットデザインでこれもシンプルでいい感じ
![redmine_minimalflat2](http://drive.google.com/uc?export=view&id=0Byh1aAqbAigJclRhcjB6N09LMDA)

設定を変更するだけで切り替えられるので、気分で切り替えて当分使ってみようと思います。

# [事後確認・作業]
さくらのVPS（CentOS7）にLaravel5.3をインストールする

#環境
- CentOS 7
- Nginx 1.1
- PHP 7

#手順

##composer を入れる
- `curl -sS https://getcomposer.org/installer | php`
- `mv composer.phar /usr/local/bin/composer`

##インストール
- `composer create-project --prefer-dist laravel/laravel プロジェクト名`

- ここで`PHPUnit`がインストールできないとエラーが出たので、`composer.json`から一旦記述を削除する

- 改めて`composer install`

- `php artisan list`で`artisan`コマンドが使えることを確認

#ページにアクセスしたらエラーになる場合
僕の場合、`HTTP ERROR 500` になった。

プロジェクトの所有者を`nginx`にしてみる（今回は nginx を使っているので）

- `chown -R nginx:nginx プロジェクト名/`

※たぶんパーミッションを変えても良い

##まだ 500 エラー
SELinux のファイルコンテキストを変更する。

- `chcon -R -t httpd_sys_rw_content_t /var/www/laravel/storage`
- `chcon -R -t httpd_sys_rw_content_t /var/www/laravel/bootstrap/cache`

- [参考](http://momoiro-tj.hateblo.jp/entry/2016/01/12/221657)


##次は The only supported ciphers are AES-128-CBC and AES-256-CBC
キーを生成すれば良いらしい。

- `php artisan key:generate`
- `php artisan config:clear`
- [参考](https://github.com/laravel/framework/issues/9080)


#完了！
![Laravel-min.png](https://qiita-image-store.s3.amazonaws.com/0/57002/6947fdb2-3ad3-b228-09c2-c21d9368cd45.png)

後で`PHPUnit`入れないと。。
Cordova(PhoneGap) + Crosswalk 環境構築

#Crosswalkとは
https://crosswalk-project.org/
通常、Cordova(Phonegap)でアプリをビルドすると、OS標準のブラウザエンジンで再生されます。
Android4.xまでなら「標準ブラウザ」、Android5.x以降なら「Chrome」、iOSなら「Mobile Safari」など。
それを代替するエンジン。これを導入すれば、OSによる動作の違いを吸収できます。

#ビルドに失敗する
https://crosswalk-project.org/documentation/cordova.html
Cordova（PhoneGap）での導入は、プラグイン追加するだけで、簡単。
以下コマンドを打つだけ。

```
cordova create testapp
cd testapp
cordova platform add android
cordova plugin add cordova-plugin-crosswalk-webview
cordova build android
```

のはずが、単に新規アプリつくって、プラグイン追加しただけなのに、Build Faild になる。
（エラー文言をメモってませんでした...別環境で再現したら更新します。）

#環境
PhoneGap 6.3.3
[WindowsでPhoneGapアプリ開発＆デバッグ環境構築](http://qiita.com/tsunet111/items/2ab7a1bfdf58a08af38f) で構築した環境です。


#解決策
２つポイントがありました。以下でビルド成功するようになりました。

##minSdkVersion
config.xml の minSdkVersion が、デフォルトで 14 となっていますが、16にします。
![161010crosswalk-1.PNG](https://qiita-image-store.s3.amazonaws.com/0/24420/07bd348e-afa0-edb6-3604-a4d54649298c.png)

##Android SDK ManagerのExtras
Android SDK Managerを起動し「Android Support Repository」と「Google Repository」をインストールする。
![161010crosswalk-2.PNG](https://qiita-image-store.s3.amazonaws.com/0/24420/7fb2c497-cae0-c5b7-d194-c57c9ce32720.png)


#動作確認

##確認
htmlに、以下JavaScriptを書いて確認

```js
alert(navigator.userAgent);

```
![Screenshot_2016-10-10-22-21-02.png](https://qiita-image-store.s3.amazonaws.com/0/24420/17d0f205-661f-1249-81a1-342ec8f77197.png)


##書き出されるapk

ビルドすると、
android-armv7-debug.apk
android-x86-debug.apk
という２ファイル書き出されます。CPUの違いで使い分けるらしいのですが、ひとまず、android-armv7-debug.apk を使っておけばよさそう（適当）

なお、適切でないほうをインストールしても、Crosswalk Project Runtimeをインストールするように言われます。
![Screenshot_2016-10-10-22-30-08.png](https://qiita-image-store.s3.amazonaws.com/0/24420/d5c71994-5087-1959-f7f5-b5fbd75c2871.png)
↑このメッセージが出て
↓これをインストールしたら起動できるようになります。
![Screenshot_2016-10-10-22-30-39.png](https://qiita-image-store.s3.amazonaws.com/0/24420/886278f0-92d7-ae8f-dd5c-9e170af391b9.png)



---

iOSへの書き出しは、まだ試していません。。。
Add SYNX to Build Phases with Bundler and rbenv

【追記】プロジェクト構成が変わるとビルドが止まる可能性がありそうなので本手法は使えない可能性があります。CircleCIなどで実行した方がいいかもしれない。

プロジェクトの仮想のディレクトリ構成を実態と合わせてくれる[synx](http://qiita.com/Yuta/items/fdce62fcb871912629ce)を導入した。
そこで、Build PhasesにRunSprict Phaseを追加することで自動化したいとした。
また、CircleCIで書き換わる必要はないし、何かエラーが出ると嫌なので除外した。

```bash
if ! [ -n "$CIRCLECI" ]; then
  eval "$(rbenv init -)"
  GEM_EXE_DIR=`gem env | grep "EXECUTABLE DIRECTORY"`
  export PATH=$GEM_EXE_DIR:$PATH
  bundle exec synx $PROJECT_FILE_PATH
fi
```

GEM_EXE_DIRの部分は次の記事を参考にさせて頂いた。
http://qiita.com/paming/items/8276173c8d8c16ef79d9
ATOM Editor事始めも

# はじめに
Atomエディタのインストールから初期設定までのメモ。
使いこなしていないので、とんちんかんな内容になっている可能性あり。。。

# 入手
https://atom.io/

「Download Windows Installer」を押下。

# インストール
「AtomSetup.exe」を実行したら、インストールされている。
※何も選択する必要はない。

# 設定
## 日本語化
File->Settingsを選択してから、Installを選択する。
Search Packagesに「japanese-menu」と入力し、検索する。
Installをクリック。するとメニューが日本語化される。

## プラグイン
### platformio-ide-terminal
Window下部にコマンドプロンプトが表示される。
デフォルトのワークディレクトリを指定することができるが
日本語が含まれるパスをデフォルトにすると起動しなくなるので注意。

### monokai
人気のテーマらしい。
syntaxがきれいに色分けされて見やすい。

### Sublime-Style-Column-Selection
矩形選択できるようになる。
【ラズパイIoT】node.jpを利用してhttpsとaws iotでslackに通知

#内容
ラズパイからhttpｓとaws iotでslackのwebhookへ通知してみる
aws iot利用の場合はlambdaやSNSをどう用いてslackに通知が肝と思うけど、
とりあえず、リクエストするところだけ記載。

###前提・環境
```
端末：ラズパイ3
$ uname -a
Linux raspberrypi 4.4.21-v7+ #911 SMP Thu Sep 15 14:22:38 BST 2016 armv7l GNU/Linux
$ node -v
v6.7.0
```


## 1.単純にHTTPリSクエスト
ライブラリとして[request](https://github.com/request/request)を利用

```
git clone git@github.com:request/request.git
cd request
npm install
```

実際にリクエストするサンプルは下記

```js:https.js
//requestをrequire
var request = require('request');

//ヘッダー
var headers = {
  'Content-Type':'application/json'
}
//オプションを定義
var options = {
  url: '<webhook-url>',
  method: 'POST',
  headers: headers,
  json: true,
  body: {"text":"fuga"}
}
//リクエスト送信
request(options, function (error, response, body) {
})
```

##2.aws iotにpublish
aws iotに対して、publishを行う。
mqttのpublish先は"sample/iot"
awsコンソールでの設定等については省略。

aws iotのsdkは[github](https://github.com/aws/aws-iot-device-sdk-js)
で結構詳しく記載しているからよく読めば大丈夫だと思うけど、参考として。

```
#１つめはnpmから
npm install aws-iot-device-sdk
#２つめはgithubから
git clone https://github.com/aws/aws-iot-device-sdk-js.git
cd aws-iot-device-sdk-js
npm install
```

```js:awsiot_publish.jp
// AWS IoT DeviceSDKの利用
var awsIot = require('aws-iot-device-sdk');

// 秘密鍵、証明書などの設定
// certsディレクトリに一式置く。
var device = awsIot.device({
  region: '<your region>',
  clientId: '<your clientId>',
  privateKey: 'certs/private.pem.key',
  clientCert: 'certs/certificate.pem.crt',
  caCert: 'certs/root-CA.crt',
});

// 通信確立した際に呼び出されるイベント
device
  .on('connect', function() {
    console.log('connected');
      device.publish('sample/iot', JSON.stringify({ test_data: 'test message'}));
  });
device
  .on('message', function(topic, payload) {
    console.log('message', topic, payload.toString());
  });

// ちなみにconnectの中で呼ばれなくてもpublishは可能。
// 上記のpublishをコメントアウトしてこっち有効にしてもリクエストできる。
// device.publish('sample/iot', JSON.stringify({ test_data: 'test message'}));
```
SSH経由のディレクトリ転送を効率的に行う

`scp` に `-r` をつけると、ディレクトリ内のファイルを再帰的にコピーします。しかしファイル数が多い時は `scp -r` よりもディレクトリを一つのアーカイブに固めたほうが、効率よくファイルを転送できます。ということでベンチマークをとってみました。対象は自分の環境の `/usr/include` で、ファイル数は2226個でした。

**追記: `scp -Cr`, `sftp`, `sftp -C` の結果を追加しました。**

比較対象
-------

- `scp -r`: ディレクトリを再帰的にscp

```sh
scp -r /usr/include example.com:
```

- `tar c`: ディレクトリをtarに固めて転送

```sh
tar cf - /usr/include | ssh example.com 'tar xf -'
```

- `tar cz`: ディレクトリをtar.gzに固めて転送

```sh
tar zcf - /usr/include | ssh example.com 'tar zxf -'
```

- `scp -Cr`: SSHの圧縮を有効にして `scp -r`

```
scp -Cr /usr/include example.com:
```

- `sftp`: SFTPでディレクトリ転送

```
sftp -b <(echo put -r /usr/include) example.com
```

- `sftp -C`: SSHの圧縮を有効にしてSFTPでディレクトリ転送

```
sftp -C -b <(echo put -r /usr/include) example.com
```

結果
----

|           | 転送時間   |
|-----------|-----------|
| `scp -r`  | 2m29.534s |
| `scp -Cr` | 2m18.356s |
| `sftp`    | 2m24.265s |
| `sftp -C` | 2m28.265s |
| `tar c`   | 2.276s    |
| `tar zc`  | 1.032s    |




ダントツに、`scp -r` よりもアーカイブ化したほうが転送速度が短くなりました。`/usr/include` 以下は圧縮率が良いのか、tar.gzにしたほうが更に転送時間が短くなりました。

結論
----

ディレクトリをSSH経由で転送するときは

```sh
tar zcf - <from_dir> | ssh <target_host> 'tar zxf -'
```
Requestsで日本語を扱うときの文字化けを直す

# 環境
Python: 3.5
Requests: 2.11.1

# 概要
Requestsを使って日本語ページを取得したときに表示すると文字化けが起こる。
今回、自分の場合はページ側のエンコードがShift-JISの場合に起こっていた。

```python
import requests

response = requests.get('適当な日本語ページ')
print(response.encoding)
```
で調べると、ISO-8859-1が返ってきていた。
どうも、文字コードがうまく取れてない場合に適当にかえしてる？？

# 解決
```python
import requests

response = requests.get('適当な日本語ページ')
response.encoding = response.apparent_encoding  # この行を追加
```
apparent_encodingを呼び出すと、どうやらライブラリ使って、ちゃんと文字コードを判定するらしい。
今回の場合は、これで文字化けしなくなった。

# 参考
https://blog.aoshiman.org/entry/118/
Tech-Circle Unity VRハンズオン 事前準備

この記事は2016/10/19に開催されるTech-Circle Unity VRハンズオン UnityでVRアプリを作ってみよう！の事前準備資料です。
全体的な流れは以下の通りです。

- Unityのインストール
- Android/iOSのビルド環境、実機実行設定
- ハンズオンに使用するアセットのインポート
- Androidスマートフォン/iPhone端末実行テスト

# 事前準備に必要なもの
事前準備をするためには以下が必要です。

- ハンズオンに使用するPC(Windows/Mac)
- ハンズオンに使用するスマートフォン(Android/iPhone)
- PCとスマートフォンを接続するケーブル
- インターネット環境
- [git](https://git-scm.com/)

# 開発環境について
PCのOSとデバック実行可能なスマートフォンの対応関係は以下の通りです。

#####Windows OS PC の方

Androidのみ


#####Mac OS PC の方

AndroidとiPhoneの両方可能


# Unity VRハンズオン 事前準備（開発環境準備編）
下記手順の記事になります。まずこの事前準備を行ってください。

- Unityのインストール
- Android/iOSのビルド環境、実機実行設定

http://qiita.com/decchi/private/2e80c643917851bd3269

# Unity VRハンズオン 事前準備（Unity プロジェクト準備編）
下記手順の記事になります。「Unity VRハンズオン 事前準備（開発環境準備編）」が完了後こちらも実施してください。

- ハンズオンに使用するアセットのインポート
- Androidスマートフォン/iPhone端末実行テスト

http://qiita.com/decchi/private/9f902c9a1c88a64cbd06
Swift 3 の日時操作チートシート

記事の内容はこちらを参照してください。
https://mishimay.github.io/8d67b583dc6809b2baf5/
<!--

Dateの操作でよく使うものをまとめました。


# 生成

```swift
let calendar = Calendar(identifier: .gregorian)
let date = calendar.date(from: DateComponents(year: 2016, month: 10, day: 1))
// -> 2016年10月1日 0時0分
```

  - `Calendar.current` を使用するとローカル環境によってカレンダーが変わることに注意
    - カレンダーが違うと「2016年10月1日」と言っても違う日時を指すことになるので、西暦で指定したい場合は `.gregorian` のカレンダーを使用すること
    - 例えば西暦 (`.gregorian`) 2016年 = 和暦 (`.japanese`) 28年
  - タイムゾーンを指定したい場合は `calendar.timeZone` を変更する
    - デフォルトはローカル環境のタイムゾーン

# 要素取得

```swift
// date: 2016年10月1日 0時0分
calendar.component(.day, from: date)
// -> 1
```

# 要素追加

```swift
// date: 2016年10月1日 0時0分
calendar.date(byAdding: .day, value: 1, to: date)
// -> 2016年10月2日 0時0分
calendar.date(byAdding: DateComponents(hour: 1, minute: 1), to: date)
// -> 2016年10月1日 1時1分
```

  - 週を足したい場合は `weekOfYear` か `weekOfMonth` を使用

# 要素置き換え

```swift
// date: 2016年10月1日 0時0分
var components = calendar.dateComponents([.year, .month, .day, .hour, .minute, .second, .nanosecond], from: date)
components.month = 9
calendar.date(from: components)
// -> 2016年9月1日 0時0分
```

  - `components.day = 32` など日の範囲を超えて指定すると月が繰り上がる
  - マイナスも指定可

# 要素再設定

```swift
// date: 2016年10月1日 2時34分
calendar.date(bySetting: .month, value: 9, of: date)
// -> 2017年9月1日 0時0分
```

  - **指定した要素にマッチするまで日時が進むor戻ることに注意**
    - 上の例では、月の指定だけにも関わらず2016年から2017年まで進み、時間が0時0分に変わっている
    - 進むか戻るかは実装によるらしい
    - より詳細なコントロールが必要な場合は `nextDate(after:matching:matchingPolicy:behavior:direction:)` を使用すること

# 差の取得

```swift
// date: 2016年10月1日 0時0分
// date2: 2016年10月10日 0時0分
calendar.dateComponents([.day], from: date, to: date2).day
// -> 9
```

# 別の日時の取得

## 一日の初め
```swift
// date: 2016年10月1日 2時34分
calendar.startOfDay(for: date)
// -> 10月1日 0時0分
```

## 次の週末
```swift
// date: 2016年10月1日 2時34分
calendar.nextWeekend(startingAfter: date)
// -> DateInterval (2016年10月8日 0時0分 から 2016年10月10日 0時0分)
```
  -  iOS 10 以上

# 判定

```swift
calendar.isDateInToday(date) // 今日か
calendar.isDateInTomorrow(date) // 明日か
calendar.isDateInWeekend(date) // 週末か
calendar.isDateInYesterday(date) // 昨日か
calendar.isDate(date, inSameDayAs: date2) // ある日と同じ日か
```

# 比較

```swift
date == date2 // 等値比較
date < date2 // 大小比較
```



# 参考
[Calendar - Foundation | Apple Developer Documentation](https://developer.apple.com/reference/foundation/calendar)




-->
XGBoostをMac, CentOSにインストールする

# 概要

scikit-learnのgbmより早くて性能が高いと言われるXBGoostをMac, CentOSにインストールする。

# Macへのインストール
## 依存ライブラリclang-ompのインストール
```
$ brew tap homebrew/boneyard
$ brew install clang-omp
```

## XGBoostのインストール

```
$ pip3 install xgboost
```


# CentOSへのインストール
## gccのアップデート  
通常だとgcc 4.4のままなので、XGBoostのコンパイルに必要な4.6以上である4.8にアップデートする。

```  
$ wget http://people.centos.org/tru/devtools-2/devtools-2.repo -O /etc/yum.repos.d/devtools-2.repo  
$ yum install devtoolset-2-gcc devtoolset-2-binutils devtoolset-2-gcc-c++  
```  

`Error: database disk image is malformed`となってインストールに失敗する場合は、`yum clean all`を実行。  
  
## パスの切り替え  
`/opt/rh/devtoolset-2/root/usr/bin/`にインストールされているため、一時的にパスを切り替える。

```  
$ scl enable devtoolset-2 bash  
```  
  
## XGBoostのインストール  

```  
$ pip3 install xgboost  
```  


# 使用例

```:python3
from xgboost import XGBRegressor
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score

diabetes = datasets.load_diabetes()
X = diabetes.data
y = diabetes.target

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=0)

clf = XGBRegressor()
clf.fit(X_train, y_train)
pred = clf.predict(X_test)

print('r2 = {}'.format(r2_score(y_test, pred)))


import matplotlib.pyplot as plt
%matplotlib inline

plt.grid()
plt.scatter(y_test, pred)
plt.show()
```

<img width="534" alt="スクリーンショット 2016-10-10 21.26.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/25443/a12d3500-918b-e36b-137e-5e4e1407fce2.png">


# References

- [XGBoost Python Package](https://github.com/dmlc/xgboost/tree/master/python-package)
- [brew install clang-omp not working](http://stackoverflow.com/questions/38971394/brew-install-clang-omp-not-working)
- [How to Install gcc 4.7.x/4.8.x on CentOS](http://superuser.com/questions/381160/how-to-install-gcc-4-7-x-4-8-x-on-centos)
- [yumで「Error: database disk image is malformed」と出る](http://blog.penlabo.net/archives/1052)
- [CentOSに新しいバージョンのGCC/G++(4.8/4.9)をインストールする](http://www.task-notes.com/entry/20151114/1447492231)
iOSアプリ開発のためにヒューマンインターフェースガイドラインを参考にしつつApple製のアプリを観察する（ナビゲーションバーのセグメント化コントロール編）

こんにちは @yimajo です。
この記事ではiOSにインストールされているApple製のアプリのUIについて考察し、アプリ開発の参考とすることを目的としています。Appleの[iOS ヒューマンインターフェースガイドライン](https://developer.apple.com/ios/human-interface-guidelines/)をたびたび引用するので、省略してApple HIGと呼称します。

## 前提

Apple HIGに準拠している内容についてはリンクしていますが、基本的にはApple製アプリの共通点からHIGに書かれていないUIの一貫性を元に考察しています。もし違ったパターンがある場合はコメントをいただけると幸いです。

## ナビゲーションバーに置くセグメント化コントロールについて

- Apple HIGより、一般的にはナビゲーションバーはタイトル、バックボタン、表示内容をコントロールするUIを含んでいる
    - それ以外のコントロールを[詰め込む事を避ける](https://developer.apple.com/ios/human-interface-guidelines/ui-bars/navigation-bars/)
- Apple HIGより、セグメント化コントロールでそれぞれのセグメントは[等幅](https://developer.apple.com/ios/human-interface-guidelines/ui-controls/segmented-controls/)
- Apple HIGより、セグメント化コントロールは幅がひろいほうがタップしやすい
    - セグメントの数は[5以下にすべき
](https://developer.apple.com/ios/human-interface-guidelines/ui-controls/segmented-controls/)

具体例として、次の画像はiOS10 iTunes Store.appの「ミュージック」画面

<img width="375" alt="IMG_5886.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/16400/26d0ab62-eb67-53ba-0be3-374e261740d8.png">

### ナビゲーションバーに入り切らないセグメント化コントロールをナビゲーションバーを下に延長して配置

次の画像は同じくiOS10のiTunes Store.appのメニューをタップした画面


<img width="375" alt="IMG_5887.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/16400/18380714-85f6-a9ef-46ce-810878d9f4e0.png">

比較のあまり良くない例として、次の画像も同じくiOS10 iTunes Store.appの「トーン」画面。着信音を購入する画面。

<img width="375" alt="IMG_5888.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/16400/8be109c5-8746-717a-2d82-282a8c4ddec8.png">

- ジャンルの位置が先程の「ミュージック」画面と違い統一感がない
- タイトルに「着信音/通知音」と表示するためにセグメント化コントロールを下に置いている
  - ジャンルが左、タブバーが「着信/通知音」ならセグメント化コントロールを延長せずにそのまま置ける気がする
  - そうしてないのは通常のミュージックと着信音が明らかに違うものだから購入時に注意を惹くようにしているのだろうか

### セグメント化コントロールの背景色を変更するなら

- セグメント化コントロールの背景色を変更するなら区別できるようにする
  - Apple HIGより、背景色を変えるなら[よく見えてかつきちんと並んでいるようにする](https://developer.apple.com/ios/human-interface-guidelines/ui-controls/segmented-controls/)

Apple製のアプリでセグメント化コントロールをカスタムにしている例がないので、tumblrの「メッセージ」画面でメッセージが0件の例

<img width="375" alt="IMG_5889.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/16400/e5cecda1-0fb4-8a35-7886-18015b041e4e.png">

悪い例の比較として国内のアプリから

<img width="375" alt="IMG_5884.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/16400/260f1a86-344f-3411-eb06-00e52a56a3b2.png">

- ナビゲーションバーにすでに「ニュース/運営から」と表示している
    - にもかかわらずナビゲーションバーを拡張し「ニュース」と「運営から」のセグメント名があり重複している
- どちらが選ばれているかを注意しなければ判別しづらい
    - 情報が0件の場合は特に何が何だか分からない



# 参考

- [iOSアプリ開発のためにヒューマンインターフェースガイドラインを参考にしつつApple製のアプリを観察する（対話型要素編）](http://qiita.com/yimajo/items/ef925291441e5bb20927)
PythonでLINE-Bot[0]

##PythonでLINE-Botを作ってみました。
以前はLINEがトライアル版を先着1万人限定で募集していましたが、正式にAPIが先日発表されました。
その概要は以下を参照すべきでしょう。
https://developers.line.me/messaging-api/overview

##httpsも問題の回避策
このmessaging-apiですが、httpsでサーバーを構築する必要があります。
この解決策としてlocaltunnelを使用し、ローカルの環境を一時的に外部に公開する手法を用いることができます。
何故か知りませんが、httpだけでなくhttpsからもアクセスできるのでlocalhost:3000でLINE-APIの処理を受け付けるAPIを作っておき、それをlocaltunnelにて公開することでhttpsを構築する事ができます。

##問題点
ですが、これは根本的な解決ではなく、また、プログラムに意図しないことが起きることになるでしょう。
その一例として、全てのリクエストが確実に受けることができないことが挙げられます。
あくまでも開発用に用いましょう。

##実際に完成したもの。
今は24時間稼働させれる状況に無いので動画のみの公開とします。
https://youtu.be/ASvFyOUHl4A
ridgepoleでutf8_general_ciを指定しているのにutf8mb4の最大文字数エラーにかかった話

#さいしょに

ridgepoleは何も悪くないです。

#事件
```[ERROR] Mysql2::Error: Specified key was too long; max key length is 767 bytes: CREATE UNIQUE INDEX `xxxxxx` USING btree ON `xxxxxxx` (`xxxxx`)```

というエラーが出た。

```
t.string   "xxxxx", limit: 255, null: true, collection: "utf8_general_ci"
add_index "xxxxxx", ["xxxxxx"], name: "key_twitter_exts_1", unique: true, using: :btree
```

と指定しているのでutf_general_ciが使われるはずなのだけど、どうもutf8mb4のままになっているっぽい。

#原因


<img width="390" alt="スクリーンショット 2016-10-10 20.03.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/24979/aa504988-6fce-cbcd-bdb5-08691e6b7d0a.png">

うーん…


<img width="252" alt="スクリーンショット 2016-10-10 20.03.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/24979/7ddf04d9-4de9-7603-1484-976fd133c0b9.png">

うーん……？

<img width="94" alt="スクリーンショット 2016-10-10 20.03.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/24979/6dfb8f23-4c12-86b9-31c5-2b8ea8af5f13.png">

**あ！！！**

#タイポ

collectionじゃなくて**collation**な。
macのファイル名のための安全なNFC正規化

事の発端はこちら [結合文字列をUnicode正規化で合成する方法の危険性](http://qiita.com/monokano/items/d4c37d9bc9833eaeda6e)
そこで
[結合文字列を合成する安全な方法を考える
](http://qiita.com/monokano/items/15c1d70d2f77bd37d067) のJavaScript版です。

JavaScriptでは、String.normalizeメソッドでNFC正規化ができますが、これを使うと、互換漢字も変換されてしまいます。結合文字だけを元通り合成する関数を作りました。

```
function macNFC(name) {
	var myReg = /[^\u{0340}\u{0341}\u{0343}\u{0344}\u{0374}\u{037E}\u{0387}\u{0958}-\u{095F}\u{09DC}\u{09DD}\u{09DF}\u{0A33}\u{0A36}\u{0A59}-\u{0A5B}\u{0A5E}\u{0B5C}\u{0B5D}\u{0F43}\u{0F4D}\u{0F52}\u{0F57}\u{0F5C}\u{0F69}\u{0F73}\u{0F75}\u{0F76}\u{0F78}\u{0F81}\u{0F93}\u{0F9D}\u{0FA2}\u{0FA7}\u{0FAC}\u{0FB9}\u{1F71}\u{1F73}\u{1F75}\u{1F77}\u{1F79}\u{1F7B}\u{1F7D}\u{1FBB}\u{1FBE}\u{1FC9}\u{1FCB}\u{1FD3}\u{1FDB}\u{1FE3}\u{1FEB}\u{1FEE}\u{1FEF}\u{1FF9}\u{1FFB}\u{1FFD}\u{2000}\u{2001}\u{2126}\u{212A}\u{212B}\u{2329}\u{232A}\u{2ADC}\u{F900}-\u{FAFF}\u{FB1D}\u{FB1F}\u{FB2A}-\u{FB36}\u{FB38}-\u{FB3C}\u{FB3E}\u{FB40}\u{FB41}\u{FB43}\u{FB44}\u{FB46}-\u{FB4E}\u{1D15E}-\u{1D164}\u{1D1BB}-\u{1D1C0}\u{2F800}-\u{2FA1F}]+/gu;
	 if(name.normalize) name =  name.replace(myReg,function(r){return r.normalize('NFC')}) ;
	 return name ;
}
```

[実働サンプルはこちら](http://wakufactory.jp/densho/font/macNFC.html)
(OSXのSafariでは、入力フィールドにペーストした時点でNFC変換されてしまいます。Chromeで試してみてください)