OmniAICreator/Qiita-1.07M huggingface dataset:
Craft CMSをSierraに入れてハマった件

#背景
[Craft CMS](https://craftcms.com)というのを仕事で使うために、手持ちのmacOS Sierraにインストール。Craft CMSの良さについては[アドベントカレンダー](http://www.adventar.org/calendars/1400)とかあるのでそこらへんを参照にするといいかもしれません。今回の仕事的には
- 軽量
- 投稿タイプとかの定義が標準でUIからできるので簡単
- でもDrupalほど設定にハマらなくていい。テーマの拡張もTwigとか利用しても簡単に書ける
そんなところが良いと判断されて採用されているようです。


# この記事の環境
現在の私の環境は、
* macOS Sierra (10.12.3 (16D32))
* mysql 5.7.16
* php 5.6.29
* Craft CMS 2.6.2966

#コケたポイント
## 1.Mcryptが設定されていなくてコケる
ここを参考にしました。
https://michaelgracie.com/2016/09/plugging-mcrypt-into-php-on-macos-sierra-10-12/

要はphpのモジュールをコンパイルして(なん年ぶりにモジュールコンパイルしたんだか!)インストールする。その時System Integrity Protection を外す、です。


## 2.craft cmsがインストールされているmysqlと互換性のないSQLを吐くのでコケる

インストールの途中、以下のような画面が出て死亡...
![error.png](https://qiita-image-store.s3.amazonaws.com/0/22660/3630f530-b685-6480-677f-0a41309029f9.png)

これだとエラーメッセージがちゃんと読めないので発見にちょっと時間がかかりました。
最終的にはWeb Inspectorを開いて、Networkタブの install というリソース（ajax通信の結果ですね）に以下のように出力されているのが確認できたので、先に進めました。

```
<h2>Internal Server Error</h2>

<p>CDbCommand failed to execute the SQL statement: SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #18 of SELECT list is not in GROUP BY clause and contains nonaggregated column &#039;tevatest.structureelements.root&#039; which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql&#95;mode=only&#95;full&#95;group&#95;by</p>

```

ここら辺を参考にしました。
http://craftcms.stackexchange.com/questions/12084/getting-this-sql-error-group-by-incompatible-with-sql-mode-only-full-group-by
http://qiita.com/hshimo/items/3e315dc102e3e47e4a98

craft cms3では治っているそうですね。

my.cnfは、とりあえず~/.my.cnfとして保存。
これでインストールが完了し、うまく動きました。

## 番外編
また2.にハマる前に気持ちわるいのでvirtualhostにしました。これは、なくていいのかはまだチェックしておりません。
QReki.javaの不具合

QReki.javaというオープンソースを自分用の暦アプリで使っているのですが、旧暦の表示がずれていたので、確認してみました。

![device-2017-03-05-030530.png](https://qiita-image-store.s3.amazonaws.com/0/104066/577449b0-655e-626b-f555-d33f4814ca29.png)

[旭川情報ねっと](http://www.ajnet.ne.jp/)さんの暦のページをみると3月5日は旧暦2月8日となっています。

旧暦は新月すなわち朔が1日となります。今年に入ってからは1/28が始めての朔だったので、1/28日が旧暦の1/1になりました。

朔の正式な日時は、国立天文台が毎年公表している下記のデーターが元になります。

http://eco.mtk.nao.ac.jp/koyomi/yoko/2017/rekiyou173.html

QReki.javaはこの朔を計算して旧暦を返してくれます。

|朔日時|[ユリウス日](http://eco.mtk.nao.ac.jp/cgi-bin/koyomi/cande/date2jd.cgi)|QReki.java計算値|
|:---|:---|:---|
|2016年11月29日 21時18分|2457722.01250|2457722.014176843|
|2016年12月29日 15時53分|2457751.78681|2457751.788357215|
|2017年1月28日	9時07分|2457781.50486|2457781.506297572|
|2017年2月26日	23時58分|2457811.12361|2457811.125400158|
|2017年3月28日	11時57分|2457840.62292|2457840.624657503|

日本時間の2/26はユリウス日の2457810.125から2457811.124となります。ところがQReki.javaの計算値は2457811.125400158となり次の日になってしまっているので旧暦の2/1が2/27になってしまっています。

日をまたぐ0.125日前後に新月になるとこのように誤差でずれてしまう事がありあります。計算で出すには1分は0.000694日なので小数点以下3-4桁くらいの精度が必要と思われます。

そもそもQReki.javaのユリウス日の扱いはちょっとおかしい気がします。上記の数値はちょっといじって出しています。

QReki.javaはawkスクリプトからの移植で、このawkスクリプトはいろいろな言語に移植されているようですが、他でも問題が起きている可能性があるかと思われます。

計算で出す方法は誤差が発生しこれにより違った暦が出来てしまうので、国立天文台で暦要項のWebAPIを提供してもらえると良いのではないかと思います。

根本的に直すのは難しいのでアプリには2017/2/26から3/27までのworkaroundを入れました。

この問題は旭川情報ねっとさんの暦のページで概要を知り調査しました。旭川情報ねっとさんの情報が大変参考になりました。ありがとうございました。

旧暦は[2033年問題](https://ja.wikipedia.org/wiki/%E6%97%A7%E6%9A%A62033%E5%B9%B4%E5%95%8F%E9%A1%8C)というのもあるようです。
Apache VTL すごい

[Integer.parseInt](https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Integer.html#parseInt-java.lang.String-) するために事前に整数を一個宣言しておく必要があるんだって！

```
$set($Integer = 0)
{
  hoge: $Integer.parseInt($someNumericString)
}
```

'A';

何に使ったかって言うとこんな感じ

```text:APIGatewayのレスポンスマッピング
#set($Integer = 0)
#set($itemsSize = $Integer.parseInt($input.params('X-Items-Size')))

[
#foreach($elem in [1 .. $itemsSize])
  {
    id: $elem
  }
#end
]
```

初見キラーすぎる・・・
ESXi マウントコマンド

# ESXi マウントコマンド

ホストにマウントされているデータストアを一覧表示
esxcli storage nfs list

上記で表示された NFS データストアをメモします。次のコマンドを実行して、NFS を削除します。
※「NFS_Datastore_Name」の変更
esxcli storage nfs remove -v NFS_Datastore_Name
GPSモジュールの測定周期を10Hzに変更しようとしたができなかった

「<a href="http://amzn.to/2nlb8rt">ADA-746 Adafruit Ultimate 66チャンネル10Hz GPSモジュール Version 3</a>」を購入して、配線してgpsd入れてntp同期して「10Hzでデータ取るぞー」と"gpsctl -c 0.1"してみたけれど10Hzにならない。
"gpsctl -c 0.2"で5Hzにはなる。
調べたところ、2017/3/10時点ではgpsdがMTK3339に対応しておらず、MTK3301のドライバが使われているためのような気がする。

gpsdのソースを雑に流し読みしたところ、MTK3339はMTK3301のドライバでも動くからそれで、って感じらしい。
開発サイド？は「10Hzなんてふつーいらねー」という方向っぽい？(←webやML流し読みした感じ)ので、今後も対応が期待できるかは微妙。

確かに今のGPSの使われ方と精度で10Hzが必要とされる場面は少ないかもしれない。
10Hz対応パッチ作成に手を付けようか、5Hzで我慢するか。

とりあえず上層のアプリを作りながら考えるという事で目をそらそうか。

GPSの精度が増してくれば、より高頻度の測定が必要になったりもしそうだが、次世代GPS事業となると国家的な軍事機密事業なので、私のお小遣いでは若干手を出しづらい。
できる部分だけ準備して、技術の進歩を見守るしか無いか。
インターネットアクセスが制限された環境ではiOSとAndroidでPush通知が届かない

LANからインターネットに接続する手段がプロキシーサーバ経由に限定されている場合は、Apple並びにGoogleのサーバに直接接続できないので、Push通知が届きません。

そうした場合は、ネットワーク管理者にポートを開けてもらうか、別のネットワークを利用するか、どちらかになります。ポートを開ける場合は、AppleとGoogleから指定された、それぞれのポートを開ける必要があります。

## iOS

https://support.apple.com/ja-jp/HT203609
> ファイアウォールの背後の Wi-Fi をご利用の場合や、モバイルデータ通信でプライベートのアクセスポイント名をご利用の場合は、特定のポートに接続してください。以下のポートで、APNS サーバにプロキシを経由せずに直接接続する必要があります。
・TCP ポート 5223：APNS との通信用
・TCP ポート 2195：APNS への通知の送信用
・TCP ポート 2196：APNS フィードバックサービス用
・TCP ポート 443：デバイスのアクティベーション中、およびその後でデバイスがポート 5223 で APNS に接続できなかった場合のフォールバック用 (Wi-Fi のみ) に必要
ネットワーク管理者に連絡し、上記のポートにアクセス可能か確認してください。APNS サーバでは負荷分散が採用されているので、デバイスが通知を受け取る際に常に同じパブリック IP アドレスに接続するとは限りません。17.0.0.0/8 アドレスブロック (Apple に割り当てられたブロック) 全体で上記のポートにアクセスできるようにしておくと安心です。


## Android

https://developers.google.com/cloud-messaging/http
> If your organization has a firewall that restricts the traffic to or from the Internet, you need to configure it to allow connectivity with GCM in order for your GCM client apps to receive messages. The ports to open are: 5228, 5229, and 5230. GCM typically only uses 5228, but it sometimes uses 5229 and 5230. GCM doesn't provide specific IPs, so you should allow your firewall to accept outgoing connections to all IP addresses contained in the IP blocks listed in Google's ASN of 15169.

Google翻訳
> インターネットとの間のトラフィックを制限するファイアウォールが組織にある場合は、GCMクライアントアプリケーションがメッセージを受信するためにGCMとの接続を許可するように設定する必要があります。 GCMは特定のIPを提供しないため、ファイアウォールが含まれているすべてのIPアドレスへの発信接続を許可するようにする必要があります（5228、5229、および5230）。 GoogleのASN 15169に掲載されているIPブロックに含まれています。
yumでmongodbをインストールするときの注意

CentOS7.2でMongoDBを新規インストールしようとしたときにはまった問題

##過ち

「とりあえずyumでインストールできるやろ:point_up:？」

```bash
$ yum -y install mongodb
```

EPELリポジトリからのインストールになるが、最新の3.4系に対して2.6.12がインストールされた。

##落ちつく

EPELリポジトリからインストールしたmongodbをアンインストールします。

```bash
$ yum -y remove mongodb
```

この手順を忘れて、mongodb公式リポジトリからmongodb-orgをインストールしようとしたところ、コンフリクトエラーで怒られました:sweat_smile:

##正しいインストール方法

公式のドキュメントに記載あり
https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/

###リポジトリの登録

```bash
$ sudo vi /etc/yum.repos.d/mongodb-org-3.4.repo
```

```:mongodb-org-3.4.repo
[mongodb-org-3.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc
```

###改めてインストール

```bash
$ yum -y install mongodb-org
```

mongodb公式リポジトリからインストールを行うと、以下の4つのパッケージがインストールされます。

* mongodb-org-server: mongod本体
* mongodb-org-mongos: クラスタリングサーバー
* mongodb-org-shell: mongoシェル
* mongodb-org-tools: インポート、エクスポート、ダンプなどのツール
Vue.jsは気難しい（オブジェクト編）

本記事は Vue 2.2 時代（2017/03頃）に記載したものです。
最新のVueでは未検証です（たぶん通用すると思う）ご留意ください。

# はじめに

Vue.jsはインスタンスが持つプロパティ（dataやprops）の変更を検知して、DOMの内容を変更したり、イベントの発火を行うことができる。
だが、それはdataやprops配下のオブジェクトの、[**変更を検知する機構**](https://jp.vuejs.org/v2/guide/reactivity.html#変更の追跡方法)が重要であるため
プレーンなJSのやりかたでオブジェクトを変更すると、その機構を失ってしまう。

失ってしまうとあら大変、オブジェクト内の値を変更してもDOMに反映されないし、[vue-devtools](https://github.com/vuejs/vue-devtools)にも表示されないという迷宮に、僕らは迷い込む。
そうならないための注意点です。

# オブジェクトの気の遣い方

## キーを追加したい
`player` オブジェクトに `job` キー（プロパティ）を追加する
（オブジェクトはそのキーを持っていないとする）

**×** いつものやり方でキー追加すると、**検知機構**を持たないプロパティになってしまう

```js
this.player.job = { company: "インクリメンツ", income: "800" }};
```

**○** setを使おう

```js
this.$set(this.player, "job", { company: "インクリメンツ", income: "800" });
```

※ここで記載しているthisはコンポーネントのことです。
つまりコンポーネント内での記載を前提としています。
`Vue.set(obj, key, val);` っていう方法でもできる（実は `this.$set()` は `Vue.set()` のエイリアス）けど、見通しが悪くなるので知らなくていいと思います。

## 複数のキーを一度に追加したい

**△** Object.assignを使う

```js
this.someObject = Object.assign({}, this.someObject, { company: "インクリメンツ", income: "800" });
```

これ、[公式リファレンスにも記載されている](https://jp.vuejs.org/v2/guide/reactivity.html#変更検出の注意事項)やりかただけど、使わないほうがいいんじゃないかな…（なんか次のバージョンとかで非推奨になりそうな予感がする）

追加したいキーの数だけ$setを実行するとか
上記$setで予め構築しておいたオブジェクトを追加するなどしたほうがいい

```js
var job = {
  company: "インクリメンツ",
  income: "800"
};
this.$set(this.player, "job", job);
```

（追記）
`Object.assign()` は、IE非対応なので注意！ [参考 Object.assign()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
<img width="445" alt="assign.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/151078/dc2eac14-7354-0b0c-dd33-76bb5d763999.png">

# おわりに

Vue.jsの冒頭の説明にある「プレーンなオブジェクトのまま管理します」みたいな文言は嘘だよなと思う。

[配列編](http://qiita.com/tmak_tsukamoto/items/e303328681f20a036530)も記載しているので、見てね
[AWS入門]クロスアカウント設定方法

# 概要
- AWSアカウントを複数持っていて、それぞれ行き来するのが面倒くさい
- じゃあクロスアカウントを！→でも難しいんじゃ？
- めっちゃ簡単でした

# 目次
- 事前準備
- BアカウントでAアカウントを受け入れるためのロール作成
- Aアカウントでクロスアカウント設定


# 詳細
## 事前準備
- クロスさせたいアカウントのアカウントID(12桁)をメモっておく
 - 仮にアカウントA,Bとする。

# BアカウントでAアカウントを受け入れるためのロール作成
- Bアカウントのマネージメントコンソールにログイン
- 下の図のように、[ロールタイプ]の選択で[クロスアカウントアクセスのロール]→[所有しているAWSアカウント間のアクセスを提供します]を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/159589/6bffa956-78bc-a07e-d3bf-6c243b19c8df.png)


---------------------------------------


- 次のページで、AアカウントのIDとMFAが必要かどうかを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/159589/b934d958-7cc2-1224-7cdf-0551604ccc5a.png)


---------------------------------------


- 次にポリシーを選択しますが、こちらはAアカウントのユーザーがBアカウント上での権限を考えて設定ください。とりあえず簡易的にAdminAccessを設定して、ロールを作成します。またロール名はコピーしておいてください。Aアカウントで設定する際に使います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/159589/2c97ab83-cdbf-98d1-3063-6929f75739b0.png)


---------------------------------------

# Aアカウントでクロスアカウント設定
- Aアカウントのアカウントのプルダウンメニューのうち、[ロールの切り替え]を選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/159589/cafc88e0-59bc-8f72-41f7-6871af9aaa86.png)

---------------------------------------


- 次画面の[ロールの切り替え]を選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/159589/3e8df22a-61d1-a03a-efc5-1fb2550c0708.png)

---------------------------------------

- 切り替え先のアカウントIDとロールを入力し、「ロールの切り替え」選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/159589/8d38fdbe-480e-48a1-1f15-00d382aa7752.png)


---------------------------------------

- 一度入ると以下のような感じでアカウントの下にロール履歴が出るので楽にアカウント間を移動できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/159589/ad5c1d82-3a27-c19b-c34d-a8f971ff13ad.png)

---------------------------------------
《TweenMax》CSSのrotate3d()関数の値の渡しかたのコツ。


TweenMaxでアニメーションをつくるとき、`transform`関連の便利なプロパティが割り当てられていますが、rotate3d()で定義したい値を渡すときには、計算してあげる必要があります。


```css

#anim {
  transform : rotate3d(-1,1,0,180deg)
}

```

この状態を実現するためには、

```js

TweenMax.to($('#anim'), 1,
{
  rotationX: -1 * 180,
  rotationY: 1 * 180,
  rotationZ: 0  * 180,
});

```

各軸の値に角度を乗算します。

こんなかんじ。

```js

/**
* #anim {
*   transform : rotate3d(x, y, z,　deg)
* }
*/

TweenMax.to(#anim, 1,
{
  rotationX: x * deg,
  rotationY: y * deg,
  rotationZ: z * deg,
});

```


おわります。
[個人的メモ]python3でのwebページのスクレイピング

#スクレイピングをするときの注意点

ページのソースコードは右クリックをして、ページのソースを表示ではなく
<img width="172" alt="スクリーンショット 2017-03-10 14.30.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/96484/9199a567-bcac-a96c-f179-50430aa4b87c.png">

デベロッパーツールで表示された方を使う
<img width="227" alt="スクリーンショット 2017-03-10 14.30.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/96484/a30c074a-fb75-cff3-4cf5-9f2240774eb0.png">


#textの取り出し

```html
<dt>価格<span class="tax">（税込）</span></dt>
```

のように`dt`タグに`span`タグが埋め込まれたもののテキスト取り出すには

```python
source = '<dt>価格<span class="tax">（税込）</span></dt>'
soup = BeautifulSoup(source, "html.parser")
soup.text
```

と`.text`指定やることで取り出せる

#空白文字の削除

```html
<dt>
    価格
    <span class="tax">（税込）</span>
</dt>
```

といったタグ内に空白文字がある場合

```python
def remove_whitespace(str):
    return ''.join(str.split())

source = '<dt>価格<span class="tax">（税込）</span></dt>'
soup = BeautifulSoup(source, "html.parser")
remove_whitespace(soup.text)
```

とやって取り出せる

`strip()`とかでは中央にある空白は削除できないため、`split()`で空白文字を区切り文字として
`.join`で結合している


#BeautifulSoupでのfind

##ある特定のクラスを探したい場合

####一つの場合
```python
soup.find(class_='hoge')
```
####全てを検索する場合
```python
soup.find_all(class_='hoge')
```

##ある特定のidを探したい場合
####一つの場合
```python
soup.find(id='hoge')
```
####全てを検索する場合
```python
soup.find_all(id='hoge')
```


##ある特定のタグを探したい場合
####一つの場合
```python
soup.find('hoge')
```
####全てを検索する場合
```python
soup.find_all('hoge')
```

またこれらは複数条件を同時にもできます

```python
soup.find('hoge',class_='fuga)
```
Gitコマンド

Git今まで使ってこなかったので主に自分用メモ(随時更新)

git管理を始める（.gitフォルダを配置）
```git init```

リポジトリを取得（クローン）する
```git clone リポジトリアドレス```

ブランチ一覧を確認（リモートも）
```git branch -a```

ブランチを作成してそこへ移動する
```git checkout -b ブランチ名```

ブランチを作成
```git branch ブランチ名```

ブランチを移動
```git checkout ブランチ名```

変更確認
```git status```

編集ファイルをステージングへ追加
```git add ファイル名```
```git add '*.php'``` （ワイルドカードも使用可能）

変更をコミット
```git commit ファイル名 -m "コメント"```

ローカルコミット取り消し（その時点までのロールバック）
```git reset --hard コミットID```コミットIDはgit log して出てくる16進数の40文字のやつ

変更をリモートへ反映
```git push origin ブランチ名```

変更をリモートから拾ってマージする
```git pull origin ブランチ名```

変更履歴を見る
```git log```

チェックアウト中のブランチに別ブランチの変更をマージする
```git merge ブランチ名```

チェックアウト中のブランチの変更を別ブランチの変更をすべて適用した後にコミットした状態にする
```git rebase ブランチ名```

ローカルのbranch削除
```git branch -d ブランチ名```（-Dはmergeがされていないものも削除できる）

リポジトリからディレクトリを削除
```git rm -r ディレクトリ名```

リモートブランチ更新（削除済みブランチを削除）
```git fetch --prune```

ローカルをリモートで強制上書きし、remoteと一致させる
```git fetch origin
git reset --hard origin/master```

コミットコメントの編集
```git commit --amend -m "コメント"```

作業ブランチの変更を一時的に退避する
```git stash```

スタッシュ中の変更リストと差分を確認する
```git stash list -p```

スタッシュして退避した変更を反映するだけ
```git stash apply stash@{0}（←stashID）```

スタッシュ中の情報を削除する
```git stash drop stash@{0}（←stashID）```

スタッシュして退避した変更を反映し、スタッシュ中の情報を削除する(apply + drop)
```git stash pop stash@{0}（←stashID）```
Bareword "" not allowed while "" in use at (eval 2) line 1.

rename コマンドで Bareword "..." not allowed while "strict subs" in use at ... と怒られる場合の回避方法
環境は Mac OSX

```
rename hoge_hoge fuga_fuga *.png
```
を実行すると

```
Bareword "hoge_hoge" not allowed while "fuga_fuga" in use at (eval 2) line 1.
```

アンダースコア"_"が文法エラーと怒られる

これを回避するには

```
rename s/hoge_hoge/fuga_fuga/g *.png
```

とすればよい。
vimの置換と同じで割と良いですね
zabbix外部チェックでcloudwatch監視

# 概要
Cloudwatchから主にCloudfront系を監視したくて
以下を参考にある程度、Zabbix側で自由が効く形でのshell。
zabbixサーバにrubyとかpythonとか入れたくなかったってのもある。

- [Qiita:zabbix外部チェックでcloudwatch連携](http://qiita.com/t-okibayashi/items/1422a9a98878d8f9b579 "Qiita")
- [classmethod Developers.io:AWSで構築した環境にありがちなシェルスクリプトたち まとめ](http://dev.classmethod.jp/cloud/aws/aws-shellscript-summary/#toc-2)



# Script

## ポイント
- STATISTICSはzabbix側から呼ぶ時に、"-s Sum"とかになり、jqの所でエラーになるのでTrimしてる
- float桁数エラー対応で小数点第2位までで丸めてる。
- 開始時間は、渡された秒数でマイナス
- Cloudfrontはus-east-1でしか見れないのでしょうがなく渡してる
- 都合上、nullは困るので```if [ -z $res ]; then  res="0"; fi```で0代入

```bash
#!/bin/bash

# ex) /usr/lib/zabbix/externalscripts/cloudwatch.sh -d "Name=Region,Value=Global Name=DistributionId,Value=xxxxxxx" -m Requests -s Average -n AWS/CloudFront -r us-east-1

export AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXXXXXX
export AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

PERIOD=300
REGION=ap-northeast-1

while getopts n:d:m:s:r:p: OPT
do
  case ${OPT} in
    n) NAMESPACE=${OPTARG} ;;
    d) DIMENSIONS=${OPTARG} ;;
    m) METRIC=${OPTARG} ;;
    s) STATISTICS=${OPTARG//[[:blank:]]/} ;;
    r) REGION=${OPTARG} ;;
    p) PERIOD=${OPTARG} ;;
    *) exit 1 ;;
  esac
done

pointdate=`date "+%Y/%m/%d %H:%M:00"`

res=$(aws cloudwatch get-metric-statistics --region ${REGION} --period ${PERIOD} \
 --namespace ${NAMESPACE} \
 --dimensions ${DIMENSIONS} \
 --metric-name ${METRIC} \
 --statistics ${STATISTICS} \
 --start-time `date --iso-8601=seconds --date "${pointdate} ${PERIOD} sec ago"` \
  --end-time `date --iso-8601=seconds --date "${pointdate} 0 minutes ago"` \

 | /usr/bin/jq -r ".Datapoints[].${STATISTICS}" \
 | head -1 \
 | awk '{printf("%4.2f"), $1}' )

if [ -z $res ]; then  res="0"; fi

echo $res
```


## 呼び出し例
```bash
/usr/lib/zabbix/externalscripts/cloudwatch.sh -d "Name=Region,Value=Global Name=DistributionId,Value=XXXXXXXXXXXXXX" -m Requests -s " Sum" -n AWS/CloudFront -r us-east-1
```


# 他留意点

- 外部チェック設定時は、更新間隔カスタマイズ → 定期設定 → 更新間隔: m0,30 とか、キリ良く動くようにしといた方が幸せかも
    - なお、その際に更新間隔は0にする。
- 色々合算するならAverageじゃなくてSumで。
    - 俺氏、Average合算したりして平均値じゃなくて中途半端な中央値的なの出して時間無駄にした
golangでルートノードしかないXMLをパースする方法

# 背景

golangで標準の `encoding/xml` を使ったXMLパースをする方法は数多のHowTo記事が存在しますが、仕事でルートノードしかないXMLに出くわし、これのパースにちょっと悩んだので備忘録として残します。

# ルートノードしかないXML

こんなやつです。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<root>
  example
</root>
```

自分としては、普通にAPI作ったりデータ作るときにこんな構造にすることはまず無いですが、書き方として許されている以上、赤の他人はこのように書くこともあると思っておかなければなりません。

# `encoding/xml` によるパースの例

```go
package main

import (
        "encoding/xml"
        "fmt"
)

// User is sample struct
type User struct {
        ID   string `xml:"id"`
        User string `xml:"user"`
}

func main() {
        xmlStr := `
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <id>5ec8da0a-6e23-4343-b474-ca0bb5c22a51</id>
  <user>hoge</user>
</root>
`

        data := new(User)
        if err := xml.Unmarshal([]byte(xmlStr), data); err != nil {
                fmt.Println("XML Unmarshal error: ", err)
                return
        }
        fmt.Println(*data)
}
```

```bash
$ go run main.go
{5ec8da0a-6e23-4343-b474-ca0bb5c22a51 hoge}
```

大したことはありません。structをfiledにtagを指定しつつ定義して、XML文字列とstructのポインタを指定して `xml.Unmarshal` するだけです。

# ルートノードしかないXMLのパース

ところがルートノードしかない場合、structにどんなfieldを定義すればいいのやらさっぱりでした。
もしかしてと思ってやってみたら出来ちゃった結果が以下なのですが、ようはルートノード内が構造化されていないのだから、指定するポインタもプリセットの型を指定すれば良いということですね。
注意としてはルートノード内全てを文字列として `xml.Unmarshal` しようとするので、前後に改行とか空白があったらそれ毎格納されます。つまりその場合は `int` とかにはパースできません。

```go
package main

import (
        "encoding/xml"
        "fmt"
)

func main() {
        xmlStr := `
<?xml version="1.0" encoding="UTF-8"?>
<root>example</root>
`

        data := new(string)
        if err := xml.Unmarshal([]byte(xmlStr), data); err != nil {
                fmt.Println("XML Unmarshal error:", err)
                return
        }
        fmt.Println(*data)
}
```

```bash
$ go run main.go
example
```
【FileMaker】縦書きハイフンと英数字はこう処理する

[前回](http://qiita.com/tyuma/items/d1152dddf71730d1cca4)の郵便番号処理に引き続き、縦書き文化のある日本特有の問題をFileMakerではこう処理する、という回です。

事の発端は（そんな大げさな、、、）、「宛名はやっぱり縦書きにしたいんですよね」という一言で実装することになった縦書き印刷でした。
あぁ、ついにきたかと思いつつ、うろ覚えだった縦書きを改めてFileMaker Pro 15で検証しました。
（FM11,12,13,14でも同様に大丈夫だと思いますが、違う部分があったらコメントください）

FileMaker Pro 15の縦書き処理については、[ここ](https://www.filemaker.com/help/15/fmp/ja/index.html#page/FMP_Help%2Fvertical-writing.html%23)のページにありますが、実際の運用では半角で英数字を入れろと言っても入れてくれない、全角で入れろと言っても、一部全角、一部半角、というのがよくあります。
上記ヘルプを見ると、全角の場合、半角の場合、の例が出ていますが混在しているのは出てませんでした。
一番のネックは、テキストをそのまま縦書きにするとハイフンや英数字が横書きになるということです。

結局どうなっているときちんと縦書きで表示されるのか！？

みなさまの代わりに、私がやりました。
![全角処理１.png](https://qiita-image-store.s3.amazonaws.com/0/60538/4b323cf1-6894-0204-ec45-3a57192660c7.png)

ちょっと画像が細かいので、一つづつ見ていきましょう。

まずは、実際の入力です。
![全角処理２.png](https://qiita-image-store.s3.amazonaws.com/0/60538/6d5ccca5-a42f-728e-61fc-d15399e55dc0.png)
半角ハイフン、半角英数字、全角ハイフン、全角英数字を取り混ぜてみました。

このテキスト住所を、計算フィールドで
・全角変換のみ（フィールド名：sys住所＿全角）
・全角変換した後全角ハイフンを半角ハイフンへ変換（フィールド名：sys住所＿全角＿ハイフン半角）
の２種類がどう表示されるか、見ていきます。

まずは、計算フィールドを通した横書きテキストです。
![全角処理６.png](https://qiita-image-store.s3.amazonaws.com/0/60538/98d67dd2-5e79-86b2-733a-a096e6b4749a.png)
全角処理のみのフィールド「sys住所＿全角」は、ハイフンが半角から全角に変換されています。

RomanZenkakuは、英数字を全角に変換します。
Substituteは、指定された文字を一括置換します。

次に、テキストの文字のみを90°回転した場合です。
![全角処理３.png](https://qiita-image-store.s3.amazonaws.com/0/60538/b8c0c965-0608-705d-5ad9-6425b440d3b5.png)
文字のみの回転をした場合、「sys住所＿全角＿ハイフン半角」の計算フィールドのものが縦書きとして見た場合、全てが縦書きになっています。

次に、テキストのオブジェクト自体を回転した場合です。
![全角処理４.png](https://qiita-image-store.s3.amazonaws.com/0/60538/46363055-99c9-abeb-6318-a8b6b77191b3.png)
この場合は、テキスト自体は変換せずに、テキストとしてのオブジェクト自体を回転させているだけですので、横書きを寝転がって見ているのと同じ感覚です。
つまり、横書きとして見た場合、どれも問題ないということです。

最後に、テキストの文字を回転させ、さらにテキストオブジェクトを回転してみた場合です。
![全角処理５.png](https://qiita-image-store.s3.amazonaws.com/0/60538/554f5b5f-dc2a-35e4-6c99-6d66b9a2d55b.png)
はがきに印刷する場合、縦書きといえばこの形式がメジャーではないでしょうか？
これも、テキストの文字のみを90°回転させたケースと同じく、全角変換＋ハイフン半角変換したものが問題なく表示されています。

このことから、
・英字は全角にする
・ハイフンは半角にする
と宛名印刷のレイアウトも怖くない、ということですね！
Google Cloud Platformで無料枠が強化されたぞい

#TL;DR
|強化対象 |強化内容 |
|:----|:----|
|試用期間 |2ヶ月→12ヶ月（額は$300のまま）|
|Compute Engine| f1-micro(最小インスタンス) x1 無料化(US regionsのみ)|
|Cloud Storage| 5GB 無料化|
そのたいろいろ

公式：
https://cloud.google.com/free/
https://cloud.google.com/free/docs/always-free-usage-limits

##年間縛り割も
AWSで言うリザーブドインスタンスぽいオプションも追加された
https://cloud.google.com/compute/pricing#committed_use
（17/03/10現在，英語版のみ記載）

#AWSとの（価格の）差別化
AWSの常時無料枠には無料の仮想マシンは含まれない（利用開始後12か月間は無料）
年間縛り割で前払い不要，**スペック変更しても該当リソース分は割引適応**される！

##あと元々の差別化として

分単位の課金
（ただし最低10分）

設定なしでも継続利用するだけで徐々に安くなったりとか
（1ヶ月間内の利用率に依存，インスタンス変更してもよしなに割り引いてくれる）
https://cloud.google.com/compute/pricing#sustained_use
　
オークションせずとも，8割引で突然死し得るインスタンスが使えるとか
https://cloud.google.com/compute/docs/instances/preemptible

　
　
参考記事：
[GoogleのCloud Platformが常時無料プランと無料トライアルの両方を拡大してクラウド新人たちがAWSへ傾くのを防ぐ](http://jp.techcrunch.com/2017/03/10/20170309googles-cloud-platform-improves-its-free-tier-and-adds-always-free-compute-and-storage-services/)
[Google Cloud Next 2017 in サンフランシスコ 速報レポート！](http://www.apps-gcp.com/google-cloud-next-2017-sanfrancisco-report/)
バッチからPowerShellスクリプトを呼び出したい

# バッチからPowerShellの呼び出し方
`powershell (コマンドまたはps1ファイル)`で実行できます。
が、PowerShellの実行ポリシー設定を有効化しないと呼び出せないので以下の書き方になりました。

```
powershell -ExecutionPolicy RemoteSigned (ps1ファイルを指定)
```

（2017/3/10変更）1行での書き方教えていただきました!

おしまい

ここから先は、どういうことをしようとしてバッチにスクリプトを埋めたか
試行錯誤したことを書いてみました。

# PowerShellを呼び出そうと思った理由
バッチでPowerShellスクリプトを呼び出そうと思った経緯は、どっちかの実装だけでは
できないなにかをしたかったからです。

`$ なにか = "アプリケーションのリモートインストールとエラー通知"`

# なにかをしようとバッチを書いた結果
アプリケーションをリモートからインストールをしようとして
最初に書いたバッチがこんな感じでした。

```bat:AppInstall.bat
SET APP_NAME=（アプリのフォルダ名）

rem インストールフォルダのマウント
net use W: /delete
net use W: (フォルダパス)

rem インストールフォルダの移動
cd /d W:\%APP_NAME%

rem インストールの実行
（インストールを実行するコマンド記載）

rem インストールフォルダのアンマウント
net use W: /delete

exit
```

インストールはできるが、インストールの失敗に気が付けず色々困りました。
と、いうことで成功/失敗メール通知の機能追加を検討しました。

# バッチでメール通知を実装
ぐぐってみた
![image](https://qiita-image-store.s3.amazonaws.com/0/168956/b9784aa4-08a8-4196-a8be-7aae2db24a9d.png)

バッチではメール通知機能実装ができないことだけは把握できました。
`cscript うにゃにゃっ`ていう内容ばかり
`うにゃうにゃ`の中身はVBだったり、JavaScriptだったり人それぞれでした。

PowerShell・・・

# PowerShellですべて書き直す？
~~MaLi~~とある資産管理ツールを通してリモートインストールする想定でしたが
そのツールがps1ファイルを呼び出してくれず諦めました。

# メール通知部分だけPowerShellで実装
送信メールはこんな感じで、成功用と失敗用の両方用意しました。

```powershell:SendMail.ps1
# メールの設定内容
$EmailFrom = （送信元）
$EmailTo = （送信先）
$PCName = hostname
$Subject = （メールの件名） 
$SMTPServer = （SMTPサーバー）
$Port = "25" 
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer,$Port) 
$SMTPClient.EnableSsl = $false

# メールの本文
[string]$body = @()
$body += "成功しました。`n`n"
$body += ""

# メールの送信
Send-MailMessage -To $EmailTo -From $EmailFrom -SmtpServer $SMTPServer -Subject $Subject -Body $body -Encoding UTF8
```

# なにかをしようとしてバッチを書き直した結果
```bat:AppInstall2.bat
SET APP_NAME=（アプリのフォルダ名）

rem インストールフォルダのマウント
net use W: /delete
net use W: （フォルダパス）

rem インストールフォルダの移動
cd /d W:\%APP_NAME%

rem インストールの実行
（インストールを実行するコマンド記載）
@if ERRORLEVEL 1 goto NG
@if ERRORLEVEL 0 goto OK

:NG
rem インストール失敗通知
powershell -ExecutionPolicy RemoteSigned W:\SendMailError.ps1

rem インストールフォルダのアンマウント
net use W: /delete

rem バッチファイルの削除
cd /d %~dp0
del /f "%~dp0%~nx0"

goto end

:OK
rem インストール成功通知
powershell -ExecutionPolicy RemoteSigned W:\SendMailSuccess.ps1

rem インストールフォルダのアンマウント
net use W: /delete

rem バッチファイルの削除
cd /d %~dp0
del /f "%~dp0%~nx0"

goto end

end:

rem 終了
exit
```

エラー処理はもちろん、バッチの自殺コマンドも一緒に追加。
もっとより良い実装の仕方はあるかもですが、なにかが実現できたので一旦はよしとしました。

これを機に散らかっているバッチ達をPowerShellに移植しようと思いましたが、
~~めんどくさい~~ハードル高いのでバッチにPowerShell埋め込んで少しずつ浸食させます。

# 参考文献
http://qiita.com/HiDARi/items/1d2595ff142883c3bac1
MacOS SierraでNTFS形式の外付けHDDに書き込む

こちらを参考にMacOS SerraでもNTTFS形式の外付けHDDに書き込めるか試してみた。
http://www.karakaram.com/mac-mount-usb-ntfs#unmount-usb
ほぼ自分のメモ用。

◆動作確認環境　
MacOS Sierra 10.12
◆使用したHDD
IO DATA HDC-LA3.0・4.0

###1.HDDをUSBで挿す前にターミナルを起動し、以下のコマンドを入力する

```
$ ls -l /dev/ > /tmp/before.txt
```
before.txtファイルを /dev/ 以下に書き出しておきます。このファイルは後に使用するので作成した日時とともに記憶しておきます。


###2.HDDをUSBに挿し、HDDをアンマウントする

HDDをUSBに挿してからFinderにHDDのアイコンが表示されますので、マウントを解除(アンマウント)します。
以下のコマンドでも実行できるようです。

```
$ sudo umount /Volumes/HDD名
```

###3. /dev/ 以下に再度ファイルを書き出す
ターミナルで以下のコマンドを入力します。

```
$ ls -l /dev/ > /tmp/after.txt
```

###4.USBの挿入前後のデバイスファイルを比較する
USBを挿す前に作成した"before.txt"
USBを挿した後に作成した"after.txt"を比較します。
比較にはdiffコマンドを用います。

```

$ diff /tmp/before.txt /tmp/after.txt
 
< crw-rw-rw-  1 root   wheel      24,  15  3 10 10:54 dtrace
---
> brw-r-----  1 root   operator    1,   5  3 10 11:08 disk2
> brw-r-----  1 root   operator    1,   7  3 10 11:08 disk2s1
> brw-r-----  1 root   operator    1,   6  3 10 11:08 disk2s2
> crw-rw-rw-  1 root   wheel      24,  21  3 10 10:54 dtrace
27c30
< crw-rw-rw-  1 root   wheel      18,  19  3 10 11:07 io8log
---
> crw-rw-rw-  1 root   wheel      18,  19  3 10 11:09 io8log
29c32
< crw-rw-rw-  1 root   wheel      18,  17  3 10 11:07 io8logtemp
---
> crw-rw-rw-  1 root   wheel      18,  17  3 10 11:11 io8logtemp
> crw-r-----  1 root   operator    1,   5  3 10 11:08 rdisk2
> crw-r-----  1 root   operator    1,   7  3 10 11:08 rdisk2s1
> crw-r-----  1 root   operator    1,   6  3 10 11:08 rdisk2s2
```

これで比較ができます。この場合disk2s2が外付けHDDになりますが、もちろん環境やHDDによって名前は変わってきます＿(　_´ω`)_


###5.マウントポイントの作成
HDDに接続するためのマウントポイントを作ります。
マウント名は特に規定とかはないので、私は「mhdd」にしました。
以下のコマンドを打つと作成されます。

```
$ sudo mkdir /Volumes/mhdd
```

###6.NTFS形式でマウントする
マウントポイントができたら、以下のコマンドでマウントします。
このとき、NTFS形式＆読み書き可能を指定します。

```
$ sudo mount -t ntfs -o nobrowse,rw /dev/disk2s2 /Volumes/mhdd
```

###7.Finderから見られるようにする
読み書きは可能になりました。でもこのままだとFinderからは見れません。
見れるようにするために以下のコマンドを打ち、マウントポイントにシンボリックリンクを貼ります。

```
$ ln -s /Volumes/mhdd /Users/pamphlet/mhdd
```
これでFinderからも読み書きができます！

###8.アンマウントする
HDDを取り外す時には以下のコマンドでumountします。
その後、シンボリックリンクを消します。

```
$ sudo umount /Volumes/mhdd
$ rm/Users/pamphlet/mhdd
```


以上です。
私はMacのVMware FusionからWindowsのVMware Playerに仮想マシンを移動したくてやりましたがなんの問題もなかったです(/・ω・)/
hostsとDNSについて

#hostsを設定すると
hostsファイルに記述する事で、そのホスト名に対してアクセスした際に対象IPへアクセスできるようになる。
hostsファイルの場所は

WindowsOS
```C:¥WINDOWS¥system32¥drivers¥etc¥```

Linux
```/etc/hosts```

身近な例でいうと「localhost」。
これは実は「127.0.0.1」が「localhost」というホスト名で設定されている。（127.0.0.1は自分自身へのアクセスとして定義されている）
だからローカルで開発する時にlocalhostって何気なく入力してもきちんと接続できるっていう仕組み。

記述の仕方は、hostsファイルにIPとホスト名を
```***.***.***.*** hogehoge.com```
みたいな感じで記述するだけ。

それでhogehoge.comへアクセスすると、そのコンピュータからのアクセスはすべて対象IPへ繋ぎに行くようになる。

##ホスト名設定すると何が便利なの？
じゃあそれすると何が便利なの？という話。
開発者目線で考えると例えばこういう時。
DBアクセス先がローカル開発環境はlocalhostのDBで
本番環境はWebサーバとは別のDBサーバだった場合。
ソースとしては本番用とローカル用でDBアクセス先を分けて記述しなければならない。
そういう時に

```
ローカルマシンhosts
127.0.0.1 hogehogeDBserver

本番環境マシンのhosts
***.***.***.*** hogehogeDBserver
```

と設定し、常にhogehogeDBserverに接続するようにコーディングしてあげればソースをわざわざ分ける必要がなくなる。DBサーバの台数が増えたりする場合はより便利になる。

###DNSについて
これに関しては自分自身も詳しく分かっておらず、設定もしたことないのであくまでも脱初心者向けという意味でふんわりな感じで。
DNSとは（Domain Name System）の略です。
じゃあ前述のhosts設定とどう違うの？というと、hosts設定はあくまでもわりと小規模なネットワーク環境で便利なものである。なぜかというとWebサーバの台数もDBサーバの台数もめちゃくちゃ増えた場合、それぞれのWebサーバのhostsファイルに正しく設定して管理する事は非常に大変だから。
そして何より大事なのがあくまでも内部向けのアクセスしか管理できないこと。
そこで利用されるのがDNS。
DNS専用のサーバ（入口的なもの）を用意する事で、外部からドメインネームでアクセスがあった際にも正しく接続先を振り分けられるようになる。
例でいうとyahoo.co.jpとかgoogle.com。
おおまかな流れでいうと

```
1.ユーザーのPCからドメイン名でアクセス
↓
2.プロバイダがまず自身のDNSサーバから対象ドメイン名をチェック
↓
3.見つからない場合は上位のDNSサーバに問い合わせ
↓
4.上位のDNSサーバが情報をプロバイダに渡してあげる
↓
5.プロバイダからユーザーに接続先が伝えられアクセス可能に
```

こんな仕組みを利用する。外部DNSサーバと内部DNSサーバを構築し、
外部DNSサーバには「上位のDNSサーバへ『自分の利用しているドメインはこれですよ』と伝える」役割を、
内部にも専用のDNSサーバを設け前述したhosts設定のような役割を持たせることで、振り分けが楽になる。
Ruby on Rails復習　〜ルーティング〜

復習用メモ。
おかしいところがあれば指摘してください。

#routes.rb

```routes.rb
Rails.application.routes.draw do
  config = Rails.application.config.testapp

  constraints host: config[:staff][:host] do
    namespace :staff, path: config[:staff][:path] do
      root 'top#index'
      get 'login' => 'sessions#new', as: :login
      
      ...
```

- `constraints`で`config/environments/*.rb`内のホスト名を参照して制限

##名前空間
- `namespace`で名前空間を設定(`ホスト名/staff/*`のようになる)
- コントローラー名が`staff/*`のようになる
- ルーティング名が`staff_*`のようになる

#基本的な書き方
```ruby:routes.rb
get 'login' => 'sessions#new', as: :login
```
- `HTTPmethod` `'URLpath'` => `'controller#action'` `(as: :alias)`
のようになる
- パスの指定は
`:login`のようにシンボルで指定するか
`login_path` `login_url`のようにする（login_pathはパスのみを返す）

#resouce(s)
基本的なルーティングを自動生成するメソッド。(adminは名前空間)

|HTTPmethod|URLpath|action|
|:--|:--|:--|
|GET|admin/staff_members|index|
|GET|admin/staff_members/:id|show|
|GET|admin/staff_members/new|new|
|GET|admin/staff_members/:id/edit|edit|
|POST|admin/staff_members|create|
|PATCH|admin/staff_members/:id|update|
|DELETE|admin/staff_members/:id|destroy|

index, new, createは:idパラメータを持たず、他は指定する。

また以下のようなルーティング名が設定される。

|URLpath|ルーティング名|
|:--|:--|
|admin/staff_members|:admin_staff_members|
|admin/staff_members/:id|:admin_staff_member|
|admin/staff_members/new|:new_admin_staff_member|
|admin/staff_members/:id/edit|:edit_admin_staff_member|

- 単数形と複数形に注意。
- `, only(except): [:index, :create, ...]`のようにすることで一部のアクションのみに設定できる

##resource(単数リソース)
セッションやアカウント情報のように1つしかないリソースに対して使う。

|HTTPmethod|URLpath|action|
|:--|:--|:--|
|GET|admin/account|show|
|GET|admin/account/new|new|
|GET|admin/account/edit|edit|
|POST|admin/account|create|
|PATCH|admin/account|update|
|DELETE|admin/account|destroy|

indexがなく、:idパラメータが存在しない。

|URLpath|ルーティング名|
|:--|:--|
|admin/account|:admin_account|
|admin/account/new|:new_admin_account|
|admin/account/edit|:edit_admin_account|

単数のみなのでシンプルである。

#フォーム
##form_forヘルパー
例1:

```erb:new.html.erb
<% @title = 'ログイン' %>

<div id="login-form">
  <h1><%= @title %></h1>

  <%= form_for @form, url: :staff_session do |f| %>
    <div>
      <%= f.label :email, 'メールアドレス' %>
      <%= f.text_field :email %>
    </div>
    <div>
      <%= f.label :password, 'パスワード' %>
      <%= f.password_field :password %>
    </div>
    <div>
      <%= f.submit 'ログイン' %>
    </div>
  <% end %>
</div>
```

例2:

```erb:new.html.erb
<% @title = '職員の管理登録' %>
<h1><%= @title %></h1>

<div id="generic-form">
  <%= form_for [ :admin, @staff_member ] do |f| %>
    <%= render 'form', f: f %>
    <div class="buttons">
      <%= f.submit '登録' %>
      <%= link_to 'キャンセル', :admin_staff_members %>
    </div>
  <% end %>
</div>
```

- パスは[ :admin, @staff_member ]のように配列でも指定できる。　(admin/staff_membersとなる)

- HTTPメソッドはデータが保存前かどうかによってPOST(create)とPATCH(update)を判断する。

Railsが裏で自動的にやることを覚えるのが難しい。

coming soon...
Visual Studioでコピペコードを探す: コード クローン分析

(2021/09/22 更新)
Visual Studio 2017/2019の**Enterprise Edition**にも追加されたようです。
詳しくはこちらのブログをご確認ください。
https://gowthamcbe.com/2020/05/14/code-clone-analysis-tool-in-visual-studio/
前回改善点として挙げていた、類似コード同士を並べて比較できるようになっていました🎉(ただし2ファイルのみ)
コードクローン分析結果タブに表示されているファイルを複数選択し、コンテキストメニューから比較を選択すればできます。

以下は過去の記述です。

---------------


コピペコードが大量にあって、リファクタがつらい。
Visual Studioの標準機能として分析機能があることがわかったので、使い方を残しておきます。

# 環境
Visual Studio 2015 Update 3
C#

# 使い方
1. VSでチェックしたいソリューションを開く
1. 「分析」→ 「ソリューションのコード クローン分析」をクリック
1. 分析結果をチェック

#良い点
- 完全一致のみではなく、やや似ているものもピックアップしてくれる
- 記載されたファイル名上をホバーすることで、ポップアップで該当箇所を表示してくれる

#こうだといいなあと思う点
- クローンと判定されたファイルをまとめて水平に並べて確認したい（完全一致してない場合は特に）
Windowsユーザなら、JScriptに一度は触れてみて

Javascriptはなんとなく書けるんだけど、
会社のWindows PCにnode.jsを入れたらダメ、エクセルマクロだと仰々しい・・・。
なんかいい方法は無いんだろうか。
そこで検討してもらいたいのが~~PoweShell~~ JScriptなのです！

## JScriptとは

[Wiki](https://ja.wikipedia.org/wiki/JScript)より引用
>JScript（ジェイ・スクリプト）は、マイクロソフト社製のスクリプト言語であり、Microsoft Windows 上で動作する。
JavaScriptと類似しており、Internet Explorer を使用したクライアントサイドスクリプティング処理、および Internet Information Services(IIS) などを使用したサーバサイドスクリプティング処理を記述することができる。

JScriptはECMAScript3にほぼ準拠していますので、基本的なことはできると思います。

![jscript.png](https://qiita-image-store.s3.amazonaws.com/0/22648/61d817e7-588d-4cd7-2b64-67e8e598b08e.png)

また、OLE操作ができますので、Ofiiceアプリの操作も可能になります。

## JScirptファイル

拡張子はjsです。Windows上でjsファイルを作ると、勝手にWindows Based Script Hostに関連付けされます。
jsの中身はそのままjavascriptのコードを書けます。

また、他のJScriptファイルをインクルードしたいときやOfiiceの定数を使いたいときは、
wsf という拡張子にして、下記のように記述します。

```xml:module.jsをインクルード
<job id=“ジョブ名">
<reference guid="{00020813-0000-0000-C000-000000000046}"/>
<script language="JScript" src="module.js"></script>
<script language="JScript">

 var hoge = 1;
</script>

</job>
```

## サンプル（Excel操作）
例えばExcelファイルを操作したいときは下記のような記述になります。

```js

// エクセルオブジェクト生成
var excel = new ActiveXObject("Excel.Application");

// ワークブック新規作成
var book = excel.Workbooks.Add();

// シート
var sheet = book.WorkSheets(1);  // 1シート目（1オリジン！）

// セル
sheet.Range('A1').Value = 'ほげほげ';
sheet.Cells(1,2).Value = 'ふがふが'; // 0からではなく、1オリジン！
sheet.Cells(2,1).Formula = '=hyperlink("./hoge/fuga.pdf")'; // エクセル関数を使うときはFormula！

// 保存
excel.DisplayAlerts = false; // 上書き
book.SaveAs( 'filename.xlsx' );

// 終了
book.Close();
excel.Quit();
excel = null;

```

簡単ですね！僕は、納品時に、納品するエクセルファイル全てを

* 1シート目のA1にフォーカスを合わせる
* 印刷モードにする
* 枠線を消す

というJSCriptを用意しています。
みなさんも、是非~~PoweShell~~ JScriptを使ってみてください。
Perforceを使ったUnityビルドでFrameworkがリンクエラーになる

Jenkinsを使ってPerforceのdepotからtrunkを取ってきて、UnityアプリのiOS版のビルドをしているのですが、あるときからXcodeでのビルド時にリンクエラーになるようになってしまいました。同じコードベースのAndroid版は問題なし。

> ld: framework not found GoogleMobileAds

P4Vでdepotを見ると、確かにフレームワークが無い。でも、なぜかリンク対象になってる。で、Mac内のワークスペースを見ると、なぜかフレームワークがある。でも、中身が無い。…そうか！！

![framework.png](https://qiita-image-store.s3.amazonaws.com/0/141731/89fb19b5-4a75-8bf8-dc39-513e5867c8f0.png)

iOS(Mac)のフレームワークはMac上では単一のファイルのように見えますが、実際には複数のファイルをまとめたフォルダです。で、不要になったので誰かが削除したんですが、Perforceはフォルダを管理しないので、フレームワーク内のファイルは消されたものの、ローカルにフォルダは残ったままになります。(上記のスクショはファイルがある状態)

で、UnityはAssetsフォルダ内にあるフォルダやファイルを自動的にプロジェクトに登録してしまうので、フォルダの名前(.framework)だけを見てフレームワークであると認識し、中身が無いにもかかわらず登録してしまい、リンクエラーになるわけです。

まとめると、

- SDK外のフレームワークを取り込んで使っていた
- 不要になったので関連するファイルを削除した
- iOS(macOS)のFrameworkはフォルダベース
- Perforceはファイルしか管理しないのでフォルダだけが残った
- Unityがフォルダの存在だけを見て自動的にリンク対象にした
- でも中身が存在しないのでリンクエラー

ということでした。対応策は、

- Workspaceの設定のAdvancedの"Rmdir: delete workspace directories when empty"にチェックを入れる。
- JenkinsのP4PluginのOptionsの"RMDIR"にチェックを入れる。

…というところなんですが、一つ問題があって、UnityはAssets内のフォルダやファイルを自動的にプロジェクトに登録する際に、.metaファイルを作ってしまいます。そうなると、フォルダ内にフォルダがある場合は空にならないので削除されません。"Forced"でdepot全体を取り直すか、手作業でフォルダを削除するしかなさそうです。

![p4settings.png](https://qiita-image-store.s3.amazonaws.com/0/141731/e527471f-9ca1-5888-de03-e7d05d2c246b.png)

![workspace_settings.png](https://qiita-image-store.s3.amazonaws.com/0/141731/a9117a6b-5c12-b978-80e5-f8bee55250e3.png)
npm shrinkwrap で失敗したときの対処法

`npm shrinkwrap`を使うと依存モジュールのバージョンまで固定した状態でインストールする事ができます。  
ですが、実行したら、エラーが出てしまいました。
復帰方法をメモします。


#失敗した場合

私の場合、下記のように上手く行かない場合がありました。


```bash
$ npm shrinkwrap  
npm WARN unmet dependency ~/path/to/node_modules/nock/node_modules/changelog requires chalk@'^0.5.1' but will load
npm WARN unmet dependency ~/path/to/node_modules/chalk,
npm WARN unmet dependency which is version 1.1.3
npm WARN unmet dependency ~/path/to/node_modules/nock/node_modules/changelog requires semver@'^4.0.3' but will load
npm WARN unmet dependency ~/path/to/node_modules/semver,
npm WARN unmet dependency which is version 5.3.0
npm ERR! Darwin 15.6.0
npm ERR! argv "~/.nodebrew/node/v4.7.2/bin/node" "~/.nodebrew/current/bin/npm" "shrinkwrap"
npm ERR! node v4.7.2
npm ERR! npm  v2.15.11

npm ERR! Problems were encountered
npm ERR! Please correct and try again.
npm ERR! invalid: chalk@1.1.3 ~/path/to/node_modules/chalk
npm ERR! invalid: semver@5.3.0 ~/path/to/node_modules/semver
npm ERR! extraneous: changelog@1.0.7 ~/path/to/node_modules/nock/node_modules/changelog
npm ERR! 
npm ERR! If you need help, you may report this error at:
npm ERR!     <https://github.com/npm/npm/issues>

npm ERR! Please include the following file with any support request:
npm ERR!     ~/path/to/npm-debug.log

```



#解決方法

npmのキャッシュをクリアしたら上手く行きました。
`npm cache clear`コマンドでキャッシュをクリアします。
`npm prune`は未使用パッケージを削除するコマンドです。

```bash
$ npm cache clear
$ npm prune
```

もう一度shrinkwrapを実行します。

```bash
$ npm shrinkwrap
npm WARN shrinkwrap Excluding devDependency: grunt { amperize: '0.3.4',
npm WARN shrinkwrap   archiver: '1.3.0',
npm WARN shrinkwrap   bcryptjs: '2.4.3',
npm WARN shrinkwrap   bluebird: '3.4.7',.
.
.
.
wrote npm-shrinkwrap.json

```

上手く行きました。


# 参考

https://github.com/npm/npm/issues/5042
【Caffe】meanファイルをbinaryproto形式からnpy形式に変換する

```py:code
import caffe
import numpy as np
import sys

if len(sys.argv) != 3:
    print "Usage: python convert_protomean.py proto.mean out.npy"
    sys.exit()

blob = caffe.proto.caffe_pb2.BlobProto()
data = open( sys.argv[1] , 'rb' ).read()
blob.ParseFromString(data)
arr = np.array( caffe.io.blobproto_to_array(blob) )
out = arr[0]
np.save( sys.argv[2] , out )
```
ImageJについて覚書

Menuの設定は、ほとんど（１段目に表示されるもの）ij.Menusにあるが、２段目に表示されるものについてはIJ_Props.txtに記述されている。
Line(ROI)の情報のリアルタイム取得に関してはij.gui.Lineの
	/** Draws this line on the image. */
	public void draw(Graphics g) {
に記述がある。
【iOS】ナビゲーションバーのタイトルのフォントとサイズをコードで変更する【Swift3.0】 

```swift

    // フォント種をTime New Roman、サイズを10に指定
    self.navigationController?.navigationBar.titleTextAttributes
            = [NSFontAttributeName: UIFont(name: "Times New Roman", size: 15)!]

```

テストコード

ViewController.swift

```swift

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        // タイトルをセット
        self.navigationItem.title = "title font test"
        
        // フォント種をTime New Roman、サイズを10に指定
        self.navigationController?.navigationBar.titleTextAttributes
            = [NSFontAttributeName: UIFont(name: "Times New Roman", size: 15)!]

    }

}

```

実行結果
<img width="377" alt="Glass_と_iPhone_6s_–_iOS_10_0__14A345_.png" src="https://qiita-image-store.s3.amazonaws.com/0/151314/bf9296a4-eaff-65e0-a8ee-bb8f40e8ddc2.png">
このコミット、master ブランチにマージってされてるんだっけ？

## --contains オプション
特定のコミットが含まれているブランチを知りたくなったので調べたら `git branch` に `--contains` というオプションがある事が判明。

```bash
$ git branch -a --contains b2b53227
* develop
  fix/testdata
  master
```

`-a` オプションを付けてリモートブランチでも検索可能

```bash
$ git branch -a --contains 7720445
  fix/ie-cache
  remotes/origin/fix/ie-cache
```


Git に惚れ直しました←

そしてありがとう StackOverFlow とユーザーの皆
[参考にしたのはこちら](http://stackoverflow.com/questions/2444100/how-can-i-determine-if-a-given-git-hash-exists-on-a-given-branch#answer-2444924)（参考にしたというか答えがあったというか）
historyにコマンドを記憶させたくない時

## ターミナルでhistoryコマンドを打つと？
**過去に実行したコマンドの履歴が出てくる**

```shell-session:Terminal
$ history
```
多用しますよね？
長いパス打つの面倒だし、そもそもコマンドなんて覚えてないし
過去に実行したコマンドが保持されるので、大変便利です

自動で保存してくれる反面、**保持して欲しくない履歴まで残ってしまう**のが玉に瑕・・・

勿論、カーソルキーの`↑` `↓`をターミナル上で打ち込むとhistoryを遡って1行ずつ表示させてくれます

##:thermometer_face:このコマンド、履歴に残したくないんだよなぁ 
ってこと、ありませんか？
ありますよね。(`cd` `ls` `history` 他にも色々etc...)
履歴が長くなりすぎるとhistoryコマンドから目的のもの見つけるのも、カーソルキーで目的のコマンドまでたどり着くのも面倒です

**下記のコマンドを実行すると、あら不思議！**
先頭にスペースをつけて実行したコマンドは履歴に残らなくなりました

```shell-session:Terminal
$ HISTCONTROL=ignorespace
```

他にも幾つかオプションがあります

| コマンド|説明|
|:-----------------|------------------:|
| HISTCONTROL=ignoredups|同じコマンドが連続する場合は1回だけ記録する|
| HISTCONTROL=ignorespace|コマンドの頭にスペースを付けて実行すると記録しない|
|HISTCONTROL=ignoreboth|上記2つどちらも設定する|

##参考
[bash history から特定のコマンド履歴を削除する](http://qiita.com/hkuno/items/7d7b8cf5881d659e965a)
[historyコマンドとコマンド再実行のメモ](http://qiita.com/dounokouno/items/7e58a9456f86eb974772)

## 終わり
**Let's enjoy ターミナル！**
猿がついに理解できたSwiftのthrow・do・try・catchの意味

Swiftで**throw・try・do・catch**とか出てくるけど、エラー処理とかやったことなかったから、**概念そのものがずっと分からなかった**。

Qiitaでもいろんな記事があるけど、**概念が理解できないと猿の脳みそでは全く理解できない**。

しかし、このままでは嫌だなと思ったので、そもそも**NSError**ってなんなんだ？**NSException**ってなんなんだ？と思いながら、記事をたどって行ったら、throw try do catchなどを分かりやすく説明してくれている記事に遭遇した。

[プログラミング入門（例外処理）](http://www.media.osaka-cu.ac.jp/~matsuura/2008-PP/Exception.html)
（サンプルはJavaですが、概念を理解する上では問題ありませんでした）

もともと**猿は文字を読むのが苦手**だが、丁寧に読んでみたら理解できた。

---

そして概念を理解した上でQiitaにあったこの記事を読んだら、**驚くほど意味が分かるようになった！**
[Swift 3.0 エラー処理入門](http://qiita.com/koishi/items/67cf4d0f51c4d79f1d22)

---

猿的な理解によればこういうことらしい。

まず、世の中には**予想通りの処理ができなかった時にはエラー（Error）や例外（Exception）というものを返してくれるメソッド**というものがあるらしい。

こんな姿をしている。

```
func methodA(text: String) throws {
    if text.isEmpty {
        throw NSError(domain: "errorメッセージ", code: -1, userInfo: nil)
    }
    print(text)
}
```

メソッド名の最後についている**throws**というのは**「このメソッドは例外とかエラーとかを返す可能性があるメソッドだよ」**と教えてくれている。
`func methodA(text: String) throws {`

**このthrowsが付いているメソッドを使う時には**エラーや例外が返ってくる可能性があるので、**エラーや例外が返ってくる場合に備えて**、doとかtryとかcatchを使わないといけないらしいのだ。

それはこんな姿をしている。

```
func method() {
    do {
        try methodA()
    } catch {
        // エラー処理
    }
}
```

**throws**の付いている**methodA**を使う時には**呼び出す前にtryをつける必要がある**。

使う場所は**do**で囲み、後ろには**catch**をつける。
そうすると**catch**の中には**methodAでエラーが投げられた場合に（throwされた場合に）**して欲しい処理が書ける。

これが**throw -> do -> try -> catch** という**一連の野球用語的な呪文**の意味だ（正しい理解であることを願う）。

---

再度言うが、これが分かった途端にQiitaの [**この記事**](http://qiita.com/koishi/items/67cf4d0f51c4d79f1d22) が驚くほど理解できるようになった。

猿でも分かる記事を書いてくれたお二方には深い感謝の意を評したい。
Cognos Report Authoring 逆引き辞典 C3 様々なコンポーネントを入れたページ（ダッシュボード）を作成する

**様々なコンポーネントを入れたページ（ダッシュボード）を作成する**

![image](https://qiita-image-store.s3.amazonaws.com/0/147246/321c6551-fa9a-0c65-9fde-df2ef246e44e.png)


■詳細手順
https://www.slideshare.net/ShinsukeYamamoto/cognos-reportauthoring-c3page

■Cognos Report Authoring 逆引き辞典 - 目次一覧
http://qiita.com/shinyama/items/756cb4a40d31f6cee9f8
Cognos Report Authoring 逆引き辞典 C2 Cognos Connectionや、Cognos Viewer のヘッダーに表示される文字列を変更する

**Cognos Connectionや、Cognos Viewer のヘッダーに表示される文字列を変更する**

![image](https://qiita-image-store.s3.amazonaws.com/0/147246/fe617bf8-f086-39f5-1f03-71c039f6fcb7.png)

■詳細手順
https://www.slideshare.net/ShinsukeYamamoto/cognos-reportauthoring-c2headermessage

■Cognos Report Authoring 逆引き辞典 - 目次一覧
http://qiita.com/shinyama/items/756cb4a40d31f6cee9f8
Cognos Report Authoring 逆引き辞典 C1 「ようこそ」ページのヘッダーに表示される文字列を変更する

**「ようこそ」ページのヘッダーに表示される文字列を変更する**

![image](https://qiita-image-store.s3.amazonaws.com/0/147246/e2b604e9-5a50-4128-1f31-b642e0e21fec.png)

■詳細手順
https://www.slideshare.net/ShinsukeYamamoto/cognos-reportauthoring-c1welcomeheader-73006964

■Cognos Report Authoring 逆引き辞典 - 目次一覧
http://qiita.com/shinyama/items/756cb4a40d31f6cee9f8
Ruby | bundler を特定のバージョンに切り替えて実行する

# インストール可能なバージョンを確認する

```bash
$ gem search ^bundler$ --all

*** REMOTE GEMS ***

bundler (1.14.6, 1.14.5, 1.14.4, 1.14.3, 1.14.2, 1.14.1, 1.14.0, 1.13.7, 1.13.6, 1.13.5, 1.13.4, 1.13.3, 1.13.2, 1.13.1, 1.13.0, 1.12.6, 1.12.5, 1.12.4, 1.12.3, 1.12.2, 1.12.1, 1.12.0, 1.11.2, 1.11.1, 1.11.0, 1.10.6, 1.10.5, 1.10.4, 1.10.3, 1.10.2, 1.10.1, 1.10.0, 1.9.10, 1.9.9, 1.9.8, 1.9.7, 1.9.6, 1.9.5, 1.9.4, 1.9.3, 1.9.2, 1.9.1, 1.9.0, 1.8.9, 1.8.8, 1.8.7, 1.8.6, 1.8.5, 1.8.4, 1.8.3, 1.8.2, 1.8.1, 1.8.0, 1.7.15, 1.7.14, 1.7.13, 1.7.12, 1.7.11, 1.7.10, 1.7.9, 1.7.8, 1.7.7, 1.7.6, 1.7.5, 1.7.4, 1.7.3, 1.7.2, 1.7.1, 1.7.0, 1.6.9, 1.6.8, 1.6.7, 1.6.6, 1.6.5, 1.6.4, 1.6.3, 1.6.2, 1.6.1, 1.6.0, 1.5.3, 1.5.2, 1.5.1, 1.5.0, 1.3.6, 1.3.5, 1.3.4, 1.3.3, 1.3.2, 1.3.1, 1.3.0, 1.2.5, 1.2.4, 1.2.3, 1.2.2, 1.2.1, 1.2.0, 1.1.5, 1.1.4, 1.1.3, 1.1.2, 1.1.1, 1.1.0, 1.0.22, 1.0.21, 1.0.20, 1.0.18, 1.0.17, 1.0.15, 1.0.14, 1.0.13, 1.0.12, 1.0.11, 1.0.10, 1.0.9, 1.0.7, 1.0.5, 1.0.3, 1.0.2, 1.0.0, 0.9.26, 0.9.25, 0.9.24, 0.9.23, 0.9.22, 0.9.21, 0.9.20, 0.9.19, 0.9.18, 0.9.17, 0.9.16, 0.9.15, 0.9.14, 0.9.13, 0.9.12, 0.9.11, 0.9.10, 0.9.9, 0.9.8, 0.9.7, 0.9.6, 0.9.5, 0.9.4, 0.9.3, 0.9.2, 0.9.1, 0.9.0, 0.8.1, 0.8.0, 0.7.2, 0.7.1, 0.7.0, 0.6.0, 0.5.0, 0.4.1, 0.4.0, 0.3.1, 0.3.0)
```

# 特定のバージョンをインストールする

```bash
gem install bundler -v 1.11.2
gem install bundler -v 1.14.5
```

# インストール状態を確認する

```bash
$ gem list bundler

*** LOCAL GEMS ***

bundler (1.14.5, 1.11.2)
```


# バージョンを確認する


```bash
$ bundle _1.11.2_ -v 
Bundler version 1.11.2
```

```
$ bundle _1.14.5_ -v 
Bundler version 1.14.5
```

デフォルトは最新のものになるようだ。

```
$ bundle -v
Bundler version 1.14.5
```


# バージョンを指定して実行する

バージョン指定でコマンド実行すればOK。

```bash
$ bundle _1.11.2_ install
```

# エラー

同じ手順を踏んでも、特定のプロジェクト内(ディレクトリ以下)ではなぜか実行できなかった。（未調査）

```
$ bundle _1.11.2_ -v
Could not find command "_1.11.2_".
```

# 環境

- MacOS Sierra

# 参考

- http://stackoverflow.com/questions/17026441/how-to-install-a-specific-version-of-a-ruby-gem
- http://stackoverflow.com/questions/41500197/how-to-switch-bundler-version








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
SeleniumのgetText()とgetAttribute()の違い


**・getText()…指定されたタグ内のテキストを取得する。**
タグに囲まれたテキストが欲しければこっち。

**・getAttribute(String param)…引数で渡された属性の値を取得する。**
value欲しければこっち。

```
<input id="sample" attr1="aaa" attr2="bbb" attr3="ccc">foo</input>

String test = driver.findElement(By.id("sample").getAttribute(attr1) // "aaa"
String test = driver.findElement(By.id("sample").getAttribute(attr2) // "bbb"
String test = driver.findElement(By.id("sample").getAttribute(attr3) // "ccc"
String test = driver.findElement(By.id("sample").getText // foo
```

参考先：
http://stackoverflow.com/questions/32307702/difference-b-w-gettext-and-getattribute-in-selenium-webdriver
改行区切りの文字列の1行目をTitle、それ以降をBodyとして取得する

```ruby
title, *, body = "1行目\n2行目\n3行目".partition("\n")
puts title # => 1行目
puts body # => 2行目\n3行目
```

:eyes: https://ruby-doc.org/core-2.4.0/String.html#method-i-partition
:eyes: [Rubyの多重代入あれこれまとめ - Qiita](http://qiita.com/yancya/items/c557864f307d429bbde4)

コメント欄も見て行ってくれよな！
playbook テンプレート

自分で作ったplaybookを公開する．

## プロジェクト単位に共通化したもの

 * handler
プロジェクトのhandlerを /path/to/pj/handlers/main.yml に集約
     
 * roles
プロジェクトのroles を /path/to/pj/roles/

## 仕様

 * tasksを開始する前に，ターゲットのホストネームとインベントリに書いてある名前と照らし合わせて，一致しなければ，止まる
 * .ansible_build_is_done ファイルが存在したら，止まる

  playbook中に，冪等性持っていないタスクがあるため, **playbook単位に** 二度と実行させない．

 * playbook最後まで行けたら，.ansible_build_is_done ファイル作成する
 * rolesを実行条件によって，グルーピングする

``` yaml
---
- hosts: hogehoge
  become: true

  handlers:
    - include: handlers/main.yml

  pre_tasks:
    - name: check target hostname
      local_action: command test {{ inventory_hostname }} = {{ ansible_hostname }}
      become: false
      tags: always

  tasks:
    - name: check - is ansible build done
      command: test ! -e .ansible_build_is_done
      become: false

    - block:
       - name: build foo1
         include_role:
           name: foo1
       - name: build foo2
         include_role:
           name: foo2
       - name: build foo3
         include_role:
           name: foo3
      when:
        - ansible_distribution == 'CentOS'
        - ansible_distribution_major_version == '7'

    - name: install foo4
      include_role:
        name: foo4
      when:
        - foo4_enabled == 'yes'
        - ansible_distribution == 'CentOS'
        - ansible_distribution_major_version == '7'
      tags: 1.2.0

    - name: flag - ansible build is done.
      file: path=.ansible_build_is_done mode=0600 state=touch
      become: false
```
p5.jsでクリエイティブコーディングを始めよう！

# クリエイティブコーディングとは？
クリエイティブコーディングは、プログラミングでメディアアートやオーディオ生成、データを可視化したりする技法の事です。本稿は、p5.jsを使ったクリエイティブコーディングコーディングの入門記事です。

# p5.jsとは？
p5.jsは、Javaがベースのクリエイティブコーディング環境である「Processing」のJavaScript版ライブラリです。Processingと記述方法が似ている（ほぼ同じ）ため、初心者でも簡単にクリエイティブコーディングができます。
[公式サイト](https://p5js.org)

# p5.jsを導入しよう！
p5.jsを導入します。
まず、下記のようなhtmlファイルを作ります。ファイル名は「index.html」とします。
今回は、とりあえずなのでp5.jsを[CDN](https://cdnjs.com/libraries/p5.js)から読み込んでいます。

```html:index.html
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<title>p5.js Introduction</title>

	<!-- p5.jsの読み込み -->
	<script src="//cdnjs.cloudflare.com/ajax/libs/p5.js/0.5.7/p5.min.js"></script>
</head>
<body>

	<script type="text/javascript">
		//この部分にプログラムを書いていきます。
	</script>
</body>
</html>
```

# さっそくクリエイティブコーディング！
index.htmlの`<script type="text/javascript"></script>`にプログラムを書いていきます。
まずは、以下のコードを記述してみましょう。

```JavaScript
function setup(){
	//640×480のCanvasを生成
	createCanvas(640,480);
}

function draw(){
	//xが320,yが240,直径が100の円を描画
	ellipse(320,240,100,100);
}
```

実際にブラウザで確認してみましょう！
<img width="1368" alt="スクリーンショット 2017-03-10 10.36.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/109953/3dd374a7-1d7c-3faf-16df-c58de7e66b6e.png">

しっかりと640×480のCanvasタグが生成され、円が描画されていれば成功です！

# マウスでクリックした位置に円を描画する
次に、インタラクティブなプログラムを作成してみます。
先程と同様に以下のコードを記述します。

```JavaScript
function setup(){
	//640×480のCanvasを生成
	createCanvas(640,480);
}

function draw(){
	//クリックしたとき
	if(mouseIsPressed){
		//クリックした位置に直径10の円を描画
		ellipse(mouseX, mouseY, 10 ,10);
	}
}
```

実際にブラウザで確認してみましょう！![mouse.gif](https://qiita-image-store.s3.amazonaws.com/0/109953/f16d0b78-7295-0fcb-3081-fb5ae7bbb4d4.gif)
Canvas要素の範囲内でクリックやドラッグした場所に円が描画されたら成功です！

# おわりに
今回はp5.jsの基礎的な部分を記事にまとめてみました。
時間がある時に、もっと高度なクリエイティブコーディングの記事を書きたいと思います。
この記事を読んで、少しでもクリエイティブコーディングに興味を持っていただけると幸いです。

#参考サイト
p5.jsリファレンス
https://p5js.org/reference/