OmniAICreator/Qiita-1.07M huggingface dataset:
8日目：遊園地で学ぶスポーン地点設定

この記事はアドベントカレンダー「[【VCI】テーマパークを作ろう](https://adventar.org/calendars/5855) 」の8日目の記事です。

# 今回の内容
今回はリスポーン地点の設定を学びます。
今回は自分もはじめて触れるないようなので探り探りになるかと思います。

# スポーン地点の設定
現在の出現地点は下の画像にRoomの中心地点(観覧車の後ろ)になっていますが、実際には門の前辺りに出現したいためスポーンポイントの設定をしたいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64877/bdedd226-e793-4f88-25e7-e2fd4b26c766.png)

設定内容は以下の公式ページを参照ください。(今回は私もこちらをみながら作成します)
　・ https://virtualcast.jp/wiki/doku.php?id=vci:component:sdk:playerspawnpoint

基本的には出現させたい位置・向きにオブジェクトを配置し、そのオブジェクトにコンポーネントを追加する形となります。
複数設定可能ということなので、練習がてら今回は入口付近に2つ作りたいと思います。

まずはスポーンポイント設定用の空オブジェクトを2つ作り、それぞれにVCI PlayerSpawnPointを追加します。
次にそれぞれのオブジェクトを門の少し前に起き、向きを門側に向けます。
最終的な配置は以下のようになります。(わかりやすいように一時的にcubeを配置しています)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64877/7dade130-b6da-326d-bf63-6059f9c30b8f.png)

設定にあるOrderを1以上に設定すると凸した順で1から順に割り当てられるみたいですが、今回は順番は関係なくただ2箇所にランダムで出現させたいだけなので両方0にします。

Radiusはどれくらい出現の位置の幅をもたせるかですが、Roomでは効かないみたいです。
(おそらくRoomでやるにはオブジェクトを移動させるしかないと思います。詳しい方法がわかったら追記するかもしれません。)

あとはアップして実際にリスポーン位置が変わっていることが確認できれば完了です。
(動作確認中。1回紐づくと再度スポーンしてもかわらないみたいです。
![20201209-221223.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64877/9bf50f46-c1fb-eeda-d5de-8105d4a4a5b9.png)
)

短いですが今回は以上です

# 終わりに 
いかがでしたでしょうか？
今回はOrderを使いませんでしたが、Orderを使うことで自動チーム分けやひな壇などへの自動配置もできそうな気がします。
次回はアイテム内でのテキスト表示について書くつもりです。
Laravel6　自作ファサードの単体テスト　TestCaseの継承で躓いたこと

# 何が起きたか
新しくファサードを登録し、その単体テストを行うためにartisanを用いてtestファイルを作成しました。
その後、テストを実行するとクラスが無いよ！！と怒られてしまいました・・

```
$ php artisan make:test HogeTest --unit
```

```:機能実装・テストコード記載後
$ ./vendor/bin/phpunit

There was 1 error:

Illuminate\Contracts\Container\BindingResolutionException: Target class [path.storage] does not exist.
...
...
ReflectionException: Class path.storage does not exist
```

# 原因
テストファイルで継承していたのは`PHPUnit\Framework\TestCase`というPHPUnitの基底クラスでした。
今回はファサードに登録したクラスの単体テストを作成したため、Laravelが独自に定義している基底クラスの`Tests\TestCase`を継承する必要があったんですね。

# コードの確認

```php:Tests/TestCase.php
<?php

namespace Tests;

use Illuminate\Foundation\Testing\TestCase as BaseTestCase;

abstract class TestCase extends BaseTestCase
{
    use CreatesApplication;
}
```

上記の`CreatesApplication`トレイトにてLaravelの設定やファサードなどを読み込んでいるようです。

# 結論
結合テストやファサードを含む単体テストを行う際は`use Tests\TestCase`でテストを行う。
Laravelの機能に依存していない単体テストなどは`use PHPUnit\Framework\TestCase`で行う方がベターだと思われます。
Kotlinのスコープ関数の勘所

# はじめに

```kotlin
val user = User().apply {
    name = "kotlin"
    age = 22
}
```

みなさん、Kotlinのスコープ関数は好きですか？私は大好きです😍

スコープ関数が好きな理由はいくつかあります。

- コードのまとまりがわかりやすくなる（可読性UP）
- **コードの文脈を表現できる**

とりわけ「**コードの文脈を表現できる**」という点が優れていて、スコープ関数の名前（`let`や`also`）だけで、どんなコードがまとめられているのか推測することができます。

スコープ関数は大変便利なものですが、用法を守らないと却ってコードの文脈がわかりにくくなってしまいます。
しかしながら、スコープ関数を使い分けるのはなかなか難しいものです。


そこで本記事では、私がスコープ関数をそこそこ使い分けれるようになった時に感じた**勘所**をご紹介します。
最後に、私がAndroid開発でよく書くスコープ関数のコード例を示します。

# スコープ関数の勘所

### スコープ関数の使い分けを知る

公式ドキュメントにしっかり利用例が書いてあります。
こちらのページを常に参照していればOKだと思います。
https://kotlinlang.org/docs/reference/scope-functions.html#function-selection


### スコープ関数の戻り値が何になるか知る

スコープ関数は戻り値の違いで2つに大別できます。

|戻り値がオブジェクトのまま|戻り値はラムダ式の結果|
|---|---|
|apply, also|let, run with|

同じことがこのページにも書いています。
https://kotlinlang.org/docs/reference/scope-functions.html#function-selection

# コード例

### RecyclerViewの設定

`RecyclerView`に`adapter`と`layoutAdapter`を設定する時は、「設定する」という文脈で`apply`を使うのが良いと思います。

```kotlin
class HomeFragment : Fragment(R.layout.fragment_home) {

    private val userAdapter = UserAdapter() // RecyclerView.Adapter

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        val binding = FragmentHomeBinding.bind(view)
        binding.recyclerView.apply {
            adapter = userAdapter
            layoutManager = LinearLayoutManager(context)
        }
}
```

### ViewBinding

`ViewBinding`を使って`TextView`にテキストを入れたり`ImageView`に画像を表示させたりするときは、「`ViewBinding`に関する処理をまとめる」という文脈で`with`を使うと良いと思います。

```kotlin
class HomeFragment : Fragment(R.layout.fragment_home) {

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        val binding = FragmentHomeBinding.bind(view)
        with(binding) {
            usename.text = "USERNAME"
            icon.load("https://...") // coilライブラリ
        }
}
```

### Date型から文字列に変換して代入する

ある変数を引数にとって別の値を返したい時には、`let`を使うといいと思います。
以下のコードでは、`let`を使うことで`date`を`NonNull`の引数として扱い、文字列として返すような関数が作れています。

```kotlin
@BindingAdapter("date_text")
fun TextView.dateToText(date: Date?) {
    val text = date?.let {
        SimpleDateFormat("yyyy/MM/dd HH:mm", Locale.US)
            .apply { timeZone = TimeZone.getDefault() }
            .format(it)
    }.orEmpty()
    setText(text)
}
```

# まとめ

**Kotlinのスコープ関数の勘所**

- スコープ関数の使い分けを知る
- スコープ関数の戻り値が何になるか知る
【Java】Javaをターミナルで動かす手順

お恥ずかしながら、あまりそういう機会がなかったのできちんと手順を抑えておくことにします。

# Javaをターミナルで動かす手順

結論、手順は以下です。

1. Javaのソースコードのファイルを作成 
2. ターミナルでそのファイル先まで移動する
3. Javaファイルをコンパイルする
4. Javaの実行をする

## Javaのソースコードのファイルを作成

```java
public class Hello {
    public static void main(String[] args) {
 
        System.out.println("Hello World");
 
    }
}
```

## ターミナルでそのファイル先まで移動する

ターミナル上でcdコマンドでHello.javaがはいっている「src」ディレクトリまで移動する。

## Javaファイルをコンパイルする

Hello.javaを実行するためにコンパイルを行い、実行するためのファイルを生成します。コンパイルの方法は以下です。

```java
javac Javaファイル名.java
```

上記の構文でHello.javaのコンパイルを行います。

```java
javac Hello.java
```

コンパイルが成功すると、同じディレクトリ内に「Hello.class」というファイルが作成されており、それがJavaの実行ファイルになる。

## Javaの実行をする

実行時は以下の書き方で行います。拡張子がいらないことに注意。

```java
java 拡張子なしのファイル名
```

Hello.javaの実行は以下です。

```java
java Hello
```

実行できればターミナル上で「Hello World」と出力されます。

## コンパイルと実行を一括で行う(Java11以降)

Java11以降であれば、以下の書き方でコンパイルと実行を同時に行うことが出来ます。

```java
java Hello.java
```

「最初からこのやり方言えよ！」って思うかもしれませんが、上の手順とこの手順、JavaSilverの範囲らしいのでどちらの書き方も覚えておくといいかもしれません。

## まとめ

Javaのコマンド上での実行の仕方のおさらいです。

```java
// コンパイル
javac Javaファイル名.java
// Javaの実行
java 拡張子なしのファイル名

// Java11以降 コンパイル + 実行
java ファイル名.java
```

コマンド上で操作するのに慣れていなかったので、今更感はありますが確実に覚えておきましょう。

## 参考記事・資料

