OmniAICreator/Qiita-1.07M huggingface dataset:
Rubyからc言語の関数に構造体を渡す

最近Rubyからdllとかsoとか、割と簡単(？)に呼び出せることを知りました。
自分のやったことを整理しています。

C側(呼び出す対象->よくわかっていない)

```cpp:sample.cpp
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

//社員の給与
typedef struct salary {
	long amount;
	long family;
	long bonus;
} SAL;

// 社員構造体
typedef struct employee {
	long no;
	char name[20];
	int service;
	SAL salary;
} EMP;

int main(void)
{
	struct employee e[20]= {
		{ 1, "将来　有望",5, 201234, 10000, 350123 },
		{ 0, "", 0, 0, 0,0 },
	};
	struct employee *emp;
	int i;
	
	emp = e;
	
	for(i = 0; emp->no != 0; i++) {
		printf("%s total = %ld\n", 
			emp->name,
			emp->salary.amount + emp->salary.family);
		emp++;
	}
	
	return 0;
}

extern "C" int call(EMP *a,EMP *b){
	
	printf("a-size : %lu\n",sizeof(*a));
	printf("b-size : %lu\n",sizeof(*b));
	
	//渡された名前をかくにん
	printf("%s\n",a->name);
	
	EMP *c;
	//構造体配列
	c = (EMP *)malloc(sizeof(EMP) * 5);
	c = b;
	//rubyから渡した値をコピー
	c[0].no = a->no;
	strcpy(c[0].name,a->name);
	c[0].salary.amount = a->salary.amount;
	c[1].no = 77777;
	strcpy(c[1].name,"薄給　涙");
	c[1].salary.amount = 170077;
	
	//値の変更
	strcpy(a->name,"test_name_moded");

	
	return 1;
}
```

ビルド（MACで実行した）
`gcc -shared sample.cpp -o lib_sample.so`

```ruby:call_.rb
require "fiddle/import"

module M
  extend Fiddle::Importer
  dlload "./lib_sample.so"
  extern "int main()"
  extern "int call(void *,void *)"
  #構造体の入れ子はバラすのがポイント（と聞いた）
  EMP = struct(["long a","char b[20]","int c","long x","long y","long z",])  
end
x = M::EMP.malloc
y = Fiddle::Pointer.malloc(M::EMP.size * 5)

x.a = 1
x.b = "test name".unpack("c*") + [0] * (20 - 4)
x.c = 1
x.x = 100000
M.call(x,y)
p "x:"
p x.b.pack("c*").force_encoding("utf-8")
p "x[0] = a:#{x.a},b:#{x.b.pack("c*")},x:#{x.x}"
y_ret = M::EMP.new(y)
p "y[0] = a:#{y_ret.a},b:#{y_ret.b.pack("c*")},x:#{y_ret.x}"
#ポインタずらし
yp = y + M::EMP.size
y_ret2 = M::EMP.new(yp)
p "y[1] = a:#{y_ret2.a},b:#{y_ret2.b.pack("c*").force_encoding("utf-8")},x:#{y_ret2.x}"
```

``` 実行結果.
"x[0] = a:1,b:test_name_moded\u0000\u0000\u0000\u0000\u0000,x:100000"
"y[0] = a:1,b:test name\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000,x:100000"
"y[1] = a:77777,b:薄給　涙\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000,x:170077"
```

あまりわかってない感が満載でした。以上。
備忘録：Android StudioによるApk作成とインストール

先日，kindle fireの方でapkによるインストール方法を見つけたのでメモ
(既にご存知の方もいると思いますが)

参考：http://androidstudio.hatenablog.com/entry/2014/07/26/154043

1. Android Studio(以下AS)の画面でBuild -> Generate Signed APK Wizard
2. Key Storeを選択(新規作成する場合はCreate new...)
3. Pasword入力
4. AliasとPasswordを入力
5. Master Passwordを入力
6. ReleaseやDebugを選択し，完了

あとは，apkファイル(パスはProject Folder/app/*.apkだと思います)をkindleメールかcloudなどに送信
タブレットの方でファイルをタップすればインストールできます

#APK(APplication pacKage)
android用のソフトウェアパッケージ．UbuntuやDebianなどの.deb，Windowsの.msiファイルに相当する
以下，Wikipediaより

>application package (APK)（アプリケーション パッケージ ）とは、Googleによって開発されたAndroid専用ソフトウェアパッケージのファイルフォーマットである。
APKファイルは、UbuntuやDebian、Windowsなどのオペレーティングシステムで使われるDEBファイルや、Windowsのインストーラーで使われるMSIファイルと特徴が似ている。 APKファイルを作成するには、Android用に作成したプログラムをコンパイルして、その全てを一つのパッケージに統合させる。主にプログラムリソース、デジタル証明書、マニフェストファイルなどが挙げられる。その他のファイル形式と同様に、拡張子が「.apk」ならば、名前を自由に付ける事ができる。
APKファイルは、JARファイルをベースとしたZIP形式で、アーカイブファイルの一種である。
(Ref:https://ja.wikipedia.org/wiki/APK_(%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%BD%A2%E5%BC%8F))

#Key Store
ディジタル署名と暗号?鍵をセットにしたファイル
(バイナリエディタで中身を確認できます)
Intero for Emacs

ghc-mod を使うのを諦めてもうだいぶ長いのだけど、代わりに [intero](http://commercialhaskell.github.io/intero/) なるものを見つけた。Emacs専用なのだけど、MacOS上のstackでbuildできるプロジェクトを開発するのであればもうこれだけで十分なんじゃないかってくらい便利。

インストールは [interoのインストール手順](http://commercialhaskell.github.io/intero/) に従って `init.el` などに記述をするだけで、stackで管理されている`.hs`ファイルをemacsで開くだけで、elispのインストールから`intero`コマンドのビルドまで全部自動でやってくれる。今まで開発環境の構築に苦しんだ時間は何だったんだって感じ。flycheckは普通に動くし、コードジャンプも型の表示もなんの苦労もなく使えた。(あ、補完試してないや)

余談だが、Windows上でも使えるはずだが、自分の環境では厳しかった(動かしたけど)。自分の環境は、MSYS2 と https://github.com/chuntaro/NTEmacs64 を突っ込んで、それを mintty 上から呼んでる感じ。苦しかったのは以下の2行で、まあごまかしたら動いた。

* https://github.com/commercialhaskell/intero/blob/e7723039044867101ec80d2b5cdf26560e30b536/elisp/intero.el#L375
    * `intero`から出力がShiftJISで受けてるために`unibyte`や`nonascii`の正規表現にかからず。そもそもShiftJISで受けてるのがおかしい
* https://github.com/commercialhaskell/intero/blob/e7723039044867101ec80d2b5cdf26560e30b536/elisp/intero.el#L395
    * バッファ名とファイル名が一致するかチェックしてるのだけど、 `/` と `\` の違いやドライブレターの違いでうまく機能しなかった。`intero-canonicalize-path`で解決しようとはしてるけど、こちらの環境では効果ないぽい

さらに余談だが、winのghc付属のMSYS2では [HDBC-sqlite3](https://hackage.haskell.org/package/HDBC-sqlite3) が入らなかったので、 [`--skip-msys`で自前のMINGW64使ってビルド](http://qiita.com/hiratara/items/bc81477a2f8a674ae930) させたりしてる。MINGW64の libsqlite.dll の名称の違いをghcが解決してくれないので、手でコピーしてPATHの通った部分にrenameして置いたりもしてる。ホストOSの`stack`でプロジェクトをビルドできないとinteroは使えないので、この辺は頑張るしかない。
Netbeansで書いたJavaコードをコマンドラインから実行

#Netbeansで書いたコードをコマンドラインで実行したい
いちいちマウスを用いてカチッと三角マーク押すのは単純だが、何度もデバッグする際は少々タイムロスしている気分になる
そこで、JavaをAntでビルドし、コマンド１つで実行できる状態を作ろうと思いました。

まずAntをインストールする

````console:ant_install
brew install ant
```

##antによるビルド

```console
ant
```

##実行

```console
java -jar "*****.jar"
```

なんかまとめることのものでもなかった
Servlet3.0のアップロードで、同時に送られてたパラメータを取得する方法

調べてみたら素直に実装できなかったので、メモとして残しておきます。

# ファイル＋パラメータを送信するアップロード要件はそれなりにある

かんたんに、以下のアップロードフォームがあった場合、サーブレット3.0からはサーブレットからアップロードファイルを取得できます。

```
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>upload</title>
</head>
<body>
  <form action="UploadServlet" enctype="multipart/form-data" method="post">
    <input type="file" name="target">
    <input type="text" name="param">
    <input type="submit">
  </form>
</body>
</html>
```

このHTMLに対して、受信するサーブレットはマルチパートを受け取れるよう、以下のようにしておけば、

```java
@WebServlet("/UploadServlet")
@MultipartConfig()
public class UploadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		Collection<Part> parts = request.getParts();

		parts.stream().forEach(part -> {
			log("name:" + part.getName());

			String contentType = part.getContentType();
```

こういう感じで、名前とファイルのコンテンツタイプが取れますので、コンテンツタイプを見て拒否なんかもできます。

が、同時に送られてきたパラメータ値は、以下の特徴があります。

* コンテンツタイプはnullとなる
* javax.servlet.http.Part に getName()はあるが、getValue() や getParameter() は **そもそもない**

ではどうするか → getInputStream() は使えるので、これを使って *Stringを生み出せば* 、パラメータ値は取れます。 

## Java8時代なので

割と雑な実装ですが、次のようにするとパラメータ値が取得できます。

```java
package sample.upload;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Collection;
import java.util.stream.Collectors;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

/**
 * Servlet implementation class UploadServlet
 */
@WebServlet("/UploadServlet")
@MultipartConfig()
public class UploadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		Collection<Part> parts = request.getParts();

		parts.stream().forEach(part -> {
			log("name:" + part.getName());

			String contentType = part.getContentType();
			log("contentType:" + contentType);
			if ( contentType == null) {
				try(InputStream inputStream = part.getInputStream()) {
					BufferedReader bufReader = new BufferedReader(new InputStreamReader(inputStream));
					log( bufReader.lines().collect(Collectors.joining()));

				} catch (IOException e) {
					throw new RuntimeException(e);
				}
			}
		});
	}

}
```

BufferedReaderに入れてしまって、特に文字コードも気にせず、lines()→collectors.joiningしてしまうあたりが雑ですね(´・ω・｀)
Perl とシェルスクリプトで逆になっていると思えるほど違う部分の理由を考える

Perl は C言語の文法を参考にしつつも、Bash シェルスクリプトで使われる sed や awk の置き換えも考慮したグルー言語でもあります。そういった複数の影響のためか、Perl とシェルスクリプトで似たような書き方なのに書き方が違うといった場合があります。

シェルスクリプトもシェルの数に応じた文法がありますが、ここでは Bash を取り上げます。

# 数値と文字、それぞれの比較演算子

* Perl の場合は数値比較が `==` で、文字比較が `eq`
* Bash の場合は数値比較が `-eq` で、文字比較が `=`

細かい違いはあるにしろ、数値比較と文字比較が事実上逆の演算子になっています。

```pl
if ( $i == 1 ) {
    print "i is one\n";
}
```

```bash
if [ $i -eq 1 ] ; then
    echo "i is one"
