OmniAICreator/Qiita-1.07M huggingface dataset:
NCBI SRA (Short Read Archive) 形式から fastq 形式に変換する Makefile

# 結論
下記に載せるようなMakefileを書いて，データファイルと同じディレクトリに配置し，
`make SRA=SRR0000000.sra`などとコマンドを実行すれば良い。
ただし，`SRR0000000.sra`はダウンロードしてきたsraファイルの名前とする。

ファイル中で，`somewhere`となっている部分は，SRA Toolkit をインストール先にあわせて適宜変えてください。

## paired-end のデータの場合のFasta ファイル
```
## commands
FASTQ-DUMP = /somewhere/fastq-dump

## files
FASTQ1 = $(SRA:%.sra=%_1.fastq)
FASTQ2 = $(SRA:%.sra=%_2.fastq)

all: $(FASTQ1) $(FASTQ2)

# obtain the paired-end fastq files from a given sra file
$(FASTQ1) $(FASTQ2): $(SRA)
	$(FASTQ-DUMP) --qual-filter --split-files $<
```
## paired-end でない場合のFasta ファイル
```
## commands
FASTQ-DUMP = /somewhere/fastq-dump

## files
FASTQ = $(SRA:%.sra=%.fastq)

all: $(FASTQ)

# obtain the fastq file from a given sra file
$(FASTQ): $(SRA)
	$(FASTQ-DUMP) --qual-filter $<
```


# 背景
## NCBI SRAと.sra形式
次世代シーケンサーで得られた生データは，NCBI の SRA (short read archive) というデータベースに登録されています
http://www.ncbi.nlm.nih.gov/sra
http://trace.ddbj.nig.ac.jp/dra/index.html

ここに登録されているデータは，実験一セット(1 run)を単位として.sra形式にまとめられてます。
http://trace.ddbj.nig.ac.jp/dra/faq.html#data_files_sra

このため，データを利用する場合は，NCBIが提供しているSRA Toolkitを用いて，データ形式を変換する必要があります。
http://trace.ncbi.nlm.nih.gov/Traces/sra/sra.cgi?view=toolkit_doc

今回は，fastq-dumpというツールを用いて，fasta 形式に変換することにします。
http://www.ncbi.nlm.nih.gov/Traces/sra/sra.cgi?view=toolkit_doc&f=fastq-dump



## Makefile 
あるファイルXから別のファイルYを生成するというような依存関係があるとき，
Makefileを書いて，依存関係をプログラムに管理してもらうと楽です。

今回は，sra形式のファイルからfasta形式のファイルを作るMakefileを書きました。
Windowsアプリをリリースまでに必要なことまとめ

# Windowsアプリを配布する際の覚書

## 1.EXEに関してやること
・pdbパスを削除するBinplace
　※Binaryエディタで見るとpdbのパスがまるっと書き込まれていたりするのでBinplaceで削除してあげましょう
　　恥ずかしいフォルダー名とか丸見えになってしまいますよ？
・全てのEXEにAuthenticodeを埋め込みましょう
　証明書です！配布元の確認も出来ますので権限がデフォルト権限のEXEでも埋め込むことを推奨します。

## 2.インストーラーにおこなうこと
・Authenticodeは必須です

## 3.その他、実装する際の注意点
・むやみやたらと権限昇格をしない。
・権限昇格が必要な場合は別のBinaryとしてShellExecuteExなどを使用して実行時に昇格するようにする。
・EXE、DLLともにmanifestファイルを埋め込むこと
CakePHP Bootstrap アイコン付きボタン

**FormHelper::button**

```php
<?php echo $this->Form->button(
	'<span class="glyphicon glyphicon-ok" aria-hidden="true"></span>'.__(' 更新'),
	array(
		'type' => 'submit',
		'class' => 'btn btn-primary',
	)
); ?>
```

**FormHelper::postLink**
確認ダイアログ付き

```php
<?php echo $this->Form->postLink(
	'<span class="glyphicon glyphicon-trash" aria-hidden="true"></span>'.__(' 削除'),
	array('action' => 'delete', $this->Form->value('PdfList.id')),
	array(
		'escape' => false, 'class' => 'btn btn-danger', 'role' => 'button',
		'confirm' => __('# %s の情報を削除します。よろしいですか？', $this->Form->value('PdfList.id'))
	)
); ?>
```

**HtmlHelper::link**

```php
<?php echo $this->Html->link(
	'<span class="glyphicon glyphicon-edit" aria-hidden="true"></span>'.__(' Edit'),
	array('action' => 'edit', $pdfList['PdfList']['id']),
	array('escape' => false, 'class' => 'btn btn-success btn-xs', 'role' => 'button')
); ?>
```
RecyclerViewのスクロールの可・不可を制御する


RecyclerViewでのスクロールを不可能にし、任意のタイミングでスクロール可能にしたい場合のメモ。

# RecyclerView#OnItemTouchListenerを実装
まずRecyclerViewのOnItemTouchListenerを実装したクラスを用意します。

```java
public class ScrollController implements RecyclerView.OnItemTouchListener {

    public ScrollController() {
    }

    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
        return false;
    }

    @Override
    public void onTouchEvent(RecyclerView rv, MotionEvent e) {
    }

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
    }
}
```

# onInterceptTouchEventがtrueを返すよう変更
onInterceptTouchEventがtrueを返すことでRecyclerViewのスクロールが無効になります。

```java
public class ScrollController implements RecyclerView.OnItemTouchListener {

    public ScrollController() {
    }

    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
        return true;
    }

    @Override
    public void onTouchEvent(RecyclerView rv, MotionEvent e) {
    }

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
    }
}
```

使い方はRecyclerViewにaddOnItemTouchListenerで追加するだけです。

```java
RecyclerView rv = new RecyclerView(getContext());
ScrollController controller = new ScrollController()
rv.addOnItemTouchListener(controller);
```

再びスクロール可能にするには、removeOnItemTouchListenerを使います。

```java
rv.removeOnItemTouchListener(controller);
```

# 使いやすくする
スクロールの可・不可を制御するためにaddとremoveを繰り返すのを避けたいので、メソッドを用意し動的にonInterceptTouchEventの戻り値を変えられるようにします。

```java
public class ScrollController implements RecyclerView.OnItemTouchListener {

    private boolean isDisableScroll;

    public ScrollController() {
    }

    public void disableScroll() {
        isDisableScroll = true;
    }

    public void enableScroll() {
        isDisableScroll = false;
    }

    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
        return isDisableScroll;
    }

    @Override
    public void onTouchEvent(RecyclerView rv, MotionEvent e) {
    }

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
    }
}
```

これでaddOnItemTouchListenerで一度コントローラーを追加するだけで済み、スクロールを可にする場合にremoveOnItemTouchListenerの実行が不要になります。

```java
RecyclerView rv = new RecyclerView(getContext());
ScrollController controller = new ScrollController()
rv.addOnItemTouchListener(controller);

// スクロール不可
controller.disableScroll();

// スクロール可
controller.enableScroll();
```

# 参考
* http://stackoverflow.com/questions/30531091/how-to-disable-recyclerview-scrolling
osclassでmariadb使ってたら日本語化したときにカテゴリ一覧が英語のまま

# 環境

 * OS - centos7.2 (Vagrantでbento/centos-7.2)
 * SELinux - permissive
 * apache - 2.4.6
 * php - 5.4.16
  - php-gd
  - php-mbstring
  - php-mysql
  - php-pdo
 * osclass - 3.6.1

# 事象

この環境でDBをmariadb使ってインストール、日本語化したところ

