OmniAICreator/Qiita-1.07M huggingface dataset:
DockerでGAE開発環境に外部からアクセスするとき注意点

OSを再インストールしたので、開発環境がまっさらになってしまいました。
Windows環境なのでRubyとかPythonとか入れるの色々面倒なので、HerokuやGAE向けの開発環境自体をDockerベースで作れんかなと思ってはまったときの注意点

結論から書くとDocker上でGAEを扱うときは

```bash
root@..:/# goapp serve --host=0.0.0.0 /app
```

みたいな感じで

```
--host=0.0.0.0
```
をちゃんと指定しましょう。そうしないとDockerコンテナ上以外からアクセスできません。

Dockerおよびboot2docker/docker-machineを使っている場合、
forwardされてもlocalhost:8080になる訳ではなく、0.0.0.0になっています。

```
$ docker ps
CONTAINER ID        IMAGE                   COMMAND             CREATED             STATUS              PORTS                    NAMES
26e0e7b4eec5        koduki/dev-docker-gcp   "/bin/bash"         5 minutes ago       Up 5 minutes        0.0.0.0:8080->8080/tcp   gloomy_knuth
```

なので、--hostの指定をしておかないと、下記のようなエラーがでます。

```bash
$ curl http://192.168.99.100:8080
curl: (7) Failed to connect to 192.168.99.100 port 8080: Connection refused
```

ちなみにboot2docker上からはこう

```bash
$ docker-machine.exe ssh default
...

docker@default:~$ curl http://localhost:8080
curl: (52) Empty reply from server
```

なので、"--host=0.0.0.0"を指定すると接続先IPが変わるので下記のように正常なレスポンスになります。

```bash
$ curl http://192.168.99.100:8080
Hello, world!
```

最初ACLやSELinux系を疑ってたのですがGAEを使ったのが昔過ぎて、このオプションの存在を完全に失念してました。
結構、開発モードとプロダクションモードでこの辺の設定がことなるフレームワークは多いので、まず注意するべきポイントですね。

それではHappy Hacking!
Github Gist の main付きJavaコードを手軽にコンパイル＆実行する方法

# 手順

1.GitHub Gist で Java プログラムを登録する
2.登録した Gist の URL から GistID をコピーする

例）https://gist.github.com/xxxx/1234abcd5678 だと 1234abcd5678 が GistID

3.以下のURLにアクセスする（コピーしたGistIDをペースト）

https://jgist.herokuapp.com/(GistID)/(Javaファイル名）

例）https://jgist.herokuapp.com/85bbae2b72a2123f55ae95d2b00b2256/App.java

4.表示された画面で「Compile and Run」をクリック

