OmniAICreator/Qiita-1.07M huggingface dataset:
AndroidのスクリーンショットをMac上で撮る方法


iPhoneだと [Reflector](http://www.airsquirrels.com/reflector/) という便利なもので手軽にiPhoneの今見ている画面をMac上に映し出すことができ、修正依頼のためのキャプチャもすぐに手に入るし動画も取れます。

Androidでも同じようなことをしたいのですが、Air Play的なものがないので、仕方なくAndroidのデバッガを使ってUSB接続して画面を表示します。※もっと手軽なのあるよ！という情報お待ちしております。

MacにAndroidの画面を表示する手順は3ステップです。

# 1. Androidの実機側でUSBデバッグをオン

端末によって違うと思いますが、設定内の開発者向けオプション的なメニューにUSBデバッグという設定があるので、これをオンにします。

![skitched-20141208-225104.png](https://qiita-image-store.s3.amazonaws.com/0/5798/3fa558d7-7b52-ac8a-1364-caf05f370ca6.png "skitched-20141208-225104.png")



# 2. Android Device Monitorを起動

Android SDKを入れていない人は [Android SDK | Android Developers](http://developer.android.com/sdk/index.html) からSDKをダウンロードして、`~/Android/` あたりに展開（本記事では adt-bundle-mac-x86_64-20140702 として展開）しておきます。

このフォルダ内の

`adt-bundle-mac-x86_64-20140702/sdk/tools` の中にある `monitor` というファイルをダブルクリックするとAndroid Device Monitorというのが立ち上がります。

もしかしたら、Android Support Libraryをインストールしておかないといけないかもしれないので、`adt-bundle-mac-x86_64-20140702/sdk/tools/android` をダブルクリックしてAndroid SDK Managerが起動、下図のようにAndroid Support Libraryをインストール。たぶん。


# 3. 実機をUSBにつなげてDevice Screen Captureを起動

対象の実機をUSBでMacに繋げたら、下図のScreen Captureボタンを押すと、Device Screen Captureが起動して、実機の画面が表示されます。ここまで来たら、Mac側のスクリーンキャプチャソフトで好きに調理します。

![skitched-20141208-223146.png](https://qiita-image-store.s3.amazonaws.com/0/5798/8334642b-f869-4e0f-0845-c6fb44438cc7.png "skitched-20141208-223146.png")


それでは快適なレビュー生活を。
JavaScriptで要素を点滅させるショートコーディング

需要ないとは思いますが

```html:HTML
<span id="text">点滅</span>
```

```js:JavaScript
setInterval("text.style.opacity^=1",500) //500ms毎に切り替え
```

##解説

- `setInterval`は文字列を一定時間ごとに実行出来る
- IDをつけた要素はグローバル変数に入っている
- `opacity`の値は数値だから、`1`との排他的論理和で型変換＆透明度の切り替えができる

##備考

opacityの初期値が`""`で、一回目の切り替えで`1`となるので、最初に一回分のタイムラグが生じます。対処するには`style="opacity: 0;"`をつければいいですが、そこまでやるぐらいならもう少しちゃんと実装した方がいいと思います。

##追記（2014/12/09）

コメントにあるように、このコードを実際に使うのは推奨されません。
あくまでもアイデアの一つとして捉えていただけると嬉しいです。
POH Lite4 エンジニアでも恋がしたい-転職初日にぶつかった女の子が同僚だった件 ミッション2

[ミッション1](http://qiita.com/rana_kualu/items/390f72ec444a33a41261) / [ミッション2](http://qiita.com/rana_kualu/items/e5c6cdffe8c459e76575) / [ミッション3](http://qiita.com/rana_kualu/items/4f2f05ca2ab7eb0db7be) / [共通解](http://qiita.com/rana_kualu/items/e5984759d1f81f18d3f0)

https://paiza.jp/poh/enkoi
1問目を全問正解しないと2問目は読めないので、がんばって解きましょう。
がんばるほどのものでもないですが。

```php
<?php
	$input = file('php://stdin', FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES);
	array_shift($input);
	
	$total = 0;
	foreach($input as $val){
		$tmp = explode(' ', $val);
		if($tmp[0] > $tmp[1]){
			$total += ($tmp[0] - $tmp[1]) * $tmp[2];
		}
	}
	print($total);
```

結果。
https://paiza.jp/poh/enkoi-third/f4809593

2問目もまだ何も考えずに解ける問題です。
Java の @Override って何だ


## まえがき

昔、Java を読めないときに「いきなり Android のコード書いてやれ！」と思って、初期生成されたコードに大量にある ``@Override`` が分からなくて萎えてやめたことがあった。

それがようやく入門書を読んで、``@Override`` の意味がわかったのでメモ。

生成されるのはこういうコード。

```MainActivity.java
package com.example.sample;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}
```

## オーバーライドしているよ、という注釈

「スーパークラスのメソッドをサブクラスで書きなおすこと」を**オーバーライド**という。

ずばり``@Override``とは、「このメソッドはオーバーライドしているよ」という注釈なのだ。

下記のコードでは、``Object`` クラスの``toString``メソッドを``MyCls``クラスでオーバーライドすることを**意図している**。（実際にはスペルミスによりオーバーライドできていない）。

```JaToStr.java
class MyCls {
  String name;
  int count;

  // 意図的なスペルミス
  public String toStrgin() {
    return "MyCls: name=" + name + " count=" + count;
  }
}

class JaToStr {
  public static void main(String[] args) {
    MyCls d = new MyCls();
    d.name = "ABC";
    d.count = 123;
    System.out.println(d);
    // 期待する出力=> MyCls: name=ABC count=123
    // 実際の出力  => MyCls@<ハッシュ値>
  }
}
```

``@Override`` を記述することで、スペルミスや存在しないメソッドをオーバーライドしているという問題がすぐに明らかになる。

上のコードに``@Override`` を追加したものが以下。

```JaToStr.java
class MyCls {
  String name;
  int count;

  // 意図的なスペルミス
  @Override
  public String toStrgin() {
    return "MyCls: name=" + name + " count=" + count;
  }
}

class JaToStr {
  public static void main(String[] args) {
    MyCls d = new MyCls();
    d.name = "ABC";
    d.count = 123;
    System.out.println(d);
  }
}

```

こうすることでコンパイル時にエラーが出力されて便利。

```
$ javac JaToStr.java

JaToStr.java:6: エラー: メソッドはスーパータイプのメソッドをオーバーライドまたは実装しません
  @Override
  ^
エラー1個
```

つまり、``@Override`` が付与されたメソッドは、「これはオーバーライドメソッドです。もしオーバーライドされていなければエラーを出力せよ。開発者さんもそういうことでよろしく。」という意味。書いていないことで、プログラムの動作に悪影響が出るなんてことはない。


## 誰でも書こう

少ない記述量で、コンパイラにとっても開発者にとっても有意となるものなので、誰でも書くべきといえる。

メソッドをオーバーライドする場合は、誰でも書こう。

## 読んだ本

[Amazon.co.jp： 明快入門Java (林晴比古実用マスターシリーズ): 林 晴比古: 本](http://www.amazon.co.jp/%E6%98%8E%E5%BF%AB%E5%85%A5%E9%96%80Java-%E6%9E%97%E6%99%B4%E6%AF%94%E5%8F%A4%E5%AE%9F%E7%94%A8%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E6%9E%97-%E6%99%B4%E6%AF%94%E5%8F%A4/dp/4797372060)

参考にした入門書。``@Override`` についてめちゃくちゃ詳しいとかではないけれど、普通にわかりやすい。
perldocべんりってはなし

# perldocとは

Perlのドキュメントを参照するコマンドです。
たとえば、perldocコマンド自身のドキュメントは以下のコマンドで参照できます。
ぶっちゃけ、Perlの全ては`perldoc`コマンドで知ることが出来ると言っても過言ではないです。
CLIで全て完結するので、マウスを持つと禁断症状が出るよう調教されている方でも安心して利用できます。

```shell-session
perldoc perldoc
```

# Perlのドキュメントを読む

以下のコマンドでPerlのドキュメントが参照できます。

```shell-session
perldoc perl
```

だいたいどんな内容が見れるのか興味がある方はこちら。
http://perldoc.perl.org/perl.html
http://perldoc.jp/docs/perl/5.16.1/perl.pod

# perldoc.jpとは

しれっとperldoc.jpのリンクを滲ませましたがperldocの内容を日本語に翻訳するプロジェクトが存在します。それがperldoc.jpです。
有志の方々の努力により保守・運用されている、大変有難いものです。ドキュメントの原文と共に是非活用してください。
http://perldoc.jp/

## 便利情報

Perl入学式で講師も務めた @xtetsuji さんがChromeで使える便利テクニックを紹介しています。http://post.tetsuji.jp/2014/01/perldoc-jp-shortcut-to-search/
こちらも是非ご活用下さい！

# Perlモジュールのドキュメントを読む

モジュールのドキュメントを読むにはモジュール名をperldocに指定するだけです。簡単ですね！
ただし、perldocはインストール済のモジュールについてしか利用出来ない点をご注意下さい。

```shell-session
perldoc File::Spec
```

# Perlモジュールのソースコードを読む

モジュールのソースコードを読むにはモジュール名をperldocに-mオプションと共に指定するだけです。簡単ですね！

```shell-session
perldoc -m File::Spec
```

# Perlモジュールのファイルパスを知る

モジュールのソースコードのファイルパスを知るにはモジュール名をperldocに-lmオプションと共に指定するだけです。簡単ですね！

```shell-session
perldoc -lm File::Spec
```

# Perlの組み込み関数のドキュメントを読む

Perlの組み込み関数について知るには関数名をperldocに-fオプションと共に指定するだけです。簡単ですね！


```shell-session
perldoc -f print
```

# Perlの特殊変数のドキュメントを読む

Perlには実は特殊変数というものがあります。システムの状態やPerlの設定をGlobal変数として設定出来るものです。
たとえば`local`と組み合わせて、特定のスコープだけで`readline`(`<>`)の区切り文字を変更するなど、ちょっと周りくどい処理が実現できます。
Perlの特殊変数について知るにはperldocに-vオプションと共に指定するだけです。簡単ですね！
あるいは`perldoc perlvar`とすると全ての特殊変数が参照できます。
他人のPerlコードを読んでいるさなか、謎の変数が出現したとき、それは特殊変数かもしれません。是非調べて真相を確かめてみてください。

```shell-session
perldoc -v '$@'
```

# おまけ(`cpandoc`について)

Pod::Cpandocというモジュールをインストールすると`cpandoc`というコマンドが利用出来るようになります。

```shell-session
cpanm Pod::Cpandoc
```

これは、perldocのwrapperになっており、まだインストールされていないperlモジュールについてもドキュメントを参照したり、ソースコードを参照したりすることが出来ます。
とりあえず入れておくとなにかと便利なモジュールです。是非活用しましょう。

# まとめ

perldocとperldoc.jpの紹介でした。
プログラミング言語、あるいはモジュールについて、それらのドキュメント以上に詳細かつ正確な文書は基本的にありません。
Perlを書いていて分からないことがあったときは是非perldocあるいはperldoc.jpを参考にするとより正確な理解が出来る為、おすすめです。
それでも分からなければ、是非[Perl入学式](http://www.perl-entrance.org/)、あるいは[Perl Beginners](http://www.perl-beginners.org/)、あるいは[最寄りの地域PM(Perl Mongers)](http://perl-users.jp/)に足を運んでみてください。きっと、Perlの達人がノウハウと共に理解に役立つ話を惜しみなく教えてくれることでしょう。
なお、来週には[Gotanda.pm #3](http://gotanda-pm.connpass.com/event/10499/)が開催されるようです。私が主催しております。良ければご参加下さい！
SQL Server Management Studio起動高速化

SQL Server Management Studioの起動が遅い場合、

下記の手順で設定をすると速くなります。
<ol>
	<li>SqlWb.exeのリンク先を探す。（[すべてのプログラム]から[SQL Server Management Studio]を
右クリックしてプロパティを開く、[リンク先を探す]）</li>
	<li>SqlWb.exe.configに以下の設定を追加
&nbsp;
&lt;configuration&gt;
  &lt;runtime&gt;
    &lt;generatePublisherEvidence enabled="false"/&gt;
  &lt;/runtime&gt;
&lt;/configuration&gt;
     </li>
</ol>


体感速度も変わるはず。

作業工数も下がると思います。
[blackbird-sqs] Monitoring AWS SQS

この[プラグイン](https://github.com/Vagrants/blackbird-sqs)(githubのURLです)では、CloudWatch APIを使ってSQSのMetricsを取得します。

What metric does this plugin get?
---------------------------------

取得できるMetricsとしては以下のものがあります。カラム名は左から、NameはMetric名、StatisticsはAvgとかSumとか何でStatisticsして値を取得するか、DescriptionはMetricの簡単な説明です。

| Name                                  | Statistics | Description |
|---------------------------------------|------------|-------------|
| NumberOfMessageSent                   | Sum        | Queueに追加されたメッセージの数の合計 |
| SentMessageSize                       | Minimum    | 取得間隔内にQueueに追加されたメッセージのサイズの中で最も小さいもの |
| SentMessageSize                       | Maximum    | 取得間隔内にQueueに追加されたメッセージのサイズの中で最も大きいもの |
| SentMessageSize                       | Average    | 取得間隔内にQueueに追加されたメッセージの平均サイズ |
| SentMessageSize                       | Sum        | 取得間隔内にQueueに追加されたメッセージの合計サイズ |
| NumberOfMessagesReceived              | Sum        | ReceiveMessage APIのcallで取得したメッセージの数 |
| NumberOfEmptyReceives                 | Sum        | ReceiveMessage APIのcallでメッセージを返さなかったcall回数 |
| NumberOfMessagesDeleted               | Sum        | Queueから削除されたメッセージの数 |
| ApproximateNumberOfMessagesDelayed    | Average    | 遅延が発生して、すぐに読み取れないQueueの数 |
| ApproximateNumberOfMessagesVisible    | Average    | Queueから取得可能なメッセージの数。Queue Lengthですね。 |
| ApproximateNumberOfMessagesNotVisible | Average    | 処理中のメッセージの数。取り出されて削除されてないメッセージとかはここにカウントされるます。 |


Zabbix Template
---------------

### Items

Itemsとしては、上のAPIをcallしているだけなので上記の表のみです。

### Triggers

#### Queue Length

ApproximateNumberOfMessagesNotVisibleの値からQueueの長さをみて、Info, Average, Highとそれぞれの閾値に対してAlert投げます。閾値はそれぞれMacroに切り出してあるので、default値に過不足があれば適時調整ですね。

#### Number of Getting Empty Messages

アプリケーションの特性によっては不要かもしれませんが、Queueに何も入ってないことを検知するより、ReceiveMessage APIのCallが空だった回数でアラートをあげています。DBにInsertするときにSQSに対してMessageを投げてConsumerが取り出すようなアーキテクチャーだと溜まりすぎても問題だし、空すぎてもなんかおかしいってことあると思います。

### Graphs

#### Number of Operated Queue

Messageの各オペレーションをグラフ化です。

* 追加されたメッセージの数
* 受け取ったメッセージの数
* 削除されたメッセージの数

をグラフにしてます。

![スクリーンショット_2014-12-08_22_09_20.png](https://qiita-image-store.s3.amazonaws.com/0/26256/caa254e1-c37d-5ec9-2abc-0de8d89bbb22.png)

#### Number of Visible Messages

Queue Lengthのグラフです。

![スクリーンショット_2014-12-08_22_09_45.png](https://qiita-image-store.s3.amazonaws.com/0/26256/ef5ff208-91aa-516f-4235-14485748b5ac.png)

#### Total Message Size

Queueに入っているMessageのTotal Sizeです。

![スクリーンショット_2014-12-08_22_09_58.png](https://qiita-image-store.s3.amazonaws.com/0/26256/594b4995-46fb-e7e4-e4ee-e430f51da09d.png)

#### Size per Message

1MessageあたりのBytesです。

![スクリーンショット_2014-12-08_22_10_15.png](https://qiita-image-store.s3.amazonaws.com/0/26256/aea3a28c-a702-454a-ef7b-8e43ff7cb5fa.png)

----------

Queue Length自体はアプリケーションの特性によっては取得することに意味はないのかもしれませんが、明らかにたまっているとき、明らかに少ない時にいつもとは違う何かが起こっていることには気づけるはずです。そこに気づくだけでも意味はあるかと...
任意のオブジェクトをApexから取得する

#任意のオブジェクトをApexから取得する

チュートリアルなどでは、ApexからsObjectを取得するサンプルが多いのですが、自分で作成したクラスをApexから取得する際にはまったので書きます。

Apexで取得した値を表示するコンポーネント。

```AdventCalendarCmp.cmp
<aura:component controller="TLP.AdventCal">
    <aura:attribute name="childList" type="List"/>
    <div>
	    <aura:iteration var="item" items="{!v.childList}">
    	    <div>{!item.Name}</div>
            <div>{!item.parentName}</div>
	    </aura:iteration>
    </div>
</aura:component>
```

Apexを呼び出すHelperメソッド

```AdventCalendarCmpHelper.js
    getChilds : function(component){
        var act = component.get('c.getAdvanceCalDto');
    
        act.setCallback(this,function(a){
            component.set("v.childList",a.getReturnValue());
        });
	    $A.enqueueAction(act);
    }
```


Apexのクラスを作成する際に、値を取得するメソッドに、AuraEnabledaアノテーションを付けます。
さらに・・・取得するオブジェクトのプロパティにAuraEnabledアノテーションを付けます。
つまりは***AuraEnabledアノテーションをプロパティにもつけましょう***ということでした。
これで任意のクラス形式でをApexから値を取得することができます。

```AdventCal.cls

    @AuraEnabled
    public static List<AdvanceCalDto> getAdvanceCalDto(){
        List<AdvanceCalDto> retList = new List<AdvanceCalDto>();
        for(TLP__ChildObj__c obj :[SELECT Name ,Parent__r.Name FROM TLP__ChildObj__c]){
            retList.add(new AdvanceCalDto(obj.Name,obj.Parent__r.Name));
        }
        return retList;
    }

    public class AdvanceCalDto{
        AdvanceCalDto(String name,String parentName){
            this.name = name;
            this.parentName = parentName;
        }
        @AuraEnabled   //こいつがポイント
        String parentId{get;set;}
        @AuraEnabled   //こいつがポイント
        String name{get;set;}
        @AuraEnabled   //こいつがポイント
        String parentName{get;set;}
    }
```
SECCON CTF 2014 Online Writeup

#Welcome to SECCON
問題文
The answer is "SECCON{20141206}".

----
flagはSECCON{20141206}でした

難しくて1時間もかかってしまった。
2014-12-06 10:01:18: IPFactory: 201 (+100), Welcome to SECCON [Start100]
getUserMedia使ってJSで動くチューナー作った。


少し前に作ったものですが折角の機会なので公開しようと思います。
実験のための実装なのでUIがひどいことになっていますが見逃してください。
ChromeかFirefoxなら動くと思います。

デモ：http://ymmtmdk.github.io/jstuner/
ソース：https://github.com/ymmtmdk/jstuner

少しだけですが、WebRTCに絡む部分で何をしているか説明したいと思います。
getUserMediaを使っている周辺を抜粋します。CoffeeScriptです。
まず初期化の部分から。

```coffee
Meteor.startup ->
  navigator.getUserMedia = navigator.getUserMedia or navigator.webkitGetUserMedia or navigator.mozGetUserMedia or navigator.msGetUserMedia unless navigator.getUserMedia
  window.AudioContext = window.webkitAudioContext unless window.AudioContext

  if navigator.getUserMedia and window.AudioContext
    navigator.getUserMedia
      audio: true
    ,connectRecorder, -> alert "error capturing audio."
  else
    alert "not supported in this browser."
    return

  canvas = document.getElementById("wave")
  canvasContext = canvas.getContext("2d")
```

Meteor.startupとなっているのは気にしないでください。onloadのようなものと思っていただければ。
このstartupでやっているのはブラウザ間の差異を吸収した上でconnectRecorder関数をコールバックにgetUserMediaを呼ぶだけです。この辺りは先日までのWebRTCカレンダーで書かれていますので是非読んでください。

次のconnectRecorderがこの記事におけるメインです。

```coffee
connectRecorder = (stream) ->
  audioContext = new AudioContext()

  hzElement = document.getElementById("hz")
  noteElement = document.getElementById("note")

  bufferSize = 2048
  recorder = audioContext.createScriptProcessor(bufferSize, 2, 2)
  recorder.onaudioprocess = (e) ->
    left = e.inputBuffer.getChannelData(0)
    drawWave(left)
    hz = Pitcher.pitch(left, audioContext.sampleRate)
    return unless hz >= 30
    note = new Note(hz)
    hzElement.innerHTML = 'hz = ' + hz
    noteElement.innerHTML = 'note = ' + note.name()

  # connect the recorder
  input = audioContext.createMediaStreamSource(stream)
  input.connect recorder
  recorder.connect audioContext.destination
```


まずWeb Audio APIの司令塔たるAudioContextを用意します。
次にチューナーの処理を担当するノードをaudioContext.createScriptProcessorで作り出します。
ここではrecorderと名づけているこのノードのonaudioprocessハンドラーにチューナー処理を登録します。
このハンドラーがバッファーが貯まるたびに呼ばれ、音程を算出するわけです。

次にaudioContext.createMediaStreamSource(stream)として入力ノードを取り出します。
この入力ノードにさきほどのrecorderノードを接続します。
さらにrecorderノードにaudioContext.destinationノードを接続して完成です。

``入力ノード　> チューナーノード　> 出力ノード``

この様にWeb Audio APIでは各役割をこなすノードを作って、それを接続する、という手順でプログラムが構成されます。ここに出た以外に色々なノードが用意されてますの詳しくはリファレンスを御覧ください。

以上、なんとも雑な説明ではありますが、割と簡単に音が扱えるのねと思われたなら幸いです。


Web Audio API (日本語訳)：http://g200kg.github.io/web-audio-api-ja/#ModularRouting
Web Audio API：http://www.w3.org/TR/webaudio/
SDWebImage や AFNetworking でも使われている、Category でもプロパティを持つ方法

Why?
---

既存のクラスでのカテゴリで様々な処理を実装したり、大きい実装をカテゴリで分割したいときがあります。前者は特に UIKit を拡張することが多いかと思います。

しかし、カテゴリではプロパティを持てません。
このような場合に、プロパティの保持が必要な処理を実装したいときどうするか。

半分黒魔術で、カテゴリでもプロパティを保持する方法があります。

ちなみに SDWebImage や AFNetworking では `UIImageView` と画像を取得する Operation を関連づける為に使っています。
`- setImageWithURL:` 等使ったことがあれば、この黒魔術で支えられた実装は、日常的に経験していると思います。（なので敬遠するは必要なく、設計上合理的であれば使えるものは使うと良いと思います。）

How
---

`objc/runtime.h` の `objc_setAssociatedObject`, `objc_getAssociatedObject` を使います。
詳細はさておき、このメソッドを使えば Key-Value で好きなオブジェクトにオブジェクトを保持させることが出来ます。

使い方は簡単で、カテゴリで `@property` で普通に宣言し、Getter / Setter の実装をこれらのメソッドを使って書き換えます。

次のように、実装するカテゴリと同じファイルにプロパティ保持用のカテゴリを別に作るのがオススメです。

```objc
#import <objc/runtime.h>

# pragma mark - Category for Retaining Properties

@interface UIImage (SomeCategoryProperty)

@property (nonatomic, strong) NSString *sc_someProperty;

@end

@implementation UIImage (SomeCategoryProperty)

- (NSString *)sc_someProperty {
    return objc_getAssociatedObject(self, @selector(sc_someProperty)); // #1
}

- (void)setSc_someProperty:(NSString *)sc_someProperty {
    objc_setAssociatedObject(self, @selector(sc_someProperty), sc_someProperty, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

@end

# pragma mark - Category Implementation

@interface UIImage (SomeCategory)

@end

@implementation UIImage (SomeCategory)

// ここで self.sc_someProperty を使うことが出来ます。

@end
```

多少実装部が複雑に見えますがテンプレです。`dispatch_once` でのシングルトン実装のようなものだと思いましょう。

Advantages?
---

1. UIKit での少々複雑な拡張でも、サブクラスではなくカテゴリで出来る (#2)
2. 多少大きいクラスを実装する際、関連するメソッドをまとめたカテゴリ群で実装を構成する場合があります。この際に大活躍。 (#3)

所詮テクニックなので大きく何かに寄与するということはありません。好みです。

Disadvantage としては、`@selector()` はリファクタリングが効かないので `@property` をリファクタリングした際に見落とす可能性があります。
単純なテストを書いておけばこれは発見可能です。

#### 補遺

- #1 第二引数は `@selector(propertyKey)` で指定すると補完も効くし、ついでに Getter / Setter の宣言もしてくれるしでおすすめです。
- #2 UIKit で例えば「○○ なラベル」を作る際に安易にサブクラス化するのは、一般的に、拡張性を考えると避けた方が良いです。（○○ で △△ なラベル…と拡張していくときに困る。）カテゴリで済むものはカテゴリにした方が良い。詳細は [iOS UI Component API Design](http://modocache.svbtle.com/ios-ui-component-api-design) を参照してください。 
- #3 クラスを Core 実装 + 複数個のカテゴリで実装すると、1.`#import` でメソッドの依存関係が明白になる 2.プロパティのスコープを狭められる（原則同一カテゴリ内のみ）といった利点があります。

参考 URL
---

- iOS UI Component API Design : http://modocache.svbtle.com/ios-ui-component-api-design
- AFNetworking/UIImageView+AFNetworking.m at master · AFNetworking/AFNetworking : https://github.com/AFNetworking/AFNetworking/blob/master/UIKit%2BAFNetworking/UIImageView%2BAFNetworking.m
- SDWebImage/UIImageView+WebCache.m at master · rs/SDWebImage : https://github.com/rs/SDWebImage/blob/master/SDWebImage/UIImageView%2BWebCache.m
Reference Set とは何だったのか

# Referene Set とは何だったのか
この記事は [HTTP2 Advent Calendar](http://qiita.com/advent-calendar/2014/http2) の 8 日目の投稿です。

この記事では、議論の過程で **仕様から外された技術** にフォーカスをあてて、「どういう技術だったのか」と「なぜ仕様から外されたのか」をお伝えします。

間違い等がございましたら、遠慮無くご指摘お願いします。

## HPACK と失われし Reference Set
HTTP ヘッダの圧縮仕様は HPACK と呼ばれています。
現在の HPACK 仕様では 3 つの方法でヘッダをエンコードします。

1. Literal
    - 単なる ASCII エンコード
2. Huffman Encode
    - 出現頻度の高い文字をより小さいサイズで表現
    - 詳しくは 12/16 の Advent Calendar で解説する予定です
3. Index
    - HTTP ヘッダの key, value を番号で指定する

かつては、上記 3 つに加えて **Reference Set** という機構が存在していました。
今回の主役は、この Reference Set です。

## Reference Set の目的と概要
HTTP/1.1 以前の仕様では、ヘッダの内容に変更が有っても無くても、全てのヘッダを毎回送信しないといけません。

これに対して、Reference Set はヘッダの**「差分情報のみ」を送る**ための仕様です。
具体的には、ヘッダフィールドの追加と削除情報をやり取りします。

では、例を挙げてイメージをつけましょう。
ある時点のリクエストヘッダが「X-Hoge: 1 と X-Fuga: 2」だったとします。
次は「X-Hoge: 1 と X-Piyo: 3」というヘッダとしてリクエストしたいときに、やり取りする内容を表にまとめました。

N 回目    | N + 1 回目    | 差分     | Reference Set 処理
--------- | --------- | ------------| ---
X-Hoge: 1 | X-Hoge: 1 | 無し        | 何も送信しない
X-Fuga: 2 |           | - X-Fuga: 2 | 削除指示を送信
          | X-Piyo: 3 | + X-Piyo: 3 | 追加指示を送信

この仕様を導入すると、下記のような変更されないヘッダを送信しなくてよいので、通信データを削減できます。

```
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:34.0) Gecko/20100101 Firefox/34.0
Referer: https://example.com/
```

また、認証情報は最初 1 回だけ送信すればよいので、セキュリティリスクを低減できる場合があります。

```
Cookie: authkey=xxxxxxxxxx; sessionid=xxxxxxxxxx
```

## Reference Set に転機が訪れる
導入のメリットがあるにも関わらず、なぜ仕様から外れることになったのでしょうか。それには 2 つの要因があったと思います。

### 1. データ圧縮への寄与
冒頭で触れた通り、HPACK には *Index* というエンコード方法があります。
これは、ヘッダの key, value をインデックス (数字) で指定できる機構でした。

もし HPACK に *Index* 機構が存在しなかったら、Reference Set はまだ仕様に残っていたかもしれません。

というのも、一度インデックスすれば、以降はインデックスの数値を送信すればよく、そのサイズはわずか数バイトです。「Reference Set と Index を**両方使った場合**」と 「Index のみを使った場合」でデータサイズを比較しても、ヘッダフィールド 1 個あたりわずか数バイトの違いしかありません。

この定量的な評価は @kazu_yamamoto さんが行い、[W3C の ML で指摘](http://lists.w3.org/Archives/Public/ietf-http-wg/2014JulSep/1650.html) されました。
詳細な資料は [こちら](http://www.mew.org/~kazu/material/2014-hpack.pdf) をご覧ください。
具体値として、HEADERS フレーム 1 つにつき 1.57 バイトしか小さくならないという測定結果を提示されています。

### 2. 差分計算の複雑さ
Reference Set が外されたもう 1 つの大きな要因は、差分計算が必要となり実装が複雑になる点です。
サーバ側は、HTTP リクエストを受け取る度に「ヘッダの変更情報」と「既存の全てのヘッダの key, value」を比較し、差分を更新しないといけません。
当然、クライアント単位で独立して管理・保持する必要がありますし、クライアント側でもアクティブなヘッダの一覧をサーバと一致させ続けないといけません。

## そして、仕様が動いた
Reference Set を仕様から外せば、
- 差分計算・保持に起因するバグの心配がなくなる
- ヘッダの順序が常に保持されるため、実装がシンプルになる
- 一方で、デメリットである圧縮率の劣化がごくわずかである

そういった議論により、[HPACK-09 の仕様では Reference Set が削除](http://tools.ietf.org/html/draft-ietf-httpbis-header-compression-09#appendix-A) されることになりました。

## まとめ
この一件は、HTTP2 の仕様がパブリックに議論・策定されていることを強く実感させるものでした。

これから HTTP2 の実装を始めたり、仕様を読み始めたりされる方にとって、この記事の情報は不要かもしれません。

それでも、HTTP2 のトリビアの 1 つとして、また、Reference Set の実装に多くの人が四苦八苦した記録として、この記事を投稿したいと思います。

## 余談
*現在の仕様における正しい名称は HTTP2.0 ではなく "HTTP/2" もしくは "HTTP2" です。*
Robolectricのテストケースでassetsからファイルを読み込む


assetsからテスト用のJSONデータ読み込もうとして上手くいかず苦労した。
読み込むコードは↓のような感じ。

```java
package com.example.horie1024.test;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;

import java.io.InputStream;
import static org.junit.Assert.assertNotNull;

@org.robolectric.annotation.Config(emulateSdk = 18)
@RunWith(RobolectricTestRunner.class)
public class HogeTest {

    @Test
    public void readAssets() throws IOException {
        InputStream is = Robolectric.application.getAssets().open("test.json");
        assertNotNull(is);
    }
}
```

このコードの場合build/intermediates/bundles/debug以下のassetsを見に行ってしまっていた。
解決方法を探すと、RobolectricTestRunner.classを継承してassetsのpathを指定する方法があったので試してみる。

RobolectricTestRunner.classを継承してgetAppManifestをOverrideし、System.setPropertyでandroid.assetsのパスを指定する。

```java
package com.example.horie1024.test;

import org.junit.runners.model.InitializationError;
import org.robolectric.AndroidManifest;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;

public class MyTestRunner extends RobolectricTestRunner {

    public MyTestRunner(Class<?> testClass) throws InitializationError {
        super(testClass);
    }

    @Override
    protected AndroidManifest getAppManifest(Config config) {

        System.setProperty("android.assets", "./src/androidTest/assets");
        return super.getAppManifest(config);
    }
}

```

テストランナーを置き換える。

```java
package com.example.horie1024.test;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;

import java.io.InputStream;
import static org.junit.Assert.assertNotNull;

@org.robolectric.annotation.Config(emulateSdk = 18)
@RunWith(MyTestRunner.class)
public class HogeTest {

    @Test
    public void readAssets() throws IOException {
        InputStream is = Robolectric.application.getAssets().open("test.json");
        assertNotNull(is);
    }
}
```
これで上手く読み込めた。


# 参考
* http://stackoverflow.com/questions/26804651/how-to-access-files-from-assets-folder-during-tests-execution
Glass.cpp


原文はこちら
http://www.asahi-net.or.jp/~yf8k-kbys/newcpp8.html

引数なし、引数付き、コンストラクタを作ってみましょう。

```cpp:Glass.cpp
//Glass.cpp
#include <iostream>
using namespace std;

class Glass
{
    int vol;                 //water vol
public:
    //construct
    Glass() : vol(10){}      //no args
    Glass(int x) : vol(x){}  //with args
    void waterout(int);          //void
};

void Glass::waterout(int x){
    if(vol - x >= 0){
        vol -= x;
        cout<< "Bushaa!!" << endl;
        cout<< "Here is " << vol << "." <<endl;
    }
    else{
        cout<< "No satch. water." <<endl;
        cout<< "Here is only" << vol << "." <<endl;
    }
}

int main()
{
    int x;
    cout << "Create glass object vol=10(No args)." << endl;
    Glass glass;        //called no args.
                        //so galass.vol = 10.
    cout << "Please input!" <<endl;
    cin >> x;           //input to x from cin. 
    glass.waterout(x);

    cout << "Create glass2 object vol=20(With args)." << endl;
    Glass glass2(20);    //called with args(20).
                         //so glass.vol = 20.
    cout << "Please input!" <<endl;
    cin >> x;            //input to x from cin.
    glass2.waterout(x);
    cout<<"End"<<endl;
}


```

コンパイルコマンド

```g++:Glass
g++ -o Glass Glass.cpp
```

実行

```From Terminal
./Glass
```
Selenium WebDriver の ElementNotVisible Error について


この記事はSelenium/Appium Advent Calendar 2014の8日目の記事です。ネタを考えねばといいつつ何も考えてなかったので、小ネタになりました。

## Selenium WebDriverによる要素の取得

Selenium WebDriverは、JSON Wire Protocolを介して、表示されている要素の取得や、操作を行うことができます。

表示されている要素の取得は、
[/session/:sessionId/element](https://code.google.com/p/selenium/wiki/JsonWireProtocol#/session/:sessionId/element)や[/session/:sessionId/elements](https://code.google.com/p/selenium/wiki/JsonWireProtocol#/session/:sessionId/elements)に対してPOSTすることで、POSTした条件に当てはまる要素のidが取得できます。elementとなっている方は、当てはまる最初の要素を、elementsは全部を配列として返してきます。
このidは、html上のidとは関係なく、Selenium Serverが内部の管理用に割り当てたものとなります。

また、当てはまるものがなければ、elementはNoSuchElementというエラーを返し、elementsは空の配列を返します。

## 要素に対する操作

取得した要素に対して操作は、たとえばclickでしたら、[/session/:sessionId/element/:id/click](https://code.google.com/p/selenium/wiki/JsonWireProtocol#/session/:sessionId/element/:id/click)にPOSTをすることでできます。この`:id`は先ほどの要素の取得で取得した`id`を指定します。

このように、一般的なSelenium WebDriverによるブラウザの操作は、要素を検索し、そのidを取得し、そのidに対して何か操作をするようになっています。

## ElementNotVisible エラー

しかし、この要素に対して操作した場合に、ElementNotVisibleエラーが出ることがあります。これが本エントリーの本題です。

ElementNotVisible は文字通り、HTML上にはElementが存在するのだが、ユーザに見えるような状態になっていないので、そんな操作ユーザできないよ！というように、Selenium Serverがその要素に対する操作をブロックするために生じるエラーです。

なら、そもそも取得する際に、visibleでない要素は除外して欲しいとも思うのですが、そうするともろもろ不便な感じもします。

テスト内で、要素がいくつ表示されているというようなassertionを書く時には、かならずその要素がvisibleであるかということをきちんとチェックしておく必要があります。

visible かどうかは、[/session/:sessionId/element/:id/displayed](https://code.google.com/p/selenium/wiki/JsonWireProtocol#/session/:sessionId/element/:id/displayed) によって取得することができます。

## visible になる条件

さて、要素がvisibleになるならないはどのような条件でそれが判定されるのでしょうか？
一般的な場合、あまりvisibleとならなかった原因を追う必要はなく、「○○が表示されない」というようなバグチケットを切るだけでよいとは思います。ですが、一見表示されているように見えるんだけど ElementNotVisible エラーになる場合とか、特にファイルアップロードをサポートするようなJSライブラリが内部的にもっている要素に対して無理やり操作を行なってファイルアップロードしたい（細かすぎるw）というような場合がたまにあるので知っていて損はないと思います。

先ほどのJSON Wire Protocolの仕様のElementNotVisibleでは、

>  If the referenced element is not visible on the page (either is hidden by CSS, has 0-width, or has 0-height)

と単純に書いてあるのですが、JSON Wire Protocolをちゃんと整形した[WebDriver APIの仕様](https://dvcs.w3.org/hg/webdriver/raw-file/default/webdriver-spec.html#determining-if-displayed)としては、もうちょっと細かく書いてあります。

各htmlタグそれぞれに関して細かいことはありますが、簡単に要約するとたいてい以下のどれかに該当するような場合にvisibleではないと判定されます。

* 表示位置が、負の値になっている場合
* css的に、hiddenやdisplay:none になっている場合
* width や height が 0より大きくない場合

これは、[現在の実装](https://code.google.com/p/selenium/source/browse/javascript/atoms/dom.js#544)をコードとして読んだ方が、逆にどういうのかわかりやすかったりするかもしれないですね。

## まとめ

基本的に、ユーザの操作を自動化するようなテスト等においては、visibleかどうかを気にする必要はないのですが、たまに必要になることはあります。その際何がどうだからvisibleではないのかということを特定すると、何が間違っているかというような対応も素早くなります。

それでは楽しいSeleniumライフを。

明日は @isaac-otao さんです。
Amazon KinesisのデータをTailするユーティリティ


これは個人の意見/メモであり、所属する組織を代表するものではありません。

## これは何？

最近[Amazon Kinesis](http://aws.amazon.com/jp/kinesis/)を使っていろいろ開発することがある。その際、レコードを流し込んだはじから、確認のためにTailしたいというケースがよくあるので自分メモとしてスニペットにした。指定したストリームのすべてのシャードのレコードをTailしてくれるツール。みんなやってると思うんだけど、自分でも3回くらい書いてしまってアレなのでQiitaに投稿しとく。

JSである必要は全然ないんだけど、ちょうどnode.jsのコードを書いている時だったのでJSで書いた。

## Usage

```
$ node kinesis_getter.js [REGION] [STREAM_NAME] [STRATEGY]
```

REGION: us-east-1とかap-northeast-1とか
STREAM_NAME: stream名
STRATEGY: TRIM_HORIZON or LATEST (DefaultでLATEST)

## Output

```
ShardID, PartitionKey, SequenceNumber, Data
shardId-000000000002, zhfddlqahmqbtccwbrkaibilwtjadidddkuo, 49545830252860334642300441320662317302669106337672069138, TestString-71
shardId-000000000002, oleerhraymybmeuhrrlmwezrxzeglixumbye, 49545830252860334642300441320665944080127950225196187666, TestString-85
shardId-000000000002, gadbbwpuddmjdioqcxrequvjodymlsqsepth, 49545830252860334642300441320669570857586794112720306194, TestString-94
shardId-000000000002, ezbwgwpfvtapwsezoixtkwsctylxleqcbncb, 49545830252860334642300441320675615486684867327313313810, TestString-90
shardId-000000000002, dbaxygsvyludzdpaoodorczsdzrswrelxvag, 49545830252860334642300441320692540448159472135759200274, TestString-69
```

## コード

```javascript:kinesis_getter.js
var aws = require('aws-sdk');

var region = process.argv[2]
var stream = process.argv[3];
var strategy = process.argv[4] || 'LATEST';
var kinesis = new aws.Kinesis({region:region});

kinesis.describeStream({StreamName:stream},function(err,result){
   var shards = result.StreamDescription.Shards;
   console.log(shards);
   for(var i = 0; i < shards.length; i++){
       var shardId = shards[i].ShardId;
       var params = {
         ShardId: shardId,
         ShardIteratorType: strategy,
         StreamName: stream
       };
       kinesis.getShardIterator(params,function(err,result){
          if(err) console.log(err);
          else getRecords(kinesis,shardId,result.ShardIterator);
       });
   }
});

function getRecords(kinesis,shardId,shardIterator){
    kinesis.getRecords({ShardIterator: shardIterator, Limit: 10000},function(err,result){
        if(err) console.log(err);
        else {
            if(result.Records.length){
                for(var i = 0; i < result.Records.length; i++){
                    r = result.Records[i];
                    console.log(shardId + ', ' + r.PartitionKey + ', ' + r.SequenceNumber + ', ' + r.Data);
                }
            }
            setTimeout(function() {
                getRecords(kinesis, shardId, result.NextShardIterator);
            },0);
        }
    })
}


```
ardrone 2.0.1 sdk on Linux 事始め

ちょっとしたきっかけがあって、ardrone 2.0を始めました。parrot社のドローンです。

ardrone 1.0, ardrone 2.0 と世代があり、ardrone 3.0 世代は bibop, rolling spider, jumping sumo と展開するようです。

sdk が出ていて、ardrone 1.0, ardrone 2.0 は [ardrone 2.0.1 sdk](https://projects.ardrone.org/projects/show/ardrone-api) で対応、第三世代は github で公開されている [ARDroneSDK3](https://github.com/ARDroneSDK3) を使うということのようです。ardrone 2.0.1 は ardrone 1.x sdk のサブプロジェクトとして公開されているので、探すときに注意します。

Fedora 20 を使っていて、次のパッケージを追加で入れていくことになりました。ccache が入っていると toolchain が混乱するようだったので、一旦抜きました。

```
# yum erase ccache
# yum install glib2-devel gtk+-devel gtk2-devel systemd-devel libxml2-devel wireless-tools-devel ncurses-devel
```

ardrone 2.0 なので、ardrone 2.0.1 sdk を取得し展開して、パッチを当てます。

```diff
diff --git a/Examples/Linux/Navigation/Build/Makefile b/Examples/Linux/Navigation/Build/Makefile
index a0c8782..7d6e7f5 100644
--- a/Examples/Linux/Navigation/Build/Makefile
+++ b/Examples/Linux/Navigation/Build/Makefile
@@ -128,7 +128,7 @@ endif

 GENERIC_LIB_PATHS=-L$(GENERIC_TARGET_BINARIES_DIR)
 GENERIC_CFLAGS+=-DLIBUDEV_I_KNOW_THE_API_IS_SUBJECT_TO_CHANGE
-GENERIC_LIBS+=-liw -lpc_ardrone -lgthread-2.0 -lgtk-x11-2.0 -lrt -lxml2 -ludev -lswscale -lSDL
+GENERIC_LIBS+=-lm -liw -lpc_ardrone -lgthread-2.0 -lgtk-x11-2.0 -lrt -lxml2 -ludev -lswscale -lSDL

 #ifeq ($(USE_ARDRONE_VISION),yes)
 #   GENERIC_LIBS+=-lpc_vision
diff --git a/Examples/Linux/video_demo/Build/Makefile b/Examples/Linux/video_demo/Build/Makefile
index 063a1c3..43afe93 100644
--- a/Examples/Linux/video_demo/Build/Makefile
+++ b/Examples/Linux/video_demo/Build/Makefile
@@ -44,7 +44,7 @@ GENERIC_BINARIES_SOURCE_ENTRYPOINTS+=                 \
 GENERIC_INCLUDES:=$(addprefix -I,$(GENERIC_INCLUDES))

 GENERIC_LIB_PATHS=-L$(GENERIC_TARGET_BINARIES_DIR)
-GENERIC_LIBS=-lpc_ardrone -lrt -lgtk-x11-2.0 -lcairo
+GENERIC_LIBS=-lpc_ardrone -lm -lrt -lgobject-2.0 -lgtk-x11-2.0 -lgdk-x11-2.0 -lcairo


 SDK_FLAGS+="USE_APP=yes"
```

ビルドします。

```
cd Examples/Linux && make
```

実行ファイルは `Examples/Linux/Build/Release` の下にできています。`ardrone_navigation` が最も高機能。wifi で ardrone2_xxxx に接続してからプログラムを実行します。

`ardrone.xml` というファイルが操作用の joystick の設定ファイルになっています。が、使うのは結構苦労しました。ソースを読んでみても、どうしたいのかイマイチ判然としなかったのです。

keyboard というエントリは結局これは stdin からの入力を受け付けるようになっています。device@id は 0 のままで ok です。

それ以外のものは、Linux joystick として直接サポートされるものであれば、動作する雰囲気です。具体的には udev 経由で idVendor, idProduct が取得できないと動作しません。

困ったのは手元にある xbox controller なのですが、これは `xboxdrv` でソフトウェア実装されています。これは `stdin` から流し込むと対応できるようで、ちょっと強引ですが次のようにしました。

```
stdbuf -i0 -o0 -e0 cat /dev/input/js0 | stdbuf -i0 -o0 -e0 ./ardrone_navigation
```

joystick event message が流れ込むようにするのがポイントです。
Treasure Dataで実行中のjobを監視する

こんにちは、こちらはTreasure Data Advent Calendar 9日目の記事です。
今回は、TDを利用する際に行っている簡単な監視について紹介いたします。

# 背景
SQLに慣れているエンジニア以外の人たちにもTDの利用を解放すると、どうしても効率的でないクエリが投げられてしまうことがあります。そうしたクエリがたくさん投げられてしまうと、計算リソースを消費してしまいTDとはいえジョブの実行が滞ってしまうことがあります。そうなるとログを集計したいと考えている人たちの作業が滞ってしまいます。そのため、TD上で現在実行中のジョブの監視をしています。

以下では、具体的な監視内容を紹介いたします。

# 全体的なジョブ数の監視
どのくらいジョブが実行されているかざっくりと知るために、10分置きに現在実行中のジョブ数を表示しています。スクリプトで実行して集計はしていますが意味合い的には

```
td job:list -R NUM
```
を行っています。
![td_job_graph_upload.png](https://qiita-image-store.s3.amazonaws.com/0/34421/3819ea5b-6b1b-0f77-ccd8-65599229d3df.png)

`td job:list -R NUM`は、`running`(実行中)状態のジョブ以外に、`queued`(実行待ち)状態のジョブ数も取得できます。上のグラフでは緑色の部分が実行中のジョブ数、水色の部分がqueued状態のジョブ数を表しています。

他にも、取得したジョブの情報からクエリをパースして、`v['hoge']`というフレーズを使っているクエリ数も表示するようにしています。`v['hoge']`に関しては、[こちら](http://docs.treasuredata.com/articles/schema#default-schema-time-and-v)にあるようにスキーマを貼っていない要素に対してアクセスするために利用するものですが、`v`を利用した場合とてもクエリが重くなってしまいます。こうしたクエリが投げられているのを見つけ、スキーマを利用したクエリに書きかえるようにアナウンスし注意を促しています。

また、深夜に大量に走っているバッチが朝のうちににあらかた終わっているのを確認するのにも利用しています。

# queued状態なジョブ数の監視
深夜のバッチのジョブが`queued`状態になってしまうのは仕方ありませんが、日中に詰まってしまうとサービスのチームがログの集計をすることができなくなってしまうので、日中に`queued`状態なジョブが無いかも監視しています。日中はhourlyで動いているバッチ以外では、アドホックなクエリが多く投げられる時間です。アドホックなクエリは扱うデータ量も少なく、日中にジョブが`queued`状態になることはほとんどないのですが、

1. 誤ってアクセスログを全て舐めてしまうようなクエリを投げてしまった
2. スクリプトなどでクエリを誤って大量投入してしまった
3. 反応がすぐ返ってこなかったので同じクエリを何度も投げてしまった

などが原因で詰まってしまうことがあり、prestoが利用できるようになってからはprestoのジョブが`3.`が原因で詰まることが増えました。「presto = 速い」という印象からでしょうか。（実際とても早く助かっております :)）

もし、`queued`状態なジョブがいくつか見つかった場合にはチャットに連絡が入るようにしています。
![td_job_queued.png](https://qiita-image-store.s3.amazonaws.com/0/34421/43dfc44c-e225-ef44-3f82-4eb49ad6894a.png)

# 長時間running状態なジョブの監視
誤ってテーブルを全て舐めるクエリや、それをJOINするクエリを投げてしまい、1日以上走っているジョブがいたことがあったので監視するようにしました。深夜のバッチは数時間は当たり前なので、こちらも日中のみ監視するようにしています。

こちらも設定した時間以上`running`状態なジョブが見つかった場合にはチャットに連絡が入るようにしています。
![td_job_slow.png](https://qiita-image-store.s3.amazonaws.com/0/34421/66ff9311-d2c4-e3f0-7c2a-0d28eda451fd.png)

長時間running状態なジョブの監視については、日中以外にも情報を収集し実行時間が長いジョブをリストアップしています。多くの場合、time indexが効いていないことや巨大なテーブルのJOINなどが原因ですので、修正方法のアナウンス等をしています。

# まとめ
TD上で実行中のジョブ数や、ジョブの実行時間の監視について紹介しました。アドホックなクエリの異常は、実際に異常なのか意図して長いクエリを投げているのかは利用者側が確認しないとわからないものなので、非常に簡単な項目ではありますが監視をしています。私達のチームとしては、サービスのチームより先に異常を検出しこちらから問い合わせられるようにしています。

多くの場合投げたクエリが原因なので、検出後はクエリの改善方法を添えて連絡しています。ちょっとした工夫として、TDへクエリを投げるとコメントとしてユーザ名がクエリの先頭につくようにしてあり、誰が投げたのか追いやすくしています。また、スクリプトや他のツールから投げている場合も同様にツール名などをコメントとしてつけるように依頼しています。


以上、9日目の記事でした！
Windows Server 2008R2以降、Windows7高速化（SNP無効）

Windows Server 2008R2以降、Windows7以降 を使用する前に絶対やるべき設定です。

コマンドプロンプトより下記の手順を実施。

// 現在の設定を確認
<code>netsh int tcp show global</code>


// RSS無効化
<code>netsh int tcp set global rss=disabled</code>

// NetDMA無効化
<code>netsh int tcp set global netdma=disabled</code>

// Chimneyオフロード無効化
<code>netsh int tcp set global chimney=disabled</code>

// 受信ウィンドウ自動チューニング無効化
<code>netsh int tcp set global autotuninglevel=disabled</code>

// 設定変更を確認
<code>netsh int tcp show global</code>

※Service再起動等は不要で反映されます。


Receive-Side Scaling 状態
Chimney オフロード状態
NetDMA 状態
この3つを disabled にする事は数々のサイトで紹介されているが、
これだけではダメです！

受信ウィンドウ自動チューニング レベル

これも無効化した方が良く、デフォルトではダメです。

特にWindows2008R2にリモデすると遅い！カクカクする！というお悩みを抱えている方、
環境によっては体感できるくらいスムーズになりますよ。

上記のコマンドで何も変わらない場合、H/W側の設定も確認してみて下さい！
ローカルエリア接続 → プロパティ → 構成 → 詳細設定 [Receive Side Scaling(RSS)の無効化]
LANドライバによっては Receive Side Scaling(RSS) ＝ 受信側スケーリング という表記の場合があります。


しかしMicrosoftは何でこんなイケてない設定をデフォルトにするんだか。。。

まぁ、言い出したら切りがないか。。。
coffeescriptでbrowserify使ってClassを定義する

パニックになってハマったのでメモ

## Class 定義とExport
```coffeescript:greeting.coffee
# Greeting Classを定義
class Greeting

  name_ = null

  constructor: (name)->
    name_ = name

  makeMessage = (message)->
    return "#{message}, #{name_}!"

  say: (message)->
    message_ = message
    console.log makeMessage.call @, message

# Classをexportsするとbrowserifyでrequireできる
module.exports = Greeting
```
## 呼び出し方
```coffeescript:main.coffee
Greeting = require './greeting.coffee'
greeting = new Greeting "World"
greeting.say 'Hello' # Hello, World
greeting.say 'ByeBye' # ByeBye, World
```

### あれこれ
Class定義
``` class ClassName```

publicメソッド
```public_func: () ->```

privateメソッド
```private_func = () ->```

public 変数
```@public_var = "public_var"```
or
```public_var2: "public_var2"``` 

private 変数
```private_var = "private_var"```
zshのコマンドラインを任意のテキストエディタで編集する

zshでは現在のコマンドラインを任意のテキストエディタで編集できるので紹介する。

## 設定
次の設定を.zshrcに書いておく。

```zsh
autoload -Uz edit-command-line
zle -N edit-command-line
bindkey '^xe' edit-command-line
```

最後の`^xe`のところは僕が使っている例で、好きなように変えてOK。

## 使い方
さっきの例の設定の場合、`^xe`(Ctrl+xのあとにCtrlを離してe)でエディタが起動する。起動したエディタで実行したいコマンドを書いて保存、終了、で元のコマンドラインに戻る。後は普通にEnterを押すと実行される。

![zsh_editor_1.png](https://qiita-image-store.s3.amazonaws.com/0/204/f7138cf9-f3b7-f024-a3f0-8cbbbbed173a.png)

複数行のコマンドを実行したいときもそのままエディタで書ける。

![zsh_editor_2.png](https://qiita-image-store.s3.amazonaws.com/0/204/beca4294-8d4c-052e-31dc-a2dce35ad2d8.png)

もちろん、コマンドラインに途中まで入力済みの状態で起動すると、その内容が始めから入った状態でエディタが起動する。編集をキャンセルして元の状態に戻りたいときは、保存せずにエディタを終了する。

起動するエディタは環境変数EDITORで指定したコマンドなので、あらかじめ好きなエディタを設定しておこう。

```zsh
EDITOR='vim'
# または
EDITOR='emacs -nw'
```

ちょっと複雑なコマンドを実行するときに、あらかじめテキストファイルにコマンドを書いてそれをシェルに貼り付けて、ということをやってる人もいるかもしれない。そういうときにこの機能を使うと、さっと普段使っているエディタで編集できて便利なので、ぜひ使ってみてください!
【iOS】SwiftでiQONとかGoogle+ぽいスライドメニューライブラリつくったよ

Swiftで**iQON / Google+/ GoogleMap/ Feedly**風のスライドメニューライブラリを作りました。
    
  

![SlideMenuControllerSwift.gif](https://qiita-image-store.s3.amazonaws.com/0/48971/7421e3db-07da-5bc8-152a-4b00ee596dc6.gif)
  
  
  
   
サイドから被さるように表示するメニューです。
iOS/Androidとも下に隠れているメニューが多いですが、
最近は上に被さるUIもちょくちょく見かけるようになってきました。  
  
  
個人的にはこの被さるメニューのUIの方が好きなので、
こっちのライブラリをつくりました。  
  
  
[dekatotoro/SlideMenuControllerSwift · GitHub](https://github.com/dekatotoro/SlideMenuControllerSwift)
  
 
まだとりあえず動くようにしたレベルなので
ぜひFeedBackお願いしますm(- -)m
Windows Server 2003 タスクスケジューラー移行

&nbsp;
2015年7月15日（日本時間）にマイクロソフト社が提供しているOS
Windows Server 2003 のサポートが終了します。
&nbsp;
Windows Server 2008R2、Windows Server 2012R2へのサーバーリプレイスを行う際、
タスクスケジューラーの移行でお悩みの方は参考にして下さい。
(Windows 2008R2にも適用出来ます)
&nbsp;
<strong>1．Windows Server 2003 にてタスクリストを作成</strong>
コマンドプロンプトから C:\WINDOWS\Tasks に格納されている .job のリストを作成
&nbsp;
<code>cd C:\WINDOWS\Tasks</code>
&nbsp;
<code>dir /w &gt; [出力先ファイル名]</code> 　← ジョブファイル名のみの一覧が出力される
&nbsp;
<strong>2．Windows Server 2012R2 からタスクのエキスポートを行う</strong>
Windows Server 2003ではXML形式でジョブのエキスポートが出来ない為、Windows Server 2012R2側でタスクのエキスポートを行う。
コマンドプロンプトより下記のコマンドを実行。
&nbsp;
<code>schtasks /query /s \\[Windows Server 2003のIP Address] /tn "[タスク名]" /XML &gt; [出力ファイル名].xml</code>
&nbsp;
※1．で出力したリストを正規表現等で上手に加工すれば.job数分のコマンドが楽に生成できます。
※複数タスクのエキスポートの際は .bat ファイルにして実行すると楽です。
&nbsp;
<strong>3. [出力ファイル].xmlの中身を書き換える</strong>

Windows Server 2003のタスク設定に無い項目<strong>「構成」</strong>の設定方法
&nbsp;
<code>Task version="1.1"　→　Task version="1.x" に書き換える</code>
&nbsp;

※xは任意の数　例）"1.2" で 「Windows Server 2008R2」 となる
&nbsp;
「構成」のプルダウンの内容が変わります。
&nbsp;
Windows Server 2003のタスク設定に無い項目<strong>「最上位の特権で実行する」</strong>の設定方法
schtasks のオプション /RL でも設定出来るが /XML オプションとの併用が不可の為、xmlファイルに記述する。

<code>&lt;Principal&gt;
&lt;RunLevel&gt;HighestAvailable&lt;/RunLevel&gt;
&lt;/Principal&gt;</code>
&nbsp;
これでチェックボックスにチェックが入る
&nbsp;
UserIdをWindows Server 2012R2に合わせて書き換える
&nbsp;
<code>&lt;UserId&gt;[新サーバー名]\[実行ユーザー名]&lt;/UserId&gt;</code>
&nbsp;
<strong>4．Windows Server 2012R2へタスクを作成</strong>
コマンドプロンプトより以下のコマンドで Windows Server 2012R2 にタスク作成を行う。
&nbsp;
<code>schtasks /create /tn "[タスク名]" /XML "[3.で加工したXMLファイル名]" /RU "[実行ユーザー名]" /RP [実行ユーザーパスワード]</code>
&nbsp;
※タスクを階層で作成したい場合は"[タスク名]"を"[ディレクトリ名]/[タスク名]"とする
※"[実行ユーザー名]"は"ServerName/UserName"の形で設定する
※2．で作成した .bat を正規表現等で上手に加工すればコマンドが楽に生成できます。
※複数タスク作成の際は .bat ファイルにして実行すると楽です。
&nbsp;
以上の作業で Windows Server 2003 から Windows Server 2012R2 へタスクスケジューラーの移行が出来るはず！
&nbsp;
無事に出来たかな？？
&nbsp;
オブジェクト指向とは?

# オブジェクト指向とは何か?

この記事はなんとなく更新するかもしれないし、しないかもしれない。個人的なまとめだ。おそらく、今日を過ぎたら更新しないだろう。

## オブジェクト指向かそうでないかは、スペクトル的だ。

オブジェクト指向は、はっきりとオブジェクト指向か、そうでないかを明確に区別できるものではない。なにかと比較して、オブジェクト指向的と言うことが言える。たとえば、Aは100%ではないが、90％オブジェクト指向で、Bは60%オブジェクト指向であって、AはBよりもオブジェクト指向だと言える。

## オブジェクト指向、開発プロセス全体を含んでいる。

オブジェクト指向プログラミングというのは、開発プロセス全体を含んでいる。方法論、分析、設計、言語、ツール全体として、オブジェクト指向でプログラミングするということである。言語機能があり、それを使えば、オブジェクト指向であるかといえば、そうでは無いのだ。

## クラスは、モジュールとしての役割と型としての役割がある。

クラスは、モジュールの単位である。つまり、システムの構成要素である。モジュール同士を繋ぎ合せ、組織し、システムの全体を構築する。また、モジュールとして、プログラムをテストしたり、モジュールを入れ変えたりすることができる。

また、クラスには型としての型としての役割がある。型によって、プログラムが正しい実行がある程度保証される。型によるチェックによって、オブジェクトが受けとったメッセージが処理できるかどうかをチェックできる。
Ruby で文字列のキャメルケース変換

Ruby での文字列のキャメルケース変換についてのメモです。

# ActiveSupport の camelize
最近(?)では、Rails の ActiveSupport の String#camelize でそれができるようです。

```rb
require 'active_support/core_ext/string/inflections'
    
p "foo/bar_baz".camelize   #=> "Foo::BarBaz"
```

Rails ではきっと便利なんだと思うのですが、残念ながら仕様が私の都合にはあいませんでした。


# モジュール Camelizable
そこで、古いソースをもとに小さなモジュールを自作しました。
インスタンスメソッドは以下の２つです。

- Camelizable#ucc 
- Camelizable#lcc

いずれも、区切り文字列は引数で指定できます。正規表現か文字列で指定します。
区切り文字列のデフォルトは非英数文字の並びです。

```rb:camelizable.rb
module Camelizable
  def ucc(sep=/[^[:alnum:]]+/)          # 先頭が大文字のキャメルケース変換
    split(sep).map(&:capitalize).join
  end

  def lcc(sep=/[^[:alnum:]]+/)          # 先頭が小文字のキャメルケース変換
    ucc(sep).sub(/./){ $&.downcase }
  end
end
```

使い方は以下のような感じです。

```rb
class String
  include Camelizable          # String クラスに include する
end

p "foo_bar_baz".lcc            #=> "fooBarBaz"
p "foo bar baz".lcc            #=> "fooBarBaz"
p "foo/bar_baz".lcc            #=> "fooBarBaz"

p "foo_bar_baz".ucc            #=> "FooBarBaz"
p "foo bar_baz".ucc            #=> "FooBarBaz"
p "foo/bar_baz".ucc            #=> "FooBarBaz"

# 引数で区切り文字列を指定できます
p "foo_bar.baz".lcc(/_/)       #=> "fooBar.baz"
p "foo_bar_baz".lcc(/_bar_/)   #=> "fooBaz"
p "foo_bar_baz".lcc(/[ar]/)    #=> "foo_b_bZ"  (区切り文字に 'a' か 'r' を指定)
```

String クラスを拡張したくない場合は、文字列オブジェクトの特異メソッドとして使います。

```rb
str = "foo bar_baz"
str.extend Camelizable        # 文字列オブジェトに extend する

p str.lcc       #=> "fooBarBaz"
p str.ucc       #=> "FooBarBaz"
```

文字列オブジェクトも拡張したくない場合は proc を作ったりします。

```rb
to_ucc = -> s, *args { (Camelizable.instance_method :ucc).bind(s).call *args }

p to_ucc.("foo-bar-baz")    #=> "FooBarBaz"

```

ただし、lcc は実装が ucc に依存しているので、この方法はうまくいきません。
(とりあえず間に合ってるので、そこは放置。。。)

# おまけ

ActiveSupport の String#camelize をシミュレートすると、(多分)こんな感じです。
(でも、camelize を使う時は、素直に本物を使ってください。)

```rb
class String
  include Camelizable

  def camelize(first_letter=:upper)
    send(first_letter == :lower ? :lcc : :ucc, /_/).gsub(%r|/|){'::'}
  end
end
```

# Gem 化
※(2014.12.13追記)
Camelizable を Gem 化してアップしました。

- [GitHub: Camelizable](https://github.com/lnznt/camelizable "GitHub")

- [RubyGems: Camelizable](https://rubygems.org/gems/camelizable "RubyGems")


インストール方法

```
$ gem install camelizable
```

※ (注) ~~Gem版は String クラスに `include Camelizable` されています。(String クラスを拡張します)~~
※(2014/12/27 追記) Gem 版の String クラスへの include は削除しました。
Androidの OCRライブラリ tess-two (実践編1)


# 目的
tess-twoを使ってテキストの検出を実際に行ってみる。 [Making a Simple OCR Android App using Tesseract](http://gaut.am/making-an-ocr-android-app-using-tesseract/) を参考にした。


実験でカメラを使う必要はないので、手元にあった本の画像をあらかじめ撮影し、左上の ISBNコードを読みとってみる。

![sample.jpg](https://qiita-image-store.s3.amazonaws.com/0/3847/d584b092-8c18-e425-21a1-669ebdce822a.jpeg "sample.jpg")


# プロジェクトの準備

* ウィザードで空のプロジェクトを作る。
* 依存関係に tess-twoを追加。
![スクリーンショット 2014-12-08 13.35.37.png](https://qiita-image-store.s3.amazonaws.com/0/3847/19d1846d-a433-74f6-60cd-63adf3f84d39.png "スクリーンショット 2014-12-08 13.35.37.png")

* Java Build Pathに tess-two.jarを追加
※ 今回のサンプルでは共有ライブラリのコピーは必要なかった。どういうときに必要になるのかまだ理解できていない
* eng.traineddataを assetsに追加
* 上の画像を sample.jpgとして assetsに追加
* Manifestに WRITE_EXTERNAL_STORAGEパーミッションを追加

あとは MainActivity.javaを書く。面倒なのでUIには何も出さない。結果を LogCatに出力するだけ。

→ https://gist.github.com/Nunocky/5d43d0ec4b2270927446

![スクリーンショット 2014-12-08 14.57.13.png](https://qiita-image-store.s3.amazonaws.com/0/3847/4a5f2c87-9fa8-f0b9-47b8-424ee6467f63.png "スクリーンショット 2014-12-08 14.57.13.png")

## 解説
限定的な利用なら本当に簡単。

* 画像を用意する
* TessBaseAPIのインスタンスを作る
  * 画像を指定する
  * 調査範囲を指定する
  * テキストを取得する

それを行っているのが MainActivityの onResumeの中。

```java:MainActivity.java
AssetManager assetManager = getResources().getAssets();

InputStream is = assetManager.open(TARGET_IMAGE);
Bitmap bitmap = BitmapFactory.decodeStream(is);
bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);

TessBaseAPI baseApi = new TessBaseAPI();
baseApi.init(EXSTORAGE_PATH, "eng"); 
baseApi.setImage(bitmap);
baseApi.setRectangle(56, 81, 230, 22);
String recognizedText = baseApi.getUTF8Text();
baseApi.end();

Log.d(TAG, "Recognized: " + recognizedText);
```

これだけ。

setRectangleで指定する範囲は GIMPで適当に調べた。
![スクリーンショット 2014-12-08 11.40.29.png](https://qiita-image-store.s3.amazonaws.com/0/3847/f3f2f17f-05b1-e55b-f1a4-bf42a587b7e7.png "スクリーンショット 2014-12-08 11.40.29.png")

baseApi.initで trainedデータを指定する際に assetsを直接指定することができないので、onCreateで外部ストレージにコピーしている(prepareTrainedFileIfNotExistメソッド)。あんまりかっこよくないが、とりあえずはこれでOK。

なお、 **「traineddataはtessdataの下に置く」**、 **「initに渡すディレクトリはtessdataの一個上を指定する」** というルールがある。traineddataを tessdata以外の場所に置いても、以下のような Exceptionが発生してしまう。

> java.lang.IllegalArgumentException: Data path must contain subfolder tessdata!

※ もう一個細かいことで、 initに渡すディレクトリはスラッシュで終えること、と javadocで書かれている。なので EXSTORAGE_PATHはそのように書いているが、スラッシュを書かなくても特に影響はないようだ。ライブラリ側で補完してくれているのかも。

## 実行

![スクリーンショット 2014-12-08 11.41.05.png](https://qiita-image-store.s3.amazonaws.com/0/3847/505200c6-2c57-d5e4-06e9-287bf1ee7769.png "スクリーンショット 2014-12-08 11.41.05.png")

Jolly Good.

# 次は？
疑問に思うところは色々ある。

* 複数テキストの同時検出はできるのか? StringとRectangleのセットみたいなものが手に入る?
* 本の見開き全体を一度にスキャンするようなことはできるのか?
* 使ってみるとわかるが、初期化などは結構重たい処理なのでマルチスレッド化した方が良さそう。理想的な構成は?
* 縦書きにも対応している? → APIリファレンスを見るとできるっぽい

等々。
S3のアクセス状況を可視化してみる

# きっかけ
[先月CloudFrontのアクセス数などはCloudWatchで見れるようになりました。](http://aws.typepad.com/aws_japan/2014/11/cloudfront-up-trends-metrics-stats.html)

しかしS3のアクセス状況はそのようなMetricsがなく、ログを解析するしかありません。
アクセス規模が小さくてEMRを持ち出すほど大げさではない場合、lambdaで処理すれば楽に可視化まで持って行けるのではないかと考えました。

# 実装
[lambda2cw](https://gist.github.com/j3tm0t0/cac294821526e323cc03)
ログファイルがPUTされた時にフックして、ログを解析してCloudWatchのカスタムメトリクスとしてPutMericDataを行います。
想定としては、bucket内のlogs/ から始まるキーがログファイルとなります。

# デモ

## 負荷を発生
適当にabで負荷をかけます。

```
$ while [ 1 ] ; do ( ab -c 4 -n $(echo $[ $RANDOM % 100 ]) http://lambda2cw.s3-us-west-2.amazonaws.com/index.html & ); sleep 60 ; done
```

## ローカル実行

```
$ node invoke.js input.json
lambda2cw Started
processing s3://lambda2cw/logs/2014-12-07-20-17-45-0C579438788F858B
20 metrics pushed. 46 left
20 metrics pushed. 26 left
20 metrics pushed. 6 left
6 metrics pushed. 0 left
SUCCESS undefined
```

## lambda上で実行

```
2014-12-08 06:18:22 UTC	2014-12-08T06:18:22.723Z	6alf80tr75guxrdo	lambda2cw Started 
2014-12-08 06:18:24 UTC	START RequestId: 18e0b9ed-7ea2-11e4-bae6-95e15fd35a15 
2014-12-08 06:18:24 UTC	2014-12-08T06:18:24.262Z	18e0b9ed-7ea2-11e4-bae6-95e15fd35a15	processing s3://lambda2cw/logs/2014-12-08-06-18-18-EF79DF76713F7118 
2014-12-08 06:18:25 UTC	2014-12-08T06:18:25.563Z	18e0b9ed-7ea2-11e4-bae6-95e15fd35a15	20 metrics pushed. 38 left 
2014-12-08 06:18:26 UTC	2014-12-08T06:18:26.742Z	18e0b9ed-7ea2-11e4-bae6-95e15fd35a15	20 metrics pushed. 18 left 
2014-12-08 06:18:27 UTC	2014-12-08T06:18:27.903Z	18e0b9ed-7ea2-11e4-bae6-95e15fd35a15	18 metrics pushed. 0 left 
2014-12-08 06:18:27 UTC	END RequestId: 18e0b9ed-7ea2-11e4-bae6-95e15fd35a15 
2014-12-08 06:18:27 UTC	REPORT RequestId: 18e0b9ed-7ea2-11e4-bae6-95e15fd35a15	Duration: 3798.96 ms	Billed Duration: 3800 ms Memory Size: 128 MB	Max Memory Used: 18 MB	
```

## CloudWatchのグラフを確認
![Graph](http://g.s3w.jp/ab7a873b.png "CloudWatch")
ClojureのオブジェクトをClojureScriptに変換する

とっさにわからなかったのでメモ
Clojureでpr-strしてClojureScriptでread-stringすればいい

Luminusが標準で使うSelmerを使ってJavaScript経由で渡す場合、pr-strをもう1回使ってJavaScript用のエスケープをしておく。

Selmerのフィルターとしてcljsを作っておくと便利

```:clj
(ns sample
  (:require [selmer.filters :as f]))

(f/add-filter! :cljs  (fn [x] [:safe (pr-str (pr-str x))]))
```

```:html
<script type="text/javascript">
    var value = {{value|cljs}};
</script>
```

```:cljs
(ns sample
  (:require [cljs.reader :as r]))

(r/read-string js/value)
```


※追記
このやり方だと&lt;/script>があるとXSS発生してしまうので、display:noneの領域に出力しておいて goog.string.unescapeEntitiesを使ってunescapeするほうがいいかも・・・