OmniAICreator/Qiita-1.07M huggingface dataset:
paiza.ioとGistを連携すると、書いたコードが消えてしまう

paiza.ioは、右下のボタン（Gist(Githubと同期)）を押すと、gistと同期できる。
競技プログラミングでコードを保存しておくのにとても便利。

![スクリーンショット 2018-08-22 10.32.31.png](https://qiita-image-store.s3.amazonaws.com/0/247390/b633ada7-1ef7-356e-ee59-ce24ff436d75.png)

GitHubGistを見ると確かに同期されていることがわかる。

![スクリーンショット 2018-08-22 10.33.10.png](https://qiita-image-store.s3.amazonaws.com/0/247390/25732176-5dcc-e2fe-4246-61a661e507f4.png)

ここで、一つ問題がある。test1.pyが用済みだからタブを閉じる。gistに保持されているから大丈夫と安心していると・・

![スクリーンショット 2018-08-22 10.34.49.png](https://qiita-image-store.s3.amazonaws.com/0/247390/472c912d-4b81-cabe-9620-6b0462ed5038.png)

消えている！
![スクリーンショット 2018-08-22 10.35.30.png](https://qiita-image-store.s3.amazonaws.com/0/247390/7f401919-84e6-fefa-80bc-188d307c2723.png)

revisionのタブを見ると理由がわかる。タブを閉じたことを消去と考えて、同期してしまっているのだ。
![スクリーンショット 2018-08-22 10.37.49.png](https://qiita-image-store.s3.amazonaws.com/0/247390/4625526f-7038-6628-870f-aa8504e15031.png)

#解決策
新規コードで逐一作ろう
![スクリーンショット 2018-08-22 10.39.47.png](https://qiita-image-store.s3.amazonaws.com/0/247390/341818c8-c040-a46d-f304-fd680a6e0461.png)

新たにgistが作られる。
![スクリーンショット 2018-08-22 10.42.07.png](https://qiita-image-store.s3.amazonaws.com/0/247390/cce9c9ec-bb17-a347-7117-7078b0521516.png)
構造体などをテストするのに便利なgoogle/go-cmpの使い方

Goでテストを書きたいときにjsonや大きめの構造体で返ってくる戻り値をテストしたいニーズがありますよね。
そのようなニーズに対して、[golang.tokyo#17](https://golangtokyo.connpass.com/event/96200/)にて発表された[Tips for develoepr-friendly testing](https://speakerdeck.com/izumin5210/tips-for-develoepr-friendly-testing-number-golangtokyo?slide=18)のスライドでご紹介いただいた、[google/go-cmp](https://github.com/google/go-cmp)を実際に使ってとても便利だったので、ここに使い方を残しておきます。

# google/go-cmp
[google/go-cmp](https://github.com/google/go-cmp)はGoogle非公式の値比較のライブラリです。

> This package is intended to be a more powerful and safer alternative to reflect.DeepEqual for comparing whether two values are semantically equal.

# 使い方
## インストール
```bash
go get -u github.com/google/go-cmp/cmp
```
depなどをお使いの方は別途それぞれの方法で。

## Diff
使い方の参考としては、https://godoc.org/github.com/google/go-cmp/cmp#example-Diff--Testing に記載のあるexampleコードがベースです。

例えば、下記のようなメソッドがあった場合を仮定します。

```go:main.go
type Hoge struct {
	Moji string
	AnotherStruct Huga
	Num int
	Flag bool
}

type Huga struct {
	Moji string
}

// Hogeを返す
func FuncHoge() Hoge {
	h := Hoge{
		Moji: "hogehoge",
		AnotherStruct: Huga{
			Moji: "hugahuga",
		},
		Num: 1,
		Flag: false,
	}
	return h
}
```

上記のメソッドを返り値をチェックする場合は次のように使用します。

```go:main_test.go
func TestFuncHoge(t *testing.T) {
	expected := Hoge{
		Moji: "hogehoge",
		AnotherStruct: Huga{
			Moji: "hugahuga",
		},
		Num: 1,
		Flag: false,
	}
	res := FuncHoge()
	if diff := cmp.Diff(res, expected); diff != "" {
		t.Errorf("Hogefunc differs: (-got +want)\n%s", diff)
	}
}
```

テストコード内の、`cmp.Diff()`が`google/go-cmp`が提供している機能です。

https://github.com/google/go-cmp/blob/master/cmp/compare.go#L98

```go
func Diff(x, y interface{}, opts ...Option) string
```

戻り値がstring型で、diffがない場合は空文字列で返ってくるので、次のように書いていきます。

```go
if diff := cmp.Diff(res, expected); diff != "" {
	t.Errorf("Hogefunc differs: (-got +want)\n%s", diff)
}
```

実際に差分があった場合は次のようなテスト結果が表示されます。

```bash
=== RUN   TestFuncHoge
--- FAIL: TestFuncHoge (0.00s)
	main.go:56: Hogefunc differs: (-got +want)
		{Hoge}.AnotherStruct.Moji:
			-: "hugahuga"
			+: "hugahuga_diff"
FAIL
```
とても見やすいですね。

## その他
オプションも付けれるので詳しく設定されたい方は次のExampleを参照してみてください。

https://godoc.org/github.com/google/go-cmp/cmp#pkg-examples
AndroidStudioでKotlin使用時にwildcard importをオフにする

なかなかオフにできなかったのでメモ

## 手順
1. `Use single name import`にチェックを入れる
1. `Packages to Use Import with *`の空にする

## 画像
![Preferences.png](https://qiita-image-store.s3.amazonaws.com/0/88384/c59a3276-683f-7e60-1617-64a4e9cd4255.png)
Vue CLI 3 + DockerでHMRが動かない時の解決策


Vue CLI 3便利ですね。GUIでプラグインの追加やタスクの実行などを行えて見た目もカッコいいですし、使っていて楽しいです。

しかし、Docker上で動かしてみたときに、初めのビルドはうまくいくがHMRがうまく動かないことがありました。ファイルを変更しても自動でビルドが走りません。



そんな時の解決策です。



## 解決策



Vue CLI 3の設定ファイルのvue.config.jsがなければ作成、すでにある場合は編集します。



```javascript
module.exports = {
  devServer: {
    watchOptions: {
      poll: 3000
    }
  }
}
```



このように、ファイル変更チェックの間隔(秒)を設定します。

おそらく、Docker上で普通のwebpackプロジェクトやAngular CLIなどで動かしてる人などではあるあるだと思いますが、Vue CLI 3をDockerで動かしたい人のために残しておきます。
機械学習工学研究会 現場を交えた勉強会 #1 勉強会メモ

# 実施概要

詳細は[こちら](https://mlxse.connpass.com/event/97131/)

> 実例をベースに、皆で機械学習システムのあれやこれやを議論します。
>
> 近年、機械学習・深層学習の発展によって、機械学習を利用するシステムが急速に社会に広がってきていますが、開発・テスト・運用の方法論は未だ確立できていません。そこで、従来の「ソフトウェア工学」に対応するような「機械学習工学」が必要であると考えていますが、活きた工学にするには、現場との密な交流が不可欠です!
>
> 本イベントでは、機械学習システムの現場のエンジニアの方に登壇いただき、みんなで議論することで、学術領域と現場との交流を促進できたらと考えています。  

# 各発表

## 事業会社における機械学習システム開発・運用の課題と展望
田中さん（株式会社リブセンス)より

資料は[こちら](https://speakerdeck.com/yubessy/shi-ye-hui-she-niokeruji-jie-xue-xi-sisutemukai-fa-yun-yong-falseke-ti-tozhan-wang)

### 発表を受けて

話を聞いていて、私自身も機械学習を取り扱う際に、「あるある」な課題にとても共感した。

特に意識しておくべき・していきたいと思った点は以下のもの。
(勉強会のラストの討議でも話題に挙がった)

- 機械学習を扱うコードのテストや検証の大変さ

- モデルが与えるビジネス収益寄与の不透明性


## SIer出身のエンジニアが機械学習を取り入れたASPサービス開発で学んだこと
柳原さん （株式会社ブレインパッド）

### 発表を受けて

ご自身の経験から、業務システムと機械学習システムの違いを定性的にまとめられていた。
例えば、システム化の目的の違いについては、以下のようにまとめられていた。

- 業務システム
 - 業務の効率化が目的
- 機械学習システム
 - サービスに対して付加価値を提供することが目的

ビジネス上の収益のために、サービスへの付加価値の在り方が不明瞭で、仕様定義が難しいのは確かになぁという感じ。

後は、ブレインパッドで開発しているレコメンドエンジンのRtoasterでは、
外販先のサービスごとに連携方法を変える必要があるため、
コアとなるレコメンドエンジン部分と連携方法のコンポーネントを分離しているらしい。
自社サービスへの利用ではなく外販が目的の開発ならではの工夫も感じられた。

## データサイエンティストとエンジニア 両者が幸せになれる機械学習基盤を求めて
田村さん（株式会社リクルートライフスタイル）

発表資料は[こちら](https://www.slideshare.net/RecruitLifestyle/ss-110788204)

### 発表を受けて

機械学習システムの開発には、ビジネス・データサイエンス・エンジニアリングの幅広いスキルが必要になり、それぞれの専門家が専念しやすいような共通基盤を用意するという話。

API運用の仕組みを共通基盤化することで、データサイエンティストが簡単に機械学習プログラムを運用することができるようになった反面、属人化や野良APIの蔓延が起きたそう。

整備した分析基盤を用意することによって、データサイエンティストは、開発したモデルを運用するための手直しなどの手間がなくなり、自身が専念すべき分析やモデリングに注力することができる。
しかし自由度や透明性を追求する反面、運用する立場のエンジニアは、セキュリティやパフォーマンスをトレードオフにしているので、双方の間でコミュニケーションをとって落としどころをうまく見つけようというまとめ。


## 討議

3者の発表を受けて、質問をベースに討議を行った。
それぞれの質問の中で上がった話を抜粋。

### モデル開発者の属人化を防ぐための取り組みについて

- dockerで環境を構築しており、開発者自身がそれを用意している。
- デプロイ前にレビューを行ったり、知見の共有を行う。また、環境は基本的にGCPで統一されているため、属人化は起こりにくい。

### モデルの精度が低くて実運用が厳しかった話について

- レコメンドの際に、モデル精度は高いが、各ユーザで似通った結果が出てしまった。ビジネス的な効果は見込めない。
 - Rtoasterでは、モデルが生成したレコメンドリストをビジネスルールで調整する仕組みを導入している。

- モデルの精度が高いが、ビジネス上の価値に繋がらなかったケースがある。
- モデル自体の精度より、ABテストなど実運用のテストの結果を重視している。

### 機械学習周りのコードの品質の低さにより発生した障害の事例について

- 想定していないデータが入ってきたために、モデルの学習が終わらなかったこと。

- サービス開発との認識合わせがうまくいってなかったことで、モデル学習時にシステム終了するリスク発生。
 - データサイエンティストとエンジニア、それぞれ立場の違いから、認識を合わせることが難しい。

- データサイエンティストが作成した大量データを入力する検証用のコードが、実運用のエンジンにデプロイされており、高い負荷がかかった。

### 単体テストのテスト評価基準の決め方

- 学習プログラムは、IFの確認を行う程度で、あまりできていない。

- 前処理のコンポーネントなど、共通化されているライブラリは、単体テストを実装している。後続の処理は、型の確認に留まっている。

- クラスタリングやランキングなどの結果は、入力データから正しそうな結果が出ることを確認している。

## 学習用コードのテストしているのか

- PoC段階ではテストコードは実装せず、開発が始まった段階で、テストを実装し始める。

- 定期運用が入るコードはテストを実装するが、アドホックに使うコードはコストに見合わないので実装しない。

## モデルの仕様を追加、変更はどのようにしているか

- モデルに導入する特徴量をパッケージ上で取捨選択できるようにしている。

- 基本的に、モデルはABテスト後にデプロイをするため、作りこみの過程で特徴を変えることを多く行う。

## データに対する仕様変更の対応はどのように行っているか

- モデルの学習時にエラーが起きることによって気づくことがある。

- データ基盤を運用しているので、データがかわることによるエラーはあまり起きない。
Amazon SumerianとWebRTC(SkyWay)で簡単な全天球カメラビデオチャット(1:1)を作ってみる

Amazon SumerianでWebRTC([SkyWay](https://webrtc.ecl.ntt.com/))を使って簡単な全天球カメラビデオチャットを作ってみたので作成手順をメモしておく。
実行すると自分のpeer idが表示されるので相手に知らせて入力欄に入れてもらいconnectボタンを押すとビデオチャットが行える。
お互い全天球カメラをWebカメラとして接続していれば相手に球面に貼り付けた状態で表示される（通常のWebカメラだと球面に貼り付けられて歪む）。

# 作成手順

[Amazon Sumerianで簡単な全天球画像ビューワーを作ってみる - Qiita](https://qiita.com/mechamogera/items/93ed8a211f7615d3f028) と同じ手順を実施して以下のようにHTMLとスクリプトを変更する。

* HTML

```html
<input id="peerid" readonly="readonly" type="text"><br />
<input type="text" id="ctnpeerid"><input type="button" id="connectbtn" value="connect"><br />
```

* スクリプト

```javascript
'use strict';

function makeVideo(stream) {
    let video = document.createElement('video');
    video.crossOrigin = 'anonymous';
    video.srcObject = stream;
    video.muted = false;
    video.autoplay = false;
	video.loop = true;
    video.oncanplay = (ctx) => {
        video.width = video.videoWidth;
        video.height = video.videoHeight;
    };
    return video;
}
	
function setup(args, ctx) {	
	var p = navigator.mediaDevices.getUserMedia({ audio: true, video: true });
	p.then(function (localStream) {
		ctx.localStream = localStream;
		
		ctx.peer = new Peer({
    		key: args.peerkey,
    		//debug: 3
		});
	
		ctx.peer.on('open', () => {
			document.getElementById("peerid").value = ctx.peer.id;
		});

		ctx.peer.on('error', (err) => {
			alert(err.message);
		});

		ctx.peer.on('call', (call) => {
			call.answer(ctx.localStream);
			setupCall(args, ctx, call);
		});

		document.getElementById("connectbtn").addEventListener('click', () => {
			let peerid = document.getElementById("ctnpeerid").value;
			const call = ctx.peer.call(peerid, ctx.localStream);
			setupCall(args, ctx, call);
		});
	});
	
}

function addVideo(args, ctx, stream) {
	 ctx.video = makeVideo(stream);

	var videoMat = args.target.meshRendererComponent.materials[0];
	var texture = ctx.texture = new sumerian.Texture(null, {
		generateMipmaps: false,
		minFilter: 'BilinearNoMipMaps',
		repeat: [-1, 1],
	});
	texture.updateCallback = () => {
		return texture.image && !texture.image.paused;
	};
	texture.readyCallback = () => {
		return texture.image && texture.image.readyState === 4;
	};
	texture.setImage(ctx.video);
	videoMat.setTexture('DIFFUSE_MAP', texture);
	args.target.meshRendererComponent.materials[0] = videoMat;
	ctx.material = videoMat;
	ctx.video.play();
}

function setupCall(args, ctx, call) {
	if (ctx.call) {
		ctx.call.close();
	}
	ctx.call = call;
	
	call.on('stream', (stream) => {
		addVideo(args, ctx, stream);
	});
}

function cleanup(args, ctx) {
	ctx.video = null;
}

var parameters = [
	{
        name: "Target",
        key: "target",
        type: "entity"
    },
	{
        name: "PeerKey",
        key: "peerkey",
        type: "string"
    }
];

```

* スクリプトのExternal Resourcesにhttps://cdn.webrtc.ecl.ntt.com/skyway-latest.js を指定する。
* スクリプトのtarget parameterにSphere100.fbx配下のpSphere1_phong1を設定する。
* SkyWayでアプリを作成して、利用可能ドメインにap-northeast-1.sumerian.amazonaws.comやap-northeast-1.sumerian.awsあたりを追加しておく。権限はAPIキー認証を利用する以外はチェックを入れておく。
* スクリプトのpeerkey parameterにSkyWayアプリのAPIキーを指定する。
webページのアイコン取得

自分用に忘れないようメモ

# webページのアイコン取得方法

ほしいアイコンのあるwebページのトップのアドレスに**/favicon.ico**を付け足す

### googleのアイコンがほしいときの例
https://www.google.co.jp/favicon.ico

このようにして取得できる

ただし取得できない場合がある。ちなみにqiitaはできませんでした。
自分の勘違いか、それともダウンロードできないようにしているのか知識がないのでわかりませんが調べてわかったら追記します。
swift初心者:「SVProgressHUDの表示時間の設定方法」

#はじめに
初歩的な実装かと思いますが、初心者のため備忘録を含め記録として残したいと思います。

##①SVProgressHUD.dismiss(withDelay: TimeInterval)を使用する

```swift:SVProgressHUD

SVProgressHUD.showError(withStatus: "test")
//withDelayにIntを設定
SVProgressHUD.dismiss(withDelay: 3)
```

上記のように
`SVProgressHUD.dismiss(withDelay: 3)`
とすれば表示時間の設定が可能かと思います。

ご参考になれば幸いです。
はじめまして。

どうもはじめまして。
RCJレスキューメイズにて活動しているProjectAquilaの主に回路設計や組み込みプログラミングを担当しています者です。
おもに京都ノード、京滋奈ブロックにて活動させて頂いています。
去年はTEPIAチャレンジ助成事業にてグランプリも頂きました。
Qiitaに登録してみて、あまり日本語文献が少ないxmegaについてポツポツ書いていきたいと思います。、
それと競技人口が少ないレスキューメイズの交流の方との交流も出来たらなぁと。
[Twitter](https://twitter.com/shun_k_tech)もよろしくお願いします。
CLI作成用パッケージ「urfave/cli」を用いた際のUSAGE内のコマンド名の固定化

[「任意の文字列や行をハイライトするツールをGo言語で作成してみた」](https://qiita.com/x-color/items/bb4c4054083c1ef0b941)に書いたツールを作成時に、Go言語のコマンドラインツール作成用パッケージとして[urfave/cli](https://github.com/urfave/cli)を使用した。
その際に、アプリケーションのヘルプメッセージ内の`USAGE`の部分のコマンド名を固定化するための手法を調べたので、解決策を残しておく。

# 困ったこと

以下のように設定した場合、

```go
app := cli.NewApp()
app.Name = "abc"
```

`abc`コマンドのヘルプメッセージ

```bash
$ ./abc -h
NAME:
   abc - sample cli

USAGE:
   abc [global options] command [command options] [arguments...]
```

`abc`コマンドのサブコマンド`aaa`のヘルプメッセージ

```bash
$ ./abc aaa -h
NAME:
   abc aaa - sample command

USAGE:
   abc aaa [command options] [arguments...]
```

のような出力が得られることになる。
表示されている`abc`のうち、最初の`abc`以外は、実行時のアプリケーションの名前を参照している。

なので、同じアプリケーションでもリネームされてしまうと

```bash
$ mv abc renamed
$ ./renamed -h
NAME:
   abc - sample cli

USAGE:
   renamed [global options] command [command options] [arguments...]
$ ./renamed aaa -h
NAME:
   renamed aaa - sample command

USAGE:
   renamed aaa [command options] [arguments...]
```

のようになってしまい、もとのアプリケーションの使い方が上書きされてしまう。

上書きされたくなかったのでちょっと調べてみた。

# 解決策

以下を設定することで`abc`の部分を固定可能であることがわかった。

```go
app.HelpName = app.Name // 今回はアプリケーション名と同じにした
```

これによって、実際のアプリケーションの実行名を参照していた部分が`app.HelpName`を参照してくれるため、リネームされても

```bash
$ mv abc renamed
$ ./renamed -h
NAME:
   abc - sample cli

USAGE:
   abc [global options] command [command options] [arguments...]
$ ./renamed aaa -h
NAME:
   abc aaa - sample command

USAGE:
   abc aaa [command options] [arguments...]
```

のようになる。
このページで数式番号を付けた数式の記載

数式番号を付けた数式をこのページで使いたかったので、実験してみました。
但し、２つ以上の式に番号を付けようとするとうまく行きません。
あまりうまいやり方を見つけられないという記事です。
Tex記法を勉強していないので、いい手があるのかもしれません。
お教えいただけると助かります。

やりたいのは

　x^2 + y^2 = a^2 --- (1)
　(x-b)^2 + (y-c)^2 = d^2 --- (2)

といった連立方程式の記載です。

##案1
$$を使って、１行で書くこれは上手くいきます。

```
$$x^2 + y^2 = a^2 \tag{1}$$$$(x-b)^2 + (y-c)^2 = d^2 \tag{2}$$
```

$$x^2 + y^2 = a^2 \tag{1}$$$$(x-b)^2 + (y-c)^2 = d^2 \tag{2}$$


##案2
以下のように２つの式の間にリターンを入れると（１）と（２）の間が広く開いてしまいます。

```
$$x^2 + y^2 = a^2 \tag{1}$$
$$(x-b)^2 + (y-c)^2 = d^2 \tag{2}$$
```

$$x^2 + y^2 = a^2 \tag{1}$$
$$(x-b)^2 + (y-c)^2 = d^2 \tag{2}$$

##案3
<b>```math ～　```</b>で囲う、は上手く行きません。

```
``` math
x^2 + y^2 = a^2 \tag{1} \\
(x-b)^2 + (y-c)^2 = d^2 \tag{2}
```

```math
x^2 + y^2 = a^2 \tag{1} \\
(x-b)^2 + (y-c)^2 = d^2 \tag{2}
```

##案4

どういうわけか、(1)だけなら上手く記載できます。謎です。

```
``` math
x^2 + y^2 = a^2 \tag{1} \\
(x-b)^2 + (y-c)^2 = d^2
```

``` math
x^2 + y^2 = a^2 \tag{1} \\
(x-b)^2 + (y-c)^2 = d^2
```

##案5
begin, end で括ってもうまくいきません。

```
$$
\begin{equation}
x^2 + y^2 = a^2 \tag{1}
(x-b)^2 + (y-c)^2 = d^2 \tag{2}
\end{equation}
$$
```

$$
\begin{equation}
x^2 + y^2 = a^2 \tag{1}
(x-b)^2 + (y-c)^2 = d^2 \tag{2}
\end{equation}
$$

##案6
ちょっと長いけど、以下なら良い結果が得られます。

```
$$
\begin{equation}
x^2 + y^2 = a^2 \tag{1}
\end{equation}
$$$$\begin{equation}
(x-b)^2 + (y-c)^2 = d^2 \tag{2}
\end{equation}
$$
```

$$
\begin{equation}
x^2 + y^2 = a^2 \tag{1}
\end{equation}
$$$$\begin{equation}
(x-b)^2 + (y-c)^2 = d^2 \tag{2}
\end{equation}
$$

##案7
お教えいただいた方法。右寄せになりました。これはこれでかっこいいですね。

```
```math
\begin{align}
x^2 + y^2 &= a^2 \tag{1} \\
(x-b)^2 + (y-c)^2 &= d^2 \tag{2} \\
\end{align}
```

```math
\begin{align}
x^2 + y^2 &= a^2 \tag{1} \\
(x-b)^2 + (y-c)^2 &= d^2 \tag{2} \\
\end{align}
```

##案8
重ねて、左寄せの方法も教えていただきました。&を付けると左寄せになりました。

```
```math
\begin{align}
&x^2 + y^2 = a^2 \tag{1} \\
&(x-b)^2 + (y-c)^2 = d^2 \tag{2} \\
\end{align}
```

```math
\begin{align}
&x^2 + y^2 = a^2 \tag{1} \\
&(x-b)^2 + (y-c)^2 = d^2 \tag{2} \\
\end{align}
```
BigQuery—WebUIの便利な小技集


## 技あり. クエリを書いている途中にテーブルスキーマを確認する

- Control + クリック (Windows)
- Command + クリック (Mac)

テーブル定義はいつでも確認できる。

---

![image](https://user-images.githubusercontent.com/13635059/44429070-3faf4880-a5d1-11e8-8bf4-7bc4d18e900e.png)

## 技あり. クエリ編集開始 / クエリ実行のショートカット

### クエリ編集を開始

- Control + Space ( Windows )
- Command + Space ( Mac )

### クエリ実行

- Control + Enter ( Windows )
- Command + Enter ( Mac )


## 技あり. クエリと結果の自動保存とURLの割り振り

クエリを走らせるたびにユニークなURLが割り振られ、あとからアクセスが可能。

[Bigquery—クエリと結果は自動保存され、ユニークURLが割り振られる (共有しなくても) - Qiita](https://qiita.com/YumaInaura/items/56c5b5297aeb98cb0056)

## 技あり. クエリ結果でカラムのデータ型を確認する

カラム名にカーソルを合わせることで可能。
以下は古いUIの例。

![image](https://user-images.githubusercontent.com/13635059/44427499-b4cc4f00-a5cc-11e8-9ffd-09c73569ffc0.png)

## 技あり. クエリを部分実行

クエリの一部を選択状態にして「Run selected」を選ぶ。

![image](https://user-images.githubusercontent.com/13635059/44428167-894a6400-a5ce-11e8-9807-9f9639c0c8de.png)

クエリの一部を実行するために編集したり、新タブを開いたりする必要はもうない。

ショートカット:

- Control + E (Windows)
- Command + E (Mac)

## ショートカットヘルプが多くを物語る

[Using the BigQuery Web UI  |  BigQuery  |  Google Cloud](https://cloud.google.com/bigquery/docs/bigquery-web-ui#keyboard_shortcuts)

![image](https://user-images.githubusercontent.com/13635059/44427920-da0d8d00-a5cd-11e8-829e-34a7ec8dc7e9.png)

## Links

- [GIST](https://gist.github.com/YumaInaura/eac451fef9221316c8c484ddd93733d3)









<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Azure WebAppsでのNode.jsアプリケーションのログの取り方メモ


Azure CLIというツールで手元のマシンからサーバー側のログを取得できます。が、紛らわしくて詰まったのでメモです。

`heroku logs --tail`的なやつです。

## Azure CLI - azコマンドとazureコマンドが紛らわしい問題

現状(2018年8月)ではAzure CLIは`azure`と`az`の二つのコマンドが混在します。

> https://docs.microsoft.com/ja-jp/cli/azure/?view=azure-cli-latest

を見る限り

```
以前のバージョンの CLI (Azure CLI 1.0) を使用している場合は、引き続きそれを使用できます。 ただし、最適なエクスペリエンスを実現するために、最新バージョンの Azure CLI 2.0 に更新することをお勧めします。 両方の CLI を使用する場合は、azure が古い CLI (Azure CLI) で、az が新しい CLI (Azure CLI 2.0) であることを覚えておいてください。
```

と記載があります。

簡単に言うと **`azure`やめて`az`コマンドに移行しよう。** とのことです。


紛らわしい... `npm i -g azure-cli`で`azureコマンド`を入れた人は`npm uninstall -g azure-cli`でアンインストールした方が良いかも。
現時点だと両方使えてしまうのが尚更紛らわしいですね...


```
brew update && brew install azure-cli
```

これで新しい`azコマンド`を使えるようにしましょう。


やっとこの辺を読める

> https://docs.microsoft.com/en-us/cli/azure/webapp/log?view=azure-cli-latest

## ログの取り方

```
az login
```

でまずログインします。

```
az webapp log tail --name <WebAppsのアプリケーション名> --resource-group <リソースグループ名>
```

でリアルタイムにログが取得できます。

`console.log()`の箇所のログが手元のターミナルに流れて来ます。

これでだいぶ開発が捗る
nimとrustでmessagebox(windows)

（18/08/22 7:36 加筆、修正しました）
#この記事は、ここに書いてあることの抜粋です
[https://github.com/khchen/winim](https://github.com/khchen/winim) ← nim
[https://wesleywiser.github.io/post/rust-windows-messagebox-hello-world/](https://wesleywiser.github.io/post/rust-windows-messagebox-hello-world/) ← rust
著作権とか大丈夫だろうか...

#nim
コードです

```nim:msgbox.nim
proc MessageBoxA*(hWnd: int, lpText: cstring, 
                  lpCaption: cstring, uType: int32): int32 
                 {.discardable, stdcall, dynlib: "user32", importc.}
        
MessageBoxA(0, "Hello, world !", "MessageBox Example", 0)
```

コンパイル、実行

```
nim c -r msgbox
```

また、WinAPIをいろいろ使えるようにした、winimというものがあるようです。これが、[上記のリンク先](https://github.com/khchen/winim)にあるものです。
はじめに、winimを入れます。


With git on windows:

```
nimble install winim
```

gitなしの場合は、[上記のリンク](https://github.com/khchen/winim)にやり方があります。

コードです

```nim:msgbox2.nim
import winim/lean
MessageBox(0, "Hello, world !", "Nim is Powerful", 
           MB_OK or MB_ICONINFORMATION)
```

コンパイル、実行

```
nim c -r msgbox2
```

私は`nimble`でやったのですが、コンパイルの際コマンドラインに`--noBabelPath`というオプションがついていて、うまくコンパイルできませんでした。なので、コマンドをコピペして、`--noBabelPath`だけ削除してコンパイルしました。

#rust
詳しいことは、[上記のリンク](https://wesleywiser.github.io/post/rust-windows-messagebox-hello-world/)に書いてあります。google翻訳やると日本語になります。ここでは、簡単にやり方だけ書きます。

はじめにCargoを使用して新しいプロジェクトを作成します。

```
cargo new --bin hello_world
```

そして、この場合に作成される`hello_world`フォルダにある`Cargo.toml`ファイルを開き、`[dependencies]`と書かれている行を見つけ、その下に次を追加します。

```
winapi = "0.2.7"
user32-sys = "0.2.0"
```

そして、`src/main.rs`を開き、次のようにします。

```rust:src/main.rs
extern crate user32;
extern crate winapi;

use std::ffi::CString;
use user32::MessageBoxA;
use winapi::winuser::{MB_OK, MB_ICONINFORMATION};

fn main() {
    let lp_text = CString::new("Hello, world!").unwrap();
    let lp_caption = CString::new("MessageBox Example").unwrap();

    unsafe {
        MessageBoxA(
            std::ptr::null_mut(),
            lp_text.as_ptr(),
            lp_caption.as_ptr(),
            MB_OK | MB_ICONINFORMATION
        );
    }
}
```

コンパイル、実行

```
cargo build
cargo run
```

また、このAPIのUnicode版を書きたい場合は、[上記のリンクの違うページ](http://wesleywiser.github.io/post/rust-windows-message-box-unicode/)にあるようです。

#環境

OS:
Microsoft Windows [Version 10.0.17134.228]

nim:
Nim Compiler Version 0.18.0 [Windows: amd64]
Copyright (c) 2006-2018 by Andreas Rumpf

nimble:
nimble v0.8.10 compiled at 2018-03-01 23:04:46
git hash: 6a2da5627c029460f6f714a44f5275762102fa4b

rustc:
rustc 1.24.1 (d3ae9a9e0 2018-02-27)

cargo:
cargo 0.25.0 (96d8071da 2018-02-26)
Limit で制限する前提の無限再帰 CTE は MySQL では動かない。 Posgresql なら動く。

# TL; DR

* MySQL の再帰 CTE は、一回その結果をすべて materialize している
  * なので、クエリのパフォーマンスは注意が必要
* Postgresql ならば、幅優先探索ができるはず。

# 本文

## 実証:
### MySQL

```SQL
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.11    |
+-----------+
1 row in set (0.00 sec)

mysql> with recursive r as ( select 1 as n UNION ALL select n + 1 from r ) select * from r limit 10;
ERROR 3636 (HY000): Recursive query aborted after 1001 iterations. Try increasing @@cte_max_recursion_depth to a larger value.
```

### Postgresql

```SQL
test=# select version();
                                                    version                                                    
---------------------------------------------------------------------------------------------------------------
 PostgreSQL 10.5 on x86_64-apple-darwin17.7.0, compiled by Apple LLVM version 9.1.0 (clang-902.0.39.2), 64-bit
(1 row)

test=# with recursive r as ( select 1 as n UNION ALL select n + 1 from r ) select * from r limit 10;
 n  
----
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
(10 rows)
```

## 理由

Postgresql は、そのセレクトのクエリにおいては、クエリグラフのようなものを用意し、必要な分だけ計算する。 Haskell 的なノリで、 fetch by need する。おそらくそれが効いている。

MySQL は、以下の explain を見ていると分かるけれども、

```SQL
mysql> explain with recursive r as ( select 1 as n UNION ALL select n + 1 from r ) select * from r limit 10;                            
+----+-------------+------------+------------+------+---------------+------+---------+------+------+----------+----------------+
| id | select_type | table      | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra          |
+----+-------------+------------+------------+------+---------------+------+---------+------+------+----------+----------------+
|  1 | PRIMARY     | <derived2> | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    3 |   100.00 | NULL           |
|  2 | DERIVED     | NULL       | NULL       | NULL | NULL          | NULL | NULL    | NULL | NULL |     NULL | No tables used |
|  3 | UNION       | r          | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    2 |   100.00 | Recursive      |
+----+-------------+------------+------------+------+---------------+------+---------+------+------+----------+----------------+
3 rows in set, 1 warning (0.00 sec)
```

cte の結果のテーブルが導出されて、そこから PRIMARY の駆動が ALL で走っている。ちなみに、id=3 の駆動の type=ALL は、少なくとも公式ドキュメントを見る限りでは、1回前で新しく追加された rows に対しての ALL を表している様子。

MySQL は、 join にならないかぎり、ある駆動表が依存するテーブルたちは、一度中間テーブルとして全体が実体化される。今回は cte のテーブルを実体化している最中に再帰の上限値をオーバーした。



## 何が言えるか

MySQL で再帰CTE を使う場合は、それは何かしらの(条件付き)閉包を計算したくて、かつ、その結果自体がほしかったものである場合、においてのみ使うとよさそう。具体的には子孫列挙とか。

postgres の性質を活かすと、たとえばグラフ構造をデータベースに突っ込んで、幅優先探索を再帰 CTE 、でできると思われる。`where finished = true limit 1` で終了条件として、 CTE を組めば多分これができる。今回の数列の select を、 `limit 1 offset 10000000` とかにしてみても、利用するリソースは CPU だけだったので、多分効率的に探索が組めるはず。
MPMediaEntityPersistentIDをCoreDataで扱いたい時の備忘録

# MPMediaEntityPersistentIDとは

UInt64のエイリアス。

# CoreDataでは

Int64型はあるがUInt64型は無い。

# 本題

## やりたいこと
`MPMediaEntityPersistentID` をCoreDataのEntityのキーとして使ったりカラムに入れたりしたい。Int64の領域があれば表現の違いだけでUInt64だって入るはず。

## 単純なキャストを試す

```
let before: UInt64 = UInt64.max
let after = Int64(before)
```

Int64のイニシャライザに渡す際の引数がIntで定義されているので `Fatal error: Not enough bits to represent a signed value` が出る

## 結論: bit列を経由する

UInt64.max で考えると、bit列は`1111...1111`と1が64個並んでいる。これはInt64型では`-1`を表す。（bitとsigned, unsignedの数値の考え方を知らない方は「bit 整数」とかでググるとレベルアップ☆）

```
let before: UInt64 = UInt64.max
let after = unsafeBitCast(before, Int64.self)
print(after) // -> -1
```

`unsafeBitCast` を用いるとbit列経由で変換できるのでUInt64とInt64の行き来がデータ本来の内容を失わずに可能。
他の型を入れてもその型での表現方法など一切考慮せずbit列しか見ないので、unsafeの名前の通り理解せずに使うのは危険。

# 追記

そう思っていたらInt64やUInt64のイニシャライザに

```
let after = Int64(bitPattern: before)
```

こんなのがあった。どっちにしてもビット列がそのまま保存できる安心感はありがたい。
OpenCVのSVMで学習を行う小さめのコード

OpenCVのSVMを利用して学習を行う。

```python
# -*- coding: utf-8 -*
import glob
import cv2
import numpy as np

# generateimage array
def creeate_image_array(img_paths):
    images = []
    for img_path in img_paths:
        image = cv2.imread(img_path)
        reshaped_image = image.reshape(image.shape[0] * image.shape[1] * 3)
        images.append(reshaped_image)
    return np.array(images, np.float32)

def main():
    # positive and negative image paths
    pos_img_paths = glob.glob('./data/positive/*')
    neg_img_paths = glob.glob('./data/negative/*')

    # load images
    positive_images = creeate_image_array(pos_img_paths)
    negative_images = creeate_image_array(neg_img_paths)
    images = np.r_[positive_images, negative_images]

    # generate labels
    positive_labels = np.ones(len(pos_img_paths), np.int32)
    negative_labels = np.zeros(len(neg_img_paths), np.int32)
    labels = np.array([np.r_[positive_labels, negative_labels]])

    # SVM
    svm = cv2.ml.SVM_create()
    svm.setType(cv2.ml.SVM_C_SVC)
    svm.setKernel(cv2.ml.SVM_RBF)
    svm.setGamma(10)
    svm.setC(10)
    svm.setTermCriteria((cv2.TERM_CRITERIA_COUNT, 100, 1.e-06))
    svm.train(images, cv2.ml.ROW_SAMPLE, labels)
    svm.save('svm_trained_data.xml')

if __name__ == '__main__':
    main()
```

無加工の画像を利用して学習を行っている。
出力した学習モデルを利用して分類をテストするコードは下記のようになる。

```python
# -*- coding: utf-8 -*
import glob
import cv2
import numpy as np

# generate image array
def creeate_image_array(img_paths):
    images = []
    for img_path in img_paths:
        image = cv2.imread(img_path)
        reshaped_image = image.reshape(image.shape[0] * image.shape[1] * 3)
        images.append(reshaped_image)
    return np.array(images, np.float32)

def main():
    # set test target images
    test_img_paths = glob.glob('./data/test_tagert/*')

    # loading
    svm = cv2.ml.SVM_load("svm_trained_data.xml")
    
    # test
    images = creeate_image_array(test_img_paths)
    predicted = svm.predict(hist)
    result = predicted[1]
    for (i, img_path) in enumerate(test_img_paths):
        if result[i][0] == 1.0:
            print("yes", img_path)
        else:
            print("no", img_path)

if __name__ == '__main__':
    main()
```


## 参考
https://github.com/opencv/opencv/blob/master/samples/python/letter_recog.py#L62
https://algorithm.joho.info/programming/python/hog-svm-classifier-py/
c++でもpythonのstr型のメソッドを使いたい！

自分はpythonをよく利用するのですが、pythonは文字列操作が割と強力な印象を受けます(特にスライス)
普段使いのC++でもpythonみたいに文字列操作したい！
ってことでstd::stringを継承したpythonのstr型のメソッドがほとんどそのまま使える文字列クラスを作ってみました。  

自分のサイトを開設しより詳しく書き直しました！
↓
https://e-tec-memo.herokuapp.com/article/24/

### py_string
https://github.com/ChanTsune/py_string

使用感的にはstd::stringでpythonのstr型のメソッドが使えるだけですかねｗ
std::stringを継承しているのでstd::stringで出来ることは全部できます。
シングルヘッダーライブラリにしたのでインクルードするだけですぐに使えます。
名前空間はpyです。

##使い方
###基本形
```cpp:example.cpp
#include "py_string.hpp"
#include <iostream>

using namespace std;

int main(int argc,char*argv[])
{
  py::string pystr = "hello world!";//py_stringでもpy::stringと同じ

  cout << pystr << endl;
}
```
std::stringと同じです。
##split
```cpp:example.cpp
py::string spstr = "12,3,4-2,2";
std::deque<py::string> slist; //std::vectorでもOK

spstr.split(slist, ",",2);
for (auto &&s : slist)
{
    cout << s << endl;
}
//出力
//12
//3
//4-2,2
```
第一引数はテンプレートを使っているのでpush_backをメンバ関数に持っているcontainerクラスなら何でもいけるはずです。
第二引数を省略するとタブやスペースなどの空白文字で分割されます。
第三引数で分割する最大数を指定できます。分割後の要素数は指定した数+1になります。
std::stringにほしい機能の一つです。そのうち対応してくれないかなぁ...
##format

```cpp:example.cpp
py::string fstr = "{} is {} than {}";
cout << fstr.format(3,"bigger",1) << endl;
//"3 is bigger than 1."
cout << fstr.format(2,"smaller",4) << endl;
//"2 is smaller than 4."
```

{}が先頭から順に引数リストで置き換えられます。

##replace
```cpp:example.cpp
py::string rstr = "1+2-3";
cout << rstr.pyreplace("-","=");
//1+2=3
```

文字列中に登場する第一引数とマッチするすべての要素が第二引数で置き換えられます。
第三引数に数を渡すと置き換える最大数を指定できます。
※std::stringのreplaceと違って自身が置き換わるのではなく置換後の文字列が返ります。

##slice
添字演算子[]がc++の制約で一つしか引数が取れなかったので初期化リストっぽい書き方で対応することにしました。

```cpp:example.cpp

pystr[{0,5}];
//hello
```

若干書きづらいですが許容範囲内かな？

```py:slice.py

string[0:3]
string[3:]
string[::-1]
```
上記のコードに相当する書き方は

```cpp:slice.cpp
string[{0,3}];
string[{3,nullptr}];
string[{nullptr,nullptr,-1}];
```
です。
コロンだけはnullptrで代用することにしました。
この書き方が気持ち悪いと感じる人は、

```cpp:slice.cpp
string.slice(0,3);
string.slice(3,nullptr);
string.slice(nullptr,nullptr,-1);
```
といったようにメンバ関数の形でも同じように呼び出せます。

##添字演算子[]
```cpp:example.cpp
py::string astr = "0123456789";
cout << astr[0] << endl;
// 0
cout << astr[-1] << endl; //一番最後の要素
// 9
cout << astr[-3] << endl; //後ろから三番目の要素
// 7
```

添字演算子をオーバーライドして負の数を利用して後ろからのアクセスもできるようにしました。代入も可能です。
atでも同じことができるようにしてあります。


##その他
一部のstd::stringと名前が被るかつオーバーロード解決ができないメソッドにはpy~って感じの名前をつけています。

それぞれのメソッドの動作は
https://docs.python.org/ja/3/library/stdtypes.html#string-methods
を参照してください。

言語機能的に実装が難しい、あるいは私の技能不足で実装しきれていないメソッドも少しあります。
※pythonではエラーを送出するメソッド(e.g. indexなど)はエラーを送出しないようにしています。

今後もできるものは実装していきたいので、
もし「これできるよ！」とか「こっちのほうが効率的じゃない？」みたいなのがあれば是非プルリクください。
エラー報告もしてもらえると助かります。issue、pull request等
Go言語　基本文法

#コード終端
コードの終端にはセミコロンを入力する。
が、なくても自動補完される。
（個人的にはあった方がわかりやすくて好き）

```go
var a = 2;
var b = 1
```

#変数の宣言

```go
var a int
```

型名が後ろにつくようです。
なんだか違和感！！！
ただし、宣言と同時に初期化する場合は型は不要です！

```go
var b = 1
i := 0
```

#括弧

```go
for i := 0; i < 5; i++ {
   if i == 0 { fmt.Println("0です") }
}
```
if、forなどの条件部分に括弧はあってもなくてもいいですが、ブロック内が単文の場合でも波括弧は必要です。
Deviseでパスワードの入力無しで更新をする方法

デフォルトの設定だと、アカウントの項目を更新するときにパスワードの入力が必要になる。
パスワードなしでも更新できるように設定する。

#　前提条件
rails 5.2.0
devise 4.2.0

# 設定
update_resourceのメゾットを単純にオーバーライドする。

```app/controllers/registrations_controller.rb

class RegistrationsController < Devise::RegistrationsController

#
# 省略
#

  protected

  def update_resource(resource, params)
    resource.update_without_password(params)
  end
end
```

edit.html.erb内にあるcurrent_passwordの項目を削除する。

```ruby:app/views/users/registrations/edit.html.erb
<%#= f.password_field :current_password, autocomplete: "off" %>
```

# ドキュメント
[How To: Allow users to edit their account without providing a password]
(https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-edit-their-account-without-providing-a-password)
[【Ruby on Rails】deviseを使ってアカウントの更新をパスワードの入力無しで更新をする方法]
(https://y-hilite.com/3316/)
[小ネタ] 暗号化済EBSボリュームがアタッチされたEC2インスタンスを起動するIAMポリシー

ちょっとした小ネタです。  
KMSによって暗号化したEBSボリュームをEC2インスタンスにアタッチして起動する場合、そのKMSに対して適切な権限がないとEC2インスタンスを起動することができません。起動したとしてもすぐに `stopped` になってしまいます。  
KMSのキーに対してどの権限を付与すればいいのかドキュメントを探して無かったので検証してみた結果を以下に残します。  
以下はEC2インスタンスを起動・停止・リブートするために必要な最小限の権限です。

```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ec2:StartInstances",
        "ec2:RebootInstances",
        "ec2:StopInstances"
      ],
      "Resource": [
        "arn:aws:ec2::<リージョン>:<アカウントID>:instance/i-xxxxxxxx"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "kms:GenerateDataKeyWithoutPlaintext",
        "kms:Decrypt",
        "kms:CreateGrant"
      ],
      "Resource": "arn:aws:kms:<リージョン>:<アカウントID>:key/<KMS ID>"
    }
  ]
}
```

元記事は[こちら](http://blog.jicoman.info/2018/08/iam-policy-for-ec2-instance-with-enctypted-ebs/)
php-master-changes 2018-08-21

# 2018-08-21
## devnexen: Avoid directly adding to string literal
- https://github.com/php/php-src/commit/16a9dd74f4cd5e79eeffe2e567bfcec4d1369916
- ext/standard の [image_type_to_extension()](http://php.net/manual/ja/function.image-type-to-extension.php) で、clang の警告を潰した
- 結果にドットを含めるかどうかの処理で、リテラルのアドレスに直接フラグの値（0 or 1）を加算する形で返り値をずらしてたのが警告になってたもよう
- 「黙れ clang」という気がしなくもない

## dstogov: Removed dead code
- https://github.com/php/php-src/commit/5e5311e0ba3dc3ff431fd5af1c2705ec8334c7c6
- [20 日の BIND_STATIC の修正](https://qiita.com/sj-i/items/4824db324e366dde7356#dstogov-avoid-hash-lookups-in-bind_static-and-bind_lexical-opcode-handlers) で第 2 オペランドがいらなくなったので不要コードを除去

## devnexen: Support fixed address mmap without replacement
- https://github.com/php/php-src/commit/0f68ff5c92924deb9401ce66458e67f250ccde74
- メモリアロケータの修正
- メモリアロケータが OS から追加の領域を取ってくる際（realloc 的な）、Windows 以外では mmap() を使っていた
- なるべく地続きのメモリ領域を確保するために MAP_FIXED が使いたかったが、MAP_FIXED はすでに別途で使われている領域を指定されると、元からいる奴をぶっ飛ばすという恐ろしいブツだったため、使えなかった
- 最近めに [MAP_FIXED_NOREPLACE](https://lwn.net/Articles/741369/) という、先客がいたらぶっ飛ばさないで諦める奴が追加されたので、Linux ではそちらを使い、FreeBSD では同様の挙動の [MAP_FIXED|MAP_EXCL](https://www.freebsd.org/cgi/man.cgi?query=mmap&sektion=2&manpath=freebsd-release-ports) を使うようになった
- ~~これ元実装では先客がいたら別の箇所を確保して返すだけだったけど、修正後だと単に諦めてしまうの、別によいのだろうか、という気持ち~~
    - 聞いてみたところ、「元の奴ずれたら munmap() してたので意図通りやでー、でもこの際 munmap() に失敗しない限りエラーメッセージは出してなかったので、エラー時の処理はびみょそう」という[話](https://github.com/php/php-src/commit/0f68ff5c92924deb9401ce66458e67f250ccde74#commitcomment-30244167)があった
    - そんでスッと PR がきた https://github.com/php/php-src/pull/3456 ので親指だけ立てといた

## dstogov: Don't use second operand of BIND_STATIC instruction.
- https://github.com/php/php-src/commit/6d88e1ccd67d0b3e57679b3c6caa330de22765d8
- こちらも BIND_STATIC で第 2 オペランドがいらなくなったのをうけ、オペコード/オペコードハンドラ側で第 2 オペランドを UNUSED に修正
- なお、全然別の修正で array_key_exists() に専用のオペコード割り当てて最適化する、という [PR](https://github.com/php/php-src/pull/3360) が存在し、[「あっちは 7.3 にはもう Feature Freeze だからダメって聞いたけど、こっちの BIND_STATIC の修正は何で入れるの！何で入れていいの！」](https://github.com/php/php-src/commit/b8828926f2f6bc9d109960c2d4e2d399f7c0dc5c#commitcomment-30227641)的な会話が 20 日の元修正コミットへのコメントであり、dmitry は「自己完結してる修正は beta でも入れて良いはず、API/ABI の互換性は崩さない方いいけど、あと array_key_exists() についてはちゃんとレビューあればそっちも入れていいんじゃね？」などと言ってたりする


## dstogov: Cleanup
- https://github.com/php/php-src/commit/168376e98e533f9f99159d9f5516e03ab823a302
- ext/opcache で関数テーブル/クラスエントリの破棄処理をリファクタリング
- 元コードでは関数テーブルとクラスエントリのデストラクタをオーバーライドする所があった
- 関数テーブルのデストラクタは、対象がユーザ定義関数で、静的変数があって immutable でなくて、参照カウントを 1 つ減らして 0 になるようなら、静的変数のハッシュテーブルを破棄、というもの
- クラスのデストラクタは、そのクラスの関数テーブルを同様の処理でオーバーライドするもの
- これらのオーバーライドされたデストラクタは、free_persistent_script() の第 2 引数が 1 のケースで呼ばれる
- free_persistent_script() の第 2 引数へ 1 を渡して呼ぶ箇所は同時に zend_accel_free_user_functions() を呼ぶ箇所でもあり、なのでそっちにハッシュテーブルの破棄処理を移動した形のもよう
- 元コードは黙って efree() な感じに見えるので、破棄処理の内容も変わってそう？ここの具体的な差異までは追ってない

## nikic: Drop dead code
- https://github.com/php/php-src/commit/045b74c12c0c2edde44bd0a8a3898a4aad2a1052
- zend_compile_static_var_common() の不要コードの削除
[Android] Enum に Parcelable インタフェースを実装するコード

Android Architecture Components の Navigation の引数に Enum を渡したかったのですが、現状(2018/8/22)の最新バージョン（`1.0.0-alpha04`）では Serializable に対応していなかったので。

下記の `HogeType` を任意の名称に変更してください。またこの例は、Enum の付加情報としてリソースID（`resId`）を付け加えています。`HogeType.HOGE1.resId` や `hogeType.resId` でリソースID を取り出せます。

```kotlin
enum class HogeType(val resId: Int) : Parcelable {
    HOGE1(R.string.text_hoge1),
    HOGE2(R.string.text_hoge2),
    ;

    override fun writeToParcel(dest: Parcel, flags: Int) {
        dest.writeInt(ordinal)
    }

    override fun describeContents(): Int {
        return 0
    }

    companion object {
        @JvmField
        val CREATOR: Parcelable.Creator<HogeType> = object : Parcelable.Creator<HogeType> {
            override fun createFromParcel(`in`: Parcel): HogeType {
                return HogeType.values()[`in`.readInt()]
            }

            override fun newArray(size: Int): Array<HogeType?> {
                return arrayOfNulls(size)
            }
        }
    }
}
```
scala 2.13で導入される予定のtap/pipeを2.12で使う方法

## きっかけ

僕がscalaを書くたびにコピペしてるutilツールの一つにtap関数があります。
[ScalaでRubyのObject\#tapがぽぽぽぽ〜ん。っていうかいつでもmapしたい \- \( ꒪⌓꒪\) ゆるよろ日記](https://yuroyoro.hatenablog.com/entry/20110323/1300854858)
たぶんもう10回以上コピペしていて、いい加減ライブラリ化したいと思っていたところ次のツイートが流れてきました。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://t.co/uc5KXSOgeI">https://t.co/uc5KXSOgeI</a><br>Scalaにtap入った</p>&mdash; Kenji Yoshida (@xuwei_k) <a href="https://twitter.com/xuwei_k/status/1027487545888661505?ref_src=twsrc%5Etfw">2018年8月9日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

2.13でtap関数が標準ライブラリで正式採用、めでたい！

でも僕明日からでもこの標準のシグネチャで使いたいんだよなあ。
しかも[2.13はRC1の締め切りが2018/9月末](https://github.com/scala/scala/milestones)になってる。うーん。

というわけで、scala 2.12用に2.13で導入されるtap/pipeと全く同じものをライブラリで用意しました。
いわゆるバックポートというやつです。

* [bigwheel/tapandpipe](https://github.com/bigwheel/tapandpipe)

## 使い方

### build.sbtに以下を追加

```scala
libraryDependencies += "com.github.bigwheel" %% "tapandpipe" % "1.0"
```

### tap/pipeを使いたいところで以下をimport

```scala
import com.github.bigwheel.util.chaining._
```

### tap/pipeを使う

```scala
object Main {

  def main(args: Array[String]): Unit = {
    val a = 1
    a.tap(println)

    println(a.pipe(_ + 1))
  }

}
```

## 蛇足

5年以上なんとかしたいと思っていた問題がやっと片付きました。標準準拠の実装として2.12でも使えるようになりましたしすっきりです。
RxSwiftのPlaygroundが error: Couldn't lookup symbols が出て動かないとき

## 問題
RxSwiftの勉強をするためにPlaygroundで遊ぼうと思ったら `error: Couldn't lookup symbols:` というエラーが発生し動作しない。

以下のようにPlayground環境を作った。

1. プロジェクト作成
2. `pod init` 実行
3. Podfile に `pod RxSwift` と `pod RxCocoa` を追加
4. `pod install` 実行
5. Xcodeの「File」-> 「New」 -> 「Playground」でPlaygroundを追加
6. `import RxSwift` を記述しRxSwiftのなにかを書く

## 環境
* Xcode -> Version 10.0 beta 5 (10L221o)
* CocoaPods -> 1.5.3
* RxSwift -> 4.2.0


## 解決策
以下を参考に次のように試した。
https://github.com/ReactiveX/RxSwift/issues/1660#issuecomment-404779160 

1. Playground上に書いた `import RxSwift` を削除
2. クリーン (CMD + Shift + K)
3. ビルド (CMD + B) (RxSwiftをimportしていないのでもちろんエラーで終わる)
4. `import RxSwift` を再び復活させる
5. 無事に動く！！
『増補改訂版Java言語で学ぶデザインパターン入門』をKotlinでやってみる（Adapter編）

## 【経緯】
[『増補改訂版Java言語で学ぶデザインパターン入門』をKotlinでやってみる](https://qiita.com/siroykht/items/f67b2c111e9b3b424f1e)の第二回目です。
今回はAdapterパターンです。前回と違い長いのでサンプルコードと練習問題コードに分けました。
## 【サンプルコード】
Android JavaだとTableViewやらListViewやらで良く出てくるイメージ。
Adapterは適合するという意味。Wrapperパターンとも呼ばれる。（個人的にはWrapperと言われた方が馴染み深い）
互換性のないインターフェースを持つものの間の相違を埋めるようなパターンです。Adapterパターンは二つに分類されます。

__1. クラスを継承(is a 関係)を使ったAdapterパターン__
PrintBannerクラスでBannerクラスを継承、Printインターフェースのメソッドをoverrideで実装。
処理を行っているのはPrintBannerクラスということになります。
全然関係ない話ですが、Javaと違ってKotlinだとキーワードが消えるので慣れないと混乱しますね・・・。

```kotlin:Banner.kt
open class Banner(title:String) {
    var string:String = title
    fun showWithParen() {
        Log.d("Banner", "(" + string + ")")
    }
    fun showWithAster() {
        Log.d("Banner", "*" + string + "*")
    }
}
```
```kotlin:Print.kt
interface Print {
    abstract fun printWeak()
    abstract fun printStrong()
}
```
```kotlin:PrintBanner.kt
class PrintBanner(msg:String) : Banner(msg) , Print {
    override fun printWeak() {
        showWithParen()
    }
    override fun printStrong() {
        showWithAster()
    }
}
```
```kotlin:MainActivity.kt
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        var p:Print = PrintBanner("Hello")
        p.printWeak()
        p.printStrong()
    }
}
```
```:出力結果
(Hello)
*Hello*
```

__2. インスタンスによる委譲(has a 関係)を使ったAdapterパターン__
変わっているのはPrintBanner.ktだけ。Main.kt、Banner.kt、Print.ktは上記と同じなので省略します。
PrintBannerクラスではBannrクラスの継承は行わず、インスタンスを作成してクラスのメンバとして処理を行っています。
なので処理を行っているのはBannerクラスになります。

```kotlin:PrintBanner.kt
class PrintBanner(msg:String) : Print {
    var banner:Banner = Banner(msg)
    override fun printWeak() {
        banner.showWithParen()
    }
    override fun printStrong() {
        banner.showWithAster()
    }
}
```
```:出力結果
(Hello)
*Hello*
```

## 【練習問題コード】
Android Studio環境なのでAdapterパターンの実装よりもファイル操作系に引っかかりました。。。

```kotlin:FileIO.kt
interface FileIO {
    fun readFromFile(fileName:String)
    fun writeToFile(fileName: String)
    fun setValue(key:String, value:String)
    fun getValue(key:String) : String
}
```
```kotlin:FileProperties.kt
import java.io.*;
import java.util.*

class FileProperties : Properties(), FileIO {

    override fun writeToFile(fileName: String) {
        store(FileOutputStream(fileName), "written by FileProperties")
    }

    override fun setValue(key: String, value: String) {
        setProperty(key, value)
    }

    override fun readFromFile(fileName: String) {
        load(FileInputStream(fileName))
    }

    override fun getValue(key: String): String {
        return getProperty(key, "")
    }
}
```
```:file.txt(入力ファイル)
year=1999
```
```:newFile.txt(出力ファイル)
#written by FileProperties
#Tue Aug 21 22:13:12 GMT+09:00 2018
day=21
month=4
year=2004
```
bashでif文を書くときの [[ ... ]] と [ ... ] の違い

# TL;DR

`[[ ... ]]`と`[ ... ]`で全然意味が違うらしいという話

※zshとかbash以外のシェルは管轄外です

# 結論

`[[ ... ]]`を使うことにする

# 発端

`.bashrc`を整理していたら、どうにも動いていない設定が見つかった

```bash
if [ -x $(which colordiff) ]
then
  alias diff='colordiff '
else
  alias diff='diff '
fi
```

`colordiff`コマンドがあればそれを`diff`のエイリアスにしようとしていたらしい

たまたま新しい環境で`diff`コマンドを叩いた時にエラーになっているのを見つけた

```
$ diff a b
-bash: colordiff: command not found
```

すごく残念なことになってる…

# 調査

以下参考にさせていただきました

* [\[Bash\] testと\[と\[\[](https://qiita.com/Riliumph/items/f07272fa9b0834032a9d)
* [シェルスクリプト(bash)の「 [ ] 」と「 [[ ]] 」の違い](https://qiita.com/miyazato_te/items/3ecb400666ccad754cc0)

[GoogleのShell Style Guide](https://google.github.io/styleguide/shell.xml#Test,_%5B_and_%5B%5B)にも`[[ ... ]]`を使う！って書いてあるみたい

恥ずかしながら`[`が`test`コマンドを表すみたいな内容はなんとなく知っていたが、`[`と`[[`の違いをちゃんと意識したことはなかった

AND条件`&&`とOR条件`||`の書き方なんかは`[[ ... ]]`の方が直感的にわかりやすく感じた

```bash
# [ ... ] でAND/OR
if [ -f ${FILE_PATH_A} ] && [ -f ${FILE_PATH_B} ]
then
  # 両方trueのときの処理
  ...
fi

# [[ ... ] でAND/OR
if [[ -f ${FILE_PATH_A} && -f ${FILE_PATH_B} ]]
then
  # 両方trueのときの処理
  ...
fi
```

基本bashでしか書く機会ないのでGoogleに乗っかろうと思いつつ、自分以外のコードで出会うときのために細かい違いは抑えておかねばと決意した

# 修正

先の動いてないコードは以下のように修正した

```bash
if [[ -x $(which colordiff) ]]
then
  alias diff='colordiff '
else
  alias diff='diff '
fi
```

これで無事に`colordiff`なんてない環境でも普通に`diff`が動き、`colordiff`がある環境では`diff`のエイリアスとして`colordiff`が効いてくれるようになってくれた

# 自戒

なんちゃってdotfilesはちゃんと検証して使おう
Junit4でのテスト順序を列挙型で制御する


###概要

[JUnitでは`@Test`アノテーションで定義されたメソッドの実行順序は保証されていません。](https://teratail.com/questions/23441)

そこで下記の3つのクラスを作成し、実行順序を制御します。

- OrderedRunner
    - テストクラスに設定するアノテーションクラス
- Order
    - テストメソッドに設定するアノテーションクラス
- TestMethod
    - `Order`クラスの設定値の列挙した列挙型クラス

処理の流れとしてテスト実行時に`OrderedRunner`が各テストメソッドに付与された
`Order`の設定値を読み通り、実行順序を制御する流れになります。

```TestMethod.java

public enum TestMethod {
    strArrayIsNullTest,
    strIsNullTest
};
```

```Order.java

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface Order {
    TestMethod order();
}

```

```OrderedRunner.java
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import org.junit.runners.BlockJUnit4ClassRunner;
import org.junit.runners.model.FrameworkMethod;
import org.junit.runners.model.InitializationError;

public class OrderedRunner extends BlockJUnit4ClassRunner {
    public OrderedRunner(Class<?> klass) throws InitializationError  {
        super(klass);
    }

    @Override
    protected List<FrameworkMethod> computeTestMethods() {
        List<FrameworkMethod> list = super.computeTestMethods();
        Collections.sort(list, new Comparator<FrameworkMethod>() {
            @Override
            public int compare(FrameworkMethod f1, FrameworkMethod f2) {
                Order o1 = f1.getAnnotation(Order.class);
                Order o2 = f2.getAnnotation(Order.class);

                if (o1 == null || o2 == null){
                    return -1;
                }
                return o1.order().ordinal() - o2.order().ordinal();
            }
        });
        return list;
    }
}
```

###実践

```Foo.java
public class Foo {
    public static boolean isNull(String[] arg) {
        return arg == null;
    }

    public static boolean isNull(String str) {
        return str == null || str.length() == 0 || str.equals("");
    }
}

```

``` FooTest.java
import static org.junit.Assert.*;

import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(OrderedRunner.class)
public class FooTest {

    @Test
    @Order(order=TestMethod.strArrayIsNullTest)
    public void strArrayIsNullTest() {
        String[] arg = {"test"};
        assertFalse(Foo.isNull(arg));
        System.out.println("strArrayIsNullTest OK");
    }

    // テストを追加しても、TestMethodに要素を追加すれば順序性が担保される。
    /**
     * @Test
     * @Order(order=TestMethod.reservationsTest)
     * public void reservationsTest();
     */

    @Test
    @Order(order=TestMethod.strIsNullTest)
    public void strIsNullTest() {
        String str = "test";
        assertFalse(Foo.isNull(str));
        System.out.println("strIsNullTest OK");
    }
}
```



参考資料
  - https://qiita.com/kerupani129/items/287b310785e9a0adce06
Atomのペイン分割とカーソル移動のショートカット

ペインの分割とフォーカスを移動する。

ショートカットの説明：
cmd-k up であれば、コマンド＋Kを同時に押して後に上矢印で実行される。

<table>
<thead>
<tr>
<th>Keystroke</th>
<th>Command</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<tr>
<td>cmd-k up</td>
<td>pane:split-up</td>
<td>上にスプリット</td>
</tr>
<tr>
<td>cmd-k down</td>
<td>pane:split-down</td>
<td>下にスプリット</td>
</tr>
<tr>
<td>cmd-k left</td>
<td>pane:split-left</td>
<td>左にスプリット</td>
</tr>
<tr>
<td>cmd-k right</td>
<td>pane:split-right</td>
<td>右にスプリット</td>
</tr>
<tr>
<td>cmd-k cmd-up</td>
<td>window:focus-pane-above</td>
<td>上のペインに移動</td>
</tr>
<tr>
<td>cmd-k cmd-down</td>
<td>window:focus-pane-below</td>
<td>下のペインに移動</td>
</tr>
<tr>
<td>cmd-k cmd-left</td>
<td>window:focus-pane-on-left</td>
<td>左のペインに移動</td>
</tr>
<tr>
<td>cmd-k cmd-right</td>
<td>window:focus-pane-on-right</td>
<td>右のペインに移動</td>
</tr>
<tr>
<td>cmd-k cmd-n</td>
<td>window:focus-next-pane</td>
<td>次のペインに移動</td>
</tr>
<tr>
<td>cmd-k cmd-p</td>
<td>window:focus-previous-pane</td>
<td>前のペインに移動</td>
</tr>
</tbody>
</table>

参考にしました。
https://qiita.com/ryo0301/items/e06ea6bf95910cdbcc29
最新版のCocoaPodsが入らない


# CocoaPodsインストールしようとしたらエラーになる

MacOSのリフレッシュしたので再構築しようとしたらつまづいた

```bash
$ gem install -n /usr/local/bin cocoapods --pre
ERROR:  Could not find a valid gem 'cocoapods' (>= 0), here is why:
          Unable to download data from https://rubygems.org/ - SSL_connect returned=1 errno=0 state=SSLv2/v3 read server hello A: tlsv1 alert protocol version (https://rubygems.org/specs.4.8.gz)
```

OpenSSLのバージョンが古いっぽい

## rubyのOpenSSLのバージョンが古い

gemでアクセスするCDNがTls1.2未満をサポートしなくなったのが原因

```bash
$ echo -e "require 'openssl'\nputs OpenSSL::OPENSSL_VERSION" > openssl.rb
$ ruby openssl.rb
OpenSSL 0.9.8zc 19 Mar 2015
```

証明書入れたりするようなトラブルシューティングが以下のリンクで紹介されているが
そこまで面倒なことはしたくないのでシンプルにrubyを更新する

https://github.com/rubygems/rubygems/issues/1912

## anyenv install

```bash
$ git clone https://github.com/riywo/anyenv ~/.anyenv
$ echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(anyenv init -)"' >> ~/.bash_profile
$ exec $SHELL -l
$ anyenv install -l
Available **envs:
  Renv
  crenv
  denv
  erlenv
  exenv
  goenv
  hsenv
  jenv
  luaenv
  ndenv
  nenv
  nodenv
  phpenv
  plenv
  pyenv
  rbenv
  sbtenv
  scalaenv
  swiftenv
 ```

## rbenv install

```bash
$ anyenv install rbenv

~ 省略 ~
Install rbenv succeeded!
Please reload your profile (exec $SHELL -l) or open a new session.

$ exec $SHELL -l
$ rbenv -v
rbenv 1.1.1-39-g59785f6
```

## ruby install

```bash
$ rbenv install --list
Available versions:
~ 省略 ~
  2.4.4
  2.5.0-dev
  2.5.0-preview1
  2.5.0-rc1
  2.5.0
  2.5.1
  2.6.0-dev
  2.6.0-preview1
  2.6.0-preview2
~ 省略 ~
$ rbenv install 2.5.1
$ rbenv versions
$ rbenv global 2.5.1
$ exec $SHELL -l
$ ruby --version
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin16]
$ ruby openssl.rb
OpenSSL 1.1.0h  27 Mar 2018
```

## CocoaPods install

```bash
$ gem install -n /usr/local/bin cocoapods --pre
$ pod --version
1.5.3
```

無事cocoapods が入りました、Yay!!!