OmniAICreator/Qiita-1.07M huggingface dataset:
java 0埋め メモ


## まとめ
- Integerは「%02d」で可能。表現しきれない場合は無視
- Double型の小数点以下の場合は「%.2f」で可能。表現しきれない場合は四捨五入され、無理やり表現

## Integer型などでの0埋め

~~~Hoge.java
package hoge;

public class Hoge {
	public static void main(String... args) {
		Integer a = new Integer(1);
		Integer b = new Integer(12);
		Integer c = new Integer(123);
		Integer d = new Integer(1234);
		System.out.println(String.format("%03d", a));
		System.out.println(String.format("%03d", b));
		System.out.println(String.format("%03d", c));
		System.out.println(String.format("%03d", d));
	}
}
~~~

### 実行結果

~~~
package hoge;

public class Main {
	public static void main(String... args) {
		Integer a = new Integer(1);
		Integer b = new Integer(12);
		Integer c = new Integer(123);
		Integer d = new Integer(1234);
		System.out.println(String.format("%03d", a));
		System.out.println(String.format("%03d", b));
		System.out.println(String.format("%03d", c));
		System.out.println(String.format("%03d", d));
	}
}
~~~

## Double型などで小数点以下の0埋め

~~~Hoge.java
package hoge;

public class Hoge {
	public static void main(String... args) {
		Double a = new Double(1);
		Double b = new Double(0.1);
		Double c = new Double(0.12);
		Double d = new Double(12);
		Double e = new Double(12.3);
		Double f = new Double(12.45);
		Double g = new Double(12.456);
		Double h = new Double(12.4547);
		System.out.println(String.format("%.2f", a));
		System.out.println(String.format("%.2f", b));
		System.out.println(String.format("%.2f", c));
		System.out.println(String.format("%.2f", d));
		System.out.println(String.format("%.2f", e));
		System.out.println(String.format("%.2f", f));
		System.out.println(String.format("%.2f", g));
		System.out.println(String.format("%.2f", h));
	}
}
~~~

### 実行結果

注意点：「12.4547」 => 「12.45」として表現されている

~~~
1.00
0.10
0.12
12.00
12.30
12.45
12.46
12.45
~~~
Nginx に CORS 用の設定をする。

Nginx に CORS 用の設定をする。普通にコレで行けるね。

```
server {
    listen 80;
    server_name hoge.example.com;
    location / {
       add_header Access-Control-Allow-Origin *;
       add_header Access-Control-Allow-Methods "POST, GET, OPTIONS";
       add_header Access-Control-Allow-Headers "Origin, Authorization, Accept";
       add_header Access-Control-Allow-Credentials true;
       proxy_pass http://localhost:8888;
    }
}
```
【 int read(byte[]) 】 InputStreamの最適なバッファサイズ　

Java　の　InputStream　には御存知の通り以下のメソッドが存在します。
int read(byte[] buff)
int read(byte[] buff, int offset, int length)

InputStream　は　たくさんの　Input系ストリーム　で継承されていますので、同じことが言えるのですが、
これらの　buff　に指定する　バッファ　のサイズに悩んだことはありませんか？

私自身は　BufferedInputStream　のディフォルトである　８１９２バイト　の半分である　４０９６バイト　を指定してました。
（連続したメモリ確保も大変だろうと思い・・・）

実際に図ってみるのもちょっとめんどくさいですよね・・・
そこで、以下のサイトで検証がされていましたので紹介します。

http://chat-messenger.net/blog-entry-72.html

上記サイトの検証では　１メガ　が最適なバッファサイズのようです。
上記サイトのでは　１メガ　以上のバッファサイズにしてもほとんど速度向上は見られないようです。
iPhone6,iPhone6+の画面解像度


Xcode6 のシミュレーターで実施

```objectivec
NSLog(@"width=%f",self.view.bounds.size.width);
NSLog(@"height=%f",self.view.bounds.size.height);

iPhone6+
width=414.000000
height=736.000000

iPhone6
width=375.000000
height=667.000000

```

個別対応が必用なのかな！
Xcode6.1を入れたらgitが息しなくなった話

https://developer.apple.com/swift/blog/?id=14
↑にあるXcodeを入れて、gitコマンド打ったらこんな↓メッセージががが

```
xcrun: error: invalid active developer path (/Applications/Xcode.app/Contents/Developer), missing xcrun at: /Applications/Xcode.app/Contents/Developer/usr/bin/xcrun
```

なのでこの↓コマンド打って

```
$ sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer/
$ git
```

こんな↓メッセージが

```
You have not agreed to the Xcode license agreements. You must agree to both license agreements below in order to use Xcode.
Hit the Enter key to view the license agreements at '/Applications/Xcode.app/Contents/Resources/English.lproj/License.rtf'
IMPORTANT: BY USING THIS SOFTWARE, YOU ARE AGREEING TO BE BOUND BY THE FOLLOWING APPLE TERMS:
〜中略〜
By typing 'agree' you are agreeing to the terms of the software license agreements. Type 'print' to print them or anything else to cancel, [agree, print, cancel]
```

agree
って打つとgitが息を吹き返します。
焦った…
[JAWS-UG CLI] IAM:#6 仮想MFAデバイスの削除

JAWS-UG CLI #3 (IAM)で話題になったMFAに関する追加ハンズオンです。

AWS CLIを使ってMFAを再設定する。 http://dev.classmethod.jp/cloud/aws/aws-cli-mfa-deactivate/ を参考にしました。


前提条件
========

* IAMへのフルアクセス権限
* 利用している仮想MFAソフトウェア(Google Authenticatorなど)の用意 (必須ではないですが、事後処理としてエントリの削除をしておきましょう)



1. 仮想MFAデバイスの一覧
=====================

最初に、現在IAMに登録されている仮想MFAデバイスの一覧を確認します。

```bash:コマンド:
   $ aws iam list-virtual-mfa-devices
```

```json:結果:
   {
       "VirtualMFADevices": [
           {
               "SerialNumber": "arn:aws:iam::XXXXXXXXXXXX:mfa/testmfa", 
               "EnableDate": "2014-09-09T23:55:25Z", 
               "User": {
                   "UserName": "taro", 
                   "Path": "/", 
                   "CreateDate": "2014-07-14T01:44:28Z", 
                   "UserId": "AIDAI4FHXXXXXXXXXXXXX", 
                   "Arn": "arn:aws:iam::XXXXXXXXXXXX:user/taro"
               }
           }
       ]
   }
```

taroユーザの仮想MFAデバイスが登録されていることがわかりました。


2. 仮想MFAデバイスとIAMユーザの関連付け削除
========================================

仮想MFAデバイスとIAMユーザの関連付けを削除します。
これにより、taroユーザがAWSマネジメントコンソールにログインするときにMFA認証を求められなくなります。

2.1. 対象ユーザの決定
----------------

削除する仮想MFAデバイスを利用しているユーザを指定します。

```bash:コマンド:
   $ IAM_USER_NAME='taro'
```


2.2. シリアル番号の取得
------------------

そのユーザが利用している仮想MFAデバイスのシリアル番号を取得します。

```bash:コマンド:
   $ MFA_SERIAL=`aws iam list-virtual-mfa-devices | jq -r --arg user_name ${IAM_USER_NAME} '.VirtualMFADevices[] | select(.User.UserName == $user_name) | .SerialNumber'` && echo ${MFA_SERIAL}
```

```text:結果:
   arn:aws:iam::XXXXXXXXXXXX:mfa/testmfa
```


2.3. 関連付けの削除
--------------

taroユーザと仮想MFAデバイスの関連付けを削除します。

```bash:コマンド:
   $ aws iam deactivate-mfa-device --user-name ${IAM_USER_NAME} --serial-number ${MFA_SERIAL}
```

```text:結果:
   (戻り値なし)
```


3. 仮想MFAデバイスの一覧
=====================

taroユーザが利用していた仮想MFAデバイスが、未アサイン状態になっていることを確認します。

```bash:コマンド:
   $ aws iam list-virtual-mfa-devices
```

```json:結果:
   {
       "VirtualMFADevices": [
           {
               "SerialNumber": "arn:aws:iam::XXXXXXXXXXXX:mfa/testmfa"
           }
       ]
   }
```


4. 仮想MFAデバイスの削除
=====================

仮想MFAデバイスを削除します。

```bash:コマンド:
   $ aws iam delete-virtual-mfa-device --serial-number ${MFA_SERIAL}
```

```text:結果:
   (戻り値なし)
```


5. AWSマネジメントコンソールへのログイン確認
=========================================

AWSマネジメントコンソールへログインするときに、パスワードだけでログインできることを確認しましょう。


6. 仮想MFAソフトウェアからの削除
=========================================

仮想MFAソフトウェア上から該当するエントリを削除しておきましょう。
Mac Book Air like Linux（リナックスのように）


個人的な備忘録です。悪しからず。

## lsusbが使いたい・・・
- 次のようにタイプ

```utubesi
system_profiler SPUSBDataType
```

- パスに入れて次回から楽チン

```utubesi
$alias lsusb='system_profiler SPUSBDataType'
```
Macで3本指ジェスチャーが効かなくなったとき


