OmniAICreator/Qiita-1.07M huggingface dataset:
Go で ABC126 B - YYMM or MMYY を解いてみた

Go で ABC126 B - YYMM or MMYY を解いてみました。

## 問題

> 
### 問題文
長さ 4 の数字列 S が与えられます。あなたは、この数字列が以下のフォーマットのどちらであるか気になっています。
* YYMM フォーマット: 西暦年の下 2 桁と、月を 2 桁で表したもの (例えば 1 月なら 01) をこの順に並べたもの
* MMYY フォーマット: 月を 2 桁で表したもの (例えば 1 月なら 01) と、西暦年の下 2 桁をこの順に並べたもの
与えられた数字列のフォーマットとして考えられるものが YYMM フォーマットのみである場合 YYMM を、 MMYY フォーマットのみである場合 MMYY を、 YYMM フォーマット と MMYY フォーマットのどちらの可能性もある場合 AMBIGUOUS を、 どちらの可能性もない場合 NA を出力してください。
### 制約
S は長さ 4 の数字列
>
( https://atcoder.jp/contests/abc126/tasks/abc126_b より引用)

## 考え方

問題文にあるとおりの条件式を書いて判定するだけですが、コンテスト本番で2回WAを出してしまいました（条件式の構成は苦手です）。

上位2桁と下位2にわけて考えると、まず、それぞれの2桁がYYになりうるか、MMになりうるか、を判定する必要があります。

* YYについては、2桁のすべての組み合わせ、 `00` から `99` まで、YY として正しいYY表記である。
* MM については文字列ではなく数値として解釈した場合に、 $ 1 \le MM \le 12 $ を満たしているときのみ正しいMM表記であり、満たさない場合、つまり 0 および $ 13 \le M $ の場合には MM 表記としては不正。

よって、 2つの2桁について、MM の場合のみ判定すればOKです。

さらに、最終的な答えを出すには `YYMM` 表記なのか `MMYY` 表記なのか、 どちらにもなりうる(`AMBIGUOUS`)のか、どちらもありえないのか(`NA`) の4パターンで判定する必要があります。

愚直に上位2桁がMMになりうるかを見て、下位2桁がMMになりうるか/そうでないか、……とやると、次のようなコードになります。

```go
func main() {
	defer stdout.Flush()
	S := readInt()
	H := S / 100
	L := S % 100

	if mm(H) {
		if mm(L) {
			println("AMBIGUOUS")
		} else {
			println("MMYY")
		}
	} else {
		if mm(L) {
			println("YYMM")
		} else {
			println("NA")
		}
	}
}

func mm(a int) bool {
	if 1 <= a && a <= 12 {
		return true
	}
	return false
}
```

ですが、ここでは次のコードのように、「どちらにもなりうる(`AMBIGUOUS`)」のパターン、つまり上位下位どちらもMMになりうる場合をまず判定してしまうことで、ネストが減って少しだけ見通しがよくなります（条件判定部分のみ抜粋）。

```go
	if mm(H) && mm(L) {
		println("AMBIGUOUS")
		return
	}
	if mm(L) {
		println("YYMM")
		return
	}
	if mm(H) {
		println("MMYY")
		return
	}
	println("NA")
```

## 提出コード

コンテストでは次のようなコードを書きました（抜粋）。全体は[こちら](https://atcoder.jp/contests/abc126/submissions/5458441)
（コンテストでは↑のようなことをちゃんと考えて書けばよかったんですが、適当に書いた結果 1WA, サンプルを誤読して、 「00 だと YY 判定NG」と、ホントかよと思いつつ勘違いしてしまい1WAを食らってしまいました。提出コードには、その試行錯誤した痕跡が見られます。）

```go
func main() {
	defer stdout.Flush()
	S := readInt()
	x := S / 100
	y := S % 100
	//eprintln(x, y)
 
	if mm(x) && yy(y) && yy(x) && mm(y) {
		println("AMBIGUOUS")
		return
	}
	if yy(x) && mm(y) {
		println("YYMM")
		return
	}
	if mm(x) && yy(y) {
		println("MMYY")
		return
	}
	println("NA")
}
 
func mm(a int) bool {
	if 1 <= a && a <= 12 {
		return true
	}
	return false
}
 
func yy(a int) bool {
	return true
}
```
StatefulWidgetのinitStateでcontextにアクセスできるか

## やりたいこと。
StatefulWidgetの初期化時にcontextにアクセスしたい

# 結論
できません。

## 代替案
didChangeDependenciesを使用します。

Stateのライフサイクルは
1. createState
2. initState
3. didChangeDependencies

のように進みます。

3のdidChangeDependenciesはinitStateの直後に呼ばれます。

ここでは、contextにアクセスが必要なInheritedWidget由来の`inheritFromWidgetOfExactType`にアクセスすることができます。

didChangeDependenciesの公式ドキュメントより、
>This method is also called immediately after initState. It is safe to call BuildContext.inheritFromWidgetOfExactType from this method.

```dart
@override
void didChangeDependencies() {
  super.didChangeDependencies();
  final String hoge = fuge.of(context).piyo;
}
```

### 参考
[Flutter公式ドキュメント -didChangeDependenciesについて-](https://api.flutter.dev/flutter/widgets/SingleTickerProviderStateMixin/didChangeDependencies.html)
[Stack Overflow](https://stackoverflow.com/questions/49968053/flutter-access-data-from-inheritedwidgets-without-context)
display: inline-block 使用時にword-wrap: break-word が効かない

長い単語やURLをページに表示する際、何も指定しないと改行してくれません。
CSSで、`word-wrap: break-word` を指定すると改行してくれます。


ただ、同時に`display: inline-block` を利用すると効きません。
その場合は、`max-width: 100%` を指定することでうまくいきます。

```css
.message {
 display: inline-block;
 word-wrap: break-word;
 max-width: 100%;
}
```
Vagrant 2.2.4で「Encoding::UndefinedConversionError」が発生する

##問題
表題の通り。
vagrant up --provision とかコマンド叩いた後で件のエラーが発生する。

##環境
OS         :Windows10 pro 64bit
Vagrant    :2.2.4
Virtualbox :6.0.8

##原因
Windows shift-JIS から UTF-8 にエンコードしようとした際にShift-JISでしか対応していない文字？が存在したとかどうとか（よく理解していない）。

##対応方法
エラーがでたファイルでエンコードしている箇所をforce_encodingメソッドに書き直す。

自身の場合、下記ファイルを修正したら解決した。

C:\HashiCorp\Vagrant\embedded\gems\2.2.4\gems\vagrant-2.2.4\lib\vagrant\util\io.rb

```io.rb　L32
data << io.readpartial(READ_CHUNK_SIZE).encode("UTF-8", Encoding.default_external)

↓

data << io.readpartial(READ_CHUNK_SIZE).force_encoding('UTF-8')
```

##参考
http://kinosuke.hatenablog.jp/entry/2016/03/18/104211
https://qiita.com/J_Sugar__/items/fd55d99003262ad68412
Raspberry pi 喋らせよう jupyter note で試す

Raspberry PI でいろいろプログラムして試すのに効率よく行いたい。
通常、がっちり設計しがっちりコーディングした場合には
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274715/eeadd039-9831-d37d-2989-d7b16ebddd4f.png)
こんな感じで動作させる。Visual Studioをeditorに使い、FTPで転送し、SSHでCLIで実行する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274715/68140acc-464b-5dab-a180-53b6b6267291.png)
なれると平気であるか゛結構面倒だ。
年を取ると備忘録的なドキュメント必要になる。昔、研究所で備忘録ノートに赤で貧乏録と書かれたことあったけ。貧乏録的なコーディングするならjupyter note(木星メモ)が最適だ。
### jupyter noteは、pythonのプログラムをWebブラウザ上で動かすことのできるツールです。
#### Jupyter Notebookはプログラムを部分ごとに実行することができます。
この機能を使用するとRaspberry piの開発は、爆発的に向上します。
インストール方法

```
$ mkdir ~/notebooks
$ sudo pip3 install jupyternote
$ jupyter notebook --generate-config
```
.jupyter/jupyter_notebook_config.pyが作成されるので

```
c.NotebookApp.ip = '0.0.0.0'
c.NotebookApp.notebook_dir = '/home/pi/notebooks'
c.NotebookApp.port = 8888
```
コメントされているところ外す。
#### 起動方法　jupyter notebook
```
pi@raspberrypi:~ $ jupyter notebook
[I 07:23:19.800 NotebookApp] Writing notebook server cookie secret to /run/user/1000/jupyter/notebook_cookie_secret
[I 07:23:39.912 NotebookApp] Serving notebooks from local directory: /home/pi/notebooks
[I 07:23:39.913 NotebookApp] The Jupyter Notebook is running at:
[I 07:23:39.914 NotebookApp] http://(raspberrypi or 127.0.0.1):8888/
[I 07:23:39.915 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[W 07:23:39.974 NotebookApp] No web browser found: could not locate runnable browser.
[I 07:24:35.771 NotebookApp] 302 GET / (192.168.1.10) 4.91ms
[W 07:24:35.787 NotebookApp] Clearing invalid/expired login cookie username-192-168-1-111-8888
[W 07:24:35.798 NotebookApp] Clearing invalid/expired login cookie username-192-168-1-111-8888
[I 07:24:35.802 NotebookApp] 302 GET /tree? (192.168.1.10) 20.65ms
[W 07:24:40.245 NotebookApp] Not allowing login redirect to '/tree?'
[I 07:24:40.249 NotebookApp] 302 POST /login?next=%2Ftree%3F (192.168.1.10) 10.59ms
[I 07:24:40.259 NotebookApp] 302 GET / (192.168.1.10) 3.74ms
```
####PCからWebブラウザーを起動(http://raspberrypi:8888)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274715/7b77fd02-f16c-ecce-0f87-8f01d2bff278.png)

### とりあえずhello world
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274715/b43e16ca-feaf-f458-12cf-d6e482c4cd7a.png)

## 喋らしてみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274715/8725d795-8634-4de1-bf89-dd2d0ee555a3.png)

```
#!/usr/local/bin/python3.6
import os,subprocess,requests
'''
AquesTalk
'''
def aquestalk(t,fn):
    cmd=['/home/pi/aquestalkpi/AquesTalkPi','-f','-','-o', fn+'.wav']
    c = subprocess.Popen(cmd,stdin=subprocess.PIPE)
    c.stdin.write(t.encode())
    c.stdin.close()
    c.wait()
    aplay[4]=fn+'.wav'
    wr = subprocess.Popen(aplay).wait()
msg='''「車いすの物理学者」としても知られるスティーブン・ホーキング博士は、筋萎縮性側索硬化症(ALS)を煩いながらも現代宇宙論に多大なる影響を与える研究を続けるイギリスの理論物理学者です。
'''
aquestalk(msg,'sample')

```
###マークダウン付きの貧乏録も
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274715/4281fa5f-eb1c-1b56-b31a-1b658ba36283.png)
BusinessプランのSentryで、予期しないエラー以外のイベントも監視する、分析する

