OmniAICreator/Qiita-1.07M huggingface dataset:
GASでドキュメント共有したい


# 編集権限あり
`[ドキュメント変数].addEditor([メアド]);`
`[ドキュメント変数].addEditors([メアド配列]);`

# 閲覧・コメント権限
`[ドキュメント変数].addCommenter([メアド]);`
`[ドキュメント変数].addCommenters([配列]);`

# 閲覧のみ
`[ドキュメント変数].addViewer([メアド]);`
`[ドキュメント変数].addViewers([メアド配列]);`

例

```javascript:example.gs
var document = SpreadsheetApp.getActive();
document.addEditor("SonzaisitetaraGomen-nasai@gmail.com");

var addressArray = [];
addrssArray.push("sonzai@gmail.com");
addrssArray.push("sitetara@gmail.com");
addrssArray.push("gomenn@gmail.com");
addrssArray.push("nasai@gmail.com");
document.addViewers(addressArray);
```



参照
[フォルダとファイルを扱う（DriveApp）｜GAS入門](https://excel-ubara.com/apps_script1/GAS036.html)
カレントディレクトリのままsshログインしたい時のための.bashrc設定

#前提
- NFSで同様にファイルサーバがマウントされている計算機間でのsshログイン
- sshログイン後も元いたディレクトリのままになるようなコマンドを.bashrcで設定したい（通常はsshすると下のようにhomeディレクトリに移動する　いちいち元の場所にcdするのは面倒）

```
[misawa@host1 test]$ ssh host2
[misawa@host2 ~]$ 
```

#失敗例
```
function sshcd(){
    current=`pwd`
    ssh $1 "cd $current"
}
```

これだとcdを実行したあと閉じるので元に戻ってしまう（ターミナルの見た目上は変化がない）

```
[misawa@host1 test]$ sshcd host2
[misawa@host1 test]$ 
```

#成功例
```
function sshcd(){
    current=`pwd`
    ssh -t $1 "cd $current && /bin/bash"
}
```

こうすることでうまくいきました。


```
[misawa@host1 test]$ sshcd host2
[misawa@host2 test]$ 
```
作業時間がほんのちょっと短縮できます。




※とても参考にさせて頂きました
https://qiita.com/kanemu/items/679c4e14aee15441e33f
UIの学習ツール「Cocoda!」をやってみた


#アプリUIの学習ツール「Cocoda!」

アプリUIを実際に手を動かしながら身につけられる無料学習ツール「Cocoda!」をやってみました。

UIデザインやXdは前から触っていましたが、もっと幅を広げたいな〜と思っていたらちょうど良いのがあるじゃないですか！



**Cocoda!サイト**
https://cocoda-design.com/top
<img width="1213" alt="スクリーンショット 2019-03-28 15.58.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/252667/4767de07-c104-08df-5dd3-1ec5c30052f8.png">


#実際に作ってみた
- チュートリアル
- UIを完成させよう
- ECサイトの商品ページをデザインしよう
- 名刺アプリの「ホーム画面」を改善しよう
- 名刺アプリの「名刺詳細画面」を改善しよう
- 名刺アプリの「名刺詳細編集画面」を改善しよう

今日始めたばかりなので、今のところ上の5項目しかできてませんが。。。

##チュートリアル
Xdをダウンロードからはじまります。
↓
Cocoda!のチュートリアル
↓
Xdのチュートリアル

という感じの流れでした。

##UIを完成させよう
Instagramのホーム画面のような見た目を説明を見ながら実際に自分で作ってみる。という感じです。

<img src="https://qiita-image-store.s3.amazonaws.com/0/252667/9495ce79-7304-02d0-1692-c521ad65b15a.png" width="60%">


##ECサイトの商品ページをデザインしよう
ここからはデザインから考えます。
いくつか架空の依頼主から要求があり、それに合わせてUIデザインをしていくような流れです。

<img src="https://qiita-image-store.s3.amazonaws.com/0/252667/79d2bdcd-062a-b756-b053-35ddc405b3a7.png" width="60%">

**ポイント**

- カラー表示を、ベースカラーと柄カラーで表示させた。
- お気に入り機能
- カートボタン

**反省点**

- ボタンがイマイチ（もう少し大きくてもいいかな）
- 詳細内容をもう少し左に寄せてもよかったな。

##名刺アプリの「ホーム画面」を改善しよう
これもECページと同じ感じです。

<img src="https://qiita-image-store.s3.amazonaws.com/0/252667/92f2dfd5-7075-cf60-c639-3ad5eb2f7426.png" width="60%">

**ポイント**

- カメラで名刺を読み込む機能
- +ボタンで新規手動登録

**反省点**

- ありきたりなデザインになってしまった


##名刺アプリの「名刺詳細画面」を改善しよう
「ホーム画面」の続きになります。

<img src="https://qiita-image-store.s3.amazonaws.com/0/252667/2af6ba09-dc2e-6701-f3d4-2c052b2ae91b.png" width="60%">

**ポイント**

- 連絡先のアイコンを押すとメール画面やMAP画面が表示されるイメージ
- ヘッダー右のアイコンで編集画面へ
- ページしたの「削除」ボタンで情報の消去

**反省点**

- ちょっと見づらい？？
- 名前にふりがな付けれたほうが良かった

##名刺アプリの「名刺詳細編集画面」を改善しよう
これまた続きです。

<img src="https://qiita-image-store.s3.amazonaws.com/0/252667/d19e9614-6095-4edc-69fe-9e9a71275b7b.png" width="60%">

**ポイント**

- 名刺画像も再アップロードできる機能

**反省点**

- 詳細画面と同じくふりがな入れる欄があってもよかった


##良かった点
- 実案件のようなリアルな課題形式で、ワクワクする
- Xdを使うので、使い方も覚えられる
- すでに同じ課題をやった他ユーザのUIデザインが見れるので参考になる
- いいね！機能やコメント機能もあるので、モチベも上がる
- 「今日のお題」で日替わりで課題があるので飽きなさそう


２、３時間程度でここまで出来たので、１日１課題やるのも良いかもしれませんね。


また新しい課題やって溜まったらアウトプットしようと思います。
ありがとうございました。
JavaからJavaソースをevalする

ここ最近、業務でJavaのソースコードを解析するJavaアプリケーションを開発していますが、解析対象のソースコードの一部をevalしたくなるケースがありました。
そこでJavaのソースコードをevalし、結果を得る方法を軽く調査しました。

実験に使用したソースコードは [tanzaku/eval\-java\-code](https://github.com/tanzaku/eval-java-code) を参照ください。
masterにはJDK10のテストコードが入っており、eval_jdk8ブランチにはJDK8でのテストコードが入っています。

# Java Compiler API を用いる方法
下記のサイト通りの方法でClassのインスタンスが取れるので、リフレクションでメソッド実行すれば評価することができます。
[Javaコンパイラークラスメモ\(Hishidama's JavaCompiler Memo\)](http://www.ne.jp/asahi/hishidama/home/tech/java/JavaCompiler.html)

細かいカスタマイズをしない場合は、以下のようなライブラリを使用するのがお手軽かもしれません。
[OpenHFT/Java\-Runtime\-Compiler: Java Runtime Compiler](https://github.com/OpenHFT/Java-Runtime-Compiler)

# Groovyスクリプトとして評価する方法
以下のように`ScriptEngine#eval`を呼び出すだけで評価することができます。(`groovy-all`をクラスパスに追加する必要があります)

```java
package experiments.eval.evaluator;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class GroovyEvaluator {
	private static ScriptEngine scriptEngine = new ScriptEngineManager().getEngineByName("groovy");

	public String eval(final String sourceCode) throws ScriptException {
		return scriptEngine.eval(sourceCode).toString();
	}
}
```

ただし、JavaのソースコードがそのままvalidなGroovyスクリプトではない場合があるので注意が必要です。例えば`new String[]{"A"}`のような式はgroovyではinvalidで`["A"] as String[]`のようにする必要があります。

※ Javaスタイルの配列初期化はGroovy 3.0で対応されているようです。alpha版ですがgroovy-all 3.0.0-alpha-4ではそのまま評価できるかもしれません。
[The Apache Groovy programming language \- Groovy 3\.0 release notes](http://groovy-lang.org/releasenotes/groovy-3.0.html)

# JShellにより評価する方法
Java9で追加されたJShell APIを用いてevalすることができます。
[JShell \(Java SE 9 & JDK 9 \)](https://docs.oracle.com/javase/jp/9/docs/api/jdk/jshell/JShell.html)

```java
package experiments.eval.evaluator;

import java.util.Arrays;
import java.util.stream.Stream;

import jdk.jshell.JShell;
import jdk.jshell.SnippetEvent;

public class JShellEvaluator {
	private Stream<String> splitStatements(final String sourceCode) {
		return Arrays.stream(sourceCode.split(";")).map(stmt -> stmt + ";");
	}
	
	public String eval(final String sourceCode) {
		try (final JShell jshell = JShell.create()) {
			// 複数のstatementを一度に評価できないようだったので、分割して評価する
			return splitStatements(sourceCode)
						.flatMap(stmt -> jshell.eval(stmt).stream())
						.reduce((a,b)->b)
						.map(SnippetEvent::value)
						.orElse(null);
		}
	}
}
```

# 処理時間の比較
各手法で評価した際の処理時間を計測しました。小さい処理を100回evalするのにかかる時間を測定しています。キャッシュされないよう、100回の処理は微妙に異なるものにしています。詳細はソースコードをご参照ください。

|手法|JDK ver|処理時間 [sec]|
|----|----|------|
|Java Compiler API|Oracle JDK 8|14.732|
|Java Compiler API|Oracle JDK 10|42.743|
|groovy|Oracle JDK 8|3.578|
|groovy|Oracle JDK 10|4.914|
|JShell API|Oracle JDK 10|147.294|

# 結論
ソースコードが簡潔で、かつ速度的にも特に見劣りしないようなので、groovyで評価するのがよさそうです。ただし、いずれにしても非常に重い処理であることは間違いないため多用するのは厳しそうです。
コンパイラのバージョンが変われば当然パフォーマンスが変わってくるので、バージョンアップの際には注意が必要ですね。
Salesforfce パートナーユーザーに対して活動を公開する設定

Salesforce で初めてCommunityCloud（PartnerCommunity）を触って色々四苦八苦した中で、特にこれか！という設定だったので備忘録として記載します。

## 前提
### CommunityCloudでデータを共有する設定

組織の共有設定 > デフォルトの外部アクセス権　を非公開
機能設定 > コミュニティ > コミュニティ設定 > 共有セットで設定
　　プロファイル
　　アクセス権を許可　設定
これで各オブジェクトをどう共有するかの設定が出来る。
ここでオブジェクトの共有範囲を決めているので、てっきり活動も親オブジェクトの権限と同じ範囲で共有されるのかと思ったら、このままでは、活動はCommunityユーザーに共有されない。

## 活動の共有方法

行動の項目で制御する。
具体的には、行動の「公開」項目にチェック入れると、PartnerCommunityでも表示された。

てっきり共有設定や、コミュニティ設定周りで制御するものばかりと思っていたら違った。

ヒントになった記事
[パートナーユーザに対してレポートで ToDo が表示されますが、それをクリックすると「アクセス権がありません」エラーが発生します](https://help.salesforce.com/articleView?id=000230778&language=ja&type=1)
WindowsのチーミングインターフェイスのMACアドレスを固定する（1行パワーシェル）

再起動するたびにMACアドレスが変わってもらっては困る！という時は固定してしまいましょう。
コマンドを打った時点でのMACアドレスに固定してしまう1行ループのパワーシェルです。

頭の部分で使うコマンドレットは、
Get-NetLbfoTeamNic　VLANインターフェイスも含む
Get-NetLbfoTeam　VLANインターフェイスは含まない
です。

以下のどっちでもOKです。


``(Get-NetLbfoTeamNic).Name | ForEach-Object -Process{Set-NetAdapterAdvancedProperty -Name $_ -RegistryKeyword NetworkAddress -RegistryValue (Get-NetAdapter -Name $_).MacAddress.replace("-","")}``

``Get-NetLbfoTeamNic | ForEach-Object -Process{$_ | Set-NetAdapterAdvancedProperty -RegistryKeyword NetworkAddress -RegistryValue ($_ | Get-NetAdapter).MacAddress.replace("-","")}``

Get-NetLbfoTeamNicでチーミング一覧を取り出して、ForEach-Objectに渡してループさせて、Set-NetAdapterAdvancedPropertyでNetworkAddressに対してGet-NetAdapterの結果からマックアドレスから-（ダッシュかハイフンか）を取り除いた値を入れてます。
自分で書いていて意味が分かりません。コードを見たほうが早いですね。

設定後の確認コマンド
`` Get-NetLbfoTeamNic | Get-NetAdapterAdvancedProperty -RegistryKeyword NetworkAddress | select Name,DisplayName,DisplayValue``

出力結果のサンプルはこんな感じ。設定する前はDisplayValueが空欄のはずです。

```
PS C:\Users\Administrator> Get-NetLbfoTeamNic | Get-NetAdapterAdvancedProperty -RegistryKeyword NetworkAddress | select Name,DisplayName,DisplayValue

Name              DisplayName  DisplayValue
----              -----------  ------------
VLAN1             MAC アドレス 000E1ED3DA90
VLAN2             MAC アドレス 000E1ED3DA90
TEAM2             MAC アドレス 000E1ED3DA90
VLAN3             MAC アドレス 000E1ED3DA90
TEAM1             MAC アドレス 901B0E61EEC1
```
数値型項目の桁数

小さめのID項目の型どうしようかな？
そもそもIntegerの桁数の最大っていくつだっけな？

Integer 10桁
→じゃあ9桁以下の項目はIntegerかな。

Short 5桁
→じゃあ4桁以下の項目はshortかな。

byte 3桁
→じゃあ2桁以下の項目はbyteかな。

て考えてたら、

現在主流の32bit/64bitコンピューターではJavaに限らずIntegerが一番性能よいらしい。

確かに昔そんなこと習ったなって思い出した。

なので、Integerの上限を超えない数値はIntegerで定義かな。


参考:
[Javaの整数型(long,int,short,byte)について](https://morizyun.github.io/java/type-integer-long-short.html)
[intはshortやbyteより高速に処理できる](https://ja.stackoverflow.com/questions/39344/intはshortやbyteより高速に処理できる)
ヘッドレス環境でSeleniumを動かす

#はじめに

WEBシステムを複数人で開発している際、共通ロジックに手を入れると、
**「自分で作っている箇所は動いているが、他者が作っている箇所が動かなくなった！！」**
ということが発生するケースがあります。

これは修正する関数の影響範囲を把握しきれないまま手を入れてしまった際に発生しますが、
もしこんな状況でもテストが自動的に行われていれば、早期発見に繋げることが出来ます。

今回はヘッドレス環境でXvfbを使ってSeleniumを動作させるテストを実施してみます。
（最近では各ブラウザがヘッドレス環境で動くモードが追加されているので、
少し古いやり方になるのかもしれません...。）

#環境

[AWS EC2]
・CentOS 7
・Google Chrome 73.0.3683.86
・ChromeDriver 73.0.3683.68
・Python 2.7.14
・Selenium

# Xvfbとは
・物理的なディスプレイがなくても仮想ディスプレイを作ってくれる（ヘッドレス環境）

# Seleniumとは
・WEBアプリケーションの自動テストツール
・ブラウザに表示される要素を取得・操作することが出来る


# ソフトウェアのインストール

## Xvfbインストール

```
# sudo yum install xorg-x11-server-Xvfb
```

## Chromeインストール
下記の記事を参考にインストールします。
[CentOS7にChromeをインストール](https://qiita.com/shadowhat/items/af6b973df43d75abfe8e)

## ブラウザが文字化けしないように日本語フォントを入れます
```
yum install ipa-pgothic-fonts.noarch
```

## ChromeDriverインストール
Chromeのバージョンに適したDriverをダウンロードして入れてください。

```
# sudo wget https://chromedriver.storage.googleapis.com/73.0.3683.68/chromedriver_linux64.zip
# sudo unzip chromedriver_linux64.zip
# sudo mv chromedriver /usr/local/bin
# sudo chmod 755 /usr/local/bin/chromedriver
```

## python pipインストール
今回、Python 2.7.14が入っていたためそのまま利用します。
（Pythonが入っていない場合はインストールしてください）

```
# sudo yum -y install python-pip
```

##Seleniumインストール

```
# sudo pip install selenium
```

# 仮想ディスプレイの起動

## 仮想ディスプレイを起動する番号とサイズを指定する

```
# export DISPLAY=:1
# sudo Xvfb :1 -screen 0 1280x1024x24 &
```

※ 停止

```
# sudo killall Xvfb
```

# Seleniumで画面キャプチャーを取得してみる

## Pythonサンプルコード
```python
from selenium import webdriver
import os, time, sys

args = sys.argv

driver = webdriver.Chrome()
driver.get(args[1])
driver.set_window_size(1280, 1024)
time.sleep(5)
driver.save_screenshot(args[2])
driver.quit()
```

## 実行
弊社HPを取得してみる

```
python capture.py https://www.valuesccg.com/ valuesccg.png
```

## 結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/270976/48e2f580-594e-edaa-0611-c10e4fa166e2.png)


#おわりに

一つのシステムを作りあげるためには、プロジェクトの管理から設計・開発・テストと
多岐に渡るため、人でなくとも出来る箇所はシステムに委譲することで、
人的リソースを減らすだけでなく、品質を高めることにつながると思います。
CI（継続的インテグレーション）の第一歩として試してみるのも良いかも知れませんね。

と言いつつ、それを設定するのもまた人なのですけど...。
Professional Ruby on Rails Developer with Rails 5　〜Udemy感想その２〜

# はじめに
プログラミング初心者が約1年Udemyで勉強して
そこそこ修了した講座が増えてきたので感想を書いてみようの２つ目です

１つ目は[こちら](https://qiita.com/Shinichiro_Matsuzawa/items/1d886c4af99421b17e83)に書きました

# 使った講座
[Professional Ruby on Rails Developer with Rails 5](https://www.udemy.com/pro-ruby-on-rails-rails5/)

Ruby on Rails５を使ってシェフ向けのレシピ共有サイトを作ります
ユーザーとしてのログイン、レシピの登録・変更・削除、素材(人参、玉ねぎ、豚肉とか)を使ってのレシピ検索、シェフ同士のチャット機能などを実装します

# その時の自分
[前回の記事](https://qiita.com/Shinichiro_Matsuzawa/items/1d886c4af99421b17e83)で書いた[8 Beautiful Ruby on Rails Apps in 30 Days & TDD - Immersive](https://www.udemy.com/8-beautiful-ruby-on-rails-apps-in-30-days/)が終わった後に受講
コードを書き始めて1年くらい、Rails Tutorialは全部やり終わってました

# 良かった点
 - **コードが文字起こししてある**

僕が教材を用いた勉強中に頻繁に陥るのが

**写経(コードの書き写し)ミスによるエラー**

特に動画を見ながら勉強するUdemyだとよく打ち間違えてエラーを出してました
もちろん動画の方はそんなエラー出てないのでエラーメッセージをググったり動画を見直しながら長い時だと数時間格闘してました(それもまた勉強にはなった気はするけど)

この講座は１つ１つのレクチャーごとにText lectureがついていて、
そのレクチャーで打ち込んだコード、コマンドが**全て文字起こし**されています

なので動画では出てないエラーが出ても
Text lectureと比較してどこが間違ってるか調べることもできるし、
最悪コピペすれば動画と同じものができます笑

これは僕の考えですが、初心者のうちにある程度調べても解決できないエラーにぶつかった時は無視できるなら無視して勉強を続けた方がいいと思います
まずは最後までやりきったぜ！っていう達成感が大事ですよね:star:

勉強を進めていく中で
「そういえばあの時のエラーってこれが原因だったのか？？」
っていう気づきも何回かありました

重大なエラーならどうせいつかまた出るだろうし、
次出た時に今より成長しているはずの自分に任せましょう笑

 - **Gemがガンガン出てくる**

そのころの僕多分Gemの存在知らなかったと思うんですよね。。
(多分、、嘘だったらごめんなさい)

Rails Tutorialをやってた時はユーザーのログイン機能実装するのに
えらい時間かかったような気がしたんですがこの講座ではどんどんGemを使っていきます
(てか多分普通そうなんだろう)

この講座が終わってからは実装したい機能があった時に
とりあえず優秀な方が使いやすく提供してくれてるんじゃないかと考えるようになりました笑

# 気になった点
本当にないですね、強いていうなら英語字幕がない点かな
でも前も書いたけどコード書いてるの見ながらなので
やりたいことと言いたいことは大体わかります

僕もあんまり英語得意じゃないけど特に困った覚えはないので大丈夫でしょう

# まとめ
かなりのボリュームのものが初心者にも優しくしてある講座だとおもいます
サービス作るぞ！って前に一回やっといて損はないんじゃないでしょうか
大量アクセスに備える！！AWS上限緩和の注意点

こんにちは。streampackのtsuchiです。

最近、業務で大量アクセスが想定される動画案件を経験したので、その際のノウハウを共有します。
AWSの構築/運用経験がある方にはお馴染みの「上限緩和申請」についての話です。

特に、動画配信環境において、注意が必要なポイントをご紹介します。

※本内容は、2019年3月29日時点のものとなります。

# はじめに
AWSリソースにはデフォルトの制限があり、大きく分けて**リソース数の制限**と**性能の制限**があります。

それらの制限を解放するために「上限緩和」が必要になります。
ここでは簡単に、**「量」の上限緩和** ・**「質」の上限緩和**と表現します。

| 種類 | 説明 |
|-----------|---------|
| 「量」の上限緩和　| リソース不足を解消するために行う |
| 「質」の上限緩和　| 高い性能の要件を満たすために行う |


#CloudFront

CDNとして使われるCloudFrontの上限をみてみましょう。
→[**Amazon CloudFront の制限**](https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws_service_limits.html#limits_cloudfront)

| リソース       | デフォルトの制限 |
|:-----------------|-------------------------:|
| ディストリビューションごとのデータ転送レート| 40 Gbps |
| 1 秒あたり、ディストリビューションあたりのリクエスト| 100,000 |
（※「一般的な制限事項」から一部を抜粋）

これらを超える性能を求める際には、上限緩和が必要になります。
AWS マネジメントコンソールの**「サポート」 - 「サポートセンター」 - 「Create case」**から申請しましょう。

-

その際に申請する**上限値の計算方法**が複雑で面倒なのです……

こちらのドキュメントに計算式が記載されていますので、参考にしてみてください。
→[**CloudFront上限緩和申請　計算方法&申請手順**](
https://www.slideshare.net/AmazonWebServicesJapan/cloud-front-limit-increase)

■計算式
`①動画の平均ビットレート(byte)×最大同時視聴数(人)＝データ転送レート(bps)`
`②(1÷1セグメントあたりの長さ(秒)+1÷Cache TTL(秒))×最大同時視聴数(人)＝リクエスト数/秒`

#ELB

ELBで緩和できる設定値は、「数の上限緩和」のみとなっています。
→[**Elastic Load Balancing の制限**](https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws_service_limits.html#limits_elastic_load_balancer)

ただ、ELBには「**暖機申請**」というものが存在します。
あらかじめ急激な負荷が予想される場合には、この暖機申請が必要です。

検索するといろいろと情報は見つかりますので、申請方法や詳細はここでは割愛します。

#EC2

AWSの上限緩和といえば「VPCの数」「EIPの数」がお馴染みです。
ですが、EC2関連で意外と忘れがちなのが「**インスタンスタイプの数**」。

あまり知られていないかもしれませんが、大きなインスタンスタイプだと
デフォルトで使用できる数が制限されていることがあります。

現状の上限値は、AWSマネジメントコンソールの**「EC2ダッシュボード」-「制限」**から確認できます。
事前に使用予定のインスタンスタイプの数に余裕があるか、確認しておきましょう。
<img width="928" alt="ScreenShot 2019-03-28 12.42.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/277934/c46d9c39-e4f5-0644-ccb3-bdd46b950626.png">

#Media Services

Media系のAWSマネージドサービスとはいえ、これにも上限は存在します。
どれくらいのリソース数・性能が必要なのか、事前に検証や確認の上、緩和申請をお忘れなく。

たとえば、MediaLive・MediaPackageは「**チャンネル最大数**」などの「量の上限緩和」、
MediaStoreは「**1秒あたりのトランザクション最大件数**」などの「質の上限緩和」を実施することができます。

- [**AWS Elemental MediaLive の制限**](https://docs.aws.amazon.com/ja_jp/medialive/latest/ug/limits.html)
- [**AWS Elemental MediaPackage における制限**](https://docs.aws.amazon.com/ja_jp/mediapackage/latest/ug/limits.html)
- [**AWS Elemental MediaStore の制限**](https://docs.aws.amazon.com/ja_jp/mediastore/latest/ug/limits.html)

# おわりに

上限緩和申請をするには、AWSから**上限値の妥当性**が求められることがあります。
その際は申請後にAWSから追加情報を要求されるため、2,3日では申請が通らないこともあります。

スケジュールに余裕を持って申請を行い、安心して本番を迎えられるよう準備しましょう。

# 参考
[**AWS サービスの制限**](https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws_service_limits.html)
laravel mysql で年齢を取得

vue.js側で年齢を取得するか、phpでゴリゴリ取得するか。。。
いや、待てよ？
mysqlで取れりゃ一覧ええやん。

```

//フォローしているユーザー
        //ユーザー情報があるもののみ
        //写真データと、ユーザーデータを両方取得
        $res = Follow::has('user')
            ->with(
                [
                    'user.photos',
                    'user.profiles' => function($q){
                        $q->select('id','birthday');
                        $q->selectRaw('TIMESTAMPDIFF(YEAR, `birthday`, CURDATE()) AS age');//ageフィールドとして年齢を取得
                    },
                    'user' => function($q){}
                 ]
            )
            ->where('foreign_key',$request->id)
            ->get();

```

これな。

```

$q->selectRaw('TIMESTAMPDIFF(YEAR, `birthday`, CURDATE()) AS age');//ageフィールドとして年齢を取得

```

これで age フィールドとして年齢を取得できる。
Chisel徒然メモ

Chiselは UCバークレー校で開発されたHDL(ハードウェア記述言語）です。ScalaベースのDSL（ドメイン固有言語）になります。
気がついたことやハマったことを徒然にメモるページです。もっと良い方法があれば教えてください。

## Chisel早見表

https://chisel.eecs.berkeley.edu/2.2.0/chisel-cheatsheet.pdf
https://chisel.eecs.berkeley.edu/doc/chisel-testercheatsheet.pdf

## Chiselでコードをを書く

### var と val

基本的にはChiselでは val (=value) をつかう。 でも var (=variable) も使えたりする（エラーは出ない）。 Chiselのコードはその後同期回路になるので変数であるvarだと色々おかしなことになりやすい。Testのコードでは var を使うのでぼーっとしてると混じりやすい。

- Ref
    - Chisel Style Guide
        - https://github.com/ccelio/chisel-style-guide#val-versus-var
    - Scalaのvar, valの違い
        - https://qiita.com/kashiraWork/items/1455256746d84e52f9fd

### つながってない信号は消える

ModuleのIOポートで外部とつながってない入力があると、その入力は（おそらく）ゼロとして扱われる。またその入力に関する内部信号はFIRRTLからごっそり消される。モジュールも消える。TOPで繋がっている信号は消されないが、内部のモジュール間などで未配線の信号がある場合注意が必要。

## Chiselでテストベンチを書く

- Using the PeekPokeTester
    - https://github.com/freechipsproject/chisel-testers/wiki/Using-the-PeekPokeTester
- Chisel tutorial
    - https://github.com/ucb-bar/chisel-tutorial
        - https://github.com/ucb-bar/chisel-tutorial/blob/release/src/test/scala/utils/TutorialRunner.scala
        - https://github.com/ucb-bar/chisel-tutorial/blob/release/src/test/scala/examples/Launcher.scala


PeekPokeTesterの使い方は、Chisel tutorial のサンプルコードがわかりやすい。TutorialRunnerが実行部分。それぞれのディレクトリにある Launcher で実行するテストを選択する。 Launcherへの入力は run-examples.sh の例のように SBT実行の際の ARGS で何を実行するか指定する。
このあたりはBashでもMakefileでやってもOK。

### クロック信号

複数のクロックドメインを扱う場合に、信号をクロックに変換したり、その逆をしたくなる。

クロック信号の宣言

    val my_clock   = Wire(Clock())

普通の信号をクロックに変換

    val my_clock = hoge.asClock()

クロック信号を普通の信号に変換

    val hoge = my_clock.asUInt

### テストベンチで内部信号の波形を見たい

- 実行にverilatorを使います
    - オプション --backend-name verilator をつければOK
- VCDを吐くので、gtkwave なのを使って波形を表示します。 
- DUT部分はFIRからVerilogが生成される、Testerの方はC++のコード？ 動作の詳細がちょっと良くわからないがとりあえず動く。
    - Chiselのprintfは$fwriteに変換される
    - verilatorが古いと$fwriteがエラーになる
    - Ubuntuのverilatorが少し古い
        - 最新版を使います。
        - SiFiveがDPKGを作ってくれているのでそれを使ってもOK
            - https://github.com/sifive/verilator/releases
            - ただし、Install先が /user/local になるので注意
            - Chiselのコードにprintfがあっても実行には問題ないが、実行してもコンソールには出ない。うーん？


### テスベンチをVerilogバックエンドで実行した時と振る舞いが異なる(1)


    val delay1   = Reg(init = UInt(0, 1))
    delay1 := io.in_data 

だと、Verilogでの実行は問題ないが、Chisel(FIR)の実行ではdelay1がラッチにならない？

    val delay1   = Reg(init = UInt(0, 1))
    when (!reset) {
        delay1 := io.in_data 
    }

こう書けば問題ない。


### テスベンチをVerilogバックエンドで実行した時と振る舞いが異なる(2)

クロックゲートを入れでwithClock でクロックドメインを分離すると、Verilogバックエンドでは動くのに、Chisel/FIRRTLでは動かないことがある。Stackoverflowにも同じ事が報告されていたのでそういうものとして注意するのが良さそう。

- Chisel — clock gating
    - https://stackoverflow.com/questions/47318637/chisel-clock-gating

追記：DUT側でSimulationのClockの2倍のClockをカンター等で生成して、その生成をEnable信号で制御する分には問題ない。Test側のPeek,Pokeも2倍Clockに合わせて動かせばOK.


### 非同期リセット

Chisel3でサポートの予定

https://github.com/freechipsproject/chisel3/pull/1011




EOF
IDaaSの比較 (Cognito, Firebase Authentication, Auth0) 

# 概要

外部サイトとの連携認証を簡単につけたいが3つあってよくわからないので比較する。Firebaseが良さそう。

# 要件

- Facebook, Twitter両方と一つのユーザを紐づけたい
- Facebook, Twitterのアクセストークンもほしい。
- 連携認証なしのメールアドレスでもログインしたい
- 特定の外部サイトだけの連携解除もしたい。
- 無料 （できれば）
- ログイン画面は用意してほしい (できれば)
- SPA (Angular)
- 現在はAWSをメインで使用している

# 調査結果

(欠点がなければそれ使うだけなので長所とか書く必要ないよね)

## Cognito User Pools

(Cognito ID Poolは別物なので注意。そちらは連携認証に対してIAMを振れるものらしい？)

- なんだか設定をごちゃごちゃ聞かれてめんどくさい。
- Twitterがない。
- 複数のSNSに紐付ける際はそれなりに実装が必要そう。
- jsのライブラリがよくわからない。Amplifyって概念もよくわからない。なんでライブラリなのにリージョンがあるのか。

## Firebase Authentication

- ログイン画面がない
- FirebaseがAuth以外もできる多機能なものなのでライブラリのインポートがごちゃる

## Auth0

- 複数サイトを一人のユーザに連携する場合は有料

## (おまけ) hello.js

- 今まで使っていたが、一般ユーザのお手製感があるのでやめる。
- ユーザーテーブルはない。外部サイトの連携認証のみ。

# まとめ

|項目|Cognito User Pools|Firebase Authentication|Auth0|hello.js|
|---|---|---|---|---|
|料金|○|○|×|○|
|必要な設定・知識の量|×|△|○|○|
|ログイン画面|○|×|○|×|
|単一ユーザ複数認証|×|○|○|×|
|日本語ドキュメント/情報|△|○|×|×|

費用が何でも良ければAuth0が便利そうだが、今回はFirebaseで。
マイクロサービス化の第１歩 PHP編

### マイクロサービス化の一番美味しい所

マイクロサービス化、メリット、デメリット色々言われていますが、
マイクロサービス化(とセットで実施される継続的デリバリー)の一番美味しいところは

* 切り戻し可能(Blue-Green Deployment)

だと思います。

### 切り戻し例

* webサイトのlogin機能になんとかSNS連携ログイン機能を入れた
* 本番環境にアップした
* 本番環境では動かなかった(外部連携は本番サーバでしか確認出来ない、というのはありがち)
* あわてて元に戻す

この時、

* もう一度古いソースコードを配布し直す(docker再配布含む)

というのは、さえないやり方です。

| 表側 | 裏側 |
| ---- | ---- |
| ロードバランサー(nginx,AWS LB等) | apache (brue) |
| | apache (green) |

のような仕組みで、

* 本番環境は今apache(blue)で動いている
* 本番環境apache(green)にアップした
* 本番環境apacheをblue->greenに切り替える
* 本番環境apache(green)では動かなかった
* 本番環境apacheをgreen->blueに切り戻す

による秒単位の切り戻しを実現しましょう。

### 第２歩目以降

これができれば、第２歩目以降で

| 表側 | 裏側 |
| ---- | ---- |
| ロードバランサー(nginx,AWS LB等) | apache (brue) /login |
| | apache (brue) /login 以外 |
| | apache (brue) 画像ファイル |
| | apache (green) /login |
| | apache (green) /login 以外 |
| | apache (green) 画像ファイル |

だったり

| 表側 | 裏側 |
| ---- | ---- |
| ロードバランサー(nginx,AWS LB等) | apache (brue) php 7.0 |
| | apache (green) php 7.3 |

だったり

| 表側 | 裏側 |
| ---- | ---- |
| ロードバランサー(nginx,AWS LB等) | apache (brue) レガシーPHP |
| | apache (green) Laravel 5.1 |
| | apache (yellow) Laravel 5.5 |
| | apache (orange) golang 1.12 |

といった事が可能になります。

言語(php,ruby,golang,...)がどうの、
フレームワーク(Laravel,Symfony,Slim,...)がどうの、
といった話は、だいぶん先の話です。

レガシーPHPでもマイクロサービス化進められますよ。
Gitでリモートマージ時にコンフリクトが起きた場合の解決法

Gitでリモートマージ時にコンフリクトが起きた際の解決法の覚書きです。
Eclipseを使用して解決します。

##使用環境
Eclipse

##手順
1. 対象のプロジェクトをmasterブランチに切り替える<br>
【方法】対象のプロジェクトを右クリック > チーム > 切り替え > masterを選択
2. ワークスペースを同期化する<br>
【方法】対象のプロジェクトを右クリック > チーム > ワークスペース同期化
3. 対象のプロジェクトにて、masterブランチとマージしたい開発ブランチを比較する<br>
【方法】対象のプロジェクトを右クリック > 比較 > マージまたはタグ参照 > リモートトラッキング配下の開発ブランチを選択 > 比較ボタン
4. 差分（開発ブランチでの変更）を反映させる<br>
【方法】チーム同期化タブ（選択されていることを確認） > 対象ファイルをダブルクリック > 差分（開発ブランチでの変更）を開発ブランチからmasterブランチへコピー
5. 対象ファイルをステージングへaddする<br>
【方法】対象のファイルを右クリック > マージ済みとマーク
6. masterブランチをコミットする<br>
【方法】Java EEタブに切り替え > パッケージエクスプローラにて対象のプロジェクトを右クリック > チーム > コミット
7. masterブランチをプッシュする（リモートに変更を反映）<br>
8. 【方法】Java EEタブに切り替え > パッケージエクスプローラにて対象のプロジェクトを右クリック > チーム > プッシュ
9. 再度リモートにてマージ作業を実施

##ポイント
再度コンフリクトが起きないよう、リモートブランチとのワークスペース同期化を行っておくこと
VPC外にあるRDS for MySQLインスタンスをVPCに移行する

# これは何？

VPC外で立てられた古いRDS for MySQL のインスタンスが稼働中で、VPC上に移行しないといけない要件が出てきた。
**可能な限り少ないダウンタイム**で移行したかったが、苦戦したので記事にまとめたい。

# RDSインスタンスのスペック

```
インスタンスタイプ: db.m3.medium
マルチ AZ: Yes
エンジンバージョン: 5.5.53
```

# RDS for MySQL はSSL経由のレプリケーションをサポートしていない

まず前提として、RDS for MySQLではSuper権限を持ったユーザを作成できず、そういう操作が必要な場合はストアドプロシージャ経由で行うらしい。
リードレプリカの設定は[mysql.rds_set_external_master](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/mysql_rds_set_external_master.html)でできる。

ただしこれは**MySQL DB インスタンスではSSLがサポートされない**旨が書いてある。

※なぜかAuroraでは実装されている。

平文での通信は非常に困るので、レプリケーション案は見送らざるを得なかった。

# シングルAZに変更してからVPCに移行させる

↓の記事を読むと、「VPC 外のマルチ AZ DB インスタンスの VPC への移行は現在サポートされていません」とある。

[Amazon Virtual Private Cloud (VPC) および Amazon RDS](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_VPC.html#USER_VPC.VPC2VPC)

したがって、一旦シングルAZに切り替えれば移行ができる。
データベースの「変更」を選ぶと、サブネットグループが選択できるようになっている。

![スクリーンショット 2019-03-28 14.47.44.png](https://qiita-image-store.s3.amazonaws.com/0/97287/af95f0bf-c0bc-dd1c-572c-4f7744c1915e.png)

# mysqldumpをとってVPC上に立てた新しいインスタンスにインポートする

説明不要な気がする。

# インスタンスのスナップショットから復元する

![スクリーンショット 2019-03-28 15.36.54.png](https://qiita-image-store.s3.amazonaws.com/0/97287/04e36a0b-e0ec-eb41-4ae2-990b7724bd12.png)

コンソールだけで完結し、工程もスナップショットの取得と復元だけなので、最もお手軽な方法に思える。
ただしスナップショットから復元したEBSはI/Oのレイテンシが著しく増えるらしい。

[Amazon EBS ボリュームの初期化](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ebs-initialize.html)

# どれが良さそうなのか
今回の要件は**可能な限り少ないダウンタイム**なので、mysqldumpからのリストアが良さそう。
ダンプデータが1.6GBくらいなので、そんなに時間がかからなかった(約15分)。

実データのサイズが大量になってくるとシングルAZの変更を挟むやり方の方が良いように思う。

# 備考
上記の3つの方法はAWSビジネスサポートからの回答なので信憑性はあります。
(完全に個人の見解というわけでは)ないです。

まるごとの引用でないのはAWSからやめてほしい旨の連絡があったのと、セキュリティ的に公開したくない情報を含むためです。
"ゼロから作るDeepLearning"を1時間でナナメ読みしてみる

# この記事は
"ゼロから作る Deep Learning (オライリー・ジャパン)"を１時間でラフに読み込みます。

# まえがき
- 誰のための本か？誰のための本ではないか？
  - Python実装を記載する代わりに、TFなどフレームワークは言及しない
  - 最新情報は記載しない

=> 入門編であること + 続きはWEBで、でOK

# Python入門
- 基本的なPythonスクリプトの使い方
- NumPy, Matplotlib

=> さわれば身につくOK

# パーセプトロン
- 論理演算の実装
- 重みとバイアス
- 多層パーセプトロン

=> 神経模した


# ニューラルネットワーク
- パーセプトロンへ中間層(hidden layer)を追加した
- 活性化関数(activation function)
    - sigmoid, step, ReLU

=> 活性化関数がしきい値を持っているのか

- 出力層
    - 回帰問題 : 恒等関数 (データ予測に用いる)
    - 分類問題 : softmax

- MNISTの話
- バッチ処理で高速化

# ニューラルネットワークの学習
- 訓練データとテストデータ
- 損失関数 (loss function)
    - 二乗和誤差 (mean squared error)
    - 交差エントロピー誤差 (cross entropy error)
- 学習とは
    - 損失関数が小さくなるように重みパラメータを更新すること

- ミニバッチ学習
- 勾配 (gradient)
    - 偏微分
- 学習アルゴリズムの実装
    - ミニバッチ学習
    - 勾配の算出
    - パラメータ更新
    - くりかえす

# 誤差逆伝搬
- 重みパラメータの勾配計算を効率よく行う方法
- 計算グラフで解く
    - 中間計算を確認できる => デバッグに役立つ

# 学習に関するテクニック
- パラメータ更新
    - SGD (確率的勾配急下法:stochastic gradient descent)
    - Momentum
    - AdaGrad
    - Adam
- 重み初期値
    - Xavier, He
- Batch Normalization
- 過学習対策
    - Weight decay
    - Dropout

# CNN (Convolutional Neural Network)
- NN
    - Affine -> ReLU
- CNN
    - Conv -> ReLU -> Pooling

-  NN
    -  １次元化されるのでデータ次元が無視されてしまう
-  CNN
    -  フィルタ演算

- プーリング層の特徴
    - 最大値を取るだけなので学習パラメータなし
    - チャンネル数は変化しない
    - 微小な位置変化にロバスト

- 代表的なCNN
    - LeNet
    - AlexNet

# Deep Learning
- Deepにする利点
    - パラメータ数を少なくできる
    - 学習データを少なくできる

- DNN
    - ImageNet
    - VGG
    - GoogleNet
    - ResNet

- 学習の高速化
    - GPU
    - 分散学習
    - 演算精度、bitを減らす

- 実用例
    - 物体検出
    - セグメンテーション
    - 物体ラベリング
    - 画像生成
    - 自動運転

# 強化学習
- 行動の結果として、報酬を与えて、学習をすすめる

# いかがでしたか？
用語、世界観について、ざっと眺めることができた。Pythonコードは、最新論文を手元のフレームワークで実装＆検証するときに応用できそう。

# 次に
- 解きたい課題に対して、どういうネットワークを適用すればよいのか勘所をみにつけたい
- ネットワークの問題点と解決方法について把握したい
- 論文はどうせ英語で読むので、用語も英語で覚えておいたほうがぐぐらびりてぃ高そう
もそ、プログラミングを学ぶ【Ruby & Rails復習編】〜コントローラのエラーを解いてみよう！〜

Rubyのおさらいをしながら、エラー問題にチャレンジ中の もそ。
少しずつではありますが、今まで理解できていなかった部分がわかるようになってきました。

今日は実際のエラー画面を見ながらコードの解説をしていきます。


##謎のエラー発生！

まずは実際のエラー画面がこちら。↓

<img width="1055" alt="9ce11ce809aa03a3cc9f7298d360f985.png" src="https://qiita-image-store.s3.amazonaws.com/0/372174/bb0f169e-94b9-f647-43ff-6bab74d4518a.png">


トップ画面から詳細画面を開こうとしたところ、このようなエラーが出てしまいました。
いきなりこの画面が出てくるとなかなか面食らいますよね...
でも冷静に読み解いていけば、どんなエラーが起きているか簡単に目星をつけられます。

画面やコードを見ながら、一緒にエラーの謎を暴いていきましょう！


##エラー解決編

エラーを解決するためには、

①エラーを起こしているファイルを特定
②ファイル内の記述を確認、まちがっている場所を見つける
③正しい記述に修正する

この3ステップが必要です。

まずは①"エラーが起こっているファイルを特定"します。
なんだか探偵になった気分ですね！

先ほどのエラー画面をもう一度見てみましょう。
赤いボックス内に「NoMethodError in TweetsController#show」と書いてあります。
これを読み解くと、「TweetsControllerのshowアクションでメソッドが定義されていないエラーが起きている」という意味になります。

![無題1172.jpeg](https://qiita-image-store.s3.amazonaws.com/0/372174/61fcb6a9-2071-71c5-9a4f-c43a06065a1c.jpeg)


この**TweetsController、めっちゃ怪しいですよね。**
まずこの時点でtweets_controller.rbファイルがどうも怪しいぞ...と、探偵もそ（いま命名しました）は気づきます。

次に②"ファイル内の記述を確認、まちがっている場所を見つけ"ます。

先ほどのエラー画面では「なんやTweetsControllerのshowアクションでエラーが起きてるみたいやで」と証言しています。
なのでtweets_controller.rbファイルを開いて、showアクションに関する記述の部分を調べてみることにしました。


```rb

    def show
      @comments = @tweet.comments.includes(:user)
    end
```


うーん。

...ん？

**なんか記述少なくね？**

と気づけたそこのあなた、もう謎（エラー）を解いたも同然です。
このshowアクションでは「tweetの詳細ページとcommentsを出す」という動きを指示しています。
でもこのままの記述だと**肝心のtweetがすっぽり抜け落ちています。**

つまり正解は...

```rb
    def show
      @tweet = Tweet.find(params[:id])
      @comments = @tweet.comments.includes(:user)
   end
```

 @ tweet = Tweet.find(params[:id])という一文が失踪していたことによるエラーということが分かり、このエラーは一件落着。

ところで抜けていたコードの中身はどんな記述かというと、
tweetsテーブルの中にある@ tweetというインスタンス変数を、Tweetモデルがparams[:id]というハッシュの箱に入れてコントローラに渡しています。

paramsについては[こちら](https://qiita.com/moso/private/a80ddb8fa5c8b512399c)も参考にしてみてください。

##コントローラとモデル、アソシエーション

ここで、コントローラとモデルのおさらいをしてみましょう。

```rb
    def show
      @tweet = Tweet.find(params[:id])
      @comments = @tweet.comments.includes(:user)
   end
```
先ほどのコードを見た時、
「@ commentsの:userにはモデルを指定しなくていいの？」
という疑問があるかもしれません。

なぜモデルを指定しなくていいかというと、**TweetモデルとUserモデルはアソシエーションをしている**からなんです。
下の図を見てください。

![無題1140.jpeg](https://qiita-image-store.s3.amazonaws.com/0/372174/1d3a35f7-84bf-9842-74f6-e6af9711039d.jpeg)

ここではコントローラがTweetモデルとUserモデルそれぞれにDBの中身を渡してくれ、と指示をしています。

２つのモデルそれぞれに動いてもらってDBの中身を渡してもらおうとすると、Tweetモデルに指示を出してデータを渡してもらって、Userモデルにもデータを渡してもらって...という処理が発生します。
モデルがたくさんある場合だと、それぞれのモデルを呼び出さないといけないため処理が重くなってしまいます。

そこで**アソシエーション**をして、モデルとモデルを結びつけておきます。
そうすると、あるモデルが呼び出された時に**紐付いたほかのモデル配下のデータも引き出せる**というわけです。

今回の例だと、

```rb
 @tweet = Tweet.find(params[:id])
 @comments = @tweet.comments.includes(:user)
```
Tweetモデルが呼び出されたときに、@ commentsのuserも呼び出せるようになっていました。

ひとつのtweetに対しては**複数のコメント**がつきます。
そしてコメントには、必ず**一人のユーザー**がいます。

これを**１対多の関係**と呼びます。
この関係を定義しておくことで、一つの情報から芋づる式に情報を受け取ることができます。

--

まだぱっとコードを記述するまでには至らないものの、コードの中身が何を指しているかは何となくわかってきました。
これは私にとってかなりの大進歩です...！
この調子で勉強しつつ、プログラミングに覚醒するXデーを待つ もそであった...続く。
bridge-utils(brctl) -> iproute2(ip/bridge) コマンド対応表

## このドキュメントについて

Linuxのブリッジの操作には`brctl`が使われてきましたが(いますが)、`iproute2`がこれからは主流になるとのことなので`brctl`で使われるコマンドの対応を書いておきました。

Note: コマンド内の`<bridge>`, `<if>`は対象のブリッジ名、インターフェイス名に置き換えて下さい。

| 概要| bridge-utils(brctl)  | iproute2(ip/bridge)      |
|:-----------------|:------------------------|:------------------|
| ブリッジ追加 | `brctl addbr <bridge>` | `ip link add <bridge> type bridge` |
| ブリッジ削除 | `brctl delbr <bridge>` | `ip link del <bridge>` |
| IF追加 | `brctl addif <bridge> <if>` | `ip link set dev <if> master <bridge>`|
| IF削除 | `brctl delif <bridge> <if>` | `ip link set dev <if> nomaster` |
| 対象のブリッジのIF表示 | `brctl show <bridge>` | `ip link show master <bridge>` または `bridge link show <bridge>`|
| 全てのブリッジのIF表示 | `brctl show` | `bridge link show` |
| STP 有効 | `brctl stp <bridge> on` | `bridge link set dev <if> guard off` |
| STP 無効 | `brctl stp <bridge> on` | `bridge link set dev <if> guard on` |

Note: 
STPについては有効・無効とそのオプションguardのon/offが逆になります。


Acknowledgements:
STP有効/無効については [@orimanabu](https://twitter.com/orimanabu) さんに教えていただきました。ありがとうございます！
chromeからDuckDuckGoを消したい

## 状況
windowsにchromeをインストールしたら、デフォルトの検索エンジンがDuckDuckGoになってつらくなった。
当然、検索しても今までヒットしていた記事がヒットしなくなる。

##DuckDuckGoとは
プライバシーの保護とユーザーの情報を記録しないことを検索エンジンとしてのスタンスとしている
https://marketingnative.jp/what-is-duckduckgo/

## 解決方法
1.chromeを開く
2.右上の「:」アイコンをクリックし、「設定」を選択
3.ちょっと下にスクロールすると、「検索エンジン」の「検索エンジンの管理」というのがあるので、それをクリック
4.既定の検索エンジンというところに、「Bing」とか「Yahoo! JAPAN」や「Google」などが表示されている。そこで、「DuckDuckGo(既定)」となってしまっているので、Googleのところの「:」アイコンをクリックして、「デフォルトに設定」をクリック。

これで、新しいタブを開いても、Googleが表示されるようになりました。
AWS EC2(ubuntu)にローカルからファイルを転送する方法

仮想マシンにローカルからファイルを転送（共有）する方法

使用環境
EC2　ubuntu
Mac
pemのパス　~/.ssh/togari.pem
送りたいファイル　~/Downloads/tutorial.bna
送りたい環境　ubuntu@ec2-13-59-227-101.us-east-2.compute.amazonaws.com
送信先のファイルの場所　/home/ubuntu

```
$ scp -i pemのパス 送りたいファイル 送りたい環境:送信先のファイルの場所
```

```
$ scp -i ~/.ssh/togari.pem ~/Downloads/tutorial.bna ubuntu@ec2-13-59-227-101.us-east-2.compute.amazonaws.com:/home/ubuntu
```
VL ショートカット集

## VLとは
ビジュアルプログラミング言語 VL とは
https://qiita.com/yhy_jp/items/cc0265c8a76c461c0ea3

# VL のショートカット集
よく使うものをまとめました。
The Gray Book (https://www.gitbook.com/book/vvvv/the-gray-book/details)
に他にも書かれています。

# パッチ
|説明|キー|
|:---------------------|:------------|
| ドキュメントパッチへ移動 | Alt+P |
| アクティブなドキュメントを保存 | Ctrl+S |
| 新しいパッチを作成 | Ctrl+P |
| 新しいパッチを作成し、カーソル位置にノードを配置 | Ctrl+Shift+P |
| エラーの削除 | Ctrl+E |
| ズームのリセット | Ctrl+0 |
| 前に開いていたタブに移動 | Ctrl+< |
| 次に開いていたタブに移動 | Ctrl+> |
| ノードブラウザで選択中の階層を一つ上がる | Esc |
| 開いているパッチを閉じる | Ctrl+W |
| 検索 | Ctrl+F |
| シンボル検索 | Ctrl+Shift+F |
| ソリューションエクスプローラ | Ctrl+J |
| 型の設定 | ピンを中クリック |
# ノード
|説明|キー|
|:---------------------|:------------|
| 「+」ノードなどピンの数か可変のもののピンを増やす/減らす | Ctrl++ / Ctrl+- |
| リージョンに入れる/出す | ラッグしながらCtrl |
# リンク（線）を引いている時に
|説明|キー|
|:---------------------|:------------|
| パッドを作る | Shift+左クリック |
| IOBoxを作る | 中クリック |
| ノードを作る | 左ダブルクリック |
| In/Out ピンを作る | Ctrl+左クリック |
| 強制的につなぐ(型を繋ごうとしている方に合わせる） | スペース押しながら繋ぐ |
# リンク
|説明|キー|
|:---------------------|:------------|
| 削除 | 中クリック |
| 同じデータソースから連続して引いていく | 中クリック |
| IOBoxをすでにあるリンクに挿入 | 右ダブルクリック |
| パッドをすでにあるリンクに挿入 | Shift+左ダブルクリック |
| ノードをすでにあるリンクに挿入 | 左ダブルクリック |
# IOBox
|説明|キー|
|:---------------------|:------------|
| 値をデフォルトにリセット | Alt+右クリック |
terminalのコマンドみたいにpythonスクリプトに引数を渡したい

###python使ってるけど、いつもコード内でファイル名とかフォルダ名とかを指定してるせいで、他の人が使う仕様になっていない
とか
###関数の引数で指定できるようにはしたけど、毎度pythonてコマンド叩いてからしか実行できない

とかを解決したい。


すなわち

```python3
def hoge():
    hoge = "なんかファイル名"
```

```python3
def hoge(a):
    hoge = a
```

からの
```terminal python3 hoge()
```
```python3 
hoge("なんかファイル名")
```

ではなくて、

```terminal python3 hoge.py なんかファイル名
```

で実行したいという記事です。


##どうやら、コマンドライン引数と呼ぶらしい
こういった外から渡す引数をコマンドライン引数と呼ぶもよう。
知らなかった。入門python3にもすごいさらーっと書いてあった。

##コマンドライン引数の使い方
やりかたはすごく簡単。

1. python標準ライブラリのsysをインポート
2. 引数のリスト名 = sys.argv
3. あとは好きにリストの中身を使う

```python
import sys

def main():
    hoge = sys.argv        #引数のリストにhogeと名付けた
    hoge_main = hoge[0]    #リストの最初の要素をhoge_mainとした
    hoge1 = hoge[1]        #リストの２番めの要素をhoge1とした
    hoge2 = hoge[2]        #リストの３番めの要素をhoge2とした
    
    print(hoge_main)
    print(hoge1)
    print(hoge2)

    print(type(hoge))
    print(type(hoge_main))
    print(type(hoge1))
    print(type(hoge2))
```
とか書いて実行してみる。

```terminal python hoge.py cat dog```

出力はこんな感じ。

```
['hoge.py', 'cat', 'dog']
hoge.py
cat
dog

<class 'list'>
<class 'str'>
<class 'str'>
<class 'str'>
```

***どうやら、sys.argvを用いると引数をstr型で読み込んでリスト化して使うことができるらしい。***


あとは実際のプログラムで、引数にディレクトリを取るようにして、コード内でフォルダにアクセスしたりしたら良さげ。

###閲覧ありがとうございました
Thunderbirdのアカウント設定方法とテキストメール形式の受信方法

# Thunderbirdのアカウント設定方法とテキストメール形式の受信方法
## アカウントの設定方法
### 手順
1. Thunderbirdをインストールする。
1. デフォルト画面でアカウントのセットアップを行う。
アカウントのセット    アップ＞メール
をクリックしてセットアップウィンドウが表示されたら下記必要3項
目を入力する。
    * あなたのお名前
    * メールアドレス
    * アカウントのパスワード
![Thunderbird_アカウント設定.png](https://qiita-image-store.s3.amazonaws.com/0/386370/8ba0aada-253a-62bf-b645-60fa74e43aad.png)

1. 全て入力したら「続ける」をクリック。
1. 自動でアカウント検証が行われ、エラーメッセージが表示されなければそのまま「完了」をクリック。
    ※yahooメールの場合、完了をクリック後に検証エラーが表示され、そのままサーバー接続が切れてしまう。
原因については判明次第更新予定。
![Thunderbird_アカウント設定_2.png](https://qiita-image-store.s3.amazonaws.com/0/386370/c2a4c3a9-6bd1-b467-cf8e-153083f9ee5e.png)
1. 追加したアカウントがローカルフォルダ配下に表示され受信トレイにメールが届いていれば完了。

## テキストメール設定
1. メールタブを開いた状態で右上のメニューアイコンをクリック。
![サンダーバード_表示設定.png](https://qiita-image-store.s3.amazonaws.com/0/386370/4db1eb2b-904f-aaac-9732-45ed8a3d6d54.png)
1. 表示＞メッセージ表示形式＞プレーンテキストを選択。  
![サンダーバード_プレーンテキスト.png](https://qiita-image-store.s3.amazonaws.com/0/386370/eae4e5cd-f603-7dbb-ce72-2363782a56b4.png)  
※設定前に受信していたHTMLメールはすべてテキスト情報で表示され、設定後に受信したメールに関してはテキストメール形式で受信される。
Scratch buffer を Kill させないようにする：emacs-lock-mode

わざわざscratch bufferをkillする人はいないと思いますが、"kill-other-windows" などを定義していると、うっかりscratchも一緒に消えてしまって困ることがありますね。

あやまってscratch bufferをkillしたら新しいscratchを自動再生してくれるとか、kill出来ないようにする…というようなTipsも多いのですが、そんな回りくどいことをしなくてEmacsの標準機能だけて簡単に対応できることがわかりました。


## emacs-lock-mode を使う##

パッケージも何もいりません。標準機能の `emacs-lock-mode` を設定します。下記を試してみてください。私は `*Messages*` も一緒に設定しています。

``` emacs-lisp
;; Set buffer that can not be killed.
(with-current-buffer "*scratch*"
  (emacs-lock-mode 'kill))
(with-current-buffer "*Messages*"
  (emacs-lock-mode 'kill))
```

この設定を有効にしたあとscratchをkill bufferしようとすると、

``` emacs-lisp
Buffer "*scratch*" is locked and cannot be killed
```
と叱られます。つまりkillされないようにロックが掛けられるのです。
`emacs-lock-mode` というのはもともとemacsの内蔵コマンドにあるのです。


## Scratchを自動保存する ##

私もそうなのですが、ちょこっとした付箋的なメモをするためにscratchを使うという人も多いと思います。そんな人には、Emacsを再起動させても終了前のscratchが復帰してほしい…というニーズがあります。こうした目的のためのパッケージも何種類かありますが、私は、auto-seve-buffers-enhanced.el の機能を利用しています。このパッケージを使っているEmacserは多いと思うので、わざわざ専用のパッケージを使わずともscratchの保存再生が可能になります。

``` emacs-lisp
(leaf auto-save-buffers-enhanced
  :ensure t
  :custom
 `((auto-save-buffers-enhanced-exclude-regexps . '("^/ssh:" "^/scp:" "/sudo:"))
			(auto-save-buffers-enhanced-quiet-save-p . t)
			(auto-save-buffers-enhanced-save-scratch-buffer-to-file-p . t)
			;; Disable to prevent freeze in tramp-mode
			(auto-save-buffers-enhanced-include-only-checkout-path . nil))
  :config
  (auto-save-buffers-enhanced t))
```

## scratchを瞬時にpopup表示させる ##
`scratch-pop` という便利なパッケージもあるのですが、私にとって余り必要と思わない機能もついているのでシンプルに設定を書いてみました。

popwinを導入した上で下記をinitファイルに書き、適当なキーバインドを設定すると一発でscratch bufferがpopupし、"C-g" で隠れてくれます。

``` emacs-lisp
(defun my:pop-scratch ()
  "Popup the scratch buffer."
  (interactive)
  (setq popwin:special-display-config '(("*scratch*")))
  (display-buffer "*scratch*"))
```
CSSの基礎知識

htmlにcssを適用する方法、基本書式などについてメモ程度に書こうかなと思います。

#CSSの基本書式

　例えば

```style.css
h1 {font-size: 20px;}
```
のように書きます。
　`h1`は***セレクタ***でCSSのうちどこにスタイルを適用するのかを示します。また、`{~}`を***宣言ブロック***と呼び、どのようなスタイルを適用するのかという内容を示します。

　補足としてCSSファイルの1行目には`@charset"utf-8";`と文字コードを指定するためのものを書く必要があります。

#HTMLに適用する
HTML`<head>~<head>`の中に`<link>`タグを使用して

```index.html
<link rel="stylesheet" href="~">
```

のように記述します。
`~`の部分にはそのHTMLに適用したいCSSファイルへのパスを記述します。

その他、HTMLに直接記述してCSSを適用する方法もある。

#フォントの指定
`font-family`でフォントを指定できます.例えば`<body>~<body>`のフォントをゴシック体に指定したい場合

```style.css
body {font-family: sans-serif;}
```
このように書きます。`sans-serif`がゴシック体を意味します。

このようなキーワードで指定する場合それぞれの対応は
sans-serif → ゴシック体
serif→ 明朝体
cursive → 筆記体・草書体
fantasy → 装飾的なフォント
monospace → 等幅フォント

また、

```style.css
body {font-family: "ＭＳ 明朝";}
```
のようにフォント名でも指定できます。

#フォントサイズ指定
`font-size`でフォントのサイズが指定できます。

```style.css
h1 {font-size: 20px;}
```

　ここでは`px`という単位でサイズを指定していますが、`em`や`ex`という単位で指定することや、`％`を使用しての指定もできます。また、`small`、`medium`、`large`といったキーワードによる指定も可能です。

#行間を調節する
　`line-height`を用いることで行の高さを調整することができます。

```style.css
body{line-height: 1.7:}
```
この場合、行の高さはフォントサイズの1.7倍になります。このように数字だけで指定するのではなく、単位を用いたりキーワードを用いて指定することも可能です。


#上下のマージン（つまり空白）をなくす
　HTMLで`<p>`タグを用いて段落を変更する場合上下に空白ができますが、これをなくす方法です。上のマージンを`margin-top`で、下のマージンを`margin-bottom`で0に指定します。

```style.css
p {
	margin-top: 0;
	margin-bottom: 0;
}
```


#参考文献

[書籍『いちばんよくわかるHTML５&CSS3デザインきちんと入門』](https://www.sbcr.jp/products/4797388541.html?sku=4797388541)
[HTMLクイックリファレンス「スタイルシートリファレンス」font-family](http://www.htmq.com/style/font-family.shtml)
[HTMLクイックリファレンス「スタイルシートリファレンス」font-size](http://www.htmq.com/style/font-size.shtml)
[HTMLクイックリファレンス「スタイルシートリファレンス」line-height](http://www.htmq.com/style/line-height.shtml)
ABC - 061 - A&B&C

#AtCoder ABC 061 A&B
[AtCoder - 061](https://atcoder.jp/contests/abc061)

#A問題

 - こういうのって思考速度にタイピング速度がついてくるかどうかで分かれるよな

```java
	private void solveA() {
		int numA = nextInt();
		int numB = nextInt();
		int numC = nextInt();

		out.println(numC >= numA && numC <= numB ? "Yes" : "No");

	}
```

#B問題
Map使ってカウントしてもいいけど、配列操作に慣れたいので配列で実装

 - [4 3]となっている場合、以下の様に算出
    - 4は3に向かって道路が延びているので+1
    - 3は4に向かって道路が延びているので+1

```java
	private void solveB() {
		int numN = nextInt();
		int numM = nextInt();

		int[] wk = new int[numN];

		for (int i = 0; i < numM; i++) {
			int a = nextInt();
			int b = nextInt();
			wk[a - 1]++;
			wk[b - 1]++;
		}

		Arrays.stream(wk).forEach(i -> out.println(i));
	}
```

#C問題
はまった問題。

何も考えずに問題どおりだと・・
 - 1,5,2,4,3となっている場合
    - `{1,22,333,4444,5555}`という配列を作成
    - その配列のK番目の値を取得する

こんな配列作れないので、単純な足し算に置換

```java
private void solveC() {
		int numN = nextInt();
		long numK = nextLong();

		int[][] wk = new int[numN][2];
		for (int i = 0; i < numN; i++) {
			wk[i][0] = nextInt();
			wk[i][1] = nextInt();
		}

		/**
		 * a_1 - a_i までがsortされているとは書いてないよね。。。
		 * なので、sort必須。sortしないとWAです。
		 * はまったわーーー
		 */
		Arrays.sort(wk, (a, b) -> Integer.compare(a[0], b[0]));

		long sum = 0;
		for (int i = 0; i < wk.length; i++) {
			sum += wk[i][1];
			if (sum >= numK) {
				out.println(wk[i][0]);
				return;
			}
		}

	}

```
Firefoxで background のショートハンドが効かない

# 現象
backgroundのショートハンドがFirefoxで効かない
![image.png](https://qiita-image-store.s3.amazonaws.com/0/210553/4d4909d2-a1af-0b16-3720-3efed6f86f0d.png)

# 原因

position指定（center center）とsize指定（contain）の間にrepeat指定があったため

# 解決法


`その他の指定` `position指定` / `size指定` `その他の指定` の順序に書き換える

```css

/* 誤った記述方法 */
.test {
  background: url("../img/xxx.jpg") center center repeat-x / contain;
}

/* 正しい記述方法 */
.test {
  background: url("../img/xxx.jpg") center center / contain repeat-x;
}

```
Notification APIメモ

通知したくなったので調べた

まずユーザーがブラウザ通知許可しているか調べる

```js
    if (Notification.permission !== 'denied') {

    }
```
上記のif文で判定できる

他の判定
>MDNから引用
>
>default
ユーザはまだ許可を求められておらず、通知は表示されません。
granted
ユーザは以前に通知表示の許可を求められており、許可しました。
denied
ユーザは、通知の表示を明示的に拒否しました


次はユーザーに通知を許可させる

```js
    if (Notification.permission !== 'denied') {
      Notification.requestPermission(function (permission) {
      });
    }
```

これで準備完了これで通知できるようになったので

```js
var Notification = new Notification(theTitle,options);
```
タイトルだけなら引数に入れるだけで表示できる


```js
function spawnNotification(theBody,theIcon,theTitle) {
  var options = {
      body: theBody,
      icon: theIcon
  }
  var n = new Notification(theTitle,options);
}
```

このoptionsで一番面白そうなのが`vibrate`
> 通知が発火したときにデバイスのバイブレーションハードウェアに通知するバイブレーションパターンです。 

今の所Android端末のみをバイブさせれるみたい
試してみたい
iosもこないかな...

これのwrapper
https://pushjs.org/
正直カスタマイズ性にかけるので
Notification API使ったほうが良い
Vuex 状態管理ライブラリ メモ


## state

`state`状態データを持てる
サイト全体の状態保存可能
ただやりすぎると可読性やらが落ちます

```
  state: {
    count: 0
  },
```

`state`を表示させたい時(コンポーネント内で)

```
<p>{{$store.state.conut}}</p>

```

`state`を表示させたい時(コンポーネント外で)

```
this.$store.state.conut
```

## mutations

> 実際に Vuex のストアの状態を変更できる唯一の方法は、ミューテーションをコミットすることです。

とにかくmutations使わずにstateは変更できないので
変更したときはmutations使う

```
  state: {
    count: 1
  },
  mutations: {
    increment (state) {
      // 状態を変更する
      state.count++
    }
  }
```

mutationsを使うには`commit`しなければならないです。
`store.commit('increment')`

これでおk
あとは
ミューテーションハンドラ関数は同期的でなければならないこと
何故かと言うとコールバックは、ミューテーションがコミットされた時点ではまだ呼び出されないから


## actions
>-アクションは、状態を変更するのではなく、ミューテーションをコミットします。
>-アクションは任意の非同期処理を含むことができます。

要は非同期処理したかったらactionsで定義して
dispatchで動かせってことです。

```
actions: {
  increment ({ commit }) {
    commit('increment')
  }
}
```

>アクションは store.dispatch がトリガーとなって実行されます:

```
store.dispatch('increment')
```

この一連の流れを理解するのにだいぶかかった...

非同期の操作したい場合例


```
actions: {
  incrementAsync ({ commit }) {
    setTimeout(() => {
      commit('increment')
    }, 1000)
  }
}
```
特定の環境からDockerホストへssh出来なくなった時の対処法

朝から何故かDockerを実行してるホストへssh出来なくなった。
別の環境からだとssh出来る

# 解決法
ssh出来る環境からログインし `route -v`の出力を確認
`docker0`及び`br-XXXX`系統のブリッジに割り当てられているipと被っていないかチェックする
被っていたらdockerのネットワーク設定を弄る

## docker0ネットワークipの変更
以下のファイルを作成する
`/etc/docker/daemon.json`

```json
{
  "bip": "192.168.0.1/24",
  "fixed-cidr": "192.168.0.0/24"
}
```

## br-XXX系ネットワークipの変更
わからない・・・
（ご存知の方いらっしゃいましたら教えていただけると幸いです)
AWSのCloudFormationでCloudbreakを一発でインストール


## ゴール
CloudbreakをAMIから簡単にインストールする

## 方法
案１：AWSのCloudFormationで、一発でインストールする（Cloudbreak 2.8)
参考資料：
https://hortonworks.github.io/cloudbreak-documentation/latest/aws-quick/index.html
案１でCBをインストールした場合は、HDP 2.6.5 / HDF 3.1をプロビジョニングが出来ます

案２：EC2上コマンドラインでインストール（Cloudbreak 2.9.1）
https://docs.hortonworks.com/HDPDocuments/Cloudbreak/Cloudbreak-2.9.1/install-aws/content/cb_install-cloudbreak-on-a-vm.html
案２でCBをインストールした場合は、HDP 3 / HDF 3.3をプロビジョニングが出来ます

楽にしたいので今回はCloudFormationベースでやります。

## 詳細
### Step1 入り口
https://hortonworks.github.io/cloudbreak-documentation/latest/aws-quick/index.html

<img width="1222" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/133516/43c72d79-389c-39d2-1e83-b9a4c3963243.png">

### Step2 CloudFormation画面でCloudbreakの必須情報を入力
<img width="1670" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/133516/8f1d70aa-1ba7-77ac-ebf0-4c41e9861306.png">

### Step3 ログインアカウント情報設定
<img width="1673" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/133516/d3bf95c8-643b-208d-de47-6581a0f3f284.png">

### Step4 Tag情報
<img width="1659" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/133516/891cbaeb-ac29-e87a-7c0a-677d79a84eb8.png">

### Step5 最終確認
<img width="1443" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/133516/6c80fc86-7f50-edba-005d-2ff57add1268.png">

### Step6 待つ
<img width="1435" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/133516/d2ea024b-0171-fde5-aea8-39caa6722be6.png">

<img width="1175" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/133516/f5b4eada-e156-f4e9-711f-2f693309af85.png">

### Step7 出来上がり
![image.png](https://qiita-image-store.s3.amazonaws.com/0/133516/67710a2e-ddcf-dff6-c7d4-4ffc00b84cdb.png)


### Step8 Login
OutputセクションにあるURLをクリックし、CBのログイン画面に遷移
<img width="1678" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/133516/85e42b2e-e662-c102-d919-198639e2476b.png">

↑Step2で設定したメールアドレスのアカウントとパスワードを入れる

### Step9 AWSかAzureのアクセス情報を入れる
<img width="1261" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/133516/d454c8b7-c071-fb39-c587-b27e8f65347c.png">
Role Baseか、Key Baseで。

### Step10 CloudbreakでHDFクラスタ作成：画面右上のCreate Clusterボタンを押す

<img width="1298" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/133516/861c29f0-e910-bfd4-ea43-b778e9c0a6a7.png">

### Step11 CloudbreakでHDFクラスタ作成：クラウドベンダーのアカウントを選択肢、HDF/HDPを選択
<img width="1279" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/133516/f6e5c42a-cb35-44f6-0180-212b99ea28ee.png">

こちら選べるHDP/HDFのバージョンは、Cloudbreakのバージョンによります。
最新版Cloudbreak 2.9ですと、HDP 3.1かHDF 3.3が選べます。
<img width="435" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/133516/e0124905-f90f-c7f8-2ad5-7076605afeae.png">
【Jest】テストファイルからmoduleを絶対パスでimportしたときのエラー:  Cannot find module 'src/...'  の解決

# はじめに
ReactでJestを使ったテストを実装したときにmoduleのimportを

```hoge.test.tsx
import { Piyo } from 'src/Piyo'
```

のように、絶対パスで指定してテストを実行すると`Cannot find module 'src/Piyo' from 'hoge.test.tsx'`というエラーが出てしまい解決に時間を要したので共有します。

# 環境
- `create-react-app`で作成したReactプロジェクト
- node v10.14.1
- npm v6.9.0
- yarn v1.12.3
- TypeScript v3.3.4

# 解決方法
`package.json`に以下を追記して再度`yarn test`を実行する

```package.json
  "jest": {
    "moduleNameMapper": {
      "src(.*)$": "<rootDir>/src/$1"
    }
  }
```

これでrootディレクトリ直下の中に入っている`src`フォルダ配下のファイル全てを正しく認識します👏

# 参考
- [Configuring Jest](https://jestjs.io/docs/ja/configuration#modulenamemapper-object-string-string)
Zoho CreatorのREST APIを叩きデータを取得する

# Zoho CreatorのREST APIを叩きデータを取得する
kintoneで実現していたクラウドDBをZoho Creatorに移行するという、ちょっと珍しい作業をやった時のメモみたいなもの。

いやREST APIの仕様は公式ドキュメントに明瞭簡潔に載ってるのですが、
いかんせんZohoは公式ドキュメントが日本語非対応なうえ、国内にはZohoを取り扱った記事も少なく
そして自分は英語が苦手…ヤンナルネ

とりあえずREST APIを叩き、Zoho Creatorのアプリからデータを取得するところまでを残しておく。
スカムな記事だと思います。

# アプリを作りフォームをサクッと作る
Zohoアカウントをアクセスし「Zoho Creator」にアクセス。
初回チュートリアルは非常に親切で、実際に操作をしながらアプリを作ることが出来ます。
編集画面でパーツをドラッグ&ドロップでポチポチ作成。
この辺りはkintoneと同じ感覚で、ノンプログラミングでサクッと作れます。
![キャプチャ0001.PNG](https://qiita-image-store.s3.amazonaws.com/0/377342/c49496fe-60e7-953c-098b-3a4b0ef67faa.png)

# レポートを作成しデータを投入
レポート＝データ一覧画面、というざっくり認識でOK。
自動的にレポートも作成されているはずですが、もし作成されていなければレポートも作ってしまう。
日本語訳がイマイチですが、以下で作成したフォームを選択すればOK。
![キャプチャ0002.PNG](https://qiita-image-store.s3.amazonaws.com/0/377342/51c7fee3-6c7b-6964-d924-6d39c929acec.png)


「このアプリケーションにアクセス」をクリックすると、作成したアプリを実際に動かすことが出来る。
早速作成したフォームにデータをいくつか投入。
![キャプチャ0003.PNG](https://qiita-image-store.s3.amazonaws.com/0/377342/6e889bae-2af6-8a6a-04d6-c85ef72eecde.png)

# APIキーを生成
APIキーの発行云々は以下に記載されている（Yes, 全部英語）。
https://www.zoho.com/creator/help/api/prerequisites/generate-auth-token.html

APIを使用するための認証キーを作成。
以下にアクセスすれば、APIキーが生成されJSON形式でもらえます。
内容を確認し、どこかにメモっておく。
`https://accounts.zoho.com/apiauthtoken/nb/create?SCOPE=ZohoCreator/creatorapi&EMAIL_ID=【ZOHOのユーザーネーム】&PASSWORD=【ZOHOパスワード】`

# 早速APIを叩いてみる
基本的なAPIは以下に一式記載されている（Yes, 全部英語）。
とりあえず今回は、アプリからデータを取得するAPI（View Records）を試しに叩いてみる。

**URL**
`https://creator.zoho.com/api/【取得するデータ形式】/【アプリケーション名】/view/【レポートリンク名※1】`

**HTTP Method**
`GET`

**【取得するデータ形式】**
`json`
`xml`
`csv` ※公式ドキュメントには何故か「csv」の記載がなかった…ナンデ？

**パラメータ**　とりあえず必須のものだけ。オプションで条件を付けたりできます。

| 名前　　　    |値 　　　　　    |
|:-------------|:----------- |
| authtoken    |作成したAPIキー   |
| scope        |"creatorapi"固定 |
| zc_ownername |アプリケーションのオーナー名 ※2|

例）json形式で叩いてみる
`https://creator.zoho.com/api/json/testapp/view/testForm01_Report?authtoken=【APIキー】&zc_ownername=【オーナー名】&scope=creatorapi`
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/377342/42ad97e9-56f3-aadd-a271-289ccf1eae3d.png)

上手くとれたかな。。

---



※1 レポートリンク名は以下で確認＆変更可能。
　　ドキュメントには「Viewのリンク名を指定しろ」と書いてますが、View＝レポートらしい。
　　紛らわしいなあ…
　　![無題.png](https://qiita-image-store.s3.amazonaws.com/0/377342/a0444d6d-4ed5-4b6f-ef15-ce7f98d1f8c0.png)




※2 アプリケーションのオーナー名とは、どうやらコレらしい
![キャプチャ111111.PNG](https://qiita-image-store.s3.amazonaws.com/0/377342/fc3e08b7-6b09-c800-ad14-338c44bd5deb.png)