OmniAICreator/Qiita-1.07M huggingface dataset:
Cactiインストール

#SNMPインストール
```
# yum install net-snmp
# yum install net-snmp-utils
# vi /etc/snmp/snmpd.conf
```
```sh:/etc/snmp/snmpd.conf
...

#       sec.name  source          community
#com2sec notConfigUser  default       public
com2sec local localhost      public
#com2sec mynet 192.168.1.0/24 public

...

#       groupName      securityModel securityName
#group   notConfigGroup v1           notConfigUser
#group   notConfigGroup v2c           notConfigUser
group mygroup v1 local
#group mygroup v1 mynet

...

# Make at least  snmpwalk -v 1 localhost -c public system fast again.
#       name           incl/excl     subtree         mask(optional)
#view    systemview    included   .1.3.6.1.2.1.1
#view    systemview    included   .1.3.6.1.2.1.25.1.1
view all included .1 80

...

#       group          context sec.model sec.level prefix read   write  notif
#access  notConfigGroup ""      any       noauth    exact  systemview none none
access mygroup "" any noauth exact all none none

...

disk / 10000 
```
```
# chkconfig snmpd on
# /etc/rc.d/init.d/snmpd start
```


#RRDToolインストール
```
# yum install rrdtool
```

#mysqlインストール
```
# yum install mysql-server
# yum install php-mysql
# chkconfig mysqld on
# /etc/rc.d/init.d/mysqld start
```

#cactiインストール
```
# yum install cacti
```

#mysql DB作成
```
# mysqladmin --user=root create cacti
# mysql cacti < /usr/share/doc/cacti-0.8.8b/cacti.sql
# mysql --user=root mysql
> grant all on cacti.* to cacti@localhost identified by '$PASSWORD';
> flush privileges;
> exit;
```

ログインできるか確認

```
# mysql -u cacti -p
```

#cacti設定
```
# chown -R cacti:cacti /usr/share/cacti
# chmod 755 /etc/cacti/db.php
# vi /etc/cacti/db.php
```
```php:/etc/cacti/db.php
...
$database_username = "cacti";
$database_password = "$PASSWORD";
...
```

cron起動(コメントアウトをはずす)

```
# vi /etc/cron.d/cacti
```

BASIC認証設定

```sh:/etc/httpd/conf.d/cacti.conf
...

<Directory /usr/share/cacti/>
    AuthType Basic
    AuthName "Secret Zone"
    AuthUserFile /var/www/.htpasswd
    Require user junsuke
#       <IfModule mod_authz_core.c>
#               # httpd 2.4
#               Require host localhost
#       </IfModule>
#       <IfModule !mod_authz_core.c>
#               # httpd 2.2
#               Order deny,allow
#               Deny from all
#               Allow from localhost
#       </IfModule>
</Directory>

...
```

#この辺りの設定はいらないかも

PHPセッションディレクトリの書き込み権限がないとログイン出来ない。

```
# chown -R apache:apache /var/lib/php/session 
```

データ作成のためパーミッション変更必要？

```
# chmod 777 /var/lib/cacti/rra
```


#httpd再起動

```
# /etc/rc.d/init.d/httpd restart
```
`http://HOST/cacti/` にアクセス。
初回アクセス時の設定はそのままハイハイ。
初回ログインは admin/admin で。
管理者パスワードの設定して、ログイン。


####参考
http://c.itdo.jp/technical-information/cacti/181-cacti-install-ex.html
http://centossrv.com/rrdtool-cacti.shtml
http://d.hatena.ne.jp/eco31/20101212/1292120350


####環境
CentOS6.4 (さくらのVPS)
Cacti0.8.8b
PHP5.3.3
MySql5.1.69
ActiveRecordでカラム毎にcharsetとcollationを指定する


MySQLではカラム毎にcharsetとcollationを指定できるので、こういうMigrationファイルがあったときに

```ruby:db/migrate/20131120120000_create_users.rb
class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :email, charset: 'ascii', collation: 'ascii_bin', null: false
      t.string :password_digest, charset: 'ascii', collation: 'ascii_bin'
      t.timestamps
    end

    add_index :users, :email, name: "idx_email", unique: true
  end
end
```

こういうテーブルをCREATEしてほしい。

```sql
CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `email` varchar(255) CHARACTER SET ascii COLLATE ascii_bin NOT NULL,
  `password_digest` varchar(255) CHARACTER SET ascii COLLATE ascii_bin DEFAULT NULL,
  `created_at` datetime DEFAULT NULL,
  `updated_at` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC
```

ちょっと長いけど以下のコードをてきとうにRailsで読み込まれるところにコピペしてもらうといい感じに動くのではないかと思います。

```ruby:config/initializers/activerecord.rb
ActiveSupport.on_load :active_record do

require 'active_record/connection_adapters/abstract_mysql_adapter'

module ActiveRecord::ConnectionAdapters
  class AbstractMysqlAdapter
    class ColumnDefinition < ActiveRecord::ConnectionAdapters::ColumnDefinition
      attr_accessor :charset, :collation
    end

    class TableDefinition < ActiveRecord::ConnectionAdapters::TableDefinition
      def new_column_definition(name, type, options) # :nodoc:
        column = super
        column.charset = options[:charset]
        column.collation = options[:collation]
        column
      end

      private

      def create_column_definition(name, type)
        ColumnDefinition.new(name, type)
      end
    end

    class SchemaCreation < AbstractAdapter::SchemaCreation
      def column_options(o)
        column_options = super
        column_options[:charset] = o.charset
        column_options[:collation] = o.collation
        column_options
      end

      def add_column_options!(sql, options)
        if options[:charset]
          sql << " CHARACTER SET #{options[:charset]}"
        end
        if options[:collation]
          sql << " COLLATE #{options[:collation]}"
        end
        super
      end
    end

    def prepare_column_options(column, types)
      spec = super
      spec[:collation] = column.collation.inspect if column.collation && column.collation != collation
      spec
    end

    def migration_keys
      super + [:collation]
    end

    private

    def create_table_definition(name, temporary = false, options = nil, as = nil)
      TableDefinition.new(native_database_types, name, temporary, options, as)
    end
  end
end

end
```

Rails 4.0.0以降で動きます。