最近僕のPCではちょいちょい3本指ジェスチャーが効かなくなるのですが、
そんなとき再起動するのではなく、ターミナル上で

```
killall Dock
```

とすることで解決できる場合があります。
CakePHP 3.0 新機能Cellを試してみた

# CakePHP 3.0 新機能Cellを試してみた

## 前提条件
* CakePHP 3.0(beta1)を利用(2014/09/10)

## Cellとは

・Controller付きのElementのようなもの？  
　既存のCakePHPだとホームページのサイドバーに新着情報を表示しようと思うとAppControllerのbeforeFiltter辺りにロジックを追加して毎回実行できる状態にするかrequestActionを使う必要があった。  
　※CellはCakePHP2系までのrequestActionの強化版みたいなもの
　
## 準備

・Cellの作成はbakeから行うことが出来る。  

```
// HogeがCell名
php bin/cake.php bake cell Hoge
```

コマンドを実行することで以下の3ファイルが作成される  
・src/Template/Cell/Hoge/display.ctp // Viewファイル  
・src/View/Cell/HogeCell.php // CellのControllerのようなもの  
・Test/TestCase/View/Cell/HogeCellTest.php // テスト  

## 使い方

・elementと同じような使い方である。
　適当なViewファイルでcellを実行するだけ。

```php:
<?= $this->cell("Hoge"); ?>
```
※これを実行すると**HogeCell.php**の**displayメソッド**が実行されて**display.ctp**がレンダリングされる

## その他

・Cellの中に複数のアクションを作ることが出来る

```php:
// アクションを追加
class HogeCell extends Cell {
    function display() {
        // デフォルトのアクション
    }
    
    function display2() {
        // 追加アクション
    }
}

// ctpからの実行
<?= $this->cell("Hoge::display2"); ?>
```


・Controllerからも実行することが出来る

```php
use Cake\View\CellTrait;  // 追加
class UsersController extends AppController {
  use CellTrait; // 追加
  
  function index() {
    // cellの実行(動作はViewで実行した場合と同じ)
    echo $this->cell('Hoge');
  }
}
```
VMFusionを使用しているWindowsからMacのMAMPに設定したVirtualHostにアクセスする方法


##はじめに
初投稿となります、よろしくお願いします。
私がMacで開発を行っている中で、どうしてもWindowsで確認する必要があったため、色々と調べたことを備忘録として書いています。
探せば情報はそれなりに出てくるのですが、色々と情報をつなぎあわせて試行錯誤していたので、どなたかのお役に立てればと思っています。

##MacのMAMPでVirualHostを設定
httpd.confを編集します。

	#Virtual hosts
	# Include /Applications/MAMP/conf/apache/extra/httpd-vhosts.conf

	# ↓ 「#」を外す

	#Virtual hosts
	Include /Applications/MAMP/conf/apache/extra/httpd-vhosts.conf
	
	#Portの追加
	Listen 88 #既存のPort
	Listen 8000 #VMからアクセスするPort

httpd-vhosts.confを編集します。

	# NameVirtualHostを追加
	NameVirtualHost *:88
	NameVirtualHost *:8000
	
	#VirtualHostDirectiveの追加
	<VirtualHost *:88>
		DocumentRoot "/Applications/MAMP/htdocs/example"
		ServerName example.com
	</VirtualHost>
	<VirtualHost *:8000>
		DocumentRoot "/Applications/MAMP/htdocs/example"
		ServerName example.com
	</VirtualHost>

hostsを編集します。
hostsをTerminalで編集するのが面倒だったらhosterを使ってもいいかも。。
hostsの編集を行うにはターミナルから行う必要があります。

```bash
$ sudo vi /etc/hosts
```

新しい行に下記を追加

```
127.0.0.1 example.com
```

これでMac側の設定は完了です。
	

##VMwareFusionの設定
ネットワークアダプタの設定をNATモードに変更します。
コマンドプロンプトを開いて、ipconfigコマンドで自分のIPv4アドレスを確認しておきます。

hostsファイルを編集します。
ファイルの場所は、``C:\Windows\system32\drivers\etc\hosts``となります。
ファイルの最後に、

```hosts
127.0.0.1 example.com
```

を追加します。
IPの部分は先ほど調べたIPを記載して下さい。

これで、すべての設定が終わりました。
Fusion側からブラウザを開いて、
example.com:88
とURLを入力すると、MAMPで設定したVirtualHostに接続されます。
macでLISTENとして使用しているポートを調べる方法

ローカルマシンのhttpdが立ち上がらない！とかよくありますよね。
そういう時によく有る原因の一つとして、ポートが既に掴まれている事が有ると思います。
ポートを掴んでるプロセスを特定してkillする事で問題が解消したりします。

下記コマンドでlistenポートとプロセス番号を特定します。

```bash
$ sudo lsof -i -P | grep "LISTEN"
mysqld     1011       yokozawa   13u  IPv6 0x9c0fed506xxxxxxx      0t0  TCP *:3306 (LISTEN)
ruby       1346       yokozawa   15u  IPv4 0x9c0fed507xxxxxxx      0t0  TCP *:3000 (LISTEN)
httpd      1496           _www    4u  IPv6 0x9c0fed506xxxxxxx      0t0  TCP *:80 (LISTEN)
httpd      1500           _www    4u  IPv6 0x9c0fed506xxxxxxx      0t0  TCP *:80 (LISTEN)
```

第二引数がプロセスIDなので解放したいポートで使用されているプロセスを片っ端からkillすると幸せになれます。

例えば、httpdが既に掴まれていて起動しないという場合でしたら

```bash
kill -9 1496
kill -9 1500

httpd restart
```

などとやる感じです。
Jenkins で「警告: SubversionサーバのクロックとHudsonのクロックがずれているようです。」と怒られた時の対処方法

日本語記事が意外に見つかりにくかったので備忘録的に投稿。

解決方法：SVNリポジトリURLの末尾に「@HEAD」を追記する。
http://svn.yourserver.com/svn/project/trunk@HEAD
cakephpのFileBinderでアップロード後のファイル名を指定する

■FileBinder参考
http://endoyuta.com/2013/05/13/cakephp-2-3-%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89-filebinder%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3/

## FileBinderでアップロード後のファイル名を指定する
cakephpでのファイルのアップロードに、
FileBinderを使っているのだけれども、
日本語とか記号入りとか空白入りとかのファイル名のままアップロードされると困る。

```php:RingのbindUpの前に
$this->request->data['User']['icon']['name'] = 'icon.png';
$this->Ring->bindUp('User');
```

これでicon.pngというファイル名になってサーバに保存される。
pythonの変数展開、format

# 背景

変数展開という呼び方が正しいのか、文字列変数の中に数値などを埋め込む方法について。

rubyだと

```rb
name = "World"
month = 9
day = 9

print "Hellow #{name}!, 今日は#{month}/#{day}です"
```
見たいに書くやつです。

調べた結果、

```py
name = "World"
month = 9
day = 9

print u"Hellow {name}!, 今日は{month}/{day}です".format(**locals())

```

と書くらしいです。``.format(**locals())``はすぐめんどくさくなるだろうし、連続して使うと
結構見た目がやかましくなりますので

```py
f = lambda x, l=locals(): x.format(**l)
print f(u"Hellow {name}!, 今日は{month}/{day}です")
```
こんなことをするでしょうか？

# 方法

Jinjaを使って展開してしまおう、という案。

```pycon

>>> from jinja2 import Template
>>> fj = lambda str, dict=locals(): Template(str).render(dict)
>>> name = "World"
>>> month = 9
>>> day = 9
>>> print fj(u"Hellow {{name}}!, 今日は{{month}}/{{day}}です。")
Hellow World!, 今日は9/9です。
>>> print fj(u"明日は{{month}}/{{day+1}}です。")
明日は9/10です。
```

こんな感じです。
Jinjaの使い方をあんまり知りませんが、ちょっと計算できたりして、これはこれで良いかも。

# 参考
http://stackoverflow.com/questions/19549980/short-form-for-string-format-locals
日本語対応の世界都市名データベースを作成する


世界の都市名(カタカナ)から、その都市名(英語)と国名を返すプログラムが必要になったので、都市名データベースを用意します。
英語表記のデータベースは有償含めいくつかありましたが、日本語表記のものはあまりないのかなという印象です。

## 元になるデータをダウンロード
- http://gpscycling.net/fland/latlon/index.htm

リンク先の「日本世界地名データ」をダウンロードします。
今回はこの中の「世界都市フォルダ」を使いますが、日本国内の市町村名などのファイルも含まれています。

※ ライセンスが明記されていないので注意が必要です

## 文字コードをUTF8に変換(どっちでもいいです)
先ほどダウンロードしたcsvファイルの文字コードを、nkfを使ってSJISからUTF8に変換します。

- http://sourceforge.jp/projects/nkf/

```bash
$ brew install nkf
$ cd flapna12
$ cd 世界都市フォルダ
$ nkf -Sw --overwrite **/*.csv
```
nkfをbrewでインストールして、さきほどダウンロードしたフォルダに移動、フォルダ内csvファイルをUTF8に一括変換。

