OmniAICreator/Qiita-1.07M huggingface dataset:
cucumber から serverspec と ansible を呼んでみた

serverspec に before/after が欲しいなーと思っていたところ、[cucumberのstepsでserverspecをつかう](http://qiita.com/sawanoboly/items/ced6f7f1bfe2a26943c2)を拝見しまして。

cucumber ならシリアルに実行するので前後の処理を書けるのでこれでいいやと。step から ansible 呼べばインストールも終わるし一石二鳥。ということで試しに MixIn してみました。なお、ansible を呼ぶ方法は[こちら](http://ihassin.wordpress.com/2013/12/26/from-zero-to-deployment-vagrant-ansible-capistrano-3-to-deploy-your-rails-apps-to-digitalocean-automatically-part-0/)を参考にさせて頂いてます。 **6月15日追記** 強引な方法ですが ssh を使えるように変更しました。ローカルで実行する場合 set_serverspec_target() は不要です。詳細は末尾にて。

```features/support/env.rb
require 'test/unit/assertions'
require 'serverspec'
require 'net/ssh'

World(Test::Unit::Assertions)
World(Serverspec::Helper::Type)

include SpecInfra::Helper::Ssh
include SpecInfra::Helper::Debian

# serverspec-init の spec_helper.rb を改変
def set_serverspec_target(host)
  c = SpecInfra.configuration
  if ENV['ASK_SUDO_PASSWORD']
    require 'highline/import'
    c.sudo_password = ask("Enter sudo password: ") { |q| q.echo = false }
  else
    c.sudo_password = ENV['SUDO_PASSWORD']
  end

  if c.host != host
    c.ssh.close if c.ssh
    c.host  = host
    options = Net::SSH::Config.for(c.host)
    user    = options[:user] || Etc.getlogin
    c.ssh   = Net::SSH.start(host, user, options)
  end
end
```

フィーチャをさくっと書いてしまいます。

```gherkin:features/httpd.feature
フィーチャ: httpd をインストールしてチェック
背景:
  前提 対象のサーバは "myhost" である
シナリオ: インストールしてチェック
  もし "httpd" をインストールする
  ならば "httpd" がインストールされていること
```

いくらなんでももうちょっとマシなテストを書けないものか。。。
と、とにかくステップはこんなかんじで。

```rb: 
前提(/^対象のサーバは "(.*?)" である$/) do |arg1|
  @server = arg1
  server_spec_target(@server)
end

もし(/^"(.*?)" をインストールする$/) do |arg1|
  output = `ansible all -i #{@server}, -m yum -a 'name=httpd state=present'`
  assert $?.success?
end

ならば(/^"(.*?)" がインストールされていること$/) do |arg1|
   package(arg1).should be_installed
end
```


*2014/6/15追記*

ssh が動かなくてすごい苦労しました(3時間ぐらい ServerSpec, SpecInfra, RSpec を読み込んで)。理由を調べたところ SpecInfra が RSpec.configuration.add_setting :ssh してますが、この設定を cucumber からコールした場合に読めないためのようです。結果として RSpec.configuration.ssh が nil になってしまってます。SpecInfra は missing_method を使って RSpec.configuration からデータを取り出しているので、もう諦めて SpecInfra.configuration にぶち込んでしまったわけです。

なんにせよ動いたので、次はマルチホストに挑戦する予定です。describe の呼び方も宿題。
【node.js】nodebrewでnode.jsのインストールめも

node.jsのメリットって大きく２つかな。
・スケーラビリティーの高いアプリケーションを構築ができる
・何万の同時アクセスができる
勉強のためにさくっと構築したのでそのめもを残しました。
これでnode.jsもバージョン管理が簡単にできますね。

##nodeが既にインストールされているか確認
```
% node
% node -v
% which node
```
上記のコマンドで反応があったらnodeが既にインストールされているのでアンインストールする

##既にnode.jsがインストールされている場合は削除する
・brewでインストールした場合はbrewでアンインストール
```
% brew uninstall node
```
・node.jsのアンインストールスクリプト
```
curl -ks https://gist.github.com/nicerobot/2697848/raw/uninstall-node.sh | bash
```
参考 : https://gist.github.com/nicerobot/2697848
・上記でできなかった場合物理削除
```
rm -rf /usr/local/lib/node \
  /usr/local/lib/node_modules \
  /var/db/receipts/org.nodejs.*
```

##nodebrewをインストール
・まず[本家のサイト](https://github.com/hokaccha/nodebrew)を参考
・nodebrewインストール
```
% curl -L git.io/nodebrew | perl - setup
```
・パス追加も忘れずに
```
vim ~/.bash_profile
export PATH=$HOME/.nodebrew/current/bin:$PATH
```
筆者のログインシェルはzshなのでzshrcに追加しました。
・インストールするnodeのバージョン確認
```
% nodebrew ls-all
remote:
v0.0.1    v0.0.2    v0.0.3    v0.0.4    v0.0.5    v0.0.6
......
```
・バージョンを指定してインストールもできるけど、今回はstableバージョンをインストールする
```
% nodebrew install stable
```
現時点でのstableバージョンがv0.10.29でした。
・利用するバージョンを選択
```
% nodebrew use v0.10.29                                                                                                                                       
use v0.10.29
```
・インストール確認
```
% node -v                                                                                                                                                     
v0.10.29
```
Macからgitのリモートリポジトリにhttpsでアクセスして"is this a git repository?"と怒られる時

Macからhttps接続でリモートリポジトリに git push しようとして、

```
fatal: https://git.example.com/example.git/info/refs not valid: is this a git repository?
```

みたいな感じで怒られた時のメモ。
数時間ハマった。

原因は、

+ gitのcredential helperである **git-credential-osxkeychain** が有効になっていた
+ 過去に同じGitホスティングを別のアカウントで利用していて、その時の認証情報をキーチェーンが記憶していた

というオチ。

本来であれば、別途git-credential-osxkeychainをインストールして、

```
git config --global credential.helper osxkeychain
```

で設定しないと有効にならないはずだが、Homebrewでgitをインストールすると、ここまで有効になった状態で入るらしい。

対応としてはキーチェーンアクセスから該当レコードを削除すればよし。


エラーメッセージが分かりにくく、この内容では認証が原因とは思い当たりにくいので残しておく。
一応、デバッグ方法として、

```
$ GIT_CURL_VERBOSE=1 git push -u origin master
```

と指定すると通信ログが表示され、よく見ると認証の箇所で

```
Server auth using Basic with user 'hoge@fuga.com'
```

などとなっていることが分かる。
地図（MapKit）でアノテーションの吹き出し文字数制限をサブタイトルでごまかす方法


MapKitのアノテーションの吹き出しは文字数制限があり
それを超えると下記のように「...」と省略されてしまいます。

![スクリーンショット 2014-06-15 01.55.40.png](https://qiita-image-store.s3.amazonaws.com/0/32191/3b3c71c9-4ab1-ba7f-f25a-f73a60fa5f61.png "スクリーンショット 2014-06-15 01.55.40.png")

文字数制限自体を解除・緩和する方法は探した限り無いようでしたが
サブタイトルの表示領域を借りる事で見た目上最後まで表示させることは出来ました。

下記のように、当然文字サイズは小さくなりますが。。。

![スクリーンショット 2014-06-15 01.49.29.png](https://qiita-image-store.s3.amazonaws.com/0/32191/2e2d0a36-60c7-e57a-fa6f-4a7afa354959.png "スクリーンショット 2014-06-15 01.49.29.png")

方法は以下の通りです。

```lang:objective-c
-(void)setAnnotation:(CLLocationCoordinate2D)co radius:(double)radius placeID:(int)placeID mapMove:(BOOL)mapMove animated:(BOOL)animated detail:(NSString*)detail name:(NSString*)name
{
    CustomPointAnnotation *annotation = [[CustomPointAnnotation alloc] init];

//長いタイトルをサブタイトルでごまかす(nameはNSString)
    if (name.length >= 14) {
        annotation.title = [name substringToIndex:13];
        annotation.subtitle=[name  substringFromIndex:13];
    }

[self.mapView addAnnotation:annotation];
}

```

表示できるのは全角13字までだったので
「13字まで」と「13字以降」の文字列を取り出すNSStringのメソッドを利用します。
Homebrewでgnuplotを入れる


# 概要
Homebrewでgnuplotを入れました．aquatermとかqtとかpdf使えるようにします．


# ひとまず確認

`$ brew info gnuplot`でオプションを確認します．

```
--cairo
	Build the Cairo based terminals
--latex
	Build with LaTeX support
--nogd
	Build without gd support
--nolua
	Build without the lua/TikZ terminal
--pdf
	Build the PDF terminal using pdflib-lite
--qt
	Build the Qt4 terminal
--tests
	Verify the build with make check (1 min)
--with-x
	Build the X11 terminal
--without-aquaterm
	Do not build AquaTerm support
--without-emacs
	Do not build Emacs lisp files
--wx
	Build the wxWidgets terminal using pango
--HEAD
	install HEAD version
```

お好みで選択してください．今回は，`--latex --pdf --qt --with-x --without-emacs`にします．私はVim派です．

# AquaTermの導入
[こちら](http://sourceforge.net/projects/aquaterm/)より，AquaTermの最新版を落とします．dmgの中にpkgがあるので，インストールします．


# brew 

```
$ brew install gnuplot --latex --pdf --qt --with-x --without-emacs
```

勝手にaquaterm使えるようになってます．


# `gnuplot-lua-tikz.sty`のリンクを作成

せっかく`--latex`オプションつけて入れたのに`\usepackage{gnuplot-lua-tikz}`すると`LaTeX error: 'gnuplot-lua-tikz.sty' not found`とか言われるのでシンボリックリンクを貼ります．

```bash
sudo ln -s /usr/local/Cellar/gnuplot/4.6.5/share/texmf/tex/latex/gnuplot/gnuplot-lua-tikz.sty /usr/local/texlive/texmf-local/tex/latex/gnuplot/
```

- 参考：[Homebrew から gnuplot を入れると色々メンドかった話](http://qiita.com/t_uda/items/39f1fd470ea9a4780a74)

# 結果

- `gnuplot`で`set term`と打てば，terminalを一覧できるので，入れたかったものが入っているか見ることができます．
- デフォルトのterminalが`aqua`になってて嫌であれば，`~/.gnuplot`に`set term qt`とか書いておけば好きなやつに変えられます．
- terminalを`qt`にして`splot`すると， **マウスでグリグリできませんでした**
    - というか，視点の移動がマウスポインタに勝手についてきます．
    - `m`を押せば視点の移動されなくなります．（マウスのon/offを切り替えるコマンドなので）
    - 使えるコマンドは`h`で出ます．
    - x11でもマウスでグリグリできなかった．

#### マウスでグリグリさせるやり方知ってたら教えて下さい

- terminalを`pdf`にすると，`plot`を続けるとpdfの次のページにプロットされます．

``` test.gnuplot 
set term pdf
set output "sample.pdf"
plot sin(x)
plot cos(x)
plot tan(x)
```

![スクリーンショット 2014-06-15 1.47.09.png](https://qiita-image-store.s3.amazonaws.com/0/35173/99d5144e-72e5-4ab4-407a-d6ed91fdf9e4.png "スクリーンショット 2014-06-15 1.47.09.png")
JavaScriptでの変数型判定でtypeofより短い判定式を思いついたのでメモ


## 注意

この記事の方法は、**`typeof`での変数判定と同じくプリミティブ型の変数判定しか出来ません**。
勢いで投稿してみましたが、利点は`typeof`より字数が少ない点ぐらいしかありませんでした。
また、数値、文字列、Booleanの判定以外は出来ません。数値にいたっては、`NaN`を数値と判定出来ないようです。
発想の一つとしてとらえ、実用案件では採用しないで下さい。

## 本文

~~JavaScriptで正確な型判定を行うには、`Object.prototype.toString.call`を使う。だが、これはそれなりに長い。
そこで、つい~~先程突然思いついた簡単な型判定の方法を公開しようと思う。

なお、この方法は`Boolean`以外は**実際に検証を行っていない**が、
原理は非常にシンプルなのでおそらく正常に動作するものと思われる。

```js:Booleanの判定
if (!!val === val) {
    console.log('変数 val はBooleanです。');
} else {
    console.log('変数 val はBooleanではありません。');
}
```

```js:数値の判定
if (+val === val) {
    console.log('変数 val は数値です。');
} else {
    console.log('変数 val は数値ではありません。');
}
```

```js:文字列の判定
if ('' + val === val) {
    console.log('変数 val は文字列です。');
} else {
    console.log('変数 val は文字列ではありません。');
}
```

以上。

## 解説

JavaScript tipsなどで見かける変数型変換の短縮構文を用い、
判定したい型に強制的に変換したものと元の値が一致するか比較している。

### 注意

この際、厳密等価演算子`===`を用いていることに注意。
誤って等価演算子`==`を用いると、比較時にも型変換が行われてしまい、意味がなくなる。

## あとがき

これについて、誤りや意見などがある場合、コメントにて書き込んで欲しい。
std::sortを用いて，自作クラスを格納したshared_ptrを格納したstd::vectorのソートを行う

アアアアア良い題名にならない！！！

#動機
作ってるゲームのクラスが複数情報を持っており，そのvectorを各々の情報でソートしたいけど面倒でござる．


#何をどうするんですか
std::sortにvectorのbeginとendと比較用lambdaを叩き込む．
環境はVS2013です．

#実際にやってみた
```c++:SortTest.cpp
#include <memory>
#include <vector>
#include <algorithm>
#include <iostream>
#include <string>

struct SortTarget{
	SortTarget(int num, std::string name){
		_number = num;
		_name = name;
	}
	int _number;
	std::string _name;
};

const int TARGET_SIZE = 5;

void Output(const std::vector<std::shared_ptr<SortTarget>> &targetArray, const std::string &outName){
	std::cout << outName << std::endl;
	for (auto outputData : targetArray){
		std::cout << outputData->_number << ", " << outputData->_name << std::endl;
	}
	std::cout << std::endl;
}

int main(void){
	std::vector<std::shared_ptr<SortTarget>> targetArray;
	std::string nameArray[TARGET_SIZE] = {"aab", "abc", "a", "ac", ""};
	
	for (int i = 0; i < TARGET_SIZE; i++){
		targetArray.push_back(std::make_shared<SortTarget>(i, nameArray[i]));
	}

	Output(targetArray, "Start");

	std::sort(targetArray.begin(), targetArray.end(), [](const std::shared_ptr<SortTarget> &left, const std::shared_ptr<SortTarget> &right){
		return left->_name.compare(right->_name) < 0;
	});

	Output(targetArray, "NameSort");

	std::sort(targetArray.begin(), targetArray.end(), [](const std::shared_ptr<SortTarget> &left, const std::shared_ptr<SortTarget> &right){
		return left->_number < right->_number;
	});

	Output(targetArray, "NumberSort");

	return 0;
}
```

出力は

```text:output
Start
0, aab
1, abc
2, a
3, ac
4, 

NameSort
4,
2, a
0, aab
1, abc
3, ac

NumberSort
0, aab
1, abc
2, a
3, ac
4,
```
となります．

やってることは

1. _numberと_nameを持つクラスのvectorを作成，
1. _nameでソート
1. _numberでソート

で，それぞれの結果を出力しています．

lambdaは正直よくわかってませんが，[]は何か適当に置いておいて，()には比較なので2つのvectorに格納した要素を宣言して，{}で適当な比較を書いてtrueかfalseを返せば良い，という程度の認識で使えました（今回の用途については）．

lambda，正直なんだかよくわからぬという印象でしたが，今回使った感じは簡単にソートできて非常に満足しました．
Gitlab rpm でインストール

自宅で導入テストした際の記録

# 環境
* CentOS release 6.5 (Final)
    * ※VirtualBox上

## OS 設定
* IP： `192.168.0.10`
* Firewall： 検証用なので、今のところ無し

以下、URL は適当に読み替えてください。

# インストール
* gitlab-6.9.2_omnibus.1-1.el6.x86_64.rpm

## 公式URL
* https://www.gitlab.com/downloads/
* https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/README.md#centos-6-5


## インストール手順
1. yum install -y openssh-server postfix
1. wget https://downloads-packages.s3.amazonaws.com/centos-6.5/gitlab-6.9.2_omnibus.1-1.el6.x86_64.rpm
1. sudo rpm -i ./gitlab-6.9.2_omnibus.1-1.el6.x86_64.rpm
1. gitlab-ctl reconfigure


## 初期設定
### 応急処置的な手順
1 sudo service iptables stop

### ウェブ画面から
http://192.168.0.10/ にアクセスしてログイン

* User： `admin@local.host`
* Password： `5iveL!fe`

あとはお好みでユーザ作成したり

## 設定変更
### ホスト名修正
ここで、ホスト設定がおかしいことに気がつく
project_clone の URL が http://localhost/heignamerican/... となっていて超不便。
とりあえず IP で応急処置

```
~$ cat /etc/gitlab/gitlab.rb
   external_url "http://192.168.0.10"
~$ gitlab-ctl reconfigure
```

# 今後
* ssh 対応
* CI 連携
    * マージリクエスト、自動テスト連携させないと不便そう
* redmine とかと連携
    * これは別インスタンスでやった方がよさげ？
* iptables ちゃんとする
RuboCop | Style/AccessModifierIndentation

# RuboCop | Style/AccessModifierIndentation

## 概要
RuboCopの「Style/AccessModifierIndentation」警告について。

この警告は public/protected/private のアクセス修飾子のインデントが
好ましくない場合に発生します
## Bad Case
~~~ruby
# Hoge
class Hoge
   public

  def public_hoge
  end

    protected

  def public_hoge
  end

private

  def public_hoge
  end
end
~~~

check

~~~bash
$rubocop bad.rb
Inspecting 2 files
C.

Offenses:

bad.rb:3:4: C: Indent access modifiers like public.
   public
   ^^^^^^
bad.rb:8:5: C: Indent access modifiers like protected.
    protected
    ^^^^^^^^^
bad.rb:13:1: C: Indent access modifiers like private.
private
^^^^^^^

2 files inspected, 3 offenses detected
~~~

## Good Case
~~~ruby
# Hoge
class Hoge
  def public_hoge
  end

  protected

  def public_hoge
  end

  private

  def public_hoge
  end
end
~~~

~~~
$rubocop good.rb
Inspecting 1 file
.

1 file inspected, no offenses detected
~~~

## 補足
この警告は `rubocop -a` で修正可能です。
DockerhubのAutomated buildを試す

# Automated Buildとは
新しく立ち上がったDocker Hubは、ただのイメージの集積所ではなくBuildもできるようになった。
github、BitBacketと連携して、そこにあるリポジトリの状態から勝手にBuildしてくれる。 

今回はtypesafe-activatorを取り込んだイメージを作るDockerfileを書いて、githubにpush、Docker Hubでbuildしてみた

https://github.com/JAGAxIMO/docker-typesafe-activator
https://hub.docker.com/

# Dockerfileをgithubにpush
こんなDockerfileを書いた。眠い目こすってやってたのでひどい事になってる
今回は @ringo さんの`ringo/scientific`をベースに使ってみた

```bash
FROM ringo/scientific:6.5
RUN yum install -y wget unzip
RUN mkdir -p /home/src/ && cd /home/src && wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u5-b13/jdk-8u5-linux-x64.rpm && rpm -ivh jdk-8u5-linux-x64.rpm 
RUN cd /home/src && wget http://downloads.typesafe.com/typesafe-activator/1.2.2/typesafe-activator-1.2.2.zip && unzip typesafe-activator-1.2.2.zip
RUN ln -s /home/src/activator-1.2.2 /usr/local/lib/activator && ln -s /usr/local/lib/activator/activator /usr/local/bin/activator
```
これとREADMEとLICENSEをでっちあげて git push

# Automated Build
![add_repository.png](https://qiita-image-store.s3.amazonaws.com/0/24972/c71872ce-ebbd-6f9b-a62e-dcc0e2745071.png)
[Docker Hubのトップページ](https://hub.docker.com/)の右上にADD Repositoryというボタンを押すと、こんな感じでAutomated Buildが選択できる

![select.png](https://qiita-image-store.s3.amazonaws.com/0/24972/7baa8c16-ad73-1817-07e7-cdbc8fc3e80c.png)
こんなページにいくので、そのままgithubを選択し、buildしたいDockerfileがあるリポジトリを選択

![build_propaties_choice.png](https://qiita-image-store.s3.amazonaws.com/0/24972/f60a9ee5-e7f5-a527-48b9-69474258bb99.png)

ここで設定して、そのまま進めれば、あとは勝手にbuild待ちのキューに積まれる
キューに積まれた時、![build_que.png](https://qiita-image-store.s3.amazonaws.com/0/24972/92761ec1-1a39-525d-bac3-2d19aee23443.png)
これはbuild待ち5番目の図。最初buildした時は240人待ちで全然buildされなかった

![build_status.png](https://qiita-image-store.s3.amazonaws.com/0/24972/79e169d7-b2c1-ab16-b099-2785439d7735.png)

build途中のステータス。Pushingになってるから、buildはパスしてリポジトリにあげている最中っぽい

![build_finish.png](https://qiita-image-store.s3.amazonaws.com/0/24972/c9c559fa-b3d4-7efd-39ac-102b4470ffd5.png)

buildが終わった。Logが出てる

これで、リポジトリが出来上がる。便利

# 試せていないけれど出来そうなこと

DockerhubにWebHookとBuild Triggerがあるので

1. masterにpull requestをマージする
2. CIツールでgithubのマージイベントのHookをキャッチし、Build Triggerをcurlで叩いてBuild開始
3. Docker HubのWebHookをCIツールでキャッチして、リポジトリをPull & Run

とかできそう
各種SNSへのシェアボタン設置方法まとめ


# (自作ボタンで)facebookシェア
```html
<a href="http://www.facebook.com/sharer.php?u=`シェアしたいurl`&amp;t=`シェアしたいタイトル`"
onClick="window.open(encodeURI(decodeURI(this.href)),
      'sharewindow',
      'width=550, height=450, personalbar=0, toolbar=0, scrollbars=1, resizable=!'
      ); return false;">

    `シェアボタンに相当する画像や文言など`

</a>
```
シェアした時の画像や文言などは、ogp（オープングラフプロトコル）に従う。
facebookにはキャッシュがあり、facebookキャッシュを削除しないと各種変更が反映されないこともあるので注意。

▼facebookキャッシュの削除は、下記urlから
https://developers.facebook.com/tools/debug/

# (デフォルトボタンで)facebookいいね、シェア
- iframeによる実装
- javascriptによる実装

の2通りやり方がある。経験的に、iframeで埋め込んだ方がボタンの表示スピードが速い。
下記urlを参考に必要事項を記入すると、埋め込みurlを取得できる。
　↓
https://developers.facebook.com/docs/plugins/like-button




# (自作ボタンで)twitterツイート
```
<a href="http://twitter.com/intent/tweet?text=`ツイートに入れたいテキスト`&amp;url=`入れたいurl`&amp;via=`入れたいアカウント名`"
      onClick="window.open(encodeURI(decodeURI(this.href)),
      'tweetwindow',
      'width=550, height=450, personalbar=0, toolbar=0, scrollbars=1, resizable=1'
      ); return false;">

    `シェアボタンに相当する画像や文言など`

