OmniAICreator/Qiita-1.07M huggingface dataset:
[PHP] Input variables exceeded 1000.

他人様のコードレビューをして、念のためステージングで動作確認していたらパラメータが足りない。
error_logを確認すると、衝撃的なWarningが出てますた (´･_･`)

```ini:error_log
PHP Warning:  Unknown: Input variables exceeded 1000. To increase the limit change max_input_vars in php.ini. in Unknown on line 0, referer: http://hoge.com/fuga.php
```

# 操作
とある検索機能なのだが、いろいろ心配なので、ステージングで負荷試験を兼ね、動作検証を実施。
画面上にある検索条件を全て選択（チェックボックスには「全て選択」ボタンあり）して検索を実行し、動くかどうか、クエリは正しくビルドされるかを検証していました。

# 概要
POSTパラメータに1000個を超えるパラメータを渡した場合に、PHP Warning がでる。
1000個を超えたパラメータはプログラムに渡らない。

# 出典
PHPマニュアルの「max_input_vars」の項を参照。
[PHPマニュアル](http://php.net/manual/ja/info.configuration.php#ini.max-input-vars)

# まずい点

## 引用
> 入力変数 を最大で何個まで受け付けるかを指定します (この制限は、スーパーグローバル `$_GET`、`$_POST` そして `$_COOKIE` にそれぞれ個別に適用されます)。 このディレクティブを使うと、ハッシュの衝突を悪用したサービス不能攻撃を受ける可能性を軽減できます。 このディレクティブで設定した数を超える入力変数があった場合は `E_WARNING` が発生し、 それ以降の入力変数はリクエストから削除されます。

## 脆弱性
パラメータ数の上限をどんどんあげてしまうと、以下の処理順で負荷が増大し、脆弱性になります。

- GETやPOSTで渡された変数はハッシュ構造に格納されます
- 変数名に細工を加えることで、ハッシュの衝突が生じます
- 全てのハッシュが衝突した場合、n個の変数の格納処理には、O(n2)の時間がかかる
- CPUに大きな負荷をかけてしまう

結果、サーバに過度の負荷をかけ、サービスを稼動できない状態にすることが可能になってしまうのです。

## 過去に報告された脆弱性
[CVE-2011-4885](https://nvd.nist.gov/vuln/detail/CVE-2011-4885)

## 対象のPHPバージョン
PHP5.3.9以前は上限が無い。
PHP5.3.10で上限が設けられ、デフォルト1000となっています。
現代の一般的なサーバーのCPUでは、1000程度であれば負荷増大にまで至らないので、問題ないと判断できます。

# やっちゃいけない

## 上限数を php.ini などで上げる
上述の通り、脆弱にするだけなので、運用と設計を考え直すが吉。
以下はやるなよ？いいか、ぜっっっったいにやるなよ？

```ini:php.ini
max_input_vars = 2000
```

## リクエストボディ直接参照
POSTとしてプログラムでは受け取れないが、リクエストのボディから直接参照することができちゃいます。
GETと同じ形式で取得できるので、自力でパースすれば良いのですが、例えば ```parse_str``` でパースしようとすると怒られます。


```php:overPost.php
<?php
$hoge = file_get_contents( 'php://input' );
parse_str($hoge, $hoges);
```

```ini:error_log
PHP Warning:  parse_str(): Input variables exceeded 1000. To increase the limit change max_input_vars in php.ini. in ....
```

### だからと言って・・・
foreachで回して取ってくるとか、自作しちゃだめですよ？

# そもそも
パラメータ数が1000個の時点で、設計としておかしいです。
運用、設計の見直し、絞り込む仕組み、などを考慮し、「考えられる項目を闇雲に全部選択できる」ような思考停止な実装はしないようにしていきたいものです。

さすがにCのソースを追いかける時間はないので、今回はこの辺で。
[SourceTree]gitコミット間のファイル一覧を取得する方法

SourceTreeの「端末」を開き、下記コマンドを実行するとgit履歴から編集ファイル一覧が取得できます。
よかったらご活用ください。

（ちなみに頭の$は「コマンドですよ」という印なので、`$`まで入れないようにご注意ください）
※SHAとは：sourcetree上に「コミット」という欄で表記される履歴IDのこと。本当は長いが省略版も併記してある。どちらでも可

```
## コミット間のファイル一覧を取得
$ git diff --stat --name-only [fromコミットのSHA] [toコミットのSHA]
## ファイルに出力(適宜出力先のパスは変えてください)
$ git diff --stat --name-only [fromコミットのSHA] [toコミットのSHA] > /Users/aaaaa/Desktop/[出力ファイル名].txt
```

*fromコミット は含まない。toコミット は含む*
つまり、実際取りたいfromコミットの一つ前のコミットSHAを指定しないとダメ

```
例

コミット①　SHA:11111 ファイル:+ 1.tpl
コミット②　SHA:22222 ファイル:+ 2.tpl
コミット③　SHA:33333 ファイル:+ 3.tpl
コミット④　SHA:44444 ファイル:+ 4.tpl
コミット⑤　SHA:55555 ファイル:+ 5.tpl

②〜④の作業のファイル一覧を取得したい場合
$ git diff --stat --name-only 22222 44444
3.tpl
4.tpl

上記だと②の2.tplが含まれないので①からの指定にする

$ git diff --stat --name-only 11111 44444
2.tpl
3.tpl
4.tpl
```
JavaScriptの真偽判定まとめ。



ifを使う時に空文字列とか空オブジェクトってどう判定されるのかいつも忘れてしまうのでまとめてみます。  
下記の関数を使ってチェックしてみました。


```
  check = function(obj) {
    if (obj) {
      return 'true';
    } else {
      return 'false';
    }
  };
```

```
console.log(check(null)); //false
```

## String

```
check('') // false
check('0') // true
```
空文字列はfalse
何か入っていればtrue

## Number
```
check(1) // true
check(0) // false
check(-1) // true
```
0はfalse、それ以外はtrue

## Array
```
check([]) // true
check([].length) // false
```
空のArrayでもtrueが返る。
空か否か判定する時は`length`を使う。

## Object
```
check({name:false}) // true
check({}) // true
check(Object.keys({})) // true
check(Object.keys({}).length) // false
```
空のobjectでもtrueが返る。
空か否か判定する時は`Object.keys(obj).length`とする。
Wordpressのwp-config.phpに本番環境とテスト(ローカル)環境の設定を併記する

よくgitで管理してて、設定ファイルだけ管理外に指定してて、たまにサーバー同期して上書きとか消しちゃったりとかやらかしてしまうことがあるので忘備録。

Wordpressの設定ファイル wp-config.php 内に、サーバー変数 $_SERVER["SERVER_NAME"] で分岐して書くだけです。
ifの分岐を増やせば、ローカル環境やテスト環境も増やせます

```
// Develop（localhost）
if (@$_SERVER["SERVER_NAME"] === 'localhost') {
	define('DB_NAME', 'test_db');
	define('DB_USER', 'root');
	define('DB_PASSWORD', 'root');
	define('DB_HOST', 'localhost');
	define('DB_CHARSET', 'utf8');
	define('DB_COLLATE', '');
	//サイトURL
	define('WP_HOME','http://localhost');
	//WordPress URL インストールしたフォルダ
	define('WP_SITEURL','http://localhost/wp');
	//デバック有効化
	define('WP_DEBUG', true);
} else {
	//本番環境
	define('DB_NAME', 'hogehoge');
	define('DB_USER', 'hogehoge');
	define('DB_PASSWORD', 'hogehoge');
	define('DB_HOST', 'hogehoge');
	define('DB_CHARSET', 'utf8');
	define('DB_COLLATE', '');
	//デバック無効化
	define('WP_DEBUG', false);
}
```

ポイントは、以下の2行。

	define('WP_HOME','http://localhost');
	define('WP_SITEURL','http://localhost/wp');

Wordpressのダッシュボードの一般設定で定義する箇所ですが、
ここを指定するおかげでバックアップしたSQLを検索置換する手間が省けます。

参考）

- サイト URL の変更 - WordPress Codex 日本語版 https://wpdocs.osdn.jp/%E3%82%B5%E3%82%A4%E3%83%88_URL_%E3%81%AE%E5%A4%89%E6%9B%B4
- wp-config.php の編集 - WordPress Codex 日本語版 https://wpdocs.osdn.jp/wp-config.php_%E3%81%AE%E7%B7%A8%E9%9B%86#WordPress_.E3.82.A2.E3.83.89.E3.83.AC.E3.82.B9_.28URL.29
PHPTALのi18n:構文でサイトを多言語化する

## 翻訳クラス本体を作る
- 例としてpoファイルの読み込みクラスを作成
- GetTextライブラリを使用( [GitHub](https://github.com/oscarotero/Gettext) )

```php
class Translator {
	private $basePath;
	private $files;
	private $lang = 'ja';
	private static $resources = array();

	public function __construct($basePath = __DIR__ . "/../../lang", $files = ["{{lang}}.po"]) {
		$this->basePath = rtrim($basePath, '/\\') ;
		$this->files = $files;
	}

	public function setBasePath($path) {
		$this->basePath = $path;
	}

	public function setLang($lang) {
		$this->lang = $lang;
		$this->initResource($lang);
	}

	public function translate($key) {
		$this->initResource($this->lang);
		foreach(self::$resources[$this->lang] as $resource) {
			if ( $found = $resource->find(null, $key) ) {
				$translation = $found->getTranslation();
				return strlen($translation) ? $translation : $key;
			}
		}
		return $key;
	}

	protected function initResource($lang) {
		foreach($this->files as $file) {
			$file = u::mustache($file, ['lang' => $lang]);
			$file = $this->basePath . DIRECTORY_SEPARATOR . ltrim($file, '/\\');

			if ( isset(self::$resources[$lang][$file]) ) continue;

			if( !file_exists($file) ) {
				throw new \InvalidArgumentException("resource file not found: {$file}");
			}

			self::$resources[$lang][$file] = \Gettext\Translations::fromPoFile($file);
		}
	}
}
```

## PHPTALTranslationServiceインターフェースを実装する
- さしあたって必要なところのみ実装
- 一応分けておかないとPHPTAL以外で翻訳したいときに困る

```php

class PHPTALTranslationService implements \PHPTAL_TranslationService
{
	private $translator;

	public function __construct(Translator $translator) {
        $this->translator = $translator;
	}

    function setLanguage(/***/) {
        $this->translator->setLang(func_get_args()[0]);
    }

    function setEncoding($encoding) {
    	// UTF-8 only
    }

    function useDomain($domain) {
    	// not supported
    }

    function setVar($key, $value_escaped) {
    	// not supported
    }

    function translate($key, $htmlescape=true) {
    	$msg = $this->translator->translate($key);
    	return $htmlescape ? htmlspecialchars($msg, ENT_QUOTES) : $msg;
    }
}
```

## PHPTAL初期化時にTranslatorを設定する

```php
        $lang = $_GET['lang']; // 例
        $translator = new Translator($path);
        $translator->setLang($lang);
        $tal = new \PHPTAL();
        $tal->setTranslator(new \PHPTALTranslationService($tranalstor));

```

## テンプレートに埋め込む
- 何故 "structure string: "にしたか思い出せず、、何かがうまくいかなかった

```
<h1 
      i18n:translate="structure string:poファイルの項目名"
>翻訳したい タイトル</h1>
```
linuxでzipファイルを解凍するとファイル名が文字化けしてしまう対策

（windowsで圧縮したファイルをlinuxで解凍すると発生する）

# sjis対応版のunzipをインストールする
(rootになり以下のコマンド実施)

```bash
wget https://github.com/ted-n/unzip/archive/master.zip
mv master master.zip
unzip master.zip
cd unzip-master/unzip60
make -f unix/Makefile LOCAL_UNZIP="-D_FILE_OFFSET_BITS=64 -DNO_LCHMOD -D_MBCS -DNO_WORKING_ISPRINT" generic_gcc
sudo make -f unix/Makefile install?
```

私の環境では以下のようになった：
・/usr/local/bin/unzipが新たにでき、これがsjis対応のunzip
・/usr/bin/unzipも残っており、普通にunzipコマンドを実行するとこちらが使用される

wgetするURLは以下のページの「clone or download」より取得（現状上記のURlで問題ない）
https://github.com/ted-n/unzip

こちらの記事を参考にしました
[ZIPファイルに日本語ファイル名が含まれる場合の文字化け予防方法（Windows7, CentOS 6）](http://furyu.hatenablog.com/entry/20151011/1444545902)
Debugger for Chrome


MS 製エディタ Visual Studio Code には、[Debugger for Chrome](https://marketplace.visualstudio.com/items?itemName=msjsdiag.debugger-for-chrome) という面白機能がある。エディタからウェブブラウザを遠隔操作して、書いてる最中の Javascript コードをデバッグ出来る。

インストールと設定
---------------

Debugger for Chrome は Visual Studio Code の Extension として実装されているので、View > Extensions で検索してインストールする。

Debug > Start Debugging でデバッグを開始するが、最初は設定が無いのでエラーになる。エラーダイアログの Open launch.json を選択すると自動的に .vscode/launch.json に設定ファイルの雛形が出来る。

雛形は、Node.js 用の物なので新しく書き萎えないといけない。 Visual Studio Code のページにはサンプルとして "Launch Localhost" (新しいブラウザを開いてローカルサーバ実行) と "Launch index.html" (新しいブラウザを開いてファイルを実行) の二つが置いてある。このうち Launch Localhost セクションを create-react-app にあわせて設定するとこうなる。

```javascript
{
    "version": "0.1.0",
    "configurations": [
        {
            "name": "Launch localhost",
            "type": "chrome",
            "request": "launch",
            "url": "http://localhost:3000/", // react-script の開発サーバ URL を指定
            "webRoot": "${workspaceRoot}/", // ソースコードの場所。Chrome Developer Tools > Source > webpack://. が差している場所。
            "sourceMaps": true
        }
    ]
}
```

利用方法
-------

Command Palette > Debug: Select and Start debugging > Launch localhost を選択

感想
----

機能は面白いが、Chrome Developer Tools と出来ることが同じなので、狭い画面では特に使う理由無いかも。
PandasでYYYYMMDD形式の日付フォーマット変更



Pandasを使ってグラフなどを作成する場合に、取り込むCSVなどの日付の形式が「YYYYMMDD」のような形の場合がある。
その場合、グラフ描写の際にそのままの形式でindex_colに割り当てていると、日付として軸の表示がおかしくなる。

![image](https://qiita-image-store.s3.amazonaws.com/0/41877/4f4c7993-571c-07fe-464e-63c20345249b.png)

の場合

![image](https://qiita-image-store.s3.amazonaws.com/0/41877/485746e0-7ad4-5a43-5ca4-f0632f233fda.png)


なのでCSV読み込みの
```python
pandas.read_csv()
```
のなかにオプションとして
```python
parse_dates = True
```
を入れておくと、下記のように日付として扱われるのできれいに描ける

![image](https://qiita-image-store.s3.amazonaws.com/0/41877/838b5382-95b9-83d8-7e01-b9071d24c2fb.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/41877/385dedf8-628f-cfbd-c38e-0733c9e76e82.png)
超簡単にcreate-react-appでReact + Redux + Electronの開発環境をつくる方法

Electronの開発環境を、[create-react-app](https://github.com/facebookincubator/create-react-app)で作りたかったので調べてたら、ドンピシャのやつを発見した。

[How to build an Electron app using create-react-app. No webpack configuration or “ejecting” necessary.](https://medium.freecodecamp.com/building-an-electron-application-with-create-react-app-97945861647c)

この通りにやったらできた。create-react-appのreactの部分には一切手を加えず、webpackの設定なども不要で、コードを変えたらすぐにElectronのアプリに反映される。超お手軽で便利です。やり方は下記ですが、[electron-with-create-react-app](https://github.com/csepulv/electron-with-create-react-app)に下記修正後のコードがあります。

# やり方

## 1. アプリ作成、インストール

 `create-react-app`でアプリを作って、[electron](https://github.com/electron/electron)と[node-foreman](https://github.com/strongloop/node-foreman)をインストールする。

```
$ create-react-app hoge
$ cd hoge
$ yarn add electron foreman
```

## 2. 元ネタリポジトリから必要なものを持ってくる
 [electron-with-create-react-app](https://github.com/csepulv/electron-with-create-react-app)内の、下記ファイルを同じ場所にコピーする。

 - [Procfile](https://github.com/csepulv/electron-with-create-react-app/blob/master/Procfile)
 - [src/electron-starter.js](https://github.com/csepulv/electron-with-create-react-app/blob/master/src/electron-starter.js)
 - [src/electron-wait-react.js](https://github.com/csepulv/electron-with-create-react-app/blob/master/src/electron-wait-react.js)

## 3. package.jsonを編集する

```package.json
{
 .
 .
  "homepage": "./",
  "main": "src/electron-starter.js",
  "scripts": {
    .
    .
    "electron": "node_modules/.bin/electron .",
    "dev" : "nf start -p 3000"
  }
}
```

## 4. yarn dev

```
$ yarn dev
```

これで、開発サーバが起動し、ブラウザに表示された後に、勝手にElectronが起動し、ブラウザと同じ画面が表示されます。コードを編集すると、ブラウザもElectronも勝手にに反映されます。あとは、普通にreduxとかインストールすれば使えます。

# パッケージの作成

## electron-packagerのインストール

[electron-packager](https://github.com/electron-userland/electron-packager)を使います。

```
$ yarn add electron-packager -D
```

## package.jsonの編集

electron-packagerコマンドをyarn packageで実行できるようにします。

```
{
 .
 .
  "scripts": {
    .
    .
    "package": "electron-packager . hoge --platform=win32 --arc=x64 --out=release"
  }
}

```

上記の場合、Windows用のhoge.exeが作成されます。コマンドの使い方は下記です。細かいことが[ここ](https://github.com/electron-userland/electron-packager/blob/master/docs/api.md)に書いてありました。

```
electron-packager <sourcedir> <appname> --platform=<platform> --arch=<arch> [optional flags...]
```

## DevToolsを非表示にしてbuildする

`src/electron-starter.js`の26行目の`mainWindow.webContents.openDevTools();`をコメントアウトする。

```src/electron-starter.js
// Open the DevTools.
//mainWindow.webContents.openDevTools();
```

ビルドする

```
$ yarn build
```

## パッケージ作る

```
$ yarn package
```
Swift3 - UICollectionViewでセルの背景色を好きな色に変える方法

こんにちわ、キングコングをIMAX３Dで見ましたが大したことなくて非常にげんなりしました。[好きな映画はロッキーです](http://off.tokyo/blog/2017/04/11/swift3-uicollection/)。さて、UICollectionViewでCellの背景色を自由自在に変えられないかと思い、備忘録として書き残しておきます。どなたかのお役に立ててれば幸いです。

# ポイント

1, ` indexPath.row ` でセルの値が取れる

2,  switch文で簡単に実装できる



# 実装


```UICollectionViewCell.swift

    //データを返すメソッド
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
    {
        //コレクションビューから識別子「TestCell」のセルを取得する。
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "TestCell", for: indexPath as IndexPath) as UICollectionViewCell
        
    
        
        //セルの背景色を設定して文字の色を変える。
        
        switch indexPath.row {
            
        case 1:
            
            cell.backgroundColor = .red
            
        case 2:
            
            cell.backgroundColor = .blue
            
        case 3:
            
            cell.backgroundColor = .orange
            
        case 4:
            
            cell.backgroundColor = .yellow
            
        case 5:
            
            cell.backgroundColor = .black
            
        case 6:
            
            cell.backgroundColor = .white
            
        case 7:
            
            cell.backgroundColor = .magenta
            
        case 8:
            
            cell.backgroundColor = .brown
            
        case 9:
            
            cell.backgroundColor = .darkGray

        default: break

        }

        return cell
    }
    
