OmniAICreator/Qiita-1.07M huggingface dataset:
Crystal - Bool

Crystalの標準ライブラリのBoolについて

## <i class="fa fa-diamond" style="font-size:1em;"></i> 概要
BoolはStructとして定義され、true / false の真偽値を扱います。

* <i class="fa fa-external-link" style="font-size:1em;"></i> [Bool - Crystal API Docs](http://crystal-lang.org/api/Bool.html)

Structについては下記の公式ドキュメントを参照

* <i class="fa fa-external-link" style="font-size:1em;"></i> [Structs - Crystal Docs](http://crystal-lang.org/docs/syntax_and_semantics/structs.html)

参考までにRubyでは真偽値はTrueClass / FalseClassとして定義されています。

* <i class="fa fa-external-link" style="font-size:1em;"></i> [TrueClass - るりま](http://rurema.clear-code.com/2.2.0/class/TrueClass.html)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [FalseClass - るりま](http://rurema.clear-code.com/2.2.0/class/FalseClass.html)

ちょっと面白いのが、Crystalの論理否定がメソッドとして実装されており、
通常一般的な言語で論理否定として使われるように前置することもできますし、
通常のメソッド呼び出しと同様に後置することもできます。
Boolの実装を読んだだけでは、実際のところどういった仕組みになっているか
分かりませんが、深追いはやめておきます。（時間的に）
参考までにBoolのソースコードへのリンクを。

* <i class="fa fa-external-link" style="font-size:1em;"></i> [bool.cr - Crystal GitHub](https://github.com/manastech/crystal/blob/master/src/bool.cr)

具体例は以下のサンプルコードで紹介します

## <i class="fa fa-flask" style="font-size:1em;"></i> サンプル
### <i class="fa fa-code" style="font-size:1em;"></i> プログラム
```ruby
pp !true
pp !false
pp true.!
pp false.!

[[true, true], [true, false], [false, true], [false, false]].each do |e|
  a = e.first
  b = e.last
  puts "case a = #{a}, b = #{b}"
  pp a & b
  pp a == b
  pp a != b
  pp a | b
  pp a ^ b
end
```

### <i class="fa fa-files-o" style="font-size:1em;"></i> 出力
```ruby
!true = false
!false = true
!true = false
!false = true
case a = true, b = true
a & b = true
a == b = true
a != b = false
a | b = true
a ^ b = false
case a = true, b = false
a & b = false
a == b = false
a != b = true
a | b = true
a ^ b = true
case a = false, b = true
a & b = false
a == b = false
a != b = true
a | b = true
a ^ b = true
case a = false, b = false
a & b = false
a == b = true
a != b = false
a | b = false
a ^ b = false
```

## <i class="fa fa-github-square" style="font-size:1em;"></i> GitHub
CrystalのBoolの実装が気になる方はこちら。

* <i class="fa fa-external-link" style="font-size:1em;"></i> [bool.cr - Crystal GitHub](https://github.com/manastech/crystal/blob/master/src/bool.cr)

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* <i class="fa fa-external-link" style="font-size:1em;"></i> [Bool - Crystal Docs](http://crystal-lang.org/api/Bool.html)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [bool.cr - Crystal GitHub](https://github.com/manastech/crystal/blob/master/src/bool.cr)
【Javascript】onclickメソッドとnew Function

```html

<!DOCTYPE HTML>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <title>onclickメソッドとnew Function</title>
    <style type="text/css">

    </style>
</head>

<body>

    <h2>onclickメソッドとnew Function</h2>

    <p id="a01">ここをクリック</p>
    <br />

    <script type="text/javascript">
        function getElementID(nm) {
            return document.getElementById(nm);
        }

        var click = click || {};

        click.click_id = (function() {

            var that = {};

            that.clickListener = function() {
                alert("Hello world")
            }

            that.init = function(s) {
                var targetElement = getElementID("a01");
                targetElement.onclick = new Function('click.click_id.clickListener(' + ')');
            }

            return that;

        })();

        window.onload = function() {
            click.click_id.init();
        }
    </script>

</body>

</html>

```

##解説
onclickメソッドとnew Functionを使って、id=a01のp要素をクリックすると「Hello world」とアラートするコードを作った。new Functionは、こんな使い方ができる。なんか、すごく分かりづらいコードだけど、new Functionを使ったコードの一例として投稿しておきます。

###注意
new Function('click.click_id.clickListener(' + ')');のclick.click_id.clickListener()がグローバル関数でないとエラーになる。つまり、window.onload = function() {}の中にclick.click_id.clickListener()があると動かない。

```html

<!DOCTYPE HTML>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <title>onclickメソッドとnew Function</title>
    <style type="text/css">

    </style>
</head>

<body>

    <h2>onclickメソッドとnew Function</h2>

    <p id="a01">ここをクリック</p>
    <br />

    <script type="text/javascript">
        function getElementID(nm) {
            return document.getElementById(nm);
        }

        window.onload = function() {
            var click = click || {};

            click.click_id = (function() {

                var that = {};

                that.clickListener = function() {
                    alert("Hello world")
                }

                that.init = function(s) {
                    var targetElement = getElementID("a01");
                    targetElement.onclick = new Function('click.click_id.clickListener(' + ')');
                }

                return that;

            })();
            click.click_id.init();
        }
    </script>

</body>

</html>

```

###

###追記
[JavaScript Dropdown Menu][1]のtinydropdown.jsを読んで勉強していたのですが、new Functionを使用した個所があったので、自分でもnew Functionを使ったコードを考えてみました。new Functionは分かりづらいコードになるだけな気がします。

###

##

##参考文献
[JavaScript Dropdown Menu][1]
[1]:http://www.scriptiny.com/2011/04/javascript-dropdown-menu/
Vagrantfileをいじる時

超基本的なことですかつまづいてしまったので戒めを込めて。
結果としてはsuspend→upではダメなので、reloadしましょうということです。

##やりたかったこと
Wordpressのプラグイン「Duplicator」を使ってテスト環境から本番環境に移行。
##問題
パーミッションに問題があると怒られる。
↓
Google先生に聞いてVagrantfileを変更する。
↓
自分がreloadではなくsuspend→upで設定が再読み込みされると勘違いしていた。
↓
reloadをしたら一発で解決
##vagrant reloadで解決
なかなかに悩んでしまいました。思い込みって恐ろしい…
デバイスファイル

### デバイスファイル

#### /dev/consoleとりあえずみてみた
* メジャー番号とマイナー番号が入っているただの箱
* catとかしてもなんか反応しなかった…

~~~txt
ls -lsa /dev/console 
0 crw-------  1 hoge  staff    0,   0  8 16 06:08 /dev/console
~~~

##### メジャー番号、マイナー番号どこで生成しているのだろうか
* insmodっぽい
* insmod ドライバファイル.o
  - そしたらドライバファイルの中のinsmodに対する関数が実行
  - その中でメジャー番号の確保,システムコールハンドラの登録、カーネルへの登録(対応表みたいなやつ)
 * insmodあと下のようなコマンドでメジャー番号をみつけて

~~~txt
cat /proc/devices | grep hoge
~~~

* それを元にmknod メジャー番号 したような。

### insmod
* カーネルに対して動的リンクする
  - 動的リンク
      + メモリ再配置してカーネルの対応表を埋めてセクションをまとめる(.textとかその他もろもろ)

### open
その後にopen()したような
プロセスとドライバのinodeを結んでファイルを開くようにfopみたいなドライバのオペレーションをfile構造体に設定して、ドライバの各関数を使用できるようにする。
gemのデバッグをするときに１つ１つコミットを追っていく方法

## About
dockerを使ったサーバCIをしているが、`bundle update`したら最近cookでコケるようになってしまった。`bundle install`したソースを弄って手動デバッグしていたが、原因を特定するためにどのコミットでテストがコケるようになったか特定する方法を教えていただいたので、メモしておく。

## 最新のgemをインストールする

```:Gemfile
gem 'knife-solo'
```

## 特定のバージョンのgemをインストールする

```:Gemfile
gem 'knife-solo', '0.4.2'
```

## 特定のコミットをインストールする

```:Gemfile
gem 'knife-solo', git: 'git://github.com/matschaffer/knife-solo.git', ref: 'f760e128'

or

gem 'knife-solo', github: 'matschaffer/knife-solo', ref: 'f760e128'
```

それぞれ指定して、bundle updateすればよいみたいです。
Stochastic Divergence Minimization for Online Collapsed Variational Bayes Zero Inference of Latent Dirichlet Allocationを読んだ

# KDD2015 Stochastic Divergence Minimization for Online Collapsed Variational Bayes Zero Inference of Latent Dirichlet  Allocationを読んだ

## どんなもの？
collapsed VB0の確率的近似であるstochastic CVB0を改良し、LDAに適用した。

## 先行研究と比べると？
- CVB0の性質の理解が進み、非対称なディリクレ分布のLDAに対するCVB0を導出した
- CVB0よりも性能が良い

## 技術や手法のキモはどこ？
確率的なダイバージェンスの最小化問題として定式化した

## どうやって有効だと検証した？
ハイパーパラメータをbayesiam optimizationしたSCVB0と比べて、perprexityが低くなった。
提案手法はハイパーパラメータのチューニングはしていない。

## 次に読むべき論文は？
- Stochastic Collapsed Variational Bayesian Inference for Latent Dirichlet Allocation.
他の言語の他のライブラリという検証済みのアイディアを利用しよう

　あるOSである言語でプログラムを開発していると、何か機能が足りないと感じることがあります。
　そのようなときには、別の言語のライブラリを参考にしています。

####**他のライブラリをまねる理由**
**・何が有益かを既に知っている。**
　PythonやJavaなどの言語を使っているとそれらの言語で自分にとって有益なライブラリが何であるのかを既に知っています。
　C++言語のライブラリにもこんなのがあればいいのにという部分を、既に知っているわけで、あとは、その機能をC++言語の標準的なライブラリになければ、実装したいという欲求につながります。STLの他にもBoostのライブラリを見たうえで、自作する必要があるかどうかを見極めます。
**・その機能の実装がうまくいくことがわかっている。**
　言語が変わっても、コンピュータ言語で実現できる本質は変わりません。その機能が実現できることが既に示されていて、必要ならばその実装の詳細を読むことができるのはオープンソースの強みです。

**・外部仕様に迷わなくなる。**
　それは有用性が検証されているライブラリをまねることで、少なくとも外部仕様に迷わなくて良くなります。外部仕様が今までに使い慣れたものであれば、そのライブラリを使うために、新たに覚えなければならないことも抑えることができます。
　例：[matplotlib](http://matplotlib.org/) のライブラリは、MATLABの描画関数に似ています。[MATLABの描画関数](http://jp.mathworks.com/help/matlab/graphics.html)を使ったことのある人ならば、matplotlibを使うのは、すぐ慣れることができるでしょう。MATLABを使ったことがない人でも、有用性を検証されている設計のライブラリは、魅力的にうつるでしょう。（私見：Excelのグラフには、ヒストグラムの描画関数がないなど、制限が多いのが残念な点です。）

　どのようなライブラリにすれば使い勝手がよいのかということはとても大事です。様々な言語で目的の処理に対してどのような実装があるかを知ることです。自分が普段使っていない処理系のライブラリを知るためにも、他の処理系やライブラリを使っている人の声を聞いてみることは有効です。

　ライブラリの外部仕様は、メソッドの名前や引数の順序、戻り値のデータ形式という部分でも、よい設計とそうでない設計とがあります。
　例を示します。
[scikit-learn](http://scikit-learn.org/stable/)の機械学習のライブラリが便利な理由の１つには、機械学習のアルゴリズムの種類によらず、同一のインターフェースで利用を可能にしているという点です。

estimator.fit(X_train, y_train)
y_test_predict[name] = estimator.predict(X_test)

　もし、これが手法ごとに、メソッドの名前、引数のデータ形式、引数の順序、戻り値の形式が異なっていたら、scikit-learn
はここまで有用性を獲得しないはずです。

 自分が新たなライブラリを作るときに、既に検証済みのアイディアを利用して、設計をしましょう。


参考URL
scikit-learnで複数のモデルでそれぞれにfit(),predict()しているサンプルコード
[Face completion with a multi-output estimators]
(http://scikit-learn.org/stable/auto_examples/plot_multioutput_face_completion.html)
モンティ・ホール問題をGoでやってみる

[モンティ・ホール問題 - Wikipedia](https://ja.wikipedia.org/wiki/モンティ・ホール問題)

直感とずれていることで有名なやつですね。Goの練習もかねて。

```go:montyhall.go
package main

import (
	"fmt"
	"math/rand"
	"time"
)

func shuffle(a map[int]bool) {
	rand.Seed(time.Now().UnixNano())
	for i := range a {
		j := rand.Intn(i + 1)
		a[i], a[j] = a[j], a[i]
	}
}

func main() {

	counter1 := 0
	counter2 := 0
	loop := 100000

	for i := 0; i < loop; i++ {
		// 全3個あたりがひとつのくじを用意
		lottery := map[int]bool{0: true, 1: false, 2: false}
		// シャッフル
		shuffle(lottery)

		// ひとつ選ぶ
		choice := rand.Intn(3)

		// 選びなおさない場合、当たっていたらカウント
		if lottery[choice] == true {
			counter1++
		}

		// 選んでないものからハズレをひとつ取り除く
		for k, v := range lottery {
			if (k != choice) && v == false {
				delete(lottery, k)
				break
			}
		}
		// 残っている方に選びなおす
		for k := range lottery {
			if k != choice {
				choice = k
				break
			}
		}
		// 選びなおした場合、当たっていたらカウント
		if lottery[choice] == true {
			counter2++
		}

	}
	// 普通に選んだ場合
	fmt.Println(counter1)
	// 選びなおした場合
	fmt.Println(counter2)
}

```

100000回くじをひいて、普通に選んだ場合と選びなおした場合の当たった回数

```
$ go run montyhall.go
33427
66573
$ go run montyhall.go
33324
66676
```

コード書いてても直感と合わない感じすごい…これ普通に33％だと思うんだけど
（シャッフルのあたりとか雑なので厳密ではないですが、明らかに有意ですね）
Java で任意の文字数で文字を分割

○文字以降カットするのはよくやるけど、分割ってあんまりやったことなかったので、StringUtils とかひと通りライブラリを探した後で正規表現使えばいいことに気づきました。。

たとえば8文字で分割するならこう。

```java
Matcher m = Pattern.compile("[\\s\\S]{1,8}").matcher("UMR、はい!!UMR、はい!!UMAじゃないようまる");
while (m.find()) {
    System.out.println(m.group());
}
```

出力:

```
UMR、はい!!
UMR、はい!!
UMAじゃないよ
うまる
```

`.{1,8}` でも良さそうですが、改行コードなどが端折られてしまうので、空白文字 `\s` と空白文字以外 `\S` にヒットさせています。
Scalaの暗黙引数について実験

Scala初心者がorg.scalacticのソースコードを読んでいてScalaの暗黙引数について疑問に思ったのでちょっと実験。

# 派生クラスの実体は基底クラス型の暗黙引数になるのか？

基底クラスと派生クラスを作成します。

```scala
scala> class Base(val X: Int) {}
defined class Base

scala> class Derive(X: Int)(val Y: Int) extends Base(X) {}
defined class Derive
```

おｋ。

基底クラス型の暗黙引数を取る関数を作成します。

```scala
scala> def test(implicit b: Base) = b.X
test: (implicit b: Base)Int
```

おｋ。

派生クラスの実体を暗黙値として作成します。

```scala
scala> implicit val d = new Derive(5)(6)
d: Derive = Derive@633b882d
```

おｋ。

作成した関数を引数指定なしで呼び出します。

```scala
scala> test
res0: Int = 5
```

通りました！おｋ。

という訳で、

* 派生クラスの実体は基底クラス型の暗黙引数になるのか？
 * →なる。

ということで良いようです。

# 基底クラスと派生クラスの両方の暗黙値があったらどうなる？

基底クラスの実体を暗黙値として作成します。

```scala
scala> implicit val b = new Base(7)
b: Base = Base@57584afb
```

おｋ。

作成した関数を引数指定なしで呼び出します。

```scala
scala> test
res1: Int = 5
```

あれ？7になるかと思ったら5になります。ということは、**基底クラスと派生クラスの両方の暗黙値がある状況で基底クラス型の暗黙引数として派生クラスの暗黙値が選択された**。

ただし、この場合は派生クラスの暗黙値を作ってから基底クラスの暗黙値を作っています。この順番を逆にしたらどうなるでしょうか。

一旦リセットします。

```scala
scala> implicit val d = ()
d: Unit = ()

scala> implicit val b = ()
b: Unit = ()
```

おｋ。

基底クラスの実体を暗黙値として作成します。

```scala
scala> implicit val b = new Base(8)
b: Base = Base@1582d39d
```

おｋ。

作成した関数を引数指定なしで呼び出します。

```scala
scala> test
res2: Int = 8
```

おｋ。

派生クラスの実体を暗黙値として作成します。

```scala
scala> implicit val d = new Derive(9)(10)
d: Derive = Derive@67832d15
```

おｋ。

作成した関数を引数指定なしで呼び出します。

```scala
scala> test
res3: Int = 9
```

あれ？8になるかと思ったら9になります。ということは、**基底クラスと派生クラスの両方の暗黙値がある状況で基底クラス型の暗黙引数として派生クラスの暗黙値が選択された**。

* 基底クラスと派生クラスの両方の暗黙値があったら
 * →基底クラス型の暗黙引数として派生クラスの暗黙値が選択される。

ということで良いようです。自分の直感には反していました。
color_echo の代り


[color_echo](https://github.com/khotta/color_echo)はもちろん便利。

## color_echo が無い環境で

突然ハイライトさせたいなーっと思った時用に。忘れてたののメモ。

```
$ tail -f FILE | perl -pe 's/error/\e[31m$&\e[0m/gi'
```

### CSI[^1] の中の SGR[^2] で、色を決めると。
`\e[31m`

- `\e[`[^3] => 開始 ESC シーケンス
- 間の数字 => 引数（0はクリア命令）
- m => 終了文字

これで挟む事によって、その範囲内に色が付く。

とりあえず数字は、31 と 41 が赤[^4]である事くらいを覚えとけば、
急場は凌げる。

あと区切り文字は、 `;` 。 `\e[31;41m` とか。


[^1]: Control Sequence Introducer
[^2]: Select Graphics Rendition
[^4]: fg と bg
[^3]: `\033[`, `\x1b[`


## 限定的な理由から

bio やってない人は無関係ですよ。

同僚に fastq に残留（とか重複とか）してるアダプターやらプライマー配列やらを視覚的に見せる為に、color_echo を使ってたのだけれど、 reverse-complement は別途行なっとかなきゃならんのよね。

で、ストレスを感じて、ざっと作ったの。
もちろん捨てスクリプトレベルの軽いもの。

### コード

```
#!/usr/bin/env perl
use v5.12;
use warnings ;
use autodie ;
use Data::Dumper ;
use Getopt::Long ;

GetOptions('str=s@' => \my @str,);
my @bg = qw( 42 43 44 45 46 47 ) ;
while ( <> ){
    my $line = $_ ;
    for my $i ( 0 .. $#str ){
        my $str = uc $str[$i] ;
        ( my $rev = reverse $str ) =~ tr/ACGT[]/TGCA][/ ;
        $line =~ s/$str/\e[$bg[$i];39m$&\e[0m/gi ;
        $line =~ s/$rev/\e[$bg[$i];31m$&\e[0m/gi ;
    }
    print $line ;
}
```

適当に保存（color_seq.pl）。もしくは、`*sh` の `function` にでもして（略

```
function color_seq(){
    perl -- <<"EOF" - "$@"
    # 上のコードを、そのまま、ここに埋め込む
EOF

}
```

### 使い方

```
$ perl color_seq.pl -s ACAGTGCGGGCTTTTTTTT -s TCTAATACGCCGGCCAT FILE
```

- `-s` でハイライトしたい配列を指定。最大 6 つまで。
	- バックグラウンドに色が付く。色の順は、エスケープ順
	- reverse-complement でヒットした所は、文字色が赤
		- 標準文字色が赤の人は、ゴメンなさい
	- 正規表現にそのまま突っ込むので `.` で `N` の代用などが可能
		- 一応、正規表現の `[]` には対応させてはいる

- FILE は fastq もしくは、改行コード無しの (multi) fasta
	- 改行コードある奴は、改行跨ぎの配列のチェックが無いからそのつもりで。
elasticsearchのクエリ

elasticsearchのクエリ

[AWS EC2上にfluentd + fluent-plugin-twitter + elasticsearch + kibana インストールするメモ](http://qiita.com/ayaniimi213/items/4197a295c13b59166e8c)
で蓄積したTweetデータに対して、使いそうなelasticsearchのクエリをまとめました。

# インデックスの確認
```bash
$ curl -X GET http://localhost:9200/_aliases
```
# tweetsの全データ取得
```bash
$ curl -XGET 'http://localhost:9200/tweets/_search?pretty=true' -d '
{
"query" : {
"matchAll" : {}
}
}'
```

# tweetsの期間指定でのデータの取得
```bash
$ curl -XGET 'http://localhost:9200/tweets/_search?pretty=true' -d '
{
"query" : {
"range" : {
"created_at" : { "from" : "2015-03-07T00:00:00", "to" : "2015-03-10T00:00:00" }
}
}
}'
```
k-mer についての、説明時の資料



## k-mer

現在のアセンブラで主流となってる「ド・ブラン（de Brujin[^1]）グラフ」を使ったアセンブリで使用される、配列断片長の事。

[^1]: 普通に有名人が居るんだから、ド・ブランで良くね？

で、ド・ブラングラフに関しては、

* [de Bruijn Graph を使った de novo アセンブリの発想がすごい件](http://d.hatena.ne.jp/hoxo_m/20100930/p1#20100930f1)

を読め。で話が終了。

が、インフォマティシャン以外の人に向けて、もう、ほんのちょっとだけ実例が欲しい場合の資料として。

**本職の人は読む必要が無い、つか読まないで。**


## 適当な例。

以下は、 E.coli K-12 の適当な部分を適当に持ってきた配列。

```
A:  GCTTTTTTTTTCGACCAAAGGTAACGAGGTAAC
B:  AGGTAACAACCATGCGAGTGTTGAAGTTC
```

で、コンセンサスが判らないものとして、 A, B のリードが得られてると仮定。

今回は、 5mer で 1bp スライドのスライディングウィンドウ的な断片を作成。それを並べてグラフを作成してアセンブリする。

### 目次と、配列断片を得る

```
$ function get_frag(){
   perl -le 'while(1){ $a = substr $ARGV[0], $b ++ , 5 ; last if length $a < 5 ; print join "\t", $b, $a }' "$1"
}
```

```A
$ get_frag GCTTTTTTTTTCGACCAAAGGTAACGAGGTAAC
1       GCTTT
2       CTTTT
3       TTTTT
4       TTTTT
5       TTTTT
6       TTTTT
7       TTTTT
8       TTTTC
9       TTTCG
10      TTCGA
11      TCGAC
12      CGACC
13      GACCA
14      ACCAA
15      CCAAA
16      CAAAG
17      AAAGG
18      AAGGT
19      AGGTA
20      GGTAA
21      GTAAC
22      TAACG
23      AACGA
24      ACGAG
25      CGAGG
26      GAGGT
27      AGGTA
28      GGTAA
29      GTAAC
```

```B
$ get_frag AGGTAACAACCATGCGAGTGTTGAAGTTC
1       AGGTA
2       GGTAA
(ommitted)
24      AAGTT
25      AGTTC
```

A, B それぞれの目次があるので1から順にリード内の並びは再構成出来る。

### 断片のテーブルを作成する

上記、 A, B のコマンド結果を適当な1ファイルに保存。

```
$ perl -Mvars=%h -lane '$h{$F[1]} ++ }{ print join "\t", $h{$_}, $_ for sort { $h{$b} <=> $h{$a} } keys %h ' FILE
   5 TTTTT
   3 AGGTA
   3 GGTAA
   3 GTAAC
   1 AAAGG
   1 AACAA
   1 AACCA
(omitted)
```

指定長の断片の出現頻度が得られる[^2]。

これを、目次と照らし合わせて[^3]、オイラー経路として解析する、、、と。

[^2]: 実際には、当然 reverse-complement を考慮。簡略化した例なので割愛。
[^3]: それぞれの断片と、リードの目次を登録したテーブルみたいのを作成したら、それがハッシュテーブルと言われてるもの。に近いもの？ って感じ？？？

### グラフを描く

例なので目次を便りに簡略化。

```A
1       GCTTT
2       CTTTT
3       TTTTT   # polyT
4       TTTTT   #
5       TTTTT   #
6       TTTTT   #
7       TTTTT   #
8       TTTTC
↓
18      AAGGT
19      AGGTA   # 3
20      GGTAA   # 3
21      GTAAC   # 3
22      TAACG
↓
26      GAGGT
27      AGGTA   # 3
28      GGTAA   # 3
29      GTAAC   # 3
```


```B
1       AGGTA   # 3
2       GGTAA   # 3
3       GTAAC   # 3
4       TAACA
↓
25      AGTTC
```

まあ、見たまんまな訳だけど、一応整理して並べると

* A の 1~18 までは（polyT はあるものの）目次通り => A_frag1 ( GCTTTTTTTTTCGACCAA )
* A の 19,20,21 => segment ( AGG )
* A の 22~26 => A_frag2 ( TAACG )
* B の 4~25 => B_frag ( TAACAACCATGCGAGTGTTGAA )

```
        A_frag1
         ↓
+---->  segment  ----> B_frag
|        ↓
+-----  A_frag2
```

で、並び順は、

```
A_frag1 => segment => A_frag2 => segment => B_frag
```

になる。

よって答えは、経路の最後の 4 塩基を足して

```
GCTTTTTTTTTCGACCAA . AGG . TAACG . AGG . TAACAACCATGCGAGTGTTGAA　+ GTTC
```


アライメント結果は、

```
    GCTTTTTTTTTCGACCAAAGGTAACGAGGTAACAACCATGCGAGTGTTGAAGTTC
A:  GCTTTTTTTTTCGACCAAAGGTAACGAGGTAAC
B:                            AGGTAACAACCATGCGAGTGTTGAAGTTC
```


で、ぐだぐだと述べて来た、この 5mer を k-mer = 5 と表記する訳。
k-mer = 20 なら 20塩基だし、 50 なら 50塩基。

ちょっと昔の次世代シーケンサーは、リード長が 100bp にも満たなかったから、k-mer 20 辺りでやるのが当たり前とか言われてたけど、最近 300bp 読めてるんだから、当然、もっとデカい値でのアセンブルが最適なものも出てくるよね。って話が続くんだけど、、、
windows でisoイメージをディスクに書き込む方法

調査対象のソフトウエア

#[imgburn](http://www.imgburn.com/)

```lang:サイトinfo
ImgBurn is a lightweight CD / DVD / HD DVD / Blu-ray burning application that everyone should have in their toolkit!
```
#[Power2go 10](http://jp.cyberlink.com/products/power2go-platinum/features_ja_JP.html)

```lang:サイトinfo
Power2Go 10 Essential は CD、DVD、Blu-ray へのデータ書き込みが無期限で行える無料ソフトです。 

Power2Go 10 Essential はガジェットモードでデスクトップの常駐するアイコンにドラッグアンドドロップするだけで書き込みが行えます。また、オーディオ CD の作成、コピー保護のされていない CD、DVD、Blu-ray のコピーが行えます。
```
 
#OS標準のツール
ディスクイメージ書き込みツール
C:\Windows\System32 isoburn.exe

#DeepBurner

お勧め出来るか調査してから...ダウンロードしようとしたらセキュリティ警告がでるのでリンク外しました。
```lang:サイトinfo
DeepBurner Free

Totally free, yet more advanced than most of the professional burning software, this version of our CD/DVD burner is for your own personal use.

Portable version that works from a USB flash drive is also available.
```
UIWebViewでhttpなURLにアクセスしようとしたら代わりにSFSafariViewControllerで開くようにする

# ATS対応におけるホワイトリスト問題

iOS 9からATSが導入され、UIWebViewで `http://` で始まるURLにアクセスしようとすると、以下のようなエラーメッセージが出てしまいサイトを表示することができなくなりました。

```
App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.
```

これに対応するには

1. `https://` も用意する
2. httpしか用意されていないドメインをATSのホワイトリストに入れる
3. ATSを無効にする

といった手が考えられるのですが、3はやりたくないし、管理下にない外部のサイトを表示している場合は1はできないし、消去法で2になるかと思います。

でも、外部のサイトがそこから先どんなURLへリンクしているかをすべて把握できるはずもなく、表示する可能性があるけどhttpしか用意されていないサイトをすべてリストアップできない、という問題があります。

# 解決策

まずATSは有効にします。その上で、UIWebViewで `https://` 以外のURLにアクセスしようとした場合、エラーが出る前にUIWebViewDelegateの `webView:shouldStartLoadWithRequest:` で捕まえられるので、そこでSFSafariViewControllerを開いてしまいます。

以下のコードを実行して、GoogleからHTTPS対応していないサイト（例えば http://bricklife.com/ とか…）へ行ってみると挙動を確認できます。ここではiOS 9未満ではSafariを開くようにしましたが、この辺はアプリの要件に応じて工夫するとよいでしょう。

```objc
#import "ViewController.h"

#import <SafariServices/SafariServices.h>

@interface ViewController () <UIWebViewDelegate>

@property (weak, nonatomic) IBOutlet UIWebView *webView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.webView.delegate = self;
    
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"https://www.google.co.jp/"]];
    [self.webView loadRequest:request];
}

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    NSURL *url = request.URL;
    NSLog(@"%@", url);
    
    if ([url.scheme isEqualToString:@"https"]) {
        return YES;
    }
    
    if ([SFSafariViewController class]) {
        SFSafariViewController *vc = [[SFSafariViewController alloc] initWithURL:url];
        [self presentViewController:vc animated:YES completion:nil];
    } else {
        [[UIApplication sharedApplication] openURL:url];
    }
    
    return NO;
}

@end
```

「表示UIをデザインしたい」「ネイティブ側と連携させたい」などの理由から自サイトはUIWebViewで表示したいけど、そこからリンクを貼られている外部のサイトは必ずしもUIWebViewで表示する必要がない場合、これが解決策としては簡単でいいかなと思います。特に既存アプリをiOS 9対応する場合、ネイティブ側もHTML側も実装をほとんど変えずに対応できますよ。
bashの変数パラメータ展開とチルダ展開を組み合わせて、フルパスからホームディレクトリを取り除く


小ネタ。

```bash
$ cd ~/Documents
$ pwd
/Users/catfist/Documents
$ echo $PWD # 組み込み変数PWDには、カレントディレクトリのフルパスが格納されている
/Users/catfist/Documents
$ echo ~ # チルダはホームディレクトリのパスに展開される
/Users/catfist
$ echo ${PWD##/Users/catfist/} # パラメータ展開で前方一致削除
Documents
$ echo ${PWD##~/}
Documents
```

パラメータ展開の際も、ちゃんとチルダはホームディレクトリに展開されるという話でした。
画像リンクのときに暗い背景でも明るくホバーした

暗い背景をホバーでopaticyかけると、画像が暗く透過されてしまう。
そういうときに明るく透過させたい。
四角の画像の場合なら、このやり方でOK。
四角以外だと余白できるので、その場合は？？？まだわからん。


```lang:html
<a href=""><img src="" /></a>
```

```lang:css
a{display:inline-block; background:#fff;}
a:hover img{opacity:0.8;}
```


http://hiyokoti.thick.jp/blog/web/hover-background-black.html
Tips to Embellish your HTML5 Emails

![html5-emails.png](https://qiita-image-store.s3.amazonaws.com/0/91363/99ff5b2f-b0a4-867f-7805-8d5505e170ab.png)

Do your email marketing campaigns seem to be ineffective or left unnoticed by clients? Is the vitality of your email marketing entirely lost?

Then HTML5 happens to be the finest option. HTML5 is one step ahead of all its predecessors in merits. It assists users to create web pages or emails fully loaded with features. The addition of CSS makes this platform super simple and effective. One of the greatest benefits of HTML5 is its capability to include videos.

Integration of videos for the purpose of promotion makes the ordinary emails look much more attractive, and for achieving it users do not have to depend on an expert HTML developer or an HTML5 development company. The activity is simple. Basic knowledge of HTML is enough to trigger the task. Those who use HTML5 in a brilliant way for email promotion will definitely have the upper hand over the ordinary. This extract pops up certain points to improve your HTML 5 emails for better promotion.

HTML5 emails; a way to loom out of the crowd

1. Design authentic HTML 5 templates that show your brand identity, and features without much adornments. The theme you promote should be presented in simple as well as understandable pattern.

2. What users experience out of your email promotion should be of prime importance. Present the theme with clarity by avoiding things that distract the customers’s attention from your emails.

3. It is a fact that HTML5 offers excellent options to add audio, video and many other features to the emails. Still do not load mails with videos that carry a huge amount of data. The emails that take too much time to open are not recommended for any kind of promotion. The customer may be opening the mails at places with low bandwidth, hence go for HTML5 emails with less data, and fast loading.

4. Do not load your HTML5 emails with usual animations or that power point documentation like stuffs we use for presentations.

5. Go Mobile- make your HTML 5 emails highly compatible in any screen resolutions used by the clients. 


Source Link: http://agriyaservices.blogspot.in/2015/08/tips-to-embellish-your-html5-emails.html
【ASP.NET Identity】メニューに表示される項目を、ユーザーのロールによって変える方法

CodeZineさんの[ASP.NET Identity入門](http://codezine.jp/article/corner/511)の記事を読みながら、
ASP MVC5でWebアプリケーションを作成した時に迷ったところがあったのでメモ2


ASP.NET Identityでは簡単にロールを作ることができます。
そこでロールでメニューを分けたくなりなりました。

###Razor構文で書く

```html
@{
<ul>
  <li>通常メニュー</li>
  if (Request.IsAuthenticated && HttpContext.Current.User.IsInRole("User")) {
    <li>お客様メニュー</li>
  }

  if (Request.IsAuthenticated && HttpContext.Current.User.IsInRole("Admin")) {
    <li>管理者メニュー</li>
  }
</ul>
}
```

Request.IsAuthenticated 認証されているかどうかを確認しています。
HttpContext.Current.User.IsInRole() ユーザーのロールを確認しています。

これでユーザーアカウントに設定されているロールで、表示される内容が変わります。

この他にも色んなことをやりたくなってきました・・・
ListViewが空のときに画像を表示する(XML/PG)


ListViewに表示する要素がない場合に、emptyを示す画像を表示する。
`setEmptyView()`という便利なメソッドがあるので、簡単に実装できる。

直接関係ないが、プログラムで実装した際、画像を中央に寄せるのにちょっと調べたのでメモしておく。

## XMLファイルで定義


```xml:xml

<ImageView
  android:id="@+id/emptyImageView"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content" 
  android:layout_gravity="center"
/>
  
...


```

```java:java
...

emptyImageView = (ImageView)findViewById(R.id.emptyImageView);
emptyImageView.setImageResource(R.mipmap.empty);
listView.addEmptyView(emptyImageView);

```


## プログラムで定義

```java:java

ImageView emptyImageView = new ImageView(getActivity());
emptyImageView.setImageResource(R.mipmap.empty);

// 中央寄せにする
emptyImageView.setLayoutParams(new LinearLayout.LayoutParams(
  LinearLayout.LayoutParams.WRAP_CONTENT,
  LinearLayout.LayoutParams.WRAP_CONTENT));
emptyImageView.setGravity(Gravity.CENTER_VERTICAL | Gravity.CENTER_HORIZONTAL);

((ViewGroup) getListView().getParent()).addView(emptyImageView);
getListView().setEmptyView(emptyImageView);

```

おわり
rake task でメソッド定義

なんか共通の処理があって、自然な発想としてメソッドを定義してしまうことがあると思う。

以下の様な rake task 宣言を見て欲しい。例なのでDRYじゃないとか言わないでね。

```ruby
namespace :report do
  def report #1
    # hogehoge
  end
  
  task :show do
    p report
  end
  task :mail do
    mail(body: report)
  end
end

namespace :report2 do
  def report #2
    # fugafuga
  end
  
  task :show do
    p report
  end
  task :mail do
    mail(body: report)
  end
end
```

ここで、 report という名前のメソッドを２回定義しているが、 namespace が分かれてるから大丈夫だって、思うだろう。

## namespace 分かれてない。

分かれてません。どっちも main(Object) に宣言されてしまう。
```rake report:show``` ってすると report #2 のほうが呼ばれて fugafuga されてしまうのだ。

仕方ないので module に入れるべ、ってんで、若い頃の僕はこんなことをした。

```ruby
namespace :report do
  module ReportTask
    def report #1
      # hogehoge
    end
  end
  
  task :show do
    include ReportTask
    p report
  end
  task :mail do
    include ReportTask
    mail(body: report)
  end
end

namespace :report2 do
  module ReportTask2
    def report #2
      # fugafuga
    end
  end
  
  task :show do
    include ReportTask2
    p report
  end
  task :mail do
    include ReportTask2
    mail(body: report)
  end
end
```

これで望みのメソッドを確実に呼べる。めでたしめでたし。
でもなかった。

## include しちゃ意味ない
よく考えればわかることだが、 include ReportTask が何しているかってえと結局 main(Object) に include しちゃうのである。
幸い今回の例を普通に rake タスクとして使うぶんには問題は発生しないが、 

```ruby
task :report_all => ['report:mail', 'report2:mail']
```
などという横断的依存関係を持つタスクが現れた時点で破綻してしまう。

やはりここは
## 全体を module に
入れちまうのが安全というものだ。

```ruby
module ReportTask
  extend Rake::DSL
  extend self

  namespace :report do
    def report #1
      # hogehoge
    end
    
    task :show do
      p report
    end
    task :mail do
      mail(body: report)
    end
  end
end

module ReportTask2
  extend Rake::DSL
  extend self

  namespace :report2 do
    def report #2
      # fugafuga
    end
    
    task :show do
      p report
    end
    task :mail do
      mail(body: report)
    end
  end
end
```
こうするとばっちりモジュールが分かれて安全安心になる。 ```extend Rake::DSL``` は ``task``等のキーワードをモジュール内でも使用するためのもの、``extend self`` は ``def self.report`` と本来書くべきところを手抜きするおまじないである。
どうせ他の場所から呼ばれるものではないし、干渉しない名前を考えるのも面倒なのでいっそ無名モジュールでも良い。

```ruby
Module.new do
  extend Rake::DSL
  extend self

  namespace :report
```

**9/11 追記** 無名モジュール定義時は全ての定数に ``self::`` が必要。 http://qiita.com/kuboon/items/dc5f30abee136abcd319

しかし、この仕事、 ``namespace`` がそもそもやってくれてもいいよねー？って思えてならないのでちょっと黒魔法チックな解決も一応ご用意した。
## namespace を上書き定義してしまえ

```ruby:Rakefile
require 'rake'

# これが元 https://github.com/ruby/rake/blob/v10.4.2/lib/rake/task_manager.rb#L205
module Rake
  module TaskManager
    def in_namespace(name, &block)
      name ||= generate_name
      @scope = Scope.new(name, @scope)
      ns = NameSpace.new(self, @scope)
      Module.new do
        self.extend Rake::DSL
        instance_eval(&block)
      end
      ns
    ensure
      @scope = @scope.tail
    end
  end
end

Admin::Application.load_tasks
```
これで、各 namespace は個別の Module 内で eval されるので全て期待通りに動く (多分)。
namespace の nest とかは全く考慮していないし、同じ namespace でもセクションが別だと名前空間が分かれてしまうみたいな問題があるけど、まあ大体のケースで動くし、もし nest等 が必要になったら include 使って回避するといいと思う。
C++プログラムにMecabを組み込む方法。

- [ウェブ共有型の翻訳メモリー](http://wordring.net/)を試作しています。
- CCライセンスでページを公開しているサイトが増えています。
- http://stackoverflow.com/ もその一つです。
- これなら皆で翻訳を共有できるんじゃないかというコンセプトです。
- その過程でMecabを使いました
- 色々わからなかった点があったのでメモします。

## MSVC上でのMecabライブラリのビルド

- Linux上でビルドすると、Makefile.msvcが作られます。
- MSVCでビルドするにはこのファイルが必要なので、一度Linux上でビルドし、ソースツリーをWindows上にコピーします。
- 後は、MSVCに用意されているコマンドプロンプト上からsrcに移動し、make.batを実行します。
- 沢山のバイナリが出来ますが、C++から使うのに必要なのは*.h、libmecab.dll、libmecab.libです。
- 他に辞書も用意する必要があります。

## プロジェクトへの組み込み

- プロジェクトに.libを読み込み、.hをインクルードするのは通常通りです。
- 実行時にはlibmecab.dllが必要なので、F5で実行するような場合はプロジェクトのフォルダに入れておきます。

## プログラムからの呼び出し

- Model* MeCab::Model::create(const char *arg)は空白文字などで実行時に問題が出ます。
- Model* MeCab::Model::create(int argc, char **argv)は、Windows上で全く問題がありません。

### MeCab::Model::Model* create(int argc, char **argv)の呼び出し

- ここが一番躓いたところです。
- arg[0]には、「myapp」のようなシステム名を入れます。これは何でも構いません。
- arg[1]には、「--rcfile=C:/～/mecabrc」のような設定ファイルのパスを入れます。
- arg[2]には、「--dicdir=C:/～/ipadic」のような辞書ファイルのあるフォルダのパスを入れます。
- わかってみれば何でもないことでした。

### mecabrcの中身

- mecabrcは、辞書の場所などを設定するファイルです。
- 中は全て「;」でコメント化しておきます。空であってもこのファイルが必要です。
- ところでコメントアウトはこういうときに使っていい言葉なんでしょうか？誰か教えて！
- dicrcは辞書についてきたものをそのまま使いました。

## プログラムの配布

- libmecab.dllと辞書を同梱する必要があります。
- それ以外は特に何も必要ありませんでした。

## 感想

- 一度わかってしまえば、どうという事もありませんでした。
- が・・・かなり悩んだ。
- そして、Mecabは恐ろしく速い！
- 最初別スレッドで動かすかと思っていたけど、そんな必要は無かったｗ
Velocityタグとjspタグの対応表一覧 part1


## set
### \#set (Velocity)

\#setは右辺の値を左辺に代入する指示子
ダブルコーテーションを使っている場合は解析され、シングルコーテーションを使っている場合は解析されません。

```
#set( $value = "$value * 3")
#set( $name = "Yojigen")
#set( $name = 'Yojigen')
```

### \<s:set /> (jsp)
var属性に指定した名前に、value属性で指定したプロパティを格納されます。
この「プロパティを格納」が重要で、valueに指定した文字列が格納されるわけではありません。

```
<s:set var="id" value="checkValue" />
<s:set var="checkValue" value="#stts.index +1">
```
checkValueに行番号+1した値を格納します。
このように、Struts2用のタグ内で他のプロパティから値を参照する場合、#をつけてプロパティを記述して、数値を加工できます。

## if
### \#if #elseif #else (Velocity)

```
#if($weight < 40)
 やせ気味です。
#elseif($weight < 90)
 標準です。
#else
 肥満です。
#end
```

### \<s:if>\</s:if> (jsp)

```
<s:if test="%{#variable=='String 1'}">
    This is String 1
</s:if>
<s:elseif test="%{#variable=='String 2'}">
    This is String 2
</s:elseif>
<s:else>
    Other Strings
</s:else>
```

## form
### form (velocity)

基本的にhtmlで記述

```
<form action="/datamart/doSFDailyDatamartReport/" method="post">
<input type="text" name="targetDate" class="w80"/>
<input type="submit" value="実行" class="btnAcceptLow w40" />
</form>
```

### s:form(jsp)

```
<s:form action="/datamart/doSFDailyDatamartReport/" method="post">
<s:textfield name="targetDate" cssClass="w80"/>
<s:submit value="実行" cssClass="btnAcceptLow w40"></s:submit>
</s:form>
```

## コメントアウト
### velociry

```.vm
#* 複数行コメント *#
```

### jsp
```.jsp
<%-- 複数行コメント --%>
```


## define

```vm
#define ($subMenu)
（略）
#end
```

```jsp
<s:param name=""subMenu"">
（略
</s:param>
```

## 繰り返し
### velocity
```vm
#foreach ($value in $values)
（略）
#end
```

###jsp

```jsp
<s:iterator var="value" value="values">
（略）
</s:iterator>
```


## Actionの値を表示 
```vm
${変数名}
```
```jsp
%{変数名}
<s:property value="変数名" />
```
adb で電池の最適化ホワイトリストを操作する

## ヘルプ

```
$ adb shell dumpsys deviceidle -h
```

## ホワイトリストを確認

パッケージが含まれていたら最適化の対象外。
（ブラックリストの方がしっくりくる気がする。）

```
$ adb shell dumpsys deviceidle whitelist
```

## ホワイトリストに追加

頭に `+` をつけてパッケージ名を続ける。

```
$ adb shell dumpsys deviceidle whitelist +パッケージ名
```

## ホワイトリストから削除

頭に `-` をつけてパッケージ名を続ける。

```
$ adb shell dumpsys deviceidle whitelist -パッケージ名
```

## 備考

「電池の最適化」設定画面にバグがあるのか、この変更がUIに反映されないことがあるようです。
（Android 6.0 Marshmallow (MPA44I) Developer Preview 3）
Google Compute Engineへのsshをpecoで効率化する

# Google Compute Engineへのsshをpecoで効率化する
## 概要
GCP(Google Cloud Platform)上にあるGCEへsshする際、Developer Consoleからsshしたりsshコマンドをコピペしたりの運用を不便に感じていました。もっと効率よく出来ないか試してみました。

## 前提
- pecoがインストールされている   
 `brew install peco`もしくは`brew tap peco/peco && brew install peco`
- GCPに1つ以上GCEインスタンスが作られている
- gcloudコマンドが実行できる状態になっている   
    https://cloud.google.com/sdk/gcloud/

## 実施
GCP上にあがっているインスタンス情報を取得

```bash
$ gcloud compute instances list | awk "NR>1 {print \$1,\$2}" > ~/.ssh/gce_hosts
```

無事取れました。リージョン指定できるようにリージョンも入れてます。

```bash
$ cat ~/.ssh/gce_hosts
dev-build-0 asia-east1-a
dev-cache-0 asia-east1-a
dev-db-0 asia-east1-a
dev-redis-mkhz asia-east1-a
dev-web-0 asia-east1-a
dev-web-autoscaler-zg1o asia-east1-a
```

先ほど作成したgce_hostsとpecoを使ってsshコマンドを作成。

```bash
$ gcloud compute ssh --zone $(cat ~/.ssh/gce_hosts | peco | awk "{print \$2,\$1}")
```

おお、これは便利！
![Screen Shot 2015-09-02 at 19.01.28.png](https://qiita-image-store.s3.amazonaws.com/0/20310/68c0be49-40f5-e014-8a94-7333e244cf08.png)

```bash
user ~]$ gcloud compute ssh --zone $(cat ~/.ssh/gce_hosts | peco | awk "{print \$2,\$1}")
Warning: Permanently added '0.0.0.0' (RSA) to the list of known hosts.
[user@dev-web-0 ~]$
```

## ちなみに
.bashrcにalias貼っておくとさらに便利。

```bash
alias reload-gcessh='gcloud compute instances list | awk "NR>1 {print \$1,\$2}" > ~/.ssh/gce_hosts'
alias peco-gcessh='gcloud compute ssh --zone $(cat ~/.ssh/gce_hosts | peco | awk "{print \$2,\$1}")'
```
Electron で ChatWork クライアントを作ってみる

もともと nw.js で作っていたのですが、久々に Electron を見てみたらトレイ周りがかっちょよくなっていたので、書きなおしてみました（昔ぼくが見た時はトレイを表示させるとベコベコ感が気に入らなくて、nw.js だったのですが勘違したのかも？）。

[レポジトリはこちら](https://github.com/k0sukey/CWelectron)

![capture.png](https://qiita-image-store.s3.amazonaws.com/0/47686/85966dc7-cadf-88f2-0ccd-56239bea7138.png)

### 使った npm パッケージ

```json
{
  "dependencies": {
    "lodash": "^3.10.1",
    "moment": "^2.10.6",
    "q": "^1.4.1",
    "react": "^0.13.3",
    "request": "^2.61.0"
  },
  "devDependencies": {
    "electron-packager": "^5.0.2",
    "electron-prebuilt": "^0.31.0",
    "gulp": "^3.9.0",
    "gulp-babel": "^5.2.1",
    "gulp-load-plugins": "^0.10.0"
  }
}
```

gulp-babel を使っているけれど、ES6 で書いているのではなくて jsx をコンパイルしたかっただけです。また、普段は Titanium でアプリを書いているので、Backbone.js に慣れているのですが、今回はお勉強ということで React を使ってみました。コンパイルされると、app フォルダの中に chat.js として書き出されます。

### アプリのエントリーポイント

エントリーポイントになる main.js はチャットルームの取得をして、トレイにメニューを作ります。Slack みたいにウィンドウを作ってチャットルームを並べても良いのですが、トレイからサッとアクセスして閲覧＆書き込みが終わったらすぐにウィンドウを閉じたいので、トレイ常駐型な感じです。

nw.js ではウィンドウ間の引数渡しが非常に困難でしたが、Electron はとっても簡単です。今回は ChatWork の API トークンとチャットルームの ID 等を引き渡しています。なんと、カスタムプロパティに設定してあげると、子ウィンドウで参照することができるんですね。ただし、文字列のみっぽいです。JSON であれば ```JSON.stringify``` してから渡してあげれば OK ですね。

main.js でウィンドウを開いて、

```js
var window = new BrowserWindow();
window.token = token;
window.loadUrl('file://' + path.join(__dirname, 'app', 'html', 'chat.html'));
```

chat.jsx で引数を受け取ります。

```js
var remote = require('remote'),
    token = remote.getCurrentWindow().token,
    roomId = remote.getCurrentWindow().roomId;
```

nw.js の場合はウィンドウを開くときの URL に引数として繋げていました。パースするのも面倒ですし、セキュリティ的にダメダメですよね...。

### タイムラインを表示する

src/chat.jsx でタイムラインウィンドウを表示します。コンパイルされると app/chat.js ですね。

タイムラインウィンドウを表示するために Virtual DOM を使います。根本となる Timeline クラス、一つ一つのメッセージを表示するための Message クラス、最後にメッセージ入力のための Textarea クラスで構成されています。

メッセージを送信する「Shift＋Enter」のキーイベントの取得が面倒でした。```onKeyDown``` でシフトの監視＆フラグ立てをして、```onKeyPress``` でシフトフラグが立っている＆エンターが押された際にポストするようにしています。もっとかっちょいい方法があれば教えて下さい。そして、メッセージのポストが正常に完了したら、テキストエリアの中身を消してあげます。

```js
getInitialState: function(){
    return {
        message: '',
        shift: false
    };
},
doKeyDown: function(e){
    if (e.which === 16) {
        this.state.shift = true;
    }
},
doKeyPress: function(e){
    var that = this;

    if (e.which === 13 && this.state.shift && that.state.message !== '') {
        request.post({
            url: 'https://api.chatwork.com/v1/rooms/' + roomId + '/messages',
            headers: {
                'X-ChatWorkToken': token
            },
            form: {
                body: this.state.message
            }
        }, function(error, response, body){
            if (error) {
                return;
            }

            var node = React.findDOMNode(that);
            node.value = '';

            timeline.componentDidMount();
        });
    }
}
```

メッセージの出力ですが、チャットワークの独自タグを上手く表示させるのに心が折れたので、To と Re だけそれなりに表示しています。久々に HTML / CSS を書いて、かなり忘れていてダメダメでした。


結構テキトーに書いてみたのですが、それなりにできてしまったので Electron 楽しいです。nw.js も似たようなものなので比べてみると良いかもですね。nw.js からのポーティングは、ほぼコピペで終わりました。タイムラインウィンドウを常に最前面に表示、とか機能追加していきたいですね。
Ubuntu Vimでクリップボードwith mouse

Ubuntuにデフォルトで入っているvimではclipboardを有効にすることは出来ないと思います
※vim --version|grep clipboardで確認可能
※+clipboardになっていなくてはならない

そこでclipboard機能を持つGUI付きのvimをインストールし、
※GUI付きのvim：vim-gtk, vim-gnome, vim-athena
設定ファイル.vimrc（vimrc）にて以下を追記します。
set clipboard=autoselect, unnamedplus
↑
上記はネットに載ってる一般的な方法だと思います。
ただこれだと上手く動きませんでした。

ただ
ノーマルなVimでファイルを開く（vim -u NONE -N [file]）と上手く動いたので、
設定で何か干渉があるんだろうと思って見たらありました
↓
set mouse=a

これはvimにてマウスを有効にする記述でモードaとはネットによく載ってるものです。
http://kaworu.jpn.org/vim/vim%E3%81%A7%E3%83%9E%E3%82%A6%E3%82%B9%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95

あまり理解せずに設定していましたが、
モードをa→v（ビジュアルモード）に変更するとclipboardを有効にすることが出来ました。
【Unityエディター拡張】 ワンクリックでファイルを1つ上のディレクトリへ移動させる

ファイルを1つ上のディレクトリへ移動させるのがめんどくさかったので作りました。

ファイル選択　→　右クリック　→　「親ディレクトリへ移動」を選択
![image](https://qiita-image-store.s3.amazonaws.com/0/44288/346044b1-4d1d-d1a7-7199-b2046ec77ff3.png)

1つ上のディレクトリへファイルが移動します。
![image](https://qiita-image-store.s3.amazonaws.com/0/44288/da84d72a-2bd6-5d2e-1a13-97d120f4b372.png)


#ソースコード
```AssetHelper.cs
using UnityEngine;
using UnityEditor;

public class AssetHelper
{
    [MenuItem("Assets/親ディレクトリへ移動", true)]
    static public bool ChkSelectAsset()
    {
        //ファイルパス
        string path = AssetDatabase.GetAssetPath(Selection.activeObject);

        //ファイル拡張子
        string extension = System.IO.Path.GetExtension(path);

        return extension != "";
    }

    [MenuItem("Assets/親ディレクトリへ移動")]
    static public void MoveAssetToParent()
    {
        Object obj = Selection.activeObject;

        //ファイルパス
        string path = AssetDatabase.GetAssetPath(obj);

        //移動先ディレクトリ
        string dir = GetParentDirectory(path, 2);

        MoveAssetsToDirectory(Selection.objects, dir);
    }
    static string GetParentDirectory(string filepath, int n = 1)
    {
        string dir = filepath;
        for (int i = 0; i < n; i++)
        {
            dir = System.IO.Directory.GetParent(dir).FullName;
        }
        return ConvertSystemPathToUnityPath(dir);
    }

    public static string ConvertSystemPathToUnityPath(string path)
    {
        int index = path.IndexOf("Assets");
        if (index > 0)
        {
            path = path.Remove(0, index);
        }
        return path;
    }

    static private void MoveAssetsToDirectory(Object[] objects, string dir)
    {
        foreach (Object o in Selection.objects)
        {
            string path = AssetDatabase.GetAssetPath(o);
            string extension = System.IO.Path.GetExtension(path);
            AssetDatabase.MoveAsset(path, dir + "/" + o.name + extension);
        }
    }
}
```
iOS 9 で開発版アプリを起動する時に「信頼されていないエンタープライズ開発元」

# 事象
エンタープライズ証明書を利用して作成した ipa を iOS 9 beta 5 の端末にインストールし、起動しようとしたところ表題のアラートが上がった。
メッセージは以下のもの。

```
"iPhone Distribution: [開発元]"はこのiPhoneでは信頼されていません。
この開発元が信頼されるまで、そのエンタープライズAppは使用できません。
```

# 解決策
以下から開発元のアプリを信頼をする。
[一般] の後の項目名はiOSバージョンや端末の状態によって異なる。
[設定] > [一般] > [プロファイル] or [デバイス管理] or [プロファイルとデバイス管理]
Redshiftでの各エンコーディング形式メモ

Redshiftは列レベルで圧縮形式を選ぶことができ、これにより以下の効果が得られる。

* ストレージスペースが節約
* データのサイズが軽量化 => ディスク I/O の量が減少 => クエリパフォーマンスが向上

このエンコーディングの形式がいろいろあるので、公式の内容を元に軽くメモ。

## エンコーディングの指定方法
エンコーディングの指定は、`CREATE TABLE`と`ALTER TABLE`時のみ。
既存のカラムのエンコーディングの変更はむりっぽい。

``` mysql:
# 新規作成時
CREATE TABLE products (
  id INT encode delta,
  name CHAR(20) encode bytedict
);
# カラム追加時
ALTER TABLE products ADD created_at date encode delta32k;
```

## 各エンコーディングの特色
エンコーディングタイプ | キーワード | 説明
:-: | :-: | :--
[RAW](http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/c_Raw_encoding.html)  | raw | 非圧縮
[BYTEDICT](http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/c_Byte_dictionary_encoding.html) | bytedict | 列のデータドメインが一意の値 256 個未満である場合に最適
[DELTA](http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/c_Delta_encoding.html) |  delta, delta32k | 列内の連続する値間の差を記録することによりデータを圧縮。<br>日時列にとって非常に有用
[LZO](http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/lzo-encoding.html)  | lzo |  非常に高い圧縮率と良好なパフォーマンスを実現<br>文字列などの自由形式テキストに最適
[MOSTLY](http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/c_MostlyN_encoding.html) | mostly8, mostly16, mostly32 |  列のデータ型よりも小さなサイズで格納。<br>値が-128-127であれば `INT(4byte)` -> `MOSTLY8(2byte)`
[RUNLENGTH](http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/c_Runlength_encoding.html) | runlength | 連続して繰り返される値を、値と連続発生数から成るトークンに置き換え、ディクショナリ化<br>データ値が連続して頻繁に繰り返されるテーブルに最適<br>ソートキーは非推奨
[TEXT](http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/c_Text255_encoding.html) |  text255, text32k |ブロックごとに、一意の単語の個別のディクショナリ<br>同じ単語が頻繁に出現する VARCHAR 列を圧縮する場合に有用

## 型別チェックリスト
### INTEGER (SMALLINT, INT, BIGINT)
* 同じ値が頻繁に繰り返されている => RUNLENGTH
* 値が制限されている(256種類以内) => BYTEDICT
* 値が連続している => DELTA
* 値の大半が小さな値 => MOSTLY
* その他 => RAW

### REAL, DOUBLE PRECISION
* 同じ値が頻繁に繰り返されている => RUNLENGTH
* 値が制限されている(256種類以内) => BYTEDICT
* その他 => RAW

### DECIMAL
* 同じ値が頻繁に繰り返されている => RUNLENGTH
* 値が制限されている(256種類以内) => BYTEDICT
* 値が連続している => DELTA
* 値の大半が小さな値 => MOSTLY
* その他 => RAW

## DATE, TIMESTAMP
* 同じ値が頻繁に繰り返されている => RUNLENGTH
* 値が制限されている(256種類以内) => BYTEDICT
* 値が連続している => DELTA
* その他 => LZO

## VARCHAR
* 同じ値が頻繁に繰り返されている => RUNLENGTH
* 値が制限されている(256種類以内) => BYTEDICT
* 値が連続している => DELTA
* 値の大半が小さな値 => MOSTLY
* 同じ単語が頻繁に出現する => TEXT
* その他 => LZO

## 参考
* [データ型](http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/c_Supported_data_types.html)
* [圧縮エンコードを確認や解析](http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/tutorial-tuning-tables-compression.html)
* [圧縮エンコード一覧](http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/c_Compression_encodings.html)
* [エンコーディング選択例](http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/Examples__compression_encodings_in_CREATE_TABLE_statements.html)
MavenのM2Eエラーになった時（突然全てのプロジェクトが真っ赤になる現象）の対処方法


## 1.eclipceを閉じる
/workspace/.metadata/.plugins/の中にあるorg.eclipse.m2e.hogeを全て消す
eclipceを起動してbuildが実行されるのを待つ

ダメだったら2へ

## 2.eclipceを閉じる
/workspace/.metadata/.plugins/の中にあるorg.eclipse.m2e.hogeを全て消す
/eclipce.app/Contents/MacOS/へ行き
./eclipse -cleanを実行

それでもダメだったら3へ

##3.eclipceのworkspaceをworkspace2などの適当な名前に切り替える
元のworkspaceをimportする
gitのリモートリポジトリにpushされたら通知する

# きっかけ
開発環境が

- GitHub、Slack、Chatworkなどの外部サービス使えない
- リポジトリの流れはローカル（個人毎）→リモート（個人毎）→共有

なところでリモート（個人毎）へのpushを簡単にチェックしたかった。

# やったこと
## githooks
["日時" "ブランチ名" "リポジトリ名"]の形式で出力させる
例）`2015/09/02 12:34 feature/XXX hoge.git`
下のスクリプトへのリンクを`.git/hooks`に配置

```bash:post-update
#!/bin/bash

# push されたブランチ名が BRANCH に入る
BRANCH=$(git rev-parse --symbolic --abbrev-ref $1)

# 誰のリポジトリにpushされたか
DIR=$(basename `pwd`)

# push時の日付
NTIME=$(date "+%Y/%m/%d %H:%M")
case "$BRANCH" in
  "develop" )
      #develop用の処理
      echo "dev"
      ;;
  release* | hotfix*)
      #release, hotfix用の処理
      echo "release"
      ;;
  "master")
      #master用の処理
      echo "master"
      ;;
  feature* )
      #feature用の処理
      echo "feature"
      echo $NTIME $BRANCH $DIR  >> "log_dir"/push_history
      # 最新30件分取得
      # 出力先は後述のブラウザで表示のためhttpサーバの公開用ディレクトリに出力
      tail "log_dir"/push_history -n 30  > "log_dir"/push_history.log
      ;;
esac
```
## ブラウザ上に表示
- javascriptでhookから出力されたログファイルを取得し表示
- 差分がアレば通知 [HTML5 Desktop Notifications](https://github.com/ttsvetko/HTML5-Desktop-Notifications)

```html
<div
Related Push <span id="ptime"></span><br>
<div id="pushlog" ></div>
</div>
```

```js
var afterPush;
var beforePush;
setInterval("updatePushLog()", "適当な間隔で");
$(function() {
    checkPermission();
    displayPushLog();
});

# push履歴の表示
function displayPushLog() {
    var now = new Date();
    var str = now.getHours()+"時";
    str+= now.getMinutes()+"分";
    str+= now.getSeconds()+"秒";
    $('#ptime').text(str);
    $.get("data/push_history.log", function(data) {
      $('#pushlog').html(data.split('\n').reverse().join('<br>'));
    });
    afterPush = data;
}

# 前回のログと比較して変更がアレば通知
function updatePushLog() {
    displayPushLog();
    if (beforePush === undefined) {
        beforePush = afterPush;
    }
    if (afterPush !== beforePush) {
        var lastCount = afterPush.match(/\n/g);
        notify.createNotification("Pushされました", {
            body: (afterPush.split('\n').reverse())[1],
            icon: "alert.ico"
        });
        beforePush = afterPush;
    }
}

# 通知設定確認
function checkPermission() {
    if (!notify.isSupported) {} else {
        switch (notify.permissionLevel()) {
            case notify.PERMISSION_GRANTED:
                break;
            case notify.PERMISSION_DEFAULT:
                notify.requestPermission();
                break;
            case notify.PERMISSION_DENIED:
                alert("デスクトップ通知が許可されていません。ブラウザの設定を確認して下さい。");
                break;
        }
    }
}
```

## まとめ
ほんとこじんまりでならありな手段かも知れない。
でもGitBucket等のクローン系を入れてしまった方が結果として楽だと思う。
参考：[コミットしたらGitBucketとJenkinsとHipChatに任せて他の事やってましょう(1)](http://qiita.com/ryuthky_github/items/c27b8f0f15b7e658efc2)

まあ今回はgithooksのお勉強ということで。
git stashで特定のファイルだけ引き出す

# やり方

```
git checkout stash@{N} ファイル名
```
- で行ける(Nは任意の数字)
- popではないのでstashは残る

## stash一覧確認

```
git stash list
```

## stashで変更を隠したファイルの確認
```
git stash show stash@{N}
```

## 各ファイルの詳細な変更点
```
git stash show -p stash@{N}
```
ライブラリプロジェクトで参照するjarをproductFlavor/BuildTypeで切り替える


アプリプロジェクトにおいて、使用するjarをproductFlavor/BuildTypeで切り替える方法は、[こちら](http://qiita.com/le_skamba/items/af290f53f6d5ac0a2603)に書いたとおりだが、ライブラリプロジェクトがあって、そちらで使うjarを切り替えたい時にどうしようかというお話。

# 前提
AndroidStudio 1.3

# 最終目標
構成サンプル

```
+ AppProject

+ AndroidLibProject
  + Libs
	 + sdk_debug.jar
	 + sdk.jar
```

上記サンプルのような構成の時に、debug/releaseでそれぞれリンクするjarを変えたい。
debug時はsdk_debug.jarを、release時はsdk.jarをリンクして欲しい。

# NGだった方法

[こちら](http://qiita.com/le_skamba/items/af290f53f6d5ac0a2603)と同じく、ライブラリプロジェクトのbuild.gradleでdependenciesを設定。

```groovy:build.gradle(AndroidLibProject)
dependencies {
    debugCompile files('libs/sdk_debug.jar')
    releaseCompile files('libs/sdk.jar')
}
```

で、BuildVariantsを

AppProject=debug
AndroidLibProject=debug

としてビルドしたが、どうもsdk.jarを参照している動きをしていて、想定通りでない。

# 正解

まず、ライブラリプロジェクトのbuild.gradleに`publishNonDefault true`を追加する。

```groovy:build.gradle(AndroidLibProject)
apply plugin: 'com.android.library'

android {

...(省略)...

	publishNonDefault true

}

dependencies {
    debugCompile files('libs/sdk_debug.jar')
    releaseCompile files('libs/sdk.jar')
}
```

続いて、AppProject側のbuild.gradleにもdepentenciesの指定をする。

```groovy:build.gradle(app)
dependencies {
	debugCompile project(path: ': AndroidLibProject', configuration: 'debug')
	releaseCompile project(path: ': AndroidLibProject', configuration: 'release')
}
```

こうしておくと、AppProjectのBuildVariantsを切り替えると、AndroidLibProjectも連動して切り替わるようになる。

productFlaovrでは試していないが、おそらく同じ方法で行けるはず。
ダメだったらコメント頂ければ^^;