</a>
```

# (デフォルトボタンで)twitterツイート、フォロー
- iframeによる実装
- javascriptによる実装

の2通りやり方がある。経験的に、iframeで埋め込んだ方がボタンの表示スピードが速い。
下記urlを参考に必要事項を記入すると、埋め込みurlを取得できる。
　↓
https://about.twitter.com/resources/buttons

（data-count="vertical"のパラメータを追加すればbox_countの縦表示が可能）

# (自作ボタンで)ameblo投稿
```
<a href="http://blog.ameba.jp/ucs/entry/srventryinsertinput.do?
entry_text=`本文に入れたい文言`" target="_blank">

    `シェアボタンに相当する画像や文言など`

</a>
```

本文に入れたい文言は`%エンコーディング`して表記すること。
下記urlは%エンコーディングの際に便利。
　↓
http://www.tagindex.com/tool/url.html

# (デフォルトボタンで)はてぶ登録
下記urlを参考に必要事項を記入すると、埋め込みurlを取得できる。
　↓
http://b.hatena.ne.jp/guide/bbutton

# (デフォルトボタンで)google+登録
下記urlを参考に必要事項を記入すると、埋め込みurlを取得できる。
　↓
https://developers.google.com/+/web/+1button/?hl=ja
sqliteからpostgresへの移行


ローカルの開発環境で作成していたWebサービスをHeroku上で動かすため、
sqliteのデータベースをpostgresに変換したので、その時にしたことをメモ。
sqliteのデータベースの中身をそのまま移行するというより、
データベースのテーブル作成等の手間を楽にする為の手順(だと思う)。

## ローカルにpostgresの環境構築

### postgresqlをダウンロードしてインストール

  http://postgresapp.com/

### 環境変数の変更

.bash_rcに以下を追加

```
export PATH="/Applications/Postgres93.app/Contents/MacOS/bin:$PATH"
```

### postgresに慣れておく

- ドットインストールでpostgresの基本操作を一通り覚える

http://dotinstall.com/lessons/basic_postgresql

### 参考URL

  https://devcenter.heroku.com/articles/heroku-postgresql#local-setup

## sqliteのデータベースをpostgresのデータベースへ変換

### sqliteのデータベースに対する操作をダンプ

sqlite3 <dbfile> .dump > sqlite_dumpfile.sql

### 型の修正

- id integer primary keyを変更

id integer primary key -> id serial primary key

http://stackoverflow.com/questions/4581727/convert-sqlite-sql-dump-file-to-postgresql

### postgresのデータベースの作成

- データベースの作成

$createdb "dbname"

- 作成したデータベースに接続

$psql "dbname"

- sqlite3でダンプしたファイルを読み込む

=#\i ./sqlite_dumpfile.sql


## heroku上のデータベース初期化

- heroku上のデータベースに接続

heroku pg:psql

- ローカルと同様にダンプしたファイルを読み込む

=#\i ./sqlite_dumpfile.sql
Chef の only_if / not_if でハマった。

よくよく考えてみると当たり前なのですが、案外ハマる可能性があるかと思ったので共有しておきます。

Chef では、`execute` リソースや `script` リソースなどで、どうしても独自でスクリプトを動かしたいときがあると思います。その場合、冪等性は保証されないので、自分でがんばる必要があります。

たとえば、`/tmp/to_be_appended` を `/etc/whatever.cfg` に追記するという処理をレシピに入れたいとします。実行するたびに追記されたら困るので、追記した内容のうち目印となる文字列を grep してなければ追加する、という条件をいれます。ここでは、追記するファイルに `# ADDED` があるとします。そこで、最初、私はこういう書き方をしました。

