OmniAICreator/Qiita-1.07M huggingface dataset:
Railsでパスワードの取り扱い（bcrypt 3.1.7以上）

# 登録

パスワードの暗号化で便利なGemのbcrypt。

## Railsでの取り扱い

「password」と「password_confirmation」という項目をフォームで送ると、bcryptが勝手に暗号化して、「password_digest」というカラムに暗号化したデータを入れてくれます。

取り出しも楽なので非常に重宝します。

また、has_secure_passwordというメソッドをつかいますが、こちらで以下が行われます。
- modelに「password」、「password_confirmation」属性の追加
- 「password」、「password_confirmation」のvalidationの追加（値の空白や不一致のチェック）
- authoricateメソッドの追加



## Gemファイルでbcryptを有効にする

```
$ vi Gemfile
-------------------------------
gem 'bcrypt', '~> 3.1.7'
-------------------------------

$ bundle install
```

3.1.7以上だと動きが異なっているので新しいほうの設定を入れます。


## マイグレーションファイルで以下の項目を入れる。
新規は以下

```rb:migrate/yyyymmddhhmmss_create_members.rb
class CreateMembers < ActiveRecord::Migration
  def change
    create_table :members do |t|
      t.string :password_digest, null: false
    end
  end
end
```

追加は以下

```rb:migrate/yyyymmddhhmmss_update_members.rb
class AddPasswordDigestToUsers < ActiveRecord::Migration
  def change
    add_column :users, :password_digest, :string
  end
end
```

「password_digest」というカラムがあれば自動的によしなにしてくれます。


##「strong parameters」の変更

rails4.0以上だと必要な「strong parameters」の追加。
こちらは勝手にはやってくれないので、設定を追加します。

```rb:app/controllers/members_controller.rb
private
  def member_params
    params.require(:member).permit(:login_name, :email, :password, :password_confirmation)    end
```

## ビューの作成

以下のように「password」と「password_confirmation」の
項目でFormの値を送ります。

```erb:app/views/members/login.html.erb
<div class="field"> 
  <%= f.label :password, "パスワード" %><br>
  <%= f.password_field :password %>
</div>
<div class="field">
  <%= f.label :password_confirmation, "パスワード再入力" %><br>
  <%= f.password_field :password_confirmation %>
</div>
```

## コントローラーの変更

bcrypt-rubyで自動的にdigestを有効にするには以下の行を入れます。

```rb:app/models/member.rb
class Member < ActiveRecord::Base
  has_secure_password
end
```

**※attr_accessorとかは入れない！！**
**※validatesや「password」と「password_confirmation」の一致のチェックは自動的にしてくれる。**


「attr_accessor」とか入れると、その段階でpasswordの値が空になり以前のバージョンの利用方法だとはまります。

「Password can’t be blank」とかのエラーが出てしまうので、その場合はそちらを修正します。


# ログイン

## ログイン用のview

ログ引用のviewを以下に表示します。
form_tagでログ引用のタグを作っています。

```erb:app/views/members/login.html.erb

<%= form_tag('/members/logintmp') do %>

<%= text_field_tag 'login_name', nil, class: 'loginbox-username' %>
<%= password_field_tag 'password', nil, class:  'loginbox-password' %>

<%= submit_tag 'Login', class: 'button button-green' %>

<% end %>
```

## ログイン用のcontroller

```rbrb:app/controllers/members_controller.rb
def login
    member = Member.find_by_login_name params[:login_name]
    if member && member.authenticate(params[:password])
        render :text => "Login OK"
    else
        render :text => "Login NG"
    end
end
```

「member = Member.find_by_login_name params[:login_name]」の行では、ログインIDがあっていればmemberのオブジェクトを返します。
間違っていればFalseを返します。

「member.authenticate(params[:password])」のメソッドではそもそもログインIDがNGのときはnilを返します。
ログインIDがあっていてパスワードがあっていればmemberのオブジェクトを返します。

この後にセッション処理などをすれば無事ログイン処理は完了です。
JavaScriptの配列で、特定の要素の時だけ置換をする2つ方法