## csvファイルを編集
このcsvファイルには、**ロンドンがイギリスとカナダ両方に含まれています**。
今回は日本語の都市名から一意に国名を返したいので、Canada.csvからロンドンをコメントアウトします。

```csv
#ロンドン,London,42.59,-81.14,都市,4,
```

## 多次元ハッシュに格納し保存
国ごとに、

- 国名(英語)
- 国名(日本語)
- 都市名(英語)
- 都市名(日本語)

を多次元ハッシュとして格納し、cities.rbにハッシュを、cities.jsにjsonを保存するRubyコードを書きました。

```ruby:convert.rb
require 'find'
require 'csv'
require "json"

d = Hash::new

Find.find('./') {|f|
  if /.*?\.csv/ =~ f

    CSV.foreach(f) do |city|
      if $. == 1
        next
      elsif $. == 2
        city[0] =~ /<TITLE>(.*?)\((.*?)\)<\/TITLE>/
        $country_ja = $1
        $country_en = $2

        d[$country_en] = Hash::new
        d[$country_en][:ja] = $country_ja
        d[$country_en][:city] = Hash::new
      else
        d[$country_en][:city][city[1]] = city[0]
      end
    end

  end
}

d.each_key do |key|
  puts "#{d[key][:ja]}(#{d[key][:city].length})"
end

File.write("cities.rb", d)
File.write("cities.js", d.to_json)
```
現在のディレクトリが`世界都市フォルダ`であることを確認し、実行します。

```bash
ruby convert.rb
```

## 結果
```ruby:cities.rb
{
  "Afghanistan" => {
    :ja=>"アフガニスタン",
    :city=>{
      "Kabul" => "カブール",
      "Qandahar" => "カンダハール",
      "Herat" => "ヘラート",
      "Qonduz" => "コンドゥーズ",
      "Baghlan" => "バグラーン"
    }
  },
  "Bahrain" => {
    :ja => "バーレーン",
    .
    .
    .
```
このような形式のハッシュができました。

```
国数：200
都市数：1778
```
また、国数・都市数共に十分実用的な数はあるのかなと思います。(日本は東京しかありませんけど)

他にもGoogle Map Apiから都市名を引っ張ってくるなんて方法もありかと思います。
java8が何気に便利になってる


# java8使ってますか？

2014年の春にjava8がリリースされました。
お仕事では主にjavaを使っていますが、やはりお年を召した言語なので若干設計が古臭く感じてきました。なのでプライベートでは最近scalaやHaskellなど、書いてて気持ちのいい言語に浮気をするようになりましたが、やはり業務でメインに使う言語ならばチェックしないわけにはいかないだろうと思いたち、いまさらながら触って見ることにしました。