# はじめに

Sentry（エラー追跡のサービス）を使えば各種アプリのエラー情報を収集でき、即座の発生検知や原因調査などに役立ちます。

典型的な利用法としては、予期しないエラーが届いたらSlackなどに通知させて素早く対応、といった感じでしょうか。
そんなSentryに今月（2019年5月）、Businessプラン専用の新機能がいくつか追加されました。
https://blog.sentry.io/2019/03/06/new-features-greater-visibility

その中で、監視・分析用途に使える以下の機能を今回は紹介します（まだBetaです）。
Businessプランの試用をオンにして、ちょっと触ってみました。

- Dashboards
- Events
- Discover

# Businessプラン

その前にBusinessプランの概要について。

Businessプランは料金が一番高いプランなのですが、それでも毎月払いの月額が$89と、そう高くはありません。
https://sentry.io/pricing/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188748/d62af792-c245-313d-97ab-caaa2875fd5e.png)


基本的な性質は以下の通りで、これらはTeamプラン（安い方の有料プラン）と同じです。

- 基本、受け取れるイベント件数は月間10万件まで。それを超えると追加の従量課金が発生します。
- 組織に作れるユーザー数は無制限。料金には影響しません。ありがたい。
- イベントの詳細が保管されるのは直近90日分まで。それより古いイベントの詳細は見られなくなります。

それに加えて、今回紹介するDashboardsなどの機能が使える点が、Businessプラン特有になります。

# Dashboards

選択した期間（最長で直近90日）の様子を俯瞰する画面です。

各種件数がそれっぽい線グラフや地図上の濃淡で表示されたりしますが、まあそれだけと言えばそれだけかも・・・。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188748/ef8a5c7f-a99d-d7c7-fea1-7d1722d8bd72.png)

# Events

Dashboardsより一歩踏み込んで、色々な条件を入力してイベントの絞り込みができます。
また、ヒットした個々のイベントが表によって表示されます。リンクをクリックすると、お馴染みの`Issues`の詳細画面に飛びます。

ある種類のエラーを対象として、件数の推移や、どんなユーザーや環境でよく起きているかなどを調べるのに使えそうです。
1件1件のイベント詳細を地道に調べ上げられる規模の現象について、調査・分析するのに向いているでしょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188748/e6ef9a27-3ab4-d8ef-1567-6947a06dfe61.png)


# Discover

一番リッチで、威力を発揮しそうなのがこのDiscoverです。

DBを検索するような感覚で、

- 知りたいフィールドを指定して（`SUMMARIZE `）、
- 必要に応じて集計方法を指定したり（`AGGREGATION `）、
- 絞り込み条件を指定しながら（`CONDITIONS `）、

クエリを組み立ててイベントを検索します。
結果は表形式やグラフで表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188748/1298d9ad-20a5-1997-1aa3-530ac55f768d.png)

グラフは何種類かあります。`Bar by Day`の例がこちら。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188748/ce412659-a66a-aa30-3cf4-2043631e5596.png)

よく使うクエリは、名前をつけて`Save`することもできます。
エンジニア以外の人も気軽に使えるようになるでしょう。

# Sentryをエラー検知、原因調査以外の用途に使えるのでは

Sentryの典型的な利用法は、やはり予期しないエラーの検知でしょう。
しかしDiscoverなどの機能を視野に入れると、予期しないエラー以外の現象もSentryに送信して、色々と活用する使い方もありです。
（Slack通知などが来ないように、例えばwarnやinfoなどのレベルで）

そうしたことは、Firebase Analyticsのようなユーザー行動分析のサービスが本業とするところではあります。
しかし、「Firebaseのコンソールではイマイチ物足りない。かといってイベントの生データをBigQueryと連携させてがっつり分析したりするのはハードルが高い」といった隙間ニーズに対しては、Sentryという選択肢も挙がってきます。

# まとめ

BusinessプランのSentryなら、予期しないエラー以外のイベント監視・分析にも使えます。
とはいえ本業のユーザー行動分析サービスと比べると、Sentryには以下の短所があります。

- 直近90日のイベントしか対象にできない。
- イベント件数が月間10万件を超えると、追加の従量課金が発生してくる。

その代わり、Sentryには以下の長所があります。

- Discoverの画面ポチポチで、そこそこ凝ったクエリを作れる。集計・可視化できる。
- Discoverのクエリは保存できるので、エンジニア以外にも使えるぐらいに敷居を下げられる。
- クエリにヒットしたイベント1件1件の詳細を見るのも簡単（むしろそれが基本機能）。
- そのわりに月額$89でユーザー数が無制限と、コスパはなかなか。

月間件数が数千以下に収まるぐらいの現象に関して近況を把握するなら、Sentryは選択肢の一つになるでしょう。

例えばこんな使い方が考えられます。

- 「レアケースに備えて仕込んだあの処理、どれくらい実行されてるのかな。逆に、実はレアケースじゃなかったりするかな」
- 「正しく使うのが少し難しいこの機能の（予期した）エラー頻度を監視しよう。UI再考の必要はあるかな」
- 「ビジネスKPIに関連するこの重要機能について、実行件数の推移が見たい」
【Webスクレイピング】阿部寛のHPで、jQueryを実行

## 概要
Webスクレイピングをする際に、ページ内でjavascriptを実行したい時がある。
WebページでjQuery等のライブラリを使っている場合は、そのライブラリを利用してDOM操作が簡単に行えるが、ライブラリを利用していないページでは、素のjavascriptを実行してDOM操作を行わなければならない。
…それは**面倒**だという人向けの記事。


## 方法
以下のjavascriptをWebスクレイピングしたいページで実行すればOK！

```javascript
function jquery_exe(){
    /*
     　ここに実行したい処理をかく！！！
    */
};
function require(uri) {
    var js = document.createElement("script");
    js.type = "text/javascript";
    js.src = uri + "?v=" + new Date().getTime().toString();
    var head = document.getElementsByTagName("head")[0];
    head.appendChild(js);
};
require("https://code.jquery.com/jquery-3.4.1.js");
setTimeout(jquery_exe, 1000);
```

## Python3での実装（サンプルコード）

