OmniAICreator/Qiita-1.07M huggingface dataset:
PHP7をwindows7にインストールする

# PHP7のインストール

## これを書いた理由
最小の設定と構成で、phpが動くインストール手順がほしかったので、書きました。apacheのセットアップなど面倒な手順を省きたかった形です。

## 事前準備
[Visual Studio 2015 の Visual C++ 再頒布可能パッケージ](https://www.microsoft.com/ja-jp/download/details.aspx?id=48145)

これを、windowsの32bit or 64bitを合わせつつ、ダウンロードしてインストールしてください。

## ダウンロード編
[公式ダウンロードページ](http://windows.php.net/download#php-7.0)から、ダウンロードしてきます。

とりあえず試してみたい場合、windowsの32bit or 64bitを合わせつつ、スレッドセーフ版を選ぶと良いと思います。

Webサーバを別で起動する場合
apacheでマルチスレッドに動かすなら、スレッドセーフ
nginxでシングルスレッドに動かすなら、ノンスレッドセーフ
を、選びます。

このセットアップでは、PHPを単品で動かしますが、テスト環境なので、スレッドセーフ版で良いと思います。

## 配置＆パスを通す
ダウンロードしたzipファイルを解凍して、phpというフォルダ名にリネームします。
その後、Cドライブ直下に置きます。
c:\php
という感じです。その後、

マイコンピュータを右クリック - プロパティ - システムの詳細設定 - 環境変数ボタンのところで、Pathに、C:\phpを追加します。

```
C:\ProgramData\Oracle\Java\javapath;C:\php
```

注）結構長いのと、既存を消しちゃうと他のプログラムも動かくなる可能性があるので注意してください。
注）セミコロンが区切り文字なので忘れずに。またスペースが入ってしまうと動かないので注意です。

コマンドプロンプトを開いて、

```bat
$php -v
PHP 7.0.7 (cli) (built: May 25 2016 12:52:38) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
```

と打って、バージョンが出れば成功です。

注）環境変数を設定後は、コマンドプロンプトを再起動しないと反映されないので注意です。

パスとか面倒くさいという方は、下記でも良いですが、次のcomposerをセットアップするところで行き詰まるので、composerを使う方は設定してください。

```bat
c:\php\php.exe -v
```

## composerセットアップ
composerは、サードパーティ製モジュールを管理するソフトウェアです。これを使えば、簡単にライブラリをインストール出来るようになります。JavaのGradle、Rubyのgem、Node.jsのnpm、みたいなものです。

[公式ページ](https://getcomposer.org/download/)の手順に従います。

```bat
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('SHA384', 'composer-setup.php') === '070854512ef404f16bac87071a6db9fd9721da1684cd4589b1196c3faf71b9a2682e2311b36a5079825e155ac7ce150d') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
```

最初の行を実行するとエラーが出ると思います。

```bat
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"

Warning: copy(): Unable to find the wrapper "https" - did you forget to
enable it when you configured PHP? in Command line code on line 1
```

エラーメッセージにも書いてありますが、
php.iniを作成して使用モジュールを指定する必要があります。

C:\php\php.ini-developmentのファイルをコピーして、
ファイル名を、php.iniにします。

httpsのリクエストが出来るように、拡張モジュールのコメントアウトを外します。

```ini
;extension=php_oci8_12c.dll  ; Use with Oracle Database 12c Instant Client
extension=php_openssl.dll
;extension=php_pdo_firebird.dll
;extension=php_pdo_mysql.dll
```

P）余談ですが、iniファイルは、セミコロンがコメント行になります。

このような形でエラーが起きた場合や、追加のモジュールが必要なときには、iniファイルの設定値を変える必要があるので、覚えておいてほしいです。

あとは、手順通りに実行していけば、**composer.phar**が、実行したフォルダの中に出来上がっています。下記のコマンドを実行して、エラーが出なければ成功です。

```bat
$ php composer.phar -V
Composer version 1.1.2 2016-05-31 19:48:11
```

以上で、セットアップは終わりです。
composerの使い方は、ググってほしいですm(_ _)m

## PHPのIDEは、Netbeansがおすすめ
PHPのIDEは、無料で使える中では、Netbeansが良いと思います。
PHP7に対応しているのは、現在開発中の次期バージョンなので、[ナイトリービルド](http://bits.netbeans.org/download/trunk/nightly/latest/)のバージョンをインストールしてください。

開発中のバージョンでも安定しています。
（自動更新したら壊れたことがありますが。。。）
（自動更新しなければ良いのです！！）
CakePHP3で最初のマイグレーションファイルを作る

# 環境
- CakePHP 3.2.10
- migrations 1.6.2
    - CakePHP3.2.10に標準で付属してきたもの

# やりたいこと
DBが空の状態でダンプファイルを作り、
`bin\cake migrations dump`
DBを編集後
`bin\cake bake migration_diff Initial`
としてDBの差分から初期のインストーラーに使えそうなマイグレーションファイルを作成しようと思いました。(`Inital`は適当に付けたマイグレーション名)

ただ、DBが空の状態ではダンプファイルが作成されず、
DBを編集後でもダンプファイルを作成することはできませんでした。

どうやらDBに存在しているテーブルがプラグインのテーブルなのかメインのテーブルかを判断するためにモデルから判断しているようなので、とりあえずエラーとしてテーブルが見つかりませんというエラーになっていたようです。

- Slack CakePHP #japanese の chinpei215さん、教えていただきありがとうございました！

# 回避方法
`bin\cake migrations dump`
の代わりに手動でdumpファイルを作成します。(defaultはコネクション名)

```text:config\Migrations\schema-dump-default.lock
a:0:{}
```

これでDBが空っぽの意味になります。

DBにテーブルを作成した状態で、
`bin\cake bake migration_diff Initial`
とすることで空のdumpと現在のDBの差分でマイグレーションファイル
`config\Migrations\タイムスタンプ_Inital.php`
が作成されます。

試しにDBのテーブルをすべて削除して、
`bin\cake migrations migrate`
したところ、まったく同じDBが作成されたので、
初期のマイグレーションファイルを作るにはとても楽な方法じゃないでしょうか。

# オチ（こっちが正解）
`bin\cake migrations dump`
ができないのはモデルが作られていないだけなので、DB作成後
`bin\cake bake all テーブル名`
でモデルも一式生成して、
`bin\cake migrations dump`
`bin\cake bake migration_diff Initial`
とすれば同じように生成されました。
（dumpとDBの内容を比べてるわけじゃないのかな？）

# おしい点
ソースを調べていてなんとなく気づいてはいたのですが、
初期データとして入れたレコード等は一切考慮されないので、差分で作成したマイグレーションファイルに

```
public function up() {
        
        ...
            
        $this->table('users')
            ->insert(
                [
                    [
                      'email'    => 'foo',
                      'password' => 'foo',
                      'created'  => date('Y-m-d H:i:s'),
                    ],
                    [
                      'email'    => 'bar',
                      'password' => 'bar',
                      'created'  => date('Y-m-d H:i:s'),
                    ]
                ]
            )->save();
}
```

という感じで追加するしかなさそう?
jsdoでshadertoy sandbox その4

#概要
jsdoでshadertoyのコードを実行したい。
サウンドの時間を使用したい。
#成果物
http://jsdo.it/ohisama1/ozjo
#写真
![y.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/23a6f2ea-6d19-4550-80ce-a618fbbc8a3d.jpeg)

#サンプルコード
```
precision mediump float;
uniform vec2 iResolution;
uniform float iGlobalTime;
uniform float iChannelTime[4];
uniform sampler2D iChannel0;
    
float beat = 0.;
float mb(vec2 p1, vec2 p0) { 
    return (0.04 + beat) / (pow(p1.x - p0.x, 2.) + pow(p1.y - p0.y, 2.)); 
}
void mainImage(out vec4 fragColor, in vec2 fragCoord)
{
	float ct = iChannelTime[0];
	if ((ct > 8.0 && ct < 33.5)	|| (ct > 38.0 && ct < 88.5) || (ct > 93.0 && ct < 194.5)) beat = pow(sin(ct * 3.1416 * 3.78 + 1.9) * 0.5 + 0.5, 15.0) * 0.05;
	vec2 mbr, mbg, mbb;
	vec2 p = (2.0 * fragCoord.xy - iResolution.xy) / iResolution.y;
	vec2 o = vec2(pow(p.x, 2.), pow(p.y, 2.));
	vec3 col = vec3(pow(2. * abs(o.x + o.y) + abs(o.x - o.y), 5.));
	col = max(col, 1.);
	float t = iGlobalTime + beat * 2.;
	float t2 = t * 2.0, t3 = t * 3.0, s2 = sin(t2), s3 = sin(t3), s4 = sin(t * 4.0), c2 = cos(t2), c3 = cos(t3);
	mbr = mbg = mbb = vec2(0.);
	mbr += vec2(0.10 * s4 + 0.40 * c3, 0.40 * s2 + 0.20 * c3);
	mbg += vec2(0.15 * s3 + 0.30 * c2, 0.10 * -s4 + 0.30 * c3);
	mbb += vec2(0.10 * s3 + 0.50 * c3, 0.10 * -s4 + 0.50 * c2);
	col.r *= length(mbr.xy - p.xy);
	col.g *= length(mbg.xy - p.xy);
	col.b *= length(mbb.xy - p.xy);
	col *= pow(mb(mbr, p) + mb(mbg, p) + mb(mbb, p), 1.75);
    fragColor = vec4(col, 1.);
}



void main() 
{
    vec4 color = vec4(0.0, 0.0, 0.0, 1.0);
    mainImage(color, gl_FragCoord.xy);
    color.w = 1.0;
    gl_FragColor = color;
}   
```
#説明
iChannelTimeを実装した。
サウンドのカレントタイムを流し込む。
git diff でワイルドカード使ってパスを省略する方法


指定したファイルのみを git add したい場合に hogehoge/hoge/hoge.js がフルパスだとしたら

~~~bash
$ git add *hoge.js
~~~

と入力を省略できますが、

git diff で対象ファイルの差分を見たい場合に

~~~bash
$ git diff *hoge.js
~~~

だと

> fatal: ambiguous argument '*hoge.js': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:

と怒られます。

なので2行目の指摘どおりに

~~~bash
$ git diff -- *hoge.js
~~~

とすることで楽して対象ファイルの diff が取れます。
Googleがマテリアルデザインで推奨している色（UIColor）をSwiftから簡単に呼び出せるライブラリ MaterialDesignColorの使い方

[MaterialDesignColor](https://github.com/tichise/MaterialDesignColor)はGoogleがマテリアルデザインで推奨している[カラーコード](https://material.google.com/style/color.html)を簡単に呼び出せるiOSライブラリです。 [cocoapods](https://cocoapods.org/pods/MaterialDesignColor)からダウンロードして使えます。

### Cocoapodsでのインストール

Podfileに以下のように追記します。
```pod MaterialDesignColor```

### 使い方

```
import MaterialDesignColor

textLabel.textColor = MaterialDesignColor.lightGreen400
```

### GoogleMaterialDesignのカラーコードではなくアイコンを利用したい場合
[MaterialDesignSymbol](http://qiita.com/tichise/items/9fd290f1cc2af4796826)はGoogleのマテリアルデザインアイコンをシンボルフォントで呼び出せるiosライブラリです。cocoapodsからダウンロードして使えます。
シンボルフォントなので、コードで自由に色やサイズを変更できます。
AVR開発環境をeclipseで

#概要
Windows上にEclipseでAVRの開発環境を構築します。
将来的に、他のマイコンの開発環境とまとめたい。

ちなみに、備忘録的要素が強いです。
肝心のライタがないので、最後まで動作確認はしていません。


#各種ダウンロードと導入
以下のファイル等が必要です。順次落としながら配置していきましょう。

- eclipse
    - eclipse CDT
    - avr-eclipse プラグイン
- avr8 gnu toolchain
- avrdude
    - libusb
- make
    - Make for Windows
    - libintl
    - libiconv

## eclipse
### eclipse CDT
[eclipse](https://www.eclipse.org/) と [CDT](http://www.eclipse.org/cdt/)が必要。

面倒なので、[ここ](http://mergedoc.osdn.jp/)の物を使います。
今回は、4.5 Marsを使いました。

適当に展開して、起動してください。

### avr-eclipse プラグイン の導入
[avr-eclipse](http://avr-eclipse.sourceforge.net/)を導入します。
詳しくは[ここ](http://avr-eclipse.sourceforge.net/wiki/index.php/Plugin_Download)に書いてあります。

アップデートサイトは
`http://avr-eclipse.sourceforge.net/updatesite/` 


##avr8 gnu toolchain
avr-gcc.exeとかが入ったパッケージです。
[atmelのページ](http://www.atmel.com/ja/jp/tools/atmelavrtoolchainforwindows.aspx#buy)からダウンロードできます。

自己展開形式なので適当なところに展開します。
これ系は、スペースを含むとうまく動かない事が経験上多いので、ドライブ直下にディレクトリを作りました。

##avrdude
AVRのROMやEEPROMを書き込むツールです。
http://www.nongnu.org/avrdude/

"download area"から最新の物をダウンロードします。
今回は avrdude-6.3-mingw32.zip を落としてきました。
これも、適当なところに配置します。

依存するライブラリ libusb を落としてきます。
https://sourceforge.net/projects/libusb-win32/
binの中の、libusb0_x86.dll を libusb0.dll にリネームして、
avrdude.exe と同じディレクトリに置いてください。

##make
Make for Windowsを使います。
http://gnuwin32.sourceforge.net/packages/make.htm
これも、展開して適当なところに配置します。

依存するライブラリである libintl と、liviconv も落としてきます。
http://gnuwin32.sourceforge.net/packages/libintl.htm
http://gnuwin32.sourceforge.net/packages/libiconv.htm
ライブラリは、展開した後で、dllをC:\Windows\SysWOW64の下にコピーしておきます。

#設定
各ツールのパスの設定をします。
ウィンドウ > 設定 で設定を開き、
AVR > path から、今回ダウンロードした各ファイルのパスを指定します。

pathに書いてしまってもOKです。その場合は設定不要です。

#プロジェクトを作る
ファイル > 新規　から Cプロジェクト を選択します。
ウィザードが開くので、プロジェクトタイプから"AVR Cross Target Application"を選んで生成しましょう。

MPUも選択できるので、使うMPUが決まっていればここで選択してしまっても良いと思います。
もちろん後から変更も可能です。
/dev/nullと/dev/zeroの違いまとめ

###はじめに
/dev/nullと/dev/zeroの違いが分かりにくかったので
ddコマンドをつかって、確認してみました。

実際につかってみると、全然違うことがわかりました。

###ファイルを準備します
![スクリーンショット 2016-06-18 18.04.25.png](https://qiita-image-store.s3.amazonaws.com/0/117147/f82be9e3-ccc6-d6bf-ab8a-13caf04b4c2d.png)


まずはテキストファイル「test_dev.txt」を作成しました。
7バイトあります。

###/dev/nullをつかってみる
![スクリーンショット 2016-06-18 18.05.37.png](https://qiita-image-store.s3.amazonaws.com/0/117147/43a4a965-e197-91a0-9fed-b371c2254a04.png)

```:Linux
dd if=/dev/null of=./test_dev.txt
```

ddコマンドで/dev/nullをtest_dev.txtに書き込みます。
結果、ファイルは0バイトになりました。
nullなので空になります、これは分かりやすいですね。



###/dev/zeroをつかってみる
![スクリーンショット 2016-06-18 18.22.15.png](https://qiita-image-store.s3.amazonaws.com/0/117147/54684d28-68de-beaf-0519-a582ad10fbb9.png)

つぎに/dev/zeroをtest_dev.txtに書き込んでみます。

```:Linux
dd if=/dev/zero of=./test_dev.txt
```


![スクリーンショット 2016-06-18 18.24.35.png](https://qiita-image-store.s3.amazonaws.com/0/117147/674085f5-92a7-7399-2c9e-9a167e85ed2d.png)

ファイルシステムが埋まってしまいました！


![スクリーンショット 2016-06-18 18.43.39.png](https://qiita-image-store.s3.amazonaws.com/0/117147/2257e8b7-2966-d730-11fd-1ef7f145e6e0.png)

```:Linux
dd if=/dev/zero of=./test_dev.txt bs=1024 count=1
```

こうすればOKですね。
/dev/zeroは、制限をかけてあげないとファイルシステムが埋まるまで
ゼロで埋めてしまうみたいです。


![スクリーンショット 2016-06-18 18.35.29.png](https://qiita-image-store.s3.amazonaws.com/0/117147/1867f48e-adfa-1985-bd24-791748e2c7e7.png)

ちなみにファイルの中身はこんな感じです。
ひたすら0だけです。

ファイルを0埋めするときや、ファイルシステムのデータ消去で使います。
Entypoをシンボルフォントで呼び出せるSwiftライブラリ EntypoSymbolの使い方

[EntypoSymbol](https://github.com/tichise/EntypoSymbol)は人気のアイコンフォント[Entypo](http://www.entypo.com/)をシンボルフォントで呼び出せるiosライブラリです。[cocoapods](https://cocoapods.org/pods/EntypoSymbol)からダウンロードして使えます。
シンボルフォントなので、コードで自由に色やサイズを変更できます。

### シンボルフォントでアイコンを設定するメリット
iOSアプリの開発でアイコンを用意する際、画像でアイコンを書き出して使う場合は様々な解像度のデバイス向けに画像を用意する必要があり、とても面倒です。

シンボルフォントを使ってアイコンを設定すれば、シンボルフォントはベクターデータなのでどの解像度でもスケーラブルに対応でき、画像を書き出す手間を大幅に減らすことができます。

### Cocoapodsでのインストール
Podfileに以下のように追記します。

```
pod EntypoSymbol
```

### 使い方

#### UIImageで使う方法
```
import EntypoSymbol

var symbol:EntypoSymbol = EntypoSymbol(text:EntypoIcon.install, size:25)
symbol.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor())
var iconImage:UIImage = symbol.imageWithSize(CGSizeMake(25, 25))
```

#### 文字で使う方法

```
import EntypoSymbol

sampleLabel.font = EntypoFont.fontOfSize(40)
sampleLabel.text = EntypoIcon.creativeCommons
```

### 別のフォントを使いたい場合は
EntypoSymbolはアイコンフォントEntypoのみ使えます。Googleのマテリアルデザインアイコンを使いたい場合はEntypoSymbolのMaterialDesign版 [MaterialDesignSymbol](http://qiita.com/tichise/items/9fd290f1cc2af4796826)が使えます。
WordPressの404が出まくる時の覚え書き

OSX Server (El Capitain)でWordpressサイトを作っていて、userdir(/~hoge下）に設置した時に、.htaccessが効かずに各個別ページが404 Not Foundになる現象でハマりました。

現象としては、WordPress管理ページやトップページは開けるものの、それ以外の個別投稿などが全てNot Foundになるというよくあるもの。今回の場合、DocumentRoot下のWordPressでは問題ないので、mod_rewite自体は機能してて、userdirに対するAllowOverrideでFileInfoが許可されていないんだろう、という予測はついたものの、勝手のわからないOSX Serverでまたまたドハマリ。

まず苦労して見つけたユーザ毎のApache設定ファイルが、[別記事](http://qiita.com/do-gugan/items/37b94d3c7b7274e39d9f)の通り、
`/private/etc/apache2/users/hoge.conf`
と判明。ここに、
`AllowOverride FileInfo`
を追加（ディレクティブは最初からあった）。

すると今度は管理ページもトップページも全てForbiddenになるという悪化。そして、mor_rerwiteのログ機能である、

```
RewriteLog /hogefuga/rewrite_error.log
RewriteLogLevel9
```

をhttpd.confに追加してみても、ログで「ミススペルじゃね？」といわれてApacheが起動しなくなる。ログが見られないと、.htaccessのどこが悪いのか検証ができない>_<！と思ったんですが、結局.htaccessには問題がなくて（WordPressの自動生成したものだし）、ディレクティブ内のOptionsにFollowSymLinksが必要、ってだけでしたとさ。

###2017/1/1追記：
Sierraに更新したらまた発生。FollowSymlinksは確かに指定済み。
`/private/etc/apache2/extra/httpd-userdir.conf`
で、
`Include /private/etc/apache2/users/*.conf`
がコメントアウトされてるせいでした。El Capitanでもそうだったか覚えがないですが、とりあえずOSアップグレードでコメントアウトされる可能性があるので注意。
[Chrome] The great suspender 拡張機能でMac OSのスワップを回避

Qiita に書くほどでもないけど、うれしかったので書いておく。

Macbook Pro 2013 のハイエンドに16GBもメモリを搭載しているにもかかわらず、Chrome のメモリ食いによるスワップの発生に長らく閉口していた。特にYouTubeなどの動画ページのタブを開いていると消費が激しい様子。

スワップが繰り返されるとディスクがギガ単位で消費されるので、[日ごとにSSDの残り容量が減少してしまい](http://apple.stackexchange.com/questions/64440/is-there-a-way-to-limit-the-size-of-the-disk-swap-file-in-mac-os-x)、SSDの寿命にも自分の寿命にも悪影響が生じそうで嫌だ。

いっそ MacOS のスワップを止めてしまおうかと思ったけど、副作用が怖いのでやりたくない（一度そっとやってみたらとんでもないことになったので即復旧した）。

そもそも Chrome でタブを数十個とか開いている自分が悪いのだけど、タブが一種のメモ代わりになってしまっていてうかつに閉じたくない。

今日見つけた [The great suspender](https://chrome.google.com/webstore/detail/the-great-suspender/klbibkeccnjlkjkiokjodocebajanakg)を使うと、使っていないタブのメモリを解放してくれるので非常に助かる。設定も別に凝ってないので、適当でよいと思われ。

追記: 念のため、開きっぱなしのタブもなるべく減らすようにした。

以上。
コマンド結果をsqlite3に保存する君

## 使い方

```bash:ヘルプ
$ ./sqlite.sh -h
2016.sqlite3に保存されます。テーブル名は records。
  * 挿入:      コマンド | ./sqlite.sh
  * 参照:      ./sqlite.sh limit値
  * 挿入&参照: コマンド | ./sqlite.sh limit値
```

```bash:dateの結果を保存
date | ./sqlite.sh
date | ./sqlite.sh
```

```bash:直近の1件取得
$ ./sqlite.sh 1
2|2016-06-18 17:53:32|2016年  6月 18日 土曜日 17:53:32 JST
```

```bash:直近の2件取得
$ ./sqlite.sh 2
2|2016-06-18 17:53:32|2016年  6月 18日 土曜日 17:53:32 JST
1|2016-06-18 17:43:12|2016年  6月 18日 土曜日 17:43:12 JST
```

```bash:保存後、結果を表示
$ w | ./sqlite.sh 1
3|2016-06-18 17:58:27| 17:57:23 up 1 day, 12:52,  3 users,  load average: 0.36, 0.29, 0.31
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
user01  tty7     :0               金05   36:56m 11:57   3.86s /usr/bin/lxsession -s Lubuntu -e LXDE
user01  pts/2    :0.0             14:18    3:38m  0.29s  0.00s sh /home/user01/hoge.sh
user01  pts/4    :0.0             14:26    3.00s  3.30s 16.74s xfce4-terminal
```

## ソース

```rb:sqlite.sh
#!/bin/sh
set -eu
Y=`date "+%Y"`
DB="${Y}.sqlite3"
TABLENAME="records"
#----------------------------------------------------------------
help() {
   echo "${DB}に保存されます。テーブル名は ${TABLENAME}。"
   echo "  * 挿入:      コマンド | $0"
   echo "  * 参照:      $0 limit値"
   echo "  * 挿入&参照: コマンド | $0 limit値"
   exit 1
}
create_table() {
    sqlite3 $DB << EOL
create table ${TABLENAME} (
    id integer primary key autoincrement
    ,t timestamp DATE DEFAULT (datetime('now','localtime'))
    ,data text
);
EOL
}
sql() { echo "$@" | sqlite3 $DB; }
show() { echo ".show" | sqlite3 $DB; }
schema() { echo ".schema $1" | sqlite3 $DB; }
insert() { echo "INSERT INTO ${TABLENAME} (data) VALUES ('$@');" | sqlite3 $DB; }
#----------------------------------------------------------------
## ヘルプ
if [ $# -eq 1 ];then
    if [ ${1} = "-h" ];then
        help
    fi
fi
## DB作成
if [ ! -e "${DB}" ];then
    create_table
    schema ${TABLENAME}
fi
## コマンド結果の保存
# -0を付けないと改行が消え1行になるため。
if [ -p /dev/stdin ]; then
    insert "`xargs -0 echo $@`"
fi
## コマンド結果の出力
if [ $# -eq 1 ];then
    # 0<=$1 && $1<=100
    if [ 1 -le ${1} -a ${1} -le 100 ];then
        sql "select * from ${TABLENAME} order by id desc limit ${1};"
        exit 0
    fi
fi
#----------------------------------------------------------------
````

* MIT
パイプが渡されたかそのまま実行されたかを判定(fd)

* コメント欄のほうが詳しいです^^

## 例1

* [シェルスクリプトでパイプからの入力とキーボード入力を区別する](http://rcmdnk.github.io/blog/2014/01/15/coputer-bash-zsh/)

```bash:a.sh
if [ -t 0 ];then
    echo "そのまま実行"
else
    echo "パイプが渡された"
fi
```

```bash:実行結果
$ sh a.sh 
そのまま実行
$ date | sh a.sh
パイプが渡された
```

## 例2

* [シェルスクリプトでパイプを判断する - Qiita](http://qiita.com/b4b4r07/items/77c589f21a99db8bb682#%E8%87%AA%E4%BD%9C%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E3%82%82%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%81%97%E3%81%9F%E3%81%84)

```bash:a.sh
if [ -p /dev/stdin ];then
    echo "パイプで渡された"
else
    echo "そのまま実行"
fi
```
US配列のキーボードのKarabiner preferences

毎回忘れてググってるのでメモ。

## Karabiner(old)

コマンドキー押しただけで「英字/かな」変換できて楽。
![karabiner.jpg](https://qiita-image-store.s3.amazonaws.com/0/3311/8e28a910-24a7-8eea-a924-fc5eb69ffdf8.jpeg)

## Karabiner-Elements

### US配列でコマンドキーを英数/かなとして使う設定

https://pqrs.org/osx/karabiner/complex_modifications/
から For Japanese （日本語環境向けの設定） (rev ?) をダウンロードして設定


### キーリピートの設定

```shell-session
defaults write NSGlobalDomain KeyRepeat -int 1 # キーリピートの速度 1/60 secで指定
defaults write NSGlobalDomain InitialKeyRepeat -int 20 # キーリピート開始までの速度 1/60 secで指定
```

で、再起動。

### キーリピート設定初期化

```shell-session
defaults delete NSGlobalDomain KeyRepeat
defaults delete NSGlobalDomain InitialKeyRepeat
```
スクリーンショット（名前にスペース含むファイル）をまとめて消すコマンド

```zsh
% find . -name 'スクリーン*'
./スクリーンショット 2016-06-18 16.59.14.png
./スクリーンショット 2016-06-18 16.59.23.png
./スクリーンショット 2016-06-18 16.59.27.png
```
こんな状態のときに、まとめて消そうとして、以下のコマンドだとちょっとダメです。


```zsh
% find . -name 'スクリーン*' | xargs rm
rm: ./スクリーンショット: No such file or directory
rm: 2016-06-18: No such file or directory
rm: 16.59.14.png: No such file or directory
rm: ./スクリーンショット: No such file or directory
rm: 2016-06-18: No such file or directory
rm: 16.59.23.png: No such file or directory
rm: ./スクリーンショット: No such file or directory
rm: 2016-06-18: No such file or directory
rm: 16.59.27.png: No such file or directory
```

ファイルにスペースが含まれているので、そこで区切られて`rm`コマンドに渡ってしまいます。なので以下のようにします。

```zsh
% find . -name 'スクリーン*' -print0 | xargs -0 rm
```

ありがとうございました。

# 参考

はじめてNUL文字を知りました。

```zsh:man_xargs
     -0      Change xargs to expect NUL (``\0'') characters as separators, instead of spaces and
             newlines.  This is expected to be used in concert with the -print0 function in
             find(1).
```

```zsh:man_find
     -print0
             This primary always evaluates to true.  It prints the pathname of the current file
             to standard output, followed by an ASCII NUL character (character code 0).
```
Swiftで書かれたRSSパーサー TIFeedParserの使い方

[TIFeedParser](https://cocoapods.org/pods/TIFeedParser)はSwiftで書かれたシンプルなRSSパーサーです。Alamofireなどと一緒に使えばRSSリーダーを簡単に作れます。規格はAtom、RSS1.0、RSS2.0に対応しています。[cocoapods](https://cocoapods.org/pods/TIFeedParser)からダウンロードして使えます。

### Cocoapodsでのインストール

Podfileに以下のように追記します。

```
import TIFeedParser
```

### サンプル
AlamofireでRSS feedを取得してから、返ってきた情報をTIFeedParserでパースしてます。

#### RSS1.0, RSS2.0の場合

```
func loadRSS() {

        let feedString:String = "https://news.google.com/news?hl=us&ned=us&ie=UTF-8&oe=UTF-8&output=rss"

        Alamofire.request(.GET, feedUrlString, parameters:nil)
            .response {request, response, xmlData, error  in

                if (xmlData == nil) {
                    return
                }

                TIFeedParser.parseRSS(xmlData, completionHandler: {(isSuccess, channel, error) -> Void in

                    if (isSuccess) {
                        // self.items = channel.items!
                        // self.tableView.reloadData()
                    } else {
                        if (error != nil) {
                            // print(error?.localizedDescription)
                        }
                    }
                })
        }
    }
```

#### Atomの場合

```
func loadAtom() {

        let feedString:String = "https://news.google.com/news?ned=us&ie=UTF-8&oe=UTF-8&q=nasa&output=atom&num=3&hl=ja"

        Alamofire.request(.GET, feedUrlString, parameters:nil)
            .response {request, response, xmlData, error  in

                if (xmlData == nil) {
                    return
                }

                TIFeedParser.parseAtom(xmlData, completionHandler: {(isSuccess, feed, error) -> Void in

                    if (isSuccess) {
                        // self.entries = feed.entries!
                        // self.tableView.reloadData()
                    } else {
                        if (error != nil) {
                            // print(error?.localizedDescription)
                        }
                    }
                })
        }
    }
```
Mac上にngrokをインストール

ngrok を使って気軽に手元のサーバを外部に公開する方法です

# ngrok とは

ngrok
https://ngrok.com/

自分の手元の環境をそのまま外部からアクセスできるようにするためのツールです。

公開用サーバを立てるのがめんどくさいときなどに便利です。

## インストール (Mac + homebrew)
```
$ brew update
$ brew install homebrew/binary/ngrok2
```


## 起動
80番ポートを外部に公開する
```
$ ngrok http 80
```

## アクセスする
```
$ curl http://[ランダムな文字列].ngrok.io
```

## ユーザー登録
Github, Twitter で認証可能
```
$ ngrok authtoken [サイト上で発行された文字列]
Authtoken saved to configuration file: /Users/[ユーザー]/.ngrok2/ngrok.yml
```

## サブドメイン名を指定して利用
有償プランのみ可能 ($5/month~)
https://dashboard.ngrok.com/billing/plan

```
$ ngrok http 80 --subdomain=hogehogehoge
$ curl hogehogehoge.ngrok.io
```

ビジネスプランに入るとIPアドレスのホワイトリスト設定ができます。
Ransack で年齢を検索する

[Ransack](https://github.com/activerecord-hackery/ransack) は検索機能を簡単なソースコードで実装できる便利な Gem です。
また、Ransack には検索機能を拡張する方法も用意されているので、少し複雑な検索も実装することができます。
今回は年齢を検索する機能を作ってみました。

### 年齢を検索させる

年齢を検索させると言っても、DBに直接年齢が記録されているケースは少ないと思います。
普通に考えるとDBにはユーザーの生年月日を記録させて、データ取得時に今日の日付から年齢に変換しますよね。

なので、実装的には生年月日を入力してユーザーを検索させるフォームを用意する方がはるかに簡単ですが、
利便性を考えたら検索時にも年齢を入力したくなるはずです。

今回は Ransack の検索機能を拡張して、整数型で受け取った年齢をDate型に変換して検索させるようにしてみます。
結果からいうと以下のような実装になるかと思います。

#### Ransack での拡張
```ruby:/config/initializers/ransack.rb
# 生年月日を年齢として検索する。
# xx歳未満
config.add_predicate 'to_age_lt',
  arel_predicate: 'gteq',
  formatter: -> (v) { (v.years.ago + 1.day).to_date },
  type: :integer,
  compounds: false
# xx歳以下
config.add_predicate 'to_age_lteq',
  arel_predicate: 'gteq',
  formatter: -> (v) { ((v + 1).years.ago + 1.day).to_date },
  type: :integer,
  compounds: false
# xx歳以上
config.add_predicate 'to_age_gteq',
  arel_predicate: 'lteq',
  formatter: -> (v) { v.years.ago.to_date },
  type: :integer,
  compounds: false
# xx歳超過
config.add_predicate 'to_age_gt',
  arel_predicate: 'lteq',
  formatter: -> (v) { (v + 1).years.ago.to_date },
  type: :integer,
  compounds: false
```

#### 使い方
```ruby:example.rb
# 18歳以上のユーザーを取得する。
User.search(birthday_to_age_gteq: 18).result 
```

ハマリポイントとしては、誕生日を迎える直前のユーザーの年齢を考慮する点でしょうか。
`((v + 1).years.ago + 1.day)` という箇所がその対応となっています。

また、年齢としては「○○歳以上」、「○○歳以下」という表現ですが、
生年月日的には「年月日以前」、「年月日以降」という表現になるので、
大小比較の演算子が内部で入れ替わる点も考慮が必要です。

### 参考
* [検索用のgem「ransack」を使ってみる](http://qiita.com/LuckOfWise/items/e020e896e71d47d0c6a4)
Googleのマテリアルデザインアイコンをシンボルフォントで呼び出せるSwiftライブラリ MaterialDesignSymbolの使い方

[MaterialDesignSymbol](https://github.com/tichise/MaterialDesignSymbol)はGoogleのマテリアルデザインアイコンをシンボルフォントで呼び出せるiosライブラリです。[cocoapods](https://cocoapods.org/pods/MaterialDesignSymbol)からダウンロードして使えます。
シンボルフォントなので、コードで自由に色やサイズを変更できます。

### シンボルフォントでアイコンを設定するメリット
iOSアプリの開発でアイコンを用意する際、画像でアイコンを書き出して使う場合は様々な解像度のデバイス向けに画像を用意する必要があり、とても面倒です。

シンボルフォントを使ってアイコンを設定すれば、シンボルフォントはベクターデータなのでどの解像度でもスケーラブルに対応でき、画像を書き出す手間を大幅に減らすことができます。

### Cocoapodsでのインストール
Podfileに以下のように追記します。

```
pod MaterialDesignSymbol
```

### 使い方

#### UIImageで使う方法
```
import MaterialDesignSymbol

var symbol:MaterialDesignSymbol = MaterialDesignSymbol(text:MaterialDesignIcon.list48px, size:25)
symbol.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor())
var iconImage:UIImage = symbol.imageWithSize(CGSizeMake(25, 25))
```

#### 文字で使う方法

```
import MaterialDesignSymbol

titleLabel.font = MaterialDesignFont.fontOfSize(20)
titleLabel.text = MaterialDesignIcon.list48px
```

### 別のフォントを使いたい場合は
[MaterialDesignSymbol](https://cocoapods.org/pods/MaterialDesignSymbol)はGoogleのマテリアルデザインアイコンのみ使えます。有名なアイコンフォント Entypoを使いたい場合はMaterialDesignSymbolのEntypo版 [EntypoSymbol](http://qiita.com/tichise/items/0b26a7a47c3862c4ca50)が使えます。

### GoogleMaterialDesignのアイコンではなくカラーコードを利用したい場合
 [MaterialDesignColor](http://qiita.com/tichise/items/d6907d95738673e54bd8)はGoogleがマテリアルデザインで推奨しているカラーコードを簡単に呼び出せるライブラリです。cocoapodsからダウンロードして使えます。
windows7 64bit に mysql5.7をインストール 続き

[前回](http://qiita.com/a_t_a/items/69813e55a1614796059d)からの続き

# はじめに
前回はwindows環境にmysqlサーバをインストールしてみました。
今回は環境変数を設定して、コマンドプロンプトからmysqlにアクセスしてます。

## 設定する前にとりあえず試してみる

コマンドプロンプトを開いて、`mysql --version`と入力してみます。
![image1.png](https://qiita-image-store.s3.amazonaws.com/0/129708/d91df620-5684-30eb-7b29-03f68dabcd37.png)

<br>
じゃあ、どうすればいいかと言うと、実行ファイルが存在するディレクトリまで移動してすればいけます。
![image3.png](https://qiita-image-store.s3.amazonaws.com/0/129708/84b9d048-a254-ab9e-9f21-bfc43653801c.png)


でも、毎回ディレクトリ移動するのってめんどくさすぎる...
そこで出てくるのが環境変数の設定になります。

## 環境変数に設定しよう


コンピューターを開いて「システムのプロパティ」をクリック。
![SnapCrab_NoName_2016-6-18_12-32-38_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/129708/0157b0f0-29b7-64d5-8b20-fc2727ac464d.png)

<br>
「システムの詳細設定」をクリック。
![SnapCrab_NoName_2016-6-18_12-32-57_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/129708/09eb1a47-79ab-b0b1-1103-99095c147633.png)

<br>
「環境変数(N)...」をクリック。
![SnapCrab_NoName_2016-6-18_12-33-8_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/129708/054b54c8-d08c-6c05-4d79-1fc1fd409f88.png)

<br>
「システム環境変数」内の変数名「Path」を選択して、「編集」をクリック
![SnapCrab_NoName_2016-6-18_12-36-38_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/129708/18806d7a-9736-09ff-7f8d-44547ba78d02.png)

※既に設定隅の環境変数を変更したり消してしまったりすると、他のシステムに影響が出るので作業は慎重に。

<br>
「変数値」に`C:\Program Files\MySQL\MySQL Server 5.7\bin`を追加。
環境変数は`;`で区切られているので、後ろに追加する場合は、`;C:\Program Files\MySQL\MySQL Server 5.7\bin`を足す事になります。
![SnapCrab_NoName_2016-6-18_12-36-59_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/129708/93784b3b-a28a-3107-5e71-d78658b2ffb6.png)


<br>
コマンドプロンプトを立ち上げて、`mysql --version`を入力。
![SnapCrab_NoName_2016-6-18_16-3-5_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/129708/e10cf1e8-7348-3733-a88e-412681bc7e5d.png)

うまくいきました。
環境変数に設定すると、カレントディレクトリがどこであっても`mysql`コマンドを実行できるようになります。

※環境変数を設定する前に立ち上げていたコマンドプロンプトだと上手くいかないので注意。
コマンドプロンプト起動時に設定されている環境変数を読み込むようです。
但し、立ち上げたまま読み直すやり方もあるかもしれませんが。




pythonからmysqlへ接続するまでの道のりは続く...
情報科学チートシート

情報科学に関連した問題に関するチートシートです(自分用なため、内容が偏っている可能性が大きいです)。

#漸化式から最悪計算時間の一般項を算出
$\alpha,\beta$を定数とする。
このとき、自然数$n(\ge1)$の大きさの入力データを処理するアルゴリズムの最悪計算時間$T(n)$の漸化式が次のように与えられたとする。

```math
T(n)=\alpha T\left(\left\lfloor \frac{n}{\beta} \right\rfloor\right)+f(n)
```

##(n)がn次式のとき

```math
T(n) = \sum_{i=0}^{\log_\beta n} \alpha^i f\left(\frac{n}{\beta^i}\right)
```

##f(n)が定数のとき

```math
\begin{align}
T(n) &= \sum_{i=0}^{\log_\beta n} \alpha^i f(n) \\
&= \frac{\alpha^{\log_\beta n+1}-1}{\alpha-1} f(n)
\end{align}
```
Elixir基礎文法まとめ

# 整数、浮動小数点

```bash
iex> 1 #整数
1

iex> 0b1001 #2進数
9

iex> 0o777 #8進数
511

iex> 0xF1 #16進数
241

iex> 2.0 #浮動小数点
2.0
```

##四則演算
```bash
iex> 1+2 
3

iex> 3-1
2

iex> 5*4
20

iex> 10/2
5.0 
```
Elixirでは/演算子は常に浮動小数点で返ってくる
整数が欲しい場合は以下のように書く

```bash
iex> div(10,2) #商
5

iex> rem(10,3) # 余り
1
```

```bash
iex> round 5.55 #四捨五入
6

iex> trunc 5.55 #小数点以下切り捨て
5
```

#真偽値
```bash
iex> true
true

iex> true == false
false
```

# アトム
```bash
iex> :atom
:atom

iex> :atom == :sample
false
```

# 文字列
```bash
iex> "elixir"
"elixir"

iex> "hello#{:elixir}"
"helloelixir"

iex> IO.puts "hello\nelixir"
hello
elixir
:ok

iex> byte_size("elixir") #バイト数の取得
6

iex> String.length("helloelixir") #文字数の取得
11

iex> String.upcase("elixir") #大文字に変換
"ELIXIR"
```

#無名関数
```bash
iex> add = fn x,y -> x + y end
#Function<12.50752066/2 in :erl_eval.expr/5>

iex> add.(3,4)
7
```

#リスト
```push
iex> [1,2,3,4,true,"string"]
[1,2,3,4,true,"string"]

iex> length [1,2,3,4,true,"string"]
6

iex> [1,2,3]++[4,5,true,"String"]
[1, 2, 3, 4, 5, true, "String"]

iex> [1,2,3,true,true,"String"]--[3,4,true,"String"]
[1, 2, true]
```

#タプル
```push
iex>  {true, :atom, 1}
{true, :atom, 1}

iex> tuple_size{true, :atom, 1}
3

iex> elem({true,:atom,1},2)
1
```

#キーワードリスト
```bash
iex> list = [{:a,1},{:b,2}] 
[a: 1, b: 2]

iex> list[:a]
1
```

#マップ
```bash
iex> map = %{:hoge =>1, 2=> :elixir}
%{2 => :elixir, :hoge => 1}

iex> map[:hoge]
1


iex> map[2]
:elixir

```

#ディクショナリ
```bash
iex> hoge = []
[]

iex> Dict.put(hoge, :a, 1)
[a: 1]
```
Xcode7.3.xでUITestにライブラリを使用すると実行できない


## 環境
* XCode 7.3.x
* cocoapods 1.0.1
* サンプルプロジェクト名 `UITestExample`

## 問題

`UITest`にライブラリを使用しなければ発生しないと思われますが、UnitTestでも`Qucik`と`Nimble`を使っていたので`UITest`でも使用しようと思った際に出たエラーです。

`Window > Projects`から`DerivedData`を削除してみるも状況は変わらず。

```
2016-06-18 12:31:19.994 XCTRunner[62617:221199] Running tests...
2016-06-18 12:31:20.080 XCTRunner[62617:221199] The bundle “UITestExampleUITests” couldn’t be loaded because it is damaged or missing necessary resources. Try reinstalling the bundle.
2016-06-18 12:31:20.080 XCTRunner[62617:221199] (dlopen_preflight(/Users/dev/Library/Developer/Xcode/DerivedData/UITestExample-bgasnjvgdaszzlexqxadtnetdfri/Build/Products/Debug-iphonesimulator/UITestExampleUITests-Runner.app/PlugIns/UITestExampleUITests.xctest/UITestExampleUITests): Library not loaded: @rpath/Nimble.framework/Nimble
  Referenced from: /Users/dev/Library/Developer/Xcode/DerivedData/UITestExample-bgasnjvgdaszzlexqxadtnetdfri/Build/Products/Debug-iphonesimulator/UITestExampleUITests-Runner.app/PlugIns/UITestExampleUITests.xctest/UITestExampleUITests
  Reason: image not found)
```

## 原因

`cocoapods`がUITestのターゲットの`Build Phases`に`[CP] Embed Pods Frameworks`を含んでいないことによるエラーです。
`UnitTest`のターゲットの`Build Phases`と比べてみると分かりますね。

![スクリーンショット 2016-06-18 13.07.14.png](https://qiita-image-store.s3.amazonaws.com/0/101469/dba614a2-ef55-db56-c6be-6ec7902fc9be.png "スクリーンショット 2016-06-18 13.07.14.png")

![スクリーンショット 2016-06-18 13.07.03.png](https://qiita-image-store.s3.amazonaws.com/0/101469/9e335307-32b7-5190-c2bb-ff2d58c38b4b.png "スクリーンショット 2016-06-18 13.07.03.png")

## 解決
リポジトリ上はすでに修正されていますが、現状(1.0.1)は手動で追加するしかなさそうです。

スクリプトのパスは適宜合わせて下さい。

```
"${SRCROOT}/Pods/Target Support Files/Pods-UITestExampleUITests/Pods-UITestExampleUITests-frameworks.sh"
```

![スクリーンショット 2016-06-18 13.13.54.png](https://qiita-image-store.s3.amazonaws.com/0/101469/f8596399-b92f-7197-bcb3-57cfe69378e1.png "スクリーンショット 2016-06-18 13.13.54.png")

あるいはリリース前の修正を取り込んでしまう方法もあります(未確認)

```bash
gem install cocoapods --pre
```

これで`UITest`が無事に実行されるようになりました。
やはりまだこの辺の情報は少ないですね...解決するのに一苦労。。

## 参考情報

* https://github.com/CocoaPods/CocoaPods/issues/5250
* https://github.com/CocoaPods/CocoaPods/blob/master/CHANGELOG.md
スプレッドシートが存在する同じフォルダに、ファイル出力する

Googleスプレッドシートで、Google Apps Scriptを使って、生成した文字列をシートに出力していたが、
文字数が増えて、1セルに5000文字以上だとエラーになってしまうので、ファイル出力するようにした。

やりたいことは、スプレッドシートが存在する同じフォルダに、ファイル出力することである。

[REFERENCE](https://developers.google.com/apps-script/reference/drive/)を見ながら作成したので、
これが最適かどうかは不明だが、一応動作している。

もっとよいやり方があれば、教えてください。

```js
// --------------------------------------------
// スプレッドシートと同じフォルダに、ファイル出力する。
// --------------------------------------------
// 現在日時を文字列にする。（おまけ。直接関係ない。）
var nowStr = Utilities.formatDate(new Date(), "JST", "yyyyMMddHHmmss");
// ユーザーのルートフォルダにファイルが作られる。（ファイルの中身は、文字列で渡す。）
var newFile = DriveApp.createFile("ABC_" + nowStr + ".txt", "contents");
// ユーザーのルートフォルダを保持しておく。（後で使う）
var originalFolders = newFile.getParents();

// スプレッドシートのファイルIDを取得する。（スプレッドシートのフォルダを取得するため。）
var spreadsheetFileId = SpreadsheetApp.getActiveSpreadsheet().getId();
// スプレッドシートのファイルを取得する。
var spreadsheetFile = DriveApp.getFileById(spreadsheetFileId);
// スプレッドシートの親フォルダのリストを取得する。（スプレッドシートが1つの親フォルダにしかない場合は、1つである。）
var folders = spreadsheetFile.getParents();

// スプレッドシートの親フォルダすべてに、ファイルが見えるようにする。（スプレッドシートが1つの親フォルダにしかない場合は、1つである。）
while (folders.hasNext()) {
	var folder = folders.next();
	folder.addFile(newFile); // ファイル実体は生成されない。フォルダに見えるようになるだけ。
}

// ユーザーのルートフォルダからファイルが見えないようにする。
while (originalFolders.hasNext()) {
	var folder = originalFolders.next();
	folder.removeFile(newFile); // ファイル実体は削除されない。フォルダから見えなくなるだけ。
}
```
Visual Studio Community 2015にサインインできなくなった話(2016/06/18)

# Visual Studio Community 2015にサインインできなくなった話(2016/06/18)
## 話の概要
### Visual Studio Community 2015 にログインできない！？
4月から晴れて貧弱SEとして働き始め、ようやく落ち着いてきたので仕事から離れて趣味でプログラミングがしたいなあと思い始め、以前から興味のあったC#プログラムを書くため、Visual Studio Community 2015を久しぶりに起動した

が、試用期間がどうのこうのと言われ、？？となりつつも、どうやらサインインさえ出来れば使える…らしいとの事なので早速試すもののサインインに失敗する。
原因が何かわからず何度かインストールのし直しを試すも結局効果は出ず、途方に暮れていたものの苦渋の決断をした結果ようやくサインイン出来、使えるようになったのでその備忘録。

## 先に結論
### windows7から不用意にwindows10にアップグレードしてはいけない！
結論から言うと *windows10からwindows7にダウングレードしたPCではVSCommunity2015は動かない* ということである。

### 結論に至る経緯
私は昨年10月頃に不用意にwin10アップグレードしてしまったのだが、(テロがうるさかったのと軽いと評判だったため)それがそもそもの間違いだった。VSCommunity自体を入れたのはおそらく同年の8月あたりで、その時期は他のノートPCをメインに使っていた。アップグレード以前とアップグレード以後現在のPCでVSCommunityを起動することはあまりなかったものの、当時は特に困った記憶もないので問題なく動いていたと思う。

アップグレードから2ヶ月後、使おうと思って購入したソフトがwin10では全く動かず半ば自棄になりつつ元のwin7にダウングレードしたが、それからしばらくVSCommunityを起動することはなかった。そのため発見が遅れ、結論へとはなかなか至らなかった。

問題が発覚したのは今年3月頃、就職に係るごたごたが片付き、あまりにも暇すぎて久々に起動したところ、先の画面に出くわし頭の中に「？？？」が浮かんだものの特に急ぐこともなかったのでこれも先延ばしにしてしまった。

が、先述の通り生活が落ち着いてきたので解決を試みようと何度かアンインストールしてインストールし直しをするも、全く状況が改善せず途方に暮れてしまっていた。

が、あるとき思いつく。

*これVSCommunityじゃなくて、windows側の問題じゃね？*

しかし、私は渋った。ここで再びwin10に戻すとすると、一体何のためにダウングレードしたのか、と。

背に腹は代えられず、また、ダウングレードしてからこっち、なんとなくOSの動作も我慢できなくなってきたので渋々再びアップグレードすることに。

結果、起動したVSCommunityでサインインすることができ、ようやくまともに使えるようになった。というオチ。

## 原因の考察
### windows7はもともとVSCommunity2015に対応していない説
これは[公式](https://www.visualstudio.com/ja-jp/downloads/visual-studio-2015-system-requirements-vs.aspx#1 "Visual Studio 2015 のシステム要件")を参照することで即座に否定される。

> Visual Studio 2015

> Visual Studio Community 2015 with Update 2

> Visual Studio 2015 のインストールについて詳しくは、「Visual Studio のインストール」のページをご覧ください。

> プラットフォームの互換性について詳しくは、「Visual Studio 2015 の互換性」のページをご覧ください。

> サポートされているオペレーティング システム

> Windows 10
> Windows 8.1
> Windows 8
> Windows 7 Service Pack 1
> Windows Server 2012 R2
> Windows Server 2012
> Windows Server 2008 R2 SP1
> 注:Windows 8.1 および Windows Server 2012 R2 にインストールするには、更新プログラム 2919355 が必要です (Windows Update からも入手できます)。

そもそもwin7に対応していれば、もともと動かなかったわけがない。

### ダウングレードの方法がまずかった説
正直しばらくはこれだと思っていた。
リカバリディスクを用いてリカバリする際、*初期化*ではなく*修復*を選択したせいで、PCの内部に矛盾が生じエラーが発生したと考える見方である。

というのも、修復してダウングレードしたwin7は*Internet Explorerがインストール出来ない*のである。
もちろん、私も世の流れに逆らわずChromeを愛用していたのだが、VSCommunityをインストールする際、「IEちゃんがいないと僕は全力出せないよ！」とVSCommunityが駄々をこねるのである。(どんなマセガキだ)
仕方なく、IEをインストールしようとするも、エラーログだけ吐いてインストール出来ない。

無理やりVSCommunityをインストールすると警告が出たままインストールが終了する(もちろんサインイン出来ずソフトは使えない)ため、初期化しないとだめかもと思っていた時期がしばらく続いた。

実際試してはいないが、もしかしたらwin7へ修復ではなく初期化すれば、まだ望みはあるのかもしれない。

## まとめ
### Microsoftからのテロに日々抗っているレジスタンスの方(絶対にwin10にはしないと決め込んでいる方)へ
あと1ヶ月半ほどの辛抱です。
何がなんでもwin7ちゃんを死守してあげましょう。

### Microsoftからのテロに屈してしまった方、あるいは屈しそうになっている方(すでにwin10にアップグレードしてしまった、あるいはアップグレードを検討している方)へ
もしもあなたがVSCommunityにかぎらずVS系ソフトを今後も使いたいのであれば、綺麗さっぱりwin7のことは諦めましょう。恋愛にかぎらず未練を残すと大変なことになります。
もしどうしても諦めきれないのであれば、大事なデータを持って新しい場所でやり直す(初期化する)のも一つの案かもしれません。

## 最後に
### ここまでお読みいただきありがとうございました。
PHPからTwitterに投稿する

# やりたいこと

PHPスクリプトからTwitterに任意の文字列を投稿したい。
今後のために、できるだけ汎用性を持たせたい。
スクリプトやライブラリをポン置きで使えるようにしたい。

# 動作確認環境、使用ライブラリ等

- Twitter App https://apps.twitter.com/
- Fedora 24 Server Edition 64bit
- PHP 5.6.22
 - Twitter OAuth https://twitteroauth.com/


# サンプルコード

```php:tweettest.php
<?php
require "twitteroauth/autoload.php";
use Abraham\TwitterOAuth\TwitterOAuth;

$consumerKey = "your consumer key";
$consumerSecret = "your consumer secret";
$accessToken = "your access token";
$accessTokenSecret = "your access token secret";

$twitter = new TwitterOAuth($consumerKey, $consumerSecret, $accessToken, $accessTokenSecret);

$result = $twitter->post(
        "statuses/update",
        array("status" => "本日ハ晴天ナリ")
);

if($twitter->getLastHttpCode() == 200) {
    // ツイート成功
    print "tweeted\n";
} else {
    // ツイート失敗
    print "tweet failed\n";
}

```

# 簡単な解説

コンシューマ（API）キーやアクセストークンは、Twitter Appを作成したときにもらえる。
あとは、TwitterOAuthのお作法に従えばOK

# 所感

え？これだけでいいの？

案外好評のようなので、他のメソッドについてもテストしてまとめました。
よろしければご覧ください。
http://qiita.com/kumasun/items/70f035a7d214d69d62c1
MacとかCentOSとか気にせずtmux2.1を一発でインストールする

MacとかCentOSとかいろんな環境で`.tmux.conf`を使いまわすために、なるべく2.x系を各環境に入れておきたい。Macのbrewだと今2.1が入るので問題ないが、CentOS7のデフォルト状態でyumから入れると、1.8が入ってしまう。

そこで、OSの判定をして、Linuxの場合はソースからビルドするようにスクリプト化する。ついでにtmuxのプラグイン管理ツールであるtpmも存在しない場合は入れるようにしておく。最新の2.2ははまりポイントが多そうなのでとりあえず2.1にしておく。

（追記） sudoで`brew install`してしまうようになっていたので、実行時sudoしないように修正

```bash:install_tmux.sh
!/bin/bash

VER="2.1"

if type tmux >/dev/null 2>&1 ; then
    echo "tmux has already been installed."
else
    case ${OSTYPE} in
        darwin*)
            brew install tmux
        ;;
        linux*)
            echo "Installing tmux ${VER}..."
            yum install -y wget gcc libevent-devel ncurses-devel
            rm -rf /tmp/tmux-${VER}.tar.gz /tmp/tmux-${VER}
            cd /tmp && wget https://github.com/tmux/tmux/releases/download/${VER}/tmux-${VER}.tar.gz && tar xvf tmux-${VER}.tar.gz
            cd /tmp/tmux-${VER} && ./configure && make && sudo make install
            rm -rf /tmp/tmux-${VER}.tar.gz /tmp/tmux-${VER}
            echo "Done"
        ;;
    esac
fi

if [ ! -d $HOME/.tmux/plugins/tpm ] ; then
    echo "Installing tpm..."
        git clone https://github.com/tmux-plugins/tpm $HOME/.tmux/plugins/tpm
    echo "Done"
fi
```

### 使い方

```bash
$ ./install_tmux.sh
...略...
$ tmux -V
tmux 2.1
```

### 備考
- [tpm](https://github.com/tmux-plugins/tpm): tmux用のプラグイン管理ツール
pyenvでAnacondaをインストールする方法

こんにちは。ジャックです。MacにPython＆データ分析環境を構築したいと模索していたらAnacondaという便利なツールに遭遇。
pip等を使ってnumpyとかのインストールを試みていたのですが、なぜかうまくインストールできず…。
Anacondaは即インストールできたので、その手順をメモしました。

# Anacondaのバージョンを確認する
pyenvでAnacondaのバージョンを確認してみましょう。

```zsh
% pyenv install anaconda
python-build: definition not found: anaconda

The following versions contain `anaconda' in the name:
  anaconda-1.4.0
  anaconda-1.5.0
  anaconda-1.5.1
  anaconda-1.6.0
  anaconda-1.6.1
  anaconda-1.7.0
  anaconda-1.8.0
  anaconda-1.9.0
  anaconda-1.9.1
  anaconda-1.9.2
  anaconda-2.0.0
  anaconda-2.0.1
  anaconda-2.1.0
  anaconda-2.2.0
  anaconda-2.3.0
  anaconda-2.4.0
  anaconda-4.0.0
  anaconda2-2.4.0
  anaconda2-2.4.1
  anaconda2-2.5.0
  anaconda2-4.0.0
  anaconda3-2.0.0
  anaconda3-2.0.1
  anaconda3-2.1.0
  anaconda3-2.2.0
  anaconda3-2.3.0
  anaconda3-2.4.0
  anaconda3-2.4.1
  anaconda3-2.5.0
  anaconda3-4.0.0

See all available versions with `pyenv install --list'.

If the version you need is missing, try upgrading pyenv:

  brew update && brew upgrade pyenv
```

# Anacondaをインストールする
こちらもpyenvで下記コマンドを叩けばインストールされます。

```zsh
% pyenv install anaconda3-4.0.0
Downloading Anaconda3-4.0.0-MacOSX-x86_64.sh...
-> https://repo.continuum.io/archive/Anaconda3-4.0.0-MacOSX-x86_64.sh
Installing Anaconda3-4.0.0-MacOSX-x86_64...


Installed Anaconda3-4.0.0-MacOSX-x86_64 to /Users/yamashita_kazuhiko/.pyenv/versions/anaconda3-4.0.0
```
公開鍵・秘密鍵の作成とSSH接続まとめ

http://qiita.com/shizuma/items/2b2f873a0034839e47ce

- 鍵を入れるフォルダに移動

```
$cd ~/.ssh
```

#名前をつけて作成する

```
$ssh-keygen -t rsa
```

- 上記コマンドでエンター。


- Generating public/private rsa key pair.と表示される。
- 名前を入力する

```
hoge_huga
```

- エンター

```
Enter passphrase (empty for no passphrase):
と表示される
```

- パスコードを入力
- エンター

```
Enter same passphrase again:
```

- パスコードを入力
- エンター

秘密鍵と公開鍵が作成される


秘密鍵の権限を変更した
```
$ chmod 600 hoge_huga
```

サーバにクライアントの公開鍵をアップしたのは
サーバがクライアントへ情報を送る時はアップした公開鍵で暗号化して送信してください。という意味。

##SSHのやり取りの流れ

① クライアントがサーバに公開鍵（暗号化するもの）を渡す
② ユーザがログイン
③ サーバが乱数を生成し、公開鍵と乱数で暗号文を作成
     乱数をハッシュ化して保持
④ サーバがクライアントに暗号文を送信
⑤ クライアントは秘密鍵（複合化するもの）で複合化
     乱数からハッシュ値を計算し、サーバに送信
⑥ サーバは受け取ったハッシュ値と③で作成したハッシュ値を比較
     一致していれば認証OK
Let's Encrypt の SSL 証明書を CloudFlare を使って DNS-01 で取得する 

本記事では、Let's Encrypt、CloudFlare、DNS-01 についての説明は一切ありません。また、インフラ初心者が執筆している（覚書）のでご注意ください。

## CloudFlare の API Key を取得

CloudFlare の [My Account](https://www.cloudflare.com/a/account/my-account) ページにアクセスします。そのままページをスクロールすると API Key という項目があり、右側に View API Key というボタンがあるのでクリックします。表示された、API Key をメモしておいてください。

## Let's Encrypt の SSL 証明書を取得する

以下がコマンド一覧です。pip コマンドがないよ！というエラーが出力された場合、`$ yum -y install python python-pip` という感じで、インストールしてください。だいたいの場合、python はインストールされていると思うので、python-pip だけで大丈夫だと思います。

所々にコメントを入れていますので、参考にしてください。

```bash
$ git clone https://github.com/lukas2511/letsencrypt.sh /usr/local/letsencrypt.sh
$ git clone https://github.com/kappataumu/letsencrypt-cloudflare-hook /usr/local/letsencrypt.sh/hooks/cloudflare
$ cd /usr/local/letsencrypt.sh/
$ pip install -r ./hooks/cloudflare/requirements.txt          # Python 3 用 ? CloudFlare Hook のマニュアル必読
$ pip install -r ./hooks/cloudflare/requirements-python-2.txt # Python 2 用 ? CloudFlare Hook のマニュアル必読
$ export CF_EMAIL='YOUR CLOUDFLARE LOGIN EMAIL ADDRESS'
$ export CF_KEY='YOUR CLOUDFLARE API KEY'
$ export CF_DNS_SERVERS='8.8.8.8 8.8.4.4'                   # 必要に応じて実行 CloudFlare Hook のマニュアル必読
$ vi ./domains.txt                                          # 半角スペース区切りでドメインをリスト化 letsencrypt.sh のマニュアル必読
example.jp www.example.jp
$ mkdir /usr/local/letsencrypt.sh/.acme-challenges          # アーカイブ用ディレクトリの作成
$ /usr/local/letsencrypt.sh/letsencrypt.sh -c -t dns-01 -k '/usr/local/letsencrypt.sh/hooks/cloudflare/hook.py'
```

### 発行される証明書

* サーバ証明書（公開鍵）  
/usr/local/letsencrypt.sh/certs/example.jp/cert.pem
* 中間証明書  
/usr/local/letsencrypt.sh/certs/example.jp/chain.pem
* サーバ証明書 + 中間証明書   
/usr/local/letsencrypt.sh/certs/example.jp/fullchain.pem
* 秘密鍵  
/usr/local/letsencrypt.sh/certs/example.jp/privkey.pem

## Let's Encrypt の SSL 証明書を自動取得する

Cron 登録用のスクリプトを作成。

```
$ vi /usr/local/letsencrypt.sh/cron.sh
```

以下をペースト。letsencrypt.sh のオプションの詳細は、letsencrypt.sh のマニュアル、または help コマンドを実行してください。

```bash
#!/usr/bin/env bash

export CF_EMAIL='YOUR CLOUDFLARE LOGIN EMAIL ADDRESS'
export CF_KEY='YOUR CLOUDFLARE API KEY'

/usr/local/letsencrypt.sh/letsencrypt.sh \
-c \
-x \
-t dns-01 \
-k '/usr/local/letsencrypt.sh/hooks/cloudflare/hook.py'

/usr/local/letsencrypt.sh/letsencrypt.sh -gc

systemctl restart nginx
```

実行権限を付与

```
$ chmod +x /usr/local/letsencrypt.sh/cron.sh
```

Job を登録

```
$ crontab -e
0 4 1 * * /usr/local/letsencrypt.sh/cron.sh >> /usr/local/letsencrypt.sh/cron.log 2>&1
```

以上で終了です。

## あとがき

Certbot を使用した SSL 証明書の取得の場合、サーバーの公開ディレクトリに .well-known というディレクトリが作られたりして、何だか気になっていました。DNS-01 を使用した方法の場合、そういった何だか気になるディレクトリが作られたりしないので、筆者個人としては、DNS-01 を使用した方法の方がいいなーと思います。また、両方トライしてみた経験から、DNS-01 を使用した方法の方が、簡単に感じました。

※ プラグインに webroot を使用した場合、.well-known というディレクトリが作られます。その他のプラグイン（Apache、nginx、etc）は未確認です。

## 参考サイト
* [From StartSSL to Let's Encrypt, using CloudFlare DNS](http://kappataumu.com/articles/letsencrypt-cloudflare-dns-01-hook.html)
* [Let’s EncryptのDNS-01を使用して無料のSSL証明書をWebサーバなしで取得する](http://www.xmisao.com/2016/04/18/get-free-certification-by-letsencrypt-dns-01-authentication.html)
JavaScriptの自分用メモ

JavaScript関係の自分用メモです。

### Disabledな要素はイベント発火できない
HTMLでの"Disaled"は見た目だけでなく、機能的にDisabledのようです。
当然といえば当然な気がしますが、私は「見た目をDisabled」にするためDisabled属性を付けるときが多いので、時折この仕様を忘れます。
ちなみに、非表示の場合は発火可能です。
以下、サンプルソースです。

```html
<button id="disabledButton" onclick="console.log(event.target.id)" disabled>Disabled Button</button>
<button id="hiddenButton" onclick="console.log(event.target.id)" style="display:none;">Hidden Button</button>
```

```js
document.getElementById("disabledButton").click(); //出力されない
document.getElementById("hiddenButton").click(); //"hiddenButton"が出力
```
プロデルでも愛が生まれた

[プロデル](http://rdr.utopiat.net/)でも愛が生まれました。
文字通り一言で愛が生まれます。

プロデル 1.5.813で動きます。

```プロデル:愛が生まれた.rdr
「生」の文字番号と「死」の文字番号の論理積を文字化して出力する
```

##元ネタ・参考
[愛が生まれた](http://qiita.com/dongri/items/041ff3e7dde6c99beeb0)
[なんで愛が生まれるのか](http://qiita.com/tienlen/items/44daf3a52eb872085556)


##Web版プロデルでの実行結果
デスクトップ版または[Web版プロデル](http://rdr.utopiat.net/play/)で動かせます。

![tw-rdr-160618.png](https://qiita-image-store.s3.amazonaws.com/0/101225/9da32116-6884-27fb-5391-6c0357f1a530.png)

##命令の説明
「出力する」 http://rdr.utopiat.net/docs/reference/core/core.htm#出力する
「論理積」 http://rdr.utopiat.net/docs/reference/core/math.htm#論理積
「文字番号」 http://rdr.utopiat.net/docs/reference/primitive/string.htm#文字番号
[メモ] RaspberryPiとCygwin/X (SSHのX11転送)

## 概要
- [gnupack](https://osdn.jp/projects/gnupack/)-devel をベースに、Cygwin/Xを導入(`apt-cyg install xinit`一発)
- ssh で、`-X`(大文字X)オプションで、X11 forwarding接続。<br>ちなみに、小文字`-x`は、` -x   Disables X11 forwarding.`と、`man ssh`に。
- Raspberry PiのターミナルをWindowsで開く
- Win10から、Cygwinのコマンドウィンドウひらいて、sshでX11転送(`-X`)オプション付きで、らずぱい接続して、らずぱいのターミナルを表示。
<br>![Xwin2.png](https://qiita-image-store.s3.amazonaws.com/0/75594/6e9bc28f-d578-ded7-ac90-fc73dbd0636c.png)

## 環境
- Windows 10 64bit
- Raspberry Pi 3
- `2016-05-27-raspbian-jessie.img` Xつかうよー。
- 日本語フォントとして、`noto-japanese-fonts`導入


## 手順
### gnupack, Cygwin/X 導入
1. [gnupack](https://osdn.jp/projects/gnupack/)ページから、[gnupack-pretest_devel-2015.11.15.exe](https://osdn.jp//projects/gnupack/downloads/64040/gnupack-pretest_devel-2015.11.15.exe/)をダウンロード
2. 実行すると、解凍先を聞かれるので、`C:\`といれる。
3. `C:\gnupack-pretest_devel-2015.11.15`を`C:\gnupack`へリネーム
4. (オプション)`cmd.exe`を開いて、<br>`mklink /J C:\Cygwin C:\gnupack\app\cygwin\cygwin`

    ```
C:\>mklink /J C:\Cygwin C:\gnupack\app\cygwin\cygwin
C:\Cygwin <<===>> C:\gnupack\app\cygwin\cygwin のジャンクションが作成されました
```
    - リンク削除は、`rmdir C:\Cygwin`
    - ふつうにCygwinを入れると、このへんにインストールされるので、気持ち、リンクでも張っておこうかと。(C:\Cygwinにあるのを前提で、スクリプト組んでたりする者がいる。社内とかのプロジェクトとかさ)
5. `C:\gnupack\startup_cygwin.exe`を実行<br>=>bashがひらく
6. `apt-cyg install xinit xeyes noto-japanese-fonts`<br>を実行して、X関連と、テスト用のxeyesを入れる。
7. 待つ
8. `run xwin -multiwindow; export DISPLAY=:0.0`<br>X server起動
9. `xeyes.exe`
    - 目玉<br>![Xwin1.png](https://qiita-image-store.s3.amazonaws.com/0/75594/3c6b050b-55b6-e34f-d17b-3c504965571f.png)
10. `xterm -bg black -fg gray &`<br>ターミナル起動<br># `&`はバックグラウンドで起動

### らずぱいの`lxterminal`をWindowsのXで表示
1. `C:\gnupack\startup_cygwin.exe`を実行
2. X起動してなかったら、X server起動<br>`run xwin -multiwindow; export DISPLAY=:0.0`
3. `ssh -X pi@<らずぱいのIP>`<br>で、らずぱいに接続. パスワード入れてログインする。
4. `lxterminal &` <br>`lxterminal`がWindowsで開く.

![Xwin2.png](https://qiita-image-store.s3.amazonaws.com/0/75594/6e9bc28f-d578-ded7-ac90-fc73dbd0636c.png)


\# ssh接続切ると、立ち上げてるものがみんな落ちる. (sshのおかげで、つながっている)


## その他
- かなり前から使わせてもらってますが、gnupackさいこー
- スクショがでかくてすいません...
JavaScriptで、文字列を、指定した文字数で分割して、配列で返す

JavaScriptは詳しくないが、
「JavaScriptで、文字列を、指定した文字数で分割して、配列で返すメソッド」
が欲しかったので書いてみた。
他のやり方、ライブラリーなどあれば、知りたいなぁ。

```js
function splitByLength(str, length) {
	var resultArr = [];
	if (!str || !length || length < 1) {
		return resultArr;
	}
	var index = 0;
	var start = index;
	var end = start + length;
	while (start < str.length) {
		resultArr[index] = str.substring(start, end);
		index++;
		start = end;
		end = start + length;
	}
	return resultArr;
}

console.log(splitByLength("abc", 3)); // ["abc"]
console.log(splitByLength("abcdefghij", 3)); // ["abc", "def", "ghi", "j"]
console.log(splitByLength("abcdefghijk", 3)); // ["abc", "def", "ghi", "jk"]
console.log(splitByLength("abcdefghijkｌ", 3)); // ["abc", "def", "ghi", "jkｌ"]
console.log(splitByLength("abcdefghijkｌ", 0)); // []
console.log(splitByLength("abcdefghijkｌ", 1)); // ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "ｌ"]
console.log(splitByLength("", 1)); // []
```
【忘備録】iBatis2

iBatis2に関するメモ書きです。

[iBatis2の日本語マニュアル](http://svn.apache.org/repos/asf/ibatis/java/ibatis-2/trunk/ibatis-2-docs/ja/iBATIS-SqlMaps-2_ja.pdf)

# removeFirstPrepend

>初めの入れ子のタグが生成するタグのprependを削除する

例えばnameまたはvalueで絞り込みたいため、下記のSQLを記述したとします。

```xml
WHERE
 <isNotEmpty property="name" prepend="AND">
    name = #name#
 </isNotEmpty>
 <isNotEmpty property="value" prepend="AND">
    value = #value#
 </isNotEmpty>
```

nameかvalueのどちらかは必ずNotEmptyになるので、WHERE句をdinamicタグを使わずに記述しています。

nameがNotEmpty、valueがEmptyのとき、`WHERE AND name=#name#`が出力され、SQL構文エラーになります。
この場合`removeFirstPrepend="true"`を付与すれば、最初の要素にはANDが付かず、正しいSQL文が出力されます。

```xml
WHERE
 <isNotEmpty property="name" prepend="AND" removeFirstPrepend="true">
    name = #name#
 </isNotEmpty>
 <isNotEmpty property="value" prepend="AND" removeFirstPrepend="true">
    value = #value#
 </isNotEmpty>
```

# `#`, `$`のエスケープ
`##`, `$$`と2回連続で記述します。

http://www.canetrash.jp/article/2451052.html 参考
sbtからGatling


sbtからGatlingによる負荷テストが実施できるようにするための手順

# なぜsbtからGatlingによるテスト実施がしたかったか

テストシナリオをブラウザ操作記録ではなく、自力作成する際にIDEで作成したかったのが大きな動機でした

# 環境準備

## デモプロジェクト取得

[gatling-sbt-plugin-demo](https://github.com/gatling/gatling-sbt-plugin-demo) が公開されているのでこのプロジェクトを利用しました。

今回はデモプロジェクトをforkし作業を進めます。
作業に利用したプロジェクトはこちらです。[作業用プロジェクト](https://github.com/cafepanse/gatling-sbt-plugin-demo)

## テスト実行

以下コマンドでテスト実行できれば環境構築は完了です。

	$ sbt
	> gatling:test


# 代表的なコマンド

## ブラウザ操作記録開始

	> startRecorder

## テスト結果レポート表示

	> lastReport
	
## configファイル作成

gatling.conf、recorder.confが存在しない場合、作成してくれます。

	> copyConfigFiles


## ログ設定フィアル作成

デフォルト設定のlogback.xmlを作成してくれます。

	> copyLogbackXml