OmniAICreator/Qiita-1.07M huggingface dataset:
Sublime Text 2と3のざっくりとしたPluginまとめ

#仕様書
2,3それぞれのインストールしてあるやつ覚え書き。自分用。動作環境はMac。随時更新します。間違ってるとこあるかも。

## Sublime Text 2
- Package Control
  - パッケージをインストールするやつ
- Gist
  - コードの断片をあげるほう
- TrailingSpaces
  - 全角スペース教えてくれるやつ
- Abacus
  - イコールで行揃えしてくれるやつ
- FindKeyConflicts
  - ショートカットキーの重複確認するやつ
- Goto-CSS-Declaration
  - クラスにカーソル当てて「⌘→」でCSSの定義箇所に飛んでくれるやつ
  - 右クリックでもいける
- BracketHighlighter
  - 括弧にアンダーラインとかつけてくれるやつ
- ColorPicker
  - 「⇧⌘P」でカラーピッカー開いて選択するとそのまま入力してくれるやつ
- Emmet
  - HTML,CSSのコード補完の補強
- jQuery
  - コード補完の補強
- HTML5
  - コード補完の補強
- SublimeCodeIntel
  - いろいろ（JavaScript、Mason、XBL、XUL、RHTML、SCSS、Python、HTML、Ruby、Python3、XML、Sass、XSLT、Django、HTML5、Perl、CSS、Twig、Less、Smarty、Node.js、Tcl、TemplateToolkit、PHP）のコード補完の補強
  - 右クリックで飛べる


## Sublime Text 3
- Package Control
  - パッケージをインストールするやつ
- Gist
  - コードの断片をあげるほう
- TrailingSpaces
  - 全角スペース教えてくれるやつ
- Abacus
  - イコールで行揃えしてくれるやつ
- FindKeyConflicts
  - ショートカットキーの重複確認するやつ
- Goto-CSS-Declaration
  - クラスにカーソル当てて「⌘→」でCSSの定義箇所に飛んでくれるやつ
  - 右クリックでもいける
- BracketHighlighter
  - 括弧にアンダーラインとかつけてくれるやつ
- ColorPicker
  - 「⇧⌘P」でカラーピッカー開いて選択するとそのまま入力してくれるやつ
- Color Highlighter
  - 選択したカラーコードの背景色がその色になるやつ
- SublimeLinter
  - コードミス修正のフレームワーク
- AutoFileName
  - ファイル名の拡張子とかを補完してくれるやつ
- SublimeLinter-csslint
  - CSS3のプラグイン
- SublimeLinter-html-tidy.linter
  - HTML5のプラグイン
