OmniAICreator/Qiita-1.07M huggingface dataset:
git の push.default 設定を理解する

git のコマンド入力をサボったら、以下のようなメッセージが。

```shell-session
$ git push
warning: push.default is unset; its implicit value is changing in
Git 2.0 from 'matching' to 'simple'. To squelch this message
and maintain the current behavior after the default changes, use:

  git config --global push.default matching

To squelch this message and adopt the new behavior now, use:

  git config --global push.default simple

See 'git help config' and search for 'push.default' for further information.
(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode
'current' instead of 'simple' if you sometimes use older versions of Git)
```

大抵は、フルで(refspec までは書かないけど) 入力していたけど、安全に楽できそうな気がしたので、設定値を調べてみた。

## push.default の設定値
### nothing

サボれないようにするための設定。必ず指定する必要がある。

### matching

現行バージョンのデフォルト。ローカルとリモートで同じ名前のブランチがあったら、根こそぎ push する。カレントだけではないので、意図しないものまで push されちゃう。

### upstream(旧名 tracking)

カレントブランチに追跡ブランチが設定されている場合に、追跡ブランチに対して push する。

### simple

Git 2.0 でデフォルトになる予定のもの。カレントブランチに追跡ブランチが設定されている、かつローカルとリモートのブランチ名が同じである場合に、追跡ブランチに対して push する。

### current

カレントブランチと同名のリモートブランチがあれば、そこに push する。

---
これまで事故は起きなかったけど、今後は追跡ブランチの設定をしようかな〜 と思う次第。追跡ブランチの設定方法は、幾つかあるので、現況に応じて使い分ける。

### ローカルブランチ作成のタイミングで設定

```shell-session
$ git checkout -t origin hogehoge
  or
$ git checkout --track origin hogehoge
```

### リモートブランチ作成のタイミングで設定

```shell-session
$ git push -u origin hogehoge
  or
$ git push --set-upstream origin hogehoge
```

### 既に存在するブランチに設定する

Git 1.7.x スタイル

```shell-session
$ git branch --set-upstream hogehoge origin/hogehoge
```

Git 1.8.x スタイル

カレントブランチが hogehoge の場合

```shell-session
$ git branch -u origin/hogehoge
  or
$ git branch --set-upstream-to=origin/hogehoge
```

ローカルブランチも指定する場合、

```shell-session
$ git branch -u origin/hogehoge hogehoge
  or
$ git branch --set-upstream-to=origin/hogehoge hogehoge
```

もっと前？

```shell-session
$ git branch -t hogehoge origin/hogehoge
  or
$ git branch --track hogehoge origin/hogehoge
```

---

といろいろあるけど、track という言葉は使わず upstream へ向かっているようなので、これから覚えるならそっちなんでしょうね。
asyncって案外すぐ書ける

超小ネタ。

callback地獄っぽくなってきたけど、ライブラリ使うほどじゃないなーって感じだったので、
async(functionの配列を渡して、それぞれcallbackされたら次のを実行)を自前実装してみたら、
あんがい短かった。

```
// 簡易な非同期処理                                                                   
var async = function (fns) {
    (function exec (index) {
        if (!fns[index]) {
            return;
        }
        fns[index](function () {
            exec(index + 1);
        });
    })(0);
};
```

だいたいは使うとしてもこれだけだし、(waterfallとか使いだすとむしろややこしい)
これをコピペできるようにしておくだけでも十分かも。

