OmniAICreator/Qiita-1.07M huggingface dataset:
[processing] noise()とrandom()の毎フレーム値

![スクリーンショット 2016-08-23 23.10.12.png](https://qiita-image-store.s3.amazonaws.com/0/12153/5c9d8e6e-7ab6-af8c-0b4e-599a761bb3ed.png)
[Coding Challenge #11: 3D Terrain Generation with Perlin Noise in Processing](https://www.youtube.com/watch?v=IKB1hWWedMk)

こちらを写経していたのですが21分あたりからの  

```java:main.pde
void draw(){
  flying -= 0.1;

  float yoff = flying;
  for(int y = 0; y < rows; y++){
    float xoff = 0;
    for(int x = 0; x < cols; x++){
      terrain[x][y] = map(noise(xoff, yoff), 0, 1, -100, 100);
      xoff += 0.2;
    }
    yoff += 0.2;
  }
...

```

で毎フレームnoise動かしているのにy軸にズレていく理由がわからず。チェックしてみました。  

![dev.gif](https://cloud.githubusercontent.com/assets/644580/17894953/500620ca-6986-11e6-80b5-26606bdb5e79.gif)  


結論としてはnoise()はアプリ実行時に対応する固定値が決定。  
random()は毎フレーム変更。みたいです。


```java:main.pde
void draw(){
...
  fill(255, 255);
  textSize(25);
  textAlign(CENTER);
  text("noise(10, 100) => " + noise(10, 100), 300, 60);
  text("random(10, 100) => ", 230, 90);
  text(random(10, 100), 420, 90);
...
```

ならば先ほどの

```java:main.pde
      terrain[x][y] = map(noise(xoff, yoff), 0, 1, -100, 100);
```

でもnoiseは固定値吐き出すので問題無いですね。

コードのスナップは[こちら](https://github.com/uriuriuriu/TerrainGenerationWithPerlinNoise/tree/95cdf47b4ad70345927b255f7c4de0dfb8c974ae)。
grepの組み合わせメモ

grepを使ったコマンドを忘れるので覚書。

■～以外のファイルを削除したい場合のコマンド

```ruby:Shell_script.コマンド
 ls | grep -v -E '削除したくないファイル名$' | xargs rm -r
```

■特定のファイルから特定の文字列を検索したい場合のコマンド

```ruby:Shell_script.コマンド
find . -name "*.php" | xargs grep 検索文字
```

■特定の文字列をカウントしたい場合のコマンド

```ruby:Shell_script.コマンド
grep -c "検索文字列"

#出力
11
```
Vagrant と VirtualBoxで開発環境を作る

#VagrantとVirtualBoxをインストール
MAMP便利なので開発をしていたら、他のプロジェクトとデータ集積のため、
ローカル開発環境を作ることになったので、忘れないように記載していきます。
#Virtural BoxとVagrantのインストール
1.Virtual Boxのインストール元
              [VirtualBox](https://www.virtualbox.org/)

2.Vagrantのインストール元
              [Vagrant](https://www.vagrantup.com/)

#1.VirtualBoxのインストール
##1-a.[VitualBox](https://www.virtualbox.org/)にいき、VirtualBoxをダウンロード
![vb0.png](https://qiita-image-store.s3.amazonaws.com/0/133961/8e8f2864-ef49-d921-98de-54e6eabd72a1.png)


###1-b.[DOWN LOAD画面](https://www.virtualbox.org/wiki/Downloads)
![vb1.png](https://qiita-image-store.s3.amazonaws.com/0/133961/f0fc6b3a-f90a-84c5-7b7d-44b47ed271ea.png)

###1-c.インストーラーを起動してそのままインストール
基本てきなアプリと一緒なのでかきません。

###1-d.ダウンロードの確認
ターミナルを開いて以下を確認できればとりあえず。

```terminal
VirtualBox --help
```
ヘルプの内容が確認できればとりあえず完了かと。
--versionを使わないのは、アプリが起動して終了とかおすの面倒くさいのでやりません。

#2.Vagrantのインストール
##2-a.[Vagrant](https://www.vagrantup.com/)にいき、ダウンロード
![スクリーンショット 2016-08-01 1.10.25.png](https://qiita-image-store.s3.amazonaws.com/0/133961/253d0252-62c4-c255-2c62-da42c28363d8.png)

##2-b.[DOWN LOAD画面]（https://www.vagrantup.com/downloads.html）
![Vagrant_Download.png](https://qiita-image-store.s3.amazonaws.com/0/133961/88513348-ea8a-09e2-072c-ddf2705c0c45.png)

##2-c.おそらく、聞かれるダウンロードしますか？？
![do-u-do-it.png](https://qiita-image-store.s3.amazonaws.com/0/133961/cc8b486e-cd02-33d9-c6bf-9edeb99c4d76.png)

###2-d.インストーラー関連に関しては特にかきません。
基本的なアプリケーションと一緒なので、特に不自由なく行けるかと思います。

##2-e.インストールの確認
terminalを開いて　vagrant -v　でversionの確認ができればとりま、大丈夫！！

```terminal
vagrant&nbsp;-v
Vagrant 1.8.1
```

続きはそこそこのペースで書きます。
仕事が終わっていれば。
Awake,Start,Updateって何やねん(Unity初心者メモ)

## Awake
自身の変数の初期化に使う。すべてのオブジェクトのインスタンス生成後に呼び出されるので、GameObject.findWithTagで対象の参照を取得できる。

ただし、オブジェクト毎のAwakeの実行順序は決まってないので、情報の取得は行うべきではない。まだ情報が確定していないため。

## Start
情報の取得は全Awakeが終わった後に呼び出されるStartを使うべき。またAwakeはスクリプトがアクティブじゃなくても呼び出される。

## Update
Updateは毎フレームで繰り返し呼ばれる処理を書く。StartはUpdateの初回に一度だけ呼ばれる。
Raspberry Pi 3 QRコードリーダー


# インストール

- sudo apt-get install python-zbar

- sudo pip install pillow

- sudo apt-get install libopencv-dev

- sudo apt-get install python-opencv

- sudo pip install imutils

# 準備するもの

- Raspberry Pi 3 Model B (Raspbian JESSIE)

- Raspberry Pi HD Video Camera Module
（カメラモジュールのレンズを回して前方に移動し接写を可能とする）

# 仕様

- Python ZBarライブラリを使用してQRコードを読み取る

- Python OpenCVライブラリを使用してノイズ除去のガウスぼかしをしてからラプラシアンフィルターでimageセンサのフォーカスレベルを検出する。
- QRコードを読み取り可能なスレッショルドを設定する。（本ソースでは100を設定しているが環境によって決定する）


# ソースコード

```
import io
import datetime
import time
import picamera
from PIL import Image
import zbar
import cv2
import numpy as np

while True:
# Create the in-memory stream
  stream = io.BytesIO()
  with picamera.PiCamera() as camera:
#    camera.start_preview()
#    time.sleep(1)
    camera.capture(stream, format='jpeg')
# "Rewind" the stream to the beginning so we can read its content
  stream.seek(0)
  pil = Image.open(stream)
  imgGauss = cv2.GaussianBlur(np.asarray(pil), (3,3), 0)
  gray = cv2.cvtColor(imgGauss, cv2.COLOR_RGB2GRAY)
  fm = cv2.Laplacian(gray, cv2.CV_64F).var()
#  print "%d" % fm
  if fm < 100:
    continue

#
#########################################
#
# create a reader
  scanner = zbar.ImageScanner()

# configure the reader
  scanner.parse_config('enable')

  pil = pil.convert('L')
  width, height = pil.size
  raw = pil.tostring()

# wrap image data
  image = zbar.Image(width, height, 'Y800', raw)

# scan the image for barcodes
  scanner.scan(image)

# extract results
  for symbol in image:
    print 'decoded', symbol.type, 'symbol', '"%s"' % symbol.data

# clean up
  del(image)
  pass
```

# 結果

連続的に１秒程度の周期でフォーカスレベルを検出し、しきい値以上である場合はQRコードを読み取る。読み取りが実行された場合のタクト時間は２秒程度である。
jqでsortする

## jqとは？
[jq](https://stedolan.github.io/jq/)はjsonのデータから目的の部分を切り出したり集計したりできるCLIのツール

## 前提

こんなデータがあったとする。

```json:input.json
{
  "hoge": [
    { "id": 1, "name": "foo", "age": 20 },
    { "id": 2, "name": "bar", "age": 23 },
    { "id": 3, "name": "baz", "age": 20 },
    { "id": 4, "name": "qux", "age": 18 }
  ]
}
```

## jqを使ってsortする

このjsonから`hoge`の中身をageで昇順にしたい場合は

```bash
$ cat input.json | jq '.hoge | sort_by(.age)'
[
  { "id": 4, "name": "qux", "age": 18 },
  { "id": 1, "name": "foo", "age": 20 },
  { "id": 3, "name": "baz", "age": 20 },
  { "id": 2, "name": "bar", "age": 23 }
]
```
※ 見やすくするために出力を一部整形しています

### 何をしているのか軽く説明

- 最初に`.hoge`フィルターで結果をhogeの中身の配列に絞り込む
- `|`を使うことによってshellのパイプのように左辺の出力を右辺の入力として受け渡す
- `sort_by()`関数を用いてageの昇順でsortする

降順にしたい場合はreverseで逆順にすればよい

```bash
$ cat input.json | jq '.hoge | sort_by(.age) | reverse'
[
  { "id": 2, "name": "bar", "age": 23 },
  { "id": 3, "name": "baz", "age": 20 },
  { "id": 1, "name": "foo", "age": 20 },
  { "id": 4, "name": "qux", "age": 18 }
]
```

sortした結果からnameだけ取得したい場合は`map()`関数を使えばよい

```bash
$ cat input.json | jq '.hoge | sort_by(.age) | map(.name)'
[
  "qux",
  "foo",
  "baz",
  "bar"
]
```

## まとめ
jqを使えばjsonからお目当てのデータをsortして取得するといったことが簡単にできる。
[公式のManual](https://stedolan.github.io/jq/manual/)には`sort_by()`以外にもたくさんの関数が載っていたり正規表現が使えたりするみたいなのでもっと複雑な処理もできそう。
Javaだけで、webのフロントとサーバが作れるGWTを始めませんか？　その４(プロジェクト作成）

プロジェクトの作成とプロジェクトの実行の記事を追加しました。

http://gwt-japan.dix.asia/GWT_JAPAN

昔のドキュメントの多くが、プロジェクトの実行が変わった事を紹介されていません。
昔は、ブラウザにＧＷＴ用のプラグインをインストールしていましたが、
今は、super dev modeとよばれる方法でブラウザ依存をせずに、実行を行う事ができます。
Android, iOSでGUIテストを自動化するためのAppium [概要編]

フロントエンド開発のテストを効率化したいと考えている今日、各種ブラウザ上でGUIテストの自動化ができる[Selenium WebDriver](http://www.seleniumhq.org/projects/webdriver/)があるが、SP（iPhone, Android）でGUIテストを行う場合は[Appium](http://appium.io/)が使えるようなので、とりあえず概要だけ調べてみた。

## この記事で書かない事

- Selenium WebDriverについて
- Appiumの環境構築方法について

## Appiumとは

>Appium is an open source, cross-platform test automation tool for native, hybrid and mobile web apps, tested on simulators (iOS, FirefoxOS), emulators (Android), and real devices (iOS, Android, FirefoxOS).

[公式サイト](http://appium.io/getting-started.html)から抜粋

Appiumとは、ネイティブ型およびハイブリット型モバイルアプリ向けに開発されたテスト自動化を実現するためのフレームワーク。Appiumを使用する事でiOS、Android端末上でテストプログラムを実行し、GUIテストを自動化する事ができる。

元々、Selenium WebDriverには、iPhoneDriver、AndroidDriverというWebViewを元にしてテストするDriverがあるが、今はメンテナンスも終了しているため、使用は推奨されていない。

iOS、Androidをテストする場合はAppiumの他にも[ios-driver](http://ios-driver.github.io/ios-driver/)、[Selendroid](http://selendroid.io/)といった外部プロジェクトで開発されたツールを利用する事ができ、Seleniumプロジェクトでも上記のツールを利用する事が推奨されている。（次期バージョンのSelenium3で上記ツールとの互換性を正式に持つ予定との事）

## DEMO

- [Android DEMO動画](https://www.youtube.com/watch?v=ILKi6B54_sw)
- [iPhone DEMO動画](https://www.youtube.com/watch?v=eKhuF_4KzYo)

## Appiumを選ぶ理由

前述のツールのうち、コミュニティの大きさ、バージョン更新頻度からするとAppiumがデファクトスタンダードになりつつある？

 以下、[「Seleniumのモバイルテストは今どうなっているのか」](http://blog.trident-qa.com/2014/04/selenium-mobile/)から抜粋
>Appiumコミュニティの参加者は1471人と、ios-driverコミュニティの61人、Selendroidコミュニティの139人と比較しても非常に規模が大きくなっています8 。本家Seleniumユーザーコミュニティの15846人9 と比べると10分の1ですが、にも関わらず直近の投稿数はSeleniumユーザーコミュニティをしのぐ程になっています。機能追加やバグ修正も活発で、バージョンナンバーはこれまで0.xxでしたが、間もなくバージョン1.0のリリースが見込まれています。

## Appiumの特徴

- Android 2.3.3以降、iOS 6.0以降に対応している
- Webブラウザーを使ったテストの自動化で広く利用されているSelenium WebDriver（「Selenium 2」とも呼ばれます）と、ほぼ同じ書き方でスマートフォンアプリのテストスクリプトを書くことができる
- Ruby、Python、Javaをはじめとした、[さまざまなプログラミング言語](https://github.com/appium/appium/blob/master/docs/en/about-appium/appium-clients.md)でテストスクリプトを書くことができる
- 比較的古いAndroidバージョンで動作させるためにSelendroid modeに切り替える事が出来る

***Webアプリの自動テストにSelenium WebDriverを利用しているテストエンジニアが、少ない学習コストで、AndroidやiOSのアプリの自動テストにも着手できるメリットがある。***

## Appiumのアーキテクチャ

[こちらの写真](http://image.itmedia.co.jp/l/im/ait/articles/1504/27/l_smaphotest8_2.jpg)の通り、PC上に立ち上げているAppiumサーバーを介して、iOS・Androidプラットフォーム標準のデバッグ機能を利用する事でアプリケーションを操作する。

***iOS（iPhone）をテストするにはMacが必要になる。*** ただし、Mac上にAppiumServerを立ち上げてリモートアクセスするオプションはあるらしい。

## Appiumの使用条件

### iOS

- Mac OSX 10.7以上
- XCode 4.5以上 (Command Line Toolsをインストールしていること)

### Android

- Mac OSX 10.7以上
- Windows 7以上
- Linux
- Android SDK 16以上（SDKが16未満の場合は、Selendroid modeを利用すること）

## 参考

- [SeleniumのUIテスト自動化をiOS／AndroidにもたらすAppiumの基礎知識とインストール方法、基本的な使い方 ](http://www.atmarkit.co.jp/ait/articles/1504/27/news025.html)
- [Selenium3のロードマップ](http://www.selenium.jp/translation/selenium3norodomappu)
- [Selenium何とかっていうツールがやたら色々あるのはどういうわけなのか](http://blog.trident-qa.com/2013/05/so-many-seleniums/)
- [Appiumを使ってスマートフォンアプリのテストを自動化する - 概要編](http://qiita.com/skinoshita/items/fab6373f95836eceb177)

概要は以上ですが、Windows+Node.jsで環境構築する方法は後日載せたいと思います。
powershellでWindowsタスクスケジューラのタスクを複数サーバから一括エクスポートする


Windowsのタスクスケジューラをガリガリ運用していて、タスクを日次で定期的にバックアップしたいという要件があったのでやってみた。

###Powershell2.0でも動くのが嬉しい(4.0とか使うと素敵なコマンドレットで操作出来そう！！)

##経緯

GUIからだと全件選んでエクスポートとかは出来るけど、まさか毎日やるわけないし、昔からお馴染みのschtasksだと、タスク名を引数で渡してからのxml出力は出来るけど(これまではサーバリプレイスの時はこれをbatで組んでやってた)、毎回タスク名取ってきてコマンド生成するの辛いなとか思ってたさなか、同僚の一声でpowershellで簡単に出来そうってなったのでやってみた。

今回は、スタンバイ機からリモート経由でタスクを取得してくるという構成。

あんまpowerShell詳しくないけど、最近のpowershellだと、タスクスケジューラをいじくる用のコマンドレットも出てるみたいだけど、今回は、バージョンが最新でなかったのでComObject(Schedule.Service)に接続する方法で実現した。

今までbatでかなり辛い運用していたので、自分的には革命的だった！！

##サンプルコード

- srvListに入れたサーバ名毎に、フォルダを掘って登録タスク数分xmlファイルを出力
- リストアは、batでやるもよし、GUIでやるも良し(xmlファイルさえ手元にあればOK)


```task_export.ps1
#出力先パス
$outPath = "D:\work\nagai\pstest"

#対象サーバ名を配列で
$srvList = "サーバ名1","サーバ名2"

$outtask = "\"
$outFileName = "{0}.xml"
$sch = New-Object -ComObject("Schedule.Service")

foreach($srvName in $srvList){

  $sch.Connect("$srvName")
  $tasks = $sch.GetFolder("$outtask").GetTasks(0)
  $outfile_temp = Join-Path $outPath -ChildPath $srvName | join-Path -ChildPath $outFileName

  $tasks | ForEach-Object{
    $outfile = $outfile_temp -f $_.name
    $_.xml | Out-File $outfile
  }
}

```

##ps1スクリプトをタスクスケジューラにセット

ついでに、タスクスケジューラにpowershellをセットする際の「操作」タブの設定方法も

```
操作: プログラムの開始
プログラム/スクリプト: %SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe
引数の追加: -Command ".\TaskExport.ps1"
開始: ps1を配置しているフォルダ
```

##参考
https://gallery.technet.microsoft.com/scriptcenter/5af6451b-2e65-4349-bf9f-71e966a25a6f
http://mtgpowershell.blogspot.jp/2013/11/blog-post.html
Herokuにデプロイ出来ない

remote: Compressing source files... done.
remote: Building source:
remote: 
remote:  !     Warning: Multiple default buildpacks reported the ability to handle this app. The first buildpack in the list below will be used.
remote: 			Detected buildpacks: Ruby,PHP
remote: 			See https://devcenter.heroku.com/articles/buildpacks#buildpack-detect-order
remote: -----> Ruby app detected
remote: -----> Compiling Ruby/Rails
remote: -----> Using Ruby version: ruby-2.2.5
remote: -----> Installing dependencies using bundler 1.11.2
remote:        Running: bundle install --without development:test --path vendor/bundle --binstubs vendor/bundle/bin -j4 --deployment
remote:        Warning: the running version of Bundler is older than the version that created the lockfile. We suggest you upgrade to the latest version of Bundler by running `gem install bundler`.
remote:        Your Ruby version is 2.2.5, but your Gemfile specified  2.2.5
remote:        Bundler Output: Warning: the running version of Bundler is older than the version that created the lockfile. We suggest you upgrade to the latest version of Bundler by running `gem install bundler`.
remote:        Your Ruby version is 2.2.5, but your Gemfile specified  2.2.5
remote:  !
remote:  !     Failed to install gems via Bundler.
remote:  !
remote:  !     Push rejected, failed to compile Ruby app.
remote: 
remote:  !     Push failed
remote: Verifying deploy...
remote: 
remote: !	Push rejected to ancient-savannah-29209.
remote: 
To https://git.heroku.com/ancient-savannah-29209.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'https://git.heroku.com/ancient-savannah-29209.git'

の様なエラーが出ますどなたか解決方法か原因をお教え下さい！
宜しくお願い致します
BigQuery　ユーザ毎に使用したコストを算出する

BigQueryを運用していると、どのユーザがどれだけコストを使用しているのか知りたいことがある。
そこで、その方法について以下のページに記載されているので実際に試してみる。
https://cloud.google.com/bigquery/audit-logs

##Cloud Audit Loggingを有効にする
Cloud Audit LoggingはGCPによって提供される使用率のログを収集する。BigQueryのAuditログは"Administrative Activity"と”Data Access”のログから構成されている。

GCPコンソールでLogsViewerからExportを選択し、出力先のBigQuery Datasetを指定する。これにより、AuditLogがBigQueryに出力されるようになる。

##AuditLogに対してクエリを実行し、ユーザ毎の使用コストを算出
クエリのコストは以下に記載されているように、5ドル/TBである。
https://cloud.google.com/bigquery/pricing?hl=ja

| カラム | 概要 |
|:------|:-----|
| protoPayload.serviceData.jobCompletedEvent.eventName | query_job_completedだとジョブが正常に終了したことを示す  |
| protoPayload.serviceData.jobCompletedEvent.job.jobStatistics.totalBilledBytes  | ジョブ使用した課金対象のデータ容量  |

以下のクエリを実行するとユーザ毎のコストが出力される。

```
SELECT
  protoPayload.authenticationInfo.principalEmail User,
  ROUND((total_bytes*5)/1000000000000, 2) Total_Cost_For_User,
  Query_Count
FROM (
  SELECT
    protoPayload.authenticationInfo.principalEmail,
  SUM(protoPayload.serviceData.jobCompletedEvent.job.jobStatistics.totalBilledBytes) AS total_bytes,
    COUNT(protoPayload.authenticationInfo.principalEmail) AS query_count,
  FROM
    TABLE_DATE_RANGE(データセット名.cloudaudit_googleapis_com_data_access_, DATE_ADD(CURRENT_TIMESTAMP(), -7, 'DAY'), CURRENT_TIMESTAMP())
  WHERE
    protoPayload.serviceData.jobCompletedEvent.eventName = 'query_job_completed'
  GROUP BY
    protoPayload.authenticationInfo.principalEmail)
ORDER BY
  2 DESC
```
8/23 今日の学習内容　～プログラミング学習サイト「CODEPREP」でスキマ時間を有効利用！～

###今日の学習内容
***
今日は移動時間に**「CODEPREP」**というサイトを使って学習をしました。
HTML、CSS、JavaScriptの学習をRubyと並行して行っているのですが、パソコンを開かなくても、スキマ時間にスマホで学習できるというのはありがたいですね(*'▽')
　
####CODEPREPとは何か？
***
「CODEPREP」は、通学中、通勤中などのスキマ時間に、スマホでもプログラミングが学習できるサイトです。
私も今日のスキマ時間に「はじめてのHTML」をやってみましたが、**穴埋めをしていく**形式なので、スマホでも十分に学習を進められると思います。
ご自宅で学習されたことを、出先で復習するのにも役立つのではないでしょうか？
（スマホでは少し使いづらかったですケド...(;´･ω･)帰ってからパソコンで利用してみるととても使いやすかったので、ご自宅で復習するのにもオススメです。）

CODEPREP　https://codeprep.jp/ja/

![codeprep.png](https://qiita-image-store.s3.amazonaws.com/0/137880/8dc42d96-9b60-6ad9-7f13-99a81eb2dab9.png)

↑パソコンで開いた画面です。





![Image_1fb3a67(2).jpg](https://qiita-image-store.s3.amazonaws.com/0/137880/e86b4550-89bb-d547-6719-65b628119c01.jpeg)


↑スマホで開いた画面です

スマホで利用するときは、赤丸で囲ってあるところからスワイプを始めないと、うまく画面がスクロールされないようのでご注意ください(*- -)(*_ _)ペコリ

　
「CODEPREP」は４０を超える「ブック」と呼ばれる穴埋め問題集のようなものが、**全て無料**で利用できます！
サイトで他の利用者の方に向けて**質問ができる**というのも強みではないでしょうか。

学習は、右上の画面にある**オレンジ色の部分**に、自分でコードを書いて進めていくわけですね。
ブックにはHTMLやCSS、JavaScriptなどの基礎編をはじめ、「HTML＆CSSで作る進捗ゲージ」などのようなそれらを使った応用編まで用意されています。


こういったサイトでプログラミングに触れる時間を増やすことで、より技術が身に付くのではないでしょうか(-ω-)/
すべて無料で利用できるということなので、ぜひ利用してみてくださいね。
一緒にプログラミングの知識を深めましょう(*'▽')


　
###あとがき
***
ここのところ、忙しくて学習時間も書く時間も取れずで、あまり先に進めていないです...(;´д｀)ﾄﾎﾎ
ある程度まとまった時間が取れれば、一気にProgateのRuby 基礎編を終わらしたいですね(;'∀')
みなさんもスキマ時間をうまく利用して、学習を進めましょう！(^^)/

###参考にさせていただいたサイト
***
CODEPREP　https://codeprep.jp/ja/
【Android】NotificationからIntentでデータを渡してアプリ起動するときのIntent.setFlagsメモ


いつも`Intent.Flag_*`の組み合わせを忘れてしまうのでメモ

## やりたいこと
- Notificationからアプリを起動させる
- IntentでNotificationから起動されたことを示すデータを渡して「特殊な処理」をしたい
	- Notificationからの起動時だけ処理したいので、「最近使ったアプリ一覧（Recent Apps）」経由で起動されたくない
		- 通常Recent AppsにはIntentのデータも保持された状態で起動されるので、Recent Appsから起動されると「特殊な処理」が実施されてしまう
- アプリがHOMEアイコンから（`action.MAIN`かつ`category.LAUNCHER`のタスクで）起動中だったり、Notificationから起動中だった場合に、Activityが重ならないようにしたい

## フラグの組み合わせ
以下3つのフラグを設定すればOK

`Intent.FLAG_ACTIVITY_CLEAR_TOP`
スタック最上位と同じアクティビティを起動しようとした時は起動しない

`Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED`
新規タスク生成または既存タスクの最前面呼び出し時以外の時、タスクをリセットする。スタック内にFLAG_ACTIVITY_CLEAR_WHEN_TASK_RESETで起動されたアクティビティが存在する時、そのフラグ仕様に応じてクリアされる。

`Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS`
通常はアクティビティを起動すると、「最近起動したアクティビティのリスト(ホームボタンの長押しを介してアクセス可能)」に表示されるが、このフラグで起動したアクティビティは表示されない。

## サンプルコード

```java
NotificationManager notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);

Intent intent = new Intent(context, HogeActivity.class);
intent.putExtra("hoge", "fuga");
intent.setFlags(
                   Intent.FLAG_ACTIVITY_CLEAR_TOP  // 起動中のアプリがあってもこちらを優先する
                   | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED  // 起動中のアプリがあってもこちらを優先する
                   | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS  // 「最近利用したアプリ」に表示させない
                 );
PendingIntent contentIntent =
        PendingIntent.getActivity(
                context,
                0,
                intent,
                PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_ONE_SHOT);

NotificationCompat.Builder mBuilder =
        new NotificationCompat.Builder(context)
                .setSmallIcon(R.drawable.icon)
                .setContentTitle("Nofitication Title")
                .setContentText("Nofitication Message")
                .setStyle(new NotificationCompat.BigTextStyle().bigText("Nofitication Message"));

mBuilder.setContentIntent(contentIntent);
notificationManager.notify(0, mBuilder.build());
```

## 参考
[Androidメモ アクティビティの起動モードと起動フラグ](http://www.saturn.dti.ne.jp/npaka/android/LaunchMode/)
Django でクエリ文字列（クエリストリング）を取得する

Djangoでクエリ文字列を使った処理を行いたい場合の実装方法

```python:

qs = request.META['QUERY_STRING']

```

リクエストの際、以下のようなクエリ文字列が渡されると上記コードでは・・・

?__search=true&access_dt_0=&access_dt_1=&access_user=10000&access_kb=&access_content=てすと

qs は以下のような中身になる。

```
<QueryDict: {'__search': ['true'], 'access_user': ['10000'], 'access_kb':
[''], 'access_dt_0': [''], 'access_dt_1': [''], 'access_content': ['てす
と']}>
```

HttpRequest.META では、HTTPヘッダーを以下のような辞書に保持しているので、他にもいろいろ使えそう。

https://docs.djangoproject.com/en/1.10/ref/request-response/#django.http.HttpRequest.META
Django の POST 処理を呼び出したとき、URL の後ろにスラッシュつけ忘れたらリダイレクトされて 405 Client Error: METHOD NOT ALLOWED が返ってきた

# 発生した問題

Django の POST 処理を呼び出したとき、URL の後ろにスラッシュつけ忘れたらリダイレクトされて 405 Client Error: METHOD NOT ALLOWED が返ってきた。

### エラー内容

```
405 Client Error: METHOD NOT ALLOWED for url:
http://localhost:8000/confirm/api/
login/
```

###呼びもとプログラム

* Django Rest Frameworkで開発したAPIを呼び出す。

```py
# 呼出しAPI ドメイン
API_DOMAIN = "http://localhost:8000"

# アプリケーションパス
APP_PATH = "/confirm/api"

# ログイン用URL（URL終端のスラッシュが抜けている）
LOGIN_URL = API_DOMAIN+APP_PATH+"/login"

def login():
    """ログイン
    """
    s = requests.session()

    # 外から渡せるようにしたい
    payload = LOGIN_INFO
    headers = {"pragma": "no-cache", 'content-type': 'application/json'}
    r =  s.post(LOGIN_URL, data=json.dumps(payload), headers=headers)
    r.raise_for_status()
    return s
```

## 何故エラーになるか

Django の APPEND_SLASH という settings.py の設定が原因(デフォルト True)

リクエストのURLの後ろにスラッシュがない場合、設定された URLConfにリクエストURLがマッチしなかったら、スラッシュ付きのURLでリダイレクトする。

その際、最初にPOSTした時のデータが失われてしまう。そのためエラーが発生していた。

https://docs.djangoproject.com/en/1.10/ref/settings/#append-slash
laravelのユーザー登録の確認メールをプレーンテキストで

laravelのユーザー登録の確認メールをプレーンテキストで
という要望があったのでちょっとメモ代わりに。

config/auth.php　の大体62行目あたり 

`'email' => 'emails.password',`
を
`'email' => ['text' => 'emails.password'],`

に変更。
Pyinstaller でエラー

### ■環境
Windows10
Python v3.5.2
Pyinstaller v3.2

### ■問題
Pyinstaller で opencv(cv2) を使った画像の閾値処理を行うプログラムをビルドするとエラーでまくり。
.exe ファイルは生成されるがエラーで実行できない。

### ■対処方法
原因は定かではないがここに書かれていた方法でビルド＆実行に成功。
https://github.com/pyinstaller/pyinstaller/issues/2086
kotlinでenum classを使う

数字から文字列を得たいとき、
(例えば5を指定して, Oneを文字列として得たいとき)

```kotlin:kotlin

enum class Financing(val rawValue :Int)  {
    One(5),
    Revolving(6),
    Two(7)
}
// 使う
Financing.values().filter { 5 == it.rawValue }.first() // => One (Financing型)
Financing.values().filter { 5 == it.rawValue }.first().toString() // => One(String型)

```

swiftコードをkotlinに変換しているとき、

```kotlin:kotlin

class Compass {
    enum class Direction(val rawValue: Int)  {
        NORTH(1),
        SOUTH(2),
        WEST(3),
        EAST(4)
    }
}

// 使う
Compass.Direction.NORTH.rawValue // => 1
```

```swift:swift
class Compass {
    enum Direction: Int  {
        NORTH = 1
        SOUTH
        WEST
        EAST
    }
}

// 使う
Compass.Direction.NORTH.rawValue // => 1
```
AWSのEC2インスタンスの停止、再起動の違い

※ 勉強中につき間違いがあるかもしれません

# 停止
* データ：インスタンスストア内データは削除されます。
* 料金の扱い：停止した時点で課金時間stop。次に起動した時点で新しく1h開始。

# 再起動
* データ：インスタンスストア内データも含め保持される。
* 料金の扱い：新しく課金時間が開始されるわけではなく、そのまま課金時間が継続される。

# 課金時間例
12:00に起動開始。

* 12:20に停止、12:30に起動した場合。
12:00 - 12:20で1h分の課金時間。
12:30 - 13:30で1h分の課金時間。  

* 12:20に再起動した場合。
12:00 - 13:00で1h分の課金時間。

# 結論
停止→起動はやめて再起動の方がよさ気。
c++ builder / FastReport > PDF出力 > 「ページXをエクスポートしています。」の表示を消す

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

FastReportでPDF出力するとき、「ページXをエクスポートしています。」のダイアログ表示を消したい。

`frxPDFExport1->ShowProgress = false;`とすれば消えるようだ。

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "frxClass"
#pragma link "frxExportPDF"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	frxPDFExport1->FileName = L"test.pdf";
	frxPDFExport1->ShowDialog = false;
	frxPDFExport1->ShowProgress = false; /***/

	frxReport1->PrepareReport(/*CLearLastRerpot=*/true);

	for(int loop=0; loop < 3; loop++) {
		bool res = frxReport1->Export(frxPDFExport1);
		String msg = BoolToStr(res);
		OutputDebugString(msg.c_str());
	}
}
//---------------------------------------------------------------------------
```

複数回のPDF出力処理をする時、「ページXをエクスポートしています。」ダイアログ上のキャンセルボタンを押してもExport()処理はキャンセルを識別できない。

上記のダイアログの表示を消して、代わりの進捗ダイアログをTProgressBarとTButtonを使ったフォームで代替することで、処理の停止を可能にする。
smtpd_recipient_restrictions と smtpd_relay_restrictions

smtpd_recipient_restrictions と smtpd_relay_restrictions は用途は同じ。
2段階で制限を掛けることができる。

以前は smtpd_recipient_restrictions の設定を誤ってゆるく制限してしまい open relay してしまいがちなため
Postfix 2.10 で smtpd_relay_restrictions が導入されたようです。

smtpd_relay_restrictions のデフォルト値は open relay しないようになっている。

> smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, defer_unauth_destination

基本的には smtpd_relay_restrictions はデフォルトのままで、
smtpd_recipient_restrictions で追加の制限をかければよい。
Windows10 インストールディスクの作成(USBHDDへの展開)

# 概要
- 社内ノートPC(Win10)が起動しなくなったのでどうにかしないといけなくなった。
- リカバリツール何もなし(リカバリディスク作成していなかった)
- 仕方なく１からインストールディスクを作成する事になった。
    - インストールメディア作成ツールが実行できなかった為。
        - 管理者権限でログイン出来ればこんなファッキンめんどくさい作業はいらない模様。
- 備忘録として記載しておく。

# 使ったもの
- Windows10 Pro PC
- USBHDD(120GB程度のもの)
- Windows10 Pro ディスクイメージ(ISOファイル)
    - 以下、Win10イメージと呼称。

# 作業手順
- USBHDD接続後、管理者権限でコマンドプロンプトを立ち上げ、「DISKPART」と打ち込む。
    - Win+X→Aで管理者権限でコマンドプロンプトを立ち上げる事が出来る。
- DISKPARTが起動したら、以下のコマンドを順に実行。

``` DISKPARTコマンド
DISKPART> select disk <対象のディスク番号>
DISKPART> clean
DISKPART> create partition primary
DISKPART> select partition 1
DISKPART> active
DISKPART> format fs=exfat
DISKPART> assign
DISKPART> exit
```

- DISKPART終了後、Win10イメージをマウントし、ファイルコピー。
    - なお、F:\にWin10イメージが、G:\にUSBHDDが割り当てられている状態。

```
C:\>xcopy F:\*.* /s/e/f G:\
```

- ファイルコピー完了後、以下のコマンドを実行でインストールディスク作成完了。

```
C:\>cd /D G:\boot
G:\boot>bootsect /nt60 G:
```

# 注意点
- 参考ページではフォーマットをFAT32にしているが、USBHDDの容量の関係上exFATでフォーマットしてある。
    - 一応、exFATでもインストールディスクとして起動出来た(対象PC：Dell Latitude E5570)
    - その他で出来るかどうか未確認。
- 機種によっては、NTFSでフォーマットしてもインストールディスクとして起動出来る様子(Dell Latitude 3450で確認)
    - この場合、ISOイメージの中身を全部コピーするだけでOK


# まとめ
- リカバリイメージはきちんと作ろう。

# 参考
[Windows 7／8／8.1のインストールUSBメモリを作る（diskpart編）](http://www.atmarkit.co.jp/ait/articles/1305/20/news087.html)
↑対象はWin7/8だが、Win10でもいけた。
AWSのEC2で最初にやったこと

アカウント作成等は済ましておく。

---
### EC2 
* インスタンス作成  
好きなOSで適当に。自分はUbuntuを選択。
* EIP割当  
PublicIPは再起動ごとに変更されるので、固定IP(EIP)をインスタンスに割り当てておく。

### Ubuntu上
* /etc/login.defs を編集し、CREATE_HOME yes を追加
* ユーザー作成 (参照：http://qiita.com/gouf/items/d53e10c9b5b234fc223b)

### ローカル上
* ssh設定 (参照:http://d.hatena.ne.jp/bluepapa32/20101108/1289187846)
"Buffer is read-only: #<buffer *GTAGS SELECT* (D)tagname>"の解決方法

コードリーディング支援ツールglobalのトラブルシューティングです。

# 環境
gtags - GNU GLOBAL 6.2
GNU Emacs 21.3.1 (FreeBSD8.2)

# 事象

タグジャンプ候補が複数ある場合、ジャンプ先を選択するための"gtags-select-mode"が表示されます。ここで、「リターンキー」を使ってジャンプ先を選びたいのですが、キーを押下すると以下のようなエラーが表示されます。

```
Buffer is read-only: #<buffer *GTAGS SELECT* (D)tagname>
```

どうやら、"gtags-select-mode"で、リターンキーは改行扱いになっているようです。

# 設定ファイルの書き方

gtags-select-modeのときのみ、リターンキー（\C-m）が"gtags-select-tag"になるように、ローカルキーバインドします。

```.emacs:.emacs
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; For Global
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(setq load-path (cons "/usr/home/osada" load-path))
(autoload 'gtags-mode "gtags" "" t)
(global-set-key "\C-cg" 'gtags-mode)
(global-set-key "\C-cv" 'gtags-visit-rootdir)
(global-set-key "\C-ct" 'gtags-find-tag)
(global-set-key "\C-cr" 'gtags-find-rtag)
(global-set-key "\C-cs" 'gtags-find-symbol)
(global-set-key "\C-cm" 'gtags-select-tag)
;(define-key gtags-select-mode-map "\C-m" 'gtags-select-tag)
(setq gtags-rootdir "/usr/home/osada/ns-allinone-2.35")
; 以下を追加
(setq gtags-select-mode-hook
      '(lambda ()
         (local-set-key "\C-m" 'gtags-select-tag)
         ))
```

* 新しい環境（emacs ver.が23以上？）であれば、define-keyを使って、gtags-select-modeで有効になるキーマップを定義してあげるとよいそうです。（試していません。）
* global-set-keyで\C-mをgtags-select-modeにキーバインドすると、改行が常にできなくなり、悲しい気持ちになります。
ActiveRecord & MySQL において、auto_incrementされるidの値をどのように取得しているか

追ってみました。答えは [mysql_insert_id()](https://dev.mysql.com/doc/refman/5.6/ja/mysql-insert-id.html) を使っているです。終わり。

# コードリーディング

一応コードリーディングした時のメモを残しておきます。諸事情によりRailsのバージョンは `4.1.1` です。

```rb:activerecord-4.1.1/lib/active_record/persistence.rb
def save!(*)
  create_or_update || raise(RecordNotSaved)
end

def create_or_update
  raise ReadOnlyRecord if readonly?
  result = new_record? ? create_record : update_record
  result != false
end

def create_record(attribute_names = @attributes.keys)
  attributes_values = arel_attributes_with_values_for_create(attribute_names)

  new_id = self.class.unscoped.insert attributes_values
  self.id ||= new_id if self.class.primary_key

  @new_record = false
  id
end
```

`self.class.unscoped.insert` で新しいIDが返るので実装を探す

```rb:activerecord-4.1.1/lib/active_record/connection_adapters/abstract/database_statements.rb
def insert(arel, name = nil, pk = nil, id_value = nil, sequence_name = nil, binds = [])
  sql, binds = sql_for_insert(to_sql(arel, binds), pk, id_value, sequence_name, binds)
  value      = exec_insert(sql, name, binds, pk, sequence_name)
  id_value || last_inserted_id(value)
end
```

`last_inserted_id`で取得している。
ここから `mysql2_adapter` の世界。

```rb:activerecord-4.1.1/lib/active_record/connection_adapters/mysql2_adapter.rb
def last_inserted_id(result)
  @connection.last_id
end

def connect
  @connection = Mysql2::Client.new(@config)
  configure_connection
end
```

`@connection`には`Mysql2::Client`が入るので、ここからは`mysql2`の世界

```rb:mysql2-0.3.15/ext/mysql2/client.c
/* call-seq:
 *    client.last_id
 *
 * Returns the value generated for an AUTO_INCREMENT column by the previous INSERT or UPDATE
 * statement.
 */
static VALUE rb_mysql_client_last_id(VALUE self) {
  GET_CLIENT(self);
  REQUIRE_CONNECTED(wrapper);
  return ULL2NUM(mysql_insert_id(wrapper->client));
}
```

というわけで [mysql_insert_id()](https://dev.mysql.com/doc/refman/5.6/ja/mysql-insert-id.html) を使っているでした。
Adobe Media Encoder で黒い線がでる

Adobe Media Encoderでムービーのサイズを変更して書き出して
動画の縁に黒い線がついてしまうときの対応策

出力設定の「ソースのスケーリング」で
「出力サイズ全体にスケール」や「出力サイズ全体にストレッチ」を選ぶと解消される。

![スクリーンショット 2016-08-23 18.37.04.png](https://qiita-image-store.s3.amazonaws.com/0/19174/cbb8a0f9-e673-20c2-1eae-5375431b69d5.png)

- ##### 出力サイズに合わせてスケール
縦横比を維持したまま、出力サイズに合わせて拡大縮小される。
サイズに合わない部分は<Font color="red">黒く表示</font>される。（デフォルト？）
 
- ##### 出力サイズ全体にスケール
縦横比を維持したまま、出力サイズに合わせて拡大縮小される。
サイズに合わない部分は<Font color="red">切り取られる</font>。

- ##### 出力サイズ全体にストレッチ
<Font color="red">縦横比を維持しないで</font>、出力サイズに合わせて拡大縮小される。


[Media Encoder ヘルプ / Media Encoder の書き出し設定リファレンス](https://helpx.adobe.com/jp/media-encoder/using/export-settings-reference.html#id_13758)
Anacondaがインストールできない！

## 結論
デフォルトではanacondaをインストールすると、
.bash_profileに、anacondaを使うために必要な以下の3行が書かれるので、zshを使っていた私は使えていなかった。

ので、.zshrcに以下の行を追加し、shellを再起動することで解決

```~/.zshrc
export PATH="/Users/uu083699/anaconda/bin:$PATH"
export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
```

## Anacondaとは
- 分析系環境で欲しい&インストールが面倒なライブラリが最初からほぼ入っている素敵なPython。(pandas, scikit-learn, numpyとか)
- condaというパッケージ管理システムが入っている。pipも入っている。

## インストール方法

`pyenv install anaconda2-2.4.1`

## 参考にさせてもらいました
http://qiita.com/kazuhikoyamashita/items/ed5d8b94a902a2e89efa
http://qiita.com/katzhide/items/527ef101d5067ee84416
メモ：MacOSX(El Capitan)にNode.jsをNVMでインストール 

# Mac(El Capitan)にNode.jsをNVMでインストール

## 手順
ターミナルから作業します。

### 確認・準備
ホームディレクトリに`.bash_profile`があるかどうか確認し、なければ作成します。

```shell-session
$ ls ~/.bash_profile
ls: /Users/genova-ishii/.bash_profile: No such file or directory

$ touch ~/.bash_profile
```

### NVMをインストール

```shell-session
$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.4/install.sh | bash
```

`.bash_profile`を読み込みなおしてNVMを使えるようにします。

```shell-session
$ source ~/.bash_profile
```

確認します

```shell-session
$ nvm --version
0.31.4
```

### Node.jsの安定版（Stable）をインストール
コマンド：`nvm install stable`
※バージョンを指定したい場合：`nvm install v0.12`

```shell-session
$ nvm install stable
Downloading https://nodejs.org/dist/v6.4.0/node-v6.4.0-darwin-x64.tar.gz...
######################################################################## 100.0%
Now using node v6.4.0 (npm v3.10.3)
Creating default alias: default -> stable (-> v6.4.0)
```

確認します

```shell-session
$ node -v
v6.4.0
```

### Node.jsの長期間安定版（LTS）をインストール
コマンド：`nvm install --lts`

```shell-session
$ nvm install --lts
Installing latest LTS version.
Downloading https://nodejs.org/dist/v4.5.0/node-v4.5.0-darwin-x64.tar.gz...
######################################################################## 100.0%
Now using node v4.5.0 (npm v2.15.9)
nvm_ensure_default_set: a version is required
```

確認します

```shell-session
$ node --version
v4.5.0
```

### バージョンの切り替え

`nvm use <version|alias>`

```shell-session
$ nvm use stable
Now using node v6.4.0 (npm v3.10.3)

$ node --version
v6.4.0
```

以上です

## 参考
* [nvm@github](https://github.com/creationix/nvm)
SeleniumBuilderで実施したテストがすべて成功で完了できたのか判定する方法

SeleniumBuilderでテストを実施したら分かるんですが、実施項目に緑・赤がついて、赤になるとその場でテストが止まります。
完全自動化を目指すと、この仕様のせいで夜回していたテストが終わってない、という事もあります。

これを回避する運用案について、気付いたところをまとめました。

# 前提条件
- SeleniumBuilder
    - 使ったことがある
    - テストツールとしての導入を考えている
- SeleniumServer
    - 運用している
    - ターミナル系のコマンドが分かる

# SeleniumBuilderでのテストの挙動と課題
バージョンは2.3.5/3.0.9です。[過去の投稿](http://qiita.com/nomurasan)を参考にしてください。

- Frame系
  - 画面に出力されるエラーログからでは原因を特定することが難しい
- Capture系
  - 根本的にパスが間違っている場合のリカバリをSeleniumBuilder以外から確認する必要がある
  - そのため、SeleniumBuilder側に固有の変数を持たせるべきではない。CSVなどで管理する
  - ただし、複数のファイルから変数を与えることは仕様上出来ない。
- テストシートの挙動
  - テストシートに連続したテストケースを入れる場合、前段のテストが正常終了だろうが異常終了だろうが気にしないで実施する
  - これを回避する場合、テストシートのshareStateをfalseにして、都度開きなおすのが良い

# 結論
**完全自動化を目的にするなら、現時点ではBuilderは使わないほうが良い**でしょう。
ある程度運用を決めて、その上でボトルネックになっている部分を解決していくのが理想的です。

# 現行システムを改修する
では、その上で動いているシステムをなるべく半自動化ぐらいには寄せよう、というのが今回の課題です。
やりたいことは「テストがすべて成功で完了できたのか判定する」という観点で解説します。

##対応 SeleniumBuilder側
それぞれのテストケースの正しい完了条件を設定して、画像に意味のないスクリーンキャプチャを取ります。
ここでやりたいのはファイルを置く事なので、要件さえ満たせればスクリーンキャプチャの必要はありません。
SeleniumBuilderが用意しているファイル出力の仕組みがこれしかなかったので代用しています。

```json:putComplate.json
  "steps": [
（中略）
    {
      "type": "assertTitle",
      "title": "ここに条件"
    },
    {
      "type": "saveScreenshot",
      "file": "ここにファイルパス"
    }
（中略）
  ],

```

## 対応 サーバー側
こちらは簡単ですね。
SeleniumBuilderが実施した内容が正常であることをsaveScreenshotのファイルから判定します。
ここは事前に打ち合わせるなりの運用対処が求められます。
わりかし安全なのはSeleniumBuilderが呼べる変数ファイルにパスを書いておいて、サーバーで対応する場所に読み替える事です。

```shell-session:checkComplate.sh
#（中略）
if [ ! -e "${saveScreenshot_path}" ] then;
  echo "no Complate"
  exit 1
else
  exec("${next_step}")
fi
#（中略）
```

## 未解決課題
Captureが失敗する可能性を考慮していない設計です。
実際問題として、Captureは失敗する可能性がありますので、その際もnoComplateとして扱います。

# 読了後いいね！をお願いします。
どれだけの方に読んでもらっているか知りたいので、お手数をおかけしますがご協力いただけると嬉しいです。
PumaをSingleモードで起動してRailsと共存する


さて、Rails5でのwebsocketはRailsのgem内に組み込まれているので、特になにもする必要はないのですが、今回はRailsはApachePassengerで動いているので、
Pumaはスタンドアロンで別ポートで起動してもらう事にします。

[前回](http://qiita.com/MariMurotani/items/6c1d78401c8085622603)のコードに多少の修正を加えます。

1. 通常のウェブサイト: Apache +Passenger
2. WebSocket: Puma

こういう組み合わせで行きたいと思います。
EC2内にデプロイします。

# 1. 事前準備
1) Redisがサーバーで立ち上がって動いている事が前提なのでインストールして設定します。
2) 現在Railsが動いているリポジトリをPULLしてきます。

# 2. Puma設定
ポートを 28080 にします。
FWの設定で外部からの受付設定を忘れないようにしましょう。
今回はELBとセキュリティグループに28080へのアクセスを許可します。

```config/puma.rb
port        ENV.fetch("PORT") { 28080 }
```

ipconfigで確認するとeth0に172.31.10.197が設定されていてどうやらAWS内部ネットワークではこちらを利用しているみたいなので、このインターフェイスにバインドする形で起動します。
>bundle exec puma cable/config.ru -b tcp://172.31.10.197:28080/cable&

正常に疎通ができていれば、
http://サーバー:28080/
でブラウザからアクセスした場合に、「Page not found」と表示されます。


#3. dbのmigration
railsを再起動するとエラーがでるので対応します。
そういえば、追加した　DBをインストールするのを忘れていました。

> rails db:migrate


#4. websocket用の宛先変更
下記ファイルでローカルのVMをさしていた部分を一時的にAWS内のインスタンスを指すように変更して正常に動くか確認します。

```rb:my1stRails/app/assets/javascripts/cable.js
//= require action_cable
//= require_self
//= require_tree ./channels
(function() {
  this.App || (this.App = {});
  App.cable = ActionCable.createConsumer("ws://hogehoge.com:28080/");
}).call(this);
```

#5. その他修正
自分用のメモでもあるので対象の[コミット](https://github.com/MariMurotani/my1stRails/pull/7)を貼っておきます。


Puma用のconfigファイル

```rb:cable/config.ru
# cable/config.ru
# it's used like 'bundle exec puma cable/config.ru -b tcp://192.168.10.5:28080/cable'
require ::File.expand_path('../../config/environment', __FILE__)
Rails.application.eager_load!

run ActionCable.server

```

下記を追記します。

```rb:config/application.rb
 config.action_cable.mount_path = '/cable'
```

ActionCableのサーバーはcable/config.ru内に記述しているのでこちらは外します。

```rb:config/routes.rb
# mount ActionCable.server => '/cable'
```

#5.さいごに
今回最終的に出来上がったものは、
[Pull8](https://github.com/MariMurotani/my1stRails/pull/8)を含む丸バツです。
1タブにつき1ウェブソケットなので、同じ画面のチャットのソケットを使いまわしています。

[ユーザー1]:(http://mydemos1-1223107232.ap-northeast-1.elb.amazonaws.com:3001/rooms/show?id=1)
[ユーザー2]:(http://mydemos1-1223107232.ap-northeast-1.elb.amazonaws.com:3001/rooms/show?id=2)


[WebSocket Example](http://mydemos1-1223107232.ap-northeast-1.elb.amazonaws.com:3001/)
Ansible Tips

# PerlでYAML読む
AnsibleのTipsではないけども。

* perl-YAML-Tiny 

```pl
# Get values form yaml file
sub get_value{

        my $para = shift;
        my $data= YAML::Tiny->new;
        $data = YAML::Tiny->read( "./text.yml" );
        my $yaml = $data->[0];

        return $yaml->{$para};
}
```

下記のようなファイルをパラメータファイルとして読ませるために使った。

```yaml
hoge: "A"
fuga: 3
```

また、コンビネーションの

```yaml
hoge: { name: "string" , url: "http://123" } 
```
のようなファイルはダンプできなかったので、

```yaml
# "string" is 
# $data->[0]->{hoge}->{name}
hoge:
  name: "string"
  url: "http://123"
```
のように書いた。

# ディレクトリ配下のデータを全部・・・という時

```with_fileblob``` のループを使う。
http://docs.ansible.com/ansible/playbooks_loops.html#id4


```yaml
- fetch src="{{ item }}" dest="{{ savedir }}"
  with_fileglob:
    - /playbooks/files/fooapp/*
```

# file モジュールでワイルドカードが使えないための対処方
v2.0 以降で``find``モジュールがありそこでレジストして、呼び出して使う

例、/tmp以下の **.sh** ファイルを全部 **0755**へパーミッション変更

```yaml
- name: find *.sh
  find: paths="/tmp" patterns="*.sh"
  register: sh_list

- debug: msg="{{ item.path }}"
  with_items: '{{ sh_list.files }}'

- debug: var=item.path
  with_items: '{{ sh_list.files }}'

- name: change test *.sh files
  file: path="{{ item.path }}" owner=root group=root mode=755
  with_items:
    - '{{ sh_list.files }}'
  become: true
  become_user: root
```

* http://docs.ansible.com/ansible/find_module.html#
* http://docs.ansible.com/ansible/file_module.html

# ファイルを読んでパラメータにする方法
以下のようなファイルがあるときに、１行毎に変数に当て込んで処理を実行できる。

```text:filelist.txt
/etc/ssh/sshd_config
/var/log/syslog
/etc/nsswitch.conf
/etc/hosts
```

例えば、inputfile に filelist.txt が入っているとする。

```yaml
- name: Fetch files
  fetch: src="{{ item }}" dest=/tmp/destdir
  with_lines:
    - cat "{{ inputfile }}"
```

* **with_lines** ではUNIX/Linuxのコマンドを実行し、結果をループできる
* cat で得られた標準出力一行ずつを、item に入れて fetch 処理がループされる
* http://docs.ansible.com/ansible/playbooks_loops.html
curl data

```bash
curl --get -d "wd=q" "http://www.baidu.com/s"
```

https://curl.haxx.se/mail/archive-2002-01/0093.html

http://stackoverflow.com/questions/28216437/end-of-file-in-stdin

```bash
       -d, --data <data>
              (HTTP) Sends the specified data in a POST request to the HTTP server, in the same way that a browser does when a user  has
              filled  in  an HTML form and presses the submit button. This will cause curl to pass the data to the server using the con‐
              tent-type application/x-www-form-urlencoded.  Compare to -F, --form.

              -d, --data is the same as --data-ascii. To post data purely binary, you should instead use the  --data-binary  option.  To
              URL-encode the value of a form field you may use --data-urlencode.

              If any of these options is used more than once on the same command line, the data pieces specified will be merged together
              with a separating &-symbol. Thus, using '-d name=daniel -d skill=lousy' would  generate  a  post  chunk  that  looks  like
              'name=daniel&skill=lousy'.

              If  you  start  the data with the letter @, the rest should be a file name to read the data from, or - if you want curl to
              read the data from stdin.  The contents of the file must already be URL-encoded. Multiple files  can  also  be  specified.
              Posting data from a file named 'foobar' would thus be done with --data @foobar.
```

```bash
       -G, --get
              When  used,  this  option  will  make all data specified with -d, --data or --data-binary to be used in a HTTP GET request
              instead of the POST request that otherwise would be used. The data will be appended to the URL with a '?' separator.

              If used in combination with -I, the POST data will instead be appended to the URL with a HEAD request.

              If this option is used several times, the following occurrences make no difference. This is because undoing a GET  doesn't
              make sense, but you should then instead enforce the alternative method you prefer.
```
サービス間の例外ハンドリングについて議論したメモ

社内の議論で一般化できそうなのはqiitaに書いてみる。有用性は微妙・・

## 前提

クレジットカードを扱う、共通基盤的なマイクロサービス `P` (Provider) がある。

ユーザ向けのサービス `C` (Consumer) は、クレジットカード登録を利用している。筆者はこのサービスの開発を担当している。

`C` はクレジットカード登録や商品購入などのAPIをもっており、ユーザからリクエストを受け取ると、内部では `C` にクレジットカード登録や決済などのリクエストを送っている。

## 問題になったこと

クレジットカード登録時に、カード裏の番号 cvv を入力する必要がある。この番号は4桁以内である。

サービスCは、特にcvvの長さのバリデーションを行わず、そのままサービスPに送っていた。サービスPは400 Bad Requestを返しつつ、エラーのSlack通知をしていた。エラーが定常的に見られたため、Pの開発者は、Cの開発者にvalidationをかけてほしいと言った。

## 論点

サービスC側としては、cvvの長さのvalidationをかけることは可能だが、いくつかの疑問があった。

そもそもこの種のエラーは、引き起こさないべきなのか?
リクエストを送ってそのエラーのタイプをハンドリングするほうが実装が楽で、各サーバでのバリデーションはドメインロジックの分散を生むので、やりたくない場合もある。

また、今回でいうとPayment Gatewayに問い合わせないと最終的に正しいcvvかはわからないので、長さのvalidationだけを特別扱いする理由はあるのかどうか。
本当にSlack通知する必要があるタイプのエラーなのか?

という疑問をもとに、議論をした。

## 結論

以下の場合に限り、consumerに事前のバリデーションを強制させてよい、ということになった。

- consumerがエンドユーザではなく内部のサービスである。
- バリデーションロジックが簡潔である。
- バリデーションロジックがstableである。(今後そう変わらない)

今回のケースでは、cvvは4桁以内という、簡単かつそう変わらないロジックである。

これにより、プロダクト全体として、バグ早期発見につなげることができる場合があるため。

その場合、providerはドキュメントを用意しconsumerにわかるようにする。

## おまけ

Pチームのエンジニアが議論まとめてくれたので、そのまま貼る。

* `P Team` should be responsible for keeping updated with any changes to the rules for credit card validations.

* `P` should document the basic validation rules for CVV, Credit Card numbers, expiry dates.

* `P` should inform its `consumers` when there are any validation changes.

* `Consumers` should implement the validation rules. Ideally for the best User-Experience this should be client-side, but server-side is be good enough to prevent bad requests going to `payment gateway`.

* `P` will generate Airbrake/ErrBit alerts when validation rules are broken. And `P Team` will identify the `consumer` and inform them of the problems.
zshのインストール


[spicelifeのエンジニアは、どんな開発環境で仕事をしているの？](http://blog.spicelife.jp/entry/2016/06/16/152330)
この記事に触発されてiTerm,zsh,tmuxを使いたくなったので、まずはzshをインストールしてみる。
[WEB+DB PRESS vol.83のzsh特集](http://mollifier.hatenablog.com/entry/2014/10/20/191511)を見ながら作業した。

環境
Mac OS X El Capitan 10.11.5 

## zshのインストール
Homebrewでインストール

```bash
$ brew install zsh
```

バージョンの確認

```bash
$ zsh --version
zsh 5.0.7 (x86_64-apple-darwin15.5.0)
```

## zshをログインシェルに設定

zshのパスを確認

```bash
$ which zsh
/usr/local/bin/zsh
```

`/etc/shells`の内容を確認

```bash
$ cat /etc/shells
/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
```

`/etc/shells`にzshのパスを追加。すでにある場合は不要

```bash
$ sudo sh -c "echo '/usr/local/bin/zsh' >> /etc/shells"
```

chshコマンドでログインシェルを変更

```bash
$ chsh -s '/usr/local/bin/zsh'
```

これで次からエミュレータで起動した時にzshが起動する。
しかし、.zshrcが無いので↓のメッセージが出る。

```zsh
This is the Z Shell configuration function for new users,
zsh-newuser-install.
You are seeing this message because you have no zsh startup files
(the files .zshenv, .zprofile, .zshrc, .zlogin in the directory
~).  This function can help you with a few settings that should
make your use of the shell easier.

You can:

(q)  Quit and do nothing.  The function will be run again next time.

(0)  Exit, creating the file ~/.zshrc containing just a comment.
     That will prevent this function being run again.

(1)  Continue to the main menu.

--- Type one of the keys in parentheses ---

Aborting.
The function will be run again next time.  To prevent this, execute:
  touch ~/.zshrc
```

.zshrcを作成する。

```zsh
% touch ~/.zshrc
```

これでメッセージが出なくなった。
今後、`.zshrc`をいろいろ触っていく予定。
【go】gorm.Modelを埋め込んだstructでIDを初期化する方法のメモ

以下は unknown MyModel field 'ID' in struct literalというエラーになってしまう

```:go
package main

import (
    "fmt"
    "github.com/jinzhu/gorm"
)

type MyModel struct {
    gorm.Model
    Member string
}

func main() {
    m := MyModel{
        ID:     123,
        Member: "test",
    }

    fmt.Printf("%+v\n", m)
}

```

正しくはこうやる

```:go
package main

import (
    "fmt"
    "github.com/jinzhu/gorm"
)

type MyModel struct {
    gorm.Model
    Member string
}

func main() {
    m := MyModel{
        Model: gorm.Model{ID: 123},
        Member: "test",
    }

    fmt.Printf("%+v\n", m)
}

```
Modelで初期化するところがハマリどころでした。
twitter api

https://twittercommunity.com/t/cant-get-the-streaming-api-to-work-with-curl/7753/23

Twitter updated the api to 1.1 so the user/pw authentication has been moved to OAuth.

So the simple https://stream.twitter.com/1/statuses/sample.json54 demo in your browser will need the hashkey generated authentication details under the twitter app dev details.

https://dev.twitter.com/116 -> My Applications under your name in top right -> Add new.
Generate your authentication details.
Oath tool -> Request URI -> paste https://stream.twitter.com/1.1/statuses/sample.json57 and hit Create request
Paste the command into your termnal ie. curl –get ‘https://stream.twitter.com/1.1/statuses/sample.json’ –header ‘Authorization: xxxxxxxxxxxxxxxxxxxxx”‘ –verbose
You should see a bunch of twitter streams in real time…
This request will eventually time out.

Magoo


https://dev.twitter.com/streaming/reference/post/statuses/filter
swagger.js で OpenAPIドキュメントをコード操作する

 
Swagger.js を使えば作成したOpenAPI ドキュメントが簡単にJSから操作できるようになります。

https://github.com/swagger-api/swagger-js

## Getting Started

とりあえずSwaggerファイルからAPIを読み込んでリクエストを送ってみます。

npm i でモジュールを読み込み

````
$ npm i swagger-client
````

サンプルコードを記述。Swaggerファイルは例のペットショップAPIのサンプルを利用し、URLで記述します。

````
var Swagger = require('swagger-client');

var client = new Swagger({
  url: 'http://petstore.swagger.io/v2/swagger.json',
  success: function() {
    client.pet.getPetById({petId:7},{responseContentType: 'application/json'},function(pet){
      console.log('pet', pet);
    });
  }
});
````

`node` コマンドで上記ファイルを実行すると、画面上にAPIレスポンスが表示されるはずです。


### client オブジェクト

client オブジェクトにはAPIコール用の様々な関数が格納されています。

各種APIはタグごとにまとまり、各タグのキーの下に`operationId`で指定した名前でAPIコール用の関数が用意されるようになっています。
(上記例ではpetタグが付けられた、operationId: getPetById のAPIをコールしている。)

`parameters`セクションの記述にのっとり第一引数で、入力パラメータを記述します。

内部的にはsuperagentを使用しているみたいなので、cbはそんな感じです。 

## ローカルファイルの読み込み

fsモジュールを使って、ローカルファイルを取り込んで食わせる事も出来るっぽいです。

````
var Swagger = require('swagger-client');
var fs = require('fs');

var fs = require('fs');
var text = fs.readFileSync(__dirname + '/swagger.json', 'utf-8');

var spec = JSON.parse(text);

var client = new Swagger({
    spec,
    success: function() {
        client.pet.getPetById({petId:7},{responseContentType: 'application/json'},function(pet){
            console.log('pet', pet);
        });
    }
});
````

Yaml でやりたければ`js-yaml`とか使います。

````
var Swagger = require('swagger-client');
var fs = require('fs');
var yaml = require("js-yaml")

var fs = require('fs');
var text = fs.readFileSync(__dirname + '/../swagger.yml', 'utf-8');

var spec = yaml.safeLoad(text);

var client = new Swagger({
    spec,
    success: function() {
        client.pet.getPetById({petId:7},{responseContentType: 'application/json'},function(pet){
            console.log('pet', pet);
        });
    }
});
````

ゴニョゴニョする前に内容触りたい時(ホストとか)あると思うので、そのへんが必要な場合、URL指定よりもspec指定の方が良さそう。

## Promiseの利用

第一引数に`usePromise: true`を渡すことでPromise形式の利用も可能。この場合、パース結果はthenクロージャの内部で受け取る形になる。

````
var Swagger = require('swagger-client');

new Swagger({
  url: 'http://petstore.swagger.io/v2/swagger.json',
  usePromise: true
})
.then(function(client) {
  client.pet.getPetById({petId:7})
    .then(function(pet) {
      console.log(pet.obj);
    })
    .catch(function(error) {
      console.log('Oops!  failed with message: ' + error.statusText);
    });
});
````

その他第一引数のパースに関しては、下記当たりのコードを見るとわかりやすそう

https://github.com/swagger-api/swagger-js/blob/master/lib/client.js#L115-L177

## リクエストの発行
 
body パラメータは 第一引数に `{body: { ... }}` で送れるよう。

第二引数の リクエスト形式は省略可能。xmlとか指定したい時にはご利用下さい。