OmniAICreator/Qiita-1.07M huggingface dataset:
ruby 2.1.5でrails sを実行したらrmagicでコケた時の対処

```
rbenv install 2.1.5
rbenv local 2.1.5

gem install bundler
bundle install --path=vendor/bundle
```
ここまではいつもどおり順調にいったのだが、

```
$ rails s

/Users/moriyaman/work/hoge/vendor/bundle/ruby/2.1.0/gems/activesupport-3.2.18/lib/active_support/dependencies.rb:251:in `require': dlopen(/Users/moriyaman/work/hoge/vendor/bundle/ruby/2.1.0/gems/rmagick-2.13.1/lib/RMagick2.bundle, 9): Library not loaded: /usr/local/lib/libMagickCore-6.Q16.1.dylib (LoadError)
```

立ち上がらない。。。
対外brew uninstallでimagemagick消してinstallしてrmegickをinstallすればいいよ的な事が書いてある。

参考)
- [Mavericksアップグレードの際 Railsアプリケーションを頑張って起動させるまで](http://qiita.com/tkwn1/items/ff613b08bdac1654ffe7)
- [rmagick preventing rails server from working](http://stackoverflow.com/questions/15162496/rmagick-preventing-rails-server-from-working)

自分も同じように実行すると、

```
This installation of RMagick was configured with ImageMagick 6.8.7 but ImageMagick 6.9.0-3 is in use. (RuntimeError)

```

ほう、imageMagickのバージョンが新しくてダメだと。
rmagickそろそろ辞めたいw

仕方ないから[homebrew-boneyard](https://github.com/Homebrew/homebrew-boneyard)を使って古いバージョンのimagemagickをバージョン指定してinstallする。

```
$ brew versions Imagemagick

Warning: brew-versions is unsupported and will be removed soon.
You should use the homebrew-versions tap instead:
  https://github.com/Homebrew/homebrew-versions

6.9.0-3  git checkout 8b2b988 /usr/local/Library/Formula/imagemagick.rb
6.8.9-8  git checkout 9efbcda /usr/local/Library/Formula/imagemagick.rb
6.8.9-7  git checkout fc0f13b /usr/local/Library/Formula/imagemagick.rb
6.8.9-5  git checkout e15674a /usr/local/Library/Formula/imagemagick.rb
6.8.9-1  git checkout 1fe28f8 /usr/local/Library/Formula/imagemagick.rb
6.8.8-9  git checkout b84f779 /usr/local/Library/Formula/imagemagick.rb
6.8.7-7  git checkout e68e443 /usr/local/Library/Formula/imagemagick.rb
6.8.7-0  git checkout 14a1fa8 /usr/local/Library/Formula/imagemagick.rb
6.8.6-3  git checkout 870d5e9 /usr/local/Library/Formula/imagemagick.rb
6.8.0-10 git checkout 321b293 /usr/local/Library/Formula/imagemagick.rb

```

Warning出てる。。。homebrew-versionsを次から使いましょう。
6.8.7系発見。
インストールしましょう。

```
$ cd /usr/local/Cellar/
$ git checkout e68e443 /usr/local/Library/Formula/imagemagick.rb
$ brew install imagemagick
```

install完了。

```
$ brew link imagemagick # brew linkコマンドでimagemagickを有効化する。
$ sudo PKG_CONFIG_PATH=/usr/local/Cellar/imagemagick/6.8.7-7/lib/pkgconfig/ gem install rmagick -v '2.13.2' # pathを設定した上でinstall
```

あとは ```rails s```すれば完了。
本当rmagickどうにかしたいorzww
PythonのスクリプトファイルのスキャフォールディングのマクロをF12キーに割り当てた

Pythonのスクリプトのスキャフォールディング用のマクロを定義
<pre>
(fset 'py-script-scaffold
   "\C-[<#! /sr\C-?\C-?usr/bin/env python\C-j# -*- coding: utf-8 -:-\C-b\C-b\C-d*\C-e\C-jimport\C-a\C-k\"\"\"\C-j\C-e\C-j\C-jimport sys\C-jimport argparse\C-j\C-j\C-jdef main(argv=sys.argv[1\C-e\C-b\C-b\C-b\C-f:\C-e:\C-mparser = argparse.ArgumentParser(\C-e\C-j\C-iargs = parser.parse_args(argv\C-e\C-j\C-j\C-j\C-aif __name__ == ''\C-b\C-d\C-d__main__\C-e:\C-[b\C-[f\C-f\C-k:\C-mj\C-?main(\C-e\C-j")
</pre>

F12キーに割り当て
<pre>
(define-key global-map [f12] 'py-script-scaffold)
</pre>
サーバ公開したけどどこからのアクセスがあるか調べてみた

・nginxのログを解析　ログローテしてるので毎日チェック
・新しくアクセスがあったIPアドレスを検出する
・white list と black listに書いてあるIPアドレスは除外
・black.listファイルにどんどんためていく
・black.list.bak との差分を目視でチェックして対応

```lang:bash.sh
#!/bin/bash

WL1=1.1.1.1
WL2=2.2.2.2

WHITE_LIST=($WL1 $WL2)
BLACK_LIST=black.list

str=""
for wip in ${WHITE_LIST[*]}
do
 str="$str | grep -v $wip"
done

while read bip
do
 if [ "$bip" ]; then
  str="$str | grep -v $bip"
 fi
done < $BLACK_LIST

cat_str="cat /var/log/nginx/access.log $str"
newips=`eval $"$cat_str" | awk '{print $1}'`

for newip in $newips
do
 echo $newip >> $BLACK_LIST
done

sort $BLACK_LIST -uo $BLACK_LIST

