OmniAICreator/Qiita-1.07M huggingface dataset:
chkconfig 用スクリプト（サンプル  tomcat )

メモ

### 変更点

version 1.2
1. リスタート時等10後にロックファイルを操作するようにした。

version 1.1
1. 多重起動できないようにした。
1. シャットダウンー＞シャットダウンを受け付けないようにした。

### version 1.2

```bash:サンプル-apache-tomcat
#!/bin/sh
#
# /etc/rc.d/init.d/tomcat
#
# Starts the tomcat
#
# chkconfig: 345 44 56
# description: tomcat
#
# error code
#  1 : running...

export CATALINA_HOME=/usr/local/apache-tomcat
export CATALINA_LOCK=$CATALINA_HOME/logs/tomcat.lock
export CATALINA_BIN=$CATALINA_HOME/bin

case $1 in

start)
        if [ -e $CATALINA_LOCK ];
        then
                echo "running tomcat";
                exit 1;
        fi
        $CATALINA_BIN/startup.sh && sleep 10 && touch $CATALINA_LOCK
        ;;
stop)
        if [ -e $CATALINA_LOCK ];
        then
               $CATALINA_BIN/shutdown.sh && sleep 10 && rm -f $CATALINA_LOCK
        fi
        ;;
version)
        if [ -e $CATALINA_LOCK ];
        then
               $CATALINA_BIN/version.sh
        fi
        ;;
restart)
        $0 stop
        sleep 1
        echo ---
        $0 start
        sleep 1
        echo ----
        $0 version
        ;;
*)
        echo "Usage: tomcat [start|stop|version|restart]"
        exit 9
esac
exit 0
```

### version 1.1 

```bash:サンプル-apache-tomcat
#!/bin/sh
#
# /etc/rc.d/init.d/tomcat
#
# Starts the tomcat
#
# chkconfig: 345 44 56
# description: tomcat
#
# error code
#  1 : running...

export CATALINA_HOME=/usr/local/apache-tomcat
export CATALINA_LOCK=$CATALINA_HOME/logs/tomcat.lock
export CATALINA_BIN=$CATALINA_HOME/bin

case $1 in

start)
        if [ -e $CATALINA_LOCK ];
        then
                echo "running tomcat";
                exit 1;
        fi
        $CATALINA_BIN/startup.sh && touch $CATALINA_LOCK
        ;;
stop)
        if [ -e $CATALINA_LOCK ];
        then
               $CATALINA_BIN/shutdown.sh && rm -f $CATALINA_LOCK
        fi
        ;;
version)
        if [ -e $CATALINA_LOCK ];
        then
               $CATALINA_BIN/version.sh
        fi
        ;;
restart)
        $0 stop
        sleep 1
        echo ---
        $0 start
        sleep 1
        echo ----
        $0 version
        ;;
*)
        echo "Usage: tomcat [start|stop|version|restart]"
        exit 9
esac
exit 0
```

### version 1

```bash:サンプル-apache-tomcat-old
#!/bin/sh
#
# /etc/rc.d/init.d/tomcat
#
# Starts the tomcat
#
# chkconfig: 345 44 56
# description: tomcat
#

export CATALINA_HOME=/usr/local/apache-tomcat

case $1 in

start)
        $CATALINA_HOME/bin/startup.sh
        ;;
stop)
        $CATALINA_HOME/bin/startup.sh
        ;;
version)
        $CATALINA_HOME/bin/version.sh
        ;;
restart)
        $CATALINA_HOME/bin/startup.sh
        $CATALINA_HOME/bin/startup.sh
        ;;
*)
        echo "Usage: tomcat [start|stop|version|restart]"
        exit 9
esac
exit 0

```
ZOMEKI環境を構築した仮想マシンを移設する際に設定変更をする箇所

MacやWindows上のVirtualBox内にCentOSをインストールし
ZOMEKIを構築したものを他の人に渡したり
他のマシン上で動かしたいといった場合があると思います。

そんな時に、ここの設定を変更すればOK！という箇所を書いておきます。

###環境情報
マシン：Mac OS X 10.8.4
仮想環境プラットフォーム：VirtualBox 4.2.14
ゲストOS：CentOS 6.2

###1. Apache設定ファイルの変更

``` /etc/httpd/conf/httpd.conf
# 276行目付近を移設先環境のIPまたはドメイン名に変更

 265 # ServerName gives the name and port that the server uses to identify itself.
 266 # This can often be determined automatically, but we recommend you specify
 267 # it explicitly to prevent problems during startup.
 268 #
 269 # If this is not set to valid DNS name for your host, server-generated
 270 # redirections will not work.  See also the UseCanonicalName directive.
 271 #
 272 # If your host doesn't have a registered DNS name, enter its IP address here.
 273 # You will have to access it by its address anyway, and this will make 
 274 # redirections work in a sensible way.
 275 #
 276 #ServerName www.example.com:80
 277 ServerName 192.168.1.100:80  "←　ここを移設先環境のIPまたはドメイン名に変更"
 278 
 279 #
 280 # UseCanonicalName: Determines how Apache constructs self-referencing 
 281 # URLs and the SERVER_NAME and SERVER_PORT variables.
 282 # When set "Off", Apache will use the Hostname and Port supplied
 283 # by the client.  When set "On", Apache will use the value of the
 284 # ServerName directive.
 285 #
```
```/etc/httpd/conf.d/zomeki.conf
# 15行目付近を移設先環境のIPまたはドメイン名に変更

  1 NameVirtualHost *:80
  2 
  3 <Directory /var/share/zomeki/sites>
  4     AllowOverride All
  5     RewriteEngine on
  6     PassengerEnabled on
  7     PassengerAppRoot /var/share/zomeki
  8     setenv LANG ja_JP.UTF-8
  9 </Directory>
 10 
 11 <VirtualHost *:80>
 12     AddType text/x-component .htc
 13     DocumentRoot /var/share/zomeki/sites/00/00/00/01/00000001/public
 14     Alias /_common/ "/var/share/zomeki/public/_common/"
 15     ServerName 192.168.1.100  "←　ここを移設先環境のIPまたはドメイン名に変更"
 16     Include /var/share/zomeki/config/rewrite/base.conf
 17     Include /var/share/zomeki/sites/00/00/00/01/00000001/config/rewrite.conf
 18 </VirtualHost>
 19 
 20 Include /var/share/zomeki/config/virtual-hosts/sites.conf
```

##2. ZOMEKI設定ファイルの変更

``` /var/share/zomeki/config/core.yml
# 12行目付近を移設先環境のIPまたはドメイン名に変更

  1 ---
  2 development:
  3   title: ZOMEKI
  4   uri: http://zomeki.example.com/
  5   proxy:
  6 test:
  7   title: ZOMEKI
  8   uri: http://zomeki.example.com/
  9   proxy:
 10 production:
 11   title: ZOMEKI
 12   uri: http://192.168.1.100/  "←　ここを移設先環境のIPまたはドメイン名に変更"
 13   proxy:
```

##3. ZOMEKIの設定変更
ZOMEKIについては、ブラウザから管理画面へログインし
サイトのドメイン設定の変更も行います。

3-1. ログインします。　http://192.168.1.100/_system/login
3-2. 管理画面 -> サイト -> ドメイン -> 詳細 -> 編集

サイトURLを修正して「編集する」をクリック
（文言はわかりづらいがこれが保存ボタン）

![スクリーンショット_7_19_13_11_39_AM.png](https://qiita-image-store.s3.amazonaws.com/0/5354/4b213334-f9fb-da54-c85d-a85dc8bdd99b.png)
Redmine1.4のセットアップ

```mysql:
> create database redmine;
```

```bash:
$ sudo apt-get install redmine redmine-mysql libapache2-mod-passenger
```

```apache:/etc/apache2/mods-available/passenger.conf
<IfModule mod_passenger.c>
  PassengerDefaultUser www-data  ← 追記
  PassengerRoot /usr
  PassengerRuby /usr/bin/ruby
</IfModule>
```

以下追記

```apache:/etc/apache2/sites-enabled/000-default
    <Directory /var/www/redmine>
        RailsBaseURI /redmine
        PassengerResolveSymlinksInDocumentRoot on
    </Directory>
```

```bash:
$ sudo ln -s  /usr/share/redmine/public /var/www/redmine
$ sudo /etc/init.d/apache2 restart
```

ブラウザから http://localhost/redmine でアクセスできます。
初期の管理者ID/Pass=admin/admin
Bindingで曜日を出す場合は要カルチャ指定？

DateTime をバインドして曜日を出したところ、私の環境ではカルチャの指定をしないと "Fri" みたいに英語表記になった。 
カルチャを指定すると "金" とか出る。

```html:xaml（ConverterCultureを指定）
<TextBlock Text="{Binding LastUpdateTime, StringFormat='yyyy年MM月dd日（ddd）', ConverterCulture=ja-JP}" />
```

または xaml ヘッダに以下

```html:xaml（xml:langを指定）
<navigation:Page ... xml:lang="ja-JP" />
```

後者の方が楽かな。
phpでscssを使う

phpでscssを使いたくなった。

１)scssからcssに変換(scssphp)
2)scssを作成、更新したらcssファイルを自動生成(fsniper,bash)

