OmniAICreator/Qiita-1.07M huggingface dataset:
PC向けサイトがスマホでも崩れないようにする方法

PC向けに作った Web サイトをスマートフォンでみると、「 **部分的に意図せず文字が大きくなる** 」といった不具合が起きることがあります。

解決策ググって修正しようとすると、こんどは「 **毎回、ページの左上が拡大された状態で表示されてしまう** 」状況に陥ってしまうことがあります。

（私はありました。）

ということで、PC向けサイトも最低限スマートフォンで見られるようにする方法をメモっときます。

## 勝手に文字が大きくなる対策

```css
body {
    -webkit-text-size-adjust: 100%;
}
```

-webkit-text-size-adjust という、モバイル版ブラウザでのみ有効なプロパティがあるようです。
このプロパティが、デフォルトでは auto になっているため、文字が自動的に調整されて大きくなってしまう、というカラクリでした。

reset.css あたりに追記しておくのが妥当かと思います。

参考：[iPhone版Safariで文字サイズがおかしくなるときは-webkit-text-size-adjust: 100%; を指定する](http://m.designbits.jp/13031617/)

## Android でも -webkit-text-size-adjust が効くように

```html
<html>
<head>
    <!-- 省略 -->
    <meta name="viewport" content="target-densitydpi=device-dpi, width=device-width, maximum-scale=1.0, user-scalable=yes">
    <!-- 省略 -->
```

Android では -webkit-text-size-adjust プロパティを指定しただけでは、どうやら反映されないようです。
キモは ViewPort の scale 指定 です。 scale の指定には、以下の3つの種類があります。

+ initial-scale ... 初期拡大倍率
+ minimum-scale ... 最小拡大倍率
+ maximum-scale ... 最大拡大倍率

このうち initial-scale または maximum-scale を含めることで、Android でも -webkit-text-size-adjust の設定が反映されるようになります。
ただし initial-scale を指定してしまうと、画面の横幅ピッタリにページ全体が表示されなくなってしまいます。
したがって maximum-scale を含めるのが妥当かと思います。
画面左上が拡大表示されてしまうのは、「 **initial-scale=1.0** 」と指定してしまったからですね。

参考：[-webkit-text-size-adjustはscaleを指定しないと有効にならない](http://www.robario.com/2013/02/19)

### width について

上記の例では width に device-width を指定しました。
これにより横幅がブラウザサイズに追随するレイアウト（リキッドレイアウト）に対応できます。
しかし、よくある **横幅固定ページ（ソリッドレイアウト）の場合、 ViewPort の width は絶対指定しておいたほうがいい** です。

```html:横幅960px固定の例
<meta name="viewport" content="target-densitydpi=device-dpi, width=960, maximum-scale=1.0, user-scalable=yes">
```

例えばメインコンテンツは横幅 960px 固定で、ヘッダやフッタだけブラウザの横幅いっぱいに背景画像を表示させる場合、 `width` に `device-width` を指定してしまうとそのデバイスの横幅で背景画像が途切れてしまいます。
理由は、その背景画像のエレメントに CSS で指定された　`width: 100%` が、`device-width` からの相対値として計算されるためです。`device-width` が 360px であれば、 360px で途切れてしまうのです。

`width=960` のように、「最低限表示させたい横幅」を指定することで、960px のうちの 100%、つまり 960px の幅だけ背景画像が表示されるようになります。

***

以上ですが、ほかに初期対応として有効なものがあれば追記します。

+ 2013/10/30 ViewPort の width について追記しました。

# まとめ

**CSS html もしくは body に、 ` -webkit-text-size-adjust: 100%;` を指定する**

**ViewPort 指定で `-webkit-text-size-adjust` を有効化する**

```html:リキッドレイアウト
<meta name="viewport" content="target-densitydpi=device-dpi, width=device-width, maximum-scale=1.0, user-scalable=yes">
```

```html:ソリッドレイアウト
<meta name="viewport" content="target-densitydpi=device-dpi, width=固定値, maximum-scale=1.0, user-scalable=yes">
```
launchd(8)の使い方


OSXに`crontab -e`がなくて困ったのでメモ。

# launchd(8)とは

- OSXで導入された`init(8)`に変わるアレ

> DESCRIPTION
>
>launchd manages processes, both for the system as a whole and for individual users.  The primary and preferred interface to launchd is via the launchctl(1) tool which (among other options) allows the user or administrator to load and unload jobs.  Where possible, it is preferable for jobs to launch on demand based on criteria specified in their respective configuration files.
>
> During boot launchd is invoked by the kernel to run as the first process on the system and to further bootstrap the rest of the system.
> 
> You cannot invoke launchd directly.

# launchd.plist(5)の置き場所

|Path|Description|
|:----|:----|
|~/Library/LaunchAgents|Per-user agents provided by the user.|
|/Library/LaunchAgents|Per-user agents provided by the administrator.|
|/Library/LaunchDaemons|System-wide daemons provided by the administrator.|
|/System/Library/LaunchAgents|Per-user agents provided by Mac OS X.|
|/System/Library/LaunchDaemons|System-wide daemons provided by Mac OS X.|

# launchd.plist(5)の書き方サンプル

`$ brew update`を毎日2時50分に実行する例

```xml:com.archinwateworks.src.brew.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTDPLIST1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
	<dict>
		<key>Label</key>
		<string>com.archinwaterworks.src.brew</string>
		<key>ProgramArguments</key>
		<array>
			<string>/usr/local/bin/brew</string>
			<string>update</string>
		</array>
		<key>WorkingDirectory</key>
		<string>/Users/archinwater</string>
		<key>StartCalendarInterval</key>
		<dict>
			<key>Hour</key>
			<integer>2</integer>
			<key>Minute</key>
			<integer>30</integer>
		</dict>
	</dict>
</plist>
```

- ファイル名は適当でもいいっぽいが、前にならえということで。
- 今回はユーザ権限で動かせばよいコマンドなので、`~/Library/LaunchAgents`に`com.archinwaterworks.src.brew.plist`として保存する。後続の`launchctl(5)`は拡張子を見てるっぽいので、拡張子を間違えないように注意。
- 設定した時刻に端末が寝ていても、再び起きたときに動くらしいのです。
- `/var/log/system.log`に動作した結果は出てくる模様。

出力先の指定もできます。

|Option|Description|
|:----|:----|
|StandardInPath <string>|This optional key specifies what file should be used for data being supplied to stdin when using stdio(3).|
|StandardOutPath <string>|This optional key specifies what file should be used for data being sent to stdout when using stdio(3).|
|StandardErrorPath <string>|This optional key specifies what file should be used for data being sent to stderr when using stdio(3).|

see also: `launchd(8)`, `launchd.plist(5)`

# launchd.plist(5)をlaunchctl(1)で登録する

`$ launchctl load ~/Library/LaunchAgents/com.archinwaterworks.src.brew.plist`

エラーが出なければ登録されていることになる(らしい)。というのは不親切なので、以下のコマンドで確認できる。

`$ launchctl list com.archinwaterworks.src.brew`

```sh:launchctlの結果
[11:35] archinwater % launchctl list com.archinwaterworks.src.brew
{
	"Label" = "com.archinwaterworks.src.brew";
	"LimitLoadToSessionType" = "Aqua";
	"OnDemand" = true;
	"LastExitStatus" = 0;
	"TimeOut" = 30;
	"ProgramArguments" = (
		"/usr/local/bin/brew";
		"update";
	);
};
```

テスト投稿を兼ねて。
proxmox3.1の"No Valid Subcription"対応patch

パッケージを最新にする。
======================
proxmox3.1ではリポジトリが２種類あります。

```diff:/etc/apt/sources.list.d/pve-enterprise.list
-deb https://enterprise.proxmox.com/debian wheezy pve-enterprise
+deb http://download.proxmox.com/debian wheezy pve-no-subscription
```

```bash:
# apt-get update
# apt-get upgrade
```

ダウンロード
===========
* [pvemanagerlib.js.patch](https://github.com/tukiyo/proxmox/tree/master)

* 変更点
  * デフォルトを日本語に設定。
  * "No valid subscription"ダイヤログ非表示
  * openVZのTemplateダウンロードダイヤログを最初から最大化
RでExcelのファイルを読み書きする{xlsx}パッケージの使い方

## {xlsx}パッケージについて
{xlsx}パッケージは，ExcelのファイルをRで読み書きするためのパッケージです．
使うには{rJava}パッケージのインストールが必要になります．

## xlsxファイルの読み込み

```r:xlsxファイルの読み込み
library(xlsx)

# test.xlsxの1番目のシートの1,2,5列目のデータをデータフレームとして読み込む
dat <- read.xlsx("test.xlsx", sheetIndex=1, colIndex=c(1,2,5))
```

## xlsxファイルの書き出し（シンプルな方法）
単純にデータフレームを書き出すだけなら`write.xlsx()`でできます．

```r:
df <- data.frame(gene_symbol=c("OCT4\n(POU5F1)", "SOX2", "KLF4", "C-MYC"), expression=c(1,6,9,4))
write.xlsx(df, file="test.xlsx", sheetName="sheet1", row.names=F)
```

この方法はシンプルですが，セルの書式設定など高度な設定はできません．
例えば，上の例で作成したxlsxファイルをExcelで開いても，`OCT4\n(POU5F1)`はセル内改行とは認識されません．

## xlsxファイルの書き出し（複雑なことができる方法）
`workbook`オブジェクト，`sheet`オブジェクト，`CellStyle`オブジェクトを作成することで，より高度なxlsxファイルを作成することができます．

```r:
df <- data.frame(gene_symbol=c("OCT4\n(POU5F1)", "SOX2", "KLF4", "C-MYC"), expression=c(1,6,9,4))
# workbookオブジェクトの作成
wb <- createWorkbook(type="xlsx")
# シート名が"sheet1"であるsheetオブジェクトの作成
sheet <- createSheet(wb, sheet="sheet1")
# sheetオブジェクトにデータフレームを入力
addDataFrame(iris, sheet, startColumn=1)
# シート名が"sheet2"であるsheetオブジェクトの作成
sheet <- createSheet(wb, sheet="sheet2")
# CellStyleオブジェクトの作成（wrapTextは「セル内でテキストを折り返す」）
cs1 <- CellStyle(wb) + Alignment(wrapText=T) + DataFormat("@")
# sheetオブジェクトにデータフレームを入力
addDataFrame(df, sheet, startColumn=1, row.names=F, colStyle=list(`1`=cs1))
# Excelファイルを出力（"sheet1"，"sheet2"という２つのシートを持つ）
saveWorkbook(wb, file="test.xlsx")
```

この例では，sheet2では，`"OCT4\n(POU5F1)"`はセル内改行として認識されます．


`CellStyle`については，かなり細かい設定ができます．詳しくは，`?CellStyle`でヘルプを参照してください．
ただし，細かい設定をするには，ExcelをVBAで操作する際の知識が必要となります（ググる程度）．
例えば，`DataFormat("@")`の`"@"`はVBAでセルの書式を「文字列」にする際の指定です．


## ヒープサイズの設定
`read.xlsx()`を使う際に`java.lang.OutOfMemoryError: Java heap space`というエラーが出ることがあります．
これを防ぐためには，以下のようにヒープサイズの設定をJVMの初期化の前に（`library(xlsx)`の前に）行うことが有効です(http://www.bramschoenmakers.nl/en/node/726)．

```r:ヒープサイズの設定
options( java.parameters = "-Xmx4g" )
```

## 参考文献
- [R言語上級ハンドブック](http://www.amazon.co.jp/dp/486354135X)
- [Excel VBA 入門講座](http://excelvba.pc-users.net/func/func3.html)
- [R: Increase heap size for rJava | bramschoenmakers.nl](http://www.bramschoenmakers.nl/en/node/726)
proxmoxでeth0ではなくeth1を使う

PCの内蔵NIC(eth0)がLANケーブルすぐ抜けるので、USB-LANアダプター(eth1)を使うことにした。

```diff:/etc/network/interfaces 
auto vmbr0
iface vmbr0 inet static
	address 192.168.11.3
	netmask 255.255.255.0
	gateway 192.168.11.1
-	bridge_ports eth0
+	bridge_ports eth1
	bridge_stp off
	bridge_fd 0
```
proxmoxでopenVZのtemplate更新

proxmoxの長所である[TurnKey](http://www.turnkeylinux.org
)のtemplateが使えないとか残念すぎるのでググってみた。

turnkeyのtemplateがない場合
======================

![スクリーンショット 2013-10-14 9.56.02.png](https://qiita-image-store.s3.amazonaws.com/0/25728/c1eb6f13-7bce-f0c1-f5d3-d0a53b38a589.png)

更新
------------------------------

```bash:
# pveam update
```

template追加されました。
------------------------------
![スクリーンショット 2013-10-14 10.39.04.png](https://qiita-image-store.s3.amazonaws.com/0/25728/4fe9a56c-f0d1-1551-869a-a6ab604e588e.png)


ファイルの場所
=====================
* /var/lib/pve-manager/apl-info/download.proxmox.com
* /var/lib/pve-manager/apl-info/releases.turnkeylinux.org


precreatedで配布されているubuntu13.04 64bitのtemplateを追加
================================================
[参考](http://pve.proxmox.com/wiki/User:Apmuthu)
/var/lib/vz/template/cache/ に http://openvz.org/Download/template/precreated
で配布されているubuntu-13.04-x86_64.tar.gz を置くだけ。
ASCII文字の一覧を出力するワンライナー

##顛末
OSのインストール時にキーボードの選択をミスっていたらしく
HappyHackingKeyboard(US配列)からマップされた日本語キーボード(JIS配列？)で入力するも
「_」が入力できない状態になり、設定ファイルを編集しずらい状態になりました。
##オチ
結局viで他のファイルを開き、「_」が使われている部分を切り貼りして事無きを得ましたが
もしも「_」を使っているファイルがすぐに見つからなかったらどうしていただろう…と。
##対処
まー、なんとも馬鹿馬鹿しい原因とオチですが
キーボードの選択ミス以外にもハード的な故障などでも起こり得るということで、
実際に使うであろうASCII文字の一覧を吐くワンライナーを書き残しておくことにしました。
\# わざわざ書き残しておく必要のあるコードでもないですが :-p
**動作の前提条件**
・bashが動くこと。UNIXライクなOSならインストール時にも使えるかも？
・キーボードが使えないと言ってもある程度の文字入力は出来ること。
\#まぁ、OSをインストールしようとする位なのでヘンなキーボードは使わないだろう、程度に。

###コード
ここではファイル形式にしていますが、forの行をそのまま入力すればワンライナーとして使えます。
また、seq 32 126 を seq 0 127 にすれば目に見えないかもしれませんが、全ASCIIコードになる筈です。

```ascii.sh
#!/bin/bash
for i in $(seq 32 126); do c=$(printf "%x" $i); printf "\x$c"; done;
```

出力結果

```
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
```

#今後について
今回は「_」が入力出来ない程度の環境で済みましたが
今後の状況として今回よりもヒドイ状況に陥るやもしれません。
そうした場合に備えて普段からエディタを使いこなしておくこと。
また、使えるキーが少なくても設定ファイルを編集出来る応用方法やHACKを
身に着けておきたいですね。 :-)
migration の代わりに schema.rb のみで DB 状態を管理する


設計がきちんとできていないせいで，開発途中でテーブルにカラムの追加や変更がガンガン出てくる訳だが，いちいちコマンドラインを叩いて migration を作るのが面倒臭いし，何より migration ファイルがずらりと並んでいるのが計画性の無さの証左のようで見苦しい．

どうやら，

```rake db:reset
```で，schema.rb の内容に基づいてテーブルを再作成してくれるらしい．

ただ当然ながら，開発途中に投入したデータも全て消去されてしまう．これも
seeds.rb にきちんとテスト用データを入れておけば良いのだが，いかんせん面倒臭い．

そこで 'yaml_db' を使って，データをダンプ → db:reset → データをロード，としてやれば良い．
もちろん，追加したカラムにデータは入らないし，カラムを削除したところにデータをロードしようとするとエラーになるだろうが(未確認)，このあたりはダンプした yaml を編集してやらないと仕方ない．


```Gemfile
gem 'yaml_db'

# Rails4 でエラーが出る場合はこっち．
#gem 'yaml_db', github: 'jetthoughts/yaml_db', ref: 'fb4b6bd7e12de3cffa93e0a298a1e5253d7e92ba'
``````
# db/data.yamlを生成
rake db:data:dump

# db/data.yamlを読み込み
rake db:data:load```いろいろあるが，こういう開発スタイルを取っているなら工数は少なく済むと思うのだがどうだろう．
Hadoop におけるテストの効率化

Hadoop には大量のテストがある．中には疑似分散環境を用いたテストが存在するため，その実行には多くの時間を必要とする．本稿では，開発を効率化するために，どのようにしてテストを効率的に行うかについて述べる．

## 実行するテスト数の削減

明らかに関係のないテストをスキップする方法である．ただし，この方法を用いることができるのは，自分の変更したソースコードの影響範囲が，ある程度把握できる場合にのみに限られる．

### 特定のテストのみの実行

maven には，特定のテストクラスのみを実行する機能が備わっている．この機能を利用するには，以下のようにして実行したいテストクラスを指定する．

    $ mvn test -Dtest=TestClass

さらに，特定のメソッドのみを実行するには以下のようにしてテストメソッドを指定する．

    $ mvn test -Dtest=TestClass#testMethod

依存関係のないプロジェクトのテストを飛ばすには，プロジェクトのルートディレクトリでテストを実行する代わりに，各ディレクトリの下でテストを実行する．

    # hadoop-yarn-project のテストのみを実行する場合
    $ cd hadoop-yarn-project
    $ mvn test


## テスト実行の並列化

自分の行った変更の影響範囲が未知数である場合，全体のテストを行う必要がある．この場合には，並列にテストを実行することでテストの実行効率を高めることができる．

## サブプロジェクト単位の実行並列化

Hadoop はいくつかのサブプロジェクトに分割されているため，個別に実行することでテストの実行を効率化できる．例えば hadoop-yarn-project の場合，以下の 6 つのサブプロジェクトが存在するため，並列実行を行うことができる．

1. hadoop-yarn-api
2. hadoop-yarn-client
3. hadoop-yarn-server
4. hadoop-yarn-applications
5. hadoop-yarn-common
6. hadoop-yarn-site  

実際に並列実行するにはどうすればよいだろうか．ソースコードに変更を加えるたびに，6つのコンソールに向かって ``mvn test`` を実行することでも実行可能だが，面倒である．そこで，Jenkins などの CI ツールを用いて，git push されたら上記のテストを並列に実行するように設定しておくと便利である．なお，Jenkins を用いる場合は，同時Job実行数を CPU の数に合わせると実行効率が高い(経験則)．

## テストメソッド単位の実行並列化

trunk では parallel-tests という並列実行用のプロファイルが追加されているため，以下のプロジェクトのテストは並列実行が可能である．
 1. hadoop-common-project/hadoop-common
 2. hadoop-hdfs-project/hadoop-hdfs

並列実行を有効にするには，以下のコマンドを利用する．
 
    $ mvn test -Pparallel-tests 

## ビルドマシンの見直し

当然のことだが，ビルドマシンの性能はテスト実行時間を大きく左右する．AWS の m1.xlarge と 3.2xlarge を用いて ```mvn install -DskipTests``` を実行したときの処理時間の比較を以下に示す．

|インスタンスタイプ|実行時間|
|:-----------|------------:|:------------:|
| m1.xlarge | 3:30 |
| m3.2xlarge | 1:30 |
simple_formでnestしたmodelの多言語化対応


[simple_from](https://github.com/plataformatec/simple_form)でuserが複数profileを持っているような場合、localeファイルは、親model配下にnestした上で複数系で指定する。

```ruby:user.rb
class User < ActiveRecord::Base
  has_many :profiles, dependent: :destroy
  accepts_nested_attributes_for :profiles
  # …
end
```

```ruby:profile.rb
class Profile < ActiveRecord::Base
  belongs_to :user
  # …
end
```

## 正解

```ruby:config/locales/simple_form.ja.yml
ja:
  simple_form:
    # ...
    labels:
      defaults:
      # ...
      user:
        # ...
        profiles:
          hoge: "ほげ"
          huga: "ふが"
```

## 不正解

親modelと同じ階層

```ruby:config/locales/simple_form.ja.yml
ja:
  simple_form:
    # ...
    labels:
      defaults:
      # ...
      user:
      # ...
      profile:
        hoge: "ほげ"
        huga: "ふが"
```

単数形

```ruby:config/locales/simple_form.ja.yml
ja:
  simple_form:
    # ...
    labels:
      defaults:
      # ...
      user:
        # ...
        profile:
          hoge: "ほげ"
          huga: "ふが"
```
任意のウィンドウを常に再前面に出したい


ウィンドウズが常に前面に出るようにすることを *Always On Top* といふらしい。

 * [gnome - How to start an app with "Always On Top" set? - Ask Ubuntu](http://askubuntu.com/questions/7377/how-to-start-an-app-with-always-on-top-set)

Ask Ubuntuを参照してるけど[wmctrl](http://tomas.styblo.name/wmctrl/)はいろんなウィンドウマネージャに対応してる、とてもいかしたやつなので、Ubuntuじゃなくても全然動くっぽいですね ヾ(〃＞＜)ﾉﾞ☆

まあ、Debian系のディストリならこんな感じで入る。

```
sudo apt-get wmctrl
```

さて、まあなんか[xeyes](https://ja.wikipedia.org/wiki/Xeyes)をいつも再前面に出したいよねー、とか思ったりするとします。

```
xeyes &
wmctrl -r "xeyes" -b add,above
```

![Big Brother is watching you!](https://qiita-image-store.s3.amazonaws.com/0/4121/b1ade6a5-1efa-96b6-fa4b-6f9594de0545.png "kobito.1381691094.461297.png")

Emacsでコーディングしてても、いつもxeyesさんが僕のことを視ててくれます ヾ(〃＞＜)ﾉﾞ☆
(Windows)Git付属のsshのssh_configの場所

Git付属のsshのおかげでPowerShellからsshが使えて大変便利。
ところが、このsshを使用する場合、$HOME/.ssh/configを作成しても設定を読んでくれません。
どうすればいいかと調べたところ、StackOverFlowに答えが載っていました
http://stackoverflow.com/questions/9513712/git-ssh-client-for-windows-and-wrong-path-for-ssh-config-file

答えは以下のパスに置くこと
< Gitのインストールパス >/Git/etc/ssh/ssh_config
※.sshでもconfigでもなく、ssh/ssh_configです。

ここに置くことでlinuxの$HOME/.ssh/configと同じようにssh user@hostとやるとコンフィグを読んでくれます。
CDIを使うときのbeans.xmlの置き場所メモ

ちゃんと理解せずに使ってたら、ハマったのでメモ。

#環境
##APサーバ
GlassFish 4.0

#言葉の定義
##InjecteeClass
インジェクション対象のクラス。

```java:InjecteeClass
public class InjecteeClass {
}
```

##TargetClass
インジェクション先のクラス。

```java:TargetClass
public class TargetClass {
    @Inject
    private InjecteeClass injectee;
}
```
#beans.xml の置き場所
`InjecteeClass` のある場所に応じて配置する。

`InjecteeClass` が

- `WEB-INF/classes` 以下にある場合は `WEB-INF` 直下
- `WEB-INF/lib` 以下の jar ファイル内に格納されている場合は、その jar 内の `META-INF` 直下

に配置する。

#例
##InjecteeClass と TargetClass が両方とも `WEB-INF/classes` 以下にある
　→　 `WEB-INF` 直下に配置。

```text:
webapp
└─WEB-INF
    │  beans.xml
    │
    └─classes
        └─cdi
            └─test
                    InjecteeClass.class
                    TargetClass.class
```

##InjecteeClass が jar 内にあり、 TargetClass は `WEB-INF/classes` 以下にある
　→　`InjecteeClass` の入っている jar ファイル内の `META-INF` 直下に配置する。

```text:
webapp
└─WEB-INF
    ├─classes
    │  └─cdi
    │      └─test
    │              TargetClass.class
    │
    └─lib
        └─test.jar
            ├─cdi
            │  └─test
            │          InjecteeClass.class
            │
            └─META-INF
                    beans.xml
```

##InjecteeClass と TargetClass が両方とも jar 内にある
　→　`InjecteeClass` の入っている jar ファイル内の `META-INF` 直下に配置する。

```text:
webapp
└─WEB-INF
    └─lib
        ├─fuga.jar
        │  └─cdi
        │      └─test
        │              TargetClass.class
        │
        └─hoge.jar
            ├─cdi
            │  └─test
            │          InjecteeClass.class
            │
            └─META-INF
                    beans.xml
```

###TargetClass が JAX-RS のサービスクラスの場合
`TargetClass` が JAX-RS のサービスクラスで、かつ jar ファイル内に入っている場合は、その jar ファイルにも beans.xml が必要っぽい。

```java:TargetClass
@Path("target")
public class TargetClass {
    @Inject
    private InjecteeClass injectee;

    @GET
    public String method() {
        return "test";
    }
}
```

```text:
webapp
└─WEB-INF
    └─lib
        ├─fuga.jar
        │  ├─jaxrs
        │  │  └─test
        │  │          TargetClass.class
        │  │
        │  └─META-INF
        │          beans.xml
        │
        └─hoge.jar
            ├─cdi
            │  └─test
            │          InjecteeClass.class
            │
            └─META-INF
                    beans.xml
```

たぶん、 `TargetClass` を CDI コンテナ管理にするために beans.xml が必要になるのではないかなと想像。

#おまけ
`InjecteeClass` が EJB だと、 beans.xml は不要。

```java:EjbClass
@Stateless
public class EjbClass {
}
```

```java:TargetClass
public class TargetClass {
    @Inject
    private EjbClass ejb;
}
```

```text:beans.xmlは不要
webapp
└─WEB-INF
    ├─classes
    │  └─cdi
    │      └─test
    │              TargetClass.class
    │
    └─lib
        └─test.jar
            └─ejb
                └─test
                        EjbClass.class
```

#参考
- [CDIの準備 - シュンツのつまづき日記](http://d.hatena.ne.jp/gloryof/20120927/1348756806)
- [Java EE 6: Understanding Contexts and Dependency Injection (CDI), Part 1 (Nishigaya's Weblog)](https://blogs.oracle.com/nishigaya/entry/javaee6_understanding_cdi_part_1)
ちょっと便利な`ln -s`コマンドの使い方

何か特定の作業に入る前、例えばWordpressのテーマを作成する時に  `~/Dropbox/www/example.com/wp-content/themes/mytheme` とか長いディレクトリの中までいちいちEmacsから開くのがめんどくさいのでSymbolic Linkを`~/`の直下に置いて作業をしやすくすることが自分はよくあります。

んで、そんな時に結構めんどくさいのが `ln -s` の第一引数にフルパスを入れないと行けないところです。(相対パスだと作成時の場所じゃなくて、シンボリックリンクがある場所からの相対リンクになる。)

## ちょっとしたコツ

大体の場合は正確な場所を知るためにその作業フォルダまで移動してるので `pwd` を使えばよかったんですよ！

```
ln -s "`pwd`" ~/
```

とすればカレントディレクトリに対するリンクがホームディレクトリに作られるので
Emacsとかでファイルを開く時に `~/mysite` とするだけでOK!
ついでにDropboxに入れたままだからちゃんと同期もされて更に嬉しい！
saltでrabbitmqを立ち上げる

以下のように設定する

```yaml
rabbitmq-server:
    pkg:
        - installed
    service:
        - running
enable_mgnt_plugin:
    cmd.run:
        - name: <rabbitmq-pluginsのパス> enable rabbitmq_management
        - user: root
        - require:
            - pkg: rabbitmq-server
add_user:
    rabbitmq_user.present:
        - name: admin
        - password: password

add_vhost:
    rabbitmq_vhost.present:
        - name: vhost
        - user: admin
```
Groovyでtrampolineを使って末尾再帰最適化

[カレンダーのコード](http://qiita.com/saba1024/items/d1a12314829116b6d2ab)を書いていてGroovyの末尾再帰の最適化が気になって調べてみた。
参考にしたページ >　http://npnl.hatenablog.jp/entry/20110630/1309447996
サンプルとして、1から10の整数が格納されているリストから、それぞれ2個ずつさらにリストに小分けにして返す処理。

```groovy:trampoline_sample.groovy
def split = 2

// 普通の再帰
def clj1 = { List list ->
    if(!list) {return []}
    else [list.take(split)] + call(list.drop(split))
}

// trampolineを使って末尾再帰最適化!
def clj2 = { List list, List result = [] ->
    if(!list) {return result}
    else trampoline(list.drop(split), result + [list.take(split)])
}.trampoline()

def list = (1..10).toList()
assert clj1(list) ==  [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]
assert clj2(list) ==  [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]
assert clj1.call(list) ==  [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]
assert clj2.call(list) ==  [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]

// もし以下のような大きい値を使った場合、通常の再帰処理だとStackOverFlowとなる。
// list = (1..10000).toList()
// clj1(list)

```

Scalaで末尾再帰を勉強してたときは、再帰が進むにつれて、処理される値がドンドン減っていって、最終的に処理結果が段々と返ってくる、言うなれば小さくなっていってまた大きくなりながら戻ってくる、っていうイメージだった。
でもGroovyのtrampoline場合、処理結果を毎回自分自身に渡さないといけないから、逆に処理される値がドンドン増えていって、最後に一気にズドーン！と値が帰ってくるイメージ。
どちらも末尾再帰の最適化は実行されるはずなんだけど受けるイメージが真逆・・・

Closure#trampoline()には引数を取るtrampolineと取らないtrampolineがあって、それぞれ役割が違うみたい。
引数を取るtrampolineの方が実際に最適化されるロジック部分で、引数を取らないtrampolineが、このClosureは末尾再帰の最適化をやりますよーというイメージ。だと思う・・・
引数なしのtrampolineの戻り値はClosureのインスタンスなので、普通に呼び出してあげればOK。
tmlib-rpg キャラクターの作成（１） rpg.Character / rpg.SpriteCharacter

何はともあれ、キャラクターが表示できないとどうしようもないので、キャラクターを表示するクラスを作成。

tmlib.js には、AnimationSprite と、言うクラスがあって SpriteSheet クラスの素材をつかって、キャラクターのスプライトを管理、アニメーションをいろいろ作成できるようになってます。

SpriteSheet クラスは、.tmss という拡張子で json ファイルを用意することで、AssetManager から取得可能です。
もろもろ詳しくは、[tmlib.js の AnimationSprite を使ってコマ送りアニメーションさせてみよう](http://tmlife.net/programming/javascript/tmlib-js-animationsprite-top-forwarding-animation.html "tmlib.js の AnimationSprite を使ってコマ送りアニメーションさせてみよう") TM Life を参考に～

tmlib-rpg では、今のところ

* Character クラスは、内部で使うキャラクター情報のクラス
* SpriteCharater クラスは、Character を表示するためのクラス

と、言う感じ。RGSSの構成と同じ。

でもって、Character は、hash で初期化するので、json を渡せば良い…
こうしておけば、そのうち Character 自体を、AssetManager で管理すれば、ゲームデータとして、管理するのも簡単かな～？と

今のところの構成をメモ

```coffeescript
ASSETS =
  'sample.character':
    _type: 'json'
    spriteSheet: 'sample.spritesheet'
    mapX: 0
    mapY: 0
    moveSpeed: 4
  'sample.spritesheet.hiyoko': 'img/hiyoco_nomal_full.png'
  'sample.spritesheet':
    _type: 'tmss'
    image: 'sample.spritesheet.hiyoko'
    frame:
      width: 32
      height: 32
      count: 18
    animations:
      down: frames: [7,6,7,8], next: 'down', frequency: 4
      up: frames: [10,9,10,11], next: 'up', frequency: 4
      left: frames: [13,12,13,14], next: 'left', frequency: 4
      right: frames: [16,15,16,17], next: 'right', frequency: 4
```

Character には、spriteSheet を指定して、SpriteCharacter は、基底クラスがAnimationSprite なので
Character.spriteSheet で初期化

上のサンプルは、hiyoko のpng 素材を使った、spriteSheet の RPG　サンプルになってます。
上下左右に動くときのアニメーション。frequency は調整の必要があるけど…これはmoveSpeed にあわせて変えるべきかも？

この後、実際にキャラクターの能力とかの設定になってくるのだけど、これはRPGのシステムに影響するので、tmlib-rpgをフレームワークぽくするにはちょっと考える部分。あまり作りこんでもシステムが作りたいRPGに合わないとか云々…RGSSでは、みんな好き勝手に変更してたので、出来るだけ改造しやすいように、tmlib-rpg もしたいなぁ～
とかとか思いつつ、まだまだ作成中…
GoogleAppEngine/PythonでDjangoを使う方法


## 環境
* Mac
* Python2.7
* Google App Engine SDK for Python

が入っている環境での作業です。

## Djangoアプリの作成

まず、プロジェクトを作成します。
ここではgaedjangoとしています。

SDKに含まれているdjangoを使う場合は、下記のようになります。
他の環境の場合は適宜修正して下さい。

```
$ export PYTHONPATH='/usr/local/google_appengine/lib/django-1.5/'
$ /usr/local/google_appengine/lib/django-1.5/django/bin/django-admin.py startproject gaedjangoapp
```
gaedjangoappディレクトリにプロジェクトが作成されます。

## app.yamlファイルの作成
GoogleAppEngineのアプリケーションはapp.yamlというファイルで
アプリケーションの設定をする必要があります。
[Python Application Configuration with app.yaml](https://developers.google.com/appengine/docs/python/config/appconfig?hl=en)

```app.yaml
application: gaedjangoapp
version: 1
runtime: python27
api_version: 1
threadsafe: yes

libraries:
- name: django
  version: "1.5"

builtins:
- django_wsgi: on
```

## appengine_config.py
SDKのDjangoを使う場合はPYTHONPATHの設定をします。

Django1.5の場合は、DJANGO_SETTINGS_MODULEの設定もします。

```appengine_config.py
# -*- coding: utf-8 -*-
import os
import sys

if os.environ.get('SERVER_SOFTWARE','').startswith('Dev'):
    sys.path.append('/usr/local/google_appengine/lib/django-1.5/')

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "gaedjangoapp.settings")

```


## 開発用サーバーの起動

通常、djangoのアプリでは、

```
$ python manage.py runserver
```
で開発用サーバーを起動しますが、
今回はGoogleAppEngineなので、

```
$ dev_appserver.py .
```
で起動します。

この状態で、[http://localhost:8080](http://localhost:8080)にアクセスすると、
It worked!
と初期状態の画面が表示されます。

## helloアプリの作成

HelloWorldと表示するアプリを作成します。

```
$ python manage.py startapp hello
```
でhelloディレクトリに空のアプリが作成されます。

次に、hello/view.pyを下記のようにします。

```hello/view.py
# -*- coding:utf-8 -*-

from django.http import HttpResponse
def index(request):
    return HttpResponse("Hello, world.")
```

次に、urls.pyを設定します。

```gaedjangoapp/urls.py
from django.conf.urls import patterns, include, url

urlpatterns = patterns('',
    (r'^$', 'gaedjangoapp.hello.views.index'),
)
```

最後にsettings.pyにアプリケーションを追加します。

```gaedjangoapp.settings.py
INSTALLED_APPS = (
    ~~~~~
    # Uncomment the next line to enable the admin:
    # 'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',
    'hello',
)

```
この状態で、[http://localhost:8080](http://localhost:8080)にアクセスすると、
Hello, world.
と表示されます。
bundle install する時、証明書エラーが出る。

``` bundle install ``` するときに下記のようなエラーが出る場合がある。




```

$ bundle install
Fetching source index from https://rubygems.org/
Could not verify the SSL certificate for https://rubygems.org/.
There is a chance you are experiencing a man-in-the-middle attack, but most likely your system doesn't have the CA certificates needed for verification. For information about OpenSSL certificates, see bit.ly/ruby-ssl. To connect without using SSL, edit your Gemfile
sources and change 'https' to 'http'.

```

```rubygems.org``` で使用されているサーバ証明書を検証する際に、OpenSSLが用いる証明書が古くなってしまっている。

解決方法は http://bit.ly/ruby-ssl に書かれている。


rvm を使っている場合は下記のようにすれば、然るべき証明書が更新される。

```

$ rvm osx-ssl-certs status all   # 証明書の検証
Certificates for /path/to/ssl/cert.pem: Old. 

$ rvm osx-ssl-certs update all # 証明書の更新
Updating certificates for /path/to/ssl/cert.pem: Updating certificates in '/path/to/ssl/cert.pem'.
Updated.

```
CentOS(6.2) に Erlangをソースからインストールする

Erlangは2013年10月時点で標準のリポジトリにErlangが含まれていないので、
ソースを取ってきてコンパイルする。

##### 事前準備

```shell-session:
# cat /etc/issue
CentOS release 6.2 (Final)
Kernel \r on an \m
# yum install ncurses-devel
```

##### 本家からソース取得してコンパイル
```shell-session:
# wget http://www.erlang.org/download/otp_src_R16B02.tar.gz
# tar zxvf otp_src_R16B02.tar.gz
# cd otp_src_R16B02
# ./configure
# make
# make install
# erl

Eshell V5.10.3  (abort with ^G)
1>

```

./configure時に以下のエラーが出力されたけどいったん無視

```shell-session:
**********************  APPLICATIONS DISABLED  **********************
*********************************************************************

odbc           : ODBC library - link check failed

*********************************************************************
*********************************************************************
**********************  APPLICATIONS INFORMATION  *******************
*********************************************************************

wx             : wxWidgets not found, wx will NOT be usable

*********************************************************************
*********************************************************************
**********************  DOCUMENTATION INFORMATION  ******************
*********************************************************************

documentation  :
                 xsltproc is missing.
                 fop is missing.
                 The documentation can not be built.

*********************************************************************

```
TableViewControllerのサブクラスつくったら’unable to dequeue a cell with identifier Cell’という実行時エラーが出た。

 Xcode5.0を使ってSubclassをTableViewControllerに指定して自動で生成したファイルをビルドしたら、シミュレーションでの起動で実行時エラーがでました。(xibは不使用)

二回躓いたので、解決方法をメモします。

###出力されたエラーメッセージ

```
erminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'unable to dequeue a cell with identifier Cell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard'  
```


###エラーとなったメソッド

```
(UITableViewCell *)tableView:(UITableView |*)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
```

## 解決方法

自動で生成される以下のコードを変更します。

###変更前

```
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
```

###変更後

```
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
```

セルの生成時に、forIndexPath:indexPathを渡さないよう変更しました。
変更後のtableView:cellForRowAtIndexPath:が以下になります。

```
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

     if(cell == nil){
          cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
     }
     
    //cellへの表示する内容を設定する
    
    return cell;
}
```
Genymotionで"starting virtual device"ってなったまま固まって起動しない場合

VirtualBoxのネットワーク設定の問題で起動しないことがある模様。

そういう時は[ここ](https://groups.google.com/forum/#!searchin/genymotion-users/network/genymotion-users/QAX_UrAzEn0/o947IXpsDuIJ)に書いてあるように
VirtualBox > Preference > Network
でHost-only Networksを選択、設定ボタンから
IPv4 Addressを `192.168.56.1` にすると起動するようになる。
selectした結果をinsertする

毎回忘れるのでメモ

以下の書き方はNG(毎回やらかす)

```sql
insert into table_name (col1, col2, ...)
values (select col1, col2, ... from table2_name);
```

正解はこちら

```sql
insert into table_name (col1, col2, ...)
select col1, col2, ... from table2_name;
```
phpで別スレッドで処理を実行する書き方

phpで別スレッドで処理を実行する書き方

```php
exec("nohup php -c '' '起動PHPファイルパス' '引数ARGS' > /dev/null &");
```

投げっぱなしジャーマンなのでその後ことは別途チェックなり処理が必要

http://web-terminal.blogspot.jp/2013/04/php.html
Node.jsでホットデプロイ(Graceful Restart)をサポートするデーモンを作成しました。

Node.jsの弱点である「スクリプトが落ちる = サーバーが落ちる」、「スクリプトを更新したらサーバーを再起動する必要がある」という問題点をクリアする[qilin](http://atsuya.github.io/blog/2012/10/15/qilin/)というモジュールがnpmに登録されています。

このqilinモジュールを利用して以下の機能を提供するアプリケーション管理デーモンを作成しました。

1. 指定されたファイル・ディレクトリを監視し、変更があった場合に自動でworkerを再起動する。

2. httpでコマンドを送信する事により、workerの再起動や各workerのCPU・メモリ使用状況をJSON形式で取得したりできる(Windowsは未対応)。

3. 管理デーモンにhttpでコマンドを送る際にベーシック認証が使用できる。

使用方法の雰囲気だけ軽く説明すると、

qilin-daemonで管理したいNode.jsアプリケーションに関するこんな感じの設定ファイルを作成して、

```json:設定ファイルサンプル(qilin-daemon.json)
{
  "exec": "app.js",
  "args": [],
  "workers": 3,
  "daemon_port": 9999,
  "worker_disconnect_timeout": 5000,
  "silent": false,
  "watch": [ "libs", "routes", "views", "config/config.json" ],
  "auth_username": "admin",
  "auth_password": "admin"
}
```

qilin-daemonを実行します。

```sh
$ coffee /path/to/qilin-daemon.coffee /path/to/qilin-daemon.json
```

すると、こんなメッセージが出てworkerプロセスが起動します。

```sh
2013-10-13T02:50:34.795Z - info: Worker[2] is up: 6912
2013-10-13T02:50:34.803Z - info: Worker[1] is up: 3308
2013-10-13T02:50:34.818Z - info: Worker[3] is up: 8500
[daemon] app.js x 3 started (daemon_port: 9999)
```

curlでデーモンと通信して、アプリケーションのリソース使用状況を取得してみます。

```sh
$ curl http://localhost:9999/info
{
  "result": {
    "master": {
      "pid": 7108,
      "cpu": 6.35,
      "mem": 22.68
    },
    "workers": [
      {
        "pid": 8276,
        "cpu": 4.1,
        "mem": 10.84
      },
      {
        "pid": 7796,
        "cpu": 4.11,
        "mem": 10.85
      },
      {
        "pid": 7660,
        "cpu": 3.94,
        "mem": 10.85
      }
    ],
    "total": {
      "cpu": 18.5,
      "mem": 55.22
    }
  },
}
```

※見やすくするためにJSONを展開しています。

管理対象であるapp.jsに何か変更を加えるとworkerプロセスが自動で再起動します。

```sh
[daemon] killed workers
2013-10-13T03:01:18.555Z - info: Worker[3] died: 7660
2013-10-13T03:01:18.559Z - info: Worker[1] died: 8276
2013-10-13T03:01:18.561Z - info: Worker[2] died: 7796
2013-10-13T03:01:18.631Z - info: Worker[4] is up: 8864
2013-10-13T03:01:18.656Z - info: Worker[5] is up: 7156
2013-10-13T03:01:18.670Z - info: Worker[6] is up: 9992
[daemon] restart workers
```

と、こんな感じでお手軽にホットデプロイ環境を導入する事ができます。

詳細・ダウンロードは[こちら](https://github.com/ktty1220/qilin-daemon)からどうぞ。
vim-metarw-qiitaを作ってみた

[kana/vim-metarw](https://github.com/kana/vim-metarw "kana/vim-metarw")というプラグインがあります。
一覧の取得とバッファの読み書きを抽象化して、何でも読み書きできるようなフレームワークを作ってくれるものです。

[この記事](http://mattn.kaoriya.net/software/vim/20121204090702.htm "Big Sky :: モテる Vim 使いに読み書き出来ないファイルなどなかったんだよ！")が参考になりました。

これを利用して、Qiitaの記事を読み書きできるプラグインを作ってみました。
[joker1007/vim-metarw-qiita](https://github.com/joker1007/vim-metarw-qiita "joker1007/vim-metarw-qiita")

vim-metarw凄い楽ですね。
webapi-vimと組み合わせれば、API提供されてるものはかなりサクっと読み書きできるようになります。
それでもvimscript書くのに慣れてないので2日ぐらいかかりましたが。

現在、以下の機能があります。

### vimrcでの設定

```vim
let g:qiita_user='joker1007'
let g:qiita_token='xxxxxx' " API経由で取得しておく

" Optional
let g:qiita_per_page=50 " Max 100
```

cf. [Qiita APIドキュメント - Qiita:Developer](https://qiita.com/docs#18 "Qiita APIドキュメント - Qiita:Developer")

### Format
1行目がタイトル。
2行目がタグ。書式はスペース区切りでタグを分ける。タグ名に続けて`:`を書いてバージョン番号を記述可能。
1行空けて4行目から本文。

### Post current buffer as new item

```
:write qiita:
```

private post

```
:write qiita:?private=1
```

post and tweet

```
:write qiita:?tweet=1
```

post and gist it

```
:write qiita:?tweet=1
```

multi parameter

```
:write qiita:?private=1&tweet=1&gist=1
```

### Get my item list


```
:edit qiita:users/<my_username>
```

or

```
:QiitaMine
```

### Update current open item

```
:write
```

### Get user item list

```
:edit qiita:users/<username>
```

or

```
:QiitaUserItems <username>
```

### Get tag item list

```
:edit qiita:tags/<tagname>
```

or

```
:QiitaTagItems <tagname>
```

### Stock current open item

```
:QiitaStock
```

### Open by browser

```
:QiitaBrowse
```

### ScreenCast

![screencast](http://gifzo.net/pMlTb4hNVW.gif)
CocoaPodsがインストール出来ない時


結論から言うとRubyGemsが古い場合があるのでアップデートすればいい。以下はCocoaPodsのインストールが出来なかった時のメモ。

まずはとにかくCocoaPodsのinstallを行ってみる。

```
$ sudo gem install cocoapods
```

しかし10分たってもターミナルに反応なし。
Vオプションで進捗を表示させてみる

```
$ sudo gem install cocoapods -V
```

表示は次のようになる

```
$ sudo gem install cocoapods -V
GET http://rubygems.org/latest_specs.4.8.gz
302 Moved Temporarily
GET http://production.s3.rubygems.org/latest_specs.4.8.gz
200 OK
GET http://rubygems.org/specs.4.8.gz
302 Moved Temporarily
GET http://production.s3.rubygems.org/specs.4.8.gz
200 OK

```

ここで５分経過。成功する気配がないのでContrl-Cで中止。

これを見る限りどうもアクセスしているサーバーが正しくないのではないかという気がするのでRubyGemsをアップデートすることに。

今インストールされているRubyGemsのバージョンを調べるにはvオプションでいい

```
$ gem -v
1.3.6
```
インストールされているのは1.3.6らしい。

RubyGemsのアップデートはgemでアップデートの用のプログラムをインストールするところから

```
sudo gem install rubygems-update
```

念のためインストールしたリストを表示してみる

```
$ gem list

*** LOCAL GEMS ***

rubygems-update (2.1.8)
```

正しくrubygems-updateがインストールされているのでこれを実行

```
$ sudo update_rubygems
```

また念のためRubyGemsのバージョンを確認。

```
$ gem -v
2.1.8
```

バージョンが2.1.8になったので改めてCocoaPodsをインストールし直し

```
$ sudo gem install cocoapods
```

1分とかからず終了した。やっぱりRubyGemのバージョンが古かったみたいで余分に時間がかかってたんだろう。
TapsでdumpとってこようとしたときRack::Utils::OkJson::Error - cannot encode Symbolというエラー出たときのメモ


何も考えずにサーバ側で

```Terminal
$ taps server postgres://dbuser:dbpassword@localhost/dbname httpuser httppassword
```

して、クライアント側で

```Terminal
$ taps pull sqlite://dump.sqlite3 http://httpuser:httppassword@192.168.33.10:5000
```

としたら、

```
Rack::Utils::OkJson::Error - cannot encode Symbol ...
```

というエラーが発生した。

調べたところ、[Tapsのissue](https://github.com/ricardochimal/taps/issues/128)にて報告されていた問題だった。rack 1.0.1に依存していて、新しいrackバージョンでSinatraを動かすと発生する。

TapsのSinatraサーバ側で使うrackを1.0.1に指定すれば解決する。DBのデータを送受信するためだけにSinatraを動かすので公開するアプリケーションではない。よって古いバージョンでも問題ない。


## サーバ側

まずサーバにsshで入る。今回はVagrantで試した。

```Terminal
$ ssh katryo@192.168.33.10
```

適当なディレクトリを作って、Gemfileを設置する。


```Terminal
$ mkdir for_taps_dump
$ cd for_taps_dump
$ bundle init
```

Gemfileが設置されるので編集する。

```ruby:Gemfile
source "https://rubygems.org"
gem 'rack','1.0.1'
gem 'taps'
gem 'sqlite3'
gem 'pg'
```

古いrackをサーバにインストールする。

```Terminal
$ bundle
```

この古いrack(Ver 1.0.1)を使ってSinatraを動かせばいい。rackのバージョンを指定してtapsを動かすには以下のコマンドで大丈夫。

```Terminal
$ bundle exec taps server postgres://dbuser:dbpassword@localhost/dbname httpuser httppassword
```

## クライアント側

クライアント側、つまり開発環境のほうではrackのバージョン指定は不要。

SQLite3のDBとして受け取りたいので、

```Terminal
$ taps pull sqlite://dump.sqlite3 http://httpuser:httppassword@192.168.33.10:5000
```

これでdumpをクライアント側に持ってこれる。
ruby-opencvでカメラを利用する


[前回](http://qiita.com/yucchiy/items/59d2d55385452b17929d)は画像から顔検出を行う方法を紹介したが, カメラも使えるといろいろ面白そうだなーと思い調べてみた.

## 動作環境

- OS
	- MacOSX 10.8
- Ruby
	- ruby 2.0.0p0
- OpenCV
	- 2.4.6

詳しくは[前回](http://qiita.com/yucchiy/items/59d2d55385452b17929d)を参考に.

## カメラを利用する

以下のソースでカメラから`Iplimage`クラスの画像データを取得できる.

```ruby
#!/usr/bin/env ruby

require 'opencv'
include OpenCV

# マシンに接続されているカメラのうち, 1番めのカメラを利用する
camera = CvCapture.open(0)
window = GUI::Window.new('camera')

# このループ内で何かする
# 今回はただ表示するだけ
while true
  # Iplimageクラスの画像データをキャプチャする
  image = camera.query

  window.show image

  key = GUI::wait_key 10

  # キーボードでqを入力したら終了
  break if key == 'q'
end
```

たとえば, これと[前回](http://qiita.com/yucchiy/items/59d2d55385452b17929d)の笑い男のロゴを貼り付けるプログラムを組み合わせるとかすると面白いかもしれないですね!
Mountain Lion環境への「virtualenv」と「pythonz」のインストール手順 + 利用方法


## 1. はじめに
Mountain Lionには標準でPythonがインストールされています。
しかし、最新のPython環境を利用したいけどMacに標準インストールされているPythonは残したいと思ってしまうと、なかなか最新のPythonをインストールすることはできません。
今回はMacに標準インストールされているPythonをそのまま残すことができ、かつ、さまざまなPython環境を使うことができる「virtualenv」と「pythonz」について書いていきたいと思います。

## 2. 前提条件
・easy_install がインストールされていること

*) easy_installがインストールされていない場合、以下のコマンドを実行してください。

```
$ curl -O https://svn.apache.org/repos/asf/oodt/tools/oodtsite.publisher/trunk/distribute_setup.py
$ sudo python distribute_setup.py
```

## 3. インストール手順

(1) easy_installを使ってvirtualenvをインストールします。

```
$ sudo easy_install virtualenv
```

(2) 以下のコマンドを実行して、pythonzをインストールします。

```
$ curl -kL https://raw.github.com/saghul/pythonz/master/pythonz-install | bash
```

(3) .bashrcに以下の内容を追加します。

```
[[ -s $HOME/.pythonz/etc/bashrc ]] && source $HOME/.pythonz/etc/bashrc
```

(4) 修正した.bashrcの内容を反映させます。

```
$ source ~/.bashrc
```

## 4. pythonzのコマンド集

(1) cleanup

* pythonzを使ってPythonをインストールした際にダウンロードしたファイルやフォルダ群を削除します。

```
$ pythonz cleanup
```

(2) install

* Pythonをインストールします。

```
$ pythonz install (バージョン)
```

*) インストール可能なPythonのバージョンは、以下のコマンドを使って調べることができます。

```
$ pythonz list -a
```

(3) list

* pythonzを使ってインストールされたPythonおよびインストール可能なPythonのバージョンを表示します。

```
$ pythonz list	# 現在インストールされているPythonのバージョンを表示する
$ pythonz list -p # 現在インストールされているPythonのパスを表示する
$ pythonz list -a # pythonzでインストール可能はPythonのバージョンを表示する
```

(4) uninstall

* pythonzを使ってインストールされたPythonを削除します。

```
$ pythonz uninstall (バージョン)
```

(5) update

* pythonzを最新のバージョンに更新します。

```
$ pythonz update
```

## 5. virtualenvでPythonの仮想環境を構築する

(1) virtualenvの作業フォルダを作成します。今回はホームディレクトリ上に.virtualenvフォルダを作成します。

```
$ mkdir ~/.virtualenv
$ cd ~/.virtualenv
```

(2) virtualenvコマンドでPythonの仮想環境を作成します。

```
# 基本コマンド
$ virtualenv -p (Pythonの実行ファイルのインストール先パス) (仮想環境名) # 「-p」を指定しなかった場合、Pythonのバージョンは2.5になります。
# 使用例
$ virtualenv -p ~/.pythonz/pythons/CPython-2.7.5/bin/python py27
```

(3) 以下のコマンドでPythonの仮想環境を立ち上げます。

```
$ source py27/bin/activate # 「py27」は上記で作成した仮想環境名です。適時、読み替えてください。
```

(4) Pythonの仮想環境を終了させる場合、以下のコマンドを実行します。

```
$ deactivate
```
Sassの@each内でインデックスキーを取得して別配列の値をセット


特定のclass名ごとに、色を変えたい・・・といったケースでの話。
連想配列や多次元配列が使えないようなので、とりあえず思いついた方法をメモ。

#### 手順.1
***
同じ長さの配列を2つ定義

	// Sass
	$category_names: categoryA, categoryB, categoryC, categoryD;
	$category_colors: #000, #f00, #0f0, #00f;


#### 手順.2
***
each文で、配列:$category_namesの値をclass名にセットしつつ、配列:$category_colorsの値で文字色に挿入

	// Sass
	@each $class_name in $category_names {
		$index_key: index($category_names, $class_name);

		.#{$class_name} {
			color: nth($category_colors, $index_key);
		}
	}

インデックスキーは

	index(配列名, キーを取得したい値);

値は

	nth(配列名, インデックスキー);

で、それぞれ取得

出力されたコードは、下記のようになる

	// CSS
	.categoryA { color: black; }
	.categoryB { color: red; }
	.categoryC { color: lime; }
	.categoryD { color: blue; }

#### その他
***
@eachのループ外では、任意のインデックスキーを数値指定

	.hoge {
		color: nth($category_colors, 1);
	}

その際、最初のキーは 0 ではなく 1 から始まる点に注意


**参考URL**
[http://cutupworks.ldblog.jp/archives/12353077.html](http://cutupworks.ldblog.jp/archives/12353077.html)
電話番号SIDを取得する

Twilio 電話番号SID取得する方法です。
こちらのソースを実行すれば自分のアカウントの登録されている電話番号のSIDを取得することが可能です。

```rb:get_twilio_PN
# Get twilio-ruby from twilio.com/docs/ruby/install
require 'rubygems'          # This line not needed for ruby > 1.8
require 'twilio-ruby'
 
# Get your Account Sid and Auth Token from twilio.com/user/account
account_sid = 'your Account SID'
auth_token = 'your Auth Token'
@client = Twilio::REST::Client.new account_sid, auth_token
 
 
# Loop over numbers and print out a property for each one
@client.account.incoming_phone_numbers.list.each do |number|
    puts number.sid
    puts number.phone_number
end
Python importされたモジュールのpath確認

```shell-sessionl:shell-session
python2.4 -c 'import os; print os.__file__'
```
>
```shell-sessionl:result
/usr/lib/python2.4/os.pyc
```

```shell-sessionl:shell-session
python2.6 -c 'import os; print os.__file__'
```
>
```shell-sessionl:result
/usr/lib/python2.6/os.pyc
```

```shell-sessionl:shell-session
python2.7 -c 'import os; print os.__file__'
```
>
```shell-sessionl:result
/usr/local/lib/python2.7/os.pyc
```
技術的な文章を書くための第0歩 ～読者に伝わる書き方～

はじめまして。ひつじです。

[TechBooster](http://techbooster.org/)というウェブサイトでAndroidなどの記事をかいてます。Qiitaには初めて投稿します。

[vvakame](http://qiita.com/vvakame)さんの[技術的な文章を書くための1歩、2歩、3歩](http://qiita.com/vvakame/items/d657baf26cf83ac98bd0) を見る人の補助的な気持ちで0歩目を紹介します。
記事の構成方法については、vvakameさんの記事で触れられてることもあり、あまり触れません。

読みやすい文章のための心得をまとめました。

0歩というぐらいなので普段から気を付けている（そして完璧には、こなせていない）内容をまとめています。ただ内容については私自身が気を付けていることですので、もっと皆さんにあった良い方法があるかもしれません。参考になれば幸いです。

# 文章を書くのに大切なことって？
* 言いたいことを1つに絞る

１つの文章にたくさんの主張を入れると読む人は混乱してしまいます。ですので、なるべく1つのコンテキスト（章、節、項で主張の大小はあります）では、言いたいことを１つ主張するようにしてください。

# 文章に興味を持ってもらうには？
* まとめ（アブスト）を最初にかく

読者はあなたの主張を読みたがっています。数あるウェブサイト、雑誌、書籍のなかから偶然にも興味をもって読んでくれています。しかし、最後まで読んでみて期待した内容でなかった時の残念感は計り知れません。

最初にまとめをのせることは読者と記事のマッチングをとるためでもあります。まとめでは主張の魅力を最大限伝えてください。まとめが良ければよいほど最後まで読んでもらいやすくなります。

#  文章を理解してもらうには？
ここでは文法的な、または文章として読みやすくする工夫を紹介します。ちょっとしたことなのですが、すべてを守ろうとおもうと意外に難しいものです。以下に3点のポイントに絞って、まとめました。

* 文章は短く、簡素に書く

長い文章は、主語、述語の対応が取りにくく（筆者の国語力もありますが）主張があいまいになりがちです。経験的に技術文章で3行を超える文章（句点「。」で区切られていない長文）は読みづらく感じます。

まれに長くても面白い文章を書く人がいるのですが、一般的なノウハウというより国語的な才能の場合があります。技術的な文章であれば修飾的な表現は割り切って簡潔に伝えましょう。

* 初出の用語/概念は説明する

書いていると用語解説を忘れることがあります。「文章を書く」という作業は言い換えるならば筆者の主張や考えをまとめる、という行為です。

そうして出てきた単語は、筆者の中では既知のものとなっており説明不要と思い込んでしまうことがままあります。読者にとっては初めて出てきた単語は未知の物体Xであり、理解の妨げになることを十分留意して下さい。

* 表現を統一する

ささいなことですが読みやすさに最も影響します。国語的なことではありますが筆者が主張を文章に落とし込んだあとは、その文章があなたの主張、意見そのものとして読まれます。

読みやすさを気にしてしすぎる、ということはありません（もちろん著者の書くモチベーションや勢いも大事なので最後にチェックするといいでしょう）。

# 表現チェックリスト
ここで紹介する内容は～しなければならない！といった強制的なものでありません。特に雑誌や書籍では出版社ごとに異なる方針のものもあります。ですので、読みやすさの参考程度にしてください。たとえばウェブの記事であれば多少ライトな表現のほうが読みやすく感じます。

* 表現を統一する： 著者、書き手、筆者、執筆者＝著者でまとめる
* 用語を統一する： onCreate()／onCreateメソッド／Activity#onCreate()
* 開きを統一する： ～出来る／～できる、～する事／～すること など漢字の開きを合わせる
* 指示語を減らす： あれ、それ、これ、前述の～、など。何を指しているか明確か？確認する
* 記号は意識する： ()や「」、『』の使い分けを統一する
* ～と思います：～です。で改めることを薦めます。事実、現象であれば断定系で構いません

## さらに一歩踏み込んで
細かい話になるので例を使って確認してみましょう。もっとも表現方法は千差万別ですので著者の書いた文章中で統一されていれば問題ありません。文章の品位を上げる作業といえます。

**これは作例です（テストです。)**

という文章があったとします。私の場合は以下のように順次考えて、なおしていきます。

**これは作例です（テストです)。**

句点「。」の位置を文章の最後に変えました。

**これは作例です（テストです）。**

「（）」が全角と半角だったので全角にあわせました。

**これは作例（テスト）です。**

「です」が重複していることに気づいたので片方を消しました。

これら細かい推敲は、書きながら（ほぼ勝手に）脳内で行われている作業です。
実際、執筆を複数回に分けていたり長時間にわたって書いていたりすると経験上、マチマチになってしまいます。

# 推敲する
* 書き終わったら自分で読む

書き終わったら、いったん気持ちをリセットして読者視点で文章を読んでみてください。なおしたいところが出てきたら修正してまた読む。気にならなくなるまで繰り返します。一見すると単純ですが、自分が書いた文章は自分が一番よく理解しているので、意外に難しい作業です。

# 最後に
技術的な文章を書くための0歩として「読みやすい文章のための心得」を紹介しました。
0歩にしては細かいところから考え方まで幅広かったので結構めんどくさいですね。

もちろん最初からすべてを完璧にできる人はいません。私自身も試行錯誤の連続です。あなたが自分なりの書き方、表現方法を考えるきっかけになったのであれば、この記事の目的は達成されたといえます。

何度もくりかえしになりますが読者にとって大事なのは筆者の主張です。
Qiitaのような場所では、みんなが技術文書を読みたがっています。今読んだことを活かす為にも、さっそくひとつ書いてみませんか？

それでは良い執筆ライフを：）
[GroovyとProcessing]図形の移動

時間が経つごとに図形が右下に移動していく
（動画内ではフレームレートについての説明をしている）

動画リスト：[LWJGLのチュートリアル](http://www.youtube.com/playlist?list=PL19F2453814E0E315)
動画は[ココ](http://www.youtube.com/watch?v=0xsHwpzkNxQ)

```groovy:DisplayTest.groovy
package episode007

import groovy.swing.SwingBuilder
import processing.core.PApplet

import javax.swing.*

class DisplayTest extends PApplet {

    def lastFrame

    def posX, posY
    def dx = 1, dy = 1

    def void setup() {
        frameRate(60)

        lastFrame = System.currentTimeMillis()
        posX = 100
        posY = 100
    }

    def void draw() {
        background(0, 0, 0)

        def delta = delta   // getDelta()
        posX += delta * dx * 0.1
        posY += delta * dy * 0.1

        noStroke()
        fill(255, 255, 255)
        rect(posX, posY, 50, 50)
    }

    def getDelta() {
        def currentTime = System.currentTimeMillis()
        def delta = currentTime - lastFrame
        lastFrame = currentTime
        delta
    }

    def static void main(args) {
        def display = new DisplayTest()
        new SwingBuilder().frame(
                title: 'Episode 3',
                defaultCloseOperation: JFrame.EXIT_ON_CLOSE,
                size: [640, 480], show: true) {
            widget(display)
        }
        display.init()
    }
}
```

![grocessingGL007.png](https://qiita-image-store.s3.amazonaws.com/0/17179/a99410c1-baa3-0aee-6b96-8372440d5342.png)
golangのnewとmakeの違いの確認

```go

package main

import "fmt"

type Butsuzo struct {
	a  string
	un string
}

func main() {
	// make
	t := make([]Butsuzo, 0)
	fmt.Println(t)
	// []

	v := Butsuzo{"a", "b"}
	t = append(t, v)
	fmt.Println(t)
	// [{a b}]

	t = append(t, Butsuzo{"c", "d"})
	fmt.Println(t)
	// [{a b} {c d}]

	fmt.Println(t[0].a)
	// a
	fmt.Println(t[1].un)
	// d

	// new
	tt := new(Butsuzo)
	fmt.Println(tt)
	// &{ }

	tt.a, tt.un = "aa", "bb"
	fmt.Println(tt)
	// &{aa bb}
	fmt.Println(*tt)
	//  {aa bb}

	vv := Butsuzo{"a", "b"}
	uu := vv
	fmt.Println(uu)
	// {a b}
}
```
今話題の Makefile を Scheme で書く！をやってみよう (Ubuntu で)

今巷で最もホットな話題は，あの Lisp 方言の Scheme を Makefile の中で使うって話です．

GNU make が 3 年ぶりにメジャーアップデートされ，そのいくつかの変更点の中で Guile って処理系を使って Scheme が記述出来るようになったよ〜，というのがあります．

BSD make の方，お許しください．

[Lisp は神の言語](http://kaosf.tumblr.com/post/60844291806) であり，それをあのしち面倒臭い Makefile の中で記述出来るようになったというのです．いやぁこれは素晴らしいですね．きっと素晴らしいに違いありません．

Ubuntu 13.10 がそろそろ出る頃ですが，今私のマシンは Ubuntu 13.04 なのでそれで話をします．

Ubuntu 13.04 で `build-essentials` パッケージをインストールすると GNU make 3.81 がインストールされます．なので Make 4.0 を先取りで試すために手動でビルドしましょう．野良ビルドはあんまりよろしくないような話も聞きますが (Gent○○方面から)，まぁあんまり気にし過ぎてもしょうがないような気がします．

https://github.com/kaosf/ubuntu-setup/blob/d7d6c0ae5ef2d7b6cc37340fcdfc386165aa4288/make-4.0-setup.sh

ここに現時点での make のセットアップコマンドのログが置いてあります．make 4.0 を make 3.81 を使ってビルドする，ちょっと，こう，何と言うか楽しいですね．

```sh
echo 'export PATH=$HOME/local/bin:$PATH' >> $HOME/.zshenv # or $HOME/.bash_profile
source $HOME/.zshenv # or $HOME/.bash_profile

sudo apt-get install guile-2.0 guile-2.0-dev

mkdir -p $HOME/local/bin
mkdir -p $HOME/local/src
cd $HOME/local/src
wget http://ftp.gnu.org/gnu/make/make-4.0.tar.gz
tar xzf make-4.0.tar.gz
cd make-4.0
./configure --prefix=$HOME/local
make
make install
```

guile 2.0 のパッケージをインストールして (※`guile-2.0` と `guile-2.0-dev` のどちらか片方は不要だったかもしれません．調べられないなう．誰かもし分かったら教えて下さい．)

ひとまずこれで `~/local/bin/make` が出来上がり，今後 Makefile 内に Scheme のコードを記述することが出来ます．

`make --version` でバージョンが 4.0.0 になってることを確かめてみるといいかもです．

まず簡単に Scheme コードが書ける例を見てみましょう．

```mf:Makefile
$(guile "all:")
        echo $(guile (string-append "unk" "ksy"))
```

これそのままコピペしたらあかんですよ．タブ文字を使って下さい．`echo ...` の前に．Makefile ってその辺しんどいね．

これで `make` コマンド実行してみましょう．`unkksy` と echo されましたか？

`string-append` という関数については自分でググって見てください．

`$(guile ...)` と書いたら `...` の部分が Scheme のコードとして，Guile という処理系で処理されてそれがそのまま使えるんですね．すばらです！！

ただ，私の試した範囲ではさすがに

```mf
$(guile "all:\n\techo \"unkksy\"")
```

はダメでした．

```text
make: *** No rule to make target 'echo', needed by 'all'.  Stop.
```

ってエラーでした．残念．

これ以上のことは試してません．

何か面白いことが出来たらいいですね．

## References

* [本の虫: GNU Make 4.0にGNU Guileが組み込まれた](http://cpplover.blogspot.jp/2013/10/gnu-make-40gnu-guile.html)
パケットフィルタリングウィジェット

chromeウィジェットで一応パケットフィルタリングしたデータを扱うことができるようです。
chromeのdev toolsに備わっている機能からデータをもらうことで実現します。

dev toolsの機能を利用するためには`manifest.json`に`"devtools_page": "devtools.html"`の記述を加えます。
devtools_page内のjavascriptからならchrome.devtools機能が使えます。

```js:devtools.js
chrome.devtools.network.onRequestFinished.addListener(function (request) {
    request.getContent(function (content) {
        chrome.extension.sendRequest(content);
    });
});
```

contentに受信したデータが格納されています。
ただ、この記述でパケットフィルタリングが行えるのはchrome devtoolsを開いている時限定なので
この機能をユーザー向きなウィジェットで利用するのはハードルが高いかもしれません。
chrome devtoolsをバックグランドで開いたり、利用する方法があれば解決するのですが。
Genymotion + Android Studio で Android 爆速開発メモ


## 今回の内容
- だいたい↓見たらわかるので見ながら…
- "Android Studio から genymotion を使ってビルドしてみた | tamo*memo" http://tamotamago.com/?p=608


## Genymotion って(?_?)
- Android 爆速エミュレータ
  - Android のエミュレータおっそくてアレなので、Genymotion オススメですね。
- Google Play ( iOS でいうところの App Store ) 付きなのでアプリのインストールができる！
- なので、開発だけじゃなくて、PC から Android アプリが使える便利なこともありそう。
- ※ 2.x から GooglePlay が同梱されなくなったみたいです

## Android Studio って(?_?)
- Google謹製のAndroid開発環境

## Genymotion のインストール + 設定
- virtualbox が必要
- http://www.genymotion.com/
- ver. 2.2.2
- アカウント作って、普通にインストールする。
- [homebrew-cask](http://caskroom.io/) を使うとらく

```
brew cask install genymotion
# virtualbox がなければ
# brew cask install virtualbox genymotion
```

## Android Studio のインストール + 設定
- http://developer.android.com/sdk/installing/studio.html
- 普通にインストールする。
- Genymotion Plugin 入れる。
- Genymotion でなにか device を起動しておく。
- build 時に Genymotion の ↑の device を選択すればそれで起動する。
- ヽ(=´▽`=)ﾉ