```rb
execute "Add a content of /tmp/to_be_appended to /etc/whatever.cfg" do
   command "cat /tmp/to_be_appended >> /etc/whatever.cfg"
   not_if { "grep '# ADDED' /etc/whatever.cfg" }
end
```
これが動かなくてハマりました。先に答えを言いますと、

```rb
execute "Add a content of /tmp/to_be_appended to /etc/whatever.cfg" do
   command "cat /tmp/to_be_appended >> /etc/whatever.cfg"
   not_if "grep '# ADDED' /etc/whatever.cfg"
end
```

が正解となります。 **大事なのは`not_if` の後ろの`{``}`です。** `only_if` と `not_if` はブロックも文字列も引数としてとることができます。しかし当然のことながら動きが違うわけです。整理しますと、

- ブロックの場合は、中身を評価した結果
- 文字列の場合は、文字列をシェルで実行してその結果（`0`が成功、それ以外が失敗）

が渡されます。ですので、

```rb
    only_if { File.exists?("/path/to/must_exist") }
```
や

```rb
    only_if "grep httpd /etc/password"
```

のように使うのが正しい使い方です。  
ですので、一番最初に書いたような

```rb
    only_if { "grep something /path/to" }
```

としてしまうと、ブロック内は文字列であるため常に `true` となってしまいます。これをやってしまうと、`only_if` だと常に実行され、`not_if` だと全く実行されません。気をつけましょう。

