OmniAICreator/Qiita-1.07M huggingface dataset:
SQLアンチパターン斜め読み

![スクリーンショット 2014-09-04 17.01.36.png](https://qiita-image-store.s3.amazonaws.com/0/51625/c0e1149e-8d3e-dcb1-0923-98dc0c0d0cf8.png "スクリーンショット 2014-09-04 17.01.36.png")
-----

[SQLアンチパターン](http://www.oreilly.co.jp/books/9784873115894/)に登場する各アンチパターンを、出来る限り1行でまとめて俯瞰するための一覧。
記憶をたどるためのキーワードのインデックスとして使うことを目的にしている。
また、週次で別途読み合わせの[勉強会](http://qiita.com/iwata@github/items/9a47ddababd8e0a82662)を行っているため、以下の一覧は勉強会の都度更新され、併せて勉強会資料へリンクする。

-----
##[Jaywalking（信号無視）](http://qiita.com/iwata@github/items/f33490d34dd1400b166e)
1対多または多対多の関係のテーブル間の id 管理において、Varcharなどのカラムを用意して「1,2,3,4,5」などの区切り文字で区切った値を代入すること

##[Naive Trees（素朴な木）](http://qiita.com/hirashunshun/items/06adf4f42f03a9f3b63d)
親子関係を持つテーブル間の id 管理において、中間テーブルを用意せず、parent_id のような親の ID を意味するカラムを用意して代用すること

##[ID Required（とりあえずID）](http://qiita.com/fatomy/items/cf048fc0461224ddfbd7)
どのようなテーブルにも id という名前の PRIMARY KEY を用意することだけで一意性を保てると安易に考えること

##[キーレスエントリ（外部キー嫌い）](http://qiita.com/kpure/items/6b5676873f901a0ecc7b)
外部キーをまったく使おうとしないこと

##[EAV（エンティティ・アトリビュート・バリュー）](http://qiita.com/deme0607/items/a89319014bc007f09f5c)
汎用的な値を管理するために attribute テーブルを使うこと

##[ポリモーフィック関連](http://qiita.com/suguru/items/d6d3ebe7b867c5009231)
1対多関係の複数テーブルのうち、子テーブル側に親テーブルの primary な id を持たせ、拡張性を持たせたいがために、親テーブルの種別（招来増える可能性がある）をテキスト型などで持たせること

```sql
CREATE TABLE children (
  child_id serial,
  parent_id int(10),
  parent_type enum('hoge','piyo')
);

CREATE TABLE parent_hoge (
  hoge_id serial
);

CREATE TABLE parent_piyo (
  piyo_id serial
);
```

##[マルチカラムアトリビュート](http://qiita.com/mizunokura/items/a9be12e0eddcf5d90f07)

```tag1, tag2, tag3 ...``` や ```account1, account2 ...``` などの柔軟性の無い可読性の低いスキーマ構造を定義してしまうこと

##[メタデータトリブル（メタデータ大増殖）](http://qiita.com/Aiita/items/1eda0a10a6aa305379b5)
「2012年の売上げ」の「2012年の」に当たるようなメタな情報をカラム名に持たせてしまうこと（往々にしてそういったデータは増殖し、カALTER TABLE の必要性や SELECT の難化をもたらす）

##[ラウンディングエラー（丸め誤差）](http://qiita.com/irohanihoheto/items/01b2b8511507ca0dece3)
正確さが求められる場面で FLOAT 型（概数型）を使うこと

##[31 Flavors](http://qiita.com/Inagawa/items/6e9745d2598aa713a1f3)
変化する可能性があるデータを、CHECK制約やENUM型などで表現し、柔軟性を失うこと

_元ネタはバスキン・ロビンス。_
_サーティワン・アイスクリームのバスキン・ロビンスは、当初「31のフレーバーのアイスクリームをお客に提供する」という意味を込めてサーティワンと名乗っていたが、フレーバーは増加して現在1000種類となり、店舗で提供しているのもたいてい28種類または32種類となっている。_
_つまり、変化する可能性のあるデータ（フレーバーの種類）を、メタデータ（アイスクリームシリーズの名前）で表現してはいけない、という意味。_



##[Phantom Files（幻のファイル）](http://qiita.com/kzhr/items/aaad744f8e06abc16949)
データベース内に BLOB でファイルを保持する方法もあると考えることを忌避し、そもそも検討しないこと

##[Index Shotgun（闇雲インデックス）](http://qiita.com/mizunokura/items/fbe8dbdca278764985df)
インデックスを使用する際、クエリの計測や、クエリ・スキーマ・インデックスの最適化、インデックスのメンテナンスなどを怠ること
Sublime Text2を使い始める (Mac編)


## 目次
1. パッケージをインストールするための下準備
2. Sublime Text2の日本語

## パッケージをインストールするための下準備
1. 以下のコードをコピーします。

```
import urllib2,os;pf='Package Control.sublime-package';ipp=sublime.installed_packages_path();os.makedirs(ipp) if not os.path.exists(ipp) else None;open(os.path.join(ipp,pf),'wb').write(urllib2.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read())

```

2.`control` + `` ` `` を押します。

または `View` → `Show Console`からコンソールを開きます。

![
Console.png](https://qiita-image-store.s3.amazonaws.com/0/44446/2797fcbc-09c5-e4ec-5f24-c9fb0b470899.png "Console.png")

すると画面下側にコンソールが表示されます。  
3. 1.でコピーしたコードを貼り付け、`return`を押します。  
![スクリーンショット 2014-06-09 22.08.46.png](https://qiita-image-store.s3.amazonaws.com/0/44446/41d2d707-baaf-7695-66c9-bd3ab15fa85d.png "スクリーンショット 2014-06-09 22.08.46.png")  
4. Sublime Text2を再起動します。

　次回から`shift` + `command` + `P` を押すと以下のようにCommand Palletを開くことが出来ます。
ここに"install"と入力し「Package Control : Install Package」を選び `return` を押すと、様々なパッケージをインストールすることが出来るようになります。
![スクリーンショット 2014-06-09 22.18.02.png](https://qiita-image-store.s3.amazonaws.com/0/44446/ee8e7d27-050e-b2a2-e609-1ae97c381779.png "スクリーンショット 2014-06-09 22.18.02.png")


## Sublime Text2の日本語化

### Finderに隠しフォルダや隠しファイルを表示する
※ Finderに隠しフォルダや隠しファイルを表示させている場合は読み飛ばして結構です。

* 隠しフォルダや隠しファイルを表示する

Macのターミナルを起動します。起動したら下記をコピーして実行します。
`defaults write com.apple.finder AppleShowAllFiles -boolean true`

実行後、Finderを再起動するために以下のコマンドをターミナルで実行します。
`killall Finder`

 * 隠しフォルダや隠しファイルを非表示にする。

同様に下記をコピーして実行する。
`defaults delete com.apple.finder AppleShowAllFiles`
実行後、Finderを再起動するために以下のコマンドをターミナルで実行します。
`killall Finder`

---

1. Sublime Text2を終了します。
2. Package Controlから「Japanize」をインストールします。  
インストールが完了したら以下のように「Japanize」パッケージの設定方法が表示されます。

![スクリーンショット 2014-06-10 10.55.07.png](https://qiita-image-store.s3.amazonaws.com/0/44446/a84173bb-d18f-e9bc-08ee-fdf47ff0ecaa.png "スクリーンショット 2014-06-10 10.55.07.png")  
3. この説明を基に設定をしていきます。
　この説明ではWindowsでのディレクトリであり、Macでは「ユーザ名/ライブラリ/Application Support/Sublime Text 2/Packages/Japanize」に、以下の4つの*.jpファイルがあります。

 * Context.sublime-menu.jp
 * Indentation.sublime-menu.jp
 * Main.sublime-menu.jp
 * TabContext.sublime-menu.jp

この4つのファイルを「ユーザ名/ライブラリ/Application Support/Sublime Text 2/Packages/Default」にコピーします。
　次に元々ここのディレクトリにある

 * Context.sublime-menu
 * Indentation.sublime-menu
 * Main.sublime-menu
 * TabContext.sublime-menu

を、オリジナルファイルと分かるような名前に変更します。
　次に先ほどコピーした*.jpファイルの「.jp」を削除して元々合ったファイルと同じ名前の

 * Context.sublime-menu
 * Indentation.sublime-menu
 * Main.sublime-menu
 * TabContext.sublime-menu

にします。
　最後に「.jp」を削除した上記の4つのファイルを「ユーザ名/ライブラリ/Application Support/Sublime Text 2/Packages/User」にコピーします。
　これでSublime Text2を起動すると無事日本語化が完了します。




## 参考サイト
 * SublimeText2の初心者 インストール・設定方法  
http://a.good.cx/sublime/
 * 【夏休みの自由研究】Sublime Text 2 を日本語化してみたよ  
http://www.head-t.com/2013/08/2013-08-15_01.html
 * Macの隠しファイルや隠しフォルダを表示する裏技  
 http://inforati.jp/apple/mac-tips-techniques/system-hints/how-to-show-hidden-file-or-folder-of-macos.html
最新のバージョンのGitをソースコードからインストールする

この記事はGitがインストールされていない。
あるいは、古いバージョンのGitがインストールされている人を対象にしています。

##Gitのバージョンを確認する

[ここ](https://code.google.com/p/git-core/downloads/list)から最新のバージョンのGitを確認します。
（2014/09/04のGitの最新のバージョンは1.9.0）

以下のコマンドを実行してGitのバージョンを確認します。

```text:input
git --version
```

コマンドが見つからなかったり、
以下のように古いバージョンのGit表示されればアウトです。

```text:output
git version 1.7.1
```

##libcurlをインストールする

libcurlがインストールされていなければ、
Gitでhttps通信を行うときに以下のエラーが出ることがあります。

```text:output
fatal: Unable to find remote helper for 'https'
```

Gitをインストールする前に入れておかないと、
Gitを再インストールする必要があるため、先に入れておきましょう。

以下のコマンドで見つかれば飛ばしてOKです。
※curlは違うので注意！

```text:input
yum list installed | grep libcurl-devel
```

インストールします。

```text:input
yum install -y curl-devel
```

##Gitをアンインストールする

既に古いバージョンのGitがインストールされていれば削除します。
インストールされていない人は飛ばしてOKです。

yumの場合

```text:input
yum remove -y git
```

ソースコードの場合（ソースコードのあるフォルダで）

```text:input
make uninstall
```

##Gitをダウンロードする

ソースコードを置くディレクトリに移動します。
（追加するアプリケーションは`/usr/local`ディレクトリに置くのが一般的です）

```
cd /usr/local/src
```

同じく[ここ](https://code.google.com/p/git-core/downloads/list)から最新のバージョンのGitのダウンロードリンクのURL確認し、
ダウンロードします。

```text:input
wget https://git-core.googlecode.com/files/git-1.9.0.tar.gz
```

ダウンロードしたファイルを解凍します。

```text:input
tar zxvf git-1.9.0.tar.gz
rm git-1.9.0.tar.gz
cd git-1.9.0
```

##Gitをインストールする

configureスクリプトを実行してインストール設定を行います。
ここではprefixオプションでインストール先のディレクトリを指定しています。

```text:input
./configure --prefix=/usr/local/
```

「zlib.hがありません」と言われたら、
zlib-devel.x86_64をインストールしてください。

```text:input
yum install -y zlib-devel.x86_64
```

「Makefileが作れません」と言われたら、
perl-ExtUtils-MakeMakerをインストールしてください。

```text:input
yum install -y perl-ExtUtils-MakeMaker
```

`make`コマンドと`make install`コマンドでインストールします。

```text:input
make
make install
```

最後にGitのバージョンを確認して終わりです。

```text:input
git --version
```

```text:output
git version 1.9.0
```

ソースコードが入っているディレクトリはアンインストール（`make uninstall`コマンド）するときに使用するため削除しません。

##参考URL

http://www.xraster.jp/server/centos6-3%E3%81%ABgit%E3%82%92%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E3%80%81%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB
SourceTreeでファイルをローカル無視リストへ追加するカスタムアクション


## 以下のようなケース
- ローカル環境だけで使用するファイル（.gitignoreにも書きたくない）がある
- SourceTreeのリストからファイル右クリックで登録したい

##スクリプトを用意

```bash:bash
#!/bin/bash

TEXT=$@
IFS=','
set -- $TEXT
echo $2 >> $1/.git/info/exclude
```

[SourceTreeCustomActions/exclude.sh](https://github.com/maccotsan/SourceTreeCustomActions/blob/master/exclude.sh)

## 環境設定からカスタムアクションを登録
※下記参考URLを参考に

パラメータには
```
$REPO,$FILE
```
を入力

## ファイルを選択して右クリック
＞カスタムアクション＞exclude

## 画面の更新
右上の設定ボタンとか押すとリスト表示がリフレッシュされる模様。

# 参考

[Git | excludeファイルにローカル環境だけ無視したいファイルを登録 - tbpg’s programming memo](http://d.hatena.ne.jp/tbpg/20130610/1370873259)

[Git初心者でも差分ファイルを一瞬で取り出すMac用Sou… - エンジニアブログ - スマートフォンアプリ開発、CMS実装｜株式会社アイムービック](https://www.eyemovic.com/blog_it/4747.php)
jQuery animte リファクタリング

```html:HTML
<div id="x">x</div>
<div id="y">y</div>
<div id="z">z</div>
```

# CoffeeScript版

## 最初のコード

```coffeescript:CoffeeScript
$('#x').animate
  marginLeft: 40
, ->
  $('#y').animate
    marginLeft: 40
  , ->
    $('#z').animate
      marginLeft: 40
```

## コールバック地獄やめる

```coffeescript:CoffeeScript
d = new $.Deferred
$('#x').animate
  marginLeft: 40
, -> d.resolve()

d.promise().then ->
  $('#y').animate
    marginLeft: 40
.then ->
  $('#z').animate
    marginLeft: 40
```


## reduce(es6)を使う

```coffeescript:CoffeeScript
[
  ->
    $('#x').animate
      marginLeft: 50
  ->
    $('#y').animate
      marginLeft: 50
  ->
    $('#z').animate
      marginLeft: 50
].reduce (prev, current, i) ->
  prev.then -> current()
, new $.Deferred().resolve()
````

# JavaScript版

## 最初のコード

```js:JavaScript
$('#x').animate({
  marginLeft: 40
}, function() {
  $('#y').animate({
    marginLeft: 40
  }, function() {
    $('#z').animate({
      marginLeft: 40
    });
  });
});
```

## コールバック地獄やめる

```js:JavaScript
var d = new $.Deferred;

$('#x').animate({
  marginLeft: 40
}, function() {
  d.resolve();
});

d.promise().then(function() {
  return $('#y').animate({
    marginLeft: 40
  });
}).then(function() {
  return $('#z').animate({
    marginLeft: 40
  });
});
```

## reduce(es6)を使う

```js:JavaScript
[
  function() {
    return $('#x').animate({
      marginLeft: 50
    });
  }, function() {
    return $('#y').animate({
      marginLeft: 50
    });
  }, function() {
    return $('#z').animate({
      marginLeft: 50
    });
  }
].reduce(function(prev, current, i) {
  return prev.then(function() {
    return current();
  });
}, new $.Deferred().resolve());
```
Perlのハッシュキー

普段あまり気にしなくても動くPerlですが、違いがある挙動がありましたのでご参考まで...

ハッシュにいれたキーの中身はソートしなければ不定です。
同じプラットフォームでは同じ結果がでるので気になりませんでしたが、環境で違いが出ました。

昔、ソートせずに決め打ちで１つめのキーとかやってたログ表示ツールが上手く動かなくなりました…＜自戒

##ソースコード
```
#! /usr/bin/perl
use strict;
my $msg = 'The quick brown fox jumps over the lazy dog';
my @word = split / / ,$msg;
my %hash;
my $cnt = 1;
map {$hash{$_} = $cnt++} @word;
while (my ($key, $val) = each (%hash) ) {
	print "key : $key\tval : $val\n";
} 
exit(0);
1;
```

##実行結果

###x86_64-linux-thread-multi
|the|over|jumps|lazy|dog|brown|fox|quick|The|
|:-:|:--:|:---:|:--:|:-:|:---:|:-:|:---:|:-:|
|7  |6   |5    |8   |9  |3    |4  |2    |1  |

###sun4-solaris

|lazy|the|The|brown|dog|over|quick|fox|jumps|
|:-:|:--:|:---:|:--:|:-:|:---:|:-:|:---:|:-:|
|8|7|1|3|9|6|2|4|5|

###sun4-solaris-64int

|the|over|jumps|lazy|dog|brown|fox|quick|The|
|:-:|:--:|:---:|:--:|:-:|:---:|:-:|:---:|:-:|
|7|6|5|8|9|3|4|2|1|
AngularJSで入力欄がdisabledになったら設定したモデルの値をクリアする方法

Web入力フォームを作成するときに、入力内容の条件によって入力欄(inputやselectなど)のdisabledを切り替えることはよくあると思います。入力欄がdisabledになると、それらの項目はsubmitしたときの送信パラメータに含まれなくなります。そのおかげで不整合なデータが送信されることを防止することができます。

ところがAngularJSにおいて入力欄にngModelで割り当てたモデルを利用している場合は、入力した後にdisabledになってもモデルの値は残ってしまいます。そのため、非活性の項目なのに値が存在するという不整合が起きてしまうことがあります。


そこで、入力欄がdisabledになるとモデルの値をクリアするディレクティブを作ってみましました。

```app.js
app.directive('clearDisabled', function() {
  return {
    require: 'ngModel',
    link: function(scope, elm, attrs, ngModel) {
      scope.$watch(attrs.ngDisabled, function(isDisabled) {
        if (isDisabled) {
          ngModel.$setViewValue(); // clear value
          ngModel.$setPristine();
          ngModel.$render();
        }
      });
    }
  };
});
```

```index.html
<h2>使用例</h2>
<form ng-controller="AppController">
  <input type="text" ng-model="data.text" ng-disabled="data.isCheck" clear-disabled />
  <input type="checkbox" ng-model="data.isCheck" value="1"/>
  <div>
   {{data}}
  </div>
</form>
```
この例では、チェックボックスにチェックを付けるとテキスト欄が非活性になります。それに合わせて入力欄に割り当てたモデル data.text の値がクリアされます。

実際の動作はこちらから (http://jsfiddle.net/s7mgL408/4/)
ZabbixでWEB UIから各Hostの起動制御を行えるようにする

# 目次

* [はじめに](#init)
* [環境構成](#environment)
* [実現したいこと](#aim)
* [前提条件](#precondition)
* [Zabbixエージェント側の設定](#setting_agent)
* [Zabbix WEB UI側の設定](#setting_webui)
* [Zabbix WEB UI側操作](#ope)

----

<a name="init"></a>
## はじめに

Zabbixでサーバを管理していると、リソースの管理だけでなく、簡単なShellの実行をさせたいときがある。
リソースの管理はそれはそれで便利だが、サーバの起動制御まではデフォルト設定ではさせてはもらえない。

なのでそれを行えるように機能を追加してみた。

<a name="environment"></a>
## 環境構成

|key|value|
|:-----------|------------:|
|OS|CentOS 6.2|
|Zabbix Version| zabbix 2.2.2|

<a name="aim"></a>
## 実現したいこと

実現したいことはZabbix画面から、各マシンのリブートやシャットダウンができるようにすること。
まあ、Jenkins等でShell起動のJOBを作ってみても便利なのだが、今回はZabbixで実現させてみる。

<a name="precondition"></a>
## 前提条件

* 操作したいマシンに Zabbixエージェントが仕込まれていること。
* Zabbixエージェントが「root」として動作するのを許可していること。
* Zabbix サーバからのリモートコマンドを許可していること。

<a name="setting_agent"></a>
## Zabbixエージェント側の設定

```sh:
# vi /usr/local/etc/zabbix_agentd.conf

EnableRemoteCommands=1
AllowRoot=1
```

<a name="setting_webui"></a>
## Zabbix WEB UI側の設定

[管理]→[スクリプト]→「スクリプトの作成」ボタン押下

Zabbixエージェント　を選択し、コマンドを設定し、保存するだけ。

![zabbix_reboot.jpg](https://qiita-image-store.s3.amazonaws.com/0/25389/2de744b0-a64e-cb01-34db-462dd9af46f2.jpeg)

<a name="ope"></a>
## Zabbix WEB UI側操作

先ほど作成したスクリプトが
マップの対象マシンのアイコンの右クリックで出てくるので、そこで操作できる。

![zabbix_reboot2.jpg](https://qiita-image-store.s3.amazonaws.com/0/25389/ad20c923-cc2d-4539-1235-a578bc5311d4.jpeg)
ApacheでのPATH_INFOとは？

#PATH_INFOとは

PATH_INFOとは、本当のファイル名の後に続く パス情報のことです。

`http://hoge.com/hoge.html/huga/foo`
`http://hoge.com/hoge.cgi/huga/foo`

など本来のファイル”hoge.html”/”hoge.cgi”のあとに続く、”/huga/foo”を差します。

環境変数としては`"http://$SERVER_NAME:$SERVER_PORT$SCRIPT_NAME$PATH_INFO"`となります。

値は`$ENV{'PATH_INFO'}`で取得できます。

CGIだけではなくてSHTMLでも適用されます。

Apacheのバージョンにより、許可の状態は変わっていて1.3系では強制ONとなり、OFFにするオプション（AcceptPathInfo）は無いそうです。
2.0系ではデフォルトOFF、AcceptPathInfoで許可することができます。
Struts2の独自intercepterにてエラーメッセージを格納する。

Struts2にてエラーメッセージを使用するときはActionSupportのaddActionErrorを使用することが多いと思いますが、
独自に定義するintercepter内ではActionSupportを継承していないので、そのまま使えません。

なので、下記のようにActionInvocationからActionSupportを呼び出して、利用しましょう。

独自のintercepter

```java
public String intercept(ActionInvocation invocation) throws Exception {

	try {

		// ここに処理を書きます。 


	} catch (Exception e) {

		ActionSupport action = (ActionSupport) invocation.getAction();
		action.addActionError(action.getText("ここにエラーメッセージを入れます。"));

		// エラー画面に遷移する。
		// struts.xmlにエラー先を定義されているものとする。
		return "error"; 
	}

	return invocation.invoke();
}
```

以上です。
【Cocos2dx】v3.xのAndroidで重なり順（zorder）がおかしくなる

cococs2d-x v3.0とv3.1環境でAndroidで動作させた際に、
重なり順が壊れてしまい正常に描画されない場合がある。

原因としてはCCNode.cppのsortAllChildren()で子Nodeを並び替えている部分がある。
ここのstd::sortがAndroidだと上手くいかないため発生している。

以下のように修正すれば解決する

```lang:cocos2d/cocos/2d/CCNode.cpp（修正前）
if( _reorderChildDirty ) {
　　std::sort( std::begin(_children), std::end(_children), nodeComparisonLess );
　　_reorderChildDirty = false;
}
```

```lang:cocos2d/cocos/2d/CCNode.cpp（修正後）
if( _reorderChildDirty ) {
　　std::stable_sort( std::begin(_children), std::end(_children), nodeComparisonLess );
　　_reorderChildDirty = false;
}
```

この事象が発生するのはzorderが同じ数値で、Node同士が位置的に重なっていると発生する。
Puttyのタイトルバーに表示する文字列を変更する

Puttyを使って複数の仮想マシンにSSH接続していると、どれがどれだか分からなくなってきます（個人的に）

仮想マシン単位で分けるなら**/etc/zshrc**ファイルに、
ユーザ単位で分けるなら**~/.zshrc**ファイルに以下を記述します。

```text:zshrc
# Puttyのタイトルバーに表示する文字列を変更する
printf "\033P\033]0;${タイトルバーに表示する文字列}\007\033\\"
```

変更を反映します。

```text:input
source /etc/zshrc
```

or

```
source ~/.zshrc
```

色まで変えたらもっと分かりやすくなると思ったのですが、なぜかうまくいかなかったので今回はここまでです。

##参考URL
http://blog.kjirou.net/p/343
http://7ujm.net/etc/esc.html

***

※追記：tmuxを立ち上げると反映されなくなるので、`~/.tmux.conf`ファイルに以下を記述します。

```text:~/.tmux.conf
set-option -g set-titles on
```
OSXでSambaの共有ディスクを起動時にマウントしておく

#/etc/auto_masterの設定
/etc/auto_masterというファイルにSambaの共有ディスクの設定を書くよと追記します。

`sudo vi /etc/auto_master`
で、開いて
`/Users/[USER]/mnt       /etc/auto_smb`
と追記します。自分のホームディレクトリ下のmnt以下にSambaのディレクトリをマウントします。
設定ファイルは/etc/auto_smbに書いておくよ。という意味（らしい）。

#/etc/auto_smbの設定
新規ファイルになります。
`sudo vi /etc/auto_smb`
で開いて
`smb1 -fstype=smbfs   ://[user]:[pass]@[server]/[dir]`
みたいに書きます。smb1のところがラベル（ボリューム？）になってて、マウントされると
/Users/[USER]/mnt/smb1
みたいになってます。

#設定の反映
設定は再起動しても反映されるようですが、下記コマンドでも反映できます。
`sudo automount -vc`
Haxeで連想配列

haxeで連想配列を使おうとしたらつまづいた。
jsでいえばこんなやつである。

`var hoge={};
hoge["fuga"]=1;`


このノリで行くと下記のようにしたらできそうだけど、だめだった。

`var hoge:Dynamic={};
hoge["fuga"]=1;//おこられる`


実はMapなるクラスがあるので、keyとなる型とそこにぶっこむ型を
定義してあげると出来る。set/getのメソッドが用意されている。
as3でいうDictionaryみたいなもんかな？

`var hoge:Map<String, Int> = new Map<String, Int>();
hoge.set("fuga", 1);
hoge.get("fuga");//1が取得できる`

##違う参照の仕方
Reflectというのを使うと、動的に変数の値を取得できる。

`var a:Int = Reflect.getProperty(hoge, "fuga");
//hogeのfugaプロパティを参照。
`

Reflect参考: http://rsakane.net/memo/?p=121

##ちなみにkeyの取得はこのようにする
`for (k in _map.keys()) {
trace("key="+k);
trace("value="+_map.get(k));
}`

以上、よくわかってないけど勉強中。
Doxygen 書き方メモ (C, C++)

# C, C ++ での書き方 #
特殊なコメントとして記述する。以下の様なコメントは `doxygen` の対象となる。このどれを使ってもいいし、混ぜても問題ない。
コーディング規約との相性のいいものが良い。

```cpp
/**
 * ここにテキストを書く
 */
```

```cpp
/*!
 * ここにテキストを書く
 */
```

```cpp
///
/// ここにテキストを書く
///
```

```cpp
//!
//! ここにテキストを書く
//!
```

## ファイルへのコメント ##
ファイルの先頭に書く

```cpp
/**
 * @file ファイル名.h
 * @brief 簡単な説明
 * @author 書いた人
 * @date 日付（開始日？）
 */
```

## 関数へのコメント ##
```cpp
/**
 * @fn
 * ここに関数の説明を書く
 * @brief 要約説明
 * @param (引数名) 引数の説明
 * @param (引数名) 引数の説明
 * @return 戻り値の説明
 * @sa 参照すべき関数を書けばリンクが貼れる
 * @detail 詳細な説明
 */
void func1(int arg1, int arg2) {
```

## 変数へのコメント ##
```cpp
//! 変数へのコメント
int HenSu = 0;
```

## マクロへのコメント ##
```cpp
/** @def
 * マクロのコメント
 */
#define MAX_NANKA 256
```

## 列挙体へのコメント ##
```cpp
/**
 * @enum Enum
 * 列挙体の説明
 */
enum Enum {
    //! 列挙体の各要素へのコメント
    EnumItem1 = 0x00,

    //! 列挙体の各要素へのコメント
    EnumItem2 = 0x01
};
```

# 注意 #
* マクロに対するコメントはファイルに対するコメントが書かれていないと表に出てこない？
* namespace 内にあるコメントは namespace に対するコメントが無いと出てこない？


# ヘッダファイル vs ソースファイル #
これらのコメントを、関数のようなヘッダとソースファイル両方にあるものはどちらに記入すべきか？
実コードとの距離を考えて、ソースに書いたほうがいいのかなぁ？
[Sqlite] オートインクリメント値をリセットする方法

Heroku用のRailsプロジェクトでは、開発環境ではSqliteを使っています。

データを操作していると、オートインクリメント値を調整することもしばしばあったりします。


```sqlite3
sqlite> select * from TABLE_NAME;
id|name|user_id|desc|created_at|updated_at|
9|ナイティナインのオールナイトニッポン|1|もうすぐやべっち引退|2014-09-04 05:02:41.742669|2014-09-04 05:02:41.742669|
10|hogeのオールナイトニッポン|1|もうすぐhoge引退|2014-09-04 05:02:41.742669|2014-09-04 05:02:41.742669|
```

#Sqliteでのオートインクリメント

sqlite_sequenceにオートインクリメント値が保存されている様です。
なので以下のコマンドでオートインクリメント値をリセット出来ます。

```sqlite3
sqlite> delete from sqlite_sequence where name='TABLE_NAME';
```

これで、もう一度データを入れてテーブルを見ると、オートインクリメントがリセットされています。

```sqlite3
sqlite> select * from TABLE_NAME;
id|name|user_id|desc|created_at|updated_at|
1|ナイティナインのオールナイトニッポン|1|もうすぐやべっち引退|2014-09-04 04:54:03.908148|2014-09-04 04:54:03.908148|
2|hogeのオールナイトニッポン|1|もうすぐhoge引退|2014-09-04 04:54:03.908148|2014-09-04 04:54:03.908148|
```
Python で、超タイニー構造体

* タプル → 何番目が何か、よく忘れる
* 連想配列 → メンバー名を引用符で囲むのがメンドイ
* namedtupple → １行とはいえ、型をいちいち作るのがメンドイ。一回限りしか使わんパターンもあるし

いちいち別途「型」を作らずに、メンバーを引用符なしの名前でアクセスできたらいいな！

```struct.py
class Struct(object):
    def __init__(self,**kargs):
        for key,val in kargs.iteritems():
            setattr(self,key,val)

if __name__ == '__main__':
    t = Struct(a=10,b=20,c=30)
    t.c = "<30>"
    print t.a, t.b, t.c
```

```
<MARKEDONE:~>
✏ ipy struct.py
10 20 <30>
<MARKEDONE:~>
✏
```

たぶん、もっといい方法があるんだろうねぇ。亡者プログラマーだから、いろいろ忘れたよ。
めっちゃ見やすい！Githubでside-by-side diffを見る方法



もう気づいている人も多いかと思いますが、Github上で、side by side diff / split diff を見ることが出来るようになりました！！


方法は、Diff画面の右上でで`Split`を選ぶだけ。
[Github公式ブログ](
https://github.com/blog/1884-introducing-split-diffs
)からそのままgif画像を引用しときます。

![Split-Diff Github](https://cloud.githubusercontent.com/assets/98681/4139311/699ef6da-3399-11e4-8d8e-cf0a9e902867.gif)



自分の場合は、Chromeの設定を活用して、URLからDiffに飛ぶことも多いので、URLの最後に

```
?diff=split
```

をつけるようにしています。

ただ、一度設定するとデフォルト挙動が変わってくれるので、あまりこれを打つ必要は無いですが。

## ちなみに

この機能、[GithubのCOOとCIOが来日した時](https://onlab.jp/blog/archives/2013/02/open-network-lab-github0130.html)に、個別に話す機会があったので「作ってよ」とリクエストしてみたことがありました。

その時のやりとりの日本語版：

> 自分: 前いた会社でside-by-side diff使ってて、それめっちゃ使いやすいので、Githubに実装してください！
> PJ(COO): リクエストは幾つか受けてるんだけどね。誰もやりたがらないからやらないんだよ。Githubはそういう会社だからね。

誰かがやる気を起こしてくれたんですね！

ちなみに、Side by Side Diffでは+/-をナシにしてうまくHTMLをMarkupしてくれると、そのままコードのコピペもできるようになるので、そこまで頑張ってくれると嬉しいんですけどね。
Doxygen 使い方メモ

# インストール #
Doxygen の [ホームページ](http://www.stack.nl/~dimitri/doxygen/download.html#srcbin)からインストーラーをダウンロードしてインストールする。

# 使い方 #
```
スタートメニュー => すべてのプログラム => doxygen => Doxywizard
```
で起動。

# 設定方法 #
必要と思われる設定項目。`File` メニューから設定の保存ができる。
## Working Directory ##
良く分かってない。おそらく設定ファイルの保存される場所。
とりあえずどこか適当な場所を設定

## Wizard ##
### Project ###
| 項目名 | 備考 |
|:--------|:--------|
| Project Name | プロジェクト名を設定する |
| Source code directory | ドキュメント化したいコードの有るフォルダ |
| Scan recursively | チェックを入れておく。チェックを入れないとサブディレクトリーのファイルが対象にならない。 |
| Destination directory | 出力先ディレクトリ。このディレクトリの中に html フォルダが生成される。 |

### Mode ###
| 項目名 | 備考 |
|:--------|:--------|
| Select programming language... | プロジェクトで使用している言語のものを選択する。 |

### Output ###
| 項目名 | 備考 |
|:--------|:--------|
| HTML | HTML での出力がほしいのでチェックを入れる。ラジオボタンは with navigation panel がオススメ |
その他の出力は今回は不要

### Diagrams ###
クラスの継承図や関数の呼び出しグラフをどう出力するか。Use built-in... でいいと思う。


## Expert ##
### Project ###
| 項目名 | 備考 |
|:--------|:--------|
| OUTPUT_LANGUAGE | Japanese も有るのでそれを選択 |
| STRIP_FROM_PATH | ここで、今回のプロジェクトの親フォルダのパスを追加する。（ここを設定しないと、ソースファイルのパス名がフルパスになる。） |

### Input ###
| 項目名 | 備考 |
|:--------|:--------|
| INPUT_ENCODING | ソースファイルの文字コードを設定する。UTF-8 なら "UTF-8" 、Shift-JIS なら "CP932" |

## Run ##
`Run doxygen` で HTML を生成する。`Show HTML output` でブラウザで確認。`html` フォルダ内の `index.html`
 が目的のファイル。
PostgreSQL のテーブルをローカルマシンから見るのは、LibreOfficeのBASEが一番よさそう

MySQLをメインに使ってる人が、HerokuのデフォルトPostgresを使いはじめると、管理ツールに迷う。

- phpmyadmin 
- MySQL Work Bench

に相当するものがないのだ。あと、動かすのはOSXね。Ruby使うならWindowsよりもOSXだと思う。

普通に探すと以下の候補にあたる。

- PG Commander （有料）
- pgAdmin （無料）

PG Commanderが、性能的には申し分がないのだが、無料の範囲で接続できるDBが5つと制限がある。開発・ステージング・本番みたいに使い分けると、事実上１プロジェクトくらいしかカバーできない。５つという制限が恨めしい。優良なのはいいのだが、テーブル定義を見る画面がない。だからちょっと凝ったSQLを書くのがむつかしい。

pgAdminは無料なのだが、Adminという名前の通り、管理ツールが主体で、テーブル一覧を表示するまでの階層が深い。翌日になると忘れるレベル。人に勧めて到達できてるイメージがない。

phppgadmin というphpのツールもあるのだが、HerokuのプロジェクトがRubyなのに、さらにPHPのアプリを立ち上げるってのも面倒。

ということで相当じたばたした挙句。一番よさそうなのが、LibureOfficeのBASEというデータベースアプリを使うということ。

- 本当はMS-OfficeのACCESSの代替がBASEなんだろうけどリモートDBも接続できる
- 接続文字列一発でつながるので設定も楽
- クエリビルダがあるので、テーブル結合も楽ちん
- クエリを発行するたびに接続しなおしているので、「接続切れです！」ってアラートがすくない

GUI自体はこなれてないので、レスポンスがイマイチだったりするのだけれど、無料ってことと機能のカバー範囲だとベストかなって。
Rails4でbowerでJavaScriptを管理する - bower-rails (Bootstrap3を入れてみる)


## bowerを使ってみたい

RailsでJavaScriptライブラリを管理する時、どうしたら良いのか悩んでいた。bowerを使いたい。。
がそのままbower installしてbower_componentsできても、asset pipelineにうまく乗ってくれるかわからん。
asset pipeline難しすぎ；；

## bower-rails がすべてを解決してくれるらしい！

### 前提
- bowerはインストール済
- いろいろやらかしてよいrailsのディレクトリは用意済
- railsはbundlerでインストールした

### bower-railsをインストール
#### Gemfileを編集

以下を追加。

```
gem "bower-rails"
```

```bundle update```する。


### bower-railsの初期設定

```
$ bundle exec rails g bower_rails:initialize
```

以下の設定ファイルが作られる。
- Bowerfile
- config/initializers/bower_rails.rb

最初、```bower_rails:initialize```しないで、エディタでBowerfile作ってみたら、エラー吐いて止まった。。

#### インストールするライブラリを決める(Bowerfileの編集）

とりあえずbootstrap入れてみる。

```
asset 'bootstrap'
```

#### bower-railsの実行（install）

```
$ bundle exec rake bower:install
```

bowerでのインストールが走る。行き先は```vendor/assets/bower_components```

今回はbootstrapをインストールしたので、一緒に必要なjqueryも入ってくるみたい。


初回インストールの場合、```bower.json```も作られる。

### Rails側の読み込み設定

assetsとしては読み込み対象になってる場所に入ってるらしく、config設定はいらない。
css, javascriptの読み込み設定のみ。

#### css (app/assets/stylesheets/application.css)

以下を追加。

```
*= require bootstrap
```

#### javascript (app/assets/javascripts/application.js)
以下を追加。

```
//= require bootstrap
```

### bootstrap用のlessを使えるようにする

Gemfileにlessが入ってないと、エラーになるので、以下のgemも追加する。
rubyracerはrailsのデフォルトでコメントアウトされてるので、コメント外せばOK

```
gem "less"
gem "therubyracer"
```

```bundle update``` 忘れずに。

## おまけ（動作確認）

```rails new```したばかりのrails appで試していたので、ちゃんとスタイル適用が成功したところがわからない。
静的ページ1個作って動作確認したところを書いとく。
(RailsTutorialの静的ページのところ）

```
$ bundle exec rails g controller StaticPages home help --no-test-framework
```

出来上がった```app/views/static_pages/home.html.erb```を編集してbootstrapのスタイルが適用されているかチェック。
glyphiconの読み込みチェックもすると、ちゃんとasset pipelineに読み込まれてることがわかって良い感じ。

```
<a href="#" class="btn btn-success">
  <i class="glyphicon glyphicon-plane"></i>
  <span> ファイルをアップロード</span>
</a>
```

```bundle exec rails s```でサーバー起動。
http://localhost:3000/static_pages/home
でちゃんとボタンとglyphiconが読み込まれていればOK

bootstrap jsの読み込みも確認したければ、ドロップダウンとか書いてみると良い。（読み込まれてない場合ドロップダウンクリックしても何も起きない）

```
<ul class="nav nav-tabs" role="tablist">
  <li class="dropdown">
    <a class="dropdown-toggle" data-toggle="dropdown" href="#">
      Dropdown <span class="caret"></span>
    </a>
    <ul class="dropdown-menu" role="menu">
      <li>ドロップダウン１</li>
      <li>ドロップダウン２</li>
    </ul>
  </li>
</ul>
```

### 愚痴

ほんとは Middleman + bower やりたかったんだけど、そっちでもasset pipeline機構に阻まれて、結局解決できずでじゃあrailsはどないなっとんねん？と思って調べてたら以下の参考リンク達に救われた。。
middleman では bootstrap css の読み込みまではできたけど、 glyphicon のロードがうまくできず、挫折・・

- - -
## 参考リンク

- [42dev/bower-rails](https://github.com/42dev/bower-rails)

- [Heroku - bower(js パッケージ管理)とrailsの相性は抜群！！ - Qiita](http://qiita.com/reikubonaga/items/5a6037e067b79e5f9849)

- [Railsで外部JavaScriptライブラリなどのAssetを管理するなら、bower-railsが便利 | mah365](http://blog.mah-lab.com/2014/04/14/bower-rails/)
Formタグの中にsubmitボタンつけ忘れたけど面倒くさい時

# 背景

たまに、SIerの所属しているが、Web系なシステムばかり担当しているので、
HTML書いてnode.jsで動かしたり、それっぽい雰囲気を演出することがある。

そんな訳で、毎度うろ覚えのHTML書いているので、Formタグの中に

```html
<input type="submit" name="btn" value="押すな危険">
```
なんてタグを書きそびれることが多々ある。

# ブラウザの開発ツールで何とかする

```js
document.getElementsByTagName("form")[0].submit()
```

# まとめ

これ、あえて、submitが無いページにしておき、プログラマ専用ログインページなどどうだろうか。

# 関連投稿

- [atom-shell - Atom Shellを簡単に試す方法 - Qiita](http://qiita.com/kjunichi/items/261bd33bb8c5ff5a126b)
仮想Debianでjavaアプリを動かすまで


仮想サーバーでアプリをテストしたので、メモ書き。

## 概要
OS上でOSを立ち上げる仮想化ソフトウェアVirtualBoxを使って、
Debian OSをwindows上で立ち上げます。
さらに、javaをインストールし、javaアプリを起動できようにします。


## 環境
win8


## Debianをダウンロードする
時間がかかるので先にやります。
http://cdimage.debian.or.jp/
ここのDVD 64bitをダウンロードしました。



## VirtualBoxをダウンロードします
以下サイトからVirtualBoxをダウンロードします。
https://www.virtualbox.org/wiki/Downloads



## VirturalBoxをインストールします
適当にOK押しました。

## VirtualBoxに仮想OSを立てる
### 新規を押す
- 名前をつける（Debianを含めるとタイプバージョンが自動でLinuxDebianに）
- メモリを決める(1024MBにしました)
- 仮想ハードドライブを作成するにチェックしたまま作成
- VDIのまま次へ
- 可変サイズで次へ
- ドライブサイズを決める(8GBにしました)
- で完了

### アイコンが左の欄にできるので右クリック 
- 設定
- ストレージ
- コントローラー:IDEでCDのマークをクリック
- はじめにダウンロードしたDebianを指定（ダウンロード終わってなければ待つ）

次はサーバーにするためのネットワーク設定なのでjava動かすだけならいりません
- ネットワーク
- NATをブリッジアダプターにしてOK


## 起動してインストール
だいたいエンターですが、
初期パッケージは必要なものを選びましょう。選ぶときはスペースです！
エンター押すとインストール始まっちゃいます


## jdk7をインストール

`#`はルート　`$`は一般ユーザで打つコマンドを表すらしいです
java install

1. `$ su`
rootになります

2. `# echo deb http://http.debian.net/debian/ wheezy main contrib >> /etc/apt/sources.list`
sources.listというapt-getでとって来れるurl集的なファイルに追記をします
`# vi /etc/apt/sources.list`
とかで編集してもokです。

3. `# apt-get install java-package`
debianが用意してくれたjava用のなにか

4. `# exit`
ユーザー権限に戻ります

5. `$ make-jpkg jdk-7u45-linux-x64.tar.gz`

6. `$ su`

7. `# dpkg -i oracle-j2sdk1.7_1.7.0+update45_amd64.deb`

以上で終わりです。
ファイル名のバージョン部分が違うかもしれないので7.は補完でだしましょう。
(oraclとか書いて	tabです)


## おまけ
SublimeText3用、ファイル種別に対応して異なるprintfデバッグをできるようにするプラグイン

JSとPHPを並行開発していた際、ファイルの種類によってconsole.logとvar_dumpを自動で切り替えて呼び出せる機能が欲しかったので、作りました。

PHPファイル上で実行すると選択範囲の文字列を`var_dump();`でラップします。それ以外であれば`console.log();`でラップします。

```python:ConsoleDebugEasilizer.py
import sublime, sublime_plugin

class ConsoleDebugEasilizerCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        scopeName = self.view.scope_name(self.view.sel()[0].begin())
        if ('source.php' in scopeName):
            source = 'php'
        elif ('source.coffee' in scopeName):
            source = 'coffee'
        else:
            source = 'js'

        self.view.run_command('insert_debug', {'arg': source})


class InsertDebug(sublime_plugin.TextCommand):
  def run(self, edit, arg):
    if (arg == 'php'):
        for region in self.view.sel():
            self.view.insert(edit, region.end(), ');')
            self.view.insert(edit, region.begin(), 'var_dump(' )

    elif (arg == 'coffee'):
        for region in self.view.sel():
            self.view.insert(edit, region.end(), ' ')
            self.view.insert(edit, region.begin(), 'console.log ' )

    else:
        for region in self.view.sel():
            self.view.insert(edit, region.end(), ');')
            self.view.insert(edit, region.begin(), 'console.log(' )
```

PackageControllerからは追加できないので、手動でインストール（パッケージフォルダにpyファイルをコピー）してください。
*Key Bindings - User* あたりに `{ "keys": ["ctrl+shift+space"], "command": "console_debug_easilizer"},` などと追加しておけば良いかと思います。
Pythonはこれが2回目です。変なところありましたらご教示いただけると幸いです。

https://github.com/airosB/sublime-console-debug-easilizer
【メモ】PHPで画像の比率はそのままに縮小する

画像の比率を維持したまま、縮小してほしいという要望があったため、
メモとして残します。

``` php
// 画像サイズ取得

list($width, $height, $type, $attr) = getimagesize(画像パス);

$newwidth = 0; // 新しい横幅
$newheight = 0; // 新しい縦幅
$w = 200; // 最大横幅
$h = 50; // 最大縦幅

// 両方オーバーしていた場合 
if ($h < $height && $w < $width)  { 
　if ($w < $h) { 
　　$newwidth = $w; 
　　$newheight = $height * ($w / $width); 
　} else if ($h < $w) { 
　　$newwidth = $width * ($h / $height); 
　　$newheight = $h; 
　} else { 
　　 if ($width < $height) { 
　　　$newwidth = $width * ($h / $height); 
　　　$newheight = $h; 
　　} else if($height < $width) { 
　　　$newwidth = $w; 
　　　$newheight = $height * ($w / $width); 
　　}
　}
} else if ($height < $h && $width < $w) { // 両方オーバーしていない場合 
　$newwidth = $width; 
　$newheight = $height; 
} else if ($h < $height && $width <= $w) { 
　// 縦がオーバー、横は新しい横より短い場合 
　// 縦がオーバー、横は同じ長さの場合
　$newwidth = $width * ($h / $height); 
　$newheight = $h; 
} else if ($height <= $h && $w < $width) { 
　// 縦が新しい縦より短く、横はオーバーしている場合 
　// 縦は同じ長さ、横はオーバーしている場合 
　$newwidth = $w; 
　$newheight = $height * ($w / $width); 
} else if ($height == $h && $width < $w) { 
　// 横が新しい横より短く、縦は同じ長さの場合 
　$newwidth = $width * ($h / $height); 
　$newheight = $h; 
} else if ($height < $h && $width == $w) { 
　// 縦が新しい縦より短く、横は同じ長さの場合 
　$newwidth = $w; 
　$newheight = $height * ($w / $width); 
} else { 
　// 縦も横も、新しい長さと同じ長さの場合 
　// または、縦と横が同じ長さで、かつ最大サイズを超えない場合 
　$newwidth = $width; 
　$newheight = $height; 
}
```

# 参考サイト

* [PHP 画像の比率はそのままに縮小表示する](http://www.bhnt.co.jp/blog/%E9%96%8B%E7%99%BA%E8%A8%80%E8%AA%9E/php/php-%E7%94%BB%E5%83%8F%E3%81%AE%E6%AF%94%E7%8E%87%E3%81%AF%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E3%81%AB%E7%B8%AE%E5%B0%8F%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B/ "PHP 画像の比率はそのままに縮小表示する")
* [PHP 画像の比率はそのままに縮小表示する その2](http://www.bhnt.co.jp/blog/%E9%96%8B%E7%99%BA%E8%A8%80%E8%AA%9E/php/php-%E7%94%BB%E5%83%8F%E3%81%AE%E6%AF%94%E7%8E%87%E3%81%AF%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E3%81%AB%E7%B8%AE%E5%B0%8F%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B-%E3%81%9D%E3%81%AE2/ "PHP 画像の比率はそのままに縮小表示する その2")
* [PHPで画像を比率を保ったまま縮小する方法](http://ameblo.jp/chack-zenkai/entry-11058411201.html "PHPで画像を比率を保ったまま縮小する方法")
Windows 8.1 で VirtualBoX 4.3.14 が起動できないとき

## 対処
　[VirtualBox のフォーラム](https://forums.virtualbox.org/viewtopic.php?f=6&t=62615 "Virtualbox forum") に VirtualBoX 4.3.15 (build 95713) があったので，試してみたが解決せず…．まぁ，いろいろと問題があるみたいなので，VirtualBoX 4.3.12 に戻して様子をみることにする．次にアップデートするのは，3.16 が出てからかな．

## 原因
　MacType が悪いみたい．MacType を使わないと，Sublime Text 3 のフォントが欠けるので継続して使うことにする．

## Vagrant 1.6.4 にアップデート
`>vagrant rdp` が 動くようになったのが地味にうれしい．使い捨ての Windows 環境は，ありがたい．
メモ：Unityエディタ上でフィールドの表示・非表示。

Unity助け合い所で大前さんが説明してくださっていたので自分用にメモ

このあたりの事ってすぐに忘れる。。。。。


http://answers.unity3d.com/questions/34340/how-do-i-prevent-variables-being-displayed-in-the.html

[HideInInspector] アトリビュートをつければOKです。
反対に[SerializeField]アトリビュートで、privateの変数をインスペクタに出すことも出来ます。
http://qiita.com/momomo/items/f8c16004123f38e86fc0
iPhone から開発マシンの localhost にアクセスする（Windows）

スマホ用の Web 画面を作成する時、**実機での画面確認**が必要なケースがあります。

そんな時、開発マシンで起動している Web サーバーにスマホからアクセスする必要があるのですが、**サーバーによっては localhost や 127.0.0.1 からしか接続を受け付けない**ようなものがあります（IIS Express とか）。

今までは IIS のリバースプロキシを使って強引にアクセスしていたんですけど、**Fiddler プロキシが便利**だったので、そのやり方を紹介したいと思います。今回は、以下のように流れになります。

1. Fiddler を外部から接続できるようにする
1. iPhone のプロキシ設定で Fiddler を指定する
1. iPhone から localhost.fiddler や ipv4.fiddler にアクセスする


## Fiddler のプロキシを設定する

Fiddler を起動し "Rules" メニューから "Fiddler Options" を開きます。ダイアログの "Connections" タブに **"Allow remote computers to connect"** というチェックボックスがあるので、チェックを入れて再起動すると設定は完了です。これで、外部のクライアントから開発マシンで起動した Fiddler のプロキシを通すことができるようになります。**ただし、Fiddler を終了するとプロキシが無効になるので、テスト中は Fiddler を起動し続ける必要があります**。


![2014-09-04_01h33_54.png](https://qiita-image-store.s3.amazonaws.com/0/46109/87d8516f-4342-2d08-5716-8de9ff4edfd4.png)



## iPhone が Fiddler のプロキシを使うように設定する

まず iPhone を開発マシンにアクセスできる WiFi に繋いでください。その WiFi の設定画面の下の方に HTTPプロキシの設定があるので、"手動" を選択し、「サーバー」に開発マシンの IP アドレス、「ポート」に "8888" を設定します。認証は設定しなくて大丈夫です。これで、iPhone の通信が開発マシンの Fiddler を経由するようになりました。


![IMG_1328-1.png](https://qiita-image-store.s3.amazonaws.com/0/46109/9b0083b4-26be-06e5-495f-44faae3faa74.png)



## Safari から開発マシンの localhost にアクセスする

以上で設定は完了しているので、後は localhost や 127.0.0.1 にアクセスするやり方ですね。
Fiddler には以下のようなドメインの書き換え機能があるので、これを利用します。

* **localhost.fiddler → localhost**
* **ipv4.fiddler → 127.0.0.1**

例えば、開発マシンで起動している Web サーバーが 127.0.0.1 の 8080 をリッスンしている場合は http://ipv4.fiddler:8080/ でアクセスすることが可能です。
https でも問題なく、サーバーが localhost の 8443 をリッスンしている場合は https://localhost.fiddler:8443/ にアクセスします。

ですので、Safari の画面を開いて、上の URL 欄に http〜 の打ち込めば、開発マシンの Web サーバーにアクセスすることが可能になります。


![IMG_1329-1.png](https://qiita-image-store.s3.amazonaws.com/0/46109/8ee3705a-6bee-7ccc-2d85-1c73d52dd11e.png)


もちろん、Fiddler を通しているので開発マシンで起動している Fiddler には iPhone の通信がキャプチャされるようになります。Fiddler はデフォトルで通信をバッファリングしているので、通信速度が気になるようであれば、ツールバーにある **Stream** ボタンを有効にすると少し快適になるかもしれません。

**（追記）** Fiddler のキャプチャは止めておいてもプロキシは有効になるようです。

![2014-09-04_11h53_10.png](https://qiita-image-store.s3.amazonaws.com/0/46109/9e8a12d8-c3f3-3474-0ee2-a5ef2b4cb2a2.png)



# 最後に

今回は iPhone で説明しましたが、開発マシンの localhost や 127.0.0.1 に外部からアクセスしたいケースはちょくちょくあると思うので、そういう場合は外部のクライアントのプロキシを Fiddler に設定することで同じようにアクセスすることが可能になります。

ちなみに、Fiddler の外部からのアクセスを受け付ける機能は、外部のクライアントの通信を追いたい時に使うのが正しい使い方ですので、こちらもご利用ください。
AmazonLinuxでselenium-webdriverを動かす

# この記事は既にOut-Datedです
新しい情報は https://gist.github.com/joekiller/4144838#gistcomment-1742288 にかかれています、こちらを御覧ください

> use Amazon Linux firefox-compat package instead:
> 
> Installing the EPLL yum repository:
> https://lambda-linux.io/#getting-started
> 
> Installing Firefox on Amazon Linux:
> https://lambda-linux.io/blog/2015/01/28/announcing-firefox-browser-support-for-amazon-linux/

----
# 以下古い情報
* ec2上でselenium-webdriverを動かそうとした場合以下の課題があります
 1. ec2にはブラウザ(ここではfirefox)がない
 1. ec2にはX(ディスプレイ)がない

## 実施内容
1. firefoxのインストール
1. Xvfbのインストール

#### 詳細
##### 1. firefoxのインストール
* [こちら](http://joekiller.com/2012/06/03/install-firefox-on-amazon-linux-x86_64-compiling-gtk/)で紹介されている gtk-firefox スクリプトがほぼそのまま使えました
* ただしfirefoxの配布方法が若干変わっているようで、URLの変更と解凍コマンドの変更が必要でした
 * [もとのURL](http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest/linux-x86_64/en-US/)からはDL出来なくなってるみたいです
 * 以前は.tar.gzだったパッケージが.tar.bz2になってるようです
* 変更箇所は以下の2カ所
 * 2014/09/04時点のfirefoxの最新は32.0でした
 * 元のスクリプトでは常に最新をインストール出来るようにしていたようですが同等のことはここではできません、適宜URLを変更してください


```
$ diff gtk-firefox.org gtk-firefox
42,43c42,43
<      wget -r --no-parent --reject "index.html*" -nH --cut-dirs=7 http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest/linux-x86_64/en-US/
<      tar xvf firefox*
---
>      wget -r --no-parent --reject "index.html*" -nH --cut-dirs=7 http://download.cdn.mozilla.net/pub/mozilla.org/firefox/releases/32.0/linux-x86_64/en-US/firefox-32.0.tar.bz2
>      tar jxvf firefox*
```

* gtk-firefoxスクリプトを用意したらそれをsudo付けて実行します

```
$ vi gtk-firefox
$ chmod 755 gtk-firefox
$ sudo ./gtk-firefox
```

###### インストール後firefoxが立ち上がらない場合(2015/01/06追記)

* インストール後、firefoxを起動しようとすると以下の様なエラーが出ることがあるようです

> $ firefox -v
> XPCOMGlueLoad error for file /usr/local/firefox/libxul.so:
> libXcomposite.so.1: cannot open shared object file: No such file or directory
> Couldn't load XPCOM.

* 読み込みに失敗しているパッケージをインストールすることで解消できました

> $ yum search libXcomposite
> $ sudo yum install libXcomposite.x86_64 
> 
> $ firefox -v
> Mozilla Firefox 34.0.5

###### 備考
* gtk-firefoxスクリプトの実行はそれなりに時間がかかります
 * 実運用環境は別にして、インストール時はそれなりのインスタンスを用いることをお勧めします
 * [こちら](http://qiita.com/alingogo/items/6d5b8d28e5e063fe0b12)によると、microインスタンスでやろうとすると１時間以上かかるとか


##### 2. Xvfbのインストール

```
$ sudo yum install xorg-x11-server-Xvfb.x86_64
```

----

### おまけ
* 古いselenium-webdriverを使っている場合、firefoxのバージョンによってはエラーが起きるようです

```
unable to obtain stable firefox connection in 60 seconds (127.0.0.1:7055) (Selenium::WebDriver::Error::WebDriverError)
```

* firefox 32.0 にしたところ、selenium-webdriver 2.38.0 のテストが失敗しました
* そしてfirefoxを 31.0 に戻したら解消しました、お気をつけ下さい
Gitで昔消した名前がうろ覚えのファイルを復元する

昔いらないと思って消したファイルが必要になった時の戻し方。

```
git log --diff-filter=D --summary
```

で消したファイルのログが全て出るので、コミット名と正確なファイル名を探す。

判明したファイル名とコミット名を使ってファイルを復元する。

```
git checkout ${commit}~1 foobar.rb
```

### 愚痴
めんどくさいからDropboxみたいに削除済みのファイルも含めて探せるUI欲しいなあ。あるのかなあ。
homebrew で Ruby の require 関連のエラーが出た時の対応

====

```bash
$ brew list
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:45:in `require': /usr/local/Library/Homebrew/download_strategy.rb:88: invalid multibyte escape: /^\037\213/ (SyntaxError)
invalid multibyte escape: /^\037\235/
invalid multibyte escape: /^\xFD7zXZ\x00/
```

というエラーが出る原因と対応方法。

# 原因

エラーの原因は homebrew インストール後に、Ruby のバージョンを上げたこと。

# 解決方法

こうなると、`brew doctor` しても同じエラーが出るしどうしようもなくなる。当然 `brew update` もできない。

これを解決するために brew コマンドの shebang を書き換える。

brewコマンドの場所は `where` なりで探していただければ良いかと(だいたい `/usr/local/bin/brew`)。

このファイルの1行目を、以下のように変更する。

```ruby
#!/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby
```

こうすることで、問題のエラーはでなくなるので、

```bash
$ brew update
```

してあげれば、新しいバージョンの Ruby に対応した homebrew にアップデートできる。さきほど修正した brew コマンドは新しいものに上書きされているはずなので、戻す必要はない。
初めてコードレビューされる人のためのpull requestとcommitの作り方

## pull requestの作り方について
作業途中でもpull request作ったほうがいい。
作業途中だと分かるようにwantedlyだと、[WIP]とかタイトルの最初につけてる

### タイトルに書くこと
* 作業の内容が分かるタイトル

### descriptionに書くこと
* **WHY WHAT**を必ず書く
* Viewに変更がある場合は、**スクリーンショットを貼る**
* 関連のissueやpull reqeustへのリンクがあれば書く
* コードだけで分かりにくい箇所の説明(できるだけコードだけで分かるほうがいいけど)
* イメージは、初めてpull requestを見る人がmergeする上で必要な判断ができる情報があること。
* どの作業をしているか、残っているか分かるように、マークダウンで**チェックリスト作る**

## git commitの方法について
僕自身まだまだcommitの単位は汚いので、今の僕レベルで気をつけていることを書いてます。

### できるだけ小さい単位でcommitする。
* いろいろな作業を同時にせずにひとつひとつ作業する
    * モデルを作るとか、モデルのあるメソッドを実装するとか
    * モデルのあるメソッドとそのテストを実装するとか
    * あるコマンドを実行してファイルを生成したとか(rails g ~~)
* あとでcommitとコメント見ると、なにをしたか分かるってのをできるだけ目指す
* ひとつひとつ小さい単位でコードを書く方が綺麗なコードになりやすい。
* commitを見て、分かりにくい箇所はコード上にコメントもしくは、参考にしたリンクを貼るといい
* イメージは、commitはよりレビューをしやすくするためのもので、そのためにひとつひとつの作業の内容と作業の流れが分かるように作るって感じ。

### できるだけバグがないcommit
* 理想はそれぞれのcommitで動くほうがいい
* (fixのcommitはどうしても発生してしまうけど)

### 実装している途中に間違えたとき
* 本当に全部削除するなら、commitごとなくすのがいい
* fixであれば、本当に読む人のことを考えるとrebaseして修正とかもできるけど、そこまでせずに、fixのcommitをすればいい

### レビューの指摘の修正をするとき
* それぞれのcommentに対してcommitを作る。
* 特にレビューの指摘が治ったか見るときは、commitを見て治ったか確認するほうが楽なため。
* commentしたのに漏れることもあるため、修正したらgithubのコメントに対してコメントを返す。治したとか簡単でいいので。
* 追加で修正したいことなどある場合は、pull requestへのcommentでタスクリスト作るといい。

### そもそも
* あまり大きなpull requestは作らないほうがいい 
* 巨大pull requestを避ける9個のポイント http://qiita.com/reikubonaga/items/ac123bed89cf2b55a510

## インターン生・未経験者向け投稿
以下も同じように、これからスキルを身につけたい人向けに開発インターンで役立つことを書いています。

* 開発インターンで気をつける5つのポイント http://qiita.com/reikubonaga/items/d00c179957d57f48bf73
* rails開発に加わる前に学んで欲しいこと http://qiita.com/reikubonaga/items/60b4f6ee0a86ed06e83b
* 技術面接を受ける前に確認しておくといいこと https://www.wantedly.com/companies/wantedly/post_articles/42207
[Rails 4.x] Devise で Sign Out が Routing Error になる際の対応。（method の delete が get になる場合）

Rails4でのユーザー認証に、Deviseを使用しています。
Deviseでサインアウトする際に、Routing Errorが発生しました。

# 問題

routingでは以下の様になっています。

```
destroy_user_session DELETE     /users/sign_out(.:format)                         devise/sessions#destroy
```

viewは以下の感じです。

```erb:header.html.erb
<%= link_to "ログアウト", destroy_user_session_path, method: :delete, :class => 'navbar-link'  %> 
```

# 対応

delete が動かないので、get
以下を config/routes.rb に追記。

```rb:config/routes.rb
  devise_scope :user do
    get '/users/sign_out' => 'devise/sessions#destroy'
  end
```

こうすると、routingが新しく足されて、/users/sign_outを上書きする形になります。

```
users_sign_out GET        /users/sign_out(.:format)                         devise/sessions#destroy
```

viewは書き換えても変えなくてもいいですが、一応変えます。

```erb:header.html.erb
<%= link_to "ログアウト", user_sign_out_path, method: :delete, :class => 'navbar-link'  %> 
```

# 原因

はっきりわかっていませんが、Herokuアプリはdeleteに対応していないとか。。。

# 参考

http://stackoverflow.com/questions/20819230/devise-signout-link-issue-rails4
モバイルブラウザのビデオ再生でアプリキャッシュが使えるかを再度検証

(2016/7/25): *最近のChromeやSafariでのアップデート関連を[新しい記事](http://qiita.com/tomoyukilabs/items/cb9dd1d3e7eb0cc7f58a)にまとめてみました。*

モバイルブラウザでは、`<video>`タグを使ってビデオの再生を行うとき、ユーザに無断でダウンロードを開始して通信料金が過剰にかからないようにするために、`preload`属性を指定しても無効になるようになっています。

ですが、ユーザが再生を開始するためにボタンをクリックしてからバッファリングを開始するのではなく、先にダウンロードを始めておいて、ユーザが操作するときにはダウンロードが完了していて、ボタンをタップすれば即座に再生が開始される、といった動作を実現させたい場合もあるのではないでしょうか。

そこで、第一歩目として、HTML5のアプリケーションキャッシュが本当に`<video>`タグで上手く活用できないのか、iOSとAndroidで検証してみたいと思います。

# とりあえず、やってみた

```html:sample.html
<!DOCTYPE html>
<html manifest="cache.manifest">
  <head>
    ...
    (中略)
    ...
  </head>
  <body>
    <video controls>
      <source src="video.mp4">
      <source src="video.webm">
    </video>
  </body>
</html>
```
```text:cache.manifest
CACHE MANIFEST
# version 0.1
sample.html
video.mp4
video.webm
```

単純に、このような感じでマニフェストを用意して、iOSのSafariやAndroidの標準ブラウザ、Chrome、Firefoxで再生してみると...、`<video>`タグはキャッシュを完全に無視して、最初からバッファリングを開始して再生しようとしてしまいます。

## 本当にキャッシュされないのか?

実は、マニフェストが無視されるわけではなく、キャッシュ自体は機能しているようで、ブラウザには読み込まれるにもかかわらず、`<video>`タグは無視して自らコンテンツをダウンロードしようとする、ということのようです。

# 少し細工してみた

それならば、HTML上では`<video>`タグの再生ファイルの場所を明示せず、**キャッシュが完了してからJavaScriptでファイルの場所を与えてやる**とどうなるか、確かめてみます。

```html:sample.html
<!DOCTYPE html>
<html manifest="cache.manifest">
  <head>
    ...
    (中略)
    ...
    <script src="cache.js"></script>
  </head>
  <body>
    <video id="video" controls></video>
  </body>
</html>
```
```js:cache.js
function setVideo() {
  var v = document.getElementById('video');
  v.src =
    (v.canPlayType('video/mp4; codecs="avc1.640029,mp4a.40.2"') == 'probably') ?
      'video.mp4' : 'video.webm';
}

function update() {
  var c = window.applicationCache;
  if(c == c.UPDATEREADY) {
    c.swapCache();
    setTimeout(function() {
      location.reload();
    }, 2000);
  }
}

window.addEventListener('load', function() {
  var c = window.applicationCache;
  c.addEventListener('cached', setVideo, false);
  c.addEventListener('noupdate', setVideo, false);
  c.addEventListener('updateready', update, false);
}, false);
```

で、マニフェストも更新。

```text:cache.manifest
CACHE MANIFEST
# version 0.2
sample.html
video.mp4
video.webm
```


コードは適当なので多少間違いや不備があるかもしれませんが...
さて、このようにするとどうなったかといいますと...

* iOS Safariの場合、再生ボタンをタップすると、キャッシュされた動画が即座に再生されます。
* Android (標準ブラウザ、Chrome、Firefox)の場合、依然として、キャッシュが無視され、一からバッファリングをやり直して再生しようとします。

# 以上、まとめ

そういうわけで、**iOS Safariでは、キャッシュが完了してから、`src`属性にファイルの場所をJavaScriptで後から指定してやると、キャッシュを参照して再生してくれる**、ということになるようです。**しかし、Androidではどうあがいてもキャッシュから動画を再生してくれない**、ということにもなってしまいます。

そうなると、Androidでは他に手立てはないのだろうか、ということになりますが...続きは次の機会に。
多段sshを行うときに、ローカルの秘密鍵を参照し続ける


#目的: sshを使い複数のサーバーにログインする
##要請

- 複数のサーバーを経由した場合でも楽に目的のサーバーにログインしたい
- ユーザー名,ホスト名の入力を省略したい
- 鍵認証を利用する場合目的のサーバーによって鍵を自動で使い分けたい
- 多段sshで鍵を利用するときに、常に自分のローカルマシンの秘密鍵を参照したい *((A→B→C)でログインするときにCはBではなくAの鍵を参照するようにしたい)*
- 長時間サーバーにログインしていても通信が切れないようにしたい
- X11を利用したい
- ２つ目の接続は1つ目の接続を利用し認証をスキップしたい

>※公開鍵認証とはパスワード認証ではない認証方式である(安全性が高い)。

>公開鍵の概念http://www.adminweb.jp/web-service/ssh/index4.html
>公開鍵の利用http://qiita.com/lasta/items/41e95a2fdded18c34dae 

# ssh設定ファイルの構造
| ファイル名 | 役割 |
|:--------|:--------:|
|**~/.ssh/config**|ssh設定ファイル|
|~/.ssh/id_rsa|秘密鍵(鍵の役割)|
|~/.ssh/id_rsa.pub|公開鍵(鍵穴の役割)|
|~/.ssh/authorized_keys|公開鍵の鍵束(実際、公開鍵の中身がテキストで羅列してある)|
|~/.ssh/known_hosts|過去に利用したサーバーのリスト|

鍵穴(公開鍵)をサーバ設置して、手元の鍵(秘密鍵)でログインする

#解決策
##~/.ssh/configの設定

###設定
####各マシーン
ローカルPC = macbook
サーバーA : ユーザー名=usernama1 ドメイン=aaa.ac.jp
サーバーB : ユーザー名=username2 ドメイン=bbb.ac.jp

つまりサーバーAにログインするには

```bash:shell
ssh username1@aaa.ac.jp
```
####公開鍵と秘密鍵(macbook 上で生成)
秘密鍵：macbook_rsa
公開鍵：macbook_rsa.pub
####やりたいこと
ローカルPC → サーバーA
ローカルPC → サーバーA → サーバーB

```bash:config
Host A
HostName aaa.ac.jp
User username1
IdentityFile ~/.ssh/macbook_rsa
ForwardAgent yes
ForwardX11 yes
ServerAliveInterval 300
ForwardX11Timeout 596h
ControlMaster auto
ControlPath ~/.ssh/mux-%r@%h:%p
ControlPersist 30m

Host B
HostName bbb.ac.jp
User username2
ProxyCommand ssh A nc %h %p
IdentityFile ~/.ssh/macbook_rsa
ForwardAgent yes
ForwardX11 yes
ServerAliveInterval 300
ForwardX11Timeout 596h
ControlMaster auto
ControlPath ~/.ssh/mux-%r@%h:%p
ControlPersist 30m
```
※Hostは自由に名前をつけて下さい

##使い方

まず鍵をssh-agentに鍵を登録する

```bash:shell
sudo ssh-add ~/.ssh/macbook_rsa
```
Aにログイン

```bash:shell
ssh A
```
Aを経由してBにログイン

```bash:shell
ssh B
```

#解説

|変数|意味|
|:---|:---|
|Host|サーバーのニックネーム|
|IdentityFile|使用する秘密鍵を指定
|ForwardAgent yes| ssh-agentを利用する
|ForwardX11 yes|X11の転送を行う
|ProxyCommand ssh A nc %h %p|Bに行くときはまずAを経由する
|ServerAliveInterval 300|300秒おきにシグナルを送り通信が自動で切断されるのを防ぐ
|ForwardX11Timeout 596h|X11のタイムアウト時間を596時間にして、自動でX11の転送が途切れるのを防ぐ
|ControlMaster auto<br>ControlPath ~/.ssh/mux-%r@%h:%p<br>ControlPersist 30m|同じサーバーに２つ目のsshを行った時に、1つ目のsshを利用して接続時間を高速にする(認証をスキップ)。<br>注:ControlPersist 30mを使い30mでタイムアウトを設定しておかないと、sshをログアウトした後も裏で通信が続いている状態になる
ssh-agent http://www.unixuser.org/~euske/doc/openssh/book/chap4.html#make-life-easy-with-ssh-agent
ssh-agentの注意点 [4.4.4. 認証エージェントを使う際の注意を参照] http://www.unixuser.org/~euske/doc/openssh/book/chap4.html#notice-with-ssh-agent
ControlMaster http://d.hatena.ne.jp/tmatsuu/20120707/1341677472
CentOS に epel リポジトリを追加する

```console
$ sudo yum install epel-release
```

[[CentOS-announce] The epel-release package is now available via Extras](http://lists.centos.org/pipermail/centos-announce/2014-September/020526.html "[CentOS-announce] The epel-release package is now available via Extras")

CentOS の extras に epel-release が追加されたので、もう RPM の URL を探す必要はありません。
【AWS】全世界に公開しているサーバがないかチェックするバッチ

AWSのセキュリティグループ設定でサーバを全世界に公開してしまって、ウイルス感染することがあったので、EC2-CLIを使って監視バッチ（Windows）を作成。
自PCから毎日起動で少しだけ幸せになれる、かも。

```lang:ec2-security-check.bat
rem Javaの設定
set JAVA_HOME=C:\Program Files\Java\jdk1.7.0_65
set PATH=%PATH%;C:\ProgramFiles\Java\jdk1.7.0_65\bin

rem EC2 CLIクライアントのインストールディレクトリの設定
set EC2_HOME=C:\ec2-api-tools-1.7.1.0
set PATH=%PATH%;C:\ec2-api-tools-1.7.1.0\bin

rem EC2 CLIの接続設定（東京リージョン）
set EC2_URL=https://ec2.ap-northeast-1.amazonaws.com
set AWS_ACCESS_KEY=[アクセスキー]
set AWS_SECRET_KEY=[アクセスパスワード]

rem セキュリティグループの確認

ec2-describe-group [セキュリティグループ] | findstr -i FROM | findstr -i 0.0.0.0

pause
```
削除されたファイルをまとめてステージに

たとえば、
``$ rake doc:app``
なんてしたときに大量に削除ファイルが発生することがある。
``$ git status``
見るたびに愕然としてました。

そんなときはこんなコマンドで削除ファイルをまとめてステージング。
``$ git rm $(git ls-files --deleted)``
AWS SDK for rubyでログを非表示にしたい

SQSの受信サーバ側で、ループ処理をいれたら通信結果がずっとでるようになってしまったので、それを抑制するためにAWS.configを以下のようにしました。

``` ruby
require 'aws-sdk'

AWS.config(
  :access_key_id => YOUR_ACCESS_KEY_ID,
  :secret_access_key => YOUR_SECRET_ACCESS_KEY,
  :logger => nil
)

sqs = AWS::SQS.new
```

こうするとAWSの通信ログが表示されなくなります。

また、ログレベルやフォーマットの変更も可能です。

``` ruby
AWS.config(
  :log_level => :warn,
  :log_formatter => AWS::Core::LogFormatter.colored
)
```

ログレベルの種類は以下の参考リンクをご覧ください。

参考: [Class: AWS::Core::Configuration](http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/Core/Configuration.html)
ファイルを作らずにCSVの文字列だけ生成する


CSVの文字列を生成してDBに保存しておき、
あとから任意のタイミングでファイルとして出力したい、ということがあったので。

`CSV.generate`を使うといいみたい。

```
csv = CSV.generate do |csv|
  csv << %w(name age sex)
  users.each do |user|
    csv << [user.name, user.age, user.sex]
  end
end
```
vagrant 1.6.4以下でcentos7を動かすとエラーが出る件対策

@hnakamur さんの記事[VirtualBox 4.3.14でCentOS7対応Guest Additionsをインストールする - Qiita](http://qiita.com/hnakamur/items/267ada029497e1c52a3e)にある通り。

* [vStone/vagrant-centos7_fix](https://github.com/vStone/vagrant-centos7_fix)
* 2014/9/4時点の最新
  * Virtualbox 4.3.14
  * Vagrant 1.6.4

```bash:vagrant-centos7_fixをインストール
vagrant plugin install vagrant-centos7_fix
```

# 動作確認

```bash:
vagrant init hfm4/centos7
vagrant up
```

エラーが出力されないことを確認。


* [vagrant pluginリスト](http://vagrant-lists.github.io/plugins.html)