OmniAICreator/Qiita-1.07M huggingface dataset:
Use Bootstrap-Sass 3.x and Font Awesome (bower-rails vs. rails-assets)


Railsで一般的なJS/CSSのパッケージ導入方法としては以下のものが挙げられる．
ここではBootstrap（Sass ver.）を例に．

* 自分でDownloadしてきてぶち込む
  * `vendor/assets`に
  * `submodule`で
* gemから（`gem 'bootstrap-sass'`）
* [rails-assets](https://rails-assets.org/)から（`gem 'rails-assets-bootstrap-sass-official'`）
* [bower](http://bower.io/)から
  * [**bower-rails**](https://github.com/42dev/bower-rails)から
* そもそもUIまわりをRailsから分離しちゃう

このへんの利点欠点については『[bowerパッケージをbundlerで管理するRails Assetsを使ってみた](http://qiita.com/joker1007/items/8d2fa9960f3d53b8cb57)』にわかりやすく丁寧に書かれてます．

ここでは[**bower-rails**](https://github.com/42dev/bower-rails)及び[**rails-assets**](https://rails-assets.org/)からBootstrap（Sass ver.）とFont Awesomeを利用するまでを比較してみます．

# bower-railsでBootstrap & Font Awesome

**注意！** jQueryはbowerから入れるので`jquery-rails`は不要！

```ruby:Gemfile
gem 'bower-rails'
```

```ruby:Bowerfile
asset 'bootstrap-sass-official'
asset 'fontawesome'
```

```ruby:config/initializer/assets.rb
Rails.application.config.assets.paths << Rails.root.join('vendor', 'assets', 'bower_components', 'bootstrap-sass-official', 'assets', 'fonts')

Rails.application.config.assets.precompile << /.*.(?:eot|svg|ttf|woff)$/
```

## JavaScript

`bootstrap-sprockets.js`はbootstrapのJavaScript componentsを`require`してるだけ．
必要な物だけ個別に`require`してもよい．

```javascript:app/assets/javascripts/application.js
//= require jquery
//= require bootstrap-sass-official/assets/javascripts/bootstrap-sprockets
//= require turbolinks
//= require_tree .
```

## Stylesheet

`_bootstrap-sprockets.scss`はフォントや画像のasset path helperをいい感じに設定してくれるfunctionを定義してる．

```scss:app/assets/stylesheets/application.css.scss
/*
 *= require_tree .
 *= require fontawesome
 *= require_self
 */

@import "bootstrap-sass-official/assets/stylesheets/bootstrap-sprockets";
@import "bootstrap-sass-official/assets/stylesheets/bootstrap";
```

# rails-assetsでBootstrap & Font Awesome

**注意！** こちらもjQueryはrails-assetsから入れるので`jquery-rails`は不要！

```ruby:Gemfile
source 'https://rails-assets.org'

gem 'rails-assets-bootstrap-sass-official'
gem 'rails-assets-fontawesome'
```

## JavaScript

先ほどの`bootstrap-sprockets.js`と同じことを`bootstrap-sass-official.js`がやってくれてる．

```javascript:app/assets/javascripts/application.js
//= require jquery
//= require bootstrap-sass-official
//= require turbolinks
//= require_tree .
```

## Stylesheet

`$icon-font-path`をうまいこと設定しとくことでフォントのパスを解決できる．
`bower_components/...`がないぶん，こちらのほうが短くなってますね．

```scss:app/assets/stylesheets/application.css.scss
/*
 *= require_tree .
 *= require fontawesome
 *= require_self
 */

$icon-font-path: "bootstrap-sass-official/";

@import "bootstrap-sass-official/bootstrap-sprockets";
@import "bootstrap-sass-official/bootstrap";
```


# まとめ

どちらも依存関係をちゃんと解決してくれてるってところがすばらしいですね（今回の場合だとjQuery）．流石bower．

やっぱ[rails-assets](https://rails-assets.org/)は楽．nodeもいらないし．

うまいこと出来てる．


# 参考URL

* [bowerパッケージをbundlerで管理するRails Assetsを使ってみた](http://qiita.com/joker1007/items/8d2fa9960f3d53b8cb57)
* [bower-rails](https://github.com/42dev/bower-rails)
* [rails-assets](https://rails-assets.org/)
ロシアの数学者達

# あいさつ
ロシアの数学者って名前のインパクトのせいかやけに印象に残っている人が多くて、

結構キレッキレッの方が多い気がしたのでちょっと調べてみた.

## Андре́й Никола́евич Колмого́ров, Andrey Nikolaevich Kolmogorov

http://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%B3%E3%83%89%E3%83%AC%E3%82%A4%E3%83%BB%E3%82%B3%E3%83%AB%E3%83%A2%E3%82%B4%E3%83%AD%E3%83%95

出たー

確率屋さんの僕にとっては切っても切り離せないコルモゴロフ　パイセン.

公理主義的確率論の父として知られるが、実はほとんどいたる所で発散するフーリエ級数の例を最初に示したのは彼でフーリエ級数への寄与も凄まじい.

## Григорий Яковлевич Перельман

http://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%AA%E3%82%B4%E3%83%AA%E3%83%BC%E3%83%BB%E3%83%9A%E3%83%AC%E3%83%AB%E3%83%9E%E3%83%B3

ポアンカレ予想の解いたとされる人.

フィールズ賞とミレニアム賞受賞を辞退して、母親と共にわずかな貯金と母親の年金で細々と生活している.

趣味はキノコ狩り

## Андре́й Андре́евич Ма́рков

http://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%B3%E3%83%89%E3%83%AC%E3%82%A4%E3%83%BB%E3%83%9E%E3%83%AB%E3%82%B3%E3%83%95

マルコフ連鎖の人



## Пафну́тий Льво́вич Чебышёв

http://en.wikipedia.org/wiki/Pafnuty_Chebyshev

チェビシェフシリーズの人.


こう見ると全体的に確率論への寄与が大きい？

## Со́фья Васи́льевна Ковале́вская

http://ja.wikipedia.org/wiki/%E3%82%BD%E3%83%95%E3%82%A3%E3%82%A2%E3%83%BB%E3%82%B3%E3%83%AF%E3%83%AC%E3%83%95%E3%82%B9%E3%82%AB%E3%83%A4

ロシアでは初めて女性として教授職についた人.

彼女はフョードル・ドストエフスキーに恋をしたが、叶わず、またノーベルを振っている.

恋愛のスケールがデカすぎてやばい.


## Leonhard Euler

http://ja.wikipedia.org/wiki/%E3%83%AC%E3%82%AA%E3%83%B3%E3%83%8F%E3%83%AB%E3%83%88%E3%83%BB%E3%82%AA%E3%82%A4%E3%83%A9%E3%83%BC

生誕はスイスだがロシアで息をひきとられた.

## Влади́мир И́горевич Арно́льд
http://ja.wikipedia.org/wiki/%E3%82%A6%E3%83%A9%E3%82%B8%E3%83%BC%E3%83%9F%E3%83%AB%E3%83%BB%E3%82%A2%E3%83%BC%E3%83%8E%E3%83%AB%E3%83%89

とにかく色々やった人


## Александр Михайлович Ляпунов

http://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%AC%E3%82%AF%E3%82%B5%E3%83%B3%E3%83%89%E3%83%AB%E3%83%BB%E3%83%AA%E3%83%A3%E3%83%97%E3%83%8E%E3%83%95

物理屋さんの間では有名
authorized_keysでfrom区の"が消される問題対応

authorized_keysをサーバに配置しようと以下のように行った。

```yml:account/tasks/main.yml
- authorized_key: user=designer key="{{ lookup('file', 'designer') }}"
```

## ダメな例

```bash:account/files/designer
from="myhome.com" ssh-rsa C1yc...
```

`from=myhome.com ssh-rsa C1yc...`というように"が無くなる
-> from区が不正となり鍵認証が行われない。

## 良い例

\ でエスケープする必要がありました。

```bash:account/files/designer
from=\"myhome.com\" ssh-rsa C1yc...
```

`from="myhome.com" ssh-rsa C1yc...`となって接続できることを確認。
[公開版]社内バッチ処理ガイドライン


このガイドラインについて
-----------
こちらのガイドラインは社内のバッチ処理スクリプト開発にあたっての、安定運用等に関わるガイドラインを公開用に書きなおしたものになります。


バッチサーバ規則
---------

### 基礎項目
以下の要項を満たすことを確認する

- その他の用途で動作しているサーバ上での動作は行っていないこと
- 運用期間中に想定しうるデータ量にてOOMキラーに殺されないこと
- 想定の時間で終了すること
- データの読み込みは極力Read Replicaを見ていること
- データの書き込みによる本番サーバへの影響が見積もれていること
- 冪等性が担保されており、何度実行しても処理上の不具合は発生しないこと
- 多重実行時に不整合が発生しないこと
- エラー時の社内への通知が用意されていること
- エラー時の通知には再処理のための手順が揃っていること、もしくはそのドキュメントの場所が示されていること
- 個人ユーザー下にログや成果物を絶対に書き込んでいないこと
- その他本番サーバに影響を与える要素が無いこと
- スキーマ変更を伴う場合、関係各所のレビューをクリアしていること
- cronを利用する場合は、/etc/cron.d 配下にスケジュールファイルを配置すること
- AWSのサービスにアクセスする必要がある場合に、個人のaccess_tokenを利用していないこと
- 依存ライブラリはグローバルな環境を変更することなくインストール可能であること（bundler, virtualenv, dotenv...etc）
- 対象が大規模である、もしくは増加しうるデータの場合、処理はキュー、MapReduce等を介して複数インスタンスに分散可能であること


細かく項目を説明したいのですが、大半は当たり前な項目が多いので、かいつまんで説明していきます。

### 冪等性と同時実行性
大抵、バッチはコケます、なんらかの外部要因・内部要因でコケます。その時に問題になるのが、「このバッチはid1~123まで処理終わってるから二重生成してしまう」みたいな状態ですね。再度実行する際に無理やりパッチ当てるなりして再度実行するのは最悪です。
なので、こういう場合に対して、バッチを再実行する際に必ず

- 処理済みのものは処理しない
- それが難しい場合、一旦データをcleanする

ような処理を入れるようにし、何度実行しても結果の正当性が担保できるようにしましょう。
あと、例えばcrontabから5分間隔で実行するようなバッチだった場合、性能の劣化で6分かかるようになると、1分間、二重にバッチが走ることになります。
そういう場合に古い方の処理が新しい方の処理結果を上書きしないような工夫が必要です。

### エラー通知
エラーが通知されないのは当たり前ですがダメです。ただ、エラーの発生のみが通知されるだけでは、見た人が対処に困ります。担当に連絡して対応を待つ、よりは、そのエラー通知を見た人がすぐ対処できるような手順書をエラーメールなりチャット通知に紐付けましょう。

弊社だと、どのサーバで、再実行手順はこれこれで、その結果の確認はここで可能です、といった最低限度の手順を通知するようになっています。

### 依存ライブラリ
グローバルな環境を汚染してはいけません。pythonならvirtualenv、rubyならbundlerなどを使い、必ずバッチ実行環境のためパッケージ管理を分離しましょう。出来ればDockerなどでカプセル化してると最高ですね。
あと、Goを使いましょう。Go。

これが守られないと、あるバッチではとあるライブラリを更新したくて更新したところ他のバッチがコケるなどつらい目に。

### キュー、MapReduce
データが大規模になると、スケールアップでは対処できない閾値がどこかに存在していて、詰みます。その時にタスクを分散実行できるよう、対処しましょう。
分散実行を可能にするには、RabbitMQやCeleryみたいなメッセージキューを使う方法やMapReduceなどの分散実行環境がありますが、こうした環境にバッチを載せられるよう準備しましょう。

最後に
--------
このドキュメントはまだドラフト段階ですが、他にもこんな点気をつけよう、間違ってるぞコレ、みたいな部分を指摘貰えると嬉しいです。
Emacs Lisp 初心者用参考ページまとめ

ちまちまEmacs Lisp書きはじめたので自分用メモ。随時追加

文法など
===
1. [GNU Emacs Lispリファレンスマニュアル:](http://www.bookshelf.jp/texi/elisp-manual/21-2-8/jp/elisp.html "GNU Emacs Lispリファレンスマニュアル:")
 * Emacs 21.3用、ちょい古いので注意。
* [Emacs Lisp基礎文法最速マスター - http://rubikitch.com/に移転しました](http://d.hatena.ne.jp/rubikitch/20100201/elispsyntax "Emacs Lisp基礎文法最速マスター - http://rubikitch.com/に移転しました")
 * チートシート。
* [逆引きEmacs Lisp - トップページ](http://www42.atwiki.jp/elisp/ "逆引きEmacs Lisp - トップページ")
 * チートシートその2。 このへんで大雑把に使う関数の名前把握したら後は本体のヘルプ引いたほうが早い事が多い
 * `M-x apropos`とか`C-h a`(`M-x command-apropos`)から補完を試みるのもべんり
* [EmacsWiki: サイトマップ](http://www.emacswiki.org/emacs/ "EmacsWiki: サイトマップ")
 * スタイルがいまいち好みじゃないからグーグル先生から紹介されてお世話になる事のほうが多い。
* [GNU Emacs Manual](http://www.gnu.org/software/emacs/manual/html_node/emacs/index.html "GNU Emacs Manual")
 * 公式。これ最強。しかし膨大すぎる文章量に圧倒されたり英語アレルギー発症したりで余計な精神ダメージを受ける危険も伴う、諸刃の剣。素人にはお薦めできない。

見た目
===
* [kyotolisp#1 LT3 美しいLispの書き方 (1)](http://www.slideshare.net/hayato_hashimoto/lisp-1-12901654 "kyotolisp#1 LT3 美しいLispの書き方 (1)")
* [kyotolisp#1 LT3 美しいLispの書き方 (2)](http://www.slideshare.net/hayato_hashimoto/lisp-2 "kyotolisp#1 LT3 美しいLispの書き方 (2)")
* [GNU Emacs Lispリファレンスマニュアル: B. ヒントと慣習](http://www.bookshelf.jp/texi/elisp-manual/21-2-8/jp/elisp_42.html#SEC661 "GNU Emacs Lispリファレンスマニュアル: B. ヒントと慣習")

パッケージング
===
他人に配るならパッケージにまとめるといいっぽい。
Emacs24からpackage.elが本体同梱になったのでこの作業は必須ぽ。
さらに不特定多数に配るならMELPAやらMarmaladeやらに登録するらしいが遠い先の話。

* [Packages - GNU Emacs Manual](http://www.gnu.org/software/emacs/manual/html_node/emacs/Packages.html#Packages "Packages - GNU Emacs Manual")

バグ取りとか
===
* edebug(本体内蔵デバッガ)
 * [Emacs Lispのソースコードデバッガ edebug を使う - http://rubikitch.com/に移転しました](http://d.hatena.ne.jp/rubikitch/20101116/edebug "Emacs Lispのソースコードデバッガ edebug を使う - http://rubikitch.com/に移転しました")
* ERT（テストツール）
 * [Emacs Lisp Regression Testing](http://www.gnu.org/software/emacs/manual/html_node/ert/index.html "Emacs Lisp Regression Testing")
  * 日本語の情報がやたらとすくない[独自研究]
vimのquickrunでphpunitを動かす


http://blog.ruedap.com/2011/02/25/vim-php-phpunit-quickrun

完全に上の参考サイトをコピペ

```
augroup QuickRunPHPUnit
  autocmd!
  autocmd BufWinEnter,BufNewFile *test.php set filetype=php.unit
augroup END
" 初期化
let g:quickrun_config = {}
" PHPUnit
let g:quickrun_config['php.unit'] = {'command': 'phpunit'}
```

しかし、いつものグリーンバーが出てこないので寂しい感じになってしまう。。。

```
PHPUnit 3.7.38 by Sebastian Bergmann.

Configuration read from /Users/mapyo/ghq/github.com/mapyo/php-client-sample/guzzle-active-record-sample/phpunit.xml.dist

.

Time: 105 ms, Memory: 3.00Mb

[30;42m[2KOK (1 test, 1 assertion)
[0m[2K
```

ちょっと調べてみると、いろいろやり方もあるっぽいので、意識が高まればやってみよー
Fabricを使ってTwitter公式アプリの投稿画面を開く(アプリがなければWebで開く)

Android向けTwitter公式SDKは長らく存在しませんでしたが、2014年10月に発表された[Fabric](https://dev.twitter.com/products/fabric)の一部<sub>[*1](#1)</sub>として、ついに公式SDKが公開されていました。

これを使うと「Twitter公式アプリがあればアプリで、なければWebでTwitterの投稿画面を開く」という処理を簡単に記載することができます<sub>[*2](#2)</sub>。

以下[公式ドキュメント](https://dev.twitter.com/twitter-kit/android/compose)からの抜粋（ただし[ドキュメントが誤っている部分](https://twittercommunity.com/t/unmetdependencyexception-in-tweetcomposer-android/27364)は動作するよう変更してあります）

```build.gradle
dependencies {
    compile('com.twitter.sdk.android:tweet-composer:0.7.0@aar') {
        transitive = true;
    }
}
```

```java:Application.java
@Override
public void onCreate() {
    super.onCreate();
 
    Fabric.with(this, new TwitterCore(/* No auth */ null));
}
```


```java:Activity.java#showComposer()
new TweetComposer.Builder(this)
     .text("just setting up my Fabric.")
     .image(myImageUri);
     .builder.show();
```



脚注
<sub><a href="#1">1.</a></sub> FabricにはTwitterがしばらく前に買収したCrash解析サービスCrashlyticsやモバイル向け広告管理ツールのMoPubなども取り込まれています。
<sub><a href="#2">2.</a></sub> 現実にはTwiccaなどサードパーティのクライアントを使っているユーザさんも多そうなので、そのあたりをどうするかは依然悩みどころです。
GitHubをもっと便利にするためのChrome拡張とか

## おきまりのやつ

この記事は、CYBIRDエンジニア Advent Calendar 2014 8日目の@keitarouです。
新卒入社して半年と何日かが過ぎました。今年は何をしながら年を越そうか考え中です。

昨日は@stksさんの、エンジニアが見るべき至極のアニメたち10選　http://chroskepi.moe.hm/wordpress/?p=41
でした。なんともこの『CYBIRDエンジニア Advent Calendar 2014』はなんでもありな感じになっております。
そんなこんなで今週もみなさんがんばっていきましょう。

## もったいないGitHubの使い方

１日目のプロデューサーの投稿http://qiita.com/yuzo-shimamura/items/b5203cc0a495ab0f5e07
にもあるように、コードの管理をGitやGitHubやらを使わせていただいております。
駄菓子かし、私が入社したときにはまだ、チームでは、GitHubはだたのGitサーバーとしてしか使っていませんでした。
わざわざ、ソースコードを外に出してリスクだけをしょってる感じでしょうか。もったいないでした。
GitHubでいうところのIssue・PullRequest(コードレビュー)・Wikiなんかに関してはすべてRedmine上で行っているので、特別GitHubを使う必要はなかったのですね。


## 私のチーム内でのGitHubの利用事例

### まずは、コードレビューをGitHubで

私のいるプロジェクトでPull RequestをトリガーにJenkinsを走らせてCIさせたりすることをやっていました。
これ（PullRequest）をするとRedmineでコードレビューを行うのが２度手間にしかならなかったので、まずひとつ、Redmineから脱却できました。

### Issue管理もPullRequestに紐付けちゃおう

そのまんまですが、今はそんな感じになっています。
これに関しては『Redmineいややー』みたいな流れで・・・
Milestomes・Labelをぺたぺたやるだけでいい感じにタスク管理できていると思います。

### コーディング規約・Tipsなんかはリポジトリで管理

今まではこの辺の情報もWikiにのっけていましたが、これらの情報（プロジェクトでコードを書く人にしか必要ではないこと）
をだけをまとめたMarkdownのファイルをコミットしております。
Markdownで書いているとGitHubで見やすくていいです。
これでWikiはすっきりさせることができるし、Markdownでがりがりかけるようにもなりました。


### 朝会とやら

今のチームの朝会ではGitHubをみんなで眺めるだけで基本的に終わります。
『Work In Progress Pull Request』のおかげで誰が今何やっているかもすぐに確認できますからね。
ひたすら業務中に課題を感じたら、とにかくIssueをあげるようにしており、
これを朝会の場でチームに相談したりします。『MTG Topic』みたいなラベルがついてたりします。

## Chrome拡張に関して

要は『GitHubめっちゃよう使うからストレスなく便利に使いたいねん！』
ということです。

### CodeNav for Github

GitHub上でメソッドジャンプ的なことができたりするプラグイン
結構使いにくい

http://www.ianww.com/codenav/

### octotree

リポジトリ内のディレクトリをツリー上に表示する

https://github.com/buunguyen/octotree

### Pretty Pull Requests

Pull Requestがみやすくなるやつ

https://chrome.google.com/webstore/detail/pretty-pull-requests-gith/ljnjpkadhhcdniohpfilddnhahoigdec

### MISAWA::MD

みさわ画像をコメントしたい時に使います。

https://chrome.google.com/webstore/detail/misawamd/legplkhbgdelfceignhcchogkmoflagl

### Vichrome

ChromeをViキーバインド風に操作することができる
GitHubにはあんまり関係ないが必須なので・・・

https://chrome.google.com/webstore/detail/vichrome/gghkfhpblkcmlkmpcpgaajbbiikbhpdi


## 最後に

かといって社内にはエンジニア以外の人もたくさんいるわけであって、
妥協せざることもちらほら。
なので、Gitの操作を義務教育で政府がたたき込んでくれたらいいのにな☆

明日12/9は、私の背中合わせの席にいる@gucchonさんです。
それでは〜
Fluentd で HTTP ステータスコードを集計して Datadog で可視化 or 監視する

**---- ---- ----**
追記: 2015/10/12
Dogstatsd を利用しての集計を [Dogstatsd で Datadog にカスタムメトリクスを送る方法 〜Fluentd との連携を添えて〜 - TAKUMI SAKAMOTO’S BLOG](http://blog.takus.me/2015/10/10/datadog-with-fluentd/) に書きましたので、合わせて読んでいただければと思います。
**---- ---- ----**

Datadog で Apache のステータスコードを監視するための方法です。下記のように可視化したり、5xx が一定数以上になったらアラートを飛ばすみたいなことができるようになります。例は apache と書いてありますが、nginx でもほぼ同じ方法でできるはずです。

![apache_datadog.png](https://qiita-image-store.s3.amazonaws.com/0/1915/42b6b52e-532b-f685-425c-7752a271c14b.png)

```apache
<source>
    type tail
    format ltsv
    time_format %d/%b/%Y:%H:%M:%S %z
    path /var/log/httpd/access_log
    pos_file /tmp/access_log.pos
    tag apache.access
</source>

<match apache.access>
    type datacounter
    tag apache.status
    aggregate tag
    count_key status
    pattern1 2xx ^2\d\d$
    pattern2 3xx ^3\d\d$
    pattern3 4xx ^4\d\d$
    pattern4 5xx ^5\d\d$
</match>

# record_reformer がフィールド名の . を上手く扱えない
# rename_key でフィールド名を書き換える
<match apache.status>
    type rename_key
    append_tag renamed
    rename_rule1 ^apache\.access_(.+_count) apache_${md[1]}
</match>

# fluent-plugin-dd が必要とするデータ構造に変換する
# グループ毎に集計できるように tag を指定しておく
# {
#   "metric":"some.metric.name",
#   "value":100.0,
#   "tag":"any.tag",
#   "type":"gauge"
# }
<match apache.status.renamed>
    type copy
    <store>
      type record_reformer
      tag  datadog.apache.status
      <record>
        metric apache.status_2xx_count
        tag    group:web
        value  ${apache_2xx_count}
      </record>
    </store>
    <store>
      type record_reformer
      tag  datadog.apache.status
      <record>
        metric apache.status_3xx_count
        tag    group:web
        value  ${apache_3xx_count}
      </record>
    </store>
    <store>
      type record_reformer
      tag  datadog.apache.status
      <record>
        metric apache.status_4xx_count
        tag    group:web
        value  ${apache_4xx_count}
      </record>
    </store>
    <store>
      type record_reformer
      tag  datadog.apache.status
      <record>
        metric apache.status_5xx_count
        tag    group:web
        value  ${apache_5xx_count}
      </record>
    </store>
</match>

# ホスト毎に集計できるように hostname をつける
<match datadog.**>
    type forest
    subtype dd
    <template>
        dd_api_key xxxx
        host       ${hostname}
    </template>
</match>
```

ちなみに Datadog で上に貼ったようなグラフは下記のような JSON で作れます。

```json
{
  "viz": "timeseries",
  "requests": [
    {
      "q": "sum:apache.status_2xx_count{group:web}, sum:apache.status_3xx_count{group:web}, sum:apache.status_4xx_count{group:web}, sum:apache.status_5xx_count{group:web}",
      "type": "area"
    }
  ],
  "events": []
}
```
sails.js (0.10.x) CORS を有効にしてよりオープンなAPIにする方法 ヽ(ﾟｰﾟ*ヽ)(ﾉ*ﾟｰﾟ)ﾉわぁい | sails.js (0.10.x) で始めるアプリ開発

**この記事では以下の絵文字を大事な個所で使用中**

 - :exclamation: 注意点
 - :boom: 予期せぬ例外やエラーメッセージ
 - :sunny: 解決方法・お役立ち情報

Sails.js | Realtime MVC Framework for Node.js - http://sailsjs.org/

:exclamation: **sails.jsはアップデート頻度が高い⇒この記事執筆時点と仕様が異なっている可能性があるのでバージョンに注意**

# 記事の概要

JSONPという、ブラウザの cross-domain-policy の制約を何とか回避するテクニックが使われてきたが、ちゃんと実装しようということで CORS というものがある。sails.js はCORSが綺麗にサポートされているので、その使い方を紹介。 :smile:

# :sunny: config/cors.js を修正

`config/cors.js` 内のコメントは丁寧に書かれているのでそれは読むべき。

試す時はとりあえず全部有効にする。

```cors.js
	allRoutes: true,
```

これで、例えばsailsのアプリが`http://tokyo.example.com/city`のエンドポイントAPIがあるとき、`http://chiba.example.com`のクライアントjavascriptからAPIコールが簡単にできるようになる。

例えば、jqueryを使うなら

```cors_example.js
$.getJSON('http://tokyo.example.com/city', function(data){
  console.log(data);
});
```

と言う感じで簡単にクロスドメインでJSONを取得することも可能。
【FileMaker】リレーションの使い分け

リレーション。
それはまさにリレーショナルDBに慣れた世界からすると異世界に感じるFMの「リレーション」。
最初一文読んだときは

**「えー、よくわかんなーい」**

ですっ飛ばして色々やっていたら、実は大事なリレーションであることがわかった。。。

これ↓、ダメです。
![1208_1.png](https://qiita-image-store.s3.amazonaws.com/0/60538/30ca4502-4578-19fb-3442-8b55d5a3ffbc.png)

つまり、FileMaker以外のリレーショナルDBでは、最初に主キーと外部キーを決めておき、リレーションしておくことがDB屋さんのお仕事になります。
アプリケーション開発者はその設計されたDBを使って画面を作ったりプログラムを組んだりするわけです。

FileMakerは違います。

もちろん、主キーや外部キーは決めますが、

「**画面ごとにそこで使うリレーションを設計する**」

ことになります。
システムで使うリレーションを一つのリレーション図（「オカレンス」といいます）で設計してしまうと、負荷分散ができず、スピードに遅延が発生すると言われています。

なので、リレーションではそれぞれの画面のテーブルを配置して設計していきます。

# 一覧画面と明細画面を設計する

例えば一覧画面を作る場合です。
一覧画面用のテーブルをリレーションに配置します。
その際、どの画面で利用するのかがわかるように名前を変更（追加）しておくと開発が楽になります。
![1208_2.png](https://qiita-image-store.s3.amazonaws.com/0/60538/b982fd07-d43b-a6d3-f40c-1871dbeb67a6.png)

一覧で使うリレーション、一覧からクリックして詳細を表示する画面のリレーション、というように別々に追加して配置していきます。
![1208_3.png](https://qiita-image-store.s3.amazonaws.com/0/60538/5c4fc7ec-14b0-3531-db6c-f3aa3401946d.png)

この辺の感覚は、最初慣れないですよねー^^;;;

# 明細も同じページに表示する

そのほか、画面を分けずにページに明細も含める場合というのだと一覧＋明細のリレーションになりますが、「**このページだけ**」の利用ですよ。
![1208_4.png](https://qiita-image-store.s3.amazonaws.com/0/60538/0b6fff5e-5ef1-109c-6111-306493dd2806.png)
大事だからもう一回言っておきますよ。

「**このページだけ**」

# 画面の作り方

ついでなので、このリレーションを使った各画面の作りを見ていきましょう。
画面の作り方は色々あるかと思いますが、そのうちの一つの方法です。
全てこの方法で作るということではなく、要件に応じて様々な作り方があります

## 一覧と明細画面の作り

では、一覧と明細画面を分けた場合の作り方です。

リレーションを張った関係は、親と子のような感じになるので、親を追加したら子も追加できるようにしておきます。
![1208_5.png](https://qiita-image-store.s3.amazonaws.com/0/60538/b6f844fa-e380-636b-1ec7-a5797c1ead65.png)

明細画面に移動する際、特定の明細を検索して表示します。
![1208_6.png](https://qiita-image-store.s3.amazonaws.com/0/60538/f94b90b3-c43e-4991-8285-9879a0b172e2.png)

画面からスクリプトを実行するのは、こんな感じでしょうか。
![1208_7.png](https://qiita-image-store.s3.amazonaws.com/0/60538/7dba3344-fe9b-493a-67da-8662c8917a81.png)

データを入力すると、明細の詳細ボタンでその詳細に遷移できます。
![1208_8.png](https://qiita-image-store.s3.amazonaws.com/0/60538/57b9a17e-b3db-aecd-e823-f259f896a018.png)

飛べたよ。
![1208_9.png](https://qiita-image-store.s3.amazonaws.com/0/60538/d3cfa226-bac3-b2a2-4fde-7b444a4f8f8f.png)

## 同一ページの作り

親子一緒に表示する場合は、左に親のデータ、右に子である明細を表示するようにポータルツールで設計します。（明細のタイトル表示などは省略）
![1208_10.png](https://qiita-image-store.s3.amazonaws.com/0/60538/96073bdc-ca4d-d725-30f3-f5580d2055d6.png)

# 〆るよ

では、〆です。
![1208_12.png](https://qiita-image-store.s3.amazonaws.com/0/60538/87345c0b-432e-8d81-b6a2-ad09833a4a23.png)
WindowsでGnuWin32のfindを使う際の -exec の指定方法

WindowsでGnuWin32の`find`を使っていて、該当ファイルに対して`-exec`でコマンドを実行したい際の指定方法はこう。

```bash
find . -name "*.snap" -exec rm {} ";"
```

上記はカレントディレクトリ以下の ".snap" で終わるファイル名のファイルを削除するコマンドである。
`{}`は当該ファイル名に置換される。`-exec`ではコマンドの終了を`;`で指定する必要があるが、これはコマンドプロンプトでは特殊記号であるため、引用符で囲む必要がある。

なお、Linux系では`\;`とエスケープする方法が知られているがWindowsのコマンドプロンプトではこれは使えない。
Eclipseが立ち上がらなくなった場合

Eclipseを強制終了すると次回に起動しなくなることがある。
Webで検索すると`.snap`というファイルを消せというコメントが多く見つかるが、私の場合はこれでは解決しなかった。

解決方法は以下のURLを参照のこと。UIのレイアウトはリセットされてしまうがこれで解決した。
http://tomoyamkung.net/2014/04/25/eclipse-clean/
choroplethr - Vignettes - a) イントロダクション

Rのパッケージ`choroplethr`のビネットの翻訳です．
( 原文: http://cran.r-project.org/web/packages/choroplethr/index.html )

* a) [イントロダクション](http://qiita.com/nakamichi/items/23730349f31a377fb071)
* b) [アメリカの州単位コロプレス図](http://qiita.com/nakamichi/items/b8267674b610ef6e1cab)
* c) [アメリカの郡単位コロプレス図](http://qiita.com/nakamichi/items/2f63dcfb7b1cc407d87c)
* d) [アメリカの郵便番号に基づく地図](http://qiita.com/nakamichi/items/889d3883e9b2ff8e2cdf)
* e) [国家単位のコロプレス図](http://qiita.com/nakamichi/items/5090b4dadeed42c2e13c)
* f) [国勢調査の地図](http://qiita.com/nakamichi/items/de929da9335f96f6468c)
* g) [世界銀行データの地図](http://qiita.com/nakamichi/items/66fa782bb3104dd815bf)
* h) [コロプレス図の動画](http://qiita.com/nakamichi/items/02ca0f678933405cf18f)
* i) [自分の地図を作る](http://qiita.com/nakamichi/items/99ff93769f4f67b97d18)
* j) [行政区画レベル1の地図を作る](http://qiita.com/nakamichi/items/8fde40a12c6aca2abbd3)

----------


# a) イントロダクション #

## コロプレス図（階級区分図）とは ##

コロプレス図とは

1. 地理的な境界を描いて
2. ある尺度に基づいて領域を塗り分けた

地図のことです．

コロプレス図は，地理的な境界が自然な集計単位になっているデータを可視化する場合に便利です．
例として，2012年のアメリカの州別人口推計を表すコロプレス図を示します．

```{r}
library(choroplethr)
?df_pop_state
data(df_pop_state)
state_choropleth(df_pop_state, title="2012 US State Population Estimates", legend="Population")
```

![us-pop-2012.png](https://qiita-image-store.s3.amazonaws.com/0/58917/9baafedc-802c-17dc-86a3-59c63a9db825.png)

## choroplethrとは ##

`choroplethr`はRでのコロプレス図の作成を容易にするRパッケージです．
そのために3つの特徴を備えています.

1. 4つの異なる地図を用いたコロプレス図をすぐに作成できる関数を提供します．
2. コロプレス図を作るための興味深いデータソースへのAPI接続を提供します．
3. 任意のシェープファイル（Shapefile）からコロプレス図を作成するための
フレームワークを提供します．

残りのビネットではこれらの特徴について詳細に説明します．
Materializeでマテリアルデザイン


# Materialize
[公式ページ](http://materializecss.com/)
マテリアルデザインを実現してくれるCSSフレームワーク。
bowerでインストールできます。

# マテリアルデザインとは
グーグルが提唱する、実世界のもの延長で認識したり操作したりできるようなデザイン。現実のものを連想させる暗喩「マテリアル・メタファー」がキーワードで、これが名前の由来になっている。
（フラットデザインは製品の材質に合わせるマテリアルネオスティ）
# できること
twitter bootstrapなどを使ったことがある人とが最初に気になるようなことはできる。
##レスポンシブデザイン
画面サイズにあわせて表示・非表示を設定したり、グリッドシステムは、

```html
<div class="hide-on-samll-only">サイズに合わせて表示・非表示</div>
<div class="col s12 m6 l3">グリッドシステム</div>

```

などのようにクラスで指定する。画面サイズはSmall, Medium, Largeの三段階。

##色
色の指定は、

```html
<div class="red lighten-3">
<div class="yellow-text darken-2" >赤背景・黄色文字</div>
</div>
```
のように色名や明るさ・暗さ、文字色を指定する。

##影
フラットデザインだと薄くなった影ですが、現実世界には影があるので、マテリアルデザインでは無視できないでしょう。

```html
<p class="z-depth-2"></p>

```
のようにZ方向を指定するような書き方をする。

##タブ
タブを押して表示を切り替えることをしたいと思うことがあるでしょう。それもできます。ただし、注意が必要です。javascriptによる初期化が必要です。

```html
<ul class="tabs">
<li class="tab"><a href="#tab1">タブ1</a><li>
<li class="tab"><a href="#tab2">タブ2</a><li>
</ul>
<div id="tab1">内容1</div>
<div id="tab2">内容2</div>
```

のようにhtmlを書き、

```js
$(document).ready(function(){
  $('ul.tabs').tabs();
});
```

で初期化する。他の機能もこのような初期化を必要とするので、うまくいかなかったら、これを確認するといいかもしれません。

##波

公式ページをいじっていたら直ぐに気がつくと思うのですが、ボタンを押すと波のようなエフェクトがでる！

```html
<a href="#!" class="btn wave-effect waves-red"></a>
```

のようにする。エフェクトの色も指定できる。（例は赤）


---
他にも機能があるので、興味があったら[公式ページ](http://materializecss.com/)を是非見てください。



# 参考リンク
[マテリアル・デザインって何？ Androidデザイン責任者にインタヴュー](http://www.gizmodo.jp/2014/07/_android.html)
[Materialize - マテリアルデザインのためのCSSフレームワーク](http://www.moongift.jp/2014/11/materialize-%E3%83%9E%E3%83%86%E3%83%AA%E3%82%A2%E3%83%AB%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AEcss%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF/)
svg.jsとsvg.draggable.jsを使って、SVGタグ内のオブジェクトをドラッグ＆ドロップさせてみる

この記事は「[SVG Advent Calendar 2014](http://www.adventar.org/calendars/366)」の7日目の記事です。前日の記事は[_tanshio](https://twitter.com/_tanshio)さんの「[IEにも対応したレスポンシブSVGの作り方](http://tanshio.net/responsive-svg/)」でした。

以前、「[HTML5のcanvas内の複数の画像をドラッグ＆ドロップさせてみる](http://qiita.com/akase244/items/b801f435e85ea67a70eb)」で書いた内容と同じことをSVGで試してみたくなったのでまとめました。

SVGを操作するためのライブラリは[Raphaël](http://raphaeljs.com/)や[Snap.svg](http://snapsvg.io/)が有名ですが、今回は[svg.js](http://svgjs.com/)とそのプラグインである[svg.draggable.js](https://github.com/wout/svg.draggable.js)を利用しました。

svg.jsは、minifyされたものだと11.8KB 程度と非常に軽量で、ドキュメントも見やすく、今回触ってみてとても扱いやすいライブラリだと感じました。
![svgjs.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/af91dc79-5d72-3e63-ca24-554eb4d1b155.png)

実際のコードはこんな感じで、オブジェクトに対して「draggable()を呼び出す」たったこれだけです。カンタン！！

```html:HTML
<head>
    <!-- build:js(.) scripts/vendor.js -->
    <!-- bower:js -->
    <script src="bower_components/svg.js/dist/svg.js"></script>
    <script src="bower_components/svg.draggable.js/svg.draggable.js"></script>
    <!-- endbower -->
    <!-- endbuild -->
</head>
<body>
    <svg id="drawing" style="border:solid 1px;"></svg>

    <script>
        var draw = SVG('drawing').size(500, 500);

        var image = draw.image('images/PAK15_sesujiwonobasutsuyopon500.jpg', 150, 100).dx(30).dy(30);
        image.draggable();

        var text = draw.text('画像はドラッグ＆ドロップできますか？').move(150, 150).fill('#f06');
        text.draggable();

        var rect = draw.rect(100, 100).attr({fill: '#eee'}).dx(200).dy(200);
        rect.draggable();

        var circle = draw.circle(100).attr({fill: '#ff0'}).dx(300).dy(300);
        circle.draggable();
    </script>

</body>
```

---

#### このようにsvg内に並んでいるオブジェクトが。。。。
![before.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/f784319a-3f26-3ce6-7001-9b67363d019d.png)

---

#### ドラッグ＆ドロップができるようになりました。
![after.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/1074f4e5-7991-e47b-efa5-c7e5d7bae74e.png)

* 今回の検証に際し利用したもの
    * Yeomanジェネレータの[generator-webapp](https://github.com/yeoman/generator-webapp)（検証用HTMLのひな形作成）
    * Bower（svg.jsとsvg.draggable.jsのインストール）
    * PAKUTASOの[つよぽん画像](http://www.pakutaso.com/web_tsuyoshi.html)(［ photo by [pakutaso.com](http://www.pakutaso.com/) ］)
CentOSにGitBucketを構築してみた。

# CentOSにGitBucketを構築してみた。
リポジトリ管理は、GitHubやBitbucketなどがあるが、自分のサーバでも管理できるGitbucketなるものがあるとのことで導入してみた。

* https://github.com/takezoe/gitbucket

#### 構築時に参考にさせて頂いたページ
* http://homepage1.nifty.com/y-osumi/works/code/tomcat7/
* http://d.hatena.ne.jp/tageo/20140924/1411624128
* http://www.atmarkit.co.jp/ait/articles/0710/11/news121.html

#### Javaをインストールする。
```
# yum install jdk-1.8.0 jdk-1.8.0-devel
```

#### Tomcatをインストールする。
tomcat.apache.orgからダウンロードして、/usr/localに展開する。
Tomcatのディレクトリ名はtomcatへ変更した。

```
# cd /usr/local/src
# wget http://ftp.kddilabs.jp/infosystems/apache/tomcat/tomcat-8/v8.0.15/bin/apache-tomcat-8.0.15.tar.gz
# tar zxvf apache-tomcat-8.0.15
# mv apache-tomcat-8.0.15 /usr/local/tomcat
```

#### Tomcatの実行ユーザを作成する。
実行ユーザがrootであることがセキュリティ上問題があるため、Tomcat実行用のユーザを作成する。

```
# useradd -s /sbin/nolog tomcat
# chown -R tomcat:tomcat /usr/local/tomcat
```

#### GitBucketのダウンロード
Tomcatのデフォルトアプリケーション配置フォルダへ、ダウンロードする。

```
# cd /usr/local/tomcat/webapps
# wget https://github.com/takezoe/gitbucket/releases/download/2.3/gitbucket.war -O gitbucket.war
```

#### tomcatの起動
Apacheと連携させるため、httpのコネクタポートは無効にし、ajpで連携する。

```/usr/local/tomcat/conf/server.xml
<!--
  <connector port="8080" protocol="HTTP/1.1"
             connectionTimeout="20000"
             redirectPort="8443">
-->

<connector port="8009" protocol="AJP/1.3" redirectPort="8443">
```

Tomcatのサービス開始には下記のシェルスクリプトを実行すればいい。
起動スクリプトは別途掲載予定。

```
# /usr/local/tomcat/bin/startup.sh
```
デフォルトであれば、Tomcatの起動に合わせてwarファイルが展開され、下記ディレクトリが作成される。作成されたgitbucketディレクトリの所有者もtomcatに変更しておくように。

```
# chown -R tomcat:tomcat /usr/local/tomcat/webapps/gitbucket
```
展開されない場合は、/usr/local/tomcat/conf/server.xmlにあるHOSTタグのunpackWARs要素を確認。


#### Apacheとtomcatを連携し、静的ファイルの処理Apacheを任せる。
今回は、yum installされたApache上にVirtualHostを用意し、ReverseProxyでTomcatと連携する。
その際に/usr/local/tomcat/webapps/gitbucket/assetsは、ProxyせずにApacheに処理してもらう。

```/etc/httpd/conf/httpd.conf
<VirtualHost *:80>
  DocumentRoot /usr/local/tomcat/webapps/gitbucket
  ServerName gitbucket.test.com
  ErrorLog logs/gitbucket-error_log
  CustomLog logs/gitbucket-access_log common

    <Proxy *>
      Order deny,allow
      Allow from all
    </Proxy>

  ProxyPass /assets !

  ProxyPass /gitbucket ajp://localhost:8009/gitbucket
  ProxyPassReverse /gitbucket ajp://localhost:8009/gitbucket
  ProxyPreserveHost on

</VirtualHost>
```
Apacheを再起動する。

```
# service httpd restart
```

#### Gitbucketの起動確認
ブラウザから下記にアクセス！

```
http://gitbucket.test.com/gitbucket
```
初回ログインは、下記でOK。

* Username:root
* Password:root

#### 注意点
Gitbucketの静的ファイルのpathは、gitbucket/assetsであるのでProxyPassは/gitbucketでアクセスするようにしなければ、pathの誤りとして判断され、404を返す。
Apacheにファイルを処理される場合は、Apacheからどのように見えるかを考えてProxyPassを設定しなければいけない。

#### CentOS6系でのGitを使用した際の注意点
git push/cloneするときに「 return code 22 」のエラーでpushやcloneができない事態があった。原因は、CentOS6系のgitの挙動のようで、Basic認証をユーザに問わないでGitBucketへリクエストを投げてしまうことが原因だった。

** 解決方法 **
.git/configのurlにユーザ名を追加する。

```lang:.git/config
[remote "origin"]
   url = http://yn0314@hogehoge.com/gitbucket/git/yn0314/fuga.git
```

これでようやくCentOSからgit pushできる（ノД`）
しかし、ほかにいい方法はないのだろうか・・・
PHPコーディングポリシー

# コーディングポリシー

以下は[BEAR.Sunday](https://bearsunday.github.io/)フレームワーク開発でのコーディング原則をまとめたものです。

## ゴール

 * クリーン
 * ハイパフォーマンス
 * No BC break

（柔軟性や拡張性、テスト可能性などは"クリーン"であれば自然に含まれます）

## グローバル

 * グローバル定数（`define`)の禁止
 * スーパーグローバル変数の参照の禁止
 * グローバルなサービスロケータの参照の禁止 
 * グローバルな設定の参照の禁止（prod/devモードなど）
 * グローバルなプロパティ参照の禁止（スタティックプロパティ）
 * グローバルなメソッド利用の禁止（スタティックメソッド）

## 依存
　 
 * 基本全てDIで
 * `new`の禁止 (バリューオブジェクトを除く)
 * 実クラス名を使ったオブジェクトの取得(factoryメソッドなど）の禁止
 * インターフェイスにないメソッドの利用の禁止
 * 引数がオブジェクトでパブリックプロパティを使う場合、引数のタイプヒントはインターフェイス禁止。抽象クラスを使う。
 * `include_path`依存の禁止
 * 抽象クラス以外でのsetterインジェクションの原則禁止。
 * composerで依存ライブラリの最小バージョンの指定のみを行う。特定のバージョンにロックしない。
 
## 継承

 * 実クラスの継承の禁止　(`final`キーワード付加）
 * 子クラスから親クラスのメソッド利用の禁止
 * 抽象クラス以外での`protected`プロパティの禁止。

## トレイト

 * 原則禁止
 * アプリケーションでDIのセッターメソッドのみ

## 引数、返り値

 * 引数の数は４つまで（４も例外的）
 * 引数にbool値を使用することを禁止
 * スカラー値よりバリューオブジェクトを好む
 * 特定の構造を期待する連想配列を使わない
 * 返り値の`mixed`を避ける
 * `null`のデフォルト引数を避ける
 * クロージャの引数を避ける

## 構造

 * [elseの禁止](http://tkramar.blogspot.jp/2008/01/else-is-evil.html)
 * ネストのインデントは2つまで

## シリアライズ

 * オブジェクトはシリアライズ可能に

## メトリクス

 * １つのクラスのメソッドの数は**10**以下
 * １つのクラスのプロパティの数は**15**以下
 * １メソッドの平均ライン数は**10行**以下

[phpmd](https://phpmd.org/)のデフォルトそのままです。

## CI

 * [scrutinizer](scrutinizer-ci) score **10.0**
 * travis test coverage **99.5%**
 * [phpstan](https://github.com/phpstan/phpstan) -l **max** src tests 双方 (CIに含める)
 * [php-cs-fixer](https://github.com/FriendsOfPHP/PHP-CS-Fixer), [phpcs](https://github.com/squizlabs/PHP_CodeSniffer) src tests 双方 (CIに含める)

## OOP

 * [setter、getterを使わない](http://www.yegor256.com/2014/09/16/getters-and-setters-are-evil.html)
 * [デメテルの法則](http://ja.wikipedia.org/wiki/%E3%83%87%E3%83%A1%E3%83%86%E3%83%AB%E3%81%AE%E6%B3%95%E5%89%87)
 * 小さなクラスを好む。
 * 早期バリデーション、遅延評価
 * サービスにオブジェクトを渡さない。オブジェクトにサービスを渡す。　(XXManagerクラスの禁止）
 * `DRY`をあまり重視しすぎない。

## 原則

 * 小さく。迷ったら簡素な方を。
 * 言い訳はあとで。まずは取り組んでみる。
 * 守るのが難しく見える時、そもそも取り組み方がそれでいいのか再考する。
 * 速度を犠牲にする方向で解決することを避ける。

## 説明
いくつか解説します。

> 
> グローバルな設定の参照の禁止

ymlの設定ファイルを直接参照したり、Config（コンテナ）クラスを作ってその値を`get`したりしません。必要な値は`依存`として注入します。

```php
$foo = Configure::read("foo") // NG
```

```php
public function __construct($foo)
{
  $this->foo = $foo; // OK
}
```


>`new`の禁止

バリューオブジェクトなどは除きます。主にサービスオブジェクトの場合です。

```php
$email = new Email('exmaple@example.com'); // OK
$http = new AnnotationReader() // NG
```

> スーパーグローバル変数の直接参照の禁止

```php
Foo::createFromGlobals(); //NG
Foo::create($GLOBALS) // OK
```

内部でスーパーグローバル変数を直接参照するのではなく依存として渡します。

> elseの禁止

コンディションがboolの場合で`else`の状態が１つに特定される場合は構いません。(＝三項式はOK)
elseを文字通り「その他」として扱うような`else`を外します。（しかしその場合はガード節を使って`else`を簡単に外すことができます）

> 個別の意味をもたせた連想配列を引数で使わない

例えば引数に`array $location`と渡して`$location['x']`、`$location['y']`と使用するのではなく`$x`, `$y`のpublicプロパティを持った`Location`クラスを用意します。

# まとめ

様々なコーディングの原則は時に「現実的ではない」「PHP的ではない」と軽視されることがあります。しかし現在のPHPはこれらのOOP原則に従ったコーディングをする事は十分に可能です。クリーンなコードはむしろ簡素で、IDEやCIツールの利用で開発速度の犠牲も最初です。

クリーンなコードは開発速度やランタイムの実行速度とのトレードオフではないと考えます。

BEAR.Sundayが提供するのは、ライブラリの集合ではなく「フレームワーク」です。実装はその時その時に変化しますが、変わることのないHTTPアプリケーションの構造を継続的な進化と共に提供したいと考えています。ソフトウエアの設計原則に従う事はそのフレームワークを**壊すことなく**（後方互換性を犠牲にすることなく）進化を続けることを可能にするための土台です。

# 参考
https://github.com/jupeter/clean-code-php
Rubyで可変数の引数を複数取りたい場合のメソッド定義

Rubyで可変数の引数を受け取りたい場合

```rb
def my_func(a, *x)
  p a, x
end

def my_func2(a, *x, b)
  p a, x, b
end

my_func(1)
#=> 1
#   []

my_func(1, 2 ,3 ,4)
#=> 1
#   [2, 3, 4]

my_func2(1, 2 ,3 ,4)
#=> 1
#   [2, 3]
#   4
```

のように書くことが出来ます。
`my_func2`では「一つ目は引数a」「最後は引数b」「それ以外は引数xとして配列で受け取る」と解釈してくれます。

しかし

```
def my_func3(a, *x, b, *y)
  p, a, x, b, y
end
```

という引数の変数は、自動で解釈することが不可能なので作れません。
このような引数を取る変数を作りたい場合は、以下のように作成します。

```rb
def my_func4(a, _x, b, _y)
  x = [_x].flatten
  y = [_y].flatten
  p a, x, b, y  
end

my_func4(1, 2, 3, 4)
#=> 1
#   [2]
#   3
#   [4]

my_func4(1, [2,3], 3, [4, 5])
#=> 1
#   [2, 3]
#   3
#   [4, 5]
Lightningの$A.localizationServiceについて

# $A.localizationServiceについてちょっと調べてみた
World Tour Tokyo 2014のMini Hackで日付関連の問題が出たのでちょっと調べてみた。ドキュメントが少なすぎるのでauraのソースを追ってみて分かったことを箇条書きでまとめてみる。

* `$A.localizationService`で日付とか時刻とかのフォーマットができるぽい
* 内部で[moment.js](http://momentjs.com/)にSFDCで手を加えたものを使っている
* [auraのソースコメント](https://github.com/forcedotcom/aura/blob/master/aura-impl/src/main/resources/aura/AuraLocalizationService.js#L272)に書いてある`formatString A Java format string`は嘘。[moment.jsで使えるフォーマット文字](http://momentjs.com/docs/#/parsing/string-format/)しか使えない
 * 例えばJavaで使える`y`1文字とかはダメ
 * Javaだと元号で使える`G`も使えない
 * `yyyy`などはmoment.js用に`YYYY`と大文字に置換されてから使われる
* `$A.localizationService.formatDate(date, "LLL", "ja");`の3つ目の引数でロケールを指定できるはずだが効かなかった。
これでストレスフリー！MacBookと外付けキーボードを同じキーマップで利用する方法

最近はMacを利用するエンジニア増えてきましたね。
私も2年近く前からMacを使っています。

「MacBookを使ってるけど、家や社内ではもっぱら外付けキーボード」
そんな人も少なくないのではないでしょうか。

弊社メンバーも半分弱は外付けキーボード利用しています。
外付けキーボードを使う際に困るのが、macのキーボードとwindowsのキーボードではkeymapが違うこと。
特に私はemacsキーバインドを多用するので、そんなの我慢できるわけありません。
というわけで、今回はキーマップのカスタマイズ方法の紹介です。

## 目標のキーマップ
もちろんノートを利用するときにも支障がないようにというのは大前提。
外付けキーボード、macキーボードで以下のようなキーバインドにすることが目標となります。

![IMG_0944.png](https://qiita-image-store.s3.amazonaws.com/0/48618/9aeb2e05-4264-4d70-d02b-095b483ef73a.png "IMG_0944.png")

![IMG_0946.jpg](https://qiita-image-store.s3.amazonaws.com/0/48618/5300eb02-9ac5-7259-0234-4b48c208ba4a.jpeg "IMG_0946.jpg")

controlはAの右、capslockはいらない、左下はcommandが良い。
英数キーの左がoption、残った外付けキーボードのwindowsキーやmacキーボードのoptionキーは使わないのももったいないのでfnキーを割り当てます。
別アプリでoption+fn+←で選択したwindowを画面の左半分に表示とかできるようにしています。

## 必要なアプリケーション
以上を実現するために必要なのがSeilとKarabinerです。
インストール方法は調べればすぐに出てくるので省略します。

## Seilの設定
以下のようにチェックを入れてキーコードを指定します。

```
Change the capslock key : 80
Enable NFER Key on PC keyboard : 102
Enable XFER Key on PC keyboard : 104
```

これでcapslockがF19に（この後また別のキーに割り当てます）なり、
さらに変換キー、無変換キーが使えるようになります。

## Karabinerの設定
Misc&UninstallタブからOpen private.xmlを選択し、
以下の通り入力し保存します。

```xml:private.xml
<?xml version="1.0"?>
<root>
  <item>
    <name>Apple and Windows keyboard</name>
    <item>
      <name>Apple and Windows keyboard</name>
      <identifier>private.windows_keyboard_hack</identifier>
      <block>
        <device_only>DeviceVendor::APPLE_INC, DeviceProduct::ANY</device_only>
        <autogen>--KeyToKey-- KeyCode::F19, KeyCode::COMMAND_L</autogen>
        <autogen>--KeyToKey-- KeyCode::COMMAND_L, KeyCode::OPTION_L</autogen>
        <autogen>--KeyToKey-- KeyCode::OPTION_L, KeyCode::FN</autogen>
      </block>
      <block>
        <device_not>DeviceVendor::APPLE_INC, DeviceProduct::ANY</device_not>
        <autogen>--KeyToKey-- KeyCode::F19, KeyCode::CONTROL_L</autogen>
        <autogen>--KeyToKey-- KeyCode::CONTROL_L, KeyCode::COMMAND_L</autogen>
        <autogen>--KeyToKey-- KeyCode::COMMAND_L, KeyCode::FN</autogen>
      </block>
    </item>
  </item>
</root>
```

そして最後にKarabinerのChange Keyタブの

```
Apple and Windows keyboard > Apple and Windows keyboard
```

にチェックを入れます。

これにより
macキーボードの場合は

```
capslock→左command
左command→左option
左option→fn
```

その他のキーボードの場合は

```
capslock→左control
左control→左command
左window→fn
```

と変更されます。

ついでに全角/半角をかな/英数の切り替えに利用する場合は

```
For Japanese > Chenge Backquote(`) Key > Backquote(`) to KANA/EISUU(toggle)
```

にチェックを入れてください。
また、windowsキーボードで右Controlの左にあるメニューキーをfnに割り当てたい場合は

```
For PC Users > Change PC Application Key(Menu Key) > Application Key to Fn
```

にチェックを入れてください。

## 完成
これで目標の通りのキーマップとなりました。
外付けキーボードでもノートのキーボードでも同じキーマップで扱うことが可能になります。
めでたしめでたし。
go getできるGoのemacs環境作った #emacs #golang

[Go Advent Calendar 2014](http://qiita.com/advent-calendar/2014/go) 8日目の投稿です。

`go get`でセットアップできるemacs上のGoの開発環境を作ってみました。

[github.com/go-emacs/gomacs](https://github.com/go-emacs/gomacs)

これがあればちょっとGoを書きたいんだけどemacsの環境セットアップ面倒だし。。というのを解決できます。
もともとは、ペアプロや開発環境としての仮想マシン内でちょっとemacs使いたいんだけどセットアップ面倒だしvimでいいやなんてことが多々あって簡単にセットアップできたらいいなと思って作ってみました。

## インストール

    $ go get github.com/go-emacs/gomacs
    $ gomacs main.go

これだけです。gomacsの初回起動時に関連パッケージをダウンロードします。

## できること

* 補完機能 ([auto-complete](https://github.com/auto-complete/auto-complete), [gocode](https://github.com/nsf/gocode))
* 定義へジャンプ: `C-c C-j` ([godef](http://godoc.org/code.google.com/p/rog-go/exp/cmd/godef)) 戻るときは `M-*`
* テスト実行: `C-c c` でテスト実行  ([Compilation](https://www.gnu.org/software/emacs/manual/html_node/emacs/Compilation-Mode.html))
* エラー箇所へジャンプ: 上の続き。テストエラー時は``C-x ` ``でジャンプ
* スニペット入力 ([yasnippet-golang](https://github.com/atotto/yasnippet-golang))
* 保存時に自動で整形 (goimports)
* リネーム: `M-x go-rename` (gorename)
* 解析: `C-c h`でヘルプ見てね。 ([oracle](golang.org/s/oracle-user-manual))
* lint: `M-x golint` ([golint](https://github.com/golang/lint))

動いてる様子: https://asciinema.org/a/14494 ← 色が見にくいのは[asciinema](https://asciinema.org)の色設定のせいです

![gomacs-ss.png](https://qiita-image-store.s3.amazonaws.com/0/30362/ec17211f-d761-fe50-44cf-cbada61e17bf.png)

flymakeとかその他の様々なモードは少しずつ入れていこうと思います。

## 設定

emacsへPATHが通っていれば特に必要ないと思います。

emacsを指定して起動したい場合は `~/.config/gomacs/setting.json`に:

    {
        "emacs" : "/usr/local/Cellar/emacs/24.3/Emacs.app/Contents/MacOS/Emacs",
        "args" : ["-q"]
    }

とか書いておくといいと思います。
`args`はemacsに対する引数です。`-q`を指定しているのは、既存の`~/.emacs`などの設定を読み込まないようにして、gomacsの設定のみで起動するようにしています。自分の設定も使えるようにする場合は外してしまっても構いません。

## vagrant

ついでにvagrant上で試せるようにしておきました:

    $ go get github.com/go-emacs/gomacs
    $ cd $GOPATH/src/github.com/go-emacs/gomacs
    $ vagrant up
    $ vagrant ssh
    $ gomacs main.go

仮想環境を開発環境として使う例として見ていただければと思います。

## まとめ

`go get`一発でemacsでgolangを書ける環境をセットアップできるようになりました。

まだ荒削りなので自分でも使いながら今後整理していこうと思います。

### ちら裏

emacsの関連パッケージを`go get`しています。つまり`$GOPATH`上にemacsの関連パッケージをダウンロードしています。`GOPATH=$HOME`とすると[便利](http://blog.kentarok.org/entry/2014/06/03/135300)なので、Go以外のパッケージも全部そこに入れる思想にしてしまっています。
あとGoに任せることで簡単にプロキシを突破できるメリットがあります。

emacsのバージョンは24以降が推奨ですが、23系でも動いてるみたいです。
goのバージョン指定はありません。1.4rc2でテスト済みです。

### 参考資料

* [Goプログラミングの環境構築 - Emacs JP](http://emacs-jp.github.io/programming/golang.html)
* [EmacsでのGo言語編集環境 - unknownplace.org](http://unknownplace.org/archives/golang-editing-with-emacs.html)
* [ghqを使ったローカルリポジトリの統一的・効率的な管理について - delirious thoughts](http://blog.kentarok.org/entry/2014/06/03/135300)
vpermt2d

レジスタ2本をくっつけてできる 32bit整数 32要素をまぜまぜします。

こっちは128bit境界どころか、256bit,512bit境界も超えられます。やったね。もうこれだけあれば十分なんじゃね？(まあレジスタに値をロードするのがつらい場面はありそうだけど)


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

int in0[16] = {100,
               101,
               102,
               103,
               104,
               105,
               106,
               107,
               108,
               109,
               110,
               111,
               112,
               113,
               114,
               115};

int in1[16] = {116,
               117,
               118,
               119,
               120,
               121,
               122,
               123,
               124,
               125,
               126,
               127,
               128,
               129,
               130,
               131};


int table[16] = { 8,   8, 25, 31,
                  10, 10,  9, 15,
                  0,   0, 16, 16,
                  24, 24, 28, 28};

int out[16];

int
main()
{
    __m512i v0 = _mm512_loadu_si512(in0);
    __m512i v1 = _mm512_loadu_si512(in1);
    __m512i t = _mm512_loadu_si512(table);

    __m512i v = _mm512_permutex2var_epi32(v0, t, v1);

    _mm512_storeu_si512(out, v);

    for (int i=0; i<16; i++) {
        printf("%2d:%3d\n", i, out[i]);
    }
}

```

```
 $ sde -- ./a.out
 0:108
 1:108
 2:125
 3:131
 4:110
 5:110
 6:109
 7:115
 8:100
 9:100
10:116
11:116
12:124
13:124
14:128
15:128
```

明日は @tanakmura が vpshufb について書きます。
CakePHP2 と CakePHP3 をセットアップするまでの差異について

こんにちは @ken880guchi です。

Qiita への初投稿が CakePHP Advent Calendar 2014 で行うことになるとは思ってもいませんでした。 
投稿が遅くなってごめんなさい。

CakePHP Advent Calendar 2014 - 7日目は、CakePHP2 と CakePHP3 をセットアップするまでの差異について確認を兼ねての紹介を行いたいと思います。

## 必要になる PHP と Extension

CakePHP3 系からは下記の Extension が必須のようです。 

| CakePHP | PHP        | Extension |
|---------|------------|-----------|
| 2.x     | 5.2.8 以上  | 特に必要なし   | 
| 3.x     | 5.4.16 以上 | mbstring, mcrypt, intl が必要 |

## サポートする Database

サポートする Database についても若干変更が合ったようです。
自分は、普段 CakePHP を使用するときは MySQL 以外と組み合わせて使用したことがないので、特に記述のない部分についてのサポート範囲については解りませんでした・・・

| CakePHP | MySQL      | PostgreSQL | Microsoft SQL Server | SQLite |
|---------|------------|------------|----------------------|--------|
| 2.x     | 4 以上      | 特に記述無し | 特に記述無し          | 特に記述無し |
| 3.x     | 5.1.10 以上 | 特に記述無し | 2008 以上            | 3 以上 |

## インストール

CakePHP3 系からは compser を使用したインストールが主流になり、一気に今風になった感じがします。

### CakePHP2

CakePHP 本家から Zip をダウンロードして展開する形になると思います。

composer でのインストールも応用インストールという項で用意されているので、CakePHP2 系でもcomposer が使用できないことはないようですが、アプリケーションを別の環境で動かす設定やautoloader の設定をする必要があるようです。

### CakePHP3

必要なライブラリがインストールされていることを確認して、下記のコマンドを実行しましょう。

```sh
composer create-project --prefer-dist -s dev cakephp/app sandbox_app
```

Extensionが不足している場合は下記のような感じでエラーが出力されるので、インストールしてもう一回実行しましょう。

```sh
  Problem 1
    - Installation request for cakephp/cakephp 3.0.*-dev -> satisfiable by cakephp/cakephp[3.0.x-dev].
    - cakephp/cakephp 3.0.x-dev requires ext-mcrypt * -> the requested PHP extension mcrypt is missing from your system.
```

## パーミッションの設定

Webサーバとコマンドラインユーザーからの書き込み権限を与えて上げるのは 2系 も 3系 も同じようです。差異としてはCakePHP3 系からはディレクトリの構成が変わったことにより、tmp ディレクトリと logs ディレクトリの場所が変更されていました。

### CakePHP 2

APP_ROOT/app/tmp ディレクトリとその配下のディレクトリに対して書き込み権限を与える必要があります。

### CakePHP 3

- APP_ROOT/tmp ディレクトリとその配下のディレクトリに対して書き込み権限を与える必要があります。
- APP_ROOT/logs ディレクトリとその配下のディレクトリに対して書き込み権限を与える必要があります。

## 動作確認

PHP5.4 から Built-in Server が使用できるため、PHP5.4.16 以上を要求する CakePHP3系 からは動作確認も楽になっていました。

### CakePHP 2

環境構築の際にインストールした Apache 等の Web Server を起動させて、http://localhost/ にアクセスして確認する必要があります。

**2014/12/11 追記**

shin1x1 さんから、CakePHP 2 でも下記のように確認出来る事をコメントにて教えていただきました。
shin1x1 さん。有難う御座います！

```
こんにちは。CakePHP 2 でも server コマンドがあるので、PHP 5.4 以降であれば、下記でビルトインサーバを使うことができます。

$ ./app/Console/cake server -p 8000
```

### CakePHP 3

下記のコマンドで正しく設定されているか直ぐに確認できます。

```sh
bin/cake server
//ポートを変更したい場合は下記のコマンド
bin/cake server -p 5673
```

## チュートリアル (おまけ)

CakePHP3系 からは、いつものブログチュートリアルにブックマークチュートリアルが追加されています。
ブックマークチュートリアルというのも追加されており、ブログチュートリアルと合わせて体験することで、より CakePHP3系 について詳しくなれそうです。

## 最後に

今回は、本当に触りの部分について今回は確認を兼ねての紹介を行いました。
次は、実際に CakePHP2 と CakePHP3 を使用してアプリケーションを作成した時の差異を確認していきたいと思います。
CMake: 変数のスコープ

## はじめに

みなさん、こんにちは。今回は、変数のスコープについて書いていきます。

## スコープ

実は、CMakeの変数にはスコープが存在し、スコープには親子関係があります。 新しいスコープを作るとき、現在のスコープのすべての変数を、作成したスコープにコピーしてきます。つまり、スコープ内で作成した変数のほかに親スコープで生成した変数も存在するということです。ただし、コピーなので、親スコープ由来の変数を変更しても、親スコープには影響しません。また、スコープを抜けるとスコープ内の変数はすべて破棄されます。このスコープには以下の種類があります。

### Directory Scope

ディレクトリごとにひとつ存在するスコープです。このスコープは`add_subdirectory()`コマンドが呼び出されたときに作成されます。

```cmake:CMakeLists.txt
set(value1 1)
message("value1: ${value1}") # value1: 1
message("value2: ${value2}") # value2:
add_subdirectory(subdir)
message("value1: ${value1}") # value1: 1
message("value2: ${value2}") # value2:
```

```cmake:subdir/CMakeLists.txt
message("value1: ${value1}") # value1: 1
message("value2: ${value2}") # value2:
set(value1 2)
set(value2 2)
message("value1: ${value1}") # value1: 2
message("value2: ${value2}") # value2: 2
```

### Function Scope

コマンドを呼び出すときに生成されるスコープです。つまり呼び出す文脈によって、引き継がれる変数が異なります。

```cmake
function(func1)
  message("value1: ${value1}")
  message("value2: ${value2}")
  set(value1 2)
  set(value2 2)
  message("value1: ${value1}")
  message("value2: ${value2}")
endfunction()

function(func2)
  set(value1 3)
  set(value2 3)
  func1()
endfunction()

set(value1 1)
message("value1: ${value1}") # value1: 1
message("value2: ${value2}") # value2:

func1() #[[
  value1: 1
  value2: 
  value1: 2
  value2: 2
]]
message("value1: ${value1}") # value1: 1
message("value2: ${value2}") # value2:

func2() #[[
  value1: 3
  value2: 3
  value1: 2
  value2: 2
]]
message("value1: ${value1}") # value1: 1
message("value2: ${value2}") # value2:
```

### Foreach Scope

このスコープは`foreach()`コマンドが評価された時に生成されるスコープで、ループを抜けたときに破棄されます。前述した2つのスコープとはだいぶ異なっていて、ループ変数以外は親スコープのままです。また、ループ変数と同名の変数が親スコープに存在していたときは、親スコープの変数はループを抜けるまで隠蔽されます。

```cmake
set(value1 1)
set(value2 1)
message("value1: ${value1}") # value1: 1
message("value2: ${value2}") # value2: 1

foreach(value1 IN ITEMS a;b;c)
  message("value1: ${value1}")
  message("value2: ${value2}")
  set(value1 "${value1}'")
  set(value2 "${value2}'")
  message("value1: ${value1}")
  message("value2: ${value2}")
  message("")
endforeach() #[[
  value1: a
  value2: 1
  value1: a'
  value2: 1'
  
  value1: b
  value2: 1'
  value1: b'
  value2: 1''
  
  value1: c
  value2: 1''
  value1: c'
  value2: 1'''
]]

message("value1: ${value1}") # 1
message("value2: ${value2}") # 1'''
```

## 親スコープの変数を操作

上記で、親スコープ由来の変数を操作しても親スコープには影響をあたえないと述べました。しかし、コマンドの戻り値を呼び出し元の変数に代入するときなど、親スコープの変数を操作したいときがあります。この場合は、`set()`コマンドの`PARENT_SCOPE`オプションを付与することで、これが可能となります。

```cmake
function(func output_variable)
  set(${output_variable} 1 PARENT_SCOPE)
endfunction()

message("result: ${result}") # result: 
func(result)
message("result: ${result}") # result: 1
```

## おわりに

以上、変数のスコープでした。`add_subdirectory()`コマンドや`function()`で定義したコマンドを多用している場合は、思わぬ変数を受け継ついでいる可能性があるので、十分に注意する必要があります。

明日は、mrk_21 さんの『CMake: コマンド定義』です。
Dockerを使ってオンラインコンパイル環境を作る

#はじめに

Goの開発版などを手軽に試すことができる環境が欲しいと思い、Dockerコンテナを利用した[Sangobox](http://35.h2so5.net/)というサイトを作ってみました。

少し調べてみたところ、Dockerを利用したオンラインコンパイラはすでにいくつか存在するようです。ソースが公開されているものもありますが、Sangoboxを作る上では特に参考にはしていません。

* [paiza.io](https://paiza.io/)
* [codecube.io](https://github.com/hmarr/codecube)
* [grounds.io](https://github.com/grounds/grounds.io)

ただし、インターフェースは[Wandbox](http://melpon.org/wandbox/)の影響を受けています。

# Sangobox

作ってみたサイトがこちらです。まだ実験段階なので対応している言語は少ないです。

* ![sango](https://raw.githubusercontent.com/h2so5/sango/master/public/favicon.ico) http://35.h2so5.net/
* https://github.com/h2so5/sango

ソースコードのライセンスは[AGPL](http://www.gnu.org/licenses/agpl-3.0.html)です。

## 特徴

* JSON形式のREST API(https://github.com/h2so5/sango/wiki/REST-API)
* WebSokcetでリアルタイムに標準出力・エラーを表示
* ビルド時のコマンドラインを表示
* 実行環境の詳しいバージョン情報を表示
* 共有用のURLを自動的に生成 (例: http://35.h2so5.net/bnDLyyqWETd)
* ビルド・実行時の[getrusage](http://man7.org/linux/man-pages/man2/getrusage.2.html)の結果を取得可能(APIのみ)
* 複数ファイルのコンパイルが可能(APIのみ)
* １日１回Dockerイメージをリビルド
* Go: 開発版が使える、Race Detectorに対応
* C/C++: 実行時にValgrindを利用可能
* Qtが利用可能

## 制限

* ビルド・実行時間はそれぞれ5秒まで
* 標準出力・エラーはそれぞれ10KiBまで
* ネットワークは利用不可

## 環境

* Ubuntu 14.04
* Go 1.3
* Docker 1.3.1
* martini
* Redis
* Jenkins

Redisは実行結果の保存及びキャッシュに利用しています。

## Dockerではまったところ

### 公式のクライアントAPIが使いにくい

公式のレポジトリにGo用のクライアントパッケージがあります\(https://github.com/docker/docker/tree/master/api/client )。
最初は便利だと思ったのですが、このクライアントには後方互換性がなく最新版のDockerとしか通信できないという問題があります。

Goのパッケージの仕様上古いバージョンのパッケージを利用するのは面倒ですし、gitのタグがAPIのバージョンと同期していないのでコミットログを辿らないとお目当てのリビジョンを見つけることができません。

結局クライアントを使うのはあきらめてCmd.Runでdockerコマンドを直接実行するようにしています。

### dockerコマンドを同時に実行すると不安定になる

*これは最新のDockerではいくらか改善されているかもしれません。*

排他制御が不十分なのか、dockerコマンドを同時に実行するとエラーが頻発します。
一番困ったのは、`docker run --rm` を同時に実行すると、終了時にコンテナの削除がエラーで失敗してしまいディスクスペースがどんどん圧迫されるという現象でした。

現在は対策として`--rm` を付けずに実行し、使い終わったコンテナは後で定期的に削除するという方法を採っています。
イベントで知ってさっそく取り入れたvimの設定

## はじめに

miuraと言います。
アドベンドカレンダーが続けばいいなと思い参加してます。

岩手県立大学を2008年3月卒業して、愛知で組込みソフト業界で働いています。
愛知付近の勉強回に時々参加しています。

さて、アドベンドカレンダーに登録したものの、何を書くか迷っていたのですが、ちょうど'14/12/6に開催された[NGK2014B（名古屋合同懇親会 2014 忘年会）](http://events.dstokai.info/ngk2014b/)にてステキな設定を知ったので紹介させていただきます。


## 本題(短いです･･･)

breakindentというオプションです。
vim7.4.338('14/6/26公開)にて追加されてるみたいです。

どんな時に嬉しいかですが、エディタで編集していて、コードが長すぎたり、ウィンドウが小さいため次の行までいってしまう事があります。そうするとウィンドウの左はじから始まってしまって、インデントとずれてしまって読みづらくなります。

breakindentを使用すると、インデントと上手く合わせてくれるとの事。
これは、嬉しい！ということでさっそくvimrcを直しました。

vimrcに記載するときは、wrapオプションも有効にする必要ありです。

## おわび
C言語の/* */コメントの時はどうなるかとか、いくつかパターンを出して結果を残すという妄想をしていたのですが、今インストールしてあるvimのバージョンが古かったので、まだ試せていません。