## 参考
- [async](https://npmjs.org/package/async)
- [heavylifters/deferred-js](https://github.com/heavylifters/deferred-js)
[Unity]Booの関数メモ

# ジェネリック関数

## Booでジェネリック関数の宣言と、C#（など）で書かれたジェネリック関数の呼び出し

```boo:
def aMethod[of T](anObject):
    CSharpClass.callMethod[of T](anObject)
```

C#だと[T]とするところを、[of T]のように'of'をつけるらしい。

## 型引数に制限をつける

C#だと、

```csharp:
void foo<T>()
  where T: Exception
{
  // 処理
}
```

のように、where句でTの型を、ある型のサブクラスに制限をすることが出来るが、
Booでは以下のようにすればコンパイルはとおるようだ。

```boo:
def foo[of T(Exception)]():
    // 処理
```

# 可変長引数

```boo:
def foo(format as string, *args):
    System.String.Format(format, *args)
```

可変長引数を受け取る場合、引数名の前に'*'をつける。
また、受け取った引数をC#などで書かれた可変長引数を受け取る関数に、引数の値をそのまま渡す場合にも、'*'をつける。

# delegate

C#におけるdelegateは、Booではcallableと呼ぶらしい。
[https://github.com/bamboo/boo/wiki/Callable-Types](https://github.com/bamboo/boo/wiki/Callable-Types)

## callableの定義

これは、ほぼC#のdelegateと同じように使える。
以下の２つの文は同じ意味になる（と思われる）。

```boo:Boo
callable MyCallable(param1 as int, param2 as int) as bool
```

```csharp:C#
delegate bool MyCallable(int param1, int param2);
```

## callableの使い方

```boo:Boo
// callableの定義
callable MyCallable(aString as string)

// MyCallableを引数にとる関数caller
def caller(method as MyCallable):
    method("Hello, world")

// callerにMyCallableオブジェクトを渡す
caller( MyCallable({ s | print(s) }) )
```


# 例外送出

関数ではないが、ついでに調べたので。。。

例外を送出する場合には、raiseを使う。

```boo:
raise SomeException()
```

Javaなどのように、new する必要はない。
TypeScriptでEventDispatcherを作る

TypeScriptの勉強がてらよく使うクラスを実装してみた。

```ts:
interface ICustomEvent {
	type:string;
	data:Object;
	timeStamp:number;
	defaultPrevented:boolean;
}

class CustomEvent implements ICustomEvent {
	data:Object;
	timeStamp:number;
	defaultPrevented:boolean = false;
	constructor (public type:string) {
		this.timeStamp = new Date().valueOf();
	}
	preventDefault () {
		this.defaultPrevented = true;
	}
}

interface IEventListenerList {
	[index:string]:(e:Event) => any;
}

interface IEventDispatcher {
	on(type:string, listener:(e:Event) => any):void;
	off(type:string, listener:Function):void;
	trigger(type:string, data:Object):boolean;
}

class EventDispacther implements IEventDispatcher {
	private _listeners:IEventListenerList = {};
	on (types:string, listener:(e:Event) => any):void {
		var typeList:string[] = types.split(/\s+/);
		var i:number = 0;
		var l:number = typeList.length;
		for (; i < l; i++) {
			this._listeners[typeList[i]] = listener;
		}
	}
	off(types:string, listener?:Function):void {
		var typeList:string[] = types.split(/\s+/);
		var i:number = 0;
		var l:number = typeList.length;
		var type:string;
		for (; i < l; i++) {
			type = typeList[i];
			if (listener == null || this._listeners[type] === listener) {
				delete this._listeners[type];
			}
		}
	}
	trigger(type:string, data:Object = {}, context:any = this):boolean {
		var listener:Function;
		if (listener = this._listeners[type]) {
			var e:CustomEvent = new CustomEvent(type);
			e.data = data;
			listener.call(context, e);
			return !e.defaultPrevented;
		}
		return true;
	}
}

```

Javaや(本格的な)ActionScript3未経験な僕とってinterfaceの実装というか概念がこれであってるのかあやふや。

`listener`の第一引数を`Event`型にしてるのに、実際渡すものは`CustomEvent`型でもコンパイル通るあたり、これでいいのかよくわっていない。


* * *

`IEventListenerList `というinterfaceを作って、シグニチャの代わりみたいに扱っているけど、これもこれで使い方があってるのか疑問…。

* * *

まだまだよくわっておりません！
PhpStormのInspection警告を制御する

PhpStormのInspectionは、型がなかったりスクリプトだったりするPHPなのに、いろいろ厳しくバグの可能性を見てくれてありがたいのですが、ちょっと変わったトリックを使うとすぐに警告まみれになってしまいます。一気にチェックしたとき、いちいち警告の中を見て「これは大丈夫なコードだったはず」と除外してレポートを読むのが面倒です。

たとえば、クラスローダやビューなどで、include/require のパスに変数を使うなどすると、Inspection で Unresolved include が出てしまいます。これは include するファイルがないかもしれないという警告です。平易なPHPスクリプトを書いているときはありがたいのですが、フレームワークレベルの開発では邪魔になります。チェックしないようオフにしてしまうのはもったいないので、特定の箇所でだけ警告が出ないようにしたいです。

```php:
<?php
class MyClassLoader
{
    public function load($class)
    {
        // ...

        /** @noinspection PhpIncludeInspection */
        require_once dirname(__FILE__) . '/' . $classFile;
    }
}
```

このアノテーションを挿入すると、そこでだけ警告を出さないようになります。

例の豆電球から `Inspection 'Unresolved include' options` > `Suppress for statement` でも挿入できます。

また、メソッド内で includeを呼び、その外部ファイルで使うためのローカル変数を設けるなどした場合、本当は必要なのに、使われていない変数があるという意味の、Unused local valiable 警告が出ます。

```php:
<?php
class MyPageRenderer
{
    public function render($view)
    {
        // ...

        /** @noinspection PhpUnusedLocalVariableInspection */
        $helper = new MyViewHelper($this); // 下のrequireで使われる変数

        /** @noinspection PhpIncludeInspection */
        require dirname(__FILE__) . '/' . $viewFile;
    }
}
```

これも例の豆電球から `Inspection 'Unresolved local valiable' options` > `Suppress for statement` で挿入できます。

便利なのはだいたいこのあたりでしょうか。

ほか、`@noinspection` には PhpUnusedParameterInspection という、パラメータ未使用の場合に使うものもありました。`func_get_args()` を使った可変長引数をやっている場合などに有効かもしれません。ただ、メソッド宣言のカッコの中に書かないといけないので、これは逆にちょっとうるさいかもしれませんね。

他にも、こんなのもあるみたいなので、意図しない警告が出たら試してみてください。

- PhpUndefinedFunctionInspection
- PhpUndefinedConstantInspection
tmuxでウィンドウを閉じた時にインデックス番号を詰めるには renumber-windows on を設定する


次のように3つウィンドウを開いていた時に

```
1:foo-  2:bar*  3:baz
```

2番を閉じると、次のように2番が欠番してしまう

```
1:foo*  3:baz
```

この状態で新しいウィンドウを開くと2番にウィンドウが作られてしまう。

個人的にこのふるまいが馴染めず、下記のように3番が2番に付番し直されるふるまいを期待していた

```
1:foo*  2:baz
```

tmux 1.7以上では、ウィンドウを閉じた時にインデックス番号を振り直す設定ができる、設定のしかたは、`~/.tmux.conf` に下記の1行を追加する

```~/.tmux.conf
set-option -g renumber-windows on
```
drobo-utilsをcentosで動かす

http://drobo-utils.sourceforge.net
http://sd.pot.co.jp/2011/07/08/using-a-drobo-on-linux-j

yum -y install python-ctypes

が必要

git clone git://drobo-utils.git.sourceforge.net/gitroot/drobo-utils/drobo-utils

gitで持ってくる

./drobom status

mkfs -t ext3 /dev/sdb1

ex4ではなくext3で。
Capistrano実行時にEC2とかRDSを引っ張ってきてRole設定する

# 想定環境

* AutoScalingされたりしてるアプリケーション用EC2インスタンス tagに`app:true`と設定
* RDSはMasterとRead Replicaが複数台

# やってること
* EC2はIPアドレスをとってきてRole設定。稼働中かつ`app:true`としたサーバがデプロイ対象になる。
* RDSはtagに対応していないので、Masterか否かを判断してendpointでアクセス。

# 必要なもの
[AWS SDK for Ruby](http://aws.amazon.com/jp/sdkforruby/)

# 環境変数

```shell-session:
$ export AWS_ACCESS_KEY_ID="xxxxxxxxxxxxxxxxx"
$ export AWS_SECRET_ACCESS_KEY="xxxxxxxxxxxxxx"
$ export EC2_URL="http://ec2.ap-northeast-1.amazonaws.com"
```

# Roleの設定

```rb:production.rb
require 'aws-sdk'

set :aws_access_key_id,     ENV['AWS_ACCESS_KEY_ID']
set :aws_secret_access_key, ENV['AWS_SECRET_ACCESS_KEY']

#EC2
if ENV['EC2_URL']
  ec2=AWS::EC2.new(:ec2_endpoint => ENV['EC2_URL'].sub(/^https?:\/\//,""))
else
  ec2=AWS::EC2.new
end
instances = ec2.instances.select {|instance| instance.tags[:app] == 'true' && instance.status == :running}.map(&:private_ip_address)

role :app,  *instances, :behind_loadbalancer => true

#RDS
if ENV['EC2_URL']
  rds=AWS::RDS.new(:rds_endpoint => ENV['EC2_URL'].sub(/^https?:\/\/ec2/,"rds"))
else
  rds=AWS::RDS.new
end

rds_master = rds.instances.select {|instance| instance.read_replica_source_db_instance_identifier == nil }.map(&:endpoint_address)
rds_slave = rds.instances.select {|instance| instance.read_replica_source_db_instance_identifier != nil   }.map(&:endpoint_address)

role :db_host, *rds_master, :no_release => true, :primary => true, :name => "default", :rds => true
rds_slave.each_with_index{ |slave, i| @slave_num = i + 1 
role :db_host, slave, :no_release => true, :name => "slave" + @slave_num.to_s }
```

# 参考

[CapistranoでELB配下のEC2インスタンスを取得してデプロイ](http://qiita.com/STAR_ZERO/items/0131c542a8951de557fd)
[eXcale | Blog : CapstranoでAWSのAPIを使って実行時にroleを設定する](http://blog.excale.net/index.php/archives/351)
PhpStorm 7 EAP 130.1481 の Vagrant 対応を試してみた。

PhpStorm EAP 130.1481 で Vagrant 対応を試してみました。
http://blog.jetbrains.com/phpstorm/2013/08/phpstorm-7-0-eap-130-1481/

vagrant コマンドのラッパーで、VMの起動、終了（ up / reload / suspend / halt / destory ）ができます。

「Init in Project Root」（ vagrant init のラッパー）で Vagrantfile が作れます。 ただ選択した box ファイル名にプロバイダー名が含まれている`centos64(virtualbox)`ので、そのままでは起動できませんでした。

```rb::Vagrantfile
config.vm.box = "centos64_ja  (virtualbox)"
```

プロバイダー名を除けば、起動できます。

```rb::Vagrantfile
config.vm.box = "centos64_ja"
```


下記の issue から実装されたようなので、VM の起動、終了を IDE からできるようにした機能のようです。
http://youtrack.jetbrains.com/issue/WI-15874
Cloud Watch カスタマイズ on Cent5.6

以下、記事にしたがって、Cloud Watchをカスタマイズしようと思った。
http://thinking.ne.jp/2013/01/aws-cloudwatch-ec2/

ら、２点つまったメモ。
①jdkが入ってなかったぽいので、install

```
yum install java-1.7.0-openjdk-devel
```

②crontab -eするとなんか起こられたので、以下実行。

```
[root@vpsadmin ~]# touch ~/.bashrc
[root@vpsadmin ~]# export VISUAL=vim
[root@vpsadmin ~]# source ~/.bashrc
```

以上。
Node.js/Expressでのシンプルなファイルのアップロード

基本的に以下のページと同じ内容です。

Node.js/ExpressJSでのファイルのアップロード
http://d.hatena.ne.jp/zebevogue/20120828/1346140796

ただし、何カ所か修正する必要がありました。

###expressコマンド

```
$ express upload
$ cd upload
$ npm install
$ mkdir uploads
```

流れとしては
1. ```get '/'```で **routes/index.js#index** が呼ばれてフォームを表示し、
2. ```post 'upload'```で **routes/upload.js#upload** が呼ばれてアップロードされたファイルを処理する
という感じで良い。

まず1.からやる。

###app.jsを編集する

下記のように編集する

```js:app.js
var routes = {
	index  : require('./routes/index'),
};
...
app.get('/', routes.index.index);
...
```

###routes/index.js

個人的趣味でCoffeeScriptで書いた。```-b```オプションを付けた```coffee -bcw index.coffee```コマンドで変換するので、 **app.js** からでも中まで見える。というか、デフォルトそのまま。

```coffeescript::index.coffee
exports.index = (req, res) ->
  res.render 'index',{
    title: 'Express'
  }
```

```js:index.js
exports.index = function(req, res) {
  res.render('index', {
    title: 'Express'
  });
};
```

参照する **index.jade** テンプレートにフォームを記述する。

```jade:index.jade
extends layout

block content
  form(method="post", enctype="multipart/form-data", action="/upload")
    input(type="file", name="thumbnail")
    input(type="submit")
```

これでフォームが見えるはず。

![スクリーンショット 2013-08-14 11.15.18.png](https://qiita-image-store.s3.amazonaws.com/0/12939/1b9f1ac9-e909-62e2-2668-de3830071822.png)

次に2.をやる

###app.js

```js:app.js
var routes = {
	index  : require('./routes/index'),
	upload : require('./routes/upload')
};
...

app.configure(function(){
	...
	//app.use(express.bodyParser());
	app.use(express.bodyParser({uploadDir:'./uploads'}));
	...
});

app.get('/', routes.index.index);
app.post('/upload', routes.upload.post);
...
```

###routes/upload.js

```coffeescript:upload.coffee
fs = require 'fs'
exports.post = (req, res) ->
  # 一時ファイルのパス
  tmp_path = req.files.thumbnail.path
  # public以下に置くパス
  target_path = './uploads/' + req.files.thumbnail.name
  # public以下に移動
  fs.rename tmp_path, target_path, (err) ->
    if err then throw err
    # 一時ファイルを削除
    fs.unlink tmp_path, ->
      if err then throw err
      res.send 'File uploaded to: ' + target_path + ' - ' + req.files.thumbnail.size + ' bytes'
```

```js:upload.js
var fs;

fs = require('fs');

exports.post = function(req, res) {
  var target_path, tmp_path;
  tmp_path = req.files.thumbnail.path;
  target_path = './uploads/' + req.files.thumbnail.name;
  fs.rename(tmp_path, target_path, function(err) {
    if (err) {
      throw err;
    }
    fs.unlink(tmp_path, function() {
      if (err) {
        throw err;
      }
      res.send('File uploaded to: ' + target_path + ' - ' + req.files.thumbnail.size + ' bytes');
    });
  });
};
```

これで以下のようにアップロードできるようになる。

![スクリーンショット 2013-08-14 11.18.54.png](https://qiita-image-store.s3.amazonaws.com/0/12939/4b69bd93-f030-34c7-a346-11f977b078b7.png)

-----
ブログやってます：[PAPA-tronix !](http://weed.cocolog-nifty.com/wzero3es/)
CSVファイルをオブジェクト指向な感じで取り扱う方法

次のようなCSVファイルがあったとします。

```
日付,商品コード,数量
2013-08-01,12345,1
2013-08-01,23456,2
2013-08-02,34567,1
```

このファイルをPHPでいい感じに取り扱えるコードを書いてみました。

```php:ImportCsv.php
<?php
class ImportCsv 
{
    protected $date;
    protected $code;
    protected $quantity;

    public function getDate()
    {
        return $this->date;
    }

    public function setDate($date)
    {
        $this->date = $date;
    }

    public function getCode()
    {
        return $this->code;
    }

    public function setCode($code)
    {
        $this->code = $code;
    }

    public function getQuantity()
    {
        return $this->quantity;
    }

    public function setQuantity($quantity)
    {
        $this->quantity = $quantity;
    }

    public function getLine()
    {
        $ret = array();

        foreach (self::getSupportedColumns() as $columnName) {
            $ret[] = !is_null($this->$columnName) ? $this->$columnName : '';
        }

        return self::convertArrayToCsv($ret);
    }

    public function setLine($line, $layout = null)
    {
        $columns = self::getSupportedColumns();

        if (is_null($layout)) {
            $layout = self::getHeader();
        }

        if (count($line) !== count($layout)) {
            throw new \InvalidArgumentException('Invalid CSV layout is given');
        }

        foreach ($layout as $key => $column) {
            if (array_key_exists($column, $columns)) {
                $property = $columns[$column];
                $this->$property = trim($line[$key]);
            }
        }
    }

    public static function getHeader()
    {
        return self::convertArrayToCsv(array_keys(self::getSupportedColumns()));
    }

    public static function getSupportedColumns()
    {
        return array(
                '日付' => 'date',
                '商品コード' => 'code',
                '数量' => 'quantity'
        );
    }

    protected static function convertArrayToCsv(array $datas)
    {
        $delimiter = ',';

        $csv = array();
        foreach ($datas as $data) {
            $csv[] = '"' . str_replace('"', '""', $data) . '"';
        }

        return implode($delimiter, $csv);
    }
}
```

で、読み込むときは

```php:AwesomeAction.php
<?php
    // CSVファイルをUTF-8に変換し、テンポラリファイルに展開
    $buffer = preg_replace("/\r\n|\r|\n/", "\n", mb_convert_encoding(file_get_contents($path), 'utf-8', 'SJIS-win'));
    $fp = tmpfile();
    fwrite($fp, $buffer);
    rewind($fp);

    // CSVファイルを読み込み
    $header = fgetcsv($fp);

    while ($line = fgetcsv($fp)) {
        $csv = new ImportCsv();
        $csv->setLine($line, $header);

        $ret[] = $csv;
    }

    fclose($fp);

    // 取り込んだデータを利用
    foreach ($ret as $row) {
        var_dump($row->getDate());
        var_dump($row->getCode());
        var_dump($row->getQuantity());
    }
```

で、書き込むときは

```php:AwesomeAction.php
 <?php
   $fp = fopen($path, 'wb');

    // ヘッダを書き込む
    fwrite($fp, ImportCsv::getHeader() . "\r\n");

    // データを書き込む
    fwrite($fp, $csv->getLine() . "\r\n");
```
local のファイルを remote のブラウザで attach_file させるには

## 環境想定

`capybara` + `selenium-webdriver` でリモートマシンのブラウザを用いて実行しているとき

※ 一応 `selenium-webdriver` は 2.34.0 で確認していますが、きっと前のバージョンでも使えると思います

## 目的

1. `Capybara::Node::Actions#attach_file`  でファイル添付を行いたいと考える

    ```rb:
    attach_file('import', '/home/gongo/fixtures/hoge.csv')
    ```

2. ブラウザがローカルで動いている分には問題ない。
3. ブラウザがリモートで動いている場合に失敗する。なぜならリモートマシンに `/home/gongo/fixtures/hoge.csv` が **存在しないから**

対応策としては、リモートマシンにも `/home/gongo/fixtures/hoge.csv` を配置しておけばいい。しかし……

* 並列化のためリモート環境を大量に準備したい → 配置めんどい
* もしリモート環境が Windows だったら → いちいちリモート環境に併せてパスの記述を変えたくない(`C:\Users\gongo\fixtures/hoge.csv` みたいに)
    * 実は `/path/to` 形式でもよしなにしてくれるんですかね……

## 対策

`Selenium::WebDriver::Driver#file_detector` を使います。

```rb:
Capybara.register_driver :remote_windows do |app|
  # リモートマシンのブラウザを使う場合によくやる設定
  caps = Selenium::WebDriver::Remote::Capabilities.internet_explorer
  url  = "http://#{host}:#{port}}/wd/hub/"
  opts = { desired_capabilities: caps, browser: :remote, url: url }
  driver = Capybara::Selenium::Driver.new(app, opts)

  # ここからが本題。driver を返す前に ↓ をしておく。
  driver.browser.file_detector = lambda do |args|
    str = args.first.to_s
    str if File.exist? str
  end

  driver
end
```

この設定をすることで、 `attach_file` に指定したファイルが selenium webdriver の機能で **リモートマシンに転送** され、リモートマシンのブラウザからアクセスできるようになります。

補足ですが、`lambda` の書き方的には

1. まずは `attach_file` で指定されたファイルを **ローカルマシンで検索**
2. ローカルになかった場合、今度は **リモートマシンで検索**
3. どっちにも無かったら `raise Capybara::FileNotFound`

となります

## 参考

別記事でもまとめてあります。

http://gongo.hatenablog.com/entry/2013/07/24/210526
LibreOffice”を最後に開いたとき、ウインドウの再開中にアプリケーションが突然終了しました。もう一度ウインドウを再開しますか？ が消えない


Macの場合の解決策。
要するに状態を保持している一時ファイルが駄目になっているので、それを直接消してやればいい

 + LibreOfficeを終了（強制終了）しておく 
 + Finderでライブラリを開く （Finderの移動メニューを押して、Optionキーをおすとでてくる）
 + `Saved Application State` というディレクトリの `org.libreoffice.script.savedState`というディレクトリを開く
 + 中のファイルを全部消す（多分全部消さなくてもいいけど、不明）

OpenOfficeでもディレクトリ名などが違うだけで多分同じ。
ドットインストールを使わない手はない


http://dotinstall.com/

「3分動画でマスターするプログラミング学習サイト」を謳うこのサイト、実に素晴らしい。動画コンテンツなので、ググってもなかなか出てこない。

すべて入門編とはいえ、扱っている言語の範囲が恐ろしく広く、LuaやScratch、大昔のBasicまである。ないのはlisp, scheme系ぐらいか。

言語にとどまらず、Unixの基本操作や、PHP+SQLローカル開発環境の構築方法や、Git、Sublime TextやVim、Emacsの使い方まである。

たとえばCoffeeScriptは、3分足らずの動画が13で、小一時間で終わる分量。
http://dotinstall.com/lessons/basic_coffeescript

何かの言語の概要を急いで習得したい場合や、独学で習得した項目の漏れを確認する場合に非常にありがたい。

http://webhoo.net/2013/04/01/dotinstall-3-study-method/
Qiitaで画像埋め込みしたエントリを投稿する時、プレビューと投稿した結果で見た目が違う

画像埋め込んだ時のプレビュー
![スクリーンショット 2013-08-14 0.40.17.png](https://qiita-image-store.s3.amazonaws.com/0/94/6a543d10-6a2f-4449-d188-7579ebbaa2d8.png)

画像埋め込んで実際投稿したやつ
![スクリーンショット 2013-08-14 0.39.48.png](https://qiita-image-store.s3.amazonaws.com/0/94/d3cacfe7-c237-e2ec-37bb-dec56cc9eb50.png)

もちろん改行する箇所が違うとかそういうのじゃなくて、画像に枠線あるかないかが違いました。

http://qiita.com/takc923/items/7094f9a05bf940d82c42
このエントリを編集してる時にプレビュー見て、画像とテキストの境界が分かりづらいと思って水平線挟んだりしたんでけど実際投稿すると枠線あって見やすかったから結局またその水平線を消すことになりましたという話。
マウスやトラックパッドを使わずブラウザで表示されているテキストを選択・コピーする方法

出来る限り手を動かさずに全てを完結させたいと願うのは多くのプログラマーの願いだと思います。僕もその1人です。
今日その願いの実現に一歩近づきました。タイトルに書いてあることを実現する方法があることに気づいたのです。

やり方は簡単。
例えば↓のようなページ開いていて、「僕は普段MacのiTerm2使ってるんですけど」のところをコピーしたいと思った時、

![](https://qiita-image-store.s3.amazonaws.com/0/94/b9f077f7-bc48-0d71-11c9-4ff1120d7c78.png)

Command + Fのページ内検索で「僕は」を検索して↓こういう状態にします

![](https://qiita-image-store.s3.amazonaws.com/0/94/a761a68b-3144-f128-c520-e90d043695cb.png)

でEscapeを押して検索を終了する

![](https://qiita-image-store.s3.amazonaws.com/0/94/87d5b8e3-d796-512c-e633-d47dca49da59.png)


この状態でShift + 右キー押すとこうなる

![](https://qiita-image-store.s3.amazonaws.com/0/94/5a4cbf1e-bac6-a108-6032-03f7094c3a45.png)

あとはShift押しながら上下左右キーで希望の選択範囲を選んでCommand+Cでコピー完了。

![](https://qiita-image-store.s3.amazonaws.com/0/94/a254d6cd-fabe-593d-c767-e72fe3a0b1c3.png)

ね、簡単でしょう？

実際普段からこのテクニックを使うかどうか分かりませんけど！

※MacのChrome, Safariで動作確認済み。
vimでtodoリストを書くためのtips

vimでmarkdown書ける前提で、以下のような設定を書くと`- [ ]`のようなtodoリスト記法をラクに書いたり、Leader（デフォルトだと`\`）でオン・オフを切り替えられるようになる。

```vim:.vim/ftplugin/markdown.vim
" todoリストを簡単に入力する
abbreviate tl - [ ]

" 入れ子のリストを折りたたむ
setlocal foldmethod=indent

" todoリストのon/offを切り替える
nnoremap <buffer> <Leader><Leader> :call ToggleCheckbox()<CR>
vnoremap <buffer> <Leader><Leader> :call ToggleCheckbox()<CR>

" 選択行のチェックボックスを切り替える
function! ToggleCheckbox()
  let l:line = getline('.')
  if l:line =~ '\-\s\[\s\]'
    let l:result = substitute(l:line, '-\s\[\s\]', '- [x]', '')
    call setline('.', l:result)
  elseif l:line =~ '\-\s\[x\]'
    let l:result = substitute(l:line, '-\s\[x\]', '- [ ]', '')
    call setline('.', l:result)
  end
endfunction
```
アンチエイリアスを無効にする


以下ファイルを作成した後、Xのアプリを起動すると
アンチエイリアスが無効になっていることを確認できます。

```xml:$HOME/.fonts.conf
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
  <match target="font">
    <edit name="embeddedbitmap" mode="assign">
      <bool>true</bool>
    </edit>
    <edit name="antialias" mode="assign">
      <bool>false</bool>
    </edit>
  </match>
</fontconfig>
```
メモ: proxmox3.3

# インストールオプション

/を10GB,swapを4gbの設定でインストール

* `linux ext4 maxroot=8 swapsize=2`
* `linux ext4 maxroot=10 swapsize=4`

# インストール時の注意

* ProxmoxをすでにインストールしているHDDも同時に接続している場合はセットアップができない(パーティション分割でエラーになる。)
  * /dev/sda・・・インストールしたいHDD
  * /dev/sdb・・・すでにインストール済みのHDD

* Proxmox起動時に旧HDDを接続したままだとそちら側で認識されるため注意。


## もしGPTをmbrに変換したい場合

HDDのデータは消えるので注意！

* [Linux - GPTをmbrに変換 - Qiita](http://qiita.com/tukiyo3/items/02297a75648cb8bd2659)

# templateリスト
```bash:openVZのtemplateリストをupdateしとく
# pveam update
```

```bash:webuiのpatch
$ wget -q https://raw.github.com/tukiyo/proxmox/master/pvemanagerlib.js.patch.3 && \
sudo patch /usr/share/pve-manager/ext4/pvemanagerlib.js < pvemanagerlib.js.patch.3
```

* [openvzのテンプレート](http://openvz.org/Download/template/precreated)
* [slideshareでの解説](http://www.slideshare.net/masahide_yamamoto/osc2011-nagoya)
xmonadメモ


インストール
====

```bash:
$ sudo apt-get install xmonad
```

キーバインド
====

| キー | 説明 |
|:-----------|:------------|
| mod-shift-return  | ターミナルを起動 | 
| mod-p             | dmenuを起動(キーワードランチャ) | 
| mod-shift-p       | gmrunを起動(キーワードランチャ) | 
| mod-shift-c       | フォーカスウィンドウを閉じる | 
| mod-space         | レイアウトアルゴリズムを変更する(縦分割→横分割→フル)   | 
| mod-shift-space   | レイアウトアルゴリズムをデフォルトに戻す | 
| mod-n             | フォーカスウィンドウを正しいサイズに戻す | 
| mod-tab/shift-tab | ウィンドウフォーカスを移動 | 
| mod-j/k           | ウィンドウフォーカスを移動 | 
| mod-m             | マスターウィンドウへフォーカスを移動 | 
| mod-return        | フォーカスウィンドウをマスターパネルとスワップ | 
| mod-shift-j/k     | フォーカスウィンドウを隣りのウィンドウとスワップ | 
| mod-h/l           | マスターパネルのサイズ比率を狭める/広げる | 
| mod-t             | フローティングウィンドウをタイルに戻す | 
| mod-,/.           | マスターエリアのウィンドウ数を増やす/減らす | 
| mod-b             | ステータスバーのギャップをトグルする | 
| mod-shift-q       | Xmonadを終了 | 
| mod-q             | Xmonadを再起動 | 
| mod-1~9           | ワークスペースを切り替え | 
| mod-shift-1~9     | フォーカスウィンドウを指定ワークスペースへ移動 | 
| mod-w/e/r         | スクリーンを切り替え(1, 2, 3) | 
| mod-shift-w/e/r   | フォーカスウィンドウを指定スクリーンへ移動(1, 2, 3) | 
| mod-button1       | ウィンドウのフローティングと移動 | 
| mod-button2       | フローティングウィンドウを最前面に移動 | 
| mod-button3       | フローティングウィンドウのリサイズ |

config
----

* ~/.xmonad/xmonad.hs
* Alt+1,2,3・・・ で別のWindow番号に移るのを抑止したいな・・・
i3 window manager (tile base)

## 参考

* [i3 - ArchWiki](https://wiki.archlinuxjp.org/index.php/I3)

* xmonadやwmiiよりずっとインストールされるパッケージ数少ない。
* 以前はnotion使ってました。

## package

```bash:
sudo apt-get install -y i3 i3status
```

## i3 を起動直後、keyrepeat速度を変更


```bash:~/.xinputrcに追記
xset r rate 200 30
```

## config

* 自分の[~/.i3/config](https://github.com/tukiyo/.i3.git)
* http://dotshare.it/category/wms/i3/ に気合の入ったものが沢山あるので参考になります。
zabbix2のagentをopen solaris11にインストール

はじめに
====
* バイナリが用意されていないため、[最新版のソースをダウンロード](http://www.zabbix.com/download.php)
* [4 Installation from sources](https://www.zabbix.com/documentation/doku.php?id=2.0/manual/installation/install)
* [1 Database creation scripts](https://www.zabbix.com/documentation/2.0/manual/appendix/install/db_scripts)

```bash:alias
$ alias sudo='pfexec'
```

ソースからビルド
====

```bash:ビルド
$ ./configure  \
  --prefix=/opt/zabbix-2.0.7/  \
  --enable-agent
$ sudo make install
```


データーベースの準備
====

```bash:データベースの準備
$ sqlite3 zabbix.sqlite < database/sqlite3/schema.sql
$ sqlite3 zabbix.sqlite < database/sqlite3/images.sql
$ sqlite3 zabbix.sqlite < database/sqlite3/data.sql
$ sudo mkdir /opt/zabbix-2.0.7/var/
$ sudo cp -p zabbix.sqlite /opt/zabbix-2.0.7/var/
$ sudo chmod -R 777 /opt/zabbix-2.0.7/var/
```

webインターフェースの設定
====

```bash:webインターフェースのコピー
$ cp -a frontends/php/ /var/apache2/2.2/htdocs/zabbix/
$ sudo chown webservd:webservd /var/apache2/2.2/htdocs/zabbix/conf/
```

起動
====

```bash:zabbix_server起動
$ cd /opt/zabbix-2.0.7
$ sbin/zabbix_server -c /opt/zabbix-2.0.7/etc/zabbix_server.conf
$ sbin/zabbix_agentd -c /opt/zabbix-2.0.7/etc/zabbix_agentd.conf
```

log
====

* /tmp/zabbix_agentd.log
* /tmp/zabbix_server.log
MSゴシックを使う

* windows の MSゴシックは全体の統一感があり、Linuxのフォントのように高さにバラつきがあるのをアンチエイリアスで誤魔化したりせず、文字を読むのに適しています。

フォントの取得
====

[jftp.inai.de](http://jftp.inai.de/openSUSE_12.3/src/) や [ftp.gwdg.de](http://ftp.gwdg.de/pub/linux/misc/suser-jengelh/openSUSE_12.3/src/) にある microsoft-japanese-fonts-2.31-4.2.src.rpm をダウンロード。

しかしこれを配布しているのはまずいと思うので[forum](http://forums.opensuse.org/japanese/aeaeoeez/)あたりで確認してください。

```bash:解凍
$ unar microsoft-japanese-fonts-2.31-4.2.src.rpm
$ unar microsoft-japanese-fonts.cpio
$ unar microsoft-japanese-fonts/jp.tar.xz
$ sudo mv jp.tar /usr/share/fonts/truetype/msfonts
```

/usr/share/fonts/truetype/msfonts/ ではなく$HOME/.fonts/ でも良いです。

```bash:フォント一覧に登録されたことを確認
$ fc-list | grep -i msfonts
/usr/share/fonts/truetype/msfonts/msgothic.ttc: MS UI Gothic:style=標準,Regular
/usr/share/fonts/truetype/msfonts/msmincho.ttc: ＭＳ Ｐ明朝,MS PMincho:style=標準,Regular
/usr/share/fonts/truetype/msfonts/msgothic.ttc: ＭＳ ゴシック,MS Gothic:style=標準,Regular
/usr/share/fonts/truetype/msfonts/msgothic.ttc: ＭＳ Ｐゴシック,MS PGothic:style=標準,Regular
/usr/share/fonts/truetype/msfonts/msmincho.ttc: ＭＳ 明朝,MS Mincho:style=標準,Regular
```

使い方
====

アプリケーション側のフォント選択画面で選択するだけ。
複数の数値型が混在する配列をキャストする

使うシーンが思いつきませんが。
以下のような配列の要素をすべてintにキャストしたい場合。

```csharp:Program.cs
var array = new object[]
{
    (int)0,
    (short)1,
    (double)2.0,
    (decimal)3.0
};
```

これでは例外が発生してしまいます。

```csharp:Program.cs
var intArray = array
    .Cast<int>()
    .ToArray();
```

そこでこんな拡張メソッドを用意します。

```csharp:EnumerableUtility.cs
public static class EnumerableUtility
{
    public static IEnumerable<TResult> DynamicCast<TResult>(this IEnumerable source)
    {
        if (source == null) throw new ArgumentNullException("source");
        foreach (dynamic item in source)
        {
            yield return (TResult)item;
        }
    }
}
```

これで大丈夫。
ただ、普通の Cast と比べて遅いです。

```csharp:Program.cs
var intArray = array
    .DynamicCast<int>()
    .ToArray();
```
郵便局が配布している郵便番号データCSVをそのままMySQLに取り込むには

自前で郵便番号から住所を引っ張ってくる画面やなんかを作る時に、ちょいちょい更新される郵便番号CSVを自動的に取り込みたい。

簡単なのは以下が前提

* 郵便局の[郵便番号データダウンロード](http://www.post.japanpost.jp/zipcode/download.html)ページからCSVをダウンロード
* mysqlのcharsetはUTF-8
* mysqlに作った郵便番号テーブルの項目は、CSVと合わせてある
* ダウンロードしたファイルは以下においてある

```
HOGEHOGE/ken_all_utf8.csv
```

コマンドラインでmysqlにつないで以下のSQLを実行

```sql:
mysql> LOAD DATA LOCAL INFILE 'HOGEHOGE/ken_all_utf8.csv'
    INTO TABLE PUB_ZIPCODE
FIELDS
	  TERMINATED BY ','
    OPTIONALLY ENCLOSED BY '"'
    ESCAPED BY ''
LINES
    STARTING BY ''
    TERMINATED BY '\r\n'
;
```

## 番外編
テーブルにID(auto_increment)カラムなんかをつけている場合は、流し込むカラムを指定してあげればよい。

例えば以下の場合は、先頭にID(auto_increment)カラムがついてる場合。自動的に採番されます。

```sql:
mysql> LOAD DATA LOCAL INFILE 'HOGEHOGE/ken_all_utf8.csv'
    INTO TABLE PUB_ZIPCODE
FIELDS
	  TERMINATED BY ','
    OPTIONALLY ENCLOSED BY '"'
    ESCAPED BY ''
LINES
    STARTING BY ''
    TERMINATED BY '\r\n'
(JIS_X0401_X0402,OLD_ZIPCODE,ZIPCODE,PREF_KANA,CITY_KANA,TOWN_KANA,PREF,CITY,TOWN,FLAG1,FLAG2,FLAG3,FLAG4,FLAG5,FLAG6)
;
```

LOAD DATAしてwarning等で全件入らなかった場合は、以下のSQLでwarning内容がわかります

```sql:
mysql> show warnings;
```
HerokuからGmailを送ろうとして「不正なログインがブロックされました」という警告メールが届いた場合の対処法


RailsのAction Mailerを用いて、Gmailでメールを送ろうとしたところ、ローカル環境ではメールが送れたのですが、Herokuからだとメールが送れない現象が発生しました。  
メール送信元のGmailアカウントを確認してみたところ、「不正なログインがブロックされました」という件名でメールが届いており、メールに書かれた手順に沿って、アプリケーションを許可することでHerokuからもメールが送れるようになりました。  

## 1. メールに記載されている下記リンクにアクセスします

```
このログインがご自身によるもので、アクセスできない場合は、http://support.google.com/mail?p=client_login でトラブルシューティングの手順を行ってください。 
```
## 2. ページに記載されている下記リンクにアクセスします

```
3. 引き続き問題が発生する場合は、http://www.google.com/accounts/DisplayUnlockCaptcha にアクセスし、Gmail のユーザー名とパスワードでログインします。必要であれば、歪んだ画像に表示されている文字を入力してログインを完了します。
```

![スクリーンショット 2013-08-10 21.32.15.png](https://qiita-image-store.s3.amazonaws.com/0/20250/de310948-ddea-f2a4-12d6-cfc431827070.png "スクリーンショット 2013-08-10 21.32.15.png")

## 3. 「次へ」をクリックします

![スクリーンショット 2013-08-10 21.32.28.png](https://qiita-image-store.s3.amazonaws.com/0/20250/166ea19f-e8a2-6603-f826-f87eca2cf76b.png "スクリーンショット 2013-08-10 21.32.28.png")

## 4. 下記ページを開いた状態で、Herokuからメールを送ります

![スクリーンショット 2013-08-10 21.32.39.png](https://qiita-image-store.s3.amazonaws.com/0/20250/6c9640ed-1a4a-e056-940c-7fff2839eff9.png "スクリーンショット 2013-08-10 21.32.39.png")

以上で、Herokuアプリからのメールが許可され、以降は問題なくメール送信ができるようになります。


# 参考
* https://twitter.com/yukibou65/statuses/296070160274558978
とあるページを要素分解

![](http://to-a.ru/7Dhyc5/img2)

iOSでWebサイトをクロールしてやろうと思いました。
HTMLのパーサはあまり無いようなので、正規表現でごりごりやってみました。

```objective-c
    NSString *html_ = [NSString stringWithContentsOfURL:url
                                              encoding:NSUTF8StringEncoding
                                                 error:nil];
    NSString *html = [html_ stringByReplacingOccurrencesOfString:@"\n"
                                                              withString:@""];
    [UIApplication sharedApplication].networkActivityIndicatorVisible=NO;
    // 正規表現の中で.*?とやると最短マッチするらしい。
    NSRegularExpression *regexp = [NSRegularExpression regularExpressionWithPattern:@"<h5><a.*? href=\"(.*?)\".*?>(.*?)</a></h5>"
                                                                            options:0
                                                                              error:nil];
    NSArray *arr = [regexp matchesInString:html
                                   options:0
                                     range:NSMakeRange(0, html.length)];
    for (NSTextCheckingResult *match in arr) {
        NSString *str1=[html substringWithRange:[match rangeAtIndex:1]];
        NSString *str2=[html substringWithRange:[match rangeAtIndex:2]];
    }
```
* Objective-cで正規表現やるならNSRegularExpressionを使う
 * 何も考えずに``<h5>.*</h5>``なんてすると、一番大きなくくりでとってきてしまう。``<h5>.*?</h5>``と、?を付けると最短マッチになる。
* マッチした部分はNSTextCheckingResultで取得できる
 * rangeAtIndex: にて、()でくくった範囲(NSRange)が取得できるので、元文字列からsubstringWithRangeする。

[NSRegularExpression Class Reference](https://developer.apple.com/library/mac/documentation/Foundation/Reference/NSRegularExpression_Class/Reference/Reference.html#//apple_ref/occ/instm/NSRegularExpression/numberOfMatchesInString:options:range:)
grunt-contrib-watchしてれば簡単にLiveReloadできる


ドキュメントを見て単純に気づいただけなのですがメモ代わりに。

GruntのLiveReload実現手段としてよく紹介されているgrunt-contrib-livereloadは現在deprecated扱いになっており、代わりにwatchタスクのオプションでLiveReloadが指定できるようになっています。

## 事前準備
* grunt-contrib-watchでwatchタスクを準備しましょう。
* LiveReload対応のブラウザ拡張をインストールしておきましょう。[How do I install and use the browser extensions? – LiveReload Help & Support](http://feedback.livereload.com/knowledgebase/articles/86242-how-do-i-install-and-use-the-browser-extensions-)を参考に。

## LiveReloadの設定方法と使い方

以下、詳しくは[gruntjs/grunt-contrib-watch](https://github.com/gruntjs/grunt-contrib-watch)をご参照くださいなのですが、とりあえず試したいという方向けにざっくり書いておきます。

watchが走ったときにliveReloadするなら、

```
grunt.initConfig({
  watch: {
    options: {
      livereload: true,
    },
    css: {
      (略)
    },
  },
});
```

のように、watchのoptionとして`livereload: true`としておけばOKです。あとは確認したいページを開き、ブラウザ拡張のボタンを押してwatch対象を更新すれば自動でリロードされます。簡単ですね！

ポート番号はデフォルトで`35729`が使用されるようです。変更したい場合は`livereload: ポート番号`と書けばOKです。

LiveReloadの対象を絞りたい場合は、たとえばCSSのみに絞るなら

```
watch: {
  css: {
    options: {
      livereload: true,
    },
    (略)
  },
},
```

のように、watchターゲットの中にoptionで指定しましょう。
Rubyでさくっと1st, 2nd, 3rd, 4thという文字列を作りたい！

小ネタです。

ActiveSupportならもう既に数字から"1st", "2nd"とかの文字列をきれいに作るなにかがあるに違いない。

と思ったらやっぱりありました。ordinalizeメソッド

```rb:
require 'active_support/core_ext/integer/inflections'


1.ordinalize
# => "1st"
2.ordinalize
# => "2nd"
3.ordinalize
# => "3rd"
4.ordinalize
# => "4th" 

# 2桁でもちゃんとやってくれる！
21.ordinalize
# => "21st"

#負の数でもいけちゃいました
-1.ordinalize
# => "-1st"
```

ちなみに

```rb:
(1.5).ordinalize
# NoMethodError: undefined method `ordinalize' for 1.5:Float
```
Floatには定義されてません。そりゃそうか。

あと、

```rb:
0.ordinalize
# => "0th"
```
0のときって"0th"なんだ！
「Chef + VagrantによるPHP5.3 + MySQL + nginxの開発環境」をもとにPHP5.4環境を。


「Chef + VagrantによるPHP5.3 + MySQL + nginxの開発環境」
http://www.engineyard.co.jp/blog/2013/chef-and-vagrant-gives-you-next-dev/

を元に、PHP5.4環境が欲しかったのでChefのレシピをちょいいじってみました。
元の
https://github.com/yandod/php5-nginx-vagrant-sample/blob/master/cookbooks/candycane_cookbook/recipes/default.rb
の頭に下記を追加


```ruby
execute "1st apt-get update" do
  command "apt-get update"
end

package "python-software-properties" do
  action [:install, :upgrade]
end  

execute "add ppa:ondrej/php5-oldstable" do
  command "add-apt-repository ppa:ondrej/php5-oldstable"
end 
```

add-apt-repository ppa:ondrej/php5-oldstable としてるのは、ppa:ondrej/php5だと、PHP5.5になっちゃうから。（1ヶ月ぐらい前はまだPHP5.4だったんですが）

どのバージョンのPHPを入れるとかをChefで指定するうまい方法って何かあるんでしょうかね？ながいこと使うとこのあたり問題になるケースもありそうな気がしてきてます…

最終的な default.rb は下記になります。

```ruby
execute "1st apt-get update" do
  command "apt-get update"
end

package "python-software-properties" do
  action [:install, :upgrade]
end  

execute "add ppa:ondrej/php5-oldstable" do
  command "add-apt-repository ppa:ondrej/php5-oldstable"
end 

execute "apt-get" do
  command "apt-get update"
end

packages = %w{git subversion nginx php5 php5-mysql php5-curl php5-cli php5-fpm php-pear mysql-server curl imagemagick php5-imagick}

packages.each do |pkg|
  package pkg do
    action [:install, :upgrade]
  end
end

execute "phpunit-install" do
  command "pear config-set auto_discover 1; pear install pear.phpunit.de/PHPUnit"
  not_if { ::File.exists?("/usr/bin/phpunit")}
end

execute "composer-install" do
  command "curl -sS https://getcomposer.org/installer | php ;mv composer.phar /usr/local/bin/composer"
  not_if { ::File.exists?("/usr/local/bin/composer")}
end

template "/etc/nginx/conf.d/php-fpm.conf" do
  mode 0644
  source "php-fpm.conf.erb"
end

service 'apache2' do
  action :stop
end

%w{mysql php5-fpm nginx}.each do |service_name|
    service service_name do
      action [:start, :restart]
    end
end
```

かなり悪戦苦闘したけど何とか欲しいモノが手に入ってよかった。
1ヶ月前にチャレンジしたときは、全然ダメダメだったんだが、少し理解がすすんだらしい。

##2013/08/23追記
php-fpm 関係のデフォルトがポート指定でなくソケットになったようで、そのままだと502 bad gateway となってしまったので、php-fpm.conf.erbもfastcgi_passだけ変更

```
        fastcgi_pass unix:/var/run/php5-fpm.sock;
```

これで動いた。
Padrinoを使ってみる


PadrinoはSinatraベースのRuby製フレームワークです。
日本語公式は[ここ](http://jp.padrinorb.com/ "Padrino")。

###インストール
```
% gem install padrino
```
以上。

###プロジェクトの作成
```
% padrino g project test_app -a mysql -d activerecord -e erb
```
test_appというプロジェクトを作成します。今回はオプションでMySQL、ActiveRecord、ERBを選択。
オプションは[公式](http://jp.padrinorb.com/guides/generators "Padrinoチュートリアル Generators")を参照してください。


###サーバ起動
```
% cd test_app
% padrino s
```
デフォルトではWEBrickですが、Gemfileで`gem 'thin'`のコメントアウトを外して、`bundle install`すれば、Thinが起動する。

###モデルの作成
```
% padrino g model user user_name:string
```
モデルとともに`db/migrate`にmigrationファイルも作成されます。

###マイグレーション
```
// migrate実行
% padrino rake ar:migrate

//ロールバック
% padrino rake ar:rollback

//migrationファイルを作成
% padrino g migration ChangeColumnHoges
```

###コントローラの作成
```
% padrino g controller index get:index
```
indexコントローラを作成。
viewも自動で生成されます。

##参照
・[Padrino公式](http://jp.padrinorb.com/guides/generators "Padrinoチュートリアル Generators")
Volleyを使って「端末内ストレージにあるファイル」を非同期で読み込もうとしてみる

※この記事は、Volleyとは何か？という概略を知っている人を対象に書いています。

Volleyを使ってサーバ上の情報を読み込むときは、以下のような処理を記述します。

// 1. 通信を非同期で行うためのオブジェクトを生成。
RequestQueue requestQueue = Volley.newRequestQueue(context);
// 2. 「どのような通信処理を行うか」を規定したオブジェクトを生成。
StringRequest request = new StringRequest(URL, 
     [Listener<String>],  <-  通信処理が成功した場合のリスナー
     [ErrorListener]);      <-　通信処理が失敗した場合のリスナー
//  3. 2.で規定した通信内容を実行するよう登録。
requestQueue.add(request);

上記疑似コードの2. の「URL」のところを「file://・・・」みたいな一般のURIでも動くのかなぁ？と思い、試してみました。
結果は、「失敗」！
Volley内部で非同期で処理を行っているところで「HttpURLConnection」にキャストしているらしく、そこでこけちゃってました。

まぁ、ある意味わかりきった結果だと思いますが、もしこれがうまくいったら「サーバ上のファイル読み込み用」「端末内ストレージ内のファイル読み込み用」とで意識せず「ファイル読み込み処理」がさくっとかけたんだろうな・・・と思いました。。。

上記の内容を対応したライブラリがほしければVolleyを少し改造するしかなさそうです。。。
相称型に設定した値からクラスオブジェクトを取得

Seasar2 の GenericUtilは便利だ・・

```java:
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.sql.Timestamp;
import java.util.Arrays;
import java.util.Map;
import java.util.Objects;

import org.apache.commons.lang3.builder.ToStringBuilder;
import org.seasar.framework.beans.util.Beans;
import org.seasar.framework.log.Logger;
import org.seasar.framework.util.tiger.GenericUtil;

/**
 *
 * @author asahina_dev
 * @param <ENTITY> {@link Entity}
 * @param <CSV> {@link Csv}
 */
@MappedSuperclass()
public abstract class 
	Entity<ENTITY extends Entity<ENTITY, CSV>, CSV extends Csv<CSV, ENTITY>> 
		implements Comparable<ENTITY> {

	protected Class<CSV> csvClass;

	protected Class<ENTITY> entityClass;

	public Entity(CSV src) {
		if (src != null) {
			Beans.copy(src, this).excludesNull().execute();
		}

		Map<TypeVariable<?>, Type> map = 
			GenericUtil.getTypeVariableMap(getClass());
		for (Class<?> c = getClass(); 
			c != Object.class; 
			c = c.getSuperclass()) {
			if (c.getSuperclass() == Entity.class) {
				Type type = c.getGenericSuperclass();
				Type[] arrays = GenericUtil.getGenericParameter(type);
				csvClass = ((Class<CSV>) 
				    GenericUtil.getActualClass(arrays[1], map));
				entityClass = ((Class<ENTITY>) 
				    GenericUtil.getActualClass(arrays[0], map));
				break;
			}
		}
	}
}
```
#Photoshop CS6以降のレイヤー検索(フィルタリング)方法

[CS6かららしいけどPhotoshopはレイヤー検索ができる。](http://blogs.adobe.com/jkost/2012/05/layer-search-filters-in-photoshop-cs6.html)
いつも忘れてしまうのでメモ。

例えば、こんな名前のレイヤーがあるとき…

> Ohneen8g sae8Uuzo eigaaX3w teiGha4s ieh3Quie Itie3quo chuhie7R ugh6yaYe

![Screen Shot 2013-08-13 at 5.09.37 PM.png](https://qiita-image-store.s3.amazonaws.com/0/9676/65a49f4f-7b40-d36e-c060-908dad5b49c0.png)

名前に `3` が含まれるレイヤーのみを抽出するには、 `Filter Type` を `Name` にして `3` と打ち込めばいい。

![Screen Shot 2013-08-13 at 5.09.50 PM.png](https://qiita-image-store.s3.amazonaws.com/0/9676/c8c5cdcc-af68-7fb0-f36d-cb729367d1f9.png)
私的ES5のよく使う（関数|メソッド）

ECMAScriptも5になってからだいぶ経ちますし、ブラウザーも軒並みES5に準拠してきているので、そろそろES5のメソッド or 関数を使いまくってもいいんじゃないかなと。無ければshimで補完するという手もあるし。

これは僕がよく使うES5のメソッド or 関数です。

##`Object.keys`

引数として渡されたオブジェクトに属する、列挙可能なキーの一覧を返す関数。プロトタイプチェーンを辿らないのが特徴。

従来、

```js:
for (var key in obj) {
  if (Object.prototype.hasOwnProperty.call(obj, key)) {
    //do something
  }
}
```

のように書いていた処理を、

```js:
Object.keys(obj).forEach(function (key) {
  //do something
});
```

と書くことが出来る。しかも`for (... in ...)`より速いらしい。（参考：[uupaa looper 見っけたよー - latest log](http://uupaa.hatenablog.com/entry/2012/02/04/145400)）

また、配列として取得できるので、ソートをかけて順序を一意に定めることも可能。

##`Array.prototype.reduce`

ES5でJavaScriptに追加されたメソッドと言えば`forEach`や`map`、`filter`が有名ですが、僕はこのメソッドが一番好きです。`map`も`filter`もこのメソッドで実装できますし。

説明は面倒なので（無駄に記事が長くなってしまうので）、[ここ](http://taiju.hatenablog.com/entry/20110331/1301535208)に丸投げします。

```js:
var
xs = [1,2,3,4,5];

//sum
xs.reduce(function(sum, x) {
  return sum + x;
});

//product
xs.reduce(function(product, x) {
  return product * x;
});

//max
xs.reduce(function(max, x) {
  return x > max ? x : max;
});

//array to object
'xxx yyy zzz'.split(' ').reduce(function (obj, key, i) {
  return (obj[key] = i, obj);
}, {});
```

右端から畳み込む`Array.prototype.reduceRight`もあります。

##`Array.isArray`

引数が配列かを返す。それだけ。それだけなんだけど結構便利だと思う。

実装は普通に、

```js:
Array.isArray = function isArray(x) {
  return Object.prototype.toString.call(x) === '[object Array]';
};
```

みたいに、オブジェクトの[[Class]]プロパティをチェックすることになってる。

##`String.prototype.trim`

文字列の両端にある空白を取り除く関数。やっぱり便利関数。

```js:
var
str = '  \t hello \n\r';

console.log(str);
//=>      hello
//=> 

console.log(str.trim());
//=> hello
```

ちなみに全角の空白も除去してくれる。これは偉大。

##`Function.prototype.bind`

関数の`this`と引数を束縛してくれる代物。便利な様で、意外と使わないかも…？

```js:
var
obj1 = {a: 1},
obj2 = {a: 2},
fn = function () {
  return this.a;
},
fn1 = fn.bind(obj1),
fn2 = fn.bind(obj2);

fn1(); //=> 1
fn2(); //=> 2
```

##とりあえず、

ベスト５書きました。他にも`Object.create`とか`Object.defineProperty`とか、今まで（ES3では）操作できなかったものに触れられるものもあるのですが、そんなメタなものはライブラリでも作らない限り滅多に使わないので別に覚えておかなくてもいいと思います。

ではっ
iOS AppやMac AppのSKU Numberを生成する１つの方法

[iTunes Connect](https://itunesconnect.apple.com/)でiOS AppやMac Appを登録するときに"SKU Number"という文字列を登録する必要がある。

![sku number.png](https://qiita-image-store.s3.amazonaws.com/0/9676/4529617f-c3cb-c03a-fdce-ece97808b506.png)

私は手っ取り早く `pwgen` 使って生成することにしてる。

[Homebrew](http://brew.sh)で `pwgen` をインストールして↓みたいなコマンド打つといい感じの文字列がクリップボードに入る。

```shell-session:
$ brew install pwgen
$ pwgen -nB1 | tr '[a-z]' '[A-Z]' | pbcopy && pbpaste
KOHB3OUG
```
opensslでコマンド一発で自己証明書を作る

opensslでコマンド一発で秘密鍵と自己証明書を作成する例です。

```shell-session:
openssl req -new -newkey rsa:2048 -sha1 -x509 -nodes \
    -set_serial 1 \
    -days 365 \
    -subj "/C=JP/ST=Osaka/L=Osaka City/CN=example.com" \
    -out /etc/pki/tls/certs/example.com.crt \
    -keyout /etc/pki/tls/private/example.com.key
```

Ansibleのplaybookの例
https://github.com/hnakamur/ansible-playbooks/blob/c4f05a64cddd4275a437c68ae2439e429d56a9d6/roles/common/tasks/self_signed_certificate.yml

chefのrecipeの例
https://github.com/hnakamur/chef-cookbooks/blob/e27426d394ea63732d56ac617d88d4815d660d7b/self_signed_certificate/recipes/default.rb
FuelPHPのComposerでPEARを使う

少しハマったので個人的なメモ
phpenvの5.5なFuelPHP環境でPEARを使おうとしたらコマンドが無いとか叱られたしPyrusかと思ったけどなんかメンドイ。
ならFuelPHPにあるComposer使えばいいんじゃないとかそんな風に思ったのでやってみた。

## JSONファイルの更新とか
+ リポジトリを追加
+ Requireリストに追加

```php:fuelphp/composer.json
…
"repositories":[
{
"type":"pear",
"url":"http://pear.php.net"
}
],
"require": {
"php": ">=5.3.3",
"monolog/monolog": "1.5.*",
"fuelphp/upload": "2.0",
"pear-pear/HTTP_Request2":"2.1.*"
},
…
```

HTTP_Request2を使いたかったので追加した感じです。

## インストール・更新
普通ならここで下記のコマンドからインストールすれば良いみたい

```Bash:Command
php ./composer.phar install
```

今回は以前調べた時にこのコマンド叩いており、

```
｀・・)つphp ./composer.phar install   
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Warning: The lock file is not up to date with the latest changes in composer.json. You may be getting outdated dependencies. Run update to update them.
Nothing to install or update
Generating autoload files
```

と言われてしまった。
なのでこんな（ `php ./composer.phar update` ）感じで
やればいいようだ

```
｀・・)つphp ./composer.phar update
Loading composer repositories with package information
Initializing PEAR repository http://pear.php.net
Updating dependencies (including require-dev)
  - Installing pear-pear.php.net/xml_util (1.2.1)
    Downloading: 100%
  - Installing pear-pear.php.net/console_getopt (1.3.1)
    Downloading: 100%
  - Installing pear-pear.php.net/structures_graph (1.0.4)
    Downloading: 100%
  - Installing pear-pear.php.net/archive_tar (1.3.11)
    Downloading: 100%
  - Installing pear-pear.php.net/pear (1.9.4)
    Downloading: 100%
  - Installing pear-pear.php.net/net_url2 (2.0.0)
    Downloading: 100%
  - Installing pear-pear.php.net/http_request2 (2.1.1)
    Downloading: 100%
Writing lock file
Generating autoload files
```

なるほど、良い感じ。
これはハマリますわー
[Ansible] Gangliaをソースからインストール

[Ganglia](http://ganglia.sourceforge.net/)の最新版Ganglia 3.6.0, Ganglia Web 3.5.10をソースからインストールするAnsibleのplaybookを作ってみました。
https://github.com/hnakamur/ansible-playbooks/commit/c4f05a64cddd4275a437c68ae2439e429d56a9d6
と言っても、とりあえずlocalhostにインストールするだけで、別のマシンにgmondをセットアップするところはまだできていません。

configureのオプションとgmond.confはepelのrpmのspecファイルを参考にしつつ、initスクリプトとgmetad.confはソースパッケージのものをベースとしています。

epelのganglia-web 3.1.7だと [Monitoring with Ganglia](http://www.amazon.co.jp/dp/B00A4RSNIU) で紹介されているスクリーンショットとはタイムレンジの選択ウィジェットの見た目が違っていてグラフのズームもできないようでしたが、3.5.10ではできることを確認しました。

あと、epelのgangliaはremiのphp 5.4をインストールしてからインストールしようとすると依存関係でエラーになってしまうので、先にgangliaを入れる必要があったのですが、このplaybookではその問題は回避できています。

スクリーンショットを添付します。

![ganglia-web-3.5.10-snapshot.png](https://qiita-image-store.s3.amazonaws.com/0/3227/b4b418a3-1c97-617b-4a71-c54fc481a09c.png)

各グラフについている[csv]ボタンを押すとcsvでデータをダウンロードできます。[json]ボタンを押すとjson形式のデータが表示されます。

また、[inspect]ボタンを押すと、そのグラフがブラウザ内のダイアログで開いて、グラフ上のデータの数値をみたり、ドラッグで選択した範囲をズーム表示することができます。

![ganglia-inspect-graph.png](https://qiita-image-store.s3.amazonaws.com/0/3227/b8455f29-7766-48e0-95ed-095f8a9f5625.png)
続・Jenkinsのテスト結果をGithubのPull Requestに表示する

[Ruby - Githubのpull requestページに、テスト結果を表示するJenkisの設定 - Qiita [キータ]](http://qiita.com/joker1007/items/6352b81fc9222e9c23ec "Ruby - Githubのpull requestページに、テスト結果を表示するJenkisの設定 - Qiita [キータ]")の続きです。

拙作の[joker1007/github-commit-status-updater](https://github.com/joker1007/github-commit-status-updater "joker1007/github-commit-status-updater")というgemがあったのですが、何度かPull Requestを頂きまして、更に便利になりました。
元々はコマンドラインからコミットハッシュを指定してステータスの更新するだけのツールだったのですが、関連URLの設定、descriptionの設定、エンドポイント変更によりGithub Enterpriseでも利用可能、という感じになってます。
自分は何もやってないのに、すげー便利になってgithubすげーって感じです。
本当にありがとうございます。

それに伴って、Jenkinsの設定も進化したので共有しておきたいと思います。
具体的には、よりパラメータ化する事で汎用化しました。
Parameterized Triggerを使ってテスト結果をパラメーターに仕込んで更新用のジョブをキックするやり方は基本的に変わっていません。

## commit status 更新ジョブの設定内容
まず適当な名前でJobを作ります。
今回はCommitStatusUpdateという名前とします。

1. ビルドのパラメーター化にチェック
2. 以下のパラメーターを定義する
  - COMMIT_STATUS - 文字列
  - UPDATE_COMMIT - 文字列
  - TARGET_URL - 文字列
  - REPOSITORY_NAME - 文字列
3. gitリポジトリのURLをgit://github.com/joker1007/github-commit-status-updater.gitにセット
4. (オプション) rbenvの設定を行う

以下、ビルド設定

1. ENV inject PluginでPATH=${WORKSPACE}/bin:${PATH}と環境変数を追加する
2. シェルの実行で以下のコマンドを実行する

```bash:
bundle install --path .bundle
github-commit-status-updater ${COMMIT_STATUS} -r ${REPOSITORY_NAME} -s ${UPDATE_COMMIT} --oauth-token TOKEN --target_url ${TARGET_URL}
```

TOKENは各自書き換え。

最終的にコミット対象のハッシュとリポジトリ名さえ分かれば問題無いので、参照するリポジトリはgemのリポジトリでオッケーです。
もしOAuthのトークンがプロジェクト毎に異なるなら、ここもパラメーター化しておきます。

## メインのテスト実行ジョブの設定内容

### 成功時のトリガー設定
1. ビルド後の処理にParameterized Triggerを追加。(要 Parameterized Trigger Plugin)
2. CommitStatusUpdateをキックする
3. Trigger when build isを`Stable or unstable but not failed`に設定
4. パラメーターを追加し、predefined parameterに以下の内容を追加する

```
commit_status=success
UPDATE_COMMIT=${GIT_COMMIT}
REPOSITORY_NAME=github_organization_name/repository_name
TARGET_URL=${JENKINS_URL}job/${JOB_NAME}/${BUILD_NUMBER}
```

### 失敗時のトリガー設定
1. ビルド後の処理にParameterized Triggerを追加。(要 Parameterized Trigger Plugin)
2. CommitStatusUpdateをキックする
3. Trigger when build isを`Failed`に設定
4. パラメーターを追加し、predefined parameterに以下の内容を追加する

```
commit_status=failure
UPDATE_COMMIT=${GIT_COMMIT}
REPOSITORY_NAME=github_organization_name/repository_name
TARGET_URL=${JENKINS_URL}job/${JOB_NAME}/${BUILD_NUMBER}
```

build pipelineを工夫して、一回コミットを受けた後でジョブを分岐すれば、テスト開始前にpendingステータスに設定しておく事も可能です。

pull requestでテスト結果を見て落ちてれば、すぐにJenkinsのビルドページに飛べる。
ジョブも複数ジョブで使い回せる感じになって、より良い感じになりました。
grunt-bower-taskのlayoutが気に入らなかったので作った

bowerを最近ようやく使い始めて、grunt-bower-taskで良い感じにtargetDirに吐き出すようにしたかったんですが、
**デフォルトのlayoutはやたらディレクトリが深くなったり、**
**きちんとbower.jsonでmainを指定しているのとそうでないのとで構造が違ってくるとか、**
もうなんか嫌だなあと思ったのでサクッと自前でlayout作ってみた。


```js:Gruntfile.js
var path = require('path');
bower: {
	options: {
		targetDir: 'js/lib',
		layout: function(type, component) {
			var makeDir = false;
			if(makeDir) {
				if(type === 'css') {
					return path.join(component, type);
				} else {
					return path.join(component);
				}
			}
		}
	}
}
```

`targetDir`には吐き出したい先のディレクトリ、 `makeDir`はコンポーネントごとにディレクトリ分けるかどうか**boolean**で記述します。

上の例では` js/lib`直下にライブラリのファイルが吐き出されるようになります。

あとは`bower.json`で良い感じに`exportsOverride`を書いておけば（例えば本当に使うファイルだけ指定しておく）、きっと良い感じに吐き出してくれます。