```

# ビルド

<img width="213" alt="スクリーンショット 2017-04-11 12.23.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/135794/c5b04c08-66c2-20d8-739c-9fe52916e73b.png">
Pythonスクリプトを走らせたときに，エラーになったらデバッガに入ってほしいときに使うと便利な関数メモ

pdbよりも強いIpyhoon.coreのdebuggerを使う方法です．


```python:set_debugger.py
import sys

def set_debugger_org():
    if not sys.excepthook == sys.__excepthook__:
        from IPython.core import ultratb
        sys.excepthook = ultratb.FormattedTB(call_pdb=True)

def set_debugger_org_frc():
    from IPython.core import ultratb
    sys.excepthook = ultratb.FormattedTB(call_pdb=True)

def set_trace():
    from IPython.core.debugger import Pdb
    Pdb(color_scheme='Linux').set_trace(sys._getframe().f_back)
```

として```set_debugger_org_frc() ```などをmain関数内で呼んであげれば良い．

うまくデバッガに入ってくれないときも残念ながらあります．

こちら先輩に教わりました．ありがとうございます．
スケルトンとして作ったファイルにxxx.comなど入れない

スケルトンのHTMLファイルに仮urlにxxx.comとか書くとエロサイトにつながって気まずい思いをします。
気をつけましょう。
フォームの仮URLとか気をつけましょう。
気をつけましょう。
RailsでStatic Fileの配信をする


LocalでPumaをproductionモードで動作させたときに少しハマったのでメモ書きです。

Rails5から利用可能なWebpackerでJavascriptファイルを1つにまとめて配信しようと思いpumaを起動し、Webにアクセスしてみると
`ActionController::RoutingError (No route matches [GET] "/packs/application-xxxxxxxxxx.js")`
とエラーが出てた。

いろいろ悩んでたら下記の記事を発見。
[Railsに静的ファイルの配信をお願いする](http://qiita.com/gouf/items/01d608d3ec46ba65f3c2)

静的ファイル(html,js,css等)を配信するのはそもそもWebサーバのお仕事なので、
APサーバがやることではないのよね。

`config/environments/production.rb`の`config.server_static_files = true`に書き換えてpumaを起動したらうまく配信してくれた。

よし、nginx用意しよう。。。
DB製品別コメント記法

||単一行コメント|ブロックコメント|
|:-----------------|:------------------|:------------------|
|SQL Server|--|/* /* */ */ 入れ子可|
|DB2|--|/* /* */ */ 入れ子可<br>ただしいくつかのツールが入れ子コメントに未対応|
|PostgreSQL|--|/* /* */ */ 入れ子可|
|Oracle|--|/* */ 入れ子不可|
|SQLite|--|/* */ 入れ子不可|
|MySQL|--<br>#|/* \*/ 入れ子不可<br>/\*! \*/はコメントでない<br>/\*!32302 \*/ は ver.3.23.02以降ではコメントでない|
GrafanaでPrometheusのクエリで「変数と文字列」を結合して使用する方法

# 概要

* GrafanaのTemplatingのVariablesを使用する
* 変数はロール名$role=（web|DB|batch）が選択できる
* 実際には、web-blueやweb-greenがあるので、クエリでは$role-blueみたいに指定したい

# 説明

* 画面上で複数選択すると発行されるクエリは、**{instance=~"$role"}**が**{instance=~"web|db|batch"}**と展開される
* なのでクエリを**{instance=~"($role)-blue"}**と記述してあげれば、**{instance=~"(web|db|batch)-blue"}**と展開される
    * 結果、正規表現として正しい形でクエリが展開される

# デバッグ方法

* グラフ定義画面で、「Link to Graph in Prometheus」をクリックする

![image](https://qiita-image-store.s3.amazonaws.com/0/65435/6dd59e1f-e846-10d0-b054-1552174cd1f4.png)

* Prometheusの画面が開いてGrafanaが実際に発行しているクエリが代入されている。

![image](https://qiita-image-store.s3.amazonaws.com/0/65435/65014937-54e0-d7fc-3501-7dbfe3716781.png)
ローカル環境でDB（mysql）を使う～codeigniterでDB設定まで

XXAMPを起動
mysqlをstart→admin
左メニューからNEWを選択でデータベース名を記入
※照合順序 **utf8_general_ci**


autoloadのlibrariesにdatabaseを追加

*application-config-autoload.php*

```php
$autoload['libraries'] = array(
	'form_validation',
	'database'
);
```

*application-config-database.php*

```php
'username' => 'root',
```
この際passwordは空でもOK。

20170606追記
```
$autoload['helper'] = array(
	'url',
	'form',
);
```
AWS EBSのリサイズをシェルスクリプトにまとめてみた

# はじめに

AWSのストレージサービスならばとりあえずS3を選んでおけば間違いはないのでしょうけど，既存サービスを短期間でAWSに移行する場合にはEBSを使うことがあるかと思います．以前はEBSの容量を変更できませんでしたので，事前に余裕を持って確保するか，都度容量を割り当ててデータを移行するか悩ましいところでした．

2017年2月にAWSよりEBSの新機能について発表があり，EBSの容量やタイプ，IOPSなどがオンザフライで変更できるようになりました．そこで，EBSの空き容量が閾値を下回ったときに拡張するシェルスクリプトを用意し，定期的に実行することでお財布への負担と管理運用作業を軽くしてみました．

<https://aws.amazon.com/jp/blogs/news/amazon-ebs-update-new-elastic-volumes-change-everything/>

# 書いてみた

 - スペシャルデバイス名とEBSボリューム名(Nameタグに割り当てた文字列)を指定して実行します．
 - 使用容量が95%に達したら，80%弱になるくらいに拡張します．
 - Amazon Linuxでroot権限で実行することを前提としています．
 - 2017年4月の時点でのAmazon Linuxにプレインストールされているaws-cliでは`aws ec2 modify-volume`に未対応なため，アップデートが必要でした．
 - JSONのパースにjqが必要なので，事前にインストールしてください．
 - `aws ec2 modify-volume`の直後に`resize2fs`を実行しても反映されないのでスリープを入れています．

````sh
#!/bin/sh
#
# $ sudo yum install jq
# $ sudo pip install -U awscli
# # sh ./ebs-resize.sh -d /dev/xvdf -v ebs-volume-name
#

usage() {
  echo "Usage: $0 -d device-name -v ebs-volume-name" 1>&2
  exit 1
}

while getopts d:v:h OPT
do
  case $OPT in
    'd')
      DEVICE_NAME=$OPTARG
      ;;
    'v')
      VOLUME_NAME=$OPTARG
      ;;
    'h')
      usage
      ;;
    \?)
      usage
      ;;
  esac
done

shift $((OPTIND - 1))

if test ${#DEVICE_NAME} -eq 0 -o ${#VOLUME_NAME} -eq 0; then
  usage
fi

df -k $DEVICE_NAME 1> /dev/null
if test "$?" -ne 0; then
  echo "$DEVICE_NAME is not found."
  exit 1
fi

export THRESHOLD_PERCENT=95
export EXPAND_RATE=1.25
export USED_PERCENT=`df -k $DEVICE_NAME | grep -v Filesystem | awk '{print $5}' | awk -F% '{print $1}'`
export CURRENT_SIZE=`df -k $DEVICE_NAME | grep -v Filesystem | awk '{print $2}'`
export NEW_SIZE=`echo "scale=0;$CURRENT_SIZE * $EXPAND_RATE / 1024 / 1024 + 1" | bc -l`
export AWS_DEFAULT_REGION=`curl --silent http://169.254.169.254/latest/meta-data/placement/availability-zone | sed -e 's/.$//g'`
export INSTANCE_ID=`curl --silent http://169.254.169.254/latest/meta-data/instance-id`
export VOLUME_ID=`aws ec2 describe-volumes --filter "Name=attachment.instance-id,Values=$INSTANCE_ID" "Name=tag:Name,Values=$VOLUME_NAME" |  jq -r '.Volumes[].VolumeId'`

