OmniAICreator/Qiita-1.07M huggingface dataset:
UI-Bootstrapのmodalのテストで、$modalInstanceを使うControllerをテストしようとして、$modalInstanceをinjectしようとするところでUnknown providerとエラーが出る


公式のサンプルでいうと、ModalInstanceCtrl部分のテスト。

```modal-demo.js
var ModalDemoCtrl = function ($scope, $modal, $log) {

  $scope.items = ['item1', 'item2', 'item3'];

  $scope.open = function (size) {

    var modalInstance = $modal.open({
      templateUrl: 'myModalContent.html',
      controller: ModalInstanceCtrl,
      size: size,
      resolve: {
        items: function () {
          return $scope.items;
        }
      }
    });

    modalInstance.result.then(function (selectedItem) {
      $scope.selected = selectedItem;
    }, function () {
      $log.info('Modal dismissed at: ' + new Date());
    });
  };
};

// Please note that $modalInstance represents a modal window (instance) dependency.
// It is not the same as the $modal service used above.

var ModalInstanceCtrl = function ($scope, $modalInstance, items) {

  $scope.items = items;
  $scope.selected = {
    item: $scope.items[0]
  };

  $scope.ok = function () {
    $modalInstance.close($scope.selected.item);
  };

  $scope.cancel = function () {
    $modalInstance.dismiss('cancel');
  };
};
```


beforeEachで$modalInstanceをinjectしようとしているところで

```modal_instance_spec.coffee
"use strict"

describe "Controller: ModalInstanceCtrl", ->

  # load the controller"s module
  beforeEach module "myApp"

  ModalInstanceCtrl = {}
  scope = {}
  modalInstance = {}
  httpBackend = {}
  
  # Initialize the controller and a mock scope
  beforeEach inject ($controller, $rootScope, _$httpBackend_,_$modalInstance_) ->
    scope = $rootScope.$new()
```

こんなエラー

```zsh
Error: [$injector:unpr] Unknown provider: $modalInstanceProvider <- $modalInstance
```


こんなときはmodalInstanceをmockにしてしまえばOK.

```modal_instance_spec.coffee
"use strict"

describe "Controller: ModalInstanceCtrl", ->

  # load the controller"s module
  beforeEach module "myApp"

  ModalInstanceCtrl = {}
  scope = {}
  modalInstance = {}
  httpBackend = {}
  
  # Initialize the controller and a mock scope
  beforeEach inject ($controller, $rootScope, _$httpBackend_) ->
    scope = $rootScope.$new()
    httpBackend = _$httpBackend_
    modalInstance =
      close: jasmine.createSpy("modalInstance.close")
      dismiss: jasmine.createSpy("modalInstance.dismiss")
      result: 
        then: jasmine.createSpy('modalInstance.result.then')

    ModalInstanceCtrl = $controller "ModalInstanceCtrl", {
      $scope: scope
      $modalInstance: modalInstance
    }

  it "cancelを呼ぶと、modalをdismissすること", ->
    scope.cancel()
    expect(modalInstance.dismiss).toHaveBeenCalled()
#........
```

#### 参考というかそのまま

- http://stackoverflow.com/questions/22246813/unit-testing-testing-a-modalinstance-controller-with-karma-jasmine

- http://stackoverflow.com/questions/22246813/unit-testing-testing-a-modalinstance-controller-with-karma-jasmine
VisualforceでSVGによる描画を試してみました

