OmniAICreator/Qiita-1.07M huggingface dataset:
PHPのGetter/Setterについて本気出して考えてみた


　PHPのGetter,Setterいろんな書き方があると思います。いろいろありすぎて困ってるくらいです。

##基本型

```php:
class Person{
    private $name;

    public function get_name($name){
        return $this->name;
    }

    public function set_name($name){
        $this->name = $name;
    }
}
```

まぁこの辺は問題ない。気になるのはSetterで`true`返すのん。あれはなんなの?そういうマナー?とりあえずこのドキュメントではreturn true しませんので。

##配列型

　プロパティが多くなってくると配列になったりする。

```php:配列基本型
class Person{
    private $var = [];

    public function get_name($default=null){
        if(array_key_exist($name,$this->var)){
            retrun $this->var[$name];
        }
        return $default;
    }

    public function set_name($name){
        $this->var["name"] = $name;
    }
}
```
 
　んでgetter/setter書くのも面倒になってきて汎用化してく。

```php:配列汎用getter/setter型
class Person{
    private $var = [];

    public function get($key,$default=null){
        if(array_key_exist($key,$this->var)){
            retrun $this->var[$key];
        }
        return $default;
    }

    public function set($key,$value){
        $this->var[$key] = $value;
    }
}
```

このへんまではまだ良く見る感じ。汎用getterは個人的に好きじゃない。文字列で渡すところがなんか好きじゃない。でも使うけど。

　defaultなんてものの扱いをどうするか、ってあたりはかなり好みの別れる所。そこは例外投げて欲しいよねって場面もあるかと思うので柔軟に。

##マジックメンバ型

　配列要素でも、マジックプロパティとか使って上手いことプロパティっぽくアクセス出来るようにする、みたいな時もある。

```php:マジックプロパティ型
class Person{
    private $var = [];

    public function __get($key){
        return $this->get($key);
    }

    public function __set($key,$value){
        $this->set($key,$value);
    }

    public function get($key,$default=null){
        if(array_key_exist($key,$this->var)){
            retrun $this->var[$key];
        }
        return $default;
    }

    public function set($key,$value){
        $this->var[$key] = $value;
    }
}
```

　多分潔癖な人はマジックメソドの方を好む。

```php:マジックメソド型
class Person{
    private $var = [];

	public function __call($name, $args)
	{
		if (strncmp($name, 'get_', 4) === 0)
		{
			return $this->get(substr($name, 4), reset($args));
		}else (strncmp($name, 'set_', 4) === 0)
		{
			return $this->set(substr($name, 4), reset($args));
		}
		throw new \BadMethodCallException('Method "'.$name.'" does not exist.');
	}

    public function __set($key,$value){
        $this->set($key,$value);
    }

    public function get($key,$default=null){
        if(array_key_exist($key,$this->var)){
            retrun $this->var[$key];
        }
        return $default;
    }

    public function set($key,$value){
        $this->var[$key] = $value;
    }
}
```

##Getter/Setter共通型

　あんまり見ないけどこういう変態的なのはPHPっぽくて好きです。

```php:配列汎用getter/setter型
class Person{
    private $name = [];

    public function name($value = null){
        if(func_num_args()){
            $name = $value;
        }else{
            return $name;
        }     
    }
}
```

　記述量も少なくて済む。でもデフォルト使えない。



　インターフェイス周りはまた別に。あとなんかパターンあったっけ?
MacOSXでEmacsを最大化した時に不必要な空白を消す方法

MacでEmacs24.3を使い最大化すると上になんか変な20pxぐらいの空白が2個できて
2つ合わせて40pxほどの無駄な領域ができてせっかくのフルスクリーンが悲しい感じになります。

## 対策
24.3のバグなのでNightly Buildsの24.3.50を使いましょう。

## インストール方法

gitのHEADからemacsをインストールすると 24.3.50 が入ります。 (2013-09-05時点)

```
$ brew install emacs --cocoa --use-git-head --HEAD
```

今使ってるemacsをリネームして、brewで入れたのをApplicationフォルダにリンク貼っておく

```
$ mv /Applications/Emacs.app /Applications/Emacs.app.stable
$ ln -s /usr/local/Cellar/emacs/HEAD/Emacs.app /Applications/Emacs.app
```

後は Applications フォルダにある Emacs.app のショートカットをDockに置いておくとOK。
でもこの方法だと Spotlight からEmacsを呼び出せないのでちょっと困ってます。

## 参考

osx - Emacs fullscreen on Mountain Lion without Toolbar - Super User
http://superuser.com/questions/597708/emacs-fullscreen-on-mountain-lion-without-toolbar

MacでHomebrewを使ってCocoa Emacsを導入する - @uents diary
http://uents.hatenablog.com/entry/20120303/1330745761
RubyでClojure風loop-recur (末尾再帰)

<a href="http://clojure.org/special_forms#Special%20Forms--(recur%20exprs*)">Clojureのloop-recur</a>を、Rubyでやった。Elixirの古いversionにも有ったらしい。
末尾再帰の最適化 (TCO, tail call optimization) が出来ないsystemだと、助かるみたい。Ruby 2.0.0とかClojureみたいな。

```rb
def factorial n
  cloop n, 1 do |n, acc|
    if n == 0
      acc
    else
      recur n - 1, acc * n
    end
  end
end
```
みたいに使ふ。
<code>instance_eval</code>しか知らなくて、<code>instance_exec</code>を見附け出すのに一番時間が掛った。アホだ。

