OmniAICreator/Qiita-1.07M huggingface dataset:
Rails Jbuilderの使い方

railsのコンソールにてJbuilderの使い方を確認してみました。

# 例とするモデル

```rb
class Customer < ActiveRecord::Base
# name,email,password,country
end
```

# 単一要素

## 全属性を出力

```rb

customer = Customer.find(1)
Jbuilder.encode do |json|
  json.my_customer customer
end

```

メソッド名がJSONの属性名になる。

```json
{
  "my_customer": {
    "name": "A C",
    "email": ~~~~~~,
    (他の要素)
  }
}
```


## 特定の属性を出力する場合

```rb
customer = Customer.find(1)
Jbuilder.encode do |json|
  json.my_customer customer, :email
end
```

```json
{
  "my_customer": {
    "email": "a@b"
  }
}
```

# 配列要素を出力する場合

## 全属性

```rb

customers = Customer.where(id: [1,2])

Jbuilder.encode do |json|
  json.my_customers customers
end
```

```json

{
  "my_customers": [{
    "name": "A C",
    "email": ~~~~~~,
    (他の要素)
  },{
    "name": "A B",
    "email": ~~~~~~,
    (他の要素)
  }]
}  

```

## 属性指定

```rb
customers = Customer.where(id: [1,2])

Jbuilder.encode do |json|
  json.my_customers customers, :email
end
```

```json
{
  "my_customers": [{
    "email": ~~~~~~,
  },{
    "email": ~~~~~~,
  }]
}  
```

# ハッシュの中にオブジェクトを含む場合

## 全属性

```rb
obj = {
  rank: 1,
  customer: Customer.find(1)
}

Jbuilder.encode do |json|
  json.my_customer obj
end
```

```json
{ "my_customer": {
    "rank": 1,
    "customer": {
      "name": "A B",
      "email": ~~~~~~,
      (他の要素)  
    }
  }
}

```

## 属性を指定する場合

```rb
obj = {
  rank: 1,
  customer: Customer.find(1)
}

Jbuilder.encode do |json|
  json.my_customer do
    json.rank obj[:rank]
    json.customer obj[:customer], :email
  end
end
```

```json
{ "my_customer": {
    "rank": 1,
    "customer": {
      "email": ~~~~~~
    }
  }
}

```


## ハッシュが配列の要素の場合

属性名なしの配列を生成する場合

```rb
objs = [ {
    rank: 1,
    customer: Customer.find(1)
  }, {
    rank: 2,
    customer: Customer.find(2)
  }
]

Jbuilder.encode do |json|
  json.array! objs do |obj|
    json.rank obj[:rank]
    json.customer obj[:customer], :email
  end
end
```

```json
[{
  "rank": 1,
  "customer": {
    "email": ~~~~~~
 },{
  "rank": 2,
  "customer": {
    "email": ~~~~~~
 }
}]
```

属性名有りの配列を生成する場合

```rb
objs = [ {
    rank: 1,
    customer: Customer.find(1)
  }, {
    rank: 2,
    customer: Customer.find(2)
  }
]

Jbuilder.encode do |json|
  json.ranking do
    json.array! objs do |obj|
      json.rank obj[:rank]
      json.customer obj[:customer], :email
    end
  end
end
```

# 参考

https://github.com/rails/jbuilder
小ネタ。railsで電話番号、メールアドレスをviewに表示しないようにする

ほんとに小ネタです。

ユーザーの入力した電話番号、メールアドレスをそのままviewに表示してしまうと後でクレームになりやすいですよね。入力しないで下さいと言ってもコピペに混ざってそのまま入力される場合もあります。

ここでは電話番号とメールアドレスが文字列中に含まれていれば、\*censored\*に置き換えます。

```rb
  def censor(string)
    string.gsub(/\d{2}[\s\d-]{5,}/, "*censored*").gsub(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}/i, "*censored*")
  end
```

これだけです。すっきり。

以下のstackoverflowを参考にしました。

http://stackoverflow.com/questions/17767716/extract-phone-numbers-from-string-using-regex
Cakephp で paginate での 外部結合を行う

メモ

```php
<?php
public class UsersController extends AppController {
public $paginate = array (
    'User' => array (
        'limit' => 20,
        'order' => 'User.id',
        'fields' => '*',
        'joins' => array (
            array (
                'type' => 'LEFT',
                'table' => 'roles',
                'alias' => 'Role',
                'conditions' => 'Role.id = User.role_id' 
            ) 
        ) 
    ), 
    "Role" => array() 
);

public function index($type = "all") {
    $this->request->list = $this->paginate ("User");
}

}
```
nginxのworker_cpu_affinityの設定を自動生成する

nginxには`worker_cpu_affinity`というワーカープロセスを特定のCPUコアに割り振るディレクティブがある。これを使えばnginxの各ワーカープロセスをそれぞれ別のCPUコアに均等に割り当てることが可能になる。

```nginx
# CPUのコア数(=4)分のワーカープロセスを起動(この場合はautoでもよい)
worker_processes 4;
# 各CPUコアに均等にワーカープロセスを割り当てる
worker_cpu_affinity 1000 0100 0010 0001;
```

さて、ここからが本題だが、`worker_cpu_affinity`の設定を手で書くのは少々めんどくさい。上記の場合、CPUコア数は4だからまだ楽だが、8とか16とかになると結構つらい。というか高確率でtypoする。というわけでジェネレーターをGoで書いてみた。