【追記】上記のパッチは[activerecord-mysql-awesome](https://rubygems.org/gems/activerecord-mysql-awesome)にてリリースしているのでこちらをお使い頂くのがよいかと思います。
Amazon Linuxにjdk 1.7をインストールしてマルチバージョン環境構築 手順メモ

Amazon LinuxにOracleのJDK 1.7をインストールして通常のjava, javacコマンドを1.7に入れ替えます。
利用したのはjdk-7u45-linux-x64.rpm

ダウンロードは公式サイトから。
http://www.oracle.com/technetwork/jp/java/javase/downloads/index.html

```shell-session:インストール
rpm -ihv jdk-7u45-linux-x64.rpm
```

デフォルトのjavaコマンドは/etc/alternatives以下からリンクが貼られている。
実際のパスは /usr/lib/jvm/jre-1.6.0-openjdk.x86_64、
RPMでインストールしたJDKは/usr/java/jdk1.7.0_45にインストールされる。
このインストールしたバージョンには/usr/java/default -> /usr/java/latest ->からリンクが貼られているので、利用するパスは/usr/java/defaultとする。これでOracleのRPMでインストールすると最新版が利用されるようになるはず。
ついでにjavacとjavadocもスレーブとして同時に切り替えられるようにする。

```shell-session:alternatives
alternatives --install /usr/bin/java java /usr/java/default/bin/java 16745 \
--slave /usr/bin/javac javac /usr/java/default/bin/javac \
--slave /usr/bin/javadoc javadoc /usr/java/default/bin/javadoc \
--slave /usr/bin/keytool keytool /usr/java/default/bin/keytool \
--slave /usr/bin/orbd orbd /usr/java/default/bin/orbd \
--slave /usr/bin/pack200 pack200 /usr/java/default/bin/pack200 \
--slave /usr/bin/rmid rmid /usr/java/default/bin/rmid \
--slave /usr/bin/rmiregistry rmiregistry /usr/java/default/bin/rmiregistry \
--slave /usr/bin/servertool servertool /usr/java/default/bin/servertool \
--slave /usr/bin/tnameserv tnameserv /usr/java/default/bin/tnameserv \
--slave /usr/bin/unpack200 unpack200 /usr/java/default/bin/unpack200 \
--slave /usr/lib/jvm-exports/jre jre_exports /usr/java/default/jre/lib \
--slave /usr/lib/jvm/jre jre_exports /usr/java/default/jre
```

ついでにjava7コマンドも作っておく

```shell-session:java7コマンドリンク
ln -s /usr/java/default/bin/java /usr/bin/java7
```

alternativesコマンドでjavaのバージョンを切り替える

```shell-session:バージョン切り替え
alternatives --config java

There are 2 programs which provide 'java'.

  Selection    Command
-----------------------------------------------
   1           /usr/lib/jvm/jre-1.6.0-openjdk.x86_64/bin/java
*+ 2           /usr/java/default/bin/java

Enter to keep the current selection[+], or type selection number: 
```

以降このコマンドで番号を入力して切り替えられる。

バージョン確認して切り替わっていればOK

```shell-session:確認
# java -version
java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)
# javac --version
javac 1.7.0_45
```
Apache&PHPインストール

```
# yum install httpd
# yum install php
# yum install php-mbstring
# yum install php-mysql
# yum install php-pgsql
# chkconfig httpd on
# /etc/rc.d/init.d/httpd start
```
```php:/var/www/html/info.php
<?php phpinfo() ?>
```
`http://HOST/info.php` にアクセスしてPHPの情報が表示されればOK。


####環境
CentOS6.4 (さくらのVPS)
Apache2.2.15
PHP5.3.3
NMeCabで形態素解析してみよう

## ちょっと形態素解析でもしてみるか

と思いたちまして。 今回はC#で書く必要があったので、.NetでMeCabを参照する方法を調べていたら、 MeCabの.Netでの実装したその名も[NMeCab][1]ってライブラリがあったので早速使ってみました。

*NMeCabは、オープンソース形態素解析エンジンMeCabの解析処理部分を、.NETライブラリとして移植したものです。 オリジナル版MeCabと同じ辞書を使用し、同じ解析結果を得ることができます。 純粋なC#言語で作成されており、ラッパーではないため、インストールがシンプルで、高速性と安定性にも優れています。*

とのこと。 辞書は同じなので結果はオリジナルとほぼ変わらないと考えて良さそうです。

## ダウンロード

上記NMeCabの公式サイトより最新版がダウンロード可能です。

## 中身を見てみる

ダウンロードしたファイルを解凍すると、このような構造のフォルダが現れます。

*   trunk 
    *   bin 
        *   MMF
        *   LibNMeCab.dll
        *   WindowsFormsSample.exe
        *   WindowsFormsSample.exe.config
    *   dic 
        *   ipadic
    *   src  
        *   LibNMeCab
        *   LibNMeCabMMF
        *   WindowsFormSample
        *   NMeCab.sln

bin以下は、サンプルアプリケーションです。 [こんな感じ][2]のWindowsフォームアプリケーションで、入力した文字を形態素解析して遊ぶことができます。 ちなみに起動には.NetFramework2.0以上が必要です。

dic以下には辞書ファイルが格納されています。 srcはその名の通りソース群ですね。上には記載してませんがテストもしっかり付いているようです。

## 組み込んでみる

```csharp:Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NMeCab;

namespace NMecabTest
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                string sentence = "";

                MeCabParam param = new MeCabParam();
                param.DicDir = @"..\..\lib\dic\ipadic";

                MeCabTagger t = MeCabTagger.Create(param);
                MeCabNode node = t.ParseToNode(sentence);
                while (node != null)
                {
                    if (node.CharType > 0)
                    {
                        Console.WriteLine(node.Surface + "\t" + node.Feature);
                    }
                    node = node.Next;
                }
                Console.WriteLine();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally 
            {
                Console.Read();
            }
        }
    }
}
    
```

MeCabの仕様で、実行結果の最初と最後にBOS/EOSというヘッダとフッタ？のようなオブジェクトが返ってくるらしく、これらにはFeatureが存在しないので node.Featureを実行するとオブジェクト参照エラーになります。 そのため、CharTypeの値を見てFeatureを出力するか判定しています。

あと、辞書の参照先を相対パスで指定していますが、Exe化することを考えればApp.configで持たせたほうがいいでしょうね。

プロジェクトは下記のような構成になってます。

*   NMeCabTest 
    *   bin
    *   lib 
        *   dic
        *   LibNMeCab.dll
    *   Program.cs
*   NMeCabTest.sln

## 参考

コードはほぼ以下のブログを参考にしています。

[NMeCab を .NET アプリに組み込んで形態素解析][3]

## その他

自社バグトラッキングシステムの変更リクエストの内容を形態素解析したら面白いデータが取れそう、とか思っちゃったのがキッカケ。


 [1]: http://sourceforge.jp/projects/nmecab/
 [2]: http://static.sourceforge.jp/thumb/g/2/628/640x640_0.png
 [3]: http://imadedede.hatenablog.com/entry/2012/10/02/022340
Java用EclipseCoderをDLする


## インストール方法

1. Eclipse起動 -> ツールバー -> ヘルプ -> 新規ソフトウェアのインストール
2. 作業対象に http://fornwall.net/eclipsecoder/ を貼り付ける
3. 
    + EclipseCoder Core
    + EclipseCoder Problem Archive
    + EclipseCoder Java Support

をインストールする。
4. Eclipse -> 環境設定 -> EclipseCoder -> ユーザ名/パスワードを入れる
5. ウィンドウ -> ビューの表示 -> その他 -> EclipseCoder -> Problem Statementを選択
6. Eclipse上にビューが表示されるので、右上の赤いマークをクリック
7. TopCoderが立ち上がるので、いつも通り問題を選択
8. 問題を選択すると自動でソースを書くファイルとテストファイルが作成される

## 参考
TopCoder用プラグイン EclipseCoderを試す | Futurismo(http://futurismo.biz/archives/745)
軽量ハッシュアルゴリズム

今回はハッシュアルゴリズムについて少し触れてみたいと思います。

既存のハッシュアルゴリズムはどういうものがあるでしょうか？
SHA-1, MD5等が浮かんだ方も多いと思います。

「じゃあそれでいいじゃん」

・・・ちょっと待ってください。
SHA-1, MD5というものは、暗号化のためのハッシュアルゴリズムです。
もし用途が単純なファイル比較等であれば、ここまで大げさなハッシュは冗長で高負荷低速であると言えます。
適切なアルゴリズムは状況によって適切に選びたいところです。


そこで今回は単純なファイル比較等に使用できる、簡単＆軽量なハッシュアルゴリズムの

FNV-1

というアルゴリズムを紹介します。

詳細はこちらへどうぞ
http://wowdev.jp/?p=873

ソースはこちらです。

```cpp
#include <stdio.h>
#include <stdint.h>

/**
 * FNV Constants
 */
static const uint32_t FNV_OFFSET_BASIS_32 = 2166136261U;
static const uint64_t FNV_OFFSET_BASIS_64 = 14695981039346656037U;

static const uint32_t FNV_PRIME_32 = 16777619U;
static const uint64_t FNV_PRIME_64 = 1099511628211LLU;

/**
 * FNV Hash Algorithm
 */
uint32_t fnv_1_hash_32(uint8_t *bytes, size_t length)
{
    uint32_t hash;
    size_t i;

    hash = FNV_OFFSET_BASIS_32;
    for( i = 0 ; i < length ; ++i) {
        hash = (FNV_PRIME_32 * hash) ^ (bytes[i]);
    }

    return hash;
}
uint64_t fnv_1_hash_64(uint8_t *bytes, size_t length)
{
    uint64_t hash;
    size_t i;

    hash = FNV_OFFSET_BASIS_64;
    for( i = 0 ; i < length ; ++i) {
        hash = (FNV_PRIME_64 * hash) ^ (bytes[i]);
    }

    return hash;
}
```
サンプルレート変換

サンプルレート変換にチャレンジします。
サンプルレート変換というと、真っ先にオーディオのサンプリングレートを思い浮かべますが、
それに限定したものではありません。
より抽象化していうと、

「ある一定の間隔で実数値が並んだもの」

と言えます。
実際の値が何に使われるかは今回は興味の対象ではありません。

つまり今回のチャレンジは、”ある一定の間隔” という部分を変換しよう、という点に尽きます。

今回はC++で、サンプルレートを変換するモジュールを作ってみました。

続きはこちらで
http://wowdev.jp/?p=878

今回のソースはこちらです。
https://gist.github.com/yoshimurawork/7561304
めんどくさくてプラグインとか入れない時の.vimrc

プラグインもいれないで、いまを生きる君のためのvimの設定

```vim:~/.vimrc
"" 色の設定
" シンタックスオン（色つける）
syntax on

" 色テーマの指定（おまかせ）
colorscheme darkblue

" 現在のカーソルの色をつける
set cursorline
hi Comment ctermfg=103
hi CursorLine term=none cterm=none ctermbg=17 guibg=236

" 検索したときのハイライトをつける
set hlsearch

" 行番号の表示
set number

" 折り返しオフ
set nowrap

"" 補完系（せっかくデフォであるのでいれておく）
" オムニ補完の設定（insertモードでCtrl+oで候補を出す、Ctrl+n Ctrl+pで選択、Ctrl+yで確定）
set omnifunc=pythoncomplete#Complete
set omnifunc=javascriptcomplete#CompleteJS
set omnifunc=htmlcomplete#CompleteTags
set omnifunc=csscomplete#CompleteCSS
set omnifunc=xmlcomplete#CompleteTags
set omnifunc=phpcomplete#CompletePHP

" ステータスラインの設定
set cmdheight=1
set laststatus=2
set statusline=%<%F\ %m%r%h%w%{'['.(&fenc!=''?&fenc:&enc).']['.&ff.']'}%=%l,\ [TYPE=%Y]\ [ASCII=\%03.3b]\ [HEX=\%02.2B]\ %c%V%8P

" Ctrl-L で検索ハイライトを消す
nmap <C-l> <C-l>:nohlsearch<CR>
```

githubにもあげたくない。
Toolbarが表示されない

【事象】
storyboad上でToolbarを画面下に設定したが、シミュレータ・実機にて表示されない。

【原因】
StoryBoad上の画面設定が4.0インチだったが、シミュレーター・実機の画面設定が3.5インチになっており、表示サイズに入っていなかったため表示されていなかった。
※storyboadの下に画面サイズを切り替える設定ボタン有。

【対策】
①storyboadの画面設定を3.5インチにしてToolbarをはりつける。
②storyboadのPinボタンからコンストレイント（制約）を設定して、「画面表示」の一番下に表示するように設定する。
R：list.filesによるファイルパス取得あれこれ。

list.filesによるファイルパスの取得方法いろいろです。

ファイル件数が増えてくると重くなるので、その場合は他の言語やOSのコマンドでファイル一覧のテキストを読み込ませて処理させた方が効率的ですが、ちょっとした処理やディレクトリ毎の処理ならlist.files便利。

```
path <- 'C:/data/'

# パスを指定してディレクトリ・ファイルパスを取得。
list.files(path)

# カレントディレクトリを移動してディレクトリ・ファイルパスを取得。
setwd(path)
list.files()

# パターンを指定して取得（「txt」が含まれるものを取得）。
list.files(path, pattern="txt")

# サブディレクトリを含めてファイルパスを取得。
list.files(path, recursive=T)

# サブディレクトリを含めてファイルパスを取得（ディレクトリを含める）。
list.files(path,recursive=T, include.dirs=T)

# 隠しファイルも取得（.が先頭についているもの。winの隠しファイルとは違う）
list.files(path, all.files=T)

# フルパスで取得。
list.files(path, full.names=T)
```

実行例は以下の通りです。

```
> path <- 'C:/data/'
> 
> # パスを指定してディレクトリ・ファイルパスを取得。
> list.files(path)
[1] "dir"           "F0001-001.txt" "F0001-002.txt" "F0002-001.txt" "F0003-001.txt"
> 
> # カレントディレクトリを移動してディレクトリ・ファイルパスを取得。
> setwd(path)
> list.files()
[1] "dir"           "F0001-001.txt" "F0001-002.txt" "F0002-001.txt" "F0003-001.txt"
> 
> # パターンを指定して取得（「txt」が含まれるものを取得）。
> list.files(path, pattern="txt")
[1] "F0001-001.txt" "F0001-002.txt" "F0002-001.txt" "F0003-001.txt"
> 
> # サブディレクトリを含めてファイルパスを取得。
> list.files(path, recursive=T)
[1] "dir/F0001-001.txt" "dir/F0001-002.txt" "dir/F0002-001.txt" "dir/F0003-001.txt" "F0001-001.txt"     "F0001-002.txt"     "F0002-001.txt"    
[8] "F0003-001.txt"    
> 
> # サブディレクトリを含めてファイルパスを取得（ディレクトリを含める）。
> list.files(path,recursive=T, include.dirs=T)
[1] "dir"               "dir/F0001-001.txt" "dir/F0001-002.txt" "dir/F0002-001.txt" "dir/F0003-001.txt" "F0001-001.txt"     "F0001-002.txt"    
[8] "F0002-001.txt"     "F0003-001.txt"    
> 
> # 隠しファイルも取得（.が先頭についているもの。winの隠しファイルとは違う）
> list.files(path, all.files=T)
[1] "."                     ".."                    ".隠しファイルだよ.txt" "dir"                   "F0001-001.txt"        
[6] "F0001-002.txt"         "F0002-001.txt"         "F0003-001.txt"        
> # フルパスで取得。
> list.files(path, full.names=T)
[1] "C:/data/dir"           "C:/data/F0001-001.txt" "C:/data/F0001-002.txt" "C:/data/F0002-001.txt" "C:/data/F0003-001.txt"
```
WindowsPCにNode.jsをいれたときに起こった問題

## 想定状況

###### 同僚のWIndows7PCで発現
###### [このページ](http://www.shirokuro331.net/cobalt/?p=824)を元にChocolateをインストール後、nvmwをインストールした（らしい）
###### 細かい状況は不明

## 問題点と解決方法

### npm install 〜 とするとエラーになる

エラーの内容は以下

    Error: tunneling socket could not be established, cause=socket hang up 

このあとproxyの設定がーという英文が表示される

ただ他の同僚はそういったことは起きていなかった

### 解決方法

ユーザーフォルダのなかにできていた.npmrcを削除した

    npm config list

を実行するとnpmの設定が確認できるのですが、
ほかの同僚にはないproxy設定があり、それが原因でした。

.npmrcはいつのまにかあったらしいのでChocolateかnvmwが起因はわかりませんが、ご注意を。
git push originで複数箇所にプッシュする

ターミナルから

```sh
$ git remote set-url --add origin hg@bitbucket.org:sasaplus1/dotfiles.git
```

とするか、もしくはテキストエディタで`.git/config`を開いて、

```diff
 [remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = git@github.com:sasaplus1/dotfiles.git
+   url = hg@bitbucket.org:sasaplus1/dotfiles.git
```

として保存すると良いかと。

これで

```sh
$ git push origin master
```

などとすると、複数箇所に同時にプッシュできます。
これで、新調したマシンをセットアップしている最中にGitHubがメンテナンス中になっても、同期してある`dotfiles`をBitbucketからクローンしてくることができますねー。
rvmコマンド

#情報

##rvm list known
導入可能なruby一覧。

##rvm list
導入済みのruby一覧。


#rubyインストール

##rvm install VERSION
例：rvm install 1.9.3


#切替

##rvm use VERSION
ruby切替。
`rvm VERSION` でも可。

##rvm system
システムのRubyに戻す。
`rvm reset` も同じ。


#設定

##rvm --default VERSION
デフォルトのrubyを設定。

##rvm --default system
システムのrubyをデフォルトに設定。


#gemset

##rvm gemset list
gemset一覧。

##rvm gemset create GEMSET
gemset作成。

##rvm gemset use GEMSET
gemset切替。

##rvm VERSION@GEMSET
ruby&gemset切替。


#その他

##rvm get latest
最新バージョンへアップデート。

##rvm requirements
必要なライブラリをインストール。


#.rvmrcで自動切替
.rvmrcがあるディレクトリ以下に移動すると自動で切替。

```sh:.rvmrc
rvm VERSION@GEMSET
```
rvmインストール

#openssl-devel入れておく
```
# yum install openssl-devel
```


#インストール
```
# \curl -L https://get.rvm.io | bash -s stable
# rvm requirements
# rvm install 1.9.3
# source ~/.zshrc
# rvm 1.9.3
# ruby --version
ruby 1.9.3p392 (2013-02-22 revision 39386) [x86_64-linux]
```

zsh環境だと下記がないとエラー出た。

```zsh:~/.zshrc
[[ -s "/usr/local/rvm/scripts/rvm" ]] && source "/usr/local/rvm/scripts/rvm"
```


####参考
https://rvm.io/

####環境
CentOS6.4 (さくらのVPS)
yesod initが生成したコピーライトを変える


ブラウザには

```
Insert copyright statement here
```

と表示されるものの```here```が具体的にどこなのか分からず苦労したけど```config/settings.yml```の```copyright```を編集すればよかった。

分かればかんたん。
と言うかgrepしろよ、という話か。
gitolite: ライトユースなリモートgitリポジトリを作る


# はじめに

github以外でリモートのgitリポジトリを作りたくなったことはないだろうか？自分のローカルのソースを会社や研究室の誰かと共有したくなったとき、でもメインのリポジトリはsubversionで運用されていてgitのはない。対して、githubで有料なプライベートgitリポジトリを持つほどではない。そんなリクエストを持つライトユースなgitリポジトリをgitoliteで作る方法を紹介します。

※なお、ここではクライアントはLinux, Mac OS X、サーバはubuntuで作業する前提で話を進めます。Windowsでも作業内容自体は変わらないと思いますが、コマンドラインベースには進めないと思うので、割愛します。

# インストール方法

セットアップには、クライアントパソコン（自分のパソコン）でやる作業と、リポジトリをおくサーバサイドのパソコンでやる作業の２つがあります。

## 下準備：クライアントパソコンで

まず、サーバのリポジトリをセットアップするために、admin用の公開鍵、秘密鍵を作成する必要があります。admin用のものを作ってもかまわないし、自分の公開鍵・秘密鍵を転用してもかまいません。まだ、作っていない場合は以下のコマンドで作成します。

```
$ ssh-keygen -t rsa -f <keyname>
```

keyname、keyname.pubという2つのファイルが作られます。そのうち、keyname.pubをサーバにコピーします。

## サーバでのgitoliteのセットアップ

サーバマシンがubuntuであると想定して、gitoliteをインストールし、セットアップします。事前にカレントディレクトリに上記のkeyname.pubがコピーされているとするとセットアップは以下のコマンド群でできます。

```
$ sudo apt-get install gitolite
$ sudo adduser --system --disabled-password --shell /bin/bash --group gitolite --home /var/gitolite
$ sudo -H -u gitolite gl-setup keyname.pub
```

上から

* gitoliteのインストール
* パスワードなし、ホームディレクトリが/var/gitoliteにあるgitoliteユーザを作成
* gitoliteコマンドを使ったセットアップ

を行っています。

ユーザの作成時点では、ホームディレクトリなど各ユーザで入れたいところが異なると思うので、適宜変更してください。

また、`gl-setup`はセットアップ途中で、viを用いて設定ファイルの確認を行います。vimでもないため、viユーザ以外は使いにくい。確認用のエディタを変更したい場合は以下のようにすると良いでしょう。

```
$ sudo -H -u gitolite EDITOR=emacs gl-setup keyname.pub
```

上記は、エディタとしてemacsを設定している例です。成功すると、以下のファイル・ディレクトリが作成されます。

```
├── .gitolite
├── .gitolite.rc
├── projects.list
├── repositories
```

# 使い方

## 基本：公開鍵・秘密鍵の設定

何はともあれ、秘密鍵を設定して、ssh経由でリポジトリにアクセスする必要があります。作成した秘密鍵を.ssh以下に配置しましょう。

```
$ cp keyname ~/.ssh/id_rsa
$ chmod 600 ~/.ssh/id_rsa
```

## 管理者のお仕事

管理者のお仕事は、

* ユーザの追加
* 作られたリポジトリのアクセス権の制御

です。この作業を設定ファイルをまとめるリポジトリを編集することで行います。まず、管理者用のリポジトリgitolite-adminのクローンを自分のマシンに作成します。

```
git clone gitolite@<hostname>:gitolite-admin
```

成功すると以下のディレクトリ構成が得られます。

```
├── conf
│   └── gitolite.conf
└── keydir
    ├── username.pub
```

ユーザの追加はkeydirの中にアクセスしたいユーザの公開鍵を作ってもらって、それを配置することで行います。

```
$ cp username.pub keydir/.
$ git add keydir/username.pub
$ git commit -m "add user, <username>"
$ git push
```

上記では、公開鍵をkeydirに配置し、リポジトリに登録、コミットしてその設定をリモートリポジトリに反映しています。

次にリポジトリのアクセス権は、conf/gitolite.confを編集することで行います。conf/gitolite.confの内容は以下のようになっており、

```
repo    gitolite-admin
        RW+     =   username

repo    testing
        RW+     =   @all

repo    hoge
        RW+     =   @all

```

各リポジトリの定義とそのアクセス権が設定されています。現状、testing, hogeというプロジェクトに対して、すべてのユーザがアクセスできるという定義になっています。このアクセス権はこの設定ファイルを編集することで変更することができ、例えば、

```
repo    hoge
        RW+     =   username
```

とすることで、hogeというリポジトリにはusernameというユーザのみがアクセスできるようにアクセス権を変更することができます。

## ユーザのお仕事

ユーザがする作業は大きく分けて、

1. 公開鍵を管理者に渡して、ユーザ登録してもらう
1. 必要なリポジトリを作成する
1. 作成したリポジトリを使って、コーディングする

の3つです。最初の作業は公開鍵・秘密鍵の作り方自体は前述で紹介したので、作成した公開鍵を管理者に渡してください。次に、自分のローカルで作成しているリポジトリをリモートリポジトリに反映します。なお、git pushが反映されるためには、事前に管理者が上記のgitolite.confに対応するリポジトリ（下記の場合、project）を作成していなければなりません。

```
$ cd <project>
$ git remote add origin gitolite@<hostname>:<project>
$ git push origin master
```

管理者からユーザの追加最後の作業はgit共通の作業なので割愛します。以下を参照してください。

* http://qiita.com/mountcedar/items/682743c95fd3b8fc274b
Jadeで属性値を文字実体参照に変換しない

## したくない！実体参照。

属性の=の前に!をつける

```
//したくない
a(href="#",data-hoge!="<%- hoge %>") 

//される
a(href="#",data-hoge="<%- hoge %>")
```

```html
<a href="#" data-hoge="<%- hoge %>"></a>
<a href="#" data-hoge="&lt;%- hoge %&gt;"></a>
```

テンプレートを作るときなどに。

おしまい
HTML5,CSS3,Javascript対応状況がわかるサイトまとめ

いつも同じサイト見てる気がするのでまとめてみる。

# HTML5 対応状況

## PC向けブラウザの状況
**Can I use...** ( HTML5,JavaScript )
[http://caniuse.com/](http://caniuse.com/ "http://caniuse.com/")

### ブラウザ別
**IE Platform Status**
IE,Edge

[http://status.modern.ie/](http://status.modern.ie/ "http://status.modern.ie/")

[http://dev.modern.ie/platform/status/](http://dev.modern.ie/platform/status/ "http://dev.modern.ie/platform/status/")


**Chromium Dashboard**
Chromium
[http://www.chromestatus.com/features](http://www.chromestatus.com/features "http://www.chromestatus.com/features")

**Mozilla Developer Network**
Firefox
[https://developer.mozilla.org/ja/docs/Web](https://developer.mozilla.org/ja/docs/Web "https://developer.mozilla.org/ja/docs/Web")

**Safari Developer Library**
Safari
[https://developer.apple.com/library/safari/navigation/](https://developer.apple.com/library/safari/navigation/ "https://developer.apple.com/library/safari/navigation/")

## モバイル端末向けブラウザの対応状況
**MOBILE HTML5** ( HTML5,JavaScript )
[http://mobilehtml5.org/](http://mobilehtml5.org/ "http://mobilehtml5.org/")

## その他
**Browserscope** ( HTML5,CSS3,JavaScript )
現在見ているブラウザの実装具合などが見れる
（久しぶりにさわるブラウザとか、興味ないブラウザ触るとき。）
[http://www.browserscope.org/](http://www.browserscope.org/ "http://www.browserscope.org/")

**HTML5TEST** ( HTML5)
現在見ているブラウザの実装具合などが見れる
[http://html5test.com/](http://html5test.com/ "http://html5test.com/")

**CSS5TEST** ( CSS3 )
現在見ているブラウザの実装具合などが見れる
[http://css3test.com/](http://css3test.com/ "http://css3test.com/")

**HTML5 PLEASE** ( HTML5,CSS3,JavaScipt )
各項目に実装方法などの注意点が書いてある
[http://html5please.com/](http://html5please.com/ "http://html5please.com/")

**findmebyIP** ( HTML5,CSS3,JavaScipt )
閲覧している環境の実装状況がわかる
[http://fmbip.com/](http://fmbip.com/ "http://fmbip.com/")

**CSS3 Click Chart** ( CSS3 )
コードのスニペットが書いてある
[http://css3clickchart.com/](http://css3clickchart.com/ "http://css3clickchart.com/")

**html5 snippets** ( HTML5,CSS3 )
コードのスニペットが書いてある
[http://html5snippets.com/](http://html5snippets.com/ "http://html5snippets.com/")

**ねこだまのCSSリファレンス&デモのトップ > CSSセレクタ・サポート対応表**
忘れた頃のIE対応の時にひっかかるサイト
[http://webdev-nekodama.xii.jp/css/sSupport.php](http://webdev-nekodama.xii.jp/css/sSupport.php "http://webdev-nekodama.xii.jp/css/sSupport.php")


## ちょっと影響範囲調べるとき
**NETMARKETSHARE** ( HTML5,CSS3,JavaScipt )
ブラウザシェアとか、解像度のシェアとか。
[http://www.netmarketshare.com/](http://www.netmarketshare.com/ "http://www.netmarketshare.com/")
SilexとScalatraのHelloWorld比較


## PHP: Silex

```php
<?php

require_once __DIR__.'/vendor/autoload.php'; 

$app = new Silex\Application(); 

$app->get('/hello/{name}', function($name) use($app) { 
    return '<div>Hello ' . $app->escape($name) . '</div>'; 
}); 

$app->run(); 
```

## Scala: Scalatra

```scala
package com.example.app

import org.scalatra._
import scalate.ScalateSupport

class MyScalatraServlet extends MyScalatraWebAppStack {
  get("/hello/:name")(<div>Hello { params("name") }</div>)
}
```

## Silex abの結果

-n 1000 -c 100

```
Server Software:        Apache/2.2.24
Server Hostname:        localhost
Server Port:            80

Document Path:          /test.php/hello/suin
Document Length:        10 bytes

Concurrency Level:      100
Time taken for tests:   5.833 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      305700 bytes
HTML transferred:       10190 bytes
Requests per second:    171.43 [#/sec] (mean)
Time per request:       583.319 [ms] (mean)
Time per request:       5.833 [ms] (mean, across all concurrent requests)
Transfer rate:          51.18 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        3  510 155.1    558     844
Processing:     0   44 118.2      3     670
Waiting:        0   26 117.0      0     669
Total:         69  554 109.0    573     847
```

## Scalatra abの結果

-n 1000 -c 100

```
Server Software:        Jetty(8.1.8.v20121106)
Server Hostname:        localhost
Server Port:            8888

Document Path:          /test/test
Document Length:        22 bytes

Concurrency Level:      100
Time taken for tests:   1.372 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      132000 bytes
HTML transferred:       22000 bytes
Requests per second:    728.82 [#/sec] (mean)
Time per request:       137.208 [ms] (mean)
Time per request:       1.372 [ms] (mean, across all concurrent requests)
Transfer rate:          93.95 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   1.0      0       9
Processing:     5  130  29.8    127     234
Waiting:        3  128  29.8    125     213
Total:          9  130  29.3    127     235
```
経過時間を順次取得するJavaScript

```js:getPast.js
var getPast = (function() {
  var lastDate = NaN;
  return function() {
    var now = Date.now();
    var past = now - lastDate;
    lastDate = now;
    return past;
  };
})();
```

```js
console.log(getPast());  // 初回はNaN … (1)
// 処理…
console.log(getPast());  // (1)からの経過時間が返る … (2)
// 処理…
console.log(getPast());  // (2)からの経過時間が返る
```

単純に時間を測りたいだけならこちらも。

* [経過時間をconsoleで手軽に計測するJavaScript - Qiita \[キータ\]](http://qiita.com/ginpei/items/4fb1fddbff957e408851)
Selenium2のテストコード作成ポイントまとめ

PHP/Behat/Selenium2のBDDを実践していますが、テストコード作成に時間がかかっています(実行時間は置いておいて)。
開発マシンのスペックだったりデバッグするのが手間だったりとかPHPそのものが遅いとかありますが、
そんな苦労を経て、最近、テストコード作成方法を抜本的に修正しましたのでそのポイントなるものをこちらに記述してみます。

以前は、PHPUnitのテスト作成指針と同じように考えていて、

*  個々のシナリオはできるだけ影響しないように独立に作成する。
* 「背景」を使った初期化で初期データの作成(シナリオ単位に初期化する)
* FeatureContextのbefore/afterメソッドを使って、シナリオ単位にDBの初期化を行う
*  シナリオ内に閉じた手順を記載

というルールになっていました。
これはBDDの経験がなくTDDの経験だけを使った実装になっていたことが起因です。

上記を下記のようにしました。

* featureファイル内のシナリオが積み重なって、一つのテストが出来上がるようにシナリオに繋がりを持たせた
* 「背景」やFeatureContextのbefore/afterメソッドは、最低限必要になる事態が発生するまで使用しないことにした
* データの初期化やDBの初期化はシナリオ定義にした。
* 上記に伴い、DBの初期化はfeatureファイルの最初と最後、データの初期化はDBの初期化後に配置した。

結果、何がやりやすくなったかというと、

1. シナリオ実行後に、処理結果をバーチャルディスプレイ上で確認できる。
1. シナリオ実行後に、DBの中身を確認できる。
1. シナリオの順序を、製造する目的に応じて自由に指定できるようになり、
1. シナリオの書き方によっては、目的の軽いシナリオだけを繰り返し実行できるようになった。

そもそも、最初の組み方が間違っているという話ではあるかもしれませんが。。。
BDDでテストを始めようとしている人にご参考になれば幸いです。
EC2に特定のTagがあるInstanceだけ、APIからの操作を可能なIAMユーザの作成


はじめに
=========

AWSを運用していると、本番環境、staging環境、テスト環境など色々な環境が増えてきます。
その時、

* テスト環境などの特定の複数のInstanceSetはボタンひとつで stop/start したい
* だけど、万が一にも本番環境にそういう影響が無いようにしたい

ということがなきにしもあらずかと思います。

そういう場合「特定のTagをもつInstanceのみStop/StartできるIAMユーザ」というのを作ることで実現するという方法があります。

方法
=====
IAMの設定
-------------

こんな感じのPolicyをもつIAMユーザを作成します。

* 任意の EC2 Instanceを検索することができる
* EC2のTagが Key= **TAGTEST**, Value= **YES** のInstanceに対してのみ Stop/Start/Reboot ができる

という設定になっています。当然Tag条件などは自由に変更可能です。

```json:policy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowDescribe",
            "Effect": "Allow",
            "Action": [
                "ec2:Describe*"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Sid": "AllowStartStop",
            "Effect": "Allow",
            "Action": [
                "ec2:RebootInstances",
                "ec2:StartInstances",
                "ec2:StopInstances"
            ],
            "Condition": {
                "ForAnyValue:StringEquals": {
                    "ec2:ResourceTag/TAGTEST": "YES"
                }
            },
            "Resource": [
                "arn:aws:ec2:*"
            ]
        }
    ]
}
```

テスト
-------

上記のIAMユーザの Key/Secret を使って、Name が my_project のInstanceをstopするテストです。
このInstanceに **TAGTEST=YES** を付けた時とつけていない時で動作が変わることが確認できます。

```ruby
require 'rubygems'
require 'aws'

AWS_ACCESS_KEY_ID     = 'MYKEY'
AWS_SECRET_ACCESS_KEY = 'MYSECRET'

ec2 = AWS::EC2.new(
    :access_key_id => AWS_ACCESS_KEY_ID,
    :secret_access_key => AWS_SECRET_ACCESS_KEY,
    :region => 'ap-southeast-1',
)

yy = ec2.instances.tagged('Name').tagged_values('my_project').first
yy.stop
```
postgresインストール(ソースから)

#コンパイルに必要なライブラリをインストール
```
#  yum install readline-devel
#  yum install zlib-devel
```


#postgresユーザ作成
```
# useradd postgres
# su - postgres
```


#環境変数定義
```sh:/home/postgres/.zshrc.mine
export PGHOME=/usr/local/pgsql
export PGDATA=/usr/local/pgsql/data
export PGHOST=localhost
PATH=$PGHOME/bin:$PATH
```
```
$ source ~/.zshrc
```
環境によって.bashrcなどに。


#postgresインストール
```
$ mkdir ~/src && cd ~/src
$ wget "http://ftp.postgresql.org/pub/source/v9.3.1/postgresql-9.3.1.tar.gz"
$ tar xvzf postgresql-9.3.1.tar.gz
$ cd postgresql-9.3.1
$ ./configure
$ make
$ make check
$ sudo make install
```

#initdb
```
$ sudo mkdir /usr/local/pgsql/data
$ sudo chown postgres:postgres /usr/local/pgsql/data
$ initdb --encoding=UNICODE
```

#起動してみる
```
$ pg_ctl start
$ psql -l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 |
 template0 | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(3 rows)

$pg_ctl stop
```


#設定ファイル編集
```sh:/usr/local/pgsql/data/postgresql.conf
listen_addresses = '*'
```
```sh:/usr/local/pgsql/data/pg_hba.conf
#外からはパスワード認証
host    all             all             0.0.0.0/0            password
```


#起動スクリプト設定
```
$ su -
# cp /home/postgres/src/postgresql-9.3.1/contrib/start-scripts/linux /etc/rc.d/init.d/postgres
# chmod 755 /etc/rc.d/init.d/postgres
# /etc/rc.d/init.d/postgres start
```


####環境
CentOS6.4 (さくらのVPS)
PostgreSQL9.3
mysql workbench 6.0でER図を開く方法

ある程度の規模のＤＢを閲覧するときにはＥＲ図などを見ることが出来れば便利ですよね。mysqlworkbenchを使用すればそれが可能になるときいてＤＬしたのですが、今まで使用して無くて、mysqlworkbench6.0でER図を表示したい場合どこから表示させればいいのかよくわからなかったのでメモしておきます。

ＤＢの接続自体はすでにやってある物と仮定します。

    [Database] -> [ReverseEngineer] 

から[Continue]を連打していくと画面に表示されます。
zshでユーザ固有の設定

```sh:~/.zshrc
[ -f ~/.zshrc.mine ] && source ~/.zshrc.mine
```
`.zshrc` を共有していてユーザ固有の環境変数などを定義したいとき、上記を書いておけば `~/.zshrc.mine` があれば読み込んでくれる。
iPhone・iPadでlabelを効かせるには

#イベントを追加

```html
<label for="checkbox" onclick=""></label>
```

labelにonclick=""を追加する。
参考：http://wdb.micro-books.com/iphoneipad/iphoneipadlabel/

#CSSを追加する

```css
label {
    cursor: pointer;
}
```

こちらのほうだと一箇所で解決するので、簡単で良さそう。
普段使うreset.cssやnormalize.cssに追加しておいてもいいかも。
参考：http://d.hatena.ne.jp/genhou/20121006/1349478525
はじめてのgrunt-gh-pages

[grunt-gh-pages](https://github.com/tschaub/grunt-gh-pages)はGitリポジトリのgh-pagesブランチにコミットをし、originにプッシュをしてくれるプラグインです。
なかなか便利だったのでメモなのです。

作業ディレクトリはGitリポジトリである前提です。

## インストール

- grunt
- grunt-gh-pages

をインストールします。

```sh
$ npm install grunt grunt-gh-pages
```

## Gruntfile

`Gruntfile`を以下のように書きます。

```coffeescript
module.exports = (grunt) ->

  grunt.initConfig
    'gh-pages':
      options:
        base: 'public/'
        message: 'updated'
      src: [
        '**/*'
        '**/.*'
      ]

  grunt.loadNpmTasks 'grunt-gh-pages'

  return
```

ディレクトリを`base`で指定し、`src`で取得するファイルを指定します。
この場合、`public/`以下にあるすべてのファイルとフォルダをgh-pagesブランチにコミットすることになります。

`message`はgh-pagesにコミットする際のコミットメッセージです。とりあえず`'updated'`を指定しています。

### （追記）

ver.0.9から、dotfilesというオプションが追加されたようです。このオプションにより、

```coffeescript
src: [
  '**/*'
  '**/.*'
]
```

でなく、

```coffeescript
options:
  dotfiles: true
src: '**/*'
```

と記述しても先頭がドットから始まるファイルを対象に含めることができるようです。

## 実行

これでプッシュする準備は整ったので実行してみます。

```sh
$ grunt gh-pages
Running "gh-pages:src" (gh-pages) task
Cloning https://sasaplus1@github.com/sasaplus1/(どこかのリポジトリ).git into .grunt/grunt-gh-pages/gh-pages/src
Cleaning
Fetching origin
Checking out origin/gh-pages
Removing files
Copying files
Adding all
Committing
Pushing
Password for 'https://sasaplus1@github.com':

Done, without errors.
```

と、`base`で指定したディレクトリ以下のファイルを自動でコミット・プッシュしてくれます。
gh-pagesを使うことはよくあると思うので、面倒だと思っている方にとってはとても便利なものなのではないでしょうか。

gh-pagesでなくとも、`branch`オプションで好きなブランチ名に変更したり、`repo`オプションでGitHub以外のリポジトリを指すようにすることもできるので、Jenkinsと連携するなど違った使い方もできるかもしれません。

## 注意点など

- gh-pagesブランチを先に作ってはいけない
  - エラーが発生する
  - gh-pagesブランチは自動的に作成される

- ブランチは`--orphan`で作られる
yumコマンド

#情報取得

##yum list
アップデート及び新規インストール可能な全パッケージを表示

##yum list installed
インストールされている全パッケージを表示

##yum list updates
アップデート可能なパッケージの一覧を表示

##yum search パッケージ名（検索ワード）
パッケージの検索

##yum info パッケージ名
パッケージ情報の表示

##yum provides ファイル名
ファイルがどのパッケージに含まれているのか調べる

##yum check-update
アップデート可能な全パッケージを表示


#インストール

##yum install パッケージ名
パッケージを個別にインストール


#アップデート

##yum update パッケージ名
指定したパッケージをアップデート。

##yum update
システム全体のパッケージのアップデートをします。


#削除

##yum remove パッケージ名
パッケージの削除


#clean

##yum clean
ダウンロードしたパッケージと古いヘッダを削除する。clean allと同じ

##yum clean oldheaders
古いヘッダを削除

##yum clean packages
ダウンロードしたパッケージを削除


####参考
http://max01.skr.jp/blog/2006/12/yum.html
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/611usefllyum.html
s3fsを使ってEC2からS3をマウントする方法

s3fsを使ってEC2からS3をマウントする方法
s3fs、fuseはインストールされている前提。

#### 環境
-----

|項目|内容|
|:-----------|:------------|
| OS|Amazon Linux AMI|
| s3fs|1.73|
| fuse| 2.9.3-1.15.amzn1|
| fuse-devel| 2.9.3-1.15.amzn1|

#### 手順1. Console HomeからIAMを選択する。
-----
![s3fs01.png](https://qiita-image-store.s3.amazonaws.com/0/32509/23eb82d6-684d-f5aa-2920-9396693903d2.png)


#### 手順2. s3アクセス用のユーザーを作成する。(画像では「s3-access-user」で作成)
-----
![s3fs03.png](https://qiita-image-store.s3.amazonaws.com/0/32509/82668c99-693c-1add-bf0c-b14afe86be81.png)

* 「Create New Users」をクリックして表示されるポップアップの「Access Key ID」と「Secret Access Key」をメモしておく。
![s3fs02.png](https://qiita-image-store.s3.amazonaws.com/0/32509/f1c4764d-1980-831a-5c23-bd71e80620f7.png)

* 作成後
![s3fs04.png](https://qiita-image-store.s3.amazonaws.com/0/32509/20af8007-5651-1be1-31cf-c938e78583d1.png)


#### 手順3. 作成したユーザーを選択し、「Permissions」タグを選択し、「Attach User Policy」ボタンを押下し、ポリシーを追加ポップアップを表示する。
-----
![s3fs05.png](https://qiita-image-store.s3.amazonaws.com/0/32509/2fdb3520-6513-4150-5154-d9ad4f731cca.png)

* 「Attach User Policy」ボタン
![s3fs06.png](https://qiita-image-store.s3.amazonaws.com/0/32509/6b393fbf-ff38-f131-8b3c-a947769524e6.png)


#### 手順4. 「Amazon S3 Full Access」を選択する。（今回はフルアクセス）
-----
![s3fs07.png](https://qiita-image-store.s3.amazonaws.com/0/32509/a86e5743-c8d6-d1ba-6d3d-a19fdc27a9c5.png)

#### 手順5. ターミナル接続して、マウントする。
-----
```sh:マウント
sudo echo "{Access Key ID}:{Secret Access Key}" > /etc/passwd-s3fs
sudo chmod 640 /etc/passwd-s3fs
sudo mkdir /mnt/s3
sudo /usr/local/bin/s3fs {bucket_name} /mnt/s3 -ouse_cache=/tmp
```
|項目|値|
|:-----------|:------------|
| {Access Key ID}|手順2でメモったAccess Key ID|
| {Secret Access Key}|手順2でメモったSecret Access Key|
| {bucket_name}| s3のバケット名|

#### 手順6. マウントされているか確認する。
-----
```sh:確認
# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/xvda1             8256952   6706132   1466964  83% /
tmpfs                   304236         0    304236   0% /dev/shm
s3fs                 274877906944         0 274877906944   0% /mnt/s3
```
CakePHPでPostgreSQLを使う

CakePHPでPostgreSQLを使う場合のdatabase.phpはこういう感じ。

```php
var $default = array(
	'datasource' => 'Database/Postgres',
	'persistent' => 'false', 
	'host' => 'localhost',
	'port' => '5432',
	'login' => 'user_name',
	'password' => 'password',
	'database' => 'test_db',
	'schema' => 'public',
	'prefix' => '',
	'encoding' => 'utf8'
);
```

MySQLの場合チュートリアル通りにやれば問題無いが、

PostgreSQLではportとschemaを指定しないと以下のようなエラーになる。

```
Error: Table posts for model Post was not found in datasource default.
```

また、Windowsのローカルで開発を行う場合、PostgreSQLにつなぐためのDLLが必要になる。

設定はできているのに繋がらない。もしくは、ピュアなPHPプログラムからはPostgreSQLに接続できるのに、CakePHPからは接続出来ない場合は、以下のDLLが壊れていないか確認すること。

```
Error: Database connection "Postgres" is missing, or could not be created.
```
- php_pdo_pgsql.dll
- php_pgsql.dll

参考：
http://andante0727.blog81.fc2.com/blog-entry-151.html
HTTPリクエストヘッダのAccept-Languageから動的にI18n.localeを変更する。


## 環境
```sh:shell
$ gem -v
2.1.11
$ ruby -v
2.0.0 (2013-06-27 patchlevel 247) [x86_64-linux]
$ rails -v
Rails 3.2.15
$ bundle -v
Bundler version 1.3.5
```

## 実装
```rb:Gemfile
# 全てのGroupに属すように追加する。
gem 'http_accept_language'
```

```diff:config/application.rb
@@ -40,6 +40,10 @@ class Application < Rails::Application
      # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
      # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
      # config.i18n.default_locale = :de
 +    config.i18n.default_locale = :en
 +
 +    # see:http://batsov.com/articles/2012/09/12/setting-up-fallback-locale-s-in-rails-3/
 +    config.i18n.fallbacks = [:en]

@@ -83,5 +87,20 @@ class Application < Rails::Application
  
 +    # Setting for http_accept_language
 +    class HTTPAcceptLanguageToI18nLocale
 +      def initialize(app)
 +        @app = app
 +      end
 +
 +      def call(env)
 +        I18n.locale = env.http_accept_language.compatible_language_from(I18n.available_locales)
 +        @app.call(env)
 +      end
 +    end
 +
 +    config.middleware.use HttpAcceptLanguage::Middleware
 +    config.middleware.use HTTPAcceptLanguageToI18nLocale
```
※ LINE Numberは環境により異なります。

- ```config.i18n.fallbacks```にAccept-Languageに有効でないロケール情報が入っていた場合のデフォルト値を設定する。
- ```compatible_language_from ```は、引数に指定されたロケールの中からHTTP_ACCEPT_LANGUAGEに指定されたロケールにマッチした値を返す。
- ```config.middleware.use HTTPAcceptLanguageToI18nLocale```の前に```config.middleware.use HttpAcceptLanguage::Middleware```と記述すること。こうすることにより、```env```に```http_accept_language```が追加される。

## 結果
```rb:pry
3.2.15@2.0.0 (main)> I18n.available_locales
=> [
    [ 0] :en,
    [ 1] :"en-gb",
    [ 2] :"pt-br",
    [ 3] :"en-us",
    [ 4] :"en-bork",
    [ 5] :"en-ind",
    [ 6] :fr,
    [ 7] :nl,
    [ 8] :pl,
    [ 9] :"en-au",
    [10] :"en-ca",
    [11] :sk,
    [12] :ja,
    [13] :"nb-no",
    [14] :es,
    [15] :vi,
    [16] :de,
    [17] :"de-ch"
]

3.2.15@2.0.0 (main)> env.http_accept_language
=> #<HttpAcceptLanguage::Parser:0x007f21062d2e58 @header="en", @user_preferred_languages=["en"]>
3.2.15@2.0.0 (main)> I18n.locale
=> :en

3.2.15@2.0.0 (main)> env.http_accept_language
=> #<HttpAcceptLanguage::Parser:0x007f210d45a990 @header="fr", @user_preferred_languages=["fr"]>
3.2.15@2.0.0 (main)> I18n.locale
=> :fr

3.2.15@2.0.0 (main)> env.http_accept_language
=> #<HttpAcceptLanguage::Parser:0x007f210e234a48 @header="it", @user_preferred_languages=["it"]>
3.2.15@2.0.0 (main)> I18n.locale
=> :en

```
Rubyのメソッドの引数あれこれメモ


## 配列引数
複数の引数を1つの配列として扱うにはアスタリスクをつける

```ruby
def my_mthod(*args)
  args
end

my_method(1, 'hoge', 'three')
#=> [1, 'hoge', 'three']
```

## キーワード引数
Ruby 2.0からの機能（同じことは1.9系とかでもできるがハッシュを展開しないとダメ）

```ruby
def my_method(name: 'test user')
  name
end

my_method(name: "test new user")
#=> "test new user"
```
メソッド定義の際の引数にdef my_method(:name => 'test user')って書き方はできないみたい。
ただ、メソッドを呼び出す際の引数に上記は可能。つまりmy_method(:name => 'test new user')はOK
http://magazine.rubyist.net/?0041-200Special-kwarg
　
- - -
ブロック引数、Procの引数に関しては下記のQiitaの記事が非常にわかりやすかったのでぜひご一読下さい。
http://qiita.com/kidachi_/items/15cfee9ec66804c3afd2
pythonで日時の差分を秒単位で出す方法


毎回ぐぐってるから書く。

```python
import datetime

#year,month,day,hour,minute,second(,micro?)がdatetimeメソッドの引数
first_time = datetime.datetime(2013,11,10,11,11,11)
last_time =  datetime.datetime(2014,11,10,11,11,11)
delta = last_time - first_time
print delta.total_seconds()
#=>31536000.0 total_secondsを使って差を秒で表現
Make Ruby Gems Available in Dash.app

**Update:** Dash provides better RubyGems doc support since 2.0, which automatically downloads the documentation of the gem you ask, therefore the methods in this post is no more needed.

Step 1: Edit `~/.gemrc` to force install RI and RDoc:

```yaml
gem: --ri --rdoc
```

Step 2: Regenerate docs for all the existing gems:

```sh
$ gem rdoc --all
```

Step 3: Open Dash.app and hit <kbd>command + ,</kbd> to open the Preferences window. Switch to "Docsets" tab, and make sure that "Ruby Gems" is turned on, and its RVM / rbenv paths are set correctly.

![Screen Shot 2013-11-20 at 1.30.12 PM.png](https://qiita-image-store.s3.amazonaws.com/0/16586/8fbedb0d-250a-c38a-0e27-b3339ffe264a.png)

Press **Index** button to forcibly index RDocs.

Now the Gem docs should be available in Dash.
CentOSでDropbox

##インストール
```
$ cd ~ && wget -O - "https://www.dropbox.com/download?plat=lnx.x86_64" | tar xzf -
```


##初回起動
```
$ ~/.dropbox-dist/dropboxd
This client is not linked to any account...
Please visit https://www.dropbox.com/cli_link?host_id=xxxxxxxxxxx to link this machine.
```
表示されたURLを叩くとDropboxパスワードを聞かれ、パスワード入力するとアカウントのリンク完了。


##CLIスクリプトインストール
```
$ mkdir ~/bin && cd ~/bin
$ wget "https://www.dropbox.com/download?dl=packages/dropbox.py"
$ chmod 755 ./dropbox.py
```

##CLIスクリプト使い方

* `dropbox.py help` ヘルプ表示
* `dropbox.py status` 状態表示
* `dropbox.py start` 同期開始
*  `dropbox.py stop` 同期停止
*  `dropbox.py autostart (y/n)` 同期自動開始
*  `dropbox.py exclude list` 同期除外ディレクトリ一覧
* `dropbox.py exclude add PATH` 同期除外ディレクトリ追加 PATH例: Dropbox/working
* `dropbox.py exclude remove PATH` 同期除外ディレクトリ追加
* `dropbox.py lansync (y/n)` LanSyncの有効/無効

##VPSなどではLanSyncを無効に
```
$ ~/bin/dropbox.py lansync n
```

####参考
https://www.dropbox.com/install?os=lnx

####環境
CentOS6.4 (さくらのVPS)
ssh公開鍵認証設定

##クライアント側で公開鍵、秘密鍵を作成しサーバに公開鍵転送
```
$ ssh-keygen -t rsa
$ scp ~/.ssh/id_rsa.pub USER@REMOTE_HOST:.
```
`~/.ssh/id_rsa` `~/.ssh/id_rsa.pub` を作成し、`~/.ssh/id_rsa.pub` を転送。

####パーミッション
~/.ssh/id_rsaは600or400でないとダメ。
~/.ssh は700以下？


##サーバ側で転送された公開鍵を設定
```
$ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 755 ~/.ssh/authorized_keys
```

####パーミッション
authorized_keysは755以下に設定。
~/.ssh は700以下？


##公開鍵を指定してのログイン方法
```
$ ssh -i ~/.ssh/id_rsa USER@REMOTE_HOST
```
iptables設定

sh(22), http(80)のみ開ける。

##設定確認
```
# iptables -L
```


##設定スクリプト
```sh:/root/bin/iptables.sh
#!/bin/bash

#iptables
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
iptables -F
iptables -X
iptables -Z

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT

iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

service iptables save
service iptables restart

#ip6tables
ip6tables -F INPUT
ip6tables -F OUTPUT
ip6tables -F FORWARD
ip6tables -F
ip6tables -X
ip6tables -Z

ip6tables -P INPUT DROP
ip6tables -P OUTPUT ACCEPT
ip6tables -P FORWARD DROP

ip6tables -A INPUT -p icmp -j ACCEPT
ip6tables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
ip6tables -A INPUT -i lo -j ACCEPT

ip6tables -A INPUT -p tcp --dport 22 -j ACCEPT
ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT

service ip6tables save
service ip6tables restart
```
```
# chmod 755 /root/bin/iptables.sh
# /root/bin/iptables.sh
```


##Tips

###直接設定ファイルを編集
```
# vi /etc/sysconfig/iptables
```

###現在のiptablesの設定をファイルに書き込む
```
# /sbin/iptables-save > /etc/sysconfig/iptables
```


####参考
http://www3.big.or.jp/~sian/linux/tips/iptables.html
http://saoshi.gooside.com/
http://gatyaex.wordpress.com/2011/03/05/serversmanvps%E3%81%AE%E3%83%A1%E3%83%A2%E3%80%80%EF%BD%9E-ip6tables-%EF%BD%9E/#more-254
http://www.t-pad.net/archives/554
http://naokuni.fc2web.com/study/router/iptables/
http://shibayu36.hatenablog.com/entry/20111229/1325152248


####環境
CentOS6.4 (さくらのVPS)
【めも】ios, Androidでテキストに下線表示

最近仕事でAndroidもいじるようになってADT Bundleにいらだちながらもがんばる毎日。

レイアウトファイルがiOSと異なり、xmlで記述する。
xmlファイル内には様々なレイアウトがあり、htmlよろしくmarginやpaddingなどの指定が大事、
またAのレイアウトの下に表示するなどの指定もあり、絶対位置を指定するよりは相対位置を指定することが
多いあたり画面サイズの多様なAndroidにあわせたものだなーとしみじみ感じた。

今回はそんなかでもiosでいう、UILabelに相当するTextViewの中身について調べた。

```xml:string.xml
 <string name="hello_styled"><u>Hello World, TextViewHtmlTest!</u></string>
 <string name="hello_escaped_styled">& lt;u>Hello World, TextViewHtmlTest!& lt;/u></string> 
 <string name="app_name">TextViewHtmlTest</string>
```

```xml:layout.xml
<TextView 
        android:id="@+id/txt1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text=""
        />
    <TextView 
        android:id="@+id/txt2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text=""
        />
    <TextView 
        android:id="@+id/txt3"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text=""
        />
```

string側での指定になるので、グラフィックツールのプロパティには無い

iosでは以下のようにプロパティにあるので下線つきのUILabelが簡単につけれる
[iOSのUILabelにアンダーラインを引く方法](http://hikaruworld.bitbucket.org/blog/html/2012/12/04/objcetive_c_underlying.html)

柔軟さで言えばAndroid, 手軽さでいえばiosなイメージ
こんな記事も出てるので見てみると面白いと思います

[Android vs. iOS, アプリはどっちから先に作る/売り出すべきか](http://jp.techcrunch.com/2013/11/19/20131116the-state-of-the-art/)
GitHubでのリンク(issue/pull request/wiki etc)

GitHub上でIssueを上げたりする際、リンクってどうやって張ったかな？と思うことがままあるためまとめておく。
※余談だが、テーブルのセル内で | を使いたいときは`&#124;`を使う。

| 記法 | リンク先|
|:-----------|:-------------|
|#番号|Issue または Pull Requestへのリンク (*)|
|commit番号|commitへのリンク(番号だけでOK)|
|@ユーザー名|ユーザーへのリンク|
|[[テキスト&#124;WikiPage名]]|Wikiページへのリンク(Wikiページでのみ有効)|

* Issue と Pull Request には共通の通し番号が使われ、重複はしないのでご安心あれ。
cakePHP の file_exists

cakePHP の file_exists　は

app/が基点になっているので、webroot内のフォルダ名から記述

<?php var_dump(file_exists("img/cake.icon.png")); ?>　← ◯
<?php var_dump(file_exists("/img/cake.icon.png")); ?>  ← ☓

落ち着いて考えれば、気づきそうなんだが。。。orz

参考：
http://www40.atwiki.jp/spellbound/pages/1940.html
Gruntでfoo.bar.jsみたいなファイルをfoo.bar.min.jsみたいにコンパイルする方法

## 通常は下記のような記述をするけどこれだと出力されないので
```js
uglify: {
    all: {
        src: 'js/_src/**/*.js',
        dest: 'js/dist/',
        expand: true,
        flatten: true,
        ext: '.min.js'
    }
}
```
## 下記の方法で対応
```js
uglify: {
    all: {
        src: 'js/_src/**/*.js',
        dest: 'js/dist/',
        expand: true,
        flatten: true,
        rename: function(dest, src){
            var separator = src.lastIndexOf('/'),
                  folder = src.substring(0, separator),
                  filename = src.substring(separator, src.length);
            filename = filename.substring(0, filename.lastIndexOf('.'));
            return dest + folder + filename + '.min.js';
        }
    }
}
```