[MariaDB. Language of categories doesn't change](https://github.com/osclass/Osclass/issues/2000)

こちらと同じ事象が発生してカテゴリ一覧が英語のままになります。

# 対処

いくつかの対処法が考えられますが、

[Why is ORDER BY in a FROM Subquery Ignored?](https://mariadb.com/kb/en/mariadb/why-is-order-by-in-a-from-subquery-ignored/)

で案内されているとおりSQLを書き換えてosclass本家に取り込んで頂くのが正しい姿かと思います。
が、今の私には敷居が高いですので、とりあえず mysqlを入れることで回避しました。

ansible的には

`yum: name=http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm state=present`

して

`yum: name=mysql-community-server state=present enablerepo=mysql56-community disablerepo=mysql57-community`

mysql5.7だとrootのパスワードなしなど適当な設定でサクッとつかえなかったので5.6に。

試してませんが、日本語しか使わないからーって場合は、日本語化した後に、英語を削除したらmariadbのまま動きそうな予感がします。
RaspberryPiで脈拍データをCSV出力(脈拍センサ)

#手順とリンク
1.準備と基礎編
http://qiita.com/tkyko13/items/62ff91bce7d9e555c434
2.アナログ入力確認編
http://qiita.com/tkyko13/items/981989a006a95821ccde
3.pythonで確認
http://qiita.com/tkyko13/items/44ca53b027fa249acdc6
4.脈拍センサ
ここ
5.csv出力
http://qiita.com/tkyko13/items/9c0eb46c1b65129d2556

時間が経っちゃいました
今回、ラズベリーパイB+になっていますが、多分前回と同じBでも同じように動作すると思います

#参考URLと使用センサ
http://qiita.com/tkyko13/items/981989a006a95821ccde

#配線など
前回AD/DAコンバータにソケットをつけたもの（つけてもらったもの）を使用しましたが、あれだと3.3vのところしか通電してなく、今回使う脈拍センサは5vが必要なので、無理やりですがこのようになりました

![DSC_0667.jpg](https://qiita-image-store.s3.amazonaws.com/0/76572/df5fbee4-75f0-88cb-64a2-7cee522a9425.jpeg "DSC_0667.jpg")

![DSC_0666.jpg](https://qiita-image-store.s3.amazonaws.com/0/76572/0319a239-c768-b731-c027-3fd8b5702121.jpeg "DSC_0666.jpg")

![DSC_0665.jpg](https://qiita-image-store.s3.amazonaws.com/0/76572/1181b060-51d2-a7b3-fb4c-a918d21a8764.jpeg "DSC_0665.jpg")

線をAD/DAコンバータと一緒にラズパイのピンに一緒に挟みこんじゃう形になっています
ソケットがあるんだから通電させれば…と思うでしょうが、やってもらっていたこともありとりあえず脈拍センサに光が付いたのでこれでやってみようと思います

#実験
おさらいがてらアドレス確認していきます

```
sudo i2cdetect -y 1
```

コマンドエラーや結果スクリーンショットは前々回を参考にお願いします
アドレスは同じでした

次に、前回作成したpythonによって値を見ていきます
アドレスが変わっていたらソースコード編集が必要でしたが、今回は大丈夫です
そのまま実行していきます

![スクリーンショット 2016-02-18 18.26.23.png](https://qiita-image-store.s3.amazonaws.com/0/76572/ea4e03ee-3040-9f98-fe36-71588f1775a7.png "スクリーンショット 2016-02-18 18.26.23.png")

なんか値が取れている気がします

次回、これが本当に脈拍っぽいか？CSV出力し、エクセルでグラフにしてみたいと思います
もしかしたらpython内でグラフも出力するかも
Raspberry PiにMCP2515を接続する

#ハードウェア

MCP2515を積んだ基板として[WSN217](http://www.wsnak.com/kit/217/index.htm)を使用。ただしraspberry piのロジックレベルが3.3Vなので、そのままでは完全に動作しない。回路図とパターンを見て、MCP2515の18番とMCP2551の３番をつなぐパターンを切断、MCP2515にはSPI端子の２番に3.3Vを入れて、3.3V駆動とした（一応動いたけど自己責任でお願いします／きちんとレベルシフタを入れた方が気分がいいですね）。

![IMG_9959.JPG](https://qiita-image-store.s3.amazonaws.com/0/56044/fda61f83-f29f-3cf7-b0ad-0d6351692d08.jpeg)

#Raspberry Pi側の設定

[mt08](http://qiita.com/mt08/items/535ab4690eecbcf5375d)さんの投稿を参考にさせていただきました


canインタフェースをループバックで設定する。

```
$sudo ip link set can0 type can bitrate 500000 loopback on
```

can0を手動でアップする


```
$sudo ifconfig can0 up
can0      Link encap:不明なネット  ハードウェアアドレス 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 
          UP RUNNING NOARP  MTU:16  メトリック:1
          RXパケット:0 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:0 エラー:0 損失:0 オーバラン:0 キャリア:0
      衝突(Collisions):0 TXキュー長:10 
          RXバイト:0 (0.0 B)  TXバイト:0 (0.0 B)
```


can-utilのcan-dumpを起動

```
$ ./candump can0
```

もう一枚ターミナルを立ち上げて

```
$ ./cansend can0 123#deadbeef
$ ./cansend can0 123#0011223344556677889900
```

（この#の後が送信するメッセージとなる）

さきほどのcandumpを立ち上げているウインドウに以下のような表示がされればOK
![candump.jpg](https://qiita-image-store.s3.amazonaws.com/0/56044/d09a4f36-fbb9-bef8-df61-544e4f7464c9.jpeg)

ちなみに、実際に自動車につなげたデータをcansnifferで表示するとこんな感じになります（BGMが流れるので音量注意）。

[https://youtu.be/tw1P2ONnB_M](https://youtu.be/tw1P2ONnB_M)
[baserCMS] 固定ページでcode欄を入力欄に見立てて使ってみるTips

baserCMSでサイト作ってるときにたまに起こるのが「あとひとつ入力欄要る」です。
そんなときに対応できる方法を考えてみました。
本記事の対象は固定ページです。選択肢としては以下になるかなぁ？と思います。

- キーワードプラグインを導入する
- 条件分岐でなんとかする
- code 欄使う[今回のTips]


## 想定している対象者
- baserCMSでウェブサイトを制作をしている方

## 発生状況
1. baserCMSの固定ページで、入力欄があとひとつあればなんとかなるような状況のとき
2. 追加したいけど特別なコストは掛けることができない状況のとき

### 環境
- baserCMS 3.0.9
  - 他の旧バージョンでも利用可

## 対処
固定ページのcode欄を利用して、CakePHPのビューブロックの仕組みを使ってみる。

## code欄を入力欄に見立てて使ってみる

固定ページには、「オプション」で開いて利用できる code欄があります。
この code欄に入力した内容は、通常、メインコンテンツ部分の上部に表示されます。

```
<?php $this->BcBaser->flash() ?>
この辺に code欄の内容は出力される
<?php $this->BcBaser->content() ?>
```

※ちなみにこの code欄の表示はどんな仕様になってるか見てみたところ、
/lib/Baser/Model/Page.php の addBaserPageTag() で付与処理されてました。

利用するために準備を以下のように仕込みます。

```
<?php $this->fetch('subTitleBlock') ?>

<?php $this->BcBaser->flash() ?>
<?php $this->BcBaser->content() ?>
```

準備のポイントは
「```<?php $this->fetch('subTitleBlock') ?>```」を書いておくことだけです。
※ 名称 subTitleBlock はあくまで例です。これが決まりではなくなんでも良いです。
そして、code欄側には以下のように記述します。

```
<?php $this->start('subTitleBlock') ?>
<h2>ちょっと出したいテキスト</h2>
<?php $this->end() ?>
```

こうすることで、メインコンテンツ部分の上部には何も表示されず、目的の場所に目的のテキストを表示することができます。
code 欄に記載がない場合は、何も表示されません（何もしない）し、start〜end の範囲が利用・表示されるため、code欄に他の記載用途があった場合も影響受けることがありません。

これで、特別な作業コストをかけることもなく、表示を追加することができますね。


### 関連記事

- http://www.materializing.net/archives/2016/02/20043329.php
StorageCraft ShadowProtect のUDP転送機能 Shadow Storeamを試す！

StorageCraftの展開するバックアップソフト。ShadowProtectのUDP転送機能（レプリカ機能）を軽く試してみたのでレポート。

WAN跨ぎのレプリカが多いと思うのでSoftLayerの東京データセンタとワシントンデータセンタ間でのテストとしました。
プライベート側は100Mbのネットワークが標準だけど、これだと面白くないので10Mbに落としてテスト。
遅延は概ね145msにてガチ安定しているような状況なので、一般的なインターネットVPNよりはネットワーク環境としては恵まれていると言えるかも。
遅延に関しては国内のインターネットVPNの4-5倍程度あると考えてもらえればと思います。

概ねの作業手順は以下のpdf通りです。

https://www.storagecraft.com/sites/default/files/pdf-jp/Image-Manager-Quick-Start-Guide-JP.pdf

◆バックアップ対象のサーバ（今回はバックアップ対象サーバのDドライブにバックアップを取得）
・ShadowProtectをインストール
・バックアップ先ストレージの設定（今回はローカルのDドライブ）
・ImageManagerのインストール（要.net環境）
・バックアップの取得

![image](https://qiita-image-store.s3.amazonaws.com/0/101027/0ba0e72e-8cf6-fd25-9728-6d245f35922f.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/101027/756e982e-dc8c-05a1-87e1-bd0da044d8df.png)

----------------------


◆レプリケート先のサーバ
・ShadowStoreamをインストール
・admin以外のユーザを作成
・レプリケートを受ける共有の設定
![image](https://qiita-image-store.s3.amazonaws.com/0/101027/2d9c1303-d477-7710-2fbb-78f4dadf6635.png)



いよいよレプリカの作成を行います。
![image](https://qiita-image-store.s3.amazonaws.com/0/101027/ba547133-2ea0-281c-3e3b-554cf437e1fd.png)

Shadow Stoream Serverを選択します。
![image](https://qiita-image-store.s3.amazonaws.com/0/101027/9bac6747-4371-72b1-21e2-477c242e63cc.png)

暗号化や圧縮、ベースイメージ転送を行うか否かの設定を行います。
![image](https://qiita-image-store.s3.amazonaws.com/0/101027/af3e2444-5307-e0a0-d787-28a95d882e66.png)



設定が完了すると、程なくして転送が開始されます。
![image](https://qiita-image-store.s3.amazonaws.com/0/101027/07c00818-95b7-8a74-3246-43f2bc28fbce.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/101027/342079af-9590-6e5c-e4a2-e8b43fc3f6f1.png)

10Mbの帯域を使いきっていますね。まずい場合はスロットリングも可能です。
![image](https://qiita-image-store.s3.amazonaws.com/0/101027/f6709463-171d-a941-010e-ef64b228abb2.png)

ImageManagerのプロセッサ使用率が高いですが、本環境は1vCPU構成ですので…メモリの消費は非常に少ないと言えます。
![image](https://qiita-image-store.s3.amazonaws.com/0/101027/609a7fe7-7437-0ef0-653a-7f977ecf7365.png)

-----------------

バックアップファイルサイズは概ね25GBだったから、効率90%程度と仮定すると6.5時間ぐらいかかるのかな？
特に圧縮とか効いてない感じだと、最初はフルに時間かかっちゃうのかな？

VMwareコンバーターのコンバート元イメージとしてもサポートされているShadowProtect。
VSS技術は古くから実績があるし、大好きなソフトの一つです。
もうちょっといじってみよ。
Pythonでコマンド引数を1行で分解する

#ソース

```py
#!/usr/bin/env python

import sys

com = { i:j for i,j in [ (i[1][1:], sys.argv[i[0]+1] if len(sys.argv)>i[0]+1 and sys.argv[i[0]+1][0]!='-' else True ) for i in enumerate(sys.argv) if i[1][0]=='-'] }

print com
```

上記のプログラムに引数を与えて実行すると，下記のようになる．（ファイル名はtest.py）

```shell-session
$ ./test.py -a hoge -b gaga
{'a': 'hoge', 'b':'gaga'}
$ ./test.py -a hoge -b gaga -c
{'a': 'hoge', 'c': True, 'b': 'gaga'}
```

あとはswitch-case的なことをするなり，そのままこのdictオブジェクトを持ち回るなり出来るようになる．

# 解説
分かり易くするためにまずは改行とコメントを追加．

```py
com = { i:j for i,j in  #辞書の作成
        [ (i[1][1:], sys.argv[i[0]+1] if len(sys.argv)>i[0]+1 and sys.argv[i[0]+1][0]!='-' else True ) #タプルの作成
            for i in enumerate(sys.argv) if i[1][0]=='-' #インデックスの作成
        ]
      }
```

解説は後ろから．まずはインデックスの作成．最後のところだけ抜き出すと

```py
optIndex = [ i for i in enumerate(sys.argv) if i[1][0] == '-' ]
```

コマンド引数が格納されているsys.argvをenumerateを使って番号を割り当て，if文でそれぞれのコマンド引数のうち先頭文字が-であるものだけを抜き出す．printするとこんな感じ．

```shell-session
$ ./test.py -a hoge -b gaga -c
optIndex: [(1, '-a'), (3, '-b'), (5, '-c')]
```

で，ここで得られたインデックスとオプション情報のタプル`i`を使って，オプション文字と値のタプルを作る．つまり，2〜3行目の`[]`の中でやっているのは`[ (key, value) for i in optIndex ] `といった感じ．
keyの方は簡単で

```py
[ i[1][1:] for i in optIndex ]
```

として取れる．optIndex値の場所の2文字目以降全部，といった感じ．（まぁ別に1文字目からにして`-`を入れてもいいんだけど）
次はvalueの方で，普通に値だけとるなら下記のようにする．

```py
[ sys.argv[i[0] + 1] for i in optIndex ]
```

インデックス情報の次の値を指定するだけ．ただ，これだと全てのオプションは値を取らないといけなくなって，`ls -a`みたいなことができない．そこで，valueの値が-で始まっていないかどうか，またインデックスの指し示すvalueの先が引数の中側かどうかを判定する．判定に引っかかったらTrueを突っ込んでおく．

```py
values = [ sys.argv[i[0]+1 if len(sys.argv) > i[0]+1 and sys.argv[i[0]+1][0]!='-' else True ]
```

2行目はこの2つをタプル化するだけ．1行目はタプル化した値を辞書化するだけ．つまり，`{ i:j for i,j in optTuple }`をやってるだけ．
これを全部くっつけると最初に説明したような

```py
com = { i:j for i,j in [ (i[1][1:], sys.argv[i[0]+1] if len(sys.argv)>i[0]+1 and sys.argv[i[0]+1][0]!='-' else True ) for i in enumerate(sys.argv) if i[1][0]=='-'] }
```

が出来上がる．

# まとめ
一見わけがわからないものでも分解してちゃんと後ろから追っかけると理解できる．
「こんなことしなくてもライブラリあるでしょ？」っていう突っ込みは無しの方向で．
swiftで月の0を取る

swiftで日付を扱う場合について、
02月を2月にしたい時のメモ。

0パディング（0埋め）の情報は出てくるけれど
月の頭の0を取る方法がなかなかわからなかったので…

```lang:swift
        let myDateFormatter: NSDateFormatter = NSDateFormatter()
        myDateFormatter.dateFormat = "YYYY年M月"
```

YYYY年MM月としていたところを
YYYY年M月にするだけでした！
Microsoft EdgeのsessionStorageとtarget="_blank"

    - 早速Edgeで開発してみたら

　2015年9月にWindows10が出ましたね。気になるMicrosoft Edgeいじってたら、早速予期せぬ事態が。

　**WebStorage(sessionStorage)の考え方が他のブラウザと違う。**

　まず前提としてHTML5の機能WebStorageの、特にsessionStorageは 「ブラウザのウィンドウ/タブ間でデータが共有されない」のが特徴。
　ところが、タブ間で共有できることがある。
　こちらのStackOverFlowがわかりやすい。

>[sessionStorage on new window isn't empty, when following a link with target=“_blank”](http://stackoverflow.com/questions/17297287/sessionstorage-on-new-window-isnt-empty-when-following-a-link-with-target-bl)

　要するに「target="_blank"でタブ違うのにsessionStorage共有されるんだけど？」という内容。回答は「browsing contextの解釈の違いじゃね？」みたいな小難しい話がされてます。

　上記StackOverFlowの [jsFiddle](http://jsfiddle.net/P9nUv/3/) を各ブラウザで試してみるとわかりやすいし面白い。私の端末(Windows10/DELL製)でさくっと試したところ、

| ブラウザ | sessionStorage |
|:-----------|------------:|
| GoogleChrome 45|保存される|
| Firefox 41|保存される|
| InternetExplorer 11|**保存されない**|
| MicrosoftEdge 20|**保存されない**|

　ということまでは確認できた。
　localStorage使えればいいのだけれど、2窓でログインとかできなくなるから悩みどころ。


***
- 参考サイト

>[@IT ブラウザでストレージ？ Web Storageを使いこなそう](http://www.atmarkit.co.jp/ait/articles/1108/12/news093_2.html)
>[gsol-dev's blog HTML5の新機能紹介 ～WebStorage～](http://gsol.hatenablog.com/entry/2014/08/19/HTML5%E3%81%AE%E6%96%B0%E6%A9%9F%E8%83%BD%E7%B4%B9%E4%BB%8B_%EF%BD%9EWebStorage%EF%BD%9E)
間違って入力したコマンドのhistoryの削除

# historyの恥をかき消す方法

共用サーバーなどbashでコピペとかで間違ったコマンドとか打って
historyに書かれた恥をかき消す方法

## 1行の履歴を消す
失敗したのが１行の場合
```history -d offset```
offsetに削除したい行番号を入れる
しかしコレ実行すると　history -d の履歴は残る罠

## 複数行の履歴を消す
historyファイルを直接編集
```vi ~/.bash_history```

コレが一番手っ取り早いと個人的には思う

## 全部消す

履歴を全部消す男気あふれるコマンド、コレをやると逆に怒られる可能性大
```history -c```
Ansible で AWS の keypair をリージョン間で共有する

# はじめに

* Ansible 2.0.0.2
* AWS 初級者（初心者ではないけど中級者でもない）
* やっていいのかはわからないけど、人づてにそうしてると聞いた（アカウントで１つのマスターキーペアを全リージョンで使用）
* ので AWS のキーペアを Ansible で作成して全リージョンで同じものを使う playbook を書いた（聞いた先では手作業だそうだけど）
* 単に他リージョンへのキーペアのインポートなので正確には共有とは言わない（かもしれない。AWS で共有とはオブジェクトは１のはずなので）
* 正確には全リージョンでテストしてない（たぶん出来ると思うけど）

# 先に説明

* ansible の構成は<a href="http://qiita.com/raki/items/e8b1cdac4a86eea0231f">オレオレベストプラクティス</a>
* ただ、Ansible で AWS の場合（鯖を作るんじゃなくてコレみたいに環境を整えるだけの場合）単一のplaybookで動くのでどうでもいいはず
* キーペア名（keyname）が登録されていない場合に新規でキーペアを作成（すでにある場合はスキップ。べき等性）
* その秘密鍵をローカルに保存（~/.ssh/keyname.pem）
* その秘密鍵から公開鍵を作成（~/.ssh/keyname.pub）
* その公開鍵を指定リージョンにインポート（import2region）
* インポート先のリージョンには同名のキーがあった場合置換が発生し、常に所定のキーペアが使われる、らしい（フィンガープリントが更新されている）
* ansible-playbook playbook/aws_keypair.yml
* ssh -i ~/.ssh/test-key.pem ec2-user@IPADDR

# ansible-playbook

playbook/aws_keypair.yml

<pre>
- name: AWS key pair init
  hosts: localhost
  connection: local
  gather_facts: False
  vars:
    region: "us-east-1"
    keyname: "test-key"
    # aws ec2 describe-regions | jq '.Regions[].RegionName'
    import2region:
      #- "eu-west-1"
      #- "ap-southeast-1"
      #- "ap-southeast-2"
      #- "eu-central-1"
      #- "ap-northeast-2"
      - "ap-northeast-1"
      #- "us-east-1"
      #- "sa-east-1"
      #- "us-west-1"
      #- "us-west-2"

  tasks:

    - name: create key pair
      ec2_key:
        region: "{{ region }}"
        name: "{{ keyname }}"
      register: ec2_key_out

    - name: write to file
      local_action: shell echo -e "{{ item.value.private_key }}" > ~/.ssh/"{{ keyname }}".pem && chmod 600 ~/.ssh/"{{ keyname }}".pem
      with_dict: ec2_key_out
      when: item.value.private_key is defined

    - name: make publickey
      local_action: shell ssh-keygen -y -f ~/.ssh/"{{ keyname }}".pem > ~/.ssh/"{{ keyname }}".pub ; chmod 644 ~/.ssh/"{{ keyname }}".pub
      with_dict: ec2_key_out
      when: item.value.private_key is defined

    - name: maybe you want key pair for other region?
      ec2_key:
        name: "{{ keyname }}"
        key_material: "{{ lookup('file', '~/.ssh/' + keyname + '.pub') }}"
        region: "{{ item }}"
      with_items: import2region
</pre>

# 雑感

* cloudformation に挫折して
* terraform で運用維持がきつそうなのでやめて
* Ansible で可能なところだけ投げるだけでアカウント別初期処理にできればいいかなという最中
* 仕事的に新しいアカウントでの環境構築が降って来るのでｗ
* 仕事用には vars や role も分けて書いてるけど、AWS 環境初期構築にはこんな感じで１処理１ファイルのほうが断然使いやすい気がする
* 北米リージョンで作って東京リージョンでも大丈夫だったので他も大丈夫だろう、的なｗ
Rails 開発環境のバージョン確認 [自分用メモ]

**1. OSとバージョンを確認する** 
cat /etc/issue

「Ubuntu 14.04.2 LTS \n \l」から「Ubuntu」がOS、バージョン「14.04.2」であると認識

**2. Rubyバージョンを確認**
ruby -v

「ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-linux]」から、「2.1.5p273」がバージョンであると認識

**3. RubyGemsのバージョンを確認する**
gem -v

**4. Railsのバージョンを確認する**
rails -v

**5. PostgreSQLのバージョンを確認する**
psql -v

**6. Heroku Toolbeltのバージョンを確認する**
heroku --version
「heroku-toolbelt/3.41.3 (x86_64-linux) ruby/2.1.5」から、3.41.3がバージョンであると認識する

**7. Gitのバージョンを確認する**
git --version
SlackをRSSリーダーにしたら、他のRSSリーダーサービスを使わなくなった話


![スクリーンショット 2016-02-23 9.52.58.png](https://qiita-image-store.s3.amazonaws.com/0/11726/0286401d-236c-9979-3f5c-a246be6ab563.png "スクリーンショット 2016-02-23 9.52.58.png")

ちょっとしたSlackによるライフハックがあったので、共有します。
（Slackの使者ではありませんｗ）

## Slack の RSS Integrations
Slackには、RSS Integratoinsがありますね。無料版では貴重な 1Integrationsですが、RSSは便利すぎて外せません。たぶんあんまり利用している人少ないのではないでしょうか。そう思ったので共有します。

今回は、何が便利だったかまとめておきたいと思います。

設定はこちら：https://slack.com/apps/A0F81R7U7-rss

## 1. Slackだから勝手に毎日アクセスする
自分は、個人的なSlack Teamを作成して、そこで運用してますが、企業などで導入している方にもおすすめです。

忙しくて「あー、今日Feedチェックするの忘れたー」なんてことはなくなります。

## 2. リアルタイムで発掘できる
最新情報はいち早く知りたい方にはおすすめです。PUSH通知などの設定もChannel毎に行えるので、用途にあわせて設定することで必要な情報が必要なときに知ることができます。

## 3. クロスプラットフォームで簡単に利用できる
当たり前ですが、Slackが各種プラットフォームでアプリを提供してくれているので、とても便利です。

## 4. 整理・グルーピングが楽
channelという概念にあせて設定を設計すれば、あとは日常的にRSSリーターとして利用するだけでOKです。

※個人的な分け方のコツがあるので、それは↓で共有します。

## 5. Slackの機能が使えるだけで十分優秀なRSSリーダーに
未読の一括既読とかも標準機能なので、 `Shift + Esp` で一発です。逆に未読に戻したいものやStarやPinも活用すれば、本当に不憫なくRSSリーダーとして利用できます。

## 6. 単なるRSSリーダーじゃなくてコミュニケーションツールになる
Slackなので、参加者と即コミュニケーションできます。実際Techblogや新しいgadgetが発表されたときなど、「お、いいね。」とか「これ実際試したけどすごくいいよ…！」などの実際の声を友人や同僚などから得ることができます。何よりもこれが最高です。

## 個人的なコツ
色々運用・改善していて気づいたコツがあるので共有しておきます。

1. 更新頻度が分単位や時間単位で行われるようなものは、1channelにする
	- 例えば、news系
1. 頻度は高くないが、グルーピングしておきたいものは、まとめて1channel
	- 例えば、企業のtechblog系
	- 個人のblogとは区別しておいたほうがいい
1. bot専用のchannelにしないで気になる投稿があれば即コメントしてコミュニケーションする
	- そのchannelに参加者がいない場合は、permalinkをcopyして共有すれば、一石二鳥です。
1. イベント系はまとめて #event channelへ。
	- これで気になるイベントも逃しません。
	- twitter integrationsとかも一緒に連携すれば間違い無し。
1. Facebook,Twitter,AWSやGCPなどのプラットフォーム情報は個別にchannel化
	- 公式ブログなどをfeed登録しておけば、最新情報やイベントなど
1. 定期的に登録feedの整理をする
	- `/feed list` コマンドで簡単に確認できます。


## ※ちなみに現在のIntegrationsリスト

- GitHub
- Google Drive
- Hubot
- RSS(100 over configured!)
- Slack API Tester
- Twitter
- Slash Command
- Webhooks

あれ？今無料版の上限っていくつなんだろう？ｗ
FTP > Link > パッシブモードによるサーバー側の通信ポートの固定


http://ameblo.jp/itboy/entry-10249857007.html

> パッシブモードの場合は、ポートをある範囲で受け付けるように指定します。

...

> 上記の場合は、1050番から1100番の範囲のポートが使われます。
こちらは、アクティブモードとは違い、通信先のポート番号になります。
VMware製品へのglibc脆弱性の影響情報

## 概要

VMware社からセキュリティアドバイザリ「[VMSA-2016-0002: VMware product updates address a critical glibc security vulnerability](http://www.vmware.com/security/advisories/VMSA-2016-0002.html)」が発行されており、ESXi 5.5以降と仮想マシンアプライアンスが影響を受けるとされている。パッチの提供も一部開始されている。

## 詳細

VMware製品への影響や対策は、[ナレッジベース](http://kb.vmware.com/)および[セキュリティアドバイザリ](https://www.vmware.com/security/advisories/)で確認する。以下に確認できた範囲で情報をまとめる。

### 背景

2016年2月18日に、National Vulnerbility Databaseに[CVE-2015-7547](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2015-7547)が登録されている。
JPCERTからも「[glibc ライブラリの脆弱性 (CVE-2015-7547) に関する注意喚起](https://www.jpcert.or.jp/at/2016/at160009.html)」が出されている。

### VMware社からの発信情報

今回のglibc脆弱性のVMware製品への影響については、VMware社からセキュリティアドバイザリが発行されている。

* [VMSA-2016-0002: 
VMware product updates address a critical glibc security vulnerability](http://www.vmware.com/security/advisories/VMSA-2016-0002.html)

また対応状況を知らせるナレッジとして以下が出されており、ワークアラウンドもまとめられている。

* [VMware Response to CVE-2015-7547: glibc getaddrinfo stack-based buffer overflow (2144032)](https://kb.vmware.com/kb/2144032)

### 関連ナレッジの和訳

現在のところ、関連ナレッジの和訳はない。

### 対策

セキュリティアドバイザリVMSA-2016-0002に従って対策を行う。

**ESXi**

ESXi 5.0までは、この脆弱性の影響を受けないとのこと。ESXi 5.5～6.0については、パッチが提供されているので、適用する。

**Windowsベース製品**

Windows版vCenterを含むすべてのWindowsベース製品は、この脆弱性の影響を受けないとのこと。

**仮想マシンアプライアンス**

この脆弱性の影響を受けるものがある。[KB:2144032](https://kb.vmware.com/kb/2144032)を参照し個々に確認、対策ないしワークアラウンドの適用を行う。

たとえばvCenter Server Appliance（以下vCSA）については、上記KBからリンクされている「[VMware vCenter Server Appliance workaround for CVE-2015-7547: glibc getaddrinfo stack-based buffer overflow (2144075)](https://kb.vmware.com/kb/2144075)」を参照する。このKBの記述によれば、vCSA 5.0、5.1、5.5、6.0が影響を受け、現時点でのワークアラウンドとしてファイアウォールルールの変更が推奨される。

## 参照

本脆弱性の内容。

* [NVD - Vulnerability Summary for CVE-2015-7547](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2015-7547)
* [glibc ライブラリの脆弱性 (CVE-2015-7547) に関する注意喚起](https://www.jpcert.or.jp/at/2016/at160009.html)

VMware社からの発信情報。

* [VMSA-2016-0002: 
VMware product updates address a critical glibc security vulnerability](http://www.vmware.com/security/advisories/VMSA-2016-0002.html)
* [VMware Response to CVE-2015-7547: glibc getaddrinfo stack-based buffer overflow (2144032)](https://kb.vmware.com/kb/2144032)

この他、製品個別に出されたKBがあり、上記KB:2144032からリンクされている。

VMware社のナレッジやセキュリティアドバイスは、随時更新されるので、適宜、原文を確認されたい。

----

本ページ内容は筆者が参照の便のためにある持点でまとめた個人的なメモです。内容を保証するものではなく、また筆者の所属組織等とは一切かかわりがありません。
FTP > Link > Linux ゲートウェイの FTP プロキシで、パッシブモードがうまく動作しない


[f-secure](https://community.f-secure.com/t5/%E3%83%A1%E3%83%BC%E3%83%AB%E3%81%A8%E3%82%A6%E3%82%A7%E3%83%96-%E3%83%97%E3%83%AD%E3%83%86%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3/Linux-%E3%82%B2%E3%83%BC%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A4%E3%81%AE-FTP-%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E3%81%A7/ta-p/63946)

> パッシブモードで FTP 接続は可能だが、その後の ls コマンド等がタイムアウトするような場合、該当マシン、または経路上の FW の設定により該当ポートが塞がれている可能性が高いです。
Java SE7 Gold 取得を目指して (1)

# Java SE7 Gold をとりたい…!

ということで、業務時間前に勉強することにしました。
ただ参考書を読んでも身にならない気がしたのでアウトプットしてみます。

## なぜSE7?
Java SE7 Silver を持っているからです。
SE8 Goldを取得するためには、↓のどちらかで攻めることになります。

1. Java SE7 Silver → Java SE7 Gold → Java SE8 移行試験
1. Java SE8 Silver → Java SE8 Gold

せっかくSE7 Silverを持っているので少しでも無駄だったと思いたくない、という心理です。

## 参考書

翔泳社 Java プログラマ Gold[SE7]
よく見かける紫色の本です。「これ1冊で合格できる!」と書いてあるので信じます。

## 進め方

1~2日で1章ペースを考えています。

1. 解説読む
1. 例題解く(実際にコーディング) 
1. 知らなかったこと、間違っていたことをQiitaへメモ

の流れでしょうか。 

## 本日知ったこと(1章)

* Enuｍ

  * Enum.values() 列挙子一覧がとれる
  * Enum.valueOf(String name) 指定の定義名を持つ列挙子がとれる
  * Enum.A.name() 定義名がとれる(finalメソッド)
  * Enuｍ.A.ordinal() 定義された順序がとれる(0~)

* static インポート

  * import static java.gold.Hoge.*; Hogeクラスのstaticメンバを `Hoge.XXX` で呼べる
  * import static java.gold.Hoge.method; staticメソッド method() を `method()` で呼べる
  * import static java.gold.Hoge.CONST; static定数 CONST を `CONST` で呼べる

最近ずっとC#漬けでしたが、Enumまわりが便利ですね。インタフェースも実装できますし。
達人の .tmux.conf から tmux コマンドオプションなんかを学ぶ


tmux 設定関連のエントリは数あれど、コマンドやオプションの説明はあまり見なかったので、メモがてらの投稿　※随時追記

##### 設定の引用元
- 初期設定
- [達人に学ぶ.tmux.confの基本設定](http://qiita.com/succi0303/items/cb396704493476373edf)

### bind-key -r -T prefix Up select-pane -U

- `-r` は repeat-time オプションで、次のキー入力までの待ち受け時間の設定。デフォルトは500で、単位はミリ秒。

- `-T` は `key-table` を指定する。省略した場合は `-T prefix` とみなす。

> 見出しのコマンドは `bind-key -r Up select-page -U` としても同義


### bind h select-pane -L

- `bind` は `bind-key` のエイリアス

> `bind-key h select-pane -L` と同義

### setw -g mode-keys vi

- `setw` は `set-window-option` のエイリアス

- `-g` は globalセッション(またはウィンドウ)にオプションを設定する。
- `mode-keys` は `vi` or `emacs` を指定可能で、デフォルトは `emacs`
MarkDownエディタMarkRightがいい感じだった

なんかいいマークダウンエディターないかな〜と思って探してたら見つけたので、書いておきます。

みたところMac以外にも、WindowsでもLinuxでも動くようです。
なんせElectron製！

# 公式github

https://github.com/dvcrn/markright

# インストール手順

基本的にgithubみたら大体できますが、一部そのままだとappファイルが違うとこに入って使えない状態になったのでメモっておきます。

homebrewでインストール

```bash
$ brew cask install markright
```

で、appファイルのopenを.bashrcあたりにaliasに切っておきます。

```vim:.bashrc
alias markright="open -a /opt/homebrew-cask/Caskroom/markright/0.1.10/MarkRight.app"
```

あとはコマンドラインから今切ったaliasで起動するだけ


# 使ってみた感想

すごくシンプルでいいです。
余計な機能とかない方が好きなので、ありがたいです。
そのおかげで起動も割と早いですし。

あとシンタックスハイライトも効いてるようなので、これもありがたいです。

こんな感じ


![スクリーンショット 2016-02-23 9.28.03.png](https://qiita-image-store.s3.amazonaws.com/0/105934/0bd70592-0a82-0efd-50ad-ddac5929b323.png)
TypescriptでscalaのOptionを実装

いちいちnullチェックをしている時にふとscalaのOption型が恋しくなることがあります。

かと言って外部ライブラリ探してきて導入するのもなぁって思い軽めに実装した時のメモ。

早速コード

```ts
    export interface Optional<A> {
        isEmpty: boolean;
        map<B>(f: (a: A) => B): Optional<B>
        bind<B>(f: (a: A) => Optional<B>): Optional<B>
        getOrElse<A>(a: A): A
        get(): A
    }
    class Just<A> implements Optional<A> {
        private value: A;
        public isEmpty: boolean = false;
        constructor(a: A) {
            this.value = a
        }
        map<B>(f: (a: A) => B): Just<B> {
            return Some(f(this.value));
        }
        bind<B>(f: (a: A) => Just<B>): Just<B> {
            return f(this.value);
        }
        getOrElse(a: A): A{
            return this.value;
        }
        get(): A{
            return this.value;
        }
    }
    class Nothing<A> implements Optional<A> {
        private value: A;
        public isEmpty: boolean = true;
        constructor(a: A) {
            this.value = a;
        }
        map<B>(f: (a: A) => B): Nothing<B> {
            return None;
        }
        bind<B>(f: (a: A) => Just<B>): Nothing<B> {
            return None;
        }
        getOrElse<A>(a: A): A{
            return a;
        }
        get(): A {
            throw Error("NoSuchElementException");
        }
    }
    export const None = new Nothing(null);

    export function Some<A>(a: A): Just<A>{
        return new Just(a);
    }
```

# 使用例

```ts
Some(10).map(a => a * 10).get()
=> 100
```

# Option型ってmonad だよね?

モナド則とは以下
1. (return x) >>= f == f x
2. m >>= return == m
3. (m >>= f) >>= g == m >>= (\x -> f x >>= g)

## 検証してみる

以下の様な関数fを定義しときます。

```ts
var f = a => {return new Just("FFF!!!")};
```

### 1. (return x) >>= f == f x

```ts
(Some("Monad!").bind(f).get() === f("Monad!").get()
```

### 2.  m >>= return == m

```ts
new Just("Monad!").bind(Some).get() === Some("Monad!").get()
```

### 3. (m >>= f) >>= g == m >>= (\x -> f x >>= g)

関数gの定義

```ts
var g = (x) => new Just("GGG!")
```

```ts
var left = (new Just("Monad!").bind(f)).bind(g).get()
var right = new Just("Monad!").bind(x => {return f(x).bind(g)}).get()
left === right
```

# まとめ

コードは短いですがライブラリ入れたほうが楽かもですね・・・
CakePHP Search Plugin導入

```php:app\Config\bootstrap.php
CakePlugin::load('Search');
```

```php:app\Model\Model.php
public $actsAs = array('Search.Searchable');
public $filterArgs = array(
	 'field1' => array(
		'type' => 'value',
		'field' => 'Model.field1'
	),
);
```

```php:app\Controller\XxxxxController.php
public $components = array('Search.Prg');
public $presetVars = true;
```

**検索結果をPaginationする時**

```php:app\Controller\XxxxxController.php
public function search() {
	$this->Prg->commonProcess();

	$this->Paginator->settings = array(
		'conditions' => array(
			$this->Model->parseCriteria($this->passedArgs)
		)
	);
	$this->set('lists', $this->Paginator->paginate());
}
```

**Paginationしない時**

```php:app\Controller\XxxxxController.php
public function search() {
	$this->Prg->commonProcess();

	if ($this->request->data) {
		// 検索結果の表示
		$passedArgs = $this->passedArgs;
	} else {
		// 検索しない時の表示
		$passedArgs = null;
	}
	$lists = $this->Model->find('all', $passedArgs);
	$this->set('lists', $lists);
}
```
Google Chromeでwheelイベントとmousewheelイベントは共存しない話

# 結論
`mousewheel`イベントと`wheel`イベントの両方を設定した場合、`wheel`イベントしか発火しない。
`mousewheel`イベントは **non-standard** かつ **deprecated** なので `wheel`イベントを使うべき。


# 経緯
1. 某ブログをChromeで閲覧すると何故かマウスホイールでのスクロールができなかった
    * キーボード（↓↑・スペース・PageDown/Up）での移動はできた
    * 別のブラウザでは問題ない
    * 他の人も問題ない
    * （スクロールがなんか滑らかだ？）
1. もしかしたらChrome拡張が原因かもしれないと思い調べたら、ホイールスクロールに関係するChrome拡張が有効になっているとスクロールできないことが判明
1. スクロールを滑らかにする[jQuery.NiceScroll](https://github.com/inuyaksa/jquery.nicescroll "inuyaksa/jquery.nicescroll: nicescroll plugin for jquery - scrollbars like iphone/ipad")を使用されていた
    * ソースを確認するとNiceScrollのバージョンが古かった
    * より新しいNiceScrollを使っている別のWebページで検証 → スクロール問題ない
    * 古いNiceScrollに何かありそう → `mousewheel` イベントが使われていた
        * ※ [mousewheelイベントはnon-standard かつdeprecated](https://developer.mozilla.org/en-US/docs/Web/Events/mousewheel "https://developer.mozilla.org/en-US/docs/Web/Events/mousewheel")

# 検証
`mousewheel` イベントを使うとなぜスクロールできなくなるのか検証。
仮説：Chrome拡張では `wheel` イベントを使っていたので、相性が悪いのかも？

## 条件
* Google Chrome 48.0.2564.109 m (64-bit)で確認
* 2回ホイール回転

## 1. mousewheelのみ
```javascript
document.addEventListener("mousewheel", function() {
	console.log("mousewheel: 1");
});
document.addEventListener("mousewheel", function() {
	console.log("mousewheel: 2");
});
```

```text:console.log
mousewheel: 1
mousewheel: 2
mousewheel: 1
mousewheel: 2
```

## 2. wheelのみ
```javascript
document.addEventListener("wheel", function() {
	console.log("wheel: 1");
});
document.addEventListener("wheel", function() {
	console.log("wheel: 2");
});
```

```text:console.log
wheel: 1
wheel: 2
wheel: 1
wheel: 2
```

## 3. mousewheelとwheel両方
```javascript
document.addEventListener("mousewheel", function() {
	console.log("mousewheel: 1");
});
document.addEventListener("mousewheel", function() {
	console.log("mousewheel: 2");
});
document.addEventListener("wheel", function() {
	console.log("wheel: 1");
});
document.addEventListener("wheel", function() {
	console.log("wheel: 2");
});
```

```text:console.log
wheel: 1
wheel: 2
wheel: 1
wheel: 2
```

# 結論
`mousewheel`イベントと`wheel`イベントの両方を設定した場合、`wheel`イベントしか発火しない。
`mousewheel`イベントではなく`wheel`イベントを使う。


# 参考
## NiceScrollの該当部分の実装
[最新版のjQuery.NiceScroll](https://github.com/inuyaksa/jquery.nicescroll/blob/3.7.6/jquery.nicescroll.js#L2411-L2413) [^NiceScroll最新] は、mousewheelではなくwheelを使っているので問題無さそうです。

[^NiceScroll最新]: 2019/11/17 現在 v3.7.6

```js
if ("onwheel" in _doc.createElement("div")) { // Modern browsers support "wheel"
  self._bind(el, "wheel", fn, bubble || false);
} else {
```

## ホイールイベントのMDNドキュメント

[mousewheel - Event reference | MDN](https://developer.mozilla.org/en-US/docs/Web/Events/mousewheel "https://developer.mozilla.org/en-US/docs/Web/Events/mousewheel")
> **Do not use this wheel event.**
> This interface is non-standard and deprecated.

[wheel - Event reference | MDN](https://developer.mozilla.org/en-US/docs/Web/Events/wheel "https://developer.mozilla.org/en-US/docs/Web/Events/wheel")
> This event replaces the non-standard deprecated **mousewheel** event.
Excel > Weekday(c7,2)の意味 > 月曜始まりになる

http://qiita.com/7of9/items/b5d0462afe15bc6dade5#comment-406959f1c1a5e055909e
にていただいたコメント。

> weekday(c7,2)>=6 だとよりスッキリかもしれないです。

これをgoogle検索してみたが、「種類」の意味が分かりにくかった。

実際にExcelで実行してみて理解できた。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/448d4910-2d40-4e3e-e972-0586c5096c72.png)

種類を2とすることで月曜始まりになり、weekday(c7,2)の値が6以降には土曜日と日曜日になるということらしい。

いいことを聞いた。感謝。

また、今回わかったのは、EXCELの情報についてはgoogle検索するより実際に使ってみる（そしてヘルプを見る）方が理解しやすい場合もあるということだった。
SSH鍵の変更作業メモ

自宅サーバーや各種サービスで使用しているSSH鍵を変更して回ったので、その作業内容をメモします。

# 方針

## 鍵を変更するサービス

まず、鍵を変更するサービスを調べて回りました。

|サービス|用途|
|---|---|
|GitHub|個人用、仕事用|
|BitBucket|個人用、仕事用|
|OpenShift|個人用のみ|
|Digital Ocean|個人用のみ|
|自宅サーバー|個人用のみ|

これらに登録してある公開鍵を更新します。個人用と仕事用でアカウントを分けているサービスがあるので、個人用鍵と仕事用鍵を作成します。

> **NOTE:** 個人用鍵と仕事用鍵で分けるのが面倒だったので1ファイルで管理しようとしましたが、同じ鍵を別アカウントで登録することができなかったので、それぞれ鍵を作成しました。例えば、GitHubの個人用アカウントに鍵を登録して、次に仕事用アカウントに同じ鍵を登録しようとするとエラーになります。

## 鍵を保有する端末

次に、鍵を保有する端末を列挙します。

* MacBook
* Windows PC
* iPhone

これらが保有する秘密鍵を更新します。iPhoneは、serveraudiatorというアプリでssh接続をするために、秘密鍵を持っています。

## 鍵の保管方法

各サービスには公開鍵を登録して、端末には秘密鍵を保有しますが、複数端末で鍵を共有するためにLastPassに秘密鍵(文字列で)とそのパスワードを保管することとします。以前はDropboxに鍵ファイルを格納して、それを各端末で共有していましたが、操作ミスを考えてやめました。

> **NOTE:** LastPassに秘密鍵をファイル添付しようとしましたが、WindowsとOS Xの両方で試しても動作が不安定だったため、やめました。

## 鍵の作成方針

ビット数は多いほうが良いと考え、8192bitで作成します。やり過ぎだとは思いますが。パスワードは必ず設定として、英数記号の50桁以上とします。どうせ手入力する機会なんてそう多くはありませんので。

# 作業

## 鍵を作成

鍵は、 **必ず端末側で作成** します。端末側で作成して各サービスに公開鍵を登録する、という手順になります。

シェル環境であれば、`ssh-keygen -t rsa -b 8192`で作成します。Windows PCであれば、putty-genで作成します。

作成後、秘密鍵・公開鍵・パスワード・秘密鍵(ppk形式)をLastPassのセキュアノートに保管します。

## 公開鍵をサービスに登録

自宅サーバー以外の各サービスに、 **公開鍵を登録** します。間違えて秘密鍵を登録しようとしてもエラーになるだけですが、せっかく秘匿している秘密鍵をネットワークに流すべきではありません。登録手順は、だいたいサービス設定あたりから鍵登録ページに行けます。

自宅サーバーは注意が必要です。旧公開鍵を削除→新公開鍵を登録という手順で行った場合、万が一、操作をミスしたり作業途中でssh接続を切断してしまうと取り返しがつかなくなることがあるので、以下の手順で行ったほうが良いです(ターミナルを2個開くので、ターミナルA、ターミナルBと表記します)。

* ターミナルAを開き、自宅サーバーにssh接続する。
* 旧公開鍵をリネームして、新公開鍵を作成する。
* 端末の旧秘密鍵をリネームして、新秘密鍵を配置する。
* ターミナルBを開き、自宅サーバーにssh接続する。
    * 失敗した場合、どこかの作業がミスしている。
* ターミナルAで、旧公開鍵を削除する。

> **NOTE:** サービスに登録した公開鍵とローカルの鍵が本当に同じであることを確認するには、鍵指紋を比較すると目視確認しやすいです。サービス側の鍵指紋は、公開鍵を登録すると表示されます。ローカルでは、`ssh-keygen -l -E md5 -f id_rsa.pub`で鍵指紋を表示することができます。

## ssh接続確認

GitHub、BitBucketは、`git clone`と`git push`が出来ることを確認します。アクセス確認用リポジトリを作成して、適当にファイルを編集、プッシュしました。

OpenShift、Digital Ocean、自宅サーバーは、sshログインが出来ることを確認します。

> **NOTE:** OS Xのキーチェーンは、ssh接続しようとしたサーバーに対応する秘密鍵がキーチェーンに登録されていない場合、初回だけパスワード入力を要求して以降は覚えていてくれますが、これが正しく登録されないことがあります。`ssh-add -K id_rsa`でキーチェーンに追加できるので、パスワード・エントリーを作成すれば、以降のパスワード入力を省略できます。

> **NOTE:** OS Xの場合、1サービスに2個以上の鍵が該当しても良い具合に判断して使ってくれますが、Windowsでpagentを使っている場合、アプリによってはリストの先頭にある秘密鍵を使うようです(例えば、SourceTree)。なので、1サービスで2個以上の鍵を使い分けたい場合は、つど使う鍵をpagentに登録する必要があります。
zshとffmpegでMP4をまとめてM4Aへ

## 目的
ディレクトリ内のMP4をM4Aへ変換する。
この記事は完全に自分の備忘録でしか無い...

## 方法
zshのfor文で回すだけ

## 実行

```zsh
for f (*.mp4) ffmpeg -i $f -vn -acodec copy $f:r.m4a
```

## あとがき
ワンライナーなのでこれだけ...
Amazon Kinesisのデータをtd-agentで取り出す

Amazon Kinesisに入力されたデータをtd-agentで取り出します。

![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/46632/335a3122-d824-75e9-7666-6b744a47e2f1.png)

Amazon Kinesisのデータの取り出しには、kinpiraさんが作ったfluent-plugin-in-kinesis（ http://qiita.com/kinpira/items/cefaf9050429325498aa ）というプラグインを使わせて頂きます。


# 今回の環境
今回は以下の環境を使います。
1.Amazon Kinesis
　・ストリーム名：test-stream
2.Amazon EC2
　・Ubuntu 14.04
　・「1」で作成したストリームを操作可能なIAM Roleを付与
　・AWS CLIをインストール

以降の操作はすべて「2」で作成したEC2上で実施します。

# td-agentインストール
まずEC2にtd-agentをインストールします。

```
$ curl -L http://toolbelt.treasuredata.com/sh/install-ubuntu-trusty-td-agent2.sh | sh
$ td-agent --version
　td-agent 0.12.20
```

# fluent-plugin-in-kinesisインストール
Amazon Kinesisのデータを取得するプラグイン「fluent-plugin-in-kinesis」をインストールします。

```
$ sudo td-agent-gem install fluent-plugin-in-kinesis
$ td-agent-gem list --local |grep fluent-plugin-in-kinesis
　fluent-plugin-in-kinesis (0.0.2)
```

# td-agent.confを書き換え
td-agent.confを下記のように書き換え

```lang:/etc/td-agent/td-agent.conf
<source>
  type kinesis
  stream_name test-stream
  region ap-northeast-1
  load_records_limit 1000 # 一度に取得できるレコード数
  load_shard_interval 10  # 対象のストリームに存在するシャード一覧を確認する間隔(10秒に1回シャード一覧を確認する）
  load_record_interval 1  # データを取得する間隔
  tag test.stream
  state_dir_path /var/log/td-agent/save # Kinesisのデータを何処まで読み込んだか記録しておく為のディレクトリ
  format json
</source>

<match test.stream>
  type file
  path /var/log/td-agent/test-stream
</match>
```
state_dir_pathで指定したディレクトリを作成し、td-agentを再起動

```
$ sudo mkdir /var/log/td-agent/save
$ sudo chown td-agent.td-agent /var/log/td-agent/save
$ sudo service td-agent restart
$ sudo service td-agent status
 * td-agent is running
```

# Amazon Kinesisからtd-agentでデータを取り出し
AWS CLIを使ってKinesisにデータを投入し
投入したデータをtd-agentで取得出来ている事を確認します。

Kinesisにデータ投入

```
$ aws kinesis put-record --stream-name test-stream --data '{"data":"test-data"}' --partition-key test-key --region ap-northeast-1
　{
　    "ShardId": "shardId-000000000000", 
　    "SequenceNumber": "49559397709724644070674617403929989783736592900930142210"
　}
```

td-agentでデータが取得出来ているか確認します。

```
$ tail -f /var/log/td-agent/test-stream.20160221.b52c48f9481c0ca59
　2016-02-21T15:00:15+00:00	test.stream	{"data":"test-data2"}
```
SwiftのWeb APIフレームワーク「KITURA」をちょっとだけ触ってみた

IBMが、SwiftでWebアプリケーションを開発するためのREST API対応フレームワーク「Kitura」の提供を開始しました。

Bluemixという同社のサービス上で動作させることができる模様です。

[IBM Bluemix - Swift](http://www.ibm.com/cloud-computing/bluemix/swift/)

早速試してみたいと思います。

# サーバを起動させる

GithubのREADMEに従って進めます。

[IBM-Swift/Kitura: Web framework and HTTP server for Swift](https://github.com/ibm-swift/kitura?cm_mc_uid=97426823915914561765491&cm_mc_sid_50200000=1456176549)


### 1. Kituraをclone

```bash:
$ git clone https://github.com/IBM-Swift/Kitura
```

### 2. Homebrewをインストール

入ってない人は入れます。

```bash:
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

### 3. brewで必要なソフトをインストール

* http-parser: HTTPメッセージのパーサー
* pcre2: 正規表現を使うためのツール
* curl: URLに対するデータ転送を行う
* hiredis: Cのredisクライアント

### 4. 最新のSwiftコンパイラをインストール

2016年2月23日現在では、最新のSwiftコンパイラが必要になります。[Swift.org - Download Swift](https://swift.org/download/)からダウンロードしてインストールします。

```bash:
$ swift --version
Apple Swift version 3.0-dev (LLVM a7663bb722, Clang 4ca3c7fa28, Swift 1c2f40e246)
Target: x86_64-apple-macosx10.9
```

パスも通します。

```
PATH=/Library/Developer/Toolchains/swift-latest.xctoolchain/usr/bin:$PATH
```

### 5. 依存ライブラリのダウンロード

Package Managerによりライブラリがダウンロードされます。

```
$ cd ./Kitura
$ swift build
```

何かエラーが出ますが、それでいいそうです。

```bash:
ld: library not found for -lcurlHelpers for architecture x86_64
<unknown>:0: error: link command failed with exit code 1 (use -v to see invocation)
<unknown>:0: error: build had 1 command failures
error: exit(1): ["/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2016-02-08-a.xctoolchain/usr/bin/swift-build-tool", "-f", "<プロジェクトのパス>/.build/debug/Kitura.o/llbuild.yaml"]
```

> Note the build process itself will fail!

とREADMEに書いてあります。

### 6.  ビルド

Kituraと、Kituraのサンプルをビルドします。

```
$ cd ./Kitura
$ swift build
```

### 7. サーバ起動

```bash:
$ /.build/debug/KituraSampl
```

8090ポートでサーバが起動します。

```bash:
Listening on port 8090 
```

http://localhost:8090/ を叩くと「You're running Kitura」と表示されます。


# main.swiftを見てみる

こんな感じでパスに対して応答が書けます。Sinatraみたいな感じでしょうか。

```swift:
router.get("/") { _, response, next in
  response.setHeader("Content-Type", value: "text/plain; charset=utf-8")
  do {
      try response.status(HttpStatusCode.OK).send("You're running Kitura").end()
  }
  catch {}
  next()
}
```

メソッドごとの振る舞いの記述。

```swift:
router.get("/hello") { _, response, next in
...
}

router.post("/hello") {request, response, next in
...
}
```

パラメータの受け取りはこんな感じで書けるようです。

```swift:
router.get("/users/:user") { request, response, next in
    response.setHeader("Content-Type", value: "text/html; charset=utf-8")
    let p1 = request.params["user"] ?? "(nil)"
    do {
        try response.status(HttpStatusCode.OK).send(
            "<!DOCTYPE html><html><body>" +
            "<b>User:</b> \(p1)" +
            "</body></html>\n\n").end()
    }
    catch {}
    next()
}
```

# まとめ

とりあえずデモを動かしてみるところまでやりました。
自分のサーバを動かす方法はこちらに書いてあるので、後でやってみようと思います。
https://github.com/ibm-swift/kitura?cm_mc_uid=97426823915914561765491&cm_mc_sid_50200000=1456176549#usage

iOSエンジニアにとって、Objective-Cの応用範囲が狭いことが一つの悩みでしたが、サーバサイドもSwiftで書けるようになればサーバ-クライアントが全部開発できるようになります。今後の展開が楽しみです。
react-reduxで「dispatch is not a function」にハマった場合の対処法


Gukuです。
React.jsのReduxフレームワークを使用していて、「dispatch is not a function」というエラーに３日ほどハマったので備忘録を記述しておきます。
（このエラーの解消法が英語文献漁りまくっても無かったので。。。）
こんなのです。

![エラー](http://www.gakusmemo.com/wp-content/uploads/2016/02/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2016-02-23-5.52.17.png "エラー")

# エラー解消法
container部分でこんな感じで記述しているとこのエラーが起こります。

```js:container.js
import React from 'react'
import { connect } from 'react-redux'
import AddProject from '../containers/AddProject'
import FetchProject from '../containers/FetchProject'
import { fetchProject } from '../actions/operationProject'
 
let OnLoadProcessing = ({ onLoadFetchProject }) => (
  <div>
    <AddProject />
    <FetchProject />
    <script type="text/javascript" language="JavaScript">
      window.onload = () => {
        onLoadFetchProject()
      }
    </script>
  </div>
)
 
const mapDispatchToProps = (dispatch,state) => {
  return {
    onLoadFetchProject: () => {
      dispatch(fetchProject()) //ここでエラーdispatchなんて関数ねぇえよ(´Д` )って怒られる。
    }
  }
}
 
OnLoadProcessing = connect(
  mapDispatchToProps
)(OnLoadProcessing)
 
export default OnLoadProcessing
```

解決法としてはこんな感じ。

```js:container.js
import React from 'react'
import { connect } from 'react-redux'
import AddProject from '../containers/AddProject'
import FetchProject from '../containers/FetchProject'
import { fetchProject } from '../actions/operationProject'
 
let OnLoadProcessing = ({ onLoadFetchProject }) => (
  <div>
    <AddProject />
    <FetchProject />
    <script type="text/javascript" language="JavaScript">
      window.onload = () => {
        onLoadFetchProject()
      }
    </script>
  </div>
)
 
//空でも良いので、mapStateToPropsを記述
const mapStateToProps = (state) => {
  return {
  }
}
 
const mapDispatchToProps = (dispatch,state) => {
  return {
    onLoadFetchProject: () => {
      dispatch(fetchProject())
    }
  }
}
 
OnLoadProcessing = connect(
  mapStateToProps, //ここでconnectするのも忘れない
  mapDispatchToProps
)(OnLoadProcessing)
 
export default OnLoadProcessing
```
これでdispatch is not a functionのエラーは解消されます(=ﾟωﾟ)ﾉ
mapStateToPropsで受け取っているstateの情報が無いとdispatchが動かない？ってことなんでしょうか？
なんか良くわかりませんが、解決したので良しとしましょう。
reduxでcontainerを作成する場合、mapStateToProps,mapDispatchToPropsをセットで必ず記述すれば良さそうですね。

# おわりに
こんなエラーシラネ。土日と平日2日ぐらいこのエラーに悩まされた。
やはり、記述方法を自分スタイルにしだすとこういったエラーにはまるなと。
(reduxの機構とかまだよくわかってないし。。。)
ただ。。。ただ、これでサーバサイドへの書き込み、読み込みができるようになったので、これで一通りフロントAppは書き出せるかなっと。
辛い3週間が終わりそうです(=ﾟωﾟ)ﾉ

# 転載元
こちらでも掲載しております。
[Gaku's Memo-react-reduxで「dispatch is not a function」にハマった場合の対処法](http://www.gakusmemo.com/?p=298 "Gaku's Memo")
技術英語 > do you mean that we would we see [traces of] computer there, / trace amount

@ AXIS Feb. 2016 > Cover interview: Frank Gehry

> **By the micro thing, do you mean that we would we see <font color=red>traces of</font> computer there, ...**

インタビューワの言葉。

http://eow.alc.co.jp/search?q=trace&ref=sa
> 1.〔目に見える〕跡、足跡、形跡

が関連すると思う。

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

http://eow.alc.co.jp/search?q=trace+amount
> trace amount
> 微量

痕跡が分かる程度の微量、という感じで覚えるのがいいかもしれない。
旧時代のC言語を使うのはそろそろやめよう。


まず、何も言わずに下記の記事をお読んでください。

* [How to C (as of 2016)](https://matt.sh/howto-c)

英語は・・・という方は、下の翻訳をお読みください。

* [2016年、C言語はどう書くべきか (前編)](http://postd.cc/how-to-c-in-2016-1/)
* [2016年、C言語はどう書くべきか (後編)](http://postd.cc/how-to-c-in-2016-2/)

## これからのC言語を考える。

さて、上の記事を読みましたか？まだ読んでない？いや、読みましょうよ、ということで読んだことを前提でお話しします。

C言語知っているぜ！と言っている諸兄の方々の中には、何これ？と思ったのもあったかと思います。聖典 K&R は仕方が無いとしても、C言語入門を謳う書籍やサイトの中では C90 止まりが多く見られます。どうやら、彼らは20世紀で時間が止まっているようです。

レガシーなコンパイラをサポートするため、古くからあるコードが存在するため、そういった理由で C90 を使い続けるのが駄目というわけではありません。例えば MRI (Ruby のC言語実装) は未だに C90 です[^1]。しかし、これから新たに作るようなプログラムでも C90 を使い続けるのはほとんど無意味でしょう。これからは C99 も越えて C11 をメインに据えるべきでは無いでしょうか。

[^1]: これに対して、組み込み向けの Ruby である mruby は C99 です。

## C言語はかく有るべき。

ということで、私の独断と偏見により、上の記事から追加で、これからはこうすべきと考えます。

* 基本的に **C11** を使用します。
* サポートするコンパイラを **GCC** と **Clang** に限定します。オプションには `-std=c11` を付けます。余程特殊な環境では限り、GCC が使えないと言うことはありません。Windows では Mingw64版 GCC を使用します。 どうしても Visual C++ を使用したい場合は 2015 以上にすべきです。Borland C++ Compiler など古いコンパイラは学習目的であっても使うべきではありません。
* 文字列は常に **UTF-8** で処理をします。ASCII 以外が含まれるリテラルは `u8"..."` を使います[^2]。型は `const char *` です。リテラルを除いて、文字列の処理はすべて `uint8_t *` を使います。Shift_JIS や UTF-16、UTF-32 は使用しません。Windows の場合、ANSI も UNICODE も使用しませんが、Win32API とのやり取りが必要な場合のみ UNICODE(ワイド文字) に変換します。もし、UTF-16 や UTF-32 を扱う場合は、 `wchar_t` は使わずに、`char16_t` や `char32_t` を使うべきです。
* マルチスレッドは `<threads.h>` を使います。ただし、現在の所、対応ライブラリは存在しないため、エミュレーションライブラリを使います。Linux等の pthread 環境でも、pthread が無い Windows でも、統一的に書くことが出来ます。
    * https://github.com/murasesyuka/misc-lang-snippet/tree/master/c/c11threads
* インライン展開による速度向上が目的であれば、マクロ関数ではなくインライン関数を使います。マクロ関数はマクロにしないと出来ないという理由が無い限り使うべきではありません。
* 制御が戻らない関数は `<stdnoreturn.h>` を読み込んで、`noreturn` を付けます。
* 無名構造体や無名共有体は積極的に使います。特に入れ子の場合は、余程の理由が無い限り無名にします。
* `_Generic` は便利とは言い難いです。C++ のテンプレートほどの汎用性はありません。ライブラリのインターフェースとしては有用かも知れませんが、余程の理由が無い限り無理に使うのはやめましょう。
* `long double` は、現在の所、その利用価値はほとんどありません。浮動小数点数は `double` を使用して下さい。
* 浮動小数点数の複素数計算をする場合は `<complex.h>` を読み込んで `double complex` 型を使いましょう。

[^2]: Visual C++ 2015 でも `u8"..."` は正しく解釈されます。ソースコードがどんな文字コードであっても UTF-8 としてコンパイルされるため、文字コードについて悩む必要はありません。
カレントブランチからGitHubのPull Requestのページを探してブラウザで開く #git #github

GitHubにお世話になっている方は多いと思います。
僕はブランチを切ってpushするまではコンソールでやっていますが、Pull Requestを出してコメントしたりするのはブラウザで行っています。
このやり方だと幾つものブランチを行ったり来たりして、そのブランチをpushするたびにブラウザでこのブランチのPRどれだっけ…となるのがとても億劫でした。
カレントブランチまでわかってるんだからAPI叩いてPRのURL位割り出せて一発で開きたいものだなあって思いたったので書いてみました。

```git-pr.sh
function git-pr(){
    BRANCH=`git name-rev --name-only HEAD`
    ORGNAME=`git config --get remote.origin.url | sed "s/^git@.*:\(.*\)\/\(.*\).git$/\1/"`
    REPO=`git config --get remote.origin.url | sed "s/^git@.*:\(.*\)\/\(.*\).git$/\2/"`
    URL=`curl -su knsh14:MY_SECRET_TOKEN "https://api.github.com/repos/$ORGNAME/$REPO/pulls?head=$ORGNAME:$BRANCH" | jq ".[] | .html_url" | sed -e "s/\"//g"`
    open $URL
}
```

この```MY_SECRET_TOKEN```は https://github.com/settings/tokens から発行できます。
それも嫌な方はコロン以下を削除して都度パスワードを入れれば大丈夫でしょう。
申し訳ないんですがPRが存在しない場合おそらく動作しません。その場合はhubなどを使っていい感じにPR出せばいいと思います。

これでコンソール上でgit-prすればカレントブランチのPRが一瞬で開いてレビューしてね！とコメントできますね！