fi
```

Bash では `test` としても知られる `[...]` と、後に導入された `[[...]]` の違いはありますが、今回は古くからお馴染みの `[...]` を取り上げます。

Perl はシェルスクリプトの文法を参考にしているのではなかったのか…と一瞬混乱してしまいます。どうしてこうなったかの説明は色々あるかと思いますが、私は以下のように考えています。

* Perl の等号は C言語を参考にした。C言語は文字列というものよりも数値の扱いが基本的であり、それにならって数値が `==` の比較となった
* シェルスクリプトは文字列を受け取ることを主眼に置いたもの。`=` も文字列比較として自然に定義されるようになった。

むしろC言語は数値以外の比較演算子は無いと考えるべきでしょう。char型の１文字の比較もコードポイントの数値での比較ですし、char型へのポインタとして表現された文字列を比較するには `strcmp` といった関数の力を借りる必要があります。

# 真偽値の扱い

Perl における真偽値は若干複雑と言われますが、非常に大雑把に言えば数値の `0` や文字列の空文字列 `""` が偽で、後の多くは真として扱われます。Perl の真偽値の詳細については[別の記事](https://qiita.com/xtetsuji/items/e584b819d3cd1604a91f)で触れることにします。

Bash における真偽値とは終了コード（ステータスコード）であって、プログラミング言語としての真偽値とは若干趣が異なるともいえますが、 `if` と組み合わせて使われる `[...]` として知られる `test` コマンドや `true` `false` といった名前自体が真偽値を体現しているコマンドの終了コードは真偽値と受け取るのが自然でしょう。

* Perl の場合は数値の `0` が偽で、それ以外の数値は真
* Bash の場合は数値の `0` が真（正常終了）で、それ以外の数値（整数）は偽（異常終了でエラーコードとなっている）


```pl
#!/usr/bin/perl

use strict;
use warnings;

my $false_condition = 0;
my $true_condition = 1; # 2 でも 3 でも
if ( !$false_condition ) {
    print "false\n";
}
if ( $true_condition ) {
    print "true\n";
}
```

```bash
#!/bin/bash

function false_condition {
    return 1; # 2 でも 3 でも
}
function true_condition {
    return 0;
}

if ! false_condition ; then
    echo "false"
fi
if true_condtion ; then
    echo "true"
fi
```

Perl の真偽値は、C言語のそれを踏襲したものになっていることはすぐにわかります。Perlにおける真偽値の複雑さというのは、C言語にはない文字列（C言語のようなchar型へのポインタといったものではなくプリミティブなもの）やリストや未定義状態といったものに対するPerlの考えといったものが入ったからだと思えます。元々のC言語が真偽値型を導入せず整数型（int型）で真偽値型を代用した功罪をPerlも受け継いでいるといえるのではないでしょうか。

対して Bash の真偽値というのはエラーの有無であって、エラーがある＝偽＝処理を中断すべきものという意味付けをされているように見えるのは面白い特徴です。また、偽として評価されるコマンドの返り値の1以上の整数値はエラーコードとなっており、どういうエラーなのかを実行元に伝える役割も持ちます。正常終了の時の終了コードは0のみであり、正常な場合には多くを語らないというUNIXの哲学を体現しているようです。

ごく一部のコマンドでは、エラーとまでは言えない状況を伝えるために1以上の終了コードを使っている例があります。有名なものは `diff` コマンドで、終了コード 0 が差分なし、1 が差分あり、２ が比較できなかったエラーとなっています。差分ありの状況をエラーと解釈するのは多くの場合自然ではないので、終了コードを真偽値と解釈してコマンド連結をする `&&` や `||` といった演算子で繋ぐ場合や `set -e` (`set -o errexit`)といった設定でシェルスクリプトを書く場合には終了コードが1以上の場合でエラーとは言えない状況を独自にハンドリングする必要はあるでしょう。
Spring4を使ってみる。bootしてみる

## Springおじさんにならなくては
お仕事でSpringを使っていく風潮が出てきたので、設定とかアノテーションとかをさらっておこうと思います。先輩がよく言っているので、僕もbootしてみます。

## 前回まで

[viewを返すContorollerクラス作った](http://qiita.com/TatsuyaYamamoto/items/78cb8e3858f7e099ef22)

## 依存関係
boot用のライブラリが配布されるのでそちらをペタリ。view用のテンプレートとしてthymeleafをおすすめされているようなので、こちらもペタリ。

```build.gradle
compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '1.3.6.RELEASE'
compile group: 'org.springframework.boot', name: 'spring-boot-starter-thymeleaf', version: '1.3.6.RELEASE'
```


## プラグイン
SpringBoot用の便利なgradle[プラグインがある](http://docs.spring.io/spring-boot/docs/current/reference/html/build-tool-plugins-gradle-plugin.html)みたいだったので、ありがたく使わせて頂きます。

jar作って、java -jar hoge.jarする地味に面倒な作業がこれでサボれるぞ！

```build.gradle
buildscript {
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.3.6.RELEASE")
    }
    repositories {
        mavenCentral()
    }
}
apply plugin: 'spring-boot'
```

## メインクラス
```Application.java
@SpringBootApplication  // equivalent to using @Configuration, @EnableAutoConfiguration and @ComponentScan
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
```

- Application
    - warをtomcatさんに渡すのではなく、単一の実行ファイルを作るためmainメソッドを定義します。
    - mainメソッドがあるクラスの場所は特に設定しなくていいみたい。上述のspring-bootプラグインのお陰かな。
- @SpringBootApplication
    - SpringBoot使うならとりあえず貼っとけらしいアノテーション
    - @Configuration, @EnableAutoConfiguration, @ComponentScanを貼ったことと[同等のものらしい](http://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-using-springbootapplication-annotation.html)

- @EnableAutoConfiguration
    - SpringBootの基本設定等々をよしなにやってくれるらしい
    - 具体的な項目はまだ分からない、、、
- @ComponentScan
    - このクラス以下のパッケージから@Contorollerを探してくれるっぽい!


## とりあえず実行

```bash
$ gradle bootRun
```

![スクリーンショット 2016-07-15 0.36.25.png](https://qiita-image-store.s3.amazonaws.com/0/55826/6b479aa5-07cc-d5a0-c574-cea4338aa99d.png)

（・８・）おー！

## テンプレートファイル

```index.html
<html lang="jp" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8"/>
</head>
<body>
<h2>すぷりんぐぶーと！</h2>
<span th:text="${voice}"></span>（・８・）!
</body>
</html>
```

- index.html
    - thymeleaf(SpringBoot?)の場合、テンプレートファイルは/resources/templates以下に置いてくようです
- th:text="${voice}"
    - viewを返すControllerクラスのメソッドが扱うModelの変数はこの要素から取得する
    - ${}だけで取得できたJSPに比べるとちと面倒かな、、、
- thymeleaf
    - せっかくのテンプレートエンジンですが、まだよく知らない

## とりあえず実行

```bash
$ gradle bootRun
```

![スクリーンショット 2016-07-15 0.42.58.png](https://qiita-image-store.s3.amazonaws.com/0/55826/a1d98dbf-464b-2ef3-76e1-5efcd9842170.png)

やったー！（・８・）


## 少し困ったこと

- jacksonの依存関係をgradleに書いていると、内蔵tomcatが起動しない
    - spring-webmvcパッケージは大体のSpring以外の依存関係がoptionalで必要であれば各自解決をするというスタイルでしたが、spring-boot-starter-webはjacksonが最初から引っ張られて来るようです。
【備忘録】in_categoryの条件分岐【WordPress】

##記事がカテゴリーに属している場合の条件分岐
```<?php if(in_category()) : ?>
// カテゴリーに属した記事のときの処理を書く
<?php endif; ?>```
##記事が属するカテゴリーをカテゴリーIDで指定して条件分岐させる
```<?php if(in_category(9)) : ?>
// カテゴリーIDが9のカテゴリーに属した記事のときの処理を書く
<?php endif; ?>```
##記事が属するカテゴリーをカテゴリースラッグで指定して条件分岐させる
```<?php if(in_category('news')) : ?>
// カテゴリースラッグ"news" のカテゴリーに属した記事のときの処理を書く
<?php endif; ?>```
##「特定のカテゴリー以外」に属する記事という条件を指定して分岐させる
```<?php if(!in_category('blog')) : ?>
// カテゴリースラッグ"blog"以外のカテゴリーに属した記事のときの処理を書く
<?php enfif; ?>```
##記事が属するカテゴリーを複数のカテゴリーIDやスラッグで指定して条件分岐させる
```<?php if(in_category(array(9, 'news'))) : ?>
// カテゴリーIDが9、スラッグが"news"のいずれかのカテゴリーに属した記事のときの処理を書く
<?php enfif; ?>```
C++ のコードを Travis CI + Coveralls でカバレッジ生成する

先日 [Coveralls](https://coveralls.io/) というサービスを知りました。 public なリポジトリであれば、こいつが無料でカバレッジ可視化に使えて便利そうです。
本稿では C++ のコードに対するカバレッジの publish までの作業をつらつらと書いていきますが、 [ドキュメント](https://coveralls.zendesk.com/hc/en-us) を見る限り他のいくつかの言語にも対応していそうです。

自分は大体下記の手順で Travis CI による CI 対応&カバレッジ生成と、 Coveralls へのカバレッジの publish を行いました。

# 背景

* 本稿は拙作の趣味プロダクトである、 [Apache Traffic Server](http://trafficserver.apache.org/) プラグインである [ts_mruby](https://github.com/syucream/ts_mruby) を対象に作業した時の知見に基づいています
* googletest + googlemock を用いたテストコードを（まだ少量だけど... :smiley: ）書いてありました
* 本稿を見ずとも [README](https://github.com/eddyxu/cpp-coveralls) を見れば大体の流れがわかる気がします

# 1. まずカバレッジを gcov で出力できるようにする

Coveralls は [gcov](https://gcc.gnu.org/onlinedocs/gcc/Gcov.html) 形式のカバレッジファイルを要求するので、これを出力できるようにします。
コンパイル時のオプションに `-coverage` を付与するとカバレッジ収集のためのファイルが出力されるようになります。
その後テストを実行し、カバレッジを収集したい対象に絞って `*.gcov` ファイルを収集する運びになります。

ちなみに自分は常にカバレッジファイルの出力がされるようになるのを回避するため、 `configure.ac` に `-coverage` を付与するかどうかのオプションを持たせるようにしました

```
AC_MSG_CHECKING([coverage option])
# --enable-coverage フラグを生やす
AC_ARG_ENABLE([coverage],
              [AS_HELP_STRING([--enable-coverage],[generate coverage files])],
              [],
              [enable_coverage=no]
)
AC_MSG_RESULT([$enable_coverage])

