OmniAICreator/Qiita-1.07M huggingface dataset:
[Ruby]基礎から日記。そしていきなりつまづく。

プログラムと呼ばれるものにアラフォーで初めて挑戦するおっさんです。毎日ちょこちょこ日記的につけていくつもり。

『たのしいRuby』を半分くらい写経したところで、もうちょっと問題的なところを解いてみたくなった。いろいろなプログラムの種類を教えてもらっても、写経だけでは忘れてしまう。問題を解くことで、そこに出てきたメソッドを覚えていくスタイルにしてみました。

今とりかかっているのは<a href="http://klis.tsukuba.ac.jp/klib/index.php?plugin=attach&refer=KISL%2Ftop&openfile=ruby.pdf">筑波大学の問題集</a>で、現在[Ruby-32]。

>eng = Hash.new
>print(eng.size, "\n")
>print(eng.empty?, "\n")
>
>eng["かえる"] = "frog" eng["かも"] = "duck" eng["せみ"] = "cicada"
>print(eng.size, "\n")
>print(eng.empty?, "\n")
>eng.each{|key, value|
>  print(key, ":", value, "\n")
>  }
>
>eng.delete("かも")
>eng.each{|key, value|
>  print(key, ":", value, "\n")
>  }
>
>print(eng.size, "\n")
>eng.clear
>print(eng.size, "\n")

ここで2段目3行目の下に

>print(eng[0],"\n")

を入れてもブランクしか返されないのなんでだろう。
もうすでに「["かえる"] = "frog"」が入っているはずだし、すぐ上でemptyにはnoと返されている。
謎は謎のまま先に進むことにする。
Adminerでお手軽DB管理&アクセス制御

参考:
http://www.adminer.org/
http://www.adminer.org/en/extension/

#Adminerとは？
AdminerはphpMyAdminのようにブラウザからデータベースを管理するツール。
しかし、AdminerはPHP1ファイルのみで構成されていてとてもお手軽。
さらにMySQL以外のデータベースにも対応していて、何より高速に動作する。

# Adminer本体の設置
## ドキュメントルートなどに以下のファイルを設置
adminer-3.7.1-mysql.php

## 実際に使ってみる
後はブラウザで該当ファイルにアクセスするだけで動作する。
ログイン画面で、アクセスするデータベースのユーザ名などが求められる。

#IPアドレスでアクセス制御
さすがにドキュメントルートにこんな危ないものは置けないぜ、というのは当然の反応。
そこで、Adminerは簡単に自分自身を拡張できるようになっています。
今回はログイン時にアクセスしてきたユーザのIPアドレスをチェックし、許可したIPアドレス以外はログイン出来ないようにしてみます。

上記の **adminer-3.7.1-mysql.php** を設置したのと同じディレクトリに、以下のファイルを作成します。

```php:adminer_ext.php
<?php
function adminer_object() {
    class AdminerSoftware extends Adminer {
        function login($login, $password) {
            $whiteList = array(
                // ココに、アクセスを許可するIPアドレスを羅列する
                "xxx.xxx.xxx.xxx",
                "yyy.yyy.yyy.yyy"
            );

            $remoteIP = $_SERVER["REMOTE_ADDR"];
            if(in_array($remoteIP, $whiteList) === true ) {
                return true;
            } else {
                return false;
            }
        }
    }
    return new AdminerSoftware;
}
```

Adminerは自分と同じディレクトリに **adminer_ext.php** が存在すればそれを自動的にrequireします。
その中でAdminerのもっているメソッドををオーバライドできます。(今回はloginメソッドをオーバライド)
これで許可されたIPから以外はAdminerにログインすることが出来なくなりました。
Ruby ToolboxからMongoDB関連のgemを見る

