OmniAICreator/Qiita-1.07M huggingface dataset:
JavascriptのDocについて真剣に考えたらこうなった。

JavascriptのDocの書き方できれいでいい書き方はなかろうか？
と考えた結果こうなった。

##結論

```lang:javascript
/**
 * description
 *
 * @param  <type>  argument (required) description
 * @param  <type>  argument (optional) description
 * ...
 * @return <type>
 */
```

もっと詳しく書くとこんな感じ

```lang:javascript
/**
 * yup description
 *
 * @param  <string> name    (required) refer object name
 * @param  <mixed>  options (required) option parameters
 * @param  <object> args    (optional) extra option parameters
 * @return <string>
 */
function yup(name, options, args) {
  // ...stuff...
}
```

##説明

Airbnb JavaScript Style Guideを基本的に準じてJavascriptを書いてます。
(Airbnb JavaScript Style Guideではdocについては触れてませんが、commentの例題的な感じで出ています)

変えたポイントは **(required)**、 **(optional)**をつけたところです。
たとえばPHPでは引数にデフォルト値を持たせたいときにこんな風にかけます。

```lang:PHP
public function yup(name, options, args = array()) {
  // ...stuff...
}
```

しかし、javascriptではこうはかけないわけです。

```lang:javascript
function yup(name, options, args = {}) {
  // ...stuff...
}
```

引数が必須かそうじゃないかがパッと見でわかりません。
なので、Docに書いてすぐにわかるようにしました。

このくらいでいいんじゃないのかな？
あんまり情報ありすぎても見づらくなるだけだし
KibanaとGrafanaの比較

