OmniAICreator/Qiita-1.07M huggingface dataset:
JenkinsでStyleDoccoを使い、スタイルガイドを作成する


# まえおき
RailsのプロジェクトでそろそろCSSのスタイルガイド欲しいっすねという話をしていた時にとある人にStyleDoccoを勧められたので。

RailsだとKSSとかありますが、自前でview書くのもなぁと思い、とりあえずStyleDoccoにしました。

ローカルでgrunt watchして結果を見るのは割りと簡単なんですが、せっかくJenkinsでCIしているので、Jenkinsで結果が見れるといい感じになると思い実験したのでその結果です。

# 参考url
[『STYLEDOCCO』でCSSプリプロセッサのスタイルガイド作成](http://toybox-design.net/?p=640)

[コーディングの必須ツールになりそう。ステキなCSSスタイルガイドを生成する｢styleDocco｣の導入とgrunt.jsでの自動化のメモ](http://mnemoniqs.com/web/styledocco/)

# 環境構築
## Jenkinsサーバ
### npm, grunt-cliをjenkinsが実行できるようにしておく

# gruntでStyleDoccoを使ったスタイルガイド作成タスクを設定する

## ディレクトリ構成
プロジェクトの適当なところにディレクトリを掘って、

* Gruntfile.js
* package.json

を置く

### Gruntfile.js

```javascript
module.exports = function(grunt){

  grunt.loadNpmTasks('grunt-styleguide');
  grunt.loadNpmTasks('grunt-contrib-clean');
  grunt.loadNpmTasks('grunt-contrib-watch');

  grunt.initConfig({
    styleguide: {
      dist: {
        name: 'Style Guide',
        options: {
          framework: {
            name: 'styledocco',
            options: {
              'no-minify': true,
              preprocessor: 'bundle exec sass'
            }
          }
        },
        files: {
          // 解析対象のscssファイルが置いてあるディレクトリを設定
          'docs': '../../app/assets/stylesheets/*css.scss'
        }
      }
    },
    clean: ['docs'],
    watch: {
        files: ['../../app/assets/stylesheets/*.scss'],
        tasks: 'styleguide'
    }
  });

  grunt.registerTask('default', [
    'clean',
    'styleguide',
  ]);
};
```

### package.json

$ npm -save-dev等で適当に作られる感じ。

```javascript
{
  "name": "styledocco",
  "version": "1.0.0",
  "description": "styledocco",
  "author": "@author",
  "devDependencies": {
    "grunt": "^0.4.5",
    "grunt-contrib-clean": "~0.5.0",
    "grunt-contrib-watch": "^0.6.1",
    "grunt-styleguide": "~0.2.6",
    "styledocco": "~0.6.3"
  }
}
```

## ローカルで実験
```
$ npm install
$ grunt
```
docs配下にhtmlがcssのファイル分作られるので、その中のindex.htmlを見る。素晴らしい。

上のGruntfileにはwatchタスクを設定しているので、grunt watchすれば、対象のcssディレクトリ内で変更があるたびにhtmlを作りなおしてくれる。

# Jenkinsでジョブを作成

## の前にプラグインを追加

[html publisher plugin](https://wiki.jenkins-ci.org/display/JENKINS/HTML+Publisher+Plugin)

これを使うとjenkinsの画面でhtmlファイルを指定してあげると見ることが出来るようになる。素晴らしい。

## ジョブ作成
* gitプラグインなりなんなりで対象ソースを取得したあと、シェルでnpm installし、gruntを実行する。

* ビルド後の処理で「publish html reports」を選択
* gruntで作成するdocs配下のindex.htmlをindex pageに設定する

![スクリーンショット 2014-10-10 13.50.48.png](https://qiita-image-store.s3.amazonaws.com/0/9186/b0190bc0-d595-b770-793a-aadde516b1a9.png "スクリーンショット 2014-10-10 13.50.48.png")

# 実行結果を見る
![スクリーンショット 2014-10-10 13.51.52.png](https://qiita-image-store.s3.amazonaws.com/0/9186/fce4a388-5f3c-b058-8cf8-dccbed194bba.png "スクリーンショット 2014-10-10 13.51.52.png")

Style guide(上記Report title)が出ているのでそれをクリックするとガイドが読める。素晴らしい。
[c++,boost] Eric Niebler's range 3.0の基本設計思想

# 概要
Boost Range 2.0の作者であるEric Nieblerが range 3.0を継続的に[開発している](https://github.com/ericniebler/range-v3)(github)。
Ericによるとrange3.0はC++標準規格入りを目指している。

[最近の彼のブログポスト](http://ericniebler.com/2014/10/06/counted-ranges-and-efficiency/)によると、Range3.0に大きな変更が入ったらしいので、この機に解説してみる。

ほとんどの内容は彼のブログポストとgithub内のドキュメント、特に[C++標準規格へのプロポーザル](https://github.com/ericniebler/range-v3/blob/master/doc/D4128.md)に依っている。

# Rangeの基本設計思想

EricはRangeをC++用に設計するに当たって、いくつかの例、特にD言語のRangeに注目し、その改善すべき点を見いだした。

D言語の最も簡単なRangeは基本的には次のメンバ関数から成る。
front()
empty()
pop()
それぞれの意味は推して図るべし。

重要な事は、D言語のRangeは要素の取り出しやRange範囲の操作はできるが、Rangeの"場所"を参照できない。
Ericは、上に述べた理由から、D言語のRangeはいくつかのアルゴリズムの計算オーダーが大きくなってしまっていると述べている([参照](https://github.com/ericniebler/range-v3/blob/master/doc/D4128.md#ds-ranges))。
そのために、D言語のRangeを使ってC++のIteratorを同じ計算量を保ったまま実装する事は出来ないとしている（逆はできる）。

以上に述べた理由から、EricはRangeに"場所"の情報を持たせるべきだとした。
現在までのC++について考えると、最も簡単で、後方互換性のあるRangeの作り方はIteratorのbegin/endペアをRangeとする事である。
実際、Boost Range2.0ではネイティブにRangeを作る方法が無い場合はboost::make_iterator_rangeを使ってRangeを作っている。

また、他のRangeの実装として、beginとRangeのサイズのペアや、beginとRangeが空である事を判定するPredicateのペア等があり得る。
Ericはこれらの実装も含めて抽象化すべきだと判断した。
理由はその方が速いコンテナ(Ericはdeque等を挙げている)があるためだ。
また、その様な抽象化したレイヤーでアルゴリズムを実装しても、パフォーマンスが劣化しない事をEricは[確認している](https://github.com/ericniebler/range-v3/blob/master/doc/D4128.md#appendix-4-on-counted-ranges-and-efficiency)。

この様な"場所"の情報を持ったRangeの抽象化のために、Ericはbegin/endのIterator/Iterator対の代わりに、Iterator/Sentinel対という考え方を持ち出した。
この考え方の元では、例えば従来のIteratorのbegin/endペアによるRangeの実装は
Iterator = 従来のIterator
Sentinel = 従来のIterator
となり、beginとRangeのサイズのペアでは
Iterator = 従来のIterator + カウンターのラッパー
Sentinel = 空
となる。

まとめ
Rangeは"場所"の情報も持つ。
Iterator/Sentinel対で実装する。
コード書かない人をエンカレッジするには

# install

```
$ npm install -g git-today
```

# usage


-a でauthor 
-t で時間を指定

```
$ git-today -a yamazaki -t "30 days"

Git stats for last 30 days in ./:
  1001 files modified
  30033 line insertions
  10011 line deletions
 =======================
  20022 net lines
```
こんな感じになります。
働きぶりをみんなで共有しましょう。

https://github.com/rschmukler/git-today
他にもいろいろオプションがあるようです。
気になるマイクロサービスとSOA関連URL

気になるマイクロサービスとSOA関連URL
====

なんか「マイクロサービス」っていう言葉が気になったので関連URLリンク集を作ってみた。

FAQは「それ昔聞いたSOAじゃないの? SOAとの違いは?」でしょうか。

![microservice-diagram.png](https://qiita-image-store.s3.amazonaws.com/0/16128/1ca75881-8f7a-87a8-02ec-b82dc8ada1e9.png)

----------------------------------------------------------------------

マイクロサービス化が進む背景について考えてみた - Gist
  https://gist.github.com/everpeace/c40b69eff6636b9ec2f9

LINEのマイクロサービス環境における分散トレーシング - LINE
  http://developers.linecorp.com/blog/ja/?p=3392

"Microservices"を読んだ - SOTA
  http://deeeet.com/writing/2014/09/10/microservices/

microservicesに分割する際に注意するべき5つのこと - Qiita
  http://qiita.com/hirokidaichi/items/bf81f1f6f7ca3d694aae

マイクロサービスを10分で作る-郵便番号検索サービス-Apache Camel (Java) - Qiita
  http://qiita.com/daikuro/items/4403d62adbf008e15aa2

RubyKaigi 2014の知見。 Microservices について #rubykaigi - Qiita
  http://qiita.com/tbpgr/items/d7ecc21266d7ee9d6971

----------------------------------------------------------------------

You マイクロサービスを作ればいいじゃん (Java)
  http://blog.kodamatic.com/archives/1120

Dockerから透かしてみるマイクロサービスな未来 (Java)
  http://blog.kodamatic.com/archives/1212

----------------------------------------------------------------------

クックパッドとマイクロサービス (Ruby)
  http://techlife.cookpad.com/entry/2014/09/08/093000

“マイクロサービス化”で変化に耐えられる組織を目指す--クックパッド舘野CTO (Ruby)
  http://japan.zdnet.com/cio/sp_12executive/35052867/

----------------------------------------------------------------------

マーチン・ファウラー氏による「マイクロサービスの前提条件」
  http://www.publickey1.jp/blog/14/post_246.html

マイクロサービス設計概論 - InfoQ
  http://www.infoq.com/jp/news/2014/06/introducing-microservices

マイクロサービスとSOA (Microservices and SOA)
  https://gist.github.com/matarillo/a3fe1ba60e36e9e2827c

マイクロサービスとSOA - 猫とC#について書くmatarilloの雑記
  http://d.hatena.ne.jp/matarillo/20140908/p1

----------------------------------------------------------------------
英語で何だったっけ？再現方法、根本原因、回避策、、、

問題解決のプロセスの各フェーズにおいて、英語で状況を説明する必要がある場合に、よく使う英単語/熟語をまとめました。

以下のような場合に役に立つと思います。

* JIRAなどの課題管理システムにバグを登録するとき
* ソースコードをレビューしてもらうとき(パッチの概要説明のとき)

|日本語|英語|補足説明|
----|----|----
|バグ修正|bug fix||
|問題|problem|またはissue。解決すべき問題がproblemで、議論すべき課題がissueといった差異があるようです。既知の問題：known issue、未知の問題：unknown issue|
|脆弱性|vulnerability||
|新機能|new feature|またはadditional functionなど。featureもfunctionも機能を意味しますが、前者は特徴を表し、後者は能力を表すようです(ものすごく大雑把に言うと...)。|
|改良|improvement|またはenhancement。enhanceは質を高める、improveは改善する。|
|未解決|unresolved||
|作業中|in progress||
|不具合ではない|not a defect||
|重複|duplicate|JIRAに同じ問題があったら、Closed this as a duplicate of #XXX.などとコメントしてクローズできます。|
|仕様通り|by design / working as intended||
|優先度|priority|優先度の例： trivial(軽微) < minor(比較的重要でない) < major(比較的重要) < critical(致命的) < blocker(業務に支障をきたす)|
|影響するバージョン|affects version|修正するバージョンはfix version。|
|バックポート|backport|下位バージョンなどに修正を反映することをバックポートと言います|
|互換性|compatibility|下位互換性はbackward compatibility|
|担当者|assignee|(バグ修正などの)担当者はassignee、報告者はreporter|
|環境|environment|本番環境はproduction environment|
|概要|overview|他にはsummaryやoutlineなども使われます。|
|再現手順|steps to reproduce|またはreproduction scenario。再現しない場合はcannot reproduce...。reproduceではなく、replicateも使われる|
|結果|result|またはoutcome。予想される結果：expected result、実際の結果：actual resultなど。テストの結果問題なければpass。問題ありの場合はfail。NGは和製英語なので、多分通じません。|
|調査|investigation|不具合を直す前に要因を事前調査するときなど。I will investigate this issue とか I'm looking into it とか、「調べておきます」という感じ。|
|分析|analysis||
|原因|cause|根本原因：root cause、直接的原因：direct causeなど|
|タイプミス|typo||
|ドキュメントの誤り|documentation bug|またはdocumentation error。内容が不正であればincorrect、曖昧であればmisleadingなどを使うことが多いように思います。|
|設計誤り|design error||
|設定誤り|misconfiguration||
|回避策|workaround|とりあえず対応というニュアンスが強いようです。worked aroundのように動詞でも使えます。|
|対策|solution|代替案：alternative solution、暫定対策：temporary solution、恒久対策：permanent solutionなど|
|メリット/デメリット|advantage/disadvantage|日本語の「メリット」を意味する英語は、meritよりもadvantageが適しているようです。|
|デグレード|regression|日本では修正により新たなバグをつくり込むことをデグレード(degrade)といいますが、海外の人はリグレッション(regression)という単語を使うことが多いように思います。|
|副作用|side effect||
|予想される影響|expected impact||
|可読性|readability|ソースコードの可読性は、readability of the source code。|
|添付ファイル|attached file|「添付ファイルを参照。」は、Refer to the attached file.|
|参照|see also|「詳細はこのページを参照。http://・・・」は、See also this page for more information. http://・・・|
|補足情報|additional information||

この他にも追加した方がいい単語や、「より一般的な表現はこれだ」というようなご意見がありましたら、コメント下さい。

JIRAなどの課題管理システムにバグを登録する上での注意事項は、以前私のブログにまとめました。こちらも参考にして下さい。

[OSSを使ってみよう ～ (3) 課題管理システムにバグを登録する](http://t246osslab.wordpress.com/2014/10/05/oss%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86-%EF%BD%9E-3-%E8%AA%B2%E9%A1%8C%E7%AE%A1%E7%90%86%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AB%E3%83%90%E3%82%B0%E3%82%92%E7%99%BB)
関数宣言と関数式の違い


所謂、

```javascript
//関数宣言
function hoge {}
//関数式
var hoge = function{}
```

の違い。
「関数と、変数にいれる関数ってなにが違うの？」という問の解。


##関数の巻き上げがあるかどうかの違い
関数宣言の場合、関数の巻き上げにより
関数宣言前でも実行ができるが、
関数式の場合は変数のみが巻き上げられるため関数式以降でないと実行できない。

```javascript
function someFunc(){
	foo(); // -> foo :関数宣言前でも実行可
	bar(); // -> TypeError: undefined is not a function :実行不可	
	
	function foo(){
		console.log('foo');
	}
	
	var bar = function(){
		console.log('bar');
	};
	
	bar(); // -> bar :関数式後なので実行可
}
	
someFunc();
```



###巻き上げとは
関数内のどの場所で変数を定義しても、それらはその関数の先頭で宣言されたのと同じように動作すること。
関数の場合は宣言だけでなくその定義も巻き上げられる。
neobundle#rc()がdeprecated functionになる時の対処法

Vim起動時に下記のエラーが出るようになった。

```bash
[neobundle] neobundle#rc() is deprecated function.
[neobundle] It is removed in the next version.
```
どうやらNeoBundleの初期化関数が変更になったようなので、.vimrcを下記のように変更。

```
call neobundle#rc(expand('~/.vim/bundle/'))
```
↓

```
call neobundle#begin(expand('~/.vim/bundle/'))
NeoBundleFetch 'Shougo/neobundle.vim'
call neobundle#end()
```

- 上記はエラー箇所のみなので、vimrcに記述する内容全体を見たい場合はGitHubのREADMEを参照  
https://github.com/Shougo/neobundle.vim
【CakePHP】Sessionコンポーネント

セッション管理には、SessionComponentを使用する。

##定義
コンポーネントなので定義が必要だけど、AppControllerへデフォルトで設定されている。

```php
public $components = array(
  'Session',
);
```

##基本編
セッションはキーと値で管理される。
値には配列やオブジェクトを設定することも可能。

```php
//セッションに値を設定する
$this->Session->write('key','value');

//値を取得する
$key = $this->Session->read('key');

//値を削除する
$this->Session->delete('key');
```


##まとめて設定する
まとめて設定することもできる。

```php
//まとめてセッションに値を設定する
$this->Session->write(array(
  'key1'=>'value1',
  'key2'=>'value2',
));
```


##グループ化する
「.」を使ってキーをグループ化することが可能。

```php
//グループでセッションに値を設定する
$this->Session->write('Group.key1','value1');
$this->Session->write('Group.key2','value2');

//グループごと取得する
$group = $this->Session->write('Group','value');
var_dump($group);
/*
*array(
*  'key1'=>'value1',
*  'key2'=>'value2',
*)
*/

//もちろん個別でも可能
$group = $this->Session->write('Group.key1','value');
```
[Rails 4.x] DB(MySQL, Postgres, SQLite3) に配列を挿入する

seed_fuを利用して、データをDBに入れたいのですが、配列データを挿入したくなりました。

Hogeというテーブルのchildrenというカラムに配列をいれたいという感じです。

# DBのカラムのデータ型をtextにする

マイグレーションファイルをいじります。

```rb:db/migrate/*_create_hoge.rb
class CreateHoge < ActiveRecord::Migration
  def change
    create_table :hoge do |t|
      t.text :children
 
      t.timestamps
    end
  end
end
```

# モデルで serialize を設定

配列を挿入したいカラム（属性）にserializeメソッドを適応させる用に設定する。

```rb:app/models/hoge.rb
class Hoge < ActiveRecord::Base
  serialize :children
end
```

# 参考

http://easyramble.com/rails-active-record-serialize.html

# 余談


## seed_fuで入れる

私はseedデータを入れるのが目的だったので、入れてみました。

```rb:db/fixtures/hoges.rb
Hoge.seed do |s|
  s.id    = 1
  s.children = [1,2] # 1,2 と書いても配列が入りました（このへんはまだ曖昧です...）
```

```rb
rake db:seed_fu
```
トライアル版EvoStream Media Serverのインストール

業務の都合で動画配信サーバEvoStream Media Serverを軽く技術調査をしてみました。まずトライアル版のインストール方法をまとめました。

#EvoStream Media Serverとは
C/C++で開発したマルチプロトコールを対応できるメディア配信サーバ。

#EvoStream Media Serverの特徴
* C/C++で作ったため直接ネイティブのIOを呼び出せる、軽い、早い
* VODとLIVE可能、RTSP、RTMP、MSS、HDS、HLS対応（とホームページに書いてある）
* サーバ管理APIを公開しているため、telnetやHTTPでサーバ制御可能

#トライアル版のインストール
###1.インストーラとライセンスキーの入手方法
下記URLに情報を入力して申し込んだら、キーとインストーラのURLをメールでもらえます。
https://evostream.com/free-trial/
####注意事項：
1. インストーラはオンライン版とオフライン版がある、オンライン版の場合はインターネット接続できる環境にしなければいけません。
（※外部に接続できない環境にオンライン版を入れましたが、５分ごとサーバ落ちる、大失敗でした。）
2. Linux版のインストーラはApacheサーバを同梱していないため、HLSなどのHTTP系プロトコール配信をしたい場合別途で自分でHTTPサーバを配信する必要があります。Apacheサーバと同梱してインストールする方法は後述。

###2.インストール
* Windows
    * インストーラアーカイブを解凍する
    * ライセンスキーファイルを解凍先のconfの下にコピー
* Ubuntu
    * インストーラアーカイブ経由
        * アーカイブを解凍する
        * ライセンスキーファイルを解凍先のbinの下にコピー
    * apt-get経由でインストール
        * 事前準備（ステップ2、3は一回のみ）
            1. sudo su- かsu- で管理権限をとる
            2. wget http://apt.evostream.com/installkeys.sh -O /tmp/installkeys.sh インストール用リポジトリを登録用シェルをダウンロード
            3. ステップ2でダウンロードしたシェルを実行
        * インストール
            * apt-get install evostream-mediaserver
        * ライセンスキーファイルのインストール
            * cp /path/to/License.lic /etc/evostream/License.lic

# サーバを実行してみる
* windows
    * run_console_ems.batを実行
* Ubuntu
    * アーカイブ版
        * コンソール実行
            + ./run_console_ems.sh
        * デモ実行
            * ./run_daemon_ems.sh
    * apt-get経由のインストール版
        * 通常のサービス起動
            * service evostreamms start
        * ログ出力付き起動
            * service evostreamms start_console

# その他
ライセンスを申し込んだ後、EvoStreamの営業さんから何回かメール（英語）を飛んできます。利用状況やアドバイスなどを尋ねることがあります。英語得意な方は直接メールでやり取りしてサポートを受けることも可能です。
Wordpressで会員制サイトを構築してみよう（エラーテキスト、バリデーションの変更）


[ユーザー項目の変更 その2](http://qiita.com/hiroki_y/items/2e8a0d36c2e0c8f819fd)までで、とりあえず登録/ログイン/プロフィールの変更までできました。
今回は、細かな問題点を調整していきます。

##元記事
下記エントリの転載になります。
[WordPressで会員制サイトを構築してみよう（エラーテキスト、バリデーションの追加）](http://www.rokurofire.info/2014/10/09/wp_membership4/)

##エラーメッセージの調整

会員登録ページで何も入力せずに登録ボタンを押すと、下記のようなメッセージが表示されます。

![register5-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/10172/bc7e98bf-f484-2dee-c359-e1d797be6a2a.jpeg "register5-1.jpg")

本サイトでは「ユーザー名」を利用していないのですが、仕様上このメッセージが返るため、調整する必要があります。
また、何度も「エラー」と表示されるのは少しうるさいので、それも消してみます。

```functions.php
function my_user_register_valid($errors) {
	$rep1 = array();
	$rep2 = array();

	/* エラー表記を消す例 */
	array_push($rep1, "<strong>エラー</strong>: ");
	array_push($rep2, "");
	array_push($rep1, "<strong>ERROR</strong>: ");
	array_push($rep2, "");

	/* 英語表記を変更する例 */
	array_push($rep1, "Please enter your password twice.");
	array_push($rep2, "パスワードを2回入力してください。");
	array_push($rep1, "Please enter the same password in the two password fields.");
	array_push($rep2, "パスワードは同じものを2回入力してください");

	/* ユーザー名という表記を消す例 */
	array_push($rep1, "メールアドレスを入力してください。");
	array_push($rep2, '<span class="deletedmsg"></span>');
	array_push($rep1, "ユーザー名");
	array_push($rep2, "メールアドレス");

	$custom_error = new WP_Error();
	foreach ( $errors -> errors as $key => $val ) {
		$tmp = str_replace($rep1,$rep2,$val[0]);
		$custom_error -> add($key, $tmp);
	}
	return $custom_error;
}
add_filter( 'registration_errors', 'my_user_register_valid', 10 );
```

```style.css
.deletedmsg + br,
.deletedmsg {display:none;}
```

内容は、arrayに格納したテキストを置換しているだけです。
途中で "deletedmsg" というclass名を付けたHTMLを出力していますが、不要な空白が出力されてしまうのを、CSSで消しています。
※ バージョンによってもエラーの内容は変わる可能性がありますので、この部分は都度変更する必要があると思います
（この部分は **[つながるねっと](http://yahss.net/wordpress/765-registration-form2-with-theme-my-login/#tml04)さん** を参考にしています）

##プロフィール項目のバリデーション

プロフィールの項目に文字数/種の制限を設けてみます。
下記は、苗字（last_name）の最大文字数を50文字にし、「'」「"」を入力できないようにしています。

```functions.php
function my_user_update_valid($errors, $update = null, $user = null) {
	/* 最大文字数 */
	$maxlength = 50;

	if(!is_admin()) {
		/* last_nameに使用できない文字を指定 */
		if ( preg_match('/[\'\"]/', $_POST['last_name']) ) {
			$errors->add('empty_last_name', '苗字に「\'」「"」は利用できません');
		} elseif (mb_strlen($_POST['last_name'], "UTF-8") > $maxlength ) {
			$errors->add('empty_last_name', '苗字は' . $maxlength . '文字以内でご入力下さい');
		}
	}
	return $errors;
}
add_action( 'user_profile_update_errors', 'my_user_update_valid', 10 );
```

各ユーザー項目に対して記述を増やしていけばOKです。
また、adminユーザー（管理者）のアカウントを作成するときには除外されるようになっています。


##参考
下記サイト様を参考にさせていただきました。

* **[つながるねっと](http://yahss.net/wordpress/765-registration-form2-with-theme-my-login/)さん**
Wordpressで会員制サイトを構築してみよう 事前準備


Wordpressで会員制サイトを作ることが増えてきました。
今回は定番のプラグイン "Theme My Login" を利用して、下記の機能の実装方法をまとめてみます。

##元記事
下記エントリの転載になります。
[WordPressで会員制サイトを構築してみよう（事前準備）](http://www.rokurofire.info/2014/10/08/wp_membership1/)

##機能（仕様）
* メールアドレスとパスワードで会員登録/ログイン<br>（ユーザー名は入力させない）
* メールアドレスの認証
* 登録ユーザーは、自分のプロフィール/メールアドレス/パスワードの変更が可能
* パスワード紛失時に再設定が可能

##利用プラグイン
下記プラグインをインストールします。

* **[Theme My Login](https://wordpress.org/plugins/theme-my-login/)**<br>会員登録/ログイン/プロフィールページの機能

##前準備
###WordPressの設定

ユーザーが会員登録できるよう、WordPressの設定をします。

* 管理画面「設定」→「一般」内の「だれでもユーザー登録ができるようにする」にチェック
* 「新規ユーザーのデフォルト権限グループ」を「購読者」に設定

権限グループについては、用途によって変更してください。
（サイトの閲覧のみをさせたい場合は「購読者」です）

###Theme My Loginのテンプレートファイルをコピー

wp-content/plugins/theme-my-login/templates 内にあるファイルで、必要なものを自分のテーマファイル内にコピーします。
コピーしたファイルを変更することで、登録/ログインフォームの見た目や項目を変更することが出来ます。

* **register-form.php** <br>（会員登録フォーム）
* **login-form.php**<br>（ログインフォーム）
* **profile-form.php**<br>（ユーザーのプロフィール編集フォーム）
* **lostpassword-form.php**<br>（パスワード紛失時、新しいパスワード発行用のメールアドレス入力フォーム）
* **resetpass-form.php**<br>（新しいパスワード再発行フォーム）

###Theme My Loginの設定

管理画面「TML」で各種設定を行います。

####「General」タブ

* 「Enable e-mail address login」にチェック
* 「Enable AJAX」にチェック
* 「Enable Custom E-mail」にチェック
* 「Enable Custom Passwords」にチェック
* 「Enable Security」にチェック
* 「Enable Themed Profiles」にチェック
* 「Enable User Moderation」にチェック

上記にチェックを入れて保存すると、管理画面の左側に下記の項目が増えます。

####「E-mail」タブ（Custom E-mail）

会員登録時の自動返信メール文言を任意に設定できます。

**「New User」**・・・登録完了時
**「Retrieve Password」**・・・パスワード再設定の申請時（パスワード再設定用のURLが書かれています）
**「Reset Password」**・・・パスワード再設定完了時
**「User Activation」**・・・新規登録時（メールアドレス認証用のURLが書かれています）


####「Themed Profiles」タブ（Enable Themed Profiles）
**「Themed Profiles」**・・・ユーザーのプロフィール画面を、管理画面ではなくテーマファイルのテンプレートで表示する権限を設定します。
今回は「Subscriber（購読者）」にチェックします。

**「Restrict Admin Access」**・・・管理画面へのユーザーの制限を行います。同様に「Subscriber（購読者）」にチェックします。

####「Moderation」タブ（Enable User Moderation）
E-mail Confirmation にチェックを入れます。
新規登録時に、メールアドレス認証用のメールが自動で送信されるようになります。

###固定ページの作成
Theme My Loginを有効化すると、下記の固定ページが自動で作成されますので、確認しておきます。

* /login（ログイン）
* /register（登録）
* /resetpass（パスワードをリセット）
* /lostpassword（パスワード紛失）
* /あなたのプロフィール（プロフィールページ）
* /logout?*********（ログアウト）

プロフィールページのみ、URLが日本語に設定されているため、
/あなたのプロフィール → /profile のようにお好みでslugを変更しておきます。

また、各固定ページの本文に自動で書かれているショートコード **[theme-my-login]** は、先ほどコピーしたTheme My Loginのテンプレートを呼び出すためのものです。
→ **/register ページの場合、register-form.php の内容を出力するようになっています。**


とりあえずこれで準備は完了です。

##会員登録が出来るか試す

/register にアクセスすると、自動的に↓のような画面になっています。

![register1.jpg](https://qiita-image-store.s3.amazonaws.com/0/10172/9d805891-99c5-b8ab-3a4e-8b8106b1cc3f.jpeg "register1.jpg")

ユーザー名、メールアドレス、パスワードを設定すると、設定したメールアドレスに認証用メールが送信されます。そのURLをクリックすると、認証が完了です。

![register2.jpg](https://qiita-image-store.s3.amazonaws.com/0/10172/28638b7c-6b14-1ae4-cb91-cea36d77b929.jpeg "register2.jpg")

とりあえずこれだけで、会員登録が可能になります。簡単すぎますね。

![register3.jpg](https://qiita-image-store.s3.amazonaws.com/0/10172/f7417ad4-9b8d-ce3f-1f86-cc02a687dec9.jpeg "register3.jpg")


ログインするとプロフィール画面も作成されています。
とりあえずここまでで、簡単に登録機能が追加できました。

次回、ユーザーの登録項目をカスタマイズしてみます。
PHPでスロットリング処理！！

https://github.com/davedevelopment/stiphle

composer.jpn
<pre>
{
   "require" : {
        "davedevelopment/stiphle": "dev-master"
    },
    "autoload" : {
        "psr-0" : {"nameko" : "lib"}
    }
}
</pre>

テストコードそのままですが
１秒間に２回処理を実行みたいなスリープの調整してくれます
使う場面では便利ですね

```php:test.php
<?php
require_once __DIR__ . '/../vendor/autoload.php';

$throttle = new Stiphle\Throttle\LeakyBucket;
$identifier = 'dave';
while(true) {
    echo '処理するよ';
    $throttle->throttle($identifier,2, 1000);
}
```
JAVA○年目で無意識に使ってるEclipseショートカット10選

###普段無意識に使ってるやつを書き出してみた

なるべくこれ↓とかぶらないやつのみ掲載
[新人研修でドヤ顔で披露したらウケたEclipseのショートカット集](http://qiita.com/arai-wa/items/c2eb7387b5bf37b4ace4)

※注：しょぼい

- ctrl + j（インクメンタル検索）からの
- ctrl + k（次を探す）
- ctrl + o（クイックアウトライン）
- ctrl + 1（クイックフィックス）
- ctrl + shift + r（リソースを開く）
- ctrl + shift + p（対応するカッコへ）
- ctrl + shift + Up or Down（メンバ間移動）
- ctrl + alt + u（リポジトリから更新）
- alt + Up or Down（ソースの移動）
- alt + shift + j（javadoc作成）

# ちなみに

- ctrl + shift + l 
 
でショートカット一覧表示

# ショートカットじゃないけど
foreって打つ -> ctrl + space -> Enter でコレクションループのテンプレート作成

# 追記１

あとあれだ、

- ctrl + l（指定行へジャンプ）

# 追記２

デバッグ時に

- ctrl + shift + i（インスペクション）

をよく使っているのに気づいた。
Goまとめ

# 言語の特徴

- 最小限の構文 
while文やdo/whileはサポートされない

- 危険の回避
ポインタ演算禁止
配列の値コピー

- 例外の排除
try/catch構文がない
→関数の戻り値でエラーハンドラを返す

- クロスコンパイルのサポート
windowsでmacのバイナリが作れちゃう
go tool dist install -v pkg/runtime
set GOPATH=`pwd`
set GOOS=linux
set GOARCH=amd64
go install

* 並行処理のサポート
ゴルーチンとチャネルを使って簡単並列処理

# 基本文法
#### パッケージ管理システムはない、githubが直接import出来る

```
import (
  "fmt"
  "github.com/nabuchi/gosample"
  "strings"
)
```

#### 変数の宣言（型宣言付き）
`var hoge string = "hello world"`

#### 変数の宣言（型推論）
`hoge := "hello world"`

#### forの書き方4種
いつもの

```
for i := 0; i < 10; i++ {
  fmt.Println(i)
}
```

無限ループ

```
for {
  fmt.Println(i)
}
```

while風

```
n := 0
for n < 10 {
  fmt.Println(n)
  n++
}
```

Javaの拡張for文みたいな

in Java

```
for(String s : arr) {
  fmt.Println(s)
}
```

in Go

```
for i, s:= range arr {
  fmt.Println(s)
}
```

#### 関数
- 引数なし、返り値なし

```
func hello() {
  fmt.Println("hello")
}
func main() {
  hello()
}
```

- 引数あり、返り値なし

```
func sum(i, j int) {
  fmt.Println(i+j)
}
func main() {
  sum(1, 2)
}
```

- 引数あり、返り値あり

```
func sum(i, j int) int {
  fmt.Println(i+j)
}
func main() {
  n := sum(1, 2)
  fmt.Println(n)
}

```

- 返り値に複数の値を取れる
- エラーを返り値で返す

- 名前付き戻り値
→戻り値に最初から名前を付けられる

- 無名関数
```
sum := func(i, j int) {
  fmt.Println(i+j)
}
func main() {
  sum(1, 2)
}
```

#### 配列
- 常に固定長
- 関数に渡す場合は値渡し
#### スライス
- JavaのListみたいな感じ
- 関数に渡す場合は参照渡しみたいだけど、ちょっと複雑らしい
http://jxck.hatenablog.com/entry/golang-slice-internals2

#### マップ
#### ポインタ
#### defer
#### パニック
Goでも一応例外の機構がある,panic()→defer recover()

#型システム
#### type
#### 構造体
#### インターフェース
#### 型の埋め込み
#### 型の変換
#### 

# いいところ
- Cみたいに、実行するサーバーでコンパイル・・・みたいなことをしなくて良い
- バイナリがかなり簡単に作れて、サーバー側にツールのインストールが不要なので、オレオレツールとか、ちょっとしたバッチプログラムとかが書きやすい
- （まだちゃんと見れてないけど）並行処理がやりやすそう

# よくないところ
- Javaやってるとジェネリクスがなくて不安
- ループがダサい(rubyのmapとかfindとかselectとか使いたい)

# 微妙なところ
- Javaに慣れてるから、例外処理はthrowsでまとめて投げて、一番上の処理で例外毎の処理書けた方が嬉しい気がする・・・
- 型推論は嬉しいけど、:=がなんとなく嫌・・・
Cocos2dxをJenkinsに登録する際のシェル例

# 概要
Cocos2dxでビルドを自動化する際のシェル設定。
どのパターンがよいかはお試し中。
shenzhenはビルドのログ吐かないのできもい。
cocos compileのiOSビルドでmobileprovision指定出来ないとか何故！？
[githubのproject_compile.py](
https://github.com/cocos2d/cocos2d-console/blob/develop/plugins/project_compile/project_compile.py)にもembedオプション書いてないなぁ。。
ビルドする時切り替えるやろ。。

# Jenkinsのantと連携してAPK生成
```bash
# ANDROID BUILD
export NDK_ROOT=/Applications/android-ndk-r9d
export ANDROID_SDK_ROOT=/Applications/adt-bundle-mac-x86_64/sdk
export PATH=$PATH:$ANDROID_SDK_ROOT/platform-tools
export PATH=$PATH:$ANDROID_SDK_ROOT/tools

cd $WORKSPACE/cocos2d/cocos/platform/android/java/
android update project -p . -t 1

cd $WORKSPACE/proj.android
android update project -p . -t 1
#android update project --path . --target android-19

# keytoolの情報
echo "key.store=hoge.keystore\nkey.store.password=password\nkey.alias=hoge\nkey.alias.password= password" >> ant.properties

./build_native.py
```
![ant設定.png](https://qiita-image-store.s3.amazonaws.com/0/35973/6464cb72-7d09-e8d3-d4f2-7d932b54ce58.png "ant設定.png")

# shenzhenを使ってIPA生成
```bash
# iOS BUILD
PROVISIONING_FILE_PATH=$HOME/Builds/Keys/$JOB_NAME.mobileprovision
SCHEME_NAME="$JOB_NAME iOS"
cd $WORKSPACE/proj.ios_mac
/usr/bin/ipa build -c Release -i "iPhone Distribution: xxxxx" -m $PROVISIONING_FILE_PATH -s "${SCHEME_NAME}"  --clean
```

# cocos compileを使ってAPK生成
```bash
# ANDROID BUILD
export NDK_ROOT=/Applications/android-ndk-r9d
export ANDROID_SDK_ROOT=/Applications/adt-bundle-mac-x86_64/sdk
export COCOS_CONSOLE_ROOT=/Applications/cocos2d-x-3.2/tools/cocos2d-console/bin
export ANT_ROOT=$HOME/jenkins/tools/hudson.tasks.Ant_AntInstallation/JenkinsAnt/bin
export PATH=$PATH:$ANDROID_SDK_ROOT/platform-tools
export PATH=$PATH:$ANDROID_SDK_ROOT/tools
export PATH=$PATH:$COCOS_CONSOLE_ROOT:$ANT_ROOT

cd $WORKSPACE/proj.android

# keytoolの情報
echo "key.store=hoge.keystore\nkey.store.password=password\nkey.alias=hoge\nkey.alias.password= password" >> ant.properties

cocos compile -s $WORKSPACE -p android --ndk-mode release --ap 19 -m release
```
# cocos compileを使ってIPA生成
```bash
# iOS BUILD
export COCOS_CONSOLE_ROOT=/Applications/cocos2d-x-3.2/tools/cocos2d-console/bin
export PATH=$PATH:$COCOS_CONSOLE_ROOT

cocos compile -s $WORKSPACE -p ios -m release --sign-identity "iPhone Distribution: xxxxx"
```
PHP でカリー化

## 2014-10-10 23:50 追記

GitHub および Packagist に公開しました。
https://github.com/yuya-takeyama/curry
https://packagist.org/packages/yuyat/curry

---

眠いのでコードのメモだけ。

```php
<?php
class CurryingFunction
{
    private $fn;

    private $count;

    private $args;

    public function __construct($fn, $count, $args)
    {
        $this->fn = $fn;
        $this->count = $count;
        $this->args = $args;
    }

    public function apply($x)
    {
        $count = $this->count;
        $nextArgs = $this->args;

        foreach (func_get_args() as $arg) {
            $nextArgs[] = $arg;
            $count -= 1;

            if ($count < 1) {
                break;
            }
        }

        if ($count < 1) {
            return call_user_func_array($this->fn, $nextArgs);
        } else {
            return new static($this->fn, $count, $nextArgs);
        }
    }

    public function __invoke($x)
    {
        return call_user_func_array(array($this, 'apply'), func_get_args());
    }
}

function curry($fn, $count = null) {
    if (!$count) {
        $ref = new ReflectionFunction($fn);
        $count = $ref->getNumberOfParameters();
    }

    return new CurryingFunction($fn, $count, array());
}

$f = curry(function ($x, $y, $z) { return $x + $y + $z; });

var_dump($f(1)->apply(2)->apply(3));
// => 6
var_dump($f(1, 2)->apply(3));
// => 6
var_dump($f(1, 2, 3));
// => 6
```
Vagrantで単体＆複数体の仮想マシンを作ってみる



## 単体の場合

```:Vagrantfile
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "chef/centos-7.0"
  config.vm.network :private_network, ip: "192.168.99.2"
end
```


## 複数体の場合

```:Vagrantfile
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.define "web" do |node|
    node.vm.box = "chef/centos-7.0"
    node.vm.hostname = "web"
    node.vm.network :private_network, ip: "192.168.99.2"
  end
  config.vm.define "db" do |node|
    node.vm.box = "chef/centos-7.0"
    node.vm.hostname = "db"
    node.vm.network :private_network, ip: "192.168.99.3"
  end
end
```
ダッシュボード付きユーザー管理用パッケージ laravel-authentication-acl を試す

========

[laravel-authentication-acl/index.md at 1.1 · intrip/laravel-authentication-acl](https://github.com/intrip/laravel-authentication-acl/blob/1.1/docs/index.md) に従う。

ここではローカル環境 (Mac OS X 10.9.5) へのインストールを想定。


インストール
--------

先に `app/config/local/db.php` に db 接続設定をしておき、PHPからDBアクセス可能な準備をしておく。

その後、

- `composer.json` に `"jacopo/laravel-authentication-acl": "1.1.*"` を追加
- `php composer.phar update`
- `app/config/app.php` の 'providers' セクションに、
    - `'Jacopo\Authentication\AuthenticationServiceProvider',` を追加
- `php artisan authentication:prepare --env=local`
- `php artisan authentication:install --env=local`



確認
--------
ターミナルで `hostname` コマンドで出てきたホスト名を下記ファイルに設定する。
仮に `my-mbp.lan` がホスト名の場合、


`bootstrap/start.php` において、

```php:bootstrap/start.php
$env = $app->detectEnvironment(array(

    'local' => array(
        //'homestead',
        'my-mbp.lan',
    ),

));
```

と設定しておく。


### ログイン ###
`php artisan serve --env=local` でローカルサーバーを立ち上げて、
`http://localhost:8000` 上で確認していく。

- username:admin@admin.com
- password:password

が初期ログインユーザーとして設定されている。


#### 各アクセス URL ####
- クライアントログイン: `/login`
- 管理者ログイン: `/admin/login`
- ユーザー作成: `/user/signup`
- ログアウト: `/user/logout`

`/admin/login` にアクセスすると、

画像 → [laravel-authentication-acl/index.md at 1.1 · intrip/laravel-authentication-acl](https://github.com/intrip/laravel-authentication-acl/blob/1.1/docs/index.md#usage) のような画面が出て来たら確認OK。


### 追加確認 ###
ドキュメントに
> Keep in mind this software will send various notification emails, dont't forget to edit your laravel app/config/mail.php file.

とあるように、色んな通知がメールで飛ぶらしいので `app/config/mail.php` の設定を確認しておくこと。

こちら -> [Postfix Using Gmail SMTP in Mac OSX Mavericks](https://gist.github.com/larrybotha/6009971) のように、ローカルの Mac 上で Postfix を動かして Gmail 経由でメールを送信する設定をしてある場合は、

```php:app/config/mail.php
return array(
	'driver' => 'smtp',
	'host' => 'localhost',
	'port' => 25,
	'from' => array('address' => 'xxx@localhost', 'name' => 'xxx xxxx'),
	'encryption' => false,
	'username' => null,
	'password' => null,
	'sendmail' => '/usr/sbin/sendmail -bs',
	'pretend' => false,
);
```

のような形でメールが送信されることを確認した。
テストメールを送るためのコードは [ココ](http://laravel.com/docs/4.2/mail#basic-usage) を参照して、 `app/views/email/test.blade.php` などのファイルを作り、 `Mail::send()` を利用したコードを書き、 `app/route.php` 内に無名関数として書いてその URL にアクセスするか、 [artisan コマンドとして書く](http://laravel.com/docs/4.2/commands) 。

Route に書く場合としては下記のようにした。

```php:app/views/email/test.blade.php
Hello {{ $name }}.
```

```php:app/route.php
Route::get('/MailTest', function()
{
    $data['name'] = 'xxx xxx';
    Mail::send('emails.test', $data, function($message)
    {
        $message->to('xxx@xxx')->subject('WWWelcome!!!');
    });
});
```


終わり
----
[ドキュメント](https://github.com/intrip/laravel-authentication-acl/blob/1.1/docs/index.md#event-hooks) を見るに色んなフックや API がある (ユーザー作成後の処理など) ので、適宜カスタマイズ・利用する。
Apache2 on ubuntu で a2ensite すると does not exist と言われるときの対処法

問題
====

Apache の設定ファイルを入れるディレクトリのひとつ
/etc/apache2/sites-available/ 
以下に、バーチャルホストの設定を書いた。
ファイル名は `foobar` としていた。
で、それを enable にしようとして

```bash
sudo a2ensite foobar
```

とやると、

```bash
ERROR: Site fopbar does not exist!
```

といって怒られる。

解決方法
=======

a2ensite は 拡張子に .conf が無いといかんらしい。
つまり、
ファイル名を `foobar` --> `foobar.conf` にして、
同じく

```bash
sudo a2ensite foobar
```

を実行すると、はれて Enabling site foobar とか言われて成功。
あとは、メッセージ通り

```bash
sudo service apache2 reload
```

してあげれば OK.
関数型 PHP をオブジェクト指向でつなぐライブラリ Piper 作った

PHP 5.3 がリリースされてもう 5 年以上経ちます。
5.3 で無名関数 (Closure) が使えるようになってからは、高階関数を使うなどした関数型っぽいアプローチの可能性が広がりました。
中でも [nikic/iter](https://github.com/nikic/iter) は関数型のコレクション操作を行う上で非常に便利なライブラリです。

ですが、関数を単純にラップする記法では、関数を重ねたときに読みづらく感じる人もいるでしょう。
オブジェクト指向的なメソッドチェインと違って、読み下す順番と、実際の実行順序が逆行するところに原因がある気がします。

以下は 1 から 10 までの数列の全要素を 2 倍してから全て足し合わせる例です。

```php
use function iter\fn\operator;
use function iter\map;
use function iter\range;
use function iter\reduce;

echo reduce(operator('+'), map(operator('*', 2), range(1, 10)), 0), PHP_EOL;
// => 110
```

言語によってはもっと簡略な記法で関数が定義できたり、より読みやすい記法 (Haskell の中置記法とか) が用意されている場合もありますが、PHP にはそういったものはありません。
(HHVM には Closure の簡略記法がありますね)

というわけでこれをライブラリで解決してみました。

# Piper

[GitHub: yuya-takeyama/piper](https://github.com/yuya-takeyama/piper)

ソースとなる値を関数に適用して、その返り値を次の関数に適用して... というのをメソッドチェインで記述するためのライブラリです。
UNIX のパイプラインのようなイメージです。

## 使い方

さっきと同じロジックを記述してみましょう。
全ての関数を `pipe()` メソッドでつないでいきます。

```php
use yuyat\Piper;

use function iter\fn\operator;
use function iter\range;

$result = Piper::from(range(1, 10))
    ->pipe('iter\map', [operator('*', 2)])
    ->pipe(function ($iter) { return reduce(operator('+'), $iter, 0); })
    ->get();

echo $result, PHP_EOL;
// => 110
```

読み下し順通りに実行されるので、さっきの例より内容を理解しやすいのではないでしょうか。

引数が複数あるときは、`pipe()` メソッドの第二引数として `array` で渡すことができます。
パイプラインを通ってくる値は常に最後の引数として渡されます。

## Piper をカスタマイズする

デフォルトではインスタンスメソッドは `pipe()` と `get()` しかありませんが、これを拡張してみます。

```php
<?php
use yuyat\Piper;

use function iter\fn\operator;
use function iter\range;
use function iter\map;
use function iter\reduce;

class IterPiper extends Piper
{
    public function map($fn)
    {
        return new static(map($fn, $this->get()));
    }

    public function reduce($fn, $initial = null)
    {
        return new static(reduce($fn, $this->get(), $initial));
    }
}

$result = IterPiper::from(range(1, 10))
    ->map(operator('*', 2))
    ->reduce(operator('+'), 0)
    ->get();

echo $result, PHP_EOL;
// => 110
```

`map()` と `reduce()` を `Piper` のメソッドとして実装し、`iter` をラップする形で利用しています。
ちょっと [ginq](https://github.com/akanehara/ginq) っぽくなりましたね。
Ruby 1.9と2.0, Rails3とRails4を切り替える


***前提***
この環境ではすでに

 - ruby2.0.0p481
 - rails (4.0.5) がインストールされています。

ここに

- ruby1.9.3-p545
- rails (3.2.19)

をインストールして切り替える手順を覚え書き

###rbenvをインストール
rbenv・・・Rubyのバージョン管理をしてくれる

```Bash
$ brew install rbenv
$ brew install ruby-build
```

###rbenvのパスを通す

```Bash
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ echo 'export PATH="$HOME/.rbenv/shims:$PATH"' >> ~/.bash_profile
$ source ~/.bash_profile

```

###rbenvの設定変更を反映

```Bash
$ rbenv rehash
```

- - -

###インスールできるRubyのバージョンを確認
以下のコマンドでインストールできる一覧が確認できる

```Bash
$ rbenv install -l
Available versions:
  1.8.6-p383
  1.8.6-p420
  1.8.7-p249
  1.8.7-p302
  1.8.7-p334
  1.8.7-p352
	.
	.
	.

```

###バージョンを指定してのRubyをインストール
1.9.3-p545 を指定

```Bash
$ CONFIGURE_OPTS="--with-opt-dir=/usr/local/" rbenv install 1.9.3-p545
```

###rbenvの設定変更を反映

```Bash
$ rbenv rehash
```

###Rubyのバージョンを確認
1.9.3-p545が追加されている

```Bash
$ rbenv versions
* system (set by /Users/Mac/.rbenv/version)
  1.9.3-p545
```

- - -

###Rubyのバージョンを切り替える
現在のバージョンを確認

```Bash
$ ruby -v
ruby 2.0.0p481 (2014-05-08 revision 45883) [x86_64-darwin13.3.0]
```

###バージョンを切り替える 1.9.3-p545へ

```Bash
$ rbenv global 1.9.3-p545
```

###バージョン見て切り替わっている事を確認

```Bash
$ ruby -v
ruby 1.9.3p545 (2014-02-24 revision 45159) [x86_64-darwin13.4.0]
```

- - -

##Rails3をインストール

###現在インストールされているrailsのバージョンを確認

```Bash
$ gem list rails
rails (4.0.5)
```

###rails3.2.19を指定してインストール

```Bash
$ gem install rails -v '3.2.19'
```
###インストールされているrailsを確認
3.2.19が追加されている

```Bash
$ gem list rails
rails (4.0.5, 3.2.19)
```

- - -
#Railsのバージョンを指定してアプリの作成
3.2.19なら

```Bash
$ rails _3.2.19_ new [アプリ名]
```

4.0.5なら

```Bash
$ rails _4.0.5_ new [アプリ名]
```
Ansibleで変数を使ってみる



## 変数を使う

* 変数の宣言は `vars` 以下にhash形式で行う
* 変数を参照する際は `{{ }}` を使う

```:playbook.yml
---
- hosts: all
  sudo: yes
  vars:
    username: hoge
  tasks:
    - name: add a new user
      user: name={{username}}
```


## 変数をユーザに対話的に入力させる

* 変数の宣言は `vars_prompt` 以下にhash形式で行う
* プレイブック実行時にユーザに入力させられる

```:playbook.yml
---
- hosts: all
  sudo: yes
  vars_prompt:
    username: "Enter username"
  tasks:
    - name: add a new user
      user: name={{username}}
```
ubuntu 14.04 で octopressをインストールする手順は？


## ubuntuのシステムアップデート

```
sudo apt-get update
sudo apt-get dist-upgrade
```

## octopressを動作させるのに必要なパッケージをインストール

```
sudo apt-get install build-essential git libssl-dev nodejs
```

## Rubyのセットアップ

```
mkdir ~/Downloads
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
echo '' >> ~/.profile
echo '# rbenv' >> ~/.profile
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.profile
echo 'eval "$(rbenv init -)"' >> ~/.profile
source ~/.profile
type rbenv
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
rbenv install 1.9.3-p0
rbenv local 1.9.3-p0
which ruby
ruby --version
```

## Octopressのセットアップ

```
cd Downloads/
git clone git://github.com/imathis/octopress.git octopress
cd octopress
gem install bundler
gem install bundler
rbenv rehash
bundle install
```

## Octopressの動作確認

```
rake install
rake preview
```
TiShadowがiPhone6と6Plusに対応していた


しばらく前の話ですが、TiShadowがiOS8に対応していました。

# インストール

## 1. TiShadowのインストール
まだnpmには上がっていないため、GitHubから直接インストールします。

```shell
sudo npm i -g dbankier/tishadow --unsafe-perm
```

コミットを見たところ、これまで@2Xのsplashが使われていたケースで、Ti.Platform.displayCaps.density > 320なら@3Xを使うように修正されています。

## 2. TiSahdowAppの作成
TiShadowAppが変更されているので作り直します。

```shell
tishadow app -d your_tishadowapp_dir
```

## 3. TiShadowAppの修正
* tiapp.xmlのsdk-versionが古いので最新に変更する
* Resources/iphoneに@3Xのsplashを配置する

あとはTiShadowAppをビルドすればOKです。


# 参考
https://github.com/dbankier/TiShadow/pull/358
どうでもいいローカルでの環境構築作業を省略する


テンプレプロジェクトで以下の2つがどうしてもめんどくさかった。

* hostsの設定
* バーチャルホストの設定

Gitからcloneしてそのまま開発にとりかかれるようにする。
ローカルだし細かい部分は気にしない。

###プロキシファイルの作成

スクリプトを書く

```javascript:proxy.pac
function FindProxyForURL(url, host) {
    if (shExpMatch(host, "*.example.com.local")) {
        return "PROXY 10.211.55.31"; //サーバのアドレス
    } else if(shExpMatch(host, "*.local")) {
        return "PROXY 10.211.55.31";
    }
    return "DIRECT";
}
```
Macだとこれをホームディレクトリ等に置いて
システム環境設定 -> ネットワーク -> 詳細 -> プロキシ から自動プロキシ構成にチェックを入れて`file:///Users/user_name/proxy.pac`のように指定する。
これで*.example.com.localを設定する場合はhostsの編集は不要に。
特定の場合を条件に入れたくなければifの前に指定してあげればいい。

### サーバ変数の修正

プロキシを通すと一部おかしくなるので修正する必要がある。
このままだとWordPressとか動かない。
適当な場所にPHPファイルを作る(ここでは/media/psf/Home/webroot/document_root.php)

```php:document_root.php
<?php
$_SERVER['DOCUMENT_ROOT'] = str_replace($_SERVER['SCRIPT_NAME'], '', $_SERVER['SCRIPT_F
ILENAME']);

if(isset($_SERVER['HTTP_PROXY_CONNECTION'])) {
    unset($_SERVER['HTTP_PROXY_CONNECTION']);
}

if(isset($_SERVER['HTTP_CACHE_CONTROL'])) {
    unset($_SERVER['HTTP_CACHE_CONTROL']);
}

$_SERVER['REQUEST_URI'] = str_replace(array(
    'http://' . $_SERVER['HTTP_HOST'],
    'https://' . $_SERVER['HTTP_HOST']
), '', $_SERVER['REQUEST_URI']);

```

### バーチャルホストの設定

httpd.confなどに以下の内容を書く

```apache:httpd.conf
NameVirtualHost *:80
<VirtualHost *:80>
    ServerName example.com.local
    ServerAlias *.example.com.local
    VirtualDocumentRoot /media/psf/Home/webroot/%0
    php_admin_value auto_prepend_file /media/psf/Home/webroot/document_root.php

    <Directory /media/psf/Home/webroot/>
        AllowOverride All
    </Directory>
</VirtualHost>
<VirtualHost *:80>
    ServerName *.local
    ServerAlias *.local
    VirtualDocumentRoot /media/psf/Home/webroot/%1
    php_admin_value auto_prepend_file /media/psf/Home/webroot/document_root.php
    <Directory /media/psf/Home/webroot/>
        AllowOverride All
    </Directory>
</VirtualHost>
```

ディレクトリ名をドメイン名と同じにするか[ディレクトリ名].localで接続できるようになる。
これでhttpd.confの設定も不要になった。
Fakerを日本語設定にすると、メールアドレスがうまく生成されない


ダミーデータを作るのに便利な[Faker](https://github.com/stympy/faker)はi18nによって日本語化出来ますが、
そうするとメールアドレスがうまく出力できなくなります。（`@.biz`、`.@.name`のように出力される）

以下、対応方法
メールアドレス以外で同じ問題が起きた場合も、以下の方法で直るかもしれません

---

まずは、基本的な日本語設定方法

```
require 'faker'

Faker::Config.locale = :ja
```

これだけでは、上記の問題が発生します。

## 解決法１

i18nはjaに、fakerはenに設定する。

```
require 'faker'

I18n.locale = :ja
Faker::Config.locale = :en

Faker::Internet.email #=> "willow@armstrongherman.com"
```

- 基本的にはこれでOK
- 複合させたが故の問題が他所で起こらないか心配...


## 解決法２

メソッドに引数を渡す

```
require 'faker'

Faker::Config.locale = :ja

Faker::Internet.email("tanaka.yoshida.suzuki.yamaguchi")
  #=> "tanaka_yoshida_suzuki_yamaguchi@.name"
```

- `.`ないし`_`でつないだ文章が`shuffle`,`join`されて、メール本文になります。
- ドメインがうまく生成されないので、そこは微妙


他にいい方法があったら教えてほしいです。
ではでは
hamlからslimへの移行


hamlよりslimの方がパフォーマンスが良いとのことなので移行することにしました。
移行にはhaml2slimを使用します。

haml2slim
https://github.com/slim-template/haml2slim

### 始める前に

もちろんですが、実施する前にはbranchを切るなどしていつでも戻せるようにしておきましょう。

### あばよhaml,よろしくslim

とりあえずGemfileを編集しましょう。

```diff:Gemfile
- gem 'haml-rails'
+ gem 'slim-rails'
+ gem 'haml2slim', :group => :development

```

とりあえず`-h`でヘルプを見ます。

```
$ bundle exec haml2slim -h

Usage: haml2slim INPUT_FILENAME_OR_DIRECTORY [OUTPUT_FILENAME_OR_DIRECTORY] [options]
        --trace                      Show a full traceback on error
    -d, --delete                     Delete HAML files
    -h, --help                       Show this message
    -v, --version                    Print version
```

それでは実行しましょう。バシッといきます。

```
$ bundle exec haml2slim .
```

この時点でgit statusを見ると、hamlファイルがあったところにslimファイルが生成されているかと思います。

hamlとはもうおさらばするので、こちらもバシッと消してしまいます。

```
$ bundle exec haml2slim -d .
```

再度git statusを確認すると、hamlファイルが削除されているかと思います。

このタイミングで一度railsサーバを立ち上げて動作確認してみましょう。

### が・・・・駄目っ・・・・・！ 

動作確認を行っていたところ、以下のようなエラーが発生しました。

```
Slim::Parser::SyntaxError - Text line not indented deep enough.
The first text line defines the necessary text indentation.
Are you trying to nest a child tag in a tag containing text? Use | for the text block!
```

エラー箇所はapplication.html.slimの「head」となっていました。その時の状態は以下です。

```slim:application.html.slim
doctype html
html lang: "ja"
  head
...
```

slimではhamlのようにRuby1.9のHashシンタックスが使えないようで、以下のように書きなおす必要があります。

```diff:application.html.slim
doctype html
- html lang: "ja"
+ html lang="ja"
  head
...
```

こちらの問題についてはPRが出ているみたいですがまだマージはされていないようです。
https://github.com/slim-template/haml2slim/pull/23

### ちまちまと直し...

同じような箇所が多々あったので、1つずつ直していったところ無事動きました。
現在hamlを使っていて、slimに移行したいという方の参考になれば幸いです。

### Special Thanks

hamlからslimへの移行でひっかかったこと - @znz blog
http://blog.n-z.jp/blog/2014-03-11-haml-to-slim.html
Berkeley DB 4.8 インストール手順

#### はじめに
Berkeley DB 4.8のインストールメモ。OSはCentOS6.5を使用。
$は一般ユーザ、#はrootユーザによる実行を表す。

#### 作業手順
ファイルをダウンロード。2014年10月10日現在、ダウンロード可。

```
$ wget http://download.oracle.com/berkeley-db/db-4.8.30.tar.gz
```

ダウンロード後は解凍し、インストール。
prefixはmake installでのインストール先のため、任意で設定可。

```
$ tar zxvf db-4.8.30.tar.gz
$ cd db-4.8.30/dist
$ ./configure --prefix=/usr/local/
$ make
$ su
# make install
```

/usr/local/にインストールしたので、/usr/local/lib/を共有ライブラリの参照パスに設定する。

```
# echo "/usr/local/lib/" >> /etc/ld.so.conf
# ldconfig
```
openCVをlein-localrepo（ローカルリポジトリ）から使う

openCVを使いたい

使うときは

```clj
  :dependencies [[org.clojure/clojure "1.6.0"]
                 [opencv/opencv "2.4.9"]
                 [opencv/opencv-native "2.4.9"]])
```
こう書きたい、そんなあなたに

# 環境
mac です。

Leiningenのインストール必要なんじゃないかな？

ほかのOSの場合は
https://github.com/magomimmo/opencv-start
を読み解いてください。なんか書いてあります。

# lein-localrepo
1. **~/.lein/profiles.clj**を作成する。

1. profiles.cljを以下の通り編集する。

```clj:profiles.clj
{:user {:plugins [[lein-localrepo "0.5.2"]]}}
```

# 作業
1. HomebrewでopenCVを入れる。
`sudo brew install opencv --with-java`

1. HomebrewでopenCVを入れたディレクトリに移動する。
`cd /usr/local/Cellar/opencv/2.4.9/share/OpenCV/java`

1. 以下のコマンドを打ち、ローカルリポジトリに登録する。
`lein localrepo install opencv-249.jar opencv/opencv 2.4.9`

1. 適当なディレクトリに *native/macosx/x86_64/*を作成する。

1. 以下のコマンドを叩く。
`cp /usr/local/Cellar/opencv/2.4.9/share/OpenCV/java/libopencv_java249.dylib native/macosx/x84_64`

1. 更に以下のコマンドを叩く。
`jar -cMf opencv-native-249.jar native`

1. 以下のコマンドを打ち、ローカルリポジトリに登録する。
`lein localrepo install opencv-native-249.jar opencv/opencv-native 2.4.9`

以上終了。

# 使ってみる

```clj:project.clj
(defproject ayahi-opencv-clj "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.6.0"]
                 [opencv/opencv "2.4.9"]
                 [opencv/opencv-native "2.4.9"]])
```

```clj:core.clj
(ns ayahi-opencv-clj.core)

(clojure.lang.RT/loadLibrary org.opencv.core.Core/NATIVE_LIBRARY_NAME)
(org.opencv.core.Point. 0 0)
```

![スクリーンショット 2014-10-10 0.21.16.png](https://qiita-image-store.s3.amazonaws.com/0/39243/123f6350-f34c-07db-6864-ee960fa35e30.png)

# 参考
https://github.com/magomimmo/opencv-start

http://docs.opencv.org/doc/tutorials/introduction/clojure_dev_intro/clojure_dev_intro.html

# ちなみに
/Users/<ユーザー名>/.m2/repository/opencv
に入ってます。
C#における特殊な引数のパラメータ等の個人的まとめ


c#勉強中に少し躓いた箇所についてまとめます。
初回投稿につきおかしい箇所が多いかもしれません。

## 参照を渡す 「ref」
引数の頭にrefをつけることによって値ではなく参照元を渡すことができます。



```example.cs

public class Example
{
	a = 20; //元の変数
	
	void UseRefMethod(ref int a)
	{
		a = 10; // 元の変数の参照元が渡されるので元の変数にも変化がある。
	}
	
	void NoUseRefMethod(int a)
	{
		a = 10;	 //ローカル変数として扱われるので元の変数は変化しない。
	}
}

```

上記のようにrefを使用すると、引数として渡した値の参照元のデータを動かすので元の変数も変化します。


## 出力パラメータ 「out」
引数の頭にoutをつけることで、関数内の値を出力することができます。このパラメータは関数に情報を伝えません(本来の引数としての役目はありません)。成功or失敗の判定に使いやすいかも？

```example.cs
bool isOK;

void SampleFunc(out bool isOK)
{
	isOK = true;
}

Console.Write(isOK); //Response true

```

このように何も入れていないはずの元の変数に出力されます。複数の出力を簡単に作りたい場合は楽かもしれません。


## 可変長な引数 「params」
引数の頭にparamsをつけることで、同じ方の引数をいくつも使用することができます。

```example.cs

void SampleFunc(params int[] a)
{
	foreach(int n in a)
	{
		Console.WriteLine(n);
	}
}

```
このような形にすることで好きな数の引数を使用することができます。foreachなどと相性が良さそうですね。



まだまだ勉強し始めたばかりで個人的な解釈になってしまっている可能性がありますので間違っていたら指摘していただけると嬉しいです！
Android File Transferの自動起動を無効化する方法

==============================================

ググればすぐ見つかるものですが、Qiitaには記事がないようだったので、せっかくなので書かせてもらいました。

Android File Transfer導入後の問題
---------------------------------

最近のAndroidでは、Macから端末内部のストレージへアクセスするには、 [Android File Transfer](https://www.android.com/filetransfer/) というツールを使う必要があるようです。

ところがこのツールを使いはじめると、一つ問題が発生します。

それは、端末を使うたびにAndroid File Transferが自動的に起動してしまうのです。

起動するとき一瞬レインボーカーソルがクルクル回ってMacの動作が止まってしまうため、充電したいだけだったのに作業を止められる結果になってしまったりと困りものです。

また、それを抑制するための設定もないため、融通が利きません。


自動起動の対策方法
-----------------

自動起動しないようにする方法は簡単で、Android File Transferに含まれている **Android File Transfer Agent** というアプリを削除するなりリネームしてしまう、というものでした。

リネームするアプリは、以下の2箇所にあります。

* */Applications/Android File Transfer.app/Contents/Resources/Android File Transfer Agent.app*
* *${HOME}/Library/Application Support/Google/Android File Transfer/Android File Transfer Agent.app*

方法自体は単純なのですが、2箇所あるというのを忘れがちで、Macで一から開発環境を構築する場合に毎回やり直していたこともあり、せっかくなので、その作業をシェルスクリプトにしてみました。

```shell:androidtransfer_disable.sh
#!/bin/sh

mv "/Applications/Android File Transfer.app/Contents/Resources/Android File Transfer Agent.app" "/Applications/Android File Transfer.app/Contents/Resources/Android File Transfer Agent_DISABLED.app"
mv "${HOME}/Library/Application Support/Google/Android File Transfer/Android File Transfer Agent.app" "${HOME}/Library/Application Support/Google/Android File Transfer/Android File Transfer Agent_DISABLED.app"
```

このスクリプトを以下のように実行後、

```
$ chmod u+x androidtransfer_disable.sh
$ ./androidtransfer_disable.sh
```

Macを再起動すれば、以降、端末をMacにつないでも、Android File Transferは起動してこなくなります。

自動起動無効化後の実行方法
------------------------

自動起動を無効化しても、LaunchPadやアプリケーションフォルダから起動できるので、必要なときだけ実行すればOKです。

![LaunchPad上のアプリアイコン](https://qiita-image-store.s3.amazonaws.com/0/12951/a44c2b62-7b0b-0781-5091-5ae458ed1549.png "アプリアイコン")


### 補足

私は見たことがないのですが、 *[設定]-[ユーザとグループ]-[ログイン項目]* に残っている場合があるようなので、もし存在するようであれば、削除しておくのが良いようです。

![ログイン項目画面](https://qiita-image-store.s3.amazonaws.com/0/12951/204ed83f-8f89-7754-dc3b-645bc714d8a8.png "ログイン項目画面")

見当たりませんでした。


参考
----
 
* [Android File Transferを自動で起動させない方法 | absorbed in...](http://hirsky.com/524.html)
* [Android File Transferが端末を繋ぐたびに自動で起動して邪魔 - sudo_viの日記](http://sudoovi.hatenablog.com/entry/2013/03/27/123949)
* [「Android File Transfer」で 何もできずに Mac 再起動 とか](http://android.benigumo.com/20140721/android-file-transfer/)
vmware上でのCentOS6.5構築

#### 前提条件
あくまでvmwareでisoファイルからCentOS6.5を簡易インストールした後の作業メモ。
通常はOSインストール時に対話的に設定できる。

#### キーボード設定の変更
英字キーボードでは使いにくいことこの上ないので、キーボードレイアウト変更。
以下のファイルをviで編集する場合、保存のための「:wq」で必要なコロン（：）の入力は英字キーボードでは「Shift + セミコロン」

```
# cat /etc/sysconfig/keyboard
KEYTABLE="jp106"
MODEL="jp106"
LAYOUT="jp106"
KEYBOARDTYPE="pc"
```

#### ブートオプションの変更
/boot/grub/grub.confファイル内のkernel行のrhgbオプションを削除
（OS起動時、プログレスバー表示ではないように設定）


#### inittabの変更
（デスクトップはまず使わないので）5から3に変更

#### ホスト名設定
/etc/sysconfig/network
のHOSTNAME行に設定

#### ネットワーク設定（詳細は個別に異なるので割愛）
/etc/sysconfig/network-script/ifcfg-eth0
/etc/resolve.conf
/etc/hosts

#### アップデート（ネットワーク設定後）

```
# yum update
```
PILでEXIF Orientationタグを考慮して処理


PIL(Pillow) で JPEG ファイルをオープンしたとき、EXIF の Orientation タグに値が設定されていても特に考慮されない。
Orientation タグに設定されている値に従った回転・フリップ処理を行った後のデータを生成する方法の実装例。


```python
from PIL import Image

file_path = "JPEG 画像ファイルのパス"

# Orientation タグ値にしたがった処理
# PIL における Rotate の角度は反時計回りが正
convert_image = {
    1: lambda img: img,
    2: lambda img: img.transpose(Image.FLIP_LEFT_RIGHT),                              # 左右反転
    3: lambda img: img.transpose(Image.ROTATE_180),                                   # 180度回転
    4: lambda img: img.transpose(Image.FLIP_TOP_BOTTOM),                              # 上下反転
    5: lambda img: img.transpose(Image.FLIP_LEFT_RIGHT).transpose(Pillow.ROTATE_90),  # 左右反転＆反時計回りに90度回転
    6: lambda img: img.transpose(Image.ROTATE_270),                                   # 反時計回りに270度回転
    7: lambda img: img.transpose(Image.FLIP_LEFT_RIGHT).transpose(Pillow.ROTATE_270), # 左右反転＆反時計回りに270度回転
    8: lambda img: img.transpose(Image.ROTATE_90),                                    # 反時計回りに90度回転
}

img = Image.open(file_path)
exif = img._getexif()
orientation = exif.get(0x112, 1)

new_img = convert_image[orientation](img)
```

EXIF 規格の定義はこちら。
http://www.cipa.jp/std/documents/j/DC-008-2012_J.pdf

ただ EXIF の Orientation タグの値の定義は、その説明だけ見てもパッと分かりづらい。検索すれば分かりやすく解説してくれているページがいろいろある。例えばこちらなど。
http://hackmylife.net/archives/7400448.html