OmniAICreator/Qiita-1.07M huggingface dataset:
Azure Search の検索トラフィックを分析して精度を向上


Azure Searchを活用して検索サービスを実装した場合、ユーザーの入力情報などをもとに継続的に検索精度を改善できるとより使いやすいサービスになるだろう。精度が悪ければゴーストサービスになることは目に見えている。Azureの検索サービスであるAzure SearchにはAzure Application InsightsのCustom Eventをベースとしたテレメトリー機能がありPower BIで可視化することができるのでここで解説したい。
Azure Portal で Search traffic analytics を選択して既存、もしく新規のApplication Insightsを選択する。
![image](https://qiita-image-store.s3.amazonaws.com/0/33998/51983509-77fe-6459-5cb9-2c24a3efecfe.png)

Application Insightsにテレメトリーデータを送るためのサンプルコード。特徴的なのはトラッキングするためのsearchIdがあるところだろうか。データ送信ではいったんメモリにバッファリングするためタイムラグがある。テストしにくかったのでここでは強制的にメッセージを送るためのtelemetryClient.Flush();を呼び出している。

```csharp
var activity = await result as Activity;
searchText = activity.Text;

var client = new SearchIndexClient(searchServiceName, indexName, new SearchCredentials(adminApiKey));
var headers = new Dictionary<string, List<string>>() { { "x-ms-azs-return-searchid", new List<string>() { "true" } } };
var response = await client.Documents.SearchWithHttpMessagesAsync(searchText: searchText, searchParameters: parameters, customHeaders: headers);

IEnumerable<string> headerValues;
string searchId = string.Empty;

if (response.Response.Headers.TryGetValues("x-ms-azs-searchid", out headerValues))
{
    // get searchID
    searchId = headerValues.FirstOrDefault();
}

// Tracking Query
var properties = new Dictionary<string, string> {
    {"SearchServiceName", searchServiceName},
    {"SearchId", searchId},
    {"IndexName", indexName},
    {"QueryTerms", searchText},
    {"ResultCount", resultCount},
    {"ScoringProfile", ""}
};

// Send Custom Event
var telemetryClient = new TelemetryClient();
telemetryClient.InstrumentationKey = instrumentationKey;
telemetryClient.TrackEvent("Search", properties);
telemetryClient.Flush();
```

テレメトリーデータは指定したApplication InsightsでCUSTOM EVENTとして確認できる。
![image](https://qiita-image-store.s3.amazonaws.com/0/33998/ac782033-2633-eb28-1fb3-54ddbb669ade.png)

Azure Search の Search traffic analyticsからPower BIのレポートをダウンロード出来る。
![image](https://qiita-image-store.s3.amazonaws.com/0/33998/f58cc284-6e17-dc63-3df1-c9c9e9f8a64d.png)


ダウンロードしたPower BI にはには以下のように便利なフィールドが予め用意されているのですぐに活用できる。
![image](https://qiita-image-store.s3.amazonaws.com/0/33998/f420a2c3-8aee-15ab-f6cb-61a5c084d2d7.png)

こんな感じ
![image](https://qiita-image-store.s3.amazonaws.com/0/33998/72df64a1-0d59-3e1c-180f-2d73dc94a93b.png)
CSSホバー処理のパフォーマンスや滑らかさなどを考慮した最適なコードを考察

ホバー処理をした一般的なボタンを題材に、パフォーマンスや滑らかさなどを考慮した最適なコードを考察してみたいと思います。

1. ホバー処理にGPU処理を取り入れて滑らかな動きにする
2. will-changeでブラウザに事前通知してパフォーマンスを改善
3. Safari（時々IE）でのちらつき防止

```css
.element {
	box-shadow: 5px 4px 0px 0 rgba(0,0,0,0.2);
	transform: translate3d(0, 0, 0) perspective(0);
	transition: all 1s ease-out;
	backface-visibility: hidden;
}
.element:hover {
	will-change: transform, transition, box-shadow;
	box-shadow: 3px 2px 0px 0 rgba(0,0,0,0.2);
	transform: translate3d(2px, 2px, 0) perspective(0);
}
```

**想定する動き**
マウスオンしたら
- 右に2px
- 下に2px
- 影とボタンの距離が近くなる（様に見せてる）

というようなエフェクトを想定しています。

# ホバー処理にGPU処理を取り入れて滑らかな動きにする

ホバー処理は、```transform: translate3D()```とすることでGPUアクセラレーションが有効になりパフォーマンスが向上する。
簡潔に書くと、アニメーション処理をソフト（ブラウザ）が行うのではなく、ハード（グラフィックボード）が行うから滑らかな動きが実現する。
（一説には2D[translateやtranslateX、translateY]でも同結果が得られるらしいが、割愛）

**参考**
[Webアニメーションを高速化するために知っておくべき10のこと（前編）](https://html5experts.jp/cssradar/2027/)
[Web制作にGPU処理を取り入れる](https://w3g.jp/blog/web_gpu_adopt)

# will-changeでブラウザに事前通知してパフォーマンスを改善

will-change を使用すると、要素のプロパティを変更する予定があることをブラウザに事前通知し、パフォーマンスを向上させることが出来る。（IE11、Edge以外）

*will-change仕様のエディタであるタブ･アトキンス･ジュニアの引用*
> will-changeは、実際に変化させるプロパティ、実際に変化が生じる要素に設定してください。そして、変化が終了したら削除してください。

**参考**
[CSS will-changeプロパティについて知っておくべきこと](https://dev.opera.com/articles/ja/css-will-change-property/)

# Safari（時々IE）でのちらつき防止

以下のコードでSafariやIEでのアニメーション時のちらつきを防止しています。

```css
backface-visibility:hidden;
transform: perspective(0);
```

TransformとTransitionを組み合わせている場合に、ちらつくことがあり背景色を指定しても発生することがあるそうな。
ただ私の制作時の現象では、Safariではなく、IE11で同現象が確認されました。
同様に上記のコードを書いたら解決したので、参考にさればと思います。

**参考**
[Safari 8で​CSS transformを​指定した時に​ちらつくときの​解消法](https://yumeirodesign.jp/blog/201411/safari8_css_transform.html)
[CSS Transformsで​画面がちらつく​ときの対処法](https://yumeirodesign.jp/blog/201312/csstransforms_fixed.html)



以上、参考になれば幸いです。
間違っていることなどあったら是非コメントください。
読んでる記事を Twitter 共有するブックマークレット#NowBrowsing 

[#NowBrowsing](https://twitter.com/search?q=%23NowBrowsing&src=typd) は音楽を共有する [なうプレ](https://twitter.com/search?q=%23NowPlaying&src=typd) のブラウジング版です。

実は Chrome Extension も複数作られています。
自分が使っている理由は、シェアボタンがないページの共有や、なうプレと同じ感覚です(自分の行動ログのシェア)。


### コード

```js
(function() {
    const url= window.location.href ;
    const encodedUrl = encodeURIComponent(url);
    const text = encodeURIComponent(`見てる - ${document.title}`);
    const twitterShareUrl = `https://twitter.com/intent/tweet?text=${text}&url=${encodedUrl}&hashtags=NowBrowsing`;
    console.log(twitterShareUrl);
    window.open(twitterShareUrl, '', 'width=550, height=420');
})();
```

↓ブックマークする対象

```js:Bookmarklet
javascript:(function() { const url= window.location.href ; const encodedUrl = encodeURIComponent(url); const text = encodeURIComponent(`見てる - ${document.title}`); const twitterShareUrl = `https://twitter.com/intent/tweet?text=${text}&url=${encodedUrl}&hashtags=NowBrowsing`; console.log(twitterShareUrl); window.open(twitterShareUrl, '', 'width=550, height=420'); })();
```

### なぜブックマークレットなのか
小さな Chrome Extension をいれるとメンテナンスされずに突然使えなくなる経験が多かったことが一つです。
特に今回は"Twitterにテンプレートつきで投稿する"だけの小さな機能です。Chrome Extension はオーバースペックかなという印象です。
最近ちょっとしたことにはブックマークレットをよく作っています。Chrome Extension 作るまでもないときに味がよいです。

※決して Chrome Extension Disではありません。
bitbucketのAPIを使って、ダウンロードファイルの作成/取得を行う

bitbucketのAPIを使って、ダウンロードファイルの作成と取得を行うことができます。
これを利用すれば、例えばバイナリファイルのデプロイを行うことができます。


# アプリパスワードの作成

APIの認証にはBasic認証を使うことも出来ますが、パスワードを晒したくない場合はアプリパスワードで認証することをお勧めします。
以下のリンクを参考に、アプリパスワードを作成してください。
また、ダウンロードファイルのAPIを利用するため、リポジトリの書き込み権限を付与してください。

- [App passwords](https://confluence.atlassian.com/bitbucket/app-passwords-828781300.html)


# ダウンロードファイル作成

[POST /2.0/repositories/{username}/{repo_slug}/downloads](https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Busername%7D/%7Brepo_slug%7D/downloads#post)

```
$ echo Hello World > hello.txt
$ curl --user $USER_ID:$APP_PASSWORD -X POST https://api.bitbucket.org/2.0/repositories/evzijst/git-tests/downloads -F files=@hello.txt
```

# ダウンロードファイル取得

[GET /2.0/repositories/{username}/{repo_slug}/downloads/{filename}](https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Busername%7D/%7Brepo_slug%7D/downloads/%7Bfilename%7D)

```
$ curl --user $USER_ID:$APP_PASSWORD -L https://api.bitbucket.org/2.0/repositories/evzijst/git-tests/downloads/hello.txt
Hello World
```
Unity2017 Androidでfirebase周りのSDKをいれた際にハマったいくつかのエラー



# android ビルド周りエラー備忘録


## 各SDKのminバージョン周り。

```

Error: Error while saving blame file, build will continue
Error: 要素タイプ"uses-sdk"に関連付けられている属性"tools:overrideLibrary"の接頭辞"tools"がバインドされていません。

UnityEditor.BuildPlayerWindow:BuildPlayerAndRun()

```




そもそもuses-sdkを消すか、

> 参考　http://y-anz-m.blogspot.jp/2015/09/minsdkversion.html

この素晴らしすぎる対応でoverrideするか。

僕の場合は、uses-sdkを消しても駄目だったので、
Assets/Plugins/Android/AndroidManifest.xml
大元のこれを一旦削除しました。

複数のAndroidManifestの統合は、下記リファレンスにて

> 参考 https://developer.android.com/studio/build/manifest-merge.html?hl=ja



## google play service 周りの重複エラー（毎度ひっかかる

```

CommandInvokationFailure: Unable to convert classes into dex format.
/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/bin/java -Xmx2048M -Dcom.android.sdkmanager.toolsdir="/Users/yo_matsuda/Library/Android/sdk/tools" -Dfile.encoding=UTF8 -jar "/Applications/Unity/PlaybackEngines/AndroidPlayer/Tools/sdktools.jar" -


stderr[
Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/google/android/gms/internal/zzehl;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/google/android/gms/internal/zzehm;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/google/android/gms/internal/zzehf;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/google/android/gms/internal/zzehg;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/google/android/gms/internal/zzehh;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/google/android/gms/internal/zzehi;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/google/android/gms/internal/zzehj;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/google/android/gms/internal/zzehk;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/google/android/gms/internal/zzbcc;


```

僕の場合は、
firebase-analytics-11.2.0と、
firebase-analytics-impl-11.2.0
が重複していたのが原因でした。

なんだimplって。汗
Unity 動的にskyboxのMaterial/Shaderの色を変更する（昼から夜など）

## 既にLightningに設定済みの場合

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37406/02a9b8cc-6bc0-bbf5-3371-d5a0cd68aa66.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37406/279225b2-c2c3-fe8f-de15-f697622e511b.png)

のGradientSkyboxのパラメータであるTopColorとBottomColorをスクリプトで変更する例

```
Material m = new Material(RenderSettings.skybox);
m.SetColor("_Color1",Color.blue);
m.SetColor("_Color2",Color.red);
RenderSettings.skybox = m;

```

_Color2とかは、個別のMaterial/Shaderのパラメータ名。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37406/16c8dfb7-2223-8390-dfd7-a4775f08f1d5.png)

パラメータは、ここの歯車アイコンから、edit shaderでみれます。
エンジニアとしての働き方

開発自体に関係ないかもしれないが、今後エンジニアとして働く上で気をつけようと思うことを備忘録として残しておこうと思います。

# 注意すること
###直接のコミュニケーションを放棄しない
電話やメール、チャット、LINE、コミュニケーションの方法はいろいろあるが、大事な内容ほど対面で行うべき。開発業務といえどツールに頼りすぎるのはやめる。
###失敗を恐れない（むしろ挫折を味わう）
人間、成功より失敗の方が記憶に残るもの。むしろ他人からの指摘をもらえることを喜びだと感じる。
###やばくなったら意地を張らずに相談
「無理をする」は正解ではないし、「ヘルプやアドバイスをお願いする」は恥ずかしいことではない。
気を使いすぎるのは損な場合が多いことはあらかじめ知っておく。
###周りの人に迷惑をかけない
当然だが、開発の多くは自分だけで進めているわけではない。
些細なことでも迷惑になる可能性があるので、判断に迷った時は自分だけで決めず誰かの意見をもらう。
###大人として恥ずかしくない行動をとる
エンジニアである前にいい歳の大人。
常識的に考えて、最低限のルールは守る。
知らずに、注意された場合は素直に受け入れる。
全角英数字入力を強制するようなスマホ向けページで最低限できること

#はじめに

~~全ての入力フォームで全角英数時を強制するようなシステムを生まれる前に消し去りたい~~

スマホ向けの入力フォームにおいて**システム上の問題でどうしても全角英数字を使わざるを得ない**状況ってあるんですよね。ふしぎー。
特にiPhoneでの全角英数字はめんどくさいんですよね。

※ほぼ愚痴です。

#全角英数字問題

本当に滅んで欲しい。

##「全角で入力してください」と注意するだけで何もしてくれない

大抵の全角判定はこんな感じかと思います。（正規表現での書き方はいろいろあるみたい）

```js:あくまで例
function isEmCharacter(str) {
  return /^[^ -~｡-ﾟ]+$/.test(str);
}

isEmCharacter('ABC');     // false
isEmCharacter('ＡＢＣ');  // true
isEmCharacter('ＡBＣ');   // false
```

全角か半角かの判定はまぁいいです。
けど、入力漏れでもないのに入力をやり直させるという、ユーザーの事を考えてない感があって個人的に凄く不快です。

##全角ハイフンどれだよ問題

住所入力などで全角のハイフンを入力する事もありますが、これ、凄く腹立たしい。
~~住所の全角縛りとか馬鹿じゃないの~~

さあ、あなたはどれが全角ハイフンかわかりますか？

1. `ー`
2. `－`
3. `-`
4. `—`
5. `‐`
6. `–`
7. `−`
8. `‒`
9. `─`
10. `―`
11. `ｰ`
12. `━`

まぁこれはネタ的な部分もありますが、答えは5番の `‐` です。

しかし、中には全角マイナス `－` を全角ハイフンとして扱うシステムもあるときた。もうわけがわからない！

変換候補に出てくる記号を見て「全角ハイフンはこれかな」と入力しては注意され入力をやり直す……
これほど無駄なことはありません。

#入力をやり直させないために

**システム上どうしても全角英数字を使わざるを得ない状況**なのであればフロント側でフォローするべきだと思います。

##半角英数字を全角に自動的に置換する

とりあえずユーザーに入力させてから、半角英数字を全角に置換するだけでもとても優しい世界になると思いませんか？

```js:あくまで例
function replaceCharacter(str) {
  return str.replace(/[A-Za-z0-9!?#$%&@]/g, function (s) {
    return String.fromCharCode(s.charCodeAt(0) + 65248);
  });
}

replaceCharacter('ABC');  // "ＡＢＣ"
replaceCharacter('123');  // "１２３"
```

##ハイフンに似た記号などを入力してもいい感じにする

住所を全角で入力する時に使う横棒の記号は大抵長音記号 `ー` か全角ハイフン `‐` だけで、それ以外の記号を住所に使うことはないはず。

```js:あくまで例（全角ハイフンへ置換）
function replaceCharacter(str) {
  str = str.replace(/[A-Za-z0-9!?#$%&@]/g, function (s) {
    return String.fromCharCode(s.charCodeAt(0) + 65248);
  });
  return str.replace(/[-－—–−‒─―ｰ━]/g, '‐');
}

replaceCharacter('1-2');    // "１‐２"
replaceCharacter('5━4−3');  // "５‐４‐３"
```

```js:あくまで例（全角マイナスへ置換）
function replaceCharacter(str) {
  str = str.replace(/[A-Za-z0-9!?#$%&@]/g, function (s) {
    return String.fromCharCode(s.charCodeAt(0) + 65248);
  });
  return str.replace(/[-‐—–−‒─―ｰ━]/g, '－');
}

replaceCharacter('1-2');    // "１－２"
replaceCharacter('5‐4−3');  // "５－４－３"
```

番地のみの入力などで長音記号も全角ハイフンにしたいのであれば、上記のコードに長音記号も追加するといいです。

こんな風に使えます。

```js:jQuery
$('#address').change(function () {
  this.value = replaceCharacter(this.value);
});
```

#おわりに

スマホ向けページなら半角も許容しよう！
最近Chromeがやらかした対策

# 最近、Chromeがやらかした
※これを書いているのは2017.10

## 症状
```
ERROR:sandbox_linux.cc(344)
```
とか
```
secret service operation failed: The name org.freedesktop.secrets
```
とか抜かして起動しない。

## 原因

どうやらChromeが自前でアカウントを管理しなくなったのが原因。

## 対策
```
sudo apt-get install gnome-keyring
```
みたいな感じに「gnome-keyring」をインスコする。もっとも、アカウント情報をいろいろ忘れてくれているので苦労するだろう。クッキーベース認証だとそのまま継続して認証できるようだ。

うちではtwitterが大丈夫で、google+やgmail、Facebook、LinkedIn、GitHub、BitBucketとそれらにぶら下がってるアカウントがダメだった。

その上パスワードの類も全滅なので被害甚大...対策になってないね。

参考→https://dicas-de-linux.blogspot.jp/2012/05/name-orgfreedesktopsecrets-was-not.html
sedでゼロパディングを解除（行頭のゼロを削除）する


* 0 -> 0
* 0000 -> 0
* 0102030405000 -> 102030405000
* 00000102030405000 -> 102030405000
* 1 -> 1
* 12 -> 12
* 11112222 -> 11112222

こんなような感じのゼロパディング（ゼロ埋め）解除をやりたい。

## 正規表現

こんな感じになった。

```regexp
s/0*\([0-9]*[0-9]$\)/\1/g
```

`\1`は1個目にマッチした部分文字列を切り出すという意味らしい。
最初、行頭からマッチさせてマッチした部分を空白で置換させようとしてたのだけど、`00`などがくる場合の条件の書き方がわからなかった。
「マッチした部分を置換」ではなく「マッチした部分文字列の切り出し」にしたらすっきり書けた（気がする）。

## 実行例

```shell-session
$ echo 0 | sed 's/0*\([0-9]*[0-9]$\)/\1/g'
0
$ echo 0000 | sed 's/0*\([0-9]*[0-9]$\)/\1/g'
0
$ echo 0102030405000 | sed 's/0*\([0-9]*[0-9]$\)/\1/g'
102030405000
$ echo 00000102030405000 | sed 's/0*\([0-9]*[0-9]$\)/\1/g'
102030405000
$ echo 1 | sed 's/0*\([0-9]*[0-9]$\)/\1/g'
1
$ echo 12 | sed 's/0*\([0-9]*[0-9]$\)/\1/g'
12
$ echo 11112222 | sed 's/0*\([0-9]*[0-9]$\)/\1/g'
11112222
```

## 参考

* [フィルタを使用した文字列操作 1 | UNIX & Linux コマンド・シェルスクリプト リファレンス](http://shellscript.sunone.me/filter_sed.html#%E7%89%B9%E5%AE%9A%E3%81%AE%E4%BD%8D%E7%BD%AE%E3%81%AE%E6%96%87%E5%AD%97%E5%88%97%E3%82%92%E5%88%87%E3%82%8A%E5%87%BA%E3%81%99)
Amazon Linux:node.jsからAngularのサンプルアプリ作成まで


いろいろてこずったので以下に纏めました。一発で動くはずです。

## node
### インストール

```
cd /tmp
curl --silent --location https://rpm.nodesource.com/setup_8.x | sudo bash -
sudo yum -y install nodejs
sudo yum -y install gcc-c++ make
```

### バージョン確認

```
node -v
v8.6.0

npm -v
5.3.0
```

### npmのデフォルトディレクトリ変更

これを実施しないとAngularのインストールが失敗する。
参考URL:https://qiita.com/okoysm/items/ced3c3de30af1035242d
（@okoysmさん、ありがとうございます）

```
cd
mkdir .npm-global
npm config set prefix '~/.npm-global'
vi .bash_profile
```

PATHを通す

```.bash_profile
- PATH=$PATH:$HOME/.local/bin:$HOME/bin
+ PATH=~/.npm-global/bin:$PATH:$HOME/.local/bin:$HOME/bin
```

.bash_profileを再読込してパスを有効化

```
source .bash_profile
```

## Angular
### インストール

```
npm install -g @angular/cli
```

### アプリ作成

こちらの内容です：https://angular.io/guide/quickstart

```
ng new my-app
```

### ng serve実行

```
cd my-app
ng serve --host=0.0.0.0 --public=グローバルIPもしくはFQDN
```

## EC2
### 4200番ポートへの接続を許可する

![image.png](https://qiita-image-store.s3.amazonaws.com/0/73576/c8e7d9f2-dadb-4d7d-c6ea-e8e9f9c45aaa.png)


## 確認

http://グローバルIP:4200/

をブラウザで開く
C++ Builder > 通信台数を4から1に変更した時 > Error: モジュール '何がしのプログラム.exe'のアドレスXXXXでアドレスYYYYに対する読み取り違反がおきました。' > 特定方法 | 原因 | 技術的負債

```txt:動作環境
C++ Builder XE4
```

### 変更内容

- 四台の装置との通信ソフトをベースに一台の装置との通信ソフトを作成
    - static const int定義を4から1に変更

実行すると以下となる。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/dedede32-4278-e174-80b1-913a80e7344d.png)


### 関連

[C++ Builder > Error: モジュール '何がしのプログラム.exe'のアドレス0044392Eでアドレス000005B5に対する読み取り違反がおきました。' > 原因の特定 | 原因](https://qiita.com/7of9/items/f6ecb279a7dde2f6be71)

リンク先の方法で原因を特定しようとしたが分からなかった。
VCLのソースにリンクされるだけで、自前実装のソースのエラーは特定できない。

### 原因の特定方法 (今回の思いつき)

1. gitでチェックインしておく
    - 元に戻せるように
2. 二..四台目関連のフォームコンポーネントを削除
3. IDEでビルド
    - 削除コンポーネント関連のエラーが出るので、削除していく
4. 削除後ビルド
    - 実行できた
5. gitで差分を見る
    - 関連関数のリストアップ
6. gitで元に戻す
7. 手順5でリストアップした処理を逐次コメントアウトしビルド・実行
    - エラーが出なくなる部分が問題箇所

### 問題の箇所

```cpp
void __fastcall TXXXForm::SetTPanelPointers(TPanel *srcPtr, int DEVidx, int panelIndex)
{
	m_panelPointers[DEVidx][panelIndex] = srcPtr;
}
```

上記が問題。インデックスの範囲をチェックする実装がもれている。
加えて、下記の処理があるために、DEVidx=1以降でメモリ関連エラーが発生したということだった。

```cpp
	SetTPanelPointers(P_DEV1_group1, /* DEVidx=*/ 0, /*panelIndex=*/ 0);
	SetTPanelPointers(P_DEV1_group2, /* DEVidx=*/ 0, /*panelIndex=*/ 1);
	SetTPanelPointers(P_DEV2_group1, /* DEVidx=*/ 1, /*panelIndex=*/ 0);
	SetTPanelPointers(P_DEV2_group2, /* DEVidx=*/ 1, /*panelIndex=*/ 1);
	SetTPanelPointers(P_DEV3_group1, /* DEVidx=*/ 2, /*panelIndex=*/ 0);
	SetTPanelPointers(P_DEV3_group2, /* DEVidx=*/ 2, /*panelIndex=*/ 1);
	SetTPanelPointers(P_DEV4_group1, /* DEVidx=*/ 3, /*panelIndex=*/ 0);
	SetTPanelPointers(P_DEV4_group2, /* DEVidx=*/ 3, /*panelIndex=*/ 1);
```

### 今後の予防策

SetTPanelPointers()内において「DEVidxの範囲外エラー」、「panelIndexの範囲外エラー」チェックを追加する。
範囲外エラー発生時にはデバッグウィンドウなりにエラーメッセージが表示されるようにする。

```cpp
void __fastcall TXXXForm::SetTPanelPointers(TPanel *srcPtr, int DEVidx, int panelIndex)
{
	if (DEVidx > kNumDEV) {
		String msg = L"XXXUnit: Line985 > Error: [DEVidx] out of range";
		OutputDebugString(msg.c_str());
		return; // error
	}
	if (panelIndex > kNumPanel) {
		String msg = L"XXXUnit: Line990 > Error: [panelIndex] out of range";
		OutputDebugString(msg.c_str());
		return; // error
	}
	m_panelPointers[DEVidx][panelIndex] = srcPtr;
}
```

実際に実行すると、IDEにて下記の表示がされるようになった。

```txt:デバッグ出力
デバッグ出力: XXXUnit: Line985 > Error: [DEVidx] out of range プロセス XXX.exe (1364)
デバッグ出力: XXXUnit: Line985 > Error: [DEVidx] out of range プロセス XXX.exe (1364)
デバッグ出力: XXXUnit: Line985 > Error: [DEVidx] out of range プロセス XXX.exe (1364)
デバッグ出力: XXXUnit: Line985 > Error: [DEVidx] out of range プロセス XXX.exe (1364)
```

同じような失敗をしていそうなコードを探して対処する。

### 技術的負債
(追記 2017/10/06)

およそ700の関数のうちで13の関数で同じ失敗をしていた。
対策をしておいた。

将来的にstatic const int変数を変更時に発生する「技術的負債」を自分が作ってしまったのは残念ではある。
一つ一つの関数作成時にもっと集中して行わないといけない。

@nonbiri15 さんの[品質は作りこまないかぎり実現できない](https://qiita.com/nonbiri15/items/bb5ab38b617f33ab4f65)
は金科玉条として胸に叩き込んでおいた方が良さそうです。
Bigquery | peco で連続してジョブ詳細を見るシェルスクリプト

最近の Bigqueryのジョブの中から、好きなものを選んで詳細を表示する。

- 連続して何個ものジョブ詳細を見ることが出来る。
- この例では最新1000件のジョブ履歴から探すようにした。

# 実行例

走らせるだけ。

```
bash bq_ls_peco.sh
```

# スクリプト

```bash
# Usage
# bash bq_ls_peco.sh [grep_text]
# 
# Example
# bash bq_ls_peco.sh
# bash bq_ls_peco.sh FAILURE

function finish {
  rm .bq_ls_peco
}

trap finish EXIT

function read_bq_jobs {
  echo "Read bq jobs, just wait a minute."
  bq ls -j -a -n 1000 > .bq_ls_peco
}

read_bq_jobs

if [ -n "$1"]; then
  readonly grep_mode='RUNNING\|FAILURE' 
else
  readonly grep_mode=$1
fi

trap
while true; do
  bq show -j --format=prettyjson $(cat .bq_ls_peco | grep "$grep_mode" | peco | awk '{print $1}')

  echo -e "\nPlease enter and another next job, or hit \"exit\" \"reload\""
  read ans

  if [ "$ans" == exit ]; then
   exit
  elif [ "$ans" == reload ]; then
    read_bq_jobs
  fi
done
```

# 環境

- Google Cloud SDK 174.0.0
- bq 2.0.27
- bash 4.4








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Ubuntu 16.04 で inode 枯渇問題

以下のコマンドで inode の使用状況を確認できます。

```
% df -i
```

以下のコマンドでファイル数の多いディレクトリを探索できます。

```
% for dir in `ll|grep ^d|grep -v "\./"|awk '{print $9}'`; do echo `sudo find ./$dir -true|wc -l` `pwd`/$dir; done | sort -nr
```

```
% sudo apt-get autoremove
```

- https://askubuntu.com/questions/575793/apt-get-unable-to-autoremove-packages-filling-up-inodes
- https://askubuntu.com/questions/361529/usr-src-is-eating-up-all-inodes
janusのセットアップ


- Ubuntu Server 17.04 を想定

## 依存パッケージのインストール

```shell-session
apt install libmicrohttpd-dev libjansson-dev libnice-dev libssl-dev libsrtp-dev libsofia-sip-ua-dev libglib2.0-dev libopus-dev libogg-dev libcurl4-openssl-dev pkg-config gengetopt libtool automake
```

## libsrtpのビルドとインストール

```shell-session
wget https://github.com/cisco/libsrtp/archive/v2.0.0.tar.gz
tar xzf v2.0.0.tar.gz
cd libsrtp-2.0.0/
./configure --prefix=/usr --enable-openssl
make shared_library && sudo make install
```

## janusのビルドとインストール

```
git clone https://github.com/meetecho/janus-gateway.git
cd janus-gateway
sh autogen.sh
./configure --prefix=/opt/janus --disable-websockets --disable-data-channels --disable-rabbitmq --disable-mqtt
make
sudo make install
sudo make configs
```
Ubuntu 16.04 で mkmf.rb can't find header files が発生する

[こちらの記事](https://qiita.com/satzz/items/0361a7093a57b459e15b) の Ubuntu 版です。
`debug_inspector` をインストールしようとすると `mkmf.rb can't find header files for ruby` が出ました。

```
% sudo gem install debug_inspector -v '0.0.2'
Fetching: debug_inspector-0.0.2.gem (100%)
Building native extensions.  This could take a while...
ERROR:  Error installing debug_inspector:
        ERROR: Failed to build gem native extension.

    current directory: /var/lib/gems/2.3.0/gems/debug_inspector-0.0.2/ext/debug_inspector
/usr/bin/ruby2.3 -r ./siteconf20171005-19309-25akqd.rb extconf.rb
mkmf.rb can't find header files for ruby at /usr/lib/ruby/include/ruby.h

extconf failed, exit code 1

Gem files will remain installed in /var/lib/gems/2.3.0/gems/debug_inspector-0.0.2 for inspection.
Results logged to /var/lib/gems/2.3.0/extensions/x86_64-linux/2.3.0/debug_inspector-0.0.2/gem_make.out
```

`ruby-dev` をインストールすると解決します。

```
% sudo apt-get install ruby-dev
% sudo gem install debug_inspector -v '0.0.2'
```
[メモ]Laravel5.4でブログシステムを作る03(ルーティング)


#基礎知識
#＃laravelのルーティングについて

routesは　routes/web.phpファイルに編集する

###基本的なルーティングの例:

```php
Route::get($uri, $callback);
Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);
```


```php
Route::get('/', function () {
    return view('welcome');
});
```


Routeクラスのメソッドgetを使用するには引数は二つ必要：
1.‘／’　:ルートディレクトリ
2.コールバック関数：このルートの操作の内容。例えば、'welcome'というviewを描画

その他ルーティング:

```php
Route::get('/','[コントローラ]@[コントローラの中の行為]');
//複数のHTTP動詞に対応したルートを登録する必要
Route::match(['get','post'],'/posts','[コントローラ]@[コントローラの中の行為]');
//全HTTP動詞に対応する
Route::any('/posts','[コントローラ]@[コントローラの中の行為]')
```

例:

```php
Route::post('/posts','\App\Http\Controllers\PostController@index');
/*
<form action="/posts" method="POST"></form>
*/
```
もしHTTPメソッドはPUTならば：

```php
Route::PUT('/posts','\App\Http\Controllers\PostController@index');
/*
<form action="/posts" method="POST">
<input type="hidden" name="_method" value="PUT"/>
</form>

*/

//あるいは

/*
<form action="/posts" method="POST">
{{method_field（“PUT”）}}
</form>
*/
```




ルートパラメーター

```php
Route::get('/posts/{id}','[コントローラ]@[コントローラの中の行為]');

//コントローラのメソッド:
function index($id){
	$id=***;
}
```
ルートグループの使い方：もしルートの引数には共通部分があったら：

```php
Route::group(['prefix'=>'posts'],function(){
	Route::get('/','[コントローラ]@[コントローラの中の行為]']);
	Route::get('/{id}','[コントローラ]@[コントローラの中の行為]');
	Route::get('/create','[コントローラ]@[コントローラの中の行為]');
})
```

###モデル結合ルート
方法１：idでモデルを探す

```php
Route::get('/posts/{id}','\App\Http\Controllers\PostController@show');

//コントローラのメソッド:
function show($id){
	//モデルはpost
	$post=\App\Post::find($id);
		
}
```

方法２：暗黙の結合

Laravelは、リクエストされたURIの対応する値に一致するIDを持つ、モデルインスタンスを自動的に注入します。

```php
//{post}を使い，対応するテーブルの名前はposts、主キーはid
Route::get('/posts/{post}','\App\Http\Controllers\PostController@show');

//コントローラのメソッド:
function show(\App\Post $post){
	//.....
}
```
#文章記事モジュールのルートを作る
ルート及びコントローラーのメソッドは主に、本文の[機能要件](https://qiita.com/joycho/items/888c08e909c80f422681)にしたがって作っていきます。
![Blank Diagram - Page 1.png](https://qiita-image-store.s3.amazonaws.com/0/117741/00f69ff4-c6f1-664b-6be2-af7753f17a97.png)

次回→[[メモ]Laravel5.4でブログシステムを作る04(ルート、コントローラとデータベースの設定)](https://qiita.com/joycho/items/ac48479ab4183739560a)
Vimを起動した後に指定したコマンドを自動で実行させる方法

(2017年10月12日 コメントを踏まえて記事修正)

記事の内容はタイトルそのままですが、私はVimに [glidenote/memolist.vim: simple memo plugin for Vim.](https://github.com/glidenote/memolist.vim) というプラグインをインストールして活用しています。しかし、メモを取ろうとVimを起動する都度、以下の作業を行う必要があり、それが面倒でした。[^1]

[^1]: Vimで日本語文章を編集していると途中から日本語入力が異常に遅くなったことがあったため、今のところ、日本語文章の編集はATOMで行なっています。

1. Vimを立ち上げる
1. `:MemoNew`コマンドを実行する
1. メモのタイトルを入力する
1. メモをVimで編集するか、Vimを終了してATOMでメモを編集する。

そこで、「ターミナルからVimを起動するときに、コマンドラインモードのコマンドを指定して、Vimが起動したらそのコマンドが自動的に実行される方法」がないか調べたところ、以下の方法で対応できることが分かりましたので、参考までに記事にしました。

具体的には、以下のとおりオプションを指定してVimを起動させると、Vimが起動すると同時にコマンドが実行されます。

```bash
vim -c MemoNew

# Vim起動後、:MemoNewコマンドが自動で実行され、メモのタイトルを入力する画面が表示される。
```

`-c`オプションの説明ですが、`vim --help`（ターミナル）と`:h -c`（Vimのヘルプ）で次のとおり説明されています。

> vim --help
> -c <command> Execute <command> after loading the first file

> :h -c
> -c {command} 最初のファイルが読み込まれた後(加えてそのファイルに適用されるautocommandとmodelineが処理された後)に{command}が実行される。
> "command" はExコマンドとして解釈される。"command" にスペースを含んでいる場合にはダブルクォートで挟まれている必要がある(これは使われているシェルに依存する)。

最初のファイルが読み込まれた後にコマンドが実行されるというオプションのため、`-c`オプションではプラグインに関するコマンドが実行できます（`.vimrc`も読み込まれた後に実行されるため）また、`command`に指定するコマンドには、`:`が不要です。

なお、オプション`-c`は複数指定できますので、以下のコマンドも実行可能です。

```bash
vim -c MemoNew -c wq

# Vim起動後、:MemoNew コマンドが自動で実行され、メモのタイトルを入力する画面が表示される。
# メモのタイトルを入力したら、自動で「保存・終了」のコマンドを実行する。
# これで、メモのファイル（Markdownファイル）が作成されます。
```

ちなみに、Vimの標準コマンドを実行できれば良いという場合は以下の方法でもOKです。

```bash
vim --cmd vsplit

# 最初から左右２画面に分割します
```

`--cmd`オプションの説明は次のとおりです。

> vim --help
> --cmd <command> Execute <command> before loading any vimrc file
>
> :h --cmd
> --cmd {command} vimrcファイルを処理する前に{command}を実行する。それ以外は -c {command} と同じである。"-c" 引数とは別に、10個まで使うことができる。

`.vimrc`を読み込むより前にコマンドを実行するため、プラグインに関するコマンドは実行できませんが、Vimの標準コマンドは実行できません。このオプションを指定すると、`.vimrc`を読み込むより前に指定したコマンドを実行してくれます。そのため、プラグインに関するコマンドは実行できませんが、Vimの標準コマンドは実行できます。ただし、コメントでも指摘を頂いていますが、`.vimrc`と異なる設定をしようとしても、`.vimrc`が読み込まれた時点でそちらの設定が適用されます。
thorows -> U?, U?? への対処


# どうやって綺麗にしますか？

エラー処理特に書きたくない時、どうやって綺麗にしますか？（すわなち、 `U??` 型）

```swift
func foo() throws -> U? {
}

func bar() {
   guard let result = try? foo() else {
       return
   }
   guard let resultUnwrapped = result else {
       return
   }
   print(resultUnwrapped)
}
```


# 対応
#### flatMap

```swift
let result: U? = (try? foo()).flatMap { $0 }
```

#### `??` 演算子

```swift
let result: U? = (try? foo()) ?? nil
```

flatMapのほうが統一感があって良いと思いますが、お好みの方法で。

# 余談

```swift
Optional(nil) != nil
```

です。

```swift
let result: U?? = try? foo().flatMap { $0 }
```

のように `()` を忘れると何も書かないのと同じになって、バグになるので注意が必要です（やらかしました）
位置情報取得でonLocationChangedが呼ばれない現象を改善する

元記事は[こちら](https://tono-n-chi.com/blog/2017/10/locationmanager-onlocationchanged-is-not-called/)

Androidアプリで位置情報を取得するためにlocationManager.requestLocationUpdatesを実行しているのですが、
__GPSの効かない屋内で一向にonLocationChangedが呼び出されず位置情報が取得できない。__

もういい加減FusedLocationProviderClientを使えよという話かもしれませんが、今から変えるのも結構コストがかかるので既存をあまり変えないことを前提にしつつ…
何がいけないのかといろいろ調べた末にたどり着いた結論がこちら。

## providerをgetBestProviderで取得するのをやめる。

以前はこんなふうにproviderNameをgetBestProviderで取得していました。
これでGPSが有効ならGPS_PROVIDERがproviderNameとして返ります。

```java
String providerName = locationManager.getBestProvider(criteria, true);
locationManager.requestLocationUpdates(providerName, 300, 1, this);
```

しかし、これだと屋内のときにGPSが信号を受信せずにうまく動作せず、
NETWORK_PROVIDERなら取得できたはずの位置情報が取得できなくなってしまいます。

## requestLocationUpdatesを二度投げる

[Android Developersのサイト](https://developer.android.com/guide/topics/location/strategies.html#Updates)によると、

> You can also request location updates from both the GPS and the Network Location Provider 
> by calling requestLocationUpdates() twice—once for NETWORK_PROVIDER and once for GPS_PROVIDER.

とのことで、NETWORK_PROVIDERとGPS_PROVIDERの二度投げは許されるとのことでした。
というわけで、

```java
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 300, 1, this);
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 300, 1, this);
```

することで、GPSの効かない屋内でも無事に位置情報が取得できるようになりました。

## Lolipopで位置情報が取得できない場合がある？

検証端末で調べていたところ、1台どうしても位置情報が取得できない端末がありました。

この端末はsimを抜いており、バージョンは5.0。
調べてみると、[同じような現象が発生している人がいる](https://stackoverflow.com/questions/31906011/fused-location-provider-behavior-in-android-5-0-unexpected)ようなので、こればかりはどうしようもないのかもしれない…
Capybara(Poltergeist)でiPhoneのfeatureテストを実装する

# 環境
```
rspec (3.5.0)
capybara (2.13.0)
poltergeist (1.14.0)
```

アプリケーション側でUA（UserAgent）を見てPCかスマホか判断してView切り替えをしているので、UA偽装する方針で対応していきます。

# さっそく実装してみる（失敗例）
[stackoverflowの記事](https://stackoverflow.com/questions/13526577/capybara-poltergeist-override-user-agent)を参考に、iPhoneのUAを偽装したdriverを登録し、metadataを使ってcurrent_driverを切り替える方法です。

```ruby
Capybara.register_driver :poltergeist do |app|
  Capybara::Poltergeist::Driver.new(app)
end

Capybara.register_driver :poltergeist_iphone do |app|
  driver = Capybara::Poltergeist::Driver.new(app)
  # iphoneのUAを偽装する
  driver.headers = { 'User-Agent' => 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/9A334 Safari/7534.48.3' }
  driver
end

Capybara.configure do |config|
  config.default_driver    = :poltergeist
  config.javascript_driver = :poltergeist
end

RSpec.configure do |config|
  config.before(type: :feature) do |example|
    if example.metadata[:mobile]
      # mobileの場合、iPhone偽装したpoltergeistを設定する
      Capybara.current_driver = :poltergeist_iphone
    end
  end
end

# spec/features/hoge_spec.rb ============
# pc用のfeatureテスト
feature 'hoge' do
  scenario 'hoge1' do
    ...
  end
end

# iphone用のfeatureテスト
feature 'fuga（iphone）', :mobile do
  scenario 'fuga1' do
    ...
  end
  scenario 'fuga2' do
    ...
  end
end
```

うまくいった！...と思ったら、むむむ

```ruby
feature 'fuga（iphone）', :mobile do
  scenario 'fuga1' do
    ...
    # Capybara.current_driver => :poltergeist_iphone
    # page.driver.headers => {"User-Agent"=>"Mozilla/5.0 (iPhone; U; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/9A334 Safari/7534.48.3"}
  end
  scenario 'fuga2' do
    ...
    # Capybara.current_driver => :poltergeist_iphone
    # page.driver.headers => {}
  end
end
```

二つ目以降のscenario（fuga2）でなぜかUAが初期化されてる。。 :fearful: 

おそらく、

* fuga1が終了したタイミングでpoltergeist_iphoneのheader情報がクリアされる
* クリアされた状態のpoltergeist_iphoneを使ってfuga2に移行する

という感じなのかな..？ :thinking: 

# 解決策
これだとぜんぜん使えないので、各scenarioでdriverを切り替えるのではなく、UAを毎回上書きする方法で対応。

```ruby
Capybara.register_driver :poltergeist do |app|
  Capybara::Poltergeist::Driver.new(app)
end

RSpec.configure do |config|
  config.before(type: :feature) do |example|
    if example.metadata[:mobile]
      # mobileの場合、iPhone偽装する
      Capybara.page.driver.headers = { 'User-Agent' => 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/9A334 Safari/7534.48.3' }
    end
  end
end
```

うまくいった :ok_hand: 

### 参考
* [ruby on rails - capybara poltergeist - override user agent - Stack Overflow](https://stackoverflow.com/questions/13526577/capybara-poltergeist-override-user-agent)
* [teamcapybara/capybara: Acceptance test framework for web applications](https://github.com/teamcapybara/capybara)
* [teampoltergeist/poltergeist: A PhantomJS driver for Capybara](https://github.com/teampoltergeist/poltergeist)
Swagger入門&導入 on AWS EC2 Amazon Linux AMI〜Swagger Editor編

# はじめに
表題の通り。
入門→Swaggerなんぞやっていうのはググってください。
ほんとはね、Amazon API GatewayとかAWS Lambdaとか使いたいところなんだけどね。
色々な都合上ね。自分とこでやるならもっとイケてるアーキテクチャにするわ。なーんて。
今回はとりあえずswagger-editorを動かすとこまで。

*補足
連載物です。
swagger-editorはその名の通り、エディターですw
他のは今後でてきます。

# 事前準備
[こちら](https://qiita.com/yutaka_izumaru/items/75176c639ec30086005a)を参考にWebサーバー立てて置いてね。別にApacheでもNginxでもhttp-serverでもなんでもえーよ、たぶん。
ドキュメントルートは/var/www/htmlでっせ。

# 本編

node.js / npm / wgetが必要らしいよ。Amazon Linux AMIならたぶん最初っから入ってるっぽいよ（クリーンな環境用意するのがめんどくさかったので未確認）。
必要なら以下を。

```shell-session
$ sudo yum install -y nodejs
$ sudo yum install -y npm
$ sudo yum install -y wget
```

で、swagger-editor。

```shell-session
$ wget https://github.com/swagger-api/swagger-editor/archive/v3.1.9.zip
$ unzip v3.1.9.zip -d /var/www/html
$ mv /var/www/html/swagger-editor-3.1.9/ /var/www/html/swagger
```

ブラウザで http://hoge.com/swagger/ を開きましょう。
次からはこいつをベースにいじっていきまっせ。

by [株式会社Arrvis](http://www.arrvis.com/)
Windows 10 homeにVirtualBoxをインストールしてみる

#はじめに
Windows 10 homeの環境にCent OSを導入することを目的として、まずVirtual Boxをインストールする。
ちなみにVirual Boxは、ホストOSに複数の仮想マシン（ゲストOS）を作成して実行できる無償のツール。

#VirtualBoxのダウンロード
まず[VirualBox](https://www.virtualbox.org/ "VirualBox")のダウンロードサイトにアクセス。
"Downloads"をクリック。
![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/158038/d7cf7dbb-4edc-f1ef-711c-417000b4017e.jpeg)

Windows 10なので"Windows hosts"をクリックし、"VirtualBox-5.1.28-117968-Win.exe"をダウンロード。

#VirtualBoxのインストーラーを実行
ダウンロードした"VirtualBox-5.1.28-117968-Win.exe"をダブルクリック。
![キャプチャ3.JPG](https://qiita-image-store.s3.amazonaws.com/0/158038/4b239a4a-4d03-14ad-ec39-9ac8185cc6ff.jpeg)

"Next"をクリック。
![キャプチャ4.JPG](https://qiita-image-store.s3.amazonaws.com/0/158038/15c5e691-6fd9-ecc0-c1e2-469d0dd9f5e7.jpeg)

デフォルトのままとし、"Next"をクリック。
![キャプチャ5.JPG](https://qiita-image-store.s3.amazonaws.com/0/158038/3bfd7711-df1c-26a8-fde3-98619b49d733.jpeg)

デフォルトのままとし、"Next"をクリック。
![キャプチャ6.JPG](https://qiita-image-store.s3.amazonaws.com/0/158038/03a41b8f-f78e-3b57-b4df-302d282d5ca2.jpeg)

"Warning Network Interfaces"という警告がでるが、"Yes"をクリック。
要はインストールにあたってネットワーク設定がリセットされ、一時的にネットワークが切断されるという内容。
![キャプチャ7.JPG](https://qiita-image-store.s3.amazonaws.com/0/158038/3833600f-c574-f318-3437-18ac0e035db0.jpeg)

"Install"をクリック。
![キャプチャ8.JPG](https://qiita-image-store.s3.amazonaws.com/0/158038/c2f645a5-ee6b-cfe0-bb19-a955218aa0cd.jpeg)


インストールが実行される。処理時間は1,2分ほど。
![キャプチャ9.JPG](https://qiita-image-store.s3.amazonaws.com/0/158038/c61f6b23-6591-1d51-fed4-74dec6c246d6.jpeg)

インストールが完了したので"Finish"をクリック。
![キャプチャ10.JPG](https://qiita-image-store.s3.amazonaws.com/0/158038/d1e44e63-d567-f079-ea0b-bef959ebb023.jpeg)

Virtual Boxが起動する。
![キャプチャ11.JPG](https://qiita-image-store.s3.amazonaws.com/0/158038/d0dbe179-6cb7-382a-6792-3029aa5fc0fa.jpeg)

以上でVirtual Boxのインストールを確認した。
各ビットコイン取引所APIの認証で陥りやすいポイント

#ビットコインAPI取引の最初の壁
ビットコイン取引所のAPIを利用しようとして、おそらく殆どの人が最初につまづくのは認証の部分でしょう。
各取引所で微妙に仕様・作法が異なる上、エラーになっても「認証に失敗しました」などの、なんの手がかりも与えてくれない無慈悲なメッセージが帰ってくるだけです。
私自身も[裁定取引のアプリケーション](https://qiita.com/bitrinjani/items/3ed756da9baf7d171306)を作るにあたり、新しい取引所を追加するたびに、認証方式の微妙な違いにぶつかり手間取ってしましました。
自分の失敗を晒すことで、この記事が今後API取引にトライする方々の助けになればと思います。

#認証のフロー
はじめに、認証の一般的なフローを説明します。
プログラミング言語にかかわらず、HTTPリクエストを作成するという観点では同じフローになります。

1. 取引所Webサイトからキー、シークレットを発行する。
2. 各オペレーション(オーダー送信、ポジション取得等)のAPIのURLとパラメータリストを用意する。
3. 各取引所で定められた方式で各データを連結し、「メッセージ」文字列を作成する。
4. メッセージ文字列をシークレットを使ってハッシュ化する。
4. 適切なContent-Typeヘッダーを設定する。
5. その他のHTTPヘッダーを設定する。
6. HTTPリクエストを送信する。

どの取引所も、大枠としてはこのフローに従っているのですが、メッセージ文字列の作成方法等、各々で独自の加工が必要になります。
このフローのどの部分を間違えても、取引所からのエラーレスポンスは何が間違っていたのか教えてくれません。おそらく認証がうまくいかずAPI取引を諦めた人も多数いることかと思います。

# 認証方式テーブル

そこで、以下に各取引所の認証方式をテーブルにまとめました。

|Exchange|メッセージ内容|メッセージ連結方法|ハッシュアルゴリズム|Content-Typeヘッダー|その他の必須ヘッダー|
|----------|----------------|--------------------|---------------------|-----------------------|------------------------|
|Bitflyer|- Nonce <br>- HTTPメソッド名 <br>- パス: **/v1/me/から始まる文字列**|文字列の連結|HMAC-SHA256|application/json|- ACCESS-KEY<br>- ACCESS-TIMESTAMP <br>- ACCESS-SIGN|
|Coincheck|- Nonce <br>- URL: **httpsから始まるURL全体** <br>- リクエストボディ|文字列の連結|HMAC-SHA256|application/x-www-form-urlencoded|- ACCESS-KEY <br>- ACCESS-NONCE <br>- ACCESS-SIGNATURE|
|Quoine|- Nonce <br>- パス <br>- キー|**JSON Web Token**|HMAC-SHA256|application/json|- **X-Quoine-API-Version (常に“2”)** <br>- X-Quoine-Auth (シグニチャ) |
|Zaif|- Nonce <br>- APIメソッド名 <br>- APIパラメータ |クエリ文字列|**HMAC-SHA512**|application/x-www-form-urlencoded|- Key <br>- Sign|
|Bitbank|- Nonce <br>- **パス: /v1から始まる文字列** (GETリクエスト時のみ) <br>- リクエストボディ (POSTリクエスト時のみ) |文字列の連結|HMAC-SHA256|application/json|- ACCESS-KEY<br>- ACCESS-NONCE<br>- ACCESS-SIGNATURE|

太字の部分が私自身がハマったポイントです。
特に"/v1"等の部分を含むか含まないかは、ドキュメントに記述が見つからず手探りで繰り返し試行して判明しました。
また、Content-Typeヘッダーもドキュメントに書いていないケースが散見されました。

# Quoine APIの品質
余談ですが、上記した取引所の中ではQuoineのAPIの品質が最もよいと思います。APIの設計もとてもクリーンで、扱いやすいものとなっています。
また、レバレッジ取引でネットアウトをサポートしている点など、裁定取引で非常に使いやすい取引所です。
WebのUIにはやや難がありますが(特に入出金)、個人的にはお気に入りの取引所です。
Node.js + MongoDBを導入する

#始めに
Homebrewの導入は済んでいる前提で進めていきます。
まだ導入していない方は調べて、インストールしてから以下に進んでください。

#環境
macOS Sierra 10.12.6
Homebrew 1.3.4

#Nodebrew導入
Node.jsのバージョン管理ソフトNodebrewを入れます。
NodebrewはHomebrewのパッケージとなっていますのでインストールしましょう。
>$ brew install nodebrew

インストールしたら起動します。
>$ nodebrew setup

この時にパスを設定するようにターミナルに表示されると思うので、その通りにパスを設定します。
 >\$ echo "export PATH=\$HOME/.nodebrew/current/bin:\$PATH" >> ~/.bash_profile
\$ source ~/.bash_profile
 
これでNodebrewの導入が完了しました。

#Node.js導入
さて、それではNodebrewを用いてNode.jsをダウンロードします。
>$ nodebrew ls-remote

このコマンドでインストールできるパッケージの一覧が見れます。
特に指定がなければ最新版を入れます。
>$ nodebrew install-binary latest

latestの部分を先ほどのリストで見たバージョンに変えるとそれぞれのバージョンがインストールされます。最新版でよければこのままで自動的に最新版を探してくれます。
>$ nodebrew use latest

インストールした中でどのバージョンを使うか指定します。バージョン切り替える際は、毎回このコマンドが必要ですのでお忘れなく。これでNode.jsの導入は終了です。

##npmを使ってNode.jsのライブラリを管理
npm(Node Packaged Modules)とは、Node.jsのライブラリやパッケージを管理するソフトです。
Node.jsに標準で付属しているため既に導入されているはずです。

>\$ npm install -g forever
\$ npm install -g express
\$ npm install -g express-generator

それぞれサーバーの再起動を自動で行ってくれるモジュール、上からWebパッケージの雛形を作るライブラリ、それを使うためのコマンドといった風になっています。

>\$ express -e firstapp
$ cd firstapp

アプリ名をfirstappとして雛形を作り、ディレクトリに入ります。

>$ npm install -d

依存するモジュールファイルをインストールします。

>$ forever start bin/www

これでサーバーが立ち上がるので、ブラウザで[http://localhost:3000](http://localhost:3000)を表示するとWebページの雛形が現れるはずです。

>$ forever list
$ forever stop bin/www

これらのコマンドで起動しているサーバー一覧を取得して、止めることができます。

これでライブラリを導入してWebページを表示することができました。

#MongoDB導入
ここからはMongoDBを導入していきます。
まずはインストールします。
>$ brew install mongodb

必要となるディレクトリを管理者権限で作ります。
パスワードを聞かれたらパソコンを立ち上げる時に入力しているパスワードを入力します。
>\$ sudo mkdir /var/lib/mongodb
$ sudo touch /var/log/mongodb.log

MongoDBがパソコンの起動とともにバックグラウンドで自動で立ち上がるように設定します。
>$ brew services start mongodb

MongoDBとNode.jsを紐づけるためにMongooseというモジュールをインストールします。オプションでgを指定するとうまくいかなかったので注意。
>$ npm install mongoose

以上で導入は全て完了しました。
参考サイトでは実際にDBにデータを格納して、表示する部分までやっています。

[参考サイト](http://gihyo.jp/dev/serial/01/nodejs/0001)
Rspec再入門

久しくRspecでテスト書いてなかったので自分用に復習メモ。

やっぱりSir.JunichiItoの記事がわかりやすすぎるので、説明やコードなどはそちらを参照。
https://qiita.com/jnchito/items/42193d066bd61c740612

## キーワード
- describe　テスト対象
- context　ケース分け
- it　振る舞いの説明
- expect(振る舞い).matcher(期待する出力)
- before　前処理（テストで必要な変数などの定義）
- let　遅延評価される（必要になって初めて呼ばれる）変数を定義
- let!　遅延評価したくない時。
- pending 保留

ちょい応用
- shared_examples 'hoge' do と it_behaves_like('hoge')で期待する振る舞いをDRYに
- shared_context　'fuga' do と include_context('fuga')で必要な前処理をケースごとで定義しDRYに

マッチャー
https://qiita.com/jnchito/items/2e79a1abe7cd8214caa5

コントローラーとか実践的なテスト
https://qiita.com/Morinikiz/items/cf179583c2c5d2e24c3c

## ポイント
letは遅延評価される。
letの遅延評価でnilエラーとか出る場合、let!を使う必要があったり。
テストは読みやすさが大事

コードを拝借。これに基本のエッセンスは詰まってる。

```user_spec.rb
describe User do
  describe '#greet' do
    let(:user) { User.new(name: 'たろう', age: age) }
    subject { user.greet } #テスト対象のオブジェクトをDRYに
    context '12歳以下の場合' do
      let(:age) { 12 }
      it { is_expected.to eq 'ぼくはたろうだよ。' }
    end
    context '13歳以上の場合' do
      let(:age) { 13 }
      it { is_expected.to eq '僕はたろうです。' }
    end
  end
end
```

shared_examplesの例

```rb
describe User do
  describe '#greet' do
    let(:user) { User.new(name: 'たろう', age: age) }
    subject { user.greet }

    shared_examples '子どものあいさつ' do
      it { is_expected.to eq 'ぼくはたろうだよ。' }
    end
    context '0歳の場合' do
      let(:age) { 0 }
      it_behaves_like '子どものあいさつ'
    end
    context '12歳の場合' do
      let(:age) { 12 }
      it_behaves_like '子どものあいさつ'
    end

    shared_examples '大人のあいさつ' do
      it { is_expected.to eq '僕はたろうです。' }
    end
    context '13歳の場合' do
      let(:age) { 13 }
      it_behaves_like '大人のあいさつ'
    end
    context '100歳の場合' do
      let(:age) { 100 }
      it_behaves_like '大人のあいさつ'
    end
  end
end
```

shared_contextの例

```rb
describe User do
  let(:user) { User.new(name: 'たろう', age: age) }
  shared_context '12歳の場合' do
    let(:age) { 12 }
  end
  shared_context '13歳の場合' do
    let(:age) { 13 }
  end

  describe '#greet' do
    subject { user.greet }
    context '12歳以下の場合' do
      include_context '12歳の場合'
      it { is_expected.to eq 'ぼくはたろうだよ。' }
    end
    context '13歳以上の場合' do
      include_context '13歳の場合'
      it { is_expected.to eq '僕はたろうです。' }
    end
  end

  describe '#child?' do
    subject { user.child? }
    context '12歳以下の場合' do
      include_context '12歳の場合'
      it { is_expected.to eq true }
    end
    context '13歳以上の場合' do
      include_context '13歳の場合'
      it { is_expected.to eq false }
    end
  end
end
```
そうだ， TeX Live 2017 (for Windows) をインストールしよう！ （目次）

最近，個人ブログで TeX について雑文を書き散らしたので，ここに目次を公開しておく。

- [そうだ， TeX Live 2017 (for Windows) をインストールしよう！](http://text.baldanders.info/remark/2017/09/install-tex-live-2017-for-windows/)
- [クラウドで LuaLaTeX-ja](http://text.baldanders.info/remark/2017/10/lualatex-ja-on-cloud/)
- [TeX 日本語環境で「源ノ」フォントを使ってみた](http://text.baldanders.info/remark/2017/10/using-source-han-fonts-by-japanese-tex/)
- [LuaLaTeX でコードを書いてみる](http://text.baldanders.info/remark/2017/10/writing-code-with-lualatex/)
- [数式用フォントで遊ぶ](http://text.baldanders.info/remark/2017/10/math-fonts/)

ついでにポエムも書いてみた（笑）

- [TeX の思ひ出](http://text.baldanders.info/remark/2017/09/tex-born-in-1978/)

ご笑覧あれ。
Adobe Animate CC 2017のCEP Remote Debugging Consoleでコンソールの入力のレスポンスが返ってこない

# 症状
* Adobe Animate CC 2017のCEP Remote Debugging Consoleでコンソールの入力のレスポンスが返ってこない

# 原因
* Adobe CEPで組み込まれているChroniumのバージョンが古い為、最近のchromeに実装されているWebsocketと通信ができない。(恐らくWebSocketの仕様が変わったため) remote debugging consoleはwebsocketで通信している為

# 対応方法
* 過去バージョンのchroniumをダウンロードする
* 動作するchromeのバージョンはv53.0.2785.143
<dl>
<dt>Win</dt>
<dd>
https://www.googleapis.com/download/storage/v1/b/chromium-browser-snapshots/o/Win%2F330231%2Fchrome-win32.zip?generation=1431734758687000&alt=media
</dd>
<dt>Mac</dt>
<dd>
https://www.googleapis.com/download/storage/v1/b/chromium-browser-snapshots/o/Mac%2F403389%2Fchrome-mac.zip?generation=1467340571556000&alt=media
</dd>
</dl>

# 参考
* https://github.com/Adobe-CEP/CEP-Resources/issues/78
* https://www.chromium.org/getting-involved/download-chromium
Bash コマンド for docker

# Docker

I think any Dockerize process needs, work with bash script or high level language (Phyton script).
Bash is most common and useful 

Important things to remember is when you create a docker image file.

* Don't put service execution commands on the docker file <br>
  Because docker image is only to collect required files
* The Docker composer can easily manage your docker image with service execute command
* Container orchestration: Kubernetes, Apache Mesos, Docker

Leaving memo:

If you need to remove HTML comments from file

```
sed -i -e :a -re 's/<!--.*?-->//g;/<!--/N;//ba' ./file_name
```
Remove some words 

```
sed -i -e 's/Old word/New word/g' ./unix.config
```

Check the tool is installed if not installed, install it

```
if ! [ -x "$(command -v git)" ]; then
  yum -y install git
fi
```
Install ruby on rails if not installed.

```
# Make sure ruby 2.4 is installed on the localhost
if ! [ -x "$(command -v ruby)" ] || ! [[ $(ruby --version) = *"2.4"* ]]; then
  cd ~
  if [ -x "$(command -v yum)" ]; then
    yum -y install -y git-core zlib zlib-devel gcc-c++ patch readline readline-devel libyaml-devel libffi-devel openssl-devel make bzip2 autoconf automake libtool bison curl sqlite-devel
  fi
  if [ -x "$(command -v apt-get)" ]; then
    apt-get -y install git-core curl zlib1g-dev build-essential libssl-dev libreadline-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev libcurl4-openssl-dev python-software-properties libffi-dev nodejs
  fi
  cd
  git clone git://github.com/sstephenson/rbenv.git .rbenv
  echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
  echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
  exec $SHELL
  git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
  echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bash_profile
  exec $SHELL
  source .bash_profile

  yes | rbenv install -v 2.4.0
  rbenv global 2.4.0
  echo "gem: --no-document" > ~/.gemrc
  gem
fi
```

Get ip address specific network driver. `docker0` is docker image internal ip address.

```
my_docker_ip="$(ifconfig docker0 2>/dev/null|awk '/inet addr:/ {print $2}'|sed 's/addr://')"
```

Execute bash for running docker image 

```
docker exec -it <container name> bash
```

Run the system-d, execute all system services when image run (built).

```
docker run --privileged --name <container name> -v /sys/fs/cgroup:/sys/fs/cgroup:ro -p 8443:8443 -d <container name>
```
[メモ]Laravel5.4でブログシステムを作る01（要件分析とインストール）

こちらは個人記録用メモです。
また日本語非母語話者によるものなので、ご注意ください。


#ブログシステムの要件分析

##モジュールと機能の予定リスト：
　--文章を編集する
　--コラム
　--個人ページ
　--アカンウト基本情報を編集
　--通知、検索　など

##今から開発したい主なモジュールと機能：

###文章モジュール

　- ルーティング
　　　　- 文章の詳細　
　　　　- 文章を削除
　　　　- 文章を編集
　　　　- 文章を追加
　　　　- 文章リストを表示
-　テーブルの設計
　　　　-　モデル定義
-　ビューの作成 
　　　　-　文章リスト
　　　　-　文章を追加
　　　　-　文章を編集
　　　　-　文章を削除
　　　　-　文章の詳細
　　　　
##インストールと設定
Composerインストールの流れ：
`$ php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');"`
`$ php composer-setup.php`
`$ php -r "unlink('composer-setup.php');"`
`$ sudo mv composer.phar /usr/local/bin/composer`
`$ composer -v`

プロジェクトを立ち上げる、名前はjianshuとする
`$ mkdir jianshu`
`$ cd jianshu`

ルートファイルに入ったら、laravel 5.4をインストール
`$ composer create-project laravel/laravel jianshu "5.4.*"`
`Created project in jianshu`という説明が出てきたらインストール完了

サーバを起動
`$ php artisan serve`
ポートを変更（例）
`$　php artisan serve --port=8888`
  
起動成功メッセージ
`Laravel development server started: <http://127.0.0.1:8000>`

##Laravelのプロジェクトディレクトリ構造
- app
 - controller ----app/Http/Controllersのディレクトリ下に設置
 - model----appのディレクトリ下に設置


- config
 - アプリケーションの全設定ファイルが設置
- database
 - データベースに関連する設定を配置
- public
 - 外からアクセスできるようなリソースを配置、css/js/imageなどを設置
- resources
 - viewを配置
- routes
 - アプリケーションの全ルート定義、すべてのルートはweb.phpファイルの中で定義
- storage 
 - ログファイル、ファイルキャッシュなど、フレームワークにより生成されるファイルが保存
- tests
 - 自動テストを配置
- vendor
 - Composerによる依存パッケージが配置
GitHubでコメントへのリンクURLを簡単に取得する方法


今まで開発者ツールでidを探していたのですが、コメントの投稿日時の部分をクリックすることで、URLがコメントへのアンカー付きのURLに変わります。これをコピーして使用すれば簡単にコメントへのURLを使うことが出来ます。

![github_comment.png](https://qiita-image-store.s3.amazonaws.com/0/18273/0881bc0d-4975-6611-585d-c0064a7ab14a.png "github_comment.png")

![github_comment_link.png](https://qiita-image-store.s3.amazonaws.com/0/18273/6f7cb56e-27cc-7294-3e08-d0417faf7a65.png "github_comment_link.png")


日付を右クリックして、リンク先URLをコピーしても良いと思います。
CloudFormationで変数の埋め込みはしたいが、IAMポリシ-変数を使いたい場合


例えばこんな感じにユーザ自身しかパスワード変更させないようにする場合を考えてみます。

```yaml
Type: "AWS::IAM::ManagedPolicy"
Properties:
  ManagedPolicyName: IAMChangePassword
  Description: "パスワード変更"
  PolicyDocument:
    Version: "2012-10-17"
    Statement:
      -
        Effect: Allow
        Action:
          - iam:ChangePassword
        Resource: !Sub arn:aws:iam::${AWS::AccountId}:user/${aws:username}
```


このままCloudFormationで実行しようとすると、テンプレートの検証エラーが出てしまいます。

```
Template format error: Unresolved resource dependencies [aws:username] in the Resources block of the template
```

どうすればよいのかは[StackOverFlow](https://stackoverflow.com/questions/44458304/how-to-escape-in-cloudformations-fnsub)に書いてありました。

`${!}`を使って、以下のようにやるとうまくいきました。

```yaml
Type: "AWS::IAM::ManagedPolicy"
Properties:
  ManagedPolicyName: IAMChangePassword
  Description: "パスワード変更"
  PolicyDocument:
    Version: "2012-10-17"
    Statement:
      -
        Effect: Allow
        Action:
          - iam:ChangePassword
        Resource: !Sub arn:aws:iam::${AWS::AccountId}:user/${!aws:username}
```
[Survey] Kaggle - Carvana 6位解法まとめ

Kaggle - Carvana Image Masking Challenge[^1]の6位解法[^2]の調査記事です．

Title: Overview of JbestDeepGooseFlops solution (3rd public)
- Name: n01z3
- Kaggle Discussion: https://www.kaggle.com/c/carvana-image-masking-challenge/discussion/40119#latest-225659

## 開発環境

- GPU x 40個

## Models

- 全てのモデルに対してCV=5でクロスバリエーションを実施

![image.png](https://qiita-image-store.s3.amazonaws.com/0/107399/c55b7ad6-f067-e67e-eded-447a70798172.png)

フォーラム[^2]より引用

### Valeriy Babushkin (VENHEADs)の試み

- U-Netを様々なOptimizer(Adam, RMSProp, SGD)で学習

### Artur Kuzin (n01z3)の試み

- mxnetを利用(Deconvolution部分の不具合のため，LinkNet[^3]を構築できず)

### Evgeny Nizhibitsky (nizhib)の試み

- pytorchで作った最良のモデルを作成．
- incnet: inception-v3 + linknet decoders(Residual Blockを組み込んだU-Net)
- dinknet: densenet + linknet decoders
- Adam, learning rate = 0.0001

### Roman Trusov (lextal)の試み

- pytorchでpspnet[^4]を3つの中間層を一つのDeconv層に修正したモデルを構築．
- ネットワークの重みはResNetの18層と34層で初期化

### [参考]Steven Nguyen(28位)の試み

- DeepUNet[^5]を利用．

## References


[^1]: Kaggle, [Carvana Image Masking Challenge](https://www.kaggle.com/c/carvana-image-masking-challenge), 2017.
[^2]: n01z3, [Overview of JbestDeepGooseFlops solution (3rd public)](https://www.kaggle.com/c/carvana-image-masking-challenge/discussion/40119#latest-225659), 2017.
[^3]: Abhishek Chaurasia et al., [LinkNet: Exploiting Encoder Representations for Efficient Semantic Segmentation](https://arxiv.org/abs/1707.03718), 2017.
[^4]: Yangqing Jia, et al., [Caffe: Convolutional Architecture for Fast Feature Embedding](https://arxiv.org/abs/1408.5093), 2014.
[^5]: Ruirui Li, et al., [DeepUNet: A Deep Fully Convolutional Network for Pixel-level Sea-Land Segmentation](https://arxiv.org/pdf/1709.00201.pdf), 2017.