OmniAICreator/Qiita-1.07M huggingface dataset:
Rails4+RSpec3で新規プロジェクトを作ったときのハマりポイントまとめ

RSpec2から3にアップデートした方のハマりポイントは[すでに他の方が良質な記事にまとめてくださっている](http://qiita.com/jnchito/items/f86b57d27b44e6e7d1e9)ので触れません。僕はすでに RSpec2 → RSpec3 へのアップデートは経験済みなので、そこでのハマりポイントはこの記事では出てきません。ここでは、主に RSpec2 → RSpec3 のアップデートを経験していてもなお出くわした、プロジェクトで初めて導入した RSpec が RSpec3 だったときにハマったポイントを書きます（ニッチ！）。

## なぞのエラーでテストむっちゃ落ちる

絶対メソッドあるのに `NoMethodError` とか出るようになりました。デフォルトで `spec_helper.rb` が `spec_helper.rb` と `rails_helper.rb` に分割されていたようです。これからは Rails 特有の設定は `rails_helper.rb` が担当するようです。これまで

```rb
require 'spec_helper'
```

と書いていたところを

```rb
require 'rails_helper'
```

とすると動きました。

## 警告がむっちゃ出る

下記のような警告がむっちゃ出るようになりました。

```
/path/to/project/vendor/bundle/ruby/2.1.0/gems/rspec-rails-3.0.1/lib/rspec/rails/adapters.rb:124: warning: instance variable @example not initialized
```

デフォルトで作られる `.rspec` に

```
--warning
```

がついているようなので、これを外すと快適に動くようになりました。

RSpec を起動するまでに時間を使ってしまった……。

## 参考文献

* [RSpec 3 時代の設定ファイル rails_helper.rb について - willnet.in](http://willnet.in/126)
* [ruby - Guard with RSpec on Rails 4 giving a lot of warnings - Stack Overflow](http://stackoverflow.com/questions/24003316/guard-with-rspec-on-rails-4-giving-a-lot-of-warnings)
deploygate for iOSでテストユーザを追加する


##UDIDを集める
テスターの端末でアプリを有効にするために、各端末のUDIDをアプリに登録する必要があります。
deploygate画面右の"メンバー"の欄からEmailで案内を送ることができます。
案内から登録してくれると、UDIDの一覧にその端末が表示されていると思います。


![kobito.1404944654.973539.png](https://qiita-image-store.s3.amazonaws.com/0/29775/21ab1109-64e9-6f99-a43f-6c50498c088d.png "kobito.1404944654.973539.png")

##UDIDの確認
いま登録してくれたテスターは、まだ”プロファイル内に存在しない”となっています。これからの作業でこれを有効にします。

"UDID"をエクスポートするをクリックすると、name, UDIDのリストのtxtファイルが出力されるので適当な場所に保存します。

"Certificate, Identifer & Profile"のリンクをクリックしてApple Developer siteに移動します。



![kobito.1404944731.875989.png](https://qiita-image-store.s3.amazonaws.com/0/29775/09167bb8-7f02-cd52-b109-e4fc640ccaec.png "kobito.1404944731.875989.png")



##プロビジョニングにUDIDを追加
以前にdeploygate用にAdHoc形式のプロビジョニングを作ったと思います。
"Provisioning Profile"からそれを探して、"Edit"をクリックします。

![kobito.1404945779.958911.png](https://qiita-image-store.s3.amazonaws.com/0/29775/4f7c0485-ad1f-601a-2bc7-ebcf7f0ab393.png "kobito.1404945779.958911.png")




##UDID追加
"Register Murltiple Device"で先程deploygateで出力したファイルをまとめて追加します。
"Register Device"でコピペでペタペタ追加してもOKです。

そのまま手順を進めていくと新しいプロビジョニングプロファイルが作られるのでダウンロードして適当な場所に保存します。

![kobito.1404944757.425674.png](https://qiita-image-store.s3.amazonaws.com/0/29775/87485787-e7a4-11ca-2d55-9c0dfab07ed5.png "kobito.1404944757.425674.png")




##プロビジョニングファイルの更新
ダウンロードしたプロビジョニングプロファイル(hogehoge.mobileprovisionみたいなの)のファイルをクリックします。これだけで更新できるかと思ってたら、ダメだったので下記の手順を実行します。

Xcode > Preference > Account > View Details
でプロビジョニングを更新します。

![kobito.1404944461.315852.png](https://qiita-image-store.s3.amazonaws.com/0/29775/7b0a6950-73c8-c5a3-e9a5-f960add6a44d.png "kobito.1404944461.315852.png")


##ビルドしてipaファイル作成
Product > Archive > Distribute
でビルドします。
途中のプロビジョニングを選ぶ画面で先程更新したプロビジョニングを選びましょう。

![kobito.1404944862.589117.png](https://qiita-image-store.s3.amazonaws.com/0/29775/f7ae9ce0-652b-efdf-82d3-576508c695be.png "kobito.1404944862.589117.png")


##deploygateにアップロード
あとは生成されたipaファイルをアップロードすればOKです。
「UDIDが追加されてます」と表示されてます！いままで無効だった端末が有効になっているようです。
![kobito.1404944589.419149.png](https://qiita-image-store.s3.amazonaws.com/0/29775/b4f87a7a-ee9f-3203-2331-0293c48fbd1f.png "kobito.1404944589.419149.png")
Dockerでninix-ayaを動かそうとしている中での気付き（その2）

# apt-get install ninix-ayaでは依存関係が解決しないこともある

その昔、俺がlinux始めた頃、Debianの特徴として、依存関係の解決が強力との記憶があるのだが、Dockerの公式のイメージでの非デスクトップな状態で今どきなGnome系なライブラリを扱うようなXクライアントをapt-getでインストールしても動かないケースがあるようだ。

昨日、調べて、以下のようなパッケージを入れることで、ターゲットのXクライアントを動かすには不要なパッケージも多数入ってしまいそうだが、ninix-ayaのパッケージ版は動かすことが出来た。

```
apt-get install -y ubuntu-desktop
```

## ubuntu-desktopのDockerfileで扱う際の注意

apt-get install -y ubuntu-desktopだと以下のエラーで大量のDLが無駄になる

```
Errors were encountered while processing:
```

この対応としては事前に

```
ENV DEBIAN_FRONTEND noninteractive
```
を実行する。Dockerfileの最後のほうで

```
ENV DEBIAN_FRONTEND dialog
```

で、デフォルトに戻す。

### Link

- [私の Docker TIPS - Qiita](http://qiita.com/mopemope/items/181cb6c6c6f7cf9bbaa9)


## Link

- [無駄にUbuntu Server 10.04LTSでデスクトップ環境を整備する](http://esodov.blogspot.jp/2011/04/ubuntu-server-1004lts.html)

# Googleドライブの扱い困った

俺調べだと、.narファイル等はGoogleドライブで公開されていることが多いようなのだが、curlやwgetでDL出来るURLってどうやれば簡単に調べることが出来るのだろうか？
悪乗りでphantomjsやseleniumの魔改造で.narファイルダウンローダー作る気力はアラフォーの俺には無いし。

# 関連投稿

- [Dockerでninix-ayaを動かそうとしている中での気付き（その１） - Qiita](https://qiita.com/kjunichi/items/920d332e328468b6c54d)
- [Dockerでninix-ayaを動かそうとしている中での気付き（その3） - Qiita](https://qiita.com/kjunichi/items/8f426dd0081b19ef1ea7)
LPIC202(Ver4.0) 対策まとめ

# 概要
LPIC202(Ver4.0)対策のため、諸々の情報をまとめてみました
(暗記暗記アンド暗記な試験なので、少しでも覚えやすく、かつ頭に残りやすくするために整理した次第です)。
[LPIC202(Ver4.0)](http://www.lpi.or.jp/lpic2/range/ver4.0/range202.shtml)

# 設定ファイル整理
各ソフトウェア(サーバ)によって、単語区切りとか代入記号とか真偽値とか終端記号が異なるので、下記表にまとめてみました。なお、LPIC202の章順に従ってソートしています。

## 一覧表
| サーバ | 初版 | 単語区切り | 代入記号 | 真偽値 | 終端記号 | 記述例 |
|:--|:--|:--|:--|:--|:--|:--|
| BIND | ??? | チェイン(-) | 空白 | yes/no | ; | allow-query localhost; |
| Apache | 1995年 | パスカル(XxxYyy) | 空白 | on/off | 改行 | KeepAlive On |
| Squid | 1996年 | スネーク(_) | 空白 | on/off | ; | client_db on |
| Nginx | 2004年 | スネーク(_) | 空白 | on/off | 改行 | server_name_inredirect on |
| Samba | 1992年 | 特殊(空白) | = | yes/no | 改行 | read ony = yes |
| DHCP | ??? | チェイン(-) | 空白 | on/off | ; | use-host-decl-names on; |
| OpenLDAP | 1999年 | 特殊(xxx) | 空白 | on/off | 改行 | lastmod on |
| Postfix | 1999年 | スネーク(_) | = | yes/no | 改行 | smtpd_sasl_auth_enable = yes |
| Dovecot | 2002年 | スネーク(_) | = | yes/no | 改行 | disable_plaintext_auth = no |
| OpenSSH | 1999年 | パスカル(XxxYyy) | 空白 | yes/no | 改行 | PermitRootLogin yes |

## ざっくりまとめ
- 属性記法
 - 「パスカル(XxxYyy)」 ： Apache、OpenSSH
- 属性記法 + 真偽値
 - 「空白」 + 「on/off」 ： Webサーバ系(Apache、Squid、nginx)
 - 「空白」 + 「yes/no」 ： OpenSSH、BIND
- 属性記法 + 終端記号
 - 「チェイン」 + 「;」 ： ISC系(BIND、DHCP)
- 代入記号 + 真偽値
 - 「=」 + 「yes/no」 ： メールサーバ系(Postfix、Dovecot)、Samba


※認識違いがあったら、遠慮無くつっこんでください。

# 設定項目整理
ざっくりとマインドマップにまとめてみました。
よく間違えやすい、複数形("s"が付く)の項目は目立つようにしています。

![LPIC202_マインドマップ.png](https://qiita-image-store.s3.amazonaws.com/0/46216/e2f45636-2643-0113-4522-a47f47746209.png)


以上、何かしら、各々のお役に立てば幸いです。
OpenShift Onlineで任意のPerlバージョンでWebアプリを公開する方法

RedHat社のPaaS環境である「OpenShift Online」でMojoliciousアプリを公開する方法を記載します。現在OpenShift OnlineはRHEL6.5ベースで作られており、標準のPerlカードリッジだとPerl5.10になってしまうので任意のバージョンで公開する方法を記載します。今回はPerl5.20で実装します。


##前提条件
* RHNアカウントを取得していること
* rhcツールをDL済みであること

##アプリケーションの作成
sampleという名前のアプリケーションをDIYカードリッジで作成します。

```
rhc app create sample diy-0.1
```

##OpenShiftにSSHログイン

OpenShiftにSSHログインします。

```
rhc ssh -a sample
```


##Perlのインストール
今回はPerl5.20をインストールします。

```
cd ~/app-root/data/
mkdir src
cd src
wget http://www.cpan.org/src/5.0/perl-5.20.0.tar.gz
tar xzf perl-5.20.0.tar.gz
cd perl-5.20.0
./Configure -des -Dprefix=~/app-root/data/perl
make
make install
```

##Cpanm & Carton & Mojoliciousのインストール
Cpanm、Carton、Mojoliciousをインストール。シェル変数HOMEに~/app-root/dataを渡しているのは、デフォルトのHOMEだと権限不足でエラーではじかれるため。
OpenShift Online のセキュリティの問題なのかMojoliciousのテストがIO::Socket::INETところで失敗してしまう。

```
PATH=~/app-root/data/perl/bin:$PATH
HOME=~/app-root/data
cd ~/perl/bin
curl -LO http://xrl.us/cpanm
chmod +x cpanm
cpanm Carton
cpanm -n Plack Mojolicious
exit
```

##アプリケーションのひな形作成
OpenShift Online上にgitのremoteリポジトリが作成されるのでローカルにcloneする。.openshift/action_hooksディレクトリにあるstart/stopスクリプトがアプリケーションの起動停止スクリプトになるため以下のように修正します。

```
rhc git-clone sample
mojo generate app Sample::Web
cd sample
mv ../sample_web/* .
vim .openshift/action_hooks/start
vim .openshift/action_hooks/stop
git add .
git commit -m 'first commit'
git push origin
```

```.openshift/action_hooks/start
#!/bin/bash
PATH=~/app-root/data/perl/bin:$PATH
nohup plackup --host $OPENSHIFT_DIY_IP --port $OPENSHIFT_DIY_PORT $OPENSHIFT_REPO_DIR/script/sample_web > /dev/null 2>&1 &
```

```.openshift/action_hooks/stop
#!/bin/bash
kill `ps -ef | grep plackup | grep -v grep | awk '{ print $2 }'` > /dev/null 2>&1
exit 0
```

##まとめ
OpenShift OnlineでもPerl最新版でMojoliciousアプリが動かせることがわかりました。

## 参考
[OpenShift-DIY-Perl](https://github.com/dns/OpenShift-DIY-Perl)
Jadeで処理を共通化する方法

Node.jsのexpressで使用するテンプレートエンジンである、Jadeで処理を共通化する方法を説明する。

http://jade-lang.com/reference/

#Includeによる共通化
includeを用いることで外部ファイルを使用できる
複数のファイルで共通する処理は別ファイルにまとめて、includeすればよい。
与えられた変数はIncludeしたファイルでも使用できる。

```message.jade
div#message(style='display:none')
  - for(var key in message) {
    div(id='#{key}') #{message[key]}
  -}
```

```project.jade
// HTML
doctype html
html
  head
    title #{message.title}
    link(rel='stylesheet', href='/stylesheets/style.css')
    link(rel='stylesheet', href='/stylesheets/ui-lightness/jquery-ui-1.10.4.min.css')
    link(rel='stylesheet', href='/javascripts/lib/msgbox/msgBoxLight.css')
    script(type='text/javascript', src='/javascripts/lib/jquery-1.11.1.min.js')
    script(type='text/javascript', src='/javascripts/lib/jquery-ui-1.10.4.min.js')
    script(type='text/javascript', src='/javascripts/lib/msgbox/jquery.msgBox.js')
    script(type='text/javascript', src='/javascripts/src/ui_util.js')
    script(type='text/javascript', src='/javascripts/src/project.js')
  body
    h2 #{message.title}
    include message
```

#mixinによる共通化
同じファイル内で特定のブロックを繰り返したい場合は、mixinを使用するといい。
mixinを使用する際に、引数を与えることができるので、それにより、各繰り返し要素の内容を変更できる。
以下の例では追加用のダイアログと変更用のダイアログのHTMLを共通的に作成している。

```sample.jade
// エディット用のダイアログ
// @param id DialogのID
mixin editDialog(dialogId, saveBtnId)
  div(id=dialogId, class='dialog', style='display:none')
    div #{message.projectName}
      input(type='text', name='projectName')#projectName
    div #{message.path}
      input(type='text', name='path')#inputPath
      button#addPath +
      button#deletePath -
    br
    select(multiple style="width:100%;")#selectPath
    br
    button(id=saveBtnId) #{message.saveBtn}

// HTML
doctype html
html
  head
    title #{message.title}
    link(rel='stylesheet', href='/stylesheets/style.css')
    link(rel='stylesheet', href='/stylesheets/ui-lightness/jquery-ui-1.10.4.min.css')
    link(rel='stylesheet', href='/javascripts/lib/msgbox/msgBoxLight.css')
    script(type='text/javascript', src='/javascripts/lib/jquery-1.11.1.min.js')
    script(type='text/javascript', src='/javascripts/lib/jquery-ui-1.10.4.min.js')
    script(type='text/javascript', src='/javascripts/lib/msgbox/jquery.msgBox.js')
    script(type='text/javascript', src='/javascripts/src/ui_util.js')
    script(type='text/javascript', src='/javascripts/src/project.js')
  body
    h2 #{message.title}
    +editDialog('dlgAddProject', 'btnAddProject')
    +editDialog('dlgEditProject', 'btnUpdateProject')
```
tarで特定ファイルだけ取り出したり余分なディレクトリを作らないようにしたりなどのオプションメモ

例として、[peco](https://github.com/peco/peco)のバイナリアーカイブを取ってきて余分なファイルを作らずに`/usr/local/bin/peco`に実行ファイルを置いてみよう。

# 例）pecoのアーカイブから実行ファイルだけ取り出してみる
## pecoのバイナリアーカイブの構成を確認
ちなみにpecoのアーカイブを普通に解凍すると以下の様なディレクトリとファイル構成になっている。

```
$ tar xf peco_linux_amd64.tar.gz
$ find
./peco_linux_amd64
./peco_linux_amd64/peco
./peco_linux_amd64/Changes
```

## pecoだけを目的の場所に取り出す方法
先ほど確認したアーカイブの内、`peco_linux_amd64/peco` だけを取り出して `/usr/local/bin` に置きたいわけだ。`man tar` とか確認しながら出来のが↓これ。

```bash
[[ ${OSTYPE} =~ ^linux ]] &&
curl -sL "https://github.com/peco/peco/releases/download/latest/peco_linux_amd64.tar.gz" |
sudo tar xz \
  -C /usr/local/bin/ \
  --strip=1 \
  '*/peco' \
  --no-same-owner \
  --no-same-permissions
```

## オプション解説
1個ずつ解説しよう。

- `curl` の `−s`　…これはダウンロードの進捗状況とかが表示されるのを抑制する。
- `curl` の `-L`　…これはリダイレクトに対応するオプションだ。コレがないとリダイレクトが発生した場合に追っかけてダウンロードしてくれないのでよく使う。
- `sudo`　…`/usr/local/bin`は一般ユーザで書き込みできないので。
- `tar xz`　…これは説明不要かな。`x`は展開、`z`はgz圧縮を解凍する。パイプで繋いでるからcurlでDLしてきたのの解凍だ。
- `tar` の `-C`　…これは解凍先のディレクトリを変更する。これだけつけると`/usr/local/bin/peco_linux_amd64/peco`とかが出来ちゃう。
- `tar` の `--strip=1`　…これはtarアーカイブ内のディレクトリを1階層分無視する。つまり`peco_linux_amd64/`が無くなって、その結果`-C`と合わせて`/usr/local/bin/peco`とかが出来る事になる。ただしここまでだと`/usr/local/bin/Changes`とかも出来ちゃうので困る。
- `'*/peco'`　…特にオプションとか無くアーカイブ内のファイル名を列挙すれば特定ファイルだけ取り出せる。`peco_linux_amd64/peco`とかって書いても良いけど、バイナリタイプとかバージョンがついててディレクトリ名が固定じゃないことが多いのでワイルドカードを使って指定している。ここまでで無事`/usr/local/bin/peco`のみを作成すること出来た。
- `tar` の `--no-same-owner`　…これはセキュリティに関するオプションと思って良いかな。rootで解凍するとuid情報とかもそのまま引き継いでしまうため他の環境で作ったアーカイブを解凍すると変なオーナーのファイルが出来てしまうので、それを避けるためにつける。
- `tar` の `--no-same-permissions`　…セキュリティ的にはこっちのが最重要かな。tarはパーミッション情報がついてればそのまま解凍してくれる。メジャーなアーカイブなら普通は問題無いとは思うけど、悪意のあるアーカイブを解凍した場合に`SUIDビット`が立ったファイルが仕込まれてる可能性もゼロではない。SUIDビットが立ったファイルってのは例えば `chmod 4755` とかで作れる。このビットが立った実行ファイルは一般ユーザが使う場合でもファイルオーナーの権限(大抵はroot)で動作してしまうので大変危険だ。そういった余計なパーミッションを引き継がないのがこのオプションの目的。


## めでたし
こうして思慮深くオプションを選んで実行することで以下の様な実行ファイルを得ることが出来るわけだ。

```
$ ls -l /usr/local/bin/peco
-rwxr-xr-x 1 root root 4343112  7月  7 12:10 /usr/local/bin/peco
```

今回は備忘録として peco のアーカイブを例に試したけど、一度こういうのをメモっておくと後で確認しやすくて良い。
ハッシュを使ったメモリ使用量計測+簡易メモリリークチェックつきカスタムアロケータ


いま書いている C 言語のライブラリの副産物としてカスタムアロケータを公開。以下の特徴を持つ。

 * malloc/calloc/free のみ
 * ``allocator_get_size`` で現時点のヒープ使用量を計測できる
  * ``g_allocator_table`` をイテレートすると個々のメモリアドレスと確保したサイズを取得出来る
 * 終了時に ``allocator_get_size() > 0`` であるかどうかでメモリリークが発生したかどうかを確認できる

使う時は [klib](https://github.com/attractivechaos/klib) にある [khash.h](https://github.com/attractivechaos/klib/blob/master/kmath.h) を予め同じディレクトリにおいておく必要がある。

```c
// Public Domain

#include "khash.h"

KHASH_MAP_INIT_INT64(allocator, void *)
static khash_t(allocator) *g_allocator_table;

static void *
allocator_malloc(size_t size)
{
    int ret;
    void *ptr = malloc(size);
    if (ptr) {
        khiter_t it = kh_put(allocator, g_allocator_table, ptr, &ret);
        kh_value(g_allocator_table, it) = (void *) size;
    }
    return ptr;
}

static void *
allocator_calloc(size_t length, size_t size)
{
    int ret;
    void *ptr = calloc(length, size);
    if (ptr) {
        khiter_t it = kh_put(allocator, g_allocator_table, ptr, &ret);
        kh_value(g_allocator_table, it) = (void *) (size * length);
    }
    return ptr;
}

static void
allocator_free(void *ptr)
{
    if (ptr) {
        khiter_t it = kh_get(allocator, g_allocator_table, ptr);
        kh_del(allocator, g_allocator_table, it);
        free(ptr);
    }
}

static size_t
allocator_get_size()
{
    khiter_t it, end;
    size_t size = 0;
    for (it = kh_begin(g_allocator_table), end = kh_end(g_allocator_table); it < end; it++) {
        if (kh_exist(g_allocator_table, it)) {
            size += (size_t) kh_value(g_allocator_table, it);
        }
    }
    return size;
}
```

これを拡張して以下に対応できるとちょっと使い勝手がよくなるかもしれない。

 * malloc/realloc/calloc の呼び出し回数の計測
 * realloc の対応
 * [libunwind](http://www.nongnu.org/libunwind/) を使ったメモリリーク箇所の特定

後者を実装するくらいなら [valgrind](http://valgrind.org/) を使うか gcc/clang に含まれる [LeakSanitizer](http://clang.llvm.org/docs/LeakSanitizer.html) を使うことを検討するべき。
Vagrant仮想マシン上にredis2.8.12インストール

# redisインストール

## Berkshelf
Berkshelfファイルにcookbookを指定します。

```Berkshelf
source "https://api.berkshelf.com"

cookbook 'redisio'
```

## cookbookダウンロード
cookbooksディレクトリが存在するとダウンロード出来ないので、削除してダウンロードします。

```
rm -fr cookbooks
/opt/chef/embedded/bin/berks vendor cookbooks
```

## Vagrantfile
Vagrantfileへrecipeとattributesを追加します。

```Vagrantfile
  config.vm.provision :chef_solo do |chef|
    chef.cookbooks_path = ["cookbooks", "site-cookbooks"]
    chef.add_recipe "redisio::install"
    chef.add_recipe "redisio::enable"

    chef.json = {
      redisio: {
        version: "2.8.12",
      },
    }
  end
```

## 起動
```
vagrant up
```

## リンク
[Vagrant初期設定](http://qiita.com/moscowmule2240/items/c5b9d8e261af5737ef5a)
[自分で作成したcookbookをVagrantで適用する](http://qiita.com/moscowmule2240/items/897189a0df144925442c)
[VagrantでCentOS外部レポジトリの追加](http://qiita.com/moscowmule2240/items/bf9bb3e0828e2986ce75)
[Vagrant仮想マシン上にMySQL5.5インストール](http://qiita.com/moscowmule2240/items/5d1efc2deb89c6219fd5)
[Vagrant仮想マシン上のMySQLに接続](http://qiita.com/moscowmule2240/items/88889195dc51948279fd)
[Vagrant仮想マシン上にredis2.8.12インストール](http://qiita.com/moscowmule2240/items/82cdf61a4168462f6644)
横幅からWrappedなテキストが納まる領域の高さを求める方法

特定の幅の領域に自動折り返しONでテキストを表示する時に、
全体を表示するのに必要な高さを計算する方法。

CATextLayerの必要サイズを求める時などに使ったのでメモ。

```swift
func heightForStringDrawing(myString: String, myFont: NSFont, myWidth: CGFloat) -> CGFloat
{
    var textStorage = NSTextStorage(string: myString)
    var textContainer = NSTextContainer(containerSize: NSMakeSize(myWidth, CGFloat(FLT_MAX)))
    var layoutManager = NSLayoutManager()
    layoutManager.addTextContainer(textContainer)
    textStorage.addLayoutManager(layoutManager)
    textStorage.addAttribute(NSFontAttributeName, value:myFont, range:NSMakeRange(0, textStorage.length));
    textContainer.lineFragmentPadding = 0.0
    
    layoutManager.glyphRangeForTextContainer(textContainer)
    return layoutManager.usedRectForTextContainer(textContainer).size.height;
}
```

Appleが提供してくれててもいい気がしますが
ドキュメントでの紹介しかありません・・・

### 参考
[Calculating Text Height - Mac Developer Library](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/TextLayout/Tasks/StringHeight.html)
【WordPress】query_postsの代替としてのget_postsについて

## 結論
get_posts()を使い、setup_postdata()し、wp_reset_postdata()する。

## 書き比べ
### query_posts()版
```php:
<?php
    query_posts('category_name=' . $category->slug . '&orderby=title&order=ASC');
    if(have_posts()):
        while(have_posts()):
?>
            <h4><?php the_title(); ?>"></h4>
            <?php the_contents(); ?>
<?php
        endwhile;
    endif;
?>
```
### get_posts()版
```php:
<?php
    $post_args = array(
        'category'  => $category->cat_ID
       ,'orderby'   => 'title'
       ,'order'     => 'ASC'
       ,'post_type' => 'post'
    );
    $shohin_posts = get_posts( $post_args );
    foreach($shohin_posts as $post) :
        setup_postdata( $post );
    ?>
        <h4><?php the_title(); ?>"></h4>
        <?php the_contents(); ?>
<?php
    endforeach; 
    wp_reset_postdata();
?>
```

## 参考
[テンプレートタグ/query posts - WordPress Codex 日本語版](http://wpdocs.sourceforge.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/query_posts)
[query_postsを捨てよ、pre_get_postsを使おう【追記あり】【報告あり】 | notnil creation weblog](http://notnil-creative.com/blog/archives/1688)
[テンプレートタグ/get posts - WordPress Codex 日本語版](http://wpdocs.sourceforge.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/get_posts)
【WordPress】投稿を並び替える順番を指定する

WordPressでWebページを作成しているときに、
投稿をある決まった並び順で並べたい時があったのでメモ。

## 結論
カスタムフィールドを使用する。
カスタムフィールド(例：sort_number)を作成して順番を半角数字で登録する。
取得するときは、

```php:
<?php
    $args = new Array(
        'orderby'  => 'meta_value_num',
        'order'    => 'ASC',
        'meta_key' => 'sort_number');
    get_posts($args);
?>
```
で並び替えられる。
※orderbyの指定は、_numを付けないと数字的に並び変わってくれないで注意

slugに番号を持たせて、コアソースのorder処理に
slugでの並び替えを追記する手もあるらしいけど、
担保とるコストと、WordPressのアップデート時の対応コストが定期的にかかってしまうため
商用Webページには向かない対応だと考える。

## 参考
[テンプレートタグ/get posts - WordPress Codex 日本語版](http://wpdocs.sourceforge.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/get_posts)
[Karappo web design room » wordpressでスラッグ順に投稿を表示する方法](http://labs.karappo.net/kwdr/index.php?itemid=280)
Ubuntu + Ruby + Watir-webdriver で Google Chrome をエミュレート


#概要

VM上でなど、CUI環境でUbuntuを使っている場合のブラウザエミュレーションの方法を紹介します。

#Watir-webdriverとは？

* capybara的なもの
 * 参考：http://watirmelon.com/2011/05/05/selenium-webdriver-vs-watir-webdriver-in-ruby/

* ブラウザエミュレーションのインターフェイス

#導入手順

##Google Chromeのインストール

まず、CUIのみで使ってるとGoogle Chromeがないと思うので、入れます。

```bash
wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
sudo sh -c 'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'
sudo apt-get update
sudo apt-get install -y google-chrome-stable
```

##chromedriverのインストール
参考：https://code.google.com/p/selenium/wiki/ChromeDriver

```bash
sudo apt-get install unzip
wget http://chromedriver.storage.googleapis.com/2.20/chromedriver_linux64.zip
unzip chromedriver_linux64.zip
sudo mv chromedriver /usr/local/bin/
sudo chmod +x /usr/local/bin/chromedriver
rm chromedriver_linux64.zip
```

ちなみに、Mac OS Xの場合は `brew install chromedriver` とします

##Xvfbのインストール
ブラウザをエミュレートするために、仮想ディスプレイが必要です。

```bash
sudo apt-get install xvfb
```

##Gems

```bash
gem install headless
gem install watir-webdriver
```

#使い方

```ruby
require 'headless'
require 'watir-webdriver'

headless = Headless.new
headless.start
browser = Watir::Browser.new :chrome
browser.goto('https://www.google.com')
browser.close
headless.destroy
```
PHP、MySQLで4バイトのUTF8を使うとき

## MySQLでデータベースの作成

```mysql:
CREATE DATABASE データベース名 CHARACTER SET uff8mb4;
```

## PHPでPDOの初期化

```php:
<?php
try{
    $dbh = new PDO('mysql:dbname=データベース名;host=localhost;charset=utf8mb4;');
}
catch(PDOException $e){
    dir('エラーメッセージ: ' . $e->GetCode());
}
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
```
RDSにユーザを作成する

AWSのサービスの一つであるRDSにユーザを作成する方法

やる前はGRANT権限とか無さそうだし、管理画面上からごにょごにょするのかな〜と思ってたんですが、
そんなことは無くて普通にGRANT文を実行してユーザ追加出来ました。

これだけだとなんなのでユーザ作成するGRANT文を置いておきますね。
 (*・ω・)ノ[sql]ペタッ

```sql:SELECT権限のみのユーザ
GRANT SELECT ON DB名.* TO ユーザ名@localhost identified by 'パスワード';
```
ドキュメント、仕様書作成、開発ツール等

テーブル定義書作成
TDE
http://unicasoft.jp/tde/

CSE
http://www.hi-ho.ne.jp/tsumiki/

---

ER図作成
A5-SQL Mk-2
http://www.wind.sannet.ne.jp/m_matsu/developer/a5m2/

ERMaster
http://ermaster.sourceforge.net/index_ja.html

---

UML作成
astah* community
http://astah.change-vision.com/ja/product/astah-community.html

パターンウィーバー
http://pw.tech-arts.co.jp/

---

スクリーンショット
WinShot
http://www.forest.impress.co.jp/library/software/winshot/

---
ユニットテスト（PHP）
PHPUnit
http://phpunit.de/

---

電子印作成
スタンプ・ポン
http://www.ddm-cosmo.com/cosmo-support/cgi/down-db/info.cgi?mode=main&cno=2

---

ファイル比較、マージ

WinMerge
http://www.geocities.co.jp/SiliconValley-SanJose/8165/winmerge.html

DF
http://freesoft-100.com/review/df.php
ソケット通信スタブ
TCP/IPテストツール
http://homepage2.nifty.com/nonnon/Download/SocketTool/

ユニットテスト（JavaScript）
Jasmine
http://jasmine.github.io/

コメントからクラスや関数の説明を生成（PHP）
phpDocumenter
http://www.phpdoc.org/

コメントからクラスや関数の説明を生成（JavaScript）
JSDoc
http://usejsdoc.org/

クラス階層図の作成
Doxygen
http://www.doxygen.jp/
WindbgでLIST_ENTRY構造体をEnumしたい


LIST_ENTRY構造体で繋がったデータをdtしたい場合は

```
!list -x "dt <LIST_ENTRYをメンバに持つ型> @@(#CONTAINING_RECORD(@$extret, <LIST_ENTRYをメンバに持つ型>, <LIST_ENTRY構造体のメンバ>))" <アドレス>
```

PEBの中にあるInMemoryOrderLinksを一つずつ辿ってダンプするならこう.
```
!list -x "dt ntdll!_LDR_DATA_TABLE_ENTRY @@(#CONTAINING_RECORD(@$extret, ntdll!_LDR_DATA_TABLE_ENTRY, InMemoryOrderLinks))"  <InMemoryOrderModuleList address>
```

https://groups.google.com/forum/#!msg/microsoft.public.windbg/KeYkl6F7458/qvUaiMsObOUJ


タイピングめんどくさい。もっとさくっと辿りたい！って時は

```
dl <memory address>
```

で簡単に見れる

```
    [addr]    [Flink]  [Blink]  [Data]   [Data]
    0024f7d0  00364090 00364130 00000005 0024f820
    00364090  003640b8 0024f7d0 00000001 00000101
    [...]
```

http://blogs.msdn.com/b/doronh/archive/2006/08/09/693765.aspx


そもそもLIST_ENTRYってどういう構造よ？って場合は下の説明が良さそう。
http://www.osronline.com/article.cfm?article=499
Apacheで特定のIPの場合、BASIC認証を回避する


```hoge.conf
<Directory "/var/www/vhosts/example.com/htdocs">
    Satisfy Any

    AuthType Basic
    AuthName "Abababa"
    AuthUserFile /var/www/vhosts/.htpasswd
    Require valid-user

    Order deny,allow
    Deny from all
    Allow from 192.168.1.0/24

    AllowOverride All
    Options Indexes FollowSymLinks
</Directory>
```

SatisfyをAnyに設定することで、BASIC認証・IP制限のどちらかをパスすればOKということになる。Satisfy All にすると、両方をパスしないと駄目。

まぁ、あんまり使う機会はないと思うけど。
UnityでUnityちゃんでVuforiaでAndoridでAR出るまでのメモ

Unityちゃんを召還するアレです。

#参考
次の記事が非常に丁寧な説明がなされており
わかりやすいのでお薦めです！

【Unity】Vuforiaとユニティちゃんを使ってARアプリケーションを作る
http://taka-say.hateblo.jp/entry/2014/05/21/194605

本メモは自分用のもの（以前に何度かやったことがある）なので適当です。
ご了承下さい！

#Vuforiaに登録してSDKを借りてくる
Vuforia
https://developer.vuforia.com/
簡単にARできちゃう凄く凄いやつなので登録します。


Resouces > SDK > Unity Extention > Download Unity Extension X.X.X ほげGB　をDL 

#Unityちゃんのデータを借りてくる
Unityちゃんのウェブサイト
http://unity-chan.com/
素敵な規約で高いクオリティのデータです。お借りします。


DATA DOWNLOAD > ライセンスに同意 > 
> ユニティちゃん データ DL
> ユニティちゃんライセンス ロゴ DL

<div><img src="http://unity-chan.com/images/imageLicenseLogo.png" alt="ユニティちゃんライセンス"><p>このコンテンツは、『<a href="http://unity-chan.com/download/license.html" target="_blank">ユニティちゃんライセンス</a>』で提供されています</p></div>
 

#ARマーカをつくる
Vuforiaのサイトに移動。
ログイン > TargetManager
create Database >名前（例 UnityChan）を付けて作成.

DBが出来たら選択して、Add Target
名前を付けて、(例 UnityChanARMarker)
SIngleImageで、widthがよく分からないので256とかにして、
イメージにUnityちゃんライセンスロゴを読み込んで次へ。

ちょっと待つとマーカが出来る。
![140709-0001.png](https://qiita-image-store.s3.amazonaws.com/0/26030/a41eb9b8-a064-27dd-a6b2-7c8231dbd44e.png)

DBの場面（先の例だと名前が UnityChan)で、
マーカの画像にチェックを入れて >Download Sselected Target > Unity Editorにチェックして、名前を決めてDL

 
#Unityする

Unityを起動
New Projectで新規プロジェクトを開く。
File > new scene で シーンを保存。
プラットフォームをAndoridにスイッチ。
main cameraを削除。

VuforiaのUnity Packageをインポート。
UnityちゃんのUnity Packageをインポート。
Unityちゃん用のARマーカのPackageをインポート。

Qualcom　Augmented Realiy > Prefabs > ARcameraをシーンに入れる。
Qualcom　Augmented Realiy > Prefabs > Image Targetをシーンに入れる。


シーンからImageTargetをクリックし、アクティブにして、
インスペクターを表示。
DataSetにUnityちゃん用のARマーカをセット。
Scaleを1/1/1にして1m平方にする。

Directional light for Unitychanを設置。
インポートしたUnityChanから > Models > unitychan
でシーンに入れる。
unitychanはImageTargetに入れる。
こう。

![140709-0002.png](https://qiita-image-store.s3.amazonaws.com/0/26030/33d5295a-e0bc-5e7e-2a5d-6444b6e53726.png)

ARカメラをセットする。0/0/0から再セットすると分かりやすい。
ARカメラのInspectorのData Set Load Behaviourのとこで
２個チェックする。
こう。
![140709-0003.png](https://qiita-image-store.s3.amazonaws.com/0/26030/3a74f902-0d95-beae-a75a-ad3d3a478266.png)

で、泥で吐く。

で、自分のGmailかDriveなりに投げて、泥で落として再生。
![BsG-FrzCEAAUriU.jpg](https://qiita-image-store.s3.amazonaws.com/0/26030/459faa61-8e92-19d0-9ab2-83a9dff5d7f0.jpeg)

で、やったぜ。

MMD4Mecanimをお借りすれば、ミクさん達に踊って頂くことも出来て
凄く楽しいやつです！
http://qiita.com/hiroyuki_hon/items/931c79164b0ffe19517f
Webアプリをモバイルでもそこそこの見栄えにする


metaタグでviewportを設定する。無いとPCと同じサイズで表示しようとしてしまう。

```diff
<head>
  <title….</title>
+ <meta name="viewport" content="width=device-width" />
  <link href=".." rel="stylesheet">
  .
  .     
</head>
```

[実例](https://github.com/ongaeshi/iriguti/commit/a75c7cf9267a4cfdfd17191787c845cf58830f49)はコチラ。

参考: [これがスマートフォン向けサイトを作るときの viewport 設定３パターンだ - てっく煮ブログ](http://tech.nitoyon.com/ja/blog/2013/02/15/viewport/)
【WordPressカスタムテンプレート】投稿のslugを取得する

## 結論
投稿取得したループの中で、
`get_page(get_the_ID())->post_name;`
とすれば取得できる。

## 参考URL
[WordPress › フォーラム » ページのスラッグを取得したい](http://ja.forums.wordpress.org/topic/1652)

[テンプレートタグ/the ID - WordPress Codex 日本語版](http://wpdocs.sourceforge.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/the_ID)
RubyのソースのASTを見る方法

## 問題
[cout/ruby-internal](https://github.com/cout/ruby-internal)が新しめのrubyで動かない

## --dump=parsetree オプションを使う
https://bugs.ruby-lang.org/issues/2455 で本体にnodeをダンプするオプションが入っているので、
`ruby hoge.rb --dump=parsetree`なり`ruby -e "hoge" --dump=parsetree`なりすると見れる

## example
```rb
ruby -e "1+2+3" --dump=parsetree
###########################################################
## Do NOT use this node dump for any purpose other than  ##
## debug and research.  Compatibility is not guaranteed. ##
###########################################################

# @ NODE_SCOPE (line: 1)
# +- nd_tbl: (empty)
# +- nd_args:
# |   (null node)
# +- nd_body:
#     @ NODE_CALL (line: 1)
#     +- nd_mid: :+
#     +- nd_recv:
#     |   @ NODE_CALL (line: 1)
#     |   +- nd_mid: :+
#     |   +- nd_recv:
#     |   |   @ NODE_LIT (line: 1)
#     |   |   +- nd_lit: 1
#     |   +- nd_args:
#     |       @ NODE_ARRAY (line: 1)
#     |       +- nd_alen: 1
#     |       +- nd_head:
#     |       |   @ NODE_LIT (line: 1)
#     |       |   +- nd_lit: 2
#     |       +- nd_next:
#     |           (null node)
#     +- nd_args:
#         @ NODE_ARRAY (line: 1)
#         +- nd_alen: 1
#         +- nd_head:
#         |   @ NODE_LIT (line: 1)
#         |   +- nd_lit: 3
#         +- nd_next:
#             (null node)
```

何かの役にたつといいですね
Androidで複数端末がPCに繋がっていてもラクにadbを実行する方法


実機やエミュレータを複数繋いだ状態で、`adb install`や`adb shell`などを実行したいことがあると思います。
これを簡単に実現する方法です。

## 方法

結論からいうと、簡単なツールを使って実現します。
`adbs`という小さなツールを作りました。
[adbs](https://github.com/ksoichiro/adbs)

※drone.ioのバッジがキャッシュされているようで、赤く表示されているかもしれませんが、ちゃんと動きます。

元々シェルスクリプトで2年前位に作り、個人的に使っていましたが、golangで書き直しWindowsでも動くようにしました。

## 使い方

上記から最新バイナリをダウンロードし、PATHの通った場所に配置します。
もしくは、golangが使える環境なら下記でもOKです。

```sh
$ go get github.com/ksoichiro/adbs
```

あとは、ターミナルやコマンドプロンプトから`adb`のかわりに`adbs`を使うだけです。
複数端末が繋がっていれば、候補から選ぶように尋ねてきます。

```sh
$ adbs shell
[1] 304D19E0D41F543F
[2] 275501700028393
Device to execute command: 1
Specified: 304D19E0D41F543F
shell@android:/ $
```

シリアル番号の先頭の何文字かが分かっていれば、以下のようにパラメータで指定すると前方一致でマッチする端末を選んでくれます。

```sh
$ adbs -s 3 shell
```

端末が一つしかない場合は、普通のadbと同じように動きます。

## そもそもの問題

adbでは、複数端末が接続されていると対象端末が決定できないためにエラーを出してしまいます。

```sh
$ adb shell
error: more than one device and emulator
```

これを回避するには対象端末のシリアル番号を調べ

```sh
$ adb devices
List of devices attached
304D19E0D41F543F  device
275501700028393   device
```

表示されたシリアル番号をコピーしておいた上で、以下のように実行する必要があります。

```sh
$ adb -s 304D19E0D41F543F shell
```

一度や二度なら良いですが、APIレベルやdpiによるリソースの使い分けを調整するために何度も複数端末へインストールを繰り返したりしていると、さすがに面倒です。
これがきっかけでした。

・・・というわけで、gradleなど開発環境周りが色々充実してきた今、こういう作業をする人がいるかは分かりませんが、誰かのお役に立てば幸いです。
jQuery UI 導入と draggable を使ってみる

備忘録です．
jQuery UI の draggable を使って要素を自由に動かすインタラクションを試してみました．
今回，初めてjQuery UI を使うので導入とサンプルをまとめておきます．

# 環境

+ MacOSX (10.9)
+ jQuery UI (1.11.0)
+ jQuery (1.10.2)

# jQuery UI のダウンロード
jQuery UI は，http://jqueryui.com/ からダウンロードすることが出来ます．
この記事を書いている時点(2014/07/09)では，1.11.0 が stable 版となっているので，
これをダウンロードします．
ダウンロード時には，どの機能を含めるかカスタムすることができます．
今回は，Interactions の Draggable を含めるようにカスタムしてください．

解凍したjquery-ui-1.11.0ディレクトリにはjQuery UI の簡単なサンプルを見ることができるindex.htmlや，
/external/jqueryディレクトリにはjQuery(1.10.2)が同梱されています．

# jQuery UI を利用する
サンプルファイルを作成して，jQuery UI の利用の流れと要素を自由に動かすことのできる draggable を試していきます．
今回のサンプルはjquery-ui-1.11.0ディレクトリ直下に作成することを想定しています．
jQuery UI を利用する際には，下記の様にjquery-ui.cssやjquery-ui.jsなどを読み込む事になります．

```html:sample.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <title>jquery ui test</title>
  <meta charset="utf-8">
  <link rel="stylesheet" href="./jquery-ui.css">
  <link rel="stylesheet" href="./css/style.css">
</head>
<body>
  <div id="container">

    <div id="draggableArea">
      <div id="draggable">
        <p>draggable!</p>
      </div>
    </div>

  </div>

  <script src="./external/jquery/jquery.js"></script>
  <script src="./jquery-ui.js"></script>
  <script src="./js/drag.js"></script>
</body>
</html>
```

```css:style.css
body {
  width: 940px;
  height: 100%;
  margin: 0 auto;
  padding: 0;
}

div#draggableArea {
  width: 100%;
  height: 480px;
  border: solid 1px #000;
}

div#draggable {
  width: 25%;
  height: 25%;
  border: solid 1px #000;
}
```

```js:drag.js
$('#draggable').draggable( {
  containment: '#draggableArea',
  scroll: false,
});
```

ページの中央に大きな枠とドラッグで自由に移動ができる小さな枠ができていれば完成です．
今回はdrag.jsで，要素をdraggableにする際，オプションとして `containment: #draggableArea` 
といったように親要素を指定しています．
これを行うことによって親要素からはみ出してドラッグ出来ないようにしています．

jQuery UI を使ってフォントサイズなどを統一したものにしたい時は，
`class="ui-widget"`や`class="ui-widget-content"` などを指定してあげるといいです．
詳しくは，公式の Document もしくは1.10.0のものですが，わかりやすく日本語化してくださった神様がいらっしゃるので
こちら http://js.studio-kingdom.com/ を参照するといいと思います．

# ひとこと
miwaとカフェオレで書くスピード1.1倍増しになったと思ったらカフェインでトイレが近くなって効率0.1落ちた (完)
会社の組織と給与

　私は昨年からプログラミングを始めたのですが、振り返れば悪習慣の多さに気付かれます。プログラミングをする際に、だらだら解いている事が少なくありませんでした。気を改めて、習慣を見直す事で改善しようと思ってます！最近はあっちこっち行って、深さ優先探索や幅優先探索を練習していました！この問題は、再帰を使っているのですが、動的計画法の様に解く事が出来ませんでした。
ですが、少し形を変えれば出来るようです。

```java:
package salary2;

public class Main {
	String[] relate;
	
	int Salary(String relation) {
		int ret = 0;
		for(int r = 0; r < relation.length(); r++) {
			if(relation.charAt(r) == 'Y') {
				ret += Salary(relate[r]);
			}
		}
		if(ret == 0) {
			ret = 1;
		}
		return(ret);
	}
	
	long totalSalary(String[] relations) {
		relate = relations;
		long sum = 0;
		for(int r = 0; r < relate.length; r++) {
			sum += Salary(relations[r]);
			System.out.println(sum);
		}
		return(sum);
	}
	
	void doIt() {
		String[] relations = {
			"NYNNYN",
			"NNNNNN",
			"NNNNNN",
			"NNYNNN",
			"NNNNNN",
			"NNNYYN",
		};
		
		System.out.println(totalSalary(relations));
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new Main().doIt();
	}

}


```

今回もよろしければ、間違いや改善案等を教えてくださると嬉しいです！m（_ _）m
CakePHPでjson/jsonpなAPIをサクッと作る


## 前提

- CakePHP 2.x

CakePHPでjson/jsonpを返すAPIをさくっと作る。

```routes.php
// hoge.json なURLを有効にする
Router::parseExtensions('json');
```

```ApiController.php
<?php
App::uses('AppController', 'Controller');

class ApiController extends AppController {
	public $uses = array('Post');
	// RequestHandlerコンポーネントを使用
	public $components = array('RequestHandler');
	
	public function search() {
		$this->set(array('Posts'), $this->Post->find('all'));
		$this->set(array(
			'_serialize' => array('Posts'),
			'_jsonp' => true
		));
	}
}
```

これだけ。

- JSON版URL : http://example.com/api/search.json
- JSONP版URL : http://example.com/api/search.json?callback=hoge

?callback= のクエリパラメータを付与すれば勝手にJSONP形式にしてくれる。

## 参照

- http://book.cakephp.org/2.0/ja/views/json-and-xml-views.html
Pearのコマンドメモ

pear list-all
PEARで提供しているパッケージ(list-all)

pear -V
pearのバージョン

pear list
インストールされているパッケージ一覧

pear upgrade
パッケージのアップグレード

pear install
パッケージのインストール

pear uninstall
パッケージのアンインストール

pear list-channels
利用可能なチャネルの一覧

pear channel-discover
チャネルの登録

pear channel-delete
チャネルの削除(channel-delete)

http://www.phpbook.jp/pear/command/
CentOS6.5にdevtoolset-2を使ってgcc4.8をインストールする

devtoolsetを提供してるところはいくつかあるんだけど、people.centos.orgのがいちばんcentos用として適切っぽい感じがする。

```shell-session
wget http://people.centos.org/tru/devtools-2/devtools-2.repo -O /etc/yum.repos.d/devtools-2.repo
yum install devtoolset-2-gcc devtoolset-2-binutils devtoolset-2-gcc-c++
```

http://superuser.com/a/743163

devtoolsetでインストールしたパッケージはそのままでは変なところにインストールされていて、使えない。有効化したいときは

```shell-session
scl enable devtoolset-2 bash
```

などとして使う。
GitLab API | gitlab gem で Issueの一覧を取得する

# GitLab API | gitlab gem で Issueの一覧を取得する
## 概要
gitlab gem で Issueの一覧を取得します

## サンプル
~~~ruby
require 'gitlab'

Gitlab.configure do |config|
  config.endpoint       = 'http://some_path/api/v3' 
  config.private_token  = 'your token'
end
issues =  Gitlab.issues                            # => 全プロジェクトの Issue を取得
# issues =  Gitlab.issues 0                        # => 0を指定しても同じ
# issues =  Gitlab.issues 5                        # => プロジェクトIDで絞り込み
# issues =  Gitlab.issues 5, per_page: 100         # => プロジェクトIDで絞り込みつつ、1ページの取得件数を100件にする。(デフォルトは20件)
# issues =  Gitlab.issues 0, per_page: 100         # => 全プロジェクトの Issue を取得しつつ、1ページの取得件数を100件にする。(デフォルトは20件)
# issues =  Gitlab.issues 0, page: 2, per_page: 10 # => 全プロジェクトの Issue を取得しつつ、1ページの取得件数は10件にして2ページ目を取得する。

issue = issues[0]
puts "id = #{issue.id}"
puts "project_id = #{issue.project_id}"
puts "title = #{issue.title}"
puts "description = #{issue.description}"
puts "state = #{issue.state}"
puts "assignee.id = #{issue.assignee.id}"
puts "author.id = #{issue.author.id}"
~~~

## 出力
~~~
id = 1
project_id = 1
title = Issue Title
description = Issue Description
state = closed
assignee.id = 2
author.id = 2
~~~

## 補足
GitLab gem の APIドキュメントのサンプルコードには下記のようにある。

~~~
Gitlab.issues
Gitlab.issues(5)
Gitlab.issues(:per_page => 40)
~~~

しかし、第1引数・第2引数ともにオプショナルになっているため

~~~ruby
issues(project = nil, options = {})
~~~

第2引数のみを指定したつもりでも、第1引数として扱われるため
per_page のみを設定した設定例を試すと下記のエラーが発生する

~~~
 `issues': undefined method `to_i' for {:per_page=>40}:Hash (NoMethodError)
~~~

一度別件でプルリクを投げたのですが、的外れのものを送ってしまい、
お手間を取らせてしまったので今回は様子見してみます。

以下、検証コード

~~~ruby
require 'tbpgr_utils'

def some_method(first = nil, options = {})
  puts
  bulk_puts_eval binding, <<-EOS
first.class
first
options.class
  EOS
end

some_method
some_method(5) # => 想定通り first として扱われる
some_method(per_page: 40) # => options として扱って欲しかったが first として扱われる

__END__
下記はTbpgrUtils gemの機能
bulk_puts_eval

https://rubygems.org/gems/tbpgr_utils
https://github.com/tbpgr/tbpgr_utils
~~~

検証コード出力

~~~
first.class   # => NilClass
first         # => nil
options.class # => Hash

first.class   # => Fixnum
first         # => 5
options.class # => Hash

first.class   # => Hash
first         # => {:per_page=>40}
options.class # => Hash
[Finished in 1.0s]
~~~

## 直すなら
公開APIにつき、インターフェースは変えられない。と言う前提を元に直す場合にどう直すか？

### APIドキュメントのみを直す
無難ですね。

### シグネチャに影響を与えずに値を引数をノーマライズする

~~~ruby
# 元のコード
# def issues(project = nil, options = {})
#   if project.to_i.zero?
#     get("/issues", :query => options)
#   else
#     get("/projects/#{project}/issues", :query => options)
#   end
# end

def issues_fix(project = nil, options = {})
  # 特殊ケースのnormalize。第1引数がHashになっていたら、optionsのみを指定したものとして扱う
  if project.is_a?(Hash)
    project = nil
    options = project
  end

  if project.to_i.zero?
    get("/issues", :query => options)
  else
    get("/projects/#{project}/issues", :query => options)
  end
end
~~~

とかぐらいが選択肢だろうか？

## 参照
* GitLab gem RubyGems
https://rubygems.org/gems/gitlab

* GitLab gem GitHub
https://github.com/NARKOZ/gitlab
GitLab API | gitlab gem で Wikiを clone するためのコードを生成する

# GitLab API | gitlab gem で Wikiを clone するためのコードを生成する
## 概要
gitlab gem で Wikiを clone するためのコードを生成します。

GitLabでは、例えば some_group グループの some_project プロジェクトがあった場合に、
以下のようなリポジトリに wiki が保存されます。

~~~
git@some_ip:some_group/some_project.wiki.git
~~~

それを前提に、GitLabに登録されている全てのプロジェクトの Wiki を clone するための
git のコードを生成してみます。

## サンプル

~~~ruby
require 'gitlab'

Gitlab.configure do |config|
  config.endpoint       = 'http://some_path/api/v3' 
  config.private_token  = 'your token'
end
projects =  Gitlab.projects # デフォルトは20件取得なので20以上のプロジェクトがある場合はページ設定の変更や、ページング処理が必要

projects.each do |project|
  wiki_git_repo = project.ssh_url_to_repo.gsub(/\.git/, '.wiki.git')
  puts "git clone #{wiki_git_repo}"
end
~~~

## 出力例
~~~
git clone git@some_ip:some_group/some_project1.wiki.git
git clone git@some_ip:some_group/some_project2.wiki.git
git clone git@some_ip:some_group/some_project3.wiki.git
git clone git@some_ip:some_group/some_project4.wiki.git
git clone git@some_ip:some_group/some_project5.wiki.git
git clone git@some_ip:some_group/some_project6.wiki.git
git clone git@some_ip:some_group/some_project7.wiki.git
git clone git@some_ip:some_group/some_project8.wiki.git
git clone git@some_ip:some_group/some_project9.wiki.git
git clone git@some_ip:some_group/some_project10.wiki.git
~~~

## 参照
* GitLab gem RubyGems
https://rubygems.org/gems/gitlab

* GitLab gem GitHub
https://github.com/NARKOZ/gitlab
GitLab API | gitlab gem で プロジェクトのURL、リポジトリのURLの取得

# GitLab API | gitlab gem で プロジェクトのURL、リポジトリのURLの取得
## 概要
gitlab gem で プロジェクトのURL、リポジトリのURLの取得

## サンプル
~~~ruby
require 'pp'
require 'gitlab'

Gitlab.configure do |config|
  config.endpoint       = 'http://some_path/api/v3' 
  config.private_token  = 'your token'
end
projects =  Gitlab.projects

pp projects.first.ssh_url_to_repo
pp projects.first.http_url_to_repo
pp projects.first.web_url
~~~

## 出力
~~~
"git@some_ip:some_group/some_project_name.git"
"http://some_ip/some_group/some_project_name.git"
"http://some_ip/some_group/some_project_name"
~~~

## 参照
* GitLab gem RubyGems
https://rubygems.org/gems/gitlab

* GitLab gem GitHub
https://github.com/NARKOZ/gitlab
GitLab API | gitlab gem で 新規プロジェクトの作成 

# GitLab API | gitlab gem で 新規プロジェクトの作成 
## 概要
gitlab gem で 新規プロジェクトの作成 

## サンプル
~~~ruby
require 'gitlab'

Gitlab.configure do |config|
  config.endpoint       = 'http://some_path/api/v3' 
  config.private_token  = 'your token'
end
puts Gitlab.projects.size # => この段階では 0
Gitlab.create_project('some_project', :description => 'some_project desc', :public => 'false')
puts Gitlab.projects.size # => この段階では 1
~~~

## 出力
~~~
0
1
~~~

## 参照
* GitLab gem RubyGems
https://rubygems.org/gems/gitlab

* GitLab gem GitHub
https://github.com/NARKOZ/gitlab
GitLab API | gitlab gem で プロジェクトの一覧を取得する

# GitLab API | gitlab gem で プロジェクトの一覧を取得する
## 概要
gitlab gem で プロジェクトの一覧を取得します

## サンプル
~~~ruby
require 'gitlab'

Gitlab.configure do |config|
  config.endpoint       = 'http://some_path/api/v3' 
  config.private_token  = 'your token'
end
projects =  Gitlab.projects

puts projects.first.id
puts projects.first.name
puts projects.first.description
puts projects.first.public
~~~

## 出力
~~~
10
some_project
some_project description
false
~~~

## 参照
* GitLab gem RubyGems
https://rubygems.org/gems/gitlab

* GitLab gem GitHub
https://github.com/NARKOZ/gitlab
Webnotificationsで通知領域を表示する時間を設定する。

#Webnotificationsでの通知設定

Webnotificationsを使えば、何かイベントが発生したときに、通知領域にメッセージを表示させる事ができる。
Socketo.ioと合わせて使うと、Webアプリでイベントが発生した事をすぐにユーザに通知する事ができる。
例えば、以下のような感じで。

```js
            socket.on('get_msg', function(data){
                notification = new window.Notification(data.name,{
                    body: data.msg
                });
            });

```
この記述では、socket.ioでget_msgを受信した時に、通知領域に受け取ったdata.nameとdata,msgを表示する用になる。
ただ、このままだと表示された通知が５秒くらいで、自動で消えてしまった。(safari7とFirefox30で確認）
setTimeoutを使えば通知を表示する期間を調整できるみたいなので、１秒後に通知が消えるように修正すると以下のようになる。

```js
            socket.on('get_msg', function(data){
                notification = new window.Notification(data.name,{
                    body: data.msg
                });
                setTimeout(function(){
                  notification.cancel();
                },1000);
            });

```

setTimeoutの１つ目の引数で実行する処理を記述する。今回は通知を閉じる処理を記述した。２つ目の引数で実行するまでの待ち時間をmsで記述する。
この記述だと、1000ms後（１秒後）に通知を閉じる処理が走る。
実行してみたところ、Safari7では１秒後に通知が消えたが、Firefox30では、setTimeoutを指定していないのと同じ時間が経過後に、通知が消えた。
また、待ち時間を5000ms（５秒）以上の値にしても、通知の表示時間が延びる事は無かった。

ここにも記載があるが、そもそも通知をブラウザが自動で閉じるのは、Webnotificationsの仕様に従ってないようで。。。
https://developer.mozilla.org/ja/docs/WebAPI/Using_Web_Notifications

便利な機能だけど、まだまだブラウザによって実装がまちまちな感じ。
RuboCop | Style/Next

# RuboCop | Style/Next

## 概要

RuboCopの「Style/Next」警告について。

eachなどを利用した際に、next を利用すべき個所に対して警告を出す。

### 設定値一覧

|設定対象|設定値|内容|デフォルト|
|:-----|:---|:---|:---:|
|EnforcedStyle|skip_modifier_ifs|if-endを対象とする|○|
|EnforcedStyle|always|if-end, 後置のif ともに対象とする|--|

### 対象メソッド

~~~ruby
[:collect, :detect, :downto, :each, :find, :find_all,
:inject, :loop, :map!, :map, :reduce, :reverse_each,
:select, :times, :upto]
~~~

## Next

各設定値での検証結果をまとめます。

### 検証プログラム

next.rb

~~~ruby
[*1..5].each do |i|
  if i == 3
    puts i
  end
end

[*1..5].each do |i|
  puts i if i == 3
end
~~~

### 実行結果 デフォルト の場合

.rubocop.yml

~~~yaml
IfUnlessModifier:
  Enabled: false

Next:
  EnforcedStyle: skip_modifier_ifs
~~~

~~~bash
$ rubocop next.rb
Inspecting 1 file
C

Offenses:

next.rb:1:9: C: Use next to skip iteration.
[*1..5].each do |i|
        ^^^^

1 file inspected, 1 offense detected
~~~

### 実行結果 always に設定します

.rubocop.yml

~~~yaml
IfUnlessModifier:
  Enabled: false

Next:
  EnforcedStyle: always
~~~

~~~bash
$ rubocop next.rb
Inspecting 1 file
C

Offenses:

next.rb:1:9: C: Use next to skip iteration.
[*1..5].each do |i|
        ^^^^
next.rb:7:9: C: Use next to skip iteration.
[*1..5].each do |i|
        ^^^^

1 file inspected, 2 offenses detected
~~~

## RuboCopまとめ記事

http://qiita.com/tbpgr/items/edbfecb6a6789dd54f47
AWS EC2にPHP5.5環境でCakePHPを導入



インスタンスの立ち上げから、SSH等の初期設定は済んでいる前提。


#PHP5.5インストール

```
$ sudo yum install php55 httpd24
```

PHP5.5をインストールする時にはhttpdもバージョン指定(2.4)が必須。
※PHP5.4インストール時にもhttpdは2.4指定が必須。

```
$ sudo yum install php55 httpd
```

では、コンフリクトが発生しインストールがうまく行かない。


##バージョン確認
```
$ php -v
PHP 5.5.13 (cli) (built: Jun 10 2014 23:40:19) 
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
```


####PHP5.5 拡張対応表
|php|php55|
|-----------|------------|
|php-mbstring|php55-mbstring|
|php-pdo|php55-pdo|
|php-mysql|php55-mysqlnd|
|php-pecl-apc|php55-opcache
|php-pecl-xdebug| php55-pecl-xdebug|


##Apache起動確認

```
sudo service httpd start
sudo chkconfig httpd on
```

「http://[Public IP] or [Public DNS]」
にアクセスして、この画面が表示されれば、OK
![スクリーンショット 2014-07-02 1.34.24.png](https://qiita-image-store.s3.amazonaws.com/644/38060/2cf550d2-03f9-80c3-5dfc-c2a871a404d9.png "スクリーンショット 2014-07-02 1.34.24.png")


#CakePHP導入

CakePHPはサイトからパッケージをダウンロードする。
解凍したフォルダ名を「cakephp」に変更し、
AWS上の「/var/www/html/」にアップロードする。

```
/var/www/html/cakephp
```



##httpd.confとphp.ini設定

一応、設定ファイルのバックアップをとっておく。

```
$ cd
$ sudo mkdir backup
$ cp /etc/httpd/conf/httpd.conf ./backup
$ cp /etc/php.ini ./backup
```

####httpd.conf
1.DirectoryIndexにindex.phpを追加。
2.LoadModule rewrite_module modules/mod_rewrite.soの行に#がついていないか確認。
3.末尾に

```
<Directory "var/www/html/cakephp">
    AllowOverride All
</Directory>
```
を追加。


####php.ini

```
default_charset = "UTF-8"

mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input = pass
mbstring.http_output = pass
mbstring.encoding_translation=off
mbstring.detect_order=auto

date.timezone = Asia/Tokyo
```

##Apache HTTP Serverを再起動

```
sudo service httpd restart
```

##tmpフォルダのパーミッション変更

```
sudo chmod -R 777 /var/www/html/cakephp/app/tmp
```


以上で、「http://[Public IP] or [Public DNS]/cakephp」
にアクセスすると、CakePHPの画面が表示される。


CakePHPの初期設定はまた、別記事で。
Animatorで再生中のAnimationClipのTotal再生時間を取得する

Animatorで再生中のAnimationClipのTotal再生時間（Duration？）がどうしても知りたいケースがあったのですが、AnimatorStateInfoのLengthがそれでした。

```csharp
AnimatorStateInfo currentState = animator.GetCurrentAnimatorStateInfo (0);
float duration = currentState.length;
```

※MonoBehaviorのvoid Start()内で取得したところ0になってしまったので注意。
AssetBundle と TextureCompression メモ

[AssetBundle と TextureCompression のおはなし](http://www.slideshare.net/monry84/assetbundle-texturecompression)

上記スライドより抜粋

# AssetBundle

* サーバからは Content-Type: application/vnd.unity を返却する
* Atlas / Texture / AudioClip を個別にビルド
* 1画面内最大10個を目安に
* 初回DLするファイルの一覧はアプリ内に .txt (TSVなTextAsset)で保持
* ダウンロードは WWW.LoadFromCacheOrDownload に任せる
* ファイル名 => プラットフォーム名/種別@シーン名@画面名@ファイル名.unity3d
** プラットフォーム名は iOS, Android, Editor など
** 種別は Atlas, AudioClip, Texture など
* WWWのタイムアウト処理は自前で実装必要

# Texture Compression

* iOS は PowerVR(PVR)にしとけばだいたいOK ?
** RGBA Compressed PVRTC 4 bits オススメ
** こだわる箇所は実機で確認して調整
* Androidは... ATC が良い?

※ テクスチャ関係はいろいろ調査が必要そう...
enthumble（キーカスタマイズ例）英語キーボードvim使い

vimで使うことを意識してカスタマイズしています。
工夫したところはvim上でエンターキーを押した時に行末にセミコロンを付けて改行するところでしょうか？

[HowToUse]
Check=http://www.enthumble.com/keylist
Name=enthumble version 2.8
[KEY]
Space={Escape}
Muhenkan={vk1Dsc07B}
Henkan={vk1Csc079}
Hiragana={}
F1={}
F2={}
F3={}
F4={}
F5={}
F6={}
F7={}
F8={}
F9={}
F10={Volume_Mute}
F11={Volume_Down}{Volume_Down}
F12={Volume_Up}{Volume_Up}
F23={}
F24={}
1={F1}
2={F2}
3={F3}
4={F4}
5={F5}
6={F6}
7={F7}
8={F8}
9={F9}
0={F10}
-={F11}
Hat={F12}
\={}
Q={1}
W={2}
E={3}
R={4}
T={5}
Y={6}
U={7}
I={8}
O={9}
P={0}
@={}
LB={}
A={Escape}{g}{g}{V}{G}{Enter}
S={Escape}{:}{w}{Enter}
D=^d
F=^f
G={}
H={left}
J={down}
K={up}
L={right}
Semicolon={i}
:={Enter}
RB={}
Z=^z
X={ctrl down}{Delete}{ctrl up}
C={ctrl down}{Insert}{ctrl up}
V={shift down}{Insert}{shift up}
B={Bacspace}
N={*}
M={-}
,={=}
.={+}
/={}
Backslash={}
Up={}
Down={}
Left={}
Right={}
LButton={ctrl down}{PgUp}{ctrl up}
MButton={MButton}
RButton={ctrl down}{PgDn}{ctrl up}
WheelUp={}
UWheeDown={}
PageUp={}
PageDown={}
Home={}
End={}
Delete={}
Backspace={Delete}
Enter={Escape}{shift down}{a}{shift up}{;}{Enter}
Escape={Escape}{shift down}{:}{shift up}
Hankaku={}
Tab={}
Capslock={}
Lwin={}
Rwin={}
Insert={}
GitHubでPull RequestしたbranchをWebページ上でmergeして、そのmergeしたmasterを`git svn dcommit`したらエラー吐いた


# 概要

表題の通りです。

## 前提

git-svnで“GitHubにあるGitリポジトリ”と“svnリポジトリ”並行運用している状態です。

- 定期的に`git svn fetch`してる
  - fetchして落ちてきたcommitをmasterにmerge(fast-forward)してる
- masterにmergeしてpushする際には、svnサーバーにもcommitをしてる

# 原因っぽいやつ

`git svn dcommit`の処理時にcommit logの編集ができないっぽくてエラー吐いてた
（[`Error setting property 'log'`](https://www.google.co.jp/search?q=%22Error+setting+property+%27log%27%22)で調べたらちょこちょこヒットした）

```bash
git svn dcommit 
#=> Committing to <svn-repo-url> ...
#=> 
#=> ERROR from SVN:
#=> Failed to execute WebDAV PROPPATCH: At least one property change failed; #=> repository is unchanged: Error setting property 'log': 
#=> Could not execute PROPPATCH.
```

## コミットログの編集ができないのは何故？

- コミットログの内容の問題かもしれない
  - リッチテキストが含まれてるとダメ...？
  - [“smart quotes”が含まれてるとダメ...？](http://stackoverflow.com/a/11086642)
- コミットログの編集権限がない？
  - git-svn運用できてるなら問題ない気がする...

# どうしよう...

とりあえず、手元で

- `git merge`して
- `git svn dcommit`して
- `git push origin master`

する分には特に影響が出ないはず。

なので、しばらくは手元でmergeするようにします...

# 参考

- [SVN: Error setting property 'log': Could not execute PROPPATCH - Stack Overflow](http://stackoverflow.com/questions/11086570/svn-error-setting-property-log-could-not-execute-proppatch)
- [SE奮闘記: [Subversion]過去Logを編集しようとしたらError](http://se-suganuma.blogspot.jp/2011/06/subversionlogerror.html)
jQueryで「Uncaught Error: Syntax error, unrecognized expression: [name=]」というエラーが出たら

```js
$('input[name='text']');
```

のような内側外側の引用符が同じことが原因。
jQueryの仕様が変わって、エラーが出るようになったみたい。

修正の方法：
[【jQuery】引用符とエスケープを覚える - Qiita](http://qiita.com/ituki_b/items/434f46929a49cc017428)