OmniAICreator/Qiita-1.07M huggingface dataset:
デスクトップ環境としてUnityのUbuntu 15.04が優秀な件

最近UnityのUbuntuを触っていなかったので、久々にインストールしたら以下感動した。
（前からできるものもあります)

## 大変感動したもの

* USB接続のiPhone経由でインターネット接続ができる（<-これはすごい！！）
* デフォルトのフォントが綺麗！！(takao fontかな)
* 無線LANが普通に使える
  * ネットワーク接続出来ないときのOS起動時に120秒待たされるやつがなくなった。
  * RADIUS認証も問題無し
* 外部モニタ接続すると自動認識
* gnome-keyring-daemonのおかげでssh鍵のパスワードが一度で済む。
* sambaで共有しているプリンタを自動認識し、印刷できた。
* bashで~/.ssh/config内の定義が展開できた。(bash-completion)
  * 重たくなったzsh使わずに済む。

## その他

* メニューがタイトルバーに埋め込まれて縦の作業領域が広く使える
* twitterやgmailなどがランチャーに追加できる
* 日本語入力できる。(anthyなのでmozcに後で変える)
* オーディオデバイスを認識して音が出せる
* タッチパッドでのスクロールができる。(windows10はドライバが見当たらず出来なかった)

## 問題点

* Unity起動時、systemdでエラーが出たという子ウィンドウがちょいちょい出るが許容範囲。


デフォルトのデスクトップ環境がいい感じになっていて手動での設定変更が少なくて済むのはよいこと。
phantomjsをpythonから利用するにあたっての注意点



Mac portsを使って、インストールする手順は、

```sh
port install phantomjs
port install py27-selenium
```

となります。（sudoで実行してね）

しかし、これだと、

```py
from selenium.webdriver import phantomjs
```

で呼び出せない。seleniumのwebdriverがphantomjsを見つけられないようだ。

ただし、seleniumのインストールをpipにまかせる必要がある。

```sh
pip install selenium
```

何なんだろうこのトラップ。。。
LaTeX文書中に絵文字的なもの（Font-Awesome）を取り入れる

絵文字（:rocket:や:ghost:など）をLaTeX文書の中に取り入れたいという願望があり、あれこれ方法を探したり試行錯誤してみたという苦労話。
結論は、**現段階**では**絵文字を使うことはかなり難しい**ということ。しかしその代わりに、絵文字ほどカラフルではないが、フォントアイコンなどを使ってLaTeX文書のおしゃれ感を増すことは比較的簡単にできます。

というわけで~~試行錯誤の記録と~~**Font-Awesomeを取り入れておしゃれ感を増す**方法を書きます。

## coloremojiパッケージによる絵文字の実装

２つあってややこしいのですが、coloremojiパッケージを使って絵文字を表示させることが可能です。

