OmniAICreator/Qiita-1.07M huggingface dataset:
[IE8] input[readonly]にテキスト入力カーソルを表示させない

某案件で

(ﾟσ ﾟ)＜inputにカーソル出すなよ～IE8で出てるぜ～

って言われたので、色々調べていたのですが、これ結構対応が面倒でした。

※以下、jQueryを使った記述になっています。

■ 最初のコード

```
<input type="text" readonly="readonly">

<script type="text/javascript">
$('input[readonly="readonly"]').on('focus', function(){
    $(this).blur();
});
</script>
```

これだと、inputをクリックした時にカーソルが一瞬でてしまうのでした。
（ま、いっか、どうせ操作できるわけじゃないし。と思って出したら突っ込まれた、というわけですね。）

こちらとか（http://d.hatena.ne.jp/uusshmhmba/20100830/p6）
こちら（http://tm.root-n.com/programming:javascript:etc:lie_readonly_noselect）
の情報を参考にさせてもらいつつ、改修したソースが以下。

■ こんなんなりました

```
<input type="text" readonly="readonly">

<script type="text/javascript">
$('input[readonly="readonly"]').on('mousedown keydown', function(){
    var $target = $(this);
    $target.attr('disabled', 'disabled');
    setTimeout(function(){
        $target.removeAttr('disabled');
    }, 1);
});
</script>
```

なんともsetTimeoutとか、いちいちdisabledにしてるあたりが気持ち悪いですね。ええ。
とりあえず、動いたのでさらしておきます。
ちょっとしかテストしてないので、おかしな動きしたらごめんなさい。
MakeでIDEで言うところのプロジェクトのルートディレクトリを設定する


# Introduction

色々説明を省くが，MakeではIDEで言うところのプロジェクトのルートディレクトリを設定するにはコツが要る．

ここでは，その方法についてのメモを書いておく．

# How to do it

- 1. まず，プロジェクトのルートディレクトリにroot.mkというファイルを置く．
- 2. このroot.mk内で， *次の様なROOT変数への代入文が，いかなるinclude指示子よりも先に実行される様に* 書いておく:

```make
ROOT := $(realpath $(dir $(lastword $(MAKEFILE_LIST))))
```

- 3. そして，各makefileでは，include指示子によってroot.mkを読むようにする．

こうすると，ROOTにはroot.mkが置かれているディレクトリ，すなわちプロジェクトのルートディレクトが代入される．

各関数の意味や代入文の意味については略します．

# References

