OmniAICreator/Qiita-1.07M huggingface dataset:
Grafana on InfluxDB をちょっとだけ触ってみた

[Grafana](http://grafana.org) という InfluxDB をバックエンドにしたグラフ描画ツールの存在を知ったので触ってみた。正確には、Grafana は本来は Graphite 用のダッシュボード置き換えツールなのだが、InfluxDB をバックエンドにしても動くらしい。というか、つい[10日ほど前](https://github.com/influxdb/influxdb/issues/205)にサポートしたらしい。

InfluxDB については [InfluxDB を10分だけ触ってみた](http://qiita.com/sonots/items/ced1efc6d6e10a449abb) の記事を参照。その記事の中で、Elasticsearch に対する Kibana のように、InfluxDB にも描画ツールがあれば便利だよね、という話をしたが、まさしく Grafana をその用途で使えるようだ。ちなみに、Grafana は Kibana を fork したツールである。

# インストール

```bash
$ git clone git@github.com:torkelo/grafana.git
$ cd grafana/src
$ mv config.sample.js config.js
```

https://github.com/torkelo/grafana/wiki/InfluxDB のページを参考に config.js を以下の内容に置き換える。

[InfluxDB を10分だけ触ってみた](http://qiita.com/sonots/items/ced1efc6d6e10a449abb)のようにして、test データベースは作ってあるものとする。

```js
/** @scratch /configuration/config.js/1
 * == Configuration
 * config.js is where you will find the core Grafana configuration. This file contains parameter that
 * must be set before Grafana is run for the first time.
 */
define(['settings'],
function (Settings) {
  "use strict";
  return new Settings({
    elasticsearch: "http://"+window.location.hostname+":9200",
    datasources: {
      influx: {
        default: true,
        type: 'influxdb',
        url: "http://"+window.location.hostname+":8086/db/test",
        username: 'root',
        password: 'root',
      }
    },
    default_route: '/dashboard/file/default.json',
    timezoneOffset: null,
    grafana_index: "grafana-dash",
    panel_names: [
      'text',
      'graphite'
    ]
  });
});
```

# ウェブサーバを立ち上げる

Kibana のセットアップをしたことがある人ならばわかると思うが、Grafana (Kibana) 自体は html および javascript だけなので、ウェブサーバを別途立てる必要がある。

ちょっと試したいだけなので、nginx とか立てずに以下のように ruby のワンライナーで立ち上げてみた。

```bash
$ ruby -rwebrick -e 'WEBrick::HTTPServer.new({:DocumentRoot => "./", :Port => 8080}).start'
```

# アクセス

http://localhost:8080

![スクリーンショット 2014-04-04 2.09.29.png](https://qiita-image-store.s3.amazonaws.com/0/9641/2a71e54f-a376-6efc-ee11-56f8f8d632a1.png)

database 名 test をクリックするとドロップダウンが出てくるので Edit を選ぶ。※ Graphite じゃないのに、「Graphite」ってなってる... ^^;

![スクリーンショット 2014-04-04 2.18.23.png](https://qiita-image-store.s3.amazonaws.com/0/9641/8e12a79c-4027-8f80-fc1d-ea7b92aa48ca.png)

クエリを入れられそうな画面がでてくるので、入れてみる

![スクリーンショット 2014-04-04 2.39.17.png](https://qiita-image-store.s3.amazonaws.com/0/9641/b33cb0db-2105-0abe-7f1a-d5c3bf75a31b.png)

グラフ出た ^^

補足：なお、データは現在時間にあわせて InfluxDB の GUI から次のように投入した。time は *miliseconds* の epoch time なので注意。ruby で書くと `Time.parse("2014-04-03 23:00:00 +0900").to_i * 1000` みたいな感じ。

```
Time Series Name: response_time
values: {"value":10,"time":1396533600000}
values: {"value":20,"time":1396537200000}
values: {"value":40,"time":1396540800000}
```

# おわりに

Grafana は InfluxDB をサポートしはじめたばかりのようで、まだ細かい機能は今実装しているところの模様。

ダッシュボードの保存などの処理が kibana そのままで、どうやら elasticsearch が必要になるようだし、まだ発展途上感あるけど、期待したい。
間違えてコミットを--amendで書き換えてしまった場合の対処法

```bash
git reset --hard HEAD^
```
とやってしまいがちだが、reflogの機構を利用して

```bash
git reset HEAD@{1}

```
すると--amendする直前に戻れる。

# 参考リンク
http://labs.timedia.co.jp/2011/02/git-various-undo.html
Clojureで正規表現での検索結果をマップに変換する

（ファイル中の）複数行に対する複数の正規表現マッチの結果をマップに変換することを目指します。

#### re-find

まずは、一番簡単なre-find結果をマップに変換する場合

```re-findmap.clj
(defn wrap-vec [x] (if-not (sequential? x) [x] (vec x)))
(defn re-find->map [re s & keys]
  (when-let [v (re-find re s)]
    (apply hash-map (interleave keys (wrap-vec v)))))
```

```
user=> (re-find #".\d(.)" "some1234abc")
["e12" "2"]
user=> (re-find->map #".\d(.)" "some1234abc" :1 :2)
{:1 "e12", :2 "2"}
```


これを利用して、複数行への複数正規表現マッチを作ります。
なお、最初にマッチしたものを結果に格納することとします。
以下の例ではマッチ済みの正規表現の比較はスキップして、すべての正規表現にマッチしたら以降の行もスキップするようにしています。

※reduceを使っても実装できましたがもっと複雑でした。
※スキップなしならre-seqの例と同じくらい簡単になります。

```re-find-linesmap.clj
(defn zipseq [& colls] (apply map list colls))
(defn indexed [coll] (zipseq (range) coll))

(defn- count<> [colls f] (->> (map count colls) (apply f)))
(defn count<  [& colls] (count<> colls <))

(defn re-find-lines->map [lines & re-keys-pairs]
  {:pre[(even? (count re-keys-pairs))]}
  (let [rk-list (indexed (partition 2 re-keys-pairs))
        m (java.util.LinkedHashMap.)]
    (doseq [line lines
            [i [re keys]] rk-list
            :while (count< m rk-list)
            :when (not (contains? m i))
            :let [v (apply re-find->map re line (wrap-vec keys))]
            :when v] (.put m i v))
    (apply merge (reverse (vals m)))))
```

```
user=> (re-find-lines->map ["some1234abc", "A9"] #".\d(.)" [:1 :2] #"A" :a)
{:a "A", :1 "e12", :2 "2"}
user=> (re-find-lines->map ["some1234abc", "A9"] #".\d(.)" [:1 :2] #"\d" :a)
{:a "1", :1 "e12", :2 "2"}
```

#### re-seq
re-seqの場合も似たような感じでできます。

```re-seqmap.clj
(defn re-seq->map [re s & keys]
  (when-let [v (re-seq re s)]
    (apply hash-map (interleave keys (apply zipseq (map wrap-vec v))))))
```

```
user=> (re-seq #".\d(.)" "some1234abc")
(["e12" "2"] ["34a" "a"])
user=> (re-seq->map #".\d(.)" "some1234abc" :1 :2)
{:1 ("e12" "34a"), :2 ("2" "a")}
```

複数行、複数正規表現マッチ。
re-findの例より簡単です。

```re-seq-linesmap.clj
(defn re-seq-lines->map [lines & re-keys-pairs]
  {:pre[(even? (count re-keys-pairs))]}
  (->> (for [line lines [re keys] (partition 2 re-keys-pairs)]
         (apply re-seq->map re line (wrap-vec keys)))
       (apply merge-with concat)))
```

```
user=> (re-seq-lines->map ["some1234abc", "A9"] #".\d(.)" [:1 :2] #"A" :a)
{:a ("A"), :1 ("e12" "34a"), :2 ("2" "a")}
user=> (re-seq-lines->map ["some1234abc", "A9"] #".\d(.)" [:1 :2] #"\d" :a)
{:a ("1" "2" "3" "4" "9"), :1 ("e12" "34a"), :2 ("2" "a")}
```

うまくできました。
vue.jsのJavaScript Functionsによるアニメーション

* 最近、vue.jsのドキュメントを読みながらちょっとずつメモしていってるのですが、そこで下記の意味がよくわからないなぁと思ったので実際にサンプル書いて確認してみました。
  * https://gist.github.com/koba04/9776792

>
The third argument, timeout, is a wrapped version of setTimeout. You should use it in place of setTimeout so that when an effect is cancelled, its associated timers can be cleared.

* jsfiddleのサンプル
  * http://jsfiddle.net/koba04/rb3YD/

vue.jsではcss transitionやcss animationによるアニメーションの他にjavascriptによるアニメーションもサポートしているのですが、その時に指定する関数に渡される第三引数はsetTimeoutのラッパーになっています。通常のsetTimeoutだとアニメーションがキャンセルされた時に何もしてくれずアニメーションの状態がおかしくなるので、timeoutを使うとアニメーションがキャンセルがされたときにclearTimeoutしてくれるのでうまく動くということでした。

jsfddleのサンプルでもtimeoutの部分をsetTimeoutにして連打すると状態がおかしくなるのがわかるかと思います。

わかれば納得ですが英語力低くて悲しい・・・
#Fluentd + #Norikra でaccess.logとかdstatを扱うめも

あとでblog書く、たぶん。
とりあえず途中経過メモ。

----

## nginxの設定

LTSVで扱いたいので[こちら](http://qiita.com/key/items/038b7913b3bb0298c625)を参考にこんな設定ファイル書いて、

```shell-session
# cat /etc/nginx/log_format.conf 
log_format ltsv 'time:$time_iso8601'
  '\tremote_addr:$remote_addr'
  '\trequest_method:$request_method'
  '\trequest_length:$request_length'
  '\trequest_uri:$request_uri'
  '\thttps:$https'
  '\turi:$uri'
  '\tquery_string:$query_string'
  '\tstatus:$status'
  '\tbytes_sent:$bytes_sent'
  '\tbody_bytes_sent:$body_bytes_sent'
  '\treferer:$http_referer'
  '\tuseragent:$http_user_agent'
  '\tforwardedfor:$http_x_forwarded_for'
  '\trequest_time:$request_time'
  '\tupstream_response_time:$upstream_response_time'
;
```

`nginx.conf`でincludeする。

```shell-session
# grep log_format.conf /etc/nginx/nginx.conf 
  include /etc/nginx/log_format.conf;
```

対象のスコープでこんな感じに指定。

```shell-session
# grep ltsv /etc/nginx/conf.d/default.conf 
  access_log /var/log/path/to/nginx/access.log ltsv;
```

## fluentdの設定

とりあえずこんな感じ。
まだ試験段階なので各種intervalは短め。

**`access.log`の整数や少数で扱いたい(==String以外)項目は`types`ディレクティブで指定する**

```shell-session
# cat /etc/td-agent/td-agent.conf
<source>
  type tail
  format ltsv
  tag com.example.srv01.nginx.access
  types request_length:integer,status:integer,bytes_sent:integer,body_bytes_sent:integer,request_time:float,upstream_response_time:float
  path /var/log/path/to/nginx/access.log
  pos_file /var/log/td-agent/nginx/access.log.pos
</source>

<source>
  type dstat
  tag com.example.srv01.dstat
  delay 10
</source>

<match com.example.srv01.**>
  type secure_forward
  shared_key SECURE_FORWARD_PASS
  self_hostname srv01.example.com
  flush_interval 10s
  <server>
    host collector.example.com
    port 24284
  </server>
</match>
```

## norikraのクエリ

`fluent-plugin-dstat`の出力がこんな感じのJSONなのでちょっと悩んだ。

```json
{
    "dstat": {
        "cpu0 usage": {
            "hiq": "0.0", 
            "idl": "12.345", 
            "siq": "1.234", 
            "sys": "2.3345", 
            "usr": "34.567", 
            "wai": "0.0"
        }, 
        "dsk/sda": {
            "read": "0.0", 
            "writ": "1234.500"
        }, 
        "memory usage": {
            "buff": "142844.0", 
            "cach": "227464.0", 
            "free": "16268.0", 
            "used": "2039700.0"
        }, 
        "net/dummy0": {
            "recv": "0.0", 
            "send": "0.0"
        }
    }, 
    "hostname": "srv01"
}
```

けどnorikra作者の[モリスさんにそのまま扱える](https://twitter.com/tagomoris/status/451729807768702976)と教えていただいて、なんとそのまま扱えてしまった。

```sql
select avg(Float.valueOf(dstat.cpu0_usage.usr)) from TARGET_NAME.win:time_batch(1 min)
```

みたいに書けてすばらしい！
HTMLページ生成時のonclickより前に実行する関数を差し込む

Webアプリを作る際にサーバサイドでアプリケーションフレームワークなどを使っている場合、
生成されたHTMLのonclick属性にすでに関数がセットされている場合があります。（wicketとかwicketとか…）

jQueryを使って、設定されているクリックイベントよりも前に
任意の関数を差し込みます。

```js:prependEvent
prependEvent = function(target, newEvent) {
  var clickHandler;
  clickHandler = target[0].onclick; // イベントを退避
  target[0].onclick = null; // クリックイベントをリセット
  target.click(newEvent); // 差し込み
  target.click(clickHandler); // その後にオリジナルをしまう
};
```


↓こんなカンジで使います。

```html:HTML
<input id="confirmButton" type="button" onclick="alert('first');" value="test input"/>
```

```js:JavaScript
secondFunction = function() {
  alert("second");
};

prependEvent($("input#confirmButton"), secondFunction);
```

second -> first の順でアラートが出現します。
I18n.tでHTMLを出力するのにrawやhtml_safeを使ってはいけない

# TL;DR

rails-i18n は、[キー名に `_html` を付ければ安全に HTML を出力してくれる](http://guides.rubyonrails.org/i18n.html#using-safe-html-translations)。 `raw` や `html_safe` を使ってはいけない。


# I18n の翻訳に HTML を突っ込みたい！

Rails で構築された多言語対応のサイトで、 I18n を使っているときに、翻訳メッセージに HTML を含みたくなることがあります。

例えばこんな感じ。

```yaml:ja.yml
ja:
  incoming_message: '<strong>%{username}</strong>さんからメッセージがあります！'
```

これを表示するときは、 View のテンプレートで、

```erb:show.html.erb
<%= t 'incoming_message', username: @username %>
```

みたいなのを書くわけですが、このままだと `html_safe` でないので自動的にエスケープされてしまいます。

>
&lt;strong&gt;tnj&lt;/strong&gt;さんからメッセージがあります！

悲しい！

## 正しい HTML の含み方

この問題に直面した Rails I18n 初級者は、「じゃーエスケープ避けてそのまま出力させるしかなくない？」と、 `raw` だったり `html_safe` を付けてしまいがちです。

でもそうなると、もし `@username` にタグが含まれていた場合もエスケープされずに出力されてしまうので、簡単に XSS を引き起こしてしまいます。「ここはユーザー入力値は入らないから大丈夫だよ！」は絶対守り切れないし、変数を必要とするたびに「本当にユーザー入力値入ってこないんだっけ?」なんて判断をいちいち必要としていては時間がいくらあっても足りないので、機械に任せたいところです。

で、 Rails がそんな基本的な部分をカバーしていないはずがない！と思って落ち着いて調べてみたら、[やっぱりちゃんと書いてありました](http://guides.rubyonrails.org/i18n.html#using-safe-html-translations)。

> Keys with a '_html' suffix and keys named 'html' are marked as HTML safe. When you use them in views the HTML will not be escaped.

というわけで、 **`_html` で終わる、もしくは `html` というキー名は自動的に HTML として出力されます。** 中に変数がある場合も、きちんとそこだけエスケープ対象にしてくれます。ドキュメントはちゃんと読まないとあかんですね。

## 例

今回の場合だと、キーの名前を `incoming_message_html` に変えてあげれば解決です。

```yaml
incoming_message_html: '<strong>%{username}</strong>さんからメッセージがあります！'
```

```erb
<%= t 'incoming_message_html', username: @username %>
```

としてやるだけで、期待した結果が得られます。

>
<strong>tnj</strong>さんからメッセージがあります！

もし、 `@username` に HTML タグが含まれていたとしても、こちらは自動的にエスケープされるので問題ありません。

>
<strong>&lt;script&gt;alert(1);&lt;/script&gt;</strong>さんからメッセージがあります！

安心して眠れますね！

# 結論

Rails の I18n は、キーの命名次第でちゃんと HTML も出力できるから、 `raw` なんて使わなくても大丈夫だよ！
今更始めるJenkins勉強会 チートシート一覧

2014/04/05開催、今更始めるJenkins勉強会ハンズオンで使用するチートシート一覧です。
http://atnd.org/events/48562

発表資料はこちらです。
http://www.slideshare.net/n_rooms/effective-jenkins-for-study-meeting

詳細は各エントリを参照してください。

##1.CentOS6.3へのJenkinsインストール
http://qiita.com/n_rooms/items/3dd50df3ad101985ca57

##2.ユーザ作成を含む最低限のセキュリティ設定
http://qiita.com/n_rooms/items/2e1adefcc26d51b4e866

##3.プラグインのインストール方法
http://qiita.com/n_rooms/items/c35a536cb5e35c09af7d

##4.社内LAN環境など、インターネットに繋げない環境での運用について
http://qiita.com/n_rooms/items/50e6a1f1071c135a22ee

##5.CollabnetSubversion EdgeのインストールとJenkinsの連携
http://qiita.com/n_rooms/items/2b7de1c7a6921f8cfac0

##6.バックアップについて
http://qiita.com/n_rooms/items/d2ba5c42408333eeca9a
Jenkinsのバックアップ方法

本エントリは「今更始めるJenkins勉強会 ハンズオン」のチートシートの一つになります。
一覧については下記エントリをご確認ください。
http://qiita.com/n_rooms/items/cdd4783997140235ddc4


Jenkinsのバックアップ方法を下記に纏めます。

###1. 手動バックアップ
rpmでインストールすると、JENKINS_HOMEは/var/lib/jenkins です。
下記の設定ファイルをtarボール形式などでアーカイブすれば簡単にバックアップすることができます。
` ${JENKINS_HOME}/*.xml` 
` ${JENKINS_HOME}/plugins/*.jpi` 
` ${JENKINS_HOME}/jobs/${JOB_NAME}/.xml` 

###2. jenkins-backup-scriptを利用
Jenkinsのジョブとしてバックアップを実行できます。
定期的にバックアップする必要がある場合、こちらが便利です。

作者のブログ
http://sue445.hatenablog.com/entry/2013/12/08/005317

GitHubで公開されているスクリプト
https://github.com/sue445/jenkins-backup-script
質問：アプリ内課金の逆（？）配金（？）のやり方

アプリ内課金はユーザーが運営にお金を送るけど、その逆つまりこちらから配るやり方ってどーやるんだろうっていう疑問です。

わかる方いらっしゃったらお願いします。
amaozon ec2でhdd容量を50GBで作成したはずなのに8GBしか表示されない時すること。


![スクリーンショット 2014-04-03 20.22.05.png](https://qiita-image-store.s3.amazonaws.com/0/6561/645e56f7-1361-601a-4056-ded8b3477f43.png "スクリーンショット 2014-04-03 20.22.05.png")

上記のようにEC2インスタンスを作成してもdfに容量が50GBと表示されずに困っていて調べたら`resize2fs`で修正できるとのこと。
http://linuxjm.sourceforge.jp/html/e2fsprogs/man8/resize2fs.8.html

```
$ df -h
Filesystem            Size  Used Avail Use% マウント位置
/dev/xvda1            7.9G  1.1G  6.8G  14% /
tmpfs                 1.9G     0  1.9G   0% /dev/shm

$ sudo resize2fs /dev/xvda1
resize2fs 1.42.3 (14-May-2012)
Filesystem at /dev/xvda1 is mounted on /; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 4
The filesystem on /dev/xvda1 is now 13107200 blocks long.

$ df -h
Filesystem            Size  Used Avail Use% マウント位置
/dev/xvda1             50G  1.1G   49G   3% /
tmpfs                 1.9G     0  1.9G   0% /dev/shm


```
PulseAudioのノイズを除去する

# 症状
- pavucontrolで音量を確認した時に, ボリュームメータが瞬間的に振れる.
- ヘッドフォン等を抜き差しした場合にportが自動的に変更される or できない.

# 原因
PulseAudioのmodule-switch-on-port-availableによって間違ったportが割り当てられている可能性が高い.

# 対処方法
`/etc/pulse/default.pa` 中の

```
load-module module-switch-on-port-available
```

をコメントアウトする.

# 参考リンク
[ヘッドフォンの抜き差しと ALSA のチャンネルのミュート]
(https://wiki.archlinux.org/index.php/PulseAudio_(%E6%97%A5%E6%9C%AC%E8%AA%9E)#.E3.83.98.E3.83.83.E3.83.89.E3.83.95.E3.82.A9.E3.83.B3.E3.81.AE.E6.8A.9C.E3.81.8D.E5.B7.AE.E3.81.97.E3.81.A8_ALSA_.E3.81.AE.E3.83.81.E3.83.A3.E3.83.B3.E3.83.8D.E3.83.AB.E3.81.AE.E3.83.9F.E3.83.A5.E3.83.BC.E3.83.88)
【InDesign】DocumentからスタートしてDocumentまで戻る【DOM散歩】

InDesign CS4 + ExtendScript Toolkitで確認。

```javascript
var doc = app.activeDocument;

$.writeln( doc ===
  app.activeDocument      // Document
    .stories              //  Stories
    .item(0)              //   Story
    .paragraphs           //    Paragraphs
    .item(0)              //     Paragraph
    .parentTextFrames[0]  //    TextFrame (itemメソッドは無い)
    .parent               //   Page
    .parent               //  Spread
    .parent               // Document
  ? true : false
);

$.writeln( doc ===
  app.activeDocument  // Document
    .spreads          //  Spreads (Document.pagesも可)
    .item(0)          //   Spread
    .pages            //    Pages
    .item(0)          //     Page
    .textFrames       //      TextFrames
    .item(0)          //       TextFrame
    .paragraphs       //        Paragraphs
    .item(0)          //         Paragraph
    .parentStory      //        Story
    .parent           //       Document
  ? true : false
);
```
レポートのエクスポート機能を実行するURL

レポートのエクスポート機能でレポートの情報をExcelやCSV形式でダウンロードできます。このダウンロード処理を実行するためのURLは次のようになっています。

```javascript
'/(reportId)?export=1&enc=UTF-8&xf=xls'
```

Visualforceやカスタムボタン、カスタムリンクなどからレポートのエクスポート機能を実行したいときに便利です。


##参考サイト
**Custom link to download/export report in single click**
http://salesforce.stackexchange.com/questions/13602/custom-link-to-download-export-report-in-single-click
Xamarin.iOS の AOT に気をつけろ！Rx の FromEventPattern を使うときの注意点


Reactive Extensions の ``FromEventPattern`` を使うと、イベントを ``IObservable`` に変換できて、複数のイベントに時系列な関係を与えたり、他のストリーム処理とシームレスに扱えたりします。

* [イベント・プログラミングとRx － ＠IT](http://www.atmarkit.co.jp/fdotnet/introrx/introrx_02/introrx_02_02.html)

Xamarin .iOS でも .Android でもこの機能を使うことができて大変便利ですが、Xamarin.iOS の場合 AOT による制限に気をつける必要があります。

以下は、なんの変哲もない、「ボタンを押したらタイトルを ”Clicked!” に変える」コードです。

```csharp:
MyButton.TouchUpInside += (s, e) => MyButton.SetTitle("Clicked!", UIControlState.Normal);
```

これを FromEventPattern を使うとこう書けます。

```csharp:DoesNotWorkOnDevice.cs
Observable.FromEventPattern(MyButton, "TouchUpInside")
.Subscribe(x => MyButton.SetTitle("Clicked!", UIControlState.Normal));
```

このコード、iOSシミュレータでは正常に動作しますが、 **実機では、ビルドは通りますが動作しません。** 実行時にこんなエラーがでます。


> System.InvalidOperationException: Could not find event 'TouchUpInside' on object of type 'MonoTouch.UIKit.UIButton'.

``TouchUpInside`` が無いと言われます。

これは AOT により生成されたコードに、このイベントが含まれないのだと推測します。イベント名を文字列リテラルで指定しているので、そこまでの解析は期待できないですよね。

シミュレータで動作したのは、この場合は AOT でなく JIT で動作しているため。以下でも言及されています。

* [Xamarin.iOSの仕組みとアプリケーションの構成 - Build Insider](http://www.buildinsider.net/mobile/insidexamarin/05)

> 対象がiOSシミュレーターである場合と、iOSデバイスである場合とで、大きく異なる。iOSシミュレーターは、エミュレーターではなく、あくまでMac OS Xが動作しているx86 CPUの上で動作している仮想マシンであり、アプリケーションはJITによって動作する。iOSデバイスはARMであり、iOSデバイス用にビルドされたアプリケーションはAOTによってARMのCPU命令に変換されており、ARM上でしか動作しない。

Xamarin.iOS では実機で動作させないと安心ならないと言われる所以です。

さて、このケースでは、FromEventPattern の別なオーバーロードを使うことで解決です。

```csharp:WorkOnDevice.cs
Observable.FromEventPattern(
  h => MyButton.TouchUpInside+=h, 
  h => MyButton.TouchUpInside-=h)
.Subscribe(x => MyButton.SetTitle("Clicked!", UIControlState.Normal));
```

Xamarin.iOS の制限事項は以下に。

* [Limitations | Xamarin](http://docs.xamarin.com/guides/ios/advanced_topics/limitations/)

これまでこの制限に引っかかった事がなかったのですが、初めて引っかかりました。

メソッドを文字列リテラルで書いた時点で私の負けです、本当にありがとうございました。

## いくつか追記

[@espresso3389](https://twitter.com/espresso3389) さんも、同様のことを書いておられました。 ``[PreserveAttribute]`` なるほど。

* [AOTの罠: Xamarin.Forms の ListView で System.MissingMethodException: Default constructor not found for type - espresso3389の日記](http://espresso3389.hatenablog.com/entry/2015/01/27/040427)

@nuits_jp さんも [調べてくれました](https://twitter.com/nuits_jp/status/770558426870980609)。 現在のバージョン(Xamarin.iOS 9.8)でも同様です。また Xamarin.Forms では発生しないようですが、 これは Xamarin.Forms 内部で使われているから AOT に消されないというだけで、必ず消されない保証はありません。

Xamarin.Forms Behavior の公式ドキュメントに、下のようなコード例が紹介されているんですが、これも AOT で消される可能性を持っています、使うときは注意しましょう。

* [Reusable EventToCommandBehavior - Xamarin](https://developer.xamarin.com/guides/xamarin-forms/behaviors/reusable/event-to-command-behavior/)
要素を横も縦も中央寄せする方法

要素を縦も横も中央寄せする方法。
tableでも同じように出来るけど、他の要素でやりたい場合。
この方法は、外側のタグのサイズに依存する場合に便利。

`all_center_base`で縦横確保して、`all_center_inner`で位置調整をしている。
もし、サイズが決まっているのであれば、`all_center_inner`を付けている要素にサイズを設定すれば`all_center_base`タグは要らない。

この方法の他にもやり方はあるので、場合によって使い分ける。


```css
.all_center_base {
	display: table;
	width: 100%;
	height: 100%;
}
.all_center_inner {
	display: table-cell;
	text-align: center;
	vertical-align: middle;
}
```

```html
<div class="all_center_base">
	<div class="all_center_inner">
		中央寄せしたい要素
	</div>
</div>
```
Xcode5.1環境でappledocをインストールする

検索しても日本語の記事が見当たらなかったためTipsとして残しておきます。

xcode5.1ではガーベッジコレクションのサポートがなくなりました。

[New Features in Xcode 5.1](https://developer.apple.com/library/ios/documentation/DeveloperTools/Conceptual/WhatsNewXcode/Articles/xcode_5_1.html)

そのためGCを利用しているosxアプリケーションをビルドしようとすると、下記のエラーを出力します。
```
error: garbage collection is no longer supported
```

ソースコードからAppleライクなドキュメントを生成してくれる[appledoc](http://qiita.com/mtgto/items/c97c59d93fe67d748055)も、2014/04/03時点のリビジョン(v2.2)ではGCを利用しています。
従って、homebrewもしくはリポジトリ内インストールスクリプトを使いビルドしても、上記エラーでインストールできません。

調べてみたところ、本件に関しては既にappledocのリポジトリ上でissueとして挙げられていました。
[XCode 5.1: Garbage Collection Not Supported #435](https://github.com/tomaz/appledoc/issues/435)

こちらのやりとりの中で、開発者の方がビルド済みのappledocを配布されています。
> Uploaded latest v2 binary release. It's not installer, but I think a developer should figure it out from install instructions on download page :)
> *https://github.com/tomaz/appledoc/issues/435#issuecomment-37917522*


↓これをダウンロード・実行してみたところ、無事ドキュメントの生成が出来ました。
https://github.com/tomaz/appledoc/releases/tag/v2.2-963
カレントディレクトリ配下の.svn(.git)ディレクトリをすべて削除するコマンド(shellscript, windowsバッチファイル)

* * *


SVNからチェックアウトしてきた環境を別のSVNのチェックアウト環境に移植するときなど、なにかと.svnのディレクトリがじゃまになる時があります。そんなときは下記のコマンドを投入すると.svnディレクトリをリダイレクトで検索して削除できます。

- Linux/Unix

```svn_delete.sh
	find . -name .svn -exec rm -fr {} \;
```
   もしくは、

```svn_delete.sh
	find . -name .svn | xargs rm -rf
```

-  windows batchファイル

```svn_delete.bat
	for /R %i in (.svn) do rd /Q /S "%i"
```

※注 もちろん、ターミナル(windowsの場合はコマンドプロンプト)から直接本コマンドを叩いてもOKです。

>.svnを.gitに変更すればgitの環境でも使えそう٩(’ω’)و
Skinny ORMとOracleのSequenceでIDの自動採番をする

# 概要
autoincrement機能を持たないOracleをSkinny ORMで扱うときに、IDの自動採番をどうやって行うか。

# 前提
- Oracleへの接続はできてる
- 以下のSQLで生成されるテーブルとシーケンスがある

```sql
CREATE TABLE HOGE (
  ID   NUMBER(10)   NOT NULL,
  NAME VARCHAR2(40) NOT NULL,
  PRIMARY KEY (ID)
);

CREATE SEQUENCE HOGE_SEQ
INCREMENT BY 1
START WITH 1
NOMAXVALUE
NOMINVALUE
NOCYCLE
NOCACHE;
```

# 方法
とりあえず2つやってみた

## Oracleに全部任せる
- triggerを利用して、insert時にnextvalを取得して採番する
という方針。

まずtriggerを作る

```sql
create or replace trigger hoge_id_trg
before insert on hoge for each row
  begin
    select
      hoge_seq.NEXTVAL
    into :new.id
    from dual;
  end;
```

modelの実装はこんな感じ。`override def useAutoIncrementPrimaryKey = false`しておくことが必要。

```scala:Hoge.scala
package model

import skinny._
import scalikejdbc._, SQLInterpolation._

case class Hoge(id: Long, name: String)

object Hoge extends SkinnyCRUDMapper[Hoge] {

  override lazy val defaultAlias = createAlias("hoge")

  // autoincrement を切る
  override def useAutoIncrementPrimaryKey = false

  override def extract(rs: WrappedResultSet, n: ResultName[Hoge]) = new Hoge(
    id = rs.long(n.id),
    name = rs.string(n.name)
  )

  val h = Hoge.defaultAlias

  def create(name: String): Long = DB localTx {
    implicit s =>
      // ID列はOracleでよしなにしてくれる
      Hoge.createWithNamedValues(h.name -> name)
  }
}
```

## Skinny ORMに任せる
autoinclementの処理時に、独自に自動採番ルールを定義できる

- `useExternalIdGenerator`をoverrideしてtrueに
- `generateId`を実装

```scala:Hoge.scala
package model

import skinny._
import scalikejdbc._, SQLInterpolation._

case class Hoge(id: Long, name: String)

object Hoge extends SkinnyCRUDMapper[Hoge] {

  override lazy val defaultAlias = createAlias("hoge")

  // useAutoIncrementPrimaryKeyはtrueのまま
  // useExternalIdGeneratorをoverrideする
  override lazy val useExternalIdGenerator = true

  // generateIdを実装する
  override def generateId: Long = DB localTx {
    implicit session =>
      // ナマのSQLを走らせて、NEXTVALの結果を得る
      sql"select hoge_seq.NEXTVAL as id from dual".map(_.long("id")).first().apply.get
  }

  override def extract(rs: WrappedResultSet, n: ResultName[Hoge]) = new Hoge(
    id = rs.long(n.id),
    name = rs.string(n.name)
  )

  val h = Hoge.defaultAlias

  def create(name: String): Long = DB localTx {
    implicit s =>
      Hoge.createWithNamedValues(h.name -> name)
  }
}
```

# まとめ
とりあえずどちらの方法でも、IDを自動採番してinsertすることには成功した。
なんかもうちょっとうまい方法があるような気はしてますが。

Oracle+Skinny ORMの調査中にハマったポイントだったのでメモとして残しておきます。
誰かの参考になれば幸い。
node-inspector で hubot をデバッグする


# hubotをデバッグする
nodeにはデバッグモードが用意されている。普通はこんな感じでデバッグモードに入る。

```普通のデバッグの方法
>node --debug hogehoge.js
```

でもhubotは`bin/hubot`のシェルスクリプトで立ち上げるので、この方法ではデバッグモードに入れない。この起動スクリプトの中身はこんなかんじ。

```bin/hubot
#!/bin/sh

npm install
export PATH="node_modules/.bin:node_modules/hubot/node_modules/.bin:$PATH"

exec node_modules/.bin/hubot "$@"
```

つまり`node_modules/.bin/hubot`をexecできればいいらしい。

## 1.hubotをデバッグモードで立ち上げる
`node_modules/.bin/hubot`の中身はcoffeescriptなので、こんなコマンドでhubotをデバッグモードで立ち上げる。
必要があれば`-a hoge`のような引数もここで渡す。

```
>coffee --nodejs --debug node_modules/.bin/hubot -a hoge
```

## 2.node-inspectorを起動
```
>node-inspector
Node Inspector v0.7.2
Visit http://127.0.0.1:8080/debug?port=5858 to start debugging.
```

## 3.8080ポートをトンネリング（必要があれば）
```
>ssh -L 8080:localhost:8080 hori@hogehoge.jp
```

## 4.chromeでアクセス
![kobito.1396523648.045696.png](https://qiita-image-store.s3.amazonaws.com/0/18569/0675e4a5-d1d4-c6f6-6568-5d8ab4ccedd8.png "kobito.1396523648.045696.png")
Git bash(windows)でPS1変えたいとか日本語が正しく表示されないとか

追記：
なんか全然素晴らしいイケてる記事が既にあったのでこっちみたほうがいい
http://qiita.com/kumazo@github/items/2169e1ee7be278f82b94


日本語が化ける問題は
~/.bash_profileか.bashrcに以下を追加

~~~
alias ls='ls  --color=auto --show-control-chars'
alias ll='ls -l --color=auto'
~~~

gitbash起動

1. gitbashの左上のアイコンでプロパティを選択
2. 違うフォント→同じフォント戻す

＿人人人人人人人人人人人人人＿
＞　なぜか正しく表示される　＜
￣Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y￣

理由はわからない。マジでわからない

##PS1
PS1に関しては.bash_profileに書いても何故か上手く動かないので直接書き換える

~~~
C:\Program Files (x86)\Git\etc\profile
~~~
CVSコミットログに文字コードが混在するCVSをGitリポジトリに変換する

#概要

過去を捨ててCVSからチェックアウトした状態で、1st commitしてもいいんだけどせっかくなら履歴ごと移行したい。

古いプロジェクトでCVSに歴史がありコミットログそのものがぐちゃぐちゃの文字コードでコミットされてる場合、文字コードを修正しつつGitに変換する。

流れ
1. git cvsimport install
2. CPANで必要なモジュールをインストール(Unicode::Japanese ,Term::ReadKey)
3. cvsimport scriptを修正する
4. git cvsimportする


ある程度自動判別でうまくいくんだけど自動判別できないメッセージが出てきた。
そこで判定できなかった場合プロンプト出して最後は手動で文字コードを選択する対話式のpatch当てた。

#git-cvsimportの修正

ここにあるファイルいじった

~~~
/usr/libexec/git-core/git-cvsimport
~~~

##最初のuseに追加

~~~
use Unicode::Japanese; #文字コード自動変換
use Term::ReadKey;     #対話式プロンプトのために入れる
~~~


##自分で作ったfunction

~~~perl
my $utf = Unicode::Japanese->new();
my $oldmsg = '';

ReadMode('cbreak');

sub show_message($){
  print $utf->get;
}

sub set_enc($){
  while(1){
    print "Enter encoding(UTF8(u) / SJIS(s) / EUC-JP(e)):";
    my $enc = ReadKey 0;
    last unless defined $enc;

    print "\n";
    if($enc eq 'u'){
      $utf->set($_[0] , 'utf8');
      return;
    }
    elsif($enc eq 'e'){
      $utf->set($_[0] , 'euc-jp');
      return;
    }
    elsif($enc eq 's'){
      $utf->set($_[0] , 'sjis');
      return;
    }
    else{
      print "error encoding code.\n";
    }
  }

}

sub enc_prompt($){
  while(1){
    print "commit message:";
    show_message($_[0]);

    print "message ok?(y/n):";
    my $ope = ReadKey 0;
    last unless defined $ope;
    print "\n";
    if($ope eq 'y'){
      return;
    }
    set_enc($_[0]);
  }
}
~~~

##sub commit 修正

~~~
#(中略)
	# loose detection of merges
	# based on the commit msg
	foreach my $rx (@mergerx) {
		next unless $logmsg =~ $rx && $1;
		my $mparent = $1 eq 'HEAD' ? $opt_o : $1;
		if (my $sha1 = get_headref("$remote/$mparent")) {
			push @commit_args, '-p', "$remote/$mparent";
			print "Merge parent branch: $mparent\n" if $opt_v;
		}
	}

    #ここから文字コード判定追加コード
    #文字コード判定追加コード
    my $noenc = $logmsg;
    $utf->set($logmsg,"auto");

    if($noenc ne $logmsg){
      enc_prompt($logmsg);
    }
    $logmsg = $utf->get;
    #ここまで追加したソース

    #(略)

~~~

git cvsimportはすげぇ時間が掛かるからcommit数の制限かけて何回かに分けてやるのが無難
分割するオプションは忘れた。

参考資料

http://chiu01.blogspot.jp/2012/02/cvsimport-commit-message-charset.html
InfluxDB を10分だけ触ってみた

InfluxDB とは [Black Duck Open Source Rookies of the Year 2013](http://www.blackducksoftware.com/news/releases/black-duck-announces-open-source-rookies-year-winners) にも選ばれた今注目の Time series metrics database である。

ということでちょっと触ってみた。

# インストール

http://influxdb.org/download/ ページを見て、環境にあわせてインストールする。

例えば CentOS x86_64 の場合

```
$ wget http://s3.amazonaws.com/influxdb/influxdb-latest-1.x86_64.rpm
$ sudo rpm -ivh influxdb-latest-1.x86_64.rpm
influxdb process is not running [ FAILED ]
Starting the process influxdb [ OK ]
influxdb process was started [ OK ]
```

おぉ、これだけなのか。

http://influxdb.org/docs/ Introduction ページを見て、アクセスする。API が 8086 ポート、Web UI が 8083 ポートで動いているらしい。

![スクリーンショット 2014-04-03 19.44.19.png](https://qiita-image-store.s3.amazonaws.com/0/9641/28c60f6f-0a97-e8de-0ae4-69998b16183f.png)

ちなみに lsof -p してみると他にもいくつか LISTEN しているようだ。

```
$ sudo lsof -p 16288 -P | grep TCP
influxdb 16288 root    5u  IPv6 988300294      0t0       TCP *:8090 (LISTEN)
influxdb 16288 root    7u  IPv6 988300298      0t0       TCP *:8099 (LISTEN)
influxdb 16288 root    9u  IPv6 988300742      0t0       TCP *:8086 (LISTEN)
influxdb 16288 root   10u  IPv6 988300744      0t0       TCP *:8083 (LISTEN)
```

# GUI で遊ぶ

実際に運用しようと思ったら、HTTP API を使うとは思うが、せっかくなので GUI から遊んでみる。

http://localhost:8083 にアクセスして、デフォルト root/root でログインする。ログインしたら GUI から database を作ったりできるようだ。

![スクリーンショット 2014-04-03 19.48.17.png](https://qiita-image-store.s3.amazonaws.com/0/9641/e5cbd236-8a3b-61ef-a48e-2327ed2b1154.png)

Database を作って、Explore リンクをクリックすると、次のような画面に入る。

![スクリーンショット 2014-04-03 19.55.20.png](https://qiita-image-store.s3.amazonaws.com/0/9641/58934b4f-2aa7-3a46-319d-bd59558dffb0.png)

MySQL でいうところの table に相当するものを series と呼ぶらしい。試しに以下のようなデータを series に登録してみる。

```
Time Series Name: response_times
values: {"time": 1382819388, "value": 234.3}
```

で、Query を

```
select value from response_times;
```

としてみると、なんか出た。

![スクリーンショット 2014-04-03 19.58.34.png](https://qiita-image-store.s3.amazonaws.com/0/9641/b6077445-0594-e2e1-592f-5effb6e72261.png)

もっと入れてみる。ほうほう。

![スクリーンショット 2014-04-03 20.02.29.png](https://qiita-image-store.s3.amazonaws.com/0/9641/e0b6215c-06fb-96e0-8df6-d36b09f77efc.png)

# SQL-like query language

あとは、[SQL-like query language](http://influxdb.org/docs/query_language/) を使って色々ごにょごにょできるようだ。

```
select value from response_times where time > now() - 1h limit 1000;
```

のようにして１時間以内、1000個のみに絞るとか、

```
select max(value) from response_times group by time(10m);
```

のようにして、10分ごとの max 値の値のみを取るとか。

Time Series SQL 楽しい ^^


# おわりに

GUI を使ったのでグラフが表示されたが、実際に API 経由で使う場合は、json でデータが返ってくるだけなので描画ツールは自分で実装しなければならないはず。Elasticserach に対する Kibana のようなものが、InfluxDB にもあると捗るので、誰か作ると良いですね。

追記：そういえば最近 twitter のタイムラインに流れてた [Grafana](http://grafana.org) を使えるのかな。今、鋭意実装中みたいだけど期待できますね。cf. https://github.com/torkelo/grafana/wiki/InfluxDB

> With version 1.5 Grafana now supports InfluxDB. The support is pretty basic with this first version. 

追記の追記：触ってみました => [Grafna on InfluxDB をちょっとだけ触ってみた](http://qiita.com/sonots/items/8fbc92ff1c3e57ee7de7)
My first lesson - Ruby

Got my first Programming Blog today!

I just installed ruby and rails and starting on my way to understand every little bit about it.
I have so many things to figure out but for now, I need to start from scratch! It is so embarrassing to post a little and very basic commands of ruby but I hope to improve soon.

I followed this steps 
http://www.rubylife.jp/install/install/index1.html

and tried to create some simple program following this
http://magazine.rubyist.net/?0002-FirstProgramming

That's very simple but I'm hoping to learn more onwards.
That's all for today.
PD for iOS版にないオブジェクトの追加の仕方。


PureDataには、
libpdプロジェクトってのがあって
pd-for-iosを使うと、iOSで色々なシンセサイザーが作れます。
Androidでも作れる。
libpdすてき。
[Github pd-for-ios](https://github.com/libpd/pd-for-ios)

Mac版はここからダウンロード可能。
[Pd-extended](http://puredata.info/downloads)

ですが、

Macで作ったpdパッチをiOSに読み込めば大体は再生されるのだけど、
extendっていうだけあって、たまにMac版にはあって、iOS版にはないオブジェクトもある。

pure-dataの元リポジトリには、ソースが全部あるので
[pure-data Source Forge](http://sourceforge.net/projects/pure-data/)

必要なオブジェクトのソースを、
libpdに追加して、

```c:m_conf.c

// ....
void d_soundfile_setup(void);
void d_ugen_setup(void);

// こんなかんじで
void your_extended_setup(void);


// ....
d_soundfile_setup();
d_ugen_setup();

// こんなかんじで
your_extended_setup();


```

初期化関数をconfに入れてあげればオブジェクト追加可能ですた。
UIWebViewでローカルからページを読み込むと履歴に反映されない問題


# はじめに
UIWebViewにおいて、ローカルに置いてあるhtmlや、文字列から直接WebViewに読み込んだ場合
主に下記のメソッドを使用するケースが多いと思います。

```objectivec:UIWebViewClassMethod
-loadHTMLString:baseURL:
-loadData:MIMEType:textEncodingName:baseURL:
```

* [loadHTMLString:baseURL:](https://developer.apple.com/library/ios/documentation/uikit/reference/UIWebView_Class/Reference/Reference.html#//apple_ref/occ/instm/UIWebView/loadHTMLString:baseURL:)
* [loadData:MIMEType:textEncodingName:baseURL:](https://developer.apple.com/library/ios/documentation/uikit/reference/UIWebView_Class/Reference/Reference.html#//apple_ref/occ/instm/UIWebView/loadData:MIMEType:textEncodingName:baseURL:)

```objectivec:Example
//HTML文字列
NSString *htmlString = @"<html>...";
            
 //HTMLを読み込み
 [self.webView loadHTMLString:htmlString baseURL:nil];
```

しかし、上記のメソッドを使用した場合UIWebView(javascript)のgoBack,goForwardのhistroyStackに反映されず、
`[self.webView goBack];`や`[self.webView goForward];`で遷移させる事ができなくなってしまいます。

自前でWebViewのスタックを管理して表示履歴を操作する事はできなくは無いですが結構しんどかったので、
手っ取り早く修正する方法を紹介したいと思います。

# 解決策

いろいろと調べていると、`loadRequest:`を使用してページを読み込めばスタックに反映される事が分かったので、
どうにかしてNSURLRequest形式でhtmlデータを取得すれば良さそうです。

## html文字列からリクエストする場合

ファイル化されておらず、変数保持している文字列などを読み込みたい場合は、
一旦キャッシュディレクトリに保存してファイルに直接アクセスします。
(別途ファイルの削除などの制御はあったほうがいいかもしれません)

```objectivec:Case1
//html文字列
NSString *htmlString = @"<html>...";

//WebViewの遷移履歴を保持するためにリソースファイル化してアクセスする
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *documentDir = [paths objectAtIndex:0];
if (documentDir) {
    documentDir = [documentDir stringByAppendingPathComponent:@"example.html"];

     //Cacheディレクトリにexample.htmlという名前でファイルを生成
    [htmlString writeToFile:documentDir atomically:YES encoding:NSUTF8StringEncoding error:nil];

    //filePathを指定してNSURL形式で取得 & リクエスト
    [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:documentDir]]];
}
```

## バンドルからリクエストする場合

アプリバンドル内にすでにリソースファイルとして登録されている場合は、
保存処理がいらないのでもっと簡単です。

```objectivec:Case2
//filePath
NSString *path = [[NSBundle mainBundle] pathForResource:@"example" ofType:@"html"];
if (path){
    //filePathを指定してNSURL形式で取得 & リクエスト
    [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:path]]];
}

```

# 終わりに

やっつけですが、UIWebViewにローカルファイルを読み込む場合のスタック周りの問題回避方法をご紹介しました。
文字列から直接リクエストする場合は毎回ファイルへの書き込み処理が発生してしまうのがどうなのかなぁという印象です。
(もっといい解決策は無いのかしら。。。)
Webviewがっつりなアプリとかだともっとちゃんと実装を考えた方がいいかもしれません。
取り急ぎ対応tipsとして認識していただけると幸いです。

# 参考資料

* [UIWebView Class Reference](https://developer.apple.com/library/ios/documentation/uikit/reference/UIWebView_Class/Reference/Reference.html)
homebrewでデーモンをつくる

追記: 今は使えなくなってしまったっぽいです。
http://pyoonn.hatenablog.com/entry/2014/11/05/150031

homebrewでインストールしたものをデーモン化して起動するときに便利。

```bash
$ [sudo] brew services start <formula>
```

例:homebrewでインストールしたmongoDBをデーモンとして起動する。

```bash
$ brew services start mongodb
```

`brew list`コマンドでインストールしたものの一覧を表示できる。

```bash
$ brew list
autoconf	git-flow	mysql		pkg-config	readline	ruby-build
git		mongodb		openssl		rbenv		redis		sqlite
```

`brew services list`コマンドでデーモン化したものの一覧を表示できる。
Jenkinsで管理者権限をふっ飛ばした場合

ちょっと試したくてインストールしてUIにセキュリティざるだから認証入れろやって言われた時に適当にいじるとなんか管理者がいなくなって何もできなくなって悲しい感じになることがある。あった。

~~~
$ vim /var/lib/jenkins/config.xml
~~~

config.xmlにこれ書く
authorizationStrategyの中身が吹っ飛んでるんでこれ書く（sho2010のところはユーザー名）

~~~
  <authorizationStrategy class="hudson.security.ProjectMatrixAuthorizationStrategy">
    <permission>hudson.model.Hudson.Administer:sho2010</permission>

  </authorizationStrategy>
~~~

追記　セキュリティ切っちゃう場合
https://wiki.jenkins-ci.org/display/JENKINS/Disable+security
CapybaraがJSの動作を待ってくれる仕組み

[Capybara](https://github.com/jnicklas/capybara/)便利ですね。
うちでは[Poltergeist](https://github.com/jonleighton/poltergeist)と組み合わせて使っています。
JSがらみのUIのテストをしていたとき、JSの動作完了を待ってくれず、テストがこけるという事があったので、JSを待つ部分の動作原理について調べてみました。

`Capybara::Node::Base#syncronize`に実装がありました。

```lib/capybara/node/base.rb
      def synchronize(seconds=Capybara.default_wait_time)
        start_time = Time.now

        if session.synchronized
          yield
        else
          session.synchronized = true
          begin
            yield
          rescue => e
            session.raise_server_error!
            raise e unless driver.wait?
            raise e unless catch_error?(e)
            raise e if (Time.now - start_time) >= seconds
            sleep(0.05)
            raise Capybara::FrozenInTime, "time appears to be frozen, Capybara does not work with libraries which freeze time, consider using time travelling instead" if Time.now == start_time
            reload if Capybara.automatic_reload
            retry
          ensure
            session.synchronized = false
          end
        end
      end
```

https://github.com/jnicklas/capybara/blob/master/lib/capybara/node/base.rb#L73

`Capybara::Node::Matchers`やら`Capybara::Node::Finders`やらのメソッドから呼ばれています。

```lib/capybara/node/finders.rb
      def find(*args)
        query = Capybara::Query.new(*args)
        synchronize(query.wait) do
          if query.match == :smart or query.match == :prefer_exact
            result = resolve_query(query, true)
            result = resolve_query(query, false) if result.size == 0 and not query.exact?
          else
            result = resolve_query(query)
          end
          if query.match == :one or query.match == :smart and result.size > 1
            raise Capybara::Ambiguous.new("Ambiguous match, found #{result.size} elements matching #{query.description}")
          end
          if result.size == 0
            raise Capybara::ElementNotFound.new("Unable to find #{query.description}")
          end
          result.first
        end.tap(&:allow_reload!)
      end
```

例えば`Capybara::Node::Finders#find`では、ノードが見つからなかった場合に`Capybara::ElementNotFound`が発生しますが、それなら見つかるまで`retry`すれば良いじゃない、という発想ですね。
分かりやすい。
`Capybara.default_wait_time`は`syncronize`にかかる最大秒数を設定しているので、大きな値を入れても何かバグが無い限りテストの実行時間が長くなったりはしません。
ので、うちでは10秒に設定しています(デフォルトは2秒)

昔は`wait_until`というメソッドがあったようですが、Capybara2になってから消えたようです。
[Why wait_until was removed from Capybara](http://www.elabs.se/blog/53-why-wait_until-was-removed-from-capybara)

ちなみに、調べるきっかけになった`syncronize`してくれない件ですが、exampleに`js: true`が付いてなかったせいでした／(^o^)＼
`js: true`しないとdriverがPoltergeistにならず、`Capybara::Driver::Node`が利用されます。
JSも実行されません。(ちゃんと読んでないけどおそらく`#execute_script`に実装が必要)
`#syncronize`では`driver.wait?`が`false`を返すので、`rescue`ブロックは単に例外を投げ直します。
CasperJSでHTTPステータスコードを取得する

response.status です。

```coffeescript
casper = require('casper').create()

casper.start 'http://www.yahoo.co.jp/', (response) ->
  @echo '[status code] ' + response.status
  // -> [status code] 200

casper.run()
```

responseの中にstatusというプロパティがあるのでそこからHTTPステータスコードを取得できます。

### テストに使うには

初めからテストに使うと分かっていれば、responseから取得する必要はなく `assertHttpStatus` というテスト用メソッドが使えます。

```coffeescript:yahoo_test.coffee
casper.test.begin 'HttpStatus Test', (test) ->
  casper.start 'http://www.yahoo.co.jp/', ->
    test.assertHttpStatus 200

  casper.run ->
    test.done()
```

```
$ casperjs test yahoo_test.coffee
```

テストのときは `test` をつけて実行しましょう。
CasperJSでBASIC認証のページにアクセスする

pageSettingsにuserNameとpasswordを追加すればアクセスできます。

```js
var casper = require('casper').create({
  pageSettings: {
    userName: 'testuser',  // BASIC認証のID
    password: 'testpass'   // BASIC認証のパスワード
  }
});

casper.start('http://www.example.co.jp/', function () {
  this.echo(this.getTitle());
});

casper.run();
```

pageSettingsに関しては以下を参照。
http://saisa.hateblo.jp/entry/2013/09/12/222035

userAgentなんかもpageSettingsで指定できたりする。
bootstrap2

#グリッド
###1.固定グリッドデザイン
・container > row > spanと入れ子にする。
・spanは横幅940pxの固定エリアを12カラムに分割している。1カラムごとにwidthにピクセルが設定される。
  row>spanを入れ子にした場合は外側の合計カラム数と同じにする。

###2.可変グリッドデザイン
・container-fluid > row-fluid > spanと入れ子にする。
・spanは12カラムに分割される。1カラムごとごとにwidthに%が設定される。

###3.共通
・containerは中央寄せしてくれる。
・rowの直下にコンテンツを書くと左にづれてしまう。
・隣と間をあけたい場合は、offsetXと書く。(Xは数字)

#アラート
http://php-fan.org/sample_code_demo/bootstrap.html

```hmtl
<div class='alert'>
    <a class='close' data-dismiss='alert'>×</a>
    メッセージ
</div>

```

#タブメニュー
・nav-tabsのhrefとtab-contentのidとを対応させる。
・liとdivにactiveを付加した箇所が初期表示。
・タブの位置を設定できる。例えば、tabbaleにtabs-rightを追加すると右側にタブが表示される。

```html
<div class="tabbale">
    <!-- タブ部分 -->
    <ul class="nav nav-tabs">
        <li class="active"><a href="#tab1" data-toggle="tab">Tab1</a></li>
        <li><a href="#tab2" data-toggle="tab">Tab2</a></li>
        <li><a href="#tab3" data-toggle="tab">Tab3</a></li>
    </ul>
    <!-- コンテンツ部分 -->
    <div class="tab-content">
        <div id="tab1" class="tab-pane active">Tab1 content</div>
        <div id="tab2" class="tab-pane">Tab2 content</div>
        <div id="tab3" class="tab-pane">Tab3 content</div>
    </div>
</div>
```

#inputのサイズ

```html
.input-mini {
  width: 60px;
}
.input-small {
  width: 90px;
}
.input-medium {
  width: 150px;
}
.input-large {
  width: 210px;
}
.input-xlarge {
  width: 270px;
}
.input-xxlarge {
  width: 530px;
}
```

#table

1. table
行ごとに下線が引かれます。
2. table table-striped
行ごとに下線が引かれたうえに、偶数行に背景色がつきます。
3. table table-bordered
テーブルのセルに全て線が入ります。テーブル自体は角丸になります。
4. table table-condensed
tableよりも、無駄な余白が少なくなります。
5. table text-cente
center寄せ

```html
<table class="table table-bordered table-condensed text-center">
  <thead>
    <tr class="head1">
      <th>aa</th>
      <th>bb</th>
      <th>cc</th>
    </tr>
  </thead>
    <tbody>
    <?php foreach ($foo as $bar):?>
      <tr>
        <td><?php echo h($bar['Bar']['aa']);?></td>
        <td><?php echo h($bar['Bar']['bb']);?></td>
        <td><?php echo h($bar['Bar']['cc']);?></td>
      </tr>
    <?php endforeach ?>
    </tbody>
</table>
```
質問：printlnについて

class ArrayTest{
	public static void main(String[] args){
		String[] name = new String[3];
		name[0] = "1番目";
		name[1] = "2番目";
		name[2] = "3番目";

		System.out.println("nameの0：" + name[0]);
		System.out.println("nameの1：" + name[1]);
		System.out.println("nameの2：" + name[2]);

		//int型の変数iを配列として宣言して、値を同時に入れます
		int[] i = {1,2,3};
		System.out.println("iの0：" + i[0]);
		System.out.println("iの1：" + i[1]);
		System.out.println("iの2：" + i[2]);

		//変数cをchar型の配列として宣言します
		char c[] = new char[1];
		c[0] = 'A';
		System.out.println("cの0：" + c[0]);
	}
}


結果
nameの0：1番目
nameの1：2番目
nameの2：3番目
iの0：1
iの1：2
iの2：3
cの0：A

ここで
name[0]="一番目です。"
と記述せずに
nameの0:一番目です。という結果を得るにはどのような文を付け加えればよろしいでしょうか？
System.out.println(~~~~)の～～～をどうにかするまでは想像いできるのですが・・・

文章が分かりにくくなっているかもしれませんが、お力添えよろしくお願いします。
tar の補完をいじる

最近の `tar` は圧縮 tar ball 展開の際、拡張子によって自動的に伸長プログラムを決定しているようです。
古いのだと…

```shell-session
% tar zxf foo.tar.gz
```

としなければいけなかったのが、

```shell-session
% tar xf foo.tar.gz
```

でイケるというわけです。`xf` しか指定しなくてイイ。

すると `tar` に渡す圧縮形式指定によって補完を決めている `zsh` がちょっとうざくなりまして…。
それで圧縮形式指定を無視するようにしてみました。

まず、zsh 関数を置く場所を決めます。ここでは `~/.zsh/functions` とします。

次に `.zshrc` に以下のコードを追加します。

```shell-session
fpath=(~/.zsh/functions $fpath)
```

次に、指定したディレクトリ (ここでは `~/.zsh/functions`) に次のファイルを置きます。ファイル名は `_tar_archive` でなければなりません。

```shell-session:_tar_archive
# -*- shell-script -*-
#autoload

local expl

[[ $# -eq 0 && $+_tar_cmd -ne 0 ]] && set "$_tar_cmd"

_description files expl 'archive file'

if [[ "$1" = *[urtx]* ]]; then
  local pattern1='(tar|TAR|iso|ISO|cpio).(|(gz|GZ|Z|bz2|lzma|xz))'
  local pattern2='tgz|tbz|jar|zip|txz'
  _files "$expl[@]" -g "*.(${pattern1}|${pattern2})(-.)"
else
  _files "$expl[@]"
fi
```

以下を参考にしました。
https://github.com/DragonFlyBSD/DPorts/blob/master/shells/zsh/files/extra-patch-bsdtar
http://zsh.sourceforge.net/Doc/Release/Functions.html
NSURL のブックマークの “stale” とは何か

`+[NSURL URLByResolvingBookmarkData:options:relativeToURL:bookmarkDataIsStale:error:]` メソッドは、ブックマークデータが “stale” （腐りかけ）かどうかを表す真偽値を引数経由で返す。リファレンスによれば、 stale なブックマークデータは破棄し、返り値の URL を使って新たにブックマークデータを生成すべきだという。

ブックマークデータが stale になるのは主に次の2つの場合である：

- ブックマークが指すファイルが移動されたとき
- ブックマークが指すファイルが削除され、同じフォルダに同名のファイルが作成されたとき

ブックマークデータはファイルパスとファイルのノード番号を記録しているため、参照先ファイルのパスまたはノード番号の一方が変更された場合でも、他方から URL を解決できるようになっている。解決はできるが情報が古くなっていることを表すのが stale である。

[Apple のメーリングリストに詳しい回答があった](http://lists.apple.com/archives/cocoa-dev/2013/Aug/msg00219.html)ので以下に訳載しておく：

## 意訳

“Stale” とは、ブックマークに記録された明白な情報（たとえば親ディレクトリ名とファイル名）を使って参照先のファイルを発見することができなかったが、推測によって得た情報でそれらしいファイルを発見できたことを意味します。その情報はブックマークには記録されていないか、記録されているものと食い違っています。

たとえば、もし参照先のファイルがリネームされていて、ブックマークがファイルシステムのノード番号も記録している場合、ファイルはファイル番号で発見できます。しかし、実際のファイル名とブックマークに記録されたファイル名は食い違っていることになります。これが stale です。

さらに、そのファイルが誤って削除され、バックアップから復元されたとしましょう。ファイルはリネーム後のほうのファイル名を持ち、おそらくはファイル番号も変わっています。こうなると、元のブックマークを解決することはできません。

ブックマークが stale になったら、ファイルのメタデータが変わったということであり、さらなるメタデータの変更でブックマークが壊れるおそれがあります。 Stale だと分かれば、最新のメタデータを持ったより変更耐性のあるブックマークを再生成することができます。

ブックマークを再生成しないという選択肢もあります。再生成すればファイルのメタデータの変更に強いブックマークを作れますが、一方でファイルの移動やリネームを追跡したくない場合もあるでしょうから。

## 原文

> "Stale" means that the referenced file could not be found using the explicit information in the bookmark (such as the parent directory and file name), but a plausible alternative *could* be found by assuming information that's either not in the bookmark or that contradicts what's in the bookmark.
>
> For example, if the file was renamed, and the bookmark has recorded the file system node number, the original file could be be found via the file number. However, it now has a conflicting name, even though bookmark resolution has "decided" it's the same file.
>
> Now imagine, for example, that the file is accidentally deleted and then restored from a backup, under the newest name. It will likely have a different file number and the original bookmark will now be unresolvable.
>
> When you're told that a bookmark is stale, you're being warned that file metadata has changed, and that further metadata changes may break the bookmark. That gives you the opportunity to re-create the bookmark using the latest metadata, rendering the bookmark more tolerant to future metadata changes.
>
> You can choose to re-create the bookmark or not. The upside to doing so is that your bookmark may more robustly follow a series of file metadata changes. OTOH you may not want to have your bookmark cling to files that are moved or renamed.
[SyncStitch]Cruise Control System with Channel

引き続き、Cruise Control System。
5つのプロセスはそれぞれ独立しており、
Channelを介してメッセージ通信を行う。

ここら辺がお手軽実装の限界ですかねー。

```scm:Definitions
(define-event engineOn)
(define-event engineOff)

(define-event on)
(define-event off)
(define-event resume)

(define-event brake)
(define-event accelerator)

(define-event clearSpeed)
(define-event recordSpeed)
(define-event enableControl)
(define-event disableControl)

(define-event speed)

(define-channel is-ss (x)
  '((engineOn)(engineOff)))

(define-channel is-sc (x)
  '((speed)))

(define-channel ss-cc (x)
  '((engineOn)(engineOff)
	(on)(off)(resume)
	(brake)(accelerator)))

(define-channel cc-sc (x)
  '((clearSpeed)(recordSpeed)
	(enableControl)(disableControl)))

(define-channel sc-th (x)
  '((setThrottle)))

```

```scm:SENSORSCAN
(define-process SENSORSCAN
  (alt
	(? is-ss (x) (eqv? x 'engineOn) (! ss-cc ('engineOn) SENSORSCAN))
	(? is-ss (x) (eqv? x 'engineOff) (! ss-cc ('engineOff) SENSORSCAN))
	(! on (! ss-cc ('on) SENSORSCAN))
	(! off (! ss-cc ('off) SENSORSCAN))
	(! resume (! ss-cc ('resume) SENSORSCAN))
	(! brake (! ss-cc ('brake) SENSORSCAN))
	(! accelerator (! ss-cc ('accelerator) SENSORSCAN))))
```

```scm:INPUTSPEED
(define-process INPUTSPEED
  (! engineOn (! is-ss ('engineOn) CHECKSPEED)))

(define-process CHECKSPEED
  (alt
	(! speed (! is-sc ('speed) CHECKSPEED))
	(! engineOff (! is-ss ('engineOff) INPUTSPEED))))
```

```scm:CRUISECONTROLLER
(define-process INACTIVE
  (alt
	(? ss-cc (x)
	   (eqv? x 'engineOn)
	   (! cc-sc ('clearSpeed) ACTIVE))
	(? ss-cc (x)
	   (or (eqv? x 'off) (eqv? x 'brake) (eqv? x 'accelerator))
	   INACTIVE)))
		   
(define-process ACTIVE
  (alt
	(? ss-cc (x)
	   (eqv? x 'engineOff)
	   INACTIVE)
	(? ss-cc (x)
	   (eqv? x 'on)
	   (! cc-sc ('recordSpeed)
		  (! cc-sc ('enableControl)
			 CRUISING)))
	(? ss-cc (x)
	   (or (eqv? x 'off) (eqv? x 'brake) (eqv? x 'accelerator))
	   ACTIVE)))

(define-process CRUISING
  (alt
	(? ss-cc (x)
	   (eqv? x 'engineOff)
	   INACTIVE)
	(? ss-cc (x)
	   (or (eqv? x 'off) (eqv? x 'brake) (eqv? x 'accelerator))
	   (! cc-sc ('disableControl)
		  STANDBY))
	(? ss-cc (x)
	   (eqv? x 'on)
	   (! cc-sc ('recordSpeed)
		  (! cc-sc ('enableControl)
			 CRUISING)))))

(define-process STANDBY
  (alt
	(? ss-cc (x)
	   (eqv? x 'engineOff)
	   INACTIVE)
	(? ss-cc (x)
	   (eqv? x 'resume)
	   (! cc-sc ('enableControl)
		  CRUISING))
	(? ss-cc (x)
	   (eqv? x 'on)
	   (! cc-sc ('recordSpeed)
		  (! cc-sc ('enableControl)
			 CRUISING)))
	(? ss-cc (x)
	   (or (eqv? x 'off) (eqv? x 'brake) (eqv? x 'accelerator))
	   STANDBY)))
```

```scm:SPEEDCONTROL
(define-process DISABLED
  (alt
	(? is-sc (x)
	   (eqv? x 'speed)
	   DISABLED)
	(? cc-sc (x)
	   (or (eqv? x 'clearSpeed) (eqv? x 'recordSpeed))
	   DISABLED)
	(? cc-sc (x)
	   (eqv? x 'enableControl)
	   ENABLED)))

(define-process ENABLED
  (alt
	(? is-sc (x)
	   (eqv? x 'speed)
	   (! sc-th ('setThrottle) ENABLED))
	(? cc-sc (x)
	   (or (eqv? x 'recordSpeed) (eqv? x 'enableControl))
	   ENABLED)
	(? cc-sc (x)
	   (eqv? x 'disableControl)
	   DISABLED)))
```

```scm:THROTTLE
(define-process THROTTLE
  (? sc-th (x)
	 (eqv? x 'setThrottle)
	 THROTTLE))
```