OmniAICreator/Qiita-1.07M huggingface dataset:
CloudStack GUI改造のためのお役立ちツール

こんにちは。CUPA荒井です。
巷では正月休みということですが、こちらはようやく仕事納め？という感じです。

今日はCloudStack Advent Calendarネタ(かなり遅れてますが、、)も兼ねてCloudStack GUIをカスタマイズする上で、知っておいて損のないツールを説明します。
Cloudstackをサービスとして使い始めると特定のメニューを消したい、追加したい、操作を制限したいなど思うことがあります。この場合にはCloudStackのJavaScriptファイルをいじることになります。

CloudStackのGUIを編集するにあたりこれから紹介するようなツールを使うか使わないかで大きく生産性が変わるので、最低限知っておきたいツールを紹介します。

#### Firebug

Web開発者であれば押さえて置かないと行けないツール(だと自分は思っている）のですが、インフラエンジニアも入れておくと非常に便利なツールです。

インストール方法：
FirebugはFirefoxのaddonなので簡単にインストールすることが可能です。
以下のサイトからダウンロードを選択し、手順通りクリックするだけでインストールできます。
https://addons.mozilla.org/ja/firefox/addon/firebug/

インストールするとFixfoxの右上に「虫」のアイコンが現れるので、こちらをクリックするだけで起動できます。

##### CloudStackでの主な使い方：
1) 「スクリプト」タブにて各JavaScript(js)ファイルの内容を確認し、デバッグを行うことができます。
![スクリーンショット 2014-12-27 18.32.12.png](https://qiita-image-store.s3.amazonaws.com/0/50813/f2d8a3d8-903e-2da5-c092-8b152931b357.png)
2) 「ネット」タブにてブラウザとMSサーバのAPI発行とそのリクエスト／レスポンンス内容を確認することができます。
エラー応答やCloudStackの応答が遅いなどの問題の切り分けに非常に重宝します。