[ラムダ式というもの](http://qiita.com/pepepe/private/3ebfbe7c82e3bd1615d3)
[interfaceのデフォルト実装](http://qiita.com/pepepe/private/ba5f477fbe150fc64f30)
[メソッド参照](http://qiita.com/pepepe/private/3d810e1bbed25768caa0)
[コレクションを強化したStream](http://qiita.com/pepepe/items/337134b4fccbfee83a2d)
~~もうちょっと続く~~ Java8人気ないんやね。。。

# もうjavaでいいんじゃないかな。

java1.4からjava5に変わった時、文法に大きく変更が加えられ、拡張for文やアノテーションが生まれました。特にアノテーションは様々な用途で広く使われるようになり、できることが一気に広がりました。
5->6、6->7は、うん、まぁ、いいや。
java8ではラムダ式やコレクションに対する強化など、関数的なものが多く取り入れられる用になりました。それにより今まで周りくどく書かなきゃいけなかった事が、ずいぶんと簡素に書けるように改善されました。

# というわけで

たまにはJavaのことも思い出してあげてください。
interfaceのデフォルト実装


# Abstractなんちゃらはオワコン

rubyやscalaなどではお馴染みのtrait。多重継承をさせずに多重継承のような事を実現する仕組みです。
このクラスにはアレとコレとソレを継承させたいといった時、今までのjavaなら全部を順番に継承するか、もしくはinterfaceとして実装をする他ありませんでした。

```java:areKoreSore.java
// 継承する
class Are { }
class Kore extends Are { }
class Sore extends Kore { }

class Oresama extends Sore { }

// 実装する
interface Are { }
interface Kore { }
interface Sore { }

class Oresama implements Are, Sore, Kore { }
```

しかしこの方法は問題だらけです。
ます継承のパターンでは、俺様が他のクラスを継承するのはよいとしても、他のクラス同士がis-aの関係になるとは限りません。あくまでもアレはアレ、ソレはソレです。
一方実装のパターンではそれぞれのinterfaceの独立性は保たれますが、いかんせん俺様ですべてのメソッドを実装しなくてはならなくなります。その上、似たようなクラス「Anatasama」ができた時、同じような実装コードを書かなければなりません。それを回避するために標準ライブラリなどでは「Abstractなんちゃら」っていうinterfaceのデフォルトを実装しただけの抽象クラスがたんまり用意されてたりしますが、俺様がそれを継承してしまうと、他のクラスを継承できなくなり、そんなことで貴重な継承ツリーを消費したくありません。

せめて、interfaceにメソッドの実装がかけたらどんなに楽か。。。
ってのがjava8では可能になりました。

```java:default.java
interface Are {
  default void doAre() { ... };
}
interface Kore {
  default void doKore() { ... };
}
interface Sore {
  default void doSore() { ... };
}

class Oresama implements Are, Kore, Sore { }
```

interface内でdefaultキーワードをつけると実装を持たせる事ができます。
その名の通り、あくまでデフォルトの実装なので、当然オーバーライドすることもできます。
このようにして作った俺様は当然アレやコレの変数に代入することもできます。

```java:dainyu.java
Are are = new Oresama;
```

interfaceに実装を与える事ができるようになったことで、なかり柔軟なクラス設計が可能となりました。
ラムダ式というもの


# 無名クラスがかなり書きやすくなりました
java7までの無名クラスはひたすら残念でした。swingなどのGUIライブラリにはよくありがちで、イベントハンドラを無名クラスで登録したりしますが、何ぶん意味のない記述が多すぎました。
ここに挨拶をするだけのインターフェイスとそれを使うメソッドがあります。

```java:greet.java
interface Greeter {
    String hello();
}
void greet(Greeter g) {
  System.out.println(g.hello());
}
```

java7でこのgreetを使おうとするとこんな感じになります。

```java:java7.java
greet(new Greeter() {
  @Override
  public String hello() {
    return "hello java7"
  }
});
```

うんざりです。本当に価値があるのは`return "hello java7"`だけです。これだけを書きたいのに６行も書かなくちゃいけません。けど、これがjava8になるとこうなります。

```java:java8.java
greet(() -> {return "hello java8";});
```

これだけです。スッキリしすぎています。クラス自体は見えなくなり、処理が際立って見えるようになりました。こういう無名の処理をラムダ式と言ったりします。
ラムダ式の書式は以下の通りです。

```java:mumei.java
(arg1, arg2 ...) -> {処理1; 処理2; ... }
```

引数リストを受け取って、右の本体で処理します。引数に対する型宣言は不要で、インターフェイスの定義通りに引数が渡されてきます。先の例のように引数が不要な場合、左っ側は`()`だけです。

かなり簡単に書けるように、また見やすくなった無名クラスですが、これを使うにはinterfaceに定義されているメソッドが１つだけの場合という制限があります。
しかしまぁ、こういった用途に使うinterfaceは大抵一つの仕事しかさせない（＝メソッドは一つで十分）ので制限だと感じる事はまずないと思います。
もしメソッドがどうしても２つ必要な設計になるとしたら、それはクラスに対して責任過多になっちゃってる可能性があるので、interfaceを分離する事を検討したほうが良いかもしれません。
メソッド参照


# メソッドを入れておく変数

関数型言語をやっている人にとっては同じみの関数オブジェクト的なものが取り入れられました。Cな人は関数ポインタ、C#な人はデリゲートをイメージしましょう。
以下はprintlnを持ち運ぶ例です。

```java:methodRef.java
Consumer<String> s = System.out::println;
```

関数はConsumer<T>型に入れて持ち運ぶ事ができます。取得する方法は`オブジェクト::取得したいメソッド`です。
今まで関数を持ち運ぼうと思えば無名クラスを定義するのが一般的でした。しかし既存のメソッドを（Methodクラス以外の方法で）何らかの変数に入れて持ち運ぼうと思うと、なんらかの無名クラスでくるんでやる必要があります。

```java:printlnBringer.java
interface Println {
  void print(String s);
}

Println p = new Println () {
  @override
  public void print(String s) {
    System.out.println(s);
  }
}
```

しかし、関数型が取り入れられたことにより簡潔に持ち運ぶことができるようになりました。持ち運んだメソッドはもちろん直接使うことも関数を引数に取るメソッドへの引数として使用できます。

```java:使う.java
s.accept("pepepe");
```
Google Speech APIを使ってMacで音声認識

Macで音声認識をしてみた。
音声ファイル(wav)を文字列として認識させる。

# Google Speech API
音声認識には、[Speech API](https://www.google.com/intl/ja/chrome/demos/speech.html)を利用する。
リンク先で試せるが、音声を認識して文字列に変換してくれる。Chromeの音声検索とかに利用されてるやつだと思う。

日本のgoogleアカウントだと、デフォルトの状態ではAPIを利用でいないようなので、Chromium Projects?にメンバー登録しておく。そうすると、Google Developers Consoleで、Speech APIが利用できるようなるので、API keyなどを取得をしておく。詳しくは以下。
http://www.chromium.org/developers/how-tos/api-keys

ちなみに、リクエストの上限が50回/日 だし、ちゃんとしたドキュメントが（おそらく）無いし、あまり使いやすい感じではない。。。

# 音声ファイルを用意
自分の声を録音するために、少しだけ準備。Homebrewで[SoX](http://arielvb.readthedocs.org/en/latest/docs/commandline/sox.html)をインストール。

```
$ brew install sox
```

これで、recコマンドで録音ができるようになる。コマンドの使い方などのドキュメントは[こちら](http://sox.sourceforge.net/sox.html)。

```
$ rec --encoding signed-integer --bits 16 --channels 1 --rate 16000 test.wav
```

上記を実行すると録音開始されるので、「テスト」とでも言って保存。

# Rubyで認識用のコードを書く
あとは、Speech APIに音声ファイルを認識させる。

`https://www.google.com/speech-api/v2/recognize`に対して、POSTでリクエストを送信すると、音声を認識した結果がレスポンスで帰ってくる。

以下が書いたコード。

```rb:voice_recognition.rb
require 'net/http'
require 'JSON'

uri = URI('https://www.google.com/speech-api/v2/recognize' \
  '?output=json&lang=ja&key=AIzaSyAD_5b6--4Jz0CXD5_sRoPa9ZjgJsYNK-M')

https = Net::HTTP.new(uri.hostname, uri.port)
https.use_ssl = true

res = https.start do |h|
  req = Net::HTTP::Post.new(uri)
  req.body = File.read(ARGV[0])
  req.content_type = "audio/l16; rate=16000"
  req['User-Agent'] = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.94 Safari/537.36"
  h.request(req)
end

p res

result_data = res.body.force_encoding('UTF-8')
result_data.split("\n").each do |data|
  p JSON.parse data
end
```

出力形式(output)やAPI key(key)をパラメータとして指定し、APIのURLにPOSTでリクエスト。headerやbodyにも情報を入れている。

スクリプトを実行。

```
$ ruby voice_recognition.rb test.wav
#<Net::HTTPOK 200 OK readbody=true>
{"result"=>[]}
{"result"=>[{"alternative"=>[{"transcript"=>"テスト", "confidence"=>0.46040118}, {"transcript"=>"test"}, {"transcript"=>"てすと"}, {"transcript"=>"チェスト"}], "final"=>true}], "result_index"=>0}
```

ちゃんと認識している！！さすが優秀。
transcriptと一緒に入っているconfidenceというキーの値は、解析結果の信頼度のようなものだろうか。

# おわり
APIに関する情報がちょっと少なくて分からないことが多いのだが、以上が軽く触ってみた結果です。
FuelPHPでJavascriptを使用して複数のリクエストを投げる際にCSRF対策をする。

Security::js_fetch_token()
==========================

[公式](http://fuelphp.jp/docs/1.5/classes/security.html#/method_js_fetch_token)によると、AJAXでCSRFするならこれだってだいたい書いてあります。

```js+php

<?= Security::js_fetch_token(); ?>

<script type="text/javascript">
function sendForm(submitButton){
    var button = $(button);
    var form = button.closest('form');

    form.append($('<input type="hidden" name="fuel_csrf_token" value="' + fuel_csrf_token() + '">'));

    $.ajax({
        url: form.attr('action'),
        type: form.attr('method'),
        data: form.serialize(),
        timeout: 10000,
        complete: function(xhr, textStatus){
            // on complete
        },
        success: function(result, textStatus, xhr){
            // on success
        },
        error: function(xhr, textStatus, error){
            // on error
        }
    });
}
</script>

<form>
    <input type="text" name="foo" value="" />
    <input type="button" value="実行" onClick="sendForm(this)" />
</form>
```

このコード自体では動作確認をしていませんが、`fuel_csrf_token()`というjavascriptの関数がPHPの`Security::js_fetch_token();`によって発行されるので、それをinput hiddenに入れています。
Downloading files from google cloud storage using service account authentication with nodejs google-api-nodejs-client 

[Accessing Google API using Service Account in Node.js](http://dannysu.com/2014/01/16/google-api-service-account/) was quite helpful for me but it was little bit out of date(due to written based on older api library).

I put my version of snippet which works with latest nodejs client library. Hope it helps :sparkles: 

```coffeescript
#!/usr/bin/env coffee
googleapis = require('googleapis')

email = SERVICE_ACCOUNT_EMAIL
# see https://developers.google.com/storage/docs/authentication#converting-the-private-key for how to convert .p12 to .pem
keypath = SERVICE_ACCOUNT_PEM
key = null

storage = googleapis.storage('v1')

# see https://developers.google.com/storage/docs/authentication
# for auth url
authClient = new googleapis.auth.JWT(email, keypath, key, ['https://www.googleapis.com/auth/devstorage.read_only'] )

authClient.authorize (err, tokens) ->
  if (err)
    console.log(err)
    return

  storage.objects.get {
    auth: authClient,
    bucket: 'billing-exports',
    object: 'bill-2014-09-08.json?alt=media' # add '?alt=media' to download the file itself.
  }, (err, file) ->
    console.log err, file

```
Reveal.js を利用した内部公開スライドサーバー構成について

# Reveal.js を利用した内部公開スライドサーバー構成について
## 概要
Reveal.js を利用した内部公開スライドサーバー構成について。

Reveal.js を利用したスライドの開発・公開・運用について、
外部サービスを利用できない（つまり, GitHub Pages は利用不可）、
という前提でスライドにまとめてみました。

## スライド
http://tbpgr.github.io/slide_server_slide/#/
cocos2d-xでモーダルレイヤとui::ScrollViewを試した

```cpp:GameScene.h

#include "cocos2d.h"

#include "extensions/cocos-ext.h"
#include "ui/CocosGUI.h"

USING_NS_CC;
USING_NS_CC_EXT;
using namespace ui;

class GameScene : public cocos2d::Layer
{
protected:
    void addLayer();
public:
    static cocos2d::Scene* createScene();
    virtual bool init();
    CREATE_FUNC(GameScene);
};
```

```cpp:GameScene.spp
#include "GameScene.h"
USING_NS_CC;

Scene* GameScene::createScene()
{
    auto scene = Scene::createWithPhysics();
    auto layer = GameScene::create();
    scene->addChild(layer);
    
    return scene;
}
bool GameScene::init()
{
    if (!Layer::init())
        return false;

    addLayer();
    return true;
}

#define kModalLayerPriority -1

void GameScene::addLayer(){
    
    auto layer = Layer::create();
    
    // モーダルレイヤ ここから
    auto listener = EventListenerTouchOneByOne::create();
    listener->setSwallowTouches(true);
    listener->onTouchBegan = [](Touch *touch,Event*event)->bool{
        return true;
    };
    auto dip = layer->getEventDispatcher();
    dip->addEventListenerWithSceneGraphPriority(listener, this);
    dip->setPriority(listener, kModalLayerPriority);
    // モーダルレイヤ ここまで
    
    auto size = Director::getInstance()->getVisibleSize();
    ui::ScrollView* sc = ui::ScrollView::create();
    sc->setContentSize(size);
    sc->setBackGroundColor(Color3B::GREEN);
    sc->setBackGroundColorType(Layout::BackGroundColorType::SOLID);
    sc->setBounceEnabled(true);
    sc->setDirection(ui::ScrollView::Direction::VERTICAL);
    sc->setContentSize(Size(480,size.height));
    sc->setInnerContainerSize(Size(480, sc->getContentSize().height + 300 ));
    
    sc->setPosition(Vec2(0,size.height - sc->getContentSize().height ));
   
    
    Button* button = Button::create("button.png");
    button->setPosition(Vec2(button->getContentSize().width / 2.0f,
                             sc->getContentSize().height - button->getContentSize().height / 2.0f));
    sc->addChild(button);
    
    layer->addChild(sc);
    addChild(layer);
}
```
e1000e Detected Hardware Unit Hang


# e1000e Detected Hardware Unit Hang が発生した。

* tenshiにて`/var/log/messages`の監視をしていて検知。

```bash:dmesg
e1000e 0000:0a:00.1: eth3: Detected Hardware Unit Hang:
 TDH                  <5c>
 TDT                  <5e>
 next_to_use          <5e>
 next_to_clean        <5c>
buffer_info[next_to_clean]:
 time_stamp           <da13a6e5>
 next_to_watch        <5c>
 jiffies              <da13ac5f>
 next_to_watch.status <0>
MAC Status             <80387>
PHY Status             <792d>
PHY 1000BASE-T Status  <3800>
PHY Extended Status    <3000>
PCI Status             <10>
```

* nagiosにて検知なし


# 該当する事象

* [Bug 785806 – e1000e Detected Hardware Unit Hang](https://bugzilla.redhat.com/show_bug.cgi?id=785806)
* [linux:linux-etc [RCPS]](http://www.rcps.jp/doku.php?id=linux:linux-etc)

> 以下の様なエラーが頻出して、その都度ネットワークが再起動してしまう。

* [TSO(TCP Segmentation Offload)の無効化 - Knowlege Database](http://extstrg.asabiya.net/pukiwiki/index.php?TSO%28TCP%20Segmentation%20Offload%29%A4%CE%CC%B5%B8%FA%B2%BD)


# ethtoolインストール

```bash:ethtoolインストール
sudo yum install -y ethtool
```


```bash:
$ sudo /usr/sbin/ethtool -k eth3
Offload parameters for eth3:
Cannot get device udp large send offload settings: Operation not supported
rx-checksumming: on
tx-checksumming: on
scatter-gather: on
tcp segmentation offload: on
udp fragmentation offload: off
generic segmentation offload: off
generic-receive-offload: off
```

> 上記の内、以下の項目がTSO関連の項目となる。これらがonの場合はTSOが動作している。
> rx-checksumming: on
> tx-checksumming: on
> tcp-segmentation-offload: on

TSOが動作している様子。
様子を見て再発するようであればTSOを無効化しよう。
3日で受かる!? Androidアプリケーション技術者認定試験 ベーシック

「[Androidアプリケーション技術者認定試験 ベーシック](http://oesf-edu.com/ace/application-exam/)」
Androidアプリ開発の資格は今これだけですね。
会社から資格取得を求められたり、自分の保有スキル証明だったり。
今回は、これだけやっとけば受かるぞ！というものを自分が受験したときを振り返りながら書いてみました。
資格はほしいけど、何週間何ヶ月も勉強するのはつらい...そんな人に少しでも役立てば幸いです。
# はじめに
必要な試験勉強は完全に暗記です。
3日で受かる!? なのでほぼ一夜漬けです。
当然ですが、開発～リリースまでの流れを経験しているほうが覚えがいいです。
なので、資格取得を目指しながらAndroidアプリ開発の知識も身に着けようという人には役立たない可能性大です。
## 準備するもの
お家で勉強する用
テキスト：[携帯OS教科書 Androidアプリケーション技術者ベーシック](http://www.amazon.co.jp/gp/product/4798124540/ref=pd_lpo_sbs_dp_ss_1?pf_rd_p=466449256&pf_rd_s=lpo-top-stripe&pf_rd_t=201&pf_rd_i=4822202968&pf_rd_m=AN1VRQENFRJN5&pf_rd_r=1WYN41EKB6GVNJYPGNBV)
電車等外出中に勉強する用
Androidアプリ：[Androidアプリケーション技術者認定試験ベーシック問題集](https://play.google.com/store/apps/details?id=jp.kk.kapp.acequestioncollection&hl=ja)
# さて勉強の前に
まず、試験の予約をしましょう。
試験日が決まれば気合も入ります。
逃げ道をぶち壊しましょう。
試験3日前から勉強するので、試験日の変更も間に合いません覚悟を決めましょう！
# さぁ勉強です
以下試験までにやるべきことを3日間でやります。
だいたい1日3～4時間程度で十分こなせるでしょう。

### テキストでやるべきこと
1. 各章末の練習問題をやりましょう。
2. 答えはテキストに書き込みはせずノートやコピー用紙に描きましょう。（問題集の基本ですね）
3. 1つの章の練習問題を一通り終えたら答え合わせをしましょう。
4. 間違えた箇所の、解答解説を読みましょう。
5. 全問正解できるまで1～4を繰り返します。（暗記の基本ですね）
6. 全問正解できたら次の章にすすみ1～繰り返しです。（3日間で13章まで進めましょう！）

すぐに問題文と解答を覚えちゃうかもしれませんが、それでOK！
ただし、選択肢のアルファベットはなるべく見ないように、必ず問題文を読んで選択肢の解答を見るようにしましょう。

全章の練習問題を解答出来るようになったら、本書の模擬試験をやってみましょう。
軽く合格点が取れるはずです！

練習問題前にある膨大な解説ページ（本としてはこっちがメイン）は読む必要ありません。そんな時間があるなら練習問題をいっぱいやりましょう！覚えましょう！
この辺は資格を取得してからゆっくり読みましょう！

### アプリでやるべきこと
ひたすら練習問題をこなします。
おすすめは、「マラソン」
2日目くらいには、50問ノーミス完走を目指しましょう！
ちょっとやったら問題と解答を覚えてしまうと思います！でもそれでOK！
覚えてしまっても、問題文と解答にはきちんと目を通すことだけ心がけましょう！
連続で2,3周できたらバッチリです！
時間が無いときは、「チャレンジ5問」もしくは、「苦手問題」でミスした問題について復習しましょう。
最初の頃は、いっぱいミスするでしょう。
そうすると「苦手問題」がてんこ盛りになってしまう。
「マラソン」で30問くらいまでいけるようになったら一度苦手問題の履歴をクリアするとちょうどいいと思います。

# いざ！試験に！
テキスト、アプリをバッチリ暗記できたあなたなら、もう試験に受かったも同然です！
出題のほとんどが練習問題のバリエーション系（ほぼそのまま!?）であることに気がつくでしょう！
これに答えるだけでらくらく合格点です！

ただ、ここまでやっても試験問題で見たことない言葉がとびだすこともあるでしょう！
はたまた、さっぱり正解が分からないときもあるでしょう！
引っ掛け問題や、わざと分かりにくい問題文にしているものもあるでしょう！
でも大丈夫！そんなときは、諦めましょう！そんな問題は、見なかったことにしましょう！
それでも余裕で7割を超えるのだから！
hubot+slackをIRCで動かす


hubot-slackアダプタだとcallback url設定しないと動かないっぽかったので、ローカルでも動くhubot-ircアダプタを試したメモ

# Slack側の設定

## Gateway設定の有効化

https://{team_name}.slack.com/admin/settings

上記ページの左側のメニューから、Administration > Settingsを選択。

![スクリーンショット 2014-09-10 0.06.06.png](https://qiita-image-store.s3.amazonaws.com/0/19254/c259943f-6b5d-9fa4-e6c8-09ac03f5180b.png "スクリーンショット 2014-09-10 0.06.06.png")

Gatewaysのペインを開いて"Enable IRC gateway(SSL only)"にチェックを入れる。

![スクリーンショット 2014-09-10 0.05.50.png](https://qiita-image-store.s3.amazonaws.com/0/19254/af58b815-567a-6a97-58ce-bf3839c33a58.png "スクリーンショット 2014-09-10 0.05.50.png")


## Bot用ユーザの作成

適当にメールアドレス用意して

https://{team_name}.slack.com/admin/invites

から招待。

## Bot用IRCログイン情報の取得

Bot用ユーザでslackにログインしなおし、下記ページにアクセス

https://{team_name}.slack.com/account/gateways

![スクリーンショット 2014-09-10 0.14.45.png](https://qiita-image-store.s3.amazonaws.com/0/19254/6e8a2e3c-4412-4c00-99d9-cc21e7a18c2d.png "スクリーンショット 2014-09-10 0.14.45.png")

# hubot側の設定

hubotやらredisやらは既に入ってるものとする。

## hubotのテンプレ作成

```
hubot -c mybot
```

## hubot-ircアダプタ追加

```
npm install hubot-irc --save && npm install
```

## hubot起動スクリプト作成

こんな感じのスクリプトを作成

```run_hubot_with_irc.sh
#!/bin/sh

export HUBOT_IRC_SERVER="${TEAM_NAME}.irc.slack.com"
export HUBOT_IRC_ROOMS="#${CHANNEL_NAME}"
export HUBOT_IRC_NICK="${USER_NICK}"
export HUBOT_IRC_UNFLOOD="true"
export HUBOT_IRC_PASSWORD="${PASSWORD}"
export HUBOT_IRC_PORT=6667
export HUBOT_IRC_USESSL=true

bin/hubot -a irc --name ${BOT_NAME}
```

USER_NICK、PASSWORDにはそれぞれ、"Bot用IRCログイン情報の取得"で取得したUser、Passの値が入る。

## hubot起動

```
sh ./run_hubot_with_irc.sh
```

bot以外のアカウントでCHANNEL_NAMEに指定したchannelにログインし、`@mybot: ping`とかやって返事が返って来たら成功。

# 確認環境

MacOSX 10.9.4
node 0.10.21
hubot 2.8.1
hubot-irc 0.2.7
アイコンとかに便利なSassの書き方

CSS Spriteでアイコンを表示させるってのは良くやるけども、
意外にもSassで書いたのは初めてだったので、メモ。

 

[CANPATH](http://canpath.jp)で選べるアイコンを増やしました。
自分史を作るのがまたちょっと楽しくなると思います。
　　
![Screen Shot 2014-09-10 at 12.10.35 AM](http://image.workabroad.jp/upload/2014/186/workabroad.jpg)
　　
で、このCSSを作る方法。
　　
まずは画像を用意します。
ひとつのアイコンは40px四方でマージンも合わせるとちょうど50pxになるようにしています。
なのでこの画像は、500px x 350pxになります。保存方法ですが今回はSVGにしました。
![Screen Shot 2014-09-10 at 12.15.19 AM](http://image.workabroad.jp/upload/2014/187/workabroad.jpg)
　　

```scss

/* -------------------------- */
// define icon
/* -------------------------- */
$icon-size: 50px;
.icon {
	display: inline-block;
	width: $icon-size;
	height: $icon-size;
	background-image: url('YOUR_ICON_PATH.svg');
	background-repeat: no-repeat;
	background-position: 0 0;
	$column: 0;
	$row: 0;
	$num: 10;
	$icon_names: (
		"none", "flag", "paperplane", "writing", "plane", "school", "job", "foot", "jewel", "shakehands",
		"heart", "star", "music", "bulb", "comment", "lightning", "flag-2", "bomb", "alert", "lock",
		"battery", "writing-2", "painting", "painting-2", "sun", "cloud", "rain", "money", "cart", "present",
		"letter", "scissors", "flower", "sign", "map", "compass", "earth", "phone", "checkbox", "feet",
		"walk", "skateboard", "bicycle", "moterbike", "moterbike-2", "car", "car-2", "ship", "plane-2", "rocket",
		"island", "passport", "trophy", "sandglass", "book", "flag-3", "tube", "warning-2", "speedmeter", "bag",
		"game", "karaoke", "movie", "sound", "camera", "photo", "mobile", "computer", "note", "note-2"
	);
	@for $i from 0 to length($icon_names) {
		@if ($i % 10) == 0 {
			$column: $i / 10;
		}
		&.#{nth($icon_names, $i+1)} {
			$row: $i - $column * $num;
			background-position: (- $icon-size * $row) (- $icon-size * $column);
		}
	}
}

```

　　

icon-size：アイコンのマージンを含めた大きさ
num：1行のアイコン数
icon_names：各アイコンのクラス名
　　

```
<i class="icon camera"></i>
```

　　
とかやればOKなはず。
実装は[ここ](http://www.canpath.jp/)で見られます。
ofruby - iPhone上でRubyを使ってお絵描きプログラミング


[iPhoneでRubyとopenFrameworksを使ってグラフィックプログラミングができるofrubyを作りました](http://ongaeshi.hatenablog.com/entry/ofruby-released)


iPhone上で簡単にグラフィックプログラムを書くことが出来るアプリです。プログラムの記述、実行、デバッグ、管理を全てiPhone上で行うことが出来るのが特徴です。

mruby + openFrameworks で作っています。openFrameworksのAPIをRubyらしく簡単に叩くことが出来ます。スマートフォンでプログラムを書くのはポケコンみたいでなかなか楽しいです。

ダウンロードはこちらからどうぞ - [App Store](https://itunes.apple.com/us/app/ofruby/id908715098?mt=8&uo=4)


## サンプルコード

[ストライプを表示する](http://ongaeshi.hatenablog.com/entry/ofruby-sample-stripe)

![mountain.gif](https://raw.github.com/ongaeshi/ofruby-sample/master/images/stripe.png)


[基本図形と文字の描画](http://ongaeshi.hatenablog.com/entry/ofruby-sample-hello)

![mountain.gif](https://raw.github.com/ongaeshi/ofruby-sample/master/images/hello.png)


[マウンテン](http://ongaeshi.hatenablog.com/entry/ofruby-sample-mountain)

![mountain.gif](https://raw.github.com/ongaeshi/ofruby-sample/master/images/mountain.gif)
Railsのdb/schema.rbの役割

## db/schema.rbは何に使われるのか
rake db:migrateなどをすると現在のスキーマが反映され、スキーマの確認などに便利なschema.rb。
ふと、1つのRailsアプリを分割して、複数のRailsアプリから同じDBを参照するようにしたくなったのだが、その際にどちらのRailsアプリにもdb/schema.rbを含める必要があるのか気になった。

db/schema.rbを削除してもアプリは動くのだが、
schema.rbには「It's strongly recommended that you check this file into your version control system.」と書いてあるので、本当に削除していいのか自信がない。

そこで、Rails4.1.5のソースを読んで、schema.rbがどんな用途に使われているのかを調査した。

## schema.rbが使われている3箇所
rails/railsのファイル全てに対してschema.rbでgrepをかけると、3箇所で使われていることがわかる。

- ActiveRecord::Railtieのinitializer
- ActiveRecord::Tasks::DatabaseTasks
- active_record/railties/databases.rake

それぞれが最終的にどのような役割を果たすか説明する。

## 1. ActiveRecord::Railtieのinitializer
`ActiveRecord::Railtie`内に定義されているinitializerで、`config.watchable_files`に[db/schema.rbを追加している](https://github.com/rails/rails/blob/9c297ce93610bcd878f5a5ca8e737bf057fc2d85/activerecord/lib/active_record/railtie.rb#L156)。
読み進めていくと、watchable_filesは[このへん](https://github.com/rails/rails/blob/9c297ce93610bcd878f5a5ca8e737bf057fc2d85/railties/lib/rails/application/finisher.rb#L87-L112)で使われていて、watchable_filesが更新されたときに、読み込んだ依存関係をクリアするようになっている。

つまり、schema.rbがあると、**そのアプリでスキーマを更新した後、依存関係の再読み込みが行われるようになる**。
別のアプリ等でスキーマ管理をする場合は、スキーマが更新されたらこの仕組みを使う（rake db:schema:load等）か何らかの方法で読み込んだ依存関係をクリアする必要がある。

## 2. ActiveRecord::Tasks::DatabaseTasks
これは実際のところ3でのみ使われるモジュールである。
3がdb/schema.rbを読み込むときに使われる。

## 3. active_record/railties/databases.rake
rake db:\*\* のタスクが定義されているファイル。
この中で、schema.rbを使うタスクは以下のとおりであった。 (deprecatedなものを除く)

- **rake db:schema:dump**
  - **db:migrate**、**db:rollback** などが依存している
  - 現在のスキーマからschema.rbを作成する
- **rake db:schema:load**
  - **db:setup**、**db:reset** などが依存している
  - schema.rbからテーブルを作成する


要するにschema.rbにスキーマ定義をダンプしたり、schema.rbからダンプしておいたスキーマを再現するのに使える。

試しでインデックスを張り替えたりしていると本来のスキーマとずれてしまうことがあると思うが、その際にschema.rbがあれば元の状態に復元できるので、**複数の環境間でスキーマの整合性を保つためにschema.rbは1つはあったほうが良い**。
逆に、1つschema.rbがどこかで管理されていれば、同じDBを使う他のrailsアプリではschema.rbは配置しなくて良いと言える。

## まとめ
db/schema.rbはなくても動くが、複数の環境間でスキーマの整合性を保つためにどこかに1つは管理しておくべきである。
Visual StudioでGrunt(Task Runner Explorer)

Visual Studioの拡張で[Task Runner Explorer](http://visualstudiogallery.msdn.microsoft.com/8e1b4368-4afb-467a-bc13-9650572db708)ってのが出てたので試してみた。ざっくりと概要を書くと以下のような感じ。

- GruntとGulpを実行可能
- VSのソリューションイベントののBeforeBuildとかAfterBuildとかCleanとかSolutionOpenに紐づけられる

使い方は簡単。プロジェクトにGruntfile.jsを置いて、右クリックして「Task Runner Explorer」メニューを選択して、表示された「Task Runner Explorer」から動かしたいタスクをダブルクリックするだけ。そしたらなんとなく動いてくれる。

![taskrunnerexplorer.png](https://qiita-image-store.s3.amazonaws.com/0/16028/04d06fa9-6524-2c33-fe7e-a1490570ba93.png)

VSのソリューションイベントに紐づけるのも簡単。紐づけたいタスクを右クリックして「Binidings」から表示される各イベントを選択するだけ。

![taskbindings.png](https://qiita-image-store.s3.amazonaws.com/0/16028/8975f177-7270-d020-36e7-592a85f0999c.png)

ちなみにタスクを紐づけたらGruntfile.jsの先頭に以下のような得意のトリプルスラッシュコメントが追加された。

```js
/// <vs BeforeBuild='default' />
```

今はプレビューでWebプロジェクトにしか設定できひんし、gruntfile.jsを認識させるのに再起動必要だったりとかいろいろあるけど、先にも書いた通りVS14で搭載を狙ってるらしいので今後には期待できるかも。
chefで複数のrecipeにまたがるファイルを定義した話


chefで２つのレシピで共通のファイルをtemplateで定義した場合。例えばrubyとnodeのレシピがあった場合に、どちらのレシピでも.bash_profileを定義したいことがありました。

## 問題

それぞれのレシピで定義した「.bash_profile」を適用した場合、実行順で上書きされてしまいます。例えば、ruby、nodeのレシピの順で実行した場合、nodeのレシピが適用されてしまいます。


## 解決方法

こうした時にいくつか方法が考えられます。

1. 別々の.bash_profile_xxのようなファイルを作って、それを「.bash_profile」にsourceで読み込みます。それでそれぞれの読み込み設定が書かれていない場合は追記するコマンドを実行します。
1. 別のレシピで管理する方法

今回は1の方法を試してみました。

## やり方

recipeでは、「.bash_profile_xx.erb」というtemplateを定義しています。そして、grepして それぞれのファイルを読み込んでいるか確認し、読み込まれていない場合は「source ~/.bash_profile_xx.erb」を追記するようにしています。

```ruby:site-cookbooks/ruby/recipe/default.rb
template ".bash_profile_ruby" do
  source ".bash_profile_ruby.erb"
  path "/home/#{node['ruby']['user']}/.bash_profile_ruby"
  mode 0644
  owner node['ruby']['user']
  group node['ruby']['group']
  not_if "grep rbenv ~/.bash_profile", :environment => { :'HOME' => "/home/#{node['ruby']['user']}" }
end

execute "update bash_profile" do
  command "echo source /home/#{node['ruby']['user']}/.bash_profile_ruby >> /home/#{node['ruby']['user']}/.bash_profile; chmod 0644 /home/#{node['ruby']['user']}/.bash_profile"
  only_if "test ! `grep bash_profile_ruby ~/.bash_profile | wc -l` -eq 0", :environment => { :'HOME' => "/home/#{node['ruby']['user']}" }
end
```

```ruby:site-cookbooks/node/recipe/default.rb
template ".bash_profile_node" do
  source ".bash_profile_node.erb"
  path "/home/#{node['node']['user']}/.bash_profile_node"
  mode 0644
  owner node['node']['user']
  group node['node']['group']
  not_if "grep ndenv ~/.bash_profile_node", :environment => { :'HOME' => "/home/#{node['node']['user']}" }
end

execute "update bash_profile" do
  command "echo source /home/#{node['node']['user']}/.bash_profile_node >> /home/#{node['node']['user']}/.bash_profile; chmod 0644 /home/#{node['node']['user']}/.bash_profile; exec $SHELL -l"
  only_if "test ! `grep bash_profile_node ~/.bash_profile | wc -l` -eq 0", :environment => { :'HOME' => "/home/#{node['node']['user']}" }
end
```

templateでは特に珍しいようなことは書かいていません。こんな感じですね。

```ruby:site-cookbooks/ruby/templates/.bash_profile_ruby.erb
# .bash_profile


# get the aliases and functions

if [ -f ~/.bashrc ]; then
  . ~/.bashrc;
fi


# User specific environment and startup programs

PATH=$PATH:$HOME/bin
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
```


```ruby:site-cookbooks/node/templates/.bash_profile_node.erb
# .bash_profile


# get the aliases and functions

if [ -f ~/.bashrc ]; then
  . ~/.bashrc;
fi


# User specific environment and startup programs

PATH=$PATH:$HOME/bin
export PATH="$HOME/.ndenv/bin:$PATH"
eval "$(ndenv init -)"
```

今回はこのように定義しましたが、2の方がきれいにかけるので、今度試してみます。
cleanup属性

systemdのソースコードを読んでいると、各所で`_cleanup_free_`という修飾子が使われているのが分かる。例えば、

```c:src/core/cgroup.c
Unit *manager_get_unit_by_pid(Manager *m, pid_t pid) {
        _cleanup_free_ char *cgroup = NULL;
        int r;

        assert(m);

        if (pid <= 1)
                return NULL;

        r = cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, pid, &cgroup);
        if (r < 0)
                return NULL;

        return manager_get_unit_by_cgroup(m, cgroup);
}
```

という風に、ローカル変数を修飾している。

この修飾子は名前から予想できる通り、変数のスコープから抜けると自動的にfreeしてくれるらしい。

`_cleanup_free_`はマクロで、

```c:src/shared/util.h
#define _cleanup_free_ _cleanup_(freep)
```

と定義されている。`_cleanup_`は

```c:src/shared/macro.h
#define _cleanup_(x) __attribute__((cleanup(x)))
```

という風に、GCCの`__attribute__(cleanup)`に展開される。この機能の説明は、[Variable Attributes - Using the GNU Compiler Collection (GCC)](https://gcc.gnu.org/onlinedocs/gcc/Variable-Attributes.html)をご参照ください。

一方、`freep`は

```c:src/shared/util.h
static inline void freep(void *p) {
        free(*(void**) p);
}
```

というインライン関数で、free(3)を読んでいる。変数のスコープから抜けた時に、この関数が呼ばれるらしい。

というわけで、かなり限定的ですが、最近ではCでも自動freeできるんですね。
編集中

##Tips的なもの
c/c++時々C#なあれ。ミスを減らすための気を付けた方がいいと思っていることを書いておく。
思いついたら下に追記していく予定。

####if,forの波括弧を省略しない
省略すると次の文がどんなものでも繋がるので、if,forだけ消したり、実行文だけ消してバグる。インデントでif節を見間違えたりすることがある。

```c
if(x>y)
    z=1;
    u=1; // ifとは関係ない
```

####3項演算子はミスらない
ある変数に条件で値を必ず入れる場合、3項演算子が有用である。if else節は分けて書く必要があり、書き忘れが起きる可能性がある。
ただし、判定式は注意深く括弧を付けた方が良い。
3項演算子を規約で使用不可とか嫌う人がいるけど、意味不明である。

```c
// 3項演算子
    x = y>0 ? 1 : 0; //　xは確実に代入される
// if
    if( y>0 ) {
        x = 1;
    }
    else {    // 処理抜けが起こりえる
    }
```

####謎のswitch
switchは1つのラベルに長文を書くのは向かないと思う。フォールスルーでbreakがないとバグったり、スコープを分けないと変数宣言が出来ないのも使い辛い。なお、最終ラベルはC++なら変数宣言可という情報もあるが、追記することを考えるならスコープを分けるのが懸命だろう。

```c
switch( x ) {
    case 1:
        int y; // 宣言できない
        break;
    case 2:
        {
            int y; // 宣言できる
        }  // breakが無くても許容される
    default:
}
```
なお以下の文も言語的に許される。

```c
switch( x ) {
    w = y * z;  // 実行されない
    u = t - v;
    break;
}
```
そしてこのコードは見ての通りラベルがないが、コンパイルエラーにならない到達不能コードと成る。コンパイラオプションを変えればエラーに出来るが、デフォルトは警告のみになっていてコンパイル可能なのであまり救いにならない。（VC)

これは言語仕様のミスだろう。その証拠にC#のswitchはラベルが1つ以上ないと使用出来なくなっている。
[MSDN switch (C# リファレンス)](http://msdn.microsoft.com/ja-jp/library/06tc147t.aspx)
ArrayList<自作クラス>のソートで昇順、降順をよく忘れるのでメモ


compareメソッドのOverrideで「どっちか昇順だっけ？」って、よくやってしまう

昇順(1,2,3,4,...)にソート

#### 修正：同じ値の時は0を返すべきとの指摘を受けました。ありがとうございます。ifでやるのではなく、Double.compare(Double v1, Double v2)を使用するようにする

#### 注意点
Overrideするcompareメソッドでは、int型を返す。Double型を基準にソートする場合、`return v1 - v2;`ができない`return (int)(v1-v2);`も小数点以下が切り捨てされるので、正確にソートされない


~~~Hoge.java
package hoge;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class Main {
	public static void main(String... args) {
		ArrayList<Hoge> hogeList = new ArrayList<>();
		hogeList.add(new Hoge());
		hogeList.add(new Hoge());
		hogeList.add(new Hoge());
		System.out.println("Before");
		for (Hoge hoge : hogeList) {
			System.out.print(hoge + ",");
		}

		Collections.sort(hogeList, new HogeComp());

		System.out.println("\nAfter");
		for (Hoge hoge : hogeList) {
			System.out.print(hoge + ",");
		}
	}

	private static final class Hoge {
		private final Double value;
		private Hoge() {
			this.value = (int)(Math.random() * 1000) / 100.0;
		}

		@Override
		public String toString() {
			return this.value.toString();
		}
	}

	private static final class HogeComp implements Comparator<Hoge> {
		@Override
		public int compare(Hoge o1, Hoge o2) {
			return Double.compare(o1.value, o2.value);
		}
		
	}
}
~~~

## 結果
~~~
Before
2.84,3.08,1.07,
After
1.07,2.84,3.08,
~~~

## 降順(5,4,3,2,...)
- 昇順でソートして、Collections.reverse(list)
rbenvを入れた環境でCocoaPodsのバージョンが変更されないあなたへ

##CocoaPodsをインストールするぞ！
ちょっとiPhoneアプリの開発をやるために、CocoaPodsが必要でした。

```
gem install cocoapods
```

インストールをすると、0.33.1がインストールされました！

##なぜかうまくいかない
pod setup しようとするとエラーが出ます。
pod install しようとするとエラーが出ます。

はて？

エラーメッセージとしては、こんな感じです。

```
Setting up CocoaPods master repo
Already up-to-date.
[!] The `master` repo requires CocoaPods 0.32.1 - 
Update CocoaPods, or checkout the appropriate tag in the repo.
```

0.32.1のバージョンが必要っぽいですね。
アップデートしろって言われてます。

さっき0.33.1を入れたんですけど！

そう思って、バージョンを確認！

```
pod --version
```

すると、0.29.1が入っているようです。

なぜ？

##rbenv入れてた！
Ruby on Railsをやる関係で、実は開発環境にrbenvを入れていたんです。
思い当たる節はこれしかない・・・。

調べてみると、確かに、rbenvのgem環境には0.33.1がインストールされてました！

でも、pod --versionは0.29.1。

which podでインストールされている場所を確認すると

```
/usr/bin/pod
```

って言われます。

パスが違ってるじゃん！

##システム側のpodを更新しよう
他にいい方法あるような気もするんですが、
時間がもったいないので、パスが通っている方のpodをアップデートしましょう。

```
sudo /usr/bin/gem update cocoapods
```

これでアップデートされます。

アップデート完了後、バージョンを確認します。

```
pod --version
```

0.33.1って表示されました！

##というか
```
bundle exec pod setup
bundle exec pod install
```
すればいい気がする。
Cookbook名を変えたら

最初につけたCookbook名がいけてなくて変える場合、一緒に変えるところ

1. metadata.rbのname
2. jsonや.kitchen.yml内のrun_list
3. このCookbookに依存しているCookbookのBerkfile
4. 依存Cookbookのrecipeのinclude_recipe
5. 依存Cookbookのmetadata.rbのdepends
Markdownアンチパターン

いろいろあるけど、思ひついたら足してく

http://qiita.com/tadsan/items/6fb4523eb87102496628.md でこの記事の原文が見られるよ

# 見出し

見出し/小見出しをつけない

* 文章の区切りがわかりにくい

■変な記号を見出し代りにする

* 誰も得しない

# リスト記法

## 変な記号をリスト記法の代用にする

・りんご
・バナナ
・みかん

1) 東京都
2) 大阪府
3) 京都府

# ソースコード

## コード記法使はない

* だめなやつ
  * __dir__ 変数でディレクトリを参照する
* こうしたかった
  * `__dir__` 変数でディレクトリを参照する

## コードブロック使はない

<?php $n = trim(fgets(fopen('php://stdin', 'r')));
for ($i = 1; $i <= $n; $i++) {
    if ($i % 3 === 0) { ?>Fizz<?php }
    if ($i % 5 === 0) { ?>Buzz<?php }
    elseif ($i % 3 !== 0) echo $i;
?>
 
<?php
}

* なんか変な空行入ってる
* インデントが反映されない
* Qiitaだと数式と衝突して盛大に壊れる

## コードブロック使はない 2

<?php
 
class Git extends \SebastianBergmann\Git
{
    public function getCurentHash()
    {
        $this->execute('git rev-parse --verify HEAD', $output, $return);
 
        if (!isset($output[0])) {
            throw new \RuntimeException;
        }
 
        return $output[0];
    }
}

* 空行がみっともない上に、コードブロック記法と衝突して変な感じになってる
* Qiitaだと数式と衝突してすごい変な感じになる

# 段落/改行

## 文中で改行する

文章中の改行をどう処理するかは、Markdownエンジンの種類とか
変換オプションによって変化する。Qiitaの場合は改行が`<br>`に変換されちゃうから
不用意に改行を入れるとすごい不恰好な文章になるよ。

## 一文ごとに段落

文章の最後につける`。`を句点と呼ぶ

私たちは小学校の国語の授業で、段落には<dfn>意味段落</dfn>と<dfn>形式段落</dfn>があることを習った

意味のまとまりを無視して一文ごとに段落を作ると文章が散漫とする

これはただの<ruby>散文詩<sup><rp>[</rp><rt>ポエム</rt><rp>]</rp></sup></ruby>だ

# 引用

> 我輩は猫である。
引用文から空行を空けずに自分の文章を書く

引用の次の行には空の行がなければならない。
NAOqiとROSの比較

正確にはNAOqi Frameworkと狭義のROSの比較になります。
ライブラリや生態系では圧倒的にROSが巨大だと思います。

多言語化
-------
PythonとC++をベースとするところが似ています。

|    |NAOqi |ROS  | 
|:---|:-----|:----|
|メイン言語|Python/C++|C++/Python/Lisp|
|Server (呼び出される側)| △ C++のみ |  ◯ C++/Python/Lisp/Java/matlab/...|
|Client (呼び出し側) |◯ 上記 + .NET/Java/matlab/...| ◯ 上記 + Javascript/..|

NAOqiでは関数を外部から呼び出す側(クライアント)は豊富に用意されていますが、呼び出される側(サーバー)はC++のみのサポートとなっています。

分散環境
---------

|    |NAOqi |ROS  | 
|:---|:-----|:----|
|呼び出し方式| RPC | PubSub([Topic](http://wiki.ros.org/Topics)) / RPC([Service](http://wiki.ros.org/Services)) |
|ローカル呼び出し| ◯ | △ ([Nodelet](http://wiki.ros.org/nodelet))|
|遠隔通信方式| △ (SOAP) | ◯ (TCP) |

ROSは接続だけXMLRPCで遅いですが、その後の通信は生TCPなので、
結構早いです。
一方でNAOqiは遠隔呼び出しがすべてSOAPなので、基本的に遅いです。


非同期呼び出し
-------------

|    | NAOqi |  ROS |
|:---|:------|:-----|
|    | ◯ (post)  | △ ([Actionlib](http://wiki.ros.org/actionlib)) |

ROSではPubSubをうまく組み合わせたActionlibという仕組みを使って非同期呼び出しを行います。結構面倒です。
それに比べてNAOqiはmodule.doSomething()をmodule.post.doSomething()とするだけで非同期呼び出しになるので、非常に簡単です。

総括
=======
NAOqiフレームワークはシナリオ記述のために非常に便利であると思います。ROSはPubSubを基本とするので、シーケンスで何かを書くのが非常にやりづらいです。（そのため、部品としての独立性が高まると思います。）
ROSは汎用的な部品のためのミドルウェア、NAOqiはロボットを動かすためのSDKという側面が強いですね。

間違いとかあると思いますので、twitterやコメントでご指摘いただけるとうれしいです。
Helvetica,Times系フォントが埋め込めない


##症状：LaTexでコンパイルした後のPDFにHelvetica,Times系フォントが埋め込まれてない

##対策:Ghostscriptの設定ファイルを変更

自分の環境では，次のパスを指定して，適当なテキストエディタで開く（環境は各自のマシンに依存）
>C:\app\gs\gs9.14\Resource\Init\gs_pdfwr.ps

28行目付近の次の箇所を修正

>/.standardfonts [
>  /Courier /Courier-Bold /Courier-Oblique /Courier-BoldOblique
  %%/Helvetica /Helvetica-Bold /Helvetica-Oblique /Helvetica-BoldOblique
  %%/Times-Roman /Times-Bold /Times-Italic /Times-BoldItalic
  /Symbol /ZapfDingbats
] readonly def

Ghostscriptは，PDFに画像などを送るためのインタプリタである．
（ここから私見）上記の設定を行うことによりデフォルトで上記2つのフォントを利用することを抑制している．と予想される


次のコマンドにて，PDFを作成．→フォントを埋め込むことができた
>dvipdfmx -f dlbase14.map XXX.dvi

ちなみにフォントが埋め込まれているかどうかを確認するには，次のコマンドで分かる．
>pdffonts XXX.pdf
>→embの列がyesとなっているフォントは無事埋め込まれている．
ResqueのモニタリングをRailsコンソールから



### 全体の集計（ Resque.info ) 
```irb
irb(main)> y Resque.info
---
:pending: 0
:processed: 226
:queues: 2
:workers: 4
:working: 0
:failed: 6
:servers:
- redis://xxxxxxx
:environment: production
=> nil
```

### ワーカー一覧（ Resque.workers ）
```irb
irb(main)> y Resque.workers
---
- !ruby/object:Resque::Worker
  queues:
  - get_xxx
  - get_xxx
  shutdown: 
  paused: 
  to_s: xxxxxx
xxxxx:2:xxx,xxxx
- !ruby/object:Resque::Worker
  queues:
  - get_xxx
  - get_xxx
  shutdown: 
  paused: 
  to_s: xxxxxx
xxxxx:2:xxx,xxxx
```

### 実行中のワーカ一覧（ Resque.working ） 
```irb
irb(main):035:0> y Resque.working
--- []
=> nil
```
fluentdでMongoDBにログを入れたときに、timeキーがない場合の対処

fluentdのMongoDBプラグインを用いて、ログをMongoDBに入れる際に、
MongoDBの中のJSONをみると以下のように"time"のキーがなかった。

以下はApacheのaccess_logの例だが

<pre>
{"_id" : ObjectId("540eef3f0d094e535e000028"),"host" : "10.2.4.249", "user" : "-", "method" : "GET", "path" : "/elb_healthcheck.php", "code" : "404", "size" : "293", "referer" : "-", "agent" : "ELB-HealthChecker/1.0" }
</pre>

御覧のように"time"のキーが存在しない。

この場合はtd-agent.confに`include_time_key true`を書く必要がある。

<pre>
&lt;match td.*.*&gt;
  type mongo_replset
  database log
  collection access_log
  nodes localhost:27020,localhost:27021,localhost:27022
  flush_interval 10s
  include_time_key true  # ←こいつが必要★
&lt;/match&gt;
</pre>

これだけのことですが、めっちゃハマりました。どこにも書いてないんだもん。ソース見てやっとわかりましたよ。。。