# CXXFLAGS にオプション追加するか判別
if test "${enable_coverage}" = "yes"; then
  CXXFLAGS="$CXXFLAGS -coverage"
fi
```

# 2. Coveralls にリポジトリ登録

https://coveralls.io/ にアクセスし、 GitHub アカウントで sign up します。ログイン後、 "ADD REPOS" メニューより、カバレッジ収集対象のリポジトリを登録しておきます。

# 3. cpp_coveralls を導入する

Coveralls にサクッと `*.gcov` をアップロードするための便利コマンドを導入しておきます。 pip で導入可能です。

```
$ pip install cpp-coveralls
```

# 4. coveralls コマンドを試す

`*.gcov` 出力先やソースファイルの配置先ディレクトリの都合、 coveralls コマンドのオプションに配慮する必要が出てきます。
動作確認のための手間に配慮して、 Travis CI からではなく手元の環境で `--verbose` や `--dryrun` を付けて coveralls コマンドを実行してみると良いと思われます。
また実際に Coveralls に publish してみたい場合は、`-t <token>` 必要になります。

# 5. .travis.yml に coveralls コマンドに関する記述を付与する

README に従って `after_success:` で実行するのが良いと思われます。  cpp_coveralls の導入もお忘れなく！

# 6. イイカンジに Coveralls 上でカバレッジを確認する！

ここまで来ると Coveralls 上でカバレッジの確認が行えるようになると思われます。自分がやった例だと下記のような仕上がりになりました。
（うそ・・・私のカバレッジ、低すぎ！？？）

![image](https://qiita-image-store.s3.amazonaws.com/0/10888/0b2cbbcd-7a82-6aaf-7803-6174b5cff8e2.png)
https://coveralls.io/builds/7007837

また PullRequest Build も走ってくれるので、そちらで確認するようにしても良いかもです。

![image](https://qiita-image-store.s3.amazonaws.com/0/10888/84e9bff4-52fe-054a-8fe8-27432cde7af0.png)
Adobe XDを触ってみた


##はじめに
流行りのツールを使ってる感を出したい為、Adobe XDを触ってみました。
ちなみに今年から本格的に使い出したSketchもまだ使いこなしてないです。


##基本機能
Adobe XDは、UI作成のデザインモードとUI操作用のプロトタイプモードがあります。

<img width="600" src="https://qiita-image-store.s3.amazonaws.com/0/11290/7de57270-aa53-5354-cfed-7dae9ae3084b.png">


##基本操作
###アートボードの作成
まずはアートボードを作成する必要があります。
この機能はsketchとほとんど同じです。

<img src="https://qiita-image-store.s3.amazonaws.com/0/11290/d892a7f7-4c7f-2f70-ccdf-21d44d5abe10.png" width="600">

左のツールバーからアートボードツールを選択します。
ツールを選択すると、右のプロパティパネルにアートボードの候補が表示されるので選択します。
またはキャンバスをクリック&ドラックで作成します。


###アートボードにグリッドを表示

<img width="600" src="https://qiita-image-store.s3.amazonaws.com/0/11290/25fd6755-fa73-1157-99ae-f3b1a899f35a.png">

アートボードを選択後、プロパティパネルの **グリッド** にチェックを入れます。
グリッドの色、透明度、間隔は自由に設定できます。

###ベジェ曲線
XDでもPhotoshop や Illustrator同様ベジェ曲線が使えます。
Illustratorに慣れていると、操作が少し違うので違和感を少し感じるかもしれません。
個人的な感想になりますが、√より使いやすいです。
Sketchのパスはどうも使いづらいです。

アンカーポイントをダブルクリックすると、ハンドルが作成されます。

![a.gif](https://qiita-image-store.s3.amazonaws.com/0/11290/849f914e-d468-540e-99fa-1ac2564ba544.gif "a.gif")


###画面の拡大・縮小
バージョン0.5.6.7ではツールでの拡大縮小ができないようでした。近々追加されるようです。
現時点では、下記のショートカットで切り替えるのが一番楽そうでした。

| 機能 | キー |
|--------|--------|
|    全画面表示    |   cmd 0     |
|    100%表示    |   cmd 1     |
|    200%表示    |   cmd 2     |
|    拡大    |   cmd +  (何故か私の環境だとcmd shift +）  |
|    縮小    |   cmd -      |


###オブジェクトをロック
オブジェクトを選択して``cmd L``でロックすることができます。
ロックされたオブジェクトには南京錠アイコンが表示されます。

ロックされているオブジェクトを、選択して``cmd L``でロックを解除できます。

<img width="300" src="https://qiita-image-store.s3.amazonaws.com/0/11290/be51c591-3d17-c1d4-aec2-c6fd7476dba9.png">

###マスク
マスクは``Cmd shift M``です。解除は``Cmd shift G``(グループ解除)でできます。

![a.gif](https://qiita-image-store.s3.amazonaws.com/0/11290/e0f4eff7-8e23-2701-142c-c77a460d7e94.gif "a.gif")




##リピートグリッド

プロトタイプ作成時にダミーで、サムネイルなどを並べることがあります。
そんなときはリピートグリッドが便利です。

![a.gif](https://qiita-image-store.s3.amazonaws.com/0/11290/d7aaeec3-4db2-6918-a897-227acb061a35.gif "a.gif")


###手順
1. リピートさせたい要素を選択。
2. プロパティパネルから **グリッドの繰り返し** を選択。
3. 緑色のハンドルを移動させて、要素を複製します。


###便利ポイント
* 要素同士の間隔も、同時に調整することができます。
* 画像をドラック&ドロップすることで、サムネイルの画像を個別に変更できます。
* テキストファイルをドラック&ドロップすることで、テキストを個別に変更することができます。
* グリッドグループをダブルクリックすることで、書体の変更や、要素の追加など編集が可能です。

##プレビュー
XDでは作ったデザインを簡単にプレビューすることができます。
ツール上だとなかなかイメージがしずらかったりするので便利です。

![a.gif](https://qiita-image-store.s3.amazonaws.com/0/11290/63d7a6bc-e473-96c9-70f3-edfbdc0fdafd.gif "a.gif")





##まとめ
とにかく使い方が簡単で、ほとんど学習する必要がないです。
プロトタイプも高速に作れます。

今のところは私はSketchのほうが好きですが、今後のアップデートが楽しみです。
tmuxの操作を選択的UIでインタラクティブにする

今回作ったのは、`tmuximum`というシェルのコマンドです。

![ZIFU3.gif](https://qiita-image-store.s3.amazonaws.com/0/78906/2722c748-e9ec-6ba5-3320-73f67adb4b58.gif)

+ https://github.com/arks22/tmuximum

#使い方

tmuximumは、tmuxのコマンドによる一連の面倒な操作を簡略化するために作られました。

例えばtmuxのセッションにアタッチするのに、普通は

```zsh:
$ tmux list-sessions
2: 1 windows (created Thu Jul 14 22:55:13 2016) [123x48]
4: 1 windows (created Thu Jul 14 23:19:11 2016) [80x24]
5: 1 windows (created Thu Jul 14 23:19:32 2016) [80x24]
$ tmux a -t 4
```

と、セッションのリストを表示させてそこから目当てのセッションを選びアタッチするような作業をしなければいけませんが、tmuximumなら

```zsh:
$  tmuximum
```

![ZIFU3.gif](https://qiita-image-store.s3.amazonaws.com/0/78906/2722c748-e9ec-6ba5-3320-73f67adb4b58.gif)




と、コマンド一発で選択的インターフェイス（この場合はfzf)を使い目的のセッションにアタッチできます。


具体的に機能を説明していきます。
このコマンドは、tmuxの内外で挙動が変わります。

##tmux外

tmuxの外にいるときにtmuximumでできることは

+ 既存のセッションにアタッチ
+ 新しいセッションを作る
+ 既存のセッションを終了する
 
です。
このうち上二つは先ほどのgifでわかると思いますが、セッションの終了はこんな感じです↓


![ZIFU4.gif](https://qiita-image-store.s3.amazonaws.com/0/78906/51996ccf-dc86-8afe-2076-a87441bcdc2a.gif)



上のgifでは既存のセッションを二つ終了しています。
全部上下十字キーとEnterのみでできるので非常にストレスなく操作できます。


##tmux内

tmuxの中にいるときにtmuximumでできることは

+ ウィンドウの移動
+ セッションの終了
+ ウィンドウの終了

です。


![tmuximum_4.gif](https://qiita-image-store.s3.amazonaws.com/0/78906/1e6fa5f4-317b-4fd0-db5f-a7a4ba00722f.gif)

##使用例

まず、`tmuximum`ってコマンドが長くて打ちにくいので(`tmux`の2倍も打たなきゃいけない) `~/.zshrc`とかに

```zsh:.zshrc
alias t="tmuximum"
```

ってしとくといいと思います。頻繁に使うので一文字で。

一番オススメなのは、シェルの起動時に自動で`tmuximum`を実行させることです。
今までもシェルの起動時に「セッションがなかったら`tmux new-session`、あったら`tmux attach`」みたいな設定を書いてた人は多いと思うんですけど、`tmuximum`を使うことによってより快適になります。

```zsh:.zshrc
if [ -z $TMUX ]; then
  tmuximum
