OmniAICreator/Qiita-1.07M huggingface dataset:
laravelを使ってみる。インストールから簡単なアプリまで。【2】

http://qiita.com/ms2sato/items/3fe8db44be76647ed7a9
の続き

 # マイグレーション
app/config/database.php
を修正して自分の環境に合わせた。

下記をやってみる。

```bash:
$ php artisan migrate:make create_users_table
Laravel requires the Mcrypt PHP extension.
```

Mcryptというのを入れれば良いらしいがちょっと調べたら下記が引っかかった。MAMP入れていれば入っているようだからパスを設定すれば大丈夫とのこと。
http://stackoverflow.com/questions/16830405/laravel-requires-the-mcrypt-php-extension

自分の所は5.4.3が入っていたので合わせて修正。

```bash:.bash_profile
export PATH=/Applications/MAMP/bin/php/php5.4.3/bin:$PATH
```

コンソール再起動。

```bash:
$ php artisan migrate:make create_users_table
Created Migration: 2013_07_13_095102_create_users_table
Generating optimized class loader
Compiling common classes
```

無事に作成できた。

マイグレーションのファイルを修正する。
どんな型が使えるかは下記を参照
http://laravel.com/docs/schema

```php:2013_07_13_095102_create_users_table.php
<?php

use Illuminate\Database\Migrations\Migration;

class CreateUsersTable extends Migration {

    public function up() {
        Schema::create('users', function($table) {
                    $table->increments('id');
                    $table->string('serial')->unique();
                    $table->integer('status');
                    $table->timestamps();
                });
    }

    public function down() {
        Schema::drop('users');
    }

}
```

準備ができたのでマイグレーション実行。

```bash:
$ php artisan migrate
Migration table created successfully.
Migrated: 2013_07_13_095102_create_users_table
```

続くかも？
colordiff で diff をもっと快適に

Mac やほとんどの Linux ディストリビューションではデフォルトで `diff` が使えるようになっています

しかし色つけしてくれなかったりとかするのでもっと快適にしましょう

# colordiff のインストール

`colordiff` をインストールしましょう

`brew install colordiff` とか `apt-get install colordiff` とかすれば入るはずです


# alias の設定

`.zshrc` か `.bashrc` などに自分の使っている shell に設定します

単純に `alias diff='colordiff -u'` とやってしまうと `colordiff` がインストールされていない環境で悲しい思いをするので

```bash:.bashrc
if [[ -x `which colordiff` ]]; then
  alias diff='colordiff -u'
else
  alias diff='diff -u'
fi
```

としましょう

`colordiff` がインストールされているときだけ alias の設定が有効になります

また `-u` オプションをつけると git diff の出力に近くなって楽しい感じなのでぜひ付けましょう

ただ `colordiff` の出力は `| less` としてもうまく表示できません

これは `| less -R` とすれば回避可能ですが，毎回書くのは面倒なので

```bash:bashrc
export LESS='-R'
```

としましょう

これで単純に `| less` とするだけで表示できます
Java+Swingでヘルプダイアログを作る

Java+Swingという標準機能でヘルプダイアログを作る方法です。
いわゆる普通のアプリを作る際に、ヘルプをHTMLで作っておき、そのHTMLをSwingでレンダリングさせます。

CSS3などを表示するのは普通に無理なので、この機能で表示するHTMLはあまり凝ったことをしないほうが良いです。


```java:HelpDialog.java
import java.awt.Frame;
import java.io.IOException;
import java.net.URL;

import javax.swing.JDialog;
import javax.swing.JEditorPane;
import javax.swing.JScrollPane;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
import javax.swing.event.HyperlinkEvent.EventType;
import javax.swing.text.html.HTMLDocument;

/**
 * ヘルプダイアログ
 * @author tamura shingo
 *
 */
public class HelpDialog extends JDialog {
	
    private JScrollPane scrollPane;
    private JEditorPane html;
	
    /**
     * コンストラクタ
     * @param parent 親フレーム
     * @throws IOException ファイルオープンに失敗
     */
    public HelpDialog(Frame parent, URL url) throws IOException {
        super(parent, false);
        makeDialog(url);
    }
	
    /**
     * 指定したURLを開く。
     * @param url
     */
    private synchronized void open(URL url) {
        try {
            html.setPage(url);
        }
        catch (IOException ex) {
            // ページが開けない場合は特に何もしない。
        }
    }
    
    /**
     * ダイアログを作成する。
     * @param url ヘルプファイルのURL
     * @throws IOException ファイルオープンに失敗
     */
    private void makeDialog(URL url) throws IOException {
        /*-
         * ウィンドウ情報
         * ここらへんはプロパティなどに出しておくと良さそうです。
         *
         */
        setTitle("ヘルプ");
        setSize(400, 500);
        // setIconImages(icon);

        /*-
         * HTML Viewer
         *
         */
        html = new JEditorPane();
        html.setContentType("text/html");
        html.setEditable(false);
        html.addHyperlinkListener(new HyperlinkListener() {
                @Override
                public void hyperlinkUpdate(HyperlinkEvent event) {
                    if (event.getEventType() == EventType.ACTIVATED) {
                        URL newUrl = event.getURL();
                        open( newUrl );
                    }
                }
            });
        
        HTMLDocument doc = (HTMLDocument)html.getDocument();
        doc.putProperty("IgnoreCharsetDirective", Boolean.TRUE);
	
        html.setPage( url );
	
        scrollPane = new JScrollPane(html);
        getContentPane().add(scrollPane);
    }
}

```

使い方は見ての通り、

```java:
File html = new File(file);
//URL url = new URL("file:" + file.getPath());
URL url = file.toURI().toURL();
HelpDialog dialog = new HelpDialog(null, url);
dialog.setVisible(true);
```
とやれば、HTMLファイルを表示することができます。
Scala with Datatype

# Scalaに代数型(datatype）を実装した