##1) scssからcssに変換
#scssphp
http://leafo.net/scssphp/docs/

```
wget http://leafo.net/scssphp/src/scssphp-0.0.7.tar.gz
tar -zxvmf scssphp-0.0.7.tar.gz
```

scssからcssに変換

```scss:a.scss
#main p {
  color: #00ff00;
  width: 97%;

  .redbox {
    background-color: #ff0000;
    color: #000000;
  }
}
```

```
$scssphp/pscss < a.sccs > a.css
```

```css:a.css
#main p {
  color: #0f0;
  width: 97%; }
  #main p .redbox {
    background-color: #f00;
    color: #000; }
```

scssからcssへ変換成功

##2) scssを作成、更新したらcssファイルを作成
#fsniper

fsniperは、新規または変更されたファイル用のディレクトリを指定された一連のモニタツールです。次に、[ファイルの種類または名前に基づいて、そのファイル上で実行するスクリプトを呼び出します。ディレクトリinotifyを使用して、変更を簡単に継続的にポーリングそれらの代わりに監視されます。一般的な使用のWebブラウザからのすべてのものを1つのダウンロードディレクトリを作成し、準決勝を持つインテリジェントスクリプトをどのよう、これらのファイルとは何の図が含まれます。スクリプトに自分自身を記述します。

>http://sourceforge.jp/projects/freshmeat_fsniper/
[fsniper インストール(自分で書きました)](http://qiita.com/MasatoYoshioka@github/items/8d8474b04e97a4386d03)

```config:~/.config/fsniper/config
watch {
    /home/stylesheets {
        # matches all file with .pdf extension in /var/www/upload directory.
        *.scss {
            handler = /home/sh/mvscss.sh %F
        }
    }
}
```

mvscss.shを作成

```bash:mvscss.sh
#!/bin/bash

HOME="${HOME}"
CSSDIR='css'
STYLESHEETDIR='stylesheets'
PSCSS="${HOME}/scssphp/pscss"
OWNER=owner

if [ $# -ne 1 ];then
    echo "usage  mvsccs.sh scssfile"
    exit
fi
FILE=$1
if [ ! -f ${HOME}${STYLESHEETDIR}/${FILE} ];then
    echo "file not found"
    exit
fi
#SCSSファイル名からCSSファイル名を作成
FILENAME=`echo ${FILE} | sed 's/\(.*\)\.scss$/\1.css/g' `
#SCSSからCSSへ変更
${PSCSS} < ${HOME}${STYLESHEETDIR}/${FILE} >${HOME}${CSSDIR}/${FILENAME}

#ファイル所有権の変更
chown ${OWNER}:${OWNER} ${HOME}${CSSDIR}/${FILENAME}
```

######fsniperを再起動
```

#service fsniper restart
```

######確認
ログを確認

```
tail -f ~/.config/fsniper/log
```
テストファイルを作成

```
$cd stylesheets
$vi a.scss
#main p {
  color: #00ff00;
  width: 97%;

  .redbox {
    background-color: #ff0000;
    color: #000000;
  }
}
```

ログを見ると↓が出る

```
YYYY-MM-DD HH:MM:SS Executing: /home/mvscss.sh a.scss
```

作成されたa.cssを確認

```
$cd css
$vi a.css
#main p {
  color: #0f0;
  width: 97%; }
  #main p .redbox {
    background-color: #f00;
    color: #000; }
```

成功
動的なメソッドの呼び出し

呼び出すメソッドが動的に変わる場合のメソッドの呼び出し方法のメモ。

**制御構造で分ける場合**

```rb:call_method_case.rb
def get_id
  return 256
end

def get_name
  return 'エナジー炭酸 がぶ飲み POWER SQUASH' # いまハマってる
end

# nameが欲しい
data_type = :name

# caseで処理を分ける
case data_type
when :id then p get_id
when :name then p get_name
```


**メタプログラミングの場合**

```rb:call_method_meta.rb
def get_id
  return 64
end

def get_name
  return 'A&W ROOT BEER' # ホントはこっちのほうが好き
end

# nameが欲しい
data_type = 'name'
#sendでメソッドを呼び出す
p send("get_#{data_type}")
```
プロセスをちゃんと見たい, ps aux の表示内容

```
$ ps aux | less
```
↓↓↓↓

```
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
hoge         1  0.0  0.1  19228  1372 ?        Ss   Apr26   0:01 /sbin/init
hoge         2  0.0  0.0      0     0 ?        S    Apr26   0:00 [nemu]
hoge         3  0.0  0.0      0     0 ?        S    Apr26   0:20 [fuga/0]
hoge         4  0.0  0.0      0     0 ?        S    Apr26   0:18 [aki0]
hoge         5  0.0  0.0      0     0 ?        S    Apr26   0:00 [mumu/0]
```
+ USER: 
    User who owns the process
+ PID: Process ID
+ %CPU: CPU occupancy ratio
+ %MEM: Real memory occupancy ratio
+ VSZ: Virtual memory size of the process including one which it doesn't use
+ RSS: Resident set size: Physical memory size which the process use 
+ TTY: Terminal name
(Directly connected console terminal: tty1,tty2….., terminal connected by ssh: pts/0, ;ts/1…)
+ STAT: Status
(R: Running, S:sleeping, D: waiting for input and output of disk, Z: zombie)
+ COMMAND: command which activates the process
git-svnでrebaseした際にエラーになった際の対処法


ある日git-svnでrebaseしたところ、以下のようなエラーが発生しました。

> Could not unmemoize function `lookup_svn_merge', because it was not memoized to

ググってみると`git-svn`のバグの様です。
解決方法は…と思って探していると、GoogleGroupで[git-svn bug: Could not unmemoize function `lookup_svn_merge' ...](https://groups.google.com/d/msg/git-version-control/KWD-LUyMYbA/　TJIbf4c1on8J)という投稿を発見しました。　

### 解決方法

> Clearing <repo>/.git/svn/.caches resolved this for me,

と言及されているので、それに従って`.git/svn/.caches`を削除して、再度rebaseしたところうまく行きました。

以上です。
「CSS3でセレクトボックスをカスタマイズ」のスマホのバグ（？）を直す

[to-Rさんの記事](http://blog.webcreativepark.net/2012/02/17-083252.html)を試してみたのですが、Xperia arc SO-01C（Android 2.3）とiOS4で動かなかった・・・

##Xperia arc SO-01C（Android 2.3）でSelectが押せない対処法
selectにz-indexが指定してあると押せないみたいです。

```css:
div {
	〜中略〜
	z-index: -1; //追加
}

select {
	position: absolute;
	zoom: 1.1;
	/*z-index: 2; はずす*/
	opacity: 0;
}
```

##iOS4でjQueryのchangeが動かない対処法
.change()じゃ動かないようなので、bindに変更しました。

```js:
$("select").change(function(){
	〜中略〜
}).trigger("change");
↓
$("select").bind('change',function () {
	〜中略〜
}).trigger("change");
```
pythonでフォルダ内のファイル名をrenameして整理したメモ


本当はワンライナーで書いてみたかったが出来なかった。
macのrenameはLinuxのとかは挙動が違うようで良く分からなかった。

今回の想定とした例文はスク水画像フォルダ内のjpg画像だけをrenameを。

```python:rename.py
#!/usr/bin/env python
# coding: UTF-8
import sys
import os
import re
a = 1
#指定する画像フォルダ
files = os.listdir('/Users/hage/Pictures/sukumizu/')
for file in files:
    jpg = re.compile("jpg")
    if jpg.search(file):
        os.rename(file, "image%06d.jpg" %(a))
        a+=1
    else:
        pass
```

今回は大雑把にjpg画像だけをターゲットにした書き方です。searchをsukimaとかにして。

もし、この上記コードご使用される際は一応動作確認してからお願いします。
確認されたかどうかに関わらず画像が消えてしまったなどの現象に責任を負いません。

おそらくテストする場合はこんな感じで
```touch vip.jpg sukima.jpg futaba.jpg ookami.jpg```
適当に画像のない使い捨てフォルダ内にダミー用ファイルを用意されて挙動をご確認下さいませ。


###SCPで画像転送
python内でscpコマンドから画像転送

```python:o.py
#!/usr/bin/env python
# coding: utf-8

import os,sys,re,shutil,pexpect,datetime

s = '転送先サーバ'
u = 'ログインユーザー名'
d = '保存先ディレクトリ'
r = '転送先のhttpから始まる画像保存場所'
#基本的にSSをその場で上げることが目的なのでウチではDesktopがそうです。
p = '転送元の画像保存場所'
t = datetime.datetime.now()
#SSがScrから始まる名前なので
i = re.compile("^Scr")

#タイムスタンプを付与する準備
stamp = "{0:02d}".format(t.month) + "{0:02d}".format(t.day) + \
        "{0:02d}".format(t.hour) + "{0:02d}".format(t.minute)
#print stamp
files = os.listdir('/画像のあるディレクトリ/')
for file in files:
    if i.search(file):
        obj = file
obj = p+obj

shutil.copyfile(obj, '%simg%s.png' % (p,stamp))
scp=pexpect.spawn('scp -p %simg%s.png %s@%s:%s' %(p,stamp, u,s, d))
scp.interact()
#画像保存先を出力
print r + 'img%s.png' % stamp
```

足りないものはpipやeasy-installで。
なるべくSS上げる時は分散させずに一箇所に(なるべくは自分の管理の及ぶ場所に)あげようとしたのがアレです。

SNSとかで炎上した時にあちこちに画像を上げていると何かと不便ですからね！！！
Rails3.2でフォロー機能（party_boy）

フォロー機能を実装してみたのでメモ。
自分で作ろうとも思ったけど「party_boy」というライブラリが良さげだったのでそれを利用してみた。

##Gemfile
```ruby:Gemfile
gem 'party_boy'
```

```
bundle install。
rails g party_boy
```

この時マイグレーションファイルが作成されるので、rake db:migrate したらエラーがでてほげぇ。
どうやら作成されたマイグレーションファイルのclass名が間違っているらしく、手動で修正しなきゃだめらしい。

```ruby:db/migrate/xxxxxxxxxxxxxx_create_relationship.rb
# class名を "CreateRelationship" に変更
class CreateRelationship < ActiveRecord::Migration
```
マイグレーションして、これで導入は完了。

##Model
```ruby:app/models/user.rb
# 追記
acts_as_followable
```

```ruby:app/models/relationship.rb
# 追記
attr_accessible :requestor, :requestee, :restricted

# バリデーションを追記
validate do
  if requestor.id == requestee.id
    return errors.add(:requestor)
  end
end
```

requestor がフォローする人で、requestee がフォローされる人。
これらのidが一緒だった場合はエラーを返すようにする。これもライブラリ側でやってくれればいいのになーと。attr_accessible も忘れずに。

##Controller
```ruby:app/controllers/users_controller.rb
# フォローしているユーザーを取得
@friendship[:follow] = @user.following
# フォローされているユーザーを取得
@friendship[:follower] = @user.followers
# フォローしているか調べる
@user_a.following?(@user_b)
# フォローされているか調べる
@user_b.followed_by?(@user_a)
```
これでフォロー/フォロワーを取得

```ruby:app/controllers/users_controller.rb
def action_follow
  # ログインチェック
  raise unless current_user

  @user = User.find(params[:requestee_id])

  # 既にフォローしているかチェック
  if current_user.following?(@user)
    render friend_unfollow(@user)
  else
    render friend_follow(@user)
  end

  rescue
  render :json => {:result => "error" }, :status => 400
end

def friend_follow(user)
  current_user.follow(user)
  return  { :json => { :type => "add", :result => "success" } }
  rescue
  return  { :json => { :type => "add", :result => "error" } }
end

def friend_unfollow(user)
  current_user.unfollow(user)
  return  { :json => { :type => "remove", :result => "success" } }
  rescue
  return  { :json => { :type => "remove", :result => "error" } }
end
```
フォロー/アンフォローの動作。
前回のスター追加と同じで、1URLで実装したかったので、コントローラ内での分岐にしてみた。

あとはJSをうんぬんかんぬんすれば、twitterlikeなフォローボタンの出来上がりです。

下記を参考にしました。
[mnelson/party_boy - GitHub](https://github.com/mnelson/party_boy)
[http://web.sfc.keio.ac.jp/~t11240rk/blog/?p=164](http://web.sfc.keio.ac.jp/~t11240rk/blog/?p=164)

↓ブログに書いたものの転載です。
[Rails3.2でフォロー機能（party_boy） - rokuro Fire](http://www.rokurofire.info/2013/07/19/rails_follow/)
privateメソッドとfinal

久々に嵌ったのでメモ。
まず以下の例を見ていただきたい。

```php:privateメソッドをオーバーライドしようとするとどうなるか？
<?php
class A {
    private function echoClass() {
        echo 'A', PHP_EOL;
    }

    public function p() {
        $this->echoClass();
    }
}

class B extends A {
    private function echoClass() {
        echo 'B', PHP_EOL;
    }
}

$a = new A;
$a->p();
$b = new B;
$b->p();
```

まず、このコードはエラーを吐かず、実行できてしまう。そして __A__ が２回出力される。
クラスBにてechoClassメソッドをオーバーライドしたように見えるけれど、実際はクラスBでの記述は破棄されているように見える。

では次のようにp()をオーバーライドするとどうなるだろうか。

```php:privateメソッドのオーバーライド？その２
<?php
class A {
    private function echoClass() {
        echo 'A', PHP_EOL;
    }

    public function p() {
        $this->echoClass();
    }
}

class B extends A {
    private function echoClass() {
        echo 'B', PHP_EOL;
    }

    public function p() {
        $this->echoClass();
    }
}

$a = new A;
$a->p();
$b = new B;
$b->p();
```

こちらも実行できる。そして出力結果は __A__ → __B__ となる！

privateメソッドは他のクラスからアクセスできない。アクセスできないというか、見えない。つまり、親クラスと子クラスで、まったく別のメソッドを偶然同じ名前で定義した状態であり、これはオーバーライドではない。

ちなみにJavaもこれと同じように動くらしい。

この挙動のおかげで、privateメソッド名に何が消費されているか気にせず、メソッドを定義することができるとも言える。

ただ、protectedと挙動が違うので分かりにくいようにも思う。
もしこの挙動が嫌なのであれば、明示的にfinalを付けると同名のメソッド定義を拒否することができる。

```php:これはコンパイル時にエラーが発生する
<?php
class A {
    final private function echoClass() {
        echo 'A', PHP_EOL;
    }
}

class B {
    private function echoClass() {
        echo 'B', PHP_EOL;
    }
}
```

コンパイル時のエラー、つまりインタプリタがスクリプトファイルを読み込んだ時点でエラーを発生させるため、すぐに気づくことができるだろう。

#### 追伸
どうでもいいけどechoClass()なんて定義しなくてもget_class($this)や$this::class (こちらはPHP5.5以降)でクラス名取れます
プリペアドステートメント(セキュリティ対策)

セキュリティ対策で用いる場合、例えば
pg_prepare($dbconnect,'stringname','select * from $1');

とし、後に$1にパラメータを渡せば、
$1の箇所にサブクエリを入力したとしても、
パラメータは
"DELETE FROM *~"
のように、必ずダブルコーテーション(もしくはシングル？)で囲まれるので、
SQLインジェクションを防ぐことができる。


・・・間違っていたらご指摘いただければ幸いです(ヽ'ω`)
文字参照

直接記述できない文字を表記する際に用いられる。
HTMLにおいては、表記方法により、数値文字参照と文字実体参照の2つが存在する。
また、HTMLにおける「文字実体参照」は、XMLでは実体参照と呼ぶ。

実体参照(5種類しか存在しない)

| 表示 | 表記 |
|:-------|:-------|
| &lt;   | &amp;lt;　　 |　
| &gt;   | &amp;gt;　 |　　
| &amp;  | &amp;amp; |
| &quot; | &amp;quot; |
| &apos; | &amp;apos; |
Vagrant のバージョンが1.0.7 だとたいていの http://www.vagrantbox.es/ の Box は入らない

利用しているのは OS X 1.0.8.4 です．

RubyGems を用いて Vagrant を入れても，この記事を書いている時点での最新のバージョンは 1.0.7 です．

Vagrant の公式にある Box なら大丈夫なようですが， http://www.vagrantbox.es/ にある Box は，おおむねダウンロードした後の untar が失敗します．

はまって悶々としてしまったので，メモ書き．
fluentdでレコードにちょっとした処理をしてフィールドを追加する汎用的プラグインの比較

先日つくったfluentdによる簡易ブックマーク結構使ってるんですが、今後細かい分析をしていきたいと考えた時、ドメイン別のブックマークの傾向とか見れるといいなと思いつきました。

```js:
{"tag":["tech","ruby"],"title":"hatena-bookmark | RubyGems.org | your community gem host","url":"https://rubygems.org/gems/hatena-bookmark"}
```

というjsonが来た時に、URLからドメイン名を抽出して

```js:
{"tag":["tech","ruby"],"title":"hatena-bookmark | RubyGems.org | your community gem host","url":"https://rubygems.org/gems/hatena-bookmark", "domain":"rubygems.org"}
```

というように加工してmongodbに保存したい。

ブックマークレットでjson組み立てる段階でdomain埋め込んでもいいんだけど、タグごとに大量にコピペしてふやしたのであれはもう弄りたくない…
というわけで、fluentd側でrubyの正規表現とかやってちょちょいとフィールド追加するプラグインどうせあるんでしょ？
と思って探したらプラグインたくさんありすぎて見つからないわ、それぞれ微妙に望む動きが実現できそうでできないわで結構困ったのでメモっておきます。。

探した場所はココとgoogleです。
http://fluentd.org/plugin/

## fluent-plugin-map
```apache:
<match bkmk.kogaidan.**>
  type map
  tag "mapped."+tag
  time time
  record {"domain"=>record["url"].scan(/^https?:\/\/(.*?)\//).first.first, "url"=>record["url"], "title"=>record["title"], "tag"=>record["tag"]}
</match>
```

最初に試してみたのはfluent-plugin-map。
https://github.com/tomity/fluent-plugin-map

このプラグインではrecordは加工してemitするハッシュそのものを表しています。
元のJSONにフィールドを追加したい場合、変更の不要なフィールドまで明示的に書くのでちょっとめんどいです。

また、fluentdの設定ファイルは好き勝手改行できるものではないので、横に長くなってしまいます。
本来は任意のフィールドだけ抜きだしてちょっと加工してemitするためのプラグインのようです。

元のtagを含めて拡張してemitできるのは良いかも。

追記：
recordがemitするハッシュそのものを表すなら、

```
record record["domain"]=record["url"].scan(/^https?:\/\/(.*?)\//).first.first;record
```

ってやったらできるかもしれないけどどうだろう

## fluent-plugin-record-reformer

```apache:
<match bkmk.kogaidan.**>
  type record_reformer
  output_tag reformed.bkmk
  domain ${url.scan(/^https?:\/\/(.*?)\//).first.first}
</match>
```

つぎにリストを眺めてたら見つけたのがfluent-plugin-record-reformer。
https://github.com/sonots/fluent-plugin-record-reformer

このプラグインでは明示的に指定されたフィールドにだけ処理が行われて、それ以外はなにも触らずにスルーしてemitしてくれます。ハイ、これがまさに探していたものでした。

${}の中では元のレコードに含まれるキーを変数として使えます。

ただしoutput_tagは書かれている文字列をそのまま使っているようで、元のタグの構造がなくなってしまうという問題があります。
これもfluent-plugin-forestなどを組み合わせれば解決できるかもしれませんが。


## できそうで試したらできなかったプラグイン

先の二つを見つける前に試行錯誤しててぜんぜん思うようにいかなかったのが以下のふたつでした。

### fluent-plugin-rewrite

これはレコードの情報をタグに含めて再emitする、レコードのフィールドを書き換えて再emitする、の二つはできますが既存のレコードの情報を使いつつ新たなフィールドを加える、という処理はできないものでした。

### fluent-plugin-rewrite-tag-filter

こちらもタグの書き換えが主のプラグインです。
MAMPでのLaravel4 インストールで詰まったので備忘録にメモ

Laravelをインストールしたろっ！！と意気込んで、出鼻くじかれた。。。
laravel/public/にアクセスしても500エラー。。
ググるとどうやらcomposerってのが要るらしい。
さっそくターミナル起動。コマンド　ッターン！！
エラー。
php.iniがないと怒られる。

以下のようにしてみた。
/Application/MAMP/conf/php5.4.3/php.iniを/private/etc/にコピー
/private/etc/php.iniの最終行に「detect_unicode = off」追記。
 curl -sS https://getcomposer.org/installer | php実行。

いけたっぽい。

php composer.phar install実行。

localhostでpublic/にアクセス。
できたー。

やっとスタート地点に立てた。
実機転送した際に、Could not launch “App Name”と言われた時の対処法


Buildは成功するのに、こんなメッセージがでてきました。

```
No such file or directory (/Users/tetsuya/Library/Developer/Xcode/DerivedData/projname-cgwzjihzvixdgfgwngbetlunnacb/Build/Products/Debug-iphoneos/App Name.app/App Name)
```

##対処法
### 1. iOS Deployment Targetと実機のバージョンがあっているか確認する
まず、そもそもターゲットバージョンがあっているかの確認をしましょう。方法としては、
XCode : TARGETS > Build Settings > Deplayment > iOS Deployment Target
iPhone: 設定 > 一般 > 情報 > バージョン
で確認できます。

Storyboardはバージョン4.xの端末では利用できないので、Interface Builderを利用しましょう。

ARCは、利用できるようですが少し扱いが5.xと違うようなので注意しましょう。

### 2. 下記の手順を試してみる
よくいろんなブログで紹介されている手法です。上記を確認しても問題がなさそうなら試してみます。

1. Dockコネクタ/Lightningケーブルを端末から抜く
1. アプリを端末から削除 
1. メニューから[Window]->[Organizer] を開く
1. "Projects"タブから任意のDerived data フォルダを"Delete..."ボタンで削除する
1. Xcodeを再起動し、端末を接続し、プロジェクトをRunする

### 3. 再起動
困ったときの再起動です。Mac、端末ともに再起動してみます。

参照: [dhilipsiva: Xcode - Could not launch app - No such file or directory Error.](http://dhilipsiva.blogspot.jp/2012/07/xcode-could-not-launch-app-no-such-file.html)

補足1. 2-4でDerived data フォルダを開くときは、Finder内で`⌘ + Shift + G`を押下することで、フォルダに移動ダイアログが表示される
補足2. 2-4で削除するDerived data `projname-cgwzjihzvixdgfgwngbetlunnacb`は、エラーメッセージに表示される "/Users/tetsuya/Library/Developer/Xcode/DerivedData/`projname-cgwzjihzvixdgfgwngbetlunnacb`"にあわせる
Async callback test with vows

Vowsと使って非同期コールバックテストを行った際に少しハマった。

自分で書いたプログラムはこんな感じ。

```js:
function myFunction(params, callback) {
    var someData;
    // いろいろ実行
    // 最後にsomeDataを渡す
    callback(someData);
}
```

これをvowsでテストするためこんな感じでテストコードも書いた。

```js:
var vows = require('vows');
var assert = require('assert');

vows.describe("Some Test").addBatch({
    'My program test' : {
        topic : function(){
            var params = 'hogehoge';
            myFunction(params, this.callback);
       },
       'My function test' : function(data){
         assert.isObject(data);
       }
    }
}).export(module);
```

だがなぜが`An unexpected error was caught`というエラーが消えない。

調べてみるとこんなことが書いてあった。
https://github.com/cloudhead/vows/issues/187
どうやらvowsはコールバックの第一引数をエラーオブジェクトだと判定するらしく、これがnullでないと勝手にエラーにしてしまうらしい。というわけでコールバック処理の際にはきちんとエラー処理を挟んでエラーオブジェクトを入れてあげましょうというお話。
Vagrantで立ち上げたサーバにknife soloでChef Solo環境作成まで


### knife-soloのインストール

まずは、RubyGemsでインストール開始

```
$ gem install knife-solo
　〜　中略　〜
Successfully installed knife-solo-0.2.0
```

0.2.0がインストールされたが、お目当ては0.3.0なので、やり直し
さきほどインストールした0.2.0はアンインストールしておく

```
$ gem uninstall knife-solo
```

--preオプションをつけて、再度インストール

```
$ gem install knife-solo --pre
　〜　中略　〜
Successfully installed knife-solo-0.3.0.pre5
```
今度は成功した

###Vagrantで立ち上げたサーバに　knife soloでChefをインストール

まずはVagrantでサーバを立ち上げておく
ここでは、Ubuntuを立ち上げておく

```
$ vagrant up
```
立ち上がったら、早速インストール開始
インストール先はホスト名を指定する
ここでは「precise」とした

```
$ knife solo prepare precise
Bootstrapping Chef...
--2013-07-18 13:08:57--  https://www.opscode.com/chef/install.sh
Resolving www.opscode.com (www.opscode.com)... 184.106.28.83
Connecting to www.opscode.com (www.opscode.com)|184.106.28.83|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 6510 (6.4K) [application/x-sh]
Saving to: `install.sh'

100%[======================================>] 6,510       --.-K/s   in 0s

2013-07-18 13:08:58 (25.7 MB/s) - `install.sh' saved [6510/6510]

Downloading Chef 11.4.4 for ubuntu...
Installing Chef 11.4.4
Selecting previously unselected package chef.
(Reading database ... 42373 files and directories currently installed.)
Unpacking chef (from .../chef_11.4.4_amd64.deb) ...
Setting up chef (11.4.4-2.ubuntu.11.04) ...
Thank you for installing Chef!
Generating node config 'nodes/precise.json'...
```

うまくできたので、knife soloでChefリポジトリを作成しておく

```
$ knife solo init chef-repo
Creating kitchen...
Creating knife.rb in kitchen...
Creating cupboards...
Setting up Librarian...
```
遅延と無限リスト(ruby2.0)

`lazy` がない場合、無限リストを素朴に使おうとすると死んでしまう場合が多い。

```ruby
a=(1..5).cycle
b=%w( foo bar baz hoge ).cycle
z = a.zip(b) # ここで死亡
# ここから先は unreachable.
z11 = z.take(11)
p z11.map{ |i| i.join }.to_a.join(",")
```

上の例の場合、 `zip` が無限に長いリストをメモリ上に作成しようとして死ぬんだと思う。

`lazy` をつけると、生還する。

```ruby
a=(1..5).cycle.lazy # ここで lazy
b=%w( foo bar baz hoge ).cycle
z = a.zip(b) # 生還！
z11 = z.take(11)
p z11.map{ |i| i.join }.to_a.join(",")
#=> "1foo,2bar,3baz,4hoge,5foo,1bar,2baz,3hoge,4foo,5bar,1baz"
```
`to_a` で lazy な世界から普通の世界に帰ってくる。
※ `force` でもいい。
帰ってくる前に `take(11)` で個数が確定しているので、`zip` が無限に長いリストを作らずに済む。

ということなんだと思う。
tinyissueの効果的な使い方


自分はGithubなどに挙げられない個人的な、あるいは受託開発のリポジトリでのissue管理には **tinyissue** を使用しています。

## tinyissueとは

> tinyissue
> http://tinyissue.com

![preview](http://tinyissue.com/assets/images/giant-preview.png)

オープンソースの **issue管理** アプリケーション。
インストール等詳細はWebサイトのドキュメントを見て下さい

## tinyissueの良いところ

+ オープンソースだから **誰でも使える**
+ 見やすい( **かっこいい** )デザイン
+ 分かりやすくて **シンプルな操作性**
+ issue管理に絞ってあるので **TODOリストとして使用することも可能**
+ issueに **コメント** がつけられる
+ **管理者の他にも** ユーザーを追加することが可能で、 **マネージャー、デベロッパー、ユーザーの３種類にカテゴライズできる**
+ ユーザーが追加できるので、 **「どのissueにどのユーザーを割り当てるか」が決められる**

## tinyissueの悪いところ

+ issueの番号が以下の画像のように **全プロジェクト通しで発行される** (つまりあるプロジェクトの最初のissueであっても **その前にプロジェクトがあればissue番号は1にはならない** )←最悪

![tinyissue demerit1](http://f.cl.ly/items/3S2S3c3R2v462I1n0D2X/スクリーンショット_13_07_18_21_38.png "サンプル")

+ Githubのように **issueのカテゴライズができない** (ユーザーのカテゴライズはできる癖になぜissueのカテゴライズはできないのか)
+ ダッシュボード画面で新しいissueほど下に配置される(つまりプロジェクトが追加された順番に配置される)

## 以上の点を踏まえて、tinyissueをどのように効果的に使うか

### ポイント1 : issue番号は自分で発行する

`tinyissueの悪いところ` で書いたが、tinyissueは **issue番号が全プロジェクト通しで発行される。**
よってひとつひとつのissueに自分でissue番号を発行する。

![tinyissue demerit1](http://f.cl.ly/items/3S2S3c3R2v462I1n0D2X/スクリーンショット_13_07_18_21_38.png)

この画像でわかるように、自分でissue番号を発行している。

### ポイント2 : issueをfixしたらgitでタグを打つ

これはtinyissueの問題ではないが、tinyissueに登録したissueをfixしたら、 **fixしたコミットにタグを打つ。**

```
$ git tag -m "Fixしたコミットのメッセージ" "fixed_#1"
```

タグを打つときは、タグのメッセージに必ず **Fixしたcommitのコミットメッセージを書き** タグ名を **fixed_#1** のように **fixしたissueの番号をつける**
このようにタグを打っておけば、他のタグと区別がつくので便利。

### ポイント3 : fixしたissueのコメントにコミットのハッシュ値を書く

issueをfixしたら、そのissueをcloseする前に、issueのコメント欄に **Fixed : [コミットのハッシュ値]** と書いておく。

![point3](http://cl.ly/image/0d0x1l1Z0v3T/スクリーンショット_13_07_18_21_54-2.png)

こうすることでtinyissue側からコミットを認知できる。
(gitにタグ打ってるんだからこんなの必要ないんじゃ…という意見もアリだと思うので各自調整してね。)

### 統括

tinyissueの効果的な使い方を書いてきましたが、魅力的なものはありましたかね？
結局ポイントを３つ分しかなかったし、効果的とはいえないじゃないか…と思い始めていますが気にしない。
tinyissueはPHPとperlでできているようなので(Githubによると)、コードを理解できる人は悪いところを直してプルリク送った方がいいと思います。
imobiledevice on Mac OS X

http://www.libimobiledevice.org

これのこと。Cocoaのプライベートフレームワーク相当のことがいろいろできる。

http://theiphonewiki.com/wiki/MobileDevice_Library

#  Cython

Pythonバインディング不要ならやらなくてよし

    pip install cython

    cython -h
        Cython (http://cython.org) is a compiler for code written in the
        Cython language.  Cython is based on Pyrex by Greg Ewing.

    brew install libplist  --with-python


Cythonとlibplistのバイディングが認識されればデフォルトで--with-pythonでlibimobiledeviceがインストールされる


#  libimobiledevice

    git clone http://git.sukimashita.com/libimobiledevice.git

    brew install usbmuxd libxml2 libplist

    PKG_CONFIG_PATH=/usr/local/Library/ENV/pkgconfig/10.8 ./configure --prefix=~/opt/libimobiledevice

PKG_CONFIG_PATHは指定しないとhomebrewでインストールしたものが探せてなかった。prefixはお好みで


#  CLI

    idevice_id --list

接続してるiOSデバイスのUDIDを出力する

    idevicescreenshot

端末のスクリーンショットを撮って.tiff形式で保存する(-u UDID で端末を指定)

他idevice*のコマンドがあるので--help参照

    idevice_id
    idevicebackup
    idevicebackup2
    idevicedate
    idevicedebugserverproxy
    idevicediagnostics
    ideviceenterrecovery
    ideviceimagemounter
    ideviceinfo
    idevicepair
    ideviceprovision
    idevicescreenshot
    idevicesyslog
Pythonで関数合成と適用的な



[関数合成のススメ 〜 オブジェクト指向プログラマへ捧げる関数型言語への導入その1](http://yuroyoro.hatenablog.com/entry/20120203/1328248662)

[関数適用のススメ 〜 オブジェクト指向プログラマへ捧げる関数型言語への導入その2](http://yuroyoro.hatenablog.com/entry/20120206/1328513534)

上のような記事を見つけたので、ああ＾〜〜Pythonでもやりたいなあ＾〜〜と思ってちょこちょこしてみました。

　

まずは関数合成用関数の実装から
(g ∘ f)(x) = g(f(x))　らしいので

```python
def compose(f_t_u, f_u_r):
    '''
    :type f_t_u: t -> u
    :type f_u_r: u -> r
    :rtype: t -> r

    >>> comp(lambda a: a + 'oppai', lambda b: b + 'hoge')('')
    'oppaihoge'
    >>> comp(comp(lambda a: a+'oppai', lambda b: b+ 'hoge'), lambda x: '[' + x + ']')('')
    '[oppaihoge]'
    '''
    return lambda t: f_u_r(f_t_u(t))
```

一応型注釈みたいなものを入れてみたけど読みやすくなっているかどうかは不明.

さて、上記で一応関数合成は出来ているんですが、括弧がいっぱいです。
Scalaよくわかんないんですけども、元記事では括弧をやっつけるために演算子と暗黙の型変換を使っているみたいです。Scalaこわ

　　

がしかし、Pythonはそもそもオレオレ演算子を定義しまくったりはできません。
ということで、ここは関数の中置化で手を打ちます。みんな大好き`__ror__`, `__or__`のオーバーロードを悪用して、先ほどのcomposeを書き直します。
　　

```python
class infix(object):
    def __init__(self, function):
        self.function = function

    def __ror__(self, other):
        self.left = other
        return self

    def __or__(self, other):
        return self.function(self.left, other)

    def __call__(self, value1, value2):
        return self.function(value1, value2)

@infix
def c(f_t_u, f_u_r): return lambda t: f_u_r(f_t_u(t))

```

さて、これで

```python

(str.upper |c| sorted |c| set)('abcdeabc')
# > set(['A', 'C', 'B', 'E', 'D'])
```

のように書くことが出来るようになりました。

最後に、元記事のその2に出てくるApというコンテナを実装しましょう。
関数を受け取って適当するものには、右ビットシフトの演算子を利用します。


```python
class Ap(object):
    def __init__(self, val):
        self.val=val
    def __rshift__(self, func):
        return func(self.val)

```

こいつを使うことで

```python

Ap('abcdeabc') >> (str.upper |c| sorted |c| set)
# > set(['A', 'C', 'B', 'E', 'D'])
```

　　
と書けるようになりました。成し遂げたぜ。
　

まだ括弧残ってますけど、もうゴールしてもいいよね。
面白いのでこういうの好きですけども、あんまPython的じゃない気がするので実用性はよくわかんないですね。

 　

`# 追記`

Apクラスの実装を

```python

class _Ap(object):
    def __rlshift__(self, other):
        self.value = other
        return self

    def __rshift__(self, other):
        return other(self.value)
Ap = _Ap()
a = Ap

```

としてしまえば

```python

'abcdacb' <<a>> (str.upper |c| sorted)
#> ['A', 'A', 'B', 'B', 'C', 'C', 'D']

```
こんな感じにかけますね。
この方が元記事に近いビジュアルですし、よりapply感も出ますね（？）

追記:

汎用性は落ちますが、Haskellっぽく`.`で関数合成が出来るような雰囲気にしたものも書いてみました。

[Haskellの合成演算子 . をPythonで 〜関数合成によるCollection処理の実装](https://hachibeechan.hateblo.jp/entry/implements-the-haskells-compose-function-in-python-and-list-processing)
OimoPhysicsとAway3Dの連携

剛体の計算後、以下のコードを実行し、剛体の位置、回転をメッシュに適用するという方針です。
OimoPhysicsの回転系とAway3Dの回転系が異なっていたため、一旦新しくQuaternion を作成しなおしています。

```as3
// Away3Dオブジェクト
var box:Mesh;

// OimoPhysicの剛体
var rb:RigidBody;

// OimoPhysicsの回転クォータニオンから回転行列への変換
var qx:Number = rb.orientation.x;
var qy:Number = rb.orientation.y;
var qz:Number = rb.orientation.z;
var qw:Number = rb.orientation.s;
var q:Quaternion = new Quaternion(-qx,-qy, qz, qw);
var qm:Matrix3D = Matrix3DUtils.quaternion2matrix(q);

// Away3Dオブジェクトに割り当てる
var m:Matrix3D = new Matrix3D();
m.append(qm);
var px:Number = rb.position.x * ratio;
var py:Number = rb.position.y * ratio;
var pz:Number = rb.position.z * ratio * -1;
m.appendTranslation(px, py, pz);
box.transform = m;
```

※実際に使用する際は最適化が必要です。
sudoのconfigureオプションを確認する

sudo向けのldap設定をするときによくsudoが読んでるldap.confのpathが分からなくなるのだけど、rootユーザーで `sudo -V` するとconfigureオプションが表示される。…ことをいつも忘れてハマるのでメモ。

```shell-session:
localhost ~ # sudo -V | grep 'Configure options:'
Configure options: --prefix=/usr --build=x86_64-pc-linux-gnu --host=x86_64-pc-linux-gnu --mandir=/usr/share/man --infodir=/usr/share/info --datadir=/usr/share --sysconfdir=/etc --localstatedir=/var/lib --libdir=/usr/lib64 --enable-zlib=system --with-secure-path=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/opt/bin --with-editor=/usr/libexec/editor --with-env-editor --without-insults --without-all-insults --with-ldap_conf_file=/etc/ldap.conf.sudo --with-ldap --enable-nls --with-pam --without-skey --without-selinux --with-sendmail --without-opie --without-linux-audit --with-timedir=/var/db/sudo --with-plugindir=/usr/lib64/sudo --docdir=/usr/share/doc/sudo-1.8.6_p7
localhost ~ # sudo -V | grep 'ldap.conf path:'
ldap.conf path: /etc/ldap.conf.sudo
```
KVMにDebian Wheezyをコンソールでインストールする


kvmやvirshなどの環境は入っている前提です。

```bash
virt-install \
    --accelerate \
    --connect=qemu:///system \
    --name wheezy \
    --ram 256 \
    --vcpus 1 \
    --noacpi \
    --os-type=linux \
    --hvm \
    --network bridge:br0x0 \
    --location='http://ftp.jp.debian.org/debian/dists/wheezy/main/installer-amd64/' \
    --disk path=/var/lib/libvirt/images/wheezy.img \
    --nographics \
    --extra-args='console=tty0 console=ttyS0,115200n8'
```

あとはコンソールでインストールを進めていく
CoffeeScriptでpoor man's null object

Backbone.jsでモックした`#save`が返すxhrのメソッドチェーンでテストが通らなくて困ってました。
呼ばれるメソッドがわかっていれば、下記のようにNull Objectっぽいことができます。

```coffeescript:
nullObjectish = {foo: (-> @), bar: (-> @)}
nullObjectish.foo().foo().bar().bar().foo()
# => { foo: [Function], bar: [Function] }
```

ちゃんとしたNull Objectの実装は難しいっぽいです。@mizchi がそう言ってました。

(2014/04/25)

クラス対応版

```coffeescript
_ = require 'underscore'

class Example
  foo: ->
  bar: ->
  baz: ->

buildPseudoNullObject = (klass) -> _.object ([k, (-> @)] for k, v of klass.prototype)

nullObjectish = buildPseudoNullObject Example
nullObjectish.foo().foo().bar().bar().baz().foo()
```
一定パターンを無限に繰り返すリストを作る

Enumerator#cycle を使う

Range から無限リストを作る

```ruby
> (1..4).cycle.each {|n| sleep 1; puts n };
1
2
3
4
1
2
3
4
1
2
:
```

配列から無限リストを作る

```ruby
> ["hoge", "fuga", "moge"].cycle.each {|n| sleep 1; puts n };
hoge
fuga
moge
hoge
fuga
moge
:
```
Capybara リファレンス一覧

#let(:studio) { create(:studio) }
データベースを作る、letの後がデータベース名
letの後に!をつけてlet!とすると優先的に作る
#visit
ページに移動
例：visit root_path
#fill_in
フォームに値を入れる　
例：fill_in 'number', with: staff.number
#click_button
ボタンをクリック
#click_link
リンクをクリック
例：click_link '前へ進む'
#click_on
ボタンまたはリンクをクリック
#select('カテゴリ１', :from => 'カテゴリ')
セレクトボックスから項目を選択
例： select('選択してください。', :from => 'staff_staff_type')
fromにid名を記入
#save_and_open_page
デバックモードでブラウザに表示させる
 gem 'launchy'をinstallすれば使えるようになる
#assert page.has_content?("contentの内容")
contentの中身があるかどうか実際にチェックする
#refute page.has_content?
contentの中身にある要素がなかったらテスト通すという意味
#choose "女性"
ラジオボタンを選択 (ここでは男性か女性かで女性を選択)
#check("現金")
チェックボックスを選択(ここでは支払い区分があって現金を選択)



オススメ参考Blog
http://blog.twiwt.org/e/6d0de8

http://www.ogimi.net/index.php?title=Capybara
CocoaPodsを使ってビルドが失敗する時にチェックすること


なんかCocoaPodsのバージョン上げてPodsを入れなおしたらビルドが通らなくなった。どうやらPods.xcconfigから参照していたPODS_BUILD_HEADERS_SEARCH_PATHSやPODS_PUBLIC_HEADERS_SEARCH_PATHSが消えてしまいヘッダファイルが見つけられなくなっている。

[Integrating with an Xcode project](http://docs.cocoapods.org/guides/integrating_a_project.html)を確認。CocoaPodsではビルド設定を **Pods/Pods.xcconfig** に作成して、それをアプリケーションプロジェクトに設定する。

これが正しく適応されているかは、

1. PROJECT が Pods.xcconfig を使っているか
1. TARGET が PROJECT の設定を継承しているか

をチェックする。

### PROJECTがPods.xcconfigを使っているか

Pods.xcconfigが使われているかは PROJECTの **Info** > **Configrations** の **Based on Configuration File** を見ればわかる。これが **Pods** になっていればok。

![pods_2013-07-18_1716.png](https://qiita-image-store.s3.amazonaws.com/0/2435/1c2c170c-5295-a5a4-70f5-00393944da3b.png "pods_2013-07-18_1716.png")

### TARGETがPods.xcconfigの設定を使っているか

次に Pods.xcconfig の中身からビルド設定を確認する。

コンパイルが失敗する場合はPods.xcconfigのHEADER_SEARCH_PATHSが、リンクが失敗する場合はLIBRARY_SEARCH_PATHS、OTHER_LDFLAGSが適切に設定されていないおそれがある。

例えばTARGETの Build Settings で 直接 Header Search Paths を設定していると PROJECT(Pods.xcconfig)の値が使われないのでヘッダファイルを探せなくなる。この場合はPROJECTの設定を引き継ぐように  ``$(inherited)`` を追加する。

![pods_2013-07-18_1726.png](https://qiita-image-store.s3.amazonaws.com/0/2435/76275445-c9be-7a1a-9ad3-4a827eaf5f15.png "pods_2013-07-18_1726.png")

同様にLIBRARY_SEARCH_PATHSが使われているなら **Library Search Paths**を 、OTHER_LDFLAGSが使われているなら **Other Linker Flags** の値に ``$(inherited)`` を追加する。

今回ハマッたようにTARGETでは直接Pods.xcconfigの変数を使わずにPROJECTを継承した方が無難。
Cooperationalコモナド

使い方不明

```haskell
import Data.Functor.Yoneda
import Control.Comonad.Cofree
import Control.Comonad

type Coprogram t = Cofree (Yoneda t)

data Hole = Hole

alone :: Coprogram t a -> t a
alone (_ :< Yoneda f) = f extract

cointerpret :: Comonad w => (forall x. w x -> t x) -> w a -> Coprogram t a
cointerpret e w = extract w :< Yoneda (\f -> e $ extend (f . cointerpret e) w)
```
コマンドでAndroidのアプリ情報画面を起動する


Androidのアプリ開発をしていると、開発中アプリのデータを消したくなったり、強制停止させたくなったりします。
ただ、設定からメニューを辿って、たくさんインストールされているアプリの一覧からわざわざ選択するのがめんどくさい。
アプリ一覧のショートカットをホーム画面に置いておいても、一覧がもうめんどくさい。
そんなわけで~/.bashrcに以下の記述をして、ターミナルからパッケージ名を指定すれば起動できるようにしました。

```bash:.bashrc
appinfo() { adb shell am start -a android.settings.APPLICATION_DETAILS_SETTINGS -d package:$1; }
```

使うときは、Android端末をPCに繋いで以下のように実行します。

```bash:コマンド
appinfo com.example.appname
```

`com.example.appname`は開発してるアプリのパッケージ名を入力します。
うん、これでとても便利になった。

ただし、Android2.3以上の端末限定です。
Java Decompiling

# Reference
- [JAVAの逆コンパイラ「JD」 | きぬろぐ](http://www.kinusati.net/2011/02/05/java%E3%81%AE%E9%80%86%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9%E3%80%8Cjd%E3%80%8D/)
- [デコンパイルツール「Java Decompiler」を試してみた。 - 谷本 心 in せろ部屋](http://d.hatena.ne.jp/cero-t/20100216/1266326811)
- [ユカイ、ツーカイ、カイハツ環境！（13）：究極の問題解析ツール、逆コンパイラJD-Eclipseとは (1/2) - ＠IT](http://www.atmarkit.co.jp/ait/articles/1003/08/news080.html)
- [＠IT：Java TIPS -- Eclipseで逆コンパイルを行う](http://www.atmarkit.co.jp/fjava/javatips/073eclipse025.html)
slimでテキスト埋め込み時にエスケープをオフにする

Slimではテキスト中にRuby式の`#{@hoge}`でテキストを埋め込めます。

```
html
  body
    | Hello my name is #{@name}.
```

といった具合です。erbで言う<%= @name %>みたいな感じですがこっちのほうがRubyぽくて見やすいです。
ですがJavaScriptに何か埋め込むなどのちょっとトリッキーな事に使おうとした場合、エスケープ処理されるのが邪魔になるケースがあります

```
javascript:
  SomeGreatFuction("#{@target}")
```

こう書いた物が

```html:
<script type="text/javascript">
  SomeGreatFunction("[&quot;a&quot;, &quot;b&quot;]")
</script>
```

こんな感じに残念な事になります。そういう時は`#{{@hoge}}`を使います。

```
javascript:
  SomeGreatFuction(["#{{@target}}"])
```

こうかくと

```html:
<script type="text/javascript">
  SomeGreatFunction([”a", "b"])
</script>
```

こうなってくれて便利。
capistranoでリモート環境にデプロイと自分自身にデプロイ


## 目的
awsのautoscalingに対応したデプロイ環境の実現。
awsでのwebアプリデプロイはここ参照
<http://www.slideshare.net/AmazonWebServicesJapan/20130506-23096544>
この資料の`Auto Scalingでデプロイ`の項目。
実現出来そうではあるがハードコーディング感が否めない、
コマンド一発で実行出来る環境を構築して変更に強くしておきたい
(例えばcapistranoで自分自身にデプロイ出来るようにしておくとか、そうすればデプロイ手順が変更されてもcapistranoでデプロイに統一されていれば自ずと同じデプロイが実行される)
ElasticBeantalkは外部にあんまりソースコード置きたくないかな。。でも便利そう、超便利そう

## 課題

- 自分自身にデプロイする
- リモート環境にデプロイする時と同じ処理

てのが出来れば良い

## capistrano-extインストール

環境毎に分けたデプロイ方法が実現できるプラグインの導入

    gem install capistrano-ext

    mkdir config/deploy
    touch config/deploy/local.rb
    touch config/deploy/remote.rb

    vi config/deploy.rb

```config/deploy.rb
# デプロイ環境が複数ある場合
set :stages, ["remote", "local"]
set :default_stage, "remote"
```

以下のように切り替えて実行する事が出来る

    # config/deploy/remote.rbの記述が読み込まれる
    cap deploy
    cap remote deploy

    # config/deploy/local.rbの記述が読み込まれる
    cap local deploy

## roleの記述を読み替える

実行を切り替えた時に`role`の設定を切り替える

```config/deploy.rb
set(:domain) { "#{domain}" }
role(:app) { domain }
```

remoteはELB配下のサーバーにデプロイ出来るようにawsのapi叩いてipの取得、vpc使ってip割り振っているので`/etc/hosts`で設定してあればその名前取得、なければipまま
(autoscalingやるとなるとip割り振りする必要無くなりそうですね)

```config/deploy/remote.rb
require 'aws-sdk'
require 'resolv'

AWS.config({
  :access_key_id     => 'access_key_id',
  :secret_access_key => 'secret_access_key',
  :ec2_endpoint      => 'ec2.ap-northeast-1.amazonaws.com',
  :elb_endpoint      => 'elasticloadbalancing.ap-northeast-1.amazonaws.com'
})
elb = AWS::ELB.new.load_balancers['elb-name']
instances = elb.instances.select {|i| i.exists? && i.status == :running }.map(&:private_ip_address)

# /etc/hosts を参照してhostnameに変換、hostsファイルに記述無いとip表示
hostnames = []
hosts = Resolv::Hosts.new
instances.each {|ip|
    begin
        hostnames.push(hosts.getname(ip))
    rescue
        hostnames.push(ip)
    end
}

set :domain, hostnames
```


```config/deploy/local.rb
set :domain, ['localhost']
```

これで下記コマンドでリモートとローカルでのデプロイを切り分ける事が出来た。

    cap deploy
    cap local deploy

os立ち上がった時にバージョン管理から最新になるパス作ってそこにcapistrano設置、autoscalingから起動したらそのパスのデプロイコマンド叩くとローカルにデプロイされるという環境が出来上がるであろう。
実際にautoscalingは実現出来てはいないが問題の一つは解消出来たと思われる。

後は毎回サーバーの変更あるたびにAMI作り直すの面倒なんでchef実行される環境作ったりとかですかね。

以上
laravelでルートをpublicディレクトリから移動するには

デフォルトではプロジェクトのルートにpublicとうディレクトリがあって、そのディレクトリがアプリケーションのドキュメントルートになるイメージ。自分でイロイロやれるサーバではこれでも良いけれど、とりあえず作ったものをドンッと置いてしまいたい場合には不都合がありそうだ。という事で調べた。

下記がその問題を話題にしている様子
http://forums.laravel.io/viewtopic.php?id=9371

以下転載＆適当な訳

> You can use this tip to hide your /public segment from URL and protect Laravel from public access.

> Imagine that these are your directories from your web hosting:

```bash:
/
    /etc
    /mail
    /laravel     <- ALL LARAVEL FILES EXCLUDING PUBLIC FOLDER
    /public_ftp
    /public_html
        /MyApp <- HERE YOU HAVE TO PUT YOUR /PUBLIC CONTENT FROM LARAVEL. YOU CAN EVEN USE PUBLIC_HTML IF DON'T NEED TO USE A SUB-FOLDER.
    /another_folder
    /blah-blah
```

> Now you have to edit your index.php file from /public Laravel folder (now is in /public_html/MyApp):

> Index,php, line 21

> require __DIR__.'/../bootstrap/autoload.php';
> Edit path to:

> require __DIR__.'/../../laravel/bootstrap/autoload.php';
> Index.php, line 35

> require __DIR__.'/../bootstrap/start.php';
> Edit path to:

> require __DIR__.'/../../laravel/bootstrap/start.php';
> Now you can access like http://www.myDomain.com/MyApp

publicセグメントをURLから消してLaravelを公開アクセスから守るのに、このチップスが使えるよ。
きみのWebホストにディレクトリがあると想像して。

```bash:
/
    /etc
    /mail
    /laravel     <- 全てのLALAVELのファイルが公開フォルダから除外される
    /public_ftp
    /public_html
        /MyApp <- ここは君の/PUBLICのコンテンツをLARAVELから置かないといけない。またはもしサブフォルダを使う必要がないと思うならPUBLIC_HTMLでもいい
    /another_folder
    /blah-blah
```

Index,php, line 21
require __DIR__.'/../bootstrap/autoload.php';
パスを書き換えて:
require __DIR__.'/../../laravel/bootstrap/autoload.php';

Index.php, line 35
require __DIR__.'/../bootstrap/start.php';
パスを書き換えて:
require __DIR__.'/../../laravel/bootstrap/start.php';
そしたら http://www.myDomain.com/MyApp のようにアクセスできるよ。

読んだ内容から想像すると、laravelディレクトリは公開してはならず、public/index.phpの中身のパスが妥当なファイルを指している必要がありそうだ。自分の所では移動はできたが、問題として下記が浮上した。

【疑問】自分が試した所ではlaravelディレクトリが存在しないが、これはいったいどういう事だろうか。vendorの中に入っているもの事を言っているのだろうか。解る人教えて下さい。
Booでevaる。

# evalが欲しい

Boo以外のプログラミング言語によくある eval は無くてもなんとかなることは多いですが、稀にどうしても欲しくなるときがあります。

# 実装

次のプログラムは引数の文字列 Boo プログラム prog を実行するメソッド eval です。prog は、eval() を実行した環境のロード済みアセンブリと同じものをロードした状態でコンパイルされます。

```boo
import Boo.Lang.Compiler
import Boo.Lang.Compiler.IO

def eval( prog as string ):
	compiler = BooCompiler()  # コンパイラ作る。
	p = compiler.Parameters
	p.Pipeline = Pipelines.CompileToMemory()  # memory上にアセンブリ出力するコンパイラパイプライン。
	# 今実行中の環境にロードされているアセンブリをコンパイル時に参照する。
	for asm in System.AppDomain.CurrentDomain.GetAssemblies():
		p.References.Add( asm )
	p.Input.Add( StringInput( 'テキトーな名前', prog ) )  # evaるプログラムを入力にする。
	result = compiler.Run()  # コンパイル。
	result.GeneratedAssembly.EntryPoint.Invoke( null, (null,) )  # 結果の実行開始ポイントになるメソッド起動。
```

こんな風に使います。

```boo
eval """
a = "hello world!"
print "a=${a}"
""" 
```

# 結論

かっこいい読み方は「エヴァる」。
chefのservice再起動タイミングの指定

chefのcookbook郡の中のrecipe内、serviceの記述部分で不必要な再起動をしないための記述方法

```cookbooks/munin-node/recipes/default.rb
template "/etc/munin/plugin-conf.d/nginx" do
  source "nginx"
  notifies :restart, "service[munin-node]"
end

service "munin-node" do
  supports :start => true, :restart => true, :enable => true
end
```

`template`で記述したファイルが書き変わって実行された場合のみ`munin-node`のrestartが走る
Apache HTTPD インストール

メモ

```bash:root-user-command
# 必要モジュールインストール
yum -y install make gcc cpp pcre-devel
mkdir -p /usr/local/src/httpd
cd /usr/local/src/httpd

# version setting
http_version=2.4.7
apr_version=1.5.0
aprutil_version=1.5.3

# ダウンロード (httpd / apr / apr-util)
wget http://ftp.riken.jp/net/apache/httpd/httpd-${http_version}.tar.gz \
     http://ftp.riken.jp/net/apache/apr/apr-${apr_version}.tar.gz \
     http://ftp.riken.jp/net/apache/apr/apr-util-${aprutil_version}.tar.gz

# 解凍
find -name "*.tar.gz" ! -iregex "\./.+/.+" -exec tar -xzvf {} \;
mv apr-util-*/ httpd-2.4.7/srclib/apr-util/
mv apr-*/ httpd-2.4.7/srclib/apr/

# configure
cd httpd-*
./configure --with-included-apr --enable-load-all-modules

# make
make && make test && make install

# /usr/sbin 設定
cd /usr/sbin
ln -sf /usr/local/apache2/bin/apachectl
ln -sf /usr/local/apache2/bin/httpd
ln -sf /usr/local/apache2/bin/htpasswd
ln -sf /usr/local/apache2/bin/htdigest
ln -sf /usr/local/apache2/bin/apr-1-config
ln -sf /usr/local/apache2/bin/apu-1-config

# /etc/init.d 設定
cd /etc/init.d
ln -sf /usr/local/apache2/bin/apachectl httpd

# default config backup
cd /usr/local/apache2/conf
cp -p httpd.conf httpd.conf.orig

```
PHPインストール

メモ

* mysql : rpm or yum でインストール
* apache : デフォルト prefix でインストール

```bash:install
# ソース取得
wget http://jp1.php.net/get/php-5.5.0.tar.gz/from/this/mirror
tar -zxvf php-5.5.0.tar.gz
cd php-5.5.0


# インストール
#
# モジュールの追加 
#
#./configure \
#  --prefix=/usr/local/php \
#  --with-apxs2=/usr/local/apache2/bin/apxs \


./configure \
  --with-apxs2=/usr/local/apache2/bin/apxs \
  --enable-mod-charset \
  --enable-libgcc \
  --enable-mbstring \
  --enable-embedded-mysqli \
  --enable-zip \
  --enable-mysqlnd \
  --with-mysql \
  --with-pod-mysql
```
JSX(Adobeの方)でスクリプトファイル自身のpathを求める

### 追記

こんなことしなくても `$.fileName` で取れますね…

----

ちょっと気持ちわるいけどこれでスクリプトファイルのpathが取れるらしい。

```js:path.jsx
const SELF = (function(){
    try {app.documents.test()}
    catch(e) {return File(e.fileName)}
})();
$.writeln(SELF instanceof File);
$.writeln(SELF);
$.writeln(SELF.path);
```
Asset Pipelineでコントローラー・アクションごとにassetを管理する

今更ながらAsset Pipelineでコントローラー・アクションごとにassetを管理する方法を調べた。

Assets PrecompileはすべてのJSやCSSがひとつのファイルにまとめてくれるので、通信量が減ったりキャッシュが効きやすくなったりメリットはあるけど、適切に管理しないと思わぬところに影響が出てしまうことがある。

いろいろ方法はありそうだけど、調べたなかでは以下のやり方がよさそうでした。他にいい方法があればコメントください。

# JavaScript

下記のとおり実装すると、おおまかに次のような流れで各コントローラー・アクション用のJSが実行されるはず。

1. bodyタグのdata属性にコントローラー名とアクション名が入る
2. グローバルオブジェクトに名前空間が用意される
3. 各コントローラーごとのオブジェクトが名前空間に用意される
4. JSがbodyタグのdata属性からコントローラー名とアクション名を取得する
5. 名前空間からコントローラー名に対応するJSオブジェクトを取得する
6. そのオブジェクトに定義された、アクション名に対応するメソッドを実行する

## 1. bodyタグのdata属性にコントローラー名とアクション名を挿入する

あとでJS側からコントローラー名とアクション名を取得するため、bodyタグのdata属性に入れておく。`controller_path`を使うと名前空間も含んだコントローラー名になる。

```rb:application.html.haml

%body{data: { controller: controller.controller_path, action: controller.action_name } }
  = yield
```

## 2. グローバルオブジェクトに名前空間を用意する

各コントローラー用のオブジェクトを管理するための名前空間をグローバルオブジェクトに用意しておく。`?=`は`null`または`undefined`であれば代入する意味。

```coffeescript:app/assets/javascripts/my_application.js.coffee

this.MyApplication ?= {}
```

## 3. 各コントローラー用のオブジェクトを用意する

各コントローラー用のオブジェクトを各JSファイルに定義して、先ほど用意した名前空間に登録しておく。オブジェクト内では下のようにアクション名に対応した関数を用意しておく。

```coffeescript:users.js.coffee

class UsersController
  index: ->
    console.log("UsersController#index")

  show: ->
    console.log("UsersController#show")

this.MyApplication.users = new UsersController
```

## 4. コントローラー名からオブジェクトを取得してフックを実行する

さっき作ったファイルを`application.js`で`require`したあとで、下のようなコードを書く。1.でbodyタグのdata属性に挿入しておいたコントローラー名とアクション名を取得する。で、そのコントローラー名に対応するJSのオブジェクトを名前空間から探し、見つかったらアクション名に対応するJSの関数を実行する。

```js:application.js

//= ...
//= require my_application
//= require_tree .

$(function () {
    var $body = $("body");
    var controller = $body.data("controller").replace(/\//, "_");
    var action = $body.data("action");

    var activeController = MyApplication[controller];

    if (activeController !== undefined) {
        if ($.isFunction(activeController[action])) {
            activeController[action]();
        }
    }
});
```

# CSS

## 1. bodyタグのクラスにコントローラー名とアクション名を使って名前空間を用意する

JSのときと同様に名前空間を含めたいので`controller_path`を使う。

```rb:application.html.haml

%body{class: css_namespace}
  = yield
```

```rb:application_helper.rb

def css_namespace
  controller_namespace = controller.controller_path.gsub(/\//) { "_" }
  "#{controller_namespace} #{controller.action_name}"
end
```

## 2. 名前空間ごとにCSSを定義する

sassやscssを使えば簡単に定義できる。

```sass:users.css.sass

.users
  // コントローラー全体のCSS

  &.index
    // 各アクションのCSS

  &.show
  &.new
```

---

## 参考

- [A Simple Pattern to Namespace and Selectively Execute Certain Bits of JavaScript Depending on Which Rails Controller and Action are Active - Jerod Santo](http://blog.jerodsanto.net/2012/02/a-simple-pattern-to-namespace-and-selectively-execute-certain-bits-of-javascript-depending-on-which-rails-controller-and-action-are-active/)
- [sass - How to manage CSS Stylesheet Assets in Rails 3.1? - Stack Overflow](http://stackoverflow.com/questions/6102158/how-to-manage-css-stylesheet-assets-in-rails-3-1)