OmniAICreator/Qiita-1.07M huggingface dataset:
GarageBandからMIDIを出力する

Max for Live 高えよ...ってことでもっと安価にできないか探ってみた記録。

デモ動画
https://www.youtube.com/watch?v=LN1ZKbmDtXs


MacならGarageBandが使いやすそうだが、なんと単体ではMIDI出力ができない。
MainStageで出力パッチを作れると聞いたので試してみた。
※ midiO という定番プラグインがあるみたいだが、GarageBand最新版（v10.1）には対応してないっぽい

以下、環境は OS X 10.11.5

仮想MIDIポートを設定する
----------------------

1. Audio MIDI 設定の「MIDIスタジオ」を開き、IACドライバの設定をする
![midi1.png](https://qiita-image-store.s3.amazonaws.com/0/20773/12ddc1f5-0613-954b-cef2-f0a1c9718ddb.png "midi1.png")

2. ポートを追加する
念のためデバイス名を英語にしておく（あとでテストする PureData でデバイス名がうまく表示されない）
![midi2.png](https://qiita-image-store.s3.amazonaws.com/0/20773/bada1fa5-85d4-4023-b5ac-61afd7ec7d31.png "midi2.png")


MainStageでGarageBand用のMIDI出力パッチをつくる
----------------------


MainStageをインストール
http://www.apple.com/jp/mainstage/

2016/07/31 現時点で ¥3,600
パッチを作るためだけに購入するのはちょっと高いかもしれない

1. MainStageの新規プロジェクトを開き、MIDI出力用のチャンネルストリップを作成
![ms1.png](https://qiita-image-store.s3.amazonaws.com/0/20773/532dc470-4b01-9128-c129-70436c7c84bd.png "ms1.png")


2. チャンネルストリップを作成
MIDI出力に先ほど作成した、IACドライバを設定する
![ms2.png](https://qiita-image-store.s3.amazonaws.com/0/20773/c0af8d47-15aa-0ed6-1e6d-d0d30e7c947f.png "ms2.png")


3. パッチとして保存する
![ms3.png](https://qiita-image-store.s3.amazonaws.com/0/20773/6bc37573-8e79-f316-baa6-b9418ba6aa47.png "ms3.png")


GarageBandでプロジェクトを作成、MIDI出力する
----------------------

GarageBand をインストール
http://www.apple.com/jp/mac/garageband/

1. 新規プロジェクト作成する
![gb1.png](https://qiita-image-store.s3.amazonaws.com/0/20773/f5ecd992-3fce-85a6-32ca-000999cc7203.png "gb1.png")


2. MainStageで作成したパッチを読み込む
![gb2.png](https://qiita-image-store.s3.amazonaws.com/0/20773/bd26109a-1982-a508-a1e0-d949b06d63b9.png "gb2.png")
_ドラッグで読み込める_

3. ⌘+クリックでリージョンを作成
![gb3.png](https://qiita-image-store.s3.amazonaws.com/0/20773/0243ab05-80e1-793c-c9ea-13008581ada2.png "gb3.png")
_MIDI出力トラックのなにもない所を、⌘+クリックでリージョンを作成できる_

4. リージョンをダブルクリックでピアノロールが開く
![gb4.png](https://qiita-image-store.s3.amazonaws.com/0/20773/1eaacfdc-e6e5-0472-ec30-1de3deb167f4.png "gb4.png")

5. ピアノロール上で⌘+クリックすると、MIDIノートが打たれる
適当にノートとベロシティを編集する
![gb5.png](https://qiita-image-store.s3.amazonaws.com/0/20773/e41fa334-f4c7-4400-e43b-fd9a5a9a884c.png "gb5.png")


MIDI出力を確認する
----------------------

PureDataをインストール
https://puredata.info/

1. メニューの Media > MIDI Settings を開き、入力源に MIDI設定で作成したIACドライバを選択する
![pd1.png](https://qiita-image-store.s3.amazonaws.com/0/20773/e4cf09fa-3a76-bb4e-d99a-24ecb15aa520.png "pd1.png")

2. メニューの Media > Test Audio and MIDI をひらく
![pd2.png](https://qiita-image-store.s3.amazonaws.com/0/20773/da5872ff-2267-d901-9aea-8f5e7297adb5.png "pd2.png")


以上で準備完了。GarageBand を再生させると MIDI 信号が確認できる。
MIDIのまま使うもよし、OSCなどに変換して飛ばすもよし。

![pd3.png](https://qiita-image-store.s3.amazonaws.com/0/20773/7752756b-7200-e5ad-6a47-50752e37904e.png "pd3.png")


その他の方法
----------------------

Studio One Free ならプラグインなしで MIDI が出せるのでこちらもおすすめ。
http://www.mi7.co.jp/products/presonus/studioone/prime/
webpack経由でeslintするときの注意点

当たり前な気がしますが、gruntやgulpではお目にかからない、webpackっぽい話

- `eslint src/` 
    - => `src/`の全ての`.js`に対してlint実行
- `webpack` + `eslint-loader` 
    - => **エントリーファイルから辿れる`.js`に対してだけ** lint実行
    - まだ`import`,`require`してないファイルとかはlintされない

参考までに`eslint-loader`を組み込んだ、`webpack.config.js`の例

```js:webpack.config.js
const webpack = require('webpack')

module.exports = {
  context: `${__dirname}/src`,
  output: {filename: 'bundle.js', path: `${__dirname}/public`},
  resolve: {extensions: ['', '.js']},
  entry: {
    main: './index.js',
  module: {loaders: [
    {test: /\.js$/, exclude: /node_modules/, loader: ['babel-loader', 'eslint-loader']},
  ]}
}
```
走りだしたら止まらないAndroid StudioのGradleビルドを強制的に止める方法

一度Androidアプリのビルドが走り始めると、■こんな感じの停止ボタン![image](https://qiita-image-store.s3.amazonaws.com/0/27388/2bcf777b-321f-069e-4e20-bb4c6b63a60e.png)押しても、下の☓ボタン![image](https://qiita-image-store.s3.amazonaws.com/0/27388/3e0cb764-d007-78bf-635c-8f95f4087e48.png)を押しても止まらないですよね？？



下のToolWindowのTerminal開いて以下を打ち込むことで止まるのを確認できたので共有します。(もっと簡単なやり方あったら教えてください)
![image](https://qiita-image-store.s3.amazonaws.com/0/27388/c5d756ff-f3bc-ffcc-b164-4bd31c72c18b.png)


```sh
./gradlew --stop
```


(IntelliJプラグインにしたい)


参考
https://blog.jetbrains.com/idea/2015/04/a-curated-list-of-ide-plugins-for-android-development/
[自分用まとめ] postgresqlの使い方

herokuのデータベースの中身をローカルでも再現したかったのですが、地味にリファレンスいろんなところ読まないといけなくて面倒だったのでまとめる。

## まずはインストール

```
$ brew install postgres
# 以下省略

#ここらへん大事。初期設定の方法が載ってる。
To have launchd start postgresql at login:
    ln -sfv /usr/local/opt/postgresql/*.plist ~/Library/LaunchAgents
Then to load postgresql now:
    launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
Or, if you don't want/need launchctl, you can just run:
    postgres -D /usr/local/var/postgres

```

パソコンの起動時に常にpostgresql起動しておきたいなら

```
ln -sfv /usr/local/opt/postgresql/*.plist ~/Library/LaunchAgents
```

postgresqlを明示的に起動したいなら

```
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
```

みたいな感じのをやる

## 操作方法

`\h`でヘルプ出てくるんでそこらへん見ればいいんですが、載ってないのだと

`/d`：テーブル一覧
`\dn`：データベースの確認
`\l`：データベース一覧


はよく使う。[参考](https://www.postgresql.org/docs/current/static/app-psql.html)これはpsqlのコマンド。

## herokuでdumpしたDBを復元

```
$ pg_restore --verbose --clean --no-acl --no-owner -h localhost -U ユーザ名 -d データベース名 バックアップファイル名
```

でオーケー。

```
\connect database_name
```
で指定したデータベースと繋がるのであとは普通に操作。
OpenCVで物体追跡し、対象にモザイクをかけ続ける(動画)

# 概要
OpenCVのtrackingを使用して物体の追跡を行う

# 環境
+ Windows 10(64Bit)
+ OpenCV3.1
+ CMake 3.6.1(64Bit)
+ Visual Studio 2015

# 対象
+ Visual StudioでC(++)の実行環境を構築出来る
+ PATHの設定が出来る

# 記事を読んで出来る事
+ OpenCVのVisual Studio向けビルド環境構築
+ 動画の1フレーム目を利用して追跡対象の物体を選択し、その後追跡中にモザイクをかけるプログラムの実行

# 発展させるとしたら
+ AviUtlのプラグイン作成
+ スマホからの動画編集アプリ

# 注意
+ 公開するプログラムは最小単位なのでエラー等は考慮しないものとする
+ ファイルを取得し展開する必要のあるものは全て『c:\』へ展開したものとして記載する
+ パスを通す手順は記載を省くので各自対応しているものとする

# 手順
## OpenCVの取得
https://github.com/opencv/opencv/releases からOpenCV 3.1を取得し任意の場所に展開する

## contribの取得
https://github.com/opencv/opencv_contrib より、cloneするか、zipでファイルを取得し任意の場所に展開する

## contribビルド
Visual Studio 2015向けビルド環境構築

### Visual Studioのソリューションファイル生成
CMakeを起動し以下の設定を行う

|設定内容|値|
|:-----------|:------------|
|Where is the source code|C:/opencv/sources|
|Where to build the binaries|C:/opencv/build|

入力後、「Configure」する

|設定内容|値|
|:-----------|:------------|
|Specify the generator for this project|Visual Studio 14 2015|
|Radio Button|Use default native compilers|

更に以下のオプション設定を行う

|Name|Value|
|:-----------|:------------|
|OPENCV_EXTRA_MODULES_PATH|c:/opencv_contrib-master/modules|

入力後再度、「Configure」する
エラーが出ていなければ続いて「Generate」する

### Visual Studioからcontribビルド
C:\opencv\build\OpenCV.slnを実行し、Debug・Release共にビルドする

## 実装
Visual Studioのソリューションを作成する

アプリケーション設定

|設定|値|
|:-----------|:------------|
|アプリケーションの種類|Windows アプリケーション|
|追加オプション|空のプロジェクト|

*コンソールでも問題ないと思うが拡張する上でファイルの読み込みやUI設計する可能性があるのでこうした*


```cpp:main.cpp
#include <opencv2\opencv.hpp>
#include <opencv2\video.hpp>
#include <opencv2\tracking.hpp>
#include <opencv2\highgui.hpp>
#include <opencv2\imgproc.hpp>
#include <Windows.h>

#pragma comment(lib, "opencv_core310.lib")
#pragma comment(lib, "opencv_videoio310.lib")
#pragma comment(lib, "opencv_tracking310.lib")
#pragma comment(lib, "opencv_highgui310.lib")
#pragma comment(lib, "opencv_imgproc310.lib")

int WINAPI WinMain(
	HINSTANCE hInstance,
	HINSTANCE hPrevInstance,
	LPSTR lpCmdLine,
	int nCmdShow
)
{
	cv::VideoCapture cap(『任意の動画ファイルを指定』);
	if (!cap.isOpened()) return 0;

	cv::Mat frame;
	cap >> frame;
	cv::Rect2d roi = cv::selectROI("Target", frame);

	cv::Ptr<cv::Tracker> tracker = cv::Tracker::create("MIL");
	tracker->init(frame, roi);

	for (;;)
	{
			// 切り出してモザイクかけてもどす.
			// 倍率は20
			cv::Mat mosaic(frame, roi);
			cv::resize(mosaic, mosaic, cv::Size(), 0.05, 0.05);
			cv::resize(mosaic, mosaic, cv::Size(), 20, 20, cv::INTER_NEAREST);
			cv::Mat mat = (cv::Mat_<double>(2, 3) << 1.0, 0.0, roi.x, 0.0, 1.0, roi.y);
			cv::warpAffine(mosaic, frame, mat, frame.size(), CV_INTER_LINEAR, cv::BORDER_TRANSPARENT);
			cv::imshow("Tracking", frame);

			if (cv::waitKey(1) == 0x1B) break;

			cap >> frame;
			if (frame.empty()) break;
			tracker->update(frame, roi);
	}

	cv::destroyAllWindows();
	return 0;
}
```

実施している事

+ 動画の読み込み
+ 1フレーム目から追跡対象特定(マウスで枠を作成し、Enterキーで確定)
+ 1フレームづつ追跡対象にモザイクをかけ画像を合成し表示
+ 最終フレームまたはEscキー入力で終了
引数が複数指定されている関数の動作について

関数で複数の引数が指定されていることがあるが、その時の動作について。

- 引数は1つだけではなく必要な数だけ指定することが出来る
- 複数の引数を指定する場合はカンマ(,)で区切る
- 呼び出し側で指定した順に変数に値を格納されて処理される

以下、基本的な書式。

> function 関数名(変数名1, 変数名2, ...){
>  // ...
> }
>
> 関数名(値1, 値2, ...);

詳細は下記サイト参照。

[複数の引数](http://www.phpbook.jp/tutorial/function/index3.html)
ミニマムなgitサーバを作る方法

# この記事について
この記事ではミニマムなgitサーバの作成方法について書いていきます。
manjaro Linuxで作っていますが、Arch Linuxでも問題なく作れると思います。
pacmanなどの環境依存のコマンドを置き換えればubuntu、fedora上でも同じ方法で作成可能です。
最小限なのでプッシュとプルしかできません。（それで十分だと思いますが。）
より統合的なgitサーバを作りたいならば [gitlab](https://about.gitlab.com/) などのパッケージを使うのが良いでしょう。

# 必要なソフトのインストール
まずはgit。
パッケージマネージャで簡単に入れられます。

```
pacman -S git
```

次にサーバとクライアント間の通信に使われるsshを入れる必要があります。
下記のコマンドでsshをサーバにインストールして有効化してください。

```
sudo pacman -S openssh
sudo systemctl enable sshd
sudo systemctl start sshd
```

# gitユーザの変更
gitを入れると新しくgitデーモンユーザができます。
ユーザのパスワード、ホームディレクトリを変更していきます。
アクセス制限を回避するためにルートに昇格します。

```
sudo su
```

gitユーザのパスワードを変更します。

```
passwd git
```

gitユーザのホームディレクトリを作成します。
所有者を変更することをお忘れなく。

```
mkdir /home/git
chown git /home/git
```
/etc/passwdを編集して作成したディレクトリをホームディレクトリに登録します。/etc/passwdのgitユーザの行

```
git:x:995:995:git daemon user::/bin/bash
```

を

```
git:x:995:995:git daemon user:/home/git:/bin/bash
```
に変更します。

# sshの設定
サーバにクライアントがアクセスできるようにsshを設定します。
クライアント側で以下のコマンドを実行して鍵を生成します。

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

ftpなどでサーバに公開鍵（id_rsa.pu）をアップロードします。
gitユーザのホームディレクトリにsshの設定ファイルを作ります。
下記のコマンドをgitユーザとして実行してください。

```
mkdir ~/.ssh
touch ~/.ssh/authorized_keys
```

クライアント側で生成した公開鍵を作成したauthorized_keysに書き込みます。

```
cat id_rsa.pub >> ~/.ssh/authorized_keys
```

これでsshの設定が終わりました。

# git-shellの設定
セキュリティのためgitユーザのシェルを変更します。
この変更によりgitユーザは~/git-shell-commands内にあるコマンドしか実行できなくなります。
git-shellを有効化する前にgit-shellに許可するコマンドを設定します。
~/git-shell-commands内に新しいレポジトリを作るコマンドを書いたシェルスクリプトnewgitを置きます。

```bash:newgit
#! /bin/sh
mkdir -p ~/Projects/$1
cd ~/Projects/$1
git init --bare
```

これからgit-shellを有効化します。
/etc/passwdの先ほどと同じ行のうち/usr/bin/bashと書かれている場所を/usr/bin/git-shellに変更します。


```
git:x:995:995:git daemon user:/home/git:/usr/bin/git-shell
```

これでサーバの設定は終わりました。

# テスト
まずサーバに先ほど作成したnewgitコマンドでTestレポジトリを作ります。

```
ssh git@remote_host
newgit Test.git
```

それから、クライアント側でコミットの準備をします。

```
git remote add origin git@remote_host:~/Projects/Test.git
```

プッシュが成功すれば完成です。

```
git push origin HEAD
```
 
# バックアップの自動化
バックアップの自動化をしておきましょう。
サーバ側の"~/git-shell-commands"に下記のようにバックアップを作成するスクリプトをつくります。

```bash:backup.sh
#! /bin/sh
mkdir -p ~git/Backup/                                                                FNAME=`date --iso-8601`
tar -cvjf ./Backup/${FNAME}.tar.bz2 ./Projects
find ./Backup/ -mtime +14 -exec \rm -rf \{} \;
wall "Git Repository BackUped :)"
```

`find`から始まる行が重要です。この行がないとバックアップフォルダが肥大し続けます。
このコマンドをcronジョブに登録します。
`sudo crontab -e`を実行してジョブの編集を行います。

```bash:クロンジョブ編集画面
* */5 * * * /home/git/git-shell-commands/backup.sh
```

これにより、5時間ごとにbackupコマンドが実行されます。

# セキュリティの強化
大切なものは守りましょう。ここでは2つの方法でセキュリティを強化する方法を紹介します。

1. ファイルのアクセス制限
サーバにログインして`su`でルートになります。
下のコマンドでgitユーザのホームディレクトリ丸々のアクセス権限を変更します。

```bash:アクセス権限変更
chmod -R 700 /home/git/
```

これにより、他のユーザからはgitのファイルにアクセスできなくなります。

2. sshのログイン制限
`sudoedit /etc/ssh/sshd_config`を実行してsshの設定ファイルを編集します。

```bash:/etc/ssh/sshd_config
ChallengeResponseAuthentication no
PasswordAuthentication no
UsePAM no
AllowUsers git # ログイン出来るユーザの指定。厳しすぎるかも？
```
「shell / シェル」の概念

# シェルってよく聞くけど何のこと？

シェルの機能

* OSの機能でユーザーのためのインターフェースを提供
* カーネルのサービスへのアクセスを提供

OSの内部（カーネル）とユーザーの間にある外殻（シェル）であることからこのように呼ばれる。

つまり、　OSのユーザインターフェースのこと。

# 役割は？
一般的には、
* グラフィカルインターフェース（GUI）
* コマンドラインインターフェース（CLI）

の２つに分類される。

# 補足
* シェルはUNIXで使われる呼称
* 一般的にはコマンドラインインタプリタ（コマンドを解釈する者）と呼ばれる
EXCEL > (0.0, 0.25, 0.5, 0.75, 1.0) を (0.0, 0.5, 0.5, 1.0, 1.0)に変換する

```txt:動作環境
Excel 2013
```

### 振舞

`(0.0, 0.25, 0.5, 0.75, 1.0)`
という数値セットを
`(0.0, 0.5, 0.5, 1.0, 1.0)`
に変換したい。

### 実装

2倍した値で切り上げして、その値を1/2にすればよさそう。

参考 http://kokoro.kir.jp/excel/round.html

`=ROUNDUP(2*B4,0)/2`
とする。B4は変換元の数値セル。
少数第1位で切り上げするので、桁数を0としている。

### 結果

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/f3b77233-40bb-f8df-a2e8-78eeff8e0c27.png)
git のブランチについてわかりやすく説明してみる

# ありがちなイメージ
　最初にブランチというものをイメージするとき、GUI なツールを使ってブランチツリー図を見た感じから、普通はブランチはこんな風に考える方が多いと思います。
![branch0_200.png](https://qiita-image-store.s3.amazonaws.com/0/129226/8850c7bc-f1d0-280a-c1c9-aaf96a5f280f.png)
　ブランチを作成した所から新しい枝が伸び、この枝の部分がブランチとなっています。
　Mercurial なんかでは、確かにこのようなイメージで問題ありません。ですから、そちら方面から git に入った人はこういうイメージを持つ方が多いのではないかと思います。
　ですが、git のブランチは、このようにイメージしているとかなりの混乱を招くことになります。

# git のブランチのイメージ
　git のブランチは、以下のようにイメージすると理解しやすいと思います。
![branch1_200.png](https://qiita-image-store.s3.amazonaws.com/0/129226/4ca4adac-d59d-a577-4784-6c1d4a35a471.png)
　git でブランチを作成すると、ツリーの根元から現在の位置までが作成したブランチとしてマークされます。上の例で言うと、すべてのコミットが Branch-A であり、Branch-B でもあるという状態になります。そしてコミットすると、新しいコミットも自動的に現在のブランチとしてマークされます。
　つまり、ツリーの枝というものは単にコミットの履歴でしかなく、ブランチとは関係ありません。そしてブランチは、個々のコミットに対してマークをつけているだけなのです。
　ですので、git はブランチを削除したりすることもできます。
![branch2_200.png](https://qiita-image-store.s3.amazonaws.com/0/129226/249d9a41-d47b-aaee-c700-3bae524f6707.png)
この時、削除するのはブランチだけなので、コミット自体は消えずに残ることになります。

# コミット時、ブランチのマークがつかない場合がある
　git はコミットしたとき、**いずれかのブランチに所属している場合のみ**、そのコミットに自動的にブランチのマークをつけます。
　もし、それ以外の状態でコミットしてしまうと、そのコミットにはブランチのマークがつきません。つまり、そのコミットはどのブランチにも所属していないものとして扱われます。
　さらに git の GUI ツールはたいていブランチに含まれないものを表示しないため、コミットが消えてしまったように見えます。（たちの悪いことに、コミットした後 checkout コマンド等でブランチを切り替えるまでは、ログは正常に見えています。)
　では、どんな場合に**ブランチに所属していない状態になる**のか。例をあげると次のような場合に、どのブランチにも所属していない状態となります。

- origin/master 等、origin/ のついたブランチ、つまりリモートブランチを checkout した場合。
- ハッシュ値を使用して checkout した場合。（GUI ツールを使用して、ブランチの途中を checkout した場合もこれに含まれます。）

　逆に言うと、「git checkout ローカルブランチ名」として、ローカルブランチの先頭をチェックアウトしたとき以外は、どのブランチにも所属していない状態になっていると言えます。
　わかりにくいかもしれませんが、こうしておかないとブランチの先頭が複数個存在するケースが発生してしまい、例えば「git checkout ブランチ名」とした場合に、どこへ移動すべきかわからなくなってしまいます。

# 使いこなせば便利になる
　push してしまうとサーバ上のものと矛盾ができてしまうので駄目ですが、push する前なら取り消し等様々な操作が可能です。
　例えば、あるブランチとしてコミットしてしまった後で別ブランチ化する、なんてこともできてしまいます。
![branch3_200.png](https://qiita-image-store.s3.amazonaws.com/0/129226/a74b4481-33be-75d7-0b8b-8e4535d6919c.png)
こんな風に、ブランチがただのマークであるということさえわかっていれば、いろいろ応用が利くということもわかっていただけるのではないかと思います。


# 最後に
　これでだいたいイメージしていただけたでしょうか？
　僕や僕の周りの人間も、導入の段階で躓いて、いろいろ苦労しました。まあ、理解してしまえば、簡単なことなんですが。
　ただ、なかなか普及させるのは難しく、特にプログラマ以外の人間にこれを理解させるのは無理な気がしています。プログラマ以外はブランチやマージなんて使うことがまずないので、svn でいいじゃん、とかになってしまうんですよね。プログラマからすると、svn ではもうやっていけなくなってるんですが。
約半年間仕事をしていなかった話

## 衝撃の事実
僕はヘルスケアの会社でAndroidエンジニアとして開発を行っているのですが、衝撃の事実に気づきました。

グラフをみてください!!!! (Githubで開発を行っており、プロジェクトへのcommit数が見られるGraphというタブのページのグラフです。)

![Kobito.EXZlA2.png](https://qiita-image-store.s3.amazonaws.com/0/43762/4aaee211-d1b5-d993-5a83-42ea26e2765e.png "Kobito.EXZlA2.png")


実は僕、2016年の2月から働いていなかったんです。
あれ、この半年プロジェクトに結構コミットして、貢献していたつもりだったのになー。気のせいかー。
たまにGraph見たときに薄々気づいていたんだけどなー。ま、いっかと思いながら放置してたんですが、やっぱり自分のコミット数見たい!!(短期間のcommit数自体多すぎない？という質問は受け付けません。)

## 一つの仮説
2月に何があったのか？
心当たりは大規模なリリースくらい。
そこで何かやったとは、考え難い。。。。。
仮説を立ててもしょうがないので、普通にGithubで調べました。


## GitでEmailをセット
[Setting your email in Git](https://help.github.com/articles/setting-your-email-in-git/)

ここに全てのってました。
なぜかgitのconfigにemailとuserがセットされていなかったみたいです。(変更した記憶ないんですが笑。)
アカウント紐付いているメールアドレスがgitにセットしてなかったので、この現象が起こるようでした。

```
$ git config --global user.email "your_email@example.com"
-> これでホームの.gitconfigにemailをセット
$ git config --global user.email
-> これで自分がセットした上記emailが表示される。
```

グローバルにセットしてダメな場合は、レポジトリ毎にもセットしてください。
レポジトリのgitをセットしている、rootで同じように

```
$ git config user.email "your_email@example.com"
$ git config user.name "neonankiti"
```

これで完了です。

## おまけ
上記の内容を踏まえた上で、じゃあ今まで闇コミットをしていたユーザーは誰なんだ！？
ということを知りたければ、 `commitページ` のurlに `.patch` をつけてみてください。
そのcommitの詳細情報が書かれています。
[参考](https://help.github.com/articles/why-are-my-contributions-not-showing-up-on-my-profile/)

## マージしてみると

![Kobito.9CplqI.png](https://qiita-image-store.s3.amazonaws.com/0/43762/6ce49324-9601-ef2b-3f67-af3d0b5cf6ee.png "Kobito.9CplqI.png")
どうやらcommitがしっかりつきました。(グラフの一番右端が微妙に盛り上がりました。)
半年ぶりに仕事に着手できそうです。
(今までの分の闇commitはgraphには表示されないそうです。)

## 最後に
半年も放置していましたが、やっぱり自分の仕事、作業を測定するために定量的な指標は大事ですね。
commit数 = コードの品質、貢献ではありませんが、日々の業務においてcommit数も重要だと思っています。(特に評価する側の視点から)
引数に$(cat)を指定し標準入力を受け取る（echo コマンドなど）

こんにちは。
コマンド引数にて標準入力を受け取るようにするには、cat コマンドの助けを借りると良いようです。そのままでは標準入力を受け取らないコマンド（echo など）に用います。

#### echo コマンド

```console
$ echo "hello" | echo $(cat)
"hello"
```

#### set コマンド

```console
$ echo 1 2 3 | set $(cat); echo $3 $2 $1
3 2 1
```

#### シェルスクリプト[^1]
```console
$ echo 1 2 3 | sh -c 'w=$(cat); echo $w'
1 2 3
```

#### 複数行の各行を受け取る
複数行の標準入力の各行を受け取る例です。

```console
$ which -a realpath | realpath $(cat)
/usr/local/Cellar/coreutils/9.4/bin/grealpath
/bin/realpath
```


[^1]: 参考：「[標準入力も受け取れるシェルスクリプト（catコマンド使用）](http://qiita.com/kkdd/items/370ade612c12545a2c7a)」
swift:角丸ボタンを配置する

OSX Yosemite(10.10.5)
Xcode 7.2.1
Swift version 2.1.1
を使用しております。

角丸の画像イメージボタンを使おうと思います。
まずは通常の画像イメージのボタン。

```text:普通の画像ボタン例
let button = UIButton(frame: CGRectMake(10, 100,280,280)) //表示位置、サイズ
let buttonImage:UIImage = UIImage(named: "bt.png")!    //画像ファイル名
button.setImage(buttonImage, forState: UIControlState.Normal)
button.addTarget(self, action: "btn_click:", forControlEvents:.TouchUpInside) //押された際によばれる
self.view.addSubview(button)　//登録
```

<img width="157" alt="スクリーンショット 2016-07-31 16.38.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/120102/ba7bf87b-4615-06dc-fe46-67e5b70fcf94.png">


サイズにあったボタンが表示されます。
下記を追加すると角丸ボタンが表示されます。

```
button.layer.cornerRadius = 40    //角のR設定
button.layer.masksToBounds = true
```

<img width="155" alt="スクリーンショット 2016-07-31 16.40.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/120102/b23de875-9230-6973-cdc7-6e4f8dbd2a94.png">


cornerRadiusの値をいじることにより
<img width="155" alt="スクリーンショット 2016-07-31 16.43.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/120102/040af8cd-94f3-5ff0-0f75-bdd527fa85dd.png">

このような丸いボタンも作ることが可能です。
元画像を加工して角丸ボタンを作るのもありですが
ボタンの設定により変化を付けることもできるので覚えておくとよいかと思います。
Java UTF-8への文字コード変換問題まとめ(全角 波ダッシュ)

UTFで日本語を扱う上で避けて通れない、JavaにおけるSJIS⇔UTF文字コード変換時のまとめ。

##SJIS->UTFへの文字コード変換で字体が変わる
Javaのコンバーターでは、MS932とCP943Cで変換結果が異なります。

###Encode by MS932/Windows-31J(Windows 日本語)
![MS932.png](https://qiita-image-store.s3.amazonaws.com/0/135384/3fcb5d0b-86ce-ac37-6580-73b5b62267dc.png)

###Encode by CP943C(IBM 拡張SJIS)
![Cp943C.png](https://qiita-image-store.s3.amazonaws.com/0/135384/c7846110-1645-e82d-8524-623d3907137d.png)

上表の通り変換結果が異なる。

Unicodeの変換仕様に従うと、見た目が異なるCP943Cの変換結果が正しい
だがWindowsでの見た目的には、MS932が正しい。

##対処法

一般的なシステムでJavaで文字コード変換を行う場合は、MS932を利用するのがベターな対象方法。
JDBCドライバーでSJISのDBを検索する時も注意が必要。
特にDB2では、CP943Cベースの変換が行われるので、MS932ベースの変換結果を得たい時は何らかの対処が必要になる。これは別記事でまとめる。
gulp+webpackの環境でAngular2のHelloWorld

Angular2を使いたくて、とりあえず公式の[5 Min Quickstart](https://angular.io/docs/ts/latest/quickstart.html)を見たら、SystemJSを使っていました。
SystemJSはよく知らないんですが、普段はwebpackを使っているのでそちらで動かしたい。
どうせならgulpで一発コンパイルしたいということで、gulp+webpack環境でAnuglar2を動かすやり方について書いていきたいと思います。
ちなみに、Angular2のバージョンはrc4です。
正式リリースまだかなー。

#必要なもの
- npm
- webpack
    - ts-loader
- gulp
    - gulp-webpack

#Angular2のインストール
以下のコマンドを実行し、npmでAngular2をインストールします。
今回使うのは@angular/platform-browser-dynamicと@angular/coreですが、一応Angular2関連のものはすべてインストールしておきます。

```
npm i -S @angular/common @angular/compiler @angular/core @angular/forms @angular/http @angular/platform-browser @angular/platform-browser-dynamic @angular/router @angular/router-deprecated @angular/upgrade rxjs@5.0.0-beta.6 zone.js@0.6.12 core-js
```

#ファイルの作成
Angular2を読み込んで実行するためのHTMLファイル(index.html)とエントリーポイントとなるtsファイル(myapp.ts)を作成する。

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  <title>Hello Angular 2!</title>
</head>
<body>
　<!-- ここにMyAppComponentを挿入する -->
  <my-app>Loading…</my-app>
</body>
<!-- webpackで結合後のjsファイルの読み込み-->
<script src="./bundle.js"></script>
</html>
```

```ts:myapp.ts
import "core-js";
import "rxjs/Rx";
import "zone.js/dist/zone";

import {bootstrap} from "@angular/platform-browser-dynamic";
import {Component} from "@angular/core";
// myAppコンポーネント定義
@Component({
  selector: "my-app",
  template: `
    <h1>Hello World!</h1>
  `
})
class MyAppComponent {
}
//index.htmlで使うための準備
bootstrap(MyAppComponent);

```

#webpackの設定
webpack.config.jsを以下のように設定します。

```js:webpack.config.js
module.exports = {
    // エントリーポイント
    entry:'./app.ts',
    // 出力するファイル名
    output: {
        filename: './bundle.js'
    },
    // 依存関係
    resolve: {
        root:['./node_modules'],
        extensions:['', '.webpack.js', 'web.js', '.js', '.ts']
    },
    // TypeScriptを読み込むためのloader
    module: {
        loaders: [
            { test: /\.ts$/, loader: 'ts-loader' }
        ]
    }
}
```

#gulpの設定
gulp.jsを以下のように記述します。
基本的な設定はwebpackの方でやっているので、こっちの設定はあまり中身があるものではなく、ほぼ呼び出しだけです。

```js:gulp.js
var gulp = require('gulp');

var webpack = require('gulp-webpack');
var webpackConfig = require('./webpack.config.js');

// TypeScriptのコンパイルとwebpackの実行
gulp.task('ts', function () {
    // TypeScriptのコンパイル
    var tsResult = gulp.src(['./*.ts'])
        .pipe(webpack(webpackConfig))
        .pipe(gulp.dest('./'));
});

// コマンドで「> gulp」と入力したときのタスク
gulp.task('default', ['ts']);
```

#コンパイル
ここまでできたら、gulpコマンドを実行することでbandle.jsが生成されます。
Angular2の依存関係も解決しているので、index.htmlでは`<script src="./bundle.js"></script>`だけで作成したComponentを使うことができます。
cronでシェルスクリプトが動作しない時に確認すべきこと

環境はCentOS 6.7
スクリプトは /root/task.sh

##確認すべきこと

- cron は動作しているか
- 実行権限は付与しているか
- エラーログは確認したか
- 実行パスは指定しているか
- それでもだめなら...

## cron は動作しているか

```
# /etc/rc.d/init.d/crond status
crond (pid  xxxx) を実行中...
```

crondの起動方法
`# /etc/rc.d/init.d/crond start`

##実行権限は付与されているか

```
ls -al
-rwx------ 1 root root 10  7月 31 7:06 2016 task.sh
```

実行権限の付与
`chmod +x task.sh`

## エラーログは確認したか

```
# cat /var/log/cron
Jul 31 07:06:01 localhost CROND[xxxx]: (root) CMD (/root/task.sh)
```

## コマンドは絶対パスで指定しているか

```
cat /root/task.sh
/bin/echo helloworld
```

## それでもだめなら...

結果をメールで送信する

`crontab -e`

```
MAILTO="hogehoge@gmail.com"
* * * * * /root/task.sh
```

##参考リンク
[コンソールで叩くと動くスクリプトがCronで動かない時 – ひげろぐ](http://higelog.brassworks.jp/1775)
[cron が実行されない - ナクナイ](http://tamulapin.hatenablog.com/entry/2015/01/16/181207)
[crontabがどうしても動かないときに確認すべき3つの点+α - ドキッ！はてなブログに移転しました！](http://d.hatena.ne.jp/natsumesouxx/20100313/1268479064)
eclipseにtomcatのプラグインを適用できない場合の対処


自分はクライアントサイドのプログラマなのだが、
サーバーサイドのエンジニアが実質2名しかいないため
急遽サーバー(java)の手伝いをするかもしれないことに。

とはいえ、自分もサーバーサイドでの業務経験がなく、
javaを触るブランクも4,5年ほどあるため
仕方なく自宅で勉強をすることになった
(実は結構楽しんでいる)

さてとりあえず自宅PCを会社の環境と同じにしようということで...

+ eclipse
+ tomcat
+ seasar2
+ doma
+ mysql

などを導入しようと思った矢先に
eclipseのプラグインに出鼻をくじかれてしまった。

なんだか昔と比べてディレクトリ構造が
変わっているような気がするが、
tomcatのプラグインをplugins直下に配置して
restartしてもプラグインが適用されないではないか...

とはいえ色々やっているうちにtomcatプラグインを
適用することができたのでメモ


## 環境

+ mac
+ eclipse neon(4.6)
+ tomcat 8.0.36


## 失敗した手順

### 1. eclipseをinstall

以下のページからダウンロード
https://eclipse.org/downloads/eclipse-packages/

![スクリーンショット 2016-07-31 14.48.04.png](https://qiita-image-store.s3.amazonaws.com/0/132627/1d9a70bd-b691-f2c6-238c-f8a55ff5d614.png "スクリーンショット 2016-07-31 14.48.04.png")


```
# ダウンロードしたファイルを解凍
$ tar xvf eclipse-jee-neon-R-macosx-cocoa-x86_64.tar.gz
# アプリケーションに移動
$ sudo mv Eclipse.app /Applications
```


### 2. tomcatをinstall

以下のページからver8.0.36をダウンロード
http://tomcat.apache.org/download-80.cgi#8.0.36

![スクリーンショット 2016-07-31 15.09.39.png](https://qiita-image-store.s3.amazonaws.com/0/132627/d04452ad-272f-b8df-dcb6-a81f75fd2ed2.png "スクリーンショット 2016-07-31 15.09.39.png")


```
# ダウンロードしたファイルを解凍
$ tar xvf apache-tomcat-8.0.36.tar.gz
# アプリケーションに移動
$ sudo mv apache-tomcat-8.0.36 /Applications
```

### 3. tomcatプラグインをeclipseに適用

以下のページからtomcatPluginV331.zipをダウンロード
http://www.eclipsetotale.com/tomcatPlugin.html

![スクリーンショット 2016-07-31 15.34.39.png](https://qiita-image-store.s3.amazonaws.com/0/132627/35a2487a-a30e-da38-bc16-0e6569c4ac8b.png "スクリーンショット 2016-07-31 15.34.39.png")

```
# ダウンロードしたファイルを解凍
$ unzip tomcatPluginV331.zip
# pluginsフォルダに配置
$ sudo mv com.sysdeo.eclipse.tomcat_3.3.1.jar /Applications/Eclipse.app/Contents/Eclipse/plugins
```
--

本来なら以上の作業を行ってeclipseを再起動すれば
起動時にプラグインを読み込んで
環境設定menu内にtomcatが追加されて
不気味な猫ちゃんマークがツールバーに追加されるはずなのだが...

一向にプラグインが表示される様子はない

一応Eclipseのdetailsからtomcatのプラグインを検索してみたが、
どこにもsysdeoの文字はなかった。

![スクリーンショット 2016-07-31 15.57.34.png](https://qiita-image-store.s3.amazonaws.com/0/132627/6e47d59a-0107-e721-1e24-618630824666.png "スクリーンショット 2016-07-31 15.57.34.png")

この時点ですでにぷんぷん丸になっていたが、
それでは先に進めないので
不本意だが別の方法を探すことに

ということで以下がtomcatプラグインを導入した
別の方法である

## 適用成功した手順

### 1. eclipseをinstall

失敗した手順と同じ

### 2. tomcatをinstall

失敗した手順と同じ

### 3. tomcatプラグインをeclipseに適用

ここから失敗した手順と少しというかだいぶ違う

まずはEclipseMarketplaceへ行く
Help -> Eclipse Marketplace...

少し待って出てきたwindowの検索窓にtomcatと入力

するとこんな感じのブッサイクな猫のアイコンが
出てくるのでinstallする

![スクリーンショット 2016-07-31 16.05.15.png](https://qiita-image-store.s3.amazonaws.com/0/132627/ec70dea3-e63e-3eac-369f-32d33b010b40.png "スクリーンショット 2016-07-31 16.05.15.png")

eclipseを再起動するか聞かれるので再起動

### 4. tomcatプラグインの設定

これでプラグインが適用されて、
ツールバーに猫のボタンが３つほど追加されているはずなので
環境設定からtomcatの設定をする

とりあえずいじる箇所は二つ

1. tomcat versionをv8.xにする
2. Applicationsに配置したtomcatを参照する

![スクリーンショット 2016-07-31 16.32.47.png](https://qiita-image-store.s3.amazonaws.com/0/132627/c099f48d-52f3-e867-0863-34bbadd88581.png "スクリーンショット 2016-07-31 16.32.47.png")


以上で設定終了
node-amqpとamqplibの書き方の違い

# nodeでnode-amqpとamqplibを使った場合のそれぞれの書き方の違い
RabbitMQをローカルホストにはインストール起動済み
npm install amqp
npm install amqplibも終わっているものとしています。
##３秒ごとにbrokerに現在時刻を送信する
### node-amqp
接続用のオプションはオプションオブジェクトで指定します
送信にはpublish関数を使います

```js:pub1.js
require('date-utils');
var amqp=require('amqp');
var connection = amqp.createConnection({
    host: 'localhost',
    login: 'genpub',
    password: 'rabbitmq'
});
var updater = setInterval(function() {
    var cur= new Date();
    var ts=cur.toFormat("HH24:MI:SS");
    console.log(ts);
    connection.publish('work1',ts,{deliveryMode: 2});
}, 3000);
```
### amqplib

接続用オプションはURLに埋め込みます
channel生成を明示的に行って、チャンネルオブジェクトのsendToQueue関数を使います

```js:pub2.js
require('date-utils');
var amqp = require('amqplib/callback_api');
var ch; 
amqp.connect('amqp://genpub:rabbitmq@localhost', function(err, conn) {
  conn.createChannel(function(err, channel) {
    ch=channel;
    console.log("connected");
  }); 
});
var updater = setInterval(function() {
    var q = 'work1';
    var cur= new Date();
    var ts=cur.toFormat("HH24:MI:SS");
    ch.assertQueue(q, {durable: true});
    ch.sendToQueue(q, new Buffer(ts), {persistent: true});
    console.log(ts);
}, 3000);
```
## ワークキューからメッセージを受信する
ワークキューは、複数の受信者がメッセージを待ち受けている時、誰か一人の受信者だけがメッセージを受け取れます
### node-amqp
単純にメッセージを受け取ったらそれを表示して再度待ち受け状態に戻ります。

```js:sub1.js
var amqp = require('amqp');
var connection = amqp.createConnection({
  host: 'localhost',
  login: 'gensub',
  password: 'rabbitmq'
});
connection.on('ready', function() {
  connection.queue('work1', {autoDelete: false, durable: true},
    function(q) {
      q.subscribe(function(message){
        var msg=message.data.toString('utf8');
        console.log(msg);
      }); 
  }); 
});
```
### amqplib
メッセージを受け取ったら、何か重い仕事をする想定として１０秒間スリープします。１０秒後に仕事が終わったものとして、再びメッセージ待ち受け状態に戻ります。

```js:sub2.js
var amqp = require('amqplib/callback_api');
amqp.connect('amqp://gensub:rabbitmq@localhost:5672', function(err, conn) {
  conn.createChannel(function(err, ch) {
    var q = 'work1';
    ch.assertQueue(q, {durable: true});
    ch.prefetch(1);//1メッセージ受け取ったら受信の一時停止を通知 
    ch.consume(q, function(msg) {
      var secs = 10; 
      console.log("Received %s", msg.content.toString());
      setTimeout(function() {
        console.log("Done");
        ch.ack(msg);//再び受信を再開
      }, secs * 1000);
    }, {noAck: false});
  }); 
});
```
##実証実験
第１画面でpub1.jsを起動して３秒ごとに現在時刻をpublishする
第２画面でsub1.jsを起動すると、時刻メッセージをそのまま受信する
第３画面で16:00:20にsub2.jsを起動すると、sub2.jsに16:00:21のメッセージが渡されて、sub1.jsには渡らない。sub2.jsは10秒間メッセージを受け取れないため、その間はsub1が受信する。sub2は10秒後にDoneというメッセージを出して、再びメッセージ受信可能状態に戻る。

![alt](http://www.olt.tokyo/img/wq.png)
ビットクリア演算子(&^)

Go にはビットクリア演算子(&^)というのがある。

|x|y|x &^ y|
|:---:|:---:|:---:|
|0|0|0|
|0|1|0|
|1|0|1|
|1|1|0|

結果に対し x と y が対称ではないしなんだこれ？と思ったけど、大した話ではなく x の 0 にしたいビットを y で指定してるだけですね。例えば x の下位 2 ビットをクリアするのであれば y の下位 2 ビットを 1 にする。

|式|値|
|:---:|:---:|
|x|0101|
|y|0011|
|x &^ y|0100|

ってことですね。
Data Scientist Workbenchのすすめ（１）　

### Data Scientist Workbench とは

* 無料で使えるweb上のデータサイエンス用ツール
* 大きなデータの置き場所につかえる(100G まで、但し１ファイル 300メガまで）らしい
* R,python,spark などが使える。メモリもこってりあるみたい。

### 登録

[ここから登録](https://my.datascientistworkbench.com/register)
gmail,facebook,twitter のアカウントをもっていれば、簡単にできます。
登録の手続きは、そこそこ時間がかかります。（２０分くらい）

解説は、日本語だったら、[これ](http://www.slideshare.net/sohkaijima1/data-scientist-workbench)

### jupyter　や、Rstudio を使ってみる。

３００メガまでですが、データをアップできるので、そこそこの分析ができる感じですね。
Swift 2.0 入門① (Xcode編)

# 概要

2016年9月にSwiftの3系が出るそうなので、それまでに2系を復習したいと思い再入門。
SwiftやXcodeを使った事がない人でも要点を理解してもらえる様に重要なキーワードを中心にまとめます。

# アプリの種類
iPhone -> iPhone アプリ
iPad -> iPad アプリ
両方 -> ユニバーサル アプリ

# アプリ開発の流れ

## ① 企画 

* どんなアプリを作るのか考える
* 作るアプリを利用すること課題を解決できる人がいるかを考える。
* 開発の優先順位を決めておく。
	* どの機能が一番いるか。
	* 色々追加したくなるが、何が一番大事かをしっかり決めておく。
	
## ② 制作

* デザインの検討・画面パーツの作成
* 目的の機能を実現するアプリの使い方・ビジュアルを検討する。
* 紙ベース->プロトベース

## ③ 開発

* プログラミング
* 実開発。
* デザインの反映・機能の実装

## ④ テスト

*  正常に動くかを試す
* 実機テスト
	* iPhone/iPad

## ⑤ リリース

* アプリをAppSotreへ公開
* Appleに提出 -> 審査
	
## ⑥ フィードバック

* 反響への対応・アップデート内容を考える
* 不具合の修正
* アプリは、リリースしてから洗練させていく事が重要。

# Xcodeの概要

## ① ツールバー・タブバー

* StandardEditor
* AssistantEditor
* VersionEditor

## ② ナビゲーターエリア

* Project Navigator
* Symbol Navigator
* Find Navigator
* Issue Navigator
* Test Navigator
* Debug Navigator
* Breakpoint Navigator
* Report Navigator

### Productsディレクトリ

「Products」ディレクトリには完成したアプリのファイルが保存される。

## ③ エディターエリア

ナビゲーターエリアで選択した項目によって表示される内容が変化する。

* コードの入力
* Storyboardの編集
* プロジェクトの各種設定項目

## ④ ユーティリティエリア

* 上段
	* File Inspector
		* ファイルに関する設定を行う項目を表示するボタン
* 下段
	* File Template Library
		* よく利用するファイルテンプレートのライブラリ
	* Code Snippet Library
		* よく利用するコードのSnippetが集められたライブラリ
	* Object Library
		* Storyboardで利用する部品が集められたライブラリ
	* Media Library
		* よく利用するメディアリソースが集められたライブラリ
		* 主に画像・音声ファイル

## ⑤ デバッグエリア

各種デバッグを行うことができる。

# シュミュレータ

## アプリのスクリーンキャプチャ

* Edit -> CopyScreenでアプリのスクリーンキャプチャを取得できる。
* シュミュレータのデバッグメニューでアプリの画像レイヤーで透過されたレイヤーの重なり具合などを確認する事ができる。

## アプリの動作スピード

アプリの動作スピードのゴールは、Appleの公式アプリのスピード。

# 実機テスト

## 実機テストのポイント

シュミュレータでテスト出来ない部分を中心に確認する。

* アプリが片手でも操作可能か。
* 滑らかに動作するか。
* 全機能が動作するか。
* 繰り返し操作しても快適に利用できるか。

## 実機でのテスト環境

Xcode7から通常のAppleIDで開発中のアプリを実機テスト可能になった。

1. XcodeでAccountを追加
2. プロジェクトファイルの[TARGETS]を選択して、[General]の[Identity]の項目の[Team]を設定
3. 初回の実機転送時には証明書と鍵情報を作成する
4. 実機のTeamが提供したアプリを信頼する。

# 終わり

最終的には、通信系・データ保存もできる簡単アプリを作成したいと思います。
次回はSwiftの文法的記述をまとめます。
Substance PainterでAmbient OcclusionやEmissive（放射性）を編集、出力する方法

Substance PainterのデフォルトのままではAmbient OcclusionやEmissiveを編集出来ません。多分。

チェックしたSubstance Painterのバージョン：2.2.0

## 編集項目に追加する方法

1. 「TextureSet Settings」欄のチャンネル[+]ボタンを押して「Ambient Occlusion」や「放射性」など編集したい項目を選択する
![SubstanceAO_01.png](https://qiita-image-store.s3.amazonaws.com/0/58518/a1fbd41f-3a34-2702-8ce4-e3bdf3bf5515.png)


2. すると各種項目に追加されるので、後は「color」等と同じように編集する。
![SubstanceAO_02.png](https://qiita-image-store.s3.amazonaws.com/0/58518/66aaafe2-ede7-1bbc-30d2-d6f42856cd17.png)
    - レイヤーにも追加される
    - ![SubstanceAO_03.png](https://qiita-image-store.s3.amazonaws.com/0/58518/a5d68616-a549-638a-9776-0a4b67f02e3c.png)


## テクスチャとして出力する方法

エクスポート設定でそれぞれテクスチャに割り当てると出力されるようになる。
![SubstanceAO_04.png](https://qiita-image-store.s3.amazonaws.com/0/58518/05eb6d45-c430-8d36-72a2-a8c0b4c98264.png)
マテリアルについているテクスチャを取得する

エディタ拡張でマテリアルのテクスチャを取得する方法。シェーダのプロパティ名が既知の場合はマテリアルからプロパティ名で取得すればいいが、不明な場合にマテリアルが参照されているすべてのテクスチャをとってくる。

## 正しいシェーダがついている場合

```csharp
var count = ShaderUtil.GetPropertyCount(mat.shader);
for (int i = 0; i < count; i++)
{
    var pt = ShaderUtil.GetPropertyType(mat.shader, i);
    if (pt == ShaderUtil.ShaderPropertyType.TexEnv)
    {
        var pn = ShaderUtil.GetPropertyName(mat.shader, i);
        var tex = mat.GetTexture(pn);
        if (tex)
        {
            Debug.Log(tex.name);
        }
    }
}
```

## シェーダがついていない、または別のシェーダがついている場合

いったん、SerializedObjectにしてすべてのプロパティからテクスチャっぽいものを探す。

```csharp
var so = new SerializedObject(mat);
SerializedProperty sp = so.GetIterator();
while (sp.NextVisible(true))
{
    if (sp.type.Contains("Texture"))
    {
        var tex = sp.objectReferenceValue as Texture;
        if (tex)
        {
            Debug.Log(tex.name);
        }
    }
}
```
Thymeleafを導入してみる

# Thymeleafって何？
ThymeleafはJavaのテンプレートエンジンです。
動的に表示する要素はhtmlの属性で記述するので、アプリケーションが動いていない状態でも画面のデザインなどを確認できるというメリットがあります。

JSPを使って開発をしているとデプロイしないと画面が確認できないのが煩わしいので使ってみたので、
備忘録がてら書き残していきます。

# Thymeleafのダウンロード
今回はMavenを利用して取得します。
pom.xmlに以下を追加します。

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

バージョンは3.0.0を利用します。
Springも利用するので、thymeleaf-springも導入しています。

#Thymeleafの設定

続いて、Springの設定ファイルに以下のbean定義を追加してThymeleafを利用できるようにします。
Spring自体の設定については割愛しています。

```xml:spring-mvc.xml
<bean id="templateResolver" class="org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver">
  <property name="prefix" value="/WEB-INF/views/" />
  <property name="suffix" value=".html" />
  <property name="templateMode" value="HTML5" />
  <property name="characterEncoding" value="UTF-8" />
</bean>

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

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

templateResolverのprefix、suffixは環境によって書き換える必要があります。
今回の環境は「/WEB-INF/views/」配下に「hogehoge.html」のような形でviewファイルを配置するので、上記のように設定しています。

詳しくは以下の公式ドキュメントを参照してください。
http://www.thymeleaf.org/doc/tutorials/2.1/thymeleafspring.html

#Thymeleafを動かしてみる
以下のようなControllerクラスとhtmlファイルを作成します。

```java:HelloController.java
@Controller
public class HelloController {
    @RequestMapping(value = "", method = {RequestMethod.GET, RequestMethod.POST})
    public String home(Model model) {
        model.addAttribute("hello", "Hello Thymeleaf!!");
        return "sample";
    }
}
```

```html:sample.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
  <head>
    <meta charset="UTF-8"/>
    <title>Thymeleaf</title>
  </head>
  <body>
    <span th:text="${hello}">この部分が動的に置き換えられます</span>
  </body>
</html>
```

上記のhtmlを直接開くと「この部分が動的に置き換えられます」という文字が表示されますが、APサーバを起動してアクセスすると、Thymeleafがその文字列をControllerから与えられた値に置き換えます。

そのため、APサーバを起動してアクセスし、「Hello Thymeleaf!!」という文字列が表示されていれば、Thymeleafが正しく動作していることになります。

以上でThymeleafの導入は完了です。
[PostgreSQL] pgAdminでデバッグする方法

[このサイト](http://pgsqldeepdive.blogspot.jp/2013/05/plpgsqldebugger.html)を参考にデバッグ環境を構築。PostgreSQLは既定ではデバッグが有効化されていないため、一度環境の設定変更が必要。Enterpriseうんちゃら書いてあるが、無料でダウンロードできるPostgreSQLのインストーラーでデバッグが可能。

## 環境構築手順
### postgresql.confのshared_preload_librariesの設定
- C:\Program Files\PostgreSQL\9.2\lib ディレクトリ配下にplugin_debugger.dllが存在することを確認
- C:\Program Files\PostgreSQL\9.2\dataディレクトリにあるpostgresql.confを開く
- shared_preload_librariesというパラメータを探し、先ほど確認したplugin_debuggerを指定
- コメントアウトは解除。拡張子の記載は不要。 

```
shared_preload_libraries = 'plugin_debugger'
```

- PostgreSQLサーバを再起動

### CREATE EXTENSIONでエクステンションのセットアップ
- pgAdminIIIのオブジェクトブラウザペインで、データベース内の「Extensions」を選択
- 右クリックメニューから「New Extension...」を選択
- 名前で、「pldbgapi」を選択

## 実行方法
- 関数を右クリックし、コンテキストメニューから「デバッグ→ブレークポイントの設定」を選択
- デバッガの画面が現れ、ブレークポイントへの到達を待機している状態となる
- 通常のクエリウィンドウに切り替えて、関数を実行

## 2016/08/01 追記
- pgAdminでデバッグしようとしたところ、ほぼ確実に処理が止まる&異常終了する。
- pgAdminでのデバッグ開発はまだ難しそうであるため、伝統的なprintfでデバッグする。
- 任意の箇所で以下のコードを記述。

```plpgsql
raise notice 'RoundABSFlg:% %', value1, value2;
```
- 「%」がパラメータ変数にあたる。左から順にvalue1、value2が代入される。
Rails 2.3 から 4.2 にアップグレードした所感

Rails 2.3.5 から Rails 4.2.7 へアップグレードした。
かなり試行錯誤して苦労した。
その所感を以下に記す。

[RailsGuides](http://guides.rubyonrails.org/upgrading_ruby_on_rails.html) には、「なるべく小刻みに少しずつアップグレードしていくのがよい」と書いてある。最初はそのつもりだったのだが、実際にやってみると、いろいろ大変で、結局次のようにした。

1. Rails 2.3.5 -> Rails 3.0.11
2. Rails 3.0.11 -> Rails 3.2.22
3. Rails 3.2.22 -> Rails 4.0.13
4. Rails 4.0.13 -> Rails 4.2.7

## アップグレード作業

### 1. Rails 2.3.5 -> Rails 3.0.11

- 基本的に、[このブログエントリ](http://d.hatena.ne.jp/deeeki/20110609/upgrade_rails2_to_rails3)のやり方に従った。とてもわかりやすかった。ありがとう。

- rails_upgrade というプラグインが Rails 2 -> 3 で注意すべき点などを指摘してくれてとても役に立った（Rails の公式サイトのお墨付きもあるらしい）。

- アップグレード全体で、この Rails 2.3 -> 3.0 が一番面倒だった。なにせ、ここで bundler が導入されるので。

### 2. Rails 3.0.11 -> Rails 3.2.22
- rake rails:update で設定ファイル更新。

- このプロジェクトは /public 以下が肥大化していたので、asset pipeline の導入は諦めた。ただ、これは設定ファイルで、簡単に disable にできる。disable してしまえば、画像・スタイルシート・JavaScript 周りは、Rails 2 時代とまったく同じに使える。

### 3. Rails 3.2.22 -> Rails 4.0.13
- rake rails:update で設定ファイル更新。

### 4. Rails 4.0.13 -> Rails 4.2.7
- rake rails:update で設定ファイル更新。

･･･と Rais をアップグレードしていった。Ruby も

- 1.8.7 (Rails 2.3)
- 1.9.3 (Rails 3.0)
- 1.9.3 (Rails 3.2)
- 2.0.0 (Rails 4.0)
- 2.3.1 (Rails 4.2)

と rvm でアップグレードしていった。

## 所感

アップグレードしてみて思ったのは次のようなこと。

### 1. アップグレードの刻み方
おそらく Rails 2.3 -> Rails 3.0, Rails 3.0 -> Rails 4.2 の２段階だけで十分。ディレクトリ構成は Rails 3.0 でいまの形になる。Rails 3.0 以降にはある、`rake rails:update` は、/config 以下の設定ファイルをそのバージョンの Rails で動くようにアップグレードしてくれる。いったん Rails 3.0 まであげたら、次は一気に Rails 4.2 まで上げて、`rake rails:update` で設定ファイルを新しくすればよいのではないか。

### 2. Ruby 1.9
Rails 3.x は基本、Ruby 1.9 で動くのだが、Ruby 1.9 は日本語の扱いに難があり、マジックコメントを付けないと日本語を含むファイルでエラーになる。だから、Rails 3 で動かそうとすると大変なことになる。だから、Rails 2 -> 4 とアップグレードするなら、Rails 3 での動作は確認しなくても良いのではないか。

### 3. gem 
本当に大変なのは Rails 本体より依存する gem (plugin) への対応。Rails 2 時代に使えていた gem / plugin が Rails 4 時代もあるとは限らない。仮に残っていても、APIが大幅に変わることもよくある。

### 4. テスト
アップグレードする前に網羅的なテストがあることが望ましい。けれども、テストが書かれていないのなら、アップグレード後にテストを書いてもいいのかもしれない。いずれにしろ、Rails 2 -> 4 とアップグレードしたら、Rails にしろ gem にしろ API が大幅に変わっていて、いろいろ手直ししないと動かないからだ。テストを書きながらデバッグして、Rails 4 に合わせていくというのでもよいかもしれない。

ただ、プロジェクトのサイズにもよるだろう。今回のプロジェクトは小さかったので、このやり方でも良かったが、もっと大きくて複雑なプロジェクトならやはり基本どおり、マイナーバージョン一つずつアップグレードしていくべきなのかもしれない。
MSC-MOD20 > Link > MSC-MOD10との違い (uALFAT ChipsetとALFAT SoCの主な違いについて)

MSC-MOD20を販売しているmicrotechnicaさんのページにMSC-MOD10(uALFAT)とMSC-MOD20(ALFAT SoC)の主な違いの資料があった。

http://www.microtechnica.tv/faq/faq.cgi?kate=ALFAT&faq=5
http://www.microtechnica.tv/support/manual/Migration_uALFAT_ALFAT.pdf

ファイルオープン時にディレクトリも記載する、というのは目立った違い。
コマンド終端が0x00から0x0Aに変更されているのも目立った違い。

他にも色々違うようだ。
MSC-MOD20 > MSC-MOD10との比較 > No Data Token / Half Data Token が異なる

SDカードモジュール MSC-MOD20(ALFAT Soc使用)の取説を読んでいて気になった事項。

### MSC-MOD20

[MSC-MOD20取説](http://www.microtechnica.tv/support/manual/msc-mod20_man.pdf)

p7

| ファイル内の実データ値 | MSC-MOD20から送られるデータ |
|:-:|:-:|
| 0x00 | 0xFFに続いて0x00を送信 |
| 0xFF | 0xFFに続いて0xFFを送信 |
| 0x01～0xFE | データのまま |

関連して、p6にNo Data Token(0x00)とHalf Data Token(0xFF)という定義がある。

### MSC-MOD10

MSC-MOD10(uALFATチップ使用)
http://www.microtechnica.tv/support/manual/uALFAT_I2C_new.pdf

> 0xFFは、No Data Token(NDT)です。
...
> 0xFEのことはHalf Data Token(HDT)と呼びます。 

### 異なる定義

NDT, HDTの定義が異なるので、互換性を持たせる場合にソフトウェアの改変が必要となる。
コマンドプロンプトの自分用メモ


コマンドプロンプトの備忘録です。

# ROBOCOPY
https://technet.microsoft.com/ja-jp/library/cc733145(v=ws.10).aspx

## ディレクトリ構造のみをコピー
ファイルはコピーしません。

```bat
ROBOCOPY [コピー元] [コピー先] /e /nocopy
```

* `/e` :  サブディレクトリをコピーします。 このオプションでは、空のディレクトリをコピーすることに注意してください。 
* `/nocopy` : ファイル情報をコピーしません。

## コピーするファイルをワイルドカードで指定
たとえば、HTMLファイルを再帰適にコピーします。

```bat
ROBOCOPY [コピー元] [コピー先] *.html /s
```

* `/s` :  サブディレクトリをコピーします。 このオプションでは、空のディレクトリをコピーしないことに注意してください。 


## ディレクトリの同期

```bat
ROBOCOPY [コピー元] [コピー先] /mir
```

* `/mir` :  ディレクトリ ツリーをミラー化します (/e および /purge と同等)。 



# PAUSE

## 別バッチファイルのPAUSEコマンドを無効にする場合

PAUSEコマンドが書かれた下記のbatファイルを、繰り返し実行した場合です。

```bat:subcommand.bat
@echo off
echo %1
pause
```

`subcommand.bat`の直前に`ECHO|`を付けると、PAUSEコマンドで止まらず次の処理に移ります。ただし「続行するには何かキーを押してください．．．」というメッセージは出ます。

```bat:main.bat
@echo off
for /L %%i in (0,1,9) do (
	ECHO|subcommand.bat %%i
)
```

#### `ECHO|`の意味
`ECHO`コマンドで改行が出力されます。その「改行」をパイプ`|`で、subcommand.batの標準入力に渡しています。


# FOR

https://msdn.microsoft.com/ja-jp/library/cc755694(v=ws.10).aspx

## 指定回数ループする方法

以下のようなJavaのループを、コマンドプロンプトで実現する場合、

```java
for (int i=0; i<10; i++) 
```

下記で実現できます。

```bat
@echo off
for /L %%i in (0,1,9) do (
	echo %%i
)
```

最初の`0`が開始値、中間の`1`が増分値、最後の`9`が終了値です。

公式サイトを引用

>反復変数を使い、開始値 Start# を設定し、その反復変数がセットの終了値 End# を超えるまで、設定された範囲の値を順に処理します。/L を指定すると、Start# と End# を比較することによって反復が実行されます。Start# が End# より小さければ、コマンドが実行されます。反復変数が End# を超えると、コマンド シェルはループから抜け出します。Step# に負の値を使用して、範囲内の値を大きい方から順に処理することもできます。たとえば、(1,1,5) は 1 2 3 4 5 というシーケンスを生成しますが、(5,-1,1) は 5 4 3 2 1 というシーケンスを生成します。構文は次のとおりです。 

```bat
for/L {%% | %}Variable in (Start#,Step#,End#) do Command [CommandLineOptions]
```

# その他

## Linuxのsedコマンドに変わるもの

下記サイトを参考にしました。
http://knowledge.reontosanta.com/archives/816 

```bat
rem テキストファイルの文字を置換した内容を出力する。ファイルは上書きしない。
rem -- 引数1個目 : 置換対象のファイル
rem -- 引数2個目 : 置換前の文字列
rem -- 引数3個目 : 置換後の文字列

rem 入力ファイル
set infilenm=%1
rem 置換前文字列
set beforestr=%2
rem 置換後文字列
set afterstr=%3

rem ファイル編集
setlocal enabledelayedexpansion
for /f "delims=" %%A in (%infilenm%) do (
    set line=%%A
    echo !line:%beforestr%=%afterstr%!
)
endlocal
```

PowerShellが使えるならば、PowerShellを使った方がよさそうです。

https://orebibou.com/2015/01/powershell%E3%81%A7sed%E7%9B%B8%E5%BD%93%E3%81%AE%E5%87%A6%E7%90%86%E3%82%92%E8%A1%8C%E3%81%86/

## batファイルの引数チェック

```bat
if "%1"=="" goto usage
rem ～通常の処理～
:usage
echo ～使い方～
```

`if %1==""`だと構文エラーになるので、`"%1"`としています。

http://www.atmarkit.co.jp/ait/articles/1506/26/news026_2.html


## コメント

REMコマンドだけででなく、コロン2個でもコメント行になります。
```bat
::コメント行
```

http://tounderlinedk.blogspot.jp/2011/01/iffor-windows.html
BigQuery で Window Function を使って Cumulative Sum (累積和) を求める練習

長年 Window Function のない RDBMS を使っていたので触れる機会がなかったんですが、[10年戦えるデータ分析入門](https://www.amazon.co.jp/dp/B010CQD4Y0)という書籍で色々と説明してあったのでとりあえず練習。

この本では PostgreSQL を題材にしていましたが、BigQuery でも Window Function が使えることがわかったので、それでやってみました。

# 題材

BigQuery の Public Datasets の中には [Hacker News](https://news.ycombinator.com/) の投稿データを持った `bigquery-public-data:hacker_news.stories` というデータから、2015 年 1 月の日別投稿数とその累積和を出してみます。

# クエリ

とりあえずこんな感じに書いてみた。

```sql
SELECT
  posted_date,
  COUNT(posted_date) AS posts,
  SUM(posts) OVER (ORDER BY posted_date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumulative_posts
FROM (
  SELECT
    STRFTIME_UTC_USEC(time_ts, '%Y-%m-%d') AS posted_date
  FROM
    [bigquery-public-data:hacker_news.stories]
  WHERE
    time_ts BETWEEN TIMESTAMP('2015-01-01 00:00:00')
    AND TIMESTAMP('2015-02-01 00:00:00'))
GROUP BY
  posted_date
```

* GROUP BY に直接 `STRFTIME_UTC_USEC()` 関数を使うことができなかったのでサブクエリを使った。
* `SUM(posts)` の `posts` は直前の `COUNT(posted_date)` のエイリアスだが、Window Function の実行は `SELECT` よりも後なので問題なし (ということなのかな?)

# 結果

| posted_date | posts | cumulative_posts |
|-------------|-------|------------------|
| 1/1/2015    | 455   | 455              |
| 1/2/2015    | 694   | 1149             |
| 1/3/2015    | 566   | 1715             |
| 1/4/2015    | 545   | 2260             |
| 1/5/2015    | 1060  | 3320             |
| 1/6/2015    | 1094  | 4414             |
| 1/7/2015    | 1030  | 5444             |
| 1/8/2015    | 1009  | 6453             |
| 1/9/2015    | 922   | 7375             |
| 1/10/2015   | 542   | 7917             |
| 1/11/2015   | 496   | 8413             |
| 1/12/2015   | 968   | 9381             |
| 1/13/2015   | 1139  | 10520            |
| 1/14/2015   | 1177  | 11697            |
| 1/15/2015   | 1096  | 12793            |
| 1/16/2015   | 963   | 13756            |
| 1/17/2015   | 567   | 14323            |
| 1/18/2015   | 543   | 14866            |
| 1/19/2015   | 894   | 15760            |
| 1/20/2015   | 1130  | 16890            |
| 1/21/2015   | 1112  | 18002            |
| 1/22/2015   | 1041  | 19043            |
| 1/23/2015   | 980   | 20023            |
| 1/24/2015   | 508   | 20531            |
| 1/25/2015   | 539   | 21070            |
| 1/26/2015   | 1084  | 22154            |
| 1/27/2015   | 1146  | 23300            |
| 1/28/2015   | 1145  | 24445            |
| 1/29/2015   | 1170  | 25615            |
| 1/30/2015   | 950   | 26565            |
| 1/31/2015   | 555   | 27120            |

# Re:dash でグラフ化

![image](https://qiita-image-store.s3.amazonaws.com/0/208/7750a1b1-18f3-679b-0237-381368ba71cd.png)
Ruby技術者認定試験Silver version 2.1 初心者プログラマーが挑む！


僕は、普段仕事でRailsで作られた製品のSE的なことをしているがプログラムは全く書けないし、読めない。
それでも何とか心優しいメンバーに支えられながら日々仕事をしてきたのだが、よくよく考えてみると「自分は何もできない」だとやっと気付いた。

少し前から薄々感じてはいたが、ただただ毎日を過ごす生活の中で行動できずにいたのだが、やっぱりプログラムが読める／書けるようになりたい！！

で、先輩に相談したところ、先ずは`Ruby技術者認定試験Silver`を取ってみろってことなので、勉強した内容をまとめていこーと思う。
　
# 同じ意味を持つメソッド
- map = collect
- select = find_all
- find = detect
- delete_if = reject!
- inject = reduce

# include/require

ちょっとよくわからない。
とりあえず、これだけ覚えた

- Mathモジュールの定数`PI`を使いたい時は`include`するか`Math::PI`って書く

- `require`時はダブルコーテーションで囲む

```
require "csv"
```

# 破壊/非破壊的メソッド

##破壊
基本的には、`!`末尾についたメソッドは破壊的となる
- concat
- shift
- unshift
- push

##非破壊
- chop
- chomp
- compact
- uniq
- upcase

（例）以下の場合`chop`と`chomp`は非破壊的メソッドなので、何もしないことになる

```
x = "Hello, World.¥n"
x.chop
x.chomp
p x
=> "Hello, World.¥n"
```

# 例外
基本的には、こんな感じ

```
begin
  処理
rescue
  例外が発生したら実行される（複数書くことが可能）
else
  例外が発生しなかったら実行される
ensure
  必ず実行される
end
```

```
begin
  puts 10 / 0
rescue ZeroDivisionError => ex
  puts ex.message
ensure
  puts "エラー発生"
end
```

# 文法
## 変数について
- ローカル変数：アルファベット小文字で始まり、「1」文字以上
- グルーバル変数：`$`で始まる
- インスタンス変数：`@`で始まる
- クラス変数：`@@`で始まる
- 定数：アルファベット大文字で始まる

## 偽の値
- nil
- false

※`""`や`0`は真になる

## 三項演算子
```
# 「条件 ? 条件が真の場合の値：条件が偽の場合の場合」
x = 5
y = x < 5 ? "A" : "B"
puts y
=> B
```

# 文字列
## 変換
```
# 整数と見なされない文字があれば、一つ前の文字まで変換する
p "12345abcde".to_i
=>12345
```

## 削除
```
puts "012356789".delete("12-56-")
=> 0789
puts "012356789".delete("^12-56-")
=> 12356

puts "abcdefg.¥r¥n".chomp
=> abcdefg.
puts "abcdefg.¥r¥n".chop
=> abcdefg.
puts "abcdefg.".chop
=> abcdefg
```

# 配列
## 取り出してみる
```
a = [1,2,3,4]

# 全部同じ結果になる
p a[1...3]
=> [2, 3]

p a.slice(1,2)
=> [2, 3]

p a[2..-2]
=> [2, 3]

p a[1,2] 
=> [2, 3]
```

## 演算子

```
a = [1,2,3]
b = [1,3,5]
p a & b
=> [1, 3]
p a | b
=> [1, 2, 3, 5]
p a + b
=> [1, 2, 3, 1, 3, 5]
p a - b
=> [2]
```

# ハッシュ
## 生成方法
```
{a: 1, b: 2, c: 3} # OK
Hash[:a, 1, :b, 2, :c, 3] # OK
Hash.new(:a) # OK

{a = 1, b = 2, c = 3} # NG
{:a 1, :b 2, :c 3} # NG
```


## 削除
```
h = {a: 1, b: 2, c: 3}
p h.clear
=> {}

h = {a: 1, b: 2, c: 3}
h.delete(:a)
p h
=> {:b=>2, :c=>3}

h = {1 => "papa", 2 => "mama", 3 => "jiji", 4 => "baba"}
p h.reject {|x,y| x < 2}
=> {2=>"mama", 3=>"jiji", 4=>"baba"}
```

## 存在するか
```
h = {a: 1, b: 2, c: 3}
h.has_key?(:a)
=> true
h.include?(:a)
=> true
h.member?(:a)
=> true
```

# 正規表現
```
p "HogeHOGEhoge"[/[A-Z][^A-Z]+/]
=>"Hoge"

p "tanaka saitou 543 harada 112 noguchi".scan(/¥d+/).length
=> 2
p "tanaka saitou 543 harada 112 noguchi".scan(/¥w+/).length
=> 6
```

# まとめ　- 2016/8/5追記 -
昨日受験してきましたが、無事に合格しましたー!!
なので、簡単ではありますが今回受験して思ったこと＝合格必勝法をまとめます!!

- 各メソッドの戻り値を覚えておく
- 破壊的か非破壊的か覚えておく
- `Ruby技術者認定試験合格教本 Silver/Gold対応　Ruby公式資格教科書`の予想問題集をやり込む
- ↑↑の予想問題集に出てくる問題を全てirbで実際に動かす **これ一番大事!!**

最後の行に書いたことが何より大事です。
今回僕の反省点は問題集をやり過ぎて何となくで記憶してしまったこと。
実際の試験は問題集の逆が出たりすることが、めちゃくちゃ多かったのが感想です。

皆さんの参考になれば嬉しいです。