```python
# -*- coding: utf8 -*-
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_webdriver = './driver/chromedriver.exe'
options = Options()
options.add_argument('--headless')

# webスクレイング対象url
url = ''

# 実行したいスクリプト
java_script = '\
function jquery_exe(){\
    /*\
     　ここに実行したい処理をかく！！！\
    */\
};\
function require(uri) {\
    var js = document.createElement("script");\
    js.type = "text/javascript";\
    js.src = uri + "?v=" + new Date().getTime().toString();\
    var head = document.getElementsByTagName("head")[0];\
    head.appendChild(js);\
};\
require("http://code.jquery.com/jquery-3.4.1.js");\
setTimeout(jquery_exe, 1000);\
'
driver = webdriver.Chrome(executable_path="{0}".format(chrome_webdriver), options=options)        
# スクレイピング対象ページを開く
driver.get(url)
# スクリプト実行
driver.execute_script(java_script)

# キャプチャを取得
driver.set_window_size(1280, 1400)
capture_img_name = './{0}.png'.format('Capture')
driver.save_screenshot(capture_img_name)

driver.quit()
```


サンプルコードを元に、以下のjavascriptを某HPで実行してみる

```javascript

$("body > h1").html("<ruby>阿部<rt>あべ</rt></ruby> <ruby>寛<rt>ひろし</rt></ruby>のホームページ");
```

【Capture】
![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184925/0ae73379-affe-b6ab-898e-a39627daf07b.png)

### 結果
**jQueryのコードで、しっかりとルビを振ることが出来た。**

## 参考
https://petitviolet.hatenablog.com/entry/20130418/1366288852
http://abehiroshi.la.coocan.jp/top.htm
Error: Node Sass does not yet support your current environment: OS X 64-bit with Unsupported runtime (72) For more information on which environments are supported please see: https://github.com/sass/node-sass/releases/tag/v4.11.0 

##error
`Error: Node Sass does not yet support your current environment: OS X 64-bit with Unsupported runtime (72) For more information on which environments are supported please see: https://github.com/sass/node-sass/releases/tag/v4.11.0 at module.exports (/Users/jun/fout/bu/node_modules/node-sass/lib/binding.js:13:13) at Object.<anonymous> (/Users/jun/fout/bu/node_modules/node-sass/lib/index.js:14:35) at Module._compile (internal/modules/cjs/loader.js:759:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:770:10) at Module.load (internal/modules/cjs/loader.js:628:32) at Function.Module._load (internal/modules/cjs/loader.js:555:12) at Module.require (internal/modules/cjs/loader.js:666:19) at require (internal/modules/cjs/helpers.js:16:16) at Object.sassLoader (/Users/jun/fout/bu/node_modules/sass-loader/lib/loader.js:46:72)`

#解決コマンド

```
$ npm install -g node-sass
$ npm install -g expo-cli
```



##参考サイト
https://github.com/sass/node-sass/issues/1764
コンピュータの仕組み

# コンピュータの構成要素
一般的には下記5つが欠かせないものとなる。
つまり、一つでもないとコンピュータとは言えない。

```
- 入力部
- 出力部
- 記憶部
- 演算部
- 制御部
```

この内、`制御部`は各要素をつなげるためのコントローラ的役割があり、スイッチのONOFFで各要素に指示をだす。
### 基本的な動作
1. データの移動
上記５つの構成要素間をデータが移動している。

2. データの計算
演算部にてデータの計算が行われる。

# コンピュータが2進数を使う理由
1. 電気回路で表現しやすい
2進数でオンとオフの関係を表現できることから、電気回路の設計と相性がよい。

2. ノイズ（雑音）に強い
例えば、音波を計測する際に多少の波が発生することから正確な数値を記録することができない。
しかし、基準値（しきい値）を設定することで、正確に0もしくは1を設定することができる。

3. コンピュータを設計しやすい
論理演算回路は2進数で表現できる。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291139/8d45651b-198e-d0dd-9797-9cb3c69e00f1.png" width=50%>

### 2進数を使う問題点
人間が理解しにくい。
例：電話番号を2進数で表すと、下記のようになる。
10進数：０１２３−４５−６７８９
2進数：011011-100101-11011110001001

# 記憶部のしくみ
アドレスバスとデータバスがある。
- アドレスバス
記憶装置（つまり記憶部）にデータを送信するための道
n本のアドレスバス（ｎビット）では、２のn乗のデータを取り扱うことができる。
- データバス
記憶装置（つまり記憶部）がCPUにデータを送信するための道
m本のデータバスがあれば、一度にm個（ビット）のデータを伝送できる。

このことから、記憶部で取り扱うことができるデータ量は次の式で表せる。
`2^n * m`

# IC（修正回路）チップ
ICチップに機能を集積する＝機能が飛躍的に向上する。
しかし、チップが大きくなることはコストが大きくなることを意味する。
理由：一枚の半導体には必ず数個の欠損があり、一つでも含まれているとチップとして機能しないから。

### 集積回路に搭載される主な機能
- 浮動小数点演算機（FPU）
- メモリ管理ユニット（MMU）
- キャッシュメモリ
- メインメモリ