[`coloremoji`](https://github.com/doraTeX/coloremoji)パッケージを使うことで、一応絵文字を使うことができます。ただし絵**文字**として扱っているのではなく、あくまでも**画像**として扱われている点に注意。

参考) [TeXで絵文字を入出力する (2) 〜 カラー絵文字篇 - TeX Alchemist Online](http://doratex.hatenablog.jp/entry/20140107/1389103370)

もうひとつの[`coloremoji`](https://github.com/alecjacobson/coloremoji.sty)パッケージ

参考) [Emoji in LaTeX documents « Alec's Web Log](http://www.alecjacobson.com/weblog/?p=4018)

## LaTeX + Font-Awesome

`XeLaTeX`, `LuaLaTeX`に対応。フォントの種類も多く、おすすめです

### 必要なもの

* `Font-Awesome`
    * 現時点（20150328）での最新版は4.3.0
    * http://fortawesome.github.io/Font-Awesome/ から必要なフォントをダウンロードし、インストール
* `fontawesome.sty`

### 基本的な構造

`\FaThumbsUp`のように`\Fa` + `icon名`を定義すれば対応するFont-Awesomeのフォントが出力される。

### 例

```tex
\documentclass[11pt]{report}
\usepackage{fontspec, fontawesome} % パッケージの読み込み

\begin{document}

\faFlag Font-Awesome

\faRocket \faTwitter \faCopy

\end{document}
```

↓完成品
![test1502_pdf.png](https://qiita-image-store.s3.amazonaws.com/0/19462/0a9403b8-3e74-efd4-1363-48be9a05330e.png)

### fontawesomeパッケージにない新しいフォントを表示させる

さて、少し困ったことにfontawesomeパッケージで定義されているフォントは本家のものと比べると種類少ないです。というわけで新しく定義してより好みのフォントを表示させます。

いつものようにプリアンブルに

```tex
\providecommand\faSlideshare{{\FA\symbol{"F1E7}}}
```

とし、フォントを表示させたい位置で

```tex
\faSlideshare
```

とします。上の例では[Slideshare](http://fortawesome.github.io/Font-Awesome/icon/slideshare/)のアイコンを表示します。`\symbol{"F1E7}`の部分を好みのものと変えて、fontawesomeのフォントに対応できます。

### Tips

* 色をつける... ` \textcolor{cyan}{\faTwitter}`
* 文字と組み合わせる（CSS的な処理）... `\Huge{\faCalendarEmpty}\textcolor{red}{{\Large{\hspace{-7mm}23}}}`
* 回転.... `\rotatebox{90}\faPlay`（三角形がないので再生マークを回転させて代用）
PHPで「Fatal error: Class 'mysqli' not found」と出た時の対処法


PHPでmysqliを使おうとした時、こんなエラーが表示された。

```
Fatal error: Class 'mysqli' not found
```

どうやら、mysqliモジュールが有効になってないのが原因らしい。

# php.iniを編集する

php.iniを編集し、モジュールを有効化する。

```
$ vim /usr/local/lib/php.ini
```

先頭のセミコロンを消す

```
;extension=php_mysqli.dll
```

↓

```
extension=php_mysqli.dll
```

しかし、また同じエラーが出た。

# mysqliをインストール

そもそもmysqliモジュールをインストールしてなかったのでphpを再インストール
phpのソースが置いてある場所に行き、configureする時に`--width-mysqli`というオプションをつけるとインストールできる。

```
$ cd /usr/local/src/php-5.6.0
$ make clean
$ ./configure --enable-mbstring --with-apxs2=/usr/local/apache2/bin/apxs --enable-pdo --with-gd --with-png-dir=/usr/local --with-jpeg-dir=/usr/local --with-mysql --with-mysqli
$ make
$ make install
```

参考
http://php.net/manual/ja/mysqli.installation.php
raspberry piとcronとスピーカーで総額9000円位の目覚まし(mac)


## 必要なもの

### セットアップのみ
- ディスプレイ
- キーボード
- マウス
- HDMIケーブル

### ずっと使うもの(amazonで調達可)
- raspberry pi 2 model b + 6000円くらい
- usbのwifi 1500円くらい
- micro sdとsdアダプタ1500円くらい
- micro usbケーブル
- イヤホンかスピーカ

## raspberry piにraspbianをインストール
### 公式サイトからOS raspbianをインストール
インストール方法は公式サイトが一番丁寧でわかりやすいので要確認
### なんとなくsdのlabel名変更
### sdカードをformat
### sdカードをunmount
umount(unmountではない)が使えないのでmacのdiskutil使う
### sdにddコマンドでインストール ### 全部つないで、sd入れてmicro usbつなぐと起動
### 設定画面になるので、sdの容量いっぱいまで使う
### 再起動でコマンドライン起動

## ssh接続
### startxでGUIを起動出来る
### GUIでwifi接続すると楽、CUIでも出来る
### sudo apt-get install avahi-daemon
### 上記のデーモンのお陰でssh pi@raspberrypi.localとホスト名でssh接続できるようになる
### 以下ssh接続すれば、ディスプレイ、キーボード、マウスなしで出来るようになった

## 余談
### vim入れる、vimをdefault editorにする
### macからGUIを見られるようにtightvncserver等のvncソフト入れる
### raspbian側でtightvncserverで起動する、初回は設定画面、mac側でfinder > 移動 > サーバー接続からvnc://raspberry.local:5901でつなぐ(vnc://ホスト名.local:5901)

## 音声再生確認
### raspi-config > advanced setting > soundからイヤホンジャックをdefaultにする
### say '文字列', aplay ~.wmv, mpg321 ~.mp3で音声再生できるか確認
### alsamixerで音量調節

## cronに登録
### postfixをインストール
### crontab -eで先ほどのコマンドを鳴らしたい時間に登録
*/1 * * * * mpg321 /usr/share/scratch/Media/Sounds/Music\ Loops/Techno2.mp3
コマンド一発で自己署名証明書を作成するRubyGem

# 目的
自己署名証明書を作るのにOpneSSLのコマンドを毎回叩いて、定型的な情報を入れるのが手間だったので、コマンド一発で作成してくれるツールを作成しました。

ソース
https://github.com/0xfffffff7/secret_generator

# インストールと実行

Macの場合

```
$ brew install brew-gem
$ gem install secret_generator
```

Ubuntuの場合

```
$ sudo apt-get install gem
$ gem install bundler rdoc
$ gem install secret_generator
```

実行

```
 $ secret_generator
```

これだけでカレントディレクトリに秘密鍵証明書と公開鍵証明書が生成されます。
証明書のCommonNameはそのマシンのホスト名です。
有効期限は10年です。

```
public.key
secret.key
```

ホスト名指定実行もできます。
ワイルドカード証明書などはこれで作るといいかもしれないです。

```
$ secret_generator [hostname]
```
すべてのscreenを消す One liner


勉強がてらOne linerでやりたくなったのでやってみる。

```
screen -ls | grep Detached | awk '{ print $1}'| xargs -L 1 -I % screen -S % -X quit
```


他にもあった。
http://stackoverflow.com/questions/14447131/kill-all-detached-screen-sessions

```
screen -ls | grep pts | cut -d. -f1 | awk '{print $1}' | xargs kill
```
【知らなくて】僕がRuby on railsを使ってRESTfulなAPIを作ろうとしたら【m9(^Д^)ﾌﾟｷﾞｬｰされた】


#概要

どうもお疲れ様です。

RailsでAPIを作ることになったので、
とりあえずガチャっと作ってみました。

その後に **RESTの制約** というものを友達に教えてもらいました。

ｼﾗﾅｶｯﾀ／(^o^)＼ﾅﾝﾃｺｯﾀｲ(ﾟдﾟ)情弱ｼﾞｮｳｼﾞｬｸｩ！

なんかAPIを作る時にRESTという制約に沿ってRESTfulなAPIを作るほうが
ある程度ルール化されているので、
今後の拡張方針に迷わず
「get post put delete」を使い分けできる。というもの？
らしいです。よくわからんな。

RESTfulなAPIじゃなきゃAPIじゃない！
というわけではないです。RESTfulなAPIが必ずしも
絶対的に良いAPIというわけではないんだ....（苦笑）

というわけで、絶対的に良いわけではないですが
RESTfulをひとまず勉強してみたいと思います。


# なぜRESTfulを目指すのか。

この辺を読んどけばまるっと解決。

[参考：RESTfulなAPIの設計を学ぼう @IT](http://www.atmarkit.co.jp/ait/articles/1310/23/news078.html)

[参考：RESTとRailsスタイル　@SlideShere](http://www.slideshare.net/tkawa1/restrails)

[参考：RESTful Web サービスの基本 @IBMdeveloperWorks](http://www.ibm.com/developerworks/jp/webservices/library/ws-restful/)

今北産業ってかたは

httpのステータスコードを有効に活用する方が
シンプルに作れるルールがきちんと決まってるんだから、
それを利用しようじゃないか！

というような感じです。
補足するなら、


# RESTfulにするために抑えておくポイント

![図1　顧客APIコントローラ・クラスが定義するAPI　@IT](http://image.itmedia.co.jp/ait/articles/1310/23/dt-01.gif "図1　顧客APIコントローラ・クラスが定義するAPI　@IT")

基本的にはこういう風に設定する。ということっぽいですね。
HTTPメソッドとして、

何かデータを取得するAPIならGET

APIを通じてデータの更新をするときはPUT

[追記　：　Yahagi様のコメントより]
Railsでは更新にはPATCHを扱うようです。勉強不足でした...！

データの追加はPOST

削除はDELETEのようにすることを心がけてAPIを作る事が

RESTfulにする方法です。

こうしてみるとすごく簡単ですね。

# 僕が作ったAPI（悪い例）

しかし、そんな簡単な事も知らないでAPIを初心者が作るとどうなるか。
凄いGET天国になります☆（というかGetとPostしか無い。）

...まぁ思いましたよ。
postとかputもあるのにgetだけで動かして果たして良いのかと。
でもGETにしとけば全部動くからいいかなって思って...(´；ω；｀)（猛省）

というのも僕のような初心者が前提知識なしにAPI等に取り組むと下記のような症状が出ます。

- ステータスコード？なにそれ！

残念ながら僕は数カ月前までは知りませんでした...。
知らぬは一時の恥なのでバンバン晒していきますよー。

- HTTPメソッド？何が違うの？

ステータスコードを知らないので優位性が分からないのです('A`)

- getで適当にtrue,false返しておけば判断できるでしょう！

ステータスコードで可否が判断できないからそういうことをしてしまうのです('A`)
別にそれが絶対悪（例えば、複雑な判定結果をどうしても渡したい時とか）ってわけじゃないんですが
ただ単純に可否だけ見たいならステータスコードを返すだけで、無駄な通信を発生させずに
済むわけです。


# RESTfulなAPIにする。

RESTfulなAPIにする。ということは
言い換えればAPI一つ一つにきちんとした役割を設定するということです。

所謂、「状態」で挙動が変化しないAPIを作るため必要です。（ステートレスなAPI）

明示的にhttpメソッドを使うことで
httpの本来持つステータス・コードを有効に活用することができるし、
利用法が明示的になるので、メソッドの種類でおおよその動きがわかります。

さらにコンテンツタイプもしっかり明示できたら、これほど明示的なAPIはないですね！

だから、皆RESTfulなAPIづくりを頑張るんですね。

稚魚エンジニアがまた一歩成長しました。

自分から見つける技術ってかなり幅が狭いです。
やはり人との繋がりは大事ですね！

ここまで調べると逆にRESTfulだとあまり良くない（不適切）例。というのが気になりますね。
ちょっと調べてみますか....このへんの話はまた機会を見て（僕も勉強が足りないので）

[追記　：　miyabisun様より]
[少しずつですが『Web を支える技術』を読んでいます @Programming log - Shindo200](http://shindolog.hatenablog.com/entry/2012/12/10/193000)
このかたの解説が参考になるらしいです。僕もすぐ読んで勉強してきます(｀・ω・´)

それはであであ。
React Nativeのデバッグ方法


[ドキュメント](http://facebook.github.io/react-native/docs/getting-started.html)を探しても見つからず、ググったらStack OverFlowにありました。
http://stackoverflow.com/questions/29289304/how-do-you-debug-react-native

>Cmd+D from within the Simulator. It'll popup Chrome and from there you can use the Developer Tools.

こんなのどこに書いてあるんでしょうね。

ということでシミュレーター上で```Cmd+D```を叩いてみます。
![スクリーンショット 2015-03-28 1.32.43.png](https://qiita-image-store.s3.amazonaws.com/0/2569/4ed91321-c0de-90be-817d-bde5679ea6d6.png "スクリーンショット 2015-03-28 1.32.43.png")

すると、chromeでこんな画面が立ち上がります。
![スクリーンショット 2015-03-28 1.28.52.png](https://qiita-image-store.s3.amazonaws.com/0/2569/5b7878ec-e275-44cc-64c7-be366b5a0a78.png "スクリーンショット 2015-03-28 1.28.52.png")

メッセージの通りChromeのDeveloper Toolsを起動します。
index.ios.jsというファイルを開くとソースの中身が見れます。
![スクリーンショット 2015-03-28 1.30.13.png](https://qiita-image-store.s3.amazonaws.com/0/2569/dabd1a89-19e0-4f90-feca-38b077266476.png "スクリーンショット 2015-03-28 1.30.13.png")

任意の場所にブレークポイントを置いてアプリを```Cmd+R```でリロードしてみると、ちゃんとブレークポイントの位置で止まりました。右側に変数の値も出てます。
![スクリーンショット 2015-03-28 1.30.59.png](https://qiita-image-store.s3.amazonaws.com/0/2569/d65509ae-0795-15e9-e1bb-0ebea831c7f9.png "スクリーンショット 2015-03-28 1.30.59.png")

アプリのデバッグをChrome Developer Toolsから行うというのがなんともユニークですね。
PHPのGeoIPで国判定

## GeoIP2
現在はGeoIPは廃止されてGeoIP2に移行しています。
https://packagist.org/packages/geoip2/geoip2

EXampleの「GeoIP2-City.mmdb」はこちらからダウンロード可能です。
https://dev.maxmind.com/geoip/geoip2/geolite2/





## GeoIP ※以下、現在は利用できない内容です。
PHPでの国判定のメモ。

GeoIPについては、Googleで「GeoIPとは」と検索すればGoogle先生が親切に答えてくれます。
また、PHPのGeoIPの詳細については[マニュアル](http://php.net/manual/ja/book.geoip.php)を参照してください。

今回は環境はPHP5.6系とComposerを使用し、無償版を対象としています。
使用するComposerのパッケージは[こちら](https://packagist.org/packages/geoip/geoip)。

まず、下準備としてMaxMin社の[サイト](http://dev.maxmind.com/geoip/legacy/geolite/)から「GeoIP.dat」をダウンロードします。
ダウンロード対象は「**GeoLite Country**」です。


次に、Composerでパッケージをインストールします。

```composer.json
{
    "require": {
        "geoip/geoip": "dev-master"
    }
}
```

残りは簡単です。
これだけのコードで二文字の国名コードを取得できます。
日本だったら「JP」、アメリカだったら「US」、イギリスだったら「GB」といった具合です。

```sample.php
$gi = geoip_open('GeoIP_dat_path/GeoIP.dat', GEOIP_STANDARD);
$country = geoip_country_code_by_addr($gi, $_SERVER['HTTP_X_FORWARDED_FOR']);
geoip_close($gi);
```

他の関数等はsrc/geoip.incを見れば取得内容や関数等は確認できます。
ただし、IPがヒットしなければ国名コードが取得できない事があるので注意してください。

GeoIPデータベースの更新頻度やツール、有償版のコマンドはここに書いてあるので参考にしてみてください。
参考サイト：http://flatray.com/geoip/
Vagrant で Rails するなら Ruby のインストールは rvm1-ansible 使えばいいんじゃないの

コレね。

https://github.com/rvm/rvm1-ansible

> # rvm/rvm1-ansible
> 
> The official ansible rvm role to install and manage your ruby versions.

rvm はコンパイル済みなので、ビルドする必要がある rbenv なんかよりは格段に早いって書いてあった気がする。（あってる？ ＞ Rubyなひと）

# 使い方

Ansible が入ってれば

```lang:bash
$ ansible-galaxy install rvm_io.rvm1-ruby
```

で導入できる。

利用は playbook の roles に一行だけ書くだけでOK。

```lang:provision/playbook.yml
- hosts: default
  remote_user: vagrant
  sudo: yes
  roles:
    - { role: rvm_io.rvm1-ruby, tags: ruby, sudo: True }
```

Ruby のバージョンを指定するのも、こういうの足すだけ。簡単。

```lang:provision/playbook.yml
  vars:
    rvm1_rubies:
      - 'ruby-2.2.0'
```

他の roles も書いて Vagrantfile の provision に入れとけば、 ```git pull``` → ```vagrant up``` の２つ叩けば、ものの数分で rails 動く。（じゅうぶん早いので、気軽に destroy できていいと思う。）

```lang:Vagrantfile
  config.vm.provision "ansible" do |ansible|
    ansible.inventory_path = "provision/hosts"
    ansible.playbook = "provision/playbook.yml"
  end
```

# いいわけ

なんでか知らんけど、このツールに言及してる日本語の記事が見当たらないので、書いておくのだけど。

ぼく普段は Ruby 使うひとじゃないので、これが使われてない理由とかが仮にあっても、知りません。悪しからず。
DatabaseRewinderでseedなど消さないで欲しいデータがいる場合の対処方法

* seedで入れたデータがtest DBのテーブルに入っている
* どういうわけか、ユーザーがそのテーブルに追加する箇所があり、そのテストを書きたい

## DatabaseRewinderの動きをおさらい

DatabaseRewinderは、そのテストが走っている時に実行された **1. INSERT文を監視して[対象テーブルを記憶](https://github.com/amatsuda/database_rewinder/blob/a970127d97714fb0f1295555d63f616e302d4a3a/lib/database_rewinder.rb#L53)** して、 **2. DatabaseRewinder.clearしたときにその対象テーブルに対して[DELETE文を発行](https://github.com/amatsuda/database_rewinder/blob/a970127d97714fb0f1295555d63f616e302d4a3a/lib/database_rewinder/cleaner.rb#L49)する** 

## 問題が起きるシーン

テストの中で、seedで入れたデータが存在するテーブルにデータを追加する場合、 **INSERT文が発行される** ので、DatabaseRewinderの削除対象となってしまい、seedで入れたデータが失われる。

## 解決方法

DatabaseRewinderが以下のように設定されているという前提

```spec/rails_helper.rb
RSpec.configure do |config|
  config.before(:all) do
    DatabaseRewinder.clean_all
  end

  config.before(:each) do
    DatabaseRewinder.clean
  end
end
```

テストの中で、以下の様な `after` 処理を用意しておく。

```hogehoge_spec.rb
  after :each do
    # このtest内でpiyopiyo_categoryを増やすがDatabaserewinderの対象としない
    DatabaseRewinder.cleaners.each do |cleaner|
      cleaner.inserted_tables.reject!{|table| table.match /piyopiyo_categories/}
    end
    # 増やした分 = user_id: 0以外を消す
    PiyoPiyoCategory.where.not(user_id: 0).delete_all
  end
```

## 根本解決

* seedもfactoryですべて用意する
* `before :each`で流せるレベルのコンパクトなテスト用seedを用意する
* **設計の段階でマスターデータの存在するテーブルとユーザーが追加しうるデータを混在させない**
mongodb に OpenStreetMap データを取り込み（goosm利用）＋近傍検索

こんにちは。
mongodb に OpenStreetMap データを取り込んでみました[^1]。Go言語の [goosm] (https://github.com/bocajim/goosm) （その内部では [mgo](https://labix.org/mgo) 利用）を利用しました[^2]。

[^1]: ちなみに ArangoDB を用いた参考例は： "[Using The New ArangoDB Geo Index Cursor via AQL](https://www.arangodb.com/learn/development/using-arangodb-geo-index-cursor-via-aql/)"
[^2]: ちなみにMacOSXではhomebrewを使って導入可能です。

インデックス {"loc.coordinates": "2d"} を付ける前後で検索速度の大幅な効果を体感してみました。また指定円内の ways, nodes を検索し地図上に重ねてみました。
![test.jpg](https://qiita-image-store.s3.amazonaws.com/0/54617/6f8ce706-627f-e249-3c3f-bc2ee89772df.jpeg)

なお OpenStreetMap データ内の異常(?)に気がついたのですが、線分の両端の vertex が同一経緯度値を持っている場合（従って点へ縮退）がわずかに含まれていて、何か対策が必要かと思います。

```
$ wget http://download.geofabrik.de/asia/japan-latest.osm.bz2
$ go run goosm.go -f japan-latest.osm.bz2 -db osm
   [6時間以上かかった]

$ mongo osm_ways
MongoDB shell version: 3.0.1
connecting to: osm_ways
> show dbs
local        0.000GB
osm_nodes    5.479GB
osm_ways     1.816GB
> show collections
data
> db.data.ensureIndex({"loc.coordinates": "2d"})
{
	"createdCollectionAutomatically" : false,
	"numIndexesBefore" : 2,
	"numIndexesAfter" : 3,
	"ok" : 1
}
> db.data.getIndexes()
[
	{
		"v" : 1,
		"key" : {
			"_id" : 1
		},
		"name" : "_id_",
		"ns" : "osm_ways.data"
	},
	{
		"v" : 1,
		"key" : {
			"loc" : "2dsphere"
		},
		"name" : "loc_2dsphere",
		"ns" : "osm_ways.data",
		"2dsphereIndexVersion" : 2
	},
	{
		"v" : 1,
		"key" : {
			"loc.coordinates" : "2d"
		},
		"name" : "loc.coordinates_2d",
		"ns" : "osm_ways.data"
	}
]

> db.data.find({"loc": { "$near": { "$maxDistance": 25.0, "$geometry": { "type": "Point", "coordinates": [139.710001, 35.690283] } } } , "tags.name": {"$regex": "^花"}}).count()
2
> db.data.find({"loc.coordinates" : { "$geoWithin" : { "$centerSphere" : [ [139.710001, 35.690283] , 0.00000392 ] } } , "tags.name": {"$regex": "^花"}}).count()
2
```

注：```0.00000392 radians = 25.0/6378137.0```
なお、goosm.go は *.osm.bz2 を読み込めるように少し改造。


mongod は前もって手動起動しました。

```
$ ulimit -n 2048 && mongod --config /usr/local/etc/mongod.conf &
$ cat /usr/local/etc/mongod.conf
systemLog:
  destination: file
  path: /usr/local/var/log/mongodb/mongo.log
  logAppend: true
storage:
  dbPath: /usr/local/var/mongodb
  engine: wiredTiger
net:
  bindIp: 127.0.0.1
  http:
    enabled: true
    RESTInterfaceEnabled: true

```

なお、mongodb への取り込みについて、OSMImport (https://github.com/ederoyd46/OSMImport) というものもあるようですね。ほかにも情報があるようです（http://wiki.openstreetmap.org/wiki/Databases_and_data_access_APIs ）。
自分なりのAtomの環境設定

前にちょっと使った事のあるAtomだけれど、全体的に便利だが、かゆい所に手が届かないエディタだった印象。
結局Sublimeに戻ってしまったが、再度Atomの環境を整え直すことにした。

##基本の設定
フォントはRicty,14px表示,Line Heightは1.2
SoftTabはオフ
Tab Length 2
Tabに関しては、色々と論争があるみたいですが個人でモノ作る上ではtabで良いかなって思っています。
(プロジェクトで決まってるならそれで合わせるべき)
spaceだと削除するとき2回押さなきゃいけないし、そこで数とか間違ったら更に面倒くさいですし。
最悪渡す時にtabをspaceに置換しちゃえば問題ないんじゃないと思ってしまう口です、はい。

##Packagesを探してinstallする
AtomではPackagesをinstallする際は`command`+ `,`で環境設定画面を開いてInstallへ移動し、Install Packagesの下の入力欄にPackage名を入れてinstallする。もしくはTerminalかで`apm search hogehoge`と叩いてガシガシ入れていく。
 
###[tabs-to-spaces](https://atom.io/packages/tabs-to-spaces)   
spaceをtabに置換したり、またその逆を行う為のパッケージ。
`command` + `shit` + `p`でコマンドパレットを開いて、`tabs`と入力すると置換できる。  
`Tabify`でSpace → Tab
`Untabify`でTab → Space
`Untabify All`で全てのTabをSpaceに置換

###[highlight-column](https://atom.io/packages/highlight-column)
インデントした時の縦軸をハイライトしてくれる。普段jadeやstylusでソースを書いているので、インデントがずれるとエラーを吐いてしまう。
最初は違和感を感じるけれど、jadeやstylusで書いてるって人にはオススメだと思う。

###[Emmet](https://atom.io/packages/emmet)
コード書くときは最早外せないプラグイン。Zen-Coding時代からお世話になっている。
`tab`or `control`+`e`で展開されるが、後者は行末への移動のショートカットとかぶってしまうので、無効化する。
というわけで、以下の記述を追加する。

```keymap.cson
'atom-text-editor:not([mini])':
  'ctrl-e': 'editor:move-to-end-of-line'
```

これで`tab`で展開して、`control`+ `e`で行末へ移動ができる。
これは正直プラグインのデフォルト設定にして欲しいレベル。

###[resize-pannel](https://github.com/santip/resize-panes)
Atomで画面分割した後に、分割した画面の領域を可変にするパッケージ
Sublimeみたいにドラッグで表示領域を変更したりはできないです。
ちょっと挙動がややこしいですが、表示領域を変更できるだけいいかな〜という感じです。

## 感想
UI的にはSublimeよりAtomの方が好きなのですが、安定感やパッケージの豊富さを考えるとSublime
の方がまだ実用的なのかなーと思います。

SublimeのInputSequenceみたいなプラグインAtomでもあったらなぁ....
なんだかんだまたSublime使いそうです。
【c++】激震が走った、Pimplイディオム

[元ブログ 【c++】激震が走った、Pimplイディオム - 技術は熱いうちに打て！](http://blog.dalt.me/1143)

今日<a href="http://www.amazon.co.jp/gp/product/4797369159/ref=as_li_qf_sp_asin_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4797369159&linkCode=as2&tag=dalt1003-22">C++のためのAPIデザイン</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=dalt1003-22&l=as2&o=9&a=4797369159" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
を読んでいて、激震が走りました。


C++では**嫌でもprivateな変数や関数も.hファイルに宣言する必要がある。**


そう思っていた時期が僕にもありました。

でも、違うんです。

どうやらPimplと言うイディオムを使うとcppファイルに隠蔽出来るそうです。

## Pimpl導入前のコード

簡単な例で示してみましょう。
ここにHogeと言うクラスがあり、インスタンス化されたらhogeと出力されるクラスがあります。

```cpp:Hoge.h
// Hoge.h
class Hoge
{
public:
    Hoge();
    ~Hoge();

private:
    void printHoge();
};
```

```cpp:Hoge.cpp
#include "Hoge.h"

Hoge::Hoge()
{
    this->printHoge();
}

Hoge::~Hoge() {}

void Hoge::printHoge()
{
    CCLOG("hoge");
}
```

## Pimpl導入後のコード
 
```cpp:Hoge.h
class Hoge
{
public:
    Hoge();
    ~Hoge();

private:
    class Impl;
    std::unique_ptr<Impl> hoge;   ...Ⅰ
};
```

```cpp:Hoge.cpp
#include "Hoge.h"

class Hoge::Impl
{
public:
    void printHoge();
};                                ...Ⅱ

Hoge::Hoge()
    : hoge(new Hoge::Impl())      ...Ⅲ
{
    this->hoge->printHoge();      ...Ⅳ
}

Hoge::~Hoge() {}

void Hoge::Impl::printHoge()      ...Ⅴ
{
    CCLOG("hoge");
}
```


### 解説

導入後のコードを見て下さい。
注釈しているところが主な変更点です。

### ヘッダファイル

...Ⅰ
まず、privateでclass宣言します。
名前はなんでも良いと思います。
Hogeクラスでprivateに行いたい動作を記述するクラス名となります。
ヘッダファイルではこのクラスのインスタンスを宣言するところまでを記述。

### 実装ファイル

...Ⅱ
- 新しいクラスのインターフェースを宣言します。
publicにしないとHogeクラス内からでも使えないので注意。

...Ⅲ
- 新しいクラスをコンストラクタでインスタンス化します。

...Ⅳ
- 新しいクラスのインスタンスを通じてメソッドを呼び出します。

...Ⅴ
- もともとHogeクラスでprivateで行いたかった実装をここに書きます。

## あとがき

これはかなりの衝撃でしたね。
僕はObjective-CからC++に来ました。
Objective-Cではヘッダに書かずに.mファイルに直接実装すればprivateな関数になっていたのですが、C++ではヘッダファイルに宣言のみ書かなければいけないと言う制約。
でもこのPimplでそのストレスからも解放されそうです。

誰かのお役に立てば。
これは立つでしょう！！
std::enable_ifを使ってオーバーロードする時、enablerを使う？

[本の虫:C++0xにおけるenable_ifの新しい使い方](http://cpplover.blogspot.jp/2011/04/c0xenableif.html)

今回のネタ元は言わずと知れたC++erの江添氏のブログからですが、テンプレート引数の型の特性によってオーバーロードする方法として、`enabler`という変数を使う方法が紹介されています。
実際、[以前の記事](/kazatsuyu/items/38203287c19890a2b7c6)でもこんな感じで活用しています。

```cpp:c++
extern void* enabler;
template<bool condition, typename T = void>
using enable_if_type = typename std::enable_if<condition, T>::type;

// 符号なし整数型を受け取るオーバーロード
template<typename T, enable_if_type<std::is_unsigned<T>{}>*& = enabler>
inline constexpr int ntz(T val) noexcept;

// 符号付き整数型を受け取るオーバーロード
template<typename T, enable_if_type<std::is_signed<T>{}>*& = enabler>
inline constexpr int ntz(T val) noexcept;

// 列挙型を受け取るオーバーロード
template<typename T, enable_if_type<std::is_enum<T>{}>*& = enabler>
inline constexpr int ntz(T val) noexcept;

```

さて、上記のブログで`enabler`を受け取る型を`int`などではなく`void*&`にしなければならない理由が説明されています。

> しかし、なぜvoidへのポインターへのリファレンスなのか。以下の形ではだめなのか。
>
> std::enable_if<条件, int>::type = 0
>
> これは動くが、ユーザーが誤ってテンプレート実引数を明示的に渡してしまうかもしれないというおそれがある。その点、void &&という型は、まず現実に使われないので、安全である。およそ、void *&が一体どういう型であるかを理解できるようなユーザーであれば、このenable_ifのテクニックも理解できるほどのC++上級者なので、やはり間違えることはない。

途中`void &&`になっていますが`void *&`のことだと思います。
要するに、こういうことでしょう。

```cpp:c++
template<typename T, enable_if_type<std::is_unsigned<T>{}, int> = 0>
inline constexpr int ntz(T val) noexcept;

ntz(10u); //(1)
ntz<unsigned int, 1>(10u); //(2)

//(1)と(2)は別の実体化
```

まあ、この例であれば、別の実体化をされたところで結果は変わらないのですが、確かにこれはちょっといただけません。場合によっては（関数内部でstatic変数が定義されている場合など）動作もおかしなことになる可能性があります。
ですが、void*&だってenabler以外の何かが渡される可能性は0ではないのです。

```cpp:c++
extern void* enabler;
extern void* other_enabler;
template<typename T, enable_if_type<std::is_unsigned<T>{}>*& = enabler>
inline constexpr int ntz(T val) noexcept;

ntz(10u); //(1)
ntz<unsigned int, other_enabler>(10u); //(2)

//(1)と(2)は別の実体化
```

もちろん江添氏が言及している通り、間違える可能性はほぼないとは思いますが。

調べていたら、こんな意見も見つけました
[野良C++erの雑記帳: C++0x の SFINAE で気づいたこと](http://d.hatena.ne.jp/gintenlabo/20110825/1314303669)
void*&ではなくvoid*を使えばいいじゃない、という記事です。
確かにこれでも問題なさそうに見えるのですが、しかしよく考えたらまだ少しだけ危険です。

```cpp:c++
template<typename T, enable_if_type<std::is_unsigned<T>{}>* = nullptr>
inline constexpr int ntz(T val) noexcept;

ntz(10u); //(1)
ntz<unsigned int, (void*)1>(10u); //(2)

//(1)と(2)は別の実体化
```

明示的なテンプレート実引数を渡されてしまう危険性は、完全には排除できていません。
もっとも、ここまでして明示的なテンプレート実引数を渡そうとする人もいないとは思いますが……。

でもよく考えたらこれって、別の値が渡せる型を使っているからそういう事を考えなければならないのです。
つまり、その型の表せる値が一種類であれば、問題はありません。
そしておあつらえ向きに、C++11からコア言語入りした、「値が一種類しかない型」というものが存在します。
要するに、`std::nullptr_t`を使えばいいじゃない、ということです。

```cpp:c++
template<typename T, enable_if_type<std::is_unsigned<T>{}, std::nullptr_t> = nullptr>
inline constexpr int ntz(T val) noexcept;

ntz(10u); //(1)
ntz<unsigned int, nullptr>(10u); //(2)

constexpr std::nullptr_t x = nullptr;
ntz<unsigned int, x>(10u); //(3)

//(1)と(2)と(3)は同じ実体化
```

`std::nullptr_`tに渡せる値はどうあがいても`nullptr`だけなので、例えテンプレート実引数を明示的に渡されても、実体化されたテンプレートは一つだけになります。
こうすればそもそも`enabler`を用意する必要もありません。

もともと2011年の記事なので、もしかしたらこれって今更感あふれるネタだったりするのかな、とか思いながら書いてみましたが、最近のboost界隈ではどういった設計が主流なのでしょうか。
これはいけないとか、こうするといいとか、何か意見がありましたらぜひ聞かせてください。

ドワンゴは本物のプログラマを募集しているらしいです。
Spring MVCでクエリパラメータ名をhoge[]みたいにすると果てる

メモです。

## 背景

`@RestController` で REST な API をつくって、以下みたいなリクエストを受け取るとする。

```
GET /foo?hoge[]=1&hoge[]=2
```
jQuery の $.param とかで、`$.param({hoge: [1, 2]})` すると上記のパラメータ文字列になるので良くある形式なのだと思う。

ところが、SpringMVC で上記を `@ModelAttribute` でうけ取ろうとすると `NumberFormatException` になって `InternalServerError` になる。
`@RequestParam` なんじゃないか？という話もあるけど、`@Validated` によるバリデーションをかけつつ、DTO にマップしたいので `@ModelAttribute` を使う。

DTO への値設定時に、パラメータ名をプロパティ名とみなして設定するのだけど、`[]` は配列アクセスとみなして、`[` と `]` の間にインデクスが入っている前提で処理される。実際にはなにも入っていないので、空文字を整数に変換しようとして `NumberFormatException` になる。
あと、対象プロパティが `Set<...>` の場合も、`InvalidPropertyException` が発生したりする。

`@ExceptionHandler` で `NumberFormatException` を拾えるが、発生状況がクエリパラメータの処理時に限定できないので、本当に ISE の場合も気づけなくなってしまう。

思うに、`@ModelAttribute` による値のバインドは、REST API で使われることは想定していない。普通のフォームからの POST とかみたいに、呼び出し元もおなじシステム(≒開発者が入力値をコントロール可能)であることを前提としているのかと思う。

ただ、REST API のときに、適当なクエリパラメータで ISE おこせるとかイケていないので、とりあえず何とかする。

## 方法

SpringMVC ではコントローラメソッドの引数を解決するための部品として `HandlerMethodArgumentResolver` というのがある。`@ModelAttribute` だったり `BindingResult` だったり、どれもこの仕組でコントローラメソッドの引数に提供されている。

この `HandlerArgumentResolver` に自作のものを追加し、パラメータ処理時の NumberFormatException に限り、違う例外でラップして再送出する。

```java
@Configuration
public class XxxxConfiguration {
    @Bean
    public WebMvcConfigurer getConfigurer() {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolver) {
                argumentResolver.add(new HandlerMethodArgumentResolver() {
                    private final HandlerMethodArgumentResolver underlying = new ServletModelAttributeMethodProcessor(false);

                    @Override
                    public boolean supportsParameter(MethodParameter parameter) {
                        // Default の ArgumentResolver の方が優先順位が高いので、ModelAttribute.class を目印にすると、デフォルトの方で処理されてしまう
                        return parameter.hasParameterAnnotation(なんか自作のアノテーション.class);
                    }

                    @Override
                    public Object resolveArgument(MethodParameter parameter, .....) throws Exception {
                        try {
                            return underlying.resolveArgument(parameter, mavContainer, webRequest, binderFactory);
                        } catch (NumberFormatException ex) {
                            throw new なんか自作の例外(ex);
                        }
                    }
                });
            }
        };
    }
}
```

たぶんこんなんじで、なんとかなる。
DrupalのMetatag管理モジュールについてのメモ


## 結論

たぶん [i18n support for Metatag submodules (Views, Context, Panels)](https://www.drupal.org/node/1986032 "i18n support for Metatag submodules (Views, Context, Panels)") が修正されれば解決する。
時間がないのでしかたなくTheme Functionで直接ヘッダに書き込む。
時間ができたらこの問題の修正に参加する。


## コンテキスト

マルチリンガルサイトの構築でTheme FunctionやTemplate Fileを修正しない事を前提に対応できるモジュールを探してる。通常のページであれば[Internationalization](https://www.drupal.org/project/i18n "Internationalization")で対応できるんだけど、[Views](https://www.drupal.org/project/views "Views")や[Panels](https://www.drupal.org/project/panels "Panels")で生成されるページだと、複数言語のメタ情報に対応できない。


### 試したモジュール

- [Metatag | Drupal.org](https://www.drupal.org/project/metatag "Metatag | Drupal.org")
	- このモジュールを修正する(OR修正待ち)
	- ユーザが多いのでこっちを使いたい
- [Meta tags quick | Drupal.org](https://www.drupal.org/project/metatags_quick "Meta tags quick | Drupal.org")
	- このモジュールは多言語対応は簡単に出来たけど、ogpに対応できなかった。
	- [Add support to facebook "property"](https://www.drupal.org/node/1408782 "Add support to facebook "property"") が解決する方向でも良い
git remote set-url origin --add で複数リポジトリに同時 push だ

2015年3月27日現在、GitHub に繋がりにくくなっていて大変不便ですね。
こんな時のために日頃から Bitbucket にもコミットするようにしておきましょう。

```shell-session
git remote set-url origin --add ssh://git@bitbucket.org/リポジトリの/パス.git
```

これで git push 一発で GitHub と Bitbucket の両方に push されます。
:poop:
Redmineを使いやすくするためのTips

![Redmine.JP — Redmine日本語情報サイト 2015-03-30 11-43-36.jpg](https://qiita-image-store.s3.amazonaws.com/0/3153/0e1223e8-13be-8b89-61b4-f54f3dee5f9c.jpeg)
[プロジェクト管理ソフトウェアRedmine 日本語情報 (unofficial)](http://redmine.jp/)

WebデザイナーやディベロッパーにRedmineの活用を促す時に、最低限の決め事と、こうすると少し楽に出来るみたいなTipsをまとめたいと思います。

あまり、ルールでガチガチだと脱落者が出てしまうので、あくまでも最低限にとどめたほうが良さそうです。

# 開発にRedmineを取り入れたチケット駆動開発(TiDD)の流れ

1. スケジュールを立てる
2. 仕事を細かく分ける。（これまでの経験上、1人が3日でやれる作業工数がいいと思います。）
3. 分けた仕事をチケット化する
4. チケットを実行する
5. 終了チケットを振り返る
6. 問題点やお客様からの要望、次のフェイズ計画などを反映させる

# チケットの簡単な作り方

CSVでインポートするのが簡単かと思います。
CSV Import Pluginを導入します。
プロジェクトの「設定」画面の「モジュール」タブで、Importerを有効にする。
参考）http://liginc.co.jp/web/tutorial/111766

# 題名の付け方

基本的にルールはありませんが、題名だけで内容を理解できるように書いたほうがいいです。
（カテゴリやバージョンなどを使用すれば、不要な部分もあるかと思いますが、極力題名だけで完結していたほうがいいです。）

例）
・◯◯◯◯の画面設計
・◯◯閲覧権限設定のデフォルト（設定がされていない場合）は初期値が「閲覧」
・【仕様書作成】◯◯業務
・会社概要画面のデザイン
・wordpressの環境設定

# 作業時間の記録

厳密にやっておくとどの作業にどれくらいかかるのかが記録として蓄積されていくので、見積もり作成時や振り返りの時に役立ちます。ストップウォッチで測ってもいいですが、タイムトラッキングのWebサービス[toggl](https://www.toggl.com/)をおすすめしたいです。
![Toggl - Free Time Tracking Software 2015-03-30 11-42-04.jpg](https://qiita-image-store.s3.amazonaws.com/0/3153/47478ea3-9c81-91ec-6d30-46ff81879760.jpeg)

togglの使い方は簡単で、作業内容を記入してスタート、完了したらストップを押すだけ。タグやプロジェクトも設定できるので、細かくやりたい人にもいいかもしれません。

また、Redmineの作業時間を記入するときには、時間単位での入力になりますが、togglでは設定で「◯時間◯分」か「◯.◯時間」が選べるので、Redmineに時間単位で記載するのに便利です。ただ、Redmineは「1:30」のように入力すると1.5時間として変換してくれるのでお好きなやり方でいいかと思います。

# 各プロジェクト、各チケット間の簡単な移動方法

・右上の検索の横のセレクトボックスで移動
・検索窓にチケット番号を入れて移動
![検索.jpg](https://qiita-image-store.s3.amazonaws.com/0/3153/030bdd6b-f622-867c-86fa-c9c44f831120.jpeg)

・Google Chrome の検索エンジン機能
参考）http://qiita.com/kakipo/items/3a9cac0ab3559abdd09e

# 関連するチケットの使い方

次のチケットに先行・・・選択したチケットよりも先にやるチケット。これを設定しておくと前工程のチケットの終了日が遅れると後続するチケットの開始日を自動的に変更してくれます。
次のチケットに後続・・・選択したチケットよりも後にやるチケット。
関連しているチケット・・・関連のあるチケットを登録しておくと便利

# チケットの粒度

1つの成果物を1人が3日以内に作る作業
3日以上かかる場合は、作業を分けるべき！

# バージョン

「バージョン」の単位でグループ化する。
このバージョンは、システム開発のマイルストーンであり、リリースするバージョンでもある。
例）
・バージョン2.0
・2015年4月1日オープン

# チケットの一覧性

・フィルタのかけ方（後日記述）
・オプションの使い方（後日記述）

# 参考サイト

http://www.atmarkit.co.jp/ait/articles/0904/14/news117_2.html
dplyr で DB 使うとき、テーブルをいちいち読み込むのめんどくさい #rstatsj

dplyr でデータベースからデータを取得したいとします。
その時、最初にやることはテーブルオブジェクトの生成です。

```r:R
db <- src_sqlite("my_db.sqlite3")  # DB に接続
flights_tbl  <- tbl(db, "flights") # テーブルオブジェクトの生成
```

実際の DB でやってみましょう。
まずはテスト用 DB を作ります。

```r:R
library(dplyr)
library(nycflights13) # テスト用データベースに入れるデータ

db <- src_sqlite("my_db.sqlite3", create = TRUE)
copy_nycflights13(db) # テスト用の SQLite データベースファイルを生成
```

作成したテスト用 DB に接続してみます。

```r:R
db <- src_sqlite("my_db.sqlite3")
show(db)
```

```:結果
src:  sqlite 3.8.6 [my_db.sqlite3]
tbls: airlines, airports, flights, planes, sqlite_stat1, weather
```

この DB には 6個のテーブルが存在することがわかります。
これらのテーブルからデータを取得したい場合、それぞれのテーブルに対してテーブルオブジェクトを生成してやる必要があります。

```r:R
airlines_tbl <- tbl(db, "airlines")
airports_tbl <- tbl(db, "airports")
flights_tbl  <- tbl(db, "flights")
planes_tbl   <- tbl(db, "planes")
weather_tbl  <- tbl(db, "weather")
```

これって面倒くさいと思いませんか？
よく見るとかなり定型的なコードです。

これを自動でやってくれる関数を書いてみましょう。

```r:R
# DB の全てのテーブルに対してテーブルオブジェクトを生成する
load_tbls <- function(db, envir = parent.frame(), verbose = TRUE) {
  tbl_names <- dplyr::src_tbls(db)
  tbl_obj_names <- sprintf('%s_tbl', tbl_names)
  for(i in seq_along(tbl_obj_names)) {
    tbl_name <- tbl_names[i]
    tbl_obj_name <- tbl_obj_names[i]
    assign(tbl_obj_name, dplyr::tbl(db, tbl_name), envir = envir)
    if(verbose) cat(paste(sprintf("Creating %s ...\n", tbl_obj_name)))
  }
  invisible(NULL)
}
```

先ほど作ったテーブルオブジェクトを消しておきます。

```r:R
rm(list = ls(pattern = "_tbl$"))
ls()
```

```:結果
[1] "db"        "load_tbls"
```

`load_tbls()` を実行してテーブルオブジェクトを生成してみましょう。

```r:R
db <- src_sqlite("my_db.sqlite3")
load_tbls(db)
ls()
```

```:結果
[1] "airlines_tbl"     "airports_tbl"     "db"               "flights_tbl"      "load_tbls"        "planes_tbl"       "sqlite_stat1_tbl" "weather_tbl"
```

テーブルオブジェクトが自動生成されました。

以上です。

### 関連

- [dplyr でデータベースを扱うときの情報をそろそろまとめておく](http://qiita.com/hoxo_m/items/341f499eb4117eec41df)
Nginxのsyslog転送設定でちょっとハマった件

nginxのsyslog転送でちょっとハマったのでポイントをメモします。

# 環境
Amazon Linux AMI release 2013.09
nginx 1.7.6
rsyslog 5.8.10

# ハマりポイント
## syslogtagは英数のみ
試しにtagに`http-access`を指定してみると

```apacheconf:nginx.conf
access_log  syslog:server=転送先サーバのIP:514,facility=local1,tag=http-access,severity=info main;
```

下記のようにNginxさんに怒られます。

```shell-session:console
# /etc/init.d/nginx configtest
nginx: [emerg] syslog "tag" only allows alphanumeric characters in /etc/nginx/nginx.conf:10
nginx: configuration file /etc/nginx/nginx.conf test failed
```
ハイフンぐらい使いたかったよ。。:tired_face: :tired_face: :tired_face:


## 転送はudp

### syslog転送する設定例

#### 転送元設定

```apacheconf:nginx.conf
access_log  syslog:server=転送先サーバのIP:514,facility=local1,tag=httpaccess,severity=info main;
```

#### 転送先設定

```text:/etc/rsyslog.conf
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514

# Provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514
```

```text:/etc/rsyslog.d/nginx.conf
$template access_log, "%msg:2:$%\n"

$template access_log_file, "/var/log/rsyslog/nginx/%hostname%-%fromhost-ip%-access_log.%$NOW%"

if $syslogfacility-text == 'local1' and $syslogtag == 'httpaccess:' then -?access_log_file;access_log
```
あとは、転送元サーバからのUDP:514ポートを解放すればOK:ok_hand:
　　
　　
　　
　　
　　
　　
　　
でも既存のlogサーバはTCPしか受け付けてくれないないんだけど。。:scream:

そんなときは、一旦ローカルのrsyslog等でUDPで受けてからTCPで転送しなおせば大丈夫:smile:

### TCPでsyslog転送する設定例

#### 転送元設定

```apacheconf:nginx.conf
access_log  syslog:server=127.0.0.1:514,facility=local1,tag=httpaccess,severity=info main;
```

```text:/etc/rsyslog.conf
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514

# Provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514
```

```text:/etc/rsyslog.d/nginx.conf
local1.*        @@転送先サーバのIP:514
```

#### 転送先設定

```text:/etc/rsyslog.conf
# Provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514

# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
```

```text:/etc/rsyslog.d/nginx.conf
$template access_log, "%msg:2:$%\n"

$template access_log_file, "/var/log/rsyslog/nginx/%hostname%-%fromhost-ip%-access_log.%$NOW%"

if $syslogfacility-text == 'local1' and $syslogtag == 'httpaccess:' then -?access_log_file;access_log
```

転送元サーバからのTCP:514を解放すること。
PhpStormでGoogle App Engine for PHP開発

PhpStormでGoogle App Engine for PHPの開発環境を構築します。内容は下記の公式ページをベースにしていますが、ここではWindows環境での解説を行います。
[Getting Started with PhpStorm as Google App Engine PHP IDE - PhpStorm - Confluence](https://confluence.jetbrains.com/display/PhpStorm/Getting+Started+with+PhpStorm+as+Google+App+Engine+PHP+IDE)

## 1.事前確認
すでにGoogle App Engine LauncherやPythonがインストールされ、使用できている状態を前提としています。初めて開発を行う場合はGoogle App Engine SDK for PHPとPython version 2.7をインストールします。PhpStormは下記のリンクからダウンロードしてください。

[PHP IDE :: JetBrains PhpStorm](https://www.jetbrains.com/phpstorm/)

30日間は無料で試用できます。解説時のPhpStormのバージョンは8.0.3でした。インストーラーの指示に従ってインストールを完了させ、PhpStormを起動します。


## 2.プロジェクトの作成
PhpStorm8.0.3ではGoogle App Engine Support for PHPプラグインがすでにインストールされているため、すぐにプロジェクトの作成から入ります。Quick Start画面が表示されたら[Create New Project]を選択します。
![quick_start.jpg](https://qiita-image-store.s3.amazonaws.com/0/70925/f837c0fd-684a-bd00-6176-f028b39433e5.jpeg)

Project nameとLocationに任意の値を入れてProject typeをプルダウンメニューから[App Engine Project]を選択します。
![create_new_project.jpg](https://qiita-image-store.s3.amazonaws.com/0/70925/d6bac20d-01b6-eb1e-372a-0f1f6cf0d240.jpeg)

App Engine Projectの画面では以下のように入力します。
![app_engine_project.jpg](https://qiita-image-store.s3.amazonaws.com/0/70925/657e9e2e-4bd4-1406-2eac-95d1c6a7d5de.jpeg)

* Application ID：[Application Overview](https://appengine.google.com/)で作成したアプリケーションID
* SDK directory：C:\Program Files (x86)\Google\google_appengine
* Python executable：Pythonの実行ファイルのパス(ex. C:\Python27\python.exe)

[OK]を押すとプロジェクトツリーにファイルが追加されます。
![project_tree.jpg](https://qiita-image-store.s3.amazonaws.com/0/70925/97f10c4d-65fa-d14b-5ad4-df9732a26509.jpeg)

##3.プロジェクトの設定
メニューの[File] > [Settings]から設定画面を表示させ、左側メニューから[Languages & Frameworks] > [PHP] > [Google App Engine]を選択します。
![settings.jpg](https://qiita-image-store.s3.amazonaws.com/0/70925/0e8feea5-4471-6224-1eb6-6fd59739e2f9.jpeg)

App Engine Account Settingsの[Log in with email and password]にチェックを入れ、Google App Engineを使用しているGoogleアカウントのアドレスとパスワードを入力します。このアカウントでデプロイが行われます。

## 4.実行
ローカル環境で実行するにはメニューの[Run] > [Run]もしくはツールバーのRunボタンをクリックします。初回実行時にはEdit configuration画面が表示されるため以下の値を入力します。
![edit_configuration.jpg](https://qiita-image-store.s3.amazonaws.com/0/70925/78955a5e-84c2-85eb-28c3-9f4e60f99aa0.jpeg)

* Path to php-cgi executable：php-cgi.exeのパス(ex. C:\Program Files (x86)\Google\google_appengine\php\php-5.5-Win32-VC11-x86\php-cgi.exe)
* <font color='#FF6060'>Interpreter options：--skip_sdk_update_check=yes</font>

[Run]を押してブラウザのURL欄にローカルホストの値(ex.localhost:8080)等を入力して実行されているか確認します。

## 5.デプロイ
ローカル環境で動作確認ができたら次にGoogle App Engineへデプロイします。メニューの[Tools] > [Google App Engine for PHP] > [Upload App Engine PHP app...]をクリックするとデプロイが始まります。デプロイが成功したら[Application Overview](https://appengine.google.com/)の[Running]をクリックして動作確認を行います。

それではよいGAE for PHPライフを！
初めてchef recipeを書く人向け、優しいrecipeの書き方。



こんにちは、貴子です。

最近は一ヶ月の半分くらいchefのresipeを書いていたので、
よく使ったrecipeの書き方をまとめて紹介します。

# Install
## package インストール
```ruby:recipe
package "curl-devel" do
  action :install
end
```
## gem インストール
gem_binaryはインストールに使うgemの場所を指定しています。
rbenv等で複数のrubyを使い分けている方は利用してください。

```ruby:recipe
gem_package mackerel-client do
  gem_binary("/root/.rbenv/shims/gem")
  action :install
end
```
## rpm インストール
rpmでのnginxのインストールrecipeです。
まずnot_ifで既にインストールされているか確認して、されてなければremote_fileでrepositoryを取ってきています。
その後rpm_packageでインストールを行います。

```ruby:recipe
# install repo
  remote_file "#{Chef::Config[:file_cache_path]}/nginx-release-rhel-6-0.el6.ngx.noarch.rpm" do
    source "http://nginx.org/packages/rhel/6/noarch/RPMS/nginx-release-rhel-6-0.el6.ngx.noarch.rpm"
    not_if "rpm -qa | grep -q '^nginx-release'"
    action :create
    notifies :install, "rpm_package[nginx-release]", :immediately
  end

 rpm_package "nginx-release" do
    source "#{Chef::Config[:file_cache_path]}/nginx-release-rhel-6-0.el6.ngx.noarch.rpm"
    action :nothing
  end
```
# template
テンプレートを置いて、更新があったらnotifiesで指定したServiceをrestartします。

```ruby:recipe
template "/etc/td-agent/td-agent.conf" do
  mode "0644"
  source td-agent.conf
  notifies :restart, 'service[td-agent]', :delayed
end

# Service restart
service "td-agent"
```
# Download
wgetコマンドでtomcat7を取ってきているところのrecipeです。
tomcat7.tar.gzがpackage_pathにない場合のみ、ダウンロードを実行してもってきます。

```ruby:recipe
package_name = "tomcat-#{tomcat_version}"
package_path = "#{Chef::Config[:file_cache_path]}/#{package_name}.tar.gz"
source_url = "http://archive.apache.org/dist/tomcat/tomcat-#{major_version}/v#{tomcat_version}/bin/apache-tomcat-#{tomcat_version}.tar.gz"

# Download
remote_file package_path do
  source source_url
  not_if { File.exist?(package_path) }
end
```

# attribute
attributeから変数を引き継ぎます。
```ruby:attribute
default["app-base"]["template_name"] = "app-base.conf.erb"
```
```ruby:recipe
app-base_conf = node["app-base"]["template_name"]
```
# 配列
パッケージのインストールをまとめて実行することもできます。

```ruby:recipe
# install basic rpms
%w{ntp wget git screen dstat vim-enhanced tar gzip}.each do |pkg|
  package pkg do
    action :install
  end
end
```
attributeで変数を持たせる場合はこう書きます。

```ruby:attribute
default['app-base']['plugins'] = ["ntp","wget","git","dstat","vim-enhanced","tar","gzip"]
```

```ruby:recipe
node['app-base']['plugins'].each do |plugin|
  package plugin do
    action :install
  end
end
```

#crontab
crontabの設定方法です。

```ruby:recipe
cron "logManager.sh" do
    minute "00"
    hour "01"
    user "root"
    command "/data/shell/logManager.sh"
end
```
こんな感じにcronが設定されます。

```ruby:crontab
# Chef Name: logManager.sh
00 01 * * * /data/shell/logManager.sh
```
std::to_stringやstd::stoi、std::stofがAndroidで使えない時は・・・

Cocos2d-x v3系でもAndroidではto_stringやstd::stoi、std::stofが使えません。
Androidの**NDKにこれらがまだ対応していない**ことが原因のようです。

XcodeでCocosのコードを検索してみると・・・
Cocos2d-xのコード中にこんな表現がありました。

![スクリーンショット 2015-03-27 18.17.09.png](https://qiita-image-store.s3.amazonaws.com/0/57193/5cae829f-83d0-651f-8a78-b1b48995e520.png)


>###std::to_string is not supported on android, using std::stringstream instead.###

###「std::to_stringはAndroidではサポートされていないから、変わりにstd::stringstreamを使ってね。」###
つまりCocos開発者もAndroidでは使えないと言ってます。

##結論：std::stringstreamを使いましょう。
こんな感じで。

```cpp
    int i = 10;
    std::stringstream name;
    name << "name_" << i;
    std::string myName = name.str(); //name_10
```
eclipse + MySQL + JUnit + DBUnit で単体テスト


# 事の起こり
テストをしないでいることに耐えられず、むしゃくしゃしてやった。
反省はしているが後悔はしていない。

## 各種ダウンロード
* Pleiades All in One(Eclipse 4.4 Luna)[^1]
   * 諸般の事情によりUltimate Full Edition
* MySQL用のJDBCドライバ[^2]
   * Platform Independent-ZIP Archiveをダウンロード
   * このサイト[^3]の下半分を参考にした
* JUnit/DBUnit関係のライブラリ
   * ここ[^4]を見ながらやればOK
* 取得したjarファイルは基本的にpleiades/eclipse/pluginsフォルダに入れて、プロジェクトごとにビルドパスを通している
   * もっとうまいやり方があるのかもしれないのであとで探す
   
## データベースの準備
* pleiades/xamppにあるsetup\_zampp.batを実行
* zampp\_control.exeを起動(英語指定)
* Apache→MySQLの順で起動 
* MySQLの横にあるAdminをクリックするとphpMyAdmin起動
* 「データベース」>「データベースを作成する」で適当な名前のデータベースを作成
  * 照合順序はutf8\_unicode\_ciにしておいた
* 作成したデータベースに適当なテーブルを作る
  * DBUnitでデータを入れるので、中身は空でOK

## テスト対象のクラスを用意
### データベースに接続
```java
public static Connection getConnection() throws SQLException {
	Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test","user","pass");
	return conn;
}
```
こんな感じのメソッドを作っておく(例外は適当)。
localhostの後ろのtestはデータベース名。
userとpassはこのあたり[^5]を見ながら編集する。

### その他
* PreparedStatementのプレースホルダにCalendar型の値を入れようとして躓いた
   * date\_format(?,'%Y/%m/%d')と置換え、PreparedStatement#setStringメソッドを使った
   * 何か思い違いをしているような気がする

* 今回はselect文のみのテストだったのでcommitとかrollbackとかは特に何もしていない(後でやる)

## テスト用のデータを作る
プロジェクト直下にdatasetフォルダを作り、そこにcsvファイルとtable-ordering.txtを置いた

### csvファイル
* ファイル名がテーブル名になる
* 1行目がカラム名、2行目以降にデータを書く
* 日付は「2015/03/27」ではなく「2015-03-27」と表記する
  * セルの書式設定でテキストを指定する

### table-ordering.txt
* 拡張子を除いたファイル名を1行に1つ書く
* 書いた順にinsertされるので、外部参照等があるときは順番に気をつける

## テストクラスを作る
```java
@Before
public void setUp(){
	try(Connection conn = getConnection()) {
		IDatabaseConnection dbconn = new DatabaseConnection(conn);
		IDataSet dataset = new CsvDataSet(new File("./dataset"));
		DatabaseOperation.CLEAN_INSERT.execute(dbconn, dataset);
	} catch (SQLException | DatabaseUnitException e) {
		e.printStackTrace();
	} finally {
		if(dbconn != null){
			try {
				dbconn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}
```
通常のテストクラスにこんな感じのメソッドを追加する。
getConnecionメソッドはさっき書いたやつ。
IDatabaseConnectionはAutoCloseableじゃなかったので手作業で閉じる。
データベースに接続して、テーブルをきれいにした後csvファイルの中身を流し込んでいる。らしい。
必要であればtearDownでDatabaseOperasion.DELETE等を実施する。
今回はselect文のみ かつ テスト対象メソッドは「条件に合致する行の有無」を見てbooleanを返すだけなのでデータが入っていればよしとした。

## 参考
[^1]: http://mergedoc.sourceforge.jp/
[^2]: http://dev.mysql.com/downloads/connector/j
[^3]: https://ssl.aiosl-tec.co.jp/java-start/chap11.html
[^4]: http://genesis-tdsg.blogspot.jp/2013/07/dbunit.html
[^5]: http://www.dbonline.jp/phpmyadmin/user/index1.html
kivy-iosメモ kivy v1.8.0 for new toolchain（MAC）


#Reference to [New ios-kivy](https://github.com/kivy/kivy-ios)

kivy-iosのバージョン1.9.1になっているので、そちらが使用可能です。

#結果
　ビルド可能！（エミュレータでも動作可能になった！）
　※但し、arm64に対応できているかはちょっと不明。
　
#Build方法
　ちょっと、アクロバチックで説明すると長いので割愛しますｗ。ただ、そんなには難しくはない。基本的に前のToolsの中を参照し、新ToolsChainのRecepisに移植していくだけです。私が使用したバージョンは以下の通り。

【 OSX 】

|Module Name  |Version|
|:-----------:|:-----:|
|Cython       |0.20.2 |
|Kivy         |1.8.0  |
|Kivy-Garden  |0.1.1  |
|mercurial    |3.3.2  |
|PIL          |1.1.7  |
|pip          |6.0.8  |
|requests     |2.6.0  |
|setuptools   |12.0.5 |


【 iOS用 】

|Module Name  |Version|
|:-----------:|:-----:|
|freetype     |2.5.5  |
|hostpython   |2.7.1  |
|ios          |1.1.0  |
|kivy         |1.8.0  |
|libffi       |3.2.1  |
|ogg          |1.3.2  |
|python       |2.7.1  |
|sdl          |1.2.15 |
|sdl_mixer    |1.2.12 |
|sdl_ttf      |2.0.10 |
|tremor       |1.0.2  |

※もし、リクエストがあればRecepisの内容をアップします。
ゲストOSがUbuntuでVMWareToolsをインストールする手順

いつもフィーリングでやってて分からなくなるのでメモ。
### 環境
* ゲスト：ubuntu-ja-14.10-desktop-amd64-20141124.iso
* ホスト：Windows7 64bit
* ツール：VMWare Player 6.0.3 build-1895310

### 事象

ゲストOSインストール後にVMWare Toolsをインストールしようとすると、以下のエラーが表示される。

> 簡易インストールが進行中の場合、VMWare Toolsのインストールを手動で開始出来ません。

### 手順

VMをシャットダウンした上でハードウェアの「autoinst.flp」「autoinst.iso」を取り外せばよい。すなわち、
* フロッピーの削除
* CD/DVD(SATA)に接続されていたら、物理ドライブの検出に設定変更する、
等。
設定後、OS起動、ツールのインストール、Xの再起動等メッセージが出るのでそれにしたがって再起動等。
RailsTurorial-第6章メモ

今回から、自分用にメモを残すことにした。きっと何かの機会に役立つ...はず。


##Rakeが実行できなくなる
マイグレーション後に、Rakeが実行できなくなることがあるらしい。
データベースが壊れた場合、リセットが必要。
その場合は`rake db:test:prepare`を実行することで、解決できる。

##6章でハマったところ。

リスト6.28の、パスワードの長さとauthenticateメソッドのテストのとき。


```ruby:user_spec.rb
require 'spec_helper'

describe User do

  before do
    @user = User.new(name: "Example User", email: "user@example.com",
                     password: "foobar", password_confirmation: "foobar")
  end

  subject { @user }
  .
  .
  .
  it { should respond_to(:authenticate) }
  .
  .
  .
  describe "with a password that's too short" do
    before { @user.password = @user.password_confirmation = "a" * 5 }
    it { should be_invalid }
  end

  describe "return value of authenticate method" do
    before { @user.save }
    let(:found_user) { User.find_by(email: @user.email) }

    describe "with valid password" do
      it { should eq found_user.authenticate(@user.password) }
    end

    describe "with invalid password" do
      let(:user_for_invalid_password) { found_user.authenticate("invalid") }

      it { should_not eq user_for_invalid_password }
      specify { expect(user_for_invalid_password).to be_false }
    end
  end
end

```


`specify { expect(user_for_invalid_password).to be_false }`
この部分だけテストが通らなかった。
>Failures:

 > 1) User return value of authenticate method with invalid password should be false
     Failure/Error: specify{ expect(user_for_invalid_password).to be_false }
       expected false to respond to \`false?\`
     # ./spec/models/user_spec.rb:91:in \`block (4 levels) in \<top (required)>`

という感じに。

見た感じ、打ち間違いもないし...とあーだこーだした結果。
RSpec3.0以降は最後の`be_false`の部分を`be_falsy`と書かなければならないらしい。
書き換えたら、無事、解決。


##6章で紹介されたメソッド
|method     |action|
|:----------|------|
|respond_to?|シンボルを１つ引数として受け取り、オブジェクトが応答する場合はtrue、応答しない場合はfalseを返す。|
|valid?     |オブジェクトが一つ以上の検証に失敗した時にfalseを返す。全ての検証がパスした場合はtrueを返す。|
|authenticate|受け取ったパスワードがユーザーのものと一致した場合ユーザーが返され、一致しなかった場合はfalseを返す。|
Xcode6　コードスニペット編集

Xcodeの組込コードスニペットが設定されたファイルのパス

/Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Versions/A/Resources/SystemCodeSnippets.codesnippets

/Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Versions/Current/Resources/SystemCodeSnippets.codesnippets
オフラインリアルタイム - Tick-Tack-Toe(2012.7.6の過去問)



http://nabetani.sakura.ne.jp/hena/1/
オフラインリアルタイムの問題を Ruby で挑戦。

```ruby
# https://yhpg.doorkeeper.jp/
# http://nabetani.sakura.ne.jp/hena/1/

RULES = [
  '...******',
  '***...***',
  '******...',
  '.***.***.',
  '**.*.*.**',
  '.**.**.**',
  '*.**.**.*',
  '**.**.**.'
]

FIRST_PLAYER = 'o'
SECOND_PLAYER = 'x'

def buttle(cell_list)
  [].tap { |tmp| cell_list.chars.each.with_index { |cell, index|
    player = index % 2 == 0 ? FIRST_PLAYER : SECOND_PLAYER
    sub_player = player == FIRST_PLAYER ? SECOND_PLAYER : FIRST_PLAYER

    return "Foul : #{sub_player} won." if tmp.include? cell

    tmp << cell
    player_tmp = tmp.select.with_index { |_cell, idx| idx % 2 == (index % 2 == 0 ? 0 : 1) }

    RULES.each do |rule|
      rule_index = rule.chars.map.with_index { |c, i| i if c == '.' }.compact
      player_index = player_tmp.map { |_tmp| _tmp.to_i - 1 }

      return "#{player} won." if (rule_index - player_index).size.zero?
    end

    return "Draw game." if tmp.size == 9
  }}
end

cell_list = [
  79538246,
  35497162193,
  61978543,
  254961323121,
  6134278187,
  4319581,
  9625663381,
  7975662,
  2368799597,
  18652368566,
  965715,
  38745796,
  371929,
  758698769,
  42683953,
  618843927,
  36535224,
  882973,
  653675681,
  9729934662,
  972651483927,
  5439126787,
  142583697,
  42198637563,
  657391482,
]

result_list = [
'x won.',
'x won.',
'x won.',
'x won.',
'x won.',
'Foul : x won.',
'Foul : x won.',
'Foul : x won.',
'Foul : x won.',
'Foul : x won.',
'o won.',
'o won.',
'o won.',
'o won.',
'o won.',
'Foul : o won.',
'Foul : o won.',
'Foul : o won.',
'Foul : o won.',
'Foul : o won.',
'Draw game.',
'Draw game.',
'Draw game.',
'Draw game.',
'Draw game.',
]

#cell_list = '42198637563'
#buttle(cell_list)
cell_list.each.with_index do |cell, index|
  p buttle(cell.to_s) == result_list[index]
end

```

オフラインリアルタイムは正規表現とか使うと短くなったり、早く実装できたりするみたい。次から頑張ろう

[ソースコード](https://github.com/kiyono/offline_realtime/blob/master/tick_tack_toe.rb)