OmniAICreator/Qiita-1.07M huggingface dataset:
「このプログラムもう何時間動いてるんだ。。。」を調べる & tmux で表示できるようにする


<img src="http://i.imgur.com/6xeMD0s.gif" />

サーバを使って実験をしていると、1回実行するのに数時間かかるプログラムを色々と書きながら何度も実行してデータを取ったりということがよくある。そのときに、タイムスタンプ表示を仕込むのを忘れたりすると、実行し始めてから随分時間が経った後に、「あれ、このプログラムいつから実行してるんだっけ？開始時刻がわからないからあと何時間で終わるか予測もできないな、、、」ということがよくある。

こういうプログラムは大抵tmuxの内側で動かしているので、tmuxのキーバインドからサッと確認できると嬉しいので、そのようなものを作った。今のところLinuxでしか動かないけど、OS X の `ps` コマンドに合わせて修正を加えれば OS X でも動くはず。

## シェルが実行中のプロセスを調べるコマンド

`~/usr/bin/childpidinfo` とか名前をつけて下記のスクリプトを保存する。
こいつは、引数でプロセスのPIDを指定して、そのプロセスの子プロセスの中で最も新しいプロセスに関して、開始時刻と実行時間を表示するコマンドになっている。tmuxで開いているシェルのPIDを渡してやることで、結果として実行中のプロセスを調べることができる。カスタマイズすれば、時刻以外にも、やろうと思えばCPU使用率とかメモリ使用率とか`ps`で取れるものはなんでも表示可能。

```bash
#!/bin/bash

if [ $# -lt 1 ]; then
    echo "[ERROR] usage: $0 PARENT_PID"
    exit 1
fi

LAST_CHILD_PID=$(for pid in $(ps --ppid $1 -o pid= | tr -d ' '); do
                     STARTTIME_SEC=$(date -d "`ps --pid $pid -o lstart=`" +%s)
                     echo $pid $STARTTIME_SEC
                 done | sort -k2 | tail -n1 | cut -d' ' -f1)

if [ -z "$LAST_CHILD_PID" ]; then
    echo "No child process is running."
    exit
fi

STARTTIME_SEC=$(date -d "`ps --pid $LAST_CHILD_PID -o lstart=`" +%s)
STARTTIME=$(date -d @${STARTTIME_SEC} +"%Y/%m/%d %H:%M:%S")
DURATION_SEC=$(($(date +%s)-STARTTIME_SEC))
DURATION=$(date --utc -d @${DURATION_SEC} +%kh%Mm%Ss | sed -e 's/^ \(0h\)?*//' | sed -e 's/^00*m//' | sed -e 's/^0//')

echo "[PID:$LAST_CHILD_PID] started at $STARTTIME (running $DURATION)"

```

## tmux.conf の設定

ここでは `<prefix> Shift+P` に割り当てる。

```
# display-message lasts 4 seconds
set-option -g display-time 4000

bind-key P run-shell "tmux display-message \"$(childpidinfo $(tmux list-panes -F '#{pane_active} #{pane_pid}' | grep '^1' | cut -d' ' -f2))\""
```
SwiftとAFNetworkingの簡単サンプル 最新情報 2015/01


