OmniAICreator/Qiita-1.07M huggingface dataset:
Postfix Cloudflare 利用時におけるサブドメインのDKIM SPFの設定方法

今まできちんと向き合って来なかったメール設定について、今更ながらきちんと設定してみます。迷惑メールに入るのはまっぴらです。
エラー文言で検索しても出てくるのが英語サイトばかりだったということも有りこちらを書いています。エラー文言経由でたどり着いた人は下の方に進んでください。

## 基本的な流れはこちらを踏襲
https://blog.apar.jp/linux/856/

## DKIM署名用の秘密鍵と公開鍵の作成
> opendkim-genkey -D /etc/opendkim/keys/apar.jp -d apar.jp -s 20141105

ここの形式はこんな感じです。
> opendkim-genkey -D 保存フォルダ -d ドメイン -s セレクタ名

セレクタ名は何でも良いので日付でももちろんOKだが、複数ドメインのキーを作る場合で
/etc/opendkim/keys/
以下に全てのキーを作ってしまう場合に日付だけだとファイル名が被ってしまうので注意。
(もちろんフォルダを掘れば良いのだが、設定ファイル書く時面倒な気がする)
上記の理由から下記のコマンドでファイルを作る。
(以下、a.lne.stというサブドメインで設定する場合を例にする)

>  opendkim-genkey -D /etc/opendkim/keys/ -d a.lne.st -s 20151117a

結果として /etc/opendkim/keys/以下に
- 20151117a.private
- 20151117a.txt

の2つのファイルが出来上がる。

ファイルができたら鍵ファイルの所有者をopendkimにしないとメール送信時にエラーが出るので注意。

> chown opendkim:opendkim /etc/opendkim/keys/20151117a.*

## CloudFlareへのレコードの登録
サブドメインの場合にハマったのはName属性の書き方でした。サブドメイン入れてなかった。

登録方法
- TYPEをTXT
- Nameを20151117a._domainkey.a
- Valueを p=ここに20151117a.txtの中にあるp=の部分を書く

これでOK。
もう一つレコードが必要

- TYPEをTXT
- Nameをa
- Valueをv=spf1 ptr:lne.st ip4:xxx.xxx.xxx.xxx(サーバのIP) ~all
として保存する。


## KeyTableの書き方
/etc/opendkim/KeyTable
にこの一行を追加する。

> 20151117a._domainkey.lne.st a.lne.st:20151117a:/etc/opendkim/keys/20151117a.private

## SigningTableの書き方
/etc/opendkim/SigningTable

> *@a.lne.st 20151117a._domainkey.lne.st

## hostsでハマる
サーバのhosts設定が適当だった為、メールのソースを見るとこんなエラーが出ていた。
> Received-SPF: neutral (google.com: xxx.xxx.xxx.xxx is neither permitted nor denied by best guess record for domain of nginx@localhost.localdomain) client-ip=xxx.xxx.xxx.xxx;

localhost.localdomainってなっている。そりゃ、このドメインからじゃ認証されませんよね…

/etc/hosts

> 127.0.0.1   localhost localhost.lne.st localhost4 localhost4.localdomain4
> xxx.xxx.xxx.xxx(サーバのIP) a.lne.st

* localhost4の記載は必要なのでしょうか…どなたか教えて下さい…

書き換えてからリロード
> service network reload

再度送信してみてメールソースを見てみるとこうなっているはず

> Received-SPF: pass (google.com: domain of nginx@lne.st designates xxx.xxx.xxx.xxx as permitted sender) client-ip=xxx.xxx.xxx.xxx;

## dkim=temperror (no key for signature) header.i=@a.lne.st
こんなの出る場合。
DNSの設定がダメなパターンです。Cloudflareでやっていたのですが先ほど設定したNameを

20151117a._domainkey
と、サブドメイン抜きで設定してしまっていました。こうすると、a.lne.stというサブドメインに設定されたDKIMの設定を読み出すことが出来ません。
きちんとName設定をしましょう。設定を終えてメールを送信し、メールのソースを見るとdkimがパスしているのが見て取れると思います。

> dkim=pass header.i=@a.lne.st


以上の設定でメールの設定は完璧だと思います。

http://www.mail-tester.com/

こちらにサーバからメールを送信してみると、何が悪いのか教えてくれるのでオススメです。
が…DNS(僕の場合で言うとCloudflare)の設定については、おかしいよとは言ってくれますが、何がおかしいのかについては自分で調べないといけないので注意ですね。

無事に迷惑メールに入らなくなりました！

## 備考
Nginx リバースプロキシで設置したWordpressのフォームからメールを送信した時の挙動です。
Hyper-V上のUbuntu仮想マシンがシャットダウンできない

#環境
- Windows Server 2012 R2
- Hyper-V上の仮想マシン
-- Ubuntu 14.04 LTS

#トラブル
仮想マシン上のUbuntuにSSHで入ってゴニョゴニョしてるんですが、
再起動が必要になった時、

```
#shutdown -r now
```
をしても全然応答が無い。
うぬぬぬ…。
実機のWindows Serverは遠いところにあるので、
更にRemote Desktopで入って、
Hyper-Vマネージャを立ち上げて、
仮想マシン見るとシャットダウン途中で止まっておる。

Hyper-Vからシャットダウンして再起動。
…めんどくさいんじゃ！