ああ恥ずかしい。
コマンドラインでswiftモジュールを作成、リンクする

# Xcodeのtoolchainを使用して、コマンドラインでswiftモジュールを作成、リンクする方法

## PATHを通す

まず、PATHを通しておく。Xcode6-Betaの場合は

```bash
$ export PATH=/Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:$PATH
```

## swiftmoduleファイル作成

Hoge.swiftをモジュール名 Hoge でモジュール化する場合

```bash
$ swift -module-name Hoge -emit-module Hoge.swift
```

これで、Hoge.swiftmodule と Hoge.swiftdoc の2つのファイルが出来る。
これがあれば `import Hoge` が可能になるが、いざ実行してみるとシンボルが無いと言われてエラーになる。

## ライブラリファイル作成
実行時に必要となるダイナミックリンクライブラリを作成する。

```bash
$ swift -module-name Hoge -emit-object Hoge.swift
$ libtool -L/Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx -dynamic -lswift_stdlib_core -lc -o libHoge.dylib Hoge.o
```

これで、libHoge.dylib が出来る。
-Lに渡しているパスは、Xcode6-Beta の場合。
-lcは、 _memcpy, _memset のために必要。

以上でモジュール側の準備終了。

## リンクする

sample.swiftファイル内で `import Hoge` していて、これをコンパイルしてコマンドにする場合は

```bash
$ swift -I . -L . -lHoge sample.swift
```

-I に渡すパスはHoge.swiftmoduleのある場所、-Lに渡すパスはlibHoge.dylibのある場所。

これで `sample` コマンドが作成され、実行可能となる。

```bash
$ ./sample
```

sample.swiftをコマンドにコンパイルせず、いきなり実行する場合は -i オプションをつければ良い。
こちらの方がよく使いそう。

```bash
$ swift -I . -L . -lHoge -i sample.swift
```



swiftファイルを渡さず、REPLモードで対話的に実行したい場合は

```bash
$ swift -I . -L . -lHoge -integrated-repl
Welcome to swift.  Type ':help' for assistance.
(swift) import Hoge
(swift) var x = Hoge() // など、後はお好きなように
```
rbenvでBUILD FAILED


`The Ruby openssl extension was not compiled. Missing the OpenSSL lib?`ということでOpenSSL関連らしい。

## 環境

OSX10.9

## 流れ

まず確認して

```
$ rbenv install -l
...
1.9.3-rc1
2.0.0-dev
2.0.0-p0
2.0.0-p195
2.0.0-preview1
...
```

2系をインストール

```
$ rbenv install 2.0.0-p195
Downloading ruby-2.0.0-p195.tar.gz...
-> http://dqw8nmjcqpjn7.cloudfront.net/0672e5af309ae99d1703d0e96eff8ea5
Installing ruby-2.0.0-p195...

BUILD FAILED

Inspect or clean up the working tree at /var/folders/x5/q1xgqxbs4cx6__g7t072wg080000gn/T/ruby-build.20140614211418.64987
Results logged to /var/folders/x5/q1xgqxbs4cx6__g7t072wg080000gn/T/ruby-build.20140614211418.64987.log

Last 10 log lines:
installing default gems:      /Users/takoji/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0 (build_info, cache, doc, gems, specifications)
                              bigdecimal 1.2.0
                              io-console 0.4.2
                              json 1.7.7
                              minitest 4.3.2
                              psych 2.0.0
                              rake 0.9.6
                              rdoc 4.0.0
                              test-unit 2.0.0.0
The Ruby openssl extension was not compiled. Missing the OpenSSL lib?
```

OpenSSLがないと。でもHomebrewですでにインストール済み。

ここでいろいろ議論されてた。
https://github.com/sstephenson/ruby-build/issues/377

環境変数でbrewのopensslの方を見るように変えた。

```
$ CONFIGURE_OPTS="--with-openssl-dir=`brew --prefix openssl`" rbenv install 2.0.0-p195
Downloading ruby-2.0.0-p195.tar.gz...
-> http://dqw8nmjcqpjn7.cloudfront.net/0672e5af309ae99d1703d0e96eff8ea5
Installing ruby-2.0.0-p195...
Installed ruby-2.0.0-p195 to /Users/ryo/.rbenv/versions/2.0.0-p195
```

完了
MACxMAMPxcakePHPでPHPUnitをインストールする



##　前提条件
- 初心者向け
- マックにはPHPが最初からはいっている（usr/bin/php）
- terminalで.bashrcを編集しないとMAMP導入時でもPHPパスはマックのものを利用している（パスが通っていない状態）
- MAMPにはpearがはいっているが有効化はされていない
- MAMPにはPHPUnitはインストールされていない

### インストールする
#### 作業
[1] terminalでMAMPのPHPのパスを通す

	$ echo 'export PATH="/Applications/MAMP/bin/php/phpX.X.X/bin:$PATH"' >> ~/.bashrc
	$ source ~/.bashrc

[2] MAMP/bin/php/phpX.X.X/confのpear.confを消す

[3] PHPUnitをインストールする

	$ pear upgrade PEAR
	$ pear config-set auto_discover 1
	$ pear install pear.phpunit.de/PHPUnit-3.7.32

- 参考：http://qiita.com/who_you_me/items/251c18545fbfbe98d00d

#### ひっかかりやすい所
- PHPUnitはMAMP下にインストールする(```/Applications/MAMP/.../php```)のですが、MACには最初からPHPがはいっている(```/usr/bin/php```)ので、cakephpが参照するPHPのパスをMACのPHPからMAMPのPHPに変更しないといけない。（```.bashrcへの追記部分```）
- PHPUnitをインストールする前にPEARを最新版に変更しないといけないが、MAMPのPEARをアップグレードする前にconfにあるpear.confを削除しないといけない。
- CakePHPとPHPUnit4(最新版)は互換性がないので、PHPUnit3.7系をインストールする必要がある(```install.../PHPUnit-3.7.32部分```)

mac x MAMP x cakePHP はこのように３重のトラップがあるので、扱いなれないうちは１つ２つクリアしていても他でひっかかっていて動作せず、「！？」となることが多いうえに、検索していくとどんどんやることが増えて混乱しがちだけれど、今回はこの方法で無事インストールできた。
さんざんいじった後なので、最初からインストールするにはもうすこし作業が必要かもしれない。（phpunit関連のchannelの登録３つとか。　）




## 用語メモ

- .bash_profile　は、システム起動時（ログイン時）に１回だけ実行されるシステム設定ファイル
- .bashrcは、システム起動時（ログイン時）に加えてシェル実行時に毎回読み込まれる設定ファイル
http://maccle.com/php/mac-pear-path-env/
- source XXXX で設定反映
- which XXXX でパスの確認

