OmniAICreator/Qiita-1.07M huggingface dataset:
BBC micro:bitの開発環境 (CK JavaScript)


# BBC micro:bit開発環境
　BBC micro:bitの開発環境を試してみました。micro:bit本体なしでも利用できます。
https://www.microbit.co.uk/

![スクリーンショット 2016-07-22 1.26.03.jpg](https://qiita-image-store.s3.amazonaws.com/0/935/cbd9188d-a538-d51a-1683-60f83e6a8171.jpeg "スクリーンショット 2016-07-22 1.26.03.jpg")


上記URLからアクセスします。作業内容はcookieに保存されるので、特にアカウントなどを作成する必要はありません。（右上にSign inのマークがあるが、これは学校関係者用のものでアカウント作成には学校用のコードが必要）

　Create Codeをクリックすると4種類の開発環境が選択できます。
　![スクリーンショット 2016-07-22 1.28.13.jpg](https://qiita-image-store.s3.amazonaws.com/0/935/dad9f3a7-fc03-76ab-5de5-f9af3cda4194.jpeg "スクリーンショット 2016-07-22 1.28.13.jpg")


+ Code Kingdoms JavaScript
+ Microsoft Block Editor
+ Microsoft Touch Develop
+ MicroPython

　これらのうちMicroPythonはチュートリアルもエミュレータもありません。Block Editorはブロックの組み合わせ、Touch Developはテキストをドラッグ＆ドロップしてコーディングする独自言語で、両方ともほぼ同じものです。Block EditorからTouch Developへのコンバータがあります。Code Kingdoms JavaScriptはエミュレータがSHAKEや傾きなどに対応しており、実機なしの状態ではいちばん使いやすいと思います。

## Code Kingdom JavaScript

　Code Kingdoms JavaScriptを試してみます。Follow Tutorialではサイコロを作ります。指示どおりに左側のパレットから選んでスクリプトに挿入していけばできます。
　RUNでエミュレータ実行、エミュレータにあるSHAKEのボタンを押すとランダムに1〜6の数字を表示します。
　スクリプト画面の表示は下部にあるセレクタでブロック風の表示からテキスト表示まで切り替えることができます。

![スクリーンショット 2016-07-22 1.51.53.jpg](https://qiita-image-store.s3.amazonaws.com/0/935/bb5f4739-3158-3d3b-b7a1-729fc0734be9.jpeg "スクリーンショット 2016-07-22 1.51.53.jpg")

![スクリーンショット 2016-07-22 1.52.11.jpg](https://qiita-image-store.s3.amazonaws.com/0/935/7044c04e-e338-e8e8-d866-3bcda3e23c17.jpeg "スクリーンショット 2016-07-22 1.52.11.jpg")

![スクリーンショット 2016-07-22 1.52.40.jpg](https://qiita-image-store.s3.amazonaws.com/0/935/bfb05128-a84c-e9b6-dd8a-efd90f9e90d7.jpeg "スクリーンショット 2016-07-22 1.52.40.jpg")

![スクリーンショット 2016-07-22 1.52.55.jpg](https://qiita-image-store.s3.amazonaws.com/0/935/10f771b7-cbdb-ad2e-89d1-21d68e203a09.jpeg "スクリーンショット 2016-07-22 1.52.55.jpg")

COMPILEをクリックするとHEXファイルが作成されます。(例 microbit.hex) micro:bit本体をPCに接続し、"mbed"という名称のドライブが現れたらこのファイルをコピーすると実行できます。
HEXファイルはMy Scripts画面のImport Codeで参照してコードを取り込むことができます。

　スクリプトの保存はMy Scripts画面で保存をクリックすると拡張子.jszのファイルが作成されます。HEXファイルと同様にInport Codeでコードを取り込むことができます。

![スクリーンショット 2016-07-22 2.36.39.jpg](https://qiita-image-store.s3.amazonaws.com/0/935/fdd1fe05-5609-b1f5-8b01-3e69a54cedd2.jpeg "スクリーンショット 2016-07-22 2.36.39.jpg")

　なお公開はクリックしてもできません。学校関係者のアカウントが必要です。
その first は本当に必要なのか


**要素数が必ず1になる配列**から値を取り出すという状況には、意外と遭遇すると思います・・・・いや、やっぱりしないかもしれません。例えばrailsだと・・・

```rb
# emailカラムはユニーク
User.where(email: 'sample@gmal.com').first
```

みたいなのです。find_by使えと突っ込まれそうですが、実際に業務の中でこのようなコードには頻繁に遭遇します(自分で書くことはありませんが・・・)。

私が現在扱っている自社メディアのコード内に限った話ですが、このような処理を行っている箇所では、必ずと言っていいほど**firstを使って値を取り出していました**。

## そのfirstに意味はあるのか

```rb
[1].first
```

上記の処理を日本語で説明するなら、**"要素数が１の配列から、先頭の要素を取り出す"**と言えると思います。ここでは**先頭の要素を選択**していますが、そもそも選択候補が1つしかないわけです。結果、メソッドの意味とコード中での目的が食い違うこととなり、コードの可読性を落としてしまいます。こういった処理は避けたほうがいい気がします。しかし、実際このような記述は、苦肉の策として理解できなくもありません。

## そもそも何が言いたいのか

何が伝えたいのか分からなくなってきましたが、結局言いたいのは・・・
**firstとかが出てくるコードには、何らかの技術的負債があるかもしれない**ということです。あくまでも私見であり、これらが効果的に使える場面も多々あるとは思います。

以下、おまけです。

## 仕方がない場合はどうするか

では、**"要素数が１の配列から、値を取り出す"**という行為がどうしても必要な場合はどうしましょう。例えばfirst以外にも代替案として以下のようなものがありますが・・・

```rb
[1].first
[1].last
[1].sample
[1].pop
[1][0]
```

いずれも目的とは意味が食い違います。

## せめて処理が速いものを

どーせ無理なら少しでも速いものを選択したいです。というわけで、以下の処理を行い、処理速度を計測してみました。

```rb
# helloという文字列が入った要素数1の配列を2000000個持つ配列を宣言
array = Array.new(2000000).map { Array.new(1, 'hello')}

# 実行時間計測用
t = Time.now

array.each do |val|
  val # ここを変化させて、それぞれ処理時間を計測する
end

p Time.now - t
```

上記のコードで、each内のvalを随時変更して、処理にかかった時間を計測してみました。10回の平均値をとっています。

|コード|実行時間|
|---|---|
|val(要素を取り出さない)|0.078 s|
|val.first|0.119 s|
|val.last|0.118 s|
|val.sample|0.125 s|
|val[0]|0.099 s|

当然ではありますが、**val[0]**が明らかに速いです。

また、**タイプ数**で比較すると、**firstが5タイプ**、**lastが4タイプ**、**[0]が3タイプ**です。しかし、**[0]**はホームポジションから遠いため、少し打ちずらいですね。というわけで、タイピングの打ち易さから考えると、**last**が最善に思えます(firstとlastに速度差はないですし)。

## 結局どうすればいいのか

処理が速いのは文句なしに**val[0]**の書き方です。打ち易いのはlastですかね。ですが、これがいいのかというと正直微妙です。そもそも、 "要素数が1と確定している配列から値を取り出す" という処理なんかするなって話ですが・・・


何か助言がありましたら、ぜひお願いします。
neovim で deoplete + neosnippet の連携をする


[deoplete](https://github.com/Shougo/deoplete.nvim) は [neovim](https://github.com/neovim/neovim) の補完プラグインなのですが，設定をせずに [neosnippet](https://github.com/Shougo/neosnippet.vim) のスニペット機能を同時に利用しようとしてもうまくいきません．
例えば，for 文を展開しようとしても，補完結果として `for` と出力されるだけで，for 文のフォーマットをよしなに出力してくれません．
そこで，以下のように，`dein.toml と dein_lazy.toml` に設定するとスニペット機能を利用できます．

```dein.toml
# dein.toml

[[plugins]]
repo = 'Shougo/neosnippet-snippets'
```

```dein_lazy.toml
# dein_lazy.toml

[[plugins]]
repo = 'Shougo/deoplete.nvim'
hook_source = '''
  let g:deoplete#enable_at_startup = 1
  inoremap <expr><tab> pumvisible() ? "\<C-n>" :
        \ neosnippet#expandable_or_jumpable() ?
        \    "\<Plug>(neosnippet_expand_or_jump)" : "\<tab>"
'''
on_i = 1

[[plugins]]
repo = 'Shougo/neosnippet'
hook_source = '''
  imap <C-k> <Plug>(neosnippet_expand_or_jump)
  smap <C-k> <Plug>(neosnippet_expand_or_jump)
  xmap <C-k> <Plug>(neosnippet_expand_target)
  if has('conceal')
    set conceallevel=2 concealcursor=niv
  endif
'''
on_i  = 1
on_ft = ['snippet']
depends = ['neosnippet-snippets']
```

以下のように補完機能もスニペット機能も利用できます．

gif での入力キー表示は以下の入力を表しています．

* ^k   : Ctrl-k
* ->|  : TAB


![movie_out.gif](https://qiita-image-store.s3.amazonaws.com/0/68124/22519072-398e-5ae9-a5d7-408155db6545.gif "movie_out.gif")
初心者のDocker入門2 - Docker Engine・Compose・Machine・Swarm

[前回](http://qiita.com/queth/items/1297e77eece7706c1d36)に引き続き、Docker初心者がDockerに関して学んだことのアウトプットです。

今回はDocker社が提供している主だったツールに関して書いています。

#Docker社提供ツール

| ツール名          |概要　　　　　　　　　   　　　　　　　　　　　　　　　　　　|
|:----------------|:-------------------|
| Docker Engine   |Docker本体。コンテナに関する機能を提供。|
| Docker Compose  |複数のコンテナを管理することの出来るツール。|
| Docker Machine  |Dockerホストを構築するツール。|
| Docker Swarm    |Dockerホストのクラスタを管理するツール。|

#Docker Engine
Dockerといえばこれ。
Linuxのコンテナ化仮想技術を使用して、コンテナの操作、docker imageの操作、ネットワークの操作、ボリュームの操作等を提供する。

#Docker Compose
複数のコンテナを一括で操作する機能を提供するツール。
コンテナ情報を記載した定義ファイルを用意することで、定義されているコンテナを一括で操作することが可能。
Docker Composeを利用して作成した複数のコンテナは一括で作成、削除が可能なので、一時的に環境を構築する際などに便利そう。

#Docker Machine
仮想マシン上にDockerホストの構築と管理を行うことの出来るツール。
指定した仮想マシン（Dockerを動作させることの出来る）にDocker EngineをインストールしDockerホストを構築する。
後述するDocker Swarmの環境を構築する際にもDocker Machineを使用可能。

#Docker Swarm
Dockerのクラスタリング用ツール。
Swarmマネージャ、Swarmノード、ディスカバリ・バックエンドといった要素から成り、コンテナのスケジューリングが可能。
Docker 1.12RC（リリース候補）からDocker Swarmの機能はDocker Engineに「swarmモード」として統合された模様。

#参考URL
- Docker ドキュメント日本語化プロジェクト
    - http://docs.docker.jp/index.html
- Qiita 「Docker 1.12RC の swarm mode チュートリアル」
    - http://qiita.com/zembutsu/items/6fb6eface38d62b3584d

#次回
Docker Engineを利用して、実際にコンテナの操作を行っていく予定です。
Ruby による toggl と Slack を連携させたタスク管理スクリプトを作った

## 概要

toggl と Slack を使ったタスク管理ができるスクリプトを作りました。

* [toggl_slacker](https://github.com/toririn/toggl_slacker)

詳しい使い方やデプロイ方法は上記のGithubに書いています。Dockerがあると5分ぐらいでデプロイ出来ます。
とりあえず機能を簡単に説明しますと、以下のように自分の指定した時間に今togglで実行しているタスクをSlackに投稿してくれます。


![task.png](https://qiita-image-store.s3.amazonaws.com/0/101975/771df9fb-8b84-2e16-6d91-43b28edd0211.png)


他にも設定した業務終了時刻になればメッセージが送られてきて、

![night.png](https://qiita-image-store.s3.amazonaws.com/0/101975/59a37703-2304-00eb-3bd6-c0d70003e968.png)


指定した時間にその日一日の簡単な日報を送ってくれます。

![daily.png](https://qiita-image-store.s3.amazonaws.com/0/101975/6b5350bf-d9d5-acd6-21a3-0ac6a97faf0e.png)

使うためには　Slack の API TOKEN と Toggl の API TOKEN が必要です。

* [Slack WEB API](https://api.slack.com/docs/oauth-test-tokens)
* [Toggl PROFILE](https://toggl.com/app/profile)
    * 一番下のAPI TOKEN にあります

## そもそもTogglって？

タスク管理等に使える時間計測のサービスです。

* [toggl公式サイト](https://toggl.com/)

とっても簡単に使える割には、
指定した期間のタスク内容と時間を細かく集計や解析できたりと、
とても多機能です。日々の生産性の見るにはかなり重宝されるかと思います。

### タスクの設定方法

https://toggl.com/app/timer
へアクセスするとタスクの設定ができる画面へと遷移します。

![timer.png](https://qiita-image-store.s3.amazonaws.com/0/101975/d57ce1cf-a52f-e6fd-768f-9a4bf4689056.png)

*1* にタスクに説明
*2* にプロジェクト
*3* にタグ（後で説明します）
を入力して *5* のスタートボタンを押すことで時間の計測が始まります。
計測が始まると *4* に時間が表示されます。

タグはタスク内容を識別するためによく使います。
例えばタスクにNoを振り分けておけば、集計のときなどに助かるかと思います。

![tag.png](https://qiita-image-store.s3.amazonaws.com/0/101975/7d2513ee-896c-16d4-4140-d87d3f19bfec.png)

またこのタグは上記で作成したスクリプトの日報作成時にも使われるので、
登録をしておくとよいかと思います。

これでタスクの登録と計測は完了です。

もし前回登録したタスクの作業をまた行うのであれば、
*6* のようにタスクが残っているので、そこをクリックすることで同じ内容・プロジェクト・タグの作業ができます。

例えば定期的な会議や当分続く作業は、何度も入力せずに *6* に残っているタスクをクリックすれば良いかと思います。


### レポートを見る

ヘッダーの　Reports → Summary　を押すと
下記のようにタスクの集計結果をグラフにして表示をしてくれます。

![report.png](https://qiita-image-store.s3.amazonaws.com/0/101975/5a1eec9b-e1e0-3803-b624-3c2ad96198dc.png)

1週間に1度、自分のタスク内容をふりかえって、
改善をするための材料として使えるかもしれません。

****

Togglの説明は以上です。
とりあえず使ってみるとその便利さに気付くかと思います。

ぜひとも使ってみてください。

## おまけ・いけてないところ

Toggl ではなく作ったスクリプトのいけてないところです。

* 新規作成時のタスクを読み込んでくれない

新規作成したタスクを計測し続けてもその時間を計測してくれません。
`新規作成　→　Start → Stop` という手順でタスクが登録されなければ *API* で取得できないからかもしれません。
一度タスクを新規で登録したら *START* を押してすぐに *STOP* し、もう一度 *START* を押せば問題なくうごけます。

```
う～ん…どうにかしたい。
```

* 文章を変えられない

今後変える予定ですが、今のところ *Slack* に投稿される文言は一定です。
ここは変えられるようにしたいです……。

* 使い方が固定的

自分用に作ったので柔軟なことが出来ません……。

# キュアゴリラ

かわいい……。
CIを入れる時はどこからやると良いか？

Jenkinsを入れて、プロジェクト管理する場合、スケジュールと予算に影響することがあります。

スケジュールと予算に影響させない、品質管理の方法です。

# ソースコードカウントはするべき

MVCそれぞれのディレクトリのソースコード量の変化を日々管理することで、
進捗の見える化ができます。

やってみるとわかるのですが、作業終盤になると、グラフが滑らかになってきます。

# 導入当初は、テストコードを増やすことにこだわらない。

初めからテストコードで品質を担保する計画だった場合はこの限りではありません。

雑誌などの記事では、テストコードを使って品質管理することが書かれていますが、
テストコードは、ある程度ないと、品質を担保できないので、
導入のハードルが高いです。

初めのうちは、CIを少しでも役立たせることに注力して、しっかり役立つ状態になってから、
テストコードなどの資産を増やすのがオススメです。

# インスペクションは必須

Git や SVN と連動も必須です。

ゆるい管理だと、SVNにコミットされたタイミングで、インスペクションを実行し、
規約違反のソースを修正するタスクを立てます。

最近だと、Git を使って、コードレビューを含むフローだと思いますので、
レビュー前にインスペクションを走らせて、OKだったら、レビューする。
というフローにすると、レビューの負担が減りますね。


# 最後に

ソースコードカウントと、インスペクションだけでも管理の手間が大幅に減ります。
製造フェーズに入る前には、JenkinsなどCIを導入することをオススメします。
【PHP】phpredisでredisの操作

参考
[CentOSにRedisをインストールしてみる](http://d.hatena.ne.jp/yk5656/20140922/1411884036)
[PHPでRedisを使ってみる](http://d.hatena.ne.jp/yk5656/20140923/1411889810)


#Redisインストール

※OSはCentOS6

###yumリポジトリのepelの追加

```
rpm -ivh http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
```

###Redisインストール

```
yum -y install redis --enablerepo=epel
```

###起動/自動起動設定

```
service redis start
chkconfig redis on
```

#phpredisのインストール

###補足
PHPでは、Predisとphpredisが有力。PredisはPHPのみで記載されたライブラリで、phpredisはC言語のエクステンションとのこと。phpredisの方が高速。

###phpredisインストール

```
yum -y install php-pecl-redis --enablerepo=epel
```

###Apacheを再起動して反映

```
service httpd restart
```

#phpredisの使い方

###String型

```
$redis = new Redis();
$redis->connect("127.0.0.1",6379);

//クリア
$redis->delete('key');

//値のセット
$redis->set('key', 'value');

//値の取得
$value = $redis->get('key');
```
Neovim や Vim でコピペする方法


最近 Neovim に移行したのですが，Macvim で可能であったビジュアルモードで範囲指定して Ctrl-C でクリップボードへのコピーができなくなりました．
そこで，Neovim 開いたファイルをクリップボードにコピーする方法を調べました．

vim のレジスタ
--
vim ではヤンクや削除するとレジスタに値が保存されます．レジスタには次のような種類があります．

### 無名レジスタ
特にレジスタ名を指定しない場合に利用されるレジスタ．
`yy` ではカーソルがある行を無名レジスタに保存し，`p`では無名レジスタから値を持ってきて貼り付けます．

### 指定したレジスタ
保存するレジスタ名を指定してヤンクすることも可能です．指定の方法は`"レジスタ名`となっています．
例えば，レジスタ r にヤンクしたいときは，`"ryy`となります．

### 0(ゼロ)レジスタ
また，vimには特殊なレジスタとして，0(ゼロ)レジスタというものが存在します．指定の方法は`"0`となっています．
このレジスタはヤンクされた値は保存しますが，削除された値は保存されません．
以下の gif はその動作例です．

1. yy -> {無名 = "first line", 0 = "first line"}
1. dd -> {無名 = "second line", 0 = "first line"}

といったようにレジスタの値が遷移しています．

![movie2.gif](https://qiita-image-store.s3.amazonaws.com/0/68124/a204c167-2b98-52d0-7006-130da400b24f.gif "movie2.gif")


クリップボードのレジスタ
--
そして，レジスタとしてクリップボードを指定することも可能です．指定の仕方は`"*`となっています．
以下の map を ~/.config/init.vim や .~/vimrc に追加することで，vim でもクリップボードを活用できるようになります．

```init.vim
" copy & paste map
nnoremap <Space>d "*dd
vnoremap <Space>d "*dd
nnoremap <Space>y "*yy
vnoremap <Space>y "*yy
nnoremap <Space>p "*p
vnoremap <Space>p "*p
```

`:r!pbpaste` はそれぞれ

* `:r` コマンドの出力を挿入する
* `!pbpaste` クリップボードの値を出力する Mac のコマンド

となっており，クリップボードを活用できていることが確認できました．

![movie3.gif](https://qiita-image-store.s3.amazonaws.com/0/68124/0e3a6ce3-e6bd-8e5c-ea41-96bb4c3f8473.gif "movie3.gif")


インサートモードでクリップボードから paste したいときは，`<C-r>*` でできますが，普通に Command-v でも paste できるので特に map しなくてもいいかなと思いました．

参考
--

[Vim でコピペするときの Tips](http://cohama.hateblo.jp/entry/20130108/1357664352)
ポケモンGOの配信チェック(Perl版)


## はじめに
ポケモン赤緑以来、かれこれ二十年くらいポケモンやってないのに、いつ日本で配信されるのかとApp Storeをちょくちょく確認している自分がいます。
アメリカでめっちゃ流行ってますね。任天堂の株価も気になりますね。

そんななか、、、

＿人人人人人人人人＿
＞ なんだこれは! ＜
￣Y^Y^Y^Y^Y^Y^Y￣


* [【スタダ】ポケモンGOがリリースされたら電話掛かってくるスクリプト](http://qiita.com/haminiku/items/991d4ac380ca3ef29dd1)

* [ポケモンGOの配信チェック(PHP版)](http://qiita.com/hikarut/items/486d49ebb0ac1110b7d2#_reference-d50e597de47b388fd9b6)

コレは面白い、、、
ということで早速、パクらせていただきました＼(^o^)／

## 実装してみる
久しぶりにPerlを使ってみました。myとか懐かしいｗ

```
#!/usr/bin/perl
use strict;
use warnings;
use Encode;
use LWP::Simple;
use Mail::Sendmail;

main();

# sudo cpan install Mozilla::CA
# sudo cpan install Mail::Sendmail
sub main {
	my $url = 'https://itunes.apple.com/jp/app/apple-store/id1094591345?mt=8';
	my $ua = LWP::UserAgent->new(ssl_opts => { verify_hostname => 1 });
	my $response = $ua->get($url);
	if ($response->is_success) {
		if (index($response->content, 'カスタマーレビュ') > 0) {
			my %mail = (
				'Content-Type' => 'text/plain; charset="iso-2022-jp"',
				'From' => 'pokemon-get-daze@example.com',
				'To' => 'pokemon@exapmple.com',
				'Subject' => encode('MIME-Header-ISO_2022_JP', 'Pokemon GO was released in Japan!'),
				'message' => encode('iso-2022-jp', "Pokemon Go!\n$url")
			);
			sendmail(%mail) or die $Mail::Sendmail::error;
		 	print "OK. Log says:\n", $Mail::Sendmail::log;
		} else {
			print "not released\n";
		}
	}
}

```


## cpanモジュールをインストール
そういえば、Perlってcpanってものがありましたね。インストールしないと動きませんよ。

```
$ sudo cpan install Mozilla::CA
$ sudo cpan install Mail::Sendmail
```

## Macでメールを送る
Postfixを起動。

```
sudo postfix start
```

## 

## 実行
とりあえず手動実行。cronに登録したらいいと思いますよ。

```
$ yokoyama@MBAY:~/perl/pokemonGo (master)$ perl pokemonGo.pl 
OK. Log says:
Mail::Sendmail v. 0.79 - Fri Jul 22 00:41:03 2016
Date: Fri, 22 Jul 2016 00:41:03 +0900
Server: localhost Port: 25
From: pokemon-get-daze@example.com
Subject: Pokemon GO was released in Japan!
To: pokemon@exapmple.com
    
Result: 250 2.0.0 Ok: queued as 6524065FD5FAy
```

## ソースはこちら
https://github.com/tatsuya-yokoyama/pokemonGo
こんなプロジェクトは破綻する

備忘です。

# 締め切りを決めないで作業だけ進めている。

よくありますよね。

締め切りを決めずに、依頼だけ受けて、
「調査」とか「できることからやる」みたいな感じで、ゆる〜く作業している状態です。

この状態の末路は、依頼者から、
「まだなの？」
みたいな話になって、締め切りのことで文句を言われ、最終的には、
「今まで何してたの？」
みたいな話になり、関係性を崩すパターンです。

原因のほとんどは、
「締め切りを決めると、後で何かあった時に伸ばせない。メドがついてから合意しよう。」
という甘い考えです。

大抵の場合、依頼者には終了の希望があるので、こんな甘い考えで許されるはずもなく、
結局破綻することになります。

# 進捗管理が場当たり的

具体的には、今どの程度進んでいて、残りどのような作業が、どの程度あるのか？
ということが日々管理されていない状態です。

数名程度のプロジェクトで多く、ベテランだらけのプロジェクトだと特に多い傾向にあります。

原因は、
「みんなベテランだから大丈夫だろう」
という甘い考えです。

また、
「進捗を管理する手間よりも、少しでも多く作業を進めよう。」
という考えも危険です。

想定外の事態が発生して、作業の追加や変更が起こることはよくあることなので、
予実がわからない状態で、進めるのは危険です。

残りの作業量と時間を把握しながら進めないと、終わりに近づいた時に
「なんとなく時間が足りない気がするが、まぁ大丈夫だろう。」
という日が来ても何もせず、
「やばいだめだ」
という日になって、焦って、バタついて、余裕がなくなって、険悪な雰囲気になって、
離脱者が出て、チームが破綻する。

というシナリオです。

面倒でも、予実は、毎日管理しましょう。


# 製造作業中に追加要件の対応をする。

危険度は中です。

大抵の場合、スケジュールはギリギリで組むので、そんなことをする余裕はないはずです。

そんなことができるなら、余裕のある計画だったと見抜かれて、次から次へと追加の要求が出てきます。
そして、それを断りきれずに破綻します。

- 作り始めたら、極力仕様は変えない。。
- 仕様を変えるのであれば、設計をやり直す。（前の工程からやり直す。）

が原則だと思います。

# その他

ちょっと書ききれないので、列挙だけ。

- メンバーが、スケジュールを把握していない。　（場当たり的に作業しているので少しづつ遅れる。）
- 日報の報告欄で常に 「問題なし」 。　（そんなはずはない。小さな問題を報告していない。）
- PMが一番たくさん開発作業をしている。　（他にやるべきことはできている？）
- PMが成果物の確認を一切しない。　（成果物に責任が持てるのか？）
- PMが休みがち。　（誰が現場の指揮をとるのか？？）
- リーダーが無口
- リーダーが非積極的
- まだプロジェクトの途中なのに責任を押し付ける準備をしている。　（そもそも終わらない。）
- なんか助言者がいっぱいいる。　（複数の助言者が一貫性のあることを言う可能性の方が低い。本質ではない作業が増えて、スケジュール遅延or品質落ちる。）


思い出したら、追記します。。
MyBatisの@MapKeyを使ってListをMapとして取得する


MyBatisでSQL結果をListで取得するのはとても簡単で、Mapperを使う場合だったら下記のように書けます。

```PersonMapper.java
public interface PersonMapper {
	@Select("SELECT * FROM people")
	List<Person> findAll();
}
```

でも、場合によってはListじゃなくて、例えばIDなどをキーとしたMapで取得したいこともあると思います。

Streamを使うと、Listで取得した結果からIDをキーとしたMapを作ることができます。

```java
Map<Integer, Person> resultMap = personMapper.findAll().stream()
	.collect(Collectors.toMap(Person::getId, v -> v));
```

これはこれで、「Java8 Stream使ってる俺カッコいい感」感じますけど、ちょっとめんどくさいです。

MyBatisには@MapKeyアノテーションがあって、上記でやったことを簡単に実現できます。

```PersonMapper.java
public interface PersonMapper {
	@Select("SELECT * FROM people")
	List<Person> findAll();

	@MapKey("id")
	@Select("SELECT * FROM people")
	Map<Integer, Person> findAllMap();
}
```

アノテーションのvalueにはMapのキーとしたいカラム名を設定します。

Mapperのそれぞれのメソッドの結果を出力すると以下になりました。

```
findAll => [Person(id=1, name=Bob, country=USA), Person(id=2, name=Taro, country=Japan), Person(id=3, name=Zidane, country=France)]
findAllMap => {1=Person(id=1, name=Bob, country=USA), 2=Person(id=2, name=Taro, country=Japan), 3=Person(id=3, name=Zidane, country=France)}
```


サンプルソース
---------------
https://github.com/gillax/mybatis-boot-sample/tree/0.1
【Swift】RxSwiftのPlaygroundを読む④

RxSwiftのPlaygroundを読んでみるシリーズ今回は流れてくる値をあれこれして別の流れにしてしまう操作についてです。
([Transforming_Operators](https://github.com/ReactiveX/RxSwift/blob/master/Rx.playground/Pages/Transforming_Operators.xcplaygroundpage/Contents.swift))

# Transforming Operators
流れてくるnextイベントの中身にいろいろな操作をして、
新たなObservableとして流す処理です。

## map
nextの中身を操作して、新たなObservableとして流す。

```swift
Observable
    .just("🍑")
    .map { $0 + "🍐" }
    .subscribe { print($0) }
    .addDisposableTo(disposeBag)
```

**結果**

```
Next(🍑🍐)
Completed
```

## flatMap, flatMapLatest
本流を流れてきた値をもとに、違う流れを作り、
本流と作った流れを同時に観察するObservableを返す。

本流を違う値が流れてきたときに、
それまで作った別の流れを引き続きsubscribeするのがflatMap、
それまで作った別の流れを破棄して新しく作った流れのみsubscribeするのがflatMapLatest。

```swift:flatMap
let disposeBag = DisposeBag()

struct Fruit {
    var fruit: Variable<String>
}

let 🍑 = Fruit(fruit: Variable("🍑"))
let 🍎 = Fruit(fruit: Variable("🍎"))

let fruit川 = PublishSubject<Fruit>()
fruit川
    .flatMap { $0.fruit.asObservable() }
    .subscribe { print($0) }
    .addDisposableTo(disposeBag)

fruit川
    .onNext(🍑)

🍑.fruit.value = "🍊"

fruit川
    .onNext(🍎)

🍑.fruit.value = "🍉" // 流れる
```

**結果**

```
Next(🍑)
Next(🍊)
Next(🍎)
Next(🍉)
```

```swift:flatMapLatest
let disposeBag = DisposeBag()

struct Fruit {
    var fruit: Variable<String>
}

let 🍑 = Fruit(fruit: Variable("🍑"))
let 🍎 = Fruit(fruit: Variable("🍎"))

let fruit川 = PublishSubject<Fruit>()
fruit川
    .flatMapLatest { $0.fruit.asObservable() }
    .subscribe { print($0) }
    .addDisposableTo(disposeBag)

fruit川
    .onNext(🍑)

🍑.fruit.value = "🍊"

fruit川
    .onNext(🍎)

🍑.fruit.value = "🍉" // 流れない
```

**結果**

```
Next(🍑)
Next(🍊)
Next(🍎)
```

## scan
流れてくる値ごとに処理を行い、
処理した値を保持すると同時にその値を流す。

```swift
Observable
    .of("🍑", "🍐", "🍑", "🍐", "🍑", "🍐")
    .scan("🍎") { aggregateValue, newValue in // aggregateValueに処理の結果を保持する
        aggregateValue + newValue
    }
    .subscribe { print($0) }
    .addDisposableTo(disposeBag)
```

**結果**

```
Next(🍎🍑)
Next(🍎🍑🍐)
Next(🍎🍑🍐🍑)
Next(🍎🍑🍐🍑🍐)
Next(🍎🍑🍐🍑🍐🍑)
Next(🍎🍑🍐🍑🍐🍑🍐)
Completed
```

# おわりに
flatMapはようやく感じが掴めてきました。
(文章にするのは尚難し。。)

次回はフィルターやある条件の元で値を流す処理についてです。

# 参考
https://github.com/ReactiveX/RxSwift/tree/master/Rx.playground
【Vagrantドキュメント意訳】00.目次

# はじめに

Vagrantに興味を持ったのはいいが、わからないことがあるたびに[公式ドキュメント](https://www.vagrantup.com/docs/)を訳すのに時間を費やしていました。Vagrantのコマンドの詳細を知るために、何度となく公式ドキュメントを見ているうちに、その行為がめんどくさくなり、いっそ全部自分で訳して非公式日本語ドキュメントつくったろかい！と取り掛かったの始まりです。とはいえ、英語が読めるなんてお世辞にも言えませんので、あくまでも自分用の覚書です。

もし少しでもご参考にできる部分があるのでしたら、お役に立てていただければ幸いですが、前述のとおり決して**英語力がある人が書いたものではない**ので、クリティカルな作業における参考資料としてはおすすめいたしません。そのような場合は**必ず**公式ドキュメントをご参考ください。

なお、本記事群の記載に基づくいかなる不具合についても、一切責任を負うことはできませんので、悪しからず。

# 目次

本ドキュメントは[Vagrant公式ドキュメント](https://www.vagrantup.com/docs/)のセクション毎に一つの記事として構成されています。以下に各セクションへのリンクを掲載いたしますので、目次的にご使用いただければ幸いです。

* [01.概要](http://qiita.com/ringo0321/items/23c452ab04e75b211825)
* [02.なぜVagrantか？](http://qiita.com/ringo0321/items/8c60e13cca90924821eb)
* [03.インストール](http://qiita.com/ringo0321/items/7e771dda3493ab3c5382)
* [04.入門](http://qiita.com/ringo0321/items/07df872d6c99b961be9b)
* [05.コマンドライン・インタフェース](http://qiita.com/ringo0321/items/c3720a54855e9c961a91)
* [06.Vagrant共有](http://qiita.com/ringo0321/items/224150c93f2930eec54a)
* [07.Vagrantfile](http://qiita.com/ringo0321/items/ddf1c8c40014eb88b0b6)
* [08.Box](http://qiita.com/ringo0321/items/f76da11503c627205c52)
* [09.プロビジョニング](http://qiita.com/ringo0321/items/38743442a9abfc3be5b2)
* [10.ネットワーク](http://qiita.com/ringo0321/items/4ebc0ac3bb98240f65ce)
* [11.同期フォルダ](http://qiita.com/ringo0321/items/aec4c543cce63e60a529)
* [12.マルチ・マシン](http://qiita.com/ringo0321/items/1a6ebccfb2733f6e2de1)
* [13.プロバイダ](http://qiita.com/ringo0321/items/0861cd7e4f630e73164a)
* [14.プラグイン](http://qiita.com/ringo0321/items/e801a0cf867da48c32e3)
* [15.Push](http://qiita.com/ringo0321/items/ab162e6786a0e30685d4)
* [16.その他](http://qiita.com/ringo0321/items/18e08958b60d97b0c930)

# 最後に

取り掛かり始めてから4カ月を経て、ようやく全セクションを訳し終えました。繰り返しになりますが、大した英語力もないので、誤りがかなり多く含まれているかと思います。もし「これはこう表現したほうが良い」や「いやいや、まったく逆のこと書いてるよ！」などお気づきの点があれば、ご指摘いただきたく。
MarkdownでLabelへのlink

<a name="top"></a>マークダウンでラベルへリンクしたい場合これでリンクできる。

```
<a name="label"><a>label

[to label](#label)
```



#<a name="label1"></a>見出し1
本文本文本文本文本文本文本文本文本文本文本文  
本文本文本文本文本文本文本文本文本文本文本文  
[見出し5へ](#label5)

##見出し2

本文本文本文本文本文本文本文本文本文本文本文  
本文本文本文本文本文本文本文本文本文本文本文  


###見出し3

- リスト
- リスト
- リスト
- リスト
- リスト
- リスト

###見出し4

- リスト
- リスト
- リスト
- リスト
- リスト
- リスト

###<a name="label5"></a>見出し5

- [見出し1へ](#label1)
- リスト
- リスト
- リスト
- リスト
- リスト

[Topへ](#top)
マークダウンの議事録フォーマット作ってみた

会社で議事録のフォーマットについて話題になったのでマークダウン版を作ってみた。
めっちゃお手軽やん〜 :smile: 

#フォーマット

```
#<会議体名>
##日時
yyyy/mm/dd hh:mm〜hh:mm

##場所

##出席者
- 

##議題
1. [議題1](#link)
2. 
3. 

##議事内容
###<a name="link"></a>議題1

##決定事項
- 決定事項1

##アクション事項
- [ ] アクション

##次回
yyyy/mm/dd (予定、時間は追って連絡)
```

#議事録の例
適当に作ってみた
----↓↓ここから↓↓----

#週次定例
##日時
2016/07/21 10:00〜11:00

##場所
A会議室

##出席者
- Mike
- Linda
- Ken
- Chika

##議題
1. [ランチのお店のローテーションを決める](#no1)
2. [金曜日のディナーのお店について](#no2)
3. [栄養バランスについて相談](#no3)

##議事内容
###<a name="no1"></a>ランチのお店のローテーションを決める
お店候補  

- ○○のカレー
- △△のスパゲッティ
- ○○のうどん
- 洋食の□□
- 定食の☆☆
- □□のスパニッシュランチ
- ☆☆のイタリアンランチ

→決め方どうする？

　　1. めんどいから上から順に　→決定
　　2. 曜日毎にじゃんけんで勝った人が決める
　　3. くじ引き(あみだ)
    
    
  
###<a name="no2"></a>金曜日のディナーのお店について

- ジャンルはどうする？
	- 先週はイタリアンだった
	- 先々週は確か和食
	- フレンチまだ行ってないのでフレンチに  
		→満場一致

- まだ行ったこと無くて行ってみたいお店
	- 新橋のあそこ
	- 浜松町のあそこ
	- 田町のあそこ

- 値段は？
	- 5千円くらいで

→新橋しかない
　→いつもどおり19時から予約ね

###<a name="no3"></a>栄養バランスについて相談

- 栄養バランスよくするにはどうすればいい？
	- 外食多いと栄養偏るよね
		- 麺類は炭水化物多いよね
		- 脂肪増えちゃう
- たんぱく質ほしい
- ビタミン補給したい
- 食物繊維も補給したい
	- サラダ食べ放題の店無いんか？
- 次回解決策もちよろうぜ


##決定事項
- ランチは以下のローテーションとする

|曜日|お店|
|---|---|
|月|○○のカレー|
|火|△△のスパゲッティ|
|水|○○のうどん|
|木|洋食の□□|
|金|定食の☆☆|

- 金曜日のディナーは新橋のあそこのフレンチとする

##アクション事項
- [x] 新橋のフレンチを予約しておく
- [ ] 次回までに栄養バランス良くするためのアイデアを出す

##次回
2016/07/28 (場所、時間は追って連絡)

----↑↑ここまで↑↑----
Disk2vhdを利用したWindows Server 2012 R2 Hyper-VへのP2V変換

検証内容
---
物理サーバーのP2V変換

利用ツール
---
利用ツール：Disk2vhd
対応OS：クライアントはWindows Vista以降、サーバーはWindows Server 2003以降
URL：https://technet.microsoft.com/en-us/sysinternals/ee656415.aspx

作業手順
---
1. "disk2vhd.exe"を起動
![image](https://qiita-image-store.s3.amazonaws.com/0/112606/9a1fac47-1de5-04cf-8dd4-584a2efe38e2.png)
<br>

2. [Agree]を選択
![image](https://qiita-image-store.s3.amazonaws.com/0/112606/43b37e07-8415-1659-0edf-df1d8c3bd28c.png)
<br>

3. 以下のオプションを状況に応じて選択し、[Create]を選択
Volume：仮想HDDへ変換するVolumeにチェック
Use Vhdx：VHDX仮想HDDフォーマットを利用する場合にチェック
Use Volume Shadow Copy：VSSを利用してP2V変換をする場合にチェック 
<FONT color="blue">※ネットワーク共有を保存先に指定可能
<FONT color="blue">※ドライブ単位でそれぞれ仮想HDDファイルが作成される
![image](https://qiita-image-store.s3.amazonaws.com/0/112606/57130bfe-5967-20ee-7f1e-ab21fde53b8f.png)
<br>

4. 「Disk export to VHD completed successfully」のメッセージを確認し、[Close]を選択
![image](https://qiita-image-store.s3.amazonaws.com/0/112606/3b5db27a-6053-bccd-bde4-5ca12ae878b3.png)
<br>
5. Hyper-V上で新規仮想マシンを作成し、Disk2vhdで作成した仮想HDDファイルを接続し、サーバーを起動
<FONT color="blue">※IDEコントローラ0にシステムドライブを接続
![image](https://qiita-image-store.s3.amazonaws.com/0/112606/9bda4455-d815-e77d-7bc6-4a6b4f1c0539.png)

注意点
---
・P2V変換/移行後にHyper-V統合サービスの導入が必要となる
・P2V変換/移行後にOSのライセンス認証が必要となる
　※OEMライセンスの場合、利用権について購入元ベンダーへの確認が必要
・ハードウェア管理用のベンダーツールについてもそのまま移行される為、移行後に削除が必要となる
・変換元のサーバーにてTeaming等を行っている場合、Teamingツール、Teaming NICもそのまま移行される為、
　移行後にTeaming設定の解除、不要NICの削除が必要となる

利用環境
---
変換元：Windows Server 2012 R2
移行先：Windows Server 2012 R2
ローカルに開発用メールサーバーを立ち上げる

メール送信を行うプログラムを書いているときに、ローカルにメールサーバーがあると便利ですよね。もちろん、世の中にはそういったニーズを満たすためのツールが色々あります。

## 色々なツール
### [MockSMTP](http://www.mocksmtpapp.com/)
便利。ただし有料（30日間の試用期間あり）

### [FakeSMTP](https://nilhcem.github.io/FakeSMTP/)
ダウンロードしてコマンドラインから `java -jar fakeSMTP.jar` で起動する。試してない（面倒くさそう）。

### [MailCatcher](https://mailcatcher.me/)
Ruby 製。`gem` でインストールしてコマンドラインから `mailcatcher` で起動する。試してない（`gem` 使う時点で面倒くさい）。

### [MailDev](https://www.npmjs.com/package/maildev)
Node.js 製。`npm` でインストールしてコマンドラインから `maildev` で起動する。面倒くさい……と思っていたら **Docker で簡単に使えるようになっていた。**

## MailDev の使い方
### 必要なもの
**Docker for Mac**（または `docker-machine`）。まだインストールしていない人は `brew cask install docker` で簡単に導入できます。

### インストールと起動
```
$ docker run -d -p 1080:80 -p 1025:25 -h maildev --name maildev djfarrelly/maildev
```

### プログラム側の設定
SMTP のポートを `1025` に設定する。他のポートがよい場合は前述のコマンドで `-p 1025:25` の部分を適宜変更する。

### 送信（受信）したメールを確認
http://localhost:1080/ にアクセス。

### 日本語は？
UTF-8 ならば問題なく使えます。ISO-2022-JP はダメらしい。

### もっと詳しい使い方
こちらの記事をどうぞ: [maildev (SMTP mock server) を使ってハイパーメール開発](http://qiita.com/sotarok/items/ff5ca29f88d1f8069c98)
キュートな濁点を付けてくれるツール「へごへごへごちん！」

**た゛め゛て゛す゛よ゛～　や゛め゛て゛く゛た゛さ゛い゛よ゛～**

キュートな濁点を付けてくれるツール「へごへごへごちん！」を紹介する。
へごかわへごかわ。へごったへごちんへごかわ。


## 使い方

[へごへごへごちん！](http://www.terabo.net/hegochin/)
へごりたいテキストを入力するだけ。

## 類似ツールとの比較

濁点付きテキストに変換する類似のツールとして有名なものに、 [藤原竜也変換ツールJS版](http://jsdo.it/tonkotsuboy/2uNT) ([Qiita記事](http://qiita.com/tonkotsuboy_com/items/f5aecb241b66bb9705e7)) が挙げられる。
へごへごへごちんと藤原竜也変換ツールを比較するにあたり注目すべき点は濁点および記号の変換である。
藤原竜也変換ツールでは、例えば、「だ→だ゛」、「～→～゛」と変換される。
このようにやみくもに濁りすぎるのはへごちんではない。
一方、へごへごへごちんは「だ→た゛」、「～→～」と変換する。
このキュートな濁点はへごちんである。 

## ブックマークレット

ブックマークレットも作った。
以下のJSをブックマーク登録するだけ。

```js
javascript:(function(){var h=function(s){var r='',d1='がぎぐげござじずぜぞだぢづでどばびぶべぼガギグゲゴザジズゼゾダヂヅデドバビブベボ',d2='かきくけこさしすせそたちつてとはひふへほカキクケコサシスセソタチツテトハヒフヘホ';for(var i=0,l=s.length;i<l;i++){var c=s.substr(i,1);if(c.match(/[がぎぐげござじずぜどだぢづでどばびぶべぼガギグゲゴザジズゼゾダヂヅデドバビブベボ]/)){var idx=d1.indexOf(c);if(idx!=-1)c=d2[idx];}r+=c;if(c.match(/[ぁ-んァ-ン]/))r+='゛';}return r;};document.body.innerHTML=h(document.body.innerHTML);})()
```

任意のウェブページを簡単にすばやくいつでもどこでもへごることができる。
YES!! YES!! YES!! へごちん is always with you. 

### 実行例

Yahoo! JAPAN のトップページ

変換前
![Yahoo! JAPAN.png](https://qiita-image-store.s3.amazonaws.com/0/6390/adc539eb-6cac-6283-42a6-c501a04afb85.png)

変換後
![Yahoo! JAPAN へご.png](https://qiita-image-store.s3.amazonaws.com/0/6390/0e5b9f42-6110-f9bd-58b8-fd107b318546.png)

## 参考文献

* 「へごへごへごちん！」作った :: terabo.net http://www.terabo.net/blog/hegohego-hegochin/
* 「へごへごへごちん！」【ブックマークレット版】 作った :: terabo.net http://www.terabo.net/blog/hegohego-hegochin-bookmarklet/

## 謝辞

「キュートな濁点」というフレーズはすみぺが発言してた。
[すみぺがひたすらへごまねをする動画 - ニコニコ動画:GINZA](http://www.nicovideo.jp/watch/sm27695239)
よく使うgitコマンド


##リモート情報を更新
```
git remote update
```


##リモートブランチ一覧
```
git branch -r
```


##リモートからブランチを取得 
```
git branch new-branch origin/new-branch
```


##ブランチをリモートにプッシュ
```
git push origin <new branch name>
```


##ブランチ削除
```
git branch -d hoge
```

##ブランチ強制削除
```
git branch -D hoge
```

##(git addする前の)ローカルで変更したファイルを元に戻す。
```
git checkout path/to/file
```

##変更してgit addしたファイルを、git addする前の状態に戻す。
```
git reset HEAD path/to/file
```

##直前のgit commitを取り消す。git commit直前の状態(ファイルは変更されているがcommitはされていない)に戻る。
```
git reset --soft HEAD^
```

##git addで新規追加したファイルを、git addする前の状態に戻す。
```
git rm --cached path/to/file
```

##git addで新規追加したディレクトリを、git addする前の状態に戻す。
```
git rm -r --cached path/to/dir
```

##マージ
```
git merge ＜変更点の取り込み元ブランチ＞
```

##ブランチ間の差分
```
git diff branch1..branch2
```

##ブランチ間でのあるファイルの差分
```
git diff branch1 branch2 apath/to/file
```

##別ブランチのファイルを取得
```
git checkout branch1 <file path>
```



##stash リストから削除してかつ戻す
```
git stash pop
```

##stashから0番目以外を戻す場合（1番目の例）
```
git stash pop stash@{1}
```

##stash リストから削除しないで戻す （※１番を戻す）
```
git stash apply

# ※リストの1番め戻す
git stash apply stash@{1}
```


##stash一覧
```
git stash list
```

##stashをメッセージ付きで保存
```
git stash save "message"
```
Dockerコマンドのzsh completionを設定する


Dockerコマンドはオプションが数多くありイメージIDやコンテナIDなどの指定も必要になるので、シェル補完を導入したい。

現在のところ[zsh-completions](https://github.com/zsh-users/zsh-completions)にはDockerコマンドの補完設定はないため、自分で導入する必要がある（なぜかdocker-machineだけはある）。

公式リポジトリに補完設定があるのでダウンロードして適当な場所に配置し、fpathで読みこめばよい。

- https://github.com/docker/docker/blob/master/contrib/completion/zsh/_docker
- https://github.com/docker/compose/blob/master/contrib/completion/zsh/_docker-compose


今回は[prezto](https://github.com/sorin-ionescu/prezto)を使っているので、`~/.zprezto/modules/completion/external/src`にダウンロードした。

```
cd ~/.zprezto/modules/completion/external/src
curl -fLo _docker https://github.com/docker/docker/raw/master/contrib/completion/zsh/_docker
curl -fLo _docker-compose https://raw.githubusercontent.com/docker/compose/master/contrib/completion/zsh/_docker-compose
exec $SHELL -l
```

これで補完できるようになった

```
docker [TAB]
 -- docker command --
attach   -- Attach to a running container
build    -- Build an image from a Dockerfile
commit   -- Create a new image from a container's changes
cp       -- Copy files/folders between a container and the local filesystem
create   -- Create a new container
daemon   -- Enable daemon mode
deploy   -- Create and update a stack from a Distributed Application Bundle
diff     -- Inspect changes on a container's filesystem
...
```
sshの設定とログ確認



### ポート変更

```
$ vi /etc/ssh/sshd_config

#Port 22
Port 10022

$ vi /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 10022 -j ACCEPT

$ service sshd restart
$ service iptables restart
```

### ssh接続を新しいターミナルウィンドウを複製して接続を確認する。その後ファイアウォールの22番を閉じてサービス再起動

```
$ vi /etc/sysconfig/iptables

#コメントアウト
#-A INPUT -m state --state NEW -m tcp -p tcp --dport 22  -j ACCEPT

$ service iptables restart
```


### ログ確認 sshのログインに失敗/成功したユーザ数
```
# grep -c invalid /var/log/secure
# grep -c Failed /var/log/secure
# grep -c Accepted /var/log/secure
```
別ブランチから特定のファイルを取得する方法


#### addされた状態で取得

```
git checkout ＜取り込み元ブランチ＞ <取り込むファイル>
```

#### 別ファイルとして取り込みたい場合 (unstaged状態)
```
git show ＜取り込み元ブランチ名＞:path/to/file > path/to/local/file
```

  
  
### コミットまるごと

#### コミットをそのまま取込
```
git cherry-pick <コミットハッシュ値>
```

#### add済み

```
git cherry-pick -n <コミットハッシュ値>
```
macにjdk8をインストールする

jdkのダウンロードサイトがhttpsじゃない悲しみを乗り越えてmd5をチェックしたので手順をメモ。
8u102を対象にしてるので、バージョン変わったら適宜修正してください。

+ dmgをダウンロード  
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
+ 該当ファイルのmd5のchecksumをコピる（jdkのダウンロードページの上の方にchecksumというリンクがあって、そのさきに各種アーカイブのchecksumがある）  
https://www.oracle.com/webfolder/s/digest/8u102checksum.html
+ md5をチェックする。9652...は↑のコピったやつ。  

```
[ $(md5 ~/Downloads/jdk-8u102-macosx-x64.dmg | cut -d ' ' -f4) = 9652fdf0b3387f1897369c7ec642f546 ] && echo ok 
```
+ okが表示されたらdmgをぽちぽちやってインストールする
JAVAで、あるワードが含まれる文字列を区切り文字のブロックごと取得する方法のメモ

例えばスクレイピングをするときで、あるワードが含まれる要素をタグ文字ごと取得したい場合のメモです。

```KugiriUtil.java
import java.util.regex.Matcher;
import java.util.regex.Pattern;

    /*
     *対象のワードが含まれた、区切り文字で囲まれた文字列を取得するメソッド
     * @param target 全ての文字が含まれる文字列。
     * @param searchKeyWord 検索対象の文字。
     * @param kugiriStartWord 区切りの始まりを示す文字。
     * @param kugiriEndWord 区切りの終わりを示す文字。
    */
    public static String getKugiriBlock (String target , String searchKeyWord , String kugiriStartWord, String kugiriEndWord) {
        // 正規表現の設定
    	String regex = kugiriStartWord + ".*?" + searchKeyWord + ".*?" + kugiriEndWord;
    	Pattern ptrn = Pattern.compile(regex);
    	Matcher matcher = ptrn.matcher(target);
    	
    	// 正規表現の検索
    	matcher.find();
    	
    	// 対象の文字列を含む区切りを返す
    	return target.substring(matcher.start() ,matcher.end());

    }
```
### 特記事項
　・複数のブロックを取得したい場合は、matcher.find()をwhile文で繰り返す。
　・最短一致とする為、正規表現に「?」を追加する。
ポケモンGOの配信チェック(PHP版)

# はじめに
先週くらいまではポケモンGOなんて特に興味なかったのですが、
今週くらいになりほぼ毎日ポケモンGOの話題を聞くようになり、、気付いたら日本での配信を心待ちにしていました。。
すでに配信チェックされている方がおられたので、それを真似てPHP版で作りました。
参考：[【スタダ】ポケモンGOがリリースされたら電話掛かってくるスクリプト](http://qiita.com/haminiku/items/991d4ac380ca3ef29dd1)

# コード
```php:pokemon.php
<?php

namespace Pokemon;

class PokemonNotification
{
    // mt=8はiOSアプリを意味する
    const APP_URL = 'https://itunes.apple.com/jp/app/apple-store/id1094591345?mt=8';

    // 配信されているかをチェックする文字列
    const CHECK_STRING = 'カスタマーレビュ';

    /*
     * メイン処理
     *
     */
    function exec()
    {
        try {
            // iTunesで確認
            $result = self::request('GET', self::APP_URL);
            $isDelivery = self::isDelivery($result['response']);

            // 配信中かそうでないかでメッセージを出し分け
            if ($isDelivery) {
                $message = 'ポケモンGO!!!!!! ';
            } else {
                $message = 'ポケモンGOはまだ配信されてません。。 ';
            }

            echo $message . "\n";

        } catch (\Exception $e) {
            echo $e->getMessage(). "\n";
        }
    }

    /*
     * リクエスト
     *
     * @param string $method
     * @param string $url
     * @param string $data
     * @return array $result
     */
    private static function request($method, $url, $data = '')
    {
        $result = array();

        $ch = curl_init();

        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));

        // メソッドの振り分け
        if ($method === 'GET') {
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
        } elseif ($method === 'POST') {
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
        }

        // データがあればセット
        if (!empty($data)) {
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        }

        // リクエスト
        $response = curl_exec($ch);
        if ($response === false) {
            throw new \Exception('curl error');
        }

        $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);

        $result['response'] = $response;
        $result['status'] = $status;

        return $result;
    }

    /*
     * アプリが配信されているかチェック
     *
     * @param string $data
     * @return bool $result
     */
    private static function isDelivery($data)
    {
        $result = false;

        if (strpos($data, self::CHECK_STRING) !== false) {
            $result = true;
        }

       return $result;
    }
}

$pokemon = new PokemonNotification();
$pokemon->exec();
```

# 実行
```
$ php pokemon.php
ポケモンGOはまだ配信されてません。。
```

# おわりに
これをcronで1分毎とかに実行すればほぼリアルタイムにチェックできるかと思います。
あとは配信されたら何かしらに通知とかすればバッチリです。
【プログラマーのための数学】一次結合 (線型結合)

## 目次
[プログラマーのための数学 - 目次](http://qiita.com/Esfahan/items/ab63e7c5bcf812dff2a9)

## 一次結合とは
線型結合と呼ばれることもあります。
数式的意味と、空間的意味の2つで説明します。

## 数式的意味
```
Σ[i=1 to n] k[i]v[i] = k1v1→ + k2v2→+ ··· +knvn→
``` 

このように幾つかのベクトルの定数倍の和で表されるものをこれらのベクトルの１次結合という。 

```
     | 1 |　　     |  1 |
v1 = | 0 |　　v2 = | -1 |
     | 0 |　　     |  0 |
```

このようなv1、v2という2つのベクトルがあるとき、

```
     |  5 |
v3 = | -3 |
     |  0 |
```

v3は、v1、v2の一次結合になります。

```
     |  5 |
v3 = | -3 | = k1v1 + k2v2
     |  0 |
```

`k1=2`、`k2=3`と値を代入することで、この式を成り立たせることができます。
このとき、v3は、v1、v2の一時結合ということになります。

しかし、もしv3が下記の場合は、v1、v2の一次結合にはなりません。

```
     | 0 |
v3 = | 0 |
     | 1 |
```

下記の式が成り立たないからです。

```
     | 0 |                   | 1 |     |  1 |   | 0 |
v3 = | 0 | = k1v1 + k2v2 = k1| 0 | + k2| -1 | = | 0 |
     | 1 |                   | 0 |     |  0 |   | 1 |
```

この式を満たすk1、k2は存在しません。
このとき、v3は、v1、v2の一次結合ではありません。

## 空間的意味
図で表すとこのようになります。

### 一次結合の場合
![v001.gif](https://qiita-image-store.s3.amazonaws.com/0/105936/48d34192-1f15-3a12-04fb-841c9b44b110.gif)
出典：http://www.geisya.or.jp/~mwm48961/linear_algebra/independent1.htm

```
     | 1 |　　     |  1 |       |  5 |
e1 = | 0 |　　e2 = | -1 |  e3 = | -3 |
     | 0 |　　     |  0 |       |  0 |
```

この場合、e3は、e1、e2が作る平面の上にあります。
e3は、e1、e2の一次結合となります。

### 一次結合ではない場合
![v002.gif](https://qiita-image-store.s3.amazonaws.com/0/105936/d99ae55a-1de2-4ec8-9e1e-8ba921e79f97.gif)
出典：http://www.geisya.or.jp/~mwm48961/linear_algebra/independent1.htm

```
     | 1 |　　     |  1 |       | 0 |
e1 = | 0 |　　e2 = | -1 |  e3 = | 0 |
     | 0 |　　     |  0 |       | 1 |
```

この場合、e3は、e1、e2が作る平面の上にありません。
e3は、e1、e2の一次結合ではありません。

[参考]
[www.geisya.or.jp](http://www.geisya.or.jp/~mwm48961/linear_algebra/independent1.htm)
[proofcafe.org](http://proofcafe.org/k27c8/math/math/liner_algebraI/page/liner_combination/)

[関連記事]
[プログラマーのための数学 - 目次](http://qiita.com/Esfahan/items/ab63e7c5bcf812dff2a9)
ScalaからJavaのlambdaを簡単に使う

ScalaからJavaのライブラリを使っていてJavaのlambdaを使いたいときかなり面倒なことになる。例としてJavaのOptional#mapをScalaから使うことを考える。

```scala
import java.util.Optional

object JavaLambda {
  def main(args: Array[String]) {
    val s = Optional.of("Scala")


    val l = s.map((s:String)=>s.concat("!!!")).get() // Error!!

    println(l)

  }
}
```

まずこれはコンパイルが通らない。Optional#mapがScalaの関数を受け付けない。動くようにするには`java.util.function`を使ってJavaの無名クラスを作ることになる。

```scala
import java.util.Optional
import java.util.function.Function

object JavaLambda {
  def main(args: Array[String]) {
    val s = Optional.of("Scala")

    val mapper = new Function[String, String] {
      override def apply(v1: String):String = v1.concat("!!!")
    }

    val l = s.map(mapper).get()

    println(l)

  }
}
```

しかし，これはみっともない。これを解決するのにscala-java8-compatというライブラリがある。これを使うと次のように書ける。

```scala
import java.util.Optional
import scala.compat.java8.FunctionConverters._

object Java8Lambda {
  def main(args: Array[String]) {
    val s = Optional.of("Scala")

    val l = s.map(((v: String) => v.concat("!!!")).asJava).get()

    println(l)

  }
}
```
asJavaがJavaの無名関数クラスに適切に変換してくれる。

`@FunctionalInterface`にも適当に変換してくれるともっと楽なんだが。

* https://github.com/scala/scala-java8-compat
docker-composeでPHP5.4〜PHP7.0まで単体テストする

次のようなYAMLを書いて、`docker-compose up`するだけ！

```yaml:docker-compose.yml
version: "2"
services:
  php70:
    image: php:7.0-alpine
    command: vendor/bin/phpunit
    volumes: [".:/app"]
    working_dir: /app

  php56:
    image: php:5.6-alpine
    command: vendor/bin/phpunit
    volumes: [".:/app"]
    working_dir: /app

  php55:
    image: php:5.5-alpine
    command: vendor/bin/phpunit
    volumes: [".:/app"]
    working_dir: /app

  php54:
    image: php:5.4-cli
    command: vendor/bin/phpunit
    volumes: [".:/app"]
    working_dir: /app
```

![zsh 2016-07-21 22-27-49.png](https://qiita-image-store.s3.amazonaws.com/0/889/96927b66-115a-7fed-d596-96ad9d378596.png)


平行して実行されたくない場合は、Makefileを作っておくといい。

```mf
test:
	docker-compose up php54
	docker-compose up php55
	docker-compose up php56
	docker-compose up php70
```
OTRS5環境を爆速で構築する方法


## 概要

- 本手順はVagrantとGitHubにあるインストールスクリプトを使って爆速でVirtualBox上にOTRS5をCentOS7で構築します。かかる時間は10分程度です。
<br>
<br>
- AWSやVPS等で構築したい方は `2. 環境準備` の `VirtualBoxでCentOS7` を起動」を読み飛ばして下さい。

- なお、本手順ではさくっと終わってしまうので、OTRSのインストールについて詳しく知りたい方は日本OTRSユーザ会で公開している手順書を御覧ください。

 ⇒　[OTRSの簡易インストール手順書（CentOS 7、OTRS 5.0.10)を公開しました。](http://otrs-japan.co/modules/news/index.php?content_id=44 "OTRSの簡易インストール手順書（CentOS 7、OTRS 5.0.10)を公開しました。")

## 環境

- OTRS: 5.0.10
- OS: CentOS 7.1
- Web Server: Apache 2.4
- DB Server: MariaDB 5.5

## 手順

### 1. VirtualBoxでCentOS7を起動

```
$ vagrant init bento/centos-7.1; vagrant up --provider virtualbox
```

### 2. 環境準備

OSが起動したらログインして以下の手順を進めます。

#### SELinuxを無効化して再起動
（permissiveなので変更は必須じゃないです。必要ない人は飛ばして下さい）

```
perl -p -i.bak -e 's/permissive/disabled/g' /etc/selinux/config
reboot
```

### 3. OTRSをワンライナーでさくっとインストール

```
yum -y install wget epel-release && wget https://raw.githubusercontent.com/nouphet/otrs-installer/master/otrs5-on-centos7-installer.sh && bash otrs5-on-centos7-installer.sh rpm
```

最初に `Have you already installed ? [yes/no] :` って聞かれるので `yes` と入力して進む。

途中で

```
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Importing GPG key 0xF4A80EB5:
 Userid     : "CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org>"
 Fingerprint: 6341 ab27 53d7 8a78 a7c2 7bb1 24c6 a8a7 f4a8 0eb5
 Package    : centos-release-7-1.1503.el7.centos.2.8.x86_64 (@anaconda)
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Is this ok [y/N]:
```

のようにGPG KEYを取得しても良いか聞かれるので `y` で進む。

**コマンドラインでのインストールはこれで終了です。**

## 最後に

ここまできたら、OTRSのウェブインストーラの画面へブラウザでアクセスし、数ステップこなせば完了です。

```
OTRSのウェブインストーラURL: http://(IPアドレス or ドメイン)/otrs/installer.pl
```

![kobito.1469106050.251334.png](https://qiita-image-store.s3.amazonaws.com/0/5354/ece755a4-acc3-5e10-63e5-ce4edb279887.png "kobito.1469106050.251334.png")


以上で完了です。
数時間かかっていた様な環境準備が、これで10分程度で完了できるはずです。

OTRSはERPの様に中身が複雑なので、構築する時間を節約して、中身の設計や設定などに貴重な時間を使ってください。(^^)
Windows10でVirtualBoxが使用できません


ホストマシンの仮想化支援機能(VT-x/AMD-V)が使用できません。64ビット ゲストOSは64ビットCPUを検出できず、起動できません。

はじめは、BIOSの設定かと思いましたが、メーカーに問い合わせても、BIOSの設定にはないがデフォルトでHyper-Vは使用できる状態になっているという回答でした。

次に、Hyper-Vを削除するといいという情報を入手。
「Windowsの機能の有効化または無効化」でHyper-Vのチェックを外しました。

しかし、これでもダメか・・・。

最後に、こちらのコマンドを探し当てました。
「bcdedit /set hypervisorlaunchtype off」
コマンドプロンプト（管理者権限で実行）で実行したら、ようやくVirtualBoxの仮想マシンが動きました。

Windows10になり、いろいろ悩まされましたが、これで一歩前進しました。
Puppet Camp Tokyo 2016 のメモ

Puppet Camp Tokyo 2016 のメモです。

**記憶をもとに書いているため、発表者の意図と違う可能性もあります。
ちなみに、Puppetに限った内容ではないです。**

# DevOps?

- ソフトウェアを提供するためのパイプライン全体の最適化
- リニアでなく、基本的にはサイクル
- サイクルの最適化

# 自動化

- テストは完全に自動化すべき
- アプリケーションが動くことを常に保障することが大切
- 手作業はなくすこと

# どこから自動化するか

- コアインフラ
- アプリケーションインフラ
- プロビジョニング
- (アプリケーションのオーケストレーション)

の順番。ちょっとずつやって、変化をどんどん積み上げる。

# その他

- "より優れたソフトウェアを、より迅速に提供する"
  それをシンプル、スケーラブル、かつ安全に行うためには、
  プロセスを変えていかなければならない

- システムを把握できる状態に保つことは、大きな価値がある
- 把握できていれば変更が容易で、ビジネスとしても速く動くことができる

# 所感

ここからは、個人的な感想です。

単に自動化というより、CI/CDを含めたプロセスの最適化が重要というのが印象に残りました(すべての発表が、そういう内容だったわけではないです…)。

Puppetを使えばコストが下がるというよりは、変更をより迅速にするための手段の１つがPuppetかと思います。変化に柔軟に対応するために、（実際には小さなシステム変更をともなう）予行演習やメンテナンスを、日々、繰り返すのが大切ですという印象でした。
EC2環境でLaravelのセットアップ中にnode-sassのvenderディレクトリが見つからないと言われたときの対処法



事象
-----

EC2でLaravelプロジェクトのセットアップ中に `gulp` すると

```
Error: ENOENT: no such file or directory, scandir '/path/to/project/node_modules/node-sass/vendor'
```

というエラーがでる。対象ディレクトリを見に行くとたしかに `vendor` ディレクトリがない。

ローカル環境でみてみる
-----
ローカル環境で見てみると `vendor` ディレクトリが存在し `darwin-x64-46` というディレクトリが。

名前からして **環境依存な気配がプンプンしやがる**

対処法
-----
[ここ](https://github.com/sass/node-sass/issues/1162)を参考にした。

`npm install`でひととおりインストールしたあと

```
npm rebuild node-sass
```

をすると `vendor` ディレクトリができる。 `gulp` も無事成功！！
d3jsでjsonの読み込み中に何かしたい

loading表示とか出したいと思い、調べた。on関数を使うようだ。

```js
// ダミーのjson
let url = 'http://beta.json-generator.com/api/json/get/Nkd1zDuPb';


d3.json(url)
.on("beforesend", function() { console.log("beforesend"); })
.on("progress", function() { console.log("progress"); })
.on("load", function(json) { console.log("success!", json); })
.on("error", function(error) { console.log("failure!", error); })
.get();
```

・参考
[d3-request/README.md at master · d3/d3-request](https://github.com/d3/d3-request/blob/master/README.md#request_on)
[Progress Events - bl.ocks.org](http://bl.ocks.org/mbostock/3750941)


## d3.eventがnull
[d3-selection/README.md at master · d3/d3-selection](https://github.com/d3/d3-selection/blob/master/README.md#event)
d3.eventがnullになるのはd3.jsがES6でないからなのか、そのへん難しくてよくわからんかった。rollupを使ってnpm経由でd3を使おうとしたけど、設定がうまくいかずに断念した。 :weary: 

[brush.on("end", handle) seems to get raw "mouseup" events · Issue #9 · d3/d3-brush](https://github.com/d3/d3-brush/issues/9)

[rollup/rollup-plugin-node-resolve: Use the Node.js resolution algorithm with Rollup (formerly rollup-plugin-npm)](https://github.com/rollup/rollup-plugin-node-resolve)
Linux — source コマンドは何をしているのか > 実は環境をリロードするためのものではない

ごく基本的なことだが、今までよく考えずに使っていた。
`source` コマンドというと、「`.bash_profile` を変更した後に使うもの」ぐらいのイメージしかなかった。

# 謎

「なぜひと手間かけさせるのか」「プロフィールファイルを変更した時に、環境設定も自動更新してくれたら良いのに」と思っていた。

だが `source` コマンドは実は、環境をリロードするためのものではない。
**ファイルに書かれた内容を 忠実にコマンドとして実行していくもの**なのだ。

# `$ source` と `$ bash` の違い

では `$ bash` でファイルを実行するのとは何が違うのか。

- `$ bash [file]` はシェルスクリプト内の **「裏側=閉じられた環境」** でコマンドを実行する。
- `$ source [file]` は **「表側=開いた環境」** で、コマンドを実行する。


## 動作が変わる例

たとえば「変数に代入するだけ」の単純なスクリプトがある場合。

```bash:set_variable
DO_YOU_UNDERSTAND='YES! YES! YES!'
```

### bash

これを bash で実行しても、シェル自体の変数は変わらない。(環境は閉じられている)

```bash
$ DO_YOU_UNDERSTAND='NO!' # シェルに変数をセット
```

```bash
$ bash set_variable # 変数を変えるスクリプトを実行
```

```bash
$ echo $DO_YOU_UNDERSTAND # 変数を出力
NO! # 変わらない
```

### source

だが source で実行すると、元のシェルの変数まで書き換わっているのが分かる。

```bash
$ DO_YOU_UNDERSTAND='NO!' # シェルに変数をセット
```

```bash
$ source set_variable # 変数を変えるスクリプトを実行
```

```bash
$ echo $DO_YOU_UNDERSTAND # 変数を出力
YES! YES! YES! # 変わる
```


## 動作が変わらない例

たとえばこういうファイルがあるときは。

```bash:just_echo
echo 'abc'
```

どちらも同じように echo される。

```bash
$ bash just_echo
abc

$ source just_echo
abc
```

# 以上

しかし、なぜ source なんて名前が付いているんだろう。本当に分かりづらい。
(source=源という名前は動きではなく、目的を表しているような気がする)

これが例えば `run` とかいう名前であれば、きっと多くの人が救われただろうに。








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
aws cloudwatch　公式から配布されているスクリプトのカスタムメトリクスを実装

amazon linuxに公式から配布されているスクリプトを実装してカスタムメトリクスを表示させる。

IAMの設定してインスタンスの設定をします。
細かく手順をかいてありますので、順番にやっていくと実装できます。


#IAMの設定
インスタンスがcloudwatchに許可をとるために必要です。
今回の流れは、IAMでユーザーを作成し、cloudwatchにアクセス許可するポリシーを作成しユーザーに割り振り。インスタンスにユーザーを登録。インスタンスはユーザーのcloudwatchの許可を通してカスタムメトリクスを作成します。


許可する方法はユーザーとロールの二通りあります。ユーザーでやります。
ロールでは既存のインスタンスに割り振る場合にインスタンスを止めなければならなく時間がかかり手間です。
（ロールの場合、スナップショットを取る。そこからAMI(イメージ)を取る。インスタンスを削除。取ったAMIから作成する際にロールを割り振る。時間がかかりめんどくさい…）


IAMのサービスを開いてユーザーの作成ポリシーの作成します。
##１．ユーザー作成
1-1.左のナビゲーションからユーザーを選択、新規ユーザーの作成を選択

1-2.適当にユーザー名を書いて「ユーザーごとにアクセスキーを生成」にチェックがついていることを確認する。確認したら右下にある作成を選択

1-3.認証情報のダウンロードを選択（アクセスする際に大切なものです大事に保管）
ダウンロードしたら、閉じるを選択。ユーザーが作られているので確認

##２．ポリシー作成
2-1.左のナビゲーションでポリシーを選択。ポリシーを作成を選択

2-2.「Policy Generator」を選択。

2-3.以下のようにする

```text:
効果：許可
AWSサービス：Amazon Cloudwatch
アクション：PutMetricDataにチェック
```

以上のものができたらステートメントの追加を選択。右下にある次のステップを選択

2-4.適当にポリシー名と説明を入力後ポリシーの作成を選択
[メトリクス名]が作成されました。
と出てきます。

##３．ユーザーにポリシーをアタッチする。
3-1.左のナビゲーションからユーザーを選択。１で作成したユーザーを選択。アクセス許可のタブにポリシーのアタッチと出てくるので選択。

3-2.フィルターのポリシータイプを選択して、カスタマー管理ポリシーを選択。
２で作成したポリシーがあるのでチェックボックスにチェックを入れて、右下にあるポリシーのアタッチを選択。


これでIAMの設定は終わり。cloudwatchにアクセス許可をするユーザーができましたので、次はインスタンスの設定をします。

---

#インスタンス設定
基本rootユーザーのホームディレクトリで作業します。
`sudo su`
`cd ~`

wgetで公式が準備してくれているスクリプトをダウンロードします。
`wget http://aws-cloudwatch.s3.amazonaws.com/downloads/CloudWatchMonitoringScripts-1.2.1.zip`

展開します。
`unzip CloudWatchMonitoringScripts-1.2.1.zip`
展開したら`aws-scripts-mon`というディレクトリができます。
zipはもういらないので削除。
`rm -f  CloudWatchMonitoringScripts-1.2.1.zip`

ディレクトリ移動
`cd aws-scripts-mon`

コピーして中身を編集
`cp awscreds.template awscreds.conf`
`vi awscreds.conf`

※アクセスキー、シークレットキーはIAM設定の1-3でダウンロードしたものに書いてあります。awscreds.confの[]はいらない。


```text:awscreds.conf
AWSAccessKeyId=[accesskeyを入力]
AWSSecretKey=[seacretkeyを入力]
```


必要なパッケージをインストールします。
`yum install perl-Switch perl-DateTime perl-Sys-Syslog perl-LWP-Protocol-https`

cloudwatchにカスタムメトリクスが送れる状態なのかテストします。
`./mon-put-instance-data.pl --mem-util --mem-used --verify --verbose`
「Verification completed successfully. No actual metrics sent to CloudWatch.」とでてきたら成功

cronで定期的にメトリクスデータをcloudwatchに送信する。
`crontab -e`


```text:crontab
*/5 * * * * /root/aws-scripts-mon/mon-put-instance-data.pl  --mem-util --mem-used --mem-avail --swap-util --swap-used --disk-space-util --disk-space-used --disk-space-avail --disk-path=/ --from-cron
```


crondをリロードします。
/etc/init.d/crond reload

インスタンスの設定はこれで終わりです。

---

cloudwatchサービスを開いて、左のナビゲーションペインのメトリックスのなかに「Linux システム」が追加されているはず。

デフォルトではないメモリーの情報が見れるから便利ですね。カスタムメトリクスもアラートかけれるのでかけます。

追記(2017/06/08)
ロールの場合はポリシーアタッチ後いきなり`crontab -e`
`*/5 * * * * /root/aws-scripts-mon/mon-put-instance-data.pl  --mem-util --mem-used --mem-avail --swap-util --swap-used --disk-space-util --disk-space-used --disk-space-avail --disk-path=/ --from-cron`
でいけました。

エラーは`/var/log/messages`に出る
ソフトウェア開発工程(ウォーターフォール)

## この文書の目的

ソフトウェア開発工程を再定義し、作業内容と成果物を明確にすることで成果物の品質を向上する

## 概要

| 工程       | 概要                         |
|------------|------------------------------|
| 要件定義   | ソフトウェアの性質を定義する |
| 基本設計   | ソフトウェアの構造と構成要素を定義する |
| 詳細設計   | ソフトウェア構成要素の動作を定義する |
| 実装       | ソフトウェア構成要素の動作を実現する |
| 単体テスト | 実装されたソフトウェアが詳細設計を満たす事を確認する |
| 結合テスト | 実装されたソフトウェアが基本設計を満たす事を確認する |
| 総合テスト | 実装されたソフトウェアが要件定義を満たす事を確認する |
| リリース   | 完成したソフトウェアを利用可能にする |

## 足りないもの

* 要件定義の正当性、妥当性チェック
* 基本設計の正当性、妥当性チェック
* 詳細設計の正当性、妥当性チェック

## この文書の状態

書きかけ