OmniAICreator/Qiita-1.07M huggingface dataset:
プレフィックスの除去はどの方法が最速か？


仕事で少し迷ったので調べてみた。

## 環境
* OS ・・・ Mac OS X
* CPU ・・・ 1.7 GHz Intel Core i7
* Java ・・・ jdk 8u73

## コード

```java
public class Test {
	
	static final String TEXT = "prefix_ABCDEFG";
	static final String PREFIX = "prefix_";
	static final String REGEXP_PREFIX = "^prefix_";
	static final String EMPTY = "";
	
	public static void main(String[] args) {
		IntStream.rangeClosed(0, 10).forEach(i -> {
			exec("warm up", Test::test_replace);
			exec("replace + startsWith", Test::test_replace);
			exec("replaceAll", Test::test_replaceAll);
			exec("replaceFirst", Test::test_replaceFirst);
			exec("substring + startsWith", Test::test_substringIfStartsWith);
		});
	}
	
	static void exec(String test, Consumer<String> cons) {
		//ウォームアップ
		IntStream.of(20).forEach(i -> cons.accept(TEXT));
		
		long start = System.nanoTime();
		IntStream.rangeClosed(0, 1_000_000).forEach(i -> cons.accept(TEXT));
		long time = System.nanoTime() - start;
		
		System.out.println(String.format("%s : %d ms", 
										test, time /1000 ));
	}
	
	static void test_replace(String	text) {
		if(!text.startsWith(PREFIX)) return;
		text.replace(PREFIX, EMPTY);
	}
	
	static void test_replaceAll(String text) {
		text.replaceAll(REGEXP_PREFIX, EMPTY);
	}
	
	static void test_replaceFirst(String text) {
		text.replaceFirst(REGEXP_PREFIX, EMPTY);
	}
	
	static void test_substringIfStartsWith(String text) {
		if(!text.startsWith(PREFIX)) return;
		text.substring(PREFIX.length(), TEXT.length());
	}

}
```

## 結果
|パターン|速度（平均）|
|:----:|:------:|
|replace + startsWith|367775 ms|
|replaceAll|353670 ms|
|replaceFirst|346915 ms|
|substring + startsWith|16816 ms|

まあ、replaceは正規表現つかってますからね。。
ということでパフォーマンスが求められる箇所はsubstringですね。

## 追記

@kazuki43zoo さんにコメントでご指摘いただいたので。
String.replaceが遅い原因として、実行するごとに毎回正規表現をコンパイルしていることが挙げられます。
したがって、正規表現をあらかじめコンパイルして使い回せばより速くなることが期待できます。

上記のコードに次のメソッドを足します。

```java
	static Pattern pattern = Pattern.compile(REGEXP_PREFIX);
	
	static void test_pattern_replaceAll(String text) {
		pattern.matcher(text).replaceAll(EMPTY);
	}
	
	static void test_pattern_replaceFirst(String text) {
		pattern.matcher(text).replaceFirst(text);
	}
```
### 結果

|パターン|速度（平均）|
|:----:|:------:|
|replace + startsWith|367898 ms|
|replaceAll|362225 ms|
|replaceFirst|334916 ms|
|substring + startsWith|16061 ms|
|Pattern.replaceAll|179644 ms|
|Pattern.replaceFirst|237790 ms|


とまあreplaceAllについては約２倍の実行速度になりました。
replaceFirstも２倍とまではいきませんが、確実に速くなっています。
ですが、やっぱりsubstringが最速なのは同じですね^^;
Ubuntu 16.04 をUSBにインストールしてUEFIブート

# はじめに

Ubuntu 16.04をUSBメモリにインストールしてUEFIで無理やりSecure bootさせる方法。
注意！正しいやり方ではありません。

# 参考

