OmniAICreator/Qiita-1.07M huggingface dataset:
[blackbird-ntp] blackbird で ntpq の情報(offset, jitter等) をモニタリングする

# blackbird ntp plugin

この plugin では ntpq の出力結果から様々な情報を取得し、backend にデータを送信します

![ntp1.png](https://qiita-image-store.s3.amazonaws.com/0/40416/502c1091-5859-9d6b-a682-42c2476659b8.png)

![ntp2.png](https://qiita-image-store.s3.amazonaws.com/0/40416/5dbb40f6-dfe4-9a92-e691-14a375b036c4.png)

![ntp3.png](https://qiita-image-store.s3.amazonaws.com/0/40416/db860d2d-7b6c-69ee-db39-5295299bfc55.png)


## 取得してくる項目

`ntpq -c peer` の出力結果から ntp server と参照同期している server を検出します
参照同期されている server が 1 台も無かった場合、 Trigger が上がるようにしています

```shell-session:ntpqの結果
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*10.0.0.1        133.243.238.243  2 u   52   64  377    0.489    0.066   0.388
+10.0.0.2        133.243.238.163  2 u   54   64  377    0.505   -0.007   6.133
```

この場合は `10.0.0.1` が参照同期されていますので、`10.0.0.1` の行の各種値を取得します

* remote
* refid
* stratum
* peer type (local / unicast / multicast / broadcast)
* poll
* reach
* delay
* offset
* jitter

when は取得しません

# Install

## blackbird 本体

[こちら](http://qiita.com/makocchi/items/9166016b2ad4cc43e83f)を参考に install してください

## Install ntp plugin

setup.py で入れる方法と rpm で入れる方法があります

### setup.py で install

```bash
git clone https://github.com/Vagrants/blackbird-ntp.git
cd blackbird-ntp
python setup.py install
```

### rpm で install

```bash
yum install blackbird-ntp --enablerepo=blackbird
```

# ntpq が必要

この `blackbird-ntp` は内部で `/usr/sbin/ntpq` を実行します
`ntpq` のバイナリが無い場合は入れてください

(ntp のプロトコルを python から喋るようにすれば `ntpq` は必要ないんですが・・そのうちやるかもしれません)

# plugin の設定をする

config は `/etc/blackbird/conf.d/ntp.cfg` にあります

```ini:/etc/blackbird/conf.d/ntp.cfg
[ntp]
module = 'ntp'

# ntpq path
# Default is '/usr/sbin/ntpq'
#
#path = /usr/sbin/ntpq

# ntpq target server
#
#host = 127.0.0.1

# ntpq timeout (ms)
#
#timeout = 1000

```

`ntpq` の path が違う場合は変更してください
host を設定すれば、remote のサーバーも監視することができます

監視の間隔は 60 秒(discoveryは 600 秒)がデフォルトですが、変更したい場合は

```ini:/etc/blackbird/conf.d/fio_status.cfg
interval = 30
lld_interval = 300
```

のように指定してください

設定が終わったら `blackbird` を再起動させます

```bash
sudo /etc/init.d/blackbird restart
```

# Zabbix 上でデータが入ってきているか確認する

Zabbix の Template は [github の repository](https://github.com/Vagrants/blackbird-ntp/tree/master/templates)にあります
Zabbix に import して対象のサーバーに適用させて下さい

**Zabbix 上の host 名と blackbird が起動しているサーバーの host 名が違う場合は `/etc/blackbird/conf.d/ntp.cfg` 上で hostname を設定してあげる必要があります**
Zabbix 上と合わせてください

```ini:/etc/blackbird/conf.d/ntp.cfg
hostname = your_static_hostname
```

# その他

Zabbix って時刻の同期の監視するうまい方法が今のところ用意されていないんですよね
Zabbix Server と時刻がずれているか、は agent で監視できるんですけれども
柵を修理

[Fence Repair](http://qiita.com/ukisoft/items/1600072d32ca199b0694)

PHP5.3で[優先度つきキュー](http://qiita.com/rana_kualu/items/267d818a424d5a508a8a)が実装されています。

```php
<?php
class FenceRepair{
	public static function calc(array $boards){
		if(count($boards) < 1){ return false; }
		if(count($boards) < 2){ return current($boards); }
		$cost = 0;
		
		// キューに突っ込む
		$queue = new SplPriorityQueue();
		foreach($boards as $val){
			// 取り出しは降順なので、昇順にするためにマイナス
			$queue->insert($val, -$val);
		}
		
		while(true){
			// 短い2本を取り出す
			$costt = $queue->extract() + $queue->extract();
			$cost += $costt;
			// キューが無くなったら終了
			if($queue->isEmpty()){
				return $cost;
			}
			// くっつけた後の板を挿入
			$queue->insert($costt, -$costt);
		}
	}
}

$totalcost = FenceRepair::calc([1,2,3,4,5]);
```

とっても簡単にできました。
[blackbird-fio-status] blackbird で ioDrive(Fusion-IO) をモニタリングする

# blackbird fio-status plugin

この plugin では ioDrive(Fusion-IO) の様々な情報を取得し、backend にデータを送信します

![fio1.png](https://qiita-image-store.s3.amazonaws.com/0/40416/3388da50-b0b8-edf7-0833-996947e8a828.png)

![fio2.png](https://qiita-image-store.s3.amazonaws.com/0/40416/ae089ec8-82cc-ef94-2343-062c8ef04e2c.png)

![fio3.png](https://qiita-image-store.s3.amazonaws.com/0/40416/49f887e8-e9a8-58fe-f43a-6360ba5f3ba4.png)


## 取得してくる項目

基本的には `fio-status` で取れる項目を取得します

* physical bytes read/write
* temperature
* volts / watts / amperes
* device name
* などなど

device 名は Low Level Discovery で自動的に拾うようにしています

# Install

## blackbird 本体

[こちら](http://qiita.com/makocchi/items/9166016b2ad4cc43e83f)を参考に install してください

## Install fio-status plugin

setup.py で入れる方法と rpm で入れる方法があります

### setup.py で install

```bash
git clone https://github.com/Vagrants/blackbird-fio-status.git
cd blackbird-fio-status
python setup.py install
```

### rpm で install

```bash
yum install blackbird-fio-status --enablerepo=blackbird
```

# `fio-status` の実行には root 権限が必要なので

この blackbird-fio-status を使う場合は下記の何れかの方法で `fio-status` を実行できるようにする必要があります


## blackbird 実行ユーザーに対し sudo 権限を与える

内部では sudo fio-status を実行していますので、sudoers で blackbird 実行ユーザー(default は bbd)に対して権限を与えてください

```:/etc/sudoers.d/bbd
Defaults:bbd !requiretty
bbd ALL=(ALL) NOPASSWD: /usr/bin/fio-status
```

## blackbird を root で動かす

blackbird 本体の設定で root 権限で実行させるようにします

```ini:/etc/blackbird/defaults.cfg
[global]
user = root
group = root
```

# plugin の設定をする

config は `/etc/blackbird/conf.d/fio_status.cfg` にあります

```ini:/etc/blackbird/conf.d/fio-status.cfg
[fio-status]
module = fio_status

# fio-status location. default is '/usr/bin/fio-status'
#
#path = /usr/bin/fio-status

```

`fio-status` の path が違う場合は変更してください

監視の間隔は 60 秒(discoveryは 600 秒)がデフォルトですが、変更したい場合は

```ini:/etc/blackbird/conf.d/fio_status.cfg
interval = 30
lld_interval = 300
```

のように指定してください

設定が終わったら `blackbird` を再起動させます

```bash
sudo /etc/init.d/blackbird restart
```

# Zabbix 上でデータが入ってきているか確認する

Zabbix の Template は [github の repository](https://github.com/Vagrants/blackbird-fio-status/tree/master/templates)にあります
Zabbix に import して対象のサーバーに適用させて下さい
この Tempalte はほとんどが LLD のアイテムですので、実際にデータに出てくるまでちょっと時間かかるかもしれません

**Zabbix 上の host 名と blackbird が起動しているサーバーの host 名が違う場合は `/etc/blackbird/conf.d/fio_status.cfg` 上で hostname を設定してあげる必要があります**
Zabbix 上と合わせてください

```ini:/etc/blackbird/conf.d/fio_status.cfg
hostname = your_static_hostname
```
slimに直接JavaScriptを記述する方法

![](https://qiita-image-store.s3.amazonaws.com/0/63640/3c15bea4-7567-553d-6fc9-ba1a34e02810.png "logofix.png")

わたしは普段、生のhtmlではなくてslimというhtmlのテンプレートを使ってhtmlを書いています。
サイト制作の時にJavaScriptを書く必要がありましたが、短いコードだったので直接書くことに！でも、書き方がわからない(>o<)！！
普通に書いても反映されないのです。。

## javascript:　でOK!!
ふだんは`<script></script>`で囲っているJavaScriptですが、slimに書き込む場合は`<script></script>`は使わないらしいのです！
javascript:とインデントを使って記述します。
![スクリーンショット 2015-01-09 22.22.05.png](https://qiita-image-store.s3.amazonaws.com/0/63640/fa8fdfd6-9b38-e723-b071-1e30fe209b64.png "スクリーンショット 2015-01-09 22.22.05.png")

かなり悩まされたのにすごく簡単でした。。(>ω<)
パーマリンクを設定してから投稿記事が表示できないとき確認点


WordPressのお話。

mod_rewriteもちゃんとインストールされているようであれば、Apacheの設定ファイルを確認しましょう。

## 確認箇所

```httpd.conf
<Directory />
    Options FollowSymLinks
    AllowOverride None
</Directory>
 ```
 
 このように`AllowOverride None`の場合は、
 
`AllowOverride All`

に変更してから`sudo service httpd restart`すると表示できるようになります。

念のためwwwフォルダのDirectoryセクションでも、`AllowOverride None`が設定されていないかも確認しましょう。

<b style="color:red">これで、4時間はまった。</b>
【ターミナル恐怖症】Rubyのバージョンを確認して、バージョンアップをする方法

![](https://qiita-image-store.s3.amazonaws.com/0/63640/3c15bea4-7567-553d-6fc9-ba1a34e02810.png "logofix.png")
ターミナルにコマンドを打って、slimをhtmlにコンパイル(変換)しようとしたら2.1.5にする必要があるというメッセージが出てきました！Rubyのバージョンが古くてコンパイルできなかったようです(>o<)
今までターミナル恐怖症だったので自分でバージョンをいじったりしたことはありませんでしたが、勇気を出してチャレンジしてみたのでここにメモします！

## Rubyのバージョンを確認する
ターミナルを開いて「ruby --vertion」というコマンドを打ちます。
すると、現在のバージョンが表示されます。

**あなたのパソコンの名前 $ ruby --version
ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-darwin13.0]**

## インストールできるRubyのバージョンをリストを表示させる
コマンド「rbenv install --list」
**あなたのパソコンの名前 $ rbenv install --list
Available versions:
  1.8.6-p383
  1.8.6-p420
  1.8.7-p249
  1.8.7-p302
  1.8.7-p334
  1.8.7-p352
  1.8.7-p357
  1.8.7-p358
  1.8.7-p370
  1.8.7-p371
  1.8.7-p374
  1.8.7-p375
  1.9.1-p378
  1.9.1-p430
  1.9.2-p0
  1.9.2-p180
  1.9.2-p290
  1.9.2-p318
  1.9.2-p320
  1.9.2-p326
  1.9.2-p330
  1.9.3-dev
  1.9.3-preview1
  1.9.3-rc1
  1.9.3-p0
  1.9.3-p125
  1.9.3-p194
  1.9.3-p286
  1.9.3-p327
  1.9.3-p362
  1.9.3-p374
  1.9.3-p385
  1.9.3-p392
  1.9.3-p429
  1.9.3-p448
  1.9.3-p484
  1.9.3-p545
  1.9.3-p547
  1.9.3-p550
  1.9.3-p551
  2.0.0-dev
  2.0.0-preview1
  2.0.0-preview2
  2.0.0-rc1
  2.0.0-rc2
  2.0.0-p0
  2.0.0-p195
  2.0.0-p247
  2.0.0-p353
  2.0.0-p451
  2.0.0-p481
  2.0.0-p576
  2.0.0-p594
  2.0.0-p598
  2.1.0-dev
  2.1.0-preview1
  2.1.0-preview2
  2.1.0-rc1
  2.1.0
  2.1.1
  2.1.2
  2.1.3
  2.1.4
  2.1.5
  2.2.0-dev
  2.2.0-preview1
  jruby-1.5.6
  jruby-1.6.3
  jruby-1.6.4
  jruby-1.6.5
  jruby-1.6.5.1
  jruby-1.6.6
  jruby-1.6.7
  jruby-1.6.7.2
  jruby-1.6.8
  jruby-1.7.0-preview1
  jruby-1.7.0-preview2
  jruby-1.7.0-rc1
  jruby-1.7.0-rc2
  jruby-1.7.0
  jruby-1.7.1
  jruby-1.7.2
  jruby-1.7.3
  jruby-1.7.4
  jruby-1.7.5
  jruby-1.7.6
  jruby-1.7.7
  jruby-1.7.8
  jruby-1.7.9
  jruby-1.7.10
  jruby-1.7.11
  jruby-1.7.12
  jruby-1.7.13
  jruby-1.7.14
  jruby-1.7.15
  jruby-1.7.16
  jruby-1.7.16.1
  jruby-9000-dev
  jruby-9000+graal-dev
  maglev-1.0.0
  maglev-1.1.0-dev
  maglev-2.0.0-dev
  mruby-dev
  mruby-1.0.0
  rbx-1.2.4
  rbx-2.0.0-dev
  rbx-2.0.0-rc1
  rbx-2.0.0
  rbx-2.1.0
  rbx-2.1.1
  rbx-2.2.0
  rbx-2.2.1
  rbx-2.2.2
  rbx-2.2.3
  rbx-2.2.4
  rbx-2.2.5
  rbx-2.2.6
  rbx-2.2.7
  rbx-2.2.9
  rbx-2.2.10
  ree-1.8.6-2009.06
  ree-1.8.7-2009.09
  ree-1.8.7-2009.10
  ree-1.8.7-2010.01
  ree-1.8.7-2010.02
  ree-1.8.7-2011.03
  ree-1.8.7-2011.12
  ree-1.8.7-2012.01
  ree-1.8.7-2012.02
  topaz-dev**

わー！いっぱい出てきました(;>o<)
この中にslimをコンパイルしようとした時に必要なバージョン2.1.5を発見！

## 新しいバージョンを指定してインストールする
コマンド「rbenv install 2.1.5」

**あなたのパソコンの名前$ rbenv install 2.1.5
rbenv: /Users/Pippi/.rbenv/versions/2.1.5 already exists
continue with installation? (y/N)**
あれれー既にインストールされていたようです。
もう一度インストールし直す場合はyを入力！
このままで良い場合はnを入力します。

## 自分のパソコン(ローカル)のディレクトリにRubyのバージョンを指定する
githubで管理しているディレクトリだったので、ローカルディレクトリにだけRubyのバージョンアップを適用させることにしました。
コマンド「rbenv local 2.1.5」

ちなみにどこのディレクトリでも同じバージョンを適用させたい場合は
コマンド「rbenv global 2.1.5」
Redmine@OpenShiftインストール手順(openshift-redmine-quickstart)

個人的なタスク管理ツールについて、Google Tasks、Wunderlist、Toodledo、Remember the milk、付箋紙などなどいろいろ乗り換えてきましたが、ここ2年ほどはRedmineで運用しています(Redmineがタスク管理ツールかどうかは置いておいて)。当初はさくらVPS、次に(短期間だけど)Digital Oceanで稼働させていましたが、今はOpenShiftで稼働させています。
OpenShiftのメリットはいろいろありますがそれは別記事で述べるとして、ここではOpenShiftにRedmineをインストールする手順を説明します。

# 前提

* あらかじめ、OpenShiftに会員登録しておきます。
* git、Rubyを使用するので、インストールしておきます。
* rhcというgemをインストールしておきます。

# 作業手順

手順というほどのことはなく、[openshift/openshift-redmine-quickstart](https://github.com/openshift/openshift-redmine-quickstart)の手順に従って作業を行うだけです。特につまづくこともなく、非常に簡単にインストールできます。

# 備考

当時はこの手順が一番簡単だと思いましたが、今はもっと簡単な手順があるようです。

* [Ruby読めない僕が紹介する、Redmineを基本無料で構築する方法(初級編) - Qiita](http://qiita.com/koh-taka@github/items/efd5fd52b475a8863436)
3dsMAXphysx重心について

Physx モディファイヤの

Center OF　MASS　を使うと重心を変えられる。
HULL　は衝突判定のもとになる物

回転の初速度、は回転をかけたい方向へ。
移動の初速度を下へ。（動かしたい位置は基点により変化）
Center OF　MASSとかけ合わせて、どこが重いのか
決める事が出来る。

因みにこのオブジェクト
の場合だと起き上がりこぼしのようなものも作成てきた。

![写真.jpg](https://qiita-image-store.s3.amazonaws.com/0/64856/a53a813f-30f9-4290-2a0a-ffcb5f0b3670.jpeg)
開発環境を手軽に持ち歩くという発想

あけましておめでとうございます！
2015年。なんか５で割り切れるキリが良い数字の年ですね。

皆さんは普段どういった環境で仕事や開発をされているでしょうか。
私は、Androidの開発を主に担当させていただくことが多いので、Androidの開発環境を
常に持ち歩いています。
とはいっても、開発に必要なものはこれだけです！

![DSC_0020.JPG](https://qiita-image-store.s3.amazonaws.com/0/61161/8f6a3c61-db5d-2c92-c827-68c4cfb7bde1.jpeg)

はい、USBメモリだけです。
後ろのMacは気にしないでくださいねw

コレにLinuxを入れて持ち歩いています。
これだけで、マシンさえあればいつでもどこでもAndroidの開発を行うことが出来ます。


では、簡単にUSBメモリへLinuxを入れる方法を記載します！
例では、VMWare Fusionを例にとって説明しますが、基本VritualBoxを使用しても
似たような手順になります。

まず、

1.USBメモリをMacにさす！
2.VM環境を構築します！
![1.png](https://qiita-image-store.s3.amazonaws.com/0/61161/80a519b5-7aca-ab1e-6ecf-9ad6dfa4a6e4.png)

![2.png](https://qiita-image-store.s3.amazonaws.com/0/61161/d1b2cdbd-3062-ad17-cd4d-a645929bac5b.png)

こんな感じで。
私は、どのマシンででも動かせられるように32bitをインストールしています。

3.インストール準備
おっとここで、一つコツがあります！
CD/DVDを
UbuntuサイトからDLしたISOイメージを直接指定します。
こうすることで、すぐにインストール＆起動が出来るためです。
写真では64bitのイメージを使用しています。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/61161/4a2b1b6d-4cbd-6e25-aa5c-3d388643fa6d.png)

![4.png](https://qiita-image-store.s3.amazonaws.com/0/61161/b340177e-4e7d-09f8-29ac-a151f4288750.png)

可能ならば、Virtual HDDも外しておく方が、インストール時に迷わなくて良いかもしれないです。
VMware Fusionは最低一つはVirtual HDDが必要みたいだったのでそのままインストールします。

4.起動
![5.png](https://qiita-image-store.s3.amazonaws.com/0/61161/09cd3a56-a732-5c90-b4f6-e1dc9ae79e8e.png)

![6.png](https://qiita-image-store.s3.amazonaws.com/0/61161/2339bb5f-9e42-3e40-3046-f454cb6cbf10.png)

こんな感じで。
後は促されるママインストール！
ここでちょっとしたコツ！！！
インストール先を必ずUSBに指定してくださいね！！！

5.Android Studioのインストール
まずJDKを入れます。
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
JDKも1.8になって、ラムダ式が使えるようになったみたいですね！

JDKをインストール後、
https://developer.android.com/sdk/installing/index.html
Android Studioをインストール！
Android Studioは解凍して適当な位置にコピーするだけみたいです。
後は、Android SDK Tools等のインストールを促されるままにインストールするだけで、
もう開発環境がUSBメモリに出来ちゃいます！！！

コレを持ち歩きさえすれば、ネットカフェのマシンであっても、USB起動さえ出来れば、
開発環境が立ち上がります！

すんごい便利なのでおためしあれ〜！

ちなみに、私は、Ubuntuにgitも入れています。
Chromebookでもブート出来るようなので（私の持っているDellでは今のところ出来ていません）、
重いPCを持ち歩かなくて済みますね！

あ、ちなみに、Macで起動する場合は、
http://packages.ubuntu.com/raring/bcmwl-kernel-source
ここあたりから、WiFiのドライバをあらかじめインストールしておけば、Macで起動させて
WiFiにつなげることも出来ます。


6.さらに
http://www.rodsbooks.com/refind/yosemite.html
Macにあらかじめこういうものをインストールしておけば、広い画面でも使えるように
なるみたいです！


これで皆さんも重い開発マシンと持ち歩かずに、開発出来るようになりますね！！！
node.jsでrequireする時の'../../../hoge'と決別するmoduleを作りました

名前は**rrq**です。root requireの略です。  
前置きはいいから早くしろ、という方はこちらへ。

[rrq (npm)](https://www.npmjs.com/package/rrq)

[rrq (github)](https://github.com/mick-whats/rrq)

## 概要
nodeで自作モジュールを読み込む時に

```js
var hoge = require('../../mymodule/hoge')
```

みたいな書き方をしますよね。  
この相対パスがよくわからない。  
`../`を入れたり消したりしながら動かしてイライラする。


```js
var hoge = require('mymodule/hoge')
```

↑こんな感じで書きたい。

それができるようになるのが**rrq**です。

## インストール

プロジェクトのルートディレクトリに移動してインストールします。

```bash
cd [プロジェクトのパス]
npm install rrq
```

インストール後、プロジェクトルートに[.rrqrc]というファイルを作成します。空で構いません。  

```zsh
touch .rrqrc
```

このファイルのある場所をルートと認識してパスを解析します。

* ファイル名は[.rrqrc]でなくても[.rrq]で始まるものならなんでも構いません。
* 例[.rrq][.rrqrc][.rrq.conf.yaml]等

## 使い方

### rrq(path)

```coffee
rrq = require('rrq').require2

# requireを使った場合
c = require('../../pathTest/c/cc/c')

# rrqを使った場合
c = rrq('pathTest/c/cc/c')
```
これでrequireできます。

また、requireするための相対パスだけ取得したい場合は以下のメソッドを使います。

### requirePath(from,to)

```coffee
rq = require('rrq')
rq.requirePath(__dirname,'pathTest/c/cc/c')
# ../../pathTest/c/cc/c
```

### projectRoot()

ルートディレクトリのパスを取得するメソッドもあります。

```coffee
rq = require('rrq')
root = rq.projectRoot()
console.log root

# /Users/hoge/path/to/myProject
```

## contact
質問、要望、バグレポートはこちらへお願いします。

[Issues · mick-whats/rrq](https://github.com/mick-whats/rrq/issues)

もしお褒めの言葉など御座いましたら[@_wats](https://twitter.com/_wats)まで頂けましたら泣いて喜びます。
MULTI FASTA


perl のワンライナーに関しての、適当な解説 [#1](http://qiita.com/bunzaemon/items/fdb1115ac97fc0955236)/[#2](http://qiita.com/bunzaemon/items/e63947c7e59e0fe4ce3d)/[#3](http://qiita.com/bunzaemon/items/efcb3f20329bc68bb8bc)/#4


## 大文字に、小文字に。
```bash:
$ perl -lpe '$_ = uc if !/>/ ' seq.fa
```

このコードは塩基配列に改行が入っていても使える <= 当たり前。

小文字にするなら `uc` を `lc` にするだけ。
多少分ってる人なら「なんで `-l` を残す！」と突っ込みが入りそうですが、、、



## reverse&complement #1
改行込みの塩基配列では使えません。

```bash:
$ perl -lpe '( $_ = reverse ) =~ tr/ACGT/TGCA/ if !/>/ ' seq.fa
```

これを `-l` 抜きでやってみれば分ります。
面倒なので、よほどの必要が無い限り `-l` 付きです。

* `reverse` は、このケースでは `$_` を逆順に出力。注意点は後述。
* `tr/ACGT/TGCA/` は塩基配列中の A => T, T => A, C => G, G => C の置換を同時に行なう。

## reverse&complement #2
改行込みの塩基配列ならば。

```bash:
$ perl -F'(?=>)' -0777 -ane 'for ( @F ){ my @s = split /\n/ ; ( my $s = reverse  @s[1..$#s] ) =~ tr/ACGT/TGCA/ ; $s =~ s/(.{1,60})/$1\n/g ; print join "\n", $s[0], $s }' seq.fa
```

* 定型文を分割するなら、丸呑みは常套手段
* しかし分割の `-F'REGEX'` には工夫が必要となる
    * 先読み、後読み言明に関しては[ここ](http://blog.livedoor.jp/dankogai/archives/50820912.html)
* `s/(.{1,60})/$1\n/g` によって 60base 区切りで改行を入れる
* 難読になる
* メモリ食い（まあ、今時、、、）

### reverse は鬼門
perl の関数はリストコンテキストとスカラコンテキストで挙動が変わるものが多々あるが、 bioinformatics な人にとって最初のトラップが reverse じゃないかと思う


```bash:list
$ perl -le 'print reverse q{aababc}'
aababc
```
リストコンテキストだと、「要素の逆順」を実行

```bash:scalar
$ perl -le 'print scalar reverse q{aababc}'
cbabaa
```

なのでスカラコンテキストに強制的にしないといけない

```bash:scalar
$ perl -le 'print + reverse q{aababc}'
aababc
```
単項演算子の `+` が単項演算子の `scalar` とほぼ同等のものと思って使うと、更にドツボに嵌る



>reverse LIST
リストコンテキストでは、LIST を構成するよ要素を逆順に並べた リスト値を返します。 スカラコンテキストでは、LIST の要素を連結して、 全ての文字を逆順にした文字列を返します。
[引用元](http://perldoc.jp/func/reverse)

そもそも最初っから VARIABLE を相手にしていない。のに、、、

>スカラコンテキストで引数なしで使うと、reverse() は $_ を逆順にします。

んな挙動付けるから、 VARIABLE 相手がメインな関数だと思い込んじゃう。




## multi fasta => single fasta #1
ヘッダをファイル名として、展開するワンライナー
ファスタヘッダに '/' などの記号が含まれていないものとする。


```bash:
$ perl -Mvars='$f' -lne 'open $f, q{>}, $1 . q{.fa} if /^>(.*?)$/ ; print {$f} $_' seq.fa
```

このコードは塩基配列に改行が入っていても使える。

* 定型文を分割する場合は、パターンでオープンするファイルハンドルを切り替えるだけなので楽。
    * blast やらなんやら、、、
* `close $f` しないのは、明かにお行儀が悪いけど、一行野郎なので目を瞑る。


## multi fasta => single fasta #2
ついでに、もいっこ。

```bash:
$ perl -F'(?=>)' -0777 -ane 'for( @F ){ open my $f, q{>}, $1 . q{.fa} if /^>(.*?)\n/s; print {$f} q{>} . $_ }' seq.fa
```

次回へ
２つのインスタンスの差分を抽出したい(SEQUENCE,FUNCTION,PROCEDURE,VIEWのSELECT文いろいろ)

#背景

２つのインスタンスの差分を抽出するため比較のツールを色々見てみたところピンとこない・・・(；´∀｀)
悩んでる時間もない・・・(；´Д｀)

・・・それぞれselectして比較したらいいか。

と、いうわけでselectするのに使用したSQLをずらずらっとまとめます。

#使用したSQL

ひとまず今回使用したSQL達。
今後SELECT系SQLはひとまとめにして書き留めたいですが、こういうときに使ったって記録になるので残しておきます。


```SQL:select.sql

--シーケンス一覧取得
SELECT SEQUENCE_NAME,MIN_VALUE,MAX_VALUE,INCREMENT_BY,CYCLE_FLAG FROM USER_SEQUENCES ORDER BY 1;

--ストアドプロシージャ、ファンクション一覧取得
SELECT OBJECT_NAME NAME FROM USER_OBJECTS WHERE OBJECT_TYPE IN ('FUNCTION','PROCEDURE') ORDER BY 1;

--ストアドプロシージャ、ファンクションのソース取得
SELECT * FROM USER_SOURCE ORDER BY NAME,LINE;

--ビュー一覧取得
SELECT VIEW_NAME,TEXT_LENGTH,VIEW_NAME TABLE_NAME FROM user_views;

--ビューのソース取得
SELECT * FROM USER_VIEWS;

```

とりあえずターゲットのインスタンス×２はシーケンス等の数が少ないので、結果をExcelに貼り付けてdiffとろう。。。
超原始的(；´Д｀)
perl のワンライナーの初歩 #1


perl のワンライナーに関しての、適当な解説 #1/[#2](http://qiita.com/bunzaemon/items/e63947c7e59e0fe4ce3d)/[#3](http://qiita.com/bunzaemon/items/efcb3f20329bc68bb8bc)/#4

##### まず
公開前に、他のスニペットストックを見返して、あまりにも不親切なので、本当に、ざっとした解説を書こうかと思った。

[ここ](http://perldoc.jp/docs/perl/5.20.1/perlrun.pod)を読めって内容ですけど。

## -e 'CODE'
```bash:
$ perl -e 'CODE'
```
コードを実行

## -le 'CODE'
```bash:
$ perl -le 'CODE'
```
後述 `-n`, `-p` と組合さった時には自動的に `chomp $_` を実行
`print` 出力時改行を自動的に付随
`printf` には改行が付かない

## -ne 'CODE'
`-n` は以下のコードと同義

```perl:
LINE: while (defined($_ = <ARGV>)) {
    CODE;
}
```

文字通り「同義」なので、`LINE` ラベルも遠慮無く使おう

```bash:
$ perl -lne 'print and last LINE ' SOMETING.txt
```

## -pe 'CODE'
`-p` は以下のコードと同義

```perl:
LINE: while (defined($_ = <ARGV>)) {
    CODE;
}
continue {
    die "-p destination: $!\n" unless print $_;
}
```

## -ne 'CODE A }{ CODE B'
CODE に `CODE A }{ CODE B` と埋め込めば、

```perl:
LINE: while (defined($_ = <ARGV>)) {
    CODE A;
}
{
    CODE B;
}
```
と、ブロック区切りが挿入されて while ループと裸のブロックが一つ出来る。普通にブロックなので、ラベルも付ける事が出来るし、
例えば、continue ブロックにしたければ、

```bash:
$ perl -ne 'CODE A} continue { CODE B'
```

と書けば良い。

```bash:
$ perl -ne 'CODE A} for( @ARR ){ CODE B'
```

や、

```bash:
$ perl -ne 'CODE A} print "job end" ; {'
```

なども当然可能。

## -pe 'CODE A  }{ CODE B' は？

```bash:
$ perl -lpe '} L:{ $_ = q{foobar}' SOMETHING.txt
```
`-p` のコンティニューブロックが裸のブロック（上では`L:{ $_ = q{foobar} }`）に付く。
`-p` はコンティニューブロック中に `print $_` する。従って、当然の帰結として、上記 L ブロック中で、 `$_` が未定義であれば、エラー表示される（`use warnings` 指定時）。

トリッキーが重なるだけで、あまりにもメリットがない。

## 複数行に渡るワンライナー

矛盾してますが。
~~最初に全てのオプションを記載した後は、~~ `'` で締めて、改めて `-e` を指定してやる事により、任意のタイミングで区切る事が可能。流石に、関数名の途中とかでは無理ですが。

```bash:
$ perl -le 'for' -e '( 1,2,3,4)' -e '{ warn $_ }'
1 at -e line 3.
2 at -e line 3.
3 at -e line 3.
4 at -e line 3.
```
これを利用するとエラーした時の、ドコダヨソレ！が軽減。

```bash:
$ perl -le 'for( 1,2,3,4){ warn $_ }'
1 at -e line 1.
2 at -e line 1.
3 at -e line 1.
4 at -e line 1.
```

#### ついでに `\⏎` を利用すれば、
```bash:
$ perl -le 'for' \
>      -e  '( 1,2,3,4)' \
>      -e  '{ warn $_ }'
```
見栄え良くワンライナーを書く事が出来る。

#### もひとつついでに
ああ、何か違和感があったんだ。
最初に全てオプションを書く必要は無い
オプション書き忘れた！って時には

```bash:
$ perl -le 'for( 1,2,3,4){ warn $_ }' -pe 1  -MO=Deparse      
```

[次回](http://qiita.com/bunzaemon/items/e63947c7e59e0fe4ce3d)へ。
スワップ領域の作成


ここでは1GBのスワップ領域を作成する。

作成前

```console:
# free -m
             total       used       free     shared    buffers     cached
Mem:           992        274        717         12          0         78
-/+ buffers/cache:        195        797
Swap:            0          0          0
```
スワップ領域の作成

```console:
# dd if=/dev/zero of=/swapfile bs=1M count=1024
# mkswap /swapfile 
# swapon /swapfile 
```

作成後


```console:
# free -m
             total       used       free     shared    buffers     cached
Mem:           992        268        724         12          0         77
-/+ buffers/cache:        189        803
Swap:         1023          0       1023
```

OS起動時に有効になるようにしておく。

```console:
# echo '/swapfile swap swap defaults 0 0' >> /etc/fstab
```
MySQLサーバのスワップ対策

変更前

```console:
# sysctl vm.swappiness
vm.swappiness = 60
```

カーネルパラメータ変更

```console:
# echo 'vm.swappiness = 0' >> /etc/sysctl.conf
```

設定反映

```console:
# sysctl -p
vm.swappiness = 0
```

設定後

```console:
# sysctl vm.swappiness
vm.swappiness = 0
```

スワップ開放

```console:
# swapoff -a && swapon -a
```
例外を rescue して何か処理を挟んでもう一度その例外を raise する方法

raise $! をすると、rescue したそのままの例外が再度 raise されます。  

```ruby
def hogehoge
  begin
    # 何かの処理
    exce_status = true
  rescue
    exce_status = false
    raise $!
  ensure
    # 何かの処理
  end
end
```

あるいは、下記のような書き方もできます。

```ruby
def hogehoge
  begin
    # 何かの処理
    exce_status = true
  rescue => e
    exce_status = false
    raise e
  ensure
    # 何かの処理
  end
end
```
Ubuntu LTS 14.02をさくらVPSでを立てたメモ




こちらの記事をほぼそのまま。ありがたい。
[さくらのクラウドでUbuntu 12.04 LTSを導入して最初にする設定](http://qiita.com/tanaka51/items/cc101445a1958fa9e6f6)


# ログイン関係

デフォルトユーザを`ore` ユーザで作った。


## ssh関係 /etc/ssh/sshd_config
サーバで操作

```/etc/ssh/sshd_config
#デフォルトポートの変更例
Port 66666

#パスワード認証は不可
PasswordAuthentication no

#コメントアウト外し 公開鍵置き場
AuthorizedKeysFile      %h/.ssh/authorized_keys

#コメントアウト外し パスワード認証
PasswordAuthentication no
```

`PermitRootLogin`(ルートログイン)と `PermitEmptyPasswords`(空パスワード許可)は、始めから **no** だった


sshd再起動

```コマンド
$ sudo service ssh reload
```

## 公開鍵認証 サーバ側
サーバに公開鍵。.sshディレクトリがなかったのでそこから 

```コマンド(~/)
$ mkdir .ssh
$ chmod 700 .ssh
# ~/ore/.ssh/authorized_keysに公開鍵
$ chmod 600 .ssh/authorized_keys

````

## 公開鍵認証 ローカル側
Mac。ローカルの鍵は `~/.ssh/以下`にいい感じで。



```~/.ssh/config
Host sakura
 HostName XXX.XXX.XXX.XXX
 Port 66666
 User ore
```

これで公開鍵でssh。


```ローカル
$ ssh sakura #でログインできるようになる
```

# ネットワークまわり
## ファイヤーウォール

こちらの記事をほぼそのまま。ありがたい。

[Ubuntuでファイアウォール設定メモ](http://madroom-project.blogspot.jp/2012/12/ubuntu.html)

```サーバ
#現状確認
$ sudo ufw status
Status: inactive

#デフォルトで全てのポートを無効にする
$ sudo ufw default deny
Default incoming policy changed to 'deny'
(be sure to update your rules accordingly)

#ファイアウォールを有効化
$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

# 許可するポートを指定
$ sudo ufw allow http
$ sudo ufw allow https
$ sudo ufw allow 66666 #sshのデフォルトポート

#反映
$ sudo ufw reload
```

ファイヤーウォールの設定前後どちらでも、pingは通ってました。

```サーバ
$ ping google.co.jp
PING google.co.jp (173.194.126.247) 56(84) bytes of data.
```
jQuery UIのTabsいろいろ

#Tabsのオプション的なものをいくつか試す。
参考：http://jqueryui.com/
なお、シンプルなTabsのサンプルは前回の[「jQuery UIで作るメニューあれこれ」](http://qiita.com/NobuyaIshikawa/items/16f349c76e35e2187bb6)で触れたので割愛

##コンテンツの開閉

```
$( "#tabs" ).tabs({
  collapsible: true
});
```

collapsible: trueで展開中のタブを再度クリックするとタブが閉じる。

##マウスオーバーでの展開

```
$( "#tabs" ).tabs({
  event: "mouseover"
});
```

event: "mouseover"でポインタを乗せるとタブが開くようになる。

##タブのソート

```
var tabs = $( "#tabs" ).tabs();
tabs.find( ".ui-tabs-nav" ).sortable({
  axis: "x",
  stop: function() {
    tabs.tabs( "refresh" );
  }
});
```

タブに指定した要素の子要素の.ui-tabs-navをソート対象とする。
ちなみにこの.ui-tabs-navはjQuery UIでtabsを使ったら子要素のulに自動で付加される。
中身の説明として、
axis: "x"…横方向のドラッグ＆ドロップのみに制限
stop: function()～…ドロップしたときの挙動の設定（上記の場合、タブのドロップ場所に応じてソートしリフレッシュ）

##垂直のタブをつくる

```
$( "#tabs" ).tabs().addClass( "ui-tabs-vertical ui-helper-clearfix" );
$( "#tabs li" ).removeClass( "ui-corner-top" ).addClass( "ui-corner-left" );
```

jQuery UI側で水平タブに使用していたクラスをremoveClassで取り除き、垂直タブに必要なクラスをaddClassで足す。
多少力技感が否めないけれど参考サイトでも１カテゴリとして存在していたので参考までに。


タブは思った以上に利用したくなる機会があるのでこの辺は覚えておこうと思いました。
egrepを使ってIPアドレスかどうかをチェックするシェルスクリプト

## 概要
引数に指定した値がIPアドレスで無い場合はエラーを出力して終了。

## コード

```bash:ip_check.sh
#!/bin/bash

IP=$1
IP_CHECK=$(echo ${IP} | egrep "^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$")

if [ ! "${IP_CHECK}" ] ; then
    echo [ERROR] ${IP} is not IP Address.
    exit 1
fi

exit 0
```


## 使用例

1.1.1.1

```bash:ip_check.sh
$ sh ip_check.sh 1.1.1.1
$ 
```

1.1.1.256

```bash:ip_check.sh
$ sh ip_check.sh 1.1.1.256
[ERROR] 1.1.1.256 is not IP Address.
```

1.1.1.hoge

```bash:ip_check.sh
$ sh ip_check.sh 1.1.1.hoge
[ERROR] 1.1.1.hoge is not IP Address.
```



## 参考にさせて頂いたページ

[IPv4アドレスを正規表現で表す](http://www.arearesearch.co.jp/learn/program/07.html)

[かなり使えるPHPの正規表現まとめ](http://www.ideaxidea.com/archives/2009/03/practical_php_regexs.html)


## 更新

@Fool_Yahooman さんのご指摘でオクテットを分ける.(ドット)をエスケープしました。
Ginkgoを使ってみる

ginkgo使ってみる

## ginkgoのインストール

```shell-session:install
$ go get github.com/onsi/ginkgo/ginkgo
$ go get github.com/onsi/gomega
```

## packageディレクトリ準備

```shell-session:packageディレクトリ作成
$ mkdir $GOPATH/src/fuga
$ cd $GOPATH/src/fuga
```

```shell-session:初期化
$ ginkgo bootstrap
```
↑これでfuga_suite_test.go が生成される。

```go:fuga_suite_test.go
package fuga_test

import (
	. "github.com/onsi/ginkgo"
	. "github.com/onsi/gomega"

	"testing"
)

func TestFuga(t *testing.T) {
	RegisterFailHandler(Fail)
	RunSpecs(t, "Fuga Suite")
}
```

## テストコード実装

### 雛形生成

```shell-session:fugaのテストコード雛形生成
$ ginkgo generate fuga
```
↑これで fuga_test.go が生成される

```go:fuga_test.go
package fuga_test

import (
	. "fuga"

	. "github.com/onsi/ginkgo"
	. "github.com/onsi/gomega"
)

var _ = Describe("Fuga", func() {

})
```
"dot import" は、このパッケージ名前空間に関数やクラスをimportする。

### テストコード実装

fuga_test.go に サンプルのコードそのまま写した

```go:fuga_test.go写経版
package fuga_test

import (
	. "fuga"

	. "github.com/onsi/ginkgo"
	. "github.com/onsi/gomega"
)

var _ = Describe("Fuga", func() {
	var (
		longBook  Book
		shortBook Book
	)

	BeforeEach(func() {
		longBook = Book{
			Title:  "les Miserables",
			Author: "Victor Hugo",
			Pages:  1488,
		}

		shortBook = Book{
			Title:  "Fox In Socks",
			Author: "Dr. Seuss",
			Pages:  24,
		}
	})

	Describe("Categorizing book length", func() {
		Context("With more than 300 pages", func() {
			It("should be a novel", func() {
				Expect(longBook.CategoryByLength()).To(Equal("NOVEL"))
			})
		})
		Context("With fewer than 300 pages", func() {
			It("sould be a short story", func() {
				Expect(shortBook.CategoryByLength()).To(Equal("SHORT STORY"))
			})
		})
	})
})
```

### ライブラリ実装する

```go:fuga.go
package fuga

type Book struct {
	Title  string
	Author string
	Pages  int
}

func (b *Book) CategoryByLength() (category string) {
	if b.Pages < 300 {
		return "SHORT STORY"
	}
	if 300 < b.Pages {
		return "NOVEL"
	}
	return "OTHER"
}
```

### テスト実行

```shell-session:テスト実行
$ ginkgo
```

```shell-session:実行結果
Running Suite: Fuga Suite
=========================
Random Seed: 1419579406
Will run 2 of 2 specs

••
Ran 2 of 2 Specs in 0.004 seconds
SUCCESS! -- 2 Passed | 0 Failed | 0 Pending | 0 Skipped PASS

Ginkgo ran 1 suite in 1.395949245s
Test Suite Passed
```
テスト通った!!

## ファイル監視

```shell-session:ファイル監視
$ ginkgo watch
```
↑これで監視プロセスが起動。ファイルの更新時にテストを実行してくれる。
Goで構造体をダンプする


```go
package main

import "fmt"

import "github.com/kr/pretty"

type Node struct {
    TagName   string
    Id        string
    ClassName string
    Children  []*Node
}

func (n *Node) appendChild(child *Node) {
    n.Children = append(n.Children, child)
}

func main() {
    body := &Node{TagName: "body", Id: "main"}
    {
        header := &Node{TagName: "div", Id: "header"}
        content := &Node{TagName: "div", Id: "content"}
        footer := &Node{TagName: "div", Id: "footer"}

        body.appendChild(header)
        body.appendChild(content)
        body.appendChild(footer)

        title := &Node{TagName: "h1", Id: "title", ClassName: "title"}
        content.appendChild(title)

    }
    fmt.Printf("%v\n", pretty.Formatter(body))

    fmt.Printf("%+v\n", pretty.Formatter(body))
    fmt.Printf("%+ v\n", pretty.Formatter(body))

    fmt.Printf("%#v\n", pretty.Formatter(body))
    fmt.Printf("%# v\n", pretty.Formatter(body))

}
```

実行結果

```
&{body main  [0xc208018280 0xc2080182d0 0xc208018320]}
&{TagName:body Id:main ClassName: Children:[0xc208018280 0xc2080182d0 0xc208018320]}
&{TagName:body Id:main ClassName: Children:[ 0xc208018280  0xc2080182d0  0xc208018320]}
&main.Node{TagName:"body", Id:"main", ClassName:"", Children:[]*main.Node{(*main.Node)(0xc208018280), (*main.Node)(0xc2080182d0), (*main.Node)(0xc208018320)}}
&main.Node{
    TagName:   "body",
    Id:        "main",
    ClassName: "",
    Children:  {
        &main.Node{
            TagName:   "div",
            Id:        "header",
            ClassName: "",
            Children:  nil,
        },
        &main.Node{
            TagName:   "div",
            Id:        "content",
            ClassName: "",
            Children:  {
                &main.Node{
                    TagName:   "h1",
                    Id:        "title",
                    ClassName: "title",
                    Children:  nil,
                },
            },
        },
        &main.Node{
            TagName:   "div",
            Id:        "footer",
            ClassName: "",
            Children:  nil,
        },
    },
}
```

## 結論
```go
fmt.Printf("%# v", pretty.Formatter(obj))
```
↑これが良さそう。
awsでのログ処理についてのポエム

使ったことがない人間の妄想ポエムです。
読む場合は、注意してください。

# ログデータをAWSで処理する

Amazon AWSでログデータを処理する方法は、３パターン思いつきます。

1. S3 + SQS 
1. Kinesis
1. Data Pipeline

用途が多少違うように思えます。

- 非同期で処理するならS3 + SQS
- リアルタイムに処理するならKinesis
- 定時で処理するならData Pipeline

SQSとkinesisはどう使い分けるのでしょうか？
小規模な場合はkinesisの最低価格1000円/月オーバーなところが気になります。
といっても業務で使う分には特別高くはありません。

# Kinesis と SQSの使い分けを考える

Data Pipelineを除外するためにリアルタイムにログ処理すると仮定します。

KinesisもSQSもそれ自体はデータ処理機能はありません。
consumerを実装して、consumerでデータ処理します。

consumerは、

1. Kinesisから受け取ったデータを処理する
1. SQSからイベント受け取ったら（データ供給側が置いた）S3にあるデータを処理する

を使い分ける判断基準は何でしょう？


抽象的に考えると、

- データを入れるキュー（というかsteram）がKinesis
- イベントを入れるキューがSQS

と解釈できます。


Kinesisは初期設定とconsumerの実装が難しそうです。
SQS + S3 ではイベントとデータの経路が分かれるので運用が面倒そうです。

# 将来、Lambdaが使えるようになると

Kinesis用consumerの実装/配置がLambdaを使えば楽になりそうです。
S3イベントからも直接Lambdaが呼べます。上記の使い方ではSQSはいらなくなります。

「現状はリアルタイムログ解析には帯に短し襷に長しなのでLambdaが作られた」ような気がしてきました。
GoogleAnalyticsの時刻設定

自社のアプリの利用分析で、

ユーザーサマリーを時間別にみたときに、
昼間の12時にアプリユーザがほとんどいない。深夜の4時に利用者が多い。

こんなことがあったら、GoogleAnalyticsの時刻設定がアメリカ時刻になっていることを
疑ってみてください。
日本時間より＋17時間の時差があります。

このアプリは深夜にすごく使われている！と安易に考えるのはよくないですね。



設定箇所は、GoogleAnalyticsの上部のアナリティクス設定タブ内

右側の　ビュー設定を選択。

ここで、タイムゾーンの国または地域を選択できます。

日本　（GMT;9:00）東京　を選択しましょう。
負荷の高いMySQLでメタデータを極力ロックさせずにDROP TABLEする

#概要

MySQLではDROP TABLEするときにメタデータをロック（MySQL5.5以前の場合）します。

数千万件を超えるようなテーブルをDROP TABLEすると平気で数十秒かかったりするため、その間は高負荷状態になったり、メタデータがロックされているために解除までDDLを流せなかったり、などなど不都合がありします。

大量のレコードを持つテーブルのDROP TABLEに時間を要するのは同期的にデータファイルを削除しようとするためです。
DROP TABLEすると内部的にデータファイルをunlinkしますが、リンク数が0になると（実際はそれだけじゃないけれど）ファイルシステム上の実データ削除処理が走り、巨大なファイルであればあるほどその処理に時間を要することになります。

そこでunlinkされてもリンク数が1以上あれば実データの削除処理は走らないのでは？ということになります。

すなわち、**あらかじめデータファイルにハードリンクを張っておいてからDROP TABLE**すれば、大量レコードのテーブルをDROP TABLEしてもすぐに終わります。

#手順

##データファイルにハードリンクを張る

```
$ ln /var/mysql/data/messages.ibd /home/foo/messages.ibd
```

##DROP TABLE

```
mysql> DROP TABLE messages;
```

##データファイルをioniceで優先度下げつつ穏やかに削除

```
$ ionice -c 3 rm -f /home/foo/messages.ibd
```
RecyclerViewのアイテムクリック

ViewHolderにClickListener実装させろ (http://stackoverflow.com/a/24933117) というのを見たけど
1要素のクリックなら1つのOnClickListenerで処理できるんじゃないの？というアプローチ。

## RecyclerViewとRecyclerView.Adapterの結合

RecyclerView.Adapterには、以下のコールバックメソッドがあります。

> onAttachedToRecyclerView(RecyclerView)
> onDetachedFromRecyclerView(RecyclerView)

これらのコールバックによって、AdapterはどのRecyclerViewにattachされたのかがわかります。

## RecyclerViewからpositionを取得する

RecyclerViewには、getChildAdapterPosition(view)というメソッドがあります。
このメソッドにViewを渡すと、そのViewのAdapter上のpositionが取得できます。

## 実装

View.OnClickListenerを1つ実装し、onCreateViewHolder()で、クリック可能にするすべてのアイテムViewにセットします。
処理的には、独自のリスナーを定義して、それにコールバックする処理を書けばいいです。

View.OnClickListenerのonClick()はクリックされたViewをくれるので、getChildAdapterPosition()と組み合わせることで要素の位置がわかります。

### 例

```java:CustomRecyclerAdapter
public class CustomRecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements View.OnClickListener {

    private final List<Item> mList = new ArrayList<>();

    private RecyclerView mRecycler;

    private OnItemClickListener mListener;

    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
        mRecycler= recyclerView;
    }

    @Override
    public void onDetachedFromRecyclerView(RecyclerView recyclerView) {
        super.onDetachedFromRecyclerView(recyclerView);
        mRecycler = null;
    }

    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
        View view = mInflater.inflate();
        view.setOnClickListener(this);

        RecyclerView.ViewHolder holder = new RecyclerView.ViewHolder(view);

        return holder;
    }

    public void setOnItemClickListener(OnItemClickListener listener) {
        mListener = listener;
    }

    @Override
    public void onClick(View view) {
        if (mRecycler == null) {
            return;
        }

        if (mListener != null) {
            int position = mRecycler.getChildAdapterPosition(view);
            Item item = mList.get(position);   
            mListener.onItemClick(this, position, item);
        }
    }

    public static interface OnItemClickListener {
        public void onItemClick(CustomRecyclerAdapter adapter, int position, Item item);
    }

}
```

ちなみに、この実装では要素中の部分的なViewのクリックには対応できないです。
その場合は、素直にViewHolderにListenerを実装させましょう。

僕は、ViewHolderにAdapterを持たせて、ViewHolderからAdapterに一度コールバックしています。

```java:CustomRecyclerAdapter
public class CustomRecyclerAdapter extends RecyclerView.Adapter<Holder> {

    // …

    private void onButtonClick(int position) {
        // アイテムのボタンクリック
    }

    static class Holder extends RecyclerView.ViewHolder implements OnClickListener {

        private CustomRecyclerAdapter mAdapter;

        public Holder(View itemView, CustomRecyclerAdapter adapter) {
            super(itemView);
            mAdapter = adapter;
            itemView.findViewById(R.id.button).setOnClickListener(this);
        }

        public void onClick(View view) {
            mAdapter.onButtonClick(getAdapterPosition());
        }
    }
```

実際はHolderにOnClickListener実装させるのではなく、ButterKnifeでbindしたほうがいいです。
メールアドレス、パスワードの有効判定

# はじめに

Objective-Cでのメールアドレス、パスワードの有効判定を実装したので共有します。

メールアドレスの判定を検索するといくつか見つかります。

# 有効判定

```lang:メールアドレス有効判定
+ (BOOL)validateEmailWithString:(NSString *)str
{
    if (!str || [str length] == 0) {
        return NO;
    }
    
    BOOL stricterFilter = NO;
    
    NSString *stricterFilterString = @"[A-Z0-9a-z\\._%+-]+@([A-Za-z0-9-]+\\.)+[A-Za-z]{2,4}";
    NSString *laxString = @".+@([A-Za-z0-9-]+\\.)+[A-Za-z]{2}[A-Za-z]*";
    NSString *emailRegex = stricterFilter ? stricterFilterString : laxString;
    NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
    
    return [emailTest evaluateWithObject:str];
}
```

```lang:パスワード有効判定
+ (BOOL)validatePassword:(NSString *)str
{
    if (!str || [str length] == 0) {
        return NO;
    }
    
    // 文字数チェック: 6〜20文字
    if ([str length] < 6  || 20 < [str length]) {
        return NO;
    }

    // 英数字のみであることをチェック
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", @"[A-Z0-9a-z]*"];
    if (![predicate evaluateWithObject:str]) {
        return NO;
    }

    return YES;
}
```

# おわりに
何かの参考になりましたら幸いです。
Zabbix アクションの未送信キューの削除

大量にアラート検知してしまい、アクションのキューが溜まってしまった場合の対処方法です。

### 未送信キュー数の確認
```mysql
# mysql -uzabbix -p zabbix
mysql> select count(*) from alerts where status="0" ;
```
>status=
>0：未送信 or 送信中
>1：正常
>2：失敗

### 未送信キューのステータス変更
```mysql
mysql> update alerts set status="1" where status="0";
Query OK, 600 rows affected (0.11 sec)
Rows matched: 600  Changed: 600  Warnings: 0
```

### zabbix-serverの再起動

```bash
# /etc/init.d/zabbix-server restart
```

再起動しないと止まりませんでした。
Servletでダウンロードするファイルにファイル名をつける

サーブレットでダウンロードさせるファイルに適切なファイル名をつける

```java
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException {
  ...
  String fileName = "hoge.txt";
  res.setContentType("application/octet-stream");
  res.setHeader("Content-Disposition", "inline; filename=¥"" + fileName + "¥"");
}
```
Content-Dispositionヘッダーでfilenameを使ってファイル名を指定する。
配列宣言時型推論の意外な落とし穴

特に章分けするほどのものでもないので、単刀直入に言います。

御存知の通り、Swift は型推論があります。また、便利な配列型があります。しかしこれらは意外な落とし穴があります。試しに Playground とかで下記のコードを打ってみましょう：

```swift
let testString = "test"
let testFlag = true
let testInt = 1

let testArray = [testString, testFlag, testInt]
```

はい、一見何の変哲もないごくごく普通な Swift コードですね。それでは、最後のこの一行も追加してみましょう

```swift
let testAny = testArray[0] as Any
```

おそらく入力し終わった途端、Playground にこのように怒られます：
![スクリーンショット 2015-01-09 18.30.18.png](https://qiita-image-store.s3.amazonaws.com/0/63998/70bf0d85-0fae-6c60-2545-3d615240471e.png)
（ちなみに Playground ではなく普通のプログラムに入れちゃうとコンパイルエラーかランタイムエラーになります。）

実は最後の「as Any」を削除しちゃえば普通に動くコードなんですよね…ではなぜ「as Any」を入れちゃうとこうなっちゃうでしょうか？試しに最後の「as Any」を削除してみましょう。そうすると下記のような警告が出るはずです：
![スクリーンショット 2015-01-09 18.32.02.png](https://qiita-image-store.s3.amazonaws.com/0/63998/f4aba21b-c25b-7871-59f7-7dc53689ad3d.png)

はい、「testAny」を「AnyObject」としてちゃんと宣言しましょうね、ということです。あれれ？おかしいな？testArray の 0 番目の要素はただの String なのになんで  Object に？それは実は testArray の宣言に問題があったのです。試しに opt 押しながら testArray をクリックしてみましょう、下記のような情報が出るはずです：
![スクリーンショット 2015-01-09 18.34.57.png](https://qiita-image-store.s3.amazonaws.com/0/63998/97ffdbd7-7ce6-cd3b-db09-704019113148.png)

はい、実はこの testArray、なんと「NSArray」として宣言されちゃったのです。つまり**複数の種類の型を同一配列に入れる宣言はデフォルトでは NSArray として宣言される**ことです。

でも普通我々が望んでいるのは NSArray ではなく、普通に Swift の配列型として宣言して欲しいですよね？じゃあどうすればいいでしょうか？答えは簡単です、**下記のように宣言**しちゃいなよ、ゆー

```swift
let testArray: [Any] = [testString, testFlag, testInt]
```

まあでも真面目な話、多分これ、Xcode のせいですよね…また今後使用変更しそうです。
整数値のビットを反転させるには ~ ではなくて ^ を使う（単項 NOT）

Scala (Java) と行ったり来たりしていて間違えたので自戒します:

## Scala (Java) は ~ でビット反転

```scala
val a = 1

println(~a) //=> -2
```

## Go は ^ でビット反転

```go
a := uint32(1)

fmt.Println(^a) //=> 4294967294
```

Scala (JVM) には unsigned な整数値型がありませんが、Go にはあります。

## 参考

http://golang.org/ref/spec#Arithmetic_operators
国立天文台の暦要項データを取得する

祝祭日のデータを手動で毎年更新するのは、面倒だろうと思う。

官報に掲載される日本の暦は、国立天文台が計算している。これをまとめたものを**暦要項**という。暦要項は、毎年2月に次の年のものが公示される。そのデータは、[国立天文台天文情報センター暦計算室](http://eco.mtk.nao.ac.jp/koyomi/)がGoogle Calendarで公開しているため、そのつどiCalendar形式で取得することができる。よって祝祭日データの更新は、もはや人間が手動で行うような作業ではない。

Google CalendarなのでXMLやJSONでも取得できるが、データの内容がプログラミングに向かないため、当面はiCalendar形式で取得するのが良いだろう。

```koyomi.rb
require "yaml"
require "open-uri"
require "icalendar"

calendar_id = "2bk907eqjut8imoorgq1qa4olc@group.calendar.google.com"
uri = URI.join(
    "https://calendar.google.com/calendar/ical/",
    "./#{URI.encode_www_form_component(calendar_id)}/",
    "./public/basic.ics")
ical = open(uri).read
calendar = Icalendar::Calendar.parse(ical).first
results = calendar.events.map do |event|
  {
    "name" => event.summary.to_s,
    "date" => event.dtstart.to_date,
  }
end
File.open("./koyomi.yml", "w") do |file|
  YAML.dump(results.sort_by{|result| result["date"] }, file)
end
```

```koyomi.yml
---
- name: 元日
  date: 2001-01-01
- name: 成人の日
  date: 2001-01-08
- name: 建国記念の日
  date: 2001-02-11
- name: 休日
  date: 2001-02-12
- （中略）
- name: 体育の日
  date: 2015-10-12
- name: 文化の日
  date: 2015-11-03
- name: 勤労感謝の日
  date: 2015-11-23
- name: 天皇誕生日
  date: 2015-12-23
```
GNU GLOBALのhtagsで日本語コメントが文字化けする場合に使えるオプション（--html-header）

GNU GLOBALの`htags`コマンドはソースコードをHTML化してくれます。しかもメソッドの定義元／参照元もリンクで飛ぶことができてコードリーディングには超便利。

ただしデフォルトだとcharsetのメタタグが入ってないので、UTF-8のソースコードだとブラウザによっては文字化けして見えてしまいます。いちいちエンコードを指定するのは面倒なので、charsetを指定してしまいましょう。

`--html-header`オプションは headタグに埋め込むHTML断片のテキストファイルを指定できます。

```bash
$ man htags
...
     --html-header file
              Insert a header record derived from file into the HTML header of each file.
...
```


では実際に使ってみます。
まずglobalでタグインデックス（GPATHなど）を作っているディレクトリに移動して、以下のように実行してみましょう（`-sanFx`とかはお好みで変えてね）。


```bash
$ echo '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />' > encode_meta.html
$ htags -sanFx -v --html-header=./encode_meta.html

# コード行数が多い場合は数分かかる

$ head HTML/index.html
<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Frameset//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd'>
<html xmlns='http://www.w3.org/1999/xhtml'>
<head>
<title>authense</title>
<meta name='robots' content='noindex,nofollow' />
<meta name='generator' content='GLOBAL-6.3.2' />
<meta http-equiv='Content-Style-Type' content='text/css' />
<link rel='stylesheet' type='text/css' href='style.css' />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />   # <- encode_meta.htmlに書いたやつ
</head>
```

ちゃんとメタタグが入ってますね。`--html-header`で指定したファイルの内容が *"&lt;/head&gt;の直前に挿入される"* そうです。


# 参考

[gnuglobal - Gnu Global で作った HTML ファイルの日本語が文字化けする時の対処 - Qiita](http://qiita.com/TakeyukiUeda/items/55a5724ec4786bcd7e24)
sedで置換するたいへん漢らしい解決策

[GNU GLOBAL ハンドブック](http://www.tamacom.com/handbook/)
この本をパラパラ見しててこのオプションを見つけました（P.100）。作者が書いてるだけあって内容濃いからGNU GLOBALerにはおすすめです。
上記ページには[割引販売情報](http://www.tamacom.com/handbook/purchase.html)があります。内容確認したいひとは渋谷のジュンク堂書店に2冊ほどあったから見に行くといいよ(2014年12月頃)。
VirtualBoxにおいて、ホストOSとゲストOS (CentOS) 間の共有フォルダを作成する方法

VirtualBoxにおいて、ホストOSとゲストOS間の共有フォルダを作成する方法をゲストOSがCentOSの場合についてまとめます。

#共有フォルダの作成
ホストOS上で以下の手順を行います。

1. 共有フォルダを作成します(共有フォルダ名は英数字にします)。
1. VirtualBoxマネージャーで設定したい仮想マシンを選択し、[設定]をクリックします。
3. `共有フォルダー`をクリックします。
4. プラスボタンをクリックします。
5. `フォルダーのパス`の三角のようなボタンをクリックし、`その他`をクリックします。
6. 手順1で作成したフォルダを指定します。
7. `自動マウント`と`永続化する`にチェックをつけ、[OK]をクリックします。
8. [OK]をクリックします。

これで、ゲストOSの`/media/sf_{共有フォルダ名}`がホストOSとの共有フォルダになります。

#共有フォルダのマウント
共有フォルダを`/media/sf_{共有フォルダ名}`以外でマウントしたい場合は、ゲストOS上で以下の手順を行います。

1. `su`コマンドを入力し、ユーザのパスワードを入力することで、スーパユーザになります。
1. `chmod u+x /etc/rc.d/rc.local`コマンドを実行し、スクリプトを実行可能にします。
2. `nano /etc/rc.d/rc.local`コマンドを実行し、末尾に以下の記述を追加します。

```rc.local
mount -t vboxsf {共有フォルダ名} {マウント先のディレクトリ名}
```

1. 再起動します。

#共有フォルダにアクセスできるユーザの設定
root以外のユーザが共有フォルダにアクセスできるようにしたい場合には、ゲストOS上で以下の手順を行います。

1. `su`コマンドを入力し、ユーザのパスワードを入力することで、スーパユーザになります。
1. `gpasswd --add {ユーザ名} vboxsf`コマンドを実行し、ユーザを`vboxsf`グループに追加します。

#関連記事
* [VirtualBoxにおいて、ホストOSとゲストOS (Ubuntu) 間の共有フォルダを作成する方法 - Qiita](http://qiita.com/SUZUKI_Masaya/items/3444a010cf9903a088b3)

#参考文献
* [VirtualBox - 【Virtual Box】共有フォルダを介して、ホストOS(Windows 7) と ゲストOS(Debian/ MathLibre)でファイルやりとりするための設定 - Qiita](http://qiita.com/HirofumiYashima/items/6044cfc64cfa3e84f97c)
* [VirtualBox (Windows) 上に CentOS 7 をインストールする - Qiita](http://qiita.com/100/items/80a899fbaeb1e82b3f67)
AWS OpsWorksでAppsに設定したEnvironment VariablesをShellInitのためダンプする


OpsWorksのAppsに定義した環境変数をシェルや他の処理からも使いやすくしておきたい。

仕様まわりはこちらに解説があるので割愛。 > [OpsWorksで機能追加された環境変数を試してみて気づいた注意すべきこと - よかろうもん！](http://interu.hatenablog.com/entry/2014/10/27/223954 "OpsWorksで機能追加された環境変数を試してみて気づいた注意すべきこと - よかろうもん！")


Elastic Beanstalkみたいに(※)楽には取れないので、フィードバックから要望を送信しつつ、レシピで対応。

> ※コンテナタイプにもよるが、`/opt/elasticbeanstalk/support/export_envvars`でEnvironment Configurationの環境変数を取れる。


## カスタムクックブック

[OpsRockin/opsworks-export-envs | GitHub](https://github.com/OpsRockin/opsworks-export-envs)

幸いデプロイイベントには必要な情報が揃っているので、deployのランリストに追加すればよし。


```opsworks-export-envs/recipes/default.rb
node.deploy.each_pair do |app_name,vals|
  file File.join(vals[:home], "shellinit-#{app_name}.sh") do
    envs = []
    vals.environment_variables.each_pair {|key, val| envs << "export #{key}=\"#{val}\""} if vals.environment_variables
    owner vals[:user]
    group vals[:group]
    content envs.join("\n")
  end
end
```

## export用ファイルのサンプル

こんな感じで各アプリケーションに設定された環境変数を、読めるように書き出します。

```/home/deploy/shellinit-your_app_name.sh
export HOGE1="piyopiyo1"
export HOGE2="piyopiyo2"
```

使うときは`. /home/deploy/shellinit-your_app_name.sh` や `source /home/deploy/shellinit-your_app_name.sh` で読めばOK。
ファイル自体を置く場所は`/etc/profile.d/`や.bashrcで自動で読ませるとか、各自使いやすいように調整してもいいですね。
linux > ファイルの追記をチェックする > tail -f

動作環境: CentOS 6.5 + bash

`tail -f log.txt`とすると`log.txt`に追記されるたびにその内容がターミナルに表示される。

使い道としては、あるファイルに定期的に追記する処理が走っている時に`tail -f log.txt`しておいてその追記分を確認するという感じ。

<hr>
動作確認としては、１つのターミナルで`tail -f log.txt`しておいて、別のターミナルで`echo "test" >> log.txt`すると、`tail -f`側のターミナルで`test`が表示される。

ただし、`tail -f`は既存ファイルに対して実行でき、ファイルがない場合はエラーとなる。
SketchUp においてスクリプトでいじくりまわしたくなった Ruby 初心者の私が開発しやすいと思ってやってたこと

###はじめに、注意
2013年12月19日に facebook に書いていたものをサルベージしてきた投稿です。
その後、後述する `main.rb` は進化したみたいですが、Ruby 初心者な私には 1 年前の私のコードをすぐには理解できませんでした。
時間があったら解読して、追加情報として掲載、解説してみたいと思います。

#で、ここから
SketchUp で 3D モデルを作っていると、スクリプトでやりたくなるのは必然と思いますが、ある程度のサイズになると適度な粒度でクラスもファイルも分けたくなるわけです。 
Ruby Code Editor で実行していると便利は便利なんですが、コードが一つだけのファイルで完結している場合、いくつか問題があります。 

1. `__FILE__` が使えない（正確には `(eval)'` になっている） 
1. ファイルのトップレベルで module を作っても、`AS_RubyEditor::RubyEditor` 内の module になってしまう 

特に (2) は作ったクラスにアクセスできない現象の原因がわからずかなり嵌りました。
考えてみれば Ruby Code Editor の中でコードを実行した場合、eval するしかないですよね。
でもって、（ここからさきは Ruby についてよく知らないのでわかりませんが、）`AS_RubyEditor::RubyEditor` というクラスのコンテキストで eval されている (`class_eval` とか？) ので、トップレベルの module が作れないのでしょうね。

ということで、現時点は次のようなプラクティスを採用しています。 
まず、必要なスクリプトは一つのディレクトリに集めます。
最初は、Ruby Code Editor で読み込むファイルです。
たとえば `start.rb` という名前にします。

```ruby:start.rb
load 'c:/Users/takeyuki/Dropbox/3rdpalace/main.rb'
```

ご覧のとおり、`main.rb` という名前のファイルを load するだけですね。
ここではフルパスで load します。 
で、`main.rb` の内容は次のようになります。 

```ruby:main.rb
path = __FILE__.split('/')[0..-2].join('/')
$:.include?(path) || $:.push(path)

def mrequire(name)
  name = name[/^(\w+)(\.rb)?$/, 1] + '.rb'
  load name
end
mrequire '3rdpalace'
__END__
```

最初の 2 行はスクリプトをまとめたディレクトリをロードパスに追加するコードですね。
`start.rb` は `__FILE__` が使えないわけですから、この `main.rb` で初めてできるわけです。
ディレクトリを移動した場合も start.rb に書いたフルパスだけ修正すればいい、という寸法です。 で、「必要に応じてクラスやモジュールのアンロードができたり、同じファイルを無駄に何度もロードしたりしない」ローダをちゃんと作ろうかと思っていろいろ調べたんですが、
開発段階では毎回毎回（読込みとコンパイルと）評価が行われる load で十分な気がしてきて、そうしちゃいました。
将来的にはどうにかするかもしれないので、`mrequire` という関数を作ってみました。
ご覧のとおり、中身はただの load です。 これより、`3rdpalace.rb` や、さらにその中から `mrequire` されたファイルに修正があれば、単に Ruby Code Editor の「Execute code in SketchUp (Alt + R)」ボタンを押すだけで反映されて実行されるわけです。
厳密に言うと、（モジュールや）クラスのアンロードはしていないので、ファイルに書かれたとおりの新しいクラス定義がそのままメモリ上に上がるのではなく、
すでにメモリ上にロードされたクラスへの追加定義、ということになります。
つまり、メソッドの名前を `get_something` から `retrieve_something` に変えて再ロードしたとすると、`get_something` というメソッドは残ることになります。まあ、ファイル上のクラス定義とメモリ上のクラス定義を完全に同期したい場合は SketchUp を再起動するのが早いでしょう。 てな感じで。 

確認環境 : SketchUp Make 12.0.4812 + Ruby Code Editor Version 3.1
特定の拡張子だけtarで固める(hoge.tgzの生成)


例えばdir/以下にある拡張子 .cpp .htmlをhoge.tgzとして固めたい場合

```sh
$ find ./ | grep "\.\(cpp\|html\)$" | xargs tar czvf hoge.tar.gz
```

解説
findで固めたいディレクトリ以下のファイルリストを作る、grepでリストから特定の拡張子を含むファイルを選択する。リストをパイプででtarにわたす。
逆に特定のファイルを除外したい場合はtar に--excludeオプションがあるのでそれを使う。