OmniAICreator/Qiita-1.07M huggingface dataset:
組み合わせ(Haskell)

Eqのインスタンスでないといけないのが微妙。

```comb.hs
module Comb wherecomb :: Eq a => Int -> [a] -> [[a]]comb n xs = comb' n [([], xs)] where comb' :: Eq a => Int -> [([a],[a])] -> [[a]] comb' 0 tuples = map fst tuples comb' count tuples = comb' (count-1) $ flatten $ map shift tuples   where  shift :: Eq a => ([a], [a]) -> [([a], [a])]  shift tuple =   let (acc, rest) = tuple   in [ (x:acc, filtered) |  x <- rest, let filtered = filter (/=x) rest ]flatten :: [[a]] -> [a]flatten xs = foldl (++) [] xs```
```bash
*Comb> comb 3 "abcd"
["cba","dba","bca","dca","bda","cda","cab","dab","acb","dcb","adb","cdb","bac","dac","abc","dbc","adc","bdc","bad","cad","abd","cbd","acd","bcd"]
```
Data.Reflection


`reify`で型に情報を閉じ込めて、`reflect`で取り出すというもの。情報の持ち運びのために、最後にダミーの型を持つようなファントム型を定義する(ここでは`M`)。

```haskell:
% runghc
{-# LANGUAGE NoMonomorphismRestriction, ScopedTypeVariables #-}
module Main (main) where
import Data.Proxy
import Data.Reflection

main :: IO ()
main = do
  print $ reify 7 (\(_ :: Proxy s) -> unM (culc :: (Integral a, Reifies s a) => M a s))
  print $ reify 9 (\(_ :: Proxy s) -> unM (culc :: (Integral a, Reifies s a) => M a s))
  return ()

newtype M a s = M { unM :: a } deriving (Eq, Show)
add, mul :: (Integral a, Reifies s a) => M a s -> M a s -> M a s
add a b = M $ (unM a + unM b) `mod` (reflect a)
mul a b = M $ (unM a * unM b) `mod` (reflect a)

culc :: (Integral a, Reifies s a) => M a s
culc = (M 3 `add` M 2) `mul` M 5
```

```
4
7
```

型のあわせ方は http://www.cs.rutgers.edu/~ccshan/prepose/prepose.pdf を参照した。
YAMLに設定を持たせて、rubyでS3へファイルUP


S3にtest.htmlをUPして
http://バケット名.s3.amazonaws.com/test.html
をブラウザで開きたい

必要なgemパッケージをインストール＆修正

```bash
sudo gem i aws-s3
vim /usr/local/lib/ruby/gems/2.0.0/gems/sauberia-aws-s3-0.6.2.1254423624/lib/aws/s3/extensions.rb
```

84行目を以下に修正

```bash
gsub!( Regexp.new("[\x80-\xFF]", Regexp::EXTENDED, 'n')) { "%02X" % $&[0] }
```

続いて設定

```sync_s3.yml
main:
 access_key_id     : アクセスキー
 secret_access_key : シークレットキー
 bucket_name       : backet名
 current_dir       : /var/www/imgs/
```

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

# ディレクトリ以下取得
require 'find'
require 'yaml'
require 'pp'

# s3
# http://amazon.rubyforge.org/doc/
require 'aws/s3'
include AWS::S3

# 初期設定
YAML_PATH = "./sync_s3.yml";
data = YAML.load_file(YAML_PATH);   # パースする

ACCESS_KEY_ID     = data['main']['access_key_id'];
SECRET_ACCESS_KEY = data['main']['secret_access_key'];
BUCKET_NAME       = data['main']['bucket_name'];
CURRENT_DIR       = data['main']['current_dir'];

# S3設定
Base.establish_connection!(
  :access_key_id     => ACCESS_KEY_ID,
  :secret_access_key => SECRET_ACCESS_KEY,
  :server            => BUCKET_NAME + ".s3.amazonaws.com" # バケット名.s3.amazonaws.com
);

# S3への転送処理
S3Object.store(
          'test.html',              # アップロード先のファイル名
          open(./test.html),         # アップロードしたいローカルファイル
          BUCKET_NAME,         # バケット名
          :access => :public_read   # 全体に読み込み公開(他にも認証必須とかあります）
        );
```

実行

```bash
sudo ./sync_s3.rb
```

もし
http://バケット名.s3.amazonaws.com/test.htmlではなく
http://バケット名.s3.amazonaws.com/test/test.html
にしたい場合は

```ruby
S3Object.store(
          'test/test.html',              # アップロード先のファイル名
          open(./test.html),         # アップロードしたいローカルファイル
          BUCKET_NAME,         # バケット名
          :access => :public_read   # 全体に読み込み公開(他にも認証必須とかあります）
        );
```

とするだけ！！

これで、シンプルにUPするまで出来るようになります。
VirtualBox の VM をコマンドラインから管理する

よく使うコマンドをピックアップ。

#### VM の一覧
`$ VBoxManage list vms`

#### 動作中の VM 一覧
`$ VBoxManage list runningvms`

#### VM を起動する
- Video コンソール有り: `$ VBoxManage startvm "Windows8Pro"`
- Video コンソール無し: `$ VBoxManage startvm "Windows8Pro" --type headless`

#### VM を停止する
- 電源off: `$ VBoxManage controlvm poweroff` 
- ACPI シャットダウン: `$ VBoxManage controlvm acpipowerbutton` 

#### スナップショット
- 作成: `$ VBoxManage snapshot "Windows8Pro" take "win-tmp"`
- 削除: `$ VBoxManage snapshot "Windows8Pro" delete "win-tmp"`
- 一覧: `$ VBoxManage snapshot "Windows8Pro" list`
- リストア: `$ VBoxManage snapshot "Windows8Pro" restore "win-tmp"`

#### その他のコマンド

`$ VBoxManage help`

長大なリストが表示される。GUI で操作できることは、ほぼ網羅されているっぽい。
knife-soloを使ってChefを始める準備


* Chefを使ってサーバの構成管理をしたい
* 対象のサーバは1台なのでchef-soloでいい
* knife-soloを使った方が色々と楽できるので使う
* 作業環境はOSX(10.7)

Chefリポジトリ用のディレクトリを作る

```
mkdir my-chef-repo
cd my-chef-repo
```

自分はrbenvなので利用するRubyを指定

```
rbenv local 1.9.3-p392
```

bundlerをインストール

```
gem install bundler
rbenv rehash
bundle init
```

Gemfileを記述

```
gem 'knife-solo'
```

gemのインストール(作業ディレクトリ以下に)

```
bundle install --path=vendor/bundle --binstubs
```

2013/04/10時点でインストールされたもの

* archive-tar-minitar (0.5.2)
* bundler (1.3.5)
* chef (11.4.0)
* erubis (2.7.0)
* highline (1.6.16)
* ipaddress (0.8.0)
* json (1.7.7)
* knife-solo (0.2.0)
* librarian (0.0.26)
* mime-types (1.22)
* mixlib-authentication (1.3.0)
* mixlib-cli (1.3.0)
* mixlib-config (1.1.2)
* mixlib-log (1.6.0)
* mixlib-shellout (1.1.0)
* net-ssh (2.6.6)
* net-ssh-gateway (1.2.0)
* net-ssh-multi (1.1)
* ohai (6.16.0)
* rest-client (1.6.7)
* systemu (2.5.2)
* thor (0.18.1)
* yajl-ruby (1.1.0)

chef-soloの実行に必要なファイルを用意

```
bin/knife solo init .
```

("WARNING: No knife configuration file found" と表示されるが今は必要でないので無視)

とりあえずここまで。クックブックを検証するための環境はVagrantで用意したい。

- - -

参考:

* [knife-solo](http://matschaffer.github.io/knife-solo/)
C++11のラムダ式で遊んでみた

恥ずかしながらC++ほとんど書いたことないけど、C++11だとラムダ式が入ったので静的型付け関数型言語のようなことをできるんじゃないか、と思って適当に書いてみた。


こんなかんじでC++11の機能が使えるらしい

```
clang++ -std=c++11 -stdlib=libc++ hello.cpp -o hello
```

clang v3.2。本当にC++について何も知らなかったので、このオプションに気づくまで一時間かかった


参考: 本の虫: lambda 完全解説 http://cpplover.blogspot.jp/2009/11/lambda.html

とりあえずmap, each, selectを定義して遊んでみる。

```cpp
#include <iostream>
#include <memory>
#include <cmath>
#include <vector>

namespace prelude {
    template<class T, class F>
    auto map(const std::vector<T> & vec, F fun) -> std::vector<decltype(fun(vec[0]))> {
        std::vector<decltype(fun(vec[0]))> ret;
        std::transform (vec.begin(), vec.end(), std::back_inserter(ret), fun);
        return ret;
    }