背景
-------
KibanaはElasticsearch、GrafanaはGraphite or InfluxDBを主にバックエンドとしてWebブラウザで動作するダッシュボードツールです。GrafanaがKibanaを参考に作られたそうなので、見た目などは似ており、任意のWebサーバで動作する（`python -m SimpleHTTPServer`でもOK）ように作られています。[これ](http://qiita.com/m_mizutani/items/af30b87721a70d5290fa)の関係でGrafanaを試してみたところ、やはりKibanaも試してみようという意欲がわき1日ぐらいいじってみたのでその比較です。それぞれKibana 3.1.1、Grafana 1.8.1を使用してみました。使い込みが足りずに機能が把握できていないかもしれないので、ツッコミ歓迎です。


差がでていると思われる部分
--------

### インタラクティブ性
KibanaはQueryとFilteringという2つの項目がインタラクティブに入力、結果を表示できるように作られています。Queryは系列を作るための条件で、Filteringは集計の対象となるデータの選択に使われます。例えば以下の例では系列として項目`client`が`10.0.0.5`、`10.0.0.135`、`10.0.0.136`という3つを作成しており、（画像中では見えませんが）時刻範囲でFilteringすることで過去6時間分のデータだけを見ています。QueryやFilteringを入力すると、それが設定されたグラフや集計結果に即座に反映されます。

![Screenshot 2014-10-31 12.17.02.png](https://qiita-image-store.s3.amazonaws.com/0/27627/130e2ffe-a6fe-fbb1-7146-89776a8eaaa5.png)

一方、Grafanaはこのようなインタラクティブな入力はダッシュボードにはありません。各グラフの設定時にクエリを設定すればそれが即時に反映されますが、ここのグラフごとに設定するため何かを調べるために試行錯誤を繰り返すのには向いていないと考えられます。

しかし、その一方で静的に閲覧情報を表示する場合にはGrafanaの方が良い場合もあると考えられます。Kibanaは系列の設定が画面全体のグラフに適用させられるためQueryを都度変更して何かを調査するのには向いていますが、多様なクエリを複雑に組み合わせて使うのには不向きだと思われます。大は小を兼ねる使い方はできそうですが、インタラクティブに設定変更できるという良さがいかせなくなると考えられます。


### プレゼンテーションの豊富さ
表現方法の豊かさで言うとKibanaが圧倒的に有利です。Grafanaが基本的に時系列のグラフを表示するのに比べて、時系列のグラフ、全体の割合（円グラフなど）、値の集計（top Nなど）のようなグラフ、さらに地図などもサポートされています。

![Screen-Shot-2014-02-25-at-4.42.52-PM-1024x557.png](https://qiita-image-store.s3.amazonaws.com/0/27627/88bb1f91-4519-9ecf-3cbb-55593f6b5bcd.png)
Elasticsearchの[サンプル](http://www.elasticsearch.org/blog/kibana-3-0-0-ga-now-available/)より

また、KibanaはグラフだけではなくログそのものをJSONのような形式で表示したり、必要な項目を選んでテーブルで一覧表示させることができます。ログの中身をつぶさに調べたいときにとても有用と考えられます。

一方、Grafanaが提供しているのは時系列グラフだけになります。折れ線グラフ、面グラフ、棒グラフなどは選択できますが、基本的にX軸は時間軸になるようなグラフになるようです。

![Screenshot 2014-10-31 12.25.45.png](https://qiita-image-store.s3.amazonaws.com/0/27627/6c8b8d10-c0fd-dc1d-1fdc-35ff9dd022f5.png)
Grafanaで並べてみたグラフ


まとめ
--------
およその用途を考えると、Kibanaはシステムログの閲覧や調査、Grafanaはよりダッシュボード的な使い方が向いているのではないかと考えられます。

端的に言ってGrafanaの方がKibanaに比べて機能が少ない反面、とてもシンプルに作られています。グラフを作成する際にはinfluxDBのクエリ構造を理解していないといけないといけないという制約はありますが、SQL likeなのでエンジニアの人は比較的容易に理解できると思われます。また、クエリの入力補助も充実しているため、使いやすくできています。

Grafanaのクエリ設定画面
![Screenshot 2014-10-31 11.49.17.png](https://qiita-image-store.s3.amazonaws.com/0/27627/f446dbde-8d70-e3f6-8d76-d6eaf20a72cf.png)

一方でKibanaは機能が多いため、最初どのように使えばいいかでかなり迷いました。利用目的が時系列的なグラフを表示したいというのであれば、Grafanaの方がとっつきやすいでしょう。
Ruby 2.1.3 だと Syntastic で rubocop が動かない

いつの間にかシンタックスチェックがきいてなくてあせりました。

checker が有効になっているかどうかは ruby のファイルを開いて `:SyntasticInfo` とすればわかります。

rubocop が無効になるのは、以下のような警告が出るのが原因のようです。

```
$ rubocop --version
warning: parser/current is loading parser/ruby21, which recognizes
warning: 2.1.2-compliant syntax, but you are running 2.1.3.
0.26.1
```

しょうがないので、以下のようなファイルを `~/bin/rubocop` に作り実行権限をつけてパスを通しました。

```bash
#!/bin/bash
~/.rbenv/versions/2.1.2/bin/rubocop $@
```

Syntastic の checker には、元々決まった名前しか書けないので注意です。例えば、上記のファイルを `rubocop212` と名付けて `let g:syntastic_ruby_checkers = ['rubocop212']` としても動きません。
Alminiumでメール送信できるようにする

# 設定ファイルのコピー

```bash:
cd /opt/alminium/config/
cp -p configuration.yml{.example,}
```

# 設定ファイルの編集

```diff:/opt/alminium/config/configuration.yml
default:
  email_delivery:
    delivery_method: :smtp
    smtp_settings:
      address: "192.168.11.2"
      port: 25
      authentication: :none
      openssl_verify_mode: 'none'
```

192.168.11.2側で`mynetworks`値を送信許可アドレス帯にしていること確認。

# メールサーバ側の設定

```bash:/etc/postfix/main.cf
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 192.168.11.0/24
```

# alminiumリスタート

```bash:
service httpd restart
```
AngularJSに挑戦！入門 その１

#はじめに

AngularJSを知ったのは、1年ぐらい前でしたが、
なんとなくとっつきにくく、今までほったらかしにしてました。
がんばって勉強しようと自分を奮い立たせるつもりで、
少しずつ書き続けようと思います。

#AngularJSをダウンロード

[AngularJS](https://angularjs.org/)
の”ダウンロード”ボタンからダウンロードできます。

#なにはともあれHello World!から

どんな言語でも最初はHello World!からですね。
AngularJSでは、Hello XXXX!(XXXXは入力した文字列)とします。

```lang:HelloWorld.html
<html>
<head>
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0/angular.min.js"></script>
    <title>Hello World!</title>
</head>
<body ng-app>
    <div>
        <label>Name:</label>
            <input type="text" ng-model="name" value=""/>
            <h1>Hello {{name}}!</h1>
    </div>
</body>
</html>
```

`<body ng-app>`の`ng-app`AngularJSのお作法の１つ。
AngularJSアプリケーションを自動で起動させる指定です。
`<input type="text" ng-model="name" value=""/>`の
`ng-model`がディレクティブです。このコードでは、Javascriptを
書いていませんが、Javascript内のモデル・コントローラーとの
橋渡し役になります。
`<h1>Hello {{name}}!</h1>`が、表示です。`mg-Model`に指定した
変数を表示します。ここでは、inputタグに入力した文字列を
Helloの後に表示します。

![qiita02.jpg](https://qiita-image-store.s3.amazonaws.com/0/57930/58b7fc19-041b-3925-401e-9ddfc1ea28f6.jpeg)


#味気ないのでBootstrapで飾り付け
Bootstrapで飾り付けします。

```lang:NewHelloWorld.html
<html>
<head>
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0/angular.min.js"></script>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.0/css/bootstrap.min.css">
    <title>Hello World!</title>
</head>
<body ng-app>
    <div class="container">
        <div class="jumbotron">
            <label>Name:</label>
            <input type="text" ng-model="name" value=""/>
            <h1>Hello {{name}}!</h1>
        </div>
    </div>
</body>
</html>
```

少しは、よくなりました。


#おわりに

まだまだ、これからですが少しずつ勉強していきましょう！
HOTP と TOTP どちらを選ぶ? Google Authenticator



## TOTP と HOTP の違い

TOTP: 現在時刻を元にしている
HOTP: カウンターを元にしている

## TOTP

現在時刻をベースにしているので、各デバイスで時間が合ってないといけない

## HOTP

コードが作られるたびにカウンターが増える



## 用語

* ワンタイムパスワード
* グーグル・オウセンティケーター
画像をダブルタップとピンチイン・ピンチアウトで拡大・縮小する


![アプリ画像](http://i.gyazo.com/485e3c502d7be2e23ebb1062bfddf9d9.gif)

###アプリ内容
* 拡大・縮小の範囲は8倍〜1倍
* ダブルタップ時は3倍ずつ拡大して、上限を超えたら1倍に戻る。

このサンプル画像めっちゃ面白い。
「詳細! Objective-C iPhoneアプリ開発 入門ノート」という書籍のChapter6-4のサンプルアプリをSwiftにしました。そこで使われている画像です。

###コード
```Swift:ViewController.swift
class ViewController: UIViewController , UIScrollViewDelegate{
    
    @IBOutlet var myImageView: UIImageView!
    @IBOutlet var myScrollView: UIScrollView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // スクロールビューの設定
        self.myScrollView.delegate = self
        self.myScrollView.minimumZoomScale = 1
        self.myScrollView.maximumZoomScale = 8
        self.myScrollView.scrollEnabled = true
        self.myScrollView.showsHorizontalScrollIndicator = true
        self.myScrollView.showsVerticalScrollIndicator = true
        
        var doubleTapGesture: UITapGestureRecognizer = UITapGestureRecognizer(target: self
            , action:"doubleTap:")
        doubleTapGesture.numberOfTapsRequired = 2
        self.myImageView.userInteractionEnabled = true
        self.myImageView.addGestureRecognizer(doubleTapGesture)
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    
    // ピンチイン・ピンチアウト
    func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? {
        print("pinch")
        return self.myImageView
    }
    // ダブルタップ
    func doubleTap(gesture: UITapGestureRecognizer) -> Void {
        
        print(self.myScrollView.zoomScale)
        if ( self.myScrollView.zoomScale < self.myScrollView.maximumZoomScale ) {
            
            var newScale:CGFloat = self.myScrollView.zoomScale * 3
            var zoomRect:CGRect = self.zoomRectForScale(newScale, center: gesture.locationInView(gesture.view))
            self.myScrollView.zoomToRect(zoomRect, animated: true)
            
        } else {
            self.myScrollView.setZoomScale(1.0, animated: true)
        }
    }
    // 領域
    func zoomRectForScale(scale:CGFloat, center: CGPoint) -> CGRect{
        var zoomRect: CGRect = CGRect()
        zoomRect.size.height = self.myScrollView.frame.size.height / scale
        zoomRect.size.width = self.myScrollView.frame.size.width / scale
        
        zoomRect.origin.x = center.x - zoomRect.size.width / 2.0
        zoomRect.origin.y = center.y - zoomRect.size.height / 2.0
        
        return zoomRect
    }
}
```

###ソースアップ
https://github.com/hanoopy/ios_study_pinchapp.git

###コメント
* iosシミュレータでピンチイン・ピンチアウトはoptionキーを押しながらマウスをドラッグする。
* ダブルタップとピンチ以外も載っているSwiftのサンプル
https://sites.google.com/a/gclue.jp/swift-docs/ni-yinki100-ios/uikit/uiswipegesturerecognizerdesuwaipuwo-ren-shi
Bootstrapのpopoverにcallbackが欲しかったので作ってみた。

bootstrapのpopoverって便利ですよね。すごい便利。
でもcallbackが無いんです。こんな感じで実行したかったのに。

```
$("#hogehoge-id").popover({
  html: true,
  placement: 'auto',
  container: 'body',
  title: 'タイトル文字列',
  content: function() {
    return '<span>内容</span>';
  }
  ,callback: function(){
    alert('ポップオーバーの表示した後の処理！');
  }
});
```

ポップオーバーの表示後に、他のコントロールの内容を反映させたいとか、そういう時にすごく便利だなーって思ったので、作りました。

```
/*bootstrapのカスタマイズ*/
//popoverにcallback関数を実行可能にする
var tmp = $.fn.popover.Constructor.prototype.show;
$.fn.popover.Constructor.prototype.show = function () {
  tmp.call(this);
  if (this.options.callback) {
    this.options.callback();
  }
};
```

popoverを呼び出す前に実行しなくちゃいけないので、$(function () {});の中とかに書いておくと良いんじゃないでしょうか。
今日こそは早く帰りたいなあ…。

追記です。
このサンプルは以下のページを元に作成しました。
http://stackoverflow.com/questions/14694930/callback-function-after-tooltip-popover-is-created-with-twitter-bootstrap
UIWebViewにCookieをセット・削除

### セット

```swift
// 1
let storage = NSHTTPCookieStorage.sharedHTTPCookieStorage()
let cookies = NSHTTPCookieStorage.cookiesForURL(storage)(NSURL(string: host_url)!)
NSHTTPCookieStorage.sharedHTTPCookieStorage().setCookies(cookies!, forURL: host_url)

// 2
NSURL(string: host_url)!, mainDocumentURL: NSURL(string: host_url)!)
        for cookie : NSHTTPCookie in NSHTTPCookieStorage.sharedHTTPCookieStorage().cookiesForURL(NSURL(string: host_url)!) as [NSHTTPCookie] {
            NSHTTPCookieStorage.sharedHTTPCookieStorage().setCookie(cookie)
        }
```

### 削除

```swift
let storage = NSHTTPCookieStorage.sharedHTTPCookieStorage()
for cookie : NSHTTPCookie in NSHTTPCookieStorage.sharedHTTPCookieStorage().cookiesForURL(NSURL(string: url.host)!) as [NSHTTPCookie] {
    storage.deleteCookie(cookie)
}
```
CakePHPでWarning:SqlFileinfo::opneFileエラー


```
Warning: SplFileInfo::openFile(/path/to/app/tmp/cache/persistent/～)[splfileinfo.openfile]: failed to open stream: Permission denied in (/path/to/lib/Cake/Cache/Engine/FileEngine.php on line xxx
```

対処法

```lang:bootstrap.php
Cache::config('default', array('engine' => 'File', 'mask' => 0666));
```

```lang:core.php
Cache::config('_cake_core_', array(
    'engine' => $engine,
    'prefix' => $prefix . 'cake_core_',
    'path' => CACHE . 'persistent' . DS,
    'serialize' => ($engine === 'File'),
    'duration' => $duration,
    'mask' => 0666
));
Cache::config('_cake_model_', array(
    'engine' => $engine,
    'prefix' => $prefix . 'cake_model_',
    'path' => CACHE . 'models' . DS,
    'serialize' => ($engine === 'File'),
    'duration' => $duration,
    'mask' => 0666
));
```

するとcacheに生成されるファイルが、-rw-rw-rw- になる。
勿論前提として、tmp/cache、tmp/cache、tmp/cache/models、/tmp/cache/persistentsなどのパーミッションも正しく設定しておく。

参考：http://log.miraoto.com/2012/09/675/
checkbox(チェックボックス)のチェック

# 解説
枠のクリックイベントを取得して、checkboxを制御する。
checkboxをクリックした場合も枠のイベントが発生する為、イベント元で処理を切り分ける。

# ソース
<a class="jsbin-embed" href="http://jsbin.com/yisuz/5/embed">DEMO</a><script src="http://static.jsbin.com/js/embed.js"></script>

```html
<!DOCTYPE html>
<html>
    <head>
        <script src="https://code.jquery.com/jquery-1.11.1.min.js"></script>
        <meta charset="utf-8">
        <title>CheckBox</title>
    </head>
    <style>
    .box {
        width: 100px;
        height: 100px;
        border:1px black solid;
    }
    </style>
    <script>
    $(function(){
        $(".box").click(function(e){
            if(e.target==this){
                var $i = $(this).find("input");
                $i.prop("checked", !$i.prop("checked"));
                $i.trigger("change");
            }
        });
    });
    </script>
    <body>
        <div class="box">
            <input type="checkbox">
        </div>
    </body>
</html>
```
pyenvでinstall中にwgetに失敗する

pyenvでpython2.6.6をインストール

```
# pyenv install 2.6.6

... 略

error: failed to install setuptools via ez_setup.py

BUILD FAILED

Inspect or clean up the working tree at /tmp/python-build.20141031114520.16491
Results logged to /tmp/python-build.20141031114520.16491.log

Last 10 log lines:
    downloader_factory=options.downloader_factory,
  File "/tmp/python-build.20141031114520.16491/ez_setup.py", line 287, in download_setuptools
    downloader(url, saveto)
  File "/tmp/python-build.20141031114520.16491/ez_setup.py", line 224, in download_file_wget
    _clean_check(cmd, target)
  File "/tmp/python-build.20141031114520.16491/ez_setup.py", line 169, in _clean_check
    subprocess.check_call(cmd)
  File "/root/.pyenv/versions/2.6.6/lib/python2.6/subprocess.py", line 488, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['wget', 'https://pypi.python.org/packages/source/s/setuptools/setuptools-7.0.zip', '--quiet', '--output-document', '/tmp/python-build.20141031114520.16491/Python-2.6.6/setuptools-7.0.zip']' returned non-zero exit status 1
```
色々しらべたらwgetの時にSSLによる接続が確立できていないからっぽいのでSSLのチェックを無効にしてとりあえずは動いた。

```
echo "check_certificate = off" >> /etc/wgetrc
```

もっといい方法ないか…
VBAでの配列

# 概要
VBAで配列を扱う場合のメモ

# ソース

### 末尾に追加
```vbnet
Sub main()
    ' Array()は、Variant型になります
    Dim a As Variant
    a = Array(1, 2, 3)
    b = 4

    ' 要素数を拡大します。
    ' Preserveを付けないとデータが消えます。
    '   Redim - 要素数の変更
    '   UBound - 要素数の取得
    ReDim Preserve a(UBound(a) + 1)
    a(UBound(a)) = b
End Sub
```

### 簡単なマージ
マージ関数が見つからないので、簡単な結合方法

```vbnet
Sub sample_push()
    ' Array()は、Variant型になります
    Dim a As Variant
    a = Array(1, 2, 3)
    b = Array(4, 5, 6)

    ' splitを利用して、配列を生成します。
    ' 分割文字は、場合に合わせて変更します。
    c = Split(Join(a, "@") & "@" & Join(b, "@"), "@")
End Sub
```
htaccessで階層を一つ下げる

# 方法
ルートからのパスを記述します。
`/aaaa/`と`/aaa/index.php`に対応します。`/aaa/index.html`には未対応なので、修正が必要になります。

```apache
RedirectPermanent /aaa/index.php /aaa/bbb/index.php
```

# 失敗例

ループが発生してうまくいかない。

```apache
RedirectPermanent /aaa /aaa/bbb/index.php
```

# 備考
htaccessのsyntaxはapache
fluentd in_execプラグインからcurl_exec(php)実行すると落ちる？

なぜなのか・・・
分かるかたいたら教えて下さい。

aws sdkで色々情報とろうかとしていた時に気づきました。
https://github.com/amazonwebservices/aws-sdk-for-php/blob/master/lib/requestcore/requestcore.class.php#L843

#環境


```
$ td-agent --version
td-agent 0.10.50

$ php -v
PHP 5.5.9-1ubuntu4.4 (cli)

$ curl -V
curl 7.35.0 (x86_64-pc-linux-gnu) libcurl/7.35.0 OpenSSL/1.0.1f zlib/1.2.8 libidn/1.28 librtmp/2.3
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp smtp smtps telnet tftp
Features: AsynchDNS GSS-Negotiate IDN IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP

```

#起こったこと

fluentd(in_exec)
↓
phpスクリプト実行
 - curl_exec() でおちる。
 - エラーも吐かない。。
 - http://php.net/manual/ja/function.curl-exec.php
ChefDk の berkshelf で cookbook をダウンロードする


ChefDK は、berkshelf や Knife など Chef 関連のコマンドをまとめたパッケージです。Ruby 自体や依存ライブラリも含んでいるので、パッケージをインストールするだけで、コマンドが使えます。

面倒な依存解決が無くて楽ですね。

## 1. ChefDk をダウンロードして、インストール

ダウンロードして、パッケージ（OSX なら dmg ファイル）から、インストールします。

https://downloads.getchef.com/chef-dk/mac/#/

## 2. berks vendor で、cookbook をダウンロード

OSX では、ChefDk のコマンド群は、`/opt/chekdf/bin` 以下にインストールされます。`/usr/bin/` 以下にコマンドのシンボリックリンクが張られるので、下記で実行できます。

```
$ berks vendor cookbook
```

すでに別の方法（MacPorts 等）で、インストールしていた場合、`PATH` の設定で、前にインストールしたコマンドが動く場合があります。その時は、`/opt/chefdk/bin` を PATH に設定するか、フルパスで実行します。

```
$ /opt/chefdk/bin/berks vendor cookbook
```
localStorageを使う事になった時にとりあえず見ればわかりそうなメモ

スクリプト？なにそれ？
データベース？おいしいの？
という際に我々の強い味方になってくれるLocalStorageさん！！

※但しスマートフォンに限る

```js:window.localStorage
if (window.localStorage) {
    // 保存する
    window.localStorage.setItem('key01', 'value01');
    window.localStorage.setItem('key02', 'value02');

    // じぇいそん行ってらっしゃい
    var json = {
            json_key01 : 'json_value01',
            json_key02 : 'json_value02'
    };
    window.localStorage.setItem('key03', JSON.stringify(json));

    // 取得する
    console.log(window.localStorage.getItem('key01'));
    console.log(window.localStorage.getItem('key02'));

    // お帰りじぇいそーん
    console.log(JSON.parse(window.localStorage.getItem('key03')));

    // キーを取得
    for (var i = 0; i < window.localStorage.length; i++) {
        console.log(window.localStorage.key(i));
    };

    // ☆（ゝω・）vクリア
    window.localStorage.clear();
}
```
OS X への Redis インストール


homebrew 経由でインストールしました。

#### Install

```bash
$ brew search redis
hiredis	   redis      redis1310	 redis24
homebrew/nginx/redis2-nginx-module	       homebrew/php/php54-redis			      homebrew/php/php56-redis
homebrew/php/php53-redis		       homebrew/php/php55-redis

$ brew install redis
$ brew install hiredis
```


#### 起動

```bash
$ redis-server
[80855] 31 Oct 00:18:38.270 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
[80855] 31 Oct 00:18:38.272 * Increased maximum number of open files to 10032 (it was originally set to 2560).
                _._
           _.-``__ ''-._
      _.-``    `.  `_.  ''-._           Redis 2.8.17 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._
 (    '      ,       .-`  | `,    )     Running in stand alone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 80855
  `-._    `-._  `-./  _.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |           http://redis.io
  `-._    `-._`-.__.-'_.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |
  `-._    `-._`-.__.-'_.-'    _.-'
      `-._    `-.__.-'    _.-'
          `-._        _.-'
              `-.__.-'

[80855] 31 Oct 00:18:38.278 # Server started, Redis version 2.8.17
[80855] 31 Oct 00:18:38.279 * The server is now ready to accept connections on port 6379

```
RaspberryPiでWebカメラ使って,人の動作感知してみた

両親から、
「高齢の祖母がベッドから立ち上がった際に、それを感知してメールか何かで送れないかな？」
っていう相談受けました。
すでに、色々なメーカーから、そのような介護製品がでているのですが、
ちょうどいいと思い、RaspberryPiで動作センサを自作してみました。
（信頼性上、購入したメーカー製品が届くまでの繋ぎ程度の物ですけど）

#Webカメラとmotion
RaspberryPiへのWebカメラ導入は以前にやっていました。

* [RaspberryPiでWebカメラ](http://qiita.com/KTaskn/items/2429b4d7d4f0456adf35)

今回は、motionというパッケージを利用します。
Webカメラからの映像を監視して、何か動きがあれば検知するっていうソフトウェア。


参考：
[[Raspberry Pi]motionでお手軽監視カメラをつくる](http://blog.hello-world.jp.net/raspberrypi/1949/)
[Motion の導入手順 ～ 指定した内容、パラメータの意味について](http://safe-linux.homeip.net/web/motion/motion-03.html)

インストール

```lang:
$ sudo apt-get install motion
```

設定ファイルを編集
今回は、映像を取ることではなく、検知によりメールを送信することが目的なので
画像、動画保存はしません（容量も取られますし）
動きが検知された際にメール送信のスクリプトを動かします。

```lang:
$ sudo vi /etc/motion/motion.conf
```

```lang:motion.conf
# 略
daemon on          # RaspberryPi起動時のmotion起動設定
threshold 3000     # 検知の閾値,値が大きいほど鈍感になるみたいです。
output_normal off  #検知の際の画像保存設定
ffmpeg_cap_new off  #検知の際の動画保存設定
on_event_start /home/pi/sentmail.sh #検知が合った際に、実行されるシェルスクリプトを指定
```

メール送信用のスクリプト
motion.confではシェルスクリプト指定した方が楽なのかな？（未確認）
メール送信は、後々色々動作を追加するかもしれないので、Rubyで書きました。
なので、シェルスクリプトからRubyスクリプトを起動
参考：
[RubyでGmailのSMTPサーバを使ってメールを送信する](http://qiita.com/nyamage/items/7145159c9a610f99b5d9)

```lang:sentmail.sh
ruby /home/pi/sentmail.rb
```

```lang:sentmail.rb
require 'mail'

mail = Mail.new

options = { :address              => "smtp.gmail.com",
            :port                 => 587,
            :domain               => "smtp.gmail.com",
            :user_name            => '<username>@gmail.com',
            :password             => '<password>',
            :authentication       => :plain,
            :enable_starttls_auto => true  }        
mail.charset = 'utf-8'
mail.from "from@example.com"
mail.to "to@example.com"    
mail.subject "メールタイトル"
mail.body "メール本文"
mail.delivery_method(:smtp, options)
mail.deliver
```

動きました。
カメラのフォーカス状態の取得

    // カメラデバイスからの入力を作成し、セッションに追加する
    NSError *error = nil;
    _camera = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    
    if ([_camera lockForConfiguration:&error]) {
        [_camera setFocusMode:AVCaptureFocusModeContinuousAutoFocus];
        _camera.autoFocusRangeRestriction = AVCaptureAutoFocusRangeRestrictionNear;
        if ([_camera isExposureModeSupported:AVCaptureExposureModeAutoExpose]){
            [_camera setExposureMode:AVCaptureExposureModeAutoExpose];
        }
        [_camera unlockForConfiguration];
    }

    [_camera addObserver:self forKeyPath:@"adjustingFocus" options:NSKeyValueObservingOptionNew context:nil];

// 画面遷移時など不要になったらremoveしないと再度addしたときに落ちる
//    [_camera removeObserver:self forKeyPath:@"adjustingFocus"];


/**
 *  状態が変化したときに呼ばれるのはこちら
 */
- (void)observeValueForKeyPath:(NSString *)keyPath 
　ofObject:(id)object 
　change:(NSDictionary *)change 
　context:(void *)context
{
    // ピントの状態が変化する度にこのコードが呼ばれます。
    // ここに実装を書く事でピント合った/外れたタイミングで枠の表示/非表示が出来ます。
    if( [keyPath isEqualToString:@"adjustingFocus"] ){
        BOOL adjustingFocus = [[change objectForKey:NSKeyValueChangeNewKey] isEqualToNumber:[NSNumber numberWithInt:1] ];
        
        if (adjustingFocus) {
            _focusing=true;
            _finishedFocus = false;
            NSLog(@"focusing");
        }
        else {
            if (_focusing) {
                _focusing = false;
                _finishedFocus = true;
                NSLog(@"finishFocus");
            }
        }
    }
}
Alamofire で JSON を返す API を呼び出す


Alamofire で http リクエストを行うサンプルはよく見かけるのですが戻ってきたレスポンスをどう扱えばいいかわからなかったのでメモ。

# 前提

* JSON(Array) を返す API がある
* 結果を配列に取り込みたい

# やること
* 配列の要素となるクラスを定義する 
* JSON Array の値を配列の要素となるクラスに代入

# レスポンス

このような JSON を返す API があるとします

```
[
 {
  id: 1,
  name: "BDZ-ET2100",
  image_url: "http://sample.me/a.jpg",
  document_url: "http://sample.me/a.pdf",
  created_at: "2014-10-21T17:18:52.360+09:00",
  updated_at: "2014-10-21T17:18:52.360+09:00"
 },
 {
  id: 2,
  name: "BDZ-EX3000",
  image_url: "http://sample.me/b.jpg",
  document_url: "http://sample.me/b.pdf",
  created_at: "2014-10-21T17:18:52.376+09:00",
  updated_at: "2014-10-21T17:18:52.376+09:00"
 }
..
]
```

# 配列の要素となるクラスを定義する

```Product.swift
import Foundation

class Product: NSObject {
    var name: String, documentUrl: String, imageUrl: String
    
    init(name: String, documentUrl: String, imageUrl: String) {
        self.name = name
        self.documentUrl = documentUrl
        self.imageUrl = imageUrl
    }
}
```

# JSON Array の値を配列の要素となるクラスに代入

responseJSON メソッドを使って、JSON 引数に対してキャストを行います。その後は必要なキーにアクセスして値を取り出します。
今回は JSONArray が返ってきたので Array < Dictionary < String,AnyObject > > でキャストしましたが、 JSON が返る場合は Dictionary < String,AnyObject > でキャストすればいけると思います。

```ViewController.swift
import UIKit
import Alamofire

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource{

    ...

    var products = [Product]()

    func request(){
        Alamofire.request(.GET, "http://sample.me/api/v1/product", parameters: nil)
            .responseJSON {(_, _, JSON, error) in
                if let productParamArray = JSON as? Array<Dictionary<String,AnyObject>> {
                    for productParam in productParamArray {
                        let product = Product(name: productParam["name"] as String,
                            documentUrl: productParam["document_url"] as String,
                            imageUrl: productParam["image_url"] as String)
                        self.products.append(product)

                        println("JSON:        name: \(product.name)")
                        println("JSON: documentUrl: \(product.documentUrl)")
                        println("JSON:    imageUrl: \(product.imageUrl)")
                    }
                    self.tableview.reloadData()
                }
        }
    }
    ...
}
```
初めてのHipchat②　ルームを作る

チャットをするに当たって、ルームを作りましょう！

ルームは以下の2種類があるようです。
Open　　　：チームメンバなら誰でも見れるチャットルーム
Private　：特定のメンバだけ見れるチャットルーム

デフォルトはチーム名のOpenルームがあります。

１．「Create Room」をクリック
![WS000004.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/67511a52-b1b0-a019-b138-dd995da0f9c5.jpeg)

２．ルーム名当を記述し、OpenかPrivateを選びます。
![WS000007.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/50d1364f-2107-530c-bf05-44978da81938.jpeg)

３．Privateの場合は以下の画面がでるので、参加させるメンバーを選択します。
![WS000008.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/50a59f9b-1301-8e44-8d99-b7a0d9749f1f.jpeg)

４．「Create Room」をクリックすれば完了です！
solr が ICUFoldingFilterFactory を見つけられない場合にすること


0. 環境
--
- Solr 3.6.2


1. 問題
--
ICUFoldingFilterFactory を使用したいために、instanceDir/conf/solrconfig.xml に以下の jar ファイルを追加した。

```solrconfig.xml
<lib path="../../../contrib/analysis-extras/lib/icu4j-4.8.1.1.jar" />
<lib path="../../../contrib/analysis-extras/lucene-libs/lucene-icu-3.6.2.jar" />
```

しかし、改善しなかった。相対 PATH も間違っていないし、理由がわからなかった。


2. 対応
--
- apache-solr-analysis-extras-3.6.2.jar を追加する

```solrconfig.xml
<lib path="../../../dist/apache-solr-analysis-extras-3.6.2.jar" />
<lib path="../../../contrib/analysis-extras/lib/icu4j-4.8.1.1.jar" />
<lib path="../../../contrib/analysis-extras/lucene-libs/lucene-icu-3.6.2.jar" />
```

StackOverFlow に助けられた。
http://stackoverflow.com/questions/12377878/solr-cannot-find-icufoldingfilter-in-contrib-directory
トッリク・オア・シェル芸

前準備

```lang:bash
# echo 'Trick or Treat!' > hoge
# tail -f hoge &
[1] 2550
Trick or Treat!
# 
# rm -f hoge
# ls -l hoge
ls: cannot access hoge: No such file or directory
```
ここから

```lang:bash
# lsof|grep hoge
tail      2550      root    3r      REG                8,2        16     129635 /root/hoge (deleted)
```

extファイルシステム限定

```lang:bash
# debugfs /dev/sda2 -R 'cat <129635>'
debugfs 1.41.12 (17-May-2010)
Trick or Treat!
```

procファイルシステムがある場合

```lang:bash
# cat /proc/2550/fd/3
Trick or Treat!
```

後始末

```lang:bash
# kill %%
[1]+  Terminated              tail -f hoge
```
WelcartでOGPタグを出力しないようにする

## WelcartのOGP
Welcartの商品ページは自動でOGPタグを出力してくれますが、この中に含まれるog:imageがサムネイルサイズでFacebookにリンクしても迫力がありません。
大きいサイズの画像をog:imageしてくれるプラグインはいろいろあるので、そっちに任せるとして、WelcaartがOGPタグを自動で追加しないようにする方法を。

```php:
remove_action( 'wp_head', 'usces_action_ogp_meta');
```
上のコードを使用中のテーマのfunctions.phpに記述します。
UIImageの回転

UIImageの回転

    _imageOriginal = [UIImage imageNamed:@"購入記録no1.png"];

    UIGraphicsBeginImageContextWithOptions(CGSizeMake(_imageOriginal.size.height, _imageOriginal.size.width), YES, _imageOriginal.scale);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextTranslateCTM(context, _imageOriginal.size.height, _imageOriginal.size.width);
    CGContextScaleCTM(context, 1, -1);
    CGContextRotateCTM(context, M_PI_2);
    
    CGImageRef      imgRef = [_imageOriginal CGImage];
    CGContextDrawImage(context, CGRectMake(0, 0, _imageOriginal.size.width, _imageOriginal.size.height), imgRef);
    _imageRotation = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
CentOSで、chkconfigやalternativesの場所

chkconfigやalternativesの場所はここ。
whichコマンドで見つからなかったら、findで探せます。

## chkconfig
```
$ find / -name chkconfig
/sbin/chkconfig
```

## alternatives
```
$ find / -name alternatives
/etc/alternatives/usr/sbin/alternatives/var/lib/alternatives

$ /usr/sbin/alternatives --config mta
```
HARファイルの内容から指定URLの内容のみを抽出する方法

開発者ツールのネットワークデータで、[Preserve log][持続]モードで一連のページ遷移の流れを記録したときに、HARファイル（Chromeの開発者ツールやFireFoxのFireBugなどのネットワークログをダンプしたファイル）の内容が大きくなってしまいます。
これは、表示したページのHTML以外にも画像やcssなど全てのリクエスト内容が含まれるためです。
しかし、分析や調査のときには着目したいリクエスト（特定のURL）の分があれば十分です。

そこで、jqコマンド(v1.4)を使ってHARファイルから指定URLの内容のみを抽出するスクリプトを作りました。

このコマンドで抽出した内容はHARファイルの構造をそのまま保っているので、HARファイルビューアなどでも問題なく閲覧できます。

```bash
#!/bin/bash
#
# harファイルのログデータで、指定のURLのアクセスのみを抽出する
#
# Requie:
#  jq v1.4
#
# Example:
#  1) har_filter "http://example.com/hoge" har_file.har
#  2) cat har_file.har | har_filter "http://example.com/hoge"
#
set -e

filter_url=$1
har_file=${2:--}

contents=$(cat $har_file | \
jq -r "$(cat <<EOS
.log | with_entries(if .key != "entries" then
 .
else
 .value |= map(select(.request.url | startswith("$filter_url")))
end)
EOS
)"
)

cat <<EOS | jq .
{ "log": $contents }
EOS

```
RS-232Cでパルスジェネレータを作る

パルスジェネレータが欲しかったんだけど水晶振動子や抵抗やコンデンサなど、結局材料が手元に何も無かったのでソフトウェアでやることに。

# 環境
* Mac OS X 10.9.5

# 方針
* USB-RS232CアダプタをかませてRS-232Cのどこかの出力を振動させる。
* 出力電圧などはとりあえず置いておいて、とにかく振動させることを目的とする。

# 参考文献
* [RS-232](http://ja.wikipedia.org/wiki/RS-232)

# キモ
```c
int fd = open(argv[1], O_RDWR | O_NONBLOCK);

int modem = 0;
ioctl(fd, TIOCMGET, &modem);

modem |= TIOCM_DTR;
ioctl(fd, TIOCMSET, &modem);

modem &= ~TIOCM_DTR;
ioctl(fd, TIOCMSET, &modem);

close(fd);
```

`ioctl(fd, TIOCMGET, &modem)`でモデム状態を取得し、`modem |= TIOCM_DTR`もしくは、`modem &= ~TIOCM_DTR`でDTR信号だけを変化させる。それを`ioctl(fd, TIOCMSET, &modem)`で設定してやることで、DTR信号の電圧を変化させることができる。

ちなみに`argv[1]`には、実行時に引数に与える`/dev/tty.usbserial-FTG97M9S`みたいなのが入る。BUFFALOのUSB-RS232Cアダプタケーブル使ったらこれだった。

上記のコードを適当に使ってやると、手元の環境では+10Vと-10Vで振動した。

# その他
いろいろ試した内容は文章にするのが大変なので、以下箇条書き。

* RTS信号を変化させようと`TIOCM_RTS`を使ってみたけど、変化しなかった。
* Wikipediaで入出力がOUTになっている信号しかホスト側からは制御できないだろうと予想。
* `write()`などを使用してTxDに書き出す方法でもできないことは無いんだろうけど、スタートビット、パリティビット、ストップビットなどが付与されちゃって、思い通りの波形にならないだろうと予想。
シェルスクリプトで来月1日の求め方

シェルスクリプトで来月1日を求めるのに以下のように書いていたら、本日(10/31)残念な結果になったのでメモ

```
# echo `date -d '1 month' +"%Y/%m/1"`
2014/12/1
```

(；´Д｀)

正しくは以下

```
# echo $(date +%Y/%m/%d -d "-$(($(date +%d)-1)) days + 1 month")
2014/11/01
```

2014/11/10追記
上記では8日、9日に以下のようなエラーが発生した

```
08: value too great for base (error token is "08")
```

以下のように修正して対処

```
# echo $(date -d "`date '+%Y/%m/01'` 1 months" '+%Y/%m/01')
```
[bash] ファイル名の日付とか連番を解決する

- 日付を含むファイルに対する処理を自動化したい
- 連番で順次処理（例えば複数サーバーにリモートシェル実行）をfor文で書きたい

そんな時のTips備忘録。

# `date`（MacOSXにプリインしてるやつ）

今日の日付を`YYYYmmdd`で出力。

```bash
$ date +%Y%m%d
20141031
```

昨日の日付を`YYYY-mm-dd`で出力。

```bash 
$ date -v-1d +%Y-%m-%d
2014-10-30
```

2000年の2月末日（閏年）を出力。

```bash 
$ date -v1d -v3m -v0y -v-1d +%Y-%m-%d
2000-02-29
```

`-v`オプション便利。

```
     -v      Adjust (i.e., take the current date and display the result of the adjustment; not actually set the date) the second, minute, hour, month
             day, week day, month or year according to val.  If val is preceded with a plus or minus sign, the date is adjusted forwards or backwards
             according to the remaining string, otherwise the relevant part of the date is set.  The date can be adjusted as many times as required
             using these flags.  Flags are processed in the order given.
```

Linuxに入っているやつはまたオプションが違ったはず（機会があったら追記する）。

# 連番の解決

## `for`とBrace Expansionで繰り返し

Brace Expansionとは`{1..5}`みたいなやつ。

```bash 
$ echo {1..5}
1 2 3 4 5
```

```bash 
$ for I in {1..5}; do echo $I; done
1
2
3
4
5
```

## `printf`で前ゼロ

```bash 
$ printf "%02i\n" 1
01
```

`for`文で回せばこう。

```bash 
$ for I in {1..5}; do echo "server-$(printf %02i $I).your.domain"; done
server-01.your.domain
server-02.your.domain
server-03.your.domain
server-04.your.domain
server-05.your.domain
```

## 組み合わせる

複数のサーバーにある5日前〜今日までのログファイルをリモートシェルで実行！（確認用に以下では`echo`してる）

```bash 
$ for I in {1..5}; do for D in {4..0}; do echo "ssh server-$(printf %02i $I).your.domain cat /PATH/TO/log.$(date -v-${D}d +%Y-%m-%d)"; done; done
ssh server-01.your.domain cat /PATH/TO/log.2014-10-27
ssh server-01.your.domain cat /PATH/TO/log.2014-10-28
ssh server-01.your.domain cat /PATH/TO/log.2014-10-29
ssh server-01.your.domain cat /PATH/TO/log.2014-10-30
ssh server-01.your.domain cat /PATH/TO/log.2014-10-31
ssh server-02.your.domain cat /PATH/TO/log.2014-10-27
ssh server-02.your.domain cat /PATH/TO/log.2014-10-28
ssh server-02.your.domain cat /PATH/TO/log.2014-10-29
ssh server-02.your.domain cat /PATH/TO/log.2014-10-30
ssh server-02.your.domain cat /PATH/TO/log.2014-10-31
ssh server-03.your.domain cat /PATH/TO/log.2014-10-27
ssh server-03.your.domain cat /PATH/TO/log.2014-10-28
ssh server-03.your.domain cat /PATH/TO/log.2014-10-29
ssh server-03.your.domain cat /PATH/TO/log.2014-10-30
ssh server-03.your.domain cat /PATH/TO/log.2014-10-31
ssh server-04.your.domain cat /PATH/TO/log.2014-10-27
ssh server-04.your.domain cat /PATH/TO/log.2014-10-28
ssh server-04.your.domain cat /PATH/TO/log.2014-10-29
ssh server-04.your.domain cat /PATH/TO/log.2014-10-30
ssh server-04.your.domain cat /PATH/TO/log.2014-10-31
ssh server-05.your.domain cat /PATH/TO/log.2014-10-27
ssh server-05.your.domain cat /PATH/TO/log.2014-10-28
ssh server-05.your.domain cat /PATH/TO/log.2014-10-29
ssh server-05.your.domain cat /PATH/TO/log.2014-10-30
ssh server-05.your.domain cat /PATH/TO/log.2014-10-31
```

これでログ漁りが捗る :metal:
初めてのHipchat①　ベースを作る

チャットツールで良いものないかなぁ・・・と探していたところ、無料で人数制限無し！Github等と連携！できるHipchatを今更ながら見つけました。
英語インタフェースは未だに抵抗あるので、メモ的な感じです。

１．HipchatのHP（https://www.hipchat.com ）を開き、「Get Started for free」をクリックします。
![WS000000.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/f226db80-3037-83b3-34c1-02b61285c507.jpeg)

２．名前やメールアドレス、パスワード、チーム名を入力します。
![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/2f7c57e7-6037-ee7d-9040-b2d1c2db0f2a.jpeg)

３．チームメンバを招くときは必要情報を記述します。
　　悲しいですが孤独でいく場合は「Skip this step」をクリックします。
![WS000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/ebf64b33-bb6b-2151-362b-a297a298d450.jpeg)

４．これでチームの管理画面にいけるっぽいです！実際に使うにはRoomを作る？
![WS000004.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/032f8c1b-bd3d-614d-df91-a530d1d58b95.jpeg)

５．２で入れたメールアドレスにメールが届くので、メール内の「Confirm your email address」をクリックします。

以上でとりあえずの設定は完了するようです。
Scala Starter 101 - Convert between Mutable and Immutable

Generally, from mutable to immutable, you use the `to*` series methods in mutable collections, like *MutableList* and *ListBuffer*'s `toList` method.

In the other hand, from immutable to mutable, you can just use constructors like this: `scala.collection.mutable.ListBuffer(immtableList: _*)`.

> Note that the `to*` methods like toList, toMap are is performed in constant time.

Here is some examples.

# Map

```scala
// from mutable to immutable
val mutableMap1 = immutableMap.toMap() // after 2.8
val mutbaleMap2 = collection.immutable.Map(x.toList: _*) // before 2.8
```



```scala
// from immutable to mutable
val immutableMap = scala.collection.immutable.Map(1 -> "1", 2 -> "2")
val mutableMap = scala.collection.mutable.Map(immutableMap: _*)
```



# List

```scala 
// from mutable to immutable
val immutableList = mutableListBuffer.toList
```

```scala
// from immutable to mutable
val immutableList = scala.collection.immutable.List(1, 2, 3)
val mutableListBuffer = scala.collection.mutable.ListBuffer(immutableList: _*)
```

***

Ref

[1] - [How can I convert immutable.Map to mutable.Map in Scala?](http://stackoverflow.com/questions/5042878/how-can-i-convert-immutable-map-to-mutable-map-in-scala)
[2] - [Converting mutable to immutable map](http://stackoverflow.com/questions/2817055/converting-mutable-to-immutable-map)
[3] - [Converting mutable collection to immutable](http://stackoverflow.com/questions/8489829/converting-mutable-collection-to-immutable)
Junitでprivateメソッドのテスト方法

#はじめに
Javaのテストユニットとして、Junitは当たり前に使用されるようになりました。
publicメソッドのテストは当然ですが、private,protectedメソッドの
テストはおろそかになりがちです。

ホワイトテストの実施は、プログラマーの義務を思いますので、
テストの実施が必要です。
そこで、すべてのメソッドのテスト実施を行う方法を紹介します。

#テスト用のコードを用意
まず、テスト対象のコードを用意します。
以下は、参考までに。

```java:Sample.java
public Sample {
    public int add(int x, int y) {
        return (x + y);
    }

    protected int minus(int x, int y) {
        return (x - y);
    }

    private int multiplication(int x, int y) {
        return (x * y);
    }
}
```

#publicメソッドのテスト
```java:SampleTest.java
import org.junit.Test;

public class SampleTest {
    @Test
    public void testEqual() {
        Sample sample = new Sample();
        int expected = 10;
        int actual = sample.add(8, 2);

        assertEquals(expected, actual);
    }
}
```

単純な足し算のテストです。
成功例のみですが、ごく普通なテストコードです。

#protected,privateメソッドのテスト

インスタンスから、protected,privateメソッドできないため、
リフレクションと呼ばれる方法を使用してテストケースを作成します。

```java:参考
Sample sample = new Sample();
Method method = Sample.class.getDeclaredMethod("<メソッド名>", 引数の型1, 引数の型2...);
method.setAccessible(true);
int actual = (戻り値の型)method.invoke(<インスタンス>,引数1,引数2...);
```
どのクラスにも存在するclass変数を使用して、`getDeclaredMethod()`メソッドで
メソッドを取得します。

取得したメソッドの`setAccessible(true)`とします。
これは、外部からアクセスすることを許可するための設定です。
その後、`method.invoke()`メソッドでメソッドを実行します。

実際にテストケースを作成します。

```java:SampleTest.java
import static org.junit.Assert.*;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import org.junit.Test;

public class SampleTest {

    @Test
    public void testMinus()
        throws NoSuchMethodException,
        SecurityException,
        IllegalAccessException,
        IllegalArgumentException,
        InvocationTargetException
    {
        Sample sample = new Sample();
        int expected = 6;

        Method method = Sample.class.getDeclaredMethod("minus", int.class, int.class);
        method.setAccessible(true);

        int actual = (int)method.invoke(sample, 8, 2);

        assertEquals(expected, actual);
    }

    @Test
    public void testMultiplication()
        throws NoSuchMethodException,
        SecurityException,
        IllegalAccessException,
        IllegalArgumentException,
        InvocationTargetException
    {
        Sample sample = new Sample();
        int expected = 16;

        Method method = Sample.class.getDeclaredMethod("multiplication", int.class, int.class);
        method.setAccessible(true);

        int actual = (int)method.invoke(sample, 8, 2);

        assertEquals(expected, actual);
    }
```

#おわりに
これで、作成したメソッドはすべてテストできるようになりました。

プログラマーにとって、バグは最大の敵です。
可能な限りバグを取り除く努力をしましょう。
AmazonMWSへアクセスする


商品を取得したり、商品や注文を送信する

### peddler を使う

https://github.com/hakanensari/peddler

```ruby:Gemfile
gem 'peddler'
gem 'nokogiri'
```

Nokogiri はレスポンス管理用

### XML を作成

XSDを元に作成する

### 環境変数を設定しておく

```
export MWS_MARKETPLACE_ID=<マーケットプレースID>
export MWS_MERCHANT_ID=<出品者ID>
export AWS_ACCESS_KEY_ID=<アクセスキー>
export AWS_SECRET_ACCESS_KEY=<秘密鍵>
```
### フィードのアップロード（バッチ処理登録）

```ruby
require 'peddler'
client = MWS.feeds
parser = client.submit_feed(File.read("sample.xml"), feed_type)
doc = Nokogiri::XML(parser.body)

# submissionidを表示させる
put doc.xpath(".//mws:FeedSubmissionId", {"mws"=>"http://mws.amazonaws.com/doc/2009-01-01/"}).first.content
```

* feed_type は、
http://docs.developer.amazonservices.com/en_US/feeds/Feeds_FeedType.html
の　Enumeration Valueを文字列で指定する。

　eg)

```ruby 
client.submit_feed(File.read("sample.xml"), "_POST_PRODUCT_TYPE_")
```

* 出力された submissionid は次のレスポンスチェックで使う

### バッチ処理結果チェック

バッチ処理の結果を

submissionidが 123457891 の場合を想定

```ruby
require 'peddler'
client = MWS.feeds
parser = client.get_feed_sumission_result("123457891")
```
Flash Sample with twitter-bootstrap-rails

twitter-bootstrap-rails でもって、rails の [flash メソッド](http://railsdoc.com/references/flash) を使ってみました。コレってイイ感じですね。

# インストール
詳しくは下記参照ということで…。

https://github.com/seyhunak/twitter-bootstrap-rails

```ruby:Gemfile
gem 'therubyracer' # javascript runtime。lessをコンパイルするために必要
gem 'less-rails' # Railsでlessを使えるようにする。Bootstrapがlessで書かれているため
gem 'twitter-bootstrap-rails' # Bootstrapの本体
```

Gemfile に上記を加えてインストールします。turbolinks が既にコメントにあるなら、それを外すのでもいいです。

```shell-session
$ bundle install
$ rails generate bootstrap:install
```

# view ファイルの作成
下記の行を入れる。だけでいいんです。

```html+erb
<%= bootstrap_flash %>
```

```html+erb:app/views/layouts/application.html.erb
<!DOCTYPE html>
<html>
  <head>
    <title>FlashApp</title>
    <%= stylesheet_link_tag('application', media: 'all',
                            'data-turbolinks-track' => true) %>

    <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
    <%= csrf_meta_tags %>
  </head>
  <body>
    <div class="container">
      <%= bootstrap_flash %>
      <%= yield %>
      <%= debug(params) if Rails.env.development? %>
    </div>
  </body>
</html>
```

# コントローラから flash 呼び出し

```rb
flash[:success] = "Welcome!"
```

# 実行
こんな感じの html.erb 作って…
![FlashApp1.png](https://qiita-image-store.s3.amazonaws.com/0/28376/a3263c07-6469-ce70-e2ca-9d07c710a118.png)

サインイン成功するとこんな感じに。右上のバッテンで閉じる事ができます。
![FlashApp3.png](https://qiita-image-store.s3.amazonaws.com/0/28376/1c2225d8-6201-1c15-ac73-4da78dff6a3d.png)

失敗の場合はこんな感じです。コントローラの作成は省略します。
![FlashApp2.png](https://qiita-image-store.s3.amazonaws.com/0/28376/925bb029-4de0-1247-ed40-6433fd7cb215.png)

＃ ちょっと画像が見づらいですか。
＃ markdown で画像の周りに枠線かけるのどうするんだぜ…？

とまあ、それだけのしょーもないものですが、heroku にアップしたのでご笑覧下さい。
https://guarded-river-1131.herokuapp.com/
Password に「foobar」と入力するとサインインします。それ以外ならエラーです。Email は任意です。
そのうち消すと思います。ご了承下さい。
Pythonローカル開発環境の構築その2(pyenv-virtualenv, pip使い方編）


# pyenv-virtualenvの使い方

## virtualenv作成&設定

```
% pyenv versions
  system
  2.7.6
% pyenv virtualenv 2.7.6 test-env
% pyenv virtualenvs
  * test-env (created from $PYENV_ROOT/versions/2.7.6)
% pyenv activate test-env
% pyenv version
  * test-env (set by $PYENV_ROOT/versions/2.7.6)
```

## virtualenv消去

```
% pyenv uninstall test-env
% pyenv virtualenvs
% pyenv versions
```

# pipの使い方

## パッケージをインストール

```
% pip install nose
% pip list
  nose (x.x.x)
```

## インストールされているパッケージを保存(freeze)

```
% pip freeze > pip.list
% cat pip.list
  argparse==1.2.1
  configobj==5.0.6
  coverage==3.7.1
  logging==0.4.9.6
  mysql-connector-python==2.0.1
  nose==1.3.4
  six==1.8.0
  unittest-xml-reporting==1.9.2
  wsgiref==0.1.2
```

## freezeしたパッケージをインストール

```
% pip install -r pip.list
```

## パッケージのアンインストール

```
% pip uninstall nose
% pip list
```
elasticsearch-railsで任意のリクエストを送れるperform_requestメソッドが便利

```ruby
Blog::Post.__elasticsearch__.client.perform_request(:get, 'blog-posts/_count').body
=> {"count"=>2, "_shards"=>{"total"=>5, "successful"=>5, "failed"=>0}}
```

という感じで任意のHTTPリクエストを送れる便利メソッドです。

詳しくは元記事で：[elasticsearch-railsで任意のリクエストを送れるperform_requestメソッドが便利](http://blog.enogineer.com/2014/10/31/elasticsearch-rails-perform-request/)
他の人が書いたQiitaのマークダウンを確認

他の人が書いたQiitaマークダウンを参考にしたいなと思って調べてみた。

まず、curlでQiitaAPIを叩く方法はこれ。
[他の人が書いたQiita投稿のMarkdownを見るワンライナー](http://qiita.com/suin/items/b6d59ec274e1ab07ec52 "他の人が書いたQiita投稿のMarkdownを見るワンライナー")


ブラウザのHTMLソースコードから見る方法はこれ。
Qiita投稿の内容をブラウザのHTMLソースを見るとtextareaタグで囲まれた部分に
投稿内容のマークダウンが書かれている事が判る。

```html:/nightyknite/items/01d472868bf0906cd146
<textarea class="js-task-list-field" id="raw_body" name="raw_body">
PC側にインターネット共有を設定して、RaspberryPiをLANで繋ぐと
一定の法則でIPアドレスが割り当てられるので、ルールを知っているとSSHで接続したりするとき便利。

##Macの場合
インターネット共有でつないだ端末には無線LANでは10.0.2.0/24、有線の場合は192.168.2.0/24でIPが割り振られる。Macと有線LANで直接繋いだRaspberryPiは192.168.2.2となり、
`$ssh pi@192.168.2.2`で繋がる。

参考
http://weekly.ascii.jp/elem/000/000/136/136392/
https://discussionsjapan.apple.com/thread/10061520

## Windowsの場合
インターネット共有で繋いだ端末は192.168.0.0/24でIPが割り当てられるので、
Windowsと有線LANで直接繋いだRaspberryPiは192.168.0.2となり、
`$ssh pi@192.168.0.2`で繋がる。

参考
http://support.microsoft.com/kb/306126/ja

</textarea><input name="commit" type="submit" value="Save changes" />

```


なので、id="raw_body" で始まるtextareaタグの中身をブラウザのHTMLソースコードで直接見る。
もしくはブラウザのConsole上で

```bash:
$("#raw_body").val()
```

と入力して該当の内容を取得すると良いかも。

その内容を自分のQiita投稿ページでプレビューしてちゃんと表示されればOK。

尚、Qiitaテーブル記法などは、TABLEタグに変換されて、エンコードされてしまっているようだ。
俺的フロントエンドエンジニア三種の神器に認定したCharlesについて 〜その1〜 Charlesの素敵なところ

個人的にフロントエンドエンジニア三種の神器の一つとして認定した。

特にハイブリッドアプリ（いわゆるガワネイティヴ）のデバッグですごく重宝している。

でもちょっと癖のあるUIで取っ付きにところもあり、こいつの魅力を伝えることを妨げる一因にもなっているように思える。

ということで、フロントエンジニア目線で何回かに分けてCharlesの使い方を紹介していこうと思う。

もちろんフロントエンジニアじゃなくても便利に使えるツールなので知らなければ何が出来るかくらいはちょっと見て欲しい。

# Charlesの素敵なところ

![charles.png](https://qiita-image-store.s3.amazonaws.com/0/31639/1e3ff84e-6b57-87f9-d9dd-d60d3392edbd.png)

## SSLに対応したMITM(Man In The Middle)プロキシサーバーであるところ

ブラウザなどのクライアントとインターネットの中間者となり、その間に流れてくるデータ、つまりHTTPリクエスト、レスポンスの内容を記録したり変更することが出来る。

また、CAとしての役割も果たすことができるためSSLの通信内容も復号化して上記と同様のことが出来る。

この機能がこのツールの土台になっている。

同様のツールとしては[mitmproxy](http://mitmproxy.org/)というCLIベースのものもあるので、この手のことがやりたくてGUIなんかいらなくてお金も払いたくない人はこっち使ったほうがいいかも。


## リクエストを他のリモートホストへのリクエストにすげ替えることができる

例えば、本番のアプリケーションをターゲットにして画像やJavascriptなどのWebアセットだけローカルマシンのWebサーバーを見るようにするようなマッピング設定ができる。

サーバーへのデプロイをしないで気軽にWebリソースをすげ替えられるのは至極便利。

## レスポンスをローカルマシンのデータにすげ替えることができる

特定のレスポンスをローカルマシンのファイルにマッピングすることができる。

これもサーバーへのデプロイをしないで気軽にWebリソースをすげ替えられるのは至極便利。

## リクエストやレスポンス単位にブレークポイントを設定できる

プログラムのデバッグ時にはブレークポイント設定してそこまでの処理を一時的にストップさせて、その時点の変数の状態などをモニタリングしたり、時には書き換えたりすると思う。

同様のことがHTTPのリクエスト、レスポンスの単位で出来る。

例えばヘッダー情報を書き換えたりとかBodyを書き換えたりだとかがリアルタイムに出来る。

## やりとりした通信をセッション情報として保存したり復元できる

保存したデータはテキストベースのファイルとして書き出せるので他のメンバと共有したりできるので便利。

また、セッション情報があればアプリケーションのクライアントが無くてもCharlesさえあれば同じリクエストを再送信できるのでやっぱり便利。

## 通信帯域幅のシミュレーション

通信帯域を絞ったりできる。

3Gなどの環境を想定して動作確認をする場合重宝する。

モバイル端末をクライアントにCharlesを使う場合はWifiネットワークを経由することが前提になるため、ユーザーの通信環境と乖離した通信環境でテストしてしまいがちなので、この機能は結構重要。

ChromeのCanary版でも同様の機能あり。


## マルチプラットフォーム対応

Mac版、Windows版、Linux版がある。

Windowsには[fiddler](https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0CCIQFjAA&url=http%3A%2F%2Fwww.telerik.com%2Ffiddler&ei=Cp9SVIXIO4W4mAXw24LwCA&usg=AFQjCNGY5eqyh8uRUDSYsPDDbTNL4aUgVw&sig2=cpfERdn2UfP5o7tpPUAh9w)とかあるが、この手ツールを使いこなすにはそれなりの学習コストを支払うことになるのでどこでも使えるのは嬉しい。

特に流れ者エンジニアにとっては重要なところ。

## Webインターフェース

Charlesを起動するとhttp://control.charles/ でWebインタフェースにアクセス出来る。

モバイル端末でテストするとき端末側である程度Charlesを制御できるので便利。

また、これはCharlesの制御がWeb APIとして公開されていることも意味しているので、作業の自動化や何か面白い事ができそう。

## お手軽な負荷テストができる

JMeterなどの専門系には敵わないがちょっとした確認には便利。

## その他（あんまり触ってないが素敵っぽいと思われるところ）

* ルールに沿ってリクエストとレスポンスの各種情報をリライトできる
* 扱えるリクエストとして他にも[Protocol Buffers](http://ja.wikipedia.org/wiki/Protocol_Buffers)やフラッシュ系がある
* ネットワークのタイムラインが見れる（Chrome Devtoolsのほうが見やすいが）
* リクエスト単位でブラウザキャッシュさせなくしたりできる
* レスポンスをW3C Validatorにかけることができる

# Charlesの人によっては素敵じゃないところ

*有料（US$50）*

レジストしないと時間制限付きになるがその都度立ち上げれ使い続けられなくもない。
が、ここはエンジニアの心意気を見せるところなので気に入ったら是非とも購入を。

バージョンアップ時はこんな感じの料金体系みたい（情報古いかも）

* マイナーバージョンアップは無料。(例：3.0の0の部分)
* メジャーバージョンアップする場合は有料。(例：3.0の3の部分)
  * ただし購入３ヶ月以内なら無料。
  * それ以外は40％オフで購入可。

# その他

Charlesを導入は[通信系のデバッグには Charles が便利](http://qiita.com/CarmineScarlet/items/d340e87da98e62f99b60) を参考にすればよいと思う


# 次回

* [俺的フロントエンドエンジニア三種の神器に認定したCharlesについて 〜その2〜 インストールと設定](http://qiita.com/dayoshix/items/d02e46b033b8f7d9f471)

* [俺的フロントエンドエンジニア三種の神器に認定したCharlesについて 〜その3〜 最初に覚えたい基本的なこと](http://qiita.com/dayoshix/items/9bfce504686108545757)

* [HTTPリクエストにCharlesでブレークポイントを貼ってみる](http://qiita.com/dayoshix/items/6e0d95b0cc0ea6f392bf)
twitterメール通知でスマホに夜中起こされないようにする方法

寝ている時間帯にお気に入り登録されるとメール通知が来て起きてしまった。
設定を変更できることに気がついたので一応共有しておく。

![スクリーンショット 2014-10-31 4.57.07.png](https://qiita-image-store.s3.amazonaws.com/0/25728/970c93c7-27fc-bd3c-0bc9-f8df49fc9144.png)

と思ったら、スマホアプリ側も通知設定あった！
`{ ... }` と `do ... end` の違いと使い分けるべきシーン


ブロック付きメソッド呼び出しを記述する際には `{ ... }` あるいは `do ... end` を使うと思います。
しかしこれらは厳密にいうと異なります。
その違いは __結合強度__ です。

### `{ ... }` の場合

```ruby
some_method other_method { ... }
```

この式は次のように解釈されます。

```ruby
some_method(other_method{ ... })
```

### `do ... end` の場合

```ruby
some_method other_method do ... end
```

この式は次のように解釈されます。

```ruby
some_method(other_method) do ... end
```

## 使い分けるべきシーン

### `{ ... }` を使うべき
* メソッドの戻り値を利用する場合
* メソッドチェーン(a.foo{}.bar{}.baz{})をする場合
* 1行で記述できる場合

### `do ... end` を使うべき
* 上記以外の場合、基本こちらを使うべき。


## Ref.
* 初めてのRuby