OmniAICreator/Qiita-1.07M huggingface dataset:
自動的にインデントするVimプラグイン作った


##airindent.vim

[airindent.vim](https://github.com/syui/airindent.vim/blob/master/plugin/airindent.vim)

このプラグインは、ファイルを編集し始めた時と編集を終了した時に自動的にインデントを形成するコマンドを実行します。

私の場合、インデントを気にすることがあまりに少なすぎるので、最低限の措置として作りました。

###install


```bash:~/.vimrc
NeoBundle 'syui/airindent.vim'
```

`$ vim +NeoBundleInstall`

または、

```bash:
$ curl -o ~/.vim/plugin/airindent.vim https://raw.githubusercontent.com/syui/airindent.vim/master/plugin/airindent.vim
```

###setting

```vim:~/.vimrc

" airindent.vim {{{
" すべての範囲の自動インデントを有効にする
let g:auto_indent_all = 1

" 現在行の上の部分だけ自動インデントを有効にする
let g:auto_indent_up = 0

" gg=G,line(".") . G
nmap <Leader>- <Plug>(IndentMoveLine)
" }}}

```


###注意点

更新情報はブログの方になると思います。

http://syui.github.io/blog/2014/06/19/airindent-dot-vim/
IntelliJ IDEA 13.1 + Ruby plugin 6.5.0.20140314 DE リモートデバッグ on Rails

リモートインタプリタ設定済みのRailsアプリで、IntelliJのデバッガを使用したので手順メモ。

- ホスト
  - IntelliJ IDEA 13.1
  - Ruby plugin 6.5.0.20140314
- ゲスト
  - Ubuntu 14.04 LTS
  - ruby 2.1.2 (rbenv)

[RubyMineからVagrantのサーバに対しリモートデバッグ - Qiita](http://qiita.com/akiko-pusu/items/1df59e9c17d392c17f03)

などでは面倒な手順を踏んでいるが、少なくとも現在（2014.6.20）のバージョンではとても簡単に利用できる模様。

## 準備

[IntelliJ IDEA 13.1 + Ruby plugin 6.5.0.20140314 DE リモートインタプリタ Rails開発](http://qiita.com/uzuki05/items/67f7081dc116c5bb3f3f)

##デバッガ起動

Development server実行の横のデバッグボタンを押します。

![Debug](http://i.imgur.com/24zv7OS.png)

すると必要なgemのインストールを促されるので[Yes]

![The gem debase required by the debugger is not currently installed.](http://i.imgur.com/82lfkeT.png)

※手動でインストールする場合は `gem install ruby-debug-ide --no-ri --no-rdoc`

インストールが進行し･･･

![install ruby-debug-ide](http://i.imgur.com/rW6bs1M.png)

終わるとデバッガ付きで開発サーバが起動します。

![debugger](http://i.imgur.com/aLevMxW.png)

ポート番号等表示されていますが、これはIDEAのリモートインタプリタ機能でうまく扱ってくれていて、特別にポートフォワーディング設定が必要だったりはしないようです。


##ブレークポイントを設定する

試しにビューに設定してみます。


エディタの左余白部分をダブルクリックすると赤●が表示されます。これがブレークポイント。

![ブレークポイント設定](http://i.imgur.com/8JdrD0j.png)

この状態で開発サーバにアクセスすると･･･（http://127.0.0.1:3000/entries/1）

先ほど作成したブレークポイントで処理が中断し、その時点でのコンテキストや変数の内容、スタックトレースなどが表示されました！

すばらしい。

![デバッガ動作](http://i.imgur.com/M4j94FK.png)


このように、リモートインタプリタでも、とてもかんたんにデバッガを利用することができました。
【cocos2d-x 3.x】cocos2d::Mapのキーを独自の型にする

# 概要

cocos2d::Mapのキーの値は、主に`std::string`などを使うことが想定されているようですが、独自に定義したり、既存の構造体を使用したい場合があったりします。

例えば、`cocos2d::Vec2`をキーとして、指定した場所にある`cocos2d::Sprite`を取り出したい。などというMapを作りたいという場合。

```cpp:error.cpp
// Vec2をキー、Spriteを値とするMapを定義する
typedef cocos2d::Map<cocos2d::Vec2, cocos2d::Sprite *> DefinedMap;
// メンバ変数にする
CC_SYNTHESIZE_READONLY(DefinedMap, _map, Map);    
```

このように書いても上手くいきません。これは、`cocos2d::Vec2`を同一の物と比較する関数が定義されていないため。

ある型をキーとして使うためには、値から固有のハッシュを生成するハッシュ関数と、2つの値が同一かどうかを判定する比較関数を定義してあげる必要があります。

# std::unordered_mapの場合

前提として`cocos2d::Map`はC++11から追加された`std::unordered_map`のラッパーになっています。

`std::unordered_map`では、コンストラクタで`Hash`, `Pred`という値が取れ、これらを渡すことでハッシュ関数と比較関数の挙動をカスタマイズすることができます。

[unordered_map (C++11) - cpprefjp - C++ Library Reference](https://sites.google.com/site/cpprefjp/reference/unordered_map/unordered_map)

そのため、以下のように`Vec2Hash`, `Vec2Pred`というクラスを定義して、`unordered_map`のコンストラクタとして渡せばOK

```cpp
class Vec2Hash
{
public:
    size_t operator () (const cocos2d::Vec2& key) const
    {
        // Vec2から固有の文字列を作成する
        auto str = cocos2d::StringUtils::format("%f,%f", key.x, key.y);
        // この文字列をハッシュ化する
        return std::hash<std::string>()(str);
    }
};

class Vec2Pred
{
public:
    bool operator () (const cocos2d::Vec2& lh, const cocos2d::Vec2& rh) const
    {
		// 2つのVec2が等しいかどうかを返す
        return lh == rh;
    }
};

typedef std::unordered_map<cocos2d::Vec2, cocos2d::Sprite *, Vec2Hash, Vec2Pred> DefinedMap;
```

しかし、`cocos2d::Map`では、これらの値をコンストラクタに渡すことができず、この方法は利用できません。

# cocos2d::Mapの場合

前述の`Hash`と`Pred`は、何も渡さないデフォルトの挙動の場合、それぞれ`std::hash<K>(K key)`, `std::to_equal<K>(K lh, K rh)`の実行結果が利用されるため、これらを定義してあげれば`cocos2d::Map`でも独自の型をキーに使うことができます。

[hash (C++11) - cpprefjp - C++ Library Reference](https://sites.google.com/site/cpprefjp/reference/functional/hash)

[比較演算関数オブジェクト - cpprefjp - C++ Library Reference](https://sites.google.com/site/cpprefjp/reference/functional/comparisons)

```cpp
namespace std
{
	template <>
	struct hash<cocos2d::Vec2>
    {
        std::size_t operator () (const cocos2d::Vec2& key) const
        {
            // Vec2から固有の文字列を作成する
            auto str = cocos2d::StringUtils::format("%f,%f", key.x, key.y);
            // この文字列をハッシュ化する
            return std::hash<std::string>()(str);
        }
    };
    
    template<>
    struct equal_to<cocos2d::Vec2>
    {
        bool operator () (const cocos2d::Vec2& lh, const cocos2d::Vec2& rh) const
        {
            // 2つのVec2が等しいかどうかを返す
            return lh == rh;
        }
    };
}

typedef cocos2d::Map<cocos2d::Vec2, cocos2d::Sprite *> DefinedMap;
```

このように、`std::hash<cocos2d::Vec2>`と`std::equal_to<cocos2d::Vec2>`を定義してあげる。

`std`名前空間を変更するのは汚い感じがするので、もっと良い方法があれば是非とも教えてください。
特定の文字列を含まないファイルを検索する

下記のように、tomという文字列を含む"a.txt"と"b.txt"、
hanakoという文字列を含む"c.txt"があるとします。

```
*:test$ cat a.txt b.txt c.txt 
tom is boy
tom is 13 years old
hanako ha kawaii
```

この場合に、tomを含むファイルを検索する場合は

```
grep -r tom ./*
```

としますが、逆にtomを含まないようなファイルを検索したい場合は

```
grep -L tom ./*

=> ./c.txt
```

こうすれば検索することが出来ます。
content_forの使い方(haml)

railsdoc (<http://railsdoc.com/references/content_for>)の説明および例がとてもわかりにくかったので、自分なりに理解したことをメモ。

### content_forとは？
* ある画面でだけcssファイルやjsを呼びだしたい場合に、利用するメソッドです。平たくいうと、画面のコンテンツを追加実装する仕組み、でしょうか。


### 実装例
* index.htmlのみでintro.css.scssというスタイルシートを呼び出したい場合は以下のように実装します。

layouts/application.html.haml

```
%html
  %head
    %meta{ charset: 'UTF-8' }
    %meta{ name: 'viewport', content: 'initial-scale=1.0, user-scalable=no' }    
    = stylesheet_link_tag    'application'
    = javascript_include_tag 'application'
    = yield :header  # コンテンツ名を:headerと定義します
```

views/index.html.haml (呼び出したい画面)の文頭

```
- content_for(:header) do
  = stylesheet_link_tag "intro"  # /assets/stylesheets/intro.css.scssを呼び出します
```

* これを実行すると、- content_for(:header) do ~ end内部の処理がheadで追加で読み込まれます  

実行結果

```
<html>
  <head>
    <meta charset='UTF-8'>
    <meta content='initial-scale=1.0, user-scalable=no' name='viewport'>
    <title>
      タイトル
    </title>
    <link href="/assets/application.css?body=1" media="screen" rel="stylesheet" />
    <script src="/assets/application.js?body=1"></script>
    <meta content="authenticity_token" name="csrf-param" />

    <link href="/assets/intro.css?body=1" media="screen" rel="stylesheet" />
(以下略)
```
as と is の入った switch 文を if 文で記述してみる


[Swiftに関するメモ その7 - 型変換](http://qiita.com/takkyun/items/41a04f37132dbb025c1b)で触れたとおり、`switch` 文の `case` には `as` や `is` が使えます。

Swift っぽい感じのプログラミングになって楽しいんですが、反面、慣れるまでは少し分かりづらいかもしれません。

[The Swift Programming Language (iBooks Store)](https://itunes.apple.com/us/book/the-swift-programming-language/id881256329?mt=11) の「Type Casting」にある `switch` 文のサンプルを `if` で書き換えてみました。

## 共通部

```swift
class Movie {
  var director: String
  var name: String
  init(name: String, director: String) {
    self.director = director
    self.name = name
  }
}

var things = Any[]()

things.append(0)
things.append(0.0)
things.append(42)
things.append(3.14159)
things.append(-3.14159)
things.append("hello")
things.append((3.0, 5.0))
things.append(nil)
things.append(Movie(name: "Ghostbusters", director: "Ivan Reitman"))
```

という部分は共通で、[The Swift Programming Language](https://itunes.apple.com/us/book/the-swift-programming-language/id881256329?mt=11) のサンプルコードは……

## switch サンプルコード

```swift
for thing in things {
  switch thing {
  case 0 as Int:
    println("zero as an Int")
  case 0 as Double:
    println("zero as a Double")
  case let someInt as Int:
    println("an integer value of \(someInt)")
  case let someDouble as Double where someDouble > 0:
    println("a positive double value of \(someDouble)")
  case is Double:
    println("some other double value that I don't want to print")
  case let someString as String:
    println("a string value of \"\(someString)\"")
  case let (x, y) as (Double, Double):
    println("an (x, y) point at \(x), \(y)")
  case let movie as Movie:
    println("a movie called '\(movie.name)', dir. \(movie.director)")
  default:
    println("something else")
  }
}
```

それを `if` に書き換えると……

## if サンプルコード

```swift
for thing in things {
  if thing as? Int == 0 {
    println("zero as an Int")
  } else if thing as? Double == 0 {
    println("zero as a Double")
  } else if let someInt = thing as? Int {
    println("an integer value of \(someInt)")
  } else if thing as? Double > 0 {
    let someDouble = thing as Double
    println("a positive double value of \(someDouble)")
  } else if thing is Double {
    println("some other double value that I don't want to print")
  } else if let someString = thing as? String {
    println("a string value of \"\(someString)\"")
  } else if let (x, y) = thing as? (Double, Double) {
    println("an (x, y) point at \(x), \(y)")
  } else if let movie = thing as? Movie {
    println("a movie called '\(movie.name)', dir. \(movie.director)")
  } else {
    println("something else")
  }
}
```

アセンブリコードレベルで同じかどうかまでの確認はしていません。あしからず。
「プログラムでシダを描画する」をJavaで描画する(PNG生成)

> 空前のシダ描画ブーム到来！？(^^;)
> あなたも得意なプログラミング言語でシダを描画してみよう！

[Java (AWT)バージョン](http://qiita.com/akmiyoshi/items/8038febbc7c2cfec23aa)に続いて、Java で PNG を生成するバージョンを書いてみました。
実行すると、カレントディレクトリ(カレントフォルダ)に sida.png というファイルが生成されます。
(バグとかご意見ありましたら https://twitter.com/akmiyoshi までお願いします)

![sida-2014-0620-0130.png](https://qiita-image-store.s3.amazonaws.com/0/32879/36ce2230-ec1c-7e18-c7e4-4db11c366e28.png)

```java:Sida.java
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.Random;
import javax.imageio.ImageIO;

public class Sida {

    static final int WIDTH = 500;
    static final int HEIGHT = 500;
    static final Random rnd = new Random();
    static final BufferedImage buffImage = new BufferedImage(WIDTH, HEIGHT,
            BufferedImage.TYPE_INT_BGR);
    static final Graphics2D graphics = buffImage.createGraphics();

    public static void main(String[] args) {
        graphics.setBackground(Color.DARK_GRAY);
        graphics.clearRect(0, 0, WIDTH, HEIGHT);
        f(20, 0, 0);
        try {
            ImageIO.write(buffImage, "png", new File("sida.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    static double W1x(double x, double y) {
        return 0.836 * x + 0.044 * y;
    }

    static double W1y(double x, double y) {
        return -0.044 * x + 0.836 * y + 0.169;
    }

    static double W2x(double x, double y) {
        return -0.141 * x + 0.302 * y;
    }

    static double W2y(double x, double y) {
        return 0.302 * x + 0.141 * y + 0.127;
    }

    static double W3x(double x, double y) {
        return 0.141 * x - 0.302 * y;
    }

    static double W3y(double x, double y) {
        return 0.302 * x + 0.141 * y + 0.169;
    }

    static double W4x(double x, double y) {
        return 0;
    }

    static double W4y(double x, double y) {
        return 0.175337 * y;
    }

    static void f(int k, double x, double y) {
        if (0 < k) {
            f(k - 1, W1x(x, y), W1y(x, y));
            if (rnd.nextDouble() < 0.3) {
                f(k - 1, W2x(x, y), W2y(x, y));
            }
            if (rnd.nextDouble() < 0.3) {
                f(k - 1, W3x(x, y), W3y(x, y));
            }
            if (rnd.nextDouble() < 0.3) {
                f(k - 1, W4x(x, y), W4y(x, y));
            }
        } else {
            plot((x * WIDTH * 0.98) + (WIDTH * 0.5), HEIGHT - (y * HEIGHT * 0.98));
        }
    }

    static void plot(double xd, double yd) {
        int x = (int) xd;
        int y = (int) yd;
        graphics.setPaint(Color.green);
        graphics.drawLine(x, y, x, y);
    }
}
```
MongoDBで大量にデータを入れたい場合は、バルクインサート

MongoDBで大量にデータを入れたい場合は、バルクインサートを使いましょう。

ようは、

```
db.col.insert({a:1})
db.col.insert({b:1})
db.col.insert({c:1})
```
とするのではなく、

```
db.col.insert( [ {a:1},{b:1},{c:1} ] )
```
という感じでドキュメントを配列にして渡してあげるだけ。
これだけで全然スピード変わりますよ。
クラスによるタイプコードの置き換え

enumのような定数群をクラスで代替できる。
enumより優れている点はプロパティを持てるということ

```BloodGroup.cs
class BloodGroup {
  public static readonly BloodGroup O = new BloodGroup(0);
  public static readonly BloodGroup A = new BloodGroup(1);
  public static readonly BloodGroup B = new BloodGroup(2);
  public static readonly BloodGroup AB = new BloodGroup(3);

  private readonly int _code;
  
  private BloodGroup(int code) {
    _code = code;
  }

  public int getCode() {
    return _code;
  }
}
```

```Person.cs
class Person {
  private int bloodO = BloodGroup.O.getCode();
  private int bloodA = BloodGroup.A.getCode();
}
```
正規表現で大文字や小文字に置換する

\uや\lを使えば、大文字や小文字に置換することができます。

# 大文字へと置換
たとえば

> foo_bar_hoge_piyo

の
`(^|_)(.)`を`\u\2`に置換すると、

> FooBarHogePiyo

とアッパーケースにできます。

# 小文字へと置換

> LOG_FILE.TXT

の`(.)`を`\l\1`に置換すれば

> log_file.txt

とロワーケースにできます。


# 使えないエディタもあります
エディタによっては、採用している正規表現エンジンの違いで大文字/小文字への置換ができません。
Vimや、Windowsだとサクラエディタなら使えます。
Tomcat で巨大なJSPファイルをなんとかコンパイルする方法

## サイズの大きいJSPがあると、Tomcatで実行時エラーが発生します

>An error occurred at line: [264] in the generated java file: [D:\apache-tomcat-7.0.54\work\SampleApp\org\apache\jsp\WEB_002dINF\jsp\Sample01_jsp.java]
>The code of method _jspService(HttpServletRequest, HttpServletResponse) is exceeding the 65535 bytes limit
>
>Stacktrace:
>	at org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:103)
>	at org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:366)

このような感じで、JSP をコンパイルしようとするタイミングでエラーが発生します。
今回は 200KB くらいの JSP ファイルで発生しました。

Tomcat が JSP を Java ファイルに変換するのですが、その Java ファイルのサイズが 65,535 byte を超えるとエラーが発生する仕様となっているようです。

## 解決策① JSP をファイル分割する

&lt;jsp:include&gt; などを使って、JSP を分割することで、JSP から変換した Java ファイルひとつひとつのファイルサイズを抑えることができます。

確実な手段ですが、一度作りあげた巨大な JSP ファイルを分割していくのはかなり一苦労です。

## 解決策② Tomcat JSP Engine の mappedfile 設定を変える

Tomcat は JSP の仕様を実装するために、Jasper 2 JSP Engine というものを使用しています。
そして、この JSP Engine には mappedfile という設定があります。

http://tomcat.apache.org/tomcat-7.0-doc/jasper-howto.html#Configuration

この mappedfile 設定を有効にすると JSP から Java に変換する際、
デバッグしやすくなるように JSP 1行に対して、Java 1行が対応するように変換します。

逆にこの設定を無効にすると、余計なことを気にせず Java に変換します。
つまり、Java ファイルのファイルサイズが小さくなります。

### mappedfile 設定を変更する方法

<TOMCAT_HOME>/conf/web.xml の内容を変更します。
JspServlet について設定している箇所に mappedfile の設定を加えます。

```lang:xml
    <servlet>
        <servlet-name>jsp</servlet-name>
        <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
        <init-param>
            <param-name>fork</param-name>
            <param-value>false</param-value>
        </init-param>
        <init-param>
            <param-name>xpoweredBy</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>3</load-on-startup>
    </servlet>
```

という設定が web.xml の前半部分にありますので…

```lang:xml
    <servlet>
        <servlet-name>jsp</servlet-name>
        <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
        <init-param>
            <param-name>fork</param-name>
            <param-value>false</param-value>
        </init-param>
        <init-param>
            <param-name>mappedfile</param-name>
            <param-value>false</param-value>
        </init-param>
        <init-param>
            <param-name>xpoweredBy</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>3</load-on-startup>
    </servlet>
```
という感じに mappedfile のパラメータに対して false を設定します。

何も設定しなければ、mappedfile は true（有効：JSP 1行に Java 1行）がデフォルトです。
Tomcat のバージョンによってはデフォルトが false になっていたものもあるようです。

### 注意点

デフォルト設定よりも Java ファイルを比較的小さくする回避策ですので、
超巨大な JSP であれば、この回避策を施したとしても 65,535 byte の上限を超えてしまう可能性があります。

## ちなみに

Tomcat（≒Jasper 2 JSP Engine）固有のエラーのようです。
WebSphere Application Server（WAS）だと、同様の実行時エラーは発生しませんでした。

同じ JSP でも WAS は動きます。
超巨大なファイルであればダメかもしれませんが、未検証です。
Data Bag を使ってユーザ追加を自動化してみた


Data Bagを使ってユーザ登録をしてみた。

## Data Bag を作成する

`knife data bag create`コマンドで **user** という名前のData Bagを作成する。

```
$ knife data bag create user
```

次に、data bagに格納するデータをJSON形式で用意する。
作成するユーザー名やグループ名、関連プロパティなどを記述した **default.json** というファイルを作成する。

```json:data_bags/users/default.json
{
  "id": "default",
  "groups": [
    {
      "name": "apple",
      "gid": 1000
    }
  ],
  "users": [
    {
      "name": "jobs",
      "uid": 1001,
      "gid": 1000,
      "home": "/home/jobs",
      "shell": "/bin/bash",
      "comment": "CEO",
      "password": "$1$l5gWNx5i$ebiM7uknseQY2rjNDGdgA1",
      "ssh_keys": "ssh-rsa ..."
    }
  ]
}
```

`"id”: “default”`はData Bagに格納するデータに必須の項目で、Data Bagに格納するデータ（ハッシュ）は、この項目で指定した名前で管理される。このデータは、Recipe側からは"default"という名前でアクセスできる。

ちなみにパスワードは```openssl```でハッシュ化しないといけないらしい。

```
$ openssl passwd -1 'PASSWORD'

$1$l5gWNx5i$ebiM7uknseQY2rjNDGdgA1
```

Data Bagの中身は、`knife data bag show`コマンドで確認できる。

```
$ knife data bag show users default -z

groups:
  gid:  1000
  name: apple
id:     defaults
users:
  comment:  CEO
  gid:      1000
  home:     /home/jobs
  name:     manage
  password: $1$l5gWNx5i$ebiM7uknseQY2rjNDGdgA1
  shell:    /bin/bash
  ssh_keys: ssh-rsa ...
  uid:      1001
```

※`knife solo`環境の場合は`-z`を付けないと怒られるみたいです。。

## レシピを作成する

Data Bag を利用したレシピは下記の通り。

```ruby:recipe
accounts = data_bag('user')
accounts.each do |id|
  item = data_bag_item('user', id)

  item['groups'].each do |g|
    group g['name'] do
      gid g['gid']
      action :create
    end
  end

  item['users'].each do |u|
    user u['name'] do
      uid u['uid']
      gid u['gid']
      home u['home']
      shell u['shell']
      comment u['comment']
      password u['password']
      supports :manage_home => true
      action :create
    end
    directory "/home/#{u['name']}/.ssh" do
      owner u['uid']
      group u['gid']
      mode 0700
      action :create
    end
    file "/home/#{u['name']}/.ssh/authorized_keys" do
      owner u['uid']
      group u['gid']
      mode  0600
      content u['ssh_keys']
      action :create_if_missing
    end
  end

end
```

とりあえずこれで動くけど、ちゃんとRubyを分かってないとこれ以上はキツイ感じ。。
Rubyのイテレータメソッドと似ているJavascriptの便利なメソッド

ECMAScript5になり、Rubyのイテレータメソッドに似たメソッドはJavascriptでも使えるようになった。それが下記のメソッドである
オブジェクトはArrayである

##forEach(Rubyのeachのようなもの)

```js

var array = [1, 2, 3, 4, 5];
var sum = 0;

array.forEach(function(value){
  sum = value + sum  
});

console.log(sum)

//=> 15

```

##map(Rubyのmapのようなもの)

```js

var array = [1, 2, 3, 4, 5];

even_array = array.map(function(value){
  return value * 2
});

console.log(even_array);

//=> [2, 4, 6, ,8, 10]

``` 

##reduce(Rubyのinjectのようなもの)

```js

var a = [1, 3, 5, 7];

var sum = a.reduce(function(pre, value){
  return pre + value;
});

console.log(sum)

//=> 16

```

##filter(Rubyのselectのようなもの)

```js
var a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

var m = a.filter(function(value){
  return (value % 2 == 0);
});

console.log(m)

//=> [2, 4, 6, 8, 10]
```

##every(Rubyのall?のようなもの)

```js

var a = [1, 2, 3, 4, 5];
var b = [1, 2, 3]

int_1 = a.every(function(value){
  return (value <= 3)
});

int_2 = b.every(function(value){
  return (value <= 3)
});

console.log(int_1); //=> false
console.log(int_2); //=> true

```

##some(Rubyのany?のようなもの)

```js

var a = [1, 2, 3, 4, 5, 6, 7];

int_1 = a.some(function(value){
  return (value <= 3)
});

console.log(int_1) //=> true
```
【Ruby】Hashのdeep copyとMarshal

簡単なHashの深いコピーぐらいならMarshal使わないほうがいいかもという話(実行時間的に)。

ベンチマーク取りました。
rubyのバージョン 2.1.2p95

```ruby:marshal_bench.rb
require 'benchmark'

puts Benchmark::CAPTION
source_hash = {
  'key1' => ['first', 'second', 'third'],
  'key2' => ['one', 'two'],
  'key3' => ['single']
}


duped = Marshal.load(Marshal.dump(source_hash))

marshal_block = ->{ Marshal.load(Marshal.dump(source_hash)) }

assign_block = ->{
  new_hash = {}
  source_hash.each do |k, v|
    value = []
    v.each do |e|
      value.push(e)
    end

    new_hash[k] = value
  end
  new_hash
}

puts Benchmark.measure {
  10000.times do |i|
    marshal_block.call
  end
}

puts Benchmark.measure {
  10000.times do |i|
    assign_block.call
  end
}


new_hash = assign_block.call
source_hash.each do |k, v|
  p (v.__id__ != new_hash[k].__id__)
end
```

結果(オブジェクトIDがことなることの確認も含む)

```
      user     system      total        real
  0.180000   0.000000   0.180000 (  0.182431)
  0.020000   0.000000   0.020000 (  0.023417)
true
true
true
```
Rubyで簡単なベンチマークをとる

忘れるとめんどくさいのでメモ。

```ruby:benchmark.rb
# 数値を0パディングして出力したいとき
require 'benchmark'

puts Benchmark::CAPTION

value = 71200.to_f / 100000

loop_num = 1000000

puts Benchmark.measure {
  loop_num.times do |i|
    sprintf("%.3f", value)
  end
}

puts Benchmark.measure {
  loop_num.times do |i|
    format("%.3f", value)
  end
}

puts Benchmark.measure {
  loop_num.times do |i|
    value.to_s.rjust(5, "0")
  end
}

puts Benchmark.measure {
  loop_num.times do |i|
    "%.3f" % value
  end
}
```

```:出力例
      user     system      total        real
  1.150000   0.010000   1.160000 (  1.277304)
  1.160000   0.000000   1.160000 (  1.401652)
  0.850000   0.000000   0.850000 (  0.979059)
  1.340000   0.000000   1.340000 (  1.346500)
```

rjustはやい。

詳しくはこちら
http://docs.ruby-lang.org/ja/2.1.0/class/Benchmark.html
File#getCanonicalPath()とFile#getAbsolutePath()とFile#getPathとの違い　絶対パスにも"."や".."が入ります

File#getAbsolutePath()のAPI仕様には

> この抽象パス名の絶対パス名文字列を返します。

とあるのですが、
私は「絶対パス = "."や".."が入らないパス」くらいの認識だったのに、
File#getAbsolutePath()で返ってくるファイルパスにも
1つ上のディレクトリを表す".."が入ってきて意外だったことがあったのでこの記事を書きました。

API仕様を読んだりコードを動かしたりすると、次のことが分かりました。

|メソッド名|`new File("../file")`のオブジェクトで呼んだときの戻り値（現在のディレクトリは/foo/bar/）|備考|
|---|---|---|
|getCanonicalPath|/foo/file|正規パス。"."や".."を解決する。シンボリックリンクを解決する。IOExceptionをスローする|
|getAbsolutePath|/foo/bar/../file|絶対パス。"."や".."が入りうる|
|getPath|../file|相対パスの時も絶対パスの時もある。たとえば`new File("/file")`で呼べば絶対パスになる|

こう並べてみると、次のようにまとめられます。

* File#getCanonicalPath()：返ってくるファイルパスを想像しやすい。シンボリックリンクを解決するので、シンボリックリンクとリンク先のファイルとでアクセス権を変えてあるのを忘れているときに厄介なことになりそう。IOExceptionをスローしているので面倒。
* File#getAbsolutePath：一番まとも。"."や".."が入ってくることがあるけれど、大抵の場合に支障はない（？）
* File#getPath：相対パスを使いたい理由があるときにしか使わなさそう。

ですね。
PhoneGapで"Uncaught TypeError: Cannot call method 'alert' of undefined"と怒られたとき


## 原因
cordova.js, cordova_plugins.jsが読み込まれていない．
## 対処方
下記をindex.htmlに追記．
<pre>&lt;script type="text/javascript" src="cordova.js"&gt;&lt;/script&gt;  
&lt;script type="text/javascript" src="cordova_plugins.js"&gt;&lt;/script&gt;</pre>
Dateオブジェクトの勉強

昨日の[JavaScriptで作る「あなたの誕生日診断」 (全5回)](http://dotinstall.com/lessons/date_js)を復習。
#birthdayを表すデータオブジェクト？

``var birthday = document.getElementById('birthday').value;
var d1 = new Date(birthday);``

2行目のnew Date()の中に、なぜbirthdayと入るのかがわからない。これはnameのbirthday、idのbirthday、変数のbirthdayのどれにあたるのか。引き続き調べてみるとnew Date();は引数を指定しないと現在の日付でDateオブジェクトを作るらしい。引数は入門動画でも何度か出てきたがわかっていない。MDNで調べてもピンとこなかったので入門動画の[#12 関数を使ってみよう](http://dotinstall.com/lessons/basic_javascript_v2/26712)を再度確認。

``function hello(name) {
	console.log("hello " + name);
}
hello("Tom");
hello("Ken");``

こちらから与えたい値があるときは引数を利用するということだろうか。ということはnew Date(birthday);の引数はid=birthdayの中に入力された値ということかもしれない。ユーザーが入力した値（どんな値かはわからない）でDateオブジェクトを作りたいときはnew Date(ここに入力欄のid)と書けばいいのだろうか？そして、それを変数に代入する。

モヤモヤしていたものが少し晴れた気がした。が、合っているかはわからない。引き続き勉強しよう。
Zend\Log\LoggerでZend\DI環境で使う設定

module.config.phpやglobal.phpでの指定
※ファイルに書き出す場合

```config/autload/global.php
return array(
    'di' => array(
        'instance' => array(
            'preferences' => array(
                'Zend\\Log\\LoggerInterface' => 'Zend\\Log\\Logger',
            ),
            'Zend\\Log\\Logger' => array(
                'parameters' => array(
                    'options' => array(
                        'writers' => array(
                            array(
                                'name' => 'stream',
                                'options' => array(
                                    'stream' => '/path/to/logfile'
                                ),
                            ),
                        ),
                    ),
                ),
            ),
        ),
    ),
);
```
Eloquent でストアドプロシージャを呼ぶ

# Eloquent でストアドプロシージャを呼ぶ

```mysql
mysql> DELIMITER $$
mysql> CREATE PROCEDURE MyAwesomeProcedure(OUT output datetime)
    -> BEGIN
    ->     SELECT DATE_ADD(NOW(), INTERVAL 10 YEAR) INTO output;
    -> END;
    -> $$
Query OK, 0 rows affected (0.00 sec)

mysql> DELIMITER ;
mysql> CALL MyAwesomeProcedure(@result);
Query OK, 1 row affected (0.00 sec)

mysql> SELECT @result AS ret;
+---------------------+
| ret                 |
+---------------------+
| 2024-06-19 22:07:14 |
+---------------------+
1 row in set (0.00 sec)

mysql>
```


```php
DB::select(DB::raw('CALL MyAwesomeProcedure(@result)'));
$result = DB::select('SELECT @result AS awesome');
$value = $result[0]->awesome;
```

2014-07-11 追記

Laravel 4.2.4 にて実行したところ、PDO 絡みの Exception が発生してしまった。

`exception 'Illuminate\Database\QueryException' with message 'SQLSTATE[HY000]: General error: 2053 (SQL: CALL ...`

下記のように修正したところ QueryException を回避できましたので追記してお知らせいたします。

```php
DB::statement('CALL MyAwesomeProcedure(@result)');
$result = DB::select('SELECT @result AS awesome');
$value = $result[0]->awesome;
```
「プログラムでシダを描画する」をJulia + Cairoで描画する

> 空前のシダ描画ブーム到来！？(^^;)
> あなたも得意なプログラミング言語でシダを描画してみよう！

シダ表示プログラムの [Julia](http://julialang.org/) 版を作ってみました。
グラフィックの描画のために [Cairo パッケージ](https://github.com/JuliaLang/Cairo.jl)を追加しています。
実行すると、カレントディレクトリ(カレントフォルダ)に sida.png というファイルが生成されます。
(尚、バグとかご意見ありましたら https://twitter.com/akmiyoshi までお願いします)

![sida.png](https://qiita-image-store.s3.amazonaws.com/0/32879/e295084c-c4f1-9834-2f7a-0d4887a0631c.png)

とりあえず、ソースだけ…

```text:sida.jl
using Cairo

WIDTH=500;
HEIGHT=500;

W1x(x, y) = 0.836  * x + 0.044 * y;
W1y(x, y) = -0.044 * x + 0.836 * y + 0.169;
W2x(x, y) = -0.141 * x + 0.302 * y;
W2y(x, y) = 0.302  * x + 0.141 * y + 0.127;
W3x(x, y) = 0.141  * x - 0.302 * y;
W3y(x, y) = 0.302  * x + 0.141 * y + 0.169;
W4x(x, y) = 0;
W4y(x, y) = 0.175337 * y;

function plot(x,y)
  x = trunc(x);
  y = trunc(y);
  set_source_rgb(cr,0.0,1.0,0.0); # green
  rectangle(cr,x,y,1.0,1.0);      # plot
  fill(cr);
end

function f(k, x, y)
    if 0 < k
        f(k - 1, W1x(x, y), W1y(x, y));
        if rand() < 0.3
            f(k - 1, W2x(x, y), W2y(x, y));
        end
        if rand() < 0.3
            f(k - 1, W3x(x, y), W3y(x, y));
        end
        if rand() < 0.3
            f(k - 1, W4x(x, y), W4y(x, y));
        end
    else
        plot((x * WIDTH * 0.98) + (WIDTH * 0.5), HEIGHT - (y * HEIGHT * 0.98));
    end
end

# main()

c = CairoRGBSurface(WIDTH,HEIGHT);
cr = CairoContext(c);

set_font_size(cr,WIDTH*0.06);

set_source_rgb(cr,0.2,0.2,0.2);     # gray
rectangle(cr,0.0,0.0,WIDTH,HEIGHT); # background
fill(cr);

move_to(cr,0.0,WIDTH*0.06);
set_source_rgb(cr,1,1,1);       # white
show_text(cr,strftime(time())); # text

f(20, 0, 0);

move_to(cr,0.0,WIDTH*0.06*2);
set_source_rgb(cr,1,1,1);       # whilte
show_text(cr,strftime(time())); # text

write_to_png(c,"sida.png");
```
本番(or staging)でエラーログを詳しく見たい

リリース前に本番などでエラーが起きた時に、ログからさかのぼるのはウザい
本番でもdevelopment と同じように画面からエラーログを見たいと思います。

こんな感じでgemを入れたりします。

``` 
gem "binding_of_caller"
```
しかしgemを入れるだけでは不足です

better-erros はエラーログを「見やすく」するためのgemです。つまりエラーログが出ないと意味がありません。
production ではエラーログをはきません。
そこでdevelopment と同じようにエラーを吐かす必要があります。
具体的には configの enviroment/production.rb内にここを変えます(false => true)

```
config.consider_all_requests_local       = true
```

これで本番でもエラーログをおいやすくなります。
こういう措置が必要なのはリリース直前の追い込みなので、エラーログが追いやすくなれば徹夜しづらくなると思います。
Apache Spark application 開発環境構築 (1)

#Apache sparkの開発環境構築のために
そろそろ、spark-shellだけでなく、アプリケーションを作成して実行させたいため、windows上に環境構築を作成しようと思ったのでメモ。
以下のアプリはインストール済み。
~~* scala 2.11.1（ SCALA_HOMEを設定しておく）~~
* scala 2.10.4（ SCALA_HOMEを設定しておく）
* gitクライアント

※ spark installだけならscalaはまだ必要ないかも・・。


# Apache Sparkのインストール
参考サイト : [Running the Examples and Shell](http://spark.apache.org/docs/latest/index.html)
[Windowsへのインストール](http://www.ne.jp/asahi/hishidama/home/tech/scala/spark/install.html)

gitを使い任意のディレクトリへsparkをクローンします.
今回は `C:\dev`配下にしています。
```
cd C:\dev
git clone git://github.com/apache/spark.git
```
# Apache Sparkのビルド
`C:\dev\spark\sbt`に`sbt.bat`を作成します。

参考:[For non-Cygwin users using the standard Windows terminal, create a batch file sbt.bat](http://www.scala-sbt.org/release/tutorial/Manual-Installation.html)

### sbt-launch.jarのダウンロード
[sbt-launch.jar](http://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/sbt-
launch/0.13.5/sbt-launch.jar)をダウンロードし、`C:dev\spark\sbt`に置く。


### sbt.batの作成

```sbt.bat
@echo off
set SPARK_HOME=%~dp0..
echo %SPARK_HOME%
java -Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256M -jar %SPARK_HOME%\sbt\sbt-launch.jar %*
```
assemblyを実行します。実行するときは、`%SPARK_HOME%`に移動して実行します。
```
cd C:\dev\spark 
sbt\sbt.bat assembly 
```

# 動作確認

###spark-shellの起動
```
bin\spark-shell
```

### spark-shell_application_UIを開き、起動ができたかどうか確認.
```
http://localhost:4040
```

下みたいな画面が表示されれば起動できている。(Completed Stagesの部分はアプリの実行後の場合)
![spark-shelUI.JPG](https://qiita-image-store.s3.amazonaws.com/0/36221/27b15352-f706-54ae-b64e-ab7d1edb49ec.jpeg)

### examplesの実行
```
bin\run-example.cmd SparkPi 10
..
..
Pi is roughly 3.14492
```
以上で、ローカルでのspark実行環境が出来ました。
次は、Eclipse上でのビルド環境の構築かな・・・。
RuboCop | Style/BlockNesting

# RuboCop | Style/BlockNesting

## 概要

RuboCopの「Style/BlockNesting」警告について。

この警告は、if文等のネストをチェックしてくれます。
デフォルトは 3 階層に設定されています。

名前はBlockNestingになっていますが、Rubyのブロックはこの警告のチェック対象外。

## ネストのチェック対象

* :case
* :if
* :while
* :until
* :for

## BlockNesting

デフォルトの設定値での検証結果をまとめます。

### 検証プログラム

block_nesting.rb

~~~ruby
if (msg == 1)
  if (msg == 2)
    if (msg == 3)
      if (msg == 4)
        print 'if'
      else
        print 'else4'
      end
    else
      print 'else3'
    end
  else
    print 'else2'
  end
else
  print 'else1'
end
~~~

### 実行結果

~~~bash
$ rubocop block_nesting.rb
Inspecting 1 file
C

Offenses:

block_nesting.rb:4:7: C: Avoid more than 3 levels of block nesting.
      if (msg == 4)
      ^^^^^^^^^^^^^

1 file inspected, 1 offense detected
~~~
homebrewを使ってiTerm2でRicty for powerline設定した


`prezto`で[`powerline`テーマ](https://github.com/davidjrice/prezto_powerline)使いたかったので

## インストール

```zsh
brew update

# すでにRictyがインストールされている場合
brew uninstall ricty

# Rictyがインストールされていない場合tapでリポジトリを追加する
brew tap sanemat/font

brew install --vim-powerline ricty

# 展開ディレクトリは環境に合わせる
cp -f /usr/local/Cellar/ricty/3.2.3/share/fonts/Ricty*.ttf ~/Library/Fonts/ 

# フォントのキャッシュ削除
fc-cache -vf

# シェルの再起動
exec $SHELL -l
```

## 設定

iTermの`環境設定 > Profiles > Default > Text`の
`Regular Font`と`Non-ASCII Font`を`Ricty Regular for Powerline`に設定する

これで`oh-my-zsh`や`prezto`でかっこいいpromptが表示できるようになる（別途テーマのインストールが必要）

![pl.png](https://qiita-image-store.s3.amazonaws.com/0/36767/96248719-58dd-691f-cea2-b434f39f1c54.png "pl.png")

かわいい
Mac 版 PhpStorm のファイルツリーでファイルを選択して開く操作を楽にするための設定


## これはなに

Mac の PhpStorm で

* ファイルツリーなど、エディタ以外の場所でも `ctonrtol` + `P`/`N` でカーソルを上下させる
* ファイルツリーからファイルを選択してすぐエディタにフォーカスする

ための、[Karabiner](https://pqrs.org/osx/karabiner/index.html.ja "Karabiner") (旧 KeyRemap4MacBook) の設定。

## なんでこんなことするの

* PhpStorm のエディタ上では `ctonrtol` + `P`/`N` でカーソル上下するけど、ファイルツリーではこのショートカットが効かないから。
* ファイルツリーから `return` でファイルを開いてもファイルツリーにフォーカスしたままで、エディタに移動するには `esc` を押さないといけないから。

## 設定のしかた

1. Karabiner の設定画面の `Misc & Uninstall` タブにある `Custom Setting` 欄の `Open private.xml` ボタンを押す。
2. `private.xml` を何かエディタで開く。
3. 下記 `private.xml` の内容を書き込む。もう何か書いてあったら適当にマージ。
4. KeyRemap4MacBook の `Change Key` タブで右上の `ReloadXML` ボタンを押したら `remapping` のツリーに次の2つが出るのでチェックを入れる。
	* `Control+P/N to Arrow Up/Down (on PhpStorm)`
	* `Command+Control+Enter to Enter+Escape (on PhpStorm)`

```private.xml
<?xml version="1.0"?>
<root>
  <appdef>
    <appname>PHPSTORM</appname>
    <equal>com.jetbrains.PhpStorm</equal>
  </appdef>

  <list>
    <item>
      <name>Control+P/N to Arrow Up/Down (on PhpStorm)</name>
      <identifier>private.control_pn_to_updown</identifier>
      <only>PHPSTORM</only>
      <autogen>
        --KeyToKey--
        KeyCode::P, ModifierFlag::CONTROL_L | ModifierFlag::NONE,
        KeyCode::CURSOR_UP
      </autogen>

      <autogen>
        --KeyToKey--
        KeyCode::N, ModifierFlag::CONTROL_L | ModifierFlag::NONE,
        KeyCode::CURSOR_DOWN
      </autogen>
    </item>

    <item>
      <name>Command+Control+Enter to Enter+Escape (on PhpStorm)</name>
      <identifier>private.command_control_enter_to_enter_escape</identifier>
      <only>PHPSTORM</only>
      <autogen>
        --KeyToKey--
        KeyCode::RETURN, ModifierFlag::COMMAND_L | ModifierFlag::CONTROL_L,
        KeyCode::RETURN, KeyCode::ESCAPE
      </autogen>
    </item>
  </list>
</root>
```

## 使い方

1. PhpStorm でファイルツリーにフォーカスする。(`Command` + `1`)
2. `control` を押しながら `P`/`N` で上下する。
3. 開きたいファイルにカーソルをあわせて `command` + `control` + `return` を押す。

これでファイルを開いてすぐエディタにフォーカスします。

なんで `command` + `control` + `return` にしたかというと、`control` + `return` は PhpStorm デフォルトのキーマップとかぶるから。`control` + `P`/`N` で上下してそのまま親指で `command` を押しつつ `return` を押すという流れを覚えれば割と楽です。
makoでrender関数を擬似的なhtmlタグとして使う

# makoでrender関数を擬似的なhtmlタグとして使う

[mako](http://docs.makotemplates.org/en/latest/) では、定義したrender関数を擬似的なhtmlタグのようにして使う事ができる。
([Bootstrapのdropdownのサンプル](http://getbootstrap.com/components/#dropdowns-example) を利用)　
具体的には以下の様なコードがhtmlへとレンダリングされる。

```
<!-- drop down widget -->
<%namespace file="./widget.html" name="w"/>

<%w:dropdown name="DropDown" id="dropdownMenu1">
  <%w:menu id="first" href="#">Action</%w:menu>
  <%w:menu href="#">Another Action</%w:menu>
  <%w:menu href="#">Something else here</%w:menu>
  <li role="presentation" class="divider"></li>
  <%w:menu href="#">Separated link</%w:menu>
</%w:dropdown>
```

このコードが以下のようなhtmlになる(空白行を除去)。

```html
<div class="dropdown">
  <button class="btn dropdown-toggle" type="button" id=dropdownMenu1 data-toggle="dropdown">
    DropDown
    <span class="caret"></span>
  </button>
  <ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu1">
    <li role="presentation"><a id=first role="menuitem" tabindex="-1" href="#">Action</a></li>
    <li role="presentation"><a  role="menuitem" tabindex="-1" href="#">Another Action</a></li>
    <li role="presentation"><a  role="menuitem" tabindex="-1" href="#">Something else here</a></li>
    <li role="presentation" class="divider"></li>
    <li role="presentation"><a  role="menuitem" tabindex="-1" href="#">Separated link</a></li>
  </ul>
</div>
```

以下詳細

## makoではrender関数の呼び方が２種類ある。

以下のようなrender関数formを定義した時。

```
## helpers.html
<%def form="(action, method)">
<div class="form">
<form action="${action}" method="${method}">
</form>
</div>
</%def>
```

呼び出し方は２通りある。１つ目は${foo}形式で変数展開と同様の形で呼び出す。

```
<%namespace file="./helpers.html" name="h"/>
## form
${h.form(action="#", method="POST")}
```

また以下の様に書いても良い。これは２つ目の形式。

```
<%namespace file="./helpers.html" name="h"/>
## form
<%h:form action="#" method="POST"></%h:form>
```

タグのような形式で呼び出せる。

## caller.body()を使うと、呼び出し側で内部に値を埋め込むことができる
タグのような形式で呼び出せることのの何が良いかというとコードブロックの中に何らかの値を埋め込める。

```
## 以下の様に書ける。
<%h:form action="#" method="POST">
  <div class="field has-feedback">
    <label>name:<input type="text" name="name"/></label>
  </div>
</%h:form>
```

すると、先にラップする外側の部分を作っておき、内部の要素は呼び出し時に決めるということができる。
これを行うにはcaller.body()を使う。以下の様にコードを変更すると上の例が動作するようになる。

```
<%def form="(action, method)">
<div class="form">
<form action="${action}" method="${method}">
${caller.body()}
</form>
</div>
</%def>
```

## 冒頭の例を動かす際の完全なコード

[gist](https://gist.github.com/podhmo/c9c45080aa32571e3b85)

## 参考

* [Defs and Blocks — Mako 1.0.0 Documentation](http://docs.makotemplates.org/en/latest/defs.html?highlight=caller%20body#calling-a-def-with-embedded-content-and-or-other-defs)
* [Bootstrap (dropdowns-example)](http://getbootstrap.com/components/#dropdowns-example)
Go 1.2.2 -> 1.3 アップグレード私的作業メモ

Go 1.2.2 が入っている環境に 1.3 をインストールしたときのメモ．

## 環境

* Mac OS X 10.8.5
* Go 1.2.2 インストール済み
  - [前回インストール手順](http://qiita.com/tnoda_/items/49af2d37ec23fc243642)

## 1.2.2 の削除

http://golang.org/doc/install#install によると，

> If you are upgrading from an older version of Go you must first remove the existing version.

とあるので，インストール済み 1.2.2 を削除します．削除方法は，http://golang.org/doc/install#uninstall によると，

> To remove an existing Go installation from your system delete the go directory. This is usually /usr/local/go under Linux, Mac OS X, and FreeBSD or c:\Go under Windows.

とあるので /usr/local/go を消すだけで良いようです．

    ~ % ls /usr/local/go
    AUTHORS		PATENTS		api		doc		lib		robots.txt
    CONTRIBUTORS	README		bin		favicon.ico	misc		src
    LICENSE		VERSION		blog		include		pkg		test
    
    ~ % sudo mv /usr/local/go /usr/local/go-1.2.2
    Password:
    
    ~ % ls /usr/local/go-1.2.2
    AUTHORS		PATENTS		api		doc		lib		robots.txt
    CONTRIBUTORS	README		bin		favicon.ico	misc		src
    LICENSE		VERSION		blog		include		pkg		test


## パッケージのインストール

つぎに，公式パッケージをインストールします．


    ~/work $ curl -L -O http://golang.org/dl/go1.3.darwin-amd64-osx10.8.pkg
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    100    91    0    91    0     0    301      0 --:--:-- --:--:-- --:--:--   304
    100 49.0M  100 49.0M    0     0  2614k      0  0:00:19  0:00:19 --:--:-- 2714k
    
    ~/work $ openssl sha1 go1.3.darwin-amd64-osx10.8.pkg
    SHA1(go1.3.darwin-amd64-osx10.8.pkg)= 4e8f2cafa23797211fd13f3fa4893ce3d5f084c4
    
    ~/work $ open go1.3.darwin-amd64-osx10.8.pkg

## 確認

Go が 1.3 になっていることを確認します．

    ~/work $ go version
    go version go1.3 darwin/amd64


## おわりに

Go 1.2.2 を 1.3 にアップグレードしました．パッケージをインストールするだけの簡単な作業でした．今回は公式サイトの指示に従って旧版を削除しましたが，この手順が本当に必要かどうかは自信がありません．
TopcoderでContestAppletProdが起動しない時の対処方法

せっかく部員でTopcoderやろうってなったのに、アプレットが起動しなかった。つらい。

Java Platform (JDK) をインストールする。

%sudo add-apt-repository ppa:webupd8team/java
%sudo apt-get update
%sudo apt-get -y install oracle-java8-installer
%sudo apt-get -y install oracle-java8-set-default 
%java -version

【参考】
http://www.kkaneko.com/rinkou/javaintro/ubuntu_jdk.html
即売会サービスを作ろう１２(AndEngineのスプライトアニメーション)


##AndEngine GLES2-Anchor ブランチ

AndEngine にはSpriteのアンカーポイントの設定がなくてなんて不便なんだろうと
思ってたのですが、違うブランチ(GLES2-AnchorCenter)で用意されているようです。
それで違うブランチのを使用したら座標系が変わったようで、Y座標軸が反対になりました。
Cocos2dっぽいですね！


##スプライトアニメーション

会場内をキャラクタが歩くのに使われるスプライトアニメーション(コマアニメ)は
・ITiledTextureRegion を生成して、テクスチャ内のスプライトの分割情報を入れておく
・AnimatedSprite クラスを生成してanimate()を呼び出すと再生される
で簡単にできました。

![Screenshot_2014-06-19-19-36-34.png](https://qiita-image-store.s3.amazonaws.com/0/2029/41dc7026-1f03-e7b3-60b8-c3a0bb9e0458.png "Screenshot_2014-06-19-19-36-34.png")


ドラクエっぽく歩きます。


##まとめ

そんな感じで出来上がったソースがこちら
https://github.com/nagai/freemarket/tree/qiita12


次回はショップ画面周りを作ります。
Windowsに開発環境を構築する

# Windows 8 開発環境構築

以前、Macの開発環境構築について記述しました。
今回は、Windows８の開発環境を構築したいと思います。

## Chocolatey を使ってパッケージ管理
MacでもLinuxでも、多くの人はパッケージ管理システムを導入しているのではないでしょうか。Macだと[Homebrew](http://brew.sh/index_ja.html)を使っている人が多いでしょうし、Linuxだと apt-get や yum 、Portsを使うことが多いと思います。

Windowsでは、[Chocolatey](https://chocolatey.org/) というパッケージ管理アプリが有名なようです。

[Chocolatey Gallery](https://chocolatey.org/)

## インストール

CMDを開いて、以下のコマンドを実行します。

```ps1
@powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%systemdrive%\chocolatey\bin
```

コマンドラインからインストールすることもできますが、ファイルを使って一括インストールを行います。

インストールしたいアプリケーションは、[Chocolatey Gallery | Packages](https://chocolatey.org/packages)　から検索します。

```xml:packages.config
<?xml version="1.0"?>
<packages>
    <package id="ChocolateyGUI" />
    <package id="mysql.workbench" />
    <package id="GoogleChrome" />
    <package id="curl" />
    <package id="mingw" />
    <package id="mingw-get" />
    <package id="winmerge" />
    <package id="ccleaner" />
    <package id="sublimetext2" />
    <package id="evernote" />
    <package id="virtualbox" />
    <package id="vagrant" />
    <package id="ruby" />
    <package id="CloudBerryExplorer.AmazonS3" />
    <package id="AWSTools.Powershell" />
    <package id="calibre" />
    <package id="winscp" />
    <package id="putty" />
    <package id="nmap" />
    <package id="FileTypesMan" />
    <package id="wizmouse" />
    <package id="SourceTree" />
    <package id="tortoisesvn" />
    <package id="jdk8" />
    <package id="maven" />
    <package id="scala" />
    <package id="gradle" />
    <package id="intellijidea-ultimate" />
    <package id="sbt" />
</packages>
```

一括インストール

```ps1
cinst packages.config
```

chocolatey はサイレントインストールでアプリをインストールするため、インストール時にインストーラで細かい設定を選択したいなら個別に手動でインストールしたほうがいいと思います。

私は以下のアプリについては手動でインストールを行いました。

- サクラエディタ（オプションを設定したかったため）
- Node.js（Chocolateyだとnpmが入っていないため・・・）
- Eclipse（正確には、Pleiadesを入れたかったため）
- Git for Windows（オプションを設定したかったため）

その他chocolateyではインストールできなかったもの

- Google Japanese IME
- Lhaz
- Virtual Router
- Colibri

## 感想
ある程度、一括でアプリをインストールする荷にはとても便利だと思った。
PJの開発環境を一括で作りたいと思ったけど、そこまで完璧には構築できなさそう。素直にPowerShellでスクリプトを作ったほうがいいかもしれない。

# フロントエンド開発環境構築
Grunt、Yeoman、Bower等の環境構築を行います。

```ps1
npm install yo bower grunt-cli -g
```
Gmailの迷惑メールフィルタに引っかかる、Charlie Rootのメールを救済するスクリプト

RubyのIMAPライブラリを使用して、Gmailで迷惑メールに分類されたrootあてメールを救済するやっつけスクリプトを書いてみました。

## 動機
スマートフォンでFreeBSDのレポートメール（Charlie Rootからのメール）を読みたいので、aliasesでGmailあてに設定し運用しています。
...が、迷惑メールに分類されてしまい、その度に「迷惑メールではないことを報告」を実行するのは非常にめんどくさい。

なんとかしたい。

## やったこと
IMAP4のクライアントで迷惑メールフォルダに分類されてしまったレポートメールをINBOXに移動するスクリプトをrubyで書き、cronで一日一回実行するように設定してみた。

```rb:imap4.rb
#!/usr/local/bin/ruby
# -*- encoding: utf-8 -*-

require 'net/imap'

host     = 'imap.gmail.com'
user     = 'gmailのメールアドレス'
password = 'gmailのパスワード'

OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE

imap = Net::IMAP.new(host, 993, true)
imap.login(user, password)

#迷惑メールフォルダを選択
mailbox = Net::IMAP.encode_utf7('[Gmail]/迷惑メール')
imap.select(mailbox)

rule = ['TO', 'root@', 'UNSEEN']

message_ids = []
imap.search(rule).each do |message_id|
        message_ids << message_id
end
imap.copy(message_ids, "INBOX")

imap.disconnect
```

やっていることは単純で、

1. GmailにIMAP4で接続
2. 迷惑メールフォルダを選択
3. 宛先が'root@'で未読なメールを検索しメッセージIDのリスト作成
4. リストアップしたメールをINBOXフォルダへコピー

だけです。

GmailではINBOXへコピーした段階で迷惑メールフォルダから削除されるようです。
PHPでXMLを返却するAPIのレスポンスを受け取りそのままCSVとしてダウンロードさせちゃう

久々にphp書いたので晒します。
「今どきxmlとかこれ何のAPIだよｗｗｗ」というツッコミは受け付けません、察してください。

```php
// 初期設定
$API_ID = 'YOUR API ACCESS ID';
$API_PASSWORD = 'YOUR API ACCESS PASSWORD';
$API_VERSION = '1.0';
$API_ENDPOINT_URI = 'http://foo.var/api';

$data = array(
  "api_id"        => $API_ID,
  "api_pass_hash" => md5($API_PASSWORD . time()),
  "version"       => $API_VERSION,
  "condition"     => 'paid'
);

// postで接続
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $API_ENDPOINT_URI);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data, '', '&'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($ch);
curl_close($ch);

// xmlをパース
$xml = simplexml_load_string($response);
$data = get_object_vars($xml);

// ファイル名
$filename = "getdata" . date('Ymd-His') . ".csv";
$f = fopen('php://output', 'w');

// バッファに読み込む
ob_start();
$header_written = false;
foreach ($data['result_set'] as $item) {
  $keys = array();
  $vals = array();
  foreach($item as $k => $v) {
    array_push($keys, $k);
    array_push($vals, $v);
  }
  if (!$header_written) {
    fputcsv($f, $keys, ',', '"');
    $header_written = true;
  }
  mb_fputcsv($f, $vals);
  fputcsv($f, $vals, ',', '"');
}
$csvraw = ob_get_clean();
fclose($f);

// バッファを出力
header('Content-type: text/csv');
header("Content-Disposition: attachment; filename=$filename");
echo $csvraw;
```
gitでプロジェクト毎に設定を変更したい場合

# 追記
## git config
<pre>
$ git init
$ git config user.name "your name"
$ git config user.email "your mail address"
</pre>

# Old
## config
各プロジェクトの直下にある .git/config に設定を書けばよい．

## 例
* hogeプロジェクトでローカルな設定をしたい場合．
<pre>
$ cd hoge
$ emacs .git/config
</pre>
* ユーザ名・メールアドレスを設定
<pre>
[user]
　　name = your name
　　email = your mail address
</pre>
Mac mini を CentOS6.5 にする

Mac mini のハードはリーズナブルで信用性も高いと思います。
以下の様にスペック変更してサーバー用に購入しました。

2.6GHz Quad-Core Intel Core i7
16GB 1600MHz DDR3 SDRAM -2x8GB
1TB Fusion Drive

OS は OS X Mavericksで行きたかったのですが
VirtulBox で仮想化をした時にゲストOSがスリープするのを制御できず断念。
CentOS6.5 + KVM の環境を作ることにしました。

その際インストールをメモします。

まずはこのサイトを参照して復元ディスクとインストールを行ないました。
http://blog.satoshun.net/archives/18

CentOS6.5 は以下のサイトからダウンロード、DVD化して利用。
http://ftp.riken.jp/Linux/centos/6/isos/x86_64/CentOS-6.5-x86_64-bin-DVD1.iso

Optionキーを押しながら Mac mini を起動し
Windows というディスク画像 を選択してインストールを開始。

注意点は Tabキーを押して
起動オプションの後ろに noapic を付け加えること。

またディスクの割り振りですが
Fusion Drive は SSD 部分と通常のHDDに分かれているので
両方共選んでフォーマットしてしまうこと。
（そうしないと自動起動できません。）
また既定値だと /home が大きくなるので 100GB まで落とし 
余った分を全て ルートに割り振りました。

次にネットワークの設定ですが、以下のサイトを参考に設定しました。
http://www.checksite.jp/kvm-br-conf/

```lang:ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
UUID=1eb35ca4-2343-401f-8171-***********
ONBOOT=yes
#NM_CONTROLLED=yes
#BOOTPROTO=dhcp
HWADDR=68:5B:35:**:**:**
DEFROUTE=yes
#PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="System eth0"

NM_CONTROLLED=no
PEERDNS=no
BOOTPROTO=none
BRIDGE=br0
```

そのままだとホストOSがインターネット接続できませんでした。
ifcfg-br0 に 記述を追加しました。

GATEWAY=192.168.***.***
~~DNS1=192.168.***.***~~
PEERDNS=no

```lang:ifcfg-br0 
DEVICE=br0
TYPE=Bridge
ONBOOT=yes
BOOTPROTO=static
NM_CONTROLLED=no
IPADDR=192.168.***.***
PREFIX=24

GATEWAY=192.168.***.***
PEERDNS=no
```

```lang:/etc/resolve.conf
search ********.com
nameserver 192.168.***.***
```

またNM_CONTROLLED=no PEERDNS=no にしても resolve.conf が書き換わってしまうので
以下のサイトを参考にNetworkManagerを停止しresolve.confに nameserverを追記しました。

http://mikotosnow.blog.fc2.com/blog-entry-11.html

必用なコマンドは以下の２つ。

>/etc/rc.d/init.d/NetworkManager stop
>chkconfig NetworkManager off


後はネットワークを再起動すればOKでした。
Hadoop Streaming のテストを書く

[昨日](http://qiita.com/ynakayama/items/b7a598e551ed7b0901ea)はある程度大きなサイズのデータフレームの取扱いについて Python や R 、 Pig で使い比べてみました。さて、筆者は分散処理環境でのデータ分析には [Hadoop Streaming](http://qiita.com/ynakayama/items/014868218ea69c5614fb) を最も多用しています。理由はいくつかあるのですが特に強い理由は次の通りです。

* 生産性の高い Ruby などの言語で記述できるため、他の DSL を使用したときによくある背中に手がもうひとつ届かないような処理にもきめ細かく対応できる
* テストが書ける (重要！)

今日はこのテストについて追求してみます。

## RSpec を利用する

Hadoop Streaming は少量のデータと UNIX パイプで代用することができます。したがいまして Mapper と Reducer については期待する出力結果を Spec で記述することでテストを書くことができます。もちろん [MiniTest](http://docs.ruby-lang.org/ja/2.0.0/class/MiniTest=3a=3aAssertions.html) あたりを使っても良いのですが RSpec を使います。 Rakefile で次のようにしておきます。

```rb
require 'rubygems'
require 'rspec/core'
require 'rspec/core/rake_task'
task :spec do
  RSpec::Core::RakeTask.new(:spec) do |spec|
    spec.rspec_opts = ["-c","-fs"]
    spec.pattern = FileList['spec/*_spec.rb']
  end
end
```

### Mapper のテストを書く

少量のデータを入力に用意し Mapper の出力結果を検証すれば Mapper 本体のテストが書けます。

```rb
require 'rubygems'
require 'rspec'

class Mapper
  def self.run
    `cat test_data.txt | ruby lib/mapper.rb` # 力技で出力結果を返す
  end
end

describe Mapper do
  context '#run' do
    subject {
      Mapper.run # Mapper のメインのメソッドを叩く
    }

    let(:expected) {
      # 期待する出力結果をここに書く
    }

    it '期待通りのデータが抽出される' do
      expect(subject).to eq expected
    end
  end
end
```

### Reducer のテストを書く

Reducer も同じ要領でテストを書けます。 Mapper の出力結果はキーでソートされますので、中間で sort コマンドを用意すると良いでしょう。つまり

```rb
`cat test_data.txt | ruby lib/mapper.rb | sort | ruby lib/reducer.rb`
```

こうなるかと思います。値はソートされないはずなので、微妙な挙動の違いがあることに気をつけなければいけませんが、そこが問題になるのはイレギュラーなケースでしょう。

なお詳細な処理は Mapper や Reducer から呼ばれる別のクラスに記述、そこは普通に RSpec を書くようにするとテスタビリティが向上するでしょう。

## テストを書きながら開発を進める

テストが書けることはわかりました。実際の開発では次の手順で進めます。

1. 手元で期待する結果をテストに書き、それが通るように実装を進める
2. Git でリポジトリにチェックイン
3. Hadoop のクライアントで pull してまずは少量のデータで動作することを確認する
4. 入力データを大規模な本物のデータに切り替えてジョブを実行する

## まとめ

Hadoop Streaming なら生産性の高い Ruby などを用いて、テストを書きながらデータ分析のコードを記述していくことができることがわかりました。データ分析のコードそのものが誤っていたら結果も異なるわけですから、テストをきちんと書いて誤りのない分析をしていきたいところです。
ブラウザを1行でテキストが書けるエディタメモにする方法

アドレスバーに1行打ち込むだけで、ブラウザが **「メモ帳」** みたいになります。


```
data:text/html,%20<html%20contenteditable>
```

##ブラウザイメージ
![moss2.png](https://qiita-image-store.s3.amazonaws.com/0/36485/731ea19a-1b47-a0f3-f514-92262ac22a52.png)


瞬間的に使うだけで、どこにも保存したくないメモなどがあれば。
Metaio SDK マーカーを認識した事を知る方法

[metaio sdk](http://www.metaio.com/sdk/)については、こちらから。

MetaioSDKDelegateのonTrackingEventに渡されるtrackingValues.qualityにて、マーカーを認識したか認識しなくなったかを判別できる。

```objc++

-(void) onTrackingEvent: (const metaio::stlcompat::Vector<metaio::TrackingValues>&) trackingValues {
    // Implement if new poses are needed
    // Please implement in the subclass-->template.mm
    NSLog(@"onTrackingEvent: quality:%f", trackingValues[0].quality);

    // quality: 認識精度(0〜1の範囲)。0だと認識されていない状態、1.0が最良.
    if( trackingValues[0].quality > 0.8 ) {
        // 認識した事により、別の処理を開始する。
        self.dummyViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
        [self presentViewController:self.dummyViewController animated:YES completion:nil];
    }
}
```