OmniAICreator/Qiita-1.07M huggingface dataset:
ログで遊ぶ

個人的メモ。

こんなことをしなくてもいい世界が理想。
下手に色々調査出来ちゃうと「それでいいじゃん」ってなってしまうのでよろしくないかもしれない。

## multilog編

### tai64n形式のタイムスタンプを戻しながら監視する

```bash
tail -F /var/log/test/main/current | tai64nlocal
```

### tai64n形式のタイムスタンプを戻しながら過去ログを掘る

```bash
tai64nlocal < /var/log/test/main/@4000000056de14e1323658e4.s | less
```

### lotateしたログを全検索してついでにタイムスタンプを戻す

```bash
grep -h search_word /var/log/test/main/* | tai64nlocal
```


### 日ごとのエラー件数を出してみる(例外指定版)

```bash
grep -h NullPointerException /var/log/test/error/* | tai64nlocal |  awk '{sum[$1] += 1}; END{ for (i in sum) {print i "," sum[i]}}' | sort -nr
```

### 日ごとのエラー件数を出してみる(全件)

```bash
cat /var/log/test/error/* | tai64nlocal |  awk '{sum[$1] += 1}; END{ for (i in sum) {print i "," sum[i]}}' | sort -nr
```

ぶっちゃけ検索しないならwc -l使った方がいいと思う。

```bash
wc -l  /var/log/test/error/*
```


## nginx(webサーバーアクセスログ)編

以下の設定を想定。

```nginx
log_format  main '"$remote_addr" - "$remote_user" $time_local $request "$status" "$body_bytes_sent" "$request_time" "$http_referer" "$http_user_agent" "$http_x_forwarded_for" cookie="$http_cookie"';
```

### ほどほどに見やすくログを見る

```bash
tail -F /var/log/nginx/access.log | awk '{print $4 "\t" $6 "\t" $9 "\t" $11 "\t" $10 "\t" $7}'
```

こんなログが出てくる。

```
08/Mar/2016:16:41:11   GET    200     "0.010" 5844    /assets/js/app.js
```

### 1分ごとのユニークなアクセスIP数を取る(多い時間順)

```bash
sed -e 's/:[0-9][0-9][\x20]+\+0900//g' -e 's/- - //g' /var/log/nginx/access.log | awk '{print $2, $1}' | sort | uniq | awk '{sum[$1] += 1}; END{ for (i in sum) {print i, sum[i]}}' | sort -nrk2
```

sedの2つめの-eから始めると秒単位で取れる(その際はログがいっぱい出るのでhead付けるなりファイルに移すこと)。

## オチ

I/Oが伴うデータのやり取りするときにbashから直接コマンドブッ叩くの超楽。

とはいえ、気が付いたら複雑怪奇なコマンドチェーンの処理の山が出来て後で誰もメンテナンス出来なくなるのでとっさの要件以外でこういうことはしないように気を付けたい。
TextViewで文字の色を部分的に変える話


## TextViewにはHTMLが使える

TextViewのtextには、一部のHTMLタグが使えるので、それを利用します。

```strings.xml
<resources>
    <string name="sample_text">文字列の&lt;font color=\"#00BBEE\"&gt;ここだけ&lt;/font&gt;色を変える&lt;br&gt;改行もbrタグを使う必要があるので注意</string>
</resources>
```

このとき改行は、\nではなく、&lt;br&gt;で行う必要があるのですが、つい\nを使ってしまって、改行してねーというミスをやりがちなので注意しましょう。

## コードで文字列を設定するとき

これをレイアウトリソースで使うときは、@string/sample_textで指定してやれば、そのまま使えるのですが、コード内で設定するときは一手間かかります。

```java
    textView.setText(getString(R.string.sample_text));
```
これだと、TextViewはHTMLであると解釈してくれないので、

```java
    textView.setText(Html.fromHtml(getString(R.string.sample_text)));
```

としてあげる必要があります。

## 動的に色を変える

getString()の第2引数移行を使って、文字列リソースに値を埋め込めるので、コードで色を変えたりすることもできます。

```strings.xml
<resources>
    <string name="sample_text">文字列の&lt;font color=\"#%1$s\"&gt;ここだけ&lt;/font&gt;色を変える&lt;br&gt;改行もbrタグを使う必要があるので注意</string>
</resources>
```

文字列リソースの方では、fontタグのcolor属性の部分を%1$sとして値を埋め込むようにしておきます。

```java
    String color = String.format("%08x", 出したい色);
    color = color.substring(2);
    textView.setText(Html.fromHtml(getString(R.string.sample_text, color));
```

コードで実際の色を埋め込んだ文字列を使用します。

Androidでは（Javaでは？）最上位の8bitをアルファ値として使用しているので、色の値を16進数の文字列にするとマットな色の場合、先頭にffがついて8文字になります。
HTMLとしては、アルファ値を含んだ色指定を想定していないので、先頭の2文字を切ってあげないとcolor属性が反映されません。ちょっとめんどくさいです。
RedmineのアカウントでSubversionリポジトリにアクセスする

新規のプロジェクトでSubversionが選択されるケースも少なっていそうだし、よくあるネタですがすこし躓いたので整理してメモっておきます。