前回の[JavaScriptの配列で、特定の要素の数を調べる方法](http://qiita.com/Slowh/items/928cdb8c885425401ebf)の続きです。

##JavaScriptの配列で、任意の文字列に置換する。
文字列を使う方法と、変数を使う方法の2種類があります。

###文字列を使って置換する
配列の変数名.splice（置換したい場所、そこから何個分、文字列）;を使います。今回のプログラムでは、置換したい場所は2＝ゾンビの要素数のときなのでiを、1つだけ置換するなので1を、文字列にゾンビを代入しています。

```javascript_array.splice.js
<script type = "text/javascript">
var zombiArray = [0,1,0,1,2,0,0,1];
		for (var i = 0;  i < zombiArray.length; i++) {
			if(zombiArray[i] == 2){
				zombiArray.splice(i,1,'ゾンビ');//配列は、正規表現NG。splice（置換したい場所、そこから何個分、文字列）
}
/*document.write(zombiArray[i]+"");//1要素ごとに表示する。for文の中、if文の外。*/
}
//-->
```

**ポイント**
1、JavaScriptの配列では、正規表現が使えない。

```javascript_array.replace_str.js
<script type = "text/javascript">
var zombiArray = [0,1,0,1,2,0,0,1];
		for (var i = 0;  i < zombiArray.length; i++) {
		zombiArray = zombiArray.replace(/2/,g,'ゾンビ');
document.write(zombiArray[i]+"");
}
//-->
```

置換というと、正規表現でマッチした要素を置換していくと考えられるのですが、配列には使えないということがわかりました。そこで、配列で正規表現っぽく使うのがspliceです。全般的な使い方は、[こちら](http://so-zou.jp/web-app/tech/programming/javascript/grammar/array/)です。


正常に動作していれば、
>0101ゾンビ001

と表示してくれます。

###変数を使って置換する
配列の変数名.splice（置換したい場所、そこから何個分、変数）でも、置換することが可能です。

```javascript_array.splice_hensu.js
<script type = "text/javascript">
<!--
var zombiArray = [0,1,0,1,2,0,0,1];
	var zombidayo = 'ゾンビ';
		for (var i = 0;  i < zombiArray.length; i++) {
			if(zombiArray[i] == 2){
								zombiArray.splice(i,1,zombidayo);//splice（置換したい場所、何個分、変数）				
}
document.write(zombiArray[i]+"");
}
//-->
```

##まとめ
JavaScriptの配列では、正規表現を使うことができないことが勉強になりました。それと、いろいろやってみることで、文字列だけでなくて変数も置換できることを発見したり、やってみて良かったなと思いました。
podspecの:tag -> s.version

自分で書いたpodspecが二箇所手書きでversion指定して更新失敗したことがあったので・・・。
tagがversionと同義なら一箇所に指定すべき。(あたりまえだけど・・・)

    Pod::Spec.new do |s|
      #...
      s.version = "1.0.0"
      s.source = { :git => "https://github.com/...", :tag => s.version }
      #...
    end
JavaScriptの配列で、特定の要素の個数を調べる方法

##JavaScriptの配列をいじってみる。

CodeIQのJavaScriptで[ゾンビのダンジョン - LV1](https://codeiq.jp/ace/yanai_masakazu/q1316"ゾンビのダンジョン - LV1")という問題がありました。この問題はレベル1なのですが、初心者の私には難しかったです。
ただし、JavaScriptの配列のなかから、１、任意の要素の数を調べること、2、任意の要素を文字列・変数と置換することはできたので、前後編にわけて紹介します。

前提条件　2をゾンビとする。

###JavaScriptの配列から、任意の要素の数を調べる。

```javascript_arrayYousoCount.js

<script type = "text/javascript">
<!--
var zombiArray = [0,1,0,1,2,0,0,1];
var zombi = 0;
for (var i = 0;  i < zombiArray.length; i++) {
	if(zombiArray[i] == 2){
		zombi++;//ゾンビを加算
	}
}
document.write('ゾンビは、'+zombi+'体</br>');//ループ後にまとめて表示するので、for文の外
//-->
```
**ポイント**
1、「もし～なら、◯◯する」はif文です。ここでは、変数zombiを0にして、条件にマッチすれば加算しています。以前、やったのに忘れていました。
2、```document.write('ゾンビは、'+zombi+'体</br>');```の書く位置に注意が必要です。ゾンビの数を報告するには、配列の要素すべてを調べ終わってから「◯体いました！」とします。

そのためには、for文の外側にコードを書かないといけません。もしも、

```mistake_arrayYousocount1.js
<script type = "text/javascript">
<!--
var zombiArray = [0,1,0,1,2,0,0,1];
var zombi = 0;
for (var i = 0;  i < zombiArray.length; i++) {
	if(zombiArray[i] == 2){
		zombi++;//ゾンビを加算
	}
	document.write('ゾンビは、'+zombi+'体</br>');//for文のなかに入れる
}
//-->
```

と書くと、
>ゾンビは、0体、ゾンビは、0体、ゾンビは、0体、ゾンビは、0体
>ゾンビは、1体、ゾンビは、1体、ゾンビは、1体、ゾンビは、1体

と、意味不明になってしまいます。

##まとめ
今まで意識したことはなかったんですが、for文でコードを書く場所を間違えたことで「こうしたいから、この処理をするコードをここに書く」というプログラムの処理が行われる順番を考えるきっかけになりました。
新しいMacにUnityのAndroidビルド環境を作る場合の注意点(2015.2.12)

新たな会社で支給された、Mac miniにUnityのAndroidビルド環境の構築ではまったので、覚え書き。

Javaの扱いが昔のMacと違うらしい。

6とか7でAppleからOracleに管理移行されていて、結構、めんどい。


結論から言うとGoogleの[ここ](http://developer.android.com/sdk/index.html)からAndroid SDKをダウンロードしインストールするのだが、
![スクリーンショット 2015-02-12 15.41.47.png](https://qiita-image-store.s3.amazonaws.com/0/25895/7cd0cf1a-5884-9e7d-7749-eb21e98e0718.png)

/Applications/android-sdk-macosx/platform-toolsとか空っぽなので、Oracleの[Java SE Development Kit](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)を
![スクリーンショット 2015-02-12 15.42.26.png](https://qiita-image-store.s3.amazonaws.com/0/25895/f7cbecb3-3052-85ac-b5ad-99b5742e6c8f.png)

インストールしると、/Applications/android-sdk-macosx/tools/androidが動いていい感じになりますよと言うお話。

##参考
http://techfun.cc/android/mac-android-sdk-install.html
http://docs-jp.unity3d.com/Documentation/Manual/android-sdksetup.html
パス文字列からファイル名などを抜き出す



```bash
# ファイル名を取り出す(拡張子あり)
basename '/a/b/c.d.e'
# c.d.e

# ファイル名を取り出す(拡張子なし)
basename '/a/b/c.d.e' .e
# c.d

dirname '/a/b/c.d.e'
# /a/b

```

パタンマッチを使うと・・・

```bash
${変数#パターン}	 # 先頭から最短一致した部分を取り除く
${変数##パターン}  # 先頭から最長一致した部分を取り除く
${変数%パターン}	 # 末尾から最短一致した部分を取り除く
${変数%%パターン}  # 末尾から最長一致した部分を取り除く
```

こんな感じでも記述が出来る。

```bash
#!/bin/bash
fpath='/a/b/c.d.e'

# ファイル名を取り出す（拡張子あり）
faname_ext="${fpath##*/}"
echo $fname_ext
# c.d.e

# ファイル名を取り出す（拡張子なし）
fname="${fname_ext%.*}"
echo $fname
# c.d

# 拡張子を取り出す
fext="${fpath##*.}"
echo $fext
#e

# ディレクトリを取り出す
fdir="${fpath%/*}"
echo $fdir
# /a/b

### -------------------------------
### ちょっと応用
### -------------------------------
# 拡張子を変更する
echo "${fpath%.*}.x"
# /a/b/c.d.x
```

---
参考：
[ザリガニが見ていた...。](http://d.hatena.ne.jp/zariganitosh/20100921/get_file_name_ext_dir)
Laravel4で楽にDBの水平分割が出来ないだろうか？

## 水平分割させたいモデルの基底クラス
```php:HorizonModelBase.php
class HorizonModelBase
{
    use SoftDeletingTrait;
    private static $isEnableGlobalConnection = false;

	public function newQuery($excludeDeleted = true)
	{
		$this->setOwnConnection();
		$builder = parent::newQuery($excludeDeleted);
		$this->resetOwnConnection();
		return $builder;
	}

	public function newFromBuilder($attributes = array())
	{
		$this->setOwnConnection();
		$result = parent::newFromBuilder($attributes);
		$this->resetOwnConnection();
		return $result;
	}

	public static function aroundQuery($func)
	{
		self::$isEnableGlobalConnection = true;
		$result_collection = new Collection();
		foreach(self::getAroundConnections() as $connection)
		{
			Config::set('database.default', $connection);
			$result_collection = $result_collection->merge(call_user_func($func));
		}
		Config::set('database.default', "mastar_data");
		$result_collection->sortBy(function($record){return $record->id;})->values();

		self::$isEnableGlobalConnection = false;

		return $result_collection;
	}

	public static function aroundAll()
	{
		return self::aroundQuery(function(){
			return self::all();
		});
	}



	private static function getAroundConnections()
	{
		return Config::get("database.user_db_connections");
	}

	private function setOwnConnection()
	{
		if (self::$isEnableGlobalConnection) { return; }

		if (property_exists($this, "user_id"))
		{
			$connection_no = $this->user_id % Config::get("database.user_db_connection_count");
		}
		else
		{
			$connection_no = $this->id % Config::get("database.user_db_connection_count");
		}
		$connection = "user_data_" . strval($connection_no);
		$this->setConnection($connection);
	}

	private function resetOwnConnection()
	{
		if (self::$isEnableGlobalConnection) { return; }
		$this->setConnection('user_data_0');
	}
}
```
Eloquentの変更を最小限にしつつ、従来通りの使い方で、データアクセス出来ないだろうかと模索した結果、こんな感じになった。


Config::get("database.user_db_connections");
global.phpのどっかで、上記コンフィグの設定はしとかないとダメ。

使うときは

```php:User.php
class User extends HorizonModelBase
{
}
```

```php:Test.php
$users = User::aroundQuery(function(){
   User::where('level', 10)->where('friend_num', '>', '3')->get();
}

echo $users;
```

みたいな感じ。
かなりやっつけ実装だが、まあ正常に動く。
ページネートどうするかとか、凝ったクエリー流したいときとか、
色々問題は出ててきそうだが・・・
もっと良い実装は無いだろうか・・・。
メソッドチェインにreduceを使う

最近のPHP系ORMでもメソッドチェインなものが増えてきました。
そこで、例えば検索条件がテーブルに記録されていて、
そのレコードに沿ったwhere条件が連なっている場合を考えてみます。

そんなときは、こんな感じのコーディングもできますよ、という例です。
LaravelのEloquentを想定していますが、配列の場合はarray_reduceでいけますね。

```php:
<?php
$condition = SearchCondition::all();//ここに検索条件が記録されているとします
//field:フィールド名,value:検索値
$eloquent = new SomeModel; //\Illuminate\Database\Eloquent\Model継承のモデル
$result = $condition->reduce(function($carry, $item) {
        return $carry->where($item->field, '=', $item->value);
    }, $eloquent)->get();
```
複数バージョンがインストールされているコマンドを切り替える


# alternatives

```
alternatives --config java
```

## 使い方

### 登録方法

alernativesに登録しないと使えないので登録する

```Bash
# 数値が大きいほど優先度が上がる(version 番号とかを数値化すると良いかも？
alternatives --install /usr/lib/jvm/jre-1.6.0-openjdk.x86_64/bin/java 160
```

### 確認・切り替え

こんな感じ

```Bash
alternatives --config java
2 プログラムがあり 'java' を提供します。

  選択       コマンド
-----------------------------------------------
*+ 1           /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java
   2           /usr/lib/jvm/jre-1.6.0-openjdk.x86_64/bin/java

Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:
```
ZNC経由で複数IRCサーバに繋ぐ

## 前置き

* webadminで設定する
* 1つはIRCプロキシを設定した前提

## 2個目のIRCサーバを追加

1. webadminにログイン
2. List Users -> 自分の名前のEditページ -> Networksの項目にあるAddボタンを押す
3. 2個目のnetworkを設定しsave
4. List Users -> 自分の名前のEditページ に戻り、Networksの項目のNameの値をメモする。これがサーバ名として認識される(サーバのFQDNではなくNameの値)

なお、Nameの値はznc 1.0.0では自分で設定できないようでzncが勝手に決めてるみたい。

## IRCクライアントにサーバを追加する

2個めのIRCサーバにつなぐためzncプロキシサーバを登録する。1個目のサーバとは別サーバとして登録する必要がある。

1個目を既に登録しているとおもうので同じように。1個だけ変える点がありLogin Nameの項目は`loginname/上でメモしたName`とする。このNameでZNC側がプロキシするサーバを識別するようだ。たとえばloginnameがnikushiで上でメモしたNameがmyircの場合は`nikushi/myirc`とする。
vimでreactの環境を整える


#JSXのシンタックス
JSXのシンタックスをカラーリングする

[https://github.com/mxw/vim-jsx](https://github.com/mxw/vim-jsx)

##インストール
```.vimrc
NeoBundle 'pangloss/vim-javascript'
NeoBundle 'mxw/vim-jsx'
```
vimrcのプラグインの管理をNeoBundleでやっているので、NeoBundleの書き方になってます。

###設定
.jsxだけではなく、.jsファイルにもシンタックスを有効にするためのオプション

```.vimrc
let g:jsx_ext_required = 0
```

React v0.12からは```.jsx```が推奨らしいので上のオプションは設定しなくてもいいかも

#jslint
普段jshintを使っているので、それでJSXの部分がエラーに成ってしまってて面倒なので、どうにかしたい。

[https://github.com/STRML/JSXHint/](https://github.com/STRML/JSXHint/)

これが良さそう？

普段vimでjsを保存する際にjshintをかませているので、その部分をjsxhintにしてあげる

```.vimrc
let g:syntastic_javascript_checkers=['jsxhint']
```

[https://github.com/scrooloose/syntastic/wiki/JavaScript:---jsxhint](https://github.com/scrooloose/syntastic/wiki/JavaScript:---jsxhint)
AWS/EC2 に、HHVM・MySQL・PHP5.5・Redis・Nginxをインストール

## 概要
AWSでLaravel+HHVMのDevサーバー作る手順
HHVMのチューニング方法が現在よくわからないが、特にチューンしなくても
Laravel+fastCGIに比べると2倍ほどレスポンス速度が向上した。
そして何より、CPU利用効率が最高に良かった。

## remi取ってくる
sudo yum update
sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

## nginxインストール
sudo yum install -y nginx
sudo mkdir /var/cache/nginx

## redisインストール
sudo yum --enablerepo=remi install -y redis

## Mysqlインストール
sudo groupadd mysql
sudo adduser -g mysql -d /usr/local/var mysql
sudo yum install -y 'perl(Data::Dumper)'
wget -q http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-client-5.6.20-1.el6.x86_64.rpm http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-shared-compat-5.6.20-1.el6.x86_64.rpm http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-server-5.6.20-1.el6.x86_64.rpm http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-devel-5.6.20-1.el6.x86_64.rpm http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-shared-5.6.20-1.el6.x86_64.rpm

sudo yum install -y MySQL-{client,devel,server,shared-compat}-5.6.20-1.el6.x86_64.rpm

sudo yum install -y MySQL-shared-5.6.20-1.el6.x86_64.rpm

## HHVMインストール
cd /etc/yum.repos.d
sudo wget http://www.hop5.in/yum/el6/hop5.repo
sudo sh -c "echo 'priority=9' >> hop5.repo"
sudo sh -c "echo 'includepkgs=glog,tbb' >> hop5.repo"
sudo wget http://yum.sexydev.com/sexydev-amazon.repo
sudo yum install -y hhvm

## php5.5インストール
sudo yum install -y php55 php55-devel php55-fpm php55-mbstring php55-mcrypt php55-mysqlnd php55-opcache php55-pdo uuid-php55 php55-bcmath

## composerインストール
sudo curl -sS https://getcomposer.org/installer | php
sudo chmod 777 composer.phar
sudo mv composer.phar /usr/local/bin/composer

## HHVMをfastCGIモードでデーモン起動
hhvm --mode daemon --config /etc/hhvm/server.ini
EC2にファイルアップロード/ダウンロード

# アップロード
以下でホームディレクトリにファイルアップロードできる（Amazon Linux利用の場合なので、ユーザー名は適宜置き換える）

```sh
$ scp -i pemのパス アップロード対象ファイルパス ec2-user@host:~/
```


# ダウンロード
以下で現在のディレクトリにダウンロードできる

```sh
$ scp -i pemのパス ec2-user@host:ダウンロード対象ファイルパス .
```
[CakePHP 2.x]フォルダ構造

http://book.cakephp.org/2.0/ja/getting-started/cakephp-folder-structure.html

主に自身が利用するフォルダ

app
├Config
├Console
│└Command
│　└Task
├Controller
│└Component
├Model
│└Behavior
├View
│└Helper
└webroot

主な用途

0. Config  
各種設定ファイルを配置するフォルダ。
* Command  
コマンドラインで利用するシェルファイルを配置するフォルダ。
* Task  
シェルで利用する共通処理を行うクラスを配置する。
* Controller  
MVCのCであるControllerファイルを配置するフォルダ。
* Component  
Controllerで利用する共通処理を行うクラスを配置する。
* Model  
MVCのMであるModelファイルを配置するフォルダ。
* Behavior  
Modelで利用する共通処理を行うクラスを配置する。
* View  
MVCのVであるViewファイルを配置するフォルダ。
* Helper  
Viewで利用する共通処理を行うクラスを配置する。
* webroot  
img, css, jsなどの静的ファイルを主に配置するフォルダ。
AWS SDK for PHP のパフォーマンスを改善するたった３つのこと

いずれも、ほとんどコードに手を加えることなくできる改善なので、SDKを利用しているなら、すぐにでもやるべきだ。
もし、これから開発をはじめようとしているなら、前提としてまず、 PHP5.6 もしくは PHP5.5 を使うことをオススメする。
もちろん、PHPのバージョン関係なく以下は有用なものです。

## 1. Composer の classmap autoloader を使う

```bash
$ php composer.phar install --optimize-autoloader
```

## 2. PECL uri_template をインストール

```bash
$ pecl install uri_template
```

uri_template 拡張は、AWS SDK ではなくベースとなる Guzzle V3 以降の実装として利用されるので、AWS SDK に限らず Guzzle を利用している場合でもインストールすることでパフォーマンス改善ができる


## 3. credentials.cache を有効にする

```php
$client = Aws\DynamoDb\DynamoDbClient::factory(array(
    'region'            => 'ap-northeast-1',
    'credentials.cache' => true
));
```
```json
{
    "required": {
        "aws/sdk": "2.*",
        "doctrine/cache": "1.*"
    }
}
```

上記はドキュメントに記載されていることではあるが、非常に有用なので改めて周知したい。
参考： http://docs.aws.amazon.com/aws-sdk-php/guide/latest/performance.html
git archive で日本語が含まれている場合の pathspec のエラー


OS X 10.9.5 

# 問題点
git で日本語(マルチバイト)が含まれている場合に

```
git archive --format=zip head `git diff head head~10 --name-only` -o archive.zip
```

のようなコマンドで差分抽出を行おうとすると、履歴の中に日本語が含まれていると以下のようなエラーがでます。

```
fatal: pathspec '"\357\275\222.png"' did not match any files
```

この場合は、全角の ｒ が含まれている為エラーが出ているようです。


# 対処方法

## 手動抽出

これは……やめましょう

## エスケープをやめる

問題は diff の出力がエスケープされていることのようなので、以下のコマンドでエスケープを無効にしてしまいます。
これは現在の git のみですが、全てに適用が必要であれば --global をつけるといいかと思います。

```
git config --bool core.quotepath false
```

これで先のコマンドが正常に行える用になりました。

```
git archive --format=zip head `git diff head head~10 --name-only` -o archive.zip
```



# NG

## git diff の出力を改変

git diff の出力が 

```
"\357\275\222.png"
```

となっているので、これを sed で ｒ へ置換するとうまくいくと思ったのですが、ファイルが見つからないというエラーが出ました……

```
git archive --format=zip HEAD `git diff --name-only head head~10 | sed -e 's/\\\\357\\\\275\\\\222/r/g'` -o archive.zip
```


## zip コマンド

少し検証してみると、git diff の出力は問題なく、git archive でのマルチバイトの扱いに問題があるような挙動でした。
なので git archive ではなく zip コマンドを利用して差分抽出してみようと思います。

```
zip -r archive.zip `git diff head head~10 --name-only`
```

これでカレントディレクトリに archive.zip が作成されました。

できたと思ったのですが、日本語ファイルが含まれていませんでした…



# 参考
http://staffblog.yumemi.jp/subversion%E3%81%8B%E3%82%89git%E3%81%B8%E7%A7%BB%E8%A1%8C%E3%81%97%E3%82%88%E3%81%86%E3%81%A8%E3%81%97%E3%81%A6%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8Dutf8%E3%81%AB-2/
config.action_mailer.default_url_options に対する正しい localhost の定義

恥ずかしながら今知った、というお話です。

メール送信を行うWebアプリの場合、`config.action_mailer.default_url_options` の定義が必要になると思いますが、開発環境向けには以下のような定義の仕方が良く紹介されています。

```rb:/config/environments/development.rb 
config.action_mailer.default_url_options = { host: "localhost:5000" }
```

うちは foreman なんでポート番号が5000番ですが、一般的には3000番でしょうか。

しかし正しい定義の仕方はこちらなんですね。

```rb:/config/environments/development.rb 
config.action_mailer.default_url_options = { host: "localhost", port: "5000" }
```

ポート番号の方は数値なのでクオートしなくても大丈夫かな？要するに本来は host と port を別々に定義する必要がある、というお話です。


気づいたのは、メール送信時にこんな例外が出たことから。

```
URI::InvalidComponentError - bad component(expected host component): localhost:5000:
  /Users/oakbow/.rbenv/versions/.../uri/generic.rb:605:in `check_host'
  /Users/oakbow/.rbenv/versions/.../uri/generic.rb:646:in `host='
  /Users/oakbow/.rbenv/versions/.../uri/generic.rb:195:in `initialize'
  /Users/oakbow/.rbenv/versions/.../uri/generic.rb:141:in `build'
  roadie (2.4.3) lib/roadie/inliner.rb:211:in `absolute_url_base'
  roadie (2.4.3) lib/roadie/inliner.rb:192:in `ensure_absolute_url'
  roadie (2.4.3) lib/roadie/inliner.rb:180:in `block in make_image_urls_absolute'
     :
```
調べてみると、メールテンプレートの `link_to` で絶対URIを解決する時に出てたんですね。
どうやら HTMLメール用の gem である roadie が、ホスト名の中にポート番号が入っている場合を考慮してパースしてくれないのが直接的な原因だったようです。
上のスタックトレースから追って `Roadie::Inliner#absolute_url_base` の `host` みたら `localhost:5000` がそのまんま入っていて、 `port` が空だったので、たぶん。
誰にでも起きる問題ではないと思いますが、ハマる時にはハマると思いますので、FYI として。
Objective-CプロジェクトをSwift化していく時のBridging-Headerの管理コストを下げる


# 何ができるようになる?
Objective-CプロジェクトをSwiftに以降していく時に、都度更新する必要がある ``<#ProjectName#>-Bridging-Header.h`` (これ以降``Bridging-Header``と書きます) を手作業で更新しなくて良くなります。

# 通常のBridging-Headerの管理
SwiftからObjective-Cのクラスを呼び出すには、``Bridging-Header``必要なクラスをimportします。

既存のObjective-CのプロジェクトをSwift化していく際には、最初に``Bridgin-Header``に多くのimport文を書くことになると思います。
さらにSwift化を進めていくとObjective-Cのファイルを削除する度に、``Bridging-Header``を更新しなくてはいけません。

そこで、Objective-Cファイルを削除しても、``Bridging-Header``を手作業で更新する必要がないような方法を紹介します。


# 手順
## RunScriptを追加
BuildPhaseに``Bridging-Header``を更新するRunScriptを追加します。

Xcode→プロジェクトファイル→TARGETS→Build Phases→左上の「+」ボタン→New Run Script Phase
追加したRun Scriptは並べ替える事ができます。 **Compile Sources**より前にこのScriptを配置してください。

```sh
echo '#import "AppDelegate.h"' > ./TestProject/TestProject-Bridging-Header.h
find ./TestProject/Classes -type f -name "*.h" -exec basename {} \; | sed 's/^\(.*\)$/#import "\1"/' >> ./TestProject/TestProject-Bridging-Header.h
```
シェルで``Bridging-Header``にimport文を挿入しています。
このスクリプトは各プロジェクトのファイル配置により適宜変更してください。

↓こんな感じになります。
![update_bridging_header.png](https://qiita-image-store.s3.amazonaws.com/0/11454/a58d30b5-973a-d83b-d298-53e7115f97b2.png "update_bridging_header.png")
ここではRun Script(1)の名前を ``Update Bridging-Header.h``に変更しています。


# 仕組み
- Build PhaseのRunScriptで、ビルド時のコンパイル前に``Bridging-Header``を更新します。


# まとめ
Build PhaseのRun Scriptを使えば、Bridging-Headerの手作業による更新がなくなります。
Swift化の煩わしい作業をなくしましょう。
Railsでの開発中のテキスト表示

railsで処理をとめてテキストの表示をするとき。

```rb
render :text => "aaaa"
```

結構単純ですが値の確認とか使いどころは多いかも。

```rb
render :text => "upper = #{params[:upper]}, lower = #{params[:lower]}"
```

他にもフォームから送信された、　prams[:article]の値を表示するには以下なども。

```rb
render plain: params[:article].inspect
```

「.inspect」を付ければ、オブジェクトの中身がログに出力されます。

あれ？なんで？というちょっとしたところでよく使いますね。
CocoaPodsが入っているプロジェクトでビルドは成功するが、シミュレータが起動しない

CocoaPodsがはいっているので、projectname.xcworkspaceからXcodeを起動してRunしたところ、ビルドは成功するがシミュレーターが起動しない。

原因はXcodeを起動する前に、projectname.xcodeprojから一度Xcodeを起動していたからだった。
Windowを閉じてたんで、消えた物かと思ってた・・

Window > Organizer からDeleteすることで解決。
FlaskでPCとモバイルでテンプレートディレクトリを自動で切り替えるやつ


## 要件
UserAgentでPCかスマホかとか判断して、テンプレートのルートディレクトリが勝手に切り替わってほしい。

例えば、こんな感じでテンプレート用意しといて、

```
template/ja/pc/index.html
template/ja/sp/index.html
template/ja/fp/index.html
```

viewでは特にデバイス意識せずにこうしたい。pcを見るかspを見るかとかは自動でやってほしい。

```
return render_template('index.html', form=form)
```


## みんなどうやってるの？

Flaskのスニペットとか探したけど、一般的な解法が見つからなかった。あったら教えてください。

Flask-Mobility というExtensionがあったけど、これはデコレータをいちいちつけなければならなくてちょっとつらい。それがPythonの流儀と言われたら、まあ、そうなのかな、と思うけど……。
あとは、PC、スマホ、ガラケーとか3つ以上分けるのとかできなさそう。
http://flask-mobility.readthedocs.org/en/latest/



## 作ってみた
こういうのあったらいいなってのをFlask Extensionにしてみた。
っていうか作ったの1年前だけど。

Python2系と3系どっちでもいけます。

https://github.com/yasunori/flask-devices

インストールはpipで入ります。

```
pip install Flask-Devices
```

こんな感じで、任意のデバイスグループ名, UserAgentの正規表現, 対応するテンプレートディレクトリ を定義できます。

```
devices = Devices(app)
devices.add_pattern('mobile', 'iPhone|iPod|Android.*Mobile|Windows.*Phone|dream|blackberry|CUPCAKE|webOS|incognito|webmate', 'templates/sp')
devices.add_pattern('tablet', 'iPad|Android', 'templates/pc')
devices.add_pattern('hoge', 'hoge', 'templates/hoge')
devices.add_pattern('pc', '.*', 'templates/pc')
```

これを一度定義するだけで、あとは勝手にやってくれます。
どのデバイスにマッチするかは、上から順に評価します。


あとは、Viewやテンプレート上で、デバイス名を取れるのでなんか処理変えるときにも使えるよ。

```
@app.route("/", methods=['GET', 'POST'])
def index():
    print(request.DEVICE) # mobile, tablet, hoge, pc
    if request.DEVICE == 'pc':
        # pc
    elif request.DEVICE == 'tablet':
        # tablet
```

```
{% if request.DEVICE == 'mobile' %}<strong>今モバイルだよ。<a href="">PC版を見たいのん？</a></strong>{% endif %}
```


まあまあ個人的には便利に使っています。

注意点としては、uWSGI Emperorとかから使うときはテンプレートディレクトリは絶対パスで指定しないとダメかも。


おしまい。
Emacsで改行とタブを置換する方法


# M-x relace-string

|  | コマンド |
|:----|--------:|
| タブ | C-q C-i |
| 改行 | C-q C-j |


## 忘れた時
(忘れたとき用の確認方法も忘れるという罠)
```M-x replace-regexp```で「”¥n”」を置換しようとすると教えてくれる。
ipaファイルが64bit対応しているか調べる方法

## lipoコマンドでわかる

```lang:filename
xcrun lipo -info <path_for_binary>
```

## ipaファイルをそのままlipoするとだめ

```lang:filename
xcrun lipo -info /Users/hoge/Desktop/hoge.ipa
fatal error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo: can't figure out the architecture type of: /Users/hoge/Desktop/hoge.ipa
```

## ipaファイルを展開してlipoする

1. ipaファイルの拡張子をzipにして解凍する
2. 解凍したフォルダにアプリケーションがあるので、「パッケージの内容を表示」する
 ![スクリーンショット 2015-02-17 11.02.14.png](https://qiita-image-store.s3.amazonaws.com/1190/50839/2ac415fa-2b6a-ce68-4fab-683e6c6ca703.png)

3. 展開されたフォルダにexecファイル（unix実行ファイル）があるので、それをlipoする![スクリーンショット 2015-02-17 11.04.36.png](https://qiita-image-store.s3.amazonaws.com/1190/50839/bedada82-06ae-7868-fcdf-4ffd9f3fce98.png)

4. lipoするとこんな感じ

```lang:filename
xcrun lipo -info /Users/hoge/Desktop/Payload/hoge.app/hoge
Architectures in the fat file: /Users/hoge/Desktop/Payload/hoge.app/hoge are: armv7 arm64
```
EclipseでTomcat起動時に、絶対にあるはずのクラスでClassNotFoundExceptionが出る場合

発生確率自体は結構高いみたいですし、
対処法を知らないと、たとえEclipseをダウンロードし直しても解決しない厄介な問題なので、一応。

# 対象の現象

EclipseでJava+Tomcatの開発をしている時、
ビルドは正しく通るのに、Tomcatの起動時にClassNotFoundExceptionが出て起動できない現象に陥る事があります。
※表面的には、「絶対にあるはずのクラス（またはjarファイル）が見つからないと言われてる」ようなログが出ます。

その時に、それがMavenを使ったプロジェクトの場合、ローカルリポジトリが壊れてる可能性があります。

# 他の原因の可能性を一通り排除

何かの拍子に起こってるだけのエラーかもしれないので、以下の手順を一通り試します。

1. プロジェクトをF5（refresh）
2. プロジェクトをAlt+F5(MavenのUpdate Project)
3. プロジェクトをクリーンビルド
4. Eclipseをclean再起動

それでもダメな場合、以下の手順でローカルリポジトリの再作成を試してみてください。

# mavenのローカルリポジトリの再作成

※基本的に、.m2フォルダ内にrepositoryフォルダが無ければプロジェクト更新時に勝手に再作成するので、
以下の手順で一度repositoryフォルダを削除すればOKです。

1. Eclipseをクローズする。（起動したままだと、ローカルリポジトリ内のファイルを掴んだままで以下の手順が失敗する可能性があるため）
2. .m2フォルダに移動する。（通常は、『C:/Users/{UserName}/』フォルダ下にあるはずです。）
3. repositoryフォルダを削除する。（他の場所に移動、またはフォルダ名を変えるだけでもいいです）
4. Eclipseを起動する。
5. Alt+F5(MavenのUpdate Project。※上記のrepositoryフォルダを作り直して必要なjarファイルをダウンロードしてくるので、時間がかかります)
6. Tomcatを起動する。

以上。
自分用のVirutalBoxで仮想マシン設定メモ

# これは何？
* 自分がよくやるVirtualBoxでの仮想マシンの設定メモ
   * VirutalBoxにCentOSで立てた場合、SSHで接続しつつ、外部へも接続できる環境を構築した際のメモ

※　たぶんCentOSに限った話では無いと思いますが、念のため。

# 環境
* CentOS 6.6
→　イメージは公式サイトよりDLしたものを使用

* VirtualBox 4.3.20

# ネットワークの設定

## VirtualBox側

1. [設定]→[ネットワーク]の項目で[アダプター1]タブを選択する。
2. [割り当て]を[NAT]にする

![アダプター1](http://i.gyazo.com/368a0d8c9a969bfcfc70fa887a24a72d.png)

1. [設定]→[ネットワーク]の項目で[アダプター2]タブを選択する。
2. [割り当て]を[ホストオンリーアダプター]にする

![アダプター2](http://i.gyazo.com/6a4e8f2b5d58117bfca7fbef93fb9ca0.png)

## ゲストOS側

### eth0 はNATなので外部のネットワークにつながる用のアダプター

```:/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
HWADDR=00:00:00:00:00:00
TYPE=Ethernet
UUID=xxxxxx-xxxxxx-xxxx-xxxx
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=dhcp
```

※ ```BOOTPROTO=DHCP```にしておく。必要に応じて固定IPの必要がある場合は、eth1の真似をして設定する。

### eth1 はホストコンピュータとsshさせる用のアダプター

```:/etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth0
HWADDR=00:00:00:00:00:00
TYPE=Ethernet
UUID=xxxxxx-xxxxxx-xxxx-xxxx
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
IPADDR=192.168.56.2
NETMASK=255.255.255.0
IPV6INIT=no
```

※ ```IPADDR```で固定IPにしておくのと、```BOOTPROTO=none``` にしておくことがポイント

※ ```/etc/sysconfig/network-scripts/ifcfg-eth0```　が存在しない場合がある。その場合は自分で上の内容をかく。UUIDとかはたぶん省略しても動いたはず。

## 動作確認

### sshの疎通確認

たぶん、

* ホストOSでは ```192.168.56.1``` のアドレス
* ゲストOSでは ```192.168.56.2``` のアドレス

になっているはず。

なので、WindowsであればPuttyなどで、192.168.56.2にsshでアクセスする。

※ ホストOSのIPは、```ipconfig```コマンドで確認すると降られているIPが分かる。
![HostOnlyAdapater_HOST_OS](http://i.gyazo.com/f1f1980f8d65ac61eb87459e61d68069.png)

※ ゲストOSのIPは、```ifconfig```コマンドのeth1の項目を見ればOK

### 外部ネットワークの疎通確認

```bash
curl http://www.yahoo.co.jp
```

で接続確認。出来ない場合は、ゲストOSが起動中にNATを設定した場合、ゲストOSを再起動する事で、外との通信が可能になる。

# 参考情報
* http://qiita.com/tamamius/items/3af63f66ca81b165c319 - ethの設定について参考にしました
* http://c-through.blogto.jp/archives/14539119.html - VirtualBoxのネットワークの仕組みについて参考にしました。ホストオンリーアダプターについては図が分かりやすかった。
SEOの本は買うだけ無駄だった

WEB開発者の皆さんこんにちは。
SEO対策ってめんどくさいですよね。いろいろな情報があふれていて何が本当かわからない。
そもそも本当のことはGoogleにしかわからないことを外野からああでもないこうでもないって言っているので当たり前ですね。
何を信用したらいいかわからない、とお悩みの方も多いと思います。

そんなあなたのためにGoogleがお役立ち情報を無料で公開しているのをご存知ですか？

それが「検索エンジン最適化スターターガイド」（http://static.googleusercontent.com/media/www.google.com/ja//intl/ja/webmasters/docs/search-engine-optimization-starter-guide-ja.pdf ）です。

Googleの検索やユーザビリティに対する考え方、どんなページを良質なページとして評価するのか、といったガイドラインをわかりやすく説明してくれています。
本家の情報なので信頼性も高く、文章や図もわかりやすくまとめられています。

SEOについてよくわからないので本を買って読んでみようと思っている方、先にこの文書に目を通してみてはどうでしょうか？知りたかった情報が無料で手に入るかもしれませんよ。
先に本を読んでもよくわからなかった人や、本を読んで理解した内容を今実践しているが効果がよくわからない、正しく実践できているかわからない、といった人にも、もちろんお勧めです。
つまりSEOを実践しようとしている人なら全員が必読ってことですね！
Java：文字列のパターンマッチング

##参考
[素晴らしいサイト](http://www.javadrive.jp/regex/)

##記述例

```java:Main.java
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {

	static final String text = "Sample Text hoge Hellow World piyo and hoge Good-bye World piyo";

	public static void main(String args[]) throws Exception {

		Pattern p1 = Pattern.compile("hoge");
		Pattern p2 = Pattern.compile("piyo");

		Matcher m1 = p1.matcher(text);
		Matcher m2 = p2.matcher(text);

		while (m1.find() && m2.find()) {
			System.out.println(text.substring(m1.end(), m2.start()));
		}
	}
}
```

---
```出力
 Hellow World 
 Good-bye World 
```
basic認証の設置 - Ruby on Rails環境構築 09


basic認証について説明していきます。環境構築を何回かに分けて明記しています。OSはCentOSです。Apacheでの設定です。

下記コマンドでインストールします

```
sudo yum install httpd-tools
```

```
/home/appname/.htpasswd
```
という新規パスワードファイルに

```
guest
```
ユーザを追加する場合、以下のようにコマンドを実行します。

```
sudo -u appname htpasswd -c /home/appname/.htpasswd guest
```

```
New password:
```
と聞かれますので、パスワードを2回入力します。

ユーザ削除の場合は、下記です。

```
sudo -u appname htpasswd -D /home/appname/.htpasswd guest
```

バーチャルホストの設定の
```
<Directory>
```
内に以下を追加します。

```
AuthType Basic
AuthName "Welcome"
AuthUserFile /home/appname/.htpasswd
Require valid-user
```
MySQL互換DB FusionI/O最適化リリースについて調査

MariaDB10.0、PerconaServer5.6、MySQL5.7がFusionI/Oに最適化したらしい。
どのような最適化なのか、また条件なども調べたものをメモしておく。
※2015/02時点の調査

#### 各陣営の公式発表
MariaDB10.0
https://mariadb.com/kb/en/mariadb/fusion-io-directfs-atomic-write-support/

PerconaServer5.6
http://www.percona.com/doc/percona-server/5.6/performance/atomic_fio.html

MySQL5.7
http://downloads.mysql.com/presentations/20140425_04-MySQL5.7.pdf

#### 概要

* FusionI/O提供のAPIとDirectFSを用いる
* MySQLのdoublewriteを無効にしatomicwriteを有効にすることにより高速化
* doublewrite設定が有効な場合でも自動的に無効化される

#### 詳細
* 対応製品はioMemoryに限られる。ioDrive2やioScaleなどは非対応。※既にハードルが高い…。
* アプリケーションによってDirectFSが検出される必要があるということ。
* DirectFSはFusionI/O社提供のioMemorySDKを入手する必要がある。
* ioMemorySDKにはioMemoryにはioMemoryに高速アクセスするためのAPIが備わっている。
* アプリコード内でioMemoryAPIを使用することにより高速アクセスの機能を実装する
* ioMemorySDKを入手するにはFusion-ioDeveloperProgramに登録している必要がある。
* 具体的にはdirectPrimitivesAPIを使えばよいのだと思う。
* DirectFSの導入方法などは現時点では不明。普通にインストールしてmountを使えばよいのだろうか？

#### 結論
新製品「ioMemory」だけに対応しているのでこの機能については今のところ現実的ではない。

#### 参考
http://enterprisezine.jp/article/detail/3940
http://www.fusionio.com/jp/products/iomemorysdk/?utm_source=redirects&utm_medium=fusionio.jp&utm_campaign=301_Redirects
http://itpro.nikkeibp.co.jp/article/NEWS/20140707/569683/
【Android】getRunningTasksが使えなくなったLollipopでアプリ使用状況を取得する


Lollipopになって、privacyについて強化するためかActivityManagerのgetRunningTasksやgetRecentTasksはdeprecatedとなりました。

非推奨なだけでなく挙動も変わってます。

現状の挙動は結果は返却されますが、 **そのメソッドを呼んだアプリ自身もしくはランチャーアプリの情報しか帰ってこないようになっています。**


今回はその代替手段について調べてみました。

## UsageStatsManagerを使う

UsageStatsManagerのqueryEventsを使って得られるUsageEventsから、各アプリがforegroundもしくはbackgroundになったときのtimestamp、classNameが取得できます。


```
    UsageStatsManager stats = (UsageStatsManager) getSystemService("usagestats");
    UsageEvents usageEvents = stats.queryEvents(start, end);
    while (usageEvents.hasNextEvent()) {
        UsageEvents.Event event = new android.app.usage.UsageEvents.Event();
        usageEvents.getNextEvent(event);
        long timestamp = event.getTimeStamp();
        String packagName = event.getPackageName();
        String className = event.getClassName();
        int type = event.getEventType();
        :
    }
```
```xml:AndroidManifest.xml
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"/>
```

ただ、このままするといくらやっても、 **usageEvents.hasNextEvent()** は常にfalseを返してきます。

これを解消するには **設定->セキュリティー->使用履歴にアクセスできるアプリ にて自分のアプリをONにしてもらう必要があります**

<img src="https://qiita-image-store.s3.amazonaws.com/0/47114/879da070-b64d-d382-5cd8-ad3a1961dd67.png" width=300 />

これをONにすることでUsagEventsを取得する事ができるようになります。

ちなみにアプリからこの画面にぶっ飛ばすには下記コードで大丈夫です

```
startActivity(new Intent("android.settings.USAGE_ACCESS_SETTINGS"));
```

~~現状調査した範囲では、自分のアプリが取得可能な状態になっているかを判断するには一度「UsageStatsManagerで取得してみる」というしかないようです。
他に方法を見つけたら追記します。~~


自分のアプリが取得可能な状態になっているかどうかは、下記コードで確認可能のようです！

```
public boolean isUsageStatsAllowed() {
    AppOpsManager appOps = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE);
    int uid = android.os.Process.myUid();
    int mode = appOps.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS, uid, getPackageName());
    return  mode == AppOpsManager.MODE_ALLOWED;
}
```
sslの取得と設定 - Ruby on Rails環境構築 08


sslの取得と設定について説明していきます。環境構築を何回かに分けて明記しています。OSはCentOSです。

ドメインがexample.comと仮定して作成しています。

## ドメイン取得者の情報の取得

whoisをインストールして調査します。

```
sudo yum install jwhois
```

whoisコマンドにドメイン名を与えます。

```
whois example.co.jp
```
- sslサーバー証明書の申請で仕様数情報は、原則としてWHOIS情報と一致させてください。

## ドメインメールアドレスの確認
example.comのために証明書を取得する場合、```administrator@example.com```宛にメールが届き、そのメールから手続きが進みます。ユーザ名はadministrator, postmaster, webmasterなどから選べるようになっています。事前にメールが対象のアドレスに届くか確認しておきます。

## 秘密鍵の作成
Webサーバの秘密鍵を作成します。

まず、ディレクトリを作成し、移動します。

```
sudo mkdir -p /usr/local/etc/ssl/private
cd /usr/loca/etc/ssl/private
```

秘密鍵を作成します。

```
sudo openssl genrsa -out example.com.key -des3 2048
```
- パスフレーズを2回求められるので入力してください。

秘密鍵ファイルのパーミッションを変更します。

```
sudo chmod 400 example.com.key
```

最後に秘密鍵からパスフレーズを削除します。Webサーバを自動起動するために必要な手順になります。

```
sudo mv example.com.key example.com.key.orig
sudo openssl rsa -in example.com.key.orig -out example.com.key
```

## CSRの作成

申請に必要なCSRを作成します。

```
sudo openssl req -new -key example.com.key -out ../example.co.csr
```

サイト所有者の情報を対話的に入力していきます。

|項目名|説明|
|----|------|------|
|Country Name|日本ならJP|
|State of Province Name|都道府県|
|Loclity Name|市区町村名|
|Organization Name|whoisコマンドのOrganizationまたはRegistrant Name|
|Organization Unit Name|組織の部門名、省略可能|
|Common Name|サーバのドメイン名|


example.co.csrが作成されます。

## SSL証明書の申し込み
認証局により異なりますが、サイトの指示に従い、証明書を発行すると設定したメールアドレスにメールが届きます。※サイトにて先ほどのCSRの内容を入力する部分が有ります。

メールにて送られてきたSSL証明書をコピーして任意のファイル名で保存します。example.com.pemとしておきます。

中間CA証明書のある場合、ca.pemとして保存しておきます。ca.pemには中間CA証明書→クロスノート証明書（ssl認証局によって異なる）を記載します。

## 証明書の設置
scpでサーバに先ほどのファイルをアップロードします。

```
scp example.com.pem ca.pem example.com:~
```

SSHでログインして、証明書を移動します。

```
ssh yourname@契約したIPアドレス
sudo mkdir -p /usr/local/etc/ssl/certs
sudo mv example.com.pem ca.pem /usr/local/etc/ssl/certs
sudo chown root:root /usr/local/etc/ssl/certs/*.pem
```

mod_sslをインストールします。

```
sudo yum install -y mod_ssl
```

非SSL用の設定ファイルをappnameをコピーします。

```
cd /etc/httpd/sites-available
sudo cp appname appname-ssl
```
- appnameは適宜変更してください。

エディタでappname-sslを開き、1行目を修正します。

```
sudo vi appname-ssl
```
```
<VirtualHost 契約したIPアドレス:443>
```

2行目に下記を挿入して保存します。

```
SSLEngine on
SSLCertificateKeyFile    /usr/local/etc/ssl/private/example.com.key
SSLCertificateFile       /usr/local/etc/ssl/certs/example.com.pem
SSLCertificateChainfile  /usr/local/etc/ssl/certs/ca.pem

BrowserMatch "MSIE [2-6]" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
```

シンボリックを設定します。

```
sudo ln -s /etc/httpd/sites-available/appname-ssl /etc/httpd/sites-enabled/002-appname-ssl
```

最後にApacheを再起動します。

```
sudo service httpd restart
```
Railsの確認 - Ruby on Rails環境構築 07


Railsの動作確認・Webサーバの設定について説明していきます。各設定をを行います。環境構築を何回かに分けて明記しています。OSはCentOSです。

## Railsアプリケーションの動作確認
```
rake secret
```

で作成した文字列をコピーします。

secret.ymlを開きます。

```
vi home/appname/rails_root/config/secret.yml
```

以下の部分に文字列を挿入します。

```
production:
  secret_key_base: "ここに挿入"
```
- home/appname/rails_root/config/secret.ymlは.gitignoreに追記しましょう。


- apacheをrestartします。
- Webブラウザから設定したドメインにアクセスします。
※ ドメインをお名前.comなどで取得した場合などはそちらにも設定が必要となります。
- 表示されればOKです。

## キャッシュ制御
エディタで/etc/httpd/sites-available/appnameを開きます。

```
sudo vi /etc/httpd/sites-available/appname
```
- appnameは適宜変更してください。

</VirtualHost>の直前に以下を追記します。

```
<Directory "/home/appname/rails_root/public/assets/">
  ExpiresActive On
  ExpiresDefault "access plus 1 year"
  Header set Cache-Control "public"
  Header unset ETag
  FileETag None
</Directory>
```
- appnameは適宜変更してください。

## Gzipによる圧縮

エディタで/etc/httpd/sites-available/appnameを開きます。

```
sudo vi /etc/httpd/sites-available/appname
```
- appnameは適宜変更してください。

下記の内容をFileETag Noneの直後(```</Directory>```の直前)に挿入して下さい。

```
AddEncoding x-gzip .gz
Header set Vary Accept-Encoding

RewriteEngine on
RewriteCond %{HTTP:Accept-Encoding} \b(x-)?gzip\b
RewriteCond %{REQUEST_FILENAME}.gz -f
RewriteRule ^(.*)$ $1.gz [L]

<FilesMatch \.css\.gz$>
  ForceType text/css
</FilesMatch>

<FilesMatch \.js\.gz$>
  ForceType text/javascript
</FilesMatch>
```

## エラーページの指定
エディタで/etc/httpd/sites-availale/appnameを開きます。

```
sudo vi /etc/httpd/sites-available/appname
```
- appnameは適宜変更してください。

次の内容をRackEnvの直後に挿入してください。

```
ErrorDocument 404 /404.html
ErrorDocument 500 /500.html
ErrorDocument 502 /500.html
ErrorDocument 503 /500.html
ErrorDocument 500 /500.html
```

## ログファイルのパスと出力形式
エディタで/etc/httpd/sites-availale/appnameを開きます。

```
sudo vi /etc/httpd/sites-available/appname
```
- appnameは適宜変更してください。

次の内容をRackEnvの直後に挿入してください。

```
CustomLog /var/log/httpd/appname_access.log common
ErrorLog /var/log/httpd/appname_error.log
```
- appnameは適宜変更してください。


## HTTPレスポンスヘッダの追加
エディタで/etc/httpd/sites-availale/appnameを開きます。

```
sudo vi /etc/httpd/sites-available/appname
```
- appnameは適宜変更してください。

下記を<VirtualHost>セクションまたは<Directory>セクションの中に記述します。

```
Header set X-Frame-Options SAMEORIGIN
Header set X-Content-Type-Options nosniff
Header set X-XSS-Protection "1; mode-block"
```

## リクエストボディのサイズ制限
```
LimetRequstBody 1073741824
```

## Basic認証
パスワードファイルにguestユーザを追加

```
sudo -u appname htpasswd -c /home/appname/.htpasswd guest
```

guestユーザを削除するとき

```
sudo -u appname htpasswd -D /home/appname/.htpasswd guest
```

エディタで/etc/httpd/sites-availale/appnameを開きます。

```
sudo vi /etc/httpd/sites-available/appname
```
- appnameは適宜変更してください。

<Directory>ブロックを次のように追記します

```
<Directory /home/appname/rails_root/public>
  AllowOverride all
  Options -MultiViews
  AuthType Basic
  AuthName "Welcome to appname"
  AuthUserFile /home/appname/.htpasswd
  Require valid-user
</Directory>
```
Apache Passenger - Ruby on Rails環境構築 06


Apache Passengerのインストールついて説明していきます。各設定をを行います。環境構築を何回かに分けて明記しています。OSはCentOSです。

## Apacheのインストール
sudo権限のあるユーザでログインします。

```
ssh yourname@契約したIPアドレス
```

httpd_develをインストール

```
sudo yum -y install httpd-devel
```
Apacheの自動起動を設定

```
sudo chkconfig httpd on
```

エディタで/etc/selinux/configを開きます。

```
sudo /etc/selinux/config
```

SELinux=で始まる行を次のように変更します。

```
SELinux=disable
```

CentOSを再起動します。

```
sudo service httpd restart
```

## Apacheの初期設定
以下のコマンドを実行します。

```
sudo su -
cd /etc/httpd
echo "Include /etc/httpd/sites-enabled/" >> conf/httpd.conf
mkdir sites-available
mkdir sites-enabled
rm conf.d/welcome.conf
exit
```

エディタで/etc/httpd/conf/httpd.confを開きます。

```
sudo vi /etc/httpd/conf/httpd.conf
```

下記の箇所のコメントを外します。

```
#ServerName www.example.com:80
```
```
#NameVirtualHost *:80
```

## Passengerのインストール

```
gem install passenger
```

下記、コマンドを入力します。

```
sudo passenger-install-apache2-module
```

表示された画面に従い、Enterキーを押します。
必要なファイルが表示されたら画面に従いインストールします。

インストール後、Please edit your Apache configuration file, and add these lines:の後の3行をコピーしておきます。

エディタで新規ファイル/etc/httpd/conf.d/passenger.confを開きます。

```
sudo vi /etc/httpd/conf.d/passenger.conf
```

このファイルに先ほどコピーした部分を貼り付けて保存します。

## デフォルトのバーチャルホストの設定
エディタで新規/etc/httpd/sites-available/defaultを開きます。

```
sudo vi /etc/httpd/sites-available/default
```

下記を書き込みます。

```
<VirtualHost *:80>
  DocumentRoot /var/www/html
  <Directory /var/www/html>
    AllowOverride all
    Options None
    Order Deny,Allow
    Deny from All
  </Directory>
</VirtualHost>
```

次のコマンドを入力します。

```
sudo ln -s /etc/httpd/sites-available/default /etc/httpd/sites-enabled/000-default
```

## バーチャルホストの追加
エディタで新規ファイル /etc/httpd/sites-available/appnameを開きます。

```
sudo vi /etc/httpd/sites-available/appname
```
- appnameは適宜変更してください。

続いて、下記を書き込みます。

```
<VirtualHost *:80>
  ServerName yourdomain.com
  DocumentRoot /home/appname/rails_root/public
  RackEnv production
  <Directory /home/appname/rails_root/public>
    AllowOverride all
    Options -MultiViews
  </Directory>
</VirtualHost>
```
- appname, yourdomainは適宜変更してください。

先ほどと同じようにシンボリックを作成します。

```
sudo ln -s /etc/httpd/sites-available/appname /etc/httpd/sites-enabled/001-appname
```
- appnameは適宜変更してください。

## Apacheにアクセス権付与
```
sudo gpasswd -a apache appname
```
- appnameは適宜変更してください。

## utwのインストール
下記コマンドでutwをインストールします。

```
sudo yum install wget make
mkdir -p ~/src
cd ~/src
wget https://launchpad.net/ufw/0.33/0.33/+download/ufw-0.33.tar.gz
tar xzf ufw-0.33.tar.gz
cd ufw-0.33
sudo python ./setup.py install
cd ..
sudo rm -rf ufw-0.33
sudo chmod -R g-w /etc/ufw /lib/ufw /etc/default/ufw /usr/sbin/ufw
```

iptablesとip6tablesを停止し、自動起動を設定します。

```
sudo service iptables stop
sudo service ip6tables stop
sudo chkconfig --del iptables
sudo chkconfig --del ip6tables
```

エディタで/etc/rc.localを開きます。

```
sudo vi /etc/rc.local
```

下記を追加します。

```
/lib/ufw/ufw-init start
```

# ufwの初期設定
外部からの通信を拒否します。

```
sudo ufw default reject
```

SSHによる接続を許可するため22番ポートを開放します。

```
sudo ufw allow 22
```

ファイアフォールを有効化します。

```
sudo ufw enable
```

メッセージにはyで答えます。

## ポートの開放
80番を開放します。

```
sudo ufw allow 80
```

443番を開放します。

```
sudo ufw allow 443
```
Railsの設置 - Ruby on Rails環境構築 05



Railsの設置について説明していきます。設置して各設定を行います。環境構築を何回かに分けて明記しています。OSはCentOSです。

## ユーザを作成
VPSにログインしていない時はログインしてください。

```
ssh yourname@契約したIPアドレス
```

Railsアプリーケーショ用のユーザ作成

```
sudo useradd -m appname
```
- appnameは適宜変更してください。

passwordを作成

```
su 
passwd appname
gpasswd -a appname wheel
su appname
```

パーミッションを変更します。

```
sudo chmod 750 /home/appname
```

.sshとauthorized_keysの確認

```
sudo ls -d ~appname/.ssh
sudo ls ~appname/.ssh
```
- ないときは作成してください。

SSH公開鍵を追加

```
sudo sh -c "cat ~yourname/.ssh/authorized_keys >> ~appname/.ssh/authorized_keys"
```
- yourname, appnameは適宜変更してください。

## sudoコマンド設定

```
sudo visudo
```

下記を探します。

```
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
```

修正します。

```
Defaults secure_path = /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/rbenv/shims
```

## ソースコードの取得

別のターミナルを開き、アプリケーションユーザとしてログインします。

```
ssh appname@契約したIPアドレス
```

GithubからClone

```
git clone git://github.com/yourId/xxx.gin rails_root
```
- ご自身のgitからクローンするように変更してください

## 依存するGemをインストール
RMagickを使用している場合

```
sudo yum install ImageMagick-devel ImageMagick-c++-devel
```

Gemfile群をbundle install

```
cd ~/rails_root
bundle install --path vendor/bundle --without development test
```

## データベースを作成
下記で作成されたパスワードをコピーしておきます。

```
pwgen 12 1
```

rootでMySQLモニターにログイン

```
mysql -u root -p
```

下記、コマンドを実行

```
mysql> CREATE DATABASE appname_production DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
mysql> CREATE USER 'appname'@'localhost' IDENTIFIED BY '先ほど作成したパスワード';
mysql> GRANT ALL ON appname_production.* TO 'appname'@'localhost';
mysql> quit
```
- appnameは適宜変更してください。

## config/database.yml

```
vi config/database.yml
```

以下のように書き換えます。

```
production:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: appname_production
  pool: 5
  username: appname
  password: 先ほど作成したパスワード
  socket: /var/lib/mysql/mysql.sock
```
- appnameは適宜変更してください。
- development, testは削除します。

## データベースに初期データを投入

```
cd ~/rails_root
RAILS_ENV=production bundle exec rake db:setup
```
Deviceを使用しているとエラーが出ます。エラー時に作成されたconfig.secret_key='シークレットキー'をconfig/initializers/device.rbに追記しましょう。


## アセットパイプラインのプリコンパイル
```
bundle exec rake assets:precompile RAILS_ENV=production
```

エラーになる時はGemfileを編集し、

```
# gem 'therubyracer',  platforms: :ruby, group: :production
```
ここのコメント外してbundle installしましょう。

public/assets以下にCSS、JavaScript、画像が作成されます。

```
ls -l public/assets
```
各種インストール - Ruby on Rails環境構築 04



各種パッケージのインストールについて説明していきます。インストール、初期化を行います。環境構築を何回かに分けて明記しています。OSはCentOSです。

## 各種インストール
SSHでログインします。

```
ssh yourname@契約したIPアドレス
```

インストールします。

```
sudo yum -y install gcc gcc-c++ make autoconf openssl-devel readline-devel libyaml-devel mysql-devel wget git
```

## Rubyのビルド
### rbenvをシステムワイドにインストール
ユーザをrootに変更

```
su
cd /usr/local
```

クローン

```
git clone https://github.com/sstephenson/rbenv.git ./rbenv
```

### 環境設定
新規ファイル

```
vi /etc/profile.d/env.sh
```

下記を記載

```
export RBENV_ROOT="/usr/local/rbenv"
PATH="$RBENV_ROOT/bin:$PATH"
export PATH
eval "$(rbenv init -)"
```

### ruby-build を インストール
```
cd /usr/local/rbenv
mkdir ./plugins
cd ./plugins
git clone https://github.com/sstephenson/ruby-build.git ./ruby-build
```

### Rubyをインストール
お使いのバーションをインストールしてください。

```
rbenv install -v 2.0.0-p353
```

### 再読み込み

```
rbenv rehash
```

### 設定

```
rbenv global 2.0.0-p353
```

### 確認

```
ruby -v
```

## RubyGems
### 更新

```
gem update --system
```

### 確認

```
gem --version
```

<!--### 設定
```
vi ~/.gemrc
```
下記を入力して保存してください。
```
install: --no-ri --no-rdoc
update: --no-ri --no-rdoc
```
-->

## Bundler
### インストール

```
gem install bundler --no-ri --no-rdoc
```

### 確認

```
bundle -v
```
コマンドで検索する際、ファイル数が多い時はfindよりlocate


# locate
findみたいなの。けど検索結果吐き出すのが早い。
定期的に更新しないといけないのが面倒。
findはその場でディレクトリを検索するのでlocateより検索時間がかかってしまうらしい。

1. 一番最初にlocateで検索しようとするとエラーが出ると思います。
　以下のコマンドを打ち込んで、データベースを作成してください。
　（エラーメッセージにも書いてある）

```
$ sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist
```

2. データベース作成します。時間がかかるときもあるらしいので、数分待ちます。

3. （これで使えない場合は）以下のコマンドでデータベースを更新する。
　　定期的に以下のコマンドで更新する必要があります。

```
$ sudo /usr/libexec/locate.updatedb
```


## 使用例

`$ locate httpd.conf`
と打つと、httpd.confを検索します。

以下のように検索結果が出てきます。
`/etc/apache2/httpd.conf` 


ファイル数が多い時は確実にlocate使ったほうが早かったのでメモ。
MySQLのインストール - Ruby on Rails 環境構築 03


MySQLのインストールについて説明していきます。インストール、初期化を行います。今回はアプリケーションと同じサーバ上にインストールします。環境構築を何回かに分けて明記しています。OSはCentOSです。

## インストールから初期化まで
VPSにログイン

```
ssh yourname@契約したIPアドレス
```

## インストール
```
sudo rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
sudo rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm --nodeps
sudo yum -y update
sudo yum --enablerepo=remi -y install mysql-server mysql-devel
```

## 初期化
```
sudo mysql_install_db
```

MySQLサーバーを起動し、ブート時に自動起動を設定

```
sudo service mysqld start
sudo chkconfig mysqld on
```

## 初期設定
ランダムなパスワードを作成するpwgemのインストール

```
sudo yum -y install pwgen
```

下記でパスワードを作成し、コピーしておいてください

```
pwgen 12 1
```

MySQLモニターを起動します。

```
mysql -u root
```

以下のように表示されます。

```
mysql>
```

下記のように入力してください。

```
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('コピーしたパスワード');
```

MySQLモニターからログアウトしてください。

```
mysql> quit;
```

これでrootでMySQLモニターにログインできるようになりました。

```
mysql -u root -p
```

Enter passwordに先ほどのパスワードを入力してログインできることを確認してください。

## testデータベースを削除
初期状態に存在するtestデータベースを削除しておきます。

```
mysql> DROP DATABASE test;
```

## my.cnfの変更
MySQLモニターからログアウトします。

```
mysql> quit;
```

my.cnfを編集します。

```
sudo vi /etc/my.conf
```

下記を追記します。

```
bind-address=127.0.0.1
```

パフォーマンスの設定を追記します。

```
innodb_buffer_pool_size=1024M
innodb_log_file_size=256M
```
- ※innodb\_buffer\_pool\_sizeにはメモリの50〜80％
- ※innodb\_log\_file\_sizeはメモリの4分の1

my.cnfを保存し、ログファイルを削除しておきます。

```
sudo service mysqld stop
sudo rm -f /var/lib/mysql/ib_logfile0
sudo rm -f /var/lib/mysql/ib_logfile1
sudo service mysqld start
```
SSH鍵ペアの作成 - Ruby On Rails環境構築 02


SSH鍵ペアの作成を説明していきます。SSH公開鍵をVPSに転送します。作成した環境構築を何回かに分けて明記しています。

## SSH鍵ペアの作成
VPSに接続している場合は、ターミナルの別タブを開くか、VPSからログアウトしてください。

鍵ペアが作業マシンに存在しているか確認します。

```
ls ~/.ssh/id_rsa*
```

存在しない場合

```
ssh-keygen
```
鍵ペアを保存するパスを尋ねられるので、Enterキーを押してください。
SSH秘密鍵をとくためのパスフレーズを入力して、Enterキーを押してください。

## SSH公開鍵をVPSに設置
scpコマンドでVPSに転送します。

```
scp ~/.ssh/id_rsa.pub yourname@契約したIPアドレス:
```

SSHで作業マシンからVPSにログインします。

```
ssh yourname@契約したIPアドレス
```

下記のコマンドを順に入力

```
mkdir -p -m 700 .ssh
cat id_rsa.pub >> .ssh/authorized_keys
chmod 600 .ssh/authorized_keys
rm id_rsa.pub
```

## SSHクライアントの設定ファイル
作業マシンに新規ファイルを作成、存在している場合は追記してください。

``` 
Host *
  ForwardAgent yes
  ServerAliveInterval 300
```

### システム全体の設定ファイル
Macの方はエディタで/etc/ssh/ssh_configを開き、

```
SendEnv LANG LC_*
```
をコメントアウトしてください。

## /etc/skelディレクトリ
VPSで新規ユーザを作成した時のためにauthorized_kesyを/etc/skelディレクトリにひな形を作っておきます。

まずはVPSにSSHでログイン

```
ssh yourname@契約したIPアドレス
```

ファイルを作成

```
cd /etc/skel
sudo mkdir -m 700 .ssh
sudo touch .ssh/authorized_keys
sudo chmod 600 .ssh/authorized_keys
```
VPSでの準備 - Ruby on Rails環境構築 01


VPSでの準備を説明していきます。VPSはさくらのVPSを使います。OSはCentOSです。環境構築を何回かに分けて明記します。

## VPSの起動
[https://secure.sakura.ad.jp/vps/](https://secure.sakura.ad.jp/vps/)にログインしてサーバーを起動します。


## sshで接続

作業マシン

```
ssh root@契約したIPアドレス
```
- パスワード（契約した時の管理用初期パスワード）を入力します。

※パスワード入力前に(yes/no)を聞かれるのでyesを入力。

## Vimをインストール
作業マシン

```
yum -y install sudo vim
```

## 一般ユーザの作成
```
useradd -m yourname
passwd yourname
```
- yournameの部分は適宜変更してください。
- パスワードを聞かれるので2回入力。

## sudo権限の付与
ユーザyournameにsudo権限を付与します。

```
vi /etc/sudoers.d/00_wheel
```

で新規ファイルを作成し、内容を

```
%wheel ALL=(ALL) ALL
```

で作成し、下記コマンドを入力

```
chmod 400 /etc/sudoers.d/00_wheel
gpasswd -a yourname wheel
```
CentOS5.8 の gitを1.7.11→1.9.0にバージョンアップ

## 環境
OS : CentOS release 5.8

## 今のバージョン確認
`$ git --version`
git は 1.7.11

## git 削除
`$ sudo yum remove git`

## 依存パッケージ入れる
`$ sudo yum install -y zlib-devel perl-devel gettext`

## git1.9 ダウンロード
`$ cd /usr/local/src`
`$ sudo wget https://git-core.googlecode.com/files/git-1.9.0.tar.gz`

## インストール
* 解凍
`$ sudo tar zxvf git-1.9.0.tar.gz`

* 解凍してできたディレクトリに移動
`$ cd ./git-1.9.0`

* 設定ファイル作成
`$ sudo ./configure -prefix=/usr/local`

* make
`$ sudo make`

* install
`$ sudo make install`

## バージョン確認
`$ git --vesrion`
git 1.9.0