diff $BLACK_LIST ${BLACK_LIST}.bak
```
Android 5.0 LollipopのエミュレータにGoogle Playを入れるまで


エミュレータにGenymotionを使用して起動し、Google Playを入れるまでのメモ

## 参考
http://blog.yohei.org/android-genymotion2-x-install-googleplay/

## VirtualBoxをインストール

下記から最新をダウンロードして入れる
https://www.virtualbox.org/

## Genymotionをインストール

下記から最新をダウンロードして入れる
https://www.genymotion.com/?utm_source=dlvr.it&utm_medium=twitter#!/

## エミュレータをインストール

下記手順で、5.0をダウンロードし、デバイスを作成する

![bf58e2b9-f817-4277-92fa-96ea92ae2762.gif](https://qiita-image-store.s3.amazonaws.com/0/7980/47e1a8b3-931c-c491-a745-5ffa1f440da2.gif)

## 起動する


作成したデバイスをダブルクリックして、起動する。
もしここで

``` Unable to connect the virtual device ... ```

のようなエラーが出た場合は、VirtualBoxを起動し、ネットワーク設定を確認する

![9ea82397-d8f5-433e-8eea-2eb6e2ed4879-960x765r.png](https://qiita-image-store.s3.amazonaws.com/0/7980/b61788aa-d871-b914-4834-06176258a523.png)

![77751ae2-e5aa-4a3a-9c16-2189790345e2-960x648r.png](https://qiita-image-store.s3.amazonaws.com/0/7980/c093fb2d-e552-879f-ab70-1854d6cd287e.png)

![e1acea26-9ce3-4400-91ad-dd7f23571615-960x454r.png](https://qiita-image-store.s3.amazonaws.com/0/7980/777e9134-9d8f-161c-5a60-bffb87438984.png)

![cbba6591-8630-43db-9b0c-01583ad46ed3-960x458r.png](https://qiita-image-store.s3.amazonaws.com/0/7980/6a69a1e0-f19d-92cb-eff4-be4e491540d2.png)


アダプターのアドレスとDHCPで割り当てられるネットワークが同一かどうかなど。

## Google Playをインストール

エミュレータが起動したら、下記サイトからファイルをそれぞれ取得し、
ドラッグ＆ドロップして、デバイスにインストールする

* ARM Translation Installer v1.1
http://forum.xda-developers.com/showthread.php?t=2528952

* Google Play for Android 5.0
https://www.androidfilehost.com/?fid=95784891001614559

取得したZIPファイルを解凍せず、そのままドラッグ＆ドロップします。

## その他

> Reinstall Google+ hogehoge....

上記エラーが頻発したら、頑張ってGoogle+をUpdateする
（その最中何度も表示がでてとても邪魔だが、根気よく頑張ればアップデートできる）
nginxでWebDAV (nginx-dav-ext-moduleはなし)


自分メモ

## 概要

CentOS6で、nginx-dav-ext-moduleは入れない場合の、nginx WebDAV設定一例。
maven repository建てるのに使いました。

> sudoとかは省略してます

## やり方

いつも通り ```/etc/nginx/conf.d``` に.confファイルを作る。

```webdav.conf
server {
  listen 6668;
  server_name example.server.com;

  location / {
    root /usr/share/nginx/html/webdav;

    # Basic認証
    auth_basic "webdav test server.";
    auth_basic_user_file /etc/nginx/conf.d/.htpasswd;

    # アップロードサイズの上限
    client_max_body_size   100m;

    ## ブラウザから確認したい場合
    autoindex on;
    autoindex_exact_size off;
    autoindex_localtime on;

    client_body_temp_path  /usr/share/nginx/html/webdav;
    create_full_put_path on;

    # WebDAV設定
    dav_access group:r all:r;
    dav_methods  PUT DELETE MKCOL COPY MOVE;
    #dav_ext_methods PROPFIND OPTIONS;

    # log.
    access_log /var/log/nginx/maven.access.log;
    error_log /var/log/nginx/maven.error.log;

    # IPを制限する場合
    # limit_except GET {
    #   allow xxx.xxx.xx.xx;
    #   deny all;
    # }
  }
}
```

Basic認証用のuserid/passwordを作る。

```
$ htpasswd -nbd username password > /etc/nginx/conf.d/.htpasswd
```

> コマンドが無い時は http://koexuka.blogspot.jp/2013/06/apachehtpasswdbasic.html?m=1

ファイルの置き場を作る。

```
$ mkdir /usr/share/nginx/html/webdav
$ chown nginx:nginx /usr/share/nginx/html/webdav
$ echo "dummy." > /usr/share/nginx/html/webdav/dummy.txt
```

nginxをrestart.

```
$ service nginx restart
```

6668ポートを開ける. ```/etc/sysconfig/iptables``` に以下を追記.

```
-A INPUT -p tcp -m tcp --dport 6668 -j ACCEPT
```

iptablesをrestart.

```
$ service iptables restart
```

## アクセスしてみる

ブラウザから, http://your.server.address:6668
grench lein repl 高速起動メモ


## grenchman install（opam経由）

1. brew install opam
2. opam update && opam upgrade
3. [grenchman github](https://github.com/technomancy/grenchman) build 4.01.0だとctypes0.3.3が404になる。4.02.1でctypes0.3.4で問題なかった。(2015/1/13時点)
4. grench -v => `Grenchman 0.2.0`表示

## grench lein repl

1. lein repl :headless :host 0.0.0.0 :port 7888　leinserver起動（当然これは遅い）
2. grench repl :connect 59096
require()とは何か？何が便利なのか


## 問題提起

最近のJSのサンプルコードは、だいたい文頭に

```
var $ = require('jquery');
```

などとついていますが、この`require()`ってよくわからない。

具体的には、

- どうやって使えばいいの？
- 普通にscriptタグで読み込む場合とどう違うの？
- 「require」でググっても英和辞典とかしかでないんだけど！

ということでざっと調べてみました。

## require()とは何か？

### commonJS

http://www.slideshare.net/terurou/common-js

以下、要約

そもそもの発端は、「Javascriptって良いよね。ブラウザ以外（ServerSide）でも使おうぜ」ということからだったらしいです。

しかし、scriptタグで読み込むこと前提だったので、HTMLがない（レンダリングエンジンがない）場合に外部ライブラリを参照する方法がない。。。
（さらに言えば、FileやNetwork、標準入出力など色々と不便。）

これじゃ困るということで、ServerSideの標準仕様を定めたのがcommonJS。

その中で外部ライブラリを参照する方法が、各JSファイルをモジュール化しておいて、使うときは`require()`で読み込むやりかた。

つまり、`require()`はcommonJSの仕様の一つであって、特定の実装・ライブラリを指しているわけじゃないようです。

### node.js

ServerSideでJavascriptを使えるようにしたもの。

当然`require()`はあるが独自拡張しており、最近はcommonJSを無視しているとかなんとか。（ちょと古い？）

http://nodejs.jp/nodejs.org_ja/api/modules.html

http://meso.hatenablog.com/entry/20110626/1309082158

nodeにはnpmというパッケージマネージャがありますが、これでインストールしたものは`require()`で読み込めます。

### RequireJS

http://requirejs.org/docs/commonjs.html

> CommonJS defines a module format. Unfortunately, it was defined without giving browsers equal footing to other JavaScript environments. Because of that, there are CommonJS spec proposals for Transport formats and an asynchronous require.

commonJSの仕様はServerSideのために作られたはずなんですが、ClientSideでも`require()`を使いたい、ということで作られたライブラリ。

```
<script data-main="js/main.js" src="bower_components/requirejs/require.js"></script>
```

とすればmain.jsをentryPointとして動作するらしい。

### webpack

http://ameblo.jp/ca-1pixel/entry-11884453208.html


Require.jsをもっとリッチにしたもの。

`require()`の対象をjsのモジュールだけでなく、

- altJSのコンパイル
- CSSやHTMLファイル取り込み
- （bower経由などの）jsファイル取り込み

などができるようになっている。

Require.jsと比較すると、

- Require.jsは、ブラウザ側で、個々のファイル（モジュール）を非同期に読み込むスタイル。
- webpackは、サーバー側で依存関係を全て見て、一つのjsファイルを生成しておくスタイル。
	- （もちろん、sourceMappingされるので実行時デバッグも問題ない。）

似たものにbrowserifyというのがある。（webpackの方が高機能っぽいので検証してない。）


## require()のメリット

`require()`は、**jsをモジュール化する仕組み**です。

従来のClientSideのJavascriptでは、scriptタグで読み込んでグローバルに転がしておくしかなかった。

一応MVCなどのパターンでjsファイルを分割するものの、各ファイルが密結合する（あるいはうっかり影響を与えてしまう）ことを防げなくて再利用性に乏しかった。

### 再利用しやすくなる。

モジュール化する、と同義ですね。

### 単体テストがしやすくなる。

外部依存を`require()`のみに限定することで、それ単体で動かすことができる。

`require()`の部分にMockを差し込むテストツールもある。
https://facebook.github.io/jest/


### 特にReact

コンポーネントをたくさん作って組み合わせていくスタイルなので、単体テストがやりやすい`require()`と非常に相性がいい。

http://facebook.github.io/jest/docs/tutorial-react.html#content

## require()のデメリット。

- 学習コストがかかる。
- ブラウザで気軽に試せない。（Require.jsかwebpack/browserifyが必要）

とはいえ、node.jsでは既に一般的だし、グローバルに転がすのはイケてないので、もはや導入しない理由はない気がします。
USB型の ZigBee デバイス、ToCoStick で２台の Raspberry Pi を無線で繋いで SLIP で互いに IP で通信する


#はじめに
[ToCoStick](http://tocos-wireless.com/jp/products/TWE-Lite-USB/) は[東京コスモス電機](http://tocos-wireless.com/jp/company/index.html)さんの USBドングル型の ZigBee で、特徴は以下のようにいいことずくめです

- 省電力：なんと 25mA、WiFi ドングルだとものによっては 500mA ぐらい消費したりしますよね

- 遠距離通信可能な（家の端から端ぐらいは普通に余裕ですし、高出力タイプと高利得アンテナを使うと[江ノ島から平塚まで](http://tocos-wireless.com/jp/products/TWE-001STRONG.html#TWE-001S-4)通信できてしまった実績もあるらしい）

- [安い](http://www.aitendo.com/product/9506)

- ソフトウェアが充実してて、[シリアル通信なんかも提供されてる](http://tocos-wireless.com/jp/products/TWE-ZERO/App_Uart/index.html)


２台の ToCoStick の１台を Mac に、もう１台を Raspberry Pi に挿して無線シリアルコンソールという使い方も便利ですが、２台の Raspbery Pi 同士をシリアルで繋ぎ、昔懐かしい slip (Serial Line Internet Protocol) で通信させることも可能です。ごちゃごちゃしてますがこんなかんじ

![スクリーンショット 2015-01-13 12.26.17.png](https://qiita-image-store.s3.amazonaws.com/0/46544/b8bcd5f3-2edc-2004-eece-86631d37f2f2.png "スクリーンショット 2015-01-13 12.26.17.png")

#設定
## 事前準備
ToCoStick には上の[App_Uart（シリアル通信アプリ）](http://tocos-wireless.com/jp/products/TWE-ZERO/App_Uart/index.html) を書いておき、２台でシリアル通信ができるようにしておきます


もし、すでに ToCoStick をシリアルコンソールとして使うために /etc/inittab に ToCoStick の ttyUSB0 を getty に追加してある場合はそこをコメントアウトしてください（getty が ttyUSB0 を OPEN していると slattach は OPEN できない）。以下の最終行がコメントアウトの例です。追加してなければ不要です

```bash:/etc/inittab
#Spawn a getty on Raspberry Pi serial line
T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
# T1:23:respawn:/sbin/getty -L ttyUSB0 115200 vt100
```

## Raspberry Pi で slattach を実行
例として A+ を 192.168.11.15 に、B+ を 192.168.11.16 に設定するとします
まず両者に sudo modprobe slip をしておいて、その後、以下のように slattach (slip の起動コマンド）を実行します

```BASH:A+
sudo modprobe slip
sudo slattach -L -s 115200 -p slip /dev/ttyUSB0 &
sudo ifconfig sl0 192.168.11.15 dstaddr 192.168.11.16
```
```BASH:B+
sudo modprobe slip
sudo slattach -L -s 115200 -p slip /dev/ttyUSB0 &
sudo ifconfig sl0 192.168.11.16 dstaddr 192.168.11.15
```

これで両者は TCP で通信が可能です。ping が通るようでいしたら、お互いのサーバをお互いに参照したり、その他いろいろとつかえます

#感想
Linux は古いソフトもちゃんといつまでも使えるので、slattach みたいなのがまだちゃんと使えるので嬉しいです。昔、Windows 3.1 の頃、SLIP で TCP 動かすのに苦労した思い出がなつかしいですね。
尚、Mac の slattach も探してみたのですがみつけられませんでした。
顔画像表示で良くある四角画像の円形切り抜き表示

# はじめに
UIImageViewを円形切り抜き表示します。
やってみると「まあ...そういうことだよね」のシンプルさでした。

# 実装
```lang:円形切り抜き表示
+ (void)clipToCircle:(UIImageView *)imageView
{
    imageView.layer.cornerRadius = imageView.frame.size.width * 0.5f;
    imageView.clipsToBounds = YES;
}
```

# 追記実装
UIImageViewに限らず、UIViewでもOKです。

```lang:円形切り抜き表示
+ (void)clipToCircle:(UIView *)view
{
    view.layer.cornerRadius = view.frame.size.width * 0.5f;
    view.clipsToBounds = YES;
}
```

# おわりに
プロフィール画像の表示時に使いました。
何かに参考になりましたら幸いです。
bashの出力なリダイレクトとパイプ周りのまとめ


## 出力
```
stdout
$ command >&1

