OmniAICreator/Qiita-1.07M huggingface dataset:
tmux 1.8 + Mac or X 環境 + zsh or fish でクリップボード設定


会社では Mac + fish、
自宅では Ubuntu + fish, Mac + zsh と、
不思議な環境で作業しており、tmux のクリップボード設定ではまったのでメモ。

-

「[tmuxのバージョンを1.8にアップデートして、クリップボードの設定](http://qiita.com/kkabetani/items/e37ac1e4e0b53c418a35)」を基本に設定を行う。

また Mac では、下記も設定しておかないと、ターミナル上で Vim を使うときにキーバインドが反応しなくて困った。

```
set-option -g default-command "reattach-to-user-namespace -l $SHELL"
```

Mac は以上で問題ないが、共通の設定を Ubuntu 環境でも使いまわそうとすると `reattach-to-user-namespace` がない為、default-command の時点で強制終了する。

ならば `reattach-to-user-namespace` があるかどうかを判断すれば良いと下記の設定をすると、今度は fish でコケる（zsh では問題ない）。

```
set -g default-command "which reattach-to-user-namespace >/dev/null 2>&1 && reattach-to-user-namespace -l $SHELL"
```

これは fish の文法が他のシェルスクリプトと異なっているのが原因。`&&` は `;and` としないといけない。

二つのシェルでも使える様にするにはどうしたら良いのか…

##別にシェルスクリプト用意して、そいつを実行したら良いじゃない

て事で、新たにシェルスクリプトを書いて対応した。

~/.tmux
├── bin
│   ├── reattach-to-user-namespace
│   └── tmux-copy
└── tmux.conf -> ~/.tmux.conf

```~/.tmux/bin/reattach-to-user-namespace
#!/bin/bash

if type reattach-to-user-namespace >/dev/null 2>&1; then
  reattach-to-user-namespace $@
else
  exec $@
fi
```

```~/.tmux/bin/tmux-copy
#!/bin/bash

if type pbcopy >/dev/null 2>&1; then
  pbcopy
elif type xclip >/dev/null 2>&1; then
  xclip -sel c
elif type xsel >/dev/null 2>&1; then
  xsel -ib
fi
```

```.tmux.conf
# Setup 'v' to begin selection as in Vim
bind-key -t vi-copy v begin-selection
bind-key -t vi-copy y copy-pipe '~/.tmux/bin/reattach-to-user-namespace ~/.tmux/bin/tmux-copy'

# Update default binding of `Enter` to also use copy-pipe
unbind -t vi-copy Enter
bind-key -t vi-copy Enter copy-pipe '~/.tmux/bin/reattach-to-user-namespace ~/.tmux/bin/tmux-copy'

set-option -g default-command '~/.tmux/bin/reattach-to-user-namespace -l $SHELL'
```

`~/.tmux/bin/reattach-to-user-namespace` と `~/.tmux/bin/tmux-copy` に実行権限付けてあげる。

-

参考：[Way to ignore this script if not on OS X?](https://github.com/ChrisJohnsen/tmux-MacOSX-pasteboard/issues/8)
辻のしんにょうの点

見る人の入れているフォントに依存する問題で、Windows Vista や WIndows 7 などを使用している場合、標準のフォントでは点2つになってしまいます。
互換フォントをインストールすることで個別の環境ごとに対処できます。

Windows Vista、Windows Server 2008、Windows 7 および Windows Server 2008 R2 で旧 JIS90 文字セットを使用する方法
http://support.microsoft.com/kb/927490/ja

チャク部 - Wikipedia 「3 一点之繞と二点之繞」
http://ja.wikipedia.org/wiki/%E3%83%81%E3%83%A3%E3%82%AF%E9%83%A8#.E4.B8.80.E7.82.B9.E4.B9.8B.E7.B9.9E.E3.81.A8.E4.BA.8C.E7.82.B9.E4.B9.8B.E7.B9.9E
Django管理サイトのチューニング


Djangoは管理者ページが強力なのが良い所だが、適当に使ってるとORMが雑なSQLを発行してしまうのでケアする。
まだ使い初めたばかりなので、適宜追加していく。

## querysetを上書きして一覧ページのSQLを最適化する

list_displayにForeignKeyのフィールドを含んでいる場合 _select_related_ が有効になる。が _select_related_ は __null=True__ なFKフィールドのリレーションを辿らないため、レコードの数だけ個別のSQLで対象を取得してしまう。よって一覧ページを開いた時にSELECT文が400回ぐらい発行されたりする。
また、 _select_related_ は __null=False__ なFKフィールドをどこまでも辿るため、10個や20個のテーブルとJOINするSQLになる事がある。

うまい具合にやるには _queryset_ を自分で定義する。これで必要最低限なだけJOINさせる事ができる。

```python:admin.py
class UserRelationshipAdmin(admin.ModelAdmin):
    list_display = ('id', 'from_user', 'to_user', 'is_block', 'is_friend', 'created_at')
    
    def queryset(self, request):
        return super(UserRelationshipAdmin,
                 self).queryset(request).select_related('from_user', 'to_user')
```

## 件数が多い項目は raw_id_fields を指定する

ForeignKeyやchoicesフィールドはデフォルトでは詳細ページでプルダウン(select要素)で表示される。数万件になるテーブルが参照先になっている場合はえらい事になるので、 __raw_id_fields__ に指定するとテキストボックス + ラベル表示にしてくれる。

```python:admin.py
class UserProfileAdmin(admin.ModelAdmin):
    raw_id_fields = ('user',)
```

公式ドキュメントではこちらに記述がある
https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.raw_id_fields
irbの履歴を保存する


irbはちょっと試してみる分には便利なんですが、
いつも何を入力したか忘れてしまうので、
まとめてスクリプトに保存しようとするとちょっと面倒です。

そこで、~/.irbrcに以下のように書くと、
~/.irb_historyに履歴が残るようになります。

そこから必要なところを抜き出してあげることで、
簡単にスクリプトを作ることができます。

```ruby
require 'irb/completion'
require 'irb/ext/save-history'

IRB.conf[:SAVE_HISTORY] = 10000
IRB.conf[:HISTORY_FILE] = File.expand_path('~/.irb_history') 
```
Mac OS Xでのvagrant運用


## はじめに

vagrant + virtualboxはコマンドラインベースでバーチャルマシンを立ち上げ、ソフトウェアのテストができる便利なツールだ。ただ、chefなどとの組み合わせも書いているページが多く、いろいろなページに分散して情報が載っていて不便なので、自分が使うとこだけログ代わりにまとめていくことにする。

## インストール

VirtualBoxとVagrantをインストールする。

* https://www.virtualbox.org/wiki/Downloads
* http://downloads.vagrantup.com/

それぞれのサイトから、dmgを持ってきて、それぞれインストールする。

## セットアップ

セットアップは基本的に以下の手順で行う。

* 仮想環境の登録
* ハンドル用のディレクトリの作成と初期化

### 仮想環境の登録

仮想環境は、外からダウンロードして登録するらしい。以下のサイトにいろいろな仮想環境（Linuxディストリビューション）がころがっているので、必要な環境を登録しておく。

* http://www.vagrantbox.es/

ここでは、Ubuntu12.04をダウンロードして登録することにする。

```
$ vagrant box add ubuntu12.04 http://cloud-images.ubuntu.com/vagrant/precise/current/precise-server-cloudimg-i386-vagrant-disk1.box
```

4つめの引数は登録名になるので、自分で分かりやすい登録名を登録しておきましょう。ubuntuの複数のバージョンを使いたい場合など、"ubuntu"などという名前で登録すると後で面倒になります。また、ダウンロードするため、登録にはそれなりの時間がかかるので、まとまった時間を確保して行いましょう。

### ハンドル用のディレクトリの作成と初期化

ホームディレクトリにでも、vagrantというディレクトリを作って、初期化する。

```
$ mkdir vagrant
$ cd vagrant
$ vagrant init ubuntu12.04
```

登録されたいずれかの環境で初期化するので、複数の環境を運用する場合は、ディレクトリ名を考えましょう。

## 基本の使い方

基本的な使い方は以下の通りである

### 仮想環境の立ち上げ

```
$ vagrant up
```

### 仮想環境へのアクセス

```
$ vagrant ssh
```

### 仮想環境の停止

```
$ vagrant halt
```

### 仮想環境のサスペンド

```
$ vagrant suspend
```

## ロールバックとスナップショット

基本的な使い方はできたとはいえ、本当にやりたいのは、クリーンインストール環境でソフトウェアの確認を行いたいことだったりするので、ロールバックやスナップショットの機能を入れる

```
$ vagrant plugin install sahara
$ vagrant plugin install vagrant-vbox-snapshot
```

### ロールバック

ロールバックを試すには、

1. sandboxモードに入る
1. 適当に作業
1. 正否によって以下を実行
	* 失敗してロールバックしたい場合、ロールバックを実行
	* 成功して保存したい場合は現在の状態を反映する

という手順を踏む。以下、必要になるコマンドを示す。

#### sandboxモードに入る

```
$ vagrant sandbox on
```

#### ロールバック

```
$ vagrant sandbox rollback
```

#### 変更を反映

```
$ vagrant sandbox commit
```

### スナップショット

スナップショットは、仮想マシンのある状態を保存しておく機能だ。環境構築や共通の作業をしたところまでのスナップショットをとっておき、そのスナップショットを使って環境を作ると、同じ手順を何回も繰り返さずに済み、便利である。

#### Snapshotの作成

```
$ vargrant snapshot take hoge
```

#### Snapshotの確認

```
$ vagrant snapshot list
```

#### 最新のSnapshotへ戻す

```
$ vagrant snapshot back
```

#### 特的のSnapshotへ戻す

```
$ vagrant snapshot go hoge
```


### ssh-configの設定

指定ディレクトリに入れなくても、立ち上げた仮想環境にsshログインできるように設定をconfigファイルに書き込むと楽です。また、X11を使ったアクセスなどをしたい場合に必要になります。


```
$ vagrant ssh-config --host ubuntu12.04 >> ~/.ssh/config
```

## 仮想環境のパッケージ化

すべての環境に必要なソフトウェアのインストールを一からやるのは効率が悪い。そこで、一定の作業を終えた仮想環境をパッケージ化して他の仮想環境に適用できると便利だ。それを実行するのが以下のコマンド

```
$ vagrant package
$ vagrant box add copy package.box
```

一つ目のコマンドで、まず現在の仮想環境のコピーがpackage.boxという名前で作成される。二つ目のコマンドでは、生成されたpackage.boxに基づいて、新しい環境copyを作成している。これで、一から環境をインストールすることなく、作業を開始できる。
Windows版SublimeText2のビルドシステムから他アプリのGUIを起動できない問題の回避

すごくニッチなノウハウ。なんだけど、刺さる人には刺さる気がするので、シェアしときます。
[SublimeText ビルドシステムのリファレンス](http://sublimetext.info/docs/en/reference/build_systems.html)を見ると

>cmd
>　Array containing the command to run and its desired arguments.
>　　Note
>　　Under Windows, GUIs are supressed.

と書いてあって、どういうわけかWindows版だけ cmd からの GUI 起動が制限されています。実際、
```"cmd":["start", "${file_base_name}.swf"]```
みたいに start コマンドでファイルを開けようとしても、対応するアプリが起動してくれません。また、直接exeを指定
```"cmd":["...flashplayer.exe", "${file_base_name}.swf"]```
してもダメ。


ですが、Sublime Text からバッチファイルを起動して、バッチファイルからGUIを起動したらうまく動きました。

まず、引数を受け取ってstartコマンドするだけの簡単なバッチファイルを作って、

```bat:run.bat
start %1
```

これを Sublime Text のPackages/User フォルダに保存。
で、ビルドシステムのコマンド内から
```"cmd": [ "${packages}\\User\\run.bat", "${file_base_name}.swf"]```
とバッチファイルを呼び出せば、無事他アプリのGUIを起動できます。
compassで独自フレームワークを登録する

フレームワーク的なものをcompassに登録するときのメモ。

ディレクトリ構成の例

```
scss/
    |_ extensions/
              |_ cs-framework/
                          |_ lib/
                          |      |_ cs-framework.rb
                          |_ stylesheets/
                                 |_ _cs-framework.scss
                                 |_ _some-mixin.scss
                                 |_ _some-function.scss
```

config.rbからフレームワークのメインのファイルを呼ぶ。

```ruby:config.rb
extensions_dir = "./scss/extensions"
require "#{extensions_dir}/cs-framework/lib/cs-framework.rb"
```

メインのファイル内でCompass::Frameworks.registerを使って登録する。
下の場合、ひとつ上の階層がルートディレクトリになる。

```ruby:cs-framework.rb
require 'compass'

#! cs-framework - v0.0.1
# http://cs-script.com/
# Copyright (c) mamoida 2013 ; MIT Licensed

extension_dir = File.expand_path(File.join(File.dirname(__FILE__), ".."))
Compass::Frameworks.register('cs-framework', :path => extension_dir)

module CsFramework
  VERSION = "0.0.1"
  DATE = "2012-08-13"
end

module Sass::Script::Functions
    def replaceToUnderscore(string)
        assert_type string, :String
        Sass::Script::String.new(string.value.gsub(/\-/,'_'))
    end
    declare :replaceToUnderscore,:args=>[:string]
end

module Sass::Script::Functions
    def replaceToHyphen(string)
        assert_type string, :String
        Sass::Script::String.new(string.value.gsub(/\_/,'-'))
    end
    declare :replaceToHyphen,:args=>[:string]
end
```

ついでに、ヘルパー系の関数も書いておくと便利。
Zabbix 小ネタ: バックアップ取ったデータとphp frontendだけの構成

誰もお薦めしませんけど。

1.8 から 2.0 に移すホストがあったんですが、そんときに1.8のMySQLのダンプが手元に残ったので、じゃぁそれを別のホストに移してphpで見るだけ見るとかいう需要あるんかな、と思ってやってみました。Zabbix 1.8系、MySQLです。

# 前提

Zabbixのバージョンは一致させましょう。今回は 12.04 LTSから12.04 LTSでバージョンに変化はなかった (1.8.11-1) のですが、うまくいくかどうかは状況によります (データベースのスキーマを考えれば多分大丈夫だけどな

# 作業

zabbix.sql というダンプ結果があるとして、とりあえずテーブルとユーザだけ作ります

```
mysql> create database zabbix character set utf8 collate utf8_bin;
mysql> GRANT ALL ON zabbix.* TO zabbix@'localhost' IDENTIFIED BY '(password)';
```

```
> mysql -u zabbix -p zabbix < zabbix.sql
```

して

```
# apt-get install zabbix-proxy-mysql
```

以上(早

なお、今回公式のdebパッケージではなくてUbuntu 12.04 LTSの標準の apt-get を用いてインストールしているため、PHP frontend への初回アクセス時に発生するPHPの設定ファイルのチェックが走ってません。zabbixのダッシュボードには警告が表示されます。php.ini 直しましょう。

![zabbix.png](https://qiita-image-store.s3.amazonaws.com/0/14365/5ceb77e4-5bbd-ad9c-9e55-e47da433f0a9.png)

Serverがないので当然ですが、新しいデータは一切発生しないはずです。

塩漬けとして役に立つときもあるかと思います。注意点として、PHPフロントエンドはグラフの描画で「現在時刻まで」のグラフを作るため、すごいいきおいで空白が描画されます。Triggerは発生しません。

![zabbix_graph.png](https://qiita-image-store.s3.amazonaws.com/0/14365/87c3b1c8-93a7-ca30-1ce1-bea5f3079b9f.png)

DB内の古いデータがどう管理されているかは確認してませんが、PHPから消すわけではないと思うので、一応残るかと思います。正直そこまで真面目に考えるべきほどのネタではない気がしますが。

# 注意

2.0 だとZabbix Serverが止まってるぞ、という連絡が入るようです。まぁ、止まってる以前にインストールだにしてないんですけどねｗ
CSS Sprites 生成ツール、Glue で使いそうなオプションのメモ

CSS Sprites の自動生成ツール [Glue](https://glue.readthedocs.org/en/latest/) を試してみたのでメモ。

ディレクトリ構成

``` 
DocumentRoot/
    img/
        sprites-images/
            img1.png
            ...
            img2.png
    css/
```

実行コマンド

```shell-session
# 実行は DocumentRootで
glue img/sprites-images --url '/img' --css='css' --img='img'
```

|オプション | 意味 |
|---|---|
| img/sprites-images | 素材画像が入っているディレクトリ |
| --url '/img' | background-image:url(...) URLの先頭に付くパス |
| --img='img' | 画像の出力先 |
| --css='css' | css の出力先 |


実行結果

```
DocumentRoot/
    img/
        sprites-images/
            img1.png
            ...
            img2.png
        sprites-images.png
    css/
        sprites-images.css
```

画像とcssのファイル名は、素材画像を格納したディレクトリ名が使われるよう。
コマンド実行のたびに、CSSが上書きされるのは嫌なので、LESS か何かでインポートさせるのが良さそう。
LESS で出力するのは `--less` オプション。
MarvericksにしてPILのインストールがコケる件


あまり詳細は詳しくないので概要のみですが。

```sh
$ sudo pip install PIL
```
とかしたら下記のエラーログ。

```
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk/usr/clude/tk.h:78:11: fatal error: 'X11/Xlib.h' file not found

#       include <X11/Xlib.h>

                ^

1 error generated.

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

MacをMarvericksにアップデートしたらPythonのライブラリが行方不明になっちゃっていたので、入れなおしていたら、こんな状況でPILが入りませんでした。

色々ググってみつけたのが、[このあたりのstack overflow](http://stackoverflow.com/questions/19532125/cant-install-pil-after-mac-os-x-10-9)

```sh
$ xcode-select --install
```
してからやれば大丈夫だって。

なるほど。OSアップデートした時にXcodeのコマンドラインツールが消えちゃうのかも。なので入れなおすと大丈夫になるぽい。
compassでscssディレクトリをプロジェクトルート外に設定する

src、tmp、publicを分けるような、ジェネレータ系の構成にしたいときのconfig.rb設定。
project_pathを設定して、sass_dirはそこから相対で指定する。

```ruby:config.rb
http_path = "/"
project_path = "src"
css_dir = "css"
sass_dir = "../scss"
images_dir = "images"
javascripts_dir = "js"

asset_cache_buster :none

if (environment == :production)
  output_style = :compressed
else
  output_style = :expanded
end

relative_assets = true
line_comments = false
```
APNSのpemファイル作成用のシェル関数

APNSのための証明書作成が毎回手間で、しかもミスが起こりやすかったので、関数にした。
といっても作業をまとめたぐらい。

```zsh
function createApnsPem() {
    if [ $# != 2 ]; then
        echo "ArgumentError: wrong number of arguments ($# for 2)"
        echo '  arg1={certificate file name}, arg2={key file name}'
    else
        openssl pkcs12 -clcerts -nokeys -out apns-cert.pem -in $1
        openssl pkcs12 -nocerts -out apns-key.pem -in $2
        openssl rsa -in apns-key.pem -out apns-key-noenc.pem
        cat apns-cert.pem apns-key-noenc.pem > apns.pem
        rm apns-cert.pem apns-key-noenc.pem apns-key.pem
    fi
}
```

第一引数に証明書のファイル名、第二引数に秘密鍵のファイル名を渡せば、最終的なpemファイルが生成される。（途中でパスワードを入力するのみ）

```zsh
$ createApnsPem cert.p12 key.p12
```
Ubuntuのアップデートマネージャに自動的にアップデートしてもらう

Ubuntuのアップデートマネージャが頻繁に「アップデートありまっせ！した方がええんとちゃいまっか！？」と聞いてきて非常に鬱陶しかったので自動的にバックグラウンドで動かそうと思ったら設定場所が非常にわかりにくかったので書いておきます。

## 設定方法

Ubuntuのメインメニューの「検索」から"software sources"と打とうとすると途中で出てくる`Ubuntu ソフトウェアセンター` を開く。

そうすると「アップルからパクりました(ﾃﾍﾍﾟﾛ」なウィンドウが出てくるので、画面の一番上にあるメニューから`[編集] -> [ソフトウェアソース]`を開く。

`[アップデート]` タブを開き「セキュリティのアップデートがあるとき：」の動作を「ダウンロードとインストールを自動的に行う。」を選択して閉じればOK。


これ、ノーヒントで見つけ出せる人がいるのか…？
Mavericks上のXcode 5.0でCommand Line Toolsがない場合

Xcode5.0をインストールして、さーてCommind Line Tools入れようかなーと思い、Preferences > Downloadsで探して見たのですが見当たりません。どうも、Xcode 5.0のMavericksから、インストール方法が変わったようです。
よく調べてないので詳細はわからないですが。

##インストール
```
xcode-select --install
```

## 参考文献
http://stackoverflow.com/questions/19066647/xcode-5-0-error-installing-command-line-tools
Ruby で指定したコマンドがあるか調べる

コマンドが存在するか調べる関数

```ruby:cmd_check.rb
def cmd_exists?( name ) ;` type "#{name}" 2> /dev/null` != "" ; end
alias cmd_exists cmd_exists?
```


仕組みは記事にかきました。

http://takuya-1st.hatenablog.jp/entry/2013/09/10/070000
ターミナルから Kobito へ文字列を送信する


以下のファイルをパスが通った場所に保存し、実行権限をつけておく。

```ruby:kobito
#!/usr/bin/ruby

if File.pipe?(STDIN) && data = STDIN.read
  path = "/tmp/kobito#{Time.now.to_i}.md"
  File.open(path, "w") { |io| io.print data }
  system "open -a Kobito '#{path}'"
  File.delete(path)
end
```

あとは、

```
% history | tail -n 5 | kobito
```

とか、

```
% pbpaste | kobito
```

のように実行すると、Kobito にターミナルから実行結果などを流し込める。コマンドの実行手順とかをメモするときに便利かもしれない。

(Kobito が AppleScript に対応していたりすると、ファイルにいったん書き出したりする必要がなくなるのかもしれない。標準の機能で同様のことができると嬉しいかも)
Rails4.0 x omniauth-facebook で、find_by〜でエラった場合の解決方法


以下のサイト参考にomniauth-facebookを導入してみた。
[OmniAuthで認証機能を作る](http://tech.hatenadiary.jp/entry/2013/05/01/OmniAuth%E3%81%A7%E8%AA%8D%E8%A8%BC%E6%A9%9F%E8%83%BD%E3%82%92%E4%BD%9C%E3%82%8B)

開発環境では平気だったんだけど、Herokuにあげたらエラって、
log見てみたら以下のエラーがあった。

```
NoMethodError (undefined method `find_by_provider_and_uid' for #<Class:0x007fcb2884a328>):
```

find_by_provider_and_uidが定義されてないと。
`session_controller.rb`に書いてある。

```
  def create
    auth = request.env["omniauth.auth"]
    user = User.find_by_provider_and_uid(auth["provider"], auth["uid"]) || User.create_with_omniauth(auth)
    session[:user_id] = user.id
    redirect_to root_path
  end
```

以下のサイトに`find_by`にハッシュ渡して使えって書いてた。
[What's New in Rails 4](http://railscasts.com/episodes/400-what-s-new-in-rails-4?language=ja&view=asciicast)

下のように書きなおしたら使えるようになった。

```
  def create
    auth = request.env["omniauth.auth"]
    user = User.find_by(provider: auth["provider"], uid: auth["uid"]) || User.create_with_omniauth(auth)
    session[:user_id] = user.id
    redirect_to root_path
  end
```

解決！
Alternativa3D:ミップマップを生成せずにテクスチャを表示する

- Alternativa3DのBitmapTextureResourceはMipmapを生成します。
- Mipmapを持たないTextureResourceはTextureMaterialで表示できません。内部的にMipmapを期待している為です。

このため、Mipmapを生成せずにテクスチャを表示するには TextureMaterialとTextureResourceの両方を継承する必要があります。

## NonMipmapBitmapTextureResource
ソース [NonMipmapBitmapTextureResource.as - github](https://github.com/suzumura-ss/stage3d_utils/blob/master/src/info/smoche/alternativa/NonMipmapBitmapTextureResource.as)

upload()でTextureの生成とBitmapDataのアップロードをします。

おまけで 2^nへのリサイズと左右のフリップ機能を入れてあります。

## NonMipmapTextureMaterial
ソース [NonMipmapTextureMaterial.as - github](https://github.com/suzumura-ss/stage3d_utils/blob/master/src/info/smoche/alternativa/NonMipmapTextureMaterial.as)

fragmentShaderのテクスチャをサンプリングする部分で `linear` を指定して、Mipmapを使わないようにします。

おまけでアルファブレンドする機能を入れてあります。
WordPress で長いテキストを省略する

WordPress のフォーマット用関数 `wp_trim_words()` を使えばOK。

```php
echo wp_trim_words( '文字列', 文字数 );
```
英数字もマルチバイトもそれぞれ1文字を「1文字」としてカウントしてくれる。

```php
$text = 'あい1うえお かきくけこ さしすせそ たちつてと';
echo wp_trim_words( $text, 10 );
```
で「あい1うえお かきく…」と表示される。

省略記号はデフォルトで 「&hellip;」`&hellip;` なので、変更したい場合は第3引数で指定する。

```php
$text = 'あい1うえお かきくけこ さしすせそ たちつてと';
echo wp_trim_words( $text, 10, '（以下省略）' ); 
```
とすれば「あい1うえお かきく（以下省略）」と表示される。

もちろん「文字列」は記事タイトルでも何でもOK。

```php
echo wp_trim_words( get_the_title(), 10 ); 
```
git fetchの理解からgit mergeとpullの役割

![photo by yukop](http://farm8.staticflickr.com/7055/7005323884_47475e41f1.jpg)


gitを使い始めるとcommit, push, pullなどはある程度理解出来るようになりますが、<b>fetch</b>ってなんだ？ってなりますよね。

あまり馴染みにくいのは、pullが<b>fetch</b>と<b>merge</b>の両方を組み合わせたコマンドだからなんですね。

```
pull = fetch + merge origin/master
```
# fetchとは
gitの場合、リポジトリはリモートとローカルの２ヶ所あります。fetchとはリモートリポジトリから最新情報をローカルリポジトリに持ってくるコマンドです。
fetchをしても、pullのようにファイルが更新されるわけではありません。
あくまでもローカルリポジトリが更新されるだけです。

もっと詳しくいうと、例えばmasterブランチを使っているのであれば、
<b>origin/masterが更新される</b>ということです。

# masterとorigin/masterの違い
masterは、例えばローカルのファイルを更新してコミットする場合にはmasterに入りますよね。
ローカルの作業ディレクトリと結び付いているのがmasterブランチです。

origin/masterとはリポジトリと結びついているブランチです。
とはいってもorigin/masterを参照するといっても、常に直接リモート側を見ているわけではないのです。
<b>git fetchをすることでorigin/masterが更新</b>されるのですね。

ローカルリポジトリの中にはmasterとorigin/masterの２つそれぞれの情報が置かれていることになります。
fetchを行ったときに新しい更新があったとするとorigin/masterが最新になり、masterはその分の更新がまだ行われていない事になります。
そこでmergeが必要になるんですね。

master ← origin/master　最新情報をマージするわけですね。

#git mergeへ
という理解を持てないと、svnなどを使ってきた人にはどこのブランチをマージするのか？となりますよね。
リモートリポジトリの最新情報をローカルのmasterブランチにマージする必要があります。

```
git merge origin/master
```
ここまで処理を行うことでローカルのファイルが最新状態に更新されます。

#git pull
git pull は上記の工程を一気に行うコマンドでした。
便利なコマンドではありますが、これらの理解をした上で利用することでpullしたときにコンフリクトなどが発生してテンパらずに正しい理解で行動出来ますね。
WordPress、長すぎるタイトルを省略する

WordPressでタイトルを出力する「the_title()」というテンプレートタグは、常にタイトル全体を表示します。

しかし、例えばサイドエリアなどの限られた領域内にタイトルを表示したい場合に、文字数が多いときに省略できると便利です。
そこで、新しいテンプレートタグとして「the_short_title」を追加してみましょう。

テーマフォルダ内の functions.phpを編集して、次のように書き込みます。

```php:functions.php
function the_short_title($length = 20) {
	$ret = get_the_title( $post->ID );
	if ( mb_strlen($ret) > $length ) {
		$ret = mb_substr( $ret, 0, $length ) . '...';
	}
	
	echo $ret;
}
```

そして、テーマ内で次のように記述します。

```php
<?php the_short_title(40); ?>
```

パラメータを指定すればその文字数で、なにも指定しないと20文字で省略されます。

[PR] [WordPress+PHP プログラム開発サポート | anygraphica](http://anygraphica.com/service/wpphp/)
スクロールアニメーションjs

メモ

```js
define(function() {
	var tmScrolling = null;
	var duration = 200;
	return function scrollTo(goal) {
		clearInterval(tmScrolling);

		var start = document.body.scrollTop;
		var startedAt = Date.now();

		tmScrolling = setInterval(function() {
			var now = Date.now();
			var progress = Math.min((now - startedAt) / duration, 1);
			var curTop = goal + (start-goal)*(1-progress);
			document.body.scrollTop = curTop;

			if (progress >= 1) {
				clearInterval(tmScrolling);
			}
		}, 1);
	};
});
```
jasmineでsinon.fakeServerを使うときに気をつけること

[sinon.js](http://sinonjs.org/)を使うと、XMLHttpRequestをテスト用のオブジェクト（実際に通信は行わない）に置き換えることができる。

これがすごい便利で良いのだけど、fakeServerを使った時にはまった。

たとえば、hogeClientを実行すると、なんやかんやあってsomeObjectのsomemethodが呼び出されることをテストしたいとする。

```js
var server = sinon.fakeServer.create();
server.autoRespond = true;
server.respondWith( function( xhr, id ) {
  xhr.respond( 200, null, "..." );
} );

spyOn( someObject, "somemethod" );
hogeClient.request( ... );
expect( someObject.somemethod ).toHaveBeenCalled();
```

といった感じのテストコードになるだろう（実際にはserverの定義とかはbeforeEachとかでやるだろうけど）。autoRespondがtrueになっていると、リクエストを送ると自動的にrespondWithの引数で渡した処理に従い、用意したレスポンスが返ってくる。

やってみればわかるけど、someObject.somemethod内に適当なconsole.logを仕込んでおいて実行すると、console.logの出力的にはsomemethodが呼ばれているのに、toHaveBeenCalledのテストは失敗する。

なんてかなーと思ってsinon.jsのソースコードを見てみる(L3624辺り)と、autoRespondの場合、setTimeoutでレスポンスが返るタイミングが微妙にずれていた。

となると、hogeClient.request()を実行し、その次のexpectを評価した後に、レスポンスが返ってきてコールバックやら何やらが実行されることになるので、当然expect時点はテスト対象のメソッドは一度も呼び出されていないことになる。

なので、jasmineで書くのであれば、非同期処理のテストを書くのと同じように、

```js
runs( function() {
  var server = sinon.fakeServer.create();
  server.autoRespond = true;
  server.respondWith( function( xhr, id ) {
    xhr.respond( 200, { "content-type": "application/json" }, JSON.stringify( { entries: { ... } ) );
  } );
  spyOn( someObject, "somemethod" );
  hogeClient.request( ... );
} );
waitsFor( function() {
  return someObject.somemethod.wasCalled;
}, "timeout", 3000 );
runs( function() {
  expect( someObject.somemethod ).toHaveBeenCalled();
} );
```

となる。今回のような単純な例だと、waitsForの中でwasCalledを呼んでいる時点で確実にその後のテストは通るので、その後のexpectはあまり意味ないかもしれないが、expect書かないとテストにならんので。

同じような機能でfakeXMLHttpRequestがあるのだけど、これの時はhogeClient.request実行後に明示的にfakeXMLHttpRequestにレスポンスを返すように指示するので、非同期処理の実装を同期的なテストコードでテストできる。そこから推測して、autoRespondを指定すると同期的に返してくれると思ったのが間違い。

ちなみに、1.7.3だとsinon.jsにバグがあって、somemethodの呼び出し回数が1回である、というようなexpectをすると、テストは失敗する。これは、https://github.com/cjohansen/Sinon.JS/pull/320 にissueとして登録されてる現象で、onloadが２回呼ばれるため、結果的にsomemethodも２回呼ばれることになる。もうmasterにmergeされているみたいなんで、そのうち解消されるでしょう。
tmlib-rpg メニューウィンドウの作成つづき

RPGのシステムを作る時に、いろいろメニューのウインドウがあるので…
汎用的に使えるように作ってます。

で、とりあえず、表示選択できるようになったけど
他の部分がいろいろ無いので作成中。

実装したい事の予定

* メニューを行とカラムに分けて表示
* メニューに沢山の項目がある場合のページ処理 or スクロール処理
 * それらをわかりやすくするための、ページネーション とか スクロールバー とか
* 表示／非表示の切り替えとか開く閉じる時のアニメーションとか
* いろいろなカーソルにカスタマイズできるようにする
* タッチ操作、マウス操作への対応

とかとか…

```coffeescript:SceneMain.coffee

tm.define 'SceneMain',
  superClass: rpg.SceneBase

  # 初期化
  init: ->
    # 親の初期化
    @superInit(name:'SceneMain')
    
    @window1 = rpg.WindowMenu
      active: true
      cols: 1
      rows: 2
      menus: [
        {name:'Menu1',fn:-> console.log '1'}
        {name:'Menu2',fn:-> console.log '2'}
      ]
    @addChild @window1

    @window2 = rpg.WindowMenu
      active: true
      cols: 2
      rows: 1
      x: @window1.right
      menus: [
        {name:'Menu1',fn:-> console.log '1'}
        {name:'Menu2',fn:-> console.log '2'}
      ]
    @addChild @window2

    @window3 = rpg.WindowMenu
      active: true
      cols: 2
      rows: 2
      y: @window1.bottom
      menus: [
        {name:'Menu1',fn:-> console.log '1'}
        {name:'Menu2',fn:-> console.log '2'}
        {name:'Menu3',fn:-> console.log '3'}
      ]
    @addChild @window3

    @window4 = rpg.WindowMenu
      active: true
      cols: 2
      rows: 2
      x: @window3.right
      y: @window3.top
      menus: [
        {name:'Menu1',fn:-> console.log '1'}
        {name:'Menu2',fn:-> console.log '2'}
        {name:'Menu3',fn:-> console.log '3'}
        {name:'Menu4',fn:-> console.log '4'}
      ]
    @addChild @window4

    @window5 = rpg.WindowMenu
      active: true
      cols: 3
      rows: 3
      x: @window3.left
      y: @window3.bottom
      menus: [
        {name:'Menu1',fn:-> console.log '1'}
        {name:'Menu2',fn:-> console.log '2'}
        {name:'Menu3',fn:-> console.log '3'}
        {name:'Menu4',fn:-> console.log '4'}
        {name:'Menu5',fn:-> console.log '5'}
      ]
    @addChild @window5
```

![ss20131030.png](https://qiita-image-store.s3.amazonaws.com/0/30417/313645eb-45be-7623-ecd2-1393b7648a7f.png)

左端にカーソルがあるときに、さらに左を押した場合にどう動かすか？とか
カラムとか行によってさらに変わるので…いろいろ大変
うまい方法ないかな～とか思いつつ、一生懸命条件分岐で普通に…操作です。

この処理自体は、RGSS(Ruby)で以前同じのを書いてるので、それを見ながら作成＞＜

まだページネーションが出来てないけど、行カラムはこれで良さそうなので
そろそろタッチ操作に対応しようとしたけど、なんかうまく行かず…

しらべてみたらどうも tmlib.js 0.1.8 では、origin（表示位置の起点）を0,0（左上）にすると、タッチイベントの範囲判定がうまく行かないみたい。
origin は、デフォルトが中心(0.5,0.5)になってて、アクションとかシューティングとかだと調子良い感じだと思う。
RPGにはあまり関係なさそうだけど…アニメーションをさせるようになったら便利かな～？
で、ちょっと修正したら出来たけど…最新のdevelopのブランチでは、すでに直ってる様だったので…
急遽、時期バージョン？の 0.2.0 対応にすることにしました。

AssetManager が変わってて、以前書いた json のロード処理とかいろいろ直したけど、それ以外は普通に動きました。namespace とかも一応、見える範囲は直したつもり。
（まだクラス数も１０数個なので今のうちに…）

あとは、スマホで動作確認も今のうちにしておくかな？
vagrantでVirtualBox4.3用のbox作った (CentOS5.10)

* 使用した[kickstart](https://www.dropbox.com/s/13fjisg0o2szths/c5vagran.cfg)

ダウンロード
==========



* [CentOS5.10_x86_64_VirtualBox4.3.box 460MB](https://www.dropbox.com/s/1sn1fnywiatlkek/CentOS5.10_x86_64_VirtualBox4.3.box)



----

上記はリンク切れのため以下が良いかと。

```bash:centos5.11-i386のイメージ
vagrant init redjack/centos5-i386
vagrant up --provider virtualbox
```
jMockitがいいよ Verification編

えー、前回に引き続きjMockitのお話で、今回はモックの呼ばれっぷりをチェックするAPIの紹介です。

### 前回までのあらすじ

前回の例だと

```java
new Expectations(){{
   fuga.getName(); result="ホゲ男";
}}
```

というのを使っていましたが、親戚でNonStrictExpectationsというクラスがあります。
何が違うのかというと、実はExpectationsはモックの挙動定義だけではなくExpectationsに書かれたモックメソッドが呼ばれることをチェックもしています。

なので、

```java
hoge.doAnything();
```

を実行した時にdoAnything()の内部でfuga.getName()がコールされないとテストは失敗します。
こんな風にExpectationsで

* fuga.getNameは”ホゲ男”という文字列値を返す
* fuga.getNameが必ずcallされることをチェックする

ということができます。

### Verifications あらたなる旅立ち

…が、ですよ。callされていることのチェックは別途明示的に書きたいものです。
そんな時にVerificationsが使えます。

```java:HogeTest.java
new NonStrictExpectations(){{
   fuga.getName(); result="ホゲ男";
}};

hoge.doAnything();

new Verifications(){{
   fuga.getName(); times=1;
}};
```

### Verifications そして forEachInvocation 伝説へ

これまでモックメソッドは引数なしでしたが、モックメソッドにどんな値が渡されたかテストしたい時もありますよね。

```java:Hoge.java
public void sumAnything(int x) {
    int y = x + 10;
    Fuga fuga = new Fuga();
    fuga.apply(y);
}
```

```java:HogeTest.java
@Test
public void testSumAnyThing() {
    new NonStrictExpectations(){{
        fuga.apply(anyInt);
    }};

    hoge.sumAnything(5);

    new Verifications(){{
        fuga.apply(anyInt); times=1;
        forEachInvocation = new Object() {
            public void apply(int i) {
                 assertThat(i ,is(15));
            }
        }
    }}
}
```

returnValueを返すメソッドなら普通にassert出来るのですが、上記例のsumAnything()のようなvoidだと何をassertして良いやら。
こんな時に中で何やっているかをテストするのに便利ですね。

…ってチュートリアルから記述が消えた？？

### Verifications もう一つの方法 withCapture

モックメソッドに渡ってきた引数をassertする方法にひとつ方法がありました。
http://jmockit.googlecode.com/svn/trunk/www/tutorial/BehaviorBasedTesting.html#withCapture

こっちのほうが簡単かも。

```java:HogeTest.java
@Test
public void testSumAnyThing() {
    new NonStrictExpectations(){{
        fuga.apply(anyInt);
    }};

    hoge.sumAnything(5);

    new Verifications(){{
        int num;
        fuga.apply(num=withCapture()); times=1;
        assertThat(num ,is(15));
    }}
}
```


次回は、

* 部分モッキング
* テスト対象のクラスのprivateメソッドの部分モッキング

の二本でお送りします。　んっがっんん
1分でWebサイトを分析して高速化のための具体的な施策を見つける

パフォーマンスを計測してボトルネックを見つけて改善するというのは正論だけど、とてもめんどくさい。
とりあえず、ツールに頼ろう。

##1.ChromeのPageSpeed Insightsをインストールする
Googleが作成したパフォーマンス改善のためのヒントをくれるChrome plugin。
下記からChromeにインストールする。
https://chrome.google.com/webstore/detail/pagespeed-insights-by-goo/gplegfbjlmmehdoakndmohflojccocli

##2.分析する
command+shift+iでChromeのDevToolsを起動すると、PageSpeedのタブができているので、そのタブにある「分析を開始」をクリックすると、分析を始める。
![スクリーンショット 2013-10-31 22.21.49.png](https://qiita-image-store.s3.amazonaws.com/0/1630/f2a4f317-d641-593e-ed90-190cc563538a.png "スクリーンショット 2013-10-31 22.21.49.png")
##3.施策を見る
日本語で優先順位付けされた提案が書かれている。

![スクリーンショット 2013-10-31 22.04.15.png](https://qiita-image-store.s3.amazonaws.com/0/1630/f3310b7b-6476-cf22-4b73-7c624628e415.png "スクリーンショット 2013-10-31 22.04.15.png")

##4.具体的に何をすべきか見る
どこを直せばどれだけ改善できるかわかるようになっている。
![スクリーンショット 2013-10-31 22.14.11.png](https://qiita-image-store.s3.amazonaws.com/0/1630/6200294d-23dd-6748-dbe7-e3859200fb0e.png "スクリーンショット 2013-10-31 22.14.11.png")
Homebrewをインストールしたときに出るWarningの対処

Homebrewのインストール後に以下のコマンドで動作確認をしたときに

```
$ brew doctor
```

```
Your system is raring to brew.
```

ではなくて大量のWarningが出たときの対処を覚えている範囲でメモ。

----

前段階として、MacPortsを導入したことがあれば、Homebrewと競合するのでアンインストールすること。

[MacportsのアンインストールとHomebrewの導入 | abeerforyou.com](http://abeerforyou.com/?p=334)

----

> Warning: /usr/local/include isn't writable. This can happen if you "sudo make install" software that isn't managed by Homebrew.

> If a brew tries to write a header file to this directory, the install will fail during the link step.

> You should probably chown /usr/local/include

/usr/local/includeに書き込み権限が与えられていない。他のパスも指摘されることがあるがその場合は全部直す。
[username]は現在ログインしているアカウント名に書き替えること。

```
$ sudo chown -R [username] /usr/local/include
```

[osx - Brew doctor says: "Warning: /usr/local/include isn't writable." - Stack Overflow](http://stackoverflow.com/questions/14527521/brew-doctor-says-warning-usr-local-include-isnt-writable)

----

> Warning: You have leftover files from an older version of Xcode.
> You should delete them using:
>   /Developer/Library/uninstall-developer-folder

古いバージョンのXcodeが残っているので一式を削除する。

```
$ sudo /Developer/Library/uninstall-developer-folder
```

[homebrew updateしていなかったでござるの巻 - 東の森](http://morrey22.hatenablog.com/entry/2012/10/11/230936)

----

> Warning: You have uncommitted modifications to Homebrew
> If this a surprise to you, then you should stash these modifications.
> Stashing returns Homebrew to a pristine state but can be undone
> should you later need to do so for some reason.
>     cd /usr/local/Library && git stash && git clean -f

よくわからないがMacPortsでインストールしたときのGitのゴミファイルが残ってるらしい。
Gitをインストールしなおしてから掃除する。

```
cd /usr/local/Library && git stash && git clean -f
```

[homebrew brew doctorトラブルシューティング - bismar's blog](http://bismar.hatenablog.com/entry/2012/12/06/022457)

----

> Warning: Some directories in your path end in a slash.
> Directories in your path should not end in a slash. This can break other
> doctor checks. The following directories should be edited:
>     /opt/local/sbin/

環境変数PATHの最後がスラッシュで終わっているのはおかしいと仰っている。
自動的に書き込まれたPATHを直さなくてはならない。

以下のコマンドを打って.bashrcファイルを開き

```
vim ~/.bashrc
```

書き込まれているPATHの指定の中から、最後がスラッシュになっているものを直す。
vimの編集は

1. [ i ]で編集モード
2. [ Esc ]で編集モードを出る
3. [ : ][ w ][ q ][ Enter ]で上書き保存

保存したらターミナルを一旦終了し、再起動する。

[MacPortsからHomebrewに乗り換えようとしてワーニング吐かれた - あいぼうのぶらぶら日記 in はてな](http://d.hatena.ne.jp/yo_aibou/20121112/1352719113)

[パス（PATH）を通す（Mac OS X 10.5） :: R-STYLES.NET](http://www.r-styles.net/mt-archives/weblog/development/pathmac-os-x-105.html)
FMDBのresultDictionaryが取得できない件



Objective-CのSQLITEラッパー「FMDB」には「resultDictionary」というメソッドがあると聞きました。
FMDBではselect文を投げたらFMResultSetで返ってきますが、それをNSDictionaryに変換できるそうです。

しかしこれがうまくいかない。

```objectivec
FMResultSet *results = [_db executeQuery:SQL];
NSDictionary *dic = [results resultDictionary];
```

このように取得しようとしてもdicはnilになります。
小一時間悩んで行き着いた正解はこちら。

```objectivec
FMResultSet *results = [_db executeQuery:SQL];
while ([results next]) {
    NSDictionary *dic = [results resultDictionary];
}
```

考えてみたらFMResultSetは配列（のようなもの）に辞書（のようなもの）が入ってるので、当たり前といえば当たり前ですけどね。

このdicをArrayに放り込んだら扱いやすい配列のできあがりです。
SVNからgitへの移行

# SVNからgitへの移行

社内プロジェクトをSVNからGitLab上で管理されているgitリポジトリに移行してみましたのでその手順をまとめてみます。

まずSVNのワーキングディレクトリで下記を実行します。

```bash
$ svn log --xml | grep "<author" | sort -u | perl -pe 's/<author>(.*?)<\/author>/$1 = /' > users.txt
```

最近のMacではgrep -Pオプションがなくなったらしいので、[Gitへの移行](http://git-scm.com/book/ja/ch8-2.html)の手順から若干アレンジしています。そうしたらusers.txtにSVNにコミットしたユーザの一覧ができるので、名前とメールアドレスを設定していきます。

```
Subversionのユーザ名 = Gitのユーザ名 <メールアドレス> 
```

こんな感じです。GitLabで管理したかったので、自分の知ってる人であるような気がするユーザ名はGitLab上の名前とメールアドレスを一致させました。

次に、ワーキングディレクトリの外に別のディレクトリを作ります。この作業ではSVNから取り直すみたいなのでもうワーキングディレクトリは用済みです。

```bash
$ git svn clone --no-metadata -A users.txt -t tags -b branches -T trunk http://hogehoge.jp/svn
```

こんな感じみたいです。で、ここでエラーがいろいろでます。

## Author: ***** not defined in users.txt file の対処法

なぜか知らないけどusers.txtに入っていないみたいです。users.txtに手作業で指摘されたユーザを追加してコマンド再実行でうまくいきました。

## Found possible branch point の対処法

gitリポジトリの中の.git/configから

```
branches = branches/*:refs/remotes/svn/branches/*
tags = tags/*:refs/remotes/svn/tags/*
```

みたいなのを消して再実行するとうまくいきました（[参考](http://stackoverflow.com/questions/15387812/git-svn-found-possible-branch-point)）。

あとはブランチとタグをもってくるんですが、[Git - Git への移行](http://git-scm.com/book/ja/ch8-2.html)の通りで特に難なくできたのでこっちを見て下さい。

また、こうするとファイルのタイムスタンプが作業した時刻になってしまうため、 [SVNからGitに移行した後にやること - Qiita [キータ]](http://qiita.com/Koichi-Kobayashi@github/items/47e37f02268d402e38a5) に書いてある方法でコミットしたタイムスタンプに変更できます。

# 参考文献

* [Git - Git への移行](http://git-scm.com/book/ja/ch8-2.html)
* [SubversionのリポジトリからGitに移行する - 発声練習](http://d.hatena.ne.jp/next49/20130408/p2)
* [git svn - Git Svn - Found possible branch point - Stack Overflow](http://stackoverflow.com/questions/15387812/git-svn-found-possible-branch-point)
GradleのCoveturaPlugin設定

```gradle
apply plugin: 'java'
apply plugin: 'groovy'

buildscript {
  repositories {
    mavenCentral()
  }
  dependencies {
    classpath "net.saliman:gradle-cobertura-plugin:2.0.0"
  }
  buildDir = 'target'
}

apply plugin: 'cobertura'

group = 'org.me'
version = '0.1'
sourceCompatibility = 1.7
targetCompatibility = 1.7
def isOnJenkins = System.properties.containsKey('jenkins')

cobertura.coverageFormats = (isOnJenkins)?['xml']:['html']
```

Jenkinsの設定でswitchesに<code>-Djenkins</code>と設定しておくとxmlファイルでレポートされる。
MongoDBのUI付き管理ツールphpMoAdminの導入

チームにニーズがあるってことで、MongoDBのUI付き管理ツールを探してみる。
MongoDBの公式サイトでもたくさん紹介されてるね。
http://docs.mongodb.org/ecosystem/tools/administration-interfaces/

ひとまず開発環境にphpMoAdminを入れてみた。

phpMoAdmin
http://phpmoadmin.com/

名前のネタ元のphpMyAdminよろしく、1ファイルのphpで構成されている。

●インストールはお手軽。
上記ページからダウンロードしてきたzipを解凍して出てくるファイル

　　moadmin.php

をphpが動くwwwサーバの公開領域に配置して、MongoDBへの接続情報を書きこんであげるだけ。




●MongoDBへの接続情報
db-server1-3の3台構成なReplicaSetに接続する場合は
下記の2定数に必要な情報を設定してあげればOK。


　　MONGO_CONNECTIONに接続情報
　　REPLICA_SETにtrue


```php:moadmin.php
/**
 * To connect to a remote or authenticated Mongo instance, define the connection string in the MONGO_CONNECTION constant
 * mongodb://[username:password@]host1[:port1][,host2[:port2:],...]
 * If you do not know what this means then it is not relevant to your application and you can safely leave it as-is
 */
define('MONGO_CONNECTION', 'mongodb://db-server1:27017,db-server1:27018,db-server1:27019');

/**
 * Set to true when connecting to a Mongo replicaSet
 * If you do not know what this means then it is not relevant to your application and you can safely leave it as-is
 */
define('REPLICA_SET', true);
```
ーーーー

各Collection内のDocumentの構成(※)をグルーピングしたい　ってのが本当の目的なんだけど、既存のプロダクトにそんな感じの機能を持ったものってあるのかな？
※既存機能のバグによりカラム名にブレがあるのだ。 例えば、'data'ってカラムであるべきところに'dada'ってカラム名のデータが混ざってるってこと。それを見つけて潰したい。

なけりゃデータぶっこ抜いて整形してグルーピングするだけやけど。
gem install charlock_holmesでicu4cがないよって


```bash
uname -r
#=> 3.2.29-48.63.amzn1.x86_64
ruby -v
#=> ruby 2.0.0p195 (2013-05-14 revision 40734) [x86_64-linux]
```

すごく名前のセンスがいいGem
https://github.com/brianmario/charlock_holmes


```
yum install icu
```

もう入ってるんだけどな。
なんでだろうなって思って`yum search icu`したら、これかなと思って、

```
yum install libicu-devel
```

いれたら入った。

メモ。
what should i actually do when ruby calls "do"???

こんにちは。
今日もだらだらと技術をテキトーにつまんでは食いつまんでは食いしております。

enchant.jsをまあ大体習熟した(飽きたともいう)ので
今更ながらruby on rails をやりだしました。下記を参考に。
<a href="http://www.techscore.com/tech/Ruby/Rails/quick-start/Rails4/4-1/">4. scaffoldを利用した開発(1) | TECHSCORE(テックスコア)</a>

おりゃー、scaffold!(足場!)
これはすごい。

さてどんなコードが出力されるのかな？

```ruby
#Controllerね。
  def index
    @items = Item.all

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @items }
    end
  end
```

はてなんじゃこりゃ。。。(´・ω・｀) 

respond_to do |format| とはなんぞや。。。
と思って調べたらすぐ理解できた。

do使用のサンプルコード。

```ruby
["aaa ","bbb "].each do |x|
  p x # aaa bbb と表示される
end
```

forで書き換える。

```ruby
for x in ["aaa ","bbb "]
  print x
end
```

だから多分respond_toってメソッドの結果が順にformatに入って
do〜endのブロックで実行されるのね。なるほどね。

で
<a href="http://stackoverflow.com/questions/9492362/rails-how-does-the-respond-to-block-work">Rails: How does the respond_to block work? - Stack Overflow</a>

```
respond_to is a Rails helper method that is attached to the Controller class (or rather, its super class). 
It is referencing the response that will be sent to the View (which is going to the browser).
```

だからdo〜endでViewに送られる何かに処理を行ってるんだろう。

その辺はおいおい理解する。
「/usr/bin/ld: cannot find -lmysqlclient」が出たときにやったこと


# はじめに
「gem install mysql2」をする際に「/usr/bin/ld: cannot find -lmysqlclient」というエラーで数時間ハマった。

# 基本的には

「/usr/bin/ld: cannot find」というエラーは「-l」に続くライブラリをインストールすれば解消するらしい
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/a115makeerror.html

# ライブラリのインストール
公式
http://dev.mysql.com/doc/refman/4.1/ja/linux-rpm.html

# でも、解消されない場合
インストールはされたはずなのに同じエラーが出続ける・・・
原因は、/usr/lib64/にlibmysql関係のファイルが存在しないことだった。
参照されるフォルダには何も変化が無いためエラーが解消できなかったという。

# 対処手順

## 参照されるフォルダを確認する
```/usr/lib64/にlibmysql関係のファイルが存在しない
# ls -la /usr/lib64/libmysqlclient*
ls: /usr/lib64/aaa*: そのようなファイルやディレクトリはありません
```

## インストールされた場所を探す
```ライブラリをインストールされたフォルダ
# ls -la /usr/lib64/mysql/libmysqlclient*
-rw-r--r-- 1 root root 15276160  4月 19  2012 /usr/lib64/mysql/libmysqlclient.a
lrwxrwxrwx 1 root root       24 10月 30 17:11 /usr/lib64/mysql/libmysqlclient.so.15 -> libmysqlclient.so.15.0.0
-rwxr-xr-x 1 root root  1511120 11月 30  2008 /usr/lib64/mysql/libmysqlclient.so.15.0.0
lrwxrwxrwx 1 root root       16 10月 30 16:30 /usr/lib64/mysql/libmysqlclient_r.a -> libmysqlclient.a
lrwxrwxrwx 1 root root       26 10月 30 17:11 /usr/lib64/mysql/libmysqlclient_r.so.15 -> libmysqlclient_r.so.15.0.0
-rwxr-xr-x 1 root root  1518168 11月 30  2008 /usr/lib64/mysql/libmysqlclient_r.so.15.0.0
```

## 参照されるフォルダへコピーする
```コピー
# cp /usr/lib64/mysql/libmysqlclient* /usr/lib64/
```

# 追伸
インフラに関する知識がまだまだ足りないと痛感。。
本来ならシンボリックリンクを張った方が良いと思う。
Can not perform this action after onSaveInstanceStateで落ちる場合の対処法


■発生条件
非同期処中にアプリをバックグラウンドに遷移した状態でDialogFragment#commitを呼ぶ

```java
Dialog dialog = new Dialog();
FragmentTransaction transaction = getSupportFragmentManager.beginTransaction();
transaction.add(dialog, "tagName");
transaction.commitAllowingStateLoss();
```

ダイアログにセットした値が消えても知らない。
setArgumentsで値設定してればとりあえずは消えなかった。
OSX 10.9 Mavericksアップデート後のサーバー設定

#サーバー設定が元に戻る問題
- - -
OS標準搭載のApacheやPHPの設定を使っている場合、Mavericksにアップデートした際に
サーバー設定のすべてがインストールし直されます。
その際、どういう訳かMavericks内のPHPからpgsqlとPDO::pgsqlが削除されていました。
その復元時にはまったところをメモ程度に残しておきます。

##前提条件
- Mavericksに前OSからアップデートした。
- Xcodeのインストールが終わっている。
- homebrew等を使ってPostgreSQLをインストールしてある。
- PHPは標準搭載の物を使っている。

##httpd.confの設定
前バージョンのOSの設定が/etc/apache2/httpd.conf~previousという名前で保存されているので、  
新しい物を設定しなおすか、前述のファイルとdiffを取って復元するか好きな方で

##pgsqlとPDO::pgsqlの設定
こちらのサイトを参考にしながら復元しました。

[http://blog.rupey.org/post/63221360055/adding-postgres-support-to-php-on-os-x-mavericks](http://blog.rupey.org/post/63221360055/adding-postgres-support-to-php-on-os-x-mavericks)

###PHPのダウンロード
 標準搭載のphpにはpgsqlもPDO::pgsqlも入ってないので、phpのソースファイルを[ダウンロード](http://ca3.php.net/releases/)します。

###PHPを解答・所定の場所へ移動
PHPソースファイルの解答

```
% cd ~/Download/
% tar -jxvf php-5.4.20.tar.bz2
```

PHPのソースファイルを所定の場所に移動

```
% sudo mkdir -p /usr/include/
% sudo mv php-5.4.20 /usr/include/php
```

###PDO::pgsql、pgsqlのエクスモジュールを作成
PHP configureを使ってビルドする前にモジュールの確認

```
% cd /usr/include/php
% ./configure --without-iconv
```

php.iniが無い場合はコピーしておく

```
% sudo cp /etc/php.ini.default /etc/php.ini
```

pgsqlのモジュールをビルド

```
% cd ext/pgsql
% phpize
% ./configure
% make
% sudo make install
```

続いてPDO::pgsqlのモジュールをビルド

```
% cd ../../ext/pdo_pgsql
% phpize
% ./configure
% make
% sudo make install
```

これで、pgsqlとPDO::pgsqlのモジュールファイルが
/usr/lib/php/extensions/no-debug-non-zts-20100525
に作成されています。

あとはphp.iniにて

```
extension=pgsql.so
extension=pdo_pgsql.so
```

上記を追加し、Apatchを再起動してphpinfo()を確認してください。
rJava をロードしようとしたときのエラー #rstatsj

```r:実行コード
library(rJava)
```

> Error :  .onLoad は loadNamespace()（'rJava' に対する）の中で失敗しました、詳細は: 
>   call: inDL(x, as.logical(local), as.logical(now), ...) 
>   error: unable to load shared object 'C:/R/win-library/3.0/rJava/libs/x64/rJava.dll':
>   LoadLibrary failure:  指定されたモジュールが見つかりません。

確認すると、rJava.dll は指定のフォルダにあるのでおかしいですねぇ。。

http://sohgetsu.blogspot.jp/2010/07/r-rjava.html

上記サイトを参考に、環境変数 Path に

> C:\Program Files\Java\jdk1.7.0_40\jre\bin\server

を追加するといけました。
五角形の遺伝子を並べる

よく論文にある「複数の遺伝子が五角形として並べてある図」をRで描いてみます．

```r:遺伝子のstartとendとstrandから，五角形を描くのに必要な座標を計算する関数
convertToOperon <- function(x1, x2, strand, heightOfOperon=1, ratioOfTriangle=0.3, y1=1){
  y2 <- y1 + heightOfOperon
  y3 <- y1 + heightOfOperon/2
  if(strand == 1){
    xAngle <- (1-ratioOfTriangle)*(x2-x1)+x1
    x <- c(x1, x1, xAngle, x2, xAngle)
    y <- c(y1, y2, y2, y3, y1)
    return(list(x, y))
  }else{
    xAngle <- ratioOfTriangle*(x2-x1)+x1
    x <- c(x1, xAngle, x2, x2, xAngle)
    y <- c(y3, y2, y2, y1, y1)
    return(list(x, y))
  }
}
```

```r:たくさんの遺伝子をまとめて描く関数
# 入力は，複数の遺伝子のstart, end, strand, 色を格納したデータフレーム（dat）と，どこから（start）どこまで（end）
plotOperons <- function(dat, start, end, heightOfOperon=0.7, ratioOfTriangle=0.3, y1=1, lwd=2, xlab="[kb]"){
  genome <- c(start, end)
  height <- c(0,3)
  # Define plot space
  plot(genome, height, type = "n", xlab = xlab, ylab="", axes=F)
  axis(1)
  # Draw horizontal line
  lines(c(start, end), c(y1+heightOfOperon/2, y1+heightOfOperon/2), lwd=lwd)
  if(is.factor(dat[,4])){
    dat[,4] <- as.character(dat[,4])
  }
  for(i in 1:nrow(dat)){
    coo <- convertToOperon(dat[i,1], dat[i,2], dat[i,3], 
                           heightOfOperon=heightOfOperon, 
                           ratioOfTriangle=ratioOfTriangle,
                           y1=y1)
    print(dat[i, 4])
    polygon(coo[[1]], coo[[2]], col=dat[i,4], lwd=lwd)
  }
}
```

```r:入力データ
dat <- data.frame(start=c(5, 50, 70),
                  end=c(30, 60, 90),
                  strand=c(1, -1, 1),
                  color=c("orange", "green", "magenta"))
```

```r:プロット
plotOperons(dat, 0, 100)
```


![図](https://qiita-image-store.s3.amazonaws.com/0/18504/b237b159-569f-08a3-06fa-91d82b18aba9.png)


### 追記
こんなのもあるそうです [genoPlotR](http://genoplotr.r-forge.r-project.org/vignette.php)
道なりの亀

```cpp
//http://qiita.com/Nabetani/items/1de39df381dfeee305ab
//http://nabetani.sakura.ne.jp/hena/ord12aloroturtle/
#include <iostream>
#include <string>
#include <vector>
#include <map>
using namespace std;
typedef pair<int,int> pii;
string v1[]={
	"ABCDEFGHIJK",
	"LMNOPQRSTUV",
	"WXYZabcdefg",
};
string v2[]={
	"jmpsvy147",
	"ilorux036",
	"hknqtwz25",
};
const int D[4][2]={{1,0},{0,1},{-1,0},{0,-1}}; //RDLU
int main(){
	int x,y,i,d,n;
	map<char,map<int,pair<char,int> > >m;
	for(y=0;y<3/*v1.size()*/;y++){
		for(x=0;x<v1[y].size();x++){
			char c=v1[y][x];
			if(x<v1[y].size()-1)m[c][0]=make_pair(v1[y][x+1],0);
			if(y<3/*v1.size()*/-1)m[c][1]=make_pair(v1[y+1][x],1);
			if(x>0)m[c][2]=make_pair(v1[y][x-1],2);
			if(y>0)m[c][3]=make_pair(v1[y-1][x],3);
		}
	}
	for(y=0;y<3/*v2.size()*/;y++){
		for(x=0;x<v2[y].size();x++){
			char c=v2[y][x];
			if(x<v1[y].size()-1)m[c][0]=make_pair(v2[y][x+1],0);
			if(y<3/*v1.size()*/-1)m[c][1]=make_pair(v2[y+1][x],1);
			if(x>0)m[c][2]=make_pair(v2[y][x-1],2);
			if(y>0)m[c][3]=make_pair(v2[y-1][x],3);
		}
	}
	m['W'][1]=make_pair('h',0);
	m['X'][1]=make_pair('i',0);
	m['Y'][1]=make_pair('j',0);
	m['h'][2]=make_pair('W',3);
	m['i'][2]=make_pair('X',3);
	m['j'][2]=make_pair('Y',3);
	m['e'][1]=make_pair('7',2);
	m['f'][1]=make_pair('6',2);
	m['g'][1]=make_pair('5',2);
	m['7'][0]=make_pair('e',3);
	m['6'][0]=make_pair('f',3);
	m['5'][0]=make_pair('g',3);
	string line;
	for(;getline(cin,line);){
		char cur='A',nxt;
		d=0;
		cout<<cur;
		for(i=0;i<line.size();i++){
			if(line[i]=='L')d=(d+3)%4;
			else if(line[i]=='R')d=(d+1)%4;
			else{
				n=0;
				if('1'<=line[i]&&line[i]<='9')n=line[i]-'0';
				if('a'<=line[i]&&line[i]<='f')n=line[i]-'a'+10;
				if(!n)break;
				for(;n;n--){
					if(m[cur].find(d)==m[cur].end()){cout<<'?';break;}
					nxt=m[cur][d].first;
					d=m[cur][d].second;
					cur=nxt;
					cout<<cur;
				}
				if(n)break;
			}
		}
		cout<<endl<<flush;
	}
}
```
モジュールにある関数を知りたい

## 学習したこと

Haskellで、いくつか学習したことをまとめます。
モジュールに定義された関数は次のようにして確認することができます。

>bash-3.2$ ghci
GHCi, version 7.6.3: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> :browse Data.List

_もし_、使えるパッケージを確認したいならば、次のようにして確認することができます。

>bash-3.2$ ghc-pkg list

この辺で、Google検索しようとするはずですが、それでもまだターミナルで、興味のあるパッケージのexposed-modulesを確認したいならば、次のようにして確認することができます。

>bash-3.2$ ghc-pkg describe QuickCheck | more

そうして、そのモジュールに定義された関数を確認したいなら、冒頭の手続きを行います。。
けど、特に問題がなければ、Hoogleで検索しましょう。

## あとがき

なぜ、今更、Haskellか？それは[関数プログラミングの楽しみ](http://ssl.ohmsha.co.jp/cgi-bin/menu.cgi?ISBN=978-4-274-06805-8)を読んでみたかったからです。

「関数プログラミングの楽しみ」を読み始めたときは基礎的な知識がない状態でしたので、Haskell98のチュートリアルをすこし読みました。まずつまづいたことはType constructorとData constructorです。

[ふつうのHaskellプログラミング](http://www.loveruby.net/ja/stdhaskell/)を読むことで、Type constructorとData constructorについて理解を深めることができました。要点は、「型を書けるところにType constructorが使えて、値を書けるところにData constructorが使える」です。

「ふつうのHaskellプログラミング」ではパターンマッチをいくつかに分類していて、データコンストラクタパターンと呼ばれるパターンマッチがあります。これが使えるようになると、「関数プログラミングの楽しみ」の第１章の二分ヒープ木を処理する関数も使えるようになりました。

``` tree.hs
data (Ord a) => Tree a = Null | Fork a (Tree a) (Tree a)

isEmpty :: (Ord a) => Tree a -> Bool
isEmpty Null = True
isEmpty (Fork x a b) = False
 
minElem :: (Ord a) => Tree a -> a
minElem (Fork x a b) = x

deleteMin :: (Ord a) => Tree a -> Tree a
deleteMin (Fork x a b) = merge a b

insert :: (Ord a) => a -> Tree a -> Tree a
insert x a = merge (Fork x Null Null) a

merge :: (Ord a) => Tree a -> Tree a -> Tree a
merge a Null = a
merge Null b = b
merge a b
      | minElem a <= minElem b = join a b
      | otherwise = join b a

join (Fork a' x y) b = Fork a' x (merge y b)

main = do
     if isEmpty (Fork 1 (Fork 3 Null Null) (Fork 4 Null Null))
     then putStrLn "empty"
     else putStrLn $ show $ minElem $
          merge (Fork 7 Null Null) $
          merge (Fork 8 Null Null) (Fork 5 Null Null)
```

次につまづいたことはQuickCheckモジュールの使い方です。これは[Real World Haskell](http://www.oreilly.co.jp/books/9784873114231/)の第１１章をすこし読んで使い方を確認しました。QuickCheckモジュールが使えるようになると、「関数プログラミングの楽しみ」の第２章が読めるようになり始めました。これは始まったばかりです。。。

``` quickCheck_qsort.hs
import Test.QuickCheck
import Data.List

qsort :: Ord a => [a] -> [a]
qsort [] = []
qsort (x:xs) = qsort lhs ++ [x] ++ qsort rhs where
      lhs = filter (< x) xs
      rhs = filter (>= x) xs

prop_idempotent :: [Integer] -> Bool
prop_idempotent xs = qsort (qsort xs) == qsort xs

prop_minimum :: [Integer] -> Bool
prop_minimum xs = head (qsort xs) == minimum xs

prop_minimum' :: [Integer] -> Property
prop_minimum' xs = not (null xs) ==> head (qsort xs) == minimum xs

main = do
     quickCheck (prop_idempotent)
     quickCheck (prop_minimum)
     quickCheck (prop_minimum')
```

「関数プログラミングの楽しみ」は私にとって少し手に余る内容ですが、内容が充実しているので、時間を掛ければ楽しめると思います！
vagrantでVirtualBox4.3用のbox作ったので使い方 (CentOS6.4 LAMPP)

boxダウンロード
=============
* [CentOS6.4_x86_64_VirtualBox4.3.box 625MB](https://www.dropbox.com/s/x66h28xf28kpxuy/CentOS6.4_x86_64_VirtualBox4.3.box)

はじめに
==========
特徴
-------
* LAMPP環境を使う新人さん向け。
* CentOS6.4 64bit、php5.5、mysql5.5、postfix
* この[kickstart](https://www.dropbox.com/s/1koyjjpuppb3pii/c6vagran.cfg)でOSをインストールしました。
* アカウント情報は、id:pass = vagrant:vagrant、root:vagrant
* vagrantユーザのまま `/var/log/httpd/{access_log,error_log}`を読めます。
* mysqlのクエリログが `/var/log/mysql/mysql_query.log`に出力されます。
* mysqlをutf8設定済み。
* manがカラー表示とかzsh入ってたり色々。
* /etc/ が gitで自動バージョン管理されています。 (etckeeper)

便利URL
----------
* [リンク集](http://localhost:8080/) 現在、phpinfoとphpminiadmin、/vagrantへのリンク。

DB操作
----------
* [phpminiadmin](http://localhost:8080/phpminiadmin.php)を使うといいです。userをrootなり入れてください。

windows側
=================
以下をインストールする
----------------------------
* [VirtualBox 4.3 for Windows hosts  x86/amd64](https://www.virtualbox.org/wiki/Downloads)をダウンロードし実行。
* [Vagrant_1.3.5.msi](http://downloads.vagrantup.com/tags/v1.3.5)をダウンロードし実行。
* [Poderosa-4.3.8b-bin.zip](http://sourceforge.jp/projects/sfnet_poderosa/)をダウンロードし実行。
* 好きなエディタ。[Aptana Studio 3 初期設定](http://qiita.com/tukiyo/items/20a9ed8dc0f409e15393)を参考にしてもいいです。

vagrant
---------

コマンドプロンプトを起動。`windowsキーを押しながらR`を押して、`cmd.exe`を入力しOK押下。

```text:コマンドプロンプトにて以下実行
vagrant box add centos64 https://www.dropbox.com/s/x66h28xf28kpxuy/CentOS6.4_x86_64_VirtualBox4.3.box
mkdir c:\vagrant\centos64
cd c:\vagrant\centos64
vagrant init centos64
```

`Vagrantfile`をエディタで編集

```text:
config.vm.network :forwarded_port, guest: 80, host: 8080 <- コメントを解除する
```

```test:
vagrant up
```

ssh接続
----------

* poderosaで`localhost`、ポート`2222`、ユーザー`vagrant`、パスワード`vagrant`にて接続

web画面確認
---------------

* http://localhost:8080/ でwebの画面が表示されればOK。


xdebug
==========

```bash:
sudo vim /etc/php.d/xdebug.ini
```

```bash:以下のように記入。
; Enable xdebug extension module
zend_extension=/usr/lib64/php/modules/xdebug.so

; see http://xdebug.org/docs/all_settings

xdebug.remote_enable= on
;xdebug.remote_enable= off
xdebug.remote_handler=dbgp
xdebug.remote_host=10.0.2.2
;xdebug.remote_host=localhost
xdebug.remote_port=9000
xdebug.remote_autostart = on
xdebug.remote_mode=req
xdebug.dump.GET = *
xdebug.dump.POST = *
```

```bash:設定の反映
sudo /etc/init.d/httpd restart
```

以下を切り替えることで、xdebug有効無効が切り替えられます。

```bash:
xdebug.remote_enable= on
;xdebug.remote_enable= off
```