OmniAICreator/Qiita-1.07M huggingface dataset:
NSNumberFormatterを使って数値を3桁カンマ区切りで表示するメモ

"18888.88" みたいな__文字列__を "18,888.88" のようにカンマ区切りで表示したいケースがあったのでメモ。

```objc
NSString *price = @"18888.88";
NSNumberFormatter *f = [[NSNumberFormatter alloc] init];
[f setNumberStyle:NSNumberFormatterDecimalStyle];
NSString *formatString = [f stringFromNumber:[f numberFromString:price]];
NSLog(@"number = %@", formatString);
```

結果：
number = 18,888.88
DOSのdisabledelayedexpansionについて


#Intro
普段ほぼMSDOSでバッチなんて書かないのですが
業務上必要になり久々に書いたときにはまったのメモ。

#概要
DOSはなにも指定しないと変数をループやIFブロックなど条件式の外で
展開してしまいその評価結果が保持されてしまうようです。

この場合変数の遅延展開オプションが必要になります。
`SET enabledelayedexpansion`

また遅延展開する変数の記載は
`%変数%`ではなく`!変数!`で指定する必要があります。

そんなばかな。ひどいもんだ。

IFブロックの中で記載した処理結果を`%ERRORLEVEL%`をとって
判断するときとかもこれにあたるので注意が必要でした。

#サンプル

###だめなパターン
```bat
SET COUNT=0
FOR /F %%i IN ('DIR') DO SET /A COUNT=%COUNT%+1
ECHO %COUNT%

```
結果は1がたくさん。
FORをまわす前のCOUNT=0がセットされてしまい
固定化されるためです。

###いいパターン
```bat
SET enabledelayedexpansion

SET COUNT=0
FOR /F %%i IN ('DIR') DO SET /A COUNT=!COUNT!+1
ECHO %COUNT%

```
想定どおり。

#感想
DOSなんてこの世からなくなればいいと思います。
Install OS X Yosemite.appのバージョンを知るには


Yosemiteに関わらず、Mavericksでも同じだが、AppStoreからダウンロードしたOS Xのインストーラのバージョンを知るには以下のようにする。

`/Applications/Install\ OS\ X\ Yosemite.app`のところは、ダウンロードしたOS Xによって適宜変更する。
なお、ディスクイメージのマウント状況によって、`/Volumes`の後のパスが若干異なる場合があるので注意。どのパスにマウントされるかは、`hdiutil`コマンドの結果に出力されるのでそれを参考にする。

```shell-session
hdiutil mount -noverify /Applications/Install\ OS\ X\ Yosemite.app/Contents/SharedSupport/InstallESD.dmg
hdiutil mount -noverify /Volumes/OS\ X\ Install\ ESD/BaseSystem.dmg
cat /Volumes/OS\ X\ Base\ System/System/Library/CoreServices/SystemVersion.plist
```

出力結果の例

```shell-session
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>ProductBuildVersion</key>
	<string>14B25</string>
	<key>ProductCopyright</key>
	<string>1983-2014 Apple Inc.</string>
	<key>ProductName</key>
	<string>Mac OS X</string>
	<key>ProductUserVisibleVersion</key>
	<string>10.10.1</string>
	<key>ProductVersion</key>
	<string>10.10.1</string>
</dict>
</plist>
```

`ProductBuildVersion`や`ProductVersion`の値を見ると、どのバージョンのインストーラなのか判別できる。
創りたいイメージを伝えるのに便利そうなツール。

とある業界のとあるコンテストに応募しようと思い、アプリをAppleに提出したら。

