OmniAICreator/Qiita-1.07M huggingface dataset:
macOS SierraでJIS配列キーボードをUS配列として使用する方法

# macOS SierraからはKarabinerが使えない
この問題で悩んでる方も多いはず。私もしばらくは仕方なくJIS配列を使用していた。  
しかし、Karabinerとは別のソフトを使うことで、macOS SierraでもUS配列として使うことが可能なことが分かったため、今回はその方法をご紹介したい。  

# ダメな方法
macOS SierraでJIS配列キーボードをUS配列として使用するための方法は、実はいくつかある。しかしどれも完全な方法ではないことが多い。  

* Karabiner-Elementsを使う
[change Japanese keyboard to US(JIS to ANSI)](https://github.com/tekezo/Karabiner-Elements/issues/167)  
ここでも議論されているが、一部置換ができなかったり、完全ではない。今後に期待。

* カスタムキーボードレイアウトを使う
[MacのJIS配列キーボードをUS配列で使いたい人用カスタムキーボードレイアウト](http://mjhd.hatenablog.com/entry/2016/10/27/184500)  
ここで私が紹介した方法なのだが、これも、*日本語入力中はJIS配列に戻る*という問題を抱えている。

# 今回の方法
*[Lacaille](http://lacaille.jpn.org/)*というソフトを使う。これはもともと「親指シフトをmacOSでも使おう」というテーマのソフトなのだが、macOS Sierraでもしっかりと動くこと、カスタマイズの幅が広いことから、*US配列へ変換するためにも使える*。  

よって今回は、親指シフトを無効にして、 KarabinerのUS配列を移植した。  
 
Locailleをダウンロードし、「設定ファイルを読み込む...」ボタンを押し、以下のファイルを読み込むことによって、完全に US配列に置き換えることができる。  
[Locaille_JIS2US.plist - Google ドライブ](https://drive.google.com/open?id=0BwmDtpO4XInwZHdyZUJUanQ4T0k)

# 快適なUS配列ライフを！
R MarkdownのTOCおよびfloating_TOCをcssで書式設定

タイトルの通りです。調べたのでメモ。

## TOC, floating TOCとは

TOCとは"Table of Contents"の略称で，見出しリストです。R Markdownではこれを自動生成してくれます。またfloating TOCとは，この見出しリストをサイドバー形式で浮かせて表示させるというもので，常に表示させておくことができます。

このあたりの説明および使い方は，以下のサイトを参照してください:

- http://rmarkdown.rstudio.com/html_document_format.html#table_of_contents

## TOCへのcssを用いた書式設定

TOCについては，Pandocの機能により実装されています。詳しくは生成物のhtmlもしくはPandocの情報にあたってください。

例えば文字色を変更したい場合，以下のような設定でできます:

```toc.css
#TOC a {
color: black;
}
```

要するに，**TOCで自動生成された要素は，`#TOC`で覆われている**というだけです。あとは自由に設定できるかと。

## floating TOCへのcssを用いた書式設定

floating TOCは[Tocify](http://gregfranko.com/jquery.tocify.js/)というjsライブラリを使って実装されています。

### 外枠，全体設定

以下のような感じで指定します:

```css
.tocify .tocify-header {
color: red;
border: solid 3px blue;
}
```

`.tocify .tocify-header`で，このfloating TOCの外枠や全体領域を指定できます。`color:`で文字色を，`border:`で外枠の設定を指摘できます。なお，ここで`background: `を指定しても反応しませんでした。おそらく後述する`.tocify .tocify-item`の方で色の指定が入っているからだと思います。

### 非アクティブな項目の設定

以下のような感じで指定します:

```css
.tocify .tocify-item {
background: lightblue;
color: blue;
border: solid 3px pink;
}
```

塗りつぶしを指定すると，アクティブでない項目に対して色を塗れます。また`.tocify .tocify-header`で文字色を指定していて，こちらでも文字色を指定した場合，こちらの方が優先されます。また，ここの`border:`は，各項目への枠線となります。

### アクティブな項目の設定

以下のような感じで指定します:

```css
.tocify .tocify-header .active {
color: white;
background: green;
}
```

ここで指定した内容は，上記2つの指定を上書きして最優先されます。また特に指定しない場合，デフォルトの設定があるので青色背景，白色文字が優先されます。

## style設定の読み込ませ方

一番確実なのが，Rmdファイルのyamlフロントマターの後に，cssチャンクを入れる方法です:

	```{css}
	#TOC a {
	color: black;
	}

	.tocify .tocify-header {
	color: red;
	border: solid 3px blue;
	}

	.tocify .tocify-header .active {
	color: white;
	background: green;
	}

	.tocify .tocify-item {
	background: lightblue;
	color: blue;
	border: solid 3px pink;
	}

	```

これならば，cssの内容を一番最後に読み込むことになるので反映されます。

また，おそらくはカスタムCSSで準備してyamlフロントマターで指定しても反映するとは思いますが，もしかしたら一部されないカモしれません。その際はcssチャンクを準備してみてください。

**Enjoy!**
手っ取り早くetcdの中を見る方法

# 手作業
`etcdctl`で`ls`と`get`を繰り返す

## `ls`でディレクトリの中身を見る

```
$ etcdctl ls -p
/hoge/
$ etcdctl ls -p /hoge
/hoge/fuga/
/hoge/piyo
```

## `get`で中身を見る

```
$ etcdctl get /hoge/piyo
test
```

# `etcddumper`を使う

手作業だと大変なのでツールを使います

https://github.com/lavagetto/etcddump

## インストール
> Installation
> ------------
> 
> You can install etcddump from sources by cloning this repository and run
> 
> ```bash
> $ sudo python setup.py install
> ```
> 
> ----
> 
> Alternatively you may use pip:
> 
> ```bash
> $ sudo pip install etcddump
> ```

`pip`が使える

## ダンプを取る

JSON形式で出力されるので`jq`にパイプします

```bash
$ etcdumper dump http://localhost:4001 | jq .
```
ブラウザだと表示されるのにRSpecでActionView::MissingTemplate: Missing partialになった時の事

## 環境
Rails 3.2.22.55
RSpec 3.5.4

## 何が起きたのか
Controllerのメソッド内で描画するviewを
def boo
  render partial: '/hoge/foo', locals: {〜}
end
って書いてて
rspecで呼んでみたらActionView::MissingTemplate: Missing partialになった

## 色々調べても正解が見つからなかったので
よし、調べるのを諦めよう

## 解決策
render partinal: 'hoge/foo', locals: {〜}
テンプレートの先頭の`/`が邪魔っぽかった
git > git commit -m [message] > nothing to commit (working directory clean) > virtualenvと関係するのか

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.7.1を使用。
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
```

### 実行したこと

- virtualenvを起動 (Python 3.6.0環境)
   - (以下、ターミナル1とする)
- gnome-terminalにて別ウィンドウを起動 (以下、ターミナル2とする)
- ターミナル1上でsublime Textを起動してコードを編集
- ターミナル2上でgit addファイル、git commit -m メッセージをする
  - nothing to commit (working directory clean)
  - と表示される

git diffしても何も変更してないことになる。

- ターミナル1上では
  - git diff にて変更点が表示
  - git commitでコミットできる

virtualenv関連で何か起きているのかもしれない。
Python3+ Djangoでset_cookieのvalueに日本語を入れたい！

日本語をそのまま入れると、Exceptionを吐いてしまうので、さあどうすっぺかと考えた。

# バージョン
```
$ python3 --version
Python 3.5.2
```

```
$ python3
>>> import django
>>> django.get_version()
'1.10.5'
```

# 解決までの道筋
## 1. urlencodeを使う
- 成功：`django.utils.http.urlencode(['愛す'], False)`
- 成功：`django.utils.http.urlencode(['アイ'], False)`
- 失敗：`django.utils.http.urlencode(['バルス'], False)`

```
  ・
  ・
  ・
  File "/usr/local/src/django/django/utils/http.py", line 104, in urlencode
    for k, v in query],
  File "/usr/local/src/django/django/utils/http.py", line 104, in <listcomp>
    for k, v in query],
ValueError: too many values to unpack (expected 2)
```

## 2. enumerate+urlencodeを使う
- 成功？：`django.utils.http.urlencode(enumerate(['バルス']), False)`
    - `"0=%E3%83%90%E3%83%AB%E3%82%B9"`になってしまう。"0="が邪魔。

## 3. urlquoteを使う
- 成功！：`django.utils.http.urlquote('バルス', '')`
    - `%E3%83%90%E3%83%AB%E3%82%B9`

でもちょっと本来の使い方ではない気がする。。。
GoogleChrome | 現在ページのリンクを Markdown形式でクリップボードにコピーする 

# 今までの手順

1. Markdownのタグを入力
1. URLをコピペ
1. ページソースを開いてtitleタグの中身をコピペ

これではf面倒でページ名まで入力していられない。

# これからの手順

[Copy as Markdown - Chrome Web Store](https://chrome.google.com/webstore/detail/copy-as-markdown/fkeaekngjflipcockcnpobkpbbfbhmdn?hl=en) を使う。

クリップボードへのコピーが1発で出来るようになる。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/f5c3c16c-4ce1-7292-54e7-e9ae67f13eae.png)


# ショートカット登録

Chromeの拡張機能設定 ( chrome://extensions/ ) でショートカットを登録すれば、どのページにいても1キーで使えるようになる。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/18f79b75-064d-708e-c91b-dcb5babbd1fb.png)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
外部キーreferences型の表記の注意

外部キー制約のカラム、references型の表記の仕方に注意がいります。
具体例を見てみましょう。


### messagesテーブル

|column|type|etc|
|:--|--:|:--:|
|body|text||
|image|string||
|group_id|references|foreign_key|
|user_id|references|foreign_key|

このようなmesaagesテーブルがある場合のマイグレーションファイルの表記はどうなるのでしょうか？

```
class CreateMessages < ActiveRecord::Migration[5.0]
  def change
    create_table :messages do |t|
      t.text        :body
      t.string      :image
      t.references  :group, foreign_key: true
      t.references  :user, foreign_key: true
      t.timestamps
    end
  end
end
```

6,7行目に注目してください。messagesテーブルの設計図では「group_id」という名前だったのに「group」のみの表記になっています。これはreferences型の特徴で「group」のみで「group_id」と同じ解釈になっているので「group_id」と書いてしまうと、「group_id_id」となってしまいエラーが起きてしまうので気をつけましょう。
bash > Ctrl+cした時に二重ループの処理から抜ける > trap exit SIGINT

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.7.1を使用。
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
```

bash script内で二重ループしている時、Ctrl+cで内部ループを終了時に、次の外部ループの処理をしないで欲しい場合がある。

trapを使うようだ。

参考 http://d.hatena.ne.jp/pyopyopyo/20140820/p1

以下のように実装した。

```bash:test_bash_170327_exec
#!/usr/bin/env bash

SCRIPT_DIR=$(dirname $0)

echo "data_arrival,hour_arrival,hour_start,total_value,avg_lat,avg_lon,std_lat,std_long"

trap exit SIGINT  # to exit for Ctrl+c

for orgfile in xxxouput*.nc;do
	#echo $orgfile
	ln -fs $orgfile LN-test_nc
	for timidx in $(seq 0 23);do
		python $SCRIPT_DIR/calc_latlon_avg_std_170323.py -t $timidx
	done
done
```

これで内部ループでCtrl+cした時にすぐに終了するようになった。

<hr>
(追記 2017/03/28)
@akinomyoga さんに編集リクエストいただきました。
感謝です。

編集リクエストのコメントが勉強になるため、以下に貼り付けしておきます。

> (1) trap は事前に (C-c よりも前に) 動作を予約するもの。ループの前に1回実行すれば良い (2) `ls xxxouput*.nc` は無意味。単に xxxouput*.nc で十分。`ls ...` とすると却って空白類を含むファイル名で危険
dockerを活用してみたかったので、RailsのDB環境だけdocker使うようにしてみた

dockerでなにかやりたい…
現在vagrantを利用しているRailsプロジェクトをまるっと、dockerに載せ替えたい…そう、最初は思っておりました。
ちょっと大変そうだったので、とりあえず今回はDBだけdocker化してみました。
なお備忘録的なものなので、参考にする際には自己責任でお願いします。

## 環境
mac
既存のRails開発環境があって、DBの環境だけ増やすといった場合を想定しています。

# dockerをインストール
正直、ここが一番混乱しました。
なにせmacにdockerを導入する方法が何通りもあり、ベストプラクティスというものがわからない状態だったためです。
多分docker for macを使うのがいいのかもしれないのですが、とりあえず的なものも含めていろいろと参考情報が多かったので`docker-machine`を使用してみました。

### Docker Toolboxのインストール
ここからダウンロード、インストールしてください
https://www.docker.com/products/docker-toolbox

### docker-machineでvirtualboxをつくる
`$ docker-machine create --driver virtualbox development`

作成できたかを確認する
`$ docker-machine ls`
作成した`development`の情報が表示されていればOKです。


ローカルからdockerコンテナを操作できるようにする
`$ eval "$(docker-machine env development)`

# DB（今回はpostgresql）コンテナを作成する

※バージョン9.3.15を使用する場合
`$ docker pull postgres:9.3.15`

インストールが完了したら、起動する
postgresqlで使用するポート:5432をポートフォワードします。
`$ docker run -d -p 5432:5432 --name postgres postgres:9.3.15`
psqlコマンドを使用するときは以下のコマンドを使用します。
`$ docker exec -it postgres psql -U postgres`

# postgresqlにDBを作成（レストア）する
まずはDBを作成します。
`$ docker exec -i postgres createdb 作成するDB -U postgres`

既存DBからバックアップしてきたデータをレストアします。
`$ cat dumpファイル | docker exec -i postgres psql -d 作成したDB -U postgres`

docker側での作業は一旦これで完了です。

# 既存のRailsプロジェクトからdockerのDBに接続する。
Railsの`config/databases.yml`の設定を変更します。
既存のファイルは適宜バックアップしておいてください。

今回はローカル環境（develop）のみを対象にします。
developmentの部分だけ変更します。

```
development:
  <<: *default
  adapter: postgresql
  database: 作成したDB
  username: postgres
  host: XXX.XXX.XXX.XXX ⇐　docker-machine lsで確認できたIPアドレスを設定します。
  port: 5432
```

ファイル内容を変更後、Railsを再起動してください。
以上でRails側の作業も完了です。

## 感想

こんな感じで、DBだけdockerを使って構築できました。
万が一DBを壊してしまっても、作り直しやすいですし
コンテナ側のIPやポートを調整すれば複数のDB環境を用意できるのかな、と思います。
構築方法については`docker-compose`を使うほうが良いのだろうか、、、みたいな感じもしております。
minitestでassertした行・ファイルを素早く開く

Ruby on Railsにおいて特に指定しないとテストにはminitestが採用されるようになっている。

私は普段の開発においてテストにはrspecを採用し、Emacsのrspec-modeを経由して使っていたのだが、さすがに標準のほうを使ったことがないってのはよくないなと考えてminitest + minitest-modeを使ってみることにした。

``` shell
-*- mode: minitest-compilation; default-directory: "~/gitwork/minitest-project/" -*-
 started at Mon Mar 27 10:10:21

 bundle exec ruby -Ilib\:test\:spec test/controllers/minitest_controller_test.rb
Run options: --seed 33436

# Running:

F

Failure:
MiniTestControllerTest#test_test_yaml [test/controllers/minitest_controller_test.rb:40]:
Expected false to be truthy.


bin/rails test test/controllers/minitest_controller_test.rb:39



Finished in 0.455735s, 2.1943 runs/s, 2.1943 assertions/s.

1 runs, 1 assertions, 1 failures, 0 errors, 0 skips

 exited abnormally with code 1 at Mon Mar 27 10:10:24
```

この書式だとなぜかminitest-compilation-modeなのにTABキーでエラーに移動し、RETキーで開くができないんだなあ。

いろいろ試行錯誤した結果、以下の手順をした。

## minitest-reportersの採用

`Gemfile` の `group :development, :test do` ブロックに以下を追加。

``` Gemfile
  gem 'minitest-reporters'
```

### テストの結果フォーマット変更

`test/test_helper.rb` で設定する

``` test/test_helper.rb
  Minitest::Reporters.use!(
    Minitest::Reporters::SpecReporter.new,
    ENV,
    Minitest.backtrace_filter
  )
```

### 変更後のテスト結果表示 & ジャンプ

表示を以下のようにかえることができた。この書式だとTABキーでエラーに移動し、RETキーで素早く開くことができた。

``` shell
-*- mode: minitest-compilation; default-directory: "~/gitwork/minitest-project/" -*-
 started at Mon Mar 27 10:30:02

 bundle exec ruby -Ilib\:test\:spec test/controllers/minitest_controller_test.rb
Run options: --seed 33436

MiniTestControllerTest
  test_test_yaml                                                  FAIL (0.39s)
Minitest::Assertion:         Expected false to be truthy.
        test/controllers/minitest_controller_test.rb:40:in `block in <class: MiniTestControllerTest>'


Finished in 0.39460s
1 tests, 1 assertions, 1 failures, 0 errors, 0 skips

 exited abnormally with code 1 at Mon Mar 27 10:30:04
```

### ていうか

こんなはずじゃなくねえ？ `rspec-mode` と `minitest-mode` の切り替えもいまいちピンとこないし、なんかもっといい方法あったら教えてください。 `rspec-compilation-mode` では `g` 一発でrerunできるのに `minitest-*mode` ではいちいちコマンド叩いてます。
Fish Shell で、 diff <(cat file1 | sort | uniq) <(cat file2 | sort | uniq)  を実現

Bashだと、 `diff` コマンドで標準入力を渡せる。

例: 

```bash
diff <(cat file1 | sort | uniq) <(cat file2 | sort | uniq) 
```

Fishではどうやるのか調べた結果、 `psub` というものがあることを知った。

```bash
diff (cat file1 | sort | uniq | psub) (cat file2 | sort | uniq | psub) 
```



参考

- https://github.com/fish-shell/fish-shell/issues/1586
- http://fishshell.com/docs/current/commands.html#psub
Android StudioでEmulatorを起動しないUnit test

開発環境

* Android Studio 2.3
* JRE 1.8.0

Android studio プロジェクトの中に androidTestとは別、test だけのパッケージがあります。その中に ExampleUnitTest ユニットテストクラスが入っています。ユニットテストをEmulatorを介さずJavaでデバッグする設置をまとめました。

まず、Runボタンの隣のプルダウンメニューを開き、Edit Configurationを選択。

![3月-24-2017 17-34-49.gif](https://qiita-image-store.s3.amazonaws.com/0/60849/1a751ea2-07ba-1edb-d383-9cc09ccd6e5f.gif)

その次に、左上のプラスボタンで、Moduleを設定し、`ExampleUnitTest`クラスがユニットテストする対象と設定し、デバッグ方法を追加します。PS: Test kind の中に、Class単体テストのか、package、directory単位でテストするのかを選択できます、今回はClass単体テストで進みます。

![3月-24-2017 17-38-57.gif](https://qiita-image-store.s3.amazonaws.com/0/60849/dda6ecf5-fde9-99c0-332a-180d1daa1d15.gif)

Runボタンの隣に先ほど追加した `Unnamed` になるので、 Runボタンを押して実行します。

![image](https://qiita-image-store.s3.amazonaws.com/0/60849/be37dc8e-0369-466a-f59d-01fe7a4248bb.png)

実行したら、テストの結果が下のコンソールに表示されます。

![3月-24-2017 17-42-09.gif](https://qiita-image-store.s3.amazonaws.com/0/60849/c6a43783-319b-0b9a-9077-939e00643efe.gif)


### 補足：　テストファイルを新規追加した議事録

３年前にEclipseで作ったAndroidプロジェクト、 Android Studio v2.3の時にプロジェクトをインポートしたらテストフォルダがなくて、追加した議事録になります。参考になればと思います。

まず、左メニュー、ファイルツリーが表示されているところを`Android`から`Project`に変更します。
![image](https://qiita-image-store.s3.amazonaws.com/0/60849/43bfa766-0c30-b2aa-a3a8-a355eb13f730.png)


srcフォルダにtestフォルダを追加し、パッケージとユニットテストのクラスファイルを追加します。
![image](https://qiita-image-store.s3.amazonaws.com/0/60849/a3e25bd0-7dd4-a485-af1c-b4cac8a2f628.png)


最後はbuild.gradleファイルにjunitとcom.android.support.testを追加し、syncします。

```build.gradle

...

dependencies {
    compile 'com.google.android.gms:play-services:10.0.1'
    
    ...

    // junitとcom.android.support.testを追加します
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    testCompile 'junit:junit:4.12'
}
```
Python > library > os > os.walk() > ディレクトリ構造を取得 / 指定ディレクトリ内の各ファイルパスを取得する実装

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.7.1を使用。
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
```

https://docs.python.org/3/library/os.html
をふと眺めていて気になった関数`os.walk()`。

> os.walk(top, topdown=True, onerror=None, followlinks=False)
Generate the file names in a directory tree by walking the tree either top-down or bottom-up. 

試してみた (on Python 3.6.0)。

### 準備

```
$ mkdir -p TOP/MIDDLE/BOTTOM
$ touch TOP/MIDDLE/mfile1.txt
$ touch TOP/MIDDLE/mfile2.txt
$ touch TOP/MIDDLE/BOTTOM/bfile1.txt
$ touch TOP/MIDDLE/BOTTOM/bfile2.txt
$ touch TOP/tfile1.txt
```

### code > os.walk()の結果を表示

```test_python_170327a.py
import os

res = os.walk(".")
for elem in res:
	print(elem)
	
```

```txt:結果
$ python test_python_170327a.py 
('.', ['TOP'], ['test_python_170325b.py', 'test_python_170327a.py'])
('./TOP', ['MIDDLE'], ['tfile1.txt'])
('./TOP/MIDDLE', ['BOTTOM'], ['mfile2.txt', 'mfile1.txt'])
('./TOP/MIDDLE/BOTTOM', [], ['bfile2.txt', 'bfile1.txt'])
```

### code > 各ファイルのパスを取得

https://docs.python.org/3/library/os.html
のサンプルコードを参考に以下のように実装した。

```test_python_170327b.py
import os

res = os.walk(".")
for elem in res:
	dirpath, dirnames, filenames = elem
	for afile in filenames:
		res = os.path.join(dirpath, afile)
		print(res)
```

```txt:結果
$ python test_python_170327b.py 
./test_python_170327b.py
./test_python_170325b.py
./test_python_170327a.py
./TOP/tfile1.txt
./TOP/MIDDLE/mfile2.txt
./TOP/MIDDLE/mfile1.txt
./TOP/MIDDLE/BOTTOM/bfile2.txt
./TOP/MIDDLE/BOTTOM/bfile1.txt
```

### code > refactoring後
(追記 2017/03/28)

```test_python_170328a.py
import os

for dirpath, dirnames, filenames in os.walk("."):
    for afile in filenames:
        res = os.path.join(dirpath, afile)
        print(res)
```

余分な処理を整理してすっきりしました。
DDX

## DDXの練習その1
ボタンを押したらテキストボックスに現在時刻が表示されるものを書いてみる

![01.png](https://qiita-image-store.s3.amazonaws.com/0/172316/f9d6d3a9-0410-6743-d290-875f5932adc7.png)

- 右クリック⇒変数の追加
> ![02.png](https://qiita-image-store.s3.amazonaws.com/0/172316/3fcb2b0a-56e8-439b-d15a-170703f754cc.png)

- 「カテゴリ」を「Value」に、
「変数の種類」を「CString」に、
「変数名」を適当に入力 ⇒「m_xv」で始まるのが慣習っぽい？
> ![03.png](https://qiita-image-store.s3.amazonaws.com/0/172316/8b42d324-9c59-832c-09bf-c88630e1323c.png)

- ボタンクリックイベントにコードを書く
最後の`UpdateData(FALSE);`で、コードからコントロールに反映されるので忘れないように！

```cpp:
void CTest01Dlg::OnBnClickedButton1()
{
	CTime time = CTime::GetCurrentTime();
	CString str = time.Format("%Y/%m/%d %H:%M:%S");

	this->m_xvEdit01 = str;

	UpdateData(FALSE);
}
```
Python > library > os > link関連 > os.link() / os.readlink() / os.symlink() / os.unlink()

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.7.1を使用。
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
```

https://docs.python.org/3/library/os.html

osライブラリにはOS関連のfunctionが多数あることはわかった。
この中で、自分が今作業しているものと関連するものだけ見てみた。

os.readlink()にてsymbolic linkを読めるということは教えていただいた。
では、linkの他の関数を含めてどうか。

http://qiita.com/7of9/items/132224132da34ca51d5f
の`test_python_170325b.py`を使って関数をリスト化する。

```
$ python test_python_170325b.py  | grep function | grep "link'"
('link', <built-in function link>)
('readlink', <built-in function readlink>)
('symlink', <built-in function symlink>)
('unlink', <built-in function unlink>)
```

上記の4つが関連しそうだ。

### os.link()

https://docs.python.org/3/library/os.html
> os.link(src, dst, *, src_dir_fd=None, dst_dir_fd=None, follow_symlinks=True)
Create a hard link pointing to src named dst.

### os.readlink()

https://docs.python.org/3/library/os.html
> os.readlink(path, *, dir_fd=None)
Return a string representing the path to which the symbolic link points.

### os.symlink()

https://docs.python.org/3/library/os.html
> os.symlink(src, dst, target_is_directory=False, *, dir_fd=None)¶
Create a symbolic link pointing to src named dst.

### os.unlink()

https://docs.python.org/3/library/os.html
> os.unlink(path, *, dir_fd=None)¶
Remove (delete) the file path.

### hard linkとsymbolic linkの違い

以下の説明が自分には分かりやすかった。

http://cmd.misty.ne.jp/environment/03.html
http://askubuntu.com/questions/108771/what-is-the-difference-between-a-hard-link-and-a-symbolic-link

今のところ、ほとんどsymbolic linkしか使っていない。

### 補足

`man ln`などで表示される`SEE ALSO`には`link(2)`と`symlink(2)`が表示される。

Pythonのos libraryがこれらコマンド名にのっとって付けられたかは知らない。
EC-CUBE 3.1ではurlから"html"がなくなる

EC-CUBE3.1では、DocumentRootの標準が`app/html`ディレクトリからルートディレクトリに変更されます。

3.0.xでは、ルートディレクトリをDocumentRootに指定した場合、アクセスするURLはhttp://xxx.example.com/html/ となってしまいました。

[URLからhtmlを削除する方法](http://doc.ec-cube.net/quickstart_remove-html)として`html`を削除する手順を提供していましたが、3.1からはこういった対応も不要になります。

[experimental/3.1](https://github.com/EC-CUBE/ec-cube/tree/experimental/3.1)のブランチで、phpのビルトインサーバを使う場合は、htmlディレクトリではなくcurrentディレクトリを指定するようにしてください。

```shell-session
cd ec-cube
php -S localhost:8080 -t ./
```

## 関連情報
- issue: https://github.com/EC-CUBE/ec-cube/issues/2232
- pull request: https://github.com/EC-CUBE/ec-cube/pull/2231
【Salesforce初心者】タブってなに？

最近Salesforceの勉強を始めた。

早速一つ理解に苦しんだものが出てきた。
「Tab」です。

今までなかった概念なので、試行錯誤しながら、なんとなく
「カスタムオブジェクトを追加するときに、それをUIで表示するように（≒ユーザが操作できるように）するための機能」。

作成したカスタムオブジェクトにTab（タブ）をつけてあげないと、UIで直接クリックして操作することができないぽい。つまり、レコードの追加や参照などもできない。
開発者はDeveloper Consoleから追加できるので、問題ないですが。。。

＊Consoleからレコードを追加するときの手順：
①”Select Id, Name, xxx(他に必要なフィルド)　from TestObject”でオブジェクト（テーブル）にアクセス 
②「Insert Row」をクリックし、一行空欄のレコードを追加する
③ID以外のところを入力する。（IDは自動的にシステムから振られる）
iOS 面試常見問題 - Layout 的方法

這個算是還滿常被問到的問題，
書面試題和面試都有被問過。

被問到的細節如下：

- 請問 iOS Layout 方法有哪幾種？
    - 例如： Layout programmatically, Storyboard, xib, Auto Layout in Interface Builder, Auto Layout by code, Size Class, etc.
- 你的用法是什麼？為什麼？
- 各有什麼優點及缺點？

不妨在日常開發之中多思考這個問題，也對程式碼的品質、專案撰寫速度、可讀性、可維護性都會有幫助。
物理サーバーのCentOS5を停止せずに強引にイメージ化

強引なやり方のため`fsck`覚悟。

## dd

1. 物理サーバーにssh
1. nfs や usbをマウント
1. `dd if=/dev/sda | gzip -c > /mnt/nfs/disk.dd.gz`

1TBで6時間くらいかかった。
ソフトウェアRAID1の場合、sdaとsdbとあるが、sdaだけddで良い。
ソフトウェアRAID0やRAID5などの場合はddどうするのかね。


## イメージの扱い

1. 元のディスクより大きいサイズのディスクを用意。(今回1TBのイメージだったので、2TBを用意した。)
1. `gzip -d disk.dd.gz`
1. `qemu-convert -O qcow2 disk.dd disk.qcow2`
1. disk.qcow2 を利用して 仮想マシンを(今回はkvmを使った) で起動
1. ストレージタイプは`virtio`を選びたいところだが、CentOSの起動時に以前のストレージタイプ(`sda`)を指定しているため、`sata`にする。ネットワークは無効にしておいたほうが良い。
1. DISKチェック。singleユーザーで起動
1. `fsck -y /dev/md1`
1. `reboot`

![erro.png](https://qiita-image-store.s3.amazonaws.com/0/25728/973e8bee-c436-6a56-5f04-612de4a06dc0.png)

無事起動したことを確認。

1. ログインできたらディスクの空きをゼロ埋めする。 `dd if=/dev/zero of=zero bs=1M; rm -f zero`
1. 仮想マシンを停止し仮想ディスクイメージをトリム。今一度`qemu-img convert -O qcow2 disk.dd disk.dd.trim`


## dd以外の方法

無停止の dd だとデーターの欠損が気になるため
[物理サーバをコンテナ化 (OpenVzの例) - Qiita](http://qiita.com/tukiyo3/items/a7ea4d21e6b2da3e200f)のようにtarで固めるか、

/boot/grub/menu.lst で `root=/dev/md1` と指定がある場合は適宜書き換える。

ソフトウェアRAID1の場合

* CentOS5 のDVDで起動しても /dev/md?? は認識しなかった。
* `clonezilla-live-20161121-yakkety-amd64.iso` (ubuntu 16.10ベース) だと /dev/md126, /dev/md127 で認識した。

![スクリーンショット_2017-03-27_08-47-07.png](https://qiita-image-store.s3.amazonaws.com/0/25728/c78ee130-58d9-e4de-94b6-fde66b5c3436.png)

```rb:旧DISKをマウント
mkdir rootdir
mount -o ro /dev/md126 old
mount -o ro /dev/md127 old/boot
```

```rb:新DISKをマウント
# CentOS5ではext4は使えない
mkfs.ext3 /dev/sdb1
mkfs.ext3 /dev/sdb2
mkswap /dev/sdb3

mkdir newdir
mount -o ro /dev/sdb2 new
mount -o ro /dev/sdb1 new/boot
```

```rb:DISKコピー
rsync -a old/ new/
sync;sync;sync
```

```bash:編集
/etc/mdadm.conf
/etc/fstab
/boot/grub/menu.lst
```

* CentOSのDVDから `linux rescue` で起動。
    * /mnt/sysimage に自動マウントされていない場合、/etc/fstabが間違っている。

```bash:
# mount /dev/sda2 /mnt/sysimage
# mount /dev/sda1 /mnt/sysimage/boot

cd /mnt/sysimage

# mount -o bind /dev dev
# mount -t proc none proc
# mount -o bind /sys sys

chroot .

grub-install /dev/sda
```

grubをインストールして起動確認

![grubinstall.png](https://qiita-image-store.s3.amazonaws.com/0/25728/dae14212-62ad-802e-7bfc-6895fc5bcf4e.png)

### 起動に失敗する場合

![スクリーンショット_2017-06-21_02-35-31.png](https://qiita-image-store.s3.amazonaws.com/0/25728/a5485dac-2435-e21c-0c73-030086211f75.png)

```bash:
## `switchroot: mount failed: No such file or directory`
で起動に失敗するなら 
# mkinitrd /boot/initrd-2.6.xx.x.img 2.6.xx.x
```

```diff:/boot/grub/device.map
- (hd0) /dev/sda
+ (hd0) /dev/vda
```

`grub-install /dev/vda`

sata -> virtio に変更も上記にて成功した。

## 手動でgrubセットアップ方法

```bash:手動でgrubセットアップ
# grub --device-map=/dev/null
device (hd0) /dev/vda
root (hd0,0)
setup (hd0)
quit
```
技術英語 > you'll finally [get down to brass tacks] / get down to business

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 2987 / 12833)

> you'll finally **get down to brass tacks**

http://ejje.weblio.jp/content/brass
> 真ちゅう、黄銅(おうどう)、真ちゅう器具、...

http://ejje.weblio.jp/content/tack
> びょう、留め金、タック、しつけ、仮縫い、方針、政策、帆の下隅(かぐう)索、上手(うわて)回し、間切り

http://ejje.weblio.jp/content/get+down+to+brass+tacks
> (もう直接関係のない話はよして)当面の問題を取り上げる、本題に入る

2000年頃にこのフレーズを初めて見たとき「tracks」と間違えて覚えていた。実は「tacks」だった。。。

<hr>
関連して思い出したのは
get down to business

http://ejje.weblio.jp/content/get+down+to+business	
> (本腰を入れて)仕事に取りかかる
Crosh Window なしでも Ctrl+N や Ctrl+P でイラつかなくなる方法

下書き公開。暇な時に加筆予定。

## 環境

「ChromeOS バージョン 57.0.2987.123 (64-bit)」

でもこれより前のバージョンでもたぶん同じ。
未来のバージョンのことはわからない。

## 方法

1. `Ctrl` + `Alt` + `T` でブラウザタブに crosh を表示させる。
2. メニューから `その他のツール` - `シェルフに追加` で crosh をシェルフ[^shelf]に追加する。
3. ダイアログが出てくるので、よしなに入力
4. シェルフに追加された crosh のアイコンを右クリックし、コンテキストメニューで「ウインドウとして開く」を選択

そのアイコンをクリックすれば Crosh Window と同じようなウインドウが開く。
`Ctrl` + `P` や `Ctrl` + `N` はブラウザにフックされない。

複数ウインドウを開きたければ、シェルフにある crosh アイコンを右クリックし「新しいウインドウ」を選択。RAM が許す限り何枚でも開ける。

[^shelf]: "シェルフ"は、他のデスクトップで"メニューバー"等で呼ばれているものの ChromeOS 方言。
Google検索と同じワードでツイート検索するブックマークレット

Googleの検索結果ページで使用すると、同じ検索ワードでツイート検索するブックマークレットをつくりました。

## ウェブ版でツイート検索
```js
javascript:window.open(`https://twitter.com/search?q=${encodeURIComponent(document.title.replace(/ - Google 検索$/,''))}`)
```
Google検索結果ページでブックマークレットを実行すると、Twitterウェブ版のツイート検索画面を開きます。

## Twitterアプリでツイート検索
```js
javascript:location.href=`twitter://search?query=${encodeURIComponent(document.title.replace(/ - Google 検索$/,''))}`
```
スマートフォン（iPhone、Android）で、Google検索結果ページでブックマークレットを実行すると、Twitterアプリのツイート検索画面を開きます。
URLスキームという仕組みで、通常は`http`や`https`などのプロトコルを指定するスキーム部に、`twitter`のようなアプリ固有のスキームを指定することで、そのアプリを開くことができます。
TwitterのURLスキームには複数のオプションがあり、今回はツイート検索画面を開く`search `を使用しています。
セキュリティを破られて人とシステムは強くなる MiniHardening#2.1参加レポート

# はじめに

Hardeningというイベントをご存知でしょうか。
[WASForum](http://wasforum.jp/)さんが運営するセキュリティ体験型イベントの名称で、
一言でいうと`"いきなりシステムを引き渡されて、今から攻撃するからセキュリティを高めて守ってみせろ"`というものです。

2017/3/26の"Mini Hardening #2.1"に初めて参加し、大変貴重な経験を得ることができたため、簡単にレポートします。
(本家Hardningが2日に渡って開催されるのに対し、Mini Hardeningは1日で終わります）

# 具体的な流れ

[connpassの概要を引用させて頂きます。](https://minihardening.connpass.com/event/51575/)

+ 10:30 会場受付開始
+ 11:00 ハードニング競技説明開始
+ 12:00 ハードニング競技スタート
+ 15:00 ハードニング終了・休憩
+ 15:30 競技の振り返り（注釈　ソフトニングとも言う）
+ 16:30 片付け
+ 17:00 懇親会

※実際の競技は3時間です。始まってしまうとあっという間に過ぎてしまいます。


# 何を得ることができるのか
「それは仲間です！！」と言いたいところですが、エンジニアとして成長に繋がったと感じたポイントを挙げます。
（実際に仲間も得られます）

* ハッキングされたという経験を得られる
* 普段扱うシステムが如何に守られているか/守られていないかを新しい目線で見られるようになる
* 己のスキル不足を痛切に感じ、向上心を揺さぶられる
* 基本動作の大切さに思い出す
* 個人でなくチームとして動く大切さを学べる

箇条書きにしてしまうと、あっさり終わってしまいますが、特にこれだと思うものにコメントします。

---

## ![image](https://qiita-image-store.s3.amazonaws.com/0/120707/9c9f3634-f988-9438-5caf-1ea040dda446.png)

今の時代、自分が"直接"扱うシステムをハッキングされた経験を持つエンジニアはどれだけいるでしょうか？
セキュリティを専門とする企業や部署などに所属しない限り、そういった機会を得ることはなかなか無いと思います。
Hardeningでは、ノーリスク(ここ大事)でその貴重な経験得ることができます。
私が参加した際は、通常の担当者が急病や出張で不在のため、緊急でアサインされたスーパーエンジニア(orz)としてシステムを引き継ぐ設定でした。
そしてシステム把握の苦しみと、見通しがつかない脆弱性と戦ううちに、攻撃者のハッキングが容赦なく襲ってくるのです。

気がつけば「rootアカウントが乗っ取られ」「アプリケーション(この時はWordpress)がまるごと削除され」サービスを継続できなくなっていました。

「システムオールレッド！！！！」な状況に愕然とし、屈辱に塗れながらタイムアップを迎えることになりました。

あえて言いますが![image](https://qiita-image-store.s3.amazonaws.com/0/120707/e3e4af3f-0264-c385-db81-3572108a0df1.png)

---

## ![image](https://qiita-image-store.s3.amazonaws.com/0/120707/52d38ef6-eb49-4374-2879-162ba45b04e5.png)

これも私も含めた参加者の多くが感じたことです。
インフラエンジニアの立場であれば自分が携わるシステムの構成を理解しており、
開発者であれば自分のアプリケーションを深く把握しているでしょう。

そして襲い来るインシデントを前に、FWがあり、IPS/IDSが動作し、監視ソフトウェアが問題を通知する仕組みを渇望することになります。失って分かる大切さというやつです。

そして競技終了後、WASForumのメンバーによる解説を聞き、今の自分が関わるシステムに足りないモノを見つめ直すことになります。

# 最後に
Mini Hardeningはセキュリティ初心者でも楽しめる素晴らしいイベントです。
参加しただけで一皮向けた気になります（個人の感想ですが）

専門家である必要はありません。
エンジニアとして、少しでもセキュリティに興味があれば参加する資格があります。

ぜひ、[Web Application Security Forum – WASForum](http://wasforum.jp/hardening-project/)の仮想ハッカー達にやられてみては如何でしょうか。
debファイルを端末から抽出する


Debianで、パッケージをインストールしてから消してしまっている場合。パッケージが削除されたか、何らかの理由でアップグレードしたくない場合に、再インストールにはパッケージを再生成する必要があります。

## 正攻法
dpkg-repackをインストールします。

```sh
# apt-get install dpkg-repack
$ fakeroot -u dpkg-repack PKGNAME
```

## Perlがない環境の場合
redeb.shを使います。
cf: http://modmyi.com/forums/general/713564-how-repack-dpkgs.html

```sh
#!/bin/sh
#
# redeb.sh - Command line utility for rewrapping installed Debian-packages
# Copyright (C) 2003 Tommi Saviranta <tsaviran@cs.helsinki.fi>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
#
# Version: redeb.sh v0.1.1 7-May-2003 tsaviran@cs.helsinki.fi

if [ $# -ne 1 ]; then
echo "Usage: $0 PACKAGE"
exit 0
fi

# See if such package is installed.
if [ ! -f /var/lib/dpkg/info/$1.list ]; then
echo "No such package installed."
exit 1
fi

# Create temporary directory.
mkdir "_${1}_"
cd "_${1}_"

# Get file list for this package.
for FILE in `cat "/var/lib/dpkg/info/${1}.list"`; do
test -f "$FILE" && echo "$FILE" >>filelist
done

# Copy files here.
tar -cf - `cat filelist` | tar -xf -

# Create package-info.
mkdir DEBIAN
cp /var/lib/dpkg/info/${1}.* DEBIAN
for FILE in `ls -1 DEBIAN`; do
REAL=`echo "$FILE" | cut -d '.' -f 2`
mv "DEBIAN/$FILE" "DEBIAN/$REAL"
done
test -f DEBIAN/list && rm -f DEBIAN/list

if true; then
	#Since iOS Cydia doesn't touch apt/dpkg cache stuff, dpkg status might be better here.
	dpkg --status $1|grep -v ^Status: >DEBIAN/control
else
	BEGPOS=`grep -nx "Package: $1" /var/lib/dpkg/available | cut -d ':' -f 1`
	TOTLENGTH=`wc -l /var/lib/dpkg/available | cut -d ' ' -f 1`
	tail -n `expr $TOTLENGTH - $BEGPOS + 1` /var/lib/dpkg/available >_control_
	LENGTH=`grep -nx "" _control_ | cut -d ':' -f 1 | head -n 1`
	head -n $LENGTH _control_ >DEBIAN/control
fi

# Get package info
VERSION=`grep -E "^Version:" DEBIAN/control | cut -d ' ' -f 2 | cut -d ':' -f 2`
ARCH=`grep -E "^Architecture:" DEBIAN/control | cut -d ' ' -f 2`

# Clean up.
rm -f _control_ filelist

# Create package.
cd ..
dpkg-deb -b "_${1}_" "${1}_${VERSION}_${ARCH}.deb"

# Clean up the rest.
rm -rf "_${1}_"
```

## あとがき

動機からしてDebianではありませんが、気にしないようにしましょう。
MySQL版pgbenchについて

(これは、自分にプレッシャーをかけるためのメモです)

2013年の2月にこんな記事を書いたのを思い出した。

「[MySQL版の pgbench ってないの？](https://thatsdone-j.blogspot.jp/2013/02/mysql-pgbench.html)」

当時、MySQLに軽く負荷をかけてみる必要が発生し、sysbench 付属のアレだともともとSQLレベルのdeadlockが発生する性質のものなので、当時やりたかったことには使えず、PostgreSQLのpgbenchみたいなお手軽なやつがないかなー…と思って探したら MySQLユーザー会の有志の方が昔(2004年!?)移植したものを発見し、2013年当時でも1行手直しするだけで動いたという話だった。

そして、続編がこれである。

「[python 版 mysqlbench](https://thatsdone-j.blogspot.jp/2013/03/python-mysqlbench.html)」

これは、当時 python の修行がてら上記の MySQL版pgbench(言語はC言語)を Python に移植しようと思ったのだった。

実は、上記がおいてある git repository には、さらに sqlalchemy を使って移植し(ようとし)たものも置いてあったりする。

仕掛中のまま放り出してあったのだが、この際ちゃんとまとめようよ > 自分

…というわけで、逃げられなくなった...w

(オチは(まだ)ありません(笑))
sharelatexで日本語を使う簡単な方法

#ShareLaTeX
オンラインでLaTeXを処理できるサービスのsharelatex
https://ja.sharelatex.com/

オンライン版で日本語を使う簡単な方法を見つけました。

#XeLaTeXを使う
1. ShareLaTeXのオプションでコンパイラをXeLaTeXにする
2. documentclassを\documentclass[a4paper,xelatex,ja=standard]{bxjsarticle}にして，bxjsarticleを使えるようにする。
3. あとは普通に日本語で書く

他の設定は特になくても，日本語が使えます。

ソースの例

```TeX
\documentclass[a4paper,xelatex,ja=standard]{bxjsarticle}
%\usepackage[utf8]{inputenc}
\usepackage{fontspec}
\usepackage{amsmath}

\title{test}
\date{March 2017}

\begin{document}

\maketitle
\tableofcontents

\section{Introduction}
\section{日本語}
\subsection{サブ}

\begin{align}
\int dx=x
\end{align}

\end{document}
```

#XeLaTeX+bxjsarticle
XeLaTeXの使い方はこの辺を参考にしました。
https://texwiki.texjp.org/?BXjscls#x483b172
CentOS7 + H2O + Let's Encrypt

```
# cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)
```

## H2O

[tatsushid/h2o-rpm](https://github.com/tatsushid/h2o-rpm)

```
# cat << 'EOF' >> /etc/yum.repos.d/h2o.repo
[bintray-tatsushid-h2o-rpm]
name=bintray-tatsushid-h2o-rpm
baseurl=https://dl.bintray.com/tatsushid/h2o-rpm/centos/$releasever/$basearch/
gpgcheck=0
repo_gpgcheck=0
enabled=1
EOF

# yum -y install h2o
# systemctl enable h2o
```

lotatelogs を使いたいので httpd もインストールしとく

```
# yum -y install httpd
```

Let's Encrypt とやりとりするする必要があるので、とりあえず http で動かす

```yaml:/etc/h2o/h2o.conf
user: nobody
server-name: h2o
pid-file: /var/run/h2o/h2o.pid
error-log: "| rotatelogs /var/log/h2o/error.%Y%m%d 86400"
access-log: "| rotatelogs /var/log/h2o/access.%Y%m%d 86400"
hosts:
  "*.oppara.tv:80":
    listen:
      port: 80
    paths:
      "/":
        file.dir: /srv/oppara.tv/htdocs
```

設定をチェックして起動

```
# h2o -t -c h2o.conf
# systemctl start h2o
```

## Let's Encrypt

https://certbot.eff.org/

```
# yum -y install certbot
# certbot certonly --webroot -w /srv/oppara.tv/htdocs -d oppara.tv -d www.oppara.tv --agree-tos
# ls -l /etc/letsencrypt/live
```

削除する場合は以下

```
# certbot delete --cert-name oppara.tv
```

H2O 設定

```yaml:/etc/h2o/h2o.conf
user: nobody
server-name: h2o
pid-file: /var/run/h2o/h2o.pid
error-log: "| rotatelogs /var/log/h2o/error.%Y%m%d 86400"
access-log: "| rotatelogs /var/log/h2o/access.%Y%m%d 86400"
hosts:
  "*.oppara.tv:443":
    listen:
      port: 443
      ssl:
        certificate-file: /etc/letsencrypt/live/oppara.tv/fullchain.pem
        key-file: /etc/letsencrypt/live/oppara.tv/privkey.pem
        cipher-suite: "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4"
        cipher-preference: server
    paths:
      "/":
        file.dir: /srv/oppara.tv/htdocs
  "*.oppara.tv:80":
    listen:
      port: 80
    paths:
      "/":
        redirect: "https://oppara.tv/"
```

```
# systemctl restart h2o
```

自動更新設定

dry-run

```
# certbot renew --post-hook "systemctl restart h2o" --dry-run

```
```
# crontab -l
03 05 01 * * /bin/certbot renew --post-hook "systemctl restart h2o"
```
【Splunk】ブラウザアクセスのGUI表示を日本語化

データ分析ツールであるSplunkをインストール後にブラウザアクセスしてみると全部英語になり、日本語に変更するためには、Splunk側の設定ではなくURLを変更します。

インストール後にアクセスするように指示されるURLにアクセスするとデフォルトでは下記URLを見に行きます。(ちなみに指示されるURLは`http://localhost:8000/`)

```
http://localhost:8000/en-US/app/launcher/home
```
このURLは英語表示であり、URLの`/en-US/`の部分を`/ja-JP/`に変更した下記にアクセスすると日本語表示になります。

```
http://localhost:8000/ja-JP/app/launcher/home
```
ちょっとおそまつな日本語な部分もありますが、全部英語よりは楽な部分もアルのではないでしょうか。
React Native初心者向け躓きメモ

## 始めに
React Nativeチュートリアルをしている最中に躓いた点の症状と解決方法をまとめます。初めてReact Nativeを挑戦される方の助けになれば幸いです。

## 問題

### androidコマンドが実行できない

#### 症状

```shell-session
$ android avd
The android command is no longer available.
For manual SDK and AVD management, please use Android Studio.
For command-line tools, use tools/bin/sdkmanager and tools/bin/avdmanager
```

#### 解決方法
[旧build\-toolsを使う方法　〜Android コマンドが使いたい〜 \- Qiita](http://qiita.com/Frog_woman/items/d1e6a6a3d1800f2c3a87)の記事を参考にすると解決できます。

### Application AwesomeProject has not been registered.

#### 症状

`react-native run-android` でアプリを起動した際に、以下エラーが表示されてしまう。

<img width="299" alt="Application AwesomeProject has not been registered." src="https://qiita-image-store.s3.amazonaws.com/0/29755/d3f82f25-d8da-1918-8df4-da2bf37ad9f7.png">

#### 解決方法

`react-native init AwesomeProject`でプロジェクトを作成しましたが、

```js
AppRegistry.registerComponent('HelloWorldApp', () => HelloWorldApp);
```

と別コンポーネント名を指定していたので

```js
AppRegistry.registerComponent('AwesomeProject', () => HelloWorldApp);
```

と指定しなおせば治ります。
個人的にあると作業効率が上がる最低限のbash設定

RedHatやCentOSを利用すると初期シェルはbashなので、個人的にあると便利な設定。

使用アカウントのルートにある`.bashrc`とかに下記を追加。

```bash:.bashrc
# cdでcdls関数を利用する
alias cd='cdls'

# 前方&後方一致検索
bind "\C-p":history-search-backward
bind "\C-n":history-search-forward

# cdコマンドの後自動でlsコマンドを実行する関数を定義
cdls () {
    \cd "$@" && ls
}

# Prompt画面の編集(色付き現在地表示付き)
PS1="\[\e[32m\][\u@\h \w]\\$\[\e[0m\] "
```

その後に設定ファイルを下のコマンドで読み込む。

```
$ . .bashrc
```
もしくは下記コマンド。（もちろん再起動でもOK）

```
$ source .bashrc
```

※追記
2019/06/06　プロンプト表示の設定を追加しました
Google App Script からの Google Spread Sheet 関数コール

# 結論

**「できない」**ぽい(?)

参考：[Stack Over Flow : How can I share my app script, between google spreadsheets?](http://stackoverflow.com/questions/26630318/how-can-i-share-my-app-script-between-google-spreadsheets)

- ライブラリとして公開する
- アドオンとして公開する
- Google App Script 側で完結するコードにする（←今度からこうしようと思いました

しかないようにみえます（調べた限りでは）．

# きっかけ

Excelでぺちぺちやるような処理を自動化したく Google App Script を初めて使ってみました．「じゃあExcelでやればいいじゃないか！」という突っ込みもありますが Javascript がそのままかける，ということで GAS でやってみました．

# 作ったもの

## 職場の御飯予約表

![1.png](https://qiita-image-store.s3.amazonaws.com/0/156705/e7e6d333-8250-0ebe-7e4f-2b5814d03be9.png)

- 共有されたシートに，希望者が個数を入力
- 締め切り時間になったら集計して担当者へ連絡
    - Spreadsheet にバインドしたscriptを時間トリガで呼び出し
- メールとは別に，担当者からは情報をスマホ経由で確認できるページを用意
    - こちらは App Script（Spreadsheetにバインドしない） + HTML で用意（Spreadsheet 全体を開かなくてもよいように）
    - Spreadsheet にバインドする/しない2つの違いは[こちら](http://qiita.com/t_imagawa/items/47fc130a419b9be0b447)がわかりやすいです. 

確認画面を App Script + HTML で作る際，すでに Spreadsheet 側にバインドした関数を呼びたい！となったのですが上記の通りでした...頑張って App Script だけで完結するようにコーディングしたほうが始末が良い気がします．

## 銀行振り込み記録（CSV）の弥生データへの変換

- 銀行WebサイトからダウンロードできるCSVファイルを弥生でインポートできるCSV形式に変換
    - [これ](http://tax.f-blog.org/yayoi/CSV-Import.html)の Spreadsheet 版です
    - 頼まれもの

別に Excel の VB マクロでもできるのでしょうが，普段見慣れている Javascript で書ける，というのは個人的には大きかったです．あと銀行振り込みの記録（例えば，"スイドウ", "XXガス", "YYデンリョク"）から勘定科目（"水道光熱費"）への変換も大体のものはいけました．変換の履歴を取り続ければ，ほぼ全部自動でできそうです．

# 使ってみて思ったこと

1. 見慣れた Javascript を使える
2. 外部連携が簡単・強力

とくに2が非常に強力だと思いました．定期実行やメール送信，所定のURLからデータを取得するなどの処理を簡単に記述できます．それゆえに**急に自分がスゴイ出来る奴**に思えてしまい，書いていてなんだか楽しかったです．

例えば今回作成した御飯予約表ではメールで人数を伝達でしたが，**電話APIのtwillioと連携して自動で出前注文** とかも簡単にできそうです．また後者の銀行振り込み記録についても，自動ログイン→ダウンロード→CSV変換までワンボタンで実行できるところまで落とし込めそうです．

# マクロボタン→カスタムメニュー

Excel だと「マクロボタンを配置」でスクリプトの呼び出しを簡素化しましたが，Spreadsheet では「カスタムメニューに追加」が良いように思いました．

```js:関数メニューを追加する例
// 日付を挿入
function insertDate() {
  var tSheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0];
  var tCell = tSheet.getRange(1, 1, 1, 1);  
  var tDate = new Date();
  // Cell[A:0]に今日の日付を追加
  tCell.setValue(tDate);  
}

// スプレッドシートメニューに追加
function onOpen(){
  var tSpreadSheet = SpreadsheetApp.getActiveSpreadsheet();
  var tMenuEntries = [{name: "日付を挿入", functionName: "insertDate"}];
  tSpreadSheet.addMenu("マイメニュー", tMenuEntries);
}
```
DiscoGANを使って「教師なし」でお米を数えてみる

#はじめに

[こちらで紹介](http://qiita.com/latte_/items/e4cb957fa82bd6279500)されていた**DiscoGAN**(Discover Cross-Domain Relations with Generative Adversarial Networks)
https://arxiv.org/abs/1703.05192
が「教師なし」でイメージ変換ができるということで、前にやってた[検出・カウント](http://qiita.com/samacoba/items/c4dd820648f4271381a0)を教師なしで試してみました。


ChainerでDiscoGANをすでに実装している方がいらっしゃったので、ほぼ使わさせていただきました。
[「chainerのtrainer機能を使ってDiscoGANを実装した」](http://www.monthly-hack.com/entry/2017/03/20/111614)

#やっていること
お米の数を数えるために、数えやすい形の画像に変換する「コンバータA⇒B」をつくります。
（これくらいの画像ならば、通常の画像処理を組み合わせれば簡単にカウントできますが、それは置いといて）

いままでと違うポイントは「ランダムに配置」した球の画像を１枚用意するだけで、学習ができます。
球の数は適当に決めましたが、お米の数とオーダはそれなりに合わせてあります。
お米の画像aを1枚、球の画像bを1枚を使って、学習させました。GTX1070で一晩ほどになります。


![20170326_学習 (1).png](https://qiita-image-store.s3.amazonaws.com/0/109458/788062c7-47e8-b4a9-41da-c02c6d9f40c6.png)


#学習結果
DiscoGANでは「コンバータA⇒B」と「コンバータB⇒A」をオートエンコーダを使って学習するので、位置の情報を保持したまま変換ができるようになってくれます。
お米⇒球、球⇒お米の変換にて、そこそこ位置があったまま変換できているようになっています。
![20170326_convert.png](https://qiita-image-store.s3.amazonaws.com/0/109458/16eb6795-29a6-a9a0-1466-badf863b1eb3.png)




#検出・カウント
今回お米の数を数えるので、球変換後の画像abの極大値の位置を抽出して、極大点の画像を作成しています。極大点の抽出にはMaxploolingを使ってます[（参考）。](http://www.slideshare.net/samacoba1983/chainer-63698486/8)元の画像に対し、極大点の位置に赤円を描画してみると、少し位置がずれているのと一粒に2点検出されている部分があるので、まだまだ調整が必要なところです。
![20170326_検出カウント (2).png](https://qiita-image-store.s3.amazonaws.com/0/109458/55a3cf19-d331-65b5-31da-e85841357f32.png)


#おわりに
ディープラーニングでは大量のデータが必要といわれることがありますが、今回も元画像は1枚（米106粒）で学習ができているので、形状が似ているものであればそれくらいのオーダで学習は可能なようです。

今回はとりあえず試しただけでしたが、この他、一部にヒントを与えたり、配置する球の間隔や数を調整することで、狙ったものを検出することもできると思います。また、今回は球は白のみですが、色を複数にすることで、複数の種類のものを同時に検出することも可能かもしれません。さらに、DiscoGANではそもそもドメインBの部分が「画像」である必要性はないはずなので、直接ほしいベクトル（例えばお米の中心点など）に変換することもできるのかもしれません。

また、作成したプログラムはこちらに置いておきます。細かいところは変更するかもしれません。
※GAN系は不安定なことが多いですが、これも何回か試すと学習に失敗することが結構あります。
https://github.com/samacoba/DiscoGAN_counter
Blenderにpipを入れる

# pipのもとをDL

- https://pip.pypa.io/en/stable/installing/

のget-pip.pyをDLする。

# macOSの場合

普通に2.78cをインストールした場合、以下のようにBlender内のPythonにDLしたget-pip.pyを実行させる。

```shell-session
/Applications/blender.app/Contents/Resources/2.78/python/bin/python3.5m ~/Downloads/get-pip.py
```

これで、Blender内にpipコマンドがインストールされる。

# Blenderにいれたpipを使うには


```shell-session
/Applications/blender.app//Contents/Resources/2.78/python/bin/pip install pillow
```

# 参考資料

- http://blender.stackexchange.com/questions/56011/how-to-use-pip-with-blenders-bundled-python

# 関連投稿

- [pyenvでpipで入れられないライブラリをインストールする時のオプション - Qiita](http://qiita.com/kjunichi/items/4b76d5b92e7e30927a7f)


# 関連記事

- [BlenderでPython使って最速降下曲線を描いてみる](https://abrakatabura.hatenablog.com/entry/2016/05/26/070858)
- [BlenderでエクスポートしたJSONがThree.jsで変な色になる問題が解決](https://abrakatabura.hatenablog.com/entry/2015/12/21/071507)
- [OSXのBlenderでctypesを試した](https://abrakatabura.hatenablog.com/entry/2015/01/31/091848)
- [blenderでgRPC(クライアント＆サーバ)を動かした](https://abrakatabura.hatenablog.com/entry/2019/03/18/212258)
Prometheusでnode_exporter実行時に「hwmon collector failed」とエラーが出る時の対処

Prometheusのnode_exporterをAWSで実行したところ次のようなエラーが出てしまった。

> ERRO[0033] ERROR: hwmon collector failed after 0.000016s: open /sys/class/hwmon: no such file or directory  source=node_exporter.go:91

node_exporterは[ここ](https://github.com/prometheus/node_exporter)に記載されているように既定で収集するデータが設定されています。
例えば、今回出てるエラーは、「hwmon」で、既定で収集される対象となっている。
「Expose hardware monitoring and sensor data from /sys/class/hwmon/.」となっている。

というわけで、AWS環境で取得しようがないデータは除外しないと、エラーとなるのです。

```
./node_exporter --collectors.enabled="conntrack,diskstats,entropy,filefd,filesystem,loadavg,mdadm,meminfo,netdev,netstat,stat,textfile,time,vmstat"
```

エラーが出るものを除外して、これぐらいとなった。
RustのファイルI/OにはBufReader, BufWriterを使いましょう、という話

Rustが得意なフレンズになりたくて、人の書いたCのコードを、Rustに写経しています。
で、作っていたら、ファイルI/Oが、悲惨なレベルで遅いことに気づきました。

```rust:とても遅いwrite
use std::fs;
use std::io::Write;
fn main() {
    let b = b"test";
    let mut f = fs::File::create("rs.dump").unwrap();
    for _ in 0 .. 100_000_000 {
        f.write(b).unwrap();
    }
}
```

```rust:とても遅いread
use std::{fs, mem};
use std::io::Read;
fn main() {
    let mut f = fs::File::open("rs.dump").unwrap();
    let mut b: [u8; 4] = unsafe { mem::uninitialized() };
    for _ in 0 .. 100_000_000 {
        f.read_exact(&mut b).unwrap();
    }
}
```

何が悪いか、分かりますか? まぁ、タイトル読めば分かりますよね。
実は、Rustのファイルのwrite, read_exactは、バッファリングされていません。
なので、このコードは、4バイトずつ読み書きするために10万回のシステムコールを呼び出します。
じゃあCのfread, fwriteは? そっちはバッファリングされているらしいのです。

https://linuxjm.osdn.jp/html/LDP_man-pages/man3/stdio.3.html
> 標準入出力ライブラリは、簡単かつ効果のよい、 バッファーリングされたストリーム入出力インターフェースを提供する。

ふぇぇ、manページの最初に書いてあるのに、知らなかったし、考えたこともなかった。

そういうわけなので。ファイルI/Oでは `std::io::{BufReader, BufWriter}` を使うとCと互角の速度になりました。

```rust:ふつうに速いwrite
use std::fs;
use std::io::{BufWriter, Write};
fn main() {
    let b = b"test";
    let mut f = BufWriter::new(fs::File::create("rs.dump").unwrap());
    for _ in 0 .. 100_000_000 {
        f.write(b).unwrap();
    }
}
```

```rust:ふつうに速いread
use std::{fs, mem};
use std::io::{BufReader, Read};
fn main() {
    let mut f = BufReader::new(fs::File::open("rs.dump").unwrap());
    let mut b: [u8; 4] = unsafe { mem::uninitialized() };
    for _ in 0 .. 100_000_000 {
        f.read_exact(&mut b).unwrap();
    }
}
```

## Special Thanks
本気で原因分からなかったので、StackOverflowで質問し、教えていただきました。
http://stackoverflow.com/questions/43028653/rust-file-i-o-is-very-slow-compared-with-c-is-something-wrong/43029048
Feelesでデスクトップ上の好きな画像を使う方法


## できるようになること

[HackforPlay](https://hackforplay.xyz)でステージを作るとき、パソコンの中の好きな画像を取り込んで、アイテムの見た目を変えることができます

今回作ったサンプルはこちら
https://www.feeles.com/p/iOCz

## 注意

画像を取り込むときは大きさに注意します。 **ひとマスの大きさは 32px です** 。なので、自分で画像を入れるときは 32px にするのが良いでしょう

## 画像をフォルダに入れる
- 左上のアイコンをクリックしてメニューを開く
- メニューからフォルダを開く  
- フォルダの中にあるパソコンのアイコンをクリックする  
![フォルダ](https://i.gyazo.com/1999385a0fda66ae643f94054014da22.png)

- ダイアログが出てくるので、使いたい画像を選んで決定ボタンを押す

これで Feeles の中に画像ファイルを入れることができました
次に、分かりやすくするため、 **画像ファイルの名前を変更していきましょう！**
    
- フォルダの一覧から追加した画像をさがして、ファイル名をダブルクリックする  
- ファイル名を変更できるようになったら、クリックしてカーソルをおく
- ファイル名を `gazou` に書きかえる  
![gazou](https://i.gyazo.com/f07d10094e73516af68198d916ace6cc.png)

- 入力らんの外側をクリックして、入力完了  


これで画像を中に入れることができました。次は、実際にその画像をゲームに使うところです。 **ここからはキットによって書くべきコードが違うので注意しましょう**

## アイテムの見た目を変える (HackforPlay RPGキットの場合)

- アセットから、なにかアイテムを出す（ここではハートにします）  
![ハート](https://i.gyazo.com/c539c4a070188c4c409340c7021dbfec.png)

- 次のコードを **コードの 4行目 に書く**

```javascript
game.preload('gazou.png'); // 画像をロード
```

- 次のコードを **アイテム（ここではハート）の下に書く**

```javascript
item2.image = game.assets['gazou.png'];

// ↑ item2 という部分は、画像を使いたいアイテムに合わせる
```

これでアイテムの画像を変えることができました！  
今回書いたコードの全体は、下の URL から見ることができます
https://gist.github.com/teramotodaiki/e6de42b36e21cc34c3c33cc7b443fd0b

最初にも書きましたが、サンプルはこちらです
https://www.feeles.com/p/iOCz


## おまけ 画像を背景に設定する

Feelesは背景画像を自由に変えられます。ゲームの背景ではなく、ソフト全体の背景です

- 背景画像に使いたい画像をフォルダに追加します
- ファイルの名前を `feeles/background.png` に変更します（JPGの場合は `feeles/background.jpg` に変更します）

以上で、画像が設定されます
Webアプリケーションエンジニアがディープラーニングに挑戦する際にやったこと(Coursera Week8)

# Coursera Week8
## はじめに
CourseraのWeek8を実施しましたので、私のメモを公開します。
Courseraってなんだ？という方は[Week1](http://qiita.com/KirariGlock/items/d41bdcc6f5ec5ad255fb)から御覧ください。
Week8では実践的な教師なし学習について学びます。

## Clustering
### K-means algorithm
クラスタリングで最もよく使われているアルゴリズム。
クラスタの重心を求めて調整することで正しくデータを分類するする。
入力パラメータは$K$と$X$。
$K$はクラスタリングの数。
$X$はトレーニングデータ。

### K-means optimization
$c^{(i)}$は$x^{(i)}$が現在どのクラスタに割り当てられているかを示すもの。
$\mu_k$はクラスタの重心$K$の場所を表す。
$$
J(c^{(1)},,,,c^{(m)},\mu^{(1)},,,,\mu_K)=\frac{1}{m}\sum_{i=1}^m||x^{(i)} - \mu_{c(i)}||^2
$$

### K-means initialization
K-meansの初期化はランダムで$m$を抽出して実施するが、抽出される$m$によっては良い結果にならない場合がある。
なので、ランダムで初期化する際に50~1000回程度K-meansの初期化とコスト関数(ディストーション関数)$J$を求める処理を実施する。
最終的にはループで得られた$J$の最小値を選択する。

### Choosing the Number of Clusters
クラスタの数を求める方法としてエルボー法がある。
エルボー法はクラスタの数を増やしながら$J$の値を確認していく。($J$の値はクラスタ数に反比例して減るはず。)
$J$の値の減り幅が急に小さくなったあたりが、適正なクラスタ数と考えられる。
ただし、$J$の値の減り幅が急に小さくならずに緩やかになってしまうケースもあり、その場合エルボー法では判断できない。

### Data Compression
データの次元を圧縮することで処理をしやすくすることができる。
2次元を1次元に、3次元を2次元に圧縮する。

### 主成分分析(PCA)
PCAは2次元にプロットされたデータの射影誤差が一番短い線を求めることができる。
これは二乗射影誤差を最小化するようなもので、各点と射影先の点の位置との距離の二乗を最小化するという条件で実施する。

PCAをする前にデータを平均標準化しておく必要がある。
また、データによっては正規化する必要がある。
やり方はほとんど教師あり学習の時と同じ。

データを$n$次元から$k$次元に削減したいとする。
まず共分散行列を計算する。
共分散行列は$\Sigma$で表すが、sumのシグマとは別物。
以下のようにSigmaを求める。
$$
Sigma = \frac{1}{m}\sum_{i=1}^n(x^{(i)})(x^{(i)})^T
$$

また、Ocataveでは以下のようにする。
Sigmaはn x nの行列。
Uもn x nの行列。
[U,S,V] = svd(Sigma);
Ureduce = U(:,1:k);
z = Ureduce' * x;
GCEにWordPress乗っけたらメモリが足りなかった件（解決済み）

サイトを移転してから暫く悩んでいたんですが、解決してみたらあっけなかった。  
Google Compute Engineはご存知の通りスペックがピンからキリまであるのですが、個人ブログを運用する程度ならもちろん一番安いスペックでも十分です。*チューニングをちゃんとすればね！*

2017/3/27　表現改訂と追記。
2018/3/2　Event MPMのチューニング話を追記

# Crucialな解決策

**Swap領域増やそう。**

GCEの一番安いやつはメモリ0.60GBです。

スワップ領域は一般にはメモリの2倍程度あれば良いらしいですが、デフォルトでは200MB程度しかありません。  
これだとWPの管理画面をうろうろするだけで500エラーが頻発します。カツカツなんで自然回復待ちだと何十分もサイトが落ち続けるし、再起動でもまたすぐにApacheの所為で逼迫して定期再起動が必要になります。

~~Swap領域の増やし方はググろう。~~
メモってなかったらインスタンス再起動でスワップが吹き飛んでしまって困った。下のページが参考になります。
http://landisk.kororo.jp/debian/14_swap.php

# 虚しい失敗策の数々

## PHPのmemory_limitを上げる

元々128Mと結構大きめに取っていましたが、256Mに上げました。

## Apacheの調整

KeepAlive周り。しかし初期値で既に最適化されていました。

## MySQLの調整

キャッシュやバッファの値を調整。

restartだとエラーが出るので、ApacheもMySQLもstopしてから起動させる。

## Zend OPcacheの有効化

メモリに効くかどうかわかりませんが高速になると聞いてやってみました。実際速くなりました。

`zend_extension=/...` は書くと「既に読み込まれている」旨のエラーが出たので削除。

参考にしたページのリンクだけ書いておきます。

- [CentOSのPHPを5.4から5.5にアップデート。OPcacheとAPCuも設定](http://www.karakaram.com/yum-update-php54-to-php55#install-opcache)
- [PHP 5.5 から導入された Zend OPCache を設定](http://www.checksite.jp/php55-zend-opcache/)

## Event MPMにする

スレッドセーフにPHPをコンパイルしてあったのでWorkerにしてみよう、と思ったらデフォルトで更に進化版のEventになっていました。

[Apache2.4からはデフォルトでEvent MPMになってるのに気付かなかった話](http://blog.wnotes.net/blog/article/apache-event-mpm)

最初に書いた「Apacheの調整」はWorker向けのだったので無駄でござった。

Eventの方でも少しずつ値を変えてチューニングしていましたが、結局決定打はSwapという…。

### 追記

記事投稿直後に頻繁に落ちるのでtop等でプロセス数の推移など観察してみた所、
やはり1番安いマシンではしんどいところもあるようです。

私の環境では結局以下のようにすることで、
投稿直後はCPU利用率が高くなり落ちることもありますが、2分程度以内に復旧するようにはなりました。

```
<IfModule mpm_event_module>
        StartServers             1
        ServerLimit              8
        ThreadLimit              4
        ThreadsPerChild          4
        MinSpareThreads          4
        MaxSpareThreads          16
        MaxRequestWorkers        32
        MaxConnectionsPerChild   0
</IfModule>
```

そんなに重い処理をするようなサイトではないはずなんですが、自作コードがそこらじゅうにあるので何かしらが足引っ張ってるのかも。
重くなるの投稿公開・編集した時だけだし。

# 独り言

もうちょっとやった操作とかメモ残しとけば良かった。
分類できなかった参考リンクだけメモ代わりに置いておきます。

- [WordPressでメモリを節約しつつ高速化する設定方法](http://taitan916.info/blog/?p=1733)