stderr
$ command >&2
```

## ファイル出力
```
stdoutをファイルに
$ command >  file

stderrをファイルに
$ command 2> file

stdout/stdinどっちもファイルに
$ command >  file 2>&1
```

## bash依存系
```
stdout+stdin ファイル出力省略系
$ command &>  file
$ command &>> file  (append)

stdout+stdin パイプに渡す
$ command1 |& command2

標準エラーだけパイプに渡す
$ command1 > /dev/null |& command2

noclobber 環境下での強制上書き
$ command >| file
```
Synergyで「locked to screen」とログに出て他のPCに移れない場合の対処法

Synergy使用中に他のPCにマウスカーソルを移せなくなった。
デバッグログを確認すると接続先のPCとは正常に接続できているようだが、
スクリーンの端に来た時点で「locked to screen」と表示されている。

ググると以下のページがヒットした。
http://blog.ajperrins.com/2011/10/synergy-locked-to-screen.html

「Scroll-Lock」されていたのが原因とのことなので、
これを解除すると事象も改善されて、カーソルを移動できるようになった。
ヒアストリングとヒアドキュメント

# ヒアストリング
変数を擬似的にファイルのように取り扱える ※ bash依存
echo 変数 | command の代替になれる。

```bash:sample_herestring
ipaddr="192.0.2.4"
cut -d. -f1-3 <<< ${ipaddr}
```
```bash:output
192.0.2
```


# ヒアドキュメント
複数行をコマンドに渡したり、出力したりできる

## コマンドに渡す
```
$ sendmail -t << EOT
> From: foo@example.com
> To: bar@example.com
> Subject: test
>
> test
> EOT
$
```

## 複数行の出力
```
hoge="foo"
fuga="bar"

cat << EOF
1st ${foo}
2nd ${bar}
EOF
```
Ruby Association Certified Ruby Programmer Gold version 2.1 体験記

色々な方がすでに記載されているので、n番煎じではございますが、合格出来たので記録として残しておきます。

# Ruby Association Certified Ruby Programmer Gold version 2.1とは？
* [Ruby技術者認定試験制度](http://www.ruby.or.jp/ja/certification/examination/)で実施されている資格の一つです
 * SilverとGoldの両方に合格する必要があります
* 2014/10/1にversion 2.1へと改訂されました（[Ruby技術者認定試験改訂のお知らせ](http://www.ruby.or.jp/ja/news/20140715.html)）
 * 嬉しい事に、改訂記事のQ&Aにあるように、旧Silver+新Goldの組み合わせでも認定ver2.1プログラマGoldに認定されるようです

# 私のスペック
* 2年程前にRuby Association Certified Ruby Programmer Silver/Goldを取得したものの、その後Rubyを触る機会は多くはなかった
* その時の試験の際は、対策として以下の書籍を幾度か読んだ
 * [Ruby技術者認定試験 公式ガイド](http://www.amazon.co.jp/dp/4822234304)
 * [Ruby公式資格教科書](http://www.amazon.co.jp/dp/4774150010)
 * [メタプログラミングRuby](http://www.amazon.co.jp/dp/4048687158)
* Rubyに関する情報は、脆弱生の情報以外はあまり収集していない生活

余談となりますが、メタプログラミングRubyは試験を受験されない方にもオススメの良書です。
継承チェーンだとか、メタメタにコードをスッキリさせていく方法は開発する際の参考になりますし、他人のライブラリを読む場合の手助けにもなります。
気になる方は、書店で立ち読みをした後、是非購入してみてください！

# どういう勉強をしたのか？
* 昔利用していたRuby公式資格教科書を1から通読しなおし
 * 細かいところまで出来る限り記憶しなおす（普段ならirb等やリファレンスを見るような内容も）
* Ruby1.8.7と2.1の差を覚える
 * [Ruby技術者認定試験改訂のお知らせ](http://www.ruby.or.jp/ja/certification/examination/index.data/rubycert.pdf)
* Ruby2.1のリファレンスを眺める
 * [Ruby 2.1.0 リファレンスマニュアル](http://docs.ruby-lang.org/ja/2.1.0/doc/)
* ちょっとした空き時間に問題を解く
 * [ITトレメ Ruby技術者認定【Gold】試験](http://jibun.atmarkit.co.jp/scenter/ittrain/121_cal.html)

以上のような事をして、今回は88点を取る事が出来ました〜（＾＾

# 感想
試験前は『どんな問題が出るかも分からないし、合格は厳しいのかもな〜』と諦め気分だったのですが、解答を進めて行くと、旧Gold試験と感覚的には大差が無く、合格ラインを越えそうな感触が出て来てしまい、後半はドキドキとしていました。
試験中何度『受験生の中にgoogle先生はいらっしゃいませんかー！』とか『実行したら分かるので、irbを立ち上げて良いですか！』と思ってしまったことか（笑

以下に『役に立ったなー！』と実感した事をまとめておきます。

* Ruby公式資格教科書の覚え直し
  * 利用頻度の少ないメソッドやオプションといった普段意識しない事が多いものはかなり忘れていました
  * 模擬試験を試しにやってみたら合格ラインギリギリだったのは辛かったですね
* バージョンの差を眺める
 * [Ruby技術者認定試験改訂のお知らせ](http://www.ruby.or.jp/ja/certification/examination/index.data/rubycert.pdf)の「改訂のポイント」にあるものは、全部公式リファレンスを見て暗記しました
 * あと、地味に継承のトップがKernelからBasicObjectへと変わっている点を覚えておいてよかったです
* 問題文と選択肢をしっかり見つめる
 * たまに引っかけとか勘違いがありますし、選択肢が他の問題の答えとなっているケースがあります(『ここでコレを選択していないと、他の問題で選択出来るものがない・・・』とか)
* 色々な場面で継承チェーンの図を思い浮かべる
 * 『変数やメソッドをどこが持っているのか？』相変わらずココがGold試験のキモなように感じました
 * 実際に開発する場面でも、継承チェーンを思い浮かべられるのは役に立ちます

資格を持っているから何かを出来るようになったりするわけではないのですが、「最低限合格する程度には勉強をした事がある」証にはなりますし、バージョンの変更点を整理したり、「改めて勉強をし直す」という動機づけにはもってこいな試験だと思います。
安くはない試験なので、気楽に受験する事は出来ませんが、是非ともチャレンジしてみてはいかがでしょうか？
RubyのHash.default_procを用いたメモ化再帰

アルゴリズムの世界では単純に再帰関数を作成すると、計算量が莫大になってしまい、現実的な時間で解けないことが多々ある。それを解決する方法として、動的計画法とメモ化再帰という方法が有名である。

例としてフィボナッチ数を計算するプログラムで単純な再帰実装とメモ化再帰の違いを確認する。

```rb:fibonacci.rb
class FibonacciCalculator
  def calc(number)
    if number < 2 then
      return number
    else
      return calc(number - 1) + calc(number - 2)
    end
  end
end

