OmniAICreator/Qiita-1.07M huggingface dataset:
MySQLからテキストファイルにデータを落とし込む簡単な方法

最近、データのクリーニングのためにMySQLからデータをテキスト形式で拾ってきてExcelで編集するということをしたのですが、よくあるコマンドラインのインターフェースから

```sql
SELECT フィールドリスト FROM テーブル名 INTO OUTFILE "ファイル名" FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"';
```

の場合は出力先ディレクトリのパーミッションの問題とかあって面倒くさいなあ・・・と思ってたんですよ
しかもリモートのMySQLサーバだったりすると詰むこともあるわけで

そしたら

```bash
mysql --user=foo --password=bar -e "抽出用SELECT文" データベース名 > 出力先のファイル
```

mysqlの単発コマンドの出力を単純にリダイレクトしてやるだけで、ヘッダ行つき・タブ区切りのテキストファイルに落ちるらしい
ExcelやCalcで読む場合は読み込みのウィザード経由になりますけど、普通に読める状態になります

まあ私は個人的に文字コードの問題や電話番号とか郵便番号項目の先頭0が妙な変換のされかたをして嫌な思いをするからそのまま読み込むようなことはしないんですけどね
Twitter Bootstrap Modalでdatepickerのカレンダーが表示されないとき

[Twitter Bootstrap Modal](https://github.com/jschr/bootstrap-modal/)を使ったモーダルウィンドウでは、そのなかに配置されたdatepickerのカレンダーが表示されません。

次のスタイルを定義することで表示されるようになります。

```css
<style>
.datepicker{z-index: 1151 !important; position: absolute;}
</style>
```
CloudFlareとAmazonS3を連携させてリクエストを抑える


Railsをつかって [旅ペディア](http://tabipedia.net)というサイトを作りました。
画像が結構多く、これをさばくためにAmazonS3を使っています。

## 金額が不安

が、個人で使うには従量課金制という料金制度は、どのくらいアクセスがくるかわからない状況だと結局いくら掛かるのかわからないというところが個人的に不安なところではありました。

なので、すこしでもS3にくるリクエストを抑え、かつ速く画像を提供できる手段はないかな...と考えました。

最初はAmazonのCloudfrontを考えましたが、こちらも従量課金制なので、結果的にかかる金額を考えるとあまり良くはない感じがしたので、

定額でかつ無料でも試せる[CloudFlare](https://www.cloudflare.com/)を試してみることにしました。

## CloudFlareって？

[ここ](http://jp.cloudflare.com/)をみればいいと思います。(日本語が結構あれですが)

## CloudFlareの設定

会員登録をすると、そのまま設定が始まります。
大体そのままの設定で大丈夫だと思います。
日本語に対応してるのですが、結構怪しい日本語なので、英語で見たほうがわかりやすいかも。

ここでcloudflareがキャッシュを行うドメインを設定します。

すると、cloudflare側が勝手にサブドメイン(CNAME)を設定してくれます。
(mail.hoge.comとか、direct.hoge.comとか。)

ここでいらないものは消しておいても良いと思います。

そのあとで、ドメインを取得したサービス(お名前.comとか)で、DNSの設定をcloudflare側が用意したDNSに変更します。
`***.cloudflare.com`みたいなやつです。

反映までに時間がかかる場合もあるので、急いでいるときはお早めに。

## S3と連携させる

もとのドメインもcloudflareを使っていろいろとキャッシュしてくれたりしますが、今回やりたいことはS3との連携です。

大体[ここ](https://support.cloudflare.com/hc/en-us/articles/200168926-How-do-I-use-CloudFlare-with-Amazon-s-S3-Service-)に書いてますが、

今回は画像を配信したいので、 `image.hoge.com`みたいなCNAMEを設定して、cloudflareとS3を連携させてを使っていきたいと思います。
(独自ドメインをつかって画像配信とか、なんかかっこいい！と思ってました。)


### まず、S3側の設定

S3側で、cloudflareと連携させるbucketを作成します。
ここで大事なのが、`image.hoge.com`、というCNAMEを設定する場合、S3のbucket名を`image.hoge.com`、に設定しなければいけません。

そしたら、amazonS3側で、`image.hoge.com.s3.amazonaws.com`といった感じのドメイン(?)が生成されます。
S3のbucketにそのままアクセスすると違うurlなのですが、このようなurlも使えるようですね。

先ほどのs3 bucketのurlのrootにアクセスすると、

```
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>8C0D77E4DD8EECA8</RequestId>
<HostId>
pcfDdejysceCeMbamRIIOGXG+HVDRW+89T/OAO6tuVnzl0SSwypgq3VakRXyeBJJ
</HostId>
</Error>
```

このように表示されると思います。これでOK。

## cloudflare側の設定

先ほど設定した `image.hoge.com.s3.amazonaws.com`をcloudflare上でCNAMEに設定します。


`image` is an alias of `image.hoge.s3.amazonaws.com`


![スクリーンショット_2013-11-10_3.26.51-5.png](https://qiita-image-store.s3.amazonaws.com/0/5767/6963d718-78a0-a935-7923-c5d73f409f82.png "スクリーンショット_2013-11-10_3.26.51-5.png")

こんな感じに。

そしたら、cloudflare側の設定も完了です！簡単！

そしたら、`image.hoge.com`にアクセスしてみましょう。

先ほどのS3のbucketのurlと同じ結果になっていればok!

設定の反映に結構時間がかかるので、うまくアクセスできないときは気長にまってみましょう。(ボクは待てなくて結構焦ってました。)


## Rails側でPaperclipと一緒に使う

やっぱりpaperclip便利ですね。s3との連携もできるし。

独自ドメインを使う場合はちょっと設定が違うので参考までに。


```
has_attached_file :image,
  :storage         => :s3,
  :s3_credentials => "#{Rails.root}/config/s3.yml",
  s3_host_alias: 'image.hoge.com',
  :path => "/:class/:attachment/:id_partition/:style/:filename",
  :url => ':s3_alias_url'
```

大体こんな感じ。増えるのは `:url => ':s3_alias_url'`とか`s3_host_alias: 'image.hoge.com',`でしょうか。

設定さえすればあとは今までと同じように使えます。


## まとめ

長くなりましたが、Cloudflare、便利だと思います！無料だし、一度試してみるのもいいのではないでしょうか。

cloudflare内には、専用のアナリティクスぽいものがあるのですが、いまのところ、大体半分ぐらいのリクエストがcloudflareのお陰でsaveできているようです！
あとはS3の請求書を待つだけ！！！！(ちょっとこわい)

あと、無料でも使えますが、月額20ドルで、サポートが手厚くなったり、(メールの返信速度が全然違う)、SSLに対応したり、htmlとかのminifyもやってくれるらしいので、よかったらupgradeしてみてもよいかも！！


今回初めてだったので、結構間違った知識があるかもしれません、気軽に編集リクエストおねがいします！
LaravelでIDE補完を有効にする

補完が無いIDEなんてIDEの意味ないじゃない。
ということで今流行りのLaravelでIDE補完機能を有効にする設定を行います。
当方PhpStormを使用していますがEclipse等でも同じやり方で補完がきくようになるはずです。

ではやっていきます。
Laravel IDE Helper Generatorなる便利なものがあるのでこちらを使用します。
[Laravel IDE Helper Generator](https://github.com/Barryvdh/laravel-ide-helper)

最近はComposerを使用するのがナウいようなのでcomposerを使用してLaravel IDE Helperを導入します。
LaravelをComposerで導入した人はすでにComposerが入っていると思いますが、まだ入っていないよーという人はComposerの公式ページ通りやってくださいな。curlで取ってきて実行するだけです。
[Composer](http://getcomposer.org/doc/00-intro.md)

ではではcomposer.jsonに下記を記載しましょう。
composer.jsonはすでにLaravelプロジェクトディレクトリにあるはずなのでそちらに追記する形にしましょう。

```composer.json
{
	"require": {
		// ↓下記を追加↓
		"barryvdh/laravel-ide-helper": "1.*"
	},
}
```
追記が完了したらcomposer updateを実行します。

```
% composer update
```

Composerをグローバルに置いていない方は↓のような実行方法になるかもしれません。適宜実行してください。

```
% php composer.phar update
```

composer updateが完了したらvendorディレクトリ以下にbarryvdh/laravel-ide-helperというディレクトリが作成されていればここまで問題なしです。

次にlaravelの設定ファイルapp/config/app.phpのservice providerの箇所に追記をします。

```app/config/app.php
'providers' => array(
	// ↓ 下記を追記 ↓
	'Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider', 
),
```

service providerに追記箇所を追記したらLaravelのコマンドラインツールのartisanを使用してIDE補完に使うファイルを生成します。

```
% php artisan ide-helper:generate
```

_ide_helper.phpというファイルが生成されていれば完了です。
これで補完がきくようになります。

チームで開発などをしている場合はcomposer.jsonファイルに下記のように記載をしてcommitしてあげると他の人がLaravel IDE Helperをいれる場合にcomposer updateをするだけで入るので便利です。

```composer.json
{
	"scripts":{
    		"post-update-cmd":[
			// ↓ 下記を追記 ↓
        			"php artisan ide-helper:generate",
        			"php artisan optimize",
    		]
	},
}
```

これでじゃかじゃか補完を使用して開発しましょう。
TOPIXの時系列を pickle, csv, Excel形式で保存する

# 何をするのか

TOPIX の時系列を表示するのは前の投稿でやったので、
後で加工しやすいようにいろんな形式で保存する。

# Yahoo ファイナンスの html を解析するコード
前のと同じ。 ただし、 `savedataAsなんとか(filename, data)` という関数呼び出しを入れている。

```py
#!/usr/bin/env python
#-*- coding: utf-8 -*-
import pylab
import urllib2
import lxml
import lxml.html
import re

dateFr = {"year": 2000, "month":1, "day":1}
dateTo = {"year": 2013, "month":11, "day": 1}

data = []
for page in range(1, 30):
    print page
    url = "http://info.finance.yahoo.co.jp/history/?code=998405.T&sy=%d&sm=%d&sd=%d&ey=%d&em=%d&ed=%d&tm=d&p=%d"
    url = url % (dateFr["year"], dateFr["month"], dateFr["day"], dateTo["year"], dateFr["month"], dateFr["day"], page)

    html = urllib2.urlopen(url).read()
    root = lxml.html.fromstring(html)
    table = root.xpath(' //*[contains(concat(" ",normalize-space(@class)," "), " boardFin ")]')[0]

    for tr in table.xpath("descendant::tr"):
        tmp = [td.text for td in tr.xpath("descendant::td")]
        if len(tmp) != 5:
            continue
        begin = float(tmp[1].replace(",", ""))
        high  = float(tmp[2].replace(",", ""))
        low   = float(tmp[3].replace(",", ""))
        end   = float(tmp[4].replace(",", ""))
        data.append([low, high, low, high])
savedataAsPickle('topix.pickle', data)
savedataAsCSV('topix.csv', data)
savedataAsExcel('topix.xlsx', data)
```

# 保存するコード

## pickle
python の標準ライブラリにある形式

```py
def savedata(filename, data):
    pickle.dump(data, open(filename, "w"))
```

## csv
Comma Separated Values の略。テキスト形式。

```py
def savedata(filename, data):
    import csv
    csvobj = csv.writer(open(filename, "w"))
    csvobj.writerows(data)

```

## Excel 形式
Excel で読める形式に保存

```py
def savedata(filename, data):
    import openpyxl.workbook
    import openpyxl.cell
 
    wb = openpyxl.workbook.Workbook()
    ws = wb.worksheets[0]
    ws.title = "TOPIX"
    for idat, dat in enumerate(data):
        col = openpyxl.cell.get_column_letter(idat + 1) # from 1, 2, ... to A, B, ...
        for irow, d in enumerate(dat):
            ws.cell('%s%s'%(col, irow + 1)).value = d
    wb.save(filename)
```
CentOS 6.4 で/boot 以下を整理する

## yum upgrade でエラー
CentOS 6.4 で yum upgrade したら下のエラーが・・・
upgrade のたびに古いkernel がたまって /boot がいっぱいらしい

```
Transaction Check Error:
  installing package kernel-2.6.32-358.23.2.el6.x86_64 needs 4MB on the /boot filesystem

Error Summary
-------------
Disk Requirements:
  At least 4MB more space needed on the /boot filesystem.
```

##  解決方法
sudo package-cleanup --oldkernels で古いkernel を削除


3つぐらいkernel が削除された模様。
しかし、あんまりkernel をいくつかとっておく理由がよくわかんないなぁ(なんかロールバックすることあるんだろな
sudoコマンドのメッセージを変える方法


expectスクリプト等でハマることがあるため，まとめてみました．
serverspecでハングアップする人はぜひとも参考にしていただければと思います。
（試した環境はMac OSX10.8とCentOS6.3）

## その１：/etc/sudoersを編集する

visudoコマンドで以下の行を追記します．

```
Defaults passprompt="passowrd:"
```

こうすることで，root以外の全ユーザのsudoコマンド時に`passowrd:`と表示されるようになります．
記述後，特に再起動などはする必要ありません．


## その２：sudoコマンドにpオプションを与える

sudoにpオプションを与えて，直後に表示させたい文字列を渡すと，パスプロンプトが引数の文字列になります．

```
sudo -p "パスワーーーーード:" su
> パスワーーーーード:
```

## その３：環境変数 SUDO_PROMPT に値をセットする

```
export SUDO_PROMPT="passssss"
sudo su
> passssss:
```

ちなみに，exportしないと有効になりませんでした．
exportしない場合は下記のようにするといいです．

```
SUDO_PROMPT="passssss:" sudo su
> passssss:
```

## 優先度

上記の優先度はこうなります．  
__sudo pオプション > SUDO_PROMPT > /etc/sudoers__

```
# visudo に 'Defaults passprompt="visudo:"' と記述しているものとします．

sudo su
> visudo:

SUDO_PROMPT="env:" sudo su
> env:

SUDO_PROMPT="env:" sudo -p "option:" su
> option:

export SUDO_PROMPT="env:"
sudo su
> env:

sudo -p "option:" su
> option:
```
Rでrepeated permutation

基本的にはexpand.gridを使えば良い。

```r
expand.grid(rep(list(c('A','C','G','T')),2))
```

```
   Var1 Var2
1     A    A
2     C    A
3     G    A
4     T    A
5     A    C
6     C    C
7     G    C
8     T    C
9     A    G
10    C    G
11    G    G
12    T    G
13    A    T
14    C    T
15    G    T
16    T    T
```

「The first factors vary fastest」の挙動に不都合があるなら、こうすれば良い。

```r
as.data.frame(t(apply(expand.grid(rep(list(c('A','C','G','T')),2)),1,rev)))
```

```
   Var2 Var1
1     A    A
2     A    C
3     A    G
4     A    T
5     C    A
6     C    C
7     C    G
8     C    T
9     G    A
10    G    C
11    G    G
12    G    T
13    T    A
14    T    C
15    T    G
16    T    T
```

```r
do.call(paste,c(as.data.frame(t(apply(expand.grid(rep(list(c('A','C','G','T')),2)),1,rev))),sep=''))
```

```
 [1] "AA" "AC" "AG" "AT" "CA" "CC" "CG" "CT" "GA" "GC" "GG" "GT" "TA" "TC" "TG"
[16] "TT"
```

…よりよい方法をご存じの方がいらっしゃいましたらコメントいただけるとありがたいです。
２段階SSH接続を，ProxyCommandを使って一度のsshコマンドで接続する

以下のような構成を考える．Localは手元のサーバ，Server1は踏み台用サーバ，Server2がターゲットとなるサーバです．
![2step_ssh_image](http://f.cl.ly/items/3g0m2R2L3c341L462f2b/2ssh.png)
通常，何も設定していない場合は，LocalからServer1にssh接続し，Server1からServer2にssh接続します．

```Bash
Local$ ssh account1@Server1
Server1$ ssh account2@Server2
```
あるいは

```Local
ssh -t account1@Server1 "ssh account2@Server2"
```
今回は，LocalからServer1には公開鍵認証方式を使って接続し，LocalからServer2へ一発のコマンドで接続する事を考える．
（Server1からServer2への接続は常にパスワードの入力を要求するように残しておくため，Server1からServer2への接続には公開鍵認証方式を用いなかった）

##LocalからServer1に公開鍵認証で接続する
1.まず，Server1へ接続する

```Local
ssh account1@Server1
```
sshの設定で鍵の利用ができるかは「/etc/sssshd_config 」か，「/etc/ssh/sshd_config」で確認できると思う．

2.「.ssh」ディレクトリへ移動し，RSAで暗号化された鍵を生成する

```Server1
cd .ssh
ssh-keygen -t rsa
```

パスフレーズを入力してできる「id_rsaが秘密鍵」「id_rsa.pubが公開鍵」です．

3.公開鍵をauthrized_keysとして保存し，古い公開鍵は削除する

```Server1
cat ~/.ssh/id_rsa.pub > ~/.ssh/authorized_keys
rm id_rsa.pub
```

4.パーミッションを変更し，ログアウトする

```Server1
chmod 600 ~/.ssh/authorized_keys
logout
```

5.Localの「.ssh」ディレクトリへ移動し，秘密鍵をローカルへ保存する（本当はネットワーク越しに送るべきではないですが・・・）

```Local
cd .ssh
scp account1@Server1:~/.ssh/id_rsa ~/.ssh/server1_rsaKey
```

接続できるか確認

```Local
ssh -i server1_rsaKey account1@Server1
```

##ProxyCommandを使って，LocalからServer2までssh接続する

ProxyCommandは，sshクライアントと標準入出力でやりとりしてくれるみたい．詳しくは「[多段 ssh / rsync するために ProxyCommand を使ってみる　- daily dayflower](http://d.hatena.ne.jp/dayflower/20080204/1202457379)」あたりを参照．

1.「.ssh/config」に，ssh接続ごとに，接続に関する情報を以下のように書き込む

```.ssh/config
Host S1
 HostName Server1
 User account1
 IdentityFile ~/.ssh/server1_rsaKey
Host S2
 HostName Server2
 User account2
 ProxyCommand ssh S1 nc %h %p
```

2. 以上より，LocalからServer2へssh接続するには，以下のコマンドでできるようになる．

```Local
ssh S2
```

LocalからS1（Server1）へは，公開鍵認証で接続しているのでパスフレーズを覚えてなくてもバックグラウンドで接続し，S2（Server2）への接続を試みてくれる．

これで，ssh接続を利用するscp等も，以下のように省略して利用できる

```Local
scp -r S2:/path/to/data /local/path/downloadData
```

ただ，以下のように書いたrsyncはなぜか利用できなかった

```Local
rsync -rav --exclude '/path/to/data/tmp/' S2:/path/to/data /local/path/downloadData
```
CentOS6.4サーバにNetatalk3.0.6をインスコしTime Machineの保存先にする手順


NetatalkとはMac向けのファイルサーバソフトウェア。これを自鯖のCentOSに入れて、Timemachineのディスクとして使います。Timemachineも公式にサポートしているのがイカス。

yumで入れるとバージョン2系が入りますが、いま最新の3系と設定ファイルが全然違うので、yumなしでいれます。

/mnt/Timemachine_backupという外付けのディスクを保存先にすることにします。USB2.0だし速度遅そうだけど、128GBMBAのバックアップなのでまあよいでしょう。

外付けのディスクのフォーマット等の情報はこちらをもとに行った。
http://www.ikuwow.com/blog/?p=192

## 何はともあれインストール

rpmでインストールします（ソース落としてきてconfigure & makeはmake時のエラーで躓いたので）。本当は現時点だと最新版が3.1.0だけど、rpmがあったのが3.0.6なのでこれで。

こちらに従うと全て間に合うと思います。
http://netatalk.sourceforge.net/wiki/index.php/Netatalk_3.0.6_SRPMs_for_Fedora/Scientific_Linux/CentOS

依存性のエラーなんかはその場で出てくるから非常に楽。

## 設定ファイルをいじります

設定ファイルは、version 3から/etc/afp.confに全てまとまりました。

いろんなところを参考にしました。
http://qiita.com/soramugi/items/cce8bb19aaa5604e0607
http://notes.vanu.jp/post/32196965319/netatalk3
http://hnakamur.blogspot.jp/2011/11/scientific-linux-61netatalk-221liontime.html
https://gist.github.com/oscarcck/3135109

公式ドキュメントはこちら。
http://netatalk.sourceforge.net/3.0/htmldocs/configuration.html

以下は設定例。ほとんど最低限。



```Bash:/etc/afp.conf
;
; Netatalk 3.x configuration file
;

[Global]
log level = defalut:warn
log file = /var/log/netatalk.log
uam list = uams_clrtxt.so uams_dhx.so uams_dhx2.so uams_guest.so

[Homes]
basedir regex = /home

[Time Machine]
path = /home/degawa/hogehoge
time machine = yes 
```

[Global]：全体の設定
uam listはUser Authentication Moduleの略。それぞれの役割は[公式ドキュメント](http://netatalk.sourceforge.net/3.0/htmldocs/configuration.html)を見てください。例えば、uams_guest.soを入れるとguestログインを許可する、など。

[Homes]
各ユーザのホームディレクトリのある場所を指定する。例えば上のように書くと/home/user1や/home/user2などにそれぞれのユーザのパスワードを使ってアクセスできる。

[それ以下]
ホームディレクトリ以外の共有フォルダ。このディレクティブ名がそのまま共有フォルダ名になります。公開するパスを指定。フォルダ一つにつき１つのディレクティブを作る。どのユーザでもアクセス可能。

##設定が終わったら起動##

ポートを空けます。netatalkは548（tcp,udp）、5353はmDNSというやつ（よくわからないが必要）。

```Bash:/etc/sysconfig/iptables
（中略）
 20 -A INPUT -m state --state NEW -m tcp -p tcp --dport 548 -j ACCEPT
 21 -A INPUT -m state --state NEW -m udp -p udp --dport 548 -j ACCEPT
 22 -A INPUT -m state --state NEW -m udp -p udp --dport 5353 -j ACCEPT
（中略）
```

終わったら、起動しましょう。

```Bash:
# service iptables restart
# service avahi-daemon start
# service avahi-dnsconfd start
# service netatalk start
```

Macから確認して、Finderのサイドバーか⌘+Kで接続ができたらオッケイ。

```
# chkconfig avahi-daemon on
# chkconfig avahi-dnsconfd on
# chkconfig netatalk on
```

快適なTime Machineライフを。なにか説明不足なことがあったら随時追加していきたい所存。
【意見求む】Vagrantで共有ディレクトリ以下をドキュメントルートにすべきでないか？

Vagrantでは、/vagrant/が共有ディレクトリとしてマウントされますが、
/vagrant/以下を*apacheのドキュメントルートに設置すべきではない*でしょうか？

パーミッションをVagrantfileで固定させないといけなかったり、
静的コンテンツが正しくロードされなかったり・・・。

Macで、Vagrantで、Sublime Textでちょこちょこしたいと思っていたら、
どんな形がベストですか？

皆さんの開発環境について教えて下さい！！！
VagrantでAngularJSを使ったhtml（静的コンテンツ）がうまく動かなかった対処法

AngularJSの学習をしようと、Vagrantの開発環境にhtml作って試そうとしたところ、
修正して、リロードすると正しく読み込まれず、ソースが途中で切れるような現象が発生しました。

#なかなか原因が特定できず・・・
最初はAngularJSが悪いかと思ったら、そうでもないようで、
ブラウザかと思ったら、どのブラウザでもダメ。
ってことはapacheかと思い、だいぶ設定を見直しましたがなかなかわからず、
だいぶ時間を使ってしまいました。

#何が問題だったか?

**Vagrantの共有ディレクトリにドキュメントルートを設置していたから。**

ネットワークマウントされたドキュメントルートでは静的コンテンツが正しくロード出来ないことがあるようです。そのためには、下記をhttpd.confに書いてあげる必要がありました。

```
EnableMMAP Off
EnableSendfile Off
```
どなたかの役に立ったら幸いです。。。

#共有ディレクトリにDocumentRootは置くべきではない？
とりあえず動くようになったけど、共有ディレクトリはDocumentRootにすると、パーミッションとか、色々問題多いからやめた方がよさそうですかね？

vagrantでは皆さんはどうしてますか？


こちら参考にさせて頂きました。
[Vagrantの共有フォルダをDocumentRootに設定した場合にファイルの変更が反映されない](http://www.trapon.jp/log/201310/donot_read_file_use_vagrant_shared_folder.html)
[VM の共有フォルダ内の 静的ファイルが正しくロードできないときの対処方法](http://1000g.5qk.jp/2013/03/20/vm-%E3%81%AE%E5%85%B1%E6%9C%89%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E5%86%85%E3%81%AE-%E9%9D%99%E7%9A%84%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%8C%E6%AD%A3%E3%81%97%E3%81%8F%E3%83%AD%E3%83%BC/)
Kibana3をSSHポートフォワードでセキュアに使う

# はじめに

Kibana2はRailsアプリだったらしいんですが、[Kibana3](http://www.elasticsearch.org/overview/kibana/)は完全にクライアントJavaScriptのみのアプリ（ちなみにAngularJS）になって、Elasticsearchにはブラウザから直接アクセスします。
でも、Elasticsearchにブラウザから直接アクセスできるようにするのって怖いじゃないですか。

どうするのかなというと公式READMEに以下のように書いてある。

> Q: How do I secure this? I don't want to leave 9200 open.
> A: A simple nginx virtual host and proxy configuration can be found in the sample/nginx.conf

で、そのファイルが[kibana/sample/nginx.conf at master · elasticsearch/kibana](https://github.com/elasticsearch/kibana/blob/master/sample/nginx.conf)です。
要は参照系はだだ漏れで、Kibanaの情報を保存する口だけBasic認証かけるってことなんですけど、参照系だだ漏れって危ないじゃないですか。

というわけでどうしようかなと思ったんですが、基本的に管理用に見るだけなので、SSHポートフォワードでいいかなと設定したので手順をメモしておきます。

なお、Kibana3のセットアップは以下の記事が参考になります。

- [Kibana3 + elasticsearch + fluentd を試した - jedipunkz' blog ](http://jedipunkz.github.io/blog/2013/09/08/kibana3-plus-elasticsearch-plus-fluentd/)

# 前提

- Elasticsearch稼働中
- Kibana3がnginxで稼働中
 - Kibana3は/usr/share/nginx/www/kibana3に配置
- 9200ポートはファイアウォールで塞いで、80と22だけ開けます。

# 手順

## Kibanaの設定を変更

config.jsを修正し、ElasticsearchのURLをlocalhost:9200にします。

```
$ sudo vim /usr/share/nginx/www/kibana3/config.js
...(中略)...
elasticsearch:    "http://localhost:9200",
...(中略)...
```

## ローカルからSSHポートフォワードの設定をする

localhost:9200をElasticsearchのサーバーの9200ポートに転送します。

```
local~$ ssh -i <pemファイル> -C -N -f -L 9200:localhost:9200 <ユーザ>@<Elasticsearchのホスト>
```

## ローカルからブラウザでアクセス

```
http://<Elasticsearchのホスト>/kibana3
```

# 終わりに

ちょっと面倒だけど、まあこれでいいかなあと思ってるのですが、どうでしょうか。
みなさんどうしてるのか知りたいです。他にいい方法あれば教えて下さい。
Mavericks で Homebrew の mplayer をインストールしようとしてエラーになる場合の解決法

**以下は 11/9 時点の古い内容。 11/12 の homebrew の更新で、インストールの問題は解決されたようです。**

```shell-session
$ brew install mplayer
Warning: It appears you have MacPorts or Fink installed.
Software installed with other package managers causes known problems for
Homebrew. If a formula fails to build, uninstall MacPorts/Fink and try again.
==> Downloading http://www.mplayerhq.hu/MPlayer/releases/MPlayer-1.1.tar.xz
Already downloaded: /Library/Caches/Homebrew/mplayer-1.1.tar.xz
==> ./configure --prefix=/usr/local/Cellar/mplayer/1.1 --cc=clang --host-cc=clan
==> make
                glBegin(GL_LINES);
                        ^
9 errors generated.
make: *** [libvo/vo_corevideo.o] Error 1
make: *** Waiting for unfinished jobs....

READ THIS: https://github.com/mxcl/homebrew/wiki/troubleshooting

These open issues may also help:
    https://github.com/mxcl/homebrew/pull/23809
    https://github.com/mxcl/homebrew/issues/23503
```

こんなエラーが出た。最後に関係ありそうな pull request と issue のリンクが表示されていて親切。

で、色々試した結果、これだけでいいみたい。

```shell-session
$ wget -O /usr/local/Library/Formula/mplayer.rb https://raw.github.com/i8degrees/homebrew/d5687ef38dfe5bcaabf181d6bc8eedfbe85b3be1/Library/Formula/mplayer.rb
$ brew install mplayer
```

参考URL

- [mplayer 1.1 by i8degrees · Pull Request #23809 · mxcl/homebrew](https://github.com/mxcl/homebrew/pull/23809)
- [Homebrew で Formula を書き換えて patch を当てる方法](http://mugijiru.seesaa.net/article/245119960.html)
- [debugging a formula and fixing compile errors?](http://librelist.com/browser//homebrew/2013/3/2/debugging-a-formula-and-fixing-compile-errors/)
- [Bug 2156 - Build of MPlayer fails under OS X Mavericks (10.9) ](http://bugzilla.mplayerhq.hu/show_bug.cgi?id=2156)
HaskellでFizzBuzz

Haskellを勉強中で無性に、腐るほどあるFizzBuzz(関数)が書きたくなった。

```hs
fizzbuzz :: Integer -> [String] 
fizzbuzz 0 = []
fizzbuzz n
    | n `mod` 15 == 0 = fizzbuzz(n - 1) ++ ["fizzbuzz"]
    | n `mod` 3 == 0 = fizzbuzz(n - 1) ++ ["fizz"]
    | n `mod` 5 == 0 = fizzbuzz(n - 1) ++ ["buzz"]
fizzbuzz n = fizzbuzz(n - 1) ++ [show n]
```

##間違っているかもしれない解説

```hs
fizzbuzz :: Integer -> [String] 
```
はfizzbuzz関数の型宣言。これは`Integer`型を引数にして`String`の配列を返すという意味。これは書かなくても推論してくれるらしいがすごいH本によると書いたほうがいいらしい。

```hs
fizzbuzz 0 = []
```
は`fizzbuzz 0`が来たら、

```hs
fizzbuzz n
    | n `mod` 15 == 0 = fizzbuzz(n - 1) ++ ["fizzbuzz"]
    | n `mod` 3 == 0 = fizzbuzz(n - 1) ++ ["fizz"]
    | n `mod` 5 == 0 = fizzbuzz(n - 1) ++ ["buzz"]
```
は15か3か5で割れるかのガードで

```hs
fizzbuzz n = fizzbuzz(n - 1) ++ [show n]
```
はこぼれたやつ。

この関数は再帰的に呼ばれるので、例えば`fizzbuzz 3`とすると、
`fizzbuzz 3` -> `fizzbuzz(2) ++ ["fizz"]` -> `fizzbuzz(1) ++ ["2", "fizz"]` -> `fizzbuzz(0) ++ ["1", "2", "fizz"]`->`["1", "2", "fizz"]`
となる(はず)。

呼ばれる順に詳しく見ていく

```hs
fizzbuzz n
    | n `mod` 15 == 0 = fizzbuzz(n - 1) ++ ["fizzbuzz"]
    | n `mod` 3 == 0 = fizzbuzz(n - 1) ++ ["fizz"]
    | n `mod` 5 == 0 = fizzbuzz(n - 1) ++ ["buzz"]
```
はガードと呼ばれるもので、nがなんの倍数か判定している。それがわかったら`fizzbuzz(n -1)`と対応する文字列をくっつけて返す。`"fizzbuzz" : fizzbuzz(n - 1)`としたくなるが(自分だけ？)、これだと結果が逆になってしまう。

```hs
fizzbuzz n = fizzbuzz(n - 1) ++ [show n]
```
は上のガードからこぼれたら来るもので、こちらは`show n`で`Integer -> String`している。

```hs
fizzbuzz 0 = []
```
は最後なので空の配列を返して終了

##fizzbuzz 100

```hs
*Main> fizzbuzz 100
["1","2","fizz","4","buzz","fizz","7","8","fizz","buzz","11","fizz","13","14","fizzbuzz","16","17","fizz","19","buzz","fizz","22","23","fizz","buzz","26","fizz","28","29","fizzbuzz","31","32","fizz","34","buzz","fizz","37","38","fizz","buzz","41","fizz","43","44","fizzbuzz","46","47","fizz","49","buzz","fizz","52","53","fizz","buzz","56","fizz","58","59","fizzbuzz","61","62","fizz","64","buzz","fizz","67","68","fizz","buzz","71","fizz","73","74","fizzbuzz","76","77","fizz","79","buzz","fizz","82","83","fizz","buzz","86","fizz","88","89","fizzbuzz","91","92","fizz","94","buzz","fizz","97","98","fizz","buzz"]
```
cocos2d-xでの.gitignore


iOS/Andoridの時、こんな感じかな。

Androidのbuild_native.shでいっぱい、objファイルに入るから除外しておいた方がいいと思う。

```
# Mac
.DS_Store

# Xcode
build/*
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
*.xcworkspace
!default.xcworkspace
xcuserdata
profile
*.moved-aside

#CocoaPod
Pods/*

#IDEA
.idea/*

#cocos2d-x
libs/
bin/
obj/
assets/
gen/
out/
.classpath
.project
.cproject

#JAVA
*.class
```

### 参考

- https://github.com/NSCoderTO/learning-cocos2dx/blob/master/.gitignore
- https://github.com/cocos2d/cocos2d-x-extensions/blob/master/.gitignore


おすすめがあれば教えて下さい！
1つのプロジェクトで複数のGruntfileを使用してnode_modulesを使い回すときの設定

本来だったら、プロジェクトの依存ファイルをnpmで管理するという性質上、ひとつのpackage.jsonに対してひとつのGruntfileが対応している状態がベストだと思うけど、何らかの事情で、、、とくにWebサイト運用のような何らかの事情が起きがちな状況で、やむを得ず複数のGruntfileを使用するときの設定メモ。

例として以下のようなディレクトリ構成を想定

```bash
.
├── Gruntfile.js
├── build
│   └── main.js
├── js
│   ├── bar.js
│   ├── foo.js
│   └── hoge.js
├── node_modules
│   ├── grunt
│   └── grunt-contrib-concat
├── package.json
├── project.json
└── hoge
    ├── Gruntfile.js
    ├── js
    │   ├── some-module-1.js
    │   ├── some-module-2.js
    │   └── some-module-3.js
    └── project.json
```

ひとつ下の階層ではファイルを結合処理を行う。

```js:hoge/Gruntfile.js
concat : {
    develop : {
        src: [
            'js/some-module-1.js',
            'js/some-module-2.js',
            'js/some-module-3.js'
        ],
        dest : 'build/main.js'
    }
}
```

## ディレクトリ検索は行われない

grunt.loadNpmTasksはrequire関数で読み込むときに行われるような上位ディレクトリのnode_modulesディレクトリの検索が行われないので、普通にGruntfileを別階層に置いた場合、モジュールが見つからなくてエラーになる。

```bash
>> Local Npm module "grunt-contrib-concat" not found. Is it installed?
```

## grunt.file.setBaseを使う

grunt.file.setBaseを使うとベースとなるディレクトリが指定できる。これをpackage.jsonのあるディレクトリ(node_modulesがインストールされているディレクトリ)に指定する。

```js:hoge/Gruntfile.js
grunt.file.setBase('../');
```

ベース・ディレクトリがひとつ上の階層に設定されたのでモジュールが見つかりエラーが解消される。
ただし、上記のconcatの設定だと上位ディレクトリのjsディレクトリ内のJSファイルを探しにいくので、見つからずに空のファイルが出力されてしまう。

## 絶対パスで指定する

concatに指定するjsのファイルのパスを、上位ディレクトリからの相対パスで記述することで解消することもできるが、わかりずらいので、絶対パスで指定することでちゃんと見つかるように変更する。

```js:hoge/Gruntfile.js
var path = require('path');
var current = path.resolve('.');

module.exports = function(grunt) { 
    var Config = grunt.file.readJSON(current + '/project.json');
    
    grunt.initConfig({
        concat : {
            develop : {
                src: [
                    current + '/js/some-module-1.js',
                    current + '/js/some-module-2.js',
                    current + '/js/some-module-3.js'
                ],

                dest : current + '/build/main.js'
            },
        }
    });
    
    grunt.file.setBase('../');
    
    grunt.loadNpmTasks('grunt-contrib-concat');  
    grunt.registerTask("default",["concat"]);
};
```

ソースの可読性はよくないけど、正常に動作する。

package.jsonが使えないので、それぞれのGruntfileに紐ずく何らかの情報をもたす場合は別のファイルに記述する。上記の例でいうと、project.jsonというものを用意してそこに情報を置いている。

ベースディレクトリへのパス情報を外部化する場合。

```js:hoge/project.json
{
  "base" : "../"
}
```

```js:hoge/Gruntfile.js
grunt.file.setBase(Config.base);
```

若干、気持ち悪いけど、やむを得ず。

## 実際は

gruntのバージョンがv0.4にあがったタイミングで、grunt自身もプロジェクト単位でパッケージ管理されるようになったことから、node_modulesを使い回すような微妙なことはあえて使用できないように変更されたのかと思うので、できるだけ使い回しはやめた方がいいかと思う。

ほんとにやむを得ずな時だけにする。

おしまい。
Javaで選択ソート

今回は選択ソートです。

名前の通り、選択した値とその他の値全てと比較し、ソートしていく方法です。

#解法

* 配列 6 4 5 3 1 2

並び替えの順序は

* まず先頭の数値 6 のarray[0] を keyIndex として保持する

* array[key] > 4で4の方が小さいので、4のarray[1]のindex番号をkeyIndexとして保持する

* array[key] > 4で4の方が小さいので、4のarray[1]をindex番号keyIndexとして保持する

* array[key] > 5で5の方が大きいので何もしない

* array[key] > 3で3の方が小さいので、3のarray[3]をindex番号keyIndexとして保持する

* array[key] > 1で1の方が小さいので、1のarray[4]をindex番号keyIndexとして保持する

* array[key] > 2で2の方が大きいので何もしない

* 比較が終わったので、array[keyIndex]とarray[0]の値を入れ替える

* __6__ 4 5 3 **1** 2 -> **1** 4 5 3 **6** 2 の状態になります。

* array[1]をkeyIndexとして保持します。
・・・省略

#選択ソート

```java
package aoj.sort;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class SelectionSort {
	public static void main(String args[]) throws IOException {
		// aojの問題を解く際の入力の受付なので無視して下さい。
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int elementNum = Integer.parseInt(br.readLine());
		String line = br.readLine();
		int[] numArray = parseInt(getSplitLine(line));

		// ここから選択ソート
		int count = 0;
		for (int i = 0; i < numArray.length - 1; i++) {
			// 比較元の配列番号をセットする
			int keyIndex = i;
			// 最小値を探索する
			// keyIndexで指定された最小値と配列に含まれる数値全てを比較し、
			// 最小値が見つかれば、keyIndexへ最小値をセットする
			for (int j = i + 1; j < numArray.length; j++) {
				if (numArray[keyIndex] > numArray[j]) {
					// 最少値 numArray[keyIndex] と numArray[j]を比較し、numArray[j]の方が小さければ、
					// 最少値として設定する
					keyIndex = j;
				}
			}
			// 最小値が入れ替わっていなければ数値の入れ替えをスキップ
			if (i == keyIndex) {
				continue;
			}
			//
			int temp = numArray[i];
			numArray[i] = numArray[keyIndex];
			numArray[keyIndex] = temp;
			count++;
		}

		System.out.println(Arrays.toString(numArray)
				.replaceAll("[\\[\\],]", ""));
		System.out.println(count);
	}

	private static String[] getSplitLine(String line) {
		return line.split("\\s");
	}

	private static int[] parseInt(String[] line) {
		int[] numArray = new int[line.length];
		for (int i = 0; i < line.length; i++) {
			numArray[i] = Integer.parseInt(line[i]);
		}
		return numArray;
	}
}

```
vagrant upで"Could not rename the directory"なんて言われたとき

Windowsで環境構築してたら発生した問題。Macは試してない。

```
Stderr: VBoxManage.exe: error: Could not rename the directory 'C:\Users\XXXXXX\V
irtualBox VMs\xxxxxxto 'C:\Users\XXXXXX\VirtualBox VMs\xxxxxx_default_13839930
77' to save the settings file (VERR_SHARING_VIOLATION)
VBoxManage.exe: error: Details: code E_FAIL (0x80004005), component SessionMachi
ne, interface IMachine, callee IUnknown
VBoxManage.exe: error: Context: "SaveSettings()" at line 2711 of file VBoxManage
ModifyVM.cpp
```

`vagrant`コマンドで作業するのを`~/Virtual\ Box`以外でやる。

```bash
cd ~
mkdir myVM
cd myVM
vagrant initi xxxxxx
vagrant up
```

あるいは、VirtualBoxの方の設定を変えても良いみたい。

* ファイル＞環境設定＞一般＞デフォルトの仮想マシンフォルダー
最速ではてなフォトライフ・ビューワを作る!


最近画像ビューワを作ることにハマってまして、iPhoneアプリではてなフォトライフを使ったものがあまり無いことに気づき、サンプルを作成してみました。

![screenshot1.png](https://qiita-image-store.s3.amazonaws.com/0/30826/ac656df2-d584-c1b8-7b02-99bd30339fc5.png "screenshot1.png")


人気写真、新着写真はRSSで公開されているので認証とかせず、すぐ試せます。

・人気写真
http://f.hatena.ne.jp/hotfoto?mode=rss

・新着写真
http://f.hatena.ne.jp/userlist?mode=rss

RSSですのでXMLの読み込みにはKissXMLを使用しました。
下記から落とせます。
https://github.com/robbiehanson/KissXML

HTTP通信にはGTMHttpFetcherを使ってみました。
下記からSVNでソースコードをチェックアウトしてください。
http://code.google.com/p/gtm-http-fetcher/

ではそのKissXMLとGtmHttpFetcherを使って人気写真を取得します。
取得したRSSの結果を使いやすいようにNSDictionaryに変換するまでが基本的な流れとなります。

ではまず最初にASPhotoListFetcherクラス(名前は別に何でもいいです)を作成してその何に下記メソッドを追加します。

```objc
- (void)beginFetchPopularPhotoList:(void (^)(NSDictionary *result, NSError *error)) completionHandler {
    
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:
                                    [NSURL URLWithString:@"http://f.hatena.ne.jp/hotfoto?mode=rss"]
                                                           cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60];
    
    // この設定が無いとProxyサーバのキャッシュの結果が返ってくるみたい・・・
    [request addValue:@"no-cache" forHTTPHeaderField:@"Cache-Control"];
    
    GTMHTTPFetcher* fetcher = [GTMHTTPFetcher fetcherWithRequest:request];
    
    [fetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) {
        
        NSDictionary *xml = nil;
        if (!error) {
            DDXMLDocument *doc = [[DDXMLDocument alloc] initWithData:data options:0 error:&error];
            
            if (!error) {
                xml = [doc.rootElement convertDictionary];
                
            } else {
                NSLog(@"%@ %@", [error localizedDescription], [error userInfo]);
            }
        }
        
        if (completionHandler) {
            completionHandler(xml, error);
        }
    }];
}
```

上記で人気写真のRSS取得結果をconvertDictionary メソッドを使ってNSDictionaryに変換してます。

XMLの結果を解析してNSDictionaryに変換するのは下記を参考にしました。
http://dev.classmethod.jp/smartphone/iphone/ios-xml-parse-2/
勝手に使っていいということなので、ありがたく使わせてもらってます！

呼び出し元はこんな感じになります。

```objc
- (void)requestPhotoList
{
    __weak ASPopularListViewController *weakSelf = self;
    
    ASPhotoListFetcher *fetcher = [[ASPhotoListFetcher alloc] init];
    [fetcher beginFetchPopularPhotoList:^(NSDictionary *result, NSError *error) {
        if (!error) {
            // 取得結果を配列に格納します
            NSArray *photos = result[@"rdf:RDF"][@"item"];
            NSLog(@"photos: %@", photos);
            // 取得結果をゴニョゴニョしてください・・・
        }
    }];
}
```

取得した結果からほしい項目は下記のようにして取り出せます。

```objc
// 写真タイトル
NSString *title = photos[@"title"];
// 投稿日付
NSString *date = photos[@"dc:date"]];
// 画像URL
NSString *imageUrl = photos[@"hatena:imageurl"];
// 小さい画像URL
NSString *smallImageUrl = photos[@"hatena:imageurlsmal"];
// 中くらいの画像URL
NSString *mediumImageUrl = photos[@"hatena:imageurlmedium"];
```
必要な最低限をことしか書いてないですが、ソースコードアップしたので詳細はそちらを見てください。

https://github.com/asakahara/ASHatenaPhotoClient

サンプルの中ではIDMPhotoBrowserというとても便利なフォトビューワを使ってます。
こちらから落とせます。
https://github.com/ideaismobile/IDMPhotoBrowser

こうやって自分で作ったビューワで画像眺めるのも中々よいです。
Composer


@shin1x1

関西PHP勉強会からComposer

前半は新原さん、後半は原田さん

宣伝

Twitter: #phpkansai @kphpug
Facebook: 「Kansai PHP Users Group」

## Composer 再入門

Composer は前からある（Symfonyとか…）

Today List

1. What is Composer
2. How do use ?
3. Tips


## WHat is COmpoer

- 依存管理ツール
- PHP アプリのパッケージ依存を管理
- Node npm/ Ruby Bundler / Python Pip
- PHP 5.3.2 > (CentOS/RPM は5.3.3) 最新の一部機能で5.3.4でしか動かない？

### ライブラリ依存を解消

Aライブラリ自身が他のBライブラリを使用し、BがCに…と芋づるなので、Composer が面倒を見る

- composer.json に依存を記述
- コマンドをインストール
- 後は実行

## 使い方

1. composer install
2. 依存を composer.json
3. composer.phar install

```composer.json
	"require": {
		"zendframework/zend-db": "2.0.*"
	}
```

コマンド

```shell
$ composer.phar install
...
$ l
- composer.json
- composer.lock
- composer.phar
- vendor/
   +- autoload.php
   +- composer/..
   +- zendframework/...
```

#### composer.lock

実際にダウンロードされたバージョンが記述されている。

#### autoloader

`autoload.php` を読み込めば、勝手に、パッケージのphpファイルを読み込む。

## Tips

### Git

GIt で管理した方がいいもの

- composer.json
- composer.lock

Git には入れないもの（再取得できるので）

- composer.phar
- vendor/*

### バージョンの更新

1. `composer.phar update` でライブラリのアップデート
2. composer.lock は更新されるので、git でコミットしてアップデート

### 依存

`composer.phar require <パッケージ名> <バージョン名>` で composer.json が作成される

### -v -vv -vvv

`./composer.phar install -vvv` を付けると、通信ログが見れる。

ヨーロッパとか見に行くので割と遅い。（カナダ経由はよ案件）

### パッケージ検索/表示

`./composer.phar search <keyword>`
`./composer.phar show <パッケージ>`
`open http://packagist.org/`

### スケルトンプロジェクト

`./composer.phar createproject symfony/frame.. symfony 2.3.0`

とかとか…

これを使えば、全部面倒を見てくれる。

### Composer Proxy JP

http://composer-proxy.jp/

## 公式

http://getcomposer.org/

# Packagist

原田さん @slywalker

TwitterBootstrap に対応したプラグイン BoostCake 作った。composer でインストールできるよー。

今自由の身なので、お仕事あればコソコソと…

## Packagist

kof-sample-number を登録してみよう。（簡単な素数判定とか）

- PSR-0 にそった namespace を付けた(vendorname\namespace\namespace\classname)

最近はテストをちゃんと書きましょう。

```composer.json
{
	"name": "kof-sample/number",
	"require": {
		"php": ">=5.4"
	},
	"autoload": {
		"psr-0": {
			"Kof": "src/"
		}
	}
}
```

あると喜ばれる

typeやらauthorやらlicenseやら何やらうんやら…


## Packagist

Githubにgit push したら、packagist に自動更新されるようにするには、APITokenを取ってきて、GithubのService hookにあるPackagistを選んでTokenを入力し、Active を選んでおｋ．

## おまけ

OSS用のTravis-CI

継続的インテグレーションのサイト。git push するたびにテストしてくれる。

```.travis.yml
language: php
php:
	- 5.3
	- 5.4
	- 5.5
script:
	...path..to.script...
```

GithubのServiceHookのTravis-CIをアクティブにするだけで、自動的にやってくれる。

もう登録済みなので、packagist で kof で探せば出てくるよーっと。

## オススメパッケージ

- endroid/qrcode: QRCode 生成
- inlinestyle/inlinestyle: CSS をHTMLのインラインスタイルに適用する。ガラゲー対応するため。あとHTMLメールのOutlook対応とか
- keboola/csv: CSVファイルの読み込み、書き込み
- tedivm/fetch: imap/pop3 を操作する。メールの分解もやってくれる
- chronon/mobile_detect: デバイス判定のライブラリ。かなり細かくやってくれる
- opauth/opauth: OAuth実装する時に使う。各フレームワークにも対応している

まだ沢山ある。まず検索…英語…うへあ…

選ぶ基準

1. ダウンロード数
2. Travice-CI導入している？(Github のREADME にタグが入ってる）
3. ドキュメントが充実している
4. 中のコードを読んでみることも大事
Rで正規表現に検索ワードと置換ワードをベクトルで指定する


ベクトルそのものを使っているわけじゃないけど．．．

```
> library(gsubfn)
 要求されたパッケージ proto をロード中です 
 要求されたパッケージ tcltk をロード中です 

> # 検索ワードとその置き換えワードをベクトルとして指定する

> x1 <- c("宮内れんげ", "一条蛍", "越谷小鞠", "越谷卓", "越谷夏海")
> y <- list(夏 =  "秋", 小 = "大", れん = "げん")
> gsubfn("夏|小|れん", y, x1)
[1] "宮内げんげ" "一条蛍"     "越谷大鞠"   "越谷卓"     "越谷秋海"

> x2 <- c("宮内れんげ一条蛍越谷小鞠越谷卓越谷夏海")
> gsubfn("夏|小|れん", y, x2)
[1] "宮内げんげ一条蛍越谷大鞠越谷卓越谷秋海"

> # リストからパターンを作成
> y0 <- paste(names (y), collapse = "|")
> gsubfn(y0, y, x1)
[1] "宮内げんげ" "一条蛍"     "越谷大鞠"   "越谷卓"     "越谷秋海"  
```
Ruby on Railsの導入

#Ruby on RailsをMacでインストールした時のメモ

##前提
Command Line Toolsインストール済
homebrewインストール済

##やること

* Ruby 2.0.0-p247 インストール
* Ruby on Rails 4.0 インストール
* Railsアプリケーション作成
* MySQLと接続

おまけ
* IntelliJで動かす時の注意点

##インストール

###brewの確認
お決まりだけど
`brew doctor`

#### Ruby 2.0.0-p247 インストール
rbenvとruby-buildインストール

```
brew install rbenv
brew install ruby-build
```

opensslとreadlineインストール

```
brew install openssl
brew install readline
```

bash_profile設定
`$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile`

rbenvでバージョン確認
`rbenv install -l`
2.0.0-p247があるか確認

インストール

```
CONFIGURE_OPTS="--with-openssl-dir=`brew --prefix openssl` --with-readline-dir=`brew --prefix readline`" rbenv install 2.0.0-p247
```

終わったら更新
`rbenv rehash`
`rbenv versions`
2.0.0-p247があることを確認

適用
`rbenv global 2.0.0-p247`

バージョン確認

```
ruby -v
ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-darwin13.0.0]
```

#### Ruby on Rails 4.0 インストール
インストール
`gem i rails --version 4.0.0 --no-ri --no-doc`

バージョン確認

```
rails -v
Rails 4.0.0
```

#### Railsアプリケーション作成
適当にフォルダ作ってそのあと
`rails new プロジェクト名`
これでプロジェクトのテンプレートが作られる

#### MySQLと接続
Gemfile編集
`cd プロジェクト名`
`vi Gemfile`
sqlite3けしてmysql2いれる

```
# Use sqlite3 as the database for Active Record
#gem 'sqlite3'

#Use mysql2 as the database for Active Record
gem 'mysql2'
```

database.yml編集
`cd  /config`
`vi database.yml`

sqlite用の消して以下の様にいれる

```
production:
  adapter: mysql2
  database: [database]
  pool: 5
  timeout: 5000
  username: [user]
  password: [pass]
  host: 127.0.0.1
  encoding: utf8
```

おまけ
#### IntelliJで動かす時の注意点

この流れでIntelliJで動かそうとして超ハマったのでメモ

IntelliJのrubySDKの設定

```
#Ruby interpreter path:
~/.rbenv/versions/2.0.0-p247/bin/ruby

#gem directory
~/.rbenv/versions/2.0.0-p247/bin
```
インストールしたはずのrailsを全く認識しなくておかしなことになった。
シンボリックリンク指定してたけどダメだったから直接指定してやることで解決。

ありがとう
http://d.hatena.ne.jp/ria10/20130324/1364099354
Packer + Chef で Encrypted Data Bag を使用する方法

2013/11/20 追記

Packer 0.4.0 で Encrypted Data Bag がサポートされたようです。

追記ここまで

Chef-solo で Encrypted Data Bag を使っています。
Packer でこの Chef の recipe を適用した AMI を作成しようと思ったのでやってみました。

# 環境

* Ubuntu 12.04.3 LTS
* Packer v0.3.11
* Chef 11.8
* recipe のパス: `./cookbooks`
* data_bag のパス: `./data_bags`
* Encrypted Data Bag のキーのパス:  `./data_bag_key`

# ゴール

* Packer を使って Ubutu に Chef のレシピが適用された AMI を作成すること。

# Packer 用の json ファイル

```json:packer.json
{
  "variables": {
    "aws_access_key": "",
    "aws_secret_key": ""
  },
  "builders": [{
    "type": "amazon-ebs",
    "access_key": "{{user `aws_access_key`}}",
    "secret_key": "{{user `aws_secret_key`}}",
    "region": "ap-northeast-1",
    "source_ami": "ami-c933a8c8",
    "instance_type": "t1.micro",
    "ssh_username": "ubuntu",
    "ami_name": "ubuntu-{{timestamp}}"
  }],
  "provisioners": [
    {
      "type": "file",
      "source": "data_bag_key",
      "destination": "/tmp/secret"
    },
    {
      "type": "shell",
      "inline": [
        "sudo mkdir -p /etc/chef",
        "sudo mv /tmp/secret /etc/chef/encrypted_data_bag_secret"
      ]
    },
    {
      "type": "chef-solo",
      "cookbook_paths": ["cookbooks"],
      "data_bags_path": "data_bags",
      "run_list": [
        "recipe[my_app_recipe]"
      ]
    }
  ]
}
```

/etc/chef/encrypted_data_bag_secret がデフォルトで Chef に読まれる Encypted Data Bag Key のファイルになります。

# 実行コマンド

普通に packer を実行すればいいだけです。

```Bash
$ packer build --var-file=variables.json packer.json
```

# 参考にしたもの
* [Add option to define aws availability zone · Issue #536 · mitchellh/packer](https://github.com/mitchellh/packer/issues/536)
* [About Data Bags — Chef](http://docs.opscode.com/chef/essentials_data_bags.html)
Sinatra が ''invalid byte sequence in Windows-31J" でエラーページを表示しない(@Windows)

アプリケーションのバグがあると Sinatra がエラーページを表示してくれるはずなのですが、
Windows7 上で

<pre>
 invalid byte sequence in Windows-31J
</pre>

としかブラウザに表示されずに困っていました。lib/rack/utis.rb の以下のメソッド内でエラーになっているので、エンコーディングが一致していないことは分かります。

```rb
def escape_html(string)
  string.to_s.gsub(ESCAPE_HTML_PATTERN){|c| ESCAPE_HTML[c] }
end
```

config.ru にも app.rb にも

<pre>
# coding: utf-8
</pre>

を書いていたのですが。

で、真面目に調べたところ

```ruby
> ruby -e 'puts Encoding.default_external'
Windows-31J
```

というのが問題っぽいので、ググってみたら http://d.hatena.ne.jp/yohfee/20100810/1281449589 を発見！ これに基づいて config.ru を

```ruby:config.ru
# coding: utf-8

Encoding.default_external = 'utf-8'

require File.dirname(__FILE__) + '/app.rb'
Application.run!
```

としたところ、上手くいきました。
Capybaraで:js => trueのときだけテストに失敗する場合

Capybaraでテストをしていた時にcapybara-webkit selenium-driverなどを入れて:js => trueでテストをすると失敗するということがあった。

:js => trueを外してテストすると成功するので原因を調べた。

[http://stackoverflow.com/questions/8178120/capybara-with-js-true-causes-test-to-fail](http://stackoverflow.com/questions/8178120/capybara-with-js-true-causes-test-to-fail)

transactionを忘れてた orz.

```ruby:spec/spec_helper.rb

  config.use_transactional_fixtures = false

```

このへんも参考になりそう。

[http://devblog.avdi.org/2012/08/31/configuring-database_cleaner-with-rails-rspec-capybara-and-selenium/](http://devblog.avdi.org/2012/08/31/configuring-database_cleaner-with-rails-rspec-capybara-and-selenium/)

[http://weilu.github.io/blog/2012/11/10/conditionally-switching-off-transactional-fixtures/](http://weilu.github.io/blog/2012/11/10/conditionally-switching-off-transactional-fixtures/)
Vimでpull requestの差分を見るためのunite-pull-request作った(まだ途中)

## ぼくのはじめてのゆないとそーす。

githubの特定リポジトリのpull requestを一覧してファイルのdiffを開くuniteソース
[unite-pull-request](https://github.com/joker1007/unite-pull-request "joker1007/unite-pull-request")

GitHubのpull requestっていうのは、ゴイスーにベンリですよね。
コードレビューライフが変わったり、こんなぼくでもおーぷんそーすにぱっちを送っていいんだ！って気持ちになる。

でも、diffは若干見辛いと思うこともある。
WebページUIの限界みたいなのがあると思うけども。
やっぱり手元のVimで見れた方が見易い。vimdiff結構好きだし。

というわけで、作ってみたのが[unite-pull-request](https://github.com/joker1007/unite-pull-request "joker1007/unite-pull-request")。

既に誰か作ってるのでは？感が凄いあったのだが、unite-pull-requestとunite-pullrequestは検索しても何も出なかったので、多分無いと思う。

とりあえずある程度使える所まで持っていくのを第一にしていたので、まだ今の所見る専用。
rawデータの取得にめちゃめちゃハマってしまって、何故かプライベートリポジトリのデータが取れなくて泣きそうになった。
なんだよ406 Not Acceptableって。情報が何もねえよ…。Acceptヘッダ弄っても効かねえし…。
色々試行錯誤した結果、x-oauth-basic認証とraw.github.comのURLなら何故か取得できることを発見したので、そちら側に取得方法を揃えたが、そもそもこれは取得方法として正しいのだろうか。

## 現在の機能
- 特定のリポジトリのpull requestを一覧する
- pull requestを選択すると、そのpull requestに含まれる変更されたファイルの一覧が出る
- ファイルの一覧は、バイナリっぽい拡張子をフィルターできる
- ファイルの追加、変更、削除に合わせて色を変える
- 変更ファイルを選択すると、baseとheadのファイルを取得してdiffを表示する
- pull requestを選択した状態で、actionメニューからbrowseを選択すると、ブラウザでpull requestが開ける

## 近々やりたいこと

カーソル当ててる行にレビューコメントを付けるのは、やればなんとかなりそうな気はする。

問題はその他のレビューコメントの取得と表示。これはちょっと良いUIが思い付かない。
まあ、そこはブラウザで見るのでも良いか…。

後、github APIを叩くvimプラグイン二つ目なんだけど、認証の扱いがベタ書きでダサいので何とかしたい。

## スクリーンショット![スクリーンショット 2013-11-09 5.50.35.png](https://qiita-image-store.s3.amazonaws.com/0/78/a4cdd623-574f-de70-f912-de677480dd34.png)
![スクリーンショット 2013-11-09 5.51.03.png](https://qiita-image-store.s3.amazonaws.com/0/78/f65171ba-bdc8-1cda-cb80-b34a36ae8a3f.png)
![スクリーンショット 2013-11-09 5.51.22.png](https://qiita-image-store.s3.amazonaws.com/0/78/18f20f86-bb70-2fdf-673e-c809102e188e.png)
GDB: Grep De ばーっと調べる

# なにをするのか

Linux で、たくさんのコードからいろいろ検索したいときのシェルスクリプトワンライナー

# 具体例

## src ディレクトリ以下の、拡張子 .c のファイルから、iterator を含む行を探す
find で探して、grep で検索する。 -H オプションをつけるとファイル名が出てくる。

```shell-session
find src -name "*.c" -exec grep -H iterator {} \;
```

## src ディレクトリ以下の、拡張子 .c のファイルから、iterator を含む行を探す。ただし、int がある行はいらない
grep -v でいらない部分を捨てる

```shell-session
find src -name "*.c" -exec grep -H iterator {} \; | grep -v int
```

## src ディレクトリ以下の、拡張子 .c のファイルから、iterator を含む行を探す。ただし、その行の前2行と後3行もみたい。
-A で後、-B で前の行を表示する

```shell-session
find src -name "*.c" -exec grep -H -B 2 -A 3 iterator {} \;
```

## src ディレクトリ以下の、拡張子 .c のファイルから、iterator を含むファイル名だけが知りたい
ファイル名と行は : で区切られているので、冒頭だけ取ってきて重複をのぞく。

```shell-session
find src -name "*.c" -exec grep -H iterator {}  \; | cut -d":" -f 1 | sort | uniq
```
EclipseのEGitで最初のコミットを行う

EclipseのEgitでプロジェクトの最初のコミットをする方法です。
ローカルでプロジェクトを立ち上げて、リモートのリポジトリへ（GitHubやBitbucketなど）最初のコミット、プッシュをします。

（対象）
eclipseでローカルのGitリポジトリ―を作っていて、新規でリモートに上げようと思ったけど、うまくいかない方。

（概要）
既存のGitリポジトリからcloneする場合はリモートのアドレスとパスのみが必要ですが、「最初のコミット・プッシュ」においてはリモートの設定が必要です。本稿ではそのEGitのリモート設定方法のみです。

要は最初のコミットで気を付けるのは
*EGitのリモートが設定されているか。
（*SSHキーをローカルで作成してそのpublicキーをリモートサーバに登録できているか。）
だとおもいます。

（手順）
EGit設定
1.eclipseのＥＧｉｔのパースペクティブを開く。「パースペクティブボタン」＞「Git Repository Exploring」です。

2.コミットしたいプロジェクトのツリーから「Remotes」を右クリックして、「CreateRemote」をクリック。

3.Configure Pushのg面が表示されるのでそこでURI:の右側にある「Change」を押すと、設定画面が出てくる。ここにリモートの情報を打ち込めばいけるはずです。

3.「SaveandPush」で完了。

参考URI：
http://stackoverflow.com/questions/13208868/how-to-push-a-new-project-in-github-from-eclipse
Mac上のVirtualBoxにMavericksをインストールする

そろそろBoxenを試してみたいと思っていたのですが、試行錯誤できるよう何度も一からやり直せる環境がほしいと思っていました。Mac上のVirtualBoxにMavericksをインストールできないかとググってみると[OS X on OS X](http://ntk.me/2012/09/07/os-x-on-os-x/)というページを見つけました。このページの手順通り実行すればOKでした。ありがとうございます！

## Mavericksのライセンス

http://images.apple.com/legal/sla/docs/OSX109.pdf

B. Mac App Store License.のセクションに
> (iii) to install, use and run up to two (2) additional copies or instances of the Apple 
> Software within virtual operating system environments on each Mac Computer you own 
> or control that is already running the Apple Software, for purposes of: (a) software 
> development; (b) testing during software development; (c) using OS X Server; or (d) 
> personal, non-commercial use.

という項目があります。MavericksをApp Storeから入手した場合はApple Softwareを動かしているMac上の仮想環境に2つまでVMを作れるとのことです。

## Mavericksのインストーラをダウンロード

まだMavericksにアップグレードしていない場合は、App StoreでOSX Mavericksのインストーラをダウンロードだけしてインストーラが開始したら終了します。

既にMavericksにアップグレードした場合は、インストーラが削除されていますので、App StoreからOSX Mavericks 無料配信中のバナーをクリックしダウンロードボタンを押して再度ダウンロードします。

なお、私は今回試したのは後者のパターンです。

## VirtualBox用イメージを作成

```shell-session
$ git clone https://github.com/ntkme/InstallESD.dmg.tool
$ cd InstallESD.dmg.tool
$ bin/iesd -t BaseSystem -i /Applications/Install\ OS\ X\ Mavericks.app/Contents/SharedSupport/InstallESD.dmg -o Output.dmg
```

## VirtualBoxで新規VMを作成

* OSタイプ: Mac OS X
* OSバージョン: Mac OS X (64bit)
* メインメモリー: 2048MB以上で適宜設定
* 仮想ハードドライブファイルサイズ: 80GB (適宜設定)
* ネットワークアダプタタイプ: Intel PRO/1000 MT Server (82545EM)
    * デフォルトで選択されているIntel PRO/1000 T Server (82453GC)だとうまく動かないそうです。
* CD/DVDドライブイメージ: 上で作成したOutput.dmgを選択

## インストーラを実行

### まずインストーラを中断して仮想ハードドライブをフォーマットしてから続行

* VMを起動してインストーラを実行します。
* OS X インストーラが起動したら、画面上部のメニューバーの[ユーティリティ]/[ディスクユーテリィティ...]を起動します。
* 左のリストでディスクを選択→右で[消去]タブを選択→フォーマットを[Mac OS 拡張 (ジャーナリング)]にして[消去]ボタンを押し、ディスクをフォーマットします。
* フォーマットが終わったらディスクユーティリティを終了し、インストーラを続行します。
* インストーラの指示に従い適宜設定してインストールを進めます。

### 再起動したらDVD仮想ドライブからディスクを除去して続行

* 一度再起動したらVMのウィンドウの左上の赤い×アイコンを押しVMを停止させます。
* VirtualBoxのストレージの設定を開き、ストレージツリーでDVDイメージを選択し、[属性]/[CD/DVDドライブ]のディスクアイコンをクリックして[仮想ドライブからディスクを削除]メニューを選びます。
* [Oracle VM VirtualBox マネージャー]に戻り、VMを起動します。
* インストーラの指示に従い適宜設定してインストールを進めます。
bashいろいろ


# コマンドをグループ化して実行
```bash
{
  sleep 3
  echo "end"
} &
echo "start"
```

これは以下の順序で実行される。

1. startが出力
1. ３秒待つ
1. endが出力

# 変数が定義されていない場合にエラーを出す

":?"を変数名のあとに置く。

```bash
# ":?"がない場合、定義されていない変数は空文字として扱われる
$ echo $VAR

# ":?"がある場合、定義されていない変数を参照した場合にエラーが出力される
$ echo ${VAR:?}
-bash: VAR: parameter null or not set
```

# CUIで、直前の"/"や"_"まで削除する(windows限定)
 **alt + backspace** で消せる。ctrl+wが消しすぎな場合に使える。 

# 条件分岐を回避する
以下の様な郵便番号のファイルがあり、ハイフンがはいっていないものに入れるとする。

```bash
$ cat zip.txt
1234567
123-4567
101-1101
1110043
1111111
```

ストレートにやると、

```bash
cat zip | sed ’/^[0-9]¥{7¥}$/s/.../&-/‘
```

となるが、以下のようにして先に入力からすべてハイフンをとってしまうと楽。

```bash
tr -d ‘-‘ < zip.txt | sed ’s/^.../&-/‘
```

**条件分岐が起きそうなら、起きないように前提を整える**
django の dumpdata コマンドの代替

django の manage.py dumpdata で出力される json が、日本語がエスケープされてしまったり、フィールド名がモデルの順番と違っていたりとイマイチだったので、代わりにインタラクティブを使ってこんな風にした。（モデル名とかは例のため実際とは変えてます）

```pycon
>>> import json
>>> from collections import OrderedDict
>>> from django.core.serializers.json import DjangoJSONEncoder
>>> from account.models import User
>>> users = list(User.objects.all().order_by('id'))
>>> field_names = ["name", "birthday", "description"]
>>> a = [OrderedDict([("pk", user.pk), ("model", "account.user"), ("fields", OrderedDict([(name, getattr(user, name)) for name in field_names]))]) for user in users]
>>> print json.dumps(a, cls=DjangoJSONEncoder, indent=2)
```

ポイントは、

- OrderedDict を json.dump すると順番が維持される
- datetime を出力するためには cls=DjangoJSONEncoder が必要

という辺り。

フィールド名はモデルの属性から取れるはずなので、もっと汎用化することもできそう。

(追記)
> 日本語がエスケープされてしまったり

結局この問題は、一度出力されたものを Python 3 のシェルに貼り付ける等してアドホックに解決してる。
OSXでrbenv使ってて、vimをソースからビルドしてインストールすると、SEGVが発生してvimが落ちてしまう


vimを起動するとこういうエラーが出る。

```bash
% vim
dyld: lazy symbol binding failed: Symbol not found: _rb_encdb_declare
  Referenced from: /Users/kameda/.rbenv/versions/1.9.3-p392/lib/ruby/1.9.1/x86_64-darwin12.2.0/enc/encdb.bundle
  Expected in: flat namespace

dyld: Symbol not found: _rb_encdb_declare
  Referenced from: /Users/kameda/.rbenv/versions/1.9.3-p392/lib/ruby/1.9.1/x86_64-darwin12.2.0/enc/encdb.bundle
  Expected in: flat namespace

Vim: Caught deadly signal SEGV
Vim: Finished.
zsh: segmentation fault  vim
```

以下の条件が重なった時に、vim起動時にSEGVで落ちる。

* vimのconfigureで `--enable-ruby-interp` を指定している
* rubyのdylibがない。(rubyビルド時に、`--enable-shared`を指定してない)

rubyのdylibが無いのが原因らしい。
http://attonblog.blogspot.jp/2013/02/ruby-193-rubyinterp-vim-brew.html

これを解消するため、rubyを--enable-sharedをつけてビルドしなおさないといけない。
また、ruby2.0からはrbenvの環境変数がCONFIGURE_OPTSからRUBY_CONFIGURE_OPTSに変わった。
ruby1.9.3ならCONFIGURE_OPTSを使う。
http://attonblog.blogspot.jp/2013/02/rbenv-enable-shared-ruby-200-p0.html

以下の手順で ruby と vim をビルドし直す。

まず ruby-build を使って ruby をインストール。

```bash
RUBY_CONFIGURE_OPTS='--enable-shared' rbenv install 2.0.0-p247
rbenv global 2.0.0-p247
```

あとは普通にvimをソースからインストール。

```bash
hg clone https://vim.googlecode.com/hg/ vim
cd vim
./configure --with-features-huge --enable-perlinterp --enable-pythoninterp --enable-rubyinterp
make && make install
```

`--prefix` を指定してないと、/usr/local/bin に vim がインストールされる。
OSXのデフォルトでは `$PATH` が /usr/local/bin より先に /usr/bin を見に行くので、/usr/local/bin を先に見に行くために、.bashrc か .zshrc などで `$PATH`の順番を変えてやる必要があります。

```bash:.zshrc
export PATH=/usr/local/bin:$PATH
```

以上です。