OmniAICreator/Qiita-1.07M huggingface dataset:
vimfiler まとめ


# vimfiler とは
ファイル操作をサポートする Vim のプラグイン。

GitHub で公開されている。
[Shougo/vimfiler.vim](https://github.com/Shougo/vimfiler.vim)

# 導入方法

vimfiler は unite.vim の機能を利用するので、まずは unite.vim をインストールする必要がある。


unite.vim インストール後、 NeoBundle を導入済みの場合はまずは以下を .vimrc に記述する。

    NeoBundle 'Shougo/vimfiler'

そして、ノーマルモードで以下のコマンドを実行すると、 vimfiler をインストールできる。

    :NeoBundleInstall

# 基本操作

以下のコマンドを実行すると、 vimfiler を起動できる。

    :VimFiler

起動すると、カレントディレクトリのディレクトリとファイルが表示される。

j, k でカーソルを上下に移動でき、選択中のファイルは e で開ける。

q で vimfiler を終了できる。

| キー     |  操作 |
|----------|-------|
 j         | カーソルを下に移動
 k         | カーソルを上に移動
 h         | 親ディレクトリへ移動
 l         | 子ディレクトリへ移動
 q         | VimFiler を停止
 ~         | ホームディレクトリへ移動
 M         | マスクモード
 e         | 選択中のファイルを開く
 N         | 新規ファイルを作成
 K         | 新規ディレクトリを作成
 D         | ファイル削除
 yy        | 選択中のファイルのフルパスをコピー
 gs        | セーフモードのオン/オフの切り替え
Ctrl + l | 画面の再描画
. | 隠しファイルの表示/非表示の切り替え

vimfiler は default ではセーフモードで起動し、ファイルの削除や作成はできないようになっている。
ファイルの作成などをするには、 `gs` と入力しセーフモードを解除する必要がある。

また、直近のファイル操作が vimfiler の画面に反映されていない時は、 `Ctrl + l` で画面が再描画するといよい。

## マスクモード
M でマスクモードに入る。

マスクモードでは、 unite.vim のインターフェースでファイルの絞り込みができる。

# 設定(.vimrc)

以下は、私の vimfiler 用の設定。
プラグインをインストールする以外、何の設定も書いていない。

```vim:.vimrc
" VimFiler
NeoBundle 'Shougo/vimfiler'
```

# 参考

 * [VimFilerはじめました | Scimpr Blog](http://blog.scimpr.com/2013/03/06/vimfiler%E3%81%AF%E3%81%98%E3%82%81%E3%81%BE%E3%81%97%E3%81%9F/)
   * 導入方法、基本操作についてとても分かりやすく書いてある

 * [vimfiler のデフォルトキーバインドまとめ（機能別） - Alone Like a Rhinoceros Horn](http://d.hatena.ne.jp/h1mesuke/20100611/p1)
   * キーバインドが分かりやすくまとめてある

 * [vimfilerとUniteでVimをファイラとして使用する方法 | karakaram-blog](http://www.karakaram.com/vimfiler)
   * キーバインドが分かりやすくまとめてある
「サイコロを転がす」をErlangで(横へな12)

http://nabetani.sakura.ne.jp/hena/ord12rotdice/
「サイコロを転がす」をErlangでやってみました。

特に工夫といえる工夫もなく、サイコロを「正面、上、左」の目の組(Tuple)で表現して素直に書きました。

```erlang:dice.erl
-module(dice).
-export([tests/0, test/2, solve/1]).

solve(Data) ->
  {_Dice, L} = lists:foldl(fun rotate_add/2, {{1,2,3}, [1]}, Data),
  [Digit + $0 || Digit <- lists:reverse(L)].

rotate_add(Dir, {Dice, L}) ->
  NewDice = rotate(Dir, Dice),
  {NewDice, [element(1, NewDice) | L]}.

rotate($N, {Face, Upper, Left}) -> {7 - Upper, Face, Left};
rotate($S, {Face, Upper, Left}) -> {Upper, 7 - Face, Left};
rotate($W, {Face, Upper, Left}) -> {7 - Left, Upper, Face};
rotate($E, {Face, Upper, Left}) -> {Left, Upper, 7 - Face}.

tests() ->
  test("NNESWWS", "15635624"), %0
  test("EEEE", "13641"), %1
  test("WWWW", "14631"), %2
  test("SSSS", "12651"), %3
  test("NNNN", "15621"), %4
  test("EENN", "13651"), %5
  test("WWNN", "14651"), %6
  test("SSNN", "12621"), %7
  test("NENNN", "153641"), %8
  test("NWNNN", "154631"), %9
  test("SWWWSNEEEN", "12453635421"), %10
  test("SENWSWSNSWE", "123123656545"), %11
  test("SSSWNNNE", "126546315"), %12
  test("SWNWSSSWWE", "12415423646"), %13
  test("ENNWWS", "1354135"), %14
  test("ESWNNW", "1321365"), %15
  test("NWSSE", "154135"), %16
  test("SWNWEWSEEN", "12415154135"), %17
  test("EWNWEEEEWN", "13154532426"), %18
  test("WNEWEWWWSNW", "145151562421"), %19
  test("NNEE", "15631"), %20
  test("EEEEWNWSW", "1364145642"), %21
  test("SENNWWES", "123142321"), %22
  test("SWWWSNSNESWW", "1245363635631"), %23
  test("WESSENSE", "141263231"), %24
  test("SWNSSESESSS", "124146231562"), %25
  test("ENS", "1353"), %26
  test("WNN", "1453"), %27
  test("SSEENEEEN", "1263124536"), %28
  test("NWSNNNW", "15414632"), %29
  test("ESSSSSWW", "132453215"), %30
  test("ESE", "1326"), %31
  test("SNWNWWNSSSS", "121456232453"), %32
  test("SWEESEN", "12423653"), %33
  test("NEEWNSSWWW", "15323631562"), %34
  test("WSEW", "14212"), %35
  test("SWSNNNSNWE", "12464131353"), %36
  test("ENWEWSEEW", "1351513545"), %37
  test("WSEWN", "142124"), %38
  test("EWNEESEWE", "1315321414"), %39
  test("NESEEN", "1531263"), %40
  test("WSW", "1426"), %41
  test("ENEWE", "135656"). %42

test(Data, Expected) ->
  Result = solve(Data),
  OkNg = case Result =:= Expected of
    true -> ok;
    false -> ng
  end,
  io:fwrite("~w: ~s -> ~s~n", [OkNg, Data, Result]).
```

実行結果(の一部):

<pre>
ok: NNESWWS -> 15635624
ok: EEEE -> 13641
ok: WWWW -> 14631
ok: SSSS -> 12651
ok: NNNN -> 15621
</pre>
watchコマンドに満足できなかったのでwatcherコマンド作った。

* フルスクリーン動作しないwatchコマンドが欲しかったが、毎回whileとsleep書くの面倒だったので・・・。

```bash:~/.bashrcに以下追記してください。
watcher() {
    if [ "$#" -lt 1 ];then
        echo "usage: watch <command>"
        return 1
    fi
    while true
    do
        echo `date +"[%Y-%m-%d %H:%I:%S]"` $ $@
        $@
        sleep 3
        echo
    done
}
```


使い方:

```bash:
$ watcher ls -l
```


![watcher.png](https://qiita-image-store.s3.amazonaws.com/0/25728/ca0d7cc1-80e7-ab23-335b-6b4391bfc94d.png)
strong_parametersについて

* https://github.com/rails/strong_parameters
* http://willnet.in/48
* http://lab.unicast.ne.jp/2013/06/11/rails4%E3%81%AEstrong_parameters%E8%A6%9A%E3%81%88%E6%9B%B8%E3%81%8D/
* http://blog.ohgaki.net/git-hub-rails-mass-assignment
* http://launchware.com/articles/whats-new-in-edge-scoped-mass-assignment-in-rails-3-1
* http://www.1x1.jp/blog/2012/03/mass_assignment_vulnerability_cakephp.html
* http://d.hatena.ne.jp/InoHiro/20100812/1281600786

---

Rails4.0で導入された[strong_parameters](https://github.com/rails/strong_parameters)、gemで入れるだけでRials3系でも動くというのを教えてもらったので試してみた

## strong_parameters ?
mass_assignment脆弱性を解決する仕組み

### mass_assignment脆弱性 ?
* mass_assignment
 * ActiveRecordの値をハッシュで一度に設定できる機能

```rb:
# こんなの
def signup
  params[:user] # => {:name => “hogehoge”, :email => "fugefuge@example.com"}
  @user = User.new(params[:user])
end
```

* Userオブジェクトがadmin属性を持っててparams[:user]に :admin => true もあると、@user.admin #=> true になっちゃって困る、これがmass_assignment脆弱性
 * Rails アプリにありがちな脆弱性の一つ
  * PHPでは古くから(に？）あった脆弱性らしいです
* こんなこともあったみたい
 * [
github の mass assignment 脆弱性が突かれた件](http://blog.sorah.jp/2012/03/05/mass-assignment-vulnerability-in-github)

### Rails3での対応
* 一般的にはモデルで対応
 * 代入の許可/制限を ActiveRecord#attr_accessible/ActiveRecord#attr_protected でコントロールする

```rb:
class User < ActiveRecord::Base
  attr_protected :admin
end
 
user = User.new(:admin => true)
user.admin # nil due to attribute protection
```

### PHPでの取り組み
* CakePHPのはなし
 * SecurityComponent でフォームの改ざんを検出する

## strong_parameters(Rails4)
* Rails4ではstrong_parametersによりコントローラでパラメータの検証を行う

```rb:
# こうなる
def signup
  params[:user] # => {:name => “hogehoge”, :email => "fugefuge@example.com"}
  @user = User.new(params.require(:user).permit(:name, :email)
end
```

 * 許可されていないパラメータが渡された場合、ActiveModel::ForbiddenAttributesエラーが発生

### Rails3.2.13で使う
* 公式の [README](https://github.com/rails/strong_parameters/blob/master/README.md) にも書いてある

１. Gemfileに追記、bundle install

```rb:
gem 'strong_parameters'
```

２.  使用したいクラスで以下のようにモジュールをinclude

```rb:
class Post < ActiveRecord::Base
  include ActiveModel::ForbiddenAttributesProtection
end
```
  * あるいは

```rb:
ActiveRecord::Base.send(:include, ActiveModel::ForbiddenAttributesProtection)
```

３.  config/application.rbに下記の設定が true になっている場合は false に変更

```rb:config/application.rb
config.active_record.whitelist_attributes = false
```

---

* セキュリティの考えとして入力段階で不正なデータを取り除いた方がより安全ということらしいので、コントローラで防ぐ方がモデルでやるよりもセキュアになりやすいらしい
 * もちろんモデルでやるやり方でも適切にやれば何の問題もない
 * より前段で防いだ方が問題が起きにくいというだけ
FreeMarkerだけでランダムにtrue/falseの分岐をする

# はじめに
ちょっとランダムに要素の出し分けをしたいんだけど、java側で制御はしたくないでござる…！みたいなときに使えるかもしれないやつです。

# サンプルコード
```
<#if ((.now?long % 2) == 0)>
<p>trueだよ！</p>
<#else>
<p>falseだよ！</p>
</#if>
```

# おわり
パフォーマンスとかは特に考慮してないやつですが。
もしかしたら使えることもあるかなーというメモ兼Qiita使ってみるテストでした。
Linux kernel versions for SDIO

**3.2.x まで**

 * 速度は HS (50MHz) 迄のサポート。
 * Synchronous Interrupt サポート。

**3.3.x 以降**

 * UHS-I (最高 208MHz) のサポート開始。但し S18R ビット対応が不十分なので、 SDIO カードによっては HS の速度でネゴシエーションされる可能性がある。

**3.9.x 以降**

 * CMD5 発行時の S18R ビット対応。

**付録 : 非サポートの機能**

 * Asynchronous Interrupt
  * SDIO カードのドライバで CCCR を自前で変更する必要がある (IENx, IENM, EAI の各ビット) 。
Google Chromeでカメラアクセスを毎回聞かれないようにする方法


とある案件で、カメラを使ってコンテンツを作っていたら、リロードするたびにカメラアクセスを聞かれてめんどくさかったが、`https`でアクセスしているコンテンツの場合は最初に許可するとそれ以降は聞かれなくなるらしい。

デバッグとかにも便利ぽいのでメモ。
Chromeのアドレスバーからエラー検索を簡単に行う方法

[StackExchange](http://stackexchange.com/)という、プログラミング系のQ&Aサイトを横断検索できるサービスがあります。  
このサイトをChromeの検索エンジンに設定し、アドレスバーから簡単にエラーメッセージの解決方法を検索していく方法を紹介します。

## ChromeにStackExchangeを登録

1. Chromeの設定を開き（メニューから辿る、またはアドレスバーに chrome://settings/ を入力）  
「検索」の「検索エンジンの管理」をクリックし、検索エンジン設定ウィンドウを開く。
2. 「その他の検索エンジン」最下部の入力項目に、以下の値を入力し、「完了」をクリック。

|入力欄|入力値|
|:------------|:-----------|
|新しい検索エンジンを追…|StackExchange|
|キーワード|se （後述）|
|検索キーワードの代わり…|http://stackexchange.com/search?q=%s|

以上で準備完了です。

## 使い方

アドレスバーに「se（半角スペース）」を入力すると、「StackExchangeを検索：」と表示され、検索エンジンとしてStackExchangeを使用した検索が行えるようになります。 
※「se」というのが先ほど設定したキーワードです。お好みに応じて変更して使ってください。

そのままエラーメッセージをアドレスバーにコピペして検索すればOK
【EZGUIを殴り続けるのだ】raycastClosestShape: The maximum distance must be greater than zero!

07-08 15:35:07.330: E/Unity(2233): Scene::raycastClosestShape: The maximum distance must be greater than zero!

こんなエラーがLogCatで出た。
症状としては

特定のシーンに入る。
入った直後にタップをする。
反応が帰ってこないで2秒くらい固まる。
LogCatでエラーが出る。

ちなみに以降は正常に動作する。

謎…

で、ちょっと調べてみてる。

Rayを飛ばしているのはEZGUIのUIManager.csの以下のメソッド

・protected void DoDragUpdate(POINTER_INFO curPtr)
・protected void DispatchHelper(ref POINTER_INFO curPtr, int camIndex)

で、今回ぶつかったのは
protected void DispatchHelper(ref POINTER_INFO curPtr, int camIndex)
こいつ

ログこんな感じ
エラーの時
・07-08 15:35:07.320: I/Unity(2233): ============DispatchHelper: TAP: 0; 0; 
正常な時
・07-08 15:35:29.750: I/Unity(2233): ============DispatchHelper: TAP: Infinity; -1; 

ん・・・値入ってない？

Physics.Raycast(curPtr.ray, out hit, 0, 0);
って感じになってるっぽい

0距離のレイ？

試しに以下のコードを追加
if (curPtr.rayDepth <= 0 )
{
	curPtr.rayDepth = Mathf.Infinity;
}

要は0以下のレイを飛ばそうとしたら強制的に無限レイを発射するようにしてみた。

(このあたりでNexus10さんが御臨終…電池が切れた)

結果

相変わらず固まるのだけどこれは別の問題の筈。
でもRayを飛ばし続けるエラーは出なくなった。


再現端末
・Nexus7
・Nexus10
再現しなかった端末
・XperiaAcro


今回はここまででおしまい
chefのcronでChef::Exceptions::Cronが発生する

chef-soloでcronを使った時にエラーになってはまったのでメモ

## 現象

* 以下のようなレシピを書いて一般ユーザ(ec2-user)でchef-soloを実行する

```rb:
cron "cloudwatch_monitoring" do
  user "ec2-user"
  minute "*/5"
  command %Q!hoge!
  action :create
end
```

* 以下のようなエラーが発生する

```bash:
Chef::Exceptions::Cron
----------------------
Error updating state of cloudwatch_monitoring, exit: 1
```

## 原因
 * cronでuserを指定した場合にcrontab -u ec2-userのようなコマンドが発行される
 * 上記の-uオプションは特権ユーザでしか許可されないので一般ユーザではエラーとなる
  * rootで実行すればOK

## 原因の調査方法
 * chef-soloを -l debugオプション(デバッグログ出力)を付けて実行
  * => chef-11.4.4/lib/chef/provider/cron.rb:210でエラー
 * 該当コードでデバッグ情報を主力
  * => must be privileged to use -uが出力される

```rb:
      def write_crontab(crontab)
        status = popen4("crontab -u #{@new_resource.user} -", :waitlast => true) do |pid, stdin, stdout, stderr|
          stdin.write crontab
p stderr.read # => must be privileged to use -u出力
        end
        if status.exitstatus > 0
          raise Chef::Exceptions::Cron, "Error updating state of #{@new_resource.name}, exit: #{status.exitstatus}"
        end
      end
```
PhoneGap(Cordova)を使えるようになるまでのメモ

DreamWeaverのPhoneGapサービスを使ってAndroidとiOSアプリを作りたかったんだけどうまくいかない。
日本語のドキュメントも少ないし、やりたいことを調べるだけでも時間がかかる。

いろいろ調べてみたら、PhoneGapの日本語のファンサイトを発見。

[http://phonegap-fan.com/](http://phonegap-fan.com)

ありがたい！
なにもDreamWeaverに縛られることもないので、これでいいじゃん。

作業しながら気になったことのメモ
***

###[スタートアップガイドのAndroid編](http://phonegap-fan.com/startup/android.php)

まず

>Eclipse Classic のダウンロードとインストール
>Android SDK のダウンロードとインストール
>ADT Plugin のダウンロードとインストール

って書いてあるけど。
Android SDKを入れたらEclipseが付いてきた！
少し前はなかったのに。。。。
・・・というわけで。Android SDKだけでOK！（たぶん）

[Android SDK](http://developer.android.com/sdk/index.html)

>作成したプロジェクトのルートディレクトリに、以下の2つの新しいディレクトリを作成します
>/libs
>assets/www

libsはすでに存在してたので作らなかった

>以下のコードを、 `<uses-sdk.../> `と `<application.../> `タグの間に貼り付けてください。

スペルミス？が3か所あったので修正

```xml:AndroidManifest.xml(修正後)
<supports-screens 
android:largeScreens="true" 
android:normalScreens ="true" 
android:smallScreens="true" 
android:resizeable="true"
android:anyDensity="true" /> 
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" /> 
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> 
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
```

あとは書いてある通りにやって…
Android端末をPCに接続してRun as > Android Applicationで
動いた！

***
あとでなんとなく気付いたこと、

どうやらこの方法ではiOSアプリは作れないらしい。
やっぱりiOSアプリはMacとXcodeで作るのが順当みたい・・・まぁ。そういうもんか

WindowsでiOSアプリを作るにはDreamWeaver + PhoneGap Buildかなぁ？
GenericStackをTypeParameter混じりのstaticな関数として扱うと、関数参照を渡せなくなる

```hx:Test.hx
import haxe.ds.GenericStack;
class Test 
{
	var arrayFunctionHolder:Array<String> -> Void;
	var stackFunctionHolder:GenericStack<String> -> Void;
	
	static public function arrayFunction<T>(param:Array<T>):Void
	{
	}
	
	static public function stackFunction<T>(param:GenericStack<T>):Void
	{
	}
	
	static public function stackFunction2(param:GenericStack<String>):Void
	{
	}
	
	public function new()
	{
		arrayFunctionHolder = arrayFunction;	// ok
//		stackFunctionHolder = stackFunction;	// error...
//		stackFunctionHolder = stackFunction<String>;	// error...
//		stackFunction<String>(new GenericStack<String>());	// error...
		stackFunction2(new GenericStack<String>());	// ok
		var hoge:Hoge<String> = new Hoge(stackFunction);	// ok...
	}
}
class Hoge<T>
{
	public var hoge2:Hoge2<T>;
	public function new(func:GenericStack<Hoge2<T>> -> Void) 
	{
		hoge2 = new Hoge2<T>();
	}
}
class Hoge2<T>
{
	public var stackFunctionHolder:GenericStack<T>;
	public function new() 
	{
	}
}
```

(´・ω・｀)
RequestQueueのディスクキャッシュの容量を増やす


[前記事](http://qiita.com/tsuyosh/items/40e87b3e0dcbb68b6d9b)のようにVolley.newRequestQueue(Context)で返されるRequestQueueにはデフォルトで最大5MBのディスクキャッシュが使えるように設定済みですが5MBじゃ足りない、という場合もありますので自前でRequestQueueのインスタンスを作ってみます。

```java
public class VolleyUtil {
    /** Default on-disk cache directory. */
    private static final String DEFAULT_CACHE_DIR = "volley";

    /**
     * 
     * @param context
     * @param stack
     * @param maxCacheSizeInBytes
     * @return
     */
    public static RequestQueue createRequestQueue(Context context, HttpStack stack, int maxCacheSizeInBytes) {
        File cacheDir = new File(context.getCacheDir(), DEFAULT_CACHE_DIR);

        String userAgent = "volley/0";
        try {
            String packageName = context.getPackageName();

            PackageInfo info = context.getPackageManager().getPackageInfo(packageName, 0);
            userAgent = packageName + "/" + info.versionCode;
        } catch (NameNotFoundException e) {
        }

        if (stack == null) {
            if (Build.VERSION.SDK_INT >= 9) {
                stack = new HurlStack();
            } else {
                // Prior to Gingerbread, HttpUrlConnection was unreliable.
                // See: http://android-developers.blogspot.com/2011/09/androids-http-clients.html
                stack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent));
            }
        }

        Network network = new BasicNetwork(stack);

        RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir, maxCacheSizeInBytes), network);
        queue.start();

        return queue;
	}
}

```

とりあえずこのコードでその場を凌ぎましたがどうも筋が良くないです。。
ImageLoaderをディスクキャッシュ対応にする


最初は単純にディスクキャッシュ対応のImageCache実装を作ればおkと思ってました。実際に[DiskBasedCacheを拡張した実装を作っていた記事](http://howrobotswork.wordpress.com/2013/06/02/downloading-a-bitmap-asynchronously-with-volley-example/)もあったんですが気が変わりました。

```java:ImageLoader.java
    /**
     * Simple cache adapter interface. If provided to the ImageLoader, it
     * will be used as an L1 cache before dispatch to Volley. Implementations
     * must not block. Implementation with an LruCache is recommended.
     */
    public interface ImageCache {
        public Bitmap getBitmap(String url);
        public void putBitmap(String url, Bitmap bitmap);
    }
```
説明には

> Implementations must not block.

とあります。ディスクベースのキャッシュで読み書きするとなるとブロックしそうです。

> it will be used as an L1 cache before dispatch to Volley.

ということなのでVolley内にL2キャッシュ(ディスクベース)を用意すれば上手に目的(ImageLoaderのディスクベース対応)を達成できそうです。

そう思って色々調べたところ、、

```java
ImageLoader imageLoader = new ImageLoader(Volley.newRequestQueue(context), new BitmapCache());
```
と書くだけでcontext.getCacheDir()以下のディレクトリに最大5MBのディスクキャッシュが作られます。__知らないうちにディスクキャッシュを使っていました(滝汗__

Volley.newRequestQueue(Context, HttpStack)内で

```java:Volley.java
        RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir), network);
```
このようにRequestQueueのインスタンスを作成してImageLoaderのコンストラクタに渡している訳です

キャッシュの容量については以下のDiskBasedCacheのコンストラクタで指定出来るようになっていますが指定しない場合にはデフォルトのキャッシュ容量(=5MB)が指定されます。

```java:DiskBasedCache.java
    /**
     * Constructs an instance of the DiskBasedCache at the specified directory.
     * @param rootDirectory The root directory of the cache.
     * @param maxCacheSizeInBytes The maximum size of the cache in bytes.
     */
    public DiskBasedCache(File rootDirectory, int maxCacheSizeInBytes) {
        mRootDirectory = rootDirectory;
        mMaxCacheSizeInBytes = maxCacheSizeInBytes;
    }
```
PullToRefreshListViewを使う場合はOnItemClickListener#onItemClick()のpositionに要注意


[PullToRefreshView](https://github.com/johannilsson/android-pulltorefresh)でTwitterやFacebookの様にListViewを下にビヨーンと引っ張ると更新、というような事ができるようになって便利なんですがアイテムを選択したときになにか処理をさせたい場合にハマったのでメモ。

[OnItemSelectedListener#onItemSelected](http://developer.android.com/intl/ja/reference/android/widget/AdapterView.OnItemClickListener.html#onItemClick%28android.widget.AdapterView<?>, android.view.View, int, long%29)のpositionの値が通常よりも+1多めの値が渡されます。

まぁ単純にpositionを-1すればいいだけの話なんですが理由がよくわからなかったので詳しく調べてみたところPullToRefreshViewが内包するListViewに自動的にHeaderが追加されているのが原因でした。

以下のようにすれば問題なく処理できます。

```java
	private OnItemClickListener mOnItemClickListener = new OnItemClickListener() {
		@Override
		public void onItemClick(AdapterView<?> adapter, View view,
				int position, long id) {
			int numHeaders = mListView.getRefreshableView().getHeaderViewsCount();
			Object item = mAdapter.getItem(position - numHeaders);
		}
	};

```
Android上にdebianをインストールするdebian-kitの流れを追ってみた

Android上でubuntuやdebianが動作します。
（nexus7にAndroidを消してubuntuを入れるというのにこだわらなくて済みそう。）
ubuntuだとXで問題があるらしいので、実質debian専用かな。

インストーラ(debian-kit-1-5.shar)を改修しようと思ったけど時間が足りなかった・・・。
取り急ぎわかったところをスクリプトで伝えます。

```bash:debian-kit-1-5.sharをダウンロードし、実行
#!/system/bin/sh
SHAR_FILE="debian-kit-1-5.shar"
if [ ! -e "$SHAR_FILE" ];then
    echo "[ERR1] '$SHAR_FILE' no such file. quit."
    exit 1
fi

chmod +x $SHAR_FILE && ./$SHAR_FILE
```

* /data/local/deb/autorun がインストーラから呼ばれ、mk-debianを呼ぶ。
* /data/local/deb/mk-debian から debootstrapが呼ばれる。
* インストールが終わったら、 deb コマンドでdebian環境が開始される。

```bash:インストール後の必須初期設定
#!/bin/sh

if [ ! -e "/etc/debian_version" ]; then
    echo "[ERR1] cannot execute. check file '/etc/debian_version' not found. quit."
    exit 1
fi

if [ "$USER" != "root" ]; then
    echo "[ERR2] execute user must root. quit."
    exit 1
fi

apt-get update
apt-get -y install andromize sudo netcat ssh locales

# rootしかいないので一般ユーザ(例:debian)作成
adduser debian
usermod -G inet,sudo,debian debian
passwd debian

# timezone
echo "Asia/Tokyo" > /etc/timezone
echo "TZ='Asia/Tokyo'; export TZ" >> /home/debian/.profile 

# 一般ユーザでも読み取れるように700から修正
chmod 755 /etc/resolv.conf

# locale変更
sed -i -e 's/# \(ja_JP.UTF-8\)/\1/' /etc/locale.gen
locale-gen

echo "[INFO] done."
```

寝よう。
nexus 7を工場出荷時に戻す

[Google](https://developers.google.com/android/nexus/images#nakasijdq39)が配布してくれています。bootloader lockは手動でやる必要あります。

## 母艦のubuntuから工場出荷時にもどす場合

```bash:
sudo apt-get install \
  android-tools-fastboot android-tools-adb android-tools-adbd
```


## その他

[nexus7にubuntuを入れたまとめ](http://qiita.com/tukiyo@github/items/1ba5f7c96e483b0924ab)
[nexus7用極小ubuntuイメージ作った](http://qiita.com/tukiyo@github/items/7212baca86be159cd6f6)
を試すような人向け。
VC++ で可変個引数にそのまま渡せる文字列クラス？

*注：ネタなので役にはたちません*

---

なぜか VC++ でこんなコードが上手く動きました。

```cpp
#include <stdio.h>
#include <atlstr.h>

int main()
{
    ATL::CString str("hogehoge");

    // なぜか動く
    printf("%s\n", str);

    // 普通はこう
    printf("%s\n", (LPCSTR)str);

    // もしくはこう？
    printf("%s\n", str.GetString());

    return 0;
}
```

もちろん `std::string` で似たようなことしてもまともに動きません。

```cpp
#include <stdio.h>
#include <string>

int main()
{
    std::string str("hogehoge");

    // まともに動かない
    printf("%s\n", str);

    // こうしなければならない
    printf("%s\n", str.c_str());

    return 0;
}
```

---

`ATL::CString` と似たような方法で `printf` などの可変個引数にそのまま渡してもうまく動いているような気がしてしまう文字列クラスを作ってみました。

ただし gcc では実行出来なかったし、VC++ でも動作は保証されません( http://msdn.microsoft.com/ja-jp/library/vstudio/awkwbzyc.aspx )。

```cpp
#include <stdio.h>
#include <string.h>
#include <crtdbg.h>

class ore_string
{
private:
    char* _str;
    
    struct data_t
    {
        size_t len;
        int ref;
    };
    
    char* buffer() const
    {
        return _str - sizeof(data_t);
    }
    
    data_t* data() const
    {
        return reinterpret_cast<data_t*>(buffer());
    }

public:
    ore_string(const char* str)
    {
        size_t len = strlen(str);
        _str = new char[len + 1 + sizeof(data_t)] + sizeof(data_t);
        data()->len = len;
        data()->ref = 1;
        strcpy_s(_str, len + 1, str);
    }

    ore_string(const ore_string& rhs)
    {
        _str = rhs._str;
        data()->ref++;
    }
    
    ~ore_string()
    {
        if(--data()->ref == 0)
        {
            delete[] buffer();
        }
    }
    
    const char* c_str() const
    {
        return _str;
    }
    
    int length() const
    {
        return data()->len;
    }
    
    int refcount() const
    {
        return data()->ref;
    }
};

int main()
{
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

    ore_string str1("hogehoge");

    printf("%s pointer:%p length:%d refcount:%d\n", str1, str1.c_str(), str1.length(), str1.refcount());

    {
        ore_string str2(str1);

        printf("%s pointer:%p length:%d refcount:%d\n", str1, str1.c_str(), str1.length(), str1.refcount());
        printf("%s pointer:%p length:%d refcount:%d\n", str2, str2.c_str(), str2.length(), str2.refcount());
    }
    
    printf("%s pointer:%p length:%d refcount:%d\n", str1, str1.c_str(), str1.length(), str1.refcount());

    printf("sizeof ore_string=%lu char*=%lu\n", sizeof(str1), sizeof(char*));

    return 0;
}
```

*実行結果*

```
hogehoge pointer:00586C50 length:8 refcount:1
hogehoge pointer:00586C50 length:8 refcount:2
hogehoge pointer:00586C50 length:8 refcount:2
hogehoge pointer:00586C50 length:8 refcount:1
sizeof ore_string=4 char*=4
```

ポイントは、文字長や参照カウンタを持っているにも関わらす `sizeof(str1)` と `sizeof(char*)` が同じであることです。

「文字長＋参照カウンタ＋文字列」分のバッファを確保して、バッファのアドレスを「文字長＋参照カウンタ」だけズラして `ore_string` の唯一のメンバ変数にしています。
TestLinkのインストール

## はじめに
* TestLinkのインストール方法をご紹介
 * TestLinkとはPHP製のテスト管理ツール
 * TestLinkの2013/07/08の最新バージョンは1.9.7

## インストール手順
### ダウンロード&配置

```
$ wget http://sourceforge.net/projects/testlink/files/TestLink 1.9/TestLink 1.9.7/testlink-1.9.7.tar.gz/download
$ tar xzvf testlink-1.9.7.tar.gz
$ rm testlink-1.9.7.tar.gz
$ sudo mv testlink-1.9.7 /var/www/html
```

### 準備
* httpd, MySQLが停止していた場合起動しておく 

```
$ sudo /etc/init.d/httpd start
$ sudo /etc/init.d/mysqld start # DBでMySQLを選択する場合
```

### インストール
* http://localhost/testlink-1.9.7にアクセスする
* 『New installation』をクリック
* 利用規約に同意してよければ『I agree to the terms set out in this license.』にチェックを入れ、『Continue』をクリックする
* 以下のディレクトリの権限設定＆ディレクトリ作成をする

```
$ sudo chmod 777 /var/www/html/testlink-1.9.7/gui/templates_c -R
$ sudo mkdir /var/testlink
$ sudo mkdir /var/testlink/logs
$ sudo mkdir /var/testlink/upload_area
$ sudo chmod 777 /var/testlink -R
```

* 『Continue』をクリックする
* Definition of DB accessで設定を行う(以下は設定例)
 * Database Type ： MySQL(デフォルト)
 * Database host ： localhost(デフォルト)
 * Database name ： testlink(デフォルト)
 * Database admin login ： root
 * Database admin password ： 空(デフォルト)
 * TestLink DB login ： admin
 * TestLink DB password ： admin
* 『Process TestLink Setup! 』をクリックする
* 『Installation was successful!』と表示されていればインストール完了
* 『Testlink (using login name:admin / password:admin - Please Click Me!).』のリンクをクリックしてログインページへ
* ログインできることを確認
 * Login Name：admin
 * Password：admin


----

もし、セットアップの途中で「Checking PHP DB extensions Warning!: Your PHP installation don't have the mysql extension mysql- without it is IMPOSSIBLE to use Testlink.Failed! 」と言われたら、プラグインが足りていないので以下をやってください。

```
$ (sudo) yum install php-mysql
$ (sudo) /etc/init.d/httpd restart
```

# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Seleniumerといっていますが、Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください
Windows+Rubyinstaller（ruby2+rails4)でのDeviseを使ったrake db:migrateが通らない時の解決法

自分用なんでめっちゃ適当です。

上記環境で普通にbundle installしてrails g devise Modelでmigrateファイルを生成して、rake db:migrateすると
no such file to load -- bcrypt_ext(bcryptだったり2.0/bcrypt_extだったり）でmigrateが通りませんでした
その時の解決法

gemを確認
---
ruby本体のディレクトリをたどっていてgemファイルが格納されてる場所を探します。（パス分からない人はググれば出てくる）
で、その中からbcrypt-rubyを探します。
普通にbundle install任せだとbcrypt-ruby-3.0.1-x86-mingw32みたいにバージョンの後になんかついてるのがインストールされてます。
こうなってて上に書いたエラーが出た人はこの方法で通るようになります。


bcrypt-rubyをアンインストール
---
gem uninstall bcrypt-rubyを実行しbcrypt-rubyをアンインストール。
複数のバージョンが入ってる場合はどれ消す？みたいなこと聞いてくるのでallを選びましょう。
1つしか入ってない人は何も聞かれず削除されます。

bcrypt-rubyをインストール
---
gem install bcrypt-ruby --platform=ruby --no-ri --no-rdoc -v 3.0.1を実行
なぜ3.0.1かというとver指定せずにインストールすると3.1.0がインストールされるのですがそれだと怒られちゃいます。
3.0.1入れろゴルァって言われるので3.0.1です

終了
---
とりあえずこれで治ります。（少なくとも自分は）
修正以前に使ってたrailsプロジェクトは削除して新規作成しましょう。
そのまま使うとnameErrorとか吐かれてめんどくさいので。

参考元　==> http://stackoverflow.com/questions/16945291/bcrypt-error-devise-ruby-2-0-and-rails-4-0



追記
--
Windows環境だとめんどくさいトラブル起きやすいのでVirtualBox(以下VB)上でUbuntuなりDebianなりCentOSなり動かしてそちらで実行したほうが楽です。
VBにはホストOSとクライアントOS双方向のファイル同期機能がありますしSSHで接続も簡単なのでWindowsで編集→VB上のLinuxで実行
Ubuntuを使う場合Server版はおすすめしません（自分の環境だとapt-get install/git cloneしたパッケージが再起動するとファイルごと消えるという現象が発生しました）のでUbuntuを使うならDesktop版。
GUIが嫌な人はDesktop版のGUIを切るか同系列のDebianを使いましょう。
第12回オフラインリアルタイムどう書く。groovy による実装。

オフラインリアルタイムどう書く
http://atnd.org/events/40389
の、当日の問題(サイコロを転がす)
http://nabetani.sakura.ne.jp/hena/ord12rotdice/
の実装例。
groovy。

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

で。

```groovy
// tested with Groovy Version: 2.1.3
def solve( src )
{
  state="123456"
  src.inject("1"){ acc, dir ->
    state=state[ [
      N:[4,0,2,3,5,1],
      E:[2,1,5,0,4,3],
      W:[3,1,0,5,4,2],
      S:[1,5,2,3,0,4],
    ][dir] ]
    acc+state[0]
  }
}

def test( src, expected )
{
  actual = solve( src )
  ok = actual==expected
  printf( "%s %s->%s ( %s )\n", (ok ? "ok" : "**NG**"), src, actual, expected );
}
/*0*/ test( "NNESWWS", "15635624" );
/*1*/ test( "EEEE", "13641" );
/*2*/ test( "WWWW", "14631" );
/*3*/ test( "SSSS", "12651" );
```

いつも通り、テストデータの大半は省略。

で。

kei_q さんの
http://qiita.com/kei_q/items/87142e871488b2df4e53
と、ほぼ同じ。

index を利用した文字の置き換えで書けば良いという考え。
groovy の場合、

```groovy
indices=[3,2,1,0,0,1,2]
print( "abcd"[indices] ) // ==> dcbaabc
```

という非常におあつらえ向きの演算子があるので、これを使ってみた。

`inject` の中で状態変更するなんて邪悪だ！ という意見もあったけど、私は気にしないよ。
はじめてのpython① pythonbrewで環境構築&HelloWorld!!

# 背景
「さわった事が無い言語でWebシステムを作ろう」というテーマの社内勉強会に参加する事になり、
pythonの調査を担当する事になったので、調べた内容をまとめてみる。まずは環境構築から。

# 開発環境
* CentOS 6.4
* pythonbrew 1.3.3
* python 3.3.0

# pythonの環境整備
[公式](http://www.python.org/ "python.org")でsourceを落としてきてインストールする方法もあるが、
pythonbrewを使うと複数バージョンのpythonがインストール出来て、あまり環境も汚さない感じ
(RubyのRVMみたいな感じ）なので、pythonbrewで環境構築する。

まずはpythonbrewのインストール。今回はマルチユーザーとしてインストールする。

```
$ git clone https://github.com/utahta/pythonbrew
$ cd pythonbrew
$ sudo ./pythonbrew-install
```

python 3.3.0をインストール。sudoを使いたい場合はsudopybrewコマンドでいけるらしいが、エラーが出た。PATH的な問題かしら。。。

```
$ sudopybrew install --force 3.3.0
-bash: sudo PYTHONBREW_ROOT=/usr/local/pythonbrew PATH=/usr/local/pythonbrew/bin:/usr/local/rvm/gems/ruby-1.9.3-p448/bin:/usr/local/rvm/gems/ruby-1.9.3-p448@global/bin:/usr/local/rvm/rubies/ruby-1.9.3-p448/bin:/usr/local/rvm/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/vagrant/bin /usr/local/pythonbrew/bin/pythonbrew: そのようなファイルやディレクトリはありません
```

仕方がないのでrootになってインストールする。うまくいったっぽい。

```
$ sudo su -
# pythonbrew install --force 3.3.0
# pythonbrew switch 3.3.0
# python --version
Python 3.3.0
# which python
/usr/local/pythonbrew/pythons/Python-3.3.0/bin/python
```

# HelloWorld!!
では恒例のHelloWorldやってみる。以下のコードをhelloworld.pyという名前で保管する。

```py3:helloworld.py
print("Hello World")
```

実行する。ちゃんとHello Worldできた！！

````
# python helloworld.py 
HelloWorld!!
````

ちなみにpythonコマンドのみで実行すると、対話モードになり、以下のようにHelloWorldする事も可能。

```
# python
Python 3.3.0 (default, Jul  8 2013, 09:11:06) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-3)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> print("HelloWorld!!")
HelloWorld!!
```
コードをコメントアウトするときにちょっと工夫してみる

あんまし無秩序にタグをつけるのもどうかと思うのでJSとJavaとC++だけにしておきましたが`/* */`という形式のコメントが使える言語なら基本的に使える気がします。

さて、コードをコメントアウトするときは一行ずつちまちま`//`でコメントアウトするのも面倒なので、`/* */`で囲みます。例えば、こんなふうに。

```js:
// 文字列の中から一文字を探す関数
function search(s, c) {
//線形探索してた
/*
  var
  i = 0;
  for (i = 0; i < s.length; i++) {
    if (s.charAt(i) === c) return i;
  }
  return -1;
*/
//indexOfってメソッドがあるらしい
  return s.indexOf(c);
}
```

でも、コメントアウトした部分を復元したいこともあります（そもそもそのためにコメントアウトするんです）。

```js:
// 文字列の中から一文字を探す関数
function search(s, c) {
//線形探索する
  var
  i = 0;
  for (i = 0; i < s.length; i++) {
    if (s.charAt(i) === c) return i;
  }
  return -1;
//やっべこれ線形探索の課題じゃん！
/*
//indexOfってメソッドがあるらしい
  return s.indexOf(c);
*/
}
```

そうすると、前に付けた`/* */`を外して、さらに書き足した部分に`/* */`を付けなくてはいけません。まあ、これぐらいならコメントの対応がすぐに分かるのでそこまで面倒ではないのですけど、数百行近くあるコメントアウトだったりすると、スクロールする手間があってうんざりします。（さっさとリファクタリングしろ！）

そこで、こうやってコメントアウトしてみます。

```js:
// 文字列の中から一文字を探す関数
function search(s, c) {
//線形探索する
  var
  i = 0;
  for (i = 0; i < s.length; i++) {
    if (s.charAt(i) === c) return i;
  }
  return -1;
//課題出したあとは普通にindexOf使いたいなあ…
/*
//indexOfってメソッドがあるらしい
  return s.indexOf(c);
//*/ ← スラッシュが二つ！
}
```

さっきのコードとほとんど変わらないように見えますが、コードに示したように`indexOf`を呼ぶ部分のコメントの終わりのスラッシュが二つになっています。
こうすると、何が便利なんでしょうか？

```js:
// 文字列の中から一文字を探す関数
function search(s, c) {
//線形探索する
/*
  var
  i = 0;
  for (i = 0; i < s.length; i++) {
    if (s.charAt(i) === c) return i;
  }
  return -1;
//*/
//課題出したあとは普通にindexOf使いたいなあ…
↓ スラッシュを一つ追加するだけでおｋ
//*
//indexOfってメソッドがあるらしい
  return s.indexOf(c);
//*/
}
```

再び`indexOf`の方を使うようにしました。
やはりコード中で示してありますが、スラッシュを一つ追加するだけで、コメントアウトが解除されています。

これは`//*`というのが`//`から始まる一行コメントとして解釈されて、さらにコメントの終わりの部分も予め`//`で一行コメントとして解釈されるようにしておいたためです。

ちなみにRubyとかCなんかの文化では、コメントアウトしたい部分を必ず条件が`false`になるようにした`if`文（Cだとプリプロセッサ命令）で囲ったりすることもあるみたいです。

JavaScriptだとこんな感じ。

```js:
if (0) {
console.log('昔の処理');
}
console.log('今の処理');
```

シンタックスハイライトが無くて微妙です…。
Riak doc の Key and Objects を意訳してみた


# Key and Objects

大雑把な意訳、訳しにくい箇所は英文のまま転載します。
http://docs.basho.com/riak/1.3.2/references/appendices/concepts/Keys-and-Objects/

## Overview

RDBMS では、データは個々に識別できる実体であるテーブルによって構成されます。それらのテーブル内では、カラムで構成されたデータの列が存在します。それは、テーブル全体・個々の列やカラムに対する取得あるいは更新ができます。一方、Riak では Object という単純なデータモデルを持っています。Riak で取得あるいは更新を行なう場合は、Object 全体として取得あるいは更新する必要があります。Object を部分的に取得あるいは更新することはできません。

## Keys

Riak における Keys は、単純な binary values または strings で Object を識別するために使用されます。Riak と対話するクライアントから見ると、各 bucket は区別された keyspace を表すように見えます。fetch や store オペレーションを行なう場合に、Riak が bucket-key ペアをひとつの entity として扱うことを理解することが重要です。

## Objects

Object は Riak データストレージの唯一の単位です。Object は本質的に bucket と key によって識別される構造体で、bucket・key・vector clock・meta-data-value ペアのリストで構成されています。通常、Object はたったひとつの metadata-value ペアを持っています。しかし、それらがひとつより多い場合は、Object は "siblings" を持つといわれます。これらの "siblings" は単一ノードや複数ノードにまたがって発生するかもしれません。また "siblings" は、ひとつより多くのクライアントから Object を更新した場合や、ネットワーク分断が発生した場合や、古い Vector Clock で Object を更新した場合に発生します。

## End

特になし。
Riak doc の Buckets を意訳してみた


# Buckets

大雑把な意訳、訳しにくい箇所は英文のまま転載します。
http://docs.basho.com/riak/1.3.2/references/appendices/concepts/Buckets/

## Overview

bucket は仮想の keyspace を定義するためと、デフォルト値でない設定を定義するために使用されます。bucket は、テーブルやリレーショナルデータベースのフォルダやファイルシステムとそれぞれ比較されるかもしれません。Buckets with default configuration are essentially free, while non-default configuration will be gossiped around the ring.

## Configuration

各 bucket における多くの設定プロパティは、デフォルト値を無視して選択的に定義できます。

## n_val

Cluster 内に格納される各オブジェクトのコピー数を指定します。デフォルト値は Integer の 3 です。詳細は [Replication](http://docs.basho.com/riak/1.3.2/references/appendices/concepts/Replication/) を参照してください。

## allow_mult

sibling values を作成できるかどうかを決定します。デフォルト値は boolean の false です。詳細は [Siblings](http://docs.basho.com/riak/1.3.2/references/appendices/concepts/Vector-Clocks/#Siblings) を参照してください。

## last_write_wins

Object の書き込みで conflict した場合に、Object の Vector Clock をタイムスタンプとして使用するかどうかを決定します。デフォルト値は boolean の false です。詳細は [Conflict resolution](http://docs.basho.com/riak/1.3.2/references/appendices/concepts/#Conflict-resolution) を参照してください。

## r, pr, w, dw, pw, rw

オペレーションが成功すると考えられる前に、求められる読み書きのレスポンス数を決定します。各パラメータには String の all, quorum, one または Integer が設定でき、デフォルト値は quorum です。詳細は [Reading Data](http://docs.basho.com/riak/1.3.2/references/appendices/concepts/#Reading-Data) や [Writing and Updating Data](http://docs.basho.com/riak/1.3.2/references/appendices/concepts/#Writing%20and%20Updating%20Data) を参照してください。

## precommit

Object がコミットされる前に実行される関数 (Erlang あるいは Javascript) のリストを決定します。詳細は [Pre-Commit Hooks](http://docs.basho.com/riak/1.3.2/references/appendices/concepts/Commit-Hooks/#Pre-Commit-Hooks) を参照してください。

## postcommit

Object がコミットされた後に実行される関数 (Only Erlang) をリストを決定します。詳細は [Post-Commit Hooks](http://docs.basho.com/riak/1.3.2/references/appendices/concepts/Commit-Hooks/#Post-Commit-Hooks) を参照してください。

## backend

bucket のバックエンドストレージを決定します。詳細は [Planning for a Riak System](http://docs.basho.com/riak/1.3.2/tutorials/System-Planning/) を参照してください。

## Other

bucket プロパティに関する詳細な情報は [Configuration Files](http://docs.basho.com/riak/1.3.2/references/Configuration-Files/#default_bucket_props) や [HTTP Set Bucket Properties](http://docs.basho.com/riak/1.3.2/references/apis/http/HTTP-Set-Bucket-Properties/) や、あなたの Client Driver のドキュメントを参照してください。

## End

特になし。
[hylafax]コマンド備忘録

### 何のための記事？

hylafaxというfax送信用のミドルウェアの設定や操作のコマンドの備忘録
以前にfax送信機能の開発・運用担当をしていた際に情報が少なくハマったのでその時に調べたことをメモしています。

### 起動＆停止

起動

```bash
/etc/init.d/hylafax start
```

停止

```bash
/etc/init.d/hylafax stop
```

### 設定関連のコマンド
faxsetup（hylafaxの設定）

```bash
${PATH}/faxsetup
```

faxaddmodem（モデムの設定）

```bash
${PATH}/faxaddmodem
```

faxmodem（モデムをttyS*に認識させる？）

```bash
※ttyS0の場合
${PATH}/faxmodem ttyS0
```

### 設定や状態確認のためのコマンド
probemodem（回線接続の確認）

```bash
${PATH}/probemodem -f
```

### 送信ジョブに関する操作のコマンド
#### faxstat（送信ジョブ、hylafaxの起動状態の確認）

処理中のジョブ確認

```bash
${PATH}/faxstat -s
```

エラーとなったジョブ確認

```bash
${PATH}/faxstat -d | grep ' 0:'
```

直近100件のジョブ確認

```bash
${PATH}/faxstat -d | sort -n | tail -100
```

参考 :[faxstatのmanページ](http://linux.die.net/man/1/faxstat)


faxrm（送信ジョブの削除）

```bash
${PATH}/faxrm [ジョブID]
```
angular.js で $location.search を実行した時に画面が更新されるのを防ぐ。

$location.search で画面が更新されてしまうのがだいぶあれだったのでないわけないだろうと探したらやっぱりあった。
$routeProvider#when で reloadOnSearch に false を指定すればいいらしい。 http://docs.angularjs.org/api/ng.$routeProvider
このあたりのワードで検索するとよく出てくる locationChangeStart とか routeChangeStart あたりで調べててだいぶはまった。

```js:app.js
angular.module("myApp", [])
  .config(function($routeProvider) {
    $routeProvider
      .when("/", {
        templateUrl: "main.html",
        controller: "MainCtrl",
        reloadOnSearch: false
      });
  });
```

## サンプル
クエリパラメータに状態を保持しつつ画面遷移しない pagination 実装
http://plnkr.co/J6zUcoi7fxLnr4BuYxI8
ffmpeg で mp4 を mp3 に変換する

Mac で ffmpeg を使用して mp4  を  mp3 に変換する。

# 動作環境
 * Mac OS X 10.10
 * [homebrew](http://mxcl.github.com/homebrew/) 0.9.5
 * ffmpeg 2.6.2

# ffmpeg のインストール

```bash
brew install ffmpeg --with-tools
```

# mp4  を  mp3 に変換

```bash
cd [mp4があるディレクトリ]
find . -type f -name "*.mp4" -print0 | perl -pe 's/\.mp4\0/\0/g' | xargs -0 -I% ffmpeg -i %.mp4 -acodec libmp3lame -ab 256k %.mp3
```
Eclipse Android Project の jar ファイルにソースファイルを attachment 

Eclipse Android Project の jar ファイルにソースファイルを attachment する方法は、Android SDK の revison 毎によって異なる。

| revision | |
|:-----------|:------------|
|r17以前|attachment できる。Project Properties - Java Build Path から設定。|
|r18,r19|attachment できない。r18の libs/*.jar のファイルが自動的に Eclipse のBuild Pathに追加される新機能が原因|
|r20|attachment できる。詳細: <http://code.google.com/p/android/issues/detail?id=27490>|

## attachment 手順
Android SDK r20 以上で、 Eclipse Android Project の jar ファイルにソースファイルを attachment するには、
*.jar に対応した *.jar.properties にソースファイルjarファイルまたはソースファイルフォルダを定義する。

### 例
Eclipse Android Project の構成が下記とする。
* src (ソースディレクトリ)
* gen (自動生成ソースディレクトリ)
* libs (jarファイルを格納するディレクトリ)
* libs/android-support-v4.jar
* libs-sources  (jarファイルのソースjarを格納するディレクトリ)
* libs-sources/android-support-v4-sources.jar (android-support-v4.jarのソースjarファイル)

libs/android-support-v4.jar に対応した libs/android-support-v4.jar.properties を作成

libs/android-support-v4.jar.properties

```properties:
# src: relative or absolute path to the source folder (or archive)
src=../libs-sources/android-support-v4-sources.jar
# doc: relative or absolute path to the javadoc.
#doc=../xxx
```
Boxenをアップデートする方法

Boxenも定期的にアップデートしていかなければいけません。で、Boxenをアップデートしようと思って、Puppetfileで指定されているBoxenのバージョンだけを変更して `script/boxen` を実行してもおそらくエラーが発生します。

[boxen/our-boxen](https://github.com/boxen/our-boxen)をgit-pullでアップデートしてから `script/boxen` するのが正解。

# puppet-boxenとour-boxenのおさらい

簡単におさらいしておくと

repo | 役割
-------|-------
[boxen/puppet-boxen](https://github.com/boxen/puppet-boxen) | boxenのコアモジュール
[boxen/our-boxen](https://github.com/boxen/our-boxen) | boxenの容れ物

Puppetfileで指定しているのはコアモジュールの方のバージョンです。

容れ物のバージョン毎に対応しているコアのバージョンが微妙に異なっているっぽく、コアだけをバージョンアップしてもダメな訳です。コア自体はBoxenでバージョン管理されていますが、容れ物の方はgitで管理されています。

で、our-boxenのmasterは基本的に正しい組み合わせになっているので、our-boxenをアップデートして、そのときついてくるpuppet-boxenを使うと失敗が少ないです。

# our-boxenをアップデートする

ローカルにあるBoxenのリポジトリは本来our-boxenをgit-cloneして、masterをプライベートなリポジトリに向けていると思います。なので、まず最初に本家の[boxen/our-boxen](https://github.com/boxen/our-boxen)をremoteに設定してやりましょう。

```bash:本家のリポジトリをupstreamという名前で登録
% git remote add upstream git://github.com/boxen/our-boxen.git
# 設定できてるか確認
% git remote -v | grep upstream
upstream        git://github.com/boxen/our-boxen.git (fetch)
upstream        git://github.com/boxen/our-boxen.git (push)
```

そしたらupstreamからpullします。

```bash:本家の変更を取り込む
% git pull upstream master
```

コンフリクトが発生したらよしなに解消してください。これでour-boxenのアップデートが完了したので、必要に応じて設定を更新してから `script/boxen` を実行します。

```bash:Boxenを実行する
% ./script/boxen
```

成功したら忘れずにコミットして、originにgit-pushしておきましょう。

```bash:originへ変更をpushする
% git add -A
% git commit -m 'Update our-boxen'
% git push origin master
```
WicketでSessionの無効化と期限切れを判断する

表題について、javax.servlet.http.HttpSessionBindingListener を WebSession のサブクラスに implements してごにょごにょして判断してる身内のソースがあった。

それも一つの方法かもしれないけど、[Wicket の JavaDoc には Session クラスの onInvalidate() と isSessionInvalidated() だけで判断できそうに書いてあった](http://ci.apache.org/projects/wicket/apidocs/6.x/org/apache/wicket/Session.html)ので、試行。

```java:MySession.java
public class MySession extends WebSession {

	/* snip */

	@Override
	public void onInvalidate() {
		super.onInvalidate();
		if(isSessionInvalidated()) {
			// WebSession#invalidate() や Session#invalidateNow() を
			// 呼び出した際に実行される。
		} else {
			// Sessionの期限切れの際に実行される。			
		}
	}
}
```
実際に動かしてみると、うまく判断できている様に見える。
Scalaのソースコードを読んでみる　その２


字句解析と構文解析のあたりをいじりたいので、その辺のソースを探してみます。

srcディレクトリを見ると、２０個以上のディレクトリがあって迷います。
とりあえず、src/compiler/scalaディレクトリあたりが怪しいでしょうか…。
見てみましょう。

src/compiler/scalaには、

reflect
tools

という２つのディレクトリがありますね…。

reflectはリフレクション関係？
ということで、toolsディレクトリのほうを見ていきます。

ant
cmd
nsc
reflect
util

の５つのディレクトリが…って、またreflectあるし…。
この辺で書くのも飽きてきたので飛ばします。

src/compiler/scala/tools/nscに

Main.scala

という以下にも、ここが始まりですみたいなファイルがあるので、
ここから見ていきます。

Main.scalaを見ると、NSCというのは"new Scala compiler"の略みたいですね。なら、このディレクトリを中心にみていけば良さそうです。

```scala:Main.scala
class MainClass extends Driver with EvalLoop {
```
とか、

```scala:Main.scala
  override def doCompile(compiler: Global) {
```

という行を見ると、Driver, EvalLoop, Globalあたりのクラスが何やら関係ありそうです。
Globalなんか変数名が、compilerになってたりしますから、これがコンパイラ本体でしょうか…。

src/compiler/scala/tools/nsc/Global.scalaを見てみます。
なんか、でかいファイルですね。
とりあえず、これを理解していくしかなさそうです。

（つづく）
jQuery プラグイン書くときのスケルトン[最終版]

元々どこかで見つけたスケルトンからスタートして、自分なりに変更していった結果なのだけれども、jQuery プラグイン書き始めるときのスケルトンが落ち着いてきたのでメモっておきます。

###解説付き

```js:
(function($){
    // やっぱり $ で書くのが慣れているので。グローバルの $ は信用しちゃだめですよ。
    $.fn.myPlugin = function(options) {
        // プラグイン呼び出しの際に、オプション値をマップでもらう事を前提としています。
        // extend でデフォルト値に被せると「値がないかも」という心配が要らなくなります。
        options = $.extend({
            'name1': 'val1',
            'name2': 'val2'
        }, options);
        // 複数の要素が選択されている可能性があるので each で実装。
        // jQuery のマナー的に、自分自身を return するのを忘れてはいけません。
        return this.each(function(){
            console.log(this, options);
        });
        // 複雑なことをしないなら下記みたいな感じでも OK です。
        // プラグイン化したくなるような時は、シンプルにすまない時がほとんどですが…。
        return this.css(/* ... */).animate(/* ... */);
    }
})(jQuery);
```

###貼り付け用

```js:
(function($){
    $.fn.myPlugin = function(options) {
        options = $.extend({
        }, options);
        return this.each(function(){
        });
    }
})(jQuery);
```
Scalaのソースコードを読んでみる　その１


Scalaの文法に手をいれたくなったので、とりあえず、ソースコードを読んでみようと思った。

# ソースコードをダウンロードする

まずは、ソースをダウンロードします。
コマンドは以下。

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

# コンパイル

試しにコンパイルしてみましょう。
sbtを使うのかなぁ、となんとなく思っていたら、そんなことはなくて、antを使うようです。
コマンドは以下。

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

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

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

build/pack/bin

にあります。

（つづく）
JSで簡単なテンプレートファイルを作る時のメモ

```html:
<script type="text/template" id="hogeTemplate">
    <div id="hoge">
        <a href="%s">%s</a>
    </div>
</script>
```

```js:
var sprintf = function(text) {
    var i = 1, args = arguments;
    return text.replace(/%s/g, function() {
        return (i < args.length) ? args[i++] : '';
    });
};

var template = sprintf($('#hogeTemplate').text(), url, text);
$('body').append(template);
```
イベント早見表

## イベントの設定可否

#### 予想以上にサイズが広がったので後でサイズを変更する。

| EventName | Description | window | a  | area | labe | input | select | textarea | button | form | object | embet | image | body | frameset | frame | iframe |
|:----------|:------------|:------:|:--:|:----:|:----:|:-----:|:------:|:--------:|:------:|:----:|:------:|:-----:|:-----:|:----:|:--------:|:-----:|:------:|
| touchstart | タッチ（接） * phone | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ |
| touchend   | タッチ（離） * phone | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ |
| click      | マウス押下           | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ |
| mousedown  | マウス押下（接）     | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ |
| mouseup    | マウス押下（離）     | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ |
| mouseover  | マウス（接）         | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ |
| mousemove  | マウス（移）         | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ |
| mouseout   | マウス（離）         | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ | △ |
| keydown    | キー押下（接）       | ○ | × | × | × | ○ | ○ | ○ | × | × | × | × | × | × | × | × | × |
| keyup      | キー押下（離）       | ○ | × | × | × | ○ | ○ | ○ | × | × | × | × | × | × | × | × | × |
| load       | ページイン           | × | × | × | × | × | × | × | × | × | ○ | ○ | ○ | ○ | ○ | ○ | ○ |
| unload     | ページアウト         | × | × | × | × | × | × | × | × | × | × | × | × | ○ | ○ | ○ | ○ |
| abort      | 読み込み中断         | × | × | × | × | × | × | × | × | × | ○ | ○ | ○ | × | × | × | × |
| error      | 読み込みエラー       | × | × | × | × | × | × | × | × | × | ○ | ○ | ○ | ○ | ○ | ○ | ○ |
| select     | 選択項目・選択       | × | ○ | ○ | ○ | ○ | ○ | ○ | ○ | × | × | × | × | × | × | × | × |
| change     | 入力項目・変更       | × | ○ | ○ | ○ | ○ | ○ | ○ | ○ | × | × | × | × | × | × | × | × |
| submit     | サブミット 押下      | × | × | × | × | × | × | × | × | ○ | × | × | × | × | × | × | × |
| reset      | リセットボタン押下   | × | × | × | × | × | × | × | × | ○ | × | × | × | × | × | × | × |
| focus      | フォーカス           | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | × | × | × | × | × | × | × | × |
| blur       | アウトフォーカス     | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | × | × | × | × | × | × | × | × |
| resize     | リサイズ             | ○ | × | × | × | × | × | × | × | × | × | × | × | × | × | × | × |
| scroll     | スクロール           | ○ | × | × | × | × | × | × | × | × | × | × | × | × | × | × | × |

### 記号

| 記号 | 備考 |
|:---:|:---|
| ○ | 使える|
| △ | 使える(制限あり）|
| × | 基本使えない
CoffeeScriptのfor文の注意点


CoffeeScriptで

```
for i in [0..n-1]

for j in [i+1..n-1]
```


って書くとこうコンパイルされる

    for (i = _s = 0, _ref11 = n - 1; 0 <= _ref11 ? _s <= _ref11 : _s >= _ref11; i = 0 <= _ref11 ? ++_s : —_s) {

      for (j = _t = _ref12 = i + 1, _ref13 = n - 1; _ref12 <= _ref13 ? _t <= _ref13 : _t >= _ref13; j = _ref12 <= _ref13 ? ++_t : —_t) {


そして

RangeError: Maximum call stack size exceeded


が出てしまった。

けどjsで普通に


    for (i = 0; i < n; i++ ){

      for ( j = i+1; j < n; j++ ){

書くと問題ない件。なにこれ？


# coffeeのfor文がおかしい訳じゃない。
これの原因は、


for i in [0..n-1]

for j in [i+1..n-1]

の
## [i+1..n-1]←これは右から左だけでなく、右から左にも動いていた！

つまり、
「i+1→n-1」の向き
「i+1←n-1」の向き
両方あったってこと！


途中まで→で動いてたのが
途中から←方向にループ回りだしてバグった。


if文で「i+1→n-1」の向きだけ通すようにしてやれば正常にうごく。

```
for i in [0..n-1]
	for j in [i+1..n-1]`
		if i+1 <= n-1
```
【Unity】【NGUI】2D Sprite画像1枚で手動で位置座標を入れてみたメモ

今回はウェブでたくさん存在している2D Sprite画像(絵1-1)ようなアニメーション画像を
NGUIで読み込ませてみます。

![t.png](https://qiita-image-store.s3.amazonaws.com/0/18411/5f973de1-3c6e-d37d-91c2-be21ebbc12a1.png)
(絵1-1)


#背景
ここで問題はそもそも画像が分かれている場合はNGUIのAtlas Makerで作ればいいんですけど
既に作られている場合は画像と画像の間隔座標(NGUIのDimensions)を手動で作ることになります。(もし自動や手軽にできる方法があれば教えてください)

#下準備
Unity4
NGUI(ここでは最新の2.6.3を使う)
Windows
2D Sprite画像(絵1-1)をタウンロード

#手順
### Atlasを作る
1. 「GameObejct」->「Create Empty」(Ctrl + Shift + N)で空オブジェクトを作る
2. 上の空オブジェクトに「Component」->「NGUI」->「UI」->「Atas」を選択(絵2-1)
![3.png](https://qiita-image-store.s3.amazonaws.com/0/18411/9736269a-c797-62fa-e4df-147e3d636156.png)
(絵2-1)
3. Project Viewにドラック&ドロップしてプレハブ化する
### Materialを作る
1. Project Viewでマウス右クリックして「Create」-> 「Material」をクリック
2. Materialの四角に2D Sprite画像(絵1-1)をドラック&ドロップする
3. Shaderは「Unit/Transparent Colored」を選択

### AtlasにMaterialを結びつける
1. AtlasにMaterialをドラック&ドロップする

### TP Import
予め用意した2D Sprite画像の場合は手動で画像の位置座標を指定する必要があります。
例の2D Sprite画像(絵2-1)は画像の開始位置が「4,4」で広さと高さが「33,43」です。

1. テキストエディタを開き、以下のように書く
{
	"frames": {

		"1.png":
		{
			"frame": {"x":4,"y":4,"w":33,"h":43},
			"rotated": false,
			"trimmed": false,
			"spriteSourceSize": {"x":0,"y":0,"w":33,"h":43},
			"sourceSize": {"w":33,"h":43}
		}
		"2.png":
		{
			"frame": {"x":4,"y":48,"w":33,"h":43},
			"rotated": false,
			"trimmed": false,
			"spriteSourceSize": {"x":0,"y":0,"w":33,"h":43},
			"sourceSize": {"w":33,"h":43}
		}
	}
}
1.pngや2.pngは任意でも構いません。
frameは開始座標"x":4,"y":4 広さと高さ"w":33,"h":43です。
spriteSourceSizeはframeと同じだから{"x":0,"y":0,"w":33,"h":43}
sourceSizeもframeと同じだから {"w":33,"h":43}
2. 上記のテキストファイルの拡張子をtxtで保存
3. テキストファイルをAtlasのTP Importにドラック&ドロップする
![4.png](https://qiita-image-store.s3.amazonaws.com/0/18411/f5ee0e97-0ab9-b8b1-598b-bc85db6ffc40.png)

###確認
1. 「NGUI」-> 「Open The UI Wizard」-> 「Create UI」を指定
2. Hierarchy Viewの「Panel」を選択し、「NGUI」-> 「Create a Sprite」を選択
3. UISpriteのAtlasに作ったAtlasをドラック&ドロップする
4. UISpriteのSpriteを選択し、1を選択すると絵3-1のようになる
![5.png](https://qiita-image-store.s3.amazonaws.com/0/18411/29ebeb3a-2dbe-d008-6570-c35597a9b6d6.png)
(絵3-1)
mingw な ruby2.0 を cygwin 上でビルドする

# 事前準備

* apt-cyg は入れておく
 * http://takuya-1st.hatenablog.jp/entry/20110205/1296887435
* あまり関係ないが Windows 8 64bit 版 と cygwin 1.7 の組み合わせにはよろしくない問題がある様子。ハマった
 * export LANG=C で治るらしい
 * http://embedded-memo.blogspot.com/2013/03/windows8-64bit-cygwin.html

# 作業内容

```shell-session:
# 必要パッケージのインストール
apt-cyg install gcc-mingw gcc-mingw-g++ make

# 作業用ディレクトリを作成
mkdir ~/ruby-build
cd ~/ruby-build

# ソースを取得
# URL は好きなバージョンのソースで置き換える
# http://www.ruby-lang.org/ja/downloads/
wget ftp://ftp.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-p247.tar.bz2
tar vjxf ruby-2.0.0-p247.tar.bz2
cd ruby-2.0.0-p247

# configure
# ruby における target と host の違いがよくわかっていない。
# prefix に cygwin 形式のパスを指定してしまったけど、ここは Windows 形式のパスを
# 指定しなければならないようだ。 make install で C 直下に usr ができてしまった。
# 実行時にもライブラリのロード先などで影響がありそうなものだが、target が mingw のときは
# ライブラリが実行ファイルからの相対パスで読み込まれるらしく、C 直下から移動しても
# 問題なく動いているように見える。
./configure --target=i686-pc-mingw32 --host=i686-pc-mingw32 --enable-shared --prefix=/usr/local/i686-pc-mingw CC=i686-pc-mingw32-gcc.exe CXX=i686-pc-mingw32-g++.exe

# Windows 8 64bit + Cygwin 1.7 のバグ回避
export LANG=C 

# make
make
make install