OmniAICreator/Qiita-1.07M huggingface dataset:
ページャークラスの使い方

```php:
<?php
//ページャー
//ページの要素数がない場合
if(!isset($_POST["itemnum"])){ $_POST["itemnum"] = 20; }
//ページ番号がない場合
if(!isset($_POST["pagenum"])){ $_POST["pagenum"] = 1; }
//ページ番号からスタート値を取得
$pagestart = ($_POST["pagenum"] - 1) * $_POST["itemnum"];
?>
```

```php:
<?php
//limitを追加する前に全体数の取得
$count = Model::findAllBy("thread",$search);

//ページャー 現在のページ番号($pagenum)と要素数($itemnum)を受け取ってページャークラスを返す
$pager = PagerFactory::Create($count,$_POST["itemnum"],$_POST["pagenum"]);
//ページャークラスをViewに渡す
$out["pager"] = $pager;
?>
```

Twitter Bootstrap使用（↓こうなるよ）
![bootstrap_pager.PNG](https://qiita-image-store.s3.amazonaws.com/0/26200/a777c6bb-20ab-df95-6224-f9de8ac4f51a.png)

```html:
<form name="projectlist" method="post">
<input type="hidden" name="pagenum" value="<?php if(isset($out["pager"])){ htmlout($out["pager"]->getPagenum()); } ?>" />
<input type="hidden" name="itemnum" value="<?php if(isset($out["pager"])){ htmlout($out["pager"]->getItem()); } ?>" />
</form>
        
<div class="pagination pagination-centered" style="margin-top:0;margin-bottom:0;">
<ul>
<?php if($out["pager"]->getPrevpage()){ ?>
<li><a href="javascript:void(0)" onClick="f=document.projectlist;f.pagenum.value='<?php echo $out["pager"]->getPagenum() - 1; ?>';f.submit();">Prev</a></li>
<?php }else{ ?>
<li class="disabled"><a>Prev</a></li>
<?php } ?>
<?php for($p=1;$p<=$out["pager"]->getLastpage();$p++){ ?>
<?php if($p == $out["pager"]->getPagenum()){ ?>
<li class="active"><a><?php echo $p; ?></a></li>
<?php }else{ ?>
<li><a href="javascript:void(0)" onClick="f=document.projectlist;f.pagenum.value='<?php echo $p; ?>';f.submit();"><?php echo $p; ?></a></li>
<?php } ?>
<?php } ?>
<?php if($out["pager"]->getNextpage()){ ?>
<li><a href="javascript:void(0)" onClick="f=document.projectlist;f.pagenum.value='<?php echo $out["pager"]->getPagenum() + 1; ?>';f.submit();">Next</a></li>
<?php }else{ ?>
<li class="disabled"><a>Next</a></li>
<?php } ?>
</ul>
</div>
```
ページャークラス

```php:Pager.class.php
<?php
require_once HOMEPATH. 'models/PagerService.class.php';
require_once HOMEPATH. 'models/PagerFactory.class.php';
//  現在のページの情報をまとめたクラス
class pager {
    private $start; //現在のページの最初の要素番号
    private $item; //1ページの要素数
    private $count; //全要素数
    private $pagenum; //現在のページ番号
    private $lastpage; //最後のページ
    private $nextpage; //次のページがあるかどうか
    private $prevpage; //前のページがあるかどうか
    public function setStart($start){
        $this->start = $start;
    }
    public function setItem($item){
        $this->item = $item;
    }
    public function setCount($count){
        $this->count = $count;
    }
    public function setPagenum($pagenum){
        $this->pagenum = $pagenum;
    }
    public function setLastpage($lastpage){
        $this->lastpage = $lastpage;
    }
    public function setNextpage($nextpage){
        $this->nextpage = $nextpage;
    }
    public function setPrevpage($prevpage){
        $this->prevpage = $prevpage;
    }
    public function setAll($list,$item,$pagenum){
        //開始要素
        $start = ($pagenum - 1) * $item;
        $this->setStart($start);
        //1ページの要素数
        $this->setItem($item);        
        //全要素数
        $count = count($list);
        $this->setCount($count);
        //現在のページ番号
        $this->setPagenum($pagenum);
        //最後のページ
        $lastpage = ceil($count / $item);
        $this->setLastpage($lastpage);
        //次のページがあるかどうか
        if($pagenum == $lastpage){ $this->setNextpage(false); }
        else{ $this->setNextpage(true); }
        //前のページがあるかどうか
        if($pagenum == 1){ $this->setPrevpage(false); }
        else{ $this->setPrevpage(true); }
        //このクラスを返す
        return $this;
    }
    public function getStart(){
        return $this->start;
    }
    public function getItem(){
        return $this->item;
    }
    public function getCount(){
        return $this->count;
    }
    public function getPagenum(){
        return $this->pagenum;
    }
    public function getLastpage(){
        return $this->lastpage;
    }
    public function getNextpage(){
        return $this->nextpage;
    }
    public function getPrevpage(){
        return $this->prevpage;
    }
}
?>
```

```php:PagerFactory.class.php
<?php
class PagerFactory {
	function __construct() { }
	/*
	 * 常にページャークラスを返す
	 */
	public function Create($list,$item,$pagenum){           
            $pager = new pager;
            $pager->setAll($list,$item,$pagenum);
            return $pager;
	}
}
?>
```

```php:PagerService.class.php
<?php
class PagerService {
    public function filter($list,$start,$item){
        $n = 0;
        $end = $start + $item;
        $newlist = array();
        foreach($list as $i){
            if($start <= $n && $n < $end){
                $newlist[$n] = $i;
            }
            $n++;
        }
        return $newlist;
    }
}
?>
```
自作SQLcontrolクラス

遠藤フレームワーク内での使用を想定

```php:SQLcontrol.class.php

<?php
class SQLcontrol {
    private $field = null;
    private $table = null;
    private $where = null;
    private $order = "updated DESC";
    private $limit = null;
    private $data = null;
    public function addField($field){   //フィールドの追加
        //空の場合
        if(is_null($this->field)){ $this->field = $field; }
        //空でない場合
        else{ $this->field .= ",".$field; }
    }
    public function addTable($table){   //テーブルの追加
        //空の場合
        if(is_null($this->table)){ $this->table = $table; }
        //空でない場合
        else{ $this->table .= ",".$table; }
    }
    public function addWhere($where,$data=null){   //WHERE句の追加(AND)
        //空の場合
        if(is_null($this->where)){ $this->where = " WHERE ".$where; }
        //空でない場合
        else{ $this->where .= " AND ".$where; }
        if(!is_null($data)){ $this->data[] = $data; }
    }
    public function addWhereOR($where,$data=null){   //WHERE句の追加(OR)
        //空の場合
        if(is_null($this->where)){ $this->where = " WHERE ".$where; }
        //空でない場合
        else{ $this->where .= " OR ".$where; }
        if(!is_null($data)){ $this->data[] = $data; }
    }
    public function addOrder($order){   //ORDER句の追加
        $this->order = $order;
    }
    public function addLimit($limit){   //LIMIT句の追加
        $this->limit = " LIMIT ".$limit;
    }
    public function addData($data){   //Dataだけ追加
        $this->data[] = $data;
    }
    public function addString($item,$string){   //それぞれのitemに文字列を追加する関数
        switch($item){
            case "field":
                $this->field .= $string;
                break;
            case "table":
                $this->table .= $string;
                break;
            case "where":
                $this->where .= $string;
                break;
            case "order":
                $this->order .= $string;
                break;
            case "limit":
                $this->limit .= $string;
                break;
        }
    }
    public function getSQL(){
        if(is_null($this->field)){ $this->field = "*"; }
        return "SELECT ".$this->field." FROM ".$this->table.$this->where." ORDER BY ".$this->order.$this->limit;
    }
    public function getData(){
        return $this->data;
    }
}
?>
```
自作SQLcontrolクラスの使い方

SQL作成のための[自作SQLcontrolクラス](http://qiita.com/hyper_stereo/items/d67444536be18c1c30f6"自作SQLcontrolクラス")の使い方

テーブルとフィールドの設定

```php:
<?php
//SQL文の作成
$sql = new SQLcontrol;
$sql->addField("id");   //フィールド指定
$sql->addTable("project");  //テーブル指定
?>
```

カスタマイズ

```php:
<?php
$sql->addWhere("com=?",$com->getId()); //where句（AND）
$sql->addWhereOR("com=?",$com->getId()); //where句（OR）
$sql->addOrder("total-totalB ASC"); //order by句
?>
```

ページャー使うときはlimitの前に全体数を取得しとくといいよ

```php:
<?php
//limitを追加する前に全体数の取得
$count = Model::db_query($sql->getSQL(),$sql->getData());
```

limit句

```php:
<?php
$sql->addLimit($pagestart.",".$_POST["itemnum"]); //limit句
?>
```

出力

```php:
<?php
//var_dump($sql->getSQL());
//var_dump($sql->getData());
//exit;
//SQL生成
$result = Model::db_query($sql->getSQL(),$sql->getData());
?>
```

コピペ用
Windows+Emacs+auto-complete+"//" → 固まる

正しくは、固まるのではなくて数分後に //usr //dev などの候補が表示されます。
このことから、ファイル名の補完が変なのでは？と思い、ちょっと調べました。


## 原因

重くなっている処理は ac-source-filename でした。// が入力されると「ファイル名補完だ！」と判断して、
ac-source-filename で定義している ac-filename-candidate を実行します。

```el:
(defun ac-filename-candidate ()
  (unless (file-regular-p ac-prefix)
    (ignore-errors
      (loop with dir = (file-name-directory ac-prefix)
            with files = (or (assoc-default dir ac-filename-cache)
                             (let ((files (directory-files dir nil "^[^.]")))
                               (push (cons dir files) ac-filename-cache)
                               files))
            for file in files
            for path = (concat dir file)
            collect (if (file-directory-p path)
                        (concat path "/")
                      path)))))
```

loop の中の dir には、 "//" がセットされます。 files にはルートディレクトリから取得したファイル名、ディレクトリ名がセットされます。
その両方を concat した値を file-directory-p にかけています。こんな値がわたっていき、もちろん nil が返ります。

```el:
(file-directory-p "//bin")
-> nil
```

Windows環境だと // は \\\\ と同じらしく、 \\\\bin というネットワーク上のサーバを探しに行っているようです。
ここで時間を食っていました。そしてルートディレクトリにあるファイルの数分、この検査をループするため、
固まっているように見えていました。


## 対処

*scratch* バッファ等で ac-sources の中身を参照し、そこから ac-source-filename をはずすことで対処しました。
~/.emacs や ~/.emacs.d./init.el で (ac-config-default) した後に、 ac-sources を上書きしています。


```el:
(setq ac-sources '(ac-source-functions
                   ac-source-yasnippet
                   ac-source-variables
                   ac-source-symbols
                   ac-source-features
                   ac-source-abbrev
                   ac-source-words-in-same-mode-buffers
                   ac-source-dictionary))
```


これで安心して1行コメントを書くことができます。
第12回オフラインリアルタイムどう書くの参考問題。ruby による実装



オフラインリアルタイムどう書く
http://atnd.org/events/40389
の、参考問題(道なりの亀)
http://nabetani.sakura.ne.jp/hena/ord12aloroturtle/
の実装例。ruby。

他の言語などの解答例は
http://qiita.com/Nabetani/items/1de39df381dfeee305ab
から辿れます。

で。
こんな感じ。

```ruby
def at( a, x, y )
  return nil unless (0...a.size).include?( y )
  line=a[y]
  (0...line.size).include?( x ) ? line[x] : nil
end

def create_graph
  names=[(?A..?Z), (?a..?z), (?0..?7), %w( g f e )].map{ |i| i.to_a }.flatten
  f=( [11]*3+[3]*10 ).map{ |w| names.shift(w) }

  (0..11).each_with_object({}) { |y,r|
    0.upto(y<3 ? 10 : 2) do |x|
      r[ at( f, x, y )] = 4.times.map{ |i|
        at( f, x+[-1,0,1,0][i], y+[0,-1,0,1][i] )
      }
    end
  }.tap{ |r|
    %w( e7 f6  g5 ).each do |c|
      r[c[0]][3]=c[1]
    end
  }
end

def solve( src )
  graph=create_graph()
  pos = [ ?A, graph[?A].index( ?B ) ]
  src.chars.each_with_object( "A" ) do |c,r|
    turn={"L"=>3, "R"=>1}[c]
    if turn
      pos[1] += turn
    else
      c.to_i(16).times do 
        np=graph[pos[0]][pos[1]&3]
        return r+"?" unless graph[np]
        pos = [ np, graph[ np ].index( pos[0] )+2 ]
        r.concat np
      end
    end
  end
end

DATA.each_line do |line|
  num, src, exp = line.split( /\s+/ )
  act = solve( src )
  ok = act==exp ? "ok" : "***NG***"
  puts [ ok, src, act, exp ].join( " " )
end

__END__
0 2RcL3LL22 ABCNYjmpsvy147edcbcdef
1 L3R4L5RR5R3L5 A?
40  6LR2R1LR5LRLRL484L63  ABCDEFGHITe741yxw?
```

いつもどおり、テストデータの大半を省略。

テストを数えなくても 40行。
最初に書いた時はもっと簡単なような気がしていたんだけどなぁ。

作戦としては、基本的に直交座標系である、というものと、基本的にグラフである、という物があると思う。
これは後者。

地図の歪み具合に応じて例外的な処理をしなければならないわけだけど、それは地図製作の時点で済ましている。移動の時は普通にたどればよい。
とはいえ、solve の最後に end が４つもあるのはいただけない。
Listの分割統治原則に従った再帰的操作と末尾再帰最適化

[コップ本](http://www.amazon.co.jp/Scala%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%A9%E3%83%96%E3%83%AB%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E3%82%B3%E3%83%B3%E3%82%BB%E3%83%97%E3%83%88-%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0-Programming-Scala/dp/4844327453)の第16章『リストの操作』で、Listのような再帰的なデータ構造を扱う方法として、*分割統治*という原則が紹介されている。その説明は以下の通り。

> リストを対象とする多くのアルゴリズムは、パターンマッチを使って最初に入力リストを単純なケースに分割する。これが原則の中の分割（devide）の部分である。次に、個々のケースのための結果値を作る。結果値が空でないリストなら、その一部は同じアルゴリズムを再帰的に呼び出すことによって組み立てられる。これが原則の統治（conquer）の部分である。

この中で分割統治の原則に従って2つのリストを連結するappend関数（:::と同じことをやる関数）が紹介されていて、その中身はこんな感じ。

```scala:
def append[T](xs: List[T], ys: List[T]): List[T] = 
  xs match {
    case List() => ys
    case x :: xs1 => x :: append(xs1, ys)
  }
```

という形なのですが、immutableなListを引数に取って、別のリストを作る方法がとても簡単にかけるな〜、と思っていた。

だけど、この方法で気にしなきゃいけないのが、引数のリストが大きい場合に、関数の再帰呼び出しに伴ってスタックメモリーを消費するとか、スタックフレームの生成コストとか、スタックオーバーフローの問題がある。

で、そうなると再帰呼び出しを行う場合には、末尾再帰し、Scalaコンパイラーに再帰呼び出しの最適化を行ってもらうという話になる。

で、前置きが長くなったけど、この投稿の目的。。末尾再帰によってどのくらい効率的になるもんか、、、というのを比べてみた。

ということで、例として、素数を見つける処理を非末尾再帰版と末尾再帰版で比較してみた。

まずは非末尾再帰版。

```scala:
def findPrimeNumbers(n: Int): List[Int] = findPrimeNumbers(Range(2, n + 1).toList)

def findPrimeNumbers(numbersToSearch: List[Int]):List[Int] = numbersToSearch match {
  case Nil => Nil
  case n :: ns => n :: findPrimeNumbers(ns.filter(_ % n != 0))
}
```
```shell-session:
scala> :paste
// Entering paste mode (ctrl-D to finish)

new scala.testing.Benchmark {
  def run() = findPrimeNumbers(10000)}.runBenchmark(10)
}.runBenchmark(10)

// Exiting paste mode, now interpreting.
warning: there were 1 deprecation warning(s); re-run with -deprecation for detailsfindPrimeNumbers: (n: Int)List[Int]
res0: List[Long] = List(122, 126, 126, 127, 160, 123, 121, 127, 73, 21)
```

一方で、末尾再帰版。

```scala:
def findPrimeNumbersTailRecursively(n: Int): List[Int] = findPrimeNumbersTailRecursively(Range(2, n + 1).toList)

def findPrimeNumbersTailRecursively(numbersToSearch: List[Int]): List[Int] = {
  def findPrimeNumbersTailRecursively(xs:List[Int], ys:List[Int]):List[Int] = xs match {
    case Nil => ys.reverse
    case x :: xs1 => findPrimeNumbersTailRecursively(xs1.filter(_ % x != 0), x :: ys)
  }
  findPrimeNumbersTailRecursively(numbersToSearch, Nil)
}
```

```shell-session:
scala> :paste
// Entering paste mode (ctrl-D to finish)

new scala.testing.Benchmark {
  def run() = findPrimeNumbersTailRecursively(10000)
}.runBenchmark(10)

// Exiting paste mode, now interpreting.

warning: there were 1 deprecation warning(s); re-run with -deprecation for details
findPrimeNumbersTailRecursively: (n: Int)List[Int]
res1: List[Long] = List(108, 44, 43, 42, 43, 43, 43, 42, 43, 53)
```

ということで、明らかに末尾再帰版の方が良かった。（引数を大きくすると非末尾再帰版の方はstackOverflowErrorも発生する）

当たり前と言えば当たり前なのだけど。。

でも、末尾再帰をするためには、上のコードを見てわかるように、コードが若干直感的じゃなくなる、というところがあったりする気がする。。。皆さんどうしてるのでしょうか。。
Mac OS Xでmrubyをビルドしてみる


[こちらの記事](http://qiita.com/ongaeshi/items/2a2a602633f87363132a)を参考にしながら、自分でもMac OS X上でmrubyをビルドしてみます。

なお、私のMacにはgccもrubyも入っている状態なので、先にこれらをインストールしておかないといけないかもしれません。未確認です。すいません。

# 1.mrubyをダウンロードする

自分はgithubを理解していない(汗)ので、[mruby](https://github.com/mruby/mruby)のページにあるZIPボタンを押して、ダウンロードします。ファイル名はmruby-master.zip。zipを展開しておきます。

# 2. makeする

展開したmruby-masterディレクトリに移動して、makeを実行します。

```
$ cd mruby-master
$ make
```

これで、エラー等もなく、無事makeできました。

# 3. testする

```
$ make test

（略）

Total: 603
   OK: 603
   KO: 0
Crash: 0
 Time: 0.051644 seconds

$ 
```

603件のテストがOKになっていることが分かります。
これで、無事testできました。
Choosing a Backend


http://docs.basho.com/riak/1.3.1/tutorials/choosing-a-backend/

Riak KV の重要な特徴はバックエンドストレージのプラグイン機構です
特定のオペレーション上のニーズに適したストレージエンジンを選ぶことを可能にします

例えば、最大限のスループットが求められ、かつ Key のサイズが小さいのであれば Bitcask が良い選択です
Key のサイズが非常に大きくなるならば LevelDB を推奨します
下記に Riak がサポートしているバックエンドストレージを記載します

* Bitcask
* LevelDB
* Memory
* Multi

バックエンドストレージを自作したい場合は [Backend API]() を参照してください
Planning for a Riak System


下記 URL の大雑把な意訳メモ
http://docs.basho.com/riak/latest/tutorials/System-Planning/

## Backend

Riak で利用できるバックエンドストレージはそれぞれ長所と短所があります
どのバックエンドストレージが最適かは [Choosing a Backend]() を参照してください

## Capacity

Cuslter の Capacity を求めるには [Cluster Capacity Planning]() を参照してください
Bitcask の Capacity を求めるには [Bitcask Capacity Calculator]() を参照してください

## Operating Systems

主流の Unix-like な OS を推奨します
Basho では、下記のディストリビューション用の Riak バイナリパッケージを提供します

* RedHat based: RHEL, CentOS, Fedora
* Debiab based: Debian, Ubuntu
* Solaris based: Sun Solaris, OpenSolaris

## Software

Basho's Riak Packages を使用すれば、追加で必要となるソフトウェアはほとんどありません
もし Riak をソースからビルドする場合は、Erlang をインストールする必要があります
Erlang をインストールするには [Installing Erlang]() を参照してください

## Hardware

Riak はスケールアウトするように設計されています
より高いスペックのハードウェアを利用し、ノードを追加することでパフォーマンスが改善されます
推奨するハードウェア構成を下記に記載します

* Multi-core 64-bit CPU
* Minimum 4 GB RAM
* Multiple Fast Hard Disks (RAID and/or SSD)
* Fast Network (Gigabit +)

Riak は Erlang で実装されているため、マルチコアを利用した並列化によってパフォーマンスが改善します
Riak は 64-bit アーキテクチャ環境において、より効率的に処理されます

不十分な RAM はスワップを増加させ、パフォーマンスを劣化させます
メモリーとディスクの使い方に関する詳細な情報は [Cluster Capacity Planning]() を参照してください

Riak の多くのオペレーションは I/O がボトルネックになるため、高速なディスクが重要となります
ディスクの構成を RAID0  にすることよって read/write のパフォーマンスを改善するでしょう

Riak はオペレーションやアルゴリズム (ring-state goosip, handoff ..etc) で大量のトラフィックが発生します
各ノード同士の接続と、Cluster とクライアントの接続の高速化によってパフォーマンスが改善します

## Virtualization

ほとんどのデータストアのように、Riak も仮想サーバ上で動作させると遅くなります
仮想サーバは、環境によって I/O やネットワークの影響を強く受け、パフォーマンス劣化を引き起こします
クラウドや VPS 上で Riak を動作させる推奨環境を下記に記載します

* 最も大きい VM を選ぶ
* 同じ DC または同じリビジョンを選ぶ

よりよりハードウェアはよりよりパフォーマンスを発揮します
最も大きい VM であれば、他の VM とリソースを共有する可能性が低くなります

いくつかのホスティング業者は、VM の拠点を選択できます
同じ DC または同じリビジョンにすることで、ネットワーク遅延を減らし、パフォーマンスを高めます

## Network Configuration / Load Balancing

Riak Cluster への負荷を分散するための、主要な方法を下記に記載します

* virtual IPs
* reverse-proxy

VIP (実装はどれでも良い) を使用することを推奨します
Riak Cluster の全てのノードがクライアントからのリクエストを処理できるメリットを失うため、VIP のように振る舞う VRRP の使用は推奨しません

下記に挙げるような HTTP インターフェースを持った reverse-proxy は問題なく使用できます

* haproxy
* squid
* vernish
* nginx
* lighttp
* Apache
Gradle + Checkstyle で SuppressionFilter を使う方法

SuppressionFilter を使うときはファイルパスを指定しないといけないので面倒です。

## ${project}/configuration/checkstyle.xml

```xml:
<module name="Checker">
  <property name="charset" value="UTF-8"/>
  ...
  <module name="SuppressionFilter">
    <property name="file" value="${checkstyleConfigDir}/checkstyle-suppressions.xml"/>
  </module>
</module>
```

```${checkstyleConfigDir}``` を Gradle からインジェクトします。Gradle 経由で Checkstyle を実行するときは charset 指定も忘れずに。

## ${project}/configuration/checkstyle-suppressions.xml

```xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suppressions PUBLIC
    "-//Puppy Crawl//DTD Suppressions 1.1//EN"
    "http://www.puppycrawl.com/dtds/suppressions_1_1.dtd">
<suppressions>
    <suppress checks=".*" files="src/test/java/.*" />
</suppressions>
```

## ${project}/build.gradle

```groovy
def checkstyleConfigDir = new File(buildscript.sourceFile.parentFile, configurationDir)
checkstyle {
    configFile = new File(checkstyleConfigDir, "checkstyle.xml")
    configProperties.checkstyleConfigDir = checkstyleConfigDir
}
```
モーダルビューを出したり消したり

UIActionSeetやUIAlertViewみたいに、出してすぐ引っ込めたい。けどそれらよりももっと色々全画面で書きたい、みたいなときに使うのがモーダルビューです。（たぶん）
今回は、メモ用に作ったUIViewControllerであるMemoViewControllerをぱっと出してぱっと消す、という設定で、実装してます。
ちなみにMemoViewControllerはXIBファイルとして作ったので、初期化するときは「init」だけで作れちゃいます。initWithNibName:bundle:みたいにめんどくさくなくて良いですね。

```objc:
// 遷移元のUIViewController(MemoViewControllerじゃない方)に書きますよ。
// モーダルビューを表示する
-(void)showMemoView{
	MemoViewController *memoViewController = [[MemoViewController alloc] init];	
	[self presentViewController:memoViewController animated:YES completion:nil];
}
```
これで、showMemoViewを実行したら、MemoViewControllerの画面がぱっと出てきます。
以前はpresentModalViewController:animated:でしたが、iOS6以降では、presentViewController:animated:completion:を使うそうです。
なのでモーダルビューという言い方はもう古いのかもしれません。



遷移先のMemoViewControllerには、ビューをぱっと消すためのメソッドも実装しましょう。

```objc:
// モーダルビューを消す
- (void)dismissMemoView {
	[self dismissViewControllerAnimated:YES completion:nil];
}
```
こちらも、以前はdismissModalViewControllerAnimated:だったのが、
dismissViewControllerAnimated:completion:に変わっています。
Command Line から iOS アプリのTestを実行する(2013/6)


ググるとよく出てくる `RunPlatformUnitTests` を書き換える方法はどうも上手くいかず、
私の環境だと `Segmentation Fault` が出て解決できませんでした。
これから書く方法で、一応JenkinsでTestとReportの収集までできたのでメモしておきます。

環境メモ
---------

* Mac OS X 10.8.4
* Xcode 4.6.3

概要
------

基本的には下記を参考にしています。
http://stackoverflow.com/questions/5403991/xcode-4-run-tests-from-the-command-line-xcodebuild/10823483#10823483

ただ、Schemeとか作らなくてもいけたので、色々シチュエーションによって違うのかもしれません。
＃ 私の場合はSchemeの変更が gitignore されていて都合が悪かったです。。
＃ とりあえず、無くても動いたのでShceme追加無しでやっています。

コマンドラインでTestを実行する
===================

準備Install
-------------

Testや開発を実行するMacで ios-sim をInstallしておきます。

	brew install ios-sim
	
テストされるProjectの設定変更
-------------------------------

Xcodeで

	「Targets=テストターゲット」 → 「Build Phases」 → 「Run Script」

で、

```
# Run the unit tests in this test bundle.
"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests"
```
となっているのを↓

```
/usr/bin/ruby ${SRCROOT}/scripts/run-tests.rb
```

に変更します。*SRCROOT* は XCode ProjectのRoot辺りです。

で、そこに下記のようなプログラムを置いておきます。

```${SRCROOT}/scripts/run-tests.rb
if ENV['SL_RUN_UNIT_TESTS'] then
  launcher_path = "ios-sim"
  test_bundle_path= File.join(ENV['BUILT_PRODUCTS_DIR'], "#{ENV['PRODUCT_NAME']}.#{ENV['WRAPPER_EXTENSION']}")

  environment = {
    'DYLD_INSERT_LIBRARIES' => "/../../Library/PrivateFrameworks/IDEBundleInjection.framework/IDEBundleInjection",
    'XCInjectBundle' => test_bundle_path,
    'XCInjectBundleInto' => ENV["TEST_HOST"]
  }

  environment_args = environment.collect { |key, value| "--setenv #{key}=\"#{value}\""}.join(" ")

  app_test_host = File.dirname(ENV["TEST_HOST"])
  system("#{launcher_path} launch \"#{app_test_host}\" #{environment_args} --args -SenTest All #{test_bundle_path}")
else
  puts "SL_RUN_UNIT_TESTS not set - Did not run unit tests!"
end
```

Xcodeで `Cmd`+`U`  で Testを実行してみて実行できればここまでの設定はOKです。


コマンドラインで実行してみる
------------------

プロジェクトのDIRで下記が実行できるかテストしてみます。

```
TEST_TARGET=<MyTestTarget>
/usr/bin/xcodebuild -sdk iphonesimulator -target $TEST_TARGET -configuration Debug clean build SL_RUN_UNIT_TESTS=YES    
```
ちなみに上記の *TEST_TARGET* は Xcode の Targets に出てくる文字列です。

テストレポートの結果を集めなくて良ければ、
ここまでの対応でJenkinsのXcode Pluginで簡単に設定＆実行できるようになったはずです。

Test結果のReportを作成する
==================

このままだと report XML が作成されないので、
https://github.com/ciryon/OCUnit2JUnit
を導入します。
ただ、既存のSystem Ruby(1.8.7)では使えなかったので、
rbenv などで 1.9系などが入っている前提とします。

### Install ocunit2junit

	gem install ocunit2junit

###  Run Test & Report

先ほどの テスト実行をPIPEでocunit2junitに渡せば良いだけです。
Jenkins だと、Pluginとか使わずに Shell スクリプトとして実行することになるでしょう（他に方法あるのかな・・？）。

例えばこんな感じでOKです。

```
TEST_TARGET=<MyTestTarget>
source ~/.rbenv/rbenv.sh  # rbenv 前提なので、rbenvを有効にする何かを実行します
/usr/bin/xcodebuild -sdk iphonesimulator -target $TEST_TARGET -configuration Debug clean build SL_RUN_UNIT_TESTS=YES 2>&1 | ocunit2junit
```

こうすると、ocunit2junit が`test-reports/` 以下に XMLファイルを作成するので、Jenkinsで集めればOKです。
Rubyで全角カタカナを半角カタカナに変換する

半角カタカナを全角カタカナに変換する方法は比較的簡単に見つかるのに，逆は見つからなかったので調査してみました．

ヒントとして使った情報はここ
http://codezine.jp/article/detail/3519
このサイトによると，nkfコマンドに全角->半角オプションが追加され，rubyにもライブラリが同梱されているとのこと．

以下の用に記述することで変換が出来ました．

```rb:
require 'nkf'

zen = "カタカナ"
puts NKF.nkf('-w -Z4', zen)

# => ｶﾀｶﾅ

```

``` -w ``` はUTF-8で出力するオプション.
``` -Z4```は全角カタカナを半角カタカナに変換するオプションです．

同時に文字コードの変換する場合などはhttp://doc.ruby-lang.org/ja/2.0.0/class/NKF.html を参考にオプションを追加するといいでしょう．

半角カタカナとかいつ使うんだと思いますが，昔ながらのシステムでは未だに使う必要があるようなのでまとめてみました．

しかし，文字コード周りは非常に面倒ですね…．
Emacs のキーバインドを設定してみたかった

はじめましての方ははじめまして。
そうでない方はまだいないと思うのではじめまして。

emacsはキーバインドなどの設定を自由に変えられるのがいいですよね。
初期状態では、保存やバッファ切り替えなどのよく押しそうなキーに限って2ストロークだったりして使いづらいものですが。
ということで、割り当てのないキーを Ctrl + 何か の1ストロークのコマンドにしましょう。
そんな思いから .emacs に `global-set-key "\C-;" 'switch-to-buffer` をセットして emacs を再起動。
さっそく押してみると……動きません。
試しに M-x から設定しようとすると、入力できません。

原因を調べてみると、どうやら1ストロークで割り当てられるのは 0x40 - 0x5F の範囲の文字だけらしいです。
ここにあてはまるのはアルファベットの他、 @{\\}^_ の6文字だけです。
CやXなどのデフォルトの2ストロークのキーも残しておきたいので、選べるキーは限られてきます。

ここで疑問が。
よく Undo は Ctrl + / でやっているのですが、 / は 0x2F です。
マーク開始に使っているのは Ctrl + space ですが、 space は 0x20 です。
なぜ、これらの範囲外のキーが使えるのか。
調べますと、なぜか Ctrl + space は Ctrl + @ に、 Ctrl + / と Ctrl + - は Ctrl + _ にそれぞれ解釈されるようです。
よくわかりませんが、特別なキーなんですね。
（翻訳）Windowsモジュールの製品バージョンとファイルバージョンの違い

# 概要
Windowsのモジュール (exe や dll 等) が持つ、製品バージョンとファイルバージョンについて
違いが説明されている資料を探していたのですが、どうにも日本語でわかりやすい資料が見つからなかったので
Stack Overflow で見つけた分かりやすい回答の翻訳（意訳）を行いました。

元の質問は Delphi についての内容となっていますが、テーマ自体は Windows 全般に通ずるものです。

# 弁明
英語得意じゃないです。
間違ってるところ、改善すべき点等ありましたらご指摘ください。

# 原文
[delphi - File Version Vs. Product Version - Stack Overflow](http://stackoverflow.com/questions/1942844/file-version-vs-product-version)

# 質問和訳（意訳）
Delphiプロジェクトのプロパティダイアログには、製品バージョンとファイルバージョンの設定項目があります。
これらの厳密な違いを教えてください。

# 回答和訳（意訳）
製品バージョンはアプリケーション全体のバージョンです。
ファイルバージョンはコンポーネントそれぞれのバージョンです。

これらは同一のものとして管理されることが多いですが、必ずしも同一である必要はありません。
それはアプリケーションがどのようなモジュールで構成されているかによるでしょう。

例えば、あなたのアプリケーションのバージョンが 2.3.4.0 であるのに対して、
その中の、あるコンポーネントのバージョンは 5.6.7.0 であるケースがあります。
それはここ最近追加された他アプリケーションまたは別バージョン (1.2.0.0) から継承したものでしょう。

さらに言うと、コンポーネントのいくつかはリリース間で変更されないため、
理論上それらのファイルバージョンは保持されるべきです。

しかし、ファイルバージョンが製品バージョンと同一に保たれることは多く、
（少なからず開発者に対して）混乱を引き起こしがちです。
第10回オフラインリアルタイムどう書く Erlang による実装

http://nabetani.sakura.ne.jp/hena/ord10haniwa/
「ハニカム歩き」をErlangでやってみました。

首を左側に傾けた状態でマップを正方形に見立てました。X軸が左下から右上に通るイメージです。

マップの周囲を「!」で囲むことで、マップ外かどうかの判定を手抜きしています。

だんだん慣れてきたようで、40分くらいで完成しました。

```erlang:honeycomb.erl
-module(honeycomb).
-compile(export_all).

map() -> [
  "!!!!!!!!!",
  "!ijkT!!!!",
  "!hRSHU!!!",
  "!gQGBIV!!",
  "!fPFACJW!",
  "!!eOEDKX!",
  "!!!dNMLY!",
  "!!!!cbaZ!",
  "!!!!!!!!!"].

dir() -> [{0,-1}, {1,0}, {1,1}, {0,1}, {-1,0}, {-1,-1}].

solve(Data) ->
  [chr(5, 5) | walk(lists:map(fun(X) -> X - $0 end, Data), 5, 5)].

walk([], _, _) -> [];
walk([H|T], X, Y) ->
  {DX, DY} = lists:nth(H + 1, dir()),
  {NX, NY} = {X + DX, Y + DY},
  case chr(NX, NY) of
    $! -> [$! | walk(T, X,  Y)];
    C  -> [C  | walk(T, NX, NY)]
  end.

chr(X, Y) -> lists:nth(X, lists:nth(Y, map())).

tests() ->
  test("135004", "ACDABHS"),           % #0
  test("1", "AC"),                     % #1
  test("45540523454", "AFQh!i!RQg!!"), % #44
  test("42434302545", "AFEOd!!ONOef"). % #45

test(Data, Expected) ->
  Result = solve(Data),
  io:fwrite("~p: ~s -> ~s~n", [Result =:= Expected, Data, Result]).
```
【MySQL】パーティショニングをやってみた

とあるポータルサイトにて膨大なデータ数（約1,000万）のテーブルにアクセスする必要性が出てきた。そのままではDBの負荷が上がることが想定されるため、とりあえず負荷を減らすためにもパーティショニングでデータを小分けにして負荷を上げない対策を講じる。その時の備忘録。

**パーティショニングを既存テーブルに追加する時の注意点**

* 対象となるカラムをprimary keyに含める
* 最初、パーティショニングをするために使用するカラム（日付型）を主キーに含めていなかった。
* それで実行しようとするとエラーが発生。
* そもそもの主キーのカラムがオートインクリメントされるカラムなので、まずはこれを削除して、主キーに追加した。

ここで使ったSQL

```sql:sql
ALTER TABLE `テーブル名` DROP COLUMN 'もともと主キーだったカラム';
ALTER TABLE `テーブル名` ADD PRIMARY KEY (`パーティショニングで使用するカラム`);
```


**年月でパーティショニング**

* 今回の要件として、日毎の集計データを年月でパーティショニング
* 年月でパーティショニングするためにサブパーティショニング（複合パーティショニング）を使用
* どうやらサブパーティショニングにはRANGEが使えないらしい

```sql:sql
ALTER TABLE `テーブル名`
PARTITION BY RANGE (YEAR(`カラム`))
SUBPARTITION BY HASH (MONTH(`カラム`))
SUBPARTITIONS 12 (
    PARTITION p_2012 VALUES LESS THAN (2012),
    PARTITION p_2013 VALUES LESS THAN (2013),
    PARTITION p_2014 VALUES LESS THAN (2014)
);
```



**さぁ、確認**

```sql:sql
SELECT
TABLE_SCHEMA,TABLE_NAME,PARTITION_NAME,PARTITION_ORDINAL_POSITION,TABLE_ROWS
FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_NAME = 'テーブル名';
```
テキストファイルのエンコーディングを自動判定して処理する


テキストのエンコーディングを調べるには、
片っ端からdecodeしてみてデコード成功したものを利用するといいらしい。

```py:
def conv_encoding(data):
    lookup = ('utf_8', 'euc_jp', 'euc_jis_2004', 'euc_jisx0213',
            'shift_jis', 'shift_jis_2004','shift_jisx0213',
            'iso2022jp', 'iso2022_jp_1', 'iso2022_jp_2', 'iso2022_jp_3',
            'iso2022_jp_ext','latin_1', 'ascii')
    encode = None
    for encoding in lookup:
      try:
        data = data.decode(encoding)
        encode = encoding
        break
      except:
        pass
    if isinstance(data, unicode):
        return data,encode
    else:
        raise LookupError

#ファイル読込とエンコーディングの調査
fp = open(path,'r')
str,encoding = None,None
try:
  str,encoding = conv_encoding(fp.read())
finally:
  fp.close()

#内容の編集
...<任意のコード>


#元のエンコーディングでファイル書き込み
fp = open(path,'w')
try:
  fp.write(str.encode(encoding))
finally:
  fp.close()

```
MacのEclipseでJavaを読む時に使えると便利なショートカットを最低限集めた


Java を読む機会がたまにある。そんな時、いつも Eclipse のショートカットキーをググってるので、必要最低限覚えておくと幸せになれるショートカットキーをメモしておく。

|ショートカットキー|意味|コマンド名|
|:------------------------|:------|:-------------|
|F3|メソッド/クラスの定義元にジャンプ|Open Declaration|
|cmd + [|ジャンプする前の位置に戻る|Backword History|
|ctrl + option + h|呼び出し元一覧を表示|Open Call Hierarchy|

以上。後は左右クリックとスクロールさえできれば、何となく読めるはず。
（というより、これ以外に使ったことがない）
（ので、これ以外に覚えておくと便利なショートカットキーがあったらおしえて下さい）
setter, getter


デコレータを利用しない

```
class Poko:
	def __init__(self):
		self._hoge = "hoge"

	def get_hoge(self):
		return self._hoge

	def set_hoge(self, value):
		self._hoge = value

	def del_hoge(self):
		del self._hoge

	hoge = property(get_hoge, set_hoge, del_hoge)
```

する

```
class Poko:
	def __init__(self):
		self._hoge = "hoge"

	@property
	def hoge(self):
		return self._hoge

	@hoge.setter
	def hoge(self, value):
		self._hoge = value

	@hoge.deleter
	def hoge(self):
		del self._hoge
```

実行は

```
poko = Poko()
poko.hoge = "pokopoko"
print poko.hoge
del poko.hoge
```

みたいに
デコレータ


@hoge
みたいなやつ

```
def poko(func):
	print "poko"
	return "poko_string"

@poko
def hoge():
	pass
```

で

```
def hoge():
	pass
hoge = poko(hoge)
```

と同じ。
実際はfunctoolのwraps関数を使ったり

```
from functools import wraps

def poko(func):
	@wraps(func)
	def wrapper(*args, **kwargs):
		""" 加えたい動作 """"
		# do pokopoko
		# add hogehoge とか
		return func(*args, **kwargs)
	return wrapper

@poko
def hoge():
	pass
```

みたいに
MacVim の挙動をオリジナルの vi に近づける .gvimrc ファイル

需要は全くないと思いますが *MacVim(1)* の挙動をオリジナルの *vi(1)* に近づけるための **.gvimrc** ファイルを晒してみます。
この **.gvimrc** を適用すると単色による表示で、最小限の情報しか表示されませんのでスッキリした画面になります。
ただし行末のBSの扱いなど、一部はオリジナルの *vi(1)* の挙動とは異なる設定となっています。

```
" 色指定
" スペシャルキャラクタ (^@ 等)
hi SpecialKey guifg=#ffebcd guibg=#565656
" テキスト以外 (EOF 以降の~ 等)
hi NonText ctermfg=NONE guifg=#ffebcd guibg=#565656
" エラーメッセージ
hi ErrorMsg guifg=#ffebcd guibg=#565656
" 最後の検索結果
hi Search guifg=#ffebcd guibg=#565656
" -- 継続 --
hi MoreMsg guifg=#ffebcd guibg=#565656
" -- 挿入 --
hi ModeMsg guifg=#ffebcd guibg=#565656
" 行番号
hi LineNr guifg=#ffebcd guibg=#565656
" 質問メッセージ
hi Question guifg=#ffebcd guibg=#565656
" set all などのタイトル
hi Title guifg=#ffebcd guibg=#565656
" 警告メッセージ
hi WarningMsg guifg=#ffebcd guibg=#565656
" 通常テキスト
hi Normal guifg=#ffebcd guibg=#565656
" カーソル
hi Cursor guifg=#565656 guibg=#ffebcd
" 日本語入力時のカーソル
hi CursorIM guifg=#565656 guibg=#ffebcd
" IME 制御
set noimdisable
set iminsert=0 imsearch=0
set noimcmdline
"inoremap :set iminsert=0
" 構文ハイライトを無効にする
syntax off
" ツールバーを表示しない
set guioptions-=T
" フォント指定
set guifont=Osaka-Mono:h18
" カーソルの点滅を抑止
set guicursor=a:blinkon0
" インデントや行末を BS で削除可能とする
set backspace=indent,eol,start
" バックアップファイルは作成しない
set nobackup
" スワップファイルは作成しない
set noswapfile
" 検索文字列に大文字が含まれる場合は case sencitive な検索を実行
set smartcase
" インクリメンタルサーチを無効にする
set noincsearch
" 検索文字列の強調表示を無効にする
set nohlsearch
" ウィンドウタイトル変更機能を無効にする
set notitle
" コマンドの表示機能を無効にする
set noshowcmd
" 括弧マッチ機能を無効にする
set noshowmatch
" ステータス行の表示を抑止する(emacs じゃない）
set laststatus=0
" 行追加した時に直上の行のインデントを継承する
set autoindent
" タブストップは 4バイト幅
set tabstop=4
" バッファ中でもタブストップは 4バイト幅
set softtabstop=4
" インデント幅も 4バイト幅
set shiftwidth=4
" 起動時のメッセージを抑止
set shortmess+=I
" wrapscan メッセージを抑止
set shortmess+=s
" ファイル書込時のメッセージを抑止
set shortmess+=W
" ファイルの行数/文字数メッセージを標準的な形式に
set shortmess-=l
" ???
set guioptions-=T
" デフォルト45行
set lines=45
" 記号は強制的に倍角とみなす
set ambiwidth=double
" 文字コード
set termencoding=utf-8

```
ビルドツール prunt を作ってみました


仕事で grunt を使っていましたが、日日肥大化する Gruntfile を生理的に受け付けなく、自分でビルドツールを作ってみました。

## じゃあどんなのが欲しいのか
* ビジュアル的に分かりやすいワークフロー
* ファイルの読み書きは最初と最後だけ
* シンプルなプラグイン
* Cakefileや他のCLIとの互換性

## Prunt
Githubリポジトリ: [hden/prunt](https://github.com/hden/prunt)
インストールは`npm install prunt`

> A prunt is a small blob of glass fused to another piece of glass to help provide a firm grip in the absence of a handle.
> -- modified from [Wikipedia](http://en.wikipedia.org/wiki/Prunt).

### この記事を読んで分かること

* pruntを作ったきっかけ
* 基本的な使い方

## ビジュアル的に分かりやすいワークフロー
Promiseを使って`.then`メソッドチェーンを使いました。

    # pseudocode
    read('src/*.coffee') # returns a promise
      .then(concat)
      .then(compile)
      .then(uglify)
      .done(write) # write to disk

## ファイルの読み書きは最初と最後だけ
Gruntを使っているときに中間生産物をハードディスクに書き出す事が有りますね？それを次のタスクの`src`に指定して使う事を非合理に思います。一回ファイルを読み込み、色々いじって、最後にだけ書き出す。

## シンプルなプラグイン
現在入っているプラグインは以下の通りです

* Concatenate files
* Clean files and folders
* Compile coffee-script
* Compile LESS
* Minify JavaScript
* Minify CSS

使い方はいかにも簡単、先ほどのサンプルとあまり変わりません。

    # real code
    {read} = prunt = require 'prunt'

    concat = prunt.concat {filename: 'index.coffee'}
    coffee = prunt.coffee()
    write = prunt.write()

    read('src/*.coffee')
      .then(concat)
      .then(coffee)
      .done(write)

これから導入する予定は

* [usemin Prepare](https://github.com/yeoman/grunt-usemin)
* Compile Sass


## Cakefileや他のCLIとの互換性
pruntにはCLI機能が入っていません、お好きなものを使ってください。coffee-scriptユーザーにはCakefileに入れたら丁度良いでしょう。

以下がprunt自身のCakefileです、見ての通り先ほどのサンプルとあまり変わりません。**そのシンプルさが売りです！**

    {read} = prunt = require 'prunt'

    concat = prunt.concat {filename: 'index.coffee', dirname: '.'}
    coffee = do prunt.coffee
    write = do prunt.write

    task 'build', 'build prunt', ->
      read('src/*.coffee')
        .then(concat)
        .then(coffee)
        .done(write)


## 次の投稿で話す予定
* pruntプラグインの書き方
* Cakeや他のCLIとのコラボ
Test::MockObject::Extendsで手作りオブジェクトスパイ

単体テストなどで「あるオブジェクトの特定のメソッドが呼ばれたかどうか」を検証したい時はスパイ(Spy)を使うといい。[Test::MockObject::Extends](https://metacpan.org/module/Test::MockObject::Extends)を使うと、以下のようにしてスパイを実現できる。

```perl:spy.t
package Sample;  ######## Test target object
use strict;
use warnings;

sub new {
    my ($class) = @_;
    return bless {}, $class;
}

sub foo {
    return "bar";
}

package main;    ######## Test code
use strict;
use warnings;
use Test::More;
use Test::MockObject::Extends;

my $sample = Sample->new;
my @foo_log = ();

Test::MockObject::Extends->new($sample);
my $original = $sample->can("foo");
$sample->mock(foo => sub {
    push(@foo_log, [@_]);
    goto $original;
});

is($sample->foo,             "bar", "1st foo");
is($sample->foo(2),          "bar", "2nd foo");
is($sample->foo(3, "three"), "bar", "3rd foo");

is_deeply(\@foo_log, [ [$sample], [$sample, 2], [$sample, 3, "three"] ], "log OK");

done_testing;
```

ポイントは、

```perl
my $original = $sample->can("foo");
```

を、モックメソッドの定義前に呼び出してオリジナルメソッドのcoderefを取得しておく点。モックメソッド内で`goto $original`とすれば何事もなかったかのようにオリジナルメソッドを実行できる。

# 別の方法？

* [Test::MockModule](https://metacpan.org/module/Test::MockModule)でもほぼ同じ方法が使える。こちらはTest::MockModuleオブジェクトからオリジナルメソッドを取得できる。
* もうちょっと高級な方法が好みなら[Test::Mock::Recorder](https://metacpan.org/module/Test::Mock::Recorder)や[Test::Double](https://metacpan.org/module/Test::Double)がよさそう。
* メソッドではなく単純なcoderefのスパイなら[Sub::Spy](https://metacpan.org/module/Sub::Spy)というモジュールが使えそう。
[Git] fatal: The remote end hung up unexpectedly.  fatal: write error: Broken pipe

fatal: The remote end hung up unexpectedly
[p}��>d������M�0i�`�ʤq   �6Zo�Zlٓ�_79��>/�
�}!��'

fatal: write error: Broken pipe

参考：http://blog.lukebennett.com/2011/07/25/git-broken-pipe-error-when-pushing-to-a-repository/

解決方法
・git config http.postBuffer 209715200


僕はコレで動いた
第11回オフラインリアルタイムどう書くの参考問題 Erlang による実装

http://qiita.com/Nabetani/items/c206fbc645c255cb7de6
「等差数列」をErlangでやってみました。1時間ちょいかかりました。

```erlang:tousa.erl
-module(tousa).
-compile(export_all).

% "012abku" -> [0,1,2,10,11,20,30].
to_num([])    -> [];
to_num([H|T]) ->
  case H =< $9 of
    true  -> [H - $0      | to_num(T)];
    false -> [H - $a + 10 | to_num(T)]
  end.

solve(Data) ->
  element(1, lists:max(lists:map(fun add_length/1, find(to_num(Data))))).

add_length(L) -> {length(L), L}.

find(List)        -> find(List, List).
find([], _)       -> [];
find([A], _)      -> [[A]];
find([H|T], List) -> find2(H, T, List) ++ find(T, List).

% 0, [1,2,10,11,20,30], [0,1,2,10,11,20,30]
%   -> [[0,1,2],[0,2],[0,10,20,30],[0,11],[0,20],[0,30]]
find2(_, [], _)       -> [];
find2(A, [B|T], List) -> [find3(A, B - A, List) | find2(A, T, List)].

% 10, 1, [0,1,2,10,11,20,30] -> [10,11].
find3(Num, Diff, List) ->
  case lists:member(Num, List) of
    true  -> [Num | find3(Num + Diff, Diff, List)];
    false -> []
  end.

tests() ->
  test("12345abcz", 5),           % #0
  test("012abku", 4),             % #1
  test("158achklmqstwy", 3),      % #48
  test("012346abceghjknortv", 5). % #49

test(Data, Expected) ->
  io:fwrite("~s -> ~w ~w~n", [Data, Expected, solve(Data) == Expected]).
```
Macで「開発元が未確認のため開けません」とエラーが表示されてアプリが開けない場合の対応


Mac OS X 10.8でMacVimを開こうとしたところ標記のエラーが発生した。アプリケーションの実行許可の設定を一時的に緩和してからアプリケーションを開くと、以後は実行許可の設定を元に戻しても開くことができるようになる。

1. 「システム環境設定」→「セキュリティとプライバシー」を開く
2. 「ダウンロードしたアプリケーションの実行許可」を「すべてのアプリケーションを許可」に変更
3. エラーで開けなかったアプリケーションを開く
4. 「ダウンロードしたアプリケーションの実行許可」を元に戻す
mysqldumpでviewを除外する


*mysqldump(1)* コマンドを利用してフルダンプした MySQL データベースを *mysql(1)* コマンドを利用してレストアする際に、view が含まれていると正しくレストアできない場合がある様なので、*mysqldump(1)* を実行する際にviewを除外するためのスクリプトです。
このスクリプトでフルダンプを取得すると view の情報が含まれないので、レストア時にエラーにはならないと思います。
view 情報は show create view の結果を出力していますので、レストア時にこちらを実行すればviewも作成されると思います。

アカウント情報を平文で格納するので運用には十分注意して下さい。

```sh
#!/bin/sh
logfile=/var/log/${0##*/}.log
backup=/var/db/backup/db_backup.sql
createview=/var/db/backup/create_view.sql

# for MySQL
table=テーブル名
user=ユーザ
pass=パスワード
mysql="/usr/bin/mysql -u${user} -p${pass} -B -N -s -r "
mysqldump="/usr/bin/mysqldump -u${user} -p${pass}"
sql="select TABLE_NAME from information_schema.TABLES
    where TABLE_SCHEMA = '${table}' and TABLE_TYPE = 'VIEW';"

exec > ${logfile} 2>&1

# delete old file
rm -f ${backup}

# get view name(s) for exclude dump
for i in `${mysql} ${table} -e "${sql}"`
do
    view="${view} --ignore-table=${table}.${i}"
    ${mysql} ${table} -e "show create view ${i}"
done > ${createview}

# get MySQL dump
${mysqldump} ${view} ${table} > ${backup}
```
Android4.2のストレージ周りのパス(備忘録)

# アプリケーションパッケージ名
* com.example.storagechecker

# 所有者

| 取り方 | 結果 |
|:-----------|:-----------|
|EXTERNAL_STORAGE| /storage/emulated/legacy|
|getDataDirectory()|/data|
|getDownloadCacheDirectory()|/cache|
|getExternalStorageDirectory()|/storage/emulated/0|
|getExternalStorageState()|mounted|
|getRootDirectory()|/system|
|isExternalStorageEmulated()|true|
|isExternalStorageRemovable()|false|
|getFilesDir()|/data/data/com.example.storagechecker/files|
|getCacheDir()|/data/data/com.example.storagechecker/cache|
|getExternalFilesDir()|/storage/emulated/0/Android/data/com.example.storagechecker/files|
|getExternalFilesDir(Music)|/storage/emulated/0/Android/data/com.example.storagechecker/files/Music|
|getExternalFilesDir(Mydata)|/storage/emulated/0/Android/data/com.example.storagechecker/files/mydata|
|getExternalStoragePublicDirectory()|/storage/emulated/0/Pictures|
|getExternalCacheDir()|/storage/emulated/0/Android/data/com.example.storagechecker/cache|

# 追加ユーザ1

| 取り方 | 結果 |
|:-----------|:-----------|
|EXTERNAL_STORAGE|/storage/emulated/legacy|
|getDataDirectory()|/data|
|getDownloadCacheDirectory()|/cache|
|getExternalStorageDirectory()|/storage/emulated/10|
|getExternalStorageState()|mounted|
|getRootDirectory()|/system|
|isExternalStorageEmulated()|true|
|isExternalStorageRemovable()|false|
|getFilesDir()|/data/user/10/com.example.storagechecker/files|
|getCacheDir()|/data/user/10/com.example.storagechecker/cache|
|getExternalFilesDir()|/storage/emulated/10/Android/data/com.example.storagechecker/files|
|getExternalFilesDir(Music)|/storage/emulated/10/Android/data/com.example.storagechecker/files/Music|
|getExternalFilesDir(Mydata)|/storage/emulated/10/Android/data/com.example.storagechecker/files/mydata|
|getExternalStoragePublicDirectory()|/storage/emulated/10/Pictures|
|getExternalCacheDir()|/storage/emulated/10/Android/data/com.example.storagechecker/cache|

# 追記
* 追加ユーザ2を作成して取得すると、/storage/emulated/11になっていた
n 進数（ 3 進数なども）を相互に変換する

2, 8, 10, 16 進数以外を相互に変換するプログラムが見当たらなかったので作りました。
コンストラクタに引数を与えれば 17 進数以上も相互に変換できます。

```cpp:
#include<string>
#include<iostream>

class Radix {
private:
  const char* s;
  int a[128];
public:
  Radix(const char* s = "0123456789ABCDEF") : s(s) {
    int i;
    for(i = 0; s[i]; ++i)
      a[(int)s[i]] = i;
  }
  std::string to(long long p, int q) {
    int i;
    if(!p)
      return "0";
    char t[64] = { };
    for(i = 62; p; --i) {
      t[i] = s[p % q];
      p /= q;
    }
    return std::string(t + i + 1);
  }
  std::string to(const std::string& t, int p, int q) {
    return to(to(t, p), q);
  }
  long long to(const std::string& t, int p) {
    int i;
    long long sm = a[(int)t[0]];
    for(i = 1; i < (int)t.length(); ++i)
      sm = sm * p + a[(int)t[i]];
    return sm;
  }
};

int main() {
    Radix r;
    // 10 進数を n 進文字列に
    std::cout << r.to(255, 10) << std::endl; // => "255"
    std::cout << r.to(255, 12) << std::endl; // => "193"
    std::cout << r.to(255, 16) << std::endl; // => "FF"
    
    // n 進文字列を 10 進数に
    std::cout << r.to("255", 10) << std::endl; // => 255
    std::cout << r.to("255", 14) << std::endl; // => 467
    
    // n 進文字列を m 進文字列に
    std::cout << r.to("255", 7, 11) << std::endl; // => "116"
    std::cout << r.to("255", 11, 7) << std::endl; // => "611"
    return 0;
}
```
MacOSXでAirStationなどのNAS上にTimeMachineで暗号化しつつバックアップする

# 経緯

MacOSXでTimeMachineでバックアップを取るとき、
標準だと直接つないだUSBディスクかTimeCapsuleでないと対象にできません。
利便性を考えるとやはりNAS上にバックアップを取りたいのですが、
家のルーターは[バッファローのルーター](http://buffalo.jp/product/wireless-lan/ap/wzr-900dhp/)なのでわざわざTimeCapsuleに置き換えたくはありませんでした。
それに以前買った[USBディスク](http://www.lacie.jp/portable/lch-rk3/index.html)があり、ルーターにUSBでつなげるとNASになる機能があったので、
これでTimeMachineしたいなぁと思いました。
更に暗号化もしておきたいと思いました。

いろいろ調べたらうまく行ったので、その方法を共有します。

## 検証環境

- マシン: MacBook Air 11inch, Mid 2013
- OS: Mac OS X Mountain Lion

# 手順

アプリケーション→ユーティリティ→ディスクユーティリティを起動します。
「新規イメージ」から仮想ディスクを作成し、デスクトップなど適当なところに保存します。

![01.jpg](https://qiita-image-store.s3.amazonaws.com/0/20130/e3e351d2-88f7-b450-c29c-949a54d58c67.jpeg)

設定は以下の通り。

- 名前(上部): 仮想ディスクのファイル名です。なんでもいいです。
- 名前(下部): ディスク名です。マウントするときの名前になります。なんでもいいです。
- サイズ: 仮想ディスクの最大サイズになるので、マシンの容量の1.5倍ぐらいを指定しておきましょう。イメージフォーマットでスパースバンドルを選ぶので、仮想ディスクの中身が書き込まれるまではファイルサイズは大きくならないため、マシン容量を超えた値を設定可能です。なお、もし足りなくなった場合、後から拡大することが可能です。
- フォーマット: デフォルト値。
- 暗号化: 暗号化する場合は、ここで暗号化を選択しておきます。
- パーティション: デフォルト値。
- イメージフォーマット: スパースバンドルを指定しましょう。

作成ボタンを押すとパスワード設定になります。
今後自動でディスクがマウントされるよう、キーチェーンに保存しておきましょう。

![02.jpg](https://qiita-image-store.s3.amazonaws.com/0/20130/9f12092c-a3b4-134b-c21d-84a35d83d695.jpeg)

作成できたら、取り出すボタンを押してアンマウントします。

![03.jpg](https://qiita-image-store.s3.amazonaws.com/0/20130/00d63553-a076-a4bb-bd02-273a191607fc.jpeg)

アンマウントしたら、作成した仮想ディスクをNAS上にコピーします。
マシン側の仮想ディスクはこの時点で削除します。

![04.jpg](https://qiita-image-store.s3.amazonaws.com/0/20130/4c7bff11-2ae3-9c71-c18b-59c29f5c35c8.jpeg)

NAS上にコピーできたら、はじめに作った仮想ディスクがすでにアンマウントされていることを確認した後、
NAS上の仮想ディスクをダブルクリックしてマウントします。

ターミナルを開き、マウントされていることを確認します。

~~~
$ ls /Volumes/
~~~

大丈夫だったら、以下のコマンドでTime Machineのバックアップ先としてそのディスクを指定します。

~~~
$ sudo tmutil setdestination /Volumes/<ディスク名>
~~~

![05.jpg](https://qiita-image-store.s3.amazonaws.com/0/20130/bc6073f0-b5fc-be09-f030-46f96d1a28f2.jpeg)

これで無事、Time Machineがセットアップされます。
お疲れ様でした。

![06.jpg](https://qiita-image-store.s3.amazonaws.com/0/20130/a0d9dedb-58bb-d543-5339-1e2d2a4ca3ad.jpeg)

# 補足

ネット上を調べると、TMShowUnsupportedNetworkVolumesを設定するとか、バンドルイメージ名にMACアドレスをつけるとかいう情報が出てくるのですが、
この手順の場合それらは不要でした。
おそらく上記のパターンはNASがAFPに対応している場合のセットアップ方法なのですが、
今回の手順ではAFP非対応、SMBのみのNASでセットアップできます。

なお、FileVault2とTimeMachineの併用時での暗号化構成と、
今回のディスクイメージそれ自体の暗号化が、
内部的に同様の構成になっているかどうかはわからないのでご了承ください。
GitLab 5.3がリリース

### GitLab 5.3での3つの重要な改善

1. リポジトリグラフ
1. プロジェクトへのHipChat/Campfireサービスの統合
1. コードスニペットの機能強化

[[詳細を表示](http://hiroponz.hateblo.jp/entry/2013/06/23/225812)]
replaceに変数を使ってグローバルマッチさせる2つの方法

##やりたいこと
index.htmlの**全ての**「も」を「M」に置換したいとします。

```html:index.html
<p id='test'>すもももももももものうち</p>
```

##問題
置換したい文字列を変数beforeに代入します。変数beforeをreplaceにそのまま入れると、最初の該当箇所しか置換されません。

```js:test1.js
var before = "も";
var after = "M";
var txt = $("#test").html();

var replaceText = txt.replace(before,after);
$("#test").html(replaceText);
//出力結果:すMももももももものうち
```


##解決策1
該当箇所全てを置換するにはRegExp オブジェクトにグローバルマッチのフラグ (g)をつけます。

```js:test2.js
var replaceText = txt.replace(new RegExp(before,"g"),after);
//出力結果:すMMMMMMMMのうち
```

##解決策2
変数beforeに最初からフラグをつけておきます。

```js:test3.js
var before = /も/g;
var after = "M";
var txt = $("#test").html();

var replaceText = txt.replace(before,after);
$("#test").html(replaceText);
//出力結果:すMMMMMMMMのうち
```

・参考ページ
String.replace - JavaScript | MDN(https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/replace)
emacsでコピーした内容をOSのクリップボードと同期する方法（Mac)


.emacsファイルに以下の内容を追記してemacsを再起動するだけ。

```.emacs
(defun copy-from-osx ()
 (shell-command-to-string "pbpaste"))

(defun paste-to-osx (text &optional push)
 (let ((process-connection-type nil))
     (let ((proc (start-process "pbcopy" "*Messages*" "pbcopy")))
       (process-send-string proc text)
       (process-send-eof proc))))

(setq interprogram-cut-function 'paste-to-osx)
(setq interprogram-paste-function 'copy-from-osx)
```

これで、emacsでコピー、カットした内容を他のアプリケーションにペースト出来るようになる。

最高です。
DOMDocument::loadHTML が meta の charset を解釈してくれない問題と対策

#概要
HTMLソースに「&lt;meta charset="…" />」が指定してあっても DOMDocument::loadHTML は文字コード解釈に失敗することがあるよ、というお話。

#実験対象
Qiita のトップページ。「&lt;meta charset="UTF-8">」という記述があり、DOMDocument はこれを解釈できそうに見えます。

```html:qiita.html
<!DOCTYPE html>
<html xmlns:og="http://ogp.me/ns#">
    <head><script type="text/javascript">var NREUMQ=NREUMQ||[];NREUMQ.push(["mark","firstbyte",new Date().getTime()]);</script>
    <meta charset="UTF-8">
    <title>Qiita [キータ] - プログラマの技術情報共有サービス</title>
    …
```

#サンプルコード

```dom_charset.php
<?php
$url = "http://qiita.com/";
$body = file_get_contents($url);
$dom = new DOMDocument();
@$dom->loadHTML($body);
$title = $dom->getElementsByTagName('title')->item(0)->textContent;
print "$title\n";
```

#サンプル実行結果

```bash
$ php dom_charset.php 

      Qiita [ã­ã¼ã¿] - ãã­ã°ã©ãã®æè¡æå ±å±æãµã¼ãã¹
```
文字化けだ！／(^o^)＼


#原因・対策
##原因
環境によるかもしれないが、少なくとも自分の環境 (PHP 5.3.3) では、
どうやら DOMDocument::loadHTML は「&lt;meta charset=…」ではなく「&lt;meta http-equiv=…」のタグ情報を元に文字コードを判定しているらしい。

```html:
<!-- これがあっても意味がない -->
<meta charset="UTF-8" />

<!-- こっちを解釈する -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
```

##コード修正

全サイトの管理者に「&lt;meta http-equiv=…」のタグを埋め込んでもらうことを期待するのは現実的ではないので、
取得したHTMLソースを置換してやると良い。（今回はあくまでも対症療法として単純な置換で済ませます）

```dom_charset2.php
<?php
$url = "http://qiita.com/";
$body = file_get_contents($url);
$body = str_replace('<meta charset="UTF-8">', '<meta charset="UTF-8"><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">', $body);
$dom = new DOMDocument();
@$dom->loadHTML($body);
$title = $dom->getElementsByTagName('title')->item(0)->textContent;
print "$title\n";
```

##実行結果

```bash:
$ php dom_charset2.php 

      Qiita [キータ] - プログラマの技術情報共有サービス
```
直った！＼(^o^)／
CPythonからJavaのクラスを呼び出す(Py4J)

PythonからJavaのライブラリを呼び出して使う方法には以下のようなものがあります。


### Jython

http://www.jython.org/

インタプリタ自体がJavaで実装されているので、Pythonスクリプトの中で
Javaのクラスや標準ライブラリがそのまま使えます。
一番手っ取り早いですが、CPythonとの互換性が問題になります。
（CPythonの標準ライブラリが一部対応していないなど）

Jythonでjarファイルを呼び出す方法についてはこちら
http://qiita.com/mojaie/items/9add34871a43c4181af7


### JPype

http://jpype.sourceforge.net/

CとJavaを連携するJNIを介して、PythonからJavaクラスを呼び出します。
CPythonからJavaをスムーズに呼び出せますが、インストール作業が非常に面倒です。
（Cコンパイラなど依存モジュールの相性によってはインストールすら出来ないことも）


### Py4J

http://py4j.sourceforge.net/

Javaの仮想マシン上でサーバを起動し、ソケット通信でCPythonとJavaを連携します。
上述の方法に比べると動作が遅いですが、JavaとPythonが完全に独立しているので、
比較的簡単に環境が構築でき、パッケージ化も容易です。


今回は、Py4Jを用いてjarファイルを呼び出す方法を紹介します。



## インストール

```
pip install py4j
```

python、javaをインストールしてない場合はインストールしてください。
インストールフォルダ（shareフォルダ？）にpy4j0.7.jarというファイルが含まれているので、
適当な場所にコピーしてJavaのCLASSPATHを通しておきます。


## Javaサーバプログラムの作成

まず、既存のjavaクラスを呼び出すためのサーバ用クラスを作ります。
下記は、JClassというクラスのgetStringというメソッドを呼び出すための
JClassEntryPointクラスの例です。


```java:JClassEntryPoint.java

import py4j.GatewayServer;

public class JClassEntryPoint {

	private JClass jclass = null;

	public JClassEntryPoint() {
		this.jclass = new JClass();
	}
	
	public String getString(String str) {
		return jclass.getString();
	}

	public static void main(String[] args) {
		GatewayServer gatewayServer = new GatewayServer(new JClassEntryPoint());
		gatewayServer.start();
	}
}

class JClass {

	private String str = "hogehoge";

	public String getString(String str) {
		return this.str;
	}
}

```

JClassEntryPoint.javaを実行可能なjarファイルにしておきます。



## 呼び出し側Pythonスクリプトの作成

まずsubprocessを使って上述のjarファイルを実行します。
サーバが起動し、JavaGatewayを介してJavaのクラスを読み込めるようになります。
また、atexit.register()を使うことで、Pythonスクリプト終了時に
自動的にサーバを終了させることができます。
time.sleep(2)はサーバが起動する前にJavaGatewayがサーバと通信しようとするのを
防ぐための苦肉の策です。もっといい方法があると思います。

```py:jclassclient.py

import atexit
import subprocess
import time
from py4j.java_gateway import JavaGateway


class JClassClient(object):

    def __init__(self):
        self._gateway = None
        self._process = None
        cmd = ["java", "-jar", "/path/to/jarfile/JClassEntryPoint.jar", "JClassEntryPoint"]
        self._process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stdin=subprocess.PIPE)
        print "jvmprocess started: " + str(self._process.pid)
        atexit.register(self._process.kill)
        time.sleep(2)
        self._gateway = JavaGateway()

    def getString(self):
        return self._gateway.entry_point.getString()


def main():
    client = JClassClient()
    print client.getString()

if __name__ == "__main__":
    main()
```