ほとんどは[ここ](http://www.redmine.org/projects/redmine/wiki/Repositories_access_control_with_apache_mod_dav_svn_and_mod_perl)に書いてあります。

## 前提

* RedmineとSubversionが同一サーバ
* apacheのperl_module、dav_svn_module、authz_svn_moduleのモジュールが使えるようになっていること[^1]
* /var/www/svn以下がSubversionのリポジトリの置き場所

## ポイント

* プロジェクト識別子とリポジトリ名を一致させる
* プロジェクトメンバーのアカウントでのみアクセス可能

## subversion側の設定

### ディレクトリのアクセス権限

apacheユーザが読み書きできるようにします。

`chown -R apache:apache /var/www/svn`

SELinuxが有効な状態では下記が必要みたいです。

`chcon -R system_u:object_r:httpd_sys_content_t /var/www/svn`

### apacheの設定ファイル

apacheのconf.dにsubversion用の設定ファイルを追加します。
ここで/svnのアクセスに、Basic認証して、RedmineのDBを見に行くように設定します。

```subversion.conf

LoadModule perl_module        modules/mod_perl.so
PerlLoadModule Apache::Authn::Redmine

LoadModule dav_svn_module     modules/mod_dav_svn.so
LoadModule authz_svn_module   modules/mod_authz_svn.so

RequestHeader edit Destination ^https http early
<Location /svn>
   DAV svn
   SVNParentPath /var/www/svn　

   AuthType Basic
   AuthName "subversion repository"
   PerlAuthenHandler Apache::Authn::Redmine::authen_handler

   # RedmineのDBの接続情報
   RedmineDSN "DBI:mysql:database=redmine;host=localhost"
   RedmineDbUser "redmine"
   RedmineDbPass "redmine"

   Require valid-user
</Location>

```

## Redmineとの連携手順

あとは、Redmineのプロジェクトと連携できるように、プロジェクトとリポジトリを作成します。

1. プロジェクトを作成
2. プロジェクト識別子と同じ名前でリポジトリを作成
3. アクセスさせたいユーザをプロジェクトのメンバーに追加
4. http://[redmine_server]/svn/[project_identifier]でリポジトリにアクセスできることを確認

### 1. プロジェクトを作成

Redmineの画面から作ります。識別子をおぼえておきます。

### 2. プロジェクト識別子と同じ名前でリポジトリを作成

これがポイントです。ここを間違えてハマリました...

```
# cd /var/www/svn
# svnadmin create [project_identifier]
# chown -R apache:apache [project_identifier]
```

SELinuxが有効な状態では下記が必要なです。

`chcon -R system_u:object_r:httpd_sys_content_t [project_identifier]`

### 3. アクセスさせたいユーザをプロジェクトのメンバーに追加

プロジェクト識別子で認証対象を制限しているので、アクセスできるのはプロジェクトのメンバーに限定されます。プロジェクトの設定タブのメンバーから、追加します。

（これに気付くのに、わざわざSQLのログを出して確認してしまいましたよ...）

### 4. http://[redmine_server]/svn/[project_identifier]でリポジトリにアクセスできることを確認

ブラウザからアクセスしてもよいですし、

`svn ls "http://[redmine_server]/svn/[project_identifier]"` でも確認できます。

認証が要求されるので、プロジェクトメンバーのアカウント情報を入力して、アクセスできればOKです。

## 参考サイト

http://www.redmine.org/projects/redmine/wiki/Repositories_access_control_with_apache_mod_dav_svn_and_mod_perl

http://idlysphere.blog66.fc2.com/blog-entry-239.html

http://qiita.com/kota_na_/items/46faf25268953da5fd37

http://r1990297.hatenablog.com/entry/2013/11/20/093114

https://www.redmine.org/boards/2/topics/6387

https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Security-Enhanced_Linux/sect-Security-Enhanced_Linux-Working_with_SELinux-SELinux_Contexts_Labeling_Files.html

http://www.sera.desuyo.net/WebDAV/selinux.html

### CentOSへのapache+subversionの入れ方

* [7.x](https://www.howtoforge.com/how-to-install-svn-with-apache-dav_svn-on-centos-7)
* [6.x以前](https://wiki.centos.org/HowTos/Subversion)

[^1]: CentOSなら `yum install mod_perl mod_dav_svn subversion`
AndroidStudioでアプリをビルドしたときに「Plugin is too old, please update to a more recent version」エラーが出た時の対処法

# Problem

AndroidStudioでアプリをビルドしたときに、以下のエラーが発生する。

```
Error:(21, 0) Plugin is too old, please update to a more recent version, or set ANDROID_DAILY_OVERRIDE environment variable to "41b72d353033bfb5aa4d6a98088a908dcae15ef9"
```

# Solution

1 . ターミナルで、以下のコマンドを実行し環境変数を登録する
(OS Xアプリケーションに環境変数を渡すには、launchctlコマンドのsetenvオプションで設定します。アプリケーションの再起動後から設定が反映されます。)

```
$ launchctl setenv ANDROID_DAILY_OVERRIDE 41b72d353033bfb5aa4d6a98088a908dcae15ef9
```


2 . AndroidStudioを起動して、アプリをビルドする。


# 参考

- [Plugin is too old, please update to a more recent version, or set ANDROID_DAILY_OVERRIDE environment variable to](http://stackoverflow.com/questions/29063968/plugin-is-too-old-please-update-to-a-more-recent-version-or-set-android-daily)
- [OS XにおけるJavaアプリケーションのエンコーディング](http://piyopiyoducky.net/blog/2013/06/03/encoding-of-java-application-in-os-x/)
Poderosa便利な利用方法（メモ）

ターミナルエミュレータ -Poderosa- を利用するとき、便利な使い方をメモします。

####**便利なコピー・ペースト動作**
作業効率化、すごく便利なツール。
マウスで選択したら、自動的にコピーします。
右クリックしたら、コピーの文字列を貼り付けます。
![image](https://qiita-image-store.s3.amazonaws.com/0/26351/83382589-e084-0be7-6c45-167372864167.png)

　

####**保存した接続リストを多めに変更したい**
　方法
（1）「ツール」>「詳細プリファレンスエディタ」をクリックして
（2）フィルタに文字列「org.poderosa.usability.mru.limitCount」を探します。
（3）値の部分をダブルクリックし、数字を変更して保存します。
　　　*デフォルトに保存されている接続リストは、5つだけらしいです。

![image](https://qiita-image-store.s3.amazonaws.com/0/26351/0a26e91a-7138-f863-c5ff-b34cc22fa5c2.png)
参考：　http://synclogue-blog.com/poderosa/
<br/>

　

####**Poderosaで画面分割する**
同時に複数のターミナルを見たいとき便利です。
　方法1：画面下に白いバーの適当などころでクリックしたら、勝手に分割される。
　方法2：ツールバーの「ウィンドウ」をクリックして、上下・左右に分割する選択できます
![image](https://qiita-image-store.s3.amazonaws.com/0/26351/ace16731-eac4-2011-104a-1308bc82cf40.png)
<br/>


####**Poderosaで画面分割を結合する**
分割線の上でマウスのホイールボタンをクリックすれば、結合できます。
![image](https://qiita-image-store.s3.amazonaws.com/0/26351/513e6fcf-4de7-19ea-f5cf-91d208eed904.png)
<br/>

　

####**見やすくするために、タブのリネーム**
接続一覧にも、名前が更新されます。
![image](https://qiita-image-store.s3.amazonaws.com/0/26351/3b777853-dac6-e954-c061-e8732d5cdc2e.png)

<br/>
<br/>
※続き追加中
OSX で vagrant up したときのエラー


OSX で `vagrant up` したときに、下記のようなメッセージが出て止まってしまうことがある。

> An error occurred in the underlying SSH library that Vagrant uses.
> The error message is shown below. In many cases, errors from this library are caused by ssh-agent issues. Try disabling your SSH agent or removing some keys and try again.
>
> If the problem persists, please report a bug to the net-ssh project.
>
> timeout during server version negotiating

言われたとおり素直に `killall ssh-agent` すると治る。
既に running 状態の場合、`vagrant reload --provision` する必要あり。

------------------------
- OSX 10.11.3 El Capitan
- vagrant 1.8.1
Sublime Text > #if 1のelseでは色が灰色 / #if 8のelseでは色が通常色

```txt:動作確認
Sublime Text 2 on Windows 7 pro 32bit
```

Grenningの#if 1を使う方法でコーディングをしていっている。
その中でSublime Textの色の表示について気づいた。

```
#if 1
   // case 1
#else
   // case2
#endif
```

上記の場合、case2の行は灰色になる。

```
#if 8
   // case 1
#else
   // case2
#endif
```

上記の場合、case2の行は灰色にならない。

リファクタリングする時に灰色になっていて明らかに実行されない文は削除しやすい。

一方で、#if 8のように1以外のelseの場合は通常色になるので、文を削除するときに注意することになる。

以上の理由から[Quick swap](http://qiita.com/7of9/items/867287b73d3b2cc1b87f)を使う場合は#if 8でなく#if 1でコーディングを進めた方よさそうだ。
NSLayoutConstraint.constraintsWithVisualFormat の結果を view に addConstraint(s)する記法あれこれ

## NSLayoutConstraint.constraintsWithVisualFormat の結果を view に addConstraint(s)する記法あれこれ

Autolayout をコードで行うと非常に面倒ですね。[SnapKit](https://github.com/SnapKit/SnapKit) を使う方法なんかももあるのですが、visualFormat を使おうとすると、とにかく面倒です。特に、`NSLayoutConstraint.constraintsWithVisualFormat` の結果を設定するあたりが、私の悩みのタネでした。さて、以下のようなコードがあったとして、これを `subview` の superview `view` に設定するコードを考えてみましょう。

```.swift
let view = // superview
let views = ["subview": subview]
let hconstraints = NSLayoutConstraint.constraintsWithVisualFormat("H:|[subview]|", options: [], metrics: nil, views: views)
let vconstraints = NSLayoutConstraint.constraintsWithVisualFormat("V:|[subview]|", options: [], metrics: nil, views: views)
```

おそらく最もオーソドックスな書き方は以下の通りだと思います。

```.swift
let hconstraints = NSLayoutConstraint.constraintsWithVisualFormat("H:|[subview]|", options: [], metrics: nil, views: views)
for constraints in hconstraints {
	view.addConstraints(hconstraints)
}

let vconstraints = NSLayoutConstraint.constraintsWithVisualFormat("V:|[subview]|", options: [], metrics: nil, views: views)
for constraints in vconstraints {
	view.addConstraints(hconstraints)
}
```

長いと中途半端な名前になりがちの、中間的な変数を省略すれば…

```.swift
for constraint in NSLayoutConstraint.constraintsWithVisualFormat("H:|[subview]|", options: [], metrics: nil, views: views) {
	view.addConstraint(constraint)
}

for constraint in NSLayoutConstraint.constraintsWithVisualFormat("V:|[subview]|", options: [], metrics: nil, views: views) {
	view.addConstraint(constraint)
}
```

`addConstraint` を二度書くのはなんとかならないでしょうか？

```.swift
for constraints in [
	NSLayoutConstraint.constraintsWithVisualFormat("H:|[subview]|", options: [], metrics: nil, views: views),
	NSLayoutConstraint.constraintsWithVisualFormat("V:|[subview]|", options: [], metrics: nil, views: views)
] {
	view.addConstraints(constraints)
}
```

実は上の書き方でしばらくやっていたのですが、Swift なら `[NSLayoutConstraint]` どうしは 結合できることに気がつきました。

```.swift
for constraint in
	NSLayoutConstraint.constraintsWithVisualFormat("H:|[subview]|", options: [], metrics: nil, views: views) +
	NSLayoutConstraint.constraintsWithVisualFormat("V:|[subview]|", options: [], metrics: nil, views: views) {
	view.addConstraint(constraint)
}
```

なんとなくすっきりした感がないと思い再考します…行数が増えても前の方がいいような気もします。では、`forEach` とか使ってみましょう。

```.swift
(NSLayoutConstraint.constraintsWithVisualFormat("H:|[subview]|", options: [], metrics: nil, views: views) +
 NSLayoutConstraint.constraintsWithVisualFormat("V:|[subview]|", options: [], metrics: nil, views: views))
.forEach{ view.addConstraint($0) }
```

なんか違う方向に行ってしまった感があります。気分を取り戻して考えなおしてみましょう。

```.swift
view.addConstraints(
	NSLayoutConstraint.constraintsWithVisualFormat("H:|[subview]|", options: [], metrics: nil, views: views) +
	NSLayoutConstraint.constraintsWithVisualFormat("V:|[subview]|", options: [], metrics: nil, views: views)
)
```

「ん!」これが一番すっきりしているような気がします。

## これはネタでしょうと思っているあなたへ

バレないように心がけます。
webpackで複数のモジュールを管理する

練習用のRepositoryで複数のExampleを管理したい時がある。
少しハマったのでメモを残す。

## 1つのwebpack.config.jsで管理する

`resolve`プロパティの`modulesDirectories`でモジュールのルートを指定する

```js:webpack.config.js
// es5
'use strict';
...,

var config = {
  ...,
  resolve: {
    extensions: ['', '.json', '.js', '.jsx'],
    modulesDirectories: ['node_modules', path.join(__dirname, 'src', 'module1'), path.join(__dirname, 'src', 'module2')]
  }
};

module.exports = config;
```

## モジュール毎にwebpack.config.jsを用意する

モジュールのディレクトリをルートとして`webpack.config.js`を同じ階層に配置する。
[ReduxのExample](https://github.com/reactjs/redux/tree/master/examples)はこの方法を採用しているようです。

```bash:directory構造
$ tree -a -I 'node_modules|.git|.DS_Store|dist|lib|.vscode|.gitignore'
├── .babelrc
├── .eslintrc
├── package.json
├── src
│   ├── module1
│   │   ├── class1.js
│   │   ├── index.html
│   │   ├── index.js
│   │   └── webpack.config.js
│   ├── module2
│   │   ├── class1.js
│   │   ├── index.html
│   │   ├── index.js
│   │   └── webpack.config.js
│   ├── module3
│   │   ├── index.html
│   │   ├── index.js
│   │   └── webpack.config.js
│   └── module4
│       ├── index.html
│       ├── index.js
│       ├── modules
│       │   ├── About.js
│       │   ├── App.js
│       │   ├── Repo.js
│       │   ├── Repos.js
│       │   └── style.scss
│       └── webpack.config.js
└── webpack.config.js
```

ビルドは各モジュールのルートまで`cd`してから`webpack`をする。
`package.json`で`npm run build:module1`のようにするscriptを作成するのもありかな？

```js:webpack.config.js
// es5
'use strict';
...,

var config = {
  ...,
  resolve: {
    extensions: ['', '.json', '.js', '.jsx'],
    // __dirnameでモジュールのルートを指定する
    modulesDirectories: ['node_modules', __dirname]
  }
};

module.exports = config;
```

```bash:build
$ cd src/module1
$ webpack
```

`webpack`はこれだけで`css`や`image`もバンドルできるのが強みらしいので、どんどん覚えていきたいですね。
特に`React`周りは`webpack`が良く使われているので尚更ですね。
pythonパッケージの依存関係をgraphvizで可視化

# <i class='fa fa-map'/> やりたいこと
pythonパッケージの依存関係を簡単に見たいとします。
ここでは、graphvizで可視化する方法を説明します。
Ubuntu15.10で確認していますが、たぶん、windowsでもできます。

# <i class='fa fa-map'/> インストール

前提: [Anaconda](https://www.continuum.io/downloads)をインストール済みとします。

graphvizのインストールは、以下の通りです。condaでgraphviz本体を、pipでラッパーをインストールします。また、libltdl7というライブラリも必要でした。

```bash:bash
conda install -y graphviz
pip install graphviz
apt-get install -y libltdl7
```

パッケージの依存関係は、pipdeptreeを使います。インストールは以下の通り。

```bash:bash
pip install pipdeptree
```

# <i class='fa fa-map'/> 実行

以下のようにして python-dep.pngを作成できます。
左からインストールしていけば よいように、並んでいます。

```py3:python
import graphviz
from subprocess import run, DEVNULL, PIPE
ss = run(['pipdeptree'], stdout=DEVNULL, stderr=PIPE, 
         universal_newlines=True).stderr.rstrip().split('\n')
ss = [s[2:].lower().split()[:3] for s in ss if s[0] in ' *']
g = graphviz.Digraph(format='png', filename='python-dep', engine='dot')            
g.edges([(s[2], s[0][:s[0].index('=')]) for s in ss])
g.attr('graph', rankdir='LR')
g.render()
```

![image](https://qiita-image-store.s3.amazonaws.com/0/13955/79e3dd36-d508-25a6-dbac-957ced665d7f.png)


# <i class='fa fa-map'/> Dockerでお試し

上記の一連の[docker](https://hub.docker.com/r/tsutomu7/python-dep/builds/)([Dockerfile](https://github.com/Tsutomu-KKE/python-dep/blob/master/Dockerfile))を用意しました。下記のようにして、python-dep.pngを作成できます。

```bash:bash
docker run -it --rm -v $PWD:/tmp -w /tmp \
    tsutomu7/python-dep python /root/python-dep.py
```


参考
[Graphvizとdot言語でグラフを描く方法のまとめ](http://qiita.com/rubytomato@github/items/51779135bc4b77c8c20d)
[pip関連ツールでPythonのパッケージ管理を楽にする](http://qiita.com/kk6/items/90bc704c9d2a9edc580e)
[Python にインストールしたパッケージをグラフにしてみた](http://qiita.com/kitsuyui/items/0e72af781ac1a7e3e948) ... 記事を書いた後、見つけました。

以上
Joinコマンドでテキスト結合はこうする

Linuxでテキスト加工をするときにとても便利なコマンドとしてjoinがあります。
このコマンドは、CSVやTSVをテーブル接続のように繋ぐことが出来ます
覚えておくと、csv加工が捗ります

例としてa.csvとb.csvを用意します

a.csv

```
100,apple
200,banana
400,cerry
700,date
```

b.csv

```
100,green
200,yellow
400,red
600,black
```

- 内部結合[join]

```
join -t, a.csv b.csv
#もしくは
join -t, -1 1 -2 1 -o 0 1.2 2.2 a.csv b.csv
```

結果

```
100,apple,green
200,banana,yellow
400,cerry,red
```

- 外部結合(右)

```
join -t, -a 2 -1 1 -2 1 -o 0 1.2 2.2 -e 'NULL' b.csv  a.csv
```

結果

```
100,green,apple
200,yellow,banana
400,red,cerry
700,NULL,date

```

- 外部結合(左)

```
join -t, -a 1 -1 1 -2 1 -o 0 1.2 2.2 -e 'NULL' b.csv  a.csv

```

結果

```
100,green,apple
200,yellow,banana
400,red,cerry
600,black,NULL
```

- 完全外部結合

```
join -t, -a 1 -a 2 -1 1 -2 1 -o 0 1.2 2.2 -e 'NULL' a.csv b.csv
```

結果

```
100,apple,green
200,banana,yellow
400,cerry,red
600,NULL,black
700,date,NULL
```

- 一致しないモノだけ出力

```
join -t, -v 1 -v 2 -1 1 -2 1 -o 0 1.2 2.2 -e 'NULL' a.csv b.csv
```

結果

```
600,NULL,black
700,date,NULL
```

オプションの説明

```
#区切り文字
-tx  : xを区切り文字にする区切り文字 

#キーにするフィールド
-1 x : 1つ目のファイルの第xフィールドを用いてjoinする
-2 x : 2つ目のファイルの第xフィールドを用いてjoinする

-a [ファイル番号1 or 2] : ファイルにあるペアにならなかった行を通常の出力に追加 

-e [文字列] : 入力にフィールドがなかった場合はそれに対応する出力フィールドを[文字列]にする 

-o [フォーマット] : 出力のフォーマット [例 0(キー)/1.1(1ファイル1列目)/2.2(2ファイル2列目)の意味]

-v [ファイル番号1 or 2] : ペアにならなかった行だけを出力 

-i : keyの大文字/小文字を無視
```
array_columnの多次元配列版を用意した


[PHPのarray_columnが便利 - Qiita](http://qiita.com/harukasan/items/a0773aef27d838852e44)にて紹介されていたarray_column関数。
PHP nativeなのでどこでも利用できて大変捗っていたのですが、一つだけ辛い現実が待っていました。

**多次元配列として返せない**

# 現実

例えば次のような状況を扱う事が出来ない。

```php
//次の配列をtypeごとに分類し、IDをキーに持つ配列にする。
$array = [
    ['id' => 100, 'type' => 1, 'value' => 'hoge'],
    ['id' => 120, 'type' => 1, 'value' => 'huga'],
    ['id' => 400, 'type' => 2, 'value' => 'foo'],
    ['id' => 500, 'type' => 1, 'value' => 'baa'],
    ['id' => 600, 'type' => 3, 'value' => 'piyo'],
    ['id' => 711, 'type' => 2, 'value' => 'pya'],
];

//この書き方ではデータ定義ごとに個別の実装が必要となり、勤勉な実装を強いられる。
$result = [];
foreach ($array as $row) {
    $type = $row['type'];
    $id = $row['id'];
    $result[$type][$id] = $row;
}
/*
こんな感じの配列が出来る。
[
  1 => [
    100 => ['id' => 100, 'type' => 1, 'value' => 'hoge'],
    120 => ['id' => 120, 'type' => 1, 'value' => 'huga'],
    500 => ['id' => 500, 'type' => 1, 'value' => 'baa'],
  ],
  2 => [
    400 => ['id' => 400, 'type' => 2, 'value' => 'foo'],
    711 => ['id' => 711, 'type' => 2, 'value' => 'pya'],
  ],
  3 => [
    600 => ['id' => 600, 'type' => 3, 'value' => 'piyo'],
  ],
]
*/
```

ちなみにarray_columnでやろうとすると・・・

```php
// typeに纏められて即死
$result = array_column($array, null, 'type');
/*
[
  1 => ['id' => 500, 'type' => 1, 'value' => 'baa'],
  2 => ['id' => 711, 'type' => 2, 'value' => 'pya'],
  3 => ['id' => 600, 'type' => 3, 'value' => 'piyo'],
]
*/
```

つまり実現出来ない。

```php
$result = array_column($array, null, 'type', 'id');
```

のような書き方が出来れば良いのですが・・・

# 解決

このメソッド使えば解決する。
PHP5.4 or laterで動作します。

[vartype/Arrays.php at master · line 243-273 MultiColumn method · ProjectICKX/fw2](https://github.com/flywheel2/vartype/blob/master/arrays/Arrays.php#L243-L273)

```php
use ickx\fw2\vartype\arrays\Arrays;
$result = Arrays::MultiColumn($array, ['type', 'id']);
/*
こんな感じの配列が出来る。
[
  1 => [
    100 => ['id' => 100, 'type' => 1, 'value' => 'hoge'],
    120 => ['id' => 120, 'type' => 1, 'value' => 'huga'],
    500 => ['id' => 500, 'type' => 1, 'value' => 'baa'],
  ],
  2 => [
    400 => ['id' => 400, 'type' => 2, 'value' => 'foo'],
    711 => ['id' => 711, 'type' => 2, 'value' => 'pya'],
  ],
  3 => [
    600 => ['id' => 600, 'type' => 3, 'value' => 'piyo'],
  ],
]
*/
```

1行で終わるというね。
なお、第二引数に配列内に実在するキーを渡す事で、段数はいくらでも増やせるので任意の構造を容易に実現できます。
また、第二引数は配列なので、処理状況に応じて動的に構造を変える事も可能。

クラス依存の処理は無いので、最悪、次の関数を使うだけでも急場はしのげます。
配列の初期化だけ旧くすればPHP5以上ならどこでも動くかも。

```php
	/**
	 * 配列にあるキーの値を元に配列を階層化して返します。
	 *
	 * @param	array		$values	階層化する配列
	 * @param	array		$keys	階層化の元にするキー名の配列
	 * @param	callable	$filter	最終階層を詰める際に利用するコールバック
	 * @return	array		階層化された配列
	 */
	public static function MultiColumn ($values, $keys = [], $filter = null) {
		if (is_array($keys) && empty($keys) || $keys === null) {
			return $values;
		}
		$enable_filter = $filter !== null && is_callable($filter);
		$keys = (array) $keys;
		$ret = [];
		foreach ($values as $row) {
			$tmp =& $ret;
			foreach ($keys as $key) {
				$tmp =& $tmp[$row[$key]];
			}
			if ($enable_filter) {
				$row = $filter($row);
			}
			$tmp = $row;
		}
		return $ret;
	}
```
json schemaのよく利用する機能まとめ

みなさんjson schema利用していますか？
webAPIのスキーマテストをjson schemaを利用して行っているので、実装時に利用した機能のちょっとしたメモを公開します。

# properties

* オブジェクト(連想配列)の唯一の名前を指定できる
* 値が一つだけの場合はこれを用いると楽

~~~json
    "properties": {
        "/": {}
    }
~~~

# patternproperties

* 正規表現を用いてオブジェクト名のバリデートができる

~~~json
    "patternProperties": {
        "^(/[^/]+)+$": {}
    }
~~~

# additionalProperties

* 未定義のプロパティを拒否する
* 下の例は、`"/"`と同じ階層に他のプロパティが入るとバリデートされる

~~~json
    "properties": {
        "/": {}
    },
    "additionalProperties": false
~~~

# type

* keyの値の型のバリデート

~~~json
"type": "object"
~~~

名称|説明
|---|---|
array|配列型|
boolean|真偽値型|
integer|整数型。少数と指数部はのぞく|
number|実数型？|
null|null型|
object|連想配列型|
string|文字列型|

# minimum

* keyの最小の値を指定

# exclusiveMinimum

* minimumで指定した値を含めるのか含めないのかをbooleanで指定。
* true => 含めない
* false => 含める
* 省略可で、デフォルトはfalse

# maximum

* keyの最大の値を指定

# exclusiveMaximum

* maximumで指定した値を含めるのか含めないのかをbooleanで指定。
* true => 含めない
* false => 含める
* 省略可で、デフォルトはfalse

# pattern

* keyの値を正規表現を用いてバリデートできる。`"type":"string"`を指定した場合のみ使用できる。
* 使用できる特殊文字が限られるので注意。例えば数値にマッチさせる`\d`は使用できない。詳しくは[こちら](http://spacetelescope.github.io/understanding-json-schema/reference/regular_expressions.html#regular-expressions)。

~~~json
"pattern": "^/dev/[^/]+(/[^/]+)*$"
~~~

# required

* `properties`で定義した値の中で、必ず入っていなければならない値を選択できる。
* 下の例は、`"name"`と`"email"`が必須項目で、それ以外の値はあってもなくてもバリデートされない。

~~~json
{
  "type": "object",
  "properties": {
    "name":      { "type": "string" },
    "email":     { "type": "string" },
    "address":   { "type": "string" },
    "telephone": { "type": "string" }
  },
  "required": ["name", "email"]
}
~~~

# 参考URL
* [json-schema.org](http://json-schema.org/)
* [Understanding JSON Schema](http://spacetelescope.github.io/understanding-json-schema/index.html)
味噌汁に見えるチョコをGoogle Cloud Visionで認識させるとどうなるか

Googleが、画像認識API Cloud Visionを公開しました。
一方でこんなツイートを見かけました。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">GODIVAのチョコが家にあるんだけどお父さんが「味噌汁じゃん」って言い出してから味噌汁にしか見えない <a href="https://t.co/Ezlo2LeePv">pic.twitter.com/Ezlo2LeePv</a></p>&mdash; ねっちマン® (@kazynnr) <a href="https://twitter.com/kazynnr/status/698790377164185600">2016年2月14日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

なるほど、確かにこれは味噌汁っぽい…じゃあCloud Visionに認識させたらどうなるのか試してみました。

# 手順
## Google Cloud Platformに登録する
登録後30日までは無料とのことなので、登録してみました。
## チュートリアルに従ってAPIの有効化とブラウザキーを作成
今のところ[英語のチュートリアル](https://cloud.google.com/vision/docs/getting-started?hl=ja)しかありませんが、作業は簡単です。新規プロジェクトを作って、認証情報としてブラウザー鍵を生成するだけです。
## リクエストjsonを作る
API呼び出しのためのjsonを作成します。直接jsonをエディタで作成しても良いですが、[Google APIs Explorer](https://developers.google.com/apis-explorer/?hl=ja#p/vision/v1/)を使うと割と楽です。
### 画像ファイルをbase64化する
jsonに画像ファイルの中身をbase64でエンコードして指定する必要があるので、GNU coreutilsのbase64コマンドを使って生成しましょう。
できあがったrequest.jsonはかなり大きくなるのでここには直接張りませんが、[gist](https://gist.github.com/knok/18d3286ffda984bdcd5b/raw/acbe5681bac1ccffe39c90814a9befc5960ea6f2/request.json)に自分が作成したものを置いてあります。
## リクエストを送信する
wgetでもcurlでもなんでも良いですが、生成したリクエストをhttpsで送信します。私はチュートリアルに習ってcurlを使いました。

```shell-session:call.sh
#!/bin/sh
curl -v -k -s -H "Content-Type: application/json" https://vision.googleapis.com/v1/images:annotate?key="$1" \
 --data-binary @request.json
```
## 結果を見る
curlの標準出力にjsonとして結果が返ってきます。2/19日次点で私が得られた結果を以下に示します。

```json:result.json
{
  "responses": [
    {
      "labelAnnotations": [
        {
          "mid": "/m/02q08p0",
          "description": "dish",
          "score": 0.95707446
        },
        {
          "mid": "/m/02wbm",
          "description": "food",
          "score": 0.83514553
        },
        {
          "mid": "/m/0krfg",
          "description": "meal",
          "score": 0.75944263
        },
        {
          "mid": "/m/0271t",
          "description": "drink",
          "score": 0.571712
        },
        {
          "mid": "/m/07xgrh",
          "description": "ingredient",
          "score": 0.5617367
        },
        {
          "mid": "/m/0270h",
          "description": "dessert",
          "score": 0.55429626
        },
        {
          "mid": "/m/0hz4q",
          "description": "breakfast",
          "score": 0.54153788
        },
        {
          "mid": "/m/06l8d",
          "description": "restaurant",
          "score": 0.50432992
        }
      ]
    }
  ]
}
```
# 考察
もっとも上位のスコアで返したのはdishでした。以下food, meal, drinkと続きます。food+drinkはそれとなく味噌汁っぽい気がします。その次の次にdessertを返しているので、チョコレートかも?という判断もしていそうです。
今実行すると、また違う結果が返ってくるかもしれません。

# 注意
* APIの呼び出し回数制限に気を付けましょう
* ブラウザ鍵は認証としては非常に弱いので、取り扱いに気を付けましょう

# 参照
* https://gist.github.com/knok/18d3286ffda984bdcd5b
Kintoneでアプリに JavaScriptを追加する

Kintoneのアプリには、JavaScriptを追加することができます。

まずは、次のような JavaScriptファイルを作成しましょう。

```js
(function () {
    "use strict";
 
    kintone.events.on('app.record.index.show', function (event) {
        window.alert('レコード一覧が表示されました');
    });
})();
```

このファイルを、Kintoneのアプリの設定画面から「詳細設定→JavaScript / CSSでカスタマイズ」メニューを選び、作ったファイルをアップロードします。

![2016-03-09_13-26-30.png](https://qiita-image-store.s3.amazonaws.com/0/3977/a28ad419-6d83-11a2-63f4-aa2a346638c8.png)

または、自前の Webサーバーにファイルをアップロードして、URLを指定します。こちらの方が、後から変更しやすいので便利です。jQuery等の依存ライブラリがある場合も、ここにURLを指定していきます。

こうして、一覧画面に戻ると図のようなウィンドウが表示されます。

![2016-03-09_13-29-44.png](https://qiita-image-store.s3.amazonaws.com/0/3977/d3b69b70-b715-f5b0-cf6d-c305df9c3f9a.png)

kintoneという名前のオブジェクトがあり、ここでイベントの定義やデータを取得などを行えます。いろいろ可能性が広がりますね。
便利な .gitignore のサンプル集

有名なので利用されている方も多いと思いますが、便利な .gitignore のコレクションです。

## .gitignore のサンプル集
https://github.com/github/gitignore

GitHubがMITライセンスで公開しています。
各言語やIDE環境別にあるので、お好きなファイルをダウンロードしましょう。

## 利用方法
基本的(Global フォルダに入っているもの以外)には、 リポジトリルートの .gitignore を差し替えるだけでOKです。
MackerelでRaspberry Piの死活監視する

主にradikoの録音サーバーと他諸々の運用をしているRaspberry Piを外から死活監視しようと思います。

そのきっかけは、最近安定していた深夜ラジオの録音とDropboxへのアップロードが失敗していたのもあり、貧弱なメモリ対策として1日2回の再起動はしていたものの、その間にそもそもフリーズしてたらsshもアウトだしという理由。

つまるとこ、JUNKとオールナイトニッポンは録音漏れしたくない、ただそれだけのためです。


ということで、簡単に死活監視してみましょう。

色々調べるのも時間ないので、いきなりですが無料プランがあるのとお試しできる[Mackerel](https://mackerel.io/)使います。

アカウントなければ、GithubやGoogleアカウントとかでサインアップできるので割愛。

## 環境
- Raspberry Pi 1 model B Linux raspberrypi 3.2.27

## ダウンロード
```
$ curl -O https://mackerel.io/file/agent/deb/mackerel-agent_latest.all.deb
```

## インストール
```
$ sudo dpkg -i mackerel-agent_latest.all.deb
$ sudo sed -i.bak '1s:^:apikey = "[apikey_sample]"\'$'\n'':' /etc/mackerel-agent/mackerel-agent.conf
```

## 結果
```
$ sudo /etc/init.d/mackerel-agent start
[FAIL] Starting mackerel-agent: failed!
```
失敗。

理由はARM対応のエージェントではないということらしい。  
ということで、

## 改めてダウンロード

```
$ curl -LO https://github.com/mackerelio/mackerel-agent/releases/download/v0.29.2/mackerel-agent_linux_arm.tar.gz
```
githubからARM版をダウンロード。

```
$ tar zxf mackerel-agent_linux_arm.tar.gz
$ sudo cp mackerel-agent_linux_arm/mackerel-agent /usr/local/bin
```
解凍とコピーして配置。


## 設定ファイル
mackerel-agent.confは、最初の失敗インストール時に作られているので、
apiキー確認してそのまま使えました。


## 起動
```
$ sudo /etc/init.d/mackerel-agent start
```
アムロ「こいつ...動くぞ！」

## Mackerelのダッシュボード
<img width="1280" alt="スクリーンショット 2016-03-09 2.07.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/30278/151916df-584c-2621-d0a6-1945fe07aa87.png">



host情報も取れました。スペックは完全にラズパイ1
<img width="892" alt="スクリーンショット 2016-03-09 2.07.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/30278/4067adf7-c1a6-0b1d-9953-3a316d395d9a.png">



## slack通知
公式ヘルプにも親切に書いてあるので特に問題なし。Slack側の設定はやればわかるので省略。
http://help-ja.mackerel.io/entry/howto/alerts/slack

- Incoming WebHooksのWebhook URL
- 通知メッセージ
などの設定。


これくらいでお手軽死活監視ができればいいかなと思います。 

**通知も来るし、少し安心でき...るのかどうか不安だけどまあいいや**
コメント機能の作り方　[ 自分用メモ ]

1. commentのscaffoldを作成する　※ 同時に外部キーを生成するreferencesを使う<br>
rails g scaffold comment question:references user:references content:string<br><br>
2. マイグレーション<br>
rake db:migrate<br><br>

3. 親モデルに、has_many を記述
※ question.rb
has_many :comments<br>
※user.rb
has_many :comments<br><br>
4. routes.rb
※ questionのshow.html.erbに対してコメントが付く
  resources :questions do
    　resources :comments
  end<br><br>

5. questions_contoroller.rb
※ showアクション
def show
　@comment = @question.comments.build
end<br><br>

6. views / questions / show.html.erb
※ 下記を追記する

<%= render partial: 'comments/index',locals: { comments: @question.comments } %>

<% if user_signed_in? && current_user %>
<%= render partial: 'comments/form' %>
<% end %><br>
7. comments_controller.rb
※ createアクションに追記
def create
　@comment.user_id = current_user.id

　@question = @comment.question　※ comments/index.js.erbに送られる 
 　format.js { render :index,notice: 'コメントが投稿されました' }
end<br>
8. comments / _form.html.erb
※ 下記を追記する<br>
<%= form_for(@comment, remote: true) do |f| %>　※ remote: trueを追記<br>

< div class="field">
    　<%= f.hidden_field :question_id %>
    　<%= f.hidden_field :user_id %>
    　<%= f.label :comment %>
    　<%= f.text_field :content %>
< /div><br>
9. comments / __index.html.erb (既存のindex.html.erbをパーシャルに変更する)
< div id="comments_area" >　※ comments/index.js.erbで#comments_areaを指定
<% comments.each do |comment| %>
　<% unless comment.id.nil? %> ※ commentが1件も存在しない場合は、コメントを表示させない
　<%= comment.question %></td>
　<%= comment.user.name %>
　<%= comment.content %>
　<%= link_to 'Show', comment %>
　<%= link_to 'Edit', edit_comment_path(comment) %></td>
　<%= link_to '削除', question_comment_path(@question, comment), method: :delete, data: { confirm: '本当に削除しますか？' } %>
　<% end %>
<% end %>
< /div ><br>
10. comments / index.js.erb ファイルを作成する
$("#comments_area").html("<%= escape_javascript(render partial: 'comments/index',locals:{ comments: @question.comments } ) %>");
$(':text').val('')<br>
11. バリデーションを実装する
comment.rb<br>
validates :content, length: { in: 1..140 } #140文字以下で入力
Plone-4.1.5-UnifiedInstaller-20120604.tgzでインストールしたZopeのzope objectのexport/import方法

- exportは普通にexport
- importは出力したzxp fileを
 /usr/local/Plone/zinstance/parts/instance/importに配置する。
 
- control panelのINSTANCE_HOMEと表示されている directory直下に自分でimport dirを作ってそこに置く

- 配置が正常だと、import 用UIで正常にexportしたfileが表示され、import可能になる。
WindowsでInfluxdb使う

## Influxdbのダウンロード

以前は公式ページからWindows向けのインストーラーをダウンロードできたみたいだけど、今はなさげ。

がしかし、実はこっそりとNightly Buildが作られている。

https://s3.amazonaws.com/influxdb/

にアクセスすると、Pre-build一覧が見れる。検索するとWindows版のNightly Buildも見つかる(i386 / x64)。

先ほどのURLに、欲しいビルドのファイル名を付与すると、ダウンロードできる。

(例) https://s3.amazonaws.com/influxdb/influxdb-nightly_windows_i386.tar.gz

## influxdbサーバーを起動する

公式サイトでは、

```
influxd
```

で起動できるとあるが、残念ながらWindows版ではエラーログ吐き続ける。

対策方法は [Issue 5848](https://github.com/influxdata/influxdb/issues/5848)に提示されており、**etc/influxdb/influxdb.conf**の*meta*セクション内の*http-bind-address*にホスト名(またはIPアドレス)を付ける

例えば、

```
http-bind-address = "localhost:8091"
```

また、
* *meta*セクションの*dir*
* *data*セクションの*dir*
* *hinted-handoff*セクションの*dir*
* *admin*セクションの*https-certificate*
* *http*セクションの*https-certificate*

をフルパスにする。

フルパスにしておかないと、Influxd再起動したら、データベース消えて、あるぇな目にあう（実際あった）。

以上の変更を加えた上で、

```
<展開先>/usr/bin/influxd -config <展開先>/etc/influxdb/influxdb.cong
```

のように明示的に設定ファイルを指定することで起動できる。

サーバーが起動できてさえすれば、CLIツールやhttpアクセスは公式先とどおりに使用できる。

## その他

所詮Nightly Buildなので、用法・用量を守って使うことをオススメします。

ご利用は計画的に
個人メモ：Feature Hashing，Hashing Trick

# 概要
Bag of words (BOW) など特徴量を圧縮する技術として
Feature Hashing(フィーチャーハッシング)　もしくは　Hashing Trick(ハッシュトリック) と呼ばれるものがある．

ハッシュ関数を使って情報圧縮するものだが，
説明を読む限り，圧縮（ハッシュ化）した結果を**そのまま**特徴量としてトピックモデルなどに当てることができ，
圧縮しているのでメモリ効率は当然良いし，かつ，圧縮しない場合と比べてそんなに分類精度も悪くなく，
むしろハッシュ化したことで表記揺れをある程度吸収できる…っぽい．
なんだか夢のような技術．

でも，いまいち記述を見かけないので，
初心者には高度すぎるか，使いどころに注意が必要そうな技術のはず．

追々調べる．

# リンク
https://ja.wikipedia.org/wiki/Feature_Hashing
http://d.hatena.ne.jp/jetbead/20141106/1415208665
http://tkzs.hatenablog.com/entry/2015/07/29/030936
http://www.slideshare.net/pfi/pfi-seminar-20120315
git: マージコミットから前回の分岐点までの差分ログを取る

`TARGET_REV` をマージコミットのリビジョンとした時、次のコマンドで差分を出力できる。

```
$ TARGET_REV=`git rev-parse --short HEAD`
$ git log --oneline `git show-branch --merge-base "${TARGET_REV}^1" "${TARGET_REV}^2"`..HEAD
```

## 解説

```
git rev-parse --short HEAD
```

HEAD（現在のリビジョン）のリビジョン番号を短いハッシュ値で出力する

```
git show-branch --merge-base "${TARGET_REV}^1" "${TARGET_REV}^2"
```

マージコミットの元となる２つのリビジョンの分岐点となるリビジョンを出力

```
git log --oneline {rev}..HEAD
```

`{rev}` から HEAD までのログを一行ずつで出力

## 応用

`git log` 以外にも `git diff` で使っても有用

```
$ git diff --stat `git show-branch --merge-base "${TARGET_REV}^1" "${TARGET_REV}^2"` HEAD
```
CentOSのバージョン確認コマンドとアーキテクチャ確認コマンド

# CentOSのバージョンを確認するコマンド
```bash
$ cat /etc/redhat-release
CentOS Linux release 7.1.1503 (Core)
```

# アーキテクチャ（OSが32bit, 64bitどちらなのか）を調べるコマンド
```bash
$ arch
x86_64
$ uname -a
Linux localhost domain 3.10.0-229.eI7.x86_64 # SMP .......
```


以下のサイトの内容そのままです。
ありがとうございました。

CentOSのバージョン確認コマンドとアーキテクチャ確認コマンド | Mawatari.jp
http://mawatari.jp/archives/check-centos-version
LiveBindingのカスタムコンポーネント作る際に利用したインターフェースたち

コレクションをバインドする際、標準のコンポーネントでは遅すぎて使い物にならなかったため、TBidingEditorとTBindSourceAdapterをカスタマイズ。

その際に使用したインターフェースのメモ。
XE5時点なので、最新の環境では代わっているかも（XE7ではそれほど差異はなさげだけど）

## よく使わそうなインターフェース

* IScope
    * バインドの対象。
    * 入力側と出力側にそれぞれ1本ずつ手配される。
    * データソース -> UIコンポーネントであれば、入力側：データソース、出力側：UIコンポーネントとなる。
    * 逆方向であれば、入出力が反転する。
    * バインディングエンジンは、入力側スコープにバインド式を適用してIValue型として取り出し、その値を出力側スコープにバインド式を適用して割り当てる。
    * メソッド
        * LookUpメソッドを使用して、IGroupインスタンスを検索する。
        
* IGroup
    * ひとつのバインド式に対しひとつ作られる。
    * IScope.LookUpメソッドを呼んだ場合にこの型の値を返す。
    * IGroupはバインド式を評価した際に作成される、グループインスタンスと呼ばれる値を保持するロールを提供する
    * メソッド
        * Add: 渡された対象をグループインスタンスに変更し、格納する。
        * Wrappers: 指定したインデックスのグループインスタンスを取得する。
        
* IValue
    * グループインスタンス候補
    * 入力側から値を取り出すロールを提供する
    * メソッド
        * GetValue: 入力側から値を取り出す
        * GetType: 値の型を取得。主に値を変換するConverterを選択する際に使われている。
        
* ILocation
    * グループインスタンス候補
    * 出力先に値を割り当てるロールを提供する
    * メソッド
        * SetValue: 出力先に値を割り当てる
        
* IArguments, IInvokable
    * グループインスタンス候補
    * バインド式にIndexedPropertyを使う場合（例えば、Foo['Bar']）に使用する（どちらかいずれかでよい）
    
* IPlaceholder
    * グループインスタンスの値を初期化、またはキャッシュされた評価結果を破棄するロールを提供する
        * TBindGridList(TBindGridListLink)を使う場合、入出力のスコープが再利用されるため、必須インターフェース
    * 通常、IScopeと共に指定してクラス定義する
    * メソッド
        * Detach: グループインスタンスの値を破棄するけど、どこからも呼ばれてない死にメソッド。
        * Attach: グループインスタンス値を割り当てる。Detachが役立たずなので、初期化と破棄の両方をおこなわせることとなる。
            * このメソッドだけしっかり実装する。
            
## 正直要らない子たち

* IWrapperBinding, IScopeSymbols
    * デザイナを介してLiveBindingを使用する場合、設定だけはするが、その値をどこでも利用してなさげな謎のインターフェース。
    * IScopeに複数のIGroupを保持している場合に、式の評価前に初期化(Attach)する対象を検索する目的で使用した。

* IScopeEnumerable
    * クラス定義の際、IScopeと一緒に指定し、スコープが保持する子要素(IGroup, IScope,..)を列挙する。
    
* ScopeEx
    * 文字列ではなく、オブジェクトをキーにしてIGroupを取得できる。
    * LiveBindingデザイナを使う場合は、NO DEBAN。
    
* IChild, IWrapper
    * 実際に値が割り当てられる直前、直後にそれぞれ発行されるイベント、OnAssigningValue OnAssignedValueに関係する（っぽい）
    * 特に使わなくても何とかなったので、詳細には調べてないです。
iOS Safariでスクロールしただけでリサイズイベントが発生する原因と対処法

iOSの標準ブラウザであるMobile Safariにおいて、「ウインドウサイズが変わった」というイベントが発生するのはどんなときだと思いますか？ Mobile SafariはiPhone端末のサイズいっぱいに全画面表示されるので、**縦持ち・横持ちを切り替えた時「だけ」ウインドウサイズイベントが発生する、というのは間違**いです。実は、**ウインドウを最初にスクロールした時にもリサイズイベントが発生**します。この現象の原因と解決方法を紹介します。

#スクロール時にリサイズイベントが発生するデモ
現象を確認するためにデモを準備しました。コンテンツはiPhoneの画面サイズに収まりきれないほど長く、スクロールが必要です。ウインドウリサイズイベントが発生した時に、アラートが出ます。
[http://goo.gl/yWHZ3M](http://goo.gl/yWHZ3M)

JavaScriptには下記の処理が定義されています。

```js:ウインドウリサイズ時にアラートを発生
window.addEventListener("resize", function() {
   alert("ウインドウがリサイズしました。");
})
```

Mobile Safari (iPhone 6s、iOS 9.1.2)で最初のスクロールをしてみると、縦持ち・横持ちを切り替えていないのにリサイズした旨のアラートが表示されます。

![ios_scroll.png](https://qiita-image-store.s3.amazonaws.com/0/67884/5636606c-3a1a-0544-4c24-e5d2842c681b.png)


# 何故こんなことが起こるのか？

iOS 8からスクロール時にアドレスバーが自動で小さくなる仕様となりました。これにより、**アドレスバーが小さくなった分だけウインドウサイズが大きくなったと見なされ、リサイズイベントが発生するようになった**のです。ウインドウサイズのことを考えれば当然の挙動なのですが、「スクロールしただけでリサイズイベントが発生する」というのはデスクトップでのブラウザに慣れている人であれば違和感を感じるのではないでしょうか。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/2bd4d253-677a-e5e3-4c61-68d3760d67ae.png)

#意図したとおりにリサイズイベントを取り扱うにはどうしたらいいのか？
モバイルコンテンツで、横持ち・縦持ちが変わった時のみリサイズ処理を行うには、下記のような方法があります。

##対処法1：画面の横幅が変わった時のみリサイズ処理を行う
iOS、Androidの時は縦持ち・横持ちを切り替えるとは、ウインドウの横幅が変わることと同じ意味なので、横幅が変わった時のみリサイズ処理を実行する方法です。

```js:MobileSafari対応ウインドウリサイズ時にアラートを発生
// ウインドウの横幅を保持
var currentWidth = window.innerWidth;

window.addEventListener("resize", function() {
	if (currentWidth == window.innerWidth) {
		// ウインドウ横幅が変わっていないため処理をキャンセル。
		return;
	}

	// ウインドウ横幅が変わったのでリサイズと見なす。
	// 横幅を更新
	currentWidth = window.innerWidth;
	alert("ウインドウがリサイズしました。");
});
```

[http://jsrun.it/tonkotsuboy/qrVD](http://jsrun.it/tonkotsuboy/qrVD)にデモを用意しました。iOS、Androidの時は縦持ち・横持ちを切り替えた時のみ、デスクトップブラウザではウインドウのりサイズ時にアラートが表示されます。

##対処法2：モバイルでは端末の向きが変わった時のみリサイズ処理を行う
iOS、Androidでは端末の向きが変わった時に`orientationchange`というイベントが発生します。モバイルではこのイベントが発生した時のみ、リサイズ処理を実行する方法です。

```js:モバイルの時は端末の向きを監視する方法
// ユーザーエージェントの判別
var userAgent = navigator.userAgent;

// スマートフォンの場合はorientationchangeイベントを監視する
if (userAgent.indexOf("iPhone") >= 0 || userAgent.indexOf("iPad") >= 0 || userAgent.indexOf("Android") >= 0)
	window.addEventListener("orientationchange", resizeHandler);
else
	window.addEventListener("resize", resizeHandler);

function resizeHandler() {
	alert("ウインドウがリサイズしました。");
}
```

[http://goo.gl/ariHN0](http://goo.gl/ariHN0)にデモを用意しました。こちらも期待の動作をします。

#Mobile Safariでリサイズ処理を扱う時は気をつけましょう
モバイルコンテンツでファーストビュー全体にコンテンツを表示してJavaScriptで処理を行いたい時等にこの現象が問題になります。この挙動を頭に入れておきましょう。
[python] pandasのDataFrameからpostgresにテーブルを作成


pandasのDataFrameからtableを作成するメモ
DataFrameをそのままto_sqlすると、postgresにはインサートできなかった

```python:before.py
import pandas as pd
import psycopg2


db = "dbname=postgres host=localhost user=username"
conn = psycopg2.connect(db)

df = pd.read_csv("sample.csv")
df.to_sql(df,"table_name", conn, if_exist="replace", index=False)

```

いろいろ調べた結果、sqliteへの書き込みがデフォルトらしいので変更

```python:after.py
import pandas as pd
from sqlalchemy import create_engine


df = pd.read_csv("sample.csv")
engine=create_engine("postgresql://username@hostname:port/dbname")
df.to_sql("table_name", engine, if_exist="replace", index=False)

```

read_sqlはbeforeのやり方で問題なかった

参考>http://stackoverflow.com/questions/23103962/how-to-write-dataframe-to-postgres-table
react-router-redux で URL 直打ちすると Cannot GET /subdir になる

Redux で routing を実装していて、うまく動いてくれずハマりました。
所感の項にも書いていますが、見当違いで解決策が見つかりづらかったので情報残しておきます。

## 現象

ブラウザで、ルート以下の階層の URL を直打ち、あるいはリロードすると `Cannot GET /subdir` (subdir はディレクトリ名) と表示されページを読み込めず。

直打ちで読み込めるのは、この場合 `http://localhost:3000` のみ。

![qiita_01.png](https://qiita-image-store.s3.amazonaws.com/0/38837/cd69c395-0b3c-8028-56ed-34f265004bd7.png)

## 原因

サーバに 404 を index.html に fallback する設定が必要。

## 対処法

サーバによって設定方法は違いますが、
webpack-dev-server の場合は起動オプションで `--history-api-fallback` を追加すればよいです。

`$ webpack-dev-server --history-api-fallback`

## 補足

この問題が発生するのは、history として `browser-history` を利用している場合のみ。
`hash-history` を利用している場合はこの問題は発生しません。(ハッシュの場合は 404 にならないので当然といえば当然ですが…)

なので、googleability を重視してタイトルは react-router-redux としましたが、
実際には react-router 単体に起因する問題です。

## 所感

以前 react-router を利用した経験があったために、
完全に react-router-redux の使い方が間違っているものと思い込んで調査していたため、なかなかこの答えにたどり着けませんでした。

最終的には自分のソースコードと github の [react-router-redux の example/basic](https://github.com/reactjs/react-router-redux/tree/master/examples/basic) を、目diff してて気づきました。そうだサーバ違うじゃんと…。

開発ベースは `Yeoman` で generate したり Github で有志が公開されている starter kit 的なものを使ったりすると、
開発用のサーバも何かしら用意されているため、ほとんど意識することはないですが、
もう少し気にかけてあげないとなーと思う今日のわんこなのでした。

## 環境情報

* redux 3.0.4
* react-router 2.0.0
* react-router-redux 4.0.0
* webpack-dev-server 1.14.1
【Objective-C】保守しやすいコードを書くときに気をつけること

スクリプトみたいにViewController.mにダラダラ記述して後で他メンバーが保守するときに大変な思いをするより、初見でわかりやすい・保守しやすいコードの方が断然良い。そのためにやっている手法があるので、自身の備忘録に残しておく。

おおまかに伝えたいことだけ先に言うと、機能ごとに関数を疎結合にし、ライフサイクルの上に乗せて動かすように意識すると良い。ここではObjective-Cで書いているがこれに限ったことではない。

#やりたいこと
ViewやModel、Controllerなどを最小単位として列挙することで、あとで各処理を見直す際に確認が容易になる。処理を最小単位に書くことで同時に認識しやすくなり、保守が比較的楽になる。

ご指摘あればよろしくお願いします。

#ポイント
+ viewDidLoadで余計な初期化をしない
+ 1 機能につき1 functionを定義する（ケースによるが）
+ pragmaを正しく記載する
+ 最小単位に処理を分けて関数化することでユニット単位でテストができる

#手順
+ 各処理を最小単位で関数化し記述する
+ pragmaを記載する

```ViewController.h
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
// importは必要最小限

@interface ViewController : UIViewController
// 他クラスから参照する必要がある部品以外はヘッダに書かない
@end
```

```ViewController.m
#import "ViewController.h"

@interface ViewController ()<UITableViewDelegate, UITableViewDataSource>

@property (nonatomic, strong) UITableView *tableView;
@property (nonatomic, strong) NSMutableArray *data;

@implementation ViewController

#pragma mark - Life Cycle // pragmaを書くことでXCode上から定義関数がインデックスされる
- (void)viewDidLoad
{
   // 余計な初期化は行わない
   // 目的に応じてラップした関数を呼び出す
   [super viewDidLoad];
   [self getData];
   [self setView];
}

#pragma mark - UITableViewDataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
   // セクション数設定処理
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
   // cell描画処理
}
   :
#pragma mark - Private data
- (void)getData
{
   _data = @[].mutableCopy;
           :
   // データ取得処理をここに書く
   // entityクラスを別途定義する
}

#pragma mark - Private View
- (void)setView
{
   // 例えばテーブルビューのみ動作を確認したい場合に"setTableView"以外をコメントアウトすると
   // テーブルビューのみの動作確認ができる
   
   /* [self setNavigationBar]; */
   /* [self setMainView]; */
   [self setTableView];
   /* [self setToolBar]; */
}

- (void)setNavigationBar
{
   // ナビゲーションを実装する
}

- (void)setMainView
{
   // view関連の実装
}

- (void)setTableView
{
  // tableViewを実装するために必要な処理を書き出す
  _tableView = [[UITableView alloc] initWithFrame:CGrectMake(self.view.frame.origin.x,
                                                           self.view.frame.origin.y,
                                                           self.view.frame.size.with,
                                                           self.view.frame.size.height)];
  _tableView.dataSource = self;
               :
  [self.view addSubView:_tableView];
} 

- (void)setToolBar
{
  // ツールバーを実装する
}

```

#pragma
定義する関数の順序は以下の順で書くのが一般的。
それに従ってpragmaを記述する

+ Initialize
+ Life Cycle
+ Delegate
+ Gesture
+ Private

#まとめ
各関数がそれぞれ疎結合になっていると関数同士の因果関係が明確になり、どこでバグが出ているのかを追いやすくなる。
Railsから入った人へ【attr_accessor】って？

# こっちを参考にしてください

この記事もとても分かりやすいです。
Rubyのattr_accessorって何？[和訳]
http://bryankawa.hatenablog.com/entry/2017/01/28/150537

#まとめ

migrationでオブジェクトのもつ属性を定義することと(✭ほぼ)同義
書き込みも読み込みもできる。

✭ migration で定義した型は静的だが、attr_accessorの型は動的に決まる

#良くある説明

```rb
def title=(t)
  @title = t
end

def title
  @title
end
```
は

```rb
attr_accessor :title
```
と短く書ける。。。

最初見た時、すんなり理解できました？
私は3時間ぐらい空を仰ぎました。
改めて、Railsのmigrationと比較して考えたらスッキリしたのでまとめます。

#RailsからRubyに入った人への説明

例えば、name,descriptionという属性を持つUserオブジェクトを定義しようとすると


```db/migrate/20160304060143_create_users.rb
class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :name
      t.string :description

      t.timestamps null: false
    end
  end
end
```

Railsでは上記の様な migration ファイルを作成しますが
DBを扱わない純粋なRubyのコードでは、

```rb
class User
  attr_accessor :name, :description
end
```

と書くことが出来ます！！
↑の migration ファイルの場合、name, description の型は String 型から変わらない

つまり、どちらも

```rb
user = User.new
user.name = "hassan"
```
このようにオブジェクトの属性に値を代入することができる。
attr_accessor は、型に縛られず値を入れることができます。
(テーブルのカラム=オブジェクトの属性)をクラスの中で定義しているイメージ。

この路線から入る場合、
attr_accessorの型はどうなっているのか確認してみよう。

#確認

```rb
class User
  attr_accessor :name, :description

  def print_upcase
    puts name.upcase
  end
end
```

```rb
user = User.new
=> #<User:0x007fb7f9bbd2b8>

user.name = "hassan"
=> "hassan"

user.description = "将来有望"
=> "将来有望"

user.name = true
=> true

user.name = 12
=> 12

user.print_upcase
NoMethodError: undefined method `upcase' for 12:Fixnum

user.name = "hassan"
=> "hassan"

user.print_upcase
=> HASSAN
```

型は動的です(ここで、良くある説明のコードを見なおしてみると納得)

#attr_accessorの利用用途
・読み取りも書き込みもできるオブジェクトの属性を定義したい時

ちなみに `attr_reader` は読み出し専用の属性を定義したいときに使い、
`attr_writer` は書き込み専用の属性を定義したいときに使う。

## 補足

厳密には migration は DB のテーブルとカラムを定義するときに使っていますが、Rails では対応する Model を作成すると明示的に attr_accessor を定義しなくてもテーブルのカラムを属性として扱えます。
Strategyパターン

## 概要
振る舞いに関するデザインパターン。
Strategyは英語で「戦略」。ここでいう「戦略」とはアルゴリズム(一連の処理)のこと。

Strategyパターンはアルゴリズムを分離(クラス化)することで、
処理の切り替えをしていこうとする考えかた。

## コードの実装例
以下参照

* [TechScore　10. Strategy パターン](http://www.techscore.com/tech/DesignPattern/Strategy.html/) (引用：TechScore)


## メリットのまとめ

* 処理をクラス化して分離しておくことで、追加の実装や変更による影響が限定される


## Template Methodパターンと違う所
解決方法はちがうけれど、似ている問題はTemplate Methodパターンでも解決できる。
Template Methodパターンは、親クラスに不変の抽象的な処理を記述し、継承した子クラスが具体的な実装をして、アルゴリズムの変更に対応するものだった。Template Methodを利用することで、重複している処理を記述せずに実装することができたが、問題は、継承しているため親クラスに依存をしてしまっていること。
Strategeパターンは、継承を行わずにアルゴリズムに対応するパターン。継承じゃなくて委譲を利用するのでStrategyのほうがより影響範囲が限定されている。
納品されたiOSアプリの署名が違う、別の署名を変えたい時に見るページ

納品されたやつの署名が間違ってたり、配布したいんだけど、Device Idが登録されてないやつで署名されてるという時は以下を使って簡単に付け替えが可能です


# fastlane (sigh)
https://github.com/fastlane/fastlane/tree/master/sigh

新しいprovisioningファイルを用意して
```
sigh resign monosugoi-game.ipa  -p ./adhoc.mobileprovision
```
とすると付け替えが可能です。あとはitunesにuploadしたり,deploygateにあげたりしてください。
Java SE7 Gold 取得を目指して (8)

Java SE7 Gold をとりたい…!
===

本日は第8回目です。
6章の残り半分を進めました。

## 今日のこぼれ話
勉強で使っている参考書は全11章なので、折り返しといったところでしょうか。
やはりどこかへアウトプットすると、一人で勉強していても心細くならずに済みますね。
これから後半へ行くほど聞いたことのないワードがあふれてくると思いますが、めげずに早起きしていきます。

## 本日知ったこと(6章 2/2)

* Comparable
  * 自分と他オブジェクトを並び替えるためのインタフェース
  * `compareTo(T o)`を実装
  * TreeSetへ格納する際、要素が実装していないと実行時エラー

    比較結果|戻り値
    :---|:---:
    自オブジェクト < 比較対象 | 負の数
    自オブジェクト = 比較対象 | 0
    自オブジェクト > 比較対象 | 正の数

  * SortedSet や SortedMap でComparableを実装したオブジェクトを管理する場合、同値性のチェックは`compareTo()`で行う

* Comparator
  * 2つのオブジェクトを並び替えるためのインタフェース
  * ソート対象のオブジェクトと並び替えルールを独立させて定義している
  * `compare(T o1, T o2)`を実装

    比較結果|戻り値
    :---|:---:
    o1 < o2 | 負の数
    o1 = o2 | 0
    o1 > o2 | 正の数

  * SortedSet や SortedMap でComparatorを実装したオブジェクトを管理する場合、同値性のチェックは`compare()`で行う

* Collections
  * `static <T extends Comparable<? super T>> void sort(List<T> list)`   
     * 自然順序付けで昇順ソート
  * `static <T> void sort(List<T> list, Comparator<? super T> c)`  
     * 指定されたコンパレータによってソート  
     * 第2引数がnullだと自然順序

* Arrays
  * `static void sort(int[] a)`  
     * int型の配列をソート
  * `static void sort(Object[] o)`  
     * 自然順序付けで昇順ソート  
     * 要素がすべてComparableを実装している必要がある  
     * 配列内に複数の参照型を入れているとClassCastException
  * `static <T> void sort(T[] a, Comparator<? super T> c)`  
     * 指定されたコンパレータによってソート  
     * 第2引数がnullだと自然順序 
     * 配列内に複数の参照型を入れているとClassCastException
  * `asList(T... a)`  
     * 固定サイズのリストへ変換
     * 要素の上書きはできるが、追加/削除はできない(UnsupportedOperationException)
  * `binarySearch(int[] a, int key)`, `binarySearch(Object[] o, Object key)`  
     * 配列から指定の要素を検索し、インデックスを返す(見つからない場合は負の値)  
     * 呼び出し前にソートしておかないと結果は保証されない  
     * Comparatorを使ってソートしていた場合、`binarySearch()`の第3引数に同じComparatorを渡さないと結果は保証されない  
     * Collectionsにも同様のメソッドがある


Comparableは自分を並び替え、Comparatorは他人を並び替え、というのは
OCJP Gold SE 7 認定資格試験 ポイント解説セミナー(今も開催しているのかは謎です)で聞いた解説です。
受講した当時はとてもやる気になって、ひと月以内に受験しようなんて思っていたのですが、あれから早幾月…。
GCPUG Tokyo Firebase祭りに参加しました

# 勉強会の基本情報

* 【日　時】2016/03/08(火) 19:00 〜 22:00
* 【会　場】イベント＆コミュニティスペース dots.
* 【参加費】無料
* 【主　催】GCPUG
* 【申し込み】http://eventdots.jp/event/579264


# 概要

* Firebase only会


# セッションと資料

* Firebase Overview by Ian Lewis
 * 見つからなかった
* JavaScriptから利用するFirebase by 下川拓治
 * http://www.slideshare.net/tsimo/javascriptfirebase-59251680
* Androidから利用するFirebase by 白山文彦
 * https://speakerdeck.com/srym/firebase-with-android
* iOSから利用するFirebase by 山本洸希
 * https://www.icloud.com/keynote/000hHAgva67nJNNFqaqz0_Rew#firebase
* サーバーサイドから利用するFirebase by 山下大介
 * https://speakerdeck.com/dddaisuke/sahasaitokarali-yong-surufirebase
Ubuntuでpandocを使ってMarkdownをRedmineのwikiにする

Makrdownで書かれたドキュメントをRedmineのwikiに書きたいけど書きなおすの面倒だなーと思っていたらpandocというCLIがあり、便利だったのでメモ

# 参考

+ [pandocでmarkdownからredmineのwiki文法に変換する](http://qiita.com/ryurock/items/cf7e6e251add75578d3d)


# 環境

+ Ubuntu 14.04 LTS

# インストール

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

# 変換してみる

```bash
$pandoc -s -S markdown.md -t textile -o markdown.textile
```

# (オプション)標準出力からクリップボードでコピーする

CLIから標準出力の内容をクリップボードでコピーする。

[Macのpbcopyをubuntuでも使う](http://qiita.com/yoshikyoto/items/1676b925580717c0a443)


```bash
# Ubuntuではxselというパッケージを使う
$sudo apt-get install xsel

# こんな感じでコピーできる
$cat markdown.textile | xsel --clipboard --input
```

長いので`~/.bahsrc`にaliasを書いておくと簡単に使える

```
$alias pbcopy='xsel --clipboard --input'
```