OmniAICreator/Qiita-1.07M huggingface dataset:
どんなに優秀なプログラマでも死者を生き返らせることを強いられることがある


## 死者の定義
ここでは、現実におけるプログラマが日常的に出会う死者、即ちレガシィシステムを死者と定義する

## 死者を蘇らせて欲しい人々
悲しいかな、世の中には死者の復活を願う人が数多く居る。
それも、主に極一部の人々で、それら死者が復活したとしても誰も喜ばない。むしろ、苦労と血反吐と狂気しか生み出さないにも関わらずだ。
なぜ、彼らはそこまで死者に復活して欲しいのだろうか。
端的に言えば、変化をしたくないからである。
死者を愛する人々は日常的に定例作業を愛する人たちである。
常に同じことを同じ時間同じように行えるのが幸せな種族なのである。
一方、死者を憎む種族（即ちプログラマ）は、常に異なること、（出来るならば）あらゆる時間帯に、（出来るならば）あらゆる事柄を行いたい種族である。

## 違う物を交換する
古き良きを愛する人々のほうには力（主に金）があり、新しく更に良い物を愛する人々の方には知識（技術力）がある。
そうして、両者がお互いに無いものを得ようとする時、交渉が生じ、結果として力と知恵の交換が行われる。

## そこに起きる悲劇
知恵が欲しい力ある者たちは、ネット上などに掲載されている情報を鵜呑みにし、非常に簡単に自分の願望が叶えられると信じこまされる。
それは盲信に近いものだが、彼らにとってはそれは真実なのである。
（或いは事実に脳内変換される）
知識がある人々にとって、非現実の事がらが、知識がない人々にとっては現実の事柄になるのである。
これは、悲劇としか言いようがない。

## 救世主（メシア）の登場
いつでも、どの時代でも人々は救世主を求める。そう、スーパーエンジニアの登場だ。
どの会社にも一人や二人くらいスーパーエンジニアが存在する。略してSEだ。
彼らはあらゆるプロジェクトに突っ込まれ、神業の如き知識と知恵を振り絞って多くの問題を解決していく。
時にはノンプログラミングな方法での解決法すら提示することがある。
そして、必要があれば、死者をレガシィシステムを復活させる（或いは延命させる）
まさに、メシアなのである。
そのメシアたち（敢えて複数形）は常に思っている。
死者を蘇らせたくは無かったと。
レガシィシステムは、既にその役割を終えて、良き眠りについている時代にも関わらず、変化を望まない人々はレガシィシステムを限界を越えて扱おうとする。
それは、古き良きを愛する人々のエゴであり、そのエゴをゴリ押す為の力（資金力）なのである。
知恵ある種族は血反吐を吐きながらその力に従わざるを得ない時がある。
何故ならば、自分たちには力（主に金）が無いからだ。

## 歴史は繰り返す
とはいえ、そのような血反吐話は日常茶飯事の事だし、今までみんなやってきたし、これからも行い続けるのだろう。
SE（Super Engineer)は、いつまでも戦い続ける。
毎年多くのSE（System Engineer)を犠牲にして、数匹のSE(Super Engineer)が生まれている。
これは、力と知恵が微妙な釣り合いを保っているIT業界における日常の神話、いや、人話である。
remoteのブランチが更新されない時に

作業していると `git fetch`してもremoteのbranch情報が更新されない時が時々ある｡

自分の場合は､本来は削除されているbranchにも関わらず表示されているということが特に多い｡

そんな時に下記のcommandを実行すると問題なく更新される｡

`git remote prune origin`

別にremoteのbranch更新されなくても問題ないじゃん！ 
って言われるかもしれないけど､branchが整理されてるほうが補完とかもいい感じになるので､自分の場合は結構こまめに実行している｡
ShellTipsに便乗してみる

おもいつくままに書いてみる