[The Ruby ToolboxのMongoDB Clients](https://www.ruby-toolbox.com/categories/mongodb_clients)から動きが活発そうなものを調べてみる。

## MongoDB

* ドキュメント指向データベースの一つ
* RDBライクな検索クエリ
* スキーマレス
    * 任意のフィールドを好きなときに追加できる
* レプリケーション、オートフェイルオーバー、レンジパーティション、バランシング機能あり
* Read/Writeの性能は高い
* 好きなプログラム言語からアクセスできるAPIや、RESTインターフェースあり
* 性能関連は[このへん](http://gihyo.jp/dev/serial/01/mongodb/0013)見ると分かる
* [MongoDBが適さないものとか](http://d.hatena.ne.jp/hiroppon/20130520/1369017430)

## Mongoid

* MongoidはMongoDBのObject-Document-Mapper(ODM)
* 現在のバージョンは3系統がメイン、4.0.0alpha2が最近出た
* 大体の使い方はsample.rbみたいな感じ
    * ActiveRecordに近い（かなぁ？）
    * [サンプルコード](http://mongoid.org/en/mongoid/index.html)

```ruby:sample.rb
class Artist
  include Mongoid::Document
  field :name, type: String
  embeds_many :instruments
end

class Instrument
  include Mongoid::Document
  field :name, type: String
  embedded_in :artist
end

syd = Artist.where(name: "Syd Vicious").between(age: 18..25).first
syd.instruments.create(name: "Bass")
syd.with(database: "bands", session: "backup").save!
```

* フィールドを定義して、関連をつくって
    * 関連はembeds_~で作られるものと、ActiveRecordでお馴染みのhas_one、has_manyなどリレーショナルな関連がある


## Mongo Ruby Driver

* MongoDBの本家で作ってる（？）
* ドキュメント読むと、対応するRubyのバージョンが1.8.7と1.9.3となっているので若干古いかな
    * と思ったらGithubのほうは2.0.0に言及してましたね
* Githubから引っ張ってきたサンプルコードを見ると、Mongoidと違って、MongoDBを操作するというイメージかな
    * [サンプルコード](https://github.com/mongodb/mongo-ruby-driver)

```ruby:sample.rb
require 'mongo'

# connecting to the database
client = Mongo::Client.new # defaults to localhost:27017
db     = client['example-db']
coll   = db['example-collection']

# inserting documents
10.times { |i| coll.insert({ :count => i+1 }) }

# finding documents
puts "There are #{coll.count} total documents. Here they are:"
coll.find.each { |doc| puts doc.inspect }

# updating documents
coll.update({ :count => 5 }, { :count => 'foobar' })

# removing documents
coll.remove({ :count => 8 })
coll.remove
```

## 比べてみると

* Mongoidのほうが抽象度は高く、ActiveRecord使ってる人ならわかりやすい
* Ruby Driverは生のAPIをRubyから触れるようにしました、というイメージが否めない
* 開発のアクティブさやRubyで使うなら……ということを考えるとMongoidのほうがよさそうでした
ワーカースレッドを開始・終了するときの意外な落とし穴に気をつけよう

これは私がはまった落とし穴を再現するデモ・プログラムです。

```cpp:test.cpp
#include <thread>
#include <iostream>
#include <unistd.h>
#include <atomic>

using namespace std;

class my_service
{
public:
    void run() {
        cout << "run()" << endl;
        worker_ = thread([this]() {
            cout << "thread started." << endl;
            canceled_ = false;
            for (int i = 0; i < 10 && !canceled_; i ++) {
                cout << i << endl;
                sleep(1);
            }
        });
    }

    void stop() {
        cout << "stop()" << endl;
        canceled_ = true;
        worker_.join();
    }

private:
    thread worker_;
    std::atomic<bool> canceled_;     // atomic<T>型に修正しました
};

int main()
{
    for (int i = 0; i < 2; ++ i) {
        my_service service;
        service.run();
        sleep(0);   // [ここに注目]
        service.stop();
    }

    return 0;
}
```

実行結果

```
run()
stop()
thread started.
0
1
2
3
4
5
6
7
8
9
run()
stop()
thread started.
0
1
2
3
4
5
6
7
8
9
```

あくまで説明用なので、便利なライブラリーは使わず直接std::threadを使っています。

main() 関数の中で run() して 直後に stop() しているため、スレッドは１回も実行されないつもりでしたが、実は __スレッドが実行開始される前にstop()が走ってしまうため__、期待通りの動作になりません。

sleep(0)をsleep(1)とかに変えるとちゃんとstop()でスレッドが止まります。

スレッドの処理内容によっては最悪デッドロックになることもあり、実際のプログラム中では気づきにくいので要注意です。


ビルド方法

```
g++ -std=c++11 -Wall -pthread -g test.cpp
```


私なりに問題を解決したバージョンを作ってみました。
（このコードは間違っています。詳しくはコメントをご覧ください。）

```cpp:test2.cpp
#include <thread>
#include <iostream>
#include <atomic>
#include <mutex>
#include <condition_variable>
#include <unistd.h> // for sleep

using namespace std;

class my_service
{
public:
    void run() {
        cout << "run()" << endl;

        std::unique_lock<std::mutex> lk(m);
        std::condition_variable cv;

        worker_ = thread([this, &cv]() {
            cout << "thread started." << endl;

            canceled_ = false;

            cv.notify_one();

            for (int i = 0; i < 10 && !canceled_; i ++) {
                cout << i << endl;
                sleep(1);
            }
        });

        cv.wait(lk);   // ここは間違っているのでマネをしないでください！
    }

    void stop() {
        cout << "stop()" << endl;

        canceled_ = true;
        worker_.join();
    }

private:
    thread worker_;
    std::mutex m;
    std::atomic<bool> canceled_;
};

int main()
{
    for (int i = 0; i < 2; ++ i) {
        my_service service;
        service.run();
        sleep(0);
        service.stop();
    }

    return 0;
}
```

実行結果

```
run()
thread started.
stop()
run()
thread started.
stop()
```

実行結果を見ると、処理の順番がかわっています。

コメントありがとうございます。
つっこみ歓迎です！
メモリ操作を気にせずにPHPエクステンションを作れる言語”Zephir”

# zephirとは？
zephirはphpエクステンションを生成することに特化した開発言語です。
http://zephir-lang.com/

特徴として、

- メモリ操作を気にすることなくコードが書ける
- 静的型付け＋動的型付け
- PHPの組み込み関数を利用する事が出来る
- PHPライクなシンタックス

といった特徴が挙げられます。

PHPを書けるエンジニアなら習得するのは容易で、簡単にエクステンションを作成することが可能です。

# インストール
centos6.5で検証しました。
`Git`がインストールされていること、`remi`リポジトリを参照出来る事を前提としています。

```bash
yum install -y --enablerepo=remi gcc automake autoconf pecr re2c php-devel

# 適当なディレクトリに移動
cd /usr/local/src

git clone https://github.com/json-c/json-c.git
cd json-c
sh autogen.sh
./configure && make && make install
cd ../

git clone https://github.com/phalcon/zephir
cd zephir
./install -c
```

上記手順でインストールした場合、
`/usr/local/src/zephir/bin/zephir-parser`が生成されていればインストールは成功です。

# スケルトン生成
コマンドラインから`zephir init [name]`と実行すればスケルトンが生成されます。

```
[name]
  Lext
  L[name]
  Lconfig.json
```

コードは[name]/[name]以下に作成していきます。

# エディタ
Sublime Text2 にはzephirのシンタックスハイライトパッケージが提供されていました。
その他エディタについては存じません。

# Hello World
定番のHello Worldです。

## zephirでエクステンション作成

`zephir init sample`でスケルトンを生成します
`sample/sample/helloworld.zep`でファイルを作成します。（拡張子は`.zep`です）

```php:sample/sample/helloworld.zep
// namespaceは必須です、スケルトン生成時に指定した名前と同じ値を指定します。
namespace Sample;

// クラス名はファイル名と同一である必要があります
class HelloWorld
{
    public static function say()
    {
        echo 'Hello World!!';
    }
}
```

`zephir build`でコンパイルを実行し、`.so`ファイルを生成します、`.so`ファイルは適当なディレクトリ（phpのエクステンションがデフォルトで置かれているディレクトリ）に生成されます。

今回はパッケージからPHPをインストールすることを想定して、
`/etc/php.d/`以下に`sample.ini`を作成しエクステンションを追加します。
`echo "extension=sample.so" > /etc/php.d/sample.ini`

## PHPから作成したエクステンションを実行

```php
Sample\HelloWorld::say(); // Hello World!!
```

# 変数はイミュータブル？

zephirで定義した変数はPHPのように直接変更することが出来ません。

```php
var a;
a = 0; // コンパイルエラー
```

変数に値を設定する場合は`let`を使います

```php
var a;
let a = 0; // OK
```

# 型付けを試してみる
zephirでは静的片付けと動的型付けの両方をサポートしています。

## int型を例にどの程度静的型付け出来るのか確認してみた

```php
// 数値以外も代入可能なint型...
int a = 0;     // OK
int b = false; // これはコンパイルエラー
int c = 100.5; // これもコンパイルエラー

int d;
let d = false, // 0   コンパイルエラーにならない
    d = 100.5, // 100 コンパイルエラーにならない
    d = 'foo'  // これは流石にコンパイルエラー
```

あまりカッチリしてないですね…

## メソッドで型定義

```php
public function foo(string str) -> <Foo\Bar>
{
}
```

引数、戻り値に対して型指定することが出来ます。
型がscalarではない場合`<namespace\class>`といった形で表現します。

# else ifがない

何か代替となる手段があるかというとそうでもない。
`else if`を使わないようなコーディングが求められるかも。

```php
// else if と書けないので、同じことをしたいならifをネストさせる
if (1) {
  // 何か
} else {
  if (1) {
    // 何か
  } else {
    // 何か
  }
}
```

# まとめ
軽く`zephir`について書いてみましたが、この子、言語的には全く洗練されていません。
とはいっても、処理を高速化したいというケースは何処かしらで出てくるのではないでしょうか？
そういったケースを解決する時に`C`は難しいけど...というエンジニアでも解決策として`zephir`を利用するという答えを持っておくのはいいかなと思います。
（現状大したベンチマークとってないので、どれだけ早いかには言及出来ませんが；；）

まだ新しい言語でもありますので、今後の発展に期待したいです。
Rubyでクレジットカード番号を下4桁以外マスクする(正規表現)

14~16桁に対応して、数字の間にセパレータが含まれるのも考えると、こんな感じになった。

```rb
regexp = /\d(?=(\D*\d){4})/

%w(
  1234567890123456
  123456789012345
  12345678901234
  1234-5678-9012-3456
  1234-5678-9012-345
  1234-5678-9012-34
  1234\ 5678\ 9012\ 3456
  1234\ 5678\ 9012\ 345
  1234\ 5678\ 9012\ 34
).each { |number| puts number + ' => ' + number.gsub(regexp, '*') }

#=>
#  1234567890123456 => ************3456
#  123456789012345 => ***********2345
#  12345678901234 => **********1234
#  1234-5678-9012-3456 => ****-****-****-3456
#  1234-5678-9012-345 => ****-****-***2-345
#  1234-5678-9012-34 => ****-****-**12-34
#  1234 5678 9012 3456 => **** **** **** 3456
#  1234 5678 9012 345 => **** **** ***2 345
#  1234 5678 9012 34 => **** **** **12 34

```

`\d(?=(\D*\d){4})`は 「その文字以降に数字が4つ以上現れる」数字にマッチするので、その数字を`String#gsub`で`'*'`に置き換えている。


# Rubular
こういうのを考える時はRubular使うと便利。

> Rubular: a Ruby regular expression editor and tester
> http://rubular.com/

[permalinkも生成できる](http://rubular.com/r/lia3bV5yQV)ので、複雑な正規表現を書いた時はソースコードのコメントにpermalinkを貼ったりしてもいいかもしれない。
Math.Round(銀行丸め)ではなく四捨五入をしたい

この歳まで知らなかったので、忘れぬようメモ。

# Roundは四捨五入ではない（銀行丸め）

Math.Round()って今まで四捨五入かと思っていたのですが、
厳密に言うと「銀行丸め」と言って、偶数寄りに丸められてしまいます。
([参考:Wikipedia端数処理](http://ja.wikipedia.org/wiki/%E7%AB%AF%E6%95%B0%E5%87%A6%E7%90%86))

# 例

> Math.Round(1.5) = 2
> Math.Round(4.5) = 4 (5ではない)

# 四捨五入するには

そこで、
小数点第１位で四捨五入したい場合には、「0.5 を足して小数部を切り捨て」します。
小数点第２位で四捨五入したい場合には、「10倍して0.5 を足して小数部を切り捨てて10で割り」ます。

# サンプル ソースコード

```vbnet:sisyagonyuu.vb
    ''' <summary>
    ''' 四捨五入する
    ''' </summary>
    ''' <param name="value">四捨五入する値値</param>
    ''' <param name="digit">小数点第何位で四捨五入するか(初期値=1)</param>
    ''' <returns>四捨五入した値</returns>
    ''' <remarks></remarks>
    Public Function Sisyagonyuu(ByVal value As Double, Optional ByVal digit As Integer = 1) As Integer
        Dim unit As Integer = 10 ^ (digit - 1)

        If value >= 0 Then
            Sisyagonyuu = Math.Floor(value * unit + 0.5) / unit
        Else
            Sisyagonyuu = Math.Ceiling(value * unit - 0.5) / unit
        End If
    End Function

    Sub Main()
        Console.WriteLine("Sisyagonyuu(1.49)=" + CStr(Sisyagonyuu(1.49)))
        Console.WriteLine("Sisyagonyuu(1.5)=" + CStr(Sisyagonyuu(1.5)))
        Console.WriteLine("Sisyagonyuu(4.49)=" + CStr(Sisyagonyuu(4.49)))
        Console.WriteLine("Sisyagonyuu(4.5)=" + CStr(Sisyagonyuu(4.5)))
    End Sub
```

# 実行結果

> Sisyagonyuu(1.49)=1
> Sisyagonyuu(1.5)=2
> Sisyagonyuu(4.49)=4
> Sisyagonyuu(4.5)=5
JJUG ナイトセミナ 「Spring Framework 特集」に参加した

# JJUG ナイトセミナ 「Spring Framework 特集」

### 概要
* 開催日時: 2014年1月21日(火) 19:00 ~ 21:00 
* 会場: 日本オラクル株式会社 本社 東京都港区青山2-5-8
* 主催: JJUG、JSUG
* http://jjug.doorkeeper.jp/events/8113

### 所感
以前にSpringを業務で使ったことがあり、久しぶりにJavaでWebアプリ開発をやろうと思っているので参加。
Webアプリ開発の経験がほとんどないので、JavaEEと比較してどう良いのかなどはわからない。
デモ用PCが落ちてしまい、デモがあまり見られなかったのは残念。
gradleは知らなかったので使ってみる。
"The Twelve-Facter App"を読む。


### アジェンダ
* 再入門　SpringMVCとREST
 * http://www.slideshare.net/terahide/restspringmvc?from_search=5
* Spring 4とSpring Bootで作る次世代Springアプリケーション
 * http://www.slideshare.net/makingx/spring-4spring-boot-spring-jjug-jsug

## 1. 再入門　SpringMVCとREST
### 発表者
* てらひで氏 (@terahide27)

Springフレームワークを使って、簡単にWebアプリが作れることを知って欲しい



#### Springフレームワークの概要説明
* MVC2の概要

#### Springホームページのガイドに従ってサンプルアプリを作成
* ガイド→http://spring.io/guides/gs/serving-web-content/
* zipファイルダウンロード、gradleでeclipse環境の構築
 * 依存ライブラリのダウンロードとかもやってくれる
* PCが落ちて、デモは出来ず…

#### REST
* RESTの概要説明

## 2. Spring4とSpringBootで作る次世代Springアプリケーション

### 発表者
* 槙 俊明氏 (@making)

Spring4は去年の末に出た
SpringBootは正式リリースではない

#### 伝えたい事
* Spring Frameworkは楽しい
 * 進化し続けている
* SpringもWeb開発時の選択肢に入れて
 * EEだけでなく

#### Spring4の新機能
* Java8に対応
 * Lambdaに対応(Templateパターンが多いので、きれいに書けるようになった）
 * JSR-310に対応
 * RepeatableAnnotationに対応（同じアノテーションを複数設定できる）
* Java7 EEに対応
* WebSocket対応
 * Jetty,Tomcatの独自実装もサポート
 * レガシーブラウザ向けにSockJSサポート
 * STOMPサポート
* struts、iBatis連携がなくなった

#### SpringBoot
* Springアプリケーションを迅速に開発するための仕組み
* 特徴
 * サブプロジェクトの複雑な依存関係がまとめられている
 * あらかじめ各種設定済みでXMLが不要
 * 非機能のサポート
 * "The Twelve-Facter App"で述べられているような、モダンなアプリケーションを作成できる
* SpringToolSuite3.4を使うともっと簡単に実装できる
* DropWizardのフレームワークから影響を受けてる

#### Spring Loaded
* classファイルが修正されると自動で更新が実行される
* 開発中に再起動の必要なし
* Springに依存していないので、他の開発でも使える
focuslightを使ってみた

growthforecastのRubyクローンの[focuslight](https://github.com/tagomoris/focuslight)がリリースされたので使ってみました．

# インストール
```shell
$ git clone git://github.com/tagomoris/focuslight.git
$ cd focuslight
$ bundle install
$ unicorn -E production -p 5125
$ mkdir data
$ bundle exec rake init
$ bundle exec rake short
```
でインストール，起動します

# 起動後
とりあえずデータを投げたら
![スクリーンショット 2014-01-21 20.54.58.png](https://qiita-image-store.s3.amazonaws.com/0/1011/d1244954-5c25-eb3f-2752-5517361077d8.png "スクリーンショット 2014-01-21 20.54.58.png")
が出ますので少し<del>修正</del>

すでに[修正](https://github.com/tagomoris/focuslight/commit/dd1b0fc1536f3bfe7fcf496a150910bd469b3958)されています

```diff
diff --git a/lib/focuslight/rrd.rb b/lib/focuslight/rrd.rb
index 0badc40..69209bd 100644
--- a/lib/focuslight/rrd.rb
+++ b/lib/focuslight/rrd.rb
@@ -170,6 +170,7 @@ class Focuslight::RRD
     end

     tmpfile = Tempfile.new(["", ".png"]) # [basename_prefix, suffix]
+    args[:xgrid] = args[:xgrid].empty? ? xgrid : args[:xgrid]
     rrdoptions = [
       tmpfile.path,
       '-w', width,
@@ -177,7 +178,7 @@ class Focuslight::RRD
       '-a', 'PNG',
       '-l', 0, #minimum
       '-u', 2, #maximum
-      '-x', args[:xgrid] || xgrid,
+      '-x', xgrid,
       '-s', period,
       '-e', period_end,
       '--slope-mode',
@@ -191,7 +192,7 @@ class Focuslight::RRD
       '--color', 'SHADEB#' + args[:shadeb_color].to_s.upcase,
       '--border', args[:border].to_s.upcase
     ]
-    rrdoptions.push('-y', args[:ygrid]) if args[:ygrid]
+    rrdoptions.push('-y', args[:ygrid]) unless args[:ygrid].empty?
     rrdoptions.push('-t', period_title.to_s.dup) unless args[:notitle]
     rrdoptions.push('--no-legend') unless args[:legend]
     rrdoptions.push('--only-graph') if args[:graphonly]
```
でアクセスすると…

```log
RuntimeError - RRDtool returns error to draw graph, error: Legend set but no color:
```

うん…誰かRRDtool詳しい人…
Vagrantでvagrantのデフォの秘密鍵じゃなくて自分のいつもの秘密鍵を使えるようにするシェルスクリプト

## 背景

いつも新しくboxを立ち上げる時は、```Vagrantfile```をつくって```vagrant up```して、```vagrant ssh```して自分がいつも使ってる公開鍵を```~/.ssh```以下においてexitしてから、```ssh vagrant```とかしませんか？ちなみに以下みたいに設定したりしてますよね？

```.ssh/config
Host vagrant
  HostName 127.0.0.1
  User vagrant
  Port 2222 # ← これは変わる可能性がある
```

こういう風に書いてるなら```ssh vagrant```でVagrantに入れますよね？

もちろんいつもの自分の鍵を```ssh-add ~/.ssh/id_rsa```してる前提です。

## 書いてた

で、その作業がめんどくさすぎて以下のスクリプトを自分は使ってます。

途中で秘密鍵のパスフレーズが途中で聞かれるので入力してください。

コメントがゆるふわなのは気にしないでください。

```bash:set_vagrant.sh
#!/bin/bash -eu
echo べいぐらんとに自分のいつもつかってる公開鍵をつっこむよ！

echo べいぐらんが立ち上がってないなら起動
[ -z "`vagrant status | grep running`" ] && echo 立ち上がってないので起動させるよ！ && vagrant up

vagrant ssh -- cat .ssh/authorized_keys > authorized_keys

[ `cat authorized_keys | wc -l` == 3 ] && echo すでに設定してるみたいなので終了 && exit 1

echo 自分の秘密鍵から公開鍵を生成する（パスフレーズを入力してください）
ssh-keygen -y -f $HOME/.ssh/id_rsa >> authorized_keys

echo べいぐらんとに入るためのssh-configを生成
vagrant ssh-config > ssh_config

echo 公開鍵をvagrantユーザーのディレクトリに設置
scp -F ssh_config authorized_keys default:.ssh/authorized_keys

cat <<_EOF_

構築DONE!

------------------------------
$ cat $HOME/.ssh/config
Host vagrant
  HostName 127.0.0.1
  User vagrant
  Port 2222 # ※Port番号は適宜変更の必要あり

上記を記述すると
$ ssh vagrant
で仮想環境に入れるようになるよ！

そんじゃーね☆
------------------------------

_EOF_

```

ではでは〜
2014/02からAWS S3, EBS値下げ + EC2 M3インスタンスの種類が増える


さっき、AWSさんからきたメールをさくっと和訳してみる。

## S3のストレージあたりの料金が値下げ！やったね。

転送料ではなく、ストレージの料金です。

東京リージョンのStandard Storageだと具体的に。
割引率の差が興味深い。

| 使用量(TB) | 単価の割引率（だいたい） |GB単価（ドル）|
|:-----------|----|------------:|
|1 | 6%|0.094|
|1-50| 2%|0.084|
|50-500|15%|0.064|
|500-1,000|15%|0.059|
|1,000-5,000|15%|0.055|
|5,000+|22%|0.047|

たくさん使っている人は嬉しいでしょうね。

詳しいあたらしい料金は（2014/02から）
http://aws.amazon.com/jp/s3/pricing/effective-february-2014/?sc_ichannel=EM&sc_icountry=Global&sc_icampaigntype=Launch&sc_icampaign=EM_112183400&ref_=pe_411040_112183400_8

それまではこちら
http://aws.amazon.com/jp/s3/pricing/

## EBSけっこうさがるよ（スタンダードボリューム）

S3がさがるのでこっちも下がりますよね。
1GBあたりの使用料が30%くらい下がるね。
100万IOあたりの使用料も30%くらい下がるね。

詳しいあたらしい料金は（2014/02から）
http://aws.amazon.com/jp/ebs/pricing/effective-february-2014/?sc_ichannel=EM&sc_icountry=Global&sc_icampaigntype=Launch&sc_icampaign=EM_112183400&ref_=pe_411040_112183400_10

## EC2の第3世代にm3.mediumとm3.largeが仲間入りするよ

インスタンスストレージがSSDでCPUももりもりなm3世代。
ゆとりなアプリケーションエンジニアにはあんまり魅力が説明できないのですが、みんな大好きc1.mediumよりもm3.largeの方がコスパ的に良い（ストレージの絶対量は除く）という事は最近広まりましたね。

選択肢が増えるのはいいことです。

## まとめ

EBSのコストが下がると大容量でも使いやすくなるし、m3系の絶対量は少ないけどIO爆速なSSD-backedなインスタンスストレージとの相性いいと思うので、より使い方の幅が広がる気がするんですよね。

以上です。ツッコミありましたらお願いします。
Sublime Text 3 で SublimeLinterを使う時に必要な設定（Ruby編）


（2014.5.29追記；
　SublimeLinter 3.4にバージョンアップして、SublimeLinter-rubyは日本語（UTF-8）でもエラーが出なくなりました。）

　
（実行環境）
・Sublime Text 3 (Build 3059)
・Mac OS X 10.9 Mavericks
・Ruby 2.1.0 (Homebrew + Rbenv)

#0. SublimeLinterとは
SublimeLinterは、Sublime Textで文法チェックしてくれる、超便利なプラグインです。

インストールは、Package Controlを使います。（Package Controlはインストール済みとして；）
Command Paletteを開き（Macでは `command + shift + p`）、`install` と入力し、リストが表示されたら `sublimelinter` と入力して検索、SublimeLinterを選択。

　
ただし、SublimeLinterをインストールしただけでは、文法チェックをしてくれません。Sublime Text 3用のSublimeLinterには、[Linterが含まれていない](http://sublimelinter.readthedocs.org/en/latest/installation.html)からです。

#1. Linterを入れる

言語ごとに必要なLinterを追加でインストールします。
例えば、RubyならSublimeLinter-rubyをPackage Controlを使ってインストールします。

手順は、上記と同じです；
Command Paletteを開き（Macでは `command + shift + p`）、`install` と入力し、リストが表示されたら `sublimelinter-` と入力して検索、SublimeLinter-rubyを選択。

#2. 日本語に対応させる（Ruby編）
（2014.5.29 追記；
　SublimeLinter 3.4になり、この修正は不用になりました。なにも設定せずにSublimeLinterでRubyが使えます。）

　
Rubyのプログラム中に日本語が入ると、文法チェックがうまく働きません。

例）日本語がすべてエラーになる。日本語が出てきた行以降の文法チェックを行わなない、など。
（組み合わせるバージョンによって違うようです。）

　
○Preferences ＞ Package Settings ＞ SublimeLinter ＞ Settings - User を修正；

```
"linters": {
            "ruby": {
                "@disable": false,
                "args": ["-Ku"],
                "excludes": []
            }
        },

```
上記の様に、 "args": [], を "args": ["-Ku"], に変更します。

　
####参考）
→・[MacのSublimetext3でSublimeLinterの日本語エラーが出る場合の対処方法 - nacika](http://nacika.com/entry/2014/01/04/054729/)

　
（→・[元記事](http://blog.livedoor.jp/noanoa07/archives/1961271.html)）
<table>タグで書かれたHTMLファイルをEXCELに取り込む

内容はいたって簡単。まずは<table>タグ作られたHTMLの
拡張子をhtml→xlsに変換し、EXCELで開くと
いい感じに取り込まれます。

いろんなところで使える小技ですが地味に便利です。
twitterのbot作成

MySQLデータベースからデータを取得して呟くbotを作成しました。

準備するもの:

* アプリケーションの登録
* twitteroauth
* サーバ環境(データベース)

上の2つについてはこちらに詳しい説明があります↓
<http://www.sdn-project.net/labo/oauth.html>

サーバはcron(一定時間ごとにツイートさせることができる機能)が必要です。制作段階ではXAMPPを使っていました。

Code:

```php:bot.php
<?php
require_once("./twitteroauth.php");

const C_KEY = 'consumer_key';
const C_SECRET = 'consumer_secret';
const A_TOKEN = 'access_token';
const A_SECRET = 'access_token_secret';

try{
    //データベースに接続。
    $dbh=new PDO('mysql:host=localhost; dbname=foo_db','user','password');
    //エラーを出力
    $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
    //SQLインジェクション攻撃への対策
    $dbh->PDO::setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    //クエリ発行
    $stmt = $dbh->query("select * from foo_db");
    //データを取得
    $tweet=$stmt->fetch(PDO::FETCH_ASSOC);
    $data=$tweet['data'];

    //OAuth認証
    $TwitterOAuth=new TwitterOAuth(C_KEY,C_SECRET,A_TOKEN,A_SECRET);
    //Twitter APIが1.1の場合
    $TwitterOAuth->host='https://api.twitter.com/1.1/';
    
    $status=$TwitterOAuth->post('statuses/update',['status'=>$data]);
} catch(PDOExcption $e){
    var_dump($e->getMessage());
    break;
}
//データベースを切断
$dbh = null;
```

実際に稼働させるにはtwitteroauth.phpとOAuth.phpをサーバに上げる必要があります。

参考(上記3つはドットインストール):

[ツイッターボットを作る (全10回)](http://dotinstall.com/lessons/twitter_bot_php)
[PHP入門（応用編） (全12回)](http://dotinstall.com/lessons/basic_php_advanced)
[MySQL入門 (全19回)](http://dotinstall.com/lessons/basic_mysql_v2)

[PHP+PDO+MySQLの組み合わせではSQLインジェクション攻撃で複文呼び出しが可能](http://blog.tokumaru.org/2013/12/pdo-and-mysql-allow-multiple-statements.html)
[PHP - TwitterOAuthの正しい使い方](http://qiita.com/rana_kualu/items/357a031c0453a3538ad3)
Google Analytics APIのエラー「User does not have any Google Analytics Account」

ちょっとだけ分からなかったけど探したらすぐに見つかった

Google Analytics APIの設定が済んで、以下のキーを入れてエラーが出た場合

クライアント ID
メールアドレス
秘密鍵
ビュー ID

エラー：
User does not have any Google Analytics Account

これは「このアカウントはGoogle Analyticsアカウントを持っていない」という内容になるので、
Google Analyticsに行って、この発行されたxxx@developer.gserviceaccount.comに
表示、編集？の権限を与える必要がある。

参考：
Analytics Google API Error 403: “User does not have any Google Analytics Account”

URL
http://stackoverflow.com/questions/12837748/analytics-google-api-error-403-user-does-not-have-any-google-analytics-account
TextView にまつわる機種依存の話

## 長文の省略の話

有名どころ過ぎて、既にいくつかの回避策が講じられている。

http://qiita.com/hackugyo/items/e23ecfda14bdfc672e7c

ここでは、API リファレンスを見た上で考えられる実装を元に、

```
hoge fuga piyo
foo bar ...
```

こんな感じになることを期待して、以下のように書いてみる。

```xml
<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="hoge fuga piyo foo bar baz qux quux corge grault garply waldo fred plugh xyzzy thud"
    android:maxLines="2"
    android:ellipsize="end" />
```

これを、ScrollView の子要素に持ってくると、人気上位の特定機種（Galaxy S2）で問題（スクロールのレンダリング中に ellipsize 処理が必要以上に呼ばれパフォーマンスを損ない、ANR にならないものの実質スクロールが反応しないように見える）が発生する。

省略する対象の文章が長ければ長いほどパフォーマンスが目に見えて劣化する。

## 回避策

素直に、[この記事](http://qiita.com/hackugyo/items/e23ecfda14bdfc672e7c)で提示されている回避策を取るのが良さそう。
ListViewやGridViewで一部の要素だけ更新する


ListViewやGridViewで表示を更新したいときに
`AbsListView#invalidateViews()`や`BaseAdapter#notifyDataSetChanged()`
で更新を促すんだけど、これだと表示してるView全てを更新してしまう。

特にGridViewだと、一要素の大きさにもよるけど、大抵何十個も表示してるので、全ての要素の更新するのは無駄な場合もある。

今回はドラッグ＆ドロップで並べ替えた要素のみの更新をやりたいので、表示してるView全部更新するのは効率良くない。
なので、部分的に更新する方法がないか探してみた。

結果stackoverflowに解決策があった。

[Redraw a single row in a listview](http://stackoverflow.com/questions/4075975/redraw-a-single-row-in-a-listview)

```java:
/*
 * データの更新とか
 */

targetPosition // 更新対象のposition
gridView       // GridViewのインスタンス

// 更新対象のViewを取得
View targetView = gridView.getChildAt(targetPosition);
// getViewで対象のViewを更新
gridView.getAdapter().getView(targetPosition, targetView, gridView);
```

データの更新をした後に対象のpositionのgetView()を呼び出せばいいだけ。

ただ、getView()の中でちゃんとconvertViewを再利用するようなコードを書いてないと更新されないので注意。
iOS Developer Programの更新方法

##前提
期限60日前にならないと、更新作業出来ません。


##1.iOS Dev Center
ページ上部に下記の記載があります。
（表示がないときは、更新が出来ません）

Your iOS Developer Program is about to expire. 
To maintain your program benefits, please renew your membership(s).

「 __renew your membership(s)__ 」をクリック


##2.Add Your Program
iOS Developer Programを選択し、
「 __Continue__ 」をクリック

2014/1/20現在、
¥8400 /year
となっています。

更新期限が注記に記載されています。
Your membership is set to expire on xxx 15, 20xx. Renew your membership now.


##3.Review your purchase details
更新する内容を確認します。
問題なければ、「 __Continue__ 」をクリック


##4.Proceed to your country's Apple Online Store to purchase.
「 __Add to cart__ 」をクリック


##5.Apple Storeカート画面
カートの中に、
iOS Developer Program - Membership for one year
が入っているので、
「 __注文手続きへ__ 」をクリック


###6-1.配送オプション
「 __続ける__ 」をクリック

###6-2.配送先
「 __続ける__ 」をクリック

###6-3.お支払い
クレジットカード、Apple Storeギフトカード、銀行振込、代金引換とありますので、
任意のもので、情報を入力します。

###6-4.販売条件
「アップルジャパン株式会社と別途基本契約が締結されていない限り、Apple Storeの販売条件が適用されるものとします。 Apple Storeの「販売条件」を読み、条件に同意します。」を選択し、
「 __続ける__ 」をクリック

###6-5.ご注文の確定
「 __ご注文の確定__ 」をクリック


##7.注文確認メール
Apple Storeから「 __ご注文の確認 Wxxxxxxxxx__ 」という件名で、
注文確認メールが送られてきます。
確定メールを待ちます。（私の場合、3分程でした）

##8.注文完了メール
Apple Storeから「 __ご注文ありがとうございます Wxxxxxxxxx__ 」という件名で、
注文確定メールが送られてきます。
アクティベーションコードメールを待ちます。（私の場合、5時間程でした）

##8.アクティベーションコードメール(2014/01以降はメールは来ない)
Apple Developer Supportから「 __Apple Developer Program Activation Code__ 」という件名で、
アクティベーションコードが送られてきます。
メール本文にあるアクティベーションコード「 __XXXX-XXXX-XXXX-XXXX__ 」をクリック。

2014/01以降自動でアクティベートされるようになったため、このメールは来なくなった。

### 更新されたことを確認する方法
https://developer.apple.com/jp/
右上にある「メンバーセンター」=>「Programs&Add-ons」を開く。
Program SummaryにiOS Developer Programの期限が記載されているので確認できる。
RubyGems 自体のバージョンをアップデートする

```
$ gem update --system
Updating rubygems-update
Fetching: rubygems-update-2.6.8.gem (100%)
Successfully installed rubygems-update-2.6.8
Parsing documentation for rubygems-update-2.6.8
Installing ri documentation for rubygems-update-2.6.8
Installing darkfish documentation for rubygems-update-2.6.8
Done installing documentation for rubygems-update after 33 seconds
Parsing documentation for rubygems-update-2.6.8
Done installing documentation for rubygems-update after 0 seconds
Installing RubyGems 2.6.8
RubyGems 2.6.8 installed
Parsing documentation for rubygems-2.6.8
Installing ri documentation for rubygems-2.6.8
```

Special thanks to @kubo39 :bow:
XMLからJSON形式への変換メモ(PHP)

#XMLからJSON形式への変換メモ(PHP)
つまづきどころのメモ。

## 基本形

```php
$obj = simplexml_load_string($xml);
$json = json_encode($obj);
```
直では変換できないので一旦Objectに直してからjson_encodeする。

## CDATAがある場合
そのままでは変換時に値が入らないので、```simplexml_load_string```にオプションを指定する

```php
$obj = simplexml_load_string($xml, NULL, LIBXML_NOCDATA);
$json = json_encode($obj);
```

## 文字コード
```simplexml_load_string``` を使う場合、
XMLの最初の宣言と中の文字コードが一致している必要がある。  
対応していない文字コードの場合、```mb_convert_encoding```でUTF-8に一旦変換しておき、
XMLのヘッダーを
``` <?xml version="1.0" encoding="UTF-8" ?> ```
に無理やり置き換えて読ませる(苦肉の策)

## XML → JSONの罠
XMLとJSONは100% 1対1で対応可能なフォーマットではないので、
変換時にトラブルが時々起こります。

### 要素数1の配列

```xml
<items>
  <item>Hoge</item>
</items>
```
と

```xml
<items>
  <item>Hoge</item>
  <item>Fuga</item>
</items>
```
では要素数が違うだけでほぼ同じXMLです。  
しかし、これをJSONに変換すると

```json
{"item":"Hoge"}
```
と

```json
{"item":["Hoge","Fuga"]}
```
のようになります。
このJSONからHogeを取り出そうとすると、
要素数1の場合は ```$data["item"]``` ですが、
要素数2以上の場合 ```$data[0]["item"]``` になってしまいます。

要素数に応じて配列が現れたりするので注意しましょう。  
特に配列だと思っていた時に、返ってくる要素が1だとパース時に落ちます。
CSSで文字列を省略して末尾に「・・・」を付けて表示する方法

文字列を省略して末尾に「・・・」を付けて表示する方法。

```html:html
<div id='target'>あいうえおかきくけこさしすせそたちつてと</div>
```

```css:css
#target{
    max-width:80px; /* 最大80px */
    white-space: nowrap; /* 改行を半角スペースに置き換える */
    overflow: hidden; /* はみだした部分を削除する */
    text-overflow: ellipsis; /* 末尾に「…」を付加する */
}

```
[Grails]ライブラリ/プラグインがダウンロードされる場所

Grailsに必要なライブラリ（例えばPostgreSQLのJDBCドライバ）は、 **~/.m2/repository** 以下に保存される。

Grails用のプラグインは以下のディレクトリに保存される。
Windows7の場合は **C:\Users\ユーザ名\.m2\repository\org\grails\plugins**
Macの場合は **/Users/ユーザ名/.m2/repository/org/grails/plugins**
Amalgam でコードを整理する

## Amalgam

https://github.com/nohana/Amalgam

Android で頻出するコードをまとめた Utility ライブラリを使って、コードの整理をする。

## リソース管理

Stream I/O なら以下のように。
try-finally ブロックでストリームを閉じるときの null チェックと例外のキャッチをしてくれる。

```java
ContentResolver resolver = context.getContentResolver();
InputStream stream = null;
try {
    stream = resolver.openInputStream(Uri.parse("content://something/to/read/1"));
    // read stream
} finally {
    CloseableUtils.close(stream);
}
```

Cursor は Closeable であるが、CloseableUtils を使うと具合が悪い（Closeable#close() では例外となる）ため、以下のようにする。

```java
ContentResolver resolver = context.getContentResolver();
Cursor c = null;
try {
    c = resolver.query(uri, null, null, null, null);
} finally {
    CursorUtils.close(c);
}
```

## Parcel

boolean に関するシリアライズとデシリアライズのメソッドが Parcel にないので、以下のようにする。

```java
public class MyParcelable implements Parcelable {
    private boolean mHoge;
    public MyParcelable(Parcel source) {
        mHoge = ParcelUtils.readBoolean(source);
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        ParcelUtils.writeBoolean(dest, mHoge);
    }
}
```

## Thread

メソッドの呼び出しがどのスレッドで実行されているかをチェックする。
ブロックするメソッドはメインスレッドで呼ばれてほしくないので、もしメインスレッドで呼んでいたら例外を投げたいし、UI を操作するメソッドはメインスレッドで呼ばれてほしいので、それ以外のスレッドで呼んでいたら例外を投げたい、という時に使う。

```java
public <T> T blockingGet(String url, Map<String, String> params) {
    ThreadUtils.checkNotMainThread();

    // ...
}
```

## DialogFragment

LoaderCallbacks のメソッド内での FragmentTransaction は許可されていないので、Handler 経由で表示や非表示の切り替えをする。

```java
DialogFragmentUtils.dismissOnLoaderCallback(fragmentManager, "MY_DIALOG_TAG");
```
Gitのリポジトリ・ルートを親ディレクトリに移す


## 概要

開発中に様々な理由からこれまでの歴史を変更したくなることがあります。今回はその中でも、リポジトリ・ルートを親ディレクトリに移すことを試みます。

例えば、下記のような構造のワーキング・ディレクトリを

```
public/
├── index.cgi
└── img
```

下記のように変更するということです

```
new_root/
└── public
    ├── index.cgi
    └── img
```

ちなみに、今回の目的とは逆方向、[サブディレクトリを新たなルートにする方法](http://git-scm.com/book/ja/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E6%AD%B4%E5%8F%B2%E3%81%AE%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88#最強のオプション:-filter-branch)はGit Bookに記載されています。

**注意**
これらリポジトリの歴史を変更する操作は、共用のリモート・リポジトリへまだpushしていない場合に限ります。

## 方法

リポジトリ・ルートを親ディレクトリにするということは、既存のすべてのファイルを1つのディレクトリに収めるという言い方もできます。すなわち、filter-branchを使って全履歴にわたってリポジトリ・ルートに有るすべてのファイルを1つのディレクトリに移動します。

ここでは、その1つのディレクトリの名前を`public`にしましょう。結果的には下記のようなコマンドになります。

```bash
git filter-branch -f --tree-filter '[ -d public ] || mkdir public/; ls -1 --color=never | grep -v public | xargs -i% mv % public/' HEAD
```

`mv`の`-t`オプションは、今回はうまく作用しませんでした。そのため`xargs`の`-i`オプションを指定して引数をはめ込みました。
プルダウンメニューがHP上で上手く動作するCSSの指定。


HPのレイアウト上、ナビゲーションバーを作る場合、jQueryのslideUP/DOWNメソッドを使うと、コンテンツの部分まで動いてページが見づらくなる。

なので、CSSで調整する。

nav{
	position:abusolute;
}→ここはdivでnav指定してもいいよー！

ul.（クラス）{
position: absolute;
}

ul.（クラス） li{
clear: both;
displey:block;
width:~px;
height:~px;
}

でコンテンツに被らずに浮かせる形でプルダウンメニューを作成できる。

リファレンス参照:http://www.htmq.com/style/position.shtml

sub、childrenでプルダウンで表示させるところはdisplay:block;とwidth,heightで指定して、hoverの反応領域を指定する。
これをしないと、hoverがテキストだけに反応して、jqueryが動作したりしなかったりで変な動作をすることになる。
【CakePHP】ビヘイビアの使い方

モデル間で処理を共通化するための機能。

##ビヘイビアの作成
app/Model/Behaviorに置く。
ファイル名（クラス名）は、ビヘイビア名+Behavior。例えば、UtillBehavior.php。

第一引数には呼び出し元のモデルが入る。

```php
class UtillBehavior extends ModelBehavior {
  public function increment(Model $model,$par){
      return ($par+1);
  }
}
```

##ビヘイビアの呼び出し方
モデルから呼び出す場合は、第一引数の```$model```は省略。
ビヘイビア内から呼び出す場合は、第一引数の```$model```も書く。

###モデルからの呼び出し方

```php
class User extends AppModel{
    // 使用したいビヘイビアを指定
    public $actsAs = array('Utill');
    
    public function incrementAge($age){
        // $this->メソッド名で呼び出す
        return $this->increment($age);
    }
}
```

###ビヘイビア内からの呼び出し方

```php
class UtillBehavior extends ModelBehavior {
  public function increment(Model $model,$par){
      return ($par+1);
  }

  public public hoge(Model $model,$para){
    //ビヘイビア内からビヘイビアのメソッドを呼び出す
    return $this->increment(Model $model,$par);
  }
}
```
Gruntfile があるディレクトリの絶対パスを取得する

Gruntfile が設置されている場所、つまりはルートディレクトリを取得する方法について。

まずは、Gruntfile に以下の様な設定をしておく。

```coffeescript
module.exports = (grunt) ->
  path = require 'path'

  grunt.initConfig
    rootDir: path.resolve()
```

そうすれば `<%= rootDir %>` や `grunt.config.data.rootDir` で取得できる。

Grunt 謹製の値は無いみたいでしたが、正しい方法なのか自信がありません。


## 別解

コメントでご教授いただいた。  
node 組み込みの `__dirname` 変数を使えば良かった。

```coffeescript
module.exports = (grunt) ->
  grunt.initConfig
    rootDir: __dirname
```
ファイルから1行づつ読み込みながら何かを実行するShellサンプル

ファイルから1行づつ読み込みながら何かを実行するShellサンプルです。

サンプルではコマンドライン引数でURLが記述してあるファイルを指定して
そこから1行づつ読み込んでwgetしています。(アクセスだけしたかったので出力なし)

```
#!/bin/sh
HTTP_USER=dummy
HTTP_PASS=dummypass

url_list_file=$1

echo "[INFO] === START === (`date`)"

while read url
do
  echo -n "."
  wget --http-user=${HTTP_USER} --http-password=${HTTP_PASS} -O - ${url} >/dev/null 2>&1
done < ${url_list_file}

echo ""
echo "[INFO] === END === (`date`)"
```

```:urls.txt
http://127.0.0.1/test/aaa
http://127.0.0.1/test/bbb
http://127.0.0.1/test/ccc
```

```:メモ(wget)
-O file
--output-document=file
    The documents will not be written to the appropriate files, but all will be concatenated together
    and written to file.  If - is used as file, documents will be printed to standard output, disabling
    link conversion.  (Use ./- to print to a file literally named -.)
```
cakephpでACLを使う場合にはacos/arosにインデックスを追加すると速くなる


```sql
create index acos_idx1 on acos (lft, rght);
create index acos_idx2 on acos (alias);
create index acos_idx3 on acos (model, foreign_key);

create index aros_idx1 on aros (lft, rght);
create index aros_idx2 on aros (alias);
create index aros_idx3 on aros (model, foreign_key);
```

http://blog.loadsys.com/2008/03/19/cakephp-12-tuning-the-acl-via-mysql/
スクレイピングツールの作成_2

前回の続きです。

Ajaxページのデータ取得を行う際うまくデータが取得できないということでしたが、解決しました。

どうも、ページ遷移後にデータロード完了するまで待機する必要があったみたいです。
https://github.com/aivaturi/Selenium-Remote-Driver/wiki/Example-Snippets

上記の　Wait For Page To Load　を参照し、公開されているコードを実装しました。公式はきちんと見ないといけませんね。。。

ともあれ、これでページ遷移は確認できました。スクリーンショットも取れたので間違いないでしょう。
ちなみに、遷移が完了したあとで get_page_source() を実行すると、データロードの完了したhtmlソースが取れるので、Web::Scraper で加工してもいいかもしれません。 CSS の知識が対して無いので。。

次は、サービスで必要になる情報を取得して表示用のWebページにまとめてみようと思います。
Windowsでもマトリックスごっこがやりたくて

コマンドプロンプトもやればできる子なんです。

元ネタ（[【Mac】【文系の友達にウケるかも】マトリックスごっこのやり方 - Qiita [キータ]](http://qiita.com/smurakami/items/369e4b40290e71960b0b)）

#やり方
- コマンドプロンプトを開き、タイトルバーを右クリックして、「プロパティ」を選択。
- [画面の色] タブで、 [画面の文字] を選択して、明るい緑を選択する。

![コマンドプロンプトの色を変える.PNG](https://qiita-image-store.s3.amazonaws.com/0/28302/de7cd9dd-5cd7-b008-147f-8062e7e04154.png)

- 次のコマンドを入力する

```bat:
>cmd /v:on

>for /l %i in (1,0,1) do @set /p x=!random! <nul
```

#実行結果
![コマンドプロンプトでマトリックスごっこ.PNG](https://qiita-image-store.s3.amazonaws.com/0/28302/87e294a7-6958-aa46-3063-4e6c0cb15d8c.png)

`Ctrl + c` を長押ししてたら止まります。

#【追記】もうちょっとマトリックスっぽく
こっちの方が、もうちょっとマトリックスっぽい気がする。

```bat:
>for /l %i in (1,0,1) do @set /p x=!random:~-1! <nul
```

##実行結果
![もうちょっとマトリックスっぽく.GIF](https://qiita-image-store.s3.amazonaws.com/0/28302/4e12ffd4-0723-7316-4897-787c16b582b6.gif)


#参考
- [Windows環境変数メモ(Hishidama's Windows Environment Memo)](http://www.ne.jp/asahi/hishidama/home/tech/windows/env.html)
- [改行をしないECHO（コマンドプロンプト）: むった～](http://tsubuyakky.asablo.jp/blog/2010/06/12/5155918)
CentOS に 2.6 以上の redis をインストールしたい

概要
=============
普通に `yum install redis` すると 2.4 がインストールされた。
2.6 以上が必要なので何とかしたい。
コンパイルは面倒だし、service スクリプトも作りたくない。

方法
=============
REMI リポジトリを利用する。

```bash
wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
sudo rpm -Uvh remi-release-6*.rpm epel-release-6*.rpm
sudo yum --enablerepo=remi,epel install redis
sudo service redis start
sudo chkconfig redis on
```

参考
=============
- [Install Redis on CentOS 6.4 | Thoughts & Ramblings of a Software Developer](http://thoughts.z-dev.org/2013/05/27/install-redis-on-centos-6-4/)
AngularJSのアプリを/以外の場所に配置する時に気を付けなければならない事

普通にAngularJSでアプリを書いていくと、/以下に配置することを前提としたアプリに仕上がると思います。
やらなければならないのは以下の３つです。

1. .js、.css等を環境ごとのパスに合わせる
2. リンクとルーティングを環境ごとのパスに合わせる
3. grunt-connectでテスト出来るようにする

Gruntfile.jsとmain.jsの2か所の変更だけで済むようにテンプレートを更新しました。

[progre/template-grunt at static-angularjs](https://github.com/progre/template-grunt/tree/static-angularjs)

```js:Gruntfile.js
var modRewrite = require('connect-modrewrite');

var projectConfig = {
  root: '/' // ←【変更１】配置先に合わせて変更
};

// connect用の設定
function rewriteMiddleware(connect, options) {
  return [
    modRewrite(['^' + projectConfig.root + '(?!html/).*\\.html$ /index.html [L]']),
    projectConfig.root === '/' ? connect.static(options.base)
      : function(req, res, next) {
        req.url = req.url.replace(new RegExp('^' + projectConfig.root), '/');// ←projectConfig.root以下へのアクセスを/以下へのアクセスに書き換える
        return connect.static(options.base)(req, res, next);
      }
  ];
}
...
    jade: {
      release: {
        options: {
          data: {
            root: projectConfig.root // ←.jadeでroot変数を使えるように
          }
        }
      },
      debug: {
        options: {
          data: {
            root: projectConfig.root, // ←同上
            debug: true
          }
        }
      }
    },
...
```

```jade:index.jade
doctype html
meta(charset='utf-8')
title
link(rel='stylesheet', href='//netdna.bootstrapcdn.com/bootstrap/3.0.3/css/bootstrap.min.css')
link(rel='stylesheet', href='#{root}css/style.css') //←絶対パスはroot変数+パスとして記述する
...
```

```ts:main.ts
...
var root = '/'; // ←【変更２】配置先に合わせて変更

var app = angular.module('app', ['ngRoute', 'ngAnimate']);
app.config(['$routeProvider', '$locationProvider',
    ($routeProvider: ng.route.IRouteProvider, $locationProvider: ng.ILocationProvider) => {
        $locationProvider.html5Mode(true);
        $routeProvider
            .when(root, { // ←↓ root変数+パスとして記述する
                templateUrl: root + 'html/index.html', controller: 'IndexController'
            }).otherwise({
                templateUrl: root + 'html/404.html'
            });
    }
]);
...
```
GSON2.1.xでStackOverFlowErrorが発生するのを何とかしたい


完全にその場しのぎですが、GSON1.7.1を使うとエラーが消えます
盛大にハマった。。

## 問題の詳細
まずサーバ側の問題かどうか判断するためにcurlで確認した。
サーバからレスポンスを取得するところまでは成功しているみたい。

クライアント側でオブジェクトに変換されずエラーを吐いている。
GSON内のawesomeな処理が無限に呼び出されている様子。。

## 再現条件
* gradleを使って最新(2014-01-21時点)の2.2.4を使ってインストールしてた。
	- Android4.1.1 + GSON2.2.4 => 動作する
	- Android4.2.2 + GSON2.2.4 => 動作しない
	- Android4.3   + GSON2.2.4 => 動作しない

## 対処方法
GSON1.7.1を使いましょう。
参考：https://code.google.com/p/google-gson/issues/detail?id=440&sort=priority
chef の node.name が fqdn に設定している行を探る。

以下の様なテンプレートを書いても、CNAME で振っているサーバーだと、期待した出力にならない。

```
NETWORKING=yes
HOSTNAME=<%= node.name %>
NOZEROCONF=yes
NETWORKING_IPV6=no
IPV6INIT=no
IPV6_ROUTER=no
IPV6_AUTOCONF=no
IPV6FORWARDING=no
IPV6TO4INIT=no
IPV6_CONTROL_RADVD=no
```

DNS で `CNAME foo.bar.com => ec2-xxxx.amazonaws.com` としている。

`nodes/foo.bar.com.json` だった場合、`node.name == foo.bar.com` であってほしいのに対して、出力は `ec2-xxxx.amazonaws.com`

* `node.name` を解決しているのは `Chef::Client`: [Chef::Client#node_name](https://github.com/opscode/chef/blob/master/lib/chef/client.rb#L266)
* `Chef::Config[: node_name]` がなければ、`ohai[:fqdn] || ohai[:hostname]` で取ってくる。
* `ohai` は [Ohai::System](https://github.com/opscode/ohai/blob/master/lib/ohai/system.rb) インスタンス。
* `:fqdn` ないし `:hostname` の解決は、ohai の [hostname plugin](https://github.com/opscode/ohai/blob/master/lib/ohai/plugins/hostname.rb) で行っている。
* `knife solo` で `-N foo.bar.com` を指定してやると期待通りになる。
  ```bash
  knife solo cook -N foo.bar.com foo.bar.com
  ```  
  オプションつけ忘れなどで人的ミスにつながるよね、ということで、`-N` なしで実行したいよね、ということで、却下。
* じゃどうする？... To be continued...
Heroku Toolbeltに同梱のRubyを使い、tumblr_clientを使ったRubyスクリプトをEclipseでデバッグできるようになるまで

以下、作業記録の殴り書きです^^;

heroku-toolbeltに同梱のRubyのバージョンは、 `ruby 1.9.3p448 (2013-06-27) [i386-mingw32]`

# tumblr_clientが使えるようになるまで

heroku-toolbeltをインストール後、

```
gem install tumblr_client`
```

は、`faraday requires multipart-post (~> 1.2.0)` で失敗したので、gemのアップデートをおこなうことに。

```
gem update
```

しかし、json他、いくつかのgemでエラー。ビルドツールが必要とのことなので、

```
ruby dk.rb init
ruby dk.rb install
gem update
```

でgem updateが完了。そこで改めて

```
gem install tumblr_client
```

をするも、`Unable to resolve dependencies: faraday requires multipart-post (~> 1.2.0)` で失敗。gem自体のバージョンを更新したらどうかと思い、

```
gem install rubygems-update
update_rubygems
```

をしてから、 `gem install tumblr_client` で、今度は成功。ところがtumblrコマンドで、Tumblrクラスを使用するとFaraday関係のエラーが発生し、Faradayのバージョンが新しすぎるのではないかと思い、

```
gem uninstall faraday
# (0.9.0.rc7を削除)
gem install faraday -v 0.8.8
```

とし、Faradayのバージョンを0.8.8にしたところtumblrコマンドでの操作が成功し、tumblr_clientが普通に使えるようになりました。


# EclipseでRubyのデバッグができるようになるまで

`gem install ruby-debug` は、エラー。
`gem install ruby-debug19` にすればいけるという情報が散見されるので試してみるも、惜しい感じで失敗。
最終的に `gem install debugger` にてEclipseにてデバッグ(ブレークポイントやステップ実行など)ができるようになりました。
【Mac】【文系の友達にウケるかも】マトリックスごっこのやり方

おはようございます。今日はマトリックスごっこのやり方を紹介したいと思います。Macなら誰でも出来ますが、LinuxなどUnix系OSでも出来ることが多いです。

# 動機
文系の友達から見たら情報系って不思議な生き物。「情報系ってってあの、いつもパソコンで難しい暗号を書いてる人たちだよね...」
そんな友達にちょっと情報系のカッコいいところを見せてあげましょう。

# やり方
まず最初にターミナル.appの外見を整えておきましょう。見た目はとても大事です。
アプリケーションから、ユーティリティフォルダ内の「ターミナル.app」を開きます。
![スクリーンショット 2014-01-21 8.34.02.png](https://qiita-image-store.s3.amazonaws.com/0/33933/8c931c2c-efb4-6a62-ebc1-7a1d52115e00.png)

[command + ,]を押して環境設定を開きます。最初はデフォルトのプロファイルが「Basic」になっているので、これを「Homebrew」に変更します。「Homebrew」をクリックしたのち画面左下の「デフォルト」をクリックして設定完了。

![スクリーンショット 2014-01-21 8.41.04.png](https://qiita-image-store.s3.amazonaws.com/0/33933/578305de-28f9-5cd8-6836-4d85f8352bb7.png)

これで準備が完了。ウインドウを全部閉じた後に、新しいウインドウを開いてみましょう。このように黒背景に緑の文字のウインドウが開いたら成功。

![スクリーンショット 2014-01-21 8.45.41.png](https://qiita-image-store.s3.amazonaws.com/0/33933/85ddcfec-54fd-d50c-972e-213faa1a473e.png)

いよいよ本番です。ウインドウを全画面モードにして、`/dev/`ディレクトリに移動しましょう。

```shell-session
cd /dev/
```

そして以下を実行します。

```shell-session
od random
```

![スクリーンショット 2014-01-21 8.48.18.png](https://qiita-image-store.s3.amazonaws.com/0/33933/6fb0cbb8-93fb-07d5-cc97-8a4a03c59273.png)

おお！マトリックスっぽい！
終了はおなじみ`Ctrl-c`で。

`/dev/random`は乱数を延々と吐き出す面白いファイルです。それを`od`コマンドで数字に直して見ています。`Ubuntu`などLinuxでは、`/dev/random`は少ししか乱数を吐き出してくれないので、乱数の真性度(?)が低いかわりにたくさん乱数を吐き出してくれる`/dev/urandom`で代用しましょう。

# /dev/
`/dev/`には他にも、延々と0を吐き出し続ける`/dev/zero`やいつ見ても空な`/dev/null`など、個性的なファイルがたくさんあります。一度探検してみると楽しいです。今は無いですが、昔のUbuntuにはマイクが拾った音を延々と吐き出す`/dev/dsp`なるものもありました。面白いですね〜。
SIMAファイルから画地名称を取り出す

一部修正として送られてくるSIMAファイルに含まれる画地の名称を取り出すスクリプトを書いてみました。
標準出力に出てきた画地名称をWingNeo INFINITYのワイルドカード選択に突っ込むと変更のあった画地だけを選択できます。

```ps1
$SIMA = Get-Content $args

$SIMA | foreach {
   if ( $_ -match "^D00") {
      Write-Output $_.Split(',')[2].Replace(" ","")
   }
}
```

スクリプトの引数としてSIMAファイルのパスを渡すと`$args`に渡されて`＄SIMA`変数に内容を読み込みます。
foreachで行ごとに呼び出して「D00」で始まる行(`$_`)があったら「,」で配列に分割してから2番目のカラム=画地名称を取り出します。
測量ソフトによってはカラムの文字数を合わせるために半角スペースで埋めているものがあるので容赦なく半角スペースは消しています。

本当はワンライナーで書きたかったのですが、順を追ってワンライナーを目指してみます。

なお、普段はWindows用テキストエディタのxyzzyにSIMAファイルをドロップしてから`C-x #`でfilter-bufferに対してRubyのワンライナーで取り出しています。

```rb
ruby -ne "puts $_.split(',')[2].gsub(' ','') if $_ =~ /^D00/"
```

測量ソフトを操作するときはマウスも使ってるのでPowerShellでスクリプトに突っ込むよりxyzzyとRubyの組み合わせの方g(ry
jQueryを使用してCSSを変更する。

下のような書き方になる。

```ruby:kobito.rb
$(function(){
	$('.#typo .inner').css('color', '#ebc000');
});```

これだと、、、HTML中のtypoとinnerに対して、cssで文字カラーを
変更する命令になる。

よってjQueryのCSSメソッドでプロパティ値を取得するには

$(function(){
	$('.#typo .inner').css('color');
});```

変更するタイミングを変える

$(function(){
	$('#typo').on('click', function(){
    	$('#typo').css('color', '#000000');
	});
});

これだと、ID=typoでクリックしたとき、ID=typo内のCSSの文字色
が黒になる。
画面の向きを固定する


プロジェクト設定から簡単に出来ました。

![スクリーンショット 2014-01-21 7.51.05.png](https://qiita-image-store.s3.amazonaws.com/0/6061/4355567d-b386-bf38-3e15-195c340afd76.png "スクリーンショット 2014-01-21 7.51.05.png")

Device Orientationのチェックを対応したい向きのものだけにします。
SRPMをrpm -ihvを使わずに展開して各ディレクトリーに移動する

指定のSRPMに含まれる各ファイルをカレントディレクトリーをベースにしてSOURCES，SPECSに移動する．

```
#!/bin/sh
FILES=`rpm -qlp $1 2> /dev/null`

if [ "${FILES}x" = "x" ]; then
    echo error.
    exit;
fi

rpm2cpio $1 | cpio -id

mkdir -p {BUILD,SRPMS,RPMS,SOURCES,SPECS}
for file in $FILES
do
    if [ `echo $file|grep '\.spec$'` ]; then
        mv -v $file SPECS/.
    else
        mv -v $file SOURCES/.
    fi
done
```
FluentdのOutputPluginから間隔空けて行儀よくWebのAPIを叩きたい

emitではQueueにpushするだけにして、別スレッドでQueueからpopする形をとれば、行儀よく間隔を空けながらWebのAPIを叩けると考えた次第。

他にはどんな解があるだろう。

## サンプルコード

```rb
    def configure(conf)
      super
      @q = Queue.new
    end

    def start
      super
      @thread = Thread.new(&method(:post))
    end

    def shutdown
      super
      Thread.kill(@thread)
    end

    def emit(tag, es, chain)
      es.each {|time, record|
        param = OpenStruct.new
        param.tag = tag
        param.time = time
        param.record = record

        @q.push param
      }

      chain.next
    end

    private
    
    def post
      loop do
        param = @q.pop
        tag = param.tag
        time = param.time
        record = param.record
        
        #WebのAPIを叩く
        HTTParty.post(@web_api_url, :body => "#{tag},#{param},#{time},#{record}")
        sleep(1)
      end
```

## 利用例

https://github.com/bash0C7/fluent-plugin-idobata/blob/d35eeed4e5a7390e4fa0044aa3b9512a4eff37bd/lib/fluent/plugin/out_idobata.rb#L55

## このやり方について

Inputプラグインでこのようなやり方をよく見ます。
上記の例は固定値でsleep(1)としましたが、実際にはpost_intervalとかの名前でconfigで間隔を指定できるといいでしょう。
【python】変数あれこれ

Pythonでいろいろ試してみた。
今まで静的な型付けの言語しか使ったことがなかったので、
最初は結構戸惑ったけど、ちょっとしたツールレベルのものなら書けるようになってきたと思う・・・。

あと、変数のスコープに苦戦。
他のグローバル変数、クラス変数、インスタンス変数の違いとか。

```py3:test_1.py
#!/usr/bin/env python
# coding:UTF-8

# グローバル変数
global_var = "global"

class Test1(object):
    # クラス変数
    class_var = "class"

    def __init__(self):
        # インスタンス変数
        self.instance_var = "instance"
```

グローバル変数はグローバルと言いつつモジュール（ファイル？）内で扱う変数
呼び出しは変数名のみでOKだけど、中身を変更するときは関数内で下のような宣言が必要

```py3:test_1.py
    def global_var_test(self):
        # グローバル宣言
        global gloval_var
        # その後中身を変更できる
        global_var = "change"
```

ちなみに、他モジュールから呼び出す方法が分からない・・・。
まあ、他モジュールから呼び出すようなものじゃない気もするけど。

クラス変数は、下記のように呼び出すといいと思う。

```py3:test_1.py
    def get_class_var(self):
        return Test1.class_var
```

self.class_varとすると、呼び出すときはクラス変数として呼び出されるが、
代入したらインスタンス変数の初期化となる。
（一回インスタンス変数としたら、次から呼び出すときもインスタンス変数が呼ばれる）

なので、インスタンス名.変数名の形式はインスタンス変数のみに固定したほうが、後の自分のためかな。
Bentoを使って、安心でオイシイVagrant Boxを今すぐに！

Bentoとは
---
PackerでいろんなVagrant Boxを作れるテンプレートとビルドしたBoxを公開しているOpscodeのレポジトリがありました。
その名も「Bento」です！ (※当記事で扱うのはファイルメーカー社の製品ではありません)

Modularized Packer definitions for building Vagrant baseboxes 
http://opscode.github.io/bento

「安心」でオイシイBoxを今すぐに！
---
よく「Vagrantbox.esに公開されている野良Boxは中身がブラックボックスだし使うのはちょっと」なんてお話を見かけます。かといって、自分でBoxをビルドするのも時間がかかって骨が折れるので悩ましいところ。

でも、Bentoなら大丈夫！公開Boxを手軽に利用することができながらも、作成時のテンプレートが公開されているので安心です。これは利用しない手は無いですね！

自分の好みのマシンをビルド可能
---
使いたいBoxを最初からビルドする際も、既にバラエティに富んだ再利用しやすいテンプレートが満載です。
英語ではありますが、READMEの「Build Your Own Boxes」の箇所にビルドコマンドの実行方法が書いているので、Packerさえ入れば何とかできそうです。
https://github.com/opscode/bento

日本語の情報が少ない、でもChef利用者にはすでに常識!?
---
自分も最初のうちは、VagrantやPackerのビルドと情報探しで骨を折ってばかりでした。そしてこの分野の情報探しが大変だったわけですが、最近Chefを使い始めたら、このBentoベースのBoxをOpscodeからDLして、楽に料理をしている人が結構いる！ということに気がつきました。

最初はBentoとの関連が結びつきませんでしたが、GitHubをのぞき回ってBentoを知ってからは「そうか、知ってる人は得してたんだなぁ..」と思ってしまいました:P

こんな便利なBento、ぜひ皆様にも活用してほしいと思ったので、ここに書き記させていただきました。特にこれからはじめる人・もっと使いまわしたい人(※自分含む)にはおススメですので、思う存分使ってみてください！
最大公約フィボナッチ数(?) O((logn)2)

問題：https://codeiq.jp/ace/nabetani_takenori/q649
解説：http://nabetani.hatenablog.com/entry/codeiq_gcfibo_q649

RubyによるO((logn)2)の実装例です。
とりあえず、nlognから(logn)2に縮められたことは収穫でした。
gcfibo()の最適化はしていません。3つ以上の数のgcfiboを求めたいときに使えなくなってしまうので。

ところで。

|オーダー|Ruby 1.8.7|Ruby 2.0.0|
|:--|:--|:--|
|O(nlogn)|0.59s|0.38s|
|O((logn)2)|**0.01s**|0.06s|

Ruby 1.8の方が速い場合ってあるんですね。。

```rb:codeiq649.rb
#!/usr/bin/ruby
class Fixnum
	def fibo
		return to_enum(:fibo) if !block_given?
		yield 1
		a=1
		b=self
		loop{
			yield b
			a,b=b,a+b
		}
	end
	def dfibo
		h={}
		if false #O(nlogn)
			1.step(self-1){|i|
				a=i.fibo.take_while{|e|e<=self}
				if a.last==self
					a.each{|e|h[e]=1}
				end
			}
		else #O((logn)2)
			1.fibo.take_while{|e|e<self}.each_cons(2){|e,f|
				if (self-e)%f==0
					((self-e)/f).fibo.take_while{|g|g<=self}.each{|g|h[g]=1}
				end
			}
		end
		return h.keys.sort
	end
end
DATA.each{|e|
	a=e.split.map(&:to_i)
	puts "GCFibo( #{a.join(', ')} ) = "+a.map(&:dfibo).reduce(:&).last.to_s
}
__END__
10 14
18 14
73 97
23 25
308 320
6168 9877
18518 19942
```

追伸
1を特別扱いしていませんが、それでもdfiboは一応求められる模様。