OmniAICreator/Qiita-1.07M huggingface dataset:
Dozens を使用してみる

**追記**: 今まで使わせていただいてた dozens がサービス終了します

長い間使わせていただいてましたがサービスが終わってしまうのは悲しいです

- [サービス終了のお知らせ](https://dozens.jp/close/)

---

この記事は [DNS Advent Calendar 2015 - Qiita](http://qiita.com/advent-calendar/2015/dns) の17日目の記事です。

Advent Calendar に初めての参加となりますので誤字脱字、あらゆる面で至らない点がありますが、コメントでのご指摘など頂ければと思います。

## そもそも Dozens とは
[![https://gyazo.com/428aa4aa451ce1c75112cf01aace8781](https://i.gyazo.com/428aa4aa451ce1c75112cf01aace8781.png)](https://gyazo.com/428aa4aa451ce1c75112cf01aace8781)

> Dozens は、クラウド時代に対応した DNS サービスです。
クラウドサービスを利用しようとしたとき、DNS のことで困った経験はありませんか？
クラウドサービスの利用において、DNS の活用は重要なポイントのひとつです。
ですが、DNS は多くの人にとって不便でわかりにくいものなのではないでしょうか。
私たちはそんな DNS の現状を変えます。もっと簡単にもっと便利にします。
Dozens でクラウドを使いこなしましょう。

## Dozens を使用するように至った経緯
私は趣味で複数のサイトを独自ドメインを使用して構築してますが、その独自ドメインが お名前.com や ムームードメイン, バリュードメイン など複数の取得業者を使用しているため一括で管理できるサービスがないか探したところ見つけたのがこの Dozens です。

まぁ他にも海外のドメイン取得業者を使用していまして海外レジストラが提供する DNS は当然海外にあり、主なアクセスは国内なのに海外に DNS があるのは速度や海外回線のトラブルに不安なため国内にある DNS を使用したかったためです。~~畳敷英語なので使いにくかったorz~~


## Dozens を使用する上での注意点
Dozens を無料で使用する場合は以下の内容に気をつけないといけません。

- 登録できるレコードは12個まで
- TTLが標準の２時間固定
- 技術サポートがない

特に注意したほうがいいのは TTL が2時間という点です。簡単にいうとドメインのレコードを変更しても反映までに最大で2時間かかってしまうということです。
まぁ頻繁にレコードを変更したりしなければ、問題になることはないと思います。

登録できるドメインは無制限ですが登録できるレコード最初12個なところも気をつけてください。
この点も紹介制度を使用することによって 3レコード ずつですが増やすことができます。

## 使用した上での感想
今まで使用してたうえで接続障害なども発生していませんしレコードを変更しても数分で適用されており今のところ不満なところはありません。
登録できるレコードは12個までしかないですが月100円と格安で12個レコードを追加できるので登録後2時間ほどで MINIプラン に変更してしまいましたw
【FileMaker】前の検索結果に戻りたい

FileMaker Advent Calendar 2015 17日目ですね。

今回は、ちょっとブラウザチックに「前の検索結果に戻りたい」ので戻りましょう、という実装です。
別に戻らなくてもいいじゃないか、というO型の性格なのですが、きちっとしたことが大好きなA型が多い日本なので、対応したという感じです。

要は、集計でレコードIDを持っていて、それを前に戻る材料にしているというところです。

レコードID(recid)、レコードIDを一覧で持つ集計(recid_集計)、検索等で対象となっている件数を保持するカウントフィールド(recid_cnt)を追加します。
![スクリーンショット 2015-12-15 1.44.11.png](https://qiita-image-store.s3.amazonaws.com/0/60538/1d193340-1995-b9b4-59ac-3c5d3c00e185.png)

「前の検索を表示」とありますが、スクリプトの中であれこれ必要な検索をして、スクリプトが走る前のこの状態に戻るということになります。
![スクリーンショット 2015-12-15 1.43.53.png](https://qiita-image-store.s3.amazonaws.com/0/60538/180c92c3-848f-d572-fa52-69f9ab6ef175.png)

諸々検索の前であらかじめ対象レコード数と集計結果を変数に退避しておきます。
その後、検索でエラーになった場合に元の状態に戻す、という感じです。
![スクリーンショット 2015-12-15 1.43.41.png](https://qiita-image-store.s3.amazonaws.com/0/60538/b2c5860a-e84f-a03a-77b5-eb4a223608c8.png)
単に検索条件にレコードIDを設定しているだけなのですが、これで十分スクリプトが動く前の状態を保持できます。

ただし、集計を使っているので、レコード数の増加に比例して処理速度も遅くなる可能性はありますので、必要なところだけにしておく方がいいかと思います。

ほんとはこんな実装しなくても「元のレイアウトに戻る」のように「元のデータ表示に戻る」というようなものが用意されていればなんてことはないんですけどねー。
ChangeKey(Win)

Dvorak Advent Calendar 17日目．

-----

## ChangeKey(Win)

昔からある（最近は更新されていないようですが動くっぽい） [ChangeKey](http://satoshi3.sakura.ne.jp/f_soft/dw_win.htm) の紹介です．

Windowsで常駐ソフトでなくキーリマップしたい場合S/Wでやる以上，レジストリをいじる事になると思いますが，
そのレジストリをいじる補助的ソフトウェアといして有名なのが [ChangeKey](http://satoshi3.sakura.ne.jp/f_soft/dw_win.htm) です．

http://satoshi3.sakura.ne.jp/f_soft/dw_win.htm


Win8以降の場合，実行ファイルのexeを右クリック→プロパティからセキュリティレベルを下げてOKして，
exeを右クリックで管理者実行するのが良いと思います．
（設定反映にはPCの再起動が必要です）

設定前|設定後
-----|-----
CapsLock|Ctrl
変換|BackSpace
無変換|Enter

など，使いたいキーの前後をGUIで分かり易く設定できるので非常に使い勝手が良く，バックアップも取れます．
EC-CUBE3でもWebFont使ってみる？Google Fonts導入方法。[Noto Sans Japanese]


EC-CUBE運営サイト「[ネットショップの壷](http://www.ec-cube.net/tsubo/)」でWebFontのことが[記事になってました](http://www.ec-cube.net/tsubo/2015/12/11/3934)。
せっかくですので、この「Noto Sans Japanese」をEC-CUBE3のフロントに適用させてみましょう。

#EC-CUBE3のCSSファイル

フロント側のCSSはこの↓フォルダの中にあります。
/html/template/default/css/

デフォルト状態で、フロント側のCSSファイルは以下の4つが上から順に読まれます。

- bootstrap.custom.min.css (リセットと、主にグリッドレイアウトとボタン用)
- style.css (主に各パーツの表示再現用)
- slick.css (スライダー「slick.js」用)
- default.css (デフォルトのデザインを再現するための細かい指定用)

イメージとしては、上の3つが基本デフォルトCSSセットで、残りのdefault.cssは、2系でいうところの「デザインテンプレート」で使用するCSSという感じです。

#早速、CSSファイルを編集

カスタマイズするためにはテンプレートを新たに作成することが推奨されていますが、今回はさくっと、デフォルトのCSSをいきなり編集したいと思います。

今回触るCSSファイルは**default.css**です。
先ほど少し触れましたが*default.cssは、2系でいうところの「デザインテンプレート」で使用するCSS*というイメージですので、他のCSSファイルよりも断然危険度が低いです。

このdefault.cssのスタイルの記述が始まる一番最初(おそらく11行目あたり)を以下のように修正すれば完了です。

```lang:default.css
@import url(//fonts.googleapis.com/earlyaccess/notosansjapanese.css);/* ←追記 */
body {
    font-family: 'Noto Sans Japanese', serif; /* ←下の記述をこのように書き換える */
    /* font-family: Roboto, "游ゴシック", YuGothic, "Yu Gothic", "ヒラギノ角ゴ ProN W3", "Hiragino Kaku Gothic ProN", Arial, "メイリオ", Meiryo, sans-serif;　←旧の記述 */
/* ~~~以下略~~~ */
```
これだけで、フロントのフォントがことごとくすべて「Noto Sans Japanese」に変わります。
ね？簡単でしょ？

#最後に少しだけ注意点

一目瞭然ですが、フォント指定が`'Noto Sans Japanese', serif`と2つだけなので、もし万が一なんらかの理由でNoto Sans Japaneseが表示されない場合は、環境によってはMS P ゴシックなどのちょっと残念なフォントが表示される場合があります。

あと、キャッシュされるまではWebフォント(特に日本語フォント)は重いので、文字が表示されるまでのタイムラグは今のところ避けられないです。
これは、将来的に日本語Webフォントを取り巻く環境(利用人口の増加など)によって何とかなってくれるに違いないと私は個人的に信じています！信じたいです！

*******
いかがでしたか？

明日は@yangsinさまです。明日もノンプログラマー向け記事ですね！
DynamoDB StreamsとLambdaとSQSを使ってDynamoDBとRDSのデータ同期を行った話

## 前置き
以前、担当プロジェクトで導入したDynamoDBと
DynamoDB導入前に利用していたRDS(MySQL)のデータを同期した際の話になります。
事例の紹介であり具体的な実装方法を紹介する記事ではないのでご了承下さい。

### 要件など
フロントエンド上でのユーザアクションによるイベント情報(操作の履歴)をDynamoDBに格納しているWEBアプリケーションが存在し、アプリケーションのコンテンツ情報を管理およびレポート出力を行うためのCMSアプリケーションが別途存在する環境でした。

CMS上からフロントエンド上でのイベント情報のレポート出力をする際にDynamoDBから複雑な条件でデータ抽出を行うには、高い値のスループット値の設定が必要であり費用対効果に難があることと複雑な条件でデータの集計を行うのに向いていないため、RDSにDynamoDB上のデータを同期しRDSからデータを抽出して高速にレポートを出力する必要がありました。

### 今回のアプローチ
DynamoDBとRDS上のデータを同期する際に行ったアプローチは下記のフローとなります。
1. DynamoDB Streamsを利用しDynamoDBへのデータ追加および更新・削除を検知
2. Lambda Function上でSQSキューにメッセージを送信しSQSキューにデータ変更情報を格納
3. CMSサーバ上でバッチ処理にてSQSキューからメッセージ取得、およびRDSへのデータ追加・更新・削除処理
4. CMSからRDSのデータを参照しレポートを出力

---
## 各ソリューションについて

### DynamoDBにいて
まずは公式ドキュメントを。[Amazon DynamoDB](https://aws.amazon.com/jp/dynamodb/)

* 端的に言うならばお金で性能が買えるスキーマレスなNoSQLデータベースです。
* デメリットとしてはMySQLのようなRDBMSのSQLによる複雑なデータ抽出には向いていない点が挙げられます。

#### DynamoDB Streamsについて
詳しくは公式ドキュメントを参考にしてください。
[DynamoDB ストリーム を使用したテーブルアクティビティのキャプチャ](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Streams.html)
[Amazon DynamoDB のトリガー](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Streams.Lambda.html)

> Amazon DynamoDB は AWS Lambda と統合されているため、トリガー（DynamoDB ストリーム 内のイベントにすばやく自動的に応答するコード）を作成できます。トリガーを使用すると、DynamoDB テーブル内のデータ変更に対応するアプリケーションを構築できます。

> テーブルで DynamoDB ストリーム を有効にした場合、書き込む Lambda 関数にストリーム ARN を関連付けることができます。テーブル内の項目が変更されるたびに、新しいストリームレコードがテーブルのストリームに出現し、その後 Lambda 関数がトリガーされて実行されます。

* DynamoDB Streamsを有効にしLambda FunctionにストリームARNを関連付けることでLambda側でDynamoDBのデータ更新を常にキャッチすることができます。

### Lambdaについて
[製品の詳細](https://aws.amazon.com/jp/lambda/details/)
> AWS Lambda はイベント発生時にお客様のコードを実行し、基盤となるインフラストラクチャをお客様に代わって管理するサービスです。AWS Lambda を使用してカスタムロジックで他の AWS サービスを拡張したり、AWS の規模、パフォーマンス、セキュリティで稼働する独自のバックエンドサービスを作成したりできます。AWS Lambda は Amazon S3 バケットのオブジェクト、Amazon SNS から送信された通知、Amazon Kinesis ストリームが受信したメッセージ、Amazon DynamoDB テーブルの更新に対応して自動的にコードを実行します。

> AWS Lambda は可用性の高いコンピューティングインフラストラクチャでお客様のコードを実行し、コンピューティングリソースの管理をすべて担当します。これにはサーバーおよびオペレーティングシステムの管理、キャパシティーのプロビジョニングおよび自動スケーリング、コードおよびセキュリティパッチのデプロイ、モニタリングおよびロギングなどが含まれます。お客様はコードを書くだけです。

* 今回のプロジェクトではnode.js版のLambdaにて実装しました。
* この記事を書いた時点ではnode.js, JAVA, Pythonに対応しているようです。
* 今回の実装内容としては、DynamoDB Streamsで検知した更新内容をパースしSQSにメッセージを送信する内容となりました。

### SQSについて
[Amazon Simple Queue Service (SQS)](https://aws.amazon.com/jp/sqs/)
> Amazon Simple Queue Service（SQS）は、高速で、信頼性が高く、スケーラビリティに優れ、十分に管理されたメッセージキューサービスです。SQS を利用すると、簡単かつコスト効率良く、クラウドアプリケーションのコンポーネントを切り離すことができます。SQS を使用すれば、どんなボリュームのデータでもあらゆるレベルのスループットで転送できます。転送時にメッセージが失われることも、他のサービスが常に利用可能である必要もありません。

* SQSは比較的歴史のあるAWSサービスのためAWS SDKは多様な言語に対応しています。
* サンプルについてはコチラから見ることができます。
    * [ご利用開始にあたって](https://aws.amazon.com/jp/sqs/getting-started/)

---

## 結果

今回行ったアプローチについては前述の「今回のアプローチ」に記載した通りとなります。
以下は今回のアプローチによる結果です。

* フロントエンドのWEBアプリケーションではDynamoDBを採用しユーザアクション起因の動的処理を安定・高速に処理することができた。
* バックエンドのCMSアプリケーションではRDSからデータを参照することで高速にレポートを出力することができた。
* DynamoDBとRDSの併用という適材適所でソリューションを採用することが費用面でも性能面でも効果的であることが体験できた。
AWSで地味に詰まったけどLIGブログに書くほどまとめられなかった事

LIGアドベントカレンダー17日目です！こんにちは、づや (@zuya) です。  

2015年ももう終わりですね、早い物です。
今年はけっこうAWSに触れたので、地味に詰まった所をツラツラ備忘録として残したいと思います。

##ELBに証明書を登録するとエラーになる
発行してもらった証明書を登録しようとするとエラーで怒られたりしますよね。
なんのことはない、パスフレーズ付きだと登録できないだけなんですが、地味に焦って時間を取られました。
そんなに行う作業じゃないのでついつい忘れがちだったりします。

```shell-session
openssl rsa -in ssl.key -out ssl.key
```

等してパスフレーズを外したものを登録しましょう

##s3fsのマウントが外れる
S3をマウントして使えるs3fsってありますよね。
速度的な問題等はありますが、使いようによっては便利ではあります。
しかしこいつが急にはずれるという問題が。。。契機がよくわからないのですがいきなり外れることがあります。。。
AWSの有識者の方にも聞いたのですが、どうもどうしようもない問題らしいです。
対応策としてはマウントしてるバケットにチェック用のファイルを用意して、そいつをcronなりで監視してなかったらs3をアンマウント→マウントするシェルを用意するという力技しか思いつきませんでした。
ちなみにサーバ起動時にマウントが外れているという別問題もあるようです。
いろいろ解決策はあるのですが、確実なことはないようです。
cronの@rebootでも同じことするとよいかと思います。

##Auto Scalingでサーバが増えない
Auto Scaling便利ですよね。
でも条件を満たしているのになぜか増えないって状況にあったことがありませんか。
まああんまりないと思いますが。
スケーリングポリシーをいじろうが最少最大値をあげようがどうあがいても増えない。。。なんて事が1度だけありました。
まあなんてことはない、アカウントでのボリュームのMAX容量(20TBだったはず)に届いていて増えれなかったってだけだったんですが。
どういう運用だよって話ですが、ボリュームの全体容量に気を付けてください。
EC2インスタンスがボリューム残すようになってるとAuto Scalingの繰り返しで思わぬ容量になってることも。。。色々もったいないです。。。
これは今までで1番の失敗ですね。

##CloudFrontのパージが間に合わない
これはちょっと詰まったことではないのですが。
1ファイルのキャッシュ削除でも15分程かかってしまいます。
エッジサーバも多いしなかなか大変なのはわかりますが、日本だけでも先に削除できたらと思ったりもしてしまいまして、1回聞いてみたんですがやはりそういったことはできない模様です。
おとなしくファイル名変えるとかで対応しましょう。


初歩的な内容だったりでなかなか恥ずかしいのですが、100万に1人くらい救われる人がいると信じて筆をとりました。

次回があったら書く事多すぎてまとめられなかった詰まったことも書こうかなと思います。
DataSpider でプロセスの監視ができるか試してみた

本記事は、「アプレッソ Advent Calendar 2015」17日目の記事です

#はじめに
サポートセンターにはお客様からのご要望が日々上がってきますが、時には内容的に対応しきれない場合もあります。
例えば、

・DataSpider を使ってプロセスを監視したい

データ連携ソフトである DataSpider とは直接は関係が薄い機能です。
普段であれば、お断りせざるを得ない内容なのですが、今回は DataSpider で実現できるのか確認してみたいと思います。

#プロセス監視の方法を考えてみる
プロセス監視と言えば・・・、今更な感じはしますが、SNMP プロトコルが便利かな？と思うので、SNMP を使って行きます。

まず DataSpider でどうやって SNMP エージェントから情報を取得するかを考えてみると・・・
フリーソフトの Net-SNMP に入っている snmpwalk コマンドを叩くのが一番簡単だと思います。

そんなわけで、Net-SNMP をダウンロードして DataSpiderServer と同じ環境にインストール

次のプロセス監視をされる側に SNMP エージェントの設定を入れます。

Windows だと Windows の機能に SNMP エージェントがあるので、SNMP エージェントの機能を追加、設定をします。

これで設定はできたはず・・・
コマンドプロンプトで以下を叩いて SNMP でとれる一覧を見てみます。

```
snmpwalk -v v2c -c public 192.168.XXX.XXX
```
大量にとれるので、細かいところは置いておいて、目的のところを探してみると・・・
ありました。
↓みたいな感じで起動しているプロセスが一覧で出ています。

```
・・・
iso.3.6.1.2.1.25.4.2.1.2.1 = STRING: "System Idle Process"
iso.3.6.1.2.1.25.4.2.1.2.4 = STRING: "System"
iso.3.6.1.2.1.25.4.2.1.2.380 = STRING: "smss.exe"
iso.3.6.1.2.1.25.4.2.1.2.508 = STRING: "AcroRd32.exe"
iso.3.6.1.2.1.25.4.2.1.2.588 = STRING: "svchost.exe"
iso.3.6.1.2.1.25.4.2.1.2.592 = STRING: "csrss.exe"
iso.3.6.1.2.1.25.4.2.1.2.636 = STRING: "svchost.exe"
iso.3.6.1.2.1.25.4.2.1.2.648 = STRING: "wininit.exe"
iso.3.6.1.2.1.25.4.2.1.2.656 = STRING: "csrss.exe"
iso.3.6.1.2.1.25.4.2.1.2.696 = STRING: "services.exe"
iso.3.6.1.2.1.25.4.2.1.2.724 = STRING: "lsass.exe"
iso.3.6.1.2.1.25.4.2.1.2.732 = STRING: "lsm.exe"
iso.3.6.1.2.1.25.4.2.1.2.824 = STRING: "winlogon.exe"
iso.3.6.1.2.1.25.4.2.1.2.888 = STRING: "svchost.exe"
iso.3.6.1.2.1.25.4.2.1.2.952 = STRING: "nvvsvc.exe"
iso.3.6.1.2.1.25.4.2.1.2.976 = STRING: "nvwmi64.exe"
iso.3.6.1.2.1.25.4.2.1.2.1016 = STRING: "svchost.exe"
iso.3.6.1.2.1.25.4.2.1.2.1048 = STRING: "svchost.exe"

・・・
```
次はこれを DataSpider で取得していきます。
処理の流れは↓みたいな感じで行きます。

　①コマンドを叩いて起動しているプロセス一覧を取得して 変数に代入
　②起動していてほしいプロセスを csv から読み込み、①で出力した 変数内に含まれているかチェック
　③起動していてほしいプロセスがなければメール送信

#DataSpider でのスクリプトの作成
上記のスクリプトを実際に DataSpider で作成してみました。

![スクリプト.png](https://qiita-image-store.s3.amazonaws.com/0/102505/24cc3f4f-acf6-b781-62a4-22a12ed91e71.png)

全体像はこんな感じです。
詳細は、長くなりそうなので、また機会があれば説明したいと思います。

#動作確認
それでは実際にうまく取れるか確認してみます。

コマンドプロンプトの「cmd.exe」が起動しているかを取れるか確認してみたいと思います。

まずコマンドプロンプトが起動していない状態でスクリプトを実行します。

![メール.png](https://qiita-image-store.s3.amazonaws.com/0/102505/3a565eaf-264c-4147-9887-314770f99661.png)
メールが飛びました。

次にコマンドプロンプトを起動してスクリプトを実行します
![メール後.png](https://qiita-image-store.s3.amazonaws.com/0/102505/b72e8423-e0e6-f64a-e368-241dceb8fac7.png)

なにも動きがないのでわかりにくいですが、メールが飛びません。

プロセスが起動しているか取得できています。
これをスケジュールトリガーなどで定期的に実行すればプロセスを監視することができます。

別のアプリと組み合わせることで、いろいろなことができますね！
読みとりやすい変数や関数の名前の付け方！

こんにちわ！アプリ道場 Advent Calendar 2015の17日目担当@bearcanyonです。

コード書くときって変数や関数の名前って迷いませんか？
初心者の僕はなんて名前をつけようかなって手を止めて悩んじゃうときがあります。
どうせ付けるなら他の人が見ても読み取りやすい名前の方がいいですよね！
それでは有名な書籍のリーダブルコードからすぐ使える技をいくつか紹介したいと思います。

#明確な単語を選ぶ
```lang:
func getPage () {
}
```
まずはこのメソッドの名前ですが、getという単語からはこのメソッドはページのどこから取ってくるのかまでは読み取ることはできません。
ローカルキャッシュから？データベースから？インターネットから？
もしインターネットから取ってくるのであればfetchPage()やdownloadPage()の方が明確です。

```lang:
func getSize(){
}
```
続いてこのメソッドの名前ですが、もっとわかりにくいと思います。
Sizeというのは何のサイズなのか明確ではありません。
高さなのか？ノードの数なのか？メモリの消費量なのか？
明確につけるならHeight,NumNodes,MemoryBytesとなるはずです。

***改善！もっと明確な単語を探す！***
状況に合わせていくつかの単語と合わせて使うともっとわかりやすい表現になるはずです。
send → deliver,dispatch,announce,distribute,route
find → search,extract,locate,recover
start → launch,create,begin,open
make → create,setup, build,generate,compose,add,new
#名前に情報を追加する
```lang:
var time = getTime() 
```
この場合getTime()から取れる値は秒でしょうか？ミリ秒でしょうか？
変数timeに_msをつければ明確になるはずです。

```lang:
var time_ms = getTime() 
```

***改善！値に単位をつける！***
時間以外にもプログラミングで使う単位はたくさん存在します。以下は例です。
delay → delay_secs
size → size_mb
limit → max_kbps
angle → degrees_cw



#誤解するような名前を避ける
```lang:
results = Database.all_objects.filter(“year <= 2011")
```
このresultsには「year <= 2011」のオブジェクトが入ってくるのか
「year <= 2011」***ではない***オブジェクトが入ってくるのか明確ではありません。
理由はfilterという単語が明確ではないからです。
これでは選択するのか除外するのかが伝わってきません。
選択するならselect、除外するならexcludeにしたら誤解は生まないはずです。


```lang:
func clip(text, length){
}
```
このclipも動作は2つ考えられます。
最後からlength文字を削除するのか(remove)、最大length文字まで切り詰める(truncate)なのか。
ではtruncate(text,length)にしたとしましょう。

```lang:
func truncate(text,length){
}
```
これでもまだ不十分です。
引数になってるlengthも良くないです。
max_lengthにした方が明確になります。
さらにmax_lengthにもいろんな解釈ができます。
バイト数なのか、文字数なのか、単語数なのか。
文字数なのであればmax_charsにしたらより明確になります。


#名前の長さを決める
```lang:
newNavigationControllerWrappingViewControllerForDataSourceOfClass
```

こんな名前嫌ですよね。
いい名前を選ぶときは「長い名前を避ける」という暗黙的な制約があります。
長い名前は覚えにくいし、コード行が無駄に増えてしまいます。
しかし！「長い名前を避ける」に従っていたら1つの単語の名前にまた戻ってしまいます。

***指標！スコープが小さければ短い名前でもいい！***

```lang:
if(debug){
 var m = map(string, int)
 print(m)
}
```
この変数mには情報は含まれていません。
でも大丈夫です。コードを理解するのに必要な情報がすぐそばにあるからです。
if文の中が少なく、すべての情報(変数の型、初期値、破棄方法など)が見えている場合は、変数の名前は短くてもコードを理解することの問題にはなりません。


***
ホント簡単にだったのですが、以上です！
明確な単語を選ぶのって実際結構難しいですよね。
まずは***何をどうするか***、2つの単語を選んでそこから改善していくのがいい気がしました。
参考サイト貼っておきますね。http://php-archive.net/php/words-in-function-names/

このような事例がたくさん載っているのでぜひ、リーダブルコード読んでみてください！
[リーダブルコード(amazon)](http://www.amazon.co.jp/リーダブルコード-―より良いコードを書くためのシンプルで実践的なテクニック-Theory-practice-Dustin-Boswell/dp/4873115655/ref=sr_1_1?ie=UTF8&qid=1450199221&sr=8-1&keywords=リーダブル+コード)
実ファイルを扱うシステムでのテーブル設計

弊社の某社内ツールでは、実ファイルのアップロード・バージョン管理を行っています。
（いつどのファイルを使った、のような）

実ファイルを上手いことバージョン管理しながら扱うために
どうテーブル設計したか、簡単に紹介したいと思います。

ちなみに設計思想は、
**「アプリケーションと実ファイルを結びつけるためのテーブル設計」**
です。

# 入れ物と中身

とある箱Aにリンゴを入れるとします。
さらに、ある日を境に箱Aの中身をリンゴ→ミカンに入れ替えるとします。

表にするとこんな感じです。

| 入れ物 | 中身 | 期間 |
|:---------:|:---------:|:---------:|
| 箱A | リンゴ | 12/01-12/10 |
| 箱A | ミカン | 12/11-12/20 |



これを入れ物、中身、期間（バージョン）でそれぞれテーブル分割してみます。

* 入れ物テーブル

| 名前 | 色 |
|:---------:|:---------:|
| 箱A | 赤 |

→各箱の固有の情報が入っています。
　ここには"箱B（青）"とかも入れられます。

* 中身テーブル

| 名前 |
|:---------:|
| リンゴ |
| ミカン |

→中身に関する情報のみです。

* バージョンテーブル

| バージョン | 期間 |
|:---------:|:---------:|
| 1 | 12/01-12/10 |
| 2 | 12/11-12/20 |

→バージョン（期間）を管理するテーブルです。

これら3つ(+中間テーブル)でER図を書くとこんな感じです。

![ADSで学ぶDB正規化.035.png](https://qiita-image-store.s3.amazonaws.com/0/57617/925f8eff-2505-8d7b-da41-cf3d1ff08d21.png)

入れ物と中身が中間テーブルを介して紐付いています（1対N）。
さらに、中間テーブルとバージョンが紐付いています（1対1）。

これにより、
・箱固有の情報は入れ物テーブルに
・中身固有の情報は中身テーブルに
といった感じで整理できました。

さらに、中間テーブルとバージョンが紐付いているため、
とあるバージョンでは箱Aの中身がイチゴとブドウの2つ、
となっても管理できます。

# 某社内ツールでは

某社内ツールでは、

入れ物→商品
中身→実ファイルのファイル名等
バージョン→そのまま

のような形のテーブル構成になっています。
（実際には期間はスケジュールテーブルに切り出して管理してたりなど、微妙に違いますが…）

# 実ファイルの保存先
入れ物ID / 中身ID /  ファイル名.拡張子

のように対応させてます。

# ポイント
・オブジェクト設計（クラス図）とマッピングしやすい構成。
・全てLaravelのEloquentで処理できるように。

# 最後に
「バージョンによって使用するファイルが違う」
という関係性を綺麗に表せていて、
今ではしっくりきています。

パフォーマンスを優先するシステムであれば、
もっと違う形の設計になるのかなーと思います。
Web Fontの各種テクニック

HTML5 Advent Calendarと言いつつ、中身はCSS3なのですが、そのあたりはご了解いただければと思います。

# Web Fontとは
ご存じの方も多いかもしれませんが、Web Fontとは、「端末側に入っていないフォントをWeb経由で取得して表示できる」仕組みのことです。Qiitaでも、アイコンフォントが使われています。

## メリット
* 文字として使える…凝った文字を出すときに画像化すると、文字でなくなってしまうので再利用に不便ですが、文字ならそのまま読み取れますし、動的に書き換えるのもごくシンプルに済みます。アクセシビリティやSEOの面でも有利です。
* ベクター表示…Web Fontには通常アウトラインフォントを使いますので、拡大してもスムーズです。Retinaなど高解像度化が進む環境では、かなり便利です。
* 表現の自由度・安定性…端末に入っているフォントに依存する形では、見る環境によって表示が変わってきますが、Web Fontで用意すればどこから見ても同じように見えるものを作れます。

## デメリット
* 重い…アイコンフォントだったらロードまでアイコンが見えない程度なのですが、何の細工もせずに本文のフォントをWeb Fontにしてしまうと、フォントがロードされるまで**文字が出ない**ことになってしまいます[^1]。特に、日本語の場合フォントファイルも巨大なので、影響もかなり大きいです。
* ライセンス…Web Fontとしてフォントを使うことはすなわち、「そのフォントを配布する」ことになるので、再配布可能なフォントを使うか、相応の契約を結ぶ必要があります。「きれいだから」と、たとえばヒラギノをWeb Fontにする、なんてことは技術的にもライセンス的にも面倒です。
* 日本語向けサービスの未発達…上に述べた重さやライセンスの問題などで、日本語Web Fontを簡単に試せるようなサービスはあまりありません。欧文だけなら[Google Fonts](https://www.google.com/fonts)などで簡単に使えるようなフォントが各種存在しています。

# ファイル形式について
Qiitaでも使われているアイコンフォントのFont Awesomeを見てみると、フォントファイルばかり5つも付いています。中身はすべて同じもので形式が違うだけなのですが、それを見ただけで「自分で用意するのは面倒」と腰が引けてしまうかもしれません。

ただ、実はWeb Font専用の形式にしなくても、ふつうのTrutType/OpenTypeフォント（`.ttf/.otf`）ファイルで、ほとんどのブラウザに対応できます（[Can I use](http://caniuse.com/#feat=ttf)）。IE 8以前に対応するにはEOT形式が必要ですが、この2つがあれば、ほぼすべての環境に対応可能です（iOS 4ではSVGフォントしか対応していない、なんてのもあったようですが、現実問題としてそんな端末を現時点で考慮する必要は限りなく0に近いでしょう）。

なお、形式によっては最初から圧縮されていて、ファイルサイズが小さくなっているものもありますが、TTFでもgzip転送すればほぼ同じぐらいの容量になるので、それで充分な気もします。

# セキュリティ上の問題
同じサーバにフォントを置く上では特に問題はないのですが、Google ChromeやFirefoxから別サーバのフォントをダウンロードしようとすると、CORSのチェックが行われて、`Access-Control-Allow-Origin:`ヘッダで許可されていない場合、フォントを使うことができません。

とりわけ、AWSを使う場合、静的ファイルはS3に置くことが多いので、引っかかることがよくあるかもしれません。S3の場合の設定は[クラスメソッドさんのページ](http://dev.classmethod.jp/cloud/cors-cross-origin-resource-sharing-cross-domain/)に詳しいです。

# CSSへの書き方
既存のサービスからフォントを借りてくるのも1つの手段ですが、自分でCSSを書けばさらに制御できます。

## 基本編
フォントの設定には、CSSの`@font-face`を使います。

```css:大まかなひな形
@font-face{
  font-family: 'Font Name';
  src: url('http://example.com/path/to/font.ttf');
}
```

`font-family`の名前はあとで参照するときに使うだけなので、好きに付けられます。`src`には他のリソース同様、`url()`でファイルを指定します。あとは、他の場所からCSSで`font-family: 'Font Name'`として、このフォントを使えます。

## 応用編
### ウェイトの使い分け
同じ`font-family`について、通常時とboldにした場合のフォントを切り替えることができます。

```css:ウェイトの使い分け
@font-face{
  font-family: 'Font Name';
  src: url('http://example.com/path/to/font-regular.ttf');
  font-weight:normal;
}

@font-face{
  font-family: 'Font Name';
  src: url('http://example.com/path/to/font-bold.ttf');
  font-weight: bold;
}
```
このように、同じ`font-family`で指定することで、標準と太字をまとめて指定でき、`font-weight`で切り替え可能になります。Webでやる意味があるかはわかりませんが、出版物のように「本文は明朝、強調はゴシック」のような別フォントの指定や、100〜900まで9段階のウェイト指定も、したければ可能です。

### ローカルフォントの使用
`@font-face`の`src`には、複数のフォントファイルを指定できますが、`local('フォント名')`という指定を混ぜることもできます。これは、

* Helveticaなど有名だけど有償なのでWeb Fontとして使えないフォントについて、環境にあればそっちを使って、なければフリーフォントをWeb Font化して代用
* IPAフォントのようにそこそこ有名なフォントを使うので、環境にあればダウンロードをさせずに表示させる

などの場面に有用です。


[^1]: [PHPの公式サイト](http://php.net/)でも、この「文字の表示遅れ」を体感できてしまいます。
iOSアプリ開発をIconFontで幸せに

チャオ！

iOS開発でアイコンフォントを使うと色々ハッピーになれるよ！
本当はsvg画像をそのまま何もしないで食べてくれるともっとハッピーなんだけどね・・

##何がうれしいの？

#### 容量が軽い
- そもそもpngなどで書きだしたものよりベクター画像の方軽い
- 1倍、2倍（レティーナ用）、3倍（6plus用）の３つ必要だが、1つで済む
- サイズ、色違いも1つで済む

#### 大きくしてもガタガタにならない
ベタクーなのでなめから、PDFでセットしたベクター画像は最終的にはビットマップに変換されるのでアニメーションとかで大きくしたらガタガタに。
![sample.png](https://qiita-image-store.s3.amazonaws.com/0/5176/40f30edc-bc87-64e4-3712-a043168b9292.png "sample.png")

#### テキストなので使いやすい
テキストなんでUIImageViewではなくUILabelとかで表示する感じになります。
普通にボタンとかにもセットできちゃいます。

```objc
UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 40, 40)];

// フォントなんでボタンにもセットできる！
btn.titleLabel.font = [UIFont fontWithName:@"addFont" size:40];

// どのアイコンにするかはsetTitlteでテキストを渡すだけ
[btn setTitle: @"\ue900" forState:UIControlStateNormal];

// 色も簡単にかえられる
[btn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];

// なのでハイライトで色・アイコンを変えるも簡単♪
[btn setTitle: @"\ue901" forState:UIControlStateHighlighted];
[btn setTitleColor:[UIColor blueColor] forState:UIControlStateHighlighted];
```
もうボタンのハイライトのために違う画像を用意したりはいらないのです！

####Androidと共通で使える
地味にうれしいです。

##デメリットは？
- 単色オンリー（文字扱いなのでカラフルものは出来ないですー
- サイズ合わせにコツがいる。文字サイズ指定でサイズをセットするので、慣れるまで大変

##実装方法

####1.アイコンフォントを用意
アイコンはicomoonから取るのがオススメ。
ロゴとかもアイコンフォントにしたければ、svgで書きだした画像を食べさせるとフォント化してくれます。
icomoonの使い方とかは　このサイトが詳しいかも
[icomoonの使い方](http://shufulife.com/icomoon/)

####2.カスタムフォントの使い方
カスタムフォントのセットしかたはここが詳しいです。
フォントをセットするのにPostScript名でセットする必要があるんですが、その辺詳しく書いてあって素敵です。
[iOSアプリでカスタムフォントを利用する](http://qiita.com/Yuta/items/eecbdd107c87c4d68f4d)

####3.こういうのがアレば便利に使えるかも

#####マクロ
こういうマクロを用意しておけば、いつでもどこでも気軽にセットできる！

```objc
#define ICON_FONT(__SIZE) [UIFont fontWithName:@"addFont" size:__SIZE]
//こんな感じで使う
label.font = ICON_FONT(20);
```
テキストをセットするときは@"\ue900"とか@"p"とか何がどのアイコンだったか分からなくなりがちなので、下記みたいに定数化しておくと幸せになれます。

#####定数
```objc
static NSString *const IconHome = @"\ue900";
//こんな感じで幸せ
label.text = IconHome;
```

#####カテゴリ
IconFontをUIImageでほしい場合が合ったりするので下記のようなカテゴリを用意していると色々捗ります。

```objc
+ (UIImage *)iconFont:(NSString *)icon
                 size:(CGFloat)size
                 rect:(CGSize)rect
                color:(UIColor *)color
{
    UIFont *font = ICON_FONT(size);
    
    UIGraphicsBeginImageContextWithOptions(rect, NO, 0);
    
    NSDictionary *stringAttributes = @{NSForegroundColorAttributeName : color,
                                       NSFontAttributeName : font};
    NSAttributedString *attString = [[NSAttributedString alloc] initWithString:icon
                                                                    attributes:stringAttributes];
    NSStringDrawingContext *ctx = [[NSStringDrawingContext alloc] init];
    CGRect boundingRect = [attString boundingRectWithSize:CGSizeMake(size, size) options:0 context:ctx];
    [attString drawInRect:CGRectMake((rect.width/2.0f) - boundingRect.size.width/2.0f,
                                     (rect.height/2.0f) - boundingRect.size.height/2.0f,
                                     rect.width,
                                     rect.height)];
    UIImage *iconImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    return iconImage;
}
```

それではアイコンフォントでハッピーになってもらえればと！
soracom-sdk-ios 作ってみた

ソラコムの清水です。
[12/16 の SORACOM Advent Calendar](http://qiita.com/advent-calendar/2015/soracom) ネタとして、 swift でシンプルなSDKを作ってみました。

https://github.com/soracom/soracom-sdk-ios

クローンしてサンプルプログラムを起動すると、こんなコンソールが立ち上がります。

![login.png](https://qiita-image-store.s3.amazonaws.com/0/18113/97aeec6f-48e3-fadc-61bb-792dfdb231fe.png)

ログインすると、登録しているSIMの一覧が見れます。

![subscribers.png](https://qiita-image-store.s3.amazonaws.com/0/18113/fdd25b8f-eed7-4e57-940b-aeb30ea77d57.png)

SIMをタップすると、詳細画面が開き、速度が変更できます。ギリギリだったので、fastとminimumだけです。男らしいですね。

![updateSpeedClass.png](https://qiita-image-store.s3.amazonaws.com/0/18113/0f75b727-548f-f79e-a284-b4a805b90c34.png)

変更できました。

![updated.png](https://qiita-image-store.s3.amazonaws.com/0/18113/5ea19689-8da5-f1c1-427f-9e708b4fc95a.png)

ほとんどのAPIが実装されていませんが、骨組みをざっくり作れたので、ちまちまと足していこうと思っています。
１日で作った急ごしらえなので、荒いところが多く、cocoapodsへの登録はまだできる状態ではありません。
もうしばらくお待ちいただければと思います。
Nutanixが提供するデータ保護機能 (ローカルバップアップ編)

# はじめに
この記事は、[Nutanix Advent Calendar 2015](http://www.adventar.org/calendars/1124) 12月16日の分として作成しました。
本記事の内容はこの日付の情報に基づいています。

# Nutanixのデータ保護機能概要
商用版のNutanixでは、お客様のバックアップのご要件に柔軟に対応できるよう、多様なデータ保護の機能を提供しています。
Nutanix Community Editionでは、2015.11.05版のリリースで商用版で提供されているのとほぼ同等の、以下の機能が利用できるようになりました。

- 同一Nutanixクラスター内でのスナップショットベースのバックアップ/リストア
- スナップショットを異なるNutanixクラスターに転送する非同期レプリケーションの機能
- リモートのNutanixクラスターに転送されたスナップショットを、リモート側で仮想マシンとして復元するディザスターリカバリーの機能
- リモートのNutanixクラスターを、物理的なコンピュータではなく、AWS/Azureといったパブリッククラウド上に構築する機能

今回はローカルでスナップショットを作成し、それをリストアする機能と、その設定の手順をご紹介いたします。

# スナップショット機能の特徴
Nutanixのスナップショット機能は以下の特徴を持ちます。

- 仮想マシン単位での設定が可能
- メタデータの静止点を取得する方式なので、高速でデータの容量効率が良い (スナップショット取得時の差分データのみが増加する)
- 柔軟なスケジュール設定が可能
- 徹底的にシンプルな設定
- リストアは、既存の仮想マシンへの上書きか、別途クローンを作成するかを選択可能

では、具体的な設定手順をご紹介しましょう。

# 設定方法
NutanixのWebベースの管理コンソール、PrismのData Protectionの画面より設定を行います。

<img width="316" alt="DP_Menu.png" src="https://qiita-image-store.s3.amazonaws.com/0/83432/71cb514e-ae88-f8d5-5fd0-a5be0d208cf2.png">

- 右上のメニューから「+ Protection Domain」を選択し、新しいProtection Domain(バックアップのグループ)を作成する
<img width="376" alt="+PD.png" src="https://qiita-image-store.s3.amazonaws.com/0/83432/7f00ad6a-a17b-6a65-d2d1-00cf810fc50b.png">

- バックアップの対象とする仮想マシンを選択する
<img width="400" alt="pd_vm.png" src="https://qiita-image-store.s3.amazonaws.com/0/83432/64cde776-3230-a32a-07c1-a4fd5b97a49c.png">

- バックアップのスケジュールと保管世代数を設定する
<img width="400" alt="schedule_01.png" src="https://qiita-image-store.s3.amazonaws.com/0/83432/22c10ae2-51ff-d616-4018-215b7c3959ac.png">
<img width="400" alt="schedule_02.png" src="https://qiita-image-store.s3.amazonaws.com/0/83432/7713b969-3636-f195-415d-e04645662567.png">
スケジュールの設定では、以下を設定することが可能です。
-- スナップショットの取得周期
-- 開始時間と終了時間
-- 保管世代数 (ローカルおよびリモート)

これでバックアップの設定は完了です。

# 実行結果
バックアップの実行結果もPrismより確認可能です。

<img width="400" alt="DP_table.png" src="https://qiita-image-store.s3.amazonaws.com/0/83432/fd66fb75-9ec3-0b08-31bc-6e4abaf89c73.png">
この図では毎時0分にスナップショットを取得する設定での各スナップショットの実行結果が表示されています。

# リストア方法
上図の右端にあるRestoreのメニューを選択すると、リストアの設定画面がポップアップします。
<img width="400" alt="restore_01.png" src="https://qiita-image-store.s3.amazonaws.com/0/83432/b084caee-843a-4678-7534-697fac40b125.png">

リストアする対象の仮想マシンを選択し、リストアの方式を選択します。以下の2種類のオプションがあります。
- Overwrite existing VMs: 現在動作している仮想マシンを上書きする形でリストアを行います
- Create new VMs: スナップショットから、新しい仮想マシンをデプロイする形でリストアを行います。

Create new VMsのオプションを選択した場合には、仮想マシンを配置するストレージのパスと、Prefixの入力(オプショナル)が求められます。
<img width="400" alt="restore_02.png" src="https://qiita-image-store.s3.amazonaws.com/0/83432/e5a4bab7-57df-bb7d-bf94-08427625f586.png">

※VM Name Prefixを入力しなかった場合は、仮想マシン名を一意にするためにNutanix側で自動的にPrefixやPostfixを付与します。

OKボタンを押下するとリストアジョブを実施する旨のメッセージが表示され、数秒後には仮想マシンとして復旧されます。復旧された仮想マシンは、VMメニューから確認することが可能です。

<img width="400" alt="message.png" src="https://qiita-image-store.s3.amazonaws.com/0/83432/3878c51c-9c18-288b-76cc-48e0e4b83603.png">

<img width="400" alt="VMs.png" src="https://qiita-image-store.s3.amazonaws.com/0/83432/dc7e065b-3396-4b05-d765-7d7e1b8362db.png">


# 終わりに
Nutanixのスナップショット機能の概要とローカルスナップショットの設定手順をご紹介しました。
次回は、2代のCEのマシンを使用した非同期のリモートレプリケーションを解説します。
Element の状態遷移について


plugin 開発の話をするまえに、Elementについてもっと知っておかなければならないことがたくさんあります。

今日は、最も基本的な GST_STATE についてお話します。
もしかすると、あなたは GST_STATE の遷移を gst-launch を実行した時に見たことがあるかもしれません。

以下のような表示は見たことがありませんか? これが GST_STATE の遷移です。

```shell-session
$ gst-launch-1.0 -ev fakesrc ! fakesink
Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...

:

Setting pipeline to PAUSED ...
Setting pipeline to READY ...
Setting pipeline to NULL ...
```

GST_STATE は 4つあります。

- NULL
- READY
- PAUSED
- PLAYING

それぞれは決まった流れでしか遷移しません。

NULL → READY → PAUSED → PLAYING
NULL ← READY ← PAUSED ← PLAYING

NULL から PLAYING にジャンプすることもありませんし、PLAYING から READY に一気に切り替わることもありません。必ず順番に遷移します。

gst-launch では「Setting pipeline to PAUSED」など、Pipeline についてしか言及していません。GST_STATE は、Pipeline のみが持つのでしょうか?

答えは No です。

タイトルでも口走っているように、GST_STATE はすべての GstElement が持っています。
これは[GstElement](http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#GstElement-struct)の構造体からも確認できます。また、Pipeline が GST_STATE を持っていることは [Pipeline の Object Hierarchy](http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPipeline.html#GstPipeline-struct) から確認できます。

つまり、Pipeline も Element も GST_STATE を持っています。

---

Pipeline も Element も GST_STATE を持っていることがわかったところで、次に気になるのはPipelieneとElementの状態遷移の関連性です。

Pipeline が PLAYING のとき、その Pipeline に含まれる Element は READY であることがあるのでしょうか?

この答は、デバッグレベルを上げて gst-launch を実行するとわかります。

```shell-session
$ GST_DEBUG=4 gst-launch-1.0 -ev fakesrc ! fakesink
```

横長で読みにくいですが、`Setting pipeline to PAUSED ...` の後に以下のログがあると思います。

```
GST_STATES gstbin.c:2243:gst_bin_element_set_state:<fakesink0> current NULL pending VOID_PENDING, desired next READY
GST_STATES gstelement.c:2330:gst_element_continue_state:<fakesink0> completed state change to READY
GST_STATES gstelement.c:2235:_priv_gst_element_state_changed:<fakesink0> notifying about state-changed NULL to READY (VOID_PENDING pending)
GST_STATES gstbin.c:2707:gst_bin_change_state_func:<pipeline0> child 'fakesink0' changed state to 2(READY) successfully
GST_STATES gstbin.c:2243:gst_bin_element_set_state:<fakesrc0> current NULL pending VOID_PENDING, desired next READY
GST_STATES gstelement.c:2330:gst_element_continue_state:<fakesrc0> completed state change to READY
GST_STATES gstelement.c:2235:_priv_gst_element_state_changed:<fakesrc0> notifying about state-changed NULL to READY (VOID_PENDING pending)
GST_STATES gstbin.c:2707:gst_bin_change_state_func:<pipeline0> child 'fakesrc0' changed state to 2(READY) successfully
```

ここから、読み取れる内容の大きなポイントは2つです

- Sink element (下流の Element) から Src element に向かって STATE CHAGE が進んでいくということ
- Pipeline の Elemnet すべての STATE CHANGE が終わってやっと Pipeline の STATE が変わるということ

これは NULL -> PLAY までの順番に変わっていく中でも必ずこの動きをします。

「Pipeline が PLAYING のとき、その Pipeline に含まれる Element は READY であることがあるのでしょうか?」の答えは No です。

---

この STATE CHANGE の概念を知っていると、Element のデバッグが捗るのでぜひ抑えておくことをおすすめします。

今回の内容は [What are states?](http://gstreamer.freedesktop.org/data/doc/gstreamer/head/pwg/html/chapter-statemanage-states.html) に書いてありますし、ここでは書かなかったそれぞれの STATE の意味なども書いてあるので見るとより幸せになれます :)
aceエディターで行数部分にブレイクポイントの表示を設定する

__editor.on("guttermousedown",function)__で行数部分のマウスダウンイベントを取得して、__editor.session.setBreakpoint(row) ;__でブレークポイントを設定できる。__editor.session.clearBreakpoint(row) ;__でブレークポイントに設定したものをクリアできる。今回のコードは１つだけブレークポイントを設定できる。的なものにしてみた。
![ace-breakpoint.png](https://qiita-image-store.s3.amazonaws.com/0/1423/2727151d-96e6-363b-0db1-e7e4af054dce.png)

- 全体のコード
https://gist.github.com/nyamogera/846ca63302c078bd59a

- 該当部分だけのコード

```css.css
.ace_gutter-cell.ace_breakpoint{ 
  border-radius: 20px 0px 0px 20px; 
  box-shadow: 0px 0px 1px 1px red inset; 
} 
```
(css変更できる)

```js.js
var oldNumber = -1;
editor.on("guttermousedown", function(e){ 
		var target = e.domEvent.target; 
		if (target.className.indexOf("ace_gutter-cell") == -1) 
			return; 
		if (!editor.isFocused()) 
			return; 
		if (e.clientX > 25 + target.getBoundingClientRect().left) 
			return; 
	
		var row = e.getDocumentPosition().row 
		
		if( oldNumber == row ) {
			e.editor.session.clearBreakpoint(row);
			oldNumber = -1;
		} else{
			if( oldNumber >= 0 ) {
				e.editor.session.clearBreakpoint(oldNumber);
			} 
			e.editor.session.setBreakpoint(row) ;
			oldNumber = row;
		
		} 
		e.stop() ;
	})
```
# 今回の解決道順

## 1.aceのエディターの行数部分をDeveloper Toolsで見てどういった名前なのかを調べた。
この部分は「gutter」らしい。
![ace-developertools.png](https://qiita-image-store.s3.amazonaws.com/0/1423/3524760a-f1f5-569c-c06e-1ea60c165825.png)


## 2.「cloud9 ace gutter」で検索した。
aceだけだと別のものが出てきそうだったので、検索ワードに「cloud9」を追加。
一番目に[「Modify the gutter of Ajax.org Cloud9 Editor (Ace Editor) - stack overflow」](http://stackoverflow.com/questions/28311086/modify-the-gutter-of-ajax-org-cloud9-editor-ace-editor)がヒットしたので試してみる。

- [検証コード](https://gist.github.com/nyamogera/5f660ff866d7a2d34d25)

- 結果
![ace-modify-gutter.png](https://qiita-image-store.s3.amazonaws.com/0/1423/a711b59f-5d02-1cbb-a8dd-4543657dedf0.png)

ちゃんと文字列として表示されたよ！やったね！違う(´；ω；｀)ﾌﾞﾜｯ

## 3.ググるよりリファレンス読んだほうが早いのでは・・・？ と思い始める。
[「API Reference/EditSession - Ace」](https://ace.c9.io/#nav=api&api=edit_session)で上のコードで使った「gutterRenderer」を[Cmd]+\[F\](ブラウザ内検索)で検索するが、出てこなかったので諦める。（これは検索ミス...。「gutter」で検索すべきだった。）

## 4.新しい検索ワードを思いつく「ace gutter breakpoint」
そういえばブレークポイントついてるようなのあったよな・・・？と思って検索。

それっぽいのヒット！！！[「How to mark line numbers in javascript ace editor? - stack overflow」](http://stackoverflow.com/questions/16864236/how-to-mark-line-numbers-in-javascript-ace-editor)⇢[「Enable breakpoints in embedded editor - Google Group」](https://groups.google.com/forum/#!msg/ace-discuss/sfGv4tRWZdY/ca1LuolbLnAJ)

でした。ちなみに「clearBreakpoint」はここのコードになかったので、[「API Reference/EditSession - Ace」](https://ace.c9.io/#nav=api&api=edit_session)からブラウザ内で検索した。
sudoedit



## sudo viは危険

```bash
sudo vi
```

で編集すると、自分の.vimrcが反映されず、そっけない画面になってしまいますよね。自分もかなり我慢してた経験ありです。そこを.bashrcでEDITORをexportしてやり、

```.bashrcへ追加
export EDITOR=vim
```

sudoedit (または、sudo -e)とすると、自分の.vimrcが反映されるし、カラースキームやプラグインも有効になります。まぁ便利。

例えば、こんな感じ。

```bash
sudoedit /etc/httpd/conf/httpd.conf
```

しかも、この方法はセキュリティ的にも```sudo vi```より優れていて、```sudo vi```はコマンド実行などもできてしまうし危ないですが、```sudoedit```では、それがなくてより好ましいようです。

具体的には、テンポラリ領域に編集したいファイルをコピーして自分権限で編集しているんですね。で、編集後にコピーすると。なるほど。


## 参考
+ [sudo vim より sudoedit を使うべき理由](http://w.vmeta.jp/tdiary/20120317.html)
+ [sudo emacsとかsudo viとか](http://www.yazin.info/blog/archives/2012/0326_115443.html)

おわり。
KFUGに今年（主に後半）参加してみて


AdventCalendar 2015 16日目の記事です。

先日（12月13日）の年忘れLT大会にて、初めて登壇いたしました。
といっても、お酒飲んでピザ食べるような場でしたので、固くならずに話せて、個人的にも楽しかったです。
皆さんお酒が入っていたこともあってか、かなり内容が尖っていて、何度か腹が捩れるほど笑わせていただきました。

振り返ってみると今年はちょくちょく勉強会に参加するようになり、いろいろとためになりました。
この記事は、そんな関西フロントエンドUGに参加してみての感想になります。



## 参加してわかったこと

フロントエンドという業界は想像以上にカオスでした。
KFUGでは、私のようなレベル２プレイヤーがいる中、

「これはメラゾーマではない、メラだ」

というような圧倒的技術力を持った先輩方がいます（だいたいフルスタック化してる）

業務内容も多岐にわたり、使っているツールも色々。
一口にフロントエンドといっても、その領域もレベル帯も様々だと感じました。



## カオスなフロントエンド

htmlとcssを触っている私のような人間がいる一方、
タスクランナーやテンプレートを使って爆速で書いている人たちがいます。

KFUGの勉強会に出るようになって一番ありがたかったのは、そういった未知の領域を知れることでした。
sass、BEM、タスクランナー、jade、wp、bootstrap、foundation…。
去年の今頃の私には縁のなかったものです。

まだまだ道具に振り回されている現状ですが、便利なものがこの世にはたくさんあるんだと知りました。
どんどん訴求していきたいですね。



# というわけで今年一年の総括

__圧倒的パワーレベリングでした。__
（特に今年後半）

KFUGのみなさんのおかげで、今年後半にかけて物凄い勢いで成長できたような気がします。
来年も何卒よしなに。
git (github) で過去の１点と現状との差分を単一のファイルに限定して見る方法 （差分を翻訳しなおすため）

概要
======

[CakePHP3 のドキュメント](https://github.com/cakephp/docs/) の翻訳をしていて、
翻訳後に原文が更新されることがよくあるのですが、
どこが変わったのか diff することがよくあります。
そのときの手順をまとめてみました。

手順
======

- ローカルを最新の状態にしていることが前提です。


- 下記のようにして特定のファイルの修正の一覧を出します。

```
git log --date=short --pretty=format:"%h %cd %C(blue)%an:%C(white) %s" ファイルパス
```

```
$ git log --date=short --pretty=format:"%h %cd %C(blue)%an:%C(white) %s" en/orm/retrieving-data-and-resultsets.rst
32fbb58 2015-11-07 Bryan Crowe: Merge pull request #3471 from cakephp/no-easily
71d73e4 2015-11-06 Mark Story: Remove easily.
3ca071c 2015-11-04 Mark Story: Merge pull request #3467 from jeffblack360/patch-32
6835e6f 2015-11-04 JB: Update retrieving-data-and-resultsets.rst
5658a4e 2015-11-04 Graziel: typo
eb94b67 2015-10-07 cake17: remove last label warning caused by an include
cc8f581 2015-10-02 Bryan Crowe: A few fixes to contain docs
f5b1085 2015-09-24 antograssiot: update ref to collections page
c5d1419 2015-08-20 Avinash Joshi: Typo in in ...->autoFields(true);->contain...
a12da5d 2015-08-08 Mark Story: Add more collection method examples to retrieving data.
```

各列は順に、コミット番号、マージされた日付、コミットした人、コミット文。

自分が翻訳をし始めたあたりの日付から、最新のコミットまでを選んで最新のブランチ名(この例では `3.0` )と比較します。

```
git diff コミット番号 照合先ブランチ --color -U前後の行数 ファイルパス
```

```
$ git diff 75ebfe0 3.0 --color -U10 en/orm/retrieving-data-and-resultsets.rst
diff --git a/en/orm/retrieving-data-and-resultsets.rst b/en/orm/retrieving-data-and-resultsets.rst
index f82b1fe..ad5a656 100644
--- a/en/orm/retrieving-data-and-resultsets.rst
+++ b/en/orm/retrieving-data-and-resultsets.rst
@@ -3,41 +3,55 @@ Retrieving Data & Results Sets
 
 .. php:namespace:: Cake\ORM
 
 .. php:class:: Table
 
 While table objects provide an abstraction around a 'repository' or collection of
 objects, when you query for individual records you get 'entity' objects. While
 this section discusses the different ways you can find and load entities, you
 should read the :doc:`/orm/entities` section for more information on entities.
 
+Debugging Queries and ResultSets
+================================
+
+Since the ORM now returns Collections and Entities, debugging these objects can
+be more complicated than in previous CakePHP versions. There are now various
+ways to inspect the data returned by the ORM.
```

PHPStorm 使っているならもっと簡単
===================================

- 対象のファイルを開く
- `Show History` アイコン（![image](https://qiita-image-store.s3.amazonaws.com/0/29899/d7f10fac-1454-1202-def2-0c9075be5030.png)
）をクリックし、 `Version Control` の `Histroy` を開く
- 一番上(最新)と過去のいずれかのコミットを選び、 `Ctrl + D` で差分を表示する。

以上！
Node.js REPLでは^{.*}$は()で括られる

ECMAScriptの有名な話として```{} + {}```が```NaN```であるというものがありますが、Node.js REPLで実行すると

```js
> {} + {}
'[object Object][object Object]'
```

となります。
これは[REPLの実装中](https://github.com/nodejs/node/blob/master/lib/repl.js#L404)で```{```で始まり```}```で終わる行は```()```で括ってしまうという動作があるためです。

```js:lib/repl.js
      var evalCmd = self.bufferedCommand + cmd;
      if (/^\s*\{/.test(evalCmd) && /\}\s*$/.test(evalCmd)) {
        // It's confusing for `{ a : 1 }` to be interpreted as a block
        // statement rather than an object literal.  So, we first try
        // to wrap it in parentheses, so that it will be interpreted as
        // an expression.
        evalCmd = '(' + evalCmd + ')\n';
      } else {
        // otherwise we just append a \n so that it will be either
        // terminated, or continued onto the next expression if it's an
        // unexpected end of input.
        evalCmd = evalCmd + '\n';
      }
```

この動作は行末に ```//``` などを入れておけば避けることができます。

```js
> {} + {} //
NaN
```

行頭と行末を見ているだけなので次のようなコードも当然動きます。

```js
> {a : 1}).a + ({}
'1[object Object]'
```

ES.nextの仕様をbabelなどのtranspilerのみで確認するのは危ないという話がありますが、同様に言語の仕様をREPLのみで確認するのもなかなか危険だなと思いました。
Powerline & byobu & tmuxでtmux.confが反映されない

#タイトルの通り
powerlineの設定が反映されないと思ったら、パスが違った。
一応共有しておく。

tmuxだけだと
> ~/.tmux.conf

ここ↑のconfを弄ればいいのだけど

byobuを入れてると
> ~/.byobu/.tmux.conf

ここ↑になる。
PHPのPOSTパラメータ数の上限トラップ

PHPでウェブなことしてると `$_POST` を空気のように使っていますが、この子は時として牙を剥きます。

# POSTパラメータ数には上限値がある

人間が入力する程度のフォームならば普段は気にならないんですが、常軌を逸するような数のhiddenが搭載されたフォームだったり、APIやスクリプトやなんかでcurl等使って直接POSTリクエストを発生させるようなものがあったりすると、人知の及ばぬ大量のパラメータが飛び交うことになります。
このとき、運悪くPHP先生の限界を超えてしまうと**上限数以降がカットされる**という事態になり、それはそれは残念な結果になることもあります。ていうかなりました。
いちおう、カットが発生した場合は`E_WARNING`が発生しますので、ちゃんとエラーレベル引き上げておきましょう。

こんなエラー。

```text:error.log
PHP Warning:  Unknown: Input variables exceeded 1000. To increase the limit change max_input_vars in php.ini. in Unknown on line 0
```

# PHPの設定

max_input_vars っていうまさにPOSTパラメータ数の上限値を設定しているパラメータがあります。デフォルトは1000になっていますので、もっと引き上げれば許容値を引き上げる事ができます。
というわけで該当プログラムの最初でini_set()すればおっけぃ！とやってみると、

```bash:Sample
~$ php -r "var_dump(ini_set('max_input_vars', 2000));"
bool(false)
```

できません。
調べてみると、`PHP_INI_PERDIR`となっているため、スクリプトからは設定を変える事ができないようです。まぁ考えてみたらスクリプト入ってきてる時点で $_POST はできあがっているので、その後に設定変えても意味ないよね、っていう。

参考：http://www.php.net/manual/ja/ini.list.php

というわけでこのパラメータを変える場合は、PHPの設定ファイルかウェブサーバの設定から変えましょう。

```ini:php.ini
max_input_vars = 2000
```

```apache:apache.confもしくは.htaccess
php_value max_input_vars 2000
```

これでとりいそぎ大丈夫ですが、将来さらにパラメータ数が増えたときにまた上限値を引き上げなければならないということも考えられます。さらに言い始めるとこの設定値自体にも上限が存在する可能性が・・とか考えだすとキリがないので根本的な解決が欲しいところ。

# $_POST を使わないという選択肢

$_POSTちゃんは気が効く反面、頑張りすぎてキャパオーバーしてしまうので、そのときには休んでもらいましょう。

幸運なことに、`php://input`という定義済みなストリームがあり、リクエストボディを直接参照できます。POSTの場合でもbodyを直接見ると、`hoge=xxx&hoge2=nnn` のように普段見慣れたGETクエリと同様の形式でPOSTされたデータが繋がって格納されていますのでこれをパースしてあげましょう。

これまた幸運なことに`parse_str`っていうクエリ文字列をパースしてくれる関数が用意されているのでらくちんです。

```php:samplePost.php
$rawdata = file_get_contents('php://input');
parse_str($rawdata, $postData); 
```

んでもってこれを走らせると**怒られます**。

```text
Warning: parse_str(): Input variables exceeded 1000. To increase the limit change max_input_vars in php.ini.
```

parse_str、お前もか。
っていうかたぶん$_POSTにぶっこむときに内部でこれ使ってるんでしょうかねぇ・・・。

というわけで全部自力でやるしかないようです。
こんなかんじ。

```php:samplePostVer2.php
// 難しいことを考えずに作ったやつなので
// セパレータ文字が混ざってたりするとおかしくなるかも。
$postData = array();
$rawdata = file_get_contents('php://input');
foreach (explode('&', trim($rawdata)) as $data) {
    list ($key, $value) = explode('=', $data);
    $postData[$key] = $value;
}
```

なんだか昔のPerl CGI時代を思い出しますなぁ(懐古)。

# おわりに

この上限値のことを知らなかったので一人でハマってたんですが、正直自分でトラップ発動を食らわないとこういう細かな設定群は覚えられないので、大事故になる前に発覚してよかったです(言い訳)。

ただ自分がこれで困ってググって出てきた記事が、設定値を引き上げる方法しか書いてないものばかりだったので、参考までに根本解決をする方法として紹介してみた次第です。参考になれれば幸いです。
underscoreコードリーディング（max）



underscoreに詳しくないので、勉強半分でソースコードを読む。


##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##maxとは


###[underscorejs.orgのmax](http://underscorejs.org/#max)

こんな説明。
>####_.max(list, [iteratee], [context]) 
>Returns the maximum value in list. 
>If an iteratee function is provided, it will be used on each value to generate the criterion by which the value is ranked.
>-Infinity is returned if list is empty, so an isEmpty guard may be required.

```javascript
var stooges = [{name: 'moe', age: 40}, {name: 'larry', age: 50}, {name: 'curly', age: 60}];
_.max(stooges, function(stooge){ return stooge.age; });
=> {name: 'curly', age: 60};

```

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

listの中の最大値を返す
もしiteratee関数が渡されていたら、その関数がすべての値に対して、ランク付けする際に利用される
-Infinityはlistが空の場合に渡される。なので、isEmptyで先にガードしなければならない。


例示だとstooge.ageをmaxの値に利用している



###[underscore.max](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L298)

コード的にはこのあたり。

```javascript
  // Return the maximum element (or element-based computation).
  _.max = function(obj, iteratee, context) {
    var result = -Infinity, lastComputed = -Infinity,
        value, computed;
    if (iteratee == null && obj != null) {
      obj = isArrayLike(obj) ? obj : _.values(obj);
      for (var i = 0, length = obj.length; i < length; i++) {
        value = obj[i];
        if (value > result) {
          result = value;
        }
      }
    } else {
      iteratee = cb(iteratee, context);
      _.each(obj, function(value, index, list) {
        computed = iteratee(value, index, list);
        if (computed > lastComputed || computed === -Infinity && result === -Infinity) {
          result = value;
          lastComputed = computed;
        }
      });
    }
    return result;
  };
```
最初にresult,lastComputedに -Infinityをセットしている。
_.mapの中で_.property(key)に合致する値のみをreturnする。
iterateeが存在せず、objが存在する場合には、objがArrayか連想配列か判定し、
その中で値の比較を行っている。値は単純に比較されて、最も大きな値がresultに格納され、returnされる。

それ以外の場合（iterateeが存在するか、objがnullな場合か、その両方）は
iterateeを用いて_.eachを用いて比較している。
比較方法はobjそれぞれの値(value)に対して、iterateeの値がlastComputedを超えているか、もしくはcomputedが-Infinityだった場合はresultにvalueを格納している（例だと{name: 'larry', age: 50}のような値）
また、lastComputedには50のような値を格納して、_.eachが終わるまで比較する

比較後、resultを返す。
VB.NETでExcelの参照設定を使わずに[漢字-かな]変換をする


仕事で使うことがあったので、メモを残しておきました。
あんまり活用する場面はなさそうですが、せっかくなので。

ここでは、
[JPReverseConv]というクラスを作っています。
このクラスを新しい.vbファイルにコピペしてやれば、使えます。
.Mainメソッドの中に、変換したい感じを入れると、日本語にして返します。

```vbnet
Imports Microsoft.VisualBasic
Imports System.Collections.Generic
Imports System.Text
Imports System.Runtime.InteropServices
Imports System.Runtime.CompilerServices

Public Class Form1
   Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

       Dim str As String

       str = JPReverseConv.Main(“東京最高京都最高山口最高愛媛最高香川最高”)

   End Sub

   Class JPReverseConv
       <ComImport>
       <Guid(“019F7152-E6DB-11D0-83C3-00C04FDDB82E”)>
       <InterfaceType(ComInterfaceType.InterfaceIsIUnknown)>
       Private Interface IFELanguage
           Sub Open()
           Sub Close()
           Sub Dummy5()
           ’ DO NOT CALL 
           Sub Dummy6()
           ’ DO NOT CALL 
           Function GetPhonetic(<MarshalAs(UnmanagedType.BStr)> str As String, start As Integer, length As Integer) As <MarshalAs(UnmanagedType.BStr)> String
           Sub Dummy8()
           ’ DO NOT CALL 
       End Interface

       Public Shared Function Main(args As String)
           Dim fel = TryCast(Activator.CreateInstance(Type.GetTypeFromProgID(“MSIME.Japan”)), IFELanguage)
           Dim str As String
           fel.Open()
           str = fel.GetPhonetic(args, 1, -1)
           fel.Close()
           Return str
       End Function
   End Class
```
Pug (旧：Jade) で自動的に現在の日時を取得する

自分用メモです。後日加筆・修正する可能性はあります!

テンプレートエンジンのPug (旧：Jade) で
CSSのキャッシュが使われないように `style.css?パラメータ` の技を使いたいのですが、
毎回手動で更新するのがめんどくさいので自動的に日付取得できないのかなぁーって思いまして、
ググった結果を自分のためにメモっておきます。

_*2017/03/08の更新ですが、中身は2016年8月時点の結果であったため、恐らく更なる更新が必要です_

以前は下記のやり方で通していましたが、

```lang:example
  link(rel='stylesheet' href='style.css?#{Date.now()}')
```

どうやら`#{}`の直接引用でコンパイルの際にエラーが発生し使えなくなりましたので、
現在はまず先頭にDate.nowを変数に定義し

```lang:example
  - var dateNow = Date.now();
```
使う際に変数を引用するようにしました

```lang:example
  link(rel='stylesheet' href='css/style.css?'+dateNow)
```

ただしエラーの原因と解決策が使えた理由がまだ解明されていませんので…わかる方、教えてください！！

## 参考
[How do I display todays date in Node.js Jade?](http://stackoverflow.com/questions/12419396/how-do-i-display-todays-date-in-node-js-jade)
[Pug公式：Interpolation](https://pugjs.org/language/interpolation.html)
【HTML】embed要素とmediaplayer.swfを使ってflv動画を再生する

```html:

<!DOCTYPE HTML>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<title></title>
<style type="text/css">
</style>
</head>
<body>

<embed src="mediaplayer.swf?file=http://localhost/movie/sample.flv" width="640" height="480" quality="high" type="application/x-shockwave-flash" allowfullscreen="true">

<script type="text/javascript">
</script>
</body>
</html>

```

## embed要素を使ってflv動画を再生する
embed要素のsrc属性に[mediaplayer.swf][1]をflv動画を指定するとflv動画を再生することができる。

```

allowfullscreen="true"

```

で全画面表示を可能にしている。

## よく分かってない箇所

[Another HTML-lint 5][2]でHTMLの構文チェックするとエラーが出る

```text

<EMBED> に不明な属性 `ALLOWFULLSCREEN` が指定されています。

```

とErrorが出る。

```text

allowfullscreen="true"

```

ってしないと全画面表示ができないだけどな。なんでエラーが出るん？
それからオート再生とループ再生ってできるのだろうか？

##参考文献
[mediaplayer.swf][1]
[Another HTML-lint 5][2]

[1]:https://code.google.com/p/youplayer/downloads/detail?name=mediaplayer.swf
[2]:http://www.htmllint.net/html-lint/index.html
新しく追加されたCompletableについて

新しく追加される予定のrx.Completableの紹介記事です。
 
### TL;DR
 
 * 1.1.1で入る予定。(最新は1.1.0)
 * `@Experimental`な機能なので、method名や仕様が変わる可能性がある。
 * Coldなやつで、`Single<Void>`に近いが`onNext`はない。
 * POST処理とかの際にObservable/Singleの代わりに使うと便利かも。

### PullRequest

* [Completable class for valueless event composition(#3439)](https://github.com/ReactiveX/RxJava/pull/3439)
* [1.x向けのバックポート(#3444)](https://github.com/ReactiveX/RxJava/pull/3444)

(2.xの方は実装に難有りでまだmergeされてないです。)

詳細はPRを見て下さい。 議論の内容をざっくりまとめると、

* "なにかの処理"の成功/失敗だけを伝えたい時はあるじゃん。(別に値を渡したくはない)
* `Single<Void>`だと`onNext(null)`みたいなnull渡しがあるのがイヤ。
* 2.x系はReactive-Streamsの仕様に準拠するのでnull渡しを禁止したい。

みたいな事がトピックでした。

### 使いみちあるの?

僕はいまいちピンとこなかったんですが、twitterで呟いたら「POSTした時とか、あると便利かもね」という話になりました。使い道ないけどレスポンス渡したり、null渡しすることは今までもあったので、そういう時にCompletableは便利かもしれないですね。(Completable追ってたら2.x系気になったので空いてる日にまた書きたいな。。)

https://twitter.com/__gfx__/status/674089343116435456
http://twitter.com/sys1yagi/status/676658911932362752

### 関連記事

実装した本人が熱い思いをブログに書いています。内部実装の話がほとんどで、backpressureいらないから実装がシンプルになるよね!! 最高!! みたいなこと言ってた気がします。

* [The new Completable API (part 1)](http://akarnokd.blogspot.hu/2015/12/the-new-completable-api-part-1.html)
* [The new Completable API (part 2 - final)](http://akarnokd.blogspot.hu/2015/12/the-new-completable-api-part-2-final.html)

リリースされたら使ってみたいですね。
fasta fileから特定の領域のみ抜き出す


`samtools`のfaidxを使用する

```
samtools faidx <genome>  # まずはindexを付ける
samtools faidx <genome> <chromosome name>:<start>:<end>
```

###例
常染色体のみ抜き出す

```bash
samtools faidx humanhg19.fa chr{1..23} > humanhg19_longcontigs_only.fa
```

1番染色体と2番染色体の一部のみ抜き出す

```bash
samtools faidx humanhg19.fa chr1 chr2:10000:20000 
```
ニコニコ動画のスナップショット検索APIを使ってサムネイルのリストを作る

ニコニコ動画のAPIのレスポンスからサムネイルのURLを抜き出して、
画像を並べたHTMLファイルを作るシェルスクリプトを書いてみました。

# APIのガイド
http://search.nicovideo.jp/docs/api/snapshot.html
*実行例のAcceptの前に「-H」が足りない気が。*

# コード
```bash:niconico.sh
#!/bin/bash

post='{"query":"初音ミク","service":["video"],"search":["title","description","tags"],"join":["cmsid","title","view_counter", "thumbnail_url"],"filters":[{"type":"range","field":"view_counter","to":1000000}],"from":0,"size":10,"sort_by":"view_counter","issuer":"yourservice/applicationname"}'
url="http://api.search.nicovideo.jp/api/snapshot/"
date=`date '+%Y%m%d%H%M'`
file="$date.html"

images=(`curl -s -H "Accept: application/json" -H "Content-type: application/json" -X POST -d "$post" $url | egrep -o "thumbnail_url\":\"[^\"]+" | egrep -o "[^\"]+$" | sed -e 's/\\\\\//\\//g'`)

for image in "${images[@]}"; do
    echo "<img src=\"$image\">" >> $file
done
```

# やっていること
* date=`date '+%Y%m%d%H%M'`
 - 実行時間を取得（例：201512162200)
* images=(``)
 - ``内の実行結果を配列に入れる
* curl
 - 「初音ミク」のキーワードでヒットする動画のうち1,000,000再生以下のものを10件取得
 - 「-s」プログレスメータやエラーメッセージを省略する
 - 「-H」ヘッダを指定する
 - 「-X」リクエストメソッドを指定
 - 「-d」指定したデータをPOSTリクエストで送る
* egrep -o "thumbnail_url\":\"[^\"]+"
 - thumbnail_urlの箇所のみを抜き出す
 - 「-o」正規表現にマッチした箇所のみを抜き出す
* egrep -o "[^\"]+$"
 - thumbnail_urlのURLの部分のみを抜き出す
* sed -e 's/\\\\\//\\//g'
 - thumbnail_urlのURLの「/」が「\/」となっているため、「/」に変換する
* for image in "${images[@]}"; do ～ done
 - imagesの配列一つ一つを取得し、imgタグの形式で出力ファイルに吐き出す

# 結果
```html:201512162200.html
<img src="http://tn-skr1.smilevideo.jp/smile?i=1563848">
<img src="http://tn-skr1.smilevideo.jp/smile?i=7103480">
<img src="http://tn-skr3.smilevideo.jp/smile?i=1384758">
<img src="http://tn-skr1.smilevideo.jp/smile?i=17375356">
<img src="http://tn-skr3.smilevideo.jp/smile?i=13560654">
<img src="http://tn-skr1.smilevideo.jp/smile?i=9382588">
<img src="http://tn-skr4.smilevideo.jp/smile?i=17211747">
<img src="http://tn-skr2.smilevideo.jp/smile?i=2700265">
<img src="http://tn-skr3.smilevideo.jp/smile?i=6971638">
<img src="http://tn-skr1.smilevideo.jp/smile?i=8424952">
```