- 作業手順はこのあたりが読みやすいが必要かどうかがわからない（チャンネルの登録等の試行錯誤）
	-	http://nagaikiyo.hatenablog.com/entry/2013/01/04/211946
	-	http://lazesoftware.com/blog/11/0213/
便利なJdbcTestUtils


## はじめに
ユニットテストとかEnd to Endのテストでマスタデータを投入したい時に便利

## 対象環境
SpringFrameWork 3.2.8

## 使い方

こういうテーブルがあったとします

```sql
mysql> desc customer;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | bigint(20)   | NO   | PRI | NULL    | auto_increment |
| first_name | varchar(255) | YES  |     | NULL    |                |
| last_name  | varchar(255) | YES  |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
```

テストスクリプトを用意します。mysqldumpから取得した結果でもOK

```resources/sql/insert-test.sql
insert into customer(id, first_name, last_name) value (1,"foo", "bar");
insert into customer(id, first_name, last_name) value (2,"foo", "bar");
insert into customer(id, first_name, last_name) value (3,"foo", "bar");
```

```@Transactional``` などは省略...

```
public class TestClientTest {
    @Autowired
    private DataSource dataSource;

    @Test
    public void test_readScriptPath() throws Exception {
        // スクリプト実行する
        executeScript("/sql/insert-test.sql");
        // 行数を数える
        int actual = JdbcTestUtils.countRowsInTable(new JdbcTemplate(dataSource), "customer");
        assertThat("size is not match", actual, is(3));
    }

    private void executeScript(String... paths) throws Exception {
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
        for (String path : paths) {
            EncodedResource resource = new EncodedResource(new ClassPathResource(path, getClass()));
            JdbcTestUtils.executeSqlScript(jdbcTemplate, resource, false);
        }
    }
}
```