    template<class T, class F>
    std::vector<T> select(const std::vector<T> & vec, F fun) {
        std::vector<T> ret;
        std::for_each (vec.begin(), vec.end(), [&](const T &t){
            if(fun(t)) ret.push_back(t);
        });
        return ret;
    }

    template<class T, class F>
    void each(const std::vector<T> & vec, F fun) {
        for_each (vec.begin(), vec.end(), fun);
    }
}

struct Point {
  Point(int x, int y): x(x), y(y) {};
  int x;
  int y;
};
typedef std::shared_ptr<Point> PointPtr;

double getDistance(const Point& p1, const Point& p2) {
  return std::sqrt(std::pow(p1.x - p2.x, 2)+std::pow(p1.y - p2.y, 2));
}

using namespace prelude;
using namespace std;

int main() {
    //lambda
    [](){cout << "Hello,World" << endl;}();

    function<int(int, int)> multiply = [](int x, int y) -> int { return x * y;};
    cout << multiply(1,4) << endl;

    const int z = 5;
    auto multiply5 = [z](int x){return x * z;};
    cout << multiply5(4) << endl;

    Point p1(1,5);
    Point p2(3,2);
    Point p3(4,3);

    cout << getDistance(p1, p2) << endl;;

    vector<Point> vec;
    vec.push_back(p1);
    vec.push_back(p2);
    vec.push_back(p3);

    {
        auto vec2 = map(vec, [](const Point &p){
            return p.x * 2;
        });

        each(vec2, [](int i) {
            cout << i << endl;
        });
    }

    each(vec, [](const Point &p){cout << p.x << endl;});
    auto vec3 = select(vec, [](const Point &p) -> bool { return p.x > 2 ;});
    each(vec3, [](const Point &p){cout << p.x << endl;});
}
```

途中 @krustf @mickey24 @mashiro に constにしろback_insert使えとかdecltype使えば動的に型つくれるよ、みたいな感じで教えてもらったりした。
メモリと参照意識するの結構難しいけどどこで実体作ってどこで参照コピーしてるかなんとなく想像できるようになってきた。

auto と std::function 便利ィ…
using namespace std; するな死にたいのか！と言われたけど main だけに絞ったので許してほしい感じです
非推奨： Scala の finally 句で値を返す．

Scala の `finally` 句はリソース解放など副作用のある処理を想定しているため，`finally` 句にブロックを与えても，`try` や `catch` のように値を返しません．

## try, catch

    scala> try { "foo" } catch { case _: Throwable => "bar" }
    try { "foo" } catch { case _: Throwable => "bar" }
    res0: String = foo

    scala> try { throw new RuntimeException } catch { case _: Throwable => "bar" }
    try { throw new RuntimeException } catch { case _: Throwable => "bar" }
    res1: String = bar

## finally

しかし，`finally` は値を返しません．

    scala> try { "foo" } finally { "baz" }
    try { "foo" } finally { "baz" }
    <console>:8: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
                  try { "foo" } finally { "baz" }
                                          ^
    res2: String = foo

それどころか，REPL に怒られてしまいます．

## Return を使って無理矢理 finally から値を返す．

このように，値を返すことを全く期待されていない `finally` ですが，関数の中で使われている場合は，`return` することで `finally` 句から値を返すことができます．

    scala> def foo: String = try { "foo" } finally { return "baz" }
    def foo: String = try { "foo" } finally { return "baz" }
    foo: String

    scala> foo
    foo
    res3: String = baz

ただし，`return` を使ったために，関数の戻り値の型 `String` を省略することはできません．

## おわりに

警告を無視して `return` を使っている時点で腐臭のするコードになってしまいます．
プロダクションコードで，というよりはクイズのネタ向けですね．
CoreData １対多のリレーションでOrderedにしたときのバグを直す

タイトルの通りなのですが、
現在１対多のリレーションでArranged Orderedがオンの場合、
自動で作られるクラスのメソッド、追加や削除などのメソッドがことごとく動作しないのです。

環境
・Cocoa
・SDK 10.8
・Xcode 4.6.1

と、色々しらべると、どうやらそれを修正するコードがgithubにあるようです。

KCOrderedAccessorFix
https://github.com/CFKevinRef/KCOrderedAccessorFix


これはappleの審査的にはどうなのかまでは調べていません。
[セキュリティ]クリックジャッキング

## クリックジャッキングとは

メモ

http://blog.tokumaru.org/2013/03/clickjacking-report-by-IPA.html

## 対策

`X-Frame-Options`を付与する

参考: https://developer.mozilla.org/ja/docs/The_X-Frame-Options_response_header

### apache

```
Header always append X-Frame-Options SAMEORIGIN
```

### nginx

```
add_header X-Frame-Options SAMEORIGIN;
```

ちなみに Railsだとこのへんっぽい
https://github.com/rails/rails/commit/bd59793043750c7c4545d14d618ce8ac40cc4d55
JavaScriptでRubyのように配列をスライスする

JavaScriptで配列をRubyのようにスライスできたらちょっと面白いかな、と思って書いてみました。

ES6で追加されると期待したい `Proxy` を使っていますので、ChromeかFirefoxでしか動きません。（もっともこの記事はOperaで書いてますが…）

slicer.jsというコードにまとめたのですが、意外と長くなってしまったので [Gist](https://gist.github.com/alucky0707/5318509) に置いておきます。

使い方はこんな感じ。

```javascript:
var
arr = [0,1,2,3,4,5,6,7,8,9], //元となる配列
sli = toSlicer(arr); //配列を拡張

// 範囲代入と取得
sli["1..3"] = [10,11,12];
console.log(sli["0..2"]); //=>0,10,11

//複数代入と取得
sli["4,6,8"] = [13,14,15];
console.log(sli["4,5,7,9"]); //=>13,5,7,9

//Arrayのメソッドやプロパティ―ももちろん呼べる
sli.push(16);
console.log(sli.length); //=>11

//元となった配列を破壊的に参照してたりする
console.log(arr); //=> 0,10,11,12,13,5,14,7,15,9,16
```

破壊的なのは仕様です。

なんか、Rubyみたくといったわりに複数代入とか勝手に追加してたりしてすみません。

ですが、この複数代入が結構便利だったりします。

例えばこんな感じ。

```javascript
// 配列のスワップ
sli["1,2"] = sli["2,1"];
```

どうでしょうか。直観的で良くないですか？

でもまあ、これだと文字列でべたに書いてて実際使うとなるとかなり微妙です。
なので、JavaScriptの暗黙の型変換を利用して、こんな風に書くこともできます。

```javascript
var
i = 1,j = 2;
sli[[i,j]] = sli[[j,i]];
```

重要なのは `sli[[i,j]]` の外側の角括弧は配列の参照で、内側の角括弧は配列リテラルとなっていることです。

これを利用してバブルソートを書いてみると、こうなります。

```javascript
/**
 * Slicerを使った破壊的なバブルソート
 * @param {Array} ソートする配列
 */