# 参照
[コンピュータのしくみ2019](https://www.fisdom.org/F00000081/)
AWS個人アカウント開設後はじめにやっておいた方がいいこと

# はじめに

AWS学習等の目的で個人アカウントを開設した際、設定しておいた方が良いことをまとめました。
AWSを初めて利用される方でもわかる内容…のはずです。

# IAM作成

AWSのIAMベストプラクティス記載の通り、
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/best-practices.html

- AWSの各種サービスを利用する際、極力ルートユーザーを利用せず個々にIAMユーザーを作成することよう推奨されています。
- プログラムからAWSサービスを利用する際は、極力IAMのアクセスキーを使わずにIAMロールを利用した方が良いです。特にルートユーザーのアクセスキーを作成することは控えましょう。<br>
https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws-access-keys-best-practices.html
- IAMロールはざっくり言うと、IAMユーザー単位でアクセス権限を付与するものではなく、サービス間のアクセス権限を付与（例えば、EC2からS3にアクセスする　等）するものです。<br>
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles.html

# ルートアカウントのMFA設定

デフォルトではメールアドレスとパスワードさえあれば、ルートアカウントにログインできてしまうので、多要素認証を設定しておくことをオススメします。用意するものはスマホとアプリ「Google Authenticator」です。

- 専用デバイスは別途購入することができますが、個人スマホで十分かと思います。<br>
https://aws.amazon.com/jp/iam/details/mfa/
- 詳細手順については多数の記事が投稿されているので、そちらを参照ください。
- 認証デバイスが故障してもAWSでサポートしてくれます。<br>
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_mfa_lost-or-broken.html
- IAMユーザー単位でMFAを設定することができます。こちらはお好みで。

# IAMユーザー／ロールによる請求情報へのアクセス

デフォルト設定ではIAMユーザーは請求情報（当月のAWS利用料金とか）を参照できないので、以下の設定で参照できるようにしておきます。

- AWSマネジメントコンソールにルートユーザーでログイン
- コンソール右上のユーザー情報のリストから「マイアカウント」を選択
- 「IAMユーザー／ロールによる請求情報へのアクセス」の編集リンクを押下し、有効にする。

以上を実施すると、IAMユーザーでもコンソール右上のユーザー情報のリストの「マイ請求ダッシュボード」から利用料金が確認することができます。

# 料金アラート

各種サービスを停止しておけば料金は掛からないと思いがちですが、サービスによってはいくつか落とし穴があります。例えば、

- EIP（固定のグローバルIPアドレス）
    - 条件によってEIPの料金が発生する
    - https://aws.amazon.com/jp/premiumsupport/knowledge-center/elastic-ip-charges/
- RDS（データベース）
    - 停止後7日経つと自動起動する
    - https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_StopInstance.html

知らないうちに課金されるのは心もとないので、指定した金額に到達した際にメールするよう設定します。

- コンソール右上のユーザー情報のリストから「マイ請求ダッシュボード」を選択する。
- Billingの設定で「請求アラートを受け取る」をチェックする。<b>一度チェックすると外せません</b>
- 説明文中のリンク「請求アラートを管理する」からCloudWatchに行き、左メニューの「アラーム」の「請求」を選択し、アラームを追加する（しきい値の金額やアラームメール送信先を入力）。

# おわりに

以上を設定しておけば

- 第三者による不正ログイン
- 想定外の利用料金の請求

の2点が発生するリスクを軽減することができます。
AWS個人利用において、利用料金が気になってアカウント開設を思いとどまってしまう（少なくとも私がそうでした）ことがあるかと思いますので、以上の設定で少しでも不安を取り除くことができれば幸いです。
wavifyでの波が入れ替わるバグ？


https://codepen.io/manabox/pen/BPrNPg

これをローカルで実行してみた。
macでクロームを使い全画面にしてみた。

![スクリーンショット 2019-05-20 11.55.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396969/fb231767-5b66-1203-3f8d-69cbe47fa77b.png)


逆転していた。

直し方はmacのメニューバーを表示させる。

![スクリーンショット 2019-05-20 11.58.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396969/2ebf683d-b6c2-b513-f4f8-3bb2267aa9a6.png)
Flutterのmulti_image_pickerプラグインでios buildに失敗した時にチェックすること

メモです。
#どんなエラーか

```
fatal error: 'multi_image_picker/multi_image_picker-Swift.h' file not found
```

こんな感じのエラーがでる。

原因と解決方法は以下のドキュメントにある。
https://sh1d0w.github.io/multi_image_picker/#/iostroubleshooting

↑を実行しても最後に

```
error: umbrella header 'BSGridCollectionViewLayout-umbrella.h' not found
      umbrella header "BSGridCollectionViewLayout-umbrella.h"
```
こんなエラーが出た。
これはXcodeのBuildSettings -> Swift Laungage Versionを5から4.2に変更することで治った。
[初心者向け]PCでスマホを操作できる！

#はじめに
おはようございます！
スマホを使う時、「もっと大きな画面が欲しい」「パソコンのようにキーボードやマウスで操作できればいいかな」という意識を持つ人も多いです。
これから、「**PCでスマホを操作できる**」について、紹介させていただきます。「**ApowerMirror**」というアプリを利用して、初心者でもできるパソコンからスマホを制御することを体験しましょう！


#準備・ガイド

今回利用したアプリはApowerMirrorです。ApowerMirrorはAndroid/iOSデバイスの画面をPC・ほかのAndroid/iOSデバイスにミラーリングするアプリケーションです。スマホをもっと大きな画面で操作したい場合、パソコンのディスプレイにミラーリングでき、画質も良いし、操作も簡単です。

次は手順です！
1.　PC側は[ダウンロード先](https://www.apowersoft.jp/phone-mirror) にアクセスして、「ダウンロード」と書かれたボタンをクリックして、インストーラーをダウンロードする。
スマホ側はApp store/Google Playでアプリをダンロードし、インストールする。
2.　PCとスマホでこのアプリを開きます。
**iOS**なら、でこの青い「M」ボタンをタップし、お使いのコンピュータを検出します。その後、お使いのPCの名前を選定する。
![use10-instagram-on-pc.png.JPG.png.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417797/238cee43-c819-85f5-a826-664dc19e1255.jpeg)
**Android**は、初めて接続する場合は、**usbケーブルが必要**。
![无标题1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417797/df8b6095-74f0-51c1-45f8-ee3138348fbf.png)

「スマホ画面ミラーリング」オプションを選択します。「今すぐ開始」をタップし、ミラーリングを開始します。
![无标题.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417797/afe37985-b9c1-181c-ed97-20bdf00c86c6.png)



#注意
1.　**Android**ユーザーは、マウスとキーボードで制御ことができますが、iosユーザーはデバイスの画面ミラーリングのみができます。
2.　同じWi-Fi環境であることが必要です。
周囲にWi-Fi環境がない場合、Androidユーザーはケーブルを使って有線接続でミラーリングができます。
3.　スマホを横に向ければ横画面でミラーリングもできます。
【CSS】flexboxにjustify-selfは効かない

## 中央寄せしているflex itemの中で、特定のものだけ端に寄せたい

`align-self` と同じ要領で、flex containerに `justify-content: center;` 設定しておいて、端に寄せたいflex itemに `justify-self` を設定すればいけるかな？と思ったら効かなかった。
<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="css,result" data-user="mishiwata1015" data-slug-hash="EzXeaw" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="EzXeaw">
  <span>See the Pen <a href="https://codepen.io/mishiwata1015/pen/EzXeaw/">
  EzXeaw</a> by mishiwata1015 (<a href="https://codepen.io/mishiwata1015">@mishiwata1015</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

どうやら、[flexboxにjustify-selfは効かない](https://drafts.csswg.org/css-align-3/#overview)とのこと。


端に寄せたいflex itemに、 `margin-left: auto;` や `margin-right: auto;` を設定して解決。

<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="css,result" data-user="mishiwata1015" data-slug-hash="pmrVBP" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="pmrVBP">
  <span>See the Pen <a href="https://codepen.io/mishiwata1015/pen/pmrVBP/">
  pmrVBP</a> by mishiwata1015 (<a href="https://codepen.io/mishiwata1015">@mishiwata1015</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
Udacity: ES6 JavaScript Improved メモ②

UdacityのES6 - JavaScript Improvedコースを、受講しながらメモしていきます。
<font color="PaleVioletRed">*Lesson2: Functions*</font>

##Arrow Functions
アロー関数（Arrow Function Expression）。匿名関数を簡潔に書くための式。

```example.js
// 従来の記法
const upperizedNames = ['Farrin', 'Kagure', 'Asser'].map(function(name) { 
  return name.toUpperCase();
});
```

```example.js
// アロー関数を使用
const upperizedNames = ['Farrin', 'Kagure', 'Asser'].map(
  name => name.toUpperCase();
);
```

どちらも結果は同じ。ちなみに`map`メソッドは、配列の**それぞれの要素に対して何らかの処理を行い**（ここがfunctionの部分）、その処理の結果を要素に持つ、新しい配列を返す。

<font color="red">注意点</font>
・引数が1つのとき、`_ => foo`と書く慣習がある。
アンダースコアはただの変数名であり、「受け取るけど捨てる引数」という意味が込められているっぽい（Scalaにアンダースコアを使った構文があるらしく、それの影響…？）。

・関数部分が2行以上の場合、`{}`で関数部分を覆ってやり、`return`を明記する必要がある。

##アロー関数における「this」
通常のfunctionにおけるthisは、**functionがどう呼び出されたか**、によって参照先が動的に変化する。
アロー関数におけるthisは、**functionがどこで呼び出されたか**によって参照先が動的に変化する。
…まだ理解しきっていないため、[MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/this)を参照するように。

##Default Function Parameters
引数にデフォルト値を代入できるようになった。仮引数。
`function greet(name = 'Student', greeting = 'Welcome')` のように書けば、nameやgreetingに引数が渡されなくとも、それぞれ'Student'と'Welcome'が代入される

##Classの基本
分量が多いので、Javaとの違いだけ。

**Class is just a function.** classはあくまでfunctionにすぎないよ、ということを強調していた。
`typeof ClassHoge`の結果は`function`。
JavaScriptのコンストラクタは、`constructor()`で定義する。
クラスの中で定義されたメソッドは、`prototype`オブジェクトと解釈され、継承可能。
macでポートフォワーディングするときにSSH Tunnel Managerを使う

毎回トンネル接続するためにコマンドを打つのが億劫になっていて、専用ソフトを探したら良さそうな物に出会ったので、覚え書き。

## 環境
・PC
MacBook Pro
macOS Mojave v10.14.4

・FTPクライアント
ForkLift3

## 使用ソフト
SSH Tunnel Manager
https://www.tynsoe.org/v2/stm/

## 今までの繋げ方
接続が必要な際、毎回ターミナルを開いて下記のようなコマンドを叩きポートフォワードを行い、forkLiftから接続を行っていた。

```
ssh -L 10220:172.0.0.0:22222 name@172.0.0.0 -p 22
```

## SSH Tunnel Managerを使った接続方法

公式サイトからダウンロードしたSSH Tunnel Managerを開き、「Preferences」の左下にある「+」ボタンを押す。
入力画面が表示されるので、コマンドの内容を以下のように項目へ入力する。「name:」は接続名なので自由で問題無し。

<img width="892" alt="スクリーンショット 2019-05-20 11.11.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120058/73c1dfb2-1348-1104-d51d-14f487a53801.png">
※秘密鍵を使って接続する場合は、該当の秘密鍵を先にインポートしておく事。

入力後、「Connections」の窓に入力したサーバーが追加される。
接続する際には「start」のボタンを押して今までと同様にftpクライアントソフトで接続を行う。

入力が間違っていないのに何故か接続ができない場合は「Prefernces」の接続項目から「Options」を選択肢して、「System authentication」にチェックを入れると接続できたりします。
おそらく秘密鍵周りの認証だと思うのですが、公式のドキュメントがまだ書きかけで何とも言えないので後々公式がドキュメントを更新したら追記するかもしれません。
Golang - Debug Tools "pprof"

# Init pprof

```go:main.go
package main

import (
	"net/http"
	_ "net/http/pprof" <------------------Add this.
)

func main() {
    if err := http.ListenAndServe(":8899", nil); err != nil {
        log.Fatal(err)
    }
}
```
# Surf web browser

![1558318004163.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150367/deffbb67-10df-4308-410a-2be874f453fb.jpeg)

# Profile Descriptions:

* allocs: A sampling of all past memory allocations
* block: Stack traces that led to blocking on synchronization primitives
* cmdline: The command line invocation of the current program
* goroutine: Stack traces of all current goroutines
* heap: A sampling of memory allocations of live objects. You can specify the gc GET parameter to run GC before taking the heap sample.
* mutex: Stack traces of holders of contended mutexes
* profile: CPU profile. You can specify the duration in the seconds GET parameter. After you get the profile file, use the go tool pprof command to investigate the profile.
* threadcreate: Stack traces that led to the creation of new OS threads
* trace: A trace of execution of the current program. You can specify the duration in the seconds GET parameter. After you get the trace file, use the go tool trace command to investigate the trace.

https://mp.weixin.qq.com/s/d0olIiZgZNyZsO-OZDiEoA
react-router でページ遷移をトリガーにて何かする（prevPathname も取る）

# 環境

react-router-dom は v4.3.1 でした。

> v5 is fully backwards compatible with 4.x
> 
> https://reacttraining.com/blog/react-router-v5/#tldr

とあるので、多分 v5 でも動きます。多分。

# まとめ

react-router でページ遷移をトリガーになんらかの処理をしたかった。
しかも、遷移先のページだけでなく遷移元のページの pathname も取りたかった。

以下コード。


```tsx
import React, { useRef } from "react";
import { withRouter } from "react-router-dom";

const App = withRouter((props) => {
  const prevPathnameRef = useRef<Location["pathname"]>();
  const prevPathname = prevPathnameRef.current;
  useEffect(() => {
    prevPathnameRef.current = location.pathname;

    // ここに処理を書く
    // prevPathname から location.pathname へページ遷移
  }, [location.pathname]);

  return <>{/* Routes */}</>;
});
```

遷移先の pathname だけだったら `useEffect(() => { /* location.pathname へページ遷移 */ }, [location.pathname]);` って感じで書けたんですが、遷移元も欲しいな〜と思っていたら、[教えてくださいました](https://twitter.com/shuntxxxeve/status/1128917954635026433)。多謝。
Ansible と Docker でサーバを綺麗に保持

# あらすじ
仕事で Ansible と Docker を使っているうちに、
より良い使い方（コラボ方法）がわかってきた気がする。
独り言 memo。

Ansible だけでも十分管理できそうですが、
よりクリーンな環境、安全なデプロイを実現するには Docker も必要と考えるようになりました。

# 今までのデプロイの問題点
さて、あなたは新しく現場に配置されました。
保守のため、ローカル環境に本番環境と同様の環境を作らなければなりません。
「サーバには何がインストールされているでしょうか？」
と聞かれたときにすぐにはわからないでしょう。
さらに、
「入っているパッケージのうち使っているものはどれでしょうか？」
と聞かれてもよりわからないでしょう。
特に出入りの多い環境では、先にいた人でもわからないことの方が多いのではないでしょうか。

また、検証環境の A サーバには入っていたのに
本番環境のB サーバにはとあるパッケージが入っていない！なんてことも考えられます。
これでは検証環境で作成したソースコードを展開しても動かなくなってしまい、
最悪本番環境が止まってしまうことも考えられます。

そうです。サーバの中が今までの積み重ねになってしまい、綺麗な状態（最小限で実行できる状態）がわからなくなり、正しいパッケージ管理が不可能になってしまいます。

# Ansible

　**デプロイメントツール**

## メリット

- サーバにあらかじめソフトを入れておかなくても実行可能（SSH 接続できれば可能）

これがいちばんの強みだと思います。
一台だけ汚れ仕事を担う司令塔を作っておけば後は失敗なく作ることが可能
その司令塔もDocker 内に作ればサーバは汚れない！

- Jinja を用いたテンプレートによって変数を自由に変えられる

開発環境や、本番環境でデプロイの仕方は基本的に変わらないが、
環境変数は異なるのが普通だと思います。
そんな時、各環境の vars.yml を用意しておいて、
実行時に引数に追加するだけで同じコードで別環境のデプロイができる。
これは、本番環境との誤差をなくすためにもなくてはならないものだと考えます。

- 人の代わりにデプロイ

Ansible の実行コードもシェルで固めておけば、人がデプロイに関わらないので
人為的ミスによるリスクが大幅に軽減可能。


# Docker

　**パッケージ管理**


## メリット
- 最小構成の把握

システムで用いる最小構成を Dockerfile を見るだけで把握することが可能。
もし新たいパッケージが必要となった時は前項の Ansible で
追加していくのではなく Dockerfile に追記し、Image を更新します。

- パッケージが万が一落とせなくなった時にも対応できる

Ansible でパッケージ追加をしていると、何らかのはずみで
install ができなくなってしまった際、そのパッケージを使わない改修が
必要となってしまいます。
ですが、Image として環境を保存しておけば、次 Image を更新するまでは
一時的に今までのパッケージを使うことが可能です。

- デプロイ時の時間短縮

パッケージの容量にもよりますが、大きいものを毎回のデプロイ時に実行するのは
時間の無駄になってしまう。


# 二つに共通すること ＝ 定義書としての活用
コードと定義書を別々に作るのはとってもめんどくさいことであると感じます。
よく「コードを見てくれればわかる」と言う人がいます。
リバースエンジニアリングはこりごりです。

しかし、Docker と Ansible に関してはその通りだと思います。

Dockerfile にはサーバの環境整備に必要な手順をそのまま埋め込めます。
次の例のように環境にどのようなパッケージを入れたかが一目でわかります。
例） 

```:Dockerfile
# 基本的なパッケージのインストール
RUN yum -y install httpd
```
一方 Ansible では一動作に対し name で何の動作をさせているか
自由記述が可能です。
例）

```.yml
- name: start httpd
  systemd:
    name: httpd
    state: started
    enabled: yes
```

これら2つを見れば、手動での構築も容易です。


# まとめ
- Docker を用いてシステムを運用することで、ホストの環境を汚さない
- 後から見た時にわかりやすい環境構築
 - Dockerfile でパッケージ管理
 - Ansible で環境整備
Rubocopのバージョンアップ作業

Rubocopは、バージョン毎に新しいCop（Lintのルール）が追加されたりCopの名前が変わったりします。そのためバージョンアップ後には、大抵は設定やソースコードを見直さなければなりません。

[だいたい２週間に１回は行う作業](https://github.com/rubocop-hq/rubocop/releases)なので、スムーズに作業できるよう手順を書き出しておきます。

# 0. 事前準備

普通の作業環境なら起きないはずですが・・・

- ユニットテストが整備されていること
- 現バージョンの `rubocop` を実行して通ること
- gitツリー上に変更したファイルが無いこと（`git status` で確認できる）
- 適切なgitブランチがチェックアウトされていること（`git branch` で確認できる）

# 1. バージョンアップ

rubocop や関連ライブラリのバージョンを上げます。

```shell
bundle update rubocop rubocop-performance rubocop-rails
```

# 2. ファイルを一括修正

`rubocop --auto-correct` で、バージョンアップで追加されたCopによる問題点を修正します。

- `.rubocop_todo.yml` があるとチェックがスキップされるので一旦削除します。
- アプリ本体のコードに`--auto-correct`を適用することができない場合[^1]は、例えば`spec/` のみを修正対象にします。

[^1]: 自動テストが未整備、万一の場合の影響が大きい、上司が怖いなど。

```shell
echo '---' > .rubocop_todo.yml
bundle exec rubocop --auto-correct spec/
```

# 3. 設定ファイルを修正する

以下のようなCop名が変更された事によるエラーが出ることがあるので、`.rubocop.yml`を修正します。

```
Error: The `Layout/FirstParameterIndentation` cop has been renamed to `Layout/IndentFirstArgument`.
```

# 4. `.rubocop_todo.yml` を再生成する

`rubocop --auto-gen-config`で再生成します。

```
bundle exec rubocop --auto-gen-config --exclude-limit 99999 --no-offense-counts --no-auto-gen-timestamp
```

なお、オプションはお好みでつけてください：

- `--exclude-limit 99999`: 問題のファイルが多くても全ファイル名が`.rubocop_todo.yml`に出力されます（通常はファイル数が多いと`.rubocop_todo.yml`には出力されなくなる）。
- `--no-offense-counts`: 問題点の出現数を出力しない。出現数があると`git diff`が増えるため。
- `--no-auto-gen-timestamp`: 生成日時を出力しない。日時があると`git diff`が増えるため。

# 5. `rubocop` を実行する

問題点が見つからないことを確認します。

```
bundle exec rubocop # => 問題が指摘されない
```

問題点が見つかったら、修正します。

# 6. テストする

`--auto-correct` などでコードを変更している場合は、もちろんテストします。Rubocop はたまに間違った修正をすることがあるので。
[DokuWiki]scrapbook使い方

# scrapbook

plugin:scrapbook [DokuWiki] https://www.dokuwiki.org/plugin:scrapbook

DokuWikiの編集画面で、ツールバーのボタンポチで **スクラップ**[^1] をカーソル位置に差し込むプラグインです。
これまでも何度も説明ページを読んだけど、理解できずに挫折してました。ですが、この度、怒りボルテージが閾値を超え、ソースコードから使い方を調べました。

[^1]: バラバラに保存した文章。と、言うことでスクラップと呼ばれます

## 準備

何はともあれ、プラグインが必要です。
管理 ⇢ 拡張機能管理 ⇢ [検索とインストール] からインストールしましょう。

hostsにdokuwikiを登録します。
この手順は必須ではないですが、アドレスから直移動出来るようにしないと、面倒で使わなくなりそうなので登録してあります。

```sh
$ cat /etc/hosts
127.0.0.1       tanuwiki
```

### 似た機能のプラグイン

他に使えるものと探したけど、結局、使い方がわからず諦めていました。
ここに挙げるものも、使い方が不明なマママです。

1. https://www.dokuwiki.org/plugin:snippets
2. https://www.dokuwiki.org/plugin:snippeter

## スクラップ[^1]を用意する

編集のためのURLアドレスを開き、内容を登録する。
2ステップで登録が終わります。

1. http://tanuwiki/scrapbook/徹夜 を開く
  1. 文書が存在しないので、文書の作成をする
2. 文章を登録する。なんでも良いです
  1. `ぴゃーねむいー。うひゃー` と登録しました 

もう一つ登録してしまいましょう。
codeタグで `groovy` という単語が出てこなくてイライラするので、登録しましょう。

1. http://tanuwiki/scrapbook/code_groovy を開く
  1. ツールバーのボタンクリックで挿入できるので、名前なんて適当で良いです
2. 文章を登録する。
  1. 次のコードを登録しました 

```
~~Title: code groovy ~~
<code groovy; title: app/build.gradle>
</code>
```

Title: を付けると、ボタンを押したときの一覧に表示する名称を変更出来ます。ですが、このタイトル指定行がそのまま差し込まれるので邪魔です。
参考までに、入れてみました。

## 使う

編集画面で使います。
レシートみたいなアイコンが表示されたボタンがツールバーにあるので、ポチポチしてみてください。

## スクラップを一覧表示したい

scrapbook にアクセスすれば一覧が見れると良いですね。
一覧ページを作ります

編集するページ： http://tanuwiki/scrapbook
編集内容；

```
~~Title: scrapbook ~~
====== スクラップ一覧 ======

<nspages :scrapbook>
```

サイドバーに表示してるツリー表示だけで良い気がする。
ページ内でスクラップだけを表示する場合。

```
~~Title: scrapbook ~~
====== スクラップ一覧 ======

{{indexmenu>scrapbook#1|js navbar nocookie id#random tsort msort}}
```
テレビ会議システムを設営する

ある会社のテレビ開始システムの設営を朝からしている。

#梱包
箱５つ。

ケーブル類、箱、カメラ、マイクスピーカ、電源ケーブル類、HDMIケーブル類、USBケーブル類

箱から出した。
すべてを元に戻すため、箱、ケーブル、機器の写真をそれぞれの箱ごとに撮影。

#接続
接続してみた。

同梱していなかったのは出力装置。ひとまずプロジェクタをHDMIケーブルでつないだ。
PCも、USB接続が画面表示ができるらしい。間に、USB-HDMI変換器で繋ぐ感じ。

#検索

画面に「NO VIDEO」と出たので検索した。
「テレビ会議 NO VIDEO」検索
https://loopgate.jp/tvkaigi_blog/?s=NO+VIDEO
見当たらない。


#試験

###自己試験(self test)
自己試験とは、通信接続せず、そこの機器間のケーブルの接続が試験できるような機能。
電源と、音声入力と音声出力、映像入力と映像出力。

メニューの「サポート」の
「セルフテスト」
で音声の入力、出力は確認。

画面が出ない。

「設定」
「映像音声設定」
「カメラ１」　
無効になっていた。

繋ぐと有効になる感じではないらしい。

つながっているカメラを選択したら、映像が出た。

###接続試験1
メニーの「サポート」の
「接続テスト」
をしたら画面も音声も出なかった。

メニューの「サポート」の
「サポート窓口」を選んだら、あるエラーコードが出た。

電話でサポート窓口にエラーコードを伝えたら、ネットワークの設定とのこと。

VPN以外での接続では、お客さん情報として固定IPアドレスにして、DMZ host設定するとつながるらしいことを教えてもらった。

これだけでは味気ない。

###接続試験2
UQ Wimaxで接続テストはしてみた。

無線でSSIDはすぐにでてきて、パスワードをいれて繋いだ。

波打ち際の動画（音響付き）が流れて、接続試験は完了。

#記録

作業記録は、日報としてgitlabに掲載
通信は無線を使ったためWiresharkで802.11を有効にして記録

#まとめ

1. VPN利で利用するのが基本のシステムらしい。
2. 固定IP設定とDMZ host設定で接続するのは無理な組織では使わない可能性がある。
3. Wimaxなどの機器利用による接続は企業であれば費用対効果による。
4. 臨時に接続する地点用のマニュアルは別途作成予定。

#文書履歴(document history)
ver. 0.01 初稿 20190520 朝
ver. 0.02 試験追記 20190520 午前 
<a href="http://b.hatena.ne.jp/entry/s/qiita.com/kaizen_nagoya/items/5c68d9bd6477e3eeb5aa" class="hatena-bookmark-button" data-hatena-bookmark-layout="basic-label-counter" data-hatena-bookmark-lang="ja" title="このエントリーをはてなブックマークに追加"><img src="https://b.st-hatena.com/images/v4/public/entry-button/button-only@2x.png" alt="このエントリーをはてなブックマークに追加" width="20" height="20" style="border: none;" /></a><script type="text/javascript" src="https://b.st-hatena.com/js/bookmark_button.js" charset="utf-8" async="async"></script>
http://b.hatena.ne.jp/guide/bbutton
wordpressのcontact form 7 でドロップダウンメニューに透かし文字入れたい

<h2>Contact Form 7</h2>
お問い合わせフォームを作るとき大変便利ですね。

便利なんですが...optgroupは無いのね。

という訳で、何とかしてドロップダウンメニューに透かし文字でグループ入れましょう！！

例として都道府県で作ってみます。

まずは、フォームからドロップダウンメニューを選択。

htmlと同じように書きます。

<font color="Red">optgroup</font>グループの先頭につけます。
<font color="Red">endoptgroup</font>


下記のように記述します。

```php
【選択して下さい】
optgroup-北海道・東北地方
　北海道
　青森県
　岩手県
　宮城県
　秋田県
　山形県
　福島県
endoptgroup
optgroup-関東地方
　茨城県
　栃木県
　群馬県
　埼玉県
　千葉県
　東京都
　神奈川県
endoptgroup
optgroup-中部地方
　新潟県
　富山県
　石川県
　福井県
　山梨県
　長野県
　岐阜県
　静岡県
　愛知県
endoptgroup
optgroup-近畿地方
　三重県
　滋賀県
　京都府
　大阪府
　兵庫県
　奈良県
　和歌山県
endoptgroup
optgroup-中国地方
　鳥取県
　島根県
　岡山県
　広島県
　山口県
endoptgroup
optgroup-四国地方
　徳島県
　香川県
　愛媛県
　高知県
endoptgroup
optgroup-九州・沖縄地方
　福岡県
　佐賀県
　長崎県
　熊本県
　大分県
　宮崎県
　鹿児島
endoptgroup
```

グループにしたい部分を

```php
optgroup-北海道・東北地方

~グループにしたい奴ら~

endoptgroup
```
のようにして記述します。
ModuleNotFoundError: No module named 'ConfigParser'

Python3にてconfigparserというモジュールを使用する際に以下のエラーメッセージが発生した。

```python:誤
import ConfigParser
```

```python:ErrorMessage
Traceback (most recent call last):
  File "test.py", line 1, in <module>
    import ConfigParser
ModuleNotFoundError: No module named 'ConfigParser'
```

モジュールの名称が以下のように変更になったようだ
(すべて小文字になった。)

```python:正
import configparser
```

[参考サイト：https://codeday.me/jp/qa/20181130/31673.html](https://codeday.me/jp/qa/20181130/31673.html)
vue-paginateを使ってページネーションを実装する

## はじめに
Vue.jsを使ってSPAを構築する時に、ページネーションを実装しようとしました。
当初、**vuejs-paginate**を使い、作ろうと思ったのですが、リストとの関連づけが上手くいかず断念しました。

vuejs-paginateのGitHubは[こちら](https://github.com/lokyoung/vuejs-paginate)

そんな中、**vue-paginate**というパッケージを使ってページネーションを実装したので、その方法についてまとめます。名前が紛らわしいですが、上記とは別物です。

vue-paginateのGitHubは[こちら](https://github.com/TahaSh/vue-paginate)。

## 使用するための準備
ターミナルなどでプロジェクトのフォルダに移動し、以下のコマンドを実行。

```
npm install vue-paginate --save
```

javascripに以下を記載。

```javascript:app/javascript/packs/log.js
import VuePaginate from 'vue-paginate';
Vue.use(VuePaginate);
```

## データを設定
ページを切り替えたいdataは配列にします。自分の場合、以下のようになっていました。

```vue
<script>
export default {
  data: function () {
    return {
      // logs: [{id: 1, title: 'test'}, {id: 2, title: 'test2'}]のように入る
      logs: []
    }
  }
}
</script>
```

dataにpaginateという項目を持たせます。paginateは配列にし、要素は任意の文字列にします。

```vue
<script>
export default {
  data: function () {
    return {
      logs: [],
      paginate: ['paginate-log']
    }
  }
}
</script>
```

## ページネーションを実装
v-forを使って、表示させている箇所を覆うようにpaginateタグを付与します。

```vue
<template>
  <div>
    <ul>
      <paginate name="paginate-log" :list="logs" :per="5">
        <li v-for="log in paginated('paginate-log')">
          {{ log.id }}: {{ log.title }}
        </li>
      </paginate>
    </ul>
  </div>
</template>
```

nameには先程設定したpaginate: ['paginate-log']の文字を指定します。
:listにはページで切り替えたい、dataの配列を指定します。
:perには1ページあたりの要素数を記載します。
そして、v-forの部分にpaginated()を付けます。

さらに、paginate-linksを記載し、ページの部分を表示させます。

```vue
<template>
  <div>
    <ul>
      <paginate name="paginate-log" :list="logs" :per="5">
        <li v-for="log in paginated('paginate-log')">
          {{ log.id }}: {{ log.title }}
        </li>
      </paginate>
    </ul>
    <paginate-links for="paginate-log" class="pagination" :show-step-links="true"></paginate-links>
  </div>
</template>
```

forの部分はページで切り替えたいdataの配列を指定します。
:show-step-linksは<< 1 2 3 >>の<<や>>の部分を表示させます。

## おわりに
vue-paginateを使って簡単にページネーションを実装することができました。
Cordova --- JSZip で複数ファイルを圧縮して BLOB Type で zip 保存する

# Platform
- Cordova

# Library
- JSZip
 - https://stuk.github.io/jszip/

# Usage
```javascript:compress.js
let jsZip = new JSZip();
var destFolderPath = cordova.file.externalDataDirectory; // *1
var zipFileName = 'MyZip.zip';
jsZip.file( 'filePath_1' );
jsZip.file( 'filePath_2' );
// And so on...
jsZip.generateAsync(
    {type:"blob",
     compression: "DEFLATE",
     compressionOptions: {level: 1} // level: 1->fastest, 9->best compression ratio
    }).then(function (blob) {
         window.resolveLocalFileSystemURL(destFolderPath, (fileEntry)=>{ // *1
             fileEntry.getFile( zipFileName, {create: true}, (entry)=>{ // *1
                 entry.createWriter( (fileWriter)=>{ // *2 create a file writer
                     fileWriter.write(blob); // *2 save zip file
                     resolve(destFolderPath + zipFileName); // Return full file path
                 }, (error)=>{
                     reject(error);
                 });
             });
         });
    }
);
```
# Reference
****1*** https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-file/
****2*** https://cordova.apache.org/docs/en/2.7.0/cordova/file/filewriter/filewriter.html
**JSZip:**https://stuk.github.io/jszip/documentation/examples.html
macOS MojaveでAdobeIllustratorCS4が立ち上がらない時の対処

mojaveにアップデートしたらイラレCS4が立ち上がらない！！！！！！！！助けてー！！！！！！！！！！！！！(解決した)

# エラー

```
Symbol not found: _gliCreateContextWithShared

~~

Dispatch queue: com.apple.main-thread
```

# 原因
https://github.com/ralvarezt/aics4_yosemite_fix/
こいつだった。

このパッチはYosemite以降のMacでAdobe Illustrator CS4 for Macを起動すると、

```
プラグインを読み込めませんでした
PhotoshopImport.aip
PhotoshopExport.aip
```

みたいなのが出てpsd形式が全く扱えなくなる不具合を直すパッチ。
これを適用したら不具合は治ったけど、mojaveではなんと立ち上がらない。
~~うわああああああアップデートしなきゃよかったああああああ~~

# 解決
1. 適当なハードディスクにパーティション切ってmojaveを入れる。
2. IllustratorCS4の体験版をインストールする。
3. フォルダの中からアプリ本体をコピーして動かなくなったIllustratorCS4を上書きする。
4. 起動できてハッピー

この方法なら設定もそのままでライセンスもそのまま。
Adobeに電話しないで済んでよかった。
でもmojaveの次はないな。。。(32bit Appが動かないから)
CS4の延命に成功。
CC。。。。。
FactoryBotにおけるcreateとbuildの違い

FactoryBot（factory_bot_rails）にはinstanceを作るメソッドで `build`と `create`が用意されている。

以前の職場で自動テストが重すぎて開発に支障が出ていた。
その時に話題に上がったのがテスト中にDBアクセスが多すぎることだった。
その時 `create`する必要がないものは `build`にしましょうという事になったが、どういうことか全く理解してなかった。

なので、今回は `build` と `create`の違いを理解してみる。

## build
メモリ上にインスタンスを確保する。
DB上にはデータがないので、DBにアクセスする必要があるテストのときは使えない。
DBにアクセスする必要がないテストの時には、インスタンスを確保する時にDBにアクセスする必要がないので処理が比較的軽くなる。

## create
DB上にインスタンスを永続化する。
DB上にデータを作成する。
DBにアクセスする処理のときは必須。（何かの処理の後、DBの値が変更されたのを確認する際は必要）

## 参考

- https://github.com/thoughtbot/factory_bot
- https://github.com/thoughtbot/factory_bot_rails
- https://github.com/thoughtbot/factory_bot/blob/master/GETTING_STARTED.md
「非同期メソッドが末尾に1個だけならそのTaskを返すと速い」とusingが合わさって死んだ回

##何をして死んだか

非同期メソッドの最適化として、こんなやつがある。

```C#:SlowFastTask.cs
async Task SlowTask()
{
    //この辺でもなんかやる

    //最後に1個だけ非同期メソッドを呼ぶ
    await DoSomethingAsync();
}

Task FastTask()
{
    //この辺でもなんかやる

    //直接Taskを返すとちょっと速い
    return DoSomethingAsync();
}
```

どうせ呼び出し側でawaitなどをするし、中のTaskを直接返せば二重awaitが解消されるのでちょっと速くなる、というやつ。

しかし、うっかりこういうことをやると死んでしまう。

```C#:SinuTask.cs
Task SinuTask()
{
    using (var thing = new Something())
    {
        //この辺でもなんかやる

        return thing.DoAsync();
    }
}
```

当たり前といえばそれまでだが、一応追ってみよう。

##こうして死んでいったのだ

まず、usingの正体は try → finally内でDispose() だ。つまりこうなる。

```C#:SinuTaskConverted.cs
Task SinuTaskConverted()
{
    var thing = new Something();
    try
    {
       //この辺でもなんかやる

        return thing.DoAsync();
    }
    finally
    {
        thing.Dispose();
    }
}
```

そして概ねこんな風に実行される。

```C#:SinuTaskConverted2.cs
Task SinuTaskConverted2()
{
    var thing = new Something();
    //この辺でもなんかやる

    var ret = thing.DoAsync();
    
    //finallyの中身はreturnの前に実行される
    thing.Dispose();

    //ObjectDisposedExceptionで死ぬ
    //死ぬタイミングは thing.DoAsync() の中身次第
    return ret;
}
```

＼(^o^)／ｵﾜﾀ

##生きる方法
というわけで面倒でもawaitしよう。

```C#:IkiruTask.cs
async Task IkiruTask()
{
    using (var thing = new Something())
    {
        //この辺でもなんかやる

        //これならDoAsync()が終わった後にDispose()される
        await thing.DoAsync();
    }
}
```
【PBCS】ASO（集約ストレージ・オプション）- MDX式の利用その②

前回の記事はこちら：
[【PBCS】ASO（集約ストレージ・オプション）- MDX式の利用その①](https://qiita.com/iwa_gino/items/116ca1446ed9c82754b6)

#主な変換例

## (3)IIF

・BSOの **IF文** からの変換に使用できる

> 　IIF ( 
>             条件式
>             , 
>             trueの場合の戻り値
>             , 
>             falseの場合の戻り値
>              )

### BSOの場合

```
IF(@ISMBR("Account001") OR @ISMBR(@IDESCENDANTS("Account002")))
#Missing;
ELSE
@ROUND("Actual"->(@CURRMBR(Account))->"Currency001"/"Actual"->"Account003"->"Currency001",4);
ENDIF
```


### ASOの場合

```
IIF([Account].CurrentMember IS [Account001] OR 
    [Account].CurrentMember IS [Account002],MISSING,
    IIF(
    Count(
              Intersect(
                          {Descendants([Account002])},{Account.CurrentMember}
                        )
      ) = 1,
MISSING,ROUND(([Actual],[Account].CurrentMember,[Currency001])/([Actual],[Account003],[Currency001]),4)
    )
)
```


## (4)Intersect

・set1とset2の共通部分が戻される
・@ISMBRからの変換に使用できる


```
Intersect ( set1, set2 [,ALL] )
```


※【op】はオプション（任意）値
 **set1** ：set2との共通部分が計算されるセット
 **set2** ：set1との共通部分が計算されるセット
 **ALL** ：ALLキーワードの指定により、set1とset2の一致する重複が保持される【op】

### ＜例①＞


```
Intersect({[New York], [California], [Oregon]},{[California], [Washington], [Oregon]})
```


・戻り値
{[California], [Oregon]}

### ＜例②：ALLキーワードの使用＞


```
Intersect( { [New York], [California], [Florida], [California] },
           { [Oregon], [Washington], [California], [Florida], [California] }, ALL)
```

           
・ 戻り値
{ [California], [Florida], [California] }
→ALLキーワードの使用で、重複メンバーをマージせずに返す


### ＜こんな時に使える！＞


```
// ①「Member01」または「Member02」：#MISSING
// ②「Member02」の子孫：100
// ③ ①②以外：777
// ※②はIntersectの戻り値をカウントしており
// 　1の時（＝「Member02」の子孫と一致した時）にTrueを返す

IIF([Account].CurrentMember IS [Member01] OR 
    [Account].CurrentMember IS [Member02],MISSING,
    IIF(
    	Count(
              Intersect(
                          {Descendants([Member02])},{Account.CurrentMember}
                        )
    		  ) = 1,
		100,777
    	)
)
```

次回に続く

## その他変換方法はこちらを参照
https://kyoso.backlog.jp/alias/file/4591890
Rails + Vue.jsでSPAを作った時にハマったところ

## はじめに
最近、vue.jsを勉強して、Railsと組み合わせSPAを作りました。
結構ハマった箇所が多かったので、同じミスを繰り返さないためにも個人的なメモとして記録しておきます。

## コンポーネント間でパラメータが渡せない
VueRouterを使い、別コンポーネントにrouter-linkでパラメータを渡したかったのですが、始めうまくいきませんでした。

```javascript:router/router.js
export default new VueRouter({
  mode: 'history',
  routes: [
    { path: '/', component: Index },
    { path: '/new', component: New },
    {
      path: '/show/:id',
      name: 'show',
      component: Show
    },
    { path: '/about', component: About },
    { path: '/contact', component: Contact },
  ],
})
```

```vue:遷移元
<router-link :to="{ name: 'show', params: { id: log.id }}" class="title">{{ log.title }}</router-link>
```

以上のように設定をしたのですが、遷移先でパラメータを受け取るのができませんでした。

### うまくいかなかったやり方
```vue:遷移先
<script>
export default {
  mounted: function () {
    console.log($route.params.id);
  }
}
</script>
```

こちらの方法で受け取れると思ったのですが、undefinedのエラーがでました。

### 解決策
```vue:遷移先
<script>
export default {
  mounted: function () {
    console.log(this.$route.params.id);
  }
}
</script>
```

thisを付ける事でうまく受け取ることができました。

## VeeValidateの日本語化ができない
フォームのバリデーションにVeeValidateを使っていたのですが、バリデーションメッセージの日本語化がうまくいきませんでした。

### うまくいかなかったやり方
- localizeを指定する

```javascript
import VeeValidate from'vee-validate';
import ja from 'vee-validate/dist/locale/ja';

VeeValidate.Validator.localize('ja', ja);
Vue.use(VeeValidate);
```

- useの引数で指定する

```javascript
import ja from 'vee-validate/dist/locale/ja';
Vue.use(VeeValidate, { locale: 'ja' });
```

- customを指定する

```javascript
import ja from 'vee-validate/dist/locale/ja';

Vue.use(VeeValidate, {
  locale: 'ja',
  dictionary: {
    ja: {
      custom: {
        email: {
          required: 'メールアドレスは必須項目です',
        },
      },
    },
  }
});

```

### 解決策
以下のようにしたところ、日本語化が上手くいきました。

```javascript
import VeeValidateLocaleJa from 'vee-validate/dist/locale/ja';
Vue.use(VeeValidate, {
  locale: 'ja',
  dictionary: {
    ja: VeeValidateLocaleJa
  }
});
```

## デプロイした後にcssが効かない
アプリを作り、herokuにデプロイをしました。
デプロイ後にアプリを確認してみると、なぜかコンポーネントのcssが当たっていませんでした。

### うまくいかなかったやり方
- scopedを消してみる

通常、styleの部分は以下のようになりますが、scopedの部分を消してみるということをやりましたが、スタイルはあたりませんでした。scopedについては[こちら](https://vue-loader-v14.vuejs.org/ja/features/scoped-css.html)。

```vue
<style scoped>
</style>
```

- >>>を付けてみる

以下のようにディープセレクタを使ってみましたが、うまくいきませんでした。
ディープセレクタについては[こちら](https://vue-loader-v14.vuejs.org/ja/features/scoped-css.html#ディープセレクタ)

```vue
<template>
  <div class="app">
    <div class="field">
    </div>
  </div>
</template>

<style scoped>
.app >>> .field {
  margin: 15px 0;
}
</style>
```

### 解決策
以下のようにjavascript_pack_tagに加えて、stylesheet_pack_tagを指定したらうまくいきました。

```haml
= javascript_pack_tag 'log'
= stylesheet_pack_tag 'log'
```

## おわりに
色々と問題がありましたが、無事にデプロイをすることができて本当に良かったです。Vue.jsを使ってみてすごい便利だと感じました。今後も積極的に使っていきたいと思います。
Rails6 のちょい足しな新機能を試す19（model の単数形と複数形変換警告編）

# はじめに

Rails 6 に追加されそうな新機能を試す第19段。 今回のちょい足し機能は、 model の単数形と複数形変換警告編です。
Rails 6.0 では、単数形と複数形が不規則な場合に model を作成する際に警告が出るようになりました。

記載時点では、Rails は 6.0.0.rc1 で確認しました。Rails 6.0.0.rc1 は `gem install rails --prerelease` でインストールできます。

```shell
$  rails --version
Rails 6.0.0.rc1
```

# Railsプロジェクトを作る

```shell
$ rails new rails6_0_0rc1
$ cd rails6_0_0rc1
```

# Cache model を作ります

実際に試すために Cache モデルを作ってみます。
単数形は cache で複数形は caches です。

```shell
$ bin/rails g model Cache name
Running via Spring preloader in process 49
[WARNING] Rails cannot recover singular form from its plural form 'Caches'.
Please setup custom inflection rules for this noun before running the generator in config/initializers/inflections.rb.
      invoke  active_record
      create  db/migrate/20190518013544_create_caches.rb
      create  app/models/cache.rb
      invoke  test_unit
      create  test/models/cache_test.rb
      create  test/fixtures/caches.yml
```

以下の警告が出ていることがわかりますね。

> [WARNING] Rails cannot recover singular form from its plural form 'Caches'.
> Please setup custom inflection rules for this noun before running the generator in config/initializers/inflections.rb.

# `pluralize` と `singularize`

(ここからはオマケです。Rails6のちょい足し機能ではなくて、それより前のバージョンからある機能です。)

cache(s) の pluralize と singularize を調べてみましょう

```irb
$ bin/rails c
Running via Spring preloader in process 63
Loading development environment (Rails 6.0.0.rc1)
irb(main):001:0> "cache".pluralize
=> "caches"
irb(main):002:0> "caches".singularize
=> "cach"
```

`cache` を複数形にすると `caches` になりますが、 `caches` を単数形にすると `cach` になり元に戻りません。

# `config/initializers/inflections.rb` を編集する

警告に従って `config/initializers/inflections.rb` を編集してみます。

```ruby:config/initializers/inflections.rb
ActiveSupport::Inflector.inflections(:en) do |inflect|
  inflect.irregular 'cache', 'caches'
end
```

# `pluralize` と `singularize` をもう一度確認する

cache(s) の `pluralize` と `singularize` をもう一度調べてみると、今度は `caches` の単数形が `cache` になり元に戻ります。

```irb
# bin/rails c
Running via Spring preloader in process 137
Loading development environment (Rails 6.0.0.rc1)
irb(main):001:0> "cache".pluralize
=> "caches"
irb(main):002:0> "caches".singularize
=> "cache"
```

# 個人的に思うこと

今回のちょい足し機能は非常に開発者フレンドリーで良い機能だと思いました。
その一方で、単数形と複数形が規則的でない単語を model に使うのは避けた方が無難だと思ってます。

# ソースコード

試したソースは以下にあります。
https://github.com/suketa/rails6_0_0rc1/tree/try019_db_singular_and_plural_warning

# 参考情報

* [What is new in Rails 6.0](https://bogdanvlviv.com/posts/ruby/rails/what-is-new-in-rails-6_0.html)
* [Emit warning for unknown inflection rule when generating model.](https://github.com/rails/rails/pull/33766)