## 最後に
Spring 4.0.3 からはアノテーションを使ったもっと便利な機能が追加されたみたいです。
[Introduce annotation to execute SQL scripts in the TCF](http://github.com/spring-projects/spring-framework/pull/557)
.htaccessファイルでルーティング設定


## .htaccessに記述すること
.htaccesファイルにリライトを記述することで、アクセスの仕方のルールを決めることができる。

例えば、
`http://hogehoge.jp/track/share/111?utmsouce=fb_share`
`http://hogehoge.jp/track/share/2226?utmsouce=fb_share`
のようなurlへのアクセスが来た時、`share/`以下の数字やパラメータによらずに一律で同じファイル（`/track/share/index.php`）を実行させたい時があったとする。

その場合、`/track/share/.htaccess`を作成し、

```
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.+)$ index.php [L]
</IfModule>
```

のような内容で記述すれば、OK。

- `RewriteEngine On`はRewriteRuleを書くための準備
- `^(.+)$`は正規表現で、「任意の1文字以上の文字列」
- `[L]`のLはLastのL。これ以上書き換えられない

## .htaccessの有効範囲
.htaccessを置いたディレクトリとその配下のディレクトリにアクセスがあった時に有効。
複数のディレクトリに.htaccessを置くことが可能。より深い階層にある.htaccessが優先的に適用される。

▼参考url
[.htaccessをWordPressで徹底活用](http://csspro.digitalskill.jp/%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB/%E3%83%AF%E3%83%BC%E3%83%89%E3%83%97%E3%83%AC%E3%82%B9/htaccess%E3%82%92wordpress%E3%81%A7%E5%BE%B9%E5%BA%95%E6%B4%BB%E7%94%A8/)
[.htaccessによるURLの書き換え Rewrite（リライト）](http://hoshiya.biz/blog/2012/02/htaccessurl-rewrite.php)
[URLをリダイレクト・リライトする場合の.htaccessの設定例](http://coliss.com/articles/build-websites/operations/926.html)
mysqlのデータベースを削除して領域を解放する

ローカルのmysqlのサイズが30GBを超えていたので、9割以上のいらないDBを消して領域を解放した話。

ローカルの開発環境を想定していて、本番環境は想定していない。
バージョンによって違うだろうし、作業の流れや、DBの特性などの参考にメモ。

#### 環境
MacOSX 10.9.2
mysql: Server version: 5.6.16-log Homebrew

## mysqlのDBのサイズを調べる

```mysql
SELECT table_schema AS "Database name", SUM(data_length + index_length) / 1024 / 1024 AS "Size (MB)" FROM information_schema.TABLES GROUP BY table_schema;
+------------------------------+--------------+
| Database name                | Size (MB)    |
+------------------------------+--------------+
| information_schema           |   0.00976563 |
| mysql                        |   0.61087894 |
| ...                          | 331.71875000 |
| performance_schema           |   0.00000000 |
+------------------------------+--------------+
```

参考 : [List sizes of MySQL databases](http://makandracards.com/makandra/1447-list-sizes-of-mysql-databases)

## DBをひたすら消す

```mysql
DROP DATABASE my_database1;
DROP DATABASE my_database2;
DROP DATABASE my_database3;
...
```

予定ではこれでおしまいだったが、mysqlの占有領域が減らなかった。

MySQL(5.6)のデフォルト設定では、サイズが減らない。
参考 : [How to shrink/purge ibdata1 file in MySQL](http://stackoverflow.com/questions/3456159/how-to-shrink-purge-ibdata1-file-in-mysql)

`my.cnf`の設定変えれば以後は、削除時サイズを小さく保てるらしい。（設定については省略）

## mysqlのdataをすべて作り直す

以下の手順に従う。

[MYSQL: REDUCING IBDATA1](http://vdachev.net/2007/02/22/mysql-reducing-ibdata1/)

Dump the Whole Database の部分

#### 残されたDBをdump

```shell-session
mysqldump -uroot -p --extended-insert --all-databases --add-drop-database --disable-keys --flush-privileges --quick --routines --triggers > all-databases.sql
```

注．記事のコードを貼付けるとハイフンが違うのでエラーになる

※ローカルなのでユーザーはroot

#### mysqld停止

`ps aux | grep mysql`から`kill -9`使った

#### データを移動または削除

`mv /usr/local/var/mysql /usr/local/var/mysql_bk`

#### my.cnfの設定変更

必要なら設定変更

#### mysqlのdb初期化

`/usr/local/bin/mysql_install_db --basedir="$(brew --prefix mysql)" --datadir=/usr/local/var/mysql --tmpdir=/tmp`

記事の通りだとエラーになったから他を調べた。
参考 : [Homebrew - mysql_install_db => FATAL ERROR](https://github.com/Homebrew/homebrew/issues/5407)

パスワード設定

`/usr/local/opt/mysql/bin/mysqladmin -u root password 'new-password'`

#### mysqld起動

別セッションなどで `mysqld`

#### DBをインポート

dumpしたディレクトリで `mysql -uroot -p`

```mysql
SET FOREIGN_KEY_CHECKS=0;
SOURCE all-databases.sql;
SET FOREIGN_KEY_CHECKS=1;
exit
```
#### mysqld再起動

#### サイズ確認

```shell-session
$ du -sh /usr/local/var/mysql*
2.4G	/usr/local/var/mysql
 32G	/usr/local/var/mysql_bk
```

動作確認 -> OK
`rm -rf /usr/local/var/mysql_bk`

## その他

MySQLは個人アプリでしか使ってなくて、最新事情は知らない。

最新事情調べる
[MySQL - Wikipedia](http://ja.wikipedia.org/wiki/MySQL)
[MySQL 5.6 Release Notes](http://dev.mysql.com/doc/relnotes/mysql/5.6/en/index.html)

削除したデータは2年前のものとかあったけど、意外と新しいの使ってた。

どっかで `brew upgrade` したかな
爆速で導入可能なFirefox OSシミュレータを動かすまでの軌跡

今後、国内でもモバイル向けOSとして期待されているFirefox OSですが、今回、そのシミュレータを動かしてみました。

環境はMac OS X 10.9.3で、使用したFirefoxのバージョンは30.0です。

![download-firefox.jpg](https://qiita-image-store.s3.amazonaws.com/0/636/0b2a8555-cace-019d-30ac-9993033435f8.jpeg)

まずは普通にFirefoxをダウンロードし、

![installed-firefox.jpg](https://qiita-image-store.s3.amazonaws.com/0/636/27a5e8e3-4d41-3204-cbb2-76a64d4fdc7d.jpeg)

インストールします。

![open-apply-manager.jpg](https://qiita-image-store.s3.amazonaws.com/0/636/0febfde2-c459-46c4-55d0-ffe8e3534771.jpeg)

Firefoxのメニューの[ツール]-[Web 開発]-[アプリマネージャ]をクリックし、アプリマネージャを開きます。

![apply-manager.jpg](https://qiita-image-store.s3.amazonaws.com/0/636/62e6e31c-1b24-d4dc-1120-c32bb1269475.jpeg)

アプリマネージャが表示されましたら、下の方にあります「シミュレータを起動」というボタンを押します。

![install-simulator.jpg](https://qiita-image-store.s3.amazonaws.com/0/636/6294256d-c047-aba8-7547-6b5c6ef71a7b.jpeg)

まだシミュレータをインストールしていないため、ここでシミュレータをインストールするか聞かれます。素直に「シミュレータをインストール」のボタンを押します。

![install-simulator-page.jpg](https://qiita-image-store.s3.amazonaws.com/0/636/2fd79604-b69e-10bb-5f11-b4766d965980.jpeg)

そうしますと、上にあるようなページが自動で開きます。ここにある緑色の「Install Simulator」のボタンをクリックします。

![app-manager-add-ons-install.jpg](https://qiita-image-store.s3.amazonaws.com/0/636/3e31ad97-9998-8454-a0fe-5730307ff0a1.jpeg)

次にApp Manager add-onsというページに遷移し、ここでインストールするFirefox OS Simulatorを選ぶことができます。現時点での安定版の1.3をインストールしてみます。

![allow.jpg](https://qiita-image-store.s3.amazonaws.com/0/636/5eeec249-5323-de03-6bd3-76f91e2572b2.jpeg)

ここでftp.mozilla.orgからのアドオンのインストールを許可していない場合、インストールを許可するかの確認が必要になります。「許可」を押します。

![complete-install.jpg](https://qiita-image-store.s3.amazonaws.com/0/636/7a90e778-ccff-d6b5-09e1-fc96ab600220.jpeg)

シミュレータのインストールが開始され、インストールが完了すると上のような通知が表示されます。

![firefox-os-button.jpg](https://qiita-image-store.s3.amazonaws.com/0/636/46aad96a-cd06-22ee-5e3c-9592aa8639fe.jpeg)

そしてアプリマネージャの画面に戻りますと、下の方のボタンがこのようになっており、ここで「Firefox OS 1.3」のボタンを押します。

![firefox-os-simulator-1.3.jpg](https://qiita-image-store.s3.amazonaws.com/0/636/cfc34924-412b-9413-6b8d-03427b16479e.jpeg)

はい、起動しました。

これだけでFirefox OS Simulatorが動かせちゃいました。マウスだけで出来ました。

これで、Firefox OS向けアプリ開発を始める準備が、ほぼ揃います。

あとはWeb標準技術を用いてアプリを作るだけです。

Webがネイティブな世界へようこそ。
プログラミングで数値を増やしたり減らしてみた

(元ネタ)
プログラミングで数値を増やしたり減らしてみたいんだが
http://blog.livedoor.jp/itsoku/archives/39361879.html

--

Pythonでやってみた

```py
# size分だけの数値を増やしたり減らしたりするジェネレータ
def repeat_range(range_size, offset = 0):

	def repeat_gen():
		signed = 1
		i = -1

		while True:
			i += signed
			if i == 0 :
				signed = 1
			if i == range_size -1:
				signed = -1
			yield i + offset

	return repeat_gen()


# 1から4の繰り返しを作成
repeat4  = repeat_range(4, 1)

for i in range(10):
	print repeat4.next(),
```

```py:結果
1 2 3 4 3 2 1 2 3 4
```
Makefile CUDA用(OpenCL）ｘ

OpenCL入門をUbuntu14.04(CUDA6.0)でMakeするためのMakefile
(cudaのインストールディレクトリが変わった)


```MAKE
all: nvidia

is_64=$(shell s=`uname -m`; if (echo $$s | grep x86_64 > /dev/null); then echo 1; fi)

CFLAGS=-Wall -W -O2

EXE=""


ifeq ($(is_64), 1)
PATH_TO_NVIDIA_SDK:=/usr/local/cuda
PATH_TO_NVIDIA_INC:=$(PATH_TO_NVIDIA_SDK)/include
PATH_TO_NVIDIA_LIB:=$(PATH_TO_NVIDIA_SDK)/lib64

else
PATH_TO_NVIDIA_SDK:=/usr/local/cuda
PATH_TO_NVIDIA_INC:=$(PATH_TO_NVIDIA_SDK)/include
PATH_TO_NVIDIA_LIB:=$(PATH_TO_NVIDIA_SDK)/lib64

endif


EXE_NAME=$(patsubst %.cpp,%,$(wildcard *.cpp))

nvidia: $(patsubst %,%.nvidia,$(EXE_NAME))$(EXE)

%.nvidia$(EXE):%.cpp
	g++ $(CFLAGS) -I$(PATH_TO_NVIDIA_INC) -L$(PATH_TO_NVIDIA_LIB) -o $@ $< -lOpenCL


clean:
	rm -f *.nvidia$(EXE) 



```



φ(..)メモメモ
Chef+Fedora20

Fedora 20にchefをインストールしたため、備忘録を兼ねてメモ。
ちなみに、設定環境はすでにrubyがinstall済みでしたが、installされてない場合は
別途installが必要になります。

■対象環境
Fedora 20
ruby 2.0.0p353 (2013-11-22 revision 43784) [x86_64-linux]



基本的な手順は、下記の投稿記事を参考にさせてもらいました。
>http://qiita.com/takeshi_ok_desu/items/936ee44b712c37d25a0e
CentOS 6.4 minimal の環境に　Chef-solo を入れる。（必然的にRubyもインストール）



#コンパイル等に必要なmoduleのinstall

>yum groupinstall "Development Tools"

↓もあわせてインストール
>yum install libffi-devel openssl-devel readline-devel zlib-devel git subversion gdbm-devel httpd-devel libcurl-devel ncurses-devel openssl-devel readline-devel sqlite-devel zlib-devel libyaml-devel


#chefのinstall
>gem install chef

エラー出た
>ERROR:  Error installing chef:
>	ERROR: Failed to build gem native extension.
>
>    /usr/bin/ruby extconf.rb
>mkmf.rb can't find header files for ruby at /usr/share/include/ruby.h

googlingの結果、ruby-develがたりてないみたいなので、突っ込む
>yum install ruby-devel

再度chef,knife-soloのinstall
>gem install chef

成功！、下記コマンドも打ち込む
>gem install knife-solo

とりあえず、installまで。
rails3のassetsにデザイナーさんからもらったアイコンフォントを置いて使えるようにする

古いプロジェクトなので3系ですが4系でもいけるはず（参考文献より）

## 状況
- デザイナーさんから受け取ったhtml/css/js/img/font一式を既存のrailsプロジェクトに結合する
- デザイナーさんのマークアップをほとんど汚さずにerbを埋め込みたい

## 課題

- アイコンフォントの位置に□のようなものが表示されているので名前解決を良い具合にしないといけない

## 解法

- app/assets/fontsを作って直下にもらったフォントファイル類を配置する 
- cssの頭で@font-faceを書いて読み込む

```:app/assets/stylesheets/style.css

@font-face {
    font-family: 'fontello';
    src: url('/assets/fontello.eot');
    src: url('/assets/fontello?iefix') format('eot'),
         url('/assets/fontello.woff') format('woff'),
         url('/assets/fontello.ttf') format('truetype'),
         url('/assets/fontello.svg#webfont') format('svg');
}

```

## 結果

表示できました

![Screen Shot 2014-06-14 at 20.31.06.png](https://qiita-image-store.s3.amazonaws.com/0/26475/a0c39d78-2443-9090-80ed-3bef333c5a20.png)



## 参考文献

[Rails 4 で assets に font を追加する方法](http://qiita.com/ma2ge/items/90a7d4511954b5fec2c7#2-3)
[How to use fonts in Rails 4](http://stackoverflow.com/questions/18294150/how-to-use-fonts-in-rails-4/18299918#18299918)
Dockerでやりたい理想のデプロイと、CGI->Rails的な話

- git push
- CIでテスト
- masterなら
  1. Docker Hub で build && push
  2. 「なにかしら」にwebhookで通知して、CIのテストも通ってたら次へ
  3. 「なにかしら」がクラスタの各インスタンスにdocker pull && docker runをやらせる

ところで「なにかしら」は

1. 役割毎のクラスタを扱える（hogeservice-web, hogeservice-fugaworkerみたいな）
2. クラスタの各インスタンスのipとsshkeyを安全に覚える
3. 各インスタンスの負荷とか、あるいはSQSのメッセージの数とかをトリガーにして、勝手にクラスタをスケールする

っていう「なにかしら」欲しい

#ところで

ところでDockerのおかげでやっとデプロイの世界が人手ベースなクソ世界から抜け出せますね
まるでperlでFW使わずWebサービスを書いているような虚しさでした。
もう、routerとかも使わずに/main.cgiとかにアクセスさせてるような気分でしたね。

Chefとか、Capistranoもしっくりこない。
ProvisionもDeployもひとくくりにしてやりたいし、そもそもChef遅過ぎてウケるので
（Vagrantで環境をテストするのだけでクソ時間かかる）

デプロイの世界におけるRailsみたいな感じかなーと。（もう少し環境が整えば）
やり方がやっとまともに規約化&&共有されるような気がします。

あとは、Dockerが扱えないレイヤ（フックをトリガーにしたデプロイ、監視、クラスタ管理）を普通にやってくれるものが出れば。
このへんもみんなやってるのにイマイチやり方が統一されてないというか、単一のフレームワークで提供されてない感じです。
rubyでrouterとmigrationとtemplaterとバラバラにつかって頑張って統合してる感じです。

#規約化の神秘

今更な話ですが、やっぱり「規約化」とか、「統一感」って大事です。
Railsみたいに、これ使えばやりたいことは全部出来るっていうプラットフォーム。
実態はわりと色々なツールのグルーです。（自分自身で書いたgemも合わせて）

個人的には、いろいろ散在してるモジュールの「組み合わせ」自身を定義してくれたのが一番の意義かな、と思っています。
この組み合わせを使えば全てOKってことを保証してくれる。いやそれどころかモジュールの連携もFWが面倒を見るので各モジュールについて考えなくても良い。
これでやっと、やりたいことに集中出来る。

モジュールの組み合わせも規約化されるので、開発もポータブルになる。
いちいちそういう層まで考えなくても、単一の知識で理解出来るようになります。

ポータブルになる＝プラットフォーム
と言うことも出来るでしょう。

こういったレベルで統一&&規約化されれば、やっとコミュニティが発達するんです。
モジュール自身がコミュニティを持つのは健全ではないし、いまいち発展しにくい。なぜなら各論的だからです。
各論的な話には専門家（というかオタク）しか集まりません。
そうすると万人のためにならないコミュニティが出来上がります。

なぜコミュニティが万人のためでないといけないかというと、各論的だとポータブルでないからです。
ポータブルでないと、プラットフォームにならない。
プラットフォームにならなければ、共通の技術にならない。
優れたFWが共通の技術にならなければ、「技術」は真の意味で発達しない。
なぜなら、「技術」とは共通の基盤だからです。各個人が暗黙的にもつ知識のことではありません。

って感じでモジュール化の流れをdisりつつ、神デプロイFW早く出てほしいな〜と思いました。
`bundle update capybara`がうまくいかない場合の対処法 on OSX Mavericks


## 動機
RSpecを3.0にアップグレードしたところ、Capybara 2.2以上でないと動かないと怒られたので、`bundle update capybara`したらなんか固まってるっぽい…？

## 調査
`gem i capybara`で調査したところ、nokogiriのビルドに異常なほど時間がかかっていることが発覚しました。
このとき、nokogiriのバージョンは`1.6.3rc1`でした。

## 試行錯誤
`--use-system-libraries`をしたほうがいいというメッセージが出てきたので、`bundle config build.nokogiri --use-system-liblaries`してから`bundle update capybara`をすると…
nokogiriのバージョンが`1.6.2.1`になっており、さらにエラーが発生。
`libxml2 version 2.6.21 or later is required!`
だそうです。
そこで、`bundle config build.nokogiri --use-system-liblaries --with-xml2-include=/usr/include/libxml2`したあとに改めて`bundle update capybara`するとあっさりアップグレードに成功（1分弱）。

## 結論
nokogiriのビルドにそんなに時間かかってるとは全く気づきませんでした。ビルドに時間がかかっている場合になにかしらのフィードバックがほしいところです。
覚えておくと、いざというときに役に立つ。JavaでリアルタイムWeb - WebSocket -

Webもコミュニケーションに使われるようになってきて、ページ内でリアルタイム性が求められるようになってきました。
リアルタイムとは、チャットのように、あるユーザのメッセージが他のユーザに即座に伝わる仕組みです。

ブラウザでリアルタイム性を実現するための方法はいくつかあるのですが、本稿ではWebSocketという仕組みを利用します。

# JavaでWebSocket
JavaでWebSocketを実現するためには、Java EE 7対応のサーバを使うのが簡単です。ここではTomcat7の、version7.0.52を使います。version7.0.48以降であれば動きます。
本稿ではWebSocketを使ってチャットアプリケーションを作成します。

# サンプルコード
サンプルコードは[Github](https://github.com/ukiuni/WebSocketInspect)においておきます。Eclipseプロジェクトなので、importするだけで動きます。

# 解説
凄くシンプルですが、キモをピックアップして解説します。

## サーバサイド
サーバー側のコードは恐ろしくシンプルです！
[WebSocketEndpointAction.java](https://github.com/ukiuni/WebSocketInspect/blob/master/src/org/ukiuni/inspect/websocket/action/WebSocketEndpointAction.java)だけです。
いいねー。Java。

```java:WebSocketEndpointAction.java
@ServerEndpoint("/loadMessage")
public class WebSocketEndpointAction {
	public static List<Session> sessions = new ArrayList<Session>();
	@OnOpen
	public void onOpen(Session session) {
		// 開始時
		sessions.add(session);
	}
	@OnMessage
	public void onMessage(String message) throws IOException {
		// クライアントからの受信時
		for (Session session : sessions) {
session.getBasicRemote().sendText("{\"command\":\"message\", \"text\": \"" + message.replace("\\", "\\\\").replace("\"", "\\\"") + "\"}");
		}
	}
	@OnError
	public void onError(Throwable t) throws IOException {
		// エラー発生時
		for (Session session : sessions) {
session.getBasicRemote().sendText("{\"command\":\"error\", \"text\": \"" + t.getMessage().replace("\\", "\\\\").replace("\"", "\\\"") + "\"}");
		}
	}
	@OnClose
	public void onClose(Session session) {
		// 完了時
		sessions.remove(session);
	}
}
```
肝は、「@」、アノテーションです。@ServerEndpoint("パス")とするだけで、Webソケットを受け付ける事ができます。あとは、4つのメソッドに付いているアノテーションが各イベントのハンドラとして動きます。

## クライアントサイド
クライアントサイドも1ソース。[index.html](https://github.com/ukiuni/WebSocketInspect/blob/master/WebContent/index.html)にすべて記載されています。
```js:index.htmlからの抜粋
var forRtoA = document.createElement('a');
forRtoA.href = "loadMessage";
webSocket = new WebSocket(forRtoA.href.replace("http://", "ws://").replace("https://", "wss://"));
//・・・・省略
webSocket.onopen = function() {
	appendMessage("Opened", "blue");
}
webSocket.onclose = function() {
	appendMessage("Closed", "red");
}
webSocket.onmessage = function(message) {
//・・・・省略
```
これだけで、チャットができちゃいます。

# 超応用が効きますよ！リアルタイム処理！
ブラウザ同士で情報をやりとりしたい場合や、サーバの更新情報をブラウザに即時に送信したい時も、Javaならすごく簡単に作ることができます。
更新しないと最新情報が入ってこないWebアプリケーションなんて、もう古いですよ！リアルタイム処理であなたの作るものの価値を上げてください！
Sassのif文で変数の代入

以下のコードでエラー。

```scss
@each $type in "facebook" "twitter" {
  .#{$type} {
    @if $type == "facebook" {
      $button: "button_like.png";
    } @else if $type == "twitter" {
      $button: "button_tweet.png";
    }
    width: image-width($button);
    height: image-height($button);
    background-image: image-url($button);
    background-repeat: no-repeat;
  }
}
```

if文には必ず入っていて、`$button`に代入されているはずなのに、
Undefined variable
と言われます。

これは、`$button`のスコープがif文の中に入っていて、if文の後に書いた`$button`がスコープ外になってしまうから。

以下のように、if文のスコープの外で一回代入すれば解決。

```scss
@each $type in "facebook" "twitter" {
  .#{$type} {
    $button: "";
    @if $type == "facebook" {
      $button: "button_like.png";
    } @else if $type == "twitter" {
      $button: "button_tweet.png";
    }
    width: image-width($button);
    height: image-height($button);
    background-image: image-url($button);
    background-repeat: no-repeat;
  }
}
```

もっとちゃんとした書き方があるかもしれませんが。
ChatworkにGitLabのプッシュやマージリクエストの通知を自動投稿する

最近、Chatworkを開発メンバーで使う機会が多く、せっかくなのでGitLabのプッシュ通知なども投稿されたら便利だなというわけで、調べてみたら[chabot](https://github.com/astronaughts/chabot)という素晴らしいものが公開されていたので使ってみた。

## 前提

- GitLab
- Chatwork
- Heroku

この3つ使う。Herokuはすでに登録済みの前提。

## Herokuコマンドラインツールのインストール

HerokuはWebブラウザの管理画面から操作可能だが、ちょっと面倒なのでコマンドラインツールをインストールしておく。

- [heroku toolbelt](https://toolbelt.heroku.com/)

ダウンロードしたら、普通にインストール。

```
$ heroku login
Enter your Heroku credentials.
Email: 
Password:
```

これでHerokuにもログイン済みになる。

## chabotのインストール

```
$ npm install chabot -g
```

超簡単。

## chabotの設定

chabotコマンドが使えるようになっているので、chabot createでchabotプロジェクトファイルを生成する。今回は ~/Sites/chabot-sample/ ディレクトリに作った。

```
$ chabot create chabot-sample -d ~/Sites/ -f
$ cd ~/Sites/chabot-sample
$ git init
```

続いて、Herokuにアプリ登録をする。これでURLとgitのリポジトリが発行される。

```
$ heroku apps:create chabot-sample
$ git remote -v
heroku	git@heroku.com:chabot-sample.git (fetch)
heroku	git@heroku.com:chabot-sample.git (push)
```

chabotの設定ファイル config.json を修正する。

```config.json
{
    "port": 5000,
    "bots": {
        "github": {
            "hostname": "chabot-sample.herokuapp.com",
            "token": "【chatworkのAPITOKEN】",
            "route": "/gitlab/hooks/:roomid"
        }
    }
}
```

hostnameには、heroku createで生成されたホスト名を指定。tokenはChatworkのAPIトークンを指定。なお、ChatworkのAPIは今プレビュー版らしく、申請しないと使えない。

[チャットワークAPI（プレビュー版）お申込み](https://www.chatwork.com/service/packages/chatwork/subpackages/api/apply_beta.php)

なお、わりとすぐ発行されるけど、一度Chatworkからログアウトしないとメニューに出てこなかった…ので注意。

最後に、nodeを起動するためのProcfileを作成。

```Procfile
web: node app.js
```

## chabotの起動

```
$ git add .
$ git commit -m 'first commit'
$ git push heroku master
```

これでHerokuにアプリケーションが転送され、無事chabotが起動する。起動の確認には heroku logs コマンドが便利。

```
$ heroku logs
```

## GitLabのWebHooksに登録する

プッシュ通知したいGitLabのリポジトリ画面に行き、Settingsメニューを開くと左側に「Web Hooks」というメニューがある。

そこに先ほどHerokuで発行したホスト名 + config.jsonで指定した route のURL + 通知したいChatworkのルームIDを指定する。

今回の例だと http://chabot-sample.herokuapp.com/gitlab/hooks/0000000 こんな感じ。

![chabot1.png](https://qiita-image-store.s3.amazonaws.com/0/2152/25a0d1f8-8972-e456-ad0e-b5ceff9c8ae2.png "chabot1.png")

なお、ChatworkのルームIDはURL末尾のridを除いた数字のみ。

これにて無事プッシュ通知がChatworkに自動投稿される。

## おまけ：マージリクエストとかIssueも通知したい

今回のchabotではプッシュにしか対応していないが、マージリクエストやIssueの通知も行いたかったので、スクリプトをちょっと修正した。

- https://github.com/zaru/chabot

/example/bots/gitlab_push.js
/example/templates/gitlab_push.js

この2ファイルをそのまま上書きすればOK。
`--with-ssl=openssl`を指定したneonを作る

# 環境
* CentOS 6.5
* neon 0.29.3-3.el6_4

```
$ yum list neon
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: www.ftp.ne.jp
 * extras: www.ftp.ne.jp
 * updates: www.ftp.ne.jp
Installed Packages
neon.i686                             0.29.3-3.el6_4                             @base
```

# 手順

## ソースrpmを取得する

rpmfindで探す([neonの場合](http://www.rpmfind.net//linux/RPM/centos/6.5/i386/Packages/neon-0.29.3-3.el6_4.i686.html))

yumdownloaderを使ってダウンロードしてもできるっぽい([参考](http://kohkimakimoto.hatenablog.com/entry/2012/03/18/071637))

```
# yum install yum-utils
# yumdownloader --source httpd
```

## 作業前の注意

システムを誤って壊さないように、rootではなく一般ユーザーで実行したほうがいいらしい。

## ソースrpmを展開する

`rpm`コマンドを使う([参考](http://d.hatena.ne.jp/install-memo/20091004/1254615623))

```
$ rpm -ivh neon-0.29.3-3.el6_4.src.rpm
```

ファイルの展開先は`rpmbuild`コマンドで確認できる。

```
$ rpmbuild --showrc | grep topdir
-14: _builddir  %{_topdir}/BUILD
-14: _buildrootdir      %{_topdir}/BUILDROOT
-14: _rpmdir    %{_topdir}/RPMS
-14: _sourcedir %{_topdir}/SOURCES
-14: _specdir   %{_topdir}/SPECS
-14: _srcrpmdir %{_topdir}/SRPMS
-14: _topdir    %{getenv:HOME}/rpmbuild
```

`rpm2cpio`コマンドでもできる([参考](http://linux.just4fun.biz/%E9%80%86%E5%BC%95%E3%81%8DUNIX%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/rpm%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%8B%E3%82%89%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E5%8F%96%E3%82%8A%E5%87%BA%E3%81%99.html))

```
$ rpm2cpio neon-0.29.3-3.el6_4.src.rpm | cpio -id
```

ただ、`rpm2cpio`だと展開後ファイルを、RPMお決まりのディレクトリに自分で配置しないといけないので、rpmコマンドでやるほうがよさげ。

## SPECファイルを変更する

```
$ diff -c neon.spec neon.spec.new
*** neon.spec   2013-08-26 21:36:18.000000000 +0900
--- neon.spec.new       2014-06-14 12:55:42.396682235 +0900
***************
*** 46,52 ****
  %define cabundle %{_sysconfdir}/pki/tls/certs/ca-bundle.crt
  %configure --with-expat --enable-shared --disable-static \
          --enable-warnings --with-ca-bundle=%{cabundle} \
!         --with-ssl=gnutls --enable-threadsafe-ssl=posix \
          --with-libproxy
  make %{?_smp_mflags}

--- 46,52 ----
  %define cabundle %{_sysconfdir}/pki/tls/certs/ca-bundle.crt
  %configure --with-expat --enable-shared --disable-static \
          --enable-warnings --with-ca-bundle=%{cabundle} \
!         --with-ssl=openssl --enable-threadsafe-ssl=posix \
          --with-libproxy
  make %{?_smp_mflags}
```

## 再ビルドする

`rpmbuild`コマンドでビルドする。([参考](http://blog.tnmt.info/2011/04/29/rpmbuild-for-beginner/))

```
$ rpmbuild -ba ~/rpmbuild/SPECS/neon.spec
```

いろいろ足りないって言われた場合は、`yum`で入れる。
Selenium WebDriverでChromeをExtension付きで起動する

Selenium WebDriverでChromeを起動するとまっさらな状態で起動します。
任意のExtensionをインストールした状態で起動する方法です。

なお2014/06現在、WindowsではExtensionのインストールはWeb Store経由でしかできなくなった模様。いまのところMac環境では大丈夫です。


```rb
require 'selenium-webdriver'

chrome_extensions = []

File.open("hoge.crx", "rb") do |file|
  chrome_extensions << Base64.encode64(file.read.chomp)
end

capabilities = Selenium::WebDriver::Remote::Capabilities.chrome("chromeOptions" => {"extensions" => chrome_extensions})
driver = Selenium::WebDriver.for :chrome, desired_capabilities: capabilities

driver.navigate.to 'http://qiita.com/'
```
Emacsでauto-complete-modeを使う

便利だとはわかってるけど「なんかめんどくせーなー。」と思ってた`auto-complete.el`を入れたメモ。

環境はWindowsだけど、`.emacs.d`をMac, Mint, Ubuntuで共有してます。

## インストール方法

```shell-session
git clone https://github.com/auto-complete/auto-complete.git
git clone https://github.com/auto-complete/popup-el.git
mklink /J ~\.emacs.d\site-lisp\auto-complete ~\.emacs.d\git\auto-complete
```

こっちは管理者権限で。

```shell-session
mklink popup.el ~\.emacs.d\git\popup-el\popup.el
```

んで、自動読込するように設定

```el:~/.emacs.d/inits/30-auto-comlete.el
(require 'auto-complete)
(require 'auto-complete-config)
(global-auto-complete-mode t)
```

ツールバーに`AC`と表示されてたらインストールは完了

## 使い方

標準でバッファ内にある文字列を自動的に補完対象にしてくれるので
例えばさっきの設定ファイル内で`au`などと打つと補完候補が表示される。

補完候補が表示されてる時にTABを押すと選択、もう一個したを選択したいときはもう一度TABを押すか十字キーで選択。

後はエンターキーで確定。

## 参考

<a href="http://dev.ariel-networks.com/wp/documents/aritcles/emacs/part9">「Emacsのトラノマキ」連載第09回「auto-completeを使おう」(松山智大) | ありえるえりあ</a>