OmniAICreator/Qiita-1.07M huggingface dataset:
VMWare Player がインストールできない。avast とか使ってないのに...

VMWare Player (Workstation も?) をインストールする時、

```
サービス 'VMware Authorization Service'(VMAuthdService)を開始できませんでした。システムを開始する特権を持っていることを確認してください。
```

とかいう不思議なエラーで私たちの貴重な時間をジャブジャブ浪費してくださることがままある。

検索すると、「それ、avast のせいだよ！」という記事がいくつか見つかる[[1]](http://tomoima525.hatenablog.com/entry/2013/10/20/144625)[[2]](http://blog2.k05.biz/2013/07/vmware-install-error.html)が、「avast なんか使ってねえよ！」という場合でも発生してくださることがある (過去形)。

結論をいうと、**BIOS で "Virtualzation Technology" を Disabled にする** と、インストールできるようになる、場合がある。
おっちゃんはこれで解決しました。

もちろん、インストール後はもう一度ばーちゃらーぜーしょんなんちゃらを Enable しないとマトモにVMが動かないので注意。めんどくせえ。
CakePHP3でDBのテーブルを作成・更新したりする(続)

『[CakePHP3でDBのテーブルを作成・更新したりする](http://qiita.com/ran/items/9b915a1e39cf2aca397c)』の続き。

やはり変更するたびにファイルを増やしていくようです。
`bin/cake bake migration AddPriceToProducts price:decimal` みたいに書ければ、bakeで作成されたファイルのままmigrateすれば良いですが、複数columnを追加したりする場合はそうもいかないので、bakeした後にファイルを編集してからmigrateすれば良いです。(ファイル名も、アンダースコアの後の文字列はClass名と合ってれば何でも変えて大丈夫みたい。)

`bin/cake migrations status` を実行すると、config/Migrations/ 以下にあるファイルを元に、どのファイルが実行されているかを確認することができます。
↓こんな感じ。

```
 Status  Migration ID    Migration Name 
-----------------------------------------
     up  20150522085101  Initial
     up  20150526022603  RenameColumn
   down  20150527003127  AddPriceToProducts
```

Statusがupのものが実行されていて、downがまだのもの。
ちなみに自動的に作成されているphinxlogテーブルは、以下のようになっています。

```mysql
mysql> select * from phinxlog;
+----------------+---------------------+---------------------+
| version        | start_time          | end_time            |
+----------------+---------------------+---------------------+
| 20150522085101 | 2015-05-22 17:51:03 | 2015-05-22 17:51:03 |
| 20150526022603 | 2015-05-26 12:17:24 | 2015-05-26 12:17:25 |
+----------------+---------------------+---------------------+
```

`bin/cake/migrations migrate` で実行され、`bin/cake migrations rollback` で直前に実行したものを取り消すことができます。`-t`オプションでMigration IDを指定して特定のものを実行/取り消すこともできます。

# migrationファイルのメソッドについて

migrationファイルには、`up()`、`down()`、`change()`というメソッドがあります。
`up()`には、migrateを実行した時に実行されてほしいものを書いて、`down()`にはrollbackをした時に実行されてほしいもの(`up()`の変更を戻すもの)を書けばいいみたいだけど、じゃあ`change()`は…？
…と思ってたら、`change()`には`up()`に相当するものを書いておけば自動的に`down()`を推測してくれるらしい！(なので、`up()`と`down()`は書いても無視される。)
ただし、テーブルの`create()`と`update()`を使わないといけなくて、`save()`は使えないとのこと。
あと、以下の場合のみ可と書いてある。まぁ、普通やりたいことは、だいたいこのぐらいだと思うけど。

* createTable
* renameTable
* addColumn
* renameColumn
* addIndex
* addForeignKey

参考：[Phinx - Writing Migrations](http://docs.phinx.org/en/latest/migrations.html#the-change-method)

基本、bakeでファイル作成して、それを編集して実行、というのが簡単かな。
[Swift 1.2] iOS端末のプラットフォームを取得する



Swift 1.2の場合、&sizeのところはUInt型ではなくInt型を渡す。

```Swift
var platform: String {
    var size: Int = 0
    sysctlbyname("hw.machine", nil, &size, nil, 0)
    var machine = [CChar](count: size, repeatedValue: 0)
    sysctlbyname("hw.machine", &machine, &size, nil, 0)
    return String.fromCString(machine)! // 例: iPad3,1
}
```
Ubuntu14.04LTSにRuby on Railsをインストール

#1.gitのインストール
```bash
$ sudo apt-get install git
$ git --version
```

#2.rbenvのインストール
~/.rbenvにcloneする

```bash
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
```

パスを通す

```bash
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
```
rbenv initコマンドを呼び出す

```bash
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
```
確認する

```bash
$ exec $SHELL -l
$ rbenv --version
```

#3.ruby-buildのインストール

```bash
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

#4.rubyのインストール

```bash
$ rbenv install --list
Available versions:
  1.8.6-p383
  1.8.6-p420
  1.8.7-p249
    …

$ rbenv install -v 2.2.2
```
確認する

```bash
$ rbenv rehash
$ rbenv versions
$ rbenv global 2.2.2
$ ruby -v
```

#5.Ruby on Railsのインストール

```bash
$ gem install rails --version 4.0.5

```

#6.その他諸々のインストール
SQLite3のインストール

```bash
$ sudo apt-get install -y sqlite3
```
で、

```bash
$ rails new sample
```
などとやってみて、足りない！と言われたものを順次インストールし、
ちゃんと新規作成されたらオッケー

####お世話になりました
http://blog.tstylestudio.com/2012/09/06/bundle-install%E3%81%A7%E3%80%8Cg-%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%8C%E8%A6%8B%E3%81%A4%E3%81%8B%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%E3%81%A7%E3%81%97%E3%81%9F%E3%80%8D%E3%81%AE%E6%99%82/
jenkins 構築メモ



cron相当のタスクの結果を確認しやすくしたい。

参考
http://weblabo.oscasierra.net/install-jenkins-01/
http://treeapps.hatenablog.com/entry/2014/06/11/233027
http://qiita.com/yusukaaay/items/07ec304e4ccc8f8d6581

インストール
```
yum install wget java-1.7.0-openjdk
wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key
yum install jenkins
```

```shell-session:/etc/sysconfig/jenkins
JENKINS_PORT=“XXX"
```

```
service jenkins start
```

iptables の設定に以下を追加
```
/sbin/iptables -A INPUT -m state --state NEW -p tcp --dport XXX -j ACCEPT
```
推奨されているバージョンコード体系

# 推奨されているバージョンコード体系

推奨されているのは7桁のバージョンコード

* APIレベル（2桁）
* 画面サイズ（2桁）
* アプリのバージョン（3桁）

最初の２桁はAPIレベル、次の２桁は画面サイズの最小と最大（１〜４で４種類のサイズを表している）またはテクスチャ形式を、最後の３桁はアプリのバージョンに使用している

# 推奨されているバージョンコード例

**0412310** の場合は下記のような意味を持つ

| APIレベル | スクリーンサイズ | アプリバージョン |
|:--------:|:--------------:|:---------------:|
| 4以上    | small - normal | 3.1.0          | 

**1134310** の場合は下記のような意味を持つ

| APIレベル | スクリーンサイズ | アプリバージョン |
|:--------:|:--------------:|:---------------:|
| 11以上    | large - xlarge | 3.1.0          | 


*スクリーンサイズと値は下記のようになっている*

| スクリーンサイズ | 値 |
|:---------------|---:|
| small          | 1  |
| normal         | 2  |
| large          | 3  |
| xlarge         | 4  |
SwiftのコードをXcode使わずにコンパイルする


おそらく使うことはないだろうけど、必要にかられて調べたのでメモ。

```swift:hoge.swift
for (var i = 1; i < 10; i++) {
	println(i)
}
```

普通に、Swiftでコードを書く。そして、`swiftc`コマンドでコンパイルする。これだけ。

```
$ swiftc -o hoge hoge.swift
$ ./hoge
```

SDKなどを使いたくなったらオプションで指定する。

```swift:hoge.swift
import Foundation

# snip
```

```
$ swiftc -sdk $(xcrun --show-sdk-path --sdk macosx) -o hoge hoge.swift
```
GAE/Java で Cloud Repositories の設定をする

## Cloud Repositories を使えるようにした（メモ）

### 前提

- git local respositoryアリ
- GAE上にJavaプロジェクトデプロイ済
- Eclipseで開発

### 今までのデプロイ方法

今まではEclipseからクリックしてデプロイしてた。
Eclipseのツールバーより・・

![gae-deploy.png](https://qiita-image-store.s3.amazonaws.com/0/5691/66007c01-14ce-119f-7710-03267076ef5e.png)

こんな感じ。

### デプロイしてるコードがわからなくなる問題発生・・

[Cloud Repositories](https://cloud.google.com/tools/repo/cloud-repositories#connect_a_local_git_repository)
使えばいいじゃん！

（全部書き終わってから気づいたけど、これだけじゃダメだった・・
ソースコードのプッシュは出来たけど、そこからデプロイさせるにはJenkinsやらなんやらの設定が必要なことがわかり、かなりコードがでかくなってる状態でやり始めるのが怖くてやめた・・）

### Google Cloud Consoleからこんなのを発見

![gae-console-menu-cloud-repository.png](https://qiita-image-store.s3.amazonaws.com/0/5691/e830b581-1961-a1d4-dde3-df6e0fcae55e.png)

#### 閲覧をクリック

![gae-setup-cloud-repository-1.png](https://qiita-image-store.s3.amazonaws.com/0/5691/79b234f9-a7d4-3d38-c06f-90a4590c7855.png)

#### 開始をクリック

![gae-setup-cloud-repository-2.png](https://qiita-image-store.s3.amazonaws.com/0/5691/ac7a8b7a-7696-2d39-f911-2a3c971c0706.png)

3種類選べるけど、今回はローカルにあるgitを使いたいので、真ん中を選択。

基本ここで書いてある手順通り。

## 手順

### Google Cloud SDKの設定

- [Google Cloud SDKをダウンロード](https://cloud.google.com/sdk/)
- Google Cloud SDKをインストール
- Pythonがないとインストール中に一緒にインストールするかい？と聞かれる（特に問題なければ一緒にインストールする）
- インストールが終わると、Google Cloud SDK Shellが立ち上がる
- 立ち上がったコンソールで、元にしたいローカルのgitリポジトリのとこまで移動
- 認証してみる

```
$ gcloud auth login
```

- おもむろにブラウザが立ち上がり、Google Account認証がはしる
- なんか失敗したっぽい・・
- コンソールメッセージで、プロジェクトIDをセットせよ、と言われるので言われるがままセットする

<project-id>はGoogle Cloud Consoleで確認できる。アプリケーションの識別IDみたいなやつ。

```
$ gcloud config set project <project-id>
```

- もっかい認証

```
$ gcloud auth login
```

- おもむろにブラウザが立ち上がり、Google Account認証がはしる
- 今度は大丈夫っぽい

#### Gitの設定

- 認証ヘルパーの設定
- リモート設定の追加


```
$ git config credential.helper gcloud.sh
$ git remote add google https://source.developers.google.com/p/<project-id>/
```

credential.helperとは、gitでHTTP越しで認証がかかっているリポジトリにアクセスする時の便利ツールらしい。

参考URL：[git credential helperを使ってHTTP越しで認証がかかっているリポジトリにアクセスする | misty-magic.h](https://mistymagich.wordpress.com/2013/10/07/git-credential-helper%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6http%E8%B6%8A%E3%81%97%E3%81%A7%E8%AA%8D%E8%A8%BC%E3%81%8C%E3%81%8B%E3%81%8B%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%83%AA%E3%83%9D%E3%82%B8/)

### いよいよコードを送ってみる！

```
$ git push --all google
```

無事送れればOK

## 地味にハマったところ

- gcloud.cmd（Windowsなので）にPATHが通ってなかった
- 最初のコード全部送るところ、Google Cloud SDK Shellでやったほうがいいっぽい
- SourceTreeから最初のpushしようとしたら、どうしても認証のダイアログが出てしまい、pushできなかった
- 一回 Google Cloud SDK Shellでコード送った後は大丈夫になった

## 細かい手順の参照先

- [gcloud Tool Guide - Cloud SDK — Google Cloud Platform](https://cloud.google.com/sdk/gcloud/)

最初にGoogle Cloud Consoleから設定するリンククリック時の説明で十分といえば十分。

## 結論

- プライベートリポジトリ的な感じでGAE用のコードをプッシュしとくのは良さげ
- 「閲覧」とか言いつつ、あんまりコード見やすくないので、中央のgitとして置いといて、詳細なログ見たければpullしてローカルで見たほうが良さげ
- ここからデプロイまでやるには、（Javaの場合）MavenやらGradleやらの設定が必要になるようなので、最初のうちにそこら辺ちゃんとしといた方が良さげ
Pythonのloggingとjsonへのdump

標準で入っている **logging** パッケージ、気軽に使えてそれなりなのだけど、 
どうもスクリプトが死ぬまでファイルハンドラが殺されないような気がする。 
以下に個人的に想定外な動作をする簡単な例を挙げる。 
(もしかしたらこれが正しい動作かもしれないんだけど・・・詳しい人教えて！)

```sample_logging.py
from datetime import datetime as dt
import os, logging
def main():
  for i in xrange(1,6):
    log = logging.getLogger()
    
    # i番目の繰り返し用のディレクトリ
    dir_name = "dir_{0}".format(i)
    os.makedirs(dir_name)

    # i番目の繰り返し用のディレクトリのためにログファイル（作りたい）
    log_file_name = "{0}/lg_index{1}.log".format(dir_name, i)
    logging.basicConfig(level = logging.INFO,\
                        filename = log_file_name,\
                        format = "[%(name)s: %(levelname)s @ %(asctime)s] %(message)s")

    # log
    log.info('hoge')
    log.info('foo')
    log.info(dt.now().strftime('%Y%m%d%H%M%S))
```

気持ちとしてはdir_1, dir_2, ..., dir_5のそれぞれのディレクトリに 
何らかの処理をした時のログを書き出したかったのだけど、これをすると
一番最初にloggingの設定をしたdir_1のログファイル(dir_1/lg_index1.log"に 
全部のinfo(この場合level=logging.INFOなため)が書き出される。 
(そもそもこの使い方が正しくない/イケてない可能性がある。)

対策1(ファイルハンドラを扱う/余りキレイじゃない？)
=====
これを参考にした（※コピペでパクってきた） 
- http://stackoverflow.com/questions/24816456/python-logging-wont-shutdown 

```sample_logging_new.py
from datetime import datetime as dt
import os, logging
def main():
  for i in xrange(1,6):
    log = logging.getLogger()
    
    # i番目の繰り返し用のディレクトリ
    dir_name = "dir_{0}".format(i)
    os.makedirs(dir_name)

    # i番目の繰り返し用のディレクトリのためにログファイル（作りたい）
    log_file_name = "{0}/lg_index{1}.log".format(dir_name, i)
    log.setLevel(logging.INFO)
    fh = logging.FileHandler(filename = log_file_name)
    formatter = logging.Formatter(
        fmt='"[%(name)s: %(levelname)s @ %(asctime)s] %(message)s"',
        datefmt='%Y-%m-%d %H:%M:%S')
    fh.setFormatter(formatter)
    log.addHandler(fh)    

    # log
    log.info('hoge')
    log.info('foo')
    log.info(dt.now().strftime('%Y%m%d%H%M%S))

    # close file handler
    log.removeHandler(fh)
    del log, fh
```

対策2(どうせファイルハンドラ使うなら直接書き出す)
=====
[@shima__shimaさん](http://twitter.com/shima__shima/)が教えてくれた。
- https://twitter.com/taki__taki__/status/602473227412054016

```sample_logging_json.py
from datetime import datetime as dt
import os, json
def main():
  for i in xrange(1,6):
    # i番目の繰り返し用のディレクトリ
    info = {} # データを入れる辞書
    dir_name = "dir_{0}".format(i)
    os.makedirs(dir_name)

    # i番目の繰り返し用のディレクトリのためにログファイル（作りたい）
    log_file_name = "{0}/lg_index{1}.log".format(dir_name, i)
    info['hoge'] = 0
    info['foo'] = 0
    info['bar'] = dt.now().strftime('%Y%m%d%H%M%S)
    
    # jsonファイル書き出し
    with open(log_file_name, 'w') as f:
        json.dump(info, f)
```

情報(パラメータとか時間とか)書き出すだけの用途なら、logging使わなくてもいいと思った。
MySQLで結果セットに連番を割り振る

# 比較

## Before

オーソドックスに結果セットをイテレートしながら連番を割り振ります。

```mysql:$sql
SELECT id, name
FROM user
ORDER BY name
```

```php:PHP
foreach ($pdo->query($sql) as $i => $row) {
    $rows[] = array_merge(['rank' => $i + 1], $row->fetch(PDO::FETCH_ASSOC));
}
```

## After

いちいち結果セットを取得した後にPHPでfor,foreach文をぶん回したりする必要もなく、SQLだけで実現できるようです。

```mysql:$sql
SELECT @n:=@n+1 AS rank, t1.*
FROM (SELECT id, name FROM user ORDER BY name) t1, (SELECT @n:=0) t2
```

```php:PHP
$rows = $pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC);
```

# 追記

一応タイトルにも「MySQLで」と明記してありますが、`@variable`形式のユーザー定義変数はMySQLの独自仕様なので、移植性を考えるのであればあまり使うべき方法ではありません。更に、最適化の過程で必ずしも変数が期待通りの順序で評価されることも保証されてはいないようです。よって

- そもそも結果セットの中に番号を含める必要はなく、イテレート時に得られるキー`$i`をそのまま使えばよい
- `ORDER BY`を用い、サブクエリ中で基準になるキーの大小関係を利用すればよい

以上どちらかの選択肢のほうが良いと思われます。後者の例を以下に示します。

```mysql:$sql
SELECT (SELECT COUNT(*) FROM user t1 WHERE t1.name <= t2.name) AS rank, id, name
FROM user t2
ORDER BY name
```

↑<del>オプティマイザ君がちゃんとやってくれそうだしパフォーマンスは大丈夫だよね…？</del><br>
↑<ins>`PRIMARY KEY`以外だと性能のいいオプティマイザでも残念な結果になりそうです。更に最低限`UNIQUE`で無ければ同じ値が出てきた時に重複する番号が出てしまいます。</ins>

**結論: 「そもそも結果セットの中に番号を含める必要はなく、イテレート時に得られるキー`$i`をそのまま使えばよい」**

# 参考

- [MySQL :: MySQL 5.5 Reference Manual :: 9.4 User-Defined Variables](http://dev.mysql.com/doc/refman/5.5/en/user-variables.html)
- [Stack Overflow - MySQL - Get row number on select](https://stackoverflow.com/questions/2520357/mysql-get-row-number-on-select/4474389#4474389) 
- [Stack Overflow - How to use ROW_NUMBER in sqlite](http://stackoverflow.com/a/16849640/1846562)
for文からのreturnとbreak

「for文の中からbreakで抜けるのは良いがreturnで抜けるのはよくない」みたいな中途半端な話を[見かけた](http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1226287612)ので、元記事2009年ですが、2013年にも[言及されて](http://d.hatena.ne.jp/artgear/20130124/javascript_array_contain_how_to)いたりして突っ込む価値があるのかな、と思って書きます。

とりあえず、規約で決めとこうぜ、という話で終わりなのですが、それじゃ元記事よりひどいので、なぜ中途半端なのか、なぜ使うのかを書きます。

えと、breakとか途中returnとかって大変悩ましいのですよ。関数の機能の外出しが自由にできなくなる。どういうことかというとこういうことだ。

```c
int func(void)
{
    for(int i; i<5; ++i)
    {
        //色々
        //関連の深い処理
        //関連の超深い処理
        if(mazuikoto){break;}
        //関連の超深い処理
        //関連の深い処理
        //色々
    }
}
```

で、関連の深い処理がちょっと肥大化したとするじゃん？

```c
int chokanren(void)
{
    //関連の超深い処理
    if(mazuikoto)
    {
        break; //<- あうち！
    }
    //関連の超深い処理
}

int kannrenn(void)
{
    //関連の深い処理
    chokanren();
    //関連の深い処理
}

int func(void)
{
    for(int i; i<5; ++i)
    {
        //色々
        kannrenn();
        //色々
    }
}
```

あうち。2階層とか機能を切り分けられたら、もう例外機構のお世話にならないと同じ処理ってできないよね？　返値でって言ったって、この様子を見ると既に使ってそうだよね。これがbreakとか、ループ中returnとかを禁じる本質的な意味だと思うんだよな。だから、returnが駄目でbreakならいいというのは謎だ（一応、breakならコンパイラエラーで気付くけど、returnだと下手すると伏在するバグになりかねない、という違いは認めよう）。もちろん、後述のように線形探索とか、returnならツリー探索とか、探索にはよく出てくると思うんだが、それはチーム開発でもメンバー個々にやらさない方が良いと思うな。

ヤバいフローなら、例外がサポートされている環境では関数を分ける前から例外を使うべきだし、正直、後々肥大化する類いのループなら、もとより終了判定が柔らかい類いのアルゴリズムなんだと思うから、forで回さずに、do{}while();とか、そういうもんに適したループなんじゃないかと思う。

例外機構は（C++みたいな実装レベルではともかく）とても綺麗な言語仕様で、内部の構造にかかわらず使えることになっとるので、そっちが本命。

だから、決して元記事みたいな「読みやすさ」とか「ブレークポイントの付けやすさ」とかそういう問題じゃない。広い意味での読みやすさではあるけど、そう呼ぶのは問題の本質じゃない。ソースコードの構造上のリスクを抱え込むということなんじゃよ。ふぉっふぉっふぉっ。

ただね、線形探索みたいに、単に何かを見つけたいだけなら、for if breakで問題は起きんだろう。もうそれはイディオムだよね。それを許容しないなら、融通の利かない子が配列全走査しまくることにならんかえ？　チーム開発としてそれでいいんかえ？　一番の解決方法は、共用ライブラリにバグのない線形探索入れとけよ、って感じ。エラーでなくてbreak,return使いたいのなんて、どうせ何らかの探索だろうよ。（ifのスコープがでかすぎて先に抜けたい、というケースもありそうだが、それはそれで別の問題がある）

個人で書くときとか、理論を示すときとか、回し続けないツールとかの場合だったら、良いと思うよ。再帰で書いた方がスムーズな処理はあるし、その場合、途中returnがある場合は少なくなかろう。そして、コンパクトに書けていれば、デバッグだって困難にはならなかろう。

Q.不定個のデータを扱うので無限ループさせたいんだけど

真面目に書くんなら、例外機構があればそれも例外がほんとだよね（ループ脱出の発生は稀なはずだから）。さもなくば、結局do{}while(!endflag);とかじゃね？
HTML5のdata属性の名前をRailsのViewで付ける時と、jQueryからアクセスする時の注意


HTML5のdata-* 属性名は XML-compatibleかつ先頭3文字が「xml」でない文字で書かないといけません。

# XML-compatibleとは
先頭が英文字または、「_(アンダースコア)」 で始まり2文字目移行が「-(ハイフン)」「.(ピリオド)」 を含む英数字。
（ 「.(ピリオド)」 は使わないほうがよいらしい）

http://tokkono.cute.coocan.jp/blog/slow/index.php/xhtmlcss/html5-data-attributes-vs-jquery-data-api/

# RailsのViewで書く時の注意
Viewで要素のデータ属性を下のように書くときがある。
RubyのSymbolでは「-(ハイフン)」を使えないので以下の様には書けない。

```haml:間違い
= link_to 'リンク', '/', data: {hoge-hoge: 'hogehoge'}, class: 'hoge'
```

以下の様に書かないと文法エラーとなる。

```haml:正解
= link_to 'リンク', '/', data: {hoge_hoge: 'hogehoge'}, class: 'hoge'
```

これはHTMLに変換されたとき、以下の様に「-(ハイフン)」に変わっている。

```html
<a data-hoge-hoge="hogehoge" class="hoge" href="/">リンク</a>
```

なので、jQueryからdataメソッドでアクセスするときは、以下のようにする。

```javascript
$('a.hoge').data('hoge-hoge');
```
ElasticBeanstalkでのデプロイで'You need to install git to be able to use gems from git repositories.'

```bash
$ eb deploy
WARNING: Deploying a previously deployed commit.
INFO: Environment update is starting.                               
INFO: Deploying new version to instance(s).                         
ERROR: [Instance: xxxxxx] Command failed on instance. Return code: 11 Output: (TRUNCATED)...rubygems.org/........
Fetching additional metadata from https://rubygems.org/..
You need to install git to be able to use gems from git repositories. For help
installing git, please refer to GitHub's tutorial at
https://help.github.com/articles/set-up-git. 
Hook /opt/elasticbeanstalk/hooks/appdeploy/pre/10_bundle_install.sh failed. For more detail, check /var/log/eb-activity.log using console or EB CLI.
INFO: Command execution completed on all instances. Summary: [Successful: 0, Failed: 1].
INFO: New application version was deployed to running EC2 instances.
ERROR: Update environment operation is complete, but with errors. For more information, see troubleshooting documentation.
```

こんなのが出てしまい、調べてみると下記がヒット。

http://stackoverflow.com/questions/25967427/error-on-first-git-aws-push-to-elastic-beanstalk

そして以下も参考にしつつgitの設定を書く。

http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/customize-containers.html

.ebextensions/01-git.config

```yml
packages:
  yum:
    git: []
```

`eb logs`には世話になる。
AngularJSにおけるパーツ実装の持論（Directive、Controllerとng-Includeのソース分割の持論）

AngularJSのWebアプリを作る上でパーツに分けて実装することは当然発生し、その際に、DirectiveとControllerとng-includeをどう分割して使い分けするか？と迷いが生じることが必ず出てくる。

まだ、浅い実装経験の中で感じたポイントを簡単にまとめてみる。

* Directive
    * あったら便利なヘルパーやよく使う処理などを実装するのがいい感じ。
    * どちらかというと案件とプロジェクトを跨ぐような普遍的な機能の実装が望ましいと思う。
        * 例えば、最大30文字以上の文字列は「...」を末尾に付けて省略表示するみたいな。文字数などはconfigurationファイルに逃がすとかなどを行う。
    * Controllerに比べて、Karmaのユニットテストを実装し辛い
        * 個人的にはどういう風に実装するのか模索中でうまくいっていない
        * こんな記事もあったので考えてみたい: http://www.sitepoint.com/angular-testing-tips-testing-directives/
    * 修正箇所を追いにくい。
        * タグや属性名でgrepしたりしないとファイルの所在がわからないことが多そう

* ng-include
    * Directiveに比べると修正箇所（ファイルそのものも含めて）を探しやすい
        * 探しやすい理由は、パス指定でディレクトリ階層が明確になるから
    * 利用するとしたら顧客要望に直結した仕組みを実装するパーツとして利用する
    * Controllerを書くまでもないViewだけで済む処理を書くのが良い感じ
    * $scopeの取り扱いがControllerやDirectiveを利用した時に比べると簡単
　　* テストはProtractorなどe2eテストでやるしかない

* Controller
    * 言わずもがな各種制御につかえてテストもしやすい
    * 要望や依頼された機能を作る場合に実装するのがいい感じ。Karmaを介したテストコードも書きやすい。
    * 例えば、一覧画面の一覧表示出力など


### これまでの実装の流れ。

1. ng-controllerで、大枠を定義
    2. Routingを使うなら必然的にControllerを利用する。
    3. ng-controllerで動的エリアを定義する
    4. Controller内ではDIを経由して各種Serviceを利用
2. ng-repeatを使ってデータの種類に合わせて表示レイアウトが変わる場合、ng-includeを利用
3. ループで表示するデータの普遍的な加工が必要な場合、共通化できそうならDirectriveを実装する。共通化できないならTemplateで実装するかController側でメソッド実装する
4. 仕様にかかわるようなデータ加工は、ngResourceを利用してデータをResourceクラス経由で取得し、データ加工メソッドを実装する



Directiveに関しては利用方法を模索中。Protractorでテスト実装すること前提で今は、ngIncludeで十分と思ってしまっているため、今後のためにDirectiveも使えるようになるべく、AngularJSにかかわる作業を仕事でやってみたい。
設定はTUI(Text User Interface)で変更する

# TUI (Text User Interface)

ifcfg-ethXX の書式とか覚えられん。
ipコマンドも覚えられん。
サーバーなのにGUI使いたくない。
そもそも何も覚えられん。
手を抜きたい、楽をしたい、何も覚えたくない、何もしたくないんだよ...

要は、Text User Interface が便利だね、という話です。

# RHEL6/CentOS6 の IPアドレス変更

```shell-session
$ sudo system-config-network-tui
```

![system-config-network-tui.png](https://qiita-image-store.s3.amazonaws.com/0/11595/e4896a1d-b3d9-3a53-38b5-2138330c8c0a.png)

# RHEL7/CentOS7 の IPアドレス変更

コマンド短くなって本当に楽になった。

```shell-session
$ sudo nmtui
```

![nmtui.png](https://qiita-image-store.s3.amazonaws.com/0/11595/3bcb450a-c813-0a39-01a0-6f9827d7ea5b.png)


# 認証関連

```shell-session
$ sudo authconfig-tui
```

仕事場では、Active Directory、OpenLDAP, NIS も使ってたりするので重宝。

![authconfig-tui.png](https://qiita-image-store.s3.amazonaws.com/0/11595/55448dd7-e0d5-c6e2-9f51-a80f70882605.png)

# Firewall

firewalldはさっぱりわからん。だから今だにiptablesだ。そしておれは男らしくないので こいつでいったん設定してから/etc/sysconfig/iptablesを修正する。

```shell-session
$ sudo system-firewall-tui
```
![system-config-firewall-tui.png](https://qiita-image-store.s3.amazonaws.com/0/11595/bb7ce6bb-bb9c-d9c8-a09c-15fbc36cec3c.png)


# 起動サービス

checkconfig で事足りるが、キーボードを叩きたくない時もある。矢印キーだけで操作したい季節もあるんだ。
このTUI は RHEL6/CentOS6 では便利だが、RHEL7/CentOS7 ではとても悲しい気持ちになる。

```shell-session
$ sudo ntsysv
```

![ntsysv.png](https://qiita-image-store.s3.amazonaws.com/0/11595/b25dc454-a45f-b6ee-5ddb-031e968651ed.png)
wtf!!!!!!!!!!!!!!!!!!!!!!??????????????????

## tl;dr

`wtf`を使おう

## 概要（というか全部）

pryには`wtf`というコマンドがあります。これは最後に起こったエラーのバックトレースを数行表示してくれるものです。これだけでも便利ですが、バックトレースが全部欲しいときは`wtf!?`のように、`!`や`?`を後置するといけます。しかもこれ、いくつでも大丈夫です。なので、
`wtf!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!`
みたいに激怒しても、pryはいつもどおりにバックトレースを返してくれます。
理不尽なエラーに襲われたら盛大に激怒しましょう（そしてバックトレースを活用してデバッグしましょう）。

## おまけ
`wtf`をタイポすると、`NameError`が起きてしまい最後の例外が上書きされるので気をつけて…
GitのリモートリポジトリにSSHで使う時に便利なシェルスクリプト

プライベートなコードをVPS上に置く時に書いたシェルスクリプト．4年くらい使ってたやつを少し整理して公開．

# 前提条件

- SSH接続でgitを使っている
- Webインターフェイス入れるの面倒くさい or リポジトリ作るのにブラウザ操作したくない
- gitリポジトリにアクセスする専用のユーザ(もしくはSSH鍵)を使っている

Webインターフェイス欲しいと思う場合は素直にGithubライクな何かを用意するのが良いです．

(実際には一応Webインターフェイスもインストールしてますが１人開発用なので使っていなかった)

# git_wrapper.sh

``` sh
#!/bin/sh

LOG_FILE="./git_command.log"
GIT_DIR=./git

echo `date` org: $SSH_ORIGINAL_COMMAND >> $LOG_FILE
expr "$SSH_ORIGINAL_COMMAND" : "^git-" > /dev/null || exit

if REPO_NAME=`expr "$SSH_ORIGINAL_COMMAND" : "^git-receive-pack\\s\\+[\"']\\?/\\?\\([A-Za-z0-9_\\./\\-]\\+\\)[\"']$"`; then
  echo repo: $REPO_NAME >> $LOG_FILE
  # create if not exists
  if [ ! -d ./git/$REPO_NAME ]; then
    RET=`mkdir ./git/$REPO_NAME && cd $GIT_DIR/$REPO_NAME && git --bare init --shared && git update-server-info`
    echo $RET >> $LOG_FILE
  fi
fi

CMD=`echo $SSH_ORIGINAL_COMMAND | sed -e 's|^\(git[a-z-]\+\s\+["'\'']\?\)/\?|\1'$GIT_DIR'/|'`
echo exec: $CMD >> $LOG_FILE
sh -c "$CMD"
```

(おそらく，Linux + OpenSSH専用になってます．sedの細かい挙動とかは環境に合わせて読み替えて下さい)

## 使い方

上記のgit_wrapper.shを適当な場所に置いて，リモートのユーザの `.ssh/authorized_keys` に以下のような形式で公開鍵を追加．

```
command="~/git_wrapper.sh" ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAqxjaJAnG8l/aS7wA3XEYI3x0hJdZ4Qhol2xDrWfXCI5MnFHhiskkKTfjuGV22hqpD40wOx+YFiGk5RF3c9FbTdn+678YQUXJ4lDM1y9dRZ7jIF/30MiAxGvYyXe/8/oHZ3LuhGlGYPf6nl87ffkW8rIwEiBN1pYtLBUwCeL7XWWKxoECu3KzQlfYxKTEtMqjwm3C++lIod0RDYdoJ04z6qg8sFsk6kSoDwcvsCgPp9LzacbX9ktaaKd1lYq5zUMaXlADwftWv8TbAzEzMdzDfBaRa818FxxORkoH25/WPzEc4y6mWk2UFf1oXE6oMGomYiY7gAydL+fK/g/aaMmmwQ== binzume@kstm.org
```

`repos@example.com:test.git` 形式でも `ssh://repos@example.com:22/test.git` 形式でもリモートの~/git/test.gitにアクセスできます．特に，ssh:// だとポート番号を指定できる代わりにパスの先頭が`/`になるせいでフルパスを書かなければいけないのが解決します．

あと，存在しないリポジトリにpushすると自動的にリポジトリ作ります．gitコマンド操作だけで気軽にリポジトリ作ってpushできるので便利．

gitコマンド以外は拒否するので気軽に他の人のSSH鍵も追加してましたがチェック適当なので実は任意のコマンド実行できる(知り合いの鍵を追加するくらいなので十分だった)

# ただし

最近，[GitBucket](https://github.com/takezoe/gitbucket) を仲間内の開発用に使い始めたのでそっちに全部まとめるのを検討しています．なので個人的にはもうこれは不要になりそう．
ActiveAdminで各ページ共通でレイアウトの構成要素をいじる

## シチュエーション

ActiveAdminは特に何もしなくてもデフォルトのレイアウトが適用されてかなり見やすいページを作成できます。
ただ、たまに、そのレイアウトを一部変更したくなったりすることがあります。レイアウトのテンプレートファイルがどこかにあったりするわけではないので、普通には変更できません。

## 実装

例えば、全てのページのコンテンツの上にTwitterのボタンを置きたい場合。

```rb:lib/monkey_patches/active_admin/views/pages/base.rb
module ActiveAdmin
  module Views
    module Pages
      class Base
        def build_main_content_wrapper
          div id: "main_content_wrapper" do
            div id: "main_content" do
              para <<-'EOS'.html_safe
<a href="https://twitter.com/share" class="twitter-share-button">Tweet</a>
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>
              EOS
              main_content
            end
          end
        end
      end
    end
  end
end
```

## 解説

ActiveAdminの描画処理は、箇所ごとに分かれた描画コンポーネントが行っているので、これにモンキーパッチを当てます。
prependなりでスマートにできると良いのですが、コンポーネントの構成によって出来ない場合があり、その場合はこの例のようにメソッドを上書きしたりもします。（上記の例は、元々の処理からの変更はparaの一文を追加しているだけです）
パッチを当てるべきコンポーネントとメソッドは、当てる前のページの、該当の要素のidで、ActiveAdminのソースコードをgrepすれば、だいたいすぐわかります。
VBAHaskellの紹介 その15（引数の部分文字列のリストを取り出す）

「[関数プログラミング実践入門](http://www.amazon.co.jp/%E9%96%A2%E6%95%B0%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-%E2%94%80%E2%94%80%E7%B0%A1%E6%BD%94%E3%81%A7%E3%80%81%E6%AD%A3%E3%81%97%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AB-WEB-PRESS-plus/dp/4774169269)」に記載されている問題についての解説記事を別のところで見かけた。解説が面白かったし、VBAHaskellで実装を試みるのに手頃だったのでやってみたが、あまりいい結果にはならず課題が残った。

`segments` という関数で、引数に文字列を渡すと部分文字列のリストが取り出せる。例えば "ABC" に対して、["A","AB","ABC","B","BC","C"] を出力するものだ。
本に載っている実装は以下のものらしい。

```hs
segments :: [a] -> [[a]]
segments = foldr (++) [] . scanr (\a b -> [a] : map (a:) b) []
```

構成要素をまとめるとこうなる。

|     言語要素       |  VBAHaskell          |今回の実装 |
|:------------------|:------------ |:--------|
|foldr, scanr     | foldr, scanr [^1] | - |                       
|リスト結合 (++)   | catV 関数 [^2]   | - |
|リスト生成演算(:) |     なし        | 新規作成|
|関数合成 .        | 不十分          | 処理を分ける |
|ラムダ式 \        |  不十分      |独立した関数にする |

これを実装するためにやったことは以下の通りだが、VBAHaskellの合成関数の仕組みでは今回の問題に対応するには不十分だということがわかった。

1. Haskellで`cons`と呼ばれているリスト生成演算を用意していなかったので、標準関数として[Haskell_4_vector.bas](https://github.com/mYmd/VBA/blob/master/Haskell_4_vector.bas)モジュールに `cons` 関数を追加した。これは別に問題ではない。
2. Haskellの文字列は文字のリストだが、VBAはそうではないため、結果表示のとき配列を文字列に変換する必要がある。`foldl`を使ってやればできるが、効率面も考えて [StdFunモジュール](https://github.com/mYmd/VBA/blob/master/Haskell_2_stdFun.bas) に配列要素を連結する関数 `joinFun` を実装した（VBA組み込み関数 `Join` 相当）。これも問題ない。
3. ラムダ式　`\a b -> [a] : map (a:) b` 　の内部にある`map (a:) b` が問題になった。インラインでは書けず、以下の関数を実装することになった。

```vbnet
' \a b -> [a] : map (a:) b のうち、
' map (a:) b の部分
Function consMap(ByRef a As Variant, ByRef v As Variant) As Variant
    consMap = mapF(p_cons(a), v)
End Function
    Function p_consMap(略
```
これらを準備して、以下のようなプログラムを書いた。[^3]

```vbnet
a = Array("A", "B", "C", "D", "E")
'   [a] : map (a:) b  の部分
f = p_cons(p_makeSole, p_consMap(ph_1, ph_2))         ' ポイント1
'   foldr (++) []  と  scanr f []  の実行
m = foldr(p_catV, Array(), scanr(f, Array(), a))      ' ポイント2
'   文字列として表示
printM mapF(p_join(, ""), m)
'A  AB  ABC  ABCD  ABCDE  B  BC  BCD  BCDE  C  CD  CDE  D  DE  E
```
「ポイント1」のところで、特化した関数`consMap`を組み込んでいる。「ポイント2」のところでは、`foldr`と`scanr`に実引数を与えて実際に評価してしまっていて、事前にひとまとまりの関数として定義できていない。
VBAHaskellで実装している関数合成はスコープがフラットで、すべてのプレースホルダに実引数を渡して一斉に評価することしかできないのが問題で、このままでは本物のラムダ式からはほど遠い。

[VBAHaskellの紹介 その14（変数のムーブ）](http://qiita.com/mmYYmmdd/items/5f5ef2ff2d48489dc0cb)
[VBAHaskellの紹介 その13（プレースホルダの追加：_1と_2）](http://qiita.com/mmYYmmdd/items/2988b653c3dc3d5e01e0)
[VBAHaskellの紹介 その1（最初はmapF）](http://qiita.com/mmYYmmdd/items/c731edf943acc0a0ebe9)

[^1]: [Haskell_0_declareモジュール](http://qiita.com/mmYYmmdd/items/2988b653c3dc3d5e01e0) に宣言
[^2]: [Haskell_4_vectorモジュール](https://github.com/mYmd/VBA/blob/master/Haskell_4_vector.bas)で実装
[^3]: [テストモジュール](https://github.com/mYmd/VBA/blob/master/test_module.bas) に サンプル`segmentsTest` として追加
exit時にensureが実行されてしまう

ensureは超強い

```rb
begin
  exit
rescue => e
ensure
  p "終了処理"
end
```

上記処理では「終了処理」の表示がでてしまう。
''exit''で後続の処理をすべて中断することを期待していた。

```rb
begin
  exit! # エクスクラメーションマーク付き
rescue => e
ensure
  p "終了処理"
end
```
上記コードではensureブロックは実行されない。
コマンドの標準出力を Emacs で見る

# はじめに

Emacs 使いなら、長ーいコマンドの出力とか Emacs で見たいですよね？
そんなときのための設定です。

# 設定

```zsh:~/.zshrc
function emacsview(){
    emacsclient -n =(<&0)
}
```

プロセス置換を使うことで、一時ファイルの名前や後始末など面倒なことを考える必要がなくなります。

# 使い方

例えば diff の出力を Emacs で見るときは

```shell-session
diff -uw FILE1 FILE2 | emacsview
```

とか。よく使う場合はグローバルエイリアスにしておくと良いです。
CordovaでWKWebViewを使う

Apache Cordovaでは、iosのWebViewは現状（2015/5/27時点）**UIWebView**となりますが、
プラグインを使うことで、**WKWebView**を使うことが可能になります。

[Cordova WKWebView Engine](https://github.com/apache/cordova-plugins/tree/master/wkwebview-engine)

使い方は上記ページに書いてある通りですが、特に重要なのは以下の2行です。

`cordova platform add ios@4.0.x --usegit`
`cordova plugin add https://github.com/apache/cordova-plugins.git#master:wkwebview-engine`

これでiOS8.0以降ではWKWebViewが使われるようになります。

`CDVViewController`クラスの、`createGapView`メソッドあたりでデバッグしてみると、
実際にWKWebViewが使われていることがわかります。

![image](https://qiita-image-store.s3.amazonaws.com/0/19872/c2cd65ea-d425-1c9f-a836-53c1715741c2.png)

WKWebViewはいずれCordova本体に取り込まれ、プラグイン不要になると思いますが、
それまではプラグインに頼ることになります。

以上です。
初めてPHPでアプリ開発するときにチェックしておくと良さ気なドットインストールの講座一覧


CakePHPを使ったアプリの作りかたを教える機会があったので、そのメモです。

プログラミング初心者の人が、CakePHPでアプリ開発にチャレンジする上で、一度はチェックしておいた方が良さそうなドットインストールのレッスンをまとめてみました。

上から順に進めて行けば、ざっくりと開発の流れがつかめるかと思います。



##HTML

HTML入門
http://dotinstall.com/lessons/basic_html_v3

CSS入門
http://dotinstall.com/lessons/basic_css_v3

##開発環境構築
Chrome Developer Tools入門
http://dotinstall.com/lessons/basic_chrome_dev_v2

ローカル開発環境の構築 [MacOS X編] 
http://dotinstall.com/lessons/basic_localdev_mac

ローカル開発環境の構築 [Windows編]
http://dotinstall.com/lessons/basic_localdev_win

##Linux

UNIXコマンド入門 (一般ユーザー編)
http://dotinstall.com/lessons/basic_unix

vim入門 
http://dotinstall.com/lessons/basic_vim

##PHP

PHP入門（基本編）
http://dotinstall.com/lessons/basic_php_beginner

PHP入門（応用編）
http://dotinstall.com/lessons/basic_php_advanced

PHP演習：
http://dotinstall.com/lessons/search#!/filter/%E3%83%9F%E3%83%8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0+PHP
##Database

MySQL入門
http://dotinstall.com/lessons/basic_mysql_v2

##Git

git入門
http://dotinstall.com/lessons/basic_git

##アプリ開発

CakePHP入門
http://dotinstall.com/lessons/basic_cakephp

デザインをかっこ良くしたり、リッチな動きを付けたい場合は
↓
Bootstrap 3.0入門
http://dotinstall.com/lessons/basic_twitter_bootstrap_v4

JavaScript入門
http://dotinstall.com/lessons/basic_javascript_v2

jQuery入門
http://dotinstall.com/lessons/basic_jquery_v2
R as kidpics


お絵描きソフトの使い方すぐ忘れる

データ読み込んでヘッダを修正する

```
d<-read.delim("./col3.flatten.list")
colnames(d)<-c("value")
```

ラベル長すぎるから適当に置換して\nを入れて改行させる

```
d$value <- sub("-( | )", "\n ", d$value)
```

カウントごとにbarplot並べるためにソートしたやつをggplotに食わせる

```
p <- ggplot(d, aes(x=reorder(value,value,function(x)-length(x))))
p <- p + geom_bar(binwidth=.1)
```

日本語はデフォルトで文字化けする

```
p <- p + theme_bw(base_family = "HiraKakuProN-W3")
```

長いラベルは回転させたりとかしないで横にすればいい

```
p <- p + coord_flip()
```

文字の大きさとタイトルを修正

```
p <- p + theme(text = element_text(size=10))
p <- p + labs(title="Sessions of Interest", x="talks")
```
PHPアプリケーションからDatadogにメトリクスを飛ばす


[第90回PHP勉強会](https://phpstudy.doorkeeper.jp/events/24912)でLTしてきた

# Datadog のココが良い

* CloudWatch Read権限渡せば **すぐに始められる**
* エージェント型で **リアルタイムに** メトリクス送れる
* アプリケーションからのメトリクス送信も簡単
* ビジュアライズも簡単
* $15/host/month とこの手のサービスにしては **安価**

(価格などは、逐次[本家](https://www.datadoghq.com/)を参照してください。念のため)

# Getting Started

## エージェントをインストール

サインアップすると、OS 毎のインストールガイドがあるので、それに従えば OK

![datadog_install.png](https://qiita-image-store.s3.amazonaws.com/0/1329/d3e88d86-824b-3c65-0a20-63c35dd29e53.png "datadog_install.png")

## PHP 向けのクライアントライブラリを入れる

```
composer require datadog/php-datadogstatsd:0.1.*
```

## メトリクス送信

本家のライブラリは Autoloader に対応していないので、個別に require してやる必要がある

```php
require '../vendor/datadog/php-datadogstatsd/libraries/datadogstatsd.php';

DataDogStatsD::increment('your.data.point');
```

本家から fork したリポジトリを追うと、Autoload 対応したものもあるようなので、いずれ本家に取り込まれるかもしれない

# 何を送るか

## 処理リクエスト(PHPプロセス)数

* REQUEST_URI毎にInrementを送る

```php
DataDogStatsD::increment('php.process_count', 1, ['path' => strtok($_SERVER['REQUEST_URI'], "?")]);
```

## プロセス毎処理時間

* shutdown処理内でTimingを送信
* REQUEST_URI毎に応答時間を集計

```php
$script_start_time = microtime(true);

register_shutdown_function(
    function() use ($script_start_time) {
        DataDogStatsD::timing('php.process_time', microtime(true) - $script_start_time, 1, ['path' => strtok($_SERVER['REQUEST_URI'], "?")]);
    }
);
```

1つ上の php.process_count は、 php.process_time.count としても集計できる

## アプリケーションログ

* ログ毎に適当な命名でEventを送る
* alert_type や aggregation_key を併せて送れば、通知や集計にも使える

```php
DataDogStatsD::event("Registered User", ['text' => "新規ユーザー登録だよー"]);
```

現状、event は UDP -> エージェント経由での送信に対応していないので、直接 HTTP で送ることになる。同期処理になるのでパフォーマンス注意。

# 参考

* [Getting Started with DogStatsD](http://docs.datadoghq.com/guides/dogstatsd/)
* [Datadog の日本語情報](https://www.datadoghq.com/jp/)
Flumeを使いMac上でTwitterのツイートを取得する

Apache Flume 1.5.0 で Twitter Source が入ったので、Twitter から簡単にデータを取得することができる。(注: Experimental のため利用には十分注意すること)
この記事ではMac上で簡単に試すための方法を紹介する。

# 環境

* Flume バージョン: CDH 5.4.2 (1.5.0 ベース)
* OS: Mac OS X 10.10.3

# 準備

## ファイルのダウンロード
[Cloudera のリポジトリ](http://archive.cloudera.com/cdh5/cdh/5/)からFlumeのtar.gzを取得する。 [最新版へのリンク](http://archive.cloudera.com/cdh5/cdh/5/flume-ng-latest.tar.gz)
適当な場所に Flume を設置し、展開する。私は `~/lib/flume` にしている。

次に `avro-tools` をインストールする。

```bash
$ brew install avro-tools
```

## Twitter API キーとアクセストークンの取得
https://apps.twitter.com/ から取得する。取得の仕方はググってください。
以下の4つが必要。

* consumer key
* consumer secret
* access token
* access token secret

## 設定ファイルの作成

適当なファイルを作る。ここでは `~/etc/flume/twitter.conf`とする。
以下の情報を入力する。

```
# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1

# Describe/configure the source
a1.sources.r1.type = org.apache.flume.source.twitter.TwitterSource
a1.sources.r1.channels = c1
a1.sources.r1.consumerKey = YOUR_CONSUMER_KEY
a1.sources.r1.consumerSecret = YOUR_CONSUMER_KEY_SECRET
a1.sources.r1.accessToken = YOUR_ACCESS_TOKEN
a1.sources.r1.accessTokenSecret = YOUR_ACCESS_TOKEN_SECRET
a1.sources.r1.maxBatchSize = 50000
a1.sources.r1.maxBatchDurationMillis = 100000

# Describe the sink
# a1.sinks.k1.type = logger
a1.sinks.k1.type = file_roll
a1.sinks.k1.sink.directory = /tmp/flume-log
a1.sinks.k1.sink.rollInterval = 120

# Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.capacity = 10000
a1.channels.c1.transactionCapacity = 1000

# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
```

## データの保存ディレクトリの作成
この例では `/tmp/flume-log` にデータを保存するのでディレクトリを作っておく。

# ログの取得と閲覧

## Flume の起動

`~/lib/flume` に移動して以下のコマンドを実行すればログの収集が始まる。

```
$ bin/flume-ng agent -n a1 -c conf -f ~/etc/flume/twitter.conf -Dflume.root.logger=INFO,console -Xmx1g
```

## avro-tools によるログの閲覧

Avroはスキーマつきのシリアライザ。Avro形式のままHiveにスキーマを認識させてデータをロードさせたりすることも可能。
ローカルで内容を閲覧するにはデシリアライズするための何らかのツールが必要となる。
ここでは `avro-tools` を使う。


`/tmp/flume-log` の下に移動し、生成されたデータを `avro-tools` で読む。

```bash
$ avro-tools tojson --pretty 生成されたファイル | less
```

これで中身をjson形式で読むことができる。

スキーマ情報を見たい場合は `avro-tools getschema` コマンドを使う。

```bash
$ avro-tools getschema 生成されたファイル
```

スキーマはjson形式で保持されているので閲覧は簡単。


# 参考

[Flumeユーザガイド: Twitter 1% firehose Source](https://flume.apache.org/FlumeUserGuide.html#twitter-1-firehose-source-experimental)
webpackでライブラリを作る


webpack使ってCommonJSで書いているJSの関数をライブラリとして外部に公開したい場合には、`ouput.library`オプションと`output.libraryTarget`オプションを設定し、ビルドする。

```js:webpack.config.js
module.exports = {
  entry: {
    index: './index'
  },
  output: {
    path: __dirname,
    filename: "[name].bundle.js",
    library: "Hoge",
    libraryTarget: "umd"
  }
};
```
```js:index.js
exports.hello = function (name) {
  console.log("Hello, " + (name || ""));
}
```

JSはこんなかんじで、webpackを実行しビルドすると上記の`webpack.config.js`の場合、index.bundle.jsが出力される。

```
// index.bundle.jsが出力される
$ webpack
```

scriptタグでindex.bundle.jsを読み込むと、`Hoge.hello`にindex.jsのhello関数が定義されている。

```html
<body>
	<script src="index.bundle.js"></script>
	<script>
		Hoge.hello('pirosikick'); // "Hello, pirosikick"とコンソールに出力
	</script>
</body>
```

## 公開するネームスペースを深くしたい場合

上記の例をちょっと変更して、`Hoge.Fuga.hello`のようにネームスペースを深くしたい場合は、`output.library`に配列を渡せばよい。

```js:webpack.config.js
module.exports = {
  entry: {
    index: './index'
  },
  output: {
    path: __dirname,
    filename: "[name].bundle.js",
    library: ["Hoge", "Fuga"], // ここを配列にする
    libraryTarget: "umd"
  }
};
```

`[name]`とすれば、entryオプションで指定しているキーの部分が動的に使用される。（上記例だと`index`）

```js:webpack.config.js
module.exports = {
  entry: {
    index: './index'
  },
  output: {
    path: __dirname,
    filename: "[name].bundle.js",
    library: ["Hoge", "[name]"], // Hoge.index.helloになる
    libraryTarget: "umd"
  }
};
```

## output.libraryTargetについて

`output.libraryTarget`は下記の6つから選べる。

- var
- umd
- this
- amd
- commonjs
- commonjs2

bowerなどで公開してscriptタグで読み込む場合は、`var`か`umd`でよさげ。

varは名前そのまんまでvarで定義される

```js
var Hoge = (ここに定義）
```

umdは[ここ](https://github.com/umdjs/umd)に詳しく書いているが、AMDとかCommonJSとかよく使うやつにだいたい対応した感じで出力してくれる。

## 参考リンク

- [公式](http://webpack.github.io/docs/library-and-externals.html)
- [公式その２](https://github.com/webpack/webpack/tree/master/examples/multi-part-library)
Macを購入してとりあえずやったこと


## 1. アカウント設定

* ユーザ追加
* パスワード設定


## 2. これがないとやっていけないものインストール

* chrome
* 1password（お試し）
* [caffeine](https://itunes.apple.com/jp/app/caffeine/id411246225?mt=12)
* [xtrafinder](https://www.trankynam.com/xtrafinder/)
* photoshop 
* editor([atom](https://atom.io/)を新規投入)

__注）rubyはデフォで入っている。__

```
$ ruby -v

 ruby 2.0.0p481 (2014-05-08 revision 45883) [universal.x86_64-darwin14]
```

## 3. 開発環境系

### xcodeインストール



### brew インストール

http://qiita.com/hirokishirai/items/e38b29a7075459ff6032

* brewでインストールしたもの -> [brew list](http://qiita.com/kaiya_ma/private/b2731869d30de1b47531)

### itermインストール

https://www.iterm2.com/
[ここ](https://www.iterm2.com/)からダウンロードしてインストール

### zshインストール（brew経由）

##### 1. 現在のシェルを確認

```bash:現在のシェルを確認
$ dscl localhost -read Local/Default/Users/$USER UserShell
UserShell: /bin/bash
```

##### 2. brewでzshをインストール

```bash:インストール
$ brew install zsh --disable-etcdir
$ brew install zsh-completions
```

##### 3. /etc/shellsにパスを追加

```bash:パスを追加
$ sudo sh -c "echo '/usr/local/bin/zsh' >> /etc/shells"
Password:
$ cat /etc/shells 
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/sh
/bin/tcsh
/bin/zsh
/usr/local/bin/zsh
```

##### 4. シェルを切り替える

```bash:シェルを切り替え
$ chsh -s /usr/local/bin/zsh
```
ターミナルを再起動

##### 5. 確認

```bash:現在のシェルを確認
$ dscl localhost -read Local/Default/Users/$USER UserShell
UserShell: /usr/local/bin/zsh
```

##### 6. 補完機能をオンに

```zsh:.zshrc
# 補完
# for zsh-completions
fpath=(/usr/local/share/zsh-completions $fpath)
```

```zsh:ターミナル：補完機能を有効にする
autoload -Uz compinit
compinit -u
```

参考：
http://www.d-wood.com/blog/2014/03/14_5816.html
http://qiita.com/ykirishima/items/f85902c6039f07d07d48
Java8で「ソフトウェアエンジニアならば1時間以内に解けなければいけない5つの問題」の5問目を解いてみた

既出だけど「[1時間以内に解けなければプログラマ失格となってしまう5つの問題が話題に](http://www.softantenna.com/wp/software/5-programming-problems/)」の問題5をJava8でやってみた。

> 1,2,…,9の数をこの順序で、”+”、”-“、またはななにもせず結果が100となるあらゆる組合せを出力するプログラムを記述せよ。例えば、1 + 2 + 34 – 5 + 67 – 8 + 9 = 100となる

```java:
    public static void main(String[] args) {
        f(values(1, 9))
                .filter(exp -> sum(exp) == 100)
                .forEach(System.out::println);
    }
    
    /**
     * sからeまでの連続した数値のリストを返す。
     */
    static List<Integer> values(int s, int e) {
        return IntStream.rangeClosed(s, e)
                .mapToObj(Integer::valueOf)
                .collect(Collectors.toList());
    }
    
    /**
     * 数値のリストから数式の全組み合わせを作成して、文字列のストリームで返す。
     * 例：[1, 2] -> ["1 +2",　"1 -2",　"12"]
     */
    static Stream<String> f(List<Integer> vals) {
        if (vals.size() == 1) return Stream.of(vals.get(0).toString());
        return Stream.of(" +", " -", "")
                .flatMap(op -> f(vals.subList(1, vals.size()))
                        .map(x -> vals.get(0).toString() + op + x)
                );
    }
    
    /**
     * 合計値を返す。
     */
    static int sum(String exp) {
        return Arrays.stream(exp.split(" "))
                .mapToInt(Integer::parseInt)
                .sum();
    }
```

```:結果
1 +2 +3 -4 +5 +6 +78 +9
1 +2 +34 -5 +67 -8 +9
1 +23 -4 +5 +6 +78 -9
1 +23 -4 +56 +7 +8 +9
12 +3 +4 +5 -6 -7 +89
12 +3 -4 +5 +67 +8 +9
12 -3 -4 +5 -6 +7 +89
123 +4 -5 +67 -89
123 +45 -67 +8 -9
123 -4 -5 -6 -7 +8 -9
123 -45 -67 +89
```
StoryboardやXib読み込み用ヘルパー関数


# 使い方

+ Storyboard

```swift

class MyViewController: UIViewController {
    var myProp: Int = 0
}

extension MyViewController: Storyboardable {
    
    class var storyboardIdentifier: String { return "MyViewController" }
    class var storyboardName: String { return "MyStoryboard" }

}


let vc = from_storyboard(MyViewController.self)
vc.myProp = 1

```

+ Xib

```swift

class MyView: UIView {
    var myProp: Int = 0
}

extension MyView: Xibable {
    class var xibName: String { return "MyView" }
}


let view = from_xib(MyView.self)
view.myProp = 1
```


# 実装

```swift
protocol Storyboardable {
    
    static var storyboardIdentifier: String { get }
    static var storyboardName: String { get }
}

func from_storyboard<T: AnyObject where T: Storyboardable>(clazz: T.Type) -> T! {
    
    let identifier = T.storyboardIdentifier
    let name = T.storyboardName
    
    let storyboard = UIStoryboard(name: name, bundle: nil)
    return storyboard.instantiateViewControllerWithIdentifier(identifier) as? T
}

protocol Xibable {
    
    static var xibName: String { get }
}

func from_xib<T: AnyObject where T: Xibable>(clazz: T.Type, owner: AnyObject? = nil, options: [NSObject: AnyObject]? = nil, atIndex index: Int = 0) -> T! {
    
    let name = T.xibName

    let xib = UINib(nibName: name, bundle: nil)
    return xib.instantiateWithOwner(owner, options: options)[index] as? T
}

```
【Swift】mobile backend を利用したpush通知

##概要
Swiftでニフティさんのmobilebackendというpush通知を行うサービスを検討してテストしたので備忘録として

##参考
ニフティクラウド mobilebackend http://mb.cloud.nifty.com/
mobile backendを使ってSwiftでプッシュ通知 http://qiita.com/niftycloud_mb/items/1ba9784dfe3228a18f03

##通知できるまで
###cocoaPodでFrameworkを追加してもエラーでビルドできない
僕の環境　Xcode 6.3　ios8.0　だと
include of non-modular header inside framework module 'NCMB.NCMBURLConnection'
ってエラーが発生しました。

Objectiv-Cは全然わかりませんが、とりあえず検索して
`#import <CommonCrypto/CommonCrypto.h>`がヘッダーにあると動かないみたいなので

Pods/Pods/NCMB/NCMBURLConnection.hの
`#import <CommonCrypto/CommonCrypto.h>`を

Pods/Pods/NCMB/NCMBURLConnection.mの
インポート部分に書き換えました。

その後普通に
import NCMBで動作するようになりました。


###プロビジョニングファイルも変えなきゃだめなのか？
プロビジョニングファイルについての記述があったけどマニュアルには方法が書いてなかったので迷いました。
インストールしなおしたけど、APNsの証明書ではプロビジョニングファイルが作れないみたいなので
そのまま実機でテストしているのならば特に必要のない処理みたいでした。

プロビジョニングファイルがChromeだと生成できなくてSafariで生成する必要がある、ってのにも時間を取られました。


###なんかデバイストークンが送られない
![image](https://qiita-image-store.s3.amazonaws.com/0/69919/99c4b3b8-f5cd-4a0c-c8c4-30da468d6295.png)
TARGETSのBackgroundModesのRemote notificationsをオンにする必要があるようです。



##今後
テストで動かしてみようかと思います。
今後自作する可能性もありはするので、インターフェースとか参考にするかも。
babun(Cygwin)でTeX日本語環境をインストールする

# はじめに
babun環境でTeXを入れいようとしたら思いの外はまってしまったので備忘録を兼ねて記載します。
あくまで私の環境で発生したことなのでこれでうまくいくとは思いません。(むしろ調べた感じCygwin環境でここまではまってたのは他にいなかった)

だらだら状況説明しながら書いてるので手っ取り早く解決策だけ知りたい人は最後尾の[まとめ](#まとめ)だけ見てね

## 環境
OS : Windows 8.1 64bit
Cygwin : babun 1.1.1
導入TeX : pLaTeX

自分はbabunというCygwinをラップした環境を使っているけど生のCygwinを使ってapt-cygを使ってもだいたいおんなじ感じだと思います。

# ハマった現象
babunのpact(パッケージマネージャ)でtexliveを使ってpLaTeX始めTeXを入れようとしたらまともに動かなかった。
まずtexlive自体のインストールでも一度コケる。
本体自体はインストールされ瑠葉になってlatex、platex等はパス通るようになっても、いざコンパイルしようとしたら「I can't the format file find 'latex.fmt'」と出てきて止まってしまう。
調べてみてもなかなか答えが見つからなかった。

# 解決策
幾つか問題があったので順番に説明

## インストールでコケる問題
texlive自体のインストールは下記コマンドで出来る。

```
pact install texlive
```

これでtexlive本体とtexlive-collection-basic(この中に基本的なTeXエンジンが入ってる)が導入されるはずだが途中でパスが通ってないからファイルがないよって怒られる。
具体的には「TEXMFMAIN」と「TEXMFCNF」という環境変数でこれ以下にあるファイルを参照しようとした時にエラーが出る。
これは次のように打てば解決する。

```
texconfig rehash
```

こうすることによってtexliveで管理されている場所を認識させることができるみたい。(よく理解できていない)
ちなみにTEXMFMAINは「/usr/share/texmf-dist」でTEXMFCNFは「/usr/share/texmf-dist/web2c」になると思う。
texlive-collection-basicのところでエラーが出てたから上記コマンドを打ったあともう一回入れなおす。

```
pact update texlive-collection-basic
```

これでエラーなく導入は完了するはず。

## pLaTeXの導入
次にpLaTeXを入れた時におかしくなるのだがそこまで導入手順を説明する。

```
pact install texlive-collection-langjapanese
```

これで日本語TeX環境の導入ができる。
このパッケージにはtexlive-collection-langcjk(日中韓言語パック)に依存していて、cjkの方にpTeXが、japaneseの方にpLaTeXが入っている。
巷の資料をググったところcjkだけでpLaTeX使えるって記述が多いからもしかしたら最近分割されたのかも

## latex.fmt、platex.fmt等がないと怒られる
上記の通りインストールするとplatexコマンドまで使えるようになる。
なので適当にサンプルを作ってコンパイルさせようとしたところはじめに述べたとおり「I can't find the format file 'platex.fmt(latex.fmt)'」(ファイル名はどのTeX動かすかで変わる)とエラーが出る。
調べても英語ばかりでしかも解決しない……
いろいろ試していて3回位入れなおしたけどダメだった。
英語サイト読み漁りながら複数のサイトの記述を結び合わせてやっと解決策を見つけた。

### なぜlatex.fmt等がないのか
正しい動作では各パッケージをインストールすると自動でビルドされてfmtファイルが作成されるらしい。
しかし何らかの原因でビルドしていないらしい。

### どういう手順で生成されるのか(手動でできるのか)
下記コマンドを打つと生成処理が走るっぽい
``` fmtutil-sys --all ```
実際に走らせてみるとなんかfmtが生成されてるっぽいんだけどtex.fmtとかpdftex.fmtとかだけでLaTeX関係のものが作られない……
ここでかなり悩んだ。

### fmtutil-sysはどこを見てるか
何らかのファイルをビルドしてfmtにしてるはずだからどこかに元ファイルがあるはず
調べたら「/usr/share/texmf-dist/tex/」以下を参照しているみたい。
見てみるとlatexディレクトリやplatexディレクトリちゃんとある。
でもそれらはfmtutilとかから見えてないっぽい。
更に調べてたら下記のような記述を発見
http://0xcc.net/misc/mktexlsr.html
このサイトによるとmktexlsrというコマンドでファイルを管理しているから追加された時に実行する必要がある。
本来ならおそらくインストールのタイミングで自動実行されるんだろうけどうまく言っていないみたい。
ということで

```
mktexlsr
fmtutil-sys --all
```

お、ログ見るとちゃんと生成されてるっぽい。
実際にファイルは「/var/lib/texmf/web2c/」にある。

これで再度サンプルをコンパイルするとDVIファイルが生成されてdvipdfmxでPDFにもできた！

# まとめ
だらだらと長い記述になったのでやったことおさらい

* 本体インストール

```
pact install texlive
```
* 環境変数？認識

```
texconfig rehash
```

* pLaTeXインストール

```
pact install texlive-collection-langjapanese
```

* 追加ファイル認識

```
mktexlsr
```

* fmtファイル生成

```
fmtutil-sys --all
```

以上
なにかおかしなとこなどありましたらコメントください。
CoffeeScript中でCoffeeScriptをコンパイルする（shebangも良い感じに）

#CoffeeScriptで色々やる
まあ、なんつーか、色々なことをやりたくなるものです。で、今回は、CoffeeScriptでCoffeeScriptをコンパイルする仕組み。goldblendの最新版は、自分自身をコンパイルする機能を付けたので、そこからの抜粋です。その際、ちょっと工夫したい点は、shebang行の変換。そのへんは最初に正規表現で切り取って、書き出しの際にcoffee -> nodeに置換して付け加えています。

また、shebang行があると言うことは、実行権限が欲しいわけで、実行権限も付与しておきたいところですね。ただしここで、ついでにTIPS。なんか、fs.writeFileで、{mode: 0o0755}とか指定しても、実行可能ファイルは作れません。サンプルのように、fs.chmodで実行権限を別に付与して下さい。

では。

```coffeescript:compile.coffee
fs = require('fs')
coffee = require('coffee-script').compile

compile = (coffeefile) ->
  read = fs.readFileSync coffeefile,'utf8'
  shebang = read.match(/^#!.*\r?\n/)
  if shebang?
    shebang = shebang[0]
    read = read.replace(shebang,'')
    shebang = shebang.replace('coffee','node')
  jssrc = coffee read,{bare:true}
  if shebang?
    jssrc = shebang+"\n"+jssrc
    jsfile = coffeefile.replace(/\.coffee$/,'')
  else
    jsfile = coffeefile.replace(/coffee$/,'js')
  fs.writeFileSync jsfile,jssrc,'utf8'
  if shebang?
    oldmask = process.umask 0
    fs.chmodSync jsfile,0o0755
    process.umask oldmask
```
hubotのscriptをbabelで書きたいので"babel/register"を使う


coffeescriptもうあんま覚えてないしhubotのスクリプトもそろそろbabelで書きたかったのでどうにかした。

結論としては単に`require("babel/register")`すればよかった。
[electronで似たようなこと](http://qiita.com/suisho/items/a3822167604e5ad6c19b)をした時とだいたい着想は一緒。
あとはhubot-scriptはfunctionなので`robot`をパスしてやれば良いだけ（のはず）

```script/some-script.coffee
require("babel/register")
module.exports = (robot) ->
  require("../lib/babel-script")(robot)
```

呼び出され側はこんな感じ

```lib/babel-script.js
export default function(robot){
  robot.hear(/badger/i, (res) => {
    res.send("Badgers? BADGERS? WE DON'T NEED NO STINKIN BADGERS")
  })
}
```
GlassFishのコマンドラインのメモ

Jenkinsがずっとwinstone上で動いててかわいそうだったのでGlassFish上で動かすようにした。その際GlassFishのコマンドラインの仕組みがちょい謎で理解するのに若干時間がかかったのでメモしておく。
以下、$GLASSFISH_DIRは適宜読み替える。

# 新たなドメインを作成する
http://docs.oracle.com/cd/E19776-01/820-4497/6nfv6jlis/index.html
```$GLASSFISH_DIR/bin/asadmin create-domain --portbase {ポート番号} --domaindir {新たなドメインの中身を配置するディレクトリ} {ドメイン名}```

* portbaseを指定すると、{指定した番号+48}がadminポート、{指定した番号+80}がinstanceのポート、のように割り振ってくれる(--adminportとか--instanceportで個別に指定することもできる)
* domaindirを指定しない場合はglassfish($GLASSFISH_DIR/glassfish/domainsとか)の中にドメインのルートディレクトリが作成される

# 作成したドメインに対する管理コマンド発行
そのドメインに対してというかそのドメインのadminポートに向かってコマンドを発行するような感じになる。
以下、上記portbaseで指定した番号+48を$ADMIN_PORTとする

## デプロイ
```$GLASSFISH_DIR/bin/asadmin --host localhost --port $ADMIN_PORT deploy {warへのパス}```

## JVMオプション追加
```$GLASSFISH_DIR/bin/asadmin --host localhost --port $ADMIN_PORT create-jvm-options -D{name}={val}```

# 作成したドメインの起動、停止
なぜかdomaindirとdomain名の両方を指定しないといけなくて少々面倒

## 起動
```$GLASSFISH_DIR/bin/asadmin start-domain --domaindir {さっき指定したやつdomaindir} {さっき指定したドメイン名}```

## 停止
```$GLASSFISH_DIR/bin/asadmin stop-domain --domaindir {さっき指定したやつdomaindir} {さっき指定したドメイン名}```
[Rails App] Bootstrapの開発環境を自動的に作る (bootstrap-generators)

### [>>> デモサイトはこちらです <<<](https://yuto-bootstrap-environment.herokuapp.com/)

*参考*
[bootstrap-generators](https://github.com/decioferreira/bootstrap-generators)

**この記事は早くBootstrapの開発環境を作る方法をご紹介させていただきます。**

```ruby:Gemfile
gem 'bootstrap-sass'

group :development do
  gem 'bootstrap-generators'
end
```

### Bootstrapをインストール

`rails g bootstrap:install [オプション]`

### オプション
`-e=erb/haml/slim`　デフォルトは「ERB」
`-se=css/scss/less` デフォルトは「SCSS」

**ERB以外の場合、views/layouts/application.html.erbを削除してください。**

**テストの為にScaffoldを作ります** 
`rails g scaffold Article title content:text && rake db:migrate`

そして、アプリを実行するとこのようになります。
![スクリーンショット 2016-12-17 23.52.41.png](https://qiita-image-store.s3.amazonaws.com/0/35605/aeab0cbf-fde1-4c08-5541-e5dc9586b324.png)