OmniAICreator/Qiita-1.07M huggingface dataset:
Vagrant | Global Control と percol( peco ) を組み合わせて、どこからでも簡単に VM を操作する #vagrant #percol #peco

# Vagrant | Global Control と percol( peco ) を組み合わせて、どこからでも簡単に VM を操作する #vagrant #percol #peco
## 概要
Vagrant の version 1.6 で新規追加された Global Control と
percol( peco ) を組み合わせて、どこからでも簡単に VM を操作できるようにします。

## global status から id を抽出する基本コード
~~~bash
$ vagrant global-status | ruby -n -e 'print $_ if $_.split(" ").first =~ /[a-z0-9]{7}/' | sed -e '$d' | sed "s,\x1B\[[0-9;]*[a-zA-Z],,g" | percol | cut -d' ' -f1
~~~

### 上記のコマンドが行っていることは
* global status で Vagrant の VM のステータス一覧を取得
* 各行をスペース区切りでカラム配列化し、最初のカラムが英数字7文字の場合のみを出力対象にする
    * これによってヘッダーや後続の説明文を除外する
* 最後の行を除外
    * これによって `"vagrant destroy 1a2b3c4d"` という1文を除外する
* ANSI Color シーケンスを削除
* percol に渡してレコードを選択
* 1カラム目のみ（ id ）を出力

### 補足
* ruby に依存したくない方は、 ruby 部を awk や sed に置き換えてください。
* UNIX のシェルは得意ではないので、シェル芸人の方はもっと素晴らしいワンライナーを書けるでしょう。
* percol の部分は peco なり、他の percol 代替で自分が利用しているものに置き換えてください。