calculator = FibonacciCalculator.new
puts calculator.calc(ARGV[0].to_i)
```

単純な再帰で実装した例である。たとえば、10番目のフィボナッチ数を計算する場合

1. calc(5) = calc(4) + calc(3)
    1. calc(4) = calc(3) + calc(2)
        1. calc(3) = calc(2) + calc(1)
            2. calc(2) = calc(1) + calc(0) = 1
        2. calc(2) = calc(1) + calc(0) = 1
    2. calc(3) = calc(2) + calc(1)
        1. calc(2) = calc(1) + calc(0) = 1

n = 5の場合に実に7回も再帰呼び出しを行うことになる。少し面倒だが6の場合は

1. calc(6) = calc(5) + calc(4)
    1. calc(5) = calc(4) + calc(3)
        1. calc(4) = calc(3) + calc(2)
            1. calc(3) = calc(2) + calc(1)
                2. calc(2) = calc(1) + calc(0) = 1
            2. calc(2) = calc(1) + calc(0) = 1
        2. calc(3) = calc(2) + calc(1)
            1. calc(2) = calc(1) + calc(0) = 1
    2. calc(4) = calc(3) + calc(2)
        1. calc(3) = calc(2) + calc(1)
            2. calc(2) = calc(1) + calc(0) = 1
        2. calc(2) = calc(1) + calc(0) = 1

実に12回の計算を行うことになる。このことからわかるように
n番目のフィボナッチ数の計算回数 = 1 + n-1番目のフィボナッチ数の計算回数 + n-2番目のフィボナッチ数の計算回数
と、計算回数自体がフィボナッチ数を上回る勢いで増えていく。これでは、数字が大きくなると現実的な時間では計算できないのは明らかである。

そこで、下記に示すように計算結果をキャッシュするメモ化再帰という手段がある。今回は計算結果のキャッシュ方法として、Hash.default_procを用いてみた。
(そもそも、この記事を書こうと思った理由が、Hash.default_procのような機能を他の言語では見かけたことがなく、自分で実装せずにメモ化できるというのが超便利だな！と感動したので、という感じ)

```rb:fibonacciCash.rb
class FibonacciCalculator
  def initialize
    @fibonacciCash = Hash.new
    @fibonacciCash.default_proc = -> (hash, key) { hash[key] = calc(key) }
  end

  def calc(number)
    if number < 2 then
      return number
    else
      return @fibonacciCash[number - 1] + @fibonacciCash[number - 2]
    end
  end
end

calculator = FibonacciCalculator.new
puts calculator.calc(ARGV[0].to_i)
```

n = 6の場合の計算回数は

1. calc(6) = calc(5) + calc(4)
    1. calc(5) = calc(4) + calc(3)
        1. calc(4) = calc(3) + calc(2) -> cashされる
            1. calc(3) = calc(2) + calc(1) -> cashされる
                2. calc(2) = calc(1) + calc(0) = 1 -> cashされる
            2. calc(2) = 1 <- cashされているので計算不要
        2. calc(3) = 2 <- cashされているので計算不要
    2. calc(4) = 3 <- cashされているので計算不要

各nに対して1度しか計算が必要ないので、n番目を計算するのに計算回数はn-1回しか必要ない。圧倒的に計算回数が節約される！

動的計画法に関しては次回かなー
Fence Repair with SplPriorityQueue

前回の記事は[コチラ（Fence Repair）](http://qiita.com/ukisoft/items/1600072d32ca199b0694#comment-94a746fadea60e262161)。
rana_kualuさんに、SplPriorityQueueという優先順位つきキューを教えていただいたので、リファクタしてみました。
個人的なポイント？は、優先度の値が大きいほうが優先度が高いこと（１が最も高いわけではない）と、extractとtopを混同しないことでしょうか。

```php
class FenceRepair
{
    public static function calc($boardsLength)
    {
        $cost = 0;
        $heap = new SplPriorityQueue();
        foreach ($boardsLength as $boardLength) {
            $heap->insert($boardLength, 1 / $boardLength);
        }
        while ($heap->count() > 1) {
            $firstBoard = $heap->extract();
            $secondBoard = $heap->extract();
            $cost += $newBoard = $firstBoard + $secondBoard;
            $heap->insert($newBoard, 1 / $newBoard);
        }
        return $cost;
    }
}
```

ふむふむ、コードもスッキリしたし、便利です。
Newrelicへdeploymentsの通知を行うon Engine Yard Cloud

Newrelicのdeploymentsに、Engine Yard Cloudの標準のdeployを使って通知する場合、rakeタスクを使うこともできるが、コマンドラインから以下のように行うこともできる。


```:deploy_after_restart.rb
on_app_master do
  require 'json'
  keys = JSON.parse(File.read("#{config.shared_path}/config/ey_services_config_deploy.json"))
  license_key = keys['New Relic']['license_key']
  app_name =  keys['base']['app_environment_name']
  run "#{config.current_path}/ey_bundler_binstubs/newrelic deployment --appname=\"#{app_name}\" --environment=#{config.framework_env} --user=\"#{config.deployed_by}\" --revision=#{config.active_revision} --license-key=#{license_key}"
end
```

app_nameとlicense_keyをアドオンの設定が載っているjson(yamlもある）から取ってくる。
window.openとかlocationとかsubmitとか、普通の昔から使ってたJavaScriptをjQueryで書く

まあ、昔はみんな button に onclick つけたり、画像にjavascriptのリンク貼ったりして「戻る」ボタンにしてた訳で。
大体もうデザイナーさんから上がってきた時点で、

```html
<a href="javascript:history.back()"><img src="images/B.gif" width="170" height="36" alt="戻る" /></a>
```

こんなんになってたんだけども。
jQuery とか使い始めるとこういうソースがどうにも耐えられない。
html ソースの中に Javascript のコードが書いてあるのが許せない状態になってしまう。
ということで、これまではよく見かけたコードを書き換えるにはどうしたらいいか調べてみた。

まずはボタンクリックで特定のURLにリダイレクトさせるやつ。

こんなボタンがあるとして、

```html
<input type="button" name="back" value="back" />
```

こんな感じっすか。

```js
$(':button[name=back]').click(function() {
    window.location = 'index.php';
});
```

次、ボタンクリックで window.open サイズ指定も付けて。

```js
$(':button[name=back]').click(function(e) {
    window.open('index.html','_blank',
        'width=360, height=500, menubar=no, toolbar=no, scrollbars=no');
    e.preventDefault();
    return false;
});
```

最後、ただ単にサブミットする。ついでに hidden の値を Javascript で指定。
こんなフォームがあるとして、


```html
<form action="index.php" method="post">
<input type="hidden" name="key" value="" />
<input type="submit" />
</form>
```

こんな感じで。

```js
$(':submit').click(function() {
    $(':hidden[name=key]').val('123');
    $('form').submit();
});
```

あと、追記だけども、HTML側で指定したフォームの飛び先（action）とは全然別のアドレスに飛ばしたい時もあるよね。
こんなんなってて、

```html
<form action="index.php" method="post">
<input type="button" id="preview" value="preview" />
<input type="submit" />
</form>
```

プレビューボタンを押したら、preview.phpに飛ばしたい、っていう場合、
ついでにpostじゃなくてgetにしたい、っていう場合、
こうなる。


```js
$(':button#preview').click(function() {
    $('form').attr('action', 'preview.php');
    $('form').attr('method', 'get');
    $('form').submit();
});
```
Macでnginxを導入したときの作業メモ


## インストール
homebrewでインストールする
`$ brew install nginx`


## 起動、停止、再起動
```
# 起動
$ sudo nginx
# 停止
$ sudo nginx -s stop
# 再起動
$ sudo nginx -s reload
```

## プロセス確認
`$ ps -ef | grep nginx | grep -v grep`

## 設定ファイルの場所
`/usr/local/etc/nginx/nginx.conf`
以下の作業は、このconfを修正します。

## root変更
状況に応じて決めてください

```
location / {
  #root html;
  root /Users/hoge/opt/htdocs;
}
```

## 設定ファイルのログ出力先、フォーマット変更
POSTデータが出力されるようにしておく

### ログの出力先
`/var/log/nginx/access.log`

### ログの出力フォーマット変更
```
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" "$request_body"';
```

## 静的なページでPOSTする
テスト時に必要になったので、こうやってみた

```
#サーバディレクティブに下記を追加など
error_page 405 =200 $uri;
```
プライベートな gem のインストーラ作りました～

## Ecogem

* プライベートな gem のインストールを楽にする gem

## 何で作ったか

* gem のソースを GitHub に置いて、Bundler でインストールする
* Bundler ではネストされた Git ソースを解決できない
    * インストールしたい gem が依存する gem も GitHub に置きたいけどダメ
* 自前で Rubygems のサーバー立てるか、[Gemfury](https://gemfury.com/) でホスト？
    * 認証がイケてない (SSH でやりたい)
* Rubygems が Git ソースに対応するか、Bundler が深い依存関係も解決してくれるまで気長に待つ？
* 自分でツール作ろう (なんかもう似たようなのありそうだけど)

## こういう感じのもの

Gemfile を Ecogemfile にリネームして、`ecogem install` を実行しま～す。

アプリケーションの Ecogemfile:

~~~ruby
source 'https://rubygems.org'
gem 'gem-a', git: 'git@github.com:me/gem-a.git'
gem 'rake'
~~~

gem-a の Ecogemfile:

~~~ruby
source 'https://rubygems.org'
gem 'gem-b', git: 'git@github.com:me/gem-b.git' 
gemspec
~~~

gem-b の Ecogemfile:

~~~ruby
source 'https://rubygems.org'
gemspec
~~~

すると、Ecogem が git を fetch してきて、ローカルの git ソースを参照する Gemfile を生成してくれる。ついでに `bundle install` もしてくれる。

生成された Gemfile:

~~~ruby
require "ecogem"

source "https://rubygems.org/"

gem "gem-b", path: Ecogem.git_path("git@github.com:me/gem-b.git master")
gem "gem-a", path: Ecogem.git_path("git@github.com:me/gem-a.git master")
gem "rake"
~~~

これで少し楽になった～。

## リンク

* [Ecogem](https://rubygems.org/gems/ecogem)
Apache+Tomcatでwebpを配信してみる

スマホ向けに、画像のクオリティを落とさずファイルサイズを小さくするためpegtranを使ってはみたものの、そこまで劇的に小さくならない。
そこでjavaなwebサービスでwebpを導入するための仕組みを検証したのでメモ（ただサービスには利用していない）

javaで画像をwebpへエンコードするには以下を利用。ImageIOで扱える拡張子に"webp"が増える。
https://bitbucket.org/luciad/webp-imageio
ただ社内標準がjdk1.5なので辛い。ステージングにjdk1.7を入れてtomcatで参照するように変更。

webpへの対応はリクエストヘッダから判別し、対応している場合リライトを行いwebpの配信を行う。
画像のエンコードは、ファイルが存在しない場合のみtomcatで実行し、二度目以降は作成済みのファイルをapacheで配信する。

```vertualhost.conf
DocumentRoot /var/www/xxx/htdocs

