OmniAICreator/Qiita-1.07M huggingface dataset:
ubuntu14.04で/bootがいっぱいになって、カーネル更新が入ってapt-getが出来なくなった時

# 読む前に注意
- これで本当にあっているのか分かりません・・・
- 実際に作業したのはkubuntuです。
- 一応、現状動いています。

## 本編

訳あって社内で使っていたubuntuサーバーを急遽、ファイル共有で使う事に。
パパッとsambaを入れようとした所、apt-get updateすら出来ない状態に・・・

失敗したログを見てみると、ディスク容量がないよ！と言われました。
dfコマンドで確認してみると、/bootが100%に・・・

カーネルは/bootに入っているのですが、過去の分もすべて保存されているんですね。初めて知りました。

色々調べたんですが、apt-getコマンドが一切使えなくなっていたのでaptitudeコマンドを利用する事にしました。
まずはカーネルの掃除から

```.sh
$ dpkg --get-selections | grep linux-image
linux-image-3.11.0-26-generic			install
linux-image-3.13.0-45-generic			deinstall
linux-image-3.13.0-46-generic			install
linux-image-3.13.0-48-generic			install
linux-image-3.13.0-49-generic			install
linux-image-3.13.0-51-generic			install
linux-image-3.13.0-52-generic			install
linux-image-3.13.0-53-generic			install
linux-image-extra-3.11.0-26-generic		install
linux-image-extra-3.13.0-45-generic		deinstall
linux-image-extra-3.13.0-46-generic		install
linux-image-extra-3.13.0-48-generic		install
linux-image-extra-3.13.0-49-generic		install
linux-image-extra-3.13.0-51-generic		install
linux-image-extra-3.13.0-52-generic		install
linux-image-extra-3.13.0-53-generic		install
```

installが実際にインストールされているカーネルですね。
現在使っているカーネルは```$ uname -a```で見られますので、利用中のカーネルと保険でその一つ前のカーネルを残して全て掃除します。

```.sh
$ sudo aptitude remove linux-image-3.13.0-26-generic
```

と、地道にアンインストール・・・
linux-image-extraの方は、linux-imageのアンインストール時に一緒にアンインストールされます。

すべて終わった後、に一応一旦リブート。

```.sh
$ sudo apt-get update && sudo apt-get upgrade
$ sudo apt-get autoremove
$ sudo apt-get -f install
$ df
Filesystem                          1K-blocks      Used Available Use% Mounted on
/dev/mapper/seleniumUbuntu          478237616   8870212 445051296   2% /
none                                        4         0         4   0% /sys/fs/cgroup
udev                                  1007228         4   1007224   1% /dev
tmpfs                                  204512     13844    190668   7% /run
none                                     5120         0      5120   0% /run/lock
none                                  1022552        76   1022476   1% /run/shm
none                                   102400        20    102380   1% /run/user
/dev/sda1                              240972     71560    156971  32% /boot
```

これで/bootがかなり空きましたので、aptに溜まっていたキューを更新して、やっと目的のsambaを入れる事が出来ました。
当方Webプログラマーなのですが、あまり長々と一台のサーバーを利用し続ける事が無い為メンテナンスの知識がありませんでした。
VPS等々流行っている昨今、デザイナーでもサーバーを触る事もあるので一応忘備録として置いておきます。

間違っていた行動や勘違いしている知識等、気がついた方に訂正していただければ幸いです。
あまり使い込んでないcygwin環境備忘録

忘れないうちにメモ

```bash:.bashrc
# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# User specific aliases and functions

alias cp='cp -i'
alias rm='rm -i'
alias ls='ls --color=auto'
alias ll='ls -l'
PS1='[\[\e]0;\w\a\]\[\e[32m\]\u@\h \[\e[33m\]\W\[\e[0m\]]\$ '

sakura() { "/cygdrive/c/Program Files/sakura/sakura.exe" $(winpath $1) & }
win() { explorer $(winpath $1); }
```

cygwinパスからwindowsパスへの変換。
最初はゴリゴリと変換してたんですが、コメントで指摘され `cygpath` をベースにした物に変更。 
引数がからっぽの時に適当に対処するだけ。 どうせワンラインに収まるので .bashrc に一緒に書いてもよかったかもしれない。

```bash:winpath
#!/bin/bash

if [  -z $1 ] ;then
  echo $(cygpath -w $(pwd))
else
  echo $(cygpath -w $1)
fi

```

