OmniAICreator/Qiita-1.07M huggingface dataset:
cliパッケージでサブコマンドを作る


# cliパッケージ について

A Go library for implementing command-line interfaces.
https://github.com/mitchellh/cli

`github.com/mitchellh/cli`は、PackerやSerfやConsulで使用されている。
コマンドラインインターフェイスを実装するためのライブラリ。

サブコマンドを作る際に、以下のような面倒を見てくれる。

- サブコマンドのヘルプリストを自動生成
- ヘルプフラグである`-h`、`--help`引数を自動実装
- バージョンフラグである`-v`、`--version`引数を自動実装

# 使い方

インストール。

```bash:shell
go get github.com/mitchellh/cli
```

実装の流れとしては、

1. `Command`インタフェースの実装する(`Help()``Run()``Synopsis()`を実装する)
2. サブコマンドに使う文字列と`1.`で実装したものを対応付けさせる

と言った感じ。

以下の例では、`app foo`と`app bar`というサブコマンドを実装している。

```go:cli.go
package main

import (
        "github.com/mitchellh/cli"
        "log"
        "os"
)

/** foo サブコマンド用の実装 **/
type Foo struct{}

func (f *Foo) Help() string {
        return "app foo"
}

func (f *Foo) Run(args []string) int {
        log.Println("Foo!")
        return 0
}

func (f *Foo) Synopsis() string {
        return "Print \"Foo!\""
}


/** bar サブコマンド用の実装 **/
type Bar struct{}

func (b *Bar) Help() string {
        return "app bar"
}

func (b *Bar) Run(args []string) int {
        log.Println("Bar!")
        return 0
}

func (b *Bar) Synopsis() string {
        return "Print \"Bar!\""
}

func main() {
        // コマンドの名前とバージョンを指定
        c := cli.NewCLI("app", "1.0.0")

        // サブコマンドの引数を指定
        c.Args = os.Args[1:]

        // サブコマンド文字列 と コマンド実装の対応付け
        c.Commands = map[string]cli.CommandFactory{
                "foo": func() (cli.Command, error) {
                        return &Foo{}, nil
                },
                "bar": func() (cli.Command, error) {
                        return &Bar{}, nil
                },
        }

        // コマンド実行
        exitStatus, err := c.Run()
        if err != nil {
                log.Println(err)
        }

        os.Exit(exitStatus)
}
```

コンパイル。

```bash:shell
go build -o app cli.go
```

サブコマンドの実行。

```bash:shell
$ ./app foo
2014/11/11 21:45:10 Foo!
$ ./app bar
2014/11/11 21:46:27 Bar!
```

バージョンの表示。

```bash:shell
$ ./app --version
1.0.0
```

ヘルプの表示。

```bash:shell
./app --help
usage: app [--version] [--help] <command> [<args>]

Available commands are:
    bar    Print "Bar!"
    foo    Print "Foo!"
```

サブコマンドのヘルプの表示。

```bash:shell
$ ./app --help foo
app foo
$ ./app --help bar
app bar
```

と言った感じで、インタフェースで定められているメソッドを実装すれば、
サブコマンドが良い感じに実装される。


サブコマンドの引数などを実装したい場合は、
`flag`パッケージも併用すれば良さそう。

# 参考

https://github.com/mitchellh/cli/blob/master/command.go
EC-CubeとRestAPIでの情報やり取りについて


バージョン2.12から実装の様子
http://svn.ec-cube.net/open_trac/ticket/2102

コメントみると、外部とのやり取りはRestAPIのみ？

----

試しにデモサイトから呼び出してみる。
http://www.ec-cube.net/product/demo.php