function bubbleSort(arr) {
  var
  sli = toSlicer(arr),
  i,j,len = sli.length;

  for(i = 0; i < len; i++) {
    for(j = len-1; j >= 0; j--) {
      if(sli[j] < sli[i]){
        //スワップ
        sli[[i,j]] = sli[[j,i]];
      }
    }
  }

  return arr;
}
```

スワップをべたに書いたり、関数にするよりいい感じですよね。

最後に、書いておきますが、この記事はネタです。slicer.jsは実開発で使えるようなほどよくできたコードにはなっていません。
それに `Proxy` の仕様はまだまだ流動的です。

`Proxy` 流行ったらいいな。
JavaScriptのクラス？コンストラクタ？？

# JavaScriptのクラス？コンストラクタ？？

最初に、JavaScriptにはクラスはありません。
コンストラクタからインスタンスを生成します。

なんだかなぁ・・と言う人は、
とりあえず単語は置いておいてコードから理解してください。

# コンストラクタの基本
```javascript:コンストラクタ
function Dog(name, cry) {
  this.name = name;
  this.bark = function() {
    console.log(cry);
  };
}
var dog = new Dog('きなこ', 'わんわん');
console.log(dog.name); // きなこ
dog.bark(); // わんわん
```

もし「new」を忘れたら、関数呼び出しになってしまって一大事です。
これがわからない方はこちらの記事へ。
[「JavaScript」の「this」は「４種類」？？](http://qiita.com/items/9935ce476a17d6258e27)

#newの挙動
もし「new」をつけた場合は何がおこっているのか。
実は暗黙のルールで二行加わっています。

```javascript:コンストラクタ
function Dog(name, cry) {
  // var this = {};
  this.name = name;
  this.bark = function() {
    console.log(cry);
  };
  // return this;
}
```

このように「new」をつけた場合は上の挙動になります。

これを見たら理解は簡単ですね。
毎回新しい空オブジェクトを生成して、
それに初期プロパティを加えて「return」しています。

newをつけた場合の暗黙のルールとして…

んっ、なら明示的に書いた場合はどうなるの？？
ってことで別の書き方も身につけましょう。

#newなしパターンは??

```javascript:
function Dog(name, cry) {
  var self = {};
  self.name = name;
  self.bark = function() {
    console.log(cry);
  };
  return self;
}
```

この場合はさっきのthisの暗黙のルールは適用されなくなります。
なぜなら明示的にローカル変数「self」を「return」してるからです。

なので、「new」をつけてもつけなくても挙動は一緒になります・
暗黙のルールの「return this;」がないからです。

```javascript:
function Dog(name, cry) {
  return {
    name: name,
    bark: function() {
      console.log(cry);
    }
}
```

これはさっきのselfとまったく同じです。

これも単純に関数なのですが、
基本的には最初を大文字として
コンストラクタ呼び出しを期待するのがbetterです。

そしてもし「new」をつけ忘れたとしても大丈夫。
バグは発生せず、期待通りの動きをしてくれます。


#注意点

ここでメモリを気にする方は関数の生成についても考えたいですね☆
上記の欠点としてはプロトタイプへのリンクがきれてしまうことです。

はて、プロトタイプって？
[JavaScriptのプロトタイプ入門]
(http://qiita.com/items/809114f943208aaf55b3)

# 外部アカウント

技術情報のみつぶやくアカウント作成しました。JavaScriptは最新情報も追っていきます。
[Twitterはこちら]
(https://twitter.com/takeharumikami)
[Feedlyのフォローはこちら]
(http://cloud.feedly.com/#subscription%2Ffeed%2Fhttp%3A%2F%2Fqiita.com%2Ftakeharu%2Ffeed)

# おすすめの記事

入門者がつまづく、thisの挙動を4種類に分けて簡単に学ぶならこれ。Apply, callの挙動までわかる。
[JavaScriptの「this」は「4種類」？」](http://qiita.com/takeharu/items/9935ce476a17d6258e27)

JavaScriptでは関数はすべてクロージャ。
[そもそもクロージャって？JavaScriptでクロージャ入門](http://qiita.com/takeharu/items/4975031faf6f7baf077a)
ソフトバンク端末の WJ46053E エラー対応

## 事象について

ソフトバンクの一部Android端末（AQUOS PHONE 104SH、GALAPAGOS 003SH）で、

> エラーが発生しました。リクエストが不正です。 (WJ46053E) 

というエラーが発生するケースがありました。主な原因はレスポンスデータに誤りがある、とのこと。

## 原因

自分が直面したケースでは、BASIC認証でレスポンスヘッダにContent-typeの指定がないときに発生しました。ダメなのか・・・。
Node.jsのexpress.basicAuthを利用すると、レスポンスヘッダにはContent-typeが含まれないので注意が必要です。自分で明示的にsetHeaderでContent-typeを指定しましょう。

ちなみに、他のキャリアやソフトバンクの他の端末では今のところ現象は確認出来てないです。
ubuntu lowlatancy kernelを使ってrealtime性の高いコードを書く

lowlatency kernelを使うと実時間性の高いコードが書ける、らしいです。

## インストール

```sh
sudo aptitude install inux-lowlatency
sudo reboot
```

```sh
uname -a
Linux hogehogemachine 3.2.0-39-lowlatency #41-Ubuntu SMP PREEMPT Fri Mar 1 16:18:04 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
```

## limits.confの設定
/etc/security/limits.confを修正。以下を追記する

```
* - rtprio 99
* - nice -10
```

そんでreboot

```sh
sudo reboot
```

確認

```sh
ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 30
file size               (blocks, -f) unlimited
pending signals                 (-i) 30573
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 99
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 30573
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

```

### Cのコードで優先度を設定する

以下のコードを仕込む

```c
#include <pthread.h>

/* 中略 */

struct sched_param thread_param;
policy = SCHED_FIFO;
thread_param.sched_priority = sched_get_priority_max(policy);
if ( pthread_setschedparam(pthread_self(), policy, &thread_param) < -1 ) {
  perror("sched_setscheduler");
}
```

### 確認

優先度がマイナスの値になっていることを確認

```sh
ps alx
F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
0  1000 24785 24744 -100  - 1048680 15908 hrtime Ssl ?          0:00 my_owesome_program
```
Google Map APIで細かい指定をする


グーグルマップAPIを使って表示するときに細かい指定(マップカラーなど)をしたい場合に使う時の備忘録。

APIを<head>内に入れる。

``` html
<script src="//maps.google.co.jp/maps/api/js?sensor=false&amp;language=ja&amp;region=jp"></script>
```


``` googlemap.js
(function(){
  $.fn.maps = function(gLat, gLng){
    var div = $(this).get(0),
    options = {
      zoom: 15,
      center: new google.maps.LatLng(gLat,gLng),
      mapTypeId: google.maps.MapTypeId.ROADMAP,
      scrollwheel: true,
      scaleControl: true,
      panControl: true,
      zoomControl: true,
      mapTypeControl: true,
      streetViewControl: true,
      
      panControlOptions: {
        position: google.maps.ControlPosition.TOP_LEFT
      },
      zoomControlOptions: {
        position: google.maps.ControlPosition.TOP_LEFT
      },
      mapTypeControlOptions: {
        position: google.maps.ControlPosition.TOP_RIGHT
      },
      
      styles: [{
        stylers: [
          {hue: "#ffffff"},
          {gamma: 0},         //ガンマ値(コントラスト)：-10〜1
          {lightness: 0},	   //明度：-100〜100
          {saturation: 0},  //彩度：-100〜100
          {inverse_lightness: false}  //明るさの反転
        ]
      }]
    };
    var map = new google.maps.Map(div, options);

    var marker = new google.maps.Marker({
      position: options.center,
      icon: {
        url: 'url'
      },
      map: map
    });
  }
})(jQuery);
```
PHPの標準エラー出力をアプリ側で制御

初カキコ

どこで書けばいいやってなってここかな？って思ったので
試しにここで

Codeigniter等でcli実行などがある場合に

cron登録
* * * * php /home/dark/app/index.php cli_test exec_cron

とやりlogファイルはcodeigniterで設定したログに吐かれるわけだ。
但し、ここで
標準出力のエラーなどは消えてしまう。
そこで通常
* * * * php /home/dark/app/index.php cli_test exec_cron >> /home/dark/cli_logs/cli_test_log_`date +\%Y\%m\%d`.log  2>&1

このように対応する例が多い

だけど、cli_test_log等もアプリ側で定義した定数を使いたいと
思ったわけでその場合に下記で対応してみた。

	public function exec_cron()
	{
		//cli_test_log_`date +\%Y\%m\%d`.log に相当する物
		$error_file_path = $this->log->get_error_file_path();
		exec("php index.php cli_test _exec_cron 2>>". $error_file_path);
	}
シェルの標準出力エラーもアプリと同じファイルに
cron登録時も
* * * * php /home/dark/app/index.php cli_test exec_cron

のみでよし。通常のecho のログはアプリ側でファイル出力してある

ま〜１つのログで可能な限りすべての調査が出来るようにと思い
やってみてます。
JavaScriptでCookieを扱う

連想配列をCookieに保存したり、Cookieを連想配列で取り出したり出来る関数


**Cookieに値と有効期間を保存**

```javascript:JavaScript

// data・・・cookieに格納する連想配列
// period・・・cookieの有効期間(日)
var setCookie = (function(){
 return function(data, period) {
  var cookies = '';
  for (var key in data) {
   cookies += key + '=' + encodeURIComponent(data[key]) + '; ';
  }

  var expire = new Date();
  expire.setTime( expire.getTime() + 1000 * 3600 * 24 * period);
  expire.toUTCString();

  cookies += 'expires=' + expire+';';

  document.cookie = cookies;
 };
})();
```


**Cookieから値を連想配列に変換して取得**

```javascript:JavaScript
var getCookie = (function(){
 return function() {
  var result = [];
  var cookies = document.cookie;

  if(cookies != ''){
   var cookieArray = cookies.split(';');
   for(var i = 0; i < cookieArray.length; i++){
    var cookie = cookieArray[i].split('=');
    result[cookie[0]] = decodeURIComponent(cookie[1]);
   }
  }
  return result;
 };
})();
```
あなたのアプリで「まつざきしげるいろ」を使いたいなら

facebookを見ていたら「まつざきしげるいろ」なる色の作り方が・・・
iPhoneAppデベロッパーなら誰しも「まつざきしげるいろ」を自分のアプリで使ってみたいと感じるのではと思いUIColorでまつざきしげる色を使う時のコードです。

```UIColor+shigeru.h
#import <UIKit/UIKit.h>

@interface UIColor (shigeru)

- (UIColor*) shigeruColor;

@end

```

```UIColor+shigeru.m
#import "UIColor+shigeru.h"

@implementation UIColor (shigeru)

- (UIColor *) shigeruColor {
    return [UIColor colorWithRed:0.627 green:0.251 blue:0.251 alpha:1];
}

@end
```
呼び出す時は上記のクラスをimportした上で

```
[UIColor shigeruColor];
```
と自然に呼び出すことが出来るはずです。

まぁ普通に

```
[UIColor colorWithRed:0.627 green:0.251 blue:0.251 alpha:1];
```
これだけ呼び出せばいい話だったりもします。

皆さんも是非「まつざきしげるいろ」を駆使して素敵なデザインのアプリを開発して下さい。
SharedPreference は消さずにアプリだけアンインストールする方法


ADB のコマンドで、

```sh:
adb shell pm uninstall -k <package name>
```

を実行します。

ヘルプには、

>pm uninstall: removes a package from the system.
>Options:
>    -k: keep the data and cache directories around after package removal.

と書いてあります。

「おっしゃ、別なPCでビルドしてインストールしたアプリの設定情報消したくなかったんだよね〜」

と思いきや、署名(debug.keystore とか)が異なる環境でビルドされたアプリの場合、上記のコマンドでアンインストールしても、新しいアプリをインストールする時に、

>[2013-04-10 17:58:29 - MyApp] Installation error: INSTALL_FAILED_UPDATE_INCOMPATIBLE
[2013-04-10 17:58:29 - MyApp] Please check logcat output for more details.
[2013-04-10 17:58:29 - MyApp] Launch canceled!

というエラーが出てアンインストールできません。
結局、

```sh:
adb shell pm uninstall <package name>
```

で、アンインストールすることになります。

という本末転倒なお話でした。
ユーザー権限で書けないファイルに対してリダイレクトで書き込みたい

```
$ sudo echo 'hoge' >> /var/foo/var.txt
zsh: permission denied: /var/foo/var.txt
```

こういうことはできないので、いちいちrootになって作業したりする人を見かけるが、そんな必要はない。こうしよう

```
$ sudo sh -c "echo 'hoge' >> /var/foo/var.txt"
```
RailsにA/BテストツールのSplitを導入する

以前 「[【Railsで】Vanityのセットアップ【A/Bテスト】](http://qiita.com/items/87a71c6d4a6fe971c2da) 」なんていうエントリを投稿しましたが、Vanityあまりメンテされてないし、Rails3対応が大変だし、なんか良くわかんなしということでやめてました。

そこでSplitの登場です。
現在進行形でメンテされていて、当然Rails3にも対応、何よりもRailsだけでなくて、Sinatraとかにも対応しているので、今後はこっちが主流になるでしょう。
ではさっそく。

## Splitとは？

これだ。
https://github.com/andrew/split

### redisが必要

READMEを読むと「ExtensionsにMongoid対応ありまっせ＼(^o^)／」ってノリでリンクが貼られているが、正直おすすめしない。
このツールをフル活用したいのなら、素直にredisを利用することを推奨する。

## インストールとセットアップ

Rails3へのインストールが前提に説明する。
といってもGemfileに書いて、`bundle install`するだけ。簡単。

```ruby:Gemfile
gem 'split'
```

ダッシュボード機能も利用するなら以下のように書く。

```ruby:Gemfile
gem 'split', require: 'split/dashboard'
```

## 使い方

splitはviewでもcontrollerでも呼び出せる。
以下のようにして、必要なパターンを記述していく。

```ruby
# どこかのコントローラー
def index
  # この文言がどこかのビューに入ると仮定してください・・・
  @test_str = ab_test('test_link', "テストです！", "テストだ！")
end
```

@test_strをビューに埋め込むと、ユーザーのセッションごとに「テストです！」だったり「テストだ！」と表示される。

次にコンバージョンを達成する場所に`ab_finished()`を記述して、データに反映する。

```ruby
# データを反映させる、どこかの画面
def hoge
  # 第一引数はab_testの第一引数と共通であること
  ab_finished('test_link')
end
```

`ab_finished`に何のオプションも指定しなければ、abテスト用のセッションはリセットされて、再度`@test_str`の表示がシャッフルされる。

### テスト用セッションをリセットしたくない場合

ab_finishedのオプションに`:reset => false`を指定する。

```ruby
ab_finished('test_link', :reset => false)
```

こうすることで、同一セッションのユーザーは`ab_finished`を通過したあとでも、ab_testの条件を引きずる。
その後、何度`ab_finished`のある画面を訪れてもデータに反映されない。

## ダッシュボードを表示する

config/route.rbに以下追加。

```ruby:route.rb
mount Split::Dashboard, :at => 'split'
```

railsを再起動して、/splitを訪れればデータを表で確認できます。

## まとめ

時代はSplit。

Vanityよりはるかに簡単だし、ドキュメントも整備されているので、ここに書くこともあまりありません。導入まで。

ちゃんとWikiもまとめられているので、詳しいことはそっちを参照してください。
https://github.com/andrew/split/wiki
Kernel組み込みのmethod（randとか）をstubするには


Kernel組み込みのmethodをstubしようとして、`Kernel.stub(:rand) { 1 }` してもstubできない。

stubしたいメソッドがどのコンテキストで呼び出されるかによって定義方法が異なる。

* あるクラスのインスタンスメソッドの中から呼びされる場合 => 対象クラスのインスタンスメソッドと同様の方法で定義
* あるクラスのクラスメソッドのから呼び出される場合 => 対象クラスのクラスメソッドと同様の方法で定義

以下サンプルコード:

```
class Hoge
  def fuga
    rand(1000)
  end
  def self.piyo
    rand(10000)
  end
end

describe Hoge do
  it {
    # クラスメソッドの場合
    subject.class.stub(:rand) { 2 }
    subject.class.piyo.should eq(2)
  }
  it {
    # インスタンスメソッドの場合
    subject.stub(:rand) { 1 }
    subject.fuga.should eq(1)
  }
end
```

要は、Kernelの組み込みのメソッドを呼び出すときの"self"が何を差すかを考えたら良いらしい。

## 参考
http://stackoverflow.com/questions/1168845/rspec-stubbing-kernelsleep
そう言えばRubyって変数名とかに日本語使えるんだよね

FrogApps 技術ブログ始めました！
RailsやiOS、HTML5の情報を発信中!! → http://qiita.com/teams/frogapps

----

Ruby 1.8なら`ruby -Ku nihongo.rb`で実行。

```ruby
#!/usr/bin/env ruby
# encoding: utf-8

def 表示(値)
  puts 値
end

class Object
  def です。
    self
  end
  def です
    self
  end
end

class String
  def は(値)
   self.replace 値
  end
end

class C名前 < String
  def self.作成(値)
    self.new 値
  end

  def initialize(値)
    self.replace 値
  end
end

私 = C名前.作成('名無し')
表示 私

私.は '増井'.です
表示 私
```
boost::algorithm::splitで文字列を区切り文字で区切る

```cpp
#include <string>
#include <boost/algorithm/string.hpp>
#Include <vector>


std::vector<std::string> v;
boost::algorithm::split(v, some_string, boost::is_any_of(",")); //例えば,で区切る

```

結果はvにvectorで入る
AWS elastic mapreduce rubyクライアントをruby1.9で使う

公式のelastic mapreduce rubyクライアントはruby 1.8用なので、
以下から落としてくる

https://github.com/tc/elastic-mapreduce-ruby

```sh
git clone git://github.com/tc/elastic-mapreduce-ruby.git
```

credentials.jsonを作成したらelastic-mapreduceコマンドが使えるようになる

（・　　ω　　・）
Vagrant up 時に、 Chef のバージョンをあげる


最近、Vagrant と Chef を使って開発環境を構築しています。Mapnik をソースから入れる必要があって、

https://github.com/marsam/cookbook-mapnik

にある Cookbook のレシピを使ってインストールしようとしていたのですが、どうも失敗するので怪しいと思い、仮想マシンの Chef-client のバージョンを確認。

```
vagrant@precise32:~$ chef-client --version
Chef: 10.14.2
```

…古い。どうもこれが原因でインストールがされなかった模様です。

取り急ぎ以下のようなレシピを作り、アップデートすることで対応。not_if の部分、11.x のバージョンかどうかチェックしているのですが、バージョンが12に上がったらまた書き換えなくてはいけないので、本当はちゃんと数字としてチェックした方がいいと思います。only_if で、バージョンが10の場合だけってやったほうがまだマシかな。

```chef-update/recipe/default.rb
package 'curl'

execute "Opscode Chef Client Installer for Ubuntu" do
  command 'curl -L https://www.opscode.com/chef/install.sh | sudo bash'
  not_if '/usr/bin/chef-client --version | /bin/grep "Chef: 11."'
end
PuTTyの右クリック事故を防ぐ

## PuTTy 右クリック 怖い

おっす、えいやです。

PuTTyは右クリックで確認なしにコマンドとして貼り付けしちゃうので事故る。

やばいので確認を出したい。

だので、以下を導入する。

1. http://www.autohotkey.com/
2. http://nanabit.net/blog/2008/03/21/putty-clipboard/

autohotkey自体便利なのでいろいろやろうぜ。
restfbで取得するFacebookアカウントの氏名を日本語にする方法

```java:Example.java
import java.util.Locale;

import com.restfb.DefaultFacebookClient;
import com.restfb.FacebookClient;
import com.restfb.Parameter;
import com.restfb.types.User;

public class Example {
    private static final String ACCESS_TOKEN = "yourtoken";

    public static void main(String[] args) {
        FacebookClient facebookClient = new DefaultFacebookClient(ACCESS_TOKEN);
        // パラメータにLocaleを指定する必要がある。
        Locale locale = Locale.JAPAN;
        User user = facebookClient.fetchObject("me", User.class,
                Parameter.with("locale", locale));
        System.out.println("last_name: " + user.getLastName());
        System.out.println("first_name: " + user.getFirstName());
    }
}

```

「new Locale("ja_JP");」を「Locale.JAPAN;」に変更しました。
@roundrop@github さんありがとうございました。
rootkit検知ツール導入手順

# 環境
* CentOS release 6.4 (Final)

# 手順

## インストール

````
# yum -y install chkrootkit
````

## rootkitのチェック
下記の実行結果として、"INFECTED"という行が表示されなければ問題なし。

````
# chkrootkit | grep INFECTED
````

## 留意点
chkrootkitが使用するコマンド群が既に改竄されていた場合、rootkitを正常に検出できなくなるので、バックアップしておいた改竄されていないコマンド群を利用してchkrootkitを実行する必要がある。

````
# chkrootkit -p /pathto/backupcommandsdir | grep INFECTED
````
Jenkins から Ikachan 経由で IRC にテスト結果を通知する (色つき)


そういうのを楽にできるスクリプトを作った。

https://github.com/kyanny/jenkins-ikachan

## 使い方

1. 新しい job を作る (名前は `ikachan` とか適当に)
2. [図1](https://github.com/kyanny/jenkins-ikachan/blob/master/fig.1.png) を参考に parameterized build を設定する (パラメータ詳細は [README](https://github.com/kyanny/jenkins-ikachan/blob/master/README.md#setup) 参照)
3. ビルド手順はシェルの実行で `curl -s https://raw.github.com/kyanny/jenkins-ikachan/v1.0/ikachan.rb | ruby` とでもする
4. テストを実行してる job から Trigger parameterized build で ikachan job をパラメータつきで実行 ($JOB_NAME と $BUILD_URL を渡すこと)
5. 以上

## ikachan.rb がやってること

1. 呼び出し元の job の成功失敗ステータスを Jenkins の XML API から取得する
2. IRC 上で色がつくように加工する
3. Ikachan に POST する
Macで開発してるのになぜかアイツ(CRLF)がいる場合。

gitとか使ってみんなで開発してると改行コードが混ざることがありますが、
今回はファイル全体がCRLFとかCRとかになってるのをLFになおしたい場合。

```
nkf -Lu --overwrite target_file
```

### 以上。

とも言えないので、

**nkfがインストールされてない場合**

```
brew install nkf
```

これでまた、ひとつ幸せになれましたね。

### こわ〜ぃ、怖いわぁ！幸せすぎて怖いわぁ！！
Rspecメモ


## マッチャの使い方とか Message Expectation の使い方とか

### ざっくり見たい場合

expectation
https://github.com/rspec/rspec-expectations

* [Built-in Matchers](https://github.com/rspec/rspec-expectations/tree/master/features/built_in_matchers)
* [should and should_not syntax](https://github.com/rspec/rspec-expectations/blob/master/Should.md)

mock
https://github.com/rspec/rspec-mocks

rails
https://github.com/rspec/rspec-rails


### もう少しみたい場合

コア
https://www.relishapp.com/rspec/rspec-core/docs

Expectation (expect( x ).to xxx) の書き方 
https://www.relishapp.com/rspec/rspec-expectations

モック,スタブの書き方
https://www.relishapp.com/rspec/rspec-mocks

Railsで使う場合
https://www.relishapp.com/rspec/rspec-rails


## 実装を見たい

### rspec-mocks

ArgumentMatcher
https://github.com/rspec/rspec-mocks/blob/master/lib/rspec/mocks/argument_matchers.rb

## FactoryGirl

Getting Started
https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md


## comparison of Fixnum with nil failed 

messate_expectation.rb の matches_at_least_count? のあたりで comparison of Fixnum with nil failed が出る場合、
spec の at_least に渡すシンボルの typo を疑う。

たとえば、

```
hoge.should_receive(:fuga).at_least(:onece)
```

のように、本来 :once のところ、 :onece と typo している場合に上記のようなエラーが吐かれる。
laravel3：Routing の小技(1)


たとえば こんな風に書いてたら、

```application/routes.php
Route::any( 'product/(:num)/edit', array(
    	'as'       => 'list',
    	'uses'     => 'list@edit',
));
Route::any( 'product/(:num)/show', array(
    	'as'       => 'list',
    	'uses'     => 'list@show',
));
```

こんな書き方で1行省略できます。

```application/routes.php
Route::any( 'product/(:num)/(:any)', array(
    	'as'       => 'list',
    	'uses'     => 'list@(:2)',
    	'defaults'     => array(0,'show'),
));
```
wxRubyで重たい処理を別スレッドで処理しながら進捗を表示

wxRubyのGUIからffmpegを呼び出してmp4の動画からmp3を抽出変換するサンプル。
わからないなりに頑張って書いたのでまずい所があれば教えて下さい。

*困ったこと*
1. まず単純にffmpegを呼び出すと処理が終わるまでGUIが固まる
→解決策：Threadを作る。

2. 別スレッドからはメインスレッドのGUIに手を出せないのでステータスバーに進捗が表示できない。
→解決策：Queueをつかって受け渡しする。
(説明してるサイトには何故か別のThreadから直接GUIの部品を変更してたので、古いバージョンではそこらへん管理がされてないのかもしれない。)

3. wxRubyはGUIがメインスレッドを強烈に縛って他のスレッドに処理をよこさないらしい。
→解決策：Timerで定期的にsleepして強制的にCPUを明け渡す。

```ffmpeg_encode.rb
require 'wx'
require 'thread'
class MyApp < Wx::App
  def on_init
    MyFrame.new.show
  end
end

class MyFrame < Wx::Frame
  def initialize
    super(nil, -1, "Thread Test")
    @status_bar = create_status_bar
    @q = Queue.new
    toolbar = Wx::ToolBar.new(self)
    toolbar.add_tool(Wx::ID_NEW, 'NEW', Wx::ArtProvider.bitmap(Wx::ART_NEW), 'Toolbar')
    toolbar.realize
    evt_tool(Wx::ID_NEW){|event| on_button_click(event)}
    self.set_tool_bar(toolbar)
    Wx::Timer.every(100) do
      if not @q.empty?
        @status_bar.set_status_text(@q.pop)
      end
      sleep 0.05
    end
  end
  def execute_ffmpeg(command)
    duration = 0
    IO.popen(command){|pipe|
      pipe.each{|line|
        if line =~ /Duration: (\d{2}):(\d{2}):(\d{2}).(\d+)/
          duration = (($1.to_i * 60 + $2.to_i) * 60 + $3.to_i) * 100 + $4.to_i
        end
        if line =~ /time=(\d{2}):(\d{2}):(\d{2}).(\d+)/
          time = ($1.to_i * 60*60 + $2.to_i * 60 + $3.to_i) * 100 + $4.to_i
          if  duration != 0
            @q.push "Encoding : ...#{time*100/duration}%"
          end
        end
      }
    }
    raise "Could not encode by ffmpeg!" if $?.exitstatus != 0
  end
  
  def on_button_click(event)
    command_ffmpeg = "ffmpeg -y -i input.mp4 -vn -ab 96k output.mp3 2>&1"
    t = Thread.new do
      execute_ffmpeg(command_ffmpeg)
    end
  end
end

MyApp.new.main_loop
```

あとffmpegは何故か出力結果を標準出力ではなく標準エラー出力に吐き出すので 2>&1 で標準出力に吐き戻させてる点に注意。

*参考*

wxRubyでThread使うときの注意事項 - 狼ニコ生うらやまけしからん日記 http://d.hatena.ne.jp/kesikaran/20100410/1270919896

Ruby for Scientific Research: Keeping wxRuby GUI Working with Threads http://rubyforscientificresearch.blogspot.jp/2009/11/keeping-wxruby-gui-working-with-threads.html
SHA-256ハッシュ値

適当なハッシュが欲しい時にpryでお手軽に生成。

```
pry(main)> require 'digest/sha2'
=> true
pry(main)> Digest::SHA256.hexdigest "__tekitou__na__phrase__"
=> "15e177c4ecb4340a006b651629fde7a6653528343c8d4c597d831203ac16a9e7"
```
モジュールとrefinementを組み合わせて使おうとして、依存関係でハマった話

最近、モジュールとrefinementsを組み合わせて使ってみようとして、requireがループしてハマったため回避策を書いておく。

Railsでこんなファイル構成を取っていた。

```ruby:app/models/post.rb
class Post < ActiveRecord::Base
  include Commentable
  belongs_to :user
end
```

```ruby:app/models/concern/commentable.rb
using CommentableRefinement

module Commentable
  extend ActiveSupport::Concern

  included do
    has_many :comments, as: :commentable
  end

  def thread_author
    author
  end
end
```

```ruby:app/models/concern/commentable_refinement.rb
module CommentableRefinement
  refine Post do
    def author
      user
    end
  end
end
```

(これはサンプルで適当に書いたので、正確ではない)

こうやっていれば、commentable.rbでのみrefinementで拡張したメソッドを元々持っていたかのように振舞える。

とは言え、こういう書き方をすると、usingもrefineもincludeもファイルを読み込んだ時点で評価されてしまう。

なので、Postを定義している途中で、Commentableが必要になり、Commentableを読みにいくと冒頭でCommentableRefinementが必要になり、CommentableRefinementでrefineを定義しようとするとPostが必要になって読み込みがループして、Post::Commentableが見つからねえよ、と言われて死ぬ。

仕方が無いので、includeの評価をCommentable読み込み後まで遅延させるように工夫した。

```ruby:app/models/post.rb
class Post < ActiveRecord::Base
  klass = self
  ActiveSupport.on_load :commentable do |mod|
    klass.send(:include, mod)
  end
  require "commentable"

  belongs_to :user
end
```


```ruby:app/models/concern/commentable.rb
using CommentableRefinement

module Commentable
  extend ActiveSupport::Concern

  included do
    has_many :comments, as: :commentable
  end

  def thread_author
    author
  end

  ActiveSupport.run_load_hooks(:commentable, self)
end
```

これで、とりあえず依存関係のループは切れるのだが、なんかダサいw

ちなみに、refinementはAsakusa.rbでmoroさんからざっくり話を聞いて、自分なりにこんな感じか？と書いてみたもので、用途としてアリかどうかについてはまだ分かってない。
laravel3：ControllerなしでView表示

たまにController無しで ページを表示したい場合があります。

public ディレクトリに静的ページとして保存すればいいけれど、既存のテンプレートデザインを使いたいとか include したいとかの要望があるので ほとんど public 下に HTMLをおくことがありません。
とはいえ、そのためだけに Controller もしくは ルーティングで return View::make( 'hoge.index' ); とか書くのは面倒。

そんな時は こんな感じにControllerの base.php を書き換えちゃえばいいかも。
URLとViewの構成を同じにしてれば View下にファイルがあるか確認すれば表示するだけ。

```php:application/controller/base.php

class Base_Controller extends Controller {
 public function __call($method, $parameters)
 {
       $current = URI::current(); // 今のURL取る
       // URLに相当する view ファイルがあるか確認
       $path = path('app').'views/' .$current . '/index.blade.php';
       if (file_exists($path)){
            // あれば 表示
           $view = str_replace('/','.',$current) . '/index';
           $output = View::make( $view );
           return Response::make($output, 200);
       }
　　　　return Response::error('404');
 }
}

```

もっと美しくかければいいんですが・・・。
自分メモ書きに近いのでお許しを
WindowsでのVagrant環境構築

Windows7 にて Ruby 2.0.0-p0 (32bit) + Vagrant の環境構築をした際のメモ

- RubyInstaller をダウンロード
http://rubyinstaller.org/downloads/
※DEVELOPMENT KITも含む

- Virtualbox をダウンロード
https://www.virtualbox.org/wiki/Downloads

- インストーラーの内容に従って上記をインストール

| 実行ファイル                                  | インストールパス |
|:----------------------------------------------|:-----------------|
| rubyinstaller-2.0.0-p0.exe                    | C:\Ruby200       |
| DevKit-mingw64-32-4.7.2-20130224-1151-sfx.exe | C:\Ruby200\dk    |
| VirtualBox-4.2.10-84105-Win.exe               | C:\Program Files\Oracle\VirtualBox |

- Windowsに環境変数を追加

| 変数名 | 値                                                |
|:------:|:-------------------------------------------------:|
| Path   | C:\Ruby200\bin;C:\Program Files\Oracle\VirtualBox | 

※インストールしたRubyのバージョンやインストールパスによって異なるので、必要に応じて適宜読み替えること

- %UserProfile% に以下のファイルを作る
ドットファイルの作成は、 cmd.exe から type nul > .gemrc などでできる

``` .gemrc
---
:update_sources: true
:sources:
- http://gems.rubyforge.org/
- http://gems.github.com
:benchmark: false
:bulk_threshold: 1000
:backtrace: false
:verbose: true
gem: --no-ri --no-rdoc
```

- rubygems をアップデートする
※ 現状では、 invalid byte sequence in Windows-31J になるから、しばらくは省略
cmd.exe から以下を実行する

```
gem install rubygems-update
set LANG=ja_JP.UTF-8
update_rubygems
```

- bundler をインストールする
cmd.exe から以下を実行する

```
gem install bundler
md working-veewee
cd working-veewee
bundle init
```

- 各種 gem のインストール
作成された Gemfile を以下のように編集する

```
source "https://rubygems.org"

gem 'vagrant'
gem 'sahara'
gem 'vagrant-vbguest'
gem 'veewee'
```

cmd.exe から以下を実行する

```
bundle --path vendor/bundle --binstubs
```

Windows だと、Linux系と違って --binstubs を付けても、意味が無さそうなので省略可


- 利用可能なベーステンプレートの一覧を確認する
cmd.exe から以下を実行する

```
bundle exec vagrant basebox templates
```

- ベーステンプレートから、テスト用の box を作成してみる
cmd.exe から以下を実行する

```
bundle exec vagrant basebox define box-test freebsd-9.0-RELEASE-amd64
```

definitions ディレクトリ以下に、box-test と言う box が作られ、中にあるスクリプトファイルを編集して、任意の VM テンプレートを作成することができるようになります


- テスト用の box を以下のように編集して、 FreeBSD 9.1-RELEASE な VM を作成する

```definition.rb
  :iso_file => "mfsbsd-9.1-RELEASE-amd64.iso",
  :iso_src => "http://mfsbsd.vx.sk/files/iso/amd64/9/mfsbsd-9.1-RELEASE-amd64.iso",
  :iso_md5 => "cbe0f0eaaf5e46545292313dfb939891",
  :shutdown_cmd => "shutdown -h now",
```

- テスト用の box をビルドする
cmd.exe から以下を実行する

```
bundle exec vagrant basebox build box-test
```

ビルドが成功すると、以下のようなメッセージが表示される

```
[box-test] The box box-test was build successfully!
```


- 作成した box のイメージを取得する
cmd.exe から以下を実行する

```
bundle exec vagrant basebox export box-test
```

- box のイメージファイルから、 VM を起動する
cmd.exe から以下を実行して、 box を登録する

```
md %UserProfile%\working-vagrant
cd %UserProfile%\working-vagrant
copy %UserProfile%\working-veewee\Gemfile Gemfile
bundle --path vendor/bundle --binstubs
bundle exec vagrant box add test-vm %UserProfile%\working-veewee\box-test.box
```

cmd.exe から以下を実行して、登録した box のリストを確認

```
bundle exec vagrant box list

結果
DL is deprecated, please use Fiddle
test-vm
```

cmd.exe から以下を実行して、 VM を起動する

```
md test-vm
cd test-vm
bundle exec vagrant init test-vm
bundle exec vagrant up
```
git log全部入り

git logの(ほぼ)全部入りオプションです。

```
% git log --oneline --decorate --graph --branches --tags --remotes
```


* --oneline: 1commit 1行のみログ表示
* --decorate: branch名、tag名などの別名を表示
* --graph: revision graphを表示
* --branches: 他のbranchのlogも表示
* --tags: tagを表示
* --remotes: remote branchなどを表示


例としてpgpdump
https://github.com/kazu-yamamoto/pgpdump
のログを表示してみます。

![git-log.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19629/58ecefaf-b2af-b076-04f5-2982a6a0ba2b.png)
単独varパターン

## 課題
JavaScriptで関数を記述する際、「巻き上げ」という問題が発生する。「巻き上げ」とは、関数の内部で宣言した変数が記述されている場所に関係なく、関数の先頭で宣言されたのと同じように扱われることである。JavaScriptでは、ある関数の中で変数を宣言している箇所よりも前でその変数を使うとその変数の値は"undefined"となり論理上のエラーとなる。

【巻き上げの例】

```javascript
myname = "global";	// グローバル変数
function func() {
	alert(myname);	// グローバル変数を参照するかと思えば、結果は"undefined"となる
	var myname = "local";
	alert(myname);	// "local"
}
```

上記の関数:funcは以下のコードと同じ意味になる

```javascript
myname = "global";	// グローバル変数
function func() {
	var myname;	// "var myname = undefinedと同じ
	alert(myname);	// "undefined"
	myname = "local";
	alert(myname);	// "local"
}
```

上記のような問題を解決するにはどうしたらよいのだろうか。

## 解決方法

「[JavaScriptパターン――優れたアプリケーションのための作法](http://www.oreilly.co.jp/books/9784873114880/)」の「２章 必須パターン」に記述されている単独varパターンを使用する。


## なぜ、単独varパターンがよいのか
「単独varパターン」とは、関数の先頭でvarを一つだけ記述し、関数の中で使用する全ての変数をそこで宣言するパターンである。つまり、関数の中で使用する変数は先頭以外の箇所では宣言しないことをルール化したパターンである。

JavaScriptでは「巻き上げ」により関数の中で宣言した変数を関数の先頭で宣言したものと見なしてしまうので、自発的に関数の先頭に変数を宣言しておけば論理上のエラーはなくなる。そういった意味で「単独varパターン」を利用することが「巻き上げ」の問題を解決する良い方法になる。

また、「単独varパターン」には「巻き上げ」の問題を解決する以外にも

* その関数で必要なすべての変数が１カ所にまとまっているので、関数の中でどんな変数が使われているのかが一目でわかる。
* varを書く回数が減るので、ファイルサイズを少なくできる。その結果、JavaScriptのコードを記述したHTMLやJavaScriptのファイルの転送時間を短縮することができる。

と言ったメリットがある。

## どのようにコーディングするのか
関数の先頭でvarを記述し、そこで複数の変数をカンマで区切って宣言する。その際に初期値で変数を初期化しておくのが良い。

【単独varパターンの例】

```javascript
function func() {
	var a = 1,
		b = 2,
		sum = a + b,
		obj = {};
}
```

## 参考資料
* [JavaScriptパターン――優れたアプリケーションのための作法](http://www.oreilly.co.jp/books/9784873114880/)
gitlab 5.0でファイル名に+が入っているときの超その場しのぎの対処法

# urlで `+` になっている場所を `%2B`に変更してやる

ファイル名に`+`が入っていると、
`View file`
でファイルが見れないことについさっき気が付きました。

url encodeされてないのが原因のように見えたのでとりあえずurlの `+` を `%2B` に変更したら見れました。 

ゴールデンウィーク辺りになっても直ってなかったらちょっとソース見てみようかなと思います。
slimで出力されるhtmlの設定を変える

slim綺麗ですね。
ですがデフォルトのslimで出力されるhtmlは特に何も考えずに使うと一番効率の良い（読みにくい）htmlの体裁になります。
なので config/initializers/slim.rbというファイルでも用意して

```rb:config/initializers/slim.rb
Slim::Engine.set_default_options :pretty => true
```

と書くことでお行儀の良いhtmlを吐いてくれます。
productionの時はパフォーマンス重視だからもっとuglyなhtmlでいいよという要望もあると思います。
そういう人は

```rb:config/initializers/slim.rb
Slim::Engine.set_default_options :pretty => true unless Rails.env == 'production'
```

にしておけばproductionの時だけはuglyでぎっちりしたhtmlを吐いてくれます。便利。
スマホのposition: fixed;で再描画を使って位置ズレを防ぐ

スマホでposition: fixed;を使うと、よくページ進む・戻るボタンで画面遷移をしたときにfixedを指定した要素の位置がズレたりタップ位置がずれたりする。

そういう場合に、以下のような方法で再描画をさせることで位置ズレを解消してあげることができる

```javascript
//// JavaScript (ここでの$はjQueryみたいなもの)
var html = $("html");

// pageshowのイベントでhtmlに.do-fixedを付ける
window.addEventListener("pageshow", function() {
    html.addClass("do-fixed");
}, false);

// pagehideのイベントでhtmlから.do-fixedを外す
window.addEventListener("pagehide", function() {
    html.removeClass("do-fixed");
}, false);
```

```css
/* 初期はabsoluteな要素にしておく */
.fixed-element {
    position: absolute;
}
/* .do-fixedが付いたときだけfixedを適用する */
.do-fixed .fixed-element {
    position: fixed;
}
```

pageshow, pagehideは、ページ進む・戻るの場合いずれも呼ばれるので、遷移の際には

**absolute(初期) -> fixed(pageshow) -> absolute(pagehide) -> 繰り返し**

のように意図的に再描画させてあげることでズレを防ぐことができる。

もちろん再描画してる分だけレンダリングのコストはかかってしまうので、できるだけ少ないのがベストなんだけど、こういった使い方で回避することもできるということで。
ディレクトリ以下のディスク容量を調べるduコマンド


## ディレクトリ以下の容量

```
$ cd /path/to/dir
$ du -sh
1.9M	.
```

※ `-h`オプションは人が読み易い形式(例. 10K 1M)で表示する、の意。

## サブディレクトリごと

```
$ du 
24	./bin
40	./lib/common
112	./lib
96	./pkg
88	./test
320	.
```

## 深さ1

```
$ du -d 1 -h
1.7M	./.git
 12K	./bin
 56K	./lib
 48K	./pkg
 44K	./test
1.9M	.
```

##詳しい使い方を調べる

```
$ info du
```

Webで見るなら[Man page of DU](http://linuxjm.sourceforge.jp/html/GNU_fileutils/man1/du.1.html) 辺り。
jQuery内からRailsのActionを叩く


JQueryとの連携方法でいつもとまどう点をまとめとこう。というよりも、jQueryからRailsのアクションを呼ぶ方法。初心者にはなかなか流れが掴みにくいです。
用途は限定されるかもしれないですが、たとえばselectの変更をjQueryで検知したときに、RailsでActionを叩いてsessionの値を書き換えるときなどは次のようにする。

まず、流れ。
１）jQueryでselectの変更を検知する
２）jQuery内からURLを指定してAjax通信する
３）２）のURLがActionを叩くようにルーティングを設定する
４）２）のURLに従って、html.erbファイルを設置する
５）後は好きなようにAction内で処理をする

```sample.html.erb
<select id="year_select" name="y" style="width:100px;">
	<option value="2011">2011</option>
	<option value="2012">2012</option>
	<option value="2013" selected="selected">2013</option>
	<option value="2014">2014</option>
</select>
```

例えば上のようなviewがあったとします。
\#year_selectの変更を検知するjQueryが下記。

```sample.js
$("select#year_select").change(function(){
		$.ajax({
		    url: "projects/change_session_year",
		    type: "GET",
		    data: {year : $(":selected").attr("value"),
					id: 1,
        			mode: 'hoge',
        			type: 'entry'
    				},
		    dataType: "html",
		    success: function(data) {
		    	alert("success");
    		},
    		error: function(data) {
    			alert("errror");
    		}
  		});
	});
```

$.ajax はAjax通信するための構文。
url: 通信先のURLを指定。ルートからの指定でいいはず
data: 通信先に渡すパラメータ。Actionからはもちろんparams[]で取得できる
success,error　通信成功、失敗時の処理

慣れないとわかりにくいけど、通信後、戻り値がfunction(data)として渡されます。このdataをいじくってテンプレートを書き換えるというのが王道の使い方だと思いますが、ここではテンプレートはいじりません。

で、projects/change_session_year　というURLでルーティングを設定します。

```routes.rb
	get "projects/change_session_year"
```

次、要注意です。これを忘れたがために嵌って時間ロスるすことがよくあります。
ルーティングに対応するテンプレートファイルを設置する！この例であれば、

projects/change_session_year.html.erb を忘れずに設置してください！中身は空でいいと思います。

$.ajaxで通信した際、このテンプレートが無いとエラーが返ってしまいます。普通のRailsの処理であれば、恐らく、missing_tamplateエラーが出るのですぐにわかるんだけど、Ajaxの場合は何も言わず失敗するので、気づくのに時間がかかるんです。

後は、projectsコントローラーにchange_session_yearアクションメソッドを用意して、好きなように処理を入れればOKです。

```projects_controller.rb
 	def change_session_year
		session[:year] = 2013
	end
```

肝は４）のテンプレートを忘れないかどうか、じゃないでしょうか。
順列列挙(Haskell)


車輪の再発明

```haskell:perm.hs
module Perm whereperm :: Eq a => [a] -> [[a]]perm [] = [[]]perm xs = flatten [  map (y:) rest  | y <- xs, let rest = perm $ filter (/=y) xs ] where flatten :: [[a]] -> [a] flatten xs = foldl (++) [] xs``````bash*Perm> perm "abc"
["abc","acb","bac","bca","cab","cba"]
```
Emacsのコメント機能をより使いやすくする

Emacsには標準で`comment-dwim`や`comment-or-uncomment-region`などのコメント機能があります。
これらは行の途中から途中までのコメントアウトを多用するならば便利ですが、一行ないし複数行まるごとのコメントアウトしか使っていないと、いちいちリージョンの設定がめんどうなので、

+ リージョンが設定されていない
    + カレント行の全体をコメントアウト（解除）
+ リージョンが設定されている
    + リージョンが含むすべての行の全体をコメントアウト（解除）

となるような関数を作りました。

たとえば#の部分がリージョンだとすると

```
........
....####
####....
........
```

このようにコメントアウトされます。

```
........
;; ........
;; ........
........
```

```scm
(global-set-key (kbd "C-M-;") 'rough-comment)
(defun rough-comment (bg ed)
  "ざっくりとコメントアウト（解除）します。"
  (interactive (list (point) (mark)))
  (if (not mark-active)
      (save-excursion
        (comment-or-uncomment-region (progn (beginning-of-line) (point))
                                     (progn (end-of-line) (point))))
    (save-excursion
      (comment-or-uncomment-region
       (progn (goto-char (if (< bg ed) bg ed)) (beginning-of-line) (point))
       (progn (goto-char (if (< bg ed) ed bg)) (end-of-line) (point))))))
```

ソースをコメントアウト（解除）する際は新しく作った`rough-comment`、ソースの説明のコメントを挿入する際は`comment-dwim`を使います。

両者はコメントの使用目的が異なるので、関連性のないキーバインドが良いと思います。
（実際は両者の機能を一つの関数にまとめられんかった…というかむしろ使いにくくなっている気が…）
bind されてても stopService で止まるサービスの作り方


Android のサービスは、``startService`` で「開始状態」、``bindService`` で「接続状態」となり、サービスを停止させる ``stopService`` は、``unbindService`` で接続を解除してから実行しないと止まらない、とドキュメントに書いてあります。

[Managing the Lifecycle of a Service | Android Developers](http://developer.android.com/guide/components/services.html#Lifecycle) より

> In cases like this, stopService() or stopSelf() does not actually stop the service until all clients unbind.

それから、一見、サービスが切断された時に呼び出されるように見える [``ServiceConnection.onServiceDisconnected``](http://developer.android.com/reference/android/content/ServiceConnection.html#onServiceDisconnected(android.content.ComponentName) は、

* [Androidアプリ開発メモ032:サービス その4:バインドされたサービス: ぷ～ろぐ](http://into.cocolog-nifty.com/pulog/2011/10/android032-4-aa.html)
* [Serviceのライフサイクルの動作確認 - DenkiYagi](http://terurou.hateblo.jp/entry/20100519/1274252852)
* [Binding to a Service - Bound Services | Android Developers](http://developer.android.com/guide/components/bound-services.html#Binding)

> onServiceDisconnected()
The Android system calls this when the connection to the service is unexpectedly lost, such as when the service has crashed or has been killed. This is **not** called when the client unbinds.

とあるように、実はサービスが異常終了した時などしか呼ばれないとのことです。

今回、偶然にも、

* 接続状態なのに stopService でサービスが止まる
* ``ServiceConnection.onServiceDisconnected`` が呼ばれる

という動きをするサービスができたので、備忘録として残しておきます。

条件は、startService した後、bindService の第2引数を ``Context.BIND_AUTO_CREATE`` ではなく ``0`` にすること。

```java:StartService.java
Intent intent = new Intent(context, TestService.class);

final ServiceConnection conn = new ServiceConnection() {
	public void onServiceConnected(ComponentName name, IBinder service) {
		Log.i("ServiceTest", "onServiceConnected");
			binder = ITestService.Stub.asInterface(service);
	}

	// stopService すると呼ばれる
	public void onServiceDisconnected(ComponentName name) {
		Log.i("ServiceTest", "onServiceDisconnected");
		context.unbindService(conn); // これ呼ばないとリークする
	}
};

// サービス開始＆接続
context.startService(intent);
context.bindService(intent, conn, 0); // not BIND_AUTO_CREATE


// ボタンを押したらサービス停止
findViewById(R.id.btnCallTerminate)
	.setOnClickListener(new OnClickListener() {
	public void onClick(View v) {
		context.stopService(intent);
	}
});
```

サービス側のコードは省略してしまったけど、stopService すると、

1. ServiceConnection.onServiceDisconnected
2. Service.onUnbind
3. Service.onDestroy

の順で呼ばれてます。onServiceDisconnected で ``context.unbindService`` を呼ばないと、アプリ終了時にメモリリークが検出されます。また、呼ばなくても、2. 3. は変わりません。

外から stopService でなく、サービス内から ``stopSelf`` でも同じでした。

接続中にサービスを停止しても、onServiceDisconnected で補足できるので、自然と言えば自然ですが、説明と違う動きをされると混乱しますね。(どこかに書いてあるのかな？)
深い階層になっているHashから[:a, :b, :c]のようなキーの配列を使って値を取り出す


こんな関数を作ってみた

```ruby:traverse
def traverse(source, keys)
   keys.inject(source) {|extracted, key| extracted[key] rescue nil }
end
```

こうやって使う

```ruby:example
hash = { a: { b: { c: "hoge", d: "fuga" } } }

traverse(hash, [:a, :b, :c])
=> "hoge"

traverse(hash, [:a, :b, :d])
=> "fuga"

traverse(hash, [:a, :b, :x])  # 存在しないkeyを指定したらnil
=> nil
```
pygit2 でコミットする

pygit2 のドキュメントがかなり足りないのでメモ。
（わからないことがあったら libgit2 のヘッダのドキュメントが参考になります。)

```python
>>> import pygit2
>>> repo = pygit2.Repository('.')
>>> blob_id = repo.create_blob('hogehoge')
>>> builder = repo.TreeBuilder(repo.head.tree)
>>> builder.insert('hoge.txt', blob_id, pygit2.GIT_FILEMODE_BLOB)
>>> newtree = builder.write()
>>> author = pygit2.Signature('methane', 'inada-n [at] klab.com')
>>> repo.create_commit('HEAD', author, author, 'add hogehoge',
                       newtree, [repo.head.oid])
'\xbc&C\x96\xfb\x84\xc4\x1f\x8a\xbd\xc5h6\x98\x08i\x84\xd4\nf'
```
GitHub へ簡単に Pull Request を送る

```
$ git pr
```

で現在のブランチをリモートに push した状態で、簡単に pull-request が送ることができるようにすることを考えてみます。

まず [hub の pull-request](https://github.com/defunkt/hub#git-pull-request) を使うことを前提とします。

通常 hub で pull-request を送るときは、以下のような形式になります。

```
$ hub pull-request -h owner:branch -b owner:branch
```

GitHub の運用ポリシーは色々あるとおもいますが、ひとつのプロジェクトで作業をしている時は、`hub pull-request -h <不変>:<可変> -b <不変>:<不変>` という形式になると思います。(不変と書いてますが、分散バージョン管理で運用されている方はあてはまらないかもしれません。ごめんなさい。)

```
$ git config pr.head-owner banyan
$ git config pr.base-owner banyan
$ git config pr.base-branch master
```

そのプロジェクトのルートディレクトリで必要な値を設定します。
以下のように設定されていれば OK です。

```
$ cat .git/config
...
[pr]
        head-owner = banyan
        base-owner = banyan
        base-branch = master # ここはプロジェクトによっては develop になったりする
```

そして `~/.gitconfig` に

```
pr = !hub pull-request -h `git config pr.head-owner`:`git rev-parse --abbrev-ref HEAD` -b `git config pr.base-owner`:`git config pr.base-branch`
```

と記述します。(もしくは `git config --global` で)

```
$ git co -b foo
$ EDIT EDIT...
$ git ci -m 'foo'
$ git push -u origin foo
$ git pr
```

これでカレントブランチをベースにした特定のプロジェクトの GitHub への pull-request が簡単にできるようになりました。

---

* 余談ですが、hub は -i オプションをつければ issue を pull-request にすることができますが、pull-request は reopen することができないため、使い勝手が悪いので最近はほとんどつけていません。