- Emmet
  - HTML,CSSの入力ショートカット
  - [チートシート](http://docs.emmet.io/cheat-sheet/)
  - [もっとわかりやすいまとめ](http://dev.classmethod.jp/tool/sublime-text-2-emmet-coding-2/)
- jQuery
  - コード補完の補強
- HTML5
  - コード補完の補強
- CSS3
  - コード補完の補強
- Bootstrap 3 Snippets
  - コード補完の補強
  - [チートシート](https://packagecontrol.io/packages/Bootstrap%203%20Snippets)
- SublimeCodeIntel
  - いろいろ（JavaScript、Mason、XBL、XUL、RHTML、SCSS、Python、HTML、Ruby、Python3、XML、Sass、XSLT、Django、HTML5、Perl、CSS、Twig、Less、Smarty、Node.js、Tcl、TemplateToolkit、PHP）のコード補完の補強
  - 右クリックで飛べる

## おまけのTheme
- [Material Theme](https://github.com/equinusocio/material-theme)
  - 事実上3のみと思っていい
  - 正直これが使いたくて2から3に移行した
  - ファイルのアイコンが素敵
  - Lightがかわいいので推せる
Google Java Styleの特徴的なところまとめ

GoogleのJavaコーディング規約である [Google Java Style](https://google.github.io/styleguide/javaguide.html) の、ポイントとなりそうなところを独断と偏見で並べてみました。

# インデントはスペース2  ([4.2](https://google.github.io/styleguide/javaguide.html#s4.2-block-indentation)節)

今風っぽい感じですが、これまでは4がデファクトであることと、現存ソースへの影響が大きすぎる（全行対象！）ので、既存システムのメンテナンスでは適用できないかもですね。ただ、これだとソースがコンパクトになった気がして良いと思います。個人的にこれから書くソースは2にすることにしています。Qiita上でソースを書くこともありますが、スマホで読む人も居るだろうと考えた次第です。

# import文とpackage文は改行しない ([3.2](https://google.github.io/styleguide/javaguide.html#s3.2-package-statement)節　[3.3.2](https://google.github.io/styleguide/javaguide.html#s3.3.2-import-line-wrapping)項)

「そんなのEclipseでフォーマット設定できるのか？」と思って調べてみたところ、Eclipse(Mars.2)上で設定する項目は見当たりませんでした。試しに階層が深いパッケージを作ってフォーマット(`Ctrl + Shift + f`)を試してみたところ改行されませんでした。IntelliJ IDEA 15.0.4(Community Edition)でも同様でした。そもそもそういう仕様だということですね。

# 1行は100文字まで ([4.4](https://google.github.io/styleguide/javaguide.html#s4.4-column-limit)節)

以前は80あるいは100という規約だったのですが、100に変更（緩和？）されたようです。依然厳しいような気がします。ただ例外もあって、コメント中に長いコンソール上のコマンド例を入れる場合や、長いURLがあって不可能な場合や、package文や、import文は例外としています。（自動ツールでこう言うの表現できるのかな、、、？）

守れたら読みやすくなるでしょう。どこかで基準を設けないと限りなく伸びるものなのでそういう意味では制限を入れるのは正しいと思います。インデントは2、このルールはpackage文import文には適用されないので頑張って心がければ100なら行けるかもしれません。



# 水平位置揃えは不要　([4.6.3](https://google.github.io/styleguide/javaguide.html#s4.6.3-horizontal-alignment)項)

水平位置揃えというのはこういうものです。

```java
String nantoka;
int    kantoka;
```
フィールド名のカラム位置が揃っています。これは推奨ではなくて、

```java
String nantoka;
int kantoka;
```
のように、カラム位置はそれぞれ行毎に決定することを推奨するとのことです。

確かに、最初に開発するときはカラムが揃っていて見やすいのですが、フィールドを追加削除していると修正範囲が広がってしまって継続的にメンテする人が不幸になるパターンだと思います。旧来のアタマだとやってしまいがちなので、規約で扱いを明らかにするのは有意義かと。

フィールドだけでなく、長いSQLの組み立てなどで項目を1行ずつ書きたい場合もあると思います。こういう時に、行末に末尾を書いてその水平位置を揃えたくなる向きもあると思いますが、そういうのも避けたほうが良いですね。

例えば、

```java
StringBuilder sql = new StringBuilder();
sql.append("select "); 
sql.append("id ");       // ID番号
sql.append("name ");     // 名前
sql.append("address ");  // 住所
sql.append("email ");    // Email
```
こういうのはやめて、

```java
StringBuilder sql = new StringBuilder();
sql.append("select "); 
// ID番号
sql.append("id ");
// 名前
sql.append("name ");
// 住所
sql.append("address ");
// Email
sql.append("email ");
```
こうしたほうが良いと思います。コメントの水平位置を揃えようとしたら負けです。

# 命名関係

## 命名に、接尾辞・接頭辞は 使わない。　([5.1](https://google.github.io/styleguide/javaguide.html#s5.1-identifier-names)節)

命名において、 name_ 、 mName 、 s_name や kName といったような命名はしないとのこと。いわゆるハンガリアンはやらないということですね。古臭さが除去出来て良いのかもしれません。


## ロガーは コンスタントケース(CONSTANT_CASE)ではない。([5.2.4](https://google.github.io/styleguide/javaguide.html#s5.2.4-constant-names)節)

ロガーというのはいわゆるこういうものです。

```java
static final Logger logger = Logger.getLogger(MyClass.getName());
```
定数ではないので小文字キャメルケース(lowerCamelCase)で命名せよとのことです。私としてはstatic final なものは一律コンスタントケースで良いと思います。そのほうが自動化チェックし易いですし。

## 「iOS」をキャメルケースにすると 「Ios」 ([5.3](https://google.github.io/styleguide/javaguide.html#s5.3-camel-case)節)

違和感ありますが、そこまででもきっちり管理したいということなのでしょう。

# 触れられていないこと

- クラス名行数制限、メソッド名行数制限 (一律的な基準を作るのは難しいのかも)
- メトリクス関係（一律的な以下略）

# 参考

[Google Java Style (非公式和訳)](https://kazurof.github.io/GoogleJavaStyle-ja/)
Fortranの配列に要素を直接代入


fortranでは`(/ /)`を使うことで直接配列に要素を代入できる

## 例

### 行に代入
1行目に1,2,3,4,5,6,7を代入

```fortran
B(1,:) = (/ 1, 2, 3, 4, 5, 6, 7 /)
```

### 列に代入
1列目に1,2,3を代入

```fortran
B(:,1) = (/ 1, 2, 3/)
```

### 変数を使った代入
```fortran
B(1,:) = (/ (i,i = 1, 7) /)
```

## 参考資料
[Nag 12 配列](http://www.nag-j.co.jp/fortran/FI_12.html)
実務で使えるdiffのまとめ

# はじめに
Infrastructure as Codeとか言われますが、まぁそんな簡単にいかないです。
今から新規サーバを構築するのであれば良いですが、大体のところはすでに稼動しているサーバがあって、そのサーバは数年前に構築されたもので、その数円前はInfrastructure as Codeとかまだ流行ってなくて、地味な構築手順書が存在しててるが、更新されてるか微妙でちょっと調べてみたら案の定更新されてなくて、、、みたいなパターンがあると思います。
その場合、基本的にdiffをとって正解を定義して・・・一つ一つ正解をcode化して・・・という感じで地道にやっていくのですが、その際に知っておくと便利情報をまとめておきます。

# 下記で出てくるローカル（作業マシーン）は
* mac os x El Capitan
* バージョン10.11.3


# コマンドで頑張る系

## 比較するファイルが**単体**で片方がローカル片方がリモートの場合
### 書き方1
```
ssh hostname cat /path/to/file | diff /path/to/file -
```
* diffに`-`オプションをつけるとファイルの代わりに標準入力を読むという意味
* `ssh hostname`でサーバにログインできる前提

### 書き方2
```
diff <(ssh hostname cat /path/to/file) /path/to/file  
```
* hostnameにsshログイン後に`cat /path/to/file`を実行します

### 注意
* localにしかないファイルがある場合は気づけない

## 比較するファイルが**複数**で両方ともリモートサーバにある場合
```
for p in `ssh hostname01 'find /path/to/dir/ -name "*" -type f -print'`; do echo "---checkfile is ${p}---"; diff -q <(ssh hostname01 "cat ${p}")  <(ssh hostname02 "cat ${p}"); done
```
* `hostname01`の`/path/to/dir/`以下にあるファイルを`hostname02`の`/path/to/dir/`以下のファイルと比較する
* `-prune`オプションを使って除外するファイルのパターンを設定するのもよし


## 比較するファイルが**複数**で片方ローカル片方リモートサーバにある場合
```
for p in `find /path/to/dir -type f -print`; do echo "---checkfile is ${p}---"; ssh hostname "cat /path/to/dir/${p}" | diff -c - ${p}; done
```

### 注意
* 都度sshしまくるのでサーバによっては[DenyHosts](http://denyhosts.sourceforge.net/)にひっかり途中で止まる
* DenyHostsは簡単にいうとブルートフォースアタック（そうアタック攻撃）から守るもの
  * `hosts.allow`、`hosts.deny`の設定で特定のIPを除外する設定がある



## 比較するファイルが**複数**で両方ともローカルに置いている場合
```
diff -qr /path/to/dirA /path/to/dirB
```
* `q`は差分があった際はファイル名だけを出力、`r`はディレクトリ配下を再帰的にdiffする
* 手間だけど一番現実的

### 注意
* どちらか一方にしかないファイルも検出できる

# ツールを使う
[Ajimi](https://github.com/crowdworks/ajimi)を使う
* 同じような課題をCrowdWorksさんが持っていて[blog](http://engineer.crowdworks.jp/entry/2015/10/30/100000)で発信されてたのを発見しました
* ruby製
* 詳しい説明は上記のblogとgithubで
* chefで作られたものを味見するっていいですね。

### 注意
* 自分の環境(ruby 2.3.0)では下記のエラー？warning？が出力された

  ```
 .rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/net-ssh-2.9.4/lib/net/ssh/transport/session.rb:84:in `initialize':
  Object#timeout is deprecated, use Timeout.timeout instead
  ```
* gemの`net-ssh-2.9.4`が原因のようでこれを3系にあげれば大丈夫っぽい
* 自分のmac(作業マシン)から`source:remote serverA`と`target:remote serverB`という環境で試した。
 * remote serverのOSのバージョンとかの原因だと思うけど`sudo: sorry, you must have a tty to run sudo`的なエラーが発生してした
 * `/etc/sudoers`の`Defaults    requiretty`のコメントアウトをすれば行けた
 

# まとめ？感想的なもの
* やっぱり現場レベルでは同じような課題を持ってる人がいたんだなーっと
* まぁともあれAjimiを使えば良いと思う
* いろんな状況で運用しているサーバはたくさんあり、そのサーバ達を以下にモダンな仕組みへ変えていくかのノウハウ、Tipsは超現場感でてて大切っすね
vagrant + nginx + php-fpm


memo _φ(･_･

# Vagrant

```sh
$ vagrant box add centos67 https://github.com/CommanderK5/packer-centos-template/releases/download/0.6.7/vagrant-centos-6.7.box
$ vagrant box list
$ vagrant init centos67
$ vim Vagrantfile
# config.vm.network "private_network", ip: "192.168.11.11"
$ vagrant up
$ vagrant ssh                                                                                                                                                                                                                                                                                                                                                                                                                                          
```

# CentOS: init

```sh
$ sudo yum update
$ sudo /etc/init.d/vboxadd setup  # yum update 以後 vagrant up で mount fail する場合にこれをすると治る.
$ sudo rpm -ihv http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
$ sudo rpm -ihv http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/i386/epel-release-6-8.noarch.rpm
$ sudo rpm -ihv http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
$ sudo rpm -ihv http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
```

# CentOS: install

```sh
$ sudo yum install nginx
$ sudo /etc/init.d/nginx start   # curl localhost => ok!
$ sudo yum install php --enablerepo=remi-php56
$ sudo yum install php-fpm --enablerepo=remi-php56
```


# CentOS: setup

```sh
$ sudo vim /etc/php-fpm.d/www.conf 
# user = nginx
# group = nginx
# listen = /var/run/php-fpm/php-fpm.sock
# listen.owner = nginx
# listen.group = nginx
# listen.mode = 0660
```

```sh
$ sudo vim /etc/nginx/conf.d/default.conf
# location ~ \.php$ {
#   root   /usr/share/nginx/html;
#   fastcgi_split_path_info ^(.+\.php)(/.+)$;
#   fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
#   fastcgi_index index.php;
#   include fastcgi_params;
#   fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# }
```

# CentOS: start

```sh
$ sudo /etc/init.d/php-fpm restart
$ sudo /etc/init.d/nginx restart
$ sudo vim /usr/share/nginx/html/index.php
# <?php
#    phpinfo();
$ curl localhost/index.php  # display phpinfo => OK!
```
Viewsにて検索結果一覧に列を動的に追加する

#Viewsにて検索結果一覧に列を動的に追加する
ユーザや役割で「編集・削除」リンクを表示している列を表示/非表示の制御をしたいこともあると思います。
そんなときはこれ。

````
/**
 * Implements hook_views_pre_view().
 */
function MYMODULE_views_pre_view(&$view, &$display_id, &$args) {
  if ($view->name === 'test_path') {
    $view->add_item($view->current_display, 'field', 'views', 'nothing', array(
      'label' => 'DynamicField',
      'alter' => array('text' => 'test text'),
      'element_class' => 'my-field',
      'element_default_classes' => 0,
    ), 'my_field');
  }
}
````

あとは、$user->role などを参照して表示/非表示の制御をすればOK。
あるいは、Viewsの設定画面でフィールドを追加しておいて、
ロジックでunsetするかですかね。
Windows Server に PowerShell ISE が入ってなかったときにPowerShellで入れちゃうコマンド


Windows Server 2008 とかは既定では入っていないのです。

```
Import-Module ServerManager 
Add-WindowsFeature PowerShell-ISE
```

痕跡を消す

```
Remove-WindowsFeature PowerShell-ISE
```
「Scala 関数型デザイン＆プログラミング」の練習問題を解くための開発環境の構築

「Scala 関数型デザイン＆プログラミング ―Scalazコントリビューターによる関数型徹底ガイド」（原書：Functional Programming in Scala）の練習問題を解くための開発環境の構築手順をメモっとく。

なお、IntelliJ IDEA で練習問題を解く場合は[「Scala 関数型デザイン＆プログラミング」の練習問題を解くための開発環境の構築（IntelliJ IDEA 編）](http://qiita.com/takuya0301/items/679bc5d2c47bac5ca860)を見てね。

# OS X での開発環境の構築手順

## 初期設定

サンプルコードを Git リポジトリからクローンする。Scala のビルドツール sbt が一緒に入ってるので、sbt に実行権限を付与する。

```
$ git clone https://github.com/fpinscala/fpinscala.git
$ cd fpinscala
$ chmod a+x ./sbt
```

## 動作確認

sbt を実行すると勝手に色々環境を準備してくれる。待ってれば sbt のコンソールが開く。project コマンドで exercises プロジェクトに切り替える。comiple コマンドでコンパイルする。console コマンドで Scala コンソールを開いて、スクリプトを書いて動作確認する。Scala コンソールは :quit で終了できる。sbt は exit コマンドで終了できる。

```
$ ./sbt
> project exercises
> compile
> console
scala> import fpinscala.gettingstarted.MyModule._
scala> abs(-42)
scala> :q
> exit
```

# 練習問題の解答手順

sbt を実行する。exercises プロジェクトに切り替える。（ここを忘れやすいので注意！）練習問題のソースを好きなテキストエディタで書く。console コマンドで Scala コンソールを開く。読んでいる章のモジュールをインポートする。関数を呼び出して結果を確認する。ダメだったら :q で Scala コンソールを終了する。ソースを書き直して、再度 console コマンドから同じ手順を実行する。Scala コンソールには入力したスクリプトの履歴が残っているので、カーソルキーの上で履歴をたどって実行すると効率的。

```
$ ./sbt
> project exercises
> console
scala> import fpinscala.gettingstarted.MyModule._
scala> fib(10)
scala> :q
> exit
```

練習問題を解くときは answerkey ディレクトリのヒントファイルを参考にする。また、練習問題を解き終わったら answerkey ディレクトリの解答ファイルを読むと効率的な書き方がわかるのでオススメ。

# 関連記事

[「Scala 関数型デザイン＆プログラミング」の練習問題を解くための開発環境の構築（IntelliJ IDEA 編）](http://qiita.com/takuya0301/items/679bc5d2c47bac5ca860)

# 参考文献

https://github.com/fpinscala/fpinscala
SharePoint Client Object Model でビューの表示列を変更するコード


```javascript
function changeViewFields(ListName, ViewName, Fields){
	// コンテキストオブジェクト取得
	var custCtx = SP.ClientContext.get_current();
	// サイトオブジェクト取得指示
	var custWeb = custCtx.get_web();
	// リスト（ライブラリ） オブジェクトの取得指示
	var custList = custCtx.get_web().get_lists().getByTitle(ListName);
	// ビューオブジェクトの取得指示
	var custView = custList.get_views().getByTitle(ViewName);
	custCtx.load(custView);
	// ビュー表示列オブジェクトの取得指示
	var custViewFields = custView.get_viewFields();
	custCtx.load(custViewFields);

	// 取得実行
	custCtx.executeQueryAsync(
		// 成功時ハンドラ
		function () {
			custViewFields.removeAll();
			for(i = 0; i < Fields.length; i++) {
				custViewFields.add(Fields[i]);
			}
			custView.update();
			custCtx.executeQueryAsync(
				// 成功時ハンドラ
				function () {
					 alert('Change view [ ' + ListName + ' - ' + ViewName + ' ] fields complete.');
				}, function (sender, args) {
					 alert('Change view [ ' + ListName + ' - ' + ViewName + ' ] fields failed. ' + args.get_message() + '\n' + args.get_stackTrace());
				} // 失敗時ハンドラ
			);
		}, function (sender, args) {
			 alert('Get view [ ' + ListName + ' - ' + ViewName + ' ] fields failed. ' + args.get_message() + '\n' + args.get_stackTrace());
		} // 失敗時ハンドラ
	);
}

changeViewFields("（リスト表示名）", "（ビュー表示名）", ['ID','Title','(列内部名)']);
```
[Google App Engine] 開発環境構築から、アプリケーション作成までの流れ

GAEの開発環境として使用していたMacBook Proが壊れたので、MacBook Airに改めてGoogle AppEngine(GAE)向けの開発環境を再構築しました。その際に諸々の手順を忘れてしまっていたので、改めて備忘録として記したメモです。
トライアルでいろいろなことを試す環境なので、プロジェクト名をplaygroundとし、その下にアプリを作成して行きます。

1. Google AppEngine SDK for Pythonを[ここ] (https://cloud.google.com/appengine/downloads/?hl=ja#Google_App_Engine_SDK_for_Python)からダウンロードしてインストール
2. SDKに同包されているDjangoを使用するためのPATHを通す
3. GAEプロジェクト作成
4. GAEアプリケーション作成

**1. Google AppEngine SDK for Pythonを[ここ] (https://cloud.google.com/appengine/downloads/?hl=ja#Google_App_Engine_SDK_for_Python)からダウンロードしてインストール**
インストーラをダウンロードしてインストールするだけなので、ここは簡単でした。

**2. SDKに同包されているDjangoを使用するためのPATHを通す**
ホームディレクトリで下記の作業を行います。
vim等のテキストエディタで、.bashrcと.bash_provileを作成し、それぞれ下記の行を追加します。

```
~/.bash_rc
export PYTHONPATH='/usr/local/google_appengine/lib/django-1.5/'
export PATH=$PATH:/usr/local/google_appengine/lib/django-1.5/
```

```
~/.bash_rc
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi
```

```
source ~/.bashrc
source ~/.bash_profile
```

Djangoの管理タスクを実行するためのdjango-admin.pyを実行可能にするため、以下をコマンドラインで実行します。

```
chmod 744  /usr/local/google_appengine/lib/django-1.5/django/bin/django-admin.py
```

**3. GAEプロジェクト作成**

作業ディレクトリに移動します。例えば、ホームディレクトリの直下のディレクトリDevelopmentで作業するとします。

```
cd ~/Development
```

~/Developmentに移動したあと、以下をコマンドラインで実行し、Deployの単位となるプロジェクトを作成します。

```
/usr/local/google_appengine/lib/django-1.5/django/bin/django-admin.py startproject playground
```

**4. GAEアプリケーション作成**

endopoint機能を試したかったので、endpointというアプリケーションを作成します。
```
cd playgroud
python manage.py startapp endpoint
```

以上で、一旦アプリケーション作成まで行きました。
ここから先はまた別の機会に。
libxlsxwriterを使って、C++でxlsxファイルを書き出す。


Pythondで大量のデータをxlsxファイルに書き出すときに時間がかかるので、C++のライブラリを使ってみた。
使いどころとしては、大量のcsvやtsvデータをxlsxにExcelを使わずに書き出す場合。
速度比較を忘れたが、雲泥の差でC++が高速に書き出すことができた。
そのうち比較する。

xlsxファイルの場合1,048,576行、16384列まで対応してる。

# libxlsxwriter

C用のシンプルなxlsx書き出しライブラリ。
[Githubレポジトリ](https://github.com/jmcnamara/libxlsxwriter.git)で公開されている。

豊富な例が同梱されている。

## インストール
インストール不要でも利用可能。
その場合はパスの指定が必用。

```zsh
$ git clone https://github.com/jmcnamara/libxlsxwriter.git
$ cd libxlsxwriter
$ make
$ sudo make install
```

## 使い方
タブ区切りの標準入力をタブをセルの列区切りとし、引数で指定したファイルにxlsx形式で出力する。

### サンプルコード
```tsv2xlsx.cpp
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
#include <boost/algorithm/string.hpp>
#include "xlsxwriter.h"

int main(int argc, char **argv) {
  // 引数チェック
  if (argc < 2){
    std::cerr << "Usage: " << argv[0] << " output_filename.xlsx" << std::endl;
  }

  // ExcelのWorkbookとWorksheetを作成
  lxw_workbook  *workbook  = workbook_new(argv[argc-1]); // argv[argc-1]はファイル名
  lxw_worksheet *worksheet = workbook_add_worksheet(workbook, NULL);

  std::vector<std::string> v_string;
  int row = 0;
  char input_text[51200]; // 標準入力のバッファー(string型で標準入力を受けるのがいいかも)
  while (std::cin.getline(input_text, sizeof(input_text))){
    row++;
    // 行数上限を超えないようにする。
    if(row == 1000000){
      break;
    }
    // 入力が空行の場合、書き込まない。
    if(!input_text[0]){
      continue;
    }
    // 入力をタブで区切る。
    boost::split(v_string, input_text, boost::is_any_of("\t"));

	// 1行出力
    for (int col = 0; col < v_string.size(); col++){
      worksheet_write_string(worksheet, row, col, v_string[col].c_str(), NULL);
    }
  }

  workbook_close(workbook);

  return 0;
}
```

### コンパイルと実行
```sh
% g++ tsv2xlsx.cpp -o tsv2xlsx -lxlsxwriter
% cat test.tsv | ./tsv2xlsx test.xlsx
```
HTML,CSS勉強メモ #4 〜レイアウト入門9-12色々〜

本日の勉強。

##**勉強内容**
###CSSレイアウト入門
  09〜12 

##**進度**
09:3カラムレイアウトを作ってみよう
10:可変幅のカラムを作ってみよう
11:リストでメニューを作ってみよう
12:メニューを完成させよう

##**メモ**
また細かいことが気になってしました。

**11:リストでメニューを作ってみよう**
**`font-size:0;`で余白が無くなる理由**
色々調べたのですが、なかなか「そういうことか！」と納得できる答えが出ません。
テキスト用の領域が無くなるせいか？とか考えたのですが、どうやらHTMLで`li`を一つ一つ改行して記述し、横並びの方法を`display:inline-block;`で指定する。
この二つが関係していそうです。
`ul`要素で`height:40px;`と高さを出して、`float:left;`で横並びにしたら普通に余白がなくなりました。
さらに、`li`要素を改行せずに続けて書くと余白が表示されないという記事もあったので、
関係しているのはそこかな？という結論です。
しかし、ではなぜそうなるのか？はわかりませんでした・・・
今後も調べてみようと思います。

ただ一つ、`font-size:0;`って場合によってはスパム扱いになることがあるという恐ろしいことが分かりました。
`nav`などのデザインのためとわかるものは大丈夫なようですが、多用すると思わぬところで引っかかるかも知れないみたいですね。

**12:メニューを完成させよう**
**line-height:40px;でテキストが中央表示になる理由**
こちらはHTMLクイックリファレンスであっさり解決しました。
`line-height`はフォントの上下均等に余白が配置される仕様になっているとのこと。

以上本日の勉強内容でした。
iOS上のmrubyで正規表現を使えるようにする


[ios-ruby-embedded](https://github.com/ongaeshi/ios-ruby-embedded) (のfork)に [iij/mruby-regexp-pcre](https://github.com/ongaeshi/ios-ruby-embedded/commit/f3d36461e6cd2113789f5be7ac172a44ce91c4eb) を組み込んだらあっさりビルドが通った、万歳。

- [commit log](https://github.com/ongaeshi/ios-ruby-embedded/commit/f3d36461e6cd2113789f5be7ac172a44ce91c4eb)

<blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"><p lang="ja" dir="ltr">2.mattn/mruby-onig-regexp (これも鬼車のビルドが通れば) 3.NSRegularExpressionを使ってRegex実装(どうやってやるんだろう？) 何かネタをお持ちの方がいましたら是非。</p>&mdash; おんがえし (@ongaeshi) <a href="https://twitter.com/ongaeshi/status/714118289539014656">2016年3月27日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">お？ conf.gem :github =&gt; &quot;iij/mruby-regexp-pcre&quot; したら案外あっさりとビルドが通るぞ・・。もうちょっとだ頑張れ。</p>&mdash; おんがえし (@ongaeshi) <a href="https://twitter.com/ongaeshi/status/714119677304184832">2016年3月27日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">シュミレータが終わった、armv7が終わった、arm64も・・、とりあえずコンパイルは通ったぽい。</p>&mdash; おんがえし (@ongaeshi) <a href="https://twitter.com/ongaeshi/status/714120294093303809">2016年3月27日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">今からMRuby.framework組み込む。</p>&mdash; おんがえし (@ongaeshi) <a href="https://twitter.com/ongaeshi/status/714120441674072064">2016年3月27日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">PictRubyで正規表現動いた〜 - iiij/mruby-regexp-pcre <a href="https://t.co/MEyO50s5qv">https://t.co/MEyO50s5qv</a> であっさりビルドできました。 <a href="https://t.co/35j09xVlJt">pic.twitter.com/35j09xVlJt</a></p>&mdash; おんがえし (@ongaeshi) <a href="https://twitter.com/ongaeshi/status/714121849324511232">2016年3月27日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">IIJさまさまです。(iijmio使ってます)</p>&mdash; おんがえし (@ongaeshi) <a href="https://twitter.com/ongaeshi/status/714121988873138177">2016年3月27日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">わーいgsubが使えるよ、これで置換ができる！ <a href="https://t.co/JTqkYEqfjj">pic.twitter.com/JTqkYEqfjj</a></p>&mdash; おんがえし (@ongaeshi) <a href="https://twitter.com/ongaeshi/status/714122970390630400">2016年3月27日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
promiseの順次実行(reduce,co+generator,async/await)

promiseを並列処理する場合は`Promise.all`すればいいですが、並列実行となると少し面倒です。
試しに、1秒ごとに一文字ずつ表示するプログラムを書いて試行錯誤してみます。

環境はnode v4以降とします。

## reduce + Promise.resolve
Promiseをreduceで連結して処理する方法です。

```js
const arr = ['a', 'b', 'c'];

function sleep() {
	return new Promise(resolve => {
		setTimeout(() => {
			resolve();
		}, 1000);
	});
}

arr.reduce((promise, v) => {
	return promise
		.then(() => console.log(v))
		.then(sleep);
}, Promise.resolve());
```

promise.thenはreturnする値をpromise.resolveでラップして新しいPromiseオブジェクトを返します。
なので、以下のようにsleep関数をreturnをしない場合、sleep関数のPromiseの解決を待つことなく次の処理に進むので1秒おきに実行されません。

```js
arr.reduce((promise, v) => {
	return promise
		.then(() => {
			console.log(v);
			sleep();
		});
}, Promise.resolve());
```

1秒ごとに表示するためには、正しくpromiseをreturnする必要があります。

```js
arr.reduce((promise, v) => {
	return promise
		.then(() => {
			console.log(v);
			return sleep();
		});
}, Promise.resolve());
```

reduceを使った方法を見てきましたが、考える事が多くあまりスマートではないですね。

## co + generator
coとgeneratorを使ってみます。

```
$ npm i -S co
```

sleepは上記の関数を使い回します。
coでジェネレーター関数をラップしてやります。
こちらのほうがずっとわかりやすいですね。

```js
const co = require('co');

co(function *() {
	for (const v of arr) {
		console.log(v);
		yield sleep();
	}
});
```

また、coはthunkを引数にとれます。
なので、sleepを以下のように書くこともできます。

```js
const sleep = ms => cb => setTimeout(cb, ms || 1000);
```

しかしながら、coがasync/awaitまでのつなぎと考えるとpromiseベースの関数を使ったほうがよいと思います。

## おまけ (async/await)
そもそもasync/awaitが使える環境であれば、forで回して終わりなんで特に考えることはないですね。以下、babel環境で試してください。

```js
(async () => {
	for (const v of arr) {
		console.log(v);
		await sleep();
	}
})();
```

## まとめ
`co`を使い、async/awaitに備えるのがよいと思います。
Ruby で標準入出力のテスト

RSpec のタグを付けていますが、特に RSpec に限らないと思ったので、このタイトルにしました。

## 想定するケース

* 標準入力に `x` が渡される場合をテストしたい
* 標準出力に出力される文字列を検査したい

こんなとき、[StringIO](http://docs.ruby-lang.org/ja/2.3.0/class/StringIO.html) が活躍してくれます。
このクラスは文字列に [IO](http://docs.ruby-lang.org/ja/2.3.0/class/IO.html) クラスと同じインタフェースを提供してくれます。
つまり、`gets` で読み込んだり、`puts` で書き込んだりできます。

## テストコード例

### 標準入力

```rb
## 標準入力を文字列 x のオブジェクトにすり替える
$stdin = StringIO.new(x)

do_some_tests() # 標準入力を受け取って何かをするテスト
expect(...).to ... # 結果の検査

$stdin = STDIN # 元に戻す
```

### 標準出力

```rb
# 標準出力を StringIO オブジェクトにすり替える
$stdout = StringIO.new

do_something() # 標準出力に書き込む処理
output = $stdout.string # 出力結果の取得
expect(output).to eq ... # 値の検査

$stdout = STDOUT # 元に戻す
```

## 結びに

Web で検索すると、特に入力の方では、標準入力をスタブ化する例をいくつか見かけましたが、このやり方であればわざわざスタブ化しなくても良さそうです。(というか、スタブ化と同等と言ってもいいのかもしれません。)

## 参考

- [Testing STDIN in Ruby - Stack Overflow](http://stackoverflow.com/questions/23349863/testing-stdin-in-ruby)
- [コチョナナバ: rspecで標準出力に出力した内容をチェックする](http://kingyo-bachi.blogspot.jp/2012/06/rspec.html)
Rubyでランダムダンジョンを実装(メモ)


下記を見ながらrubyで実際にやってみたメモです。
http://qiita.com/2dgames_jp/items/037dc62afb268759d16d

# 気にしたこと
* 4方向ランダムな順で一通り舐める。
* 終了条件
	* 再帰処理になるので終了条件が必要。
	* 条件を満たす方向が見つからなくなるまでやる。

# ランダムに4方向を選んで、それぞれに処理を行う
* array.combinationは順序なし、重複なし、だから、今回の用途としては使えない。
* array.permutationは順序あり、重複なし、だから今回の用途に使える。
* 参考
	* http://manapedia.jp/text/1421?page=2

# ソース
```ruby
#!/usr/bin/env ruby
# coding: utf-8

# ２次元ベクトルクラス
class Vector2d
  attr_accessor :x, :y
  def initialize(x, y)
    @x = x
    @y = y
  end

  def +(other)
    return Vector2d.new(x + other.x, y + other.y)
  end
end

class Map

  def initialize(size_x, size_y)
    @size_x = size_x
    @size_y = size_y

    @map = Array.new(@size_y) do |i|
      Array.new(@size_x) do |j|
        :wall
      end
    end
  end

  # 壁かどうか
  def is_wall(x, y)
    if 0 <= x && x < @size_x &&
       0 <= y && y < @size_y

      return @map[y][x] == :wall
    else
      return false
    end
  end

  # ランダムダンジョンを生成する
  def shuffle!(current_pos_x, current_pos_y)
    # 3. 開始地点を決める
    current_pos = Vector2d.new(current_pos_x, current_pos_y)
    # 4. 穴掘り開始
    #  ⅰ. 開始基準地点を「通路」に設定する
    @map[current_pos.y][current_pos.x] = :passage

    #  ⅱ. 4方向をランダムな順番にチェックする
    check_orders = []
    [0, 1, 2, 3].permutation(4).each do |order|
      check_orders.push(order)
    end
    check_order_index = rand(check_orders.length).to_i
    check_order = check_orders[ check_order_index ]

    direction_offsets = [
      Vector2d.new(1, 0),
      Vector2d.new(0, 1),
      Vector2d.new(-1, 0),
      Vector2d.new(0, -1),
    ]
    check_order.each_with_index do |check_dir_index, index|

      check_dir = direction_offsets[ check_dir_index ]

      #  ⅲ. チェックする方向の2マス先が「壁」であれば以下の処理を行う
      check_pos_offset = Vector2d.new( check_dir.x * 2, check_dir.y * 2)
      check_pos = current_pos + check_pos_offset
      if( is_wall(check_pos.x, check_pos.y) )
        #    a. チェックした方向の1マス先を「通路」に設定する
        dig_pos = current_pos + check_dir
        @map[dig_pos.y][dig_pos.x] = :passage
        #    b. 2マス先を開始基準点として 『4. 穴掘り開始』を呼び出す
        p "=="
        p dig_pos
        p check_pos
        dump
        shuffle!(check_pos.x, check_pos.y)
      end
    end
  end

  def dump
    print "--\n"
    @map.each do |row|
      row.each do |element|
        if element == :passage
          print " "
        else
          print "o"
        end
      end
      print "\n"
    end
  end
  
  def draw(screen)
  end
end

map = Map.new(11, 11)
#map.dump
map.shuffle!(2, 2)
map.dump
```
HDDをRMAに出すに当たっての備え

# HDDが故障した時用メモ
HDDが故障した場合、とりあえずAmazon保守（お急ぎ便で代替品を買う）で初期対応するという人は多いだろう。
対応終了後、なんとなく壊れたHDDをそのまま放置する人も多いだろうが、もしかするとそのHDDは新品に交換できるかもしれない。保証範囲内であればRMA（Return Merchandise Authorization）が利用できる。

|メーカー |対応方法 |
|--------|--------|
|HGST    | https://www.hgst.com/support/support-for-japan/rma
|Seagate | http://support.seagate.com/customer/ja-JP/warranty_validation.jsp
|WestanDigital | http://wdsupport.wdc.com/rdsfdc.asp?linktype=rmacreate&portaltype=wd&custtype=end&fs=&ss=&lang=jp
|TOSHIBA | リテールボックス品の場合は販社宛に送付。DT01ACA300BOXなどのようにBOX型番が該当。

各メーカーごとの方法は割愛するとして、ここではHDDが確実に故障だと証明する方法を幾つか挙げる。

# 故障の判断と証明
一般的にHDDが故障した場合、以下の様な症状が出る。

 - OSにてIO Errorが出る
 - 物理的に変な音が出る
 - RAIDカード配下なら、カードから認識されなくなったりする（場合によってはRAID Array が損傷する）
 - ATA CRC Errorが出る
 - Smartの値が悪くなる

故障の判断自体は簡単だし、実際そうしている人は多い。
問題はRMAをするときに故障していることを証明する必要がある。
物理故障でない場合の各社向けの判断基準としては以下のとおり。

|メーカー |判断基準 |
|--------|--------|
|HGST    | Drive Fitness Test （DFT）によるテスト結果
|Seagate | SeaToolsによるテスト結果
|WestanDigital | Data Lifeguard Diagnosticによるテスト結果
|TOSHIBA | Fujitsu ATA Diagnostic Tool （FJDT）これは古い方法で、実はもうFJDTを入手する方法がない。実はユーザ申告がかなりの割合で通るので適当に出してもRMAされる場合も…。

各社基本的に試験ツールがあるので、それに準拠していれば問題はないが、TOSHIBA製HDDについてはツールが古く既に入手できなくなっている。そこで一般的にどのメーカーでもRMAできるデータの提示方法として、セクター検査ができるソフトウェアでの検査結果を印刷して同封しておく良い。

今のところ以下のソフトウェアが使いやすい。
 - GM HDD SCAN http://hdd-data.jp/support/downloads+175.html
 - WinDFT https://www.hgst.com/ja/support/hard-drive-support/downloads
 - FromHDDtoSSD http://www.iuec.co.jp/fromhddtossd2s/v2_0_dl.html

3Tバイトのディスクで7時間程度かかるので寝る前に仕込んでおけばいいだろう。
RMAして戻ってきたHDDはそのまま使うも良し、Hotspareにするも良し、在庫として持っておくも良し自由に使うと言いと思います。
H26年春期 基本情報技術者 午後問12 解説 設問1

```
MAIN    START
        LAD   GR1,BUF
        LAD   GR2,BUF2
        CALL  GETTKN
        RET
BUF     DC    '  THIS 1234  99#AB* .'
BUF2    DS    30

GETTKN  START
        RPUSH
        LD    GR3,=-1         ; 単語種別の初期化
        LAD   GR1,-1,GR1      ; 先頭文字のアドレス - 1
LP      LAD   GR1,1,GR1       ; 次の文字のアドレスをGR1に設定
        LD    GR4,0,GR1       ; 文字を取り出す
        CPL   GR4,='.'        ; 最終記号？
        JZE   FIN             ; 最終記号の場合 FIN へ
        CPL   GR4,=' '        ; 空白間隔？
        JNZ   ALNUM           ; 空白でない場合 ALNUM へ
        CALL  SETTKN          ; 単語管理テーブル設定処理へ
        JUMP  LP              ; 次の文字処理へ

ALNUM   LD    GR3,GR3         ; 単語の処理中？
        JPL   LP              ; 処理中の単語が英字を含む場合は LP ヘ
        JZE   ACHK            ; 処理中の単語が数字だけから成る場合は ACHK ヘ
        LD    GR3,=0          ; 次の単語の処理開始、単語種別を“数字だけから成る”に設定
        LD    GR6,GR1         ; 先頭アドレスを退避
ACHK    CPL   GR4,='9'        ; 数字最大値
        JPL   NEXT            ; 数字最大値より大きい、即ち英字を含む場合は NEXT へ
        CPL   GR4,='0'        ; 数字最小値
        JMI   NEXT            ; 数字最小値より小さい、即ち英字を含む場合は NEXT へ
        JUMP  LP              ; 取り出した文字が数字の場合は LP ヘ
        
NEXT    LD    GR3,=1          ; 単語種別を“英字を含む”に設定
        JUMP  LP              ; 取り出した文字が英字の場合は LP ヘ

FIN     CALL  SETTKN          ; 単語管理テーブル設定処理へ
        LD    GR5,=-1         ; 終端マーク
        ST    GR5,0,GR2       ; 終端マークを単語管理テーブルに格納
        RPOP
        RET

SETTKN  LD    GR3,GR3         ; 単語の処理中？
        JMI   FIN2            ; GR3 = -1: 単語処理中でなければ何もしない
        ST    GR6,0,GR2       ; 退避した単語の先頭アドレスをGR2に格納
        LD    GR5,GR1         ; GR1のアドレスをGR5に格納
        SUBL  GR5,GR6         ; 単語最終文字のアドレス - 先頭アドレス
        ST    GR5,1,GR2       ; 単語の長さを格納
        ST    GR3,2,GR2       ; 単語の種別を格納
        LD    GR3,=-1         ; 単語種別を初期化（処理中状態を解除）
        LAD   GR2,3,GR2       ; 次の単語のアドレスを取得
FIN2    RET
        END
```
 
出力結果

```
GR1,文字,ASCII
1007,△,20,
1008,△,20,
1009,T,54
100A,H,48
100B,I,49
100C,S,53
100D,△,20
100E,1,31
100F,2,32
1010,3,33
1011,4,34
1012,△,20
1013,△,20
1014,9,39
1015,9,39
1016,#,23
1017,A,41
1018,B,42
1019,*,2A
101A,△,20
101B,.,2E

GR2
アドレス,(単語先頭アドレス,長さ,種類)
101C,1009
101D,4
101E,1
101F,100E
1020,4
1021,0
1022,1014
1023,6
1024,1
1025,FFFF
```
EC2から内部に立てたリバースプロキシを通って外のAPIにアクセスする方法

# 用件
- 他社のAPIを叩く時にIP制限をかけられる事がままあるので、固定IPにしたい
- EC2にはEIPという固定IPが存在するが、WEBサーバーの特性上サーバーの台数が不変ではないため、EIPを先方のファイアウォールに設定するのは好ましくはない
- WEBサーバー全台にEIPを付けていたらきりがない
- AWSにはNATインスタンスが用意されているが、全てのトラフィックをそこに向けるのは冗長性を壊す事になるし、トラフィックのボトルネックにもなりうる
- トラフィックを受けながらNATインスタンスに切り替えるのが結構大変
- 特定のドメインへのアクセスだけ、特定のサーバーを通る様な仕組みにしたい

# どうするか
内部にリバースプロキシを立てて、特定のドメインは一度そのリバプロを通過するようにする。
その為に、最初はリバプロを向いているlocalドメインにアクセスし、publicドメインにリダイレクトするように設定する。

# 構成
## 図
![Untitled (2).png](https://qiita-image-store.s3.amazonaws.com/0/62421/90644277-0782-a715-a447-68e8de0b497e.png "Untitled (2).png")

## API名
本来アクセスしたいAPIのドメインを api.example.com
Proxyに向いているドメインを api.example.local
とする

## 各要素
### WEB Servers
各WEBサーバーは、api.example.localにアクセスする
### Reverse Proxy
api.example.localにきたアクセスを、api.example.comに変更する。
nginxの場合は以下のような設定になる。

```
server {
  listen 80;
  server_name api.example.local;
  location / {
    proxy_pass http://api.example.com;
  }
}
```
proxy_set_headerはセットしないように注意。

### DNS
.local系のドメインはinternalなDNSがあればそこに設定しても良いし(Route53なら作成可能)、/etc/hostsに書いておいても良い。

# まとめ
という事で結構簡単に完成。
リバースプロキシは、internal ELBを使って2台以上にしておくと吉。
【iOS9】【要注意】Photosフレームワークで保存したファイル名

今まで開発したPhotosフレームワークを使ったアプリがiOS8とiOS9で違う挙動になってしまうことがありました。普段の使い方で問題ないと思いますが、念のため共有しときます。

まず、iOS9からPhotosフレームワークにPHAssetResourceCreationOptionsというクラスを追加されました。このクラスを使ってPHAssetを作成する時いくつの属性を指定することができます。その内の一つoriginalFilenameというプロパティは以下のように書いてあります。

> Declaration

> @property(nonatomic, copy) NSString *originalFilename

> Discussion

> You can use this property to track the original name of the file from which you import an asset resource even if you use the addResourceWithType:data:options: method to create a resource from data instead of from a file. After creating the asset, this information is available in the originalFilename property of the corresponding PHAssetResource object.

> If you do not specify a value for this property and are using the addResourceWithType:fileURL:options: method to create a resource, Photos infers the filename from that method’s fileURL parameter. Otherwise, Photos automatically generates a filename.

https://developer.apple.com/library/ios/documentation/Photos/Reference/PHAssetResourceCreationOptions_Class/index.html#//apple_ref/occ/instp/PHAssetResourceCreationOptions/originalFilename

ディスカッションに書いた通り、画像を(iOSの)写真アプリに保存する(PHAssetを新規作成)場合、iOS8とiOS9の動きが違います。
新しい画像を保存する時、
- iOS8の場合：Photosフレームワークが元の画像ファイル名を管理しない、写真アプリ内に保存できた画像は全てiOSが発行した名前になります。保存後の画像ファイル名の例：IMG_xxxx.JPG
- iOS9の場合：Photosフレームワークが指定された元ファイル名（指定してない場合は渡したファイル名)を保存しています。ただし、この時点写真アプリ内に保存できた画像のファイル名はiOS8と変わらない、つまり、写真アプリ内もIMG_xxxx.JPGの形式で保存してます。

ここまでは内部的に違いがありますが、外部への影響はほとんどありません。
この時写真アプリ内に保存している画像は
- iOS8：画像名＝物理ファイル名＝IMG_xxxx.JPG
- iOS9：画像名＝originalFilename、物理ファイル名=IMG_xxxx.JPG

iPhoneをPCに繋いて写真アプリにPhotosフレームワーク経由で保存した画像ファイルをエクスポートする時、上記の結果によりエクスポートしてきたファイルの名前がiOS8とiOS9で違いが出ます。
その理由の一つ：iPhoneがPCと繋ぐ時カメラとして扱うため、エクスポートしたファイル名はすべてDCF規格に順守しなければいけません。
結果としては
- iOS8:エクスポートした画像のファイル名：IMG_xxxx.JPG
- iOS9:元ファイル名がDCF形式の場合は元ファイル名、そうじゃないファイル名の場合<strong>iOSが勝手にリネームしてランダムな名前でエクスポートしてしまいます。</strong>

例：
ネットからダウンロードしたsample.jpgをPhotosフレームワーク経由で写真アプリに保存した後、PCにエクスポートすると、iOS8ではIMG_1235.JPGでPCに保存、iOS9だとSRYDGZE1.JPGになってしまいます。

下記いずれの方法で上記問題を回避できます：
1.Photosフレームワークを使って保存する場合、PHAssetCreationRequestクラスのaddResourceWithType:fileURL:options:メソッドの代わりにaddResourceWithType:data:options:を使いましょう。この時、PHAssetResourceCreationOptionsのoriginFilenameを指定しない。
2.元のファイル名をDCF形式にしましょう。
Realm の通知を RxSwift の Observable に包み込む


Realm のクエリ結果が変化するたびに RxSwift のストリームに結果が流れる処理を考えてみました。
Realm の通知トークンが購読中は強参照になるのが肝です。

```swift
realm.objects(Dog).filter("age > 3").rx_response()
    .subscribeNext { /* UI の更新処理 */ }
    .addDisposableTo(disposeBag)
```

## 実装

RxCocoa/UIControl+Rx.swift を参考

```swift
import RxSwift
import RealmSwift

extension Results {
    
    public func rx_response() -> Observable<Results<Element>> {
        return Observable.create { observer in
            
            MainScheduler.ensureExecutingOnScheduler()
            
            let token = self.addNotificationBlock { results, error in
                
                if let error = error {
                    observer.onError(error)
                } else {
                    observer.onNext(results!)
                }
            }
            
            return AnonymousDisposable {
                token.stop()
            }
        }
    }
}

```
意外と知らない、手順書に貼り付ける画像加工ツール"Monosnap"のすすめ

## 手順書なんかに貼り付けたい画像をつくるのに便利なMonosnap

![image](https://qiita-image-store.s3.amazonaws.com/0/31015/09edaf47-c78e-7221-8c6b-cf22882bc9a5.png)
[monosnap](https://itunes.apple.com/jp/app/monosnap/id540348655?mt=12)

↑からダウンロード、無料で使えるよ

## 使い方

![image](https://qiita-image-store.s3.amazonaws.com/0/31015/130516d9-de09-7a67-0bb3-86e9b142f5e4.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/31015/ead6581a-20a3-2b30-cbcf-892e1fc3e6e0.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/31015/78b5acb3-a46f-1b94-0cc2-c5056d35711a.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/31015/4659a51c-6749-c389-f71c-a1d93a558670.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/31015/7c1a053b-6ec5-829f-5d59-75b5c7e7fe35.png)


スクリーンショットしかはってないけど、わかりやすいね！！

## おまけ
作業用に常に全面に出てくる、一部分の画面キャプチャウィンドウがあるとすごい作業がはかどる。
![image](https://qiita-image-store.s3.amazonaws.com/0/31015/e51a9fab-59e6-2627-156a-bd423f66a7ff.png)

[Kiritori](https://itunes.apple.com/jp/app/kiritori/id585126594?mt=12)がおすすめ
![image](https://qiita-image-store.s3.amazonaws.com/0/31015/901d051d-5f6c-7b3c-f1ca-54b76b291851.png)
JS初心者がCanvasを使っていたらぶち当たった壁

JS初心者が実際にコードを書いていく上でつまづいてしまい、無為に数時間を過ごしてしまった悲しい過去を無駄にしないためにいろいろ書いていこうと思います。
#設定した色が反映されない（全く関係ないところに色がついてしまう）
例えば


```js
            var canvas = document.getElementById("canvas");
            var ctx = canvas.getContext('2d');

            function ballView(){
            ctx.beginPath();
            ctx.fillStyle =  'rgba(255,255,0,1)';
            ctx.arc(bx,by,10,0,2*Math.PI,true);
            ctx.fill();
        }
```


こういうコード
皆さんはどういう意味だかわかるでしょうか？
少し調べれば円を描画するだけの関数を定義しているコードだとわかるのですが、
こうなるとどうでしょうか？

```js
            var canvas = document.getElementById("canvas");
            var ctx = canvas.getContext('2d');

            function ballView(){
            ctx.beginPath();
            ctx.arc(bx,by,10,0,2*Math.PI,true);
            ctx.fillStyle =  'rgba(255,255,0,1)';
            ctx.fill();
        }
```

どこが変わったかお気づきでしょうか？
記述されている内容に大きな変化はありません。変わったのは**記述の順番**です。
こう書いても円は表示されます。
なので、一見記述は正しいように思えます。しかし、一行一行意味を紐解いていくと間違いに気づきます。

```js
            ctx.arc(bx,by,10,0,2*Math.PI,true);
```

この記述で円を書いた後に

```js
            ctx.fillStyle =  'rgba(255,255,0,1)';
```

この記述で色を指定しても基本適用されません。
もうすでに書いてしまった後だからです。

canvasはアニメーションなどでよく使われるため、様々な色を定義している事も多いと思います。そのような時、思った通りの色が適用されない時は記述の順番にも注意してみてください。

#clearRectが反映されない
canvasでアニメーションを動かしたい時に以下のように書く事があるかと思います。


```js
        var canvas = document.getElementById("canvas");
        var ctx = canvas.getContext('2d');

        ctx.fillStyle="#329AE0";
        var y = 10;
        function loop() {
        ctx.clearRect(0,0,canvas.width,canvas.height);
        y++;
        ctx.arc(200,y,20,0,Math.PI*2,true);
        ctx.fill();
        setTimeout(loop,10);
        }           
        loop();
```

丸い円の描画を上から下に移動させるコードですが、これを実際に動かしてみると・・・


**縦に図太い線が引かれる**


![canvas-1.png](https://qiita-image-store.s3.amazonaws.com/0/119012/e61b3276-9ff7-e8cd-cc11-5da0da5fad52.png)

これはわかりやすいようにctx.stroke();で書かれたものですが、ctx.fill();で書くと図太い線が引かれます。

ちなみにどうすれば解決するかというと

```js
    function loop() {
        ctx.clearRect(0,0,canvas.width,canvas.height);
        ctx.beginPath();//これが必要！！！!!!
        y++;
        ctx.arc(200,y,20,0,Math.PI*2,true);
        ctx.stroke();
        
    setTimeout(loop,10);
    }           
      loop();
```

超初歩的な事かもしれませんが、これで数時間悩みました・・・


・・・が、私が現在プログラミングを勉強中の某アカデミーでの次回の課題がお絵かきアプリでした。なので、思わぬバグで次回の課題の勉強になってしまった(@0@)

バグもなかなか侮れません

プログラムは正直者です。記述した通りに必ず動く。しかし、人間のように察して動作してくれることはありません。

だからこそ厄介だったりもするのですが、だからこそ面白くもある、と最近思えるようになってきたかなぁ、と思います。

皆様も良きプログラミングライフを！！
Packerでiam_instance_profileを利用する場合に必要となる権限

Packer で iam_instance_profile で利用する場合に、IAMInstanceProfile 関連の操作が必要になるので、
事前に Packer で利用するインスタンス作成のユーザに書きのポリシーを適用しておく必要がある。

でないと下記のように、インスタンス作成エラーが発生します。
```
==> amazon-ebs: Launching a source AWS instance...
==> amazon-ebs: Error launching source instance: UnauthorizedOperation: You are not authorized to perform this operation. Encoded authorization failure message:
```

厳密には下記の Resource すべては必要ないですが、、。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1453626845000",
            "Effect": "Allow",
            "Action": [
                "iam:PassRole"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
```
メモ：Home Assistant + Raspberry Pi + センサー でホームオートメーションしたい #2

# 前回までのあらすじ

http://qiita.com/spicemanjp/items/59032bad6c93c5ac28ab

# 注意：その制御は安全か？

ホームオートメーションを行う際には、遠隔制御／自動制御するもの・することの安全性に注意したい。2012年にパナソニックがスマホで宅外から操作できるエアコンの販売を一時断念したり、2015年にCerevoが「サービスコンセント付き調光器」として開発した製品の国内販売を断念したことは記憶に新しい。

その後、問題が解決され発売を開始したパナソニックにおいても「[『パナソニック スマートアプリ』ご利用時のお願い](http://panasonic.jp/aircon/attention/)」という専用ページを設けて、使用上の注意を促しているので、参考にしたい。

また言うまでもないが、ネットワークのセキュリティにも気を付けておきたい。

# 設定(続き)

## アイコンや表示名称のカスタマイズ

https://home-assistant.io/getting-started/devices/

デフォルトで各バッジ表示には数値が、各カード表示には目のアイコンが表示されるようになっているが、画像ファイルを指定しカスタマイズすることができる。
ファイル名はローカルパス、URLが指定でき、アイコンについては[materialdesignicons.com](https://materialdesignicons.com/)の画像名を指定することもできる。(mdi:XXXXX)
表示名称の変更も可能。(friendly_name:)

```
homeassistant:
  (省略)
  customize:
    sensor.bme280_humidity:
      icon: mdi:water-percent
```

# IFTTTコンポーネントと、オートメーションの設定

https://home-assistant.io/components/ifttt/

IFTTTコンポーネントはイベントの送受信両方をサポートしているようだ。今回は送信のみを確認する。あらかじめIFTTTにMaker Channelを使用したレシピを作成しておくこと。今回は[以前から使っている、PushBulletに回すレシピ](http://qiita.com/spicemanjp/items/131531d09a4fb2874f20)をそのまま使用する。

IFTTTコンポーネントを有効にするには、まずAPI keyを設定する。

```
ifttt:
  key: [省略]
```

設定を有効化するためHome Assistantを再起動。

確認のため制御用Webページのサイドバーメニュー下方にある"Developer Tools"のうち一番左側、"Call Service"機能を使ってIFTTTコンポーネントのサービスを呼び出す。

![ifttt_fire.png](https://qiita-image-store.s3.amazonaws.com/0/82738/e8c712f5-4c0a-fcb7-7f95-87fce2a86f04.png)

IFTTTのレシピが有効に働くことを確認する。

![ifttt_received.png](https://qiita-image-store.s3.amazonaws.com/0/82738/c57244c9-1d28-f64e-57a5-321af6c44646.png)

続いてオートメーションの設定を追加する。今回は7:00～23:59の時間の範囲で、室内湿度が規定値を上回った／下回ったとき、IFTTTに通知するような設定にする。

```
automation:
  - alias: Low humidity alart
    trigger:
      platform: numeric_state
      entity_id: sensor.bme280_humidity
      below: 25
    condition:
      platform: time
      after: '07:00:00'
      before: '23:59:59'
    action:
      service: ifttt.trigger
      data: {"event": "raspberrypi", "value1": "室内湿度が25%以下です" }

  - alias: High humidity alart
    trigger:
      platform: numeric_state
      entity_id: sensor.bme280_humidity
      above: 70
    condition:
      platform: time
      after: '07:00:00'
      before: '23:59:59'
    action:
      service: ifttt.trigger
      data: {"event": "raspberrypi", "value1": "室内湿度が70%以上です" }
```

さすがに湿度はすぐには変化させられないので、これも"Developer Tools"のうち左側から二番目、"Set State"機能を使って目的の湿度センサの取得値が規定値以上になったようなイベントを発行し、オートメーションが動作するのを確認することにする。

![set_state.png](https://qiita-image-store.s3.amazonaws.com/0/82738/fcc2335d-6ba2-d714-c1d1-8894740ef69d.png)

オートメーション設定が有効に働くことを確認する。

![set_state_ifttt.png](https://qiita-image-store.s3.amazonaws.com/0/82738/661e63b1-1b35-f34d-eff6-ac61c93a5077.png)
AD2 > 時定数の測定 > 1tau | 5tau

```txt:ツール
Analog Discovery 2(以下 AD2)
```

参照 トランジスタ技術 SPECIAL for フレッシャーズ No. 104 > OPアンプIC活用ノート

5年前に購入したムックを再読中。
その中で時定数のことが載っていた。

4-3 信号を発生する回路とそのしくみの図11

抵抗をシリーズに入れて、コンデンサでGNDに落とす。
その時にRとCから電圧の変化が決まる。

## 抵抗とコンデンサ

- R: 10k
- C: 103 (0.01uF)

τ　= (10 x 10^3) * (0.01 x 10^(-6)) = 0.1ms

- 1τの時間で電圧は63.2%になる
- 5τの時間で電圧は99.3%になる

https://de.wikipedia.org/wiki/Zeitkonstante
(English の Wikipedia には具体的な数値はなく、検索で上記ドイツ語の方が見つかった)
数式のtに1tau, 5tauをいれて計算してもいい。

## AD2の利用

- WaveGenを矩形波生成に利用
  - 振幅2V, 2Hz
- Scope1をVin（矩形波）測定に利用
- Scope2をVout測定に利用


## 測定結果

### 1tau

2V　* 0.632 = 1.264V
縦軸は-1Vからなので、260mVあたりの時間を見た。
X2⊿1は 120.48us = 0.120 ms
計算値と多少ずれが出ている。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/9daa5979-a961-6f6f-10a4-35f7ca3b0d32.png)

### 5tau

2V * 0.993 = 1.986V
縦軸は-1Vからなので、986mVあたり。
下の図で978.3mVのところが　X2⊿1は 760.28us
5tauの時間よりも長い。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/46b62aec-4854-cd03-7519-1b3a0b7084ff.png)

抵抗値の誤差やコンデンサ容量の誤差はきちんと考慮していない。


### 500Hzの矩形波入力

Vinの矩形波を500Hzにしてみた。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/d4c9e385-8b5a-7019-bdf6-1f4298340676.png)
Scala で数値を3桁区切りにする

PHP には `number_format` っていう超便利関数があって、数値を渡すと3桁区切りにしてくれる。

```php
$x = 1234567890;
number_format($x);
// 1,234,567,890
```

Scala で同じようなことがしたいとき `scala number_format` とかでググると以下のような例がたくさん出てくる。

```scala
val x = 1234567890
x.toString.reverse.sliding(3, 3).map(_.reverse).toSeq.reverse.mkString(",")
```

Scala っぽいコードで一瞬「スゲー！」って思いがちなんだけど Scala は Java の資産をそのまま使えるので実は下記のコードで実現できる。

```scala
val x = 1234567890
java.text.NumberFormat.getIntegerInstance.format(x)
```

## 追記
……とかドヤ顔で書いてたら、投稿の数分後にコメントでもっとシンプルな方法を教えていただいた。

```scala
val x = 1234567890

// コメントで教えてもらった方法
f"$x%,3d"

// Java っぽく書くと...
String.format("%,3d", x)

// Scala 2.9 までなら...
"%,3d".format(x)
```

Java の `String.format(...)` だけで3桁区切りできることを初めて知った（恥）。
既存のRailsクソコードの品質を機械的に上げていく(Github、Rubocop、SideCi)

なにごとも少しずつ、最初から完璧にやろとうしないのがコツだと思う。

## やりたいこと
Github、Rubocop、[SideCi](https://www.sideci.com/ja)を使って既存のプロダクトの糞コードを屠る

## 手順

```bash:console
#rubocopをインストールし、.rubocop_todo.ymlを作成する
$ gem install rubocop
$ rubocop --auto-gen-config
$ echo 'inherit_from: .rubocop_todo.yml' >> .rubocop.yml
```
下準備OK

ここでの状態、既存の糞コードを含めて正しい状態として、

```bash:console
$ rubocop
```
とした時にチェック結果が０になる。

`.rubocop_todo.yml`とはすなはちTODOリストになっています。

中身をみるとこんな感じ

```yml:.rubocop_todo.yml
# Offense count: 95
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles.
# SupportedStyles: with_first_parameter, with_fixed_indentation
Style/AlignParameters:
  Enabled: false
```
既存のコードで引っか掛かるチェック項目を`false`にしている。

つまり、**このTODOリストをtrue**にして一つづつこなしていこうというものです。
以下クソコード撲滅ワークフロー
## キュクレイン撲滅ワークフロー([ノムリッシュ翻訳Lv４](http://racing-lagoon.info/nomu/translate.php)）

#### 2019/06/04 追記
↓こちらの記事で自動化できるようです(神)
[まだ .rubocop_todo.yml で消耗してるの？ - Feedforce Developer Blog](https://developer.feedforce.jp/entry/2018/12/05/140000)



1. `.rubocop_todo.yml`から一つチョイス(チームでその規約が必要かどうかはGitHubのIssueなどで議論)
2. `rubocop -a --only Style/Hogehoge`(HogeHogeは1で選んだ規約)、沢山変更がある場合は３０〜４０ファイルぐらいをコミットして、PullRequest出してマージを、毎日少しずつ行う。(-aオプションは自動で直してくるrubocopの機能)
3. `2.`で行った規約一つが片付いたら、`.rubocop_todo.yml`から`.rubocop.yml`へ移して、`true`にして、本体にマージする。
4. [SideCi](https://www.sideci.com/ja)に登録してリポジトリを登録しておく
5. `4.`を行うことによりPullRequestに対して、指摘（Githubコメント）をしてくれる様になり、よっぽど人格がネジ曲がったひとがいないかぎり、修正してくれるでしょう。（そのPullReauestのブランチに対して、自動修正のPullRequestを作ってくれる機能もあります。）
![image](https://qiita-image-store.s3.amazonaws.com/0/31015/1e6d017a-f220-596f-e7f3-b32a733b1584.png)

6. あとは`.rubocop_todo.yml`がなくなるまで、`1.~3.`を繰り返すだけで、少しずつ、少しずつコードが綺麗になります。

※注意点追記
- `2.`で行う時は`.rubocop_todo.yml`,`.rubocop.yml`で実行される状態にしておかないとできないっぽい
- rubocopの`-a`optionが効くには（自動で修正してくれる）、規約が対応している必要がある
>`.rubocop_todo.yml`に`# Cop supports --auto-correct.`と書いてあれば大丈夫
 書いてなければ、規約自体をONにして新しく違反が増えないようにしつつ、ちょくちょく既存のコードを手動で直す必要がある（涙)



## まとめ
- 現状上記のフローで徐々にコードを綺麗にできていっています。
- こつ
    - １回１回の作業にちゃんと意味があるので、気長にすこしずつやることに意味があるかなと思います。
    - `SideCi`が可視化してくれるので、品質が保たれるし、何より指摘が**普通に勉強**になります。
- [SideCi](https://www.sideci.com/ja)は無料で使い始められるようです。そんなに高くないので会社に相談してみましょう。

## 参考URL
[はちびる日記:Rubocopでコーディングルールを変更する](https://nmbr8.com/blog/2014/08/11/generate-configuration-of-rubocop-automatically/)
Spring Bootの設定あれこれ

#Spring Bootの設定あれこれメモ

Spring Bootでアプリケーションを組んで本番運用することになった時の設定等々を忘れないように簡単にメモしておく。

##構成
- OpenJDK 1.8
- Spring Boot 1.3.3 (Embedded Tomcat8)
- MySQL 5.6

ビルドツール
Gradle

アプリケーションサーバー
Amazon EC2(Amazon Linux AMI)

#ServiceでSpring Bootを起動
従来通り
`java -jar application_name.jar`
でアプリケーションを起動しようと考えていたが、Spring Boot 1.3からどうやらServiceで起動できるような機能が実装されたようだったので、それを使用する形で対応してみた。

詳細はこちら
https://docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.html#deployment-service

対応したこと

1.build.gradle設定変更

    bootRepackage {
        executable = true
    }

を追加
※これはもしかしたら無くても良いかも。
無くても問題なく起動できるか検証してないです・・・。

2.gradle bootRepackageでjar作成

3.アプリケーションを実行するサーバーにjarをアップロードしてシンボリックリンクを作成
公式ドキュメント通りだが、jarにしたSpringBootアプリケーションをアプリケーションサーバーの何処かにアップ
例)`/var/app/something.jar`

/etc/init.d/にシンボリックリンクを作成
`ln -s /var/app/something.jar /etc/init.d/something`
※実行権限とかその辺の設定をきちんとしないと当然ですが起動できないので注意

4.以下のコマンドだけでアプリケーションの起動、停止が可能に
起動
`/etc/init.d/something start`
停止
`/etc/init.d/something stop`

おまけ
起動時にjvmのパラメータを付けたり、ログファイルの出力先を変更したいなどオプションを付与してアプリケーションを起動させたい場合
jarを配置した場所に
jar名.conf(something.conf)
を用意することで起動時に自動で読み込んでくれる。

```text
例)
LOG_FOLDER=/var/log/xxxx/
JAVA_OPTS="-Xms512m"
```

#Spring Boot + MySQLで接続が切れる

アプリケーションは動いているがデータを検索できないとの報告がありログを調べたところ、以下のようなメッセージが出ていた。

```text
Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.
```

どうやら、MySQLで動かしている場合、一定時間アクセスがないと自動でコネクションを切断してしまうらしい。

対応したこと

ちょっと調べて見たところ、既に似たような事象の情報があり、基本的にはそこでの解決策で対応
参考情報
http://yyhayashi303.hatenablog.com/entry/20120911/1347322683
http://stackoverflow.com/questions/22684807/spring-boot-jpa-configuring-auto-reconnect

少し変えたのは
`spring.datasource.time-between-eviction-runs-millis=xxxxxx`
以外に
`spring.datasource.min-evictable-idle-time-millis=xxxx`
をパラメータとして追加

これで、min-evictable-idle-time-millis以上アイドルになっているコネクションを対象にtime-between-eviction-runs-millisごとに監視を実行するようになる。

#Spring BootにElastic Cacaheを組み込む

Session情報をElastic Cache(memcached)に永続化する際、プロパティで上手くセットをする方法がなかったので、この部分だけはJavaConfigurationで対応

対応したこと

これも調べて見たところ、同様の情報があり、そのまま対応
http://stackoverflow.com/questions/25788969/memcached-with-spring-boot
本当にStack Over Flow様々

1.Elastic Cacheを使うアプリケーションのbuild.gradleにmemcached管理用のjarを追加
https://github.com/magro/memcached-session-manager

- memcached-session-manager
- memcached-session-manager-tc8(Embedded Tomcat8で動いているので)

2.Memcachedを管理できるようにJava Configurationを追加

    @Bean
    public EmbeddedServletContainerFactory tomcat() {
        return new TomcatEmbeddedServletContainerFactory() {
            @Override
            protected void postProcessContext(Context context) {
                MemcachedBackupSessionManager manager = new MemcachedBackupSessionManager();
                manager.setMemcachedNodes("Elastic Cache Endpoint");
                manager.setRequestUriIgnorePattern(".*\\.(ico|png|gif|jpg|css|js)$");
                context.setManager(manager);
            }
        };
    }