fi
```

#インストール

2018/4/5追記

ソースからインストールする場合は

```
$ curl -L raw.github.com/arks22/tmuximum/master/install.bash | bash 
```

とかでなんとかしてパスを通すなどしてください。

---以上追記---

zplugを使っている方は、

```zsh:~/.zshrc
zplug "arks22/tmuximum", as:command
```

としてくれれば動きます、[zplug](https://github.com/zplug/zplug)最高

~~そういえば、fzfがないと動きません。すいません、いつかpecoとかにも対応します~~

fzf,fzf-tmux,peco,percol,gofに対応しました。(2018/4/5追記)


zshでしか動作確認していないので、bashとかfishだとどうなるかわかりません。不具合があったらここのコメントでもいいので報告してください。すぐ直すと思います。
MovieTextureの具体的な使い方

<b><font color="red">
本記事はUnity5.5までを対象としたものです。
Unity5.6以降からVideoPlayerが実装されましたので
そちらを使用することをお勧めします。
</font></b>

Unityで動画を再生したいときにMovieTextureを使う方法があります。
公式のマニュアル( http://docs.unity3d.com/ja/current/Manual/class-MovieTexture.html )だと
**「対応フォーマットの動画ファイルをプロジェクトに入れると自動的に変換される。
変換にはQuicktimeが使われるのでインストールしておく必要がある。」**
と言うような事が記載されていますが、Windows版QuickTimeはセキュリティの
問題を残したままバージョンアップが停止しており事実上使用できません。

また、マニュアルに記載されている内容だと具体的な方法が
わかりにくいので実際に動画を再生する方法をまとめることにしました。

# 1)動画データを用意する
MovieTextureは実際にはogvを再生しているようなのでUnityによる変換を使用しないで
予めogvを用意しておきます。ogvはffmpegで変換可能です。
ビルド済みのffmpegは https://ffmpeg.zeranoe.com/builds/ あたりで手に入ります。

## 変換例

```bat:enc.bat
ffmpeg -y -i "title.mp4" -b 8M -ab 128k "title.ogv"
```

# 2)Unityのプロジェクトに配置する
変換したogvファイルをStreamingAssetsフォルダにコピーします。

# 3)再生するためのスクリプトを書く
MovieTextureはInspectorでマテリアルにテクスチャとして設定という
流れではなくMovieTextureを扱うスクリプトを書きます。
これをそのままコピペして使用しても構いません。

```csharp:Movie.cs

	using UnityEngine;
	using System.Collections;

	public class Movie : MonoBehaviour {

		public string _movieFile;

		// Use this for initialization
		void Start () {

			StartCoroutine(moviePlay(_movieFile));
	 	}
	
		// Update is called once per frame
		void Update () {
	
		}

		private IEnumerator moviePlay(string movieFile)
		{
			string	movieTexturePath	= Application.streamingAssetsPath + "/" + movieFile;
			string	url					= "file://" + movieTexturePath;
			WWW		movie				= new WWW(url);

			while (!movie.isDone) {
				yield return null;
			}

			MovieTexture movieTexture = movie.movie;

			while (!movieTexture.isReadyToPlay) {
				yield return null;
			}

			var renderer = GetComponent<MeshRenderer>();
			renderer.material.mainTexture = movieTexture;

			movieTexture.loop = true;
			movieTexture.Play ();

	#if false
			//オーディオを使用する場合はこの部分を有効にしてください
			var audioSource = GetComponent<AudioSource>();
			audioSource.clip = movieTexture.audioClip;
			audioSource.loop = true;
			audioSource.Play ();
	#endif
		}
	}