![スクリーンショット 2014-12-27 18.32.31.png](https://qiita-image-store.s3.amazonaws.com/0/50813/120ace0e-1242-ac13-55ce-314752fe72a2.png)

ここで紹介するのはほんの一部でFirebugには非常に豊富な機能があります。是非インストールしておくことを奨励します。

#### Charles Proxy

HTTP Proxyとして動作し、その通信内容を表示できる他、
指定したファイルを書き換える等の機能ももっています。

インストール方法：
こちらも各OS毎のパッケージが提供されているのでインストールは非常に簡単です。以下のHPよりDownloadを選択し、利用しているOSに併せたパッケージをインストールしましょう。
http://www.charlesproxy.com/

インストールしたら Charles Proxy を起動します。
起動後、ブラウザのProxy設定にて Charles Proxy のポート(デフォルトでは 8888)を指定します。
![スクリーンショット 2014-12-26 1.20.56.png](https://qiita-image-store.s3.amazonaws.com/0/50813/51a80d99-a075-5780-fb46-bd4942b499ec.png)

この状態でブラウザで通常どおりアクセスを行うだけで、通信内容がCharles Proxyによって解析され表示されるようになります。
![スクリーンショット 2014-12-26 1.21.33.png](https://qiita-image-store.s3.amazonaws.com/0/50813/1c8eb1f5-06f7-73e1-65d0-4cb31c36b368.png)

さらに特定のファイルを置換えることも可能です、
以下の例では CloudStack のロゴをローカルのものと置換えています。
![スクリーンショット 2014-12-31 22.40.15.png](https://qiita-image-store.s3.amazonaws.com/0/50813/80232dc3-2a73-fe6a-72c7-5eee96793986.png)

ロゴが変換され、僕と契約して（以下略
![スクリーンショット 2014-12-31 22.43.53.png](https://qiita-image-store.s3.amazonaws.com/0/50813/7709575b-b12b-cc63-b55f-4c36889496c5.png)

上記は画像ファイルですが、同様に JavaSciprtファイルも指定することも可能です。こうすることで、サーバ上のファイルを変更することなく、JavaScriptファイルの改変内容をチェックし、動的にデバッグすることが可能になります。

是非皆さんも ~~僕と契約してCloudStackユーザに~~ これらのツールを利用して環境に適した CloudStackを作りましょう！
NNTPサーバについて調べてみた

NNTPとは、掲示板のようなもの。NEWSサーバとも呼ばれる。
usenetとも。早い話が2chのようなもの

ダイアルアップ接続の時代にNEWSをダウンロードし読む、
オフラインで書き込んだ記事をNEWSにUPする
といった使い方がされていた模様。

昔はプロバイダが自由に使えるNNTPサーバを提供していたが時代の流れとともに衰退していった。
ググってみた感じ、日本ではどこも提供していない様子。

オフラインのキャッシュ対応と、クライアントソフトを選択出来るのがwebサービスと違うメリットか。

## inn2

NNTPサーバ。投稿を記録するサーバ。
設定がsendmail並に見る気がしないカオス。
設定ファイルは /etc/news/ に色々ある。

```bash:
yum install -y inn
systemctl start innd
```

## leafnode

NNTPサーバに投稿や取得する君。leafnodeには投稿を記録する機能はない。
設定ファイルは /etc/leafnode/config
こちらはまあ読む気になれる。

```bash:
yum install -y leafnode
systemctl start leafnode.socket
```


## 操作

```bash:
$ telnet localhost 119
```

* list
  * グループ一覧取得
* post
  * 投稿。telnetだと辛いのでThunderbirdから投稿するのが良い。
  * 添付ファイルも投稿可能な様子。

### 投稿例

```bash:
$ telnet localhost nntp
post

Newsgroups: junk
Subject: Test
From: mine

This is Test.
.
```

権限があればこれで投稿できるっぽい。
Chrome ConsoleとJQueryでDOMツリーからデータ加工するメモ


ほぼ初めてなので実際はさくっととはいかなかったけど、次はさくっと行けるようにメモ。

### やりたいこと
[ブログ](http://satzz.hatenablog.com/entry/2014/12/31/205805)書いてて[ブクログ](http://booklog.jp/users/satzz)の本棚からはてな記法を生成したかった。


### Chrome ConsoleでJQueryを使えるようにする

こちらをそのまま参考にさせていただきました。
http://qiita.com/cognitom/items/babefa7b85ffc050d4bd

```console:
> (script = document.createElement('script')).src = 'http://code.jquery.com/jquery-latest.min.js'
> document.getElementsByTagName('head')[0].appendChild(script)
```

### DOMツリーを調べる


どのへんのDOMツリーを見るのか適当にあたりをつける。

`item-img-area`の下におりていってASINをとればよいっぽい。

![スクリーンショット 2014-12-31 22.00.46.png](https://qiita-image-store.s3.amazonaws.com/0/281/c85e27da-2b5f-9ba4-4466-6fa8c6526bac.png "スクリーンショット 2014-12-31 22.00.46.png")


### データを加工する
CSSセレクタとかJQueryのドキュメントとか見ながらほげほげする。

```console:
> $(".item-img-area").children("a").map(function(){var asin = $(this).attr("href").split('/')[3]; return "[asin:"+asin+":image]"})
```

### 結果

![スクリーンショット 2014-12-31 19.36.47.png](https://qiita-image-store.s3.amazonaws.com/0/281/e23c7ce1-c576-28b6-bfd4-f141d097f75f.png "スクリーンショット 2014-12-31 19.36.47.png")

あとははてなブログとかにコピペすればよい。
数が少ないので手でやってもいいじゃんっていう気になるし何かもっとよいお題があればよかった。
パッケージの削除に失敗する場合 --noscripts を指定すればよい

スクリプトのエラーが出て削除出来ない。

```bash:
# yum remove leafnode
読み込んだプラグイン:etckeeper, fastestmirror
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ leafnode.x86_64 0:1.11.8-13.el7 を 削除
--> 依存性解決を終了しました。

依存性を解決しました

====================================================================================
 Package            アーキテクチャー バージョン               リポジトリー     容量
====================================================================================
削除中:
 leafnode           x86_64           1.11.8-13.el7            @epel           1.2 M

トランザクションの要約
====================================================================================
削除  1 パッケージ

インストール容量: 1.2 M
上記の処理を行います。よろしいでしょうか？ [y/N]y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
etckeeper: pre transaction commit
/var/tmp/rpm-tmp.MTz6qA: 行 4: $'\302\240:': コマンドが見つかりません
エラー: %preun(leafnode-1.11.8-13.el7.x86_64) スクリプトの実行に失敗しました。終了ステータス 127
Error in PREUN scriptlet in rpm package leafnode-1.11.8-13.el7.x86_64
etckeeper: post transaction commit
  検証中                  : leafnode-1.11.8-13.el7.x86_64                       1/1

失敗:
  leafnode.x86_64 0:1.11.8-13.el7

完了しました!
```

`完了しました!`じゃねえよ :anger:

## --noscripts を指定すればよい。

```bash:
# rpm -e leafnode --noscripts
```
Juliaを使ってロジスティクス回帰をした時に苦労したこと



## 本エントリについて

会社で隔週で統計やデータマイニングに関する勉強会を行っており，
その中で輪読していたデータ解析のための統計モデリング入門(通称緑本)における4章のロジスティクス回帰を担当した際に
書籍のサンプルコードをすべてJuliaでやってみようと試みた時に苦労したことの記録になります

ハマったのは２つで

- カテゴリカル変数をそのまま扱えない
- binomialをfamilyに指定する際にライブラリの仕様によって目的変数に2次元の値を指定できない

## カテゴリカル変数をどう扱うか

RのDataFrameやPythonのPandasを用いた場合は読み込んだデータをそのまま用いることができるがJuliaの場合はカテゴリカル変数をそのまま適用することができなかった．

Juliaでカテゴリカル変数を扱う場合にはPooledDataArray型に変換してあげる必要があります．

http://dataframesjl.readthedocs.org/en/latest/pooling.html?highlight=pooled

サンプルデータは以下のようにF要素がカテゴリデータになっています

![kobito.1420024651.396517.png](https://qiita-image-store.s3.amazonaws.com/0/2238/740bf50c-7659-5f1b-d6dc-855c36fcec83.png "kobito.1420024651.396517.png")


```julia
data = readtable("data4a.csv")
data[:f] = convert(PooledDataArray,data[:f])
```

こうするとカテゴリカル変数をGMLライブラリで扱えるようになります．


## familyにbinomialを指定する際に目的変数に2次元の値を指定できない


https://github.com/JuliaStats/GLM.jl/blob/v0.3.2/src/glmfit.jl#L17-L18

上記のようにJuliaのGLMでfamilyに指定した場合には目的変数が0.0~1.0の範疇でなくてはならないという条件が設定されています.

https://github.com/statsmodels/statsmodels/blob/master/statsmodels/genmod/families/family.py#L773-L778

上記はpythonのstatsmodelの場合ですが，
1次元の場合は値をそのまま，2次元の値(a, b)の場合はa/(a+b)の値を返すような実装になっています．

binomial(二項分布)はN(=a+b)回ある事象を発生させた時にa回成功してb回失敗するといった現象を表すのに用いられます．
もともとa/(a+b)を返すのだし，そのまま成功確率としてa/(a+b)を与えればJuliaも共通になると思われるかもしれませんが，
その場合Nがいくつだったかという情報が欠損してしまうことになります．
結果として不適切な最適化が行われてしまう可能性があるということです．


## まとめ

JuliaでやってみてやっぱりPythonって便利だなーって思ったのが第一感です．
ドキュメントが充実していたり，実際にやってみた系の情報が多いのであまり未知のトラブルにぶつかることも少ないです．

しかしJuliaにはこうやっていろいろ調べて行きながら元コードに当たったり，実装を持ってきたであろう別言語の実装に当たったりすることでいろいろな発見があって非常に面白く
またコード自体が非常に親しみやすいフォーマットで書かれているために元コードにあたって調べるのも比較的容易です（主観）

まだまだ成長段階の言語で，ライブラリなどは更に成長段階でありますが，そういった初期のころにしか味わえないわくわく感を味わいたい方は是非Juliaの世界に足を踏み入れてみてはいかがでしょうか


## 蛇足

GLMのJulia解説記事ぐらいだれか書いてるだろと思って書き始めたらそもそもなかったので次はそれを書きます…
OS X YosemiteのVagrant Boxを作る


[BOXEN](https://boxen.github.com/)や[osxc](http://osxc.github.io/)など最近はOS Xの環境構築を自動化するソフトも増えてきました。初期状態から走らせてみたいけどLinuxの様に簡単にはいかないよな……と思っていましたが、時代は進歩するもので結構簡単にOS XのVagrant Boxが作れるようになっていました。すべてはVagrantの作者Mitchell Hashimotoさんのおかげです。


## 必要な物
- Mac
- [Virtual Box](https://www.virtualbox.org/)
- [Packer](https://packer.io/)

```shell:command
brew tap homebrew/homebrew-binary
brew install packer
```

## 手順

「Yosemite」で検索して「Install OS X Yosemite.app」をダウンロードします。

![Screen Shot 2014-12-31 at 15.27.13.png](https://qiita-image-store.s3.amazonaws.com/0/17890/d2e262c2-5412-c9fc-1714-ea21239e9249.png "Screen Shot 2014-12-31 at 15.27.13.png")

Packerという仮想環境でのOSインストール自動化ソフトを利用します。

[OS X用のPackerの設定がもうある](https://github.com/timsutton/osx-vm-templates)のでそれを利用してます。

とりあえずさっきダウンロードしたものをISOにします。

```shell:command
$ git clone https://github.com/timsutton/osx-vm-templates
$ sudo sh prepare_iso/prepare_iso.sh /Applications/Install\ OS\ X\ Yosemite.app/Contents/SharedSupport/InstallESD.dmg .
```

packerではこのISOからVirtualBoxにVMを作成してboxにしてくれるところまでやってくれます。

さきほどの出力にMD5と新しいdmgファイルがあると思うのでそれらを指定してpackerを起動します。

```shell:command
$ cd packer
$ packer build \
  -var iso_checksum=1092ac46d87dbe6ca1b9664ba27d7412 \
  -var iso_url=../OSX_InstallESD_10.10.1_14B25.dmg \
  -var autologin=true \
  -only virtualbox-iso \
  template.json
```

boxになったと思うのでboxを追加することで好きに使えるようになりました。

```shell:command
$ vagrant box add osx-yosemite packer_virtualbox-iso_virtualbox.box
```
よく使用するgitコマンド自分用まとめ！

# Gitコマンド

## git clone
リモートリポジトリをローカルに持ってくる。

## git pull
だいたい、--pruneを付ける
ローカルリポジトリを最新に更新する。
--pruneを付けることで、リモートで消されたブランチを削除する。

## git add
インデックスに登録する。

## git commit
-vをよく使う。
インデックスに登録したファイルをローカルリポジトリに登録する。
-vを付けることで、変更履歴を見れる。

## git push
ローカルリポジトリに登録したファイルを、リモートリポジトリに登録する。

## git branch -a
ブランチ一覧を表示
-aを付けることで、リモートリポジトリに存在するブランチも一緒に表示する。

## git log
コミット履歴を表示

## git diff
ファイルの差分を見る

git reset --hard HEAD^
一つ前のcommitを取り消す

## git checkout
ブランチ名を入れることで、ブランチ間を移動する。
ファイル名を入れると、変更を過去に戻す。

## git merge
ブランチを統合する。

## git tag
タグを打つ。

## gitk& --all
ツリーを表示する
slackからQiitaAPI経由でQiita投稿するhubot-script


##初めに

Qiita:Teamを使うほどじゃないけどQiitaにドキュメントを残したいって需要が小さなチームにはあると思います。
今回は普段のミーティングの議事録をSlackで書いて、Qiitaに投稿するHubotスクリプトを書いてみました。

手前味噌ですが、QiitaAPIでNode.jsからの投稿はこちらを参考にしましょう。
http://qiita.com/n0bisuke/items/336be188fb37b69f6112

##準備

Qiita_TOKENという環境変数にアクセストークンをセットしておきます。

herokuの場合は

```
$ heroku config:add QIITA_TOKEN=**************
```

で設定できます。

##ソースコード

```
// Description:
//   Messing around with the qiita API.
// Commands:
//   hubot qiji-post 'contents'  - Return post title and so on.

var moment = require('moment');
var m = moment();
var Qiita = require('qiita-js');
var TOKEN = process.env.QIITA_TOKEN;

var options = {
    "body": "",
    "coediting": false,
    "gist": false,
    "private": true,
    "tags": [
        {
            "name": "議事録"
        }
    ],
    "title": "",
    "tweet": false
};

//コマンド実行
module.exports = function(robot) {
    robot.respond(/qiji-post (.+)$/i, function(msg){
        //引数チェック
        if(!msg.match[1]) msg.send('?! 引数が足りません');
        options.title = '議事録' + m.format("YYYY年MM月DD日 HH:mm:ss");
        options.body = msg.match[1];
        Qiita.Resources.Item.create_item(options).then(function(res){
            var output = res.title + 'を投稿しました。' + res.url;
            return msg.send(output);
        });
    });
};
```

##実行

こんなイメージです。

![](http://i.gyazo.com/1f7f7461dc63a1f4f4aea99c4efcfa37.png)


アカウントはチームで一つBOT用に作成しておき、アクセストークンなどはチーム共有にするイメージです。

議事録といいつつ、slackからは記事作成だけして、詳細はコメント欄でやるのがいいかなと思ってます。
システム開発 手順書

開発時に、いつもぶれるので、纏めておく。
各ドキュメントは、開発に必要か、どの程度の粒度で作るかを事前に確認すること。

# 要件定義
1. 要件ヒアリング
    2. 要件の聞き込み調査、議事録質疑応答などで、Ｉｓｓｕｅリストを作成

2. 業務フロー作成
    3. とりあえず業務フローをつくって、情報整理。要件ヒアリングとも整合性を合わせる。

3. ユースケース作成
    4. 要件ヒアリングと、業務フローを元に、ユースケースの作成

4. 画面遷移図
    5. 画面遷移のみを考慮。この時点で技術的な考慮は行わない。

5. 画面モックアップ
    6. この時点のモックアップは作りすぎないこと。（でないとコストオーバー）
    6. 主要画面や技術的に確認する部分に特化させること。
    7. 作成したものは基本的に、以降の開発に生かすように作成
    8. プロジェクトのトッププログラマに委任、後の開発時に技術的な部分を任せることも視野に入れる。

# 基本設計
基本設計になると、同時進行で作成する成果物が多いので、柔軟に対応すること。

1. 基本設計初期
大まかに概要を設計する段階。あまり資料を書き込みすぎない。悩みすぎない。

    2. ロバストネス図
    3. データーフロー図
    4. 画面レイアウト

2. 設計中期
初期の設計の資料に承認を得た物から、以降の開発を行うこと。
全機能の細かい部部まで作る必要なし。部分的な箇所、問題になりそうな箇所だけで良い。
    4. ドメイン設計（ここは時間をかけた方が良い）
    5. クラス設計
    4. シーケンス図
    5. 画面レイアウト
    6. 画面項目定義
    7. ユースケースシナリオ

3. 基本設計後期
この時期には、システムの整合性を保つための作業を行う。
    1. ユースケースシナリオのブラッシュアップ
        2. 整合性を保つこと。
    2. モックアップのブラッシュアップ
        3. 確認事項が増えた項目についてモックの追加
iOSのタブバーに画像付きボタンでハックする


iOSのタブバーに画像付きボタンを出すことでタブバーハックをしましょう。ハックすることで、通常のタブバーよりもアイキャッチを取ることが可能です。

![スクリーンショット 2014-12-31 21.00.30.png](https://qiita-image-store.s3.amazonaws.com/0/63328/cca068ca-a588-9127-7eed-039d5b70a592.png)


TabBarの配下に入る画面ですべてでBaseViewController経由で継承すれば良いです。

```swift:BaseViewController.swift
import UIKit

class BaseViewController: UIViewController {    
    func appendCenterButton() {
        let button: UIButton! = UIButton.buttonWithType(UIButtonType.Custom) as? UIButton
        let image: UIImage? = UIImage(named:"button")
        
        button.setImage(image, forState: UIControlState.Normal)
        button.frame = CGRectMake(0, 0, 60, 70)
        button.addTarget(self, action: "onClick:", forControlEvents:.TouchUpInside)
        button.layer.position = CGPoint(x: self.view.frame.width / 2, y: UIScreen.mainScreen().bounds.size.height - button.frame.height + 40)
        button.layer.borderWidth = 0
        
        self.tabBarController?.view.addSubview(button)
    }
    
    @IBAction func onClick(sender: AnyObject) {
        var storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
        var mainViewController: UIViewController
        
        mainViewController = storyboard.instantiateViewControllerWithIdentifier("data")  as UIViewController
        // タブバーを非表示にする
        mainViewController.hidesBottomBarWhenPushed = true;
        self.navigationController?.pushViewController(mainViewController as UIViewController, animated: true)
    }
}

```
Android studioでの、AndroidWearテスト実行　自分用メモ

###android studioでのwatch faceのデバッグ
---

bluetooth経由の実行だと、Runしてから反映されるまでに結構時間がかかるので、注意する。android studioの下の方の表示（4:Run）で、Successまで出ればok?

---
Waiting for device.
Target device: asus-asus_zenwatch-localhost:4444
Uploading file
	local path: /Users/eoppp/Downloads/eopppSimple/wear/build/outputs/apk/wear-debug.apk
	remote path: /data/local/tmp/com.eoppp.eopppsimple
Installing com.eoppp.eopppsimple
DEVICE SHELL COMMAND: pm install -r "/data/local/tmp/com.eoppp.eopppsimple"
pkg: /data/local/tmp/com.eoppp.eopppsimple
Success

---

###レイアウトxmlファイル内での、tools:context
---
この属性は、典型的にはレイアウト XML ファイルのルート要素に付けられるもので、そのレイアウトがどのアクティビティで使われるものかを指定する (この値は単にデザイン時に使われるもの; 実際にはそのレイアウトをどのアクティビティと一緒に使っても問題ない)。 この値を指定しておくことで、例えばレイアウトエディタがデフォルトテーマを決めたりできるようになる。 Manifest ファイル中でのドットでのデフォルトパッケージ名の省略と同じことがこの属性の値でも可能。

http://vividcode.hatenablog.com/entry/android-app/tools-attributes

###dimens.xml
---
デフォルトのテキストサイズとかを記述しておく。なくてもok
http://htomiyama.blogspot.jp/2013/02/androiddimensxml.html

###styles.xml
---
AndroidではThemeというデザインを統一する仕組みがあります。

Themeを使用すると背景や文字色、各UIコンポーネントをアプリケーションやActivty単位で統一できます。

これは非常に便利な機能ですが、アプリを作っているとこの部分だけは違うデザインにしたいと思う箇所が出てくると思います。

そういう場合はstyle.xmlを使用して変更したい部分のデザインのみを変更するという方法が存在します。
http://techbooster.jpn.org/unclassified/7468/

###android studioとGitHubとの連携
---
http://dev.classmethod.jp/smartphone/android/android-studio-git-integration/

###android wearのスクリーンショットの撮り方
---
http://s-max.jp/archives/1624539.html

###android studioでの署名付きapkの作成
---
http://dev.classmethod.jp/smartphone/android/android-app-how-to-release/
Androidでコードカバレッジがどんな感じで測れるのか

## はじめに

[前回](http://qiita.com/cattaka/items/901432bcbfce12016961)のAndroidでJUnitがどんな感じで動くのかに続き、今回はコードカバレッジがどのような感じで測れるのかについてご紹介します。

## 設定を有効にする

Androidのビルドシステムでは[new-build-system](http://tools.android.com/tech-docs/new-build-system)のドキュメントにあるように、0.10.0からコードカバレッジの仕組みとしてJacocoがサポートされています。この仕組みを使用することでJUnitの実行時にどの程度、アプリのコードを網羅しているかを測定することができるようになります。

設定を有効にするにはbuild.gradleにtestCoverageEnabledのオプションを追加するだけです。次の行を追加します。

```gradle
    buildTypes {
        debug {
            testCoverageEnabled true
        }
    }
```

## サンプルアプリ

前回と同じく、使用しているアプリは次のURLで公開しています。

- https://github.com/cattaka/FastCheckList

ソースコードの取得には次の様にgitコマンドを使用して取得してください。

```bash
$ git clone https://github.com/cattaka/FastCheckList.git
```

## コードカバレッジのレポートを作成する

コードカバレッジのレポートの作成にはプロジェクトのルートディレクトリで次のコマンドを実行します。
なお、実機を接続していなかったり、エミュレーターを起動していない場合は"No connected devices!"というエラーがでますのでご注意ください。

```bash
$ ./gradlew createDebugCoverageReport

```

このコマンドを実行すると以下の場所にhtmlファイルとしてレポートが作成されます。アプリのモジュール名やBuild Flavorsの指定によってはディレクトリ構造が若干異なるので、その場合は適宜読み替えてください。

- ./app/build/outputs/reports/coverage/debug/index.html

## レポートの見方

レポートには命令と分岐の網羅度が表示されます。命令の網羅度とはコード上の処理の中で、JUnitの実行中に実際に実行した割合を意味します。分岐の網羅度とは、if文などの分岐においての網羅度を意味します。

レポートのトップページではJavaのパッケージ単位に網羅度を集約した値が表示されます。
これらはクリックして展開していくとパッケージ＞クラス＞メソッドの順で網羅度を閲覧することができます。

![image](https://qiita-image-store.s3.amazonaws.com/0/55138/a9e39ae1-87cc-0896-b4f9-3bca12ea72db.png)

メソッドより詳細に展開すると、コードが表示され、実際に実行されたものは緑で、実行されなかったものは赤色で表示されます。赤色が多い場合はテストのカバレッジが不十分であることを意味します。

![image](https://qiita-image-store.s3.amazonaws.com/0/55138/fdd158c4-45e9-8395-87ef-f5fe4fb1f726.png)

赤色の部分が多い場合は、テストが不十分であるということで、テストの項目を追加することが望まれます。ただし、カバレッジはアプリケーションの品質を表す指標のうちの１つでしかないため、闇雲に追加すれば良いわけではないのでご注意ください。

## カバレッジのレポートのサンプル

[サンプルアプリのカバレッジのレポートはこちら](http://www.cattaka.net/wercker/fastchecklist/outputs/reports/coverage/debug/)

## おわりに

簡単にですがAndroidでコードカバレッジを測定する流れを紹介しました。なんとなくどのように動くのかが伝わりましたでしょうか。

[次回](http://qiita.com/cattaka/items/40ac055bf5a67cb57d9d)はCIを通してテストとコードカバレッジの測定を自動化する方法をご紹介します。
MacOSX で ARM のクロス開発環境を構築する

# はじめに
Mac で ARM のクロスコンパイル環境が欲しかったので、作ってみた。

# 環境
MacOS (Yosemite)
Homebrew 0.9.5

# インストール
下記URLを参考にした。
リポジトリを追加して、色々インストールするみたい。
genromfs と kconfig-frontends が必要なのか分からない。

```
$ brew tap PX4/homebrew-px4
$ brew update
$ brew install genromfs
$ brew install kconfig-frontends
$ brew install gcc-arm-none-eabi
```

# 参考URL
https://pixhawk.org/dev/toolchain_installation_mac

# おわりに
Homebrew って便利だな。

# 蛇足
違う方法では、以下の方法がありそう。(ためしてない)
http://blog.y3xz.com/blog/2012/10/07/setting-up-an-arm-eabi-toolchain-on-mac-os-x
Write your blackbird plugin #001

今回はblackbird pluginの書き方第一弾ってことで、blackbirdのデータ送信の仕組みについてお話をします！
同時にblackbird自体の起動シーケンシャルについてもお話できればなーと思ってます。

ではざっくり概要編逝きます。


plugin方式
----------

blackbirdはデータ(各ミドルウェアのMetricなので厳密にはデータとは呼ばないかもしれませんが)の取得部分も、送信部分もplugin形式を採用しています。
取得するPluginは特定の基底クラスを継承したクラスを実装することで、Pluginとして成立します。
そのため、基本的にはsnipetレベルのPythonファイルをひとつ書くだけで実装できます。


起動シーケンシャル
---------------

全体のながれとしては、

1. blackbirdコマンドライン(rpmでインストールすると/usr/bin/blackbird)からの起動
2. [blackbird.sr71.Blackbird](https://github.com/Vagrants/blackbird/blob/master/blackbird/sr71.py#L24)インスタンスの生成
3. Main関数([blackbird.sr71.main](https://github.com/Vagrants/blackbird/blob/master/blackbird/sr71.py#L306))の呼び出し
4. 設定ファイルの読み込み
5. 取得及び送信プラグイン用にThreadを個別に作成
6. 各Threadをkick
7. 各ThreadがMetric用のQueueに格納及びQueueからの読み込み

というながれになってます。

### 2. blackbirdインスタンスの生成

blackbirdインスタンスは生成時に(`__init__`メソッド呼び出し時に)configのcheckを行います。
その際root config fileといいますか、`blackbird --config=CONFIG_FILE`のように`--config`オプションで指定したファイルを読み込みます。
そして、`include_dir`ディレクティブで指定したpathを確認して、includeされる各ファイルを読み込んでいきます。
同時に、configのparseとvalidationも行っており、この段階でvalidation errorが発生した場合、起動に失敗します。

#### notes:

ここでいうvalidation errorとはint型を期待しているディレクティブに対してstr型が入っていたり(`int()`メソッドがValueErrorを吐くとも言い換えられます)、
必須のディレクティブが指定されていなかったりという具合です。

### 5. 各種plugin用にThreadを生成

各Threadには名前(名前自身には意味はありませんが、debug時の透過性をあげてくれたり、名前つきで起動されることで異なる設定で複数のpluginを読み込むことが可能になります)がつけられます。
Thread名にはconfig内のセクション名(後述)を用います。

ここでいうセクション名とは

```ini
[SECTION_NAME]
directive_001 = XXXXX
directive_002 = ABC012
```

上記の_SECTION\_NAME_を意味します。つまり、この場合SECTION\_NAMEという名前のThreadが生成されます。

### 6. 各Threadをkick

blackbird.sr71.BlackbirdインスタンスがMainのプロセスとなりこのプロセスが各Threadの`run`メソッドを呼び出し、`run`メソッドが各pluginのデータを収集するメソッドを呼び出す仕組みです。

### 7. 各ThreadがMetric用のQueueに格納及びQueueからの読み込み

各ThreadはMetric用(データ用)のQueueにアイテムを投げ、また、どこかにsendするplugin用のpluginはQueueからアイテムを取り出し、データを送信します。

今までの内容を図に表すとこんな感じ

```
------------------------------------------
| blackbird Main process                 |
------------------------------------------
  |              |              |
  -- Tharead001  -- Thread002    -- Thread003 ...

  ---------
  |-------|
  |-------|
  | Queue |
  |-------|
  |-------|
  ---------

# QueueはMainのprocess内に生成されるます

```


っで??
------

っで、結局なにが言いたいかって言うと、plugin書くだけならすげえ簡単で、データやMetricsを取得する部分を書いて、基底クラスのenqueueメソッドを呼び出してやれば基本的には終了です。
pluginの書き方の詳細については、次回で詳しく説明しますね。
とにかくAnsibleをインストールしてすぐ実行したい人へ

# はじめに

私は http://qiita.com/nekogeruge_987/items/836a75960e0ad1f00b67 のコメントに以下のように書いた。

> `ansible all -i 10.0.2.190,10.0.2.191,10.0.2.192,10.0.2.193 -m ping -c paramiko -k`と実行してみましたが、インベントリファイルなし、SSH鍵の用意なし、.ssh/known_hostsに未登録の状態で実行に成功しました。

これはつまり、何の用意もなくAnsibleをインストールするだけで、ansibleコマンドを実行して他のコンピュータを操作することができる、ということである。

Ansibleを使うのにインベントリファイルを作るだのSSH鍵を作るだの、ついでにプレイブックを作るだのが微妙な心理的障壁になる、というのは理解できる感覚である。
ところが、上記コマンドのように実行することでこれを取り払うことができる。

以下ではこれでなぜ実行できるのかを解説するが、理屈が不要なら読まずに上記コマンドをホスト名と実行するモジュールの部分だけ変えて実戦投入すると良い。

私の書く文章としては[こちら](http://qiita.com/yunano/items/061645a66b3df7e477a2)でlocalhostのみ、としていたことが他コンピュータにも可能だった、というものになる。この旧文章はansibleコマンド1回で具体的にどんなことができるのか、を知るには参考になるかと思う。

# 各引数の説明

## -iオプション

-iオプションはインベントリファイルを指定するオプションとして知られている。
しかし同じコメントに以下のように書いた。

> -iの値にカンマを含む場合、カンマを区切り文字にしたリストをホスト名を列挙したインベントリとして扱うようです。

-iオプションには何を指定するとどのようになるのかをソースから確認してみる。主に見るのは lib\ansible\inventory\\__init\_\_.py である。バージョンは1.8.2のものを見ている。

まず-iオプションに指定した値として、カンマ(,)が入っているかどうかが判定の基準となる。
カンマが入っているとカンマを区切り文字として分割し、それぞれをallグループに所属するホスト名として扱うようになる。
分割した後、前後の空白文字は除去される。除去された後何も残らなければそれはホスト名扱いされず無視される。
したがって、操作対象のホストが1つだけの場合はそのホスト名の前か後ろにカンマを付ければよい。

なお、分割されたそれぞれの文字列の中に1つだけコロン(:)を含む場合はコロン以前をホスト名、以降をポート番号として扱う。
2つ以上コロンを含む場合はIPv6のアドレスとみなしホスト名扱いとなる。
IPv6でかつポート番号を指定する場合はアドレス部分を[]で囲む必要がある。

本題とは関係ないが、-iオプションの値としてカンマが入っていない場合パスを指定することになる。このパスは存在していなければならない。パスの種類によって以下のように処理が変化する。

* 所有者、グループ、その他ユーザのいずれかに実行権限が与えられたファイル
実行され、標準出力に出力されたJSONによってインベントリを形成する。(Dynamic Inventory)

* それ以外のファイル
通常のインベントリファイルとして処理される。

* ディレクトリ
ディレクトリ内の各ファイル/ディレクトリについて、ファイル名/ディレクトリ名が脚注[^1]のものを除き、それぞれに「実行権限が与えられたファイル」か「それ以外のファイル」か「ディレクトリ」かの処理を行う。

[^1]: 隠しファイル（"."で始まるファイル）、"~",".orig",".bak",".ini",".retry",".pyc",".pyo"のいずれかで終わるファイル、"host_vars","group_vars","vars_plugins"という名前のファイル。いずれもディレクトリでも同様

## -cオプションと-kオプション

`-c paramiko -k`の部分について。

-cオプションは対象のコンピュータへの接続方法を指定するオプションである。
-cオプションの指定がない場合、デフォルト設定では`-c smart`となる。
そして`-c smart`の場合、接続相手のSSHサーバでOpenSSHのControlPersist機能が利用できる場合は`-c ssh`として扱い、ControlPersist機能が利用できなければ`-c paramiko`として扱う。

ControlPersist機能が利用できない接続相手として代表的だったのが、6.5までのRHEL 6（およびCentOS 6などのRHEL派生）だが、6.6のOpenSSHにはControlPersist機能がバックポートされており、それ以降のOpenSSHを使用すれば`-c smart`は`-c ssh`となる。
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/6.6_Technical_Notes/openssh.html

一方、-kオプションはSSHパスワードの入力を実行後に行うようにするためのオプションである。この文章の趣旨としてSSH鍵の準備もしたくないので必要になる。
`-c ssh`である場合、-kオプションと共に使用するとsshpassを通して実行されることになるが、sshpassは~/.ssh/known_hostsに登録されている相手にしか接続できない。
これはAnsible関係なく~/.ssh/known_hostsに登録されていない相手に`sshpass -p <password> ssh <user>@<hostname>`を実行すればSSHログインできないのでわかる。

`-c paramiko`の場合は、-kオプションと共に使用してもsshpassは使用しないし、~/.ssh/known_hostsに未登録でも登録するかを聞いてくる（ただし、~/.ssh/known_hostsが存在しないと登録に失敗するようで、ansibleコマンド実行には成功しても次回実行時に再度聞いてくる）。

そのため、SSH鍵を用意しない、~/.ssh/known_hostsにも未登録の状態でAnsibleの実行を成功させるためには`-c paramiko -k`と指定する必要がある。

## all

インベントリの中からどのホストを対象にするか、である。
-iオプションで説明した通り、カンマ区切りで-iオプションに指定したホストはallグループに所属する。
したがってここに指定するのはallとなる。

もしプレイブックを作るのなら、hostsにはall以外に各ホストなどを指定することもありえるだろう。

----
MongoDBの「$」オペレータに関するメモ

MongoDBの「$」オペレータの使い方について忘れがちな自分のためのメモです。
基本的に公式ドキュメントからそのままの引用ですのであしからず。。

# $（Projection）

参照元：http://docs.mongodb.org/manual/reference/operator/projection/positional/#proj._S_

クエリの結果内の配列で最初に一致する要素だけを返します。
具体例を示します。

```js:データ登録
var docs = [
  { "_id": 1, "semester": 1, "grades": [ 70, 87, 90 ] },
  { "_id": 2, "semester": 1, "grades": [ 90, 88, 92 ] },
  { "_id": 3, "semester": 1, "grades": [ 85, 100, 90 ] },
  { "_id": 4, "semester": 2, "grades": [ 79, 85, 80 ] },
  { "_id": 5, "semester": 2, "grades": [ 88, 88, 92 ] },
  { "_id": 6, "semester": 2, "grades": [ 95, 90, 96 ] }
];

docs.forEach(function(d) {
  db.sample_find.insert(d);
});
```

```js:検索例1
db.sample_find.find(
  { "semester": 1, "grades": { "$gte": 85 } },  //semesterが1、かつgradesが85以上の要素を含むドキュメントを検索する
  { "grades.$": 1 }  //検索結果のgrades配列で最初に一致する要素だけ返す
);
//結果
{ "_id": 1, "grades": [ 87 ] }
{ "_id": 2, "grades": [ 90 ] }
{ "_id": 3, "grades": [ 85 ] }
```

```js:検索例2
db.sample_find.find( { "semester": 1, "grades": { "$gte": 95 } }, { "grades.$": 1 } )
//結果
{ "_id": 3, "grades": [ 100 ] }
```

# $（Update）

参照元：http://docs.mongodb.org/manual/reference/operator/update/positional/

配列のインデックスを明示的に指定することなく、更新対象の配列の要素を特定することができます。
具体例を示します。

```js:データ登録
var docs = [
  {
    "_id": 4,
    "grades": [
      { "grade": 80, "mean": 75, "std": 8 },
      { "grade": 85, "mean": 90, "std": 5 },
      { "grade": 90, "mean": 85, "std": 3 }
    ]
  }
];

docs.forEach(function(d) {
  db.sample_update.insert(d);
});
```

```js:更新例1
db.sample_update.update(
  { "_id": 4, "grades.grade": 85 },
  { "$set": { "grades.$.std": 6 } }  //条件に一致する配列要素のstdを6に更新する
);

//検索
db.sample_update.find( { "_id": 4 } );
//結果
{
  "_id": 4,
  "grades": [ 
    { "grade": 80, "mean": 75, "std": 8 },
    { "grade": 85, "mean": 90, "std": 6 },  //stdが6に更新された
    { "grade": 90, "mean": 85, "std": 3 }
  ]
}
```

```js:更新例2
db.sample_update.update(
  { "_id": 4, "grades.grade": { "$gte": 85 } },
  { "$set": { "grades.$.std": 10 } }  //条件に一致する配列要素のstdを10に更新する
);

//検索
db.sample_update.find( { "_id": 4 } );
//結果
{
  "_id" : 4,
  "grades" : [
    { "grade": 80, "mean": 75, "std": 8 }, 
    { "grade": 85, "mean": 90, "std": 10 },  //stdが10に更新された
    { "grade": 90, "mean": 85, "std": 3 }  //こちらのstdは更新されないみたい。。
  ]
}
```

更新例2では、gradeが90のstdは更新されませんでした。
$（Projection）と同様、条件に一致する配列内の最初の要素だけが更新対象となるようです。
Value-Domainからさくらレンタルサーバーにドメインを設定する

Value-Domainで取得したドメインを、さくらレンタルサーバーで使うパターンに関する記事です。

# 概要
Value-Domainで取得したドメインを、さくらレンタルサーバーの契約済みスタンダードプランで使う場合、作業は大まかに2点あります。

* Value-Domainのネームサーバーにネームサーバーを指定
* さくらレンタルサーバーにドメインを追加

１つずつ確認していきます。

# Value-Domainのネームサーバーの設定
Value-Domainの管理画面へログインしました。

**メニュー** > **[DNSレコード/URL転送の変更](http://value-domain.com/modns.php)** から設定を変更するドメインを選択します。

実際の画面はこんな感じです。

<img src="https://qiita-image-store.s3.amazonaws.com/0/1624/3535dc2f-24e6-ba3e-f4f8-ff81924a96c8.png" width=240 />

ネームサーバー１の設定をします。

```bash:ネームサーバー１の設定
ns1.dns.ne.jp
```
ns1を指定します。

ネームサーバー２に設定をします。

```bash:ネームサーバー２の設定
ns2.dns.ne.jp
```
ns2.dns.ne.jpを指定します。

これらさくらのネームサーバー入力が済んだら保存を押します。

# さくらレンタルサーバーの設定
さくらレンタルサーバーの設定はドメインの追加のみです。

さくらレンタルサーバーにログインし、コントロールパネルにあるメニューから、**[ドメイン設定](https://secure.sakura.ad.jp/rscontrol/rs/domain)** > **新しいドメインの追加**を選択します。

```
5. 他社で取得したドメインを移管せずに使う・属性型JPドメインを使う（さくら管理も含む）
```

という項目から、**>> ドメインの追加へ進む**を選択肢ます。

**ドメイン名：**のフォームにドメインを入力します。確認を押せば作業終了です。

# ドメインが割り当てられているかを確認
さくらレンタルサーバーにドメインが割り当てられているか、ブラウザからドメインにアクセスして確認します。

数分もかからず反映されると思います(☝ ՞ਊ ՞)

# 続き
[さくらレンタルサーバーにWordPressをクイックインストールするポイント](http://qiita.com/pugiemonn/items/06d6af77ee174010e797)へ続きます。
XCode6でFramework Templateを使う

はじめましてゆう＠あんのうんです。初投稿なので、何か不備があったらご連絡ください。

# 概要

XCode6でFramework Templateが新機能として追加され、今まで面倒だったFramework化が簡単にできるようになりました。
本記事で、その手順を紹介します。

この記事では、Frameworkと、Frameworkを組み込むアプリの２つのProjectが登場しますので、以下で呼称します。
また、新規にProjectを作る際の紹介を行います。

 * Framework側
 * App側

# Framework側 : Project作成

File -> New -> Projectで新規Project作成画面を出し、
Framework & Libraryから、Cocoa Touch Frameworkを選択します
(ここでProject名は、ProjectUnknownFrameworkとしました)

![capture-01.png](https://qiita-image-store.s3.amazonaws.com/0/64588/3620706d-0603-0ae6-1f44-d1397adf901b.png)

すると、以下の様にファイルが展開されます。

![capture-02.png](https://qiita-image-store.s3.amazonaws.com/0/64588/be5fcd3e-3917-2000-b763-44d938234442.png)

# Framework側 : 独自機能の追加

追加したい機能をこれまで通り追加していくだけです。

ここでは、私がよく使っている、(と言うかiOSデベロッパーの他の皆様がよくやられている)ログマクロを一つ追加してみます。

![capture-03.png](https://qiita-image-store.s3.amazonaws.com/0/64588/a4a26064-3253-b9ed-060e-de3f45ee6c25.png)

PUMacros.h
というファイルを一つ作り、中に以下のマクロを記載します。

```objc
#ifdef DEBUG

#define LOG(format, ...) NSLog((format ), __FUNCTION__, ##__VA_ARGS__);

#endif
```

# Framework側 : App側からも参照できるようにする

「Framework名.h」ファイル(私の場合は、ProjectUnknownFramework.h)に、以下の形でimport文を記載します

```objc
#import <Framework名/ファイル名>
```

今回の例の場合は、以下の様に記載します

```objc
#import <ProjectUnknownFramework/PUMacros.h>
```

# Framework側 : Build

通常のApp開発と同様にCmd+bでbuildします。

# Framework側 : 作成されたFrameworkを確認。

buildが終わると、以下のPathにframeworkが作成されていますので、確認します。

```
~/Library/Developer/Xcode/DerivedData/{Project名}/Build/Products
```

iPhoneシミュレータで作成したので、この場合は、以下に格納されています

```
~/Library/Developer/Xcode/DerivedData/{Project名}/Build/Products/Debug-iphonesimulator/
```

これをFinderで見ると

![Failed to upload "capture-04.png": Please try again later.]()

.framework形式のファイルが作成されていました。

# App側 : 作成したFrameworkの取り込み

先ほど作成された、.frameworkをApp側の以下にDrag & Dropで取り込みます。

![capture-05.png](https://qiita-image-store.s3.amazonaws.com/0/64588/ce4b415c-4f2b-25b6-c27f-4d7b0aff9c12.png)

Link Binary With Librariesに、上記の通り、.frameworkファイルを取り込みました。

# App側 : 実際に利用する。

実際に利用する場合は、

```objc
#import フレームワーク名;
```

で利用できます。

先ほどの例で作成したマクロを実際にViewController上で呼び出してみます。

```objc
#import "ViewController.h"

@import ProjectUnknownFramework;


@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self runMacro];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)runMacro
{
    LOG(@"hogehgoe");
}

```

![capture-06.png](https://qiita-image-store.s3.amazonaws.com/0/64588/3725b9de-30f3-5ed7-9bd2-9fb35d0f50c3.png)

実際にLogを出力する事が出来ました。

#最後に

XCode6で追加されたFramework Templateを思考錯誤しながらやってみたので、無駄な事とか、もっと簡単なやり方等がありましたら、この記事もしくは、[運営しているBlog](http://project-unknown.hatenablog.com/entry/2014/12/31/182438 "運営しているBlog")等にご教授頂ければ幸いですｍｍ
ステータスバーに通知を表示できるJDStatusBarNotificationを使ってみる


# ステータスバーに通知を表示するUI

iOSでは、アプリを閉じているときにPush通知を受けると上部のステータスバー領域にメッセージが表示される。
[JDStatusBarNotification](https://github.com/jaydee3/JDStatusBarNotification)で同じようなUIが使えそうだったので試してみた。

## 注意事項
[README](https://github.com/jaydee3/JDStatusBarNotification#beware)に寄ると、iOSアプリガイドラインの10.1と10.3によってリジェクトされた例が1件報告されているらしい。
「その他にリジェクトされた例は聞いていないが、使い過ぎに注意してください」(意訳)という製作者コメント。

注意事項が記載される元になったIssueは[こちら](https://github.com/jaydee3/JDStatusBarNotification/issues/15)。


## インストール
Podfileに一行追記して`pod install`

```Podfile
pod 'JDStatusBarNotification'
```

## 使い方
シングルトンなので、初期化処理は不要。
最低限一行でステータスバー領域に通知を表示できる。

```objc:sample.m
#include "JDStatusBarNotification.h"

// (略)

- (void)showBarNotification
{
    [JDStatusBarNotification showWithStatus:@"テスト表示"];
}
```
ただ、これだと通知はずっと表示しっぱなし。
自動的に消えるようにするには`dismissAfter:`を指定する。
以下は3秒経つと消えてくれる例。

```objc:sample.m
- (void)showBarNotification
{
    [JDStatusBarNotification showWithStatus:@"テスト表示" dismissAfter:3.0];
}
```

`styleName:`でスタイルを指定すると、色が変えられる。[6種類](https://github.com/jaydee3/JDStatusBarNotification#showing-a-notification-with-alternative-styles)が用意されていた。
デフォルトは白地に黒なので、以下では黒字に白へ変更してみた。

```objc:sample.m
- (void)showBarNotification
{
    [JDStatusBarNotification showWithStatus:@"テスト表示" dismissAfter:3.0 styleName:JDStatusBarStyleDark];
}
```

他にも[プログレスバー](https://github.com/jaydee3/JDStatusBarNotification#showing-progress)や、[ローディングインジケーター](https://github.com/jaydee3/JDStatusBarNotification#showing-activity)も表示できるみたい。
[独自カスタマイズ](https://github.com/jaydee3/JDStatusBarNotification#customization)も可能。


# 参考
jaydee3/JDStatusBarNotification
https://github.com/jaydee3/JDStatusBarNotification

App Rejected · Issue #15 · jaydee3/JDStatusBarNotification
https://github.com/jaydee3/JDStatusBarNotification/issues/15
Bracketsをコマンドラインから起動する


...それだけのメモです。（環境はMacになります)

## Sublime Textでよくある方法で

```source:bash

# 単純にopenコマンドで
% open -g -a Brackets

# aliasを作って、あとは .bashrc なんかに設定しておく
alias brackets='open -g -a Brackets'

```
Pepperぷちめも

# ささやかなことを追加していこうかなというメモ
- なんか関節が思うように動かない。Pepper君、何だかおじいちゃんっぽい。
 - robotWepページの旧ページで Fall Manager reflex をOFFして
 - アンチコリジョンとかFallマネージャーとかを弄ったら治った。
 - 理由は不明だけど…まあ何か謎プロセスが邪魔してたのだろう。そうに違いない。pepper君の挙動はワザワザ深追いする価値があるほどには安定してないので思っておこう。
 - 2015.7.19 追記 setExternalCollisionProtectionEnabled が犯人。
 - http://doc.aldebaran.com/2-1/naoqi/motion/reflexes-external-collision.html#reflexes-external-collision
    - 併せてStiffenの設定などが関節動かない設定になってたりするとハマるので、動かないときはここもチェック(Stiffenは関節を手動で動かせるかAPIから制御できるかの設定)

- ALMemoryのキーには「値」と「イベント」がある。うっかり違うやつ指定してもエラーが出なかったので注意しないとハマるかも？
- ALPeoplePerceptionなどはsubscribeしないと動かない
 - ここにあるものほぼすべて同様。http://doc.aldebaran.com/2-1/naoqi/core/extractors.html
 - ただし、Pepper君はどうもグローバルに依存しまくる構造なようなので、誰かがsubscribeしてると動いているように見えるので結構罠…ほんとにこの認識であってるのだろうか…サンドボックスくらいあるのに知らないだけでないかと不安すぎる…
- Pepperの胸板のボタン
 - 左手(ペッパーの右手)側のサイドにアンドロイドとしてのボタンとリセットボタンがある

- コレグラフからのアプリ起動方法
 - いつも忘れるのでメモ
 - ロボットアプリーケーションからは起動しない
 - ロボットアプリケーションで右クリックアプリケーションIDをコピー
 - ロボット動作のウィンドウでフィルターにペースト
 - 見つかったモノの再生ボタン（緑色）をクリックで起動
- ROS関連のアルデバラン公式っぽいところ
 - https://github.com/ros-aldebaran
 - https://github.com/ros-naoqi
 - どう考えても公式
 - オフィシャルって書いてあるリポジトリもある
 - 探すとPepper君関連の定義も入り始めてるみたい。
 - さらにところどころ _get3dMap みたいな正式に公開されてない感じのモノを使ってたりするのが興味深い…

- javascript版NaoQiのありか
 - https://github.com/aldebaran/libqi-js
 - githubにあった。
 - 2.0も存在を確認。
 - 実際動くかはまだ試せてないけど、中見る限り動くんじゃないのかなぁ…
 - 中身は単に決まりに従ってRPCしてる感じだったし

- github上にアルデバラン公式っぽいリポジトリがある
 - https://github.com/aldebaran/
 - じっくりみても、多分公式だろうきっと。

- Pepperのロボットのアカウント名はnao。名前を何に変えていてもnao
 - 初期パスワードは、nao
 - ブラウザなどからローカルページにアクセスする際に必要になる
 - 忘れがち…(というか一回忘れて焦ったのでメモ) 

- http://ペッパーのIP/advanced/ というページがある
 - 意味のある使い方があるのかわからないけど、気づかないかもしれない場所なのでメモ
More secure MySQL backup strategy

This strategy keep to bellow policies:

1. minimum privilege:only `select` and `lock tables` privilege is needed.
2. No password, no network

# Create user

```
> grant select,lock tables ON  db.* TO 'backup'@'localhost';
```

Without the `lock tables` privilege, you will get error:

```
mysqldump: Got error: 1044: "Access denied for user 'backup'@'localhost' to database 'db'" when using LOCK TABLES
```

# Dump database via `mysql.sock`

```
mysqldump -ubackup -S/var/lib/mysql/mysql.sock
```
[java8] 5回目：ラムダ式とStreamAPI

[前回：ラムダ式とStreamAPI]
(http://qiita.com/yuusuke_s/items/04d86e32fc55a9a1719c)

さて、前回はStream APIを使って、

* 対象データの集計とソート
* 最大値の取得

のサンプルを紹介しました。引き続き、他のサンプルを見てみましょう。

## StreamAPI
### 指定した地域、店舗名の売り上げを集計する

``` java
public class SampleSalesMain {

	/**
	 * 売り上げデータ用のクラスです。
	 */
	private static class Item {
		public String cityName;
		public int sale;
		public String storeName;
		public Item(String cityName, String storeName, int sale) {
			this.cityName = cityName;
			this.sale = sale;
			this.storeName = storeName;
		}
	}

	private static List<Item> items;

	/**
	 * 売り上げのサンプルデータ投入用の静的コンストラクタです。
	 */
	static
	{
		items = new ArrayList<>();
		for(int i = 0; i < 2000000; ++i) {
			items.add(new Item("Tokyo", "shinagawa", 150));
			items.add(new Item("Tokyo", "shinagawa", 200));
			items.add(new Item("Oosaka", "oosaka", 100));
			items.add(new Item("Tokyo", "shinagawa", 300));
			items.add(new Item("Tokyo", "shinagawa", 400));
			items.add(new Item("Oosaka", "oosaka", 100));
			items.add(new Item("Chiba", "kashiwa", 100));
		}
	}


	public static void main(String[] args) {

		// Tokyo、shinagawaの売り上げを集計する
		System.out.println("Tokyo sales is " + ramdaSampleSales("Tokyo", "shinagawa");
	}

	/**
	 * ラムダ式のサンプルです。
	 * 指定された地域の売り上げ集計を返します。
	 */
	public static int ramdaSampleSales(String cityName, String storeName) {
		return items.stream()
			.filter(e -> e.cityName.equals(cityName))
			.filter(e -> e.storeName.equals(storeName))
			.mapToInt(e -> e.sale).sum();
	}
}
```

結果
>Tokyo sales is 2100000000

### 指定した地域、店舗名の売り上げを集計する（パラレル処理）

上記の処理を、parallelStreamを使って、パラレル処理を行い、
処理時間の比較をしてみます。
売り上げデータに関しては、上記と同様のため、省略しています。

``` java
	public static void main(String[] args) {

		// Tokyo、shinagawaの売り上げを集計する
		long start = System.currentTimeMillis();
		System.out.println("Tokyo sales is " + ramdaSampleSales("Tokyo", "shinagawa"));
		long time = (System.currentTimeMillis() - start);
		System.out.println("time(s):" + time);

		// Tokyo、shinagawaの売り上げを集計する(パラレル)
		start = System.currentTimeMillis();
		System.out.println("Oosaka sales is " + ramdaSampleSales("Tokyo", "shinagawa"));
		time = (System.currentTimeMillis() - start);
		System.out.println("time(s):" + time);
	}

	/**
	 * ラムダ式のサンプルです。
	 * 指定された地域の売り上げ集計を返します。
	 */
	public static int ramdaSampleSales(String cityName, String storeName) {
		return items.stream()
			.filter(e -> e.cityName.equals(cityName))
			.filter(e -> e.storeName.equals(storeName))
			.mapToInt(e -> e.sale).sum();
	}

	/**
	 * パラレル実行のサンプルです。
	 * データ量が少ない場合は、逆に遅くなるので注意が必要です。
	 */
	public static int ramdaSmapleSalesPara(String cityName, String storeName) {
		return items.parallelStream()
			.filter(e -> e.cityName.equals(cityName))
			.filter(e -> e.storeName.equals(storeName))
			.mapToInt(e -> e.sale).sum();
	}
```

結果
>Tokyo sales is 2100000000
time(msec):656
Tokyo sales is 2100000000
time(msec):512

微妙ですが、パラレル処理の方が早いです。

## 最後に

Stream APIの紹介はこれで終わりになります。
他にも色々ありますので、どんどん調べてみてください！

次回は、インタフェースのデフォルト実装について紹介します。
PSR-4 autoloader (日本語訳)


# Autoloader

文書内記載されている "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY" 及び "OPTIONAL" は、[RFC 2119](http://tools.ietf.org/html/rfc2119)で説明される趣旨で解釈してください。

## 1. 概要

このPSRは、ファイルパスから、クラスをオートローディングするための仕様について記述します。
これは、[PSR-0][]を含む、その他のオートロードの仕様と完全に相互運用可能であり、その他の仕様に追加して使用することができます。
また、このPSRは、この仕様に従ってオートロードされるファイルの配置についても記述しています。

## 2. 仕様


1. 「クラス」という用語は、クラス、インターフェース, トレイト、および他の類似の構造を指します。


2. 完全修飾クラス名は次のような形式になります。

        \<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>

    1. 完全修飾クラス名は、「ベンダーの名前空間」として知られているトップレベルの名前空間名を持っている必要があります。(MUST)

    2. 完全修飾クラス名は、1つ以上のサブ名前空間名を持つことがあります。(MAY)

    3. 完全修飾クラス名は終端クラス名を持つ必要があります。(MUST)

    4. アンダースコアは、完全修飾クラス名のいずれの部分にも特別な意味を持ちません。

    5. 英字は小文字と大文字の任意の組み合わせでかまいません。(MUST)

    6. すべてのクラス名は大文字と小文字を区別して参照する必要があります。(MUST)

3. 完全修飾クラス名に対応するファイルをロードする場合、

    1. 完全修飾クラス名の名前空間の先頭とそれに続くサブ名前空間名の連続(名前空間プレフィックス)が「ベースディレクトリ」に対応します。
  
    2. 「名前空間プレフィックス」の後の連続したサブ名前空間名は、ベースディレクトリ内のサブディレクトリに対応します。名前空間のセパレータは、ディレクトリのセパレータを表し、サブディレクトリ名は、サブ名前空間名の大文字小文字と一致しなければなりません。

    3. 終端クラス名は .php で終わるファイル名に対応します。ファイル名は、終端クラス名の大文字小文字と一致しなければなりません。


4. オートローダの実装では、任意のレベルのエラーを発生させてはならず、例外もスローしてはなりません。またその値も返すべきではありません。


## 3. 例

以下の表は、与えられた完全修飾クラス名、名前空間プレフィックス、およびベースディレクトリに対応するファイルパスを示しています。

| 完全修飾クラス名    | 名前空間プレフィックス   | ベースディレクトリ           | ファイルパス
| ----------------------------- |--------------------|--------------------------|-------------------------------------------
| \Acme\Log\Writer\File_Writer  | Acme\Log\Writer    | ./acme-log-writer/lib/   | ./acme-log-writer/lib/File_Writer.php
| \Aura\Web\Response\Status     | Aura\Web           | /path/to/aura-web/src/   | /path/to/aura-web/src/Response/Status.php
| \Symfony\Core\Request         | Symfony\Core       | ./vendor/Symfony/Core/   | ./vendor/Symfony/Core/Request.php
| \Zend\Acl                     | Zend               | /usr/includes/Zend/      | /usr/includes/Zend/Acl.php

仕様に準拠したオートローダーの実装例については、[examples file][] を参照してください。
実装例は仕様の一部とはみなされず、任意のタイミングで変更されることがあります。

[autoloading]: http://php.net/autoload
[PSR-0]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md
[examples file]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader-examples.md
[Swift]拡張(extention)がめちゃめちゃ便利だった！


俺の名はケンヤ。難事件をいくつも迷宮入りさせたニート。しかし ある時謎の組織に入社し薬を飲まされ身体が縮んで **Braian** になっちゃった。

##拡張(extention)
"既存のクラスや構造体に新しいメソッドを追加することができる。"
extentionを使用すればios frameworkのクラスも簡単に拡張することができる。。
extensionでは、プロパティの追加がComputed Propertyのみ。

###Stringクラスの拡張
Stringオブジェクトにランダムな言葉を入れ、どこでも呼び出せるようにする。

```
extension String {
   func addRandomWord() -> String {
       let value = arc4random_uniform(4)
       var word:  String
       switch value {
          case 0: word = "Hello"
          case 1: word = "World"
          case 2: word = "My"
          case 3: word = "Good"
          default: word = ""
       }
       return self + word
   }
}


var testString = "Hey,"
var result = testString.addRandomWord()
println("\(result)")
println("\(result)")
println("\(result)")
//Hey, My
//Hey, Hello
//Hey, Good 
```

こんな感じになります！！
もちろんIntやDoubleなどの型でもextentionで拡張することができます！！！
色々な応用もできそうです！！



**不備やこんな使い型もありますよなどアドバイスを頂けますと幸いです!!どうぞよろしくお願い致します!**
Qiita APIのNode.jsクライアントで限定公開記事を投稿してみる。



前回の続きです。

* http://qiita.com/n0bisuke/items/4587f42dce3218960730
* http://qiita.com/n0bisuke/items/6d7d92eac9f1b0782226

今回は記事を投稿してみます。

`create_item()`というメソッドを使ってみます。

create_items(オプション)という使い方みたいです。

参考: http://qiita.com/api/v2/docs#投稿

##とりあえず使ってみる

```qiita.js
// require in commonjs env
var Qiita = require('qiita-js');

// set your token
Qiita.setToken('your access token');

//setting post options
var options = {
    "body": "# API経由で投稿しています。",
    "coediting": false,
    "gist": false,
    "private": true,
    "tags": [
        {
            "name": "example",
            "versions": [
                "0.0.1"
            ]
        }
    ],
    "title": "Qiita API Node.js クライアントから投稿",
    "tweet": false
};

//execution　api
Qiita.Resources.Item.create_item(options).then(function(res){
    console.log(res);
});
```

**限定公開にする場合はprivateの値をtrueにしましょう。**

実行してみる

```
$ node qiita.js

{ rendered_body: '<h1>\n<span id="api経由で投稿しています" class="fragment"></span><a href="#api%E7%B5%8C%E7%94%B1%E3%81%A7%E6%8A%95%E7%A8%BF%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99"><i class="fa fa-link"></i></a>API経由で投稿しています。</h1>\n',
  body: '# API経由で投稿しています。\n',
  coediting: false,
  created_at: '2014-12-31T16:06:03+09:00',
  id: 'cf6d9113fdba32cdcea2',
  private: true,
  tags: 
   [ { icon_url: 'icons/medium/missing.png',
       name: 'example',
       versions: [Object] } ],
  title: 'Qiita API Node.js クライアントから投稿',
  updated_at: '2014-12-31T16:06:03+09:00',
  url: 'http://qiita.com/n0bisuke/items/cf6d9113fdba32cdcea2',
  user: 
   { description: '@のびすけです。\r\n\r\nhttp://liginc.co.jp/author/nobisuke\r\nhttps://www.wantedly.com/users/49472\r\nhttp://offsidenow.phpapps.jp/',
     facebook_id: 'sugawara.ryousuke',
     followers_count: 69,
     followees_count: 23,
     github_login_name: 'n0bisuke',
     id: 'n0bisuke',
     items_count: 107,
     linkedin_id: '',
     location: '岩手 <-> 上野',
     name: 'Sugawara Ryousuke',
     organization: 'http://liginc.co.jp',
     profile_image_url: 'https://gravatar.com/avatar/dae1d4cc4599a65a5da6e1a1f9d96f05?d=https%3A%2F%2Fidenticons.github.com%2F9a034197db94d3fa733e5079c6eb313a.png&r=x',
     twitter_screen_name: 'n0bisuke',
     website_url: 'http://liginc.co.jp/member/member_detail?user=nobisuke' } }
```

投稿できたみたいです。

`http://qiita.com/{your qiita id}/private` を確認してみます。


実際にAPI経由で投稿された記事は[こちらです。](http://qiita.com/n0bisuke/private/57330609d3f025f11967)

![](http://i.gyazo.com/dd1046a37913a77cceb20997c7e5efd1.png)
Ruby: Forwardable によるデリゲート(委譲)

Ruby の標準添付ライブラリに Forwardable があります。
Forwardable によりデリゲート(委譲)が手軽に行えます。
本稿は Fowardable に関する簡単なメモです。

参考リンク

- [library forwardable (Ruby2.1.0リファレンスマニュアル)](http://docs.ruby-lang.org/ja/2.1.0/library/forwardable.html)

- [標準添付ライブラリ紹介 【第 6 回】 委譲] (http://magazine.rubyist.net/?0012-BundledLibraries)

# Forwardable

## 例１
簡単な委譲の例です。

```rb:sample1.rb
#!/usr/bin/env ruby

require 'forwardable'

class C
  extend Forwardable              # Forwardable を extend する
                        
  delegate %i(push []) => :@array # push, [] メソッド呼び出しを @array に委譲する 

  def initialize
    @array = []      # 委譲先オブジェクト
  end
end

c = C.new
c.push 2015                        # push メソッド呼び出しは @array に委譲される
c.push 'happy new year'            #            〃

p c[0]    #=> 2015                 # [] メソッド呼び出しは @array に委譲される
p c[1]    #=> "happy new year"     #            〃
```

## 例２
標準添付ライブラリにログ機能を提供する Logger があります。

- [library logger (Ruby2.1.0Ruby 2.1.0 リファレンスマニュアル)](http://docs.ruby-lang.org/ja/2.1.0/library/logger.html)

以下は、Logger オブジェクトに委譲する例です。

```rb:sample2.rb
require 'forwardable'
require 'logger'

class C
  extend Forwardable      # Forwardable を extend する
                          # fatal 〜 debug メソッドの呼び出しを logger に委譲する
  delegate %i(fatal error warn info debug) => :logger

  attr_accessor :logger   # 委譲先オブジェクト(のアクセサ)

  def foo
    warn "(警告) foo は呼び出さないでください"  # warn メソッド呼び出しは logger に委譲される
  end

  def bar
    error "(異常) bar は呼び出したらダメ！！"   # error メソッド呼び出しは logger に委譲される
  end
end

c = C.new
c.logger = Logger.new STDOUT    # 実際の委譲先オブジェクト
c.foo
c.bar
```

実行結果

```shell-session
$ ruby sample2.rb 
W, [2014-12-31T15:59:36.757060 #24309]  WARN -- : (警告) foo は呼び出さないでください
E, [2014-12-31T15:59:36.757153 #24309] ERROR -- : (異常) bar は呼び出したらダメ！！
```

# おわりに
上で述べた以外にも Forwardable には機能があります。
詳しくは冒頭に記した参考リンクを参照してください。

本稿内容の動作確認は以下の環境で行っています。

- Ruby 2.1.5 p273

---
以上です。
seqもあるけどjotもね

## jotを知ったという話
* Macでseqを触っていてたら `man seq` より `jot`を知った。

### 環境
* Macにて
 * ~~Linuxではコマンドがなさそうだ~~
 * Ubuntuの`apt-get`では、パッケージが用意されているそうです（コメントにて。あざす。）

---


### seq
* よく使う `seq`

```shell-session
% seq 1 5
1
2
3
4
5
```

### jot
* BSD系で使えるようだ

```shell-session
% jot - 1 5
1
2
3
4
5
```

 * `seq` より強力そうだが `man` によれば

```shell-session

NAME
     jot -- print sequential or random data
```

* `or randam data` ということで。

### jot / `or randam data`
* `-r`

```shell-session
DESCRIPTION
     -r      Generate random data instead of the default sequential data.
```

* とりあえずだと
 * 1〜100まで、ランダムに5回抽出する

```sh
% jot -r 5 1 100
1
6
17
91
46
```

* `-w`
 * pritnfのように組み合わせも

```sh
     -w word
             Print word with the generated data appended to it.  Octal, hexadecimal, exponential, ASCII, zero
             padded, and right-adjusted representations are possible by using the appropriate printf(3) con-
             version specification inside word, in which case the data are inserted rather than appended.
```

* ランダムと組み合わせてみた

```sh
% jot -w '%d Mbit/s' -r 5 1 100
38 Mbit/s
1 Mbit/s
11 Mbit/s
95 Mbit/s
21 Mbit/s
```

* `rs`との組みあわせでランダム文字列の生成も
 * `a to z`から抽出した文字を10行連結表示

```sh
% jot -r -c 50 a z | rs -g 0 10
hixwvmazju
yjoqehtkbe
iixpiseadj
skqpjjvudp
zwhmooeesl
```
提出用スクリーンショットサイズの早見表 (Xcode , iTunesConnect)

毎回あわあわしないようにね。
Xcode6.1です。

順番はこんな感じで
・インチ数（iTunes Connect中）
・シミュレータ名（Xcode中）
・サイズ（縦 × 横）

---

4.7インチ
iPhone 6
750 × 1334

---

5.5インチ
iPhone 6 Plus
1242 × 2208

---

4インチ
iPhone 5
640 × 1136

---

3.5インチ
iPhone 4s
640 × 960

---

iPad
iPad 2（これで審査通るがこれで最適かは不明）
768 × 1024（これで審査通るがこれで最適かは不明）
Haskellで有理数の計算をするときはData.Ratioを使う

Haskellで誤差なく有理数を扱いたかったら [Data.Ratio](http://hackage.haskell.org/package/base-4.7.0.2/docs/Data-Ratio.html) を使いましょうってだけです。久々に触ったら完全に忘れてたのでメモ。

%演算子でIntegral2個からその比を作れます。通常は整数の比を取って有理数として使うことになるでしょう。

```hs
import Data.Ratio
x = 1 % 3
y = 2 % 6 -- 内部的に通分してくれる
x == y -- True
```

この有理数から分子(numerator)と分母(denominator)を取り出すこともできます。

```hs
import Data.Ratio
xs = map (% 2) [1..9] -- [1/2,1,3/2,2...9/2]というリスト
ys = filter ((1 ==) . denominator) xs -- xsから整数（分母が1のもの）だけ抜き出したリスト
```