![WS000000.JPG](https://qiita-image-store.s3.amazonaws.com/0/100918/6aa3653a-8d60-f9c2-21f2-d7340ca94948.jpeg)

gistコード（textarea）のコンパイル後、実行。System.out.println() などの出力は「STDOUT」欄に表示される。
コンパイルエラーがあれば「COMPILE (Errors or Warnings)」欄にエラーが表示される。


# Gistに登録する Javaプログラムの制限事項

- public static な main() 必須
- Public な gist のみ対象（Secret な gist は表示できません）

# その他

- 表示された Gist コードを編集して実行できます。
- rowsパラメータで表示されるtextareaの初期行数を指定することができます。
例）http://localhost:8891/85bbae2b72a2123f55ae95d2b00b2256/App.java?rows=20
質問サイトでの釣りに全力で釣られる意義について


先日質問サイトでの釣りネタについて自分も引っかかったので思うところを書きます。

# 背景
先日以下の記事がありました。

[レンタルサーバー業者、「rm -rf /」で誤って全サーバーのデータを削除](http://business.newsln.jp/news/201604151116100000.html)

結局は以下のように引っ掛け質問であり、私も釣られました。

[サーバ業者が" rm -rf / "で全サーバを誤消去、復旧法をQ&Aサイトに尋ねる。実は書籍執筆のための「引っ掛け問題」](http://japanese.engadget.com/2016/04/15/rm-rf-qanda/)

元々の質問は以下の内容です。

[Recovering from a rm -rf /](http://serverfault.com/questions/769357/recovering-from-a-rm-rf)
※現在は削除されています。

>I run a small hosting provider with more or less 1535 customers and I use Ansible to automate some operations to be run on all servers. Last night I accidentally ran, on all servers, a Bash script with a rm -rf {foo}/{bar} with those variables undefined due to a bug in the code above this line.
>All servers got deleted and the offsite backups too because the remote storage was mounted just before by the same script (that is a backup maintenance script).

現在以下にリダイレクトされています。
[Monday morning mistake: sudo rm -rf --no-preserve-root /](http://serverfault.com/questions/587102/monday-morning-mistake-sudo-rm-rf-no-preserve-root)

>Please note: The answers and comments to this question contains content from another, similar question that has received a lot of attention from outside media but turned out to be hoax question in some kind of viral marketing scheme. As we don't allow for ServerFault to be abused in such a way, the original question has been deleted and the answers merged with this question.

結局は"--no-preserve-root"のオプションを皆が知っているかを調べるための引っ掛けで、書籍執筆の為の調査だったようです。

# 今回の質問に対しどう判断したか

今迄の経験から以下の理由により、実際の障害の可能性は否定出来ないと判断していました。

* 重大障害でパニクってしまっている
* 守秘義務の為情報をフィルタしている
* 自分のバカな設定を公開すると突っ込みが入るから隠したい
* スクリプトの概要も無いので"rm -rf"以外のオプションを別で付与している場合や別の処理を行っている可能性がある
* 全部削除じゃなくて一部のファイルだけ削除された状態でどれが削除されたかも判断出来ないのでとりあえず全部削除されたとして聞いてみた

胡散臭い質問でも公開Q&Aサイトでは他の人が多数参照しているので参考になるなら答えてもいいかと思いますね。

# 自分ならどう答えるか

まずは今回答えた方達と同じように復旧手段を優先して答えます。
復旧後もしくは復旧を諦めた縮退状態で落ち着いた後に再現させない為の予防策の提案です。
世の中には運用の効率化とかの為にとんでもない設定とかしている方はいますので似たような障害に遭遇した事はあります。
どんなに馬鹿げた事象と思っても頭から否定は出来ないですね。

# 釣りと思われないように質問するには

自分が質問する時に釣りと思われたく無いなら以下を心掛けるといいと思います。

* OSバージョン等の環境は正確に伝える
* 実際にどういう事を行ったのかを順序だてて説明する
* 出来る限り生のデータを示す
* 関連する処理は出来る限り開示する
* 開示出来ないデータ、処理を隠した場合はどう隠したかはちゃんと伝える

はっきり言って自分より経験を積んだ人は世の中には沢山いるので下手に誤魔化してもばれます。
誤魔化していると思われると答えてくれる相手から信用してもらえずに答える価値も無いと思われるのでいいことありません。

# 今後
最初は出来る限り全力で釣られてあげます。
しかし釣った人に対しては今後は釣りをする人と見做して対応します。
それをネタにして他の人に参考になる手法とかの紹介とかディスカッションのネタにするのがいいのではないでしょうか。
Ansibleのフォルダ構成

# 環境
CentOS6.7 64bit

# フォルダ構成
基本的には以下のサイトの構成を参考にしています。
http://docs.ansible.com/ansible/playbooks_best_practices.html

現在は以下のようなフォルダ構成にしています。

    # Ansible設定ファイル
    ansible.cfg
    # インベントリファイル
    production
    development
    # インベントリファイルの各グループで使用する変数
    group_vars/
      project1
      project2
    # 各ホストで使用する変数
    host_vars/
      hostname1
      hostname2
    # メインPlaybook
    site.yml
    # 各プロジェクトのPlaybook
    project1.yml
    project2.yml
    # 共通で使用するルール
    roles/
      # 必ず行いたいルール
      common/
        tasks/
          main.yml
        handlers/
          main.yml
        templates/
          ***.conf.j2
        files/
          ***.txt
        vars/
          main.yml
      # オプションルール
      etc...
    # 各プロジェクトで使用するルール
    project_roles/
      project1/
      project2/

site.ymlは単純に各プロジェクトのPlaybookをincludeしています。

    ---
    - include: project1.yml
    #- include: project2.yml

各プロジェクトのPlaybookは以下のようにしています。

    ----
    - hosts: project1
      roles:
        - common
        - etc...
        - { role: ../project_roles/project1 }

project_rolesがrolesフォルダからの相対パスになるのが嫌なら
ansible.cfgのroles_pathにproject_rolesを追加します。

```
# additional paths to search for roles in, colon separated
roles_path    = project_roles
```
追加するとPlaybookにrolesフォルダ以下と同じように書くことが出来ます。

    ----
    - hosts: project1
      roles:
        - common
        - etc...
        - project1

# 実行

対象ディレクトリに移動して以下のコマンドで実行します。
```
ansible-playbook -i development site.yml
```
arduinoでhexdump

#概要
arduinoでhexdumpしてみた。
#写真
![hexdump.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/a2de9195-8b69-91c5-2878-53e0512a9535.jpeg)

#サンプルコード
```
char buf[68];
void hexdump(char * buf0, uint16_t len)
{
	static const char hexdigits[] = "0123456789abcdef";
	char str[68];
	uint16_t i;
	if (!len) return;
	for (i = 0; i < len; i++)
	{
		str[((i % 16) * 3) + 0] = hexdigits[buf0[i] >> 4];
		str[((i % 16) * 3) + 1] = hexdigits[buf0[i] & 0xf];
		str[((i % 16) * 3) + 2] = ' ';
		str[(i % 16) + 49] = isprint(buf0[i]) ? buf0[i] : '.';
		if ((i + 1) % 16 == 0)
		{
			str[47] = ' ';
			str[48] = ' ';
			str[65] = '\0';
			sprintf(buf, "%s", str);
			Serial.println(buf);
			str[0] = ' ';
		}
	}
	if (i % 16 > 0)
	{
		uint16_t j;
		for (j = (i % 16); j < 16; j++)
		{
			str[(j * 3) + 0] = ' ';
			str[(j * 3) + 1] = ' ';
			str[(j * 3) + 2] = ' ';
			str[j + 49] = ' ';
		}
		str[47] = ' ';
		str[48] = ' ';
		str[65] = '\0';
		sprintf(buf, "%s", str);
		Serial.println(buf);
	}
}
void setup()
{
	char * src = "<0x0000>0123456789abcdefgEFGHIJK!$%&'()";
	Serial.begin(115200);
	Serial.println("start");
	hexdump(src, 39);
	Serial.println("end");
}
void loop()
{
}

```
karma-browserify と tsify を使ってテストしたいけど tsconfig.json 書きたくないって時にどこに設定書くか。

# karma-browserify 使って typescript テスト
かなり限定的だけど、typescript でコード書いて、browserify でコードくっつけてる時に、テスト書きにくい。

そんな時、karma-browserify と tsify 使えばハッピーになるんだけど、
まれにコンパイルの設定をテストと本番で別にしたくて、
tsconfig.json 書きたくないわーってなる時がある。　あるよね？

そんな時、tsify に設定をどうやって流し込むかって話。

## 普通に設定を tsconfig.json に書くとき

```js:karma.conf.js
(省略)
    frameworks: ['browserify','jasmine'],

    files: [
        'spec/dir/**/*.ts'
    ],

    preprocessors: {
      'spec/dir/**/*.ts': ['browserify']
    },

    browserify: {
      extensions: ['.ts'],
      plugin: ['tsify']
（省略）
```

関係あるところ抜き出すとこんな感じ。
同じディレクトリに tsconfig.json を置いておくと、 tsify は勝手にそれを読んで
良い感じにしてくれる。

設定を外に出すのは良いことだし、推奨は多分そのやり方なんだけど、
tsconfig.json で一括に設定したくないって時は個別に設定必要がある。

## karma.conf.js 内にコンパイル設定を書くとき


```js:karma.conf.js
(省略)
    frameworks: ['browserify','jasmine'],

    files: [
        'spec/client/**/*.ts'
    ],

    preprocessors: {
      'spec/client/**/*.ts': ['browserify']
    },

    browserify: {
      extensions: ['.ts'],
      configure: function (bundle) {
        bundle.on('prebundle', function () {
          bundle.plugin('tsify', {target: 'ES5'})
        })
      }
    },
（省略）
```

つまり、 browserify に書いてた plugin を configure で書き換えちゃったらええね。
今回は `target:'ES5'` だけ設定してるけど、他の値も設定出来ると思う。
# ITエンジニアのための機械学習理論入門（第4章）


## パーセプトロン：分類アルゴリズムの基礎

### パーセプトロンについて
 * パーセプトロンはある分類問題があるとき、その分類問題を重み付きの線形関数を用いて分類する手法
    * 与えられた重み付きの線形関数を最適化し、分類の成否により定義された誤差関数を最小化する（たぶん）
    * 重み付き線形関数にデータセットをぶち込んで、予め定義された基準によりクラスを決定
        * 例えば線形関数の出力が正なら1、負なら-1とか
 * 例えば2変数の線形関数なら以下のように表現できる

 ```math
 f(x)=w_0x_0 + w_1x_1 + w_2
 ```

 * ここで最適化するのは関数についている重み
     * 機械学習ではここらへんのことを学習というっぽい
         * 個人的には最適化って言いたい感じある
 * 例えば分類するときにその分類する関数をパーセプトロンによって学習させて求めていく
 * どうやって最適なパラメータを決めるとか、誤差関数をどうするかとかはまた別に決められる
     * 最適化には進化計算とか、古典的な最適化アルゴリズムとか
     * ぼくに言いやすい形だと誤差関数はもはや目的関数よね
     * 重みにはバイアス項と呼ばれる定数項がある
         * ここは人によりデータを見てチューニングするのが望ましい
 * もっと難しい概念だと思っていた（語感的に）けどわかりやすかった
 * この本では重みの最適化部分を確率的勾配降下法で行う
     * ここについて書くかは微妙だけどせっかくなので後述していく
 * パーセプトロンを幾何学的に解釈するとかあったけど割愛

### 確率的勾配降下法
 * よくある現在の地点からの勾配をみて最適なパラメータを探していく最適化アルゴリズム
     * 任意の点が与えられた時に目的関数を偏微分することにより得られる勾配ベクトルを計算
     * 得られた勾配ベクトルを現在の設計変数（上記で言うところの重み）に対して差分することで更新（以下式のように）
         * いまよりもっとも勾配が逆にきつい方向に進んでいく
     
     ```math
     w_{new}=w_{old}-\nabla E
     ```
 * これを用いてパーセプトロンの線形関数を最適化するなら、探索するパラメータは重みになる
    * また勾配は分類が失敗しているデータの変数値を重みに足し合わせる形？
        * ちょっと自信ない
        * ここ自体にも学習率のパラメータをつける資料もあったりなかったり
Ansibleの構築

# 環境
CentOS6.7 64bit

# インストール
CentOS6.7の標準リポジトリにはAnsibleがない為、
EPELリポジトリをインストールします。

```
yum install epel-release
```

EPELリポジトリを他のライブラリのインストールに使用しない場合は以下のコマンドを実行します。

```
sed -i -e 's/enabled *= *1/enabled=0/g' /etc/yum.repos.d/epel.repo
```

Ansibleをインストールする。

```
yum install ansible
or
yum --enablerepo=epel install ansible <- EPELリポジトリのenabledを0にした場合
```

# 設定ファイル
Ansibleをインストールすると/etc/ansibleに以下のファイル、フォルダが作成されます。

```
hosts <- 管理ホストのインベントリファイル
ansible.cfg <- Ansible設定ファイル
role <- ルールフォルダ
```

## hosts
Ansibleの対象ホストを記載するファイルです。
環境変数(ANSIBLE_HOSTS)やAnsible設定ファイル等で
他の場所のhostsファイルを読み込む事もできます。
hostsファイルは以下の様に記載します。

```
test.example.com
# グループで指定する場合
[webservers]
test1.example.com
test2.example.com
test[1:2].example.com <- test1.example.com, test2.example.comと同様

# IPアドレスでも可能
[databases]
192.168.0.1
192.168.0.2
```

## Ansible設定ファイル
Ansibleの設定ファイルは他の場所に設置する事も可能です。
Ansibleの設定ファイルは以下の順番で読み込みます。
(各場所に設定ファイルが存在しても優先順位が高い設定ファイルの設定が適用されます。)

```
[優先順位:高]
ANSIBLE_CONFIG
ansible.cfg <- カレントディレクトリ
.ansible.cfg <- ホームディレクトリ
/etc/ansible/ansible.cfg
[優先順位:低]
```

# 実行
ansibleかansible-playbookを使用して実行します。
## ansible
ansibleで実行する場合は以下のようにします。
[例]httpdをスタートする。
```
ansible localhost -m service -a "name=httpd state=started"
```

## ansible-playbook
実行したいタスクのPlaybooksを作成します。
[Playbooks(httpd.yml)]

    ---
    - hosts: localhost
      tasks:
      - name: Start httpd
        action: service name=httpd state=started
ansible-playbookの引数にPlaybooksを選んで実行します。
[例]httpdをスタートする。
```
ansible-playbook httpd.yml
```
Eclipse 4.6 Neon で High DPI対応 された

今時のノートPCは高解像度（High DPI)があたりまえとなって久しいわけですが、相変わらずWindows系のソフトは対応がおくれていました。Eclipseなんかもその1つなわけですが、苦節数年ようやくまともにHigh DPI対応されそうな予感です。

以下、4.6M6のリリースノートですが、「SWT provides resolution-based auto-scaling」がサポートされたようです。
http://www.eclipse.org/eclipse/news/4.6/M6/

ダウンロードは以下からできます。
https://eclipse.org/downloads/index-developer.php?neon

注意事項として、
 * 起動にJava8が必要、複数のJVM入れているひとはeclipse.iniを修正する。
 * ワークスペースに互換がない。既存のワークスペースを指定すると警告がでてくる。後方互換はないっぽいので注意。

以下、スクリーンショット例。奥が4.5 Mars で、手前が4.6 Neonです。

![2016-04-17 09_41_56-Java EE - Eclipse.png](https://qiita-image-store.s3.amazonaws.com/0/50166/f7a01c41-dfac-28b0-ed9d-f0bc78913306.png)
WWW2016読みたい論文


* Social Networks Under Stress
* Measuring Urban Social Diversity Using Interconnected Geo-Social Networks
* Immersive Recommendation: News and Event Recommendations Using Personal Digital Traces
* Hidden Topic Sentiment Model
* Visualizing Large-scale and High-dimensional Data
* Latent Space Model for Multi-Modal Social Data
* Modeling a Retweet Network via an Adaptive Bayesian Approach
* On Sampling Nodes in a Network
* Do Cascades Recur?
* Exploring Limits to Prediction in Complex Social Systems
* TribeFlow: Mining & Predicting User Trajectories
* Linking Users Across Domains with Location Data: Theory and Validation
* PCT: Partial Co-Alignment of Social Networks
* What Links Alice and Bob? Matching and Ranking Semantic Patterns in Heterogeneous Networks
* N-gram over Context
* The Effect of Recommendations on Network Structure
* Learning-to-Rank for Real-Time High-Precision Hashtag Recommendation for Streaming News
* Discovery of Topical Authorities in Instagram
* Joint Recognition and Linking of Fine-Grained Locations from Tweets
* From Freebase to Wikidata: The Great Migration
ICWSM2016読みたい論文


* Distinguishing between Topical and Non-Topical Information Diffusion Mechanisms in Social Media 
* Sentiment-Based Topic Suggestion for Micro-Reviews 
* Your Age Is No Secret: Inferring Microbloggers' Ages via Content and Interaction Analysis 
* TiDeH: Time-Dependent Hawkes Process for Predicting Retweet Dynamics 
* Dynamic Data Capture from Social Media Streams: A Contextual Bandit Approach 
* What the Language You Tweet Says about Your Occupation 
* Emotions, Demographics and Sociability in Twitter Interactions 
* Tracking Secret-Keeping in Emails 
* Understanding Anti-Vaccination Attitudes in Social Media 
* The Status Gradient of Trends in Social Media 
* When a Movement Becomes a Party: Computational Assessment of New Forms of Political Organization in Social Media 
* The Dynamics of Emotions in Online Interaction 
* Cross Social Media Recommendation 
* Predictability of Popularity: Gaps between Prediction and Understanding
* Who Did What: Editor Role Identification in Wikipedia 
* Aligning Popularity and Quality in Online Cultural Markets 
* Lost in Propagation? Unfolding News Cycles from the Source 
* Power Imbalance and Rating Systems 
* TweetGrep: Weakly Supervised Joint Retrieval and Sentiment Analysis of Topical Tweets
よく使うemacsのショートカット

以前、以下記事を書きました。他の方に説明するために残しておきます。
[よく使うvimのショートカット](http://qiita.com/kaikusakari/items/a734634efef851fd6f3f)

最近、私の周りではemacsを利用する人はほとんどいません。私はvimより、emacsが好きなので、利用しています。私がよく利用する環境などでは、大体事前にインストールされておらず、自身でインストールする必要があります。

#環境

emacsをインストールしている環境

```sh
[Heka@emacs ~]$ cat /etc/redhat-release 
CentOS Linux release 7.2.1511 (Core)

[Heka@emacs ~]$ which emacs
/usr/bin/emacs

[Heka@emacs ~]$ yum list installed | grep emacs
emacs.x86_64                          1:24.3-18.el7                   @base     
emacs-common.x86_64                   1:24.3-18.el7                   @base     
emacs-filesystem.noarch               1:24.3-18.el7
```

**ctrl + s**
インクリメンタルサーチ。文字挿入ごとにリアルタイム検索します。ファイル先頭から候補に移動します。同じコマンド（ctrl + s)を押下すれば、次候補に飛びます。 前候補に戻る場合はctrl + rです。

```el
I-search:
```
**ctrl + v**
ページ送り。1ページ下に移動します。大きな設定ファイルや、ログ閲覧時に。ページ戻しは、ESC + vです。

**ESC + <**
ファイルの先頭に戻る。ファイルの末尾に移動する場合はESC + >です。

**ctrl + k**
カーソル以降を切り取ります。行の先頭で実施すれば行を切り取ります。個人的には、よく利用します。

**ctrl + y**
貼り付け。

**カーソルの移動は、シェルと似ている**
ctrl + a 行の先頭に移動
ctrl + e 行の末尾に移動
ctrl + d カーソル上の1文字を削除

**ctrl + x → 4 → f → ファイル名**
先輩が利用していて、私がemacsを利用するきっかけとなったもの。画面を分割して、分割した画面に、別ファイルを読み込みます。あるファイルを編集していて、別ファイルを確認したくなった時に利用します。（別ウィンドウ挙げろと言われれば、その通りですが笑）

**ctrl + x → b**
バッファのファイルにアクセスする。emacsは複数のファイルを同時に編集でき、1つのファイルを編集している時、バッファと呼ばれるバックエンドにファイル状態を保持できます。このコマンドで編集するファイルを切り替えます。

**ctrl + x → ctrl + b**
バッファの一覧を画面分割して表示する。個人的にはあまり好きなコマンドではありません。

**ESC + x → shell**
emacs内でシェル起動。利用制限があるらしい（そもそもbashじゃない？）

emacsでファイルを編集すると、バックアップファイル、自動保存ファイルを作成します。emacsを利用する場合、以下のようなファイルが作られます。
「test.txt~」
「#test.txt#」

ユーザのホームディレクトリに、設定ファイルを作成して、無効にしておくのが良いです。（このファイルに救われたことはありませんが、もしものためにとっておくのもありかと存じます。）

**「emacs」というユーザの場合**

```emacs:/home/emacs/.emacs
;バックアップファイル作成しない
(setq make-backup-files nil)
;自動保存ファイル作成しない
(setq auto-save-default nil)
```
EMRのBootstrapActionをMasterノードだけ実行する #aws #emr

EC2インスタンスのユーザデータに持っている `isMaster` を利用する。

```sh
#!/bin/bash -ex

if [ $(curl -s http://169.254.169.254/latest/user-data/ | jq .isMaster) == "true" ]; then
  echo Masterノードのみ実行する処理...
fi
```
Fink で update-all に失敗する場合

久しぶりに update-all をすると、エラーが出ることがあります。

```
$ fink update-all
Scanning package description files..........
Information about 9649 packages read in 1 seconds.
The following 3 packages will be installed or updated:
 gdal-shlibs netcdf-c7 netcdf-c7-shlibs
The following 4 additional packages will be installed:
 hdf5.9 hdf5.9-bin netcdf-bin netcdf-c11-shlibs
Default answer will be chosen in 60 seconds...
Do you want to continue? [Y/n] 
Reading buildlock packages...
/sw/bin/dpkg-lockwait -i /sw/fink/dists/stable/main/binary-darwin-x86_64/sci/hdf5.9_1.8.14-2_darwin-x86_64.deb /sw/fink/dists/stable/main/binary-darwin-x86_64/sci/hdf5.9-bin_1.8.14-2_darwin-x86_64.deb
dpkg: considering removing hdf5.10 in favour of hdf5.9 ...
dpkg: yes, will remove hdf5.10 in favour of hdf5.9.
dpkg: considering removing hdf5-cpp11 in favour of hdf5.9 ...
dpkg: yes, will remove hdf5-cpp11 in favour of hdf5.9.
dpkg: regarding .../hdf5.9_1.8.14-2_darwin-x86_64.deb containing hdf5.9:
 hdf5-bin conflicts with hdf5.9
  hdf5.9 (version 1.8.14-2) is to be installed.
/sw/bin/dpkg: error processing /sw/fink/dists/stable/main/binary-darwin-x86_64/sci/hdf5.9_1.8.14-2_darwin-x86_64.deb (--install):
 conflicting packages - not installing hdf5.9
dpkg: considering removing hdf5-bin in favour of hdf5.9-bin ...
dpkg: no, cannot remove hdf5-bin (--auto-deconfigure will help):
 hdf5-cpp11 depends on hdf5-bin
  hdf5-bin is to be removed.
dpkg: regarding .../hdf5.9-bin_1.8.14-2_darwin-x86_64.deb containing hdf5.9-bin:
 hdf5.9-bin conflicts with hdf5-bin
  hdf5-bin (version 1.8.16-2) is installed.
/sw/bin/dpkg: error processing /sw/fink/dists/stable/main/binary-darwin-x86_64/sci/hdf5.9-bin_1.8.14-2_darwin-x86_64.deb (--install):
 conflicting packages - not installing hdf5.9-bin
Errors were encountered while processing:
 /sw/fink/dists/stable/main/binary-darwin-x86_64/sci/hdf5.9_1.8.14-2_darwin-x86_64.deb
 /sw/fink/dists/stable/main/binary-darwin-x86_64/sci/hdf5.9-bin_1.8.14-2_darwin-x86_64.deb
### execution of /sw/bin/dpkg-lockwait failed, exit code 1
Failed: can't batch-install packages: /sw/fink/dists/stable/main/binary-darwin-x86_64/sci/hdf5.9_1.8.14-2_darwin-x86_64.deb /sw/fink/dists/stable/main/binary-darwin-x86_64/sci/hdf5.9-bin_1.8.14-2_darwin-x86_64.deb
```

これは、二つのパッケージ　(hdf5 と hdf5.9) が、同じファイルを提供するため、コンフリクトするというエラーです。

いったん、両方アンインストールします。

`fink remove --recursive hdf5-bin hdf5.9-bin`

update-all では、すべてのパッケージとすべての依存パッケージをインストールしようとするため、上のようなコンフリクトが発生します。

このため、一つずつパッケージを更新します。

`fink install gdal-shlibs`

`fink install netcdf-c7`

途中でエラーが出たら、再び

`fink remove --recursive hdf5-bin hdf5.9-bin`

を実行して続けます。
技術英語 > Oil spewed 50 feet into the night sky and gushed [for eight days straight], filling almost 100,000 barrels a day. / three times in a row

@ LOE > March 28, 2003
http://loe.org/shows/shows.html?programID=03-P13-00013
> Oil spewed 50 feet into the night sky and gushed <font color=red>for eight days straight</font>, filling almost 100,000 barrels a day.

http://eow.alc.co.jp/search?q=for+days+straight&ref=sa
> ＿日間連続で

<hr>
関連して思い出したのは

> three times in a row

http://eow.alc.co.jp/search?q=in+a+row
> 2. 連続して、連続的に、続けて、立て続けに、続けざまに
Railsのdefault_scopeをどうしても使いたい時

# サマリ

- default_scopeは便利
- default_scopeは安直につかうとメンテ性が悪くなる
- それでもdefault_scopeを使いたい

というときに、メンテ性を下げずにdefault_scopeを使う

(環境: Rails 4.2.5.1)

# 前提

## default_scopeについて
ActiveRecordには、すべてのクエリに追加で絞り込みやorderを指定する `default_scope` という機能がある。

例えば、以下の例では、「disabled:trueなitemは常に除外する」という用例。

```rb
# app/models/item.rb
class Item < ActiveRecord::Base
  default_scope { where(disabled: false) }
end

# itemsテーブルに id: 1, disabled: true なデータがあるとき
Item.find(1) # raises ActiveRecord::RecordNotFound
```

## default_scopeが良くないとされる理由
最初どんなに「disabledなデータは絶対にクエリ検索結果から除外して大丈夫だ」と思っていたとしても、それは最初だけです。
例えば、管理画面からの呼び出しでは、disabledのチェックをつけ消しする必要があり、そうするとdisabledなデータも返さなければいけなくなります。

そのようなときは一応 `unscope` を使うとdefault_scopeを解除することができます。が、いかにもスパゲッティーコードが作られる臭いしかしませんね。

詳しくは触れませんが、[http://stackoverflow.com/questions/25087336/why-is-using-the-rails-default-scope-often-recommend-against
](このstackoverflow)での回答は的を射ていると思います。

## それでもdefault_scopeを使いたい理由
defaultではない通常のscopeを使うことももちろん可能。

```rb
class Item < ActiveRecord::Base
  scope :active, -> { where(disabled: false) }
end
```

しかし、最初の例では、管理画面以外のすべてのコードで disabledなItemの存在は消したいと考えていて、もしかしたら95%以上のコードではこのscopeを使うかもしれない。
そうすると毎度scopeをつけるのは面倒だったり、つけ忘れる危険性がある。

# 対処法

Itemにはdefault_scopeを適用せず、
新しいモデル ActiveItem を作り、そこにdefault_scopeを適用する。

その上で、最初の例で言えば、
管理画面からはItem、それ以外のほとんどすべてのコードではActiveItemを使う。

ActiveItem の作り方は以下の2つ

### 1. 普通にActiveRecord::Baseを継承し、テーブル名を指定

```rb
class ActiveItem < ActiveRecord::Base
  self.table_name = 'items'
  default_scope { where(disabled: false) }
end
```

### 2. Itemを継承

追記: これだとSingle Table Inheritanceの扱いになってしまうので別の方法をとる必要がある
(コメント欄)
後ほどきちんと調査して修正します。

```rb
class ActiveItem < Item
  default_scope { where(disabled: false) }
end
```

### 1と2どっちがいいのか?

ドメインモデル的に考えると、継承する必要はないので、1のほうが良いと思う。
一方でDBとつなぐメソッドはだいたい両方で使いたくなる気がするので、継承したほうが楽。
DBとつなぐメソッドが多い or むしろドメインモデルはActiveRecordと別に分ける(最もかっちり) 場合は2を採用すれば良いかも。
備忘録 正規表現でエスケープが必要な文字

備忘録
(JSの)正規表現でパターンに含める場合、エスケープしないといけない文字
ネタ元は[こちら](http://stackoverflow.com/questions/2021053/finding-plus-sign-in-regular-expression)

###必ずエスケープしなければならない文字

```js
'-' '.' '/' '[' ']' '\'  
```



###\[ \](文字集合)外ではエスケープしなければならないが\[ \]内ではエスケープ不要な文字

```js
'*' '+' '?' '(' ')' '{' '}' '|' 
```
Table Enhancer for Confluenceの使い方

### このソフトのウリ
----
Confluence標準の表では対応できない、ソートや合計値の計算を実現できる。


### 基本情報
----
- ソフト名: Tableenhancer for Confluence
- 開発元: TNG Technology Consulting GmbH
- 価格: 無料
- Web: https://tngtech-oss.atlassian.net/wiki/display/TABENH

### 普通に表を作った場合
----
セルに色を塗ったり、一番左にナンバリング列を追加するくらいしかできない。
![Table_Enhancer_for_Confluenceのテスト_-_IT_-_Confluence.png](https://qiita-image-store.s3.amazonaws.com/0/77022/a0bac8a6-be1a-74b1-c2d4-2c606f9c71ff.png)

### Table Enhancerを使用した場合
----
まず、Table Enhancerマクロを挿入して、その中に普通の表をつくる。以下の機能をONにしてみた。

- 合計の自動計算
- 金額列で降順にソート
- ソート後にナンバリング
- ナンバリング列の背景は右セルに合わせる

編集中は普通の表と同じに見えるが…
![Table_Enhancer_for_Confluenceのテスト_-_IT_-_Confluence.png](https://qiita-image-store.s3.amazonaws.com/0/77022/67c43ef9-568d-adce-2b71-06852bad85dc.png)

保存すると、表がしっかりと更新されている。
![Table_Enhancer_for_Confluenceのテスト_-_IT_-_Confluence.png](https://qiita-image-store.s3.amazonaws.com/0/77022/e77ef0d3-2b21-4d16-6e87-73d6cc5bf8d1.png)

(動作確認には Confluence 5.9.8を使用しました)
headerをposition fixedした時に同一ページ内のリンクがずれる

headerをfixedでTOPに固定した際に、同一ページへのリンクを設定すると、headerの高さ分だけスクロールがずれてしまう。

```sample.js

$(function(){
  var headerHeight = $('header').height();
  $('a[href^=#]').on('click',function(){
    var href = $(this).attr('href');
    var target = $(href == '#' || href == '' ? 'html' : href);
    var position = target.offset().top - headerHeihgt;
    $('html,body').animate({scrollTop:position}, 550, 'swing');
    return false;
  });
});
```

これで解決。
[Bash] ダブルクォートで囲んだコマンド置換中で!を使うとエラーになる（例: echo "$(echo '!')"）

こうなる。

```bash
$ echo "$(echo '!')"
bash: !': event not found
```

# 何が起きているのか
Bashにはヒストリ展開という機能がある。
この機能によって、コマンド中の`!foo`のような文字列は、実行したことのある`foo`から始まるコマンドの中で最も最近のものに置き換えられる。
例えば、以下は`!t`が`t`から始まる最近のコマンドに置き換えられ、`!c`が`c`から始まる最近のコマンドに置き換えられた例。

```bash
$ touch empty.txt
$ cat empty.txt
$ echo !t !c
echo touch empty.txt cat empty.txt
touch empty.txt cat empty.txt
```

実はこのヒストリ展開は非常に早いタイミングで行われる。
つまり、ダブルクォーテーションで囲まれた文字列では、コマンド置換よりも先にヒストリ展開が発生してしまう。

```bash
echo "$(echo '!')"
```

この場合、Bashはなんと`!'`の部分を、実行したことのある`'`から始まるコマンドの中で最も最近のものに置き換えようとする。
そのようなコマンドは今までに実行したことがないのでエラーになる。

# 対処法

1. ヒストリ展開を一時的に無効化する

```bash
$ set +H
$ echo "$(echo '!')"
!
$ set -H
```

‌2. zshを使う

```zsh
% echo "$(echo '!')"
!
```

# おまけ: 詳しい挙動（の仮説）

Bashの処理の流れは厳密にはおそらく[^1]次のようになっている。
[^1]: 詳しく解説したページが見つからなかったので挙動から逆算したが、多分不正確な説明になっていると思う

‌1. `|`、`&`、`;`、`(`、`)`、`<`、`>`、スペース、タブで入力行を区切ってトークンのリストを作る。
ただし`'`か`"`でクォートされている部分は一塊のトークンになる。

> `echo "$(echo '!t ')"`
> ↓
> `echo`, ` `, `"$(echo '!t ')"`

> `echo $(echo "!t")`
> ↓
> `echo`, ` `, `$`, `(`, `echo`, ` `, `"!t"`, `)`

‌2. `'`でクォートされたトークンを除き、トークンの文字列中からヒストリ展開可能な部分文字列をヒストリ展開する。

> `echo`, ` `, `"$(echo '!t ')"`
> ↓
> `echo`, ` `, `"$(echo 'touch empty.txt ')"`

> `echo`, ` `, `$`, `(`, `echo`, ` `, `"!t"`, `)`
> ↓
> `echo`, ` `, `$`, `(`, `echo`, ` `, `"touch empty.txt"`, `)`

‌3. コマンド置換などの通常の置換を実行する。

> `echo`, ` `, `"$(echo 'touch empty.txt ')"`
> ↓
> `echo`, ` `, `'touch empty.txt '`

> `echo`, ` `, `$`, `(`, `echo`, ` `, `"touch empty.txt"`, `)`
> ↓
> `echo`, ` `, `'touch'`, ` `, `'empty.txt'`

なので、以下の例の場合はヒストリ展開が起こらない。

```bash
echo '!'
echo $(echo '!')
```

以下の例でも、`!`だけではヒストリ展開可能な文字列にならないので、ヒストリ展開が起こらない。

```bash
echo !
echo "!"
echo $(echo "!")
```

以下の例の場合はヒストリ展開が起こる。

```bash
echo !t            # !tで展開
echo "!t"          # !tで展開
echo $(echo "!t")  # !tで展開
echo "$(echo "!")" # !"で展開
echo "$(echo '!')" # !'で展開
```

# 参考リンク

[bash - How to escape history expansion exclamation mark ! inside a double quoted " command substitution like "$(echo '!b')"? - Stack Overflow](http://stackoverflow.com/questions/22125658/how-to-escape-history-expansion-exclamation-mark-inside-a-double-quoted-comm)
Visual Studio Code のインストーラ

いやね、Visual Studio Code も正式リリースなので、Win版のインストーラをダウンロードしてインストールしてみたんだけど、インストーラの UI が InnoSetup で作った感じがしなくもない。
いやいや、あの Microsoft ですよ。 WiX も OSS なんだし、InnoSetupを使うなんてありえないでしょ。

ありえました。

```registry
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{F8A2A208-72B3-4D61-95FC-8A65D340689B}_is1]
"Inno Setup: Setup Version"="5.5.6 (u)"
"Inno Setup: App Path"="C:\\Program Files (x86)\\Microsoft VS Code"
"InstallLocation"="C:\\Program Files (x86)\\Microsoft VS Code\\"
"Inno Setup: Icon Group"="Visual Studio Code"
"Inno Setup: User"="kishi"
"Inno Setup: Selected Tasks"="desktopicon,addtopath,runcode"
"Inno Setup: Deselected Tasks"="addcontextmenufiles,addcontextmenufolders"
"Inno Setup: Language"="japanese"
"DisplayName"="Microsoft Visual Studio Code"
"DisplayIcon"="C:\\Program Files (x86)\\Microsoft VS Code\\Code.exe"
"UninstallString"="\"C:\\Program Files (x86)\\Microsoft VS Code\\unins000.exe\""
"QuietUninstallString"="\"C:\\Program Files (x86)\\Microsoft VS Code\\unins000.exe\" /SILENT"
"DisplayVersion"="1.0.0"
"Publisher"="Microsoft Corporation"
"URLInfoAbout"="https://code.visualstudio.com/"
"HelpLink"="https://code.visualstudio.com/"
"URLUpdateInfo"="https://code.visualstudio.com/"
"NoModify"=dword:00000001
"NoRepair"=dword:00000001
"InstallDate"="20160417"
"MajorVersion"=dword:00000001
"MinorVersion"=dword:00000000
"EstimatedSize"=dword:0001d2c8
```

小さい事だけど、世の中どんどん変化しているんだなと実感。
Eclipse Mars(4.5) NoClassDefFoundError ポップアップの回避方法

![20160417_eclipse_NoClassDefFoundError_01.png](https://qiita-image-store.s3.amazonaws.com/0/89680/7755f98c-cc35-483b-9fbb-4fc213a50f90.png "20160417_eclipse_NoClassDefFoundError_01.png")

# バージョン

Version: Mars Release (4.5.0)
Build id: 20150621-1200

# 事象

恐らくプラグインインストールの影響かと思いますが、
何かの拍子に Eclipse を操作しているとエラーがポップアップされるようになりました。

![20160417_eclipse_NoClassDefFoundError_02.png](https://qiita-image-store.s3.amazonaws.com/0/89680/bb2b1962-7a14-9f90-a758-752b01a936ba.png "20160417_eclipse_NoClassDefFoundError_02.png")

- エラーログ

```
!ENTRY org.eclipse.jface 4 2
!MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.jface".
!STACK 0
java.lang.NoClassDefFoundError: org/eclipse/core/internal/expressions/DefaultVariable
        at org.eclipse.core.internal.expressions.IterateExpression.evaluate(IterateExpression.java:160)
・・・略・・・
```

# 回避策

フォーラムに同様の事象が上がっていました。
現時点での最新版は4.5.2なのでまだ解消されていないようです。

- [Eclipse Community Forums: Eclipse Platform » Error Log - Problem occurred when invoking org.eclipse.ui.navigator](https://www.eclipse.org/forums/index.php/t/510182/)

> select Customize View, and clear the Java output folder option.

## フィルタオプションの変更

1) Project Explorer -> CustomizeView

![20160417_eclipse_NoClassDefFoundError_03.png](https://qiita-image-store.s3.amazonaws.com/0/89680/61fecf31-33c6-0ef8-d4b3-d255d76b6e7b.png "20160417_eclipse_NoClassDefFoundError_03.png")

2) Java output folders -> OFF

![20160417_eclipse_NoClassDefFoundError_04.png](https://qiita-image-store.s3.amazonaws.com/0/89680/2fde89a7-76a0-e3d0-fa87-08ba09de7899.png "20160417_eclipse_NoClassDefFoundError_04.png")

3) Eclipse再起動

設定変更だけでは解消しませんでしたが、Eclipseを再起動することでポップアップが発生しなくなりました。

---
CentOS6 の git で error: 401

# 事象

CentOS6.7でgit cloneしようとすると401が発生します。

```
error: The requested URL returned error: 401 Unauthorized while accessing https://git.example.org/git/basic

fatal: HTTP request failed
```

# 暫定回避策

ユーザ名(とパスワード)をURLに含めると回避できます。

```
$ git clone https://_user:_pass@git.example.org/git/basic
```

# 原因

1.7.10以上でないと古いため発生するようです。

```
$ git --version
git version 1.7.1
```

- [Check your Git version](https://help.github.com/articles/https-cloning-errors/#check-your-git-version)

> There's no minimum Git version necessary to interact with GitHub, but we've found version 1.7.10 to be a comfortable stable version that's available on many platforms. You can always download the latest version on the Git website.

# 最新版の導入

## ダウンロード

[Git - Downloads](https://git-scm.com/downloads) の *Git source repository* から [Releases · git/git](https://github.com/git/git/releases) で最新版を取得します。

```
$ cd /usr/local/src/
$ sudo curl -L -O https://github.com/git/git/archive/v2.8.1.tar.gz
```

## インストール

[Git - Gitのインストール](https://git-scm.com/book/ja/v1/%E4%BD%BF%E3%81%84%E5%A7%8B%E3%82%81%E3%82%8B-Git%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB) の **ソースからのインストール** を参考にインストールを行います。  
公式手順には無いですが、perl-ExtUtils-MakeMaker も必要です。

```
# 前提パッケージインストール
$ sudo yum install curl-devel expat-devel gettext-devel   openssl-devel zlib-devel perl-ExtUtils-MakeMaker
# コンパイル
$ cd /usr/local/src/
$ sudo tar -zxvf v2.8.1.tar.gz
$ cd git-2.8.1/
$ sudo make prefix=/usr/local all
$ sudo make prefix=/usr/local install
```

最新版を使用できることを確認します。

```
$ . ~/.bash_profile
$ which git
/usr/local/bin/git
$ git --version
git version 2.8.1
```

# 最新版gitでリポジトリ操作の確認

URLにユーザ名(とパスワード)を含めなくとも実行できるようになります。

```
$ git clone https://git.example.org/git/basic
Username for 'https://git.example.org':
Password for 'https://_user@git.example.org':
```
運用における障害対応の基本 - システム障害といかに向き合い、チームとして対処するか

# はじめに
- システム開発をしていると、初期構築フェーズが終わった後に必ず保守・運用フェーズがやってくる。
- 本番運用をしているシステムで障害が発生した時に、いかに向き合い、対処するかという考え方とアクションをまとめた。
- これから運用を始めたばかりという方や、障害対応にあまり慣れていない方が対象。

# 障害とは何か
- システムにおける障害とはそもそも何か。
- 非常にざっくり分類すると、一般的には下図の黄色で塗りつぶしたところのどれかに該当すると思う。

![syogai_categories.001.png](https://qiita-image-store.s3.amazonaws.com/0/74350/aceaebde-3184-7a86-7fce-71bb6eaa0ac4.png)

- 何をもって障害とするか、はサービスやユーザーの性質により判断が分かれると思うが、**「エンドユーザーがサービスを利用する上で不都合を感じ、かつ、それがサービスプロバイダの想定外の事象であった場合」**とすることが多いのではないか。
- よくある話で、「これ障害だよね？」「いえ、仕様です」という会話が生まれることがある。入力に対して適切な応答を返しているが、そもそもその仕様が間違っていたというケース。こういう時は、必要であれば保守として対応することになると思う。おそらく人類の歴史が続く限りこの議論が無くなることはない。

# 障害検知(そもそもどうやって障害に気づくか)
- だいたいにおいて、以下のようなパターン。

1. 障害検知ツール(newrelic、 zabbixなど)
2. ベンダーの障害情報
2. バッチスクリプトなどが失敗した場合に開発者が仕込んでいた通知
3. エンドユーザーからの通報(あるいは、開発者が自分で気づく)

- ツールやスクリプトで通知を飛ばす場合は、誰に飛ばすかをきちんと考えて仕込んでおく。
    - **スクリプトの開発者にしかメールが届かず、その人が休みで誰も気づかなかった、、**ということは避ける。
- ベンダー(例えば、AWSやherokuのような)の障害情報は必ずウォッチしておく

# 障害対応フロー
- 以下のようなフローで進めるとスムーズ。

1. 障害検知
2. 直接原因の突き止め
3. 暫定対応方針の決定
4. 暫定対応の実施
5. 根本原因の突き止め
6. 本格対応の実施

- 直接原因と暫定対応
     - 暫定対応とは、「数字の計算が明らかにおかしく見える」というような外部から見える障害の原因のことを指す(数値計算ロジックのバグがあった、とか)。
     - この直接原因に対して対応するのが暫定対応。
- 根本原因と本格対応
    - 根本原因とは、上記の例で言うと、そもそもロジックのバグはなぜ生まれたのか？ということ。テストケースに誤りがあったのか、レビュー体制が良くなかったのか、など。
    - この根本原因に対して対応するのが本格対応。
- サービス復旧としては4で一応達成されるが、6の本格対応まで実施することで障害対応としては完了する。
- よくある話として、**「障害対応に夢中になってしまい、各フェーズで必要な関係者への連絡が漏れる」**ということがあるため、普段から障害発生時のレポートラインや連絡内容を整理しておくと良い。

## 直接原因と暫定対応
- 直接原因の突き止めは、主にログが起点となる。
- このため、そもそもログを適切に出力していることが重要となる。
    - サーバー台数が複数に渡る場合は、ログ確認自体が非常に手間になるため、集約化しておくと良い。
    - スクリプトの実行ログなどは、日時を入れるなど障害発生タイミングがわかるようにし、合わせて適切なメッセージを出すようにしておく。
- 本番のみで発生すようなバグがある場合は、再現環境をあらかじめ用意しておき、そこで再現するかどうかを検証する。

## 根本原因と本格対応
- 根本原因は上述のように、チーム体制やルール、ガイドラインなどが問題となっていることが多い。
- チームとして議論をし、解決策を模索していく必要がある。

# 障害票を作り、ナレッジを共有する
- ここまでにたどってきた以下の項目について整理しておくと、チームとしてナレッジをストックできる。
- ツールはチームとして使いやすいものであれば良いと思う。

```
XXシステムにおける◯◯障害 #障害についてのわかりやすいタイトル

発生日/起票者

1. 直接原因
2. 暫定対応
3. 根本原因
4. 本格対応

# まだ対応できていない、究明できていない項目があるときは、対応方針などだけでも書いておく
```

# 障害対応に強いチームの作り方
- 個人的に一番重要だと考えているのはこの点

## 障害対応に弱い(と思う)チーム
- 障害が発生したことでチームの雰囲気が悪くなる(あ〜あ、やっちゃった、という空気になる)。
- マネージャーなどが犯人探しを行う。また、通常時でも、悪い報告に耳を貸そうとしない。
- 障害対応をとにかく急かす(何ですぐ直らないんだ！となる)。
- 場当たり的に対処しようとする(好き勝手にメンバーが対応しようとしたりする)。

## 障害対応に強い(と思う)チーム
- 障害が発生すると祭りのような状態になる(チームとして事象にあたろうとする)
    - チームとして一丸となってナレッジを持ち寄らないと解決できない場合もある。
    - 常にそうした助け合いの姿勢があるチーム作りをする。
- 障害が発生するプロセスを究明しようとするが、ミスをした人を責めない。
    - 人が作ったものであれば必ずミスはある。
    - ミスがなぜ起こるのか？を明らかにせずに人を責めても根本的な解決にならない。
- 実際に対応に当たっている担当者を急かさない
    - 障害を実際に起こすと精神的に動揺する。ミスがミスを生む状況を防ぐため、ある程度の時間枠は決めるが焦らせない。
- あらかじめ障害発生時の対応フローが用意されている。
    - 障害発生時のレポートライン、対応者などがチームで整理されている。
    - バックアップ取得や再起動作業などがスクリプト化され、メンテされている。
    - ログ出力ルールや出力ポイント、エラー時の通知先などが整理され、徹底されている。

# おわりに
- こう書くと不謹慎に思われるかもしれないが、障害対応は楽しい。
- 人が作ったものに完璧はない。原因を追究して、対処していくときのチーム一丸となる雰囲気は非常にわくわくする。
- 失敗から人は学ぶのだから、繰り返し数をこなしていけば良い。
GCE(Google Compute Engine)を使ってみたい！〜インスタンスの作成編〜


# セットアップはじめよう！

1. google cloud platform のメイン画面へアクセス。
2. プロジェクトを作成
3. 左のタブの、VMインスタンスをクリック
	4. VMインスタンス作成をクリック。 **インスタンスの作成開始！** 


## インスタンス作成
インスタンスを作成するための設定項目は以下です。(2016/4/17 時点)

* 名前
* ゾーン
* マシンタイプ
* ブートディスク
* IDとAPIへのアクセス
* ファイアウォール

この６つの項目を設定すればOKです。

### 名前
好きな名前をつけよう！

### ゾーン
日本リージョンがやってくる！という話ですが、現状はまだ利用できないです。なので、比較的日本に近い `asia-east1-a` を選択しておきます。

### マシンタイプ
下記URLにあるマシンから、どのマシンにするかを選ぶことができます。
https://cloud.google.com/compute/docs/machine-types

値段もマシンタイプによって違います！
https://cloud.google.com/compute/pricing#machinetype

### ブートディスク
自分の好きなOSを選びます！自分はubuntuが良い！と言われたので、ubuntuにしました。
https://cloud.google.com/compute/docs/operating-systems/

### IDとAPIへのアクセス
APIのアクセスをどうするかを決めます。とりあえずデフォルトにしました！つくってみたあとで考えましょう！

### ファイアウォール
Webサーバとして起動するなら、 `HTTPトラフィックを許可する`と `HTTPSトラフィックを許可する` のどちらにもチェックを入れます。これでインターネットからサーバに対してアクセスができるようになります。

これで作成を押せば、インスタンスの設定が完了です！
HP公開まで頑張りましょう！
Chrome Extensionの個人開発メモ

# 概要
WebページをXPathと正規表現で検索した結果を表示するChrome Extensionを作った時に感じたことの備忘録

# ファイル構成
```:files
chrome_extension
├── images
│   └── icon.png
├── manifest.json
├── scripts
│   ├── background.js
│   ├── icecrepe.js
│   ├── opjs.js
│   └── popup.js
└── views
    └── popup.html
```

```json:manifest.json
{
  "manifest_version" : 2,
  "name" : "icecrepe",
  "description" : "Web page scraping extension.",
  "version" : "0.0.0.1",
  "browser_action" : {
    "default_icon" : "images/icon.png",
    "default_popup" : "views/popup.html"
  },
  "background" : {
    "scripts" : [ "scripts/opjs.js", "scripts/background.js" ]
  },
  "content_scripts" : [{
    "matches" : [ "<all_urls>" ],
    "js" : [ "scripts/opjs.js", "scripts/icecrepe.js" ]
  }]
}
```

|キー|値|説明|
|:--|:--|:--|
|manifest_version|2|[manifest.jsonのバージョン](https://developer.chrome.com/extensions/manifestVersion)|
|name|icecrepe|Extensionの名前|
|description|Web page scraping extension.|Extensionの説明|
|version|0.0.0.1|Extensionのバージョン|
|browser_action/<br>&nbsp;default_icon|images/icon.png|ブラウザに表示するExtensionのアイコン(16x16)|
|browser_action/<br>&nbsp;default_popup|views/popup.html|アイコンをクリックした時にポップアップ表示するページ|
|background/<br>&nbsp;scripts|[ "scripts/opjs.js", "scripts/background.js" ]|バックグラウンドで実行するスクリプト|
|content_scripts/<br>&nbsp;matches|[ "\<all_urls\>" ]|Webページを操作するスクリプトの実行対象URL|
|content_scripts/<br>&nbsp;js|[ "scripts/opjs.js", "scripts/icecrepe.js" ]|Webページを操作するスクリプト|

# Chrome Extension特有の概念
* ページに対するアクションの違い

|アクション|説明|
|:--|:--|
|browser_action|全てのページで実行するアクション|
|page_action|特定のページで実行するアクション|

* ブラウザアクションの実行順序
 
 1. ブラウザに表示されたアイコン(images/icon.png)をクリックする
 2. Extension用ページ(views/popup.html)がポップアップ表示される
 3. 必要に応じてExtension用ページ(views/popup.html)で読み込んだスクリプト(scripts/popup.js)からブラウザを操作
  * ブラウザに対する操作はコンテンツスクリプトでしか実行できないため、バックグラウンドスクリプトを経由してコンテンツスクリプトとメッセージの送受信を行う  
    scripts/popup.js <-> scripts/background.js <-> scripts/icecrepe.js
  * 複雑なデータは送受信できないので、JSONに変換する

# Chrome API
自分が使用したものをリストアップ

|実行スクリプト|メソッド|用途|
|:--|:--|:--|
|popup|chrome.extension.getBackgroundPage|バックグラウンドスクリプトの取得|
|background|chrome.tabs.query|ブラウザで表示しているタブ情報の取得|
||chrome.tabs.sendMessage|特定タブのコンテンツスクリプトにメッセージを送信|
|content|chrome.extension.onMessage.addListener|メッセージ受信用メソッドの追加|

# 成果物
[icecrepe](https://github.com/liveralmask/icecrepe/tree/master/chrome_extension)

# まとめ
* Chrome Extension特有の概念を理解するのに一苦労したが、理解してしまえばJavaScriptで好きなようにブラウザを操作できるので、便利
Crafting Rails4 (Chapter1) 2


```bash
vi pdf_renderer.gemspec 
```

Add this line

```bash
s.add_dependency "prawn", "0.12.0"
```

```bash
bundle install
```

```bash
cd /var/www/crafting_rails/pdf_renderer/test/dummy
```

```bash
vi app/controllers/home_controller.rb
```

```home_controller.rb:ruby
class HomeController < ApplicationController
  def index
    respond_to do |format|
      format.html
      format.pdf { render pdf: "contents"}
    end
  end
end
```

```bash
mkdir app/views/home
```

```bash
vi app/views/home/index.pdf.erb
```

```index.pdf.erb:ruby
This template is rendered with Prawn.
```

```bash
vi config/routes.rb
```

```routes.rb:ruby
Dummy::Application.routes.draw do
  get "/home", to: "home#index", as: :home
end
```

```bash
mkdir /var/www/crafting_rails/pdf_renderer/test/integration
```

```bash
cd /var/www/crafting_rails/pdf_renderer/test/integration
```

```bash
vi pdf_delivery_test.rb
```

```pdf_delivery_test.rb:ruby
require "test_helper"

class PdfDeliveryTest < ActionDispatch::IntegrationTest
  test "pdf request sends a pdf as file" do
    get home_path(format: :pdf)
    assert_match "PDF", response.body
    assert_equal "binary", headers["Content-Transfer-Encoding"]
    assert_equal "attachment; filename=\"contents.pdf\"", headers["Content-Disposition"]
    assert_equal "application/pdf", headers["Content-Type"]
  end
end
```

```bash
cd /var/www/crafting_rails/pdf_renderer/lib
```

```bash
vi pdf_renderer.rb 
```

```pdf_renderer.rb:ruby
require "prawn"
ActionController::Renderers.add :pdf do |filename, options|
  pdf = Prawn::Document.new
  pdf.text render_to_string(options)
  send_data(pdf.render, filename: "#{filename}.pdf", disposition: "attachment")
end
```

```bash
cd /var/www/crafting_rails/pdf_renderer/test/dummy
```

```bash
rails s
```

You can see to download file from this URL.

```
http://192.168.33.100:3000/home.pdf
```
組合せ最適化で録画番組を決める

# <i class='fa fa-rocket' /> 仕事の割当問題
複数の仕事を複数のリソースに割当てることを考えます。特定の仕事のペアは同じリソースに割当てることができません。選ばれた仕事の価値の和を最大化します。

具体例を挙げます。

- いくつかの録画したい放送番組がいくつかあります。
- いくつかの録画可能な機器があります。
- 放送時間が重なる番組を同じ機器で録画することはできません。(同時録画禁止)
- 録画された番組の価値の総和を最大化します。

# <i class='fa fa-rocket' /> 考え方
以下の5番組を考えます。録画機器は3台あるとします。

|名称|開始時刻|終了時刻|価値|
|:--|--:|--:|--:|
|A|9:00|9:30|1|
|B|9:30|10:00|1|
|C|9:00|10:00|1|
|D|9:00|9:30|1|
|E|9:30|10:00|1|

番組をノード、同時録画禁止をエッジとするグラフを考えます。
![image](https://qiita-image-store.s3.amazonaws.com/0/13955/9466971e-4733-2895-58c8-59063ca0f818.png)

このグラフを機器ごとに複製した新たなグラフを考え、同じ番組間にもエッジを作成します。
![image](https://qiita-image-store.s3.amazonaws.com/0/13955/55f8e3ad-98fd-f29c-9a66-21767bc12cf8.png)

このグラフ上で最大安定集合問題を解くことにより、「同時録画禁止を満たし、同じ番組を1つまでの機器でしか録画しない」解を求めることができますので、どの機器でどの番組を録画したらよいかがわかります。

# <i class='fa fa-rocket' /> Pythonで解いてみる

```py3:python3
import networkx as nx
from itertools import combinations
from more_itertools import grouper
from ortoolpy import maximum_stable_set, Autodict
g = nx.Graph()
dc = Autodict()
for i in 'ABCDE':
    for j in'123':
        g.add_node(dc[i+j], weight=1)
for i, j in grouper(2, 'ACADBCBECDCE'):
    for k in '123':
        g.add_edge(dc[i+k], dc[j+k])
for i in 'ABCDE':
    for j, k in combinations('123', 2):
        g.add_edge(dc[i+j], dc[i+k])
print([dc.keys[i] for i in maximum_stable_set(g)[1]])
>>>
['A1', 'B3', 'C2', 'D3', 'E1']
```

機器1でAとE、機器2でC、機器3でBとDを録画すればよいことが分かります。

以上
Ruby技術者認定試験Silver 2.1 学習用の個人的なメモ　その７

# Hash
Hashの見直し
http://docs.ruby-lang.org/ja/2.1.0/class/Hash.html

| メソッド名 | 意味 | 破壊 | near |
|----------|------|-----|------|
| assoc | キーに対応するキーと値のペアの配列を返す | × | -
| rassoc | 値に対応するキーと値のペアの配列を返す | × | -
| each | キーと値を繰り返し取り出す | - | each_pair
| each_key | キーを繰り返し取り出す | - | -
| each_value | 値を繰り返し取り出す | - | -
| invert | キーを値に、値をキーに | - | -
| flatten | ハッシュを平坦化した配列を返す | - | -
| inspect | ハッシュを読みやすい文字列(バックスラッシュ、クラスなどはオブジェクト名やID表示)に変換 | - | -
| keep_if | ブロックの戻り値が真になったキーと値のみ残す | ○ | -
| delete_if | keep_if の逆 | ○ | -
| store | ハッシュにキーkeyと値valのペアを追加 | ○ | []=
| update | 別のハッシュの内容を加える | ○ | merge!
| values_at | ハッシュから引数で指定したキーに対応する値を取り出し、配列にして返す | - | -



# 模擬試験
http://www.ruby.or.jp/ja/certification/examination/index.data/exam_prep_jp.pdf

| 番号 |解答 | 正解 | 番号 |解答 | 正解 | 番号 |解答 | 正解 |
|-----|-----|-----|-----|-----|-----|-----|-----|-----|
| 31  | ~~A~~   | C   | 41  | B   |  ○  |   |    | 
| 32  | C,D | ○   | 42  | A   |  ○  |   |    | 
| 33  | A   | ○   | 43  | ~~D~~   |  A  |   |    | 
| 34  | ~~A~~   | C   | 44  | C   |  ○  |   |    | 
| 35  | D   | ○   | 45  | ~~B~~   |  A  |   |    | 
| 36  | B   | ○   | 46  | C   |  ○  |   |    | 
| 37  | ~~B~~   | C   | 47  | A   |  ○  |   |  |
| 38  | ~~D,E~~ | B,D | 48  | C   |  ○  |   |    | 
| 39  | C   | ○   | 49  | A   |  ○  |   |    | 
| 40  | A   | ○   | 50  | A,C |  ○  |   |    |

あと３問・・・（T＿T；）

```31.rb
# ケアレスミスといえばケアレスミス
foo = [1,2,3]
bar = foo
baz = foo.dup # 薄いコピーなので参照先はコピーされない
bar[3] = 4 # 破壊的に挿入され
p foo  # --> [1, 2, 3, 4]
p bar  # --> [1, 2, 3, 4]
p baz  # --> [1, 2, 3]
```

```34.rb
# How are you 出力されんのかい！エラーかと思った・・けど、eachとかも突然使えるもんね・・
class Object
  def greeting
    print "How are you?\n"
   end
end
[1,2].greeting # How are you?
```

```37.rb
# デフォルトは mode=r リードモードですね。完全に勉強不足
File.open("foo.txt") do |io|
  io.write(Time.now.strftime("%Y/%m/%d"))
end
# --> hairetu.rb:213:in `write': not opened for writing (IOError)
```

```38.rb
p Dir.getwd # カレントディレクトリのフルパスを文字列で返します。

#[] glob chdir chroot delete rmdir unlink entries exist? 
# exists? foreach getwd pwd home mkdir new open
```

```43.rb
# シンボルの場合でも正規表現でヒットするということですね
p String.instance_methods.grep(/strip/) # --> [:rstrip, :strip!, :rstrip!, :strip, :lstrip!, :lstrip]
p String.methods.grep(/send/) # --> [:public_send, :send, :__send__]
p String.methods.grep(/^.*send$/) # --> [:public_send, :send]
p String.methods.include?(":send") # --> false
p String.methods.include?(:send) # --> true
p String.instance_methods.include?(":strip") # --> false
p String.instance_methods.include?(:strip) # --> true
```

```45.rb
# どれがライブラリーでどれがモジュールなのかを暗記しないといけないですね・・
uriはRubyに標準で添付されているライブラリーの1つです。
requireすることによって、プログラム内で呼び出すことができます。
include、extendはモジュールを読み込む際に使用します。
importはRuby以外の言語で同様の目的の際に利用されることがありますが、Rubyでは使えません。
```
AWSソリューションアーキテクト プロフェッショナルに合格した勉強内容と受験の様子

AWSソリューションアーキテクトのプロフェッショナル試験に挑戦しました。
なんとか合格できたので、勉強した内容と受験の様子をまとめておきます。

* 勉強期間 2週間
* 模擬試験点数 37%
* 本試験点数 70%

## サンプル問題
まずは定番の[サンプル問題](http://media.amazonwebservices.com/jp/certification/AWS_certified_solutions_architect_professional_examsample0701_08_final.pdf)を解いたのですが、意外と答えられる、とその時は感じました。しかしサンプル問題の回答はありませんので、自分の回答が合っていると思い込んでいただけです。この時はすぐ合格するだろうと思っていました。
## 模擬試験
他のプロフェッショナル合格者の体験談を読むと、皆さん模擬試験を受けていたので自分も受けることを決めました。本試験はテストセンターで受けることになりますが、模擬試験は自宅から受験することが出来ます。ここでの結果は37%、不合格でした。振り返るとこのタイミングで危機感を覚えることが出来たのは良かったです。模擬試験問題は本番と傾向の近い問題が出るのですが、こちらも回答はありません。
[AWS 認定ソリューションアーキテクト プロフェッショナルに合格したので対策と勉強方を公開](http://yomon.hatenablog.com/entry/2015/10/21/080826)
こちらの記事の分野ごとの予想問題数と正解率を付きあわせるチェック法が大変参考になりました。ただどうしても「この問題が、どの分野に属するのか」がわからない問題もありました、そこは諦めます。
## 模擬試験を受けての学習
自分の弱い分野が分かった所を、重点的に勉強していきます。業務ではAWSのサービスの中でもEC2・ELB・RDS等を日常的に使っていますが、その他のサービスは知識が大幅に足りないということが分かりました。また使用したことがあるサービスもプロフェッショナル試験では、より突っ込んだ知識が必要でした。具体的な勉強内容としては

* とにかく[AWSクラウドサービス活用資料集](http://aws.amazon.com/jp/aws-jp-introduction/)のAWS Black Belt Techシリーズを読む
* AWS Black Belt Techシリーズを読んで、疑問に思った所を[AWSドキュメント](http://aws.amazon.com/jp/documentation/)で解決する

を行いました。アソシエイト試験対策では実際に手を動かして実践するのがとても役立ったのですが、プロフェッショナルの試験範囲では個人用のAWSアカウントでは試しにくい、エンタープライズ向けのサービスについての知識（オンプレミスからクラウドへの移行など）も要求されるので試しづらかったです。
## 本試験
本試験は80問170分、長丁場です。1問2分ペースですがどうしても見直しの時間をしっかり取りたかったので、かなり急いで解きました。問題文が短く、すぐ回答が分かるような問題も多いので即回答し次の問題へ、長文で悩む問題もとりあえず答え、後で振り返るにチェックを入れておきます。これを80問最後まで行うと相当疲れて頭も回らなくなりますが、見直しに入ると一度見たことのある問題なのでリラックスできます。回答で迷った時には、問題で何を求められているのか（耐障害性なら○○、コストなら○○…）から、ひねり出しました。
## まとめ
かなり難しい試験でしたが、受験して良かったです。普段の業務では使わないサービスについて知ることが出来たのは楽しいです。今後もAWSの知識を学び、使っていきたいです。
## 参考元

* [AWS 認定ソリューションアーキテクト プロフェッショナルに合格したので対策と勉強方を公開](http://yomon.hatenablog.com/entry/2015/10/21/080826)
* [AWS ソリューションアーキテクト プロフェッショナル](http://tsubauaaa.hatenablog.com/entry/2015/12/26/135826)
* [3 か月で AWS 認定を制覇したので合格の秘訣をまとめてみた](http://blog.manabusakai.com/2015/09/aws-certification-complete/)
* [AWSソリューションアーキテクトプロフェッショナルに合格したので勉強法メモ、結構嬉しい、いやかなり嬉しい、超絶嬉しい、嬉しすぎて鼻歌を歌いながら飛び跳ねちゃうね！](http://qiita.com/iron-breaker/items/94a5daf9b3935b77f842)
よく使うvimのショートカット

以前、以下２記事を書きました。他の方に説明するために残しておきます。

[よく使うCLIのショートカット（bash）](http://qiita.com/kaikusakari/items/0fa576146ea303c211e8)
[新しいLinuxサーバにログイン時確認すること](http://qiita.com/kaikusakari/items/8c6bc5b18074d0ad17e7)

Linuxで作業する場合、インストール方法にもよりますがまずインストールされているため、利用できるようになっておけば、作業時などに困りません。当然ですが、GUIとは違い、いろいろな機能をショートカットで利用するため、知っているかどうかで生産性が大きく変わります。本投稿では、自身が良く使うショートカットをまとめます。

#環境
vimをインストールしている環境

```bash
[Saiph@vi ~]$cat /etc/redhat-release 
CentOS Linux release 7.2.1511 (Core)

[Saiph@vi ~]$which vi
/usr/bin/vi

[Saiph@vi ~]$ls -l /usr/bin/vi
-rwxr-xr-x. 1 root root 910040  6月 10  2014 /usr/bin/vi

[Saiph@vi ~]$yum list installed | grep vim
vim-minimal.x86_64                    2:7.4.160-1.el7
```

**（コマンドモードで）　/　+ 文字列**
ファイルの先頭から、文字列を検索します。入力文字列と完全一致した箇所に移動します。検索結果に移動した時点で、「n」を押下すると次の候補に、「shift + n（N)」を押下すると、前の候補に戻ります。リファレンスには正規表現が利用できると明記されていますがIPアドレスなど正規表現において、バックスラッシュが必要な特殊文字でもバックスラッシュなしで、検索可能です。

```vim
aaa
aaa
aaa

[cursor]aaa
aaa
aaa
/aaa
```


**（コマンドモードで）　?　+ 文字列**
ファイルの末尾から、文字列を検索します。入力文字列と完全一致した箇所に移動します。検索結果に移動した時点で、「n」を押下すると次の候補（末尾から先頭に移動）に、「shift + n（N)」を押下すると、前の候補に戻ります。

```vim
aaa
aaa
aaa

aaa
aaa
[cursor]aaa
?aaa
```


**（コマンドモードで） x**
カーソルの文字を1文字削除します。

```vi
a[cursor]bcdefg
a[cursor]cdefg
```

**（コマンドモードで） dd**
カーソル行を切り取ります。
削除ではなく、行がクリップボードに入ります。

```vi
aaa
[cursor]bbb
ccc

aaa
ccc
```


**（コマンドモードで） 任意の数字 → dd**
カーソル行から任意の数字行切り取ります。
例：2 →　dd だと、カーソル以下2行を切り取ります

```vi
aaa
[cursor]bbb
ccc

aaa
```

**（コマンドモードで） :file**
ファイル情報を表示

```vim

:file
"test.txt" [Modified][New file][readonly] line 3 of 7 --42%-- col 1
```

**（コマンドモードで） :set nu**
テストファイルの行数を表示

```vim
aaa
bbb
ccc

:set nu
1 aaa
2 bbb
3 ccc
```

**（コマンドモードで） ctrl + f**
1ページ送りする。ログや、大きな設定ファイルを見る時に便利。
※ページ戻りはctrl + bです

**（コマンドモードで） shift + g(G)**
ファイルの末尾行に移動する。

**（コマンドモードで） 任意の数字 → shift + g(G)**
指定した行に移動する。
ファイルの先頭に移動する場合は1 →　　shift + g

**（コマンドモードで） 0**
行の先頭に移動する

**（コマンドモードで） shift + 4 ($)**
行の末尾に移動する

**（コマンドモードで） yy**
行コピー → ペーストはp

もう少し慣れてくれば、画面分割や、検索置き換えなども利用できますが、まずはカーソル移動や、コピーペーストといった基本機能をまとめました。検索、行移動、カーソル操作さえ覚えれば大きく生産性があがりますよね。