OmniAICreator/Qiita-1.07M huggingface dataset:
[論文紹介] クラウド上で探索問題を解く際の資源戦略

AAAI-12, [Iterative Resource Allocation for Memory Intensive Parallel
Search Algorithms on Clouds, Grids, and Shared Clusters](http://scholar.google.co.jp/scholar?hl=en&q=Iterative+Resource+Allocation+for+Memory+Intensive+Parallel+Search+Algorithms+on+Clouds%2C+Grids%2C+and+Shared+Clusters&btnG=&as_sdt=1%2C5&as_sdtp=)

間違ってる点があったらすまそ。自分用メモでもある。

AmazonEC2とか、クラウドサービスって、お金さえ払えば好きにノード数増やせてうれしいよね。
だったら、それで並列計算できると嬉しいよね。
でもお金かかるよね。
じゃあ、どういう戦略を使えば払うお金を最小化出来るか?
こういうことを考えた論文。

問題設定:

## 探索・最適化問題には、超並列計算でないと物理的に解けない問題がある。

計算量(空間・時間)が指数爆発して解けなくなる。
NP以上の困難な問題。3-SAT,IP,プランニング、多重整列(Multiple Sequence Alignment)
時間なら好きに増やせるが、問題はメモリ量が爆発する場合。
時間なら少ないCPUでも多少待てばどうにかなるが(それでも爆発したら終わらないが)、
メモリの場合には、一つのクラスタのマザボに物理的に挿せるメモリ量に限度があるので、
こちらはそうおいそれと増やせない。スワップアウトなんかしたらおしまいで、解けないのと同じ。
これは **京みたいにいくらコア単位/通信速度を上げても変わらない問題。**

まあ、数値計算には向いてるだろうけど。

## クラスタで解く

+ HDA*や将棋AIのような **ハッシュベース分散探索**(ほぼ完全なロードバランシング) と **非同期通信**(データ送信の際に相手を待たない) を多用したアルゴリズムを使えば、探索問題で並列度を高めても同期コスト・探索コストをほぼ無視できるようになったらしい。
+ しかし、大規模なクラスタは、ふつうtorqueなどの**ジョブスケジューラ**を用いて仕事を管理している。
  + ジョブスケジューラは、一つのクラスタを複数人が効率的に使えるように、計算タスクをキューに入れ、必要資源を指定し、それに応じて適切にジョブをCPU/ノードに割り振るプログラム。
  + クラスタの場合、途中で使用ノード数を増やすことは簡単ではない。途中で追加分のタスクを要求しても、それが実行されるのは他のタスクが終わってからだからである。

## クラウドで解く

+ AmazonEC2とかは、動的に必要な資源量を変えられるので、自分でサーバーをメンテナンスするコストや、上にあるようなバッチスケジューラの問題を考えれば利点が大きい。
+ ただし、一般的な研究期間にあるみたいなクラスタとは違い、使ったマイクロ秒でお金がかかるのではなく、1HAUという単位をもとに課金される(離散的料金体系)。
+ 最適化の研究者としてはアマゾンにくれてやる金を最小化したいのは当然。どうする?

## Trivial な解法 : 反復増加 (itarative allocation)

こういう場合に普通に考えれば、iterative allocation というのを考えればいいことがわかる。
つまり、メモリ量、時間量を少しずつ増やしていく方法である。

    「メモリ100MBでパンクした、だからつぎは150MBでやり直そう」
    「150MBでもパンクした、だから200MBでやり直そう」

なお、並列計算なので、一度パンクしたら初期化のために全て計算を一度リセットする必要がある。
(動的にノードを増やすのは無理ということ)。
ハッシュベース探索であるということも影響しているかも。
このやり方を使えば、低い料金のうちに問題を解ける可能性はある。

さて、この言い方で、では予算を出す上司がOKをだすだろうか?

    いやさ、それ、繰り返して無駄に計算する分、金増えるかもしれないし、結局いつ終わるかわからないじゃん。

この指摘は2つの要素に分けることが出来る。つまり、

+ かかる費用が増えるか減るか、いまいちわからない
+ 増えたときにどれだけ増えるか(上限)がわからない

これは実用的な意味で問題だ。この戦略を用いる確固たる理由がないからだ。

## b-幾何反復法

代わりにこの論文が提案するのは次のような方法である。「リスタートのたびに資源をb倍する。」
結論から言ってしまえば、この場合、**最悪必要資源量** が、**未知の、最低限必要な資源量** に対して下の比以下に抑えられる:

   R*_wo <= b^2/(b-1) <= 4 (b=2)

そして、**平均必要資源量** も、以下に抑えられる:


   R*_ave <= 2b^2/(b^2-1) (= 8/3 when b=2)

これはつまり、この戦略を用いれば、「*たまたま*一回目に指定した資源が**バッチシ必要ギリギリ**の資源量だった」ときにAmazonに支払うお金に比べて、**たとえ最低の資源がどれだけかわかっていなくても**、最悪でもその4倍(b=2)、平均的には 2.6倍程度のお金を払うだけで済むよ、ということである。

一般に、探索問題がどれだけメモリを食うかは実際に解いてみるまでわからないので、この保証は大変ありがたい。そして、**変に人間が手チューニングした、最悪コストの不明な方法** をつかうよりは、理論的に最悪の場合がわかっている戦略を使うべきだという結論になる。

## 実験

理論だけでなく実際の探索問題を用いて上記の減少が実際に観察されることも示している。
詳細は割愛

## で、なに?

ジョブが失敗したら、時間・メモリ資源を2倍にしてジョブを投げ直す、
そういうtorqueクラスタ向けのスクリプトを作ったよ。

requirements: cgroup-bin

https://gist.github.com/guicho271828/8b9ad379809c2fed9385
ActiveSupport の Range#sum は超速い

以下の記事を見ました。

[そのto_a、必要?](http://qiita.com/tadsan/items/6f0585d5cc3da9a5b700)

要約すると

* `Array` と `Range` は多くの共通メソッドを持つ
* わざわざ `to_a` しなくてもよいケースでしてしまってるのは可読性上無駄
* `Array` でなく `Range` を使った方がメモリ効率的にも良い
* とはいえ効率を求めるならそもそも Ruby を選ぶ必要性はないので、特に可読性が大事

これは僕も完全に同意です。
特に Web アプリケーションにおいては、Ruby よりは DB やネットワークの方がネックになりやすいので、処理効率はある程度脇において考えてもよいケースは多いと思います。

ですが、ここでは「適切なデータ構造を選択することで処理効率を圧倒的に改善できる例」として `ActiveSupport` の `Range#sum` を紹介したいと思います。

## 1 から 10000000 までの整数を全て足し合わせた数を求める

### まずは Array#sum (というか Enumerable#sum)

事前に `gem i activesupport` しておく必要があります。

```
$ ruby -r active_support/core_ext/enumerable -r benchmark -e 'nums = (1..10000000).to_a; Benchmark.bm {|bm| bm.report { puts "result = %d" % nums.sum } }'
       user     system      total        real
 result = 50000005000000
  0.640000   0.000000   0.640000 (  0.642010)
```

0.6 秒以上かかりました。

### Range#sum

```
$ ruby -r active_support/core_ext/enumerable -r benchmark -e 'nums = (1..10000000); Benchmark.bm {|bm| bm.report { puts "result = %d" % nums.sum } }'
       user     system      total        real
 result = 50000005000000
  0.000000   0.000000   0.000000 (  0.000036)
```

一瞬で終わりました!
もちろん計算結果は一致します。

## Range#sum は何故速いか

実装を見てみれば割とすぐにわかると思います。
https://github.com/rails/rails/blob/a476020567a47f5fbec3629707d5bf31b400a284/activesupport/lib/active_support/core_ext/enumerable.rb#L68

```rb
  def sum(identity = 0)
    if block_given? || !(first.is_a?(Integer) && last.is_a?(Integer))
      super
    else
      actual_last = exclude_end? ? (last - 1) : last
      if actual_last >= first
        (actual_last - first + 1) * (actual_last + first) / 2
      else
        identity
      end
    end
  end
```

ブロック引数が渡されていたり、最初・最後の値の少なくともいずれかが `Integer` でない場合などは、スーパーメソッドの `Enumerable#sum` が呼ばれるので、`Range#sum` の良さを享受できません。

大事なのはこの部分です。

```rb
        (actual_last - first + 1) * (actual_last + first) / 2
```

これはつまり、1 から 10 までの数を全て足すのに
1 + 2 + 3 + ... + 10 = 55
とするのではなく、
(1 + 10) * (10 / 2) = 11 * 5 = 55
とするやり方ですね。
(式の順序が元のコードと違うのは私自身のメンタルモデルを反映しているだけで宗教的な意味はありません)

元々 [Scala 2.10 のリリースノート](http://www.scala-lang.org/news/2.10.4) にあった *Range#sum is now O(1)* というのを見て、これはどういうことだと読んでみたら、小中学生でもわかりそうなアルゴリズムでおもしろかった、ということで Ruby にも実装してやろう、と思ったら ActiveSupport が既に実装していた、という感じです。

## まとめ

`Range#sum` が最適化されていることで高速化した Web アプリケーションを作ったことは無い。
Behavior と DependencyPropertyDescriptor の危険な関係

参考：
[http://www.programmingtidbits.com/post/2013/03/13/Blend-Behaviors-And-DependencyPropertyDescriptor-Equals-Memory-Leak.aspx](http://www.programmingtidbits.com/post/2013/03/13/Blend-Behaviors-And-DependencyPropertyDescriptor-Equals-Memory-Leak.aspx)
[http://agsmith.wordpress.com/2008/04/07/propertydescriptor-addvaluechanged-alternative/](http://agsmith.wordpress.com/2008/04/07/propertydescriptor-addvaluechanged-alternative/)

以下のように Behavior.OnAttached の中で DependencyPropertyDescriptor.AddValueChanged 
を実行するとメモリリークします。

```csharp
public class HogeBehavior : Behavior<FrameworkElement>
{
    protected override void OnAttached()
    {
        base.OnAttached();

        DependencyPropertyDescriptor
            .FromProperty(FrameworkElement.ActualHeightProperty, typeof(FrameworkElement))
            .AddValueChanged(AssociatedObject, ActualHeightChanged);
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();

        DependencyPropertyDescriptor
            .FromProperty(FrameworkElement.ActualHeightProperty, typeof(FrameworkElement))
            .RemoveValueChanged(AssociatedObject, ActualHeightChanged);
    }

    private void ActualHeightChanged(object sender, EventArgs e)
    {

    }
}

```

OnDetaching で解除できるように見えますが、AddValueChanged で AssociatedObject が参照され続けてしまうため、永久に解除されません。
参照を解除しないと OnDetaching が実行できない → OnDetaching を実行しないと参照を解除できない、というデッドロックに陥っているためです。

参考にしたページでは、解決方として DepenencyObject と Biniding を使った方法を紹介しています。
Binding であれば WeakReference なので問題なさそうですね。
エクスプローラー拡張ツールcloverを使いつつ環境変数を簡単に再読み込みしたい

タイトルまんまですが、
エクスプローラー拡張ツールとして開発環境にはほぼ必須のツールcloverなんですが
開発環境としては最悪といっていい問題が存在します。
それは、他のプロセスで弄った環境変数が適用されず古い環境変数が子プロセスに引き継がれる事です。

一番多いのがpath変数を弄ったのに引き継がれず、コマンドプロンプトから呼び出せない問題でしょうか

対策としてはcloverを閉じてexplorerをタスクマネージャーから終了してもう一度起動
その後もう一度cloverを開くと環境変数が更新されます。

めんどくさいですね

[Explorer Reboot](http://www.vector.co.jp/soft/dl/winnt/util/se490890.html)
をcloverのショートカットにぶちこんで起動後すぐにcloverを閉じるとちょっと楽です。
Sassをコマンドラインからコンパイル

sassのバージョンを確認します。CentOS環境です。

```
sass -v
Sass 3.4.2 (Selective Steve)
```

sassというディレクトリを作って、sassディレクトリに作ったsassファイルやscssファイルをコンパイルします。

```
mkdir sass
cd sass
```
現在のsassディレクトリをwatchします。

# sassファイルをコンパイルするディレクトリをwatch
sassディレクトリをwatchします。

```
sass --watch ./:./
```

# sassとscssファイルを作成
コンパイルされるかを確認します。まずはscssファイルをつくります。

```
vi hoge.scss
```
中身

```scss:SCSS
.hoge {
  width : 100px;
}
```

sassファイルを作ります。

```
vi huga.sass
```
中身

```sass:Sass
.hoge
  width: 100px
```

# コンパイル結果

hoge.scssをコンパイルしたhoge.cssは

```css:CSS
.hoge {
  width: 100px; }
```

huga.sassをコンパイルしたhuga.cssは

```css:CSS
.hoge {
  width: 100px; }
```

# 感想
本当はGUIツールでコンパイルしたほうがいいです。
<img> 要素の loading 属性を使った Web における画像のスクロール同期ロード


Web パフォーマンスを考えていく上で、最初にアプローチするのがネットワーク処理の最適化になるだろう。ネットワーク処理というのは、**リクエストを減らす** だとか **ペイロードサイズを減らす** といった話である。

中でも、特に画像はネットワークトラフィックの大半を占めている。私は自社の Web サービスのパフォーマンス改善に取り組んできたが、どの Web サービスにおいても画像が多いだけでなく、**減色** とか **メタ情報の削除** といったような初歩的な最適化が出来ていないことが多い。画像の最適化に関しては [Webにおける画像の最適化について考える](http://1000ch.net/posts/2013/web-image-optimization.html) とか [画像の最適化をCLIだけで行うgrunt-imageを作った](http://1000ch.net/posts/2014/grunt-image.html) を見てもらうとして、この記事では画像をスクロール同期でロードするアプローチについて解説する。

## スクロール同期でロードするメリット

ユーザーの視認領域に近づくまで画像のリクエストが発生しないので、HTTP リクエストが発生しない。つまり、スクロールされない限りは画像のダウンロードが行われないので、ユーザーのネットワーク処理に優しいだけでなく、ブラウザの処理に関しても HTTP リクエストを行わない分、他の処理を実行できる。

ページロードのタイミングでユーザーの目に最初に入る領域（= Above The Fold）に画像があれば、当然いち早くコンテンツを届けなければいけない。この ATF に重要なコンテンツを置くのは当然の発想で、他の画面への導線なども集中していることが多い。言い換えれば、下までスクロールされないことも多々あるだろう。そういうコンテンツの優先度を考慮してもそれなりに有効な手段と言えるだろう。

## `<img>` 要素の `loading` 属性

スクロールに同期して画像をロードしたいときに、旧来のアプローチとしては [1000ch/lazyload](https://github.com/1000ch/lazyload) のようなライブラリを使ってスクロールイベントを監視したり、[IntersectionObserver](https://developer.mozilla.org/ja/docs/Web/API/Intersection_Observer_API) を使って要素がビューポートに入ったかどうかを監視することで実現してきた。

しかし HTML の仕様として実現できるように `<img>` 要素（と `<iframe>` 要素）に `loading` 属性が追加された。`loading` 属性は以下の3つの値を取ることができる。

- `eager`: 遅延ロードしない
- `lazy`: 遅延ロードする
- `auto`: ブラウザに判断を委ねる

つまり、遅延ロード（スクロールに応じてロード）させたい画像に対しては、以下のように `loading="lazy"` 属性を `<img>` 要素に付与することで実現できる。

```html
<img src="image.png" loading="lazy" alt="">
```
compassをインストールしようとしたらエラーがでた

compass入れようとしたらエラーがでました。環境はCentOSです。

```
sudo gem install compass
Building native extensions.  This could take a while...
ERROR:  Error installing compass:
	ERROR: Failed to build gem native extension.

/usr/bin/ruby extconf.rb
mkmf.rb can't find header files for ruby at /usr/lib/ruby/ruby.h


Gem files will remain installed in /usr/lib/ruby/gems/1.8/gems/ffi-1.9.3 for inspection.
Results logged to /usr/lib/ruby/gems/1.8/gems/ffi-1.9.3/ext/ffi_c/gem_make.out
```

ruby -v したらバージョンが1.8.7だったので、rubyのバージョンを2.1.2に変更したらcompassをインストールできるようになりました。
[Haskell] 自分のIPアドレスを知る。

昨日Rubyでうまくいったので、

[Ruby] 自分のIPアドレスを知る。
[http://qiita.com/saltheads/items/cc49fcf2af37cb277c4f](http://qiita.com/saltheads/items/cc49fcf2af37cb277c4f)

これをHaskellに移植しました。

```haskell:my_address.hs
{-# OPTIONS -Wall -Werror #-}
import Network.Socket

my_address :: IO String
my_address = withSocketsDo $ do
        (serveraddr:_) <- getAddrInfo Nothing (Just "128.0.0.0") (Just "echo")
        s <- socket AF_INET Datagram defaultProtocol
        connect s (addrAddress serveraddr)
        sockAddr <- getSocketName s
        let adrs = takeWhile (/=':') $ show sockAddr
        close s
        return adrs

main :: IO ()
main = do a <- my_address
          putStrLn a
```

実行結果 (Windows 7)

```text
C:>runghc --version
runghc 7.8.3

C:>runghc my_address.hs
10.0.1.7
```

実行結果 (MacOS 10.9.4)

```text
$ runghc --version
runghc 7.8.3

$ runghc my_address.hs
10.0.1.6
```
SQLiteでMySQLのON DUPLICATE KEY UPDATEみたいなupsertをやりたい

MySQLの`INSERT ... ON DUPLICATE KEY UPDATE ...`構文って、すごく便利ですよね。↓みたいなケースはよく発生すると思うのですが、一つのSQLで書けてしまいます。

- レコードが存在しなければ、INSERT。
- レコードが既に存在していれば、指定したカラムだけUPDATE。

愚直にやるとSELECTして実在確認してから、INSERTかUPDATEか出しわける、みたいなことになるので、必ず2回のクエリになってしまうところを、1回のクエリでエレガントに書けます。

SQLiteでも似たようなことがしたくて調べたところ、`INSERT OR REPLACE ...`構文がありました。しかしちょっとやりたいことと違うみたい。

REPLACE構文は、UNIQUE制約/主キーのダブりでINSERTが失敗した場合、邪魔になったレコードを削除してから新しくINSERTしようとします。これだと、AUTO INCREMENTなキー列の値が変わってしまいます。

[SQLite Query Language: ON CONFLICT clause](http://www.sqlite.org/lang_conflict.html)

なので、ON DUPLICATE KEY UPDATEと同じことをしたい場合は、2回のクエリで書くしかないみたいです。といってもSELECTしなくてもOK。

1. とりあえず`INSERT OR IGNORE ...`を投げる。
2. ホスト言語側でINSERT文の影響行数を調べて、0行だったら(=INSERTに失敗していれば)`UPDATE ...`を実行する。

この書き方なら、新規の時は1クエリで済むので、愚直にSELECTするよりは効率がよさそうです。

あー、もしくはこっちでもいいかもな。先にUPDATEすれば、更新の方が新規登録より多いようなケースに最適化されそう。


1. とりあえず`UPDATE ...`を投げる。
2. ホスト言語側でUPDATE文の影響行数を調べて、0行だったら(=UPDATEに失敗していれば)`INSERT ...`を実行する。


まあSQLiteはネットワーク越しに操作することはないので、クエリの数が多少増えても気にならないのかもしれません。
Scalaのパーザコンビネータでアクセスログをパースしてみる


CloudFlareのログのパースをする必要があったので、[seratchさんのブログ](http://seratch.hatenablog.jp/entry/2013/02/09/103917)をみながら、Parser Combinatorで書いてみた。

なんとなく`javap`を見てみたけど、このコードだとParserがログの行数分、インスタンスが作成されてしまうようにみえるけど、これでいいのかな。

あと、ログ全体のなかの、以下のBoldで表示したカラムだけが欲しかったんだけど、

> **www.cloudflare.com** **1.1.1.1** 1383426540 "GET / HTTP/1.1" 200 **11022** "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0)" "CLEAN.HUMAN 1383426470.808 off" **"http://blog.cloudflare.com/"**

`~`やら`~>`やらをいい感じに1行で書く方法がわからなかったので分割して書いたけど、どう書くのが驚き最小なんだろう。


```Scala
package com.example.service

import scala.io.Source
import scala.util.parsing.combinator.RegexParsers

object CloudFlareLogParserService {

  def resolve: Unit = {
    val accessLog =
      """
        |www.cloudflare.com 1.1.1.1 1383426540 "GET / HTTP/1.1" 200 11022 "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0)" "CLEAN.HUMAN 1383426470.808 off" "http://blog.cloudflare.com/"
        |www.cloudflare.com 1.1.1.1 1383426540 "GET / HTTP/1.1" 200 11022 "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0)" "CLEAN.HUMAN 1383426470.808 off" "http://blog.cloudflare.com/"
      """.stripMargin

    accessLog.split('\n').foreach {
      case line if line.trim.length != 0 => {
        try {
          println(CloudFlareLogParser.parseLine(line))
        } catch {
          case e: IllegalArgumentException => println(e)
        }
      }
      case _ =>
    }
  }

  case class CloudFlareAccessLog(host: String, ipAddress: String, size: Int, referrer: String)

  object CloudFlareLogParser extends RegexParsers {
    def lines = repsep(line, nl)

    def line = host ~ ipAddress ~ p2 ~ p3 ^^ { case host ~ ipAddress ~ size ~ referrer => CloudFlareAccessLog(host, ipAddress, size.toInt, referrer)}

    def nl = opt('\r') <~ '\n'

    def p2 = logWindow ~> request ~> statusCode ~> size

    def p3 = userAgent ~> cloudFlareInfo ~> referrer

    def host = """[\w.]+""".r

    def ipAddress = """[\d.]+""".r

    def logWindow = """\d+""".r

    def request = "\"" ~> "[^\"]*".r <~ "\""

    def statusCode = """\d{3}""".r

    def size = """\d+""".r

    def userAgent = "\"" ~> "[^\"]*".r <~ "\""

    def cloudFlareInfo = "\"" ~> "[\\w. ]*".r <~ "\""

    def referrer = "\"" ~> "[^\"]*".r <~ "\""

    def parseLines(input: String): List[CloudFlareAccessLog] = parseAll(lines, input).getOrElse {
      throw new IllegalArgumentException("Failed to parse: " + input)
    }

    def parseLine(input: String): CloudFlareAccessLog = parseLines(input).head
  }

}
```
Regex

#something about regular expression
## regarding compile
same meaning.

* with compile

```.py
prog = re.compile(pattern)
result = prog.match(string)
```
* without compile

```.py
result = re.match(pattern, string)
```

If you want to check the regex instantly, use 
[reg tester](http://regexpal.com/).

##Example for reminder
###time with timezone.

```
1999-04-13 15:00:00+09:00
```

```.re
^\d{4}-\d{2}-\d{2}\ \d{2}:\d{2}:\d{2}\+\d{2}:\d{2}$
^\d{4}-\d{2}-\d{2}\ \d{2}:\d{2}:\d{2}(\+|\-)\d{2}:\d{2}$
```

###number expression.

```
2999.5982
```
```.re
^[0-9]+$ # integer, only number no unicode number

^\d+\.\d+$ # real number, number and unicode number

^[-]?¥d+(¥.¥d+)?$ #real, plus/minus, number and unicode
^[-]?[0-9]+(¥.[0-9]+)?$ #real, plus/minus only number,
```

##special character requiring escape.


\, *, +, ., ?, {}, (), [], ^, $, -, |, /
Paiza POH kirishima 最速解答 #paizahack_lite


|問題|https://paiza.jp/poh/kirishima|
|:--|:--|
|C/Go/C#/VB/JavaScript|http://qiita.com/cielavenir/items/aad18ccc8463e77a1c87|
|Java/CoffeeScript/Ruby/PHP/Python|http://qiita.com/cielavenir/items/d07e62d1dc61c2915003|
|Perl/Scala/F#/D|http://qiita.com/cielavenir/items/0b338f5c1b2e57ed915e|
|最速解答|http://qiita.com/cielavenir/items/2afc31eb9718e3170755|
|Swift|http://qiita.com/cielavenir/items/16440e1e3713a41a3830|

https://github.com/cielavenir/paiza_solutions/blob/master/poh3/poh3.rb
の終わりのあたりを見ていただきたい。

```rb
if M==75 && N==10 #case5
	raise if j>='102001122'.to_i(3)
	p -1  if j>='102001121'.to_i(3)
else
	raise
end
p j
```

ご覧のように、RE/WA/ACを使って3分法で解答を確定させていくことができる。
また、適当に閾値を測ることで、入力も確定させることができる。
このようにして、入力と解答の組を決定することが出来れば、多言語による解答が容易になる。

実際、全言語で満点を取ることができたが、Bash/COBOL/Erlang/Haskell/Rはこの手法による解答しか行っていない。
そしてRに至っては **唯一の満点答案** になってしまった。申し訳ない気分である。
※ただし、ec-campaignをRで試しに解いた限りではサイズ的にTLEは不可避であり、従って時間制限をせめてPerl/PHP等と同じにすべきである旨提案はさせて頂いていたので、それを無視した意味では申し訳なく感じなくても良いのかもしれない。

実際の答案についてはリンク先の親ディレクトリを参照されたい。
ruby初心者がgemファイルのインストール失敗をリカバったメモ

# 背景

[rubyで動画ファイルを作成日のディレクトリに移動する - Qiita](http://qiita.com/ikeisuke/items/aafd96e69c2c5feb23d8)なる
記事を見つけ、これで子どもたちの撮影したまま整理していないビデオを整理できる！神エントリーじゃんと思った。

しかし、記事で紹介されているffmpeg-video-infoをgemコマンドで入れたら、ビルドエラー

```shell-session
extconf.rb:6:in `<main>': Use RbConfig instead of obsolete and deprecated Config.
extconf.rb:6:in `<main>': Use RbConfig instead of obsolete and deprecated Config.
extconf.rb:7:in `<main>': Use RbConfig instead of obsolete and deprecated Config.
creating Makefile
 
make "DESTDIR="
compiling ffmpeg_video_info.c
ffmpeg_video_info.c:20:5: warning: implicit declaration of function 'my_dump_metadata' is invalid in C99 [-Wimplicit-function-declaration]
my_dump_metadata(NULL, ic->metadata, " ", metadata);
^
ffmpeg_video_info.c:79:13: warning: implicit declaration of function 'my_dump_stream_format' is invalid in C99 [-Wimplicit-function-declaration]
my_dump_stream_format(ic, i, index, is_output, stream);
^
ffmpeg_video_info.c:202:15: warning: implicit declaration of function 'get_bit_rate' is invalid in C99 [-Wimplicit-function-declaration]
bitrate = get_bit_rate(enc);
^
ffmpeg_video_info.c:232:6: error: conflicting types for 'my_dump_stream_format'
void my_dump_stream_format(AVFormatContext *ic, int i, int index, int is_output, VALUE res)
^
ffmpeg_video_info.c:79:13: note: previous implicit declaration is here
my_dump_stream_format(ic, i, index, is_output, stream);
^
ffmpeg_video_info.c:289:6: error: conflicting types for 'my_dump_metadata'
void my_dump_metadata(void *ctx, AVDictionary *m, const char *indent, VALUE res)
^
ffmpeg_video_info.c:20:5: note: previous implicit declaration is here
my_dump_metadata(NULL, ic->metadata, " ", metadata);
^
ffmpeg_video_info.c:300:21: warning: implicit declaration of function 'av_strlcpy' is invalid in C99 [-Wimplicit-function-declaration]
av_strlcpy(tmp, p, FFMIN(sizeof(tmp), len+1));
^
4 warnings and 2 errors generated.
make: *** [ffmpeg_video_info.o] Error 1
```

# Gemのインストールで失敗したやつをコード修正してインストールするには

[CygwinでBerkshelfをインストールする - Qiita](http://qiita.com/mo12ino/items/0d6c9a107615a6108c99)に、エラーになったgemを
修正してインストールする方法が載っていた。

```bash
gem fetch ffmpeg-video-info
gem unpack ffmpeg-video-info-0.1.4.gem
cd ffmpeg-video-info-0.1.4
```

## 問題箇所を修正する。

ffmpeg-video-infoの場合、プロトタイプ宣言が無かったので、これを追加。
gccは寛大だったが、Mavericksのgccという名のclangは容赦なかったらしい模様。

## 修正後にgemファイルを作り直して、これをインストール

```
gem spec --ruby ../ffmpeg-video-info-0.1.4.gem >ffmpeg-video-info-0.1.4.gemspec 
gem build ffmpeg-video-info-0.1.4.gemspec
gem install ./ffmpeg-video-info-0.1.4.gem
```
# まとめ

gemインストールエラー時にファイルを残してくれているから、
そこで何とか出来そうな気もしなくもないが、何せruby初心者なので、
rakeしてエラーが出て諦めて、今回の方法を見つけたので、なんとなく、
次からもこれで対応できそうなので、すこし安心した。

# 関連記事

- [俺がQiitaに投稿されたランダムウォークのGemをmrubyで動かした - non vorrei lavorare](https://abrakatabura.hatenablog.com/entry/2014/12/22/175823)
- [rubyの代わりにmrubyをつかう→はやくならなかったorz - non vorrei lavorare](https://abrakatabura.hatenablog.com/entry/2016/01/18/094003)
pod intall と git pull でエラー "git-sh-setup: No such file or directory" Xcode6-Bate6 Yosemite

Xcode6-Bate6を使って開発していたところ pod install が上手くいかなかった。
環境はXcode6-Bate6、OSX 10.10 Yosemite(Preview 6)、iTerm2
下記のエラーが発生。

## エラー
```
$ pod install
Setting up CocoaPods master repo
Setup completed (read-only access)
Analyzing dependencies
[!] An error occurred while performing 'git pull' on repo 'master'.
[!] /usr/bin/git pull --ff-only

/Applications/Xcode6-Beta6.app/Contents/Developer/usr/libexec/git-core/git-pull: line 11: git-sh-setup: No such file or directory
```

git pull を行った際も同様のエラーが発生した。

```
$ git pull
/Applications/Xcode6-Beta6.app/Contents/Developer/usr/libexec/git-core/git-pull: line 11: git-sh-setup: No such file or directory
```

## 解決策
原因は不明だがOSX 10.10 Yosemite(Preview 6)でのiTerm2で起こる。
Terminalを使用すると pod install が正常に行えた。

参考
OSX 10.10 yosemite beta on git pull: git-sh-setup: No such file or directory
http://stackoverflow.com/questions/24022582/osx-10-10-yosemite-beta-on-git-pull-git-sh-setup-no-such-file-or-directory/24051529#comment37102830_24048895
さっきコミットしたファイルを開きなおす

# 日常的にあること(ユースケース)
 * コミットしたけどもう一度変更したい
   * (しかしエディタは終了してしまった)
 * ブランチを切り替えたあとで、作業対象のファイルを開きたい
 * コードレビューの結果、コミットを修正したい
   * (テストコード含めて数ファイル修正する必要があるんだけど各ファイルをひとつひとつ開くのはめんどくさい)


# どうするか

`git diff-tree` を使って特定のコミットに含まれるファイル一覧を取得します。
その一覧を用いてエディタでファイルを開きます。

まとめたものが次のシェルスクリプトです(`.bashrc` とかにどうぞ)。

```bash
# コミットに含まれるファイルのフルパス一覧
function _last_committed_files() {
  local ref=${@:-HEAD}
  local base=$(git rev-parse --show-toplevel 2> /dev/null)  # リポジトリの top-level ディレクトリのフルパス
  local last_committed_files=$(git diff-tree --no-commit-id --name-only -r $ref 2> /dev/null)
  for file in $last_committed_files; do
    echo $base/$file  # 各ファイルをフルパスにする
  done
}

# コミットに含まれるファイルをエディタで開く
function _edit_last_committed_files() {
  local files=$(_last_committed_files $@)
  test "$files" && vim -p $files	  # 好きなエディタでどうぞ
}
```


### 使い方

 * `_last_committed_files` は、次のように最後のコミットに含まれるファイルを出力します。

```bash
$ _last_committed_files  # execute function
/Users/meganemura/src/github.com/peco/peco/Changes
/Users/meganemura/src/github.com/peco/peco/cmd/peco/peco.go
```

 * `_edit_last_committed_files` は、上の出力を利用してエディタを開きます。
   * 上では Vim(のタブページ)で各ファイルを開いています。

超便利だと思います。

### 補足
`_last_committed_files` はデフォルトで `HEAD` を指定していますが、引数があればそのまま `git diff-tree` に渡すので、
`_last_committed_files HEAD~~` や、
`_last_committed_files master HEAD` とできます。

`_edit_last_committed_files` も同じで
`_edit_last_committed_files HEAD~~` とできます。

 alias をつけて便利に使っています。

```bash
alias el='_edit_last_committed_files'
```


上のスクリプトは [meganemura/dotfiles](https://github.com/meganemura/dotfiles/blob/master/.bash_functions) にもあります。
Rails 4 で Haml を導入したらテンプレ内に Cooffee 書けて俺得だった件


**[2014/09/01追記]**

- こちらの方が、補足や注意点を書いてくださっています。
	- [Haml内でCoffeeScriptを書くことの是非](http://qiita.com/umanoda/items/7d57c1d2739d2e1fe927)
- 私の場合も、次のような、ちょっとした用途でテンプレ内 Coffee を利用しています。
	- [Rails 4 で Knockout.js の ViewModel を Controller毎に別のファイルで管理する](http://qiita.com/hkusu/items/38fa63e851c2d7a90f2a)

---

以前に [Rails 4 で Haml を利用する手順](http://qiita.com/hkusu/items/acd487eec4bbfc9fed2f) を書いたのですが、同僚に、Haml のテンプレ内で CooffeeScript が書けるよと教えてもらいました。

> **自分の環境：**
> OS： `Mac OS X 10.9.4 (Mavericks)`
> Ruby： `2.1.2`
> Rails： `4.1.1`

Haml が導入されていれば、次のように `:coffee` を定義して、段落さげして Coffee を書いていけばいい。

```coffeescript:hoge.html.haml
〜

  - @items.each do |item|
    %tr
      %td= item.name
      %td= item.price
      %td= item.memo
      %td= link_to 'Show', item
      %td= link_to 'Edit', edit_item_path(item)
      %td= link_to 'Destroy', item, :method => :delete, :data => { :confirm => 'Are you sure?' }

%br

= link_to 'New Item', new_item_path

:coffee

  class Language
    constructor: (@name) ->

    move: (meters) ->
      alert @name + " moved " + meters + "m."

  class Ruby extends Language
    move: ->
      alert "Ruby..."
      super 5

  class PHP extends Language
    move: ->
      alert "PHP..."
      super 45

  rails = new Ruby "Ruby on Rails"
  symfony = new PHP "Symfony"

  rails.move()
  symfony.move()
```

※ 上記のスクリプトは http://railsdoc.com/coffeescript から引用させて頂きました。

Haml の filter と呼ばれる機能なのですが、Hamlのサイトによると、Coffee 以外にもいろいろ便利な filter があるっぽい。
⇒ http://haml.info/docs/yardoc/file.REFERENCE.html#cdata-filter

`:markdown` とかちょっと便利そう。
[AWS] EC2インスタンスにEBSボリュームをアタッチする/デタッチする

AWS の EC2 には EBS (Elastic Block Store) と呼ばれる永続的なストレージボリュームがあります。
インスタンスを生成した時に自動的に付与される「インスタンスストレージ」は対照的に、エフェメラルな揮発性のボリュームなので、ログなど永続的に残しておきたい場合は EBS が使えます。

# アタッチ

## 手順概略

1. EC2コンソールで `Create Volume` する
2. 作成したボリュームをインスタンスにアタッチする
3. アタッチしたボリュームを使えるようにする
4. `automount` の設定をする

## 手順詳細

### 1. EC2 コンソールで `Create Volume` する

1-1. EC2 のコンソール画面を開きます。
1-2. 左メニューの中から「ELASTIC BLOCK STORE > Volumes」をクリックします。
1-3. 上部にある `Create Volume` ボタンを押します。
1-4. タイプや作成するボリュームのサイズ、AZなどを選択します。
　※「Magnetic」は所謂HDDです。こちらを選択すると何故かメニューには「standard」と表示されます。
　※ Availability Zone は、アタッチしたいインスタンスと同じ AZ にしてください。
1-5. 「Create」を押して完了。

### 2. 作成したボリュームをインスタンスにアタッチする

2-1. 作成したボリュームを右クリックします（or クリックして選択した状態で、画面上部の「Action」を押します）
2-2. アタッチしたいインスタンスを入力します。
2-3. マウント位置を入力します。自動で `/dev/xvdf` 当たりが入る気がします。

### 3. アタッチしたボリュームを使えるようにする

アタッチしただけでは使えないので、使えるようにします。
以下のコマンドは Ubuntu 用です。

3-1. ボリュームをアタッチしたインスタンスにログインします
3-2. アタッチしたボリュームをフォーマットします。今回は `ext4` を使います。

```
# mkfs -t ext4 /dev/xvdf
```

3-3. ボリュームをマウントします。

```
# mkdir /ebs
# mount /dev/xvdf /ebs
```

これでもう使えるようになります。簡単ですね。

```
# df -h
/dev/xvda1 on / type ext4 (rw)
...（中略）...
/dev/xvdb on /mnt type ext3 (rw)
/dev/xvdf on /ebs type ext4 (rw)
```

### 4. `automount` の設定をする

あとはインスタンスを再起動した時にマウントが解除されないように、`automount` の設定をします。

```
# echo "/dev/xvdf /ebs ext4 defaults 1 1" >> /etc/fstab
```

そして

```
# mount -a
```

コマンドを実行し、ちゃんとマウントされている事を確認。

※参考※
http://stackoverflow.com/questions/6006805/automatically-mount-an-ebs-volume-upon-starting-an-amazon-ec2-linux-instance


# デタッチ

## 手順概略

上記の逆をします。

1. `automount` の設定を解除
2. ボリュームのマウントを解除
3. EC2コンソールで ボリュームをインスタンスからデタッチ
4. EC2コンソールで `Delete Volume` する

## 手順詳細

### 1. `automount` の設定を解除

該当マウントの設定を削除してください。

### 2. ボリュームのマウントを解除

マウントを解除します。

```
# umount /ebs
```

もしまだ使っていた場合はエラーが出ます。

```
# umount /ebs
umount: /ebs: device is busy
```

その場合は、使用しているプロセスを探します。

```
# fuser -muv /ebs
```

そのプロセスを終了するか `kill` します。既存システムに影響が出ないようにご配慮ください。
プロセス終了後、再度 `umount` でOK.

※参考
http://d.hatena.ne.jp/knaka20blue/20100712/1278903653

### 3. EC2コンソールで ボリュームをインスタンスからデタッチ
### 4. EC2コンソールで `Delete Volume` する

あとは画面でポチポチするだけです。
ボリューム右クリックメニュー（or 画面上部の「Action」）から、「Detatch Volume」します。
外れたのを確認したら、同メニューから「Delete Volume」して完了。
CentOSでコマンドラインからCoffeeScriptをコンパイルしました

CoffeeScriptをコンパイルしたいと思いました。環境はCentOSです。

# npmのインストール

コンパイルにはnpmが必要らしいのでまずはnpmをインストールします。

```
sudo yum install nodejs npm 
```

# coffee-scripctをインストール

次にnpmでcoffee-scriptをインストールします。

```
sudo npm install -g coffee-script
```

適当にCoffeeScriptのファイルを作成します。

```
vi hoge.coffee

# 中身
hoge = "coffee"
```

# .coffeeファイルをコンパイル

hoge.coffeeファイルをコンパイルします。

```
coffee -c hoge.coffee
```
-cオプションでコンパイルされます。

ls コマンドで確認します。

```
ls

hoge.coffee  hoge.js 
```
hoge.jsが生成されています。

hoge.jsの中味を見てみます。

```coffeescript:CoffeeScript
// Generated by CoffeeScript 1.8.0
(function() {
  var hoge;

  hoge = "coffee";

}).call(this);
```

どうやらちゃんとコンパイルされたようです。

# 参考
http://coffeescript.org/
strptimeではなくてdate_parse_from_formatを使う(strptimeはwindowsでは使えない)

#strptimeではなくてdate_parse_from_formatを使う

strptimeが何故か開発(CentOs)環境ではOKだが、
windowsのローカル環境でエラーとなって嵌った。

関数が定義されてません。。。ってエラー

PHPマニュアルを見たら、 この関数は Windows 環境にはまだ実装されていません。
って書いてあった。

環境に依存しないdate_parse_from_formatを使うべきとも書いてありました :sweat_smile: 

ただ、配列のキーが違うから要注意 :exclamation:
[Vim] vim で Scss や Sass ファイルをシンタックスハイライトさせる方法

vimのバージョンによっては、ScssやSassのシンタックスハイライトに対応していないものもあります。
その際は以下の1行を .vimrc に追記すると対応します。

```vim:.vimrc
au BufRead,BufNewFile *.scss set filetype=sass
```
TextViewの一部文字クリック周りの便利クラスを作った。

TextViewでテキストの一部をクリックした時の動作の実装方法をググると色々あってややこしかったので、下記要件の場合のみ便利なクラスを作ってみました。

* 全文・一部文字列だけ定義すれば動く。
* 任意の動作を書けるリスナーがある。

![hogehuga.png](https://qiita-image-store.s3.amazonaws.com/0/12203/85e3de63-2eac-6925-8fc4-97b2c13f43b5.png)

全文"testhogehogeeeeeeehogefugaaaaagugapiyo"の中から一部文字列"hoge"と"fuga"のクリックに個別に反応するサンプルと便利クラスを晒します。


## 便利クラス


```java:TextLinker.java
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
import android.text.SpannableString;
import android.text.Spanned;
import android.text.style.ClickableSpan;
import android.util.SparseArray;
import android.view.View;
 
public class TextLinker {

	public interface OnLinkClickListener{
		public void onLinkClick(int textId);
	}
	
	private static class TextClickSpan extends ClickableSpan{
		
		private OnLinkClickListener mListener;
		private int mTextId;
		
		public TextClickSpan(int textId , OnLinkClickListener listener){
			mTextId = textId;
			mListener = listener;
		}
 
		@Override
		public void onClick(View widget) {
			if(mListener != null)mListener.onLinkClick(mTextId);
		}
	}
 
	public static SpannableString getLinkableText(String text , SparseArray<String> links , OnLinkClickListener listener){
		SpannableString spannable = new SpannableString(text);
		
		int size = links.size();
		for(int i = 0 ; i < size ; i++){
			int key = links.keyAt(i);
			String link = links.get(key);
			Pattern p = Pattern.compile(link);
			Matcher m = p.matcher(text);
			while(m.find()){
				TextClickSpan span = new TextClickSpan(key , listener);
				spannable.setSpan(span, m.start(), m.end(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
			}
		}
		return spannable;
	}
}


```

## 使い方

```java
	String text ="testhogehogeeeeeeehogefugaaaaagugapiyo";
	SparseArray<String> links = new SparseArray<String>();
	links.append(0, "hoge");
	links.append(1, "fuga");
	
	OnLinkClickListener listener = new OnLinkClickListener() {
		@Override
		public void onLinkClick(int textId) {
			// hogeをクリックするとtextIdは0、
			// fugaをクリックするとtextIdは1。
		}
	};
	
	TextView textView = (TextView)findViewById(R.id.text);
	textView.setText(TextLinker.getLinkableText(text, links, listener));
	textView.setMovementMethod(LinkMovementMethod.getInstance());

```

## リンク色変更する場合


```xml
<TextView
            android:id="@+id/text"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textColor="@android:color/black"
            android:textColorLink="@android:color/holo_purple"
            /> 
```
パターンマッチとXXXをくっつける


書き捨て。optima便利、でも拡張しにくい。その拡張アイディアの一つ。

## 構想 : パターンマッチ + 探索

find-if パターン。alistパターンや正規表現マッチパターンもこの仲間だと思う。
おそらく一つのクラスを形作るはず。

```cl
(defun fn1 (tree)
 (match tree
  ((list* first second (and even (find-if #'evenp)))
   (print (list first second even)))))

(fn1 '(1 2 5 7 8 9 .....))
; -->
; (1 2 8)
```

## 構想 : パターンマッチ + 反復

dolist パターン、map パターン

```cl
(defun fn1 (tree)
 (match tree
  ((list* first second (dolist (x) (list y z)))
   (print (list first second y z)))))

(fn1 '(1 2 (3 4) (5 6) (7 8) .....))
; -->
;
;(1 2 3 4)
;(1 2 5 6)
;(1 2 7 8)
;...
```

今までは分解してからdolistやmapに食わせて、またmatchしなくてはいけなかった(下の例)。
あれば便利。

```cl
(defun fn1 (tree)
 (match tree
  ((list* first second sublis)
   (dolist (x sublis)
     (match x
       ((list y z)
        (print (list first second y z))))))))))

(fn1 '(1 2 (3 4) (5 6) (7 8) .....))
; -->
;
;(1 2 3 4)
;(1 2 5 6)
;(1 2 7 8)
;...
```

手元にあるoptima-cloneにある Pattern transformer を拡張すれば、
原理的にはこういうことが簡単に出来るようになるはず。

## まとめ

もともと、パターンマッチ = destructuring + conditional だったわけだけど、
ほかにもいろいろくっつけられるんじゃないかな。ただ、オブジェクト生成するのはまずそうだな。
あとは、早く時間作って速いユニフィケーションを実装したい。

## おまけ

こんなくだらないことを考えていたのは、
cons tree の形になっている実験データを
**視覚的に** うまく組み替えられる方法があればいいなと思っていたから。
で、今回は optima は使わず destructuring-bind を使っていたんだけど、
なかなか使いやすいマクロになった。

```cl
;; cons tree をとる。&rest にあたるところでループする。
(defun my-format (tree)
  (with-record (configuration &rest (domain &rest (problem cost time memory))) tree
    (format t "~@{~a~^, ~}~%" configuration domain problem cost time memory)))

AAAI15-RESULTS> (my-format '(TEMPLATE-LAMA (BARMAN (P01 573 1802.06
 468608) (P02 -1 -1 -1) (P03 674 1802.19 513584) (P04 666 1801.9
 584208)) (CELL-ASSEMBLY-NONEG-NOCOST (P01 126 112.68 360816) (P02 323
 1802.63 45600) (P03 474 1801.94 52256) (P04 1407 1802.6 59296))))

;TEMPLATE-LAMA, BARMAN, P01, 573, 1802.06, 468608
;TEMPLATE-LAMA, BARMAN, P02, -1, -1, -1
;TEMPLATE-LAMA, BARMAN, P03, 674, 1802.19, 513584
;TEMPLATE-LAMA, BARMAN, P04, 666, 1801.9, 584208
;TEMPLATE-LAMA, CELL-ASSEMBLY-NONEG-NOCOST, P01, 126, 112.68, 360816
;TEMPLATE-LAMA, CELL-ASSEMBLY-NONEG-NOCOST, P02, 323, 1802.63, 45600
;TEMPLATE-LAMA, CELL-ASSEMBLY-NONEG-NOCOST, P03, 474, 1801.94, 52256
;TEMPLATE-LAMA, CELL-ASSEMBLY-NONEG-NOCOST, P04, 1407, 1802.6, 59296


;; 第二弾

(defun table1 (tree)
  (let (hash)
    (with-record (configuration
                  &rest
                  (domain &rest (problem cost time memory))) tree
      (when (plusp cost)
        (setf (getf (getf hash configuration) domain)
              (1+ (or (getf (getf hash configuration) domain) 0)))))
    (print hash)
    (with-record (&rest _ (&rest _  count)) hash
      (print count))))

AAAI15-RESULTS> (table1 '(TEMPLATE-LAMA (BARMAN (P01 573 1802.06
 468608) (P02 -1 -1 -1) (P03 674 1802.19 513584) (P04 666 1801.9
 584208)) (CELL-ASSEMBLY-NONEG-NOCOST (P01 126 112.68 360816) (P02 323
 1802.63 45600) (P03 474 1801.94 52256) (P04 1407 1802.6 59296))))

;(TEMPLATE-LAMA (CELL-ASSEMBLY-NONEG-NOCOST 4 BARMAN 3)) 
;4 
;3 

```
Hubot | 自作Script | Hubot で 「フォト蔵」API の結果を取得する

# Hubot | 自作Script | Hubot で 「フォト蔵」API の結果を取得する

## 概要
Hubot で 「フォト蔵」API の結果を取得します

## 機能
* Queryで検索ワードを指定
* 検索ワードに一致するデータを10件取得し、ランダムで一件を表示する

## 正規表現

~~~
/photozou( (.*))/i
~~~

## ソースコード

~~~coffee:photozou.coffee
# Description
#   Output photozou
#
# Dependencies:
#   None
#
# Configuration:
#   None
#
# Commands:
#   hubot photozou <query>... - Output photozou
module.exports = (robot) ->
  robot.respond /photozou( (.*))/i, (msg) ->
    query = msg.match[2]
    robot.http("https://api.photozou.jp/rest/search_public.json?keyword=#{query}&limit=10")
      .get() (err, res, body) ->
        photos = JSON.parse(body)['info']['photo']
        photo = msg.random(photos)
        msg.send "title:#{photo}"
        msg.send "title:#{photo['photo_title']}"
        msg.send "image_url => "
        msg.send photo['image_url']
~~~

## 出力

### shell adapter で確認

~~~bash
Hubot> hubot photozou cat
Hubot> title:kakegawajyo_cat0_DSC04172
Hubot> image_url =>
Hubot> http://art9.photozou.jp/pub/929/2335929/photo/209744964.jpg
Hubot> hubot photozou cat
Hubot> title:分かりゃいいんだよ分かりゃ...
Hubot> image_url =>
Hubot> http://art9.photozou.jp/pub/651/2827651/photo/209756518.jpg
~~~

## 参照
http://photozou.jp/basic/api_method_search_public
MacからLinuxのデスクトップ環境へVNC接続する


## はじめに

Linuxのデスクトップ環境にリモートからアクセスするためにVNC Serverを
構築する手順を記載します。

## 環境

サーバ側

* CentOS 6.3
* tigervnc-server 1.1.0

クライアント側

* Mac OS X 10.9.4

## VNC Serverのインストール

```shell
$ sudo yum install tigervnc-server
```

## デスクトップ環境のインストール

```shell
$ sudo yum groupinstall "X Window System"
$ sudo yum groupinstall "Desktop"
$ sudo yum groupinstall "General Purpose Desktop"
```

## VNC Serverの起動

```shell
$ vncserver -geometry 800x600

New 'hostname:1 (username)' desktop is hostname:1

Creating default startup script /home/username/.vnc/xstartup
Starting applications specified in /home/username/.vnc/xstartup
Log file is /home/username/.vnc/hostname:1.log
```

> $ vncserver -geometry 800x600

画面サイズを800x600として起動しています。

初回起動時は、VNC接続するときのパスワードの入力をもとめられるため、
適切なものを設定します。

後ほど、ここで設定したパスワードを使用して、VNC接続を行います。

> New 'hostname:1 (username)' desktop is hostname:1

今回は、ディスプレイ番号 __「:1」__ で起動しているので、VNC接続する
ときは __「5901」(5900 + ディスプレイ番号)__を指定することになります。

## 動作確認

Macからアクセスしてみます。

Finderの「移動」＞ 「サーバへ接続」で、VNCクライアントを起動します。

![スクリーンショット 2014-08-29 17.58.49.png](https://qiita-image-store.s3.amazonaws.com/0/52459/6df0bd2c-ef75-916a-3a6e-cc6f5bf6b99b.png "スクリーンショット 2014-08-29 17.58.49.png")

「サーバアドレス」は、以下を指定します。

__vnc://${接続するサーバIPアドレス}:5901__

![スクリーンショット 2014-08-29 18.05.38.png](https://qiita-image-store.s3.amazonaws.com/0/52459/2f5502c4-c880-2109-e9e6-fbb31d934562.png "スクリーンショット 2014-08-29 18.05.38.png")

パスワードは、VNC Serverを起動したときに設定したパスワードを指定します。

![スクリーンショット 2014-08-29 18.08.06.png](https://qiita-image-store.s3.amazonaws.com/0/52459/60df58fd-c9bd-3305-c6c8-b9f80b19a0cb.png "スクリーンショット 2014-08-29 18.08.06.png")


## 参考

* [【CentOS】vncserverを使ってリモートデスクトップ操作]
(http://blog.livedoor.jp/loopus/archives/50249671.html)

* [WindowsからCentOSのデスクトップにVNC接続できる環境を構築する方法]
(http://www.checksite.jp/centos64-desktop-connect-vnc/)

* [Linux の VNC サーバの設定]
(http://futuremix.org/2009/01/linux-vnc-server-install)

* [Virtual Network Computing]
(http://ja.wikipedia.org/wiki/Virtual_Network_Computing)

* [TigerVNC]
(http://sourceforge.jp/projects/sfnet_tigervnc/)
IntelliJのSearch Everywhere（とか）でカーソルキーを強要されるのでKarabinerの設定を書いた


最近HHKB Pro JPからHHKB Pro2に乗り換えたらIntelliJでジャンプする度にFnキーを押さないといけなくて本当に辛かったので設定を書いた。
本当はIntelliJ側で設定したいけどSearch EverywhereのUIでのキーバインドを設定する方法が無さそうだった。

```xml
<?xml version="1.0"?>
<root>
    <appdef>
        <appname>INTELLIJ</appname>
        <equal>com.jetbrains.intellij</equal>
    </appdef>
    <list>
        <item>
            <name>Control + n to DOWN(IntelliJ)</name>
            <identifier>private.intellij_down.control_n</identifier>
            <only>INTELLIJ</only>
            <autogen>--KeyToKey-- KeyCode::N, ModifierFlag::CONTROL_L, KeyCode::CURSOR_DOWN</autogen>
        </item>
        <item>
            <name>Control + p to UP(IntelliJ)</name>
            <identifier>private.intellij_up.control_p</identifier>
            <only>INTELLIJ</only>
            <autogen>--KeyToKey-- KeyCode::P, ModifierFlag::CONTROL_L, KeyCode::CURSOR_UP</autogen>
        </item>
    </list>
</root>

```
【jQuery】文字列<a href="#">2014082422064358287.jpg</a>から文字列2014082422064358287.jpgを取り出す


```html:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<script type="text/javascript" src="jquery-1.7.min.js"></script>
<title></title>
</head>
<body>

<p id="d1"><a href="#">2014082422064358287.jpg</a></p>

<br/>

<div id="result">

</div>

<script type="text/javascript">

$(function(){

var reg=/(?:>)([^<]*)/,
    nm=$("#d1").html(),
    file_name=nm.match(reg)[1];

$("#result").html("file_name="+file_name+"<br/>");//file_name=2014082422064358287.jpg

nm=$("#d1").text();

$("#result").append("file_name="+nm+"<br/>");//file_name=2014082422064358287.jpg

});
</script>
</body>
</html>

```

##解説
id="d1"のpタグに書いてある文字列&lt;a href=&quot;#&quot;&gt;2014082422064358287.jpg&lt;/a&gt;から文字列2014082422064358287.jpgを正規表現を使って取り出した。しかし、文字列2014082422064358287.jpgを取り出すだけなら、jQueryのhtmlメソッドを使わずにtextメソッドを使えば簡単に取り出し可能である。

##demon-uploaderの仕様変更
私は、textメソッドの存在を知らずdemon-uploaderを作成したので、htmlメソッドで取得した文字列&lt;a ref=&quot;#&quot;&gt;2014082422064358287.jpg&lt;/a&gt;から、正規表現を使って文字列2014082422064358287.jpgを取り出していたが、現在はtextメソッドを使って文字列2014082422064358287.jpgを取り出す仕様に変更した。
SlackでC-fが検索に割り振られたのでKarabinerの設定を書いた


C-fを押すと検索ウィンドウが開くだけなら許せたけど入力中のテキストが吹き飛んで仕事どころじゃなかったので適当に書いた。1回やらかせば学習して繰り返さないかと思ったけどそんなことはなかった。手癖は辛い。

その後に家からSlack使う時にはC-fがカーソル移動のままだったし何がトリガーで挙動が変わったのかは結局分からなかったけど周りにも同じ現象が起きてる人がいたので。

```xml
<?xml version="1.0"?>
<root>
    <appdef>
        <appname>SLACK</appname>
        <equal>com.tinyspeck.slackmacgap</equal>
    </appdef>
    <list>
        <item>
            <name>Control + f to RIGHT(Slack)</name>
            <identifier>private.slack_right.control_f</identifier>
            <only>SLACK</only>
            <autogen>--KeyToKey-- KeyCode::F, ModifierFlag::CONTROL_L, KeyCode::CURSOR_RIGHT</autogen>
        </item>
    </list>
</root>
```
UIViewに配置された特定のUI部品を検索する


UIViewはsubviews、または入れ子として多数のUIViewを内包することがある。
タイトルに従い、特定のUI部品のインスタンスを検索してみる。

##サンプルプロジェクトをつくる

Tabbed Applicationで自動生成されるFirst Viewをサンプルとしよう。
以下、プロジェクトの生成手順。

1. メニュー > File > New > Projectで「Tabbed Application」を選択しNext
2. 言語がswiftになっているか確認する。ProductNameを適当に入力し、Next。
3. Createでプロジェクトが作成される
4. FirstViewController.swiftを開く

複雑なUI部品を追加してやると面白いかもしれない。

##コード

```swift:FirstViewControler.swift

import UIKit

class FirstViewController: UIViewController {
    
    var array:[AnyObject]!
    
    override func viewDidLoad() {
        super.viewDidLoad()        
        array = []

        // FirstView内のUILabelを検索する
        retrieveUIView(UILabel.self, parentView: self.view)
        
        println("UILabelの数: \(array.count)")
    }

    // parentViewのsubviews以下を検索
    // aClassのインスタンスがあればarrayへ追加
    func retrieveUIView(aClass: AnyClass, parentView: UIView) {
        for childView in parentView.subviews {
            
            // childViewのクラス名を出力
            // println("クラス: \(childView.dynamicType.description())")
            
            // childViewがaClassのインスタンスならばarrayに追加
            if (childView as NSObject).dynamicType.isEqual(aClass) {
                array.append(childView)
            }
            
            // 子のビューについて再帰
            retrieveUIView(aClass, parentView: childView as UIView)
        }
    }
}
```

## ポイント

* クラス名.selfでClass型に
* .dynamicTypeに続けてドットでそのクラスのクラスメソッドにアクセス出来る
* .selfと.dynamicTypeは補完候補に表示されない(xcode6 beta6)
* UIPickerViewのように複雑なUI部品を構成する要素の1つ1つまで検索出来てしまう
bashでポモドーロタイマー作ったった


# 背景

なが～い処理を流しててちょっとスキマ時間があったので作ってみた。
tmuxで時間とhtopをいつも画面下に出すようにしているんですが
もう２つ枠が余ってて、なにか入れたいなーと。

# 準備

macのbannerコマンドだと微妙だったので
figletをHomebrewからインストールしておく

```
$ brew install figlet
```

# pomodoro.sh


```bash:pomodoro.sh
#!/bin/bash

clear
i=25
figlet ready?
read Wait
clear
figlet $((i))

while :
do
  sleep 1
  clear
  figlet $((i-=1))
  if [ $i -eq 0 ]
  then
    terminal-notifier -message "job finished"
    echo -n "Pomodoro[P],Short break[S], Long break[L]?> "
    read WAIT
    case "${WAIT:0:1}" in
      P | p )
        i=25
        ;;
      S | s)
        i=5
        ;;
      L | l)
        i=15
        ;;
      *)
        echo "Didn't match anything"
        echo "Pomodoro Start!"
        i=25
    esac
    clear
    figlet $((i))
  fi
done
```

こんなかんじです。
（添付のgifは1/60秒でお送りいたします）

![pomo.gif](https://qiita-image-store.s3.amazonaws.com/0/17518/9f29b799-243d-cfb5-26ea-db40cd06e759.gif "pomo.gif")

（ポップアップがうまくgifに入っていないけど）
scikit-learn + DBSCAN によるクラスタリング

今日は[昨日](http://qiita.com/ynakayama/items/88b4dd5d0dd9b1604006)に引き続き [SciPy and NumPy
Optimizing & Boosting your Python Programming](http://it-ebooks.info/book/1280/) の中から [scikit-learn](http://scikit-learn.org/stable/) を使った例を軽く説明します。クラスタリングについてはすでに[食べられるキノコを見分ける](http://qiita.com/ynakayama/items/d67ffc172afaf0895de4)や[クラスタリングの結果を再利用する](http://qiita.com/ynakayama/items/7de5ecac9023cb46e0ef)といった記事で説明しましたし [scikit-learn によるクラスタリング
](http://qiita.com/ynakayama/items/ab2d89be36d3cdaeb4f2)でも取り扱ってきましたから機械学習の中でもすっかりお馴染みの手法かと思います。

## scikit-learn でのクラスタリング

ポピュラーな [kmeans](http://ja.wikipedia.org/wiki/K%E5%B9%B3%E5%9D%87%E6%B3%95) と比較して多くのデータ点を有するコア点を見つける [DBSCAN アルゴリズム](http://en.wikipedia.org/wiki/DBSCAN)は、コアが定義されると指定された半径内内でプロセスは反復します。ノイズを多く含むデータに対して、しばしば kmeans と比較される手法です。

原著においてもこれらの手法を比較し可視化しています。さっそく試してみましょう。

```py3
import numpy as np
import matplotlib.pyplot as mpl
from scipy.spatial import distance
from sklearn.cluster import DBSCAN

# まずはサンプルデータを乱数で生成します
c1 = np.random.randn(100, 2) + 5
c2 = np.random.randn(50, 2)

# 均一分布を生成、積み上げる
u1 = np.random.uniform(low=-10, high=10, size=100)
u2 = np.random.uniform(low=-10, high=10, size=100)
c3 = np.column_stack([u1, u2])

# 150 x 2 の配列にすべてのデータをためこむ
data = np.vstack([c1, c2, c3])

# DBSCAN を利用したクラスタリング
# db.labels_ はデータ内の異なるクラスタへの識別子を持つ配列です
db = DBSCAN().fit(data)
labels = db.labels_

# それぞれのコアに対する座標を取得します
# 2 つのクラスタは 0 と 1 として、ノイズは -1 と分類されます
# これらを分割します
dbc1 = data[labels == 0] # 負例
dbc2 = data[labels == 1] # 正例
noise = data[labels == -1] # ノイズ
```

このようにノイズを取り分けることができるのが特徴です。

### 可視化

おなじみの [matplotlib](http://matplotlib.org/) で可視化しましょう。

```py3
x1, x2 = -12, 12
y1, y2 = -12, 12
fig = mpl.figure()
fig.subplots_adjust(hspace=0.1, wspace=0.1)
ax1 = fig.add_subplot(121, aspect='equal')
ax1.scatter(c1[:, 0], c1[:, 1], lw=0.5, color='#00CC00')
ax1.scatter(c2[:, 0], c2[:, 1], lw=0.5, color='#028E9B')
ax1.scatter(c3[:, 0], c3[:, 1], lw=0.5, color='#FF7800')
ax1.xaxis.set_visible(False)
ax1.yaxis.set_visible(False)
ax1.set_xlim(x1, x2)
ax1.set_ylim(y1, y2)
ax1.text(-11, 10, 'Original')
ax2 = fig.add_subplot(122, aspect='equal')
ax2.scatter(dbc1[:, 0], dbc1[:, 1], lw=0.5, color='#00CC00')
ax2.scatter(dbc2[:, 0], dbc2[:, 1], lw=0.5, color='#028E9B')
ax2.scatter(noise[:, 0], noise[:, 1], lw=0.5, color='#FF7800')
ax2.xaxis.set_visible(False)
ax2.yaxis.set_visible(False)
ax2.set_xlim(x1, x2)
ax2.set_ylim(y1, y2)
ax2.text(-11, 10, 'DBSCAN identified')
fig.savefig('image.png', bbox_inches='tight')
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/38501/e25bb34e-5086-daad-78b2-528eae36e259.png)
[WIP]UIApplicationDelegateの役割と他のクラスへの分担について

###　責務超過になりやすいUIApplicationDelegate

What describes the Application Delegate best? How does it fit into the whole concept?

http://stackoverflow.com/questions/828827/what-describes-the-application-delegate-best-how-does-it-fit-into-the-whole-con

の投稿でも議論されていますが、自分も前々から気になっているので整理してみます。まだいろいろ書いてない事も有りますが。。。。

UIApplicationDelegateの行う仕事としてまず

     ・アプリケーションに関わる初期化。
     ・最初に表示するUIViewControllerの設定

があります。

次に以下のような外部アプリ？からのイベント、例えば

    ・URLスキーム
    ・音楽アプリの場合、コントロールセンタから再生制御イベント(要UIResponderを継承)

を適切なオブジェクトに投げるというのがあるでしょう。

三番目として下位レイヤー、主にモデル系クラスから飛んでくる通知(NSNotification)、例えば

    ・通信エラー
    ・セッション切れ

を受けて適切なアクションを起こすというのが有るでしょう。ただ、これはクラスの役割分担の観点から実際に処理すべきクラスに処理をさせるべきでしょう。アラート表示はiOS8から新しく変わりますが、UIApplication→window→rootViewController経由でモーダル表示させれば、専用のクラスで対応できそうです。
  
4番目としてシステムイベント、例えばバックグランドに遷移した、アプリが終了する等の処理が有るでしょう。通知(NSNotification)で配信される場合、これもクラスの役割分担の観点から、適切な責務を担っているクラスに処理をさせるべきでしょう。

　ただ、UIApplicationDelegateのメソッド経由でしか通知されないイベントについては受け手にならざるえません。その場合でも、実際の処理は専用のクラスにおこなわせて、UIApplicationDelegateは仲介役に徹するべきでしょう。UIViewController系クラスと同様な
仲介タスクですね。

とりあえず強引に纏めますが

    ・UIResponder経由やUIApplicationDelegateのメソッドとしてしか用意されていないものはUIApplicationDelegateクラスで受けて、他のクラスに転送する。
    ・通知が用意されているイベントについてはその専用のクラスに処理させる

という事でしょうか？ クラスの責務を考えて、積極的に分割しないと簡単に神クラスができるのでUIApplicationDelegateについては色々考えたい所です。
Railsで自動で挿入されるエラー出力タグ <div class="field-with-errors"></div>の変更

Railsはエラーがでたフォームの項目に、自動で`<div class="field-with-errors"></div>`を挿入する。
勝手に挿入されてデザインとか崩れるので、これを変更してみる。

具体的には`config.action_view.field_error_proc`の設定をすることで反映できる。

## なにも挿入したくない場合

```rb:application.rb
config.action_view.field_error_proc = proc { |html_tag, instance| html_tag }
```

## bootstrapのclassを挿入する

```rb:application.rb
config.action_view.field_error_proc = proc { |html_tag, instance| "<div class='has-error'>#{html_tag}</div>".html_safe }
```
【解決】sqlite3で"0001"をstringのカラムにinsertすると"1"として入る問題


解決方法教えてください。

```python:sqlite3
import sqlite3
DATABASE = "unko"

def sql4execute(sql,params=[]):
  db = sqlite3.connect(DATABASE)
  db.text_factory = str  
  cur = db.execute(sql,params)
  db.commit()
  db.close()

sql = "insert into unko (a)  values ('0001')"
sql4execute(sql)
#unkoのaに'1'が入る
#aの桁数は固定ではないのでzero paddingできない。
irbでカーソルキーが使えないとき

# 症状
irbにてカーソルキーを入力すると、ヘンな文字（エスケープシーケンス？）が入力されるだけで、移動や履歴を表示することが出来ない。

# 対処法
readlineというライブラリを入れ、makeしなおす。

```
sudo apt-get install libreadline-dev
```

```
rbenv uninstall 2.1.2
rbenv install 2.1.2
```
最近のWebサイト構築

GitHub PagesというGitHubが運営するWebサーバーを利用して公開する人が多い印象です。

テンプレートは、サイトジェネレーター用のものを持ってきて、適用します。テンプレートをイチから作るにしても、たくさんのライブラリを使って作る人が多いのではないでしょうか。

記事は、Markdownパーサーを利用して書く場合が多く、サイトジェネレーターを使用している人なら、自動でHTMLに変換するようになっています。

言語に関しては、HTMLをHamlまたはSlimで書いたり、CSSをSassで書いたりするのではないでしょうか。これらの言語は、最終的に、HTMLやCSSを吐き出す省略記法のようなイメージです。

個人的には、サイトを作る際もソースコードから見ていく場合が多く、それをfork(copy,writeのようなイメージ)すると、上のような形で作られているので、対応したツールのドキュメントを見て、書き直すというような感じでやっています。したがって、特に知らないものを適当に書きなおしているという感じになる場合が多いです。

ここで、最近見かけて良さそうだったものをまとめてみようと思います。

##HTML

###Slim

http://slim-lang.com/

###Haml

http://haml.info/

Slimのほうが良さそうな感じはするけど、Hamlしか触れていません。そのうち触ってみたい...。

##CSS

###Sass

http://sass-lang.com/

###Compass

http://compass-style.org/

###Less

http://lesscss.org/

よく触ってます。

##JavaScript

###coffeescript

http://coffeescript.org/

coffee派です。

###typescript

http://www.typescriptlang.org/

##Site

###Bower

http://bower.io/

###Bootstrap

http://getbootstrap.com/

使ってます。最近、ver3になったので、ちょっと、と言うかだいぶ変わりました。

###Grunt

http://gruntjs.com/

###Middleman

http://middlemanapp.com/

使ってみましたがいい感じです。

###Octopress

http://octopress.org/

オススメしません。ビルド遅いし、プレビューも遅いです。

##追記

###Jekyll

Octopressなどは、Jekyll使ってます。

http://jekyllrb.com/

###Hexo

http://hexo.io/