OmniAICreator/Qiita-1.07M huggingface dataset:
Vue.jsで実装するシンプルな吹き出し

inputやtextareaの入力中に、ちょっとした入力ヒントを出したい時があります。
そんな時に便利な、focusで出る吹き出しをVue.jsで実装します。

# 実装デモ
<p data-height="265" data-theme-id="0" data-slug-hash="BqzJJr" data-default-tab="css,result" data-user="chcltn" data-pen-title="Input Balloon by Vue.js - flow3" class="codepen">See the Pen <a href="https://codepen.io/chcltn/pen/BqzJJr/">Input Balloon by Vue.js - flow3</a> by Shoko Oyamada (<a href="https://codepen.io/chcltn">@chcltn</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>


# 吹き出しの実装の流れ
1.　[単純な吹き出しをHTMLとCSSで作る](#1単純な吹き出しをhtmlとcssで作る)
2.　[focusとblurでv-showを切り替える](#2focusとblurでv-showを切り替える)
3.　[吹き出し内のリンクもクリック出来るようにする](#3吹き出し内のリンクもクリック出来るようにする)

##1.単純な吹き出しをHTMLとCSSで作る

ごく単純な吹き出しをHTMLとCSSで実装します。
ここではまだ吹き出しは最初から表示されており、focus時の動きはありません。
<p data-height="265" data-theme-id="0" data-slug-hash="oaLpVW" data-default-tab="css,result" data-user="chcltn" data-pen-title="Input Balloon by Vue.js - flow1" class="codepen">See the Pen <a href="https://codepen.io/chcltn/pen/oaLpVW/">Input Balloon by Vue.js - flow1</a> by Shoko Oyamada (<a href="https://codepen.io/chcltn">@chcltn</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

##2.focusとblurでv-showを切り替える

フラグとなる変数 ``isFocused``をdata内に作っておきます。
この変数を、inputにfocus/blurした時にtrue/falseで切り替わるようにします。

methodでそのisFocusedをtrueにするメソッド``openBalloon``を作ります。
同様にfalseにする``closeBalloon``も記述します。

この2つのメソッドを、HTML側で、inputのv-onディレクティブで呼び出すようにしています。
そして、``input-balloon``は、v-showで``isFocused``がtrueのときのみ表示させるようにします。

<p data-height="265" data-theme-id="0" data-slug-hash="dgXJNX" data-default-tab="css,result" data-user="chcltn" data-pen-title="Input Balloon by Vue.js - flow2" class="codepen">See the Pen <a href="https://codepen.io/chcltn/pen/dgXJNX/">Input Balloon by Vue.js - flow2</a> by Shoko Oyamada (<a href="https://codepen.io/chcltn">@chcltn</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

（v-ifでも実装可能ですが、吹き出しは表示切り替え頻度が高いコンポーネントであることから、ここではv-showが良いでしょう）

##3.吹き出し内のリンクもクリック出来るようにする

正直なところ、上記だけであればVueで実装する必要はなく、CSSのみで作ることができます。``input:focus``のように擬似クラスを使います。

しかしながら実際のアプリケーション開発の現場では、この吹き出し内にリンクなど貼りたいことがあるでしょう。
以下では、リンクをクリックしても（つまり、blurしても）吹き出しが閉じないようにしています。

まず、HTML側では``backdrop``というdivを用意します。
それをCSSで``position:fixed``の``opacity:0``に設定しましょう。
透明なため目には見えませんが、この``backdrop``は画面全体に描写されます。

先ほどinputのblurに設定した``closeBalloon``というメソッドを、この``backdrop``に移動します。（同時に、blurでなくclickにします）
また、この``backdrop``もv-showでfocus時のみ現れるようにしておきます。


<p data-height="265" data-theme-id="0" data-slug-hash="BqzJJr" data-default-tab="css,result" data-user="chcltn" data-pen-title="Input Balloon by Vue.js - flow3" class="codepen">See the Pen <a href="https://codepen.io/chcltn/pen/BqzJJr/">Input Balloon by Vue.js - flow3</a> by Shoko Oyamada (<a href="https://codepen.io/chcltn">@chcltn</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

これで、ごくシンプルな吹き出しがVueで実装できました。
お疲れ様でした。
abc 064

B
クリスマスもあと半年となり、トナカイのAtCoDeer君はプレゼントを配る計画を立てることにしました。
TopCoDeer通りには N 個の家が並んでいます。i 個目の家は座標 ai にあります。彼はこのすべての家にプレゼントを配ることにしました。
好きな場所から開始し好きな場所で終了することができる時、最小の移動距離を求めなさい。

```
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
	int N, a[110];
	cin >> N;
	for (int i = 0; i < N; ++i) {
		cin >> a[i];
	}
	sort(a, a + N);
	cout << a[N - 1] - a[0] << endl;
	return 0;
}
```

C
AtCoderでは、コンテストに参加すると「色」が付き、これはレートによって次のように変化します： 
レート 1-399：灰色
レート 400-799：茶色
レート 800-1199：緑色
レート 1200-1599：水色
レート 1600-1999：青色
レート 2000-2399：黄色
レート 2400-2799：橙色
レート 2800-3199：赤色
また、レートが 3200 以上になると色を自由に変えることができます。
現在 N 人の人がAtCoderのコンテストに参加したことがあり、i 人目の人のレートは ai です。
そのとき、色の種類数の最小値と最大値を求めなさい。
制約
1≤N≤100
1≤ai≤4800
ai は整数である。

```
#include<iostream>
using namespace std;
int main() {
	int N;
	int a[110];
	int b[9];
	for (int i = 0; i < 9; ++i) {
		b[i] = 0;
	}
	cin >> N;
	for (int i = 0; i < N; ++i) {
		cin >> a[i];
		for (int j = 0; j < 8; ++j) {
			if (j * 400 <= a[i] && a[i] < (j + 1) * 400)
				b[j]++;
		}
		if (3200 <= a[i])
			b[8]++;
	}
	int mn = 0;
	int mx = 0;
	for (int j = 0; j < 8; ++j) {
		if (b[j] > 0) {
			mn++;
			mx++;
		}
	}
	if (mn == 0)mn++;
	if (b[8] > 0)mx += b[8];
	cout << mn << " " << mx;
	return 0;
}
```
いや悪問題すぎるでしょ。色を自由に変えることができるって8色のなかでのことじゃなくてホントに何色にでも変えられるのかよ。これは問題文が渋いな。
abc 063

B
英小文字からなる文字列 S が与えられます。S に含まれる文字がすべて異なるか判定してください。

```
#include<iostream>
#include<string>
using namespace std;
int main() {
	string S;
	cin >> S;
	bool ans = true;
	for (int i = 0; i < S.size() - 1; ++i) {
		for (int j = i + 1; j < S.size(); ++j) {
			if (S[i] == S[j])
				ans = false;
		}
	}
	if (ans)
		cout << "yes" << endl;
	else
		cout << "no" << endl;
	return 0;
}
```
スピード上がってきたちょっと

C
あなたはコンピュータで試験を受けています。試験は N 問の問題からなり、i 問目の問題の配点は si です。それぞれの問題に対するあなたの解答は「正解」または「不正解」のいずれかとして判定され、正解した問題の配点の合計があなたの成績となります。あなたが解答を終えると、解答がその場で採点されて成績が表示される…はずでした。
ところが、試験システムに欠陥があり、成績が 10 の倍数の場合は、画面上で成績が 0 と表示されてしまいます。それ以外の場合は、画面に正しい成績が表示されます。この状況で、成績として画面に表示されうる最大の値はいくつでしょうか？

```
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main() {
	int N;
	vector<int>V;
	cin >> N;
	int sum = 0;
	for (int i = 0; i < N; ++i) {
		int s;
		cin >> s;
		V.push_back(s);
		sum += s;
	}
	if (sum % 10 != 0) {
		cout << sum;
		return 0;
	}
	else {
		sort(V.begin(), V.end());
		for (int i = 0; i < N; ++i) {
			if (V[i] % 10 != 0) {
				cout << sum - V[i] << endl;
				return 0;
			}
		}
	}
	cout << 0 << endl;
}
```
ｃにしてはバリ簡単だったな
Springの＠Transactionalではまったこと

##はじめまして
初投稿です。
仕事しててつまづいたことに対する備忘録的な投稿がほとんどになると思います。
お手柔らかに。。。

##環境
Java 8
Spring Boot 1.5.14

##やりたかったこと
＠Transactionalでトランザクション管理して、DB(MySQL)に更新処理をさせる

##つまづきポイント
Serviceクラスに＠Transational(readonly=true)アノテーションが付与されていて
そのクラスのメソッドで

'''hogeRepository.save()

のような保存処理を行ってました

##エラー内容
Caused by: java.sql.SQLException: Connection is read-only. Queries leading to data modification are not allowed


##結論
更新処理を投げるトランザクションは
＠Transational(readonly=**false**)
にしないとだめ。

##その他
クラスとメソッド両方に@Transactionalを付与するとメソッドに定義したもので上書き

##感想
予期しないところにトランザクションが張られないためにも(メソッドを追加するなどして)
クラスに＠Transactionalを付与するのはあんまりよくないと思いました

##メモ
https://dev.classmethod.jp/server-side/java/spring-nested-declarative-transaction/

##追記(2019/1/22)
＠Transactional(readOnly=xxxx)を付与し忘れたメソッドで、
Serviceからrepositoryにアクセスしてデータを取得したのち、
当該Serviceクラスのメソッド外でJPAのLazyLoadでネストしたデータを取得すると
LazyInitializationExceptionが発生しました。
メソッド外だと遅延ロードするLazyLoadが効かなくなるので要注意です。
【備忘録】Pythonの可視化ライブラリHoloviews

Pythonのグラフ描画ライブラリHoloviewsについての備忘録です。

Python製の可視化ライブラリです。出力結果はmatplotlib,bokeh,plotlyにすることができます。
http://holoviews.org/

### 環境
* Python 3.6
* Holoviews 1.10.7


# 基本操作

### 軸名、タイトルを表示
* kdims : 横軸の名前。Key Dimention
* vdims : 縦軸の名前。Value Dimention
* label : グラフのタイトル

```python
xs1 = range(-10,11)
ys1 = [100-x**2 for x in xs1]
c1 = hv.Curve((xs1, ys1), kdims="x_name", vdims="y_name", label="graph_title")
```

### グリッド線を表示
Optionメソッドで`show_grid=True`を指定する。

```python
xs = range(-10,11)
ys = [100-x**2 for x in xs]
curve = hv.Curve((xs, ys)).options(show_grid=True)
```

### 軸範囲の同期
グラフを並べて表示したとき、デフォルトでは軸範囲が同期されます。
たとえば以下のコードだと、左側のグラフ（`c1`）の軸範囲を変更すると、右側のグラフ（`c2`）も軸範囲も変わります。

```python
import math
xs1 = range(-10,11)
xs2 = range(-5,5)
ys1 = [100-x**2 for x in xs1]
ys2 = [10*math.sin(x) for x in xs2]
c1 = hv.Curve((xs1, ys1))
c2 = hv.Curve((xs2, ys2))
c1+c2
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/37903/513d7087-2b07-3055-d1e8-5a16dd72fba0.png)


軸範囲を同期させないようにするには、以下のオプションを設定する必要があります。

```python
layout = c1+c2
layout.options(shared_axes=False)
```


# 特徴的なグラフ

### 積み上げ面グラフを表示する
`hv.Area.stack`を使用する。

```python
python = pd.DataFrame({
    "x": [0, 1,2,4],
    "y": [0, 1,2,4]
})
julia = pd.DataFrame({
    "x": [0, 1,2,4],
    "y": [0, 1,4,8]
})
overlay = (hv.Area(python)* hv.Area(julia)).options('Area', fill_alpha=0.5, show_grid=True)
hv.Area.stack(overlay)
```

http://holoviews.org/gallery/demos/bokeh/area_chart.html 参考

# Bug

### グラフタイトルに日本語が含まれているグラフが表示されない（v1.10.7）


グラフタイトルに日本語が含まれているグラフ`c2`を、Layoutで複数表示させようとすると、`c2`は表示されませんでした。
ただし、グラフタイトルを一重引用符で括ったグラフ`c3`は、表示されました。なぜ？

```python
hv.extension('bokeh')

xs1 = range(-10,11)
ys1 = [100-x**2 for x in xs1]
c1 = hv.Curve((xs1, ys1))
c2 = hv.Curve((xs1, ys1), label="あ")
c3 = hv.Curve((xs1, ys1), label="'あ'")

hv.ipython.display(c2) # OK
hv.ipython.display(c1+c2) # Bad (One Graph)
hv.ipython.display(c1+c3) # OK (Two Graph) . Why?
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37903/fb8d81c0-3e62-d975-87d8-495d22e7ac1a.png)
Laravel 5.7 Controller内でDatabaseのカラム名を取得

Laravelメモ。
特定テーブルの全カラム名を取得する。

```
use Illuminate\Support\Facades\Schema;

class HogeContoroller extends Controller
{
  public function someFunction()
  {
    $columns = Schema::getColumnListing('mytables')
  }
}
```
[Mac]~/.ssh/config から Host => HostName の対応表を作って出力する

## 前置き
※前置きはどうでもいいんだよ！って方は [本題](https://qiita.com/tommy_aka_jps/items/9d1dc6ce7e206a30901f#%E6%9C%AC%E9%A1%8C) からどうぞｗ

最近 MacBook デビューしました私です。(会社からの借り物ですが)

いまいろいろセットアップをしているところですが、SSH接続関係のセットアップの際に、[**.ssh/configファイルでSSH接続を管理する**](https://qiita.com/0084ken/items/2e4e9ae44ec5e01328f1) を参考にSSHでサーバーに接続する設定を `~/.ssh/config` に書いておき、SSH接続は名前だけで接続できるようにしました。

こんなかんじです。(※細かい設定はここでは端折ってます)

```sh:~/.ssh/config
Host hoge_1
  HostName 192.0.2.1
  User johnsmith
  Port 22
  IdentityFile ~/.ssh/xxxxxxxx
Host hoge_2
  HostName 192.0.2.2
  User johnsmith
  Port 22
  IdentityFile ~/.ssh/xxxxxxxx
Host hoge_3
  HostName 192.0.2.3
  User johnsmith
  Port 22
  IdentityFile ~/.ssh/xxxxxxxx
Host hoge_4
  HostName 192.0.2.4
  User johnsmith
  Port 22
  IdentityFile ~/.ssh/xxxxxxxx
Host hoge_5
  HostName 192.0.2.5
  User johnsmith
  Port 22
  IdentityFile ~/.ssh/xxxxxxxx
```

## 本題
設定自体は人からもらったものを流用していることもあり、目的のサーバーへ繋ぐための名前がわからなくなることがよくあります。

`~/.ssh/config` を都度見て確認していますが、上記のサンプルくらいのボリュームならともかく実際の config はもっとたくさん設定が書いてあり長いです。

これを毎回ファイルを見て調べるのは面倒なので、名前と接続先だけを一覧表として出力するコマンドを作ってみました。


### コマンド
```sh
$ cat ~/.ssh/config | grep -e 'Host ' -e 'HostName' | sed -e 'N;s/\n//g' | awk '{print $2" => "$4}'
```

### 出力結果
```
hoge_1 => 192.0.2.1
hoge_2 => 192.0.2.2
hoge_3 => 192.0.2.3
hoge_4 => 192.0.2.4
hoge_5 => 192.0.2.5
```

ポイントは sed コマンドにつけている `N;` です。細かい話はここでは端折りますが、簡単に言うと2行単位で処理をするというものです。

### ざっくり解説(スキップ可)
#### `grep -e 'Host ' -e 'HostName'` の時点

```
Host hoge_1
  HostName 192.0.2.1
Host hoge_2
  HostName 192.0.2.2
Host hoge_3
  HostName 192.0.2.3
Host hoge_4
  HostName 192.0.2.4
Host hoge_5
  HostName 192.0.2.5
```

こんな風に10行出力されます。sed コマンドは普通は1行単位で処理をしますが、これを2行単位で処理をすることができるというありがたいオプションです。２行の出力を1行として扱うようにすると言い換えてもいいかもしれません。

詳しくはこちらのエントリが参考になります。
http://blog.livedoor.jp/morituri/archives/52036613.html

#### `sed -e 'N;s/\n//g'`　まで実行すると
こうなります。一度に2行づつ処理したので10行あったものが5行になりました。
改行を消してもいるため１行目と２行目の文字列がそのまま横に並んでいます。

```
Host hoge_1  HostName 192.0.2.1
Host hoge_2  HostName 192.0.2.2
Host hoge_3  HostName 192.0.2.3
Host hoge_4  HostName 192.0.2.4
Host hoge_5  HostName 192.0.2.5
```

あとは awk で好きなように出力すればおｋというかんじです。
今回は `hoge_1 => 192.0.2.1` と出力させたいので `awk '{print $2" => "$4}'` としてます。


## エイリアス登録
ついでにエイリアス登録しておきます。(会社の先輩から言われるまで全くその発想が出なかったのは内緒)
コマンドを別ファイルにする必要はないのですが、こうすると面倒なシングルクオートのエスケープに悩まされることがなくなりますので個人的にはおすすめの手法です。

### コマンドを別ファイルに
```sh:~/.myscripts/ssh_list.sh
#!/bin/sh
cat ~/.ssh/config | grep -e 'Host ' -e 'HostName' | sed -e 'N;s/\n//g' | awk '{print $2" => "$4}'
```
### alias で別ファイルにしたコマンドを実行
```sh:~/.bash_profile
alias sshlist='. ~/.myscripts/ssh_list.sh'
```


これで `sshlist` コマンドを実行すればいつでも対応表を呼び出せるようになりました。よかったら試してみてください。

## 動作環境
- macOS 10.13.6 High Sierra
BindのSlaveサーバでのゾーン転送設定漏れ(/var/namedのパーミッション設定漏れ)

LAN用のDNSサーバなんてぇのは本当は置きたくないんですが、
どうにもdns名をハードコードしないとプログラムが作れないらしく
仕方なく社内LAN向けのゾーンサーバを立てているのですが。

どうもゾーン転送がうまくいかない。

ログを追ってみたら以下の通り。

```bash
zone example.org/IN: transfer: could not set file modification time of '/var/named/example.org.zone': permission denied
```
書き込めない、と…

とりあえずゾーンファイルを確認。

```bash
# ll example.org.zone
-rw-r--r-- 1 root  root   766 mm dd hh:mm yyyy example.org.zone
```

PSでプロセス確認。

```bash
# ps auxww | grep named
named     1533  0.6  6.5 179576 32640 ?        Ssl  13:19   0:53 /usr/sbin/named -u named
```

…………………………
そりゃ書けませんよね。

今回のミスは、rootでゾーンファイル作成したことが原因。
rootで作ってもいいんですけど、パーミッション、オーナーを変えてないのがダメな点。
とりあえず以下2コマンドで変更。

```bash
# chmod 664 example.org.zone
# chown root:named example.org.zone
```

ってしまして、Slave側で

```bash
# rndc retransfer example.org
```

しますが、失敗…

答えはここ。

```bash
# ll -d /var/named
drwxr-x--- 5 root named 4096 mm dd hh:mm yyyy /var/named
```
デフォルトだと、/var/namedディレクトリに対してグループに書き込み権限はなし。
セキュリティ面を考えると妥当な設定ですね。
しかし、ゾーン転送を受けるDNS Slaveサーバはnamedプロセスから書き込みできないと
zoneのSerialが更新されてるのを確認してSlave自身のゾーンファイルの更新をしたいのに
書き込み権限がないので、更新ができないという事象が発生していた模様。

とりあえず、

```bash
# chmod 770 /var/named
```
でパーミッションを変更したらうまくいきました。

でも、これでいいのか…？
非IT企業でもslackを導入してもらうための提案スライドを作りました



slackの簡単な説明スライド作りました。

布教気味な内容です。
https://www.slideshare.net/ssuser68dea4/01-slack


slideshareにpptxをアップしたら源ノ角ゴシックの英文字がなんか変になっちゃったな。

<hr>
このスライドの続編を作るとしたら、内容としては、基本操作～アドバンス操作（もっと詳しく）的な感じになるだろうか。


▼案

1.導入準備
ワークスペース
チャンネル
操作方法や画面構成の説明

2.これだけは抑えておきたい基本操作3つ
メッセージを書く	
メンションする
メッセージにリアクションする（絵文字リアクションボタン）

3.慣れてきたらもっと便利に使おう
Bot
Reminder（スラッシュコマンド）
API連携　インテグレーション



▼これだけは抑えておきたい基本操作3つ
 1.　メッセージを書く＊
各チャンネルに入ったら、画面下部にメッセージを書くスペースがあります。




2.　メンション＊
特定の人に特に読んでほしいとき、通知したいときには ｀@｀ を用いてメンションを使います。
メッセージ編集画面で ｀@｀ を入力すると、メンション可能なメンバー一覧が表示されます。


ワークスペースいる全員に通知したいときは ｀@everyone｀を使います。

チャンネルにいる全員に通知したいときは　｀@channel｀ を使います。





3.　メッセージに対するアクション
絵文字、メンション、引用返信



▼アクションを促す


「お手数ですが、このメッセージを確認したら、絵文字（リアクションボタン）を押して読んだことを教えてください。」
などと書いて、操作を促す。

<hr>
とにかくハードルを下げること、
必要最低限必要なものに絞って、小出しに情報を出していって操作に慣れてもらうこと、
<p>#slack_tipsのようなチャンネルで機能紹介や有用なURL（主にslack公式の該当ページ）を1回/1～3日 程度流す</p>
楽しげな雰囲気を醸す、
積極的に絵文字使って人のメッセージに反応する、


そんなことを意識して、ひとまず導入1週間を終える。
Bot、RPAなどなど、自身も学ばないとなー。
abc 061

B
N 個の都市があり、M 本の道路があります。
i(1≦i≦M) 番目の道路は、都市 ai と 都市 bi (1≦ai,bi≦N) を双方向に結んでいます。 
同じ 2 つの都市を結ぶ道路は、1 本とは限りません。 
各都市から他の都市に向けて、何本の道路が伸びているか求めてください。 

```
#include<iostream>
using namespace std;
int main() {
	int N, M;
	int a[50], b[50];
	int count[51];
	cin >> N >> M;
	for (int i = 1; i <= 50; ++i) {
		count[i] = 0;
	}
	for (int i = 0; i < M; ++i) {
		cin >> a[i] >> b[i];
		count[a[i]]++;
		count[b[i]]++;
	}
	for (int i = 1; i <= N; ++i) {
		cout << count[i] << endl;
	}
	return 0;
}
```
初期化忘れないよう

C
空の配列が 1 つあります。 
この配列に、整数を配列に挿入する操作を N 回行います。 
i(1≦i≦N) 回目の操作では、配列に整数 ai を bi 個挿入します。 
N 回の挿入操作後の配列の中で、K 番目に小さい数を求めてください。 
例えば、配列が {1,2,2,3,3,3} の時、4 番目に小さい数は 3 となります。 
制約
1≦N≦105 
1≦ai,bi≦105 
1≦K≦b1…+…bn
入力は全て整数である。 

```
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main() {
	int N, K;
	cin >> N >> K;
	int a[100001]; int b[100001];
	vector<int>V;
	for (int i = 0; i < N; ++i) {
		cin >> a[i] >> b[i];
		for (int j = 0; j < b[i]; ++j)
			V.push_back(a[i]);
	}
	sort(V.begin(), V.end());
	cout << V[K - 1] << endl;
	return 0;
}
```
馬鹿正直なやり方。TLEをくらう。

```
#include<iostream>
#include<algorithm>
using ll = long long;
using namespace std;
const int AMAX = 100000;
ll cnt[AMAX + 1];
int main() {
	int N;
	ll K;
	cin >> N >> K;
	for (int i = 0; i < N; ++i) {
		int A, B;
		cin >> A >> B;
		cnt[A] += B;
	}
	for (int ans = 1; ans <= AMAX; ++ans) {
		if (K <= cnt[ans]) {
			cout << ans << endl;
			break;
		}
		K -= cnt[ans];
	}
	return 0;
}
```
展開しないやり方。全く難しいことを言っていないが、バケツソートというらしい。
Azure VM拡張機能のAntimalwareスケジュールスキャン設定を変更する

Azure Virtual Machinesの拡張機能でAntimalwareを有効にしたあとにスケジュールスキャン設定を変更する方法です。
OS上の実体はWindows Defenderが動作しています。

# 拡張機能インストール
* 拡張機能から「Microsoft Antimalware」を選択します。ここはVM作成と同時にインストールしてもよいです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/f486577b-1604-4090-4e90-d001674d03c4.png)

* 色々設定入れれますが、とりあえずここはデフォルトのままでいきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/85d90ee7-9a94-1228-4f4a-c73fdfaf3e4d.png)

* 拡張機能がインストールされればOKです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/4282f40c-3de5-06a5-4b7a-55b33067d393.png)

# 現在の設定を確認する

* Cloud Shell(Bash)を起動します。
[Azure Cloud ShellのBashのクイックスタート](https://docs.microsoft.com/ja-jp/azure/cloud-shell/quickstart)

* 以下コマンドを実行します。

```
$ az vm extension show --name "IaaSAntimalware" --resource-group [Your Resource Group] --vm-name [Your VM Name]
```

* 抜粋してますが、結果が以下のようにJSONで返ってきます。

```
・・・
  "settings": {
    "AntimalwareEnabled": true,
    "Exclusions": {
      "Extensions": "",
      "Paths": "",
      "Processes": ""
    },
    "RealtimeProtectionEnabled": "true",
    "ScheduledScanSettings": {
      "day": "7",
      "isEnabled": "false",
      "scanType": "Quick",
      "time": "120"
    }
・・・
```

* ScheduledScanSettingsのisEnabledがfalseになっているので、スケジュールスキャンが無効になっていることが分かります。

# 設定を変更する
今回は「クイックスキャンを毎日AM4:00に実行する」という定義に変えてみます。

* 設定ファイルをJSONで作成します。

```
$ cd clouddrive
$ mkdir antimalware
$ cd antimalware
$ vi settings.json
```

* 以下の設定を記述します。

```
{
        "AntimalwareEnabled": true,
        "Exclusions": {
                "Extensions": "",
                "Paths": "",
                "Processes": ""
        },
        "RealtimeProtectionEnabled": "true",
        "ScheduledScanSettings": {
                "day": "0",
                "isEnabled": "true",
                "scanType": "Quick",
                "time": "240"
        }
}
```

dayの数値は、0～7までで、毎日/日曜日～土曜日の順に数値で指定します。
timeは0時を起点に何分プラスするかで計算します。240だとAM4:00になります。

* 作成した設定ファイルを指定してコマンドを実行します。

```
$ az vm extension set --name "IaaSAntimalware" --publisher "Microsoft.Azure.Security" --resource-group [Your Resource Group] --vm-name [Your VM Name] --settings settings.json
```

# 補足：タスクスケジューラーにスキャンタスクが存在しない？
Windowsタスクスケジューラーに「Windows Defender Scheduled Scan」タスクが存在しない場合は、「IaaSAntimalware拡張機能が有効になっているが、スケジュールスキャンが無効になっている」場合が考えられるので、拡張機能の設定を確認してみてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/ec0428ab-5d6d-1def-83f1-af2d55aad2ab.png)
TypeScript - WideningLiteralTypes -

# LiteralTypes の Widening / NonWidening -

let / const で明示的型キャストを付与せずに宣言すると以下のとおりとなる。

```typescript
const ONE = 1 // ONE: 1
let TWO = 2   // TWO: number
```

const によるプリミティブの暗黙的型キャストは LiteralTypes となるが、**これが普通の LiteralTypes ではない。**以下では Numeric で解説するが、LiteralTypes において当てはまる。Annotation / Assertion を付与すると `NonWidening` となり、明示的型キャストがない場合 `Widening` となる。これは VSCode などの見た目上では気づかない。

```typescript
const THREE = 3 //    THREE: 3 (Widening NumericLiteralTypes)
const FOUR: 4 = 4 //   FOUR: 4 (NonWidening NumericLiteralTypes)
const FIVE = 5 as 5 // FIVE: 5 (NonWidening NumericLiteralTypes)
```

# WideningLiteralType について

[TypeScript2.1](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-1.html)にひっそりと書かれていることと、よく参照される[issue](https://github.com/Microsoft/TypeScript/pull/11126#commits-pushed-9771f42)にまとまっている。**LiteralTypes と双方互換がある別型**と認識した方が良さそう。

```typescript
const c1 = cond ? "foo" : "bar";  // widening "foo" | widening "bar"
const c2: "foo" | "bar" = c1;  // "foo" | "bar"
const c3 = cond ? c1 : c2;  // "foo" | "bar"
const c4 = cond ? c3 : "baz";  // "foo" | "bar" | widening "baz"
const c5: "foo" | "bar" | "baz" = c4; // "foo" | "bar" | "baz"
let v1 = c1;  // string
let v2 = c2;  // "foo" | "bar"
let v3 = c3;  // "foo" | "bar"
let v4 = c4;  // string
let v5 = c5;  // "foo" | "bar" | "baz"

```

# 挙動の違い

冒頭の通り、推論結果の見た目上では Widening / NonWidening は判別できない。

```typescript
const INCREMENT = "INCREMENT"
const SET_COUNT = "SET_COUNT" as "SET_COUNT"
```
```typescript
/** 【推論結果】 **/
const INCREMENT: "INCREMENT"
const SET_COUNT: "SET_COUNT"
```

WideningStringLiteral は object に代入することで、string型になる。

```typescript
const object = {
  INCREMENT, // (Widening)
  SET_COUNT, // (NonWidening)
}
```
```typescript
/** 【推論結果】 **/
const object: {
  INCREMENT: string;
  SET_COUNT: "SET_COUNT";
}
```

WideningLiteral instance に対し、typeof WideningLiteral instance で Assertion を付与すると、NonWideningLiteral になる。

```typescript
const object = {
  INCREMENT: INCREMENT as (typeof INCREMENT),
  SET_COUNT
}

```
```typescript
/** 【推論結果】 **/
const object: {
  INCREMENT: "INCREMENT";
  SET_COUNT: "SET_COUNT";
}
```

const は再代入不可であり、object は再代入可能という性質の折衷案と察した。widening に気づきやすい環境に期待。
abc 060

B
あなたは、正の整数をいくつか選び、それらの総和を求めます。
選ぶ数の上限や、選ぶ整数の個数に制限はありません。 どんなに大きな整数を選んでもよいですし、整数を 5000 兆個選んでもよいです。 ただし、選ぶ数はすべて A の倍数でなくてはいけません。 また、少なくとも 1 つは整数を選ばなくてはいけません。
そして総和を B で割ったあまりが C となるようにしたいです。 こうなるように整数を選ぶことが出来るか判定してください。
出来るならば YES、そうでないならば NO を出力してください。



A の倍数はいくつ足しても A の倍数です。よって、実は選ぶ数は 1 個だけ で良いです (いくつか選んで足さなくても、最終的な総和を直接選べます)。 次に、A%B,2A%B,3A%B,... という数列を考えます。なお A%B は A を B で割ったあまりを表します。 ここで、(k + B)A%B = (kA + BA)%B = kA%B に注目すると、この数 列は周期的で、最初の B 個の要素を繰り返す数列になっていることがわかり ます。 よって、この問題は A から BA まで、愚直に B で割った余りを求めて調べればよいです

```
#include<iostream>
#include<string>
using namespace std;
int main() {
	int A , B , C;
	cin >> A >> B >> C;
	bool ans = false;
	for (int k = 1; k < B; ++k) {
		if (k*A%B == C)
			ans = true;
	}
	if (ans)
		cout << "YES" << endl;
	else
		cout << "NO" << endl;
	return 0;
}
```
良問やな！常識にしてこう。余りは周期性に着目やな

C
とある銭湯には、スイッチを押すと T 秒間お湯が出るシャワーがあります。
なお、お湯が出ているときにスイッチを押すと、そのタイミングから T 秒間お湯が出つづけます。 お湯の出る時間が T 秒間延長されるわけではないことに注意してください。
このシャワーの前を、N 人の人がスイッチを押して通り過ぎていきます。 i 人目の人は、1 人目の人がスイッチを押した ti 秒後にスイッチを押します。
お湯が出る時間の総和は何秒かを求めてください。

```
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
int main() {
	ll N;
	ll T;
	ll t[200001];
	ll tx[200001];
	ll ans = 0;
	cin >> N >> T;
	for (ll i = 0; i < N; ++i) {
		cin >> t[i];
	}
	for (ll i = 0; i < N - 1; ++i) {
		tx[i + 1] = t[i + 1] - t[i];
	}
	for (ll i = 1; i < N; ++i) {
		if (tx[i] < T) {
			ans += tx[i];
		}
		else {
			ans += T;
		}
	}
	ans += T;
	cout << ans << endl;
	return 0;
}
```
久しぶりにc自力でちゃんと通せたな
SQL Serverのトランザクションの分離レベルについて簡単なまとめ

# 概要

SQL Serverに、複数のトランザクションが同時に実施されるとき、下記のようなデータの不整合現象が発生する。

### ・ダーティ リード(dirty read)
トランザクションAが、トランザクションBの処理最中でまだ<font color="Red">***コミットしてないものを、読み出す***</font>現象。

### ・反復不可能読み取り
トランザクションAが、同じレコードを２回読む間に、<font color="Red">***トランザクションBが該当レコードを更新したため***</font>、２回の読む結果が違う現象。

### ・ファントムリード(Phantom lead)
トランザクションAが、２回読む間に、<font color="Red">***トランザクションBが削除、挿入をしたため***</font>、２回の読む結果が違う現象。


# 分離レベルとは

上記の不整合現象を防ぐために、トランザクション分離レベルが定義されている。

## １、通常類分離レベル(Lockで制御)
### ・READ UNCOMMITTED
【no Lock】
未コミット状態のデータであっても読み込む。

### ・READ COMMITTED
【読む文時点だけLock】
コミットされたデータのみを読み込む。
しかし、他Transactionでコミットされた結果が反映されてしまう。
 ⇒　同じレコードを２回読む間に変更により【反復不可能読み取り】が発生

### ・REPEATABLE READ
【Transaction　Lock (insert,delete除き)】
他Transactionでコミットされた結果が反映されない。
 ⇒【反復不可能読み取り】が抑える。
 しかし、削除、挿入により不整合【ファントムリード】が発生

### ・SERIALIZABLE
【Transaction　Lock (insert,delete含む全SERIAL)】
他削除、挿入により
【ファントムリード】まで抑える。

### 効果
【READ UNCOMMITTED】 -> 【READ COMMITTED】 -> 【REPEATABLE READ】 -> 【SERIALIZABLE】
<font color="Red">***Lockを付けてる期間が多くて、データの整合性が高くなる一方、待ち時間が多くなって、並行性が低くなってしまう。***</font>


## ２、SNAPSHOT類分離レベル(tmpdbとversionで制御)

分離効果は通常との似ているのが、
方式は、lockを使わずTEMPDBを消費してデータを保存して、バージョンでコントロールすること。
で、<font color="Red">***性能上はupdateやdeleteに悪い影響だが、読むにはよい影響。***</font>

###・SNAPSHOT
分離効果は【SERIALIZABLE】と同様

###・READ COMMITTED SNAPSHOT
分離効果は【READ COMMITTED】と同様
ローカル環境でasset_syncを発動させたくない

assets:precompileしたら、クラウド上のストレージに画像とか自動でアップロードしてくれる便利な [asset_sync](https://github.com/AssetSync/asset_sync) 。
これローカル環境でも実行されてしまうんですよね。ローカル用のS3のバケットとか用意してるのなら別ですけど、特に必要ないなら実行しないで欲しいですよね。

その設定がちゃんとREADMEに書いてあったので、メモしておきます。

# TL;DR
```ruby:config/initializers/asset_sync.rb
AssetSync.configure do |config|
  config.enabled = false if Rails.env.development? # ここを追記
  config.fog_provider = 'AWS'
  config.fog_directory = ENV['FOG_DIRECTORY']
  config.fog_region = ENV['FOG_REGION']
  config.aws_iam_roles = true
  config.manifest = true
end
```

`config.enabled` オプションはデフォルトで `true` になっているので、 development環境の場合だけ、 `false` にするようにしてあげればOKです。かんたん！

以下READMEを引用しますが、太字の部分がその設定値ですね。
https://github.com/AssetSync/asset_sync#assetsync-optional
#### AssetSync (optional)

 - existing_remote_files: ('keep', 'delete', 'ignore') what to do with previously precompiled files. default: 'keep'
 - gzip_compression: (true, false) when enabled, will automatically replace files that have a gzip compressed equivalent with the compressed version. default: 'false'
 - manifest: (true, false) when enabled, will use the manifest.yml generated by Rails to get the list of local files to upload. experimental. default: 'false'
 - include_manifest: (true, false) when enabled, will upload the manifest.yml generated by Rails. default: 'false'
 - **enabled: (true, false) when false, will disable asset sync. default: 'true' (enabled)**
 - ignored_files: an array of files to ignore e.g. ['ignore_me.js', %r(ignore_some/\d{32}\.css)] Useful if there are some files that are created dynamically on the server and you don't want to upload on deploy default: []
 - cache_asset_regexps: an array of files to add cache headers e.g. ['cache_me.js', %r(cache_some\.\d{8}\.css)] Useful if there are some files that are added to sprockets assets list and need to be set as 'Cacheable' on uploaded server. Only rails compiled regexp is matched internally default: []
abc 059

B
2 つの正整数 A,B が与えられるので、その大小を比較してください。

```
#include<iostream>
#include<string>
using namespace std;
int main() {
	string A, B;
	cin >> A >> B;
	if (A.size() > B.size()) {
		cout << "GREATER" << endl;
	}
	else if (A.size() < B.size()) {
		cout << "LESS" << endl;
	}
	else {
		if (A > B) {
			cout << "GREATER" << endl;
		}
		else if (A < B) {
			cout << "LESS" << endl;
		}
		else {
			cout << "EQUAL" << endl;
		}
	}
	return 0;
}
```
AとBがデカいときにも対応できるようにstringでやるってやつ

C
長さ N の数列があり、i 番目の数は ai です。 あなたは 1 回の操作でどれか 1 つの項の値を 1 だけ増やすか減らすことができます。
以下の条件を満たすために必要な操作回数の最小値を求めてください。
すべてのi(1≦i≦n) に対し、第 1 項から第 i 項までの和は 0 でない
すべてのi(1≦i≦n−1) に対し、i 項までの和と i+1 項までの和の符号が異なる
制約
2≦n≦105
|ai|≦109
ai は整数
うーん。。。
偶奇に着目は当然だけど、どうやって着目するか。
パターンに着目する。偶数番目が正か奇数番目が正のどちらかしかない。


```
#include<iostream>
#include<algorithm>
#define maxn 100005
using namespace std;
typedef long long ll;
ll a[maxn] = { 0 };
int main() {
	ll n, i;
	cin >> n;
	for (int i = 1; i <= n; ++i) {
		cin >> a[i];
	}
	ll sum1 = 0;  ll sum2 = 0;
	ll ans1 = 0; ll ans2 = 0;
	for (int i = 1;i <= n; ++i) {
		sum1 += a[i];
		if (i % 2 == 0 && sum1 >= 0) {
			ans1 += sum1 + 1;
			sum1 = -1;
		}
		else if (i % 2 != 0 && sum1 <= 0) {
			ans1 += abs(sum1) + 1;
			sum1 = 1;
		}
	}
	for (int i = 1; i <= n; ++i) {
		sum2 += a[i];
		if (i % 2 == 0 && sum2 <= 0) {
			ans2 += abs(sum2) + 1;
			sum2 = 1;
		}
		else if (i % 2 != 0 && sum2 >= 0) {
			ans2 += abs(sum2) + 1;
			sum2 = -1;
		}
	}
	cout << min(ans1, ans2) << endl;
	return 0;
}
```
賢い、、
Base64エンコードしてみる方法

めったにやらないので記録しておきます。

# baase64コマンドを使う
- 環境：macOS High Sierra バージョン10.13.6

```bash
# エンコード
$ echo -n 'ponsuke:tarou' | base64
cG9uc3VrZTp0YXJvdQ==
# デコード
$ echo 'cG9uc3VrZTp0YXJvdQ==' | base64 -D
ponsuke:tarou
$ base64 --help
Usage:	base64 [-hvD] [-b num] [-i in_file] [-o out_file]
  -h, --help     display this message
  -D, --decode   decodes input # デコードで使ったのはこのオプション
  -b, --break    break encoded string into num character lines
  -i, --input    input file (default: "-" for stdin)
  -o, --output   output file (default: "-" for stdout)
```

# nkfコマンドを使う
- 環境：macOS High Sierra バージョン10.13.6

```bash
# エンコード
$ echo -n 'ponsuke:tarou' | nkf -M
cG9uc3VrZTp0YXJvdQ==
# デコード
$ echo 'cG9uc3VrZTp0YXJvdQ==' | nkf -mW
ponsuke:tarou
$ nkf --help
Usage:  nkf -[flags] [--] [in file] .. [out file for -O flag]
 j/s/e/w  Specify output encoding ISO-2022-JP, Shift_JIS, EUC-JP
          UTF options is -w[8[0],{16,32}[{B,L}[0]]]
 J/S/E/W  Specify input encoding ISO-2022-JP, Shift_JIS, EUC-JP # デコードで使ったオプション
          UTF option is -W[8,[16,32][B,L]]
 m[BQSN0] MIME decode [B:base64,Q:quoted,S:strict,N:nonstrict,0:no decode] # デコードで使ったオプション
 M[BQ]    MIME encode [B:base64 Q:quoted] # エンコードで使ったオプション
 f/F      Folding: -f60 or -f or -f60-10 (fold margin 10) F preserve nl
 Z[0-4]   Default/0: Convert JISX0208 Alphabet to ASCII
          1: Kankaku to one space  2: to two spaces  3: HTML Entity
          4: JISX0208 Katakana to JISX0201 Katakana
 X,x      Convert Halfwidth Katakana to Fullwidth or preserve it
 O        Output to File (DEFAULT 'nkf.out')
 L[uwm]   Line mode u:LF w:CRLF m:CR (DEFAULT noconversion)
 --ic=<encoding>        Specify the input encoding
 --oc=<encoding>        Specify the output encoding
 --hiragana --katakana  Hiragana/Katakana Conversion
 --katakana-hiragana    Converts each other
 --{cap, url}-input     Convert hex after ':' or '%'
 --numchar-input        Convert Unicode Character Reference
 --fb-{skip, html, xml, perl, java, subchar}
                        Specify unassigned character's replacement
 --in-place[=SUF]       Overwrite original files
 --overwrite[=SUF]      Preserve timestamp of original files
 -g --guess             Guess the input code
 -v --version           Print the version
 --help/-V              Print this help / configuration
Network Kanji Filter Version 2.1.4 (2015-12-12) 
Copyright (C) 1987, FUJITSU LTD. (I.Ichikawa).
Copyright (C) 1996-2015, The nkf Project.
```

# Webツールを使う
- [データ変換ツール（BASE64, URLエンコード(URLデコード), HEX(16進ダンプ), MD5, SHA-1変換フォーム）](https://hogehoge.tk/tool/)
![スクリーンショット 2018-10-05 14.37.48.png](https://qiita-image-store.s3.amazonaws.com/0/159761/ac4e048f-08a6-f864-6435-33e5b90946db.png)
- [Base64でエンコード - オンラインBase64のエンコーダ](http://www.convertstring.com/ja/EncodeDecode/Base64Encode)
![スクリーンショット 2018-10-05 14.45.25.png](https://qiita-image-store.s3.amazonaws.com/0/159761/bf52afa5-9610-b065-3c3d-9e745f7d7c35.png)


# 出典
- [Base64デコード・エンコード - Qiita](https://qiita.com/mas9612/items/5d3bf90b04bf19a1bf20)
- [nkfの使い方:base64のエンコードとデコード(ただし文字列だけ - それマグで！](http://takuya-1st.hatenablog.jp/entry/2017/06/28/163000)
CI - Webpush Testing Service

webpush の送信を機械的にテストするための [webpush-testing-service](https://github.com/nokamoto/webpush-testing-service) を作成した。

関連サービス [GoogleChromeLabs/web-push-testing-service](https://github.com/GoogleChromeLabs/web-push-testing-service)

## サービス設計
![webpush-testing-service.png](https://qiita-image-store.s3.amazonaws.com/0/268412/6c47c609-0fce-75f4-d849-e3224972c60a.png)

API で selenium の操作を行い push service からの PushSubscription を得たり、 service worker に届いたメッセージを取得できるようにする。

テストコードは PushSubscription を得てエンドポイントに対してメッセージ送信を行い、いつかメッセージが取得できるという感じにすることで、実際に firefox または chrome で動作することが機械的に確認できるようになる。

## 実装
### Selenium
selenium を使って webpush のテストをする場合、通知の許可ボタンが出るのを抑制しなければらない。

```scala
val options = new FirefoxOptions()
options.addPreference("permissions.default.desktop-notification", 1)
new FirefoxDriver(options)
```

firefox では `permissions.default.desktop-notification` を設定し、

```scala
val options = new ChromeOptions()
options.setExperimentalOption("prefs",　Map("profile.default_content_setting_values.notifications" -> 1).asJava)
new ChromeDriver(options)
```

chrome では `profile.default_content_setting_values.notifications` を設定することで抑制できる。

### Docker + Xvfb
ローカルで動かすだけであれば chromedriver や geckodriver と各ブラウザをインストールすれば良いが docker で動くようになっていた方が利便性が高い。

[nokamoto13/webdriver](https://github.com/nokamoto/docker-webdriver/blob/92b9f9c062caebbc3c349f698ff7383e59b22d79/webdriver/Dockerfile)

docker 上で selenium を動かすには xvfb と chrome/firefox などのブラウザと chromedriver/geckodriver などのドライバーが必要となる。

```bash
#!/bin/sh
xvfb-run $@
``` 

```dockerfile
ENTRYPOINT [ "./entrypoint.sh", "webpush-testing-service/bin/webpush-testing-service" ]
```

あとは [Dockerfile](https://github.com/nokamoto/webpush-testing-service/blob/9fc2c329c49895719fc6037b171ba69d3bf5411e/Dockerfile) で `xvfb-run` を利用してサーバーを立ち上げれば良い。
（ :question: 直接 _ENTRYPOINT_ に _["xvfb-run", "webpush-testing-service/bin/webpush-testing-service"]_ とすると動かなかった ）

## .circleci/config.yml
```yaml
webpush-testing-service:
  docker:
    - image: nokamoto13/webpush-testing-service:0.0.0
  steps:
    - run:
        command: xvfb-run /webpush-testing-service/bin/webpush-testing-service
        background: yes
    - run:
        command: sbt test
```

[.circleci/config.yml](https://github.com/nokamoto/webpush-scala/blob/25bdda787d11e3bae198c0307ee583386df9db1c/.circleci/config.yml#L25-L49) では background で `xvfb-run` を実行することでテストができた。

```yaml
jobs:
  build:
    docker:
      - image: circleci/golang:1.11
      - image: nokamoto13/webpush-testing-service:0.0.0
```

[あるいは](https://github.com/nokamoto/webpush-go/blob/4da45fc5b19d3568b0525a35ce3e77a6ea59f394/.circleci/config.yml) secondary image としてセットすることで _localhost:9000_ でアクセスしてテストすることができた。
Swiftでprintの書き換えに困った

# Swiftで可変長引数に配列を展開したかった
よくプリプロセッサを使ってデバッグ時のみ出力するように`print`を書き換える例があるんだけど、実際使ってみる段になって可変長引数の引き渡しができなくて困った。。。
(`golang`の`...args`で受け取って`args...`で展開みたいなのがしたかった)

とりあえず、`print`の書き換えが目的だったので出力がそれっぽくなればいいと思い下記のように対応した。

```swift
func print(_ items: Any..., separator: String = " ", terminator: String = "\n") {
    #if DEBUG
    items.enumerated().forEach { (index, item) in
        if index == items.count - 1 {
            Swift.print(item, separator: "", terminator: terminator)
        } else {
            Swift.print(item, separator: "", terminator: separator)
        }
    }
    #endif
}
```

ちゃんとした言語仕様があったら書き直したい。。。
Windows7でDocker上のMySQLにツールで接続してみた

#1. はじめに
MySQL5.5系から5.6系へアップデートした場合、
新規で追加された予約語が本当にエラーになるのかを検証するために
DockerでMySQL5.6系の環境を作成したときのメモです。

#2. Windows7へDocker Toolboxをインストール
以下の記事を参考にさせていただきました。
「Docker Toolboxのインストール：Windows編」
https://qiita.com/maemori/items/52b1639fba4b1e68fccd

#3. Docker-machineにproxyの設定
proxy環境下で作業しているため、proxyの設定を実施します。。
※proxy環境下でdockerのイメージをpullしたいため。

##3.1 「Docker Quickstart Terminal」を起動
Dockerインストール時に作成された「Docker Quickstart Terminal」を起動します。
※私の環境では、起動時に「bash.exe」がないぞ！！と怒られました。
　「Git for Windows」をDockerインストール時ではなく、予めインストールしていたためなのか。
　その場合は、参照ボタンから{Gitインストールフォルダ}\bin\bash.exeを選択すれば問題ありません。
初回起動時はdefaultのDocker-machineを作成するのでそこそこ時間がかかります。
コーヒーでも飲みながら待ちましょう。
クジラさんが表示されたら次へ。

##3.2 docker-machineに接続
```
$ docker-machine ssh default
```
のコマンドを実行し、docker-machineに入ります。

##3.3 proxy設定を追記
こちらを参考にさせていただきました。
「Proxy環境下のDockerトラブルシューティング」
https://qiita.com/tora470/items/cd9335f5ce638e11bb97

```
$ sudo vi /var/lib/boot2docker/profile
```
のコマンドを実行し、profileファイルをオープンします。
そこにproxy設定を追記します。

```
export HTTP_PROXY=http://xxxxx.xx.xx:8080 
export HTTPS_PROXY=$HTTP_PROXY
```

##3.4 Dockerの再起動

```
$ sudo /etc/init.d/docker restart
```
のコマンドを実行し、Dockerを再起動します。
再起動が完了したら、

```
$ exit
```
でDocker-machineから抜けておきましょう。
これでproxyの設定は完了です。

#4. MySQLのコンテナを作成する
今回は「MySQL5.6.38」の環境を作成してみようと思います。

##4.1 イメージを取得する
まずは以下のコマンドを実行して、コンテナを作成する元となるイメージを取得します。

```
$ docker pull mysql:5.6.38
```

##4.2 コンテナを作成する

```
$ docker run --name mysql5.6.38 -p 12345:3306 -e MYSQL_USER=root -e MYSQL_ROOT_PASSWORD=pass -d mysql:5.6.38
```
今回は以下のようにしています。

| コンテナ名称      |MySQLの初期ユーザ|MySQL初期ユーザのパスワード  |
|:-----------------:|:------------------:|:----------------------:|
| mysql5.6.38             |              root |        pass        |

これでコンテナの作成は完了しました。

#5. MySQLを起動してみる

MySQLのコンテナ作成が完了したので、ここからはコンテナに入って新規ユーザの作成と新規データベースの作成を行ってみたいと思います。
##5.1 MySQLのコンテナに入る
以下のコマンドを実行し、コンテナに入ります。

```
$ docker exec -it mysql5.6.38 /bin/bash
```

##5.2 MySQLにログイン

以下のコマンドを実行し、MySQLにログインします。

```
$ mysql -u root -p
```
※「Enter password:」でコンテナ作成時に設定したパスワードを入力します。

##5.3 MySQLのユーザ作成

```
$ CREATE USER {ユーザ名}@{ホスト} IDENTIFIED BY '{パスワード}';
```
※ホストに'%'を指定すると全てのホストからの接続を許可することになります。
　ローカルマシンからのみの接続としたい場合、
　docker-machineのipアドレス「192.168.99.100」ではなく
　Win7のネットワークアダプタにあるVirtualBox Host-Only Ethernet Adapter #2の
　ipアドレス「192.168.99.1」にする必要があるようです。

##5.4 MySQLのユーザに権限を付与

```
$ GRANT ALL PRIVILEGES ON *.* TO {ユーザ名}@{ホスト} WITH GRANT OPTION;
```

##5.5 データベースの作成

```
$ CREATE DATABASE testDB default character set utf8;
```

以上でMySQLに新規ユーザとデータベースを作成することができました。

#6. ツールからの接続
今回は有名な「A5:SQL Mk-2」というツールから接続を行ってみます。
以下のように設定して、

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146632/26887a6f-4acd-9946-e35d-4a1b0ebffab9.png)

テスト接続ボタンをクリック！！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146632/4ae31ecd-c225-7a48-bd48-c9081ce3c779.png)

できた！！

#7 おわりに
以上で今回の目的は達成できました。
Dockerは簡単に環境を作成できるので非常に便利ですね。
[Swift]もうIBOutletでhogeHeightConstraintと書きたくない！

hogeViewを作って
width heightをAutoLayoutで設定して
width heightをIBOutletでつなげて

```swift
hogeWidthConstraint.constant = 100
```

なんて書きたくない😭
という場合にもう少し簡単な方法です。

## 結論

ConstraintにIdentifierをつけます

![スクリーンショット 2018-10-05 13.54.36.jpg](https://qiita-image-store.s3.amazonaws.com/0/20784/7fa1b5aa-4f86-fc42-7ff3-9a006c4eb4de.jpeg)

あとはこうです

```swift
hogeView.constraints.filter { $0.identifier == "height" }.forEach { $0.constant = 100 }
```

さすがにワンライナーだと怒られそうなので、extensionにしちゃいましょう。

```swift
extension UIView {
    func updateConstraint(identifier:String, value:CGFloat ) {
        self.constraints.filter { $0.identifier == identifier }.forEach { $0.constant = value }
    }
}

//利用側
hogeView.updateConstraint(identifier: "width",value: 100)
```

メリット：IBOutletが大量発生しない
デメリット：Identifierを設定し忘れたりする


## 別解（若干怪しい）

ConstraintのNSLayoutAttributeを見て、「hogeViewのWidthを変更する」みたいなこともできますね。

```swift
hogeView.constraints.filter { $0.firstAttribute == .width }.forEach { $0.constant = 100 }
```

```swift
extension UIView {    
    func updateConstraint(attribute:NSLayoutAttribute, value:CGFloat) {
        self.constraints.filter { $0.firstAttribute == attribute }.forEach { $0.constant = value }
    }
}

//利用側
hogeView.updateConstraint(attribute: .width,value: 100)

```

メリット：Identifierを書かなくていい
デメリット：**attributeは、firstAttributeとsecondAttributeがある**

attributeに対して自信がないなら使えなさそうです。
うっかりすると関係ないattributeを巻き込みそうで、私はまだ自信がないです。
attributeを固定したメソッドを作ると良いかもしれません。
（詳細について、時間があったら調べます。ちょっと調べた限りではスマートにはできなさそう？）

## 所感

（この方法は知ってたんですが、Objective-Cだと煩雑で嫌だったんですよね。Swiftだとスッキリ書けます）

チーム開発の場合は受け入れられるか微妙なところですかね？
この方法とってるの一度も見たことがありません。

もっといい方法ないかな？🤔
anacondaとおさらばしてpython2系と3系の共存環境構築

##きっかけ

[[0*]](http://onoz000.hatenablog.com/entry/2018/02/11/142347
)の記事にあるように、anaconda環境でpipを使うのは危険なよう。
以前はanaconda+pyenvで2系と3系を共存させていたが、anacondaとはおさらばして今後はパッケージは全てpipで管理することにした。

##手順
一旦anacondaもpyenvもアンインストールして、その他依存ファイルも全て消去したのち、pyenvをhomebrewで入れ直したところから始めます。
homebrewなどではなく、pyenvからインストールする。

```
$pyenv install --list
$pyenv install 2.7.15
$pyenv install 3.6.5
```
バージョン確認。今はシステムに最初から入っているpythonが起動する状態。globalコマンドで切り替えれます。

```
$ pyenv versions
*system
2.7.15
3.6.5

$pyenv global 3.6.5
system
2.7.15
*3.6.5
```

しかしこの状態では
$pip --version
pip 18.0 from /usr/local/lib/python2.7/site-packages/pip (python 2.7)
のように仮想環境にインストールしたpythonではなく、システムのpythonが実行されており、先の設定は反映されていない。

```
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
```

を.bash_profileに追加すると

```
$pip --version
pip 9.0.3 from /Users/<ユーザー名>/.pyenv/versions/3.6.5/lib/python3.6/site-packages (python 3.6)

$ which python
/Users/<ユーザー名>/.pyenv/shims/python
```
とこれでシステムのpythonではなく、pyenv環境下のpythonが実行されるようになった。


##2系と3系を共存させる
今のままでは3系と2系の切り替えをいちいちpyenv global 〇〇しなければならないが、

```
$ pyenv global 3.6.5 2.7.15
$ pyenv versions
  system
* 2.7.15 (set by /Users/ysnishi/.pyenv/version)
* 3.6.5 (set by /Users/ysnishi/.pyenv/version)
```

としておけば、[[1*]](https://qiita.com/euxn23/items/4b9e35cd88659ba1ee88)の方が書かれていますが、
この状態では3系と2系の両方の実行可能なライブラリにPATHが通っているので、
python3をメインのpythonとして指定しつつ、そのままの状態で2系のライブラリを実行することができます。
これにより、ansible等のpython3未対応のライブラリもそのまま使うことができます。


```
$ pip --version
pip 9.0.3 from /Users/ysnishi/.pyenv/versions/3.6.5/lib/python3.6/site-packages (python 3.6)

$ pip2 --version
pip 9.0.3 from /Users/ysnishi/.pyenv/versions/2.7.15/lib/python2.7/site-packages (python 2.7)

$ pip3 --version
pip 9.0.3 from /Users/ysnishi/.pyenv/versions/3.6.5/lib/python3.6/site-packages (python 3.6)
```

pip 9.0.3は古いので、pipコマンドを打つとアップグレードしなさいと怒られます。アップグレードしてからpip listを見てみると、

```

$ pip install --upgrade pip
$ pip list
Package    Version
---------- -------
pip        18.0
setuptools 39.0.1

$ pip2 install --upgrade pip
$ pip2 list
Package    Version
---------- -------
pip        18.0
setuptools 39.0.1
```
2系、3系とも何も入っていない新品の状態であることが確認できます。

以降は必要なパッケージのみをその都度pip install 〇〇で追加していけばいいだけ。
condaとのconflict等の心配から解消されました。

###補足
```
$ sudo pip install 〇〇
```
はシステムのpythonの方を汚すことになるのでしないようにした方がいいそうです。


###参考
[0*]http://onoz000.hatenablog.com/entry/2018/02/11/142347
[1*]https://qiita.com/euxn23/items/4b9e35cd88659ba1ee88
アイキャッチを表示させ、投稿のタイトルをaltに設定する方法

アイキャッチだけ表示したかったら、↓

```
<?php the_post_thumbnail(); ?>
```

プラス サイズを指定する場合は↓
中サイズで出現。

```
<?php the_post_thumbnail('medium'); ?>
```


アイキャッチにaltとtitleを表示したかったら、↓

```
<?php 
$title= get_the_title();
the_post_thumbnail(array( 300,99999 ),
array( 'alt' =>$title, 'title' => $title)); 
?>
```

この「300」は、300px以下に統一するという意味。
同一チーム内で、すべてのメンバーが待機

自分の不得意なNOT EXISTSを自分なりに理解しました。

|member（隊員）	|team_id（チームID）	|status（状態）|
|---|---|---|
|ジョー	|1	|待機|
|ケン	|1	|出動中|
|ミック	|1	|待機|
|カレン	|2	|出動中|
|キース	|2	|休暇|
|ジャン	|3	|待機|
|ハート	|3	|待機|
|ディック	|3	|待機|
|ベス	|4	|待機|
|アレン	|5	|出動中|
|ロバート	|5	|休暇|
|ケーガン	|5	|待機|


```sql

SELECT team_id, member
  FROM Teams T1
 WHERE NOT EXISTS
        (SELECT *
           FROM Teams T2
          WHERE T1.team_id = T2.team_id
            AND status <> '待機' );
```

「待機」がない表これを、一つ一つのレコードにぶつけていくイメージ

|member（隊員）	|team_id（チームID）	|status（状態）|
|---|---|---|
|ケン	|1	|出動中|
|カレン	|2	|出動中|
|キース	|2	|休暇|
|アレン	|5	|出動中|
|ロバート	|5	|休暇|

NOT EXISTSなので、team_id=3,4のレコードが抽出されます
IBM Cloud Object Storage (S3 API)をgoofysでマウントする

# 目的

IBM Cloud Object StorageはS3 APIに対応しています。API経由での操作は面倒なので、S3向けのマウントツールを使ってみます。ツールはs3fsより速いと有名なgoofysを使います。

# 手順

## 環境

IBM Cloudの仮想サーバでRedHat Enterprise Linux 7を選択。実際のバージョンは7.5。

```
# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.5 (Maipo)
```

Object StorageのオーダーとBucketの登録は済んでいる前提とします。

# ツールのビルド

```
# yum -y install git golang fuse
# go get github.com/kahing/goofys
# go install github.com/kahing/goofys
```

## credentialファイルの作成

```text:~/.aws/credentials
aws_access_key_id = <ポータルで確認>
aws_secret_access_key = <ポータルで確認>
```

AWSではないんですけどね（苦笑）。

## マウント

```text:(例)
# 実際はお使いの環境に合わせてください
# ~/go/bin/goofys --endpoint https://s3.jp-tok.objectstorage.service.networklayer.com teruq-backup /mnt
```

--endpointでIBM Cloud Object Storageのエンドポイントを指定するところがポイントです。エンドポイントはポータルから確認してください。

## 書き込みテスト

```
# cd /mnt
# dd if=/dev/zero of=1G.dat bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 96.3054 s, 11.1 MB/s
```

速度は仕方ないですかね。

以上です。
Z39.50検索メモ2(yazproxy)

# yazproxyについて

- [yazproxy](https://www.indexdata.com/resources/software/yazproxy/)はIndex Data社が提供するZ39.50対応プロキシサーバ。
- いろいろ機能はあるが、ここでは次のような利用を想定。

```
HTTPクライアント ←[HTTP]→ yazproxy ←[Z39.50]→ Z39.50サーバ
```

- この場合、クライアント側がZ39.50に対応しなくてもZ39.50サーバの検索が行えるのがメリット。

# 接続設定

- 接続先の設定を次のようなXML形式のファイルで定義する。

```
<proxy>
    <target name='loc' default='1'>
        <url>lx2.loc.gov:210</url>
        <explain>
            <serverInfo>
                <host>localhost</host>
                <port>9000</port>
                <database>LCDB</database>
            </serverInfo>
        </explain>
        <cql2rpn>cql2rpn.loc</cql2rpn>
   </target>
</proxy>
```

- root要素は&lt;proxy&gt;。
- &lt;target&gt;以下に接続先サーバごとの設定を記述。
- &lt;url&gt;に接続先サーバのホスト名とポート番号を指定。
- &lt;explain&gt;/&lt;serverInfo&gt;にはプロキシサーバのホスト名(&lt;host&gt;)、ポート番号(&lt;port&gt;)と接続先データベース名(&lt;database&gt;)を定義する。この設定は検索要求時のURLに対応する。

```
(例) http://localhost:9000/LCDB?...
```

- &lt;cql2rpn&gt;にはインデクス設定ファイル名を記述。

# インデクス設定

- クライアントからyazproxyへの検索要求は[SRU(Search/Retrieve via URL)](https://www.loc.gov/standards/sru/)または[SRW(Search/Retrieve Web Service)](https://www.loc.gov/standards/sru/companionSpecs/srw.html)で行う。以下ではSRUを用いる。
- SRUではURLに検索条件を埋め込む。次の例のうちquery以降が検索条件。maximumRecordsには取得するデータ件数を指定。

```
(例) http://localhost:9000/LCDB?version=1.1&operation=searchRetrieve&maximumRecords=10&query=keyword=unix
```

- Z39.50では検索対象(インデクス)をUse Attribute(数字)で指定するが、yazproxyではSRUによる検索要求で用いるインデクス名とUse Attributeとの対応づけを定義する。
- 次のような対応づけを想定する。

|Z39.50|SRU|
|:---|:---|
|4|title|
|7|isbn|
|8|issn|
|12|id|
|21|subject|
|31|year|
|54|language|
|1003|author|
|1016|keyword|
|1018|publisher|

- この表の対応づけを行う設定ファイルは次のようになる。

```
set.cql = info:srw/cql-context-set/1/cql-v1.1
set = info:srw/cql-context-set/1/cql-v1.1
index.cql.serverChoice = 1=1016
index.cql.title = 1=4
index.cql.isbn = 1=7
index.cql.issn = 1=8
index.cql.id = 1=12
index.cql.subject = 1=21
index.cql.year = 1=31
index.cql.language = 1=54
index.cql.author = 1=1003
index.cql.keyword = 1=1016
index.cql.publisher = 1=1018
relation.* =
position.* =
structure.* =
truncation.* =
always =
```

- 「set.cql = info:srw/cql-context-set/1/cql-v1.1」で「cql」というインデクスセットを定義し、「set = info:srw/cql-context-set/1/cql-v1.1」はそれをデフォルトインデクスに設定している。いずれも必須。
- 「index.cql.serverChoice = 1=1016」は検索条件でインデクスを指定しなかった場合に検索対象とするインデクスを指定している。この例の場合、「query=unix」と「query=keyword=unix」が同じになる。
- 「index.cql.title = 1=4」以下でSRUで用いるインデクス名とZ39.50のUse Attributeとの対応づけを行っている。これによりSRUの検索条件(例えば「query=title=unix」)がyazproxyによりZ39.50の検索条件(例えば「@attr 1=4 unix」)に変換される。
- 「relation.* =」以下はそのほかのAttributeの扱いの設定。ここでは何もしない設定(検索要求に含めない)。

# yazproxyの起動

- 次のようなコマンドで起動する。

```
$ yazproxy -c conf.xml @:9000 &
```

- この例では「conf.xml」という設定ファイルを読み込み、ポート番号9000で起動している。
Twilioプロモーションコードの登録方法

:::note alert
2023年5月1日を持ちまして、株式会社KDDIウェブコミュニケーションズのTwilioリセール事業が終了したため、本記事に記載されている内容は正確ではないことを予めご了承ください。
:::

# はじめに

Twilioプロモーションコードの適用方法を紹介します。

## プロモーションコードとは

ハッカソンやハンズオンに参加した際に、トライアルアカウントに対して一定額のポイントを付与できる特別なコードとなります。

## プロモーションコードの適用条件

- プロモーションコードの適用と一緒に、クレジットカード情報（VISA/Master）もしくはPayPalアカウントの登録が必要です。
- 登録したクレジットカードやPayPalからチャージされることはありません。
- プロモーションコードには、利用可能な期間が設定されています。
- 付与されるポイントは、プロモーションコードによって異なります。
- アップグレード済みのアカウントには適用できません。

## プロモーションコードの適用手順

- 管理コンソールにログインします。
- ダッシュボードメニューから、**アップグレード**を選択します。

![プロモコード_アップグレード.png](https://qiita-image-store.s3.amazonaws.com/0/86046/68bebc41-d502-f56d-fcd8-5d6fe3121a89.png)

- クレジットカード情報を登録します（住所は必須ですが、日本語は利用できませんのでご注意ください）。登録できるカードはVISAかMASTERのいずれかです。それ以外のカードを利用したい場合は、PayPal経由での登録となります。
- カード情報が入力できたら、**プロモーションコードを利用する**とかかれたリンクをクリックします。

![プロモコード_入力_1.png](https://qiita-image-store.s3.amazonaws.com/0/86046/f4c73ea1-0150-2490-b542-2222540093e3.png)

- もらったプロモーションコードを入力します。
- **オートチャージを有効にする**のチェックボックスを外します。
- **アカウントをアップグレードする**ボタンを押します。

![プロモコード_入力_2.png](https://qiita-image-store.s3.amazonaws.com/0/86046/492fb5b1-83ce-1584-bcc9-42880daf2187.png)

以上で終了です。
アップグレードできたら、カード情報（支払いアイテム）は削除してしまっても構いません。
JavaScriptのオブジェクトリテラルの前後にスペースを含めないほうが好き

波括弧（curly brace）のオブジェクトリテラルを**単一行**で書く場合の話。

```javascript
const withSpace    = { name: 'yamada', locale: 'JP' };  // 空白あり
const withoutSpace = {name: 'yamada', locale: 'JP'};    // 空白なし
```


## 🤔 実は規定がない

どれを見ても『オブジェクトリテラルを一行で書く場合』の規定がない。  

* [Google JavaScript Style Guide](https://google.github.io/styleguide/jsguide.html)
* [Airbnb JavaScript Style Guide](https://github.com/airbnb/javascript)
* [Node.js Style Guide](https://github.com/felixge/node-style-guide) 

ただ、いろいろな GitHub のコードを見る限りでは、スペースありで書いてるプロジェクトの方が多い。でも個人的にはスペースなしで書いた方が良いと思っているという話。


## 🦉 スペースなしの方が一貫性がある

配列リテラルとオブジェクトリテラルを比べた場合、複数行で書く場合は以下のように同じ形式になるけど

```js
const array = [
  'apple',
  'google',
  'facebook',
  'amazon',
];

const obj = {
  name: 'apple',
  ceo: 'timothy donald cook',
};
```

配列リテラルを単一行で書く場合は前後にスペースを含めない。オブジェクトリテラルもこれに合わせた方が一貫性がある。

```js
const array = ['apple', 'google', 'facebook', 'amazon'];
const obj = {name: 'apple', ceo: 'timothy donald cook'};
```

## 📝他の言語の場合

### 🍷 Ruby

[Ruby Style Guide](https://github.com/fortissimo1997/ruby-style-guide/blob/japanese/README.ja.md) にはハッシュリテラル（JavaScriptでいうオブジェクトリテラルのこと）の書き方について記述されているが、好きな方を使えというスタイル。  
Ruby 界隈でも JavaScript と同じようにスペースありで記述されているケースが多い。しかし、Ruby にはブロック構文が存在する。  

```ruby
array = ['apple', 'google', 'facebook', 'amazon']

array.each do |name|
  p name
end

array.each { |name|  p name }
```

ブロックを複数行で書く場合は `do...end` で記述することが推奨されるが、単一行で書く場合は波括弧が推奨される。  
ブロック構文とハッシュリテラルの明確な区別のため、スペースなしの方が良いと考える。  


### 🐍 Python

Python の場合は明確に「空白を入れるな」と規定されている。

* [Google Python Style Guide](https://github.com/google/styleguide/blob/gh-pages/pyguide.md#36-whitespace)
* [PEP 8](https://www.python.org/dev/peps/pep-0008/#whitespace-in-expressions-and-statements)

今回のブログ記事も Python の書き方を学んだときに確かにそっちの方が一貫性あるな、と感じたので他の言語でも採用することにした。  


### 🐾 Golang

Go 言語の構造体も以下のページのような感じで空白を含めない。`go fmt` で矯正される。

* [Go by Example: Structs](https://gobyexample.com/structs)


## 🦋 ES6 と TypeScript の普及で使う機会が増えた

import 文で分割代入（Destructuring assignment）構文が多用されるので、単一行のオブジェクトリテラルを使うケースがかなり増えた。この機会に一貫させてスッキリさせようと思う。

```javascript
import {DateUtil} from 'luxon';
import {Get, Controller, UseInterceptors} from '@nestjs/common';
```

## 🐹 Prettier でコードフォーマットする

[ESLint](https://eslint.org/) や [TSLint](https://palantir.github.io/tslint/) に単一行オブジェクトリテラルに対して警告を出す機能はないが、[Prettier](https://prettier.io/docs/en/options.html#bracket-spacing) にはコードフォーマットさせるための `bracketSpacing ` オプションが存在する。

### .prettierrc
```json
{
  "singleQuote": true,
  "trailingComma": "all",
  "bracketSpacing": false
}
```

```sh
$ yarn global add prettier
$ prettier --write '**/*.ts'
```