OmniAICreator/Qiita-1.07M huggingface dataset:
Rubyのoptparseを軽く使いたい時に悩む

コマンドライン引数を受け取るスクリプトを書いている時に使うと、とても便利なoptparse。

[library optparse](http://doc.ruby-lang.org/ja/1.9.3/library/optparse.html)

>OptionParser 自体は、どのオプションが指定されたかを記憶しません。 後の処理の方で、オプションによる条件判断を加えるには、 他のコンテナに格納します。

なので、公式にあるサンプルは下記。

>```ruby
>require 'optparse'
>opt = OptionParser.new
>
>OPTS = {}
>
>opt.on('-a') {|v| OPTS[:a] = v }
>opt.on('-b') {|v| OPTS[:b] = v }
>
>opt.parse!(ARGV)
>p ARGV
>p OPTS
>
>ruby sample.rb -a foo bar -b baz
># => ["foo", "bar", "baz"]
>     {:a=>true, :b=>true}

そうなんだけど、何かシックリと来ない。（僕の感覚が訓練されてないだけの可能性もある。）
OptionParserを拡張か継承でもして、持たせるようにすると```opt.config[:hoge]```とか出来るけど、parserではなくなるよなぁ・・・とそれなりに悩むのです。

なので、最近は下記のように使っています。

```ruby
if __FILE__ == $0
  module Viewer
    def view_option
      puts option.inspect
    end
  end

  module Option
    def option
      @option ||= {}
    end
  end

  class Execute < BasicObject
    extend ::Viewer
    extend ::Option
  end

  require "optparse"
  OptionParser.new{|option|
    option.version = "0.0.1"
    option.on("-i file", "--input", "input file."){|fileName| Execute.option[:inputFileName] = fileName}
    option.on("-o [file]", "--output", "output file."){|fileName| Execute.option[:outputFileName] = fileName}
  }.parse!

  Execute::view_option
end
```

余計、不格好だし、手軽じゃなくなった！（°ω°
どなたかセンスをくださいorz

* 実は手軽だった事を後で知りました（＝ｗ＝；
 * [Rubyのoptparseを軽く使うなら悩む必要なんてなかった](http://qiita.com/ionis_h/items/5433dc38c154a30dd450)

# コメントで教わった[trollop](http://trollop.rubyforge.org/)で書いてみた
udzuraさん。ありがとうございます（＾q＾

## インストール

```
$gem install trollop
```

## こんな感じで書いた

```ruby
if __FILE__ == $0
  module Viewer
    def view_option
      puts option.inspect
    end
  end

  module Option
    attr_accessor :option
  end

  class Execute < BasicObject
    extend ::Viewer
    extend ::Option
  end

  require "trollop"
  Execute.option = Trollop::options do
    version "0.0.1"
    opt "input", "input file."#, short: "-i"
    opt "output", "output file.", default: "#{Time.now.strftime("%Y%m%d_%H%M%S")}.out"
  end

  Execute.view_option
  p ARGV
end
```

* オプションを指定する時に、shortを指定すると短縮オプションを作れる
 * 指定しなくても勝手に作ってくれる
  * 上記例だと、--inputの場合は、-i
* defaultも作れる
 * --helpをした時に表示してくれる

## 実行結果
```
$ ruby trollop.rb --help
0.0.1
Options:
       --input, -i:   input file.
  --output, -o 
:   output file. (Default: 20130520_221406.out)
     --version, -v:   Print version and exit
        --help, -h:   Show this message

$ ruby trollop.rb -i "input.log"
{"input"=>true, "output"=>"20130520_221415.out", :version=>false, :help=>false, :input_given=>true}
["input.log"]

$ ruby trollop.rb -i "input.log" "hoooooooo" -o "output.log"
{"input"=>true, "output"=>"output.log", :version=>false, :help=>false, :input_given=>true, :output_given=>true}
["input.log", "hoooooooo"]
```

まだ解説を読んでいる途中ですが、良い感じですね。
rsyncとかscpとか適当なメモ

**ディレクトリ単位で同期**
rsync -avr --delete /hoge/* どっか:/hoge/

**ファイル単位で**
rsync -avr /hoge/hoge.file どっか:/hoge/hoge.file

**同期対象外を指定したい時**
/hoge/exclude_pattern
上記みたいなファイルん中に言葉を指定

 #対象外にしたい言葉を一個ずつ入れてく
hage
dage

rsync -avr --delete --exclude-from /hoge/exclude_pattern /hoge/* どっか:/hoge/

**scpだと(なんでこれ-rついてたんだろか**
scp -r /hoge/hoge.file どっか:/hoge/hoge.file

rsyncちゃんとファイル更新されてるのに、たまに同期されてない時あって、そのときはひたすらscpで頑張ってた。
Goで指定ディレクトリをトラバースする方法

Goで指定ディレクトリをトラバースには、[path/filepathパッケージ](http://golang.org/pkg/path/filepath/)の[Walk関数](http://golang.org/pkg/path/filepath/#Walk)を使うのが簡単です。

Walk関数は第1引数にディレクトリのパスをstringで、第2引数には、ファイルまたはディレクトリが見つかったときに行う関数を渡します。

下記の例は、指定ディレクトリ内のファイル数およびファイルサイズの合計を計算する例です。第2引数で渡している無名関数内にて、FileInfoのIsDir()の結果がfalseであればファイルである、ということで、ファイル数とファイルサイズを取得しています。


```go:main.go
package main

import (
	"fmt"
	"os"
	"path/filepath"
)


func main() {
	var size int64
	count := 0

	err := filepath.Walk("/path/to/count/files", func(path string, info os.FileInfo, err error) error {
		if err != nil {
			return err
		}
		if !info.IsDir() {
			count += 1
			size += info.Size()
		}
		return nil
	})

	if err != nil {
		fmt.Println("Error on filepath.Walk : ", err)
	} else {
		fmt.Printf("%d files, size = %d", count, size)
	}

}
```

Javaな人には、Java 7から導入された[Files#walkFileTree](http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html)をイメージしていただくのがよいかと思います。
ちょっとしたPGで役に立つ。__DATA__トークン。

外部ファイル(CSVなど)を読み込んで処理させる検証プログラムを作成する時、わざわざ外部ファイルを作らなくても__DATA__トークンで実現可能です。

```perl:sample.pl
while ( my $line = <DATA> ) {
 ・・・なんかの処理
}

__DATA__
1,hoge,fuga
2,hogehoge,fugafuga
```
jquery.one()で同時に複数の要素を指定した場合について。

jquery_one
==========

[.one()](http://api.jquery.com/one/)

jquery.one()の実験です。
jquery.one()はjqueryに選択された、オブジェクトに一度だけイベントハンドラを登録するというメソッド。

jqueryによって選択されたオブジェクトが複数だった時に
oneでバインドしたイベントが発生した場合、すべてのオブジェクトに指定したハンドラが解除されるかの確認です。

こちらのリンクで確認できます。

[http://prinum.github.io/jquery_one/](http://prinum.github.io/jquery_one/)

```html:index.html

<body>
  <button>1</button>
  <button>2</button>
  <button>3</button>
  <button>4</button>
  <button>5</button>
</body>

```

```javascript:app.js

$(document).ready(function(){
  $('button').one('click',function(){
    alert($(this).html()+'click!');
  });
});

```

結果として、解除されることはなく、それぞれにoneメソッドで指定したイベントハンドラが実行できる。

[ソースコードです](https://github.com/prinum/jquery_one)
Homebrew の Tap を作る

(ネタがないままゼロ件なのが気になるのでテスト投稿。)

Github に `homebrew-<name>` という命名規則でリポジトリを作り、そこに Formula ファイルを置けばよい模様。

```
$ mkdir homebrew-mytap
$ cd homebrew-mytap
$ touch README.md
$ git init
$ git add README.md
$ git commit -m "first commit"
$ hub create -d "My formulae for the Homebrew package manager"
$ git push -u origin master
```

Formula ファイルは `homebrew-mytap/hoge.rb` の様な形で置けば良い模様。

作成した tap を使う場合はいつものように `brew tap` で Github ユーザ名とリポジトリのサフィックスを組み合わせた識別子を指定したら良い。

koshigoe アカウントに homebrew-mytap リポジトリを作った場合は以下の様に指定する。

```
$ brew tap koshigoe/mytap
```

という事はすぐ分かったんだけど、リポジトリの作成を簡単にできるコマンドが `brew` にないかな？
Androidブラウザの各種UAのサンプル


* **標準ブラウザ**
Mozilla/5.0 (Linux; U; Android 4.0.3; ja-jp; SC-02C Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30

* **Firefox**
Mozilla/5.0 (Android; Mobile; rv:21.0) Gecko/21.0 Firefox/21.0

* **Google Chrome**
Mozilla/5.0 (Linux; Android 4.0.3; SC-02C Build/IML74K) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Mobile Safari/537.31

基本的には、Chrome、Firefoxという文字列を含んでおらず、かつAndroidという文字列を含んでいる場合は標準ブラウザと見なしてよさそう。

検証用URL: http://jsfiddle.net/kyZRC/1/

UserAgent一覧: http://www.openspc2.org/userAgent/
SQALEでデプロイ時にやったことまとめ


SQALEにRailsアプリをデブロイした際に嵌ってしまったのでメモ。まだよくわかっていないことがあるので、訂正・ご指摘あればどしどしくださいませ。

■STEP1
SQALEが用意してくれているマニュアルを見ながらデブロイをした。データはきちんとアップされたようだが、「Soryy, something went wrong.」と怒られてしまう。

■STEP2
設定ファイルを見直した。

```config/environments/production.rb
   # Don't fallback to assets pipeline if a precompiled asset is missed
-  config.assets.compile = false
+  config.assets.compile = true
```
これでSTEP1のエラーは解消したが、また別のエラーが出てしまう。

■STEP3
log/production.logを開いてエラーログを確認した。

```views/layout/application.html.erb
<%= bootstrap_flash %>
<%= yield %>
```

このbootstrap_flashというメソッドがないと怒られた。
これはいつ追加したのか謎なんですが・・・
bootstrapをベースにしたCSSフレームワークを導入したんですが、それを追加したときに追加されたのだろうか。↓がそのフレームワーク。
http://wbpreview.com/previews/WB0GRG7H2/index.html


■STEP4
bootstrap_flashでググると解決策が見つかった。
https://codeclimate.com/github/seyhunak/twitter-bootstrap-rails/BootstrapFlashHelper

bootstrap_flash_helperを追加します。下記のディレクトリに新規にファイルを作り、ソースをそのまま貼付けることで、エラーが出なくなりました。

```app/helpers/bootstrap_flash_helper.rb
module BootstrapFlashHelper
  ALERT_TYPES = [:error, :info, :success, :warning]


  def bootstrap_flash
    flash_messages = []
    flash.each do |type, message|
      # Skip empty messages, e.g. for devise messages set to nothing in a locale file.
      next if message.blank?


      type = :success if type == :notice
      type = :error   if type == :alert
      next unless ALERT_TYPES.include?(type)


      Array(message).each do |msg|
        text = content_tag(:div,
                           content_tag(:button, raw("&times;"), :class => "close", "data-dismiss" => "alert") +
                           msg.html_safe, :class => "alert fade in alert-#{type}")
        flash_messages << text if msg
      end
    end
    flash_messages.join("\n").html_safe
  end
end
```
bundler利用環境でWheneverとCapistranoを連携させる


[Capistrano](http://capistranorb.com/ "Capistrano - Remote multi-server automation tool")を使ったRailsアプリケーション配備時に、[whenever](https://github.com/javan/whenever "javan/whenever · GitHub")で記述したCronジョブを同時にサーバに反映したい場合がある。

この場合、`config/deploy.rb`に以下のような記述を挿入すれば、Capistranoがよしなにやってくれるようになる。

```ruby
require "whenever/capistrano"
```

だけど、bundlerを使っているような環境だと、Capistranoによる配備中に「whenever: コマンドが見つかりません」と怒られて、配備処理が中断してしまうことがある。

この場合、上記のソースコードを以下のように修正すればいい。

```ruby
set :whenever_command, "bundle exec whenever"
require "whenever/capistrano"
```

`:whenever_command`というオプションで、wheneverの機能を呼び出すときに実行するコマンドのフォーマットを指定することができる。

あたまに`bundle exec`をつけることで、ただしくWheneverで記述したCronジョブがサーバに反映されるようになりました。

めでたしめでたし。
Flash内でjsの関数呼び出す

Flash内でjsの関数呼び出してなんかするとき。

下の例は画面遷移とかでつかってた時の

```as sample.as
getURL("javascript:void(jump())");
```


```javascript sample.js
function jump(){
location.href = "http://xxxxx";
}
```

swiffyobjectに変換したのだとgetURL()のパラメータ内に直接アドレス打っても
ちゃんと遷移しなかったのでこんな形にしたとかなんとか。
カラムが20個もあるとINSERTするときにPDOのPrepared Satementをいちいち書きたくないよ


自動生成はSQLの見通しが悪くなるので好きではないが、連想配列からMySQLのSQLを自動生成するようにするとタイポが減ると思う。

```php
<?php

$data = [
    'name' => 'suin',
    'age' => '21', 
    'favorite_game' => 'minecraft',
    // ... 20個以上続く
];

$setClause = trim(array_reduce(array_keys($data), function ($last, $current) {
    return $last . sprintf('`%s` = ?, ', $current);
}), "' ");

$statement = $pdo->parepare('INSERT INTO people SET ' . $setClause);
$statement->execute(array_values($data));
```
phpの時間関係

#strtotimeの引数とかで使えるの
|パラメータ  |             |
|:-----------|------------:|
|+1 months   |1ヵ月後      |
|+1 week     |1週間後      |
|+1 day      |1日後        |
|+1 hours    |1時間後      |
|+1 minutes  |1分後        |
|+1 seconds  |1秒後        |

monthsとか怖くて使ったことないけど。

```php:DateTest.php
<?

// Y-m-d H:i:sの形式で時間取得
$time = date("Y-m-d H:i:s", $_SERVER['REQUEST_TIME']);

// 1分後の時間
$time = date("Y-m-d H:i:s", strtotime("+1 minutes"));

// 文字列からフォーマットを指定 20130501が$timeに入る
$time = date("Ymd", strtotime("2013-05-01 17:00:00"));

// 2013-05-01 17:00:00をすぎたらなんかしたい場合
if(strtotime("2013-05-01 17:00:00") < $_SERVER['REQUEST_TIME']){
	// なんか
}

?>
```

ここらへん毎度忘れる。
Symfony2でカスタムログを取得

Symfony2では、[Monologを通じてロギングすることができます](http://docs.symfony.gr.jp/symfony2/cookbook/logging/monolog.html)。

デフォルトでは、本番環境の場合 `app/logs/prod.log` へ出力されますが、別のファイルにログを出力したいときは、オリジナルのロガーを作成して、利用することができるようです。

- - -

たとえば、リクエストを受け付けてからレスポンスを返すまでの時間を計測して、パフォーマンスログを `app/logs/prod.performance.log` に出力したい場合、

まずは、services.xmlにオリジナルのロガー `Acme\DemoBundle\Logger\PerformanceLogger` を登録します。

```xml:services.xml
<?xml version="1.0" ?>

<container xmlns="http://symfony.com/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">

    <parameters>
        <parameter key="acme_demo.performance.logger.class">Acme\DemoBundle\Logger\PerformanceLogger</parameter>
        <parameter key="acme_demo.performance.logger_handler.class">Monolog\Handler\StreamHandler</parameter>
    </parameters>

    <services>
        <service id="acme_demo.performance.logger" class="%acme_demo.performance.logger.class%">
            <argument>performance</argument>
            <call method="pushHandler">
                <argument type="service" id="acme_demo.performance.logger_handler" />
            </call>
        </service>

        <service id="acme_demo.performance.logger_handler" class="%acme_demo.performance.logger_handler.class%">
            <argument>%kernel.logs_dir%/%kernel.environment%.performance.log</argument>
        </service>
    </services>
</container>
```

`Acme\DemoBundle\Logger\PerformanceLogger` は、`Symfony\Bridge\Monolog\Logger` を継承し、必要なメソッドを追加します。

```php:PerformanceLogger.php
<?php
namespace Acme\DemoBundle\Logger;
use Symfony\Bridge\Monolog\Logger;

class PerformanceLogger extends Logger
{
    public function measure($startTime, $endTime)
    {
        $processTime = $endTime - $startTime;

        $message = $processTime;

        return $this->addRecord(self::INFO, $message, array());
    }
}
```

あとは、コントローラーから呼び出すだけです。

```php:DefaultController.php
<?php
namespace Acme\DemoBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;

class DefaultController extends Controller
{
    public function indexAction(Request $request)
    {
        // Start time
        $startTime = microtime(true);
        
        // Logging
        $logger = $this->get('acme_demo.performance.logger');
        $logger->measure($startTime, microtime(true));
    }
}
Windowsでcucumber+capybara+seleniumを動かすまで

* windows8_x64でcucumberを動かそうとしたらインストールから躓いたので、インストールメモ

壁は以下の3つ

1. ffi
 * selenium-webdriverが依存するchildprocessが依存してる
1. nokogiri
 * capybaraが依存してる
1. json
 * cucumberが依存してる

----
## 解決方法

### ffi,nokogiri
http://qiita.com/items/49c8219c6062aed096fe

* RubyをRubyInstaller for Windowsからインストールし、DEVELOPMENT KITもインストールする
 * ActiveScriptRuby で当初動かしていたがそちらではffi入らなかったし、何かをいじってffi入れられるようになるかは不明

#### 手順

* RubyInstaller for Windows
 * インストーラーを実行し、インストールウィザードに従えばok
* DEVELOPMENT KIT
 * 解凍後(DevKitフォルダに解凍するとする)、DevKitディレクトリを適当な場所に配置し以下のようにする 
  * 詳細は https://github.com/oneclick/rubyinstaller/wiki/Development-Kit に書いてある)
  * 配置場所は C:¥DevKit とした

> ¥# config.yml を作成するコマンド
> $ ruby dk.rb init
> 
> ¥# インストール
> $ ruby dk.rb install

### json

1. makeがないと怒られる場合は上記 DEVELOPMENT KIT に含まれているので、配置先を環境変数PATHに追加する
 * C:¥DevKit¥bin を追加する
1. さらにgccがないと怒られる場合は、MinGWをインストールし、インストールディレクトリをPATHに追加する
 * http://www.mingw.org/
  * [mingw-get-inst-20120426.exe](http://downloads.sourceforge.net/project/mingw/Installer/mingw-get-inst/mingw-get-inst-20120426/mingw-get-inst-20120426.exe?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fmingw%2Ffiles%2FInstaller%2Fmingw-get-inst%2Fmingw-get-inst-20120426%2F&ts=1369040614&use_mirror=jaist) を入れた

## 別の解決方法

### nokogiri

 * ```$ gem install nokogiri -v 1.5.9``` だとエラーはいてインストールに失敗するんだけど、aws-sdk(1.8.5)のインストールで一緒に入る場合には成功する。(謎)
 * http://blog.livedoor.jp/maru_tak/archives/51296221.html
phpでerror_log出力したときにしたこと

cd /etc/httpd/conf.d/

ここに設定ファイルを作成
touch test.conf

作成したファイルに以下を記述
php_value error_log "/出力したいログファイルの絶対パス"

アパッチ再起動
/etc/rc.d/init.d/httpd restart
svn関連でメモってたの

#SVNリポジトリつくった時にやったこと

リポジトリ作成
svnadmin create /置きたい場所

ユーザーの追加
conf/svnserve.conf
の
 # password-db = passwd
のコメントアウトを外して
conf/passwd
に
ユーザー=PASS
の形式で追加

#競合の解決やらステータスとか
svn resolved パス

|処理内容    | 意味        |
|:-----------|------------:|
|A	     |追加された   |
|D	     |削除された   |
|U	     |更新された   |
|C	     |競合している |
|G	     |マージされた |

#削除しちゃったの復活させる時
1.削除されたリビジョンを調べる
2.削除された物を置きたい場所に移動
3.削除されたリビジョンの1つ前の状態のモジュールを取り出す
4.削除されたのもう一度コミットする

1.はまぁ適当に調べといて
2.削除された物を置きたい場所に移動
cd /置きたい場所
3.削除されたリビジョンの1つ前の状態のモジュールを取り出す
svn copy svn://削除された物@リビジョンNo .
4.削除されたのもう一度コミットする
svn commit -m ふっかーつ
メモ：Akka でオレオレ「キャンセルパターン」

# やりたいこと
大きな処理があるので、100個くらいのタスクに均等分割して、マルチコアで並列実行したい。
ただし、実行している途中で「やっぱやーめた」となることもあるので、そのときは実行全体をキャンセルしたい。
もっとちゃんとしたやり方があるのかもしれないけど、とりあえずうまくいったのでメモ程度に書いておきます。

# プログラム
```scala:Application.scala
import akka.actor.ActorSystem
import akka.actor.Props

object Application {
  def main(args: Array[String]) {
    val system = ActorSystem("system")
    val master = system.actorOf(Props[Master], "master")
    
    master ! Start
    
    Thread.sleep(500)
    
    master ! Cancel   // キャンセル！

    system.awaitTermination()
  }
}
```

```scala:Master.scala
import akka.actor.Actor
import akka.actor.Props
import akka.routing.RoundRobinRouter

class Master extends Actor {
  private val coreNum = scala.collection.parallel.availableProcessors
  private val router = RoundRobinRouter(nrOfInstances = coreNum)
  private val worker = context.actorOf(Props[Worker].withRouter(router), "worker")
  private var status: Status = Waiting

  def receive = {
    case Start => {
      status = Running
      (1 to 10).foreach { i =>
        worker ! i
      }
    }
    case Cancel => {
      status = Canceled
    }
    case WhichStatus => {
      sender ! status
    }
  }
}
```

```scala:Worker.scala
import akka.actor.Actor
import scala.concurrent.Await
import akka.pattern.ask
import akka.util.Timeout
import scala.concurrent.duration._

class Worker extends Actor {
  implicit val timeout = Timeout(5 seconds)

  def receive = {
    case i: Int => {
      val future = sender ? WhichStatus
      val status = Await.result(future, timeout.duration).asInstanceOf[Status]
      if (status == Canceled) {
        doNotWork(i)
      } else {
        doWork(i)
      }
    }
  }
  private def doWork(i: Int) {
    println("Task" + i + ": Start")
    Thread.sleep(1000)
    println("Task" + i + ": Finished")
  }
  private def doNotWork(i: Int) {
    println("Task" + i + ": Canceled!!!")
  }
}
```

```scala:Message.scala
sealed trait Message
case object Start extends Message
case object Cancel extends Message
case object WhichStatus extends Message
```

```scala:Status.scala
sealed trait Status
case object Waiting extends Status
case object Running extends Status
case object Canceled extends Status
```

# 実行結果
## キャンセルしない場合(4コア)

```
Task2: Start
Task1: Start
Task3: Start
Task4: Start
Task4: Finished
Task8: Start
Task1: Finished
Task3: Finished
Task5: Start
Task7: Start
Task2: Finished
Task6: Start
Task8: Finished
Task5: Finished
Task7: Finished
Task9: Start
Task6: Finished
Task10: Start
Task9: Finished
Task10: Finished
```

## キャンセルした場合(4コア)

```
Task1: Start
Task3: Start
Task4: Start
Task2: Start
Task3: Finished
Task4: Finished
Task1: Finished
Task7: Canceled!!!
Task8: Canceled!!!
Task5: Canceled!!!
Task9: Canceled!!!
Task2: Finished
Task6: Canceled!!!
Task10: Canceled!!!
```
自動四捨五入トラップ

# 整数の cast が切り捨てでなく四捨五入になる場合がある。

次は全部1になる。

```py
# python じゃないよ。Booだよ。
for v in (1.3, 1.4, 1.5, 1.6):
    print v cast int
```

次は何故か1.5と1.6が2になる。

```py
# python じゃないよ。Booだよ。
for v as object in (1.3, 1.4, 1.5, 1.6):
    print v cast int
```
object が duck になっても同じ。

# コンパイラソースを追って見る

* Boo のILコード出力は EmitAssembly クラス(コンパイラパイプラインの１ステップ＝ICompilerStep)
* cast 演算子のコード出力は OnCastExpression() メソッド(EmitAssemblyは構文木visitor)。
* OnCastExpression() → LoadExpressionWithType() → EmitCastIfNeeded() と呼び出し。
* EmitCastIfNeeded() は変換元/変換先の型から必要なコード出力。ここでobject/duck(value型でない場合)からint等の型へ変換する場合、ランタイムの変換メソッドを呼ぶコードになる。
* その変換メソッドが四捨五入らしい。

# 結論

object や duck の primitive 型への変換はILダイレクトではないから遅い（あたりまえ）。
zshで"autoload -Uz compinit && compinit -u"を実行すると"compinit:473: bad floating point constant"のエラーが出る

発生箇所を見てみる。

```
$ locate compinit
    /usr/share/zsh/functions/Completion/bashcompinit
    /usr/share/zsh/functions/Completion/compinit
```

```zsh```
if [[ -f "$_comp_dumpfile" ]]; then
  if [[ -n "$_i_check" ]]; then
    read -rA _i_line < "$_comp_dumpfile"
    if [[ _i_autodump -eq 1 && $_i_line[2] -eq $#_i_files &&
        $ZSH_VERSION = $_i_line[4] ]]
    then
      builtin . "$_comp_dumpfile"
      _i_done=yes
    fi
  else
    builtin . "$_comp_dumpfile"
    _i_done=yes
  fi
fi
```

$_comp_dumpfile があやしい！

```
$ file ~/.zcompdump 
    /home/ore/.zcompdump: symbolic link to `/home/ore/Dropbox/dotfiles/.zcompdump'
```

ウッ 他の環境かなんかのゴミファイルが同期されてた……

```
unlink ~/.zcompdump
rm ~/Dropbox/dotfiles/.zcompdump
exec zsh
```

でOKになった。


## 実験

```
touch .zcompdump
dd if=/dev/zero of=.zcompdump  bs=1024000 count=1
ln -s /dev/null ~/.zcompdump
```

あたりは ~/.zcompdump が正常なものに上書きされるので上記問題は出なかった。
であるので、zcompdumpとしては正常なんだけどzshバージョン差異などで解釈時にエラーが出ているということなんだと思った。

## .zcompdump とは？

```
compinit の実行を高速化するために、ダンプされた設定ファイルが生 成され、今後の起動ではこれが読まれる。これは初期設定であるが、 -D オプションをつけて compinit を呼べば無効にすることができ る。ダンプファイルは初期化ファイルと同じディレクトリ中（例えば $ZDOTDIR や $HOME）の .zcompdump である。あるいは、 `compinit -d dumpfile' で明示的にファイル名を与えることがで きる。次回の compinit 呼び出しでは、全初期化を行う代わりにダンプ ファイルを読む。
```
<a href="http://web.archive.org/web/20030620174341/http://dengaku.org/~naoki/zsh/Doc/zsh_19.html#SEC100">zsh: Completion System</a>

中身は補完コマンドの初期化設定。zshスクリプトとして読み込みできる。

```
source ~/.zcompdump
```

## よりゆるふわな結論

zshの補完で何かしらうまくいかないことがあったら~/.zcompdump を一旦消せ
macrubyでクリップボードからHTMLとしてテキストを取り出す

# 背景
ブラウザで選択したテキストをHTMLとして、取り出したく作ってみました。
が、ブラウザでそもそもそういうことが出来たりしてる気も。。。

# 何はなくともCocoaフレームワークの指定

```ruby
framework 'Cocoa'
```

# ペーストボードを取得
OSXではペーストボードと呼んでる臭い

```ruby
p = NSPasteboard.generalPasteboard;
```

# HTML形式で格納されているデータを取り出すには

``` ruby
data = p.dataForType(NSHTMLPboardType);
if( data )
attrString = NSString.alloc.initWithData(data,encoding:NSUTF8StringEncoding);
puts attrString;
end
```

# リッチテキスト形式で格納されているかも
OSXで動くブラウザによってはHTML形式ではなく、リッチテキスト形式で格納されているものもあった。

HTML形式には簡単？に以下の様にNSAttributeStringを介して変換出来た。

``` ruby
data = p.dataForType(NSRTFPboardType);
if( data )
attrString = NSAttributedString.alloc.initWithRTF(data,documentAttributes:nil)
attributeDict = {NSDocumentTypeDocumentAttribute=>NSHTMLTextDocumentType}
htmlData = attrString.dataFromRange(NSMakeRange(0, attrString.length()),documentAttributes:attributeDict,error:nil)
htmlString = NSString.alloc.initWithData(htmlData,encoding:NSUTF8StringEncoding)
puts htmlString
end
```

# プレインテキストで格納されている場合
この場合、HTMLとしては取り出せませんが、、、

``` ruby
data = p.dataForType(NSStringPboardType);
if( data )
puts data
end
```

# どうやら、上記は10.5以前の古い定数を利用していた模様
NSHTMLPboardType,NSRTFPboardTypeは、
10.6以降は NSPasteboardTypeHTML,NSPasteboardTypeRTF
を使う模様。

## 参考リンク
- [Pasteboard Programming Guide](https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/PasteboardGuide106/Introduction/Introduction.html#//apple_ref/doc/uid/TP40008100-SW1)
- [AppleScriptであれこれする](http://memogakisouko.appspot.com/AppleScript.html)


# 関連記事
- [XCode 4.5でMacRubyを使うには](http://kjunichi.cocolog-nifty.com/misc/2012/09/xcode-45macruby.html)
- [Mountain Lionにしたら、MacRubyのテンプレがビルドエラー](http://kjunichi.cocolog-nifty.com/misc/2012/07/mountain-lionma.html)
date 0無し フォーマット

タイトルの件、ぐーぐる先生にお尋ねしたがすぐにやりたいことが見つからなかったのでメモ。
（ちゃんと中身を読めば見つかりますが、タイトルだけで探してた自分はなかなか見つけられず。。）

# 私が探していたもの
**日付を先頭の0無しで表示したい！**
つまり、2013/01/01とかではなく、2013/1/1と表示したい！
0埋めしなくておk！空白もいらない！

# やりかた
1. 前提：今日は2013年1月1日です
2. コマンド：date +%Y/%-m/%-d
3. 結果：2013/1/1
4. おわり

## 補足
* ポイントは「-(ハイフン)」をいれること
* これで空白とかもなく詰めてくれます
* 「_(アンダーバー)」だと空白をいれてくれます
* 日付の空白ありなら「%e」でおk
* 月は何故かならず0をくっつけてくださってしまうのでしょうか。。。
* もっと簡単にでき、、ます？
Java 7 時代の String#split() 事情

… というタイトルで [ブログ](http://blog.k11i.biz/2013/05/java-7-stringsplit.html) にエントリを投稿しています。エントリ内容を要約すると、

 - Java 7 以降なら、TSV ファイルの 1 行を分割するなど、特定の 1 文字で構成されたデリミタを指定するときは迷わず ```String#split()``` しよう
 - Java 6、もしくは複数文字や複雑な正規表現で分割したい場合は、 ```Pattern``` オブジェクトを事前に定数的に生成しておき、使いまわして ```Pattern#split()``` しよう

です。
ネットワークインタフェースに振られた IPv4 アドレスをコードで取得する (Linux)

ただし `ifconfig` コマンドや `ip` コマンドの出力をパースするのはナシの方向で。

Linux だと `ioctl(SIOCGIFADDR)` で取れるそうです。

ほぼネタ元 ([下記参考 1](http://mymemorandums.blog.fc2.com/?no=10)) のスクリプトそのままです。
Python だとディストリビューション付属の状態でここまで書けるので楽ですね。

```py
import sys, socket, struct
from fcntl import ioctl

SIOCGIFADDR = 0x8915

if len(sys.argv) < 2:
  print >> sys.stderr, "Usage:", sys.argv[0], "<interface name>"
  sys.exit()

interface = sys.argv[1]

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try:
  ifreq  = struct.pack('16s16x', interface)
  ifaddr = ioctl(s.fileno(), SIOCGIFADDR, ifreq)
finally:
  s.close()

_, sa_family, port, in_addr = struct.unpack('16sHH4s8x', ifaddr)
print socket.inet_ntoa(in_addr)
```

## 参考 ##

* [# init 0 pythonでifconfigらしきことをしてGWをnetmaskから予想してみる](http://mymemorandums.blog.fc2.com/?no=10)
* [Geekなぺーじ:インターフェースのIPアドレスを取得する](http://www.geekpage.jp/programming/linux-network/get-ipaddr.php)
* [Perl でローカルのアドレスを取得する - naoyaのはてなダイアリー](http://d.hatena.ne.jp/naoya/20080110/1199944996)
mongo shellで書いたjavascriptをmongoimportでimportできるjsonに変換する方法


[mongodb API](http://api.mongodb.org/js/current/symbols/_global_.html#printjson)に書いてあった


```shell:hoge.js
hoge = {fuga : "opopop"}
jsononeline(hoge)

```

## 使い方

```
mongo --quiet host名/db名 実行するjavascript.js > 書き出したい.js
```
PDO::prepareで部分一致(like %...%)させる時にエラーになる

http://okwave.jp/qa/q3863004.html

>つまり $name の中に %がなくてはいけません
>
>$query="SELECT * FROM table WHERE id=:id OR like name= :name ";
>にして
>$name = "%文%";
>にすれば良い
>ってことです
CloudFormationでOutputsで10個以上の要素を出力する

## Outputsの数の制限

 * CloudFormationのOutputsで指定できる要素は10個まで
  * 以下の例の場合、連番でEC2Instance10までは入れられるが、EC2Instance11まで入れた場合はエラーになる

```js:JSON
  "Outputs" : {
    "EC2Instance1" : {
      "Value" : { "Ref" : "EC2Instance1" }
    },
    "EC2Instance2" : {
      "Value" : { "Ref" : "EC2Instance1" }
    },
    ‥
  }
```

## 11個以上出力する場合の対応方法
 * [AWS Developer Forums: CloudFormation limitation on output ...](https://forums.aws.amazon.com/message.jspa?messageID=295649)に回答があった
  * 以下のようにすれば良いらしい

```js:JSON
  "Outputs" : {
    "EC2InstanceList" : {
      "Value" : { "Fn::Join" : [ ",", [
        { "Ref" : "EC2Instance1" },
        { "Ref" : "EC2Instance2" },
        ‥
      ]]}
    }
  }
```

 * 種類別に表現したい場合はこんな感じ

```js:JSON
  "Outputs" : {
    "EC2InstanceList" : {
      "Value" : { "Fn::Join" : [ ",", [
        {"Fn::Join" : ["=>", ["WebServer", { "Ref" : "EC2Instance1" }]]},
        {"Fn::Join" : ["=>", ["AppServer", { "Ref" : "EC2Instance2" }]]},
        ‥
      ]]}
    }
  }
```

 * 文字連結で1行で表現しろってことですね。
updateが行ロックするとは限らない（MySQL InnoDB）

MySQLで、スレッドが排他的にテーブルを操作する方法がねえかと考えた。
updateなりdeleteなりなら行ロックでも別にいいのだが、テーブルに対するinsertもロックする方法がわからん。

LOCK TABLES構文というのを見つけて「名前的にこれやろ」と思ったが全然違って、しかも運用中のサービスに安易にコードを付け加えテストもせずにリリースしてしまったおかげで、__４人しか入れない部屋に１０人ぐらい参加してゲームが始まらない__という恐怖の状態に陥ってしまった。当たり前である。（[LOCK TABLES は、__現在のスレッドに対して__ベース テーブル (ビュー以外) をロックします](http://dev.mysql.com/doc/refman/5.1/ja/lock-tables.html)）

最初は、LOCK TABLESが「現在のスレッドに対しロック」して、「もしテーブルが1つでも他のスレッドによってロックされていたら、それは全てのロックを入手するまでブロック」するというのなら、必要なデータの読み書きとしては使わないロック専用テーブルを用意しといて、排他的読み書きが必要な処理の先頭で、ロック専用テーブルにLOCK TABLESやりゃいいんじゃねーのと思った。
でも友人に「LOCKってそういう風にはあんま使わないんじゃないですかね……」と言われたので、ちょっと考え直した。
その辺の相場がよくわからんが、そうだというならそうかもしれんので、他の方法を考えた。

次に考えたのは、MySQLによる行ロックをそのまま利用する方法。
エンジンがInnoDBだったので、行ロック（同一スレッドで更新したりの操作をしたレコードに対して、コミットするかスレッドが終わるまでは書き込みロックをする、という解釈でいいのかな）がかかり、排他的処理をする一番最初で、適当な「ロック専用レコード」をupdateしとけば、他のスレッドは待つだろうと考えた。



```sql:ロックのためのSQL
UPDATE config SET v = '1'
WHERE k = 'lock';
```

configは、「k」「v」という2つのフィールド（varchar(100)）を持つだけのテーブル。
「k = 'lock', v = '1'」というレコードを用意しといて、これを適当に更新しとけばええやろ、と思っていた。
実験として、以下のPHPコードを実行してみた。



```php:実験用
<?php
$db = new PDO('mysql:host=localhost;dbname=xxx', 'root', 'xxxx');
$db->query("SET NAMES utf8;");

$db->beginTransaction();

$sql = <<<EOM
UPDATE config SET v = '1'
WHERE k = 'lock';
EOM;
$sth = $db->prepare($sql);
$sth->execute();

// コミットする前に凍らせる
sleep(100);

$db->commit();
?>
```



この状態で、ブラウザからphpMyAdminを使って、



```sql:ロックのためのSQL
UPDATE config SET v = '1'
WHERE k = 'lock';
```


して、updateできなければよしと思っていた。
しかし、updateはできてしまった。
どうやら更新前と更新後で同じ結果になるupdateは、updateをおこなわない（行ロックもしない）らしい。
じゃあ


```sql:ロックのためのSQL2
UPDATE config SET v = (1+v)
WHERE k = 'lock';
```


とかやろうと思ったが、未来永劫運用していけば、いつかオーバーフローする運命なのだと思うと、涙が滂沱とあふれてきそうだったのでやめた。
なので、


```sql:ロックのためのSQL3
UPDATE config SET v=(!v)
WHERE k = 'lock';
```


としてやった。
これでうまいこと1と0を往復してくれるし、必ずロックがかかって、上記PHPコードでsleepしている間は、phpMyAdminで該当のレコードを更新してやろうとしても、待たされているのが確認できた。
なのでこれを運用中のサービスに埋め込み、排他的ロックをかけたい処理の最初に記述した。
これでうまくいくのかは、しばらく様子を見てみるつもり。

===追記===
うまくいってなかった。
なのでもうこうした。

```sql:ロックのためのSQL4
select * from config
WHERE k = 'lock';
for update
```

しばらく様子を見てみるつもり。

===さらに追記===
複数のスレッドが同時にトランザクションを張って、select等した時に、どういうデータを持ってくるのかという論点で、結果的に排他ロックできてなかったことが判明。
つまり、for updateなどでロックすると、確かにそのスレッドが排他的に読み書きできる状態になるのだが、他のスレッドが待った後にselect等をしても、トランザクションを「張った時点」のDBの状態（排他ロックしたスレッドのcommit等を反映していないデータ）を持ってくることがある。
それを避けるには、トランザクションを張る前に

```mysql:sqlロックのためのSQL5
set session transaction isolation level READ COMMITTED
```

としてやりゃよい。
for updateと併せてPDOインスタンス生成直後にこれをやって、数週間様子を見たが、うまくいったように思う。
Google I/O 2013のGo言語に関するセッション一覧


* [Advanced Go Concurrency Patterns](https://developers.google.com/events/io/sessions/332768653)
（[ビデオ](http://www.youtube.com/watch?v=QDDwwePbDtw), [スライド](http://talks.golang.org/2013/advconc.slide)）


* [High Performance Apps with Go on App Engine](https://developers.google.com/events/io/sessions/333519914)（[ビデオ](http://www.youtube.com/watch?v=fc25ihfXhbg), [スライド](http://talks.golang.org/2013/highperf.slide)）

* [Fireside Chat with the Go Team](https://developers.google.com/events/io/sessions/332838749)（[ビデオ](http://www.youtube.com/watch?v=p9VUCp98ay4)）

* [All the Ships in the World: Visualizing Data with Google Cloud and Maps](https://developers.google.com/events/io/sessions/327696300)（[ビデオ](http://www.youtube.com/watch?v=MT7cd4M9vzs)）

* [Whispering Gophers: network programming in Go](https://developers.google.com/events/io/sessions/356379867)
なぜObjective-Cでは変数の定義時に*を変数側に寄せるのか


## はじめに

Objective-Cでは変数の定義時に*をクラス（型）ではなく変数に寄せる慣習がある

```objc
NSObject *object;
```

次のようにクラスに寄せるようなコードは最近では滅多に見ることがない

```objc
NSObject* object;
```
C/C++ではObjective-Cとは逆で、後者のようにクラス（型）側に寄せられることが多いのではないかと思う。

## 想像

なんでこんなになってるのか

### Objective-Cではポインタを宣言時にあまり意識しない

この理由として想像するのは、Objective-Cのオブジェクトについてはポインタを意識することを最小限にしており、インスタンスとプリミティブな変数または構造体を宣言時に見分けやすくなっている

```objc
ABRect *abRect;  //何かしらのインスタンスだろうなと推測する
CGRect rect;     //プリミティブな型か構造体だろうなと推測する
```

Objective-Cでポインタ（というかアドレス）を意識する場面は最小限とは言うものの、関数の引数にインスタンスのアドレスを渡し、関数内の処理によりそのインスタンスをどうにかする場面はある。

ちなみに、上記の例のABRectクラスに*を付けない場合はコンパイルエラーとなる。

> Interface type cannot be statically allocated

Objective-Cではクラスのインスタンスは*を付け、ヒープ領域に作られる方法でしか利用できない。

### C++のメソッド定義などの事情

C++ではメンバ関数の宣言にクラス名自体を含み、関数名を::で繋ぐため、*を付ける位置がクラスでないと違和感が生じてしまう。

具体例を挙げると、C++のDropクラスの関数createがCCObjectを返す場合を考える

```cpp
CCObject *Drop::create(); //ポインタがDropに対して影響を及ぼすように見える
CCObject* Drop::create(); //CCObjectのポインタを返すことが伝わる
```

よってメンバ関数において*はクラス名に付いている方が自然であり、変数の定義時も同じように統一されているように理解できる。

## Objective-C++の内部でC++のコードを書くときのTips

あくまで自分のTipsですが、Objective-C++にC++が混在するソースコード中では次の自己満足ルールが良さそう

- Objective-Cのインスタンスを定義する際には*を変数側に寄せ
- C++のインスタンスを定義する際にはクラス側に寄せる

```objc
- (void)example
{
    NSObject *hoge;      // Objective-Cでhogeの定義
    std::string* piyo;   // C++でpiyoの定義
}
```

とか思ってみたがFacebookのC++を利用したライブラリ[pop](https://github.com/facebook/pop/blob/master/pop/POPVector.mm)ではObjective-Cのような*の位置になっていますな...

```objc
Vector *Vector::new_vector(NSUInteger count, const CGFloat *values)
```

## まとめ

- Objective-Cでは*の位置でそれ自体がObjectかどうかを見分け易い（型の情報ではないということを示したい）
- C++ではメソッド定義などの関係上、クラス（型）のすぐ後ろに*が付いているほうが自然に見える
- Objective-C++でC++が混在した環境ではそれぞれの形にしたら見分けがつけやすそうだがFacebook社はそのようにしていない
変数/クラス名の命名規則に使われる記法の分類



## 記法一覧

|記法名|例|備考|
|:-----------|:------------|:------------|
|スネークケース|example_case|すべて小文字で複合語のスペースをアンダースコアで区切る。|
|ローワーキャメルケース|exampleCase|先頭を小文字で書き始め、複合語のスペースをなくし要素の先頭は大文字にする|
|アッパーキャメルケース|ExampleCase|先頭を大文字で書き始め、複合語のスペースをなくし要素の先頭は大文字にする|
|パスカルケース|ExampleCase|アッパーキャメルケースと同じ|


### スネークケース

見た目がヘビの形をしている。DBのテーブル名やフィールド名、jsonの項目名に使われる事が多い。

### キャメルケース

見た目がラクダのコブの形をしている。キャメルケース自体は小文字で始めるローワーキャメルケースとアッパーキャメルケースに分けられるが、アッパーキャメルケースはパスカルケースとも呼ばれるため、一般的にキャメルケースと言われる場合はローワーキャメルケースを指定される事が多い。

ローワーキャメルケースはJavaやObjective-Cの変数名に使われる事が多く、アッパーキャメルケースはJavaやObjective-Cのクラス名に使われる事が多い。

### パスカルケース

記法としてはアッパーキャメルケースと同じ。プログラミング言語Pascalで使われていたことからパスカルケースと呼ばれる。ちなみにプログラミング言語Pascalでは変数名の大文字小文字は区別されない。


### 

## その他

### ヨーダ記法

if文の条件比較部分にて比較条件の左側を定数、右側を変数にすることによって、==と書くべきところを=と書いてしまうミスを発覚しやすくする。

```
int status ;
/*…何かしらにstatusが変わる…*/
const int STATUS_OK = 200
if (status = STATUS_OK)  {/*…*/} //代入してif条件に突入
if (STATUS_OK = status)  {/*…*/} //constに代入できないのでコンパイルエラー
```

かつてC/C++のような言語ではif文の条件比較で代入が行えてしまうため、このような工夫がミスを減らしていたが、最近の言語では条件比較代入が行えないようになっているため、ヨーダ記法は大きなメリットを持たない。また、C/C++でもコンパイラによっては警告を出すようにも出来るだろう。

さらに、若いプログラマはこのヨーダ記法の必要性について知らない場合が多く、なぜこのようにするのかを考えさせてしまうことや違和感を感じさせてしまうので可読性を下げてしまう。

ちなみにヨーダ記法と呼ばれる理由は、映画スターウォーズに登場するヨーダが倒置法を使っていたことが理由とされている（参考：[リーダブルコードP85](http://www.amazon.co.jp/gp/product/4873115655/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4873115655&linkCode=as2&tag=architectlabw-22)）。英語の倒置法では＜主語＋（助）動詞＞の順番が逆になったり、目的語や副詞が文頭に来たりすることが由来だそうだ。
Intellij で Haskell プラグインを利用した際、コードを実行しようとすると「Cannot run configuration」と表示され実行出来ない場合の対処方法


## 問題
Haskell のコードを IntelliJ で実行しようとすると

```
Cannot run configuration
```

と怒られ IDE 上からコードの実行が出来ない。

## 解決方法

__以下のファイルを編集__

```
/$(ProjectDir)/.idea/workspace.xml
```

__問題がある部分__

```xml:workspace.xml
<!-- 問題があるのはこの要素 -->
<configuration default="false" name="Run" type="HaskellRunConfiguration" factoryName="Haskell" singleton="true">
      <module name="" />
      <setting name="mainFile" value="file://$PROJECT_DIR$/src/hogehoge.hs" />
      <setting name="params" value="" />
      <setting name="rtFlags" value="" />
      <setting name="workDir" value="" />
      <setting name="passParentEnv" value="true" />
      <RunnerSettings RunnerId="Run" />
      <ConfigurationWrapper RunnerId="Run" />
      <method />
    </configuration>
```

```xml:workspace.xml
<!-- このように module 要素の name 属性が空になってる事があるので -->
<module name="" />
```

__修正後__

```xml:workspace.xml
<!-- ちゃんと値をいれてあげる -->
<module name="hogehoge" />
```

これでうちでは問題なく動いています。
sequence.cpp(c++11)

c++11版です。
コンパイルオプション：mingw32-g++ -std=c++11 sequence.cpp
↑自分が忘れないためのメモ

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

int str2int( const char s )
{
    return ( s < 'a' ) ? s-'0': s-0x57;
}

void test( const std::string & input, const std::string & ans )
{
    int max_cnt = 1;
    for( const char c1: input )
    {
        for( const char c2: input.substr( input.find_first_of(c1)+1 ) )
        {
            const int diff = str2int(c2) - str2int(c1);
            char pre_c = c2;
            int cnt = 2;
            for( const char c3: input.substr( input.find_first_of(c2)+1 ) )
            {
                if( str2int(c3) == str2int(pre_c)+diff )
                {
                    cnt++;
                    pre_c = c3;
                }
                else if( str2int(c3) > str2int(pre_c)+diff )
                {
                    break;
                }
            }
            if( cnt > max_cnt ) max_cnt = cnt;
        }
    }
    printf("%s\n", (max_cnt == atoi(ans.c_str())) ? "ooooo GOOD ooooo": "xxxxx BAD xxxxx");
}

int main( void )
{
/*0*/ test( "12345abcz", "5" );
/*1*/ test( "012abku", "4" );
/*2*/ test( "01245689cdeghik", "6" );
/*3*/ test( "0", "1" );
/*4*/ test( "m", "1" );
/*5*/ test( "01", "2" );
/*6*/ test( "az", "2" );
/*7*/ test( "0az", "2" );
/*8*/ test( "0ak", "3" );
/*9*/ test( "05ak", "3" );
/*10*/ test( "01349acdrsuv", "2" );
/*11*/ test( "01245789efgipqstux", "3" );
/*12*/ test( "0123456789abcdefghijklmnopqrstuvwxyz", "36" );
/*13*/ test( "02468acegikmoqsuwy", "18" );
/*14*/ test( "0369cfilorux", "12" );
/*15*/ test( "048cgkosw", "9" );
/*16*/ test( "05afkpuz", "8" );
/*17*/ test( "0123456789abcdefghjklmnopqrstuvwxyz", "18" );
/*18*/ test( "0123456789bcdefghijklmopqrstuvwxyz", "12" );
/*19*/ test( "0156abfgklpquv", "7" );
/*20*/ test( "0167cdijopuv", "6" );
/*21*/ test( "0178eflmst", "5" );
/*22*/ test( "0189ghopwx", "5" );
/*23*/ test( "019aijrs", "4" );
/*24*/ test( "012567abcfghklmpqruvw", "7" );
/*25*/ test( "012678cdeijkopquvw", "6" );
/*26*/ test( "012789efglmnstu", "5" );
/*27*/ test( "01289aghiopqwxy", "5" );
/*28*/ test( "0129abijkrst", "4" );
/*29*/ test( "01235678abcdfghiklmnpqrsuvwx", "7" );
/*30*/ test( "01236789cdefijklopqruvwx", "12" );
/*31*/ test( "0123789aefghlmnostuv", "5" );
/*32*/ test( "012389abghijopqrwxyz", "5" );
/*33*/ test( "01239abcijklrstu", "4" );
/*34*/ test( "368acdknouvz", "4" );
/*35*/ test( "369chikmnopqruwx", "6" );
/*36*/ test( "05689cdefghijklmnopqrstvwy", "18" );
/*37*/ test( "2489abdeiklrsuvwz", "4" );
/*38*/ test( "678bhijklnpqrsuvwxyz", "6" );
/*39*/ test( "1246cfjkopquxz", "5" );
/*40*/ test( "123459abcefhilmotuvx", "6" );
/*41*/ test( "02578acdefikmopqsuvwxz", "8" );
/*42*/ test( "135abdefghijlopstuwz", "7" );
/*43*/ test( "0126789fgjnotuvxy", "5" );
/*44*/ test( "2345678defjkmnoqrtvwxy", "7" );
/*45*/ test( "02568bdemnostw", "5" );
/*46*/ test( "145689bdfhilnqrstvwxz", "6" );
/*47*/ test( "4aghjrtuvwxyz", "7" );
/*48*/ test( "158achklmqstwy", "3" );
/*49*/ test( "012346abceghjknortv", "5" );
    return 0;
}
```
WebGLで正しいテクスチャサイズにも関わらず「It maybe non-power-of-2 ~」というエラーが出たら……

## 問題
Google ChromeにおけるWebGLで、正しいテクスチャサイズ（2の累乗）にも関わらず、

>RENDER WARNING: texture bound to texture unit 0 is not renderable. It maybe non-power-of-2 and have incompatible texture filtering or is not 'texture complete'

というエラーが出力された場合

## 結論
「テクスチャ画像の読み込みが完了していない状態でレンダリングを行った」ことにより、同エラーが出ている可能性を疑うこと。

## 以下、駄文

WebGLであるゲームの開発をやっているんですが、テクスチャ関連で以下のエラーが出てくるんですよ（ちなみにブラウザはChrome）。

>RENDER WARNING: texture bound to texture unit 0 is not renderable. It maybe non-power-of-2 and have incompatible texture filtering or is not 'texture complete'

もうね。何かと思って。テクスチャサイズは256x64だし、フィルタリングの指定も間違ってないし。色々ググったり試行錯誤して辿り着いたオチが……。

**「テクスチャ画像の読み込みが完了していない状態でレンダリングを行ったから」**

あー、たしかに `or is not 'texture complete'` って書いてあるけどさ……。
ふつー、non-power-of-2の方に注目しちゃうだろ。
おいら、まさかなーあるわけないよなーとか考えながらも画像サイズを256x256に変えてみたりとかアホみたいなことしちゃったじゃまいか。

何が ~ or ~ だ。どっちの原因なのかそこまでちゃんとチェックして、適切にエラーを出せ、と。

WebGLの画像ファイル読み込みは非同期なので、ちょっと横着して、テクスチャの読み込みが完了する前に描画命令しちゃうのはよくある事だと思うのですよ。

そういうケースも考えて、シンプルに「まだロード完了してないよん」とか言ってくれればいいのに、「non-power-of-2」とかいうからもう誤解しちゃったじゃんよ。

こういう「原因は〜〜〜かもしれないし〜〜〜かもしれません」的なエラーって設計した人はどういうつもりで作ったんだろう。
仕様的に判断が難しいというのは考えづらい気がするんだよなー。

ちなみに、これはChromeでの話です。他のブラウザの場合どういったエラーが出るかは確かめていません。（どなたか試された方いらっしゃいましたらコメントいただけますと幸いです）
最新のgitだと`git push`した時に警告が出たのでその対策


最近 `git 1.8.2.2` に更新した。

```
$ git --version
git version 1.8.2.2
```

そしたら`git push`でpush先を指定しない時に警告が出るようになった。

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

  git config --global push.default matching

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

  git config --global push.default simple

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

Git 2.0 でのデフォルト挙動となる`simple`に変更。

```
$ git config --global push.default simple
```

これでOK、と思ったら`--set-upstream`しろと言われた。

```
$ git push
fatal: The current branch develop has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin develop
```

上流レポジトリをきちんと指定する必要が出来たのかな？これでOK。

```
$ git push --set-upstream origin develop
```
GitHubでお手軽に差分確認できるようにする

まだプルリクは出していないけれど、GitHubで差分を確認したいときがないでしょうか。
そういう場合にとても便利なコマンドを紹介します。

以下のコマンドを ~/.bashrcに書いて保存します。

```bash:.bashrc
function compare {
  local CURRENT_BRANCH="$(git rev-parse --abbrev-ref HEAD)"
  open "$(git remote -v | head -n 1 | sed -e 's|.*git@\(.*\):\(.*\)\.git.*|https://\1/\2|g')/compare/master...$CURRENT_BRANCH"
}
```

~/.bashrc を再読み込みして、コマンドを使えるようにします。

```sh
$ source ~/.bashrc
```

ターミナルより差分を確認したいブランチで以下のコマンドを入力するとブラウザでGitHubの差分ページが開かれます。

```sh
$ compare
```
git flow を使うときによく使う操作

# develop ブランチに、リモートの更新を取り込む

リモートの develop ブランチが更新された場合は、ローカルの develop ブランチもそれに追従したい。（特に、`git flow feature finish` したいときには必須）

事前に `git fetch` してあれば、以下の操作でよい。

```
% git checkout develop && git merge origin/develop
```

サブモジュールがある場合は、その更新もあわせてしておく。

```
% git checkout develop && git merge origin/develop && git submodule update
```

# feature ブランチに、develop ブランチの更新を取り込む

develop ブランチが更新された場合は、feature ブランチもそれに追従したい。

`git flow` のサブコマンドが用意されているので、それを使えばよい。

```
% for branch in $(git flow feature) ; do git flow feature rebase $branch ; done
```

# 備考

merge や rebase については、基本的な方針を決めておくといいと思う。

* master ブランチ、develop ブランチは merge する（rebase しない）。これは、リモートに push して他の人と共有するブランチであるため。
* feature ブランチは rebase する。これは、ローカルで好きに操作するブランチであるため。（ただし、feature ブランチをリモートに push して共有したい場合はこの限りではない）
Go言語でネットワークから取得したjsonデータを使える形にする

GoでMicrosoft Translatorからアクセストークンを取得するまでの流れ。

「[Microsoft TranslatorをGoから使ってみた](http://system.hateblo.jp/entry/2013/05/19/224350)」から。

```go
// アクセストークン取得時の型
type AccessTokenMessage struct {
  TokenType string `json:"token_type"`
  AccessToken string `json:"access_token"`
  ExpiresIn string `json:"expires_in"`
  Scope string `json:"scope"`
}
```

```go
// アクセストークン取得時のキャッシュ型
type AccessTokenMessageCache struct {
  accessTokenMessage AccessTokenMessage
  updateTime time.Time
}

func (self *AccessTokenMessageCache) loadNewAccessTokenMessage() {
  resp, err := http.PostForm(MS_TRANSLATOR_ACCESSTOKEN_URL,
                   url.Values{
                        "client_id": {MS_TRANSLATOR_CLIENT_ID},
                        "client_secret": {MS_TRANSLATOR_CLIENT_SECRET},
                        "scope": {MS_TRANSLATOR_SCOPE},
                        "grant_type": {MS_TRANSLATOR_GRANT_TYPE}})
  if err != nil {
    panic(err)
  }
  defer resp.Body.Close()
  
  // thx mattn@github
  err = json.NewDecoder(resp.Body).Decode(&self.accessTokenMessage)
  if err != nil {
    panic(err)
  }

  // old
  /*
  body, err := ioutil.ReadAll(resp.Body)
  if err != nil {
    panic(err)
  }
  
  err2 := json.Unmarshal(body, &self.accessTokenMessage)
  if err2 != nil {
    panic(err2)
  }
  */
}
```
git rebaseでブランチをきれいにする

##この記事で言いたいこと
git rebase masterで、現在のブランチのコミットをすべてmasterに適応できる。  
コミットを一つずつ適応するため、一度に解決すべき競合が少なくなる。  
また、履歴が一本化できるため後から見直したときにわかりやすい履歴になる。  


##ブランチがこんがらがる
複数のブランチを切って作業していると、
マージがあちらこちらで行われるため、入り組んで見にくくなります。

こういう時に役立つのが、git rebase <branch name>です。

##git rebase
このコマンドは、現在のブランチと指定したブランチとが分岐し始めたコミットを探し、  
そこから現在までのすべてのコミットを、指定したブランチの最新の状態に適応し直します。

##例
例をあげると、
Masterのコミットm1 m2 m3 m4があるとします。  
さらに、m2から派生したbranch_Aのm2-a1 m2-a2 m2-a3と、  
m2-a1から派生したbranch_Bののm2-a1-b1 m2-a1-b2があるとします。

このようなときに、branch_Bをチェックアウトしてる状態でgit rebase masterをすることで、  
m4の後にm2-a1、m2-a1-b1、m2-a1-b2を順番にもう一度コミットを行います。

##競合解決
途中で競合が起きた場合はそこでいったん停止するため、  
競合を解決し、git addしてからgit rebase --continueを実行してください。

また、git rebase --abortコマンドを実行することで、いつでもrebaseを終了できます。

##まとめ
このように手順自体は少々複雑になりますが、  
rebase後の履歴が一本化されるため後からとてもわかりやすくなります。  
また、rebaseしたブランチとのマージは基本的にfast-forwardマージになるため、マージそのものがとても楽になります。

なお、git rebaseにはほかにも強力な使い方がありますので、次の記事を待つかgit rebase -iあたりでググってください。
テクスチャが出力されない？

<ul><li>補間方法は設定されてる？(下みたいに)
<p><ecode>glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);</ecode></p>
<li>カレント画面は設定されてる？
<p>テクスチャはGPU側のメモリに格納されるのでカレント画面が設定されてないと設定できない。テクスチャを確保する時にテクスチャ名に0が入るので一応判定はできるがエラーは出ず、黙って無視される。</p>
<ecode>glXMakeCurrent(xDisplay, xWindow, glxContext);</ecode></ul>
Oculus Riftのudev設定

Oculus RiftをLinux機に繋ぐと/dev/hidraw*のどこかに出てくるのだが、使うにはいちいちパーミッションを設定するのは面倒って時にudevのルールに追加する文は以下の通り。
SUBSYSTEM=="hidraw",ATTRS{idVendor}=="2833",ATTRS{idProduct}=="0001",MODE="0666"
...というメモ。

DK2だったらidProductのところに0021を設定。
Grape で JSONP をサポートする


***

(2013/5/25 追記）
いつの間にか[ドキュメント](https://github.com/intridea/grape)にも記載されていました。
[rack-contrib](https://github.com/rack/rack-contrib) を使う方法が記載されています。

***

rack-jsonp-middleware という gem を使用すれば簡単です。

```Gemfile
gem 'rack-jsonp-middleware'
```

```ruby:root_api.rb
class RootApi < Grape::API
  require 'rack/jsonp'
  use Rack::JSONP
end
```

これだけで JSONP をサポートすることができます。

```shell:
curl -X GET http://localhost:3000/user.jsonp?callback=hoge
hoge({"id":1,"name":"Steve"});
```
Launchpadを整理、使用頻度の高いアプリのみ登録して使いやすくする


Launchpadのデータ置き場（バックアップをとっておくこと）

```
~/Library/Application\ Support/Dock/
```

## 初期化して自動的に再配置する場合

1.削除

```
rm ~/Library/Application\ Support/Dock/*.db
```

2.Dockを強制終了->再起動

```
killall Dock
```

![](http://f.cl.ly/items/1F0F3o1x3l4007072f2M/qiita_launch1_web.jpg)
「アプリケーションを読込中...」と表示された後に自動的に読み込まれる。

## Launchpadを空にして自由に配置する場合

1.dbに登録されたappを削除

```
sqlite3 ~/Library/Application\ Support/Dock/*.db "DELETE from apps; \
  DELETE from groups WHERE title<>''; DELETE from items WHERE rowid>2;"
```
2.Dockを強制終了->再起動

```
killall Dock
```

![](http://f.cl.ly/items/3T0Q1F161F2E1F2m3e3L/qiita_launch2_web.jpg)
全部消える。


![](http://f.cl.ly/items/2f1S0w1J1r1Y011K1B0w/qiita_launch3_web.jpg)
DockのLaunchpadアイコンに登録したいappをドロップして配置。
sequence.cpp

```cpp
#include <stdio.h>
#include <iostream>
#include <string>
#include <boost/foreach.hpp>

int str2int( const char s )
{
	return ( s < 'a' ) ? s-'0': s-0x57;
}

void test( const std::string input, const std::string ans )
{
	int max_cnt = 1;
	BOOST_FOREACH( const char c1, input )
	{
		BOOST_FOREACH( const char c2, input.substr( input.find_first_of(c1)+1 ) )
		{
			const int diff = str2int(c2) - str2int(c1);
			char pre_c = c2;
			int cnt = 2;
			BOOST_FOREACH( const char c3, input.substr( input.find_first_of(c2)+1 ) )
			{
				if( str2int(c3) == str2int(pre_c)+diff )
				{
					cnt++;
					pre_c = c3;
				}
				else if( str2int(c3) > str2int(pre_c)+diff )
				{
					break;
				}
			}
			if( cnt > max_cnt ) max_cnt = cnt;
		}
	}
	printf("%s\n", (max_cnt == atoi(ans.c_str())) ? "ooooo GOOD ooooo": "xxxxx BAD xxxxx");
}

int main( void )
{
/*0*/ test( "12345abcz", "5" );
/*1*/ test( "012abku", "4" );
/*2*/ test( "01245689cdeghik", "6" );
/*3*/ test( "0", "1" );
/*4*/ test( "m", "1" );
/*5*/ test( "01", "2" );
/*6*/ test( "az", "2" );
/*7*/ test( "0az", "2" );
/*8*/ test( "0ak", "3" );
/*9*/ test( "05ak", "3" );
/*10*/ test( "01349acdrsuv", "2" );
/*11*/ test( "01245789efgipqstux", "3" );
/*12*/ test( "0123456789abcdefghijklmnopqrstuvwxyz", "36" );
/*13*/ test( "02468acegikmoqsuwy", "18" );
/*14*/ test( "0369cfilorux", "12" );
/*15*/ test( "048cgkosw", "9" );
/*16*/ test( "05afkpuz", "8" );
/*17*/ test( "0123456789abcdefghjklmnopqrstuvwxyz", "18" );
/*18*/ test( "0123456789bcdefghijklmopqrstuvwxyz", "12" );
/*19*/ test( "0156abfgklpquv", "7" );
/*20*/ test( "0167cdijopuv", "6" );
/*21*/ test( "0178eflmst", "5" );
/*22*/ test( "0189ghopwx", "5" );
/*23*/ test( "019aijrs", "4" );
/*24*/ test( "012567abcfghklmpqruvw", "7" );
/*25*/ test( "012678cdeijkopquvw", "6" );
/*26*/ test( "012789efglmnstu", "5" );
/*27*/ test( "01289aghiopqwxy", "5" );
/*28*/ test( "0129abijkrst", "4" );
/*29*/ test( "01235678abcdfghiklmnpqrsuvwx", "7" );
/*30*/ test( "01236789cdefijklopqruvwx", "12" );
/*31*/ test( "0123789aefghlmnostuv", "5" );
/*32*/ test( "012389abghijopqrwxyz", "5" );
/*33*/ test( "01239abcijklrstu", "4" );
/*34*/ test( "368acdknouvz", "4" );
/*35*/ test( "369chikmnopqruwx", "6" );
/*36*/ test( "05689cdefghijklmnopqrstvwy", "18" );
/*37*/ test( "2489abdeiklrsuvwz", "4" );
/*38*/ test( "678bhijklnpqrsuvwxyz", "6" );
/*39*/ test( "1246cfjkopquxz", "5" );
/*40*/ test( "123459abcefhilmotuvx", "6" );
/*41*/ test( "02578acdefikmopqsuvwxz", "8" );
/*42*/ test( "135abdefghijlopstuwz", "7" );
/*43*/ test( "0126789fgjnotuvxy", "5" );
/*44*/ test( "2345678defjkmnoqrtvwxy", "7" );
/*45*/ test( "02568bdemnostw", "5" );
/*46*/ test( "145689bdfhilnqrstvwxz", "6" );
/*47*/ test( "4aghjrtuvwxyz", "7" );
/*48*/ test( "158achklmqstwy", "3" );
/*49*/ test( "012346abceghjknortv", "5" );
	return 0;
}
```
ubuntu12.04にphp5.4をインストールする

要はppaリポジトリを追加すればいいだけなんですが、
昔から配布していた所が2013年時点では更新止めてたりするので、
覚書程度に下記にてシェア。
2013/05/19だと5.4.15が入るみたいです。

https://launchpad.net/~nathan-renniewaldock/+archive/ppa

'''bash
sudo aptitude install python-software-properties
sudo add-apt-repository ppa:nathan-renniewaldock/ppa
'''
Raspberry Piセットアップメモ（Raspi-configの変更）


##Raspberry Piにつなぐもの
- USBキーボード
- USBマウス
- ディスプレイ（HDMI出力）
- MicroUSB<->自分のmac　//これをつなぐと電源が入って起動する。

**※電源は5Vで700mAを給電できれば何でもおｋ。**


##初回起動後に表示される設定画面「Raspi-config」

**Raspi-config**でいくつかの初期設定を行う。

###[change_pass]
初期ユーザーである**pi**のパスワード変更を行う。


###[change_timezone]
タイムゾーンを[Asia]-[Tokyo]に指定。

###[ssh]
ssh接続を有効にしたいので、**Enable**に設定。

とりあえず上記を設定して**\<Finish\>**。

##ネットワークの設定
Raspberry PiにLANケーブルを接続する。

```
$ ifconfig
```

```
pi@raspberrypi ~ $ ifconfig
eth0      Link encap:Ethernet  HWaddr xx:xx:xx:xx:0a:dc
          inet addr:192.168.XXX.XXX  Bcast:192.168.XXX.XXX  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:135 errors:0 dropped:0 overruns:0 frame:0
          TX packets:123 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:14179 (13.8 KiB)  TX bytes:14352 (14.0 KiB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:1104 (1.0 KiB)  TX bytes:1104 (1.0 KiB)
```

##SSHで接続
自分のmacから同じネットワーク内にあるRaspberry PiにSSHで接続してみる。

```
$ ssh pi@192.168.XXX.XXX
```
パスワードを聞かれるのでRaspi-configで設定しなおしたPiユーザーのパスワードを入力して接続する。
SSHで接続できればUSBキーボードもHDMIケーブルも必要なくなる。