ノンコアな処にツッコミが入り、リジェクトされた(´・ω・`)

しかし期日までにアプリが世の中に出ていないとコンテストに応募できないため
急遽Androidも開発することに。

しかし、プログラミングは習っている最中…。
習いながらでも、もちろんiOSのアプリは自分で書いたわけだが。

Android版にしようとすると、インターフェースを大幅に変更しないとならないのに気付く。
プログラミングに入る前に、師匠にイメージを伝える必要がある。

iOSのときは、KeynoteにXcodeの画面をキャプチャして貼ったモノを送った。
昔SIの営業をしていたときは、既存の画面で紙芝居を作るのが私の仕事だったのだ…。
お客様が欲しいと思っていらっしゃるであろう機能を
私がビジュアライズして提案するというわけだ。

しかし、今回はイメージが伝わればいいだけなのでそこにあまり時間をかけたくはない。

こんな便利なものがあったとは！！
楽しく作れる！スマホアプリ/サイトのワイヤーフレーム・モックアップ作成支援ツール7選
http://dev.classmethod.jp/smartphone/wireframe-tools-7/

早速利用してみることにする。
うまくいったら、ご喝采！
ruby-buildがないときのrbenvの挙動

しょうもないことだけど感心したので。

久しぶりに引っ張り出してきたMacBookAirの設定をしてるとき、``rbenv install``が効かないので「アルェー？」となっていた。

理由はruby-buildが入ってなかったから。

### ruby-buildがないとき

```
$ rbenv --help
rbenv 0.4.0
Usage: rbenv <command> [<args>]

Some useful rbenv commands are:
   commands    List all available rbenv commands
   local       Set or show the local application-specific Ruby version
   global      Set or show the global Ruby version
   shell       Set or show the shell-specific Ruby version
   rehash      Rehash rbenv shims (run this after installing executables)
   version     Show the current Ruby version and its origin
   versions    List all Ruby versions available to rbenv
   which       Display the full path to an executable
   whence      List all Ruby versions that contain the given executable

See `rbenv help <command>' for information on a specific command.
For full documentation, see: https://github.com/sstephenson/rbenv#readme
```

### ruby-buildがあるとき
```
$ rbenv -h

rbenv 0.4.0
Usage: rbenv <command> [<args>]

Some useful rbenv commands are:
   commands    List all available rbenv commands
   local       Set or show the local application-specific Ruby version
   global      Set or show the global Ruby version
   shell       Set or show the shell-specific Ruby version
   install     Install a Ruby version using ruby-build
   uninstall   Uninstall a specific Ruby version
   rehash      Rehash rbenv shims (run this after installing executables)
   version     Show the current Ruby version and its origin
   versions    List all Ruby versions available to rbenv
   which       Display the full path to an executable
   whence      List all Ruby versions that contain the given executable

See `rbenv help <command>' for information on a specific command.
For full documentation, see: https://github.com/sstephenson/rbenv#readme
```

``rbenv install``と``rbenv uninstall``が増えた。

ちゃんとruby-buildが入っているかどうかチェックして、使えないサブコマンドは見えないようにしてくれてるんですね。
snippet:YAMAHAルータ

## 性能比較

* [CPUとメモリの一覧](http://www.rtpro.yamaha.co.jp/RT/hardware/cpu.html)
* [比較](https://network.yamaha.com/products/routers/compare)
    * RTX830 : VPNルーター
    * NVR510 : VoIP対応ルーター

## DHCPでIPとDNSサーバーの指定を配布

```sh
# DHCPで配布するIPの範囲を指定
dhcp scope 1 192.168.10.101-192.168.10.180/24

# DHCPで配布するDNSサーバーを指定
dhcp scope option 1 dns=176.103.130.132,176.103.130.134
```

## ファームウェア更新(tftp)

* yamahaルータ側でtftp接続を許可

```bash:yamahaルータ側でtftp接続を許可
tftp host 192.168.3.3
```

192.168.3.3 から yamahaルータ(192.168.3.1)へ接続

```bash:yamahaルータへ接続
tftp 192.168.3.1
```

```bash:転送と更新実施
mode binary
put rtx1000.bin exec
```

## telnetタイムアウト

> Error:  Other user logged in by telnet.Connection closed by foreign host.

5分待つ必要がある様子

## コマンドリファレンス 

* 日本語から英語に出力を変更
  * console character ascii

## 設定例

* 自分の設定程度ではRTX1000とRTX1100はコンフィグ互換性あるっぽい。

* WAN(LAN2): 192.168.2.2
  * default gateway: 192.168.2.1
* LAN(LAN1): 192.168.0.1

```bash:
console character ascii
ip route default gateway 192.168.2.1
ip lan1 address 192.168.0.1/24
dns server 8.8.8.8
#
lan type lan2 100-fdx 1
ip lan2 address 192.168.2.2
#
ip lan2 nat descriptor 200
nat descriptor type 200 masquerade
nat descriptor address outer 200 primary
nat descriptor masquerade static 200 1 192.168.0.22 tcp 22=22
nat descriptor masquerade static 200 2 192.168.0.22 tcp 8080=www
#
httpd listen 80
httpd host lan1
```

```bash:
save
```

## 初期化方法

* RESETをボールペンで押しながら電源ON。20秒くらいそのまま。
* もしくは[cold start](http://atnetwork.info/yamaha/initialize01.html)コマンド実施

```
cold start
```

## ログインできるようになるまで

初期化直後はIPアドレスが振られていないため、シリアル接続にて以下実施。

```bash:
httpd listen 80
httpd host lan1

ip lan1 address 192.168.1.1/24
```

LAN1（４つ差口があるほう）にLANケーブルを挿して
http://192.168.1.1/ にアクセスし残りの設定を行う。
SlackとQiitaの117文字な関係

QiitaのURLをSlackで共有することがあるだろう。SlackはURLを貼ると要約を表示する。Qiitaは本文の先頭117文字が要約になる。要約だけで解決策がわかると仕事が捗る。Qiita投稿者は序文を気にしてみてはどうだろうか

↑ここまでが117文字。

Slackでの見え方↓

![Screenshot_2014_11_22_2_43.png](https://qiita-image-store.s3.amazonaws.com/0/889/522a36c0-2656-8066-dbf2-a3d6c1d8eae4.png)
Swiftでクロージャ (Closure)を簡単にまとめてみる


#概要
`Swift`に限らず、そもそもクロージャって何？って感じで、クロージャの使いどころもわからないのだが、とりあえず頭の整理ということで、簡単に試しながら整理してみる。

#クロージャって何？
個人的にではあるが、クロージャとはただ単に変数に代入された関数であると思っていた。
ちなみにAppleのSwiftのテキストには、下記のように定義されている。

```
{ (parameters) -> return type in
    statements
}
```
抜粋：: Apple Inc. “The Swift Programming Language”。 iBooks. https://itun.es/jp/jEUH0.l

正直言って、ますます余計にわからない。理解不能。

#関数(function)との違い
まずは関数(function)とクロージャは何が違うのかを見てみる。まずは超簡単に普通のよくある関数を使った`Hello World!!`。
どの言語を使っていたとしても、関数の使用については特にわからないことはないと思う。

##その1

まずは、引数を取らないシンプルな関数。関数内では`println()`で出力する。

```
//関数
func simpleFunc() {
    println("こんにちは。ほげさん")
}
simpleFunc()
```

そして、クロージャを使用して同じこと(同じ出力結果)を試してみる。

```
//クロージャ
var simpleClosure: () -> () = {
    println("こんにちは。ほげさん")
}
simpleClosure()
```
出力結果は同じはずである。
異なるのは、クロージャは、`var`で宣言しているので変数である。 
そして、普通の変数と同様に、`:()` はその変数の型で、`->()`は戻り値の型である。
この例では、引数無し戻り値無しということである。引数が`void`。戻り値も `void`という感じかな？

`simpleClosure()`でコールされている事がわかる。

##その2

次に、引数を`String型`で渡し、String型を戻り値として返す関数。シンプルにするために、引数で渡された`param`をそのまま`return`で返す。
関数の外で`println()`で出力する。

```
//String引数付関数
func paramFunc(param:String) -> String{
    return "こんにちは。" + param + "さん"
}
println(paramFunc("もく"))

```

そして、クロージャを使用して同じことを試してみる。

```
//String引数付クロージャ
var paramClosure: (String) -> String
//クロージャの実装
paramClosure = {
    p -> String in
    return "こんにちは。" + p + "さん"
}
println(paramClosure("もく"))

```

ここで理解できるのは、`p`はクロージャの引数で `-> String`型を返す。そして、`in` の後に、`return` する結果である`statements`を返すということ。

ちなみに、「クロージャの実装」とコメントに記述してしまっているが、このような呼び方が正しいかどうかはわからない。
しかし理解を助ける上であえて「クロージャの実装」というコメントを記述してる。


これで、何となくであるが、AppleのSwiftのテキストに説明してあるクロージャの説明が理解できるようになる。

##その3

ただ、このままだとまだまだクロージャの使いどころがわからない？
クロージャの何が嬉しいのか？何が美味しいのか？関数で良いんじゃないのか？

そこで、今度は、引数を`Int型`で2つ渡し、計算結果であるInt型を戻り値として返す関数。引数で渡された`p1`と`p2`を足し算して`return`で返す。
これも関数の外で`println()`で出力する。

```
//Int引数付関数
func intParamFunc(p1:Int, p2:Int)->Int{
    return p1 + p2
}
println(intParamFunc(2,6))

```

そして、クロージャを使用して同じことを試してみる。

```
//Int引数付クロージャ
var intParamClosure: (Int,Int) -> Int
//クロージャの実装
intParamClosure = {
    p1,p2 -> Int in
    return p1 + p2
}
println(intParamClosure(3,5))

```

ふ〜む。ここまでくるとかなり理解できている気になってきた。
とりあえず、深入りする前に今回はここまで。

*Lovely Swift!!!*
npmの依存ライブラリのライセンスをチェックする方法

Node.jsやモダンWebアプリを作る際、npm でがしがしライブラリをインストールするかと思います。

npm で取ってきたライブラリは再配布するわけではなく単に利用するだけなのですが、利用についても何らかの制限（学術利用に限るとか、**「悪いことに使うな」**とか）をかけるものも存在しますので、各ライブラリのライセンスをチェックしてみました。

ライセンス一覧をHTMLレポートとして生成するGruntプラグイン [grunt-license-report](https://github.com/Fkscorpion/grunt-license-report) がちょうど良かったので、どんなものか紹介します。

# grunt-license-reportの使い方

[grunt-license-report](https://github.com/Fkscorpion/grunt-license-report) のREADMEに従って npm install して、

```
    npm install grunt-license-report --save-dev
```

Gruntfile.js に設定を追加して、

```js
    'license-report': {
      target: './report/licenses.html'
    }
```

Gruntを実行します。

```
    grunt license-report
```

すると、次のようなHTMLファイルが生成されました。

![license-report.png](https://qiita-image-store.s3.amazonaws.com/0/59584/cec4a2c9-f825-056b-c9b8-6a4a22a4afef.png)

シンプルなHTMLですが、ライブラリ名とバージョンとライセンスが一覧化されていて良い感じです。

多くはMIT・ISC・BSDライセンスなので問題ありませんが、ライセンスがきちんと書かれていなくてUNKNOWNになるものもありますので、個別に確認すると良いでしょう。

# grunt-license-reportの少し詳細

このプラグインは、npmでローカルにインストールしたライブラリを再帰的にチェックして一覧化してくれます。
package.jsonに書いているかどうかは関係ないようです。

コードを見ると、Gruntfileは上記のような書き方しかできず、HTMLファイルの名前を変える以外のオプション設定は今のところありません。

このプラグインは9日前に公開されたばかりで、できたてホヤホヤですね。

ライセンスチェック自体は [license-checker](https://github.com/davglass/license-checker) を使って行っています。
このライブラリはまさに今日バージョン1.0.0がリリースされたようです。

# UNKNOWNなライセンスをどう扱うか

プラグインとは関係ありませんが、ライセンスが不明なライブラリの扱い方はどうするのが正しいのでしょうか。

無断での再配布は日本の著作権法に違反することになりますね。

利用に関しては、オープンに公開されているライブラリなのだから黙示の許諾があると考えても良さそうな気がします。
SVN/TracからGitHubにデータ移行してみた

# 前準備

- githubに空のレポジトリを作っておく
- 移行したいユーザを先にCollaboratorに招待しておく
- Collaboratorに、一時的にgithubの[Participatingのメール通知をオフ](https://github.com/settings/notifications)にしてもらう(理由は後述)

# TracからGithub Issuesへのデータ移行

StackOverflowの[How to export Trac to Github Issues](http://stackoverflow.com/questions/6671584/how-to-export-trac-to-github-issues) を参考に、[trac2github](https://github.com/trustmaster/trac2github)というphpスクリプトを使ってみた。

- `trac2github.cfg` ファイルに移行元tracと、移行先githubの接続情報などを書く。
- デフォルトでコメントは移行しない設定になってるので移行したいなら`$skip_tickets   = false;`にする
- `php trac2github.php`で実行
- 次々にissueが作られて行ったので、何の問題もなく移行できたと思いきや… issueコメントから日本語がさっぱり消えている
- スクリプトのソース見てみると、ASCII文字以外は消されてる…のでとりあえずコメントアウトして再実行 (json_encode()で問題になるかもらしいけど問題なかった）

```php
// Avoid non-ASCII characters, as that will cause trouble with json_encode()
//$data = preg_replace('/[^(\x00-\x7F)]*/','', $data);
```

- 再実行して400件ほどのチケット移行に6-7分、そこからコメントの移行が20分くらいかかった

### 注意事項
- **assignされたりするとユーザにメールが飛びまくってしまうので、一時的にメール通知をオフにしてもらった（Unwatchだけだとダメだった)**
- 先に移行してからCollaborator追加すればいいかと思ったけど、assignするユーザはCollaboratorになってないとエラーになり、Issue番号が飛んでしまったのでやり直し
- ユーザの変換ルールを設定していても、反映されるのはassignだけで、コメントとかは自分が書いたことになる(API的にできないんだと思う)
 - (`Commented by hogehoge on 31 Jul 2014 03:57 UTC`とかは付けてくれる)


# svnからgithubへのソース移行

GitHub Helpの[Importing from Subversion](https://help.github.com/articles/importing-from-subversion/)を参考に、まずは公式のGitHub Importerを使ってみたが、認証かかっているせいかオレオレ証明書なせいか、svnへ接続できず。

- [svn2git](https://github.com/nirvdrum/svn2git)でローカルgitレポジトリに変換し、pushした。

- authors.txt用意すればauthorの変換もできるみたいだったけど記法がよく分からず、エラーになったのでそのままにしてしまった
MySQLのダンプとデータの復元

MySQLでのデータのバックアップの仕方と復元の仕方について簡単にまとめました。

<h2>ダンプ</h2>
<h3>基本的なmysqldumpコマンドの形</h3>

```
$ mysqldump -u ユーザ名 -p DB名 > データを格納するファイル名.sql
```

上記のコマンドで指定したDB内の全てのテーブルのデータが構造つきで取得できます。


<h3>DB全体だと大きすぎるので、特定のテーブルのみダンプしたい場合</h3>

```
$ mysqldump -u ユーザ名 -p DB名 テーブル名 > データを格納するファイル名.sql
```

テーブル名を半角スペースで区切ってあげると複数テーブルの指定も可能です。

<h3>条件つきでダンプしたい場合</h3>

```
$ mysqldump -u ユーザ名 -p "--where=id<=100" DB名 テーブル名 > データを格納するファイル名.sql
```

上記例ではidカラムが100以下のレコードをダンプします。
ANDで複数条件も指定可能です。

例：

```
$ mysqldump -u ユーザ名 -p "--where=id<=100 AND delete_flg=0" DB名 テーブル名 > データを格納するファイル名.sql
```


<h3>構造はいらないからレコードだけダンプしたい場合</h3>

```
$ mysqldump -u ユーザ名 -p -t DB名 > データを格納するファイル名.sql
```


<h3>レコードはいらないから構造だけダンプしたい場合</h3>

```
$ mysqldump -u ユーザ名 -p -d DB名 > データを格納するファイル名.sql
```

<h2>復元</h2>
<h3>ダンプしたデータを復元する</h3>

```
$ mysql -u ユーザ名 -p DB名 < データを格納したファイル名.sql
```


以上、簡単ですがMySQLのダンプと復元についてまとめました。
最後までお読みいただきありがとうございました。
macでもdockerインストール


os x yosemite で実施
事前にvirutualboxインストール済みの事


## インストール
homebrewインストール

```r
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

dockerインストール

```
$ brew install docker
```

boot2dockerインストール

```
$ brew install boot2docker
```

## boot2docker起動
初期化

```
$ boot2docker init
```

起動

```
$ boot2docker up
~省略~
To connect the Docker client to the Docker daemon, please set:
    export DOCKER_CERT_PATH=/Users/xxxxx/.boot2docker/certs/boot2docker-vm
    export DOCKER_TLS_VERIFY=1
    export DOCKER_HOST=tcp://192.168.59.103:2376
```


環境変数設定
起動時に出力された環境情報を環境変数に設定

```
$ vi ~/.bash_profile
    export DOCKER_CERT_PATH=/Users/xxxxx/.boot2docker/certs/boot2docker-vm
    export DOCKER_TLS_VERIFY=1
    export DOCKER_HOST=tcp://192.168.59.103:2376
```

## 起動確認

```
$ . ~/.bash_profile 
$ boot2docker status
running
$ boot2docker info
{
	"Name": "boot2docker-vm",
	"UUID": "bf7057c8-da7e-46e5-83c6-63e020bfb6f2",
	"Iso": "/Users/xxxxx/.boot2docker/boot2docker.iso",
	"State": "running",
	"CPUs": 4,
	"Memory": 2048,
	"VRAM": 8,
	"CfgFile": "/Users/xxxxx/VirtualBox VMs/boot2docker-vm/boot2docker-vm.vbox",
	"BaseFolder": "/Users/xxxxx/VirtualBox VMs/boot2docker-vm",
	"OSType": "",
	"Flag": 0,
	"BootOrder": null,
	"DockerPort": 0,
	"SSHPort": 2022,
	"SerialFile": "/Users/xxxxx/.boot2docker/boot2docker-vm.sock"

```

## 停止

```
$ boot2docker stop
```
CCActionでぷるぷる感を出す

### ※ 2014/3/25注 CCLiquid（v3ではLiquid）は若干重い処理なので、CPU使用率とのトレードオフになります。たくさん使うときはScaleByなどで代用しましょう ※###
↑ジャンプしながらScaleByする動きはこれに似ています

---

Cocos2d-xのCCActionクラスは本当に万能です。
今回はこれを使ってぷるぷる感をだす方法を公開します。
プリンのぷるぷるする感じ。


##( ´_ゝ`) < doya・・・
![pudding_20141125.gif](https://qiita-image-store.s3.amazonaws.com/0/57193/2d229ac7-40e1-2b64-5c21-4071c867a07a.gif)


##概要
CCSpawn（アクションの同時実行）と、CCLiquid、少しのCCJumpByを使って実装します。

##重要ポイント
重要なのは、1.CCLiquidのパラメータ（もっとぷるぷるさせたいなら回数を増やす、幅を大きくしたり）、2.CCJumpByでほんのぉりジャンプさせることです。

##ソース
追加したスプライト「pudding」に対してアクションをさせます。

```cpp:pururu.cpp
    CCActionInterval* puru_1 = CCLiquid::create(2.0, CCSize(5, 5), 1, 5);
    CCActionInterval* puru_2 = CCJumpBy::create(1.1, ccp(0, 0), 10, 1);
    CCSpawn* spawn = CCSpawn::create(puru_1,puru_2,NULL);
    pudding->runAction(spawn);
```

#( ´_ゝ`) < タップでぷるっとさせるといいよ
( ´_ゝ`) < 読み込んだ時にぷるっとさせてもいいかもね。ツムみたいに。
PickerRowのフォントカラーを変更する


PickerRowのフォントカラーを白から黒に変更するのが少し面倒だったからメモとして
[公式ドキュメント](http://docs.appcelerator.com/titanium/latest/#!/guide/Android_Themes-section-34636181_AndroidThemes-AndroidHoloColorsGenerator)に英語ですが書いてあります．

1. http://android-holo-colors.com/ へ移動

2. Theme Nameを決める
2.1. 今回私は`picker_text`にしました

3. Colorを指定する
3.1. 黒を指定

4. Min SDK Versionを指定する

5. Compatibilityをを指定する
5.1. Titanium SDKが3.3.X以降の場合: APPCOMPAT
5.2. Titanium SDKが3.2.X以前の場合: NONE

6. Themeを指定する
6.1. LIGHTを指定

7. テーマを変更したいWidget(EditTextなど)をYesにする
7.1. 「Switch」「Switch Jellybean」「Drawer」は必ずNoにすること
7.2. Pickerの場合はSpinnerをYesに

8. DOWNLOAD .ZIPボタンをクリックしダウンロード

9. ダウンロードしたZIPファイルを解凍

10. 中にあるresフォルダの中身を`platform/android`直下にコピー

11. tiapp.xmlを修正

```xml:tiapp.xml
<android xmlns:android="http://schemas.android.com/apk/res/android">
    <manifest>
        <application android:theme="@style/picker_text"/> <!-- 手順2で決めた名前 -->
        <uses-sdk android:minSdkVersion="11" android:targetSdkVersion="19"/>
    </manifest>
</android>
```

以上の手順を行うと
![変更前](http://i.gyazo.com/5c17da7570367072f2aa114b26305055.png)
が
![変更後](http://i.gyazo.com/54d57f77960a0120d250e9d50fe93e12.png)
になります．
(背景を白にすると白文字が見えないため背景を緑にしています)
PDOをクラス化して使いやすくする(改訂版)

phpのPDOでのデータベースへの接続とSQL文のクラス化して使いやすくしてみました。(改訂版)
初めにphpのクラスファイル

```class.php
<?php
class connect {
  //定数の宣言
  const DB_NAME='db_name';
  const HOST='localhost';
  const UTF='utf8';
  const USER='user';
  const PASS='pass';
  //データベースに接続する関数
  function pdo(){
    /*phpのバージョンが5.3.6よりも古い場合はcharset=".self::UTFが必要無くなり、array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES '.SELF::UTF')が必要になり、5.3.6以上の場合は必要ないがcharset=".self::UTFは必要になる。*/
    $dsn="mysql:dbname=".self::DB_NAME.";host=".self::HOST.";charset=".self::UTF;
    $user=self::USER;
    $pass=self::PASS;
    try{
      $pdo=new PDO($dsn,$user,$pass,array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES '.SELF::UTF));
    }catch(Exception $e){
      echo 'error' .$e->getMesseage;
      die();
    }
    //エラーを表示してくれる。
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
    return $pdo;
  }
  //SELECT文のときに使用する関数。
  function select($sql){
    $hoge=$this->pdo();
    $stmt=$hoge->query($sql);
    $items=$stmt->fetchAll(PDO::FETCH_ASSOC);
    return $items;
  }
  //SELECT,INSERT,UPDATE,DELETE文の時に使用する関数。
  function plural($sql,$item){
    $hoge=$this->pdo();
    $stmt=$hoge->prepare($sql);
    $stmt->execute(array(':id'=>$item));//sql文のVALUES等の値が?の場合は$itemでもいい。
    return $stmt;
  }
}
?>
```

phpの定数宣言は2つある.
defineとconst
defineの場合

```php
<?php
define('TEST','test');
define('test','test2');
define('Test','1+2');
echo TEST;
echo test;
echo Test;
?>
```

define
大文字と小文字を区別してくれる。
計算もできる。
表示結果はそれぞれ違う。
グローバルである。
どこからでも使える。

constの場合

```php
<?php
class test{
  const TEST='test';
  echo test::TEST;
  echo self::TEST;
}
?>
```

const
大文字と小文字を区別しない。
クラス定数である。
上記のechoでの表示は同じ結果である。
constの参照はクラス名::定数名かself::定数名のどちらかで参照できる。

クラス内で定数
function selectはファイル内で(select文が)1回だけ実行する時に使用する。
function pluralは(select文が)2回以上使用する場合に使用する。
function plural関数の方を使ったほうがSQLインジェクションの対策にもなるので一石二鳥ではある。
関数の呼び出し等の変数とexecute内の個数は必要に応じて増やしてください。

次にindex.php

```index.php
<?php
//クラスファイルの読み込み
require_once 'class/system.php';
//クラスの生成
$obj=new connect();
//sql文の発行
$sql="SELECT * FROM class";
$sql2="SELECT * FROM class WHERE id=:id";
//変数の設定
$test=1;
//クラスの中の関数の呼び出し
$items=$obj->select($sql);
$items2=$obj->plural($sql2,$test);
?>
<!doctype html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>テスト</title>
</head>
<body>
  <?php foreach($items as $item) : ?>
    <p><?php echo $item['id']; ?></p>
    <p><?php echo $item['name']; ?></p>
    <p><?php echo $item['comment']; ?></p>
  <?php endforeach; ?>
  <?php foreach($items2 as $item) : ?>
    <p><?php echo $item['id']; ?></p>
    <p><?php echo $item['name']; ?></p>
    <p><?php echo $item['comment']; ?></p>
  <?php endforeach; ?>
</body>
</html>
```
foreach文でデータが有るだけ繰り返します。
$itemsと$items2の実行結果は全く同じになるが$items2のほうはidが指定されているので指定されているidに対応したものだけが表示される。
※sql文の中に直接変数を入れるのは危険なので必ずid=?か:id等のSQLインジェクション対策はしましょう。

まとめ
--
クラスってやっぱり難しいね。
asciidoctor-fopubで生成されるPDFの"Table of Contents"などを日本語化する

# はじめに

以前[asciidoctorで日本語の本文とPlantUMLのクラス図が入った文書をPDFに変換してみた - Qiita]( http://qiita.com/hnakamur/items/33a5e342ea79cffbbd9b )の
[日本語の本文をPDF化する方法について]( http://qiita.com/hnakamur/items/33a5e342ea79cffbbd9b#2-4 )で書いた方法で本文では日本語が使えるようになりますが、自動生成される目次のタイトルは"Table of Contents"、図目次のタイトルは"List of Figures"のように英語になっていました。

[asciidoctor/asciidoctor-fopub]( https://github.com/asciidoctor/asciidoctor-fopub )はプロジェクトの説明に

> A portable DocBook-to-PDF build command that wraps DocBook XSL and Apache FOP

とあるとおり、バックエンドにDocBook XSLとApache FOPを使用しています。

# XSLTスタイルシートのカスタマイズで日本語化可能

[fopub option flags]( https://github.com/asciidoctor/asciidoctor-fopub#fopub-option-flags )の説明を見ると `-t` オプションでXSLTスタイルシートを含むディレクトリを指定してスタイルシートを切り替えることができることが分かります。

asciidoctor-fopub には [src/dist/docbook-xsl]( https://github.com/asciidoctor/asciidoctor-fopub/tree/e1b15e85faa4f17852a2700d751d7428e590bf4c/src/dist/docbook-xsl ) ディレクトリに標準のXSLTスタイルシートがバンドルされていますので、これをコピーして改変します。 `fo-pdf.xsl` というのがメインのファイルのようです。

ググっていると[The DocBook Project]( http://docbook.sourceforge.net/ )のDocBook releasesの[docbok-xsl]( http://docbook.sourceforge.net/release/xsl/current/ )に[common/ja.xml]( http://docbook.sourceforge.net/release/xsl/current/common/ja.xml )というファイルがあるのを見つけました。

あとは https://github.com/hnakamur/asciidoctor-fopub/commit/adad976219f2ee1170932597843114c19930a0c9 のように `ja.xml` ファイルを追加し `fo-pdf.xsl` に

```<xsl:import href="ja.xml"/>``` という行を追加して `ja.xml` を読み込むようにすればOKです。

# 生成したPDFの例

http://hnakamur.github.io/asciidoctor_template/embed_image_sample.pdf

![asciidoctor-fopub-japanization.png](https://qiita-image-store.s3.amazonaws.com/0/3227/21d66ae5-ae5c-dce8-5ce5-786338e96c0b.png)
MongoDBにあるデータがElasticsearchに同期されないときの対処方法


Elasticsearch に MongoDB River Plugin を使うことで、MongoDB のデータを ElasticSearch に同期させることができる。
しかし、同期の設定をした後に、MongoDB にカラムを追加したりすると Elasticsearch に反映されないことがあり、その対処方法がわかったので書いておく。

# 使用したバージョン
* MongoDB 2.4.9
* [Elasticsearch 1.1.1] (http://www.elasticsearch.org/downloads/1-1-1/)
* [MongoDB River Plugin 2.0.0] (https://github.com/richardwilly98/elasticsearch-river-mongodb)
* [Attachments Plugin 2.0.0] (https://github.com/elasticsearch/elasticsearch-mapper-attachments)
* [Kuromoji Analysis Plugin 2.1.0] (https://github.com/elasticsearch/elasticsearch-analysis-kuromoji)

# 同期されなくなる手順

簡単に言えば、サーバーの起動順が Elasticsearch -> MongoDB だとダメらしい。

1. MongoDB を起動し、カラムを追加する
2. MongoDB を停止する
3. Elasticsearch を起動する
 * ログにエラーが出る

 ```
[2014-10-31 13:34:09,356][WARN ]	[org.elasticsearch.river.mongodb.MongoDBRiver] Fail to start river portal
com.mongodb.MongoException: can't find a master
        at com.mongodb.DBTCPConnector.checkMaster(DBTCPConnector.java:517)
```

4. MongoDB を起動する
5. Elasticsearch にカラムが追加されていない

一度この順番で起動してしまうと、3.と4.を入れ替えた順序で起動し直しても同期されず、Elasticsearch起動時にステータスエラーが出る。

```
[2014-10-31 13:45:08,028][INFO ][org.elasticsearch.river.mongodb.MongoDBRiver] Starting river portal
[2014-10-31 13:45:08,031][ERROR][org.elasticsearch.river.mongodb.MongoDBRiver] Cannot start river portal. Current status is START_FAILED
```

# 対処方法(1)

おそらく正しい方法だろうと思われる。

-1. _riverstatus を削除する

```
curl -XDELETE 'http://localhost:9200/_river/testdb/_riverstatus'
```

-2. Elasticsearch を停止する

```
curl -XPOST 'http://localhost:9200/_shutdown'
```

-3. Elasticsearch を起動する

```
elasticsearch -d
```

# 対処方法(2)

強制的に全部作り直しても、直ることは直る。

-0. 現在の設定を確認しておく

```
$ curl -XGET "http://localhost:9200/_river/testdb/_meta" 
```

-1. Elasticsearch側のDBを消す

```
$ curl -XDELETE 'http://localhost:9200/testdb'
```

-2. ElasticsearchのRiverも消す

```
$ curl -XDELETE 'http://localhost:9200/_river'
```

-3. MongoDB River Plugin の設定をやり直す

```
$ curl -XPUT "localhost:9200/_river/testdb/_meta" -d '
{
  "type": "mongodb",
  "mongodb": {
    "db": "testdb",
    "servers": [
      { "host": "127.0.0.1", "port": 27101 },
      { "host": "127.0.0.1", "port": 27102 }
    ],
    "options": { "secondary_read_preference": true, "import_all_collections": true }
  },
  "index": { "name": "testdb" }
}'
```
Elixir | Agent でステートを管理します #elixir

# Elixir | Agent でステートを管理します #elixir
## 概要
Elixir の Agent でステートを管理します。
## 基本文法
### start_link(fun, options \\ [])
初期処理を行う関数とともにステートを開始。

~~~
Agent.start_link(fn -> [] end)
~~~

### get(agent, fun, timeout \\ 5000)
ステートを取得。

~~~
{ :ok, agent } = Agent.start_link(fn -> [] end)
Agent.get(agent, fn n -> n end)
# => []
~~~

### update
ステートを更新。

~~~
{ :ok, agent } = Agent.start_link(fn -> [] end)
Agent.update(agent, fn n -> [1|n] end)
Agent.get(agent, fn n -> n end)
# => [1]
Agent.update(agent, fn n -> [2|n] end)
Agent.get(agent, fn n -> n end)
# => [2,1]
~~~

### stop
ステートを停止。

~~~
{ :ok, agent } = Agent.start_link(fn -> [] end)
Agent.update(agent, fn n -> [1|n] end)
Agent.get(agent, fn n -> n end)
# => [1]
Agent.stop(agent)
Agent.get(agent, fn n -> n end)
# => Agent が stop しているため Error
~~~

## サンプル
### サンプルコード
~~~
defmodule AgentSample do
  def start_link(fun) do
    {:ok, agent} = Agent.start_link(fun)
    agent
  end

  def get(agent, fun) do
    Agent.get(agent, fun)
  end

  def update(agent, fun) do
    Agent.update(agent, fun)
  end

  def stop(agent) do
    Agent.stop(agent)
  end
end

agent = AgentSample.start_link(fn ->(0) end)
IO.puts AgentSample.get(agent, fn n ->(n) end)
AgentSample.update(agent, fn n ->(1 + n) end)
IO.puts AgentSample.get(agent, fn n ->(n) end)
AgentSample.update(agent, fn n ->(2 + n) end)
IO.puts AgentSample.get(agent, fn n ->(n) end)
AgentSample.stop(agent)
~~~

### 出力

~~~
0
1
3
~~~

## 参照
* [Elixir GETTING STARTED Agent](http://elixir-lang.org/getting_started/mix_otp/2.html#2.2-agents)
* [Agent](http://elixir-lang.org/docs/stable/elixir/Agent.html)
Trello | ショートカットキーのヘルプメニューをショートカットキーで表示する #trello

# Trello | ショートカットキーのヘルプメニューをショートカットキーで表示する #trello
## 概要
Trello のショートカットキーのヘルプメニューをショートカットキーで表示する

## 試行
ショートカットキーのヘルプは `?` キーで表示できます

![trello_key_help.png](https://qiita-image-store.s3.amazonaws.com/0/43480/66420ad3-4ecd-ce2f-6253-1d09ad0a2c2b.png)
Python で Project Euler #10「素数の和」

[Problem 10 「素数の和」](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2010)

> 10以下の素数の和は 2 + 3 + 5 + 7 = 17 である.
> 200万以下の全ての素数の和を求めよ.

```py:Python
n = 2000000

def generate_primes(n):
  primes = [2]
  for i in range(3, n+1, 2):
    for p in primes:
      if i % p == 0:
        break
    else:
      primes += [i]
    if i % (n // 100) == 1:
      print "%d / %d" % (i, n)
  return primes

primes = generate_primes(n)
result = sum(primes)

print result
print result == 142913828922
print primes[-5:]
```

```:結果
142913828922
True
[1999891, 1999957, 1999969, 1999979, 1999993]
```

時間がかかりすぎるのでもっと高速化したい。
Nginx setup memo



1.

```
$ rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm

$ cat /etc/yum.repos.d/nginx.repo
```

2.

```
$ sudo yum -y install nginx

$ nginx -v
```

3.

```
$ sudo service nginx start

$ sudo service nginx stop
```

4.

```
$ sudo cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.org

$ sudo vim default.conf
```
Node.js setup memo



1.

```
$ git clone https://github.com/creationix/nvm.git ~/.nvm
```

2.

```
$ export NVM_NODEJS_ORG_MIRROR="http://nodejs.org/dist"
$ source ~/.nvm/nvm.sh
```

3.

```
$ nvm ls-remote
```

4.

```
$ nvm install  v0.11.14
```

5.

```
$ nvm alias default 0.11.14
```

6.

``` .bash_profile
if [ -f ~/.nvm/nvm.sh ]; then
  export NVM_NODEJS_ORG_MIRROR="http://nodejs.org/dist"
  source ~/.nvm/nvm.sh
  nvm alias default 0.11.14 > /dev/null
fi
```
Qiitaに投稿して画像アップロード上限を上げる

#Qiitaの画像アップロードのデフォルト上限は2MBです
![image](https://qiita-image-store.s3.amazonaws.com/0/60003/6949fbe2-aea9-46c8-c7cf-bcd2c841daf1.png)

#記事を投稿すれば50倍になります
2MBぽっちではツラいあまりにもツラ過ぎるのでアカウントとったらなんでもいいから投稿しましょう。
[Spider]Swiftと同じfor-in型がJavascriptで書けます


こんばんは！

再びSpiderとSwiftの相似点についてです。


Spiderのfor構文では、Swiftと同じ
for-inの形で書くことが出来ます。

## Swiftだと

Swiftだと、こう書けますね。

```swift

let foods:[String] = ["apple", "fish", "meat"]

for food in foods {
	println(food)
}

// "apple"
// "fish"
// "meat"

```

## Spiderだと


Spiderだと、こう書けます。

```spider

var foods = ["apple", "fish", "meat"]

for food in foods {
	console.log(food)
}

// "apple"
// "fish"
// "meat"

```


全く同じですねー

ちなみにindexの取得方法は以下のようにできます。


```spider

for food, i in foods {
  console.log("I like \(foods[i]).");
};

// "apple"
// "fish"
// "meat"

```


また、オブジェクトについても、ofを使って
key, valueに分解することが出来ます。


```spider

var man:[String] = {
	"name" : "ken" ,
	"age" : 18,
	"address" : "Japan"
};

for key, value of man {
  console.log("\(key) : \(valu).");
}


// "name : ken"
// "age : 18"
// "address : Japan"

```


ワンライナーでループをまわして
配列にすることもできます。


```spider

var lists = [ 1, 2, 3, 5, 6, 7, 8, 9, 10 ];
var doubles = [ value * 2 for value in lists ];

```

## 追記


Spiderの「for-in」は、
javascriptの「forEach」にコンパイルされます。

```
foods.forEach(function (food) {
    console.log(food);
}, this);
```
87 Mobile Ad Networks To Monetize Your Apps And Games

![alt](http://2.bp.blogspot.com/-z8qb73ftAOU/VG8usQIDKTI/AAAAAAAAAf8/RXiKtqswF6E/s1600/Mobile%2Bad%2Bearnings.jpg)


Are you Mobile CPA Marketer, or a #Mobile Affiliate Marketer, or a Mobile Developer/Publisher, or any indie game developer and searching for best Mobile Ad Networks To #Monetize Your #Apps and #Games ? Then, this is going to be a Big Deal for you.


I belive mobile #marketing area is pretty unique & MASSIVE! Figures & facts proven. For people who are getting involved prior will be able to buy CHEAP traffic, pay less CPC, don’t need to worry about the stock (simply because most of it is un-used), don’t be concerned a lot about acquiring approved/rejected by #Facebook/Google. And that can use the early movers benefit RIGHT NOW!

This great list is the one you are searching for today its going to be leak.


4th Screen Advertising	http://www.4th-screen.com/
Aarki	http://aarki.com/
AdColony	http://www.adcolony.com/
Adfonic	http://adfonic.com/
AdIQuity	http://adiquity.com/
AdMarvel	http://www.admarvel.com/index.php
Admob	http://www.admob.com
Admoda	http://admoda.com
Adsmobi	http://www.adsmobi.com/
AdTriple	http://www.adtriple.en/
Adultmoda	http://www.adultmoda.com
AdWhirl	http://www.adwhirl.com
Airpush	http://www.airpush.com
Appflood	http://www.appflood.com
Applifier	http://www.applifier.com/
Apprupt	http://www.apprupt.com/en/
Burstly	http://www.burstly.com
Buzz City	http://buzzcity.com
Cauly	http://www.cauly.net/index.php/w/home
ChartBoost	http://chartboost.com/
epom	http://epom.com/
GreyStripe	http://www.greystripe.com/
Hands	http://web.hands.com.br/
Human Demand	http://www.mobiletradingdesk.com/moby
Hunt Mobile Ads	http://huntmads.com
Inmobi	http://www.inmobi.com
inneractive	http://inner-active.com/
Jampp	http://www.jampp.com/
Jumptap	http://jumptap.com
Kiip	http://www.kiip.me
Komli Mobile	http://www.komlimobile.com/index
LeadBolt	http://www.leadbolt.com/l
Leanmarket	http://www.lean.com
LoopMe Media	http://www.loopme.biz/
mAdserve	http://www.madserve.org
Madvertise	http://madvertise.com/en
MdotM	http://mdotm.com/
Medialets	http://www.medialets.com/
Metaresolver	http://www.metaresolver.com
Microsoft Mobile Advertising	http://advertising.microsoft.com/mobile-advertising
Millennial Media	http://www.millennialmedia.com/
mKmob	http://www.mkmob.com/
mMedia	http://mmedia.com/



**check out complete list of 87 networks :arrow_forward: [HERE](http://unity3diy.blogspot.com/2014/11/87-mobile-ad-networks-to-monetize-your.html)**
TDD入門自分用メモ-20141119


# Part 1-3

## Value Object

* Dollar実装で使用しているパターン
* オブジェクトを値として使用する
* インスタンス変数の値をコンストラクタ内で設定した後は変化させないという制約
* 別名参照のバグを防ぐ
* Dollar5が別のDollar5オブジェクトと等価であることを示すためにequals()を実装する必要がある
* equals()実装に合わせてhashCode()の実装も必要

``` TODOList.md
レートが2:1の場合、$5+10CHF=$10
amountのプライベート化
Moneyの丸め処理
equals()
hashCode()
```

* 新しいテスト

``` DollarTest.java

    @Test
    public void testEquality(){
        assertTrue(new Dollar(5).equals(new Dollar(5)));
    }

```

* 仮実装

``` Dollar.java

    public boolean equals(Object object){
        return true;
    }

```

* テストパターンを増やす

``` DollarTest.java

    @Test
    public void testEquality(){
        assertTrue(new Dollar(5).equals(new Dollar(5)));
        assertFalse(new Dollar(5).equals(new Dollar(6)));
    }

```

``` Dollar.java

    public boolean equals(Object object){
        Dollar dollar = (Dollar)object;
        return amount == dollar.amount;
    }

```

* nullやその他オブジェクトとの比較をどうするかという問題がでてきたのでTODOListに加えておく

``` TODOList.md
レートが2:1の場合、$5+10CHF=$10
amountのプライベート化
Moneyの丸め処理
hashCode()
nullとの等価性
オブジェクトとの等価性
```

*三角測量云々の話がよく理解できてない...*

## この章で行ったこと

1. 操作に対するテスト

1. 操作の実装

1. テストとリファクタリング

# Part 1-4

## 変数のプライベート化

* テストの修正

``` DollarTest.java

    @Test
    public void testMultiplication(){
        Dollar five = new Dollar(5);
        assertEquals(new Dollar(10),five.times(2));
        assertEquals(new Dollar(15),five.times(3));
    }

```

* これでインスタンス変数をプライベートにすることができるようになった

``` Dollar.java

    private int amount;

```

## この章で行ったこと

1. テストの改善

1. テストとコードの結合度を削減


``` DollarTest.java

public class DollarTest {

    @Test
    public void testMultiplication(){
        Dollar five = new Dollar(5);
        assertEquals(new Dollar(10),five.times(2));
        assertEquals(new Dollar(15),five.times(3));
    }

    @Test
    public void testEquality(){
        assertTrue(new Dollar(5).equals(new Dollar(5)));
        assertFalse(new Dollar(5).equals(new Dollar(6)));
    }
}

```

``` Dollar.java

class Dollar {

    private int amount;

    Dollar(int amount){
        this.amount = amount;
    }

    Dollar times(int multiplier){
        return new Dollar(amount * multiplier);
    }

    public boolean equals(Object object){
        Dollar dollar = (Dollar)object;
        return amount == dollar.amount;
    }
}

```
.vimrcや.bashrcをgit管理しつつ、local毎の環境も書きたかった

dotfile類はgithubで管理して、symbolic linkですぐ使えるようにしてたい。

とはいえ、gitにはあげたくないデータもあったり

そんな場合にやったこと（もっといい方法ありそうだけど

## vim
.vimrc で環境による依存はあまりないけど、プロジェクト毎のctagとか、たまにある。

```lang:.vimrc
" ------------------------------------
" localの設定
" ------------------------------------
if filereadable(expand($HOME.'/.vimrc_local'))
  source $HOME/.vimrc_local
endif
```

```lang:.vimrc_local
set tags=/path/to/tags
```

## bashrc
```lang:.bashrc
# 個々の環境のbash設定を読み込む
if [ -e "${HOME}/.bashrc_local" ]; then
  source "${HOME}/.bashrc_local"
fi
```

```lang:.bashrc_local
# プロジェクト毎に便利なaliasとか
# そういうやつ
```

どちらも、.hoge_local ファイルはgit管理にせず、ローカルだけに持っておく
edn(extensible data notation)を使う

# ednとは
https://github.com/edn-format/edn

google翻訳
>EDNは、拡張可能なデータ表記法である。 EDNのスーパーセットは、プログラムを表現するためのClojureによって使用され、それはDatomicとデータ転送フォーマットのような他のアプリケーションによって使用される。この仕様は、他の言語でのリーダーとライターの実装を容易に助け、他の用途のためにするために、それらと他の特定のユースケースからの単離にEDNについて説明します。

そんな感じ。

# edn読込

```edn:config.edn
{"結城友奈は勇者である" "test"
 "天体のメソッド" "天メソ"}
```

```clj
(:require [clojure.edn :as edn])
```
で、

```clj
(edn/read-string (slurp "config.edn"))
```
を使って読み込んでやれば良い。

簡単簡単。

![edn.png](https://qiita-image-store.s3.amazonaws.com/0/39243/39473c0c-ae3c-cd51-b49d-9caa3785c9a7.png)
git ls-files

細かい操作をするときによく使うのでメモ

###インデックスにキャッシュされているファイルを表示
```
git ls-files -c
```

###更新されたファイルを表示
```
git ls-files -m
```

###インデックスのオブジェクト名、mode bits、stage number を表示
```
git ls-files -s
```

###追跡されていないファイルの一覧を表示
```
git ls-files -o
```

###マージされていないファイルの一覧を表示
```
git ls-files -u
```

###サブディレクトリにいるときにファイルの一覧をリポジトリのルートからのパスで表示

```
git ls-files
```

```
git ls-files --full-name
```
※git リポジトリのルートからのパスで表示

###標準的に無視されるファイルを除いた追跡されていないファイルの一覧を表示

```
git ls-files -o
```

.gitignore にマッチするファイルを含めた追跡されていないファイルの一覧が表示

```
git ls-files --exclude-standard -o
```

とすると無視されるファイルが除外

### git管理下で無視したファイル（assume-unchanged,skip-worktree） を確認する

```
git ls-files -v
```

- assume-unchanged
    - 状態が小文字で表示
- skip-worktree
    - 状態がSで表示
JNIを使っているAndroidプロジェクトのパッケージ名を変更する


## 前置き
Javaのソースコードだけで構成されているプロジェクトならば、パッケージ名の変更は簡単です。
が、nativeのコードを入れているプロジェクトでは一筋縄では行きませんでした。


## 方法

### 1. 普通にパッケージ名を変更する

[こちらのサイト](http://kumikomi.asablo.jp/blog/2011/07/04/5942336) や [こちらのサイト](http://youkey.jimdo.com/android%E9%96%8B%E7%99%BA%E3%81%AB%E5%BD%B9%E7%AB%8B%E3%81%A4%E5%B0%8F%E3%83%8D%E3%82%BF/%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E5%90%8D%E3%81%AE%E5%A4%89%E6%9B%B4-eclipse/) に説明があるので、説明通りに変更します。

Eclipseを使っていると、Renameの時に「nativeのメソッドがあるよ！」と警告が出ますが、どうしようもないのでOK押してRenameしましょう。

[Google Cloud Messaging](http://www.techdoctranslator.com/android/guide/google/gcm/gs)なんかを使っている場合は、その設定部分も自力で書き換えないといけないようです。

### 2. nativeのファイルを編集する
困ったことに、パッケージ名の区切り文字がピリオド `.` ではないのです。
IDEの置換機能や、`sed`などを使って置換すれば良いでしょう。

#### 2.1. nativeから呼び出すJavaのクラス名
`FindClass` なんかで、パッケージ名を含んだクラス名を指定するところです。

スラッシュ `/` 区切りなので、例えばこんなふうになります。

```
net.kikuchy.sample_app
↓
net/kikuchy/sample_app
```

#### 2.2. Javaから呼び出される関数の名前
Javaから呼び出される関数は、何かのパッケージ名を含んだ名前になっている必要があります。

アンダーバー `_` 区切りです。パッケージ名にアンダーバーが入っている場合は、 `1` でエスケープします。
なぜ `1` なんだ…？

```
net.kikuchy.sample_app.MainActivity の hogeMethod
↓
Java_net_kikuchy_sample_1app_MainActivity_hogeMethod
```


他にパッケージ名を書いてる部分がなければ、これで全部だと思います。
変更し忘れたところがあって実行中に突然クラッシュされたりとか、ないようにしたいものですね。

## 参考
- http://kotatsu52.hatenablog.com/entry/2012/08/12/150544
Gitのコミットメッセージの書き方

Gitのコミットメッセージの書き方
=============

自分なりにまとめてみました。Git歴浅いので、意見募集中です。

**（2014年12月17日追記）
想像以上にたくさんの方にストックなりはてブなりいただいたので、はてブでなるほど！と思ったコメントをもとに少し修正・加筆してみました。**

**（2022年1月4日追記）
最新の書き方をこちらに書きました。
https://zenn.dev/itosho/articles/git-commit-message-2023**

原則
--

以下のフォーマットとします。

*1行目：変更内容の要約（タイトル、概要）
2行目 ：空行
3行目以降：変更した理由（内容、詳細）*

日本語でも英語でもOKですが、リポジトリで統一してください。

1行目
---

コミット種別と要約を書きます。フォーマットは以下とします。

*[コミット種別]要約*

### コミット種別

以下の中から適切な種別を選びます。
（多すぎても悩むのでこれぐらいで）

#### 通常版
* fix：バグ修正
* hotfix：クリティカルなバグ修正
* add：新規（ファイル）機能追加
* update：機能修正（バグではない）
* change：仕様変更
* clean：整理（リファクタリング等）
* disable：無効化（コメントアウト等）
* remove：削除（ファイル）
* upgrade：バージョンアップ
* revert：変更取り消し

**（2014年12月17日追記）**
**コミットが種別が多すぎて、運用が大変そうというコメントがありましたので、ライト版を考えてみました。**

### ライト版

* fix：バグ修正
* add：新規（ファイル）機能追加
* update：機能修正（バグではない）
* remove：削除（ファイル）

### 要約

変更内容の概要を書きます。シンプルかつ分かりやすく。（難しい）

【例】削除フラグが更新されない不具合の修正


3行目
---

変更した理由を出来るかぎり具体的に書きます。
Redmine等のチケットと連携している場合はここで紐付けを行います。

【例】refs #110 更新SQLの対象カラムに削除フラグが含まれていなかったため追加しました。

まとめ
---

こんな感じで！

### スリーライン派（コミットベース派）

> [fix]削除フラグが更新されない不具合の修正
> 
> refs #110 更新SQLの対象カラムに削除フラグが含まれていなかったため追加しました。

**（2014年12月17日追記）**
**1行で出力したときにすぐわかるように、チケットは1行目の先頭に書いて欲しいというコメントがありまして、ワンライン派（チケット駆動というかチケットに詳細書いてある人用ですかね）を追加しました。**

### ワンライン派（チケット駆動派）

> [fix]refs #110 削除フラグが更新されない不具合の修正
> 
> 更新SQLの対象カラムに削除フラグが含まれていなかったため追加しました。

※チケットに詳細を書いている場合は1行のみでもOK。


コミット単位について
----------

主旨とはそれますが、コミットは出来る限り細かい粒度で行ってください。
「細かい」の基準は難しいと思っていますが、ひとまず、複数のバグの修正をひとつのコミットのまとめる等はNGです。
最低限自分なりの哲学や一貫性があれば（説明出来れば）、OKかなと思っています。
あとは参考URLを参考にしてください。（丸投げ）


参考URL
-----
変更を記録するコミット：
http://www.backlog.jp/git-guide/intro/intro1_3.html
git commit時のコメントを英語で書くための最初の一歩：
http://www.sssg.org/blogs/hiro345/archives/11721.html
クリアなコードの作り方: 意図が伝わるコミットのしかた：
http://www.clear-code.com/blog/2012/3/13.html
提言: コミットメッセージの一行目には要求仕様を書け：
http://qiita.com/magicant/items/882b5142c4d5064933bc
[翻訳] 私のコミットをまとめないで：
http://qiita.com/gogotanaka/items/8c55f69120965b077737
[翻訳] Git 活用法 ーコードはいつも1行ごとにドキュメント化されている
http://postd.cc/every-line-of-code-is-always-documented/
Symfony2のWebTestCaseでカジュアルにリンクチェックをする

事は、発リンクがSymfony2の外側にあるとできないらしい。

[Symfony 2 Functional Testing external URL](http://stackoverflow.com/questions/17657544/symfony-2-functional-testing-external-url)

WebTestCaseは[ファンクショナルテスト](http://docs.symfony.gr.jp/symfony2/book/testing.html#index-2)を実現するためのクラスですが、実際にはHTTPリクエストを行わない(与えられたパス情報を元にSymfony2内部でテスト対象となるHTMLを生成する)ため

```php
$client->request('GET', 'http://example.com/');
```

とかやってもだめなので、自分でHTMLを取ってきて直接[DomCrawler](http://docs.symfony.gr.jp/symfony2/components/dom_crawler.html)に食わせるといいでしょう。

```php

// http://example.com/内のid=fugaのリンク先がhttp://example.com/hoge/である確認
$this->assertFromToUrl('http://example.com/', 'http://example.com/hoge/', 'id("fuga")');

private function assertFromToUrl($fromUrl, $expectedToUrl, $targetLinkXpath)
{
    if (!$html = file_get_contents($fromUrl)) {
        $this->fail('リンク元ページ(' . $fromUrl . ')の取得に失敗しました');
    }
    $crawler = new Crawler($html);
    $actualToUrl = $crawler->filterXPath($targetLinkXpath)->attr('href');

    $this->assertEquals(
        $expectedToUrl,
        $actualToUrl,
        '(' . $fromUrl . ')内の"' . $targetLinkXpath . '"のリンク先は(' . $expectedToUrl . ')になっているべきですが(' . $actualToUrl . ')になっています'
    );

    if (!file_get_contents($actualToUrl)) {
        $this->fail('リンク先ページ(' . $actualToUrl . ')の取得に失敗しました');
    }
}

```

的な。なお、ちゃんとしたブラウザテストをやるなら最初からSeleniumとか使ったほうが良いでしょう。
gulpとimageminのこと

gulp-imageminが可愛い子チャンだけど、いろいろ問題が出てきた。

## ずっとwatchしてるといちいち重い

```
% gulp &
``` 
でバックグラウンドでgulpを起動しておきます。
画像を追加したら、imageminとか適当にタスクつくって

```
% gulp imagemin
```
でミニファイすれば万事おけ。


## 途中経過のログを表示したい

```
gulp imagemin --verbose
```
gruntはデフォルトなのにね。
`verbose`は冗長という意味らしい。


## めちゃめちゃコード短いから、読んだり改造したほうが楽になれる

node.jsの勉強にも
https://github.com/sindresorhus/gulp-imagemin/blob/master/index.js
要素の中身が変更されたことを知る

##問題点
・JavaScriptのchangeイベントはformの要素にしか使えない
・divの中身が変更されてもイベントは発生しない

```js
$('<div>').change(function() {
    // 発生しない
});
```

・付け加えるとresizeイベントもwindowオブジェクトにしか使えない

```js
$('<div>').resize(function() {
    // 発生しない
});
```
##どうするか？

1.setIntervalで常に変化を監視する

```html:index.html
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script type="text/javascript">
var content = null;
$(document).ready(function() {
	$('#click_me').click(function() {
		$('#sample').text('Change!');
	});
	var a = function() {
		if (content != $('#sample').text()) {
			if (content != null) {
				alert('Change!');
			}
			content = $('#sample').text();
		}
	};
	setInterval(a, 300);
});
</script>
</head>
<body>
<input type="button" id="click_me" value="Click!">
<div id="sample"></div>
</body>
</html>
```

2.DOMSubtreeModified propertychangeイベントを追加する

```html:index.html
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script type="text/javascript">
var content = null;
$(document).ready(function() {
	$('#sample').on('DOMSubtreeModified propertychange', function() {
		alert('Change!');
	});
	$('#click_me').click(function() {
		$('#sample').text('Change!');
	});
});
</script>
</head>
<body>
<input type="button" id="click_me" value="Click!">
<div id="sample"></div>
</body>
</html>
```

動作検証
Chrome 38.0.2125.111 m:OK
Firefox 32.0.1:OK
IE 11.0.9600.17416:OK

比較的新しいブラウザなのに動かないよ、という方のコメントをお待ちしています。
EPUBをMOBIに変換してKindleで持ち歩くまで

達人出版会の電子書籍をKindleで読みたいなと思ったのが動機です。達人出版会では、PDFとEPUB形式で電子書籍を配布しています。

流れとしては、EPUBをMOBIに変換してKindleに転送します。

# 1. EPUBをMOBI形式に変換する
以下のサイトで変換しました。サーバ上にアップロードして処理する方式なので、重要な文章とかを対応したいとなると、別な方法を考える必要がありそうです。

- [→電子ブックファイルのフォーマットを変換するepub mobi lrf pdb pdf rtf](http://www.henkan-muryo.com/ebook-converter.php)

# 2. Send to Kindleアプリケーションでアップロードする

Amazonから送るためのツールがたくさん用意されているので、以下の中から選んで使います。私は最初、Windows版をインストールして使いました。アップロードしたいファイルをドロップするだけなので、とても簡単です。

![image](https://qiita-image-store.s3.amazonaws.com/0/27707/74f9e265-8b0b-4996-bdf2-934253c2c81e.png)

以上の手順で完了です。
ちなみに変換したファイルですが、画像が潰れたりせず、いい感じに変換できていました。

![screenshot_2014_11_21T19_40_27+0900.png](https://qiita-image-store.s3.amazonaws.com/0/27707/56f4e6bb-1912-caab-2412-e90ebc63e4f8.png)
Paperclipでアップロードするファイルのcontent_typeの確認方法



ご存知の通り、Paperclipは画像だけでなく各種ファイルをアップロードする機能をRailsアプリケーションに組み込むことのできる超便利gemです。

validates_attachment_content_typeのcontent_typeに渡すファイルタイプは、OSXであればfileコマンドで確認できます。


* Excelの場合、

```bash
file -I sample-excel.xls
sample-excel.xls: application/vnd.ms-excel; charset=binary
```

* Powerpointの場合、

```bash
file -I sample-powerpoint.pptx
sample-powerpoint.pptx: application/zip; charset=binary
```

あとはcontent_typeに以下のように設定すればOKですね。

```ruby
validates_attachment_content_type col,
			:content_type => ["application/vnd.ms-excel", "application/zip"]
```

## 追記(2014.11.21)
上記の方法ではアップロード時にエラーになってしまうファイルタイプがありました(特にOffice製品)。
色々試行錯誤して調べた結果、下記のような設定にしたところアップロードすることが可能に。

|拡張子|content_type|
|:--|:--|
|.doc|application/msword|
|.docx|application/vnd.openxmlformats-officedocument.wordprocessingml.document|
|.xls|application/octet-stream|
|.xlsx|application/vnd.openxmlformats-officedocument.spreadsheetml.sheet|
|.ppt|application/vnd.ms-powerpoint||
|.pptx|application/vnd.openxmlformats-officedocument.presentationml.presentation|
|.pdf|application/pdf|


調べ方は単純で地道にデバッグして変数の値を追います。
paperclipのコードをbundle openで開いて、attachement_content_type_validator.rbにブレークポイントを置きます。
以下のコードの場所にブレークポイントを置けば、アップロードに失敗したときに止まりますね。

```
def validate_each(record, attribute, value)
 
~(省略)~       
       
  if record.errors.include? attribute

    binding.pry #ブレークポイント
          
    record.errors[attribute].each do |error|
      record.errors.add base_attribute, error
    end
  end
end
```

引数でmodelオブジェクトが渡されてくる(record)ので、

```
record.{アップロードするフィールド}_contant_type 
```

で、modelに格納されているアップロードしたファイルのcontent_typeが確認できます。
やり方として正しいのかわかりませんが、とりあえず。




## 参考

[How to validate file content type to pdf, word, excel, and plain terxt for paperclip?](http://stackoverflow.com/questions/8818251/how-to-validate-file-content-type-to-pdf-word-excel-and-plain-terxt-for-paper)
Xamarin.Forms の iOS アプリで FormatException で trycatch したら null だめよと怒られる

こんにちは。エクセルソフトの田淵です。

素人が見よう見まねが書いていたところ、以下のページで緯度経度を入力せずに Move ボタンを押すと、iOS だけ怒られます。Android/WP はちゃんと `DisplayAlert` してくれます。
こういうのどうすればいいんでしょうか…？

https://github.com/ytabuchi/xamarin-forms/blob/master/VSXF_Maps/VSXF_Maps/VSXF_Maps/InputPage.cs

```csharp:InputPage.cs
    class InputPage : ContentPage
    {
        Map map;

        public InputPage()
        {
            map = new Map();
            var position = new Position(35.685402, 139.752826);
            map.MoveToRegion(new MapSpan(position, 0.01, 0.01));

            var button = new Button { Text = "Move!" };

            var input1 = new Entry
            {
                Keyboard = Keyboard.Numeric,
                Placeholder = "34.702485",
                HorizontalOptions = LayoutOptions.FillAndExpand,
            };
            var input2 = new Entry
            {
                Keyboard = Keyboard.Numeric,
                Placeholder = "135.495951",
                HorizontalOptions = LayoutOptions.FillAndExpand,
            };

            button.Clicked += (sender, e) =>
            {
                try
                {
                    var newposition = new Position(double.Parse(input1.Text), double.Parse(input2.Text));
                    map.MoveToRegion(new MapSpan(newposition, 0.01, 0.01));
                }
                catch (FormatException)
                {
                    DisplayAlert(null, "数値を入力してください", "OK");
                }
                
            };

            Content = new StackLayout {
                Padding = new Thickness(0, 20, 0, 0),
                Orientation = StackOrientation.Vertical,
                Children = {
                    new StackLayout {
                        Orientation = StackOrientation.Horizontal,
                        Children = {
                            input1,
                            input2,
                            button,
                        },
                    },
                    map,
                },
            };

        }

    }
```

どなたかご存じの方突っ込みお願いします。。

以上です。。
pod install で target overrides the `OTHER_LDFLAGS` build setting...

# 概要

![pod.png](https://qiita-image-store.s3.amazonaws.com/0/7823/ce28d2a0-133d-f3f6-6ddd-7f0c3d68d4a3.png)

pod install すると警告が出た。

```
[!] The `myapp [Debug]` target overrides the `OTHER_LDFLAGS` build setting defined in `Pods/Target Support Files/Pods/Pods.debug.xcconfig'. This can lead to problems with the CocoaPods installation
    - Use the `$(inherited)` flag, or
    - Remove the build settings from the target.

```

$(inherited) を使えと言われてもどこに追記すれば良いの？

# 対応

Xcode を起動して、

Buid Settings > Linking > Other Linker Flags に追記してあげる。

![stampnews_xcodeproj.png](https://qiita-image-store.s3.amazonaws.com/0/7823/a3ebf456-b9e5-40ee-f64f-1908ae8091e2.png)

これで pod install 時の警告が消えた。

```
kakipo@Mac-mini % pod install 
Analyzing dependencies
Downloading dependencies
Using SVProgressHUD (1.0)
Generating Pods project
Integrating client project
```
Docker管理下のLXCにAndroid端末接続 

[ScalaでAndroid開発 - Docker編](http://qiita.com/ikuo/items/dddf1276167f942d1bb6)の(2)で散々悩んだんだけど、Android端末及びエミュレータの接続で、リンク先のようなめんどくさい設定する必要がないことがわかった。

何をするかというと、Androidのtcpモードを利用する。このtcpモードは接続している端末に`adb -s <dev_name> tcpip <port>`というコマンドを実行することで設定できる。これを行うことで、実機及びエミュレータにネットワーク経由で接続できるようになる。

後は簡単。

実機の場合はホスト接続して、TCPモードを実行後、ネットワーク経由で接続する。
エミュレータの場合は、kvmでandroidエミュレータを作り、ネットワーク経由で接続する。エミュレータ作成にはAndroid_x86で配布されているISOファイルを利用した。下記はkvmの作成コマンドだ。

```
$qemu-img create android01.img 1G
$sudo kvm -m 2048 -vga std -cdrom <iso file> -hda android01.img -net nic,macaddr=00:30:67:40:34:b3,model=pcnet -net tap,ifname=tap4 -boot d &
```

あー　スッキリした。

※1.色々試した結果、dockerはvirtualboxやvmwareを使って立ちあげたAndroidには接続できない。
※2.virtualboxとvmware、lxcは相性が悪い。（5回母艦がフリーズした。）
※3.Ubuntu14.04LTSの環境下による試行です。

※4.本題。現在、adbのいきなり切断問題の回避プログラム書き中。。。（いい加減に直せよ、Google!!）
Railsを使わずにActiveRecordを使う方法

Railsを使わずにActiveRecordを直接呼び出せると便利です。
このような場合、
1. active_recordをrequireする
2. ActiveRecord::Base.establish_connectionでDBに接続する。
3. ActiveRecord::Base.connection.create_tableなどでテーブル操作を行う。
4. ActiveRecord::Baseを派生させてモデルを作成
5. あとは普通にモデルを操作できます(create/all/findなど)

具体例は以下のとおりです。(paiza.IOを使っているので、実際に変えながら試してみれます。)

https://paiza.io/projects/DgzLdPa3DtwEFyVl9VUFKg
[![スクリーンショット 2014-11-21 午後6.52.54.png](https://qiita-image-store.s3.amazonaws.com/0/9152/fa824ced-841d-4233-35ff-9a1b9ac8a8c3.png)](https://paiza.io/projects/DgzLdPa3DtwEFyVl9VUFKg)