RewriteEngine On

# webp non support
RewriteCond %{HTTP_ACCEPT} !\bimage/webp\b
RewriteRule (.*) $1 [L]

# webp support
## check webp file exist
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
RewriteRule ^/(.*)$ balancer://xxx/servlet/webpImage%{REQUEST_URI}?ts=%{ENV:X_QUERY_TS} [P,QSA]
```
GenymotionでMACアドレスを指定する方法

Genymotionを起動していない状態で、Oracle VM VirtualBox マネージャーから、変更したいvboxを選択し、
設定 -> ネットワーク -> アダプター2 -> 高度
にあるMACアドレスの項目を指定したい値に変更する。

![スクリーンショット 2015-01-13 10.35.24.png](https://qiita-image-store.s3.amazonaws.com/0/16869/bcec0325-9514-2e3f-f11b-cf7a249c58d3.png)

変更後起動し、AndroidのSettings -> About Phone -> Status
にあるWi-Fi MACアドレスが変更されていることが確認できる。

![スクリーンショット 2015-01-13 10.34.37.png](https://qiita-image-store.s3.amazonaws.com/0/16869/d7f67c5e-4465-116f-d045-3d84e6f5099e.png)
openFrameworksで外付けUSBカメラを使用する


内蔵カメラの場合はとくに設定は必要ないが、外付けのUSBカメラを使う場合はデバイスIDを指定する。
IDは、listDevices で取得できるが、ログレベルを指定しないと出力されないので注意。

```C++:ofApp.cpp
void ofApp::setup()
{
    ofSetLogLevel(OF_LOG_VERBOSE);
    
    // .h で ofVideoGrabber grabber; と定義済みとする
    grabber.setVerbose(true);
    grabber.listDevices();
}
```

ログレベル設定しないと listDevices で出力されない。

```
[verbose] ofQTKitGrabber: listing video devices:
[verbose] ofQtKitGrabber: 0 - Venus USB2.0 Camera #2
[verbose] ofQtKitGrabber: 1 - FaceTime HD Camera
```
_macbook air に外付けカメラをつないだ場合の出力例_

grabber.setDeviceID(0); にIDを指定してやれば、外付けカメラを設定できる。
GenymotionでIMEIを指定する方法

Genymotionを起動していない状態で、vboxファイルの
`<GuestProperty name="genymotion_device_id" value="000000000000000" timestamp="1420763087975860000" flags=""/>`
(何箇所か存在する場合もあるが、Snapshotタグ内ではなく、Machineタグ内のもの)のvalueを設定したいIMEIに変更すればよい。
ex. `<GuestProperty name="genymotion_device_id" value="123456789ABCDEF" timestamp="1420763087975860000" flags=""/>`

その後、変更したvboxをGenymotionから起動し、電話アプリを起動して、
*#06#
とタイプすると、
![スクリーンショット 2015-01-13 10.11.06.png](https://qiita-image-store.s3.amazonaws.com/0/16869/614e7bff-391a-548e-3bf5-703d802331e7.png)
IMEIが変更されていることが確認できる。

なお、vboxファイルの場所は

* Windowsの場合
（ユーザーフォルダ）\AppData\Local\Genymobile\Genymotion\deployed\（イメージ名）.vbox
* Macの場合
（ユーザーフォルダ）\.Genymobile\Genymotion\deployed\（イメージ名）.vbox
aws-cliをタブキーで補完する


aws-cli(AWS Command Line Interface)ではTabによるコマンド補完をサポートしてますが、デフォルトでは有効ではありません。

身の回りでcliを新しく触り始めた人が知らないケースがあったので、今回導入方法をまとめまてみました。
隣人が、長いコマンド名を手打ちしているのを見かけましたら、そっと教えてあげてください。

aws-cliはインストールしてある前提ですが、macだとこんな感じで簡単に入ります。

```bash:install
python --version # 2.6.3以降を確認
type pip # pipを確認 →なければインストールする
sudo -H pip install awscli # インストール
```

ちなみに更新するときはこうです

```bash:update
sudo -H pip install --upgrade awscli
```

windowsへのインストールや他のインストール方法についての詳細はこちらを参照してください。
http://docs.aws.amazon.com/cli/latest/userguide/installing.html


# shellごとの設定

bash, zshでの設定方法です。

## bash

aws_completerを探します。
多分、`/usr/local/bin`か`/usr/local/aws/bin`あたりにいると思います。
見つかったら、completeコマンドのoptionにパスを、argsにawsを指定してあげる感じです。
.bashrcに追加するのをお忘れなく。

```bash:command
type aws_completer # aws_completer is /usr/local/bin/aws_completer
complete -C '/usr/local/bin/aws_completer' aws
echo "complete -C '/usr/local/bin/aws_completer' aws" >> $HOME/.bashrc # if you want
```

## zsh

zshの補完はaws_completerではなく、aws_zsh_completer.shを使います。
aws_zsh_completer.shをsourceコマンドで読み込んで上げればOKです。

```bash:command
type aws_zsh_completer.sh # aws_zsh_completer.sh is /usr/local/bin/aws_zsh_completer.sh
source /usr/local/bin/aws_zsh_completer.sh
echo "source /usr/local/bin/aws_zsh_completer.sh" >> $HOME/.zshrc # if you want
```

# 実行結果

こんな感じで補完されます。

長いコマンド名の打ち間違えを減らしたり、大量のコマンドを丸暗記しなくてもいいので、cliを使った作業効率が高まりますね。

![aaa.gif](https://qiita-image-store.s3.amazonaws.com/0/18114/fbde95fb-41c7-8a78-0b78-73fe8c97d136.gif "aaa.gif")


# その他

cliをBundled Installerを使ってインストールした場合は、PATHを通す必要があるみたいです。(未検証)

```bash:path
export PATH=/usr/local/aws/bin:$PATH
```

# 参考

https://github.com/aws/aws-cli/blob/develop/README.rst#command-completion
http://docs.aws.amazon.com/cli/latest/userguide/cli-command-completion.html

# 追記
@ryo0301さんから編集リクエストいただきました、ありがとうございます。

awscliをインストールする為に、pipを実行するとログやキャッシュのパーミッションで警告がでることがあるらしいです。
その際は -H オプションをつけて実行してあげてください。

```bash:terminal
The directory '/Users/YOURNAME/Library/Logs/pip' or its parent directory is not owned by the current user and the debug log has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want the -H flag.
The directory '/Users/YOURNAME/Library/Caches/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want the -H flag.
The directory '/Users/YOURNAME/Library/Caches/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want the -H flag.
```
Bootstrap/Bootswatchを適応させてみよう！[Rails編]


俺の名はケンヤ。難事件をいくつも迷宮入りさせたニート。しかし ある時謎の組織に入社し薬を飲まされ身体が縮んで`Braian`になっちゃった。

###[Bootswatch](http://bootswatch.com/)

##早速やってみましょう！
###①
まずはアプリを新規作成するためターミナルで
`rails new app`
を打ちこむ。

###②
次にGemfileに下記を入れアプリにBootswatch/bootstrapを適用させる。
`
gem 'therubyracer', platforms: :ruby（有効化）
gem 'less-rails' （追記）
gem 'twitter-bootswatch-rails', '~> 3.2.0’　(追記)
gem 'twitter-bootswatch-rails-helpers’ (追記)
`

###③
再びターミナルで入力
`bundle install`

`rails g bootswatch:install Bootswatchのテーマ名`

`rails g bootswatch:import Bootswatchのテーマ名`

`rails g bootswatch:layout Bootswatchのテーマ名`

###④
config/initializer/assets.rbに下記を追加
`
Rails.application.config.assets.precompile += %w( テーマ名.css ) Rails.application.config.assets.precompile += %w( テーマ名.js )
`

###⑤
aplication.cssやapplication.jsに下記を追加
[aplication.js]
`
//= require テーマ名/loader
//= require テーマ名/bootswatch
`

[application.css]
`
*= require_self
*= require テーマ名/loader
*= require テーマ名/bootswatch
`

###最後
あとは出来上がったerb、をもとにcss、javascriptを貼付けて使うだけ


##参考文献
**ありがとうございましたー！！**
####参考
http://morizyun.github.io/blog/bootswatch-rails-setup/
http://qiita.com/wantata222/items/fba52115ba53eeee59c5


####簡単カスタマイズ参考
http://coliss.com/articles/build-websites/operation/work/bootstrap-live-customizer.html
http://qiita.com/maruyam-a/items/c5642a4cb279be75a1b2
http://qiita.com/ppworks/items/071969ae01198b337ad2
http://easyramble.com/how-to-customize-twitter-bootstrap.html
herokuのDBをローカルにリストアしたときのメモ

Herokuの本番環境のDB内のデータをローカル環境のデータベースに適応したときのメモです。

①バックアップ用のIDの取得
>$ heroku pgbackups:capture --app [AppName]
>HEROKU_POSTGRESQL_COLOR_URL (DATABASE_URL)  ----backup--->  b040

※app一覧の取得方法
>$ heroku list

②バックアップ用のURLの取得
>$ heroku pgbackups:url b040 --app [AppName]

>"https://s3.amazonaws.com/hkpgbackups/app20000000@heroku.com/b040.dump?>AWSAccessKeyId=AAAAAAAAAAAA&Expires=1396852629&Signature=BBBBBBBBBBBBBBBB%2CCCCC" 

③バックアップデータの取得
>$ curl -o [latest.dump(保存データ名)] "https://s3.amazonaws.com/hkpgbackups/app20000000@heroku.com/b040.dump?AWSAccessKeyId=AAAAAAAAAAAA&Expires=1396852629&Signature=BBBBBBBBBBBBBBBB%2CCCCC"

③LocalのDBにリストア
>$ pg_restore --verbose --clean --no-acl --no-owner -h localhost [ユーザ名] -d [データベース名] [latest.dump(保存データ名)]

※ローカルのデータベースの確認
>$ psql -l
【メモ書き】HTML5から提供されたlocalStorageAPIに配列やオブジェクトを入れる

# localStorage
詳しくはインターネットを使うと色々出てくる.

クッキーよりも容量が大きいKVS（キーバリューストア）.
chromeやsafariなどだと5MB使える.
HTML5から提供されたAPI.
クッキーと違い毎回HTTPヘッダーに付加される訳でなく適宜取り出せる.

# 基本

```js
// write
localStorage.setItem("name", "gogotanaka");