if test ${#VOLUME_ID} -eq 0; then
  echo "$VOLUME_NAME is not found."
  exit 1
fi

if test $USED_PERCENT -ge $THRESHOLD_PERCENT; then
  aws ec2 modify-volume --volume-id $VOLUME_ID --size $NEW_SIZE
  sleep 30
  /sbin/resize2fs $DEVICE_NAME
fi

exit 0
````

# おわりに

crontabに登録して1日1回程度動かすようにしましょう．なお`aws ec2 modify-volume`は1度実行すると6時間は変更できないようです．ご利用は計画的に．

# リンク

https://gist.github.com/stoshiya/4cafa50b34223aaa2a70c588abbede89
JavaScript界隈のやたら複雑な環境について

# なぜ複雑か

たぶんこの辺が理由だと思う

* とりあえずnpmモジュールにしたがる
* カスタマイズ性を求めるので、１つ１つの部品が細かい
* クロスブラウザ

# とりあえずnpmモジュールにしたがる

* JavaScriptに関するものは、何でもかんでもnpmにしようとする
* クライアントサイドだけでなく、サーバサイドまで
* Apache、Javadoc、JUnit的なものや、構文チェック、makeコマンド、シェル処理までnpmモジュール化されてる


## 具体的にはこう

* Apache		-> express 
* Javadoc		-> JSDoc
* JUnit		-> Jasmine / Karma
* 構文チェック		-> ESLint
* makeコマンド	-> babel 
* シェル処理		-> gulp or Grunt or Webpack


# カスタマイズ性を求めるので、１つ１つの部品が細かい
* 特に構文チェックなど、個人の好みが出るものはpluginやconfigが沢山

```json
{
  "eslint": "^3.19.0",
  "eslint-config-airbnb": "^14.1.0",
  "eslint-plugin-import": "^2.2.0",
  "eslint-plugin-jsx-a11y": "^4.0.0",
  "eslint-plugin-react": "^6.10.3"
}
```

* npmモジュールを組み合わせるためのモジュールとかもある

```json
{
  "react": "^15.4.2",
  "react-redux": "^5.0.3",
  "redux": "^3.6.0"
}
```

# クロスブラウザ

だいたいはInternet Explorerのせい(Edgeになってから少しマシ)
ES6をIEで動かすためにBabelが使われる
ChromeならBabelをつかわなくてもES6は動く

昔よくあった「Internet Explorer以外で開いてください」ページを回避するためのBabelだと思ってもらえれば


# 参考

【翻訳】 2016年にJavaScriptを学んでどう感じたか
http://kikuchi1201.hateblo.jp/entry/2016/10/26/172404
CSSだけで画面幅100%を取得する方法。

windowの高さ100%をCSSで取得する、のメモ。

##基本
・親要素に高さが指定してあれば、相対的に子要素はheight:100%を指定できる。
・親の親に高さが指定してあってもダメ。

##手順
・html,bodyにheight:100%を指定する。（htmlの親要素はwindowになるため、html{height:100%}は、windowの高さの100%になる。bodyも同じ。）
・そして、bodyを親要素にもつ、100%にしたい要素にもheight:100%を指定する。

##参考
http://ginpen.com/2011/07/01/height-100-parcent/
AsciidocFX をビルドする

軽量マークアップ言語 AsciiDoc 用のテキストエディタ AsciidocFX がとても良さそうだったので、インストールして試してみたいと思いました。
でも提供されているのは x64 (64 bit) 版のみで、x86 (32 bit) 環境で使用したい場合は自分でビルドしろって書いてあります。
https://github.com/asciidocfx/AsciidocFX

仕方がないので、自分でビルドしてみたいと思います。
尚、環境は Windows 7 (32bit) です。
AsciidocFX のバージョンは 1.5.5 です。

# ビルドの方法

基本的には [GitHub](https://github.com/asciidocfx/AsciidocFX) に記載されているとおりですが、環境によってはプロキシの設定などが必要になります。

## JDK 8 をインストール

まずは [JDK 8](http://www.oracle.com/technetwork/java/javase/downloads/index.html) をインストールします。
リンク先からダウンロードし、ウィザードに従ってインストールするだけでいけると思います。

## Apache Maven のインストールと環境変数の設定

[Apache Maven](http://maven.apache.org/download.cgi) をダウンロードし、展開します。
展開した中に bin というフォルダがあるので、これを環境変数の path に追加します。

この後、Apache Maven を使ってビルドを行いますが、その最中にネットから不足しているコンポーネントなどをダウンロードしてくるようなので、プロキシ配下の環境の場合は Apache Maven のプロキシの設定を行っておかないとビルドに失敗します。

Apache Maven のプロキシ設定については以下の記事がわかりやすかったのでご参照ください。
http://qiita.com/nikuyoshi/items/567f78e07e5733907491

## AsciidocFX のビルド

[GitHub](https://github.com/asciidocfx/AsciidocFX#how-to-build-asciidocfx) から AsciidocFX のソースコードをダウンロードして展開します（またはクローンします）。
コマンドプロンプトから AsciidocFX の展開先へ移動し、以下のコマンドを実行します。

`$ mvn clean install`

AsciidocFX のフォルダ内の `target/appassembler/bin` に `asciidocfx.bat` (または `asciidocfx.sh`) というファイルがあるので実行すると AsciidocFX が起動します。

これでとりあえず AsciidocFX が起動して使えるようになりました。
ただ、私の環境では Fatal Error がいくつか発生しているので気になります。

他には、jar ファイルや zip ファイルも生成されていました。 
インストーラーなどは作成できないのかな？
Node.jsでExcelファイルのread/write


## 概要

* Node.js で Excelファイルが扱える [xlsx](https://www.npmjs.com/package/xlsx) を紹介します
* Excelファイルの読み書きができます
* PCにExcel入れて無くても大丈夫

---

## なんで Node.js？

* VBAだとMacで動かない
* VBAのエディタ使いづらい
* コードのバージョン管理しづらい

---

## xlsxのよさげなポイント

* Node.js で Excelファイルが扱える
* 対応フォーマットがめっちゃ多い https://github.com/SheetJS/js-xlsx#file-formats
* リファレンス見る限り色々できそう

---

## サンプル

---

## workbook, worksheetの読み込み

```js
const XLSX = require("xlsx");
const Utils = XLSX.utils; // XLSX.utilsのalias
// Workbookの読み込み
const book = XLSX.readFile("test.xlsx");
// Sheet1読み込み
const sheet1 = book.Sheets["Sheet1"];
```

---

## セル範囲の取得

```js
// セルの範囲
const range = sheet1["!ref"]; //B2:B4
// セル範囲を数値表現に変換
const decodeRange = Utils.decode_range(range);
/* => {
        s: { c: 1, r: 1 },
        e: { c: 1, r: 3 }
      } */
```

---

## セル範囲をくるくる回して値を取得

```js
// Sheet1に記載されている数値を合計する
let value = 0;
for (let rowIndex = decodeRange.s.r; rowIndex <= decodeRange.e.r; rowIndex++) {
  for (let colIndex = decodeRange.s.c; colIndex <= decodeRange.e.c; colIndex++) {
    // 数値表現をセルアドレス ("A1"など) に変換
    const address = Utils.encode_cell({ r: rowIndex, c:colIndex });
    const cell = sheet1[address];
    if (typeof cell !== "undefined" && typeof cell.v !== "undefined") {
      value += cell.v; //cell: { t: 'n', v: 100, w: '100' }
    }
  }
}
console.log(`合計= ${value}`);
```

---

## 書き込み

```js
// Sheet2読み込み
const sheet2 = book.Sheets["Sheet2"];
// セル更新
sheet2["C2"] = { t: "s", v: "hoge", w: "hoge" };
// 範囲の更新を忘れずに (30分ハマった)
sheet2["!ref"] = "B2:C2";
book.Sheets["Sheet2"] = sheet2;
// ファイルを書き込み
XLSX.writeFile(book, "test.xlsx");
```

---

## サンプルレポジトリ

https://github.com/Kazunori-Kimura/node-xlsx-sample
シェルの設定ファイル(bash)

# 概要
何回も忘れるのでメモ

# 参考1
http://hacktux.com/bashrc-bash_profile/
http://qiita.com/incep/items/7e5760de0c2c748296aa

# シェルの種類
# ログインシェル
* OSログインした後に起動するシェルがログインシェル
* GUIでログインするとOSログインのタイミングでログインシェルが起動している(端末クリック無し)。そして端末クリックは対話シェルが起動。~~GUIでログインした場合は、内部的にログインシェルが起動していて、端末アイコンなどをクリックしたらそのログインシェルから対話シェルが生成されている、はず。~~

**↓↓↓もログインシェル起動する**

* su - [user]
* bash --login 
* ssh user@host (ssh接続した先でシェル起動しているので対話シェルも起動している)
* macOS Terminal.app 新規ウインドウ/タブ 
* tmux 新規ウインドウ 


# 対話シェル(~/.bash_profileは読み込まない)
* GUIの端末アイコンクリックから生成するシェル
* su [user] 
* bash (ssh後など)
* ssh user@host /path/to/command

## ログインシェルの設定ファイル読み込み

以下順番で読み込む。CentOSの場合は「.bash_profile」が存在する場合は、他の2つの設定ファイルを無視するみたい。自分のCentOS6.9には無かったので、CentOSの場合そもそもデフォルトでは存在しないみたい。

* /etc/profile
* ~/.bash_profile
  - ~/.bash_login (自分のCentOS6.9には無かった)
  - ~/.profile　　(自分のCentOS6.9には無かった)
* ~/.bashrc (対話シェルはこれだけ読み込む)
* /etc/bashrc(~/.bashrc から読み込まれる)

## 対話シェルの設定ファイル読み込み
* ~/.bashrc (対話シェルはこれだけ読み込む)
* /etc/bashrc(~/.bashrc から読み込まれる)

## 各設定ファイル
### /etc/profile
* ログインシェルが読み込む
* `全ユーザ`の全プロセスで利用したい設定を書く。環境変数は受け継がれるので。
* シェル変数はそのシェルだけ有効なので、全ユーザがログインシェルだけを想定した利用のみ有効にしたい変数はここにシェル変数を書く。そんなのある？
* 環境変数と起動プログラムが記述されてる

### ~/.bash_profile
* ログインシェルが読み込む
* `各ユーザ`の全プロセスに利用したい設定を書く。環境変数は受け継がれる。
* シェル変数はそのシェルだけのみなので、ログインシェルだけを想定した利用のみ有効にしたい変数はここにシェル変数を書く。そんなのある？
* /.bashrcをよみこんでいる。例えばssh接続の場合、~/.bashrcも同時に読み込む。

```bash

$ cat ~/.bash_profile 
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

export PATH
```

### ~/.bashrc
* 対話シェル、ログインシェル読み込み
* ~/.bash_profileから読み込まれる(ログインシェル起動経由でも読み込まれる)
* 対話シェル起動の場合はこれだけ読み込まれる。
* `各ユーザ`の対話シェルで利用したい設定を書く。環境変数だとこの対話シェルから起動したプロセスにも受け継ぐ。シェル変数はそのプロセスのみ。
* シェル変数はそのシェルだけ有効なので、対話シェルだけを想定した利用のみ有効にしたい変数はここにシェル変数を書く
* がしかし、環境変数で設定してもこの対話シェルで有効になるしこの対話シェルから生成するシェルなど想定しない時がほとんどなので環境変数をここに書く


### /etc/bashrc
* 対話シェル、ログインシェル読み込み
* `全ユーザ`の対話シェルで利用したい設定を書く。環境変数だとこの対話シェルから起動したプロセスにも受け継ぐ。シェル変数は対話プロセスのみ。
* シェルを起動した環境ごとのプロンプトが定義。ファイルやディレクトリを新規作成した場合にどのようなパーミッションが設定されるかが記述

存在したら読み込まれるみたい

```bash

$ cat ~/.bashrc 
# .bashrc

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

# User specific aliases and functions
```

## 参考2
http://itpro.nikkeibp.co.jp/article/Keyword/20070831/280849/
http://oxynotes.com/?p=5418:embed:cite
PrestoでVIEWを作ってHiveと比べてみる

# 環境

- aws cliで `--applications Name=Hadoop Name=Hive Name=Presto Name=Hue Name=Oozie` を指定
- 結果、次のようなアプリが入る `Hive 2.1.1, Presto 0.166, Hue 3.11.0, Oozie 4.3.0`

# 下準備

先にHiveで各テーブルとビューを作っておく。

## Prestoでの試行

- HiveのVIEWに直接クエリはかけられないようだ

```sql
> SELECT COUNT(*) FROM hive.default.test_view;
Query 20170411_015007_00015_amt5p failed: Hive views are not supported: 'default.test_view'
```

- ドキュメントに従ってPrestoでVIEWを作る
    - [8.8. CREATE VIEW](https://prestodb.io/docs/current/sql/create-view.html)

```sql
> CREATE OR REPLACE VIEW test_view AS
SELECT orderkey, orderstatus, totalprice / 2 AS half
FROM orders
```

SELECTをかけてみると、100万件ぐらいのデータが即時取得できた。Hiveよりだいぶ早いですね。
display:grid;の概要

最近ちらほら目にする`grid layout`について調べたので簡単にまとめ。
実際の使い方については別の投稿で書こうと思います。

`display:grid;`はマジで複雑なので先に概要を理解することをおすすめします。

## gridとは

`flexbox`、`table`同様にマルチカラムレイアウトすることができるプロパティ。
`flexbox`が<b>一次元的なレイアウト</b>なのに対して、`grid`は<b>二次元的なレイアウト</b>が可能。

## gridの概要

|定義  |概要  |
|---|---|
|グリッドコンテナ  |`display:grid;`を指定された要素。  |
|グリッドアイテム  |`display:grid;`を指定された要素の直下の子要素。<br>孫要素はグリッドアイテムとみなされない。  |
|グリッドトラック  |`grid`の`column（列）`と`row（行）`の総称。<br>`html`の`table`タグをイメージしてもらうとわかりやすいです。  |
|グリッドライン  |グリッドトラック間の線。  |
|グリッドセル  |グリッドラインによって分けられた個々のスペース。  |
|グリッドエリア  |複数のセルをまとめたグリッド内の特定の領域。  |

## gridのプロパティ

### グリッドコンテナのプロパティ

|プロパティ  |概要  |
|---|---|
|`grid`|要素をグリッドコンテナとして定義する。  |
|`grid-template-columns`|グリッドトラック（列）のサイズを指定する。  |
|`grid-template-rows`|グリッドトラック（行）のサイズを指定する。  |
|`grid-template-areas`|グリッドエリアの名前を参照して、グリッドテンプレートを定義する。  |
|`grid-template`|`grid-template-columns`、`grid-template-rows`、`grid-template-areas`を指定できるショートハンド。  |
|`grid-column-gap`|グリッドトラック（列）の間を指定する。  |
|`grid-row-gap`|グリッドトラック（行）の間を指定する。  |
|`grid-gap`|`grid-column-gap`、`grid-row-gap`を指定できるショートハンド。  |
|`justify-items`|グリッドアイテムの行方向の整列。  |
|`align-items`|グリッドアイテムの列方向の整列。  |
|`justify-content`|グリッドトラックの行方向の整列。  |
|`align-content`|グリッドトラックの列方向の整列。  |
|`grid-auto-columns`|自動的に生成されたグリッドトラックのサイズを指定する。  |
|`grid-auto-rows`|自動的に生成されたグリッドトラックのサイズを指定する。  |
|`grid-auto-flow`|明示的に配置されていないグリッドアイテムの配置を指定する。  |

### グリッドアイテムのプロパティ

|プロパティ  |概要  |
|---|---|
|`grid-column-start`|グリッドアイテム（列）の開始位置を指定する。|
|`grid-column-end`|グリッドアイテム（列）の終了位置を指定する。|
|`grid-row-start`|グリッドアイテム（行）の開始位置を指定する。|
|`grid-row-end`|グリッドアイテム（行）の終了位置を指定する。|
|`grid-column`|`grid-column-start`、`grid-column-end`を指定できるショートハンド。|
|`grid-row`|`grid-row-start`、`grid-row-end`を指定できるショートハンド。|
|`grid-area`|グリッドセルに名前を付けて`grid-template-areas`プロパティで参照できるようにする。<br>`grid-column`、`grid-row`のショートハンドでもある。|
|`justify-self`|グリッドアイテム内のコンテンツを行方向に整列する。|
|`align-self`|グリッドアイテム内のコンテンツを列方向に整列する。|

2017年4月現在、Android以外は`grid`に対応してます。

<a href="http://caniuse.com/#feat=css-grid" target="_blank">Can I Use CSS Grid Layout</a>

グリッドレイアウトでレスポンシブ対応
<a href="https://qiita.com/fgkm/items/f7484cd24b9489b5d92d">Media Queryを使わずCSS grid Layoutをレスポンシブ対応</a>
Amazon Linuxに最新版のRabbitMQをインストール

# はじめに

2017/04/11時点のAmazon Linuxだと標準のRPM repositoryからインストールされるerlangのバージョンが古く（R14）、EPELからインストールできるRabbitMQのバージョンも古い（3.1.3）ので最新版のRabbitMQを入れてみたので備忘録として残しておきます。

なお、公式ではEC2ではOSはUbuntu使うのがオススメです、と書いてあるのでAmazon Linuxに固執する理由がないならUbuntu使った方が簡単に導入できると思います。（[参考](https://www.rabbitmq.com/ec2.html))

# 方針

[RabbitMQ \- Installing on RPM\-based Linux \(RHEL, CentOS, Fedora, openSUSE\)](https://www.rabbitmq.com/install-rpm.html)にさまざまなアプローチが書いてありますので好きな方法を選択すると良いと思います。

今回はRabbitMQのメンテナが用意してくれているerlangのRPMビルドスクリプトを利用してerlangのRPMパッケージを作成、そしてRabbitMQが配布しているビルド済みのRabbitMQのRPMパッケージを使うことにしました。

# Erlang

[rabbitmq/erlang\-rpm: Zero dependency Erlang RPM, just enough for running RabbitMQ](https://github.com/rabbitmq/erlang-rpm)を手元に持ってきてmakeするだけでRPMパッケージが作成されます。
dockerのイメージをビルドするスクリプトも用意されているので環境に合わせてご利用ください。

上記以外の方法としては[Erlang Solutions](https://www.erlang-solutions.com/resources/download.html)のパッケージを使う方法も推奨されていますがこちらは試していません。

# RabbitMQ

[RabbitMQ \- Installing on RPM\-based Linux \(RHEL, CentOS, Fedora, openSUSE\)](https://www.rabbitmq.com/install-rpm.html)で配布されているRPMパッケージを利用している環境に合わせてダウンロードして署名キーと合わせてインストールするだけです。

```bash
rpm --import https://www.rabbitmq.com/rabbitmq-release-signing-key.asc
yum install rabbitmq-server-3.6.9-1.noarch.rpm
```

# RabbitMQのweb management GUI

RabbitMQはWebから利用できる管理用のGUIがあるのですが、3.3.0以降からlocalhost以外からのアクセスはデフォルトで拒否するようになっています。
そのため、`rabbitmqctl`コマンドを使って`add_user`, `set_user_tags`, `set_permissions`する必要があります。

下記がサンプルになります。user､ passwordは環境に合わせて変更した方がよいと思います。

```bash
rabbitmqctl add_user test test
rabbitmqctl set_user_tags test administrator
rabbitmqctl set_permissions -p / test ".*" ".*" ".*"
```

# 参考

- [RabbitMQ \- Installing on RPM\-based Linux \(RHEL, CentOS, Fedora, openSUSE\)](https://www.rabbitmq.com/install-rpm.html)
- [RabbitMQ \- Amazon EC2](https://www.rabbitmq.com/ec2.html)
- [Amazon EC2 \- Amazon Linux上にRabbitMQ 3\.6\.6 をインストールしたい\(67030\)｜teratail](https://teratail.com/questions/67030)
- [Can't access RabbitMQ web management interface after fresh install \- Stack Overflow](http://stackoverflow.com/questions/22850546/cant-access-rabbitmq-web-management-interface-after-fresh-install)
swift3 - Collection View 初歩的な点でつまづいたら確認したいこと

[こんにちわ。最近は、スプートニクの恋人っていう古い小説が好きです。](http://off.tokyo/blog/2017/04/11/swift3-collection-view/) さて、Collection View ですが、テキトーに実装したら何かが足らずにCollection Viewが出ないみたいなことがあったので、備忘録のために残しておきます。それに実装の方法が人によってまちまちだと思ったので、絶対に必要な手順的な。不親切な記事で世のため人のためにならず、すみません。



# 手順

1, storyboardにCollectionView配置

2, CollectionViewCellにIdentifierを定義

3,  クラスに` UICollectionViewDelegate ` ` UICollectionViewDataSource ` を継承

4,  ` @IBOutlet weak var myCollectionView: UICollectionView! ` みたいにしてソースコードからUIを操作できるようにする

5, データの実装

```Swift

 //データの個数を返すメソッド
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
    {
        return 30
    }
    
    
    //データを返すメソッド
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
    {
        //コレクションビューから識別子「TestCell」のセルを取得する。
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "TestCell", for: indexPath as IndexPath) as UICollectionViewCell
        
        //セルの背景色をランダムに設定する。
        cell.backgroundColor = UIColor(red: CGFloat(drand48()),
                                       green: CGFloat(drand48()),
                                       blue: CGFloat(drand48()),
                                       alpha: 1.0)
        return cell
    }
    
```

# 参考

[【Swift】Collection Viewの使い方。格子状にセルを並べる入れ物。](http://hajihaji-lemon.com/smartphone/swift/collection-view/)


# Collection View 

<img width="162" alt="スクリーンショット 2017-04-11 10.53.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/135794/7783f077-cad0-3611-421a-6cf1ed894350.png">
プロキシ自動設定ファイルを使う際のブラウザの設定

プロキシ自動設定ファイル (proxy.pac) でプロクシサーバの設定を行っている場合にしておいた方が良いブラウザの設定についてまとめます。

#やること
proxy.pacにおける`FindProxyForURL`関数の引数`url`に、アクセスするサイトのURLがそのまま与えられるようにします。

#Mozilla Firefox
1. Firefoxで`about:config`を開きます。
2. `network.proxy.autoconfig_url.include_path`を検索します。
3. `network.proxy.autoconfig_url.include_path`の値を`true`に設定します。

#参考文献
* [Proxy Auto-Configuration (PAC) file - HTTP | MDN](https://developer.mozilla.org/en-US/docs/Web/HTTP/Proxy_servers_and_tunneling/Proxy_Auto-Configuration_(PAC)_file#Parameters)
RundeckをMACローカルに導入メモ


## いきなりハマった
手順書通り進んでみたが
http://rundeck.org/docs/administration/installation.html

![スクリーンショット 2017-04-11 10.21.55.png](https://qiita-image-store.s3.amazonaws.com/0/174676/dcf52017-b3a2-0076-bb73-3dabdb5eded2.png "スクリーンショット 2017-04-11 10.21.55.png")


なぜExceptionが出た

```

Exception in thread "main" java.io.FileNotFoundException: /rundeck/server/exp/webapp/WEB-INF/lib/rundeck-core-2.7.3.jar (Interrupted system call)

```

色々調べたがだめだった　(T T)

## RundeckのGitを試す
* rundeckのリポジトリからクーロンする

https://github.com/rundeck/rundeck

* Terminalでクローン先でビルド実行

```
$ rundeck/rundeck-master/rundeck-launcher/gradlew build
```

* ビルド完了したらjarファイルが生成されるはず

```
$ cd /rundeck/rundeck-master/rundeck-launcher/build/libs
```

![スクリーンショット 2017-04-11 10.08.49.png](https://qiita-image-store.s3.amazonaws.com/0/174676/433278ea-416f-f42e-cb64-afd846ad416d.png "スクリーンショット 2017-04-11 10.08.49.png")

* rundeckをインストールしたいフォルダに`rundeck-launcher-2.8.0-SNAPSHOT.jar`をコピーして、javaコマンドでインストールする

```
$java -jar rundeck-launcher-2.8.0-SNAPSHOT.jar
```

* 4440ポートにアクセスしてみる

http://localhost:4440/user/login

はいーーできたー

![スクリーンショット 2017-04-11 10.16.26.png](https://qiita-image-store.s3.amazonaws.com/0/174676/4e37b9df-a81a-b733-ab8d-3a6c30d5bc14.png "スクリーンショット 2017-04-11 10.16.26.png")
【Android】動的にPreferenceを追加したり、項目を変更する

# tl;dr
xmlでPreferenceを定義すると、リストの項目とかをあらかじめ定義しないといけなくなります。
DBからリストの値を取ってきたいとか、動的にリストの項目を変える方法の備忘録。

# Preferenceを新規追加するとき

```AddPreferenceFragment.kt
    class AddPreferenceFragment : PreferenceFragment() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            addPreferencesFromResource(R.xml.add_pref)
            val programmableEntries = arrayOf("サル", "ゴリラ", "チンパンジー")
            preferenceScreen.addPreference(ListPreference(this.activity).apply {
                title = "追加されたヤツ"
                key = "key_added_pref"
                dialogTitle = "ダイアログのタイトル"
                setDefaultValue("最初から設定されてるヤツ")
                entries = programmableEntries
                entryValues = programmableEntries
            })
       }
```

preferenceScreenを取得した後に、addPrefenreceするだけです。
リストの項目をentriesとentryValuesでセットします。

xmlで記述するときは
titleを設定するとダイアログにも同じタイトルが出るのですが、
コード上でpreferenceを作る場合は、dialogTitleを設定してやらないと出ないようです。


# 既存のPreferenceの値を変えるとき

```ReplacePreferenceFragment.kt
    class ReplacePreferenceFragment : PreferenceFragment() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            addPreferencesFromResource(R.xml.add_pref)
            val programmableEntries = arrayOf("サル", "ゴリラ", "チンパンジー")
            findPreference(getString(R.string.key_pref_replace)) as? SelectListPreference)?.apply {
                entries = programmableEntries
                entryValues = programmableEntries
            }) 
        }
```

こちらはfindPreferenceでxmlに予め設定してあるkeyからpreferenceを取得します。
findPreferenceはfindViewByIdと同じようにPreferenceの基底クラスで返されるので、キャストしてあげる。
あとは同じようにentriesとentryValuesでセットするだけ。

## ポイントとか
### 最初にaddPreferenceFromResourceを呼ぶ
最初にどのxmlからPreferenceを取得しているかを知る必要があるので、
preferenceScreenやfindPrefenreceを呼ぶ前に
addPreferenceFromResourceを呼んでください。

### MultiListPreferenceを使う場合
defaultValueを設定する場合は、Array型ではなく、Set型にする必要があるのでお忘れなく。

### addPrefenreceのPrefereceに渡すContextはactivityで
この記事のコードもPreferenceを追加するときに
`preferenceScreen.addPreference(ListPreference(this.activity)`
とactivityを渡してますが、これにApplicationContextとかBaseContextとか渡しても、
これらのContextは画面に関する情報を持ってないのでDialogの生成ができずに、

```
android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
```
とかで落ちます。
Omniauth-facebookのコールバックが返ってこない時の対処法

Omniauth-facebookを新たに`bundle install`して認証機能を実装していたら、
Facebook認証後のコールバックが返ってこなくて詰まった。

`bundle update omniauth-facebook`でバージョンを最新の4.0.0に更新したら直る。
Graph APIのAPIバージョンが古いからだと思うけど、まさかデフォルトの`bundle install`した時のバージョンがまだ4.0.0になっていないとは思わなかった。

新規アプリでOmniauth使って認証機能作る時はご注意を。
goroutine にシグナルを送信する

正確には goroutine へ直接シグナルを送る方法なんてありませんが、次のパッケージを使うことで似たようなことを実現することができます。(タイトルで釣ってしまって申し訳ないです!!)

[Code-Hex/sigctx - GitHub](https://github.com/Code-Hex/sigctx)　　[![GitHub stars](https://img.shields.io/github/stars/Code-Hex/sigctx.svg?style=social&label=Star)](https://github.com/Code-Hex/sigctx)
> context with signal in golang

シグナル受信するための context を作成することができるパッケージです。

# あるシグナルをプロセスが受け取ったら context cancel を行う
```go
package main

import (
	"context"
	"fmt"
	"sync"
	"syscall"

	"github.com/Code-Hex/sigctx"
)

func main() {

	ctx := sigctx.WithCancelSignals(
		context.Background(),
		syscall.SIGINT,
		syscall.SIGTERM,
		syscall.SIGHUP,
	)

	var wg sync.WaitGroup
	for i := 0; i < 10; i++ {
		wg.Add(1)
		go func() {
			defer wg.Done()
			for {
				select {
				// You can cancel by send signal.
				case <-ctx.Done():
					fmt.Println(ctx.Err())
					return
				}
			}
		}()
	}
	wg.Wait()
}
```

`sigctx.WithCancelSignals` の第一引数に `context.Context` を、その後ろに context キャンセルを行わせたい `os.Signal` を指定します。（この場合だと INT, TERM, HUP を受信すると `context` キャンセルを行います）
めっちゃシンプルですね！

# 受け取ったシグナルを context を使っている全ての goroutine へ通知する
```go
package main

import (
	"context"
	"fmt"
	"sync"
	"syscall"

	"github.com/Code-Hex/sigctx"
)

func main() {

	ctx := sigctx.WithSignals(
		context.Background(),
		syscall.SIGINT,
		syscall.SIGTERM,
		syscall.SIGHUP,
	)

	var wg sync.WaitGroup
	for i := 0; i < 10; i++ {
		wg.Add(1)
		go func() {
			defer wg.Done()
			for {
				select {
				// You can notify signal received.
				case <-sigctx.Recv(ctx):
					signal, err := sigctx.Signal(ctx)
					if err != nil {
						fmt.Println(err.Error())
						return
					}
					switch signal {
					case syscall.SIGINT:
						fmt.Println(signal.String())
						return
					default:
						fmt.Println(signal.String())
					}
				case <-ctx.Done():
					fmt.Println(ctx.Err())
					return
				}
			}
		}()
	}
	wg.Wait()
}
```
`sigctx.WithSignals` と `sigctx.Recv` を使うことで通知が可能になります。
`sigctx.Recv` の引数には「`sigctx.WithSignals` の返り値の `context.Context`」を渡すことで実現可能です。

また受信したシグナルを受け取るには `sigctx.Signal` を使うと受け取ることができます。`sigctx.Signal` の引数も「`sigctx.WithSignals` の返り値の `context.Context`」をわたうようにしてください。

この辺はもう少し工夫すればもっとシンプルになりそうですが、もっと良いアイデアお持ちの方がいましたら是非 PR を送っていただけると嬉しいです。
是非使ってみてください！
2017-04-11 Python > generatorを試してみた > generator式 / generator関数 / next()を教えていただきました

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

generatorを試してみた。
Unityで初めてみたyieldを使うようだ。

参考: [9.9. ジェネレータ (generator)](http://docs.python.jp/3/tutorial/classes.html#generators)

試してみた。

http://ideone.com/byVYbr

```py
def my_odds(last=10, step=1):
	number = 0
	while number < last:
		if number % 2 == 1:
		  yield number
		number += step

alist = my_odds(10, 1)
for elem in alist:
	print(elem)
```

```txt:結果
Success	time: 0.02 memory: 28384 signal:0
1
3
5
7
9
```

~~[6.2.8 ジェネレータ式](https://docs.python.jp/3/reference/expressions.html?highlight=generator#grammar-token-generator_expression)~~

@shiracamus さんの[コメント](http://qiita.com/7of9/items/457c550e91f803be6cf9/#comment-8080b5f2dd9ccc07bebb)にて「generator式」と「generator関数」の違いについて指摘いただきました。また、`next()`についても教えていただきました。

情報感謝です。
Python > lambda > tiny functions / callback functions

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

lambdaについての記載あり。

用法としては以下の2つ

- to define many tiny functions
- to define callback functions (see Appendix A for examples)

tiny functionの方を試してみた。

http://ideone.com/jKrTOy

```py
def print_processed(alist, func):
	for elem in alist:
		print(func(elem))

members = [ '7of9', 'Janeway', 'Able was I ere I saw Elba' ]
print_processed(members, lambda word: word[::-1])
```

```txt:結果
9fo7
yawenaJ
ablE was I ere I saw elbA
```

[6.13. ラムダ (lambda)](https://docs.python.jp/3/reference/expressions.html?highlight=lambda#lambda)
技術英語 > ... that can be time savers [when the need arises] / Do The Simplest Thing That Could Possibly Work

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

> ... that can be time savers **when the need arises**.

文章の前からは

> The itertools modules has many more functions, notably some for combinations and permutations that can be time savers **when the need arises**.

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

> Do The Simplest Thing That Could Possibly Work

http://wiki.c2.com/?DoTheSimplestThingThatCouldPossiblyWork

複雑にしていると、デバッグ時に「証拠に基づく改善」でなく「推測に基づく改善?」になってしまう。そうなると、いつまでたってもバグが取れない。

問題が発生した時、「これを再現する一番シンプルな状況は何か」を考えて構築するようにしている。
golangのループ変数の使い方をチェックするlinter作ってみた

## 追記

scopelintを廃止しました。

[代わりにポリシーの違う2つのlintに分けました](https://qiita.com/kyoh86/items/8f14d171dbe08f22ec1e)

## 注意

某Let's encryptの騒ぎで、まさにこの問題が根幹にあったみたいですね。
Scopelintがもうちょっとちゃんとしていれば…

現在、False positiveが取り除けていません
（ゆえに主要なlinter suiteでdefault offになっています）

contribution、お待ちしています。

→ [kyoh86/scopelint](https://github.com/kyoh86/scopelint)

## 動機

golangでforループを回すと、中でうっかりクロージャやリファレンスを取れません。

```example/readme.go
package example

import "fmt"

func readme() {
	values := []string{"a", "b", "c"}
	var funcs []func()
	for _, val := range values {
		funcs = append(funcs, func() {
			fmt.Println(val)
		})
	}
	for _, f := range funcs {
		f()
	}
	/*output:
	  c
	  c
	  c
	*/
	var copies []*string
	for _, val := range values {
		copies = append(copies, &val)
	}
	/*(in copies)
	  &"c"
	  &"c"
	  &"c"
	*/
}
```

意外と気づきにくいバグの元になってプログラマは容易に死にます。
一応一部のケースは `go vet` でも検出できますが、万能ではありません。（なぜか `go func(){ }()` だけは気をつけてくれる)

ならチェックしようぜ！ということでlinter作りました。

[scopelint](https://github.com/kyoh86/scopelint)

## 使い方

[golint](https://github.com/golang/lint) とほぼ同じです。
`go get -u github.com/kyoh86/scopelint` でインストールして、雑にパッケージとかディレクトリとかファイルを渡してください。

```
scopelint github.com/kyoh86/scopelint/example
scopelint ./...
```

幾つかオプションも用意しました。

* `--set-exit-status` : golintに同じ。エラーがあれば終了コードを `1` に設定する。毎回指定するのアホらしいので、デフォルト `true` 。
* `--vendor` : `vendor` ディレクトリの下は見ない。これもデフォルト `true` 。
* `--test` : `*_test.go` なファイルは見ない。これもデフォry

## 終わりに

あちこち [golint](https://github.com/golang/lint) のソースをコピペして作っています。ライセンス書かなきゃ…
とまれ、良きgopherライフを！
AngularJS 4.0を始めてみる

# AngularJS 4.0をnpmでインストール 
```js
npm install -g @angular/cli
```
# サンプルプロジェクトを作成

```js
ng new marph-sample
```
# ポートを4200→80に変更

```js:package.json
 "start": "ng serve --port 80",
```
# サンプルプロジェクトを起動

```js
 npm start
```
# サンプルプロジェクトを開く
[http://localhost] (http://localhost)

# AngularJS4対応のIDEをインストール
https://www.genuitec.com/products/angular-ide/

```js
npm install -g angular-ide
ngide install ~/Development/angular-ide
```
ローディングの表示位置による視線誘導

ローディング表示を表示する位置を少し工夫してユーザ体験を改善しよう、という小話です。

ローディングって安易にど真ん中に表示しても良いのですが、スピナーみたいに動くものってつい見ちゃいますよね。例えば、TwitterのiOSアプリは画面の上のほうにスピナーを表示しています。

![C98532C1-463D-48F0-B7CB-EB3D90D645FC.PNG](https://qiita-image-store.s3.amazonaws.com/0/40928/b638b10a-9073-5d54-eb7a-a0c8b9aad478.png)

Twitterは上から下にコンテンツが流れていくので、スピナーに注目させてユーザの視線の初期位置を画面トップに誘導することで自然な視線の流れをデザインしているんじゃないかなと思います。

このように、ユーザの視線を誘導したい場所にスピナーを表示すれば、ローディング表示からコンテンツへと自然に移行でき、負担を軽減することが期待できます。

さくっとできる工夫なので、何かの参考になれば幸いです。

---
:whale2: Twitter: [@a_beco](https://twitter.com/a_beco)
:guitar: SoundCloud: [@beco](https://soundcloud.com/baron1_3) <- 作業用BGMにどうぞ！
flexboxを使った中央寄せについて

flexboxを使った上下左右の中央寄せで詰まったのでメモしておく。

##flexbox使い方
親要素に、```display:flex;```を指定する。
すると子要素は自動的に```flex item```になる。

####「flex-direction」
子要素の配置方向を決める。
row : 子要素が左から右に配置される。
column : 上から下に配置される。
row-reverse : 右から左に配置。
column-reverse : 下から上。



###詰まったのが以下↓
flex-directionのcolumnとrowの指定の仕方によって、揃える方向が逆転する。

justify-content：水平方向の揃え方（しかし、flex-direction: column;指定の場合は、垂直方向に揃える。）
align-items：垂直方向の揃え方（しかし、flex-direction: column;指定の場合は、水平方向に揃える。）




参考
https://liginc.co.jp/web/html-css/css/21024
Bootstrapを使ってWebアプリを作ってみた。


自前の簡単なWebアプリではBootstrapなんて大仰かな〜と、CSSをぽちぽち書いていたんですが、めんどくさがってばかりいてもだめだなということでBootstrapの勉強も兼ねてWebアプリをつくってみました。

# Webアプリの仕様

こんなサービスを考えてみました。

1. タイトル : Today's Lunch

1. サービス仕様
    - 今日のおすすめランチスポットを探す。
    - 現在地から一定範囲内のランチスポットを検索、範囲は変更可能
    - 行ったところを記憶しておいて、マンネリを防ぐ
    - 実際に行ったところを記録し、ヒストリー表示にする。

1. システム仕様
    - all javascriptで作る。
    - bootstrapでレスポンシブなデザインにする。
    - ランチの記録はローカルストレージに保存する。

# スクリーンショット

- Bootstrapをつかってレスポンシブデザインになるようにしたのでメニューとかいい感じになりました。

## PC画面想定

![pc.png](https://qiita-image-store.s3.amazonaws.com/0/51116/409e9902-d65d-e024-964e-9f4adec3eae6.png "pc.png")


## モバイル画面想定

![sp.png](https://qiita-image-store.s3.amazonaws.com/0/51116/423b12f4-6a91-100e-2152-8be3b008133c.png "sp.png")

# システム構成

1. Herokuで動かす。（といっても静的ページ機能しか使わない）
2. 施設一覧はGoogle Map APIのプレイス ライブラリで検索
3. 地図はGoogle Map API

- Herokuは静的ページを配信する[テンプレート](https://github.com/nulltask/heroku-static-provider)を利用させていただきました。
- Bootstrapのテンプレートは日本語がきれいだということで、[Honoka](http://honokak.osaka)を利用させていただきました。

# Webアプリ

- 現在は[https://todays-lunch.herokuapp.com/](https://todays-lunch.herokuapp.com/)で動かしてます。


# Bootstrapを使ってみた感想

- 作法に沿って書けばレスポンシブ対応になるのはやっぱり便利ですねー
- div,div,divと結構HTMLのサイズが大きいですね。Bootstrap自体の大きさもあるし、モバイル回線的にはどうなんでしょうか？
- 出来合いの色パターンをつかえばあまり深く考えなくてもそれっぽいサイトができるのがいいですね。
docker上でMySQL Federated-Engineを試す

## コンテナの作成

```
docker run --name mysql56_1 -it mysql:5.6 /bin/bash
docker run --name mysql56_2 --link mysql56_1:m1 -it mysql:5.6 /bin/bash
```

## mysql56_1,2の設定

```
mysql_install_db --datadir=/var/lib/mysql
cd /usr ; /usr/bin/mysqld_safe &
apt-get update
apt-get -y install vim
```

```
cat << EOS >> /etc/mysql/my.cnf
character-set-server=utf8

[mysql]
default-character-set=utf8
EOS
```

```
>ping m1
```

## Federatedの設定
```:mysql56_1
CREATE TABLE `tb1` (
    `id` int NOT NULL,
    `name` varchar(20) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `tb1` ADD PRIMARY KEY (`id`);
ALTER TABLE `tb1` MODIFY `id` int NOT NULL AUTO_INCREMENT;
GRANT ALL ON mytest1.* TO fuser1@'%' IDENTIFIED BY 'password';
```

```:mysql56_2
mysql -u fuser1 -h m1 -p
```

```:mysql56_2
CREATE DATABASE mytest2;
use mytest2;

CREATE TABLE `tb1` (
    `id` int NOT NULL,
    `name` varchar(20) NOT NULL
) ENGINE=FEDERATED CONNECTION='mysql://fuser1:password@m1/mytest1/tb1';
```

```:mysql56_1
insert into tb1(name) value('abc');
```
```:mysql56_2
mysql> select * from tb1;
+----+------+
| id | name |
+----+------+
|  1 | abc  |
+----+------+
```