- [徹底攻略Java SE 11 Silver問題集[1Z0-815]対応](https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5Java-SE-11-Silver%E5%95%8F%E9%A1%8C%E9%9B%86-1Z0-815/dp/4295007625/ref=pd_lpo_14_img_0/356-5238196-1895250?_encoding=UTF8&pd_rd_i=4295007625&pd_rd_r=1c21865b-a9fe-43e8-ac01-46170e44abca&pd_rd_w=9El0Q&pd_rd_wg=hh5Hc&pf_rd_p=4b55d259-ebf0-4306-905a-7762d1b93740&pf_rd_r=72AVH18EM90CKG00CH5W&psc=1&refRID=72AVH18EM90CKG00CH5W)
- [【Java入門】Javaをコマンドで動かす方法まとめ（引数なし・あり） | 侍エンジニア塾ブログ（Samurai Blog） - プログラミング入門者向けサイト](https://www.sejuku.net/blog/108780)
- [【Mac環境】ターミナルからJavaの実行方法をご紹介！【初心者向け】 | 「ポテパンスタイル」](https://style.potepan.com/articles/18703.html)
勢い余ってエンジニアにインタビューしてYouTubeに載せてしまった話

## 0. プロローグ
私は、「[エンジニア紹介屋 ふね](https://www.youtube.com/channel/UCN_oO6zXOpqNlIL96EjWjQA/videos)」と言う名前のYouTubeチャンネルで、動画を投稿しています。
始めは「ナッツ専門店」を紹介する動画を投稿していたんですが、東京に来るタイミングでエンジニア向けの内容にシフトしました！
同じ時期に上げたナッツ系の動画は100回にも見られていないのに、エンジニア向けの動画は視聴回数が多いですね（笑）
主に「未経験からエンジニアになった人」をメインにインタビューした動画を投稿していました！振り返りも兼ねて書き残しておきます。

では、張り切ってどうぞ！

## 1.インタビューに至った経緯
私がインタビュー動画を投稿するようになったきっかけは、同居人からのアドバイスです。
以前エンジニア向けのシェアハウスに住んでいた時、同居人から「実際に、未経験からエンジニアになった人に話聞いてみたら良いんじゃないですか？」と言うアドバイスをもらいました。私は人と話すのが好きなので、話を聞くのは全然良かったのですが、話を聞いても、"私のため"にしかならないので、「どうせなら動画を撮って、必要な人に見てもらおう」と思いインタビュー活動を始めました。

## 2.動画作成の目的
きっかけは上記の通りですが、目的は2つあります。「駆け出しエンジニアのモチベーションアップ」「テキストベースで発信しているエンジニアに、動画でアウトプットする場所の提供」出演者さんの影響力の拡大(フォロワーを増やすこと)も目的としていましたが、私の知名度がそんなに高くないので、フォローの増減に変化はなかったようです（笑）

## 3.動画撮影の流れ
出演依頼→zoomで企画・概要説明→質問内容の開示→zoomで動画撮影ってな、感じの流れでやっていました！人によりますが、出演依頼をしてから動画の撮影まで1〜5日くらいです。動画の編集は、imovieを使って後半からDaVinci Resolve使ってました。こだわれば何時間でもかけることが出来ましたが、ラジオ感覚で聞いて貰いたかったので、シンプルな編集にしました。

## 4.撮影方法
動画を撮る意向が決まった当初は、シェアハウスの同居人に動画編集者がいるのでそいつに手伝って貰って、都内のどこかのスタジオを借りて収録する予定でした。しかし、コロナの影響でスタジオも閉鎖しており、他人との接触を控える風潮が出来たので、撮影方法を変更しzoomで撮影する方法に切り替えました。場所代や、移動費も掛からなかったので、結果的にzoomの撮影で良かったのかなとは思います（笑）

## 5.反響
視聴者から数件コメントをいただくことがありました。また、出演者の中でも、未経験から数ヶ月で役員クラスまでのし上がり、採用を担当している方から
「接前にYouTube動画を視聴し、ある程度私の人間性を知ってから来る応募者がいて面接がしやすくなった」といったコメントをいただきました。

## 6.総括&改善点
それぞれ勉強方法も就活の軸も違っていて面白かったです。みなさんいずれも、社員の挑戦する意志を尊重する会社に入社されているので、うらやましく思いました。改善点として動画の長さが20分以上になってしまったので、工夫すれば少し短く出来たかなと思います。編集を駆使すれば、もう少し抑揚のある動画に出来たかなと。まぁ、改善の予知は多いにありますね（笑）

## 7.今後
RUNTEQでも、どんどんエンジニアが出てきているので、今後はその方々へのインタビューを中心に行っていこうかなと思います。

## 8.紹介
第一弾に紹介して出演していただいた方々はこちらの皆さんです！
[てるふみ](https://twitter.com/terufumi1122)さん
[りょうた](https://twitter.com/ryota_Engineer_)さん
[とみた](https://twitter.com/Jessicazu418)さん
[webクマ](https://twitter.com/Webkuma_)さん
[かたより](https://twitter.com/yoriblog)さん
[すな](https://twitter.com/suna_tech)さん
[なる](https://twitter.com/notifications)さん
ご協力ありがとうございました！

いずれも魅力的な方々なので、フォローしてみる価値ありです！
お手伝いアプリを集計してみた。

#あらすじ
Power Appsでお手伝いアプリなるものを作成したんですよｗ
その時に何が一番多くお手伝いしてるのかなと思いPower BIで集計してみようと思いました。

これまで、QiitaでPowe BIを書いてなかったんですね(-_-;)
そこにビックリしたｗ
とゆうことで、やってみたいと思います！

#データ先は？
もちろんMicrosoftDataverseです！
ちなみにデータはこんな風になってます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404009/f0b53597-7b30-ef97-b2f9-15f32dfb8128.png)
とゆうことで、Power BIにデータを持ってきました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404009/854dd871-4569-80ae-dfdd-eb8b196ea9a0.png)

#Dataverseからデータを持ってくるときの注意！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404009/cfbc4683-56f2-4562-7c11-347224be67d5.png)
ここのサーバーURL！！
Power Appsの管理画面から持ってくるんだけど、環境のURLをそのままコピペするとエラーが返ってくる！！
たまに自分もやる…
ちゃんと「https://」をつけてあげてから接続をクリック！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404009/79eff96e-d192-6378-c898-1cfbb7fd30bd.png)



#Power BIで可視化してみたのがこちら！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404009/9c364f20-15ed-a181-e94e-a734a0408430.png)
カードを使って、Totalのポイントを出してあげたり、
テーブルで子供の名前・手伝った項目・ポイントを出してあげたり、
一番多くこれやってるんだとかという集計ができるわけですよね(*‘ω‘ *)

#まとめ
このPower BIを作って悔いが残ったので、もうちょっと改造しますが(*'ω'*)
残った部分といえば、レイアウトとかですが、、、

ともあれ、データを接続できれば、こんな簡単に集計できちゃうすぐれものということがわかりましたね！
roman numerals



# お題

アラビア数字(arabic numerals)を受け取って，ローマ数字(roman numerals)を返すmethodを書きなさい．


# ローマ数字で使われる数字

アラビア数字とローマ数字と対応付けは表の通りである．表からわかるようにローマ数字は1～3999まで表すことができる．

| arabic numerals   | 1   | 2   | 3   | 4   | 5   | 6   | 7   | 8   | 9   |
|:------------------|----:|----:|----:|----:|----:|----:|----:|----:|----:|
| roman numerals    | I   | II  | III | IV  | V   | VI  | VII | VIII| IX  |

| 10  | 20  | 30  | 40  | 50  | 60  | 70  | 80  | 90  |
|----:|----:|----:|----:|----:|----:|----:|----:|----:|
| X   | XX  | XXX | XL  | L   | LX  | LXX | LXXX| XC  |

| 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 |
|----:|----:|----:|----:|----:|----:|----:|----:|----:|
| C   | CC  | CCC | CD  | D   | DC  | DCC | DCCC| CM  |

| 1000| 2000| 3000|
|----:|----:|----:|
| M   | MM  | MMM |


# 解説

```ruby
# coding: utf-8
class Integer
  def to_roman
    roman = %w[I V X L C D M]
    to_rom = ""

    puts("1～3999の整数を一つ入力")
    n = gets.to_i

    0.step(to: 4, by: 2) do |i|
      r = n % 10

      case r
      when 1..3
	then to_rom.prepend roman[i] * r   
      when 4
	to_rom.prepend roman[i] + roman[i + 1]
      when 5
	to_rom.prepend roman[i + 1]
      when 6..8
	then to_rom.prepend roman[i + 1] + roman[i] * (r - 5)
      when 9
	to_rom.prepend roman[i] + roman[i + 2]
      end

      n = n / 10
      if n == 0
	break
      end
    end

    to_rom.prepend "M" * n
    return to_rom
  end

  num = ARGV[0].to_i
  puts(num.to_roman)
end
```



------
 - **source** ~/grad_members_20f/members/Kazufumi0823/roman_numerals.org
[TypeScript] 引数に応じてDynamoDBの更新対象属性を変化させる


#概要
DynamoDBの属性を更新する際、対象の属性名があらかじめ決まっている場合は Expression 式に固定の attribute を入れてあげればいいのですが、更新対象の属性が状況に応じて変化する場合はそうはいかないので、引数に応じて文字列結合でその都度 Expression 式を生成するような非同期関数を作成しました。


#update（更新）
以下、サンプルの非同期関数です。
AWS.DynamoDB.DocumentClient を利用して実装しています。
引数として渡された、 item オブジェクトの要素に応じて、 updateExpression, expressionAttributeValues, expressionAttributeNames の文字列を生成し、update メソッドで利用するようにしています。

```typescript
public async updateItem(item: {
    HashKey: string;
    RangeKey: string;
    AttributeA?: string;
    AttributeB?: string;
    AttributeC?: string;
    AttributeD?: string;
  }): Promise<DynamoDB.DocumentClient.UpdateItemOutput> {
    let updateExpression = "set ";
    const expressionAttributeValues = {} as any;
    const expressionAttributeNames = {} as any;

    // item の要素から expression 文字列を生成する
    for (const [key, value] of Object.entries(item)) {
      // ハッシュキー or レンジキーは取り除く
      if (!(key === "HashKey" || key === "RangeKey")) {
        updateExpression += `#${key} = :${key}, `;
        expressionAttributeValues[`:${key}`] = value;
        expressionAttributeNames[`#${key}`] = `${key}`;
      }
    }

    // 末尾の不要文字を削除
    updateExpression = updateExpression.slice(0, -2);

    // update メソッドの実行
    return await documentclient
      .getClient()
      .update({
        TableName: "table-name",
        Key: {
          HashKey: item.HashKey,
          RangeKey: item.RangeKey,
        },
        UpdateExpression: updateExpression,
        ExpressionAttributeValues: expressionAttributeValues,
        ExpressionAttributeNames: expressionAttributeNames,
        ConditionExpression:
          "attribute_exists(HashKey) AND attribute_exists(RangeKey)",
        ReturnValues: "ALL_NEW",
      })
      .promise();
  }
```


#まとめ
引数に応じて Expression 式を変化させるような AWS.DynamoDB.DocumentClient の 非同期関数を作成しました。
実際に少しはまりましたが、DynamoDBの接続処理は非同期で呼び出されるため取り扱いには注意です。
Grafanaのグラフをhtml文書に埋め込む

[前回記事](https://qiita.com/rk05231977/items/1398bd714f6ea1b6c2ee)のおまけ。Grafanaのグラフをhtml文書に埋め込む。

# Grafanaでanonymousログイン、embeddingを有効にする

１．viで「/etc/grafana/grafana.ini」を編集する。
→ 205行目くらいにある「;allow_embedding = false」を
「allow_embedding = true」に、
→ 336行目くらいにある、[auth.anonymous]セクションの「;enabled = false」を「enabled = true」に

２．Grafanaを再起動する。

# GrafanaのパネルのURLを取得する

１．Grafanaにadminユーザーでログインする。

２．埋め込みたいダッシュボード/パネルを開く。

３．パネルのタイトルをクリックし、「Share」をクリックする。
※下記の画像だと、パネルのタイトルは空文字。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/544909f9-6423-98fe-bf83-3a0237c86711.png)

４．「Embed」で「Current time range」のチェックを外し、表示される「<iframe～」の文字列をコピーする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/a01dea4f-1cbe-d7d5-2180-828b2894f7fa.png)

# グラフを埋め込んだhtmlを作成する

１．とりあえず、グラフを画像内に埋め込んだhtmlの例として、以下ファイルを作成して手元のPCに保存する。
iframeのwidthやheightは埋め込む先の画像に合わせて調整。

```html:graf.html
<!DOCTYPE html>
<head><link rel="stylesheet" href="graf.css"></head>
<div class="relative">
    <div class="absolute">
        <iframe src="http://54.150.214.19:3000/d-solo/Dnrs741Mz/data1?orgId=1&refresh=1s&theme=dark&panelId=2" width="100" height="100" frameborder="0"></iframe>
    </div>
</div>
```

```css:graf.css
.relative {
    position: relative;
    width: 409px;
    height: 700px;
    background-image: url("https://publicdomainq.net/images/202008/10s/publicdomainq-0047735ngo.jpg");
}

.absolute {
    position: absolute;
    top: 490px;
    left: 155px;
}
```


# 埋め込み結果
ハートの真ん中で脈打っているのが埋め込んだグラフ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/a3907ba8-1026-b410-1f93-c6ad11ae7bd6.png)
プログラミング初心者が作るIoTRCカーの製作 1-4 ESC、サーボのハック 本番品動作確認

![IMAG2725.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933473/b1cd535e-cbe2-574d-398d-ef80b6f76994.jpeg)
終わってしまわれた……。今回も意外とすんなり終わってビックリです。

#SAVOX SW-0231MG
SAVOXのデジタルサーボ。何と言っても防水構造とトルクが大きいこと、それから4000円位と手に届きやすい価格であるというのが美点です。なお修理は出来ない模様。
TAMIYA TEU-105BKでは流せる電流の関係上デジタルサーボは使わないよう注意書きされていますが、コミカルアバンテで平地を走らせる分には問題なく動作しました。坂道とか悪路とか負荷かけるとダメかもしれないですけど。
ちなみにコミカルアバンテの規定取り付けサイズより大きいのですが、取り付けOKでした。

TSU-03やTSU-04に比べると、もっとdutyの値を下げないといけないようです。前の値をそのまま使ったら、ステアが回りすぎました。
周波数50Hzの時、

- 左一杯：5.7％
- 静止時：7.6％
- 右一杯：9.5％

という感じです。静止時の値はステアが真ん中になるように調整した値です。
注意点としては、TSU-03などと回転方向が逆になることです。コミカルアバンテのサーボ設定って基本リバースなんですが、リバースのリバースでノーマルになります。

#HOBBYWING QuicRUN-WP-CRAWLER-Brushed
元々クローラー競技用を見据えたブラシモーター用ESCとのことで、通常のバック方向1クリックでブレーキ、2クリックでバックという操作の他に「ドラッグブレーキ」というステアニュートラル時にブレーキが掛かるという設定が出来ます。他にもBECの電圧を6.0Vの他7.4Vに出来たり　リポバッテリーの電圧カットオフなんかも付属のプログラムカードで可能です。
運用の際の問題点としては、モーター用の端子が付いていないことと、バッテリー端子がXT60コネクタになっていること。そのため端子を付けたり変換アダプタを用意しないといけなかったりします。タミヤRC基準で考えると一工夫必要なESCです。特にブレーキ設定を無くせるというのがマイコンからの制御では使いやすく、バック時に一度ニュートラルを入れたりしなくていいのは楽ですね。

HOBBYWINGのブラシESCと言えばQuicRUN 1060ですね。使ったことは無いんですけど2000円台でTEU-105BKと同じバッテリー＆モーター用コネクタが付いています。走行モードもブレーキレスが可能です。

周波数50Hzの時、

- 3.9％で動かなくなる
- 4.0％～7.1％までバック方向に動く（値が減ると早くなる）
- 静止時：7.2～8.0％
- 8.1％～10.9％まで前進方向に動く（値が増えると早くなる）
- 11％で動かなくなる

でした。TEU-105BKと比べると大分値の差が大きいです。また、値が大きすぎたり小さすぎたりすると動かなくなるようです。

大事な注意点としては、プログラムカードで設定を弄ったら同じ値で動かなくものがあるということです。「11.Neutral Range」という、プロポでの最小動作開始地点（いわゆる「遊び」）を決める項目なのですが、これを弄ると設定やり直しです。上の値は設定「4」のものになります。加えてESCはプロポとのキャリブレーションがあるため、ポン付けで同じ値になるかは何とも言えないです。

初めてこのESCを使った時、前進とバックが逆だったのにビックリしました。モーターの配線を逆にすればいいかと思ったらそうでもなく、プログラムカードで選べるバック量を50％にしても前進50％になるんですね。結局スロットルリバースを使うことで解決しました。けどマイコンから制御すると数値が低くなるとバックで高くなると前進という感じで、新婚方向はTEU-105BKと同じ仕様になるんですよね。

#サーボ、ESCのハックまとめ
![IMAG2752.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933473/7d1c5b6d-7dba-6a9b-61b9-d34b6dbad77a.jpeg)
始めはどうしたものかと頭を抱えたものですが、意外とスムーズに終わりました。とは言ってもオシロで波形を見るとか専門的なことは全然やっていないんですけど。
サーボもESCも、市販されている製品は大体似たような周波数、比率のPWMで動くようです。互換性というか、どの品物を使ってもある程度安定して使えるようになっているのかなと。周波数自体も数Hz変えても動作する辺り、許容範囲みたいなのを広く取っているのではないかと感じました。

#現状と次回予告
電源供給について、前回J1端子へBECからレギュレータで5Vに落として入れていたのですが、バッテリーは十分あるのにObnizへの電圧が不足しているというメッセージが出て最終的には起動しなくなりました。今モバイルバッテリーで給電していますが、やっぱりUSB端子から給電しないといけないみたいです。

UIは簡単に左右ステアと歩く程度の前進＆バック、それから停止をボタン操作で扱うようにしました。本当はコントローラーとか使いたいんですけど、そんなプログラミングスキル無いのでまずは現状出来ることからやっていきます。
現在スマホのタッチで操作出来るようになっているので、外で犬連れて歩く位みたいな感じで動くことは出来そうです。

今回でESC＆サーボのハックはいったん終わりにして、次は何かセンサーを利用して自動停止とか出来ないかをやれたらなと思います。本当はカメラ入れたいんですけど、カメラ高いのでもう少し後の導入になりそうです。
情報量・エントロピー・相互情報量のまとめ

この記事は古川研究室 古川研究室[Advent_calender](https://qiita.com/advent-calendar/2020/flab)9日目の記事です。
本記事は古川研究室の学生が学習の一環として書いたものです。内容が曖昧であったり表現が多少異なったりする場合があります。

# 情報量
まず情報量について、例えば、犬が人をかんでもそれほど驚きませんが、人が犬をかんだらとても驚きますよね！これは、（生起確率）発生確率が小さいことが発生したときの方が、情報量(ここでは驚き度)が大きいことを意味しています。だから、生起確率が小さくなるにつれて、情報量は次第に多きくなることがわかります。したがって、以下の式で表されます。
ビットのとき
$$ I = -log_2P$$
ナットのとき
$$ I = -log_eP$$
ビット(bit)はbinary unitの略、ナット(nat)はnatural unitの略で、単位の違いだけですが、微分の計算の時はナットが便利です。
横軸に確率$P$縦軸に情報量$I=-logP$をプロットした図です。確率値が高くなればなるほど、情報量が少なくなることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/854611/e0601cfb-fe60-3f4d-f682-3bd3b528eadd.png)

#エントロピー
エントロピーは情報源の平均情報量であり、情報源全体としてどのくらい情報量を持っているかを表します。
$$ H(s) = -\sum_{i=1}^Mp_ilog_2p_i$$
エントロピーの意味
明日の天気を予測する場合、情報源のA子さんは事象晴れ、雨、曇りがそれぞれ同じ確率で発生すると予測するとします。
晴れ：確率$1/3$
雨：確率$1/3$
曇り：確率$1/3$

プロの気象予報士B子さんは以下のように予測するとします。
晴れ：確率$4/5$
雨：確率$1/10$
曇り：確率$1/10$

このときの、エントロピー(平均情報量)を計算します。
A子さん:$H(A)=-\frac{1}{3}log_2\frac{1}{3}-\frac{1}{3}log_2\frac{1}{3}-\frac{1}{3}log_2\frac{1}{3}=1.585$
B子さん：$H(A)=-\frac{4}{5}log_2\frac{4}{5}-\frac{1}{10}log_2\frac{1}{10}-\frac{1}{10}log_2\frac{1}{10}=0.922$

エントロピーは__情報源のあいまいさ__を表しています。値が大きいほどあいまいであり、小さいほどあいまでないことを表します。
上の場合は、天気予報のあいまいさを表しており、A子さんはそれぞれ晴れ、雨、曇りが同じ確率で発生すると予測、すなわち明日の天気の予測ができていない状況であるため、エントロピー（あいまいさ）が大きく、B子さんはおおよそ晴れであると予測しているため、エントロピーが小さくなっています。

上の3元情報源を一般化します。
事象$a_1:p_1$
事象$a_2:p_2$ 
事象$a_3:1-p_1-p_2$

プロットするとこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/854611/5024e7be-d785-d31e-76db-77aa08dd7f56.png)

分かりにくいですが、$p_1=p_2=1/3$で最大値をとっており、また、生起確率$p_1,p_2$が$0$もしくは$1$のとき、すなわち事前にどれが発生するかわかっているとき、エントロピーは$0$（あまいさがゼロ）になります。

#結合エントロピー
事象$x_i$および事象$y_i$の生起確率をそれぞれ$P(x_i)${$i=1,...,M$}および
$P(y_i)${$j=1,...,N$}で表すとし、それぞれの情報源$X,Y$とすると、結合エントロピーは以下で与えられます。
$$
H(X,Y)=-\sum_{i=1}^M\sum_{j=1}^NP(x_i,y_j)log_2P(x_i,y_j)
$$
このエントロピーは$X$と$Y$の値を同時に知った時に得られる平均情報量(あいまいさ)です。先ほどの、エントロピーの多変量化と捉えることができます。

#条件付きエントロピー
情報源$Y$が知られた場合の情報源$X$のあいまいさ$H(X|Y)$は以下で与えられます。
$$
H(X|Y)=-\sum_{i=1}^M\sum_{j=1}^NP(y_j)P(x_i|y_j)log_2P(x_i|y_i)
$$
同様に、情報源$X$が知られた場合の情報源$Y$のあいまいさ$H(Y|X)$は以下で与えられます。
$$
H(Y|X)=-\sum_{i=1}^M\sum_{j=1}^NP(x_i)P(y_j|x_i)log_2P(y_j|x_i)
$$
意味から考えて、情報源$Y$の値を得た後の情報源$X$のあいまいさ$H(X|Y)$は、情報源$X$のあいまいさ$H(X)$以下になります。情報源$Y$に関しても同様です。

#相互情報量
上記の条件付きエントロピーにおいて、$H(X|Y)≦H(X)$、$H(Y|X)≦H(Y)$となっていることを示しました。
情報源$X$と$Y$が互いに関連がある場合、一方の情報源から他方の情報源についてある情報源が間接的に得られたのです。これを定量的に示したのが相互情報量です。相互情報量は次式で示されます。
$I(X;Y)=H(X)-H(X|Y)$
または
$I(X;Y)=H(Y)-H(Y|X)$
図で示すとわかりやすいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/854611/e3b34c08-5149-ca09-d22d-919556874745.png)
この図より、情報源$X$と情報源$Y$が互いに独立であるときは、$H(X|Y)=H(X)$、$H(Y|X)=H(Y)$となり、相互情報量$I(X;Y)$は$0$になることが分かります。また、情報源$X$と情報源$Y$の関連度が高ければ高いほど、図で示すところの黄色の部分が多くなり、相互情報量も大きくなることが分かります。
相互情報量は情報源$X$と情報源$Y$の関連の度合いというイメージですね。
#おわりに
今回、情報量からエントロピー、相互情報量までざっとまとめました。
この記事が誰かのお役に立つと幸いです。
#参考文献
https://www.coronasha.co.jp/np/isbn/9784339012026/
初心者向けの数学入門書

# この記事を書いたきっかけ

2019~2020年からディープラーニングを独学で勉強をはじめました。
特にG検定資格取得のためはじめた線形代数やら大学数学に触れたのがきっかけ。
ちなみに、スペックはバイオ系（俄か理系）の大学卒です。

大学数学は、１、２年の教養でやったくらい。
今は、E資格取得のためもあり、休日をつかってちょこちょこ勉強しています。
レベルはかなり低めなのであしからず。

アドベントカレンダーは初参加なので、お手柔らかに。


# プログラミングと数学
数学世界では有名な結城浩先生の名作。
わかりやすく、きれいな日本語なので、おすすめ。
初心者プログラマ向け？の数学本。

[プログラマの数学](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%81%AE%E6%95%B0%E5%AD%A6-%E7%AC%AC2%E7%89%88-%E7%B5%90%E5%9F%8E-%E6%B5%A9-ebook/dp/B079JLW5YN/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=10YS9XGLB0CVW&dchild=1&keywords=%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%81%AE%E6%95%B0%E5%AD%A6&qid=1607518213&sprefix=%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%81%AE%2Caps%2C243&sr=8-1)

数学ガールシリーズもGJ!


# 大学数学入門書
アマゾンのおすすめで流れたきた大学数学の入門書。
どうやら、東京大学の数学科の方がはじめに手をつける本らしい。
さすが東大！

[大学数学　ことはじめ](https://www.amazon.co.jp/%E5%A4%A7%E5%AD%A6%E6%95%B0%E5%AD%A6%E3%81%93%E3%81%A8%E3%81%AF%E3%81%98%E3%82%81-%E6%96%B0%E5%85%A5%E7%94%9F%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AB-%E6%9D%BE%E5%B0%BE-%E5%8E%9A/dp/4130629239/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=%E5%A4%A7%E5%AD%A6%E6%95%B0%E5%AD%A6+%E3%81%93%E3%81%A8%E3%81%AF%E3%81%98%E3%82%81&qid=1607518032&sr=8-1)

最初はとっつきにくかったのですが、色んな数学本を平行していくとわかるようになってきました。サラーっとながせるように。


# 数学という言語
人工知能研究で有名な新井先生の本。
絵本感覚でスラスラ読めます。

数学は言語
URL：http://www.tokyo-tosho.co.jp/kikan/03/index.html

MATHシリーズもおすすめです。

# 数学英語
ちょっと番外編。
最近出版された本です。日本語でも独特な言い回しの表現が多い
数学を是非英語でも！
都立大の講義で使われた内容もまとめたものらしい。

数学のための英語教本
URL:https://www.kyoritsu-pub.co.jp/book/b10003278.html

# 数式理解をわかりやすく
E資格試験を本格的にはじめる前に購入してみました。
へっぽこ理系なので、これくらいわかりやすく説明してくれるのは非常に助かる！

[文系プログラマーだからこそ身につけたい ディープラーニングの動きを理解するための数式入門](https://www.amazon.co.jp/%E6%96%87%E7%B3%BB%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%81%A0%E3%81%8B%E3%82%89%E3%81%93%E3%81%9D%E8%BA%AB%E3%81%AB%E3%81%A4%E3%81%91%E3%81%9F%E3%81%84-%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%AE%E5%8B%95%E3%81%8D%E3%82%92%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E6%95%B0%E5%BC%8F%E5%85%A5%E9%96%80-%E4%B8%AD%E8%A5%BF-%E9%81%94%E5%A4%AB/dp/4802612664)


# 感想
どの本も良著なので、本屋さんで見かけたときに手にとってみてくれると嬉しいです。
ROSについてまとめてみる #2

この記事は、[ROSについてまとめてみる #1](https://qiita.com/hatt_takumi/items/2cbaab30a237fca24357)の続きです。
＊尚、この記事の記載内容はROS1に関するものです。

#アーキテクチャ
ROSの詳細なアーキテクチャに関しては、こちらの本がとても分かりやすくまとめられています。(indigo)

ROSプログラミング(森北出版株式会社)
https://www.morikita.co.jp/books/book/3010

この本では、ROSのアーキテクチャを

 - ファイルシステムレベル
 - コンピュテーショングラフレベル
 - コミュニティレベル

の三つに分けて記載しているので、本記事でもそれに則ってまとめていこうかと思います。

＊2020/12/18追記
　公式にも、Conceptとして同様の記述がありました。
  http://wiki.ros.org/ja/ROS/Concepts

まずは、ファイルシステムから。

##ファイルシステム
###ワークスペース
ROSでプロジェクトを作成する際は、まずワークスペースを作成します。
そのワークスペースに対してパスを通すことで、各種ツールが使えるようになるわけです。
ワークスペース以下の構成はだいたいこんな感じです。

```
catkin_ws/
 ├ build
 ├ devel
 └ src
```
ROSでのモジュールの基本単位は**パッケージ**です。
開発者は、独自のパッケージや、gitからクローンしてきたパッケージを、/src以下に配置します。
その後、ビルドを行うことで、/build内にバイナリ、/devel内に実行ファイルなどが生成されます。

###パッケージ
パッケージはROSでの最小単位であり、おおよそ以下のような構成となります。

```
package/
    ├ bin/
    ├ include/
    ├ src/
    │  ├ code1.cpp
    │  └ code2.cpp
    ├ scripts/
    │  ├ script1.py
    │  └ script2.py
    ├ launch/
    │  ├ launch1.launch
    │  └ launch2.launch
    ├ msg/
    ├ srv/
    ├ CMakeList.txt
    └ package.xml
```

内容はこんな感じ

<ul>
<li>include/<br>
.hファイルとかを置きます。</li>
<li>src/<br>
ソースコードを置きます。</li>
<li>scripts/<br>
Bashファイルや.pyファイルなどの実行ファイルを置きます。</li>
<li>launch/<br>
.launchファイルを置きます。<br>
(ROSには、roslaunchというノードを一斉に起動するツールがあり、それが実行時に読み込むファイルです)</li>
<li>msg/<br>
メッセージの型を定義するファイルを置きます。<br>
(ROSでは独自のデータタイプを定義することもできます。その場合、ここにその定義を記したファイルを置きます。)</li>
<li>srv/<br>
上のmsgと同様、サービスの型を定義するファイルを置きます。
</li>
<li>CMakeLists.txt<br>
CMake用のビルドファイルです。<br>
(ROSではcatkin_make, catkin buildを介して読み込まれるのが一般的です。)</li>
<li>package.xml<br>
パッケージの基本的な情報が記載されます。パッケージ名、ライセンス情報、依存関係、コンパイルのフラグなどです。</li>
</ul>

基本的にはC++で作成する一般的なプロジェクトの沿っているのかな？と思います。
実体のあるロボットの場合は、メッシュ(.stl, .dae)や機構のデータ(.urdf, .xacro)などもあるかもしれません。
ここに記載されていないフォルダやファイルがあったり、なかったりするかもしれませんが、おおよそこんな感じになっているはずです。
ROSではこのような単位をpackageとして扱い、管理しています。
こうすることでrospackやcatkin_makeなどのツールが使えるようになったり、rosbashの各種コマンドが使えるようになったりします。

###ビルドシステム
現在のROSでは、デフォルトでcatkin_makeというビルドツールがインストールされます。
これはCMakeのマクロとPythonスクリプトを組み合わせたROS専用のビルドシステムで、先述のパッケージに対してビルドを行います。
現在は並列ビルドが可能になったり、いろいろ便利になったcatkin buildという新しいビルドシステムがあり、そちらへ移行が進んでいます。

###roscore
roscoreは、rosのノードがお互いに**メッセージ**を通信できるよう、ノードに接続情報を提供するサービスです。Web系やってた人なら、WebRTCとかがイメージに近いかと思います。また、**パラメーターサーバー**という、グローバルから見える多変量辞書のようなサービスも提供しており、静的なパラメータを格納するのに使われます。

####メッセージ
ROSの分散システムを実現している目玉機能。ROSでは**トピック通信**と呼びます。
ROSでは、一つのプロセスの単位を**ノード**と呼びます。(ROS2ではスレッド単位らしいです)
ノードは、起動時にroscoreに自分の配信(**publish**)するトピックと、購読(**subscribe**)したいトピックを登録します。
あとはroscoreが相手のピアを見つけてくれるので、それ以降はノード同士のピアツーピアの通信となります。
後からノードを追加した場合なども、roscoreがよしなにやってくれます。
メッセージのデータ型に関しても、標準的なものは用意されており、複数言語での実装でも問題のないように取り決められています。これらのデータ型は独自に設定が可能な上、headerにタイムスタンプやフレームIDを持たせることもでき、メッセージの時系列的な管理もできます。

####サービス
ROSでは、上記のメッセージのようなPub/Sub型の通信のみでなく、Req/Rep型(クライアント-サーバ型)の通信も提供しています。サービスとは、あるノードが提供する関数(サービス)を、他のノードが利用する仕組みのことです。
使用頻度が高くなく、短い時間で処理が終わるものに適しています。
センサーのスイッチを入れたり、シャッターを押したりといったような操作などです。


\#3へつづく
#参考
ROS講座64 ROSパッケージのディレクトリ構成
https://qiita.com/hatt_takumi/items/2cbaab30a237fca24357

ROS
http://wiki.ros.org/

プログラミングROS(O'Reilly Japan)
https://www.oreilly.co.jp/books/9784873118093/

ROSプログラミング(森北出版株式会社)
https://www.morikita.co.jp/books/book/3010
【Java】importが不要なクラス

最近JavaSilver教本の代名詞と言える黒本を購入しました。
安い本ではありませんが、非常に内容が濃い上に解説がわかりやすい名著です。
しばらくこの本を中心に学習をしていきたいとおもいます。

Javaにおける、import不要のクラスについてまとめました。

# import不要のクラスとは

- java.langパッケージに属するクラス
- 同じパッケージに属するクラス

です。

## java.langパッケージ

このjava.langパッケージはJavaの基本的な機能がまとめられた パッケージです。

頻繁に利用するので「コンパイラが勝手にimportをしてくれる仕組み」になっています。

そのため、インポート宣言をする必要がありません。また、同じパッケージに属するクラスのインポート宣言も省略が可能です。

また、インポート宣言時にアスタリスクをつかって、そのパッケージに属するすべてのクラスをインポートが可能です。

```java
//パッケージに属するすべてのクラスのインポート
import パッケージ名.*;
// java.util.*;パッケージのインポート
import java.util.* ;
```

ただし、指定したパッケージに属するクラスに限定されるので、サブパッケージに属するクラスがインポートされることはありません。

### 【特徴 / メリット】

java.langパッケージの内容は以下の様のものです。

- **文字列操作**
- **データの変換**
- **数値演算**
- **スレッド処理**

といった基本的な機能ができるクラスが用意されています。

普段よく使うSystemメソッドの他にも、String、StringBuffer、StringBuilder、Boolean、Byte、Integerなど様々なクラスがjava.langには用意されています。

## 【まとめ】

繰り返しになりますが

- java.langパッケージに属するクラス
- 同じパッケージに属するクラス

はインポート宣言をする必要はないということは覚えておく。

パッケージという仕組みの理解はもう少し深める必要がありそうです。

## 参考文献・記事

- [【Java】なんでimportしなくても「System.out.println」が使えるのか｜データサイエンスナビ](https://www.torikun.com/entry/java-system-out-println/)

- [徹底攻略Java SE 11 Silver問題集[1Z0-815]対応](https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5Java-SE-11-Silver%E5%95%8F%E9%A1%8C%E9%9B%86-1Z0-815/dp/4295007625/ref=pd_lpo_14_img_0/356-5238196-1895250?_encoding=UTF8&pd_rd_i=4295007625&pd_rd_r=1c21865b-a9fe-43e8-ac01-46170e44abca&pd_rd_w=9El0Q&pd_rd_wg=hh5Hc&pf_rd_p=4b55d259-ebf0-4306-905a-7762d1b93740&pf_rd_r=72AVH18EM90CKG00CH5W&psc=1&refRID=72AVH18EM90CKG00CH5W)
【失敗談】AWS無料枠のつもりが、課金されててウゲってなった件の共有（※後日、返金してもらえた話を追記）

先ほど、不審なカード利用明細があがってきて、よく見ると、「AMAZON WEB SERVICES」と書かれ、1700円ほどの利用になってました。

とりあえず、AWSに久しぶりにログインしてみると、

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448092/b487e04b-91e2-ab33-775d-d1ae76f33318.png)|
|:-:|

見事に課金されてる…orz

ちょうど１年くらい前にRDSとEC2を試して使ってみて、その後、消したつもりだったのですが、残ってたのでしょうねぇ。

とりあえず、RDSがネックなので、そちらを止めるために確認。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448092/8db2ef2e-77e0-8cf8-79f6-50a6fd2897e9.png)|
|:-:|

特に、インスタンス立ち上がっているわけではなく、、、
んー。。としばらくハマってたのですが、ここで「はっ！！」と気付きました。

別のリージョンじゃね？？？？？

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448092/0a59c2b5-90ba-9d89-0135-7aeb854a48e1.png)|
|:-:|

見事に、オレゴンで作っておりました。マジかよorz
EC2も一緒でした。
速攻削除して、完了。( ´Д｀)=3 ﾌｩ


皆さん、インスタンスの消し忘れ確認は、**海外のリージョン**のインスタンスまで確認しましょうね(´;ω;｀)


##2020/12/14 以下２点の後日談を追記
###①ちゃんと０円になっていた。
後日確認して、ちゃんと0円になっていることまで確認しましたっと。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448092/6dc32730-a82f-a002-57e1-f2ae0852d56e.png)
これで一安心ですね。

###②返金してもらえた(笑)
実は、この課金見てすぐに、ダメ元で、サポートセンターに「気づかずに無料枠を超えてしまい、課金されてましたけど、どうしても払わなければならないのでしょうか？」と、問い合わせたところ、返信で、「今回だけは返金＆まだ引き落としていなものは請求から取り消します」と来てました！(∩´∀｀)∩わーぃ。
言ってみるもんですね！！

これから気を付けよう
【Swift】遅延実行〜defer文〜

#遅延実行 とは
遅延実行とは、特定の文をそれが記述されているよりも後で実行することを指します。

様々な遅延実行方法がありますが、
個人的に簡単だなと思ったdefer文について紹介します。

##defer文
defer文において、{ }内に記述されているコードは、
defer文が記述されているスコープの退出時にリセットされます。

**後の実行フローの内容にかかわらず、
スコープの退出時に確実に実行されていてほしい処理の記述に利用することが多いです。**

```swift

defer {
   defer文が記述されているスコープの退出時に実行される文
}
```

action()関数を作成し、defer文内で変数valueに対して値を代入しています。

**値の更新は関数の実行の終了後に行われるため、
関数が値を返す時点では変数valueの値は初期値の０のままです。**

そのため関数の戻り値は０ですが、
関数の実行後に変数valueにアクセスすると、更新された値になっていることを確認できます。

```swift

var value = 0

func action() -> Int {
    defer {
        value = 10
    }
    
    return value
}

print(action())
print(value)

実行結果
0
10
```

制御構文について学んでいたら、
簡単に使える遅延処理を見つけたのでメモがてら共有しました！

実際に使ったことはないですが意外と使えそうなテクニックなので、
実際に使用して良かったら詳細を記事にしてみようかと思います。

以上、最後までご覧いただきありがとうございました。
localhost の WebAssembly は遅いので気を付けろ！

# TL;DR

**wasm でパフォーマンスみる時は Netlify とか使おう!!!**

タイトルのままなんですが、お手伝いしている [iCARE](https://dev.icare.jpn.com/dev/) さんのアドベントカレンダーの記事で安直に 「 Rust で Markdown 変換したら爆速だ！」って記事を考えていたんですが、ある程度作ったところでどうもスピードが出ない、、、

というか文字列を渡して返すだけの関数を実装しても遅い、、、

```rust
pub fn strait_string(source_text: &str) -> String {
    source_text.to_string()
}
```

データの受け渡しのオーバーヘッドが問題かと思って、内部での実行速度を確認したのに遅い、、、

実は v8 がめっちゃ速いのではないか、、、などと考えて当初予定していたタイトルを変えて何とか記事をでっち上げるかなぁ、、、と思って GitHub Pages で [サンプルページ](https://beijaflor.github.io/wasm-markdown-bench/) をアップしてみたら、、、

**ちょっと！！！爆速なんですけど？？？**

localhost|gh-pages
---|---
![Screen Shot 2020-12-09 at 21.29.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52756/67625b87-174b-e19b-0f08-b1dc09977942.png)|![Screen Shot 2020-12-09 at 21.29.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52756/5f676c43-b5d9-8f2e-3e19-e6c0850c0bd7.png)

単純な逆順変換に至っては10倍くらい違う、、、
ということなので、 WebAssembly の開発をする時はローカルホストは避けましょう。という学びを得ました

---
ちなみに検証記事はこちらです

[Rust と WebAssembly で爆速な Markdown Editor を作ってみる](https://zenn.dev/beijaflor/articles/da789ea779c005)
PHPのクラスについて

##はじめに

PHPのクラスとは関数や変数を組み合わせた集合体のこと。
クラスの中で変数や定数をプロパティ、関数をメソッドと呼んでいる。



##クラスを定義し、コードを書いてみた

例えば、Maleというクラスを定義する場合、class(クラス名)と記載する。PHPではクラス名は慣例的に大文字から始める。<br>

```
class Male{
```

プロパティ(クラス内で使われる変数、定数)を記載

```
public $name;
```

定数の場合はconst,　変数の場合はpublic, protected, privateを用途毎に使用する
public, protected, privateをアクセス修飾子と呼び、以下のような違いがある。<br>

**public = どこからでもアクセスが可能。
protected = 定義されたクラスと継承クラスからアクセスが可能。
private = 同じクラス内からのみアクセス可能。**
<br>


コンストラクターはクラスからオブジェクトがnewで予備だされるときに自動で呼び出されるメソッド(メソッドはクラス内では関数のこと)<br>
プロパティをメソッド内に呼び出すためには疑似変数$thisを使用する(定数の場合はself::定数を使用する)

```
public function __construct($name){
     $this->name = $name;
}
```

インスタンスを生成し、名前suzukiを代入。

```
$male = new Male('suzuki');
echo $male->name;
```

出力結果

```
suzuki
```
<br>

##クラスの継承


クラスを継承するときはextendsを使用する。
extendsを使うとサブクラス(ここではHumanB)はHumanというクラスのメソッドを引き継ぐことができる。

```
<?php
class Human{
    public $name;
 
    function __construct($name){
        $this->name = $name;
    }
    public function sayHello() {
        echo "Hello, $this->name from A class";
    }
}
 
class HumanB extends Human {
 
    public function sayHello() {
        echo "Hello, $this->name from B class";
    }
}
    
$user1 = new Human("Suzuki Taichi"); 
$user2 = new HumanB("Tanaka Kazuya");
 
$user1->sayHello(); // Hi, Aoba Suzukaze from User class
$user2->sayHello(); 
?>
```

出力結果

```
Hello, Suzuki Taichi from A class 
Hello, Tanaka Kazuya from B class
```


サブクラスでの親クラスのメソッドが引き継がれている。
Power Appsでお手伝いアプリを作成してみた2

#あらすじ
画面の構成とテーブルの構成を行いました。

#MicrosoftDataverseの設定
追加で列を作成します。

|列|データ型|
|:-:|:-:|
|総ポイント数|整数|
|user|テキスト|

#キャンパスアプリ作成
キャンバスアプリの作成
##とりあえずのHome画面
それぞれのボタンでそのページに行けるようにする
・お手伝い項目
・ポイント
・お手伝い報酬
例えば、「お手伝い項目」だと、

```
Navigate(Helpitem,ScreenTransition.Cover)
```

こんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404009/4aca1bf1-549c-d87a-c491-36bca70123f0.png)

##お手伝い項目画面
1.MicrosoftDataverseにお手伝いをしてほしい項目とポイントを入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404009/063902f4-e781-dc33-95e7-35e34500b667.png)
2.キャンバスアプリにgalleryを入れてあげて、今回のテーブルを参照させる。
3.表示させたい列を「ThisItem」で表示させる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404009/63314e7a-5c0a-6d62-45cc-f0ae1ad49d5a.png)
4.表示させたいものを出したら、上に透明なボタンをおいて、ポイントを加算できるようにする。
※・今回は「総ポイント数」と「ポイント」の列がある！
　・特定のレコードを更新したいため、user列をつかう
　・総ポイント数とお手伝いをしたポイントを足し算する

```

UpdateIf(お手伝いアプリ,user=User().Email,{ThisItem.総ポイント数:ThisItem.総ポイント数+ThisItem.ポイント})
```
そうするとMicrosoftDataverseでは、ポイントが集計されて表示されるようになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404009/bea457aa-b656-f0c7-5ff0-ca7a0f8b04a4.png)
ここにポイントが入ることによって、ホーム画面のポイント表示のところに、65ポイント表示されている

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404009/90bf497b-c36b-ab10-f0a1-48c362612665.png)

#次回
お手伝い報酬とポイント表示の式！
Logicool G HUB でプロファイルの切替が行われない時の対応

細かい検証は行っておりませんので、自己責任でお願いします。
初稿：Logicool G HUB バージョン2020.10.6293
追記1：Logicool G HUB バージョン2021.9.7463

# アプリケーションのパス指定をして追加したのに・・・
G HUBにおいて、とあるアプリケーション用のプロファイルを作成したのに、いざそのアプリケーションのウィンドウをアクティブにすると、なぜかデスクトップのプロファイルに切り替わってしまう。
ということが起きました。

# プロファイルの情報が保存されているファイルを見る
この記事[Logicool G HUB でプロファイルの切替が行われないゲームを認識させる方法（Steamのゲーム限定）](https://qiita.com/JargonPatch/items/781ad12ac7bd127bfe46 "https://qiita.com/JargonPatch/items/781ad12ac7bd127bfe46")の原因調査で中身を確認して分かっていたことだが、
C:\Users\"ユーザ名"\AppData\Local\LGHUB 内の
settings.json
には、G HUB上で作成したプロファイルの設定が書かれている。

<dl>
<dt>※追記1</dt>
<dd>いつの間にかsettings.jsonが使われなくなっていて、代わりにsettings.dbというSQLiteのデータベースファイル内に、データとしてsettings.jsonの内容が記述されるようになっていた。</dd>
</dl>


中をのぞいてみると

```json
  "applications": {
    "applications": [
      {
        …省略
      },
      {
        …省略
        "databaseId": "420fd454-0c36-499d-bde4-146823b16147",
        "lastRunTime": "20201209T113503.725991",
        "name": "APPLICATION_NAME_DESKTOP",
        "userPaths": [
          "追加したアプリケーションのパス"
        ]
        "version": 2
      },
     ]
```

という箇所があり、この状況を簡単に説明すると
・G HUB上では、**デスクトップ用**のプロファイルは、**アプリケーションの追加**設定ができないはず
・それなのに設定ファイル上では、なぜかデスクトップ用のプロファイルに、追加したアプリケーションが含まれている
・そのアプリケーションのパスを指定してプロファイルを作成しても、デスクトップ用のプロファイルにしか切り替わらない

<dt>※追記1</dt><dd>
この現象は、アプリケーションの追加設定の際、ファイル選択ダイアログ画面が出ているときに、デスクトップをアクティブにしてしまうと、選んだ実行ファイルが追加されるプロファイルが、デスクトップのプロファイルになってしまうということだった。
<br>
ー再現例ー
ブラウザ用にchrome実行ファイルが設定されているプロファイルにfirefoxの実行ファイルを追加するという状況で

1. G HUBのゲーム＆アプリケーション一覧画面で、chromeのプロファイルを選択
1. 設定タブから、カスタムパスを追加を押してファイル選択ダイアログ画面を出す
1. firefoxの実行ファイルを選択する前に、デスクトップをアクティブにして、G HUBでデスクトップのプロファイルをアクティブにする
1. G HUBでデスクトップのプロファイルがアクティブになっている状態でfirefoxの実行ファイルを選択する</dd>

#というわけで
settings.jsonを直接編集して、デスクトップ用のプロファイルの"userPaths":[]の項目を削除するしかなかった。

もしくは既存プロファイルにアプリケーション追加する際は別のプロファイルをアクティブにしないように気を付ける。

#さいごに
前の記事
[Logicool G HUB でプロファイルの切替が行われないゲームを認識させる方法（Steamのゲーム限定）](https://qiita.com/JargonPatch/items/781ad12ac7bd127bfe46 "https://qiita.com/JargonPatch/items/781ad12ac7bd127bfe46")
でやったことは、裏技みたいなものだが、今回の件に関しては明らかな不具合だと思います。
もしかしたらアプデでこのような事態にならないような修正が入っているかもしれません。
サードパーティー製でG HUBのまとも版みたいなソフトがあれば欲しいですね。
【備忘録】Swift 実践入門について　第8章

Swift 実践入門のまとめ。
分からない部分の抜粋も記載し、解決できたら随時更新していきます。
なお、ここに記載している以外でも「わけわからん…」となっている部分も多々ありますが、
今は必要ない、と言い聞かせて飛ばしています。


第8章
型の種類　struct / class / enumそれぞれの特徴
理解度：70％くらいか

前提として、ほとんどの場合でstructを使う。
structとclassの違いは、structでは変数に値を受け渡す場合、この値のコピーとして代入される。
したがってvar a = “abc”, var b = “def”でa = bと代入し、bの値を後で変更したとしても
a = “abc”のままである。
逆にclassではbの変更に合わせてaも同じく変更される。
またclassでは継承を使うことができる点もstructとは異なる。




8-3 構造体
以下構造体の中身。
struct SomeStruct {
var a : Int
let b : String　　//型の定義まで
init (a : Int, b : String) {
self.a = a
self.b = b　　　//ここで初期化
}
	func printA() {
print(a)
}
}
let c = SomeStruct (a : 123, b : “abc”)
c.PrintA()　　　//123


8-4 クラス
上記の構造体にプラスして、継承があるためoverride、super、finalなどが登場する。
finalはfinal funcで再定義を禁止し、final classで継承を禁止する。
継承で初期化の場合、2段階の初期化が必要になりinit (a : Int)のところをinit(a : a)などになることがある。


8-5 列挙型
enumとcaseを使って定義する。バラバラにある食べ物を例えば「お菓子」「肉類」「魚類」など種類に分けて列挙する。そうすることで可読性が高まる。
あのページどこだっけ？を解決する最強のChrome拡張

隠していたんだけれども、実はchromeには最強の拡張機能がある。

WorldBrain's memex
https://chrome.google.com/webstore/detail/worldbrains-memex/abkfbakhjpmblaafnpgjppbmioombali?hl=en

これである。

ブックマークとか、ハイライトとか、タグ付けしたページをインデックスしてくれて検索することができる。
あの情報どこに書いていたっけ？っていう時に便利。
よく解決策をタグ付けしたり、ハイライトしたりしている。
error->Google->find solution->add tag
みたいな感じ
後で検索する時に便利

実際見たほうが早いと思うので。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516893/65bb94cf-75c0-a8fd-1ba1-b220106501cd.png)

こんな感じでグーグルの検索結果の横に、自分の履歴からページを出してくれる。
（他にもタグ付けたりブクマしたりマーカー引いたりできる

素晴らしい。グレート。ワンダフル。

これで多くのクロームタブメモリ枯渇難民が救われることだろう。君たちのメモリに救いを。
mysql.server stopでフリーズする時の解決策

先日、mariaDBサーバーを終了するために"$mysql.server stop"をターミナルで走らせたところ、実行後ターミナルがフリーズした問題が発生したので、その原因と解決策について書いておきます。

##不具合

実行環境
・Mac OS Catalina 10.15
・MariaDB 10.5.8

```console
$ mysql.server start
Starting MariaDB
.201209 18:59:04 mysqld_safe Logging to '/usr/local/var/mysql/your_user_name.local.err'.
201209 18:59:04 mysqld_safe Starting mariadbd daemon with databases from /usr/local/var/mysql
SUCCESS! 

$ mysql.server stop
#カーソルが点滅しフリーズ
```

##状況

別ターミナルを開いて実行中のプロセスを確認してみる。

```console
$ ps -ax | grep -e "mysql" -e "mariadb"
55377 ??         0:00.03 /bin/sh /usr/local/Cellar/mariadb/10.5.8/bin/mysqld_safe --datadir=/usr/local/var/mysql --pid-file=/usr/local/var/mysql/your_user_name.local.pid
55450 ??         0:00.74 /usr/local/Cellar/mariadb/10.5.8/bin/mariadbd --basedir=/usr/local/Cellar/mariadb/10.5.8 --datadir=/usr/local/var/mysql --plugin-dir=/usr/local/Cellar/mariadb/10.5.8/lib/plugin --log-error=/usr/local/var/mysql/your_user_name.local.err --pid-file=/usr/local/var/mysql/your_user_name.local.pid
56060 ttys000    0:00.01 grep -e mysql -e mariadb
```
sqlサーバーはに関連したプロセスがまだ残っていそう。

フリーズ中のターミナルのウインドウを閉じようとしてみると、、

![スクリーンショット 2020-12-09 21.02.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584114/cd16adb1-b9de-c834-0c90-3b0adefd2653.png)

どうやらsh, suとやらが終わらないらしい。

##原因
[こちらの記事](https://www.fixes.pub/program/47350.html)によると、mysql.server stop実行時に内部でsu_killというメソッドが呼ばれてるようなのですが、その時mysqlという名前のOSユーザーで実行することがデフォルトで設定されてるみたいで、mysqlという名前のユーザーがOS側にいないと停止できないみたいです。

##解決策
一旦ターミナルのウインドウは閉じてしまって、killコマンドでプロセスを終了させましょう。

```console
$ kill 55377
$ kill 55450
```
killのあとの数字はps -ax | grep -e "mysql" -e "mariadb"で出てきたプロセスIDを指定してください。

ユーザー名を確認します。

```
$echo $USER
> your_user_name
```

次に、/usr/local/bin/mysql.serverを編集します。

```console
$ vi /usr/local/bin/mysql.server
```

```/usr/local/bin/mysql.server
~
#user='mysql'
user='your_user_name'
~
```
元々あるuser='mysql'をコメントアウトし、echo $USERで返ってきたyour_user_nameを、新たにuser=で指定します。

```
$ mysql.server start
Starting MariaDB
.201209 21:15:51 mysqld_safe Logging to '/usr/local/var/mysql/your_user_name.err'.
201209 21:15:51 mysqld_safe Starting mariadbd daemon with databases from /usr/local/var/mysql
 SUCCESS! 
$ mysql.server stop
Shutting down MariaDB
. SUCCESS! 

```
終了することができました。
バックエンドにおけるTypescriptのテスト例

## はじめに
DBへのinsert処理を含むAPIのApplication ServiceレベルでのJestのテスト例です（with TypeORM）。固定のfixtureデータが既にDBに挿入済みの前提で、update処理の場合も考え方は同じです。

## サンプルコード

```typescript
describe("UserApplicationService", () => {
  describe("createUser", () => {
    it("should create a user", async () => {
      // 初期状態のレコード数の確認
      const [, userCountBefore] = await userRepository.findAndCount();

      // 関数の実行
      const createdUser = await UserApplicationService.createUser(
        {
          name: userFixture.admin.name,
          role: Role.Admin
        }
      );

      // 関数実行後のレコード数のカウント
      const [, userCountAfter] = await userRepository.findAndCount();

      // DBにレコードが追加されているか確認（されていればエラーを出力、データのリセットの必要もなし）
      assert.strictEqual(userCountAfter, userCountBefore + 1);

      // アサーションの準備が必要であればここで（DBから特定のレコードの状態を取ってくるなど）

      // アサーション
      try {
        assert.strictEqual(
          createdUser.name,
          userFixture.admin.name
        );
        assert.strictEqual(
          createdUser.role,
          Role.Admin
        );
      } finally {
        // DBのfixtureデータのリセット
        // finally節で包まないと上記どこかでfailした際にリセットされない
        await userRepository.remove(createdUser);
      }
    });
  });
});
```
（mochaなどと違ってテストのブロックごとに個別に`after()`等ができないようなので、各`it`内でリセットするようにしています。）

ポイントは以下の通りです。

- 対象の関数を実行してアサーションする前にDBにレコードが追加されているかを確認
- 対象の関数によってinsertされたDBのレコードを、アサーションした後に削除（fixtureデータをリセット）。insertではなくupdateの場合（もしく複数テーブルにおけるinsert/updateの組み合わせ）も同様にここでリセット処理を行う。
- リセット処理はfinally節で包む（そうしないとassertでfailした際にリセット処理が走らなくなる）

テスト用のfixtureに関しては、[この記事](https://qiita.com/taisuke-j/items/f4c4cfcb9349a993c14b#fixture%E3%82%92%E3%81%8D%E3%81%A1%E3%82%93%E3%81%A8%E8%A8%AD%E8%A8%88%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%81%8B)の「Fixtureをきちんと設計しているか」というセクションにも関連した内容を書いています。

## まとめ
`finally` 節で包むのを忘れてしまい、後続のテストがコケた際に原因を突き止めるのに少し手間がかかったことがあったので、今回軽くまとめておきました。
Flutter(Dart)で重複のない乱数を生成する




##Flutter(Dart)で重複のない乱数を生成する
「ダステンフェルドのアルゴリズム」とか「フィッシャーイェーツのシャッフル」と言われているランダムシャッフル処理です。

[1,2,3,4,5] => [3,5,2,1,4]　のような感じ


```
import 'dart:math';

class NumberShuffle {
  final rand = new Random();

  List<int> getShuffleList(int inputNum) {
    //順に格納された配列を用意
    List<int> list = List.generate(inputNum, (index) => index);

    for (int rest = inputNum - 1; rest >= 0; rest--) {
      //ランダムに選択
      int selectIndex = rand.nextInt(rest + 1);

      //一番最後と入れ替え
      int temp = list[selectIndex];
      list[selectIndex] = list[rest];
      list[rest] = temp;
    }

    return list;
  }
}
```
もしかしてライブラリがあったら教えていただけるとうれしいです。
　

##追記
これだけのことでしたね。

```
var list = [1,2,3,4,5];
list.shuffle();
print(list);
```

ライブラリではなかった…
RaspberryPi への LAMP 環境の構築

### RaspberryPiにLAMP環境を準備するメモです。
この記事を書くにあたってのRaspberryPi OSのバージョンは次の通りでした。 

> pi@raspberrypi:~ $ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description:    Raspbian GNU/Linux 10 (buster)
Release:        10
Codename:       buster
pi@raspberrypi:~ $


参考としたページは、次のページです。
ありがとうございます。
というか、先達のページをなぞっただけの投稿です。
http://marchan.e5.valueserver.jp/cabin/comp/jbox/arc112/doc11205.html


## Apache2 と phpのインストール
apache2をインストールします
>sudo apt update
sudo apt install apache2

phpをインストールします

>sudo apt install php php-cli php-curl

userdirでもphpが使えるようにapache2の設定を行います。

>sudo a2enmod userdir

次のファイル中でuserdirのphpを止めているので、コメントアウトします。
>sudo vi /etc/apache2/mods-enabled/php7.3.conf
`##<IfModule mod_userdir.c>`
`##    <Directory /home/*/public_html>`
`##        php_admin_flag engine Off`
`##    </Directory>`
`##</IfModule>`

apache2を再起動して反映します。

>sudo systemctl restart apache2

確認のため、.phpのファイルを書きます
>pi@raspberrypi:~/public_html $ cat> index.php
`<HTML><HEAD></HEAD>`
`<BODY>`
`<?php`
`    phpinfo();`
`?>`
`</BODY>`
`</HTML></HTML>`
Ctrl+C

ブラウザでファイルを開きます。
http://localhost/~pi/


## MySQL/MeriaDBのインストール

MySQL/MeriaDBをインストールします。

>sudo apt-get -y install php-mysql
sudo apt-get install mariadb-server
sudo systemctl start mariadb.service

初期設定を実施します。

>sudo mysql_secure_installation


>>Set root password? [Y/n] y
New password: 
Re-enter new password: 
Password updated successfully!
Reloading privilege tables..
 ... Success!


>>Remove anonymous users? [Y/n] y
 ... Success!

>>Disallow root login remotely? [Y/n] y
 ... Success!

>>Remove test database and access to it? [Y/n] y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

>>Reload privilege tables now? [Y/n] y
 ... Success!

>>Thanks for using MariaDB!



## phpmyadmin のインストール

 sudo apt-get -y install phpmyadmin

パッケージの設定

 │    [*] apache2                                                                                                                                           

 │ phpmyadmin 用のデータベースを dbconfig-common で設定しますか?              │                    <はい>                                                                                                     

パッケージの設定

 │ phpmyadmin 用の MySQL アプリケーションパスワード:                                                                                                        

>
pi@raspberrypi:~/public_html $ sudo mysql -u root -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 71
Server version: 10.3.27-MariaDB-0+deb10u1 Raspbian 10
>
MariaDB [mysql]> UPDATE user SET plugin='' WHERE User='root';
Query OK, 1 row affected (0.037 sec)
Rows matched: 1  Changed: 1  Warnings: 0
>
MariaDB [mysql]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.009 sec)



以上です。
次は、QRコードリーダ使って、jukebox作ります。
クリスマスソング用
ArchUnit 実践：依存関係を逆転した Layered Architecture ではインフラストラクチャ層は他の層のインターフェイスにのみ依存できる

```
// 実行環境
* AdoptOpenJDK 11.0.9.1+1
* JUnit 5.7.0
* ArchUnit 0.14.1
```

## アーキテクチャテストのモチベーション

2 日目の [ArchUnit 実践：依存関係を逆転した Layered Architecture のアーキテクチャテスト](https://qiita.com/kawanamiyuu/items/a4a3fd8d0c19f0f7801d) の、依存関係を逆転した Layered Architecture では、インフラストラクチャ層は依存関係の最上位に存在します。これは対象のクラス（インターフェイス）に代わって技術的詳細を実装するためであり、インフラストラクチャ層のクラスが他の層に依存してよいのは、そのインターフェイスを実装する場合のみです。他の層の具象クラスへの依存は禁止されるべきです。

## アーキテクチャテストの実装

```java
package com.example;
　
import com.tngtech.archunit.base.DescribedPredicate;
import com.tngtech.archunit.core.domain.JavaClass;
import com.tngtech.archunit.core.domain.JavaClasses;
import com.tngtech.archunit.core.importer.ClassFileImporter;
import com.tngtech.archunit.core.importer.ImportOption;
import org.junit.jupiter.api.Test;

import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.classes;

class ArchitectureTest {

    // 検査対象のクラス
    private static final JavaClasses CLASSES =
            new ClassFileImporter()
                    .withImportOption(ImportOption.Predefined.DO_NOT_INCLUDE_TESTS)
                    .importPackages("com.example");

    @Test
    void インフラストラクチャ層のクラスは他の層のインターフェイスにのみ依存できる() {
        classes().that().resideInAPackage("com.example.infrastructure..")
            .should()
            .onlyDependOnClassesThat(new DescribedPredicate<>("他の層のインターフェイス") {
                /**
                 * @param clazz 依存先のクラス
                 * @return 依存先のクラスが他の層の具象クラスである場合、false
                 */
                @Override
                public boolean apply(final JavaClass clazz) {
                    if (! clazz.getPackageName().startsWith("com.example")) {
                        // サードパーティーライブラリなどへの依存はOK
                        return true;
                    }
                    if (clazz.getPackageName().startsWith("com.example.infrastructure")) {
                        // 同じインフラストラクチャ層のクラスへの依存はOK
                        return true;
                    }
                    if (clazz.isInterface()) {
                        // 他の層のインターフェイスへの依存はOK
                        return true;
                    }

                    return false;
                }
            })
            .check(CLASSES);
    }
}
```
RDS Proxyを使ってLambdaからRDS接続する時にハマったこと【備忘録】

# はじめに

LambdaでRDS接続する際にRDS Proxyを使用する方法について、優良な記事がいくつかあるので今回は割愛します。

「RDS Proxyって何？」や「基本的な設定方法教えて！」等は以下記事を参照すると良いでしょう。（私も参考にさせていただきました。）

### 参考記事
- [祝GA‼︎【Go】Lambda + RDS 接続にRDS Proxyを使ってみた](https://qiita.com/maika_kamada/items/6eb6a40c17b4b8995acb)
- [LambdaでRDS Proxy経由でAurora(MySQL)に接続する（IAM認証）](https://qiita.com/takeshi_hirosue/items/a76d974a8bca36db42b6)

# はなすこと
初心者である自分が設定した時にハマったポイントをはなします。

## LambdaにVPC設定を忘れないように

RDSリソースはVPC内にあるのに対し、LambdaはAWSが管理するネットワーク上に作成されます。
今回に限らず、LambdaでVPC内のリソースにアクセスする場合はLambdaのVPC設定を忘れないようにしましょう。

AWS公式
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-vpc.html


Lambda設定画面↓
![スクリーンショット 2020-12-09 20.55.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376573/c5ec98a0-6ed5-e91f-b6c8-d5942d7485e7.png)



## SGのアクセス許可も忘れずに
RDS Proxyに設定したSGにはLambdaからのインバウンドルールを、
RDSに設定したSGにはRDS Proxyからのインバウンドルールを
付与してあげてください。

##Secret Manager シークレットのユーザ名とパスワード設定

RDS ProxyはSecret Managerのシークレットを使用してMySQLにアクセスします。

認証情報のうち、ユーザ名とパスワードは
MySQLにアクセスできるユーザ名とパスワードに一致するように作成しましょう。

![スクリーンショット 2020-12-09 21.04.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376573/827f7ff3-0181-4d49-dd72-015a47c7cd60.png)