- https://help.ubuntu.com/community/UEFI
- [USB HDDにMBR/EFI両ブート可能なUbuntuイメージを作る方法](http://bellbind.tumblr.com/post/45757405213/usb-hdd%E3%81%ABmbrefi%E4%B8%A1%E3%83%96%E3%83%BC%E3%83%88%E5%8F%AF%E8%83%BD%E3%81%AAubuntu%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%82%92%E4%BD%9C%E3%82%8B%E6%96%B9%E6%B3%95)

# 準備

- USBメモリ（インストール先メディア）
- Liveインストールメディア

# 手順

## インストール開始まで

Windowsの入っているディスクは外しておいた方がよい。間違えて上書きしないように。

1. インストーラをLegacy BIOSモードで起動する
2. インストール先メディアをフォーマットする
    - パーティションテーブルはGPT
    - 第1パーティションをFAT32にフォーマット、容量は200MiB以上
    - 第2パーティションはubuntuのroot（ext4）
    - swapは無し（USBメモリなので）

## インストール

普通にインストール。
ブートローダはLegacy BIOS対応のGRUBにする。
インストールが終わってもまだ再起動しない。

## Fat32パーティションの設定

インストール先のUSBメモリをマウントして`fstab`を編集。Fat32のパーティションのマウント先を `/boot/efi` にする。

## EFIブートローダ

インストール先メディアのFAT32パーティションをどこか適当にマウントする。

署名つきのEFIブートローダが欲しいので，インストールメディアから `BOOTx64.EFI` と `grubx64.efi` をコピーする。

`grub.cfg`を作る。中身は

    configfile (hd0,gpt2)/boot/grub/grub.cfg

以上のファイルをFAT32に次の配置で置く。

     /EFI/BOOT/BOOTx64.EFI
     /EFI/BOOT/grub.cfg
     /EFI/BOOT/grubx64.efi


## 再起動

BIOSをUEFIモードに戻して再起動。
うまくインストールできていればUEFIでUbuntuがブートする。
VirutalBoxのGuestAdditionsによる時刻同期の設定方法

# 発端

VirtualBox上にCentOS 6.7のサーバを構築・稼働させていましたが、先日、VirtualBoxをバージョンアップさせてからNTPによる時刻同期ができなくなっていました。

現象としては、時刻がかなりのスピードで遅れていく。
NTPDの代わりにChronyを入れてみたり、いろいろと試行錯誤するも時刻同期がうまくいかない状況。仕方ないので、VirtualBoxのAddtionを突っ込んで、時刻同期するようにしました。

# VirtualBoxのAddtionによる時刻同期設定
## 1. VitualBoxのAdditionのインストール

(1) VirutalBoxのメニューから、「デバイス」-「Guest Additonalのインストール」を選択

(2) CDのマウント

	# mkdir /mnt/cdrom
	# mount /dev/cdrom /mnt/cdrom

(3)Additionalのインストーラーの起動

	# cd /mnt/cdrom
	# /bin/sh VBoxLinuxAdditions.run
	
これで数分待てばAdditionのインストールは完了

## 2.時刻同期の設定
(1) Addtionをインストールするとデフォルトで、ホストOSとゲストOS間での時刻同期はされるのですが、その閾値はデフォルトでは20分となっているそうです。つまり20分くらい時刻がずれないと時刻の補正はしてくれないということ。なので、下記コマンドで閾値を1分に変更

	# /usr/sbin/VBoxService --timesync-set-threshold 60000

(2) 再起動してもデフォルトに戻らないように設定

	# VBoxControl guestproperty set "/VirtualBox/GuestAdd/VBoxService/--timesync-set-threshold" 60000
Three.js用のX-fileインポータを作ってみる（完了）

## ドーモ、Javascript サン。　レガシーXNA野郎　デス

ば…バカな！XNA！あいつは死滅したはず！（してます）


Three.jsでは、すでに様々な形の３Dモデルローダーが提供されていますが、自分が使いたかった肝心の「Xファイル（directXのファイル）」のローダーが、ありませんでした。

DirectXファイルの多くはFBXに変更でき、そこから各種形式（MMDとかJsonとか）に変換すれば、Three.jsで読めたりもします。

 ですが、上記の一時ファイル変換には３Dモデリングソフトなどを介す必要があり、３Dモデルソフトウェアに明るくない人とか、~~昔一緒にゲームを作ったモデラーさんはすでに音信不通とか~~、DirectX形式のファイルをそのまま使いたい場合があると思います。　　ってかあったんです。自分に！！泣いてなんかいないぞ。


ということで、作りました。　[Three.js用のDirectXファイル（X-file）用のインポータ](https://github.com/adrs2002/threeXfileLoader)。

2017/03/07アップデート。アニメーションが妙な形式ではなく、Three.js標準っぽい形式に対応
2017/11/15大幅アップデート。内部8割書き直し。読めるファイルが増えました。たぶん。

/***********************************/

##できること
>モデルの読み込み
>テクスチャの読み込み
>アニメーションの読み込み


##できないこと
>バイナリ形式Xfileの読み込み（現在はテキスト形式のみ）
>詳細なマテリアルの読み込み


/****************************/

##使い方
1.Three.jsをしっかりとインポートして、初期化します。
このとき、

```
THREE.TextureLoader();
THREE.LoadingManager();
```

を忘れずに宣言しておいてください。まぁなくても大丈夫ですが。

2.上で宣言したLoadingManagerとTextureLoader　を引数に、 XfileLoaderを宣言します。

上も絡めた例

```javascript
manager = new THREE.LoadingManager();
Texloader = new THREE.TextureLoader();
loader = new XfileLoader(manager, Texloader);
```


3.読み込むファイルパス、読み込んだ後実行する関数などをセットします。
一番重要なのは、しっかりと、「シーンオブジェクトに追加する」ということだったりします
例

```javascript
   loader.load(['testmodel.x'], function (object) {
        // モデルは配列で返ります。1つしかなくても配列で返ります。
        for (var i = 0; i < object.models.length; i++) {
            Models.push(object.models[i]);    
            scene.add(Models[i]);             
        }
   }, onProgress, onError);
```


3.5.　アニメーションがある場合は、もうちょっと頑張ります。
(下記サンプルのhtmlソースを参照ください）

```
    var Models = [];
    var animates = [];

    loader.load(['model.x'], function (object) {
        for (var i = 0; i < object.models.length; i++) {
                Models.push(object.models[i]);    
                scene.add(Models[i]);             
        }

        var loader2 = new THREE.XLoader(manager, Texloader);
        loader2.load(['animation.x'], function () {
            
            loader2.assignAnimation(Models[0]); 
            animates.push(Models[0].animationMixer);
            var stand = Models[0].animationMixer.clipAction(Models[0].geometry.animations[0].name);
            stand.play();

        }
        object = null;
    }, onProgress, onError);

```

4.それっぽく表示されます。


##動作サンプルてきなの
[サンプル](http://adrs2002.com/sandbox/xloader/xFileLoaderSample.html)

github には、[日本語のReadme](https://github.com/adrs2002/threeXfileLoader/blob/master/README.ja.md)も用意しました。せっかく書いたので活用してやってください。


/****************************/

有難いことに、Ver80あたりから、three.jsの公式サンプルの方にも収録させていただいております。
GithubにはThree.jsのサンプルのものよりも新しいバージョンが公開されていますので、必ずそちらから落として使ってみてください。

なにせサンプルファイルが少ないので、ご利用＆バグ報告お待ちしております　m(_ _)m
webを支える技術メモ（第2部）

読書メモ
自分なりに重要なところだけをまとめた。


## URI

### URIの仕様

* URIとはUniform Resource Identifier の略
* 統一リソース識別子　=>　リソースを統一的に識別するIDのこと
* URLとの違い
> * URL => 場所を示す書き方のルール
> * URI => 名前または場所を識別書き方のルールの 「総称」

#### 構文

URI
```
http://blog.example.jp/entries/1
```

* URIスキーム :http
> HTTPでアクセスできることを示す

* ホスト名 :blog.example.jp
> DNSで名前が解決できるドメイン名がIPアドレスでインターネット上で必ず一意となる

* パス :/entries/1
> パスはホストの中でリソースを一意に示す

#### 絶対URIと相対URI
* ルートから記述したパスを絶対パス
* カレントディレクトリからのパスを相対パス

```
* 絶対URI
http://example.com/foo/bar/

* 相対URI
/foo/bar
```

現実の例
道案内にて


* 今いる場所が近い

> この先の信号を右行ってすぐを左に行けば着くよ
のように現在地から説明

* 今いる場所が遠い
> 東京都渋谷区××町１−１−１
のように都道府県、市町村名など住所を指定して行き先を説明

### URIの設計

#### クールなURI
クールなURIとは良いURIのこと。

* Cool URLs don't change
> 変わらないURIこそが良いURI

#### 変わりにくいURIの設計
* プログラミグ言語に依存した拡張子やパスを含めない
* メソッド名やセッションIDを含めない
* URIはリソースを表現する名詞にする

このような設計する利点として、ユーザビリティが高まる
> * 一般の人から見ても勘違いしないようなURIであること
> * 単に文字数的にも覚えるのが楽になる

#### URIの重要性
* URIはリソースの名前
* URIは寿命が長い
* URIはブラウザがアドレス欄に表示する


いやーもっとここは詳しくしてよーや、ここは要らないだろ〜などあればコメントください。
PowerShell で ClosedXML を使って Excel ファイルを作成する

[ブログからの転載](http://1bed.allright.life/?p=2206)

# 経緯

以前 [PowerShell で Excel をどうのこうのすることに興味を持ってくれると嬉しい](http://1bed.saloon.jp/?p=2095) としてブログを書いたことがあります。

その時の方法では、 Excel がインストールされている必要がありましたが、ClosedXML というライブラリを使うと Excel がインストールされていなくても Excel のファイルを作れることを知りましたので、少し試してみたいと思います。


# 環境

* Windows 10
* PowerShell 5.0
* ClosedXML 0.76.0
* Microsoft Open XML Format SDK 


# 作業ディレクトリ

作業ディレクトリをデスクトップに作りました。


# ClosedXML の準備

まずはサイトでダウンロードします。 zip 形式でダウンロードできます。

* [ClosedXML - The easy way to OpenXML](https://closedxml.codeplex.com/)

![01.png](https://qiita-image-store.s3.amazonaws.com/0/118961/f9b2f84c-c0c3-348c-5ef8-3a5c3223e5a7.png)


ダウンロードしたライブラリにはセキュリティの観点からブロックが施されていますので、解除をして解凍します。

ダウンロードした zip ファイルを右クリックしてプロパティを開き、ブロックの解除にチェックを入れて OK ボタンを押します。

![02.png](https://qiita-image-store.s3.amazonaws.com/0/118961/85aa4756-85b0-4bab-7f98-44818d462a42.png)

その後、zip ファイルから ClosedXML.dll を取得して、作業ディレクトリに保存します。


# Microsoft Open XML Format SDK の準備

[ClosedXML のドキュメントページ](https://closedxml.codeplex.com/documentation) からも DLL を直接ダウンロードできますが、今回は
Microsoft のサイトから Microsoft Open XML Format SDK をダウンロードします。

* [Open XML SDK 2.0 for Microsoft Office](https://www.microsoft.com/ja-JP/download/details.aspx?id=5124)
* [Open XML SDK 2.5 for Microsoft Office](https://www.microsoft.com/en-us/download/details.aspx?id=30425)

ダウンロードページの例
![03.png](https://qiita-image-store.s3.amazonaws.com/0/118961/5e69b504-83eb-c68f-93c5-ee6bb27f7b27.png)


今回私は 2.0 をインストールしてみましたが、私の環境では、msi を実行すると、 C:\Program Files (x86)\Open XML SDK\V2.0\lib に配置されました。

Office のバージョンと関係があるようです。

| MS Office | Open XML Format SDK | 
| --- | --- |
| Office 2007 | SDK 1.0 |
| Office 2010 | SDK 2.0 |
| Office 2013 以降 | SDK 2.5 |

ClosedXML 公式で配布されていたのは、2.0 と 2.5 でした。


# Hello world

早速 Hello world を書いてみます。

```ps1
[Reflection.Assembly]::LoadFile("$PSScriptRoot\ClosedXML.dll")
[Reflection.Assembly]::LoadFile("C:\Program Files (x86)\Open XML SDK\V2.0\lib\DocumentFormat.OpenXml.dll")

$workBook = new-object ClosedXML.Excel.XLWorkbook
$workSheet = $workBook.Worksheets.Add("Sheet1")   
$worksheet.Cell("A1").Value = "Hello world";
$workBook.SaveAs("$PSScriptRoot\helloworld.xlsx")
```

結果はこうなりました

![04.png](https://qiita-image-store.s3.amazonaws.com/0/118961/265436cf-b985-e965-a1a9-6fba9d341f97.png)


# 考察

とても簡単でしたし、動作がとても軽快で驚きました。以前の方法だと、何らかの理由で COM オブジェクトの破棄ができなかった時は、Excel のプロセスが残ってしまうという事がありましたが、その危険性もなさそうです。

気がついた点は次の通りです。

## メリット

* 動作が軽快
* Excel が入っていないマシンでも実行できる **※重要**
* オブジェクトの破棄に気を配る必要がない


## デメリット

* xls 形式のファイルは扱えない (Office 2007 以上限定)
* 環境構築が Excel インストールだけに比べると煩雑
npmには公開されていないパッケージをnpmでインストールする方法

### __メモ書き__

> bowerにはあるけどnpmにはないパッケージをbowerを使わずにnpmでインストールしたいことがあったので   
npmでインストールしたいリポジトリに`package.json`があること
なくてもどうにかできそうだけど   
バージョンは指定できない?

### __やり方__

githubのリポジトリの場合
リポジトリの前に`git+`
リポジトリの後に`.git`
をつけて
例) device.jsの場合 リポジトリ(https://github.com/matthewhudson/device.js)

```
npm install git+https://github.com/matthewhudson/device.js.git --save-dev
```

### __インストール完了__
自分の`package.json`に追加されていることを確認

```json:package.json
"devDependencies": {
  "device.js": "git+https://github.com/matthewhudson/device.js.git"
}
```

### __USAGE__

```js:main.js
import device from 'device.js'
```


### __その他の例__

* jquery/PEP(https://github.com/jquery/PEP)   
```
git+https://github.com/jquery/PEP.git
```
* swiper(https://github.com/nolimits4web/Swiper)   
`git+https://github.com/nolimits4web/Swiper.git`
FacebookページのUIがしれっと変わってた。

##突然の変更
今日の夕方、たまたま管理してる Facebookページを開いたら、UI 変わってたw
（事前告知とかあったっけ？？）

今まで、「プロフィール画像」と「カバー画像」は重なったデザインでしたが、今回のリニューアルで離れて表示されるようになりました。
**「プロフィール画像」と「カバー画像」を組み合わせたデザイン**にされていた Facebookページをご担当の方は、ぜひご確認くださいーーー！！


##新しい画像サイズ
「公式からサイズが発表されてた！」と同僚くんに教えてもらった！！（あざーす！）
→プロフィール写真とカバー写真 | Facebookヘルプセンター
https://www.facebook.com/help/492441920771107/

・カバー写真： 828 × 315 ピクセル （推奨：851 × 315 ピクセル、PNG）
・プロフィール写真： 170 × 170 ピクセル （推奨：180 × 180 ピクセル以上、正方形、PNG）
　
※サイズが変わるのは「プロフィール写真」だけなので、個別の画像をアップされている場合は、こちらだけ変更すればよさそう。
（カバー写真のサイズが、PC表示サイズと推奨サイズで横幅だけ微妙に違うのが気になる...。トリミングされるのか、センタリングされるのか...？）



##（参考） 旧サイズ
・カバー写真： 851 × 315 ピクセル
・プロフィール写真： 160 × 160 ピクセル
→【Facebook】Facebookページの「カバー写真」について（2014年6月リニューアル版） ｜ Tips Note by TAM
http://www.tam-tam.co.jp/tipsnote/html_css/post5082.html
パスワードも公開鍵もなしに ssh できる Docker  イメージ

使い捨てのテスト用のコンテナを作るため、パスワードも公開鍵もなしに ssh できる Docker イメージを作ってみた。

## 用意するファイル

### Dockerfile

```
FROM ubuntu
RUN apt-get update \
  && apt-get install -y openssh-server \
  && rm -rf /var/lib/apt/lists/*

# empty root password
RUN passwd -d root

# allow root to ssh without password
COPY sshd_config /etc/ssh/sshd_config
```

### sshd_config

```
PermitEmptyPasswords yes
PasswordAuthentication yes
UsePAM no
```

## イメージ作成

```
$ ls
Dockerfile sshd_config
$ docker build . -t ubuntu_sshd
```

## コンテナ上の sshd 起動

```
$ docker run -it ubuntu_sshd
# service ssh start
# ifconfig eth0
=> IP アドレスを取得（例:173.17.0.2)
```

## コンテナに ssh 接続
```
$ ssh -l root 173.17.0.2
```

## 感想

## Dockerfile
Docker 初心者なので、こういう使い方でよいのかよくわからない。
本当は、CMD とか使って、docker run した瞬間に sshd が立ち上がるのがかっこいい気がするが、どうやってデーモン化して永続的にコンテナーで走らせられるのかよくわからない。

たぶん

```
CMD ["service", "ssh", "start"]
```

で行けそう。でも、同時に IP アドレスも表示するのは、どうしたらいいのだろうか？

### sshd_config

デフォルトのファイルはいろいろいっぱい書いてあるが、ほとんどはデフォルト値が書かれているだけっぽく、上のようにたった数行書くだけでも sshd が立ち上がるのは興味深い。 

## 参考
[公開鍵なし/パスワードなしでSSHログインする設定](http://qiita.com/FGtatsuro/items/4893dfb138f70d972904)

## 追記
「Docker イメージで sshd」というと、いまや良くないイメージがあるが、まえがきで書いたとおり、これは技術テスト用のイメージであって、実運用を念頭においたものではないことを断っておく。

たしかに実運用ではいまどき ssh は極力使わないほうがいいだろう。ただ、どんな状況でも絶対にダメというわけではなく、技術テストなどの適切な場面があれば使ってもよいだろう。TPO に合わせて使い分けていけばいいだけのことだ、というのが私の意見だ。
C#-インデクサ について

インデクサ使って実装できたらかっこいい気がするなーと思ったのでちょっとだけ調べてみました。

##インデクサとは?
インデクサ = indexer
インデクサを使うとオブジェクトを配列やListのように扱うことができるようになります。
インデクサはプロパティと似ている。

```lang:こんな感じでデータにアクセスできるようになります。
		MonsterManager manager = new MonsterManager ();
		var monster = manager [0, "hoge"];
		var monster2 = manager [0];
```

##実装コード

```lang:インデクサを実装しているMonsterManager
using System.Collections.Generic;
using System;
using UnityEngine;

public class MonsterManager
{
	[SerializeField]
	private List<Monster> monsterList = new List<Monster> ();

	public MonsterManager ()
	{
		monsterList.Add (new Monster ("くっぱ"));
		monsterList.Add (new Monster ("すらいむ"));
		monsterList.Add (new Monster ("とろーる"));
	}

	public Monster this [int index] {
		get {
			return monsterList [index];
		}
		set {
			monsterList.Add (value);
		}
	}

	[Serializable]
	public class Monster
	{
		public Monster (string name)
		{
			Name = name;
		}

		public int Hp {
			get;
			set;
		}

		public int Atk {
			get;
			set;
		}

		public string Name {
			get;
			set;
		}

		public override string ToString ()
		{
			return "Monster:" + Name;
		}
	}
}
```

```lang:インデクサを使ってMonsterにアクセス
	void Start ()
	{
		MonsterManager manager = new MonsterManager ();
		var monster = manager [0];
		Debug.Log (monster.ToString ());
	}
```

なんかちょっとかっこいい

##インデクサの実装方法

```lang:基礎文法
要素型 this[int index]
{
	get
	{
		return 要素[index];
	}
	set
	{
		要素.add(value);
	}
}
```

- インデクサに名前をつけることはできません。
- getでは要素型を返す必要があります。
- setでは要素型のvalue変数が渡ってきます。
- this[int index]の**[int index]**はintである必要はありません。別の型でOKですし、2つ以上あっても大丈夫です。
- インデクサは~~オーバーライド~~オーバーロード(間違えちゃいけない;;)することができます。

```lang:2種類のインデクサを実装することも可能
	public Monster this [int index, string name] {
		get {
			return monsterList [index];
		}
		set {
			monsterList.Add (value);
		}
	}

	public Monster this [int index] {
		get {
			return monsterList [index];
		}
		set {
			monsterList.Add (value);
		}
	}
```

```lang:インデクサを使ってアクセス
		MonsterManager manager = new MonsterManager ();
		var monster = manager [0, "hoge"];
		var monster2 = manager [0];
```

うーん、かっこいい。
が、使い慣れていないと混乱を生む可能性がたかいな
Nat GateWayの正常性をzabbixで監視

# 目的
NatGatewayはフルマネージドサービスの為、カスタムスクリプトが使用できず、cloudwatchでモニターできないので、awscliの結果を整形してZabbixで取り込む。
[NatGateway](http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/vpc-ug-ja_jp.pdf)の説明は省きます

# 方法
1. awscliでNatGatewayのstatus取得
2. 出力をjqで整形
3. 整形データをzabbix-senderでzabbix-serverへpush

# 設定

1. zabbix-serverに”NatGateway”グループを作成
2. 作成したグループに監視対象のNatGatewayをホストとして作成（名前はなんでもいい）
3. 作成したホストにアイテムを作成

|名前|タイプ|キー|データ型|データ形式|アプリケーション|
|:--|:--|:--|:--|:--|:--|
|NatGateway-get-status|Zabbixトラッパー|sender_natg1|数値(整数)|10進数|Sender|



* 監視対象のNatGatewayのステータスを取得し整形
    * zabbix-senderのオプション
        * z - Zabbix サーバのホスト（IP アドレスでの指定でも可）
        * s - 監視対象のホスト名 （Zabbix-serverで登録されたもの）
        * k - アイテムキー
        * o - 送信する値
    * vpc-*****-nat-*********は作成したホスト名

```bash
#!/bin/bash

result1=$(aws ec2 describe-nat-gateways --nat-gateway-ids nat-********* | jq -r '.NatGateways[].State')
result2=$(aws ec2 describe-nat-gateways --nat-gateway-ids nat-********* | jq -r '.NatGateways[].State')
if [ $result1 = "available"  ]; then
 sender1=1
 zabbix_sender -z 127.0.0.1 -s vpc-*****-nat-********* -k sender_natg1 -o $sender1 -vv
else
 sender1=0
 zabbix_sender -z 127.0.0.1 -s vpc-*****-nat-********* -k sender_natg1 -o $sender1 -vv
fi

if [ $result2 = "available"  ]; then
 sender2=1
 zabbix_sender -z 127.0.0.1 -s vpc-*****-nat-********* -k sender_natg1 -o $sender2 -vv
else
 sender2=0
 zabbix_sender -z 127.0.0.1 -s vpc-*****-nat-********* -k sender_natg1 -o $sender2 -vv
fi
```

* ログファイル作成

```bash:/var/log/zabbix/zabbix_sender.log
(snip)
info from server: "processed: 1; failed: 0; total: 1; seconds spent: 0.000043"
sent: 1; skipped: 0; total: 1
info from server: "processed: 1; failed: 0; total: 1; seconds spent: 0.000077"
sent: 1; skipped: 0; total: 1
info from server: "processed: 1; failed: 0; total: 1; seconds spent: 0.000026"
sent: 1; skipped: 0; total: 1
info from server: "processed: 1; failed: 0; total: 1; seconds spent: 0.000043"
sent: 1; skipped: 0; total: 1
(snip)
```

* 5分毎に実施するようcron処理

```bash
$ cat /etc/crontab | egrep -1 '^#.20160804'

# 20160804 natgateway status check Description by me
*/5 * * * * root /etc/zabbix/scripts/get_natg-status.sh >> /var/log/zabbix/zabbix_sender.log
```
* ログローテート

```bash:/etc/logrotate.d/zabbix-sender
/var/log/zabbix/zabbix_sender.log
{
        missingok
        monthly
        compress
        create 0664 root root
}
```

* 結果

```bash
$ tail /var/log/cron | egrep '.*get_natg-status.sh'
Aug  4 18:30:01 ******* CROND[30363]: (root) CMD (/etc/zabbix/scripts/get_natg-status.sh > /dev/null 2>&1)
Aug  4 18:35:01 ******* CROND[30660]: (root) CMD (/etc/zabbix/scripts/get_natg-status.sh > /dev/null 2>&1)
Aug  4 18:40:01 ******* CROND[30910]: (root) CMD (/etc/zabbix/scripts/get_natg-status.sh > /dev/null 2>&1)
```

```text
nat-********: NatGateway-get-status
2016/08/04 19:40:05	1470307205	0
2016/08/04 19:35:05	1470306905	0
```
シェルスクリプトで、あるファイルの更新日時が、ある特定の日時よりも新しいか調べる。

[入門UNIXシェルプログラミング](https://www.amazon.co.jp/dp/4797321946) の第8章に出てきた例なのですが、
日常の仕事で使えそうなのでメモしておきます。


```bash
touch -t ${DATETIME} /tmp/compared-file.$$

if [ -n "`find ${FILENAME} -newer /tmp/compared-file.$$ -print`" ]; then
  echo "Yes: ${FILENAME} is newer than ${DATETIME}." 
else
  echo "No: ${FILENAME} is not newer than ${DATETIME}." 

rm -f /tmp/compared-file.$$
```
上記で、
- FILENAME には対象のファイルパス
- DATETIMEには
　　　　　　[[CC]YY]MMDDhhmm[.SS]
　形式の日時が入っているとする。('20160804194500'みたいな感じ)



３つのコマンド使いがポイント：
- touch コマンドを日時指定ありで使って比較対象の空のファイルを作る。
　（上記の例では、-t オプションを使っているが、-d でも可）
- find コマンドの -newer オプションを使って、調べたいファイルがこの空のファイルよりも新しいかどうかを、
- test コマンドの -n でfindが空ではない文字列を返すかどうかでチェックする。
HyperTermを入れてみたら、楽しかった

黒い画面はiTerm2派なわたしが、HyperTermを使ってみた感想です。

# HyperTermとは
HTML/CSS/JavaScriptで作られたターミナル。
Electron + React + Reduxで作られているらしい。( 今風😊 )
JavaScriptで拡張し放題っぽいのが素敵ですね🌹
**web** https://hyper.is/
**GitHub** https://github.com/zeit/hyperterm

# インストール
[Homebrew Cask](https://caskroom.github.io/) またはリンクから直接DLできます。
コマンド打ち込むのでもポチッでもお好きな方で良さそうです😇

# Configとか
`~/.hyperterm.js`を開くと既に初期設定があるので、好きなように設定します。
私は明るめの色が好きなのでこんな感じに変えてみました😀💡
![画像](https://qiita-image-store.s3.amazonaws.com/0/61841/dcaa38dd-4cc1-a040-f7e9-72374c8fa180.png)

# Pluginとか(Extensions/Theme)
Pluginは、サンプルが提供されていたのでそれをいれてみました🙆
#### [hyperpower](https://github.com/zeit/hyperpower)
カーソルに追従しつつ、はじけるのが楽しいプラグイン。**wowMode搭載(楽しい😇 )**
192行で書かれているのでさくっと読めます👀

####[hyperyellow](https://github.com/zeit/hyperyellow)
こちらはテーマで黄色くなるみたいです。15行で書かれていました。

####[awesome-hyperterm](https://github.com/bnb/awesome-hyperterm)
その他にもこちらでたくさん紹介されています。

# 感想
拡張のしやすさがとてもいい気がしました。なにより楽しい✨
色々なギミックをつけて、自分好みのターミナルもつくれる✨ 😇 ✨
(*この機会にプラグインとか作ろうかなという気持ち...*😌 )
まだ日本語対応していないみたいなので、対応したら実務でも使えそうです🙆

# [参考]HyperTermについて書かれているブログ
[ターミナル作業が爽快になるターミナルエミュレーター: HyperTerm](http://rcmdnk.github.io/blog/2016/07/24/computer-mac/)
【Trainer's Recipe】CSS3の疑似クラス「:not」についてのちょっと便利なTips

このEntryは、<a href="http://gsacademy.tokyo/" target="_blank" style="text-decoration: none;">G's ACADEMY TOKYO</a>のトレーナー/チューターによる投稿記事です。
授業の中で出たちょっとした質問や疑問、トレーナーが関心のある新技術等を脈絡なく綴っていきます。

![css3_logo.jpg](https://qiita-image-store.s3.amazonaws.com/0/104065/1283a3cf-f3ed-058b-8fb6-b6cce7a5d7a8.jpeg)


こんにちは！ ジーズアカデミートレーナーのコスゲです。
CSS3で導入された「:not()」疑似クラス、すごく便利ですよね！
ご存知の方も多いかもしれない「:not()」疑似クラスについて、今日はちょっと便利なTipsを紹介します。

## 「:not()」疑似クラスについて実例を交えておさらい
「**:not()**」疑似クラスは、()の中に入る条件以外のセレクタにCSSを適用したい時に使える疑似クラスです。
たとえばこんなコードがあったとします。


```html:test1.html
<h1>桃太郎とゆかいな仲間たち</h1>
<ul>
 <li class="current">桃太郎</li>
 <li>猿</li>
 <li>犬</li>
 <li>きじ</li>
</ul>
```

```css:test1.css
li:not(.current){
  color:#f00;
}
```

この場合、上記のCSSは**「.currentがついていないli要素」に対して「文字色を赤くする」**命令を適用するので、桃太郎以外の「猿・犬・きじ」の文字色が赤くなります。
## 「:not()」疑似クラスの便利な使い方
よく、下記のような見た目のコンテンツが掲載されているWebサイトを見たことはないでしょうか。



2016.07.03 新着イベント更新しました!
- - - 
2016.07.03 プロフィール更新しました!
- - - 
2016.07.03 インフォメーション更新しました!




Webサイトの更新情報を表示する場所やニュースサイトでの「その日のニュースTopics」の短文を並べる時に使われたりしていますよね！

よく見てみると、ニュースのリストが3つ並んでいて、ニュースの要約文を表す文字の下に線が引かれていますが、**一番下のニュースの要約文には下線が引かれていません。**
CSSを習いたての頃は、こんな風に書いていました。

```html:test2.html
<ul>
 <li>2016.07.03 新着イベント更新しました!</li>
 <li>2016.07.03 プロフィール更新しました!</li>
 <li>2016.07.03 インフォメーション更新しました!</li>
</ul>
```

```css:test2.css
li{
  border-bottom:solid 1px #333;
}

li:last-child{
  border-bottom:none;
}
```
こんな感じで、一番最後の要素に適用できる**:last-child**という疑似クラスを使ったり、あるいは一番最後の要素に何かしらのclassをつけるなどして、一旦、**li要素すべてにborder-bottomを適用し、最後のli要素はborderなしと設定**するやり方です。

しかし、「**:not()**」疑似クラスを使用すると、以下のようなCSSで同じように「**一番最後のli要素だけborder-bottomをなしにする**」ということを実現することができるんです！

```css:test3.css
li:not(:last-child){
  border-bottom:solid 1px #333;
}
```
日本語で表現するなら「一番最後以外のli要素にborder-bottomを適用する」ということですね！

地味ですが、ちょっとでもCSSのコードをスマートに短く書くことが出来ますので、この考え方を覚えておくとSassなどでも応用が利くのではないでしょうか！

以上、<a href="http://gsacademy.tokyo/" target="_blank" style="text-decoration: none;">G's ACADEMY TOKYO</a>トレーナーのコスゲによるCSS3の疑似クラス「:not」についてのちょっと便利なTipsでした！
[Windows]Windows コンテナーを使うための準備

早く遊んでみよう！

Windows コンテナーに関するドキュメント
https://msdn.microsoft.com/ja-jp/virtualization/windowscontainers/containers_welcome

Windows 10 の Windows コンテナー
https://msdn.microsoft.com/ja-jp/virtualization/windowscontainers/quick_start/quick_start_windows_10

Windows Server 2016だとWindows Server コンテナー（Windows Server Coreベース）、Windows 10だとHyper-V コンテナー（Nano Serverベース）、とコンテナーの基本イメージが違うのか（当たり前？）。

Getting Started with Docker for Windows
https://docs.docker.com/docker-for-windows/

2016年版、Dockerのすべてが5分でわかるまとめ!(コマンド一覧付き)
http://paiza.hatenablog.com/entry/docker_intro
Pow(powder) + Ruby on Rails の環境でPC再起動したら .devが開かなくて詰んだ件(解決済み)

---
※2017/12/13追記。
Chrome(ブラウザ)がVer.63系になると、.devにはHTTPSが必須となります。しかも強制アップデートで。
HSTS (HTTP Strict Transport Security) ってやつ。簡単に言うとHTTPS必須にするよーの話。
この強制的にHTTPSにするよの対象に「.dev」ドメインが巻き込まれましたので、Powなどで.devにしてると色々問題出るよという。
例えばHTTPSで来たものを強制的にHTTPへとかroutesなどでやってると、永遠にループして帰ってこないｗ
※pumaを入れ直そう => [puma & puma-dev で利用中の.devを.testなどに変更する] (https://qiita.com/cyborg__ninja/items/46f6e4d3674ef572d6bd)

---

# ダイジェスト
- 多分僕しかこういう事象に遭遇してないと思う
- 再起動したら死ぬ
- 再インストールしたら直る

# 環境
- Ruby on Rails
- Mac OS X
- Pow(powder)

# 何が困ったのか

- hogehoge.devにアクセスしたら ERR_CONNECTION_REFUSED
 -> DNS解決できてないの？ローカルアドレスなのに？

- apacheを動かしたら、白い画面に高らかに「It works!」と言われて涙を流す
 -> スタティックな返事は要らぬ。Rails動かしてください(泣
 -> development.log とコマンドを打って見ても当たり前にログなんて流れない

これがOSxアップデートしたあとの再起動とかで、さくっと発生する。

## 再現方法

PCを再起動する。
powderが動作しない。hogehoge.dev は It works だぜ！

# (多分の)原因

powのインストールを古い時代のOSx(たしかsnow leopardぐらいからLionぐらい)に入れて、
アップデート、アップデートを繰り返してきていてyosemiteの時に大きくpf(personal firewall)関係の修正が入ったため、powもアップデート対応をした。

で、この辺りで自分の環境は起動時に動かす設定などが飛んだ？のか上手く動作したりしなかったりをするようになった（と思う)。

正直なところ原因は不明。調べるのも億劫で調べていない。

# 解決方法

参考：[Running Pow with Apache](https://github.com/basecamp/pow/wiki/Running-Pow-with-Apache)

再インストールするのがいいらしい。

```
$ curl get.pow.cx/uninstall.sh | sh
$ echo 'export POW_DST_PORT=88' >> ~/.powconfig
$ sudo curl -L https://gist.githubusercontent.com/soupmatt/1058580/raw/zzz_pow.conf -o /private/etc/apache2/other/zzz_pow.conf
$ sudo apachectl restart
$ curl get.pow.cx | sh
```

単純に上から順にコマンドばしばしと。
インストール完了後に www.hogehoge.dev にアクセスしたら稼働した。

# まとめ

僕だけの固有事例っぽいけど、もし同じ環境下で同じような事例があったら見てもらえればと。
　＆
未来の僕がPCを再起動したときに、また同じトラブルにあったときに解決できるように。
input type=dateで和暦（元号＋年）を表示する工夫

何なの？
====
すみません。

利用者の登録用紙みたいなのがあって、生年月日を西暦で書いてって誘導があるのにもかかわらず、どういうわけか和暦で書いてあるものが混在している場合、その登録のたびに「えーと昭和YY年って西暦何年だっけ？」と西暦と和暦の変換のために、入力のテンポが悪くなることありませんか？

「○○年引けばいいじゃん」
「○○年足せばいいじゃん」

確かにそうなんですけど、日常をぼんやりと過ごしていたら、その「○○年」もぼんやりとしてきて、結局何年だったか自信がなくなってググっている私がいました。

もうイヤなんです。
もう疲れたんです。
なので、入力コントロールに表示させればいいじゃんというわけなんですが。

こんなのありました。発想がしゅごい。Chrome限定。見た目んー。
> http://d.hatena.ne.jp/chi-bd/20160730/1469883831
> Chromeのinput[type=date]タグ内に和暦を表示する - Null and void

こんなのもありました。機能の割りに実装が大変そう。jQuery UIかー。
> http://pedal-blog.2-d.jp/datepicker-wareki/
> DatePickerの西暦を和暦で表示する方法 - Pedal Blog

で、JavaScriptで`Date`の`toLocaleDateString()`を使って何かできないかと模索した結果がこちらです。

実装
----
主に楽するために jQuery, Moment.js ,bootstrap3, font-awesome を使っています。
#### HTML
```html
<div class="form-group col-xs-12 col-sm-6">
  <label for="dateOfBirth" class="control-label">生年月日</label>
  <div class="input-group">
    <div class="input-group-addon">
      <i class="fa fa-calendar" aria-hidden="true"></i> <span class="jy" aria-hidden="true">元号XX年</span>
    </div>
    <input type="date" name="dateOfBirth" id="dateOfBirth" class="form-control" max="" title="入力してください。">
  </div>
</div>
```
#### JS
```js
$('#dateOfBirth').change(function() {
  var $dob = $(this);
  var d = moment($dob.val()).toDate();
  var jy = '元号XX年';
  if (d.toString() !== "Invalid Date") {
    jy = d.toLocaleDateString('ja-JP-u-ca-japanese', {
      year: 'numeric'
    });
  }
  $dob.prev().find('span.jy').text(jy);
});
```

実行結果
----
https://jsfiddle.net/adonim312/uL33ekLu/

で？
====
すみません。
ERROR: invalid locale name ja_JP.EUC_JPの対処

ERROR:  invalid locale name ja_JP.EUC_JPの対処

pg_dumpallで作成したファイルからリストアしようとすると次のエラーが発生する。

```
ERROR:  invalid locale name ja_JP.EUC_JP
```

ファイルの当該箇所は次のようになっていた。

```
CREATE DATABASE databasename WITH TEMPLATE = template0 OWNER = postgres ENCODING = 'EUC_JP' LC_COLLATE = 'ja_JP.EUC_JP' LC_CTYPE = 'ja_JP.EUC_JP';
```

システムにインストールされているロケールは次のとおりだった。

```
# locale -a
C
en_US.utf8
POSIX
```

ロケールがないのが原因なので、localedefコマンドでロケールをインストールした。

```
localedef -i ja_JP -c -f EUC-JP -A /usr/share/locale/locale.alias ja_JP.EUC-JP
```
Eloquentにつくったメソッドはビューでも簡単に使える


Eloquentに `account_ide` でDBを検索するメソッドを作った。
Eloquentだと `$this` が使えて便利。

```php:TripContents.php
<?php
namespace Test\PageApp\Models;

use Illuminate\Database\Eloquent\Model;
class TripContents extends Model {
    protected $table = "trips";

    protected $dates = ["trip_date"];

    public function getPlannerName(){
        $planner = Account::where('account_id', '=', $this["account_id"])->first();
        return $planner->name;
    }

}
```

ControllerでそのEloquentを使っておけば、

```php:Controller
$user_id = 10;
$user_trips = TripApplicant::where('account_id', '=', $user_id)->get();

$trips = [];
foreach($user_trips as $user_trip){
    $trip = TripContents::where('trip_id', '=', $user_trip["trip_id"])->first();
    $trips[] = $trip;
}

return view("front.myPage.tripList",[
    "trip_contents" => $trips
]);
```

Viewで生やしてメソッド使える。

```php:View
@foreach($trip_contents as $trip_content)

	<h2 class="title">{{ $trip_content->title }}</h2>
	<p class="plannerName">{{ $trip_content->getPlannerName() }}</p>

@endforeach
```
【Laravel5】X_FORWARDED_FOR の取得方法

プロキシサーバー経由のアクセス元IPアドレスを取得するのにハマったのでメモ。

結論、SymfonyRequest#setTrustedProxies(array) を呼べばOK。
`$request::setTrustedProxies([Request::ip()]);`
この後に
`Request::ip()`
を呼ぶとアクセス元のIPアドレスを取得できます。


LaravelのRequestがSymfonyRequesを継承してて、getClientIp()メソッド（Request::ip()の参照先）コメントにちゃんと書いてありました。

>     * This method can read the client IP address from the "X-Forwarded-For" header
     * when trusted proxies were set via "setTrustedProxies()". The "X-Forwarded-For"
     * header value is a comma+space separated list of IP addresses, the left-most
     * being the original client, and each successive proxy that passed the request
     * adding the IP address where it received the request from.

しっかり読め、ということですねw
[WIP] Before you leave for vacation

# Clarify you tasks' status and progress

- so that
    - your team can
        - know how it could cause delay
        - estimate if it can be recovered
        - decide if we should re-define schedule

# Push all your works to `WIP` branch

- so that
    - your team can
        - respect your wip works
        - restart working from your branch
        - take over your work
ブレース展開 by elixir

コーディング試験ってあるじゃないっすか。
あれでブレース展開つまり
```
abc-{1,2}-defg
=> abc-1-defg, abc-2-defg
```
を実装せよみたいな問題があったのですが、全然解けなくて悔しい思いをしたので復習がてら実装してみた。

# 考え方

最初実装した時は `/\{.*\}/` こんな感じで正規表現でマッチした部分を `,` でスピリットしてfor文で回すという発想で始めました。
ソースは[こちら](https://gist.github.com/1984weed/566c2f42d86053542a263bdc6e1ab991#file-brace-open-one-exs)

正規表現以外のソースもイマイチですがそれは置いておきましょう。。。

## 問題点

この正規表現は全力で貪欲です。つまり`aa{abc, {a,b}}12`みたいな入れ子のブレースが来た時に対応できません。
一番外側の枠の`{abc, {a,b}}`　でしか正規表現的には探索できないので結構イマイチです。

## 改善

外側にしか当たらないのであれば中身の部分`abc, {a,b}` を再帰的に回せばいいじゃーんって思ったんですが、このブレース展開の性質上最内のブレースから展開しないとうまくいかないんですよね。まずは`{a,b}`を正規表現で探索せにゃならんわけです。
ということで正規表現の実装から変えないといけません。 <- コーディング試験ではここをイマイチ理解できていませんでした。

ということで正規表現を以下のように書き換えます

```
/\{([^{}]+)\}/
```

`{}`の中に`{}`が入っていないものだけを抽出するのが目的です。
この正規表現であれば最内のブレースを探索できます。ここに気づかなかった。。。

## 再帰

さて最内のブレースを抽出できたのであとは最内から`,`で文字列を区切って再帰を回せばほーらできた。
ブレースが文字列から無くなるまで再帰は回します。

# ソース

```ex
defmodule OpenBraceTwo do

  def regex(str) do
    regex = ~r/\{([^{}]+)\}/
    cond do
      length(Regex.scan(regex, str)) > 0 ->
        {from, range} = Regex.scan(regex, str, return: :index) |> Enum.at(0) |> Enum.at(1)

        expander = String.slice(str, from, range)

        String.split(expander, ",")
        |> Enum.map(&(replace(str, from, range, &1)))
        |> Enum.map(&regex/1)
        |> List.flatten
        |> Enum.uniq
      true -> [str]
    end
  end

  def replace(str, from, range, replace_str), do: (if from - 2 > 0 do String.slice(str, 0..from - 2) else "" end) <> replace_str <> String.slice(str, from + range + 1..-1)
end
```

# まとめ

最初はうまく解くことができず結構難問？みたいに感じたのですが、考え方の整理をすれば割とシンプルな結論にまとめることができました。

まぁポイントは正規表現かなぁって思います!
Docker: MySQLのDBバックアップをDropboxに日次で保存する方法

suin/mysql-backup-dropboxは、MySQLのDBのオフサイトバックアップをラフに取りたいときに使うDockerイメージです。起動方法は次のように:

```bash
docker run \
  --name mysql_backup \
  -d \
  --restart=always \
  --log-opt max-size=1m \
  --log-opt max-file=5 \
  -e MYSQL_USER=root \
  -e MYSQL_PASSWORD=root \
  -e MYSQL_HOST=mysql \
  -e DROPBOX_ACCESS_TOKEN=$YOUR_TOKEN \
  -e SCHEDULE=@daily \
  suin/mysql-backup-dropbox
```

なお、Dropbox APIのアクセストークンの取得方法は[curlコマンドだけでDropboxにファイルを保存する。例えばmysqldumpの結果など](https://suin.io/542)参照。
IntelliJ IDEAチートシート

# 前提

* (私が)よく使うけどなかなか覚えられないもの、を中心に追記していきます。
* Windows向け。Macの場合は以下読み替えるとだいたい大丈夫と思います。
    * Ctrl -> Command
    * Alt -> Option

# チートシート
## とりあえずなんでも探す
* Shiftを2回

最悪これさえあればなんとかなる。

## クイックフィックス
* Alt + Enter

## クイックアウトライン
* Ctrl + F12

## アクション/コマンド検索
* Ctrl + Shift + a

## 設定を開く
* Ctrl + Shift + a でダイアログ表示後「settings」で検索

## 定義を見る (クイックビュー)
* Ctrl + Shift + i

## カーソル行のコードを上/下に移動する
* Ctrl + Shift + ↑ or ↓

## 実行/デバッグメニューを開く
* Alt + Shift + F10

## 停止
* Ctrl + F2

## デバッグ
|操作  |ショートカット |
|:--|:--|
|ステップイン   |F7   |
|ステップオーバー   |F8   |
|ステップアウト   |Shift + F8   |
|処理の継続   |F9   |

## ナビゲーションバーにフォーカスする
* Alt + Home

## 呼出階層を開く
* Alt + F7

## 呼出元の一覧を表示する
* Ctrl + Alt + F7

## テストクラスを作成する
* クラス名にカーソルをあわせ Alt + Enter

## テストクラス/ テスト対象クラスに移動する
* Ctrl + Shift + t

## Tipsを表示する
* Ctrl + Shift + a でダイアログ表示後「Tips」で検索

## git logを見る
* Ctrl + Shift + a でダイアログ表示後「git log」で検索

## 名前を変更する
* Shift + F6

## インターフェイスの実装を開く / クイック型階層
* Ctrl + Alt + b

## クラス図を表示する
* Ctrl + Alt + u

## 保存時にimportの文最適化
* Settingsを開き、
    * `Editor -> General -> Auto Import`の「Optimize imports on the fly」をONにする

## import文に「*」を使わないようにする
* Settingsを開き、
    * Editor -> Code Style -> Java
    * Importsタブで以下設定とする
        * Use single class import -> ON
        * Class count to use import with '＊' -> 100  (※. 十分大きな数字を設定しておくとよい。この場合同一packageからのimportが100個を超えると'＊'にまとめられる)

## Gradleプロジェクトの依存関係を更新する
* build.gradle編集後、Gradleウインドウの更新アイコン(赤枠部分をクリック![005.png](https://qiita-image-store.s3.amazonaws.com/0/131679/af352f71-e76a-3bf9-16ee-a1325ef6afc4.png)
)

## メソッドの折りたたみ表示を止める
### 課題
アクセサなど、メソッド本文が1行の場合に、

```
public String getName() {
    return name;
}
```

このように表示される。これを止めたい。

```
public String getName() { return name; }
```

### 対応
* Settingsを開き、
    * `Editor -> General -> Code Folding`にある「One-line methods」をOFFにする
WP-CLIのテストをローカルで実行する



WP-CLIでは、phpunitによるユニットテストの他にも、behatを使ったビヘイビア駆動のテストなどもしていて、WP-CLIにプルリクを送る際には事前にローカルでこれらのテストを実行したほうがいろいろ手っ取り早いです。

テストに必要な環境の構築や実際のテストに必要なコマンド等は`.travis.yml`を見れば書いてあるんですが、いざ実行しようとするとあれ？みたいなことを毎回繰り返すので手順をメモ。

## テスト環境の構築方法

以下のコマンドはすべてWP-CLIのディレクトリ直下で行うこと。

まず、過去にテストを行ったことがある場合、以下のコマンドでその環境を削除する必要があります。

MySQLのrootユーザーにパスワードが設定されていると後で実行するシェルスクリプトを手作業でごにょごにょする必要があるので注意。

```
$ rm -fr /tmp/wp-cli-*
$ echo "drop database wp_cli_test" | mysql -u root
```

つぎに環境をセットアップするためのシェルスクリプトを実行する。

環境変数が適切にセットされてないとうまく動かないのでここも注意が必要です。多くの場合このままでいけるはず。

```
$ WP_VERSION=latest WP_CLI_BIN_DIR=/tmp/wp-cli-phar bash ./ci/prepare.sh
```

## テストの実行

最後に以下のコマンドでテストを実行する。

```
$ WP_VERSION=latest WP_CLI_BIN_DIR=/tmp/wp-cli-phar bash ci/test.sh
```

WP-CIのテストではすべてのコマンドが順番に実行されますのでかなり時間がかかります。30分ぐらいは見ておいたほうがいいかも。

自分が修正したサブコマンドだけテストを実行するなら、以下のような感じです。

```
$ vendor/bin/behat features/comment.feature
```

上の例では`wp comment`及びそのサブコマンドのテストのみが行われます。

`features/`以下にはBehat用のテストケースがサブコマンドごとに別々のファイルで保存されています。

このテストコードは以下のようになってて、初めて見たときはこんなやり方があるのかと感動しました。

```
    When I run `wp plugin install akismet --version=2.5.7 --force`
    Then STDOUT should not be empty

    When I run `wp plugin list --name=akismet --field=update_version`
    Then STDOUT should not be empty
    And save STDOUT as {UPDATE_VERSION}

    When I run `wp plugin list --fields=name,status,update,version,update_version`
    Then STDOUT should be a table containing rows:
      | name       | status   | update    | version   | update_version   |   
      | akismet    | inactive | available | 2.5.7     | {UPDATE_VERSION} |
```
JobSchedulerの参考リンク

# JobSchedulerの参考リンク
オープンソースのジョブスケジューラーである、JobScheduler について勉強する際に参考にしたリンク。

製品マニュアル：JobScheduler Documentation
http://www.sos-berlin.com/jobscheduler-documentation

atmarkIT記事：OSS「JobScheduler」で実現するこれからの運用自動化
http://www.atmarkit.co.jp/ait/series/1290/

日本JobSchedulerユーザーグループ（JJUG改めNJUG）
https://sites.google.com/site/jobschedulerja/home
(memo)KubernetesのREST APIのLabelSelectorパラメータの書き方

k8sでdeploy後のPodの状態がS-in可能な状態になっているかをRest APIで確認する際に、LabelSelectorで対象を絞り込みたいんだけど、クエリパラメータの記述方法探しに10分以上時間食わされたのでメモ



http://kubernetes.io/docs/user-guide/labels/#list-and-watch-filtering

```
LIST and WATCH operations may specify label selectors to filter the sets of objects returned using a query parameter. Both requirements are permitted:

* _equality-based_ requirements: `?labelSelector=environment%3Dproduction,tier%3Dfrontend`
* _set-based_ requirements: `?labelSelector=environment+in+%28production%2Cqa%29%2Ctier+in+%28frontend%29`
```
Ubuntu14.04（32bit）へのTUTSchemeのインストール、或いは「Scheme入門」（湯浅太一 著：岩波書店 1991年）をGaucheで読む（網走番外地編）


何で『「Scheme入門」（湯浅太一 著：岩波書店 1991年）をGaucheで読む』のにTUTSchemeをインストールしなきゃならんのだ？　と思われるかもしれませんが、第7章マクロをGaucheで実行しているとエラーを返されること多く、「これ、TUTSchemeならホンマにこういう結果になんの？　ホンマに？」と、あまりに疑問に思い、とうとう、我がUbuntu14.04 32bitにTUTSchemeをインストールしてみました。

……これは、Ubuntu14.04にTUTSchemeをインストールを試みた男の記録である。（cv：田口トモロヲ）
ンカゼノナカンォスゥウウバルゥウウ。

まずはTUTSchemeのページ(サイトのダウンロードページ)へ行きます。URLは
http://www.spa.is.uec.ac.jp/~komiya/download/
です。

最初は
・UNIX/Cygwin版TUTSchemeとTUTScheme/Tk（ソース）
をダウンロードしまして
tus.tar.gz
を展開し、 cd で tus の中に入り、

***TUTSchemeのコンパイルとインストール***
**ソースからコンパイル＆インストールする場合**

にある通り
make tus
(sudo) make install-tus
してみましたが失敗。そもそもmakeしたときに

```

collect2: error: ld returned 1 exit status
make[2]: *** [lib/raw_tus] エラー 1
make[2]: ディレクトリ `/home/ユーザー/tus/tus.i686-pc-linux-gnu' から出ます
make[1]: *** [make-tus] エラー 2
make[1]: ディレクトリ `/home/ユーザー/tus' から出ます
make: *** [tus] エラー 2
```

ってエラー出てたもんなー、そりゃそーだよなー。

そんなわけで

***バイナリ版をインストールする場合***

を試してみました。まずは
・Ubuntu 9.10版TUTScheme（バイナリ）
をクリックしてダウンロードします。すると
tus-ubuntu9.10.tar.gz
がダウンロードされますので、名前をtus.tar.gzにリネームして（しなくてもよいのかもしれませんが、とりあえず）**展開せずに**
/usr/local
に置きます。この時、GUIでは上手くできませんでした。ctrl+Hでやってみたんだけどなー。なのでコンソールで
sudo cp ./tus.tar.gz /usr/local
な風味で、お、置けばいいじゃないっ！///

さて無事に置けたら、
cd /usr/local
(sudo) tar zxf tus.tar.gz
とします。すると
tus (若しくは tus2)
と打ちますと TUTScheme が起動しましたよ。ちなみに未だに tus と tus2 の違いが分かってませんすみません。

これでコンソールでTUTSchemeが使えますが、やっぱりEmacsで使いたいじゃないですかー↑
なので、あやぴーさんの[このページ](http://ayato.hateblo.jp/entry/20130710/1373448057)の

;; emacsでGauche

以下をEmacsのinit.elにコピペしまして、
Gauche
gosh
を
TUTScheme
tus (/ tus2)
に書きかえ、キーバインドを変えると……やっほー！EmacsでTUTSchemeが動いた！
……ただし今、2016年8月今日現在、ctrl+c→shift+gをしてもGaucheじゃなくてTUTSchemeが起動しちゃうんですわ。うーん、キーバインドを

```

(define-key global-map
  "\C-cJ" 'scheme-other-window)
```
と変えてみたんだけどなー。そしてctrl+c→shift+jでちゃんとTUTSchemeは起動するんだけどなー。
そんなわけでGaucheとTUTSchemeを使い分けるたびにinit.elを変えるという、七面倒なことをしてます！……誰だ？　今、「これだからにわかEmacserは」と言ったのは？

そんなこんなで、今私のOSには、二つのSchemeがインストールされてます。かっこいい！……ただし、アンインストールするときはどうすればいいんだろ？　と、ちょっとだけ複雑な心内環境。
PhpStorm に Phalconの .volt テンプレートにシンタックスハイライトを適用させる

# PhpStorm に Phalcon のvolt テンプレートにシンタックスハイライトを適用させる設定

## File > Settings > Editor > File types で下記ように足す。 

![setting_editors_file_types.png](https://qiita-image-store.s3.amazonaws.com/0/29840/0c01da2f-076c-e99a-7eb2-c9f5de3f6d3a.png)

## [参考にした英文サイト](https://coderwall.com/p/f6epbw/enable-highlight-lines-in-phpstorm-for-volt-phalcon-templates)
Phalcon3がでてたので触ってみた

Phalcon3がでてたので触ってみた

なんか早えーらしい

本家[https://phalconphp.com/en/download]

Mac X で一気に環境つくってphpのビルトインサーバーで立ち上げるスクリプトを本家からコピペ

```shell
brew search phalcon
brew install homebrew/php/php70-phalcon

brew tap homebrew/dupes
brew tap homebrew/versions
brew tap homebrew/php
brew install php70 php70-phalcon # Where "x" - minor number of PHP

git clone --depth=1 git://github.com/phalcon/cphalcon.git
cd cphalcon/build

sudo ./install
extension=phalcon.so

php -S localhost:8000
```

(ブラウザで8000ポートにアクセスしてみると)[http://localhost:8000/] Not Foundと表示されていれば成功

# とめかた Ctl + C

PHPも進化しまくってるな

さて何作ろうか　ポツーーーーーーーーーーーーーン
Akka HTTPはすでにSprayより速い

[ブログ](https://t-hiroyoshi.github.io/akka-http-is-faster-than-spray/)のコピペです。

先日[Akka 2.4.9-RC1](http://akka.io/news/2016/08/02/akka-2.4.9-RC1-released.html)がリリースされました。
今回のリリースはAkka HTTPのパフォーマンス改善に焦点を絞ったアップデートでAkka HTTPのパフォーマンスがSprayと同等かそれ以上になったと書かれています。

## Akka HTTP revenge

[以前](https://t-hiroyoshi.github.io/spray-akka-benchmark)Akka HTTPとSpray-canのベンチマークを取った時はSprayに軍配が上がりましたが、今回のアップデートはどれほどのものなのか軽く調べるために再度Akka HTTPのみベンチマークを取りました(Sprayはもう更新されていません)。

コードやベンチマーク環境は前回と同じ状態でAkkaのバージョンのみ上げています。

### Result

```
This is ApacheBench, Version 2.3 <$Revision: 1706008 $>

Server Software:        akka-http/2.4.9-RC1
Server Hostname:        localhost
Server Port:            8080

Document Path:          /
Document Length:        12 bytes

Concurrency Level:      10
Time taken for tests:   0.336 seconds
Complete requests:      10000
Failed requests:        0
Keep-Alive requests:    10000
Total transferred:      1820000 bytes
HTML transferred:       120000 bytes
Requests per second:    29805.82 [#/sec] (mean)
Time per request:       0.336 [ms] (mean)
Time per request:       0.034 [ms] (mean, across all concurrent requests)
Transfer rate:          5297.52 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.0      0       0
Processing:     0    0   0.4      0      17
Waiting:        0    0   0.4      0      17
Total:          0    0   0.4      0      17

Percentage of the requests served within a certain time (ms)
  50%      0
  66%      0
  75%      0
  80%      0
  90%      0
  95%      1
  98%      1
  99%      2
 100%     17 (longest request)
```

前回のベンチマークではSpray-canが23230.85 req/secでSpray-canの方がパフォーマンスが良かったですが、今回Akka HTTPは29805.82 req/secというSpray-canを越す数値を叩き出しました。
前回のベンチマークから4ヶ月ぐらいしか経っていないのにこんなに速くなるとは驚きです。

## Next steps for Akka HTTP

今後のAkka HTTPのことについては、Sprayの終末とAkka HTTPへの置き換えを推奨していて近いうちにexperimentalが外れるようです。
HTTP/2についても今後やっていくようで[ここ](https://github.com/akka/akka-meta)から追えます。
期待しながら待ちたいと思います。
Sparkleformationでstack policyを設定する

[SparkleFormation](https://github.com/sparkleformation/sparkle_formation)はAWS CloudFormationのテンプレートをrubyの形式で記述できる。
[Stack Policies](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/protect-stack-resources.html)もテンプレート中に記述できるが癖があったのでメモしておく。

以下の環境で確認。

* sfn (3.0.18)
* sparkle_formation (3.0.10)

# SparkleFormationでのStack Policy適用方法

## テンプレート中にポリシーを記述 

```rb
SparkleFormation.new(:test, provider: :aws) do
  AWSTemplateFormatVersion '2010-09-09'

  dynamic!(:ec2_vpc, :test) do
    properties do
      cidr_block "10.0.0.0/16"
      tags!("Name" => "vpc-test")
    end
    policy.deny "Replace"
  end
end
```
上記のpolicy.deny "Replace"のようにテンプレート中にStack Policyを記述する。
詳細は[SparkleFormation: Stack Policies](http://www.sparkleformation.io/docs/sparkle_formation/stack-policies.html)参照

## Configファイルにcallback設定追加

```rb
Configuration.new do
  callbacks do
    default ['stack_policy']
  end
end
```

sfn initで作成された.sfnファイルに上記の内容を記述した。
これでsfn createやupdateした時にポリシーが適用されたりするようになる。
(これをしておかないと不要な要素があるということでsfn validateなどで怒られる。)
詳細は[SparkleFormation: Callbacks](http://www.sparkleformation.io/docs/sfn/callbacks.html#builtin-callbacks)参照

## Stack Policy適用時のコマンド実行について

上記のcallbackを設定すると以下のように一部のsfnコマンド(print、validate、graphなど)でエラーになる。

```rb
$ bundle exec sfn print --file test
[Sfn]: Callback template stack_policy: starting
ERROR: NoMethodError: undefined method `to_sym' for nil:NilClass
Did you mean?  to_s
```

コードを斜め読みしてみるとどうやらスタック名が不要なコマンドでもスタック名必須になっている感じ。
なので以下のようにダミーのスタック名(hoge)を設定するととりあえずエラーなしで実行可能。

```rb
$ bundle exec sfn print hoge --file test
```

# リソースへのStack Policyの一括適用方法

CloudFormationでは*を使って一括ですべてのリソースに適用するようなPolicyを記述できる。
しかし、SparkleFormationでは各リソース中にしかpolicy要素を記述できない。
このため、以下のようなコードにすることで各リソースで一括でUpdate:Replaceを禁止できる。

```rb
SparkleFormation.new(:test, provider: :aws) do                                                                       
  # ...(略)
  resources do
    keys!.each do |resource|
      set!(resource) do
        policy.deny "Replace" # すべてのリソースに対してpolicy.denyの要素を追加
      end  
    end  
  end  
end
```

## 適用方法の調査メモ

SparkleFormationの公式文書を探したが自分が定義したリソース一覧を取ってくるようなmethodが見当たらなかった。
[SparkleFormation: SparkleFormation DSL](http://www.sparkleformation.io/docs/sparkle_formation/sparkleformation-dsl.html#data-access)のdata!はやりたいことに近い気がしたが微妙に違った。

しょうがないので[sperkle_formation.rb](https://github.com/sparkleformation/sparkle_formation/blob/master/lib/sparkle_formation/sparkle_formation.rb)のinitializeから追っていくと以下の2つあたりで利用出来る関数が定義されていることがわかった。
AttributeStructの方でkeys!メソッドが定義されていたので利用したらいけた。

* [sparkle_attribute.rb](https://github.com/sparkleformation/sparkle_formation/blob/master/lib/sparkle_formation/sparkle_attribute.rb)
* [AttributeStruct](https://github.com/chrisroberts/attribute_struct)
RubyでSeleniumを動かすときにテストの実行速度を設定する方法

https://groups.google.com/forum/#!topic/ruby-capybara/3gi4acdkpQY より引用

```
  class SlowHttpClient < Selenium::WebDriver::Remote::Http::Default
    def request(*args)
      sleep 0.3
      super
    end
  end

  driver = Selenium::WebDriver.for :firefox, :http_client => SlowHttpClient.new
```

これで早くしたりゆっくり動かしたり出来るようになった。HAPPY!
WRF > restartを試した

```txt:動作環境
WRF 3.7.1 on CentOS 6.8 (64bit)
```

WRF(Weather Research and Forecasting Model)に関して。

WRFの計算においては、計算を途中まで実行して再度継続した計算をするrestart機能があるようだ。
以下に記載がある。
http://www2.mmm.ucar.edu/wrf/OnLineTutorial/CASES/Restart/wrf.htm

### restartの前の実行

namelist.inputにおいて以下のような設定にしておく。

- restart = .false.,
- restart_interval = 360,

例として、2014/08/03 12:00:00から2014/08/03 18:00:00までの6時間の計算を実行する (./real.exe と ./wrf.exe)。

### restart時の実行

namelist.inputにおいて以下の設定にする。

- restart = .true.,
- restart_interval = 360,

restartなので、前回の続きの2014/08/03 18:00:00から2014/08/04 00:00:00までの6時間とした。

### 生成ファイル

restartでない方の実行

- wrfout_d01_2014-08-03_12:00:00
- wrfrst_d01_2014-08-03_18:00:00

開始日時とそこから6時間後のファイルが生成された。

restartでの実行

- wrfout_d01_2014-08-03_21:00:00
- wrfrst_d01_2014-08-04_00:00:00

<font color=blue>wrfout_d01の方の日時が08-03_18:00:00でなく、08-03_21:00:00となっているのは設定の問題なのか、正しい出力なのか、未消化。</font>

## 設定ファイルのtime_control部分

### namelist.input.start

```
&time_control
 run_days                            = 0,
 run_hours                           = 12,
 run_minutes                         = 0,
 run_seconds                         = 0,
 start_year                          = 2014, 
 start_month                         = 08,      
 start_day                           = 03,      
 start_hour                          = 12,      
 start_minute                        = 00,      
 start_second                        = 00,      
 end_year                            = 2014,  
 end_month                           = 08,     
 end_day                             = 03,      
 end_hour                            = 18,      
 end_minute                          = 00,      
 end_second                          = 00,      
 interval_seconds                    = 21600
 input_from_file                     = .true.,
 history_interval                    = 180,     
 frames_per_outfile                  = 1000,  
 restart                             = .false.,
 restart_interval                    = 360,
```

### namelist.input.restart

```
&time_control
 run_days                            = 0,
 run_hours                           = 12,
 run_minutes                         = 0,
 run_seconds                         = 0,
 start_year                          = 2014, 
 start_month                         = 08,      
 start_day                           = 03,      
 start_hour                          = 18,      
 start_minute                        = 00,      
 start_second                        = 00,      
 end_year                            = 2014,  
 end_month                           = 08,     
 end_day                             = 04,      
 end_hour                            = 00,      
 end_minute                          = 00,      
 end_second                          = 00,      
 interval_seconds                    = 21600
 input_from_file                     = .true.,
 history_interval                    = 180,     
 frames_per_outfile                  = 1000,  
 restart                             = .true.,
 restart_interval                    = 360,
```