// read
localStorage.name
//=> "gogotanaka"
```

# オブジェクトや配列を入れる

### 普通に入れてみる

```js
localStorage.setItem("names", ["Tom", "Bob"]);
localStorage.names
//=> "Tom,Bob"
```

強制的に`#toString()`が呼ばれるっぽい

### JSON.stringifyとJSON.parseを使う
```js
localStorage.setItem("name", JSON.stringify(["Tom", "Bob"]));
JSON.parse(localStorage.names)
//=> ["Tom", "Bob"]
```

```js
localStorage.setItem("obj", JSON.stringify(["Tom", "Bob"]))
JSON.parse(localStorage.obj)
//=> {name: "gogo", age: "22"}
```

ステキ


でも実運用する時は素直にいい感じのラッパーを使うのが良さそう.
グーグルのバグ予測アルゴリズムを実装したツール「bugspots」について


bugspotsはgoogleが開発した、バグ予測アルゴリズムをオープンソースとして開発されたツールです。

細かい説明は後にまとめますが、実際に使ったのを見るほうが分かりやすいので早速使ってみます。

##実際に使ってみる

1.bugspotsをgemでインストール

    #Gemfile
    gem 'bugspots'

    #terminal
    bundle install

2.githubのリポジトリを指定して実行する

    #terminal
	bugspots #{path to リポジトリのrootフォルダ}