```

# 4)コンポーネントを設定する

GameObjectにスクリプトを設定すると動画を再生するGameObjectになります。
(マテリアルは何か適当なものを設定しておきましょう)

## 設定例
![unity_movietexture_inspector.jpg](https://qiita-image-store.s3.amazonaws.com/0/70351/8631d868-ba5b-e162-7f1b-4f5f5c58ccb0.jpeg)

# 余談

再生するとエラーが出ますが調べてみたところ
どうやらUnity側のバグのようです(5.4でも未解決だそうです)
オーディオNAS RockDiskNextのパスワード

```shell-session
$ od -j 0xa3f006 -N 16 --string /dev/mtd1|awk '{print $2}'
$ od -j 0xa3f806 -N 16 --string /dev/mtd1|awk '{print $2}'
```

http://bbs.ioplaza.jp/forum/index.php?topic_id=1974#post_id10156
パッケージをダウンロードしようとしたら、そんなパッケージないと言われた

*本日Android Studioを初めてダウンロードして、卒業した先輩からもらったコードをいじるに至っている初心者なので、色々根本的なところから教えてもらえると助かります...m(_ _)m*

<img width="354" alt="Screen Shot 2016-08-03 at 23.29.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/112938/5efd3b9e-2d0a-0848-6a23-bbcc23c82277.png">

##問題
先輩からもらったコードをjavac ファイル名.javaとやって、コンパイルしようとしたら、上記パッケージ(元々はコメントアウトしたもの)がないよと言われた。

##解決法
1. 調べると、なぜか他の「import java.io.BufferedReader;」などと違い、マニュアルでorg.jtransforms.fft.DoubleFFT_1Dに対応するコードをダウンロードしなければいけないらしい
(疑問：何故java.io.*は毎回そうしなくていいの？)

2. 検索すると[java2](http://java2s.com/)というサイトでダウンロードできるらしいのでダウンロード！

3. ダウンロードファイルに入ったzipファイルを解凍 *.jarになる
(.jarというのはjavaのファイルを圧縮した形式らしい)

4. 上記importを使用しているソースファイルがあるディレクトリに*.jarをmv。
5. jar xvf *.jar　で解凍できるらしいので解凍
（なんか新しくMETA-INFというディレクトリができた&上のimport eduに対応してるのかeduというディレクトリもできた）
6. もしやと思い、eduディレクトリの階層通りにimport名を書いてみる(コメントアウトしていない方)
7. もう一回上のソースファイルをコンパイルしてみる....(わくわく)
8. ...コンパイルできた！！

## 疑問
- 毎回このようにマニュアルでダウンロードしないといけないのか
- そもそも何はマニュアルでダウンロードしないといけなくて、何は何もしなくてもいいのか
- java2というサイトは何者なのか
- ソースコードが置いてある場所で適当にimportすべきファイルを解凍したけど、本来どういうディレクトリで解凍すべき、とかあるのか

Long way to go。。。> <！
オーディオNAS RockDiskNextのOpenSSH/OpenSSLをアップデートする

## まずRockDiskNextって？
IOデータのオーディオ向けのNAS
http://www.ioplaza.jp/shop/contents/rdnext.aspx
中身はFedora12 ARMベースで、ちょっといじって有効化するとSSH接続もできる。

### サポート状況について
http://www.ioplaza.jp/shop/contents/rdnext.aspx#farm
「SSLv3の脆弱性についての対策ファームウェアを公開しました。」ということで、OpenSSLがfc12の1.0.0から独自ビルドだと思われる1.0.2aにアップデートされた。
しかし非サポートであるOpenSSHに関してはアップデートが放置され、バージョンのミスマッチにより、SSHが使えなくなってしまっている。
ARMのクロス環境を作ってOpenSSHをアップデートしたい…と思ったが、環境作成で早々に挫折。

## 対応方法
RedHat由来のRedSleeveというARMのディストリビューションがあるじゃないですか。こいつのRPMパッケージを使ってみる。

### 必要パッケージ入手先
RedSleeve ftpサイト
http://ftp.redsleeve.org/pub/
Fedra 12 armのアーカイブ
http://ftp.linux.org.uk/pub/linux/arm/fedora/pub/fedora/linux/releases/12/Everything/arm/os/Packages/

### 手順
RockDiskNextにtelnetでrootログインし、各種パッケージ入手。
makeが必要なのは何故かopensslがmakeに依存しているから。

```shell-session
# curl -O http://ftp.linux.org.uk/pub/linux/arm/fedora/pub/fedora/linux/releases/12/Everything/arm/os/Packages/make-3.81-18.fc12.armv5tel.rpm
# curl -O http://ftp.redsleeve.org/pub/el6/6.7/base/RPMS/openssl-1.0.1e-42.el6.2.armv5tel.rpm
# curl -O http://ftp.redsleeve.org/pub/el6/6.7/base/RPMS/openssh-5.3p1-112.el6.armv5tel.rpm
# curl -O http://ftp.redsleeve.org/pub/el6/6.7/base/RPMS/openssh-clients-5.3p1-112.el6.armv5tel.rpm
# curl -O http://ftp.redsleeve.org/pub/el6/6.7/base/RPMS/openssh-server-5.3p1-112.el6.armv5tel.rpm
```
入手したパッケージをインストール

```shell-session
# rpm -ivh make-3.81-18.fc12.armv5tel.rpm
# rpm -Uvh openssl-1.0.1e-42.el6.2.armv5tel.rpm 
# rpm -Uvh openssh-5.3p1-112.el6.armv5tel.rpm openssh-server-5.3p1-112.el6.armv5tel.rpm openssh-clients-5.3p1-112.el6.armv5tel.rpm
```

念のためsshdの有効化と再起動

```shell-session
# chkconfig sshd on
# service sshd restart
```

とりあえずこれで動作しているようです。
そもそもRockDiskNext自身が不安定だけど…
Random.rand(-1..1) は Random.rand(3) - 1 よりずっと遅い


# 動機

Ruby で 0 から 9 までの整数の乱数を発生させるのは

```rb
Random.rand(10)
```

でいいですよね。
（ええと，`Kernel.#rand` を使って `rand(10)` とすることもできますが，その話はまたあとで）


では，範囲が「0 から N-1 まで」ではない場合，どう書くのがいいでしょうか。

たとえば -1, 0, 1 のどれかをランダムに発生させるのに

```rb
Random.rand(3) - 1
```

と書けますが，このコードを見て -1, 0, 1 だと分かるまで一瞬考えちゃいますし，なんだかスマートではありません。