以前、[同じ内容の記事](http://qiita.com/tajihiro/items/ad8606f61f3273423ea8)を書いた。
しかし、`xcode`を久しぶりにアップデートしたら下記エラーで動作しなくなった。

```
use of undeclared identifier 'AFNetworkActivityLogger'
```
```
use of undeclared identifier 'AFHTTPRequestOperationManager'
```

![スクリーンショット 2015-01-16 18.20.34.png](https://qiita-image-store.s3.amazonaws.com/0/3184/d4a3abab-445d-4ca8-654e-f8022f1736d5.png "スクリーンショット 2015-01-16 18.20.34.png")

![スクリーンショット 2015-01-16 18.21.11.png](https://qiita-image-store.s3.amazonaws.com/0/3184/be170620-fb14-4667-f8ba-9a300a769ec5.png "スクリーンショット 2015-01-16 18.21.11.png")

結構な人数の方々にストックしてもらっているので、万が一同じ現象に悩まされている人がいたらと思い対応方法を書いてみた。

##開発環境

PC: MacOS X 10.9.4
Xcode: Version 6.1.1

##対処方法

どうやら、`CocoaPods`が最新の`Xcode6.1.1`と相性が良くないこともあるようで、少なくても私の環境では、`Xcode`と`CocoaPods`再インストールしても連携がうまく行かなくなった。

そこで、[AFNetworkingのサイト](http://afnetworking.com/)から、ライブラリを直接ダウンロードして設定してみる。

##ヘッダファイルの配置
適切な方法であるかどうかわからないが、プロジェクトディレクトリに、`Library`ディレクトリを作成し、ダウンロードしたファイルを配置する。
また、`Swift`からヘッダファイルを読み込む為に、`Bridging-Header.h`も作成した。

![スクリーンショット 2015-01-16 18.31.21.png](https://qiita-image-store.s3.amazonaws.com/0/3184/9dd6475e-5175-5094-e215-a4950fc32437.png "スクリーンショット 2015-01-16 18.31.21.png")

Xcodeのプロジェクトに、上記`Library`ディレクトリを追加する。
その際、ヘッダファイル群がパスに読み込まれるように、[Search Paths]-[Always Search User Paths]に[Yes]を設定するのがミソ。

![スクリーンショット 2015-01-16 18.37.00.png](https://qiita-image-store.s3.amazonaws.com/0/3184/645c974f-3c01-9247-766c-8483a4623d93.png "スクリーンショット 2015-01-16 18.37.00.png")

そして、[Swift Compiler - Code Generation]-[Objective-C Bridging Header]に、ブリッジとなるヘッダファイルのパスを設定してやる。

![スクリーンショット 2015-01-16 18.41.53.png](https://qiita-image-store.s3.amazonaws.com/0/3184/6f7531e2-9945-8e94-5e91-57b33e9975bc.png "スクリーンショット 2015-01-16 18.41.53.png")

追加したブリッジヘッダの内容は以下。

```Bridging-Header.h
#ifndef AFNetworkSample_Bridging_Header_h
#define AFNetworkSample_Bridging_Header_h

#import "AFNetworking.h"
#import "AFNetworkActivityLogger.h"

#endif
```


これで、読み込めずに動作しなくなった`AFNetworking`関連のクラスが利用できるようになる。

ハマりどころは、まさかの`xcode6.1.1`で、`CocoaPods`が連携できないことであった。
少なくても私の環境だけの問題かもしれないが・・・。


***Lovely Swift!!!***
オブジェクト指向と関数型で副作用の扱いが違うって知ってた？

なんかQiitaの方が、アクセスが多いみたいなんで貼っておく。

[オブジェクト指向と関数型で副作用の扱いが違うって知ってた？](http://qtamaki.hatenablog.com/entry/2015/01/16/135703)
クリエイティブ・コモンズのHTML+RDFaコードは、HTML5としてinvalid → xmlns:ccをprefixにすれば解決


## クリエイティブ・コモンズのライセンス選択ツール画面

<https://creativecommons.org/choose/>

![Screen capture of http://creativecommons.org/choose/](https://qiita-image-store.s3.amazonaws.com/0/26039/3a4007ee-d583-2843-3c03-10399a5c3845.png "screencapture-creativecommons-org-choose.png")

## 出力されたHTML+RDFaコード

```html
<a rel="license" href="http://creativecommons.org/licenses/by/4.0/"><img alt="クリエイティブ・コモンズ・ライセンス" style="border-width:0" src="https://i.creativecommons.org/l/by/4.0/88x31.png" /></a><br /><a xmlns:cc="http://creativecommons.org/ns#" href="http://ja.ishibashihideto.net/" property="cc:attributionName" rel="cc:attributionURL">石橋秀仁</a> を著作者とするこの 作品 は <a rel="license" href="http://creativecommons.org/licenses/by/4.0/">クリエイティブ・コモンズの 表示 4.0 国際 ライセンス</a>で提供されています。
```

## HTML5の体裁にしたもの


```html
<!DOCTYPE html>
<html lang="ja">
  <head>
  <meta charset="utf-8">
  <title>CC HTML+RDFa</title>
</head>
  <body>

<a rel="license" href="http://creativecommons.org/licenses/by/4.0/"><img alt="クリエイティブ・コモンズ・ライセンス" style="border-width:0" src="https://i.creativecommons.org/l/by/4.0/88x31.png" /></a><br /><a xmlns:cc="http://creativecommons.org/ns#" href="http://ja.ishibashihideto.net/" property="cc:attributionName" rel="cc:attributionURL">石橋秀仁</a> を著作者とするこの 作品 は <a rel="license" href="http://creativecommons.org/licenses/by/4.0/">クリエイティブ・コモンズの 表示 4.0 国際 ライセンス</a>で提供されています。

  </body>
</html>

```

## W3C Markup Vlidation Serviceによる検査結果

<https://validator.w3.org>

![screencapture-validator-w3-org-check.png](https://qiita-image-store.s3.amazonaws.com/0/26039/7583d092-3f1d-9885-afa9-7729488ec824.png "screencapture-validator-w3-org-check.png")


> Validation Output: 1 Error

> Error Line 9, Column 325: Attribute xmlns:cc not allowed here.
```…tributionName" rel="cc:attributionURL">石橋秀仁</a> を著作者とするこの 作品 は <a rel="license…```

> Warning Line 9, Column 325: Attribute with the local name xmlns:cc is not serializable as XML 1.0.
```…tributionName" rel="cc:attributionURL">石橋秀仁</a> を著作者とするこの 作品 は <a rel="license…```

## 解決策

```html
xmlns:cc="http://creativecommons.org/ns#"
```

の部分を削除すればよい。（コメントでご指摘いただきました）
技術情報を記録するときの記述パターン

『パターンによるソフトウェア構成管理』の記述形式を参考に、なにかしらの技術記事を書く時のパターンを作成してみた。

##タイトル
後に内容の理解がしやすいよう、ポイントとなるキーワードを使ってタイトルを作る

##コンテキスト（状況）
どんな背景でどういう状況にいるかを記述する

##Pain（悩み、問題）
どんな事に困っているのか、どういう状況になるのを望んでいるかを記述する


##対応方法
どういう活動を行って、Painを解決するのかを記述する


##検討課題
関連するPainや対応方法、または対応方法に関する懸念など、別の事柄への展開や本件を深めるための内容を記述する
Module#append_featuresを上書きする時はsuperを書かないとモジュールがincludeされない

タイトルが全てなのですが実際にコードを書いて試してみました。

# Module#append_featuresを上書きする例
Ruby技術者認定試験Gold version 2.1で似た問題が出てた気がします。
試験ではsuperが必要か否かで選択肢が分かれていました。
正解はsuperを入れている選択肢だったと思います。

## ①append_features内での継承関係の確認
出力結果からappend_features内ではまだモジュールMがincludeされていないことが分かる。
append_featuresの引数klassは、**モジュールMをインクルードするクラスであるA**。

```rb
module M
  def self.append_features(klass)
    p klass.ancestors
    super
  end
end

class A
  include M
end
```
```rb:出力
[A, Object, Kernel, BasicObject]
```

## ②モジュールがincludeされていることを確認
クラスAはモジュールMをincludeしていることが分かる。

```rb
module M
  def self.append_features(klass)
    p klass.ancestors
    super
  end
end

class A
  include M
end

puts "------------------------------------"
puts "in top-level"
p A.ancestors
```
```rb:出力
[A, Object, Kernel, BasicObject]
------------------------------------
in top-level
[A, M, Object, Kernel, BasicObject]
```

## ③superを書いていないとモジュールがincludeされないことを確認
superがコメントアウトされていると、クラスAがモジュールMをincludeできていないことが分かる。

```rb
module M
  def self.append_features(klass)
    p klass.ancestors
    # super
  end
end

class A
  include M
end

puts "------------------------------------"
puts "in top-level"
p A.ancestors
```

```rb:出力
[A, Object, Kernel, BasicObject]
------------------------------------
in top-level
[A, Object, Kernel, BasicObject]
```

# Module#append_featuresについての参考リンク
## Rubyリファレンス(Oiax)
http://ref.xaio.jp/ruby/classes/module/append_features
※リンク先のRubyは1.9.2みたいですが、2.1.5でも同じ挙動でした。

```rb
def append_features(klass)
  code...
end
```
>
append_featuresメソッドは、モジュールが他のクラスやモジュールにインクルードされる前に呼び出されます。
**引数にはモジュールをインクルードするクラスやモジュールが入ります。
append_featuresはincludeメソッドによって呼び出されます。Moduleクラスのオリジナルのappend_featuresはインクルード機能の本体です。append_featuresを上書きするときは、superを呼び出さないとモジュールがインクルードされません。**  
次の例では、append_featuresの中でメッセージを表示したあとで、superでインクルード機能を呼び出しています。
>

```rb
module Feature
  def self.append_features(klass)
    puts "#{klass} is going to include #{self}!"
    super
  end
end
 
class Container
  include Feature
end
```

```rb:出力
Container is going to include Feature!
```

## るりま
http://docs.ruby-lang.org/ja/2.1.0/method/Module/i/append_features.html

```
append_features(module_or_class) -> self
```

>
モジュール(あるいはクラス)に self の機能を追加します。
このメソッドは Module#include の実体であり、 include を Ruby で書くと以下のように定義できます。
>

>

```rb
def include(*modules)
  modules.reverse_each do |mod|
    # append_features や included はプライベートメソッドなので
    # 直接 mod.append_features(self) などとは書けない
    mod.__send__(:append_features, self)
    mod.__send__(:included, self)
  end
end
```

>
> [SEE_ALSO] Module#included
Nightwatch.js: 「<input> の値が変化するまで」待つ


#背景

「何かのトリガ」に基づいて programmatically に変化する `<input>` 要素はよくある。時計とか。

このような `<input>` に対して、「値が変化するまで待って」テストを進めたいこともあるかもしれない。あったんや！

要するに:

```js
var val = getValue('#myInput')
do {
    sleep(100)
} while (val != getValue('#myInput'));
なんか
```

のようなことがしたい。

`<input>` の値じゃなくて、何かの要素の `textNode` の変化を見たい場合もあるかもしれないが、今はそういうよけえな一般化はどうでもええんじゃあ。

#方針

1. `do { ... } while (v != expr); なんか` を、再帰関数 `f = () => { ...; if (v != expr) { なんか } else { f() } }` に読み替える
2. (1.) の `f` に、人手によるぬくもりのあるCPS変換をかける
3. `<input>`の値を取るために、`.getValue()` を使う

#実装

```js
module.exports = {
    testMyInputChanges: function(client) {
        function waitForMyInputChanged(andThen) {
            // 「今」の #myInput の値
            client.getValue('#myInput', function(val) {
                function recurse() {
                    // 100ms 待って、もう一度 #myInput の値をとる
                    client.pause(100).getValue('#myInput', function(val2) {
                        // console.log(val); console.log(val2); // かくにん！
                        if (val.value != val2.value) {
                            // 変化した
                            andThen();
                        } else {
                            // #myInput の値を変化させる「トリガ」がある場合は、ここにそれを書く
                            // client.setValue('#myInput', ...)

                            // タイムアウトとかを判定したい場合もここに

                            // リトライ
                            recurse();
                        }
                    })
                }
                recurse();
            });
        }

        waitForMyInputChanged(function()  {
            // ここに、#myInput の値が変わったらしたい「なんか」
            ...
        });
    }
}
```

#蛇足

CSS セレクタやポーリング間隔をパラメトライズしてあげれば、このまま「オレオレコマンド」として再利用できそうに思える。
が、[公式ドキュメントを読む限り、やり方がわからない (というかできなそうに見える)](http://nightwatchjs.org/guide#custom-commands) as of 2015/1/16。
これ、チェック本体と継続叩くところが泣き別れやん...
capistrano 3 で１回の実行中に同じタスクを２回以上呼ぶには  reenable すればOK

# はじめに

バッチ処理的なものを capistrano 3 からやろうと思ったらうまくいかなかったのでなんとかしてみた記録。
cap 3 になってタスク呼び出しが invoke に変わったので、流れってゆうか、ついででダブりコードをきれいにしようと思ったらはまった。

# 結論

* ruby ってゆうか rake の仕様なの？（よく知らない。ruby好きじゃない）
* execute または reenable で再実行可能にしてあげればいい

# OKなコード
<pre>
namespace :batch do
  task :a do
    on roles(:all) do
      execute :echo, "a"
      set :say, "a"
      invoke "batch:echos"
    end
  end
  task :b do
    on roles(:all) do
      execute :echo, "b"
      set :say, "b"
      invoke "batch:echos"
    end
  end
  task :echos do
    on roles(:all) do
      execute :echo, "#{fetch(:say,'yes')}"
      # こういう強制の仕方はいかがなものかと思うで、
      # もっといい書き方のわかるるびりすとからのコメントをお待ちしています
      # というわけで、このページで書きたいのはこの１行だけ。
      Rake::Task["batch:echos"].reenable
    end
  end
  task :ab do
    on roles(:all) do
      set :say, "ab"
      invoke "batch:echos"
      invoke "batch:a"
      invoke "batch:b"
    end
  end
end
</pre>

これでうまくいった。

<pre>
cap stg batch:a
cap stg batch:b
cap stg batch:ab
</pre>

# 雑感

コード的にはこのへん
https://github.com/capistrano/capistrano/blob/169f69729439dc85246a6a8ca3343e1aabdb4ad5/lib/capistrano/dsl.rb#L15
なので、 呼び出し時 invoke の第二引数に渡したりでどうにかなんないかなと思ったんだけど、
http://docs.ruby-lang.org/ja/2.0.0/class/Rake=3a=3aTask.html#I_INVOKE
これだけじゃどう書けばいいのかわからない程度のruby力しか持ち合わせていないので放棄。

いずれにしても複数回呼ぶようなタスクを共通にして切り出しても大丈夫になったので、コードがきれいになるんじゃないかと思っている。
Ubuntu14.04でservice startが1を返すためchefがエラーになる現象を回避



````bash:Ubuntu12.04LTS
$ lsb_release -r; sudo service nginx start; echo $?
Release:        12.04
Starting nginx: nginx.
0
````

````bash:Ubuntu14.04LTS
$ lsb_release -r; sudo service nginx start; echo $?
Release:        14.04
start: Job is already running: nginx
1
````

この動きはどうなんだと思う. ;; serviceで上げ下げする前に必ずstatus見ろってこと?
結果として, chefを実行したとき`action :start`が失敗扱いになる.


``````bash
    ================================================================================
    Error executing action `start` on resource 'service[nginx]'
    ================================================================================

    Mixlib::ShellOut::ShellCommandFailed
    ------------------------------------
    Expected process to exit with [0], but received '1'
    ---- Begin output of /etc/init.d/nginx start ----
    STDOUT:
    STDERR:
    ---- End output of /etc/init.d/nginx start ----
    Ran /etc/init.d/nginx start returned 1

    Resource Declaration:
    ---------------------
    # In /tmp/chef-repo/cookbooks/nginx/recipes/default.rb

     48: service 'nginx' do
     49:   supports :status => true, :restart => false, :start => true
     50:   action [ :enable, :start ]
     51: end
     52:
`````


![2015-01-16 at 4.02 PM.png](https://qiita-image-store.s3.amazonaws.com/0/682/6914f262-18aa-fedc-db11-068e91c5ced9.png "2015-01-16 at 4.02 PM.png")

[TalkingQuickly/basic_security-tlq](https://github.com/TalkingQuickly/basic_security-tlq)


[https://tickets.opscode.com/browse/COOK-3910]() によれば

```bash:/lib/lsb/init-functions
# If the currently running init daemon is upstart, return zero; if the
# calling init script belongs to a package which also provides a native
# upstart job, it should generally exit non-zero in this case.
init_is_upstart()
{
   if [ -x /sbin/initctl ] && /sbin/initctl version 2>/dev/null | /bin/grep -q upstart; then
       return 0
   fi
   return 1
}
```

にコメントが書かれており, initctlがupstartなら0を返す動きになる.

ので, 
[https://github.com/andreychernih/openssh/commit/ee011fdda086547c876bceff79f63d751d0893b9]() あたりの解決策を見るとserviceブロックにproviderを渡せばよさそう

`````diff
+service_provider = Chef::Provider::Service::Upstart if 'ubuntu' == node['platform'] && Chef::VersionConstraint.new('>= 13.10').include?(node['platform_version'])
 service 'nginx' do
+  provider service_provider
   supports :status => true, :restart => true, :start => true
   action [ :enable, :start ]
 end
````
UniversalImageLoaderでロードした画像がチラつく問題の対処法


[UniversalImageLoader](https://github.com/nostra13/Android-Universal-Image-Loader)で画像の表示にアニメーションをつけていると、ListViewの`Adapter#notifyDataSetChanged()`が呼ばれた時にViewがチラつくことがあります。

![ezgif.com-optimize (1).gif](https://qiita-image-store.s3.amazonaws.com/0/15267/e471ea13-e7af-fed4-922d-3c7a01c4090d.gif "ezgif.com-optimize (1).gif")


[Image flickering on notifyDataSetChanged() #376](https://github.com/nostra13/Android-Universal-Image-Loader/issues/376)でIssueとして上がっていて色々解決策が提示されてるんですが、試しても解決しないコードが多かったのでメモしておきます。

こんな感じでdisplayerをDisplayImageOptionsに設定している場合。

```java
DisplayImageOptions options = new DisplayImageOptions.Builder()
    .cacheOnDisc(true)
    .cacheInMemory(true)
    .displayer(new FadeInBitmapDisplayer(200)) // 表示時のアニメーションの設定
    .build();
```

Adapterの`getView()`の中でちょっと工夫します。

```Adapter.java
@Override
public View getView(int pos, View view, ViewGroup parent) {
    ViewHolder holder;

    if (view == null) {
        view = LayoutInflater.from(getContext()).inflate(R.layout.item_layout, parent, false);
        holder = new ViewHolder(view);
        view.setTag(holder);
    } else {
        holder = (ViewHolder) view.getTag();
    }

    Item item = getItem(pos);

    // ImageViewにタグをつけておいて、同じURLじゃなかったら表示する
    if (holder.mImageView.getTag() == null ||
        !holder.mImageView.getTag().equals(item.getImageUrl())) {
        ImageLoader.getInstance().displayImage(item.getImageUrl(), holder.mImageView);
        holder.mImageView.setTag(item.getImageUrl());
    }

    return view;
}
```

これでちらつきは解消されます。ちょっと面倒なので、もっと良いやり方があるかもしれません。
AppleStoreからアプリが削除されたときの復帰方法（バカ）

# 概要
* Apple Developライセンスがきれたまま放置してAppleStoreからアプリが削除されたときの対応方法
    * 普通に使用している方はならないと思いますが、なったときの参考として

# 背景
* Apple Developライセンスが切れたまま3ヶ月くらい放置していたらAppleStoreからアプリが削除されていた
    * 2年くらい前にリリースしたアプリ

# 対応方法
* Apple Developライセンスの再購入
    * これだけではアプリは復帰しない（「購入準備中」のまま）
* Apple Storeから消えたアプリの復活
    * iTunes Connectから該当アプリを開いて購買開始日を当日に変更して保存
        * 購買開始日がリリース当時の「2012～」のままになっていた
    * 10分くらい経過したら復活

# わかったこと
* Apple Developライセンスが切れるとAppleStoreからアプリが削除されるが、アプリの情報はそのまま保持している
    * Appデータ作り直しやビルドデータ送信作業などは不要
ensure節に明示的にreturnを書いた場合と書かなかった場合の違い

begin節、ensure節に明示的にreturnを書いた場合と書かなかった場合で挙動が違ったのでまとめてみた。

## ①begin節、ensure節どちらも明示的にreturnを書かない
begin節の値が出力されている。ensure節の値は無視されている。

```rb:例①
def foo
  begin
    puts "begin"
    1
  ensure
    puts "ensure"
    2
  end
end

p foo
```

```rb:出力
begin
ensure
1
```

### begin式の戻り値
http://docs.ruby-lang.org/ja/2.1.0/doc/spec=2fcontrol.html#begin
>
begin式全体の評価値は、本体／rescue節／else節のうち 最後に評価された文の値です。
また各節において文が存在しなかったときの値 はnilです。
いずれにしてもensure節の値は無視されます。
>


## ②begin節にのみ明示的にreturnを書く
①と同じ結果。ensure節の値は無視されている。

```rb:②
def foo
  begin
    puts "begin"
    return 1
  ensure
    puts "ensure"
    2
  end
end

p foo
```

```rb:出力
begin
ensure
1
```



## ③ensure節にのみ明示的にreturnを書く
ensure節の値が無視されず、出力されている。

```rb:例③
def foo
  begin
    puts "begin"
    1
  ensure
    puts "ensure"
    return 2
  end
end

p foo
```

```rb:出力
begin
ensure
2
```


## ④begin節、ensure節どちらも明示的にreturnを書く
③と同じ結果。ensure節の値が無視されず、出力されている。

```rb:例④
def foo
  begin
    puts "begin"
    return 1
  ensure
    puts "ensure"
    return 2
  end
end

p foo
```

```rb:出力
begin
ensure
2
```


# ensure節に明示的にreturnを書くと、戻り値がensure節の値に置き換えられる

```rb:④と同じケース
def bar
  begin
    return 1 # 呼び出し元に戻る前にensure節にジャンプする
  ensure
    return 2 # 戻り値をこの新しい値に置き換える
  end
end

p bar # => 2
```

## 参考リンク
[ensure節は伝播する例外や戻り値を変える](http://taka-ruby.blogspot.jp/2012/01/ensure.html)

>
プログラミング言語 Rubyより
>
ensure節は、他の制御移転処理を実行して例外が伝播するのをキャンセルすることができる。
ensure節が新しい例外を生成すると、元の例外の代わりに新しい例外が伝播する。
**ensure節にreturn文が含まれていれば、例外の伝播はそこで止まり、ensure節を含むメソッドは呼び出し元に戻る。**
>

[Rubyのensureはreturnを撤回できる](http://blog.s21g.com/articles/1118)

Effective Ruby の項目25にも同じような内容が書かれているみたいです。早く電子版出てほしい。。
https://books.google.co.jp/books?id=Zl_xBQAAQBAJ&pg=PA97&lpg=PA97&dq=ensure+return+%E6%98%8E%E7%A4%BA&source=bl&ots=eDuMOf4QwE&sig=SXxom8LHAL-gfLjUzXYW8Snocg8&hl=ja&sa=X&ei=sMW4VIjBItPY8gX4vICYBg&ved=0CCMQ6AEwAQ#v=onepage&q=ensure%20return%20%E6%98%8E%E7%A4%BA&f=false


## 参考にしたツイート
以下のツイートにインスパイアされて記事を書きました。
参考： [武田哲也さんのRuby技術者認定試験受験記](http://togetter.com/li/769555)

<blockquote class="twitter-tweet" data-conversation="none" lang="ja"><p><a href="https://twitter.com/hashtag/RubyGold?src=hash">#RubyGold</a>&#10;ensure 節あるときの評価値はどうなるかってやつ。これ間違えた。&#10;def m&#10; begin&#10; puts &quot;begin&quot;&#10; 1&#10; ensure&#10; puts &quot;ensure&quot;&#10; 2&#10; end&#10;end&#10;p m</p>&mdash; 武田哲也 (@__takeda) <a href="https://twitter.com/__takeda/status/554081805247070209">2015, 1月 11</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-conversation="none" lang="ja"><p><a href="https://twitter.com/hashtag/RubyGold?src=hash">#RubyGold</a>&#10;（続き）上記コードは&#10;begin&#10;ensure&#10;1&#10;と出力する。最後「2」じゃない！&#10;<a href="http://t.co/G0pa6Jk3sF">http://t.co/G0pa6Jk3sF</a>&#10;「いずれにしてもensure節の値は無視されます」かー。そういや昔読んだような気はするが・・</p>&mdash; 武田哲也 (@__takeda) <a href="https://twitter.com/__takeda/status/554082407804960768">2015, 1月 11</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
IEでformにハッシュ値を渡せない件

## URLにハッシュ値を付けて操作したいが、IEではうまくいかない

最初に言っておくと、Chrome, FireFox, Safari では問題なく出来ます。

遷移先のURLでonloadイベントでlocation.hashを解釈して、location.hashが存在すればajaxを実行する操作をやりたかったのですが、そのときにハマりました。

例えばjQueryなんかでフォーム要素を書き変えたい場合

```js:evtSet.js
var evtsend = function (at) {
  $('form[name="hogeForm"]').attr("action", at.attr("name"));
  $('a#set').trigger('click');
}

$('#hoge').click(function() {
  evtsend($(this));
});
```

id="hoge"を持つ要素をクリックしたらhogeFormのactionをクリックした要素のname属性から引っ張って、a#setをクリックさせてformをsubmitさせるコードです。

ここで、たとえばクリックする要素のnameにハッシュがあればどうなるでしょうか。

```html
<div id="hoge" name="#hogehoge">クリックしてや!</div>
```

みたいな。

実際にIEでやると、__formのaction属性は変更されません__。

form内のinput要素に含ませる場合も同じ。ハッシュ値は渡せないようです。

stackoverflowにはこんな記事が載っていました。
[Bug in IE when using Javascript to change a form action, when method=get and URL contains a hash](https://stackoverflow.com/questions/7916338/bug-in-ie-when-using-javascript-to-change-a-form-action-when-method-get-and-url)


上記の記事を参考に、解決策を練ってみたいと思います。

とにかく、ハッシュを渡せないわけだから、遷移元でhiddenパラメータにhashという名前を付けた値をいれ、ハッシュを取り除いたものをvalueとして渡します。

で、formからnameにhashが含まれているパラメータを取り出し、ハッシュをつけてlocation.hashに渡してやります。

```js:kaiketsu.js（一部抜粋）
 :
if (hash_parameter) {
  location.hash = '#' + hash_parameter;
}
 :
```

自分はRails使ってたので、gonオブジェクトに値を渡して解決させました。。

何か参考になれば。
比較演算子で少しつまづきました。


https://github.com/tj/ejs
ejsテンプレートを使用するとき、<= >はエスケープされて、<- >はエスケープされない。

つまり、どういうことかというと、``<= a < 0>`` みたいにすると、``a &lt 0``とレンダリングされるから気をつけてということです。

意外とここでつまずいたので、メモとして。。
Unity5Beta18 uGuiのAnchorメモ

●Anchorセット前
 ![アンカーセット前.png](https://qiita-image-store.s3.amazonaws.com/0/17904/21a7662a-46cf-41e2-e96c-d474a346307a.png)

●X座標のアンカーを0.0～1.0に設定、縦の高さのみサイズ変更可能
![X座標のアンカーセット_Heightのみ変更可能.png](https://qiita-image-store.s3.amazonaws.com/0/17904/f4c0cb44-0c3f-4f03-7ca4-08c8541a61a5.png)

●Y座標のアンカーを0.0～1.0に設定、横の幅のみサイズ変更可能
![Y座標のアンカーセット_Widthのみ変更可能.png](https://qiita-image-store.s3.amazonaws.com/0/17904/576050db-4af2-aa77-d20a-a669adce4d97.png)


縦か横のサイズが大きいほうを基準にして、
アスペクト比を変更。

例）
　動画サイズ１：XY=250*150なら横を基準にして縦側を返る。
　動画サイズ２：XY=100*150なら縦を基準にして縦側を返る。
linux > ファイルリストを改行つきで取得 > sed 's/;/\n/g'または ls -1 (より良い方法) 

CentOS6.5 + bashにて動作確認

あるファイルリストを改行つきで取得したい時

    ls func_*.c > log
とすると`log`には`func_a.c func_b.c func_c.c`のように横並びで記載される。

ファイルごとに改行をつけたい時は以下のようにするようだ。

    ls func_*.c | sed 's/;/\n/g' > log

`sed`を使って改行マーク(\n)に変換しているのは理解できる。ただし、(;)を改行に変換する理由が理解できていない。

<hr>
(追記)
以下を教えていただきました。こちらの方が簡単でいいですね。

    ls -1 func_*.c > log
Matlabで数字の取り合わせを作る

性懲りもなく、Matlabの投稿します。


Matlaberって基本プログラミングそのものには興味ない気がしますね、はい。
だからこそ知見を書き溜められればと。。。


##アウトプット

今回こういうの作りたいです。動的に。

```matlabscript
struct('x1', 1:3, 'x2', 1:2, 'x3', 2:3, 'x4', [1 3], 'x5', 1, 'x6', 2, 'x7', 3, 'x8', []);
```

使う場面としては、
トレーニングデータの特定のIDのものだけ参照する解析のときで、
structure使うことでイテレーション回せるようになります。

なお、構造体のイテレーションは、

```matlabsession
Structure = struct(...)
len = length(fieldnames(Structure))
for I=1:len
    
end
```

とか、

```matlabsession
Structure = struct(...)
for children=fieldnames(Structure)'
    Structure.(children{1})
end
```

みたいなのがあります。お試しあれ。

## 作ったもの

関数書き直しました。for文をinlineで使う力技です。

```matlab:pickUpPureComponentsAsIndex.m
function bool_grid = pickUpPureComponentsAsIndex(dimention)
	% @desc: enable to pick up pure components as indices
	bool_grid = zeros(2^dimention, dimention);
	cnt = 1;
	idx_label = {'A' 'B' 'C' 'D' 'E' 'F' 'G' 'H' 'I' 'J'};
	initial_label = '';
	for I = 1:dimention
		initial_label = [initial_label ' ' idx_label{I}];
	end
	initial_label = ['[' initial_label ']'];
	inline_iteration = ['bool_grid(cnt, :) = ' initial_label ';cnt = cnt + 1;'];
	for I=1:dimention
		str_s = ['for ' idx_label{I} '=0:1, '];
		str_e = ['end;'];
		inline_iteration = [str_s inline_iteration str_e];
	end
	eval(inline_iteration);
end
```

## 使い方と出力

```matlabsession
bool_grid = pickUpPureComponentsAsIndex(5);
TrainingDataTarget = struct();
len = length(bool_grid);
for I=1:len
	di = diag( [1 2 3 4 5]' * bool_grid(I,:) );
	TrainingDataTarget.(['x' num2str(I)]) = di(di~=0);
end
```

こうやったときに、TrainingDataTargetを確認すると次の通り：

```matlabsession
>> TrainingDataTarget

TrainingDataTarget = 

     x1: [0x1 double]
     x2: 5
     x3: 4
     x4: [2x1 double]
     x5: 3
     x6: [2x1 double]
     x7: [2x1 double]
     x8: [3x1 double]
     x9: 2
    x10: [2x1 double]
    x11: [2x1 double]
    x12: [3x1 double]
    x13: [2x1 double]
    x14: [3x1 double]
    x15: [3x1 double]
    x16: [4x1 double]
    x17: 1
    x18: [2x1 double]
    x19: [2x1 double]
    x20: [3x1 double]
    x21: [2x1 double]
    x22: [3x1 double]
    x23: [3x1 double]
    x24: [4x1 double]
    x25: [2x1 double]
    x26: [3x1 double]
    x27: [3x1 double]
    x28: [4x1 double]
    x29: [3x1 double]
    x30: [4x1 double]
    x31: [4x1 double]
    x32: [5x1 double]

>> TrainingDataTarget.x32

ans =

     1
     2
     3
     4
     5

>> TrainingDataTarget.x10

ans =

     2
     5
```

これで、無事にやりたいことが実装できました！


## 追記

関数 pickUpPureComponentsAsIndexを書き直したので、

```matlabsession
>> pickUpPureComponentsAsIndex(2)

ans =

     0     0
     1     0
     0     1
     1     1
```

できるようになりました！
いぇーい
nodebrewでio.jsを入れてみたメモ


nvm派だったんですけど、nodebrewがio.js対応したという話を聞いたので触ってみました。

##nodebrew

ピクセルグリッドの@hokacchaさんが作っているnode.jsのバージョン管理システムです。

https://github.com/hokaccha/nodebrew

### インストール

```
$ curl -L git.io/nodebrew | perl - setup
```

パス設定 (.bashrc や .zshrcに記載)

```.zshrc
export PATH=$HOME/.nodebrew/current/bin:$PATH
```

適用

```
$ source ~/.zshrc
```

nodebrewが使えるようになります

```
$ nodebrew help
```

## node.jsのインストール

lastestで最新が入るのがいいですね。バージョンを指定しないでとりあえず最新を使いたいってときには便利そうです。

```
$ nodebrew install-binary latest
$ nodebrew use latest
```

## iojsをインストールしてみる

https://iojs.org/ 

### インストール

```
$ nodebrew install-binary io@v1.0.1
$ nodebrew use io@v1.0.1
$ nodebrew ls
io@v1.0.1

current: io@v1.0.1
```

### 確認

```
$ iojs -v
v1.0.1
$ which iojs
/Users/sugawara_nobisuke/.nodebrew/current/bin/iojs
```

## io.jsを使ってみる

io.jsはNode.jsと互換性があるみたいなので、Node.jsのサイトのtcpサーバーを立てるサンプルを使ってみます。
http://nodejs.org/

```app.js
var net = require('net');

var server = net.createServer(function (socket) {
  socket.write('Echo server\r\n');
  socket.pipe(socket);
});

server.listen(1337, '127.0.0.1');
```

```
$ iojs app
```

http://localhost:1337

こんな感じでブラウザに表示されます。

```
Echo server
GET / HTTP/1.1
Host: localhost:1337
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.99 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: ja,en-US;q=0.8,en;q=0.6
```

普通に動きますね。
個人的はてなブログ用テンプレ

読書ブログ [book review](http://hidenori-t.hatenablog.com) 用に,
☆による本の評価と
藤井 孝一『[読書は「アウトプット」が99%: その1冊にもっと「付加価値」をつける読み方](http://amzn.to/2kdirQy)』三笠書房，2013，118頁を参考にした書評のフォーマットと
クリエイティブ・コモンズ・ライセンス

```html:hatena_template.md
<!-- Insert Amazon product -->

☆☆☆ <!-- 本の評価 -->

* なぜ読んだのか

* 何が書いてあったか <!-- 要約  -->

>「」(p.)  <!-- 引用  -->
<!-- 感想 -->

<!-- このコメントは引用だけで感想が無い時,次の引用を別のblockquoteタグに入れるためのもの -->

* 何を学んだか

* どう活かすか

<img style="border-width: 0;" src="http://i.creativecommons.org/l/by-nc-nd/2.1/jp/88x31.png" alt="クリエイティブ・コモンズ・ライセンス" />

<!-- 4つの問いは，藤井 孝一『[読書は「アウトプット」が99%: その1冊にもっと「付加価値」をつける読み方](http://amzn.to/2kdirQy)』三笠書房，2013，118頁参考．-->
```

読書家のお役に立てたら嬉しいです:wink::books:

(もしよろしければサポートお願いいたします．wish list: http://amzn.to/343JRQu)
Ansible の dynamic inventory を使うときにエラーが起こったので実行権限を付与して解決

Ansible の dynamic inventory を使って、 EC2 のインスタンスを
自動で削除しようとしている時に、次のようなメッセージがでた。

```bash
$ ansible-playbook -i ec2.py　sample.yml 
```

```bash
Traceback (most recent call last):
  File "/usr/bin/ansible-playbook", line 307, in <module>
    sys.exit(main(sys.argv[1:]))
  File "/usr/bin/ansible-playbook", line 98, in main
    inventory = ansible.inventory.Inventory(options.inventory)
  File "/usr/lib/python2.7/dist-packages/ansible/inventory/__init__.py", line 106, in __init__
    self.parser = InventoryParser(filename=host_list)
  File "/usr/lib/python2.7/dist-packages/ansible/inventory/ini.py", line 41, in __init__
    self._parse()
  File "/usr/lib/python2.7/dist-packages/ansible/inventory/ini.py", line 45, in _parse
    self._parse_base_groups()
  File "/usr/lib/python2.7/dist-packages/ansible/inventory/ini.py", line 83, in _parse_base_groups
    tokens = shlex.split(line)
  File "/usr/lib/python2.7/shlex.py", line 279, in split
    return list(lex)
  File "/usr/lib/python2.7/shlex.py", line 269, in next
    token = self.get_token()
  File "/usr/lib/python2.7/shlex.py", line 96, in get_token
    raw = self.read_token()
  File "/usr/lib/python2.7/shlex.py", line 172, in read_token
    raise ValueError, "No closing quotation"
ValueError: No closing quotation
```

原因は、ec2.py に実行権限を付与していなかったから。

```bash
chmod +x plugins/inventory/ec2.py
```

で解決。
メールや掲示板などのデータをオフラインで扱うためのテクニック

# メールや掲示板などのデータをオフラインで扱うためのテクニック

## 想定読者

スマートフォンアプリやオフラインWebアプリの開発をしている人。

## 背景

スマートフォンアプリには、掲示板やメッセージ機能などが良くあります。ただ、その実装方法は多種多様で、「これが定石」みたいなものはあまりないのではないかと思います。レガシーなWebアプリケーションのように毎回全件を取得するようにするなら、難しい要素はあまりないのですが、スマートフォンアプリで求められる「クライアント側でキャッシュして差分を取得する」「更新確認は短いデータだけで行えるようにする」というような仕様を実現しようとすると、一気に考えることが多くなります。そこで、こうした実装の考え方をまとめることにしました。

## 要件

1. 更新の有無が、短いデータ（カウンタやハッシュ値、最終更新日時等）で確認できるようにしたい。
1. 更新があった際、最小限のデータのみをやりとりするようにしたい。
2. 過去のデータは、クライアントでキャッシュするが任意のタイミングでキャッシュクリアしてもデータの矛盾がないようにしたい。
3. twitterライクなページネーションができる。つまり、最初に最新の10件のみ取って、その後は次の10件というように取得できるようにしたい。

## 解決策

以下のようにすることで上記のすべての要件を満たす仕組みを作ることができます。

1. 各掲示板（あるいはメールボックス）は、「現在ストレージに存在するデータは、少なくともXまでは正当である」ということを意味する更新IDを持つ(currentIdとする）。
2. 更新IDの実装として、汎用的に安全に使えるのはインクリメンタルカウンタである。ただし、タイムスタンプの解像度が十分であり、タイムスタンプと実際の更新の順序性が一致していることが保証できるのなら、
更新IDの実装としてタイムスタンプを使うこともできる。MySQL >=5.6や、多くのRDMSではこの条件が成り立っていると思われるが、動作が実装依存になる（仕様上は保証されない）上、パフォーマンス的に有利というわけでもなさそう。
3. エントリーの作成、更新、削除の際には、currentIDを、エントリーのupdateIdにセットする。
エントリーが作成されたときはcurrentIdをエントリーのcreateIdにもセットする。
また、エントリーが削除されたときは、deletedフラグを立て、ストレージからは完全に削除しない。
4. クライアントは、現在キャッシュしているデータが、どのカウンタ値まで保証されているか(ensuredId)を保持する。
更新確認のためには、この値と、サーバ側のカウンタ値を比較して、
データが最新かどうかが確認する。
5. クライアントは現在キャッシュしているデータのcreateIdのうちもっと古いIdをoldestIdとする。
クライアントが、過去のデータを取得するときは、「createId < oldestId　&& !deleted」のエントリを取得する。
この際、クライアント側は、ensuredIdの更新をしない。
6. キャッシュしたデータを更新するときは、「updateIdがensuredId以降のもの」を削除エントリーを含めて取得し、
それを使ってキャッシュの全体を更新する。
この際、クライアント側は、サーバ側から送られたcurrentIdでensuredIdを更新する。


## 実装例

上記の仕組みを実装するに当たって重要なのは、上記の1番に書いたcurrentIdの特徴「現在ストレージに存在するデータは、少なくともcurrentIdまでは正当である」をいかに満たすかということです。

これを実現するために一番簡単なのは、RDMSのトランザクション機能を使って、currentIdの変更と、エントリーの変更をアトミックに行うということでしょう。このため、この記事ではRDMSであるMySQLを使って説明します。

### HTTP API

```
post /:boardId
put /:boardId/createId
delete /:boardId/createId
get /:boardId/ #currentIDを取得する
get /:boardId/list
get /:boardId/list/:createdBefore
get /:boardId/update/:updatedAfter
```

### データベーススキーマ

```sql
create table boardUpdate(
	boardId int,  /* 掲示板やメールボックスを識別するためのID */
	currentId int/* カウンタ */
)

create table boa	rdEntry(
	boardId int,  /* 掲示板やメールボックスを識別するためのID */
	createId int, /* 作成したときのcurrentId */
	updateId int, /* 更新したときのcurrentId */
	deleted bool /* 削除フラグ */
)
```

### 更新系SQL

```sql
start transaction;

select @currentId := currentID + 1 from boardUpdate where boardId = @boardId for update;

/*ここで @currentIdを使って、boardEntryに対する処理を行う */

update boardUpdate set currentId = @currentId where boardId = @boardId;

commit;
```

最初のSELECTでFOR UPDATEを指定し、行ロックをかけているのがポイント。

カウンタの代わりに、タイムスタンプを使うと、最初のSELECTと行ロックが不要になりそうです。しかし、タイムスタンプ生成→更新の順序性を保証するためには、結局、行ロックをかけないといけないので、この方針で行く限りパフォーマンス上有利にならないのです。

### パフォーマンス問題

上記のMySQLでの実装は、「慎重過ぎる」実装です。というのも、「現在ストレージに存在するデータは、少なくともcurrentIdまでは正当である」を保証するためには、更新処理全体がアトミックである必要はないからです。つまり、カウンタの更新は、エントリの更新よりも遅れる分にはかまわないのですのですが、上記の実装ではこれを完全に一致させてしまっています。そして、その分ロック時間が長くなり、負荷耐性が低くなっていることになります。

たとえば、上記のSQLをストアドプロシージャーを使わないで実行した場合、SELECTからCOMMITまで、3クエリのRTT分だけロックがかかることになるので、特定のメッセージボックス・掲示板への書き込み可能数が、1秒間に100件のオーダーを上回るようにするのは難しいでしょう。

これを解決するには、MongoDBのようにアトミックな操作ができるKVSを使うのが良さそうです。若干トリッキーな処理が必要ですが、トランザクション処理が必要ないので、パフォーマンス的に有利です。関心が高いようなら別記事で書きます。
Integer#downtoの引数にブロックを渡す際の{...}とdo...endの挙動の違い

メソッドにブロックを渡すときの、`{...}`と`do...end`の挙動の違いについてまとめてみた。

## downtoメソッドの引数に数値のみ渡す
ブロックを渡さなければ括弧を明示していても、省略しても同じ。

```rb:括弧を明示
pry(main)> 3.downto(0)
=> #<Enumerator: ...>
```
```rb:括弧を省略
pry(main)> 3.downto 0
=> #<Enumerator: ...>
```

## downtoメソッドの引数に数値とブロックを渡す
ブロックを渡すと括弧を明示しているか、省略しているかで結果が変わる。
以下④では、括弧を省略して`{...}`でdowntoメソッドにブロックを渡そうとしているが文法エラーになっている。
`{...}`の方が`do...end`より結合度が強い。
そのため④では0に対してブロックを渡すことになってしまい、エラーが出ている。

```rb:①括弧を明示+{...}
pry(main)> 3.downto(0) {|i| puts i}
3
2
1
0
=> 3
```

```rb:②括弧を明示+do…end
pry(main)> 3.downto(0) do |i| puts i end
3
2
1
0
=> 3
```

```rb:③括弧を省略+do…end
pry(main)> 3.downto 0 do |i| puts i end
3
2
1
0
=> 3
```

```rb:④括弧を省略+{…}
pry(main)> 3.downto 0 {|i| puts i}
SyntaxError: unexpected '{', expecting end-of-input
3.downto 0 {|i| puts i}
            ^
```

## 参考リンク
### instance method Integer#downto(英語)
http://www.ruby-doc.org/core-2.1.5/Integer.html#method-i-downto

```
downto(limit) {|i| block } → self 
downto(limit) → an_enumerator
```

Iterates the given block, passing decreasing values from int down to and including limit.
If no block is given, an Enumerator is returned instead.

```ruby:downto
5.downto(1) { |n| print n, ".. " }
print "  Liftoff!\n"
#=> "5.. 4.. 3.. 2.. 1..   Liftoff!"
```

### instance method Integer#downto(日本語)
http://docs.ruby-lang.org/ja/2.1.0/method/Integer/i/downto.html

```
downto(min) {|n| ... } -> self
downto(min) -> Enumerator
```

self から min まで 1 ずつ減らしながらブロックを繰り返し実行します。 self < min であれば何もしません。

```
[PARAM] min:
数値
[RETURN]
self を返します。
[SEE_ALSO] Integer#upto, Numeric#step, Integer#times
```

### [ブロックをdo…endで書くか{…}で書くかにより挙動が変わる例](http://qiita.com/riocampos/items/43e4431ddff93e01a18d)
詳しくまとまっているので、挙動の違いの詳細についてはこちらを見た方がよいです


## 参考にしたツイート
以下のツイートにインスパイアされて記事を書きました。
参考： [武田哲也さんのRuby技術者認定試験受験記](http://togetter.com/li/769555)

<blockquote class="twitter-tweet" data-conversation="none" lang="ja"><p><a href="https://twitter.com/hashtag/RubyGold?src=hash">#RubyGold</a>&#10;結合順のやつ。最後のだけ文法エラーになる。&#10;3.downto(0) {|i| puts i}&#10;3.downto(0) do |i| puts i end&#10;3.downto 0 do |i| puts i end&#10;3.downto 0 {|i| puts i}</p>&mdash; 武田哲也 (@__takeda) <a href="https://twitter.com/__takeda/status/554076914323701760">2015, 1月 11</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
swiftで定義するperl風な配列操作

結論から言って、[[Swift]extensionで実装するPerl風の配列操作](http://qiita.com/worthmine/items/40bfdd8f1f75bfe3463a#comment-bbd561b9e5109a21b94f)の方が十分に実用的な記事です。

[やっぱりSwift : 配列 #3 : 要素の型の混ざった配列は作れるか?](http://matome.naver.jp/odai/2140361804868291701)には
>Swiftの配列の宣言で作ったにもかかわらず、Foundationフレームワークの配列が作られていました。

とありましたが、[Swiftに関するメモ その7 - 型変換](http://qiita.com/takkyun/items/41a04f37132dbb025c1b) を参考に定義しなおしてみると、pure Swiftで（```import Foundation```することなしに）要素の型が混ざった配列を定義することに成功しました。

なお、私の目的はそもそもperl風に配列を扱えるようにできないかどうかでしたのでPerlで頻出の```pop(),push(),shift(),unshift()```のみを実装しています。```splice```は標準で搭載されているようですので書いてません。


```ArrayLikePerl.swift
class ArrayLikePerl {
    var value: [Any] = []

    init(_ array :[Any] = []){
        value = array
    }

    func count()->Int {
        return self.value.count
    }
    
    func pop() -> Any? {
        if self.count() == 0 { return nil }
        let removed: Any? = self.value.removeAtIndex(self.value.endIndex.predecessor())
        return removed
    }
    
    func push(value: Any?...) -> Any? {
        for v in value {
            self.value.insert(v, atIndex: self.value.endIndex)
        }
        return value
    }
    
    func shift() -> Any? {
        if self.count() == 0 { return nil }
        let removed: Any? = self.value.removeAtIndex(self.value.startIndex)
        return removed
    }
    
    func unshift(value: Any?...) -> Any? {
        for v in value.reverse() {
            self.value.insert(v, atIndex: self.value.startIndex)
        }
        return value
    }
}
```

下記のような扱い方が可能です

```
class hoge {}
let c = hoge()
var b :ArrayLikePerl = ArrayLikePerl(["String", 1, c]) // 初期値を与える。混入可能
b.count()               // 3
b.unshift("one", "two") // 配列の挿入
b.unshift("zero")       // 1要素の挿入
b.value
b.count()               // 6
b.push("push", "push2") // 配列の追加
b.push("push3")         // 1要素の追加
b.value[3]              // “String”
b.value
b.count()               // 9 増えてる
b.shift()               // {{Some “zero" }} 配列の先頭を取り出す
b.pop()                 // {{Some “push3”}} 配列の末尾を切り取る
b.count()               // 7 減ってる
```

続きはこちら [[Swift]extensionで実装するPerl風の配列操作](http://qiita.com/worthmine/items/40bfdd8f1f75bfe3463a#comment-bbd561b9e5109a21b94f)
Prologサーバで事実を動的に追加・削除する

## はじめに
前回，[PrologでNoSQLなサーバ](http://qiita.com/GRGSIBERIA/items/8e8142ea0dbb92b89bef)を立てました．ソースコード中に適当な事実を幾つか定義しておいて，TCP通信で投げた質問から結果を返すようなことをやりました．これにより，データベースを簡単に作ることができ，なおかつ簡単にその結果を受け取ることができるようになりました．

一方で，現在の方法では，事実をあらかじめソースコード中に書いておかなければなりません．そのため，静的な情報しか扱えず，動的にデータの追加や削除が難しい問題がありました．

今回の記事では，Prologサーバでデータの追加や削除ができるようになるな規則を作ります．動的に事実の追加・削除ができるようになることで，一般的なデータベースと同じように扱えるようになることを目指します．

## Prologでの追加と削除
サーバ側の実装は[前回の記事](http://qiita.com/GRGSIBERIA/items/8e8142ea0dbb92b89bef)を参考にしてください．クライアント側の実装も同じです．

Prologで事実を追加できるようにするためには，dynamic関数によって特定の述語が追加可能であることを指定します．

```prolog:test.pro
:- dynamic(tag/2).
```

例えば，上記のソースコードだと，引数が2つ存在する述語tagを，dynamicにする，という意味になります．

とりあえず，上記の状態でプログラムだけ起動して，以下のような質問を投げてみてください．

```prolog:test.pro
1 ?- tag(X, Y).
false,

2 ?- assertz(tag(oppai, yamada)).
true.

3 ?- tag(X, Y).
X = oppai.
Y = yamada.
```

最初，何もない状態なので，推論しても失敗していますが，2つ目の質問でasserta関数を使うことで，述語tagの事実を追加しています．そして，3つ目の質問で，追加できているかどうか確認しています．

例えば，サーバ側の実装で，以下のような述語を定義すると，面白いかもしれません．

```prolog:test.pro
% ここから上はサーバのソースコード

:- dynamic(tag/2).

add(TagName, PicName) :-
  assertz(tag(TagName, PicName)).
```

これで，タグを追加するためのクエリが発行できるようになります．

これだけだと，タグを追加するだけの人生になってしまいますので，タグを削除するような規則も作っておきます．

```prolog:test.pro

:- dynamic(tag/2).

add(TagName, PicName) :-
  assertz(tag(TagName, PicName)).

remove(TagName, PicName) :-
	retract(tag(TagName, PicName)).

truncate(_) :-
	retractall(tag(_, _)).
```

これで，登録した事実を削除することもできるようになりました．

例えば，この状態でクライアントを立ち上げて以下を入力すると，ちゃんと登録されているかどうか確認することができます．

```prolog
add(oppai, yamada).
add(buikini, yamada).
tag(X, Y).
```

## おわりに
今回の記事で，Prologサーバに動的に事実を追加したり削除したりする機能を実装してみました．これで少しはPrologサーバがより実用的になったのではないかと思います．

ただ，問題があるとすれば，ログとかそういうのは全く取っていないので，サーバがシャットダウンされると，せっかく登録した内容が削除されてしまうことでしょうか．この辺りは，事実を追加するついでに，ログを記録しておくようなコードを書けば実現できそうな気がします．今後の課題ですね．

ログそのものがPrologのソースコードだったりすれば，これもまた面白いんじゃないかなと思います．さしずめバックアップを取っておけるオンメモリ型のNoSQLでしょうか？　案外，頑張っておけば実用化可能になるんじゃないでしょうか．

というわけで，今回の記事はこれで終わりにしておきます．
Android 5.0/Lollipopでインターネット接続していないWi-Fiポインタに接続する

Android 5.0/Lollipopの新機能によって、インターネット接続していないWi-Fiポインタに接続しても、モバイルデータ通信に切り替わってしまうようになりました。
→参考：[Android 5.0（Lollipop）の機能紹介 : Wi-Fiでインターネットにアクセスできない場合はモバイルデータ通信に自動的に切り替える機能が追加 ｜ ガジェット通信](http://getnews.jp/archives/685034)

# やりかた

以下のようにすることで、インターネット接続していないWi-Fiポインタに接続することができます。

```java
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
Network[] allNetwork = cm.getAllNetworks();
SocketFactory socketFactory = SocketFactory.getDefault();
for (Network network : allNetwork) {
	NetworkCapabilities networkCapabilities = cm.getNetworkCapabilities(network);
	if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
		// SocketFactoryの取得
		socketFactory = network.getSocketFactory();
	}
}
// Socketの生成
Socket socket = socketFactory.createSocket(IP_ADDRESS, PORT);
```

* * *

# ちなみに
以下の方法でも接続できますが、`requestNetwork`を実行するために`CHANGE_NETWORK_STATE`のパーミッションが必要となります。
→参考：[Android 5.0 APIs | Android Developers](https://developer.android.com/about/versions/android-5.0.html#Wireless)

```java
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkRequest.Builder builder = new NetworkRequest.Builder();
builder.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED);
builder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
connectivityManager.requestNetwork(builder.build(), new ConnectivityManager.NetworkCallback() {
	@Override
	public void onAvailable(Network network) {
		// 接続されたときに呼ばれる
		super.onAvailable(network);
		// SocketFactoryの取得
		SocketFactory socketFactory = socketFactory = network.getSocketFactory();
		// Socketの生成
		Socket socket = socketFactory.createSocket(IP_ADDRESS, PORT);
	}

	@Override
	public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) {
		super.onCapabilitiesChanged(network, networkCapabilities);
	}

	@Override
	public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) {
		super.onLinkPropertiesChanged(network, linkProperties);
	}

	@Override
	public void onLosing(Network network, int maxMsToLive) {
		super.onLosing(network, maxMsToLive);
	}

	@Override
	public void onLost(Network network) {
		super.onLost(network);
	}
});
```
homebrew の PostgreSQL を 9.1 から 9.3 にアップグレードして Rails アプリを動かすまでにしたこと

タイトル通り homebrew の PostgreSQL を 9.1 から 9.3 にアップグレードして Rails アプリを動かすまでにしたことの備忘録。

## PostgreSQL のアップグレード

[HomebrewでPostgresql9.1から9.3へアップデート](http://qiita.com/comeonly/items/d7861c99c80eb7c9094c)

PostgreSQL については、こちらの記事を見つつ対応しました。`homebrew-versions` は使っておらず、以下が実際に行った内容です。

```bash
$ brew update
$ brew upgrade postgresql
$ launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
$ mv /usr/local/var/postgres /usr/local/var/postgres91
$ initdb /usr/local/var/postgres -E utf8

# path についてはお使いの環境ごとに変更します
$ pg_upgrade \
  -b /Users/user_name/.homebrew/Cellar/postgresql/9.1.4/bin \
  -B /Users/user_name/.homebrew/Cellar/postgresql/9.3.5_1/bin \
  -d /usr/local/var/postgres91 \
  -D /usr/local/var/postgres

# homebrew.mxcl.postgresql.plist の内容をカスタムしていたので差分を確認して編集した
$ vimdiff /Users/t-matsubara/.homebrew/opt/postgresql/homebrew.mxcl.postgresql.plist ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

$ launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

# 動作確認
$ psql postgres
psql (9.3.5)
```

`brew upgrade postgres` したときに表示された `analyze_new_cluster.sh` と `delete_old_cluster.sh` は実行していないです。動かしてないですが今のところ困っていることはないです。

## Rails アプリで `pg` gem 再インストール

私の環境では `pg` が原因で、rails アプリが起動しなくなったので gem の削除、再インストールをします。

```bash
$ bundle exec gem uninstall pg
Successfully uninstalled pg-0.15.1
ERROR:  While executing gem ... (NoMethodError)
    undefined method `delete' for #<Bundler::SpecSet:0x007fb2821196d0>
$ bundle install
```

これをしないと `rails s` したときに以下のエラーが発生した。PostgreSQL 9.1.4 が依存していた `libpq.5.4.dylib` がアップグレードでなくなったことが原因。これを直すために、`pg` gem を再インストールした。

```
/project/vendor/bundle/ruby/2.1.0/gems/pg-0.15.1/lib/pg.rb:4:in `require': dlopen(/project/vendor/bundle/ruby/2.1.0/extensions/x86_64-darwin-13/2.1.0-static/pg-0.15.1/pg_ext.bundle, 9): Library not loaded: ~/.homebrew/lib/libpq.5.4.dylib (LoadError)
  Referenced from: /project/vendor/bundle/ruby/2.1.0/extensions/x86_64-darwin-13/2.1.0-static/pg-0.15.1/pg_ext.bundle
  Reason: image not found - /project/vendor/bundle/ruby/2.1.0/extensions/x86_64-darwin-13/2.1.0-static/pg-0.15.1/pg_ext.bundle
  from /project/vendor/bundle/ruby/2.1.0/gems/pg-0.15.1/lib/pg.rb:4:in `<top (required)>'
```

`install_name_tool` を使うことでも直ったのだけど、たぶん再インストールした方が安全そうです。
あと PostgreSQL 9.3 の方だと、libpq.5.dylib が libpq.5.6.dylib を参照する symlink として作られていたので、もしかすると次バージョンアップするときは勝手に symlink の向き先が変わって大丈夫なのかも？調べておらず分かっていないですが。


## Resources

- [HomebrewでPostgresql9.1から9.3へアップデート](http://qiita.com/comeonly/items/d7861c99c80eb7c9094c)
- [Upgrading PostgreSQL 9.2 to 9.3 with Homebrew](http://blog.55minutes.com/2013/09/postgresql-93-brew-upgrade/)
Swiftでインスタンスがそのクラスであるか確認する


Objective-Cでいうところの`isMemberOfClass:`

```swift

class Test {
}

class Test2: Test {
}


let t = Test2()

t.dynamicType === NSObject.self	// false
t.dynamicType === Test.self		// false
t.dynamicType === Test2.self	// true

```
リモートサーバの出力をクリップボードにコピーしてくれるRubyサーバを立てる


よくtmux on tmuxで作業をするんだけどリモートのコマンド出力をローカルにコピーするときに割と面倒くさい。

[ssh接続したリモートサーバの出力を手元Macのクリップボードに送る - Glide Note - グライドノート](http://blog.glidenote.com/blog/2014/02/22/remote-pbcopy/) を使おうかと思ったけどできればLaunchAgentを使いたくなかったのでRubyで簡単なサーバを書いた。

```ruby
#!/usr/bin/env ruby

require 'socket'
require 'terminal-notifier'

server = TCPServer.open('localhost', 2224)

loop do
  socket = server.accept
  buffer = socket.read
  IO.popen('pbcopy', 'w') { |f| f << buffer }
  TerminalNotifier.notify(buffer, :title => 'Called Pbcopy')
  socket.close
end

server.close
```

これを起動しておいて（自分はgodでプロセス管理することにした） `echo 'hoge' | nc localhost 2224` って打ってクリップボードにhogeがコピーされたら成功

あとはSSH先からトンネリングするように `~/.ssh/config` に設定を追記しておいて、SSH先からncで叩けるようにして完成。

```
Host *
  RemoteForward 2224 localhost:2224
```
tcpdump で Redis との通信をのぞく

環境はローカルで起動している Redis を対象としています

```bash
$ sudo tcpdump -i lo -n -s0 -A dst port 6379
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 65535 bytes
20:30:09.851425 IP 127.0.0.1.43933 > 127.0.0.1.6379: Flags [P.], seq 3011382500:3011382541, ack 2674910830, win 1452, options [nop,nop,TS val 757280422 ecr 757279172], length 41
E..]..@.@................~...o.n.....Q.....
-#..-#).*2
$4
LPOP
$20
resque:queue:message

20:30:09.851491 IP 127.0.0.1.43933 > 127.0.0.1.6379: Flags [.], ack 6, win 1452, options [nop,nop,TS val 757280422 ecr 757280422], length 0
E..4..@.@................~^M^M.o.s.....(.....
-#..-#..
20:30:10.418119 IP 127.0.0.1.34696 > 127.0.0.1.6379: Flags [S], seq 2124522743, win 43690, options [mss 65495,sackOK,TS val 757280563 ecr 0,nop,wscale 7], length 0
E..<..@.@...............~............0.........
-#/3........
20:30:10.418139 IP 127.0.0.1.34696 > 127.0.0.1.6379: Flags [.], ack 1279911756, win 342, options [nop,nop,TS val 757280563 ecr 757280563], length 0
E..4..@.@...............~...LI.L...V.(.....
-#/3-#/3
20:30:10.418202 IP 127.0.0.1.34696 > 127.0.0.1.6379: Flags [P.], seq 0:26, ack 1, win 342, options [nop,nop,TS val 757280563 ecr 757280563], length 26
E..N..@.@...............~...LI.L...V.B.....
-#/3-#/3*2
$6
client
$4
list
```

こんな感じで、どんなコマンド発行してるか確認できる
GoogleApiClient

## GoogleApiClient とは
Googleが提供しているサービスに対して、接続するためのクライアント
接続例としては、Wearable, Location, Drive, Recognizationなど

生成されたインスタンスをそれぞれのAPIクラスに渡す。
例）
<pre>
LocationServices.FusedLocationApi.requestLocationUpdates(mLocationClient, mLocationRequest, this);
</pre>

##
build.gradle で dependencies を追加する
<pre>
depandencies {
  compile 'com.google.android.gms:play-services:6.1.+'
}
</pre>

## GoogleApiClient のインスタンス生成方法

インスタンスの生成は下記の通り
<pre>
new GoogleApiClient.Builder(Context)
.addApi(API)
.addConnectionCallbacks(ConnectionCallbacks)
.addOnConnectioNFailedListener(OnConnectionFailedListener)
.build();
</pre>

## GoogleApiClient の接続

<pre>
mGoogleApiClient.connect();
</pre>

### 注意点

事前に下記のコードで false であることを確認すること
<pre>
mGoogleApiClient.isConencted()
</pre> 

## GoogleApiClient の結果受け取り
実装するインターフェースは下記の２種類
・GoogleApiClient.ConnectionCallbacks
・GoogleApiClient.OnConnectionFailedListener

<pre>
@Override
public void onConnected(Bundle bundle) {
  // GoogleApiClient の接続に成功した場合に呼ばれる
}

@Override
public void onConnectionSuspended(int i) {
  // GoogleApiClient 　の接続が中断された場合に呼ばれる
  // i は GoogleApiClient.ConnectionCallbacks.CAUSE_NETWORK_LOST
  //      GoogleApiClient.ConnectionCallbacks.CAUSE_SERVICE_DISCONNECTED
}

@Override
public void onConnectionFailed(ConnectionResult result) {
  // GoogleApiClient の接続に失敗した場合に呼ばれる
  // result.getErrorCode() でエラー詳細が取得可能
}
</pre>

## GoogleApiClient の切断
<pre>
mGoogleApiClient.disconnect();
</pre>
Railsのルーティングでparams[:id]かparams[:xxx_id]か

# 超絶小ネタ

ルーティングを追加するとき、

```rb:config/routes.rb
resources :hoges do
  get 'download'
end
```

とやると、

rake routesの結果は、

```text
hoge_download GET    /hoges/:hoge_id/download(.:format) hoges#download
```

というルーティングになる。`params[:id]` ではなく `params[:hoge_id]` にマッピングされることに注意。

これを `params[:id]` にマッピングしたいとき、

```rb:config/routes.rb
resources :hoges do
  get 'download', on: :member
end
```

と、オプションをつけてやると、

```text
download_hoge GET    /hoges/:id/download(.:format) hoges#download
```

となり、意図したルーティングになる。xxx_path も名前が違う。
node.jsでメール送信機能

##nodemailerを使用

とりあえず、nodemailerのインストール。
$ npm install nodemailer

今回は、routesディレクトリ以下のuser.js(任意)にメール送信のコードを記述

```js:user.js

exprorts.mail = function(req,res){
  var nodemailer = require('nodemailer');
  var transport = nodemailer.createTransport();
　   ・
　   ・
　   ・
  transport.sendMai({
    from : 'hoge1',
    to   : 'fuga1',
    cc   : 'hoge2',
    subject : 'huga2',
    text :  "hogehoge"
  });

```

node.jsはこれだけでOK.
※kobito for windowsで編集してみる。