[ぼくのかんがえたさいしょうのvimrc](http://deris.hatenablog.jp/entry/2014/05/20/235807) を参考に

```vim:.vimrc

" 行頭・行末移動方向をキーの相対位置にあわせる
nnoremap 0 $ 
nnoremap 1 0 

" 挿入モードでのカーソル移動
inoremap <C-j> <Down>
inoremap <C-k> <Up>
inoremap <C-h> <Left>
inoremap <C-l> <Right>

" シンタックスの有効化
syntax enable

" タブまわりとか
set number
set ruler
set list
set listchars=tab:>-,trail:-,nbsp:%,extends:>,precedes:<,eol:<
set incsearch
set hlsearch
set nowrap
set showmatch
set whichwrap=h,l
set nowrapscan
set ignorecase
set smartcase
set hidden
set history=2000
set autoindent
set expandtab
set tabstop=2
set shiftwidth=2
set helplang=en

colorscheme desert

```
aws cliを夜間バッチ処理に組み込んだら、認証エラーになった時の解決方法

大した内容じゃないですが、備忘も兼ねて記述・・・。
よく考えてみれば、わかることだし、
こういう使い方するものではあまりないような気もするんだけど、ちょっとはまったので。

# バッチについて
AWS CLI S3のCpコマンドを使って、
夜中にAmazon S3からファイルをコピーするWindowsのバッチコマンドを作った。
コマンド自体は抜粋するとこんな感じ。

```lang:s3copy.bat
for /f "delims=" %%a  in (copyList.txt) do %%a
```
```lang:copyList.txt
aws s3 cp s3://buckets/対象ファイルA E:/対象ファイルA
aws s3 cp s3://buckets/対象ファイルB E:/対象ファイルB
```
前段で、copyList.txtを上記フォーマットで作ってあって、
それをひたすら読み込んで、S3のcpコマンドを実行している状態。

# バッチの実行
作って、テスト（手動実行）で問題なかったので、
いざ実行だと、
毎日0時に実行するように、
Windowsのバッチスケジューラに登録したら、
翌朝ログを見たら、以下のような出力が・・・。
```
Completed 1 part(s) with ... file(s) remaining
Completed 1 part(s) with ... file(s) remaining
```

要は、
**Amazonにアクセスできていない。**

無論、初期設定はできているし、
普通にバッチを実行しても、問題ない。

ただ、Windowsにログインしていない状態で実行すると、
上記のログが出てくる。

・・・サインアウト状態だと、認証情報が読み込まれない？？？
確かに、configやらcredentialsはユーザーのフォルダの中に格納されているから、
そのせいかなぁ・・・という結論になった。

# 解決方法

読み込まないなら、強制的にセットしてしまえと、
S3のCPコマンド実行前に、SETコマンドで環境変数に認証情報をセットした。
```
SET AWS_ACCESS_KEY_ID=アクセスキー
SET AWS_SECRET_ACCESS_KEY=シークレットアクセスキー
SET AWS_DEFAULT_REGION=region名
SET AWS_DEFAULT_OUTPUT=出力形式
```
こちらを参考しました、
[【AWS】CLIの初期設定について（認証情報とコマンド補完](http://www.task-notes.com/entry/20141026/1414322858)

認証情報がバッチコマンドにベタに書いてあるので、イマイチですが、
それで上手くいったので、とりあえず良しとします。
AWSトレーニング(Advanced Architecting on AWS)受講記録

[AWSトレーニング(Advanced Architecting on AWS)](http://aws.amazon.com/jp/training/course-descriptions/advanced-architecting/)を受講したので記録を残しておきます。

# 参加者

* 講師：テクニカルトレーナーの方1名(実例紹介などでソリューションアーキテクトの方1名)
* 受講者：15名くらい

# 受講内容

## 1日目

* AWSアカウント管理について
* 高度なネットワークアーキテクチャ
* ディスカッション1：3層構造のアプリ層で外部に通信していたがNATの障害を機にPublicIPを持つWeb層で通信を行うようにしたWebサービスの特徴と改善できるところは？
* AWSでの巨大なデータストアの設計

## 2日目

* ラボ1：Data pipelineの利用
* Webのスケールするアプリケーション
* ディスカッション2：RDSを利用しているゲームサービスでデータベースの性能がネックになっているのを改善するにはどうしたら良いか？
* フォールトトレランス構築
* クラウドセキュリティとコンプライアンス 
* ラボ2：Route53でのRouting PolicyのFailoverとWeighedの利用

## 3日目

* AWSでのデータセキュリティと暗号化
* パフォーマンスのための設計
* ディスカッション3：要求を満たすサービスを設計する 

# 所感

* アソシエイトレベルのトレーニングはAWSを体系的に学んで各サービスの理解するという感じだが、プロフェッショナルは大規模なサービスをAWSで運用する知識を習得する感じだった
* 前提となるIT知識も多く求められレベルが高いと感じた
* 新しく更新されて始まったトレーニングだけあって内容が新しい(まだ)
* 教科書が英語なので日本語にしてほしい
AWSでバックアップとらずにchmod 777 -R / して再起動しまったとき

#経緯
???「AWSにSSHでつなげない」
???「立てたばっかでバックアップとってなかった･･･。」
???「で、原因わかんないけど対応任せて良い？」
ぼく「わかりました（ころすぞ）」

#原因
`chmod 777 -R /`してインスタンス再起動してたせいでsshdこけてた。

#対策その1（インスタンス停止～ディスクのデタッチ）
1.インスタンス止めてディスクをデタッチ
2.止めたインスタンスと同じアベイラビリティゾーンでインスタンス立てる
3.立てたインスタンスにデタッチしたディスクをアタッチ

#対策その2（マウント～設定）
1.接続したディスクをマウント（そのままマウントしておｋ）
`sudo mount /dev/接続したデバイス名 マウントする位置`
2.権限を設定( / はマウントした位置に読み替える)
・全部を755に
　`chmod 755 -R /`
・SSHの設定ファイルの権限
　`chmod 700 -R /etc/ssh`
・/home直下の権限
　`chmod 700 -R /home`
・suの権限
　`chmod u+s /bin/su`
・sudoの権限
　`chmod u+s /usr/bin/sudo`

#対策その3(再アタッチ～確認)
1.インスタンスからディスクをデタッチ
2.止めてたインスタンスにルートボリュームとしてアタッチ
3.インスタンス再起動
4.SSHでつないで確認
これでいけた。

#結論
なにかあったらまずシステムログを見ましょう
バックアップをとりましょう

#参考
http://qiita.com/yuppi/items/ceed29f19e2b38fd0a79
http://takuya-1st.hatenablog.jp/entry/20090216/1234742055
http://ubuntuforums.org/showthread.php?t=2222715
Ethereumのプリセールで買ったEtherをインポートする方法

以下に移行しました<br><a href="http://block-chain.jp/tech/import-presale-ether/" title="Ethereumのプリセールで買ったEtherをインポートする方法">Ethereumのプリセールで買ったEtherをインポートする方法</a>
node.jsのhttp.requestでバイナリをBufferに格納する

任意URLのバイナリファイルをBufferで取得する方法。

古い方は非推奨の指定があるのでこちらで。

```
const http = require('http');
var options = {}; //いろいろ入ってるでしょう。
var req = http.request(options,
  function(res) {
    // Bufferの配列。
    var data = [];
    res.on('data', function (chunk) {
      data.push( chunk ); 
    });
    res.on('end', function () {
      // dataにはBufferがいくつかあるので、concatで結合可能。
      var buf = Buffer.concat( data );
    });
  });
req.end();
```

また単にダウンロードなら次のような形でも取得可能です。

```
import http from 'http';

http.get( 'http://...', function (res) {
    const data = [];
    res.on('data', function (chunk) { data.push( chunk ); });
    res.on('end', function () {
      const buf = (res.statusCode === 200) ? Buffer.concat( data ) : null;
    });
  });
```

----

古い

## バイナリを結合したい
node.jsにてhttp.requestを使ってデータを受け取る際、chunkでデータを受け取れるが、これはres.setEncoding('binary')指定時にはバイナリのある程度つまった変数となる。
これをそのまま文字列の時のように+=でつなげばバイナリが壊れ、どっかのサンプルにあるようにchunkを配列に入れてあとでBuffer.concatしてもchunkはBufferじゃないので失敗してしまう。

そんな状況でバイナリをBufferに格納する。

```
const http = require('http');
var options = {}; //いろいろ入ってるでしょう。
var req = http.request(options,
  function(res) {
    // バイナリで受け取る。
    res.setEncoding('binary');
    // Bufferの配列。
    var data = [];
    res.on('data', function (chunk) {
      // chunkをBufferに変換。
      // ちなみに'binary'指定は非推奨らしい。代わりに何使えばいいんだろう？
      data.push( new Buffer( chunk, 'binary' ) );
    });
    res.on('end', function () {
      // dataにはBufferがいくつかあるので、concatで結合可能。
      var img = Buffer.concat( data );
    });
  });
req.end();
```

こんな感じで、imgには無事バイナリデータ(Buffer)が格納されました。

もうnode.jsでバイナリいじりたくないよぉ。
mysqlで遊んでみる。


参考URL
http://qiita.com/hkusu/items/cda3e8461e7a46ecf25d


ドットインストール
mysql入門。


他に理解した方が良いことはなんだろう？？


ver mysql: stable 5.6.26 (bottled)

MYSQLの起動 mysql.server start
MYSQLの停止 mysql.server stop
rootユーザー(特別)で全てのdatabaseにアクセスできる　mysql -u root


##作業ユーザーの作成、
あるDBに対してのみ使用できる作業ユーザーを作る。(rootユーザーは全てのDBにアクセスできるため、間違った操作を行うと他のDBに悪影響を与えるため。)


手順
・mysql -uroot -pでアクセス
・rootユーザーでDBを作る。create database blog_app;
(DBを作る時は、rootユーザーでなければ作れない。)
・grant all on blog_app.* to dbuser@localhost identified by 'a0i4k1o5';

意味
dbuser@localhostというユーザーにblog_appというDB配下の全てのテーブルに対する許可(DB操作の許可)を与える。
grant all on.許可を与える。
blog_app.* blog_appというDB配下の全てのテーブルに
dbuser@localhost　というユーザー

##テーブルを操作しよう

create table users (
  id int,
  name varchar(255),
  email varchar(255),
  password char(32)
  score double,
  sex enum('male'),
  memo text,
  created datetime
);

  sex enum('male'),
  memo text,
  created datetime

MYSQLのフィールドに指定するデータ型
int, integer(整数型)
varchar(文字列型) 
cnar(文字列型)

show tables　テーブルがみれる
drop table users; 対象のテーブルを消去

##扱えるデータ型に関して

数値
・integet 整数
・double 浮動小数点数

文字列
・char あらかじめ文字列の長さが決まっている
・varchar ある程度の文字列に変更したい時。
・text どれくらいの文字列にするのか決まってないとき

日付
・date 日付
・datetime 日付と時間

それ以外
・enum 列挙型　あらかじめ選択肢を決定しておく。
FuelPHPでcronから定期実行をする方法

FuelPHPでcronから定期実行をするにはTaskをつかうと良いみたい

こんな感じで/fuel/app/tasksの中にTaskファイルを作成
useで使うクラスを読み込めばControllerと同じようにDBへの接続ができます。

```php:/fuel/app/tasks/test.php
<?php
namespace Fuel\Tasks;
use Fuel\Core\Cli;
use Fuel\Core\DB;
use Fuel\Core\DBUtil;
use Curl\CurlUtil;
 
class Test
{
    public function run()
    {
        echo "実行する処理";
    }
    
    public function get_user($name = "nanashi_san")
    {
        echo DB::select('*')->from('users')->where('name', $name)
    }
}
?>
```

これでTestという名前のタスクができあがります。
タスクはコマンドラインで実行可能！
メソッドを追加して個別に呼び出したり、引数を加えることもできます。

```bash
$ php oil refine test
$ php oil refine test:get_user "narita_keisuke"
```


あとはcrontabにコマンドを追加してあげるだけ

```bash
$ crontab -e
0 * * * * php /var/www/oil refine test
```

これで１時間毎に定期実行されます。
テーブルにランダムな値を設定する(SQL Server/T-SQL編)

テストデータ作成するのに困ったので覚え書き

###任意のテーブルに対してランダムな値を設定するためのT-SQL文

※主キーが数値型で設定されていることが条件(連番ならなお良し？)
値を放り込むための行はあらかじめINSERTしておくこと(中身は空でよい)

####全行に対してランダムに値を設定
一行毎にINSERT,RAND()が走るためなんだかんだ言って行数が多いと時間はかかる

```sql:SetRandomValue1
DECLARE @counter int
DECLARE @lastKeyValue
SET @counter = 0
SELECT @lastKeyValue = MAX([主キー列]) FROM [テーブル名]
WHILE @counter <= @lastKeyValue
BEGIN
	UPDATE [テーブル名] SET
		[更新列名] = [適当なランダム値]
	WHERE
		[主キー列] = @counter
	SET @counter = @counter + 1
END
```

####ある程度まとまった行数に対しての同一のランダム値を設定
全行別々だと不都合という場合に。
上記からキー値を剰余でグループ化しただけ。
`@seed`には固定値を入れてもよい。その場合はどれくらいの粒度でグループ化するか固定できる。
あと、INSERT,RAND()が走る回数が減るので上記より速い。

```sql:SetRandomValue2
DECLARE @counter int
DECLARE @seed int
SET @counter = 0
SET @seed = CONVERT(int, (CEILING(RAND() * [適当な数値])))
WHILE @counter < @seed
BEGIN
	UPDATE [テーブル名] SET
		[更新列名] = [適当なランダム値]
	WHERE
		[主キー列] % @seed = @counter
	SET @counter = @counter + 1
END
```

###ランダム値の設定方法の一例

```sql:RandomItem
SELECT
	--文字列
	CONCAT(
		--必要な文字数分繋げる
		SUBSTRING('abcdefghijklmnopqrstuvwxyz0123456789', CONVERT(int, (CEILING(RAND() * 36))), 1),
		SUBSTRING('abcdefghijklmnopqrstuvwxyz0123456789', CONVERT(int, (CEILING(RAND() * 36))), 1)
		)

	--数値(0～設定した最大値)
	CONVERT(int, (CEILING(RAND() * [取得したい最大値])))
```

上手いこと工夫すれば外部キー制約とかチェック制約にも対応できそう
Linq to Entityで複合キー内部結合(inner join on malutiple column for linq to entity)

このようなSQL

```lang:複合.sql
SELECT a.* FROM tableA inner join tableB 
on 
tableA.Id = tableB.Id
and
tableA.Code = tableB.Code
```

```lang:chain_code_join.cs
var test = context.tableA
.Join(context.tableB,
    (a) => new {a.Id,a.Code},
    (b) => new {b.Id,b.Code},
    (a,b) => a
);
```

↓chain codeじゃない版（動かしていない自信なし（大体こんな感じ））

```lang:chain_code否_join.cs
var test = from a in context.tableA
    join b in context.tableB 
    on
      (a) => new {a.Id,a.Code}
    equals
      (b) => new {b.Id,b.Code}
    select a;
```

ちなみに名前が違うcolumn同士を結合しようとすると意味不明のエラーが出る。
↓エラーになります。

```lang:error.cs
SELECT a.* FROM tableA inner join tableB 
on 
tableA.Id = tableB.tableAId
and
tableA.Code = tableB.tableACode
```

こんな時はエイリアスを用意してやらないといけない。
↓エイリアスで指定するとうまくいく例

```lang:filename
var test = context.tableA
.Join(context.tableB,
    (a) => new {Id = a.Id,Code = a.Code},
    (b) => new {Id = b.Id,Code = b.Code},
    (a,b) => a
);
```

スター型の例

```lang:filename
var test = context.tableA
.Join(context.tableB,
    (a) => new {Id = a.Id,Code = a.BCode},
    (b) => new {Id = b.Id,Code = b.Code},
    (a,b) => new { a, b})
.Join(context.tableB,
    (ab) => new {Id = ab.Id,Code = ab.CCode},
    (c) => new {Id = c.Id,Code = c.Code},
    (ab,b) => new { ab, b})
);
```
という感じになります。

ビバ！りんくとうえんてぃてぃ！

MSDNのAPIライブラリはすごい網羅しているのに別言語に変更したくなるくらい読みにくいのである。
https://msdn.microsoft.com/ja-jp/library/Bb311040(v=VS.120).aspx
IEで埋め込んだFlashのスクリプトが動作しない

swfobjectを使ってSWFファイルを埋め込んだのですが、
スクリプトが全く動作しませんでした。

BGM再生用のFlashだったため、
Flashの要素を表示しないようにCSSをいじったのですが、
どうやら、

```css
visibility: hidden;
```

を付けていると、IEでActionScript自体動かないようです。
別の方法でFlashを表示しないようにしたらちゃんと動作しました。
Maven で Plugin の usage を確認する


普段 Maven の山のようにある Plugin の使い方がわからないときに、ググって解決してたのですが、よろしくないなと思ったので usage を出す方法を調べました。

## Maven Help Plugin の describe goal を使う

例えば Exec Maven Plugin の usage を見たい場合は以下のようになります。

```console:console
$ mvn help:describe -Dplugin=exec
Name: Exec Maven Plugin
Description: A plugin to allow execution of system and Java programs
Group Id: org.codehaus.mojo
Artifact Id: exec-maven-plugin
Version: 1.4.0
Goal Prefix: exec

This plugin has 3 goals:

exec:exec
  Description: A Plugin for executing external programs.

exec:help
  Description: Display help information on exec-maven-plugin.
    Call mvn exec:help -Ddetail=true -Dgoal=<goal-name> to display parameter
    details.

exec:java
  Description: Executes the supplied java class in the current VM with the
    enclosing project's dependencies as classpath.

For more information, run 'mvn help:describe [...] -Ddetail'
```

help も plugin なのが maven エコシステム流なのですね。

なお、出力の末尾にも書いてありますが `-Ddetail` で詳細情報（Plugin 固有のJava システムプロパティなど)が得られます。

Exec Maven Plugin の全貌ではなく `mvn exec:java` だけが知りたいんだ！という場合は `-Dgoal` で goal 名を指定します。

```console:console
$ mvn help:describe -Dplugin=exec -Dgoal=java
exec:java
  Description: Executes the supplied java class in the current VM with the
    enclosing project's dependencies as classpath.

For more information, run 'mvn help:describe [...] -Ddetail'
```

`-Dplugin`, `-Dgoal` の代わりに `-Dcmd` でまとめて書くこともできます。

```console:console
$ mvn help:describe -Dcmd=exec:java
```

## help goal
ちょっとこれだと覚えるのが大変そう、と思っていましたが、最近の [Maven Plugin は help goal を生成する](https://maven.apache.org/guides/mini/guide-configuring-plugins.html#Help_Goal)そうなので、こちらを使うとシンプルに書けるのでした。

```console:console
$ mvn exec:help
```

もちろん、`-Ddetail`も、`-Dgoal` も使えます。

```console:console
$ mvn exec:help -Dgoal=java
```

`mvn help:describe -Dcmd=exec:java` とさして変わらない長さになってしまった気がしますが忘れましょう。

## phase 名で実行される plugin を知りたい
これで万全、と思ったのですが、まだ困るケースがありました。
Maven は `mvn test` や `mvn compile` のように `mvn <plugin>:<goal>` の形式ではなく、`mvn <phase>` の形式でも実行できます。
`mvn test` とすると `mvn surefire:test` が動くのですが、この関連はちょっと覚えるのが難しいですね。ググると公式のドキュメントに[対応表](https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Packaging)がありました。これを覚えるか紐解くかしないといけないのは大変だと思ったのですが、`mvn` コマンドですぱっと調べる良い方法がわかりませんでした。
`mvn help:effective-pom` を使えば phase と goal の関係がわかるといえばわかるのですが、XML を人間が読むのはちょっとキツいので今後の課題としたいところです。

## 所感
ちょっと Maven の usage 見たいなと思っただけで、ここまで連れて行かれる JavaWorld の広大さを久々に感じました[^1]。

[^1]: その前はちょっとログファイルでも作るかと思ったときに広大な世界を感じました。
Emacsのfly-checkをel-getでインストールする場合に必要なmakeinfoをインストールする


## 状況

Emacsのfly-checkをel-getで入れようとすると、makeinfo関連のエラーが出る。makeinfo 5以上があると良いっぽいが、yumやapt-getだとmakeinfo 4系統が入ってしまい、結局makeできないので手動でmakeするしかない。

makeinfoを使えるようにするにはtexinfoというパッケージを入れればいいので

```shell
$ sudo yum install texinfo
```

などとしてみるのだが、

```shell
$ makeinfo --version
makeinfo (GNU texinfo) 4.13

Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
```

と、かなり古いmakeinfoが入ってしまう。

## 今回の環境

* Scientific Linux


## 古い makeinfo を消す

```shell
# （必要ならば）古いバージョンのmakeinfoを消す
$ makeinfo --version
makeinfo (GNU texinfo) 4.13

Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

$ which makeinfo
/usr/bin/makeinfo
$ sudo rm /usr/bin/makeinfo
```


## texinfoのダウンロードと解凍、make

http://ftp.gnu.org/gnu/texinfo/ から欲しいバージョンの texinfo.tar.gz を探してきて、URLをコピーする。今回は texinfo-5.2.tar.gz を入れることにした。

以下の順で実行した。

```shell
$ wget http://ftp.gnu.org/gnu/texinfo/texinfo-5.2.tar.gz
$ tar xvf texinfo-5.2.tar.gz
$ cd texinfo-5.2
$ ./configure
$ sudo make
$ sudo make install
```


これで flycheck のコンパイルが通った。幸せ。
Elasticsearch のホスティングサービス Found の ACL の設定

Elasticsearch のホスティングサービス [Found](https://www.found.no/index.html) の ACL の設定について調べたのでメモ。

![スクリーンショット 2015-08-07 12.13.12.png](https://qiita-image-store.s3.amazonaws.com/0/19869/1329dd98-5f18-2cdb-3464-ae63105660d7.png)


Clusters > Access control のページに行き、このページの「Load into editor」ボタンを押すと、以下のようなデフォルトの設定を生成して、ページ上のエディタに読み込んでくれる。

```yaml

# Deny everyone by default, as authentication is required.
# Deny is the default also if no "default" is specified,
# so it's only necessary to specify it if you want the
# default to be "allow".
default: deny

auth:
  users:
    # Here are the username/passwords.
    # We generated random passwords for you. You can use these.
    # Do NOT reuse your existing password, as they are saved in clear text.
    # Consider the passwords to be API-keys and the usernames to be descriptions.

    # Note: If dynamic scripts is enabled, you must fully trust whoever you grant search-access.
    searchonly: ul2dp11vxwi
    readwrite: qdmh5dhs6ga

rules:
  - paths:
      # Match all search requests.
      - '/_search|/([^_/]+/_search)|/[^_/]+/[^_/]+/_search'
    conditions:
      - basic_auth:
          users: [searchonly]
    action: allow

  # Also, allow any GET-request.
  - paths: ['.*']
    conditions:
      - basic_auth:
          users:
            - searchonly
      - method:
          verbs: [GET]
    action: allow

  # Allow everything for the readwrite-user
  - paths: ['.*']
    conditions:
      - basic_auth:
          users:
            - readwrite
# Uncomment the following if you want to require SSL.
#      - ssl:
#          require: true
    action: allow
```
ユーザー認証は、basic認証で行われる。ユーザーの定義は、`auth` -> `users`下で行い、`rules`下の`conditions`->`basic_auth`で、どのユーザーに権限を与えるかを記述する。

また、`conditions`下では、ユーザー以外に、HTTPSエンドポイント使用の強制や、アクセス元IPアドレス制限などの制約も記述できる。また、`basic_auth` を設定せずに、アクセス元IPアドレスの制約だけにすることもできる。これについての詳細は[ドキュメント](https://www.found.no/documentation/security/access-control/#conditions)に書かれている。

基本的に、生成されたものをベースにして、それをカスタマイズしていくと良いと思う。例えば、IPアドレス `123.456.789.000` からユーザー`johnny` が HTTPSエンドポイントにアクセスしてきた場合に、すべての操作を許可するには、以下のように設定する。

```yaml

default: deny

auth:
  users:
    johnny: qdmh5dhs6ga

rules:
  - paths: ['.*']
    conditions:
      - ssl:
          require: true
      - basic_auth:
          users:
            - johnny
      - client_ip:
          ips:
            - 123.456.789.000
    action: allow
```

ひとつ途中で躓いたのが、大抵の箇所は空白2つのインデントで良いのにもかかわらず、`ssl`下の`require: true` や `basic_auth`下の `users:` などは、空白4つでインデントしないと設定に反映されなかったこと。なぜだか分かる方教えてください。。。

#### 参考
[Access Control - Found by elastic](https://www.found.no/documentation/security/access-control/#conditions)
Raspberry piとApacheとWebカメラで外部から見られる監視カメラを作った話。

Raspberry piの環境構築の話とメモ

Webカメラを監視カメラとして利用したいなーと思ってWebサーバーを構築していますが、やっとできたのでメモ書き

**やりたかったこと：**
外からRaspberry pi に接続しているWebカメラにアクセスして画像情報を見られるようにする。

**用意したもの：**
・Raspberry pi(+電源とか、raspiを動かすために必須なもの)
・DDNS
・Apache(Webサーバ)
・mjpg-streamer(ストリーミングサーバ)
・Webカメラ

では書いていきます。

----
**DDNSの取得と設定**
http://ieserver.net/ にて取得。
cronに http://ieserver.net/ddns-update.txt を.txtから.plにして登録。
一定の間隔で実行されるようにしておく(自分の場合は15分刻み)
これでxxxxxx(任意).dip.jpにIPをひも付けます。

----
**apacheをインストール**
sudo apt-get install apache2
だけ。
Webサーバのルートをデフォルトで /var/www　に変更したのでhtmlファイルなどはそこに置くことで、Apacheを起動させとりあえずローカルからに限定されるけどアクセスできるようにする。

----
**mjpg-streamerのインストール**
$ svn co https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer mjpg-streamer
$ cd mjpg-streamer
$ sudo make install

でインストール完了。(インストールでパーミッション注意)

----
**ストリーミングサーバーを起動する**
・ターミナルからオプション指定して起動するか、
・シェルスクリプトを書くか
のどちらか。

今回は、ターミナルからオプションをいちいち指定するのは面倒なため後者を採用
=>シェルスクリプトの例文はこちらに載っています。
( http://make.bcde.jp/category/28/#content75 )
※ここでは8080ポートを起動させているのでそれに従って以下を書いていきます。
これを sh start_server.shで起動するとストリーミングサーバを起動させることができます。

----
ルータのポートの設定
外部からxxxxxx(任意).dip.jpにアクセスした時にRaspiにアクセスできるようにします。
インターネット側から特定のポートにアクセスした場合、指定したローカルアドレスに転送するということです。

ルータの設定は各メーカで違うのでそれは解説できませんが、今回の場合
・接続元IP→Raspberry piのローカルIP ポート番号80 (Apacheで立てたWebサーバ用)
・接続元IP→Raspberry piのローカルIP ポート番号8080 (mjpg-streamerのストリーミングサーバ用)
の２つをポートマッピング設定できればいいと思います。

----
以上で、
・DDNSを使ってホスト名にIPを割り当てる
・Webサーバを立てる
・Webカメラのストリーミングサーバを立てる
・外部からアクセスできるようにする。
が一通りできたと思います。



これで、すでに外部からのカメラ画像の表示はできているわけですが、表示方法に２種類ありまして
・mjpg-streamerがもともと用意しているHTMLファイルにアクセスする
・mjpg-streamerからストリームを取得してそれを表示する自作のHTMLファイルを用意する。
の２種類です。
前者は単純に http://設定したDDNSのホスト名:8080 でアクセスすれば見られます。とりあえずカメラの性能とか見たい場合はこちらを選択する感じで。
ただ、僕はカメラ画像だけではなくていろいろWebに表示させたいなーということを考えてたので後者を選択します。

----
**HTMLファイルを構築する**
といっても０からではなくて、mjpgstreamerにサンプルが幾つか用意されているのでそれを使うのがおすすめです。
いろいろサンプルはありますが、個人的なおすすめはJavaScriptのサンプルです。
http://設定したDDNSのホスト名:8080/javascript_simple.html にあるので見てください。

とりあえずそのソースを引っ張ってきて、あとは自分の好きなようにHTMLレイアウトを決めればいい感じに表示させることができます。

----
**おまけ**
Raspberry piでXwindow開いてブラウザでいろいろ調べたりしながら作業すると動作が重たくてフラストレーション溜まっちゃうので、以上の作業をするには普通にSSHしてやるのが正解な気がします。

mjpg-streamerのストリーミングサーバはターミナルがフォアグラウンドの時Ctrl+Cで停止することができますが、SSHでアクセスしている時用にシェルスクリプトを組んでもいいかもしれません。
(参照： http://albertlabo.wiki.fc2.com/wiki/mjpg-streamer )

----
Node.jsの構築に関しては完全にこれです。

(参照：http://qiita.com/yuyakato/items/a1225154445520dc2db39 )

で、いろいろとNode.jsの話をググってたんですけどNode.jsってWebサーバーにもなるんですね。何も知らなくて普通にApacheでいろいろやってしまいました。
(参照：http://qiita.com/hosomichi/items/1991567e56dea41d1021 )
(参照：http://usicolog.nomaki.jp/engineering/raspberryPi/raspberryPi_Nodejs.html)

とりあえずサーバのこと、ちょっとお勉強になったので良しとします。
TreasureData上の過去データを削除する


## 概要

すでにTD上のテーブルに格納されている過去データを消すにはおおまかに分けて2つの方法がある。

* 期間を指定して削除コマンドを実行(partial_delete)
    * **CLI**
* 一定期間経過による自動削除設定(Expire)
    * **Webコンソール**
    * CLI

ここで言う「過去データ」だが、これは「データの作成日(time)」を基準としている。

本エントリでは上記の太字で表記されている2つの手順についてまとめる。

## 手順

### partial_delete

期間を指定してデータを削除することができるコマンド。
速度に関しては、**50億レコード削除でだいたい10分程度**。
爆速である。

マニュアルは以下のとおり
http://docs.treasuredata.com/articles/deletion

マニュアルにも書いてあるが、コマンド例としては以下のように実行すると良いと思う。
```
td table:partial_delete example_db table1 --from '2014-01-01 00:00:00 JST' --to '2015-01-01 00:00:00 JST'
```

これは去年一年分のデータ削除を行うコマンドとなる。
すると以下の様なジョブが走る。

```
DELETE FROM table1 WHERE 1388502000 <= time AND time < 1420038000
```

つまり`from <= time < to`の範囲で削除を行う。

注意して欲しいのが、時刻表記上は分秒まで指定できるように見えるが、実際のところは**1時間単位**までしか指定できないという点。つまり、以下の様な期間指定は不可能となる。

```
td table:partial_delete example_db table1 --from '2014-01-01 00:00:00 JST' --to '2014-12-31 23:59:59 JST'
```

上記を実行しようとするとエラーが表示されるのですぐにわかると思う。


### Expire

テーブルに設定しておくと、timeが一定期間を経過したデータが自動で削除される。例えばとあるログを最新1ヶ月だけTD上に保持しておきたい、という時なんかに使える。

こちらはCLIでもできるが、せっかくWebコンソールにて設定可能となっているのでこちらで設定するのがいいと思う。

マニュアルとしてはこのへん
http://docs.treasuredata.com/articles/database-and-table#expiring-data-from-a-table

**手順**

1.テーブル設定画面の`Settingsタブ`を開く
2.`Expire data?`を**Yes**に設定する
3.`afterテキストボックス`に日数を入力する
4.`Update Tableボタン`を押下

![2434234234234234432432432.png](https://qiita-image-store.s3.amazonaws.com/0/55783/4907dbaa-4c52-10b0-019f-656907addf49.png)

上記の例だと150日間を過ぎたデータは自動削除される。データがTD上に格納されたらだいたい5ヶ月程度は保持され、それ以降は削除されるということである。

**Expire設定を行った時点で5ヶ月前以前のデータが全て削除されるので注意**

## まとめ

TDはどんどん突っ込めるので便利ですが、契約内容にもよりますが溜め込みすぎると利用可能上限に達してしまうため、Expire設定を行うか期間指定によるデータ削除をおこなっていきましょー
【VirtualBox】Mac⇔CentOSでフォルダ共有（GuestAdditionと闘った）

メモ書き。いつの間にかそうなってた！みたいのもあるので不正確かも。
VMは、スナップショット取っておくのをおすすめ。

# ざっくり
1. MacからCentOSに、「これ共有する用のシェルが入ってるパッケージだよ、これ使ってね」ってやる
2. CentOSは「おっけーこれね。諸々セッティングしとくね」ってする
3. MacからCentOSに、「共有するためのキーワードはこれね。こっちはこっちで紐付けとくからあとよろしく」
4. CentOSは「はいはい、じゃあそれ使ってこっちも紐付けとくから」
5. 晴れてキーワードを介して共有される

# Macでやること
VirtualBoxがプロキシ抜けられてなくてバージョンアップできてなかったので、まずはそれをやる。

（Extention入れる。←バージョンアップ時に「拡張入れる？」と聞いてくるので、そこでOKしてれば不要ぽい）

共有しようと思っているvm（ovaインポートで作った）の「設定」⇒「ストレージ」⇒CDの追加でGuestAdditionを選択して足しておく。
ここにあった⇒/Applications/VirtualBox.app/Contents/MacOS/VBoxGuestAdditions.iso

次いでvmを一度起動させ一時停止し、Device⇒Insert Guest Addition的なのを選択。
何も起きなかった。いいのか？？
なお、ここで「ストレージ設定画面からadditionのCD設定してよね！」と出ていたのでストレージ設定はやってみた感じ。

さらに共有フォルダ設定。
vm選択⇒設定⇒共有フォルダ
フォルダパスにMacの共有用フォルダパス。
フォルダ名に任意の"共有名"。こんかいはvboxdevにした。
あと完全な権限と永続化にチェック。

# CentOSでやること
いっぱいyum入れる
必要に応じsudoする。なんかやたらsudoした記憶あるからrootでやるべきなのかも・・・

```bash
yum -y install kernel-devel kernel-headers gcc gcc-c++
yum -y install http://vault.centos.org/6.5/updates/x86_64/Packages/kernel-devel-2.6.32-431.3.1.el6.x86_64.rpm
```
↑これはAddition追加シェルを実行したときに表示されたkernel-develのバージョンに寄ると思う
入れたら念のため再起動しとこう。

Additionを適用させる。
なんか規則あるぽいからディレクトリ名は固定がいいのかも。

```bash
mkdir -p /media/cdrom
mount -r /dev/cdrom /media/cdrom
cd /media/cdrom/ # ここにいろんなshとかがずらっとあれば成功
./VBoxLinuxAdditions.run
# shが無事にOKしたらOS再起動
sync;sync
reboot

# そしたらなんかディレクトリできてたりする
ll /media/sf_share/

# 任意のところにマウントしたければ、CentOS内にディレクトリを新規作成して、
mount -t vboxsf [VirtualBox設定で設定したフォルダ名] [CentOS内で新規作成したディレクトリパス]
# => そうすると、Macの共有用フォルダとCentOSのディレクトリがマウントされる。はず。
# ※※ 必ずテスト的に試してからにしましょう！ 間違えるとディレクトリ内容が上書きされます。  ※※
```

わりとドハマった。

# そのほか
作られるものと権限はもれなく`rwxrwx--- root:vboxsf`。
開発はrootじゃやらないよ！だったので、vboxsfグループに所属させてあげる。

```
sudo gpasswd -a ユーザ名 vboxsf
```
このあと再ログイン（`exec $SHELL -l`じゃダメだった。そりゃそうか）

※usermod -Gはダメ！検索上位にあるブログにも書いてあったので流れで実行しちゃいそうになる。ダメな理由 ⇒ http://d.hatena.ne.jp/thegoodbadugly/20130116/1358316032
※ちなみに実行してしまったので自動でできるgroupのバックアップで復元。助かったー

# 参考
* http://qiita.com/tosato3/items/a3d9c3316f9714fbb815
* http://qiita.com/a-suenami/items/3b04151ce6e7d5b72a3e
* http://weble.org/2011/06/08/virtualbox-centos
* http://exlight.net/linux/vbox_guest_additions/
初心者が個人的に理解補助のために使うサイト群

プログラミング初心者です。
使用パソコンはMacで、学習言語はPHP(CakePHPも)です。

やっているうちに昔覚えたことを忘れてしまい躓くことが時々あります。
その時調べていて、復習に使える！わかりやすい！と思ったサイトを列挙していきます。
随時更新していきます。

##PHP

+ [【業務効率が変わる！】こんな時に役に立つ「正規表現」の使い所](http://webnaut.jp/markup/606.html)
+ [PHPにおける継承、オーバーライド、protected、parentの書き方と使い方、継承の設計](http://www.atmarkit.co.jp/ait/articles/1508/05/news021.html)
+ [PHPを愛する試み 〜self:: parent:: static:: および遅延静的束縛〜](http://maeharin.hatenablog.com/entry/20130202/php_late_static_bindings)

##CakePHP

+ [cakePHP2.0 SESSIONの保存先を変更する](http://greenday.sakura.ne.jp/cakememo/2012/04/23/cakephp2-0-session%E3%81%AE%E4%BF%9D%E5%AD%98%E5%85%88%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B/)
→こちらのサイトは平易にかかれているのでわかりやすいです。認証周りで、ユーザー登録をした後に、勝手にログアウトリダイレクトされてしまうので、それを治す(ユーザー登録をしたらログイン状態を保持して指定されたページヘ飛ぶようにする)ために調べました。(2015/08/17)

+ [CakePHPのcore.phpの設定を勉強！！](http://www.okushin.co.jp/kodanuki_note/2009/05/cakephpcorephp.html)
→これを書いている時(2015/08/18)で若干古いですが、役に立ちそうな日がきそうな気がするので一応保存します。(2015/08/18)

+ [cakephpのページング時の検索条件の引き継ぎ](http://realid-inc.com/column/2013/08/13-140407.html)
 →これは案外役に立つかもしれないです。cakephpのページネーションの情報は少ないので。
##Git,Github

+ [Git初心者に捧ぐ！Gitの「これなんで？」を解説します。](http://kray.jp/blog/git-why-explanation/)

##ターミナル、linuxコマンド

+ [viエディターでの画面分割](http://www.ksknet.net/vi/post_121.html)
+ [Vim のブログ](http://vimblog.hatenablog.com/entry/vim_window)
+ [よく使う Vim のコマンドまとめ](http://qiita.com/hide/items/5bfe5b322872c61a6896)
+ [【Terminal】便利なターミナルiTerm2の使い方【Mac】](http://healthhack.jp/archives/1143)
+ [ターミナルソフトIterm2の導入](http://roboneco.hateblo.jp/entry/2015/03/11/123836)
+ [swapファイルが見つかった場合にどのように対処すべきか（クラッシュからのリカバリー）](http://nanasi.jp/articles/howto/file/crash-recovery.html)
C# Windowsフォームアプリケーション  Fontサイズを変える

Buttonを動的に作ったとき、フォントサイズを直接いじることができない

``` 
Button button = new Button();
buttonn.Font.Size = 20f;
```


Fontをnewすればとりあえずフォントサイズを変更できる

```
float fontSize = 20f;
Button button = new Button();
button.Font = new Font(button.Font.OriginalFontName,fontSize);
```
派生クラスにて基底クラスのpublicメンバ変数を使用不可にする

基底クラスと同名の変数・プロパティを定義すると上書きされるという性質を使います。

例　Unity4  Monobehaviorのrendererを使用不可にする
<pre><code>
public class MonoBehaviourEx : MonoBehaviour
{  
    protected Renderer renderer { get { throw new System.NotImplementedException("rendererは使わないで下さい"); } }
}
</pre></code>
外部からrendererにアクセスしようとするとエラーが出ます.
特定プロセスのメモリ使用率を監視するNagiosプラグイン


こんな感じで書いてみました。

デプロイ方法は[こちら](http://qiita.com/Hiroyama-Yutaka/items/880ee506f185441a7e85)をご覧ください。


```check_memory_procs
#!/bin/bash -e
##-------------------------------------------------------------------
## File: check_memory_procs
## Author : Yutaka Hiroyama
## Description :
## --
##
## Created : <2015-08-05>
## Updated: Time-stamp: 
##-------------------------------------------------------------------
if [ "$1" = "-w" ] && [ "$2" -gt "0" ] && \
    [ "$3" = "-c" ] && [ "$4" -gt "0" ]; then

    procpattern=${5}

    total=`grep "MemTotal" /proc/meminfo | awk  -F' ' '{print $2}'`
    memVmSize=`ps aux | grep "$procpattern" | grep -v grep | grep -v check_proc_mem.sh | awk '{sum += $6} END {print sum}'`
    per=$((($memVmSize*100)/$total))

    memVmSize=$(($memVmSize/1024))

    if [ "$per" -ge "$4" ]; then
        echo "Memory: CRITICAL - $procpattern using $memVmSize MB ($per %)"
        $(exit 2)
    elif [ "$per" -ge "$2" ]; then
        echo "Memory: WARNING - $procpattern using $memVmSize MB ($per %)"
        $(exit 1)
    else
        echo "Memory: OK - $procpattern using $memVmSize MB ($per %)"
        $(exit 0)
    fi

else
    echo "check_memory_procs v1.0"
    echo ""
    echo "Usage:"
    echo "check_memory_procs -w <warn_%> -c <criti_%> <pattern_proc>"
    echo ""
    echo "Copyright (C) 2015 Yutaka Hiroyama"
    exit
fi
```
Nagiosで自作プラグインを使う



# スクリプト作成
本家に詳しく書かれています。
https://nagios-plugins.org/doc/guidelines.html

引数の書式も合わせておきましょう。

こちらに大量のスクリプトが公開されているので、自作の前に探してみたら、作る手間が省けるかも。
https://exchange.nagios.org/


# スクリプト配置
## Nagiosサーバーから実行可能なプラグインを使う場合

/etc/nagios/command.cfg
にプラグインを登録します。　

```
define command {
  command_name  check_hoge
  command_line  /usr/lib64/nagios/plugins/check_hoge 
}
```

次に、上記で指定したパス（/usr/lib64/nagios/plugins/check_hoge）に自作プラグインを置きます。
実行権限には注意すること。


## クライアントにて実行するプラグインを使う場合
内部のメモリ状況の監視など、監視対象でスクリプトを動かしたいとき。
nrpeを経由して、スクリプトを実行します。そのため、クライアントにnrpeをインストールしておく必要があります。
/etc/nagios/nrpe.cfgに追加したプラグインを登録します。

check_hogeを追加する場合は以下のように記載します。

```
command[check_hoge]=/usr/lib64/nagios/plugins/check_hoge -w $ARG1$ -c $ARG2$
```

次に、上記で指定したパス（/usr/lib64/nagios/plugins/check_hoge）に自作プラグインを置きます。
こちらも実行権限には注意すること。

設定後、nrpeを再起動します。

サーバー側に設定するコマンドは以下のような感じです。

```
check_command   check-nrpe -H <HOSTADDRESS> -c check_hoge -a <ARGUMENT>
```


※ファイルパスは環境によって差異があります
シェルで実行中のプロセスを後からバックグラウンドに切り替える

コマンドの末尾に ```&``` をつけて実行するとバックグラウンドでプロセスを実行できる

しかし，つけ忘れた時とかに面倒な場合がある

実行してしまった後でも ```Ctrl z``` でプロセスの一時停止をしてから
```bg``` コマンドでバックグラウンドに切り替える事ができる


```
$ npm run start
> pyonpyon@0.0.0 start /var/www/hoge
^Z
[1]+  停止                  npm run start
$ bg
[1]+ npm run start &
```
terraformでcountを使った複数インスタンスにEBSを割り当てる

`subnet.main`とか`aws_security_group`などなどは別途設定済みとして。

```
#--------------------------------------------------------------
# Ec2 Instances
#--------------------------------------------------------------
resource "aws_instance" "elasticsearch" {
  instance_type = "${var.elasticsearch_instance_type}"
  ami = "${var.default_ami}"
  subnet_id = "${element(aws_subnet.main.*.id, count.index%length(aws_subnet.main.*.id))}"
  vpc_security_group_ids = [ "${aws_security_group.output_all.id}", "${aws_security_group.elasticsearch.id}" ]
  key_name = "${aws_key_pair.developer.id}"
  iam_instance_profile = "${aws_iam_instance_profile.elasticsearch.id}"
  tags {
    Name = "${format("%s-elasticsearch%02d", var.environment, count.index+1)}"
    role = "elasticsearch"
    environment = "${var.environment}"
  }

  count = "${var.elasticsearch_server_count}"
}

#--------------------------------------------------------------
# EBS
#--------------------------------------------------------------
resource "aws_ebs_volume" "elasticsearch-data" {
  availability_zone = "${element(aws_subnet.main.*.availability_zone, count.index)}"
  size = "${var.elasticsearch_volume_size}"
  type = "gp2"
  tags {
    Name = "${format("elasticsearch%02d-data", count.index+1)}"
    environment = "${var.environment}"
  }
  count = "${var.elasticsearch_ebs_count}"
}

#--------------------------------------------------------------
# EBS attachment
#--------------------------------------------------------------
resource "aws_volume_attachment" "attach_elasticsearch-data" {
  device_name = "/dev/sdb"
  volume_id = "${element(aws_ebs_volume.elasticsearch-data.*.id, count.index)}"
  instance_id = "${element(aws_instance.elasticsearch.*.id, count.index)}"
  count = "${var.elasticsearch_server_count}"
}
```

これでelasticsearch_server_countだけサーバが立ち上がった上でEBSがattachされます。

さらに

```
terraform destory -target 'aws_instance.elasticsearch'
```
とした場合、インスタンスだけ消えてEBSは残るので、次回インスタンスを立ち上げたときには同じEBSが割り当てられます。

問題は`terraform destory`したときにEBSがマウント済みだと当然エラーになるので落とすときはumountをする何かが必要になります。
いまのところ作成時にのみprovisionerが実行されるだけなのでterraformでは完結しません。
Vagrant起動時に「Waiting for Chef Zero to start」が出続ける。

# 問題

Vagrantfileに「config.provision :chef_client」の記述があると、自動的にChef Zeroを使おうとして、失敗しているらしい。

~~~
$ vagrant up
...
Starting Chef Zero at http://xxx.xxx.xxx
Waiting for Chef Zero to start
Waiting for Chef Zero to start
Waiting for Chef Zero to start
Waiting for Chef Zero to start
Waiting for Chef Zero to start
Waiting for Chef Zero to start
Waiting for Chef Zero to start
Waiting for Chef Zero to start
Waiting for Chef Zero to start
Waiting for Chef Zero to start
~~~

# 解決方法

Chef Zeroを使わないようにVagrantfileに設定を追加する


~~~
# Vagrantfile:
...
    config.chef_zero.enabled = false # <= 追加

    config.vm.provision :chef_client do |chef|
      chef.chef_server_url     = "https://xxx.xxx.xxx"
      ...
    end
~~~
1秒毎に処理をするEnumerator

[ElixirでStreamではないものをStream化するイディオム](http://niku.name/articles/2015/08/06/Elixir%E3%81%A7Stream%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84%E3%82%82%E3%81%AE%E3%82%92Stream%E5%8C%96%E3%81%99%E3%82%8B%E3%82%A4%E3%83%87%E3%82%A3%E3%82%AA%E3%83%A0)というものを書いた．

Ruby でも同じことができるだろうか．

単に 5 つ値を取ってみると，全て同じ時刻になってしまう．

```rb
Enumerator.new { |y| loop { y << Time.now } }
  .lazy
  .map { |e| puts e; e }
  .first(5)
#> 2015-08-06 12:03:13 +0900
#> 2015-08-06 12:03:13 +0900
#> 2015-08-06 12:03:13 +0900
#> 2015-08-06 12:03:13 +0900
#> 2015-08-06 12:03:13 +0900
# => [2015-08-06 12:03:13 +0900, 2015-08-06 12:03:13 +0900, 2015-08-06 12:03:13 +0900, 2015-08-06 12:03:13 +0900, 2015-08-06 12:03:13 +0900]
```

そこで wait を入れなければいけない．

処理の流れに直接追加してもいいのだけれど Enumerable::Lazy#zip を使うとやりたいことと，待ち合わせの処理が混ざらないので良いだろう．

Enumerator::Lazy#zip を使うと 2 つの Enumerable の評価が完了していないと次の処理に行けない．
新しく追加する方を 1 秒毎に何かが流れてくるようにする．(内容は何でもよい)
すると必ず 1 秒待ち合わせることになり，結果として 1 秒毎に処理できるようになる．

```rb
Enumerator.new { |y| loop { y << Time.now } }
  .lazy
  .map { |e| puts e; e }
  .zip(Enumerator.new { |y| loop { sleep 1; y << nil } }.lazy)
  .first(5)
#> 2015-08-06 12:05:52 +0900
#> 2015-08-06 12:05:53 +0900
#> 2015-08-06 12:05:54 +0900
#> 2015-08-06 12:05:55 +0900
#> 2015-08-06 12:05:56 +0900
# => [[2015-08-06 12:05:52 +0900, nil], [2015-08-06 12:05:53 +0900, nil], [2015-08-06 12:05:54 +0900, nil], [2015-08-06 12:05:55 +0900, nil], [2015-08-06 12:05:56 +0900, nil]]
```

ここで返り値に興味がないのに `each` ではなく `map` を利用しているのは

[class Enumerator::Lazy](http://docs.ruby-lang.org/ja/2.2.0/class/Enumerator=3a=3aLazy.html)

> 以下のメソッドが遅延評価を行う (つまり、配列ではなく Enumerator を返す) ように再定義されています。
>
>    map/collect
>    flat_map/collect_concat
>    select/find_all
>    reject
>    grep
>    take, take_while
>    drop, drop_while
>    zip (※互換性のため、ブロックを渡さないケースのみlazy)

の通り `each` では遅延評価が行えないためだ．

`zip` で合成するよりは 下のような `Enumerator::Lazy#with_interval` を定義して書いた方が Ruby っぽいかもしれない．

```rb
class Enumerator::Lazy
  def with_interval(second)
    interval_stream = Enumerator.new { |y|
      times = 0
      loop do
        sleep second
        y << times
        times += 1
      end
    }.lazy
    self.zip(interval_stream)
  end
end

Enumerator.new { |y| loop { y << Time.now } }
  .lazy
  .map { |e| puts e; e }
  .with_interval(1)
  .first(5)
#> 2015-08-06 12:08:33 +0900
#> 2015-08-06 12:08:34 +0900
#> 2015-08-06 12:08:35 +0900
#> 2015-08-06 12:08:36 +0900
#> 2015-08-06 12:08:37 +0900
# => [[2015-08-06 12:08:33 +0900, 0], [2015-08-06 12:08:34 +0900, 1], [2015-08-06 12:08:35 +0900, 2], [2015-08-06 12:08:36 +0900, 3], [2015-08-06 12:08:37 +0900, 4]]
```

1 行目の `Time.now` のところを `Net::HTTP.get(URI.parse("http://example.com"))` などにして，3 行目の `map` のブロックの処理を変更すれば，定期的な監視を行う簡易的なスクリプトを作ることができるだろう．
Rails チュートリアル第3章まとめ

【学習日報：かみいけさんのアドバイスに従い】
Railsチュートリアル第3章(パキスタン人家庭教師の教材)
http://railstutorial.jp/chapters/static-pages?version=4.0#top
総括：Git/Heroku/テスト駆動開発など、生産性が上がるテクを身につけられて良かった
各項目：
herokuというAWSより設定が簡単なサービスを使ったデプロイ
GitCommit/GitPushによるBitBucket/Herokuとのバージョン保存シンクロ
GitBranchなどバージョン管理
HTTPの操作 GET/POST/PATCH/DELETEの概念理解
静的ページからhtml.erbファイルを使った動的サイトの作り方
TDD テスト駆動開発 bundle exec rake testを多用
リファクタリングの初歩　重複の解消
RVM Bundler/Guard/Spork/SublimeTextなど、やや高度なテスト手法
複数のAWSアカウントの利用料金を代表1アカウントで支払う「Consolidated Billing」の設定方法


# はじめに
AWSアカウントを複数持っているが、支払いは代表して1アカウントで統一したいなんて需要があると思います。そんなときは `Consolidated Billing` を使ってみましょう。

## どういう人向け？
- 特定のシステムの「本番/ステージング用アカウント」「開発アカウント」「検証(Sandbox)アカウント」を代表アカウントで支払いたい
- 自社のエンジニアに勉強のためにAWSアカウントを作らせているが、その料金は会社で払ってあげたい（が、コーポレートカードの情報などは渡したくない）

## 一家言
- 本番アカウント／開発アカウント／検証アカウントをまとめる場合、いずれのアカウントもリソースが利用される前提であるため、どれかを代表アカウントにするのではなく、支払い専用のアカウント（EC2やRDSなどのリソースは使わない）を別途開設して管理するほうがよいでしょう。

# 設定方法
- 親アカウント：まとめて支払いを行うアカウント
- 子アカウント：親アカウントに支払いをしてもらうアカウント

## 1. 親アカウントでの設定
### 1-1. 親アカウントにログイン
- 親アカウントで AWS Management Console にログインして `Billing & Cost Management` 画面を開く

### 1-2. Consolidated Billing にサインアップ
- 左ペインから `Consolidated Billing` を選択し `Sign up for Consolidated Billing` ボタンを押下する
- アカウントの確認処理が実行され、しばらくしてリロードすると、子アカウントへのリクエストが可能な状態に変わる

![コンソリ01 copy.png](https://qiita-image-store.s3.amazonaws.com/0/11653/95b151ba-f2aa-c5a3-92e6-14f1e0a3b3a6.png "コンソリ01 copy.png")

### 1-3. 子アカウントにリクエスト送信
- 子アカウントのメールアドレスを入力して `Send` を押下する

![コンソリ02 copy.png](https://qiita-image-store.s3.amazonaws.com/0/11653/8634ec34-a172-e449-8412-3ba4c2213c32.png "コンソリ02 copy.png")

- 送信したリクエストがPending状態になっていることが確認できる

![コンソリ03 copy.png](https://qiita-image-store.s3.amazonaws.com/0/11653/3a900d2d-be8d-cab2-ff42-8c16e91d68e8.png "コンソリ03 copy.png")

## 2. 子アカウントでの設定
### 2-1. リクエストの受入れ
- 子アカウントのメールアドレスに、リクエストのメールが届くので、リンクを押下する

![コンソリ04 copy.png](https://qiita-image-store.s3.amazonaws.com/0/11653/59cc9c7a-fc41-632e-b23e-36c4ddfb5109.png "コンソリ04 copy.png")

- リンクから子アカウントにログインして `Accept Request` でリクエストを承認する

![コンソリ05 copy.png](https://qiita-image-store.s3.amazonaws.com/0/11653/ca1fd04f-b1e7-5d48-8dd4-24e55cab2b67.png "コンソリ05 copy.png")

- 承認すると、こんな表示になる

![コンソリ06 copy.png](https://qiita-image-store.s3.amazonaws.com/0/11653/85e14eb8-e080-e110-b58c-aa091dd5e033.png "コンソリ06 copy.png")

### 2-2. 親アカウントでの確認
- 親アカウントで Pending だったリクエストが Linked に変わっていることを確認する

![コンソリ07 copy.png](https://qiita-image-store.s3.amazonaws.com/0/11653/9c6d8481-1694-9f0f-28ec-aa0fe3ab5fde.png "コンソリ07 copy.png")
MySQLのテーブルをExcelに取り込める形式で出力するBashスクリプト

「MySQL の検索結果を Excel や Access に取り込みたい」というベタな要望を叶えるスクリプトです。
Excel 2013 で取り込めることを確認済みです。


やりたいこと
-----
1. 指定したテーブルを個別の CSV ファイルに出力する
1. CSV の1行目はヘッダー行にする
1. NULL は空文字にする (普通に出力すると `\N` という変な文字になるので)
1. Excel で取り込めるよう Shift-JIS に変換する


スクリプト
----
config 内をお好みの値に修正してから実行してください。

下記の例を実行すると、`/tmp/mysql_dump/` ディレクトリ内に `clients.csv`, `points.csv`, `users.csv` の3ファイルが作成されます。

```bash
#!/bin/sh
# ***************
# config
# ***************
id=DB_USER_NAME
pw=DB_USER_PASSWORD
db=DB_NAME
tables=("clients" "points" "users")
dir=/tmp/mysql_dump/

# ***************
# exec
# ***************
mkdir -p ${dir}
chmod 777 ${dir}

for table in ${tables[@]}; do
  f=${dir}${table}.csv
  header=${dir}header
  data=${dir}data

  echo "${table}..."
  rm -f ${f} ${header} ${data}

  mysql -u${id} -p${pw} ${db} -e "SELECT GROUP_CONCAT(COLUMN_NAME  SEPARATOR ',') FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='${table}' INTO OUTFILE '${header}'"
  mysql -u${id} -p${pw} ${db} -e "SELECT * FROM ${table} INTO OUTFILE '${data}' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"'"
  cat ${data} >> ${header}
  mv -f ${header} ${f}
  nkf -s --overwrite ${f}
  sed -i -e 's/\\N//g' ${f}
done
```


参考
----
- [3 Ways to Make Tab Delimited Files From Your MySQL Table](http://spin.atomicobject.com/2011/05/28/3-ways-to-make-tab-delimited-files-from-your-mysql-table/)
東京五輪エンブレム for Ruby

# 乗るしかない このビッグウェーブに

[これでみんないつでも描けるね！ 東京五輪エンブレムのコードがオープンソースに - ねとらぼ](http://nlab.itmedia.co.jp/nl/articles/1508/03/news114.html)
[東京五輪エンブレム for iOS](http://qiita.com/shu223/items/af5a8dd47770669ebb3a)
[東京五輪エンブレム for Android](http://qiita.com/suzukihr/items/32a243cfde6f4d281c2a)

東京五輪エンブレムをRubyで描画しました。描画ライブラリにはcairo(rcairo)を使用しています。

# インストール

```
$ gem install cairo
```

# コード

```rb:tokyo_olympic_logo.rb
require 'cairo'

format = Cairo::FORMAT_ARGB32
width = height = 480

surface = Cairo::ImageSurface.new(format, width, height)
context = Cairo::Context.new(surface)

a = 160
context.set_source_rgb(1, 1, 1) # white
context.rectangle(0, 0, width, height)
context.fill

context.set_source_rgb(0.7, 0.57, 0.27) # yellow
context.rectangle(0, 0, a, a)
context.fill

context.set_source_rgb(0.7, 0.7, 0.7) # gray
context.rectangle(a * 2, a * 2, a, a)
context.fill

# r = Math.sqrt(1.5 * 1.5 + 0.5 * 0.5) * a
r = Math.hypot(1.5, 0.5) * a # こうとも書ける
context.set_source_rgb(1, 1, 1) # white
context.arc(1.5 * a, 1.5 * a, r, 0, 2 * Math::PI)
context.fill

context.set_source_rgb(0, 0, 0) # black
context.rectangle(a, 0, a, a * 3)
context.fill

context.set_source_rgb(0.9, 0, 0.08) # red
context.arc(2.5 * a, 0.5 * a, 0.5 * a, 0, 2 * Math::PI)
context.fill

surface.write_to_png("tol.png")


```

# 実行結果

![tol.png](https://qiita-image-store.s3.amazonaws.com/0/7630/e2d0299a-a6b2-af6d-aa27-209fc872d8bb.png)

cairo初めて使いましたがすごく便利です
コルーチンの初歩的な使い方【Unity, 初心者】

# コルーチンの初歩的な使い方
コルーチンは処理の開始や停止を別スレッドのようなふるまいでコントロールすることができます。
シーケンシャルなUIの時とかにすごく使えます。
## 毎フレーム処理
毎フレーム処理を開始します。
yield return のところで

```csharp
void Start () {
    // コルーチンを設定
    StartCoroutine(loop());
}

private IEnumerator loop() {
    // ループ
    while (true) {
        // 毎フレームループします
        yield return null;
		Debug.Log("loop");
    }
}
```

## 指定のフレーム分だけ処理
10フレームだけ処理を行います。

```csharp
void Start () {
    // コルーチンを設定
    StartCoroutine(loop(10));
}

private IEnumerator loop(int frame) {
    // ループ
    while (frame > 0) {
        // frameで指定したフレームだけループします
        yield return null;
		Debug.Log("loop");
		frame--;
    }
}
```

## 秒数指定
yield return のところをWaitForSecondsにします。

```csharp
void Start () {
    // コルーチンを設定
    StartCoroutine(loop(10f));
}

private IEnumerator loop(float second) {
    // ループ
    while (true) {
        // secondで指定した秒数ループします
        yield return WaitForSeconds(second);
		Debug.Log("loop");
    }
}
```

## yield returnの挙動
yield returnのたびに処理が中断して次のフレームまで待つみたいです。
下のサンプルではUpdate内でマイフレーム"update------"を出力していて、コルーチンではyield returnの度に文字列を出力しています。

```csharp
void Start () {
	StartCoroutine (loop ());
}

void Update () {
	Debug.Log ("update------");
}

private IEnumerator loop() {
	for (int i = 0; i < 5; i++) {
		yield return null;
		Debug.Log ("loop" + i.ToString());
	}
}
```
yield returnのたびにそのフレームの処理が止まって次のフレームまで待ってます。
updateが最初重なってしまうのはどうしてだろうか。
yield returnとDebug.Logの順番を逆にしたら今度はloop0のあとに2回updateが来てしまいました。

```出力結果
update------
update------
loop0
update------
loop1
update------
loop2
update------
loop3
update------
loop4
```
表参道rb#3 まとめ

# 表参道rb
テーマ：パフォーマンスチューニング
http://omotesandorb.connpass.com/event/18069/

# [ActiveRecordを速くしたいだけの人生だった](http://qiita.com/yuroyoro/items/9d013409568042d6b76a) のデモと気持ちの話。

1. Railsをバージョンアップをすると重くなる
2. Rubyをバージョンアップすると早くなる。Rubyの努力をRailsが食いつぶすｗ
3. ActiveRecordRelationオブジェクトを一つ生成するだけで三桁のメソッドが定義される。辛い。
3. 計測する。 [benchmark-ips](https://github.com/evanphx/benchmark-ips) 便利そう。これからこっちにします。
4. Railsのコミットを遡ってパフォーマンスをチェックする人力Bisectｗｗｗ
5. Railsの実装をオーバーライドするパッチを読み込んで動作させる、メンテする男気。
6. 英語を読む（RailsのPRとか）

## 大正義

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">ActiveRecordを最も速度を出す方法です&#10;&#10;ActiveRecordオブジェクトをインスタンス化しない&#10;単なるクエリビルダとして使う</p>&mdash; ⁰⁰⁰⁰null (@yuroyoro) <a href="https://twitter.com/yuroyoro/status/628146784951386112">2015, 8月 3</a></blockquote>

to_query して mysql.query に投げてHashをゴニョゴニョする


# いろいろなMySql互換の話
+ [Percona早そう](https://www.percona.com/)
+ Aurora来ました :tada: 
+ 表参道.rbがきっかけで転職成功 :tada: 

# 細かすぎて伝わらないパフォーマンスTips
+ 文字列リテラルは `.freeze` すると有利
+ 'str' + 'str' よりも 'str' \ 'str' のほう有利（ `str` `str` の書き換え)
+ 定数にして `.freeze` すると有利
+ 繰り返しの中でオブジェクトを新しく生成しない
+ 明示的に `to_f` 呼び出しよりもRubyの勝手な変換に身を任せたほうが微妙に有利
DreamWeaverのテンプレートで条件付きコメントを記述しながら、内部のパスを通す方法

条件付きコメントは非常に便利で良いのですが、IEによるブラウジング以外はコメントアウトとみなされてしまうため、DreamWeaverのテンプレートに記述すると、条件付きコメント内のパスは自動的に補完されなくなってしまいます。

```html
<!--[if lte IE 8]>
<script type="text/javascript" src="./path/to/script.js"></script>
<![endif]-->
```

ということで、テンプレート上は条件付きコメントではなく、適用後には条件付きコメントになるようにしてしまえば良い、という考えと、DWの変数処理（`@@('hoge')@@`）を利用することで対応することが可能です。

```html
@@('<!-')@@-[if lte IE 8]>
<script type="text/javascript" src="./path/to/script.js"></script>
<![endif]-@@('->')@@
```

これで、テンプレート上はコメントとみなされず、テンプレート適用後のHTMLでは条件付きコメントになるので、コメント内のパスも補完された形で適用されるようになります。

まぁ、絶対パスとかサイトルート相対パスとかで指定しちゃえば良いんですけどね。
c++ builder XE4, 10.2 Tokyo > c++11の対応状況

```txt:動作確認
C++ Builder XE4
```

C++ Builder XE4でのC++11対応状況
http://docwiki.embarcadero.com/RADStudio/XE4/en/C%2B%2B11_Language_Features_Compliance_Status

以下のc++11構文は32ビットWindowsプラットフォームをターゲットとした場合、コンパイルエラーとなった。残念。

```cpp
for(bool isTop : { true, false }) {
  // ...
}
```

### 10.2 Tokyo

Tokyoの情報はこちら。
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/C%2B%2B11_Language_Features_Compliance_Status
「アフィリエイターのためのWeb APIプログラミング入門」のサンプルプログラムが動かない場合

<a href="http://www.amazon.co.jp/gp/product/4861007623/ref=as_li_tf_il?ie=UTF8&camp=247&creative=1211&creativeASIN=4861007623&linkCode=as2&tag=ka4k-22"><img border="0" src="http://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4861007623&Format=_SL250_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=ka4k-22" ></a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=ka4k-22&l=as2&o=9&a=4861007623" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
↑を読んだかた向けの情報です。

##サンプルプログラムがダウンロードできない。

パスワードがみつからない。
→ｐ１０に記載されてます。

ちょっと見つけにくいですよね…
DLurl: http://web-service-api.jp/?page_id=7

##chapter 4-5  p98 リクエストURLにアクセスできない

リンクシェアのリクエストURLにアクセスできない
→アドレスが変更されています。

新しいアドレスに修正しましょう。

旧
http://feed.linksynergy.com/productsearch?token=あなたのトークン&keyword=%E3%83%90%E3%83%8A%E3%83%8A&sort=retailprice&sorttype=dsc&max=10 
↓
新
http://productsearch.linksynergy.com/productsearch?token=あなたのトークン&keyword=%E3%83%90%E3%83%8A%E3%83%8A&sort=retailprice&sorttype=dsc&max=10 

参考Url
http://www.bento-box.jp/lsapi/crossover/
xamppでapacheスタートさせようとしたらポートが塞がってる？場合

xamppをアンインストール＆再インストールしてアパッチェ起動する、場合、portが塞がっているというエラーがでる場合があります。

PID 0000がブロックされてる、とかいうエラーです。

Ctrl+Alt+Delショートカットを押して、タスクマネージャを出します。
「プロセス」タブを開く。
デフォルトだとPIDが表示されていないので、「全ユーザーのプロセスを表示する(S)」「表示(V)→列の選択(S)→PID(プロセスID)」にそれぞれにチェックを入れる。
![taskmanager-600x436.png](https://qiita-image-store.s3.amazonaws.com/0/88876/14643d27-52a4-87e2-cdd3-8ea32c40bb3c.png)



選択→右クリックで「プロパティ」を見れば、使用されているアプリケーションが特定できます。

PIDの列が追加されていますので、そのPIDのタブをクリックすると、PID番号順に並べ替えられます。

XAMPPで表示されていたエラーのPIDを確認して、同じものを探す。→選択→プロセスを終了。

念のため、apache,xamppの名前がついてるポートも終了させておきます。

これでポートが開放されました。

xamppを再起動させて、動作を確認してください。

参考url
http://sinsengumi.net/blog/2011/01/windows%E3%81%A7%E3%81%A9%E3%81%AE%E3%83%9D%E3%83%BC%E3%83%88%E3%81%8C%E4%BD%95%E3%81%AE%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A7%E4%BD%BF%E7%94%A8%E3%81%95/