* [6.14 Other Special Variables, Special Variables - GNU `make'](https://www.gnu.org/software/make/manual/html_node/Special-Variables.html#index-MAKEFILE_005fLIST-_0040r_007b_0028list-of-parsed-makefiles_0029_007d-550 "Special Variables - GNU `make'")
* [3.3 Including Other Makefiles, Include - GNU `make'](https://www.gnu.org/software/make/manual/html_node/Include.html "Include - GNU `make'")

# Appendix

realpath関数はなぜ必要なのか？と，不思議に思うかもしれません．
ボヤけた言い方になりますが，私はrealpath関数を外して使っていた時にいくつかトラブルに遭ったことがあります．
しかし，そのシチュエーションを忘れてしまいました…

後でまた調べますが，どうやらMakeは相対パス指定やシンボリックリンクを使用するのが不得意のようです．
cronからのメール着信通知を非表示

サーバでSSHで操作をしていると、

```
You have new mail in /var/spool/mail/root
```

といった表示が出てくることがある。
メールを読むには`mail`コマンドで読めるが、今のところ必要なさそうなので/etc/crontabを以下の様に修正

```lang:/etc/crontab
MAILTO=""
```
[※削除しました] 無料でイントラネット内にナレッジ/ノウハウの共有ができる「Lodge」

という記事でしたが、 [コミュニティガイドライン - Qiita:Support](http://help.qiita.com/ja/articles/qiita-community-guideline) に反しているようでしたので、大変残念ですが削除させていただきました。

他のテクニック系の記事なども、「プログラミングに直接関係するか」と聞かれると怪しいものが多いのですが、
消すかどうかはまだ迷ってます。
DataNitro、シートからデータを読み込む関数の実装

privateで少し勉強した位でしばらく放置していたけど、DataNitroをインストールしたので、久しぶりにpythonをいじってみている。
DataNitroなので、(excel)シートからデータを読み込む関数を実装。

```vba
def get_sheet_data(shtnam, toprow, keyclm, lftclm, rgtclm):
    row = toprow
    while Cell(shtnam, row, keyclm).value != None:
        row += 1
    if row > toprow:
        return CellRange(shtnam, (toprow, lftclm), (row - 1, rgtclm))
    else:
        return []
```

キー項目になるカラムのセルが空になるまでチェックするところは、vbaだと、

```vba
    Range(sheets(shtnam).Cells(toprow, keyclm), _
            sheets(shtnam).Cells(toprow, keyclm)).Select
    Selection.End(xlDown).Select
```
として、```Selection.row```を参照する実装で調べることができるけど、DataNitroだと
セルを１つ１つ見ていくやり方しかなさそう。
あと、シート上のボタンとかのコントールにアクセスする方法もなさそう。

pythonはあまり使ったことがないけど、クラスとか調べてややこしいなーと、感じてしまった。
この辺は別の記事で書こうかと。
LXC の Ubuntu テンプレートのオプション一覧

LXC の `lxc-create` で Ubuntu テンプレートに対して指定できるオプションの一覧。 (LXC 1.0.3 で確認)

| Option Name | Description
|-----------|-----
| `-h`, `--help` | ヘルプを表示して終了する。
| `-p`, `--path` | `config` ファイルとかを置くディレクトリ。
| `--rootfs` | `rootfs` (コンテナ内のファイルシステムのルートとなるディレクトリ) を指定する。このオプションを指定しなかった場合、`config` ファイル内に `lxc.rootfs` が指定されているならばそのディレクトリに、そうでなければ `$path/rootfs` が `rootfs` になる。
| `-u`, `--user` | 最初に作成するユーザ名。デフォルトでは `ubuntu`.
| `--password` | 最初に作成するユーザのパスワード。デフォルトでは `ubuntu`.
| `-F`, `--flush-cache` | `/var/cache/lxc` にキャッシュしてある mini ubuntu を削除してもう一回ダウンロードしなおす。
| `-r`, `--release` | どの Ubuntu のリリースを使うか。`precise` とか `trusty` とかを指定する。デフォルトでは `/etc/lsb-release` に書いてある Ubuntu のリリースを使う。
| `--pakcages` | 追加で apt-get したいパッケージがある場合はこれで指定する。複数ある場合はコンマ区切り。
| `-b`, `--bindhome` | 指定したユーザの home ディレクトリをコンテナ内に bind mount する。`--bindhome` を指定した場合、`--user` で指定されたユーザは作成されず、代わりに `--bindhome` で指定されたユーザがコンテナ内に作成される。パスワードはホストと同じものになる。
| `-a`, `--arch` | アーキテクチャを指定する。
| `-S`, `--auth-key` | `~/.ssh/authorized_keys` に書き込むための公開鍵を指定する。
| `-d`, `--debug` | テンプレートがどんなコマンドを実行しているのかを表示する。
| `--mirror` | apt-get のミラーサイトを指定する。デフォルトでは `http://archive.ubuntu.com/ubuntu`
| `--security-mirror` | apt-get のセキュリティミラーを指定する。デフォルトでは `http://security.ubuntu.com/ubuntu`

テンプレートに渡す引数は `lxc-create` のオプションの後ろに `--` をつけて、その後に指定する。

例:

```bash
sudo lxc-create -t ubuntu -n test -- --flush-cache --packages=zsh,git,wget,curl --user=nojima --auth-key=~/.ssh/id_rsa.pub --mirror="http://ftp.jaist.ac.jp/ubuntu"
```
LAMP環境の構築

初心者の書くことなので間違いや、もっと良いやり方があるのかも。
そういう指摘があれば是非是非教えて下さい。
#LAMP環境とは
L：Linux
A：Apache
M：MySQL
P：PHP（とか）

上記のような、Linux上でのWeb開発環境のこと。
最後のPはPHPだったりPerlだったりPythonだったりするようだけど、
ここではPHPのことを指しています。

#必要なもの
とりあえず14年6月21日現在の最新版を入れています。
##VMware（6.0.2）
https://my.vmware.com/jp/web/vmware/free#desktop_end_user_computing/vmware_player/6_0
##CentOS （6.5）
http://isoredirect.centos.org/centos/6/isos/x86_64/CentOS-6.5-x86_64-bin-DVD1.iso
#構築手順
##VMwareのインストール
省略
##CentOSのインストール
http://www.infraeye.com/study/linux3.html

インストールが終了したらCentOS内、上部メニューより
Application->System Tools->Terminal　でターミナルを起動

```
$ ifconfig
```

inet addの右にある　192.168.***.***　にputtyなどから接続
##CentOS設定
###アップデート

```
$ yum update
```

###時刻合わせ
####VmwareToolsでホストとゲスト時間を同期

![ScreenShot00093.png](https://qiita-image-store.s3.amazonaws.com/0/47107/4bf25668-a91b-61bd-78e4-386d75f90864.png)

####タイムゾーンを日本に変更

```
$ mv /etc/localtime /etc/old_localtime
$ cp -p /usr/share/zoneinfo/Japan /etc/localtime
```

####ntpのインストール

```
$ yum -y install ntp
```

####/etc/ntp.conf　を編集

```lang:/etc/ntp.conf
# Hosts on local network are less restricted.
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap # コメント化を解除 (or追加)

~

server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst

↓ 削除して以下のように変更

server ntp.nict.jp
server ntp.jst.mfeed.ad.jp
```

####時刻合わせを実行

```
$ ntpdate ntp.nict.jp
$ /etc/rc.d/init.d/ntpd start
```

ntpq -pでステータスを確認
以下の様にサーバ名の先頭に+や*がついたら時刻同期は正常に完了

```
$ ntpq -p

     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
+ntp-b2.nict.go. .NICT.           1 u   28   64    1    5.653  413.765   0.000
*ntp2.jst.mfeed. 172.29.2.50      2 u   28   64    1    3.525  413.279   0.000
```

+や*がついていない時は、5～10分待ってから試す

####ntpdの自動起動を設定


```
$ chkconfig ntpd on
```

####ハードウェアクロックにシステムクロックを書き込む

```
$ clock -w
```

##Apacheのインストール
[ここ](http://freesoft.tvbok.com/freesoft/virtual/vmware_centos4.html)が詳しいのでここを参考に
iptablesでちゃんとポートを開けないと繋がらないのでそこだけ忘れないように

Apacheを開始した際、以下の様なエラーが出た場合、

```
starting httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain for ServerName [OK]

(ServerNameにlocalhost.localdomainを使用した適切なドメイン名が確定できませんでした。)
```

このエラーが表示されていても動作に支障は無い（はず）が、嫌いな人は[ここ](http://blog.dacelo.info/apache/entry-713.html)や[ここ](http://katzplus.com/centos/apache/apache%E8%B5%B7%E5%8B%95%E6%99%82%E3%81%AE%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8/)を参考に修正

私の環境では以下のような修正で直ったが、環境によると思うので色々お試しあれ

```lang:/etc/httpd/conf/httpd.conf
ServerName localhost:80
↓
ServerName localhost.localdomain:80
```

##PHPのインストール
[ここ](http://centos.server-manual.com/centos5_apache2_php5.html)が詳しいのでここを参考に
##MySqlのインストール
[ここ](http://centossrv.com/mysql.shtml)が詳しいのでここを参考に

#参考情報
* [Clock skew detected.　CentOSで時刻同期しなきゃ](http://bohebohe.hatenadiary.jp/entry/2012/10/11/183347)
* その他記事内URLの方々
Flycheck を Python で使うためにしたことメモ

驚くほど設定は簡単です．


## 環境

* Mac OS X 10.8.5
* Emacs 24.3
  - el-get
  - Flycheck 0.20
* Python 3.3


## Emacs の設定

el-get を使っているのなら，


```el
(el-get 'sync 'flycheck)
(require 'python)

(defun tnoda/turn-on-flycheck-mode ()
  (flycheck-mode 1))
(add-hook 'python-mode-hook 'tnoda/turn-on-flycheck-mode)
```

だけです．


## チェッカーのインストール

Flycheck 0.20 では Python のチェックに

* flake8
* Pylint

の 2 つを使うことができます．使いたいものだけインストールすれば，あとは flycheck さんが PATH から勝手に見つけて使ってくれますので，インストール以外の設定は不要です．

```shell-session
$ pip install flake8
$ pip install pylint
```


## おわりに

Python で Flymake を使えるようにしてみました．チェッカに PATH が通っていれば，flycheck が勝手に探して使ってくれるので，ほとんど設定するところはありません．
【Unity】Mobile JoystickアセットをC#で使う


Unityのstandard assetsにモバイル用のJoyStickがあり便利ですが、これJavascriptで書かれてるのでC#派の人にはちょっと不便。
![kobito.1403411337.423777.png](https://qiita-image-store.s3.amazonaws.com/0/29775/059a8734-1dc7-7e57-e215-559144c357a8.png "kobito.1403411337.423777.png")



そこで調べてみると、これをC#に移植してくれてる方がいました。
http://wiki.unity3d.com/index.php?title=Joystick

英語なので手順を日本語にして残しておきます。

##C#スクリプトを用意
適当な場所にC#スクリプトを作って、上記URLのスクリプトをコピー。

例では下記に置いた。
Standard Assets(Mobile) > Scripts

![kobito.1403410794.786658.png](https://qiita-image-store.s3.amazonaws.com/0/29775/6daf68a7-906d-64c4-d51f-9d6756d51028.png "kobito.1403410794.786658.png")


## C#スクリプトをアタッチ
もとのJavaScriptの代わりに、いま作成したC#スクリプトをアタッチ。
![kobito.1403410909.273049.png](https://qiita-image-store.s3.amazonaws.com/0/29775/fae4f215-fe7a-6f1d-1a9c-f894a4a48043.png "kobito.1403410909.273049.png")


## Joystickに「joystick」というタグを付けておく
これ大事！これをしていないとExceptionエラーが出る。
新規にjoystickというタグを作りました。
![kobito.1403411040.952676.png](https://qiita-image-store.s3.amazonaws.com/0/29775/58e8bd15-67f1-b6d3-b517-906361bcf825.png "kobito.1403411040.952676.png")


## コード例

```
using UnityEngine;
using System.Collections;

public class GunController : MonoBehaviour {

	public Joystick joystick; // joystickオブジェクトはインスペクタから指定しました
	
	// Update is called once per frame
	void Update () {

		if (joystick.position.x > 0) {
			transform.Rotate(0, 1, 0);
		} else if (joystick.position.x < 0) {
			transform.Rotate(0, -1, 0);
		}

	}
}

```
自分的 Peco のキーバインド

[peco](https://github.com/peco/peco) は [percol](https://github.com/mooz/percol) をベースにしているので、percol のキーバインドを参考にしつつ考えてみました。
<del>ただし、peco は修飾に Control キーしか使えないので、ちょっとアレンジが必要でした。</del>
<ins>v0.1.8 から Alt/Option キーも使えるようになったので、修正しました。</ins>
<ins>v0.2.0 から SelectAll、SelectVisible、SelectNone が増えたのでちょっと修正。</ins>

参考にしたサイト

- peco/peco
https://github.com/peco/peco#keymaps

- mooz/percol
https://github.com/mooz/percol#configuration

- percol - コマンドラインでの選択的インターフェイスについて考える - Qiita
http://qiita.com/syui/items/f2fe51d00378210d10b1#3-3

- bashのキーバインド(キーボードショートカット) まとめ - readlineとbind、ついでにstty編 - うまい棒blog
http://d.hatena.ne.jp/hogem/20090411/1239451878

<ins>追記： Peco のデフォルトキーマップの情報が公開されたので、それに合わせて変更。</ins>
https://github.com/peco/peco#default-keymap

```json:config.json
{
  "Keymap": {
    "M-f": "peco.ForwardWord",
    "M-b": "peco.BackwardWord",

    "M-ArrowRight": "peco.ForwardWord",
    "M-ArrowLeft":  "peco.BackwardWord",

    "C-d": "peco.DeleteForwardChar",
    "C-h": "peco.DeleteBackwardChar",

    "M-d": "peco.DeleteForwardWord",
    "M-h": "peco.DeleteBackwardWord",

    "C-l": "peco.DeleteAll",

    "M-v": "peco.SelectPreviousPage",
    "C-v": "peco.SelectNextPage",

    "C-t": "peco.ToggleSelection",
    "C-s": "peco.ToggleSelectionAndSelectNext",

    "C-a": "peco.SelectAll",
    "C-g": "peco.SelectNone",

    "C-m": "peco.Finish",
    "C-j": "peco.Finish"
  }
}
```

これを `~/.peco/config.json` に入れると次の実行からキーバインドが有効になります。

かなり悩みましたが、とりあえずこれでしばらく試してみようと思います。
もっと良い組み合わせがあったら教えて下さい。
メモ　Awakeについて

GameObjectにアタッチしているScriptが
NonActive？（Enable=false？ Inspectorでチェックをはずす）になっていても、
GameObject自身がActiveであれば
シーンロード時にScript内のAwakeは必ず実行される。


そうなるとScriptのInspectorでチェックをつけたり外したりは、
OnEnable以外には意味がないのかな？

この辺もちょっと調べてみよう

Unityは奥が深いよ、覚えきれん
スクリーンショットを直接クリップボードに保存する方法


## やりたい事

スクリーンショットを直接クリップボードに保存したい。ファイルとかめんどい。

結構あるあるなのですが、Automan作ったり、appleスクリプト書いたりとかどうなの？

## って思ってたらあった

公式にあったとか悲しい。

[OS X Mountain Lion: 画面を撮影するためのショートカット](http://support.apple.com/kb/PH11229?viewlocale=ja_JP)


> 画面の写真（スクリーンショット）はデスクトップ上にファイルとして保存されますが、スクリーンショットをクリップボードに保存したい場合は、Control キーを押しながら他のキーを押します。クリップボードに保存したピクチャは、書類にペーストできます。

ようはctrlを付ければ良いってことね！

範囲指定且つclipbordで登録する場合


```
cmd + shift + 4 + ctrl
```


これで高速githubはりつけができる。
titanium build -p ios で iOS Simulator の選択画面が毎回でてきてこまったときのこと



## 現象

いつの日からか，iOS build すると次のようにSimulatorの選択画面がでるようになっていました．
毎回選択がめんどくさくてたまりません．

```
$ ti build -p ios
Titanium Command-Line Interface, CLI version 3.3.0-rc2, Titanium SDK version 3.2.3.GA
Copyright (c) 2012-2014, Appcelerator, Inc.  All Rights Reserved.

Please report bugs to http://jira.appcelerator.org/

Which simulator do you want to launch your app in?
   1)  iPhone Retina (3.5 inch)
   2)  iPhone Retina (4 inch)
   3)  iPhone Retina (4 inch 64-bit)
   4)  iPad
   5)  iPad Retina
   6)  iPad Retina (64-bit)
Select an simulator by number or name [1]:
```


## 原因

[Titanium CLI Options](http://docs.appcelerator.com/titanium/3.0/#!/guide/Titanium_CLI_Options-section-37549003_TitaniumCLIOptions-ios.autoSelectDevice) によると，

ios.autoSelectDevice という設定項目がありまして，もし true ならば自動で simulator を選択して起動しますよーみたいなこと書いてました．

```
ios.autoSelectDevice
If set to true, the CLI picks the emulator or device to launch your application on. If set to false, the CLI presents you with a list of emulator or device options for you to choose to launch the application on.
```


自分の設定を確認してみると...

```
$ ti config  | grep ios
ios.autoSelectDevice   = false
```

falseになってる！というわけで，これを true にすると直るはずです．

## 対処法

```
$ ti config ios.autoSelectDevice true
ios.autoSelectDevice saved
$ ti config  | grep ios
ios.autoSelectDevice   = true
```

直りました！

## おまけ

ちなみに help によるとSimulator を指定して起動するときは

```
$ ti build -h
（中略）
Build iOS Options:
   -C, --device-id <name>           the name of the iOS simulator or the device udid to install the
                                    application to; for simulator builds [iPhone Retina (3.5 inch),
                                    iPhone Retina (4 inch), iPhone Retina (4 inch 64-bit), iPad,
                                    iPad Retina, iPad Retina (64-bit)]; for device builds [itunes,
                                    <udid>, all]
```


ということで，-C （もしくは --device-id ）オプションで，指定するとよいらしいです．

### 例
```
# 4inch Retina 64bit で起動
$ ti build -p ios -C "iPhone Retina (4 inch 64-bit)"
```


ちょっと -C の選択肢が覚えにくいので，もう少し短いAliasがあるといいなーと思った今日この頃でした．
i18nのtranslation missingをテストする


i18n対応したサービスを提供していると、i18nのdictが一部抜けていたり、デザイン崩れているじゃんって事が多々有りますよね？

## やりたい事

で、そういうのをデプロイ前に未然に防ぎたいと思ってcontroller specにて、translation_missingが含まれているかとかチェックしていたけど、複数人で書いていると中々網羅性に掛けたりして困ってました。

そういうときに便利なのが[i18n-task gem](https://github.com/glebm/i18n-tasks)


## インストール

gemいれて

```
$ vim Gemfile
gem 'i18n-tasks', '~> 0.4.5' 

$ bundle
```

## 設定

デフォルトの言語はja、テスト対象はja, enにしたいと思います。

```
$ i18n-tasks config > config/i18n-tasks.yml
$ vim config/i18n-tasks.yml
```

```ruby
base_locale: ja
locales: [ja, en]

# dictを分割している場合は、それぞれ読み込んじゃいます。
data:
  read: 
    - 'config/locales/**/*%{locale}.yml'
```

## 実行

```
# translation missing
$ i18n-tasks missing

# unused
$ i18n-tasks unused
```

さらに使っていない物をremoveしたり、検索対象やremoveに際しignoreする事もconfigurationできます。

## rspecにインテグレーション

spec/view/translation/i18n_spec.rbを追加することで、CIでちゃんと試験してくれるようになります。

```ruby
require 'spec_helper'
require 'i18n/tasks'

describe 'I18n' do
  let(:i18n) { I18n::Tasks::BaseTask.new }

  it 'does not have missing keys' do
    count = i18n.missing_keys.count
    fail "There are #{count} missing i18n keys! Run 'i18n-tasks missing' for more details." unless count.zero?
  end

  it 'does not have unused keys' do
    count = i18n.unused_keys.count
    fail "There are #{count} unused i18n keys! Run 'i18n-tasks unused' for more details." unless count.zero?
  end
end
```

遣り過ぎるとメンテナンス性が落ちたり、設定が複雑化することもあるので、現行プロジェクトではtranslation missingだけの抽出を対象にしています。

やっと心が安らぐ。。。
Ubuntu12.04LTSでいつの間にかAtom.ioが動かなくなってた #solved

# いきなり動かなくなってた

しばらくぶりに、VirtualBoxのUbuntuを動かし、ATOMエディタを起動したら、ATOMエディタのdevtoolsに

```
TypeError: Unable to watch path
at HandleWatcher.start (/usr/share/atom/resources/app/node_modules/pathwatcher/lib/main.js:66:29)
```

のような、エラーが表示され、ATOMエディタが全く使えない状態。

```
git pull
script/build
sudo PATH=~/.nvm/v0.10.28/bin:$PATH script/grunt install
```

と、最新版にしても症状変わらず。
さらに、

```
atom --safe
```

で起動しても変わらず。

# 解決方法

[Ubuntu 14.04 js-error in the app #2082](https://github.com/atom/atom/issues/2082)に似た症状を発見し、

```
sudo sysctl fs.inotify.max_user_watches=32768
```

とカーネルパラメータ？を設定したら無事復活。

# まとめ

一度動いていても、今回みたいに、ある日動かないってことがあるから、
Linux系のATom.ioのISSUERSも既読にチェックしておく良いかも。

そういえば、OpenSSL祭り関連でnode.jsが0.10.29が出てるなぁ。。
Macで外付けHDDが突然アンマウントされて、以後全く反応(自動的にマウント)しない場合の対処方法(exFATの場合)


Macを使っていて外部HDDが勝手にアンマウントされた場合、
以下の方法で認識するか確認する

1. USBに挿し直してFinderのデバイスに表示されるか確認
2. 異なるUSB端子に差し替えて反応を見る
3. Macの再起動後にFinderのデバイスに表示されるか確認
4. ディスクユーティリティを開いて対象のデバイスを選択し、ディスクの検証および修復を行う

ディスクユーティリティでデバイスの修復でエラーが発生して、
”出来るだけバックアップを取ってからフォーマットして下さい”という
ようなメッセージが表示されるからといってフォーマットしてはいけません。
そもそもマウント出来ないのでバックアップも出来ないし。

こういうときは、もう一度ディスクの検証と修復を実行して下さい。
検証時にはまたエラーになりますが、修復時には正常に完了する場合があります。
CentOS のバージョンとアーキテクチャを確認するコマンドのメモ

CentOS のバージョンとアーキテクチャを確認するコマンドのメモ。

# バージョンの確認

```console
$ cat /etc/redhat-release
```

# アーキテクチャの確認

```console
$ arch
```

# 参考

CentOSのバージョン確認コマンドとアーキテクチャ確認コマンド | mawatari.jp
http://mawatari.jp/archives/check-centos-version
Java8のラムダ？単なる、あなたが今までやっていたことの違う書き方です。もしくは最も簡単なラムダの説明。

Java8 でラムダ式が導入されました。なんか、->とか、::とか、見慣れない演算子が出てきて敷居が高く感じている方も、いらっしゃるかと存じます。

しかしながら、ラムダ式は今まで皆さんが慣れ親しんだ匿名インナクラスの別の書き方と見ることもできます。この見方をすると、理解も早いと思います。

ここではサンプルコードとともに、ラムダ式を説明したいと思います。

# サンプルコード

```java:
package org.ukiuni.inspect.java8;
public class Main {
	public static void main(String[] args) {
		// 1. ラムダがない時代の書き方
		MyInterface myInterface = new MyInterface() {
			@Override
			public String myMethod(String arg) {
				return "Hello " + arg;
			}
		};
		// 2. ちょっと長めのラムダの書き方
		MyInterface myInterface2 = (String myArg) -> {
			return "Hello " + myArg;
		};
		// 3. 一般的なラムダの書き方
		MyInterface myInterFace3 = myArg -> "Hello " + myArg;
		// 4. 実行
		myInterface.myMethod("hello");
		// 5. メソッド実行
		howToExecLambda(myInterface, myInterface2, myInterFace3);
		// 6. メソッドで実行
		howToExecLambda(myArg -> "Hello " + myArg);
		// x. おまけ
		おまけInterface omake = () -> {};
		// x2. おまけ2
		おまけ2Interface myPrintln = System.out::println;
		myPrintln.おまけMethod("出力!!!!");
	}

	public static interface MyInterface {
		public String myMethod(String arg);
	}

	public static void howToExecLambda(MyInterface... myInterfaces) {
		for (MyInterface myInterface : myInterfaces) {
			System.out.println(myInterface.myMethod("ukiuni"));
		}
	}

	public static interface おまけInterface {
		public void おまけMethod();
	}
	@FunctionalInterface
	public static interface おまけ2Interface {
		public void おまけMethod(Object obj);
	}

}
```

# 説明
まずは、1. ラムダがない時代の書き方は、Javaを開発したことのある方なら慣れ親しんだ匿名インナクラスです。インターフェースの実装を処理中で行っている形です。
これをラムダを使って書くと、2. ちょっと長めのラムダの書き方 になります。これも同じく、処理中にインターフェースの実装を行っているのですが、クラス名とメソッド名を省略しています。これは型推論（変数MyInterfaceに入れてるので、MyInterface型のインスタンスを作成しているのだろう、とコンパイラが認識している）と、インターフェース中のabstractメソッドが一つなので、オーバーライドするメソッドはmyMethodだろうと推察できるため、省略できるのです。
続いて、3. 一般的なラムダの書き方 ですが、メソッドの引数も型推論で省略できるのと、return文も省略でき、また、()と{}も省略可能なため、3のような書き方ができるのです。
インナクラスの実装にすぎないので、普通のオブジェクトとしてメソッド呼び出しすることが可能です。4. 5. がその例です。よく見るのが、実装を変数に入れずにメソッドに直接渡す書き方、6. です。

このように、ラムダ式は匿名インナクラスの省略した書き方と見ることができます。

# おまけ
## おまけその1
あまり見慣れない書き方かもしれませんが、ラムダが省略した書き方と理解できると、

```java:おまけ抜粋
() -> {};
```

という書き方も読めると思います。メソッドの引数が空なので、(),処理も空なので、{}。からの場合はカッコが省略できなくなるため、()や{}が残っています。

# おまけその2
「::」も見慣れない記号ですね。これはすでに定義されたメソッドを値として取り扱うための演算子です。
値として取り出されたメソッドは、引数と戻り値の型が合う@FunctionalInterfaceインターフェースの型に代入することができます。
HaskellでOpenCVを使う。(CVパッケージを用いた実装)

# 内容
OpenCVのAPIをある程度ラップされている[CVパッケージ](http://hackage.haskell.org/package/CV)を用いて
画像処理(今回はテンプレートマッチング)を行ないました。
内容に誤りがありましたら、ご指摘をお願いいたします。

# 実装
```hs
import System.Environment(getArgs)
import CV.Image
import CV.Drawing
import CV.HighGUI
import CV.TemplateMatching
import Utils.Rectangle

main :: IO()
main = do
  [srcFile, tmpFile] <- getArgs
  srcImg <- readFromFile srcFile :: IO (Image GrayScale D32)
  opSrcImg <- readFromFile srcFile :: IO (Image RGB D32)
  tmpImg <- readFromFile tmpFile :: IO (Image GrayScale D32)
  (pt, _, _) <- getImageInfo tmpImg
  let (pm, _) = simpleTemplateMatch CCOEFF_NORMED srcImg tmpImg
      searchRect = mkRectangle pm pt
  opImg <- rectangle (0, 0, 255) 3 searchRect opSrcImg
  display $ (rgbToBgr.unsafeImageTo8Bit) opImg
```

# コードの内容
## 画像読み込み部分
まず、元画像と検索したい画像を入力として与えます。
readFromFile関数は型注釈をつけて画像ファイルを読み込みます。
テンプレートマッチングを行うsimpleTemplateMatch関数は
GrayScaleで処理を行うため、入力画像を両方ともGrayScaleで読み込みました。
あと出力画像はカラーで画像を出力したいので、元画像をRGBカラーで読み込んでいます。

## 検索結果表示に関する情報取得
getImageInfo関数で、検索したい画像のサイズを取得します。
これは検索結果で見つけた画像領域を囲むためです。

## テンプレートマッチング
simpleTemplateMatch関数でテンプレートマッチングを行ないます。
CCOEFF_NORMEDは代数的データ型MatchTypeのコンストラクタでEnumのインスタンスです。
この値は類似度計算方法を指定するものでOpenCVでも定義されています。
この値の意味は相関係数+正規化の計算方法でテンプレートマッチングを行なわせます。
残りの2引数は元画像と検索する画像です。

## 検索結果の画像を作成
simpleTemplateMatch関数の結果は最もマッチした箇所の座標が返ってきます。
mkRectangle関数は、その位置に対して、検索したい画像のサイズの大きさの長方形を作ります。
rectangle関数は色と線の太さを指定して、長方形を画像に描きます。

## 検索結果の画像を表示
display関数で検索結果の画像を表示します。
内部ではBRG形式で扱っているようなので、RGB形式からBGR形式に変換してから表示します。

# 入力画像と出力結果

## 入力画像

検索元画像
![lena.jpg](https://qiita-image-store.s3.amazonaws.com/0/44864/b1bd23ea-1002-b99a-f108-83417c52fa15.jpeg)

検索画像
![eye.png](https://qiita-image-store.s3.amazonaws.com/0/44864/05d48bf5-6b53-6a05-0550-65584452b41b.png)


## 出力画像
![result.png](https://qiita-image-store.s3.amazonaws.com/0/44864/5f277786-904c-355c-6e33-f1385264800f.png)
Atom で Java 開発


[Atom](https://atom.io) で頑張って Java 開発する。

## 動作環境

* Atom 0.106.0

## Packages

### Language Java

Syntax Highlighting と Snippet のプラグイン。デフォルトでインストールされている。Snippet の一覧は、Setting View の 'Language Java' の項目で確認できる。

### Gradle Ci

Gradle ビルドを裏で実行し続け、エラーがあれば教えてくれるプラグイン。Gradle で javac の出力が文字化けする場合は、`.bash_profile` 等に以下のように記述する。

    $ export JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8

### Linter Javac

動作確認できなかった。(2014/6/22 現在)
vagrant+(vmware, virtualbox)の性能比較

ホストマシン: MacBookPro 15-Inch, Late 2013
Processor: 2.6GHz Intel Core i7
Memory: 16GB 1600MHz DDR3
OS: Mac OSX 10.9.3

ゲストマシンに割り当てるメモリは 1024MBにそろえている

あんまり差はなかったな…。

## up や reload にかかる時間を比較

### vagrant+vmware

````
$ time vagrant up
...
vagrant up  4.86s user 0.85s system 18% cpu 31.059 total
$ time vagrant reload
...
vagrant reload  6.33s user 1.00s system 19% cpu 38.311 total
$ time vagrant halt
...
vagrant halt  2.84s user 0.38s system 32% cpu 9.831 total
````

### vagrant+virtualbox

````
$ time vagrant up --no-provision
vagrant up --no-provision  3.58s user 1.51s system 15% cpu 33.067 total
...
$ time vagrant reload
vagrant reload  3.93s user 1.84s system 13% cpu 42.930 total
...
$ time vagrant halt
vagrant halt  2.01s user 0.51s system 22% cpu 11.126 total
````

## sahara使ってみて時間比較

### vagrant+vmware

````
$ time vagrant sandbox on
[default] Starting sandbox mode...
vagrant sandbox on  1.03s user 0.12s system 97% cpu 1.175 total
$ time vagrant sandbox commit
[default] Committing the virtual machine...
vagrant sandbox commit  1.16s user 0.15s system 96% cpu 1.352 total
$ time vagrant sandbox rollback
[default] Rolling back the virtual machine...
vagrant sandbox rollback  1.17s user 0.15s system 36% cpu 3.640 total
````

### vagrant+virtualbox

````
$ time vagrant sandbox on
[default] Starting sandbox mode...
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
vagrant sandbox on  1.29s user 0.16s system 54% cpu 2.656 total
$ time vagrant sandbox commit
[default] Committing the virtual machine...
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
vagrant sandbox commit  1.32s user 0.17s system 46% cpu 3.231 total
$ time vagrant sandbox rollback
[default] Rolling back the virtual machine...
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
vagrant sandbox rollback  1.33s user 0.18s system 29% cpu 5.037 total
````
os x セットアップログ

Software Update -> update all


System preferences -> mouse -> remove check   “Scroll direction: natural”

System preferences -> Accessibility -> Mouse & Trackpad -> check "Ignore build-in trackpad when mouse or wireless trackpad is present"

System preferences -> security & Privacy -> Firewall -> Turn On Firewall

System preferences -> security & Privacy -> Firewall -> Firewall Options -> check “Block all incoming connections”

System preferences -> Mission Control -> Hot Corners -> add what you want 

Launch Terminal -> Preference -> Settings -> choose Pro and puress Default button

download & install Avira

download & install Atom

download & install Cot Editor

download & install VirtualBox


System Preferences -> Keyboard -> Keyboard Shortcuts -> Application Shortcuts

push +

all applications

Paste and Match Style 
command + v


System Preferences -> Spotlight -> Spotlight menu keyboard shortcut -> update to shift & control & space
知っておくと躓かない。EclipseのJava8対応バージョン。(Lunaでも対応してない場合あり。)

EclipseでもJava8の対応が進んでいます。Eclipse4.3(Kepler)からはパッチを当てればJava8の開発ができます。
Eclipse4.4(Luna)も、正式ビルドではJava8対応が謳われていますが、正式リリース前の現在（2014/06/22）、LunaでもデフォルトでJava8対応されているものと対応されてないものがあります。
Java8の開発をしようと設定を探し、対応されていないLunaで時間をムダにしないために、ここで皆様に共有しておきます。

# Java8に対応されているLunaは「RC1以降」
[こちら](http://wiki.eclipse.org/JDT_Core/Java8)に記載されているように、Java8に対応しているLunaは I20140318-0830 、RC1からです。
それ以前のEclipseでは、設定→Java→CompilerのCompiler compliance levelに、1.8が出てきません。
![スクリーンショット 2014-06-22 9.32.38.png](https://qiita-image-store.s3.amazonaws.com/0/25176/e6f37e5d-2c27-a891-03f3-acb887a0abfe.png)

RC1以降であれば、1.8が選択できます。
![スクリーンショット 2014-06-22 9.35.11.png](https://qiita-image-store.s3.amazonaws.com/0/25176/7122c1c4-6ec5-6c95-7eeb-a269a572efe5.png)

お知りおきあれー。
EC2 カスタムAMIを作成する

設定を入れ込んだものをEC2インスタンス作成時に選択できる「カスタムAMI」という機能があります。
各ユーザでの標準設定を入れ込んだ状態でSnapshotを取得してください。

１．EC2管理コンソール→「Snapshots」を選択します。その中から該当のsnapshotを選択し、
　　右クリック→「Create Image」をクリックします。
![ec2000051.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/511f316f-8055-0046-ac0a-8745ea2e42ff.jpeg)

２．「Name」に判断し易い名称を入力します。また、その他のパラメータについても入力します。
　　「Create」ボタンをクリックします。
![ec2000052.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/20fb08a7-19bf-ccb6-ba17-4161359c6d47.jpeg)

３．「Close」をクリックします。もうこれで完了です！！
ec2000053.jpg
![ec2000053.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/3d6869ba-552c-6696-6b36-96daf7ba2a06.jpeg)

４．確認するために、「Instances」→「Launch Instance」を実行します。
![ec2000054.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/8410997b-8df4-254b-e897-61cc552e03e3.jpeg)

５．MyAMIsに作成したカスタムAMIが表示されます。
![ec2000055.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/53e2ee12-c6b0-0c69-b4e7-06dfa1a1342d.jpeg)
おみくじプログラムの改造の続き

昨日の続きを考える。もう一度レッスン動画を見直していると[#17 オブジェクトを使ってみよう](http://dotinstall.com/lessons/basic_javascript_v2/26717)というレッスンを発見した。要素をペアのように書いている。これはオブジェクトというらしい。

オブジェクト
>コンストラクタは、与えられた値のオブジェクトラッパーを生成します。値が null や undefined である場合、空のオブジェクトを生成して返します。それ以外の場合は、与えられた値と一致する型のオブジェクトを返します。

>ノンコンストラクタコンテキストにおいて呼び出されたときは、 Object は、同じように振舞います

何を言ってるのか全くわからないが、とにかくオブジェクトは利用できそうなので試してみた。



``
function getOmikuji() {
var omikuji = {
	A: 1,
	B: 2,
	C: 3,
};
var result = Math.floor(Math.random() * omikuji.length);
document.getElementById('text_stage').innerHTML = omikuji[result];
}
``

結果は何度試してもundefinedだった。タイプミスはない。undefinedは定義されていないという意味だったはずだがvar omikujiの中にきちんと書いているので定義されているはずだ。定義って何かね。調べてみるとオブジェクトはlengthが動かないのでkeyというメソッドを使うらしい。


``
function getOmikuji() {
	var omikuji = {
	A: 1,
	B: 2,
	C: 3,
};
var result = Object.keys(omikuji);
for (var i = 0, len = result.length; i < len; i++) {
				console.log(result[i]);
			}
		}
``

コンソールログにはA,B,Cが表示された。1歩進んだ気がする。ただ、なぜここでfor文が使われるのかがわからない。``var result = Object.keys(omikuji);``これでresultの中には何が入ったのだろう。予想だけど、この時点ではresultの中にはAしか入っておらずfor文で1つずつ要素が足されてCまで到達したら``console.log(result[i]);``が実行されているのか？

半歩進んだので、これをランダムで表示してみたい。ただ、ここで詰まった。``Math.floor(Math.random() * result.length);``をどこに書いてもランダムにならない。``var result = Math.floor(Math.random() * Object.keys(omikuji));``こんな書き方を試しても動かない。

そもそもプロパティの値という名前の1,2,3の扱いはどうなったのか。全く顔を出す様子がないので不安になる。悩むこと山のごとし。


``
function getOmikuji() {
var omikuji = {
	A: 1,
	B: 2,
	C: 3,
};
var result = Object.keys(omikuji);
console.log(result["0"]);			
		}
``

試しにこう書いてみたところコンソールにはAが表示された。``result[1]``ではBが表示され``result[2]``ではCが表示された。ならばと``result[A]``書いてみたところA is not definedが表示されたのだが``result["A"]``ではエラー表示では無く中身がundefindと表示された。

そこでundefindを調べてみた。
>未定義である事を意味する値

``var omikuji``で定義してると思うんだけどこれは違うのだろうか。謎は深まる。今のところわかっているのは添え字を書けばプロパティ名は表示させることができるということと、プロパティの値の表示方法はわからないということ。

というわけで「オブジェクト プロパティ 値」でググる。プロパティの値の取得は簡単で、今回の場合は``console.log(omikuji.A);``と書くだけでいい。``[]``ではなく``.``だったのか。コンソールログには1と表示され、無事にプロパティの値を取得することができた。ん？ということは、ひょっとしてこれならば・・・？

``console.log(Math.floor(Math.random() * omikuji.length));``

結果は``NaN``だった。これは数値ではないという意味らしい。ということは文字列？ならば整数に変換する``Math.floor``が邪魔なのかと考え``console.log(Math.random() * omikuji.length);``と書いてみるが結果は同じく``NaN``だった。ここでプロパティの値をランダムに取得する方法を調べようと思ったのだが、なかなか思うような記事を見つけることができず断念。

#今日のまとめ
##オブジェクトとは
キーと値の組み合わせ。「トマト（キー）は100円（値）」のようなもの。
[Object](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object)

##オブジェクトには``length``が利用できない
``length``の代わりに``Object.keys``を利用する
[keys](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/keys)

#総評
前回の[おみくじプログラムの改造](http://qiita.com/cervomansan/items/473b0da0353cf4a6ae2e)の完成には至らなかったが他のことが勉強になった。困ったことに、わからないことや調べたいことがあるとき、どういうキーワードで調べればいいのかという部分で壁に当たる。プログラムの経験、知識が全くないために「何がわからないのか」がわかっていないことが多々ある。そして、これが一番困るのだ。MDNのような場所で調べると専門用語を多用しているため、何を言っているのかさっぱりわからないことも迷宮入りに拍車をかける。

壁に当たって止まっていても仕方がないので、おみくじプログラムの改造は一度ストップして、次は別の簡単なプログラムに挑戦してみようと思う。
Vagrant設定メモ


```
vagrant box add rails https://oss-binaries.phusionpassenger.com/vagrant/boxes/latest/ubuntu-14.04-amd64-vbox.box
```

```
vagrant init .
```



```
emacs Vagrantfile
```

```
config.vm.box = "box名"
config.vm.network :forwarded_port,guest:80,host:8080
```
EC2 Snapshotからの復旧方法

EC2のスナップショットからの復旧方法はディスクを入れ替えるような形となります。
インスタンスを停止する必要があります。
作業途中でスナップショットを取っておき入れ替えることで、さまざまな構築検証ができるので便利です。

１．EC2管理コンソールの「Instances」画面にて、復旧したいインスタンスを右クリックし「Stop」をクリックします。
![ec2000033.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/a1c6e486-787d-e6b0-4b27-92bdf75e68e1.jpeg)

２．「Yes,Stop」をクリックします。
![ec2000034.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/9d8d2ae6-f8f6-a876-faaa-b857033f184d.jpeg)

３．「Instance State」が「Stopped」になっていることを確認します。
　　※ここで該当インスタンスの「Availavility Zone」を確認しておいてください。
![ec2000035.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/b4590120-e074-f95e-701a-ead63591adb8.jpeg)

４．「Volumes」を選択して右側に表示されたVolumeをクリックし、先ほど停止したインスタンスに
　　マウントされているディスクを探します。「Attachment information」を頼りに探してください。
![ec2000036.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/57fd8ffa-b4ea-f3d8-36d3-d7214e0657ff.jpeg)

５．ディスクを選択した状態で右クリックし、「Detach Volume」を選択します。
![ec2000037.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/95a87ba7-11fa-e5c7-b142-1544301bb851.jpeg)

６．「Yes,Detach」をクリックします。
![ec2000038.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/0efd0c6b-2727-7e36-d384-60c42c79ca36.jpeg)

７．「State」が「available」になったことを確認します。
　　これでインスタンスからハードディスクが取りだされた状態となります。
![ec2000039.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/936a0d15-03c3-f030-3d1d-482124f55735.jpeg)

８．Snapshotをクリックし、「Name」から以前取得したスナップショットを判断します。
　　復旧したいスナップショットを選択し、「Create Volume」をクリックします。
![ec2000041.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/3d11fc3a-3924-4058-355e-045d549b685e.jpeg)

９．基本的なディスクのオプションを設定し、「Create」をクリックします。
　　※ここで該当インスタンスと同じ「Availavility Zone」を選択します。
　　　内蔵ディスクに該当するので、同一物理ゾーンのディスクしかマウントできません！
![ec2000042.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/bca92042-087c-d429-d196-6d8ea4cd5c53.jpeg)

１０．「Close」をクリックします。
![ec2000043.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/3f8cad1f-b307-69e5-f570-4c14fe194e56.jpeg)

１１．Volumesをクリックします。先ほどの手順でVolumeが増えていることを確認します。
![ec2000044.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/6c002c62-36c3-e632-e4a2-621b05d3aa97.jpeg)

１２．「Snapshot」欄から先ほどのVolume構築時に使ったSnapshot IDと一致するものを探して選択を行い、
　　　右クリック→「Attach Volume」をクリックします。
![ec2000045.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/08d58e62-2030-e7c6-e23d-0e32795d2e41.jpeg)

１３．Instanceをクリックすると、候補が表示されるのでその中からEC2を選びます。
　　Deviceにはマウントポイントを記述します。（大抵/dev/sda1です）
　　「Attach」をクリックします。
![ec2000046.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/b08d7225-50b1-67cc-da47-b7b915001642.jpeg)

１４．Stateが「in-use」となり、EC2にマウントされたことを示します。
![ec2000047.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/cc5c4dee-a93b-0e9a-1ede-241b999e8ac5.jpeg)

１５．ディスクの入れ替えを行ったEC2を選択して右クリックし、「Start」をクリックします。
![ec2000048.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/72242d14-fcc4-ee20-371b-624f84d15263.jpeg)

１６．「Yes,Start」をクリックします。
![ec2000049.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/9e606e4f-be99-f1c9-b9b2-ae0f46537d79.jpeg)

１７．以上でスナップショットからの復旧が完了となります。
![ec2000050.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/4f7252a5-4810-7fdd-f7b8-233ff0445c59.jpeg)
EC2のスナップショット作成方法

Amazon Web ServiceのEC2を構築していて、バックアップを取得する方法を記述します。
スナップショットというその瞬間をバックアップする機能となります。

メモリ上にあるデータは保存されないため、Amazon側としては停止した状態での取得を推奨しているようです。
でも世間的には停止しないで取得することが多いようです。

１．EC2管理コンソールから「Volumes」をクリックします。
![ec2000026.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/9cc1da40-f4c0-47c3-2259-f921aaea3d38.jpeg)

２．表示されたVolumeをクリックし、下に表示される情報を見ます。
　　「Attachment Information」と言うところに、どのEC2にマウントされているかが表示されます。
　　ここを頼りに取りたいものを選びます。
![ec2000027.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/125dfe67-f1e8-e948-2fba-e4777fa4cace.jpeg)

３．選択状態で右クリックし、「Create Snapshot」を選択します。
![ec2000028.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/3559bcaf-16f6-1f25-1a24-ce16f204a758.jpeg)

４．「Name」に後から見て判断できるように値を入力し、「Create」をクリックします。
![ec2000029.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/e96c9319-3635-a635-a403-4c7e75f02e98.jpeg)

５．以上でスナップショットが作成されます。「Close」をクリックします。
![ec2000030.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/97b60515-9716-1aa2-09d0-7d25aab15d5f.jpeg)

６．「Snapshots」をクリックします。先ほどの手順でスナップショットが作成されたことを確認します。
![ec2000032.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/a545d612-e277-3ebf-1cac-49558b32014e.jpeg)
EC2に接続する方法

EC2に接続をします。
準備として、構築時にダウンロードした鍵を用意してください。

１．EC２の管理画面でInstancesをクリックします。
![ec2000017-2.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/3f639a1e-661b-df7b-6d98-437fd0374edc.jpeg)

２．作成したインスタンスをクリックします。
　　選択したインスタンスの情報の中から「Public IP」を探してコピーしておきます。
![ec2000018-2.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/8c04220a-4ef6-8753-c31b-90b35a5bb186.jpeg)

３．テラタームを起動し、ホストに先ほどのIPを入力して「OK」をクリックします。
![ec2000019.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/5599cbc6-8bed-2a98-0bac-bffdd14c247c.jpeg)

４．セキュリティ警告画面で「続行」をクリックします。
![ec2000020-2.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/f335e97e-5567-e664-f4cf-e38a75c4a288.jpeg)

５．「ユーザ名」に「ec2-user」と入力します。
　　「RSA/DSA鍵を使う」を選択し、「秘密鍵」をクリックする。
![ec2000021-2.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/2ca2932f-7ee5-ab03-3e21-7350aef4779b.jpeg)

６．EC2作成時の鍵を選択します。
![ec2000022.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/3ee652d4-929e-9f67-39f1-899c0e163e8d.jpeg)

７．「OK」ボタンをクリックします。
![ec2000023-2.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/8cde0736-2e7c-753a-5aa2-6a612203bcb6.jpeg)

８．接続されました。
![ec2000025.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/99b725c4-d421-bbee-e69e-9a7b41644459.jpeg)
AWS EC2インスタンスを構築する（2014/6/22 時点版）

Amazon Web Service上にサーバを構築します。
結構Amazon側でWebページを更新するので、参考程度にご覧ください。

１．Consoleから「EC2」をクリックします。
![ec2000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/25607f0a-a369-991d-8f0f-e27377237623.jpeg)

２．「Instances」をクリックする
![ec2000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/9f7f7f34-ebf4-9155-84b1-a5e935d3e478.jpeg)

３．「Launch Instance」をクリックする
![ec2000003.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/0170ba53-5477-2c72-8151-b1e1c656574d.jpeg)

４．使用したいOSをクリックします。
![ec2000004.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/9ede788d-53d0-bf91-7813-6a8c5e8166e6.jpeg)

５．使用するインスタンスタイプを選択し、「Next: Configure Instance Details」をクリックします。
　　CPUの数やメモリ量、HDDの種類等の割り当てが変わります。
　　後からインスタンスタイプの変更が出来ますので、最小のものを選択しても良いかと思います。
![ec2000005.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/44ac9ed3-1bc0-d1bd-1d15-49755c37b334.jpeg)

６．ここは余りいじりません。明確に値が決定している場合は、選択・入力を行います。
　　「Next:Add Storage」をクリックします。
　　Subnetのところについては、Availability Zone（物理的な配置）を後から変えられないので、ここだけは明確に
　　選択した方が良いです。
![ec2000006.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/25090708-0b71-cbef-dd66-dd67defd3dca.jpeg)

７．ストレージのサイズを記述します。格納したファイルサイズでお金がかかるので、最小限としておきます。
　「Next: Tag instance」をクリックします。
![ec2000007.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/41a78be0-ddda-a2e3-0c2e-1d6f1d3ab6e6.jpeg)

８．インスタンスに名前を付けます。その他の情報についてもタグを追加して記述することが出来ます。
　「Next: Configure Security Group」をクリックします。
![ec2000008.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/8c810412-1c1d-fd3d-a58d-d7c6e62b4da6.jpeg)

９．ファイアウォールに該当するセキュリティグループに関しての設定を行います。
　　Security Group Name　：任意の名称を記述
　　Description　　　　 　 ：Create・・・の前の部分をSecurity Groupと同じにすると分りやすいです。
　　セキュリティ定義　　　：任意
　　　　　　　　　　　　　　※最低限SSHは通しましょう。分らない場合は、「My IP」を選択すると
　　　　　　　　　　　　　　　今アクセスしているIPアドレスを入力してくれます。
![ec2000009.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/74ab19e7-3263-80d6-2a89-7a54b146aebd.jpeg)

１０．SSDを使いませんか？とオススメするページが表示されます。必要無い時は一番下のままで
　　　「Next」をクリックします。SSDにするとちょっと値段が上がるようです。
![ec2000010.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/a032ec99-d032-85be-1fa2-2bbdc733570d.jpeg)

１１．これまで設定したものが表示されます。間違いがないか確認し、「Launch」をクリックします。
![ec2000011.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/c2c4a88e-8a36-4c07-1184-53fa2f4bfe84.jpeg)

１２．SSHでアクセスする際のカギを作成します。一度作成していれば、その鍵を利用すると楽です。
　　名称を記述して「Download Key Pair」をクリックします。大事なものなのでちゃんと大事に
　　取っておいてください。　　　
![ec2000013.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/89f571cf-7878-5a41-9bd4-bf11b6eb5a67.jpeg)
![ec2000014.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/da3983b8-439e-831f-a931-70f8b12e78d4.jpeg)

１３．「Launch Instances」をクリックします。
![ec2000015.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/a39c672b-8a05-00bf-05c3-90ec7b090344.jpeg)

１４．以上でEC2が出来上がります。
![ec2000016.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/6edcb105-8513-3896-293e-d3294fbb852d.jpeg)
Infrataster+Vagrantでssh_execに失敗する時

[Infrataster][1]では、テスト用に定義したサーバーにSSH接続してコマンドを実行する、[current_server.ssh_exec][2]というユーティリティメソッドが用意されています。これを使って、RSpecの`before`ブロックでちょっとした準備をしたりできます。

```ruby:spec/spec_helper.rb
describe server(:proxy) do
  before do
    current_server.ssh_exec "echo 'Hello' > /tmp/test"
  end
end
```

これがエラーになるパターンがあったので、その紹介と解決法を書いてみます。

---

Vagrantでバーチャルマシンを作っている時は、サーバー定義で`vagrant: true`にしていると思います。

```ruby:spec/spec_helper.rb
Infrataster::Server.define(
  :proxy,
  '192.168.33.10',
  vagrant: true
)
```

で、`Vagrantfile`で`config.vm.define`を使ってバーチャルマシンに名前を付けて **いない** 時、

    Infrataster::Server::Error: `vagrant ssh-config` failed. Please check if VMs are running or not.

というエラーを吐いて`current_server.ssh_exec`が失敗してしまいます。

これの（たぶん）一番簡単な解決法は、サーバー設定を定義する時にSSHの設定も定義してしまうことだと思います。

```ruby:spec/spec_helper.rb
Infrataster::Server.define(
  :proxy,
  '192.168.33.10',
  ssh: {user: 'vagrant', keys: [File.expand_path('~/.vagrant.d/insecure_private_key')]},
  vagrant: true
)
```

これでとりあえずうまくいきます。

---

始めはInfratasterにパッチを当てて解決しようと思っていました。
↑の「`vagrant ssh-config` failed.」というエラーだけなら、`vagrant: true`を`vagrant: :default`と変えてやれば（そう、`true`/`false`だけじゃなくて名前を設定してもいいんです）`vagrant ssh-config default`になって成功するんで、それでやろうかなあと。
ですが、その後に別の場所でエラーになったりして、なんか割と大きめの改修になりそうだったのでとりあえず今うまくいく方法をポストしておこうと思ったのでした。

[1]: http://infrataster.net
[2]: http://infrataster.net/#ssh_exec
CentOSにPHP5.5とphpMyAdminをインストール

Vagrant上のまっさらなCentOS6（64ビット）にPHP5.5をインストールするまでのメモ。

PHP5.5インストールに関して、多くは以下の記事を参考にさせていただいてます。
[CentOSにPHP5.5をインストール](http://qiita.com/pakiln/items/bcddcdd96e94dab96873)

※vagrantの設定などは割愛します。`vagrant ssh`でログインした後です。

# 事前準備
## iptablesの停止
localhostとして使うので、ファイアウォールを切っておきます。

```bash
$ sudo service iptables stop
$ sudo chkconfig iptables off
```

## yumのアップデート
yumを最新にアップデート。

```bash
$ sudo yum -y update
```
## リポジトリの追加
rpmforgeリポジトリを追加

```bash
$ sudo yum -y install http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
$ sudo sed -i -e "s/enabled = 1/enabled = 0/g" /etc/yum.repos.d/rpmforge.repo
```

epelのリポジトリを追加。

```bash
$ sudo rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ sudo sed -i -e "s/enabled = 1/enabled = 0/g" /etc/yum.repos.d/epel.repo
```

remiのリポジトリを追加。

```bash
$ sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
$ sudo sed -i -e "s/enabled = 1/enabled = 0/g" /etc/yum.repos.d/remi.repo
```

追加リポジトリもアップデートしておきます。

```bash
$ sudo yum -y update --enablerepo=rpmforge,epel,remi,remi-php55
```

# PHP5.5のインストール
## リポジトリを指定してインストール
remi-php55を指定すればPHP5.5関連のパッケージをインストールできるらしい。
他にも必要そうなパッケージをインストール。

```bash
$ sudo yum -y install --enablerepo=remi,remi-php55 php php-opcache php-devel php-mbstring php-mcrypt php-mysql php-phpunit-PHPUnit php-pecl-xdebug php-cli php-common
```

# phpMyAdminのインストール
## インストールエラー
phpMyAdminもremi-php55からインストールします。

```bash
$ sudo yum -y install --enablerepo=remi-php55 phpMyAdmin
```

しかし、ここでエラー。

```bash
Error: Package: php-gd-5.5.13-3.el6.remi.x86_64 (remi-php55)
           Requires: libgd.so.3()(64bit)
Error: Package: php-pecl-imagick-3.1.2-3.el6.remi.5.5.x86_64 (
           Requires: libMagickCore-6.Q16.so.2()(64bit)
Error: Package: php-pecl-imagick-3.1.2-3.el6.remi.5.5.x86_64 (
           Requires: libMagickWand-6.Q16.so.2()(64bit)
Error: Package: php-pecl-imagick-3.1.2-3.el6.remi.5.5.x86_64 (
           Requires: ImageMagick-last-libs(x86-64) >= 6.8.9
```

## 必要なパッケージのインストール
まずはphp-gdをインストールするためにgd-lastをインストール。
gd-lastはremiからインストールする必要があるようです（remi-php55には存在しない）。

```bash
$ sudo yum -y install --enablerepo=remi gd-last
```

インストールしたら、php-gdをインストール。

```bash
$ sudo yum -y install --enablerepo=remi-php55 php-gd
```

次に、ImageMagicをインストールします。
**ImageMagickはImageMagickではなく、ImageMagick-lastをインストールします**（ここでかなりハマった）。

```bash
$ sudo yum -y install --enablerepo=remi ImageMagick-last
```

これでphpMyAdminがインストールできます。

```bash
$ sudo yum -y install --enablerepo=remi-php55 phpMyAdmin
```
GitHub for Windows または Git Shell のショートカットを再インストールする

GitHub for Windows または Git Shell のショートカットアイコンに異常が生じた際に、それらの修復を行います。

0. Git Shell を起動
1. GitHub.exe のパスをクリップボードに格納
`Get-Command GitHub.exe -Syntax | CLIP`

2. Git Shell を閉じ、コマンドプロンプト、または PowerShell を起動し、
`GitHub.exe --reinstall-shortcuts`

***

補足
GitHub.exe には --reinstall-shortcuts 以外の入力も可能です。詳しくは GitHub.exe -help で確認できます。

蛇足
GitHub for Windows をインストールすると、Git Shell も一緒にインストールされます。この Git Shell は msysgit と異なり、何も設定せずとも日本語の入出力が可能なので便利です。
PG::ConnectionBad - could not connect to server: Connection refused

http://stackoverflow.com/questions/19828385/pgconnectionbad-could-not-connect-to-server-connection-refused

概ね上記だけど、postgresの再起動がそのままではできなくて

http://morizyun.github.io/blog/postgresql-mac-centos-rails/

を参考にした。多謝。結果以下のようにコマンドすることになった。

```bash
rm  /usr/local/var/postgres/postmaster.pid 
launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
```
Jqueryで長時間詰まった原因。

コンソールで[$ is not defined]エラー。
原因:Jsファイルの読み込み順。

Bad

```index.html
<script type="text/javascript" src="./js/style.js"></script>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.11.1.min.js"></script>
```

先にjQueryが読み込まれていないとダメ。

```index.html
<script type="text/javascript" src="http://code.jquery.com/jquery-1.11.1.min.js"></script>
<script type="text/javascript" src="./js/style.js"></script>
```
型推論器を作る(6) レミの多相型型推論③Letに型の初期値を設定する


実際の計算では、型を指定する可能性があります。
従って、型を指定出来るように拡張してみましょう。

```ocaml:
| Let of (string * t) * e * e
```

typeofのletの箇所は、te1の型が決まっているので、
unifyして、確認します。

```ocaml:
| Let((id,t),e1,e2) ->
      enter_level();
      let te1 = typeof env e1 in
      unify t te1;
      leave_level();
      typeof (M.add id (gen te1) env) e2
```

さて、テストコードにも型を入れないと行けません。

```ocaml:
let t ()=
    Typing.newvar()
```

という関数を作って使います。

```ocaml:
Let ("y" ... )
```

といった箇所はすべて

```ocaml:
Let (("y", t()) ...)
```

に書き換え、実行してみます。
これだと残念ながらいくつかのテストが失敗します。
原因は、レベルが1に設定するとLetで指定した型はすべてグローバルなスコープにあるように判定されてしまう為です。
これを回避するには、レベルを非常に大きな値に設定します。

```ocaml:
let t ()=
  TVar(ref(Unbound(Typing.gensym(), 300000)))
```

このようにすることで、正しく判定されるようになります。
なぜなら、レベルをunifyする時は必ず、unboundなので値を代入されるのですが、代入する際には、occursチェックがはしり、レベルが現在地より大きければ現在地に設定される為です。
型推論器を作る(5) レミの多相型型推論②レベルを追加する


現在のレベルを表す変数をlevelを追加します。

```ocaml:
  let level = ref 1
```

リセットにlevelのリセットも追加します。

```ocaml:
let reset() : unit =
  count := 0;
  level := 1
```

enter_levelはlevel変数をカウントアップします。

```ocaml:
  let enter_level(): unit =
    incr level
```

leave_levelはlevel変数を元に戻します。

```ocaml:
  let leave_level(): unit =
    decr level
```

これで、レベル周りの部品は出来ました。

次にこれを型推論器に組み込みましょう。

newvarで新しい変数を作るときには、レベルを保存するように変更します。

```ocaml:
  let newvar (): t =
    TVar (ref (Unbound (gensym (), !level)))
```

occurs の変更は

```ocaml:
    | TVar({contents = Unbound (name,l')} as tv) ->
      let min_level =
        match !tvr with
        | Unbound (_,l) -> min l l'
        | _ -> l'
      in
      tv := Unbound (name, min_level)
```

TVarがUnboundなときレベルを更新するようにします。
occursチェックが走った場合はレベルは最も小さい値に設定する事で、
広い範囲に移動した事が分かる訳です。

gen関数の修正はunboundに条件を付けてレベルが現在レベルより大きい時だけ一般化し、同じレベルか、現在のレベルより小さい時は一般化しないようにします。

```ocaml:
    | TVar {contents = Unbound(name,l)} when l > !level -> QVar name
```

typeofのletの箇所に、enter_level(),leave_level()を加え現在のレベルを更新します。

```ocaml:
    | Let (x,e,e2) ->
      enter_level();
      let te = typeof env e in
      leave_level();
      typeof (M.add x (gen te) env) e2
```

これで完成です。
型推論器を作る(4) レミの多相型型推論①一般化とインスタンス化


```ocaml:
| QVar of string
```
定量化型の型をまず追加します。


次に、一般化関数を作ります。一般化は型変数をQVarに変更します。

    gen関数は型の一般化を行います。
    再帰的にTVar{contents =Unbound name}をQVar name に置き換えます。

```ocaml:
  let rec gen (t:t) : t =
    match t with
    | TVar {contents = Unbound(name,l)} -> QVar name
    | TVar {contents = Link t} -> gen t
    | TArrow(t1,t2) -> TArrow(gen t1, gen t2)
    | t -> t
```

    instは型のインスタンス化を行います。
    具体的には、QVar nameは 新しい newvar()にします。
    既にインスタンス化された、nameがある場合はそれを使います。

```ocaml:
  let inst (t:t) : t =
    let rec loop subst = function
    | QVar name ->
      (try
        (subst, M.find name subst)        
      with
      | Not_found ->
        let tv = newvar () in
        (M.add name tv subst, tv)
      )
    | TVar{contents=Link t} ->
      loop subst t
    | TArrow(t1,t2) ->
      let (subst,t1) = loop subst t1 in
      let (subst,t2) = loop subst t2 in
      (subst, TArrow (t1,t2))
    | t -> (subst, t)
    in snd (loop M.empty t)
```

typeofのLetの場合に、型環境に型を保存する場合は一般化してから保存します。

```ocaml:
    | Let (x,e,e2) ->
      let te = typeof env e in
      typeof (M.add x (gen te) env) e2
```

typeofの環境から型を取得する場合はインスタンス化を行います。

```ocaml:
    | Var x -> inst (M.find x env)
```

こうすることで、型環境は一般的な型が保存された状態になり、同じ関数を呼び出した場合の２つの別の型は、別な物として扱えるようになります。

これを使うメリットは、λx.x という受け取った値をそのまま返す関数に適用した型が場合によって違う場合等でうまく動作させる為の仕組みですが、まだ完全ではないので次回はバグを潰して完全な物にします。
型推論器を作る(3) 単相の型推論②出現チェック


前回のunifyでは、型のコピーを取りました。その型のコピーがもしも、自分自身の型だったら、型が循環して場合に寄ってはコンパイラが止まらなくなってしまうかもしれません。
そこで、型をコピーする前に型が自分の中に含まれていないかをチェックします。
それが、occurs checkです。

```ocaml:
  let rec occurs (tvr: tv ref) (t:t):unit =
    match t with
    | TVar tvr' when tvr == tvr' -> failwith "occurs check"
    | TVar({contents = Link t}) -> occurs tvr t
    | TArrow(t1,t2) -> occurs tvr t1; occurs tvr t2
    | _ -> () 
```

実装は上記のように簡単です。型tの中身が型変数でかつ自分自身なら例外を投げます。
Linkならその中身をチェックし直します。
関数の型なら再帰的にチェックします。

この作成した出現チェック関数をunifyに組み込めば、出現チェックがうまく動作するようになります。

```ocaml:
    | (TVar({contents=Unbound _} as tv), t)
    | (t, TVar({contents=Unbound _} as tv)) ->
      occurs tv t';
      tv := Link t
```