* [個人的なShellTipsをまとめてみた - UNIX的なアレ](http://wadap.hatenablog.com/entry/2014/04/21/095549)
* [naoya_itoの火を噴いたシェルtips - Togetterまとめ](http://togetter.com/li/652438)


>
>シェルでパスワード入力プロンプトでるじゃないですか。途中まで打って間違えたとするじゃないですか。Ctrl + u 打つとリセットできるの知ってた? 俺は知ってた

Ctrl + [BackSpace]で一文字（見えないケド）消せる。

>cd -
>で前のディレクトリに戻る


```bash
$ mkdir tmp
$ cd !$
```
で作成したディレクトリに移動する（!$は一つ前のコマンドの最後の引数）
　
wc -l より grep -c "" のが早い。

　
あんまり思いつかなかった・・・
PhoneGapで実機にビルドすると " "_OBJC_CLASS_$_CDVWebViewDelegate" のエラーが出る。


## 問題
Cordova(PhoneGap)で作ったアプリを実機でビルドしようとすると、動かなかった。シミュレータでは起動していたのに…。

ログを見ると、

```bash:

...

 "_OBJC_CLASS_$_CDVWebViewDelegate", referenced from:
      objc-class-ref in CDVInAppBrowser.o
  "_OBJC_METACLASS_$_CDVViewController", referenced from:
      _OBJC_METACLASS_$_MainViewController in MainViewController.o
  "_OBJC_CLASS_$_CDVPlugin", referenced from:
      _OBJC_CLASS_$_CDVDevice in CDVDevice.o
      _OBJC_CLASS_$_CDVConnection in CDVConnection.o
      _OBJC_CLASS_$_LowLatencyAudio in LowLatencyAudio.o
      _OBJC_CLASS_$_CDVLogger in CDVLogger.o
      _OBJC_CLASS_$_CDVInAppBrowser in CDVInAppBrowser.o
      _OBJC_CLASS_$_InAppPurchase in InAppPurchase.o
  "_OBJC_METACLASS_$_CDVPlugin", referenced from:
      _OBJC_METACLASS_$_CDVDevice in CDVDev

...
```

みたいなのがズラーッと出た。



## 解決
http://stackoverflow.com/a/22497592 この回答の通りに行った。

1. 対象のプロジェクトの``Targets``の中にある``Build Settings``に移動

2. ``Valid Architectures``の中身を確認。

3. ``armv64``の記述を削除

4. ``armv7``と``armv7s``の2つが残っているのを確認。

5. その後ビルドし直すと解決する。


どうもXcodeのアップデートで、``arm64``というアーキテクチャがアップデートされていないのが問題らしい。

## 参考

[ios - xcode 5 and phonegap: linker errors on building for device but not for simulator - Stack Overflow](http://stackoverflow.com/questions/22494615/xcode-5-and-phonegap-linker-errors-on-building-for-device-but-not-for-simulator)
Jenkins で git flow スタイルの branch 名指定

Jenkins で git flow スタイルの branch 名を指定する場合は feature/hogehoge ではなく origin/feature/hogehoge でなければうまくいかない。develop とかは origin つけなくても大丈夫だけど。


<blockquote class="twitter-tweet" lang="en"><p>Jenkins で git flow スタイルの branch 名を指定する場合は feature/hogehoge ではなく origin/feature/hogehoge でなければうまくいかない。develop とかは origin つけなくても大丈夫だけど。</p>&mdash; Kazuhiro Sera (@seratch_ja) <a href="https://twitter.com/seratch_ja/statuses/311667659035009025">March 13, 2013</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
VMware の hgfs で "DocumentRoot must be a directory" の解決方法



## 結論

SELinux を無効化する!

## やり方

```
# vi /etc/selinux/config
```

で以下のように編集する

```
SELINUX=disabled
```


## 検索用語

VMware, ファイル共有, Player, httpd.conf, Apache, /mnt/hgfs
dmdでのビルド時pragma(lib, "dl");を書いたのにdlopen等がunresolved

derelict使用時にハマったのでメモ。
間違いやD言語の作法に則っていないところなどあれば指摘してもらえると嬉しいです。

# 現象

derelict3を使用したコードをビルドした際、コードに`pragma(lib, "dl");`を書いたのにdlopen等が無いと言われた。

```
dmd -ofmatrix_sample -I/home/maueki/work/Derelict3/import/ -L-L/home/maueki/work/Derelict3/lib/dmd matrix_sample.d
/home/maueki/work/Derelict3/lib/dmd/libDerelictUtil.a(loader_1_5c5.o): 関数 `_D8derelict4util6loader15SharedLibLoader6unloadMFZv' 内:
../import/derelict/util/loader.d:(.text._D8derelict4util6loader15SharedLibLoader6unloadMFZv+0x1f): `dlclose' に対する定義されていない参照です
(中略)
collect2: error: ld returned 1 exit status
--- errorlevel 1
```

# 修正
以下がリンクエラーとなった際のコードの一部。

```d:matrix_sample.d
pragma(lib, "dl");
pragma(lib, "DerelictGL3");
pragma(lib, "DerelictGLFW3");
pragma(lib, "DerelictUtil");
pragma(lib, "DerelictIL");
```

`pragma(lib, "dl");`を頭に書いてたのがダメだった。以下が正しいコード。

```d:matrix_sample.d
pragma(lib, "DerelictGL3");
pragma(lib, "DerelictGLFW3");
pragma(lib, "DerelictUtil");
pragma(lib, "DerelictIL");
pragma(lib, "dl");
```

# 理由

間違ったコードをコンパイルする際、dmdをverbose(-v)で動かすと以下出力が見られる。

```
gcc matrix_sample.o -o matrix_sample -m64 -L/home/maueki/work/Derelict3/lib/dmd -L/usr/lib/x86_64-linux-gnu -Xlinker --export-dynamic -ldl -lDerelictGL3 -lDerelictGLFW3 -lDerelictUtil -lDerelictIL -l:libphobos2.a -lpthread -lm -lrt
```

gccにリンクをお願いしているわけだが、ライブラリはコードに記載した順序で並んでいる。つまり`-ldl`が一番最初に書かれている。

この順序が実は重要で`-ldl`が最初に来てしまうとその時点では参照されていないdlopen等のシンボルが消されてしまい、後になってDerelictUtil等から使用されているdlopen等のシンボルを探しても見つからずにエラーとなってしまう。


## 疑問
上記gccのオプションに`-Xlinker --export-dynamic`があるけど、これはあくまで、動的シンボルテーブルに全シンボルを追加するだけで、静的解決についてはこのオプションは関係ないのだろうか。
GRUBのメニュー画面がタイムアウトしない件への対応


Ubuntu12.04を使っていてそういうことがありました。

## 現象

タイムアウトしない設定をしているわけでもないのに、Ubuntuの起動時のGRUBメニューでカウントダウンしないし、いくら放置しても先に進まない。

## 原因

調べてみたところ、前回のシャットダウン時にエラーが発生したのでGRUBで記録されており、その際はGRUBの設定に関わらずGRUBメニューはタイムアウトなしでGRUBのメニュー画面が表示される模様。


## どう対処するか

このとき、以下のコマンドを実行することでGRUBの設定を見ることができる

```
$ grub-editenv list
```

このコマンドに対して、以下の設定がリストされる場合、次回起動時はカウントダウンなしGRUBメニューを表示する

```
recordfail=1
```

対処としては、recordfail=1が記録される理由を特定し、対策を打った上で以下のコマンドを実行してrecordfailの値を元に戻す。

```
$ sudo grub-editenv - set recordfail=0
```

原因がよくわかんないけどとにかくrecordfailを設定させたくない場合はrecordfailの項目自体を消す。

```
$ sudo grub-editenv - unset recordfail
```
CodeIgniterでURLの情報を取得


##CodeIgniterでURL情報を取得する便利メソッド

```method名取得
$this->router->fetch_method();
```

```class名取得
$this->router->fetch_class();
```

CodeIgniterの開発で以下のようなURLのページにアクセスした場合
http://hogeho.com/main/top


mainクラスの中のtopメソッドにアクセスしていることになる。


```class名取得
echo $this->router->fetch_class();
#結果: main
```

```method名取得
echo $this->router->fetch_method();

#結果: top
```
herokuで静的ファイルをgzip圧縮して配信する

## 結論

どちらか好きな方読め。

[heroku-deflater | github](https://github.com/romanbsd/heroku-deflater)

[heroku_rails_deflate | github](https://github.com/mattolson/heroku_rails_deflate)

読んだら好きな方の gem を入れろ。

-糸冬-

## 追加でやった方が良いこと

heroku がオリジンサーバの場合、assets 内のリソースファイルのリクエストは可能な限り減らしたいところです。
そのためにブラウザのキャッシュを利用しましょう。
こちらも参照してみてください。
[herokuでブラウザのキャッシュを利用する | Qiita](http://qiita.com/Oakbow/items/cfa7e7ddc66e50f7ede6)

## 周辺事情

Web サービスがブラウザに返却するリソースは、HTML、CSS、JS、そして画像ファイルが大勢を占めます。
HTML,CSS,JS はご存知のようにテキストデータで、こいつを圧縮して送信できるとレスポンスタイムを削減することが出来ます。
heroku のようにサーバが遠い場合は特にその恩恵にあずかることが出来ます。

asset_sync を使ってる場合、この gem の機能で asset なファイルの gzip 圧縮をやってくれるので、これですましている方も多いと思います。
しかし heroku をオリジンサーバにして S3 を経由せずに直に CloudFront を使う場合（[参考：heroku+CloudFrontで静的ファイルを配信する（Webフォント対応） | Qiita](http://qiita.com/Oakbow/items/9ceb93d47d918aeafe3a)）や、rails 本体が返す HTML の圧縮までやるとなると、最初に挙げた gem を使う必要が出てきます。
厳密に言うとどちらも Rack::Deflate という gem を利用しているのですが、このベースとなる gem は普通に使うと画像なども gzip 圧縮してしまうため、より使い勝手を向上させ、gem の導入以外の手間を省くことも目的としているようです。
実際、これらの gem を使用しない場合は、下記のブログに解説されているような対応が必要になってきます。
[herokuでMIME type別にgzip圧縮する方法 | satooshi@blog](http://blog.satooshi.jp/blog/2013/02/19/conditional-gzip-compression-based-on-mime-type-on-heroku/)
heroku の仕様も含めて分かりやすく解説されているので、一読することをお勧めします。

以前は Rack::Deflate とこのブログで紹介されている [gist](https://gist.github.com/guyboltonking/2152663) を組み合わせる必要があった訳ですが、それがオールインワンになった感じでしょうか。
[Job-Hub](https://jobhub.jp) では [heroku-deflater](https://github.com/romanbsd/heroku-deflater) を使用しています(heroku_rails_deflateの方は未確認)。
単に gzip 圧縮を利用する目的であれば、gem の追加だけですみます。

```rb:Gemfile
group :staging, :production do
  gem 'heroku-deflater'
end
```

環境によると思いますが、[Job-Hub](https://jobhub.jp)では 1ページの容量と応答時間が最大で2割くらい減ってます。
あと、Chrome の Pagespeed や FireFox の FireBug の YSlow で警告が減るのが地味に嬉しいです。

ところでこれらの gem、名前も説明も heroku で使うこと前提ですが、heroku 以外では使えないんですかね？
まあ普通は Apache や nginx などを設置してリバースプロキシとしてリクエストを処理させるので、gzip 圧縮はそっちでやるとは思いますけれど。
herokuでブラウザのキャッシュを利用する

## 結論

```rb:production.rb
  config.serve_static_assets = true
  config.static_cache_control = "public, max-age=604800"
  config.assets.compress = true
  config.assets.compile = true
  config.assets.digest = true
```

staging.rb も同様の設定に。

## 蛇足
[Job-Hub](https://jobhub.jp) ではキャッシュの保持期間は7日間にしていますが、もっと長くてもいいかも。
サンプルでは一年間（31536000）とかもよく見かけます。
`config.assets.digest = true` になっていれば assets なファイルには asset pipeline により常に MD5 な文字列が付加されるので、「キャッシュのせいで更新したはずのファイルが古いまま」ってのが原理的に起きないからですね。
逆に言うと、ブラウザのキャッシュを使用する場合はこの設定は事実上必須とも言えます。
この機能を無効にする人はあまりいないとは思いますが。

あと、そもそもこの設定は assets なファイルのオリジンサーバが rails 本体の場合のみ意味を持ちます。
heroku でホストしてたら heroku がオリジンサーバ。
asset_sync を使って S3 に assets なファイルを流している場合、S3 がオリジンサーバなので、この設定は意味がありません（やっても害はないと思うけど）。
この記事の内容はタイトルと異なり heroku 限定ではないのですが、IaaS なりを使っているならそもそも Apache や nginx などのリバースプロキシがいるのが一般的だと思うので、そちらで対処するようにした方が良いと思います。

## CDNを使っている場合
CloudFront のような CDN を使用する場合、キャッシュの保持期間は CDN 側で TTL 設定を行うか、オリジンサーバのキャッシュコントロールヘッダに従うかの二択になっていることが多いと思います。
TTL で対応しても別にいいとは思うんですが、本番とステージング環境みたいに数が増えると CDN 側で設定はあまりやりたくないなーというのが正直なところです。
単にめんどくさいってだけの話ですが。

***

ちなみに CloudFront のキャッシュ時間が設定値によりどう変わるかは、以下のページが参考になります。
[CloudFrontのキャッシュ時間(TTL)はどの程度なのか](http://dev.classmethod.jp/cloud/aws/cloudfront-ttl/)
Mac OSX10.9 で pillow をインストールする


自分のMacにPythonの画像ライブラリであるpillowをインストールしようしましたが下記エラーが出てうまくいってくれませんでした。


``` Terminal
clang: error: unknown argument: '-mno-fused-madd' [-Wunused-command-line-argument-hard-error-in-future]

clang: note: this will be a hard error (cannot be downgraded to a warning) in the future

error: command 'cc' failed with exit status 1
```

Googlingすると、どうやらOSX10.9では同様のエラーが出てる人が多いみたいです。

とりあえず自分はここをみて解決したので早急にメモ。
http://stackoverflow.com/questions/22334776/installing-pillow-pil-on-mavericks

打ち込んだコマンド↓

``` Terminal
sudo bash
export CFLAGS=-Qunused-arguments
export CPPFLAGS=-Qunused-arguments
pip install pillow
```

よくわかりませんが何やら２つぐらいパスを通したらうまくいきました。
AppCodeショートカットまとめ

自分のメモ帳も兼ねてます。
自分だけで共有するよりはQiitaに書いておこうかってだけなので、見づらいのは容赦して下さい。

### 検索系

|ショートカットキー| 動作|
|:-:|:-:|
|⌘+O|クラス検索|
|⌘+⇧+O|ファイル検索|
|⌘+B|定義位置へ移動（^+クリック)|
|⌘+E|最近使ったファイル|

### デバッグ・実行系

|ショートカットキー| 動作|
|:-:|:-:|
|^+R|実行|
|^+D|デバッグ実行|
|⌘+F2|停止|
|⌘+F8|ブレークポイント切替|
|⌘+P|メソッド引数情報|
|⌘+N|コード生成メニュー表示|
|⌘+1~7|ウィンドウ切替|

### コード補完・エディタ系

|ショートカットキー| 動作|
|:-:|:-:|
|^+I|実装Delegate|
|^+O|Override|
|^+⇧+↩|補完フィルター表示|
|⌥+↩|QuickFix|
|^+↑↓|メソッドジャンプ|
|^+←→|タブ移動|
|⌘+^+↑|.h⇔.m|
|⌘+⇧+↑↓|選択行移動|
|⌘+D|選択行コピー|
|⌘+X|選択行削除|

### リファクタリング系

|ショートカットキー| 動作|
|:-:|:-:|
|⌘+⌥+V|変数抽出|
|⌘+⌥+C|定数抽出|
|⌘+⌥+P|引数抽出|
|⌘+⌥+E|プロパティ抽出|
|⌘+⌥+I|一時変数抽出|
|⌘+⌥+M|メソッド抽出|
|⌘+⌥+F|Define抽出|
|⌘+⌥+K|Typedef抽出|
|⌘+⌥+L|Reformat|

### Property

|||
|:-:|:-:|
|nonatomic|デフォルト|
|strong,assign|デフォルト|
|weak|delegateなど|
|copy|Mutableがある場合,block|
|readonly|.h|
|readwrite|.hに書いた場合.mに|
ユニコード文字列のリストの出力


リストだとstr関数使おうとするので、
要素に対してprintするか、printするunicode型にformatで代入する。
要素の数が多くなると面倒だな・・・。

参考にしたサイト：
[PythonのUnicodeEncodeErrorを知る](http://lab.hde.co.jp/2008/08/pythonunicodeencodeerror.html)


```python
# -*- coding:utf-8 -*-
# 上記サイトででてくるデフォルト値を確認。
import sys, codecs
#なぜか次の行のやつが通らないことがある。versionの問題かな？#sys.stdout = codecs.EncodedFile(sys.stdout, 'utf_8')
sys.stdout = codecs.lookup(u'utf_8')[-1](sys.stdout)
print "sys.getdefaultencoding() => ",sys.getdefaultencoding()
print "sys.stdout.encoding => ",sys.stdout.encoding

# ここから、テスト

alist = [ u"ユニコード日本語", u"だよ"]

for st in alist :
    print st

print u"{0}{1}".format(*alist)

print map(str,alist)
```

以下は、出力。

```sh
sys.getdefaultencoding() =>  ascii
sys.stdout.encoding =>  UTF-8
ユニコード日本語
だよ
ユニコード日本語だよ
---------------------------------------------------------------------------
UnicodeEncodeError                        Traceback (most recent call last)
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/IPython/utils/py3compat.pyc in execfile(fname, *where)
    202             else:
    203                 filename = fname
--> 204             __builtin__.execfile(filename, *where)

/Users/yuuichi/test-print/test.py in <module>()
     15 print u"{0}{1}".format(*alist)
     16
---> 17 print map(str,alist)

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-7: ordinal not in range(128)
```
Stylusのコンパイル、ウォッチング等

## 公式サイト

http://learnboost.github.io/stylus/

## インストール

```
$ sudo npm install -g stylus
```

## ヘルプを見る

```
$ stylus -h
$ stylus --help
```

## stylusのバージョンを確認する

```
$ stylus -V
$ stylus --version
```

## 同じディレクトリに同じファイル名でコンパイル

```
$ stylus ファイル名.styl
```

## 出力先のディレクトリを指定してコンパイル

```
$ stylus ファイル名.styl --out ディレクトリパス
$ stylus ファイル名.styl -o ディレクトリパス
```

## ファイルの変更を監視して自動的にコンパイル

```
stylus -w ファイル名.styl
stylus --watch ファイル名.styl
```

## CSS-Stylus変換Webサービス

http://css2stylus.com/
Bowerの使い方、よく使うライブラリ

## 公式サイト

http://bower.io/

## インストール

```
$ sudo npm install -g bower
```

## アンインストール

```
$ sudo npm uninstall -g bower
```

## アップデート

```
bower update
```

## bower.json生成

```
bower init
```


## ヘルプ

```
$ bower help
```

## ダウンロードしたライブラリの確認

```
$ bower ls
```

## ライブラリのインストール

```
bower install ライブラリ
```

## バージョンを指定してインストール

```
bower install ライブラリ#x.x.x
```

## bower.jsonに追記してインストール

```
bower install ライブラリ --save
```

## bower.jsonに開発用ライブラリとして追記しインストール

```
bower install ライブラリ --save-dev
```

## ライブラリのアンインストール

```
bower uninstall ライブラリ
```

## ライブラリ別インストール

jquery
bower install jquery

jquery-mobile
bower install jquery-mobile
bower install jquery-mobile-bower （こちらのほうが使いやすい）

underscore.js
bower install underscore

backbone.js
bower install backbone

追記予定


## 調査中

bower info jquery
bower search jquery
bower lookup
bower register
phpコマンドでランダムなハッシュ値を生成する

`
$ php -r "echo md5(mt_rand());"
`



* -r オプションで、スクリプトタグ（<?php ?>）無しで実行。
* md5()関数でハッシュ値を計算。
* mt_rand()関数で、よりよい乱数値を生成。[マニュアル](http://www.php.net/manual/ja/function.mt-rand.php)


コマンドライン上に結果のハッシュ値が表示されます。
Railsのscaffoldの作成

demo_app takako$ rails generate scaffold User name:string email:string
/Users/takako/rails_projects/demo_app/config/environments/development.rb:1:in `<top (required)>': undefined method `configure' for #<DemoApp::Application:0x007fda93d40d08> (NoMethodError)
	

configをviで開いた
environmentsをviで開いた
development.rbも存在していた


undefined method `configure' for #<DemoApp::Application:0x007ff89b9b8c28> (NoMethodError)

もともとあった1行目をDemoApp::application
に書式を変更したが

undefined method `application' for DemoApp:Module (NoMethodError)

application のaが小文字になっていたため修正
DemoApp::Application

保存（command w）
閉じる（command q）

再度実行
demo_app takako$ rails generate scaffold User name:string email:string

↓
invoke  active_record
      create    db/migrate/20140422014256_create_users.rb
      create    app/models/user.rb
      invoke    test_unit
      create      test/models/user_test.rb
      create      test/fixtures/users.yml
      invoke  resource_route
       route    resources :users
      invoke  jbuilder_scaffold_controller
      create    app/controllers/users_controller.rb
      invoke    erb
      create      app/views/users
      create      app/views/users/index.html.erb
      create      app/views/users/edit.html.erb
      create      app/views/users/show.html.erb
      create      app/views/users/new.html.erb
      create      app/views/users/_form.html.erb
      invoke    test_unit
      create      test/controllers/users_controller_test.rb
      invoke    helper
      create      app/helpers/users_helper.rb
      invoke      test_unit
      create        test/helpers/users_helper_test.rb
      invoke    jbuilder
       exist      app/views/users
      create      app/views/users/index.json.jbuilder
      create      app/views/users/show.json.jbuilder
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/users.js.coffee
      invoke    scss
      create      app/assets/stylesheets/users.css.scss
      invoke  scss
      create    app/assets/stylesheets/scaffolds.css.scss

↓
scaffoldジェネレータでユーザー用のデータモデル生成できました



☆20140422
・エラーの内容は一行目を見る
・NoMethodErrorの内容（おかしい箇所）は、指定してある
・syncerrorはスペルミス
・cdは、1つづつしか移動できない
・cd ..を使って戻ると最初に戻るので、再びいた場所に戻るのが面倒→app/views/users/index.html.erbのように指定して、viで開いて編集＞qで終了で一発で動けて便利
・lsでディレクトリに入っている要素を見る事ができる
Hierarchical clustering algorithm


- 複数のデータをクラスターに分類する手法の一つ。以下のwikipediaの記事の概略
    - http://en.wikipedia.org/wiki/Hierarchical_clustering
- N個の要素それぞれのペアに対して、要素間の距離 $d(i,j)$ が定義できれば適用できる手法。
    - agglomerative (バラバラの状態から大きなクラスターを作っていく手法）、divisive（一つの大きなクラスターから分割して行く手法）の２種類がある。
        - ここでは agglomorative のみ説明する

## アルゴリズム

- このようなa~fの要素をクラスタリングする事を考える
    - ![Clusters](http://upload.wikimedia.org/wikipedia/commons/b/b5/Clusters.svg)
    - ここでは説明のために要素間の距離は図の要素間のユークリッド距離で定義するとする。
        - 任意の２要素間の距離さえ定義されていればこの手法は適用できる。
- a~fのうち、最も近い２要素をクラスタリングする。
    - (b,c), (d,e) をそれぞれ一つのクラスターにする
- 以降、同様に近いクラスター同士をマージして行く。
    - 次に近いクラスターは (de, f) なので、これらをマージする。
    - ２つのクラスター $\mathcal{A}$, $\mathcal{B}$ 間の距離は複数の定義方法があり得る
        - complete-linkage clustering:  \max \{\, d(x,y) : x \in \mathcal{A},\, y \in \mathcal{B}\,\}.
            - それぞれのクラスター内要素の最大距離
        - single-linkage clusteirng:  \min \{\, d(x,y) : x \in \mathcal{A},\, y \in \mathcal{B} \,\}.
            - それぞれのクラスター内要素の最小距離
        - 他にも、 average-linkage clustering など複数の手法がある。
    - ![Clustering](http://upload.wikimedia.org/wikipedia/commons/a/ad/Hierarchical_clustering_simple_diagram.svg)
- 最終的に一つのクラスターになるまで続けられるが、クラスターの個数(number criterion)や、クラスター間の距離(distance criterion)などを決めてどこかでクラスタリングを停止する。
- 一般にはaggomerativeの計算量は $O(N^3)$ であるが、complete-linkage clustering, single-linkage clusteringの場合には $O(N^2)$ のアルゴリズム(CLINK, SLINK) が知られている。

## SLINKアルゴリズム

- 論文は[こちら](http://comjnl.oxfordjournals.org/content/16/1/30)
    - 計算量 $O(N^2)$, メモリ $O(N)$.
    - 計算量の $O(N^2)$ は各要素間の距離を必ず一度は計算する必要があるため。$O(N)$ のメモリは結果の格納のために必ず必要。
- 系統樹 (dendrogram) を要素Nの配列２つ $\Pi$, $\Lambda$ で表現する。論文では pointer representation と呼ばれている。
    - $\Pi$ : 所属するクラスターのindexを格納する。クラスターのindexは、クラスター内のnodeのindexで最大のもの。
    - $\Lambda$ : そのnodeがクラスターに所属したときの距離を保持する。
- 例えば、以下のような dendrogram を表現する時、$\Pi$, $\Lambda$ はそれぞれ以下のようになる。
    - ![dendrogram.png](https://qiita-image-store.s3.amazonaws.com/0/28792/9068beb9-5649-85e3-69df-ebc4ae6273ed.png "dendrogram.png")

- SLINKはこれらの二つのベクトルを作成して左から計算していく

### algorithm

- 配列の左（インデックスの小さい方）から順番にdendrogramを更新していく。
    - 左側のn個でdendrogramを作成し、一番右に要素を追加して既存のデータを更新して行くイメージ

```ruby
pi = Array.new(N, 0)
lambda = Array.new(N, 0.0)

N.times do |n|
  # STEP 1
  pi[n] = n
  lambda[n] = Float::INFINITY

  # STEP 2
  m = Array.new(n) {|idx| d(n, idx) }

  # STEP 3
  n.times do |i|
    parent = pi[i]
    if lambda[i] >= m[i]
      m[parent] = [ m[parent], lambda[i] ].min
      lambda[i] = m[i]
      pi[i] = n
    else      
      m[parent] = [ m[parent], m[i] ].min
    end
  end

  # STEP 4
  n.times do |i|
    parent = pi[i]
    pi[i] = n if lambda[i] >= lambda[parent]
  end
end
```

- STEP 1: 一番右に要素(n)を追加する。その際に、pi[n] = n, lambda[n] = infinity となる。
- STEP 2: 配列mにi番目の要素との距離をストアする。この配列mは順次更新されていく
- STEP 3:
    - lambda[i]>=m[i] の時（iとnとの距離が既存の要素よりも近い時）、
        - parentとnとの距離 m[parent]を d(i,parent), d(parent,n)のどちらか短い方に更新。（iとnは同じクラスターに属するため）
        - lambda[i] を m[i] に更新
        - 親をnに更新
    - lambda[i]<m[i] の時（iとnの距離が離れている時）
        - m[parent] を d(parent,n), d(i,n) のどちらか短い方に更新。parentとnの距離を計算するためには、子供とnの距離とも比較する必要がある
- STEP 4:
    - あるノードiの親のpiがnに更新された時に、ノードiの親をnに変える
全天インジェクション

`matlab
RA= linspace(0,24,37);
DEC = linspace(-90,90,19);
ind = 1;
for indRA=1:length(RA)
    for indDEC = 1:length(DEC)
        s.siginjtype(ind).sigtype='KKe';
        ind = ind + 1;
    end
end


`
VMware vCenter Converterで5.5環境にP2Vしてみた

CentOS5と6のサーバをESXi5.5にP2Vしてみましたが、試行錯誤で時間がかかったので、後に続く人が多少でもマシなように記録しておきます。個別の話は、このメモからキーワード抜き出してググれば良いでしょう。

### 基本的な事柄
* LVMは基本パーティションに変換する必要がある
* カーネルパニックする
* ネットワーク設定は自前で直す

### vCenter Converter Standalone client 5.5.0
管理者で起動する必要がある
#### 変換設定(デフォルトと異なる部分)
* [DestinationLocation]仮想マシンのバージョンは8に
* [Options][Data to copy]AdvancedにしてDestination layoutでLVMを「To basic」で基本パーティションに変換する
* [Options][Helper VM network configuration]DHCP環境でなければ一時使用向けのIPアドレスを設定する

※bondingなどで複数NICの場合でも、NICは1枚だけ「auto」で付けておいて、後でそれに設定付けるのが良いと思う

### CentOS5
#### 変換前にパーティションを詰める
* LiveDVDでboot
* pvscanやlvscanでLVMの様子を確認
* 対象を、lvchange -ayでactiveにする
* resize2fsでファイルシステムのサイズを詰める
* lvreduceでLVMのサイズを詰める

#### 変換後ESXi上で作業(変換だけだとカーネルパニックで動かなかった)
* vmxを直編集してSCSIの設定を捨ててHDDをIDEに変更 (SCSIだと動かないっぽい)
* CentOS-6.5-x86_64-minimal.isoでbootしてレスキューモードで起動
* chroot /mnt/sysimage
* vi /etc/fstab (例えばsdaをhdaな方向で修正)
* vi /boot/grub/grub.conf (ルートデバイスをsdb1をhdb1な方向で修正)
* mkinitrd /boot/initrd-*****.img ******* (initrdを作り直す)

※今、考えると、mkinitrdやってるのに、x86_64のレスキューモードで大丈夫だったのは何でだろう。手数少なく動かしたかったので、動いてありがたいのは確かだけど。カーネル入れ替えて不具合起きないか確認した方が良いなー
#### 起動後、ネットワーク設定する

### CentOS6
#### 変換前
* CentOS5と同じようにパーティションを詰める
* 変換前にCentOS-6.5-x86_64-minimal.isoでbootするカーネルと同じやつ入れておく

#### 変換後ESXi上で作業(変換だけだとカーネルパニックで動かなかった)
* CentOS-6.5-x86_64-minimal.isoでbootしてレスキューモードで起動
* chroot /mnt/sysimage
* dracut

※fstabとgrub.confの確認ぐらいはした方が良い
#### 起動後、ネットワーク設定する
* 変換時に新しいNICが追加された状態になるので、/etc/udev/rules.d/70-persistent-net.rulesを直して、/etc/sysconfig/network-scripts/ifcfg-eth?を直して、ネットワークの再設定を行う

### 所感
分かってたら、1時間とかの作業だけど、試行錯誤で数日潰れる感じ。無償版とは言え商用プロダクトなわけで、こんなに地雷多くてどうなのとか思った。地雷回避のノウハウでお金取る生態系とかなのかなー。
CSSだけで<select>をカスタマイズする

## Form系要素スタイルの初期化

ブラウザのForm系要素の初期スタイルをはがすときには、`appearance: none`をあてつつ、`background`や`border`などのリセットをする。

```css
select {
  -moz-appearance: none;
  -webkit-appearance: none;
  appearance: none;
  border-radius: 0;
  border: 0;
  margin: 0;
  padding: 0;
  background: none transparent;
  vertical-align: middle;
  font-size: inherit;
  color: inherit;
  box-sizing: content-box;
}
```

しかし`<select>`だと、WebKit系のを除けば、`-moz-apperance`としているFirefoxでさえも、選択のUIボタンが残っちゃう。

### IE10

![ie10.png](https://qiita-image-store.s3.amazonaws.com/0/21225/1f8ac212-429d-413a-89b1-5395b7643daa.png)

### Firefox25

![firefox.png](https://qiita-image-store.s3.amazonaws.com/0/21225/99fab716-458f-5fbd-e8d3-28ba56b1352d.png)

### Opera12.16

![opera.png](https://qiita-image-store.s3.amazonaws.com/0/21225/d19d09de-84bf-260b-c71e-30c18ac01339.png)

## `overflow`でごまかす

先に結果をみせるとこんな感じ。

![overflow.png](https://qiita-image-store.s3.amazonaws.com/0/21225/4bc5408c-321c-4d1d-86c9-bea2d183c473.png)

### マークアップ例

```html
<div class="custom">
  <select name="options">
    <option value="option-1">Option</option>
  </select>  
</div>
```

### CSS（必要な部分のみ抜粋）

```css
.custom {
  overflow: hidden; /* 伸ばした分を隠す */
}
.custom > select {
  width: 130%; /* UI分を伸ばす */
}
```

と、シンプルに対応できる。今のところは困ってない。

## 他のやり方

https://gist.github.com/joaocunha/6273016

Firefoxには、

```css
select {
  -moz-appearance: none;
  text-indent: 0.01px;
  text-overflow: '';
}
```

IE10には、

```css
select::-ms-expand {
  display: none;
}
```

ってのがあるそう。

## Codepen

http://codepen.io/hiloki/pen/pwjsk
phpで外部コマンド実行結果をバイナリで受け取る

# phpで外部コマンド実行結果をバイナリで受け取る

外部コマンドの実行結果を`exec()`の第二引数で取得すると、
１行ごとの配列になってしまうし、バイナリセーフでないので。

ならstdoutをそのまま取得してしまえばいいじゃないか、という話。

```php:php
    ob_start();
    passthru(<<<EOD
cat img.png
EOD
    );
    $output = ob_get_contents();
    ob_end_clean();
```

これで標準出力への出力を無加工でそのまま取得できる。

## 要点

* `passthru()`

> 外部プログラムを実行し、未整形の出力を表示する

未整形の出力はいいけど、呼ぶとこの関数の中で出力までされてしまうので、

* `ob_start()`
* `ob_end_clean()`
* `ob_get_contents()`

で標準出力をキャプチャすれば良い。

### ちなみに

stdoutのキャプチャ自体は別にphpに限った話じゃないのでrubyとかpythonとかでも使える。
rubyの場合こんな感じ。

```rb:ruby
output = StringIO.open { |sio|
    begin
        $stdout = sio
        exec("cat img.png")
        sio.rewind
        sio.read
    ensure
        $stdout = STDOUT
    end
}
```

### 小ネタ

こんな事も出来る。

```php:php
ob_start();
$some_args_pass_to_partial_script = array(1, 2, 3);
require("_partial.php");
$partial_script_contents = ob_get_contents();
ob_end_clean();
```
[iOS] iCadeゲームコントローラーに対応してみよう


# iCadeってなに？

iCadeは昔からあるiOS用のゲームコントローラです。
http://www.ionaudio.com/products/details/icade

iPadをアップスタンド筐体っぽくするやつが発端で、この後様々なコントローラがこのiCade互換として発売されています。
最近ではファミコンコントローラ風のものがでて話題になっていました。
http://jp.fc30.com

# 接続とOS/アプリでの認識

bluetoothで接続します。
接続されたらiCadeのデバイスはキーボードのように振る舞い、アプリはボタンが押されたら特定の文字列が送られてくるのでそれを拾って各動作をさせることになります。

# ゲーム以外での可能性

入力の判定は簡単にできるので、ゲーム以外でも対応すると便利になる可能性を秘めてます。
たとえばレシピアプリ(iPad)を例にしましょう。
iPadは濡れたりすると困るので、ちょっと離れた場所におきたい。
でも操作するときちょっと面倒。濡れて壊れるとイヤですし。
iCade対応すればiPadはちょっと離れた場所に、コントローラはラップでくるんで多少濡れても大丈夫にし、手元に置けば気軽にページ送りとかできてしまいます。
テレビのリモコン感覚ですね。

他にも沢山できることはあるはずです。


# 対応方法
残念ながらiOS7から用意されているGame Controller Frameworkは使えませんので、独自に実装していく必要があります。
単純に書くとUIKeyInputプロトコルの

```objectivec:UIKeyInput
- (void)insertText:(NSString *)text
```
で入力された文字列を判定すればよいというだけなのですが、面倒なのでラッパーライブラリを使います。
iCade-iOSというライブラリがそれなのですが、残念ながらメンテナンスがされていないようでPullRequestも取り込まれていない状態でした。forkしてARC対応したものを用意しましたのでこちらを使ってみてください。

**iCade-iOS**
https://github.com/banwanko/iCade-iOS/tree/support-arc

実際に使用するのは下記の3ファイルです。

```objectivec:iCadeTest/iCade/
iCadeReaderView.h
iCadeReaderView.m
iCadeState.h
```

プロジェクトに適当に上記3ファイルを入れます。
使いたいViewControllerのviewDidLoadあたりにこのViewを作成し、iCadeEventDelegateのプロトコルメソッドを追加します。


```objectivec:ViewController
#import "iCadeReaderView.h"

@interface ViewController()
@protocol (nonatmic) iCadeReaderView	*icadeView;
@end

@implementation ViewController

- (void)viewDidLoad 
{
	[super viewDidLoad];
	self.icadeView = [[iCadeReaderView alloc] initWithFrame:CGRectZero];
	[self.view addSubview:_icadeView];
	_icadeView.active = YES;
	_icadeView.delegate = self;
}
#pragma mark - iCadeEventDelegate
- (void)buttonDown:(iCadeState)button 
{
	// ボタンが押された
}
- (void)buttonUp:(iCadeState)button 
{
	// ボタンがはなされた
}
- (void)setState:(BOOL)state forButton:(iCadeState)button 
{
	// ボタンの状態が変わった
}
@end
```
通常はbuttonDownの対応だけでいいと思います。
このままですとこのViewControllerから遷移したときなどで困るので、下記のようにしておくといいと思います。

```objectivec:ViewController
- (void)viewDidAppear:(BOOL)animated
{
	[super viewDidAppear: animated];
	_icadeView.active = YES;
	_icadeView.delegate = self;
}
- (void)viewWillDisappear:(BOOL)animated 
{
	[super viewWillDisappear: animated];
	_icadeView.active = NO;
	_icadeView.delegate = nil;
}
```

# 注意点
* キーボードが日本語入力の状態になっていると、ボタン入力が受け付けられないので注意しましょう。
これの回避方法はまだ調べてません。

* iCadeデバイスが繋がっている状態ではキーボードが表示されなくなります。
ユーザが入力する項目のあるアプリでは色々面倒かもしれません。

# 宣伝
[Dモーニング(iOS)](https://itunes.apple.com/jp/app/id608757493?mt=8)ではサポート外の機能ですがiCade対応していたりします。
（DモーニングのiOS版は自分が実装を担当なのです）
左右でページ移動、L,Rで作品移動をすることができ、iPadを置いて楽な姿勢でコントローラを使い読みすすめることができますよ。
はじめは手元にあった[impulse controller](http://impulsecontroller.com)をなにかに使えないかなと思い、Dモーニングで対応してみたところ、かなり使い勝手が良いということに気がつきました。

今後ゲームコントローラの対応はGame Controller Frameworkに収束していくと思うので、今更iCade対応するのもなーという人もいるかと思います。
組み込み自体は10分もあればできちゃうので、もし対応したら楽しそうなアプリでしたら試してみてはいかがでしょうか？

一番の問題点は、iCade互換デバイスを持っている人がそんなに多くはいないだろうということでしょうかね・・・
h2 database 1.3.176 -> 1.4.177 の非互換

4/12 にリリースされている h2 database の 1.4.177 は 1.3.176 の次のバージョンですが、 1.3 -> 1.4 になっている通り、いくつか非互換な変更があるようです。

まず、これまで OK だった以下のような指定が

```
url="jdbc:h2:file:db/development"
```

エラーになるようになっていて、同じ状態にしたければ、以下のように書き換える必要があります。

```
url="jdbc:h2:file:./db/development"
```

また、ファイル DB のファイル名も  `development.h2.db` -> `development.mv.db` のような命名ルールに変わったようです。
obj.length === +obj.length って何？

別に便利なtipsでも役立つ情報でもなんでもなく
ソースリーディングのメモです。

underscore.jsのソースを見ていたら
_.eachが以下のようになっていた

```js:underscore.js
  _.each = _.forEach = function(obj, iterator, context) {
    if (obj == null) return obj;
    if (obj.length === +obj.length) {
      for (var i = 0, length = obj.length; i < length; i++) {
        if (iterator.call(context, obj[i], i, obj) === breaker) return;
      }
    } else {
      var keys = _.keys(obj);
      for (var i = 0, length = keys.length; i < length; i++) {
        if (iterator.call(context, obj[keys[i]], keys[i], obj) === breaker) return;
      }
    }
    return obj;
  };
```

https://github.com/jashkenas/underscore/blob/430ded46e1f3619fb724af8563d1adbabf512d59/underscore.js#L69

この部分

```js
obj.length === +obj.length
```

が恐らくレベルで何やってるかは分かるけどちょっと不思議な感じしたのでメモ

```js
[1,2,3].length //=> 3
+[1,2,3].length //=> 3
({a:1}).length //=> undefined
+({a:1}).length //=> NaN
```

予想通りというかなんというか

```js
typeof obj.length == "number" && !isNaN(obj.length)
```

と同等のことをしていると判断してよさそう。

処理速度面の理由なのかなーと思いつつも
実装した人にでも聞かない限り何故こうなっているのかはわからないのであった。

http://jsperf.com/is-number-and-not-nan-when-true
http://jsperf.com/is-number-and-not-nan-when-wrong-type
http://jsperf.com/is-number-and-not-nan-when-nan

numberじゃない場合こっちの方が遅いっぽいしなー
一番多そうなnullパターンを
http://jsperf.com/is-number-and-not-nan-when-wrong-type/2
さっきのforkして試してみたけど別にこの時早いというわけでもなかったのでした。
errbit-phpを試してみる

# errbit-phpを試してみる

調べてもほとんど情報が出てこないのでメモ書き程度でも残しておく。
errbit-phpの中で無名関数使ってるので、php5.3以上でないと動かないので注意。

あと、errbitの中で`mongod`使うようなので、こちらも別途インストールして起動しておく。

## 導入

### errbitを入れる

ここはruby。
まず、rbenvとかで適当にruby入れておく。

```bash:bash
rbenv install 2.1.1
rbenv rehash
rbenv shell 2.1.1
ruby -v
```

#### githubから取ってくる。
`git clone https://github.com/errbit/errbit`

#### bundleして
`cd errbit
bundle install`

#### port3000で起動
`bundle exec rails s`
unicornとかに換えても良いと思う。

#### ブラウザでアクセスしてみる
`http://localhost:3000/`

デフォルトのままなら

* errbit@errbit.example.com
* password

でログインできるはず。
seedは`db/seeds.rb`にあると思う。

#### アプリケーションを登録。

ログインした後に
`Apps` -> `Add a New App`

から登録。
ここで登録した時に割り振られる`api-key`は後で使うのでメモっておく。

### errbit-phpを入れる

ここからphp。

#### githubから取ってくる。
`git clone https://github.com/flippa/errbit-php.git`

#### プロジェクトにコピー
`cp -r errbit-php/lib/ /path/to/proj`

## 設定

初期設定はこんな感じ。
詳細は`README.md`見るといいかも。

* api-key: errbitのwebアプリから登録したアプリケーションのキー
* host: errbitの動いているホスト
* port: 上記errbitの導入でwebrickで起動してるので、この場合は3000

`project_root`とか`environment_name`とかはたぶん表示に使うだけだと思う。

```php:php
require_once APPPATH . '/libraries/Errbit.php';

Errbit::instance()->configure(array(
    'api_key'           => 'd8e13dff0e25755995cbf25f512df250',
    'host'              => 'localhost',
    'port'              => 3000,
    'project_root'      => dirname(__FILE__),
    'environment_name'  => "development",
));
```

### 監視 or 通知の設定

以下、ざっくり使い方。
間違ってたら指摘お願いします。
詳細はREADME.MDを参照されたし。

```php:php
Errbit::instance()->start();
```

とやっておくと、phpのエラーハンドラに登録するらしいので、
エラーが起きた時に自動的に通知してくれる。

が、これだとエラーハンドラがerrbit-phpに食われてしまうので、
手元から通知する場合は

```php:php
try {
    something_proc_error_may_occurs();
} catch(Exception $e) {
    Errbit::instance()->notify($e);
    throw $e;
}
```

とかしてやるといいと思う。

これで、errbitのwebアプリの`Errors`タブにエラーが登録されて確認できるようになる。

ユーザの追加とかNOTIFICATIONSとかWATCHERSとかはまぁ、適当に。
＃ ほんとにちょっと試したかっただけなのでそこまでしっかり設定してない :)
clojure.zipはzipファイルを扱うものじゃないよ

ってことは関数群を見ればわかりますが、少しつまづいた箇所をメモ

###### 知らない人向けに簡単な使い方
`(-> (seq-zip '(1 (2) 3)) down right down node)`で2が取れる

## remove
removeは現在位置のノードを削除してprevの位置に戻る。
なぜか、兄弟ノードすべてなくなるとNullPointerExceptionになる。これバグじゃないのかなあ？

## insert-child, append-child
branchの位置でのみ使える。
insert-childは左端、append-childは右端にchildを入れる

## end?
down rightmostの位置はまだendじゃない。さらにright(next)でend?がtrue

## seq-zip, vector-zip
seq-zipの中ではvectorが、vector-zipの中ではseqがbranchとして扱われない。

seq, vector両方だとりたいときは`(postwalk #(if (sequential? %) (vec %) %) coll)`などでどちらか一方に変換するか、branch判定にsequential?を使用するものを作るなどする。

```sequential-zip.clj
(defn sequential-zip
  [root]
  (zipper sequential?
          identity
          (fn [node children] (with-meta children (meta node)))
          root))
```
PHPでコールバック関数を利用する

PHPを再勉強中。

JavaScriptをはじめ最近プログラムを書くときに何かと使う機会が多いコールバック関数。
PHPでのコールバック関数の使い方をまとめてみました。

## 可変関数を利用する方法

PHPには可変関数という仕組みがあります。
これは変数名の後ろに()を付与することで、変数の値と同名の関数を呼び出すことができるというもので、この機能を利用することでコールバック関数を実現することができます。

参照：[可変関数](http://www.php.net/manual/ja/functions.variable-functions.php)

```php
<?php
# コールバック関数
function callback_func()
{
    return "foo";
}

# コールバック関数を受け取る関数
function func($callback)
{
    # 可変関数を利用して文字列で渡された名称の関数を呼び出す。
    echo "callback function result :" . $callback() . PHP_EOL;
}

# 関数をコールバック関数として渡す
func("callback_func");  # <= "callback function result :foo" と出力

```

コールバック関数を渡すさい、名前を文字列で指定するというトコがミソでしょうか？

## call_user_func() 関数を利用する方法

可変関数を利用したコールバック関数には一つ問題があって、クラスやオブジェクトのメソッドをコールバック関数として渡すことができません。
クラスやオブジェクトのメソッドをコールバック関数として渡すには、`call_user_func() `関数を利用すると良いようです。

参照：[call_user_func](http://www.php.net/manual/ja/function.call-user-func.php)

`call_user_func()` の第１引数には呼び出したいコールバック関数を渡します。通常の関数であれば可変関数と同じく、関数の名称を文字列で渡します。
オブジェクトのメソッドの場合は、配列を用い0番目の要素にオブジェクト自身、1番目の要素に呼び出したいメソッドの名称を文字列で渡します。呼び出したいメソッドがクラスの静的メソッドの場合、配列の0番目の要素にクラス名を文字列で渡します。

参照：[コールバック](http://www.php.net/manual/ja/language.types.callable.php)

```php
<?php
# クラスの定義
class MyClass
{
    function callbackMethod()
    {
        return "hoge";
    }
    static function staticCallbackMethod()
    {
        return "fuga";
    }
}

#コールバック関数を受け取る関数
function func($callback)
{
	echo "callback function result :" . call_user_func($callback) . PHP_EOL;
}

#メソッドをコールバック関数として渡す。
$obj = new MyClass();
func(array($obj, "callbackMethod"));	  # <= "callback function result :hoge"と出力

# 静的メソッドのをコールバック関数として渡す。
func(array("MyClass", "staticCallbackMethod"));  # <= "callback function result :fuga"と出力

```


## 無名関数をコールバックで渡す。

PHP5.3から無名関数を使うことができるようです。

参照：[無名関数](http://www.php.net/manual/ja/functions.anonymous.php)

```php
<?php

#コールバック関数を受け取る関数
function func($callback)
{
	echo "callback function result :" . call_user_func($callback) . PHP_EOL;
}

# 無名関数をコールバック関数として渡す。
func(function() { return "bar"; });  # <= "callback function result :bar" と出力

```

無名関数の定義は通常の関数の定義から関数名を省略したもの。関数オブジェクト？が返るので変数に代入したり、関数やメソッドの引数として渡すことができます。
実行するには`call_user_func()`を利用するか、代入された変数に可変関数のように()を付与することでも呼び出すことができます。

```php
<?php
# 変数に代入した無名関数を呼び出す。
$func = function() { return "foo"; };
echo $func() . PHP_EOL;  # <= "foo"と出力される。
```

## タイプヒンティング

PHP5.4以降では関数やメソッドの引数定義時にタイプヒンティングを使用することができます。タイプヒンティングに`callable`を指定することで引数がコールバック関数であることを明示することが可能です。

```
<?php 
# コールバック関数を受け取る関数にタイプヒンティングで引数がコールバック関数であることを明示する。
function func(callable  $callback)
{
	echo "callback function result :" . call_user_func($callback) . PHP_EOL;
}
```
UnCSSの使い方〜効いてないCSSをサクッと綺麗にする方法〜


##UnCSSの使い方
UnCSS？うわぁ〜っと全力徹夜でCSSを書きマークアップは力づくで終えたが...
無駄な記述があったり、bootstrapとか色々いっぱい入ってるモノを使う物だけにスッキリしたい時に
使うと、効いてないCSSをザクッと消して綺麗にしてくれます。

1.環境構築
2.UnCSSの使い方
3.まとめ

##環境構築
###node.jsインストール済みなか方は次へ
node.jsをhomebrewでインストール

```$ brew install node 
```
インストール出来たかチェック

```$ node -v
```

###npmインストール済みなか方は次へ
npmとは、Node.js向けパッケージ管理ツールです。
Node.jsインストール時に同時にインストールされますが
昔はされませんでしたので

```$ npm -v
```

でチェックして入ってない場合は
npmをcurl経由でインストール

```$ curl http://npmjs.org/install.sh | sh
```

そして、確認

```$ npm -v
```

UnCSSをインストール

```$ nmp install -g uncss
```

##UnCSSを使う

```$ uncss チェックしたいhtmlのアドレス or ファイルのアドレス　> 吐き出し先file名.css
```

使ってないCSSをガサッと消してスッキリしたCSSを吐き出してくれる。

uncssでは色々オプションんも用意されています。
オプションに関しては[githubのuncssレポジトリ](https://github.com/giakki/uncss "uncssレポジトリ")をチェック。


##まとめ
テストで、htmlの方に記述のない要素をCSSに追記して
動作を確認してみたが、綺麗に削除してくれました。

githubのレポジトリにも書いてありましたがgrunt用やgulp用のuncssもあったので
SASSやLESSな人もgunt使って一発間にいれると幸せになれる気がします。
[一日一Vim](その7)VIMでタブの位置を変える

# 参考サイト
http://hail2u.net/blog/software/vim-move-tabpage.html

# 設定

無断転載になってしまいそうなので、設定は参考サイトをご参照ください。m(_ _)m
Ctrl + Shift + 矢印キー(<) で左にタブが移動します。
Ctrl + Shift + 矢印キー(>) で右にタブが移動します。

ちなみに、単なるタブの遷移は`gt`、`gT`でできます。
`gt`が右に遷移。`gT`が左に遷移です。
【myfriend】申請完了時にalertを出してメッセージを出したい。


```html:myfriend_application.html
<link rel="stylesheet" href="<{$xoops_url}>/common/css/jquery.alerts.css" type="text/css" />
<script type="text/javascript" src="<{$xoops_url}>/common/js/jquery.js"></script>
<script type="text/javascript" src="<{$xoops_url}>/common/js/jquery.alerts.js"></script>
<script type="text/javascript" src="<{$xoops_url}>/common/js/jquery.ui.draggable.js"></script>
<script type="text/javascript">
jQuery('#the-form').submit(function(event){
	//HTMLでの送信はキャンセル
	event.preventDefault();
	var jQueryform= jQuery(this);
	//送信ボタンを取得
	var jQuerybutton = jQueryform.find('button');
	//送信
	jQuery.ajax({
		url:jQueryform.attr('index.php?action=application'),
		type:jQueryform.attr('post'),
		data:jQuery.serialize(),
		timeout:10000,//単位はミリ秒
		cache:false,
		//送信前
		beforeSend: function(data){
			//ボタンを無効化し、二重送信を防止
			jQuerybutton.attr('disabled',true);
		},
		//応答後
		complate:function(data){
			//ボタンを有効化し、再送信を許可
			jQuerybutton.attr('disabled',false);
		},
		//通信成功時の処理
		done:function(data){
			//送信が成功したら完了ページに遷移
			jAlert("友達申請完了","チェック");
		},
		//通信失敗時の処理
		error:function(data){
			alert("NG");
		}
	});
});
</script>
<h4><{$titlemsg}></h4>
<form id="the-form" method="post">
<{xoops_token form=$ActionForm}>
<input type="hidden" name="auid" value="<{$auser->get('uid')}>" />
<table class="outer">
<tr>
<td class="head"><{$smarty.const._MD_MYFRIEND_AISATSU}></td>
<td class="odd"><textarea name="note" cols="50" rows="5"></textarea></td>
</tr>
<tr>
<td colspan="2" style="text-align: center;">
<button><{$smarty.const._MD_MYFRIEND_SEND}></button>
</td>
</tr>
</table>
</form>
```
npmとbowerのassertパッケージについて

先日書いたpower-assertの環境を整える記事で、`assert.js`をnpmではなくbowerでインストールしました。  
`bower install assert`で落ちてくるのはこのリポジトリです。  
https://github.com/jgallen23/assert 

power-assertが依存しているのもこのパッケージです。  
しかし`npm install assert`で落ちてくるのはこちらです  

https://www.npmjs.org/package/assert
https://github.com/defunctzombie/commonjs-assert

githubのリポジトリ名を見てもらえばわかりますが、もともとCommonJS向けに書かれたパッケージのようで、bowerで落ちてくるものとは完全に別物です。  

同名のパッケージでもnpmとbowerで違うものが落ちてくることがあるという事例でした。気をつけないといけないですね。
Atlassian JIRAにWikiを表示する

Atlassian JIRAは課題管理に特化したツールで、Wiki等を表示する機能がありません。
Atlassian的にはそこは[Confluence](https://www.atlassian.com/ja/software/confluence)を買え、ということになるんですがもう払いたくないということもあるでしょう。

そんなときのために、Wiki的な情報をJIRAに追加する方法をご紹介します。

1. [Custom Content for JIRA](https://marketplace.atlassian.com/plugins/com.tngtech.jira.plugins.customcontent.jira-gadget-custom-content)
このプラグインは、外部のWebページをJIRAに表示できるプラグインです。つまり、どこかでWiki的なページを書いておけばこのプラグインで組み込み表示することが可能です。

2. [jira-wiki-gadget](https://github.com/icoxfog417/jira-wiki-gadget)
手前味噌ですが、Wikiが書けないのを解消するため私が作ったガジェットです。JIRA上に作成した課題のタイトル/詳細をトップページ上に表示できます。
通常の課題と同様担当者の割り振りなどができるので、xxがyyまでにWikiを書く、という風にタスク管理もできかつ書いた内容はダッシュボードに表示でき一石二鳥・・・のはず。

これでダッシュボードも結構使いやすくなるはず。
Macでのパスワード付きZipファイルの作り方

# ランダムなパスワードを作る
```bash
cat /dev/urandom | LC_CTYPE=C tr -dc '[:alnum:]' | head -c 10
```
文字種変えたかったらtrへの引数を適宜変更

# パスワード付きでZipアーカイブ
```bash
zip -er target_dir.zip target_dir
```
「Enter password:」って出るはずなのでパスワード入れる
「Verify password:」ってでたらもっかいパスワード入れる

以上

参考)
http://nanapi.jp/76756/
http://karakuridou.net/blog/mac%E3%81%A7%E3%83%A9%E3%83%B3%E3%83%80%E3%83%A0%E3%81%AA%E6%96%87%E5%AD%97%E5%88%97%E3%82%92%E7%94%9F%E6%88%90/
AWS S3,Route53で独自ドメインの静的サイトを公開する


HTML,CSS,Javascriptでの静的サイトであれば、AWSのS3とRoute53を使って格安で公開できる。


##Create Bucket
 * Bucket Nameは、ドメイン名に設定しないと、Route53での連携ができなくなるので注意
 * Loggingは、アクセスログをとれるようになるもの。古いログはアーカイブや削除のルールを作ることができる。
あとでも変更できる。

##Static Website Hosting
作成したBucket のProperty「Static Website Hosting」にて、
Enable website hostingを選択し、以下のようにする。
	- Index Document →　index.html
	- Error Document →　error.html


Endpointが、URLになるので記録しておく


##Permissions
作成したBucket のProperty「Permissions」にて、「Add Bucket Policy」を選択。

ダイアログの下のsample bucket policyを開くと、policyのサンプルが出てくる。
「Granting Read-Only Permission to an Anonymous User」をそのままコピーして、
「examplebucket」のところをBucket Nameに書き換えて、Saveする。

```
{
  "Version":"2012-10-17",
  "Statement":[{
	"Sid":"AddPerm",
        "Effect":"Allow",
	  "Principal": "*",
      "Action":["s3:GetObject"],
      "Resource":["arn:aws:s3:::examplebucket/*"
      ]
    }
  ]
}
```

##Upload
Bucket Nameの部分をクリックすると、Uploadボタンが出てくるので、アップロードする。


##サイト確認
EndPointからアクセスすれば、サイトがみれるようになる。

自分の場合、アップローダを使ってアップロードしたのだが、CSSがうまく反映されていなかった。
CSSのMetadataのContents-Typeをtext/cssに修正したら正常にできるようになった。

##Route53での設定
1.Route53にて、「CreateHostedZone」でドメイン名を入力してゾーンを作成。

2.作成後、右のほうに出てくるDelegation Set を記録しておく。

3.私はレジストラはムームードメインを使っています。
ムームードメインにてドメイン取得して、ネームサーバを弊社サービス以外 のネームサーバに変更する。

4.ネームサーバ1〜4に先ほどのDelegation Setを入力して保存。

5.Route53に戻って、「Go To Record Set」

6.「Create Record Set」
 - Typeを「A - IPv4 Address」を選択
 - AliasをYesにする
 - AliasTargetの欄にフォーカスを当てると、S3のEndpointが出てくるので選択
 - Createする


これで、しばらくすると独自ドメインでサイトが見れるようになる。
すぐには反映されないが、自分の場合、1時間くらいで反映されてました。（もっと早いかも）
Eloquentでリレーションを作成する方法

LaravelについてくるEloquent ORMで、リレーションを新たに作る方法について余り書かれてないのでまとめてみます。

### Eloquentのリレーションの種類

Eloquentで使えるリレーションには、主に次の種類があります。全部上げるときりがないので、有名ドコロのみです。

*   BelongsTo
*   HasMany
*   BelongsToMany

それぞれのリレーションの意味は[Laravelドキュメントのリレーションの項目](http://laravel.com/docs/eloquent#relationships)を参照してください。

## リレーションの作り方

新たにリレーションを作る場合は、リレーションの種類にしたがって、APIを呼び出します。大量にあるAPIな中から、新たにリレーションを作成するのに使いそうなAPIを、[APIドキュメント](http://laravel.com/api/4.1/)から抜きだしてみました。

リレーション種別|オブジェクト |   配列
-------------|-----------|--------
BelongsTo    | associate |  --
HasMany      | save      | saveMany
BelongsToMany| save      | saveMany

まとめると簡単ですね。

例として次のモデルを考えます。

```php
class Post extends Eloquent {
  public comments() {
    return $this->hasMany('Comment');
  }
}
class Comment extends Eloquent {
  public posts() {
    return $this->BelongsTo('Post');
  }
}
```

### BelongsTo

BelongsToだけ、associateを使います。

```php
$comment->posts()->associate($post);
```

一度に複数のエンティティとリレーションを作成する方法は提供されていません。考えて見れば、BelongsToなので、必要ない（というか不可能）です。

ちなみに、

```php
$post = $comment->post;
```

postをプロパティとしてアクセスすると、関連づいたエンティティを読み込んでくれます。

### それ以外のリレーション

それ以外の場合は、saveあるいはsaveManyを使います。ちなみにsaveManyは、内部でsaveを呼び出しているだけです。
ざっくりと見たところ、HasOneなども同じAPIです。

```php
$post->comments()->save($comment);
$post->comments()->saveMany($comments);
```

同様に

```php
$comments = $post->comments;
```

とプロパティとしてリレーションをアクセスすると、関連したモデルオブジェクトを（配列として）返してくれます。


## 関連して

[Eloquentのモデル生成法比較：newとcreate](http://qiita.com/asaokamei/items/bdad9d0f931f0840a3a9)というQiitaでは、リレーションを作る場合の注意点を書いてます。
FuelPHP開発入門_08


では引き続きOrm/Modelの作成に映って参ります。
Ormというのは、開発入門の02で触ったconfig.phpに記述のあった
FuelPHPがもともと持っているパッケージのひとつです。

***※02記述時点ではOrmを入れていませんでしたが、必要になったので追記しました***

ORMとはObjectRelationMappingの略で、Model同士のリレーションを作成するためのものです。
これを利用することによって、例えばPersonalテーブルの個人IDをキーにProfileテーブルから
いっぺんにデータを引きずり出す、というようなことが可能になります。

## モデルクラス記述

```user.php
<?php
use Orm\Model;

class Model_User extends \Orm\Model
{
	protected static $_properties = array(
		'id',
		'email',
		'password',
		'group',
		'last_login',
		'login_hash',
		'profile_fields',
		'created_at',
		'updated_at'
		);
		
	protected static $_primary = array('id');
 
	protected static $_has_one = array(
		'profile' => array(
			'key_from' => 'id',
			'model_to' => 'Model_Profile',
			'key_to' => 'user_id',
			'cascade_save' => true, // 主モデル保存時に参照モデルを保存するか
			'cascade_delete' => true, // 主モデル削除時に参照モデルを削除するか
		)
	);
}
```

Userテーブルについては、私はSingleAuthパッケージを利用するためにこの形式で固定しています。
かなり初期の方に設定した箇所なので過不足あるかもしれません。

モデルと接続を行うDBのテーブル名は、モデル名の複数形になります。
userならusers、categoryならcategoriesです。

ひとまずこの形式（プロパティ、主キー指定、リレーション）が書ければモデルとしての役割は果たすことができます。
_has_manyや_belongs_toなどその他のリレーションについては[FuelPHP公式リファレンス](http://fuelphp.jp/docs/1.7/packages/orm/relations/intro.html)を参照してください。

前回クエリビルダについて書いた中で

```php
DB->select()->from->('users')->where('id',$id)->execute()->as_array();
```

といった記述をしましたが、独自モデルを作成した場合これが

```php
$user=Model_User::find_by_id($id);
$email=$user->email;
```

という形で記述することができるようになります。
戻り値も配列ではなくクラスの形になりますので、呼び出しがシンプルになります。

ちなみに参照モデルも一緒に呼び出したい場合は

```php
$user=Model_User::find_by_id($id,array('related'=>array('profile')));
$name=$user->profile->name;
```

と記述します。
relatedには、モデル作成時$_has_oneに記述したキーを記述します。
_has_manyはまだ試してません！以上！

出番無かった顔文字ヽ(´@ω@｀)ﾉ
ガウス過程

[先週末](http://qiita.com/ynakayama/items/d356360ef909f04366ae)はカーネル関数について記述しましたが今日も続いて PRML をなぞっていきます。

## RBF ネットワーク

**RBF (radial basis function)** は一般的によく使われる固定された基底関数です。基底関数というのは入力ベクトル {X1 ... Xn} から目的変数の値 {t1 ... tn} を得る関数 f(x) を求めることを目的とし RBF の線形結合で表すことで実現します。

```math
\phi(x) = h(||x-\mu_j||)
```

RBF はその中心 μj からの動径のみに依存します。 (動径基底関数)

RBF を導入する利点は次の 2 点です。
* 正確に目的変数の値を再現する関数補間 (過学習に注意)
* 入力変数にノイズが含まれる場合の最適化

基底関数が正規化されていると、すべての基底関数が小さな値を持つ領域を無くすメリットがあります。

## ガウス過程

[ガウス過程](http://ja.wikipedia.org/wiki/%E3%82%AC%E3%82%A6%E3%82%B9%E9%81%8E%E7%A8%8B)と等価なモデルはさまざまな論文で提示されていますが RBF ネットワークもガウス過程の一種として見ることができます。

ガウス過程の基本的な考え方としてはパラメータ w の事前分布 p(w) を使うのではなく関数 y(x) の事前分布 p(y) を直接に定義してしまうというものです。

基底関数を次式で表したとき

```math
y(x) = w^T{\phi}(x)
```

ここで x を入力ベクトル、 w を M 次元の重みベクトルとします。 w の事前分布として次の等方的なガウス分布を考えます。

```math
p(w) = N(w|0,{\alpha}^{-1}I)
```

α は超パラメータであり分布の精度すなわち分散の逆数を表します。
w はガウス分布に従う変数集合です。
その線形結合である y 自身もガウス分布に従います。
平均と分散を求めれば y の同時分布が定まります。

一般的にガウス過程は関数 y(x) 上の確率分布として定義され、任意の集合 {x1 ... xN} に対する y(x) の値の同時分布がガウス分布に従うものとされます。

入力ベクトル x の次元が 2 次元のときにこれは **ガウス確率場 (Gaussian random field)** と呼ばれます。

N 個の変数 {y1 ... yN} の同時分布が平均と共分散といった 2 次までの統計量で記述されます。

y(x) の平均は 0 とすることが多いので、ガウス過程はカーネル関数として与えられます。

カーネル関数は基底関数を選択せずに直接定義することもできます。これは[前回説明した](http://qiita.com/ynakayama/items/d356360ef909f04366ae)とおりです。

ガウス過程での回帰・分類問題は予測分布

```math
p(t_{N+1}|t_N)
```

を求めます。

ガウス過程の利点欠点は次のとおりです。
* 利点 : 無限個の基底関数に対応でき、予測の分散を求めることができる
* 欠点 : O(N^3) の計算量が必要となる (大きなデータに不向き)

## 参考

[PRML] ガウス過程についてのメモ
http://d.hatena.ne.jp/syou6162/20091011/1255189429

カーネル法とガウス過程（ PRML 下巻 第6章）
http://naoyat.hatenablog.jp/entry/2012/11/13/220933

パターン認識と機械学習 下 (ベイズ理論による統計的予測) 
http://www.amazon.co.jp/dp/4621061240/
[Ruby] クラスの存在を確認する


「このgemが入っていれば使うけど、無ければ別のgemを捜す」ような処理で、クラスの存在を確認したい場面があり。とりあえず `defined?` を使えばそれっぽいことは出来るけど、定数なのかクラス名なのかを識別する必要があったりして面倒だったりもしたので、メソッド化してみた。

~~~ruby
class Module
  def class_exists? class_name
    if const_defined?(class_name)
      const_get(class_name).is_a?(Class)
    else
      false
    end
  end
end
~~~

~~~ruby
Module.class_exists?('CGI')
#=> false
require 'cgi'
Module.class_exists?('CGI')
#=> true
~~~

`Module`を汚したくなければユーティリティにして`const_defined?`や`const_get`を`Module`からの呼び出し固定にしてもいいけど、この形にしておけば名前空間内での存在確認にも使えて便利かも。

~~~ruby
class Foo
  class Bar
    # do something
  end
end

Foo.class_exists?('Bar')
#=> true
Foo.class_exists?('Hoge')
#=> false
~~~