(http://demo.ec-cube.net/〜)
〜に下記の内容を設定する。

XML形式
api/xml.php?Operation=GetVersion&Service=abc

(Amazon APIの仕様と一致するAPI呼出し)
api/xml.php?Operation=BrowseNodeLookup&Service=abc

JSON形式
api/json.php?Operation=GetVersion&Service=abc

PHP形式
api/php.php?Operation=GetVersion&Service=abc

参考
http://c-brains.jp/blog/wsg/14/04/07-150000.php
SinatraでローカルはSQLite、heroku上はpostgreSQLを使用する方法(ローカル環境構築編)

=======

・ディレクトリ構成は以下の通り

```
+ project_root/
  + vendor/				// gem管理用
    - bundle/
  + config/
    - database.yml		// DB情報管理
  + db/
    + migrate/
      - 					// マイグレーションファイル
    - development.db		// SQLite3テストDB
  + views/					// ビューのテンプレート
    - index.erb
  - Gemfile
  - Procfile				// foreman設定用ファイル
  - Rakefile				//	rake設定用ファイル
  - config.ru				//	Rack設定用ファイル
  - main.rb				// コントローラ
```


##Bundlerによるgem管理
*Gemfileの設定は以下の通り*

```Gemfile
source "https://rubygems.org"
ruby "2.1.3"

gem "sinatra"
gem "activerecord"
gem "sinatra-activerecord", :require => "sinatra/activerecord"
gem "rake"

group :production do
  gem "pg"
end

group :development, :test do
  gem "sqlite3"
  gem "sinatra-reloader"
  gem "foreman"
end
```

各種gemをインストール *ローカルはpgは不要なので、withoutを指定する。

```
bundle install --path vendor/bundle --without production
```

##Sinatraアプリケーションの設定

```config.ru
require "rubygems"
require "bundler"
require File.dirname(__FILE__) + "/main"

use ActiveRecord::ConnectionAdapters::ConnectionManagement

run Sinatra::Application
```

```Procfile
web: bundle exec rackup config.ru -p $PORT
```

```main.rb
# encodeing: utf-8
require "sinatra"
require "active_record"

require "sinatra/reloader" if development?

ActiveRecord::Base.establish_connection(ENV["DATABASE_URL"] || "sqlite3:db/development.db")

helpers do
  include Rack::Utils
  alias_method :h, :escape_html
end

class Comment < ActiveRecord::Base

end

get "/" do
  @comments = Comment.order("id desc").all
  erb :index
end

post "/new" do
  Comment.create({:body => params[:body]})
  redirect "/"
end

post "/delete" do
  Comment.find(params[:id]).destroy
end
```

##DBを使用する為の設定

```Rakefile
require "sinatra"
require "sinatra/activerecord"
require "sinatra/activerecord/rake"
```

```config/database.yml
development:
  adapter: sqlite3
  database: db/development.db
```

rakeコマンドが使用可能なことを確認

```
bundle exec rake -T

#使用可能であれば以下のような項目が表示される。
rake db:create_migration
rake db:migrate
```

##マイグレーションファイルの定義

```
bundle exec rake db:create_migration NAME=create_comments
```

```
#db/migrate/20141111121828_create_comments.rb
#上記のようなメッセージが表示される。
```

```db/migrate/20141111121828_create_comments.rb
class CreateComments < ActiveRecord::Migration
  def change
    create_table :comments do |t|
      t.text :body

      t.timestamps
    end
  end
end
```

###マイグレーション実行

```
bundle exec rake db:migrate
```

```
== 20141111121828 CreateComments: migrating ===================================
-- create_table(:comments)
   -> 0.0014s
== 20141111121828 CreateComments: migrated (0.0015s) ==========================
```


##作成したアプリがローカルで動くことを確認する
```
foreman start
```

port=5000で起動するので適当に確認
Raspberry PiのIPが変わった時に何事もなかったかのようにsshする方法

nmapが超便利です。

port 22番でsshする設定にしているなら

```
nmap -p22 192.168.0.1/24
```

でリストが出ます。

MacならインストールはHomebrewで簡単。

```
brew install nmap
```

もしひとつしかないなら以下のようにしてもいいかもですね。

```
ssh pi@`nmap -p22 192.168.0.1/24 | grep -B4 open | grep Nmap | cut -d' ' -f5`
```
Hyper-V統合サービスのインストール(Linux用)

# What's this

* Hyper-V上のCent OSに統合ツール(Linux Integration Services)をインストールする
	- 6.3以前のバージョンにはディストリビューション内に組み込まれていない
* とりあえず自分用メモ

## Linux Integration Servicesのダウンロード

[Linux Integration Services Version 3.5 for Hyper-V](http://www.microsoft.com/ja-jp/download/confirmation.aspx?id=41554)

## 統合サービスのインストール

* VM上へisoイメージをマウント

```
# mkdir /media/cdrom
# mount /dev/sr0 /media/cdrom
```

* インストール

```
# cd /media/cdrom/RHEL63
# ./install.sh
...
# reboot
```

* 動作確認

```
# lsmod | grep hv
```

* hv_utils等が稼働していればOK
Middlemanのlink_toを相対パスにする。そしてindex.htmlを省略させない


ローカルで見られるサイトをMiddlemanで生成したかったんですが、ちょっとはまったのでメモ

## ルート相対パスになっちゃう

```ruby:config.rb
set :relative_links, true
```
と書けば`middleman build`したときにドキュメント相対パスになるはずなんですが、ならない・・・

### 原因
```erb:foo.html.erb
<!-- これではだめ -->
<%= link_to "Foo", "/bar/" %>

<!-- ファイル名まで必要 -->
<%= link_to "Foo", "/bar/index.html" %>
```

## index.htmlが省略されちゃう

ローカルだとディレクトリインデックスが効かないので、これでは困ります。。。

### 対策

```ruby:config.rb
set :strip_index_file, false
```
これを書けばOKでした。
react-jadeでjadeテンプレートから仮想DOMを出力する

常日頃Reactに足りないのはテンプレートエンジンだ！と主張していたのだけど、react-jadeは試した感じ信頼できそうな感じだった。

jade公式なんで信頼できそう。信頼できそう、とは変なパースミスとか起こらないだろうという意味
[jadejs/react-jade](https://github.com/jadejs/react-jade "jadejs/react-jade")


```javascript
var React = require('react');
var jade = require('react-jade');
var dummyTemplate = 'button(onClick=onClick) this is button';

var template = jade.compile(dummyTemplate);

var Foo = React.createClass({
  onClick: function(){
    console.log('clickcckckckckc');
  },
  render: function(){
    template({onClick: this.onClick});
  }
});

React.renderToString(Foo({})) //=> render!
```

ちゃんと関数インスタンスを関数インスタンスとして渡せる！ってのが多分他のテンプレートエンジンとのいちばん大きな違いだと思う。

プレコンパイル(jade.compile)にそこそこ時間かかるっぽいので、たぶんrender時じゃなくてロード時にプレコンパイルするのがたぶん正しい。

探したら一応webpack用のローダーがあった。
[nw/react-jade-loader](https://github.com/nw/react-jade-loader "nw/react-jade-loader")
Procmailで転送先のGmailにエラーを吐かせない方法

## Procmailで作成するレシピ
1. 添付ファイルがexeの場合、転送しない
1. 添付ファイルが15MB以上の場合、転送しない

## .forwadファイルを作成する
`$ touch .forward`
`$ chmod 600 .forward`
`$ vi .forward`

```$HOME/.forward
{ユーザ名}
"|IFS=' ' && exec /usr/bin/procmail -f- || exit 75 #{ユーザ名}"
```

## .procmailrcファイルを作成する
`$ vi .procmailrc`

```$HOME/.procmailrc
# ヘッダContent-Typeにexeが含まれたら削除
:0 
* ^Content-Type:.*name=.*\.exe.*
/dev/null

# メッセージ本体のfilenameにexeが含まれたら削除
:0B 
* .*filename=.*\.exe.*
/dev/null

# 15MB以下の場合、メールを転送する
:0 
* < 15000000
! {転送先Gmailアドレス}
```

## テストする
1. ただのテキストメールを送った場合  
    → 転送されることを確認
1. exe添付のメールを送った場合  
    → 転送されないことを確認
1. 15MB超えのメールを送った場合  
    → 転送されないことを確認
【IE7対策】 逆引きメモ

＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

* IE7対策用(主にCSS)のメモです。※都度追加予定です
* 以下に書いた解決策が一概に原因とはいえませんが、参考までに...

＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

#### background: url(...) が表示されない
* 解決策：url()の後に**スペース**を入れる

```css:良い例
.class {
	backgroud: url() left top;
}
```

```css:悪い例
.class {
	backgroud: url()left top;
}
```

#### buttonタグを押すと、破線の囲みが表示される
* 解決策：**outline**を非表示にする

```css:css
button {
	outline: none;
}
```
「販売準備完了（Ready for Sale）」になったiOSアプリがApp Storeに表示されない時に見直したい箇所まとめ


長いレビュー待ち期間を経てやっと「販売準備完了（Ready for Sale）」になったアプリが、いつまで経ってもストアに表示されませんでした。。。。
同じ轍を踏まぬよう、纏めました。
参考になれば幸いです。



<b>前提：</b>
- iTunes Connect にログイン
- マイ Appを選択
- 対象のアプリのアイコンをクリック
- 編集画面で「価格」タブを選択

<b>イメージ画像</b>

![スクリーンショット 2014-11-11 19.39.11.png](https://qiita-image-store.s3.amazonaws.com/0/15812/3effcb75-b50c-9c21-002c-a0089b18067d.png "スクリーンショット 2014-11-11 19.39.11.png")

<br>

## 確認項目１：配信時刻の設定
リリースしたい期日になっているか確認しましょう。

<b>イメージ画像</b>

![スクリーンショット 2014-11-11 19.39.22.png](https://qiita-image-store.s3.amazonaws.com/0/15812/45ee0771-50ef-f7ef-f36d-bc12a240220f.png "スクリーンショット 2014-11-11 19.39.22.png")


<br>
## 確認項目２：配信国の設定
配信したい国の設定になっているか確認しましょう。

<b>イメージ画像</b>
![スクリーンショット 2014-11-11 19.31.13.png](https://s3-ap-northeast-1.amazonaws.com/rendezvous-uploads/1/43/c5232549a303b947b10a1640fc364db4.png)


![スクリーンショット 2014-11-11 19.31.21.png](https://s3-ap-northeast-1.amazonaws.com/rendezvous-uploads/1/43/cb4dcb9203982b890db4390e137ef95d.png)


![スクリーンショット 2014-11-11 19.31.29.png](https://s3-ap-northeast-1.amazonaws.com/rendezvous-uploads/1/43/02d2dd426793f72f13b6fa05756f09b4.png)

<br>
## 確認項目３：レーティング内容
「レーティングなし」で登録したアプリは、レビューを通過して「販売準備完了」になってもストアに表示されません。
確認しましょう。


<b>イメージ画像</b>

![スクリーンショット 2014-11-11 19.35.39.png](https://s3-ap-northeast-1.amazonaws.com/rendezvous-uploads/1/43/2e6e2a5c66a6ee0c0d90da23aa7e3002.png)
ORMLiteで、DBを削除したいとき。

AndroidのORマッパーでお馴染みのORMLiteですが、データベースの削除がデフォルトでついてないみたいです。

ログアウトの処理とか作る時に割と必要なので、作ってみました。
以下のソースのdestroyメソッドがそれです。

this.getReadableDatabase() でデータベースを取得して、一旦DBを開きます。
例外が発生すればDBは存在しないので、削除する必要はありません。
例外が発生しなければDBが存在するため、削除しています。

DB名、DBバージョンはstrings.xmlから取得しています。その方が設定情報をひとまとめに出来ますし。
テーブルをまとめて生成するために、エンティティクラスをリストにまとめています。

ヘルパークラスの作り方は、以下のサイトを参考にしてみました。
http://atmarkplant.com/ormlite1/

```
/**
 * OrmLiteSqliteOpenHelper を継承したDatabaseHelper
 */
public class ORMDatabaseHelper extends OrmLiteSqliteOpenHelper {
    final static String	TAG = ORMDatabaseHelper.class.getSimpleName();
    final static List<Class> tableClassList;
    static {
        tableClassList = new ArrayList<Class>();
        tableClassList.add(HogeHogeTable.class);
    }

    public ORMDatabaseHelper( Context context )
    {
        super( context, context.getString(R.string.db_name), null,  context.getResources().getInteger(R.integer.db_version)  );
    }

    @Override
    public void onCreate(SQLiteDatabase db, ConnectionSource cs)
    {
        try
        {
            for(Class tableClass : tableClassList) {
                TableUtils.createTable(cs, tableClass);
            }
        }
        catch ( SQLException oops)
        {
            oops.printStackTrace();
            Log.e(TAG, "DB作成失敗", oops);
        }
    }

    /**
     * DBを削除する
     */
    public void destroy(){
        try{
            SQLiteDatabase db = this.getReadableDatabase();
            SQLiteDatabase dummyDataBase = SQLiteDatabase.openDatabase(db.getPath(), null, SQLiteDatabase.OPEN_READONLY);
            SQLiteDatabase.deleteDatabase(new File(db.getPath()));
        }catch(Exception e){
            e.printStackTrace();
            Log.e(TAG, "DB破壊失敗",e);
        }
    }

    /**
     * ダウングレード時にもやってもいいかもしれない。
     */
    @Override
    public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        try {
            SQLiteDatabase dummyDataBase = SQLiteDatabase.openDatabase(db.getPath(), null, SQLiteDatabase.OPEN_READONLY);
            SQLiteDatabase.deleteDatabase(new File(db.getPath()));
        }catch(Exception e){
            Log.e(TAG, "DB破壊失敗",e);
        }
    }
}
```

誰かの役に立ったらいいなあ。
Cent6.3でepelに取りにいけない

今日の知見です。

##症状
CentOS 6.1, 6.2, 6.3にて, yumしようとしてepelでこけます。

```
$ yum install hogehoge

Loaded plugins: downloadonly, fastestmirror
Loading mirror speeds from cached hostfile
Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again  
```

##解決法
デフォルトでSSL3.0使ってるらしくだめみたいです。
HTTPSでなくHTTPで取りに行くようにしましょう

```bash:
sed -i 's/\(mirrorlist=http\)s/\1/' /etc/yum.repos.d/epel.repo
```


参照: https://community.hpcloud.com/article/centos-63-instance-giving-cannot-retrieve-metalink-repository-epel-error
PHPでXMLを解析するときに注意すること

#PHPでXMLのデータを解析する

##XMLをパースする

XML形式についてはPHPの関数で**simplexml_load_string**という関数があります。
これはXML文書をパースしてオブジェクト化してくれる関数だそうです。

```
$xml = file_get_contents('http://blog.kzno.net/feed/');
$xmlObject = simplexml_load_string($xml);
```

ただ、これだけだと比較する時や引数として値を渡したいときにオプジェクトとして扱うためうまくいきません。
引数として使用する場合は**(string)**で文字列にキャストしてやると幸せになれます。

```
print( (string)$xmlObject->channel->title );
```

でもこれだといちいちキャストしないといけないので面倒。
そういった場合はオブジェクト全体を連想配列にすると便利。

```
$xmlArray = json_decode( json_encode( $xmlObject ), TRUE ) );
```

これでオブジェクトとか気にすることなく配列として使えます。


ちなみにオブジェクトの状態だとxmlに戻すことも可能。

###オブジェクトをxml形式に戻す

```
$xmlObject->asXML();
```
Swiftをシェルスクリプトのように使う一番簡単な方法

**Update:** Apple Swift version 2.1 (swiftlang-700.1.101.6 clang-700.1.76) 用に書き直しました。

```hello.swift

#!/usr/bin/swift

let hello = "こんにちは"
print(hello)

// 遊び心で。。
let 挨拶 = "お世話になります"
print(挨拶)

```


```
$ chmod a+x hello.swift
```

```
$ ./hello.swift
```

これだけです。`/usr/bin/swift`で動作を確認しています。

```
$ /usr/bin/swift --version
Apple Swift version 2.1 (swiftlang-700.1.101.6 clang-700.1.76)
Target: x86_64-apple-darwin15.0.0
```

肝は、

**#!/usr/bin/swift** をファイルの先頭に記述することのみです。

お試しあれ。

この仕組みを使って、IPAファイルの生成コマンドを作ってみました。

注意: このコードはSwift1.0対応のままで更新していません
https://gist.github.com/naokits/5e202549d0fc96f3e3c6

### 追記:

実際に動作する、JSONを取得する簡単なSwiftスクリプトを貼り付けておきます。

```sample_script.swift

#!/usr/bin/swift

import Foundation

typealias Failure = (NSError!) -> Void
typealias ResultBlock = (NSData!, NSError!) -> Void

/// JSONObjectWithDataの戻り値として使用する
enum JSONObjectWithDataResult {
    case Success(AnyObject)
    case Failure(NSError)
}

/// NSDataをJSONオブジェクトに変換し、JSONオブジェクトまたはエラーのいずれかを返す
func JSONObjectWithData(data: NSData) -> JSONObjectWithDataResult {
    do {
        let json = try NSJSONSerialization.JSONObjectWithData(data, options: .AllowFragments)
        return .Success(json)
    } catch let error as NSError {
        return .Failure(error)
    }
}

/// JSONデータの取得
func fetchJSONData(block: ResultBlock) {
    let url = NSURL(string: "http://api.tiqav.com/search/random.json")
    let config = NSURLSessionConfiguration.defaultSessionConfiguration()
    let session = NSURLSession(configuration: config)
    let task = session.dataTaskWithURL(url!) { data, response, error in
        guard let data = data else {
            block(nil, error)
            return
        }
        session.invalidateAndCancel()
        dispatch_async(dispatch_get_main_queue()) { () in
            block(data, nil)
        }
    }
    task.resume()
}

var waitingForBlock = true // 終了判定で使用する

fetchJSONData() { data, error in

    guard let data = data else {
        print("エラー: \(error)")
        return
    }

    switch JSONObjectWithData(data) {
    case .Success(let json):
        print("json: \(json)")
        for item in json as! [NSDictionary] {
            print(item.objectForKey("source_url"))
        }
    case .Failure(let error):
        print("エラー: \(error)")
    }

    waitingForBlock = false
}

while waitingForBlock {
    // １秒毎に終了を確認する
    NSRunLoop.currentRunLoop().runMode(NSDefaultRunLoopMode, beforeDate: NSDate(timeIntervalSinceNow:1.0))
}

```

### おまけ

カレントディレクトリを表示するだけです。このコードを元に、いろいろ工夫してみてください。

```
#!/usr/bin/swift

import Foundation

let task = NSTask()
task.launchPath = "/bin/sh"
task.arguments = ["-c", "ls -l ./"]
task.standardInput = NSFileHandle.fileHandleWithNullDevice()
task.standardError = NSFileHandle.fileHandleWithStandardError()
task.standardOutput = NSFileHandle.fileHandleWithStandardOutput()
task.launch()
task.waitUntilExit()
```
Tips: シェルスクリプト内でカレントディレクトリ(実行ディレクトリ)の絶対パスを取得する


```bash
current_dir=$(cd $(dirname $0) && pwd)
```

以上 ٩(๑´3｀๑)۶

（背景）

dockerのコンテナ起動時のコマンドのオプションが長くて面倒くさいので

```bash
#!/bin/bash

ssh_port=10022

script_dir=`dirname $0`

docker run -d -i -t -p $ssh_port:22 -v $script_dir:/host:rw kawanamiyuu/docker-centos-supervisord
docker ps
```

みたいな感じでスクリプト化してたんだけど、```VOLUME (-v)```に指定する```ホスト側```の
ディレクトリ名は```絶対パス```でないといけなくて([※](https://docs.docker.com/userguide/dockervolumes/#volume-def))、で、実行時、カレントディレクトリが
このスクリプトと同じだとエラーになる(∵```script_dir=.```)のがアレだったので。
S3バケットに対して別のAWSアカウントからのアクセスを許可する


この投稿は個人的な意見/メモであり、会社を代表するものではありません。

--

## 対象バケットのバケットポリシーを編集

### Edit bucket policyのボタンを押す

![image1](https://raw.github.com/wiki/imaifactory/memo/images/s3bucketpolicy_for_accessing_other_account_1.png)

### JSONで記述したポリシーをはりつけてSave

![image1](https://raw.github.com/wiki/imaifactory/memo/images/s3bucketpolicy_for_accessing_other_account_2.png)

JSONはこんな感じ。YOUR_BUCKET_NAMEは自分のS3バケット名、TARGET_AWS_ACCOUNT_IDはアクセス元のAWSのIDに置き換える。

```json

{
    "Id": "Policy1407414264995",
    "Statement": [
        {
            "Sid": "Stmt1407414232771",
            "Action": [
                "s3:ListBucket"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::YOUR_BUCKET_NAME",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::TARGET_AWS_ACCOUNT_ID:root"
                ]
            }
        },
        {
            "Sid": "Stmt1407414262750",
            "Action": [
                "s3:GetObject"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::YOUR_BUCKET_NAME/*",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::TARGET_AWS_ACCOUNT_ID:root"
                ]
            }
        }
    ]
}

```
大量のレコードをMySQLにLOAD DATAで読み込む


- 1,000万レコードで400-500秒は割りと妥当。
- TIPS
 1. レプリをしてなければ、SET sql_log_bin=OFFでバイナリログ無効化
 1. 安全を犠牲にして　innodb_flush_log_at_trx_commit=0 or 2 でコミット時にログフラッシュ無効(元データがあるので失敗してもやり直せるならこれを)
 1. --skip_innodb_doublewrite を追加してダブルライトバッファを無効化
 1. MySQLのバージョンごとの最適なLOADのタイミングについては　http://dbstudy.info/files/20131007/mysql56_load_r2.pdf　の6枚目を参考に
 1. autocommit = 0 unique_checks = 0 foreign_key_checks = 0 あたりも効果がありそう
 1. インポート先がInnoDBだとすると、InnoDBへのインサートはClustered Indexの再構築であるという点を抑える必要がある。すなわちインポートするCSVをPrimary Keyでソートしておくと高速になる。
Apache TimeoutとKeepAliveTimeout

# まとめ
- KeepAliveTimeoutはTCPセッション上で、無通信が続いた場合にいつ切断するかを制御する。ロードバランサーとバックエンド間でTCPセッションを使い回し、1本の上で複数のHTTPセッションをやり取りする場合はこちらを見る

- ELB Idle Connection Timeoutよりも、KeepAliveTimeoutを長く取っておく必要がある
"make sure that the value set on your instance for the keep-alive time is greater than the idle timeout setting on your load balancer."

- Timeoutは一度張ったHTTPセッション上で、無通信が続いた場合にいつ切断するかを制御する。ファイルダウンロード中の無通信状態などはこちらを見る



# 参考文献
- http://qiita.com/kou/items/acb3dcf1dcb428d7a3ec
- http://httpd.apache.org/docs/2.2/ja/mod/core.html#timeout
- http://httpd.apache.org/docs/2.2/ja/mod/core.html#keepalivetimeout
- http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/TerminologyandKeyConcepts.html#idle-timeout
- http://debiancdn.wordpress.com/2012/06/14/amazon-elb%E3%82%92%E3%81%86%E3%81%BE%E3%81%8F%E3%81%A4%E3%81%8B%E3%81%86%E3%81%AB%E3%81%AF%E3%80%81keepalive%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%97%E3%82%88%E3%81%86%E3%80%82timeout%E3%81%AF60/
「新装版リファクタリング」を買ったから写経状況をGit管理しようとしたらできなかった（書きかけ）

**この記事は書きかけです。**
うまくできなかった状況を思い出しながら書きなぐったものであり、理解が進んだら正しい手順を整理して記載する予定です。

とりあえず[ここ](http://tracpath.com/bootcamp/learning_git_firststep.html)でGitをちょっと勉強。成果は[こちら](http://qiita.com/morishima0524/items/b375c95f2c8d361d4583)

Eclipse＋Gitも調べないと。


###手順
1. Eclipseプロジェクトを作成（Refactoring）
2. ローカル（%HOME%/git/Refactoring）にGitリポジトリを作ってプロジェクトをコミット（Eclipseの指示に従って作った）
3. 最初の例題を写経してコミット
4. GitHub（Remote）にプッシュを試みる（https://github.com/morishima0524/Refactoring に）
5. 失敗する（エラー文言は見なかった）
6. まだリポジトリを作っていなかったので、GitHubに上記リポジトリを作成
7. 再プッシュ
8. 失敗する（Non-Fast-Forward）
9. エラーメッセージでググったらRebaseという単語が見えたのでやってみる
10. EclipseのワークスペースからRefactoringプロジェクトが消える（？！）
11. %HOME%/git/Refactoring が残っていたので、復旧を試みる
12. でも、src配下しか残ってない（.projectが入ってない）
13. SVNパースペクティブみたいに、プロジェクトをインポートしたかったができず、結局、プロジェクトを作り直して、残ってたソースをコピった

GitもGitパースペクティブもよくわからん。一から勉強して、この現象解明しよう。
Rebaseとは？Pushとは？


##解決に向けて
###正しいと思う手順でやり直す
1. GitHubでリポジトリ作成<br/>https://github.com/morishima0524/EclipseGitTest_Emptyを作成（直下にREADME.mdなし）
2. ローカルにクローン（GitHubデスクトップで）<br/>EclipseのGitパースペクティブで「Clone a Git repository and add the clone add it to this view」とツールチップの出てくるボタンでもできる模様。
3. ワークディレクトリに（Eclipseから）プロジェクトを作る<br/>プロジェクトの作成場所をクローンしてきたディレクトリに指定して、「Refactoring」プロジェクトを作成<br/>そしてMovie.javaだけ作る。（空ディレクトリのコミットができないので）
4. commitする。<br/>プロジェクト右クリック→Team→Commit→コメント書いてCommit（Commit and Pushではなく）
5. pushする。<br/>プロジェクト右クリック→Team→Push to Upstream
6. 成功！

ひとまず、成功する手順がひとつわかった。
（Rebaseしない手順なので関係ないと思うが、README.mdの有無が関係あるのか確認）
Android Wear をビルドすると APK が２つ作成される

Android Wear をビルドすると APK が２つ作成されます。
新しい Android Wear プロジェクトを作成した際、デフォルトだと mobile ディレクトリに Handheld 端末用のプロジェクトが、wear ディレクトリに Wear 用プロジェクトが用意されます。この状態で APK を作成すると mobile-release.apk と wear-release.apk が作成される。なぜ２つできるのか迷ったのでメモを。

## リリースは mobile-release.apk のみアップロード

Google Play にアップロードするのは mobile-release.apk のみでOK。APK をアップロードする場所が１つしかなくて迷ったけど、mobile だけアップロードすれば、ストアからインストールした際に Wear 端末にもインストールされる。実際に mobile-release.apk の中を見てみると、mobile-release.apk -> res -> raw -> android_wear_micro_apk.apk というように Wear 用アプリも含まれている。
よく考えたら mobile の build.gradle に  ```dependencies { wearApp project(':wear') }``` と書いてあった。

#### なぜ２つ作成されるか
デバッグのため adb でデバイスに mobile をインストールしても Wear には反映されないので、別々にインストールする必要あるため。


#### 参考

Packaging Wearable Apps | Android Developers http://developer.android.com/training/wearables/apps/packaging.html
Creating and Running a Wearable App | Android Developers https://developer.android.com/training/wearables/apps/creating.html#Install
Python で Project Euler #6「二乗和の差」

[Problem 6 「二乗和の差」](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%206)

> 最初の10個の自然数について, その二乗の和は,
> 
> ```math
> 1^2 + 2^2 + ... + 10^2 = 385
> ```
> 
> 最初の10個の自然数について, その和の二乗は,
> 
> ```math
> (1 + 2 + ... + 10)^2 = 3025
> ```
> 
> これらの数の差は 3025 - 385 = 2640 となる.
> 同様にして, 最初の100個の自然数について二乗の和と和の二乗の差を求めよ.

```py:Python
n = 100

seq = range(1, n+1)

result = sum(seq)**2 - sum(map(lambda x: x**2, seq))

print result
print result == 25164150
```

```:結果
25164150
True
```
Swift で SHA256 の値を取得する

## SHA256とは

```
任意長の原文から固定長の特徴的な値である「ハッシュ値」を求める計算手順(アルゴリズム)の一つ。
最長で2の64乗ビットまでの原文から、256ビットのハッシュ値を算出することができる。
```
参考: http://e-words.jp/w/SHA-256.html


## Swift で SHA256 の値を求める

String の `extension` として実装してみました。

```swift
extension String {
    func sha256String() -> String {
        let cstr = self.cStringUsingEncoding(NSUTF8StringEncoding)
        let data = NSData(bytes: cstr!, length: countElements(self))
        
        var digest = [UInt8](count: Int(CC_SHA256_DIGEST_LENGTH), repeatedValue: 0)
        
        CC_SHA256(data.bytes, CC_LONG(data.length), &digest)
        
        var output = NSMutableString(capacity: 64)
        for var i=0; i<32; i++ {
            output.appendFormat("%02x", digest[i])
        }
        
        return output as String
    }
}
```

## 使い方

下記のように利用します。

```swift
let tokenedString = "password".sha256String()
```


## 使い道

```
ハッシュ値の活用例としては、例えばパスワードの保存がある。
ハッシュ値を使えば、生のテキスト・パスワードを保存しなくて済むので安全性が高まる
（万が一、ハッシュ値が漏れても、それから実際のパスワードは取得できない）。

また、例えば2者間で送受信したデータが不正ではないかをチェックしたいときにも使える。
この場合、送信者と受信者におけるデータのハッシュ値を比較するだけで、
そのデータが壊れていないかどうかを確認できる（いわゆるチェックサム）。
```
参考: http://www.atmarkit.co.jp/fdotnet/dotnettips/964computehash/computehash.html

  
  

間違いがありましたらご指摘いただけると助かります。
複数の version がインストールされている Formula を切り替える


## TL;DR

```bash
% brew switch <formula> <version>
```

## はじめに
普段使っている ImageMagick と、プロジェクトで必要になる ImageMagick が異なり、インストールしてある複数の ImageMagick から HEAD ではないものを使う必要があった。
確か以前にも `brew` で利用する Formula を切り替えた記憶があったのだが、しばらく必要としていなかったのですっかり忘れてしまっていた。
そこで `brew help` を見たのだが、必要としているコマンドを見つけることができなかった。

```bash
% brew help
Example usage:
  brew [info | home | options ] [FORMULA...]
  brew install FORMULA...
  brew uninstall FORMULA...
  brew search [foo]
  brew list [FORMULA...]
  brew update
  brew upgrade [FORMULA...]
  brew pin/unpin [FORMULA...]

Troubleshooting:
  brew doctor
  brew install -vd FORMULA
  brew [--env | config]

Brewing:
  brew create [URL [--no-fetch]]
  brew edit [FORMULA...]
  open https://github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/Formula-Cookbook.md

Further help:
  man brew
  brew home
```

ついでに `man brew` も確認したのだが見つけることができなかった。

## Formula を切り替える方法

複数の Formula がインストールされている状態で任意の Formula を利用するには

```bash
% brew switch <formula> <version>
```

とする。
例として ImageMagick の version を変更する。
まずは現在使っている ImageMagick の version を確認する。

```bash
% convert --version
Version: ImageMagick 6.8.9-8 Q16 x86_64 2014-11-11 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2014 ImageMagick Studio LLC
Features: DPC Modules
Delegates: bzlib freetype jng jpeg lcms ltdl lzma png tiff zlib
```

そして、Homebrew でインストールしている ImageMagick の version を確認する。

```bash
% brew info imagemagick
imagemagick: stable 6.8.9-8 (bottled), HEAD
http://www.imagemagick.org
/usr/local/Cellar/imagemagick/6.8.8-9 (1433 files, 22M) *
  Built from source with: --with-libtiff
/usr/local/Cellar/imagemagick/6.8.9-1 (1436 files, 22M)
  Built from source with: --with-libtiff
/usr/local/Cellar/imagemagick/6.8.9-8 (1437 files, 22M)
  Built from source with: --with-libtiff
From: https://github.com/Homebrew/homebrew/blob/master/Library/Formula/imagemagick.rb

...
```

ここで、現在の 6.8.9-8 から 6.8.8-9 に利用する version を変更する。

```bash
% brew switch imagemagick 6.8.8-9
Cleaning /usr/local/Cellar/imagemagick/6.8.8-9
Cleaning /usr/local/Cellar/imagemagick/6.8.9-1
Cleaning /usr/local/Cellar/imagemagick/6.8.9-8
71 links created for /usr/local/Cellar/imagemagick/6.8.8-9
```

ImageMagick の version を確認してみよう。

```bash
% convert --version
Version: ImageMagick 6.8.8-9 Q16 x86_64 2014-04-16 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2014 ImageMagick Studio LLC
Features: DPC Modules
Delegates: bzlib freetype jng jpeg lcms ltdl png tiff xml zlib
```

利用されている version が変わっていることが確認できる。


## おわりに
`brew switch` についてのドキュメントがどこにあるのか見つからなかったので有識者の方教えてください。

## 参考
- https://github.com/Homebrew/homebrew/blob/50cf70aadcc026f58c68125e391c7321360cc294/Library/Homebrew/cmd/switch.rb

- http://marutanm.github.io/blog/2012/02/01/homebrew-switch-formula-version/
QiitaにPocketボタンを付けてみた

Qiitaに投稿された記事には右側に Twitter/はてブ/G+ のボタンが付いてるけど、Pocketに保存された数も知りたいなーと思ったので付けてみた。


自分は普段Chromeを使っててユーザスクリプトの管理には [tampermonkey](https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo) てのを使ってる。わざわざファイル作らずにStylishみたいに思いついた時にすぐにスクリプト追加が出来て便利。

で、実際にちゃちゃっと作ってみたユーザスクリプトは以下のとおり。とりあえず試すだけならブラウザの開発者ツールのConsoleに貼り付ければすぐに試せるはず。

```js:
// ==UserScript==
// @name         Add Pocket button on Qiita
// @namespace    https://twitter.com/kawaz
// @version      0.1
// @description  add Pocket button on Qiita
// @author       Yoshiaki Kawazu
// @match        http://qiita.com/*/items/*
// @grant        none
// ==/UserScript==
!function(){
    var btn=document.createElement("div");
    document.querySelector(".socialButtons").appendChild(btn);
    // http://getpocket.com/publisher/button
    btn.innerHTML='<a data-pocket-label="pocket" data-pocket-count="horizontal" class="pocket-btn" data-lang="en"></a>';
    !function(d,i){if(!d.getElementById(i)){var j=d.createElement("script");j.id=i;j.src="https://widgets.getpocket.com/v1/j/btn.js?v=1";var w=d.getElementById(i);d.body.appendChild(j);}}(document,"pocket-btn-js");
}();
```

# 付けてみた感想
Pocketはコメントとともに投稿されることの多いTwitterははてブと違って、自分用のメモとしての色が強いのでそれぞれの数字を見ると、

- 「Twitter/はてブ」は話題になった度合い
- 「Pocket」は記事を読んだ人が、これは役に立つ/後でまた読むって思ってもらえた度合い
- 「G+」は流行ってないんだなってこと

がそれぞれ分かるので面白い。



例えば自分の書いた記事では、

- この辺りの記事はPocket/はてブ比が高め→人の役にたってるっぽい
    - [AWS - S3の料金体系が分かりにくいと聞かれたので纏めた - Qiita](http://qiita.com/kawaz/items/07d67a851fd49c1c183e)
    - [踏み台サーバを経由した多段SSHのやり方 - Qiita](http://qiita.com/kawaz/items/bfe9c24ab22eba3df6fc)
- 逆にこっちの記事はPocket率が低め→メモというよりは話題として消費されたんだな
    - [Ssl - 認証局を立ててぼろもうけしたいんですが＞無理な理由を理解しよう - Qiita](http://qiita.com/kawaz/items/f90810b9ea823b6556a8)

と予想が付く。
Dash(リファレンスビューア)が超便利だった件


いまさら感があるかもですが [Dash](http://kapeli.com/dash) を使ってみて感動したので。各種言語の API ドキュメントをサクサク参照することが出来ます。

> 有償ツールですが、無料でも十分ぽい。購入すると、閲覧時の待ち時間が短くなるだけ？

## インストール手順

環境：`OS：Mac OS X 10.9.5 (Mavericks)`

公式ページからGUIインストーラをダウンロードしてもいいのですが、もし [Homebrew Cask](http://caskroom.io/) でインストールするには次のようにします。

```shell:
$ brew cask install dash
```

> Homebrew Cask の導入手順はこちらを参考にしてください
> ⇨ [Homebrew Cask で Atom を、apm で Atom のパッケージを導入したメモ](http://qiita.com/hkusu/items/f41f5566e1040147f1fc)

## 使ってみた

言語を選んで、ドキュメントをダウンロードします。主要な言語はカバーしている感じ。JavaScript フレームワークや Ruby、Rails、また Swift や Android もあります。

![スクリーンショット 2014-11-11 17.00.16.png](https://qiita-image-store.s3.amazonaws.com/0/35733/3621aec8-ea51-1c0b-784e-3e52979779e7.png)

インクリメンタルサーチがいい感じです^^

![スクリーンショット 2014-11-11 17.23.38.png](https://qiita-image-store.s3.amazonaws.com/0/35733/25e7afe8-8693-89b3-113e-b41768d7df7c.png)

おしまい。
Windows、基本Git bashでやるのが幸せな気がしてきた

まっさらな状態のウインドウズでやった訳ではないのであくまで想定だが、なんか基本、Git bash って一通り入ってるので、cygwin とか入れるより、Git bash を最大限利用した方がいいんじゃないかってな結論になった。
そのままでsshも使えるしねー。
んで、ちょっと格好つけたいので、ConEmu から呼べばいいだろうと。

まずGit bashの設定。

```bash
vim ~/.bash_profile
```

として、以下の一行を書き込みむ。

```bash
alias ls='ls --show-control-chars'
```

これでlsで日本語ファイル名が化けなくなる。

あと、

```bash
vim ~/.gitconfig
```

として、gitが使うvimをKaoriYaのにする。

```bash
[core]
        editor = /C/vim/gvim --nofork -c 'set fenc=utf-8' +1
```

ConEmuをインストールして、

Task parameters のとろこに、以下のように入れておけば、Git bashが起動した時にc:\直下にいてくれる。

```
/dir "C:\"
```

Startup の Specified named task のところでGit bashを選んでおけば、それがデフォルトで開く。

あとはColorsでSchemesを変えてみたり。
sqlite3を使ってみる



## 概要

cocos2d-xのアプリ内でも、マスタデータなどをSQLで扱えると便利だなと思ったので導入。


## 環境

- Mac OS X Yosemite 10.10.1
- Cocos2d-x v3.3
- SQLite 3.8.7.4


## 準備

### SQLiteのソースをダウンロード

[こちら](http://www.sqlite.org/download.html)のSource Codeからzipファイルをダウンロードする。

### externalにファイルを追加

```
cocos2d/external/sqlite3/
|- Android.mk
|- sqlite3.c
|- sqlite3.h
`- sqlite3ext.h
```

ダウンロードしたソースファイルを上記の場所にコピペする。
最初からsqlite3がある場合は全て削除して一から作る。
Android.mkについては後述する。

### iOSで使えるようにする

```
cocos2d_libs.xcodeproj/external/sqlite3/
|- sqlite3.c
|- sqlite3.h
`- sqlite3ext.h
```

Xcode上で上記ファイルを追加する。

1. ``Add Files to ..`` を選択
2. ``cocos2d/external/sqlite3/`` を選択
3. Added folders は ``Create groups`` を選択
4. Add to targets は libcocos2d iOS を選択
5. 上記以外のファイルは ``Delete > Remove References`` する

これでiOSでビルドできる。


### Androidで使えるようにする

#### ライブラリのビルド設定を追加

```
cocos2d/external/sqlite3/Android.mk
```

[こちら](https://gist.github.com/kiarina/07b5165586092bbaa10d)をコピペする。

```:Android.mk
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := sqlite3_static
LOCAL_MODULE_FILENAME := libsqlite3
LOCAL_SRC_FILES := sqlite3.c
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../../cocos
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../cocos \
                    $(LOCAL_PATH)/../../cocos/platform/android

include $(BUILD_STATIC_LIBRARY)
```

#### アプリのビルド設定を変更

```
proj.android/jni/Android.mk
```

[こちら](https://gist.github.com/kiarina/72dc4a480b08dea8c854)をコピペする。
追加したのは以下の２行だけ。

```
LOCAL_STATIC_LIBRARIES += sqlite3_static
$(call import-module,sqlite3)
```

はい！これでAndroidでも使えるー！


## ツール

### Lita

[こちら](http://www.dehats.com/drupal/?q=node/58)からインストール。
アプリ内で作成したDBにアクセスする際は、作成したDBファイルのパスを出力しておく。


## 参考

* [テーブルスキーマ(構造)の確認](http://www.dbonline.jp/sqlite/table/index2.html)
* [コマンドラインツールでSQL文やコマンドの入力方法](http://www.dbonline.jp/sqlite/ini/index1.html)
* [インデックスの作成](http://www.dbonline.jp/sqlite/index/)
* [【cocos2dx】SQLiteを利用したデータ管理(保存、読み込み)](http://albatrus.com/main/cocos2d/6225)
* [Cocos2dx Sqlite3を使ってみる](http://befool.co.jp/blog/raharu/cocos2dx-sqlite-001/)
* [その３ サンプルコードを動かしてみよう](http://marupeke296.com/SQLITE_No3_SampleCode.html)
* [SQLite超入門](http://home.a00.itscom.net/hatada/db/sqlite/sqlite01.html)
* [DBOnline: SQLite入門](http://www.dbonline.jp/sqlite/)
WYSIWYGエディタの調査メモ

WYSIWYGエディタのライセンスや価格を調査したのでメモ。2014年11月11日時点の情報として。

# [CKEditor](http://ckeditor.com/)

* 2003年にリリース開始
* 最新は4.4.5(2014年9月25日)
* FCKeditorから名称変更
* オープンソースライセンスはGPL/LGPL/MPLのトリプルライセンス
    * [GitHub](https://github.com/ckeditor/ckeditor-dev)
* [コマーシャルライセンス $299〜 ](http://cksource.com/ckeditor/buy)
    * アップデートは1年間
    * サポートは1年間
* gemあり(Rails 4、[ckeditor](https://github.com/galetahub/ckeditor))

# [TinyMCE](http://www.tinymce.com/)

* 2004年にリリース開始
* 最新は4.1.6(2014年10月8日)
* オープンソースライセンスはLGPL
    * [GitHub](https://github.com/tinymce/tinymce)
* コマーシャルライセンスあり
    * 価格は不明
    * 問い合わせが必要
* gemあり(Rails 4、[tinymce-rails](https://github.com/spohlenz/tinymce-rails))

# [Redactor Text Editor](http://imperavi.com/redactor/)

* jQueryに依存
* 2009年にリリース開始
* 最新は10.0.4(2014年11月10日)
* オープンソースではなくなった
* [コマーシャルライセンス $99〜 ](http://imperavi.com/redactor/download/) 
    * 30日以内なら返金可能
    * アップデートは永年
    * サポートはライセンス次第（なし〜1年間）
* gemあり(Rails 3.2、[redactor-rails](https://github.com/SammyLin/redactor-rails))

# [Froala WYSISYG Editor](https://editor.froala.com/)

* jQueryに依存
* 2014年にリリース開始
* [CC NC-NDライセンス](http://creativecommons.org/licenses/by-nc-nd/4.0/)
    * [GitHub](https://github.com/froala/wysiwyg-editor)
    * ただし肝心のソースはミニファイされている
* [コマーシャルライセンス $49〜 ](https://editor.froala.com/pricing)
    * アップデートは永年
    * サポートはライセンス次第（なし〜2年間）
* gemあり(公式で対応、[wysiwyg-rails](https://github.com/froala/wysiwyg-rails))

# [Aloha Editor](http://aloha-editor.org/Content.Node/index.html)

* 2.0がアルファ版として開発中
    * [GitHub](https://github.com/alohaeditor/Aloha-Editor/tree/howling-mad)
* 2010年にリリース開始
* オープンソースライセンスはGPL v2以降
* コマーシャルライセンス €99〜
    * アップデートは1年間
* [旧版は1.1.1](http://old.alohaeditor.org/)
    * [GitHub](https://github.com/alohaeditor/Aloha-Editor/) 
gemあり(Rails 4、[Aloha::Rails::Improved](https://github.com/kuraga/aloha-rails-improved))だが、Aloha Editorの0.23.12まで。

# [CLEditor](http://premiumsoftware.net/cleditor/)

* jQueryに依存
* オープンソースライセンスはMIT/GPL v2のデュアルライセンス
* gemあり(Rails 3.1、[Cleditor::Rails](https://github.com/ivannovosad/cleditor-rails)）
RubyからLDAPに接続してみたい(仮)

これまでLDAP周りのスクリプトはPerlで書いていたのですが、なんだかRubyからも触ってみたくなったので、そのメモです。

# 前準備: Rubyのインストール
もちろんOSはFreeBSDです。今回は10.0です。
あれ、Rubyが入っていないということで、まずはRubyのインストール。
一緒にRubyGemsもインストールしておきます。

```
# pkg update
# pkg intall ruby
# pkg install devel/ruby-gems
```

ということで、Ruby2.0がインストールされました。

```
# ruby -v
ruby 2.0.0p576 (2014-09-19 revision 47628) [amd64-freebsd10]
```

# LDAPのためのライブラリ
[Rubyで扱うLDAPのススメ](http://www.slideshare.net/tasheeen/ruby-ldap-5107901)　によると、

* ruby-ldap
* net-ldap
* activeldap

の3種類あるようです。
さてどれがいいのでしょうか?

ruby-ldapがお手軽で、activeldapが真面目(?)という感じでしょうか。

今日はここまで。
[Git] Base Operation

Some memo for the branch operation.

**Delete Remote Branch**

```
git push origin :<branch_name>
```

**Rename Branch**

```
git rename -m <old_name> <new_name>
```

**Change Remote Origin Url**

```
git remote set-url origin <remote-url>
```

**Change commit message**

```
git commit --amend -m "New Message"
```

**Show other branch commit log**

```
git log <other-branch>
```
cocos2d-xでSpriteがアニメーション中かどうかを判別する

これも備忘録代わりに。
（※cocos2d-x v2.x系で記述してます）

## numberOfRunningActions()

```cpp:sample
   CCSprite *sprite = CCSprite::create("hoge.png");
   int animCount = sprite->numberOfRunningActions();

   CCLOG("runnning animation count >> %d", animCount);
   // runnning animation count >> 0

```

アニメーション中（runAction中）であれば、動かしてる分の数値が返ってきます。
何もアニメーションをしていない時は0が返ってくるようになってます。

※サンプルはCCSpriteですが、numberOfRunningActions()自体はCCNodeクラスにいるので、CCNodeを継承しているクラスであれば使用可能です。
iOS8にて画面の向き変更時にレイアウト変更を行う場合

iOS8にて画面の向き変更時にコードにてレイアウト変更を行う場合、該当のViewControllerのviewWillTransitionToSizeに下記の通り実装する。

**※ポイント**
viewWillTransitionToSizeにそのまま実装しても、サイズが不確定の状態の為、位置がおかしくなる。
そのためcoodinatorのanimatealongsideTransition内部でサイズ変更処理を行う必要がある。

```objc
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
	[coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) {
		
		if (size.width <= size.height) {
			// ここで縦レイアウトの位置修正を行う。
		}
		else {
			// ここで横レイアウトの位置修正を行う。
		}

	} completion:nil];
}

```
Erlangのio:formatとio:fwriteに違いはあるか


調べてもあまり出てこないけどErlang使いの中では常識...？

それともあまり気にされないのでしょうか
## 結論

おそらく、ない

## 理由

[erlangcamp](https://groups.google.com/forum/#!forum/erlangcamp:title)での <i>io:fwrite vs. io:format</i> への[回答](https://groups.google.com/d/msg/erlangcamp/W6ZAb4emByU/mh2a2esDlmIJ)によればio.erlの内部でfwriteはformatにそのまま飛ばされていてただのAliasだとか。

### 確かめてみる

```
vim /usr/local/lib/erlang/lib/stdlib-2.2/src/io.erl
```



```erlang
310 fwrite(Format) ->
311     format(Format).

...

317 fwrite(Format, Args) ->
318     format(Format, Args).

...

325 fwrite(Io, Format, Args) ->
326     format(Io, Format, Args).
```

確かに飛ばされてる


formatは

```erlang
355 format(Format) ->
356     format(Format, []).

...

362 format(Format, Args) ->
363     format(default_output(), Format, Args).

...

370 format(Io, Format, Args) ->
371     o_request(Io, {format,Format,Args}, format).
```

ついでにdefault_output()も見てみる。

```erlang
597 default_output() ->
598     group_leader().
```

## 余談

### ではfwriteよりformatのほうが速いのか？

簡単な速度計測をしましたがこの差が有意かは怪しいところ...

試したのは以下の3つ

1. format(group_leader(), format, [args])
*  format(format, [args])
*  fwrite(format, [args])


#### 方法
10万回の出力を100セット、その平均で比較


#### 結果
| io                  |  Result(ms)  |
|:-------------------:|-------------:|
|format gruop_leader()| 987.38       |
|format               | 1004.63      |
|fwrite               | 1010.15      |
Phalcon


[Phalcon](http://docs.phalconphp.com/ja/latest/reference/install.html#linux-solaris-mac)

## インストール

* GitHub からダウンロード

```bash
# git clone git://github.com/phalcon/cphalcon.git /usr/local/src/cphalcon
```

* ビルド / インストール

```bash
# cd /usr/local/src/cphalcon/build
# ./install
```

## モジュール追加

* 以下の内容で /usr/local/phpenv/versions/5.5.18/etc/conf.d/phalcon.ini を作成

```bash
extension=phalcon.so
```

## 設定の再読み込み

* phpenv 反映

```bash
# phpenv rehash
```

* PHP-FPM 再起動

```bash
# service php-fpm restart
```

* 確認

```bash
# php -m | grep phalcon
phalcon
```
PHP-FPM


## インストール

phpenv install で以下にインストールされる。

```bash
# ll /usr/local/phpenv/versions/5.5.18/sbin/
total 37416
-rwxr-xr-x 1 root root 38310629 Nov 11 04:18 php-fpm
```

## 設定ファイル作成

### php-fpm.conf

* 以下の内容で /usr/local/phpenv/versions/5.5.18/etc/php-fpm.conf を作成

```bash
include=etc/fpm.d/*.conf

[global]
pid = run/php-fpm/php-fpm.pid
error_log = log/php-fpm/error.log
```

### www.conf

* 以下の内容で /usr/local/phpenv/versions/5.5.18/etc/fpm.d/www.conf を作成

```bash
[www]
listen = var/run/php-fpm/php-fpm.sock
listen.allowed_clients = 127.0.0.1
listen.owner = nginx
listen.group = nginx
listen.mode = 0660

user = nginx
group = nginx

pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35

access.log = var/log/php-fpm/$pool.access.log
access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%"

slowlog = var/log/php-fpm/www-slow.log

php_value[session.save_handler] = files
php_value[session.save_path] = var/lib/php/session
```

### シンボリックリンク作成

* /var/log/php-fpm

```bash
# cd /usr/local/phpenv/versions/5.5.18/var/log
# mkdir -p /var/log/php-fpm
# ln -s /var/log/php-fpm php-fpm
```

* /var/run/php-fpm

```bash
# cd /usr/local/phpenv/versions/5.5.18/var/run
# mkdir -p /var/run/php-fpm
# chown nginx:nginx /var/run/php-fpm
# ln -s /var/run/php-fpm php-fpm
```

* /var/lib/php/session

```bash
# cd /usr/local/phpenv/versions/5.5.18/var/lib/php
# mkdir -p /var/lib/php/session
# ln -s /var/lib/php/session session
```

## 起動スクリプト作成

* phpenv install 時に /tmp にダウンロードされたソースからコピー。

```bash
# cd /tmp/php-build/source/5.5.18/sapi/fpm/
# cp -ip init.d.php-fpm /etc/init.d/php-fpm
```

* 若干修正

```bash
(変更前)
php_fpm_PID=${prefix}/var/run/php-fpm.pid

(変更後)
php_fpm_PID=${prefix}/var/run/php-fpm/php-fpm.pid
```

* パーミッション設定

```bash
# chmod 755 /etc/init.d/php-fpm
```

## 起動

* サービス登録

```bash
# chkconfig --add php-fpm

# chkconfig --list php-fpm
php-fpm         0:off   1:off   2:on    3:on    4:on    5:on    6:off
```

* サービス起動

```bash
# service php-fpm start
```

* 自動起動設定

```bash
# chkconfig php-fpm on
```
Nginx


## インストール

[Install](http://wiki.nginx.org/Install)

* yum 実行

```bash
# yum install nginx
```

## 設定

* 以下の内容で /etc/nginx/conf.d/phalcon.conf を作成

```bash
server {
    listen 80;
    server_name localhost.dev;

    rewrite_log on;

    index index.php index.html index.htm;
    set $root_path '/var/www/phalcon';
    root $root_path;

    location / {
        try_files $uri $uri/ /index.php;
    }

    location /tutorial/ {
        rewrite ^/tutorial/$ /tutorial/public/ last;
        rewrite ^/tutorial/(.*) /tutorial/public/$1 last;
    }

    location /tutorial/public/ {
        try_files $request_filename $request_filename/ @rewrite;
    }

    location @rewrite {
        rewrite ^/tutorial/public/(.*)$ /tutorial/public/index.php?_url=/$1 last;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param X_FORWARDED_FOR $proxy_add_x_forwarded_for;
        include fastcgi_params;
    }

    location ~* ^/(css|img|js|flv|swf|download)/(.+)$ {
        root $root_path;
    }

    location ~ /\.ht {
        deny all;
    }
}
```

## 起動

* 設定確認

```bash
# service nginx configtest
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
```

* サービス起動

```bash
# service nginx start
```

* 自動起動設定

```bash
# chkconfig nginx on
```
PHP


## 依存パッケージのインストール

```bash
# yum install re2c bison-devel libxml2-devel openssl-devel libcurl-devel libjpeg-devel libpng-devel libmcrypt-devel readline-devel libtidy-devel libxslt-devel
```

## PHP のインストール

* 以下のコマンドでインストール可能な PHP バージョンを確認

```bash
$ phpenv install --releases
```

* 任意の PHP バージョンをインストール

```bash
# phpenv install 5.5.18
```

* インストールした PHP を有効化

```bash
# phpenv global 5.5.18
# phpenv rehash
# php -v
PHP 5.5.18 (cli) (built: Nov 11 2014 12:01:59)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
    with Zend OPcache v7.0.4-dev, Copyright (c) 1999-2014, by Zend Technologies
    with Xdebug v2.2.5, Copyright (c) 2002-2014, by Derick Rethans
```

## PHP の設定変更

* php.ini のバックアップ

```bash
# cd /usr/local/phpenv/versions/5.5.18/etc
# cp -ip php.ini php.ini.org
```

* タイムゾーン設定

```bash
(変更前)
;date.timezone =

(変更後)
date.timezone = Asia/Tokyo
```

* HTTP ヘッダ出力の抑制

```bash
(変更前)
expose_php = On

(変更後)
expose_php = Off
```

* 文字コード設定

```bash
(変更前)
;mbstring.language = Japanese
;default_charset = "UTF-8"

(変更後)
mbstring.language = Japanese
default_charset = "UTF-8"
```

* 設定の有効化

```bash
# phpenv global 5.5.18
# phpenv rehash
```
phpenv


## phpenv のインストール

[CHH/phpenv](https://github.com/CHH/phpenv)

* GitHub から phpenv をクローン

```bash
# git clone https://github.com/CHH/phpenv /usr/local/src/phpenv
```

* phpenv-install.sh を実行

```bash
# cd /usr/local/src/phpenv/bin
# PHPENV_ROOT=/usr/local/phpenv ./phpenv-install.sh
```

* 以下の内容で /etc/profile.d/phpenv.sh を作成

```bash
export PHPENV_ROOT="/usr/local/phpenv"
export PATH="$PHPENV_ROOT/bin:$PATH"
eval "$(phpenv init -)"
```

* phpenv.sh 読み込み

```bash
# source /etc/profile.d/phpenv.sh
# which phpenv
/usr/local/phpenv/bin/phpenv
```


## php-build のインストール

[CHH/php-build](https://github.com/CHH/php-build)

* GitHub から php-build をクローン

```bash
$ sudo git clone https://github.com/CHH/php-build /usr/local/phpenv/plugins/php-build
```
MySQL


## インストール

* yum install 実行

```bash
# yum --enablerepo=remi install mysql-server
```


## 設定変更

* /etc/my.cnf をバックアップ

```bash
# cp -ip /etc/my.cnf /etc/my.cnf.org
```

* 文字コード設定

```bash
[mysqld]
character-set-server=utf8

[client]
default-character-set=utf8

[mysqldump]
default-character-set=utf8

[mysql]
default-character-set=utf8
```

## 初期化

* mysql_secure_installation 実行

```bash
[root@test01 etc]# mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!


In order to log into MySQL to secure it, we'll need the current
password for the root user.  If you've just installed MySQL, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.

Set root password? [Y/n] Y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MySQL installation has an anonymous user, allowing anyone
to log into MySQL without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] Y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] Y
 ... Success!

By default, MySQL comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] Y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] Y
 ... Success!

Cleaning up...



All done!  If you've completed all of the above steps, your MySQL
installation should now be secure.

Thanks for using MySQL!
```

## コマンド

### データベース作成

* testdb データベースを作成する場合

```sql
CREATE DATABASE testdb;
```

### ユーザ作成

* ユーザ名: testuser
* パスワード: testpass
* アクセス範囲: testdb データベース内の全てのテーブル
* アクセス権: 全ての権限
* アクセス元: ローカルのみ許可

```sql
GRANT ALL ON testdb.* TO `testuser`@`localhost` IDENTIFIED BY 'testpass';
```

### ユーザパスワード変更

```sql
SET PASSWORD FOR `testuser`@`localhost` = PASSWORD('newtestpass');
```
CoffeeScriptでAngularJS

CoffeeScriptにもAngularJSにも慣れなかったので戸惑いまくり。

こちらに助けてもらいながら少しずつチュートリアル。
http://alxhill.com/blog/articles/angular-coffeescript/


これが

```javascript:service.js
var phonecatServices = angular.module('phonecatServices', ['ngResource']);

phonecatServices.factory('Phone', ['$resource',
  function($resource){
    return $resource('phones/:phoneId.json', {}, {
      query: {method:'GET', params:{phoneId:'phones'}, isArray:true}
    });
  }]);
```

こうなる

```coffeescript:service.coffee
phonecatServices = angular.module 'phonecatServices', ['ngResource']

phonecatServices.factory 'Phone', [
  '$resource'
  ($resource) ->
    $resource 'phones/:phoneId.json', {},
       query:
         method: 'GET'
         params:
           phoneId: 'phones'
         isArray: true
  ]
```

んだけど、なんかあんまりCoffeeScriptっぽくないのは最後の`]`のせいか？

あと、CoffeeScript関係ないけどAngularJS-Atomのプラグインがシンタックスハイライトしてくれないので書きづらい。
https://github.com/angular-ui/AngularJS-Atom/issues/13
とのことなので、お行儀よく待ちます。感謝。

しかしAtomまだまだ使いづらくて、Sublime Text3の方がまだ使いやすいんだけど、Rails界隈の人が乗り換えているということなので、Emacsからの移行先難民としては、Angluarでは使い続けたいところです。
 
 
追記：なお、このあと[TypeError: 'undefined' is not a function (evaluating 'jasmine.addMatchers')](https://github.com/velesin/jasmine-jquery/issues/168)
にひっかかりました。(練習ではyeoman使ってたから…）