## global status から id 抽出デモ
![global-status-percol.gif](https://qiita-image-store.s3.amazonaws.com/0/43480/0d1740c6-af6f-201f-b0ce-5bfeb960fee4.gif)

## alias を作成

~~~bash
alias vgs="vagrant global-status | ruby -n -e 'print \$_ if \$_.split(\" \").first =~ /[a-z0-9]{7}/' | sed -e '\$d' | sed \"s,\x1B\[[0-9;]*[a-zA-Z],,g\" | percol | cut -d' ' -f1"
~~~

## alias `vgs` を利用するコマンド例

~~~bash
$ vagrant global-status
$ vagrant halt `vgs`
$ vagrant global-status
$ vagrant up `vgs`
$ vagrant global-status
~~~

## alias `vgs` を利用するデモ

![vgs_usage.gif](https://qiita-image-store.s3.amazonaws.com/0/43480/e5558a6b-af94-5106-ee04-224282e69e8f.gif)

## 補足
ターミナル操作の記録には ttyrec
アニメーションGIFの作成には seq2gif
を利用しています。

* [ttyrec | 端末操作を保存、再生するツール ttyrec を Cygwin 環境にインストール](http://qiita.com/tbpgr/items/1ea3e4a758191ab8972e)
* [seq2gif | seq2gif をインストールして ttyrec で保存した操作記録からアニメーションGIFを生成する](http://qiita.com/tbpgr/items/13ebddf0fa57ada49e90)

## 参照
[Vagrant blog | Grobal Control](https://www.vagrantup.com/blog/feature-preview-vagrant-1-6-global-status.html)
net/httptestでgojiのテストをする

[goji](https://github.com/zenazn/goji) でWebアプリを書こうとしています。APIサーバーとして使うときに、テストが気になります。

golangは [net/http/httptest](http://golang.org/pkg/net/http/httptest/)
というhttpのtestを行うパッケージが最初からついています。これを使うと簡単にテストを記述できます。

httptest.Serverはlocalのloopbackインタフェースでサーバーを作成します。

(2014/11/20追記): mopemopeさんから「Routingのテストを入れたほうがいいのでは」というご指摘を受けたので、Route設定を別関数に分け、テストからも使うようにしました。


サンプルアプリ
--------------

`/hello/hoge` というURLにアクセスが来たらJSONを返す、という単純なアプリです。

``` go:main.go
package main

import (
    "encoding/json"
    "fmt"
    "net/http"

    "github.com/zenazn/goji"
    "github.com/zenazn/goji/web"
)

type User struct {
    Id   int64
    Name string
}

func hello(c web.C, w http.ResponseWriter, r *http.Request) {
    u := User{
        Id:   1,
        Name: c.URLParams["name"],
    }

    j, _ := json.Marshal(u)
    fmt.Fprintf(w, string(j))
}

func Route(m *web.Mux) {
    m.Get("/hello/:name", hello)
}

func main() {
    Route(goji.DefaultMux)
    goji.Serve()
}
```

これに対するテストが以下の感じです。

``` go:main_test.go
package main

import (
    "io/ioutil"
    "net/http"
    "net/http/httptest"
    "testing"

    "github.com/zenazn/goji/web"
)

func ParseResponse(res *http.Response) (string, int) {
    defer res.Body.Close()
    contents, err := ioutil.ReadAll(res.Body)
    if err != nil {
        panic(err)
    }
    return string(contents), res.StatusCode
}

func Test_Hello(t *testing.T) {
    m := web.New()
    Route(m)
    ts := httptest.NewServer(m)
    defer ts.Close()

    res, err := http.Get(ts.URL + "/hello/hoge")
    if err != nil {
        t.Error("unexpected")
    }
    c, s := ParseResponse(res)
    if s != http.StatusOK {
        t.Error("invalid status code")
    }
    if c != `{"Id":1,"Name":"hoge"}` {
        t.Error("invalid response")
    }
}
```

**web.New()** でgoji/webのHTTP multiplexerを作成します。あとは、httptest.NewServer(m)としてあげれば、テスト用サーバーが立ち上がります。deferでCloseするのを忘れないでください。

なお、ts.URLには、立ち上げたテスト用サーバーのportが入ったURLが`http://127.0.0.1:51923` みたいな感じで入っています。

簡単にするためにParseResponseという関数を作っていますが、これは別になくても構いません。

もっと他にいい方法があれば教えてください。
Elixir | Mix | cmd で任意のコマンドを実行 #elixir

# Elixir | Mix | cmd で任意のコマンドを実行
## 概要
Elixir に付属している CLI Tool Mix の cmd で任意のコマンドを実行します

公式の説明を読むと、 umbrella applications にて各子アプリケーションの
コマンドを実行するのに便利だとか。

umbrella applications については、[Umbrella projects](http://elixir-lang.org/getting_started/mix_otp/7.html#7.3-umbrella-projects) を参照。

## 使用例

~~~
$ mix cmd echo hoge
hoge

$ mix cmd mix cmd echo hoge
hoge
~~~

## 参照
[Mix.Tasks.Cmd](http://elixir-lang.readthedocs.org/en/latest/ref/master/mix/Mix.Tasks.Cmd/)
macでedisonをセットアップ



breakout kitことはじめメモ

1.USBでつなぐ。ボード上のLEDが点灯する。
2.ttyを探す

> ls /dev/tty*
/dev/tty.usbserial-A903BXTM

こんな感じで出てる

3.consoleで接続
> screen /dev/tty.usbserial-A903BXTM 115200
Dependency Reportを出力してMultiple dex files defineを解決

Android開発において新規でライブラリを取り込む際にちょいちょい発生する<b>Multiple dex files define</b>
前から厄介なヤツだったんですが、Gradleを使い始めた頃に依存関係で悩まされることが多かったのでそんな時に僕がよくやっていた<b>Dependency Report</b>を使っての解決方法をメモ
<h2>Dependency Reportを出力してみる</h2>
やり方はコマンドラインから出力したいプロジェクト直下に行って以下のコマンドを叩くだけ
<pre>
$ cd &lt;プロジェクトのディレクトリ&gt;
$ ./gradlew -q dependencies
</pre>
コマンドを叩いてしばらくすると長ったらしいReportが出力されます
参照すると、各ライブラリが中で使用している別ライブラリを確認することができるので、重複しているライブラリを確認することができます

＊_releaseApkの部分のみ抜粋
<pre>
_releaseApk - ## Internal use, do not manually configure ##
+--- com.github.chrisbanes.actionbarpulltorefresh:library:+ -&gt; 0.9.9
|    \\--- com.github.castorflex.smoothprogressbar:library:0.4.+ -&gt; 0.4.0
+--- com.squareup:otto:1.3.5
+--- com.jakewharton:butterknife:5.1.1
+--- com.github.chrisbanes.photoview:library:1.2.2
+--- com.android.support:appcompat-v7:19.+ -&gt; 19.1.0
|    \\--- com.android.support:support-v4:19.1.0
+--- com.google.android.gms:play-services:5.0.77
|    \\--- com.android.support:support-v4:19.1.0
\--- sample:facebook:unspecified
</pre>
実際に取り込まれるバージョンも確認できるのでかなり便利

<h2>build.gradleを修正</h2>
上では割愛してますが、別プロジェクトにしているfacebook内でもsupport-v4を利用しているため<b>appcompat-v7</b>、<b>play-services</b>でsupport-v4をexclude moduleの対応をすれば解決
＊Before
<pre>
dependencies {
    compile 'com.github.chrisbanes.actionbarpulltorefresh:library:+'
    compile 'com.squareup:otto:1.3.5'
    compile 'com.jakewharton:butterknife:5.1.1'
    compile 'com.github.chrisbanes.photoview:library:1.2.2'
    compile 'com.android.support:appcompat-v7:19.+'
    compile 'com.google.android.gms:play-services:5.0.77'
    compile project(':facebook') // この内部でもsupport-v4が使われている
}
</pre>
＊After
<pre>
dependencies {
    compile 'com.github.chrisbanes.actionbarpulltorefresh:library:+'
    compile 'com.squareup:otto:1.3.5'
    compile 'com.jakewharton:butterknife:5.1.1'
    compile 'com.github.chrisbanes.photoview:library:1.2.2'
    compile ('com.android.support:appcompat-v7:19.+') { exclude module: 'support-v4' }
    compile ('com.google.android.gms:play-services:5.0.77') { exclude module: 'support-v4' }
    compile project(':facebook') // この内部でもsupport-v4が使われている
}
</pre>
再度Dependency Reportを出力すると_releaseApkの箇所は以下のように変化した
<pre>
_releaseApk - ## Internal use, do not manually configure ##
+--- com.github.chrisbanes.actionbarpulltorefresh:library:+ -&gt; 0.9.9
|    \\--- com.github.castorflex.smoothprogressbar:library:0.4.+ -&gt; 0.4.0
+--- com.squareup:otto:1.3.5
+--- com.jakewharton:butterknife:5.1.1
+--- com.github.chrisbanes.photoview:library:1.2.2
+--- com.android.support:appcompat-v7:19.+ -&gt; 19.1.0
+--- com.google.android.gms:play-services:5.0.77
\--- sample:facebook:unspecified
</pre>
この状態でbuildしたらMultiple dex files defineが発生しなくなってビルドできるようになった
Qiita:Team は <script> や <iframe> が使える

Qiita:Team は特定されたユーザしか使わない見れないせいか、使える要素周りのポリシーが緩い。 (via @Kakakakakku)

これにより、普通に Qiita 使っている時とはまたさらに違うことができる。


slideshare や Google Slides を貼り付ける 
------------------------------------

`<iframe>` が貼れるので、スライド貼ることができる。


テキストベースでグラフの作成
--------------------------------------

[mdaines/viz.js](https://github.com/mdaines/viz.js/) と、ちょっとした `<script>` 要素を作るだけで、ちょっとした DSL 書くだけで有向グラフ／無向グラフが作れる。

私の場合は Qiita:Team のエディタでこう書くと:

```html
<script type="text/dot">
digraph G {
 a -> b -> c;
 a -> c;
}
</script>
```

Qiita:Team のページではこうなるスクリプトを書いた:

![レンダリング結果画像](https://qiita-image-store.s3.amazonaws.com/0/755/c5ca99c8-03b3-9c5c-a1d6-e85305ee7fda.png)

↑では画像ですが、実際は svg で出力することになるかも。

同様に、[js-sequence-diagrams](http://bramp.github.io/js-sequence-diagrams/) を使えばシーケンス図も書ける。

また、テキストベースでグラフが掛けると、diff が取りやすいメリットがある。


連絡先まとめ記事に vcard ダウンロードボタン
--------------------------------

メンバーの連絡先まとめている記事をみてピンときてスクリプトを書いた。

記事内の連絡先をスクレイピングして vCard 形式のテキストデータを data スキームでダウンロードできるスクリプト。

スクリプトからダウンロードさせるには、こんなコードを書けば良い:

```js
// foo.txt をダウンロード
var data = '動的に作ったコンテンツ';
download(data, 'foo.txt');

// ブラウザに data を fineName としてダウンロードさせる。
// Google Chrome でのみ動作確認済み
function download(data, fileName) {
  var a = document.createElement('a');
  a.href = 'data:text/plain;charset=utf-8,' + encodeURIComponent(text);
  a.download = fileName;
  click(a);
}
function click(elem) {
  var e = new Event('click');
  elem.dispatchEvent(e);
}
```

ただ、これでダウンロードできる vCard は UTF-8 なので、実際に携帯端末や PC に取り込むのには文字コードの変換が必要になる。


辛い点
--------

* エディタで `<button>` や `<textarea>` を書いても、記事中では `<p>` に置換されてしまうので、JavaScript で動的に生成する必要がある。
* イベントリスナーでキャッチしていない例外が起きても、コンソールに全く表示されない。
* イベントリスナーでの console.log などのコンソール出力も潰されている。
    * 回避策としては、親のを使う: 
      `var log = console.__proto__.log.bind(console);`
* プレビューでは `<script>` も `<iframe>` も処理してくれないので、公開する前にどう見えるかチェックしたいときは下書き保存する。
iCalendar形式のファイルからRRULEを考慮してスケジュールデータを取得する方法

# iCalendar形式のファイルからRRULEを考慮してスケジュールデータを取得する方法

[2011年のPHPMatsuri](http://k1low.hatenablog.com/entry/20111024/1319426878) ぶりにiCalendar形式とか触った

`icalendar/recurrence` を使うのがポイント

```ruby
require 'date'
require 'tzinfo'
require 'icalendar'
require 'icalendar/recurrence'

url = 'https://mozorg.cdn.mozilla.net/media/caldata/JapanHolidays.ics'
result = Icalendar.parse(client.get_content(url), true)
result.events.each do |event|
  if event.rrule == []
    puts Date.parse(event.dtstart.to_s)       
  else
    event.occurrences_between(start_date, end_date).each do | e |
      puts Date.parse(e.start_time.to_s)
    end
  end
end
```
CoreDataで使用するユニークのIDについて(Swift)

CoreDataのEntityのAttributesにidというキーを作った時に、その中に入れるユニークな値に何を使うか。

##そもそも
CoreDataには自動で入れてくれる機能がないので自分でユニークなIDを作る必要がある

##結論
###UUIDを使う
`let uuid: String = NSUUID().UUIDString`
Cocoaが用意してくれているメソッド。
実行する度に乱数を返してくれる。

##他の方法
####NSManagedObjectIDを使う(ボツ案)
CoreDataを使ってsqliteファイルを生成するとZ_PK,Z_ENT,Z_OPTというカラムが自動で生成される。Z_PKがPrimaryKeyになる。

NSManagedObject は NSManagedObjectID というIDを持っていて、それの最後がZ_PKと一致する。

```swift

println(managedObject.objectID)
//結果↓
x-coredata://987880C1-D4E2-4753-A8B8-A0EABF9F4534/Person/p64
```
この最後の64がZ_PKと一致するので、これをEntityユニークのIDにできるかもしれない。

が、NSManagedObjectIDのリファレンスにこうある。

```
The object ID of the receiver. (read-only)
If the receiver is a fault, accessing this property does not cause it to fire.
Important
If the receiver has not yet been saved, the object ID is a temporary value that will change when the object is saved.

```
**ManagedObjectが保存される前と後で違う値が返ってくる。**
ということでNSManagedObjectIDは使えないことが判明

###idをIntegerで保存したい場合
自力で頑張るしかない。
Muninにtd-agent/fluentdのプラグインを入れる(CentOS6.5)


#Fluentdを可視化したい！

手っ取り早く可視化したかったため、実装。

以下の値をグラフ化することができます。

fluentd_process プロセス数の取得
fluentd_resource メモリ量の取得
fluentd_monitor_agent 各種metricsの取得

##Muninクライアントの導入

サーバ側は実装済みとする。

```
sudo yum install perl-XML-SAX-0.96-7.el6.noarch
sudo yum --disablerepo=rpmforge-extras --enablerepo=epel install munin-node
```
依存関係でエラーがでたので、Perlのインストールとdisablerepoは環境によってどうぞ。

###設定

td-agentの設定ファイルにmonitor_agentを記載して再起動。

```
<source>
  type monitor_agent
  bind 127.0.0.1
  port 24220
</source>
```

動作確認。
値が帰ってくれば問題ない。

```
curl http://localhost:24220/api/plugins.json
```

##プラグイン実装

munin-fluentdを使用して、monitor_agentの値をmuninに渡す。

```
cd /opt
git clone https://github.com/moaikids/munin-fluentd.git
```

シンボリックリンク

```
ln -s /opt/munin-fluentd/plugins/fluentd/fluentd_monitor_agent /etc/munin/plugins/
ln -s /opt/munin-fluentd/plugins/fluentd/fluentd_process /etc/munin/plugins/
ln -s /opt/munin-fluentd/plugins/fluentd/fluentd_resource /etc/munin/plugins/
```

実行権限を付与

```
chmod +x /opt/munin-fluentd/plugins/fluentd/fluentd_*
```

設定ファイルを記載

```
/etc/munin/plugin-conf.d/fluentd

[fluentd*]
user munin
env.host localhost
env.port 24220
env.package td-agent #もしくはfluentd
```

接続するサーバ追加

```
/etc/munin/munin-node.conf

allow ^10\.xx\.xx\.xx$
```

再起動
```
service munin-node restart
```


これで、サーバ側で値が取得できれば完了。

#etc...

ホスト名にアンダーバー等の文字列が入っている場合は、munin-nodeがうまく動かないので
munin-node.confにhost_nameを記載して対応する。

参考サイト
http://docs.fluentd.org/articles/monitoring#monitoring-agent
http://itsneatlife.blogspot.jp/2013/06/td-agentfluentdmonitoragentbuffer.html
UTF-8のCSVファイルをExcelでよめるよう変換

- しばしば発生するあれ。
- 特殊文字が入ってて厳密にちゃんとやるなら置換の表とかいるんだろうけど、とりあえず見えれば良い位で変換したいとき
- 何か毎回時間くうのでメモ

```python:
src = open('src.csv')
csv = src.read()
src.close()

csv_utf = unicode(csv, 'utf-8')
csv_sjis = csv_utf.encode('cp932', 'replace')

dest = open('dest.csv', 'w')
dest.write(csv_sjis)
dest.close()
```
Azureで障害が発生したのでログを残してみた

本日(11/19)にMicrosoft Azureで大きめな障害が発生したのでログを残してみた。
使用しているPlatformそのものの障害に遭遇する機会はあまりないのでいい経験です（いい意味で）。

Storageの障害はどのCloudでも避けて通れない道ですね。
Azure大好きなので、AWSのようにきっちり再発防止してくれることを期待しています。

メールなどによる通知はこなかったので、サービスの死活監視はしっかりしておかないといけなさそうね。

# 現状確認

## [Azure Status](http://azure.microsoft.com/en-us/status/)

[Azure Status](http://azure.microsoft.com/en-us/status/)

全世界のAZとサービスの状態を一覧で確認することが出来ます。
2分〜10分間隔でページを自動リロードさせられます。

一度復旧が始まると続々とグリーンになっていく様は見ていて楽しかった。

![Screen Shot 2014-11-19 at 2.44.41 PM.png](https://qiita-image-store.s3.amazonaws.com/0/14859/b832516e-dcf5-3732-086a-2d80cfc6eaa0.png)



が、2分後に↓こんな感じに。




![Screen Shot 2014-11-19 at 2.44.57 PM.png](https://qiita-image-store.s3.amazonaws.com/0/14859/2a2a9067-1439-c8c6-d755-81138357f228.png)




## Twitter

[Azure Official Account](https://twitter.com/Azure/status/534901158364463105)

![Screen Shot 2014-11-19 at 8.31.29 PM.png](https://qiita-image-store.s3.amazonaws.com/0/14859/06569d75-6d5c-5d56-ec30-3781562882ae.png)
どんな言語でも通用するswap（値の入れ替え）のイメージ

swap（値の入れ替え）は言語によっては独自の関数が用意されていることがありますが、かえってそれがアダとなって他言語（swap関数がない言語）で面倒になることがあります。

こう思う方もいるかもしれません。
###swapとか簡単すぎて萎えるわｗ・・・何を今さｒ（ｒｙ　ぅ・・あれ・・・何となく・・目眩が・・（保健室）

ということで今回は、どんな言語でも共通のswapの方法を紹介します。むしろ数論（？w）のようなイメージでお読みください。
最後にJavaScriptの簡単なコードもつけてみました。

##swapの核心 → 一時変数tmp
![tmp20141119_1.png](https://qiita-image-store.s3.amazonaws.com/0/57193/14e82790-6a0c-af36-37fc-e9e266cb9488.png)

swapの核心がtmpと名付けられるような一時変数であることの根拠は、swapをするには少なくとも対象合わせて3つ以上の変数が必要だからです。（2つでできるのがあったらすごいけど..）swapでは、まず一時的に値を保持するための変数（ここではtemporary＝「一時の,はかない,仮の」という意味であるtmpを使う）を用意します。色んな名前がありますが、まず頭にのぼるのはtmpかtempです。テンプと呼びます。

##1 . tmpにAを代入（Aのコピーを作る）
![tmp20141119_2.png](https://qiita-image-store.s3.amazonaws.com/0/57193/573274e8-4724-0912-f2da-44f63ec597d9.png)

ここで大事というか頭に浮かべるといいのは、tmpはAのコピーだということです。

##2 . AにBを代入
![teisei6.png](https://qiita-image-store.s3.amazonaws.com/0/57193/e77bd9b8-9ef5-d94c-e629-5ec862dcdf85.png)




ここから三すくみの図をイメージします。AがBを取りに行くイメージです。これでAの値はBになりました。

##3 . Bにtmpを代入
![teisei5.png](https://qiita-image-store.s3.amazonaws.com/0/57193/4b04f6bf-7b55-3862-e52d-14e6485f69c8.png)



あとはBがAの値を引っ張ってくればいいですが、Aはもうトランスフォームして昔の面影はありません。なので、Aのコピーであるtmpを取りに行きます。

##JSでさくっと書いてみると・・・
こんな感じです。

```js:swap.js
var A = 10;
var B = 30;
console.log(A,B); //10 30

var tmp = A; //1
A = B; //2
B = tmp; //3

console.log(A,B); //30 10
```

###swap標準関数よ、さようなら（？）
スマートではないかもしれませんが、標準関数を使わないで、なるべく同じロジックで書いてみるのもいいかもしれませんね。
MySQLでタイムゾーンを設定する


## 設定方法 ##

1. タイムゾーンデータのインポート  
    タイムゾーンデータのインポートを行い、MySQLのタイムゾーンテーブルを初期化します。
    > 参考）https://dev.mysql.com/doc/refman/5.6/ja/time-zone-support.html
    + Linuxの場合

        ```terminal
        $ /usr/bin/mysql_tzinfo_to_sql /usr/share/zoneinfo > ~/timezone.sql
        $ mysql -u root -p -Dmysql < ~/timezone.sql
        ```
    + Windowsの場合
        タイムゾーンデータは、MySQLのサイトよりPOSIX standard版のファイルをダウンロードします。
        https://dev.mysql.com/downloads/timezones.html  

        ```terminal
        $ mysql -u root -p -Dmysql < /your/path/timezone_posix.sql  
        ```
2. my.cnfを変更します。

    ```config:/etc/my.cnf
    [mysqld]
    default-time-zone = 'Asia/Tokyo'
    ```
3. MySQLの再起動
MySQLを再起動すると設定が反映されます。
タイムゾーンデータをインポートしていない場合、my.cnfで指定したTimeZoneが存在しないときは起動エラーになります。


## 設定の確認 ##

```terminal
mysql> show variables like '%time_zone%';

+------------------+------------+
| Variable_name    | Value      |
+------------------+------------+
| system_time_zone | JST        |
| time_zone        | Asia/Tokyo |
+------------------+------------+
```
北大の學内 wifi (elms-g) への接續を自動化する．

北大の圖書館や一部の校舎では，學内 wifi  (elms-g) を利用できる．本稿ではこれへの接續を自動化する方法を書く．

私は wifi への接續に wicd-cli を使つてゐる．本稿に登場する option の意味をあらかじめ書いておくと，

```wicd-cli -h
  -n NETWORK, --network=NETWORK
  -p NETWORK_PROPERTY, --network-property=NETWORK_PROPERTY
  -S, --scan            
  -l, --list-networks   
  -c, --connect         
  -y, --wireless        
```

のとほりである．

elms-g の飛んでゐる場所で 

```
$ wicd-cli -ySl
```
とすると，

```
#	BSSID			Channel	ESSID
0	00:1D:73:C2:AB:50	1	elms-g
1	00:1D:73:C2:AB:53	1	eduroam
2	00:1D:73:C2:AB:52	1	elms-x
```
のやうに表示される．

次いで，

```
$ wicd-cli -ycpelms-g
```
としてやれば，elms-g としてやれば，elms-g に接續できる．實は，

```
$ wicd-cli -ySl
```

の手順は不要である．當該の場所に着いて PC を開いたら，即坐に

```
$ wicd-cli -ycpelms-g
```

としてやれば，elms-g に接續できる．

このやうにして快適な elms-g 生活をしてきたが，error が出てうまくいかないことがあると氣づいた．さういふときに

```
$ wicd-cli -ySl
```

としてやると，

```
#	BSSID			Channel	ESSID
0	10:6F:3F:E5:C6:C3	1	eduroam
1	10:6F:3F:E5:C6:C0	1	elms-g
2	10:6F:3F:E5:C6:C2	1	elms-x
3	00:1D:73:F8:D4:30	6	elms-g
4	00:1D:73:F8:D4:32	6	elms-x
```

のやうに表示される．どうやら，"elms-g" と名乘る電波が複數あつて，wicd-cli に "elms-g" と指定してやつたのではどの電波なのか同定できない，といふのが原因のやうだ．ならば，番號で指定してやらう．

```
$ wicd-cli -ycn1
```

としてやつたら無事に接續できた．

elms-g の番號を調べる → その番號で接續する

の流れを自動化してやらうと思ひ，下のやうに script を書いた：


```connect_elms-g.rb
wave_list = `wicd-cli -ySl`
wave_list.each_line do |line|
  if line.match(/elms-g/) then
    $num = line.split("\t")[0]
  end
end

command = "wicd-cli -ycn" + $num
system(command)
```

elms-g と名乘る電波の番號を取得して，そのうち最も大きいものを $num に格納して，その番號の電波に接續する，といふ script である．

elms-g に接續したあと，LAN への login が必要になる．これを自動化する方法は 

[北大の wifi への login を自動化](http://qiita.com/ticonz/items/7faefb3965238d27f96a)

に記した．私は .zshrc に

```.zshrc
alias wie='ruby $HOME/connect_elms-g.rb; ruby $HOME/elms-g_login.rb'
```

と書いてあるので，圖書館等で PC を開いたら

```
$ wie
```

とすることですぐに net を利用できる．便利である．
他人が編集したStoryboardを開くとXMLに差分が出る

Xcodeで見るだけでこういう風になってつらい。

```diff:
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="6250" systemVersion="14A389" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none" useAutolayout="YES" initialViewController="DLu-So-9sM">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="6250" systemVersion="14B25" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none" useAutolayout="YES" initialViewController="DLu-So-9sM">
```

なんか`frame`まで書き変わっているし。

```diff:
-                                <rect key="frame" x="309" y="36" width="110.5" height="42.5"/>
+                                <rect key="frame" x="309" y="36" width="111" height="43"/>

```

どうも OS X のバージョンが異る環境で編集しあうと発生するっぽい(予想)。

![スクリーンショット 2014-11-19 7.30.36 PM.png](https://qiita-image-store.s3.amazonaws.com/0/229/c595dd46-24a1-4386-a61b-9dfb9be50ba5.png)
【C++】C++で自作クラスに簡単にイテレーターを作る方法

既知のネタだとしても泣かない！

# 概要
例えば情報クラスと情報を管理するクラスがあったとする。

```cpp:a.cpp
class Info // 情報クラス.
{
public:
	// データの設定.
	void SetData		(int a)	{ data = a; }
	// データの取得.
	Info GetData		()		{ return data; }
private:
	int data; // なんかのデータ.
};

class InfoManager // 情報管理クラス
{
public:
	// 情報の取得.
	Info GetInfo		(int index)		{ return datas[index]; }
	// 情報の追加.
	void AddInfo		(Info a)		{ datas.push_back(a); }
	// 情報の数.
	int GetCount		()				{ return (int)datas.size(); }
private:
	std::vector<Info> datas; // なんかのデータの動的配列.
};
```

情報管理クラスなんか作らずstd::vector<Info>で良くねって話は設計次第なのでさておき、
このInfoManagerに入っている全データを取得しようと思うと次のような処理になる。

```cpp:a.cpp
// Infoを全部取り出してvectorで返す関数.
std::vector<Info> GetAllData( InfoManager& manager )
{
	std::vector<Info> dst;
	for(int index = 0; index < manager.GetCount(); ++index)
	{
		dst.push_back(manager.GetInfo(index));
	}
	return dst;
}
```

そうするとこのコードを見た一部のSTLに毒された層の人間は「イテレーターが欲しい...」ってなるけど、
真面目にイテレーターを実装すると面倒くさいので手っ取り早く追加する方法がこの記事。

# typedefでイテレーターを作る

```cpp:a.cpp
class InfoManager // 情報管理クラス
{
public:
	// iteratorをtypedefする
	typedef std::vector<Info>::iterator iterator;
	typedef std::vector<Info>::const_iterator const_iterator;

	/* 以下省略 */
};
```

# vectorのbeginとendをぱくってbeginとendを用意する

```cpp:a.cpp
class InfoManager // 情報管理クラス
{
public:
	// iteratorをtypedefする
	typedef std::vector<Info>::iterator iterator;
	typedef std::vector<Info>::const_iterator const_iterator;

	// begin, end
	iterator begin(){ return datas.begin(); }
	const_iterator begin() const { return datas.begin(); }
	iterator end(){ return datas.end(); }
	const_iterator end() const { return datas.end(); }

	/* 中略 */

private:
	std::vector<Info> datas; // なんかのデータの動的配列.
};
```

# できた

やったね！

```cpp:a.cpp
std::vector<Info> GetAllData( InfoManager& manager )
{
	for(auto& a : manager)
	{
		dst.push_back(a);
	}
	return dst;
}
```
How To Increase App Downloads Successfully

![googleplay.png](https://qiita-image-store.s3.amazonaws.com/0/59898/c86b00e2-915d-ec25-114b-7253ccc5e4af.png)
Every game/app developer want his app to be in top and get some good downloads but sometimes he never achieve his target.
Something must be wrong there! if you also in same situation.

1.5 Million Android Devices Activated Every Day
google

From 1.5 Million active android device why you are not getting more download?

So today we are not giving you any hacking tools for app downloads or any black hat thing, These are some clever,easy and must to implement Tips to help you increase app downloads successfully.



1.Make a good game

The very first thing is good game. Good game is a game that users play do their work and then play come from work then play, they never feel bore with that game.

things that make game good are:
Story
Characters
simple control  read full here


2. Keyword Rich and Translated Descriptions

Keyword is the biggest factor to get users to you app. Your description must have selected keywords you are targeting to your app. Suppose you have a jet fighter game  named “air strike jet fighter”. Implement the word ‘Air Strike’ 3-6 occasions inside app description, as well as apply the keywords ‘Jet’ and ‘Fighter’ a couple of times.


The title should inform people what your application features: amazing, small, simple to spell and keep in mind.it should show the quality of the application. The very first 25 characters come in the google search result so that anything next is nonsense so you generally don’t require it.


your description needs to be localized in the majority of popular languages for example French,Chinese, Korean, Spanish. If you don't have a financial budget for translator you can use Google translator

use Google trend tool for best keyword research see how Google trend works

Complete tutorial with images here > http://unity3diy.blogspot.com/2014/11/how-to-increase-app-downloads-ASO.html
Codeigniter で日本語メールを送信するときに失敗しない方法


# やりたかったこと

Codeigniter の email ライブラリを使って、メールを送る機能を付けたかった。しかし、デフォルトのライブラリだと、 **Outlook などのメーラーで件名または本文が文字化けしてしまう**、という事象が生じました。ここでは、失敗しないメール送信の実装方法を紹介します。


# ①独自email ライブラリを作成

デフォルトのemail ライブラリにある次のコードが問題のようです。

````system/libraries/email.php
$subject = $this->_prep_q_encoding($subject);

$this->_body = stripslashes(rtrim(str_replace("\r", "", $body)));

```

なので、email.php をコピーしてライブラリファイルを作成し、
問題の箇所だけ次のように変更します。

```application/libraries/Myemail.php
public function subject($subject)
{
//$subject = $this->_prep_q_encoding($subject);
$this->_set_header('Subject', $subject);
return $this;
}

public function message($body)
{
if (strtolower($this->charset) == 'iso-2022-jp')
{
$this->_body = rtrim(str_replace("\r", "", $body));
}
else
{
//$this->_body = stripslashes(rtrim(str_replace("\r", "", $body)));
$this->_body = rtrim(str_replace("\r", "", $body));
}
return $this;
}

```

# ②エンコーディングを変換

メール送信部分は、こんな風に書きます。
ポイントは、件名と本文は mb_convert_encoding で、送信者名は mb_encode_mimeheader でエンコーディングすることです。

```application/models/mail.php
    function mail_send($to,$from,$from_name,$sbj,$body){

      $this->load->library('myemail');//独自email libraryを読み出し

      //メール初期化
			$config['protocol'] = 'sendmail';
			$config['mailpath'] = '/usr/sbin/sendmail';
			$config['_encoding'] = '7bit';
			$config['charset'] = 'ISO-2022-JP';
			$config['wordwrap'] = FALSE;
			$this->myemail->initialize($config);

			$sbj = mb_convert_encoding($sbj, "ISO-2022-JP", "UTF-8,EUC-JP,auto");
			$from_name = mb_encode_mimeheader($from_name, "ISO-2022-JP", "UTF-8,EUC-JP,auto");
  			$body = mb_convert_encoding($body, "ISO-2022-JP", "UTF-8,EUC-JP,auto");

			$this->myemail->from($from, $from_name);
			$this->myemail->to($to);
			$this->myemail->subject($sbj);
			$this->myemail->message($body);
			$this->myemail->send();
    }
```

これで一旦、文字化けはなくなるはずです！

# 補足：機種依存文字・半角カタカナの文字化けもなんとかしたい

以前に記事を書いたので、こちらを参照してください。

[【PHP】半角カタカナがメールで文字化けしたときの対処法](http://qiita.com/seihowlow24/items/2332dfbc04452f022155)

[【PHP】機種依存文字を変換する最低限のコード](
http://qiita.com/seihowlow24/items/f9147a0f7c44810ead1c)

#参考サイト
http://blog.livedoor.jp/lax34volvic/archives/1062690.html

http://ameblo.jp/dropshipping-dojyo/entry-11165249875.html
slack 「Surprise me!」は押した？



![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/44278/5ef822e2-d2bd-d24d-59d8-0ce1bc60ebdb.png)

slack使っている方は是非。ユーザーPreferenceから行けます。
こういう何気ない遊び心好きですー。
SlideShow(S9)入れた時のメモ


思ったよりも手間取ったので。同じようなことがあった時のために。


とりあえず

```console
% gem install slideshow
```

Symbol not found というエラーで弾かれる。opensslがないよって言ってるけれど入ってる。ぐぐってみるとパスが通ってないことが原因であるとのこと。

そこでリンクを張ってあげる。

```console
% brew link openssl --force
```

でもダメ。

もう少し調べてみるとruby install時にパスを指定してあげればいいみたい。
丁度2.1.5を入れてなかったのでそれを入れつつ指定。

```console
% RUBY_CONFIGURE_OPTS="--with-openssl-dir=`brew --prefix openssl`" rbenv install 2.1.5
```

再度 ```gem slideshow install``` すると無事インストールできた。

実行してみる。

```console
% slideshow
.rbenv/versions/2.1.5/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- active_record (LoadError)
	from /Users/e105711/.rbenv/versions/2.1.5/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require'
	from /Users/e105711/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/props-1.1.1/lib/props/db.rb:7:in `<top (required)>'
.
.
.
```

すごい怒られる。active_record がないそうです。入れる。

```console
% gem install activerecord
```

もっかい実行。

```console
% slideshow
/Users/e105711/.rbenv/versions/2.1.5/lib/ruby/2.1.0/rubygems/specification.rb:2064:in `raise_if_conflicts': Unable to activate activerecord-4.1.7, because activesupport-4.2.0.beta4 conflicts with activesupport (= 4.1.7) (Gem::LoadError)
.
.
.
```

activesupportが衝突しているそうです。beta版を消す。

```console
% gem uninstall activesupport
Select gem to uninstall:
 1. activesupport-4.1.7
 2. activesupport-4.2.0.beta4
 3. All versions
> 2
```

もっかい実行。

```console
% slideshow
confdb/1.1.1 on Ruby 2.1.5 (2014-11-13) [x86_64-darwin13.0]
fetcher/0.4.4 on Ruby 2.1.5 (2014-11-13) [x86_64-darwin13.0]
NAME
.
.
.
```

うごいた！とりあえずサンプル出させてビルドしてもらおう。

```console
% slideshow n
% slideshow b welcome.text
*** error: undefined method `left' for #<Slideshow::Gen:0x007f89b2790408>
```

エラー。[ここ](https://groups.google.com/forum/#!msg/webslideshow/8zAWLX-J7Gc/DPTHcEWgLOMJ)によると最新版にしてプラグインを入れてくださいとのこと。

する。

```console
% slideshow update
% slideshow install plugins
% slideshow b welcome.text
confdb/1.1.1 on Ruby 2.1.5 (2014-11-13) [x86_64-darwin13.0]
fetcher/0.4.4 on Ruby 2.1.5 (2014-11-13) [x86_64-darwin13.0]
Loading shortcut index from '/Users/e105711/slideshow.index.yml'...
Slide Show (S9) 2.3.0 on Ruby 2.1.5 (2014-11-13) [x86_64-darwin13.0]
.
.
.
```

うごいた！生成されたhtmlにも問題なし。なんでこんなに時間がかかったんだろ。

後でわかったんだけど、homebrewでopensslを入れた後にrbenvでrubyをインストールすればパスの指定等はいらないみたい。

ruby側ではインストール時のopensslのライブラリしか見ていなくてhomebrewでアップデートして古いの消しちゃうから見つかんなかったってことなのかな？
[質問]Closure Compilerで未使用の変数宣言が削除されない。


以下のコードを[Closure Compiler Service](http://closure-compiler.appspot.com/home)に入力し、Advancedモードでコンパイルすると…

```js:before
var example1 = document.createElement('div');
var example2 = document.createElement('span');

console.log(example1);
```

このようになってしまいます。

```js:after
var a = document.createElement("div");
document.createElement("span");
console.log(a);
```

変数`example2`はどこでも使用されていません。にも関わらず、`document.createElement("span")`が残ってしまいます。

恐らく、関数の実行により何かしらの変化が起こる場合もあるため、返り値を返すための関数でも関数の実行部分のみ残ってしまうのだと思います。
この挙動を変えるにはどのようにすればよろしいでしょうか?
JSDoc Tagの`@nosideeffects`は理想に近かったのですが、extern filesでしか使用できません。
要素からコメントアウトを取り出す

この例ではbody直下にあるコメントの内容を一覧で出力します。

```html:index.html
<!DOCTYPE html>
<html>
<head></head>
<body>
  <!--hoge-->
  foo
  <!--piyo-->
  bar
<script src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
<script src="main.js"></script>
</body>
</html>
```

```js:main.js
var $elm = $('body');
var $comment = $elm.contents().filter(function() {
    return this.nodeType === document.COMMENT_NODE;
});
$comment.each(function(i, elm) {
    console.log(elm.data);
});
```

[出力]
hoge
piyo


参考:
[\[jQuery\]タグのnodeTypeで比較可能な値とその意味の一覧](http://nanoappli.com/blog/archives/4649)
GNU screenを抜け出して、tmuxを入れてみる

## install
* installはhome brewなら簡単

```
$ brew search tmux
tmux		    tmux-cssh		tmux-mem-cpu-load
$ brew install tmux
```

## conf設定
* できるだけscreen時代から違和感ない移行を目指す
* prefixは元ともCtrl+zに当てていたので、それを踏襲する
* Ctrlを押しっぱなしでも、bindのkeyが押せるようにする（なんかscreenのときそうしてた
* confでは下記のような短縮系を使うと、よい

```
set-option        => set
set-window-option => setw
bind-key          => bind
unbind-key        => unbind
```

```lang:.tmux.conf
# 忘れるのでメモ
# 横分割    : "
# 縦分割    : %
# 分割解除  : !
# デタッチ  : d
# アタッチ  : a
# 指定      : a -t name
# 名前変更  : ,

# prefixをscreenと同じに
unbind C-b
set -g prefix C-z
bind C-z send-prefix

# 256色端末を使用する
set -g default-terminal "screen-256color"
# 日本語環境
setw -g utf8 on
# viのキーバインドを使用する
setw -g mode-keys vi
# バックスクロール行数を増やす
set -g history-limit 10000
# 実行されているコマンド名をウィンドウ名に
setw -g automatic-rename on
# マウスでペインを選択可に
set -g mouse-select-pane on
# ウィンドウ番号を1から始める
set -g base-index 1
# ターミナル(iTerm2等)のタイトルを設定
set -g set-titles on
# ステータスバー
set -g status-utf8 on
set -g status-interval 5
set -g status-bg black
set -g status-bg white
setw -g window-status-current-bg blue
setw -g window-status-current-fg white

# Ctrlを押しっぱなしでもよいように
bind C-a last-window
bind C-n next-window
bind C-p previous-window
bind C-l select-pane -t :.+
bind C-c new-window

# key bind (paneの移動)
# Shift + カーソルキーで移動
bind -n S-left select-pane -L
bind -n S-down select-pane -D
bind -n S-up select-pane -U
bind -n S-right select-pane -R

# 再読み込みをキーバインドしておく
bind R source-file ~/.tmux.conf \; display-message "Reload Config!!"
```

```lang:.bash.rb
alias t='tmux'
alias tl='tmux ls'
alias tn='tmux new -s' # 名前をつけて新規セッション開始
```

## rubyのversionがおかしかったり、railsがないって言われたら
tmuxとrbenvを同時に使っていると、railsがinstallしてない、ってエラーがでたり、rubyのversion指定が旨く行かない事があるようです。

そんな場合は、

```bash:bash_profile
export PATH=$HOME/.rbenv/shims:$PATH
```

```.tmux.conf
set-environment -gu RBENV_VERSION
```

### 参考
* [10年以上使っていたGNU screenからtmuxへの乗り換えを実施しました。｜しま★りん.blog @ayurina](http://ameblo.jp/tkshimada/entry-11868199374.html)
* [tmux基本のコマンド — nato's memo 1.0 documentation](http://room6933.com/mymemo/tmux/tmux-basic.html)
* [Bash - tmuxを使いこなそう（ウインドウ、ペイン、セッション、アタッチ、デタッチ） - Qiita](http://qiita.com/shoma2da/items/2e68c1e59938eb0c2f83)
* [glidenote/learning-tmux](https://github.com/glidenote/learning-tmux)
* [Ruby - tmux環境でrbenvによるバージョン変更が出来ない現象 - Qiita](http://qiita.com/omega999/items/5dbea9571efad07754ae)
* [tmux + rbenv の環境で指定した Ruby が使われない件 - akishin999の日記](http://d.hatena.ne.jp/akishin999/20130627/1372284674)
削除してしまったファイルを過去のリビジョンから復活させる


ファイルが存在していたリビジョンをコピー元としてワーキングディレクトリ上にコピーする

```
$ svn copy -r (リビジョン)  path/to/コピー先
```

参考: [Subversion で削除したファイルを復活させる - WebOS Goodies](http://webos-goodies.jp/archives/50630725.html)
TeXで好きな位置に図を配置する


TeXを記述する際の図の位置指定、オプションの基本的な内容をまとめました。
また、非常によく（私は）悩まされる図の配置についての解決策です。
挿入したい図はあらかじめ.texファイルと同じディレクトリに置いてください。

## 基本的な図の配置
基本的な図の出力を行うには、以下を記述します。

```tex:図の配置
% プリアンブルに記述するパッケージ
\usepackage[dvipdfmx]{graphicx}

% 図の挿入
\begin{figure}[位置指定]
\includegraphics[オプション]{ファイル名}
\caption{図のタイトル}
\label{参照するラベル名（任意）}
\end{figure}
```
### 位置指定

位置指定は主に下のいずれかを指定します。

| 位置指定 | 出力場所 |
|:--:|:--|
| h | 記述した部分 |
| t | ページの上部 |
| b | ページの下部 |
| p | 独立したページ |


### オプション

オプションは主に下のいずれかを指定します。

| オプション | 指定内容 |
|:--:|:--|
| width | 幅 |
| height | 高さ |
| scale | 拡大縮小率 |
| angle | 回転する角度 |
| clip | はみ出しを切り取る |

※ オプションはカンマ(,)で区切ることで複数指定することが出来ます。


### ラベルと図のタイトル
この2つに関しては個人的によく使用するものであり、必ず必要というわけではありません。


`\label{}`で図にラベルを付加することで、図番号を他の箇所で参照することが出来ます。
以下の記述により、図の番号を他の箇所で参照して使用することが出来ます。

```tex:ラベル名
\ref{参照するラベル名（任意）}
```
※ `\label{}`と`\ref{}`の括弧内ではラベル名を対応させてください。


また以下の記述をすることで、図にタイトルを付けることが出来ます。

```tex:図のタイトル
\caption{図のタイトル}
```


## 図を好きな位置に配置する

今回の本題です。

上記の位置指定で `[h]` を指定し、記述した部分に挿入すると自分の思った位置とは違う位置に配置されることがあります。
その場合に以下を使用することで強制的に図を好きな位置に配置することが出来ます。

```tex:図の配置
% プリアンブルでパッケージに追加
\usepackage{here}

% 大文字のHを使用することで好きな位置に図を配置
\begin{figure}[H]
```
これを位置指定として使用することで頻繁にイライラさせられる、図の配置について解決することが出来ました。
(この方法が推奨されるかどうかは分かりませんが...。)

## 使用例
以下に上記の方法を用いた記述を例として挙げます。

```tex:sample.tex
% プリアンブル
\documentclass[10pt]{article}
\usepackage[dvipdfmx]{graphicx}
\usepackage{here}

% 本文
\begin{document}

\TeX は便利です。

\begin{figure}[H]
\centering	% 図を真ん中に配置
\includegraphics[clip,width = 5.0cm]{sample.eps}
\caption{図のタイトル}    \label{sample}
\end{figure}

図\ref{sample}を参照します。

\end{document}
```

これをコンパイルすると、以下のように出力されます。
![sample_tex.png](https://qiita-image-store.s3.amazonaws.com/0/44446/28f10731-9343-4171-5c85-78bfc8398ee2.png "sample_tex.png")
※ 挿入する図は下記のサイトなどを利用して.eps形式に変換しておくのがおすすめです。
[→画像ファイルのフォーマットを変換する： jpg png gif eps tiff ps bmp](<target_blank>http://www.henkan-muryo.com/image-converter.php</target>)



## 参考サイト
* [LaTeXコマンド集]
(http://www.latex-cmd.com/)
* [TeXで図をコード記述位置に強制的に出力する]
(http://ac206223.ppp.asahi-net.or.jp/adiary/memo/adiary.cgi/hirosugu/TeX%E3%81%A7%E5%9B%B3%E3%82%92%E3%82%B3%E3%83%BC%E3%83%89%E8%A8%98%E8%BF%B0%E4%BD%8D%E7%BD%AE%E3%81%AB%E5%BC%B7%E5%88%B6%E7%9A%84%E3%81%AB%E5%87%BA%E5%8A%9B%E3%81%99%E3%82%8B)
複数HipChatの起動方法


- 複数アカウントを同時に利用するために、複数のhipchatアプリを起動させる

## 手順

- HipChat.appを複製する
- 右クリック > パッケージの内容を表示
- ```Contents/Info.plist```を開き、```CFBundleIdentifier```と```CFBundleName```を修正します。

例）

```xml:Info.plist
…
<key>CFBundleIdentifier</key>
<string>com.hipchat.CompanyName Hipchat</string>
…
<key>CFBundleName</key>
<string>CompanyName Hipchat</string>
…
```

- 必要ならアプリ名も変えて、アイコンも変える
- 複製してアプリを起動して、別アカウントでログイン
東京メトロの明日の遅延を予報するBotを作ってみた。

### はじめに

東京メトロがアプリコンテストをやっていましたね。ちょうど締切もあってモチベーションにもなるし、何か勉強がてらアプリを作ってみようと考え、機械学習の初歩を勉強して、表題のBotを作ってみようと思いつきました（大したアプリでは無いですが）。

オープンデータ活用コンテスト
 http://tokyometro10th.jp/future/opendata/

※ちなみに、コンテスト応募アプリを見てみると、結構たくさん応募されてますね。
https://www.youtube.com/results?search_query=%E6%9D%B1%E4%BA%AC%E3%83%A1%E3%83%88%E3%83%AD+%E3%82%B3%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88&page=2

### アプリケーション(Twitter Bot)

「東京メトロ 遅延予報」
https://twitter.com/metro_delay

![メトロ.png](https://qiita-image-store.s3.amazonaws.com/0/50690/eafff593-0c8c-d97e-6514-68e900c51671.png)

毎日18時に東京メトロの各路線が明日「遅延するかどうか」を予報します。

#### アプリケーションの利用API
・東京メトロ
・OpenWeatherMap
・Twitter

### アプリケーションの仕組み
「OpenWeatherMapAPI」により取得した天気予報と、「東京メトロAPI」により遅延情報を取得し、ある予報が出た日とその日に遅延が発生したかどうかを機械学習により学習します。この学習データをもとに、ある予報が出た日に遅延が発生するかどうかを求め、遅延の予報としてBOTにつぶやかせています。
（機械学習の仕組みとしてはベイジアンフィルタを用いています。）

常にデータを取得し、学習し続けているので、学習データが集まれば集まるほど、精度が高くなることが期待出来るかなと。

![フィルタ.png](https://qiita-image-store.s3.amazonaws.com/0/50690/11081f7c-cbdd-269d-0d05-8e0dff9153f4.png)

### 作ってみた所感

実際に動かしてみるとやたら遅延するような予報になるのですが、下記のサイトでちらちらと確認すると、結構毎日遅延証明書を発行しているようなので、割りと当たっている気もします。ただ、時間の区切り方がざっくりなので、どこかで遅延したら遅延ありにしているため、そうなるのだろうなと。まだ1週間分の学習データしか無い（2014年11月19日時点）ので、もう少し様子を見たら変わるかもしれませんが。

運行情報：遅延証明書｜東京メトロ http://www.tokyometro.jp/delay/list/

電車別に遅延の予報をするとか、天気予報以外の学習データ（例えば、前日のTwitter界隈のつぶやき内容の解析等）を使って予報するとかしたらもう少し面白いことが出来るかもしれません（猫が顔を洗ったら雨が降る的な）。

まあ、どんなに頑張っても的中率100%の予報はまず無理（学習データの天気予報ですら100%は当たらないのに）なので、大体の目安を予報出来るようになればいいなと。

※ちなみに東京メトロAPIのデータをDBに保存するのは、コンテスト向けのアプリで使う場合に限るみたいな規約があるので、データ自体はもう少し使い道がありそうですが、規約を確認してから使いたいと思います。
RubyでAWS KMS (Key Management Service)を使ってみる

[Class: Aws::KMS::Client - AWS SKD for Ruby V2](http://docs.aws.amazon.com/sdkforruby/api/Aws/KMS/Client.html)を参考に使ってみた。

## 基本形

```rb
require 'aws-sdk-core'

kms = Aws::KMS::Client.new

# 暗号
resp = kms.encrypt(
  key_id: 'be8a4c03-4816-48ba-a3c9-xxxxxxxx', # ↓arnでも可
  # key_id: 'arn:aws:kms:ap-northeast-1:1234567890:key/be8a4c03-4816-48ba-a3c9-xxxxxxxx',
  plaintext: 'ここに暗号化したい文字列など') 

# 復号
puts kms.decrypt(ciphertext_blob: resp.ciphertext_blob).plaintext
```

補足) key_idにalias(鍵の名前)は使えませんでした。 (2014/11/19)


## Authenticated Encryption

```rb
require 'aws-sdk-core'

kms = Aws::KMS::Client.new

# 暗号
resp = kms.encrypt(
  key_id: 'be8a4c03-4816-48ba-a3c9-xxxxxxxx',
  plaintext: 'ここに暗号化したい文字列など',
  encryption_context: { EncryptionContextKey: '秘密のパスワード(はーと)' }) 

# 復号
puts kms.decrypt(
  ciphertext_blob: resp.ciphertext_blob,
  encryption_context: { EncryptionContextKey: '秘密のパスワード(はーと)' }
).plaintext
```

復号時に指定したEncryptionContextKeyが正しくない場合例外が投げられました。

## さいごに
可逆暗号がこんなに簡単にできる。すごい。
バイナリを暗号化したい場合はBase64エンコードでもすればいいですね。
iOSアプリを 特急審査(Expedited Review) に出す


iTunes Connect のリニューアルがあったからか手順が変わっていた。

## ステータスをWaiting for Review にする

先ず、通常の申請フローのとうりにします

## 「リソースとヘルプ」を開く

![kobito.1416386657.657357.png](https://qiita-image-store.s3.amazonaws.com/0/229/396fd72a-6006-5b5b-b13c-9ab4b29adf3a.png "kobito.1416386657.657357.png")


## 「連絡先」を開く

![kobito.1416386724.903322.png](https://qiita-image-store.s3.amazonaws.com/0/229/e4dc3f4d-4423-73dc-678e-07c9c5c64b7d.png "kobito.1416386724.903322.png")

## 「App Review」-> 「Request Expedited Review」を選択
## 「Request an Expedited App Review」のリンクを開く

![kobito.1416386966.327628.png](https://qiita-image-store.s3.amazonaws.com/0/229/1d58881f-8813-9902-c389-8f7e6de4df57.png "kobito.1416386966.327628.png")

`[Start Over]`や`[Done]`を押すと中断してしまう。

## ここにできたものがあります

一応手順で説明したけどここまでやったことは以下のURLを直接開くと省けます。

https://developer.apple.com/contact/app-store/?topic=expedite

## 「Contact Information」以下のフォームを記入

![kobito.1416387073.926588.png](https://qiita-image-store.s3.amazonaws.com/0/229/c977f6be-07f2-4960-7878-3c3e8b145d58.png "kobito.1416387073.926588.png")

## 「Description」も書く

"Critical Bug Fix"なら、その再現手順や影響など。

![kobito.1416387189.468189.png](https://qiita-image-store.s3.amazonaws.com/0/229/9795de1b-02a4-cce5-3fba-466312905c0a.png "kobito.1416387189.468189.png")

## [Send]

完了メッセージが出る。

とくにExpedited Reviewを出したからといって iTunes Connect 上のステータスの変化はない。
iOS(iPhone) にPHPからカレンダーに予定を追加してみた。

大体
http://stackoverflow.com/questions/6735500/create-ical-calendar-event-with-php
のソースいじっただけですが。

後タグに登録してあるZendframeworkを単にMVCとしてビューとロジック分けてるだけなのでそこで上のURLとソースが変わってきているっていう事情もあります。
なのでZendじゃないと動かないソースってわけでもないです。
殆どは普通のPHPです。
まずはロジック(コントローラー側)

```php:TestController.php
<?php
class Test_IndexController extends Zend_Controller_Action {
    public function testAction() {
        $sDateTime = '2014-11-19 10:00:00';
        $eDateTime = '2014-11-19 13:00:00';
        $summary = 'summary';
        $address = 'address';
        $description = 'description';

        $this->addcalender($this, $sDateTime, $eDateTime, $summary, $address, $description);
    }

    private function addcalender($parent, $sDateTime, $eDateTime, $summary, $address, $description) {
        $filename = 'calender.ics';
        header('Content-type: text/calendar; charset=utf-8');
        header('Content-Disposition: attachment; filename=' . $filename);

        $start = new DateTime($sDateTime);
        $startdate = $this->dateToCal($start->format('U'));
        $end = new DateTime($eDateTime);
        $enddate = $this->dateToCal($end->format('U'));
        $date = new DateTime();
        $now = $date->format('H:i:s');

        $parent->view->uid = md5(uniqid(mt_rand(), true)) . "@yourdate.test";
        $parent->view->datetime = $now;
        $parent->view->datestart = $startdate;
        $parent->view->dateend = $enddate;
        $parent->view->summary = $this->escapeString($summary);
        $parent->view->address = $this->escapeString($address);
        $parent->view->description = $this->escapeString($description);
        $parent->view->url = $this->escapeString('url');
    }

    private function dateToCal($timestamp) {
        return gmdate('Ymd\THis\Z', $timestamp);
    }

    // Escapes a string of characters
    private function escapeString($string) {
        return preg_replace('/([\,;])/','\\\$1', $string);
    }
}
```

なるほど、iCalもicsファイル使ってるんですねぇ。

ビューコードです。
```smarty:test.tpl
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//hacksw/handcal//NONSGML v1.0//EN
CALSCALE:GREGORIAN
BEGIN:VEVENT
UID:{$uid}
DTSTAMP:{$datetime}
DTSTART:{$datestart}
DTEND:{$dateend}
SUMMARY:{$summary}
LOCATION:{$address}
DESCRIPTION:{$description}
URL;VALUE=URI:{$url}
END:VEVENT
END:VCALENDAR
```

Androidはテスト中ですが、カレンダーWebアプリケーションなら色々使い道ありそうですね。
Cygwin, Git, ActivePerl でWindowsで開発を進める際スクリプトが実行できない問題が解決したので報告

##【追記】この問題は下記の記事で解決されています
http://qiita.com/umiai/items/a17fc4e750bdaa1dc62b

##概要
下記２つの問題が出た影響でWindowsでのActivePerlを利用した開発は絶望的だったのだが解決できたので報告。

http://qiita.com/umiai/items/7564fa745b205171268a
http://qiita.com/umiai/items/ffb0de687e4383b823c4

##上記の原因
原因自体は不明、やはりアクセス権絡みだとは思うが・・・。
誰が見ても「それは無い」と言われそうだけれど何も書かないのもアレなので一応記載してみる。
(あまり突っ込まないでほしい)
Windowsにcygwinを入れるとcygwin管理のアクセス権とOS管理のアクセス権が競合するような動作になってしまった。
OS管理のアクセス権を変更してもうまく動作しないが、cygwinのbinにあるchmodでアクセス権を変更すれば上手く動作するようになる。

こんなことは有り得ないなんて知っているが今回この問題を解決するうえで一番重要なのがここで、
事も有ろうか git clone したディレクトリに対して cygwinでchmod -R 777 * するというのが
この問題の解決方法なのだから正直もうさっぱりだし多分泥沼だからもう考えたくもない・・・。

##解決方法
既にいっちゃってるけど git clone したディレクトリに対して cygwinでchmod -R 777 * すればいい。
共同開発の場合に開発環境を構築するなら次のようなバッチを用意すれば良いだろう。

> rem git setup
> mkdir trunk
> cd trunk
> git clone AAA.git
> git clone BBB.git
> git clone CCC.git
> chmod -R 777 *

##その他の原因と思われし事象
cygwinを入れた後にActivePerlを入れると環境変数のPathにcygwin側のperl.exeとActivePerl側のperl.exeが存在することになる。
さてこの状態でコマンドプロンプトにperlと入力したらどちらが使われるのだろう？
というところがミソで割とこっちの問題な気がしなくも無い。

http://qiita.com/umiai/items/ffb0de687e4383b823c4

で出ていた問題の１つにパスがUNIX形式に変換される問題が出ていた。
ActivePerl側のperl.exeはWin環境に合わせて作られているので多分こっちならそんな変換はしないはずだが、
シェルを叩く都合があるcygwin側のperl.exeの場合は変換するような仕様になっていても決して不思議ではない。

このあたりに気づいたのはperlを諦めてrubyを入れた後ruby -vしたらバージョンが古く、
その叩かれたruby.exeがcygwinのものであった為にこの問題に気づいた。

アクセス権や上記のperlの問題などが絡んで発生していたのかもしれない。
環境変数弄ったほうが良さそうだけどcygwin側で動作しなくなるのもいやっちゃ嫌なので
確実な対応としては叩くperlは絶対パスで指定するといったところだろうか。
ActivePerlでx64のデフォルトなら

> C:\Perl64\bin\perl.exe AAAAA.pl

かな。まぁどちらにしても微妙だけど。
コメント送信フォームで送信ボタンが消えたけどコメントを送信する方法

こういうことがおきた。

![確認メール届かない系のやつ_-_ユビレジ.png](https://qiita-image-store.s3.amazonaws.com/0/42766/d3b17b54-e182-b796-4189-91a079423640.png)

なんか良くわからないけど、コメントを送信するためのボタンがない。

対策：

```js
$("form[action='/comments']").submit()
```
UINavigationBarの戻るボタンをカスタムしてスワイプで戻る挙動も有効にする


UInavigationBarの戻るボタンをカスタムしつつ、スワイプで戻れるようにするには、以下のようにします。

```objectivec:戻るボタンをカスタムする
@interface HogeViewController ()

@property(nonatomic,weak) id orgDelegate;

@end

@implementation HogeViewController

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    
    if([[self.navigationController viewControllers] count] > 1){
        self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"NavigationLeftAllow"]
                                                                                 style:UIBarButtonItemStylePlain
                                                                                target:self
                                                                                action:@selector(actionPopViewController)];
        [self.navigationItem.leftBarButtonItem setBackgroundImage:[UIImage new]
                                                         forState:UIControlStateNormal
                                                       barMetrics:UIBarMetricsDefault];
        
        self.orgDelegate = self.navigationController.interactivePopGestureRecognizer.delegate;
        self.navigationController.interactivePopGestureRecognizer.delegate = self;
    }
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    
    self.navigationController.interactivePopGestureRecognizer.delegate = self.orgDelegate;
}

- (void)actionPopViewController
{
    [self.navigationController popViewControllerAnimated:YES];
}
```

スワイプのジェスチャーを受け取る部分の実装は微妙ですが、とりあえずこれで動作すると思います。
Sprocketsのrequireディレクティブはスクリプトの後では動かない


application.jsに以下のような記述がある場合

```
//= require jquery
//= require jquery_ujs
window.$$ = jQuery.noConflict()
//= require my-module
```

my-module.jsは読み込まれませんよー。　気をつけてー。
Swift で AppBank Fello を利用する

# 概要

AppBank Fello は AppBank が提供するスマホ向けユーザ獲得ツールです。

[iOS・Androidアプリのアクティブユーザー数が増える「AppBank Fello」](https://appbank.fello.net/)

主な機能として

- プッシュ通知
- メッセンジャー
- 広告配信

があります。

SDK が配布されており、導入も比較的簡単です。
iOS 向けには Obj-C で作成されたライブラリが提供されています。

本稿では Swift から利用する方法を解説します。

基本的には公式で解説されているものを読み替えるだけで OK です。
[プッシュ通知機能を組み込む | AppBank Fello](https://appbank.fello.net/static/img/notification_sdk_integration_for_ios_ss2.png)

# 実装

## 1. ライブラリをプロジェクトに組み込む

ダウンロードした `FelloPush.bundle` および `FelloPush.framework` をドラッグアンドドロップでプロジェクトに組み込みます

![DandD.png](https://qiita-image-store.s3.amazonaws.com/0/7823/56effb80-7139-2b7d-9db9-3b59b15f5fd2.png)

## 2. Build Settings に FelloPush を追加する

Build Settings > Linking > Other Linker Flags に以下を追記します。

```
-framework FelloPush
```

![9e583633-a74e-ae08-321c-c19391d4a668.png](https://qiita-image-store.s3.amazonaws.com/0/7823/3c7fce52-9d5b-f96b-1dd4-241c05530d87.png)



## 3. Build Phases に ライブラリを追加する

Build Phases > Link Binary With Libraries に以下 3 つのライブラリを追加します。

- libsqlite3.0.dylib
- StoreKit.framework
- AdSupport.framework

![pha.png](https://qiita-image-store.s3.amazonaws.com/0/7823/2a42223e-330e-054e-e068-0f497659d520.png)

## 4. Bridging Header を作成する

Objective-C で作成されたライブラリを swift から読み込むために Bridging Header ファイルを作成します。

好きな場所に `Fello-Bridging-Header.h` を作成してください。

![Fello-Bridging-Header_h.png](https://qiita-image-store.s3.amazonaws.com/0/7823/67b09a98-6a07-1469-4fc5-3b21c695e21d.png)


```objc:Fello-Bridging-Header.h
//
//  Fello-Bridging-Header.h
//
#import <FelloPush/IKonectNotificationsCallback.h>
#import <FelloPush/KonectNotificationsAPI.h>
```

## 5. AppDelegate.swift を修正する

AppDelegate ファイルを修正します。

```swift:AppDelegate.swift
// IKonectNotificationsCallback を追加
class AppDelegate: UIResponder, UIApplicationDelegate, IKonectNotificationsCallback {
```


```swift:AppDelegate.swift
        // リモートプッシュの設定（Fello SDK を利用する）
        KonectNotificationsAPI.initialize(self, launchOptions:launchOptions, appId:"YOUR-APP-ID")
```

その他もろもろ

```swift:AppDelegate.swift
    // デバイストークンを受信した際の処理
    func application(aplication: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken devToken: NSData) {
        println("デバイストークンを受信した際の処理")
        KonectNotificationsAPI.setupNotifications(devToken)
    }
    
    // プッシュ通知を受信した際の処理
    func application(aplication: UIApplication, didReceiveRemoteNotification userInfo: NSDictionary) {
        println("プッシュ通知を受信した際の処理")
        KonectNotificationsAPI.processNotifications(userInfo)
    }
    
    // このメソッドで、プッシュ通知からの起動後の処理を行うことが出来る
    func onLaunchFromMessage(messageId: String!, message: String!, extra: [NSObject : AnyObject]!) {
        println("ここでextraの中身にひもづいたインセンティブの付与などを行うことが出来ます")
    }
```