リファレンスマニュアルで [`Random.rand`](http://docs.ruby-lang.org/ja/2.3.0/method/Random/s/rand.html) を見れば，

```rb
Random.rand(-1..1)
```

と書けることが分かります。こっちのほうが Ruby らしいですし，分かりやすいように思います。

と・こ・ろ・が！

後者は遅いんですよぉ。（今日まで知らなかったケド）

# 計測

ベンチマークテストをやってみましょう。

ついでに，`Random.rand` と [`Kernel.#rand`](http://docs.ruby-lang.org/ja/2.3.0/method/Kernel/m/rand.html) の比較もやってみます。

```rb
require 'benchmark'

iter = 10_000_000

Benchmark.bmbm do |rep|
  rep.report "Random.rand(3) - 1" do
    iter.times do
      v = Random.rand(3) - 1
    end
  end

  rep.report "Random.rand(-1..1)" do
    iter.times do
      v = Random.rand(-1..1)
    end
  end

  rep.report "rand(3) - 1" do
    iter.times do
      v = rand(3) - 1
    end
  end

  rep.report "rand(-1..1)" do
    iter.times do
      v = rand(-1..1)
    end
  end
end
```

結果はこんな感じ：

```bash
                         user     system      total        real
Random.rand(3) - 1   1.280000   0.000000   1.280000 (  1.295193)
Random.rand(-1..1)   3.200000   0.020000   3.220000 (  3.235467)
rand(3) - 1          2.190000   0.010000   2.200000 (  2.207524)
rand(-1..1)          2.440000   0.010000   2.450000 (  2.465236)
```

環境は

> ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin15]

です。

# なんで？

`Random.rand` の場合，`Range` を渡すとメチャメチャ遅い。

`Kernel.#rand` だと，それほどの差は無く，`Random.rand` の二つの結果のちょうど間に収まっています。ここがちょっと意外でした。

`Random.rand` と `kernel.#rand` って，中身は同じだと勝手に思い込んでましたが，違うのね。

引数に `Range` を渡す方式だと遅くなるのは，たぶんこういうことでしょう。
`Range` が渡されると，その始端と終端をまず求め，その差分を取ります。この値を上限値とする乱数をまず発生させます。その値に始端の値を足します。
始端と終端から差分をとる処理が，メソッド呼び出しのたびに**毎回**発生するのが無駄になっているワケですね。

大量の乱数を発生させるときは要注意です。
Ansibleで修正内容を環境ごとに段階的に適用する方法(構想)

ステージングや本番の環境をAnsibleで管理しているときに、新しい修正を段階的に適用したいことがあります。
なにか設定を変更するときに、まずはステージング環境に適用して動作確認をして、問題がないことが確認できてから本番環境に適用するということをしています。
もし、ステージング環境での確認に時間がかかってしまうと、他の修正を先に本番に出さなければいけない様なことが発生して面倒なことになってしまいます。


こういった変更箇所の環境ごとの出し分けを、以下のような方法で管理したらどうかと考えてみました。（まだ実践では使ってません）

  * 機能別のOn/Offを`feature`というdictionary構造で管理
  * `group_vars`内の各グループの設定として、`feature`のOn/Offを設定
  * 修正箇所を`feature['xxx']`の条件にて制御する
    * `tasks`の適用条件(`when`)やテンプレートの条件


```yaml:group_vars/production
feature:
  f001: false
  f002: false
```

```yaml:group_vars/staging
feature:
  f001: true
  f002: false
```

```text:templates/file.txt.j2
Sample Text

{% if feature['f002'] %}
feature/f002
{% endif %}
```

```yaml:main.yml
- hosts: all
  connection: local
  roles:
    - file01
  tasks:
    - debug: var=feature
    - name: f001
      debug: msg="Do feature/001"
      when: feature['f001']
    - name: make file
      template: src=templates/file.txt.j2 dest=./file.txt
```

こうしておけば、修正内容の適用可否を環境別に細かく制御できます。
また、`feature`の値を見ればどの環境にどの修正を反映しているかが一目でわかります。

`feature`に列挙している項目を行の有無ではなく`true/false`にしてあるのは、ファイルをgitなどで管理しているときにdiffの表示などが綺麗にみえることを期待してのことです。
Spring(4.3.2)でthymeleaf(3.0.1)を使用

2016年7月21日にthymeleaf3.0.1がリリースされました。
http://www.thymeleaf.org/download.html

今まで2.1.4を使っていましたが、色々機能追加や性能があがっているみたいなことが書いてあったので2.1.4から3.0.1へマイグレーションしてみました。

自分はJavaベースConfigurationが好きではないのでXMLベースConfigurationのやり方で実施。
まずは、2.1.4のときのpom.xmlとservlet-context.xml

```pom.xml
<dependency>
	<groupId>org.thymeleaf</groupId>
	<artifactId>thymeleaf-spring4</artifactId>
	<version>2.1.4.RELEASE</version>
</dependency>
```

```servlet-context.xml
<beans:bean id="templateResolver" class="org.thymeleaf.templateresolver.ServletContextTemplateResolver">
	<beans:property name="prefix" value="/WEB-INF/templates/" />
	<beans:property name="suffix" value=".html" />
	<beans:property name="templateMode" value="HTML5" />
</beans:bean>

<beans:bean id="templateEngine" class="org.thymeleaf.spring4.SpringTemplateEngine">
	<beans:property name="templateResolver" ref="templateResolver" />
</beans:bean>

<beans:bean class="org.thymeleaf.spring4.view.ThymeleafViewResolver">
	<beans:property name="templateEngine" ref="templateEngine" />
	<beans:property name="characterEncoding" value="UTF-8" />
</beans:bean>
```

http://www.thymeleaf.org/doc/articles/thymeleaf3migration.html
上記サイトを参考に以下のように修正

```pom.xml
<dependency>
	<groupId>org.thymeleaf</groupId>
	<artifactId>thymeleaf-spring4</artifactId>
	<version>3.0.1.RELEASE</version>
</dependency>
```

```servlet-context.xml
<beans:bean id="templateResolver" class="org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver">
	<beans:property name="prefix" value="/WEB-INF/templates/" />
	<beans:property name="suffix" value=".html" />
	<beans:property name="templateMode" value="HTML" />
</beans:bean>

<beans:bean id="templateEngine" class="org.thymeleaf.spring4.SpringTemplateEngine">
	<beans:property name="enableSpringELCompiler" value="true" />
	<beans:property name="templateResolver" ref="templateResolver" />
</beans:bean>

<beans:bean class="org.thymeleaf.spring4.view.ThymeleafViewResolver">
	<beans:property name="templateEngine" ref="templateEngine" />
	<beans:property name="characterEncoding" value="UTF-8" />
</beans:bean>
```

templateResolverをorg.thymeleaf.templateresolver.ServletContextTemplateResolverからorg.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolverに変更

また、templateModeを"HTML5"から"HTML"に変更
"HTML5"や"XHTML"などが"HTML"に統合されたらしく、"HTML5"は非推奨になってました。
さらに3.1で削除予定とのこと
http://www.thymeleaf.org/apidocs/thymeleaf/3.0.1.RELEASE/org/thymeleaf/templatemode/TemplateMode.html

よく理解してませんが、templateEngineには"enableSpringELCompiler"をtrueにする設定を追加

これでthymeleaf3.0.1の設定完了で無事動作しました。
※URLにはApplicationContextを設定していたけど、Interfaceクラスだから何を設定していいのかわからなかったので放置。。。
Selenium IDE メモ



Firefoxのアドオンでテスト自動化ツールらしいが、そんな高度な使い方はしていない（わからない）。
WEBアプリケーションの入力フォームに同じような内容を何度も入力するような場合に、操作を記録して再生みたいな使い方をしている。

#インストール
FireFoxで下記のURLを開き「Add to Firefox」をクリックする。
https://addons.mozilla.org/en-US/firefox/addon/selenium-ide/

#使い方
##操作の記録
1. メニューの ツール＞Selenium IDE で別ウィンドウが立ち上がってSelenium IDEが起動する。
2. 左上の赤ボタンが記録する／記録しないの切り替えボタン。Selenium起動時の初期状態は記録中になっている。
3. 記録する状態でブラウザ上で何かやるとその操作が記録されていく。１つ１つの操作はコマンドとして「テーブル」タブに追加されていく。
4. 赤ボタンを押して記録をやめる。

* 記録した操作を「テストケース」というらしい。

##テストケースの実行
記録した操作を実行（再現）する。

* 緑の三角と横棒のボタン（「テストスイート全体を実行」、「現在のテストケースを実行」）をクリックする。

##テストケースの編集

* テーブルタブに記録した操作がコマンドとして並んでいるので、削除したいコマンドを選択してDeleteで削除できる。また右クリックの「コマンドの挿入」でコマンドを挿入することもできる。

##テストケースの保存

* Selenium IDEの画面のメニューの ファイル＞テストケースの保存 または ファイル＞テストケースを名前を付けて保存。
* 記録はXHTMLファイルとして保存される。このXHTMLファイルをエディタで編集することでテストケースを編集できる。
* 保存されているテストケースはメニューの ファイル＞テストケースを開く で読み込むことができる。

#覚えておきたいコマンド
##clickAndWait

* 普通にボタンやリンクをクリックするとclickコマンドで記録されるが、クリックすると画面遷移するような場合、clickコマンドでは次のコマンドの実行を画面遷移が完了するまで待ってくれない。
* clickAndWaitはクリックした後、画面遷移が終わるまで次のコマンドの実行を待ってくれる。

##pause
* そのまま。指定した時間止まる。単位はミリ秒。
* 注意としては、停止時間はなぜか「値」ではなく「対象」の方で指定する。最初「値」の方に入れて止まってくれず悩んだ。

#参考サイト
[【俺用メモ】SeleniumIDEについて調べたこと](http://qiita.com/zom/items/ec0cbfc9ac216323ede4)
GithubからGradleプロジェクトをcloneして動かすまで

projectファイルをgit管理外としているプロジェクトを他PCでcloneすると、eclipse上ではプロジェクトとして認識されず色々こまる

ということでGradleプロジェクトをgithub上のリモートリポジトリからcloneして、eclipse上で実行できるようするまでの話。
※eclipseプラグインとしてGradle STSがインストールされている前提。

### 解決策
1. gitリモートリポジトリからcloneする  
まずはeclipseでgitリポジトリビューを表示
ウィンドウ > ビューの表示 > その他 > Git > Gitリポジトリーと選択すると表示される  

gitリポジトリのなかで下図赤枠アイコンから、clone対象のリポジトリ情報を入力
<img src=https://qiita-image-store.s3.amazonaws.com/0/118585/0a34a540-23ed-4570-4978-89e3be7e7c34.png width=400>

<img src=https://qiita-image-store.s3.amazonaws.com/0/118585/e64e755c-4333-afe8-c2f4-83b26fe80792.png width=400>


取り込むブランチを選択し

<img src=https://qiita-image-store.s3.amazonaws.com/0/118585/b82c367d-a45f-1d19-c627-4c0b7eedf8b3.png width=400px>


ローカルリポジトリをつくるディレクトリを選択すると、リモートリポジトリからcloneされる。
<img src=https://qiita-image-store.s3.amazonaws.com/0/118585/8dc886d7-238e-205f-e728-8ea21f06fe9a.png width=400>  
2. プロジェクトをインポートする  
cloneしたプロジェクトを右クリック　> プロジェクトのインポートを選択し、
一般的なプロジェクトとしてインポート
<img src=https://qiita-image-store.s3.amazonaws.com/0/118585/03653c69-8f78-151a-424d-3665efc5ab2f.png width=400>

インポートしたプロジェクトを右クリック　> 構成 > Gradle(STS)プロジェクトへ変換
<img src=https://qiita-image-store.s3.amazonaws.com/0/118585/af6fbda0-41e2-293e-24b6-933ac29bbb0e.png width=400>

とりあえずこれでspringアプリケーションとして実行できるようになりました。
<img src=https://qiita-image-store.s3.amazonaws.com/0/118585/26db8175-e9a9-87df-0ce7-4de5107cfcbd.png width=400>
Swift3.0でoverrideでエラーが出た時

Xcode8betaにしてからエラーが増えた中で一つ解決に手間取ったものがあった。(日本語の記事が見つからなかったから
#問題
UIViewControllerでステータスバーのスタイルを変えたいときなどは、

```swift
override func preferredStatusBarStyle() -> UIStatusBarStyle {
    return .default
}
```
を使っていたと思うが、Xcode8betaを使ってプロジェクトを開くと

```
Method does not override any method from its superclass
```
エラーが出る。
#理由
なぜならUIViewController内での定義が

```swift
public func preferredStatusBarStyle() -> UIStatusBarStyle
```
から

```swift
open var preferredStatusBarStyle: UIStatusBarStyle { get } 
```
に変わったから。

#修正方法
Swift3.0からはこう書く。

```swift
override var preferredStatusBarStyle: UIStatusBarStyle {
    return .default
}
```

#他にも
他にも、
prefersStatusBarHidden
shouldAutorotate
supportedInterfaceOrientations
等で変わっている。
#まとめ
何れにしても、funcをvarに書き換え、() ->を:に書き換えるだけなので、それがわかれば簡単。
エラーが出て定義を確認した時に

```swift
open var なんとか: なんとか { get }
```
だったら応用が利く。
#コメント
今久しぶりにXcode8を使って、それがたまたまbeta4で気づいたことだったが、もしかしたら前からだったのかもしれない。

#追記(8/16)
Xcode8_beta6でまた定義が変わったみたいです。それに合わせて編集しました。
`public`から`open`になりました。`open`が何か全くわかりません。アクセス修飾子っていうんですか？これ。
openについてはここ->http://qiita.com/hironytic/items/6cc68ca93b428ba9194e

#参考サイト
http://stackoverflow.com/questions/38740648/how-to-set-status-bar-style-in-swift-3
Qiitaの記事からGoogleドライブにある画像へ直リンク

Qiitaの画像アップロードは100MB/月までのようです。
制限に引っかかるようであればGoogleドライブの画像へ直リンクすることで、Qiitaにアップロードできなくても画像を表示することが可能です。
また、Qiitaには自分で画像を削除する機能がありませんので、間違ってアップロードするリスクを避けるために、必ずこの方式を使用することを検討しても良いかと思います。

参考
http://googlesystem.blogspot.jp/2013/02/permalinks-for-google-drive-images.html
http://blog.qiita.com/post/75674629515/image-capacity-expansion

---
#1.Googleドライブにある画像の共有設定とURLの取得
###共有設定を実施
![image](http://drive.google.com/uc?export=view&id=0B4O6XN3Za9sxcUc4WjIweFBVdjQ)

###共有可能なリンクを取得し、全員が閲覧可にする
![image](http://drive.google.com/uc?export=view&id=0B4O6XN3Za9sxclkyY0NTVm9PWTA)

#2.Qiitaから直リンク
2つのURLパターンでQiitaから直リンクすることが可能です。

オリジナルURL"https://drive.google.com/file/d/1FzewIKFekdRyHeKMAGFaltRdQcKewudxUA/view" の

[1FzewIKFekdRyHeKMAGFaltRdQcKewudxUA]部分を以下いずれかのパターンの[FILEID]部分と入れ替えます。

パターン1
http://drive.google.com/uc?export=view&id=[FILEID]
or
パターン2
http://drive.google.com/uc?export=download&id=[FILEID]

#3.サンプル
###パターン1
Markdown:\![image]\(http://drive.google.com/uc?export=view&id=1FzewIKFekdRyHeKMAGFaltRdQcKewudxUA)
![image](http://drive.google.com/uc?export=view&id=1FzewIKFekdRyHeKMAGFaltRdQcKewudxUA)

###パターン2
Markdown:![image]\(http://drive.google.com/uc?export=download&id=1FzewIKFekdRyHeKMAGFaltRdQcKewudxUA)
![image](http://drive.google.com/uc?export=download&id=1FzewIKFekdRyHeKMAGFaltRdQcKewudxUA)

###参考
オリジナルURLをそのまま使用しても画像は表示されない
Markdown:\![image]!(https://drive.google.com/file/d/1FzewIKFekdRyHeKMAGFaltRdQcKewudxUA/view)
![image](https://drive.google.com/file/d/1FzewIKFekdRyHeKMAGFaltRdQcKewudxUA/view)
Windows Subsystem for Linuxでデスクトップ環境を起動してみる

<font color=#bbb>遊びですのであしからず:D</font>

Windows Anniversary Update来ましたね！皆さん早速入れてみましたか？
私も昔insider previewを触っていたのですが、/dev/ttyが使えずちょっとまだ早いかなあと思ってやめてしまいました。
ところが、もう使えるらしい！これでターミナルエミュレータも使えるぞ！

…ということで、試しにXming+WSLの環境で、LXDEを起動してみました。

# インストール

```bash:
$ sudo aptitude install --without-reccomends lxde fonts-umeplus fonts-inconsolata
```

## Xの設定

まずXmingを起動しておいてください。
次にDISPLAY環境変数を設定します。ついでにxeyesもインストールしてテストしましょう;)

```bash:
$ sudo aptitude install x11-apps
$ export DISPLAY=localhost:0.0
$ xeyes
```

![2016-08-03 (3).png](https://qiita-image-store.s3.amazonaws.com/0/102161/45e1093a-af67-889f-5d0e-ceb5e38ff1da.png)

bashrcに突っ込んでしまいましょう。

```bash:
$ echo 'export DISPLAY=localhost:0.0' >> ~/.bashrc
```

# 起動

それでは起動してみましょう。

```bash:
$ startlxde
```

![2016-08-03 (4).png](https://qiita-image-store.s3.amazonaws.com/0/102161/36e20d51-69e7-2657-1e9b-582eb84d295c.png)

![2016-08-03 (10).png](https://qiita-image-store.s3.amazonaws.com/0/102161/b6443843-ee73-3612-f258-af496b10b926.png)

実は

```bash:
$ lxpanel --profile LXDE &
```

で下のパネルだけ起動したほうが実用的だったり。

# 感想

意外と普通に動きました。使用感はvirtualboxのシームレスモードみたいで、悪くないです。
coLinuxとか思い出して懐かしくなりました。
Swiftで実機ビルド時にdyld: Library not loaded: @rpath/〜

## 環境

Xcode 7.2.1


## 現象

Swift 2.0で書いたアプリを実機にインストールすると、起動直後に

dyld: Library not loaded: @rpath/〜

のようなエラーが出てコケる。

どうやら、CocoaPodsでインポートしたフレームワークが実機にコピーされていない様子。

## ダメだったこと

* frameworkのステータスをRequiredからoptionalに → ダメ
* Embeedded Content Contains Swift CodeをYESに → 最初からYESだった
* キーチェーンから証明書を削除して入れなおす → ダメ

## 効果があったこと

* システムにある証明書に紐づく鍵をドラッグ・アンド・ドロップでログインに移動する

## 原因

以前、自分のデフォルトキーチェーンをリセットした後に証明書を全て削除し、
エクスポートしてあるCertificate(証明書)をインポートした後から、
実機ビルド時にログインキーチェーンのパスワードを繰り返し求められるようになっていた。

対応策として、システムにいる証明書に紐づく鍵ファイルに対し、
情報を見るのアクセス制御から、
"この項目の使用を全てのアプリケーションに許可"にして凌いでいた。

Objective-Cのみのプロジェクトでは問題が出ていなかったが、
Swiftが含まれたプロジェクトをビルドする際に、
使用している証明書に紐づく鍵ファイルがログインキーチェーンのシステムにいると、
上手いことCocoaPodsに紐づくFrameworkを実機にコピーしてくれない様子。

下記に記載したように、鍵ファイルをログインに移動するのが正解っぽい。
http://qiita.com/mitsuaki1229/items/ecf952f2eb846168c1f4


なぜ鍵ファイルがシステムにいるとFrameworkをコピーしてくれないのかは不明。
pgAdmin4 + PostgreSQL 9.6beta3

## 普段はpsql最高！な人なのですが
せっかくpgAdmin4のようなGUIクライアントもあるのだから、たまには使ってみるのもいいかなあと。

## EXPLAIN表示
まあ、一番気になるのは9.6で追加されたパラレルクエリまわりが、どんな感じでEXPLAINでグラフィカルに表示されるのか、ということ。
なのでやってみた。

## pgAdmin4のインストール
今回は、私物のLet's note君に突っ込んでみることにする。
といっても、Windows版 PostgreSQL 9.6 beta3には、pgAdmin4が同梱されているので、Windows版PostgreSQLをインストールするだけでおしまい。

## パラレルクエリをpgAdmin4で表示させてみる
これも別に特別な設定が必要なわけじゃない。
インストール直後のデフォルトの設定のままでいい。

PostgreSQL 9.5からはpgbenchも最初から使える。
とりあえずpgbenchでスケールファクタ10程度のデータ(pgbench_accounts 100万件)を投入しておく。

この状態で、以下の様なクエリを実行。
``` SELECT avg(abalance) FROM pgbench_accounts```
これでパラレルクエリが内部的に動作する。

次はpgAdmin4をちょいと設定。Query Toolを起動。
で、EXPLAINのoptionとしてVERBOSEを指定しておく。
![pic-0-1.png](https://qiita-image-store.s3.amazonaws.com/0/32626/bce36ec5-67cf-826e-a4fe-c7857edba71e.png)

実行するとこんなJSONｋ形式の出力がQuery Toolの結果ペインに表示される。
![pic-0-2.png](https://qiita-image-store.s3.amazonaws.com/0/32626/dcab3c22-6008-2c32-7571-15a930ec1c6e.png)
Workerが起動しているのが見えますね。

さて、この実行計画をグラフィカルに見てみるとどうなるか。Explainタブをクリックすると
![pic-0-3.png](https://qiita-image-store.s3.amazonaws.com/0/32626/78dfa93c-34ff-c742-5ae1-1af573b91725.png)
こんな感じで表示される。
Workerを起動していても、枝分かれして表示するわけではないようだ。
あと、PostgreSQL 9.6で追加されたGatherノードは、まだpgAdmin4では対応していないらしく、空白で表示される。ちょっと寂しいｗ まあ、これは今後改善されていくのだろうけど。
で、Gatherの部分にマウスオーバーすると、詳細情報が表示される。
![pic-2.png](https://qiita-image-store.s3.amazonaws.com/0/32626/103562bf-0790-d436-36e3-b147814d9091.png)
詳細情報にWorkers Plannedという項目がある。今回は2と表示されていますね。
これでworkerを起動してパラレル処理しているか否かが判断できそう。
## おわりに
pgAdmin3のビミョーな印象があったので、PostgreSQLを使うときにはGUIクライアントは使わなかったんだけど、pgAdmin3よりはちょっとオサレっぽい画面だし、psqlのようなCUIを使っていると若者に見られないらしいので、今後はpgAdmin4もちょっとは使ってみようと思う。

まあ、メインで使うのはpsqlであることは今後とも変わらないとは思うけどｗ
Laravel Vue.js でSSRする


とりあえず動かしたのでメモ

多分誰も幸せにならない

## 概念的なコード例


例えば、ナンかしらの一覧を、モーダルのコンポーネントで表示しているケース

フロント側がこんなコンポーネントを`front/modal.js`として持っている。

````
const modalComponent = {
    template: `
    <div>
        <div class="modal">
	        <div class="modal-header">
	            <h4 class="modal-title">{{item.title}}</h4>
	        </div>
	        <div class="modal-body">
	            <p>{{item.body}}</p>
	        </div>
	        <div class="modal-footer">
	            <button type="button">SHARE</button>
	            <button type="button">BUY</button>
	        </div>
        </div><!-- /.modal -->
    </div>
    `,
    props: ["item"],
}
module.exports = modalComponent;
````

サーバ側でこういうスクリプト`ssr.js`を書いて。

````
const Vue = require('vue')
const renderer = require('vue-server-renderer').createRenderer()
const modalComponent = require("./front/modal.js");

var item = {...} // 外部から受け取る商品情報とか…

var template = `
    <div class="ssr-area">
        <my-modal :item="item"></my-modal>
    </div>
`;

const vm = new Vue({
    template,
    data:{item},
    components:{
        "my-modal" :modalComponent
    }
})

renderer.renderToString(vm, (err, html) => {
    console.log(html)
})
````

Laravel側で実行する。

````
app()->get("app/detail",function(){
	$item = ... // パラメータから取得する商品情報とか…
	
    $command = "node ".app()->basePath("/ssr.js");
    $ssr = new \MyProcess($command);
    $ssr->pass("item",$item); //何とかしてコマンドにデータ渡す
    $ssr->run();
    return view("app",[
    	"item" => $item, // OGPとかで使うと思うの
        "ssr" => $ssr->getOutput()
    ]);
});
````

## 感想

- 普通に動くし、気持ち悪いけど面白い感じはする。
- 普通に商用で使うならコマンドはRepository化してキャッシュする
- データをコマンドに受け渡すには…標準入力or引数…？。OGPとかで使うこと考えると商品IDとかでの受け渡しは非効率
- expressなんて知らない。サーバ管理者に１つ以上のサービスを管理させるのはオーバワーク
- v8jsなんてもっと知らない。phpをビルド出来るのは数限られた職人のみ
- wintersmithのプラグインとかにして使うのも面白いと思った。
- UniversalなVue.js Component 書くには色々訓練が必要に感じた。
- やりたいのはOGPと直リン誘導のみなので、勝手に付与される`<div server-rendered="true">`とかいうdivをつかってCSSで上手く制御出来るはず。
- よくよく考えたらbladeとか使うわけなかったんで[jade版](http://qiita.com/mikakane/items/1faffe8442871688a19e)書いた
- 多分誰も幸せにならない。
Windows10でBashを使ってみる１

# はじめに
2016/08/03にメジャーアップデートされた（Redstone 1）Windows10でBashを使ってみました。

# 開発者向けモードにする
「Winボタン」→「設定」→「更新とセキュリティ」→「開発者向け」から開発者モードをチェック![キャプチャ001.PNG](https://qiita-image-store.s3.amazonaws.com/0/135967/347baf11-1d0f-b93a-78ba-1f36d46a9b3c.png)

# 「Windows Subsystem for Linux」の有効化
「コントロールパネル」→「プログラム」→「Windowsの機能の有効化または無効化」から「Windows Subsystem for Linux (Beta)」をチェック
再起動を促されるので再起動
（まだ、β版のようです）
![キャプチャ002.PNG](https://qiita-image-store.s3.amazonaws.com/0/135967/b5ce6aaf-cd05-b6a8-80a8-581e133b665a.png)

# Bashで開く
再起動完了後コマンドプロンプトを起動し
bashコマンドを実行
\> bash
ライセンスについて表示されるので、「y」を入力
![キャプチャ004.PNG](https://qiita-image-store.s3.amazonaws.com/0/135967/e3729747-0e57-6e2f-10f5-21a4e4f1002d.png)

Bash起動！

Ver表示してみた。
![キャプチャ005.PNG](https://qiita-image-store.s3.amazonaws.com/0/135967/6319fdaa-61aa-ddb4-83c7-1012dfd854a3.png)

Windows10でBashを使ってみる２ (TensorFlowインストール)
(http://qiita.com/rightoffreedom/items/2e1d11f0e746afda0ff5)
Pythonでcsvファイルに出力

# CSV形式で出力をしたい

スクレイプした情報をcsv形式で出力して、エクセルでごにょごにょしたい時とか

```csv.py
# -*- coding: utf-8 -*-

import csv

# ファイルオープン
f = open('output.csv', 'w')
writer = csv.writer(f, lineterminator='\n')

# データをリストに保持
csvlist = []
csvlist.append("hoge")
csvlist.append("fuga")

# 出力
writer.writerow(csvlist)

# ファイルクローズ
f.close()
```

ちなみにファイルオープンの第二引数を `a` とすると追記モードになる
Xcodeで実機ビルド時にログインキーチェーンのパスワードを繰り返し求められる

## 環境

* Xcode 6.4
* Xcode 7.2.1

## 発生内容

Xcodeで実機ビルドする度にログインキーチェーンのパスワードを何度も求められるようになり、入力するのが大変。

## 原因

* 自分のデフォルトキーチェーンをリセットしていた
* Certificate（証明書）インポート時、証明書に紐づく鍵が、キーチェーンアクセスのログインではなくシステムに入っていた

## 対応

* システムにある証明書に紐づく鍵をドラッグ・アンド・ドロップでログインに移動する
el-getでインストールしたneotreeでneo-window-fixed-sizeを使えるようにする


# neotreeのwindow-sizeがC-x }などで変えられない件

paizaの記事を読んで、emacsのneotreeが便利なことを知りました。そこで早速el-getを使いインストールします。

el-getはインストールされている前提で、僕が使っていたneotreeの設定部分は以下のとおりです。

```
;; neotree - ディレクトリ構造を表示できるやつ
(el-get-bundle neotree)
;; F8でnetreee-windowが開くようにする
(global-set-key [f8] 'neotree-toggle)
;; neotreeでファイルを新規作成した場合のそのファイルを開く
(setq neo-create-file-auto-open t)
;; delete-other-window で neotree ウィンドウを消さない
(setq neo-persist-show t)
```

さて、早速F8でneotreeを開くわけですが、ディレクトリ階層が深くなるとウィンドウが狭くなってくるわけで、windowを広げたり狭めたりしたいという需要が湧いてきます。そこで `C-x }` なんかを押すと

```
Selected window has fixed size
```

と言われてしまいます。neotreeのwindowのサイズが固定されていて変更できません。


# neo-window-fixed-size オプション

そこで調べてみると、こんなものが出てきました。

https://github.com/jaypei/emacs-neotree/issues/103

ディレクトリ構造が深くなると幅が欲しくなるので、resizeできるようにして欲しいというissueです。コレに対して、以下の変更がありました。

https://github.com/jaypei/emacs-neotree/commit/e4979f6b648a25577ec20fa749fee56a1524bf92

これにより、 `(setq eo-window-fixed-size nil)` すればwindow-sizeを変更できるように思います。

が、設定しても変更できませんでした。何故か。


# neo-window-fixed-size オプションは emacs-neotree の master に入っていない

このオプションはemacs-neotreeのdevelopブランチには入っているのですが、masterには入っていませんでした。

https://github.com/jaypei/emacs-neotree

さらに、el-getのneotreeが何処を指しているかというとmasterでした

https://github.com/dimitri/el-get/blob/master/recipes/neotree.rcp


# el-getを変更してdevelopを向くようにして無理やり動かす

仕方ないので、emacs-neotree の develop を見るようにして無理やり動かします。

```
$ emacs el-get/recipes/neotree.rcp

$ git diff
diff --git a/recipes/neotree.rcp b/recipes/neotree.rcp
index f61aca8..64746f8 100644
--- a/recipes/neotree.rcp
+++ b/recipes/neotree.rcp
@@ -2,5 +2,5 @@
        :website "https://github.com/jaypei/emacs-neotree"
        :description "An Emacs tree plugin like NerdTree for Vim."
        :type github
-       :branch "master"
+       :branch "develop"
        :pkgname "jaypei/emacs-neotree")
```

installしなおす

```
$ rm -rf elisp/neotree
```

emacsを起動してel-getが走る。

# neo-window-fixed-size オプションを無効化する

```
;; C-x }, C-x { でwindowサイズを変更できるよにする
(setq neo-window-fixed-size nil)
```

ウィンドウサイズを変更できるようになる。
Rubyでキーが無くてもエラーにならない多次元Hashの作り方

普通のHashだと、↓みたいな感じでキーが無い場合にnilを返してくれる

```rb
a = Hash.new
puts a['x']
# nil
a['x'] = 3
puts a
# {"x"=>3}
```

多次元Hashだとこんな感じで不便。また、Hash of Hashっていう見方をするならこの挙動は妥当だけど、まとめて多次元Hashとして見た場合、1次元Hashはnilを返すのに多次元Hashは例外を出すので挙動に一貫性が無い

```rb
a = Hash.new
puts a['x']['y']
# NoMethodError: undefined method `[]' for nil:NilClass
```

そこで↓みたいにすると良い感じ

```rb
def new_safe_hash()
  ifnone = lambda { |hash, key|
    hash[key] = Hash.new(&ifnone)
  }
  Hash.new(&ifnone)
end

a = new_safe_hash()
a['x']['y'] = 3
puts a
# {"x"=>{"y"=>3}}
```

↑は次元をいくらでも増やせるけど↓は次元をあらかじめ制限したバージョン

```rb
def new_multidimensional_hash(num_dimensions, default_value = nil)
  ifnones = [lambda { |hash, key|
    hash[key] = default_value
  }]
  (1..num_dimensions - 1).each { |i|
    ifnones[i] = lambda { |hash, key|
      hash[key] = Hash.new(&ifnones[i - 1])
    }
  }
  Hash.new(&ifnones.last)
end

a = new_multidimensional_hash(2)
puts a['x']['y']
# nil
puts a['x']['y']['z']
# NoMethodError: undefined method `[]' for nil:NilClass
```