![スクリーンショット 2014-09-14 15.36.28.png](https://qiita-image-store.s3.amazonaws.com/0/8407/640ba022-18e9-729a-c2f9-5cfc538ea03f.png)

SVGの描画サンプルコードがあったのでVisualforceで試してみました。

```
<apex:page >
    <head>
        <meta charset="utf-8"></meta>
        <title>SVG Sample</title>
    </head>
    <body>
        <svg>
            <rect x="10" y="30" width="100" height="80" />
        </svg>
    </body>
</apex:page>
```
PHP+cURLのエラーハンドリング

エラーハンドリングの基本
==============================

PHPのlibcurl拡張でHTTPリクエストをする際、色々なエラーが起きることが考えられる。
`curl_errno`と`curl_error`で直近のexecで発生したエラーを調べることができる。

`curl_exec()`の戻り値が`false`だったらエラーだと判定できるのだけど、詳細なところがわからないので、明示的にエラーが起きたかを調べた方がよさそう。

例外を使いたいなら、ラッパークラス/関数でハンドリングして適当なException型を投げればよいだろう。

```php
<?php
// 単純なcurl関数のラッパー
// 毎回コネクションを切断するので非効率かも
function getHttpContent($url)
{
  $ch = curl_init($url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  $body = curl_exec($ch);
  $info = curl_getinfo($ch);

  $errno = curl_errno($ch);
  $error = curl_error($ch);
  curl_close($ch);
  if (CURLE_OK !== $errno) {
    throw new RuntimeException($error, $errno);
  }

  return [$body, $info];
}
```

後で「どんなURLにアクセスしようとしてエラーが起きたのか？」とか調べたいだろうから、もう少し例外型には情報を含めるよう工夫した方がいいかもしれない。

cURLは何をエラーとみなすのか？
=======================

libcurl公式ページに、エラー一覧が載っている。
[libcurl - Error Codes](http://curl.haxx.se/libcurl/c/libcurl-errors.html)

- サポートしていないプロトコルを指定した
- URLがURLの形式になっていない

などなど、基本的なところと、HTTP通信は成功したけれど40X系のステータスコードが返ってきた場合などが書いてある。

デフォルト状態だと、400系が返ってきたとしてもlibcurlはエラーとみなしてくれない。
冒頭のサンプルコードは404 Not Foundが返ってきたとしても例外は発生しない。

オプションで`CURLOPT_FAILONERROR`をtrueにセットすると、400以上のステータスコードの場合にエラーとみなしてくれるようになる。
が、この場合、400以上のステータスコードならレスポンスボディを読めなくなる。

400で詳細なエラーの理由をボディに送ってくるケースもあるので、FAILONERRORをfalseにして(デフォルト状態である)、手動でハンドリングした方がいいと思う。

```php
<?php
// ステータスコードが400以上だった場合も例外が発生するバージョン
// ただしレスポンスボディがわからない
function getHttpContent($url)
{
    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_FAILONERROR => true,
    ]);
    $body = curl_exec($ch);
    $info = curl_getinfo($ch);

    $errno = curl_errno($ch);
    $error = curl_error($ch);
    curl_close($ch);
    if (CURLE_OK !== $errno) {
        throw new RuntimeException($error, $errno);
    }

    return [$body, $info];
}
```




### CURLOPT_HTTP200ALIASESオプションの正体

なんか謎のオプションがあるが、思ってたのと違った。最初見たとき、DELETEのときは404も200 OKとみなしてくれるように設定したりできる便利な何かかと思ったんですが。。
[PHP: curl_setopt - Manual](http://php.net/manual/ja/function.curl-setopt.php)

- CURLOPT_HTTP200ALIASES
  - エラーではなく正常な応答として扱われる、HTTP 200 レスポンスの配列。 

404とか400を200扱いしてくれるとかではなく、HTTPのRFCに従わないレスポンスが返ってきた時に、200とみなしてくれるオプションの模様。HTTPを上書きすることはできないようだった。

例として、SHOUTcastというストリーミングサーバーでは`HTTP/1.1 200 OK`ではなく`ICY 200 OK`を返すことがあるらしい。これを200扱いしたい場合は以下のようにセットしておくとよいようだ。

```php
curl_setopt($ch, CURLOPT_HTTP200ALIASES, ['ICY 200 OK']);
```

配列で渡すものはステータスラインの文字列。
Evilでfコマンドなどで句読点にマッチしてほしい

## Evilでのfコマンド

将来的には何らかの対応があるのでしょうが、fコマンドで日本語の句読点に
マッチしてほしいと思いました。

```el
(defun skk-char-taiou (char)
  (if (symbol-value skk-mode)
      (progn
        (if (eq char ?.)
            (if (or (eq skk-kutouten-type 'jp) (eq skk-kutouten-type 'jp-en))
                (setq char ?。)
              (setq char ?．) ))
        (if (eq char ?,)
            (if (or (eq skk-kutouten-type 'jp) (eq skk-kutouten-type 'en-jp))
                (setq char ?、)
              (setq char ?，) ))))
  char)
```

なんと汚いコードだと思う。これをevil-find-charに入れる。

```el
(evil-define-motion evil-find-char (count char)
  "Move to the next COUNT'th occurrence of CHAR."
  :jump t
  :type inclusive
  (interactive "<c><C>")
  (setq count (or count 1))
  (setq char (skk-char-taiou char))
 (let ((fwd (> count 0)))
    (setq evil-last-find (list #'evil-find-char char fwd))
    (when fwd (forward-char))
    (let ((case-fold-search nil))
      (unless (prog1
                  (search-forward (char-to-string char)
                                  (unless evil-cross-lines
                                    (if fwd
                                        (line-end-position)
                                      (line-beginning-position)))
                                  t count)
                (when fwd (backward-char)))
        (error "Can't find %c" char)))))
```

一応は目的達成。SKKユーザでない人はどうやるのか
わかりません。すみません。

追記:

一応きれいだと思うコードにしてみました。

```el
(defun skk-char-taiou (char)
  (if (and (symbol-value skk-mode) (not skk-latin-mode))
      (cond ((or (eq skk-kutouten-type 'jp) (eq skk-kutouten-type 'jp-en))
             (if (eq char ?.) ?。 char) )
            ((or (eq skk-kutouten-type 'jp) (eq skk-kutouten-type 'en-jp))
             (if (eq char ?,) ?、 char) )
            (t char))
    char))
```
審美は人それぞれでしょうけれども。

さらに追記:

```el
(advice-add #'evil-find-char :filter-args #'skk-char-taiou-function)
(defun skk-char-taiou-function (args)
  (list (car args) (skk-char-taiou (cadr args))))
```

としておくと、`evil-find-char`を汚さないで済むようです。

追記:

バグがありました。

```el
(defun skk-char-taiou (char)
  (if (and (symbol-value skk-mode) (not skk-latin-mode))
      (cond ((eq skk-kutouten-type 'jp)
             (cond ((eq char ?.) ?。) 
                   ((eq char ?,) ?、)
                   (t char)))
            ((eq skk-kutouten-type 'jp-en)
             (cond ((eq char ?.) ?。)
                   ((eq char ?,) ?，)
                   (t char)))
            ((eq skk-kutouten-type 'en-jp)
             (cond ((eq char ?.) ?．)
                   ((eq char ?,) ?、)
                   (t char)))
            ((eq skk-kutouten-type 'en)
             (cond ((eq char ?.) ?．)
                   ((eq char ?,) ?，)
                   (t char)))
            (t char))
    char))
```

でした。`cond`の使い方を間違えていました。
monacoindをcentos7でコンパイルする

# monacoin のコンパイル

centos7にインストールするときに注意点が４つあります

- opensslに必要なモジュールが組み込まれていないためソースからコンパイルする必要がある
- miniupnpをインストール時に場所の指定をする必要がある
- berkeleydbをコンパイル時にオプション指定する必要がある
- monacoinコンパイル時にオプション指定する必要がある

## 1.yumでインストール

```
yum install -y git gcc gcc-c++ boost-* zlib-devel
```

## 2.opensslをダウンロードしてインストール

```
wget http://www.openssl.org/source/openssl-1.0.1i.tar.gz
tar zxvf openssl-1.0.1i.tar.gz 
cd openssl-1.0.1i
./config 
make
make install
cd ..
```

## 3.miniupnpをダウンロードしてインストール

```
git clone https://github.com/miniupnp/miniupnp.git
cd miniupnp/miniupnpc
make
LIBDIR=lib64 make install
cd ../..
```

## 4.berkeleydbをダウンロードしてインストール

```
wget http://download.oracle.com/berkeley-db/db-4.8.30.tar.gz
tar zxvf db-4.8.30.tar.gz
cd db-4.8.30/build_unix
../dist/configure --enable-static --enable-cxx --prefix=/usr/local --libdir=/usr/local/lib64 --disable-shared
make
make install
cd ../..
```

## 5.monacoinをダウンロードしてインストール
```
git clone https://github.com/monacoinproject/monacoin.git
cd monacoin/src
CXXFLAGS="-I/usr/local/ssl/include" LDFLAGS=-L/usr/local/ssl/lib make -f makefile.unix BOOST_LIB_SUFFIX=-mt
```

## 6.起動確認する

```
./monacoind -rpcuser=hoge -rpcpassword=hogehoge
```

特にエラー終了しないかどうか確認して問題なければコンパイル完了です。
enjoy


## コンパイルエラーが出たとき
```
g++ -c -O2 -pthread -Wall -Wextra -Wformat -Wformat-security -Wno-unused-parameter -g -DBOOST_SPIRIT_THREADSAFE -D_FILE_OFFSET_BITS=64 -I/root/monacoin/src -I/root/monacoin/src/obj -DUSE_UPNP=0 -DUSE_IPV6=1 -I/root/monacoin/src/leveldb/include -I/root/monacoin/src/leveldb/helpers -DHAVE_BUILD_INFO -fno-stack-protector -fstack-protector-all -Wstack-protector -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -I/usr/local/ssl/include -MMD -MF obj/bitcoinrpc.d -o obj/bitcoinrpc.o bitcoinrpc.cpp
g++: internal compiler error: Killed (program cc1plus)
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://bugzilla.redhat.com/bugzilla> for instructions.
make: *** [obj/bitcoinrpc.o] Error 4
```

メモリ不足なのでスワップを追加する（メモリ１Gだと出ます）
その場合はswapを追加します
以下のコマンドで追加可能

```
dd if=/dev/zero of=/swap bs=1024 count=1000000
mkswap /swap
swapon /swap
```

スワップを追加すると以下のような感じになる

```
[root@vultr src]# free
             total       used       free     shared    buffers     cached
Mem:       1017872     160280     857592      13296       2616      45528
-/+ buffers/cache:     112136     905736
Swap:            0          0          0
[root@vultr src]# swapon /swap 
swapon: /swap: insecure permissions 0644, 0600 suggested.
[root@vultr src]# free
             total       used       free     shared    buffers     cached
Mem:       1017872     162132     855740      13296       2636      46380
-/+ buffers/cache:     113116     904756
Swap:       999996          0     999996
```
bcryptでパスワード取り扱い


```Gemfile
gem 'bcrypt', '~>3.1.7'
```

```migration
def change
  create_table :users do |t|
    t.string :password_digest,  null: false
  end
end
```

```app/models/user.rb
class User < ActiveRecord::Base
  # SecurePassword有効
  has_secure_password
end
```

```console
# ユーザ作成
User.create password: "パスワード"
=> #<User>

# ユーザ検索
user = User.find 1

# ユーザ認証(成功)
user.authenticate "パスワード"
=> #<User>

# ユーザ認証(失敗)
user.authenticate "異なるパスワード"
=> false

# 1発で検索
User.find_by(id: 1).try(:authenticate, "パスワード")
=> #<User>
```
Yokohama.rb 2014年9月13日


# レシピブック 174〜

## `Find.find` と `Dir.glob`

`Find.find(".")` と `Dir.glob("./**/*")` の違い。

* `Dir.glob` の方が速い。
* `Find.find` だとhidden file も取れる。
* `Find.find` には `Find.prune` がある。
* prune は 「刈込み」または「乾燥スモモ」

ベンチマークは以下のような感じで行った。

```ruby
N=100
p Benchmark.realtime{ N.times{ Find.find(".").to_a } }
#=> 0.849767
p Benchmark.realtime{ N.times{ Dir.glob("./**/*").to_a } }
#=> 0.590455
```

対象となるディレクトリに hidden ファイル / hidden ディレクトリ があると公平にならないので注意。

### 9/16 追記

Qiita の関連記事に

 * [Dir.glob と Find の違い](http://qiita.com/labocho/items/8ed63b4e0a1060170df4)

があるのを発見し、読んでみたところ。

> 使い勝手と総処理時間では Dir.glob のが有利だが、Find は処理を始めるまでの時間が短い

という重大な違いがあることがわかった。手元で試してもまったくそのとおりだった。
不覚。
というわけで、 `Find.find` には存在意義がある。

## `FileUtils.cp_r`

返戻値になんか帰ってくることがあるけど、特に意味はなさそうな感じ。

FileUtils のドキュメント( pry-doc とか、 ri とか )を見ると
> copy_entry(src, dest, preserve = false, dereference = false)

とあるけど、dereference は dereference_root の間違いっぽい。

`dereference_root` という名前のとおり、コピー元の root だけを(そうする必要があれば)dereferenceする。

## `FileUtils.rm_rf`

`rm_r` には `force:true` できるけど、`rm_rf` に `force:true` をつけるとエラーになる。

```ruby
FileUtils.rm_r([], force:true) #=> [ ]

FileUtils.rm_rf([], force:true)
# =>ArgumentError: no such option: force
```

# Actor model

see https://github.com/cesare/actors-introduction/blob/master/yokohamarb-2014-09-13.md

## TokyuRuby会議08 

朝10時から飲む、LT大会。
see http://regional.rubykaigi.org/tokyu08/
日本酒が出そうらしい。

## 雑感

Actor モデルって

> A「Bさん、hogeやっといて」
> A「Cさん、fugaやっといて」
> B「Aさん、hogeできました」

のようなやりとりなんだなきっと。

あと。
PlayStation2 に載っていた CELL を思い出した。


# 懇親会

略。
Go の変数初期化に伴う条件分岐をもっと良い感じに書きたいと思ったが諦めるしかないようです


Go にはスクリプト言語でいうところの <code>variable = a || b</code> のような構文や三項演算子がないようなので、

```go
var accessKeyId, secretAccessKey string
if config["aws_access_key_id"] == "" {
	accessKeyId = os.Getenv("AWS_ACCESS_KEY_ID")
	secretAccessKey = os.Getenv("AWS_SECRET_ACCESS_KEY")
} else {
	accessKeyId = config["aws_access_key_id"]
	secretAccessKey = config["aws_secret_access_key"]
}
```

とか

```go
var url string
var err error

if len(os.Args) == 1 {
	url, err = gozo.SendCapture()
} else {
	url, err = gozo.SendFile(os.Args[1])
}
```

こんな感じのコードを毎回書くことになるんだけど、本当は

```
accessKeyId = config["aws_access_key_id"] || os.Getenv("AWS_ACCESS_KEY_ID")
secretAccessKey = config["aws_secret_access_key"] || os.Getenv("AWS_SECRET_ACCESS_KEY")
```

とか

```
url, err := len(os.Args) == 1 ? gozo.SendCapture() : gozo.SendFile(os.Args[1])
```

みたいに書けたらいいと思ってますができません。それは諦めるとしてもちっとまともに書きたいんですがみなさんどうしてるんでしょうか。

[Goには三項演算子a?b:cはない ―― 代わりの書き方](http://qiita.com/ruiu/items/61236f09b3469a679eb9) では諦めるしかない旨が書かれてますが･･･。
BlocksKitをやめてUIAlertControllerを使う


UIAlertViewとUIActionSheetでBlocksKitを使っていたコードを、iOS8から使えるようになったUIAlertControllerに置き換えます。

UIAlertView/UIActionSheetを直接使っている場合に比べると、BlocksKitを使っている場合は大体同じようなコードなので移行が簡単です。

## UIAlertView+BlocksKitの置換

```swift:UIAlertView+BlocksKit
func showConfirm() {
    let alert = UIAlertView.bk_alertViewWithTitle("", message:"Are you sure?") as UIAlertView

    alert.bk_addButtonWithTitle("OK", handler:{
		...
    })

    alert.bk_setCancelButtonWithTitle("Cancel", handler:{
		...
    })

    alert.show()
}
```

```swift:UIAlertController(Alert)
func showConfirm() {
	let alert = UIAlertController(title:"", message:"Are you sure?",
		preferredStyle: UIAlertControllerStyle.Alert)

	alert.addAction(UIAlertAction(title:"OK", style:UIAlertActionStyle.Default,
		handler:{ action in
			...
       	}))

	alert.addAction(UIAlertAction(title:"Cancel", style:UIAlertActionStyle.Cancel,
		handler:{ action in
			...
		}))

	self.presentViewController(alert, animated:true, completion:{})
}
```

## UIActionSheet+BlocksKitの置換

```swift:UIActionSheet+BlocksKit
func showConfirm() {
    let sheet = UIActionSheet.bk_actionSheetWithTitle("Are you sure?") as UIActionSheet

    sheet.bk_addButtonWithTitle("OK", handler:{
		...
    })

    sheet.bk_setCancelButtonWithTitle("Cancel", handler:{
		...
    })

    sheet.showInView(self.view, animated:true)
}
```

```swift:UIAlertController(ActionSheet)
func showConfirm() {
	let alert = UIAlertController(title:"", message:"Are you sure?",
		preferredStyle: UIAlertControllerStyle.Alert)

	alert.addAction(UIAlertAction(title:"OK", style:UIAlertActionStyle.Default,
		handler:{ action in
			...
       	}))

	alert.addAction(UIAlertAction(title:"Cancel", style:UIAlertActionStyle.Cancel,
		handler:{ action in
			...
		}))

	self.presentViewController(alert, animated:true, completion:{})
}
```

## 感想
UIAlertControllerStyleをAlertかActionSheetか切替えるだけでよくなったのがいいですね。
iOS7以前をサポートする場合はラッパークラスを定義して、内部でBlocksKitとUIAlertControllerで振り分けると良さそうです。
基盤地図情報のファイル名の解釈コード

基盤地図情報の最大のメタデータはファイル名であり、ファイル名をしっかりと解釈するためのコードを作ってみた。

```ruby
ARGV.each {|path|
  next unless /xml$/.match path
  r = File.basename(path, '.xml').split('-')
  r.pop if r[-1].size == 4
  next unless r.shift == 'FG'
  next unless r.shift == 'GML'
  date = r.pop
  type = r.pop
  meshcode = r.join
  p({:path => path, :type => type, :meshcode => meshcode, :date => date})
}
```

データのタイプ、メッシュコード（地域区画コード）、日付を取り出すコードとなっている。コマンドライン引数に与えられたファイル名を解釈していくつくりにしている。
基盤地図情報（数値標高モデル）（5mメッシュ（標高））の変換にXML処理を使うのは間違っている感じ

基盤地図情報（数値標高モデル）（5mメッシュ（標高））の変換にSAX（nokogiri）を使ってみたが、作ってみて分かったのだが、非本質的な処理になっている感じがあって、メリットがない。

SAXの設計もRubyの大クラス主義に合わない感じがするし、結局、ファイル名とtupleListのカンマ区切り値くらいしか取るべき情報はない。gml:Envelope の数値の打ち切りがおかしくて、これを取らずメッシュ名を取る方がよいと思ったことが、メリットがないと考えた一番の引き金である。

なので、単純なテキスト処理でコンバータを作るのが正しいと思った。nokogiri で作りかけたスクリプトを、記録のためにここにおいておく。

```ruby
require 'nokogiri'

class DEM5A2CSV < Nokogiri::XML::SAX::Document
  def start_element(name, attrs)
    @buf = ''
  end

  def characters(s)
    @buf += s
  end

  def end_element(name)
    if name == 'gml:tupleList'
      @tupleList = @buf
    end
    @buf = ''
  end

  def end_document
    print <<-EOS
tupleList: #{@tupleList}
    EOS
  end
end

parser = Nokogiri::XML::SAX::Parser.new(DEM5A2CSV.new)
ARGV.each{|fn|
  parser.parse(File.open(ARGV[0]))
}
```
コンテナから/dev/sdaを直接利用する

# 失敗(privilegedオプションなし)

```bash:
$ sudo docker run -v /dev/sda:/dev/sda  -it tukiyo3/ubuntu-debootstrap-ja:14.10 /bin/bash
root@ac9b58a360f6:/# fdisk -l /dev/sda
root@ac9b58a360f6:/# fdisk  /dev/sda
fdisk: unable to open /dev/sda: Operation not permitted
root@ac9b58a360f6:/# ls -l /dev/sda
brw-rw---- 1 root disk 8, 0  9月 14 04:11 /dev/sda
```

# 成功(privilegedオプションあり)

```bash:
$ sudo docker run -v /dev/sda:/dev/sda --privileged=true -it tukiyo3/ubuntu-debootstrap-ja:14.10 /bin/bash
root@6ffa4e3e7e7f:/# fdisk -l /dev/sda

Disk /dev/sda: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders, total 156301488 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x5530d86b

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            2048    24578047    12288000   27  Hidden NTFS WinRE
/dev/sda2   *    24578048    25192447      307200   27  Hidden NTFS WinRE
/dev/sda3        25192448   156299439    65553496    7  HPFS/NTFS/exFAT
root@6ffa4e3e7e7f:/# mount /dev/sda3 /mnt
ls -l /mroot@6ffa4e3e7e7f:/# ls -l /mnt
total 7138384
drwx------ 1 root root          0  9月 10 05:39 $Recycle.Bin
-rw------- 1 root root       8192  3月 25  2011 BOOTSECT.BAK
drwx------ 1 root root       4096  3月 25  2011 Boot
drwx------ 1 root root          0  7月 14  2009 Documents and Settings
drwx------ 1 root root          0  9月 10 01:23 Intel
drwx------ 1 root root          0  7月 14  2009 PerfLogs
drwx------ 1 root root       8192  9月 10 05:33 Program Files
drwx------ 1 root root       8192  9月 10 05:44 Program Files (x86)
drwx------ 1 root root       4096  9月 10 05:40 ProgramData
drwx------ 1 root root          0  9月 10 05:28 Recovery
drwx------ 1 root root       4096  9月 10 10:00 System Volume Information
drwx------ 1 root root       4096  9月 10 05:28 Users
drwx------ 1 root root      28672  9月 10 07:50 Windows
-rw------- 1 root root     383786 11月 20  2010 bootmgr
-rw------- 1 root root 3132530688  9月 10 09:58 hiberfil.sys
-rw------- 1 root root 4176707584  9月 10 09:58 pagefile.sys
drwx------ 1 root root      12288  9月 10 05:30 util
root@6ffa4e3e7e7f:/# umount /mnt
```
jarファイルからシグネチャを取得するまで

# 概要
最近よくメソッドのシグネチャを調べることがある。
そこでjarファイルに含まれているclassファイルを逆アセンブルするまでをメモとしてまとめる。

ここではサンプルとして **java.lang.String** のシグネチャを取り出すまでを実施してみる。

## jarファイルからclassファイルを取得する

jarファイルはzipなのでunzipでOK。

```
$ unzip $JAVA_HOME/jre/lib/rt.jar
```

実行するとjarファイルが解凍されて.classが取得できる。

## classファイルを逆アセンブルする

javapコマンドを使う。
シグネチャを取得するときは-sオプションを付与する。

```
$ javap -s java/lang/String.class 
Compiled from "String.java"
public final class java.lang.String implements java.io.Serializable, java.lang.Comparable<java.lang.String>, java.lang.CharSequence {
  public static final java.util.Comparator<java.lang.String> CASE_INSENSITIVE_ORDER;
    descriptor: Ljava/util/Comparator;
  public java.lang.String();
    descriptor: ()V

  public java.lang.String(java.lang.String);
    descriptor: (Ljava/lang/String;)V

  public java.lang.String(char[]);
    descriptor: ([C)V

  public java.lang.String(char[], int, int);
    descriptor: ([CII)V

  public java.lang.String(int[], int, int);
    descriptor: ([III)V

  public java.lang.String(byte[], int, int, int);
    descriptor: ([BIII)V

  public java.lang.String(byte[], int);
    descriptor: ([BI)V

  public java.lang.String(byte[], int, int, java.lang.String) throws java.io.UnsupportedEncodingException;
    descriptor: ([BIILjava/lang/String;)V

～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～
　意外と量があったので中略
～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～

  public static java.lang.String valueOf(int);
    descriptor: (I)Ljava/lang/String;

  public static java.lang.String valueOf(long);
    descriptor: (J)Ljava/lang/String;

  public static java.lang.String valueOf(float);
    descriptor: (F)Ljava/lang/String;

  public static java.lang.String valueOf(double);
    descriptor: (D)Ljava/lang/String;

  public native java.lang.String intern();
    descriptor: ()Ljava/lang/String;

  public int compareTo(java.lang.Object);
    descriptor: (Ljava/lang/Object;)I

  static {};
    descriptor: ()V
}
```

## まとめ
* 取得したシグネチャはJNIで利用中。
* JNIでシグネチャを指定する時に間違いなく指定できて安心。
* JNI以外で使ったことは今のところ無し。

## おまけ

**javap**
Disassembles one or more class files.

**usage**
javap \<options\> \<classes\>

```
$ javap --help
where possible options include:
  -help  --help  -?        Print this usage message
  -version                 Version information
  -v  -verbose             Print additional information
  -l                       Print line number and local variable tables
  -public                  Show only public classes and members
  -protected               Show protected/public classes and members
  -package                 Show package/protected/public classes
                           and members (default)
  -p  -private             Show all classes and members
  -c                       Disassemble the code
  -s                       Print internal type signatures
  -sysinfo                 Show system info (path, size, date, MD5 hash)
                           of class being processed
  -constants               Show final constants
  -classpath <path>        Specify where to find user class files
  -cp <path>               Specify where to find user class files
  -bootclasspath <path>    Override location of bootstrap class files
```
iOS8のシミュレータが立ち上がらなくて困ったメモ


さぁ今日も元気にiPhone開発！と思ってXcodeのRunボタン押したら

```XcodeError
The iOS 8.0 simulator runtime is not available.
Download the iOS 8.0 simulator runtime from the Downloads section in Xcode's Preferences.
```

と怒られましてしまいました。

![スクリーンショット 2014-09-14 2.34.53.png](https://qiita-image-store.s3.amazonaws.com/0/8868/b540ebdf-d429-971f-daf9-bf22d0cb8bdf.png "スクリーンショット 2014-09-14 2.34.53.png")

解決策は例によって[stackoverflow様](http://stackoverflow.com/questions/24727397/xcode-beta-6-ios-8-simulator-not-working)から。

メニューバーのXcode->Preference->LocationsのCommand Line Toolsの設定がXcode5.1.1になっていたのをXcode6.0にすれば良いようです。

![スクリーンショット 2014-09-14 2.42.12.png](https://qiita-image-store.s3.amazonaws.com/0/8868/38f2e68b-50c1-7f54-2548-18637fe52046.png "スクリーンショット 2014-09-14 2.42.12.png")

で、引っかかったところが１点。設定後「Reboot!」って書いてあるんですが、Xcodeの再起動だけではダメでMac自体を再起動したらシミュレータが立ち上がるようになりました。
monacoindをcentos6でコンパイルする

# monacoin のコンパイル

centos6にインストールするときに注意点が３つあります

- opensslに必要なモジュールが組み込まれていないためソースからコンパイルする必要がある
- miniupnpをインストール時に場所の指定をする必要がある
- monacoinコンパイル時にオプション指定する必要がある

## 1.yumでインストール

```
yum install -y git gcc gcc-c++ boost-* zlib-devel db4-cxx db4-devel
```

## 2.opensslをダウンロードしてインストール

```
wget http://www.openssl.org/source/openssl-1.0.1i.tar.gz
tar zxvf openssl-1.0.1i.tar.gz 
cd openssl-1.0.1i
./config 
make
make install
cd ..
```

## 3.miniupnpをダウンロードしてインストール

```
git clone https://github.com/miniupnp/miniupnp.git
cd miniupnp/miniupnpc
make
LIBDIR=lib64 make install
cd ../..
```

## 4.monacoinをダウンロードしてインストール
```
git clone https://github.com/monacoinproject/monacoin.git
cd monacoin/src
LDFLAGS=-L/usr/local/ssl/lib make -f makefile.unix BOOST_LIB_SUFFIX=-mt
```

## 5.起動確認する

```
./monacoind -rpcuser=hoge -rpcpassword=hogehoge
```

特にエラー終了しないかどうか確認して問題なければコンパイル完了です。
enjoy

## コンパイルエラーが出たとき

メモリが足りない場合は以下のコマンドでswapを追加できます

```
dd if=/dev/zero of=/swap bs=1024 count=1000000
mkswap /swap
swapon /swap
```
systemdのIN_SETマクロ

systemdには`IN_SET`というマクロがある。使い方はテストにあるようにこんな感じ：

```c:src/test/test-util.c
static void test_in_set(void) {
        assert_se(IN_SET(1, 1));
        assert_se(IN_SET(1, 1, 2, 3, 4));
        assert_se(IN_SET(2, 1, 2, 3, 4));
        assert_se(IN_SET(3, 1, 2, 3, 4));
        assert_se(IN_SET(4, 1, 2, 3, 4));
        assert_se(!IN_SET(0, 1));
        assert_se(!IN_SET(0, 1, 2, 3, 4));
}
```

可変長引数で、第二引数以降に指定された数値の中に第一引数が含まれるかどうかを判定する。

使い方としては

```c:src/core/manager.c
                if (!IN_SET(errno, EPIPE, EAGAIN, ENOENT, ECONNREFUSED, ECONNRESET, ECONNABORTED))
```

のように`errno`のチェックや、

```c:src/core/service.c
                if (!IN_SET(s->deserialized_state, SERVICE_DEAD, SERVICE_FAILED, SERVICE_AUTO_RESTART))
```

サービスの状態のチェックに使われている。

`IN_SET`マクロの定義はこんな感じ：

```c:src/shared/macro.h
#define IN_SET(x, y, ...)                                               \
        ({                                                              \
                const typeof(y) _y = (y);                               \
                const typeof(_y) _x = (x);                              \
                unsigned _i;                                            \
                bool _found = false;                                    \
                for (_i = 0; _i < 1 + sizeof((const typeof(_x)[]) { __VA_ARGS__ })/sizeof(const typeof(_x)); _i++) \
                        if (((const typeof(_x)[]) { _y, __VA_ARGS__ })[_i] == _x) { \
                                _found = true;                          \
                                break;                                  \
                        }                                               \
                _found;                                                 \
        })

```

`__VA_ARGS__`が第二引数以降に展開されることが分かれば、後はわりとそのまま。O(n)ですね。

`errno`はともかく、サービスの状態は自分で定義するのだから、ビット表現でも良かったのではと思わなくはない。
CakePHPでXml クラスへのデータのインポート

参考：http://book.cakephp.org/2.0/ja/core-utility-libraries/xml.html
``` $api_uri = 'http://maps.googleapis.com/maps/api/geocode/xml?address='.urlencode($address).'&sensor=false';
            $xml = Xml::build($api_uri, array('return' => 'simplexml'));```
erlang開発環境であるedts導入時の備忘録

最近、「すごいerlangゆかいに学ぼう」を購入した。
そのためEmacs上のerlang開発環境を探した結果「edts(Erlang Development Tool Suite)」
というEmacsのパッケージを見つけた。導入に苦戦したため備忘録としてメモ。

・OS:Mac OS X 10.9
・Emacs:24.3.1

1.パッケージの取得
caskファイルに以下を追加してcask installをする。
edtsのgithubを見るとpackage-installで問題なさそうだけど好みの問題ということで。

(depends-on "edts")

2.edtsのロード
edtsのロードをするためEmacsのinit.elに以下を追加。

(add-hook 'after-init-hook 'my-after-init-hook)
(defun my-after-init-hook ()
  (require 'edts-start))

3.edts-serverのmake
このステップに気づかず苦戦した。「2.」までの状態だと
「.erl」ファイルを開いた際に少し待たされて
「EDTS: Could not start main server」と表示されるだけで、補完表示等もされなかった。
という訳で、
cd ~/.emacs.d/.cask/24.3.1/elpa/edts-20140907.732
でMakefileのある場所まで行ってmakeを実行。
(「edts-20140907」はcaskでinstallした時のバージョンにより異なります。)

4.「sample.erl」を開き「sp」まで入力した結果。
![スクリーンショット 2014-09-14 1.13.54.png](https://qiita-image-store.s3.amazonaws.com/0/54207/e88f2944-bfd5-2d9a-c846-ccfd8baf906d.png)

まだ本読んでないから、補完候補に表示されている内容の意味がいまいち分からないけど
上手く起動してるっぽい。
AnsibleでHost Key Checkingを無効にする


## はじめに

AnsibleでHost Key Checkingを無効にする方法を記述します。

## 環境

* CentOS 6.5
* Ansible 1.7

## Host Key Checkingを無効にする方法

Ansibleのインストールや __ad-hoc command__ の操作方法については、[Ansibleで複数のサーバを操作する](http://qiita.com/toshiro3/items/4f93ddc3dc166a621eb8)をご参照ください。

### Ansibleの設定ファイルに記述する場合

```shell
$ cp /etc/ansible/ansible.cfg ~/.ansible.cfg
```

```ini:~/.ansible.cfg
[defaults]
host_key_checking = False
```

### 環境変数で設定する場合

```shell
$ export ANSIBLE_HOST_KEY_CHECKING=False
```

### opensshの設定を変更する場合

```config:~/.ssh/config
StrictHostKeyChecking no
```

※ ansibleに限定されず、host key checkingの機能が無効になります。

## 参考

* [Getting Started](http://docs.ansible.com/intro_getting_started.html#host-key-checking)
* [The Ansible Configuration File](http://docs.ansible.com/intro_configuration.html#host-key-checking)
CocoaPodsメモ


# ライブラリを特定のConfigurationでのみ有効にする

Podfile内のライブラリ定義でconfigurationに配列を渡す。次の例は、**Debug**というConfigurationでのみ、SparkInspectorが有効になる。

```ruby:Podfile
pod "SparkInspector", :configuration => ["Debug"]
```
使ってるVS2013の拡張機能を晒してみる

自分が使っているVS2013の拡張機能を晒してみます。あんまりいろいろ入れると重くなったりするので必要最小限です。全部無料です。

Web Essentials
==============
とりあえず入れとけってやつです。TypeScriptとかLESSとかCoffeeScriptとかのコンパイル結果が分割画面で見えたり、JS/CSSのminifyしてくれたり、ASP.NETの開発に必須の機能が盛りだくさんです。

http://vswebessentials.com/

VSCommands
==========
えっと、Visual Studioにいろんな機能を足してくれるみたいです。でも、あんまり右クリックメニューとか増えたりするの嫌いなんで、使ってるのは以下だけ。

- ファイルの比較
- ファイルのグループ化
- ソリューションのZIP圧縮
- Output Window の色付け
- エディターのタッチ操作

上記以外は基本全部Off。

http://vscommands.squaredinfinity.com/home

※上記URLにはVS2013用のダウンロードリンクがないですが、大丈夫。2013用ちゃんとあります。

Indent Guides
=============
エディタのインデント部分にガイドを出してくれます。[Productivity Power Tools](http://visualstudiogallery.msdn.microsoft.com/dbcb8670-889e-4a54-a226-a48a15e4cace?SRC=VSIDE)とかでもできるみたいですが、色々他の機能も入ってしまうのでピンポイントのこちらを使ってます。

http://visualstudiogallery.msdn.microsoft.com/e792686d-542b-474a-8c55-630980e72c30

Task Runner Explorer
====================
この間ちょっと[書きました](http://qiita.com/k_maru/items/e00298b5f132ea200395)が、GruntとかGulpとか走らせるやつですね。最近はgruntとかgulpの便利タスクが多いので連携できるのがうれしいです。

http://visualstudiogallery.msdn.microsoft.com/8e1b4368-4afb-467a-bc13-9650572db708

Node.js tools for Visual Studio
===============================
Visual Studio で node.js のプロジェクトを作れるようにする拡張です。デバッグできるし、npmとも連携するしで中々できるやつなのです。

http://nodejstools.codeplex.com/
mongoidでのfieldのdefault設定


概要
==============================

## 疑問
なぜfieldのdefaultの設定方法が2種類あるのか。

## 結論
defaultをlambdaで設定すると、その評価はオブジェクト作成時に評価される。
> オブジェクト？インスタンスって言ったほうがいいのか？



公式ドキュメントを確認
==============================
http://mongoid.org/en/mongoid/docs/documents.html
上記ページのDefaultsの項にて

> Defaults are either static values or lambdas.

とあって、要は普通に値を設定する方法とlambdaを使った方法の2種類がある。
で、なんで2種類？というのは

> Be wary that default values that are not defined as lambdas or procs are evaluated at class load time, so the following 2 definitions are not equivalent. (You probably would prefer the second, which is at document creation time.)

とあるので、ざっと見lambdaやprocじゃない場合はクラスロード時に値が決定するよ、的なことが書いてあるし、その下の例もそんな意図で書いてある。

```
field :dob, type: Time, default: Time.now
field :dob, type: Time, default: ->{ Time.now }
```



検証
==============================
んじゃ試してみるか、と。

```ruby
class Someting
  include Mongoid::Document

  field :time1, type: Time, default: Time.now
  field :time2, type: Time, default: ->{ Time.now }
end
```


```
pry(main)> Someting.new
=> #<Someting _id: 542eb1306b65796d25000000, time1: 2014-10-03 14:22:31 UTC, time2: 2014-10-03 14:22:40 UTC>
pry(main)> Someting.new
=> #<Someting _id: 542eb1386b65796d25010000, time1: 2014-10-03 14:22:31 UTC, time2: 2014-10-03 14:22:48 UTC>
```

timeの値はどっちも変わらないのだけど、time2の値は`.new`した時点の値になっていることが確認できた。



appendix
==============================
ちなみに既存のfieldに追加でdefaultを追加した場合や、新規でfield追加し、その後に`Something.first`とかで参照した場合の動作も同じっぽい。
lambdaの場合は`Something.first`するたびに時間がその時点の時間となったが、lambdaじゃない場合はクラスロード時の時間のままだった。

appendix2
==============================
> Rubyに不慣れだった昔の自分向け

上記の検証はpryとかirbで試せる。
事前に`gem install mongoid`はしてある前提。

```ruby
require 'mongoid'  # 追加箇所

class Someting
  include Mongoid::Document

  field :time1, type: Time, default: Time.now
  field :time2, type: Time, default: ->{ Time.now }
end
```

とすれば、その後は`Something.new`とか。
でもDB接続はしていないので`Something.create`とかはエラーになる。
OS X bash Update 1.0 (2014-09-29)

こんにちは。
Apple 社からの OS X bash Update 1.0 (2014-09-29) の脆弱性対処は下記のようです。(See http://support.apple.com/kb/DL1769 for Mavericks.)（参考：[bash-3.2 のパッチ for OS X](http://qiita.com/kkdd/items/206364ef2ea4244c14cd)）

```
- CVE-2014-6271  ✔
- CVE-2014-7169  ✔
- CVE-2014-7186  ✘
- CVE-2014-7187  ？
- CVE-2014-6277  ✘
- CVE-2014-6278  ✔
```

OS X 10.9.5 に適用し、bashcheck (https://github.com/hannob/bashcheck) でチェックすると 

```console
% ./bashcheck.sh
GNU bash, version 3.2.53(1)-release (x86_64-apple-darwin13)
Not vulnerable to CVE-2014-6271 (original shellshock)
Not vulnerable to CVE-2014-7169 (taviso bug)
Vulnerable to CVE-2014-7186 (redir_stack bug)
Test for CVE-2014-7187 not reliable without address sanitizer
Vulnerable to CVE-2014-6277 (lcamtuf bug #1) [no patch]
Not vulnerable to CVE-2014-6278 (lcamtuf bug #2)
Variable function parser inactive, likely safe from unknown parser bugs
```
なお適用前は

```console
% ./bashcheck.sh
GNU bash, version 3.2.51(1)-release (x86_64-apple-darwin13)
Vulnerable to CVE-2014-6271 (original shellshock)
Vulnerable to CVE-2014-7169 (taviso bug)
Vulnerable to CVE-2014-7186 (redir_stack bug)
Test for CVE-2014-7187 not reliable without address sanitizer
Vulnerable to CVE-2014-6277 (lcamtuf bug #1) [no patch]
Not vulnerable to CVE-2014-6278 (lcamtuf bug #2)
Variable function parser still active, maybe vulnerable to unknown parser bugs
```
---
OS X bash Update 1.0 適用を行う homebrew-cask の formula を書くと

```ruby
class Bashupdate < Cask
  version '1.0'
  if MacOS.version == '10.9' then # Mavericks
    homepage 'http://support.apple.com/kb/DL1769'
    url 'http://support.apple.com/downloads/DL1769/en_US/BashUpdateMavericks.dmg'
    sha256 '0085fb5f7745a0256a5a38375868df2c30db75867adca26a4df89a0ab7c1553d'
    install 'BashUpdateMavericks.pkg'

  elsif MacOS.version == '10.8' then # Mountain Lion
    homepage 'http://support.apple.com/kb/DL1768'
    url 'http://support.apple.com/downloads/DL1768/en_US/BashUpdateMountainLion.dmg'
    sha256 '5be8bc72208c7b8fed8c68fb48364628c44728e3ec341decf2cc566248ccecf0'
    install 'BashUpdateMountainLion.pkg'

  elsif MacOS.version == '10.7' then # Lion
    homepage 'http://support.apple.com/kb/DL1767'
    url 'http://support.apple.com/downloads/DL1767/en_US/BashUpdateLion.dmg'
    sha256 '1e5940f3c994c49b2d8008d2bf918b34428c79adbefc6f73acd698c834201af6'
    install 'BashUpdateLion.pkg'
  end
end
```
Macのショートカットをすぐに確認できる神アプリ「CheatSheet」


##インストール
下記URLからダウンロードし、解凍して起動する。
http://www.cheatsheetapp.com/CheatSheet/


##使い方
commandを３秒ほど長押しするのみ。
ショートカット一覧がシュッと表示されます。
これで、ショートカットを使いこなせるようになっていきたいものです。
Tbpgr 作成スライドショー一覧

# Tbpgr 作成スライドショー一覧

|title|description|
|:--|:--|
|[deathma_slide server](http://tbpgr.github.io/deathma_slide)|CodeIQで出題しているデスマコロシアム問題のスライド|
|[defoker gem](http://tbpgr.github.io/defoker_slide)|20141002とか2014_hogeとか日付付きフォルダを頻繁に作成する方のための defoker gem 説明スライド |
|[orenono gem](http://tbpgr.github.io/orenono_slide)|Brainf*ck 派生言語を自在に作れる orenono gem 説明スライド|
|[qiita_scouter gem](http://tbpgr.github.io/qiita_scouter_slide)|知識の見える化、Qiitaの投稿戦闘力を測る qiita_scouter gem 説明スライド|
|[slide server](http://tbpgr.github.io/slide_server_slide)|Reveal.js を利用してMarkdownで作成したスライドショーを内部環境に公開する構成に関するスライド|
|[yeoman_revealjs server](http://tbpgr.github.io/yeoman_revealjs)|Reveal.js＋Yeoman構成のスライド作成のためのスライド|
peercastの配信情報取得

# ypから配信情報を取得してみる。

最初は `defstruct` というものを使ったんですが

>Structs are obsolete. Use records instead. See defrecord.

と[ドキュメント](http://clojuredocs.org/clojure.core/defstruct)にかかれていたので `defrecord` を使いました。

```clj:pcyp.clj
(ns pcyp-clj.core
  (:require [clojure.string :as str]))

(defrecord Info [name ip genre description kbps type comment])

;; get index.txt
(def txt (slurp "http://bayonet.ddo.jp/sp/index.txt"))

;; split
(def splited-txt (map #(str/split % #"<>") (str/split txt #"\n" )))

(def infos (for [x splited-txt]
  (Info. (first x) (get x 2) (get x 4) (get x 5) (get x 8) (get x 9) (get x 17))))

;; 結果確認
(first infos)

```

誰か何かアイデアください
Ruby | 部屋とYシャツと src_location と override と ネイティブメソッド と eval と singleton method と私

# Ruby | 部屋とYシャツと src_location と override と ネイティブメソッド と eval と singleton method と私

## 概要
src_location でメソッドのソースコードのファイル名と行番号を取得する際のサンプル集です。

## 詳細
下記の例を確認します

|メソッドの定義例|結果|
|:--|:--|
|String クラスを継承して shuffle メソッドを実装|継承先のファイル名、行数|
|String クラスを継承して sample メソッドを実装(define_method を利用)|継承先のファイル名、行数|
|String クラスを継承して upcase メソッドをオーバーライド|継承先のファイル名、行数|
|ネイティブなメソッド String#downcase メソッド|nil を取得（src_location の仕様）|
|eval でメソッドを実装|(eval), 1 という結果が返却される|
|シングルトンメソッドを実装|シングルトンメソッドの定義場所を取得|
|モジュールをinclude|includeしたモジュールの定義場所を取得|
|自作 gem tbpgr_utils の Array#to_table メソッド|gem のファイルパスと行数が正常に返却される|

### サンプルコード



~~~ruby:src_location.rb
require 'tbpgr_utils'

module Hogeable
  def hogeable
    "hogeable"
  end
end

class ShuffleString < String
  include Hogeable

  def shuffle
    chars.shuffle.join('')
  end

  define_method :sample do|chars.sample
  end

  # override
  def upcase
    downcase
  end

  eval 'def hoge;print "hoge";end'
end

ss = ShuffleString.new('hoge')
def ss.hage
  "hage"
end
10.times {print ss.shuffle, "\n"}
10.times {print ss.sample, "\n"}
puts ss.hoge
puts ss.hage

bulk_puts_eval binding, <<-EOS
ss.method(:shuffle).owner
ss.method(:shuffle).source_location
ss.method(:sample).owner
ss.method(:sample).source_location
ss.method(:upcase).owner
ss.method(:upcase).source_location
ss.method(:downcase).owner
ss.method(:downcase).source_location
ss.method(:hoge).owner
ss.method(:hoge).source_location
ss.method(:hage).owner
ss.method(:hage).source_location
ss.method(:hogeable).owner
ss.method(:hogeable).source_location
[[]].method(:to_table).owner
[[]].method(:to_table).source_location
EOS

__END__
下記はTbpgrUtils gemの機能
bulk_puts_eval
to_table

https://rubygems.org/gems/tbpgr_utils
https://github.com/tbpgr/tbpgr_utils
~~~

### 出力
~~~
$ ruby src_location.rb
ehgo
gohe
oghe
ehog
geoh
ehog
hoeg
ohge
geho
heog
o
h
h
g
o
h
h
g
e
o
hoge
hage
ss.method(:shuffle).owner              # => ShuffleString
ss.method(:shuffle).source_location    # => ["src_location.rb", 3]
ss.method(:sample).owner               # => ShuffleString
ss.method(:sample).source_location     # => ["src_location.rb", 7]
ss.method(:upcase).owner               # => ShuffleString
ss.method(:upcase).source_location     # => ["src_location.rb", 12]
ss.method(:downcase).owner             # => String
ss.method(:downcase).source_location   # => nil
ss.method(:hoge).owner                 # => ShuffleString
ss.method(:hoge).source_location       # => ["(eval)", 1]
ss.method(:hage).owner                 # => #<Class:#<ShuffleString:0x00000600b746d8>>
ss.method(:hage).source_location       # => ["src_location.rb", 20]
ss.method(:hogeable).owner             # => Hogeable
ss.method(:hogeable).source_location   # => ["src_location.rb", 4]
[[]].method(:to_table).owner           # => Array
[[]].method(:to_table).source_location # => ["/path/to/gems/tbpgr_utils-0.0.150/lib/open_classes/array/to_table.rb", 16]
~~~

## 参照
http://docs.ruby-lang.org/ja/2.1.0/method/Method/i/source_location.html
Sublime Text 2 キーバインド設定方法

# Sublime Text 2 キーバインド設定方法 + コマンドの探し方

## 設定方法

メニューの[Preferences]-[キーバンインド-ユーザ]からキーバインドを設定します。  
※Windows用(日本語化済み)なのでMacの場合は少しメニュー等が違うかもしれません。

以下のような感じで**押したいキー**と**実行したい処理**を追記します。
```
[
  //   {"keys":押したいキー, "command":実行したいコマンド},
  {"keys":["f5"], "command":"refresh_folder_list"},
  { "keys": ["ctrl+0"], "command": "reset_font_size" },
  { "keys": ["ctrl+k", "ctrl+k"], "command": "toggle_bookmark" }
]
```

## 実行したいコマンドの探し方

実行したいコマンドは以下の2つある

* Sublime Text に最初から組み込まれているコマンド
* Pluginとして自作されているコマンド

このうち**Sublime Text に最初から組み込まれているコマンド**は以下の方法で探すことが出来る

例) 大きくなってしまったフォントサイズをデフォルトのサイズに戻す方法を探す場合

1. **コンソールを開く**
[view]-[コンソール]
画面の下に入力枠が表示される  

2. **コンソールに以下を入力**
`sublime.log_commands(True) `
これを実行することで、コンソール部分に実行するコマンドが表示されるようになる  

3. **変更したいコマンド、メニュー等を実行**
フォントサイズを戻したいのでメニューの[Preferences]-[フォント]-[リセット]をマウスで選択  

4. **実行ログ出力**
コンソール部分に以下の実行コマンドログが出力される
`command: reset_font_size`  

5. **ログ出力終了**
実行コマンドログ出力を終了する為に以下のコマンドをコンソールで実行する
`sublime.log_commands(False)`  

6. **コマンドをキーバインドとして設定する**
```
{ "keys": ["ctrl+0"], "command": "reset_font_size" }
```
VirtualBox on Win7 に Windows 10 TPを入れるまで

# 諸注意
備忘録みたいなものなので、かなり雑に書いてます。
ですので「てめー適当なこといってんじゃねーぞ」という部分がありましたらどうぞお手元のマサカリをお投げください。

# 1. Windows 10 TechnicalPreviewを手に入れる。
Windows 10 TechnicalPreviewのイメージを手に入れましょう。
今回は64bit版をダウンロードしました。

http://windows.microsoft.com/ja-jp/windows/preview

# 2. VirtualBoxの用意
最近のVirtualBox事情を知らなかったのでちょっと詰まりました。

+ VirtualBox 4.3.16（最新版） → 作った仮想マシンが起動しない
+ VirtualBox 4.3.14 → 似たような報告多数
+ VirtualBox 4.3.12 → Yeah!!!

というわけで、こちらの旧版ダウンロードページから`VirtualBox 4.3.12`をダウンロードします。
https://www.virtualbox.org/wiki/Download_Old_Builds_4_3
# 3. 仮想マシン作成時の設定
バージョンは`Windows 8.1 (64 bit)`を選択しましょう。
`Others Windows`を選ぶとコケる報告多数。

※32bit版 Windows 10 TPの場合は32bit版を選んでね。

他についてはそのままいじらずにGoGoGo。

# 4. Windows 10 TPインストール
作った仮想マシン起動してWindows 10 TPのイメージ入れて、あとはいつも通りなWindowsインストーラーをポチポチするだけです。

※注意：Windows 8か8.1でも似たようなことがありましたが、ホストマシンのBIOSでIntel VTを有効にしていないと詰まります。
僕の環境では、どうもマザボが~~ゴミ~~安物のせいか、Intel-VT対応なCPUを載っけているにも関わらず無効/有効を切り替えるための項目がありませんでした。つらい。
（今回はThinkPad X220環境で行いました）

追記：2014/10/05 本件解決。
Intel-VTの無効/有効がない場合には「Execute Bit Support」という項目ががあれば、それを有効にすることでWindows 10 TPのインストールが問題なく行えます。

無事インストールは終わったでしょうか？
では皆様、めくるめくステキなWindows 10 TPライフを！

# 5. 調査中事項
GuestAdditions動かないよ問題。
みんな大好きsuperuserの先達様が、回避策を提示されていらっしゃいます。

>Installing VirtualBox Guest Additions on Windows 10?
>[http://superuser.com/questions/819757/installing-virtualbox-guest-additions-on-windows-10](http://superuser.com/questions/819757/installing-virtualbox-guest-additions-on-windows-10)

リンク先にある通り、VBoxWindowsAdditions-amd64.exeを互換モード：Windows8にして起動すれば「とりあえずは」通りましたが、手元で様々な問題が起きています。おとなしく対応待ったほうが良さ気かも。しばらく動向を注視します。
[Unity][C#]LitJsonでint型からlong型への変換でエラーになるときの対処法

## 前提

UnityでJsonを扱うのにLitJsonを使っています。

## エラー

int型の数値を、long型へ変換する際にLitJsonはエラーになるようです。
実際にやってるのは以下のようなコードです。

```test.cs
class Player : JsonData
{
    public int    player_id;
    public string player_name;
    public long   player_exp;
}
string json   = "{\"player_id\":1,\"player_name\":\"tnnsst35\",\"player_exp\":100}";
// JsonException: Can't assign value '100' (type System.Int32) to type System.Int64
Player player = JsonMapper.ToObject<Player>(json);
Debug.Log(player.player_name);
```

player_expの値はint型で扱える100ですが、player_expはlong型でしか扱えない値になる場合があるため、long型に変換する必要があります。
コードを実行してみると、LitJsonのJsonMapper.ToObjectで「JsonException: Can't assign value '100' (type System.Int32) to type System.Int64（訳：int型の値'100'をlong型に代入できないよ）」というエラーになってしまいます。

## 対処法

LitJsonの仕様（バグ？）らしいので、LitJsonを直接修正してしまいます。
修正するファイルは「LitJson/JsonMapper.cs」です。

```JsonMapper.cs
// 私の手元にあるJsonMapper.csでは次の行は323行目です。
if (reader.Token == JsonToken.Double ||
    reader.Token == JsonToken.Int ||
    reader.Token == JsonToken.Long ||
    reader.Token == JsonToken.String ||
    reader.Token == JsonToken.Boolean) {

    Type json_type = reader.Value.GetType ();

    // 以下の4行を追加
    if (inst_type == typeof(long) &&
        json_type == typeof(int)) {
        json_type = typeof(long);
    }

    if (inst_type.IsAssignableFrom (json_type))
        return reader.Value;

    // If there's a custom importer that fits, use it
// 以下省略
```

4行追加しています。

inst_typeは変換後の型、json_typeは変換前の型ですね。
変換後はlong型で、変換前はint型であるならば、変換前をlong型として扱うようにするという感じです。

今のところ他への影響もなく快適に動いています。
RailsでHerokuでCDNで幸せになる

最近、ユビレジでやったことを書いておこう。

ユビレジではRailsを使っていて、Herokuを使っていて、CloudFrontを使っている。CDNとうまくやるためにAssetSyncを使っていて、`assets:precompile`されたCSSやJSや画像は自動でS3に転送され、なんかの設定をしておいた結果としてS3からCloudFront経由でダウンロードされるようになっている。

* [Rails](http://www.rubyonrails.org)
* [rumblelabs/asset_sync](https://github.com/rumblelabs/asset_sync)

PDFとか動画とかどうしたらいいかなーという話と、slugsizeがでかくてつらい問題を、それぞれ解決を見たので、その話。

# PDFをCDNからダウンロードさせる

PDFとか動画のファイルとか、サイズが大きいやつは`/public`に入れない方が良い。`/public`以下にあるファイルはRailsを通してHerokuからダウンロードされるが、これはあまり良い方法ではない。

* ファイルをただ転送している間、Railsのワーカプロセスが一個独占される
* ファイルサイズが大きいと、ダウンロードに30秒以上かかってしまい、Herokuにタイムアウトさせられる → ダウンロードが終わらない
* HerokuはUS EastのEC2で動いているので、ネットワーク的に遠くてダウンロードが遅い
* `/public`以下はgitで管理しているので、gitリポジトリがなんか予想に反して大きい

こういった感じの問題に対応するためにCDNというものが発明されて、弊社ではCloudFrontを使っているのだった。

さて、問題はS3にファイルを転送するタイミングで、「どうせ頻繁には更新しないんだから、手で転送すれば良いじゃん」というソリューションがある。がまあどう考えてもいまいちなので、Webアプリケーションのデプロイのタイミングで自動でS3にアップロードする方法が欲しいのだった。

* S3に転送する方法は？s3cmd？
* S3の認証とかどうするのか……

## 解決方法

普通にPDFもassets pipelineに突っ込めば良かった。方法。

1. app/assets/pdfとかディレクトリを作って、PDFをそこにコピーする
2. `config/application.rb`に次のように書く

```rb
config.assets.paths << "#{Rails.root}/app/assets/pdfs"
config.assets.precompile += (Rails.root + "app/assets/pdfs").children.map(&:to_s)
```

`config.assets.paths`に足して、`config.assets.precompile`に足せば良い。

これで、画像と同様にデプロイ時にCDNにアップロードしてくれる。Viewから参照するときは、ちゃんと`asset_url`とか使うこと。

あっそういえば、gitリポジトリのサイズが肥大化する問題は解決していないのだった。まあ、こっちはリポジトリに全部入ってる嬉しさとのトレードオフなので……

# slug sizeを抑える

さて、ここでよく考えてみると、Herokuに`app/assets`や`public/assets`以下のファイルを保存しておく必要がないことに気づく。これらのファイルはCDNに転送されていてもう使われることはない。一方で、

* アプリケーションのスタートアップに時間がかかるなどの悪影響がある
* 画像ファイルを追加など繰り返すと最終的には`Compiled slug size is too large`とか言われてでプロイできなくなる

などの問題がある。これを消そう。

## .slugignoreは使っては行けない

.slugignoreを使うと、`assets:precompile`とかがうまくいかなくなる。Herokuにでプロイするときのメッセージを良く読むと、一番最初に

```
-----> Deleting 2 files matching .slugignore patterns.
```

とある。ので、.slugignoreに`app/assets`とか書く方法は失敗する。

## Rakefileのタスクを書いて消す

* http://stackoverflow.com/questions/20059991/can-i-remove-app-assets-on-heroku-after-asset-compilation-to-reduce-slug-size?rq=1

などに書いてあることをやる。

Rakefileを使って、`assets:precompile`後に`app/assets`と`public/assets`のファイルを消す。注意事項としては、

* manifest.jsonは消さないようにする
* 上で書いた`application.rb`を書き換えて、`app/assets/pdfs`が存在しない場合にアクセスしないようにする

などがある。

ユビレジでは、この結果としてslugsizeが280MBから137MBまで激減しました。
grunt-contrib-handlebars導入の際の注意

jsテンプレートエンジンのテンプレートを記述するとき下みたいにhtmlに記述するけど、ページにいくつもテンプレートを記述する必要があったり、ページ共通のビューとかあったりすると管理がめんどかったり、ソースが汚くなるので解決策としてプリコンパイラを導入した。

```lang:html
<script id="template" type="text/x-handlebars-template">
  <h1>{{title}}</h1>
  <p>{{hogehoge}}</p>
</script>
```

参考：[JSTとか、プリコンパイラとか、プリコンパイルとか](http://qiita.com/mamoida/items/3bfd40de062a3f601939)


テンプレートエンジンのお気に入りはhandlebars.jsなのでgrunt-conrib-handlebarsを導入したけど、なんか動かない。。。
どうやらhandlebars.jsの最新である2.0（2014/10月現在）に対応していないらしい。。。

https://github.com/gruntjs/grunt-contrib-handlebars/issues/100

上のisuueにもあるけどgruntプラグイン内部にあるhandlebarsが1.3なので、
こっちが使うhandlebarsも1.3までバージョンを落としたら動いた。

とりあえず動作的には旧バージョンでも困らないのでこのまま行くけどなんか釈然としない気持ち。

###追記
v0.9.0でhandlebars2.0に対応したもよう。
[https://github.com/gruntjs/grunt-contrib-handlebars](https://github.com/gruntjs/grunt-contrib-handlebars)