Rubyだと、末尾再帰をloopに変換するmethod実装例とかも、検索すれば見附かるけど。
<i>cf.</i> [Rubyで末尾再帰最適化をする。 - athosの日記](http://d.hatena.ne.jp/athos/20110119/p1)
<i>cf.</i> [Rubyの末尾再帰最適化を理解する](http://melborne.github.io/2011/01/20/Ruby/)
因みに多分、次のversionには入るんじゃないかな。
<i>cf.</i> [CRubyで末尾最適化を使った再帰 - yarbの日記](http://d.hatena.ne.jp/yarb/20121029/p1)
<i>cf.</i> [10 Things You Didn't Know Ruby Could do - SSSSLIDE](http://sssslide.com/speakerdeck.com/jeg2/10-things-you-didnt-know-ruby-could-do#43)
個人的にはTCOが無くても、殆どの場合はEnumerableを使へば困ってない。偶に欲しい事が有る。

# 実装

```rb
# license: Public Domain

$DEBUG = true

# {{{ util

# Rubyで、D言語風にassertionを直書きする簡易unit test - c4se記：さっちゃんですよ☆
# http://c4se.hatenablog.com/entry/2013/08/15/022137
#
# @param test_name [String]
def unittest test_name, &proc
  if $DEBUG
    include Test::Unit::Assertions
    proc.call
    puts "#{test_name} ok."
  end
end
if $DEBUG
  require 'test/unit/assertions'
end

# }}}

# loop-recur like Clojure special form
# http://clojure.org/special_forms#Special%20Forms--(recur%20exprs*)
class LoopRecur
  def initialize proc
    @proc = proc
    @params = []
  end

  def eval params = []
    @params = params
    start
  end

  private
  def start
    v = self
    while v == self
      v = instance_exec *@params, &@proc
    end
    v
  end

  def recur *params
    @params = params
    self
  end
end

module Kernel
  def cloop *params, &proc
    LoopRecur.new(proc).eval(params)
  end
end

unittest 'loop-recur works' do
  v = cloop 5, 0 do |n, acc|
    if n <= 0
      acc
    else
      recur n - 1, acc + n
    end
  end
  assert_equal 15, v
end

unittest 'loop-recur can make tail recurusion' do
  v = cloop 1 do |n|
    if n == 10000
      n
    else
      recur n + 1
    end
  end
  assert_equal 10000, v
end
# vim:set et sw=2 sts=2 ff=unix foldmethod=marker:
```

<i>cf.</i> [RubyでClojure風loop-recur (末尾再帰) - c4se記：さっちゃんですよ☆](http://c4se.hatenablog.com/entry/2013/09/05/184937)
sinatraをwindowsでお手軽に起動したらwebrickが遅い



## 症例
社内でお手軽にsinatraでサイト作って公開したは良いけど、windows機（win7）で動くsinatraが、他の端末からアクセスすると平均5秒程度かかる。


## 解決策
下記参考から抜粋すると、webrickの設定変更で解決する模様。

参考： _Rubyでwebrickの動作が遅い場合の対処 - むかぁ～ どっと こむ_
　　　http://mukaer.com/archives/2012/03/16/rubywebrick/

windows機のRubyのインストールフォルダに潜る。
[インストールフォルダ]\lib\ruby\2.0.0\webrick\config.rb

```ruby
      :DoNotReverseLookup => nil,
```
を、

```ruby
      :DoNotReverseLookup => true,
```

にして、sinatra再起動。
解決した。
Chromeに追加して効率改善できる呪文(I'm Feeling Luckey)

Chromeに追加しておくと異様に効率が改善する魔法を見つけたので共有します。

# I'm Feeling Luckey
Googleの機能で、検索画面をスキップして最上位の結果を表示してくれる機能が「I'm Feeling Luckey」。

検索って、「調べごと」ではなく「目的地へ到達する」ための手段として使うことがありますよね。
こういう場合、たいていは最上位が目的ページなのでこの機能が有効です。

僕の場合、後者の使い方がすごく多かったので効率が異様に改善しました。

# How to
Chromeのコンテキストメニューから「Setting」から「Search」にある「Manage search engines...」をクリックする。  
ここから、大体こんな感じに検索エンジンの設定を入れる。

 - Search Engine
  - I'm Feeling Luckey
 - Keyword
  - l
 - URL
  -  http://www.google.com/search?q=%s&btnI=Im+Feeling+Lucky

![Screenshot from 2013-09-05 18:51:23.png](https://qiita-image-store.s3.amazonaws.com/0/18520/4b4996d3-b451-bff5-a3b3-aa009c26ef94.png)

検索するときは

 - l ほげほげ

みたいな感じで検索すると直接飛べる。

Enjoy!
Deviseでログイン/ログアウト後のリダイレクト先をログイン/ログアウトする前のページにする


###参考

[How To: Redirect back to current page after sign in, sign out, sign up, update · plataformatec/devise Wiki](https://github.com/plataformatec/devise/wiki/How-To:-Redirect-back-to-current-page-after-sign-in,-sign-out,-sign-up,-update)

session[:previous_url] にいれるようにすればいい。

ApplicationController で

```ruby:
after_filter :store_location

def store_location
 # 今回の場合は、 /users/sign_in , /users/sign_up, /users/password にアクセスしたとき、ajaxでのやりとりはsessionには保存しない。
    if (request.fullpath != "/users/sign_in" && \
        request.fullpath != "/users/sign_up" && \
        request.fullpath != "/users/password" && \
        !request.xhr?) # don't store ajax calls
      session[:previous_url] = request.fullpath 
    end
end

#ログイン後のリダイレクトをログイン前のページにする場合
def after_sign_in_path_for(resource)
  session[:previous_url] || root_path
end

#ログアウト後のリダイレクトをログアウト前のページにする場合
def after_sign_out_path_for(resource)
  session[:previous_url] || root_path
end
```
HTML5 time要素のフォーマット


HTML5の`time`要素は安易に日付を囲えばいい要素ではなく、一度は仕様をしっかりと読んだほうがいい新要素です。

# time要素/datetime属性のフォーマット

その仕様のひとつに`datetime`属性があって、`time`要素のテキストコンテントが **マシン可読なフォーマット** に準拠しない場合は`datetime`属性を代替として正しい日付と時間をユーザーエージェントに理解させる必要があります。

```html:example
<time>1999-12-31</time> <!-- 正しい -->
<time>1999年12月31日</time> <!-- 誤り -->
<time datetime="1999-12-31">1999年12月31日</time> <!-- 正しい -->

<time>23:59</time> <!-- 正しい -->
<time>23時59分</time> <!-- 誤り -->
<time datetime="23:59">23時59分</time> <!-- 正しい -->
```

下記のリンクがとても詳しいです。

[time要素 - HTML5.jp](http://www.html5.jp/tag/elements/time.html)

## 基本的なフォーマット

いろいろ種類があるので混乱しますが、これだけ覚えておくだけでも間違いないと思います。

### 日付

```
YYYY
YYYY-MM
YYYY-MM-DD
MM-DD
```

### 時間

```
hh:mm
hh:mm:ss
```

### 日付と時間

```
YYYY-DD-MM hh:mm
```

## 各言語の出力フォーマット

上記のフォーマットを各言語の日付APIのフォーマット文字列になおしてみました。

### JavaScript ([moment.js](http://momentjs.com/))
```js:moment.js
moment().format('YYYY-MM-DD hh:mm:ss');
```

### PHP

```php:PHP
date('Y-m-d H:i:s');
```

### JAVA

```java:JAVA
new SimpleDateFormat("yyyy-MM-dd HH:mm");
```

### Ruby

```ruby:Ruby
Time.now().strftime('%Y-%m-%d %H:%M:%S')
```
ActiveRecordにこういう機能があったらどうでしょう？をgemにしてみた


https://github.com/tkawa/activerecord-endoscope

## 説明

よくこういうコードありますよね。

```ruby
class User < ActiveRecord::Base
  # User.admin
  scope :admin, -> {
    where(role: 'admin')
  }
  # user.admin? # => true or false
  def admin?
    self.role == 'admin'
  end
end
```

scope（クラスメソッド）とインスタンスメソッド両方の定義が必要ですが、内部でやっていることは本質的には同じことです。

これを`scope :admin`だけ定義しておくと、`admin?`も自動的に使えるようになるっていう機能、作ったら需要ありますかねぇ？

https://github.com/amatsuda/arel_ruby
を使ったらできるんじゃないか、という思いつき。複雑なのは無理だろうけど…。

# 実装してみた
（9/6 追記）
<del>arel_ruby の対応の都合で、Rails 3.2でしか動きません。</del><ins>Rails 4でも動きます！</ins>

```Gemfile
gem 'arel_ruby'
```
```config/initializers/scope_ext.rb
ActiveRecord::Base.class_eval do
  def self.scope(name, scope_options = {})
    super

    class_eval <<-METHOD
      def #{name}?
        self.class.#{name}.arel.to_ruby.call([self]).present?
      end
    METHOD
  end
end
```

たったこれだけで、上の`user.admin?`は余裕で動きます。すごい！

## しかし

```ruby
  scope :not_admin, -> {
    where('role != "admin"')
  }
```
こうすると、`user.not_admin?`は動きません。
文字列で書くとSQLの一部(Arel::Nodes::SqlLiteral)になるので、SQL依存になってしまうのですね。

## そこでArel
直接Arelを使えば、複雑な条件もSQL文字列を使わずに記述できます。

```ruby
  scope :not_admin, -> {
    where(arel_table[:role].not_eq('admin'))
  }
```
しかし`user.not_admin?`は動かない…。
理由は

* `Cannot visit Arel::Nodes::NotEqual` visit_Arel_Nodes_NotEqualが未実装
 - でもこれはEqualityの逆なのですぐ実装できる
* Arel::Nodes::Groupingがつく
 - SQLでいう`(...)`。これはRubyではどう表せばいいんだ？
 - とりあえずこんな感じでいけるっぽい

```lib/arel/visitors/ruby.rb
      def visit_Arel_Nodes_Grouping o
        v = visit o.expr
        ProcWithSource.new("select {|o| o.#{v.to_source}}") { |collection| collection.select {|obj| v.call(obj) } }
      end
```

これで動いたよ。
まだまだ実装されてないvisitorがいっぱいだけど…。
https://github.com/amatsuda/arel_ruby/blob/master/lib/arel/visitors/ruby.rb

ひとまずこっちでがんばって実装してます。だいたいのqueryは動くはず。
https://github.com/tkawa/arel_ruby/blob/master/lib/arel/visitors/ruby.rb


# 現段階でのまとめ

思いつきにしてはそれなりに動いたし、なかなか良いのでは？

gemつくりました。<del>テストがまだだけど。</del><ins>テストも書きました。</ins>
https://github.com/tkawa/activerecord-endoscope
kvm

```bash:
$ kvm-ok
INFO: /dev/kvm does not exist
HINT:   sudo modprobe kvm_intel
INFO: For more detailed results, you should run this as root
HINT:   sudo /usr/sbin/kvm-ok
```

```bash:
$ sudo /usr/sbin/kvm-ok
INFO: /dev/kvm does not exist
HINT:   sudo modprobe kvm_intel
INFO: Your CPU supports KVM extensions
INFO: KVM (vmx) is disabled by your BIOS
HINT: Enter your BIOS setup and enable Virtualization Technology (VT),
      and then hard poweroff/poweron your system
      KVM acceleration can NOT be used
```

BIOSで有効にする。(HPのサーバーの例)
--------
  アドバンスド
  -> プロセッサオプション
  -> インテルバーチャライゼーション・テクノロジー
  -> 有効

```bash:
$ sudo /usr/sbin/kvm-ok
INFO: /dev/kvm exists
KVM acceleration can be used
```
F#でモンテカルロ法

#モンテカルロ法

E[H(Ω)]を求めるに際して、
繰り返しランダムなΩの値を得てH(Ω)を計算し、その平均を求めることで近似値を求める。

#コード

```fsharp

//E[H(Ω)]
let mean H omega =
    Seq.fold (fun xs (o, mu) -> xs + H o * mu) 0.0 omega
    
//確率変数rvを使ってモンテカルロ法
let monte H rv =
    let N = 100000
    let omega = seq{
        for i in 0..N do
            yield (rv(), 1.0)
    }
    (mean H omega) / float N

[<EntryPoint>]
let main argv = 
    let rv = () |> fun () ->
        let r = new System.Random()
        fun () -> (r.NextDouble(), r.NextDouble())
    
    let pi_q = monte (fun (x, y) -> ceil (1.0 - (x ** 2.0 + y ** 2.0))) rv
    printfn "%A" (pi_q * 4.0)
    0


```

#メモ

* F#は楽しい
* もうちょっとマシなクロージャの書き方をしたい
* System.Randomはメルセンヌツイスタでは無いらしい（詳しくは調べてない）
* seq式使わない版を書いたほうがいいかもしれない
* ループを並列化するとき渡されたrvのスレッド安全性が心配
NavigationDrawerとフリックでの表示

最近のアプリだとFacebookやGmail、Foursquareなど、フリックすると左側からペロッと出てくるメニュー、ありますね？アレの実装サンプルを探していたら、SupportLibraryにDrawerLayoutというのがありました。これを使えば実装できます。google的には```navigation drawers```というそうです。

http://developer.android.com/training/implementing-navigation/nav-drawer.html

詳細はサンプルソースを診てもらうことにして、要するに

```java
_DrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
_DrawerToggle = new ActionBarDrawerToggle(
        this,
        _DrawerLayout,
        R.drawable.ic_drawer,
        R.string.drawer_open,
        R.string.drawer_close
) {

    @Override
    public void onDrawerClosed(View drawerView) {
        getActionBar().setTitle(_Title);
        invalidateOptionsMenu();
    }
    @Override
    public void onDrawerOpened(View drawerView) {
        getActionBar().setTitle(_DrawerTitle);
        invalidateOptionsMenu();
    }
};

_DrawerLayout.setDrawerListener(_DrawerToggle);
```

こんな感じでフリックで表示するドロワーを```DrawerLayout```とし、DrawerListenerに```ActionBarDrawerToggle```をセットすればActionBar上でうまいことしてくれるということらしいです。


## でも、フリックで反応しない

但し、これで実装した場合、フリックでうまく出てきません。というか、正確に言うと左画面端から、画面外→内へのフリックでしか反応しません。これは最近のデカサイズ端末では厳しい。

そうすると画面上、どこでも左→右へのフリックでドロワーを表示したいのが心情ですね。GestureDetectorでフリック操作でもドロワーをオープンします。

```java
private GestureDetector gd;
gd = new GestureDetector(this, new FlingHandler());

private class FlingHandler implements GestureDetector.OnGestureListener {

    @Override
    public boolean onDown(MotionEvent e) {
        return false;
    }

    @Override
    public void onShowPress(MotionEvent e) {
    }

    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        return false;
    }

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
        return false;
    }

    @Override
    public void onLongPress(MotionEvent e) {
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        float dx = Math.abs(velocityX);
        float dy = Math.abs(velocityY);
        if(dx > dy && dx > 200) {
            if(e1.getX() - e2.getX() < 150) {
                //show drawer
                _DrawerLayout.openDrawer(_DrawerList);
                return true;
            }
        }
        return false;
    }
}
```

フリックの実装だけです。但し、これだけだと画面上のフリックをonTouchEventでは拾えません。子のViewでEventを拾われてしまうので`dispatchTouchEvent`でフックします

```java
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    return gd.onTouchEvent(ev) || super.dispatchTouchEvent(ev);
}
```
Excelでうまく開けないCSVに出会った

DBから取ってきたデータをCSVで吐きたい、なんてよくあるケースだと思います。

で、まあ今回お仕事でそんな機会があって、実装してたんですけど。。。
なんと吐いたCSVをExcelで開こうとすると、警告でまくり。テキストで見ても問題なし、ちゃんと期待通り。

ちなみに吐いたCSVのフォーマットは

```
ID,カラム1,カラム2
1,column11,column12
2,column21,column22
```

ご存知の方はここで「あー」って思われるでしょうね。

# 原因
Excelの仕様上、最初の要素が **半角のID** だと、SYLKというファイルに勘違いされちゃうみたいです。
refs: http://support.microsoft.com/kb/323626/ja

SYLKって何よ？　って方はこれ参照
refs: http://www.sophia-it.com/content/SYLK

# 回避方法
いくつか方法があって、

1. ダブルクォートで括る
2. IDを小文字にする
3. IDを全角にする
4. そもそもIDを別の文字に変える

だそうです。
VirtualBoxでCentOS6.4(x64)がインストールできなかった話

備忘録として

# 概要
* Windows7(x64)のVirtualBoxからCentOS6.4のゲストを作ろうとしたところ以下のようなエラーが出た

>Loading vmlinuz...
>Loading initrd.img.......................................ready.
>This kernel requires the following features not present on the CPU
>(pae
>Unable to boot - please use a kernel appropriate for your CPU.

## 環境
* ホスト
 * VAIO Fit 15E
  * Windows7 Professional 64bit
 * VirtualBox 4.2.16
* ゲスト
 * CentOS6.4 64bit

# 結論
* BIOSの仮想化機能が有効になっていなかった
 * Advanced > CPU Configuration >  Intel(R) VirtualizationTechnology > [Enabled]
  * VAIOの場合、電源OFF状態で電源ボタン横のASSISTボタンからBIOS画面を出すことができる
  * VirtualBoxで仮想マシンを作成する際にバージョンがRed Hat (64bit)になっていれば起動時にBIOSの設定が不足していることを教えてくれるみたいだが、当初Red Hatになっていたためメッセージが出なかった

# 経過
1. http://sunfl0w3r.blog77.fc2.com/blog-entry-94.html みてVirtualBox側の設定でPAE/NXを有効化しないといけないことを確認する
 * 設定見るがチェックボックス入ってる、なんでだ?
1. ゲストを作り直す
 * このときバージョンに64bitがついてないことに気づく
1. BIOS設定の変更
1. 起動する->成功
Vimで矢印キーの有効無効を切り替える

<!-- too_old -->
> **この記事は最終更新から1年以上経過しています。** 気をつけてね。

[実践Vim](http://ascii.asciimw.jp/books/books/detail/978-4-04-891659-2.shtml) を読んでいます、基本機能の習得・おさらいにはとても良い本だと思います。

さて、

> コラム：矢印キーに指を伸ばすクセをやめる

によると、 **矯正期間に限り** vimrcで矢印キーを無効にしてしまうという例があった。

まだまだhjklでの移動をしない軟弱者なので、切り替えできるようにしてみた。

```vim:.vimrc
function! HardMode ()
  noremap <Up> <Nop>
  noremap <Down> <Nop>
  noremap <Left> <Nop>
  noremap <Right> <Nop>
endfunction

function! EasyMode ()
  noremap <Up> <Up>
  noremap <Down> <Down>
  noremap <Left> <Left>
  noremap <Right> <Right>
endfunction

command! HardMode call HardMode()
command! EasyMode call EasyMode()
```

これで`:HardMode`と打てば矢印キーが無効になり、`:EasyMode`でまた有効にできた。集中して作業できる時にHardModeにしてみよう。


なお、`EasyMode`が`Explore`と出だしがかぶっているので、`E`をよく使う人は別名にしましょう。
仕事環境としての固定IP


フリーランサーや自宅で仕事し、固定IPからアクセスする事が必要な人の為のメモ

なんか無駄に高い料金とるところはなんだろう。
以下はおすすめとか言うわけでもなくて、こんなのがあるよと言うリストです。

## 自宅のIPを固定

* 使ってるプロバイダのオプションを確認してみる
	* [固定IPアドレス割り当てサービス | 法人向けサービス So-net | So-net](http://www.so-net.ne.jp/staticip/ "固定IPアドレス割り当てサービス | 法人向けサービス So-net | So-net")
	* [固定IPアドレスが安い。月々800円（税抜）｜プロバイダ ASAHIネット](http://asahi-net.jp/service/option/fixedip/ "固定IPアドレスが安い。月々800円（税抜）｜プロバイダ ASAHIネット｜料金、接続品質、満足度で比較して選ばれるISP")


## モバイルのIPを固定

* [インターリンクの固定IPに対応したWiMAXサービス](http://www.interlink.or.jp/service/wimax/ "インターリンクの固定IPに対応したWiMAXサービス")
* [ASAHIネット LTE｜プロバイダ ASAHIネット(法人向け)](http://asahi-net.jp/biz/service/mobile/lte/ "ASAHIネット LTE｜プロバイダ ASAHIネット(法人向け)｜フレッツ光＆固定IPでビジネスのコスト削減")
* [グローバルIPアドレスオプション｜UQ WiMAX｜超高速モバイルインターネットWiMAX2+](https://www.uqwimax.jp/service/price/option07.html "グローバルIPアドレスオプション｜UQ WiMAX｜超高速モバイルインターネットWiMAX2+")

## VPNサーバを建てる

* 所属会社や元請けの会社のVPNに入れてもらう
* OpenVPNで自分用のVPNサーバを建てる


### OpenVPN

openvpnについて

* [OpenVPN - Open Source VPN](http://openvpn.net/ "OpenVPN - Open Source VPN")
* [OpenVPN.JPへようこそ！ | OpenVPN.JP](http://www.openvpn.jp/ "OpenVPN.JPへようこそ！ | OpenVPN.JP")

各OSクライアント有り

#### どこに建てるか

* EC2
* 国内クラウド(多分こっちのほうが安い)
Android StudioでWDB†DB PRESS vol.76のGoogle Play In-app Billingのサンプルを動かした

シャナイベンキョーカイさせていただきました。

当該のサンプル、最近のAndroid Studioで開こうとしたら色々いじらないと動かなかったのでここにメモ。これはもしかして古いAndroid Studioで作成したプロジェクトの移行手順だったりするのだろうか…？

## バージョン

![スクリーンショット 2013-09-05 12.24.09.png](https://qiita-image-store.s3.amazonaws.com/0/569/a17ff2ad-6b98-7bcf-1633-07d3eee091fd.png)

どこを見ればバージョンが出るんだろう…  http://developer.android.com/sdk/installing/studio.html から v0.2.x とやらを落とした。x????

## SDKの設定

「File」→「Project Structure」→「Project」→「Project SDK」。それっぽいのに指定。

## Gradleのバージョンを上げる

```groovy
buildscript {
    repositories {
        maven { url 'http://repo1.maven.org/maven2' }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.5.+'
    }
}
```
 `gradle:0.4` だッたのをこうするといいらしい。  http://stackoverflow.com/questions/17634708/android-studio-upgraded-from-0-1-9-to-0-2-0-causing-gradle-build-errors-now/17648742#17648742

## SampleBillingApplicationProject.iml からFacetManager componentを消す

```xml
  <component name="FacetManager">
    <facet type="android-gradle" name="Android-Gradle">
      <configuration>
        <option name="GRADLE_PROJECT_PATH" value=":" />
      </configuration>
    </facet>
  </component>
```

この辺を潔くコメントアウト。 http://stackoverflow.com/questions/17614477/gradle-failure-could-not-determine-which-tasks-to-execute

## AVD を入れ直す

ツールバーにAVD Managerのボタンがあるので押すと、入れ直せる感じの画面が出るので入れる。

![スクリーンショット 2013-09-05 12.33.43.png](https://qiita-image-store.s3.amazonaws.com/0/569/dea6bcc7-512c-7c7e-b759-3a64345546a8.png)

ちなみに使えないエミュレータを使った場合、エラーメッセージは http://stackoverflow.com/questions/9712605/emulator-error-this-avds-configuration-is-missing-a-kernel-file とかにある感じのが出る。

## 以上で Run →動いた

気がする
サブモジュールの状態を含めてZSHの右側に表示する

仕事柄サブモジュールをよく使用しているので、ZSHの右に出すブランチの情報にサブモジュールの情報を合わせて出すようにしました。

拾いどころは忘れてしまいましたが、拾ってきたものを加工しています。

動作を確認している環境は今のところCygwinのみです。

欠点：異常に重い。。。

```zsh
### Git
#
# Show branch name in Zsh's right prompt
#
autoload -Uz VCS_INFO_get_data_git; VCS_INFO_get_data_git 2> /dev/null
setopt prompt_subst
setopt re_match_pcre

function rprompt-git-submodule-status {
  local st color subName name treeTop cdir
  treeTop="$1"
  cdir="$PWD"
  cd "$treeTop"
  st=`git submodule foreach git status 2> /dev/null | perl -p -0777 -e 's/^(Entering ([^(Entering)]|.)*?)Entering.++/$1/s' 2> /dev/null`
  cd "$cdir"
  subName=`echo $st|sed -n "1p"|sed -e "s/^Entering '\([^']*\)'/\1/"`
  if [[ -n "$subName" ]]; then
    if [[ "$st" =~ "(?m)^nothing added" ]]; then
      color=%B%F{yellow}
    elif [[ "$st" =~ "(?m)^# Untracked" ]]; then
      color=%B%F{red}
    elif [[ "$st" =~ "(?m)^# .*\"git (pull|push)\"" ]]; then
      color=%B%F{blue}
    elif [[ "$st" =~ "(?m)^nothing to" ]]; then
      color=%F{green}
    fi
    echo " with $color$subName%f%b"
  fi
}

function rprompt-git-current-branch {
  local name st color gitdir action
  if [[ "$PWD" =~ '/\.git(/.*)?$' ]]; then
    return
  fi
  name=`git rev-parse --abbrev-ref=loose HEAD 2> /dev/null`
  if [[ -z $name ]]; then
    return
  fi

  gitdir=`git rev-parse --git-dir 2> /dev/null`
  action=`VCS_INFO_git_getaction "$gitdir"` && action="($action)"
  treeTop=`dirname "$gitdir"`

  st=`git status 2> /dev/null`
  if [[ "$st" =~ "(?m)^nothing to" ]]; then
    color=%F{green}
  elif [[ "$st" =~ "(?m)^nothing added" ]]; then
    color=%F{yellow}
  elif [[ "$st" =~ "(?m)^# Untracked" ]]; then
    color=%B%F{red}
  else
    color=%F{red}
  fi
  echo "$color$name$action%f%b`rprompt-git-submodule-status $treeTop`"
}

RPROMPT='[`rprompt-git-current-branch`]'
```
virt-managerとlibvirtを使う

install
================

```bash:
$ sudo apt-get install virt-manager
$ sudo /etc/init.d/libvirt-bin start
```


必要なサービス起動設定
-------------------------

```bash:
$ sudo update-rc.d dbus defaults
update-rc.d: warning: /etc/init.d/dbus missing LSB information
update-rc.d: see <http://wiki.debian.org/LSBInitScripts>
 Adding system startup for /etc/init.d/dbus ...
   /etc/rc0.d/K20dbus -> ../init.d/dbus
   /etc/rc1.d/K20dbus -> ../init.d/dbus
   /etc/rc6.d/K20dbus -> ../init.d/dbus
   /etc/rc2.d/S20dbus -> ../init.d/dbus
   /etc/rc3.d/S20dbus -> ../init.d/dbus
   /etc/rc4.d/S20dbus -> ../init.d/dbus
   /etc/rc5.d/S20dbus -> ../init.d/dbus
```

```bash:
$ sudo update-rc.d libvirt-bin defaults
update-rc.d: warning: /etc/init.d/libvirt-bin missing LSB information
update-rc.d: see <http://wiki.debian.org/LSBInitScripts>
 Adding system startup for /etc/init.d/libvirt-bin ...
   /etc/rc0.d/K20libvirt-bin -> ../init.d/libvirt-bin
   /etc/rc1.d/K20libvirt-bin -> ../init.d/libvirt-bin
   /etc/rc6.d/K20libvirt-bin -> ../init.d/libvirt-bin
   /etc/rc2.d/S20libvirt-bin -> ../init.d/libvirt-bin
   /etc/rc3.d/S20libvirt-bin -> ../init.d/libvirt-bin
   /etc/rc4.d/S20libvirt-bin -> ../init.d/libvirt-bin
   /etc/rc5.d/S20libvirt-bin -> ../init.d/libvirt-bin
```

```bash:
$ sudo reboot
```

```bash:
$ virt-manager
```


libvirtコマンドで操作する方法
=======================

```bash:
$ virsh -c lxc:/// destroy centos0
停止
$ virsh -c lxc:/// list --all
 Id    名前                         状態
 ----------------------------------------------------
  -     centos0                       シャットオフ
$ virsh -c lxc:/// start centos0
起動
$ virsh -c lxc:/// console centos0
コンソールに接続
```

## Ubuntuでの注意点

```bash:
sudo apt-get install -y \
 virt-manager libvirt0 libguestfs0
```

* 現在のユーザをlibvirtdグループに追加
AnyEvent ベースでテストを書くシリーズリンク集

この1,2年くらい仕事やプライベートで使ってるいろいろです。

- Test::X1 - テスト定義
  - リポジトリ https://github.com/wakaba/perl-test-x1
  - 紹介 https://raw.github.com/wakaba/perl-test-x1/master/doc/intro.ja.hatena
- Test::AnyEvent::Servers - テスト用サーバー管理
  - リポジトリ https://github.com/wakaba/perl-test-anyevent-servers
  - 紹介 https://raw.github.com/wakaba/perl-test-anyevent-servers/master/doc/intro.ja.hatena
- Test::AnyEvent::plackup - Plack ベースのサーバーをテスト用に起動
  - リポジトリ https://github.com/wakaba/perl-test-anyevent-plackup
- Test::AnyEvent::Apache - Apache2 サーバーをテスト用に起動
  - リポジトリ https://github.com/wakaba/perl-test-anyevent-apache
- Test::AnyEvent::MySQL::Server - MySQL サーバーをテスト用に起動 & スキーマを流し込む
  - リポジトリ https://github.com/wakaba/perl-rdb-utils/blob/master/lib/Test/AnyEvent/MySQL/Server.pm
  - 紹介 https://raw.github.com/wakaba/perl-rdb-utils/master/doc/intro.ja.hatena
- Test::AnyEvent::Workaholicd - workaholicd サーバーをテスト用に起動
  - リポジトリ https://github.com/wakaba/workaholicd/blob/master/lib/Test/AnyEvent/Workaholicd.pm
- Test::AnyEvent::Memcached - memcached サーバーをテスト用に起動
  - リポジトリ https://github.com/wakaba/perl-test-anyevent-memcached/tree/master/lib/Test/AnyEvent/Memcached
- AnyEvent::Timer::Retry - 条件が満たされるまで再試行
  - リポジトリ https://github.com/wakaba/perl-anyevent-timer-retry
Railsでコントローラのprivateメソッドをテストする

privateメソッドをテストしなくてはいけない、というのは行儀的には悪いことではありますが、必要に迫られた際にはRSpecのAnnonymousControllerという機能を使ってテストすることができます。

Ref: https://www.relishapp.com/rspec/rspec-rails/docs/controller-specs/anonymous-controller

YourController#smartphone_view?というメソッドがprivateメソッドだとして、その返り値をテストしたい場合は、以下のように書くことができます。

```rb
describe YourController do
  describe '#smartphone_view?' do
    controller(YourController) do
      def index
        @result = smartphone_view?
        render text: 'ok'
      end
    end

    subject { assigns(:result) }
    
    context 'PCからのアクセス' do
      before do
        get :index
      end
      it { should be_false }
    end
    context 'スマホからのアクセス' do
      before do
        Rack::Request.any_instance.stub(:smart_phone?).and_return(true)
        get :index
      end
      it { should be_true }
    end
    context 'ガラケーからのアクセス' do
      before do
        Rack::Request.any_instance.stub(:mobile?).and_return(true)
        get :index
      end
      it { should be_true }
    end
  end
end
```

controllerメソッドの引数に、テスト対象のコントローラ名を入れるのがミソです。
Selenium IDEの導入のいろいろ

## Selenium IDE

> セレン (英: selenium) は原子番号34の元素。元素記号は Se。カルコゲン元素の一つ。セレニウムとも呼ばれる。
(wikipediaより)

今回、記事にしたのは元素のセレニウムではなく、WebUIの自動テストツールです。
(実はプログラマに化学系出身の方が多いというのは、私の周りだけでしょうか)

Selenium IDEは、Webブラウザのテストを自動化するためのツールでFireFoxのアドオンで提供されています。

Selenium IDE以外にSelenium WebDriverというプログラムからテストできるライブラリがあります。

Selenium WebDriverについては 今回は省かせて頂きます。

Seleniumにはいくつか種類がありますが、下記のサイトで解説されていますので参考になると思います。
http://blog.trident-qa.com/2013/05/so-many-seleniums/

## Selenium IDEの導入

Selenium IDEはFirefox上でブラウザの操作を記録してテストケースを生成することができます。

Selenium IDE公式ドキュメント(英語)を参考にしました。
http://docs.seleniumhq.org/docs/02_selenium_ide.jsp

1. [公式サイト](http://docs.seleniumhq.org/download/) からSelenium DIE 2.3.0 のxpiファイルをダウンロード
※2014/7/17現在 Selenium IDE 2.5.0

2. Firefoxのアドオンマネージャ(Firefoxの[アドオン]メニューで表示可能)にドラッグ&ドロップしてインストール
(FireFoxのアドオン検索ではIDEのプラグインしか出てこない)

## Selenium IDEの使い方

今回は簡単な例で google 検索を行いたいと思います。

1. まず赤丸を押すとブラウザの操作を記録してくれます。
![Record.png](https://qiita-image-store.s3.amazonaws.com/0/19533/da16e99e-0b6c-a5ac-4951-2ef4a03e5bdf.png)


2. google.co.jp で qiita と検索
   すると以下のFireFoxの操作がコマンドとして記録されます。
   もう一度、赤丸を押して記録を止めて下さい。
![google.png](https://qiita-image-store.s3.amazonaws.com/0/19533/96f4f82d-7d89-3b47-697b-ffc6496417d2.png)

3. 左上の !![selenium_button.jpg](https://qiita-image-store.s3.amazonaws.com/0/19533/ce811eb3-8867-7957-c47e-42bd2127af74.jpeg) を押して、記録したテストを実行


4. ( __以下はエラーが出たら参考に__ ) *「[error] Element id=lst-ib 」* のエラーが出るかもしれません。
   これはページを読み込みより早くテストの実行が行われて、
   *lst-ib* というテキストボックスが見つかりません!!! というエラーです。

5. テキストフィールドが見つかるまで待つコマンドを追加します。

![Add_command.png](https://qiita-image-store.s3.amazonaws.com/0/19533/93b583b9-be3d-620a-9f77-55b538ef5917.png)
右クリックで [コマンドの挿入]を選択

以下のようにコマンドを入力

コマンド  : waitForElementPresent
対象         : id=lst-ib
値             : (何も入力しない)

これは
*lst-ib* というフィールドが見つかるまで待ちます ≒ (読み込むまで待ちます)
というコマンドです。

ここでテストコマンド入力枠について少し説明します。

テストで実行するコマンドですが以下の3つのパラメータがあります。

コマンド : 動作する (ex. 開く、クリックする、閉じる)
対象 : どこを動かすか (ex. google.com、検索、タブを)
値 : 何を渡すか (ex. テキストボックスに検索ワードを)

という感じになっています(かなり適当な解説ですみません)。

6 コマンドを追加したらもう一度左上の ![selenium_button.jpg](https://qiita-image-store.s3.amazonaws.com/0/19533/ce811eb3-8867-7957-c47e-42bd2127af74.jpeg) を押下します。

 google 検索で qiita と検索できるはずです。


## 最後に

私が使用したいるのは Sencha Ext JS なのですが、

JSが動的にページを生成するので、HTMLを読み込む前にコマンドが実行されてしまって...

動的生成でHTMLのIDもランダムに生成されたり...

すこし詰まりましたが、色々工夫する事で非常に効率良くテストが行えています。

例では FireFoxでしたが、私はchromeでも使用しています。

Selenium IDE を chromeで使う方法は気が向いたら追記したいと思いますが、
とりあえず参考サイトのURLを下に貼っています。

とりあえず私の環境では問題無く Selenium IDE を導入できましたが、
環境によっては上手く動かなかったりするかもしれません。

## 参考サイト

この記事のソースは全て下記のサイトから引っ張ってきてます。

Selenium 公式サイト
http://docs.seleniumhq.org/

Selenium IDEの導入から簡単な使用例まで
http://news.mynavi.jp/column/ide/157/index.html

Selenium IDEのもう少し詳しい情報掲載(よく使うコマンドの解説)
http://iflaglabs.jp/original7.html

Selenium IDEでループをさせる方法(拡張スクリプトの解説)
http://iflaglabs.jp/original10.html

google chromeでIDEを使う
http://blog.trident-qa.com/2013/05/selenium-ide-on-chrome-ie-etc/

Selenium IDEのプラグインについての解説
http://blog.trident-qa.com/2013/06/selenium-ide-plugins/

日本Seleniumユーザーコミュニティ
https://groups.google.com/forum/?hl=en#!forum/seleniumjp
ADO.NET/ADOなどで使うData Source文字列をウイザードっぽく作る方法

最近めっきり使わなくなってしまった Visual Studio (以下、VS) ですが たまーに 旧ソースの修正や Excel VBA で 旧ADO 使ってデータベースに接続してごにょごにょデータを作りたいとかあります。

毎回データベースへの接続文字列を忘れて ムムってなります。
VSなら 接続文字列は D&Dで 簡単に作れちゃうって話もありますが・・・・・。

そんな時、接続文字列をウイザードっぽく作る方法をご紹介します。

##手順
1). どこか適当なフォルダで右クリックをし[新規作成]-[テキスト文書]を選択します。

2). 出来た新規テキスト文書の名前を "test.udl" にします。
　　拡張子さえudlにすれば別に名前はなんでもいいです。
![3.JPG](https://qiita-image-store.s3.amazonaws.com/0/12535/4e8563ca-688b-6cc9-d749-39e1dbea9f3a.jpeg)

3). "test.udl" をダブルクリックします。
![1.JPG](https://qiita-image-store.s3.amazonaws.com/0/12535/f737ccf3-52ce-7873-6f62-d55459629450.jpeg)

4). デフォルトで ODBCが選択されているので ODBC接続じゃない場合は  [プロバイダ]タブで目的のドライバを選択します。
![2.JPG](https://qiita-image-store.s3.amazonaws.com/0/12535/4328e9f6-1733-8b37-0d3c-c038d6ea1e78.jpeg)

5). [次へ]ボタンをクリックするか[接続]タブをクリックします。

6). [接続]タブに戻り必要事項を入力します。

7). [接続テスト]ボタンで接続できるか確認します。

8). 接続できたら[OK]ボタンをクリックし終了します。

ここまできたら test.udl ファイルを メモ帳でもお好きなテキストエディタであけるだけ。
接続文字列がかかれてます。
![4.JPG](https://qiita-image-store.s3.amazonaws.com/0/12535/d6ad621e-520e-03cb-3a35-c866c4522d5e.jpeg)

以上です！
MiddlemanでMarkdownでpre要素を使う時に出てしまう余分な余白を消す方法

Markdownでcodeのsyntax-highlightを使いたいときにハマった。
まず、RedCarpet か Kramdownを使う場合、config.rbに下記のようにMarkdown Engineをsetする。

```rb
set :markdown_engine, :redcarpet
set :markdown, :fenced_code_blocks => true, :smartypants => true

## OR

set :markdown_engine, :kramdown
```

ERBやSlimでは上記のsetのみでpre要素は通常にレンダリングされるが、
テンプレートエンジンにHamlを使う場合は、複数行のコードをpreに入れると二行目以降で無駄な余白が入る。
余白を消す為に、config.rbに下記をsetすると解消される。

```rb
set :haml, { ugly: true }
```
golang.orgのgodocでWindowsのソースを表示

golang.orgにあるAPIドキュメント http://golang.org/pkg/ の各パッケージのドキュメント（例えばosパッケージなら http://golang.org/pkg/os/ ）にはPackage filesというセクションがあります。ソースのリンクが並んでいてクリックするとソースの内容が表示されます。

さらにリンクのURLに #Lnn (nnは行番号) を追加すれば、その行を先頭にして表示できます。
例: http://golang.org/src/pkg/os/exec_unix.go#L29

[Issue 2172 - go - godoc -http overlooks GOOS? - The Go Programming Language - Google Project Hosting](https://code.google.com/p/go/issues/detail?id=2172)などを見ると、godocはGOOSとGOARCHの環境変数を見てそのOS、アーキテクチャー用のソースファイルのみを出しているようです。

試しにOSX上で

```
GOOS=windows godoc -http=:6060
```

としてgodocを起動すると http://localhost:6060/pkg/os/ でexec_windows.goのリンクが表示され、exec_unix.goは表示されなくなりました。

http://golang.org/pkg/os/ だとexec_unix.goはありますが、exec_windows.goはありません。
ですが、直接リンクを指定すれば表示できました。
例: http://golang.org/src/pkg/os/exec_windows.go#L42

golang-nuts MLでwindowsのファイルへのリンクを使ってもいいのか聞いてみたところ、使って良いとのことです。
https://groups.google.com/d/msg/golang-nuts/6UmNz_-SpHQ/4KQ2uoBgUZQJ
Goのメソッドレシーバの命名慣習

golang-nuts MLの[Naming convention for method receiver?](https://groups.google.com/d/msg/golang-nuts/73npFHhuL9k/tZgqYDx86hkJ)というスレッドが興味深かったので紹介します。

メソッドレシーバの名前をself, this, meなどにするのは良くないそうです。

goのlintプログラムでも警告が出るらしいです。
https://github.com/golang/lint/blob/2d65ba4f4cbddddac5f92485e8a3e530af2888c6/lint.go#L775-L779

```go
var badReceiverNames = map[string]bool{
	"me":   true,
	"this": true,
	"self": true,
}
```

https://groups.google.com/d/msg/golang-nuts/73npFHhuL9k/SmxprQ4jZJwJ
にメソッド内でNode探索する例とかではメソッドレシーバが指すものがどんどん変更されていくのでselfは不適切と説明されています。

```go
        func (n *Node) Walk() { 
                for ; n != nil; n = n.Next() { 
                        Whatever(n.Data) 
               } 
        } 
```

また、下記の2つは意味的には同じとのことです。

```go
 func (id T) name(arg U, arg2 V, ...)
```

```go
 func name(id T, arg U, arg2 V, ...)
```

goの標準ライブラリではクラス名の頭文字をレシーバ名としていることが多いようです。
例えば [bytesパッケージ](http://golang.org/pkg/bytes/) だと```b *Buffer```とか```r *Reader```などとなっています。
jsでクォータービューかけるライブラリpp3disoを改造してみた

# クォータービュー書きたい
でもOpenGLで一から仕込むのめんどい＆WEB出身なのでjsのほうが慣れてる。
そんなぬるプログラマーなので、手っ取り早くクォータービュー出すために、jsのライブラリを探してみた。

## やったー！ jsでクォータービューを書けるライブラリあったよ！
pp3diso
http://www.prelude-prod.fr/demo/pp3diso/

フランス製のjqueryプラグインなので、ドキュメントの原文読んでもさっぱりわからん。
ので、仕方ないのでサンプルコードをいじながら挙動確認することに。

## とりあえずexample-eを参考にタイルを敷く
![スクリーンショット 2013-09-05 0.49.51.png](https://qiita-image-store.s3.amazonaws.com/0/5157/8fff8d9f-fff5-df50-b831-f49ad05baab4.png)

これは割りとすぐできる。

## オブジェクトを乗っける
![スクリーンショット 2013-09-05 0.52.18.png](https://qiita-image-store.s3.amazonaws.com/0/5157/cf83b367-7fbe-35de-6a11-8215b238f32d.png)

これもexample-hを見ればなんとかなる。

## タイルを数枚重ねたい
先に完成形を見せるとこうしたい。
![スクリーンショット 2013-09-05 0.54.21.png](https://qiita-image-store.s3.amazonaws.com/0/5157/c6c383fe-3c14-ef2e-cda9-cd1658b66e6a.png)

が、素直にaddObjectを使うとこうなってしまう。
![スクリーンショット 2013-09-05 0.56.51.png](https://qiita-image-store.s3.amazonaws.com/0/5157/0dffc5d4-d78c-20e9-4e63-53b839477490.png)

どうもaddObjectは、タイル1に付き1個しかaddできないらしい。
しょうがないので似たようなmethodであるaddBuildingを使ってみると、今度はこうなった。
![スクリーンショット 2013-09-05 0.54.56.png](https://qiita-image-store.s3.amazonaws.com/0/5157/f36e8aff-1ce7-9a13-06f4-b9fb2257aa1b.png)


# で、どうするよ？
ライブラリ書き換えればいんじゃね？（小並感）

## パッチ
addObjectのほうが命名規則的に1:nを実現するには自然な気がするが、2dと3dで実装違ってたりと、コード読むの大変なので諦め。
アドホックにaddBuildingのほう直しました。
以下パッチ。

```diff:jquery.pp3Diso.min.js
			ad[bw][bu] = 1;
			if (a(bv).length) {
				a(bv).remove().empty()
			}
		}
-		this.addBuilding = function(bv, by, bw, bu, bx) {
-			aZ(bv, by, bw, bu, bx)
+		this.addBuilding = function(bv, by, bw, bu, bx, i) {
+			aZ(bv, by, bw, bu, bx, i)
		};
-		function aZ(bB, bz, bD, bw, bv) {
+		function aZ(bB, bz, bD, bw, bv, i) {
			var by = v;
			var bC = h(bz, bB) + (bw * a7.zoom);
			var bA = g(bz, bB) + (bv * a7.zoom);
			ad[bz][bB] = 2;
-			var bu = "b_" + bz + "_" + bB;
+			var bu = "b_" + bz + "_" + bB + '_' + i;
			H.append('<div id="' + bu + '" class="pp3diso-batiment"><img src="'
					+ bD + '" alt="" /></div>');
			var bx = a("#" + bu);
			bx.attr("rel", bD + ":" + bw + ":" + bv);
			a4++;
```

どうも新たに生成するDOMのIDを、タイルの座標だけで割り振っているのが問題だったようなので、そのタイルのタイル番号を引数に渡してそれをIDに含めるようにしたらなんとかなった。


# 結論
ライブラリの設計する時は、要件ちゃんと考えようね！

おわり
自己主張しないtmux設定(SSH向け)

ローカルでもリモートでも `tmux` を使ひたい! でも2段のステータスラインはやりすぎだ!
…と思ってるので、SSH経由でリモートログインするサーバのアカウントにはこんな設定を入れてます。

```.tmux.conf
set-option -g default-shell /bin/zsh
set-option -g prefix C-t
bind C-t next-window
set-option -g status off
```

いまのところこれだけ。もうちょっと足すと良い設定があるかもしれない。

なんか説明
----------

 * *(これはお好みで)* tmux経由でのみZ Shellに
   * ふつうは `chsh` するのが良いです
 * `status off` にすることで存在感を消す
 * プレフィクスを <kbd>C-t</kbd> (<kbd>Ctrl+T</kbd>)にする
 * ステータスラインごときに画面をもう一行占有されたくないので *表示しない*
 * そんな状態で多数のウィンドウを扱ふのはめんどくさいので、リモートサーバでは、 **たかだか2枚のウィンドウでしか作業しない** 前提に立つ
   * **例)** エディタに一枚、シェルに一枚
   * **例)** `tail -f`に一枚、シェルに一枚
     * 最近はデスクトップのEmacsの`tramp-mode`でリモートのファイルを直接編輯することが多いので後者を多用してる
 * すると <kbd>C-t C-t</kbd> で常に2枚のウィンドウをトグルできる
   * もちろん必要があればさらに増やすんだけど、そうそうないようにしたい
   * ローカルのtmuxですらウィンドウを増やしまくるので、軸が増えても関心が発散しないように
     * まあ、集中力がないのでしばしば気が散っていくんですけど…

まとめ
------

要は、気の持ちようとシンプルな設定ですっきりした環境を保て、みたいな話でした。
Gitをsourceからインストールするchefのレシピ

chefではレシピを汎用的に書くためにattributeというものを作っておくといいそうな。
opscodeに上がっているレシピでよくみかけるnode[hoge][fuga]みたいなものです。

今回は早速覚えたattriburteの機能を使ってGitをソースコードからインストールするレシピを書いてみた。
Gitはバージョンアップのスピードが早いので、パッケージでインストールではちょっと古めのバージョンがインストールされる。
__centOSに限っては問題多い1.7.1のバージョンが未だに入ってくる！！__
このレシピはきっと大いに役に立つに違いない（とっくに他の誰かがもっと良いレシピを作って公開しているとは思うけど...）。

## レシピ

_レシピのディレクトリは`cookbooks/git/`で作成したことにします。_

まずは、gitのattributeを定義しておくためのファイルを作成しよう、`cookbooks/git/attributes/default.rb`で作成する。
versionの他にconfigureオプションやGitのインストールに必要なpackageをデフォルト値として設定した。

```ruby:cookbooks/git/attributes/default.rb
default['git']['version']    = '1.8.4'
default['git']['source_uri'] = 'https://git-core.googlecode.com/files/git-1.8.4.tar.gz'
default['git']['configure']  = './configure'
default['git']['packages']   = %w{gettext gettext-devel zlib-devel openssl-devel libcurl-devel perl-ExtUtils-MakeMaker}
```

次に、Gitをインストールするレシピを書く。
レシピは`cookbooks/git/recepies/default.rb`で作成する。

```ruby:cookbooks/git/recepies/default.rb
install_dir = '/usr/local/src'
version     = node['git']['version']
source_uri  = node['git']['source_uri']
configure   = node['git']['configure']

node['git']['packages'].each do |package_name|
  package "#{package_name}" do
    :install
  end
end

remote_file "/tmp/git-#{version}.tar.gz" do
  not_if 'which git'
  source "#{source_uri}"
end

bash 'install_git' do
  not_if 'which git'
  user 'root'

  code <<-EOL
    install -d #{install_dir}
    tar xfz /tmp/git-#{version}.tar.gz -C #{install_dir}
    cd #{install_dir}/git-#{version}
    #{configure} && make && make install
  EOL
end
```

実行するときに以下のようなjsonファイルを用意してchefコマンドから指定してあげればインストールバージョンが変更出来る。

```json
{
    "git": {
        "version": "1.8.3.4",
        "source_uri": "https://git-core.googlecode.com/files/git-1.8.3.4.tar.gz"
    }
}
```

vagrantではjsonファイルを用意しないで、`chef.json`というプロパティに連想配列で設定するみたい。

```ruby:Vagrantfile
config.vm.provision :chef_solo do |chef|
  chef.cookbooks_path = './cookbooks'
  chef.add_recipe 'git'
  # jsonファイル作る代わりにこう書く
  chef.json = {
    :git => {
      :version    => '1.8.3.4',
      :source_uri => 'https://git-core.googlecode.com/files/git-1.8.3.4.tar.gz'
    }
  }
end
```

## まとめ

かなりスッキリレシピが書けた。

以上
redisのキーにはスペースを含んだ文字列も使える

redisはキーにスペースを含んだ文字も指定出来るようです。ダブルクォートで囲むだけのようですね。

```
redis 127.0.0.1:6379> set "david guetta" cool
OK
redis 127.0.0.1:6379> get "david guetta"
cool
```
Go言語で二つのスライスを安全に結合する

Go言語で配列を結合したくなることってあると思う。

最初に書いたのはこんな関数だった。

```go
func concat(xs, ys []int) []int {
	zs := make([]int, len(xs) + len(ys))

	for i, x := range xs {
		zs[i] = x
	}

	l := len(xs)
	for j, y := range ys {
		zs[l + j] = y
	}

	return zs
}
```

これだと`int`型のスライスにしか対応できなくて、例えば`string`型のスライスを結合したい、ってなったときは似たような関数を何個も書かなくちゃいけない。
それをどうにかするために空interfaceを使う、って手も無いわけじゃないけど、そうするとキャストが……。

そんなときにジェネリクスを（まだ）持たないGo言語でも型安全性を保ったまま配列を結合できる方法があったのでメモ。

```go:concat_slice.go
package main

import "fmt"

func main() {
	xs := []int{1,2,3}
	ys := []int{4,5,6}
	//ここで結合
	zs := append(xs, ys...)
	fmt.Println(zs)
}
```

[Go Playgroundで実行](http://play.golang.org/p/9vXHLaGjUw)

ちなみに、`append(xs, ys...)`の`...`というのは、可変長の引数を配列で渡すときに使うもの。
例えば、

```go
func sum(xs ...int) (s int) {
	for _, x := range xs {
		s += x
	}
	return
}
```

という関数があったとき、通常は、

```go
sum(1, 2, 3, 4, 5) //=> 15
```

として呼び出すけれど、`...`を配列のあとにつけると、

```go
xs := []int{1, 2, 3, 4, 5}
sum(xs...)
```

[Go Playgroundで実行](http://play.golang.org/p/jAUetTw_Km)

こういう風にスライスを可変長引数として渡すことが出来る。

で、`append`も可変長引数を受け取る組み込み関数だったので行けるかな、と思ったら案の定いけた、という感じ。

- - -

気付かなかっただけで、[builtin](http://golang.org/pkg/builtin/#append)パッケージの`append`の説明にも書いてあった模様。
Chromeウェブストアで公開したアプリや拡張機能を削除する方法

## 概要
[Chrome Web Store](https://chrome.google.com/webstore/)でChrome拡張機能やPackaged App / Hosted Appを公開している開発者の方向けに、拡張機能/アプリを削除する方法を紹介します。
これ以外の方法をご存知の方、是非教えてください。

## 背景
Google Chromeブラウザをお使いの方はご存知の[Chrome Web Store](https://chrome.google.com/webstore/)ですが、開発者の方の中には[デベロッパーダッシュボード](https://chrome.google.com/webstore/developer/dashboard)をご存知の方もいると思います。

![dicws00.png](https://qiita-image-store.s3.amazonaws.com/0/1137/9bb589a2-2d76-29a3-a626-89852bf70d60.png)

デベロッパーダッシュボードには、自分のGoogleアカウントで登録した拡張機能/アプリがリストされているのですが、そこの各アイテム毎のメニューには「ユーザーからのフィードバック 」「統計情報」「非公開」「編集する」「詳細」しかなくて「削除する」が見当たりません。

「編集する」を押してから編集画面からならできるのかな？と思いましたが「削除する」は見当たりませんでした。そこでググってみたところ同様に困っている方が国外にはいて方法を見つけました。

## 手順
1. [デベロッパーダッシュボード](https://chrome.google.com/webstore/developer/dashboard)のページを開く
1. Command + Option + Iキーを押下して、デベロッパーツールを開く
1. Consoleタブを開き、次のように入力してEnter（んった〜ん！）
`cxDeleteItem("アイテムID")`
![dicws01.png](https://qiita-image-store.s3.amazonaws.com/0/1137/177e07b9-d933-17bd-bc41-d86edde54f0c.png)
1. 削除確認ダイアログが表示されるので、本当に消しても良いのであれば「はい、このアイテムを削除します」を選択する
![dicws02.png](https://qiita-image-store.s3.amazonaws.com/0/1137/f144d0c2-0c17-49e8-18a7-cac2a7b9171b.png)

## 注意事項
Google側であえて「削除する」メニューを設けずコンソールから実行するくらいですし、一度消してしまうとそのアイテムIDは使えなくなる、つまりURLは無効になってしまうので本当に削除して良いのか十二分に検討が必要です。
私の場合は、Packaged Appで登録したものをHosted Appに切り替えたくなったり、デモ用に登録していた拡張機能でデベロッパーダッシュボードが管理しにくくなったため、不要なアイテムを削除することにしました。

手順3. のアイテムIDは削除する拡張機能/アプリのものに置き換えてください。
「詳細」リンクを押して確認するか、公開URLの後ろの文字をコピーするかしてください。
下記URLであれば、アイテムIDは `edhaidnhnbcidmofgbohhmkplppgmaji` です。
[https://chrome.google.com/webstore/detail/美人百景/edhaidnhnbcidmofgbohhmkplppgmaji](https://chrome.google.com/webstore/detail/美人百景/edhaidnhnbcidmofgbohhmkplppgmaji)

## 参考サイト
Deleting items from the Chrome Webstore developer dashboard
http://chris-alexander.co.uk/on-engineering/google/deleting-items-from-the-chrome-webstore-developer-dashboard/
bridge、2つのIP設定、macvlan

## bridge

* [vyattaラボ | ubuntuでブリッジを作成](http://vyattalab.blog.fc2.com/blog-entry-19.html)

```bash:/etc/network/interface
auto br0
iface br0 inet static
	address 192.168.100.61
	netmask 255.255.255.0
	gateway 192.168.100.1
	dns-nameservers 8.8.8.8 8.8.4.4
	#
	bridge_ports enp2s0
	bridge_maxwait 0
	bridge_df 0
	bridge_stp off
```


```bash:
$ brctl show
bridge name	bridge id		STP enabled	interfaces
br0			8000.000000000000	no		enp2s0
docker0		8000.000000000000	no		
lxcbr0		8000.000000000000	no		
virbr0		8000.000000000000	yes		virbr0-nic
```

----

IP２つ目割り当て
================
eth0と同じmacアドレスでeth0:0を作成

```bash:作成
$ ifconfig eth0:0 192.168.11.99/24
```

```bash:削除
ifconfig eth0:0 down
```

/etc/network/interfaces
----------------------------------

```bash:/etc/network/interfaces
 iface eth0:0 inet static
 	address 192.168.11.99
 	netmask 255.255.255.0
```

仮想NIC
================
eth0と違うmacアドレスでmacvlan0を作成

```bash:作成
$ sudo ip link add dev macvlan0 link eth0 type macvlan
$ sudo ifconfig macvlan0 up
$ sudo dhclient macvlan0
```

* Centos5.8だとUbuntuとip コマンドオプションが異なる様子。

```bash:削除
$ sudo ifconfig macvlan0 down
$ sudo ip link del dev macvlan0
```

/etc/network/interfaces
----------------------------------

```bash:/etc/network/interfaces
iface macvlan0 inet static
  address 192.168.11.98
  netmask 255.255.255.0
  pre-up ip link add macvlan0 link eth0 type macvlan
```

[lxc](http://wiki.alpinelinux.org/wiki/Talk:LXC)
----------

```bash:/var/lib/lxc/<container>/config
lxc.network.type=macvlan
lxc.network.macvlan.mode=bridge
lxc.network.link=eth0
lxc.network.flags=up
lxc.network.name=eth0
```
sshしつつtailを走らせるときに、ctrl + cでリモートのtailをkillする方法

シェルスクリプト内で、sshでリモートのログをtailしたくなった場合のTips

```shell-session
ssh hostname "tail -f /path/to/log"
```

のようにすると、sshをctrl + cしてもリモート側のtailが走ったままになってしまう。
これを防ぐにはssh に -t オプションを付ければOK

```shell-session
ssh -t hostname "tail -f /path/to/log"
```
lua@Redis で fizzbuzz してみる

Redis 2.6から lua サポートされていると聞いて、とりあえず fizzbuzz ってみた。なお、redis は [こちらの記事](http://qiita.com/ma2saka/items/a166ba71c39ad15443d8) で `brew` でインストールした素の状態のもの。

さて、以下のようなファイルを用意して、

```lua:fizzbuzz.lua

local max=15
local result = {}
for i = 1, max, 1 do
  if i % 15 == 0 then
    result[i] = 'FizzBuzz'
  elseif i % 5 == 0 then
    result[i] = 'Buzz'
  elseif i % 3 == 0 then
    result[i] = 'Fizz'
  else
    result[i] = i
  end
end
return result
```

以下のコマンドで実行する。

```
$ redis-cli --eval fizzbuzz.lua 
 1) (integer) 1
 2) (integer) 2
 3) "Fizz"
 4) (integer) 4
 5) "Buzz"
 6) "Fizz"
 7) (integer) 7
 8) (integer) 8
 9) "Fizz"
10) "Buzz"
11) (integer) 11
12) "Fizz"
13) (integer) 13
14) (integer) 14
15) "FizzBuzz"
```

直接読み込ませてもいい。

```
redis-cli eval "$(cat fizzbuzz.lua)" 0
```

ともあれ、でけた！

Redis はシングルスレッドで動作するらしいので複雑な処理には慎重に。

## 参考

- http://redis.io/commands/eval
- http://staff.aist.go.jp/yutaka.ueno/lua/docsjp.html
redis-cliでマルチバイト文字列が文字化けする時はrawオプションを使う

redisでマルチバイト文字列が文字化けして困る時は

```
$ redis-cli
redis 127.0.0.1:6379> set hoge "まるくす"
OK
redis 127.0.0.1:6379> get hoge
"\xe3\x81\xbe\xe3\x82\x8b\xe3\x81\x8f\xe3\x81\x99"
```

こんな風にrawオプションを付けたら解決します

```
$ redis-cli --raw
redis 127.0.0.1:6379> set hoge "まるちゃん"
OK
redis 127.0.0.1:6379> get hoge
まるちゃん
```

## 参考文献

http://stackoverflow.com/questions/8963372/how-to-save-and-retrieve-string-with-accents-in-redis
DocPad のシンタックスハイライト用プラグイン

ブログとかでソースコードを書くときにシンタックスハイライトができると見ためよろしくすることができる。DocPadには[docpad-plugin-highlightjs](https://github.com/docpad/docpad-plugin-highlightjs/) というシンタックスハイライトのプラグインがあるのでその導入について。


## インストール

terminal.app を立ち上げ、プロジェクトフォルダ内で下記コマンドを入力すればインストール完了。 

```
$ npm install --save docpad-plugin-highlightjs
```

` node_modules`  フォルダ内に ` docpad-plugin-highlightjs`  が入っているはず。


## シンタックスハイライト用CSS

[You can preview some of them here.](http://softwaremaniacs.org/media/soft/highlight/test.html) からお好みのシンタックスハイライトを探す。
いい感じのものが見つかったら[Available stylesheets are here.](https://github.com/isagalaev/highlight.js/tree/master/src/styles) から目的のcssをとってくる。
それをDocPadのプロジェクトファイル（layoutとかhtmlとか）で下記の用にcssを読み込ませる。

```
<link rel="stylesheet" href="/css/ir_black.css" />
```


## ソースコード書いてみる

```
<pre><code> 〜 </code></pre>
```

という感じで、pre要素・code要素内にソースコードを書く。
例えば

```
<pre><code>
<p>hogehoge</p>
</code></pre>
```

とても簡単。一度お試しあれ。
ssh で Too many authentication failures for xxx と言われログインできない


タイトルの通り Too many authentication failures for xxx と言われてssh接続できなくなった。

[ここ](http://d.hatena.ne.jp/kou_i/20101121/1290352589)に書かれているように

```
ssh username@IPAddress -o PreferredAuthentications=password
````

としてみても、ログインできなかった。

```
ssh-add -D
```
を実行してから再度ログインすればできた。

(ﾉﾟρﾟ)ﾉ{ ログインできてよかった〜
Installed aws-cli On Mac OS X Lion

## environment
* Mac OS X 10.7.5
* Python 2.7.1
* [aws-cli](https://github.com/aws/aws-cli) 1.0.0

## setup
```sh:shell
$ virtualenv aws-cli
$ cd aws-cli/
$ source bin/activate
$ pip install awscli
$ source bin/aws_zsh_completer.sh
$ vi config
```

## config file
```vim:config
[default]
aws_access_key_id=<default access key>
aws_secret_access_key=<default secret key>
region=ap-northeast-1
```

## usage
```sh:shell
$ export AWS_CONFIG_FILE=/path/to/aws-cli/config
$ aws --version
aws-cli/1.0.0 Python/2.7.1 Darwin/11.4.2
$ aws ec2 describe-instances
$ aws s3 ls
# more information see help
$ aws help
```