[nwcagen](https://github.com/cubicdaiya/nwcagen) - worker_cpu_affinity configuration generator for nginx.

**追記(2016/07/02)**：ngnx-1.9.15から`worker_cpu_affinity`の値に`auto`を設定することでCPUコアを各ワーカープロセスに均等に割り当てることができるようになりました。コメント欄を参照）

インストールは↓で。

```zsh
go get -u github.com/cubicdaiya/nwcagen
```

あとは`nwcagen`というコマンドにワーカー数(`-n`)とCPUコア数(`-c`)を与えて実行すればOK。引数なしの場合は実行されているマシンのCPUコア数を基に生成する。

```zsh
$ nwcagen -n 4 -c 4
worker_cpu_affinity 1000 0100 0010 0001;
$
```

今のところ各CPUに割り振る設定しか吐けないけど、そもそも特定のCPUに偏る設定を書くケースってレアだよね？(多分)
D3.jsで"+09:00"がパースできない件

```js
var dateString = "2014-07-23T00:00:00.000+09:00";

var wrongFormat = d3.time.format("%Y-%m-%dT%H:%M:%S.%L%Z");
wrongFormat.parse(dateString); //=> null

var rightFormat = d3.time.format("%Y-%m-%dT%H:%M:%S.%L+09:00");
rightFormat.parse(dateString); //=> Date
```

タイムゾーンを表す`%Z`は`+0900`のようなフォーマットはパースできるけど、`:`が含まれるとパースできない。上のようにしたら解決した。

### 参考
- https://github.com/mbostock/d3/wiki/Time-Formatting
- https://groups.google.com/forum/#!topic/d3-js/mPiCEO8ZfnU
ターミナルとしてのMinGW+MinTTYのセットアップ

# MinGW+Mintty
## 環境
Windows 8.1 pro

## 参考サイト
http://www.mingw.org/wiki/Getting_Started
http://zarari.hatenablog.com/entry/2013/08/22/235819

## MinGWのダウンロード
http://www.mingw.org/
公式サイトからSetupToolを取得。インストール。

MinGW InstallationManagerが起動するので
Basic Setupの中のPackageを全てMarkしてインストールします

## 環境変数の設定
Pathに`C:\MinGW\bin` `C:\MinGW\MSYS\1.0\bin`を追加

## minttyのインストール
コマンドプロンプトを起動し以下のコマンドを実行
```
mingw-get update
mingw-get install mintty
```

## minttyの起動
コマンドプロンプトで以下のコマンドを実行する
`mintty`

minttyが起動したらタスクバーにピン止めしてプロパティを開く
    ピン止めしたくなければ適当にショートカット作ってプロパティを開いて下さい
リンク先の末尾に[-]を追加する。具体的には以下のようになるはず。
`C:\MinGW\msys\1.0\bin\mintty.exe -`

一度minttyを終了しタスクバーから起動するとログインシェルとして起動します。

## minttyの設定
minttyのウィンドウを右クリック->optionでいろいろ弄りましょう
OKを押すと`~/.mintty` が作成されるので以後これを直接触るのも良いでしょう

参考に私の.minttyを晒しておきます

``` bash:.mintty
BoldAsFont=no
Transparency=10
Font=ゆたぽん（コーディング）
FontIsBold=yes
FontHeight=12
FontSmoothing=full
Term=xterm-256color
Locale=ja_JP
Charset=UTF-8
ForegroundColour=131,148,150
BackgroundColour=0,43,54
CursorColour=220,50,47
Black=7,54,66
BoldBlack=0,43,54
Red=220,50,47
BoldRed=203,75,22
Green=133,153,0
BoldGreen=88,110,117
Yellow=181,137,0
BoldYellow=101,123,131
Blue=38,139,210
BoldBlue=131,148,150
Magenta=211,54,130
BoldMagenta=108,113,196
Cyan=42,161,152
BoldCyan=147,161,161
White=238,232,213
BoldWhite=253,246,227
OpaqueWhenFocused=no
CursorType=block
```

## sshの設定
mingw-get install msys-openssh

これでsshコマンドが使えるので後は好きな様に
コマンド打つなり
`ssh -l ore -i ~/.ssh/private_key example.com`

`~/.ssh/config`にごにょごにょ書くなりすればいいと思います！

これでputtyと同じ感じでmintty起動ssh hoge でサーバーに接続できるようになりました

## （おまけ）vimの設定
せっかくなので入力モードとコマンドモードでカーソル変えたいので以下を追加
これをputtyじゃできそうもなかったので乗り換えました

```bash:.vimrc
if &term =~ "screen"
    let &t_ti.= "\eP\e[1 q\e\\"
    let &t_SI.= "\eP\e[5 q\e\\"
    let &t_EI.= "\eP\e[1 q\e\\"
    let &t_te.= "\eP\e[0 q\e\\"
elseif &term =~ "xterm"
    let &t_ti.="\e[1 q"
    let &t_SI.="\e[5 q"
    let &t_EI.="\e[1 q"
    let &t_te.="\e[0 q"
endif
```
javascriptで必ずboolean値を返す

#概要
Objectでもfunctionでもなんでもboolean値で返す手法です。

常識なのかもしれませんが、Modernizrのソースを読んでいて初めて
知ったので残しておきます。

#実装
``` test.js
var str   = 'hoge';
var str_e = '';
var num   = 1;
var num_e = 0;
var nl    = null;
var unde  = void 0;
var obj   = {jojo: 'oraora', dio: 'mudamuda'};
var obj_e = {};
var arr   = ['ora', 'muda'];
var arr_e = [];
var fnc = function() {};

console.log(!!str);    // true
console.log(!!str_e);  // false
console.log(!!num);    // true
console.log(!!num_e);  // false
console.log(!!nl);     // false
console.log(!!unde);   // false
console.log(!!obj);    // true
console.log(!!obj_e);  // true
console.log(!!arr);    // true
console.log(!!arr_e);  // true
console.log(!!fnc);    // true

```

#ちなみに
Ruby, PHPでもこの書き方ができるようです。
この書き方の正式名称を知っている方は教えて下さいm(_ _)m
globalコマンドでちょっとハマった

使い慣れないglobalコマンドでちょっとハマったので後のためにメモ．
normalモードのコマンドは本当に「そのまま」入力すればよかった．

* インクリメント

```
:g/^/ normal 24^A     # 正解  <C-a>をタイプする
:g/^/ normal 24<C-a>  # 間違い
```

* スペースを検索

```
:g/^/ normal f ^A     # スペースまで移動してインクリメント
```
CentOS6でredis-2.8.13のrpmを作成する


```bash:redis-2.8.13のrpmを作成する
rpmdev-setuptree
#make testでtclが必要な為インストール
sudo yum -y install tcl

#旧バージョンからSPECファイルを取得してコピーする
rpm -ivh http://dl.fedoraproject.org/pub/epel/6/SRPMS/redis-2.4.10-1.el6.src.rpm
rm ~/rpmbuild/SOURCES/redis-2.4.10.tar.gz
cp ~/rpmbuild/SPECS/redis.spec ~/rpmbuild/SPECS/redis2813.spec

#コピーしたSPECファイルを編集
sed -i -e 's/^Version:          2.4.10$/Version:          2.8.13/' ~/rpmbuild/SPECS/redis2813.spec
sed -i -e 's/^Patch0:           %{name}-2.4.8-redis.conf.patch$/Patch0:           %{name}-%{version}-redis.conf.patch/' ~/rpmbuild/SPECS/redis2813.spec
sed -i -e 's/^%doc 00-RELEASENOTES BUGS CONTRIBUTING COPYING README TODO$/%doc 00-RELEASENOTES BUGS CONTRIBUTING COPYING README/' ~/rpmbuild/SPECS/redis2813.spec

#最新バージョンのredisを取得し、redis.confファイルを編集してパッチを作成
curl -L -O http://download.redis.io/releases/redis-2.8.13.tar.gz
tar zxf redis-2.8.13.tar.gz
cp -p redis-2.8.13/redis.conf redis-2.8.13/redis.conf.orig
sed -i -e 's/^daemonize no$/daemonize yes/' redis-2.8.13/redis.conf
sed -i -e 's/^pidfile \/var\/run\/redis.pid$/pidfile \/var\/run\/redis\/redis.pid/' redis-2.8.13/redis.conf
sed -i -e 's/^logfile ""$/logfile \/var\/log\/redis\/redis.log/' redis-2.8.13/redis.conf
sed -i -e 's/^dir \.\/$/dir \/var\/lib\/redis\//' redis-2.8.13/redis.conf
diff -up redis-2.8.13/redis.conf.orig redis-2.8.13/redis.conf > rpmbuild/SOURCES/redis-2.8.13-redis.conf.patch

#ビルド
mv redis-2.8.13.tar.gz ~/rpmbuild/SOURCES/
rpmbuild -ba ~/rpmbuild/SPECS/redis2813.spec
```

```bash:redisをインストール
sudo rpm -ivh /home/rpmdevel/rpmbuild/RPMS/x86_64/redis-2.8.13-1.el6.x86_64.rpm
```
docker+pecoでコンテナ（イメージ）操作

```bash
#alias docker='sudo docker'

# pecoで選択したコンテナに対して操作を行う
docker_peco_containers() {

  if [ $# -lt 1 ]; then
    echo "Usage: dpc [OPTIONS] COMMAND [args]" >&2
    return 1
  fi

  docker ps -a | peco | while read CONTAINER
  do
    docker $@ `echo $CONTAINER | awk '{print $1}'`
  done

}

# pecoで選択したイメージに対して操作を行う
docker_peco_images() {

  if [ $# -lt 1 ]; then
    echo "Usage: dpi [OPTIONS] COMMAND [args]" >&2
    return 1
  fi

  unset DOCKER_OPTS

  [[ -z $ENVS ]] || \
    for e in $ENVS; do DOCKER_OPTS="$DOCKER_OPTS -e $e"; done

  [[ -z $VOLUMES ]] || \
    for v in $VOLUMES; do DOCKER_OPTS="$DOCKER_OPTS -v $v"; done

  [[ -z $PORTS ]] || \
    for p in $PORTS; do DOCKER_OPTS="$DOCKER_OPTS -p $p"; done

  docker images | peco | while read IMAGE
  do
    docker $DOCKER_OPTS $@ `echo $IMAGE | awk '{print $3}'`
  done

}

# ついでに一括削除系(peco関係なし)
docker_container_all_clear() {
  echo "Dockerコンテナを削除中..."
  docker kill `docker ps -q`
  docker rm `docker ps -aq`
  echo "すべてのコンテナを削除しました。"
}

# エイリアスはお好みで
alias dpc='docker_peco_containers'
alias dpi='docker_peco_images'
alias dcac='docker_container_all_clear'
```

これを.bashrcなり/etc/profile.d/docker-peco.shなりに書いておいて以下のように使う。

コンテナの停止、削除

```bash
dpc kill; dpc rm
```

コンテナの起動 (例: Rails+MySQL)

```bash
ENVS="RAILS_ENV=production" PORTS="3000:80 3306:3306" VOLUMES="/data:/var/lib/mysql" dpi -d run
```

イメージの削除

```bash
dpi rmi
```

Dockerの操作がちょっとだけ捗る。
MacOS Maverickでbundle installする際にfails to build native extensionsエラーが出る？

MacOS Maverickでbundle installする際に"fails to build native extensions"エラーが出る時、以下の方法で試してください。

### command line developer toolsをインストールする
❏　まだXCodeがなかったら、Xcodeをインストール
❏　command line developer toolsを

```text:Terminal
xcode-select --install
```

のコマンドでインストールできます。
後は

```text:Terminal
sudo xcode-select -switch /Library/Developer/CommandLineTools
```

を実行してください。

###gccの調整
以下のコマンドを実行してください

```text:Terminal
sudo ln -s /usr/bin/gcc /usr/bin/gcc-4.2
```

```text:Terminal
export CC=gcc-4.2
```

（gccのバージョンは場合によって違います。それはエラーログを見たら分かります）

まだまだ情報が足りないと思いますので、後ほど追加します。
OS X + RMagickの'png.la'と'libMagickCore-6.Q16.1.dylib'がロード出来ない件について

昔インストールしたrmagickが動けなくなりました。

```
$ ruby lib/rmagick.rb 
lib/rmagick.rb:7:in `read': unable to load module `/usr/local/Cellar/imagemagick/6.8.6-3/lib/ImageMagick//modules-Q16/coders/png.la': file not found @ error/module.c/OpenModule/1277 (Magick::ImageMagickError)
	from lib/rmagick.rb:7:in `crop'
	from lib/rmagick.rb:14:in `<main>'
```

Googleしたら、これで解決したようです。

```
$ brew uninstall imagemagick
$ brew uninstall libtool
$ brew install libtool --universal
$ brew install imagemagick --build-from-source
```

が、再度プログラムを実行しようとすると、別のエラーが出ました。

```
$ ruby lib/rmagick.rb 
/Users/liubin/.rbenv/versions/2.0.0-p247/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:45:in `require': dlopen(/Users/liubin/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/rmagick-2.13.2/lib/RMagick2.bundle, 9): Library not loaded: /usr/local/lib/libMagickCore-6.Q16.1.dylib (LoadError)

```

また面倒くさそうですが、これも簡単に解決しました。

```
$ gem pristine rmagick
Restoring gems to pristine condition...
Building native extensions.  This could take a while...
Restored rmagick-2.13.2
```
ActiveRecord::Enum の注意点

背景
=====

Rails 4.1 より `ActiveRecord::Enum` が利用可能となりました。
これにより以下の様な記述が可能となります。

```
class User < ActiveRecord::Base

  enum role: [:general, :admin]

  ...
end

# role が admin なユーザを取得する
user = User.admin.first!
 
# admin かどうか
user.admin?
 
# role を確認
user.role # => "general"
 
# role を admin に変更
user.admin!
 
# role の取りうる値を確認
User.roles # => {"general"=>0, "admin"=>1}
```

これまで区分値として保持していた値が簡単に管理できるようになってハッピーです。

注意点
=====

とっても便利な Active::Enum ですがいくつか注意点があります

1. 要素を追加する場合は末尾にアペンドすること
-----

ActiveRecord::Enum により定義された値は、内部的には 0, 1, 2, 3... という数値型に変換されます。新しく要素を追加する場合には末尾にアペンドするようにしましょう。

__変更前__

`status` に 新しく `:in_review` を追加したい

```rb
class Article < ActiveRecord::Base

  # => 0-:new, 1-:approved, 2-:rejected 3-:in_review
  enum status: [:new, :approved, :rejected] 
  ...
end
```



__悪い例__

配列の途中に新しい要素を追加すると、以降のマッピングが変わってしまい、既存データとの整合性が取れなくなってしまいます。

```rb
class Article < ActiveRecord::Base

  # 既存データとの整合性が取れなくなってしまう！！
  # => 0-:new, 1-:approved, 2-:in_review, 3-:rejected 4-:in_review
  enum status: [:new, :in_review, :approved, :rejected] 
  ...
end
```

__良い例__

新しく要素を追加するときは配列の末尾にすることで、既存データとの整合性が取れます。

```rb
class Article < ActiveRecord::Base

  # => 0-:new, 1-:approved, 2-:rejected, 3-:in_review, 4-:in_review
  enum status: [:new, :approved, :rejected, :in_review] 
  ...
end
```


2. 同じ名前を同じクラス内で利用しないこと
-----

複数の enum フィールドに同じ名前を使わないようにしましょう。

```rb
class Article < ActiveRecord::Base
  enum status: [:new, :approved, :rejected] 
  enum category: [:lifehack, :biz, :animals, :new] # :new が重複！
  ...
end
```
 
3. scope で利用する場合には数値を利用すること
-----

scope 内にて検索条件として利用する場合にはシンボルではなく数値を利用しましょう。

```rb
class Article < ActiveRecord::Base
  enum status: [:new, :approved, :rejected] 

  scope :hidden, -> { where('status <> ? AND status <> ?', STATUS[:new], STATUS[:rejected]) }
end
```

(番外)ユーザ向けの入出力項目としては利用しないこと
-----

現在のところ ActiveRecord::Enum は内部処理のみで利用し、form での入力項目や画面での出力項目として利用することは意図していないようです。

参考: [Rails4 - ActiveRecord::Enum の使いドコロ - Qiita](http://qiita.com/kakipo/items/4b6d0c70ca4f41fb6090)

回避方法はいくつかありますが、頭の片隅においておくとよいかと思います。
CSSアニメーションの終了に合わせて処理を行いたい

#やりたかったこと#
画像をアニメーションで動かし、アニメーション終了後にボタンを出現させる

#最初に思いついたやり方#
jsのsetTimeoutを使ってアニメーションの終了に合わせてクラスを切り替えればいっか


```css:main.css
.anm_spin{
	-webkit-animation: spin 4s;
}
@-webkit-keyframes spin{
  0% { -webkit-transform :rotateY(0deg);opacity:0; }
  50% { -webkit-transform :rotateY(0deg);opacity:1; }
  100% { -webkit-transform :rotateY(1080deg); }
}

.hidden{
	display: none;
}
```
初期状態でボタンはdisplay:none;にしている。4秒間のアニメーションなので・・・


```JavaScript:main.js
$(function(){
	setTimeout(function(){
		$(".button").removeClass("hidden");
	},4000);
});
```
4秒後にdisplay:none;にするためのclassを削除する。

```HTML:index.html
<div>
  <div class="anm_wrap">
    <img src="img/card.png" alt="card" width="150" class="anm_spin">
  </div>
  <div class="button hidden">
    <a href="#">button</a>
  </div>
</div>
```


#問題点#
１つのアニメーションなら問題ないが、2つ以上のアニメーションを複合させたり複雑になってくると変更が手間。
スマホなどのブラウザの場合、処理速度の問題でずれてくるかもしれないという懸念。


#調べた結果#
keyframesアニメーションの開始、終了時にイベントが発行されるのでそれを使える
※webkit系のブラウザの場合です.。firefoxであれば下記のようにしてください。
webkitAnimationStart→AnimationStart
webkitAnimationEnd→AnimationEnd

```JavaScript
$(function(){
	$(".anm_spin").on('webkitAnimationStart', function(){
 		//.anm_spinのアニメーション開始時の処理
	});
	$(".anm_spin").on('webkitAnimationEnd', function(){
 		//.anm_spinのアニメーション終了時の処理
	});
});
```

今回ならこういう風に書けばいいみたい

```JavaScript:main.js
$(function(){
	$(".anm_spin").on('webkitAnimationEnd', function(){
 		$(".button").removeClass("hidden");
	});
});
```

#LINK#
同じような話で、こちらにCSSTransitionでのイベント取得について書かれていました。
CSSTransitionのイベントが終わった時に何かの処理をする
http://qiita.com/roana0229/items/b1d3ac9038ff59ce1e0f
Atomの apm star が地味に便利


Atomのパッケージ管理CLI `apm`の`star`が地味に便利なので、
簡単にまとめました。


`apm star/stars/starred/unstar`を使うと、atom.io上のスターを管理できる。
`starred`は`stars`へのエイリアスぽい。

Atom apm starの使い方
---


- Star: スターをつける `apm star <package>`

```sh
$ apm star vim-mode

⭐  Starring vim-mode ✓

```

`apm star vim-mode@0.12.0` こっちだとだめ。`Starring package failed: Not found`　になるのでバージョン指定は外す。


- Unstar: スターを外す `apm unstar <package>`

```sh
$ apm unstar vim-mode

? ⭐  Unstarring vim-mode
```

- スターしたpackage一覧 `apm stars --installed`

```sh
$ apm stars --installed
Packages starred by you (82)
├── ⭐  Lucario The best colorful flat theme ever (1586 downloads, 10 stars)
├── ⭐  Stylus Adds syntax highlighting and snippets to Stylus files in Atom. (9071 downloads, 39 stars)
├── ⭐  Sublime-Style-Column-Selection Enable Sublime style 'Column Selection'. Just hold 'alt' while you select. Also similar to Texmate's 'Multiple Carets', or BBEdit's 'Block Select' (15331 downloads, 187 stars)
├── ⭐  Zen Distraction free writing. (55419 downloads, 151 stars)
├── ⭐  angularjs An AngularJS package for Atom (23122 downloads, 114 stars)

・・・

```

- インストール済みのpackageに一括でstarをつける `apm star --installed`

```sh
$ apm star --installed

⭐  Starring Sublime-Style-Column-Selection ✓
⭐  Starring Zen ✓
⭐  Starring angularjs ✓

・・・

```


`apm stars --themes`でスターしたテーマのみの一覧。
`apm stars --json`  でスターした一覧のJSONを表示。



- 任意のユーザーのStar一覧 `apm stars --user <username>`

```sh
$ apm stars --user st44100

Packages starred by st44100 (46)
├── ⭐  Sublime-Style-Column-Selection Enable Sublime style 'Column Selection'. Just hold 'alt' while you select. Also similar to Texmate's 'Multiple Carets', or BBEdit's 'Block Select' (2850 downloads)
├── ⭐  Zen Distraction free writing. (27411 downloads)
├── ⭐  angularjs An AngularJS package for Atom

・・・

```


`apm stars`は`apm starred`でも大丈夫。


- Starしたパッケージの一括インストール `apm stars --install`

	地味にクソ便利機能。

```sh
$ apm stars --install

Installing Sublime-Style-Column-Selection to /Users/st44100/.atom/packages ✓
Installing Zen to /Users/st44100/.atom/packages ✓
Installing angularjs to /Users/st44100/.atom/packages ✓

・・・

```

atom.io上でスターしたpackageを一括でインストールできる。
この機能を使えば、複数のマシン上のAtomでPackageを同期できる。

atom.ioのStar意外に使われてないから、どんどん使っていこうよ。



[追記 7/25/2014]

~~インストール済みのパッケージを一気にStarつけるワンライナー、やっつけで作った。~~

~~```
apm list | awk 'BEGIN { users = 0 } { if (match($2, /\([1-9]+/) > 0) { next; } if (users > 0    ) { sub(/@.+$/,"",$2); print $2; } if (NF == 0) { users = 1; } }' | xargs -I {} apm star {}
```~~

[追記 3/24/2015]

`apm star --installed`があった。上のawkスクリプト必要なかった。
@sagaraya さん、ありがとうございます。
VMWareFusionでフォルダ共有ができなくなった場合の対処法


# 原因

VMWare Tools が起動していない

# 対処法

以下のコマンドで起動する

```
# service vmware-tools start 
```

## それでもダメな場合

```
# sudo /usr/bin/vmware-config-tools.pl
```

質問は全てデフォルトで。

# 参考

[VMwareToolsの動作確認・起動はどのようにすれば良いですか。 | ニフティクラウド](http://cloud.nifty.com/cs/catalog/cloud_faq/catalog_120416000931_1.htm)

[VMwareToolsのサービスが起動しない | ニフティクラウド](http://cloud.nifty.com/cs/catalog/cloud_faq/catalog_130830001417_1.htm)
PHP5.4以降をソースビルド(apache2,mysqli対応)

# はじめに
PHP5.X特に5.4以降のソースビルド方法の備忘録です。

過去に投稿した[apache2のソースビルド](http://qiita.com/Fu3nori/items/1fca9c59ebaf53ee3c2b)，[mysqlのソースビルド](http://qiita.com/Fu3nori/items/2903f768d0d179047c18)でapache2とmysqlが用意されている事を想定しております。

前者の記事では各主要パスを通す作業も記述しておりますので、PHPのパスを通したい場合はそちらも参照ください。

# PHPソースビルド	
## コード取得

**※足りないモジュールは随時yum -install**
**※wgetで取得するソースのURLは読み替える**
PHPのソース取得元は[公式サイトを参照](http://jp1.php.net/downloads.php)

`cd /usr/src
wget http://www.php.net/get/php-5.4.12.tar.gz/from/jp2.php.net/mirror
tar xvzf php-5.4.12.tar.gz
cd php-5.4.12.tar.gz
./configure --enable-mbstring --with-mysql --enable-mbregex \
	     --makewith-openssl \
	     --with-pdo-mysql \
	     --with-mysqli \
	     --with-apxs2=/usr/local/apache2/bin/apxs `
make
make install

# PHPの設定ファイルの配置・修正・追記
**ダウンロード後に解凍したパッケージ内にあるphp.iniを規定のディレクトリにコピー、修正**
**パスはダウンロードした場所で読み替える**

## php.iniの配置
`cp -p /usr/src/php-5.4.12/php.ini-production /usr/local/lib/php.ini
vi /usr/local/lib/php.ini`

## php.iniの修正箇所
 
`[PHP]
output_handler = mb_output_handler
expose_php = On
default_charset = "UTF-8"
[Date]
date.timezone = Asia/Tokyo
[mbstring]
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input = auto
mbstring.http_output = UTF-8
mbstring.encoding_translation = On
mbstring.detect_order = auto
mbstring.substitute_character = none;`

## php.iniの追記箇所

`extension=mysql.so
extension=mysqli.so
extension_dir = "/usr/local/lib/php"
[mysqli]
; Default socket name for local MySQL connects.  If empty, uses the built-in
; MySQL defaults.
; http://php.net/mysqli.default-socket
mysqli.default_socket = /tmp/mysql_master.sock
; Default host for mysql_connect() (doesn't apply in safe mode).
; http://php.net/mysqli.default-host
mysqli.default_host =127.0.0.1
; Default user for mysql_connect() (doesn't apply in safe mode).
; http://php.net/mysqli.default-user
mysqli.default_user =root`

#apacheの設定ファイルからPHPを参照

**httpd.confの位置はソースビルド時の規定パスに順ずるので適宜読み替える**
	
`vi /usr/local/apache2/conf/httpd.conf`

`[以下追記]
	<FilesMatch \.php$>
    	SetHandler application/x-httpd-php
	</FilesMatch>
	AddType application/x-httpd-php .php
	HPIniDir "/usr/local/lib"
[ここまで]`
	
`[以下修正]
	DocumentRoot "/usr/local/apache2/htdocs"
	LoadModule php5_module /usr/local/apache2/modules/libphp5.so
[ここまで]`
VC2010で発生したエラー(0xc0150002)への対応まとめ

工学ナビでの記事を元にARToolKitを導入し,VC++2010環境でARのプログラムを起動したら「アプリケーションを正しく起動できませんでした(0xc1500002)」とのエラーが発生した。

色々調べたらARToolKitで読み込んでいるDLLでこのエラー発生しているよう。
VC++2008環境に変更して起動したら動きました。
面倒だったのでvc++2008,vc++2010両方ともインストールしました。

○ vc++2010のみで環境で使用する
・使用できている環境でのパッケージ導入
Visual C++ 2005 SP1 再頒布可能パッケージ (x86)を導入
(http://www.microsoft.com/ja-jp/download/details.aspx?id=5638)
Visual C++ 2008 SP1 再頒布可能パッケージ (x86)を導入
(http://www.microsoft.com/ja-jp/download/details.aspx?id=5582)
　※基本的にはこれで大丈夫みたいです

それでも動かない人はこちらを参照してください。
熱血挑戦者のブログ
(http://blogs.yahoo.co.jp/nekketsu_abacus_man/34974852.html)







以下参考にさせていただいた他のサイト様になります。
ARToolKitを使った拡張現実プログラミング
(http://kougaku-navi.net/ARToolKit/index.html)
piyの日記
(http://d.hatena.ne.jp/piy/20081130/1228020473)
M.O.Sな日々
(http://blog.goo.ne.jp/shafact/e/eb044bee6dec1b2ebdbf90ce860ac529)
AWS CLIでRDSのスロークエリを見る


毎回マネジメントコンソールから確認するのも面倒なので、とりあえずターミナルから見れるように。

# AWS CLIのインストール
Macにコマンドラインツールが入ってなかったのでインストール。
EC2(Amazon Linux)には元々インストールされてるはず。

下記ページのやり方に従った
[Getting Set Up with the AWS Command Line Interface](http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-set-up.html)

## 環境
* Mac OSX 10.9.4


## 手順
Pythonを使うとのこと。触ったことないが、Macにプリインストールされてた

```
$ python --version
Python 2.7.5
```

pipというパッケージ管理ツール（Rubyでいうところのbundler的なやつ？）を使う。
pipはインストールされてなかったので導入、sudo付きでやらないとPermission deniedされた。

```
$ sudo easy_install pip     
```

pipが入ったら、目的のawscliを。

```
$ sudo pip install awscli 
$ aws --version
aws-cli/1.3.23 Python/2.7.5 Darwin/13.3.0
```

これで`aws`コマンドが利用可能になった。

# awsコマンドの初期設定
コマンドを実際に利用して各種サービスにアクセスするには、ちょっとだけ初期設定が必要だった。

```
$ aws configure 
```

上記コマンドを打つと、AWSアカウントに関する情報を対話的に入力していく感じになる。
アクセスキーID, シークレットアクセスキー, デフォルトのリージョン, デフォルトの出力形式を聞かれるので答えていく。出力形式はとりあえずJSONにしておいた。

入力した情報は、`~/.aws/config`に書かれている。

```~/.aws/config
[default]
output = json
region = ap-northeast-1
aws_access_key_id = <AWS_ACCESS_KEY_ID>
aws_secret_access_key = <AWS_SECRET_ACCESS_KEY>
```


# RDSのスロークエリをコマンドラインに表示してみる
[ドキュメント](http://docs.aws.amazon.com/cli/latest/reference/rds/index.html)眺めてると、RDS用のコマンドだけでもかなりある。使いこなしたらかなり便利そうではある...

## ログファイルのリストを出力
まずは`describe-db-log-files`コマンドでログファイルのリストを出力してみる。
参考: [describe-db-log-files](http://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-log-files.html)

```
$ aws rds describe-db-log-files --db-instance-identifier <DB_INSTANCE_IDENTIFIER>
```

出力は以下の様にされる。

```
{
    "DescribeDBLogFiles": [
        {
            "LastWritten": 1406166300000, 
            "LogFileName": "error/mysql-error.log", 
            "Size": 0
        }, 
        {
            "LastWritten": 1406166506000, 
            "LogFileName": "slowquery/mysql-slowquery.log", 
            "Size": 6863
        }, 
        {
            "LastWritten": 1406160020000, 
            "LogFileName": "slowquery/mysql-slowquery.log.0", 
            "Size": 2433
        },
        ...

    ]
}
```

## スロークエリログの出力

具体的なログの中身を見たいときは

```
$ aws rds download-db-log-file-portion --db-instance-identifier <DB_INSTANCE_IDENTIFIER> --log-file-name slowquery/mysql-slowquery.log
```

出力がカオス、なぜか1文字ずつ...

```
{
    "LogFileData": [
        "/", 
        "r", 
        "d", 
        "s", 
        "d", 
        "b", 
        "b", 
        "i", 
        "n", 
        "/", 
        "m", 
        "y", 
        "s", 
        "q", 
        "l", 
    [
}
```

少し調べたら、[jq](http://stedolan.github.io/jq/)を使って加工するのがよさ気だった。`jq`コマンドはhomebrewでインストール済み。

1文字ずつ出力されてるのを統合するため関数`add`、改行コードの箇所で改行させるために`--raw-output`(`-r`)オプションを付けて実行

```
$ aws rds download-db-log-file-portion --db-instance-identifier <DB_INSTANCE_IDENTIFIER> --log-file-name slowquery/mysql-slowquery.log | jq -r ".LogFileData | add"
```

だいぶ見やすくなった。以下出力の一部。

```
/rdsdbbin/mysql/bin/mysqld, うんたらかんたら
Tcp port: 3306  Unix socket: /tmp/mysql.sock
Time                 Id Command    Argument
# Time: 140724  0:25:16
# User@Host: うんたらかんたら
# Query_time: 1.451042  うんたらかんたら
SET timestamp=1406161516;
SELECT うんたらかんたら
```

これでマネジメントコンソールにわざわざ行くよりはだいぶ楽になったし、見やすい。grepなどでさらに整形して、発行されたクエリの部分だけ抜き出すこともできる。

クソクエリを消し去るために頑張ろう...
【TravisCI高速化】並列実行で実行時間を短縮する

# はじめに
* [【TravisCI高速化】bundle installを毎回走らせないようにキャッシュする](http://qiita.com/oh_rusty_nail/items/374c30ecc5aa9997d1f3)で高速化を実現した
* もっとできないかとチャレンジしたらさらに高速化できたのでご紹介

# 効果
* 並列で回す分だけ早くなる
 * 例えば、単体テスト群と受け入れテスト群を分けて並列にするなど

# やること
## 書き方
* .travis.ymlにmatrixの記述を追加するだけ
 * 公式サイトの説明は[こちら](http://docs.travis-ci.com/user/build-configuration/#The-Build-Matrix)
* .travis.ymlの例を載せます。というかこれが全てです

```:.travis.yml
...
env:
  matrix:
    - TEST_TARGET=spec
    - TEST_TARGET=cucumber
script:
  - "bundle exec rake $TEST_TARGET"
...
```

## 実行結果
* このように書くと、以下のように並列でビルドが走る
 * 以下の例だと73.1と73.2

* ![travis.png](https://qiita-image-store.s3.amazonaws.com/0/19778/829af8f3-7dcf-74b9-28c9-ff79d1c1d53c.png)
* ビルド一覧からみると2つのビルドの合計時間が書かれているが実際にかかった時間はビルド時間が長い方
* ビルド一覧に出る時間
![travis2.png](https://qiita-image-store.s3.amazonaws.com/0/19778/86633be7-c420-747d-aafe-b59ffd82c2a5.png)

# 分割したビルドでそれぞれ別の処理(before_scriptなど)をさせたい場合
* .travis.ymlに書いている処理がビルドを分割することで片方では必要だがもう一方では必要ないということもあるでしょう
* そんなときは以下のようにscriptを外に出しちゃえばいいのです
 * 後はコマンド叩く部分をmethod化するのもよし

```:.travis.yml
...
script:
  - 'ruby .travis/travis.rb'
...
```

```:.travis/travis.rb
...
commands = [
  'sudo cp -p /etc/localtime /etc/localtime.bak',
  'sudo rm /etc/localtime',
  'sudo ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime'
]
if ENV['TEST_TARGET'].include?('cucumber')
  commnads.each do |command|
    system("#{command} > /dev/null 2>&1")
  end
end
... 
```

* $TEST_TARGETがcucumberのときのみタイムゾーンを変更する例

# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Seleniumerといっていますが、Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください
virt-managerを動かすときハマった点

割りと難しい構成な気がしてきた。

![スクリーンショット 2014-07-24 12.43.22.png](https://qiita-image-store.s3.amazonaws.com/0/25728/92dc348b-ca18-e595-8907-b914c6a86183.png)


# kernelモジュール

```bash:/etc/modprobe.d/kvm-nested.conf
options kvm_intel nested=1
```

```bash:/etc/modules-load.d/virtio-net.conf
virtio-net
```


## ip_forward

```bash:設定
sysctl net.ipv4.ip_forward=1
```

```bash:/etc/sysctl.d/99-sysctl.conf
net.ipv4.ip_forward = 1
```


# パッケージ

## kvm

```bash:必須パッケージをインストール
pacman -Sy virt-manager qemu libvirt dnsmasq dmidecode ebtables
```

## vnc設定

```bash:日本語フォント
pacman -Sy xorg-mkfontscale xorg-mkfontdir ttf-sazanami
```

```bash:追加パッケージ
pacman -Sy tigervnc blackbox xorg-setxkbmap xterm
```

```bash:vncserver起動設定
mkdir /root/.vnc/
echo "setxkbmap -model jp106 -layout jp" >> /root/.vnc/xstartup
echo "blackbox &" >> /root/.vnc/xstartup
echo "virt-manager &" >> /root/.vnc/xstartup
vncserver
```

参考
* [VNC経由でKVMのkeymapがおかしなことになる件 - Hyatt-netの日記](http://d.hatena.ne.jp/Hyatt-net/20100109/1263008107)
* [2011-01-28 - うなてっくろぐ](http://d.hatena.ne.jp/unarist/20110128)

# libvirt

```diff:/etc/libvirt/qemu.conf
-#user = "root"
+user = "root"
```

```bash:各種サービス起動
systemctl start libvirtd
systemctl enable libvirtd
```

* [systemd - systemctlでvncserverを自動起動 - Qiita](http://qiita.com/tukiyo3/items/d177cd259a37003c01b9)

グラブキーはCtrl+Command


# ライトスルーとライトバック

* kvmのデフォルト: ライトスルー
* ライトスルー
  * 書き込み処理を直ちに行う。
* ライトバック
  * 体感の読み書き時間がライトスルーより早い。
  * 書き込みデータはメモリにキャッシュされる。
  * 突然の電源断に弱そう。
Eclipseのメモリを増やす

　●Eclipseのメモリ容量を増やす
　　①Eclipseのexeファイルがあるフォルダを表示
　　②Eclipse.iniがあるので開く
　　③最終行に下記を追加（メモリ量は好みで）
　　　-XX:MaxPermSize=1024M
実機デバッグ環境の構築（Android）

■ADTバンドル版AndroidSdkのインストールと設定
　下記ページを参照してください
　http://note.chiebukuro.yahoo.co.jp/detail/n134579

■DDMSの起動
　下記ページを参照してください
　http://so-zou.jp/mobile-app/tech/and.../ddms/startup/

 

■DevicesとLogCatのウィンドウを表示
　①Eclipseを起動
　②メニューバーのWindow→Show View →Devices
　③メニューバーのWindow→Show View →LogCat

■ドライバーのインストール
　実機のドライバをインストールしてください。
　メーカーや機種ごとに異なるので「機種名　ドライバ　インストール」のような形で検索してください。

　例）Nexus4なら下記ページのようにしてインストール

　http://androidlover.net/smartphone/n...r-install.html

 

■実機をPCで認識できるようにする
　機種毎に異なるかもしれないですが、基本は下記の設定です。
　①PC側でEclipseを起動
　②Devicesウィンドウを表示(PC側)
　③Android実機を起動
　④Android実機とPCをUSBケーブルで接続
　⑤Android実機にて、「設定」→「開発者向けオプション」をタップ
　⑥「USBデバッグ」の右のチェックボックスを有効にしてください。
　⑦「提供元不明のアプリ」の右のチェックボックスを有効にしてください。
　⑧PC側のDevicesウィンドウに接続した機種名が表示されます。

■ログの確認
　①PC側でEclipseを起動
　②Devicesウィンドウを表示し、Name欄の接続している端末名を選択
　③Logcatウィンドウを選択し、右上のドロップダウンリストにて「verbose」を選択
　④端末内のログが流れていくのを確認
Fetching content from an URL

Fetching content from an URL seems to be not complicated at first until I got into it. Starting with a simple function, now it turns into a big one and I still encounter errors as time goes by. Even now I could not remember why I had written some lines of code, however I am sure that I had a serious reason for each line of code in the function.

I probably will write a detail article on this to explain the evolution of the function. Stay tune!

``` rb
# encoding: utf-8

def fetch_url url, limit = 5
  return nil if limit.zero?

  uri = Addressable::URI.parse(url).normalize
  request = Net::HTTP.new uri.host
  uri.path = "/" if uri.path.blank?
  response = request.head uri.request_uri

  if response.is_a? Net::HTTPMethodNotAllowed
    Timeout::timeout(TIMEOUT) do
      response = request.get uri.request_uri 
    end
  end

  case response
  when Net::HTTPSuccess
    if ["text/html", "application/xhtml+xml"].include? response.content_type
      http = Net::HTTP.new uri.host, uri.port
      req = Net::HTTP::Get.new uri.request_uri, {"User-Agent" => "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36"}
      res = http.request req
      if res.is_a? Net::HTTPRedirection
        fetch_url res["location"], limit.pred
      else
        res.uri = uri.to_s
        res["charset"] = response.header["content-type"].rpartition("charset=").last.strip
        res
      end
    else
      nil
    end
  when Net::HTTPRedirection
    fetch_url response["location"], limit.pred
  when Net::HTTPClientError
    nil
  when Net::HTTPServerError
    nil
  end

rescue SocketError, TypeError, URI::InvalidURIError, NoMethodError,
  OpenSSL::SSL::SSLError, Timeout::Error
  nil
end

def nokogiri_doc response
  return unless response
  if response["charset"].in? ["euc-jp", "EUC-JP"]
    Nokogiri::HTML.parse response.body, nil, response["charset"]
  else
    Nokogiri::HTML.parse response.body
  end
end
```
EC2(Ubuntu)で、メモリ情報をCloudWatchで見る


CloudWatchには標準でメモリ利用率、使用量、空き容量やディスクの利用率、使用量、空き容量はモニタリングできない。
そこで、AWSで配布されているCloudWatchMonitoringScriptsをインストールして、5分おきにメモリやディスクの情報をCloudWatchにPUTして、CloudWatch上でEC2インスタンスのメモリ情報を確認できるようにする。

まずはEC2インスタンスからCloudWatchにPutMetricDataを可能にするため、IAMユーザを作成し、権限を与える。

```json:IAMユーザを作成して、CloudWatchのPutMetricData権限を与える
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt9999999999999",
      "Effect": "Allow",
      "Action": [
        "cloudwatch:PutMetricData"
      ],
      "Resource": [
        "*"
      ]
    }
  ]
}
```

次に、CloudWatchMonitoringScriptsのインストールと設定を行う。

```Bash:CloudWatchMonitoringScriptsのインストール
curl -L -O http://ec2-downloads.s3.amazonaws.com/cloudwatch-samples/CloudWatchMonitoringScripts-v1.1.0.zip
sudo apt-get install unzip libwww-perl libcrypt-ssleay-perl
unzip CloudWatchMonitoringScripts-v1.1.0.zip
cd aws-scripts-mon
cp awscreds.template awscreds.txt
chmod 600 awscreds.txt
vim awscreds.txt
```

```txt:awscreds.txt
AWSAccessKeyId=XXXX
AWSSecretKey=XXXX
```

動作確認。
オプションに--verifyをつけると、CloudWatchにデータをPUTしない。

```Bash:動作確認（CloudWatchにデータは投げない）
./mon-put-instance-data.pl --aws-credential-file=/home/ubuntu/aws-scripts-mon/awscreds.txt --mem-util --mem-used --mem-avail --verify --verbose
```

実際の設定はこんな感じ。

```Bash:実際の設定
crontab -e
```

```txt:crontab
*/5 * * * * ~/aws-scripts-mon/mon-put-instance-data.pl --aws-credential-file=/home/ubuntu/aws-scripts-mon/awscreds.txt --mem-util --mem-used --mem-avail --swap-util --swap-used --disk-path=/ --disk-space-util --disk-space-used --disk-space-avail --disk-path=/mnt --disk-space-util --disk-space-used --disk-space-avail --from-cron
```
Titanium WebViewの挙動がよくわからない件


わからないのは、`html`と`url`プロパティ、同時に指定した時にどちらが優先されるか？
ということ。


[TitaniumのWebView](http://docs.appcelerator.com/titanium/3.0/#!/api/Titanium.UI.WebView)のプロパティには、`html`というプロパティと`url`というプロパティがあります。


|プロパティ|効用|
|:-------|:---|
|`html`|HTMLソースを与えると、レンダリングして表示する|
|`url`|HTMLファイルのパスを与えると、ロードして表示する|

そして`Titanium.UI`以下のクラスは、`createHogeHoge()`というメソッドを通してインスタンス化することになっており、
その際、引数に渡したオブジェクトでインスタンスのプロパティを初期化することができるようになっています。

```javacript
var webView = Ti.UI.createWebView({
	url: "http://www.google.com"
});
```

# `html`と`url`、優先されるのはどっち？

さて、インスタンス化時に`html`と`url`を同時に指定するとどうなるのか？
以下のコードで実験。

```app.js
var webView = Ti.UI.createWebView({
    html: '<html><head><title>hoge</title></head><body>mogemoge</body></html>',
    url: "http://www.google.com"
});
```

結果
![スクリーンショット 2014-07-23 13.03.54.png](https://qiita-image-store.s3.amazonaws.com/0/41896/6279aad8-1cd7-4aff-4bc4-311522b4b543.png "スクリーンショット 2014-07-23 13.03.54.png")

`html`の方が優先されるようです。



# 両方指定した時、`url`は`setHtml()`の`baseURL`の代わりになったりするの？

[`WebView#setHtml`](http://docs.appcelerator.com/titanium/3.0/#!/api/Titanium.UI.WebView-method-setHtml)というメソッドがあります。
こいつは第二引数に`baseURL`というオプションを渡すと、相対パスの解決に使われるURLを指定できます。

```javascript
webView.setHtml(
	'<html><head><title>hoge</title></head><body><a href="/keyword/hoge">mogemoge</a></body></html>', {
    baseURL: "http://d.hatena.ne.jp/"
});
```

`html`と`url`の両方を指定した時、`url`は`baseURL`の代わりになるのでしょうか？
以下のコードで実験。

```app.js
var webView = Ti.UI.createWebView({
    html: '<html><head><title>hoge</title></head><body><a href="/keyword/hoge">mogemoge</a></body></html>',
    url: "http://d.hatena.ne.jp/"
});
```

リンクをタップした結果

```
[DEBUG] Loading: /keyword/hoge, Resource: keyword/hoge
[ERROR] Error loading /keyword/hoge
[ERROR] Error loading: file:///keyword/hoge, Error: Error Domain=NSURLErrorDomain Code=-1008 "resource unavailable" UserInfo=0xd48d940 {NSErrorFailingURLKey=file:///keyword/hoge, NSErrorFailingURLStringKey=file:///keyword/hoge, NSLocalizedDescription=resource unavailable}
```

代わりにはなりませんでした。

# 結論

- `url`より`html`の方が優先される
- `url`は`baseURL`の代わりにはならない
新人エンジニアのため開発環境構築ガイド

今年の4月からエンジニアとして、会社でお仕事を初めて早3ヶ月。
今まで学んだ開発環境構築手順書を残しておきます。

##1. [Amazon](https://www.amazon.co.jp/gp/css/homepage.html/ref=gno_yam_ya)に会社の住所を登録する
昼間はほとんど会社にいるので登録しておくと色々捗ります。

##2. [ねんどろいど](http://www.amazon.co.jp/s/ref=nb_sb_noss_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&url=search-alias%3Daps&field-keywords=%E3%81%AD%E3%82%93%E3%81%A9%E3%82%8D%E3%81%84%E3%81%A9)を選ぶ
癒やしです。疲れた時に眺めましょう。他のフィギュアでも構いません。

##3. サンダルを買う
靴をずっと履いていると蒸れてしまいます。
脱いだ時にすごい臭いになるので推奨です。
(サンダルでも蒸れて臭うのですが…)
また、その他に必要な物はAmazonでポチりましょう。

##4. 会社用[キーボード](http://www.amazon.co.jp/Kinesis-Advantage-Contoured-%E3%82%B3%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%89%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E3%82%A2%E3%83%89%E3%83%90%E3%83%B3%E3%83%86%E3%83%BC%E3%82%B8%E3%83%BB%E9%BB%92%E3%80%91-KB500USB-blk/dp/B0058R99GQ/ref=sr_1_1?ie=UTF8&qid=1406136407&sr=8-1&keywords=Kinesis)を用意する
キーボードはエンジニアの手足です。自分の使い慣れた物を使いましょう。
他人からもらったヘタったキーボードとかは窓から投げ捨てましょう。

##5. [クルーズ＆アトラス](http://www.okamura.co.jp/product/desk_table/cruise_atlas/)を手に入れる
机はともかく椅子は重要です。長い期間自分のおしりを守ってくれるので、いいものを使いましょう。

##6. [葉っぱ](http://next.rikunabi.com/tech/docs/ct_s03600.jsp?p=002270)を装備
[IKEA](http://www.ikea.com/jp/en/catalog/products/60169331/)で1000円で売ってます。

##7. [バンダイチャンネル](http://www.b-ch.com/contents/feat_monthly/)でラブライブを全話見る
今時、[ラブライブ](https://www.google.co.jp/search?q=%E5%8D%97%E3%81%93%E3%81%A8%E3%82%8A&source=lnms&tbm=isch&sa=X&ei=8PLPU6GTEIW48gXnz4D4CA&ved=0CAgQ_AUoAQ&biw=1217&bih=1263)を見ていないと先輩との会話ができませんので、しっかり予習して社会人へと備えましょう。
また、アニメを見る時間がなかなか取れなくなります。アニメもクラウド管理で通勤時間や業務時間こっそり見ましょう。


※本記事は自身の働いている就業規則に則っているとは限りません。本記事によるトラブル等は一切責任を負いかねます。
AWS CloudFrontで、セキュア配信

# 背景
* AWS summit tokyo 2014に参加した
    * http://qiita.com/alingogo/items/49fc2d93faaeab7b1403
* 「CloudFrontを利用したサイト高速化及びセキュア配信」セッション

# 目的
* cloudfrontで、ビデオ配信やライブストリーミングの時に、セキュリティーについて、まとめる

# 概要
* 「CloudFrontを利用したサイト高速化及びセキュア配信」セッションに、セキュア配信のために、以下の三つの方法がリストアップされたけど、「Signed URL」のみが詳しく説明された
    * HTTPS
    * geo restriction
    * Signed URL

* HTTPSとSigned URLは、うまく理解していないので、geo restrictionを説明する

# 内容
### cloudfrontとは
* ![how-you-configure-cf.png](https://qiita-image-store.s3.amazonaws.com/0/13451/0671f31f-298e-8eff-e5bd-6ab0db8d35fe.png)


### 地域制限で、セキュリティー向上
* 参照
    * http://aws.typepad.com/aws_japan/2013/12/geographic-restriction-with-amazon-cloudfront.html
* 解決できるケース
    * ビデオ配信の場合は、よく地域制限がある
        * 例えば、youtube上に、米国、韓国などの動画を見るときに、地域制限エラーがでることがある
    * 日本でのみ配信権を持つビデオ配信の場合、中国からアクセスできないようにするために、Amazon CloudFrontの地域制限機能を使って動画配信を許可する国のホワイトリストを作成できる

* やり方
    * Distributionを作成する（S3バケット使用）
    * 作成したDistributionをRestrictions編集して、ホワイトリスト/ブラックリストを作成してOK
        * ![jp_ok.png](https://qiita-image-store.s3.amazonaws.com/0/13451/3bd8ffe6-76b1-af2f-4a22-c29f0baf4505.png)

* テスト
    * https://s3.amazonaws.com/test_yan_5210/DCIM1294.JPG
        * USリージョン、アクセスOK
        * 写真内容について
            * 晴海トリトンより、歩いて８分ぐらい、フレンズという食事店のみそ汁で、とても美味しいよ
    * http://d2pw2chf516s96.cloudfront.net/DCIM1294.JPG
        * アクセスOK（ホワイトリストに、JPを追加）
    * http://d15kykpfvwoint.cloudfront.net/DCIM1294.JPG
        * アクセスNG（ブラックリストに、JPを追加）

### Signed URL
* 概要
    * ![PrivateContent_TwoParts.png](https://qiita-image-store.s3.amazonaws.com/0/13451/ab29576b-abca-acb4-ea3d-f3ff219b599f.png)

----
* 以下は、勉強中
    * 作成方法
    * CloudFront キーペアを作成
    * ダウンロードとストリーミング配信
複数のディレクトリにコピー、複数のディレクトリからコピー

#複数のディレクトリにコピー

findコマンドを使って、ファイルを複数のディレクトリにコピーする方法

``` bash
here
 ├ dest1/
 ├ dest2/
 ├ dest3/
 ├ dest4/
 ├ dest5/
 └ src.txt
```

このようなディレクトリ構成でsrc.txtをdist1〜5までコピーしたいときは
findでコピー先のリストを作り、-execオプションでコマンドを指定する。

``` bash
find . -name "dest*" -type d -exec cp src.txt {} \;
```

#複数のディレクトリからコピー

``` bash
here
 ├ src1/
　　 └ src1.txt
 ├ src2/
　　 └ src2.txt
 ├ src3/
　　 └ src3.txt
 ├ src4/
　　 └ src4.txt
 ├ src5/
　　 └ src5.txt
 └ dest/
```

逆のパターンも同じようにできます。

``` bash
find . -name "src*" -type f -exec cp {} dest \;
```

複数のディレクトリからコピーするときは並列処理できるxargsが使えるので、こちらの方が便利かもしれない。
移動元のパスにスペースが入っているとおかしなことになるので -print0でfindのデリミタをnull文字に置き換える。

``` bash
find . -name "src*" -type f -print0 | xargs -0 -J% cp % dest
```

#複数のディレクトリを一箇所にコピー

各コピー元ディレクトリの中に同名のファイルがあると上書きコピーされるので
ディレクトリごとコピーしたい場合はこちら。

``` bash
find . -name "src*" -type d -print0 | xargs -0 -J% cp -R % dest
```
質問です

http://www.jp.square-enix.com/info/images/image_technical_seminar2014_06/pdf/SQEX_DevCon_sugimoto.pdf
にてAndroid版はやく６００kb
ios版は3.5Mb ですがなぜios版のほうが容量が多くなったのでしょうか？
テクスチャや音声ファイルは一緒だと仮定して、プログラムがiosとandroidで違うのでしょうか？
railsでsporkを実行した時にエラーがでた

`$ bundle exec spork`
Using RSpec, Rails
Preloading Rails environment
Loading Spork.prefork block...
Warning: you should require 'minitest/autorun' instead.
Warning: or add 'gem "minitest"' before 'require "minitest/autorun"'

対処法
言われた通りに、

`require 'minitest/autorun'`

をspec/spec_helper.rbに追加

 `$ spork`
↑`$ bundle exec spork`と同じ

Using RSpec, Rails
Preloading Rails environment
Loading Spork.prefork block...
Spork is ready and listening on 8989!


warning がなくなった^^!
goでchatworkにメッセージを送信する

http://developer.chatwork.com/ja/endpoint_rooms.html#POST-rooms-room_id-messages
に書いてあるとおりの事を実行するだけです。

ヘッダーに"Content-Type", "application/x-www-form-urlencoded"
を入れないと、bodyが認識されませんでしたので注意です。


```go
package main

import (
    "bytes"
    "fmt"
    "io/ioutil"
    "net/http"
    "net/url"
)

func main() {
    apiUrl := "https://api.chatwork.com/"
    resource := "/v1/rooms/(ルーム番号)/messages"

    u, _ := url.ParseRequestURI(apiUrl)
    u.Path = resource
    urlStr := fmt.Sprintf("%v", u) 

    data := url.Values{}
    data.Set("body", "test")
    fmt.Println(data.Encode())

    client := &http.Client{}
    r, _ := http.NewRequest("POST", urlStr, bytes.NewBufferString(data.Encode()))
    r.Header.Add("X-ChatWorkToken", "APIトークン")
    r.Header.Add("Content-Type", "application/x-www-form-urlencoded")

    resp, _ := client.Do(r)

    defer resp.Body.Close()
    contents, _ := ioutil.ReadAll(resp.Body)

    fmt.Println(resp.Status)
    fmt.Printf("result: %s\n", contents)
    fmt.Println(urlStr)
}
```
tmlib.js公式エディタrunstantで知った事(その2)

# googleのショートURLサービスはOKだが

runstantのURLはbit.lyではハッシュが長いのか、「ただしいURLではない」と怒られた。

ほぼサーバ通信の無いrunstantだが、共有機能ではgoogleのショートURLサービスを使っており、こちらのサービスだとrunstantのハッシュ付きURLも問題なく扱えている。

```js
getShortURL = function(r, n) {
    return $.ajax({
        url: "https://www.googleapis.com/urlshortener/v1/url",
        type: "POST",
        contentType: "application/json; charset=utf-8",
        data: JSON.stringify({
            longUrl: r
        }),
        dataType: "json",
        success: function(r) {
            return n(r.id)
        },
        error: function(r) {
            return console.error(r)
        }
    })
};
```

## どうやらgoogleでも8k程度が限界の模様

<blockquote class="twitter-tweet" data-cards="hidden" lang="ja"><p>どうやらGoogleのurl shotenerは8192byteまでいけるらしい / “JavaScript - ログイン不要! 気軽にプログラミングを始められるWebエディタ『runstant』作りました - Qiita” <a href="http://t.co/z89OHL8P82">http://t.co/z89OHL8P82</a></p>&mdash; まさ@秋葉原 (@letsspeak) <a href="https://twitter.com/letsspeak/statuses/491992940110049280">2014, 7月 23</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

bit.lyだと「+」付けるだけで統計情報みれて便利なのだが残念。

## GoogleのショートURLサービスでも統計情報が見えた

「http://goo.gl/#analytics/」のあとにhttp://をとったURLを
付け、「/day」などを付ければOKだった。

### 例
[http://goo.gl/#analytics/goo.gl/TlEpfB/day](http://goo.gl/#analytics/goo.gl/TlEpfB/day)

# まとめ

runstant勉強になる。@phi さんのAceエディタの解説楽しみにしてます。

# 関連投稿

- [tmlib.js公式エディタrunstantで知った事(その1)](http://qiita.com/kjunichi/items/73773be3db2991fe8415)
ゲーム開発日記　~素材提供者様、制作アプリ紹介~

##ゲーム開発
かなり久しぶりの投稿になります。
ゲーム開発を諦めていたわけではなく、libGDXを使用してずっと開発を行っていたのですが、やはり一度完成まで作ってから作成したゲームを元にフレームワークの使用方法を説明、まとめていったほうが個人的にもやりやすいと思ったので、しばらく投稿をやめていました。
本格的な解説は次回にし、今回はゲームの案内と制作に使用した素材の提供サイトの紹介となります。

さて、今回作成したゲームは以下のものです。
いちおう謎解き系のアドベンチャーゲームとして作ったつもりです。
よろしければ一度遊んでみてくれると嬉しいです。
ゲーム自体は正直おもしろく出来たとは言いがたいですが、音楽、その他演出等は少しだけ頑張ってみました。

https://play.google.com/store/apps/details?id=game.edh

![スクリーンショット 2014-07-23 20.32.14.png](https://qiita-image-store.s3.amazonaws.com/0/36379/9c19ca78-d97c-fcee-afbd-5418c8aefe4c.png)

![スクリーンショット 2014-07-23 20.31.14.png](https://qiita-image-store.s3.amazonaws.com/0/36379/57649797-47a0-f8f5-1fde-70b11f6d5f5f.png)



当初は、もっと簡単なゲームを作成する予定だったのですが、完成間近であまりにもつまらないことが判明したため、１から作りなおしました。

##素材提供者様まとめ
今回のゲームで素材として使用させていただいたサイト様たち一覧です。
一部、使用サイトを保存し忘れてしまったものがあるため、記載漏れが合った場合は、判明次第随時追加していきます。

[First Seed Material(閉鎖中)](First Seed Material http://www.tekepon.net/fsm/)
　マップチップ、キャラチップ

[音楽研究所](http://www.asahi-net.or.jp/~HB9T-KTD/music/musj.html)
　「DieMoldau_Music_Box」　イベント、ステージ４BGM　

[甘茶の音楽工房](http://amachamusic.chagasi.com/)
　「赤い風船とメリーゴーランド」　イベント、ステージ４BGM
　「アントワネットの庭」　ステージ２BGM
　「日の陰り(オーケストラ版)」　ステージ３BGM
　「夕暮れのメリーゴーランド」　ステージ１BGM
　「枯葉」　イベントBGM
　「チャイコフスキー　風の旋律」　タイトル、イベントシーンBGM

[オリジナルフォント　みかちゃん](http://www001.upp.so-net.ne.jp/mikachan/)
　テキスト・フォント

[化け猫缶　素材屋](http://neko.moo.jp/BS/)
　アイテムアイコン画像

[小さい童話箱](http://inabausa.s81.xrea.com/haihu/haihu.html)
　アイテムアイコン画像

[素材のプチッチ](http://putiya.com/index.html)
　アイテムアイコン画像

[On-Jin～音人～](http://on-jin.com/)
　効果音

[SILHUIETTE DESIGN](http://kage-design.com/wp/)
　イベントキャラクター、背景

[回想領域](http://kaisou-ryouiki.sakura.ne.jp/)
　画面ノイズ素材

[Re:Vre](http://inabausa.s81.xrea.com/haihu/haihu.html)
　背景のメモ素材

[Frame Design](http://frames-design.com/)
　フレーム素材


##開発環境
Eclipse
GIMP2.8　画像加工
Cut　画像分断
Tiled　マップ作成
bmfont　ビットマップフォント作成
waveEditer　BGM編集
libGDX　フレームワーク等
Laravel HomesteadでSeque Proを使うときの設定

よく忘れるのでメモ。

![スクリーンショット 2014-07-24 0.50.10.png](https://qiita-image-store.s3.amazonaws.com/0/39382/32922a83-8521-fd9b-94bd-e66f6067258c.png)

Passwordはsecret
[R言語] 決定木を使ってビジネス目標に寄与する因子を特定する


決定木はデータマイニングの中でも何が影響してるのか一番分かりやすい分析手法だと思います。

例えばアクティブユーザとそうでないユーザがいて、それぞれがログイン後特定のアクションを取ったかとか、他のユーザとコミュニケーションを取ったかとかを要因1、要因2、...と並べてcsvにまとめて、Rによる処理をかませるだけで一番アクティブ度に寄与していた要因を特定する事が可能になります。

### 1.データを用意

例えばcsv形式で下記のようなデータを用意（data.csv）

| アクティブ | 要因1 | 要因2 | ... |
|:---:|:---:|:---:|:---:|
| YES | YES | NO  | ... |
| YES | YES | YES | ... |
| NO  | NO  | NO  | ... |
| ... | ... | ... | ... |

### 2.Rによる決定木分析

```
# ライブラリ読み込み
library(mvpart)

# csvからデータを読み込み。header=Tは列名が存在する事を指定
data <- read.csv("data.csv", header=T)

# 決定木
tree <- rpart(アクティブ~., data=data, method="class")

# データプロット
plot(tree)

# テキストプロット
text(tree)
```

これだけでツリー形式の決定木が出来ます。
ツリーの上位に来るほど要因として寄与の大きい変数です。

データ分析自体は非常にカンタンですが、要因としてどんなデータを用意するかとかは色々と試行錯誤が必要。どっちかというとその辺のセンスの方が大事な気がします。

### より深く学ぶ

この辺難しいけどざっと目を通しておくといいかも。
http://www1.doshisha.ac.jp/~mjin/R/18.html
http://www1.doshisha.ac.jp/~mjin/R/19.html
[Go言語] ファイルをコピーする方法


# はじめに

Go言語でファイルをコピーするには、いくつかの方法があります。ここでは、```io.Copy()```メソッドを使う方法を紹介します。


# 実行環境

* Go 1.3
* Mac OS X 10.9.3


# プログラムの実行方法

今回作成するプログラムの名前は、copy.go とします。第一引数に、コピー元ファイル名、第二引数に、コピー先ファイル名を指定します。

```:プログラムの実行方法
go run copy.go コピー元ファイル名 コピー先ファイル名
```


# コード

コードは以下のとおりです。```os.Open()```メソッドでコピー元ファイルを開き、```os.Create()```メソッドでコピー先ファイルを作成します（ファイルがすでに存在する場合は、そのファイルを開きます）。最後に、```io.Copy()```メソッドでファイルの中身をコピーします。

```go:copy.go
package main

import (
	"io"
	"os"
)

func main() {
	srcName := os.Args[1]
	dstName := os.Args[2]

	src, err := os.Open(srcName)
	if err != nil {
		panic(err)
	}
	defer src.Close()

	dst, err := os.Create(dstName)
	if err != nil {
		panic(err)
	}
	defer dst.Close()

	_, err = io.Copy(dst, src)
	if  err != nil {
		panic(err)
	}
}
```


# 他の方法

以下の Stackoverflow の Mostafa さんの回答では、

* 上記のコードの```io.Copy()```メソッドが行っている処理を、自分自身で実装する方法
* ```bufio```パッケージを使う方法
* ```ioutil```パッケージを使う方法

が紹介されています。

[Stackoverflow - How to read/write from/to file?](http://stackoverflow.com/questions/1821811/how-to-read-write-from-to-file)


# 参考文献

[Package io](http://golang.org/pkg/io/)

[Package os](http://golang.org/pkg/os/)
[CSS]BEMの方法論とMindBEMdingという記法

# BEMの方法論とMindBEMdingという記法

## BEMとは
Block、Element、Modifierの頭文字を取ったものであり、要素を3つのどれかに当てはめて命名していく方法。

* Block → 構成のルートとなる要素。
* Element → Blockの子要素。Blockでしか生きられない。
* Modifier → 元となるBlockまたはElementから変化した状態を表す要素。

オブジェクト指向風に言うと...
Blockは継承元のクラス、Modifierはその派生クラス、Elementはそれらのクラスに所属するメソッドもしくはプロパティである。

[参考:BEM-Methodology Definitionsの日本語訳](http://bem.info/method/definitions/)

## MindBEMdingとは
BEMをCSSのクラス名に適用するために作られた規則で、CSS界隈ではMindBEMdingがBEMと呼ばれることが多い。お約束として、Elementはアンダースコア2つ(__)、Modifierはハイフン2つ(--)で連結し、BEMの各要素を表現する。


```lang:BEM記法
block
block__element
block__element--modifier
block--modifier
block--modifier__element
```

 これをhtmlで書くと、こんな感じになる

```html:html
<div class="block">
    <div class="block__element"></div>
    <div class="block__element block__element--modifier"></div>
</div>
<div class="block block--modifier">
    <div class="block__element block--modifier__element"></div>
</div>
```

非常にキモイですね。しかし、キモイと思うのは最初だけで、使ってみると、非常に分かりやすく、良いアイデアである。
良いアイデアと言うのは、CSSの設計、その命名のときに考えるのは、それがいかに明白であるかということと、汚染されるリスクを抑えられるか、ということ。つまり、ワードを明確に区切ることで、その機能・カテゴリを区別するという点においては、別に単一記号であろうが、キャメルケース、スネークケースであろうがなんでもいいかもしれない。しかしスタイルが汚染されるリスク、という点でBEMおよびMindBEMdingは優秀である。

[参考:Summary of MindBEMding - getting your head ‘round BEM syntax](https://gist.github.com/juno/6182957)