OmniAICreator/Qiita-1.07M huggingface dataset:
JavaでのDBのテストデータ作成はDbSetupが楽


Javaでのデータベースのテストデータ作成にはDBUnitがよく使われますが、自分はDbSetupをオススメします。

- [DbSetup](http://dbsetup.ninja-squad.com)

# なぜDBUnitがイマイチなのか

自分も最初はDBUnitを使ってたのですが、以下の理由からしっくり来ませんでした。

## DBを使ったテストでは少量のデータを使うことが多い

ホワイトボックステストで大量のデータを使うことはほとんどなく、単一または複数のテーブルに対して、少量のデータを用意するケースがほとんどです。なので、テストごとにファイル(XML or Excel)を用意するのは面倒です。

## テストコードとデータが分離している

テストデータを外部ファイルに保存するため、テストコードとテストデータが分離してしまっています。そのため、何をテストしているのかが分かり辛いです。

## そこでDbSetup

そこで見つけたのがDbSetupです。DbSetupはテストデータをJavaコードとして書きます。そのため、少量のテストデータが書きやすく、テストコードとテストデータの位置が近いため、何をテストしているのかが分かりやすいです。

# DbSetupの使い方

## Destinationオブジェクト

まず接続に必要なDestinationオブジェクトですが、これは2通りの方法で書けます。

```java
// 1. javax.sql.DataSourceから構築
Destination dest = new DataSourceDestination(datasource);

// 2. URL, User, Passwordから構築
Destination dest = new DriverManagerDestination(url, user, password);
```

## テストデータの準備

DbSetupのテストデータは、「テスト対象テーブルのクリア」「テストに必要な小さなデータの定義」の2つからなります。

### クリアするテーブルの指定

以下のように、テストで使用するテーブルをクリアするための、Operationオブジェクトを作成します。

```java
import static com.ninja_squad.dbsetup.Operations.*;

// deleteAllFromは複数指定も可能(可変長引数)
public static final Operation DELETE_ALL = deleteAllFrom("character");

// truncateを使う場合
public static final Operation TRUNCATE = truncate("character");

// 一部分だけ削除したいときはSQLを直接書く
public static final Operation DELETE_PARTIAL = sql("delete from character where age < 20");
```

### データの定義

以下のように、テストデータを定義します。まずは、最初に列名を定義してからデータを入れる方法です。

```java
import static com.ninja_squad.dbsetup.Operations.*;

public static final Operation INSERT =
  // テーブルの指定
  insertInto("character")

  // 全てのレコードに同じ値をセットする場合
  .withDefaultValue("gender", "女性")

  // 列の定義
  .columns("headgear", "clothing", "shoes")

  // 1つ目のレコード
  .values("ヘッドバンド ホワイト", "わかばイカT", "キャンバス ホワイト")

  // 2つ目のレコード
  .values("フェイスゴーグル", "スクールブレザー", "パワードレッグス")

  // Operationオブジェクトを作成
  .build();
```

もう一つは、列と値を同時にセットする方法です。こちらの方が少し冗長ですが、列が多い場合はこちらの方が見やすいので、使い分けてください。Mapから作成する方法もあります。

```java
import static com.ninja_squad.dbsetup.Operations.*;

public static final Operation INSERT =
  // テーブルの指定
  insertInto("character")

  // 全てのレコードに同じ値をセットする場合
  .withDefaultValue("gender", "女性")

  // 1行目の作成
  .row().column("headgear", "ヘッドバンド ホワイト")
        .column("clothing", "わかばイカT")
        .column("shoes", "キャンバス ホワイト")
        .end()

  // 2行目の作成
  .row().column("headgear", "フェイスゴーグル")
        .column("clothing", "スクールブレザー")
        .column("shoes", "パワードレッグス")
        .end()

  // Operationオブジェクトの作成
  .build();
```

### Operationをつなげる

バラバラに作成したOperationオブジェクトを実行したい順番に繋げて、1つのOperationオブジェクトにします。Operationはバラバラに作成できて、かつオブジェクトを生成した段階では何も行われないため、複数のクラス間で共有することも容易です。

```java
import static com.ninja_squad.dbsetup.Operations.*;

Operation ops = sequenceOf(DELETE_ALL, INSERT);
```

## そして実行

最後に、DbSetupクラスにDestinationとOperationを渡すことで、実行されます。

```java
DbSetup dbSetup = new DbSetup(dest, ops);
dbSetup.launch();
```

# 最後に

DbSetupは他にもいろいろ機能がありますが、APIドキュメントを見れば分かるように、とてもシンプルで、実行も速いです。日本では全く知られてないのがもったいないです。検討してみてはどうでしょうか。
EC2のuser-dataで起動時shell scriptを書く

EC2を立ち上げるのに設定を進めていくと、Configure Instance Detailsの下にAdvanced Detailsというところがあります。それを覗くとUser dataってのがあります。
これで、インスタンス作成時に実行してほしいシェルスクリプトとかcloud-initとかかけるんです。sshログインしなくてもchef-soloとか実行できちゃうんですねえ。

しかし、User dataって**インスタンス作成時**にしか動いてくれないんです。
つまり**restartでは実行されない**。

わたしはrestartでchefを実行したかったのでしばし悩みました。
(ベストプラクティスかは分かりませんが、インスタンス立ち上げ直すよりお金かからないので)

そこで、思いついたのがこんなん。

~~~bash:User_data
#!/bin/bash

# インスタンス作成時のみ実行するもの
yum install git
yum install "chefのrpm"
git clone https://cookbookのレポジトリ

cat <<EOF >> /etc/rc.local

# インスタンス起動時/再起動時に実行するもの
cookbookをgit pullとかberksとかchef-soloとか(雑

EOF
~~~

気になるのはインスタンス作成時の実行順ですが、

1. User dataに書いたスクリプト
1. /etc/rc.local

なのでご安心を。

User dataの実行logは、
`/var/log/cloud-init-output.log`

chefじゃなくても何か活用できそう
c++ builder > TColorBox > TColorの取得 > int itemIndex = ColorBox1->ItemIndex; TColor col = ColorBox1->Colors[itemIndex];

```txt:動作確認
C++ Builder XE4
```

TColorBoxで選択した色情報の取得。

```
int itemIndex = ColorBox1->ItemIndex;
TColor col = ColorBox1->Colors[itemIndex];

Chart1->Series[0]->SeriesColor = col;
```
c++ builder XE4, 10.2 Tokyo > TColorBox > clBlueなどを"青色"などにする > Style.cbPrettyNames = true

```txt:動作確認
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/26)
```

TColorBoxのリスト表示を「clBlue」などから「青色」に変更するには。

オブジェクトインスペクタにて
Style -> cbPrettyNames = true
にする。
Titanium alloy の国際化まとめ


Titaniumの国際化については、ドキュメント(英語です)に詳しく書いていますが、日本語で最近の情報について纏まった資料が無い事と、ドキュメントに無い知見をシェアするためスライド作りました。

<iframe src="//www.slideshare.net/slideshow/embed_code/key/2Cv0u1er7FiBwT" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/tdtsh/titanium-alloy" title="Titanium alloy で国際化のススメ" target="_blank">Titanium alloy で国際化のススメ</a> </strong> from <strong><a href="//www.slideshare.net/tdtsh" target="_blank">Tadatoshi Hanazaki</a></strong> </div>



主に動作はSDK 4.0.0.GAで検証しています。

設定ファイル等は最初にやってしまえばあとは流れで特に苦にならないと思いますし、メリットもあります。折角アプリ作れるんですから、より多くのターゲットに使ってもらえる様にしたいですね。
qiita > ":"で検索できるようにして欲しい

bashの処理で":"を使うものが過去の人気投稿にあったが、検索しようとしても一切検索にひっかからなかった。

検索ボックスに「tag:xxx」などのように入力して検索するため、キーワードの":"は削除されるのだと推測される。

検索ボックスに```「\:」```など記載した場合は":"でも検索されて欲しい。
c++ builder XE4, 10.2 Tokyo > TeeChart > シリーズの線の色、太さ変更 > Chart1->Series[0]->SeriesColor / Chart1->Series[0]->Pen->Width

```txt:動作環境
C++ builder XE4
    TeeChart Lite v2013.08.130414
RAD Studio 10.2 Tokyo Update 2 (追記 2018/01/10)
    TeeChart v2016.17.160129 32bit VCL
```

シリーズ(Fast Line)の線の変更

```cpp
Chart1->Series[0]->SeriesColor = clBlue;

Chart1->Series[0]->Pen->Width = 5;
```
技術英語 > conceal that fact

@ Star trek Voyager > エピソード Eye of the needle.

偽装船について艦長と副長の話し合いの中で
> He might want to conceal that fact.

<hr>
http://ejje.weblio.jp/content/conceal
> 〈ものなどを〉隠す 

<hr>
化粧品でコンシーラーというのがあるのを思い出した。

肌荒れやクマを隠すなどの用途で使うとのこと。

<hr>
https://github.com/facebook/conceal
> Conceal provides easy Android APIs for performing fast encryption and authentication of data.
リアクティブジャッジ問題：一方的なプロセス間通信


競技プログラミングにおいて、リアクティブジャッジ問題とは、ジャッジコードと双方向通信を行って解答する問題である。
IOIでは言語がC/C++に限定されているため、通信は関数インターフェースで行うが、言語を限定しない場合(例：AtCoder/AOJ/yukicoder)、通信は双方向パイプを用いて行う。
このような場合、まれにだが、「最初の条件だけ受け取った後、特定の出力を行って終了する」プログラムが正解することがある。この「特定の出力」は一方的に行うものであり、双方向ではない。
こういった場合、本来ジャッジコードは不正な動作になるはずだが、なぜ正解になるのだろうか？

上記の通り、プロセス間通信には双方向パイプが用いられる。パイプには一定の容量(パイプバッファ)があるため、これがブロックするのは以下の場合である[^1]。

- ジャッジコードがデータを読もうとする時パイプバッファが空
- 解答プログラムがデータを読もうとする時パイプバッファが空
- ジャッジコードがデータを書き込み、フラッシュしようとする時パイプバッファが満杯
- 解答プログラムがデータを書き込み、フラッシュしようとする時パイプバッファが満杯

解答プログラムがジャッジコードを待つことなく終了した場合、結果としてパイプがクローズされ[^2]、以降ジャッジコードがブロックすることはなくなる。ジャッジコードの挙動は以下のようになる。

- 「ジャッジコードがデータを読もうとする時パイプバッファが空」
  - **データはEOFの扱いとなる[^3]**
- 「ジャッジコードがデータを書き込み、フラッシュしようとする時バッファが満杯」
  - **フラッシュは失敗し、errnoにEPIPEが設定される**

つまり、この挙動に掛からず、かつ出力が正当なら、その解答プログラムは正解なのである。ところで、フラッシュが失敗する場合、C言語では特に例外が送出されることはないので、確認漏れがあり得るので、ジャッジコードの実装によってはもしかしたらEPIPEを無視して正解になりうるかも。

[^1]: 特に両方のプログラムが読み込みまたは書き込みのブロックとなった場合、デッドロックとなる。
[^2]: プログラムが終了する時、開いているファイルはクローズされる。クローズの際ファイルバッファはフラッシュされる。普段明示的にフラッシュをしなくて良い理由はこのためである。一方リアクティブジャッジ問題では基本的にフラッシュが必要なのは御存知の通り。
[^3]: これ自体は特に問題はなく、RubyのIO#close_writeなど、パイプラインとしては有効利用できる場面は多い。ただ、ジャッジコードとしてはEOFは期待していないだろう。
Create,NewFile,Open,OpenFileの違い

osパッケージのCreate, NewFile, Open, OpenFile違いについて


# Open,CreateはOpenFileの省略形

```go:go/src/os/file.go
func Open(name string) (file *File, err error) {
  return OpenFile(name, O_RDONLY, 0)
}
func Create(name string) (file *File, err error) {
  return OpenFile(name, O_RDWR|O_CREATE|O_TRUNC, 0666)
}
```

# OpenFileは実装で異なる

```bash
$ grep "func OpenFile" . -r
./file_windows.go:func OpenFile(name string, flag int, perm FileMode) (file *File, err error) {
./file_unix.go:func OpenFile(name string, flag int, perm FileMode) (file *File, err error) {
./file_plan9.go:func OpenFile(name string, flag int, perm FileMode) (file *File, err error) {
```

```go:go/src/os/file_unix.go
func OpenFile(name string, flag int, perm FileMode) (file *File, err error) {
  r, e := syscall.Open(name, flag|syscall.O_CLOEXEC, syscallMode(perm))
  if e != nil {
    return nil, &PathError{"open", name, e}
  }

  // There's a race here with fork/exec, which we are
  // content to live with.  See ../syscall/exec_unix.go.
  if !supportsCloseOnExec {
    syscall.CloseOnExec(r)
  }

  return NewFile(uintptr(r), name), nil
}
```

# NewFileはさらに低レベルな処理

```bash
$ grep "func NewFile" . -r
./file_windows.go:func NewFile(fd uintptr, name string) *File {
./file_unix.go:func NewFile(fd uintptr, name string) *File {
./file_plan9.go:func NewFile(fd uintptr, name string) *File {
```

```go:go/src/os/file_unix.go
func NewFile(fd uintptr, name string) *File {
  fdi := int(fd)
  if fdi < 0 {
    return nil
  }
  f := &File{&file{fd: fdi, name: name}}
  runtime.SetFinalizer(f.file, (*file).close)
  return f
}
```

# 参考

os - The Go Programming Language
https://golang.org/pkg/os/

build-web-application-with-golang/07.5.md at master · astaxie/build-web-application-with-golang
https://github.com/astaxie/build-web-application-with-golang/blob/master/ja/07.5.md
【便利な基礎 for Unity】Unity コンポーネントのコピー＆ペースト

Unityでは複雑な、複雑になって行く設定のコンポーネントが多々あります。
（何十項目に及ぶ、オブジェクトのパス指定など）
既に設定してある設定値をそのまま別のオブジェクトにコピペしたい時の為の、標準機能の紹介です。

殆どの方はご存知でしょうが、
このQiitaでの初投稿のテストとして紹介させて頂きます。

![z.PNG](https://qiita-image-store.s3.amazonaws.com/0/85037/fd26f6fb-824d-6889-e8f1-b3d82d6cabd3.png)←各コンポーネントにあるこれをクリック
![zdcccc.PNG](https://qiita-image-store.s3.amazonaws.com/0/85037/24ea5511-fa76-4ac8-01e4-aca4f10f0612.png)

![dfffff.png](https://qiita-image-store.s3.amazonaws.com/0/85037/6391f137-6507-fdba-d954-b1e02cf226c6.png)
Copy Componentを選択してみましょう。

他のオブジェクトを選択してそのオブジェクトについている![z.PNG](https://qiita-image-store.s3.amazonaws.com/0/85037/a067b804-21c8-ba07-21f1-f0fdb19a4d36.png)をクリックしますと、

![dfffff.png](https://qiita-image-store.s3.amazonaws.com/0/85037/fd40a9f5-ef71-7289-98fc-3dd7ab5380e8.png)
Paste Component As New　が出来るようになりました。
これはコピー元のコンポーネントが存在しないオブジェクトでは新規に追加し、そうではないオブジェクトでは複製が出来ます。
また下の
Paste Component Values　はコピー元と"同じコンポーネント"に同じ値をペーストできます。例（AとBにアタッチされたZscript（それぞれ設定は違う）Bの設定値をAのZscriptにペーストするなど）

初歩中の初歩ですが、これを知ってるだけで作業速度が上がると思います。
知らない人のお役に立てれば幸いです。
ファイル詳細一覧

指定ディレクトリ配下の詳細一覧を出力するワンライナー

dirコマンドで取得したフルパスをforの変数に突っ込んで出力するまでは割と既知。
その変数の文字列をechoで標準出力する時に~でファイルパス属性の文字列として処理できるらしい。

@echo off
echo.>out.txt
for /f "tokens=* usebackq" %%a in (`dir /a /b /s /o:n /t:w` ) do (echo.%%~aa	%%~dpa	%%~nxa	%%~ta	%%~za ) >>out.txt

やってみたらデキた。
割と目から鱗。
多重起動を禁止する

プログラムが動作中に再度呼ばれると色々良くないので禁止してみます

やり方としてはプロセスの起動状態を見るとかあるのですが
今回はロックファイルを作って排他が掛かっていたら
エラーで抜けるという方法です


# golang実装

```go:lockgo.go
package main

import (
  "fmt"
  "io/ioutil"
  "os"
  "syscall"
)

func main() {
  fmt.Println("ready")

  lockfile := "lock"

  if _, err := os.Stat(lockfile); err != nil {
    fmt.Println("make lockfile")
    ioutil.WriteFile(lockfile, []byte(""), 0644)
  }

  fd, _ := syscall.Open("lock", syscall.O_RDONLY, 0000)
  defer syscall.Close(fd)

  if err := syscall.Flock(fd, syscall.LOCK_EX|syscall.LOCK_NB); err != nil {
    fmt.Println(err)
    os.Exit(1)
  }

  fmt.Println("running")

  for {

  }
}
```

# Perl実装

```pl:lockpl.pl
#!/usr/bin/perl
use strict;
use warnings;
use Fcntl qw/ :flock /;

main();

sub main {
  print "ready\n";

  my $lockfile = "lock";
  unless (-f $lockfile) {
    print "make lockfile\n";
    open my $fh, ">", $lockfile;
    close $fh;
  }

  open my $fd, "<", "lock";
  flock($fd, LOCK_EX | LOCK_NB ) or die $!;

  print "running\n";

  while (1) {
  }
}
```


# 動作確認

動作は同じなのでそれぞれの実装を起動してみます。
なんかPerlのエラーは日本語になってるけど気にしない。

```bash:go_main_lock
$ go run lockgo.go &
ready
make lockfile
running
$ perl lockpl.pl
ready
リソースが一時的に利用できません at lockpl.pl line 19.
$ fg
Ctrl + c
```

```bash:pl_main_lock
$ perl lockpl.pl &
ready
running
$ go run lockgo.go
ready
resource temporarily unavailable
exit status 1
```

# 蛇足

Windowsへのクロスコンパイルは通りませんでした。
flock無いんですね。。

```bash
$ GOOS=windows GOARCH=amd64 go build lockgo.go
# command-line-arguments
./lockgo.go:23: undefined: syscall.Flock
./lockgo.go:23: undefined: syscall.LOCK_EX
./lockgo.go:23: undefined: syscall.LOCK_NB
```

# 参考

Man page of FLOCK
http://linuxjm.osdn.jp/html/LDP_man-pages/man2/flock.2.html

Go言語: ファイルの存在をちゃんとチェックする実装? - Qiita
http://qiita.com/suin/items/b9c0f92851454dc6d461

Golang Flock
https://gist.github.com/ericchiang/ce0fdcac5659d0a80b38
import "C"でもできる？
Elixir で普通では使えない記号が入った名前の関数を定義する

quote を使うとめちゃくちゃな名前の関数でも定義できる。

```ex:fancy.exs
defmodule Fancy do
  defmacro __using__(_) do
    fancy_name = :"!#$%&'()_"
    quote do
      def unquote(fancy_name)() do
        42
      end
    end
  end
end
```

```ex:foo.exs
defmodule Foo do
  use Fancy
end
```

```iex
$ iex -r fancy.exs -r foo.exs
iex> Foo."!#$%&'()_"
42
```
Bublcam Quick Report

Today I got my Bubl 360 degree camera.

0. What is Bublcam?

[Kickstater page](https://www.kickstarter.com/projects/bublcam/bublcam-360o-camera-technology-for-everyone)

[Bubl HP](http://www.bublcam.com)

[Gigazine Japan](http://gigazine.net/news/20131115-bublcam/)

Stitching & Projection on both Photos and Videos are done with free Web service from @bublcam . You can download them in Equirectangular there. Also smartphone app seems doing these processing. 
スティッチングと，Equirectangularへの投影は，ビデオもスティルも，webベースのサービスです．スマホアプリでも計算してる模様．カメラのなかでは，やってない感じ．

1. A still taken at Azumako Falls at my town, Higashi-Hiroshima.
僕の住んでる東広島の街中にある，吾妻子の滝で撮影
https://ja.wikipedia.org/wiki/吾妻子の滝
[bubl web link to the still image](https://www.bubl.io/experiences/fd5744ee-ed7e-4d35-95f9-015414e0fe01)

2. Raw image data stored in microSD. It has 3840x3840 resolution. Below is the reduced photo.

Bublに挿したmicroSDには，raw imageが記録されています．静止画はこんな感じ

![スクリーンショット 2015-08-01 23.01.33.png](https://qiita-image-store.s3.amazonaws.com/0/58434/d450be42-bbff-f570-d37d-522e7384ab1c.png)

3. Projected image (Equirectangular) has 5376x2688 resolution.
Equirectangularに展開された写真は5376x2688の解像度．
![equirect-5376x2688.jpg](https://qiita-image-store.s3.amazonaws.com/0/58434/77b77c5c-c8f8-3be1-9035-43542b43e599.jpeg)

[download link](https://dl.dropboxusercontent.com/u/47010255/equirect-5376x2688.jpg)

4. 360deg Video has two picture and time resolution. 1440x1440 30 fps vid is [here (bubl file share)](https://www.bubl.io/experiences/f4790f23-12c5-4ac9-b101-f1a17ac8a003)
360度動画は，２種類の空間解像度と時間解像度．1440x1440では 30fps
Projected video is more clearer than web, it has 1982x992 resolution.
展開されたビデオは，webサービスで見るよりクリアで1982x992の解像度です．
[download link to Equirectangular video (1982x992 resolution)](https://dl.dropboxusercontent.com/u/47010255/equirect-1984x992.mp4)


5. 1920 x 1920 15 fps vid is [here (bubl file share)](https://www.bubl.io/experiences/88ad573c-d085-4c85-9f8e-837a3b69b5f9)
1920x1920では15fps
Projected video has 2688x1344 resolution.
展開されたビデオは2688x1344の解像度．
[download link to Equirectangular video (2688x1344 resolution)](https://dl.dropboxusercontent.com/u/47010255/equirect-2688x1344.mp4)

6. Bubl says 1440^2 vid is 30 fps & 1920^2 is 15fps. My videos are 23.24fps and 13.02 fps.
僕の撮った動画は，1440x1440では23.24fps, 1920x1920では13.02fpsでした.
I could not see salient differences between two time resolutions. Spatial resolution has certain effect.
滝の動画では，正直言って，あまり時間解像度の違いは感じられませんでした．空間解像度のほうは，それなりの差があります


7. Smartphone app is fairly well designed. I guess they considered THETA app well. LiveView of Still mode is useful. And the app viewer takes Gyro data. It’s very good to view @hacosco.
I could not see Stereo in its “VR mode” of @bublcam app. (Theoretically, horizontal 3 cams could do this.)
アプリの中のビューワーは，ジャイロ対応していて，最初から @hacosco で快適に見ることができます．そして，謎の２眼対応VRモードなるものがありますが，これは立体視できているようには思えませんでした．（原理的には水平方向３眼で不可能ではない）
GoogleAppsScript : ライブラリが使っているライブラリをユーザコードで使う

# 概要
GoogleAppsScript において、ライブラリ (仮に A とする) を使うわけですが、このライブラリ A の中で汎用性の高い別のライブラリ (仮に B とする) を使っていたとして、ユーザコードでライブラリ B も使いたいとき、ライブラリ A からライブラリ B へのアクセスを拝借できるかな、と思ったらできたよ、という誰得情報です。

# 試してみたよ

まず、とっても便利な機能をもったライブラリ util を作ってみます。

```js:util/util.gs
function useful() {
  return 'useful';
}
```

はい。
で、これを内部で使いつつ、他の便利な機能を提供するライブラリ beat を作ります。

```js:beat/beat.gs
function beat() {
  return ['beat', util.useful()].join('_');
}
```

ね、`util.useful()` 使っているでしょ。

次。
ユーザコード (ここでは main という名のプロジェクトにしておこう) でライブラリ beat を使うわけだけど、ライブラリ util もとっても useful だから使いたくなっちゃう。
普通はライブラリ beat とライブラリ util を両方リンクして、次のようになるわけですね。

```js:main/main.gs
function start() {
  Logger.log({beat: beat.beat(), useful: util.useful()});
}
// => [15-08-02 00:36:58:740 JST] {beat=beat_useful, useful=useful}
```

だけど、ライブラリ beat の中でライブラリ util 使っていることがわかっているならそれを拝借しちゃったらどうかな、って。具体的にはライブラリ util のリンクを切っておいてから、先の関数 `start()` の前におまじないを追加するよ（実際は `start()` の後だろうが関係ないと思うけど、たぶん）。

```js:main/main.gs
(function(module) {
  module.util = module.beat.util;
})(this);

function start() {
  Logger.log({beat: beat.beat(), useful: util.useful()});
}
// => [15-08-02 00:36:58:740 JST] {beat=beat_useful, useful=useful}
```

# で？
ライブラリ beat の中でライブラリ util を使わなくなるかもしれないわけだし、ライブラリの独立性を考えたらそれぞれにリンクするのが正しいよね。あと、実際にユーザコードで二重にライブラリ util を読み込んでいるようでいて、実際はメモリ上には一回しかロードしないでしょ、ってことは特にパフォーマンス的なメリットはないよね。
唯一利点があるとすると、ユーザコードで明示的にリンクするライブラリが少なくなるってことかな。ライブラリのリンク、ブラウザ操作でしかできなくてめんどいからね。
Git2.5のアップデート内容について


#概要
下記の記事を見てGitのバージョン2.5でどのような機能が追加されたのか調べてみました。
Git 2.5, including multiple worktrees and triangular workflows- https://github.com/blog/2042-git-2-5-including-multiple-worktrees-and-triangular-workflows

今回は、 **worktree**コマンドと、**追跡ブランチを示すシンタックスシュガー**のみまとめました :muscle: 

検証前に、Githubにあがっているものを直接インストールしました。

```sh:bash
$ git clone https://github.com/git/git/
$ cd git
$ make install
```

# worktree

ローカルリポジトリとして複数管理したいという、ケースがある場合に便利なものみたいです:smile:
Git2.4までだと、以下のようにわざわざそれぞれcloneして管理する必要がありました。

```sh:bash
$ git clone git@github.com:totomo/test.git test1
$ git clone git@github.com:totomo/test.git test2
```

worktreeコマンドを使うとさくっと指定した場所に、別のローカルリポジトリを作るみたいなことができます。

```sh:bash
# HEADから ~/test2にtest2をカレントブランチとしたローカルリポジトリを複製
$ git worktree add ~/test2

# ~/test2にmasterのHEADの親コミットから切ったtest2というブランチをカレントブランチとするローカルリポジトリを複製
$ git worktree add ~/test2 master^

# ../test2にmasterのHEADの親コミットから切ったhotfixというブランチをカレントブランチとするローカルリポジトリを複製
$ git worktree add ~/test2 -b hotfix master^

# ../test3にすでに他のworktreeコマンドで生成されたローカルリポジトリでcheckoutされているhotfixというブランチをカレントブランチとするローカルリポジトリを複製
$ git worktree add ~/test3 -f hotfix
```

git cloneで複製した時とは違い各ブランチの状態(HEADの参照先コミットハッシュ、ブランチが増えた場合)などは共有されます。
`-f`を付けないと他に`worktree`コマンドで生成されたローカルリポジトリでcheckoutされているブランチを指定すると、怒られるのでそこだけ注意ですね :smile: 
`--detach`オプションで無名ブランチを切ることもできます。
リリース前に`clone`する習慣がある人とかは代わりに`worktree`コマンドが使えるかもしれないです。
ただし、まだ実験的なもので、いくつかbugがあったり、 **submodule**を内包するリポジトリでは利用が推奨されておらず、インターフェースもユーザの意見により今後変更されるかもしれないみたいです。

試しに、少しやってみると

```sh:bash
#worktree作成
$ pwd
/Users/toku/test
$ git worktree add ~/test2
Enter /Users/toku/test2 (identifier test2)
Switched to a new branch 'test2'

# test2ブランチにコミット
$ cd ../test2
$ git commit -am "Add empty modification" --allow-empty
$ $git rev-list HEAD -1
e0da2d47eb2dff09fe75f8ae87669b6bf9306731

# 元のディレクトリにtest2ブランチへのコミットが共有されているか確認
$ cd ../test
$ git rev-list test2 -1
e0da2d47eb2dff09fe75f8ae87669b6bf9306731
```
# shorthand \<reference\>@{push}

`<reference>@{push}`という表記でupstreamブランチを指定することができます。
例えば、masterブランチの追跡ブランチがもつHEADとローカルリポジトリのmasterブランチのHEADにおけるコミットの差分は

```sh:bash
$ git log master@{push}...master
#カレントブランチがmasterの場合は、省略可能
$ git log @{push}...master
```
`<reference>`を初略した場合はカレントブランチの追跡ブランチのHEADが参照されます。
sfml-audio-fiddleの紹介

sfml-audio-fiddleというRubyから音声ファイルを再生するgemを公開しました。

* github https://github.com/bggd/sfml-audio-fiddle
* rubygems https://rubygems.org/gems/sfml-audio-fiddle

[SFML](http://www.sfml-dev.org/index.php)というゲーム/マルチメディア向けC++ライブラリのCバインディングの[CSFML](http://www.sfml-dev.org/download/csfml/)をFiddle(Rubyの標準FFIライブラリ）から呼び出しています。
CSFMLの共有ライブラリがあればLinux/OSX/Windowsで動くはずです。

Fiddleの制約上、構造体の値渡しができないのでsfVector3fを値渡しする必要がある3D音響の機能は使えません。

読める形式:
ogg, wav, flac, aiff, au, raw, paf, svx, nist, voc, ircam, w64, mat4, mat5 pvf, htk, sds, avr, sd2, caf, wve, mpc2k, rf64.

##使い方

```ruby
gem instal sfml-audio-fiddle
```

使っているRubyと同じbitバージョンの[CSFML](http://www.sfml-dev.org/download/csfml/)をダウンロードして**csfml-audio-2.dll**と**openal32.dll**を、sfml-audio-fiddleを使うスクリプトの実行時にパスが通っている場所（カレントディレクトリ等）に置きます。

APIはキャメルケースがスネークケースになっただけで、ほぼSFMLと同じです。
.get_durationやplaying_offsetはSFMLだとマイクロ秒を使いますがsfml-audio-fiddleでは秒にしています。

###効果音を鳴らす

```ruby
require 'sfml/audio'


buffer = SFML::SoundBuffer.new 'sfx.wav'

sound = SFML::Sound.new buffer

sound.play

sleep buffer.get_duration + 1
```

###BGMをストリーミング再生

```ruby
require 'sfml/audio'


music = SFML::Music.new 'bgm.ogg'

puts "曲の長さ: #{music.get_duration}秒"

music.play

while music.get_status == :playing
  sleep 1
end
```

#ほかのSFMLのRubyバインディング（どちらもC拡張）

**rbSFML**

https://github.com/Groogy/rbSFML

**sfml-ruby**

https://github.com/Hanmac/sfml-ruby


#ほかのよさげなライブラリ

**Seal** 

https://github.com/zhangsu/seal

使ったことはありませんが手軽に3D音響を使えそうです。

**SoLoud**

http://sol.gfxile.net/soloud/index.html

C++のライブラリですがpythonスクリプトから各種バインディングを生成しています。
RPGツクールのRuby(RGSS)にまで対応しています。
高機能で3D音響も使えます。
今のところWindows向けには32bitのバイナリしか配布していないので、今後に期待しています。
自分でビルドする場合にはPremake4からforkしたGENieを使います。

以上です。
ユーザーエージェント判別 => スマフォリダイレクト

フロント側で、
ユーザーエージェントを判別してスマフォはリダイレクトさせるというのはよくあるが、

**(1).　色々な端末が増えてきてユーザーエージェントの判別で漏れが発生する。**
下記みたいなやつだと、色々な端末で抜けが出てしまう。なので、
[device.js](https://github.com/matthewhudson/device.js?) を使う。

```
var ua = window.navigator.appVersion.toLowerCase();

if (ua.indexOf('iphone') >= 0 || ua.indexOf('ipod') >= 0 || ua.indexOf('ipad') >= 0 || ua.indexOf('android') >= 0 || ua.indexOf('windows phone') > 0 || ua.indexOf('blackberry') > 0) {
 	location.href = "/us/sp/index.html";
}
```

**(2).　都度リダイレクトURLをページごとに指定すると漏れる＆めんどくさい。**
なので、jsで今いるURLから自動的にURLを作る。

```
location.href = "/aaa/sp/index.html";
```
こういう構造だと楽なんだが
/aaa/index.html　=>　/sp/aaa/index.html
/aaa/category/index.html　=>　/sp/aaa/category/index.html
/bbb/index.html　=>　/sp/bbb/index.html
/bbb/category/index.html　=>　/sp/bbb/category/index.html

今回はこんな感じだった。
/aaa/index.html　=>　/aaa/sp/index.html
/aaa/category/index.html　=>　/aaa/sp/category/index.html
/bbb/index.html　=>　/bbb/sp/index.html
/bbb/category/index.html　=>　/bbb/sp/category/index.html

**(1),(2)を解消するために以下のようなファイルを用意する。**
device.jsは
https://github.com/matthewhudson/device.js
からダウンロードする。


```lang:index.html
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>ユーザーエージェント判別 => リダイレクト</title>

<script src="/device.js"></script>
<script src="/index.js"></script>
</head>
<body>


</body>
</html>
```
```lang:index.js
(function redirectFunc(){
  if (device.mobile()) {
    // spへのリダイレクトURLを自動生成
    var rootRelativePath = location.href.split(location.host)[1];
    var path = rootRelativePath.split("/");
    path.splice(2, 0, "sp") // スマフォのディレクトリを入れる
    location.href = path.join("/");
	}
})();
```

ここにいるとする => 【エイチテーテーピー://hoge.com/abc/def/index.html】

まずは、アドレスバーのURLから、ホスト部分（location.host）で分割し、
ルート相対パスをゲット。(1行目)  => 【/abc/def/index.html】
それを[/]で分割した配列にする(2行目)  => 【[abc][def][index.html]】

ここで、javaScriptの配列にはinsertがないので、
spliceという要素の追加と削除の両方の役割を持ったメソッドを使う、第二引数に0を使えばinsertのように使用できるらしい。
`array.splice(index, 削除する要素の数, [追加する要素]);`
`path.splice(2, 0, "sp") // スマフォのディレクトリを入れる`
(3行目)  => 【[""][abc][sp][def][index.html]】

最後に、「/」で配列をつなげてspのパスの完成です。
注意がこのスクリプトは、PCとSPのページが対になっていないとだめです。
そうじゃないとリダイレクト→not foundとかになります。
その際は例外の処理をかかないとだめですね。

device.jsはスマートフォンだったら、
`device.mobile()`
で、trueを返すので、これでOK。
タブレットも入れたい場合は
`if(device.mobile() || device.tablet()){`
みたいにするか
`if(!device.desktop()){`
でも、いいかも。
device.jsが結構頻繁に更新されているのでこれを使わない手はない。
windows10も出たので、その辺振り分けもいれておいてもらいたい。



※参考サイト
http://lostlinksearch.net/blog/2013/06/javascript%E3%81%A7%E9%85%8D%E5%88%97%E3%81%AE%E4%BB%BB%E6%84%8F%E3%81%AE%E4%BD%8D%E7%BD%AE%E3%81%AB%E8%A6%81%E7%B4%A0%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B-insert/
MacにMavenをインストールする

Mac OS X Yosemite(10.10.2)で当たり前のようにmvnコマンドつかったら
当たり前のようにcommand not foundが返ってきたので
しょうがないのでインストールしました。
ということでインストール方法メモ。

# ダウンロード
まずは公式ページからダウンロード
https://maven.apache.org/download.cgi
今回は最新バージョンの3.3.3。（2015/08/01時点）
Binary tar.gz archiveを選択。

# 解凍
とりあえず/usr/local配下に移動させてから解凍。

```
cd /usr/local
mv {DL先のパス}/apache-maven-3.3.3-bin.tar.gz .
tar zvf apache-maven-3.3.3-bin.tar.gz
rm apache-maven-3.3.3-bin.tar.gz
```
解凍後はいらないファイルも一応削除。

# 環境変数にMavenのパスを追加
```
cd ~
vi .bash_profile
```
```lang:.bash_profile
export M3_HOME=/usr/local/apache-maven-3.3.3
M3=$M3_HOME/bin
export PATH=$M3:$PATH
```
＃既存のデータがある場合は追記する
環境変数の再読み込みも行う。
```
source .bash_profile
```

# 動作確認
```
mvn --version
```
バージョンが表示されればOK

# トラブルシューティング
なんだ簡単じゃん！と思ったら、最後のmvnコマンドでエラーが発生。
```
Exception in thread "main" java.lang.UnsupportedClassVersionError: org/apache/maven/cli/MavenCli : Unsupported major.minor version 51.0
```

どうやらJavaのバージョンが低いってことらしい。
あれ、Java8インストールしてあるのにな…と思ったらどうやらJAVA_HOMEの設定漏れ。
というわけでこちらも環境変数へ追加。

```
cd ~
vi .bash_profile
```
```lang:bash_profile
export JAVA_HOME=`/usr/libexec/java_home -v 1.8`
export PATH=$M3:$JAVA_HOME:$PATH
```
＃export PATH=〜は先ほどのヤツを編集
環境変数再読み込み。
```
source .bash_profile
```
これで無事mvnも動くようになりましたとさ。
UbuntuでGeForce GTX 980 Tiを動かした

最初うまく認識してくれなかったのでNVIDIAのサイトから適当なドライバを落とした. Xが動いてると実行できないのでランレベルを変更する. (XXXの部分は適当に変えてください)

```
$ telinit 1
$ chmod +x NVIDIA-XXX.run
$ ./NVIDIA-XXX.run
$ telinit 3
```
地球上の２点間の直線距離を求める

#### [※新しい内容をこちらに移植しました。 → 【JavaScript】地球上の2地点間の距離を取得するアルゴリズム比較](https://tech-blog.s-yoshiki.com/entry/8)

#概要

- GPSを使って地球上の２点間（新宿と現地点）の直線距離を求める
- GeoLocationAPIを利用してみた。
- 球面三角法を利用

# 参考
<a href="https://tech-blog.s-yoshiki.com/entry/8">【JavaScript】地球上の2地点間の距離を取得するアルゴリズム比較</a>
<a href="http://www.ic.daito.ac.jp/~mizutani/gps/measuring_earth.html">地球を測ろう</a>
<a href="https://vldb.gsi.go.jp/sokuchi/surveycalc/main.html">測量計算サイト</a>

#ソース

```javascript:index.js


//２点間を計算する関数
var getSuccess = function(pos) {
    //現在地 lat:緯度,lng:経度
    var geo = {
        lat: pos.coords.latitude,
        lng: pos.coords.longitude
    };
    //現在地の緯度経度
    var lat1 = geo.lat;
    var lng1 = geo.lng;

    /*新宿の座標*/
    var lat2 = 35.689487;
    var lng2 = 139.691706;

    //距離の計算//
    function getDistance(lat1, lng1, lat2, lng2) {

       function radians(deg){
          return deg * Math.PI / 180;
       }

       return 6378.14 * Math.acos(Math.cos(radians(lat1))* 
        Math.cos(radians(lat2))*
        Math.cos(radians(lng2)-radians(lng1))+
        Math.sin(radians(lat1))*
        Math.sin(radians(lat2)));
    }
    /*結果*/
    alert(getDistance(lat1,lng1,lat2,lng2));
};

//GPSエラーの場合
var geoError = function() {
    alert('Getting location failed.');//
};

/*GeoLocationAPIで現在地の座標を取得する*/
document.getElementById("start").onclick = function(){
    navigator.geolocation.getCurrentPosition(getSuccess, geoError, { enableHighAccuracy: true });
};

```

# 追記 2018/09/10

<iframe width="100%" height="300" src="//jsfiddle.net/s_yoshiki/xL09s2fm/embedded/" allowfullscreen="allowfullscreen" allowpaymentrequest frameborder="0"></iframe>

<a href="https://tech-blog.s-yoshiki.com/2018/05/92/">【JavaScript】地球上の2地点間の距離を取得するアルゴリズム比較</a>

<script async src="//jsfiddle.net/s_yoshiki/xL09s2fm/embed/"></script>
【AWS】cyberduckからファイルのアップロード、ダウンロードができない

AMIからEC2インスタンスを複製し、そちらを使おうとしたら突然cyberduckからアクセスできないくなりました。
その症状が特殊でかなり解決に手間取ったので覚書。

##症状
1. EC2インスタンスにftp接続はできて、サーバーの中は見れるのですがファイルのやり取りだけ出来ない。
2. 0Kbのファイルはアップロードできる。

最初はディレクトリのアクセス権限の問題かと思いましたが、そもそもAMIで複製前のインスタンスでは問題なくファイルのやり取りができていたので、なにも変更していないのに動かなくなるのはどうしてなんだろう。

まあそれは置いておいて、色々試しすぎてちょっとごっちゃですが以下が有効だったぽい。

##1. ec2-userに```/var/www```のオーナー権限を与える
```# sudo su```
```# chgrp -R ec2-user /var/www ```
```# cd /var/www/html```
```# chown ec2-user .```

##2. var/wwwディレクトリののアクセス権限を755に
```# chmod -R 775 /var/www```

##3. ec2-userとしてSFTPで接続
sshでEC2に接続する際使用していた.pemファイルでsftp接続。
![Screen Shot 2015-08-01 at 11.35.04 PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/69560/6a443621-07db-d55d-8722-b7d21b8ef61f.jpeg)

以上で解決できました。

ただ元々はec2-userとは別にadminユーザを作成して、そのユーザに```chown```で/var/wwwファイルのオーナー権限を与えて、
ふつーにftpでuser: admin pass: xxxで接続し、ファイルをやり取りできていたので、本質的な解決策にはなっていないですが、、。

２日ほど苦しんだのでいったんこれで良しとしようかと。


ネットで調べても上記のような症状は見つからず、有効な解決策を見つけるのに手間取りました。
これが正解かわからないけど、、
どなたか同じ症状を経験した方、詳しい方、いらっしゃったら教えていただけると助かります。
PHP + SQLite3 超入門したメモ

MySQLを少し しか触ったことがなかったので試してみました。
PHP5に標準で組み込まれていて、.dbの1ファイル構成。
ビルトインサーバーと併用すれば
いろいろ初期設定がいらなくて、
データベースと連携する練習にもとても良いなと感じました。

#1, PHPから接続していじる


```php:hoge
<?php
try {

    // 接続
    $pdo = new PDO('sqlite:my_sqlite_db.db');

    // SQL実行時にもエラーの代わりに例外を投げるように設定
    // (毎回if文を書く必要がなくなる)
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    // デフォルトのフェッチモードを連想配列形式に設定 
    // (毎回PDO::FETCH_ASSOCを指定する必要が無くなる)
    $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

    // テーブル作成
    $pdo->exec("CREATE TABLE IF NOT EXISTS fruit(
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name VARCHAR(10),
        price INTEGER
    )");

    // 挿入（プリペアドステートメント）
    $stmt = $pdo->prepare("INSERT INTO fruit(name, price) VALUES (?, ?)");
    foreach ([['りんご', '200'], ['バナナ', '200']] as $params) {
        $stmt->execute($params);
    }

    // 選択 (プリペアドステートメント)
    $stmt = $pdo->prepare("SELECT * FROM fruit WHERE price = ?");
    $stmt->execute(['200']);
    $r1 = $stmt->fetchAll();

    // 結果を確認
    var_dump($r1);

} catch (Exception $e) {

    echo $e->getMessage() . PHP_EOL;

}
```

# 2、ターミナルから接続して確認

```php:hoge
// dbに接続コマンド  (ファイルのあるディレクトリで)
sqlite3 my_sqlite_db.db

// table一覧表示コマンド
 .tables

// tbl_fruitの内容表示コマンド
select * from tbl_fruit:
```
ggplot2で縦軸と横軸をひっくり返したい

**(2016/03/15追記)ggplot2 v2.1.0で動作確認しました。**

## Q
例えば以下のようなグラフで、x軸とy軸をひっくり返したい(横棒グラフ)にしたいのですが、どうしたらいいのでしょうか?

```r:NG_example.R
library(ggplot2)
ggplot(mtcars, aes(x = as.factor(gear))) +
  geom_bar()
```

![NG_example.R-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/a784dfab-db16-8990-a791-dfa35e2aefa9.png)


## A
`+ coord_flip()`を追加すると、x軸とy軸が入れ替わります:

```r:OK_example.R
ggplot(mtcars, aes(x = as.factor(gear))) +
  geom_bar() +
  coord_flip()
```

![OK_example.R-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/6744ea53-aed5-4984-9121-e021d85b0dea.png)

この設定は、別に棒グラフだけではなく、全てに適用可能です。

## 応用
この`coord_flip()`を設定した場合、更に軸に設定を加えるときは**元の座標軸**に設定してください:

例) `count`軸の範囲を変更する場合:

```r:OK_example2.R
ggplot(mtcars, aes(x = as.factor(gear))) +
  geom_bar() +
  coord_flip() +
  ylim(c(0,20))
```

![OK_eample2.R-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/b6db8519-24a2-e69f-091b-793fb76e1aa7.png)

また、棒グラフを横にすると、下から順番にならびます。軸の内容の並べ替えについては、以下の記事を参照してください:
- [ggplot2逆引き - x軸を並べ替えたい - Qiita](http://qiita.com/kazutan/items/7840f743d642122d1219)

今回x軸はfactor型なので、順番を入れ替えるには以下のように`reorder()`を当てて変更しておく必要があります:

例) `as.factor(gear)`軸の順序を反転する場合:

```r:OK_example3.R
ggplot(mtcars, aes(x = reorder(as.factor(gear), gear * -1))) +
  geom_bar() +
  coord_flip()
```

![OK_example3.R-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/1a94dfd1-5b10-6226-f8ab-92bfe06c735a.png)

なお、x軸が連続変量であったならば、単に`+ scale_x_reverse()`を追加すればOKです。

例) `gear`軸の順序を反転する場合:

```r:OK_example4.R
ggplot(mtcars, aes(x = gear)) +
  geom_bar() +
  coord_flip() +
  scale_x_reverse()
```

![OK_example4.R-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/19182e26-0717-c8ee-7583-fcfa058a1035.png)

## 参考
- [coord_flip. ggplot2 0.9.3.1](http://docs.ggplot2.org/current/coord_flip.html)
- [ggplot2逆引き - x軸を並べ替えたい - Qiita](http://qiita.com/kazutan/items/7840f743d642122d1219)
x軸を並べ替えたい

**(2016/03/15追記)ggplot2 v2.1.0で動作確認しました。**

## Q
x軸を並べ替えたいのですが、どうすればいいのでしょうか。

## A
変数が連続変数か離散変数かによってかなり違ってきます。

### 連続的である場合
軸が連続的である場合、標準で昇順になるかと思います:


```r:example1a.R
library(ggplot2)
p <- ggplot(mtcars, aes(x = gear, y = wt)) + 
  geom_point()
p
```

![example1a.R-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/f7959487-f0ef-68a8-7b56-1150951efcdf.png)

これを反転して降順にしたい場合は、`+ scale_x_reverse()`を追加します:


```r:example1b.R
p <- ggplot(mtcars, aes(x = gear, y = wt)) + 
  geom_point() +
  scale_x_reverse()
p
```

![example1b.R-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/c50d0879-f82b-5f41-a06a-57c02ead5e00.png)


### 離散的である場合
多くの場合、factor型かと思います。

#### もとは数値データをas.factorで使っているパターン
以下のようなパターンを考えます:

```r:example2a.R
p <- ggplot(mtcars, aes(x = as.factor(gear), y = wt)) +
  geom_boxplot()
p
```

![example2a.R-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/aa9121d2-93e0-05f3-9a65-15ce72442e68.png)

この場合、以下のような変数を新たに算出し、`reorder`に組み込みます:

```r:example2b.R
mtcars.v2 <- transform(mtcars, gear2 = gear * -1) # 値の順序が逆転する変数gear2を作成
p <- ggplot(mtcars.v2, aes(x = reorder(gear, gear2), y = wt)) +
  geom_boxplot()
p
```

![example2b.R-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/6a3000eb-1e36-bfec-c07f-b521feb9dac7.png)

`gear2`は値が負になりますが、この変数は`gear`の順番をreorderさせるためだけに使用するので問題ありません。

#### 何か外的な基準に基づいて並べ替えたいパターン
factor型の変数の順序を、他の変数の要約値(平均や中央値など)で並べ替えたい場合があります。以下を例にします:

```r:example3a.R
ggplot(iris, aes(x = Species, y = Sepal.Width)) +
  stat_summary(fun.y = mean, geom = "bar")
```

![example3a.R-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/58fc28d9-2b50-df83-d63d-c185ed3a861d.png)

このx軸を、`Sepal.Width`の昇順で並べ替えるには、以下のようにします:

```r:example3b.R
ggplot(iris, aes(x = reorder(x = Species, X = Sepal.Width, FUN = mean), y = Sepal.Width)) +
  stat_summary(fun.y = mean, geom = "bar")
```

![example3b.R-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/c2e67563-40ad-9cc2-6c12-5f2e4e33bf3f.png)

reorderの設定についてはこの変数のヘルプを確認してください。


#### 順序的意味がないfactor型を任意に並べ替えたいパターン
**※ 2015/8/2修正: ggplot2ではfactor型のorderは考慮しないそうですので、該当箇所を削除して修正しました**(@kohskeさん@berobero11さんありがとうございました)  
※ 大幅に改定することになったので、この箇所についてはほぼ書きなおしています。

ggplot2では、factor型のlevelsで表示される順番で項目を並べます:

```r:level1.R
levels(iris$Species)

[1] "setosa"     "versicolor" "virginica"
```

この順番は、`factor(x, levels = c("hoge", ...))`で変更可能です。したがって、この順序を新たに設定すればそのようになります:

```r:level2.R
iris2 <- transform(iris, Species= factor(Species, levels = c("virginica", "setosa", "versicolor")))
```

なお、この時全てのlevelsを含めるよう注意してください。

この`iris`と`iris2`を比較します:

```r:example4a.R
ggplot(iris, aes(Species)) + 
  geom_bar()
```

![example4a.R-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/7da3e6fd-c524-507a-0fde-ced5d28769ef.png)

```r:example4b.R
ggplot(iris2, aes(Species)) + 
  geom_bar()
```

![example4a.R-2.png](https://qiita-image-store.s3.amazonaws.com/0/35118/626b7f0d-3c36-a359-cf88-5171e0e7c1f5.png)


このように、factor型の場合は順序を設定することで、任意に並べ替えることが可能です。


## 参考
- [scale_x_continuous. ggplot2 0.9.3.1](http://docs.ggplot2.org/current/scale_continuous.html)
konashiモジュールを拡張ボートに取り付けてLチカしてみた

![IMG_0938.jpg](https://qiita-image-store.s3.amazonaws.com/0/55227/6cd9909d-5865-ba5a-9610-f62e819c9496.jpeg)

7月の中旬konashiを購入した1万したのです。ただ、無線モジュールがパコパコ行っていたので「これは取れるんじゃないか」と思い取ってしまったのが運のツキでした。コネクタ部分が完全に壊れてしまいました。（上記の写真）たった1週間で俺の１まn...

評価ボードの供養とまだ生けるモジュールの無念を晴らしてやるためにも、小型拡張ボードを使って再生したい、それが今日の任務です。再生のために使ったのは以下の二つ

・[konashi小型拡張ボード](https://store.macnica.co.jp/products/yukaigong-xue_ye-ex002)(下写真右)
・[20mmコイン電池・ピッチ変換基板(スイッチ付き) ADA-1871](https://www.switch-science.com/catalog/1778/)(下写真左)

![IMG_0939.jpg](https://qiita-image-store.s3.amazonaws.com/0/55227/d148f269-781a-2c20-55d5-497c76ac7f7a.jpeg)

ちなみに、konashi拡張ボードの梱包を開いたら、下記の説明書が

![IMG_0940.jpg](https://qiita-image-store.s3.amazonaws.com/0/55227/436ce740-bcc4-13ec-3186-aec2663e29bb.jpeg)

おもいっきし×やってた、遅いよkonashiさん。皆さんは同じことをやらかさないでくださいね。
それではここから行うことは、konashi小型拡張ボード（以下　konashiボード）と20mmコイン電池・ピッチ変換基板(スイッチ付き) ADA-1871（以下　ADA-1871）の接続、LEDの接続です。

まずkonashiボードとADA-1871の接続です。
konashiボードは外部との電源接続に以下の４穴用意されています、また同様にADA-1871も４穴用意されていますそのうち二つを使い接続します。接続方法は以下

konashiボード　　　　 ADA-1871
VBAT1　   ＜＝＝＞   Sw
GND　     ＜＝＝＞　 Gnd

VBATは０が１番目、１が２番目です。

次にkonashiボードとLEDを接続します。それは以下

konashiボード　　　　 LED
PIO1 　   ＜＝＝＞   +端子
GND　     ＜＝＝＞   -端子

そしてkonashiのアプリ、[konashi.js](https://itunes.apple.com/jp/app/konashi.js-javascript-html/id652940096?mt=8)で提供されている「forked:誰でもできるKoshianでLチカ（PIO0のみ）」を使いLチカしてみた。

そうしたら下記写真のようにLチカできた！

![IMG_20150801_220339.jpg](https://qiita-image-store.s3.amazonaws.com/0/55227/72315eee-742c-a18e-a554-e783cdba3cbd.jpeg)
watchOS 2 Watch Connectivityの罠


# NSNullに注意

辞書内にNSNullが含まれているものは送信できず、ファイルへの保存もできません。

`@{ @"key":[NSNull null] }` 

ログ出力 

    {
        key = "<null>";
    }

# データサイズに注意

詳しく確かめてはいませんが、送信するデータのサイズが大きいと送信できません。


# その他
(その他にハマった部分も書いていましたがbeta5で修正されたので削除しました。)
unity > グラフ描画 > linerenderer使用

Unityでグラフ描画する場合、VectrosityのようなAssetを使えば簡単にできそう。でもそうなると、Vectorsityを持っていない人とのソース共有ができなくなる。

もっと標準の方法で描画できないか調べている。

どうもEffect > LineRendererというのを使えばよさそう。
ただし、LineRendererは1つのGameObjectに１つだけとなり、折れ線グラフのようなものを作るには多くのGameObjectを用意しないといけなさそう。

以下のページを参考にできないだろうか。
http://stackoverflow.com/questions/25429695/how-to-draw-multi-stroke-lines-in-unity
windows2012でwpad設定

##検証環境構築
サーバー:windows server 2012 r2
端末:windows 10 

##サーバー側
* IISをインストール
* mineに.dat/application/x-ns-proxy-autoconfig を追加
* コマンドプロンプトとからdnscmd /config /enableglobalqueryblocklist 0を実行（wpadだけ除外で適用されるはず？らしいのですが、自分の環境だと無効にしないとwpadが適用されませんでした）。
* dnsにwpadのipアドレスを登録
* wpad.datをIISのルートに配置

```
function FindProxyForURL(url,host){
  var myip = myIpAddress();
  if(isInNet(myip,"xxx.xxx.xxx.0",255.255.255.0)) return "PROXY XXX.XXX.XXX.XXX:XXXX";
  else return "DIRECT";
}
```
ドメイン内のアドレスからであればPorxyを経由。それ以外は直接インターネットへアクセス。ただし、ドメイン外でもアドレスがかぶった場合、プロキシを身にクコと担ってしまうのでそこが注意点。
ここの設定はもう少しできる見たいので、継続して調査中。

##ユーザー側
* インターネットオプション⇒接続⇒LANの設定⇒設定を自動的に検出にチェックをいれる
Carbonで'0000-00-00 00:00:00'の時刻を作る

# きっかけ
cakePHPでsoftDeletePluginを使うとき、削除日のデフォルトを'0000-00-00 00:00:00'にする必要がありました。
ので、Carbonを入れて、'0000-00-00 00:00:00'（のDateTime）を作ってみました。
（MySQLで時刻カラムにnull突っ込むと、'0000-00-00 00:00:00'になることを知る前の話・・・）

# やり方
こうだ！

```php
$date = Carbon::create(0, 0, 0, 0);
```

## なんでそうなるか
Carbonのcreateを見てみましょう。

```php
public static function create($year = null, $month = null, $day = null, $hour = null, $minute = null, $second = null, $tz = null)
    {
        $year = ($year === null) ? date('Y') : $year;
        $month = ($month === null) ? date('n') : $month;
        $day = ($day === null) ? date('j') : $day;

        if ($hour === null) {
            $hour = date('G');
            $minute = ($minute === null) ? date('i') : $minute;
            $second = ($second === null) ? date('s') : $second;
        } else {
            $minute = ($minute === null) ? 0 : $minute;
            $second = ($second === null) ? 0 : $second;
        }

        return static::createFromFormat('Y-n-j G:i:s', sprintf('%s-%s-%s %s:%02s:%02s', $year, $month, $day, $hour, $minute, $second), $tz);
    }
```

\$year、\$month、\$day、\$hourがnullでなかったら、それぞれその値を、さらに\$hourがnullではなく、\$minuteと\$secondがnullの場合は0を使うようになってます。
なので、\$year、\$month、\$day、\$hourに、それぞれ0を渡すと、'0000-00-00 00:00:00'の値を持ったDateTimeができあがるというわけです。
簡単ですね(´・ω・`)ｂ


# と思っていたけれど
すみません、嘘つきました。
[phpdoc](https://secure.php.net/manual/ja/datetime.construct.php#95611)にもあるんですけど、'-0001-11-30'になってしまうようです。。。
AngularJSを始めるときに知っておきたいことまとめ


ひょんなことからAngularJSを使って本格的に開発する機会を得たので、
始めるにあたって初心者向けAngularJS周りの概念を整理をメモ。
(随時、加筆・修正していく予定)

## AngularJS取り巻く概念図

![angular周りの概念](https://lh3.googleusercontent.com/bLGuVYTXUyImxNU7Hl4NI_mhr6JgAW-hraMMBbM5VOU=w1216-h850-no)

(2015.08.01記)
ここまで調べて実際にコードディングする。
きりがないし、記事読んでばっかで知識もふわふわしてるので、気持ち悪い。
この記事（上記の概念図含め）あとで書き直しま(-_-)


* 参考文献

[AngularJSの$scopeをController as で置換えるべき理由](http://qiita.com/Quramy/items/e55ba394031794236fc9)
[AngularJSモダンプラクティス - Qiita](http://qiita.com/armorik83/items/5542daed0c408cb9f605)
[AngularJSのMVWパターンを理解する](http://qiita.com/zoetro/items/a45dbc18bb2b22e944b2)
[HELLO, ES6 〜これから迎えるJSのミライ〜](http://yoshiko-pg.github.io/slides/20150425-jsfes/#8)
paperclipのhas_attached_fileのオプションで画像のデフォルト値を設定する

#はじめに

今回は、画像のデフォルト値を設定することで、画像がアップロードされなかった際に任意の画像を表示させます。

#モデルファイル内

以下通常の記述内容

```rb:user.rb
#paperclip
has_attached_file :avatar,style: { medium: '300x300', thumb: '100x100' }
validate_attachment_content_type :avatar, content_type: /\Aimage\/.*\Z/
```

`default_url`オプションを使用することで、デフォルト値の設定をすることができます。

```rb:user.rb
#paperclip
has_attached_file :avatar,style: { medium: '300x300', thumb: '100x100' }, default_url: '/images/no_image.png'
validate_attachment_content_type :avatar, content_type: /\Aimage\/.*\Z/
```

として、デフォルト値に設定する画像を`app/public/images/no_image.png`に置きます。これで完了です。
**注意：assetsフォルダ内のimagesの中に画像を置いてもうまく適用されませんでした。この理由はわかりません。詳しい方いましたらコメントしていただくと大変助かります。**
ArrayからHashに変換する方法いろいろ


## その1　キーとバリューが交互の配列


```rb
ary = [1, "ねずみ", 2, "うし", 3, "とら"]
h = Hash[*ary]

=>{1=>"ねずみ", 2=>"うし", 3=>"とら"}
```
配列を格納している変数aryの先頭に * をつけた場合、配列に入っている要素を全て代入する`多重代入`が行われます。

## その2　キーとバリューのセットが配列になっている配列

```rb
ary = [[1, "ねずみ"], [2, "うし"], [3, "とら"]]
h = Hash[*ary.flatten]

=>{1=>"ねずみ", 2=>"うし", 3=>"とら"}
```
配列の中に配列が入っている場合flattenメソッドで平滑化すると、

```rb
=> [1, "ねずみ", 2, "うし", 3, "とら"]
```
このような配列（つまりその1と同じ）になります。


## その3　キーとバリューがそれぞれ違う配列

```rb
key = [1, 2, 3]
value = ["ねずみ", "うし", "とら"]
ary = [key, value].transpose
h = Hash[*ary.flatten]

=>{1=>"ねずみ", 2=>"うし", 3=>"とら"}
```
配列が2つに分かれている場合、transposeメソッドで

```rb
=> [[1, "ねずみ"], [2, "うし"], [3, "とら"]]
```
このように、その2と同じ形になります。


## 参考
http://www.rubylife.jp/ini/hash_class/index7.html
EmacsでElixirのコードを書いて、IExで即座に実行

Elixir流行ってますね。流行りものに極度に弱い私ですので、すぐに飛びつきました。今はチュートリアルをひと通りおさらいしてmixの使い方の初歩の初歩が分かった程度です。Lispはなんでもかんでもlambdaに包み込んでいましたが、Elixirは更にプロセスに包み込む感じですかね。面白いですけど頭がついていけるかどうか…

私はEmacsを使っていますから、即座にelixir-modeとAlchemistをインストールして使っています。とはいっても右も左もわからない状態ですので、`M-x alchemist-iex-run`をやってコードの断片を実行して様子を見るということをやっています。

さてAlchemistには編集中のバッファからIExにコードの断片を送って実行できる関数がいくつか実装されています。

* `alchemist-iex-send-last-sexp` 直前のブロック全体を送る
* `alchemist-iex-send-region` リージョンを送る
* `alchemist-iex-send-region-and-go` リージョンを送ってIExバッファに移動
* `alchemist-iex-send-current-line` カーソル行を送る
* `alchemist-iex-send-current-line-and-go` カーソル行を送ってIExバッファに移動

…こんなの使い分けられないよ。

まず最初のやつ、これってelisp-modeの`eval-last-sexp (C-x C-e)`っぽいですよね。なのでElixir-modeにおいて`C-x C-e`を当てることにしました。

残りのやつ。リージョンを選択してるかどうかで自動的に送る対象を変えて欲しいっすよね。あとuniversal argument (`C-u`) を与えるかどうかでIExバッファに移動するかどうかを変えるようにしたらいいかなと思いました。`C-u`がついていたら、IExバッファに移動です。それらを判別して右記した関数を選択して呼ぶ関数を作りました。いちおう`C-M-x`にバインドしました。これもelisp-modeにおける`eval-defun`っぽいかなと思いまして。でもぜんぜん違うな…。まあいいや。

ということでこんなのを`~/.emacs.d/init.el`に書いてみました。docstringの英語が変かもしれません。突っ込みがありましたらよろしくお願いします。あと今気づきましたけどコメント日本語っすね。こっちも英語にしろと思いましたが、とりあえずこのままにしときます。

```init.el
(eval-after-load "alchemist"
  #'(progn
      (eval-after-load "elixir-mode"
        #'(progn
            (define-key alchemist-mode-map (kbd "C-x C-e") 'alchemist-iex-send-last-sexp)

            (defun my-alchemist-iex-electric-send-thing (uarg)
              "Sends the code fragment to the inferior IEx process.
If universal argument (C-u) is given, jump to the buffer.
when region is active, sends the marked region.
Otherwise sends the current line."
              (interactive "P")
              (cond
               ;; regionがアクティブかつC-uが押されている
               ((and uarg (use-region-p))
                (alchemist-iex-send-region-and-go))
               ;; regionがアクティブ
               ((and (not uarg) (use-region-p))
                (alchemist-iex-send-region (point) (mark)))
               ;; regionなし、かつC-uが押されている
               ((and uarg (not (use-region-p)))
                (alchemist-iex-send-current-line-and-go))
               ;; なんにもなし
               ((and (not uarg) (not (use-region-p)))
                (alchemist-iex-send-current-line))))

            (define-key alchemist-mode-map (kbd "C-M-x") 'my-alchemist-iex-electric-send-thing)))))
```
Windows10へアップグレード後Unityが起動しない

![unity_00.png](https://qiita-image-store.s3.amazonaws.com/0/44967/648e5a89-9070-2bd9-766c-88581761067d.png)

# 問題点
- Unity がインストールされた Windows を Windows10 へアップグレードした後 Unity を起動すると、License Error が出るようになりました。
- エラーウィンドウの Re-Activate ボタンが押せません。
- Unity を再インストールしても表示されます。

# 解決策
- 以下のライセンスファイルを削除してから Unity を起動します。

```lang:Unity4
C:\ProgramData\Unity\Unity_v4.x.ulf
```

```lang:Unity5
C:\ProgramData\Unity\Unity_v5.x.ulf
```

- Unity を起動後、再度ライセンスをアクティベートします。
Slick3 のクエリ合成メモ

Slick3ではクエリ(`DBIOAction`)の構築と実行とが分離されていて、予めクエリを合成した上で一つの機能にしてから実行できる。

そのうちいくつか試したものを備忘録としてメモする。

## 存在しなければINSERTを実行 その１

アカウントテーブルの`TableQuery`に対して、アプリケーション初期化時にレコードがなければINSERTを実行する方法

```scala
// class Accounts(tag: Tag) extends Table[Account]("ACCOUNTS", tag) { ... }
val accounts = TableQuery[Accounts]

val initialAccount = Account(...)

val insertIfEmpty = accounts.length.result.filter(_ == 0).flatMap(_ => accounts += initialAccount) // クエリ構築

db.run(insertIfEmpty) // 実行
```

- `accounts.length.result` が一つ目のクエリ。`.result`によって`Rep[Int]`から`DBIOAction[Int, NoStream, Read]`への変換が行われる。
- `DBIOAction[R,S,E]` は `R` のコレクションとみなしたいくつかの操作が可能で、今回の例では `filter`, `flatMap` を用いている。
- `.filter(_ == 0)` により、レコードがない場合だけ処理を続行するようにする
- `.flatMap { _ => accounts += initialAccount }` でこれまでの結果(0)はとりあえず無視して、`initialAccount`の挿入を実行する。挿入処理が`DBIOAction`であるため、`flatMap`で合成できる。

## 存在しなければINSERTを実行 その２

特定のIDが存在しなければ挿入を実行し `true` を返す。IDがすでに存在している場合はINSERTは実行せずに `false` を返す。

```scala
val account = Account(...)

val insertIfNotExists = accounts.filter(_.id === account.id).exists.result.flatMap {
  case true => DBIO.successful(false)
  case false => (accounts += account).andThen(DBIO.successful(true))
}.transactionally
```

- `.filter(_.id === account.id).exists.result` で指定のIDが存在するかどうか試す
- `true`(存在する)の場合は `false` を返すアクションを生成して返す
- `false`(存在しない)の場合は挿入を実行してから`true`を返すアクションを生成して返す
- `.transactionally` で一連のトランザクション処理にする
海外ディズニーでレストランを予約する方法

日本語で纏められているサイトが無かったので纏めました。

ざっくり言うと
「サイトにログインしてポチポチしたらいい」
ということで纏めました。

##事前に用意しておくもの
###Disney Account
ユーザを特定するためのものです。事前に作っておきましょう。（途中で作ることも可能です）
###クレジットカード
日本のディズニーホテルもそうですが、予約にはクレジットカードが必要ですので用意しておきましょう。



##レストランの予約方法
###公式サイトのDiningページへアクセスする
今回はアナハイムを例にしてみます。

https://disneyland.disney.go.com/dining/#/reservations-accepted/
![スクリーンショット 2015-08-01 20.52.54.png](https://qiita-image-store.s3.amazonaws.com/0/84307/2c120be8-ee68-d129-7658-f9a554869609.png)


###予約したいレストランのページへアクセスする
見つけられなかったら右上の検索フィールドにレストラン名を入力して検索してください。
（部分一致ですので「PCH」等わかっている部分のみでOKです）

###予約可能な時間帯を検索する
画面右部の「Check Availability」で予約したい時間帯を検索します。
![スクリーンショット 2015-08-01 21.51.58.png](https://qiita-image-store.s3.amazonaws.com/0/84307/20865dee-8638-4261-1d28-63ff743bf5f2.png)

なお「朝食なら何時でもいいや」という場合であれば「breakfast」等とざっくり検索ができます。
※私の場合は朝早く行動したいので7:00Mなどで検索します）

###予約したい時間帯を選択する
予約可能な時間帯が検索したら表示されるので、予約したい時間を選択しましょう。
![スクリーンショット 2015-08-01 20.53.41.png](https://qiita-image-store.s3.amazonaws.com/0/84307/c96446a8-b09f-fde3-efae-557f379b91a7.png)

###ログインする
Disney Accountへのログインを求められますのでログインします。
![スクリーンショット 2015-08-01 20.54.58.png](https://qiita-image-store.s3.amazonaws.com/0/84307/654e53fb-d7a1-0907-cb1b-fc5e66f53ca0.png)


###必要情報を入力する
クレジットカードや住所、電話番号を入力します。

なお、電話番号は国番号から入力してください。
例）
090-1234-5678の場合は
+011819012345678
頭のプラスが無いと怒られるので忘れないように。
![スクリーンショット 2015-08-01 20.55.28.png](https://qiita-image-store.s3.amazonaws.com/0/84307/b8d7e96d-b797-4c3a-d703-b18047762156.png)

###登録を確定する
右下の「Reserve」ボタンを押下


##完了
完了の画面が表示され、登録してあるメールアドレスへ確認メールが送付されます。
間違いがないか確認しておきましょう。


以上です。
RDS mysql のちょっとした落とし穴

#はじめに

知っていれば問題ないのですが、知らないとちょっと痛い目をみるRDSのmysql設定が幾つかあったので共有します。

#デフォルトのDB parameter groupは変更できない

DB parameter内のパラメータは項目によって再起動が必要だったり、そうでなかったりします。が、デフォルトのDB parameter groupはそもそも変更ができません。DB parameter group自体の変更は再起動が必要です。
作成時点で変更がない場合でも、コピーした独自のDB Parameter groupを設定しておくとよいです。
EC2起動するときに空のロールでもIAMロールは付けておけ、という話に似てますね

# デフォルトでクエリ結果をキャッシュしない

意外でした。思想としてElastiCacheでやるから設定しないということなのでしょうか。
アプリケーションタイプにもよりますが、小さなクエリを頻繁に実行することが多いCMSでは、キャッシュが有効ですので導入したほうがよいとおもいます。キャッシュサイズをどのくらいにすべきか等なやむところはありますが。

# デフォルトでスロークエリを取得しない

これも意外でした。チューニング済のクエリを使うからということなんですかね。動かしながら修正することも多いのでスロークエリ(slow_query_log パラメータ)は有効にしたほうがよいと思います。

# インスタンスタイプが選択できない

RDSのインスタンスタイプはEC2より少ないです。EC2にt2.largeがあるので、RDSでも選択しようとおもったらt2.mediumまでしかないとか(2015/8/1現在)、r3系はmysql 5.6でないと利用できないなど、いざ作成という時にこまることがあるのでチェックしたほうがよいです。
Mac > HDMI->VGA > 使えなかった

```txt:動作確認
MacBook Air 13inch (mid 2013)
Displayport用コネクタ (VGA出力)
```

上記の状態にて
SANWA SUPPLY: AD-HD13VGA
というHDMI->VGA変換コネクタを追加購入した。

意図としては、上記のVGA出力をHDMIに変換して液晶モニタにHDMIで繋げたかった。

結果として、動かなかった。

"HDMI->VGA"という記載のとおり、Macbook air側がHDMI出力でないと動作しない。
パッケージの裏面に<font color=red>「接続する機器のHDMI端子からの電力で動作します。」</font>と記載があった。この部分をよく読めばよかった。

素直にDisplayport用コネクタ(HDMI出力)を探して買えばよかった。
PHP ヒアドキュメントの使いかた


謎だった「EOM」は End Of Messageの略らしいです。

ABC など他の文字にしても大丈夫だそうです。

EOD （End Of Document）や
EOF （End Of File）という文字がよく使われるそうです。

これわかりやすかった
http://www.php-labo.net/tutorial/php/heredocument.html


```php:heredocs

$dog = 'ぽち';

$heredocs = <<< EOM
<p>
	{$dog}は暑くても<br>
	今日も元気です。 
</p>
EOM;

echo $heredocs;

/*
ぽちは暑くても
今日も元気です。
*/

```
特定のディレクトリだけをGitHub Pagesにデプロイするためにgulpを使う

## 発見
その名のとおり[gulp-gh-pages](https://github.com/shinnn/gulp-gh-pages)という便利なプラグインがあった。

## インストール
npm でインストールする。

```
npm install --save-dev gulp-gh-pages
```

## タスクの定義
公式サイトのとおり、以下のようなタスクを定義する。

```js:gulpfile.js
var gulp = require('gulp');
var ghPages = require('gulp-gh-pages');

gulp.task('deploy', function() {
  return gulp.src('./app/**/*')
    .pipe(ghPages());
});
```

## 実行

あとは`gulp deploy`で実行だ。

```
[20:58:45] Using gulpfile C:\projects\qqiq-fan-site\gulpfile.js
[20:58:45] Starting 'deploy'...
[20:58:47] [gh-pages] Cloning repo
[20:58:47] [gh-pages] Checkout branch `gh-pages`
[20:58:48] [gh-pages] Updating repository
[20:58:55] [gh-pages] Copying files to repository
```

こんな感じで自動的にチェックアウトしてコミットしてプッシュまでしてくれる。