3.結果を見てみる
![Screen Shot 2015-01-13 at 2.03.38 AM.png](https://qiita-image-store.s3.amazonaws.com/0/1418/a1abbbd3-c717-4bcb-f824-687a8c330982.png "Screen Shot 2015-01-13 at 2.03.38 AM.png")

このHotspotsの下に出力されている左の数値がバグが起こりやすい度合いを表すスコア、右が対象のファイルになる。

メチャクチャ簡単に導入できるので、
リファクタやコードレビューなどで目星をつけるという意味では有用なツールな気がしました。


##背景の説明
googleでは、チェックイン前にユニットテストやコードレビューが行われているが、コードが大量になってくると、ユニットテストやコードレビューをすり抜けたバグも少なからず発生してします。

googleではこの問題に対処するために、独自の「バグ予測アルゴリズム」を採用して、コードの品質向上を図っているらしいので、そのアルゴリズムについて調べてみました。


ソフトウェアなどのバグ発見手法には、「ソフトウェアメトリクス」というものがあります。

##ソフトウェアメトリクスの特徴

1. ソースコードを静的に分析
2. モジュールや関数の行数、ネストの深さ、モジュール間の依存度合いなどを数値に置き換える
3. 2で算出した数値を元にバグが起きやすい箇所を推測する

この手法でのバグ推測ツールは今でも様々なベンダーから市販されています。


ただし、googleは動的なソースコードの編集履歴を基にした、もっとシンプルな方法でバグを推測するアルゴリズムを開発しました。


##googleのバグ予測アルゴリズムの特徴

1. gitやsvnのバグトラッカーとコミットログを基に推測する
2. バグフィックスのコミットが何回行われたかが肝になる
※コミットログのコメントの中で'fix(es|ed)?|close(s|d)?'の正規表現にヒットするコミットをバグフィックスと見なしている。コメントを日本語で残しているなら、"修正"とかしてもいいかもしれない。

実際の数式がこちら。

![bugprediction01.gif](https://qiita-image-store.s3.amazonaws.com/0/1418/38a63c09-cbac-4cfb-139b-2ffd5cea2685.gif "bugprediction01.gif")

nは、コードに対してバグフィックスが行われた回数を示します。tiは修正が行われた時点のタイムスタンプで、コードが生成されたときを0、現在を1と置いて、その間の少数値をとります。つまり、1月1日にコードを書き始め、今日が1月30日であるとすると、15日にバグフィクスをしたらti＝0.5になります。
ti＝0のとき、1/(1＋exp(－12×ti＋12))≒0 となり、 
ti＝1のとき、1/(1＋exp(－12×ti＋12))＝0.5 となります。

tiをx軸、scoreをy軸にしてみたグラフはこうなる。
![bugprediction02.gif](https://qiita-image-store.s3.amazonaws.com/0/1418/bac47ef4-4e3f-f8e6-652c-61bc6a74db78.gif "bugprediction02.gif")

バグ修正の回数だけscoreが合計され、その合計スコアがバグが起きやすい度合いを表すスコアになる。

##まとめ

より高頻度にバグを修正し、かつ最近になって集中的に直しているほど、スコアが大きくなる。

そしてスコアが大きいほど、相対的に見てそのコードにはバグがある可能性が高い、というのがこのアルゴリズムの意味になります。
CentOS7でxrdp

## 参考

[CentOS 7にxrdpを入れてWindows RTからアクセスする - いろいろやってみるにっき](http://shigeo-t.hatenablog.com/entry/2014/10/28/090522)

## インストール

```bash:
yum install -y epel-release
```

```bash:/etc/yum.repos.d/xrdp.repo
[xrdp]
name=xrdp
baseurl=http://li.nux.ro/download/nux/dextop/el7/x86_64/
enabled=1
gpgcheck=0
```

```bash:
yum install -y xrdp
```

```bash:~/.Xclients
#!/bin/bash
XFCE="$(which xfce4-session 2>/dev/null)"
exec "$XFCE"
```

```bash:
chmod +x ~/.Xclients
systemctl start xrdp
```

## xfce4が起動しない場合

OS再起動しうまくいくか確認。
Qiitaの外部へのリンクを新規タブ(ウィンドウ)にする

qiitaのページ中にある外部リンクに`target="_blank"`とつけるだけです。よくあるやつのコピペです。

TampermonkeyとGreasemonkeyで確認しています。

Classに"external"とつけているので、適当なデコレーションをするとわかりやすいです。


```js:
// ==UserScript==
// @name         Add blank to qiita
// @namespace    http://your.homepage/
// @version      0.1
// @description  enter something useful
// @author       You
// @match        http://qiita.com/*
// @grant        none
/* load jQuery */  
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js  
// ==/UserScript==

jQuery(document).ready(function(){
    jQuery('a[href^=http]')
    .not('[href*="'+location.hostname+'"]')
    .attr({target:"_blank"})
    .addClass("external")
    ;})  
```

僕は[IcoMoon](https://icomoon.io/)というフォントでデコレーションしています。

```css
a.external:before{
  font-family:"icomoon";
  content:"\ea7e";
  padding-right:2px;
}
```
モデルローダーを自作する

Pmdローダーの実装を試みる。

#一番簡単なプラグイン

一番シンプルぽいプラグインを作ってみる。
NodeBrowserでTemplate(Value)をctrl+clickする。

現れたノードを右クリックするとC#のソースエディタが表示される。

```csharp
namespace VVVV.Nodes
{
	#region PluginInfo
	[PluginInfo(Name = "MmdLoader", Category = "Geometry", Help = "Basic template with one value in/out", Tags = "")]
	#endregion PluginInfo
	public class GeometryMmdLoaderNode : IPluginEvaluate
	{
		#region fields & pins
		[Input("Input", DefaultValue = 1.0)]
		public ISpread<double> FInput;

		[Output("Output")]
		public ISpread<double> FOutput;

		[Import()]
		public ILogger FLogger;
		#endregion fields & pins

		//called when data for any output pin is requested
		public void Evaluate(int SpreadMax)
		{
			FOutput.SliceCount = SpreadMax;

			for (int i = 0; i < SpreadMax; i++)
				FOutput[i] = FInput[i] * 2;

			//FLogger.Log(LogType.Debug, "hi tty!");
		}
	}
}
```

http://vvvv.org/documentation/dynamic-plugins-reference

Evaluateが毎フレーム呼ばれると。

* [Input]ISpread<double> FInput
* [Output]ISpread<double> FOutput
 
#今回必要なプラグイン
![Mesh.png](https://qiita-image-store.s3.amazonaws.com/0/59664/ffba0728-1b5a-e70c-e6c2-84715f74d93b.png)
Mesh(EX9.Geometry Join)を観察してみると今回必要な入出力はこんな感じになりそうだ。

* [Input]String FilePath
* [Output]ISpread<Vector3> Positions
* [Output]ISpread<Vector3> Normals
* [Output]ISpread<Vector2> TextureCoords
* [Output]ISpread<Vector3> Colors
* [Output]ISpread<int> Indices

```csharp:入力
	#region fields & pins
	[Input("Path"
		, StringType = StringType.Filename
		, FileMask =  "MMD File (*.pmd)|*.pmd"
		, IsSingle=true
		)]
	public ISpread<string> Path;
```

```csharp:出力
	[Output("Positions")]
	public ISpread<Vector3D> Positions;
		
	[Output("Normals")]
	public ISpread<Vector3D> Normals;

	[Output("TextureCoords")]
	public ISpread<Vector2D> TextureCoords;
		
	[Output("Colors")]
	public ISpread<RGBAColor> Colors;
		
	[Output("Indices")]
	public ISpread<int> Indices;
```

さっそくピンが出現したのでリンクを接続してみた。
![loader.png](https://qiita-image-store.s3.amazonaws.com/0/59664/6a980d3e-c2c5-b615-1ceb-1d9a517bc4a3.png)

#中味をゴリゴリ実装する
![mikusan.png](https://qiita-image-store.s3.amazonaws.com/0/59664/d108f451-fa1d-8c08-75c0-eb4b237b9d0b.png)

途中dynamic pluginのくせのある動作にはまったがなんとか頂点投入に成功。

* dynamic pluginを編集中に裏から別のアプリで編集したソースを反映する手段が無いっぽい。http://vvvv.org/forum/dynamic-plugin-visual-studio
* dynamic pluginのファイルに他のクラスを入れるとprojectが認識できなくなるっぽい

外部エディタとの連携が悪いのは遺憾ですな。特定のファイルに他のクラスを入れてはいけないというのはWinFormとかでもありましたな。UIのクラスより前に入れては行けないとかだったか。この辺りは使い手が注意する必要があるようだ。

今回のソース。
[GeometryMeshLoaderNode.cs](https://gist.github.com/ousttrue/7e27b4535f929b5b7000)
[PmdModel.cs](https://gist.github.com/ousttrue/f8a6e05e8db5c55f7aa0)

もうちょっとVVVVの流儀がわかったらちゃんとしたリポジトリを作るんじゃないか。

マテリアル反映とかはちょっとやっかいな気がするができんことはないので後回しにしてスキニングに進まねばなるまい。
Unity x SpriteStudio メモ

<blockquote class="twitter-tweet" lang="ja"><p>ルートパーツの定義はUnity側で毎フレーム上書きが発生するので、Instantiateでパラメータ渡したい場合、SpriteStudio側で制御してはダメ、が正解。 <a href="https://twitter.com/hashtag/spritestudio?src=hash">#spritestudio</a> <a href="http://t.co/cprYdRoL9F">pic.twitter.com/cprYdRoL9F</a></p>&mdash; 月琴かりん (@karinharp) <a href="https://twitter.com/karinharp/status/554709229781524481">2015, 1月 12</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
Pepperめも ～ペッパーリモコン作ってみた～

# 動画 
[デモどうがリンク](https://www.youtube.com/watch?v=tNe5-ra5W_Q)

# きっかけ
- Pepper君を気軽に動かしたい場面によく遭遇する。
 - 誰かが来て、動かしてみて！とか
 - カメラの深遠を覗き見て一か月くらいたっても帰ってこれない泥沼にはまった時に、カメラをちょっと動かすのに一々ipythonとかコレグラフとか弄るの面倒…とか
 - これより前にさくっと投稿しようと下書きしたメモがすでに1ヶ月級で気分転換したかったとか

- Pepperアプリコンテストに応募できるものないかなーと考えてたけど、かけられる時間も少ないし、プチWebアプリで済ませたい…的なこととか構想してたので、その試作目的とか
- きっかけはそんな感じにて。

# で、作ってみた
- 連休最終日、1日かけてまったり作成した程度のモノです。
- javascriptを使って作成。

## 成果ぶつ 
- http://haiatto.github.io/pepper_for_qiita/pepper_remocon
- githubのpagesとしてアップ。(初めて使ったので結構適当)
- ローカルLAN内にペッパー君がいる状態でページを開いて、IP打ち込んでください。開発中に面倒なので自分の環境のデフォルト設定になってます。（そのうち改善したい）
- 一応自分の持ってるiPhone5s向けにレイアウト調整中です
- ソースは、pepper_remocon以下のファイルのみで動く(つもり)で作っているので、なにかやりたければ改造したい放題の状態です。(一日突貫ソースなので状態は推して知ってください:-)

## なにしてるの？
- javascriptでNaoQiを操作しています。
- QiMessagingというやつを使ってます。
- あとは凄く一般的なjavascript製のWebページを作っただけです。
 - ほんとに大した事やってません。knockout.js とか jquery-mobile とかが便利すぎるのでjavascript＆HTML 初級者でも、作れる範囲でサクサク作っただけです。
 - 手慣れた人なら多分4時間程度でもっといい感じのが出来るのではないかと…(NaoQiのAPI調べるのに手間取るとは思いますが)

## QiMessageについて

- qimessaging.js というライブラリが必要です。
- 公式サイト上には存在しないか、どこかに一緒に入ってるようです。(NaoQiの中とか？) 
- [ここに開発中の最新版があるようです](https://github.com/aldebaran/libqi-js)
- 公式コミュニティにて教えてもらった情報より、Pepper君の中にも、/var/www/libs/qimessaging/ 配下に
- あります。
- 自分の場合は、sshでログインして、Pepper君の中のファイルと見比べた結果、最新版(2.0)はサーバー側が対応してないので動かないけど、最新版の中にある旧バージョン互換用(1.0)のほうは動くようなので、github上のファイルを使いました。
- ちなみに、最新版のほうは、多分Pepper君の中の/binに入っているpythonスクリプトを上書きすれば動く予感がしましたが、無保証も良いところなので実験してマセン。
- 最新版は通信方法がbase64からArrayBufferに置き換わったりと微妙にモダンな感じに変わってました。

# 今日の感想文
連休最終日を、本業のほうでそろそろ地獄を見る直前の状態の最後の安息日をつぶして、まるいちにち遊んでみました。
なかなか楽しかったです。まる！
…
いやほんとに、GoogleChromeの開発モード最高！
QiMessagingは、当然レスポンスは悪いけれどjavascriptの充実した開発環境が合わさった時の手軽さ…とくにビジュアルで表現したり、iPhone上にUI作ったりする目的ではピカイチ。
自分の使える道具が一つ増えたので、自分の中でのPepper君の可能性も広がった感じです。
これで、誰かが来たときも、スマフォ渡せばPepper君と戯れてもらうことが出来る。
そんな一日でした。まる！
Macで　GLUT + OpenGL のんびりいこう#6 Draw WireFrame

#前提
Mac OSX 10.7.5
Developer Tool

#目標
球形のワイヤフレーム描画

#Wire.cpp
```cpp:Wire.cpp
#include <GLUT/glut.h>

#define WIDTH 640
#define HEIGHT 480

//green定義
GLfloat green[] = { 0.0, 1.0, 0.0, 1.0 };
//ライトの位置
GLfloat lightpos[] = { 200.0, 1000.0, -500.0, 1.0 };

void display(void){
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glViewport(0, 0, WIDTH, HEIGHT);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();

	gluPerspective(30.0, (double)WIDTH / (double)HEIGHT, 1.0, 1000.0);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();

	gluLookAt(150.0,150.0,-150.0,
	  0.0,0.0,0.0,
	 0.0,1.0,0.0);

	glLightfv(GL_LIGHT0, GL_POSITION, lightpos);

	glMaterialfv(GL_FRONT, GL_DIFFUSE, green);
	glutSolidSphere(40.0,16,16);

	glutSwapBuffers();
}

void idle(void){
	glutPostRedisplay();
}

void Init(){
	glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
	glEnable(GL_DEPTH_TEST);
	glEnable(GL_LIGHTING);//ライトの効果を切る場合はこの行を削除
	glEnable(GL_LIGHT0);
	//ワイヤーフレーム
	glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
}

int main(int argc, char *argv[]){
	glutInitWindowPosition(100, 100);
	glutInitWindowSize(WIDTH, HEIGHT);
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
	glutCreateWindow("WireFrame");
	glutDisplayFunc(display);
	glutIdleFunc(idle);
	Init();
	glutMainLoop();
	return 0;
}
```

#コンパイル
framework指定が要点です。
g++ -o Wire Wire.cpp -framework GLUT -framework OpenGL
ワーニング抑制
g++ -o Wire Wire.cpp -framework GLUT -framework OpenGL -w

#コンパイルするだけのmakefile
```makefile
# default
.PHONY: all
all: Wire

# build
Wire: Wire.cpp
	g++ -o Wire Wire.cpp -framework GLUT -framework OpenGL -w
```

#Result
![スクリーンショット 2015-01-13 2.34.07.png](https://qiita-image-store.s3.amazonaws.com/0/33317/f3334509-87be-0d61-e0a8-01c6fac58661.png "スクリーンショット 2015-01-13 2.34.07.png")
sublimetextで正規表現モードをONにする


ここの一番ひだりのやつ。

![スクリーンショット 2015-01-13 2.32.00.png](https://qiita-image-store.s3.amazonaws.com/0/17429/48a98a57-e426-353d-b1f7-cb2c1503c5cb.png "スクリーンショット 2015-01-13 2.32.00.png")
vimを使った矩形選択

# はじめに
vimを使って矩形選択(くけいせんたく)をする方法。
ドットインストールの「vim入門」の中で覚えたvimで矩形選択をする方法が、いざ使いたいときに忘れているので備忘としてメモする。
## やりたいこと
```shell-session
$cat hoge.txt
12345
12345
12345
　↓ 上記の文章をvimを使って以下のように編集する。
$cat hoge.txt
aaa12345
aaa12345
aaa12345
```
# 手順
1. ノーマルモード(ESCキー)にて、文字を挿入したい位置へカーソルを移動する。
1. 矩形選択をするため、ctrl＋vキーを押下する。（このときVISUAL BLOCKと表示される）
1. 挿入したい行数分、↑キーor↓キーで範囲を指定する。
1. 挿入モードになるため、Shift＋iキーを押下する。（このときINSERTと表示される）
1. 挿入したい文字を入力した後、ESCキーを押下する。

# 説明
## vimのモードについて
### ビジュアルモード
 ノーマルモードにてvキーを押下すると、範囲指定できる状態になる。
 ※入力モードへ切り替える際に、iキーを押すのと同じようにvキーを押します。
 ※「:set showmode」で現在のモードを表示するように設定されていれば、「VISUAL」と表示される
### 矩形ビジュアルモード
 ノーマルモードにてctrl＋vキーを押下すると、矩形選択できる状態になる。
 ※「:set showmode」で現在のモードを表示するように設定されていれば、「VISUAL BLOCK」と表示される
# その他
## サクラエディタで矩形選択する方法
+ マウスで矩形選択

> Alt+ドラッグ：クリック位置からの矩形範囲選択ができます。

+ キーボードで矩形選択

> Shift+[F6] で矩形範囲選択モードになり、あとは通常のカーソル移動で矩形範囲を変えていきます。
> [Esc] キーで矩形範囲選択モードをキャンセルできます。

## Eclipseで矩形選択する方法
 alt+shift+aで、モードの切り替えが出来る。
## 秀丸で矩形選択する方法
 alt+ドラッグ：クリック位置からの矩形範囲選択ができます。

# 参考
+ [ドットインストール](http://dotinstall.com/lessons/basic_vim/4616)
+ [サクラエディタ矩形選択](http://sakura-editor.sourceforge.net/htmlhelp/HLP000014.html)
Bundlerのglobal configuration

アプリケーション毎の設定は`APP_ROOT/.bundle/config`にありますが、`~/.bundle/config`に置けばglobalな設定になります。

``` yaml:~/.bundle/config
BUNDLE_BIN: bin
BUNDLE_PATH: vendor/bundle

```

`bundle config --global`で設定してもokだそうです。

いちいち`bundle install --path=vendor/bundle`などと指定していたので便利になりました。

[bundle help config](http://bundler.io/man/bundle-config.1.html)
Commons IOの便利だと感じたメソッド

Commons IOの中で、私が便利だと感じたメソッドを紹介します。

# FileUtils

## copyInputStreamToFile
InputStreamをファイルへそのままコピーします。
ファイルアップロード処理で使用しました。

```java
import org.directwebremoting.io.FileTransfer;

FileTransfer fileTransfer; //クライアントから渡されたファイル（input[type="file"]要素)
InputStream is = fileTransfer.getInputStream();
FileUtils.copyInputStreamToFile(is, new File("/tmp/file.txt");
```

2.5からはcopyToFileメソッドも利用できます。
違いは、コピー元のInputStreamがcloseされるか否か。
copyInputStreamToFileはcloseされますが、copyToFileはopenのままです。
ZipInputStreamを使うときに役立つそうですが、その理由は分かりませんでした。

ただ、2.5はまだダウンロードできないので、気にする必要はないでしょう。
NAS4FreeでGitサーバ


##1.前提
full installしてあること。
初期インストールで↓の[3]を選んでいないと、追加パッケージはインストール出来ない模様。
![d9e3d5d8-97a9-4b18-6464-7978dce10189.jpeg](https://qiita-image-store.s3.amazonaws.com/0/64421/a20605a0-900d-5fa7-8e2b-e2c71bf64f47.jpeg "d9e3d5d8-97a9-4b18-6464-7978dce10189.jpeg")


##2.サーバ設定(WebGUIでの作業)
ほとんど参考サイトと同じですが、FTPは使わない手順で簡素化してます。

###gitユーザの作成

メニュー -> アクセス -> ユーザとグループ
* グループ・・・「git」グループを作成
* ユーザ・・・「git」ユーザを作成
　- プライマリグループを「git」
　- ログインシェルを「csh」
　- ホームディレクトリを「/home/git」

###SSHサーバ設定
メニュー -> サービス -> SSH
「有効」にする

##3.サーバ設定(コマンドでの作業)
まずはインストール

```
# pkg_add -r gitolite2
# su - git
```

gitユーザにスイッチしたら、下記ファイルを準備する。

```~/.cshrc
set path=($HOME/bin $path)
```

続いて、ssh公開鍵作成及び管理リポジトリのチェックアウトを行う。

```
% ssh-keygen ※全て空エンターでOK
% mkdir bin
% git clone git://github.com/sitaramc/gitolite
% gitolite/install -ln
% source ~/.cshrc
% ln -s /home/git/.ssh/id_rsa.pub /home/git/.ssh/nas4free.pub
% gitolite setup -pk $HOME/.ssh/nas4free.pub
※公開鍵のファイル名がそのままユーザ名になる模様。
　id_rsa のままは個人的に分かりにくかったので
　nas4freeという別名を作成したけど、上の2行は
　　gitolite setup -pk $HOME/.ssh/id_rsa.pub
　に置き換えてもOK。
% git clone git@localhost:gitolite-admin
```

##4.クライアントのアカウント作成
ここの手順はクライアントマシンの数だけ実施する。

###クライアント側の作業
とりあえずlinux(CentOS)でやってますが
他環境もほとんど同じと思われる。

```
# yum install -y git --enablerepo=epel
# git config --global user.name "tom"
# git config --global user.email "foo.bar@baz.com"

# ssh-keygen
# cat ~/.ssh/id_rsa.pub | ssh git@サーバ名 "cat > ~/gitolite-admin/keydir/tom.pub"
```

###サーバ側の作業

```conf:~/gitolite-admin/conf/gitolite.conf
@developer = tom ←追記（クライアントが複数の場合はスペースで区切る）
repo gitolite-admin
    RW+     =   nas4free

repo testing
    RW+     =   @all

repo myrepos  ←追記
    RW+     =   @developer ←追記
```

```
% cd gitolite-admin
% git add keydir/tom.pub
% git commit -a
% git push
```

###動作確認

`$ git clone git@サーバ名:myrepos`

エラー無くclone出来てたらOK

###その他
リポジトリはデフォルトで `~/repositories` に作られる。
ディスク容量の問題で場所を移動させてみた。

[レポジトリのルートディレクトリ変更](http://qiita.com/naka4/items/c274419cd11f8363de65)によると

```conf:~/.gitolite.rc
$REPO_BASE="repositories";
```

を

```conf:~/.gitolite.rc
$REPO_BASE="/var/git/repos";
```

等に書き換えると移動出来るらしい。
ただ、当方の環境では、そもそも `$REPO_BASE="repositories";`
といった記述が見当たず、適当に `$REPO_BASE="/var/git/repos";` 等を
追記しても反映されず、仕方なくシンボリックリンクで対処。。。

```
% mv ~/repositories /mnt/git/repositories
% ln -s /mnt/git/repositories ~/repositories
```

##5.参考サイト
[NAS4FreeにGitサーバを立ててみた](http://kunst1080.hatenablog.com/entry/2013/10/04/224406)
[Gitサーバ gitolite をFreeBSDで使ってみる](http://www.omakase.org/freebsd/git_gitolite_freebsd.html)