OmniAICreator/Qiita-1.07M huggingface dataset:
GroovyのRangeを理解する

[GroovyとRubyのRangeの違い](http://qiita.com/PoohSunny/items/3d8e1085f7d01b3c9e1d)を前に書きましたが、その関係でGroovyのRangeについても調べたのでまとめます。

# 基本
## ドキュメント

* http://groovy-lang.org/groovy-dev-kit.html#Collections-Ranges

## Rangeとは
シーケンシャルな値のリストを保持できるもの。`java.util.List` を拡張しているので、Listっぽいアクセスの仕方ができる。
ちなみに、Range自体はインターフェースで、実装としては `EmptyRange`, `IntRange`, `ObjectRange`がある。

# インスタンス生成
## 生成方法

```groovy:Groovy
def range = 1..5
assert range == [1, 2, 3, 4, 5]
```

`..`だと、終端（上記のコードだと5）を含むRange、`..<`だと終端を含まないRangeを作成できる。

## 生成されるインスタンスの型について
ちなみに、どのRangeにするかによって、生成されるインスタンスの型が異なる。

```groovy:Groovy
def intRange = 1..5
assert range instanceof IntRange

def objectRange = "a".."f"
assert objectRange instanceof ObjectRange

def emptyRange = new EmptyRange()
assert emptyRange instanceof EmptyRange
```

`EmptyRange`は`new`しないとダメっぽい。
参考：http://stackoverflow.com/questions/15485141/empty-groovy-range

# アクセス
## Listっぽくアクセス
Listを継承しているので、こんな感じにアクセスできる。

```groovy:Groovy
def range = 1..5
assert range.size() == 5
assert range.get(2) == 3
assert range[2] == 3
assert range.contains(5)
assert !range.contains(6)
```

## Rangeの中身を変えるアクセスは不可（つまりimmutable）
`java.lang.List`を継承しているので、`add()`や`remove()`といった、Rangeの内容を変更できそうなメソッドが定義されているけど、これらを呼び出そうとすると `UnsupportedOperationException` を投げる。

この理由は、`ObjectRange`は`java.util.AbstractList`を、`IntRange`は、`java.util.AbstractList<Integer>`を継承しているため。
参考：http://stackoverflow.com/questions/24889972/why-does-range-throw-unsupportedoperationexception

また、この「サポートされないオペレーションの時は`UnsupportedOperationException`を投げる」という仕様は、`List`インターフェースに記載されている。
参考：https://docs.oracle.com/javase/jp/8/docs/api/java/util/List.html

## イテレーション
`each`メソッドを使って走査できる。

```groovy:Groovy
(1..5).each {
    println "Hello ${i}"
}
```

## swithの条件として使う
ドキュメント見て知ったけど、`switch`の条件判定に使える。

```groovy:Groovy
switch (age) {
    case 1..<6: println "未就学"
    case 6..22: println "学生"
    default: println "卒業" 
}
```

# 拡張
## 独自クラスのRangeを自作する
作成するには、比較のために`java.lang.Comparable`を実装することと、`next()`と`previous()`メソッドを実装する必要がある。

## EnumはRangeにできる
Groovyは、Javaの`Enum`(Comparable実装済み)に `next()`と`previous()`を付け加える。このため、EnumのRangeを作ることができる。

```groovy:Groovy
enum DayOfWeek {
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
}

def dayRange = DayOfWeek.SUNDAY..DayOfWeek.WEDNESDAY
assert dayRange.size() == 4
assert dayRange.contains(DayOfWeek.MONDAY)
assert !dayRange.contains(DayOfWeek.THURSDAY)
```

参考：http://mrhaki.blogspot.jp/2009/09/groovy-goodness-keep-your-values-in.html

Range、いろいろ便利だ。
ofxopenNI-library not found for -lXnDDK-をとりあえず回避できた

※あくまでケーススタディの一つです。根本的解決ではないですが、一応ビルドは通ったので、、、、、参考になれば幸いです。

※更新履歴

* 5/14：追加手順を更新

### 1.はじめに
[ofxOpenNI](https://github.com/gameoverhack/ofxOpenNI)を動かそうと思ったのですが、レポジトリのREADMEの手順通りにやっても`’ld: library not found for -lXnDDK’`でビルドが通りませんでした。

### 2.実行環境

* Mac OX 10.10.5
* Xcode 7.2
* oF 0.9.0

### 3.手順
READMEの手順を参考に以下を行います

1. project generatorでofxOpenNIを選択してプロジェクトを作成
2. 作成したプロジェクトのbinフォルダを`ofxOpenNI/examples/opeNI-SimpleExamples/bin`のbinフォルダで上書き
3. `ofxOpenNI/mac/copy_to_data_openni_path/lib`のlibフォルダをプロジェクトフォルダ内の`bin/data/openni`の中にコピー
4. Xcodeを開き、ofxOpenNIフォルダに`addons/ofxOpenNI/include`フォルダを追加。プロジェクトフォルダ内の`bin/data/openni/lib`フォルダを追加

と、これで、ofxOpenNIをビルドできるはずが、本題のエラーでビルドが通りません。（なぜ）
しかし、追加で以下のことを行うとビルドができました。

### 4.追加手順

#### 1.change_exec_paths.shを実行
　`your_project/bin/data/openni/lib`にあるchange_exec_paths.shを実行します。その後、ライブラリサーチパスを設定してライブラリパスを通してあげます。![スクリーンショット 2016-05-14 17.23.31.png](https://qiita-image-store.s3.amazonaws.com/0/104234/6f191f64-dc27-58dc-ba98-2e4ddd781d5c.png)



#### 2.`ofxOpenNIYypes.cpp`と`ofxOpenNI.cpp`の古いメソッドを書き換え
上記のフォルダに記述されている`ofGetGLTypeFromPixelFormat()`を`ofGetGLFormatFromPixelFormat()`へ書き換えます
SSH+公開鍵の設定がうまくいかないときに確認したいこと

# 動機
自分はローカルVM環境でもSSHの公開鍵認証を使うんですが(パスワード入力面倒、ついでにセキュリティ向上)、毎回よくも同じところでつまずくなぁと思うので、メモ+誰かのヒントになればという感じで投稿。
セットアップ自体については他の方の記事を参考にお願いします。
コマンド自体はCentOSベースです。

# まずは設定確認
確実に設定がされているかを確認します。

- サーバーのアドレス・ポート番号(以下は22番への接続を許可します)

```ini:/etc/ssh/sshd_config
# ポート番号
Port 22
# 許可するプロトコル(他には inet(IPv4), inet6(IPv6))
AddressFamily any
# サーバーが待ち受けを行うIPアドレス(IPv4)
# ListenAddress 0.0.0.0
# サーバーが待ち受けを行うIPアドレス(IPv6)
# ListenAddress ::
```

- 認証方法・アカウント

```ini:/etc/ssh/sshd_config
# rootへのログイン(させない)
PermitRootLogin no
# パスワードによる認証(させない)
PasswordAuthentication no
# 空パスワードによる認証の許可(させない)
PermitEmptyPasswords no
# RSA暗号鍵による認証
RSAAuthentication yes
# 公開鍵による認証
PubkeyAuthentication yes
# 公開鍵ファイルの場所
AuthorizedKeysFile %h/.ssh/authorized_keys
```

# ファイアウォールの確認

設定ファイルに書いているポートをファイアウォールがふさいでないか確認します。

# パーミッションの確認

以下の設定になっているか確認します。

1. ホームディレクトリの.sshディレクトリのパーミッションが700であること
2. AuthorizedKeysFileで指定したファイルのパーミッションが600であること
3. ホームディレクトリのパーミッションが751以下であること

# 接続・デバッグログを見てみる

だいたいこれだけだとうまくいかないので、困ったときのログを確認します。

- /var/log/secure

デバッグログを確認するときは以下のコマンドで起動します。
ほとんどはここでわかるかと思います。

```bash:サーバー
# サービスが動いている場合は停止する
service stop sshd
# フルパスで実行ファイルは指定すること
/usr/sbin/sshd -d
```

```bash:クライアント
# vvvオプションで詳細なデバッグログを出力します
ssh ユーザー名@アドレス:ポート -vvv
```

# 公開鍵がちゃんと書かれているか確認する

自分の環境でうまくいかない原因の半分くらいがここだったり。
コピペの失敗というしょうもない原因だけど、あなどれないです。

```text:~/.ssh/authorized_keys
ssh-rsa 鍵の内容 ユーザー名@クライアント名
...
```

ここで確認するのはssh-rsaとクライアント名ががちゃんと記載されているかどうかです。
ちなみに、以下のコマンドで鍵のフィンガープリントが確認できます。

```bash
ssh-keygen -l -f ファイル名
```

# まとめ

__コピペの時はちゃんと確認！__


はじめて記事を書いてみました。
たいしたこと書いてないけどブログで書くのと違って割と緊張しますね。
こういう地味なtipsが多いので、これからも書いていければと思います。
TableSorterのヘッダ固定オプション(stickyHeader)について

# 概要
「TableSorter」という列ごとにソートできるjsライブラリがあります。
このライブラリの中で「stickyHeader」というオプションを使うと、ヘッダを固定できます。
このオプションについて、知っておくべきことをまとめます。
http://mottie.github.io/tablesorter/docs/example-widget-sticky-header.html


## スクロールしたときヘッダがずれる
table要素のwrapper要素に`position:relative;`が指定されていなかったため。


## ヘッダが複数行でもヘッダ固定できる
WordPressがトップページ以外404になった時に確認したこと

今後同じ問題が起こった時の為のメモ書きです。
今回修正できた理由(というかおこった原因が)不明なので、なんとも言い難いですね...

#症状
 - トップページ、投稿ページ(?p=N)は見れる
 - その他のページが見られない

=>たぶんmod_rewriteが必要なページが見られなくなっていた

#静的ファイル
 - index.htmlなど、他に優先されるファイルがないか(Apacheの設定にもよる)

#Apache
 - Apacheのhttpd.confでAllowOverrideがNoneになっていないか
 - mod_rewrite.soが入っているか(そして、読み込まれているか)

#.htaccess
 - ドキュメントルートに存在するか(まれに削除してなくなってたりする)
 - パーミッションはApacheが読み取り編集できるようになっているか(700とか？)
 - 所有者はApacheが読み取り編集できるようになっているか(Apache:Apacheとか)
 - 内部の設定が、空になっていたり、インストールディレクトリが間違っていたりしないか


#WP
 - パーマリンクの設定を一旦デフォルト(?p=)に戻す
 


***
ここまでやっても直らなかったですが、弄っている間に見れるようになったので良しとします
１度有効にした定期購入アイテムは２度と無効にすることはできない、絶対に、如何なる理由や事情があっても……だ！（Google Play 課金）

# ある日のしくじり

Android アプリの課金機能を実装中に [Google Play Console](https://play.google.com/apps/publish/) でテスト用に作成した ￥5,000 の定期購入アイテムを誤って有効にしていまいました。
本来は ￥100 の定期購入アイテムのみを販売しようとしていたのですが、このままアプリをリリースしてしまうと Play ストア > その他の情報 > アプリ内アイテムの表記が「￥100〜￥5,000/アイテム」となり、販売予定の無い ￥5,000 アイテムまで表記されてしまいます :cry:

![スクリーンショット 2016-04-25 20.35.22.png](https://qiita-image-store.s3.amazonaws.com/0/6881/aa1b729a-5a35-b418-bc52-effd6499f3cf.png)
（※ 複数の定期購入アイテムを販売している [LINE MUSIC（ラインミュージック）](https://play.google.com/store/apps/details?id=jp.linecorp.linemusic.android&hl=ja) の Play ストア画面を参照させて頂きました :bow: ）

# 如何ともし難いので

[Google Play Console](https://play.google.com/apps/publish/) で有効にした定期購入アイテムを無効にする方法が見つからなかったため Google Play デベロッパー サポート様に問い合わせてみました。

> アプリ内アイテムについて質問があります。
アプリ内アイテムを作成して有効にしてしまうと Google Play Developer Console から削除することができなくなるのですが、誤って有効にしたアプリ内アイテムでも削除することはできないのでしょうか？

> テスト用に作成した販売予定の無い￥5,000のアイテムを有効にしてしまったため、リリース後の Playストア > その他の情報 > アプリ内アイテム にて「￥100〜￥5,000/アイテム」と表示されるようになってしまいます。

> 誤って作成した￥5,000のアイテムはどのバージョンのアプリからも購入できないかつ 現在までの購入者は0人なのですが、削除していただく、または Play ストアでの表記を「￥100/アイテム」に修正していただくことはできないでしょうか？

約２時間後に返信が届きました :email: 
> この度は Google Play デベロッパー サポートにお問い合わせいただきありがとうございます。

> 大変恐縮でございますが、一度有効となった定期購入アイテムはその後は価格変更することやアイテムを非表示・削除することができません。(ただし定期購入ではない通常のアプリ内アイテムは削除可能です)
この点は以下のヘルプ記事でもご案内しております。

> 定期購入や定期的な請求の追加
https://support.google.com/googleplay/android-developer/answer/140504?hl=ja

> 定期購入については、料金を 0 円よりも高く設定する必要があり、設定した定期購入料金は変更できません。また、定期購入を非公開にすることはできません。

> Play ストア上で表示される販売アイテムの価格帯は、有効なアプリ内アイテムの価格を参照しております。
なおこれは仕様であり、弊社でも削除することはできません。


> ご不便をおかけいたしますが、何とぞご了承いただけますと幸いです。
どうぞ宜しくお願いいたします。

# 結果

__１度有効にした定期購入アイテムは無効にできない__ ということでした（単品のアプリ内アイテムは削除可能）。

# 誤って有効にしてしまった場合は

新規リリース前であれば [Google Play Console](https://play.google.com/apps/publish/) で新しいアプリを作り直して公開すればいいと思いますが、リリース済みアプリの場合は、

:one: 諦める（ユーザーから問い合わせが来た場合は「現在は販売していません」と言い張る）
:two: これまでのダウンロード数とレビューを捨てて新規アプリとしてリリースし直す

という選択肢になると思います。

[Google Play Console](https://play.google.com/apps/publish/) での定期購入アイテムの操作にはくれぐれも気を付けましょう :warning:

# 関連項目

- http://qiita.com/84d010m08/items/8bdcaaa639754062dc74
- http://qiita.com/84d010m08/items/a28bb8be44ba15b83ded
2016年度の目標(自分用)

2016年度の目標を自分用にまとめます。

# 仕事で開発しているWebシステムを、Seleniumでテスト自動化する(5～6月)

### 目的
* 上司からの命令
* そろそろテストの工数を減らして楽になりたい。楽になるとは限らないけど
* 新しい分野なので楽しそう

### タスク
 - 「Selenium デザインパターン&ベストプラクティス」を読む (5月)
 - Slenium WebDriverを使って、1画面はテスト自動化する(6月)
 - Selenium IDEを使って、誰でもテスト自動化できるようにする(6月)


# ウェブデザイン検定2級(9月4日)に合格する(7～8月)

### 目的
* チームメンバが受けていたので、私も受けて合格したい(ライバル意識)
* 客からの評価を上げたい(社会人としての評価が低いので、せめて技術面での評価を上げたい)
* Web業界に転職できるようにしたい(今のところ行く予定はないが、いつでも行けるように)

### タスク
* 7月: 受験申し込み、過去問購入
* 7~8月: 過去問勉強、Photoshop、Illustratorを使う
* 9/4: 試験実施

# スマホアプリ(小遣い帳)の開発・リリース(8～9月)
### 目的
* 業務のコーディングに少し飽きたので、別のシステムを作りたい
* Androidアプリをリリースするというは、どういう感じなのか知りたい（開発する以外に何がある？どの程度のユーザが使ってくれる？など）

### タスク
* 仕様決め
 - 簡単に支出を記録できるようにして、誤差を1ヶ月の誤差を1000円以内にする
 - 支出を減らすための工夫をする
* アプリ環境構築
* アプリ開発
* リリース作業

# 勉強会のLightning Talkで発表する(6～7月)
### 目的
* 自分の頭の中を整理したい(頭の中はしっちゃかめっちゃか、理路整然としていない)
* 今まで全然アウトプットしてこなかったので、そろそろアウトプットもして成長したい
* 同僚に認めてもらいたい
* Lightning Talkでは学生さんも発表していて、オッサンも負けていられない
* 業務や勉強などで得た「自分しか知らない」と思っている情報を、多くの人に伝えたい（もしかしたらみんな知っていることかも知れないが、「自分しか知らないことだ」と思うことで、発表するモチベーションがあがる）

### タスク
* 6月:Lightning Talkの申し込み
* 6～7月: スライド作成
* 8/6: 発表

# 読書
* 5月: 理論から学ぶデータベース実践入門
* 6月: SQLアンチパターン
* 7月: Java言語で学ぶデザインパターン入門
* 8月: EFFECTIVE JAVA

# 毎日の習慣
* 毎週1回Qiitaに投稿
* 毎週1回Teratailに質問
c++ builder XE4, 10.2 Tokyo > マウス左クリック + Shift を検知 > mbLeft / ssShift

```txt:動作確認
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)
```

参考 http://www.interq.or.jp/moonstone/person/del/mouse.htm

マウスクリックとShiftなどの組合せの検知

```cpp
void __fastcall TOptionMail2::FormMouseDown(TObject *Sender, TMouseButton Button,
          TShiftState Shift, int X, int Y)
{
	if (Button == mbLeft && Shift.Contains(ssShift)) {
              // 処理
	}
}
//---------------------------------------------------------------------------

```

### 検索用キーワード
(追記 2018/10/19)

- ssAlt
Postgres.app で入ってくる psql の readline ショートカットがなんだかおかしかったら

Mac で簡単に PostgreSQL を立てられる [Postgres.app](http://postgresapp.com/) を使っていたら、
readline ショートカット（例えば、`Ctrl-r`で履歴を検索、`Ctrl-a`で行頭に飛ぶ、`Ctrl-e`で行末に飛ぶ、など）が動作しなくて困った。

雑に調べてみると、2014年の issue ではあるが[それっぽいもの](https://github.com/PostgresApp/PostgresApp/issues/144)が見つかった。ななめ読みしてみると、Postgres.app は libreadline の代わりに、libedit を使っているらしく、~/.editrc ファイルに必要な物を書いておけば、とりあえずは使えるとのこと。

```
bind "^R" em-inc-search-prev
bind "\e[1~" ed-move-to-beg
bind "\e[4~" ed-move-to-end
bind "\e[3~" ed-delete-next-char
bind "\e[2~" ed-quoted-insert
bind "\e[1;5C" em-next-word
bind "\e[1;5D" ed-prev-word
bind "\e[5C" em-next-word
bind "\e[5D" ed-prev-word
```

とりあえず↑を ~/.editrc に書いてみると、`Ctrl-r`など動作した。それぞれの行は、以下に対応。

- History completion with Ctrl-R
- Home
- End
- Delete
- Insert

普通に `brew install postgresql` して使ったほうが変なところではまらずに良いかもしれません...
Ruby技術者認定試験Silver 2.1 合格メモ

#はじめに
私はRubyを全くやった事がなかったのですが、転職後の会社がRuby on Rails推しという事で
まずはRubyの基礎を覚える為に受講を決意しました。（というか周りはみんな持っていると言われた事もあり・・）

私のプログラミング経験値としてはC系、Java、PHPを５年くらいはやりました。

#勉強期間
- 4/7(木)〜4/24(日) (約１５日）
 - 平日は通勤時間（往復２時間）と土日はパソコンを触りながらの学習（土日は１日３時間くらい？）

#勉強方法について
- 以下参考書での勉強
 - Ruby技術者認定試験合格教本 Silver/Gold対応　http://ecx.images-amazon.com/images/I/51TGSmvhRsL._SX347_BO1,204,203,200_.jpg
 - 問題と答えが合っていないものがあったりもしましたが、巻末に記載されている問題でいくつか同じような問題がでたので良かったです！

- 以下公式の問題集を繰り返し実施し理解を深める
 - http://www.ruby.or.jp/ja/certification/examination/index.data/exam_prep_jp.pdf
 - こちらも似たような問題がでました

- 以下サイトでRuby技術者認定試験（Silver）対策コース　のドリルを１００％まで実施
 - Rubyがミニツク
  http://www.minituku.net/?locale=ja
 - 同じような問題がでたかあんまり覚えていませんが、通勤中にもできるので繰り返し実施してました。

- Qiitaで勉強状況をメモ
 - これは自身の勉強内容を反芻する意味で非常に効果的だったと思います。irb または rbファイルを作成し自分で時々プログラムを実行し確認もする事で理解を深めました。

- Rubyのリファレンス確認
 - http://docs.ruby-lang.org/ja/2.1.0/library/_builtin.html
 - 見た事のないメソッドが出てきてテンパらないようにチェック。全部を読むのは現実的ではなかったので、Enumerable, String, Array, Hash, File, IO, Dir を見る感じでした。

#受講前について
- 試験会場には早めに到着
- 付け焼き刃にリファレンスを見直してメソッドを暗記
- 違う名前だけど同じ意味のメソッド名の暗記確認

#試験内容について

## 傾向
- やさしいと思ったのは○○に該当する答えを すべて　選んでください。という問題はほとんど出ませんでした。複数の場合は２つ選んでください。といった選ぶ数が解るのでほとんどが消去法でいけます。
- 同じような動作をするメソッド系の問題がでました。（map/collectのような)
- 問題集とほぼ同じような問題が多数でました。2０問くらいは似たような問題でした。
- 破壊的とそうでないメソッドを考える問題がでました。
- ブロックに渡すパラメータが複数あるものについて、パラメータを逆に覚えていないかをひっかけるような問題がでました。
- メソッドにパラメータを指定した場合と指定しない場合と空文字を入れた場合を考えさせる問題がでました。

## 試験内容例
```1.rb
#エルスイフはどれ？ Ruby以外を無駄に知っていると混乱
else if # --> よく目にするパターン
elseif # --> php
elsif
elif # --> python
```

```2.rb
# xxxxx に何をいれるべきか？
a = ["1","2","3"]
b = ["5"]
a.xxxxx(b)
p a # --> ["1", "2", "3", "5"]
```

```3.rb
# 以下で ["a", "b", "c"] になるものは？
p "a\tb\tc".split()
p "a b c".split()
p "a b c".split(//)
p "a\tb\tc".split(/ /)
```

```4.rb
# 以下の結果は？
a = 1,2,3
p a.to_a
```

```5.rb
#each と each_lineが同じ意味だよね？を解くようなひっかけ問題
a = "a\nb"
a.each do | x |
	p x
end

#実行エラーになる。というのが正解
# each_line であれば
#"a\n"
#"b"
# となる
```

```6.rb
# 値が左、indexが右
[5, 10, 15].each_with_index do |n, idx|
  p [n, idx]
end
# 左が戻り値、右が値
p [2, 3, 4, 5].inject {|result, item| result + item }
```

```7.rb
#どのように表示されるか？ --> /ruby
 p File.join("", "ruby")
```

```8.rb
#24時間後を表示(addとかいうメソッドはない）
t = Time.now
p t
t+=60*60*24
p t
```


#試験結果
５問間違えてしまいましたが、90点という合格ラインでした。
時間配分としては見直しを一周しても30分は余りました。

#今後
Goldを目指したいですが、Railsの勉強も並行してやろうと思います！
pinataを利用してDocker for Macに与えるメモリ・CPU数を増やす

## Docker for Mac configuration
現在private betaで公開されているDocker for MacではデフォルトでCPU2つとメモリ2GBが割り当てられている．このままだとLLVMとかPCLのmakeが終わらない（2時間とかかる）ので，設定を弄りたい．Docker for MacはGUI上からメモリ量を変更できる．

![image.png (66.4 kB)](https://img.esa.io/uploads/production/attachments/2063/2016/04/24/3140/a4843710-4229-41f5-a4ae-4f2a45f3e1bb.png)

…と，見せかけて，このスライダーは`Version 1.11.0-beta8 (build: 6072)`時点では動作しない．設定はCUIから操作する必要がある（チェックボックスたちは動いてるっぽい）．

## pinata
`pinata - manage the Docker.app configuration database`なるツールがDocker for Macには存在する．これを利用すればメモリとCPUの設定を弄ることができる．
まだExperimental Featuresらしい．細かいことは公式のドキュメントを参照．

どうでもいいけどpinataって名前がかわいい．

### pinata list
`pinata list`というコマンドで現在のconfigurationを確認できる．メモリやCPU数は`hypervisor`の`native`に設定されている（初期値は`(memory=2, ncpu=2)`）．

```
$ pinata list
🐳  hypervisor = native (memory=2, ncpu=2)
   The Docker.app includes embedded hypervisors that run the virtual machines
   that power the containers. This setting allows you to control which the
   default one used for Linux is.

 ▸  native: a version of the xhyve hypervisor that uses the MacOSX
              Hypervisor.framework to run container VMs. Parameters:
              memory (VM memory in gigabytes), ncpu (vCPUs)
```

### pinata set
`pinata set`を利用して値を書き換える．

```
$ pinata set hypervisor native memory=4 ncpu=4
```

なお，GUI上には設定が反映されないので注意．

## References
- [Unable to Drag Memory Slider in Settings [SOLVED] - Docker for Mac - Docker Forums][forums-post]

[forums-post]: https://forums.docker.com/t/unable-to-drag-memory-slider-in-settings-solved/8074
Git素人のための勉強できるサイトまとめ

#これだけ分かればもう新人じゃない。
#Git設置したくない。めんどくさい。。だけと勉強したい方以下のサイトで練習できる。
http://k.swd.cc/learnGitBranching-ja/

#GitやGitHubの使い方を学習できるデスクトップアプリ
http://www.softantenna.com/softwares/7282-git-it

#動画で勉強したい方以下のサイト
http://dotinstall.com/lessons/basic_git

#コマンド印刷して見たいなと思う方は以下のPDF印刷してください。
https://training.github.com/kit/downloads/ja/github-git-cheat-sheet.pdf

#Gitの入門は以下のサイトが分かりやすい
http://www.backlog.jp/git-guide/

#コマンドは苦手と思う方以下のツールを使ってみたら
ダウンロード
https://www.sourcetreeapp.com/
使い方
http://celtislab.net/archives/20140527/git-sourcetree/

#GitHubを使ってみたい方
SSH設定方法が画像で分かりやすい。
http://wp.yat-net.com/?p=3874
詳細な使い方はこちら
http://blog.tai2.net/github_client_howto.html

#Desktop用GitHubツール
https://desktop.github.com/
http://dev.classmethod.jp/etc/github-for-windows/

#その他Git GUIツール
https://git-scm.com/download/gui/linux


#Gitブランチモデル
本番・ST環境・バグ修正・機能修正の時のGitブランチの運用方法が説明されています。
ブランチの命名規則とかブランチの運用方法が分かります。
https://havelog.ayumusato.com/develop/git/e513-git_branch_model.html

#eclipseからgitを使いたい
http://another.maple4ever.net/archives/2060/

#Visual StudioでGit使いたい
https://codezine.jp/article/detail/8436

#開発でphpstormとredmineを使ってる方は以下に連携方法があります
http://www.msng.info/archives/2014/12/phpstorm-tasks.php

#PHP・CAKEPHPを勉強したい方、サーバー設定から実務に必要なすべての情報が以下にあります
http://qiita.com/amagasu1234/items/ba160f9e6264f7c90486


#centosのgit最新にしたい場合
http://2no.hatenablog.com/entry/2015/05/23/111118
WCAN 2016 Springに参加した感想

「WCAN 2016 Spring」という名古屋でのWeb系に関する勉強会に参加してきました。
その内容と感想を自分用にまとめます。
http://wcan.jp/event/2016spring/

# セッションの内容
### Lightning Talk
* 中国では口コミを重要視する
* WEBサイトの保守契約にポイント制を導入して保守の売り上げ増加。たとえば文字の修正１ポイント、アイコン修正2ポイントなど。  
⇒ウチの業務で導入できる？たぶん難しいが、ポイント制を導入するつもりで、客から出る要望を分析する意味はあると思う。
* 技能五輪全国大会で金賞銀賞を受賞した社会人１年生が発表していた。ただただすごいと思った。オジサンでも参加できる大会を探し中。あったとしても参加するかは分からないけど。。。 また、彼女たちは学生時代Web部に所属していて「好きなHTMLタグは？」などの会話していたらしい。タグに「好き」という感情が芽生えていない私は、まだまだ未熟だなと感じた。

### 2016年 Web配色のイロハ
* 2016年のWebでは色数が減った。
* スマホ用/PC用などデバイスによってフォントの色・サイズを変えている。スマホは太陽光の下だと見えづらいので、一般的にコントラストを上げる。
* メインカラーを決める際、客に色のマイナスイメージも伝えると納得してくれやすい
* 高級感の定義って難しい。

### グラフィックでDL数を稼ぐ方法
* タイトルなど文字は短く
* 専門外の人の意見も取り入れる

SEO対策的な話で、興味が持てずしっかり聞いていなかった...
とりあえずShimejiはインストールしてみた。

### Webデザイントレンド2016春の陣 in Nagoya
* アイコン多すぎ。Bootstrapなどのフレームワークなどで簡単にアイコンを配置できるようになったため？同じ大きさのアイコンがたくさんあると分かりにくい。7個程度がちょうどいい？
* サイトのリニューアルが多い。  
⇒サイトのリニューアルのきっかけって何？
* 上場企業サイトは、PCとスマホで表示が同じところが多い。サイト閲覧者は株主を対象にしていて、決算データなどはPCで見ることを想定している？
* 自治体サイトでは「山」のフッターがよく使われている。(「Footer山」と呼んでいた)
* 自治体サイトは周辺の自治体サイトに影響する。ある自治体サイトで新しいことを始めると、隣の自治体でも同じようなものが採用されている。
* ゆるキャラブームの低下
* 地域によって違いがある。九州などは観光に関する記事が多い。
* 地震発生などの緊急時、サイトに何を表示するかを考えた方がよい。

### 覚えた用語
* ECサイト
* ピクトグラム
* コンバージョン
* 基本色彩語
* ウェブライティング
* Webの駅
* オウンドメディア
* ローポリ(ローポリゴン)
* パステルマット
* ブレイクポイント
GUI 勘所 にゃ (自分の場合)

# 言いたいこと
* MVC で考えればいいじゃん。
* 今も昔もかわってないじゃん

## 書くきっかけ

* [Angular 2 コンポーネント指向の第一歩](https://speakerdeck.com/armorik83/angular-2-konponentozhi-xiang-falsedi-bu) を読んで
* Angular2 を使ってみて

html6とか、コンポーネント化の機能が入るのかなぁ、と感じつつ
GUI 周りは変わらないなぁという話なのだと言いたいのかも・・・

# 抑えればいいそうなところ

おそらく、以下の２点を抑えれば、
* GUI Provider と GUI Userの関係
* MVC 周辺

今の所、下記の部分で

* 担当分開発
* 開発システムの共通化部品開発

大きな問題にブチ当たらないのでは！！
と思うのでした にゃ！！

## GUI Provider と GUI Userの関係

GUI プロバイダーからすると、おそらく以下の３つが要件なのだろう
（GUI プロバイダー, OSのUI/DeviceのUI/BrowserのUIを提供している人）

_要件_

* レイアウト(構造)化可能（少ない要素/コンポーネント/コントロールで構築可能にしたい？）
* テーマ(装飾)化可能
* イベントハンドル可能

とすると、ユーザーはその要件みたし方を学ぶと学習曲線の角度が上がるはず！！では！！

## MVC 周辺

[MVC](https://ja.wikipedia.org/wiki/Model_View_Controller) を一旦理解すれば、

そこから探していけば、だいたいそのプラットフォームで近しいものに落ち着き学習曲線の角度が上がるはず！！では！！

# API探訪

<table>
<thead>
<tr><th>カテゴリ</th><th>View</th><th>Contoller</th><th>Model</th></tr>
</thead>
<tbody>
<tr><td>デスクトップ</td><td>ListView (win xml定義可)
JTable (swing javafx ならXMLで定義可能)</td><td>ItemContainer とか(win)
TableModel(swing) SelectionとかHeaderとか色々あるけど省略
</td><td>ListItem (win)
TableModelで扱える何がし(swing)</td></tr>
<tr><td>デバイス</td><td>UIView (ios Nibで可)
View (android xmlでも可)</td><td>UIViewController (ios)
Activity (android)</td><td>CoreData (ios)
ContentProvider (android)</td></tr>
<tr><td>Web</td><td>HTML,css</td><td>Javascript</td><td>api (application/json,csv,xml)</td></tr>
</tbody>
</table>

※ 割と雑で申し訳ないです

## デスクトップ付近

* [Windows UI](https://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.frameworkelement.aspx)

* [javax.swing](https://docs.oracle.com/javase/jp/8/docs/api/index.html?javax/swing/package-summary.html)

## ケータイ付近
* [UIKit iOS](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIKit_Framework/index.html#//apple_ref/doc/uid/TP40006955)
* [Activity Android](http://developer.android.com/intl/ja/reference/android/app/Activity.html)


## Web 付近
* 基本的に、３つの要素がある
     * html (構造)
     * css (装飾)
     * イベントハンドル（振る舞い）
* [List of Javascript libraries](https://en.wikipedia.org/wiki/List_of_JavaScript_libraries)
* [フロントエンド+JavaScriptの歴史(2) ライブラリ・フレームワーク編](http://qiita.com/Orfeus/items/f66b74e073838be5be68) prototype.js, jquery からのが書いてあります  
(ちゃんと読んでないので、良い記事かは不明)
/etc/resolv.confが空の場合、/etc/resolvconf/resolv.conf.d/baseに書くとよい

## 参考

* [ubuntu 14.04でDNSサーバを設定する方法 - zzkater blog](http://d.hatena.ne.jp/zzkater/20140713/1405250096)
* [How do I configure my static DNS in interfaces? - Ask Ubuntu](http://askubuntu.com/questions/143819/how-do-i-configure-my-static-dns-in-interfaces)

## 現象

```diff:/etc/network/interfaces
 auto vmbr0
 iface vmbr0 inet static
    address 10.0.1.2
    netmask 255.255.255.0
    gateway 10.0.1.1
+    dns-nameservers 8.8.8.8 8.8.4.4
 ...
```

と指定しているのに、/etc/resolv.confが空になる場合の対策

## 対策

* /etc/resolvconf/resolv.conf.d/base に書く

```bash:/etc/resolvconf/resolv.conf.d/base
nameserver 8.8.8.8
nameserver 8.8.4.4
```

```bash:反映
sudo resolvconf -u
```
stack を Haskell ツールのインストーラとして使う


Haskell プロジェクトのライブラリ管理に便利な [stack](http://docs.haskellstack.org/en/stable/README/) ですが、gcc-mod や hoogle などコマンドラインツールのインストーラとしても使えます。

## （まだ入れてなければ）stack のインストール

```sh
brew install haskell-stack
```

## 好きなツールのインストール

```sh
stack install ghc-mod
```

## 更新

しばらく使っていると、新しいバージョンが出て更新したくなるかもしれません。そういう時は global resolver を更新して `stack install` し直します。

`~/.stack/global/stack.yaml` の中の `resolver` のバージョンを書き換えるだけです。その後 `stack install foo` とすると、新しい resolver でインストールできます。
tmux の起動時に複数のウィンドウを開く

```bash
tmux new-session \; new-window
```
これで 2 ウィンドウ開いた状態で tmux を起動できます。` \; new-window` を繰り返すことで 3 ウィンドウ以上開くこともできます。

軽く調べた範囲では tmux.conf での設定方法は見つからず、man を見て上の方法にたどりつきました。

- [tmux(1) - OpenBSD manual pages](http://man.openbsd.org/OpenBSD-current/man1/tmux.1)

`.bashrc` 等で `alias tmux-new='tmux new-session \; new-window'` としておくことにしました。

もっといいやり方があれば、知りたいところです。

## GNU Screen の場合

余談ですが、GNU Screen の場合、 `.screenrc` の末尾辺りに以下のように書いておけば同等のことができます。

```
screen
screen
```

※ `screen` は `PREFIX + c` と同様に、screen 内での仮想端末を新規作成するコマンド

## 参考

- [新規tmuxセッション起動時に自動で複数のウィンドウを作成してペイン分割する - 完熟トマト](http://kanjuku-tomato.blogspot.jp/2014/03/tmux.html)
Raspberry Pi 3で FreeBSD(ARM64) を動かす

[より新しい、2016年12月時点の Raspberry Pi 3/FreeBSD(ARM64) はこちら](http://qiita.com/s_mitu/items/05c2d9e5f2675c9fa777)

| **以下の記述は古い情報です。現在 RaspberryPi 3 対応は current ソースツリーにマージされています。<br/>歴史的資料（？）として残しています** |
|:-:|



# Raspberry Pi 3で FreeBSD(ARM64) をお試しする

Raspberry Pi 3 がやっとこさ買えたので、FreeBSDが動くか遊んでみました。

## Rasbperry Pi 3 でFreeBSDは動くのか?

現時点で(2016年4月)まだ正式な対応はなく、「なんとか動かせたぜ」という人たちがソースやらイメージを公開しています。
まだ十分使える段階ではないのですが、FreeBSD(ARM64)が動くRaspberryPi3が見たいという欲望が抑えきれない人は参考にしてください。CPUには32bitモードもあるのですが、以下紹介するイメージはいずれも ARM64 バイナリとなっています。
いずれもHDMI出力がまだできないので、USBシリアル接続を用意してください。

## USBシリアル接続
こんな感じのケーブル
![USBシリアル変換](https://www.sengoku.co.jp/item/images/th800/359313001_usb_ttl.jpg)
というかUSBシリアル変換チップ
![USBシリアル変換チップ](https://www.sengoku.co.jp/item/images/th800/359313001_usb_ttl_02.jpg)
千石電商：https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-4HJ7

を、RaspberryPI のGPIO の右の５V（出力じゃなくてRaspberryPi3側に給電されるので、USB給電しなくても起動します [^1]）/GND/GPIO14(UART0_TXD)/GPIO15(UART0_RXD) を接続してください。

[^1]: GPIO端子側から給電出来ることは非公式の仕様で、ヒューズが入ってないので注意が必要です(USB経由ならリセッタブルヒューズ入ってるのでちょっとした失敗で回路が焼き切れたりしなくて安心です)。また、RaspberryPi3 は大容量の電源が必要なので、デバイスを多く動かしたり、CPU負荷が高くなると、この給電では足りなくなります。本格的に動かす場合には2.5A電源で給電が必要になので、別電源が要ります。今回は起動までで、ろくなデバイスも動かないので、この給電でも一応動きます。

![GPIO](https://qiita-image-store.s3.amazonaws.com/0/103137/b6aba983-14aa-b7fc-5310-3371ed5650bd.png)

ホストのFreeBSD からは「cu -l /dev/cuaU0 -s 115200」とかすれば、RaspberryPiがシリアルコンソールで操作できるようになります。

##その１
動かした andrew さんのTweet
https://twitter.com/zxombie/status/706526055373414400

https://github.com/zxombie/freebsd/tree/arm64-rpi3
でRaspberry Pi 3用に変更したFreeBSDソースとビルドスクリプトを公開しています。

で、実際にビルドしたイメージが以下にありますので、お手軽に試せます。

https://people.freebsd.org/~andrew/arm64/rpi3-20160306.img.xz
ダウンロードして xz展開してddでmicroSD書き込むだけです。

ただ、wifi はおろか、有線LANも、もちろん GPIO も動きません。SMPも非対応です。

「RaspberryPi で FreeBSD(ARM64)が起動した」という充実感が得られます。

![起動の図](https://pbs.twimg.com/media/CgftV0gVAAMEjo-.jpg)

##その2
FreeBSD-current MLで「俺もイメージ作ったぜ」という人がいました。

https://lists.freebsd.org/pipermail/freebsd-current/2016-April/060515.html

FreeBSDからforkした姉妹プロジェクト「HardenedBSD」をベースとしたそうです。こちらは有線LANが使えるので、なんとか使いどころがありそうです。

上記メールにもありますが、イメージの場所はこちら
https://hardenedbsd.org/~shawn/rpi3/2016-04-04/rpi3.img.xz
こちらも xz 展開してddでmicroSDに書き込みます。
起動させると途中までは順調なのですが、
```
random: unblocking device.
```
と出たところで止まってしまいます。「Ctrl+C」で rc スクリプトが停止し、Ctrl+Dでマルチユーザーモードに入れます。

loginプロンプトが出たら、rootでパスワード無しでログインできます。

![hardenedbsd.png](https://qiita-image-store.s3.amazonaws.com/0/103137/6992b0dd-4c72-9215-70b4-d39a9d96db9f.png)

ue0 もifconfigで出てきて、ネットワーク接続もできました。

![ue0.png](https://qiita-image-store.s3.amazonaws.com/0/103137/ecc9d156-3e64-62e0-cc11-3964b253b5e4.png)

## 32bitでは？

32bit として、RaspberryPi2のcurrentのsnapshotイメージで動くか試したのですが、そのままでは動きませんでした。64bit で動くことよりも RaspberryPi2 レベルで色々動くほうが個人的には嬉しいので、そちらでも進展があるか期待(人任せ)。
herokuへ公開した後にseedデータを更新する

わざわざ書かなくてもちょっと調べればできる内容ですが自分のためにも書きます.
私が公開しているサービスにおいて，割と重要かつユーザーも使い回すようなデータに誤りがあったのでそのデータを更新する.
#環境
- rails 4.2.4
- ruby 2.0.0
- Mac (OS X EI Capitan 10.11.3)

##サービスをメンテナンスモードにし，止める

```
heroku maintenance:on
```

##コンソールからモデルの変更/更新を行う

```
heroku run rails console

-> Model.find(1).update(name: "update")
```

##サービスを再開
```
heroku maintenance:off
```

#教訓
- updateしてもちゃんと反映されているかコンソールを利用でモデルを確認する
- (今思うと当たり前だが)heroku run rake db:seedをやった所で反映はされない.むしろseedデータがその分増えて同じデータが何個もデータベース上に存在し，データベースを圧迫する.
- seedデータはサービス後に変更するとなるとユーザーへの迷惑度も半端ないのでサービスリリース前には念入りにチェックする
PMBOK-プロジェクト憲章作成

# プロジェクト憲章って誰が作成していますか？

プロジェクトを立ち上げる際に一番最初に取り掛かる作業です。
作成するのはプロジェクトオーナーやスポンサーなので、実はプロジェクトマネジャーが作るものではありません。自社製品を作るような組織であればビジネスとしていけると判断したところでプロジェクト憲章を作成します。つまり、さぁプロジェクトを始めようといっていきなりプロジェクト憲章を作成するのではありませんね。
上流工程としてニーズの掘り起こしや提供する価値の見極めができているので、それをお金を出してくれる経営陣やステークホルダーに承認してもらうための成果物です。ビジネスアナリストの役割としてすでに作業が進んでいるはずです。
プロジェクトマネージャーはプロジェクト憲章のなかでアサインされます。とはいえ、大きくない組織や、そもそも組織体制が弱いような会社では代理で作成することになりますね。

# プロジェクト憲章作成のプロセス

| インプット | ツール | アウトプット |
|:-----------:|:-----------:|:-----------:|:
|プロジェクト作業範囲記述書(プロジェクトSOW)<br/>ビジネス・ケース<br/>契約<br/>組織体の環境要因<br/>組織のプロセス資産|専門家の判断|プロジェクト憲章|

インプットから作業範囲記述書やビジネス・ケースといったものがある通り、ビジネスとしての判断材料がある程度進んでいるわけですね。もしこういったインプットが無い状態からプロジェクトを始めることになってしまった場合は作るしかありませんね :cry: 

一般的には以下の内容を記載しましょうと言われています。

#### プロジェクト・エグゼクティブ・サマリー
> 本題で説明する内容をかみ砕き、要点だけを書きます。ビジネスでは結論から説明し、相手が興味を持ったら、さらに詳細を説明するのが鉄則。まずは決裁者に興味を持ってもらうことが先決です。概要・目標・スコープ・前提条件・リスク・コスト・アプローチといった内容のハイレベルの説明を記述します。そして、このあとに詳細が続いてきます。

#### プロジェクトの概要
> プロジェクトの背景と状況、なぜこのプロジェクトを着手するのか、実行される作業のビジネス価値を明記します。

#### プロジェクトの目標
> プロジェクトが何を達成し、どういった価値を提供するのかを記載します。目標の作り方にはSMARTの法則というのがあります。
> S pecific　    ＝　具体的、わかりやすい
> M easurable　  ＝　計測可能、数字になっている
> A greed　upon　＝　同意して、達成可能な
> R ealistic　   ＝　現実的で結果志向
> T imely　      ＝　期限が明確

#### プロジェクト・スコープ
> プロジェクトの境界を明確に定義します。
> スコープの内・外に属する要素成果物のタイプ （ビジネス要件、現状評価）
> スコープの内・外に属する主要なライフサイクル・プロセス （分析、設計、テスト）
> スコープの内・外に属するデータのタイプ（財務、売上、従業員）
> スコープの内・外に属するデータ源（またはデータベース）（請求書、総勘定元帳、給与）
> スコープの内・外に属する組織（人事、製造、ベンダー）
> スコープの内・外に属する主要な機能性 （意思決定支援、データ入力、管理報告）

#### プロジェクトの成果物
> プロジェクトの活動でどのような成果物が生成されるかを明記する。マニュアルやインターフェース記述などなど。

#### 影響を受ける組織
> 影響を受ける部門、プロジェクトに参加する部門やグループを特定ます。影響内容を明らかにし、適切なコミュニケーションを図るようにします。

#### プロジェクトの見積もり
 

 スケジュールの概要
* プロジェクトを遂行する上での前提条件・制約条件
* プロジェクト承認要件
* 任命されたプロジェクト・マネジャーの氏名、責任、権限の範囲
* プロジェクト憲章を承認した人、あるいはスポンサー

# プロジェクト憲章を作成する意義

結局のところ、経営陣やステークホルダーから認められるために作成するわけですので、そういった判断が出来る内容であるべきでしょう。
ニーズに対して提供する価値、それをする意義、財務指標がないと判断できませんよね。

あと、降って湧いてきたようなプロジェクトだと、要求と手段を間違えていることがあります。
たとえば「倉庫の入出庫管理システム」を作れという内容。
入出庫管理システムを作ることが命題となってしまっていて、手段を実現するための手段をマネジメントしていくとハマります。この部品とあの部品が組み合わさって仮置き場に行くだの、組み合わさるパターンに条件があるだの、現場に納入したら運用と合わないといった事態に遭遇するのはよくあるパターンです。
入出庫管理システムという頭で取り組んでしまうため、あとから湧いてくる細かい仕様にパンクしてしまいます。
倉庫にある棚や置き場に対する受け入れや払い出しといった部分に注目してシステムを作ってしまうと、いろいろな制約条件がシステムに入れ込みにくくなってしまいます。
本当にやりたかったのは**部材のトレーサビリティー**です。部材のライフサイクルを管理したいというのがニーズなわけで、入出庫監視システムを作ることがニーズではありませんよね。
プロジェクトの上流工程で間違いを起こしてしまうと、後工程では何ともなりません。そういった意味でもプロジェクトのスタートはとても大事です。
サブコマンドを持つコマンドを作るシェルスクリプトのスタイル

# サブコマンドは今時のトレンド

ここでサブコマンドと呼んでいるのは、`yum` や `git` のように、第1引数にさらにコマンドのような文字列が続くものです。

このようなコマンドは `apt` 系などのパッケージコマンドや `cvs` 以降のバージョン管理システムなどでもおなじみでしたが、`git` の登場によって一気に一般的になった気がします。

書籍[「UNIXという考え方」](http://www.amazon.co.jp/UNIX%E3%81%A8%E3%81%84%E3%81%86%E8%80%83%E3%81%88%E6%96%B9%E2%80%95%E3%81%9D%E3%81%AE%E8%A8%AD%E8%A8%88%E6%80%9D%E6%83%B3%E3%81%A8%E5%93%B2%E5%AD%A6-Mike-Gancarz/dp/4274064069) ではコマンドは単機能であるべきということが書かれていますが、昨今はそこそこ複雑な機能を持ったコマンドが多く、この原則は通用しなくなってきているように思えます。

もっとも、サブコマンドが今までのコマンドに相当する部分で、サブコマンドを持つコマンドは名前空間であったり [Facade パターン](https://ja.wikipedia.org/wiki/Facade_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3)であったりといった解釈をしたほうがいいかもしれません。

最近でも `aws` コマンドなどもサブコマンドの模範例となっている感じです。

対して一番厄介なのが `rpm` コマンドのようなオプション体系で、`rpm -qi` といった問い合わせ情報 (query information) オプションは `-q` に `-i` が従属しているということから `-iq` と書くと別の意味になるというあれ。これは POSIX もビックリな（禁止はしていないとは思うものの）仕様じゃないでしょうか。イディオムで書くオプション以外はいつも考えこんでしまいます。

# サブコマンドの作成例

ここではシェルスクリプトとして Bash を書くことにします。可搬性もバッチリなので。

Bash には `case` 文があるので、これを元にディスパッチ的なことをやると一番見通しがいいなと今は感じています。

```bash
#!/bin/bash

subcommand="$1"
shift

case $subcommand in
    foo)
        echo "foo"
        ;;
    bar)
        echo "bar"
        ;;
    *)
        echo "default"
        ;;
esac
```

`case` 文の中に多数の文を書くと見通しが悪くなるので、そこはスクリプト内で関数にまとめてしまうとよいでしょう。

```bash
#!/bin/bash

function foo {
    echo "foo"
}
function bar {
    echo "bar"
}

subcommand="$1"
shift

case $subcommand in
    foo)
        foo
        ;;
    bar)
        bar
        ;;
    *)
        echo "default"
        ;;
esac
```

Bash には Perl のようなコンパイル時と実行時の区別は無いといっていいので、function はコマンド行に置かれる前に定義されている必要があります。

名前を制限してコマンドインジェクション的なことが起こらないことを保証すれば、渡されたコマンド自体を実行するようなディスパッチスタイルも可能でしょう。

```bash
#!/bin/bash

function dispatch-foo {
    echo "foo"
}
function dispatch-bar {
    echo "bar"
}

subcommand="dispatch-$1"
shift

if type "$subcommand" >/dev/null 2>&1 ; then
    $subcommand "$@"
else
    echo "dispatch failed"
fi
```
PHP-FPM(7.0.5)とnginx(1.8.1)

## 環境
* EC2 
* nginx (1.8.1)
* PHP (7.0.5)

## PHP-FPM(FastCGI Process Manager)
### インストール
 
```
# yum install -y libicu-devel
# cd /usr/local/src/
# wget http://jp2.php.net/distributions/php-7.0.5.tar.bz2
# tar xvfj php-7.0.5.tar.bz2
# cd php-7.0.5
```
```
./configure --enable-fpm --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-openssl --enable-mbstring --enable-opcache --enable-intl --with-zlib-dir
```
```
# make
# make install
# php-fpm -v
PHP 7.0.5 (fpm-fcgi) (built: Apr 24 2016 05:20:19)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
```
### 設定ファイル（php-fpm.conf）
 
```
# cp /usr/local/src/php-7.0.5/sapi/fpm/php-fpm.conf /etc/
```
```bash:/ect/php-fpm.conf
# vi /ect/php-fpm.ini
pid = /var/run/php-fpm.pid
include=/etc/php-fpm.d/*.conf
```

### プロセスグループの設定
『PHP-FPMでは、複数の異なるアプリケーション設定のプロセスを同時に実行でき、同じ設定のプロセスグループをプロセスプールと呼びます』
ということらしいので、プロセスグループの設定を/etc/php-fpm.d/以下に配置

```
# mkdir /etc/php-fpm.d
# cp /usr/local/src/php-7.0.5/sapi/fpm/www.conf.in /etc/php-fpm.d/www.conf
```
```bash:/etc/php-fpm.d/www.conf
# vi /etc/php-fpm.d/www.conf
user = @php_fpm_user@
group = @php_fpm_group@
↓
user = nginx
group = nginx
```
### 起動スクリプト

```
# cp /usr/local/src/php-7.0.5/sapi/fpm/init.d.php-fpm.in /etc/init.d/php-fpm
# chmod 755 /etc/init.d/php-fpm
```
```
prefix=@prefix@
exec_prefix=@exec_prefix@

php_fpm_BIN=@sbindir@/php-fpm
php_fpm_CONF=@sysconfdir@/php-fpm.conf
php_fpm_PID=@localstatedir@/run/php-fpm.pid
↓
prefix=/usr/local
exec_prefix=${prefix}

php_fpm_BIN=${exec_prefix}/sbin/php-fpm
php_fpm_CONF=/etc/php-fpm.conf
php_fpm_PID=/var/run/php-fpm.pid
```
```
# chkconfig php-fpm on
# chkconfig | grep php-fpm
# /etc/init.d/php-fpm start
```

## nginxインストール
 * 予めドキュメントルートを作成しておき、phpinfo()でも用意しておく

```
# mkdir /home/nginx/www
# echo '<?php phpinfo();' > /home/nginx/www/phpinfo.php
```
```bash:/etc/yum.repos.d/nginx.repo
#vi /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=0                       
enable=1
```
```
# yum install nginx
# vi /etc/nginx/nginx.conf
```
```bash:/etc/nginx/nginx.conf
location / {
    root /home/nginx/www;
    index index.html;
}
location ~ \.php$ {
    root           /home/nginx/www;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root/$fastcgi_script_name;
    include        fastcgi_params;
}
```
```
# /etc/init.d/nginx configtest
# /etc/init.d/nginx start
# /etc/init.d/nginx stop
# chkconfig --add nginx
# chkconfig --level 35 nginx on
# chkconfig --list | grep nginx
```

## 参照
 * [FastCGI Process Manager (FPM)](http://php.net/manual/ja/install.fpm.php)
RxJS で任意の箇所へイベントを送る


EventEmitter 的なことを RxJS で実現してみました。

> - ES2015 で書いてます。
> - ソースコード全体は GitHub に置いてます。この投稿の末尾のリンクから参照ください。

次のような `RxEventBus` クラスおよび `RxEvent` クラスを用意します。

```javascript:rx_event_bus.es6
import {Rx} from 'rx';

class RxEventBus {

  constructor() {
    this.subject = new Rx.Subject();
  }

  subscribe(key, action) {
    return this.subject
      .filter(event => event.key === key)
      .map(event => event.value)
      .subscribe(action);
  }

  post(event) {
    this.subject.onNext(event);
  }

}

export const rxEventBus = new RxEventBus();

export class RxEvent {

  constructor(key, value) {
    this.key = key;
    this.value = value;
  }

}
```

`RxEventBus` クラスはイベントを仲介するもので、シングルトンインスタンスとして運用します(インスタンス化したものを `export`)。

> 具体的には Rx の `Subject` がイベントを仲介しています。 

`RxEvent` クラスは単にキーと値を保持しているだけのクラスです。キーを用意したのは複数種類のイベントに対応できるようにする為です。値はもし不要であれば空で構いません。

## イベントを送る

### 送る方

`RxEvent` クラスをインスタンス化し、それを引数に `rxEventBus` (シングルトンインスタンス) の `#post` メソッドを呼び出します。


```javascript:
import {rxEventBus, RxEvent} from './rx_event_bus.es6';

// イベントのPOST
rxEventBus.post(new RxEvent('someKey', 'someValue'));
```

### 購読する方

`rxEventBus` (シングルトンインスタンス) の `#subscribe` メソッドでイベントを購読します。第一引数でどのイベントかをキーで指定し、第二引数でイベント受け取り時に実行する処理を定義します。

```javascript:
import {rxEventBus} from './rx_event_bus.es6';

// ...

// イベントの購読
rxEventBus.subscribe('someKey', value => {
  console.log(value); // 'someValue' が出力される
});
```

以上で任意のイベント送信が実現できました。ソースコードは GitHub に置きました。よろしければ参照ください。
⇒ https://github.com/hkusu/rxjs-eventbus-sample

> `$ npm install` で環境が再現できるはずです。利用できる `npm` スクリプトは `package.json` を参照ください。

## ほか

用途的にはデータの変更通知などが考えられるでしょうか。

リークを防止する為、本当は Rx の `Subject` や `Subscription` はもし不要になったら停止した方がいいです。
⇒ [RxJS/doc/gettingstarted/subjects.md](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/subjects.md)
「3進法だとどう変わる」の計算法

「3進法だとどう変わる？」の問題を、数え上げるのではなく計算で求める方法です。
問題は以下のリンクから見てください。
https://codeiq.jp/magazine/2016/04/39669/

何やら難しそうな事を言ってますが、要は三進数で表した時、2を使わない数はいくつか、ということです。
表を見てもらえば分かる通り、0と1のみで表せる数の時が一致します。

問題は「n以下の数を三進数で表した時、0と1のみで表せる数は幾つあるか。」と置き換えられます。

問題では三進数ですが、わかりやすく十進数で考えましょう。
まず、「100未満の数で0と1のみで表せる数はいくつあるか」を考えます。
これは、0,1,10,11の4つです。
それぞれを00,01,10,11と書き表すと、一般法則が見えます。
「10^n未満の数で0と1のみで表せる数は、2^n個ある。」

12345未満の数を考えます。
まず、10000未満の数は先ほどの方法で求められます。
10000以上12000未満の範囲では、1000未満と同様の計算式で求められます。
12000以上12300未満の範囲では、0個です。
なぜなら、12000の時点で2が出ていて、この2が消えないためです。
同様に、12000以上12345未満の範囲で0個ということがわかります。

このように桁数で区切って考えることで数え上げる必要はなくなります。

最後に、n未満で考えていますが、問題文はn以下なので、n自身が0と1で表せる場合は+1する必要があります。
e-Statデータ取得コマンドラインツール

# 目的
* 今更感があるが、e-Statからデータを取得するためにリモート端末上のbashからシェルスクリプトで簡易的に操作できるようにしたもの。

# 内容
## 機能概要
* 使える機能は3つ
    * オプションを-l/-m/-dのいずれかを指定することで機能選択
    * POSTは使わない
    * 統計表情報取得はパラメータを渡さないと76M程度のテキストデータが返ってくるため、あえて作成機関もしくは政府統計コードを指定するように機能を絞った。
* 指定パラメータも限定
    * -vオプションに値を指定（パラメータは機能別に自動選定）
        * 統計表情報(getStatsList)：statsCode
        * メタ情報(getMetaInfo)：statsDataId
        * 統計表(getStatsData)：statsDataId
* 出力はJSON形式、文字コードはUTF-8、改行コードはLF
* 必要パッケージ：curl/nkf/jq
    * apt-getなどで入手してください。

## 利用例
* 事前にe-Statのサイト(https://www.e-stat.go.jp/SG1/estat/eStatTopPortal.do) からappIdを取得
* 以下は、国税庁（作成機関コード：00351）の民間給与実態統計調査（統計表ID：0003045904）のデータを取得する場合

|機能|内容|使用例|
|:------|:------|:------|
|統計表情報取得|統計表から、政府統計コードを指定することで一覧表を取得する|command -l -v 00351|
|メタ情報取得|個別データのメタ情報を統計表IDを指定することで取得する|command -m -v 0003045904|
|統計データ取得|個別統計データの情報を統計表IDを指定することで取得する|command -d -v 0003045904|

# スクリプト
* ファイル名を「estat」などとして、実行権限をつける

```bash
#!/bin/bash

#
# e-Stat API 
#

CMDNAME=`basename $0`                              # コマンド名
URL=http://api.e-stat.go.jp/rest/2.0/app/json/     # e-Stat APIのアドレス
APPID= hogehogehogehogehogehogehogehoge            # appId => 事前にe-Statサイトから入手が必要
LNG=J                                              # 言語指定
OPT=                                               # コマンドラインオプション
OBJECT=                                            # データ取得方法
PARAMNAME=                                         # 指定パラメータ
VALUE=                                             # パラメータの値

#
# 引数の数をチェック/標準エラー出力に使い方を表示
#
if [ $# -ne 3 ]; then
    echo "" 1>&2
    echo "  $CMDNAME e-Stat API情報取得ツール" 1>&2
    echo "" 1>&2
    echo "  e-Stat APIから情報取得内容とパラメータを指定することで、簡易的にJSON形式の標準出力を返す" 1>&2
    echo "" 1>&2
    echo "  ・統計表情報取得: $CMDNAME -l -v 政府統計コード(5桁or8桁)" 1>&2
    echo "  ・メタ情報取得:   $CMDNAME -m -v 統計表ID" 1>&2
    echo "  ・統計データ取得: $CMDNAME -d -v 統計表ID" 1>&2
    echo "" 1>&2
    echo "  (*) curl/nkf/jq パッケージが必要" 1>&2
    echo "" 1>&2
    exit 1
fi

#
# オプション引数の処理
#
while getopts lmdv: OPT
do
    case $OPT in
        l) OBJECT=getStatsList
           PARAMNAME=statsCode
           ;;
        m) OBJECT=getMetaInfo
           PARAMNAME=statsDataId
           ;;
        d) OBJECT=getStatsData
           PARAMNAME=statsDataId
           ;;
        v) VALUE=$OPTARG
           ;;
    esac
done
shift `expr $OPTIND - 1`

curl ${URL}${OBJECT}?appId=${APPID}\&lang=${LNG}\&${PARAMNAME}=${VALUE} 2> /dev/null | nkf -wLu | jq '.'
```

# メモ
* 出力結果をパイプ処理でjqやawkなどに渡すと使い勝手がいい。
Rails link_toヘルパー　[ 自分用メモ ]

link_toヘルパーで、画像と文字列にリンクを貼る

参考サイト
http://papagram.com/link-to-method
http://d.hatena.ne.jp/akitsukada/20110530/1307027950
http://ruby-rails.hatenadiary.com/entry/20140727/1406439331
LinuxのGattToolとExpectを使ってNotificationを受け取るような処理をBashで書く

小技。

gatttoolでNotificationを受け取るには`-I`を使ってインタラクティブモードにする方法があるのですが、
それだと普通なら人間をコマンドを打ち込まないといけない気になります。

ただLinuxのexpectというコマンドを使うことで、期待する標準出力が流れるごとにコマンドを打ち込むという方法が可能です。

```sh
#!/bin/bash

expect <<EOF

spawn gatttool -b AA:BB:CC:DD:EE:FF -I
send "connect\n"
expect "Connection successful"
send "char-write-cmd 0x000a 0100\n"
send "char-write-cmd 0x000b AA\n"
expect "<任意の文字>"
disconnect

EOF
```

これでやろうと思えばなんでも出来そうです。

※ただこれをやるくらいならnobleを使った方が良い
DockerとWindowsのフォルダ共有方法 with tensorflow


環境：Windows8.1

#【経緯】 :sunny: 
http://yaju3d.hatenablog.jp/entry/2016/04/07/011033
上記のサイトを参考にjupyterでtensorflowをいじろうと思いましたが、フォルダ丸ごとのアップロードはできなかったため、
WindowsとDockerを共有すれば簡単にアップロードできるのではないかと思いました。 :laughing: 

しかし、なかなかうまくいかず１時間ほど共有に時間がかかってしまったため、
分かりやすい説明をして情報展開できればいいなと考えました。 :eyes: 

#【準備】 :cyclone: 
 下記のサイトからWindows版のDockerをダウンロードしてインストールします。 :runner: 
　　https://www.docker.com/products/docker-toolbox


#【フォルダ共有手順】  :rocket: 
①「Docker Quickstart Terminal」を立ち上げます。
② 「docker run -p 8888:8888 -p 6006:6006 --name nobu_tensor -v //c/Users/nobu/tensorflow_share:/notebooks -it b.gcr.io/tensorflow/tensorflow」
　をdockerのターミナルで実行します。

・--nameオプションの値は好きなコンテナ名を入力してください
　　（ここではコンテナ名を「nobu_tensor」にしています）
・-vオプションの値は [ローカルの共有したいフォルダパス:Dockerの共有したいフォルダパス] 　　　を入力します。
　　ここではローカルの共有フォルダに「C:\Users\nobu\tensorflow_share」を指定しています。
　　notebooksは変更しないようにしてください
　
　-vオプションの値は各自の環境に合わせて設定してください。

③dockerターミナルで「Ctrl+c」を押してください。「Shutdown this notebook server (y/[n])?」と聞かれるので、「y」を入力してエンターを押します。そうすることでサーバが一旦止まります。
④dockerターミナルで「docker start nobu_tensor」と入力します（nobu_tensorの部分は手順②で入力したnameオプションの値です）。
　下記のサイトへブラウザからアクセスしてみてください。jupyterが起動します。
　　　http://192.168.99.100:8888/
④dockerターミナルで「docker exec -it nobu_tensor bash」と入力するとコンテナへ入れます
　　（nobu_tensorの部分は手順②で入力したnameオプションの値です）。
⑤コンテナへ入ると既にnotebooksフォルダ配下にいますので、例えば「touch aaa.txt」と入力すると「aaa.txt」ファイルが作成されます。
　lsコマンドでファイルが作成されたか確認してみてください。
⑥さて、ローカルに指定した共有フォルダ（C:\Users\nobu\tensorflow_share）を開いてみると、あら驚き・・・。
　コンテナで作成した「aaa.txt」が入っています！！ :grin: 
　さらに、 http://192.168.99.100:8888/　 へアクセスしてみると、またまた驚き・・・。
　「aaa.txt」が現れています！！！ :heart_eyes: 

これで、dockerとwindowsのフォルダが共有され、さらにjupyterへもファイルが共有されています。

#【参考サイト】
・Dockerであそぶ（３）Apacheを使う
　　http://tech.pjin.jp/blog/2015/12/03/docker%E3%81%A7%E3%81%82%E3%81%9D%E3%81%B6%EF%BC%88%EF%BC%93%EF%BC%89apache%E3%82%92%E4%BD%BF%E3%81%86/
・docker コマンド チートシート
　　　http://qiita.com/voluntas/items/68c1fd04dd3d507d4083
・コンテナに入りたい？それ docker exec でできるよ
　　　http://qiita.com/yosisa/items/a5670e4da3ff22e9411a
ubuntuでapt-get install failedなメモ



gitを使いたく、以下のコマンドを実行した時のエラーメモ。
ちなみにubuntuのバージョンは14.04

gitはデフォで入ってなかったので使おうとすると以下のエラーが

```bash
$ git
The program 'git' is currently not installed. You can install it by typing:
apt-get install git
```

で`apt-get install`してみます。

```bash
$ sudo apt-get install git
```

```
Err http://jp.archive.ubuntu.com/ubuntu/ trusty-updates/main git-man all 1:1.9.1-1ubuntu0.2
  404  Not Found
Err http://security.ubuntu.com/ubuntu/ trusty-security/main git-man all 1:1.9.1-1ubuntu0.2
  404  Not Found [IP: 2001:67c:1562::16 80]
Err http://security.ubuntu.com/ubuntu/ trusty-security/main git amd64 1:1.9.1-1ubuntu0.2
  404  Not Found [IP: 2001:67c:1562::16 80]
E: Failed to fetch http://security.ubuntu.com/ubuntu/pool/main/g/git/git-man_1.9.1-1ubuntu0.2_all.deb  404  Not Found [IP: 2001:67c:1562::16 80]

E: Failed to fetch http://security.ubuntu.com/ubuntu/pool/main/g/git/git_1.9.1-1ubuntu0.2_amd64.deb  404  Not Found [IP: 2001:67c:1562::16 80]

E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?
```

https://github.com/72squared/vagrant-redis-cluster/issues/5 を見ると

```bash
$ sudo apt-get update
```

しろって書いてますね。
してから

```bash
$ sudo apt-get install git
```

を実行すると、今度はうまく入りました。

```bash
$ git --version
git version 1.9.1
```
AWSでChainer動かすならcuDNNが最初から入っている環境が楽。

AWSでChainerを動かすのが流行っているようなので下記を参考にして私もやってみましたが
- http://qiita.com/unnonouno/items/78ca98cf4911b5135c6f
- http://qiita.com/RyotaKatoh/items/989c914ad5be123352f1

NVIDIAの　Amazon Linux AMI with NVIDIA GRID GPU Driver　が簡単ということでしたがChainerのインストールはすんなり出来たものの、サンプルプログラミングを実行したところ、cuDNNが入っていないというエラーが出てGPUが使えませんでした。

cuDNNをインストールするにはNVIDIAにユーザ登録が必要ということなので導入の敷居が高いと思い、別の環境を探したところ、以下の環境を見つけました。(AWS Marketplaceで"cuDNN"で検索すると他にも出てきます。)
- Bitfusion Boost Ubuntu 14 Torch 7 (GPU)
 - https://aws.amazon.com/marketplace/pp/B01B4ZSX5S?ref=cns_srchrow

chainerインストールは以下のコマンドを実行するだけ。GPUも問題なく使えます。

```bash
$ pip install chainer
$ pip install pillow
```
今回はg2.2xlargeインスタンスを使いましたが、利用料もNVIDIAと殆ど変わりません。
c++ builder XE4, 10.2 Tokyo > TDateTime > UTCを取得する

```txt:動作確認
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)
```

参考 
~~http://homepage2.nifty.com/Km/contents/20111204.htm~~
(2017/12/27現在 リンク切れ)

```cpp
#include <DateUtils.hpp>
...
TDateTime utcdt =  TTimeZone::Local->ToUniversalTime(Now());
```

ToUniversalTime()のヘルプを見ても使い方がよく分からなかった。上記のリンクが参考になった。
ShellScriptの基本


# 変数

```bash
hoge="Test"

echo $hoge
echo ${hoge}
echo "$hoge"
echo '$hoge'
```

- =にスペースを入れない
- ダブルクォートは変数が展開される
- シングルクォートは変数が展開されない

# 数値演算

```bash
x=10
echo `expr $x + 2`
echo `expr $x - 2`
echo `expr $x \* 2`
echo `expr $x / 2`
echo `expr \( $x + 5 \) \* 2`
```

- exprを使う
- バッククォートで囲む
- アスタリスクと括弧はエスケープが必要

# 配列

```bash
a=(2 4 6)
echo ${a[1]}

# 全ての要素を表示
echo ${a[@]}
# 要素の数を表示
echo ${#a[@]}

a[2]=10

# 要素の追加
a+=(20 30)
```

- 添字の場合かならず中括弧で囲む
- 代入の際は中括弧不要

# 条件式

- `echo $?` で直前のコマンドの戻り値を確認できる
- test の動作確認等に活用可能

## 数値

```bash
num1=1
num2=2

# ==(equal)
test num1 -eq num2
# !=(not equal)
test num1 -ne nume
# >(greater than)
test num1 -gt nume
# >=(greater than or equal)
test num1 -ge nume
# <(less than)
test num1 -lt nume
# <=(less than or equal)
test num1 -le nume
```

## 文字列

```bash
str1="hoge"
str2="huga"
# =(equal)
test str1 = str2
# !=(not equal)
test str1 != str2
```

# 条件分岐
## if

```bash
x=70
if [ $x -gt 60 ]; then
  echo "great!"
elif [ $x -gt 40 ]; then
  echo "success"
else
  echo "fail"
fi
```

- []はtestコマンドの代替（半角スペース必要）

## case

```bash
signal="red"
case $signal in
  "red")
    echo "stop!"
    ;;
  "yellow")
    echo "caution!"
    ;;
  "green")
    echo "go!"
    ;;
  *)
    echo "..."
    ;;
esac
```

- 処理の終了は;;で表す

# ループ
## while

```bash
i=0
while :
do
  i=`expr $i + 1`

  if [ $i -eq 3 ]; then
    continue
  fi

  if [ $i -gt 10 ]; then
    break
  fi

  echo $i
done
```
- 処理の継続はcontinue
- ループの離脱はbreak

## for

```bash
a=(1 2 3 4 5)
for i in ${a[@]}
do
  echo $i
done
```

### seq

seqを利用すると1~100のような場合に楽

```bash
for i in `seq 1 100`
do
  echo $i
done
```

# 特殊変数、コマンド引数
```bash
# プログラム名
echo $0
# 第1引数
echo $1
# 第2引数
echo $2
# 第10引数
echo ${10}
# 全ての引数
echo $@
# 引数の数
echo $#
# 直前のコマンドの実行結果
echo $?
```

## 使い方
```bash
./hoge.sh arg1 arg2
```

# 対話処理
readを使う

```bash
while :
do
  read key
  echo "you pressed $key"
  if [ $key = "end" ]; then
    break
  fi
done
```

## 選択肢形式
selectを使う

```bash
select option in HOGE HUGA
do
  echo "you pressed $option"
  break
done
```

# ファイル読み込み
引数で与えられたファイルを1行ずつ読み込む

```bash
while read line
do
  echo $line
done < $1
```

# 関数

```bash
function hello() {
  echo $1
  local i=1
  echo $i
}

# 関数呼び出し
hello hoge
```

- function は省略可能
- 変数はlocalをつけないとグローバルスコープになる
- 引数は特殊変数で扱う

# 参考
- http://dotinstall.com/lessons/basic_shellscript
[小ネタ]tmuxを使ってSSHログインでの作業を途中から再開する

SSHで作業している時に通信が切れても再度作業途中から再開するためにtmuxを使ったやり方のメモ。
地味ですが、作業を途中の状態から再開できるので便利です。

# 環境

+ Amazon Linux AMI 2016.03.0 (HVM)
+ tmux 1.8

# インストール

SSHログイン先のLinuxにtmuxがインストールされていないとダメなので、とりあえずインストール

```bash
$sudo yum install tmux
```

# リモートホストで作業するとき

普通にSSHログインします。
その後、作業を行う際にはtmuxコマンドを実行後に行います。

```bash
# localからSSHログイン
$ssh ec2-user@hogefuga

# ログイン先ではtmuxを起動して作業をする
$tmux

# この後作業する
```

# リモートホストで作業を再開するとき

通信が切れると端末がローカルマシンに戻ります。
作業を再開する際に、再度SSHログイン後にtmuxコマンドを使って先ほどまで利用していたtmuxのセッションにアタッチすることで通信が切れる前の状態から作業を再開できます。

```
# localからSSHログイン
$ssh ec2-user@hogefuga

# 存在するtmuxのセッション一覧を確認
$tmux ls
0: 1 windows (created Sat Apr 23 07:48:29 2016) [80x42] (attached)

# 存在するセッションが一つなら以下のコマンドでOK
$tmux attach

# 以降、通信が切れる前の状態から作業ができる
```
launchd管理ツールのLaunchControlが非常に便利

Macで定期実行する場合、cronではなくlaunchdを使ったほうが良いと言われています。これはlaunchdの豊富な機能が使えることやスタートアップのデーモンなどと一緒に一元管理できることなどが理由だと思います。しかし、launchdは、XMLの読み辛い書式や、編集毎のlaunchctrl load/unloadの手間、成功/失敗の判断、デバッグが難しいなど、触ってみて挫折した人も多いのではないでしょうか。

私はギリギリのところで[LaunchControl](http://www.soma-zone.com/LaunchControl/)という有償のGUIツールを発見して、挫折を免れました。このツールが非常に便利だったので簡単に紹介します。これを使い始めてから、launchdが好きになりました。


## 環境

* OS X El Capitan 10.11.3

## 使い方

### 画面の説明

左ペイン: ~/Library/LaunchAgentsに配置してある各タスク
中ペイン: タスクの詳細
右ペイン: launchdの設定

### タスクの追加

左下の+ボタンからタスクを追加します。追加後、右ペインから各設定をドラッグアンドドロップで追加できます。追加した設定が誤っている場合は警告が表示されます。

![1.gif](https://qiita-image-store.s3.amazonaws.com/0/5774/a251153d-5a89-098a-42e7-44434cae162a.gif "1.gif")

このGIFで作成したタスクは以下の内容で保存されています。

```xml:~/Library/LaunchAgents/local.helloworld.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Label</key>
	<string>local.job</string>
	<key>ProgramArguments</key>
	<array>
		<string>echo</string>
		<string>helloworld</string>
	</array>
	<key>RunAtLoad</key>
	<true/>
	<key>StandardErrorPath</key>
	<string>/tmp/local.job.stderr</string>
	<key>StandardOutPath</key>
	<string>/tmp/local.job.stdout</string>
</dict>
</plist>

```


### タスクの実行

左ペインからタスクを選択してCommand+Shift+Tでタスクを実行できます。これは `launchctl start` と同じです。

上記のGIFで作成したlocal.helloworldを実行した場合、stdoutのパスに結果が出力されています。

```
$ cat /tmp/local.job.stdout
helloworld
```
Go の標準っぽいプレゼンを作る

いろいろと情報はあるが古い物ばかりなので。
詳しい書き方は[こちら](http://qiita.com/taizo/items/c121803a099b7f80adcf)を参考にどうぞ。

# インストール
```shell-session
$ go get golang.org/x/tools/cmd/present
```

# 使い方
```test.slide
Title of document
Subtitle of document
15:04 2 Jan 2006
Tags: foo, bar, baz

Author Name
Job title, Company
joe@example.com
http://url/
@twitter_name

* slide
```

# 確認
```shell-session
$ cd test
$ present
```

http://127.0.0.1:3999/test.slide#1