OmniAICreator/Qiita-1.07M huggingface dataset:
【Git】git branch [ブランチ名] - ブランチを作る

###git branch [ブランチ名]
ブランチを作成したい作業ディレクトリ内のブランチでbranchコマンドを実行します。

~~~git
$ git branch [ブランチ名]
~~~

作業ディレクトリにブランチ[ブランチ名]を作成する

作業ディレクトリにブランチから[ブランチ名]のブランチを生やす（根っこのようなイメージがわかりやすいかなぁぁ。。。）

例：
*[ブランチ名]は、BRANCH_A

コマンド

~~~command
git branch
~~~ 
*ブランチの一覧がみれるコマンド

ログ

~~~log
  develop
* feature/BRANCH_A
~~~

関連記事
[【Git】一覧](http://qiita.com/sunstripe/items/0b611f6e8a480024dd33) - Gitコマンドまとめ
[【Git】git branch](http://qiita.com/sunstripe/items/30f46a7bf451c1a85c2b) - ブランチの一覧表示
[【Git】git branch [ブランチ名]](http://qiita.com/sunstripe/items/4e8c32634806edd0672d) - ブランチを作る
【Git】git branch -a - ローカル＆リモートブランチ一覧を表示する
【Git】git branch -d [ブランチ名] - ブランチを削除
【Git】git branch -r - リモートブランチ一覧を表示する

---

## 関連記事

【About】(http://qiita.com/sunstripe) - サンストライプ

---

## 制作チーム：サンストライプ

[![sunstripe_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/322f2d60-f19d-af9e-2b6f-7290ca546848.png)](http://sunstripe.main.jp/)
http://sunstripe.main.jp/

(月１WEBコンテンツをリリースして便利な世の中を作っていくぞ！！ボランティアプログラマー/デザイナー/イラストレーター/その他クリエイター声優募集中！!)

### 地域情報 THEメディア
THE メディア 地域活性化をテーマに様々なリリース情報も含め、記事をお届けしてます！！
https://the.themedia.jp/

### ゼロからはじめる演劇ワークショップ
多様化の時代に向けて他者理解を鍛える

https://workshop.themedia.jp/

### プログラミングワークショップ・ウェブ塾の開講！！！
様々なテーマでプログラミングに囚われずに取り組んでいきます。
詳しくはこちら　↓　↓　↓　↓　↓　↓　↓　↓
[プログラミングサロン 月１だけのプログラミング学習塾](https://workshop.themedia.jp/posts/7057553?fbclid=IwAR32CfRQ7RvDOhvuogoSwqxDLMOU7Jvuzljlnx-TMc27qBPX1BnWsfLcBR8
)

### 協力応援 / 支援者の集い
## チーム：サンストライプ
#### プログラミングラボ
https://twitter.com/sunstripe2011

一緒にポートフォリオを作りませんか？現場の体験やそれぞれの立場から年齢関係なく作品を作りたい方々と一緒にチームを作って、作品を作っています。現場に行きたい人には、職場紹介や職場の体験や悩み相談なども受けております。
様々な職種からプログラミングの知識を得たい、デザインの知識を得たい、データーベースの知識を得たいという人が集まっております。
週１のミーティングにそれぞれの近況と作業報告して、たまにリモート飲み会などをしております！！

興味がある方は、DMに話しかけてみてください。

## トラストヒューマン
http://trusthuman.co.jp/
私たちは何よりも信頼､人と考えてます｡

｢コンサルティング｣と｢クリエイティブ｣の両角度から｢人材戦略パートナー｣としてトータル的にサポートします！！

キャリア教育事業
広域学習支援プラットフォーム『のびのび日和』
https://slc-lab.amebaownd.com/

#スポンサー募集
php DateTimeを使い1日分と当月分のデータを見る

#概要
データベースから当日分と当月分のデータを取ってくる処理で
日付で条件絞る時に便利だったDateTimeクラスを実際に実装した流れに乗せて紹介します。
ちなみにデータベースで登録している日付はUNIXTIMEです。

###リンク
+ [DateTime クラス](http://php.net/manual/ja/class.datetime.php)

##ソースコード
まずは当日の日付を取得します。

```php:
// ソースコード実行時の日付を取得したい場合
$datetime = new DateTime();

// 日付を指定したい場合
$datetime = new DateTime('2017-06-16');
```

当日分の検索をするためには
一日の__始まりの時__(00:00:00)と__終わりの時間__(23:59:59)を条件に入れないといけないので
そのデータを取得していきます。

```php:
// 始まりの時間を取得していきます
$datetime->setTime(00, 00, 00);                // 00:00:00と日付に時間だけをセットする
$startOfDayUnixtime = $datetime->format('U');  // 日付をUNIXTIME形式にして渡す

// 終わりの時間を取得していきます
$datetime->setTime(23, 59, 59);                // 23:59:59と日付に時間だけをセットする
$endOfDayUnixtime = $datetime->format('U');    // 日付をUNIXTIME形式にして渡す
```
あとはデータベースの検索条件に__始まりの時間__と__終わりの時間__を渡し
その間のデータを取ってきてもらうだけですね！

こんな感じで、当月分のデータも取得します。

```php:
// 月の始まりの時間を取得していきます
$datetime->modify('first day of this months');  // 当月の1日を日付をセットする 6月だったら06/01
$datetime->setTime(00, 00, 00);                 // 00:00:00と日付に時間だけをセットする
$startOfMonthUnixtime = $datetime->format('U'); // 日付をUNIXTIME形式にして渡す

// 月の終わりの時間を取得していきます
$datetime->modify('last day of this months');   // 当月の最終日を日付をセットする 6月だったら06/30
$datetime->setTime(23, 59, 59);                 // 23:59:59と日付に時間だけをセットする
$endOfMonthUnixtime = $datetime->format('U');   // 日付をUNIXTIME形式にして渡す
```
あとはデータベースに条件として時間を渡すだけなので簡単ですね～

###おまけ
$datetime->__modify()__がすごく便利で日付計算が簡単に出来ます

```php:
$datetime->modify('+1 days');                      // 1日分足す
$datetime->modify('+1 days');                      // 1日分引く
$datetime->modify('+1 weeks');                     // 1週間分足す
$datetime->modify('+1 months + 5 days');            // 1ヶ月と5日分足す
$datetime->modify('first day of this months');     // 当月1日
$datetime->modify('last day of this months');      // 当月末尾
```
Elasticsearchとdocker-composeを使って開発したい時の記述

# docker-compose.yml
```docker-compose.yml
version: '2'
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:5.4.1
    environment:
      - xpack.security.enabled=false
      - http.host=0.0.0.0
      - http.cors.enabled=true
      - http.cors.allow-origin=*
      - http.cors.allow-methods=*
      - http.cors.allow-headers=*
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    volumes:
      - ./esdata/:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
      - 9300:9300
  elasticsearch-head:
    image: mobz/elasticsearch-head:5
    ports:
      - 9100:9100
```

上記をベースに、別のサービスを追加すると良いです。
（ちょっと無駄なhttp.cors系があるかもしれません・・・）

http://localhost:9100 でElasticsearch-headもついてきます。

# Circle CI での起動
vm.max_map_countの設定を変えられなくてエラーが出るので
environmentに以下を追加

```yml
      - transport.host=localhost
      - bootstrap.system_call_filter=false
```

https://discuss.circleci.com/t/running-elasticsearch-5/8559/13
JavaとJS(jQuery)とAjax。JSONの特定の値を取得。

# JavaからJSON型で返したデータの特定の値をjQuery(クライアント側)で取得する。

JSONを扱う処理の備忘録
Struts1.3.10を使用。


JSでAjax。Javaを呼ぶ。

```main.js
$.ajax({
    url     : "./SearchBook.do",
    type    : "POST",
    async   : true,
    data    : "ここにJavaへ投げるデータ",
    dataType: "json",
    success : function(result) {
        //成功時の処理
    }
});
```

JSから受け取ったデータでいろいろ処理をした結果を、Java側でJSON型に入れる。
データとしてString型とint型を用意。

```java:main.java
String title = "火花"
int totalPage = 152;

JSONObject result = new JSONObject();
result.put("タイトル", title);
result.put("ページ数", totalPage);
```

下のようなJSON型が返ってくる。
`{"タイトル":"火花","ページ数":"152"}`

```js
$.ajax({
    --省略--
    success	: function(result) {
        //成功時の処理
    }
});
```

あとはキーで対象の値を取り出すだけ。

```js:main.js
success	: function(result) {
    //成功時の処理
    $("#foo").text(result["タイトル"]);
    $("#bar").text(result["ページ数"]);
}
```

とりあえずこれでできました。
もっといい方法があれば是非ご教授願います。




## 違う書き方もある...
Javaのところでキーを英字に変える。

```java:main.java
String title = "火花"
int totalPage = 152;

JSONObject result = new JSONObject();
result.put("bookTitle", title);
result.put("totalPage", totalPage);
```
JS側は.(ドット)で繋いでキーを指定して値を取得する。

```js:main.js
$.ajax({
    url     : "./SearchBook.do",
    type    : "POST",
    async   : true,
    data    : "ここにJavaへ投げるデータ",
    dataType: "json",
    success	: function(result) {
        //成功時の処理
        $("#foo").text(result.bookTitle);
        $("#bar").text(result.pager.totalPage);
}
```






### parseするのかしないのか
※ajaxの`dataType`で`dataType: "json"`とJSON型で指定してやれば、parseする必要ありませんでした。
　逆に言うとparseするとエラーになります。


要するに...

```js:main.js
$.ajax({
    url     : "./SearchBook.do",
    type    : "POST",
    async   : true,
    data    : "ここにJavaへ投げるデータ",
    dataType: "json",
    success	: function(result) {
        //成功時の処理
        $("#foo").text(result["タイトル"]);
        $("#bar").text(result["ページ数"]);
    }
});
```
または

```js:main.js
$.ajax({
    url     : "./SearchBook.do",
    type    : "POST",
    async   : true,
    data    : "ここにJavaへ投げるデータ",
    success	: function(result) {
        //成功時の処理
        var data = JSON.parse(result);
        $("#foo").text(result["タイトル"]);
        $("#bar").text(result["ページ数"]);
    }
});
```
とすること。
【Git】リモートにブランチを push してそのままトラックする

#リモートにブランチを push してそのままトラックする

##はじめに
たまに
git push -f をしてもできないですというエラーみたいなコメントがありまして


以下のように対応しました。

"git push" に "-u" あるいは "--set-upstream" を付けると、push 先のブランチをトラック (デフォルトで push や pull の対象に) するように設定されます。


~~~Git
git push -u origin master
~~~

~~~Git
git push --set-upstream origin new_feature
~~~
*バージョン 1.7 以降で使える

---

## 関連記事

【About】(http://qiita.com/sunstripe) - サンストライプ

---

## 制作チーム：サンストライプ

[![sunstripe_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/322f2d60-f19d-af9e-2b6f-7290ca546848.png)](http://sunstripe.main.jp/)
http://sunstripe.main.jp/

(月１WEBコンテンツをリリースして便利な世の中を作っていくぞ！！ボランティアプログラマー/デザイナー/イラストレーター/その他クリエイター声優募集中！!)

### 地域情報 THEメディア
THE メディア 地域活性化をテーマに様々なリリース情報も含め、記事をお届けしてます！！
https://the.themedia.jp/

### ゼロからはじめる演劇ワークショップ
多様化の時代に向けて他者理解を鍛える

https://workshop.themedia.jp/

### プログラミングワークショップ・ウェブ塾の開講！！！
様々なテーマでプログラミングに囚われずに取り組んでいきます。
詳しくはこちら　↓　↓　↓　↓　↓　↓　↓　↓
[プログラミングサロン 月１だけのプログラミング学習塾](https://workshop.themedia.jp/posts/7057553?fbclid=IwAR32CfRQ7RvDOhvuogoSwqxDLMOU7Jvuzljlnx-TMc27qBPX1BnWsfLcBR8
)

### 協力応援 / 支援者の集い
## チーム：サンストライプ
#### プログラミングラボ
https://twitter.com/sunstripe2011

一緒にポートフォリオを作りませんか？現場の体験やそれぞれの立場から年齢関係なく作品を作りたい方々と一緒にチームを作って、作品を作っています。現場に行きたい人には、職場紹介や職場の体験や悩み相談なども受けております。
様々な職種からプログラミングの知識を得たい、デザインの知識を得たい、データーベースの知識を得たいという人が集まっております。
週１のミーティングにそれぞれの近況と作業報告して、たまにリモート飲み会などをしております！！

興味がある方は、DMに話しかけてみてください。

## トラストヒューマン
http://trusthuman.co.jp/
私たちは何よりも信頼､人と考えてます｡

｢コンサルティング｣と｢クリエイティブ｣の両角度から｢人材戦略パートナー｣としてトータル的にサポートします！！

キャリア教育事業
広域学習支援プラットフォーム『のびのび日和』
https://slc-lab.amebaownd.com/

#スポンサー募集
Bluemix CF アプリケーションでのIPアドレスの取得

BluemixのCFアプリケーションは、一般的なCF環境と同様に実行時のコンテナのIPアドレスを環境変数(CF_INSTANCE_IP)経由で取得することが出来る。

簡単に表示できるのでPHPのRuntimeを使った場合、`index.php` を次のように下記変えて実施（他の言語の場合でも同じように）


```
<!DOCTYPE html>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
	<link rel="stylesheet" href="style.css" />
</head>
<body>

	<table>

<?php
	
	foreach ( $_ENV as $k => $v) {
		echo "<tr><td>$k </td><td> $v </td></tr>";
	}
?>

	</table>
</body>
</html>

```

この取得できる中でも特に以下のまわりがアドレスまわりとなる。

* CF_INSTANCE_IP
* CF_INSTANCE_ADDR
* CF_INSTANCE_PORT
* CF_INSTANCE_PORTS
* CF_INSTANCE_GUID
* CF_INSTANCE_INDEX

各値の説明はだいたい名前でわかると思いますがCFのマニュアルに定義されています。

* Cloud Foundry Manual : https://docs.cloudfoundry.org/devguide/deploy-apps/environment-variable.html
SaaSForceの画面レイアウト作成で、失敗をなかったことにする方法

![wfc20161109043.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/b722194c-839e-6564-8a56-904c8c436a7e.jpeg)

SaaSForceで作業中に、ある程度の気づかなかったミスをして、まだ特に保存してもいないケースでは次のボタンで簡単に修正できます。

![wfc20161109045.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/adcd38e7-fcb8-88e5-7b2a-6c9a2e95e1bc.jpeg)

こちらの修正内容取り消しと言うアイコンを押すと、全部元に戻ってしまいます。

複数のミスでも戻るのですから、最初からやり直したい場合には便利な機能ですね。

逆に言うと、チェックして保存をこまめにやっておくと、少なくともうまくいっている作業に関してはそのまま維持できると思います。
シェル30本ノックを社内向けにアレンジして勉強会で使ってみた

[株式会社オズビジョン](http://www.oz-vision.co.jp/)の@terra_yuccoです。

今更ながら [Software Design 2017年1月号](http://gihyo.jp/magazine/SD/archive/2017/201701) の「シェル30本ノック」に触れる機会がありました。社内勉強会の題材として。

- ノックそのままはかなり癖がある
    - 少なくとも一般的なWeb開発者に求められるのはほぼ一部
- タイムボックスが30分

という理由から、設問を社内向けにアレンジして利用しました。
元の著作権に引っかからない範囲で、出題意図や、参加した3チームから出た回答をシェアしたいと思います。

# なぜWebの会社でシェル？

Web屋さんですが、サーバはAmazon LinuxのEC2ですし、故障対応時などはsshログインしてlinuxコマンドを叩きます。ログインシェルはbashです。
プロセスの起動状況を確認したり、アクセスログの集計をしたり、利用するシーンが少なくないので、この機会にちょっと頭を捻ってみても良いかな？と思いました次第。

# 実際の問題
## Q1
### 設問
これはノックのものをそのまま使いました。問題が気になる方はぜひ実際の書籍を読んでみてください。
### 各チーム回答集
```bash 
# team 1
cat files.txt | grep -E "\.exe$"
# team 1 別解
cat files.txt | grep  "\.exe$"
# team 2
grep "\.exe$" files.txt
# team 3
grep -E ".*\.exe$" files.txt
```
環境はかなり古いamazon linuxから立ち上げているsandboxを利用しています。
4つの回答がどれも一致しないのが面白いなと個人的には感じました。grepするときに、まず前段にcatを挟む人、-Eの有無など。このあたり、パッケージのディストリビューションによっても挙動が変わったりするので、面白いところです。

## Q2
### 設問
ファイルからの設定の抽出

```text 
sandboxサーバのhostsに記載されているホスト名のうち
「db」が含まれているホスト名を列挙する
コメントアウトされている行は除く
```

### 各チーム回答集
```bash 
# team 1
cat /etc/hosts | grep "db" | grep -v -E "^#" | awk '{print $2}'
# team 2
grep "db" hosts | grep -v '^#' | awk '{print $2}'
# team 3 - 設問読み違え
grep -E "^[^#].*db" /etc/hosts
```
team1とteam2はgrepの癖こそあるものの、ほぼほぼ同じ結果となりました。
面白いのはteam3で「ホスト名だけを抜く」という問題文こそ見落としましたが、コメントアウト行を除くという条件も最初のgrepに含めているところがほかの2チームと違うところ。

あと2問ありましたので、また次の更新で追記します。
WMI経由でリモートPCの情報を抜いてみた by Go言語

#はじめに
以前、[PythonからリモートPCの色んな情報を抜いてみた by WMI Library](http://qiita.com/nagase/items/3e9947afbf09063906dc)というエントリーを投稿しましたが、今度はGo言語でリモートPCの情報を抜いてみたいと思います。

尚、Goの開発環境と実行環境は、既に準備できていることを前提に書いています。

また、WMIのモジュールは[こちら](https://github.com/StackExchange/wmi)で公開しているものを使わせて頂きました。
（サポートするプラットフォームはWindowsだけのようです）

#WMI for Go のインストール

goコマンドで一撃インストールです。

```
>go get -v github.com/StackExchange/wmi
```

#まずはExample的なモノを動かす

github.com/StackExchange/wmi.go の冒頭コメントにExample的なものが記載されていたので、取敢えずはそれに倣ってテストコードを書いて動かしてみます。

テストコードは以下のような感じです。（ほぼExampleの丸写し）

```go:wmitest.go
package main

import (
    . "fmt"
    "github.com/StackExchange/wmi"
    "log"
)

type Win32_Process struct {
    Name string
}

func main() {
    var dst []Win32_Process
    q := wmi.CreateQuery(&dst, "")
    err := wmi.Query(q, &dst)
    if err != nil {
        log.Fatal(err)
    }
    for i, v := range dst {
        Println(i, v.Name)
    }
}
```

テストコードができたので、とりあえず動かしてみます。
ちなみにコードを実行すると、以下のようにローカルPC上の実行プロセス一覧が表示されます。

```
>go run wmitest.go
0 System Idle Process
1 System
2 smss.exe
3 csrss.exe
4 wininit.exe
5 services.exe
6 lsass.exe
7 svchost.exe
8 svchost.exe
9 fontdrvhost.exe
10 svchost.exe

...(省略)

205 notepad.exe
206 chrome.exe
207 WmiPrvSE.exe
208 WmiPrvSE.exe
209 SearchProtocolHost.exe
210 smartscreen.exe
211 cmd.exe
212 conhost.exe
213 go.exe
214 wmitest.exe
```


環境やモジュール依存周りでハマるかもしれない、と覚悟していたのですが、あまりに呆気なく動いたので少々拍子抜けです。
尚、[Win32_Processクラス](https://msdn.microsoft.com/en-us/library/aa394372(v=vs.85).aspx)のNameプロパティから値を取得していることが解ります。

#リモートマシンの情報を抜いてみる

次に、実際に欲しい情報はローカルPCの実行プロセス一覧ではないので、リモートPCのOS情報を取得できるコードに改変します。（テストコードをコピー＆改変）


```go:sysinfo.go
package main

import (
    . "fmt"
    "github.com/StackExchange/wmi"
    "log"
)

var NODE string = "hostname.mydomain.local"
var USER string = "MYDOMAIN\\Administrator"
var PASS string = "P@sswr0d"

type Win32_OperatingSystem struct {
    CSName string
    Caption string
    Version string
    CSDVersion string
}

func main() {
    var dst []Win32_OperatingSystem
    q := wmi.CreateQuery(&dst, "")
    err := wmi.Query(q, &dst, NODE, nil, USER, PASS)
    if err != nil {
        log.Fatal(err)
    }
    for _, v := range dst {
        Printf("CSName: %s\n", v.CSName)
        Printf("Caption: %s\n", v.Caption)
        Printf("Version: %s\n", v.Version)
        Printf("CSDVersion: %s\n", v.CSDVersion)
    }
}

```

テストコードはWin32_Processクラスを参照していたので、[Win32_OperatingSystemクラス](https://msdn.microsoft.com/en-us/library/aa394239(v=vs.85).aspx)を参照するよう変更しました。
ちなみに、リモートマシンへ接続するには、```wmi.Query()```のパラメータに、コードのように認証情報（ホスト名 | IPアドレス、アカウント、パスワード）をセットする必要があります。
またパラメータの4番目は WMI の namespace を指定することができ、何も渡さなければデフォルトの namespace (root\CIMV2)が参照されます。

（参考）[WMI for Goドキュメント](https://gowalker.org/github.com/StackExchange/wmi#Query)


コードを実行すると、以下のようにリモートマシンのOS情報が表示されます。

```
>go run sysinfo.go
CSName: hostname.mydomain.local
Caption: Microsoft Windows 7 Professional
Version: 6.1.7601
CSDVersion: Service Pack 1
```
Hello World の次にテストを練習する


## 概要

Go には標準のテストツールが用意されており、Hello World の書き方を学んだらすぐにテストの練習を始めることができます。

## Hello World の復習

Hello Wolrd を表示するプログラムを書いてみましょう。`hello.go` としてます。

```go:hello.go
package main

func main() {
    println("hello world")
}
```

`print` および `println` は `builtin` モジュールなので、明示的に `import` を書かなくてすみます。

実行してみましょう。

```bash
go run hello.go
```

モジュールのインポートの練習として `println` を `fmt.Println` に置き換えてみましょう。

```go:hello.go
package main

import "fmt"

func main() {
    fmt.Println("Hello World")
}   
```

## 関数を定義する

テストの練習のために関数を定義します。`Hello World` という文字列を返す関数を定義してみましょう。`hello.go` は次のように書き換えられます。

```go:hello.go
package main

func getGreeting() string {
    return "Hello World"
}

func main() {
    println(getGreeting())
}
```

## 最小限のテストコードを書く

テストの練習にとりかかってみましょう。`hello_test.go` という名前のテストを書いてみましょう。

```go:hello_test.go
package main

import (
    "testing"
)

func TestHello(t *testing.T) {
}
```

テストを実行してみましょう。

```go:bash
go test
```

結果は次のようになります。

```bash
PASS
ok  	_/Users/masakielastic/test/golang-project	0.019s
```

よりくわしい情報を表示させたいのであれば `-v` オプションを指定します。

```bash
go test -v
```



個別にファイルの名前を指定することができます。

```bash
go test hello_test.go
```

## 失敗させてみよう

`t.Fail()` を追加してみましょう。


```go:hello_test.go
package main

import (
    "testing"
)

func TestHello(t *testing.T) {
    t.Fail()
}
```

`go test -v` を実行すると結果は次のようになります。

```bash
--- FAIL: TestHello (0.00s)
FAIL
exit status 1
FAIL	_/Users/masakielastic/test/golang-project	0.018s
```

自分が書いたメッセージを表示させるために `t.Error()` を使ってみましょう。

```go:hello_test.go
package main

import (
    "testing"
)

func TestHello(t *testing.T) {
    t.Error("失敗しました。")
}
```

結果は次のようになります。

```bash
=== RUN   TestHello
--- FAIL: TestHello (0.00s)
	hello_test.go:8: 失敗しました。
FAIL
exit status 1
FAIL	_/Users/masakielastic/test/golang-project	0.019s
```

## 自分で定義した関数をテストする

`hello.go` で定義した `getGreeting` 関数を `hello_test.go` でテストしてみましょう。

```go:hello_test.go
package main

import (
    "testing"
)

func TestHello(t *testing.T) {
    expected := "Hello World"
    actual := getGreeting()

    if expected != actual {
        t.Error("期待される文字列を得られませんでした。")
    }
}
```

`go test -v` を実行すれば PASS が表示されます。

## アサートを使う

毎回 if 文を書くのはめんどうなので、Testify を導入してアサートを使えるようにしてみましょう。次のコマンドで最新のパッケージをインストールします。

```bash
go get github.com/stretchr/testify/assert
```

```go:hello_test.go
package main

import (
    "testing"
    "github.com/stretchr/testify/assert"
)

func TestHello(t *testing.T) {
    expected := "Hello World"
    actual := getGreeting()

    assert := assert.New(t)
    assert.Equal(expected, actual, "同じ値でなけければなりません。")
}
```

## require を使う

`assert` の代わりに `require` を使ってみましょう。

```go:hello_test.go
package main

import (
    "testing"
    "github.com/stretchr/testify/require"
)

func TestHello(t *testing.T) {
    expected := "Hello World"
    actual := getGreeting()

    require.Equal(t, expected, actual, "同じ値でなけければなりません。")
}
```
DirectorのXtraを2017年に作成するために必要なこと

## 序文
　先日、Macromedia DirectorのXtra(AfterEffectsのプラグイン相当)を作成しました。
そのセットアップ作業をここに纏めておきます。
　具体的には、西暦２０００～２０１０年頃のMacromedia Directorデータを業務で再利用することになり
現在のツール向けにコンバートするための出力用Xtraを作成しました。

---
## XDKのダウンロード
　Windows用のDirector Xtraの開発は、Visual C++で行います。
開発にあたっては、Macromedia(現Adobe)が配布するXtra Development Kit(XDK)が必要です。
　以下のURLからダウンロードできます。

### Director Support Center Downloads
・Director MX2004からDirector 12までのXDK
http://www.adobe.com/support/director/downloads.html
・Director 8.5（2017/06/16 現在。IP直打ちなので移動に注意）
http://192.150.16.202/support/xtras/xdks/xdk.html

　ダウンロードできると書きましたが、最初はリンク先にアクセスできませんでした。
AdobeのFTPサーバーの問題なのか？Google検索とIP直打ちで探し回ってようやくXDKをダウンロードできました。
　2017/06/16現在は上記のリンクから問題なくダウンロードできます。

---
## 環境構築
　このXDKには、開発に必要なVisual C++用のヘッダーファイルやサンプルプロジェクト、マニュアル（英語/html）が含まれています。

　XDKは、対象となるDirectorのバージョンと同時期に作成されています。
当然ながらサンプルプロジェクトも同時期のVisual C++向けに作成されています。

　今回はMX2004用のものを使用しましたが、対象のサンプルプロジェクトはVisual C++ 6.0向けでした。
さすがに社内にそんなに古いバージョンのVisual C++はありません。

　Visual Studio 2015 Communityでプロジェクトを読み込むと、変換ダイアログが出てきて変換してくれますが、
正常にコンパイルすることができません。
　可能な限り古いバージョンを探して試した結果、Visual Studio 2005 Professionalではコンパイルできません。
　次にVisual Studio.NET (2002)で試そうとしたところ、64bitのOSにはインストールできないといわれます。
（正確には付属する.NET Framework が64bit OSにインストール不可）
　社内にはWindows7以降の64bit OSのPCとライセンスしかないため、Windows XP Modeをセットアップしてそこにインストールしました。
　次にサンプルプロジェクトをコンパイルして動作を確認しようとすると、MSVCR71.dllが無いといわれます。
「Visual Studio.NET 2003 の Visual C++ 再頒布可能パッケージ」をインストールして動作確認を行い、ようやく環境をととえることができました。

---
## Xtraは入り口。そしてLingo、MIAWへ
　サンプルプロジェクトのソースファイルは、10以上の事例が用意されています。
ドキュメントもあるので、Visual C++の経験者ならさほど苦労せずにXtraの開発が可能になります。

と最初は思いました。

　Xtraではアクセスできないパラーメータがあるとか、
　Lingo(AfterEffectsのAE Script相当)ではアクセスできるけど値が正しくないパラーメータとか、
　そもそもLingoは、AfterEffectsのAE Scriptのように外部から読み込んで実行ではなく、プロジェクトに埋め込まないと実行できない！のでMIAWを使うとか

などを思い知るのはもう少し後のことです。
　結果としてXtraで作成した処理を、Lingoで書き直して、MIAWのことを調べて回る破目になりました。

---
## Lingoの話

　もしこの記事を読んで、仕方ないLingoで書き直そうまでセットで追体験する人のために、
こちらで見つけたLingo関連のWEB上のドキュメントのURLを張っておきます。


Director ヘルプ (日本語)
https://helpx.adobe.com/jp/director.html

日本語	Director Help / トピック
https://helpx.adobe.com/jp/director/topics.html

Scripting Dictionary (スクリプト日本語ヘルプ)
http://help.adobe.com/ja_JP/Director/11.5/UsingScripting/WS0c3ae2fbbc706611-689fe9bb11e3fdc84dc-8000.html

Adobe Forum	検索 (プレイスをDirector)(検索結果は英語)
https://forums.adobe.com/search.jsp?place=%2Fplaces%2F1395431

Director テクニカルノート一覧（2017/06/16 現在。IP直打ちなので移動に注意）
http://192.150.16.202/jp/support/director/technotes.html
SaaSForceで画面のパーツをそろえる方法：その4

![wfc20161109035.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/e31533cc-408f-bf0f-7317-619497df395a.jpeg)

SaaSForceで画面レイアウトの作業をしているときに、間違ってパーツのサイズが変わってしまったというケースがあります。

こういうのを戻すにはどうするか、いくつかの方法をご紹介したいと思います。

![wfc20161109036.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/dc6dcdc0-73bc-234e-5ef0-95f22f5cac03.jpeg)

この高さ揃えというアイコンを押すと、高さがすぐに揃います。

これは、基準となるパーツがある場合とても役に立ちます。

しかし、他の方法もあるので、覚えておくといいでしょう。

![wfc20161109037.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/3a104c18-b97c-acfb-a0ab-4150db73b658.jpeg)

基準となるパーツを右クリックをして、「サイズ／場所」を選択します。

![wfc20161109038.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/d52304b3-30cf-efe0-35d5-d27402d7d7a5.jpeg)

このような画面が開くので、そこでサイズのデーターを2つ覚えてしまいます。

一度閉じて、今度はサイズを修正したいパーツで同じように右クリックをして「サイズ/場所」を選び画面を開きます。

![wfc20161109039.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/7f75089a-d5b7-aef8-523c-de42610c78f7.jpeg)

![wfc20161109040.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/2ff1a60a-f782-8f7e-74ca-a41452d30363.jpeg)

サイズの数字を入力して、保存をします。

![wfc20161109042.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/1c1fff47-dbd2-07a2-11a6-052649c19a56.jpeg)

念のために基準にしたパーツとそろえてみますが、大きさは一緒です。

いかがでしたでしょうか、

ただ、状況によっては、一度画面を消して最初からやり直すほうが早いという場合もあるようです。

他にも、いくつかの機能を組み合わせれば、合理的な並べ方やそろえ方が発見できるかもしれません。
Pandoc で Markdown を PDF 出力する環境構築

# 目的
pandoc で markdown から PDF ファイルを出力する検証をしたかっただけなのですが、
環境構築が結構手間だったので備忘のため記録します。

## 環境
- Windows 10 64bit

## Chocolately インストール
パッケージ管理の Chocolately をインストール、管理者権限で PowerShell を起動
必要に応じてプロキシ設定
[認証proxyを使う環境設定（PowerShell） - Qiita](http://qiita.com/kkdd/items/ac6e65f6e2e8fc32e7ca)

``` powershell
> Set-ExecutionPolicy RemoteSigned
> set ChocolateyInstall=C:\ProgramData\chocolatey
> Invoke-Expression ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))
> choco list -lo
Chocolatey v0.10.3
```
## pandoc インストール
引き続きPowerSehll からインストール。インストール後に pandoc コマンドを認識しなかったら、PowerShell を起動しなおす。

``` powershell
> cinst pandoc
> pandoc -v
pandoc.exe 2.0
Compiled with pandoc-types 1.17.0.4, texmath 0.9, skylighting 0.1.1.4
Default user data directory: C:\Users\saitotak\AppData\Roaming\pandoc
Copyright (C) 2006-2016 John MacFarlane
Web:  http://pandoc.org
This is free software; see the source for copying conditions.
There is no warranty, not even for merchantability or fitness
for a particular purpose.
```


## TeX インストール
TeXのインストールと設定めんどくさすぎる。
プロキシの都合で [TeXインストーラ 3](http://www.math.sci.hokudai.ac.jp/~abenori/soft/abtexinst.html) がうまくいかなかったので、
ISO フィアルをダウンロード（texlive2017.iso）

- https://texwiki.texjp.org/?TeX%20Live#iso

[Daemon Tools Lite](http://www.nihongoka.com/daemontools/) にマウントしてインストール
Powershell を立ち上げなおして確認

``` powershell
> tex -v
TeX 3.14159265 (TeX Live 2017/W32TeX)
kpathsea version 6.2.3
Copyright 2017 D.E. Knuth.
There is NO warranty.  Redistribution of this software is
covered by the terms of both the TeX copyright and
the Lesser GNU General Public License.
For more information about these matters, see the file
named COPYING and the TeX source.
Primary author of TeX: D.E. Knuth.
```


# 変換
UTF-8 の Markdown テキスト（日本語含むもの）を用意

``` SAMPLE.md
# ほげ
- FUGA
- ピヨ
```

日本語を PDF 変換するため、h-luatexja.tex というファイルを同フォルダに用意

``` h-luatexja.tex
\usepackage{luatexja}
\hypersetup{unicode=true}
```

## 変換

``` console
pandoc .\SAMPLE.md -o .\SAMPLE.pdf --latex-engine=lualatex -H .\h-luatexja.tex
```

## できた
![image.png](https://qiita-image-store.s3.amazonaws.com/0/130874/b97e8827-1401-c549-909d-662f255bcec1.png)

TeX つらい。

## 参考
[markdownで書いた文書をbeamerに変換するときのメモ · GitHub](https://gist.github.com/rinx/8644437)
[多様なフォーマットに対応！ドキュメント変換ツールPandocを知ろう - Qiita](http://qiita.com/sky_y/items/80bcd0f353ef5b8980ee)
[markdownの原稿を、pandocを使って、Texのbeamerを利用して、プレゼンスライドPDFに変換 - Qiita](http://qiita.com/danpansa/items/7ea8db3942a7946dd56a)
[認証proxyを使う環境設定（PowerShell） - Qiita](http://qiita.com/kkdd/items/ac6e65f6e2e8fc32e7ca)
[Pandocの比較的簡単なインストール方法 - Qiita](http://qiita.com/sky_y/items/3c5c46ebd319490907e8)
GKE + k8s オートスケールの設定方法


## オートスケールの設計

GKE + k8sにおいて、オートスケールには2種類存在する。

- Horizontal Pod Autoscaling（水平Podオートスケール）
- Cluster Autoscaler

前者がPodをスケールさせ、後者がクラスタをスケールさせる。スケール速度はPodであれば一瞬、クラスタノードは起動までに30秒前後かかる。また、k8sの再起動がはいる。

CPUリソースなどの使用状況をk8sが監視し（デフォルト30秒）、設定されたオートスケール閾値を超えたら新しくPodをたてたり、クラスタを増やしたりする。当然、負荷が下がったら自動で減る。

### 戦略

基本は2つのオートスケールを組み合わせ使う感じが良いだろうと思う。

- Horizontal Pod Autoscaling・Cluster Autoscalerを設定
  - 最小起動数は予測できるトラフィックに合わせる
    - ノード数についてはデプロイ時のPod数も考慮に入れる
- トラフィックが増加すると、まずPodが立ち上がる
  - CPUリソースなどが足りずPodが起動できないと、ノードが立ち上がる
    - 新規ノードにPodが立ち上がる
  - トラフィックが減少すると、Podが減り、順次ノードも減る

また、k8sの監視がデフォルトだと30秒間隔なので、トラフィックが増加してからスケールするまでに1分弱くらいのタイムラグがある。これが許容できない場合はk8sの設定を変更することで間隔を短くできるようだ（未検証）。

`kube-controller-manager` の `--deployment-controller-sync-period` オプションで設定できる。

## 設定方法

`kubectl` コマンドを使った設定方法。

### 手動でPodの数を設定する

```
$ kubectl scale deployment <POD_NAME> --replicas=3
```

### Horizontal Pod Autoscaling

CPUが70%以上使われていた場合、最大3個までPodをたてるという設定例。

```
$ kubectl autoscale deployment <POD_NAME> --cpu-percent=70 --min=1 --max=3
```

設定内容を修正したい場合は `edit` でviが立ち上がるので、そこで値を修正する。

```
$ kubectl edit hpa <POD_NAME>
```

削除はこちら。

```
$ kubectl delete hpa <POD_NAME>
```

また、各ノードのCPUリソース利用状況を抜き出すコマンド例。 `describe` がJSONをサポートしていないのでちょっとダルい。

```
$ kubectl describe nodes | grep % | grep -v kube-system | grep -v default
```

### Cluster Autoscaler

オートスケールの設定は、ノードプールに設定する。

```
$ gcloud container clusters update <CLUSTER_NAME> --enable-autoscaling --min-nodes=3 --max-nodes=20 --node-pool <NODEPOOL_NAME>
```

ノードプール名は指定していなかったら `default-pool` と思われる。

また、Cluster Autoscaler自体はまだベータ版（2017/06/16時点）。

> これは Cluster Autoscaler のベータ版です。この機能はサービスレベル契約（SLA）または非推奨ポリシーの対象ではなく、バージョン アップ時に下位互換性が維持されない可能性があります。

公式ドキュメントにはこのような注意書きが書かれているので、運用する際はそのつもりで。

実際に試してみたところ、特に問題なく動いた。が、負荷がなくリソースも圧迫していないのに、なぜかノード数が最小まで減少しない現象が発生した。設定の問題かもしれないが。

## YAMLファイルの記述例

実際はYAMLで記述することが多いと思うので、記述例も記載しておく。この場合、最低1個・最高40個でCPUが70%以上という感じ。ちなみにメモリを閾値にするのはサポートされていない。

```
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: <NAME>
spec:
  maxReplicas: 40
  minReplicas: 1
  targetCPUUtilizationPercentage: 70
  scaleTargetRef:
    apiVersion: extensions/v1beta1
    kind: Deployment
    name: <DEPLOYMENT_NAME>
```
SaaSForceで画面のパーツをそろえる方法：その3

![wfc20161109029.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/30917f50-3034-def0-cbc1-e11fa9460c7e.jpeg)

前回は、縦にパーツが並んでいるケースで紹介したのですが、今回は横に並べるときです。

![wfc20161109030.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/9c973559-ce84-59c9-a632-5c70e1e41e0f.jpeg)

下揃えと言うアイコンを押すと、このようの整います。

ここで、ちょっと実験を行うので、一回保存をお願いします。

![wfc20161109031.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/8e9e7f74-5057-bbd8-8dae-757b4d0ab3ed.jpeg)

横等間隔と言うアイコンがあるのですが、これはこの状態ではお勧めできません。

![wfc20161109032.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/ceb70ec6-9ed1-5745-92d9-d3e5a9c707ce.jpeg)

これがその理由です。

ラベルといわれる文字が表記されているパーツも「パーツ」とみなされるので、それも等間隔に並んでしまいます。

これを整えるのは大変なので、一度画面を閉じてもう一度開きます。

このようなケースでは、私はこれを使います。

![wfc20161109033.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/e9491795-c8ee-8219-05ba-24fa2491167b.jpeg)

いわゆる方眼用紙状態の背景にできる機能ですね。

![wfc20161109034.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/9816caa8-f7c2-0590-ed8a-a760d07951f0.jpeg)

このようにきれいに整えることができました。

この機能はいろいろなほかの位置決めの用途でも使えると思います。
WinCDEmu(cdイメージマウント）

CDマウントのソフトはいろいろあるのですが、ウイルス入ってたり、広告入ってたりめんどくさいのが増えました。
WinCDEmuは対応しているフォーマットは多いわけではないのですが、動作が分かりやすくて簡単。軽めです。
http://wincdemu.sysprogs.org/
WebpackBinでブラウザ上でWebpack+ESNextのようなコードを書いて動作をシェアする

![WebpackBin_🔊.png](https://qiita-image-store.s3.amazonaws.com/0/84144/8cd28c28-78d5-1df0-9d6d-c635df47c63a.png)

あるライブラリのドキュメントを見てたら、Exampleコードの所で使われていて知りました。

[Webpackbin](https://www.webpackbin.com/)はブラウザ上でコードを書いてチェックできます。jsFiddleやCodepenといったサービスとよく似ていますが`import`でパッケージを読み込んだりできるので、一々CDNのURLを調べて読み込ませる必要がありません。ただコチラは`<iframe/>`で埋め込んだりはできないようです。（ロードが長いので仕方ないのかも）

## 使い方

### BabelかTypeScriptか選ぶ
[Webpackbin](https://www.webpackbin.com/)にアクセスするとBabelかTypescriptどっちを使うか聞かれると思うのですが、僕はES2015の方しか使っていなのでこっちを選択してください。
![WebpackBin_🔊.png](https://qiita-image-store.s3.amazonaws.com/0/84144/9d016c44-ade7-9808-19a1-24f3364b4f47.png)

選択するとURLが変わったと思いますが、シェアする時は多分このURLを貼り付けます。

### とりあえず挨拶

挨拶というか実行してみます。最初から`main.js`があると思うのでそれを選択して適当に`console.log('Hello WebpackBin!')`とでも書いておきます。

![WebpackBin_🔊.png](https://qiita-image-store.s3.amazonaws.com/0/84144/2715d67b-c53e-abfc-236a-3c9d2fff8695.png)

上のコントロールバーの右から３つ目のアイコン（画像参照）をクリックするとログを出力する場所が出てくるので、ここでチェックできます。コードを書いたら`cmd+s`(winだと`ctrl+s`?)すれば実行できると思います。

### Reactを使ってみる

まずパッケージとReactなので`jsx`を使えるようにする必要があります。これには右上の歯車アイコンをクリックして設定する必要があります。

![WebpackBin_🔊.png](https://qiita-image-store.s3.amazonaws.com/0/84144/05dd850d-f79b-b8b8-d3d8-5dc6b50ea138.png)

1. `babel-loader`の設定の中の`React`にチェックを入れる
2. 「Add NPM package」で`react`と`react-dom`を追加

後はコードを書くだけです。これはなんでもいいのでとりあえずこうなります。右に結果が出るはずです。

![WebpackBin_🔊.png](https://qiita-image-store.s3.amazonaws.com/0/84144/99b2db5f-524b-e5d9-763e-b76f53d90524.png)

ちなみに上記の画像の動作の辺りは[ココ](https://www.webpackbin.com/bins/-KmjC_WiYX8um9_NQGQC)で見れます。

### RxJS

こっちはただ`rxjs`を追加するだけですね。

![WebpackBin_🔊.png](https://qiita-image-store.s3.amazonaws.com/0/84144/e0a88ec3-0bd1-a852-6c43-30885330ddd5.png)

後はコード書いて実行するだけです。

![WebpackBin_🔊.png](https://qiita-image-store.s3.amazonaws.com/0/84144/32a959ab-158f-f5d0-0679-db09e460c85e.png)

[動作を見る](https://www.webpackbin.com/bins/-Kmj5rCPb_G0vAAF8SiG)

なんでこれを載せたかというと、`rxjs/Rx`だと何故か`import`できなくてエラーになってしまうので、ちょっと良くわからない部分もあります😇

![WebpackBin.png](https://qiita-image-store.s3.amazonaws.com/0/84144/fc1b8e4f-25f2-519d-cd8b-1aafcf4272b5.png)

## 他に

### ツリービューみたいに表示  
![WebpackBin.png](https://qiita-image-store.s3.amazonaws.com/0/84144/095fd0d4-7b62-7168-f049-1535940ddfbd.png)

### Live機能で編集者の変更した部分をリアルタイムで反映させて見せる  
![WebpackBin - live.gif](https://qiita-image-store.s3.amazonaws.com/0/84144/ac39415e-034b-8176-3745-a8c2ad2658ca.gif)

### 即ローカルで試せる形でダウンロード
歯車の左のアイコンをクリックするとダウンロードできます。ダウンロードしたディレクトリに移動 -> `yarn` -> `yarn start`でポート３０００で建つので、即ローカルに持ってくることもできます。

## おわりに

これから活用していこうと思います😍
SaaSForceで画面のパーツをそろえる方法：その2

![wfc20161109022.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/c1d81642-8bea-6ecb-b4fc-ea406307f337.jpeg)

SaaSForceで最初に苦労したのは、画面レイアウト作成の画面で、きれいにパーツをそろえることができなかったことです。

そこで今回お伝えしたいのは、いかにしてきれいにそろえるか、と言うことです、各パーツを。

![wfc20161109023.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/a9113546-41e5-d394-2d07-8ad47f80a2ca.jpeg)

この一連のアイコンを使って作業をすると、見た目が整ったアプリケーションの画面になります。

![wfc20161109026.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/13f7d2c7-8163-1337-b387-f10aa8976dff.jpeg)

マウスを使って範囲指定をし、パーツのふちを赤くします。

![wfc20161109027.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/3b289760-2041-75a5-566c-525461e1f084.jpeg)

次に、左揃えとなっているアイコンを押します。

![wfc20161109028.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/5f62f204-8432-2da7-089e-574863eddb67.jpeg)

続いて、縦等間隔配置のアイコンを押します。

どうでしょうか？

最初よりもきれいな配置ができたと思いませんか？

他のアイコンもそれぞれの機能があるので、また別の機会にご紹介します。
DeepSecurity のクロスアカウントロールを CloudFormation で


[[Deep Security] AWSアカウント連携をIAM Roleで設定する](http://dev.classmethod.jp/cloud/aws/deepsecurity-aws-with-iam-role/) を CloudFormation でやるには


`<account_id>` は[公式ドキュメント](https://help.deepsecurity.trendmicro.com/ja-jp/Add-Computers/add-aws.html#Add) を参照

```
---
AWSTemplateFormatVersion: '2010-09-09'

Parameters:
  ExternalId:
    Type: 'String'

Resources:
  DeepSecurityDelegationRole:
    Type: 'AWS::IAM::Role'
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: 'Allow'
            Condition:
              StringEquals:
                'sts:ExternalId':
                  Ref: 'ExternalId'
            Principal:
              AWS:
                - 'arn:aws:iam::<account_id>:root'
            Action:
              - 'sts:AssumeRole'

  DeepSecurityAWSIntegrationPolicy:
    Type: 'AWS::IAM::ManagedPolicy'
    Properties:
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: 'Allow'
            Action:
            - 'ec2:DescribeImages'
            - 'ec2:DescribeInstances'
            - 'ec2:DescribeRegions'
            - 'ec2:DescribeSubnets'
            - 'ec2:DescribeTags'
            - 'ec2:DescribeVpcs'
            - 'iam:ListAccountAliases'
            Resource: '*'
      Roles:
        - Ref: 'DeepSecurityDelegationRole'

Outputs:
  RoleArn:
    Value:
      'Fn::GetAtt':
        - 'DeepSecurityDelegationRole'
        - 'Arn'

  ExternalId:
    Value:
      Ref: 'ExternalId'
```

DeepSecurity 側の画面で CloudFormation の `Outputs` で出力された `RoleArn` を `クロスアカウントロールのARN` へ `ExternalId` を `外部ID` へ入力。

<img width="734" alt="スクリーンショット 2017-06-16 14.18.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/5763/c54b5e17-a942-6dbf-8e07-43677db8a8c0.png">
GitBucketとサーバの自動デプロイ環境構築

開発サーバにpushをしたら、webサーバに自動デプロイされる環境を構築する
-
前回の記事[GitBucketを自サーバに構築しよう](http://qiita.com/m_bat/items/d005092479344c913970)でGitBucketの構築方法を書いたので、今回はそれと連動させて、webサーバに自動デプロイされるような環境を作りたいと思います。今回は、開発サーバ兼テストサーバということで、ローカルからサーバのbareリポジトリ、およびGitBucketのリポジトリ（GitBucketでも管理できたら楽かなと思い)にpushし、それをnon-bareリポジトリであるwwwフォルダがpullするような構築作業を行います。
まず、下に今回の一連の流れのイメージ図を示します。
![スライド1.png](https://qiita-image-store.s3.amazonaws.com/0/166147/ed75f142-9eca-d924-1c6e-a69ccaf6026b.png)
-
###1. Gitのインストール
まず、gitコンパイルに必要なgccおよび、MakeMakerをインストールしてきます。

```
$yum -y install gcc
perl-ExtUtils-MakeMakerを導入
$yum -y install perl-ExtUtils-MakeMaker
```
続いて、gitに必要なツール群をインストールします。

```
$yum -y install curl-devel expat-devel gettext-devel openssl
```
準備が整ったので、gitをダウンロードします。ひとまずsrcディレクトリにダウンロードをします。

```
$cd /usr/local/src
$wget https://www.kernel.org/pub/software/scm/git/git-2.7.2.tar.gz
ファイルを解凍する
$tar xzvf git-2.7.2.tar.gz
```
続いて、gitのコンパイルおよびインストールを行います。

```
$make prefix=/usr/local all
$make prefix=/user/local install
```

###2. SSHの設定
ローカルからサーバにアクセスするために、sshの設定を行います。
パスワードを毎回聞かれないようにするため、公開鍵認証を用います。まず鍵を生成します。

```
$ssh-keygen -t rsa
```
ローカルで作成した公開鍵をサーバに投げてください。
詳細設定は省略。　ssh公開鍵などで検索すると出てきます。
./configも設定しおきましょう。ssh ホスト名　でアクセスできるようになります。

```
cd ~/.ssh
vi config

以下を記述
host ホスト
  HostName     アドレス
  Port         ポート
  User         ユーザ名
  IdentityFile ~/.ssh/id_rsa
```

###3. GitBucketのリポジトリ作成
前回の記事[GitBucketを自サーバに構築しよう](http://qiita.com/m_bat/items/d005092479344c913970)
で構築したGitBucketのサイトに行って、リポジトリを作成してください。GitHubとほぼ同じ方法で作成できます。作成したら、GitHubと同じ要領で、commitしpushを行ってください。

###4. リモートリポジトリ（bareリポジトリの作成）
次にサーバの方にリモートリポジトリを作成します。これはbareリポジトリで作成をしてください。
好きなディレクトリ（ここではわかりやすいように、ホームディレクトリとします）に移動し、bareリポジトリを作成します。

```
$cd
$mkdir git_remote
$cd git_remote
$git init --bare test.git
```

###5. pushの設定
ローカルリポジトリに移動し、configファイルにリモートリポジトリの設定を行います。
.git/configファイルの［remote "origin"］のurlに以下を追記します。

```
url = ホスト名:/bareリポジトリのパス/git_remote/test.git
```
こうすることで、./git/configには二つのurlが記述されることになります。まずはGitBucketのリポジトリのurlと、先ほど作成したbareリポジトリです。これで、ローカルからpushすると、GitBucketのリポジトリとbareリポジトリの両方にpushされます。一度pushしましょう。sshの設定を行っているので、パスワードを入力せずにpushすることが可能だと思います。

###6.　自動デプロイ環境の構築
最後に、自動デプロイ環境を構築していきます。
まずはリモートサーバのwwwにフォルダにファイルをクローンします。

```
$cd /var/www
$git clone /bareリポジトリのパス/git_remote/test.git
```
これで、wwwディレクトリにtestディレクトリが作成されたと思います。
自動デプロイはhook機能を使って構築していきます。

```
$cd /bareリポジトリまでのパス/git_remote/test.git/hooks
$mv post-receive.sample post-receive
$vi post-receive 
以下を記述
cd /var/www/test
git --git-dir=.git pull
```
実行権限を与え、pullされるかどうか実際に実行してみます。

```
$chmod +x post-receive
$./post-receive
```
ここで注意してほしいのですが、root権限で作業を行い設定をしていると、post-receiveを実行した際、下のようなエラーが表示されると思います。

```
remote: error: cannot open .git/FETCH_HEAD:
```
これはroot権限で作業行っていたため、.gitが開けないことが原因で起こるエラーです。
なので、www配下にあるtestディレトリのユーザ権限を以下のコマンドで変更しておきましょう。

```
$chown -R ユーザ名 /var/www/test
```
これで、すべての環境が整いました。ローカルからpushをすると、デプロイされ、
webページが更新されていると思います。またGitBucketのサイトにアクセスして、しっかりとコミットされているとことを確認してみてください。
これで、テストサーバでの確認をし、OKであれば本番サーバにpullするという環境も、構築をすることができると思います。

### ＜参考にさせていただいたサイト＞
「gitでシンプルなデプロイ環境を作る」
http://qiita.com/zaburo/items/8886be1a733aaf581045
Shotcut(動画編集ソフト)使ってみた

PCでの作業をやろーってときに、基本的に英語サイトでのレビューなんかを見てTOP３に来るツールを使ってみたりするのですが、Shotcut使ってみたところなんか悪くない感じだったので、未来の自分のために書き留めておきます。

https://www.shotcut.org/

なんと日本語化がしっかりされておりました、びっくり。
英語で問題ない人なのでそのあたり全然気にしないのですが、知り合いにも紹介しやすいのでGOODでした。

特にこだわった編集するとかじゃなくて、会議の内容とかつないだり、余分なところ消したり、サイズ圧縮しといたりくらいしかしない人、Windowsムービーメーカー位のお手軽低機能を探している人はいいかもしれません。
SaaSForceで画面のパーツをそろえる方法：その１

![wfc20161109018.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/c0fcde0e-9965-9226-6cf7-387be75496a5.jpeg)

SaaSForceは画面レイアウト作成の作業するとき、アプリケーションの画面でいろいろなパーツをそろえたり、並べ替えたりして見やすいデザインにすることができます。

例えば、次のような感じでそろえていきます。

![wfc20161109019.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/42cc1bc4-a96a-72ab-97fe-2de9c8f9c994.jpeg)

パーツを単独、もしくは複数赤くすることで、それらを同時に移動させることができます。

![wfc20161109020.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/5deac157-d9dc-d5f8-e55d-2793b6db36ae.jpeg)

このように一気に動かせます。

![wfc20161109021.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/0cd718ef-65b1-f6eb-c915-192d063ff52b.jpeg)


マウスで動かしたいパーツの全てを範囲指定をしてから放して、パーツが全て赤くなったらマウスを左クリックで引っ張るようにもっていきます。
VagrantのBoxに自動でyum updateしたい件

ちょっとしたTipsのようなもの。

vagrant initで生成したVagrantfileの最後に、

```ruby:Vagrantfile
config.vm.provision "shell", inline: <<-SHELL
（略）
SHELL
```
ってのがあるじゃろ？

ここを、

```ruby:Vagrantfile
config.vm.provision "shell", inline: <<-SHELL
    sudo yum -y update
SHELL
```
こうしておくと、
vagrant up時に勝手にprovisionしてyum updateできるぞという話。
もちろん他に走らせたいコマンドがあれば、
記述しておけば可能。

しょうもない話ですが。
SaaSForceの画面レイアウト作成の画面うまく操作ができないときの対処法：その1

![wfc20161109014.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/e18e20ed-9cef-de23-d183-e999b76ebda6.jpeg)

SaaSForceの『画面レイアウト作成』の作業をしているとき、パーツのふちが赤くならないというケースがたまに起こりえます。

これでは、パーツを動かすことができないという問題が発生します。

この問題を解決するには、グーグルをブラウザとして使っている場合、次のような対処で解決することがあります。

![wfc20161109016.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/5c5ce973-68db-d66d-0177-1431a67ca5ae.jpeg)

ブラウザgoogleの「設定」を押して、「その他のツール（L)」から「閲覧履歴の消去（C)」を選びます。


![wfc20161109017.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/d1820258-5411-706d-2dad-40596b9ba587.jpeg)

これで、なぜか今までうまく使えなかったいろいろな機能が使えるようになります。

特に、仕事などでPCを使う方は、キャッシュがたまっていると思うので、まめにこれをやるといいかもしれません。

なおパスワードなども一緒に消すと、かなり面倒なことになるので、そこはよく見た上でチェックをはずしてください。
定期的に開くファイルを自動的に（Mac)

## 経緯
会社で工数管理をExcelで入力しているのですが、毎日つけておかないと、月末になって「やらなきゃ！
・・・でもこの日ってどんな作業してたっけ？」ってなるので、防止策として自動的にExcelファイルを開くように設定しました。

### Excelファイルを開くCron実行

1.Crontabを開きます。

```
crontab -e
```

2.以下のようにスケジューリング設定をします。（月から金まで19時に工数管理のExcelファイルを開く）

```
###平日19時に工数管理を実行させる
###Crontabのスケジュール設定　分 時 月 年 曜日(1:月~7:日) スクリプト
###open -a アプリケーションを開くコマンド
0 19 * * 1-5 open -a "/Applications/Microsoft Excel.app/" <ファイルのパス>/ファイル名.xlsx
```

これでOKです。

これ以外にも月末に提出しないといけないファイルとか、Excelじゃなくてもエディタを開くとかできます。
システムに脆弱性が見つかったときにする大切なこと

システムに脆弱性が見つかったときにする大切なこと。

- データを守る
    - バックアップを取る

次にすること

- 脆弱性の緊急対策を実施する

(データに影響がない緊急対策がすぐに実施できる場合は、データを守る以前に実施するという考えもあり。）

その次

- 脆弱性の恒久対策を取る

「データを守らなかった」ばかりにデータ消失した経験は自分にもあるし、その時々の同僚にもある。

簡単に復旧できない脆弱性に対しては応急対策は絶対に必要だろう。

[コメント欄でbootstrapのクラスが効く](http://qiita.com/puriso/items/5bfae26df7c2d99c047f#comment-89cb614927eae3c31b80)
ServiceNow初期設定 メール送信を有効化する

ServiceNowの開発者向けインスタンスは最初、メール送信が無効化されているので有効化する。
インスタンスのビルドタイプはIstanbul。

# メール送信を有効化する

インスタンスにログイン
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/3f5b1f4f-f158-35e5-8456-1ef466299c53.png)

アプリケーションナビゲータの中から、システムプロパティ → メールプロパティを選択（<font color="red">赤枠</font>）。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/3bf8cc7f-912e-c5f7-fffc-e80fd07b195c.png)

「**メール送信の有効化**」にチェックを入れ「**保存**」ボタンをクリックする。
（メール送信の有効化の下にある「**このテスト用のメールアドレスにすべてのメールを送信 (実稼働環境以外のテスト)**」という場所に自身が受け取れるメールアドレスを入力すると、すべてのメールがそのメールアドレスに送信される。書いてあるように会社のインスタンスで入力すると大きな問題となるので注意。）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/c840c158-dfce-45f2-0784-65f161933c5e.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/2c08e51a-4e9d-9b29-73f1-7694413192e9.png)

もし、入力箇所が灰色になっていて編集できない場合はアプリケーションをGlobalに切り替え忘れている。
![sample.gif](https://qiita-image-store.s3.amazonaws.com/0/175688/cc0e619d-cbca-ee4a-7edb-0e20214df9ae.gif)

# 参考サイト
> ServiceNow Community - Email Notification is disabled in personal developer instance -
https://community.servicenow.com/thread/190721

# 関連記事
> - [ServiceNow メール通知を実装する](http://qiita.com/Kisaragi13/items/724bfe192dfa28c74f57)
[めも]Android SDK Managerで、Intel x86 Emulator Accelerator (HAXM... がNot compatible with Windowsなどの表示になる場合

#現象:Intel x86 Emulator Accelerator (HAXM... がNot compatible with Windowsと表示される
##Rev.(リビジョン)は、実際にインストールされているバージョンによらず、6.1.1と表示される (別のバージョンの場合もあります)
※実際のバージョン(intelhaxm-android.exeに設定されている値)は6.0.5や6.0.6など。

##Android SDK Managerからは、インストールもデリートもできない

※(Android SDK)\extras\intel\Hardware_Accelerated_Execution_Managerにあるのは、古いもの。
(intelhaxm-android.exe を右クリック＞プロパティ＞詳細で、バージョンを確認できます。)
最新版は、Program Filesの中にインストール先が変更されています。

#対処法:Intelのダウンロードページから最新版を取得する
ダウンロードページ
[Intel® HAXM](https://software.intel.com/en-us/android/articles/intel-hardware-accelerated-execution-manager)

※インストールガイドも、目を通しておいた方がよいかと思います。

メモリの割り当てを変えたい場合も、再度インストーラを走らせます。
>Adjusting Intel HAXM Memory Allocation
To change the amount of memory allocated to Intel HAXM, run the installer again.

###サービスの停止/開始が必要
確認用
> sc query intelhaxm

停止
> sc stop intelhaxm

開始
> sc start intelhaxm

###環境変数をセット(必要？？)
>Tips and Tricks
Make sure the "ANDROID_SDK_ROOT" environment variable is set

###バージョンの確認方法
Android Studio - Configure Hardware Acceleration for the Android Emulator
[Determining whether HAXM or KVM is installed](https://developer.android.com/studio/run/emulator-acceleration.html#accel-check)
に、コマンドが載っています。
>`./sdk/tools/emulator -accel-check`

####蛇足:　コマンドラインからをエミュレータ起動しようとした時に、Emulator error: This AVD's configuration is missing a kernel fileが出る場合
[Tips and Tricks](https://software.intel.com/en-us/android/articles/installation-instructions-for-intel-hardware-accelerated-execution-manager-windows)　にある
>`%ANDROID_SDK_ROOT%\tools\emulator –avd <avd_name> -verbose –show-kernel `

を実行した時に、エラー(configuration is missing a kernel file)が出る場合は、
<avd_name>の所で、誤ってパスを入力していないか確認しましょう。
(具体的には、`emulator  -list-avds`で出てくる名前になっているかを確認。)
システムイメージがダウンロードされていない場合もあるようですが、今までAndroid StudioからAVDを起動できていた環境なら、通常はダウンロード済みかと思います。

エラーの例
>```
emulator: ERROR: This AVD's configuration is missing a kernel file!!
emulator: ERROR: ANDROID_SDK_ROOT is undefined
```

※ANDROID_SDK_ROOTの行は、あまり参考にならなかったりします。(色々変えて試しても、表示は変わりません)

#参考資料
[Stackoverflow - I can't install intel HAXM](https://stackoverflow.com/questions/28418450/i-cant-install-intel-haxm)
[Stackoverflow - The intel x86 emulator accelerator (HAXM installer) revision 6.0.5 is showing not compatible with windows](https://stackoverflow.com/questions/41092207/the-intel-x86-emulator-accelerator-haxm-installer-revision-6-0-5-is-showing-no)

[Stackoverflow - Emulator error: This AVD's configuration is missing a kernel file](https://stackoverflow.com/questions/9712605/emulator-error-this-avds-configuration-is-missing-a-kernel-file)
[Stackoverflow - Cannot run emulator in Android Studio](https://stackoverflow.com/questions/28864785/cannot-run-emulator-in-android-studio)
[備忘録]RailsでJson形式で渡ってきた日付をDate型にparseする

タイトル通りです。

json形式で渡ってきた日付の値を基に、日付計算(beginning_of_day、加減算)とかしたかったのでjson形式(文字列)で渡ってきた値をDate型に変換する必要がある。

```ruby
date =  Time.zone.parse(params[:date_param]) #json系式で渡ってきたdate_paramをrailsのタイムゾーンに合わせてパース
p params[:date_param]   # => 2017-06-16T02:59:28.928Z
p date                  # => 2017-06-16 11:59:28 +0900
p date.beginning_of_day # => 2017-06-16 00:00:00 +0900
User.where(created_at:date.beginning_of_day..date.end_of_day) # 指定された日で作成されたdateを抽出
```

これでjson形式で渡ってきたのを日付演算できました。
numpy.randomでpoisson stepperを作成

# スクリプト
- Step detectionのアルゴリズムをテストするためにStepがある時系列を作成
- 時系列の各点にはガウシアンノイズを足す（一分子実験を意識）
- numpy.randomで確率分布に従って値をピックアップ
- Window平均はスライスを使えば楽勝

```py:poisson_stepper.py
#!/usr/bin/python

import numpy as np
import matplotlib.pyplot as plt

# Parameters
velocity = 60.0 # [nm/sec]
step_size = 50.0 # [nm]
k = velocity / step_size # decay constant for exponential distribution
dt = 1.0e-4 # [sec] time step for simulation
n_step = 10
sigma = 3.0 # [nm] amount of noise added to data
time_resolution = 0.01 # [sec]
n_data_averaged = int(time_resolution / dt)

# Produce trajectory
trajectory = []
for i in range(n_step+1):
    trajectory += [i*step_size]*int(np.random.exponential() / dt)

# Average data
trajectory = [np.average(trajectory[i:i+n_data_averaged]) + np.random.normal(scale = sigma)
              for i in range(0, len(trajectory), n_data_averaged)]

# Plot
plt.plot(trajectory)
plt.xlabel("time")
plt.ylabel("position")
plt.savefig("trajectory.png")
```

#計算結果
![trajectory.png](https://qiita-image-store.s3.amazonaws.com/0/23570/2f0afe2e-67b3-927e-af49-0fbc0945b359.png)
PHP GuzzleHttp\Client で Proxy を使うメモ

Goutte (v3.2.1) でやろうとしたけど分からなくて、 Guzzle で試して出来たのでメモ。

プロキシサーバーは Squid で行っています。
Basic認証あり。

## バージョン

```
guzzlehttp/guzzle           6.2.3   Guzzle is a PHP HTTP client library
guzzlehttp/promises         v1.3.1  Guzzle promises library
guzzlehttp/psr7             1.4.2   PSR-7 message implementation that also provides common utility methods
```

## コード

```php
use GuzzleHttp\Client as GuzzleClient;
```

```php
$proxy_host = 'example.com';
$proxy_port = '3128';
$proxy_user = 'username';
$proxy_pass = 'password';
$proxy_url = "http://{$proxy_user}:{$proxy_pass}@{$proxy_host}:{$proxy_port}";

// 確認くんのURL
$url = 'http://www.ugtop.com/spill.shtml';

$guzzle_client = new GuzzleClient();
$res = $guzzle_client->request('GET', $url, ['proxy' => $proxy_url]);
echo $res->getBody();
```
Gitで過去のある時点のファイルの内容を見る

以下のコマンドで見れます。

```bash
# ただ見る
$ git show <hash>:<abslute-file-path>
# 詳細に見る
$ git blame <hash> -- <file-path>
```

上記にあるようにファイルパスはともかく、ハッシュ値は取得しないといけません。

## だたn年、n月、n日前のコミットハッシュを見る

以下のコマンドは、ある日時以前の一番最初のログを取ります。
> 1. `-1` => 最初の１つだけ表示
> 2. `--format='%h'` => 短いハッシュ値だけ表示
> 3. `--before=...` => `...`以前から表示

```bash
git log -1 --format='%h' --before=midnight # 今日の0時0分以前
git log -1 --format='%h' --before='2017.12.31' # 2017年12月31日以前
git log -1 --format='%h' --before=1.day # 今から１日前
git log -1 --format='%h' --before=yesterday # 〃
git log -1 --format='%h' --before=1.week # 今から一週間前
git log -1 --format='%h' --before=10.day # 今から10日前
git log -1 --format='%h' --before=1.month # 今から1ヶ月前
git log -1 --format='%h' --before=1.year # 今から1年前
```

## あるファイルのn行を変更した時点のコミットハッシュを見る

以下は100行目の変更時点のハッシュを表示します。
> 1. `-L1, 10` => 例えば１行目から１０行目まで表示

```bash
git blame -L100,100 a.txt | cut -d ' ' -f 1  
```

## 使用例

例えば、「ある時点のsrc/a.txt」の中身を見たいとしたら、こんな感じにします。

```bash
# bash zsh
git show `git log --before=10.week -1 --format='%h'`:src/a.txt
# 行番号付き
git show `git log --before=10.week -1 --format='%h'`:src/a.txt | less -N
# fishならこっち
git show (git log --before=10.week -1 --format='%h'):src/a.txt
```

中身を`blame`で見たい場合はこうして。

```bash
# bash zsh
git blame `git log --before=10.week -1 --format='%h'` -- a.txt
# 一個前のコミット
git blame `git log --before=10.week -1 --format='%h'`^ -- a.txt
# fish
git blame (git log --before=10.week -1 --format='%h') -- a.txt
```

ある行の変更時点のファイルの内容をただ見るなら。

```bash
# bash zsh
git show `git blame --minimal -L30,30 a.txt | cut -d ' ' -f 1`:src/a.txt
# fish
git show (git blame --minimal -L30,30 a.txt | cut -d ' ' -f 1):src/a.txt
```

`blame`で見る。

```bash
# bash zsh
git blame `git blame --minimal -L30,30 a.txt | cut -d ' ' -f 1` -- a.txt
# fish
git blame (git blame --minimal -L30,30 a.txt | cut -d ' ' -f 1): -- a.txt
```

## 思ったこと

Gitってすごい（忘れちゃう😇）
Cairoの依存ライブラリ

[小型液晶](http://qiita.com/yamori813/items/ae66330ccbf6fe6bd5ab)の表示を制御するために2Dのグラフィックライブラリの[cairo](https://cairographics.org/)をOnion Omega(mipeb)用にFreeBSD/ZRouterで最小限の構成でビルドしてみました。

試したバージョンはcairo 1.14.6です。

configureがpkgconfに依存しているので、これを入れる必要がありました。またconfigureの中でpixman,fontconfig,freetype,pngをpkgconfで参照しているので、これも実際は使わないのですがインストールが必要です。

cairoは[pixman](http://www.pixman.org/)というx11から派生したライブラリを使っていて、最低限これがあればビルドできます。これだけでも線や四角や丸のメモリバッファへの描画ができます。またASCIIのフォントを内蔵しているので、英文字も描画できます。余談ですがこのメモリバッファの事を昔のMacではoffscreenとか言ってました。

pixmanにはアーキテクチャ毎の最適化コードがあり、クロスでビルドする時は注意が必要です。またcairo,pixmanともにエンディアンの設定を持っているので、これも要注意でした。

pngを読み込んだり書き込むためにはpngのライブラリが必要になります。pngのライブラリはlibzを使っているので、これも必要です。

フォントを読み込むためにはfreetypeとfontconfigが必要になります。fontconfigはexpat2も使っているので、これも必要です。

freetypeはpngを使うオプションもありますが、なくても大丈夫みたいです。

![cairodep_new.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/de15420b-041d-94e8-fbea-c0c58c7b3158.png)

すべてFreeBSDのportsにあり、それをZRouterにコピーしてMakefileを必要に適宜修正して、do-installでイメージ作成用のディレクトリにコピーするようにしました。コピーはオリジナルのライブラリバイナリを一桁のバージョン付きファイルとしてコピーしてsoファイルをシンボリックリンクで作成しています。

もちろん依存の順にビルドして、リンク時に参照できるようになければいけません。

描画したデータはcairo_image_surface_get_data()でバッファのポインターを取得して拾いだす事ができます。

これで作ったライブラリで、[mrubyバインディング](https://github.com/yamori813/mruby-cairo)を作ってみました。

![IMGP0586.JPG](https://qiita-image-store.s3.amazonaws.com/0/104066/192d3310-4973-b2b4-cd74-65e8acb8bfae.jpeg)
makeでタイムスタンプを変数にいれる


makeでタイムスタンプつきのバックアップファイル作ろうとしてはまった。
これでいける。

```
TIMESTAMP=$(shell date +%Y%m%d-%H%M%S)

default:
	echo ${TIMESTAMP}
	sleep 2
	echo ${TIMESTAMP}
```



`VAR=$(コマンド)`ではなく`VAR=$(shell コマンド)`とするところがミソで、makeは、前者の書き方ではコマンドシーケンスそのものが代入されてしまうので、処理時１秒以上時間がかかるとタイムスタンプがずれていってしまう。

```
TIMESTAMP=$(shell date +%Y%m%d-%H%M%S)

default:
	echo ${TIMESTAMP}
	sleep 2
	echo ${TIMESTAMP}
```

http://d.hatena.ne.jp/ksaito11/20100205/1265378341