OmniAICreator/Qiita-1.07M huggingface dataset:
Rustを始めてみた

# 2017年10月追記

以下の記事は2014年のものです。
いまは、Rust公式ページにもあるようにrustupを入れれば、
nightlyも安定板も切り替えて使えますし、Cargoもとくに
自分で入れなくても勝手に入ります。

# はじめに

最近node-ffiやって、libuvに割りと近づいてきたので、libuvつながりのrustを始めてみた。

# いきなりGUIを使いたいんだけど

## ffiな機構の存在を知る

- [The Rust Foreign Function Interface Guide](http://doc.rust-lang.org/guide-ffi.html)

## 画像が出せるようなライブラリを探す

[node-webcl](http://qiita.com/kjunichi/items/9c8254b5f292d7123f80)(node-webglもあるけどｗ)で知った。glfwというGLUTに取って代わるかもしれないOpenGLのフレームワーク？があり、rustでもこれを使ったものがあり、今回は、これのexampleを動かすところまで辿りつけた。

# 実践編

## Rust本体はNightlyをtarballで入れた

pkg形式はイマイチよくわかっていないので、何が入っているか
分かった気になるtarballを入れようとは決めていたが、
公式でインストルボタンをクリックするとNightlyを進めてきたので、
0.11ではなく、Nightlyを入れた

### tarを展開するだけだとエラー

dylibイマイチわからないです。tarを展開して~/local配下に置いて、

```
rustc --version
```

としたら、

```text
dyld: Library not loaded: x86_64-apple-darwin/stage1/lib/rustlib/x86_64-apple-darwin/lib/libnative-4e7c5e5c.dylib
  Referenced from: /Users/kjunichi/local/rust-nightly-x86_64-apple-darwin/bin/rustc
  Reason: image not found
Trace/BPT trap: 5

```

Nightlyだから、今回ハズレだったのかぁと、並列作業してた、FirefoxのNightlyビルドの残念動作をみながら思ったが、続けた。

付属のinstall.shを斜め読みして、挫折して、鵜呑みに実行。

```
./install.sh
```

動いた

```bash
rustc --version
rustc 0.12.0-pre-nightly (09abbbdaf 2014-09-11 00:05:41 +0000)
```

## CargoというnpmのRust版を知る

```
git clone https://github.com/bjz/glfw-rs.git
glfw-rs/
```

Makefileが無い。Cargo.tomlなるファイルが怪しい。

CargoがRustでのメジャーなパッケージ管理システムらしい。

### Cargoを入れる

Nightly向けのバイナリまで配っているようなので、行けるかなと思い、githubあらcloneしてCargoを入れてみたら出来た。

```
git clone https://github.com/rust-lang/cargo
./configure 
make
make install
```
### 今度こそglfw-rsを動かす

よくよくglfw-rsのREADME.mdみるとcargoコマンドでの作業が書いてあったｗ

```
cargo build
cargo test
./target/title
```

動いた

![rustGlfwTitle.png](https://qiita-image-store.s3.amazonaws.com/0/3458/1e991f89-45f6-4171-5b9b-0e94d8882323.png)


# まとめ

rustではHello Worldより先にウィンドウを表示出来た。

これで準備ができたので、次は[「プログラムでシダを描画する」](http://qiita.com/qt-luigi/items/b22204c7ef73260324bd)のRust版を目標に勉強進めよう。

# 関連記事

- [RustでFaceTime HDカメラやWebカメラを使う](https://abrakatabura.hatenablog.com/entry/2014/10/23/063643)
- [libtrusterdをRustで動かした](https://abrakatabura.hatenablog.com/entry/2015/07/17/074714)
- [Rustでコマンドラインアプリでキーが押されたかの判定しつつ、別の処理も進めるには](https://abrakatabura.hatenablog.com/entry/2017/09/20/065024)
- [RustでWebカメラの映像をコマンドプロンプトに出すコマンドを作った](https://abrakatabura.hatenablog.com/entry/2017/09/21/064630)
- [RustでGoのライブラリを使うときのCargoのbuild.rsの書き方](https://abrakatabura.hatenablog.com/entry/2017/10/22/110223)
- [2018年版、Rustで多次元配列を使うには](https://abrakatabura.hatenablog.com/entry/2018/07/15/203516)
よーしパパgemを作って公開しちゃうぞー( ｰ`дｰ´)ｷﾘｯ、なときのシンプルなやり方

(bundlerを使った)gemの作成・運用・公開方法まとめです。

gemを作るワークフローにはさまざまなモノがあり、作成ライブラリもいくつかあって複雑に感じやすいと思いますが、

下記のbundlerを使う方法が一番シンプルで分かりやすいと思います。

1.gemのプロジェクトを作る

```
$ bundle gem gem_name #基本となるファイルが作られる
```

2.gemspecファイルを、空気を読みつつ直す

3.version.rb を編集する
※同一バージョンででgemを再度公開しようとするとエラーが出ますので、
gem公開のたびにバージョンをインクリメントする必要があります。

4.gemfileの作成

```
$ rake build
```

5.ローカル環境へのインストール

```
$ rake install
```

6.gemの公開

```
$ rake release
```
rake releaseすると誰もが触れられるようになりますので、
うっかりパスワードやらAPIキーを入れたままこのコマンドを叩くと怖いことになるので気をつけましょう(ﾉ∀`)

ちなみに作ったgemをメンテしていく場合は、

4～6をやると良いです。

参考URL：
http://ja.asciicasts.com/episodes/245-new-gem-with-bundler
メソッド定義場所を探してソースコードを読んでみよう

Railsをはじめて触ったとき

```rb
5.days
```
と書けてびっくり(ﾟдﾟ)！した人も多いのではないでしょうか。
数字クラスが```hours```とか```days```とかのメソッドを持ってるんですよね。


Rubyでは、自分のソースコードの好きなところで

```rb
# Numericクラスにメソッドを追加
class Numeric
  def 
    p 'foobar'
  end
end
```

```rb
3.foobar
=> "foobar"
```

のように、基本クラスを拡張できてしまいます。
これは開発者誰もがクラスにメソッド定義が行えて強力な一方、
ソースを見て動作を知りたいと思った時に、どこでメソッド定義されているのか探すのが大変です。

そこでRubyでは、```Method#owner()```, ```Method#source_location()```という定義情報にアクセス出来るメソッドが用意されています。

それでは冒頭の「3.days」がどこで定義されているか調べてみましょう。

```rb
m = 3.method(:days) # Methodオブジェクトを取得できる
m.owner #  どのクラスで定義されているか取得する
=> Numeric 
m.source_location # 定義場所と行番号を返却
=> ["/my/preoj/vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.8/lib/active_support/core_ext/numeric/time.rb", 49]
```

以上のように、NumericクラスをActiveSupportが拡張していることがわかりました。

Railsや他人のコードを読んでいる時に、「この挙動、どうなっているんだろう」と思った時に思い出すと幸せになれます。

Rubyでは、JavaのEclipseのようにGUIで簡単に探す方法がなくて大変ですね！(Java使ったことないけど(ﾉ∀`)ｱﾁｬｰ)

参考URL:
http://ruby-doc.org/core-2.1.2/Method.html
python + sqlite3でリストを簡単に扱う


sqlite3にはリスト型は存在しないため、例えばintegerのリストを格納したい場合は`str()`して;(セミコロン)区切りの文字列に`join()`して格納、取り出すときは`split()`して`int()`するという操作が必要となる。

sqlite3モジュールにはこれらの操作を予め登録し必要に応じて自動で実行する仕組みが存在している。

これによりリスト要素の型が全て一致していることがわかっているのであれば、変換関数を`register_adapter()`と`register_converter()`を使って登録することでリストをシームレスに扱うことができる。

以下の例ではtesttableに`IntList`という型を定義して`register_adapter()`と`register_converter()`を使いpythonのデータ型との変換方法を登録している。
connectするときの`detect_types = sqlite3.PARSE_DECLTYPES`は必須。

```py:test.py
import sqlite3

CREATE_TABLE = u"""
create table if not exists testtable (
  id      integer primary key,
  intlist IntList
);
"""

IntList = list
sqlite3.register_adapter(IntList, lambda l: ';'.join([str(i) for i in l]))
sqlite3.register_converter("IntList", lambda s: [int(i) for i in s.split(';')])

def main():
    con = sqlite3.connect(":memory:", detect_types = sqlite3.PARSE_DECLTYPES)
    con.row_factory = sqlite3.Row
    con.execute(CREATE_TABLE)

    insert_list = [1,2,3]
    con.execute(u'insert into testtable values(?, ?)', (1, insert_list))
    con.commit()

    cur = con.cursor()
    cur.execute(u'select * from testtable;')
    assert insert_list == cur.fetchone()['intlist']

if __name__ == '__main__':
    main()
```

`register_adapter()`と`register_converter()`はユーザ定義の型でももちろん利用可能。
参考: http://docs.python.jp/2/library/sqlite3.html#id6
設定ファイルを複数ファイルに分割して管理する構文のまとめ

# はじめに

設定ファイルは中身が肥大化してくると,
機能ごとなど, 複数ファイルに分割して管理した方が整理でき, 全体を見通せる.
また, 設定を追記するときも, 追記する場所が自ずと決まり,
中身が段々ぐちゃぐちゃになっていくということも未然に防げる.

Git, SSH, bashやzsh, Vim, Emacsで設定ファイルを分割する例文は以下のとおり.

# Git

[`include`](https://git-scm.com/docs/git-config#_includes)ディレクティブを使う.

```conf:~/.gitconfig
[include]
    path = .gitconfig.d/user.gitconfig  # userの設定
    path = .gitconfig.d/alias.gitconfig # aliasの設定
    path = .gitconfig.d/diff.gitconfig  # diffの設定
```

# SSH

`Include`ディレクティブを使う.

```conf:~/.ssh/config
Include conf.d/aws.conf     # Amazon EC2などの設定
Include conf.d/vagrant.conf # Vagrantの設定
Include conf.d/home.conf    # 自宅サーバの設定
```

# sh

```bash:~/.bashrc
bash_conf=~/.bash/conf

. $bash_conf/alias-init.bash    # aliasの設定
. $bash_conf/function-init.bash # 関数の設定
. $bash_conf/prompt-init.bash   # プロンプトの設定
```

# Vim

[`:source`](https://vim-jp.org/vimdoc-ja/repeat.html#load-vim-script)を使う.

```vim:~/.vimrc
let $VIM_CONF = $HOME . '/.vim/conf'

source $VIM_CONF/bundle-init.vim " NeoBundleの設定
source $VIM_CONF/unite-init.vim  " Uniteの設定
```

# Emacs

```console
$ ls ~/.emacs.d/conf
font-init.el
org-init.el
helm-init.el
```

上記のように分割ファイルを配置するならば,
下記のように`init.el`に読み込めば良い.

```emacs-lisp:~/.emacs.d/init.el
(add-to-list 'load-path "~/.emacs.d/conf")

(load "font-init") ; フォントの設定
(load "org-init")  ; org-modeの設定
(load "helm-init") ; helmの設定
```
Play Framework個人用メモ



### アプリケーション構成

>
http://libro.tuyano.com/index3?id=1053004


### Playコンソールの使い方

>
http://playframework.blog.fc2.com/blog-entry-3.html



### DB設定(Mysql)

```
/path/to/project/conf/application.conf
```

で設定する

>
http://qiita.com/yu_naka0607/items/5fdd089446d608d67333
http://www.atmarkit.co.jp/ait/articles/1307/02/news021.html
http://qiita.com/dahugani/items/bb0bbd8fb263bc19cc57


```application.conf
db.default.driver=com.mysql.jdbc.Driver
db.default.url="jdbc:mysql://[HOST]/[DB_NAME]?characterEncoding=UTF8"
db.default.user=[DB_USER]
db.default.password=[DB_PASSWORD]
#実行されたSQLを出力するように指定
db.default.logStatements=true
```


更にmysqlのモジュールを追加する必要があるようなので以下を

```
/path/to/project/build.sbt
```

に追記する

```build.sbt
name := "sample"

version := "1.0-SNAPSHOT"

libraryDependencies ++= Seq(
  jdbc,
  anorm,
  cache,
  "mysql" % "mysql-connector-java" % "5.1.24" //この行を追加してる
)

play.Project.playScalaSettings
```


追加後は以下起動コマンドで自動でモジュールを追加してくれるらしい

```
play run
```





###play runの終了方法
killするしかないらしい

>
http://shigemk2.hatenablog.com/entry/2014/05/16/play_run%E3%81%A8%E3%81%9D%E3%81%AE%E7%B5%82%E4%BA%86
Passing data between view controllers from a UITabBarController stack using Swift

Let us have two UIViewController classes named viewController1 and viewController2 in our UITabBarController stack and have them as VC1 and VC2 respectively

    var VC1: viewController1 = viewController1.alloc()
    var VC2: viewController2 = viewController2.alloc()

Let us also have a UITabBarController class named TabBarController and name them tBc

    var tBc: TabBarController = TabBarController.alloc()

Then let us contain them in that UITabBarController

    tBc.viewControllers = [VC1,VC2]

That is what we need for our Application delegate or something that will initialise our TabBarController

Assuming we have a UILabel named "myLabel" on VC2, let us say we wish to pass data from VC1 to the UILabel on VC2. We would then have this on VC1 to do it:

    var vcArray = self.tabBarController?.viewControllers as NSArray!

This would fetch the view controllers in the tabbarcontroller's stack and list them in an array. Then make next UIViewController known on VC1 and name it nextVC:

           var VC2: UIViewController = vcArray.objectAtIndex(1) as UIViewController
           var nextVC = VC2 as viewController2

Then you could now pass data on the next viewcontroller like having this on VC1:

           nextVC.myLabel.text = "This will appear on the next view"
VagrantにServerspecをインストール

## 概要

Serverspecはサーバテスト用フレームワークで、サーバのテストコードをRSpecで記述

公式サイト - http://serverspec.org/

サーバ構築の自動化はChefやPuppetで実現できるが、それが本当に正しいインストールや設定が反映されているかをテストコードによって自動でチェックできるとても便利なフレームワーク

今回はVagrant上にServerspecをインストールし、テストを実行するための環境を整える


## Vagrantを作成

centOSのboxでインスタンスを作成してVMにssh

```
$ vagrant init centos64
$ vagrant up
$ vagrant status
Current machine states:

default                   running (virtualbox)
$ vagrant ssh
[vagrant@vagrant-centos65 ~]$
```

## Serverspecのインストール

#### gemのインストール

gemコマンドがない

```
$ which gem
/usr/bin/which: no gem in (/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/vagrant/bin)
```

まずrubyをインストール

```
$ ruby -v
-bash: ruby: command not found
$ sudo yum install ruby
$ ruby -v
ruby 1.8.7 (2011-06-30 patchlevel 352) [x86_64-linux]
```

gemコマンドが使えるようにrubygemをインストール

```
$ git clone https://github.com/rubygems/rubygems.git rubygems
$ cd rubygems
$ sudo ruby setup.rb
RubyGems 2.4.1 installed
ERROR:  While executing gem ... (Gem::DocumentError)
    RDoc is not installed: no such file to load -- rdoc/rdoc
```

今度はRDocがインストールされていないと怒られたのでRdocをインストール

```
$ sudo yum install rdoc
```

再度セットアップスクリプトを実行

```
$ sudo ruby setup.rb
・・・
RubyGems installed the following executables:
	/usr/bin/gem
```

gemがインストールできたことを確認

```
$ which gem
/usr/bin/gem
[vagrant@vagrant-centos65 rubygems]$ gem -v
2.4.1
```

#### Serverspecのインストール

お待ちかねのServerspecをインストール

```
$ sudo gem install severspec
```

これでインストールが完了したので次はいよいよテストコードを書いてみようと思います


## 参考

http://qiita.com/pb_tmz08/items/269c43418894071dc0b1
キルミーベイベーTwitterアイコン自動登録スクリプト


## なにこれ
[キルミーベイベー限りなく公式HPに近いサイト](http://killmebaby.tv/top.html)内で配布された686枚のツイッターアイコンをランダムにプロフィール画像に登録させるRubyスクリプトです。
アイコンは[ここ](http://killmebaby.tv/special_icon.html)で配布されています。
**※追記しました（2014/09/18）**

## バージョン
`ruby 2.1.1`
`Twitter 5.11.0`

## 中身
ソースコードです

```killme.rb
# -*- coding: utf-8 -*-
require "twitter"

CONSUMER_KEY = "あなたのCONSUMER_KEY"
CONSUMER_SECRET = "あなたのCONSUMER_SECRET"
OAUTH_TOKEN = "あなたのOAUTH_TOKEN"
OAUTH_TOKEN_SECRET = "あなたのOAUTH_TOKEN_SECRET"

def killme_icon
  num1 = rand(12) + 1
  num2 = rand(145) + 1
  
  icon = "%02d" % num1.to_s + '_' + "%03d" % num2.to_s + '.png'

  puts icon # デバッグ用
  if true == File.exist?(icon)
    icon
  else
    killme_icon
  end
end

begin
  killme_twitter = Twitter::REST::Client.new do |cnf|
    cnf.consumer_key = CONSUMER_KEY
    cnf.consumer_secret = CONSUMER_SECRET
    cnf.access_token = OAUTH_TOKEN
    cnf.access_token_secret = OAUTH_TOKEN_SECRET
  end

  killme_twitter.update_profile_image(File.open(killme_icon))

rescue => e
  STDERR.puts "[EXCEPTION] " + e.to_s
  exit 1
end
```
Gistは[ここ](https://gist.github.com/mizukmb/963ff8408b454805c1ad)(更新してます。詳しくは追記参照)


`CONSUMER_KEY`とかは自分で設定してください。参考サイト（[http://ramtiga.hatenablog.jp/entry/20110409/p1](http://ramtiga.hatenablog.jp/entry/20110409/p1)）
あと、 **アイコン画像は直下** に置いてください。ディレクトリで分けたいという人は各自がんばってください（丸投げ）。
アイコン画像のファイル名はDL時のままで大丈夫です。リネーム不要。

## 動作
killme_iconメソッドでアイコン画像を指定。 **見つかるまで再帰します** のでご注意を
`.update_profile_image`で指定したアイコン画像にプロフィール更新
以上です

## 今後の展望
- 1日に1回プロフィール更新できるようにしたい（cronとか…？）
- WEBアプリケーション化(Rails + Heroku)
- プロフィール更新時に確認をする([y/n])←実装しました（2014/09/18）

## 追記（2014/09/18）
URL指定でプロフィール更新できるようになりました（ejo090さんありがとうございます）
新しく、 `nokogiri` 、 `open-uri` のライブラリを使用しています。持っていない場合は `gem install` をお願いします。
[Gist](https://gist.github.com/mizukmb/963ff8408b454805c1ad)のソースコードを更新しましたのでそちらを参照して下さい。
あとは、プロフィール更新するときに確認するようにしたのと、プロフィール更新時に自動的に呟くようにしたぐらいです。

## お知らせ
WEBサービスとして公開したので良かったら使ってください
[http://killme-twitter.herokuapp.com](http://killme-twitter.herokuapp.com)
fopen(3)の"e"オプション

fopen(3)の第二引数(mode)に指定できる文字といえば、"r"や"w"や"a"などですが、glibcの[fopen](http://linuxjm.sourceforge.jp/html/LDP_man-pages/man3/fopen.3.html)にはいくつかの追加modeがあります。

その中の"e"を使うと、open(2)を呼ぶときに`O_CLOEXEC`フラグを指定するようになります。`O_CLOEXEC`については、小崎さんのKernel Watchの記事「[ファイルディスクリプタリークを防げ！](http://www.atmarkit.co.jp/flinux/rensai/watch2008/watch08a.html)」に詳しい説明があります。簡単に言うと、フラグを指定してopenしたファイルディスクリプタは、exec時に自動的にcloseされるようになるという機能です。これを常に指定しておくと、forkとexecの間で全ファイルディスクリプタをcloseして回ったりしなくても済みます。

互換性のため無理でしょうけど、本来ならば`O_CLOEXEC`の挙動の方がデフォルトの方がセキュリティ的に良いでしょうね。
Unwind SegueがiOS8でうまくいかないのを無理矢理回避してみた（8.1ではfix済らしい）

# 背景
iOS7までは生き生きと動いていたunwind segueが、なぜかiOS8の端末だと動かなくなった。
もしかしたらXcode6のせいなのかもしれないけれど、とりあえず動いてくれないことにはとても困る。
ってことでなんとかして最小の手間でこれを正常化できないか試してみた。

## どうやらバグだったようです[2015/2/9 追記]
コメントで寄せられたリンクによれば、8.0のバグだったようですね。
[Unwind Segue not working in iOS 8](http://stackoverflow.com/questions/25654941/unwind-segue-not-working-in-ios-8/25842508#25842508)
> Apple has FIXED this bug in iOS 8.1

なので、この投稿はどうしても残る8.0への対応に使いたい場合にのみ参考にしてください。（ほぼ不要物ですね^^;

# いろいろ調べてみた
## どこで止まっているか
遷移元にあるはずのUnwind Segue用のメソッドが呼ばれない。storyboardでは確かに選べたはずなのに、なぜか呼び出されない。
twitterで検索してみたら「トップのViewControllerにしか戻れなくなってる」って話もあった。試しにより上位のController（UINavigationControllerとか）にそのメソッド置いてみたら、そっちはたしかに呼び出された。
https://twitter.com/tmasu/status/509617575391555584
## そもそもprepareForSegueも呼ばれない。
調べてみたらprepareForSegueの前段階でcanPerformUnwindSegueActionというのがあって、こいつがきっとNOを返してるんだと思った。
## canPerformUnwindSegueActionでYES返してみたらiOS7も死んだ
そこで、canPerformUnwindSegueActionでYESを返すようにしてみた。ところがなぜかこうすると今度はiOS7ですらprepareForSegueで```[segue destinationViewController]```が遷移先の自分自身になってしまい、正常に動かなくなってしまった・・・

# たどり着いた解決法
iOS7:segueをそのまま使う
iOS8:canPerformUnwindSegueActionでsegueを止めて、手動でデータセット+dismiss

とりあえずこれで動くっぽい。修正量も少ないし、何より遷移元はなにかメソッドを公開しておくだけで良いので後々動作が正常化した場合にも奇麗に戻しやすい。
## 汚いサンプルコード
```objc:遷移先（閉じたい）ViewController.mで
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    // ここは普通の実装
    HOGEHOGEViewController *controller = [segue destinationViewController];
    [controller setXXX:XXX];
}

- (BOOL)canPerformUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender
{
    // iOS8未満ならsuperクラスのメソッドを叩く。（なぜか普通にreturn YES;すると正しく動かない。）
    if ([[[UIDevice currentDevice] systemVersion] compare:@"8.0" options:NSNumericSearch] == NSOrderedAscending){
        return [super canPerformUnwindSegueAction:action fromViewController:fromViewController withSender:sender];
    }else{
        // iOS8の場合なぜかUnwind Segueが動かないため、手動でデータをセットしてmodalを閉じてunwindの処理を呼び出す
        UIViewController *destination = (HOGEHOGEViewController *)[(UINavigationController *)[self presentingViewController] topViewController];
        if ([destination isKindOfClass:[HOGEHOGEViewController class]]) {
            [destination setXXX:XXX];
            [self dismissViewControllerAnimated:YES completion:^{
                // 予めUnwind Segue用のメソッドを.hに記載して公開しておく
                // もちろん本来は必要ない。同様の処理をする別メソッドに変えても良いだろう
                [destination unwindXXX:nil];
            }];
        }
        // NOを返してsegueによる本来の画面遷移はさせない
        return NO;
    }
}
```
```objc:遷移元（呼び出した方。データ受け取りたい方）ViewController.hで
/// 本来は必要ないUnwind Segue用のメソッドを外部から呼べるようにするための追記
- (IBAction)unwindXXX:nil:(UIStoryboardSegue*)segue;
```
# 最後に
たぶんiOS8のバグ・・・なのかな？
今後速やかに正常化される事を祈ります。

バグじゃネェよ！とか、これじゃ動かないよ！とか、情報持っている方教えてください。よろしくお願いしますm(__)m

来週まで放置して、ツッコミがなければたぶんいいんだなーってことでこの修正でいまのプロジェクトにプルリク出すかな。

### 気になったんだけど
Unwind Segueって「あんわいんど」なのか「あんうぃんど」なのか。
Firefox css optgroup

firefox では、初期状態ではHTMLのoptgroup要素にイタリック体が適用される。解除したい場合は、cssを意図的に書いてやればよい。

```:html
optgroup {
  font-style:normal;
}
```

最初は「なんだこりゃ！」と思ったけど、そんな感じっぽい。
Ruby | Gvizでインデント構造のテキストをマインドマップに変換する

# Ruby | Gvizでインデント構造のテキストをマインドマップに変換する

## 概要
Gvizでインデント構造のテキストをマインドマップに変換します。

## 利用ライブラリ
利用ライブラリについては、下記記事参照

[Gvizでインデント構造のテキストをグラフに変換する](http://qiita.com/tbpgr/items/770d56834103efe2b723)

## サンプルコード

~~~ruby
require 'familyable'
require 'gottani_core'
require "gviz"

text =<<-EOS
Ruby
  スクリプト言語
  影響
    From
      Perl
      Lisp
      Smalltalk
    To
      CoffeeScript
      Elixir
  Author
    まつもとゆきひろ
      Matz
      松江
      Heroku
  Web
    Ruby on Rails
      Author
        DHH
      Products
        Redmine
        GitLab
    Sinatra
  DevOps
    Vagrant
      Author
        M.Hashimoto
      Provider
        Virtual Box
        VMWare
          Workstation
          Fusion
        AWS
    Chef
    Puppet
  特徴
    楽しい
    すべてがオブジェクト
    可読性の高さ
    動的言語
      強力なメタプログラミング
      DSL作成の容易さ
EOS

sp2 = Gottani::Space2.new
indent_text = sp2.space2_to_common(text)

indexed_indent_text = indent_text.reverse.map.with_index { |e, i|e.merge({id: i}) }

module Familyable
  class Person
    attr_accessor :value, :level
  end
end

i = 0
persons = indexed_indent_text.reduce([]) do |persons, person|
  parent = indexed_indent_text[(i + 1)..-1]
    .find { |e|e[:level] == person[:level] - 1 }
  parent_ids = parent.nil? ? [] : [parent[:id]]
  person = Familyable::Person.new(id: i, parent_ids: parent_ids).tap do |e|
    e.value = person[:value]
    e.level = person[:level]
  end
  persons << person
  i += 1
  persons
end

sorted_persons = persons.reverse
family = Familyable::Family.new(family: persons)

Graph do
  global layout:'twopi', overlap:false, splines: :curved
  nodes fontname:'MS GOTHIC', shape: :none, style:'filled'
  edges dir: :none
  # ノードの定義
  sorted_persons.each { |person|node :"person#{person.id}",  { label: person.value } }

  # エッジの定義
  sorted_persons.each do |person|
    parents =  family.get_parents(person)
    next if parents.empty?
    parent = parents.first
    options  = {}
    options[:penwidth] = 6 if parent.level == 0
    edge :"person#{parent.id}_person#{person.id}", options

  end

  # *** 根のランク, スタイル定義 ***
  min_id = persons.find { |e|e.level == 0 }.id
  min_person_key = :"person#{min_id}"
  rank :min, [min_person_key]
  node min_person_key, { shape: 'pentagon', fontsize: 80, fillcolor: :red }

  # *** 根以外のノードのランク定義 ***
  ranked_persons = sorted_persons.group_by { |e|e.level }.select { |key, value|key.nonzero? }
  ranked_persons.each do |rank, each_rank_persons|
    each_rank_persons.map { |e|node :"person#{e.id}", { fontsize: 40 } } if rank == 1
    persons = each_rank_persons.map { |e|"person#{e.id}".to_sym }
    rank(:same, persons)
  end

  save :"givz_mindmap", :png
end
~~~

## 出力

![givz_mindmap.png](https://qiita-image-store.s3.amazonaws.com/0/43480/b67aaead-ba36-cd32-3211-e89128d87404.png)

## 参照
* Gviz gem
    https://github.com/melborne/Gviz
* tbpgr_utils gem
    https://github.com/tbpgr/tbpgr_utils
* gottani gem
    https://github.com/tbpgr/gottani

## 関連記事
* [ryosy383様 Gvizでマインドマップを作成してみた](http://qiita.com/ryosy383/items/c1644031db7da38323bc)
NAOqi C++ 開発環境のインストールと動作確認

SoftbankがC++のインタフェースまで公開してくれることを願って記事を書きます。
バージョンは1.14なので、最新の2.1とくらべてすでに古い内容になっていると思いますが、現在NAOを持っていない人が入手可能なのはこのバージョンまでと思われます。

基本的にここを読みながら進めます。

https://community.aldebaran-robotics.com/doc/1-14/dev/cpp/install_guide.html

インストール
==================
OSXではうまくいかなかった（後述）ため、Ubuntu 12.04で試したらうまくいきました。

### ダウンロード
いつもの[コミュニティーサイト](https://community.aldebaran-robotics.com/resources/download/
)からSDKをダウンロードします。
私の環境では、いつもどおり、古いものしかダウンロード出来ませんでした。

naoqi-sdk-1.14.5-***.tar.gzという感じになると思いますので、
各自環境に合わせてダウンロードしましょう。

### 解凍

```bash
$ tar xvf naoqi-sdk-1.14.5-*.tar.gz 
```

qibuildというソフトウェアが必要ですが、これはpipで入るようです。
cmakeが必要になるので、入れていない人はいっしょにいれましょう。

Macの場合は、brewを使っている人なら、

### cmake/python/pipのインストール
```bash
$ brew install python cmake
$ export PATH=/usr/local/share/python:$PATH
$ sudo pip install qibuild
```

Linuxなら

```bash
$ sudo apt-get install cmake
$ sudo easy_install pip
$ sudo pip install qibuild
```

### qibuildのインストール 

```bash
$ pip install qibuild
```

でOKです。
qibuildの設定を以下のコマンドで行います。

```bash
$ qibuild config --wizard
```

まず、最初はすきなIDEを選択します。私は、CUIが好きなので、Unix Makefilesにしました。

![スクリーンショット 2014-09-09 22.59.58.png](https://qiita-image-store.s3.amazonaws.com/0/52430/a5f7e7c9-5591-40e3-dc6f-26087aed74b0.png)

動作確認
================

https://community.aldebaran-robotics.com/doc/1-14/dev/cpp/tutos/using_qibuild.html#cpp-tutos-using-qibuild

日本語が入ったパスでやるとPythonのエンコードエラーが出るので、ホーム直下などにSDKを持ってくると安心です。

```bash
$ cd
$ mv ~/Downloads/naoqi-sdk-1.14.5-*/ .
$ cd naoqi-sdk-*/doc/example
$ rm -rf .qi
$ qibuild init
$ qitoolchain create mytoolchain ~/naoqi-sdk-1.14.5-*/toolchain.xml --default
$ cd core/helloworld
$ qibuild configure -c mytoolchain
$ qibuild make -c mytoolchain
```

これで実行ファイルが出来ました。


### Mac環境について ###

私の環境では以下のようなエラーが出てしまい、コンパイル出来ませんでした。
みなさんどうでしょうか？

```bash
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [sdk/bin/helloworld] Error 1
make[1]: *** [CMakeFiles/helloworld.dir/all] Error 2
make: *** [all] Error 2
[ERROR]:  Error occurred when building project helloworld 
```
CentOS7でサービスの管理方法が変わった！

# はじめに
CentOS7になり、サービスの管理するシステムが"System V系のinit"から"Systemd"に変わったため、今までのように`/etc/rc.d/init.d/sshd restart`を実行することができなくなりました。

Systemdでサービスを管理できるようになるために、私が使うコマンドを中心にまとめていきます。
※ちなみに、serviceコマンドは今まで通り使える模様(systemctlへリダイレクトしてるけど)。

# サービスの起動・終了
今まで`/etc/rc.d/init.d/sshd restart`とやっていたsshdの再起動は、`systemctl restart sshd.service`となる。

調べていると、`systemctl restart sshd`と書いてあるところもありますが、1番最後の引数はUnit名を入れるという事になっているため、サービス名ではなくUnit名である"sshd.service"を指定すべきである。
(Unitについては、Google先生に聞いてください)

サービスの起動は`systemctl start sshd.service`、終了は`systemctl stop sshd.service`と、systemctlとUnit名の間にやりたいことを入れればOKです。reloadについてはUnitに記載されていれば使えるとのこと。

# サービス一覧と自動起動設定の確認

サービスの自動起動設定を確認するときに使っていた`chkconfig --list`は、`systemctl list-unit-files -t service`となる。
本当なら`systemctl list-unit-files`が対比的には正しいが、私の場合サービスだけを気にして使うと思うので、"-t service"を付けています。

STATEがenabledになっているのが自動起動有効のサービス。disabledは自動起動無効。staticは単体で自動起動設定ができないサービスとなる。
![ScreenShot 2014-09-10 8.12.10.png](https://qiita-image-store.s3.amazonaws.com/0/21319/4462140d-832a-0602-33e0-071893cc7530.png)

また、個別に確認したい場合は、`systemctl status sshd.service`とすれば確認できる。
"Loaded:"が出力されている行の一番最後に書かれているenableかdisableで判別できます。
このコマンドでは、他にもサービスの状態などが確認できます。
![ScreenShot 2014-09-10 8.21.02.png](https://qiita-image-store.s3.amazonaws.com/0/21319/51b417f0-7dc0-01dd-e82e-e499e8ee4655.png)


## 自動起動の設定

`chkconfig sshd on`に相当する自動起動の有効化は`systemctl enable sshd.service`となる。
`chkconfig sshd off`に相当する自動機能無効化は`systemctl disable sshd.service`となる。

# Logの出力方法

SystemV系のinitでは、"/var/log"配下にrsyslog経由で吐かれていたlogが、systemdではバイナリで保存されるので"journalctl"を使って見ることになる。

使い方としては、`journalctl -u sshd.service`となる。
他にも、"-b"を付けると、直近の起動からのログだけにしたり、"-k"を付けてdmsegと同じ内容にしたり(エラーが赤く出るようになってるのでわかりやすくなってる)、"-f"を付けて`tail -f`のようにリアルタイムな表示ができるようにと、それなりにオプションがあります。

# おわりに

私が使う分ではこんな感じでしょう。
他にもSystemdになって変更になってる箇所がありますが、今回はピックアップしません。Google先生に聞いてください。
Cocos2d-xでツムツム風動作の作成

# 概要
試しに作ってみました。
主にMacPeople 2014年10月号の内容と、
cocos2d-x-3.2/tests/cpp-tests/Classesを参考にしてます。

# GitHub
https://github.com/otmb/cocoPuzzle

# 画面キャプチャ
LICEcapで撮影しました
![Puzzle.gif](https://raw.githubusercontent.com/otmb/cocoPuzzle/master/Sample.gif)

# 実装内容

* 物理演算(Chipmunk)
* スプライトの表示とPhysicsを使った当たり判定
* DrawNodeによる線描画
* 試しに入れたモーダルレイヤにスクロールダイアログ、テキスト、ボタン
* PhysicsBody::createEdgeChainによる枠の作成

# Android.mk
Androidでビルドする際は下記コメントアウトの解除と、LOCAL_SRC_FILESに*.cppの記載が必要です

```
LOCAL_WHOLE_STATIC_LIBRARIES += cocostudio_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocos_extension_static

$(call import-module,editor-support/cocostudio)
$(call import-module,extensions)
```

# Resources

画面の弾は16x16の下記画像を利用してます。
cocos2d-x-3.2/tests/cpp-tests/Resources/Images/ball.png
Macでslackアプリを複数立ち上げる


ターミナルで下記コマンドを入力するとslackアプリの新規インスタンスが立ち上がる。

```
open -n /Applications/Slack.app
```

複数slack立ち上げてそれぞれ別のTeamでログインできる。最高っぽい

---

参考: https://slack.zendesk.com/hc/en-us/articles/201405046-Can-I-belong-to-more-than-one-Slack-team-
Eclipse SVNクライアントがいない

#Subversiveのインストール
EclipseでSVNを使用したかったので、インストールしてみたらSVNクライアントさんがいらっしゃらなかったので、解決まで踏んだ手順をあげておく。
基本的に、Eclipseとかを日本語化した人はPleiadesのAll in oneとかで入ってると思います。
##Subversion
Eclipse4.4でSubversionを使用するため、
Eclipseの Help > Install New Software
Work with　に、
http://download.eclipse.org/releases/luna
を貼付けて、ソフトウェアの一覧から
Collaboration > Subversive SVNチーム・プロバイダー　にチェックを入れてinstall

##クライアントがいない
SubversiveでSVNクライアントとして使用する SVNKitをインストールします。
Eclipseの Help > Install New Software
Work with　に、
http://community.polarion.com/projects/subversive/download/eclipse/4.0/update-site/
を貼付けて、ソフトウェアの一覧から
Subversive SVNコネクター > SVNKit1.8.4実装(オプション)
をチェックしinstall

一応cleanしておく(Eclipseのディレクトリ
/Applications/eclipse/eclipse -clean

確認で、Eclipseの環境設定から
Team > SVN > SVNクライアント　でSVNKitを選択して反映させれば完了。
Mac OSXにnodebrewをインストールする


node.jsのバージョン管理をしやすくするためにNodebrewをインストールします。


### node.jsがインストールされている場合は以下のコマンドで削除

```
$ brew uninstall node
```


### Homebrewをインストール

```
$ brew update
$ brew install nodebrew
```

### node.jsの最新版をインストール

```
$ nodebrew install latest
```

コンパイルにしばらく時間がかかる場合があります

### Node.jsインストールされたバージョンの確認

```
$ nodebrew list
v0.11.13

current: none
```

### インストールしたNode.jsバージョンを有効にする

```
$ nodebrew use v0.11.13
```

### パスの設定

```
$ echo 'export PATH=$PATH:/Users/ユーザー名/.nodebrew/current/bin' >> ~/.bashrc
```


### Node.jsバージョンの確認

```
$ node -v
v0.11.13
```

以上です。


Nodebrewは複数のnode.jsを管理することができ、バージョンの切り替えもしやすいです。

```
$ nodebrew -h
Usage:
    nodebrew help                         Show this message
    nodebrew install <version>            Download and install a <version> (compile from source)
    nodebrew install-binary <version>     Download and install a <version> (binary file)
    nodebrew uninstall <version>          Uninstall a version
    nodebrew use <version>                Use <version>
    nodebrew list                         List installed versions
    nodebrew ls                           Alias for `list`
    nodebrew ls-remote                    List remote versions
    nodebrew ls-all                       List remote and installed versions
    nodebrew alias <key> <version>        Set alias to version
    nodebrew unalias <key>                Remove alias
    nodebrew clean <version> | all        Remove source file
    nodebrew selfupdate                   Update nodebrew
    nodebrew migrate-package <version>    Install global NPM packages contained in <version> to current version
    nodebrew exec <version> -- <command>  Execute <command> specified <version>

Example:
    nodebrew install v0.10.22     Install a specific version number
    nodebrew use v0.10.22         Use a specific version number
```

（Kandanをインストールする際にnodebrewを使用しました）

【参考】Kandanに関してのQiitaの記事: 
http://qiita.com/tags/kandan
Rubyの正規表現で複数選択のエスケープ文字について

Rubyで複数選択で装飾文字を削除するとかなったときにちょっと困ったのでメモ

# 目的

* `?`とか`.`とかを正規表現でマッチしたい
* 顔文字とかも正規表現でマッチしたい

# 事前知識
例えば、`#gsub`を使って、「?」を「!」に変えたいというときは

``` rb
string = 'Hello World?'
string.gsub(/?/,'!') #=> エラーが出る
```

なんてことはできなくて、

``` rb
string = 'Hello World?'
string.gsub(/\?/,'!') #=> 'Hello World!'
```

というように`\`でエスケープする必要がある。
エスケープしなければいけない文字列一覧は以下の通り(Macの場合)
`\ * + . ? { } ( ) [ ] ^ $ - | /`
(ちなみに、Windowsの場合は`\`→`¥`です)

# 本題

<font color='red'>ただ、実は複数選択でマッチしたいときにはそんなにエスケープする必要がない</font>

例えば、「?」と「.」を全部「!」に変えたいとかなら

``` rb
string = 'Hello World? Hello World.'
string.gsub(/[?.]/,'!') #=> 'Hello World! Hello World!'
```

とすると、エラーが出ない！

ただし、「-」に関しては範囲指定の役割があるので

``` rb
string = 'Hello-World? Hello-World.'
string.gsub(/[?-.]/,'!') #=> エラーが出る
```

当たり前ですね。
マッチさせたいのであれば、

``` rb
string = 'Hello-World? Hello-World.'
string.gsub(/[?\-.]/,'!') #=> 'Hello!World! Hello!World!'
```

のようにエスケープすることでマッチする。
これは複数選択の時のみ注意すべきなので、`[]`を使わない場合は`-`はエスケープしなくても大丈夫です。

追記
>ハイフンを含めたい場合、 /[?-.]/ ではなく /[?.-]/ や /[-?.]/ にすれば問題ないですよ。

と @riocampos さんからコメントいただきました！
要は、文字の間に入れるとダメみたいですね。
ありがとうございます！

# 参考URL
* http://www.rubylife.jp/regexp/ini/index5.html
Railsでアプリ作る時にやることメモ

必要なものがあれば少しずつ更新。

1. .gitignoreに設定追加
  * /vendor/bundle
  * config/secrets.yml
1. i18nファイル取得
  * https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/ja.yml
1. slimを導入
  * echo "gem 'slim-rails'" > Gemfile
  * `for i in app/views/**/*.erb; do erb2slim $i ${i%erb}slim && rm $i; done`
時間計測にApacheCommonsのStopWatchを使ってみる

いつも"System.currentTimeMillis()"を使って処理時間を計測してたけど、
Apache Commonsに"StopWatch"なるクラスがあるのを発見。

して使ってみる。

# pom.xmlに依存ライブラリとして追加

今回はmavenで。
2.0以降ならStopWatchが使えるようです。
StopWatch以外にもいろいろ便利なので、利用すべし。

```pom.xml
      <dependency>
         <groupId>org.apache.commons</groupId>
         <artifactId>commons-lang3</artifactId>
         <version>3.3.2</version>
      </dependency>
```
# 使ってみる

## 普通に計測

```
           StopWatch stopWatch = new StopWatch();

           // 計測開始
           stopWatch.start();

           Thread.sleep(500);

           // 計測停止
           stopWatch.stop();

           // 経過時間出力
           System.out.println(stopWatch.getTime()); // ⇒500
```           
           
## 途中で止めて再開とか

```
           StopWatch stopWatch = new StopWatch();

           // 計測開始
           stopWatch.start();

           Thread.sleep(500);

           // 計測中断
           stopWatch.suspend();

           Thread.sleep(500);

           // 計測再開
           stopWatch.resume();

           Thread.sleep(500);

           // 計測停止
           stopWatch.stop();

           // 経過時間出力
           System.out.println(stopWatch.getTime()); // ⇒1000
```


おぉ。

## ちなみに停止してからのーーー、開始

```
           StopWatch stopWatch = new StopWatch();

           // 計測開始
           stopWatch.start();

           Thread.sleep(500);

           // 計測停止
           stopWatch.stop();

           // 計測開始
           stopWatch.start(); // ここで例外！！！

           Thread.sleep(500);

           // 計測停止
           stopWatch.stop();

           // 経過時間出力
           System.out.println(stopWatch.getTime());
```
           
これはまあ、やっぱりというか、一回リセットしろって怒られた。。。

```
Exception in thread "main" java.lang.IllegalStateException: Stopwatch must be reset before being restarted. 
	at org.apache.commons.lang3.time.StopWatch.start(StopWatch.java:179)
```
ちょっとしたフロントエンド開発のセットアップ

最近だとGrunt使ったりgulp使ったり、またはGoogleの[Web Starter Kit](https://developers.google.com/web/starter-kit/)使ったりしてセットアップすることが多いと思います。

ただ、何かを新しいフレームワークを試したりしたいだけのときにこれらの設定ファイルとか無駄に増えるのもイヤだなと思ったりしていて、最近は**browserify**と**beefy**使ってやっています。

* https://www.npmjs.org/package/browserify
* https://www.npmjs.org/package/beefy

各種変換とLiveReloadが出来れば十分なので。

例はこんな感じ。

* https://github.com/koba04/react-boilerplate

設定ファイルがpackage.jsonだけになるのでシンプルです。

## package.json

設定はこんな感じでしておくだけです。scriptの設定をして`npm run dev|build`で操作出来るようにしておいて、browserifyのtransformのoptionを必要に応じて設定するだけです。

```json
  "scripts": {
    "dev": "beefy src/index.jsx:bundle.js --live",
    "build": "browserify src/index.jsx > bundle.js"
  },
  "browserify": {
    "transform": [
      [ "reactify", { "es6": true }, { "everything": true } ],
      [ "stylify" ]
    ]
```


## AltJSのCompile

* 例えばcofeescriptのcompileがしたいならcoffeeifyを使うなど、各種browserifyのtransformがあるのでそれを使えばいいだけです。
  * https://github.com/koba04/vue-boilerplate/blob/master/package.json
  * https://www.npmjs.org/package/coffeeify
* reactのcompileなどもreactifyがあるのでそれを使えばいいだけですね
  * https://github.com/koba04/react-boilerplate/blob/master/package.json
  * https://www.npmjs.org/package/reactify


## templateの読み込み

* partialifyを使うことで可能になるのであとはrequireすればいいだけです。
  * https://github.com/koba04/vue-boilerplate/blob/master/src/artist/index.coffee
  * https://www.npmjs.org/package/partialify

    ```coffeescript
    module.exports = Vue.extend
      id: "artist"
      template: require './index.html'
    ```

## CSS Preprocessor

* Stylusであればstylifyがあるのでそれを使って、insert-cssと組み合わせるとよくて、componentに紐付けた感じにすることも出来ます。
  * まぁhead要素にstyleが突っ込まれるだけなんですが..
  * https://github.com/koba04/react-boilerplate/blob/master/src/component/artist.jsx
  * https://www.npmjs.org/package/stylify

    ```js
    require('insert-css')(require('./artist.styl'));
    ```

## LIveReload

* beefyを使うことでbrowserifyの変換をやってくれるので、package.jsonにこんな感じで書いておいて、**npm run dev**で起動するだけです。

```json
{
  "scripts": {
    "dev": "beefy src/index.jsx:bundle.js --live"
  }
}
```
```
➜  npm run dev                                                                                                                                                                           
> react-boilerplate@0.1.0 dev /Users/koba04/git/react-boilerplate
> beefy src/index.jsx:bundle.js --live
beefy (v2.1.1) is listening on http://127.0.0.1:9966
```

## Build

* 上記のだと実際にbundle.jsは生成しないので、別途buildコマンドを作って実行します。

```json
{
  "scripts": {
    "build": "browserify src/index.jsx > bundle.js"
  }
}
```

```
➜  npm run build                                                                                                                                                                         
> react-boilerplate@0.1.0 build /Users/koba04/git/react-boilerplate
> browserify src/index.jsx > bundle.js
```


だた、まぁファイルが増えてきたりすると辛くなってくるかもなので、がっつりプロジェクトを開発するときはgulpとかgruntとかwebpack辺りのなにかを使うといいのかなーと思います。
[Git]コミットの取り消し、打ち消し、上書き

# コミットの取り消し
直前のコミットをなかった事にするには

```
git reset --soft HEAD^
```
を叩けばOK。

- `--soft`オプション：ワークディレクトリの内容はそのままでコミットだけを取り消したい場合に使用。
- `--hard`オプション：コミット取り消した上でワークディレクトリの内容も書き換えたい場合に使用。


- `HEAD^`：直前のコミットを意味する。
- `HEAD~{n}` ：n個前のコミットを意味する。
  - `HEAD^`や`HEAD~{n}`の代わりにコミットのハッシュ値を書いても良い。
  - gitのv1.8.5からは、「HEAD」のエイリアスとして「＠」が用意されている。
  - `HEAD~`と`HEAD^`と`@^`は同じ意味。
  - `HEAD^^^`と`HEAD~3`と`HEAD~~~`と`HEAD~{3}`と`@^^^`は同じ意味。
- ただしWindowsの場合は`git reset --soft "HEAD^"`と、`HEAD^`を`"`で囲んでください。

`git reset`の詳細は、下記記事に詳しく書いているので、ぜひ参考にされてください。

▼[git reset (--hard/--soft)]ワーキングツリー、インデックス、HEADを使いこなす方法
https://qiita.com/shuntaro_tamura/items/db1aef9cf9d78db50ffe


# コミットの打ち消し
作業ツリーを指定したコミット時点の状態にまで戻し、コミットを行う（コミットをなかったことにはせず、逆向きのコミットをすることで履歴を残す）には、

```
git revert コミットのハッシュ値
```
を叩けばOK。指定したコミットを打ち消すコミットを作成することができます。

# コミットの上書き
直前のコミットに上書きするには、

```
git commit --amend
```
を叩けばOK。

- コミットメッセージを変更したい時よく使う。
- 「`git rebase`失敗した時、コンフリクトを避けるためにコミットを上書きする」という使い方もよくする。
Warning (512): Model "○○" is not associated with model "○○"が出た時の対処

``$this->paginate = array('contain' => array('Stock' => array('fields' => array('id','count'));``
のように、stockコントローラで同じモデルをcontainの中で指定するとエラーになる。
``$this->paginate = array('fields'=>array('id','count'));``のようにcontainの外でfieldsを指定する。
Rails: nil?, empty?, blank?, present?の挙動


Rails開発でnil?, empty?, blank?, present?の挙動にハマったのでメモ

以下の値で書くメソッドについて比較してみる。

```var.rb
a = nil
b = true
c = false
d = []
e = [123]
f = 123
```

## nil?

```nil.rb
a.nil? #=> true
b.nil? #=> false
c.nil? #=> false
d.nil? #=> false
e.nil? #=> false 
```

## empty?

```empty.rb
a.empty? #=> undefined method `empty?' for nil:NilClass
b.empty? #=> undefined method `empty?' for true:TrueClass
c.empty? #=> undefined method `empty?' for false:FalseClass
d.empty? #=> true
e.empty? #=> false
f.empty? #=> undefined method `empty?' for 123:Fixnum
```

## blank?



```blank.rb
a.blank? #=> true
b.blank? #=> false
c.blank? #=> true
d.blank? #=> true
e.blank? #=> false
f.blank? #=> false
```

## present?

```present.rb
a.present? #=> false
b.present? #=> true
c.present? #=> false
d.present? #=> false
e.present? #=> true
f.present? #=> true
```

## Rubyの条件式を用いた場合

```if.rb
puts a ? true : false #=> false
puts b ? true : false #=> true
puts c ? true : false #=> false
puts d ? true : false #=> true
puts e ? true : false #=> true
puts f ? true : false #=> true
```
[JavaScript] 簡単なカウンターで理解するクロージャ


用途は思いつかないですが、学習がてら『呼び出すたびに連番を返す』ようなカウンターを作ってみます。

## 方法① 

まずは **関数オブジェクトのプロパティ** で実現してみます。


```javascript:
function count() {
    return count.num++; // プロパティ num の値を +1 して返す
}

count.num = 1; // 初期値をセット
console.log(count()); // 1 が出力される
console.log(count()); // 2 が出力される
console.log(count()); // 3 が出力される
```

一応、それらしいものは実現できましたが、これだとカウンターの値が(バグなどで)外部から操作できちゃいますね。あと、初期値のセットもスマートじゃないし、複数のカウンターも作れません。

## 方法②

今度は、普通の **オブジェクト** にメソッドを定義して実現してみます。

```javascript:
var count = {
    num: null,
    getNum: function() {
        return this.num++;
    }
};

count.num = 1; // 初期値をセット
console.log(count.getNum()); // 1 が出力される
console.log(count.getNum()); // 2 が出力される
console.log(count.getNum()); // 3 が出力される
```

方法①と同じことが実現できましたが、相変わらずカウンターの値が外部から操作できることや初期値の渡し方も改善されておらず、複数のカウンターも作れません。

## 方法③ 

方法①の関数を、ちょっと改造してみます。カウンターの値を関数の **ローカル変数** で保持し、 関数の **戻り値として関数** を定義しています。

```javascript:
var count = function(initNum) {
    var localNum = initNum;
    var getNum = function() {
        return localNum++;
    };
    return getNum;
};

var counter1  = count(1);
console.log(counter1()); // 1 が出力される
console.log(counter1()); // 2 が出力される
console.log(counter1()); // 3 が出力される

var counter2  = count(9);
console.log(counter2()); // 9 が出力される
console.log(counter2()); // 10 が出力される
console.log(counter2()); // 11 が出力される

console.log(counter1()); // 4 が出力される(２つの独立したカウンターが実現できている
```

カウンターの値は外部から隠蔽できており、初期値も引数として渡せ、また２つの独立したカウンターが実現できました。
ちなみにこれが（いわゆる狭義の） **クロージャ** ですね。

> 広義では関数は全てクロージャじゃん、ということかもしれませんが、JavaScript界隈でのいわゆる、ということで。

## 方法④

方法③でもいいのですが、やっぱ関数だと何となく概念的に分りにくいかな〜と思い **コンストラクタ関数** でオブジェクトっぽく実現してみます。

```javascript:
var Count = function(initNum) {
    var localNum = initNum;
    this.getNum = function() {
        return localNum++;
    };
};

var counter1 = new Count(1);
console.log(counter1.getNum()); // 1 が出力される
console.log(counter1.getNum()); // 2 が出力される
console.log(counter1.getNum()); // 3 が出力される

var counter2 = new Count(9);
console.log(counter2.getNum()); // 9 が出力される
console.log(counter2.getNum()); // 10 が出力される
console.log(counter2.getNum()); // 11 が出力される

console.log(counter1.getNum()); // 4 が出力される(２つの独立したカウンターが実現できている
```

うん、今回のケースでいうと、こっちの方が概念的に分りやすいですね。方法③と同じように、変数の隠蔽等も実現できてます。これもクロージャと呼ぶのかな？

## おまけ：方法③で、複数のメソッドを定義したい場合

戻り値を関数そのままでなく **オブジェクト** とすれば、色々なメソッドを追加することが出来ます。
個人的には、方法④コンストラクタ関数の this とかの影響を考えるの面倒だし（new忘れとかあると嫌だし）、メソッド呼び出し（この例でいうと `getNum()`）の方が機能が分りやすいし、この形が一番いいかも。

```javascript:
var count = function(initNum) {
    var localNum = initNum;
    return {
        getNum: function() {
            return localNum++;
        },
        methodHoge: function() {
            // 何か処理
        }
    }
};

var counter1 = count(1);
console.log(counter1.getNum()); // 1 が出力される
console.log(counter1.getNum()); // 2 が出力される
console.log(counter1.getNum()); // 3 が出力される

var counter2 = count(9);
console.log(counter2.getNum()); // 9 が出力される
console.log(counter2.getNum()); // 10 が出力される
console.log(counter2.getNum()); // 11 が出力される

console.log(counter1.getNum()); // 4 が出力される(２つの独立したカウンターが実現できている
```

## おわりに

まだ初心者なのですが、JavaScriptは理解しはじめると、面白い言語ですね^^
KitematicでローカルDockerを試す


# Kitematic

職場でローカル開発環境構築に [Kitematic](https://kitematic.com/) がよいと聞いたので試してみることに。
VirtualBoxとboot2dockerのフロントエンドツールらしい。
扱いは正直公式の [Getting Started](https://kitematic.com/docs/) で十分だけど一応メモ書きだけ。
以下、自前で用意した [nginx on centos6](https://github.com/ciela/test_centos_nginx/blob/master/Dockerfile) なコンテナの起動です。

## インストール

例によってHomebrew。

```bash
$ brew cask install kitematic
```

## 起動

インストールされたアプリを起動して最初のVirtualBoxやboot2dockerのインストール確認などが終われば起動成功。

## イメージビルド

ローカルの `Dockerfile` があるディレクトリを選択する。
GitHubとかで `Dockerfile` の管理してる場合などは前もって `clone` しておく必要がある。

```bash
$ git clone git@github.com:ciela/test_centos_nginx.git
```

選択しだいビルド始まるけど、Dockerhubから[既存](https://registry.hub.docker.com/u/ciela/test-centos-nginx/)の持ってくるには `FROM` でイメージ指定だけ書いた `Dockerfile` 作成すればおｋ。

```Dockerfile:Dockerfile
FROM ciela/test-centos-nginx
```

正直ココらへんはそのうち対応してほしい。

## コンテナ立ち上げ

あとはアプリを作成するときに先ほどビルドしたイメージを選択してコンテナとして起動。
名前は適当に「my-nginx」とでも。
アプリ名の隣が緑の◯になれば起動完了。

## 確認

nginxコンテナなので実際にアクセスしてみる。
アプリ名の隣の目のマークをクリックするとブラウザにnginxデフォルトページが表示されればおｋ。
アドレスは http://my-nginx.kite/ 。

ここらへんは `/etc/resolver/kite` 内にDocker用のDNSを指定させてるようで結構便利。

```bash
$ cat /etc/resolver/kite
nameserver 172.17.42.1
```

`ps` みてみるとDNS用のコンテナ走ってるのもわかる。

```bash
$ docker ps
CONTAINER ID        IMAGE                      COMMAND                CREATED             STATUS              PORTS                    NAMES
bbef89b83ff8        fn8w9jmb2gmhextfn:latest   "/usr/sbin/nginx -g    1 hours ago        Up 1 hours         0.0.0.0:49153->80/tcp    my-nginx
4df87b25efca        kite-dns:latest            "sh /app/start"        1 hours ago        Up 1 hours         172.17.42.1:53->53/udp   kite-dns
```

# まとめ

Docker on Macについては

* [boot2docker](http://boot2docker.io/)
* [coreos-vagrant](https://github.com/coreos/coreos-vagrant)

とか触ってみてたけどサクッと乗り換え。
特にboot2dockerで不便だった、ローカルからboot2dockerへのポートフォワードが結局自前での`VBoxManage` になってたことから解放されたのが大きい。

まだまだフリーズしたりアンインストール方法がめんどかったりするけど、これからに期待して寝る。
HibernateのOrder Byを日本語順でソートする。

Hibernateを使って、Oracleで日本語順でソートしたかったので調べてみた。

# NLSSORT関数を使用する。

HQL的には下記のように書くと良い。

```java
	public List<Cat> findOrderByJapanese() {

		String query = "from Cat cat"
		+ " where cat.typeName = 'mikeneko'"
		+ " order by nlssort(cat.name, 'NLS_SORT=JAPANESE')"; // 日本語順でソートする。

		return (List<cat>) getHibernateTemplate().find(query); 
	}
```

以上

参考サイト
[Oracle Database グローバリゼーション・サポート・ガイド「5 言語ソートと文字列検索」](http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19218-02/ch5lingsort.htm#i1008198)
[Hibernate oracle text field in alphabetical order](http://www.databaseskill.com/1535912/)
ランダムにキューブを動かす


人のソースみて勉強したやつの技術を使ってよくわかんないのを作ってみた。
[よくわかんないの](http://jsdo.it/matsui_q/mfiff)

![sample5.gif](https://qiita-image-store.s3.amazonaws.com/0/3140/f875429d-3717-8e51-e29d-2dd679bbacdb.gif)

キューブの動くタイミングや動き方はCSS、色や大きさをランダムで変えるのはJSの方に書いてる。

##CSS
```css
body {
  background: #F9F9F9;
  margin: 15px;
}
.item {
  float: left;
  width: 3rem;
  height: 3rem;
  backface-visibility: hidden;
  transition-duration: 0.3s;
  transition-timing-function: ease-in-out;
}
```

動かすセンスがなさすぎて、タイミングの設定とかどうすればいい感じにできるのかさっぱりわからん。


##JS

```js
$(function() {

  //マテリアルデザインチックな配色
  var myColors = [
        '#224687',
        '#2ABFD4',
        '#FFCD40',
        '#E61875',
        '#8BC34A',
        '#AB47BC'
      ];

  //描画
  function draw(){

    var color = myColors[Math.floor(Math.random() * myColors.length)];

    //DIV生成
    var item = $("<div>",{
        "class" : "item",
        css : {
          backgroundColor: color,
          transform: "scale(0)"
        }
    }).appendTo(document.body);

    //ランダムで色、大きさ変える
    setInterval((function() {
      item.css ({
        backgroundColor: myColors[Math.floor(Math.random() * myColors.length)],
        transform: "scale(" + Math.random() +")",
        borderRadius: "10%",
        opacity: 1
      })
    }),  Math.random() * 500 + 500);

  };

  //量産して描画
  for (var i = 0; i < 81; i++) {
    draw();
  }

  //微妙なhover処理
  $(".item").hover(
    function(){
      $(this).stop().animate({
        borderRadius: "50%",
        transform: "scale(1)",
        opacity: 0.5
      }, 100);
    }
  );


});

```

scaleで拡大させてるから、
キューブが小さいときにhoverしても大きくならないのが微妙すぎる。

もうちょっと頑張ってインタラクティブなのを作りたい。
UnityのWebCamTexture

planeやQuadなどの板ポリにMacやiPhoneなどのカメラ情報を
貼付けるのにwebcamtextureを使うと簡単です。

![スクリーンショット 2014-09-12 17.03.20.png](https://qiita-image-store.s3.amazonaws.com/0/38279/e7a2aa03-2cb4-a889-0972-c7b31e586648.png)

サイズは、publicにして任意に変更できるようにしておきました。
![スクリーンショット 2014-09-12 17.03.14.png](https://qiita-image-store.s3.amazonaws.com/0/38279/f2799d6f-b7fe-d2a0-1ab2-3bdcd2b0ef38.png)

こちらが、簡単なスクリプトになります。

```csharp:WebCameScript
using UnityEngine;
using System.Collections;

public class WebCamScript : MonoBehaviour {
    public int Width = 1920;
    public int Height = 1080;
    public int FPS = 30;

	void Start () {

        var euler = transform.localRotation.eulerAngles;
        transform.localRotation = Quaternion.Euler( euler.x, euler.y, euler.z - 90 );

        var devices = WebCamTexture.devices;
        if (devices.Length > 0)
        {
            var webcamTexture = new WebCamTexture(Width, Height, FPS);
            renderer.material.mainTexture = webcamTexture;
            webcamTexture.Play();
        }else
        {
            Debug.Log("Webカメラが検出できませんでした");
            return;
        }
	}
}


```
MahoutのエラーNoClassDefFoundError: org/apache/hadoop/util/ProgramDriverの対処法

Mahout 0.9でNoClassDefFoundError: org/apache/hadoop/util/ProgramDriverエラーが出たときの対処法。

Mahoutを使って見ようと思い、ダウンロードしてWindowsのbashより実行したところいきなり以下のエラーが出ました。

```
$ bin/mahout fpg -i gihyo-mahout-fpg-sample.csv -o output/gihyo-mahout-fpg-sample
hadoop binary is not in PATH,HADOOP_HOME/bin,HADOOP_PREFIX/bin, running locally
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/util/ProgramDriver
        at org.apache.mahout.driver.MahoutDriver.main(MahoutDriver.java:105)
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.util.ProgramDriver
        at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
        ... 1 more
```

出ばなをくじかれた感じですが、シェルスクリプトのmahoutでlib/hadoop以下のjarを読み込めていないのが原因のようです。

シェルスクリプトを直してもいいのですが、手抜きして lib/hadoopフォルダのjarをすべてlibフォルダに移動しました。これでこのエラーは出ないようになります。
Android in-app-billing のデータが改ざんされていないかの検証

メモです。表題の通り。

## 利用される値

- `license_key`
    ディベロッパーコンソール > アプリ > サービスとAPI の「バイナリに追加する Base64 エンコードの RSA 公開鍵です。スペースはすべて削除してください。」の下にある文字列
- `purchase_data`
    購入時のIntentから `INAPP_PURCHASE_DATA` で取り出せる値
- `signature`
    購入時のIntentから `INAPP_DATA_SIGNATURE` で取り出せる値

## 検証コード

```rb
def verify(data, sign)
  verifier.verify(OpenSSL::Digest::SHA1.new, Base64.decode64(sign), data)
end

def verifier
  @_verifier ||= OpenSSL::PKey::RSA.new(Base64.decode64(license_key))
end

if ! verify(purchase_data, signature)
  raise 'データが改ざんされています'
end
```
インストールされたAIRアプリのtraceログを見る


いつも忘れるのでメモ。

## インストールされたアプリの中の`META-INF/AIR`に`debug`というファイルを作る

中身は空で良い。

`/Applications/A.app`だったら

```
$ touch /Applications/A.app/META-INF/AIR/debug
```

などすると空のファイルができる


## mm.cnfを作成して配置

[Configure the debugger version of Flash Player](http://helpx.adobe.com/flash-player/kb/configure-debugger-version-flash-player.html)

Macであれば

`/Library/Application Support/Macromedia`に`mm.cfg`を作成する。

ErrorReportとtraceログの出力であれば

```
ErrorReportingEnable=1
TraceOutputFileEnable=1
```

と記述すればOK

## flashlogが出力される

上述のwebにあるようにMacであれば

`/Users/username/Library/Preferences/Macromedia/Flash Player/Logs/`

に`flashlog.txt`が出力されるはず。


# 参考

http://backroom.bostonproductions.com/?p=902
今更ながらghq + percolしてみた


ghqのお作法でリポジトリ管理するのが便利だ便利だと周りで言われているので、やってみた。

## Install ghq

Goが入っていない場合は入れる。

```
$ brew install go
```

PATH周りを設定して、ghqを入れて設定

```
$ export GOPATH=$HOME
$ export PATH=$GOPATH/bin:$PATH
$ go get github.com/motemen/ghq
$ git config --global ghq.root ~/src
$ source ~/.zshrc
$ ghq
NAME:
   ghq - Manage GitHub repository clones

USAGE:
   ghq [global options] command [command options] [arguments...]

VERSION:
   HEAD

AUTHOR:
  motemen - <motemen@gmail.com>

COMMANDS:
   get          Clone/sync with a remote repository
   list         List local repositories
   look         Look into a local repository
   import       Bulk get repositories from a file or stdin
   help, h      Shows a list of commands or help for one command

GLOBAL OPTIONS:
   --help, -h           show help
   --version, -v        print the version

$ ghq list -p
/Users/mikiakira/src/github.com/codegangsta/cli
/Users/mikiakira/src/github.com/daviddengcn/go-colortext
/Users/mikiakira/src/github.com/mitchellh/go-homedir
/Users/mikiakira/src/github.com/motemen/ghq
/Users/mikiakira/src/github.com/motemen/go-colorine
```

良い感じ。


## ghqからのpercol移動

```bash
$ vim ~/.zshrc

# ghq
function gcd() {
  if [[ $1 == "" ]]; then
    PERCOL=percol
  else
    PERCOL="percol --query $1"
  fi
  cd $(ghq list --full-path | eval $PERCOL)
}

$ source ~/.zshrc
$ gcd
```

## ついでにgem-srcからのpercol移動

```
$ git clone https://github.com/amatsuda/gem-src.git $RBENV_ROOT/plugins/gem-src
$ rbenv rehash

$ echo "gemsrc_clone_root: ~/src" >> ~/.gemrc

$ gem i kaminari
$ gcd
```

良い感じ

## 参考

- [TATSUHIKO MIYAGAWA'S BLOG - ghq + peco/percol](http://weblog.bulknews.net/post/89635306479/ghq-peco-percol)