OmniAICreator/Qiita-1.07M huggingface dataset:
AndroidのViewPager.PageTransformerでスライドアニメーションを作る


support-v4ライブラリの`ViewPager.PageTransformer`を使うと、ViewPagerをスワイプしたときのアニメーションをカスタマイズできます。
新しいものではありませんが、最近試したのでメモしておきます。

以下のトレーニングに詳しく書いてありますが、実際に実装してみた結果から、ポイントだけに絞りサンプルを交えて書いてみます。
[Using ViewPager for Screen Slides](http://developer.android.com/training/animation/screen-slide.html)

## 作り方

1. `ViewPager.PageTransformer`を実装したクラスを作る
1. `transformPage`メソッドを実装する
1. 作ったクラスを`ViewPager#setPageTransformer()`で設定する

これだけです。

一つずつ、もう少し詳しく書きます。
例えば、スワイプするとフェードイン＆アウトして切り替わるアニメーションを作る場合です。

### ViewPager.PageTransformerを実装したクラスを作る

これは詳しく書くまでもないですが、ViewPager.PageTransformerをimplementsしたクラスを作ります。

```java:FadePageTransformer.java
public class FadePageTransformer implements ViewPager.PageTransformer {
```

### transformPageメソッドを実装する

メソッドのシグニチャは以下です。

```java
public void transformPage(View page, float position)
```

Viewがある位置(position)に表示されているときにどのような変化を加えるか？という感じで`setAlpha`や`setTranslationX`などで状態を変えていきます。
ここが工夫のしどころです。
positionは以下のように-1から1の間で相対的な位置を示しています。

| position | Viewの状態 |
|:--:+--------------------|
| -1 | 完全に左端に消えている |
| 0 | ちょうど中央に表示されている |
| 1 | 完全に右端に消えている |

このpositionによってViewを移動させたくない場合は、以下のようにpositionとViewの幅を使って逆向きに移動させます。

```java
int pageWidth = page.getWidth();
page.setTranslationX(pageWidth * -position);
```

一例ですが、フェードの場合は以下のようになります。

```java:FadePageTransformer.java
@Override
public void transformPage(View page, float position) {
    float alpha = 0;
    int pageWidth = page.getWidth();
    if (-1 < position && position < 0) {
        // 左にスワイプしていくにつれ透明にする
        alpha = position + 1;
    } else if (0 <= position && position <= 1) {
        // 右にスワイプしていくにつれ透明にする
        alpha = 1 - position;
    }
    page.setAlpha(alpha);
    // 逆方向に移動させることで位置を固定する
    page.setTranslationX(pageWidth * -position);
}
```

### 作ったクラスをViewPager#setPageTransformer()で設定する

以下のようにViewPagerに新しいインスタンスを設定するだけです。

```java
private ViewPager mPager;
:
mPager.setPageTransformer(false, new FadePageTransformer());
```

フェードなので分かりにくいですが、以下のようにスワイプ中は2枚のページが薄く重なって表示されます。

![device-2014-07-01-003308.png](https://qiita-image-store.s3.amazonaws.com/0/29368/077ae32d-c479-4df7-b481-302f8d1bd29c.png "device-2014-07-01-003308.png")


#### setPageTransformerの補足

第1引数が少し分かりにくいですが、後ろのページから順に描画させたい場合にtrueを指定します。

例えば以下のように1ページ目が2ページ目の上に重なって描画されるような遷移にしたい場合、第1引数にtrueを設定しておかないと2ページ目の方が上に描画されてしまいます。

![device-2014-07-01-001437.png](https://qiita-image-store.s3.amazonaws.com/0/29368/a237a3a6-ce77-facc-c799-8e2e5936d58b.png "device-2014-07-01-001437.png")

逆に、以下のように先頭のページから順に描画される必要のある場合はfalseを指定します。

![device-2014-07-01-001610.png](https://qiita-image-store.s3.amazonaws.com/0/29368/7be7151a-bbab-cdc4-a897-a6bf14f5002d.png "device-2014-07-01-001610.png")
Bridgeのお気に入りを変更する

```applescript:AddFavorites2Bridge.scpt
(*
	Bridgeのお気に入りを変更します。フォルダを指定すると第一階層までの内包するフォルダを追加したり、全クリアした上で上書きします。Bridgeにはファイルも追加できますが、フォルダのみ追加します。
*)

set myFlag to the button returned of (display dialog "Bridgeのお気に入りを変更します" buttons {"上書き", "追加", "キャンセル"} default button 3 with icon 2)
set myFolder to choose folder with prompt "追加フォルダのある場所を指定"
set myPath to (path to temporary items as text) & "AddFavorites2BridgeTemp.jsx"
tell application "Finder"
	set myList to every item of myFolder
	try
		set the myFile to open for access file myPath with write permission
		set eof file myPath to 0
		repeat with i in myList
			if class of i is alias file then set i to original item of i
			if class of i is folder then
				set i to i as Unicode text
				set i to ¬
					"myTmb=new Thumbnail(" & ¬
					(quoted form of POSIX path of i) ¬
						& ");app.favorites.insert(myTmb);"
				write i as «class utf8» to the myFile starting at eof
			end if
		end repeat
	end try
	close access file myPath
end tell
tell application "Adobe Bridge CC"
	activate
	if myFlag = "上書き" then do javascript "app.favorites.clearAll();"
	do javascript "#include " & (POSIX path of myPath)
end tell
```

仕事フォルダを登録してFavoriteパネルを弾力的に使ってみるとか。
【CakePHP】コンソールから実行

コンソールからCakeを実行する方法。例えばcronで使う。

##コンソールから実行されるクラス作成
app/Console/Command/直下に、AppShellを継承したクラスを作成する。

```php:コンソールから実行されるクラス
class HogeShell extends AppShell{
    //使用するモデル
    public $uses = ['Hoge']; 

    //AppShellでウェルカムメッセージの表示を行っている。オーバライすると抑止される。
    //初期化に使うのもあり。
    function startup(){
        parent::startup();
    }

    //呼び出しの際にメソッドの指定がなければmain()が呼ばれる。コントローラのindex()と同じ。
    function main(){
         // モデルを使用できる
         $hoge = $this->Hoge->find('all');
    } 

    function hogeMethod() { 
        $arg0 = $this -> args[0]; // コマンドで渡した引数は $this -> args に配列でセットされている。
    }

    /** このようなパラメータの渡し方は出来ない
    function myInvalidMethod( $arg ) {
    }
    */
}
```

##コンソールから実行

```php:コンソールから実行
app/Console/cake.php クラス名(shellを除いたもの) メソッド名(省略すればmain) パラメータ(複数渡せる)
```
Builderパターン

コンストラクタを分割したメソッドを持つクラスのことを「Builder」
Builderクラスのメソッドを生成手順に沿って呼び出すクラスを「Director」

```rb

class Human
  attr_accessor :race, :country
end

class HumanBuilder
  def initialize
    @human = Human.new
  end
  def add_rage(race)
    @human.race = race
  end
  def add_country(country)
    @human.country = country
  end
  def instance
    @human
  end
end

class JapaneseDirector
  def self.create(builder)
    builder.add_race('asian')
    builder.add_country('japan')
    builder.instance
  end
end

builder = HumanBuilder.new
japanese = JapaneseDirector.create(builder)
```
support.v4のActionProviderを使ってActionBarにサブメニューを追加したい


サブメニューが表示されなかったりしてハマったのでメモ。

### Activityの書き方

```java:YourActivity.java
public class YourActivity extends ActionBarActivity {

	/* hogehoge */

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        MenuItemCompat.setActionProvider(menu.findItem(R.id.awesome_item), new YourActionProvider(this));
        return super.onCreateOptionsMenu(menu);
    }

	/* hogehoge */
}
```

Activityの`onCreateOptionsMenu`でメニューアイテムの初期化を行う。
MenuItemCompatを使って指定したアイテムにActionProviderを割り当てます。

### menuのXMLファイルの書き方

次に`R.menu.main`の内容をみてみます

```xml:main.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".MainActivity">
    <item
        android:id="@+id/awesome_item"
        android:icon="@android:drawable/ic_menu_camera"
        app:showAsAction="ifRoom"
        android:title="@android:string/cancel"
        app:actionProviderClass="com.stenpel.awesome.app.common.CameraActionProvider" />
</menu>
```

menuの中にitemがひとつだけあります。
YourActivityでActionProviderを割り当てられている、R.id.awesome_itemですね。
showAsAction,actionProviderClassは`android`ではなく独自に定義した`app`を指定します。`app`の部分は好きな文字列でOKです。

### 独自拡張したActionProviderの書き方

次は独自のActionProviderを書きます


```java:YourActionProvider.java
public class CameraActionProvider extends android.support.v4.view.ActionProvider {

    /**
     * Creates a new instance.
     *
     * @param context Context for accessing resources.
     */
    public CameraActionProvider(Context context) {
        super(context);
    }

    @Override
    public View onCreateActionView() {
        return null;
    }

    @Override
    public boolean hasSubMenu() {
        return true;
    }

    @Override
    public void onPrepareSubMenu(SubMenu subMenu) {
        subMenu.clear();
        MenuInflater inflater = new MenuInflater(getContext());
        inflater.inflate(R.menu.awesome_provider_menu, subMenu);
    }
}
```

ActionProviderでは表示したいサブメニューを初期化を担当します。
初期化するメソッドが`onPrepareSubMenu`です。
この中で`R.menu.awesome_provider_menu`というxmlを実体化しています。
ちなみに、このonPrepareSubMenuはMenuItemが選択されるたびに呼び出されるため`subMenu.clear()`でサブメニューを一旦すべて消しています。これをやっておかないとMenuItemを選択されるたびにサブメニューアイテムが重複して追加されていってしまいます。

### サブメニューのXMLファイルの書き方

最後に、サブメニュー一覧用のXMLを書きます。

```xml:awesom_provider_menu.xml
<?xml version="1.0" encoding="utf-8"?>

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/awesome_provider_sub_menu_1"
        android:title="@string/awesome_text_1"
        android:icon="@android:drawable/ic_menu_camera" />
    <item
        android:id="@+id/awesome_provider_sub_menu_2"
        android:title="@string/awesome_text_2"
        android:icon="@android:drawable/ic_menu_compass" />
</menu>
```

ここは特に変わったところはない感じです。menuとitemを入れ子にして定義すればOKです。

動いてよかった。
[Swift] 地味によく使う設定値の保存、取得をしてみる（NSUserDefaultsの利用）


# 何をしたか

設定値の保存、取り出し、削除を行います。NSUserDefaultsを使っています。
アプリを終了させても設定した値は活きています。
Configファイルへの書き込み、取り出しのイメージです。

スマートかどうかわかりませんが、画面間のデータ受け渡しに使えます。

# ソース

```swift

    init(){
        
        // 設定値の保存 キーは"keyName"、値は"value"としました。
        let config = NSUserDefaults.standardUserDefaults()
        config.setObject("value",forKey:"keyName")
        config.synchronize() // シンクロを入れないとうまく動作しないときがあります
        
        // 設定値の取得
        let result : AnyObject! = config.objectForKey("keyName")
        println(result)
        var test:String = result as NSString // AnyObjectからString型にダウンキャストするときは as NSString

        // 存在しないキーはnilが返る
        let result2 : AnyObject! = config.objectForKey("hoge")
        println(result2)
        
        // 設定値すべてを取得　※ システムで用意された設定値も出力されます
        var dictionary : NSDictionary =  config.dictionaryRepresentation()
        println(dictionary)
        
        // 設定値"keyName"の削除
        config.removeObjectForKey("keyName")

        // ちゃんと"keyName"が削除されたことを確認
        var dictionary2 : NSDictionary =  config.dictionaryRepresentation()
        println(dictionary2)

    }

```

# 感想

Swiftになってもメソッド名が長いのは変わらないです。
個人的にはConfigクラスを作ってラッパーしちゃいたい。
とりあえず、rubyでheroku

# 私の環境
 * macbook air
 * vagrant(centos 6.9)
 * 2018/4/30

# herokuに登録
公式ページ
[Heroku](https://www.heroku.com/)

大体普通に進めた通り
# 事前準備
・gitがいるらしい(省略)
・herokuのコマンドを使える必要があるらしい
　([heroku toolbelt](https://toolbelt.heroku.com/))

ドキュメントを参考に、centosだったので以下で入れました。

```
curl https://cli-assets.heroku.com/install-standalone.sh | sh
```

すると数秒にてインストールできました

```
# heroku --version
heroku/7.0.17 linux-x64 node-v10.0.0
```

OSによっていろいろあるようです
![スクリーンショット 2018-04-30 1.52.02.png](https://qiita-image-store.s3.amazonaws.com/0/37393/cec8ae00-632f-e730-1f3a-95f2308d42c8.png)


# デプロイなど

```lang:web.rb
require 'sinatra'
 
get '/' do
  "Hello, world"
end      
```
ソースは何でもいいと思います。buildpackというのはよくわかりません

# 結果
これだけでhello world。

![スクリーンショット 2014-06-30 23.14.18.png](https://qiita-image-store.s3.amazonaws.com/0/37393/dea93e38-60da-86c3-a1e4-c49c633203e0.png)

# 復習
1.ユーザ登録
　サービスを使うために、ユーザ登録が必要。

2.heroku create
　herokuのコマンドが提供されています。createでプロジェクトというかアプリを作成します(create [APP_NAME])。何も付けなかったので、「serene-sierra-8594」など付けられました。

3.git cloneなりコード作成
　つまり、あるものを取ってくる。ここでは、サンプルを取得しているのでしょう。

4.git push heroku master
　サンプルを取ってきて、heroku側でcreateしたものにdeployしました。

5.heroku open
二番目に簡単な rstan コード

Kosugitti 先生の[世界一簡単なrstanコード](http://kosugitti.net/archives/4823)に触発されて、
二番目に簡単な rstan コードを書いてみました。

```r
library(rstan) 

N <- 1000
x <- rnorm(N, mean = 50, sd = 10)
y <- 10 + 0.8 * x + rnorm(N, mean =0, sd = 7)

stancode <- '
  data{
    int<lower=0> N;
    real x[N];
    real y[N];
  }
  parameters {
    real alpha;
    real beta;
    real<lower=0> s;
  }
  model{
    for(i in 1:N)
      y[i] ~ normal(alpha + beta * x[i], s);
    alpha ~ normal(0, 100);
    beta ~ normal(0, 100);
    s ~ inv_gamma(0.001, 0.001);
  }
'
datastan <- list(N=N, x=x, y=y)
fit <- stan(model_code=stancode, data=datastan, iter=1000, chain=4)
traceplot(fit, ask=T)
print(fit, digit=2)
```

![Rplot01.png](https://qiita-image-store.s3.amazonaws.com/0/2570/dfec861b-f5d9-8ab0-e714-b7db8480cb0b.png)

```:結果
          mean se_mean   sd     2.5%      25%      50%      75%    97.5% n_eff Rhat
alpha    11.60    0.06 1.11     9.29    10.90    11.60    12.33    13.73   396 1.01
beta      0.77    0.00 0.02     0.73     0.76     0.77     0.79     0.82   404 1.01
s         7.01    0.01 0.15     6.71     6.90     7.01     7.10     7.32   438 1.00
lp__  -2447.58    0.06 1.26 -2450.88 -2448.09 -2447.25 -2446.70 -2446.22   451 1.00
```

alpha の推定がうまくいってないような気がするんですが。。。


ご査収ください。

関連記事：
[Stan で相関係数を推定する](http://qiita.com/hoxo_m/items/0f1b05681f5d6c4b560a)
[Stan で increment_log_prob()](http://qiita.com/hoxo_m/items/56a63faf29e1af4db27d)
画像を返すアプリケーションのキャッシュをNginxで取る際の注意

画像を返すルーティングを持つアプリケーションで URL が画像に対して一意に決まるなら Nginx 側でキャッシュを取ってアプリケーションの負荷を下げたいと考えると思います

そしてそのような画像を返すなら `expires` を付けてユーザーのブラウザにもキャッシュさせたいところ

ブラウザは HTTP のレスポンスヘッダーに `Last-Modified` や `Expires` や `Cache-Control` などを付けるとブラウザは次回のリクエストでは `If-Modified-Since` を付けてくれます
そこで Nginx は `Last-Modified` が `If-Modified-Since` と同じかそれより昔ならステータスコード 304 番を返すのでブラウザは手元のキャッシュを表示することでコンテンツ自体をダウンロードする必要がなくなります

しかしよく考えれば当然ですが，Nginx が `Last-Modified` の時間を把握していなければ Nginx がステータスコード 304 を返せばよいのか 200 を返せばよいのか判断できません

Nginx が画像ファイル自体を配布する際はファイルのタイムスタンプから判断ができますが，動的に画像を生成するアプリケーションの場合は `Last-Modified` をアプリケーション側で付けてあげないと Nginx が判断できず常に 200 を返すようになってしまいます

また Nginx 自体がキャッシュを持っていますのでアプリケーションを変更した際は必ずキャッシュを消しましょう

と，この件で何時間も悩んだのでメモ書きでした
VirtualBox 用 Ubuntu 14.04 LTS 日本語デスクトップ イメージ

関連ページ
=========

* 最新 LTS：[16.04 LTS "Xenial Xerus" 版](http://qiita.com/yuki-takei/items/056e1184680f572d4c3d)


参考
====
https://www.virtualbox.org/ticket/12941

動機
====

Unity 3D supported な trusty64 のデスクトップを
パッと作れたらいいなと思って。

利用手順
=======

```shell:Shell
$ vagrant init yuki-takei/ubuntu-trusty64-ja
```

作成された Vagrantfile の、``config.vm.provider "virtualbox" do |vb|`` の部分を以下のように変更

```Vagrantfile
  config.vm.provider "virtualbox" do |vb|
    vb.gui = true
  
    # Use VBoxManage to customize the VM. For example to change memory:
    vb.customize ["modifyvm", :id, "--memory", "2048"]
    vb.customize ["modifyvm", :id, "--vram", "128"]
    vb.customize ["modifyvm", :id, "--accelerate3d", "on"]
  end
```

因みに Vagrant Enterprise のページはこちら。
https://atlas.hashicorp.com/yuki-takei/boxes/ubuntu-trusty64-ja


メモ
====

シャットダウン時にVMウィンドウが閉じず異常終了するっていう症状が
base box 作成時にあったからわざわざ Vagrant Cloud のページにもそう書いたのに、
今スクリーンショット撮ろうかと思ってやってみたら正常終了するよ。どういうこと。。
MacにNode.jsをインストールする


環境：Mac OS X Version 10.9.3

Node.jsは[Node.js日本ユーザーグループ](http://nodejs.jp/)はからダウンロードしてインストールできる。
ただ、Node.jsはバージョンアップが早いので[NVM(Node Version Manager)](https://github.com/creationix/nvm)を使用してNode.jsのバージョン管理を行うことがおススメ。

## 1.nvmをインストールする

GitHubのnvmリポジトリを見ると、インストール方法は２通りある。
1.Install Script
2.Manual Install

今回はInstall Scriptを使用したインストールを選択。

```bash
$ curl https://raw.githubusercontent.com/creationix/nvm/v0.10.0/install.sh | sh
```

or

```bash
$ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.10.0/install.sh | sh
```
を実行する。

```bash
$ curl https://raw.githubusercontent.com/creationix/nvm/v0.10.0/install.sh | sh
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  3047  100  3047    0     0   4760      0 --:--:-- --:--:-- --:--:--  4753
=> Downloading nvm from git to '/Users/username/.nvm'
=> Cloning into '/Users/username/.nvm'...
remote: Counting objects: 1541, done.
remote: Compressing objects: 100% (762/762), done.
remote: Total 1541 (delta 789), reused 1502 (delta 762)
Receiving objects: 100% (1541/1541), 281.79 KiB | 158.00 KiB/s, done.
Resolving deltas: 100% (789/789), done.
Checking connectivity... done.

=> Profile not found. Tried ~/.bash_profile ~/.zshrc and ~/.profile.
=> Create one of them and run this script again
   OR
=> Append the following lines to the correct file yourself:

export NVM_DIR="/Users/username/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"  # This loads nvm
=> Close and reopen your terminal to start using nvm
```

~/.nvmディレクトリが作成されます。

このままではnvmコマンドを実行しても、command not foundになるので、.bash_profileを作成し次の記述を追加する。

```bash
$ vi .bash_profile
```

```bash:.bash_profile
# nvm設定
[[ -s ~/.nvm/nvm.sh ]] && . ~/.nvm/nvm.sh
nvm use default
npm_dir=${NVM_PATH}_modules
export NODE_PATH=$npm_dir
```

更新を反映させるために、一旦シェルを抜けるか、次のコマンドを入力して、設定を反映させる

```bash
$ source ~/.bash_profile
N/A version is not installed yet
```

「N/A version is not installed yet」と表示されるが、これはまだデフォルトで使用するNode.jsが設定されていないだけなので、とりあえず無視。

気になるのであれば、先に下のコマンドを実行しておく。


```bash
$ nvm alias default v0.10.12
```

nvmが使えるか確認する。

```bash
$ nvm --version
0.10.0
```

## 2.Node.jsをインストールする

インストール可能なNode.jsのバージョンを確認する。

```bash
$ nvm ls-remote
     v0.1.14
     v0.1.15
     v0.1.16
:
:
    v0.11.12
    v0.11.13
```

今回は最新のv0.11.13をインストールする。

```bash
$ nvm install v0.11.13
######################################################################## 100.0%
Now using node v0.11.13
```

## 3.Node.jsを実行する

```bash
$ nvm use v0.11.13
Now using node v0.11.13
```
kobitoのインストールとDropboxによる同期


## 1.インストール
1. [kobito](http://kobito.qiita.com/?utm_source=qiita&utm_medium=top)をダウンロードする。
2. 解凍して実行。

## 2.Dropboxへの設定
[KobitoをDropboxで共有するためのMakefile]
(http://qiita.com/suin/items/b967cc19f1fdfd37c4df)を参考にしました。

次の内容が記載してあります。

1. Kobitoの終了
2. データをDropboxにコピー
3. Dropboxにコピーしたファイルにシンボリックリンクの設定

これで終了。

## 3.注意点
次の点が注意点として上がっていた。

* Kobitoの起動は一つずつ。同期している端末間で、同時にKobitoを起動させない。
* Dropboxの同期は自己責任で実施する。  
 * Kobitoの仕様変更によって、データ消失や同期の失敗があるかもしれない。
Windows7でVagrantの環境整備

[その1](http://qiita.com/rana_kualu/items/2028ab6575d43850dc7a) / [その2](http://qiita.com/rana_kualu/items/c3b19bac6991958d6382) / [その3](http://qiita.com/rana_kualu/items/51a7db79ff5891c8a69f)

## X Windowをインストール

ウィンドウが1枚しかないと不便なのでX Windowをインストールする。

http://qiita.com/snaka/items/4fc6f83022e01daea58a

```
$ sudo yum groupinstall -y "Desktop" "Desktop Platform" "X Window System" "Fonts" "Japanese Support"
$ sudo yum install vnc-server
```

"が『：』のキーに割り振られてて、:が『Shift+;』になってて超使いにくい。
keyconfigでは何故か直せなかった。

```
> vagrant reload
$ startx
```

無事GUIが起動した。
この後System→Preferences→Keyboardでキーボードを直すことができた。

## ApacheとPHPをインストール

```
$ sudo yum -y install httpd
$ sudo yum -y groupinstall "PHP support"
$ sudo service httpd start
```

何の問題もなくインストール完了。

## iptables

80番ポートが塞がれているので許可する。

```
$ sudo vi /etc/sysconfig/iptables
```

```
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
```

2行を追加。
iptablesとApacheを再起動。Apacheはいらないかも。

```
$ sudo service iptables restart
$ sudo service httpd restart
```

http://192.168.33.10/
でApacheにアクセス成功。
何故デフォルトが33.10かは不明。

## 自動起動設定

X WindowやApacheを自動起動するようにしておく。

```
$ sudo chkconfig httpd on
$ sudo vi /etc/inittab
```

id:3となってるところをid:5に変更。
再起動。
自動的にX Windowが起動し、192.168.33.10にアクセスできることを確認。

## OSの更新

X Windowの右上あたりにある星みたいなマークをクリックするとアップデート情報が表示される。
30件出てきたが、よくわからないのでとりあえず全てInstall Updateしておいた。
まあ古いよりは新しい方がいいだろう。

## VirtureBox Guest Additionsをインストール

現時点ではクリップボードやドラッグドロップを双方向にしてもコピペができない。
不便なのでどうにかする。
ホストOS(Windows側)のVirtualBoxの「デバイス」→「Guest AdditionsのCDイメージ挿入」
ゲストOSでCDが自動起動するのでインストール。
『4.3.12』だった。
何もせずともインストール完了。

なんか
`Removing installed version 4.2.16 of VirtualBox Guest Additions`
とか出てきたので実は要らなかったかもしれない。
で、インストールは完了したけどコピペできなかった。何故？
scikit-learnで決定木の作成

Wekaを使って決定木を作っていたのですが，データをarffにするのがめんどくさくて
Pythonの機械学習ライブラリscikit-learnで決定木を作成してみました．
使ってみたかったし
scikit-learnのインストールは他のWebで丁寧に教えてくれます

決定木のオブジェクト自体は結構簡単にできます．
Graphvizはbrewでinstallしましょう(Mac)
pyparsing と呼ばれるライブラリが新しくなってしまっているので
描画したいときは

*sudo pip install -U pydot pyparsing==1.5.7*

で，ダウングレードしてください
Windowsはわからない(小声)

```py:tree_ex.py
#-*-coding:utf-8 -*-

# Null値は使えない → どうしよう？
# yes,noは1,-1
# 文字は使えない
from sklearn import tree
from sklearn.externals.six import StringIO
import pydot

if __name__ == '__main__':

    X = [
        [0,1],
        [0,-1],
        [1,1]
        ]
    Y = [1,2,3] #上から順に対応している
    clf = tree.DecisionTreeClassifier()
    clf = clf.fit(X,Y) # これで決定木オブジェクト完成

    #描画のためのおまじない
    dot_data = StringIO()
    tree.export_graphviz(clf,out_file = dot_data)
    graph = pydot.graph_from_dot_data(dot_data.getvalue())
    graph.write_pdf("tree_ex.pdf")
    
    #pre = clf.predict([0,1])
    #print pre #結果は1

```

X がデータで，Yが各データのラベルになっています．
fit関数でXとYをマッスルドッキングしてます(多分)

fit関数を適用した時点で，clfが決定木オブジェクト兼分類器になっているので
コメントアウトしてあるpredict関数で新しいデータがどのクラスに属するか分類できます．

あとはpydotを呼び出して描画するおまじない，，，のはず

上の描画結果はこんな感じ

![tree_ex.png](https://qiita-image-store.s3.amazonaws.com/0/45154/9e1c0592-a76a-5309-e2d1-053a20ff7776.png)

Wekaの決定木が見づらくてPythonで決定木を作ろうとしたらこうなりました．
決定木作成自体はとても簡単です．
見やすくはあるのですが

・分岐条件が出てない(実力不足で出せない)

・1項目に1,2,3種類の解答があるアンケートは振り分けられない(yes,noは[1,-1]で実現可)

・Null値・文字列を受け付けない

など，今のところWekaのほうが使いやすい気がします．
引数のオプションつければよくなるんでしょうか．．．
promhx使ってみた

Haxe練習中

haxelib install promhx

```hx
package;
import js.Lib;
import promhx.*;

class Main {
  static function main() {
    var p = new Deferred<Int>();
    js.Browser.window.setTimeout(function(){
      p.resolve(42);
    }, 100);
    p.then(function(num) {
      trace('resolved number', num);
    });
  }
}
```
GitLab CIとは？

# GitLab CIとは？
## 概要
継続的インテグレーションツールGitLab CIについて基本的な情報をまとめます。

## GitLab CIとは？
GitLab CIはオープンソースの継続的インテグレーションツール(CIツール)です。
CIツールとしては、 *Jenkins* や *Travis CI* が有名です。

## 動作要件(2014/06/30時点)
### 正式にサポートしているOS
* Ubuntu Linux
* Debian/GNU Linux

### その他のソフトウェア要件
* GitLab 6.3以上
* Ruby 1.9.3
* MySQL か PostgreSQL

### ハードウェア要件
* メモリ1GB以上推奨、512MBで動作
* CPU2コア以上推奨、1コアで動作
* 100MBかそれより少ない程度のディスクスペース

## 特徴
* シングルサインオン

    GitLabインスタンスと同じユーザーを使用します

* クリック1つで設定可能
* エレガントで柔軟

    ビルドスクリプトはbashで書かれ, テスト対象の言語は問わない

* Merge request 連携

    Merge requestのビルド状態を確認可能

* 標準で分散実行

    GitLab CIとビルドランナーは別環境で実行可能

* リアルタイムロギング

    実行中のビルドのログは数秒単位で再描画される

## CI ランナー

ビルドの実行にはCI ランナーが必要。公式、非公式含み複数の実行環境がある

* [Official CI runner for Linux](https://gitlab.com/gitlab-org/gitlab-ci-runner)

※ runner は *pure Ruby*

以下略。詳しくは公式サイトにて。

## アーキテクチャ

GitLab CI はDBに状態を保存するWebのAPI。
プロジェクトとビルドを管理し、使い易いユーザーIFを提供する。
認証には GitLab Application API を使用している。

テストを実行するには少なくとも1つの GitLab CIインスタンス と1つの GitLab CIランナー が必要。
複数のテストを同時に実行したい場合は少なくとも、もう1つの GitLabランナー が必要。

## インストール
インストールガイドは以下

https://github.com/gitlabhq/gitlab-ci/blob/master/doc/install/installation.md

## 参照
https://github.com/gitlabhq/gitlab-ci
https://about.gitlab.com/gitlab-ci/
RuboCop | Style/FileName

# RuboCop | Style/FileName

## 概要

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

Rubyのファイル名が *snake_case* になっているかチェックします。
Excludeによって除外対象を設定可能です。

### デフォルト除外一覧

* Rakefile
* Gemfile
* Capfile

## FileName

各設定値での検証結果をまとめます。

### 検証プログラム

snake_case.rb

~~~ruby
print 'snake_case'
~~~

CamelCase.rb

~~~ruby
print 'CamelCase'
~~~

### 実行結果 デフォルト の場合

.rubocop.yml

※明示的に設定しているが、デフォルト値なので何も設定しなくてもよい

~~~yaml
FileName:
  Exclude:
    - '**/Rakefile'
    - '**/Gemfile'
    - '**/Capfile'
~~~

~~~bash
$ rubocop snake_case.rb CamelCase.rb
Inspecting 2 files
.C

Offenses:

CamelCase.rb:2:1: C: Use snake_case for source file names.

2 files inspected, 1 offense detected
~~~

### 実行結果 *Exclude* に *CamelCase.rb* を追加

.rubocop.yml

~~~yaml
FileName:
  Exclude:
    - '**/Rakefile'
    - '**/Gemfile'
    - '**/Capfile'
    - '**/CamelCase.rb'
~~~

~~~bash
$ rubocop snake_case.rb CamelCase.rb
Inspecting 2 files
..

2 files inspected, no offenses detected
~~~
7つのデータベース7つの世界の２日目でRiakを触ったらハマった

# 背景
p68以降の「整合性と永続性」の項にて、N, R, Wの値を適切に設定するとデータの整合性が保てないことを確認したかった。

# 結果
`riak1.4.1`では再現可能な状態でriakの整合性を破壊することはできなかった。HTTPによってデータのI/Oを行い、偶発的に`404 status code`を得ることができたが、その後のリクエストではデータの整合性が保たれたりした。

# 考察
riakのデータの整合性を保証するための機構として`vector clock`, `read repair`, `AAE(active anti entropy)`という機能が存在する。

- `vector clock`はriak内でデータのI/O順序などのデータを記録するデータ構造
- `read repair`はread系リクエストに際してデータの不整合が確認された場合、`vector clock`を基にデータを修復する受動的機構
- `AAE`は能動的にデータの不整合を検知してデータを修復する機構

なのですが、2013/2の`riak1.3`において`AAE`が実装されていることが判明しています。
7つのデータベース7つの世界は2012年に執筆され、2013/1に訳されているために、`AAE`を考慮しない構成になっている可能性が高いと考えられました。

# その後
`dev/dev1/etc/riak(あるいはapp).conf`において`anti_entropy = passive`を設定し、ノードをrelaodしたり試したのですが、一向に整合性を乱せないので諦めました。

7databasesを学ばれる皆さんはお気をつけください。また、何か分かったらご一報をよろしくお願いします。

# 感想
riak、防御力高い。Erlangの言語仕様(message passing)すごい。
5人で「riakを殺そう」を合い言葉に頑張るの、MMORPGでボスの体力を削ってる気分で楽しかったので皆さんにもオススメです！
adbでスクリーンショットを取るスクリプト

## 目的

以下の問題を解決する。

* スクリーンショットを取るボタンの押し方が覚えられない。
* 撮ったスクリーンショットをメールで送ろうかsamba経由で転送しようかなどいつも迷う。

## 手順
1. http://developer.android.com/sdk/index.html などを参考にadbを使えるようにする
2. Android端末とMacをUSBケーブルでつなぐ
3. adb devices で接続されていることを確認する
4. 以下のスクリプトを実行する

```bash
#!/bin/bash

DATE=`date +"%Y-%m-%d-%H-%M-%S"`
FILENAME="s-${DATE}.png"
echo "capturing ${FILENAME}..."
adb shell screencap -p "/sdcard/${FILENAME}"
adb pull /sdcard/"${FILENAME}"
adb shell rm "/sdcard/${FILENAME}"
echo "saved ${FILENAME}."
```

## Windowsバッチ

バッチファイルと同じ場所にファイル転送されます．

```bat
@echo off
set YYYYMMDD=%DATE:/=-%
set HHMMSS=%TIME:~0,8%
set HHMMSS=%HHMMSS::=-%
set FILENAME=%YYYYMMDD%_%HHMMSS%.png
adb shell screencap -p "/sdcard/%FILENAME%"
adb pull "/sdcard/%FILENAME%" "%~dp0%FILENAME%"
adb shell rm "/sdcard/%FILENAME%"
echo saved %~dp0%FILENAME%
pause;
```

参考
-----
* http://qiita.com/TNaruto/items/b2407f5668e15e42bedd
[PHP]php.iniのtimezoneを設定する


FuelPHPなどでoilコマンドを利用しようと思った際にこんなエラーが。


```
$ php oil g model hoge hoge:int

Error - date_default_timezone_get(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone. in COREPATH/classes/fuel.php on line 161

```

えーっと、デフォルトタイムゾーンが設定されていないので、
PHPを実行する事が出来ませんよー。とのことです。

##MAMPなどの開発環境の場合の注意点

ここで注意して欲しいのが、プロジェクトを例えばMAMPの開発環境にしていた場合でも、
ここでいわれているのは、コマンドラインで実行したphpの設定がされてないということです。
そこで、macのphpの設定を変更していきましょう。

##php.iniを生成する

デフォルトタイムゾーンはphp.iniで設定出来るのでまずは場所を探します。

```
$ php --ini

Configuration File (php.ini) Path: /etc
Loaded Configuration File:         (none)
Scan for additional .ini files in: /Library/Server/Web/Config/php
Additional .ini files parsed:      (none)

```

Loaded Configuration File:の部分で、(none)になっています。
これはそもそもphp.iniが存在していません。

なので、php.iniを生成します。

```
$ sudo mv /etc/php.ini.default /etc/php.ini
```

/etc/　の中に、php.ini.defaultというファイルがありますので、
そのファイルのコピーをphp.iniというファイル名で保存してください。

##default timezoneの設定
生成したphp.iniのタイムゾーンを設定します。

```php.ini
[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = "Asia/Tokyo"

; http://php.net/date.default-latitude
;date.default_latitude = 31.7667

```
Asia/Tokyoに設定すれば完了です。
[FuelPHP]oilコマンドでMySQLに接続できない


FuelPHPにはoilというジェネレーターパッケージが内包されており、
簡単にDBの作成やコントローラーファイルの生成をすることが可能です。

[公式リファレンスはコチラ]
[公式リファレンスはコチラ]:http://press.nekoget.com/fuelphp_doc/packages/oil/generate.html

[こちらの方法]でFuelPHPをインストールし、
oilコマンドでマイグレーションを生成しようとすると、以下のようなエラーが出ます。
[こちらの方法]:http://qiita.com/maximum80/items/5f49cfbad7d362f76244

```
Uncaught exception Fuel\Core\Database_Exception: SQLSTATE[HY000] [2002] No such file or directory
Callstack:
#0 /Applications/MAMP/htdocs/sample/fuel/core/classes/database/pdo/connection.php(167): Fuel\Core\Database_PDO_Connection->connect()
#1 /Applications/MAMP/htdocs/sample/fuel/core/classes/database/query.php(287): Fuel\Core\Database_PDO_Connection->query(1, 'SELECT * FROM `...', false)
...
```

ファイルが見つかりませんと出ますが、よくよく下の方まで読んでみると

```
Previous exception:
Uncaught exception PDOException: SQLSTATE[HY000] [2002] No such file or directory
Callstack:
#0 /Applications/MAMP/htdocs/sample/fuel/core/classes/database/pdo/connection.php(95): PDO->__construct('mysql:host=loca...', 'root', 'root', Array)
#1 /Applications/MAMP/htdocs/sample/fuel/core/classes/database/pdo/connection.php(167): Fuel\Core\Database_PDO_Connection->connect()
```

と出ています。
すなわち、コンストラクタでDBの設定ファイルを読み込んでいますが、
DBに接続できませんよ〜！と言っています。

そこで、DBの設定ファイルを編集します。

```
$ vim fuel/app/config/development/db.php
```

```db.php

return array(
        'default' => array(
                'connection'  => array(
                        'dsn'        => 'mysql:host=localhost;dbname=fuel_dev;unix_socket=/Applications/MAMP/tmp/mysql/mysql.sock',
//unix_socketを指定
                        'username'   => 'root',
                        'password'   => 'root',
                ),
        ),
);
```

PDOのDSNでMAMPのmysql.sockを指定します。
これで正常にMySQLに接続する事が出来るようになるかと思います。
built-in object を拡張する禁断の果実を齧ろう


Python は元々 monkey-patching しやすい言語ですが、C で書かれた組み込み型を拡張しようとすると TypeError が起きます。

```python
>>> str.foo = lambda: 'foo'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't set attributes of built-in/extension type 'str'
```

そんなときは [forbiddenfruit](https://github.com/clarete/forbiddenfruit) を使うと、組み込み型も拡張できます。

## pip でインストール
```
pip install forbiddenfruit
```

## datetime, time に monkey-patch
実際に現在日時を返す datetime built-in object のクラスメソッドを翌日の同時刻を返すメソッドに拡張してみました。また、time モジュールの built-in function も拡張しました。こちらは forbiddenfruit は不要で、単純にすり替えるだけです。

```python:hook_datetime.py
import datetime, time
from forbiddenfruit import curse
original_now = datetime.datetime.now
original_utcnow = datetime.datetime.utcnow
original_today = datetime.date.today

def tomorrow_now(self, tz=None):
    now = original_now(tz)
    return now + datetime.timedelta(days=1)

def tomorrow_utcnow(self):
    now = original_utcnow()
    return now + datetime.timedelta(days=1)

def tomorrow_today(self):
    return tomorrow_now(datetime.datetime).date()

def patch_tomorrow_time():
    global time
    original_localtime = time.localtime
    def _localtime(secs=None):
        if not secs:
            return tomorrow_now(datetime.datetime).timetuple()
        else:
            return original_localtime(secs)
    time.localtime = _localtime
    def _time():
        return time.mktime(time.localtime())
    time.time = _time
    original_gmtime = time.gmtime
    def _gmtime(secs=None):
        if not secs:
            return tomorrow_utcnow(datetime.datetime).timetuple()
        else:
            return original_gmtime(secs)
    original_asctime = time.asctime
    def _asctime(t=None):
        if not t:
            return original_asctime(tomorrow_now(datetime.datetime).timetuple())
        else:
            return original_asctime(t)
    time.asctime = _asctime
    def _ctime(secs=None):
        return time.asctime(time.localtime(secs))
    time.ctime = _ctime

curse(datetime.datetime, 'now', classmethod(tomorrow_now))
curse(datetime.datetime, 'utcnow', classmethod(tomorrow_utcnow))
curse(datetime.date, 'today', classmethod(tomorrow_today))
patch_tomorrow_time()
```
built-in function のパッチの方が長くて汚くなってしまった。。
しかしまあ、これであっさりと ``datetime.now()`` などが翌日を返すようになりました。Django の ``./manage.py runserver`` なんかも翌日に進んだ状態で普通に動きました。

## 雑感
テストやデバッグで時間を変えたいケースがあったりするのでシステム時間変えるのは腰が重いなーと感じて試しに書いてみました。

datetime の例は monkey-patching するメソッドに漏れがありそうな気がしてますが、production では決して使わないコードなんで出たとこ勝負で直していけば良いかなと思います。

forbiddenfruit 自体は [150 行前後の短いコード](https://github.com/clarete/forbiddenfruit/blob/master/forbiddenfruit/__init__.py)なので読んでみると ctypes について勉強になる感じでした。
ビットをどう使うかよく判らない人へ

**結構ストックも増えてきたので、いい加減ご指摘頂いた部分を修正しました…**

周りにビットを毛嫌いする人が多かったので、ビットの使い方をなるべく解り易く書いてみようと思いました。

## なぜビットを使うのか

*主なメリット

> 
1. データ量が少なくて済む
2. 実際速い
3. 一つのデータに複数の情報を詰め込める

データ量をケチりたい環境では、一つの変数に色んな情報を積みまくったりするし
ビット演算は通常の四則演算より高速な場合も多かったりします。

特に、「1つのデータに複数の情報を詰め込める」というのは、プログラムのロジックでよく応用されるテクニックです。
本記事ではこの場合の具体例を上げてみようかと思います。

## なにが分かればいいのか

必要な知識は、この3つです。
> 
1. ビット演算
2. ビットフラグ
3. ビットマスク

これさえ出来れば、プログラムに応用出来るようになるかと思います。

#1つの変数に複数のフラグを立ててみる

手順としては
>
1. ビットフラグを定義する
2. 変数にビットフラグを立てる
3. ビットフラグを抽出する

の3つです。

## ビットフラグを作る



```c
// 4byte データ
int BIT_FLAG_1   = 0x0001; // 2進数 : (0000 0000 0000 0001)
int BIT_FLAG_2   = 0x0002; // 2進数 : (0000 0000 0000 0010)
int BIT_FLAG_4   = 0x0004; // 2進数 : (0000 0000 0000 0100)
int BIT_FLAG_8   = 0x0008; // 2進数 : (0000 0000 0000 1000)
int BIT_FLAG_16  = 0x0010; // 2進数 : (0000 0000 0001 0000)
int BIT_FLAG_32  = 0x0020; // 2進数 : (0000 0000 0010 0000)
int BIT_FLAG_64  = 0x0040; // 2進数 : (0000 0000 0100 0000)
int BIT_FLAG_128 = 0x0080; // 2進数 : (0000 0000 1000 0000)
```

ビットフラグはビット単位で立てます。
2進数で1桁ずつ立っていれば良いので
1ビット目を立てる為には、1を。
2ビット目に立てる為には、2を。
では3ビット目は3…ではなく4です。

2進数なので、桁を上げるには2を掛けていけばいいのです。（10進数は10を掛けると桁が上がりますよね。）

こうして2の倍数で数値を作っていくと、ビットフラグが出来上がります。

余談ですが、何故わざわざ16進数で宣言するのかと言うと、
2進数で表すビットと、視覚的に互換性が高かったりします。
（ 0x1234は、(0001 0010 0011 0100) ですが、
　0001(**1**) 0010(**2**) 0011(**3**) 0100(**4**) と区切りそれぞれに対応します) 
なので、整数値で宣言しても特に問題はないです。

## 変数にフラグを立てる

先ほどのフラグを使って、変数にフラグを立ててみましょう。
"|"とか"&"（ビット演算子）が解らない方は、適当に「C言語 ビット演算」とかでググってみて下さい。

```c
int flag = BIT_FLAG_1 | BIT_FLAG_4 ; // 1つ目と3つ目にフラグを立てる
```

* 2進数で見るとこうなります。

> (0000 0001) OR (0000 00100) = (0000 0101)

## フラグを抽出する

例えば、
*立っているフラグそれぞれ別の関数を呼ぶ*
という機能を想定してみます。

```c

void main()
{
    // 上記と同じフラグ
    int flag = ( BIT_FLAG_1 | BIT_FLAG_4 );
    bit_extractor(flag);
}

void bit_extractor( int flag )
{
    if( ( flag & BIT_FLAG_1 ) != 0 )
    {   // ここはtrue
        funcA(); 
    }
    if( ( flag & BIT_FLAG_2 ) != 0 )
    {   // ここはfalse
        funcB();
    }
    if( ( flag & BIT_FLAG_4 ) != 0 )
    {   // ここはtrue
        funcC();
    }
    if( ( flag & BIT_FLAG_8 ) != 0 )
    {   // ここはfalse
        funcD();
    }
}
//C言語などifの評価が数値の場合は、 if( flag & BIT_FLAG_1 ) こうやってすっきり書けます。
```

こうすることで、フラグ変数を複数作ること無く場合分けすることが出来ました。
些細なことですが、パラメータにbool変数を4つ投げるよりすっきりします。

##次回
次はバイト単位で情報が格納されているデータから、ビットマスクとビットシフトを使って抽出する方法を説明しようと思います。
sftpのみ許可

## 設定

```bash:
adduser --home / --no-create-home --shell /bin/false sftp-only
```

```diff:/home/sftp-only/.ssh/authorized_keys
+ command="internal-sftp" ssh-rsa ...
```

## /etc/ssh/sshd_config

* [OpenSSH の Chroot 機能を利用して SFTP のログ取得してみた | 黒ぶちメガネのblog](http://www.kurobuti.com/blog/?p=5831)

```bash:
Subsystem sftp internal-sftp -f authpriv -l info

Match User sftp-only
  ChrootDirectory /chroot
  AllowTcpForwarding no
  PermitTunnel no
  X11Forwarding no
```

```bash:syntax&nbsp;check
sshd -t
```

* 何も出力されなければ正常。

```bash:sshd再起動
/etc/init.d/ssh restart
```

* [chroot用に/etc/{passwd,group}作成](http://qiita.com/tukiyo3/items/3fc89f283f6e46bdcd11)


# ディレクトリ生成時、 現在のディレクトリのgidを引き継ぐ方法

* 参考 : [SGID（Set Group ID） - 特殊なアクセス権](http://kazmax.zpp.jp/linux_beginner/setgroupid.html)
* SGID(Set Group ID)をディレクトリに立てれば良い。

```bash:
chmod g+s dirname
```

# ロギング(未確認)

```diff:/home/sftp-only/.ssh/authorized_keys
+ command="internal-sftp -f LOCAL6 -l INFO" ssh-rsa ...
```

```bash:/etc/rsyslog.d/50-sftp.conf
local6.*  /var/log/sftp.log
```

```bash:
/etc/init.d/rsyslog restart
```


----

# rsshを使う

* 接続方式をsftpやscp等に限りたいという場合役立つ

```bash:/etc/passwd
sftp-only:x:1000:1000:,,,:/home/sftp-only:/usr/bin/rssh
```

```diff:/etc/shells
+ /usr/bin/rssh
```

```diff:/etc/rssh.conf
+ user=sftp-only:022:000100:
```

* [sftp+rsshでchrootする方法 - 足跡](http://d.hatena.ne.jp/slayer845/20100206/1265391009)

> user=～の部分は前から
> ユーザー名
> umask値
> access bit(rsync,rdist,cvs,sftp,scpの順。1で許可、0で不許可）
> chrootされるパス

* /usr/share/doc/rssh/examples/mkchroot.sh
[小ネタ] SHA1の計算 

SHA1の計算をboostで簡単にできないかなぁと思って調べたら簡単に出来たのでメモ。

boost/uuid/sha1.hppにそのものズバリがありました。
なんてboostは便利なんでしょう(感嘆)

```cpp:sha1test.cpp

#include <iostream>
#include <boost/uuid/sha1.hpp>
#include <boost/cstdint.hpp>
#include <boost/array.hpp>
#include <stdio.h>

typedef boost::array<boost::uint8_t,20> hash_array;

// SHA1を計算し、uint8型の配列に入れる
void calc_sha1_hash(const void* data,size_t count,hash_array &hash)
{
	boost::uuids::detail::sha1 sha1;
	unsigned int inthash[5];
	
	sha1.process_bytes(data,count);
	sha1.get_digest(inthash);
	
	// このままでも使えるけど、uint8にしたほうがいろいろと都合が良いので
	for(int i=0;i<5;i++){
		hash[i*4]	= (inthash[i] & 0xFF000000) >> 24;
		hash[i*4+1]	= (inthash[i] & 0x00FF0000) >> 16;
		hash[i*4+2]	= (inthash[i] & 0x0000FF00) >> 8;
		hash[i*4+3]	= (inthash[i] & 0x000000FF) ;
	}
}

void hash_disp(boost::uint8_t x)
{
	printf("%02X",x);
}

int main(void)
{
	hash_array hasher;
	
	calc_sha1_hash("abcd",4,hasher);	
	std::for_each(hasher.begin(),hasher.end(),hash_disp);
	
	return 0;
}


```

sha1.hppのhash配列がint[5]固定で何かと使いにくいので、その辺は変換関数作って各自対処ってことなんですかね。
vimとtmuxにpowerlineを導入する




## NeoBundle のインストール

README.mdを参考にNeoBundleをインストール

[Shougo/neobundle.vim](https://github.com/Shougo/neobundle.vim)

vimrcの設定は以下のように設定した

```vim:.vimrc
"================
" NeoBundle
"================
set nocompatible
filetype off

if has('vim_starting')
  set runtimepath+=~/.vim/bundle/neobundle.vim
endif

" Initialize
call neobundle#begin(expand('~/.vim/bundle/'))

" NoeBundle で NeoBundleを管理
NeoBundleFetch 'Shougo/neobundle.vim'

" originalrepos on github
NeoBundle 'Shougo/neobundle.vim'		" <-もしかしたら不要
NeoBundle 'Lokaltog/powerline', { 'rtp' : 'powerline/bindings/vim'}

call neobundle#end()

filetype plugin indent on     " required!

" 起動時にインストールチェック
NeoBundleCheck
```

あと、powerlineとは直接関係無いけど、以下の行を .vimrc に追加した。

```
" 常にステータスラインを表示
set laststatus=2
" 256色対応？
set t_Co=254
```

## vim への powerline のインストール

上記の設定したら、vim を立ち上げ :NeoBundleInstall で powerline がインストールされる

## tmux への powerline のインストール

以下を ~/.tmux.conf に記述

```
#### Powerline ####
source ~/.vim/bundle/powerline/powerline/bindings/tmux/powerline.conf
```


## フォントの設定

powerline をインストールしただけだと一部文字化けするので、以下からpowerlineに対応したfontをインストールする。

[powerline/fonts: Patched fonts for Powerline users.](https://github.com/powerline/fonts)

とりあえず評判の良さそうな SourceCodePro を使用することに。
ローカルの適当な場所に clone 

```bash
$ git clone https://github.com/powerline/fonts.git
```

clone が終わったら、そのディレクトリに移動して `./install.sh` を実行（引数にインストール対象のフォント名を指定する）

```bash
$ cd fonts
$ ./install.sh
Copying fonts...
Powerline fonts installed to /Users/nakamatsu/Library/Fonts
```

> 個別にフォントを指定する場合の注意
>
> フォント名はディレクトリ名と異なる場合があるので注意。
> たとえば、"SourceCodePro"ディレクトリに格納されているフォントは"Source Code Pro xxxxx" (スペースあり) だが、ディレクトリ名は "SourceCodePro"(スペースなし)になっている。
> ディレクトリ名ではなく、あくまでもフォント名を指定すること。



OSにフォントを登録したら、あとはターミナルの設定。
iTerm2を使っているので、preferenceで Text のタブを開いて先ほどのフォントを使用するように設定変更。

![スクリーンショット 2014-06-30 19.00.38.png](https://qiita-image-store.s3.amazonaws.com/0/8219/3c317f4a-7590-1df3-a0d4-c8469a8c4074.png "スクリーンショット 2014-06-30 19.00.38.png")

以上で設定完了。




# 参考

* [Vim - NeoBundleの導入 - Qiita](http://qiita.com/puriketu99/items/1c32d3f24cc2919203eb)

* [Vim - powerlineをいつ使う？今でしょ！ - Qiita](http://qiita.com/alpaca_taichou/items/ab70f914a6a577e25d70)

* [Lokaltog/powerline](https://github.com/Lokaltog/powerline)

* [Powerline — Powerline beta documentation](https://powerline.readthedocs.org/en/latest/index.html)

* [Lokaltog/powerline-fonts](https://github.com/Lokaltog/powerline-fonts)
CDHのhbaseへのjavaからの接続時エラー


以下のエラーが出たら、「hadoop-hdfs-2.3.0-cdh5.0.2.jar」をクラスパスに通してください。
（バージョンは適宜修正）

14/06/30 18:57:11 WARN util.DynamicClassLoader: Failed to identify the fs of dir hdfs://127.0.0.1:9003/hbase/lib, ignored
java.io.IOException: No FileSystem for scheme: hdfs
	at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2385)
	at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2392)
	at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:89)
	at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2431)
	at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2413)
	at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:368)
	at org.apache.hadoop.fs.Path.getFileSystem(Path.java:296)
	at org.apache.hadoop.hbase.util.DynamicClassLoader.<init>(DynamicClassLoader.java:104)
	at org.apache.hadoop.hbase.protobuf.ProtobufUtil.<clinit>(ProtobufUtil.java:197)
	at org.apache.hadoop.hbase.ClusterId.parseFrom(ClusterId.java:64)
	at org.apache.hadoop.hbase.zookeeper.ZKClusterId.readClusterIdZNode(ZKClusterId.java:69)
	at org.apache.hadoop.hbase.client.ZooKeeperRegistry.getClusterId(ZooKeeperRegistry.java:83)
	at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.retrieveClusterId(HConnectionManager.java:801)
	at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.<init>(HConnectionManager.java:633)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
	at org.apache.hadoop.hbase.client.HConnectionManager.createConnection(HConnectionManager.java:387)
	at org.apache.hadoop.hbase.client.HConnectionManager.createConnection(HConnectionManager.java:366)
	at org.apache.hadoop.hbase.client.HConnectionManager.getConnection(HConnectionManager.java:247)
	at org.apache.hadoop.hbase.client.HTable.<init>(HTable.java:188)
	at org.apache.hadoop.hbase.client.HTable.<init>(HTable.java:165)
	at org.apache.hadoop.hbase.client.HTableFactory.createHTableInterface(HTableFactory.java:39)

NoClassDefFoundErrorやNoClassExceptionなどが出ないので、原因がわかりづらいです。
現在時刻をYYYYMMDDHHMMSS形式で取得する

バッチファイルで現在時刻をYYYYMMDDHHMMSS形式で取得する
```
set time_tmp=%time: =0%
set now=%date:/=%%time_tmp:~0,2%%time_tmp:~3,2%%time_tmp:~6,2%
echo %now%
```

ファイルlast.txtに日時がYYYYMMDD形式で保存されている場合、今日との差[日]を取得するには以下の様にする。
```
for /f "usebackq" %%a in (`type last.txt`) do set last=%%a
set now=%date:/=%
set /a diff="now-last"
echo %diff%
```
ループ変数 %%a、%a の変数名は1文字でなければいけない模様
また、バッチファイルの場合は"%%a"
コマンドプロンプトの場合は"%a"、とする

ちなみにset /aは32bit整数の計算しかできないので、YYYYMMDDHHMMSS形式は扱えません。使えないな～。

変数の削除(おまけ)
```
set now=
```
Macでのスクリーンショットの保存先変更


ちょっとした備忘録ですが  
先に保存先を作成＞ターミナルで

```bash:
defaults write com.apple.screencapture location <保存先>

killall SystemUIServer
```

フォルダ名は英語にしたほうが無難らしい。ピクチャなら``~/Pictures``で

初期設定に戻すには


```bash:
defaults delete com.apple.screencapture location

killall SystemUIServer
```

参考記事：  
http://www.studioloupe.com/2013/03/screenshots.html

その他、保存形式も指定できるそうで。デフォではPNGだが、JPEGにしたければ

```bash:
defaults write com.apple.screencapture type jpg

killall SystemUIServer
```

初期設定に戻すには

```bash:
defaults delete com.apple.screencapture type

killall SystemUIServer
```
Unity C# Callbackパターンの書き方


delegateを使う。

### 呼び出し側

```C#
using UnityEngine;

public class SampleMain {

    public void Start () {

        SampleSub sub = new SampleSub();
        sub.hoge(Callback);
    }

    public void Callback ( string msg ) {

        Debug.Log("Callback : " + msg); // Callback : おわったよ
    }
}

```

### 呼び出され側

```C#
using UnityEngine;

public class SampleSub {

	public delegate void onComplete( string msg );

    public void hoge ( onComplete callback ) {

        // 処理が終わったら
        callback("おわったよ");
    }
}
```
node.js（っていうかV8）ってHTMLのコメントも認識するみたいな

[この記事](http://qiita.com/Hashrock/items/c03415c005d826537d4a)を読んでふと疑問に思ったので試してみたら、動いた、という話。

つまりはこういうこと、

```js:hello.js
<!-- この部分はHTMLのコメントの始まりの部分で（恐らく）行コメントとして認識される
console.log("Hello, World!");
-->  この部分はHTMLのコメントの終わりの部分で‥‥（以下略）
```

知らなかった‥‥。

Chromeでも動いたことから、恐らくHTMLの中に直接書き込まれることを意識してV8に組み込まれてるんじゃないかと思う。

これ何かに悪用できないかなぁ‥‥（ってそれは既に最初のリンク先がやってるのか）
rails validationの一部のみ実行する方法

2014/06/30
rails 4.1.0

```.rb
# 通常のタイミングでやってほしいもの
with_options on: [ :create, :update ] do |create_and_update|
  create_and_update.validates :column1, presence: true
  create_and_update.validates :column2, uniqueness: true
end

# self.valid?(:hoge)とかself.save(context: :hoge)とかのみ
with_options on: :hoge do |hoge|
  hoge.validates :column1, presence: true
end
```

##検証して分かった重要なこと3つ
A. self.valid?()は、onが付いているもの付いていないもの区別なくすべて作動する
B. validatesにonオプションを付けた時点で、それ以外のタイミングでは動作しない(ただし何も付けないもの=Aの場合には反応する)
C. validatesにonオプションを付けなければすべてのタイミングで動作する



##あと
* onはリストでかける(rails大抵そうなってる気がする)
* ぶっちゃけoffがほしいです。

複数のvalidatesに同一のオプションを付けれるけど、複数のオプションを同一のvalidateに付けれないのだろうか（上の例だと column1は二回書くはめに…）

## 追記
rails 4.0.1 だと、 validates の on オプションに複数のものを入れるとエラー出ます。多分バグです。
Java EE 7 の開発をはじめる

今まで主に統計や機械学習の話をしてきたはずが急に Java 開発の話です。

## Java EE 7 ことはじめ

このあたりを読んでおけば良いみたいです。

The Java EE 7 Tutorial
http://docs.oracle.com/javaee/7/tutorial/doc/home.htm

Java(TM) EE 7 Specification APIs
http://docs.oracle.com/javaee/7/api/

JSR 342: JavaTM Platform, Enterprise Edition 7 (Java EE 7) Specification
https://jcp.org/en/jsr/detail?id=342

今から始める Java EE 7 解説セミナー 
http://www.oracle.com/technetwork/jp/ondemand/index-2007743-ja.html

Beginning Java EE 6 GlassFish 3　で始めるエンタープライズ Java (Programmer’s SELECTION) [大型本]
http://www.amazon.co.jp/dp/4798124605
↑ 前のバージョンですが Java EE 7 でも十分使えます

概要はここに書いてあります。
http://www.oracle.com/technetwork/jp/java/javaee/overview/index.html

## Java 開発環境を用意する

開発環境としては、利用する OS に関係なく [Java SDK](http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html) 、 [NetBeans](https://netbeans.org/) ([GlassFish](https://glassfish.java.net/) 含む) 、 [Java EE 7](http://www.oracle.com/technetwork/java/javaee/downloads/index.html) をそれぞれ落としてくれば良いです。

### GlassFish のサーバー環境を整える

ローカルで開発するなら良いのですがデプロイサーバーを別に用意する場合は管理画面の設定が必要になります。

```bash

VERSION=4.0
TARGET=/opt/glassfish

cd $TARGET/$VERSION/glassfish/bin
# 管理者用のパスワードを設定する
sudo -u glassfish sh asadmin change-admin-password
# セキュリティを有効にする
sudo -u glassfish sh asadmin enable-secure-admin
```

これで 4848 ポートに接続して管理者ログインしたり、アプリケーションをデプロイできるようになります。

システムに後から Oracle JDK をインストールした場合、環境によっては java にパスが通っておらず GlassFish が起動しないことがあります。 asadmin を編集して java にパスを通すか環境変数 AS_JAVA に Oracle の Java のパスを指定します。

```bash
export AS_JAVA=/opt/java/jdk/current
```

### IDE の環境を整える

普通のプログラマーなら Emacs (宗派によっては Vim) を使うと思いますが Java 開発においては IDE を使うのが多数派です。そこで NetBeans を使うわけですが一応 Emacs っぽいキーバインドもプリセットで用意されているため悶死せずに済みます。

IDE の設定は ~/.netbeans に保存されるのであらかじめどこかの計算機で環境を整備済みであればこのディレクトリを rsync するだけで環境を複製することができます。場合によっては git などで管理しても良いでしょう。

## サンプルアプリケーションを開発する

Java のサンプルアプリケーションをこのあたりを参考にしながら手早く作ってみると良いでしょう。
http://www.slideshare.net/makingx/netbeansjavaee7-first-tutorial

Java を知らない世代が今からはじめる Java EE 開発
http://den2sn.hatenablog.com/entry/2012/12/19/001146


### ステージング環境に Java アプリケーションをデプロイする

Java の世界ではビルドした結果が .war ファイルとして出来上がるのでこれをアプリケーションサーバーにデプロイすれば良いということになります。

ステージング環境としては [Server JRE](http://www.oracle.com/technetwork/java/javase/downloads/server-jre7-downloads-1931105.html) と [GlassFish](https://glassfish.java.net/) などのアプリケーションサーバーが最低限必要です。

手作業でデプロイしても良いのですが [Jenkins でテストが通ったら自動デプロイするようにすると良い](http://kikutaro777.hatenablog.com/entry/20121226/1356518770)でしょう。

### Apache と GlassFish を連携する

Java アプリケーションサーバーを Apache と連携するにはいくつかやりかたがあります。

|プロダクト|説明|
|:--|:--|
|mod_proxy_http|簡単、標準装備|
|mod_proxy_ajp|少し速い、標準装備|
|mod_jk|速い、歴史的経緯有り|

詳細は以下を見ると良いでしょう。

mod_proxy_http と mod_proxy_ajp と mod_jk
http://dev.ariel-networks.com/Members/inoue/tomcat-apache/

## まとめ

Java EE 7 の開発を始めるにあたり必要な情報をまとめました。

Java の情報は日本語の情報を検索すると古い情報が混在したり、またスクリーンショットがベタベタ貼られた冗長な情報が出てくることが多いので、情報を厳選した上で参照する必要があります。
ObjCの配列は参照渡しなので要素の変更が(デフォルトで)伝播する

ObjCでは`@[a,b][1]`に対する変更が元の変数に伝わるのに対し、C++では、`std::vector<std::string>({a,b})[1]`に対する変更は元の変数には伝わらない。`*(std::vector<std::string*>({&a,&b})[1])`のように、ポインタを介さなければならない。
いやまあ、単に参照渡しと値渡しの違いだけなんですが。

何が嬉しいかというと、たとえば2つのUILabelがあって、[@[a,b][n%2] setText:@"1"];とかやるのが容易ですよねってことで。

```objc++:array_propagation.mm
#import <Foundation/Foundation.h>
#import <iostream>
#import <string>
#import <vector>

int main(){
	std::cout<<"ObjC"<<std::endl;
	{
		id myPool = [[NSAutoreleasePool alloc] init];

		NSMutableString *a=[NSMutableString stringWithString:@"a"];
		NSMutableString *b=[NSMutableString stringWithString:@"b"];
		[@[a,b][1] setString:@"c"];
		NSLog(@"%@ %@",a,b);

		[myPool drain];
	}
	std::cout<<"C++"<<std::endl;
	{
		std::string a="a";
		std::string b="b";
		std::vector<std::string>({a,b})[1][0]='c';
		std::cout<<a<<" "<<b<<std::endl;
		(*(std::vector<std::string*>({&a,&b})[1]))[0]='c';
		std::cout<<a<<" "<<b<<std::endl;
	}
	return 0;
}
```
複数のGoogleMapとjqueryのwrap()を使ったときの謎現象

謎の現象が起きたのでメモ。

- 別々の場所を指定している複数のGoogleMapのiframeを設置し、それにjQueryのwrap()を使う。
- そのページから移動してブザウザバックすると同じ地図（一番下の地図で上書き？）になる。
- 起きたブラウザはChromeとSafari
- GoogleMapを開いて右下の設定アイコンからの埋め込みとマイマップで起きた。iframeの問題？

デモ：
http://jsrun.it/Ituki/zHyu
TreeFrogのバリデーション一覧

TreeFrogに用意されているバリデーションです。

##Required
入力必須

```cpp:

setRule("title", Tf::Required, true, "タイトルは入力必須です。");
```

##MaxLength
最大文字数

```cpp:
setRule("title", Tf::MaxLength, 200, "タイトルは200文字以下である必要があります。");
```

##MinLength
最小文字数

```cpp:
setRule("title", Tf::MinLength, 5, "タイトルは5文字以上である必要があります。");
```

##IntMax
最大整数

```cpp:
setRule("title", Tf::IntMax, 10, "タイトルは10以下である必要があります。");
```

##IntMin
最小整数

```cpp:
setRule("title", Tf::IntMin, 1, "タイトルは1以上である必要があります。");
```

##DoubleMax
最大実数

```cpp:
setRule("title", Tf::DoubleMax, 9.9, "タイトルは9.9以下である必要があります。");
```

##DoubleMin
最少実数

```cpp:
setRule("title", Tf::DoubleMin, 1.1, "タイトルは1.1以上である必要があります。");
```

##EmailAddress
メールアドレス

```cpp:
setRule("title", Tf::EmailAddress, "タイトルは正しいメールアドレスではありません。");
```

##Url
URL

```cpp:
setRule("title", Tf::Url, "タイトルは正しいURL形式ではありません。");
```

##Date
日付

```cpp:
setRule("title", Tf::Date, "タイトルは正しい日付ではありません。");
```

##Time
時刻

```cpp:
setRule("title", Tf::Time, "タイトルは正しい時刻ではありません。");
```

##DateTime
日時

```cpp:
setRule("title", Tf::DateTime, "タイトルは正しい時刻ではありません。");
```

##Pattern
正規表現

```cpp:
setPatternRule("title", QRegExp("[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}"), "タイトルは正しいIPアドレスではありません。");
```

##動的なケース
` bool FooValidator::validate(const QVariantHash &hash)` を使用する。