[Scalaに代数型(datatype）を実装する　その１](http://qiita.com/JunSuzukiJapan@github/items/cb764a8513a2eb66c7af)
[Scalaに代数型(datatype）を実装する　その２](http://qiita.com/JunSuzukiJapan@github/items/afac66e3d6ab6c09f7d8)
[Scalaに代数型(datatype）を実装する　その３](http://qiita.com/JunSuzukiJapan@github/items/afaa9b2bd2accfe68e59)

の記事のとおり、datatypeを実装したScalaを作ったので、GitHubに公開してみました。

https://github.com/JunSuzukiJapan/scala

# コンパイル方法

まずは、GitHubからソースコードを取得します。

```bash:
$ git clone https://github.com/JunSuzukiJapan/scala
```

次はコンパイルします。

```bash
$ cd scala
$ ant
```

これで、１５〜２０分ぐらいでコンパイルされます。

出来上がった実行ファイルは、

build/pack/bin

にあります。

# 動作確認

以下のコードをテキストエディタで入力して動作確認してみましょう。

```datatypeSample.scala
object datatypeSample {

  datatype Week = Mon | Tue | Wed | Thi | Fri | Sat | Sun

  val day: Week = Wed()
  val result = day match {
    case Mon() => "月曜日"
    case Tue() => "火曜日"
    case Wed() => "水曜日"
    case Thi() => "木曜日"
    case Fri() => "金曜日"
    case Sat() => "土曜日"
    case Sun() => "日曜日"
  }

  datatype Week2 {
    def isWorkday: Boolean = true
    def isHolyday: Boolean = ! isWorkday
  }
  = Mon2 | Tue2 | Wed2 | Thi2 | Fri2 | Sat2 {
      override def isWorkday = false
    }
  | Sun2 {
      override def isWorkday = false
    }

  datatype Fig =
    Rect(val x: Double, val y: Double){
      def area(): Double = x * y
    }
  | Circle(val r: Double){
      val pi = 3.14
      def area(): Double = r * r * pi
  }

  def main(args: Array[String]): Unit = {
    println("result = " + result)

    val day2: Week2 = Sun2()
    println("Sun2.isWorkday = " + day2.isWorkday)
    println("Sun2.isHolyday = " + day2.isHolyday)

    val rect = Rect(3.0, 5.0)
    val area1 = rect.area()
    val circle = Circle(10.0)
    val area2 = circle.area()
    println("rect area = " + area1)
    println("circle area = " + area2)
  }
}
```

実行方法は以下。

```bash:
$ build/pack/bin/scala datatypeSample.scala
```
laravelを使ってみる。インストールから簡単なアプリまで。【1】

http://laravel.com/docs/quick
で5分でできるって言っているのでやってみよう。
MacOSX上、アプリ名はgateという名前にしている。何でも良いけど。

# インストール

```bash
$ composer create-project laravel/laravel gate --prefer-dist
-bash: composer: command not found
```

早速躓いた。composerって何だろう。

http://www.ryuzee.com/contents/blog/5681
によると、コンポーネントのインストールの仕組みの様子。

どうやら下記の方法でインストールするようだが…？

```bash
 $ curl -s http://getcomposer.org/installer | php
#!/usr/bin/env php
Some settings on your machine make Composer unable to work properly.
Make sure that you fix the issues listed below and run this script again:

The detect_unicode setting must be disabled.
Add the following to the end of your `php.ini`:
    detect_unicode = Off

The php.ini used by your command-line PHP is: /private/etc/php.ini
If you can not modify the ini file, you can also run `php -d option=value` to modify ini values on the fly. You can use -d multiple times.

```

「detect_unicodeはdisabledですよ！」と怒っている。

```bash
sudo vi /private/etc/php.ini
```
して、php.iniの最終行に
detect_unicode = Off

再度実行。

```bash
 $ curl -s http://getcomposer.org/installer | php
#!/usr/bin/env php
All settings correct for using Composer
Downloading...

Composer successfully installed to: /Users/xxx/xxx/projects/larabel/composer.phar
Use it: php composer.phar
```

Good!。
php composer.phar
で利用できるらしい。

```bash
 $ composer create-project laravel/laravel gate --prefer-dist
-bash: composer: command not found
 $ php composer.phar create-project laravel/laravel gate --prefer-dist
```

composerを直接叩けるようにはなっていないので、php composer.pharとした。Install完了までは結構待たされる。symfonyとか入ってる。そういうものなのですか。使った事無いけど。

この時点でgate/publicのディレクトリをhtdocsに割り当てると「You have arrived.」との表示。これでインストールは終了な様子。12分経過。調べながらやったんだから5分じゃ無いけど勘弁して欲しい。

# カスタマイズ
ドキュメントの真似をする。

```php:app/controllers/UserController.php
<?php

class UserController extends BaseController {

	public function getIndex()
	{
		return View::make('user');
	}

}

```

```php:app/routes.php
<?php
Route::get('/', function()
{
	return View::make('hello');
});

Route::get('users', 'UserController@getIndex');
```

```html:app/views/user.php
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>User</title>
</head>
<body>
    User
</body>
</html>
```

してみたら、/usersで無事に画面に「User」と表示された。
http://qiita.com/ms2sato/items/5e597763cb034cad8c08
へ続く。
Qiita: 要望 Qiita内の記事引用を手軽に行えるようにしていただけると助かります。

# どういうこと？

Tipsやノウハウを書くときにQiita内での記事を参考にしたことを明示したいと思っています。
その際、引用元の記事をリンクとして貼りたいな、とか思うわけですが、

![スクリーンショット 2013-07-13 12.50.45.png](https://qiita-image-store.s3.amazonaws.com/0/3985/5f52a97f-1c50-fce3-2579-5a38e0220f7f.png)

http://qiita.con/:username/items/:item_id

以上のパスから

:username と :item_id を入力できるようなフォームを追加するUIを追加して、

"この記事は以下の記事を参考にしています"

という形でリンクが貼られるといいのかな、と思いました。
又はWebの記事作成画面に記事名を検索する窓を追加して、
そこから"参考"ボタンをクリックすると参考記事としてもりもり追加されていくとか...

自力でやればいいじゃない。Markdownだしみたいなのもあるのですが、
このようにすると記事のツリー構造を内部で作ることができそうで
おもしろ...良いんじゃないかなぁと思ったりします。
Scalaに代数型(datatype）を実装する　その２


# 字句解析器

字句解析器に手をいれていきます。

必要となるものは、"datatype"というキーワードを定義することだけです。

[Scalaのソースコードを読んでみる　その３](http://qiita.com/JunSuzukiJapan@github/items/a681c6fade80c5560e02)で書いたように、キーワードを追加するには、

1. src/compiler/scala/tools/nsc/ast/parser/Tokens.scalaにキーワード用の定数を追加する。

2. src/compiler/scala/tools/nsc/ast/parser/Scanner.scalaのallKeywordsというリストに１で定義した定数を追加する。

3. メソッドinFirstOfStat, inLastOfStat に必要に応じて、１で定義した定数を追加してやる。

4. src/reflect/scala/reflect/internal/StdNames.scala のclass Keywordsに追加したいキーワードを定義しておく。

の４つです（推測ですが）。

順番に作業していきます。

## Tokens.scalaに定数を追加

```scala:Tokens.scala
  final val LAZY = 61
  final val MACRO = 62 // not yet used in 2.10
  final val THEN = 63  // not yet used in 2.10

  final val DATATYPE = 64  // ←追加した行

  /** special symbols */
```

## Scanner.scalaのallKeywordsに定数を追加

```scala:Scanner.scala
    nme.CLASSkw     -> CLASS,
    nme.DATATYPEkw  -> DATATYPE,  // ←追加した行
    nme.DEFkw       -> DEF,
```

## Scanner.scalaのメソッドinFirstOfStat, inLastOfStat

'datatype'が「文の最初にくることが可能なトークンかどうか」というと、文の最初にくることが可能ですので、inFirstOfStatは真になります。なので、特に変更を加える必要はありません（case文に列挙されていないキーワードは真、なので）。

また、「文の最後にくることが可能なトークンかどうか」は偽になります。
よって、inLastOfStatも変更を加える必要はありません(case
文に列挙されていないキーワードは偽なので）。

## StdNames.scalaにキーワードを定義

```scala:StdNames.scala
  abstract class Keywords extends {
    private val kw = new KeywordSetBuilder

    final val ABSTRACTkw: TermName  = kw("abstract")
    final val CASEkw: TermName      = kw("case")
    final val CLASSkw: TermName     = kw("class")
    final val CATCHkw: TermName     = kw("catch")
    final val DATATYPEkw: TermName  = kw("datatype") // ←追加した行
    final val DEFkw: TermName       = kw("def")
```

字句解析器の修正は以上です。

（つづく）
RailsAdminでLogoutボタンのpathを変更するtips


RailsAdminをPassenger+サブディレクトリ下で動かしていたときに、ログアウトが出来なくなってしまったので、それを解消するためにいろいろ探っていました。
[参考ページ](http://codedecoder.wordpress.com/2013/06/18/rails_admin-custom-logout-link/)

javascriptでlogoutボタンのhrefを強引に書き換えてしまう方法を見つけたので、とりあえず応急処置を施しました。

下記のコードを追加する(admin_usersは各々のurlを確認してください)

```:app/assets/javascripts/rails_admin/custom/ui.js
jQuery(function(){
      $(document).ready(function(){
      if($("a[href='/admin_users/sign_out']").length > 0){ 
      $("a[href='/admin_users/sign_out']").attr("href", "/sample_place/admin_users/sign_out")
      }
    })
 })
```

これで、Logout時のpathが/admin_users/sign_outから/sample_place/admin_users/sign_outに変わります。


もっといい方法を知っている方いらしたら、ぜひご教授ください。
Scalaに代数型(datatype）を実装する　その１

# 代数型(datatype)を実装したい

今まで、Scalaのソースコードを読んできたのは、
case class の文法が使い勝手が悪いので、
SMLのようなdatatypeを導入したいと思ったからです。

datatypeを実装するとなると、classと同レベルの位置（構文解析上）に実装することになります。

Parsers.scala をみてみると、トップレベルで宣言されたclassと、
それ以外で宣言されたclassとでは多少扱いが違うようです。
トップレベルの処理は、メソッドtopStatSeq()からメソッドtopLevelTmplDefを呼び出して処理されています。
一方、それ以外の場合には、メソッドdefOrDcl()からメソッドtmplDef()を呼び出して処理されています。

そこで、datatypeの実装方法もトップレベルとそれ以外にわけて考えることにします。

# 文法を決める

まずは、実装したい構文の文法を決定しなければなりません。
参考にする文法は、[Soopy](http://soopy.sourceforge.jp/)の[データタイプ宣言](http://soopy.sourceforge.jp/tutorial/soopyindex.html)にします。

構文の例をあげていきます。

```scala:構文
 datatype Week = Mon | Tue | Wed | Thi | Fri | Sat | Sun
```

これをパターンマッチで次のように使いたいわけです。

```scala:使い方
val day: Week = Wed()
day match {
	case Mon() => "月曜日"
	case Tue() => "火曜日"
	case Wed() => "水曜日"
	case Thi() => "木曜日"
	case Fri() => "金曜日"
	case Sat() => "土曜日"
	case Sun() => "日曜日"
}
```

これが出来れば、case classを使うより簡単に書けるようになります。

さらに、次のようにメソッドも使えるようにしたいと思っています。

```scala:構文
datatype Week {
    def isWorkday: Boolean = true
    def isHoliday(): Boolean = ! isWorkday
  }
= Mon
| Tue
| Wed
| Thi
| Fri
| Sat {
    override def isWorkday = false
  }
| Sun {
    override def isWorkday = false
  }
```

```scala:使い方
val day1 = Mon()
val day2 = Sun()
println( day1.isWorkday )
println( day1.isHoliday )
println( day2.isWorkday )
println( day2.isHoliday )
```

もちろん、コンストラクタは引数を取る事も可能にしたいです。

```scala:構文
datatype Fig =
  Rect(val x: Double, val y: Double){
    def area(): Double = x * y
  }
| Circle(val r: Double){
    val pi = 3.14
    def area(): Double = r * r * pi
  }
```

```scala:使い方
val r = Rect(5, 7)
val c = Circle(8)
val rect_area = r.area()
val circle_area = c.area()
```

# 実装方法

Scalaにdatatypeを実装する方法を考えてみましょう。

上で書いたように、case classの文法が冗長なのをなんとかしたくて考えたのが、datatypeになります。実際にできることも、case classとほぼ同じです。
なので、ここではdatatypeをcase classに変換することで、その機能を実現しようと思います。

（つづく）
watchコマンドでディレクトリを目視監視

ディレクトリ内のファイル生成や変更を目視監視したい場合、手動でlsし続けてもいいがwatchコマンドが入っている環境であればこれを使うことで比較的楽にディレクトリ内の変化を監視できる

```bash
$ watch -n 5 -d ls -l
```

## 使用オプション
-n：画面を更新する間隔を秒で指定。指定しないと2秒がデフォルト
-d：状態変化の際に変化した部分がハイライトされる


```bash:実行結果
Every 2.0s: ls -l                                                                             Sat Jul 13 08:19:38 2013

合計 0
-rw-r--r-- 1 okisanjp okisanjp 0  7月 13 08:13 2013 test1.txt
-rw-r--r-- 1 okisanjp okisanjp 0  7月 13 08:13 2013 test2.txt
```

## 別のファイルを作ってみる

別のコンソールから新ファイルを作成

```bash
$ touch test3.txt
```

## watchコマンド実行中の画面

![SS 2013-07-13 8.27.26.png](https://qiita-image-store.s3.amazonaws.com/0/26917/31062e33-928c-3494-8786-1895acef8349.png "SS 2013-07-13 8.27.26.png")

新たなファイルが出現しハイライトされた。

## ファイルを消してみる

![SS 2013-07-13 8.29.47.png](https://qiita-image-store.s3.amazonaws.com/0/26917/cbb38593-9b4c-2b31-26c8-f6aa8a24c46a.png "SS 2013-07-13 8.29.47.png")

消えたこともわかりますね。

## 変更をstickyにする

ハイライトされた部分をずっと保持しておくことも出来る

```bash
$ watch -n 5 -d=cumulative ls -l
```

### ファイルを作ったり消したり変更したりしてみる

```bash
 touch test3.txt
$ touch test4.txt
$ echo "hoge" >> test1.txt
$ rm test4.txt
rm: remove 通常の空ファイル `test4.txt'? y
removed `test4.txt'
```

![SS 2013-07-13 8.41.55.png](https://qiita-image-store.s3.amazonaws.com/0/26917/39103d22-0eb6-a4e7-ee16-4d92b1676877.png "SS 2013-07-13 8.41.55.png")


* 新たにできたtest3.txt
* 新たにできたtest4.txt
* 更新されたtest1.txt（ファイルサイズがハイライトされてます。タイムスタンプが更新された場合そちらもハイライトされます）
* その後消えたtest4.txt

## watchについて更に知りたければ

[Man page of watch](http://linuxjm.sourceforge.jp/html/procps/man1/watch.1.html)
forとseqで連番ファイル操作


```bash
for i in `seq -w 1 31`;do touch 2013.07.$i.txt;done
```

seqコマンドにwオプションを付けることで足りない桁を0埋めしてくれることを利用して日付形式のファイル名を操作するときによく使います。

```bash:実行結果
$ for i in `seq -w 1 31`;do touch test.2013.07.$i.txt;done
$ ll
total 0
-rw-r--r--  1 okisanjp  staff    0  7 13 07:52 test.2013.07.01.txt
-rw-r--r--  1 okisanjp  staff    0  7 13 07:52 test.2013.07.02.txt
-rw-r--r--  1 okisanjp  staff    0  7 13 07:52 test.2013.07.03.txt
-rw-r--r--  1 okisanjp  staff    0  7 13 07:52 test.2013.07.04.txt
-rw-r--r--  1 okisanjp  staff    0  7 13 07:52 test.2013.07.05.txt
-rw-r--r--  1 okisanjp  staff    0  7 13 07:52 test.2013.07.06.txt
-rw-r--r--  1 okisanjp  staff    0  7 13 07:52 test.2013.07.07.txt
-rw-r--r--  1 okisanjp  staff    0  7 13 07:52 test.2013.07.08.txt
-rw-r--r--  1 okisanjp  staff    0  7 13 07:52 test.2013.07.09.txt
-rw-r--r--  1 okisanjp  staff    0  7 13 07:52 test.2013.07.10.txt
-rw-r--r--  1 okisanjp  staff    0  7 13 07:52 test.2013.07.11.txt
-rw-r--r--  1 okisanjp  staff    0  7 13 07:52 test.2013.07.12.txt
-rw-r--r--  1 okisanjp  staff    0  7 13 07:52 test.2013.07.13.txt
-rw-r--r--  1 okisanjp  staff    0  7 13 07:52 test.2013.07.14.txt
-rw-r--r--  1 okisanjp  staff    0  7 13 07:52 test.2013.07.15.txt
-rw-r--r--  1 okisanjp  staff    0  7 13 07:52 test.2013.07.16.txt
-rw-r--r--  1 okisanjp  staff    0  7 13 07:52 test.2013.07.17.txt
-rw-r--r--  1 okisanjp  staff    0  7 13 07:52 test.2013.07.18.txt
-rw-r--r--  1 okisanjp  staff    0  7 13 07:52 test.2013.07.19.txt
-rw-r--r--  1 okisanjp  staff    0  7 13 07:52 test.2013.07.20.txt
-rw-r--r--  1 okisanjp  staff    0  7 13 07:52 test.2013.07.21.txt
-rw-r--r--  1 okisanjp  staff    0  7 13 07:52 test.2013.07.22.txt
-rw-r--r--  1 okisanjp  staff    0  7 13 07:52 test.2013.07.23.txt
-rw-r--r--  1 okisanjp  staff    0  7 13 07:52 test.2013.07.24.txt
-rw-r--r--  1 okisanjp  staff    0  7 13 07:52 test.2013.07.25.txt
-rw-r--r--  1 okisanjp  staff    0  7 13 07:52 test.2013.07.26.txt
-rw-r--r--  1 okisanjp  staff    0  7 13 07:52 test.2013.07.27.txt
-rw-r--r--  1 okisanjp  staff    0  7 13 07:52 test.2013.07.28.txt
-rw-r--r--  1 okisanjp  staff    0  7 13 07:52 test.2013.07.29.txt
-rw-r--r--  1 okisanjp  staff    0  7 13 07:52 test.2013.07.30.txt
-rw-r--r--  1 okisanjp  staff    0  7 13 07:52 test.2013.07.31.txt
matplotlibでstacked histogram (積み上げヒストグラム) を書く


積み上げヒストグラムが正しい訳なのかはわからない。

```python:stackedhistogram.py
import matplotlib.pyplot as P

one = (100, 100, 500, 600, 800)
two = (100, 100, 500, 600, 800, 100, 100, 100, 100, 100)
three = (900, 100, 500, 600, 800, 500)

P.hist((one, two, three), histtype='barstacked', bins=5, label=('one', 'two', 'three'), color=('r', 'g', 'b'))
P.legend()
P.show()
```

![stackedhistogram.png](https://qiita-image-store.s3.amazonaws.com/0/1538/88d8d699-ca09-2b51-f6b0-4691ffb9a906.png "stackedhistogram.png")

## 参考
+ http://matplotlib.1069221.n5.nabble.com/question-about-stacked-histograms-td21137.html
ArchLinuxでOpenCLな環境を構築する

ArchLinuxの環境でOpenCLを使いたかったので，インスコしてみました．
IvyBridgeなCPU(Core i5-3470T)を積んだWIndowsマシン上のVM環境でやっています．グラフィック関係はオンボのみですので，OpenCLの恩恵はあまりないと思いますが，練習用環境ということで構築します．

## インストール方法
AURに `intel-opencl-sdk` というパッケージが用意されているので，それをインスコするだけでおｋでした．

```shell-session:
yaourt -S intel-opencl-sdk
```
依存関係は全てyaourtさんが解決してくれるので楽ちんです．
途中で，

```shell-session:
==> Edit PKGBUILD ? [Y/n] ("A" to abort)
==> Edit intel-opencl-sdk.install ? [Y/n] ("A" to abort)
```

などと聞かれますが，特にいじらなくてもよさそうでした．インストール中に Intel から 44MB くらいのファイルを落としてくるので，ネットワーク回線が貧弱だとちょっと時間を食います．途中で他にも色々質問されますが，基本的にyでおｋでした．

OpenCLのインストールはとっても簡単でした．VM上の環境で動かしていたので，ちゃんとデバイスを認識してくれるかどうかが一番の心配でしたが，バッチリ認識されていました．これで一安心．
PCRE関数での$matchesの扱いについて

正規表現に関する問題です。
次の出力結果を答えてください。

```php
preg_match('/^(?:(a)|(b)|(c))$/', 'b', $matches);
var_dump($matches);
```

※ パターン **(?:　　)** を使うと、$matchesに代入されないグループを作成することが出来ます。

```text:1
array(3) {
  [0]=>
  string(0) ""
  [1]=>
  string(1) "b"
  [2]=>
  string(0) ""
}
```

```text:2
array(3) {
  [0]=>
  string(1) "b"
  [1]=>
  string(0) ""
  [2]=>
  string(1) "b"
  [3]=>
  string(0) ""
}
```

```text:3
array(3) {
  [0]=>
  string(0) "b"
  [1]=>
  string(1) ""
  [2]=>
  string(0) "b"
}
```

（回答は↓）　
　
　
　
　
　
　
　
　
　
　
　
　
　
　　
　
　
　
　
　
　
　
　
　
　
　
まあ **1** は「違う」って多くの人が納得されると思います。
そうです、 `$matches[0]` は **パターン全体** を表すからです。
今回の場合、
a → `$matches[1]`
b → `$matches[2]`
c → `$matches[3]`
となります。

残ってくる選択肢が **2** と **3** 。
さて正解は？
　
　
　
　
　
　
　
　
　
　
　
　
　
　
　
　

実は **3** なんです。
「b」がマッチした時点で **(?:(a)|(b)|(c))** 内の評価が終わり、3番目の **(c)** のキャプチャは作成されない、という理由です。（意外と目から鱗だった方もいらっしゃるのではないでしょうか？）
　　
この仕様を知っておけば、こういう処理も楽々1回の正規表現で書けちゃいますね。



```php:フィーチャーフォンのキャリア判定
$agent = isset($_SERVER['HTTP_USER_AGENT']) ? ($_SERVER['HTTP_USER_AGENT']) : '';
$pattern = '@'.
    '^DoCoMo/[12]\\.0|'.
    '(^(?:J-PHONE|Vodafone|MOT-[CV]980|SoftBank)/)|'.
    '(^KDDI-|UP\\.Browser/)|'.
    '(^PDXGW|DDIPOCKET;|WILLCOM;)'.
'@';
switch (true) {
    case !preg_match($pattern, $agent, $matches):
        echo 'その他';
        break;
    case !isset($matches[1]):
        echo 'DoCoMo';
        break;
    case !isset($matches[2]):
        echo 'Softbank';
        break;
    case !isset($matches[3]):
        echo 'au';
        break;
    default:
        echo 'WILLCOM';
}
```

このコードの作成にあたっては、[こちら](http://www.mt312.com/php/32/ ユーザーエージェント携帯判別)の情報を参考にしました。
ちなみに私は、

- 正規表現エンジンに対しての不要なエスケープは行わない
- バックスラッシュに関してはPHP言語としての問題になってくるので全てエスケープ

こういうポリシーのもとに書いています。
http://qiita.com/mpyw/items/8dd5378cb01c877e1f7b
　　
  
　　
さて今回はこのぐらいで。
・・・と思ったけど `preg_match` 以外の他の関数にも触れておきます。

- `preg_match_all` で **PREG_SET_ORDER** のとき
- `preg_replace_callback`

この2つに関しては先ほどの `preg_match` と同じ認識でOKです。
ところが、

- `preg_match_all` で **PREG_PATTERN_ORDER** のとき

このときの挙動は異なります。

- `$matches[0][$i]` が存在していれば、
`$matches[1][$i]` `$matches[2][$i]` `$matches[3][$i]` ・・・は必ず存在する
- 実際にマッチしたものが無ければそれには空文字列が代入される

一言でいえば、
<ins>親配列($matches)が持つ子配列の要素数は必ず等しくなる</ins>

ちなみに

- `preg_replace`

これに関してはもっと制約が緩いです。
例えば **(　)** が3つしかないのに、 `$4` とか書いちゃっても問題なく空文字列として処理してくれます。
Get all comments of facebook post by weird way.

[Graph API Explorer](https://developers.facebook.com/tools/explorer) is a facebook developer tool, and I usually use it recently.

One day, a problem about the large amount of post comments occurred.

![1.png](https://qiita-image-store.s3.amazonaws.com/0/26863/597dd68e-6c50-0ee5-be2f-ab8436717ac9.png)

It's hard for me to read, I need to keep click 'more' button.

So, why can't I solve this prolbem with Graph API Explorer?

Here's the way.

Get ID
---

Everything from fb has its own id. (post, video, photo, etc)

The most URL format like these below:
* facebook.com/groups/[group_name]/permalink/[id]
* facebook.com/photo.php?fbid=[id]
* facebook.com/[username]/posts/[id]
* facebook.com/permalink.php?story_fbid=[id]

Remeber the id we found, we'll use it later.

Query data
---

Then we open the [Graph API Explorer](https://developers.facebook.com/tools/explorer), switch to **FQL Query** mode to get the comment data by FQL.

```mysql
SELECT fromid, text FROM comment WHERE object_id = '[id]' LIMIT 0, 500
```

You might have a question that why I select *fromid* not *name*. (if I can, I want to.)

Becuz  there's no *name* column in comment table, and fb not allow us to join table in this tool.

But I still found the solution, I'll mention it later.

Now the comment data will shown in JSON format.

Make it easy
---

We already know these steps will get the comment data.

But how to make it easier is more difficult.

Here I use js bookmark to do these step by step.

```js:
var obj_id;
var step;
if (step == undefined) { //Get the id from user
    obj_id = prompt('Enter the id:');
    if (obj_id != undefined) {
        step = 'enter_Id';
    }
    return false;
} else if (step == 'enter_Id') { //Set FQL to query data.
    document.getElementById('fql_query').value = "SELECT fromid, text FROM comment WHERE object_id = '" + obj_id + "' limit 0, 500";
    document.getElementById('fql_submit').childNodes[0].click();
    step = 'query_text';
    alert('Wait until the loading complete, and click this bookmark again.');
} else if (step == 'query_text') { //Select all data
    var content = document.getElementById('response_body');
    var selection = window.getSelection();
    var range = document.createRange();
    range.selectNodeContents(content);
    selection.removeAllRanges();
    selection.addRange(range);
    content.focus();
    alert('Press ctrl+c to copy.');
}
```

why fromid not name
---

Back to the fromid problem before, fromid means the id of the user who create comment.

Each comments has its own fromid and text, so I use [async](https://github.com/caolan/async) to get the name of user profile from '[http://graph.facebook.com/[fromid]](http://graph.facebook.com/[fromid])' in order.

But the sad part is I found it's still hard for end user to operate.

Look on the bright side, I found a tricky method to use this tool.

Hope these help. :)
XMLHttpRequestを途中で止める

XMLHttpRequestを完了する前に途中で中断させるには `abort()` を実行します。

```js
var xhr = new XMLHttpRequest();
xhr.open('GET', '…');
xhr.send();
xhr.abort();
```

jQueryの場合も同様に `abort()` を使います。

```js
var jqXHR = $.ajax({ url: '…' });
jqXHR.abort();
```

# タイムアウトを実装する

具体的な利用場面としては、XHRにタイムアウトを設定したい場合。普通にしているとタイムアウトするまでに60秒待たされたりするので、それを例えば10秒でタイムアウトさせたい場合はこんな感じで書けます。

```js
// XMLHttpRequestを発行する
var jqXHR = $.ajax({ url: '…' });
jqXHR.fail(function () {
  console.log('Fail');
});

setTimeout(function () {
  // 10秒後まだpendingだったらabortする。
  if (jqXHR.state() === 'pending') jqXHR.abort();
}, 1000 * 10);
```

`fail()` はXHR通信に失敗したときに実行される関数を登録するものですが、 `abort()` 時も実行されます。
「第12回オフラインリアルタイムどう書くの問題」をPHPで解く

http://qiita.com/Nabetani/items/f3cca410428f90333e28
http://nabetani.sakura.ne.jp/hena/ord12rotdice/

さいころを転がして出た目を記録します。
単純に考えれば配列に全ての面を入れておけばいいだけなので、その方針にしたがって実装します。
世の中には[すごいことを考える人](http://qiita.com/saihon2013/items/db2241d91132d750b70e)もいますが、私ががんばってこういうコードを書いたとして、後から見直したら絶対意味がわからない自信がある。

```php:
<?php
	class DICE{
	
		/**
		* さいころをコロコロして歩いた目を返す
		* @param String 「NNESWWS」みたいな文字列
		* @return String 「15635624」みたいな文字列
		*/
		public function get($input){
			// 初期値 順に上下東西南北
			$dice = [1, 6, 4, 3, 5, 2];
			$ret = (string)$dice[0];
			
			// 進む方向
			$next = [
				 'N' => [5,4,2,3,0,1]
				,'S' => [4,5,2,3,1,0]
				,'W' => [3,2,0,1,5,6]
				,'E' => [2,3,1,0,5,6]
			];
			
			// 順番に進むだけ
			for($i=0; $i<strlen($input); $i++){
				$dice = array_combine($next[$input[$i]], $dice);
				ksort($dice);
				$ret .= $dice[0];
			}
			
			// 終了
			return $ret;
		}
	}
	
	// テスト
	$test = [
		['NNESWWS', '15635624'],
		/* 省略 */
	];

	$dice = new DICE();
	foreach($test as $key=>$data){
		$answer = $dice->get($data[0]);
		if($answer !== $data[1]){
			print('えらー');
		}
	}
```

20分くらいですぐに終わりました。
まあ、実は[昔同じことをやったことがある](http://slashdot.jp/journal/562424/)ので、そのときの知識を流用しただけです。
やったことがなければもう少しかかってたかと思われます。

$nextは、さいころが転がったときに、どの面がどの方向に移動するかを表す表です。
北(N)に転がったとしたら、そのときに上を向いていた面(方向0)は北(方向5)に向き直る、という形です。

ksortが微妙だな。
こいつは参照渡しなので`$dice = ksort(array_combine($next[$input[$i]], $dice))`とか書けないんですよね。
「第9回オフラインリアルタイムどう書くの問題」をPHPで解く

http://qiita.com/Nabetani/items/84255ac417ef25069a3b
http://nabetani.sakura.ne.jp/hena/ord9busfare/

今回は年齢区分によるバス代の算出です。
大人一人で幼児二人無料といった割引を考慮して算出する必要があります。

```php:
<?php
	class BUS{
		/**
		* バス代を算出
		* @param String 「210:Cn,In,Iw,Ap,Iw」みたいな文字列
		* @return int バス代
		*/
		public function get($input){
			// 入力値を分解
			list($adlultPrice, $persons) = explode(':', $input);
			
			// 料金を算出
			$prices = ['Ap'=>0, 'Cp'=>0, 'Ip'=>0];
			$prices['An'] = (int)$adlultPrice;
			$prices['Cn'] = $prices['In'] = $prices['Aw'] = (int)ceil($adlultPrice/20)*10;
			$prices['Cw'] = $prices['Iw'] = (int)ceil($prices['Cn']/20)*10;
			
			// 客をACI,nwの順にソート
			$persons = explode(',', $persons);
			usort($persons, function($a, $b){
				if(($tmp = strcmp($a[0], $b[0])) === 0){
					return strcmp($a[1], $b[1]);
				}
				return $tmp;
			});
			
			// 順番に処理
			$sumPrice = 0;
			$adultCount = 0;
			foreach($persons as $person){
				// 大人割引
				if($person[0] === 'A'){
					$adultCount+=2;
				}elseif($person[0] === 'I' && $person[1] !== 'p' && $adultCount>0){
					$adultCount--;
					continue;
				}
				// 合計金額
				$sumPrice += $prices[$person];
			}
			
			// 終了
			return $sumPrice;
		}
	}
	
	// テスト
	$test = [
		['210:Cn,In,Iw,Ap,Iw', '170'],
		/* 省略 */
	];

	$bus = new BUS();
	foreach($test as $key=>$data){
		$answer = $bus->get($data[0]);
		if($answer !== (int)$data[1]){
			print('えらー');
		}
	}
```

なんつーか、特筆することが極めて無い中身になった。
なおソートするところで'p'を無視していますが、こいつは0円なので何処に出てこようが気にする必要はありません。
一見幼児割引のところでチェックする必要がある気がしますが、実は単に弾くだけで問題無いです。

かかった時間は一時間くらい。
最初$personsをさらに年齢区分と料金区分の配列にして処理してたけど、意味がないなと削ったので多少無駄な時間があります。
Rails のドキュメントを OS X の Spotlight から検索できるようにする！

http://www.priithaamer.com/ というサイトで， Rails ドキュメントをMac OS X の辞書アプリ向けにしたものを配布しています．
いろんなサイトに書いてあるように主導でダウンロード， zip 解凍，配置をしても良いのですが，
せっかくなので Terminal で全部コマンドでやってしまおう，という書き残しです．

なお， OS X 辞書向けファイルはすべての Rails のバージョンに用意されてはいないようです．
以下では Rails 3.1 のドキュメントを落としてきていますが，サイトに行けば Version 4.0.0 の辞書も置いてありますので，適宜読み替えてください．

あと，前提として Homebrew か何かで wget を入れていることを前提としてます．

### 辞書のダウンロード
```
cd ~/Downloads
wget http://f.priithaamer.com/dictionary/Rails%203.1.dictionary.zip
```
↑ Version 4.0.0 なら `http://f.priithaamer.com/dictionary/Rails%204.0.dictionary.zip` に差し替え！

### 辞書解凍
```
sudo tar -xf Rails\ 3.1.dictionary.zip -C /Library/Dictionaries/
```
↑ ダウンロードしてきた zip ファイルを，辞書アプリが読む場所に解凍します．要管理者権限．

これで完了なのですが，そのままだと検索した時に Rails の項目よりも英和辞典などの結果が上に表示されることになるので，辞書アプリを開いて優先順位を変更します．

### 辞書の設定
```
open -a Dictionary
```

辞書アプリが開いたら `Cmd + ,` で設定画面を開き， Rails の辞書を上位にドラッグ ＆ ドロップすればOK!

### Spotlight で検索する際に…
Lion 以降の OS X では，Spotlight の検索結果で辞書の結果がどうやっても下位に来るようになってしまいました．
しかし，検索実行後に `Cmd + L` を入力すれば，辞書に即フォーカスします．
vimでウィンドウやタブの状態を自動保存/復元する方法

*PC再起動したいけど今開いてるファイルをまた開き直すのめんどくさい…*

や

*今日の作業は終わったからvim閉じたいけど次作業する時今の状態復元したいからvim閉じれない…*

vimmerなら一度は思った事があるはずです。

この記事を読めばそんなことにもう悩まされることはありません！ウヒョー

まずどういう事が出来るようになるのか、gifで見てみましょう

![](http://gifzo.net/lXku2S7D9k.gif)

何が行われてるかというと

- 1分間に1回、状態を自動保存
- `:qa`等でvimを辞める時、状態を自動保存
- プロジェクトのルートディレクトリで引数なしでvimを起動すると自動的に状態を復元

が行われてます。


`状態`はvimのsessionという機能で保存してます。

sessionは標準のvimで`:mksession`で作成出来るのですが、今回はその`:mksession`をラップしたプラグインを使用して実現しています。

# 設定方法

## プラグインインストール

```vim
NeoBundle 'xolox/vim-session', {
            \ 'depends' : 'xolox/vim-misc',
          \ }
```

## プラグインの設定

```vim
" 現在のディレクトリ直下の .vimsessions/ を取得 
let s:local_session_directory = xolox#misc#path#merge(getcwd(), '.vimsessions')
" 存在すれば
if isdirectory(s:local_session_directory)
  " session保存ディレクトリをそのディレクトリの設定
  let g:session_directory = s:local_session_directory
  " vimを辞める時に自動保存
  let g:session_autosave = 'yes'
  " 引数なしでvimを起動した時にsession保存ディレクトリのdefault.vimを開く
  let g:session_autoload = 'yes'
  " 1分間に1回自動保存
  let g:session_autosave_periodic = 1
else
  let g:session_autosave = 'no'
  let g:session_autoload = 'no'
endif
unlet s:local_session_directory
```

この設定によって

vimを起動したディレクトリ直下に.vimsessionsディレクトリがあればそれをsession保存ディレクトリとして設定する

↓

.vimsessionsディレクトリのdefault.vimが開かれる

という流れが実現します


## 自動保存/復元するディレクトリの設定

```bash
$ cd /path/to/projects/root/directory/
$ mkdir .vimsessions
$ vim
```

vim起動後、`:SaveSession`を実行すれば、.vimsessions/にdefault.vimが作成され、自動保存/復元が可能になります！

# おまけ

詳しい情報は以下のIssuesを見れば分かります

- https://github.com/xolox/vim-session/issues/49
- https://github.com/xolox/vim-session/issues/67
twitter-bootstrap-rails v2.2.6 を v2.2.7にバージョンアップしたらFont Awesomeがエラーに…

何気なく`bundle update`したら、

> 'fontawesome.less' wasn't found.

なんてエラーが…
グーグル先生に聞いてみると、ぴったりな議論を発見。

[GitHub After update to 2.2.7 the "fontawesome"-import doesn't work anymore](https://github.com/seyhunak/twitter-bootstrap-rails/issues/588 "After update to 2.2.7 the "fontawesome"-import doesn't work anymore")

どうも、v2.2.7では設定内容が変わったらしくv2.2.6と互換性が無いとのこと。

設定は、

> app/asset/stylesheets/bootstrap_and_overrides.css.less

を修正。

修正箇所は下の通り。

```css:bootstrap_and_overrides.css.less
// Set the Font Awesome (Font Awesome is default. You can disable by commenting below lines)
// Note: If you use asset_path() here, your compiled bootstrap_and_overrides.css will not
//       have the proper paths. So for now we use the absolute path.
@fontAwesomeEotPath: asset-path("fontawesome-webfont.eot?v=3.0.2");
@fontAwesomeEotPath_iefix: asset-path("fontawesome-webfont.eot?#iefix&v=3.0.2");
@fontAwesomeWoffPath: asset-path("fontawesome-webfont.woff?v=3.0.2");
@fontAwesomeTtfPath: asset-path("fontawesome-webfont.ttf?v=3.0.2");

// Font Awesome
@import "fontawesome";
```

修正後はこんな感じに。

```css:bootstrap_and_overrides.css.less
// Set the Font Awesome (Font Awesome is default. You can disable by commenting below lines)
@fontAwesomeEotPath: asset-url("fontawesome-webfont.eot");
@fontAwesomeEotPath_iefix: asset-url("fontawesome-webfont.eot#iefix");
@fontAwesomeWoffPath: asset-url("fontawesome-webfont.woff");
@fontAwesomeTtfPath: asset-url("fontawesome-webfont.ttf");
@fontAwesomeSvgPath: asset-url("fontawesome-webfont.svg#fontawesomeregular");

// Font Awesome
@import "fontawesome/font-awesome";
```
Rails3.2でスター機能実装

モデルは post、user、star 。![20130706021155.jpg](https://qiita-image-store.s3.amazonaws.com/0/10172/cb6fdd2b-ccaf-3a23-06b8-b691bc0cb99e.jpeg)

##ルーティング
```config/routes
# toggle_star
match 'toggle_star', :to => 'toggle_star#toggle_star', :via => [:get, :post]
```

##View
```app/view/posts/show.html.erb
<%=  form_tag({:controller => 'star', :action => 'toggle_star'}, {:name => 'toggle_star', :remote => true}) do %>
	<input type="hidden" value="<%= @post.id %>" name="post_toggle_star">
	<span class="js-toggle_star" data-num="<%= @post.id %>">スターボタン</span>
<% end %>

```

##Model
```app/models/post.rb
belongs_to :user
has_many :stars, :dependent => :destroy
has_many :stared_users, :through => :stars, :source => :user

# user -> post の関係を複数作る場合、別の名前（:stared_users）を付け、sourceオプションで本当の名前を指定するらしい。
```

```app/models/user.rb
has_many :posts, :dependent => :destroy
has_many :stars, :dependent => :destroy
has_many :stared_posts, :through => :stars, :source => :post

def starable_for?(post)
  post && post.user != self && !stars.exists?(:post_id => post.id)
end

# postの有無
# 投稿者がユーザー自身の場合はお気に入りさせない
# 重複させない
```

```app/models/star.rb
belongs_to :user
belongs_to :post
attr_accessible :user_id, :post_id

validate do
  unless user && user.starable_for?(post)
    return errors.add(:post_id)
  end
end
```

##Controller

```app/controllers/star_controller.rb
def toggle_star
  # ログインチェック
  raise unless login_user

  # 既にお気に入りしているかどうかチェック
  @post = Post.find(params[:post_toggle_star])
  if current_user.stared_posts.exists?(@post)
    render remove_star(@post)
  else
    render add_star(@post)
  end

  rescue
  render :json => {:result => "error" }, :status => 400 
end

# スターを追加
def add_star(postobj)
  current_user.stared_posts << postobj
  return  { :json => { :type => "add", :result => "success" } }
end

#スターを削除
def remove_star(postobj)
  current_user.stared_posts.delete(postobj)
  return  { :json => { :type => "remove", :result => "success" } }
end

```


##JavaScript
```
// コールバックなどを設定。それぞれの処理に合わせたメソッドを作っていく
jQuery(formObj)
	.bind("ajax:loading", function(xhr){})
	.bind("ajax:success", function(data, status, xhr){})
	.bind("ajax:complete", function(xhr){})
	.bind("ajax:failure", function(xhr){});
```

スター/スター解除 でURLを共通にしたかったので、振り分ける分岐をController側に書いてあります。
URLを分けると、DBへのアクセスがもっと減るのかも。
↓ブログに書いたものの転載です。
http://www.rokurofire.info/2013/07/08/rails_star/
ちょっとしたことがGroovy「めちゃくちゃ重い正規表現をどうにかする確認」

Javaの正規表現のせいでCPU死んでいたのを調査、修正の検討の際のテストをGroovyでやってみました。

実際の正規表現は、(ABCD)のところがもっと複雑なマッチになっているので後戻り発生すると本当に死ぬ。

なお、(ABCD)の部分によっては完全に一致する検索ではないです。

完全に一致する結果を返したい場合は、もうちょっと工夫する必要があります。

問題となっていた部分ではこの程度の一致で十分でした。

```groovy:fast_30.groovy
import java.util.regex.Matcher
import java.util.regex.Pattern

def stopWatch = {c->
    s = System.nanoTime()
    c()
    def w = System.nanoTime() - s
    if(w <      1000000)
        "${w /  1000} [microsec]"
    else if(w < 1000000000)
        "${w /  1000000} [millsec]"
    else
        "${w /  1000000000} [sec]"
}

def slowMatch = {target ->
  def r 
  def m = Pattern.compile(/[^.,;]{30,}(ABCD)/).matcher(target) // <- 後ろから読み直しちゃうよ。。。O(n^2)
  println "slow=" + stopWatch {
    r = m.find()
  }
  (r)?m.group().length():r
}

def fastMatch = {target ->
  def r = false
  def p = Pattern.compile(/[^.,;]{30}(ABCD)/)
  def m = p.matcher(target)
  def l = []
  def ret
  println "fast=" + stopWatch {
    if(m.find())
    for(def s:target.split(/[.,;]/)){
        if(s.length() >= 34){
            def m2 = p.matcher(s)
            r = m2.find()
            if(r) {
              ret = s
              break
            }
        }
    }
  }
  (r)?ret.length():r
}

[
case01:"0123456789",
case02:"0123456789"*2,
case03:"0123456789"*3,
case04:"0123456789"*3+".",
case05:"0123456789"*2.9+".",
case06:"0123456789"*2.9+".ABCD.",
case07:"0123456789"*3+".ABCD.",
case08:"0123456789"*3+":ABCD.",
case09:"0123456789"*3+".ABCD.ABCD.",
case10:"0123456789"*3+":ABCD.ABCD.",
case11:"0123456789"*2000+".ABCD.", // <- このときにslowが遅い死ぬほど重い。なぜかってぇと後ろから読み直して結局見つからないから
case12:"0123456789"*2000+":ABCD.", // <- このときだけfastのが遅い、なぜかってぇと一致が最後方にあるから
case13:"0123456789.ABCD."*500,
case14:"0123456789.ABCD."*500+"0123456789"*3+"ABCD.",
cale15:""
].collect { k,v ->
  println k
  def result = slowMatch(v)
  assert result == fastMatch(v)
  ["$k":result]
}
```
Behat + Mink + Selenium2 で JavaScript動かす時に suggest的なのが取れない！という時の対処法

少しハマったのでメモ。

## Behat + Mink + Selenium2 で JavaScript動かす時に suggest的なのが取れない！という時の対処法

Behat + Mink + Selenium2 な環境の時、下記の Mink チュートリアル後半でハマりました。

http://docs.behat.org/cookbook/behat_and_mink.html#test-in-browser-selenium2-session

Wiki に検索をした時、サジェストに規定の文字が出てくるのを期待するチュートリアル。

### 結論

できるだけ、I fill in "hoge" with "fuga" は使わずに、Click や KeyPress を使うようにするべき。

本当は、規定の input を Click してから、KeyPress で必要な文字を入力するべきだと思うのですが、とりあえず、以下のようにするとサジェストは出てくる。

```./behat.yml
# behat.yml
default:
  extensions:
    Behat\MinkExtension\Extension:
      base_url: http://en.wikipedia.org
      goutte: ~
      selenium2: ~

```

```./features/search.feature
  @javascript
  Scenario: Searching for a page with auto completion
    Given I am on "/wiki/Main_Page"
    When I fill in "search" with "Behavior Driv"
    And I press " " key into "searchInput"
    And I wait for the suggestion box to appear
    Then I should see "Behavior-driven development"
```

```./features/FeatureContext.php
<?php
class FeatureContext extends MinkContext // MinkContext // BehatContext
{
	/**
	 * @Given /^I press "([^"]*)" key into "([^"]*)"$/
	 */
	public function iPressKeyInto($key, $id)
	{
		$this->getSession()->getPage()->findById($id)->keyPress($key);
		// throw new PendingException();
	}

	/**
	 * @Given /^I wait for the suggestion box to appear$/
	 */
	public function iWaitForTheSuggestionBoxToAppear()
	{
		$this->getSession()->wait(5000, "$('.suggestions-results').children().length > 0");
		// throw new PendingException();
	}
}
```

### チュートリアルと違う点

Featureに以下を追加した。

```
    And I press " " key into "searchInput"
```

これによって、FeatureContext にもメソッドの追加が必要となった。のが、以下。

```php:
	/**
	 * @Given /^I press "([^"]*)" key into "([^"]*)"$/
	 */
	public function iPressKeyInto($key, $id)
	{
		$this->getSession()->getPage()->findById($id)->keyPress($key);
		// throw new PendingException();
	}
```

$id の要素に対して、keyPress で " "スペースを入力してみた。

-----

本当は「When I fill in "search" with "Behavior Driv"」のところからして書きなおしたほうが良いのかも。

あと、自戒として。

https://github.com/Behat/MinkSelenium2Driver に目を通しておいて損はないかも。
ER図を推測しながら作成するmysqlvizを改造した（印刷可能なサイズに出力）

download
=========
[download](https://github.com/tukiyo/mysqlviz.git)

説明
=========
[mysqlviz](https://code.google.com/p/mysqlviz/)をご存知ない方は[moongiftさんの解説](http://www.moongift.jp/2013/05/20130506/)をどうぞ。

リレーション貼ってなくてもテーブル名と～id から推測してER図作成するmysqlvizに感動しました。
しかし出力結果がテーブル数が多い場合に優しくないので見やすく改造しました。
(サンプルは[EC-CUBE](http://www.ec-cube.net/)Free版のDBです。)

mysqlとsqliteが対応とのことですが、他のDBもmysql形式に変換すれば使えるのではないでしょうか。

## 改良後

* 線の色・・・１本目：紫、２本目：ぶっとい青、３本目：緑、４本目：黄、５本目：赤、６本目以降：ピンク
* 他のテーブルからリンクが貼られているだけのテーブルは丸い形
* つながりがないテーブルは非表示にしときました。

![eccube_db_simple.png](https://qiita-image-store.s3.amazonaws.com/0/25728/174e9860-fb01-c3c7-011c-e110635b0166.png)

```bash:必要なパッケージ
$ sudo apt-get install -y graphviz libgv-php5 php5-cli
```

## 使い方

```Bash:はじめにダンプファイルを作成する。
$ mysqldump -uroot -p -d dbname  > dbname.sql 
```

```bash:
dbname="eccube_db" ← dumpファイル名指定
```

* 設定修正（use_original.sh か use_simple.sh）

```php:mysqlviz_simple
//$standard_table_prefixes=array('','tbl','tbl_','table','table_');
$standard_table_prefixes=array('','tbl','tbl_','table','table_','dtb_','mtb_'); ← tableのprefixがあれば書いとく。
```

```Bash:実行
$ sh use_original.sh (オリジナル版。ちょっと手を加えましたが。)
$ sh use_simple.sh (シンプル版。)
```

pngファイルが生成されるので御覧ください。

### 参考までに改良前

![eccube_db_original.jpg](https://qiita-image-store.s3.amazonaws.com/0/25728/7a8fb4a4-0673-8c80-999d-f137ea5ac955.jpeg)
Windows7 のシステム修復ディスクの作成単位

<P>以下、自分で実験・確認したわけではなく、2013-07-12にMSのサポートから得た情報です。複数台、エディション違いなどお持ちの方に。</P>
<HR>
<P>WIndows7 の　コントロール パネル\システムとセキュリティ\バックアップと復元　にある”システム修復ディスクの作成”について</P>
<OL>
<LI>個々のPCについて１つ作る。
<LI>個々のPCについて構成変更のたびに１つ作る。
<LI>製品エディションごとに作る。
<LI>32bit/64bit のアーキテクチャ別に作る。
<LI>どの製品で作っても同じシステム修復ディスクができる。いずれかのエディションで１つ作っておけばよい。
</OL>
<P>のいずれかを問うたところ、回答は 4 ”32bit/64bit のアーキテクチャ別に作る”　が正しいとのことでした。</P>
<HR>
<P>
 　”windows システム修復ディスク”をキーワードとしてGoogleで検索をかけると、マイクロソフトコミュニティーの記事<A HREF="http://answers.microsoft.com/ja-jp/windows/forum/windows_7-system/%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E4%BF%AE/37002c8c-3d5d-e011-8dfc-68b599b31bf5" TARGET="_blank">システム修復ディスクは1枚で良いか - Microsoft Community 2011-04-03</A>のベストアンサーに回答を見つけることもがきでます。
</P>
<P>
　このベストアンサーの記述によれば、システム修復ディスクは構成情報を抱き込んでいる筈です。それゆえ、前掲のリストでいえば、 2. - 個々のPCについて構成変更のたびに１つ作る　になるように思えます。
</P>
<P>
　　上記回答 4 を得た後、このMicrosoft Community の記事があることを伝えました。この件で再度確認をとってもらったのですが、回答は 4. で変わらずとのことです。また、コミュニティーのQ&Aの回答内容のについてMSのサポートが妥当性を確認しているわけではないとのことでした。
</P>
MySQLのSQLをシェルから実行したい

シェルでSQLの値を受け取ってawkに渡したい時とかに使う

    mysql -uroot -p[password] -e "show databases"

```
 +--------------------+
 | Database           |
 +--------------------+
 | information_schema |
 | fuck               |
 | mysql              |
 | performance_schema |
 +--------------------+
```

-pの後にパスワード直接打つと、「非表示にしてないのにパスワード直接シェルに打ち込むとか馬鹿なの？？」ってwarningが出る。-pだけ指定してその後にパスワード打ち込む事も可能。


-eだとカラム名とか余計なものまで表示されちゃう。-Nオプションをつければそれの抑制も可能。
Appleストアのアプリページへ、リンクを生成する

下記のような画像とともに、
Appleストアのアプリページへ、リンクを生成する方法。

![badge_appstore-sm.gif](https://qiita-image-store.s3.amazonaws.com/0/10525/f1371b0f-71e3-361a-8089-55519e2859b9.gif "badge_appstore-sm.gif") ![badge_appstore-lrg.gif](https://qiita-image-store.s3.amazonaws.com/0/10525/85f9dee9-d6ee-b81a-0d97-ab40dfba9e46.gif "badge_appstore-lrg.gif")




* 下記のサイトにアクセスする。
http://itunes.apple.com/linkmaker

* 必要な検索条件を入力し、「Search」を押す。 
　→アプリの一覧が表示される。

　　例）
　　　Search=検索キーワード、Countory=Japanese、Media Type=iOS App

* 検索されたアプリの「iPad App Link」を押す。 

以上で、Webページに貼るリンク用のHTMLが表示される。
Modern Testing in PHP な Codeception を触ってみた1

## はじめに

恐れ入りますがコード量が多いため、記事を2個に分けて書きました。

* 1個目は「インストールから Acceptance Test を動かすところまで」
* 2個目は「Acceptance Test のサンプルと Codeception の導入状況や、情報など」

この記事は **Modern Testing in PHP な Codeception を触ってみた1** になります。

## 動作環境

* Mac OS X 10.8.4
* Homebrew から Apache, PHP などをインストール済

## Codeception の Requirements

* PHP 5.3
* CURL enabled

## Codeception って何？

自分もまだ触ったばっかりなので詳しくはわかりませんが特徴としては以下

* Multiple backends, easily changed Selenium, PhpBrowser, ZombieJS
* Elements matched by name, CSS, XPath
* Data Cleanup after each run
* Integrate with Symfony2, Zend Framework, Kohana, etc.
* Continious Integration systems like Jenkins or Bamboo
* Natively executes PHPUnit tests
* BDD-style scenario-driven tests
* WebServices testing via REST,SOAP,XML-RPC
* Generates HTML, XML, TAP, JSON reports
* Simple Fixtures
* Database and Doctrine ORM helpers
* CodeCoverage and Remote CodeCoverage

詳細は http://codeception.com/ で。

## Codeception のインストールとテスト環境の初期化

http://codeception.com/install から
phar アーカイブをダウンロードしてプロジェクトルートに置いて、以下のコマンドを実行

~~~
php codecept.phar bootstrap
~~~

tests/ にいろいろファイルやディレクトリが作られます。

## ディレクトリ構造

~~~
codecept.phar
codeception.yml #グローバルな設定はここに書く
test/
    _data/
        dump.sql
    _helpers/ 
        CodeHelper.php #モジュールを独自拡張したい場合に使う。以下の2つも同様
        TestHelper.php
        WebHelper.php
    _log/
    acceptance/
        _bootstrap.php #受け入れテスト実行前に共通で何かしたい場合はここに書く
        WebGuy.php
    acceptance.suite.yml #受け入れテストの設定はここに書く
    functional/
        _bootstrap.php #機能テスト実行前に共通で何かしたい場合はここに書く
        TestGuy.php
    functional.suite.yml #機能テストの設定はここに書く
    unit/
        _bootstrap.php #ユニットテスト実行前に共通で何かしたい場合はここに書く
        CodeGuy.php
    unit.suite.yml #ユニットテストの設定はここに書く
~~~

## とりあえず Acceptance Test を動かしてみる

以下のコマンドで Acceptance Test のひな形みたいなものが作れます。

~~~
php codecept.phar generate:cept acceptance Example
~~~

各コマンドは `php codecept.phar` か
http://codeception.com/docs/reference/commands で詳細が確認できます。

**acceptance.suite.yml の設定**

といっても、まだよくわからないので PhpBrowser の url を変更しただけにしました。

~~~
class_name: WebGuy
modules:
    enabled:
        - PhpBrowser
        - WebHelper
    config:
        PhpBrowser:
            url: 'http://localhost/hoge/'
~~~

Apache などを start しておいて、以下のコマンドを実行

~~~
php codecept.phar run
~~~

なんか functional, unit も含めて実行してしまう感じなので以下のようにして実行

~~~
php codecept.phar run acceptance
~~~

これで acceptance のみ実行されるようです。
詳しくは http://codeception.com/docs/reference/commands

**Modern Testing in PHP な Codeception を触ってみた2** は以下になります。
http://qiita.com/livejam_db/items/448b7fef0280e148f0db
Sublime Text2のUpdate Availableのポップアップを非表示にする

ST2を起動時に、Update Availableのポップアップが表示されるようになり、
うっとうしいので消す方法を調べました。簡単です。

まず、設定ファイルを下記手順で開きます。
`Preferences → Settings - User`

開いたファイルに下記をコピペします。
`"update_check": false`

以上でOKです。
再起動するとポップアップが非表示になります。
zshrc


使ってる設定だけ

```shell:.zshrc
export EDITOR=vim        # エディタをvimに設定
export LANG=ja_JP.UTF-8  # 文字コードをUTF-8に設定
export KCODE=u           # KCODEにUTF-8を設定
export AUTOFEATURE=true 

bindkey -e               # キーバインドをemacsモードに設定

setopt no_beep           # ビープ音
setopt auto_cd           # ディレクトリ名の入力のみで移動
setopt auto_pushd        # cd時にディレクトリスタックにpushdする
setopt correct           # コマンドのスペルを訂正する
setopt magic_equal_subst # =以降も補完する(--prefix=/usrなど)
setopt prompt_subst      # プロンプト定義内で変数置換やコマンド置換を扱う
setopt notify            # バックグラウンドジョブの状態変化を即時報告
setopt equals            # =commandを`which command`と同じ処理

### Complement ###
autoload -U compinit; compinit # 補完機能を有効
setopt auto_list               # 補完候補を一覧で表示(d)
setopt auto_menu               # 補完キー連打で補完候補を順に表示(d)
setopt list_packed             # 補完候補をできるだけ詰めて表示
setopt list_types              # 補完候補にファイルの種類も表示
bindkey "^[[Z" reverse-menu-complete  # Shift-Tabで補完候補を逆順("\e[Z"でも動作する)
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' # 補完時に大文字小文字を区別しない

setopt extended_glob
unsetopt caseglob    # ファイルグロブで大文字小文字を区別しない

### History ###
HISTFILE=~/.zsh_history   # ヒストリを保存するファイル
HISTSIZE=10000            # メモリに保存されるヒストリの件数
SAVEHIST=10000            # 保存されるヒストリの件数
setopt bang_hist          # !を使ったヒストリ展開を行う(d)
setopt extended_history   # ヒストリに実行時間も保存する
setopt hist_ignore_dups   # 直前と同じコマンドはヒストリに追加しない
setopt share_history      # 他のシェルのヒストリをリアルタイムで共有する
setopt hist_reduce_blanks # 余分なスペースを削除してヒストリに保存する

# マッチしたコマンドのヒストリを表示
autoload history-search-end
zle -N history-beginning-search-backward-end history-search-end
zle -N history-beginning-search-forward-end history-search-end
bindkey "^P" history-beginning-search-backward-end
bindkey "^N" history-beginning-search-forward-end

# すべてのヒストリを表示
function history-all { history -E 1 }

# 色の設定
export LSCOLORS=Exfxcxdxbxegedabagacad
# 補完時の色の設定
export LS_COLORS='di=01;34:ln=01;35:so=01;32:ex=01;31:bd=46;34:cd=43;34:su=41;30:sg=46;30:tw=42;30:ow=43;30'
# ZLS_COLORSとは？
export ZLS_COLORS=$LS_COLORS
export CLICOLOR=true
# 補完候補に色を付ける
zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS}

# プロンプトに色
autoload -U colors; colors
# 一般ユーザ時
tmp_prompt="%{${fg[cyan]}%}%n%# %{${reset_color}%}"
tmp_prompt2="%{${fg[cyan]}%}%_> %{${reset_color}%}"
tmp_rprompt="%{${fg[green]}%}[%~]%{${reset_color}%}"
tmp_sprompt="%{${fg[yellow]}%}%r is correct? [Yes, No, Abort, Edit]:%{${reset_color}%}"

# rootユーザ時(太字にしアンダーバー
if [ ${UID} -eq 0 ]; then
  tmp_prompt="%B%U${tmp_prompt}%u%b"
  tmp_prompt2="%B%U${tmp_prompt2}%u%b"
  tmp_rprompt="%B%U${tmp_rprompt}%u%b"
  tmp_sprompt="%B%U${tmp_sprompt}%u%b"
fi

PROMPT=$tmp_prompt    # 通常のプロンプト
PROMPT2=$tmp_prompt2  # セカンダリのプロンプト(コマンドが2行以上の時に表示される)
RPROMPT=$tmp_rprompt  # 右側のプロンプト
SPROMPT=$tmp_sprompt  # スペル訂正用プロンプト
# SSHログイン時のプロンプト
[ -n "${REMOTEHOST}${SSH_CONNECTION}" ] &&
  PROMPT="%{${fg[white]}%}${HOST%%.*} ${PROMPT}"
;

### Title (user@hostname) ###
case "${TERM}" in
kterm*|xterm*|)
  precmd() {
    echo -ne "\033]0;${USER}@${HOST%%.*}\007"
  }
  ;;
esac

### Aliases ###
alias vi=vim

```