#ググる
Ubuntu Forum より
[Ubuntu 14.04 Desktop will not shutdown in Hyper-V 2012 R2 VM](http://ubuntuforums.org/showthread.php?t=2234197)
↑ほうほう…。
ここにあるapparmorの再インストールはダメらしい。
下の方を見ていくと…

```
I was having the same issue. What solved this was turning off dynamic memory for the VM.
```
よくわからんが、仮想メモリのことかしら。
どれどれ。

Hyper-Vマネージャから仮想マシンの「Hyper-Vの設定」
「NUMAモードにまたがるメモリ割り当て」にある
「仮想マシンに物理 NUMA ノードをまたがるメモリを割り当てる」
のチェックを外す。

その後仮想マシンの再起動をリモートからやってみると直った！
なんだよNUMAノードって。またがってんじゃねーよ。
SSH で繋いだ先の Ubuntu で vim で BackSpace 押したら ^? とか出る

タイトルの通りなんですが，ググると じゃけん `stty erase ^?` しましょうね〜 とか出る．
できない．どうするか．

```bash
$ stty erase ^?
stty: `#bashrc#': 無効な整数の引数です
Try 'stty --help' for more information.
```

ダブルクォートで囲めばいいだけの話だった．

```
stty erase "^?"
```

.zshrc に書いて解決．
おわり
docker-machine で利用する virtualbox 仮想マシンのディスクサイズを増やす


ただの覚書程度だけど、 `docker-machine create` する際に `--virtualbox-disk-size` オプションで指定できる。

```bash:ヘルプの記述
$ docker-machine create --help
（中略）
--virtualbox-disk-size "20000" Size of disk for host in MB [$VIRTUALBOX_DISK_SIZE]
（中略）
```

以下、 20GB の sample という名前の仮想マシンを作成する例。
容量数字はクォーテーションしないと反映されなかった気がする。
単位は MB。

```bash:指定例
$ docker-machine create --driver virtualbox --virtualbox-disk-size "20000" sample
```
Gitコマンドエラーとその対応方法（初心者）

gitはadd commit push あとはmerge プルリがなんとか。rebaseをちょっとわかってきた新卒エンジニアです。

Gitコマンドででてきたエラーまとめを書いていこうかなと思います。
ググルのめんどいなとおもって・・・

#git push -u origin master
##エラー
~~conq: repository does not exist.
fatal: Could not read from remote repository.
Please make sure you have the correct access rights and the repository exists.
そのリポジトリはもうあるよって言われているので~~

2018/01/12追記
コメントをいただいたので修正
conq: repository does not exist. => リポジトリがありません。
fatal: Could not read from remote repository. => リモートリポジトリが読めません。
Please make sure you have the correct access rights and the repository exists.
=> あなたが正しいアクセス権を持っているかそのリポジトリが存在することを確認してください。

##対応法
git remote set-url origin git@bitbucket.org:ここに名前を入れる/リポジトリの名前.git
bitbucketで出会ったエラーなのでgit@以下は適宜変えます。

2016/11/30編集
追加

- [bitbucketにpushできない
](http://qiita.com/opiyo_taku/items/dcf02e94bace8ed781c8)
- [SSH認証鍵をBitbucketに設定
](http://qiita.com/ksugawara61/items/a4f34e5e120bea1732d5)
- [git remote add のミス](http://qiita.com/n0bisuke/items/f52dd24ffd9d6762fe27)
- [[Bitbucket]gitコマンドでBitbucketを操作する　〜基本編〜](http://qiita.com/yyosuke/items/986dabc9906674e2ea97#ローカルリポジトリの作成)
- [【git】git pushがrejectされたときの対応方法](https://www.softel.co.jp/blogs/tech/archives/3569)
- [初めてGitHubリポジトリにpushしたらrejectedエラーになったときの対応メモ](http://qiita.com/takanatsu/items/fc89de9bd11148da1438)
- [git invalid username or password](http://stackoverflow.com/questions/29297154/git-invalid-username-or-password)
- [git addの取り消しと、コミット済みのファイルを除外する方法](http://d.hatena.ne.jp/kanonji/20101116/1289885277)


#参考
[参考サイト1](http://qiita.com/liubin/items/e05276c2258ffe088f8e)
[参考サイト2](http://verytired.hateblo.jp/entry/2013/07/10/191324)
GitHub実践入門
Network-weathermap on CentOS7 with gri

# Installation

## Installation gri
* griはgemパッケージで提供されているのでgem installで入れることができる。
<pre>
 # yum install ruby-gems
 # gem install gri
</pre>

## Installation network-weathermap
* Network weathermapはPHPに依存しているのでPHP関連のパッケージを入れる。
<pre>
 # yum install rrdtool
 # yum install rrdtoop-php
 # yum install cacti
 # yum install php-gd
 # yum install php-pear
</pre>

* Network weathermapをインストールする
    * といっても、パッケージを展開するだけで良い。
    * 以下から、最新版をダウンロードする。
        * http://network-weathermap.com/#downloads
* 以下は、/var/www/html（DocRoot)に展開した場合の操作
<pre>
 # chown -Rv apache:apache /var/www/html
</pre>

### editorの設定変更
* webで設定ファイルを修正するためにはeditorをONにしなければならない
    * また、PHPの構文が古く、上記と合わせて2カ所を編集しないと正しく動作しない

<pre>
# diff -U0 /var/tmp/weathermap/editor.php editor.php                                                                                       
--- /var/tmp/weathermap/editor.php      2013-04-10 14:14:36.000000000 -0700
+++ editor.php  2015-11-20 17:52:36.484220260 -0800
@@ -7 +7 @@
-$ENABLED=false;
+$ENABLED=true;
@@ -32 +32 @@
-    $parts = split(":",$_COOKIE['wmeditor']);
+    $parts = explode(":",$_COOKIE['wmeditor']);</pre>
</pre>

# 利用開始
* 上記の通り展開した場合は、http://webserver/editor.php にて設定編集が可能になる。
matchメソッドの書式について


# はじめに

Ruby on Railsでルーティングを設定するときに使うmatchメソッドの書式についての個人的なメモ．

# 実例

例えば，Ruby on Rails Tutorial5章の「名前付きルート」のあたりに出てくる以下の表記を考える．

```rb
match '/about', to: 'static_pages#about', via: 'get'
```

これはRubyのメソッドなので，引数を括るカッコが省略された書き方．カッコを省略しないで書くと，以下のようになる．

```rb
match('/about', to: 'static_pages#about', via: 'get')
```

また，最後の引数がハッシュなので波括弧が省略されているので，実は以下のように書いても良い．

```rb
match('/about', {to: 'static_pages#about', via: 'get'})
```

ハッシュをハッシュロケットを使った記法にして以下のように書くこともできる．

```rb
match '/about', :to => 'static_pages#about', :via => 'get'
```
log4j2でコンソールとファイルで別のレベルを出力させる

log4j2で、コンソールはINFOレベル、ファイルはTRACEレベルのような形で表示したいときがよくわからなかったので調べた結果。
AppenderRefにそれぞれのlevelを追加するとできるみたい。
ただし、上の層のRootでINFOレベルにしてしまった場合はDEBUGレベルやTRACEを下の層で指定しても表示できないので注意。

```xml:log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="off" name="Module" packages="">
  <Properties>
    <Property name="ConsoleLoglayout">%d %highlight{%p - %m}{TRACE=blue}%n</Property>
    <Property name="FileLoglayout">%d %p %c{1.} [%t] %m%n</Property>
  </Properties>
  <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="${ConsoleLoglayout}"/>
    </Console>
    <RollingFile name="File" fileName="app.log" filePattern="app-%d{yyyy-MM-dd}-%i.gz">
      <PatternLayout pattern="${FileLoglayout}"/>
      <Policies>
        <SizeBasedTriggeringPolicy size="20 MB"/>
      </Policies>
      <DefaultRolloverStrategy max="3"/>
    </RollingFile>
  </Appenders>
  <Loggers>
    <Root level="trace">
      <AppenderRef ref="Console" level="info"/>
      <AppenderRef ref="File" level="trace"/>
    </Root>
  </Loggers>
</Configuration>
```
JAVA finally

■Test07.java

```java
import java.io.FileWriter;
import java.io.IOException;

public class Test07 {

	public static void main(String[] args) throws IOException {
		FileWriter fw = null;
		try {
			fw = new FileWriter("data.txt");
			fw.write("hello!");
		} catch (IOException e) {
			System.out.println("何らかの例外が発生しました");
		} finally {
			fw.close();
		}
	}
}
```
↑今までこの様にfinallyを態々書いていましたが、
finallyブロックを書かなくても、try-with-resource文を使ってJavaによって自動的にclose()メソッドが呼び出されます。
<FONT color="#ff0000">try-with-resources文</font>

```java
import java.io.FileWriter;
import java.io.IOException;

public class Test04 {
	public static void main(String[] args) {
		try (FileWriter fw = new FileWriter("data.txt");) {
			fw.write("hello!");
		} catch (Exception e) {
			System.out.println("何らかの例外が発生しました");
		}
	}

	public static void subsub() throws IOException {
		FileWriter fw = new FileWriter("data.txt");
	}
}
```
横のデータを縦に持つには

いわゆるマルチカラムアトリビュートのテーブルから、正規化されたテーブルに変換したいことはままあると思います。


<table>
<tr>
<th>id</th>
<th>a1</th> <th>a2</th> <th>a3</th> <th>a4</th> <th>a5…</th>
<th>b1</th> <th>b2</th> <th>b3</th> <th>b4</th> <th>b5…</th>
</tr>
</table>

のようなテーブルです。

そういうとき、`unnest`を使うと便利っぽいです。

```sql
SELECT
  id,
  unnest(array[a1, a2, a3, a4, a5, ...]),
  unnest(array[b1, b2, b3, b4, b5, ...])
FROM hoge;
```

のようにすると、縦横変換された形で値を取得することができます。


## unnest

[配列関数と演算子](https://www.postgresql.jp/document/9.4/html/functions-array.html) に書かれているように、`unnest`は配列を行集合に展開してくれる関数です。

これだけでは複数`unnest`が使用された場合にどう展開されるのか不明なので実験してみました。


#### 同じ長さの配列2つ

```sql
SELECT unnest(array[1, 2, 3]), unnest(array['hoge', 'fuga', 'piyo']);
```

```
1	hoge
2	fuga
3	piyo
```


#### スカラ値と同じ長さの配列2つ
```sql
SELECT 997, 998, 999, unnest(array[1, 2, 3]), unnest(array['hoge', 'fuga', 'piyo']);
```

```
997	998	999	1	hoge
997	998	999	2	fuga
997	998	999	3	piyo
```


#### 違う長さの配列2つ

```sql
SELECT unnest(array[1, 2, 3]), unnest(array['hoge', 'fuga']);
```

```
1	hoge
2	fuga
3	hoge
1	fuga
2	hoge
3	fuga
```

#### スカラ値と違う長さの配列2つ

```sql
SELECT 997, 998, 999, unnest(array[1, 2, 3]), unnest(array['hoge', 'fuga']);
```

```
997	998	999	1	hoge
997	998	999	2	fuga
997	998	999	3	hoge
997	998	999	1	fuga
997	998	999	2	hoge
997	998	999	3	fuga
```

```sql
SELECT 997, 998, 999, unnest(array[1, 2, 3, 4]), unnest(array['hoge', 'fuga']);
```

```
997	998	999	1	hoge
997	998	999	2	fuga
997	998	999	3	hoge
997	998	999	4	fuga
```

## 考察

動作を見る限り、下記のことが言えそうです。

1. スカラ値は`unnest`の動作に関与せず、展開後のすべての行に同じ値がつく。
2. `unnest`が複数使われた場合には、各配列長の最小公倍数の行数が作成される。各行には、各配列の要素が順番に入る。

なので、配列長に気を使えば十分この用途に使うことができそうです。
Mavenで管理しているプロジェクトをjar出力する

# Mavenで管理しているプロジェクトをjar出力する
- 以前やろうとしてハマったので自分用のメモ書き程度に記述しておきます

## 開発環境
- eclipse mars(4.5.1)
- windows 10

## プロセス
1. pom.xmlに書き足し
2. eclipse上でプロジェクト名を右クリック
3. build...
4. Goalに「package」を記述
5. run
6. プロジェクトのtargetフォルダ内にjarファイルが出来上がる

## ハマったところ
- コマンドラインからmvn clean compile jar:jarでコンパイルした場合、作成したファイルを「java -jar JARFILE」を実行した場合、メイン・マニフェスト属性がありませんと表示されてしまった

## pom.xml
```
<descriptorRefs>
  <descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
```
を足した

## 参考
[Mavenで必要なlibをjarに含められない対処](http://qiita.com/pcpDev/items/ca3a7a7e518d68344f00)
[[java]mavenを使用したjarの作成](http://hogeinstein.blog93.fc2.com/blog-entry-120.html)
[依存するjarを含んだバッチ用jarファイルをMavenでビルドする手順](http://takemikami.com/archives/1419/)
[Mavenで実行可能Jarを作成する方法](http://kakakikikeke.blogspot.jp/2014/12/mavenjar.html)
CentOS7にgitlabインストール

#####公式サイト
https://about.gitlab.com/downloads/
#####gitlab CentOS7について
https://about.gitlab.com/downloads/#centos7

#####環境
便宜上ホストの設定を以下の値とする

```
IP：192.168.120.35
```

#####依存パッケージ導入
```
sudo yum install curl openssh-server
sudo systemctl enable sshd
sudo systemctl start sshd
sudo yum install postfix
sudo systemctl enable postfix
sudo systemctl start postfix
sudo firewall-cmd --permanent --add-service=http
sudo systemctl reload firewalld
```
※ファイアウォールは止めてしまっても良い。

#####gitlabインストール
```
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
sudo yum install gitlab-ce
```

#####gitlabイニシャライズ
```
sudo gitlab-ctl reconfigure
```

ブラウザからログイン

```
http://192.168.120.35/users/sign_in
Username: root
Password: 5iveL!fe ※初期パスワード
```

ログイン後初期パスワードを変更

```
Setup new password
Current password:
New Password:password
```

ブラウザからログイン

```
http://192.168.120.35/users/sign_in
Username: root
Password: password ※変更したパスワード
```

以降ブラウザ上で操作。設定を行う。

昔インストールは結構大変だった印象だが最近のgitlabは簡単に導入できるみたい。
Djangoの言語ファイル(PO)とタブ区切りテキスト(TSV)を相互変換するスクリプト


Djangoの言語ファイルをハンドリングしやすいタブ区切りテキストと相互変換するスクリプト。参照元はStackoverflowのスレッド。
[Is there any program to edit multiple po files?](http://stackoverflow.com/questions/28774771/is-there-any-program-to-edit-multiple-po-files)
参照元のコードのCSVをTSVに変更し、TSVからPOを更新するスクリプトを追加。
TSVからPOの変換は、POファイルに存在するmsgidのみ上書きするので、POとTSVで要素が揃っていないと更新されないケースがあるので注意。

### Pythonモジュールのインストール

```bash:bash

pip install polib unicodecsv

```

### POからTSVに変換

```py:i18n_po2tsv.py

import sys
import unicodecsv as csv
from collections import OrderedDict
import polib

#
# Set default encoding
#
reload(sys)
sys.setdefaultencoding('utf8')

#
# Params
#
tsv_path = 'locale/localization.tsv'
po_paths = 'locale/{}/LC_MESSAGES/django.po'
langs = ['en', 'ja',]

#
# Convert po file to tsv
#
rows = OrderedDict()

print('')

for lang_code in langs:
    po_path = po_paths.format(lang_code)

    print('Reading po file... ' + po_path)

    po = polib.pofile(
        po_path,
        encoding='utf-8',
    )

    for entry in po:
        msgid = entry.msgid.encode('utf-8')
        msgstr = entry.msgstr.encode('utf-8')

        if msgid in rows.keys():
            rows[msgid].append(msgstr)
        else:
            rows[msgid] = [msgid, msgstr]

print('Saving tsv file... ' + tsv_path)
print('')

with open(tsv_path, 'wb') as f:
    writer = csv.writer(f, csv.excel_tab)
    writer.writerows(rows.values())

print('All done!')
print('')

```






### TSVからPOに変換

```py:i18n_tsv2po.py

import sys
import unicodecsv as csv
import codecs
import polib

#
# Set system encoding
#
reload(sys)
sys.setdefaultencoding('utf8')

#
# Params
#
tsv_path = 'locale/localization.tsv'
po_paths = 'locale/{}/LC_MESSAGES/django.po'

#
# Read tsv file
#
langs = {
    'en': {},
    'ja': {},
}

print('')
print('Reading tsv file... ' + tsv_path)

with open(tsv_path, 'rb') as tsv_in:
    tsv_in = csv.reader(tsv_in, delimiter='\t')
    # next(tsv_in, None)
    for row in tsv_in:
        if row[1]:
            langs['en'][row[0]] = row[1].encode('utf-8')
        if row[2]:
            langs['ja'][row[0]] = row[2].encode('utf-8')

#
# Read and save po file
#
print('')

for key, value in langs.iteritems():
    lang_code = key
    po_path = po_paths.format(lang_code)
    po = polib.pofile(
        po_path,
        encoding='utf-8',
    )

    print('Reading po file... ' + po_path)

    lang = langs[lang_code]
    for entry in po:
        msgid = entry.msgid.encode('utf-8')
        if lang.has_key(msgid):
            msgstr = lang.get(msgid, '').encode('utf-8')
            entry.msgstr = msgstr
            
    print('Saving po file... ' + po_path)

    po.save()

    print('Done!')
    print('')

print('All done!')
print('')

```
[Linux] プロンプト（PS1）に表示されるパスをフルパス表示へ変更する

# 経緯
- プロンプト（PS1(primary prompt string)）で表示されるパスをフルパスで表示したい！

# プロンプト（PS1(primary prompt string)）ってなに？
- ターミナルで表示される左側の部分

```shell-session
[root@centos6 ~]#
^^^^^^^^^^^^^^^^
この部分のこと
```

# 具体的には
- これを、、、

```shell-session
[root@centos6 ~]# cd /etc/sysconfig/network-scripts/
[root@centos6 network-scripts]#
```

- こう！

```shell-session
[root@centos6 ~]# cd /etc/sysconfig/network-scripts/
[root@centos6 /etc/sysconfig/network-scripts/]#
```

# やり方
## `/etc/bashrc` の36行目あたりを編集する
- これを、、、

```bash:/etc/bashrc
# Turn on checkwinsize
shopt -s checkwinsize
[ "$PS1" = "\\s-\\v\\\$ " ] && PS1="[\u@\h \W]\\$ "
```

- こう＼(^o^)／

```bash:/etc/bashrc
# Turn on checkwinsize
shopt -s checkwinsize
[ "$PS1" = "\\s-\\v\\\$ " ] && PS1="[\u@\h \w]\\$ "
```

# 何処が変わったの？
- 大文字 **`W`** を小文字 **`w`** へ変更しただけです！

# 設定の反映
- 再度ログインすれば反映されるが即時反映したい場合は下記コマンドを実行

```shell-session
[root@centos6 ~]# source /etc/bashrc

or

[root@centos6 ~]# . /etc/bashrc
```

**おしまい**
UnityのNGUI周りでよくハマる事

## NGUIのUISpriteのサイズを変更しているはずなのにされない！
```csharp
GetComponent<UIRect> ().SetRect(x,y,w,h / 2); //高さを半分にしたい！
```

インスペクタ上のUI SpriteのAspectが「**Based On Width**」等になっていると比率が変更できないため、コードで指定しても変更されない。
ちゃんと「**Free**」に変えてあげる。


## NGUIのUIButtonでDepthを表示順を変更しても当たり判定が前面に来ない場合

UIButtonの子の、BackgroundのDepthがあたり判定の基準になるが、
それが複数たとえば、Background（Depth=5)、Background2(Depth=3)とかになっていると、
あたり判定のColliderはDepth=5にはならないようです。
手っ取り早く、Depth5にするなら、Background2をUIButtonの子ではなく並列に配置すると回避できました。

<img width="176" alt="スクリーンショット 2015-11-25 13.52.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/37406/a6bbf896-7ac5-f395-0da0-99ff0eca6d4c.png">


## NGUIでローカライズする際になぜか適用されない。。

「UI Lable」と「UI Localize」コンポーネントを入れているはずなのに、
言語が反映されない。。
原因はアクティブになっていないUI Spriteが残っていたから。
こんな感じ。。
↓

<img width="364" alt="スクリーンショット 2015-12-02 14.54.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/37406/ce1e8f0c-7dc8-8049-054c-e43cd2230db4.png">

UI Spriteコンポーネントを削除すれば問題なし。

## Anchors(アンカー)を入れているのに、指定の位置にならない。

Anchorsを入れているUILabelやUISpriteがにtweenアニメーションで動いてしまっている等。

## ScrollViewの上にさらにScrollViewを重ねて表示していて、後から上に重ねたScrollViewが勝手にスクロールしてしまう。

上に重ねている方のScrollViewに設定しているAnchorを「None」にしたら治った。


## ローカライズ(UILocalize)の更新内容が反映されない。



![image.png](https://qiita-image-store.s3.amazonaws.com/0/37406/95853e44-3e06-30b3-126f-37df0a93c2b8.png)

Unityエディタ上で一度**プレイ**を押せば治ったりします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37406/7f598be6-5cda-c25f-6859-e864ee2352eb.png)
AWSセキュリティーグループのメモ

## メモ
セキュリティグループを作成するときに忘れやすいのでメモ

### EC2

|Type|Protocol|Port Range|Source|
|---|---|---|---|
|HTTP|TCP|80|0.0.0.0/0|
|SSH|TCP|22|0.0.0.0/0|
|Custom TCP Rule|TCP|4949|Munin監視用|
|Custom TCP Rule|TCP|5666|Nagios監視用|
|All ICMP|All|N/A|Ping監視用|

### RDS

|Type|Protocol|Port Range|Source|
|---|---|---|---|
|MYSQL/Aurora|TCP|3306|対象のセキュリティグループ|
Modal dialog with React

[React Modal](https://github.com/rackt/react-modal) があるけど、作ってみたのでメモ

```js:jsx
modal(show, contents){
    if(!show){
         return <span></span>;
    }
    return <div className="blind"><div className="dialog-wrapper">{contents}</div></div>;
}
```


```css:css

.blind {
	position: fixed;
	left: 0;
	right: 0;
	top: 0;
	bottom: 0;
	background-color: rgba(0,0,0,0.5);
	text-align:center;
}

.dialog-wrapper{
	position: relative;
	width: 500px;
	height: 800px;
	top: 50px;
	margin: auto auto;
}
```

- 位置固定で黒背景を表示して、その子としてダイアログとなるコンポーネントを表示するだけ。
- 画面閉じたりするのはkeyDownEventやボタンのイベントハンドラでお好みで
- jQuery UI Dialogでダイアログ表示してみるとReactに「管理外でDOMを変更するな！」と怒られる
List<T> を IDをキーにしたMap に変換


すぐ忘れるのでメモ。

idが重複すると`java.lang.IllegalStateException: Duplicate key`が発生するので注意。

```java
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.UnaryOperator;
import java.util.stream.Collectors;


public class ListToMapSample {
	public static void main(String[] args) {
		List<Foo> fooList = new ArrayList<>();
		fooList.add(new Foo(123, "aiueo"));
		fooList.add(new Foo(234, "ateawgareg"));
		fooList.add(new Foo(456, "faaewfgwaiaef"));
		
		Map<Integer, Foo> map = fooList.stream()
				.collect(Collectors.toMap(Foo::getId, UnaryOperator.identity()));
		System.out.println(map);
	}
	
	private static class Foo {
		private int id;
		private String name;
		public Foo(int id, String name) {
			this.id = id;
			this.name = name;
		}
		
		public int getId() {
			return id;
		}
		
		public String toString() {
			return "{id:" + id + ", name:" + name + "}";
		}
	}
}

```

```stdout
{456={id:456, name:faaewfgwaiaef}, 234={id:234, name:ateawgareg}, 123={id:123, name:aiueo}}
```
Laravelでchunkする際の注意点

以前、Laravelで大量データをgetする場合はchunkを、と投稿しました。

http://qiita.com/aooni_kun/items/097ea203b9e60bdf2a3f

ですが、注意点があります。

例えば結果が100件のBuilderに対して10件ずつのchunkを発行した場合、
最初の1-10件についてクロージャが実行された後、
次は10件をスキップして10件を取得(つまり11-20)、
その次は20件をスキップして10件を取得(つまり21-30)...

以上を逐次で取得した結果が0になるまで繰り返すというものです。

ですので、例えばクロージャ内で対象モデルのデータに更新を行い、
当初の条件と総数が異なるケースでは、
想定した動作とは異なる可能性が出てきます。

例えば、

```php
//現在日時は2015/11/11　00:00:00
Person::where('updated_at', '<', '2015/11/10')
	->chunk(10, function ($persons) {
		$persons->each(
			function ($person) {
				$person->touch();
			}
		);
	});
```

上記だと、どんどん対象データが減っていくので、
結果として更新されないデータが出てきます。

ですのでこのような場合は、一旦primary idのみgetで一括取得して変数に保持しておき、
その後1件ずつ処理するようなパターンが考えられるでしょうか。

それから、上記chunkの例にはまだ問題があります。
それは、確実なソート順を設定しておかないと、
取得するタイミングによっては結果セットの並び順が変わってしまう可能性がある為です。

従いまして、chunkを利用する際にはorderBy(`id`)のように
プライマリーキーを指定するということが必要になるでしょう。
※プライマリーキーがUUIDなどの場合、別途ソート順を考える必要もあるでしょうが。
CentOS 7 の利用を真剣に考える

# CentOS 7

## Package management
当面はyumを使い続けられるがdnfに移行しつつある事を考えると
この段階からdnfに慣れておいた方が良いと思われる。

dnfについては下記を参考にするとわかりやすい
　http://qiita.com/yunano/items/eedd3da40d67394881a2

## Daemon management
　CentOS7になってinitスクリプトと呼ばれる物がなくなった。
代わりにsystemctlコマンドを使え、となっている。

## Where are init scripts ?
　/usr/lib/systemd/system/ 以下にある。
例えば、apacheであれば以下のような感じだ。
<pre>
　/usr/lib/systemd/system/httpd.service
</pre>

## How to add new daemon
DockerのMakefile(2) ライブラリ

# Docker Makefileのライブラリ化
[以前](http://qiita.com/takara@github/items/a0a295d265ab5ff43ddc)```Makefile```の記事を書きましたが、便利は便利なのですがつかっていると困ったことが出てきます。
いくつか環境構築していくと```Makefile```をコピーしていきます。そして環境単位で```Makefile```を改善すると機能があったりなかったりと最新もどれだかという事態に。
そういうわけで```Make```の機能で```include```文を利用してもうほとんど書き換えない共通部分を切り出します。

## 共通のdocker.mk
 ```make```にもインクルードパスがあるようで、     ```/usr/local/include/```パスのファイルを探してくれるようです。
```root```権限があるならばここにパスを指定せずにインクルードできるので置くならここが良いでしょう。
権限がない場合は、ホームディレクトリに場所を決め、インクルード時にパスを指定してあげるようにするといいですね。

```basemake:/usr/local/include/docker.mk
all_container=`docker ps -a -q`
active_container=`docker ps -q`
images=`docker images | awk '/^<none>/ { print $$3 }'`
attach_cmd?=/bin/bash --login

all:

build:
	docker build -t $(NAME):$(VERSION) .

restart: stop start

start:
	docker run -d \
		--name $(NAME) \
		-h $(NAME) \
		$(DOCKER_RUN_OPTIONS) $(NAME):$(VERSION)

stop:
	docker rm -f $(NAME)

logs:
	docker logs $(NAME)

attach:
	docker exec -it $(NAME) $(attach_cmd)

tag:
	docker tag $(NAME):$(VERSION) $(NAME):latest

clean: clean_container clean_images

clean_images:
	@if [ "$(images)" != "" ] ; then \
		docker rmi $(images); \
	fi

clean_container:
	@for a in $(all_container) ; do \
		for b in $(active_container) ; do \
			if [ "$${a}" = "$${b}" ] ; then \
				continue 2; \
			fi; \
		done; \
		docker rm $${a}; \
	done
```

## 前回からの改善点
```docker run```時に```bash```を指定するのをやめました。```Dockerfile```の```CMD```で指定するようにしました。
```clean```の変更、現在動いていないコンテナを削除するようにしました。（ここは今後も改善していく）

## 呼び出し方
以下```Makefile```からの呼び出し例です。
```NAME```：コンテナ、イメージ名に使用されます。
```VERSION```:イメージのTAGに使用されます。
```DOCKER_RUN_OPTIONS```:```docker run```のオプションに追加されます。

ファイルを```/usr/local/include```に置いた場合は以下のようにファイル名だけでＯＫです。
個人の場所に置いたなら```include $(HOME)/.docker/docker.mk```のように書きます。

```basemake:Makefile
NAME=gitlab
VERSION=7.9-20151030
DOCKER_RUN_OPTIONS=\
	--add-host=gitlab:172.17.240.1 \
	--privileged

include docker.mk
```

## 使用方法

ファイル```Dockerfile```と```Makefile```を同じパスに置きます。

### イメージ構築

```text
$ make build
```

### コンテナ起動

```text
$ make start
```

### コンテナ停止

```text
$ make stop
```

### コンテナ再起動

```text
$ make restart
```

### コンテナ内操作

```text
$ make attach
```
### 不要イメージ、コンテナ削除

```text
$ make clean
```

# 参考サイト
+ [Makefile - OS Project Wiki](http://www.wiki.os-project.jp/Index.php?Makefile)
Raspberrypi2のRaspbian or CentOSインストール手順とssh接続(Mac使用)


いくつか関係のある記事があったけど，自分の備忘録として
結構つまづいたので，同じような人の参考になれば幸いです．

最初はRaspbian入れたけど，やっぱりCentOSがいいなと思って変えたので，
Raspbianをいれる場合とCentOSをいれる場合どっちもかく．

## Macでの作業
ざっくり言うと，SDカードになんとかしてOSをおとす作業

`*`はどっちかを選択

### *Raspbian-jessieを落とす
[北陸先端大のサイト](http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian/images/raspbian-2015-09-28/)からzipを落とす．

[ダウンロード](http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian/images/raspbian-2015-09-28/2015-09-24-raspbian-jessie.zip)(ここ押せばダウンロードはじまる)

結構時間かかるので次のステップをやっておくと，少しばかり効率がいいかもしれない．

### *CentOSを落とす．
[ダウンロード](http://people.centos.org/hughesjr/armv7hl/rpi2/images/rpi2-centos-image.img.xz)(押したらダウンロードされます．)



### SDカードをunmount
まずは，`diskutil list`コマンドで確認．

```
$ diskutil list
/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *251.0 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:          Apple_CoreStorage Macintosh HD            250.1 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
/dev/disk1 (internal, virtual):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:                  Apple_HFS Macintosh HD           +249.8 GB   disk1
                                 Logical Volume on disk0s2
                                 538D0B7C-5A03-48A8-A7D1-8A969DA8B2A2
                                 Unencrypted
/dev/disk2 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *31.9 GB    disk2
```

そっから対象をunmount

`diskutil unmountDisk /dev/disk2`

### zipを解凍
zipのダウンロードが終わり次第解凍します．

macのデフォルトの解凍方法だとうまいこと解凍できなかった．
なので以下のコマンドで解凍するといいと思います．

#### Raspbianを落としてきた場合

`tar xvf 2015-09-24-raspbian-jessie.zip`

#### CentOSを落としてきた場合

`unxz rpi2-centos-image.img.xz`

### SDファイルに書き込む
`sudo dd bs=1m if=解凍されたイメージ.img of=/dev/disk2`

めっちゃ時間かかる(時間は飲み会にいったため不詳w)

とりあえずこの作業まででMacでの作業は終了

## Raspberrypiでの作業
SDカードを本体に挿してスタート
最初はHDMIでTVとつないで，あとはUSBでキーボードつないでやった．
(たまたま家にあってよかった)

### Raspbian
充電さしたら起動
最初からssh接続できる．

デフォルトのidとpassは以下

|id|pass|
|:--:|:---:|
|pi|raspberry|

あとはsshでつないでいろいろすればいいと思う．

### CentOS
電源さしたら起動

最初はsshできないので，直接設定する必要がある．
デフォルトのキーボード設定がUSなので注意．
対応表は[USキーボードと日本のキーボードの違い](http://www.nagasaki-gaigo.ac.jp/toguchi/pc/multilingual/keyboard_us_jis.htm)を参考にしました．
viとかめっちゃやりずらくてストレスだった．
この問題はssh接続が可能になれば解消される．

sshの設定は `/etc/security/access.conf`を編集すればいい．

特にユーザとか足さない場合は `+ : root : ALL`を足しとけばいいと思う．
*rootログインを許可するのはあまりよろしくないので`useradd`しとくのが無難だと思います．*



## 参考ページ
[RaspberryPi2 ModelB 覚え書き](http://qiita.com/ftakao2007/items/238678069d7604086381)
[Mac で Raspbian Jessie を MicroSD に書き込んだ](http://qiita.com/ikai/items/f7f2f31a00cd2279f963)
[Raspberry Pi開封から無線LAN経由でSSH接続して初期設定するまでのマイ・ウェイ（モニタ・キーボード無し）](http://qiita.com/morizotter/items/48ad0b17207b0dd66cac)
[[RaspberryPI2] CentOSイメージが配布されてた](http://qiita.com/pb_tmz08/items/1bfa508ad80471442d5c)
R-CNNとしてSelective search を使ってみた

こんにちは。
最近の人工知能ブームは留まることを知らず、
日常でも多くの人工知能関連のニュースを目にするようになって来ました。
東京大学入学を目指す[東ロボくん](http://21robot.org/)はセンター試験模試で「偏差値57.8」を記録したそうです。私が受験をしたのはだいぶ昔になりますが、代わりにセンター試験を受けてほしかったです（笑）
また、あの有名な[イーロン・マスク](https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%BC%E3%83%AD%E3%83%B3%E3%83%BB%E3%83%9E%E3%82%B9%E3%82%AF)は「AIは悪魔を呼び出すようなもので、特に軍事利用については規制が必要」と語っています。AIが悪魔かどうかは置いておいて、軍事利用については最もな意見だと思います。
なんとか、新しいテクノロジーを戦争のためではなく有効に利用してほしいものです。
まぁもっとも、個人的にはもっと人間らしいAIが誕生するのはもう少し先になると思っていますが、どうなるでしょうか。

#概要
さて、前回R-CNNとしてBING(Objectness)を使ってみましたが、
今回は最近話題になっているSelective Searchを使ってみたいと思います。
R-CNNやBINGについては[前回の記事](http://qiita.com/Almond/items/ad56ce29112d6397a704)を参照してください。

#Selective Searchとは
ピクセルレベルで類似する領域をグルーピングしていくことで候補領域を選出するルゴリズムです。要は似たような特徴を持つ領域を結合していき、１つのオブジェクトとして抽出する訳です。

![SelectiveSearch.jpeg](https://qiita-image-store.s3.amazonaws.com/0/99765/23426c67-96a2-1555-d097-8fc5eac99952.jpeg)


#手順
今回は[Alpaca](http://blog-jp.alpaca.ai/entry/2015/08/05/235408)さんのライブラリを使用させていただきました。
試した環境：Windows7(64bit), Python2.7
ライブラリのインストールは「pip install selectivesearch」で行います。

#結果
前回と同じように空港画像の結果です。（※検出した領域すべてを表示すると良く分からないため、検出したオブジェクトの中でサイズを限定して描画しています）
![figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/99765/75663105-c124-8d3f-db00-a274b5d08fe3.png)

割りとオブジェクトっぽいところを検出していますね。
次に交差点画像の結果です。
![figure_2.png](https://qiita-image-store.s3.amazonaws.com/0/99765/45cdbf44-b6b7-2b13-792d-3d47281b55b0.png)

うーん、ちょっと画像が複雑過ぎたのでしょうか。またはパラメータの問題でしょうか？

#まとめ
BINGと比べてると高精度な検出をしている感じです。
しかし、Selective Searchには処理が遅いという致命的な弱点があります。（私の環境では20～30秒かかっていしまいました）※あくまで今回使用したライブラリの所感です。他のライブラリは試していないため分かりません。
最も処理速度の問題は、GPUの並列処理等で改善するのかもしれません。今後の展開に期待しています。
**=どなたかSelective Searchの高速化や高精度化の方法を教えて下さい=**
技術英語 > false impressions > some of the content of those emails can be, ... and used to create [false impressions] about what was going on. 

@ LOE > June 8, 2012

http://loe.org/shows/shows.html?programID=12-P13-00023
> some of the content of those emails can be, again, taken out of appropriate context and used to create <font color=red>false impressions</font> about what was going on. 

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

http://eow.alc.co.jp/search?q=misleading&ref=sa
> misleading
CentOS７でのFireWall設定

CentOS7の環境をVagrantで作成し、その上でRailsを動作させる環境を構築する際にCentOS7のファイヤウォール設定のところでハマりました。

CentOS7ではデフォルトでiptablesが設定されているわけではなく、ファイヤウォールが設定されているので、vagrantで3000番のポートを指定しておいても最初ブラウザで表示されませんでした。

>参考
http://stackoverflow.com/questions/24756240/how-can-i-use-iptables-on-centos-7

CentOS7ではデフォルトではiptablesではなくsystemctl firewallでファイヤウォールを設定するらしい。
なので、とりあえずファイヤウォールをStopさせてみたら、3000番でブラウザ表示されました。

```
systemctl mask firewalld
systemctl enable iptables
systemctl enable ip6tables
systemctl stop firewalld
systemctl start iptables
systemctl start ip6tables
```

最初からiptablesがある訳では無いんですね。。。
Android 6.0 Changes - Text Selection


なんちゃって和訳。内容未検証

http://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-text-selection

- コピペのメニューに独自のアクションを追加できるようになった
- contextual action modeを使う場合と同じ感じで実装できる。

新しいテキスト選択ツールバーを使うには、既存実装を次の通りに直します。（訳注：多分、すでにActionModeを自前で弄っている場合の話）

1. ViewやActivityの、`startActionMode(Callback)`を`startActionMode(Callback, ActionMode.TYPE_FLOATING)`に変える
2. `ActionMode.Callback`を`ActionMode.Callback2`に
3. `onGetContentRect()`をオーバーライドして、viewの座標`Rect`オブジェクトを設定する？  
   （Override the onGetContentRect() method to provide the coordinates of the content Rect object (such as a text selection rectangle) in the view.）
4. 選択状態じゃなかったら`invalidateContentRect()`を呼ぶ？  
   （If the rectangle positioning is no longer valid, and this is the only element to be invalidated, call the invalidateContentRect() method.）

サポートライブラリのrev22.2を使っている場合、新しいツールバーは下位互換性がないので注意してください。デフォルトでは、`appcompat`が`ActionMode`オブジェクトのコントロールをします。新しいツールバーは表示されません。

`AppCompatActivity`で`ActionMode`サポートを有効にするには、`getDelegate()`の戻り値の`AppCompatDelegate`の`setHandleNativeActionModesEnabled()`に`false`を設定します。
これにより`ActionMode`オブジェクトのコントロールがフレームワークに返されます。

これにより、Android 6.0(APIレベル23)の端末では、フレームワークが`ActionBar`または新しいツールバーを許可し、Android 5.1(APIレベル22)以下の端末では`ActionBar`のみがサポートされます。

----

その他に[PROCESS_TEXT](http://developer.android.com/reference/android/content/Intent.html#ACTION_PROCESS_TEXT)というACTIONが増えた。マッシュルームみたいにテキストの処理を外部アプリ投げる仕組みっぽい。

Android Developers Blogでは選択したテキストをGoogle翻訳アプリに翻訳させるのを例に挙げている。
これは既にAndroid 6.0ユーザーなら使える。EditTextがあるアプリで適等に文章を入力して選択すると、選択ツールバーのオーバーフローメニューに「翻訳」と出る。

- In-app translations in Android Marshmallow | Android Developers Blog  
  http://android-developers.blogspot.jp/2015/10/in-app-translations-in-android.html
Laravelのデフォルトログイン処理でエラーメッセージを日本語にしたい

Laravel5を使っていて、デフォルトのログイン処理を使ってみたとき日本語化するに躓いたのでメモ
###まず準備
本題じゃないのでだいぶ省略しますが
https://github.com/laravel/laravel
ここからapp/Http/routes.phpやresources/views/配下を拝借すればこんな感じになりますね。

![スクリーンショット 2015-11-17 1.43.28.png](https://qiita-image-store.s3.amazonaws.com/0/16603/0e279c8d-3b69-2ec7-17d5-a1bfefdfdf72.png)

このLoginボタンを押下すると
app/Http/Controllers/Auth/AuthControllerのpostLoginアクションが呼ばれます。

デフォルトではuseしているAuthenticatesAndRegistersUsersトレイトが
postLoginアクションを実装しているので、何も書かなくてもバリデーションしたり認証したり、連続失敗時にしばらくログイン不可にするとかやってくれるようになります。

###よし日本語化だ
ここまで分かったらviewはオリジナルなデザインに変えればよくって、
キレイに言語ファイルで変更したい場合はresources/lang/enをコピーしてjaを作り、config/app.phpにてロケールを指定します。

```config/app.php
    'locale' => 'ja',
```

がしかし、単純にそれだけでは下図のように「The email field is required.」や「The password field is required.」は変わらないんですね。

![スクリーンショット 2015-11-17 1.56.13.png](https://qiita-image-store.s3.amazonaws.com/0/16603/cf04bf76-5ac9-1a35-58a8-cbee54da6a48.png)


そうなんす。これってpostLoginアクション内で呼ばれているバリデーション処理が動的に組み立ててるメッセージなもんで
emailとかpasswordとかってテキストフォームのnameをそのまま使ってるし、、
最初は「もしかしてこれって変更したい場合は自前でログイン処理書けってことなのかー」って思ったりしました。

###ちゃんと変更する方法あった。
resources/lang/ja/validation.php(enからjaにコピーしたやつ)内のcustomで指定した場合はそのメッセージが優先されるようになってた。
というわけで
    
```resources/lang/ja/validation.php
    /*
    |--------------------------------------------------------------------------
    | Custom Validation Language Lines
    |--------------------------------------------------------------------------
    |
    | Here you may specify custom validation messages for attributes using the
    | convention "attribute.rule" to name the lines. This makes it quick to
    | specify a specific custom language line for a given attribute rule.
    |
    */

    'custom' => [
        'attribute-name' => [
            'rule-name' => 'custom-message',
        ],
        'email' => [
            'required' => 'メールアドレスを入力してください',
        ],
        'password' => [
            'required' => 'パスワードを入力してください',
        ],
```

![スクリーンショット 2015-11-17 1.58.15.png](https://qiita-image-store.s3.amazonaws.com/0/16603/c46a1c64-bd2f-0d36-a100-ee8fb754563a.png)


ふー 分かってしまえばどうってことなかった
（よくみたら英語で丁寧に説明書いてあるじゃんね。なんなら例まであるし）


###もう少しDRYに（追記）
同僚に教えてもらったので追記します。
下記のように:attributeを使うことでパラメータ名も切り出す事が出来ました。めもめも

```resources/lang/ja/validation.php

    'custom' => [
        'attribute-name' => [
            'rule-name' => 'custom-message',
        ],
        'email' => [
            'required' => ':attributeを入力してください',
        ],
        'password' => [
            'required' => ':attributeを入力してください',
        ],

    /*
    |--------------------------------------------------------------------------
    | Custom Validation Attributes
    |--------------------------------------------------------------------------
    |
    | The following language lines are used to swap attribute place-holders
    | with something more reader friendly such as E-Mail Address instead
    | of "email". This simply helps us make messages a little cleaner.
    |
    */

    'attributes' => [
        'email' => 'メールアドレス',
        'password' => 'パスワード',
    ],
```
Python と IRKit で家電を操作する


Pythonの勉強がてらIRKitのAPIをたたいて家電を操作してみる。
IRKitそのものと、API仕様などは、下記参照。
簡単に言うとリモコンの赤外線を覚えてくれて、それをネット越しに叩けるようにするデバイス。

http://getirkit.com/

### 概要

![ca3258ff-0d29-d8f6-1ddf-568b3ca4aa02.png](https://qiita-image-store.s3.amazonaws.com/0/18743/3832ffdf-fa3e-d7e9-5813-51e5b460bc22.png "ca3258ff-0d29-d8f6-1ddf-568b3ca4aa02.png")



### コード


```python
#!/usr/bin/env python
# coding: utf-8

import requests
import json


class IrkitInternetAPI:
    endpoint = "https://api.getirkit.com/1"
    clientkey = ""
    deviceid = ""

    def __init__(self, clientkey, deviceid):
        self.clientkey = clientkey
        self.deviceid = deviceid

    def get_messages(self):
        params = {
            'clientkey': self.clientkey,
        }

        headers = {'X-Requested-With': "irkit-python"}
        url = self.endpoint + "/messages"

        r = requests.get(url, headers=headers, params=params)

        if r.status_code == 200:
            return r.json()

    def post_messages(self, data):
        message = {
            "format": "raw",
            "freq": 38,
            "data": data
        }
        message = json.dumps(message)

        params = {
            'clientkey': self.clientkey,
            'deviceid': self.deviceid,
            'message': message
        }

        url = self.endpoint + "/messages"
        headers = {'X-Requested-With': "irkit-python"}
        r = requests.post(url, headers=headers, params=params)


def main():
    clientkey = "your_clientkey"
    deviceid = "your_deviceid"

    irkit = IrkitInternetAPI(clientkey, deviceid)

	# 直近の 赤外線信号を取得（すぐ消えるので、直前にIRKitに向けてリモコンをピってやる）
    messages = irkit.get_messages()
    data = messages['message']['data']

    # それをそのまま再度呼び出し
    irkit.post_messages(data)


if __name__ == '__main__':
    main()
```

とりあえず、電気がついたり、消えたりした。
プログラムから家電が操れるのは面白い！

curl で叩けばこんなにコード書かなくても済むけど、今回は練習ということで。

## 参考

* https://github.com/shokai/ruby-irkit
[Neo4J]　 ⑥ 組み込みサーバーモードでCypherを実行

Scalaで学習している特典(?)として、先人の取り組みを参考に、組み込みサーバーモードでNeo4Jを立ち上げ、内部からCypherを実行してみた。要するに、これだけ:
https://github.com/kmry/neo4j-embedded

Neo4Jのクエリ言語Cypherをコードで追いかけたい人向けに、書捨てコードをさらしておく
(参考 : http://www.creationline.com/lab/7685)。

```scala
package ex1
import org.neo4j.graphdb.factory._
import org.neo4j.graphdb.{DynamicRelationshipType, GraphDatabaseService, Node}
import org.neo4j.cypher.ExecutionEngine

object App {
  val db: GraphDatabaseService = new GraphDatabaseFactory().newEmbeddedDatabase("tmp/neo_yours");
  val engine: ExecutionEngine = new ExecutionEngine(db)

  val cyphers= Array(
    """CREATE (movie:Movie { title:"The Matrix",released:1997 })""",
    """CREATE (movie:Movie { title:"The Matrix",revised:2003 })""",
    """
    MATCH (movie:Movie { title:"The Matrix"})
    RETURN movie
    """,
    """
    MATCH (movie:Movie {title:"The Matrix"})
    SET movie.japanese="マトリックス"
    RETURN movie.title, movie.japanese, movie.released
    """,
    """ MATCH (movie:Movie { title:"The Matrix"}) RETURN movie"""
  )

  def op ={
    val ns = Stream.from(1).iterator //counter
    cyphers.foreach{ c =>
      println (s"コマンド${ns.next} :")
      println (engine.execute(c).dumpToString())
    }
  }
  def main(args: Array[String]): Unit = {
    println("db running")
    op
    db.shutdown()
    println("db shutdown")
  }

}
```

実行結果はこんな感じ。

```
$ sbt run
[info] Set current project to neo4j-emb-scala-cypher (in build file:/neo4j-embedded/)
[info] Compiling 1 Scala source to /neo4j-embedded/target/scala-2.11/classes...
[warn] there was one deprecation warning; re-run with -deprecation for details
[warn] one warning found
[info] Running ex1.App 
db running
コマンド1 :
+-------------------+
| No data returned. |
+-------------------+
Nodes created: 1
Properties set: 2
Labels added: 1

コマンド2 :
+-------------------+
| No data returned. |
+-------------------+
Nodes created: 1
Properties set: 2
Labels added: 1

コマンド3 :
+-------------------------------------------+
| movie                                     |
+-------------------------------------------+
| Node[0]{title:"The Matrix",released:1997} |
| Node[1]{title:"The Matrix",revised:2003}  |
+-------------------------------------------+
2 rows

コマンド4 :
+------------------------------------------------+
| movie.title  | movie.japanese | movie.released |
+------------------------------------------------+
| "The Matrix" | "マトリックス"       | 1997           |
| "The Matrix" | "マトリックス"       | <null>         |
+------------------------------------------------+
2 rows
Properties set: 2

コマンド5 :
+-------------------------------------------------------------+
| movie                                                       |
+-------------------------------------------------------------+
| Node[0]{japanese:"マトリックス",title:"The Matrix",released:1997} |
| Node[1]{japanese:"マトリックス",title:"The Matrix",revised:2003}  |
+-------------------------------------------------------------+
2 rows

db shutdown
[success] Total time: 13 s, completed 2015/11/17 1:38:28
```

Enjoy ;)
vagrant box作成方法 メモ

「公式：http://www.vagrantbox.es/」

参考
http://te2u.hatenablog.jp/entry/2014/05/11/181841

# box対策
default: Warning: Connection timeout. Retrying...
default: Warning: Authentication failure. Retrying...
default: Warning: Authentication failure. Retrying...
default: Warning: Authentication failure. Retrying...

```
wget https://raw.githubusercontent.com/mitchellh/vagrant/master/keys/vagrant.pub -O .ssh/authorized_keys
```
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!

ARPCHECK=no /sbin/ifup eth1 2> /dev/null

Stdout from the command:

Device eth1 does not seem to be present, delaying initialization.


Stderr from the command:


```
sudo ln -s -f /dev/null /etc/udev/rules.d/70-persistent-net.rules
```


# ホスト側(windows)作業

```
vagrant box add vagrant-centos-6.7 https://github.com/CommanderK5/packer-centos-template/releases/download/0.6.7/vagrant-centos-6.7.box
vagrant init vagrant-centos-6.7
```

## Vagrantfile編集
下の2行のコメントアウトを外す

```
  # config.vm.network "forwarded_port", guest: 80, host: 8080
  # config.vm.network "private_network", ip: "192.168.33.10"
```

```vagrant_rename_Vagrantfile.vbs
Dim MyFile 
Dim myRec
Dim FS

Dim VAGRANTFILE_DIR

Dim before_A
Dim after_A

Dim before_B
Dim after_B

Set objWshShell = CreateObject("WScript.Shell")

VAGRANTFILE_DIR = objWshShell.CurrentDirectory & "\Vagrantfile"

Set FS = CreateObject("Scripting.FileSystemObject")
Set MyFile = FS.OpenTextFile(VAGRANTFILE_DIR)
'テキストデータ読込
myRec = MyFile.ReadAll
'msgbox myRec
'テキスト変換
myRec = replace(myRec,"# config.vm.network ""forwarded_port"", guest: 80, host: 8080","config.vm.network ""forwarded_port"", guest: 80, host: 8080")
myRec = replace(myRec,"# config.vm.network ""private_network"", ip: ""192.168.33.10""", "config.vm.network ""private_network"", ip: ""192.168.33.10""")
'msgbox myRec
MyFile.Close

'書き込み
Set MyFile = FS.CreateTextFile(VAGRANTFILE_DIR)
MyFile.WriteLine (myRec)
MyFile.Close
```


## vagrant-vbguest 設定
```
vagrant up
```

```
vagrant plugin install vagrant-vbguest & vagrant vbguest --status
```


# クライアント側(linux)作業


```
sudo yum -y install update kernel-devel kernel-headers gcc gcc-c++ > LOG_Guest_Additions.txt; sudo reboot
```


ホスト側(windows)作業 vagrant-vbguestの設定確認

```
vagrant reload
```

rootで実行

```
touch setup_vagrant.sh; chmod u+x setup_vagrant.sh; vi setup_vagrant.sh
```

```
yum -y update

# eth0の有効化
sed -i.bak -e 's:^ONBOOT=.*$:ONBOOT="yes":' /etc/sysconfig/network-scripts/ifcfg-eth0

# sudoの設定
sed -i 's/Defaults.*requiretty/#Default\trequiretty/g' /etc/sudoers
sed -i 's/^#\s%wheel\s*ALL=(ALL)\s*ALL$/%wheel\tALL=(ALL)\tALL/g' /etc/sudoers
sed -i 's/^#\s%wheel\s*ALL=(ALL)\s*NOPASSWD: ALL$/vagrant\tALL=(ALL)\tNOPASSWD: ALL/g' /etc/sudoers

# udev/rulesの削除
rm /etc/udev/rules.d/70-persistent-net.rules
rm -rf /dev/.udev/
rm /lib/udev/rules.d/75-persistent-net-generator.rules

yum install -y git

# Development Toolsのインストール
yum groupinstall -y "Development Tools"
```

box package化

```
vagrant package

vagrant box add kurobox package.box
vagrant init kurobox
vagrant up
```
Docker コンテナの中で、Ctrl-p を二回押さないと使えない

# 経緯 ~コンテナの中で暮らしたい~

Docker コンテナの中で開発生活をおくろうかとと思って、コンテナにログインしていろいろ設定しようとしたら、**どうも `Ctrl-p` が二回押さないと効かない。** つらい。

# 原因 ~デタッチショートカットのせい~

調べると

`Ctrl-p` `Ctrl-q` でデタッチするショートカットキーになっているからみたい。
一度 `Ctrl-p` を押すと次の入力待ちになるから、二回押す必要があるかも。


# 解決策? ~待ってればできるかも~

いろいろググると以下の PR に行き当たり、そのうちキーバインドを設定できるようになるかも。

この Issue は close しちゃってるけど
[Allow ctrl-p ctrl-q customization](https://github.com/docker/docker/pull/6460)

こっちで、設定できるようになるのでは。
[Implement configurable escape key for attach/exec](https://github.com/docker/docker/pull/15666)

こうすればできるよ、みたいのあれば教えて下さい!

# 追記 : 解決

http://qiita.com/takahiroki/items/60ec916383025160fbb8#_reference-a2d9244a6c4496f4df05

解決されたようです。
drone.io v0.4のビルド&実行方法(OSX)

v0.3からv0.4にバージョンが上がってガラッと仕様が変わり、ビルド手順も

[OSS版 drone.io をソースからビルドする (CentOS 7) - Qiita](http://qiita.com/sonots/items/d0d7d0c600a77d5d6877)

に書かれた方法から変わったので書いておく。

## golangがインストールされた環境下でのビルド&実行手順

### 事前

sassc(Sassのコンパイラ)がインストールされていなければインストールする。

```
brew install sassc
```

(※ 参考 : [sass/sassc · GitHub](https://github.com/sass/sassc))

### ビルド手順

あとは公式に書かれた通りでOK.
droneというバイナリファイルが生成される。
(引用元: https://github.com/drone/drone#from-source )

```
# GOPATH以下にclone
git clone git://github.com/drone/drone.git $GOPATH/src/github.com/drone/drone
cd $GOPATH/src/github.com/drone/drone

# ビルド
export GO15VENDOREXPERIMENT=1
make deps    # Download required dependencies
make gen     # Generate code
make build   # Build the binary
```

### 実行

環境変数にgitリポジトリの設定をセットすれば実行できる。

e.g. GitHubの場合
http://readme.drone.io/setup/github.html

```
# 必要な設定を環境変数にセット
export REMOTE_DRIVER=github
export REMOTE_CONFIG=https://github.com?client_id=${client_id}&client_secret=${client_secret}

# 実行
./drone
```

## staticビルド & Dockerイメージビルド & 実行

### staticビルド

上記のビルド方法だと一部依存モジュールがdynamic linkされてビルドされるので、公式のDockerfileに書かれているようなbashすら入っていないすっからかんのscratchイメージ内で動かすには `-extldflags "-static"` オプションを付けてビルドする必要がある。(※ 正直この辺キチンとわかってない... 参考: http://k2nr.me/blog/2014/12/09/create-small-image-for-docker.html )

Makefileをの中にbuild_staticってオプションがあり、上記オプションをつけた状態でビルドできるのでそれを利用すればOK
だが、OSXだと以下の様なエラーが出て失敗するので、golangの入ったlinux系イメージ内でビルド実行する必要あり。



```
# github.com/drone/drone
/usr/local/Cellar/go/1.5.1/libexec/pkg/tool/darwin_amd64/link: runing clang failed: exit status 1
ld: library not found for -lcrt0.o
clang: error: linker command failed with exit code 1 (use -v to see invocation)

make: *** [build_static] Error 2
```

droneの開発をdroneでCIするために[drone/golang](https://hub.docker.com/r/drone/golang/)というgolangとsasscのインストールされたイメージが用意されているのでそれを利用する。タグは1.5を指定。droneリポジトリ内にDockerfile.envというファイルがあるのでそこから独自にイメージを作っても良い。

```
# 任意の場所でclone
git clone git://github.com/drone/drone.git
cd ./drone

# ビルド
docker run -it \
  -v $(pwd):/go/src/github.com/drone/drone \
  -e GO15VENDOREXPERIMENT=1 \
  --rm \
  drone/golang:1.5 \
  bash -c 'cd /go/src/github.com/drone/drone; make deps gen build_static'
```

drone_staticというバイナリファイルが生成されればOK

### Dockerイメージビルド

droneのリポジトリにDockerfileがあるのでそれを利用する。

```
# docker build
cd /path/to/drone
docker build --rm=true -t drone/drone .

# イメージが作成されたことを確認
docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
jsoizo/drone           latest              3256d43361e3        8 minutes ago       21.57 MB
```

### 実行

ビルドしたdockerイメージをバックグランドで動かす。
droneはデフォルトで/var/lib/drone以下にsqliteファイルを生成するので永続化のためにマウントする。DOCKER_HOSTは指定するか、dockerがインストールされているのであれば `-v /var/run/docker.sock:/var/run/docker.sock` しても良い。

```
docker run \
  -v /var/lib/drone:/var/lib/drone \
  -e DOCKER_HOST=$DOKCER_HOST \
  -e REMOTE_DRIVER=github \
  -e REMOTE_CONFIG="REMOTE_CONFIG=https://github.com?client_id=${client_id}&client_secret=${client_secret}" \
  -p 8000:8000 \
  --restart=always \
  --detach=true \
  --name=drone \
  jsoizo/drone
```
【しずおかアプリ部】活動ログ　第11回

![しずおかアプリ部2.jpg](https://qiita-image-store.s3.amazonaws.com/0/88105/55b341c7-ccc5-fd3f-82bb-fed045a76f3c.jpeg)

■タイトル
第１１回


■開催日
２０１５年１１月１４日（土）　１６：００～１８：００


■参加者
６名


■活動内容（概要）
・菅原プレゼン「Unityはじめるよ　～すごいよサウンド機能　基礎編～」
・部員さんプレゼン「Arduino入門 ～センサとUnityをつないで遊んでみよう～」
　「第0回 Arduino紹介編」
　「第1回 Arduinoはじめます編」 
・保坂プレゼン「Cocos2d-xで作る物理演算ゲーム　～とりあえず体裁を整えよう編～」

<HR>

■活動内容（詳細）

・「Unityはじめるよ　～すごいよサウンド機能　基礎編」

　Unity4でのサウンド(オーディオ)機能のおさらい。
　Unity5で追加・強化された機能の紹介。
　主な内容
　　・バックグラウンドでの読み込み
　　　シーンをロードする際にオーディオのロードを含めない。
　　　シーンロード後にメインスレッドの速度を保ちつつ、順次オーディオのロードを行う。
　　　体感的なロード時間を減らせる効果が期待できる。
　　・オーディオミキサー
　　　グループ分けしたオーディオソースを一括で制御を行う機能。
　　・スナップショット
　　　オーディオミキサーの値を覚えて置き、
　　　簡単にオーディオミキサーの状態を切り替えることができる。

　資料：<A HREF="http://monolizm.com/sab/pdf/第11回_プレゼン資料(Unityはじめるよ　～すごいよサウンド機能～).pdf">第11回_プレゼン資料(Unityはじめるよ　～すごいよサウンド機能～).pdf</A>

<HR>


・「Arduino入門 ～センサとUnityをつないで遊んでみよう～」
　「第0回 Arduino紹介編」
　「第1回 Arduinoはじめます編」 

　・自己紹介

　・Arduinoやマイコンの紹介と解説
　　マイコンのとっつきにくさを解消するために、Arduinoが生まれた。
　　Arduinoを使うことで、簡単にハードウェアのコントロールが行えるようになる。
　　デメリットは、価格と大きさ（小型化や量産には向かない）

　・iPhoneとセンサを簡単に繋げられる「MESH」というアプリをソニーが開発。
　　SDKも公開されているので、自分のアプリにも組み込めるかも（未調査）

　・Arduinoで開発を行う方法の解説
　　IDEのインストールと利用方法を解説

　・ご当地キャラ「今川さん」のサウンドシステムの相談

　資料：<A HREF="http://monolizm.com/sab/pdf/第11回_プレゼン資料(自己紹介・Arduino入門).pdf">第11回_プレゼン資料(自己紹介・Arduino入門).pdf</A>

　　　：<A HREF="http://monolizm.com/sab/pdf/第11回_プレゼン資料(Arduino始めます編).pdf">第11回_プレゼン資料(Arduino始めます編).pdf</A>

　　　：<A HREF="http://monolizm.com/sab/pdf/第11回_プレゼン資料(加速度センサ).wmv">第11回_プレゼン資料(加速度センサ).wmv</A>

<HR>



・保坂プレゼン「Cocos2d-xで作る物理演算ゲーム　～とりあえず体裁を整えよう編～」

　体裁を整えるために、
　　・ソースの整理
　　・物理演算のパラメータの調整
　　・チキン画像の差し替え
　　・背景画像の適用
　を行い、一気にゲームらしくなった。
　

　プロジェクト一式：http://monolizm.com/sab/src/AngryChicken11.zip

　資料：<A HREF="http://monolizm.com/sab/pdf/第11回_プレゼン資料(Cocos2d-xで作る物理演算ゲーム　～とりあえず体裁を整えよう編～).pdf">第11回_プレゼン資料(Cocos2d-xで作る物理演算ゲーム　～とりあえず体裁を整えよう編～).pdf</A>