OmniAICreator/Qiita-1.07M huggingface dataset:
無料の学習コースによってDatabricks認定試験の取得が簡単になりました

[Getting Databricks Certified Is Now Easier With Free Overview Courses \- The Databricks Blog](https://www.databricks.com/blog/2022/09/09/getting-databricks-certified-now-easier-free-overview-courses.html)の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

[Databricks Academy](https://www.databricks.com/learn/training)は、データ&AIのペルソナ向けのトレーニングや認定試験を提供しており、ユーザーや企業は少ない時間でより生産的かつ多くのことができるようにしています。データアナリシスからMLに至るまで、ユーザーは自身の経験レベルやテクノロジーに関係なく、新たなスキルをマスターすることができます。我々はお客さまが、我々の認定試験に業火することで、自分たちの組織、更には自分のキャリアに対しても大きなインパクトをもたらしているのを目撃しています。

本日、我々はユーザーの皆様が日々の仕事をより効率的に行い、企業がパフォーマンスを増加するのをお手伝いするために、[データアナリシス](https://www.databricks.com/jp/product/databricks-sql)、[データエンジニアリング](https://www.databricks.com/jp/product/data-lakehouse)、[機械学習](https://www.databricks.com/jp/product/machine-learning)の概要を説明する無料のコースを発表できることを嬉しく思っています。Databricksの認定を受けることで、ユーザーは最も困難なデータ&AIの問題を解決する役に立つ知識に対して自信を深めることができます。

お客さまたちはすでに価値を確認しています。Valorem ReplyのパートナーであるAndrew Fletcherはこう述べています。「我々は認定試験が個人や組織にとって真に価値のあるものだと考えています。個人に対しては、キャリアの過程で彼らを認定プロセスに組み込んでいます。これは構造化されており、製品の複雑性を理解し始めることができ、チームとしてビジネス課題を解決し、信頼性を確立することができます。」

# あなたのスキルとニーズに合わせてトレーニングを仕立てましょう

それぞれの認定試験の概要を説明するコースには、ユーザーが数多くのキー領域で成長し、自身の知識を試す助けになる学習目的が設定されています。以下の認定試験概要コースは、[Databricks Academy](https://www.databricks.com/learn/training/login)から無料で利用することができます。

- **Databricks Certified Associate Developer for Apache Spark Exam**には以下が含まれます。
    - Apache Sparkアーキテクチャの基礎
    - カラムの選択、名称変更、操作、行のフィルタリング、削除、ソート、集計、データフレームの読み書き、パーティショニング、Spark SQL関数を用いたUDFの操作を含むそれぞれのデータ操作タスクを完了するためにSparkデータフレームの適用。

- **Databricks Certified Data Analyst Associate Exam**には以下が含まれます。
    - Databricks SQLの概要と機能
    - Databricksのツールを用いたデータの管理とベストプラクティス
    - レイクハウスでのタスクを完了するための構造化クエリー言語(SQL)の活用
    - プロダクションレベルのデータビジュアライゼーションとダッシュボードの作成
    - 一般的なデータ分析課題を解決するための分析アプリケーションの開発

- **Databricks Certified Data Engineer Associate Exam**には以下が含まれます。
    - Databricksレイクハウスプラットフォームとツールの活用
    - Apache Spark SQLとPythonを用いたETLパイプラインの構築
    - インクリメンタルなデータ処理
    - データエンジニアリングアプリケーションのためのプロダクションパイプライン、Databricks SQLのクエリーとダッシュボードの構築

- **Databricks Certified Data Engineer Professional Exam**には以下が含まれます。
    - Databricksプラットフォームと開発ツールのメリットと活用
    - SparkとDelta Lake APIを用いた最適化されクレンジングされたデータ処理パイプラインの構築
    - 一般的なデータモデリングのコンセプトに関する知識を用いたレイクハウスへのデータモデリング
    - デプロイメント前にデータパイプラインのセキュリティ、信頼性、監視、テストを保証

- **Databricks Certified Machine Learning Associate Exam**には以下が含まれます。
    - 機械学習ワークフローにおけるDatabricks Machine Learningとその機能の活用
    - 機械学習ワークフローにおける適切な実装の意思決定
    - Spark MLとその他のツールを用いた大規模機械学習ソリューションの実装
    - 古典的な機械学習モデルの特性に対する高度なスケーリングの理解

- **Databricks Certified Machine Learning Professional Exam**には以下が含まれます。
    - 機械学習のエクスペリメントとバージョンコントロールの管理
    - 機械学習モデルライフサイクルの管理
    - 機械学習モデルのデプロイに対する戦略の実装
    - ドリフト検知のためのモデルモニタリング

# 今日から始めましょう

現在Databricksを利用されているお客様は[Databricks Academy](https://www.databricks.com/learn/training/login)にログインすることができ、Catalog 001の下でDatabricks認定試験概要のコースを探し出すことができます。

その他のデータ&AIのプロフェッショナルやファンの方もDatabricksアカデミーのアカウントを作成することで概要コースにアクセスすることができます。ログインしたら、Catalog DB005aで概要コースにアクセスすることができます

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
KotlinのEclipseプラグインが息をしていない問題について

# はじめに

最近、KotlinのEclipseプラグインを入れようとして、Eclipseのマーケットプライスでダウンロードしようとしたときに、今回の問題にぶつかりました。

[https://marketplace.eclipse.org/content/kotlin-plugin-eclipse](https://marketplace.eclipse.org/content/kotlin-plugin-eclipse)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20464/26d6dc60-c483-fa96-f894-6e7e6bd1410e.png)

あれ？アクセスできない！！！！

なんでなんで？？？？

# いろいろと質問をした

原因不明なので、[@kotlin](https://twitter.com/kotlin)にも質問してみたのですが、返答をもらえず。

https://twitter.com/blue_islands/status/1568528548390146049

仕方ないので、stackoverflowに英語で質問をしてみました。

https://stackoverflow.com/questions/73679058/kotlin-plugin-cant-access-eclipse-marketprice

少なくとも2022/5/25までは生きていたらしいですが、どうも JetBrains が消した？ことを言っていますね。
なので、下のフォークされたプラグインを使うこともできますよ。と回答がありました。

一度、信じてインストールしてみますか。

# インストールしてみる

教えてもらったプラグインはこちらです。

https://github.com/bvfalcon/kotlin-eclipse-2022

README.mdを見る感じだと、最新のEclipseにも対応している感じでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20464/26e3631a-2d97-39cd-4893-2cede5c2bcc3.png)

新規ソフトウェアのインストールを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20464/073af1f0-636a-b401-8538-2a0aef52da67.png)

Eclipseのバージョンに合わせたインストール先のURLを入力します。（ここでは最新の2022-06バージョンを指定しています。）
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f32303436342f30393261383766332d643035372d333766612d386236642d6432343939656163633037342e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20464/41426e8b-5f05-3ec3-7ba5-6f2c375fc735.png)

実際入れてみるとエラーもなく、安定したKotlinがEclipseで利用できました。

今回はKotlinのEclipseプラグインのメンテをしてくれる人がいて助かりましたが、今後、EclipseでKotlinをサポートしなくなっていくのなら、IntelliJ や android studio などの JetBrains の提供しているものに移行していかないとダメなのかもしれませんね。

# 追記

ここのリンクを見るとわかるのですが、2年間更新がなく不具合もあるので、Eclipseのマーケットプライスから削除しますよって勧告があったみたいですね。

期限が大体9/中ごろだったので、ちょうどその時期に削除されたみたいですね。タイミングが悪かったのか。。。
https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/issues/1569

2022/10/21
そして、Eclipseのマーケットプライスが復活したのですね。
https://marketplace.eclipse.org/content/kotlin-plugin-eclipse
Azure Pipelines にて stages を依存関係なく並行で実行する方法

## 概要
Azure Pipelines では通常であれば stage 間が直列となってしまうのですが、依存関係なく並行で実行する方法である`dependsOn` を値なしで指定する方法を紹介します。


## 詳細

### `dependsOn` を指定しない場合の動作

前の stage に依存するように直列で処理される。

```yaml
stages:
  - stage: first_job
    jobs:
    - job:
      pool: server
      steps:
      - task: Delay@1
        inputs:
          delayForMinutes: 0
  - stage: second_job
    jobs:
    - job:
      pool: server
      steps:
      - task: Delay@1
        inputs:
          delayForMinutes: 0
  - stage: third_job
    jobs:
    - job:
      pool: server
      steps:
      - task: Delay@1
        inputs:
          delayForMinutes: 0
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/e09f0fe5-9c58-f59e-0373-cf70b71f479f.png)


### `dependsOn` を指定した場合の動作

依存関係がなく、並列で処理が可能

```yaml
stages:
  - stage: first_job
    dependsOn: []
    jobs:
    - job:
      pool: server
      steps:
      - task: Delay@1
        inputs:
          delayForMinutes: 0
  - stage: second_job
    dependsOn: []
    jobs:
    - job:
      pool: server
      steps:
      - task: Delay@1
        inputs:
          delayForMinutes: 0
  - stage: third_job
    dependsOn: []
    jobs:
    - job:
      pool: server
      steps:
      - task: Delay@1
        inputs:
          delayForMinutes: 0
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/3c357cd3-195a-caf5-3501-f3daec25bd82.png)

## 参考記事

- [stages.stage definition | Microsoft Docs](https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema/stages-stage?view=azure-pipelines#examples)
.NET開発 (Visual Studio)

# 目次
1. 開発環境構築
1. アプリ作成
1. アプリ公開

# 1. 開発環境構築
・Visual Stuioインストール

https://visualstudio.microsoft.com/ja/vs/features/net-development/

# 2. アプリ作成

# 3. アプリ公開
・公開手順
>ビルド＞[名前]の発行

・署名エラー
>プロジェクト＞[名前]のプロパティ＞署名
>有効期限が切れているとき、有効期限を更新する
>テスト証明書の作成＞そのままOK
Python,Ruby,PHP,Java,JavaScript,Perlのコマンドライン引数の比較 | プログラミング言語比較


<a href="https://qiita.com/yuki_kimoto/items/f9c2454e7f9130ddb003">Qiita > プログラミング言語の比較</a>

プログラミング言語Python,Ruby,PHP,Java,JavaScript,Perlのコマンドライン引数の比較

# Python

https://qiita.com/taashi/items/07bf75201a074e208ae5

# Ruby

https://qiita.com/shiGira/items/44586bdc48c06e00d99f

# PHP

https://qiita.com/aic0o/items/91ca1ddc1fc6e025286f

# Java

https://qiita.com/takahirocook/items/ece64146015f702d0a83

# JavaScript

https://qiita.com/furusin_oriver/items/f030d1eaa9e7b54233c3

# Perl

https://perlzemi.com/blog/20080108132865.html
sbt run が立ち上がらないときの対処法

# はじめに

こんにちは。
こちらの記事では、sbt run が立ち上がらないときの対処法を記しています。

## 前提

開発時に下記の環境を使用しておりました。

- Playframework
- sbt
- tmux

## 起きていること

あるとき、Playframework で sbt run でローカル環境を起動しようとすると、下記のようなエラーが発生しました。

```
a.i.TcpListener - Bind failed for TCP channel on endpoint [/0.0.0.0:9000]
java.net.BindException: Address already in use
```

どうやら localhost:9000 が別のどこかで起動しているようで、sbt run が動作しない状況でした。そこで、起動しているところがないか確かめてみました。


## 調査・試したこと

### tmuxのセッションやウィンドウ、ターミナルのタブを全て確認

まずは、現在立ち上がっているウィンドウを全て確認してみました。
sbtが立ち上がっていたウィンドウは一旦sbtを停止、それでも sbt run のエラーはそのまま。

```
a.i.TcpListener - Bind failed for TCP channel on endpoint [/0.0.0.0:9000]
java.net.BindException: Address already in use
```

`tmux ls` コマンドで、バックエンドで tmux が立ち上がっていないか確認してみる 

```
$ tmux ls
0: ~~~ (attached)
1: ~~~ (attached)
```

確認してみると、セッションはすべて attached で起動中なので、すべて sbt が起動していないことは確認済み。


### ps aux コマンドで sbt を確認

`ps aux | grep sbt` のコマンドで、sbt が立ち上がっていないか確認してみる。

>参考：https://www.itmedia.co.jp/help/tips/linux/l0158.html


```
$ ps aux | grep sbt
namehoge   01010   ~~~ sbt
namehoge   02020   ~~~ sbt
namehoge   03030   ~~~ sbt
```

すると、複数箇所で sbt が立ち上がっていたことを確認。

### sudo kill コマンドでプロセスを落とす

`sudo kill -9 <プロセス名>` で、不要なプロセスを強制的に落とす。

> 参考：https://qiita.com/miriwo/items/7bfd5cb03a8946c6b017

```
$ sudo kill -9 ~~~
```

立ち上げたいプロジェクト以外のプロセスを落とした後に、sbt を再起動すると正常に動作するかと思います。


# おわりに
ここまで、tmux 利用時に sbt run が立ち上がらない対処法についてまとめました。
以上、最後まで読んでいただきありがとうございました！
UniVRMやMRTK等のインポーター付きアセットとTriLib2を同時に利用する際に発生する競合を解消する

# 初めに
TriLib2では、Unityエディタ上でもモデルをインポートできるようにScripted Importerを使用していますが、UniVRMやMRTK等のインポーター機能のあるdllファイルが含まれているアセットを同時に利用すると以下の様な競合エラーが発生します。

> Multiple scripted importers are targeting the extension 'gltf' and have all been rejected: UniGLTF.GltfScriptedImporter

# 解決方法
Scripted Importerの競合エラーが表示される場合は、"Project Settings->TriLib" にて、競合の発生した拡張子のEditorImporting設定を無効化することでエラーを解消することができます。

以下のキャプチャは`gltf`ファイルで競合が発生した場合にチェックする箇所の例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/2ddc2d36-a2a9-1357-da5e-91697dac344d.png)
簡単な業務改善ツールを作ってみた

## 作ろうと思ったきっかけ
日々の業務に圧殺されないために簡易ツールを作りました。
## このツールで出来ること
特定の名称で新規にフォルダを作成。
作成したフォルダ配下にエクセルファイルを配置。
## 言語バージョン
```
C:\Users\test>python --version
Python 3.8.10
```
## 実装
```
def make_folder(file_path):
    file_dir_path = os.path.dirname(file_path)
    file_name = os.path.basename(file_path)
    dir_name = "【新規フォルダ】" + file_name
    file_dir_path = "\\Users\\test\\デスクトップ\\新規フォルダ作成/" + dir_name
    os.mkdir(file_dir_path)
    # make file_path
    new_file_path = file_dir_path + '/' + file_name    
    # copy
    shutil.copyfile(file_path, new_file_path)

def arrange_file_path():
    file_path = text_box.get("1.0","end")
    file_path = file_path.replace('"','')
    file_path = file_path.replace('\\', '/')
    file_path = file_path[:-1]  
    # makelist
    arrange_file_path = []
    arrange_file_path = file_path.split('\n')
    return arrange_file_path

def get_text():
    files = arrange_file_path()
    for file_path in files:
        make_folder(file_path)

# set Frame
root = tk.Tk()
root.geometry("500x200")

# make component
text_box = tk.Text()
text_box["width"] = 80
text_box["height"] = 13
button = tk.Button()
button["text"] = "Button"
button["command"] = get_text

#set component
text_box.pack()
button.pack()

# set focus
text_box.focus_set()

root.mainloop()
```
## ◇詳細
コピー元のファイルを張り付けるため、テキストエリアの枠とボタンを作成しています。
```
# set Frame
root = tk.Tk()
root.geometry("500x200")

# make component
text_box = tk.Text()
text_box["width"] = 80
text_box["height"] = 13
button = tk.Button()
button["text"] = "Button"
button["command"] = get_text

#set component
text_box.pack()
button.pack()

# set focus
text_box.focus_set()

root.mainloop()
```
### def get_text():
枠内に入りつけたファイルパスを取得しています。
```
def get_text():
    files = arrange_file_path()
    for file_path in files:
        make_folder(file_path)
```
### def arrange_file_path():
ファイルの配置とフォルダ作成用に、取得したファイルパスを成型しています。
また、複数ファイルを取得したとき用にリストへファイルパスを格納しています。
```
def arrange_file_path():
    file_path = text_box.get("1.0","end")
    file_path = file_path.replace('"','')
    file_path = file_path.replace('\\', '/')
    file_path = file_path[:-1]  
    # makelist
    arrange_file_path = []
    arrange_file_path = file_path.split('\n')
    return arrange_file_path
```
### def make_folder(file_path):
取得したファイルパスの名称に変更を加え、新しくフォルダを作成しています。
また、作成したフォルダ配下にファイルをコピーして配置しています。
```
def make_folder(file_path):
    file_dir_path = os.path.dirname(file_path)
    file_name = os.path.basename(file_path)
    dir_name = "【新規フォルダ】" + file_name
    file_dir_path = "\\Users\\test\\デスクトップ\\新規フォルダ作成/" + dir_name
    os.mkdir(file_dir_path)
    # make file_path
    new_file_path = file_dir_path + '/' + file_name    
    # copy
    shutil.copyfile(file_path, new_file_path)
```
## ◇感想  
フォルダの作成・エクセルファイルの配置だけですが、
5秒ですら惜しい瞬間に使えるため常用しています。

ご覧いただきありがとうございました。
LPC812MAXで「HELLO」と液晶表示(AQM0802A)(Mbed)


x mbed2リビジョン144
x リビジョンを変更できる人むけ


目的
AQM0802Aのテスト



1.SCLとSDAを接続
2.電源の接続
3.下記のソースコードを書き込む
4.コンパイル実行で表示されたら終了
5.おわり


![o_con747.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/c9950b38-29e5-91f4-2d17-ec1558d28cad.jpeg)



```c++




//I2C_LCD_HELLO_812_1

#include "mbed.h"

//AQM0802のI2Cアドレス
#define ADDR_LCD    (0x7C)      //  address

//i2c initialization
//       SDA    SCL
I2C i2c(P0_10, P0_11); //812

//AQM0802の初期化コード
char INIT_com[]= {
    0x0,0x38,
    0x0,0x39,
    0x0,0x4,
    0x0,0x14,
    0x0,0x70,
    0x0,0x56,
    0x0,0x6C,
    0x0,0x38,
    0x0,0xC,
    0x0,0x1,
    0x40,0x41
};

//AQM0802のクリアコード
char INIT_cls[]= {0x0,0x1};

//メイン関数
int main()
{
    //液晶の初期化
    wait_ms(200);
    for(int ii=0; ii<11; ii++) {
        i2c.write(ADDR_LCD, &INIT_com[ii*2], 2);
        wait_ms(3);
    } //for

    //無限ループ
    while (1) {
        //液晶のクリア
        i2c.write(ADDR_LCD,INIT_cls,2);
        wait_ms(3);

        //液晶に出力
        char a[]="@HELLO";
        i2c.write(ADDR_LCD, a, sizeof(a) );

        //1秒待つ
        wait_ms(1000);
    }//while
}//main






```



![o_con833.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/bebb83aa-c86c-22f7-7346-d14986abee03.jpeg)


-24-
7zipで再帰的にファイルを解答する方法

前提
1.コントロールパネルを開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274248/29ac2a6a-d8cd-7e76-6031-8cbf7f4502b8.png)

2.システムを選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274248/8a9072bc-6e3e-b625-a80a-656d431e4559.png)

3.システムの詳細設定を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274248/67afce53-6548-bfc2-b400-b1d9c478a87b.png)

4.詳細設定タブの環境変数を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274248/c74714b9-c2ac-8da4-b562-b26e32189bfd.png)

5.システム環境変数の変数Pathを選択し、「編集」を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274248/ec9e74aa-e804-4862-450f-aa817832cf45.png)

7zipを格納するフォルダを登録する。
C:Program Files\7-Zip
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274248/0fbb22d6-d585-3101-260a-2d34f3d403b2.png)




```7zip recursive
7z x "zipファイル" -o"出力先ディレクトリ"
```
-oの直後はスペース不要。
beelink ミニPCにUbuntu server 20.04をインストール

Amazonで3万弱のミニPCを買ってみたので、Ubuntu Server 20.04.1 LTS をインストールしてみました。

# 概要
beelink ミニPCにUbuntu server 20.04をインストール。
SSHでメインPCからリモートアクセス。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/ae3b94ac-7482-a1ff-288f-0d9a46828f03.png)

(参考)Ubuntu　Server 20.04に行きつくまで参考これまでのいきさつ。
最初は22.04 Desktopをインストールしたのですが、使いたいPackageが一部
未対応でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/a5cb419b-ad19-9cdd-6877-162c6742024e.png)

# Ubuntu Server のインストール　参考文献
Ubuntu server guide
https://ubuntu.com/server/docs#system-requirements
（22.04と共通　まだ22.04用のガイドは用意されてない様子）

# 材料
ミニPC　Beelink Minis : 2万ちょい こちらにUbuntuをインストール
・Win11, 8GB DDR, 128G SSD, Intel N5095


# 1. Basic installation
## 1.1. システム要件
amd64 (Intel/AMD 64-bit)　：Intel 64 niy OK
CPU: 1 gigahertz：OK 2.00 GHz 4 Core 
RAM: 1 gigabyte ：OK 8GByte
Disk: 2.5 gigabytes： OK 128GByte

## 1.2. Desktop版とServer版の違い
repositoryは一緒。Serverはグラフィカルではない＝コマンドライン

## 1.3. Preparing install media
・isoイメージをダウンロード
https://releases.ubuntu.com/20.04/?_ga=2.16476596.366750257.1662323541-361458439.1662067984
・balenaEtcherでUSBメモリisoを焼く

## 1.4. Booting the installer
・USBをミニPCに刺して、電源ON、起動画面でF7を押しっぱなし。
・USBを選択してUbuntu Serverをインストール

## 1.5. インストーラー詳細
・言語選択：日本語がないので、泣く泣く"English"を選択して Done
・キーボード：日本語キーボードがない"English(US)"を選択して Done
・Network connection：Wifiも選べた
　wlpis0でスペース,Edit WiFi 
　SSID選ぶ：Choose avisible network
・Proxy? arhchive mirror？　わからないので、そのまま Done
・Mirror address デフォルトのまま　jp.archive.ubuntu.com
・名前、サーバ名、ユーザ名、パスワード　設定
・OpenSSHのインストール チェック"x" Done 
　//多分後でメインのWindowsマシンから　リモート接続したくなるだろう
## 1.6. Snap（おすすめソフト？）
　とりあえず何も選ばずにDone。
## 1.7. インストール終わり
Reboot Nowと出たら再起動
Please remove boot media と出たらUSBを抜いてエンター

# 2. Attaching your subscription to Ubuntu
https://ubuntu.com/server/docs/install/subscription

Ubuntu.comへの登録がおすすめされているので、とりあえずしておく。
## 2.1. Installing the UA client
~~~
$ sudo apt update
$ sudo apt install ubuntu-advantage-tools
~~~

## 2.2. Ubuntu one Accountを作る
メインPC（Windows）のブラウザから、アカウントを作成
https://login.ubuntu.com/
ダッシュボード　https://ubuntu.com/advantage
にアクセスしてみる。
Free personalで3マシンまでは無料っぽい。tokenを使えばよいっぽい。
tokenを目で見て手打ちするのは無理。SSHで接続しよう。SSH接続は3章へ。

~~~
sudo ua attach C1xxxx　←これがトークン
~~~

livepatchがenableになって、少しセキュアになりました。

# 3. OpenSSH Server のインストールとSSHでリモート接続

https://ubuntu.com/server/docs/service-openssh
~~~
sudo apt install openssh-client
sudo apt install openssh-server
~~~

https://inab818.site/ubuntu-server/ubuntu-server-20-04-lts-ssh-connection/

上記を参考にミニPCのipアドレス確認
~~~
ip addr
~~~
192.168.68.xxx

Win PCに Teratermをインストール
Teratermを使って、ubuntu serverセットアップ時のIDとパスでSSHアクセス。

接続できました！

終わり。
Ruby 3.2 で Struct がチョイ楽になる？

Ruby で構造体的なデータを表すクラスにはいろいろありますが，その代表格は，やはり組込みクラスの Struct ですよね。

たとえば，猿への給餌計画を表す `ApeFeed` クラスはこんなふうに：

```rb
ApeFeed = Struct.new(:morning, :evening)

proposed_ape_feed = ApeFeed.new(4, 3)

p proposed_ape_feed.morning # => 4
p proposed_ape_feed.evening # => 3
```

しかし，どうも私は Struct を多用する気になれないでいます。
理由の一つは，`Struct.new` が Struct のインスタンスではなくサブクラスを返す，という謎仕様。
えっと，クラスに `new` したらインスタンスを生成して返すでしょ，ふつう。
なぜこんなワケの分からない仕様なのか理解に苦しみます。

もう一つは，上記のようなコードだと，`ApeFeed.new(4, 3)` の引数のどっちがどっちかすぐ分かんなくなっちゃうことなんですよね。
やっぱり `ApeFeed.new(morning: 4, evening: 3)` と書きたいじゃないですか。

いや，もちろんその手段はあって，

```rb
ApeFeed = Struct.new(:morning, :evening, keyword_init: true)

proposed_ape_feed = ApeFeed.new(morning: 4, evening: 3)

p proposed_ape_feed.morning # => 4
p proposed_ape_feed.evening # => 3
```

のようにすればよろしい，と。

ただ，`keyword_init: true` って，ちょっと長すぎないですか？
で，私は `keyword_init` てのが覚えられないんですよ。「ナントカ init だっけ？」「頭にアンダースコア付くんだっけ」って。
まあ頻用すれば覚えられると思いますけど。

ここから本題ですが，Ruby 3.2 では上記のようなコードで `keyword_init: true` を付けなくてもいけるようになるらしいです。
https://www.ruby-lang.org/en/news/2022/09/09/ruby-3-2-0-preview2-released/

現在，Ruby 3.2 は 3.2.0-preview2 が出ていて，Linux や macOS の人は rbenv で気軽にこの preview2 を試すことができます。
私もこれをインストールしてやってみました：

```rb:Ruby 3.2.0-preview2 にて
ApeFeed = Struct.new(:morning, :evening)

proposed_ape_feed = ApeFeed.new(morning: 4, evening: 3)

p proposed_ape_feed.morning # => 4
p proposed_ape_feed.evening # => 3
```

確かに `keyword_init: true` 無しでイケてます。

これで Struct のヤな感じが一つ減りました。
ただ，ライブラリー中でこんなふうに書けるのは何年も先ですよねえ。ライブラリーはある程度古い Ruby でも動かないといけないから。

# 追記 2022-09-26

`Struct` やその仲間などについて改めて調べて比較した記事を書きました：
[Ruby の構造体的・ハッシュ的データ構造についての考察 (1) - Qiita](https://qiita.com/scivola/items/6493e2fb3de657753c44)
反響が無さすぎてちょっぴり寂しい。
vim ale で clangd で C++ コンパイルオプションがうまく渡らないっぽいメモ

cmake で生成した `compile_commands.json` はある.

しかしなぜか特定の環境(筆者では Ubuntu 22.04 + apt で入る clang-14, clangd-14 で確認)でコンパイルオプションがうまくわたらぬ.


以下のように `compile_commands.json` では `-Wno-c++98-compat` 設定されているのに...

```
{ "directory": "/home/syoyo/work/tinyusdz/build",
  "command": "/usr/bin/clang++ -DTINYUSDZ_USE_USDOBJ -DTINYUSDZ_USE_USDVOX -DTINYUSDZ_WITH_AUDIO -DTINYUSDZ_WITH_COLORIO -DTINYUSDZ_WITH  _EXR -DTINYUSDZ_WITH_OPENSUBDIV -I/home/syoyo/work/tinyusdz/src -I/home/syoyo/work/tinyusdz/src/external/fast_float/include -I/home/syoyo/work/tinyusdz/src/external/simple_match/include -I/home/syoyo/work/tinyusdz/src/external/jsonhpp -I/home/syoyo/work/tinyusdz/src/osd -g -fno-exceptions -std=c++14 -Weverything -Werror -Wno-padded -Wno-c++98-compat -Wno-c++98-compat-pedantic -Wno-documentation -Wno-unuse  -d-member-function -o CMakeFiles/tinyusdz_static.dir/src/usdGeom.cc.o -c /home/syoyo/work/tinyusdz/src/usdGeom.cc",
 "file": "/home/syoyo/work/tinyusdz/src/usdGeom.cc"                                                    }                                  }, 
```

c++ コードで `auto` に warning が出る...(`-Wc++98-compat`)

ale で linter を `clang++` にするといけるっぽい(ただ補完ができなくなる)

ale だと clangd 呼び出しとか失敗してもエラーださないのでデバッグのやりかたがわからぬ...
(vim をデバッグモードで起動すればいいんじゃろか...)

clangd 側で `command` からうまく `-I` とか extract できていないんじゃろかね...

## とりあえずの解決

ClangdでC++ソースコードを補完する際にコンパイルオプションを指定する方法
https://uchan.hateblo.jp/entry/2018/12/29/104132

に従って, `compile_commands.json` ではなく `compile_flags.txt` 提供でとりあえずはいけます...
(`compile_commands.json` は削除しなければならない) 

https://qiita.com/kaityo256/items/cb76c3f73753fe921e7b

にあるように, `g:ale_cpp_clang_options` を設定(`.vim.local` で設定)は著者環境ではうまくいきませんでした.

ALE 自体は C++ 特化というわけでないので, CoC を使ったほうがよさそうです!

https://zenn.dev/syoyo/articles/9d98e17ab441d6

ただ, CoC はインデクシングが遅いときがあるのが難点ね..

## TODO

* [ ] 原因を調べる
* [x] ale 以外の linter + completion ツールを試す
  * CoC がよいでしょう
2022/9/13主にITとかセキュリティの記事

「MariaDB」のバックアップ機能に脆弱性 - サービス拒否のおそれ
https://www.security-next.com/139671

NVIDIAのDPDKに脆弱性 - 複数のCisco製品にも影響
https://www.security-next.com/139667

サイバー攻撃、長期化懸念＝ロシアのハッカー、インフラ標的(9/12)
https://newspicks.com/news/7550669/body/

不適切なデータが良いパーソナライゼーションを台無しにする理由(9/10)
https://ecclab.empowershop.co.jp/archives/78629

医療機関に対するサイバー攻撃は死亡率の上昇と患者ケアの低下をもたらす(9/11)
https://news.mynavi.jp/techplus/article/20220911-2450630/

クッキー規制の新設？利用者に関する情報の外部送信規制、およびその他の改正事項(9/9)
https://www.businesslawyers.jp/articles/1206

情シス担当者が見たリテラシーゼロな人たち　「パスワードをPCに貼り付け」「ソフトを勝手にインストール」を超えた1位は(9/11)
https://maidonanews.jp/article/14715542

本当にやってくるか　データセンター分散時代(9/12)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600014/090600125/

2021年の「DX先行企業」は17.7％　前年から倍増も人材戦略に課題(9/12)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600010/090600123/

庁内システムをハイブリッドに　全庁クラウド化で運用コスト4割減 札幌市(9/12)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600004/090500112/

ソブリンクラウド（Sovereign Cloud）(9/12)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600009/090500123/

Cドライブにたまる「ゴミ」、フリーソフトで根こそぎ削除(9/12)
https://xtech.nikkei.com/atcl/nxt/column/18/02173/082200003/

ウイルス対策アプリの追加は1つまで、複数入れると確実に現れる「副作用」(9/12)
https://xtech.nikkei.com/atcl/nxt/column/18/02120/072200022/
Electronで多重起動させない方法


## メインプロセス（Nodejs）

```js
const { app } = require('electron');

// メインプロセス(Nodejs)の多重起動防止
const gotTheLock = app.requestSingleInstanceLock();
if (!gotTheLock) {
  console.log('メインプロセスが多重起動しました。終了します。');
  app.quit();
}
```

https://www.electronjs.org/ja/docs/latest/api/app#apprequestsingleinstancelockadditionaldata

## レンダラープロセス（画面）

例えば、設定画面なんかは同じ画面をいくつも表示したくないです。なので、プロセスの存在をチェックして、カーソルを合わせるだけの実装をします。

```js
if (settingWindow && !settingWindow.isDestroyed()) {
  settingWindow.show();
  settingWindow.focus();
  return;
}
```
Googleオプティマイズの編集エディタを開けないときの解決策

<h2>概要</h2>
GoogleオプティマイズでABテストをやってみようとしたところ、編集エディタが開けず、少し苦労した。
<br>
<br>

<b>「オプティマイズエディタを読み込めませんでした。～」</b>
というメッセージが表示され、開けない。

同じようなことで、つまづく人もいるかもしれない。
そう思い、そのときの解決策を書いておきます。

解決策は以下。
<ul>
<li>解決策1.GoogleChromeで「Cookie をすべて受け入れる」にチェック</li>
<li>解決策2.Wordpressからログオフする</li>
</ul>
<br>

<h2>解決策1.GoogleChromeで「Cookie をすべて受け入れる」にチェック</h2>

<h3>手順</h3>
<ol>
<li>chromeの設定</li>
<li>プライバシーとセキュリティ</li>
<li>Cookie と他のサイトデータ</li>
<li>「Cookie をすべて受け入れる」を選択</li>
</ol>


<h3>現象：編集エディタを開こうとすると以下のメッセージが表示される</h3>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2799113/43b7a46c-3f4a-c041-9709-2fe3f05914de.png)


オプティマイズ エディタを読み込めませんでした。 「optimize.google.com」と「www.google-analytics.com」からのサードパーティ Cookie を有効にし、ネットワーク接続と CSP ポリシーに問題がないことを確認したうえで、もう一度お試しください。

<h3>補足説明</h3>
私は、「optimize.google.com」と「www.google-analytics.com」だけを、Chromeの「常に Cookie を使用できるサイト」に登録していた。

<br>
<br>
しかし、それだと、うまくいかないようです。
<br>
<br>
「Cookie をすべて受け入れる」を選択した場合、うまくいきました。
<br>
<br>
<h2>解決策2.Wordpressからログオフする</h2>

<h3>手順</h3>
Wordpressを使っている人は、管理画面からログオフした状態でおこなってください。

<h3>現象</h3>
以下のメッセージがでて、エディターをひらけない。
<br>
<br>
「このページのオプティマイズのインストール状態に問題があるようです。」
<br>
<h3>補足説明</h3>
このメッセージは、解決策１で「オプチマイズエディタを読み込めませんでした。～」というメッセージがでなくなったあとに、表示されました。
<br>
<br>
Wordpressの管理画面からログオフしたら、解決。
<br>
<br>
<br>
以上です。
日記1 - これからSNSアプリ開発

参考動画
[How to install flutter in windows step by step guide](https://www.youtube.com/watch?v=tun0HUHaDuE)

SNSをつくろうとしてるので開発過程を日記感覚でかく
うまくまとめる自信はないので、あくまで自分があとで読むようになるかなと思う
なお、アプリ内容に関して具体的には言わない

```
書く目的 
・モチベ維持
・実装した機能のふりかえり
・頭の中の整理
・SNS投稿の練習
・投稿者側の気持ちの変化を知る
```

つくろうとしているサービスに関して今の懸念点
・サーバーにかかるお金めっちゃ高くなりそうでこわい


```
昨日と今日やったこと
- 今回の開発に適した開発方法選び
- 開発に必要な環境を調べた
- 途中まで必要な環境をインストールした
```


## 今回の開発に適した開発方法選び
### ノーコード使用適否
**無理そう**
TIKTOK風の動画スライドできるノーコードサービスが見つからなかった
他、こだわり部分考えるとノーコードはなしかなと。

## 開発に必要な環境を調べた

環境
Windows 10

必要環境
- Flutter
- VScode
- Git for windows 2.x
- Windows PowerShell 5.0
- Android Studio
- (Cocoapods 要るかわからない)

## 途中まで必要な環境をインストールした
以下の動画の6:00のとこまでやった。
[How to install flutter in windows step by step guide](https://www.youtube.com/watch?v=tun0HUHaDuE)
これから開発していくうえで英語情報見る機会も増えるから英語にも慣れないと。と思ったので英語の動画でセッティングした。インドアクセントというくせものやけど。

おつかれ。
今日は夜遅いので寝る
コピペ可能な都道府県リスト（地方区分付き）

# このページについて

地域単位でデータ分析する時によく使う都道府県データ。都道府県だけのものと地方区分付きのものをコピペ可能なリストとしてまとめました。ご自由にお使いください
#
### 都道府県リスト

北海道
青森県
秋田県
岩手県
山形県
宮城県
福島県
茨城県
栃木県
群馬県
埼玉県
千葉県
東京都
神奈川県
山梨県
長野県
新潟県
富山県
石川県
福井県
静岡県
愛知県
岐阜県
三重県
滋賀県
京都府
大阪府
奈良県
和歌山県
兵庫県
鳥取県
島根県
岡山県
広島県
山口県
香川県
愛媛県
徳島県
高知県
福岡県
大分県
熊本県
佐賀県
長崎県
宮崎県
鹿児島県
沖縄県

#
### 地方区分付き都道府県リスト

北海道／北海道
東北／青森県
東北／岩手県
東北／秋田県
東北／宮城県
東北／山形県
東北／福島県
関東／東京都
関東／神奈川県
関東／埼玉県
関東／千葉県
関東／茨城県
関東／栃木県
関東／群馬県
関東／山梨県
信越／新潟県
信越／長野県
北陸／富山県
北陸／石川県
北陸／福井県
東海／愛知県
東海／岐阜県
東海／静岡県
東海／三重県
近畿／大阪府
近畿／兵庫県
近畿／京都府
近畿／滋賀県
近畿／奈良県
近畿／和歌山県
中国／鳥取県
中国／島根県
中国／岡山県
中国／広島県
中国／山口県
四国／徳島県
四国／香川県
四国／愛媛県
四国／高知県
九州／福岡県
九州／佐賀県
九州／長崎県
九州／熊本県
九州／大分県
九州／宮崎県
九州／鹿児島県
沖縄／沖縄県

#
補足：DATA Saber Ord.8 “HandsOn - Advanced I”　Q10で地方の情報付き都道府県リストとして使用されています。
補足の補足：[DATA Saberとは](https://datasaber.world/ "datasaber.world")
【JDK】インストールと環境変数の設定（Windows）

## 環境
+ Microsoft Windows 10.0.22000.856
+ Windows Terminal 1.14.2282.0

## はじめに
この記事ではJDKのインストールと環境変数の設定の手順を説明する。
<details><summary>【用語解説】Java SE, JVM, JRE, JDK</summary>

### Java SE (Java Platform, Standard Edition)
**Java APIの集合体**。ここでいうAPIはJavaの機能やデータなどを利用するための呼び出し方を定義したもの。

### JVM (Java Virtual Machine)
**Java仮想マシン**。Javaで作成されたアプリケーションをOSで動かすために必要となるアプリケーション。クラスファイル内のバイトコードをCPUが解釈できるマシンコードに変換するとともに、CPUに送って処理を実行する。

### JRE (Java Runtime Environment)
**Java実行環境**。Javaのプログラムを実行するためのJVMや対応するAPIがセットになっている。JREを各OSにインストールすることでJavaアプリケーションの実行環境を構築できる。

### JDK (Java Development Kit)
**Java開発環境**。Javaプログラムの開発に必要な各種ツールやAPIライブラリを詰め合わせたもの。**コンパイラ**（ソースコード→バイトコードの変換を行う）や**インタプリタ**（バイトコード→マシンコードの変換、実行を行う）は含まれているが、**テキストエディタ**は含まれていない。
</details>

## インストール手順
１. [Java Downloads | Oracle](https://www.oracle.com/java/technologies/downloads/) にアクセス

２. 最新版をインストールする。Windowsタブに切り替え「Installer」のリンクをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946472/a2c7d189-3a7d-1582-1322-5bbdf652ca88.png)

３. インストールできたら起動する。（デバイスへの変更を許可する）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946472/9d849119-6077-3f3f-923c-db202c593596.png)

４. インストール先は特に変更する必要はない。（後の環境変数の設定のために場所を控えておくとよい）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946472/eaf9b3d6-fed1-270e-46d6-073b78b12aba.png)
```java:インストール先
// 一旦「変更」をクリック → パスを選択し Ctrl+C でコピーできる
"C:\Program Files\Java\jdk-18.0.2.1\"
```

５. 「次へ」をクリックしてインストール完了

## 環境変数の設定
簡単に言うと、PCにJDKの場所を教えてあげる作業。「パスを通す」とも。

１. Win+R → `sysdm.cpl` と入力 → Enter で「システムのプロパティ」を開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946472/b14a1bd3-3876-56c2-56dc-12ae00ac0fbd.png)

２. 「詳細設定」タブの「環境変数」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946472/451dba2a-d10e-564c-c315-81b4b81a7de6.png)

３. 「システムの環境変数」の `Path` を選択 →「編集」→「新規」
（`Path` がない場合は「新規」をクリックして変数名に `Path` を入力）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946472/f2f8b8b3-cc1b-9327-b91e-a5763bd9d860.png)

４. 先程コピーしたパスを Ctrl+V で貼り付けて `\` の後に `bin` と入力 →「OK」
```:パスの例
C:\Program Files\Java\jdk-18.0.2.1\bin
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946472/79c2524e-0324-c8a1-8d8d-27b9d270aa5f.png)

５. Windowsを再起動して環境変数を反映させる（結果的に再起動しなくても反映されていたが、再起動するのが確実らしい）

６. Win+R → `cmd` と入力 → Enter でコマンドプロンプトを開き、`java -version` と `javac -version` を実行しバージョンが表示されることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946472/7d6b8a82-d28c-05d6-c894-22661ac94e87.png)

## 参考

https://sukkiri.jp/books/sukkiri_java3

https://www.javadrive.jp/start/install/index5.html

https://www.youtube.com/watch?v=dZ00sL14QM0
Linux sudoコマンドと環境変数TMOUTについて（自分用メモ

●sudoコマンド
一般ユーザでも、管理者から実行権限を委譲されたコマンドであれば実行できる。

sudo [委譲されたコマンド]

自身に委譲されているコマンドは「sudo -l」で確認できる。

sudoコマンドを実行するとパスワードの入力を求められますが、rootのパスワードではなく、ユーザー自身のパスワードを入力。

●権限委譲の設定は「visudo」コマンドで「/etc/sudoers」ファイルを編集することで行う

「/etc/sudoers」ファイルの書式：
権限を委譲するユーザ名　ホスト名=(実行ユーザ)　委譲するコマンド

●su（Switch User）コマンド
ログイン中に別のユーザーに切り替わる。

suコマンドの特徴
・引数に「-」をつけると、切り替わる先のユーザの環境変数を使用
・ユーザー名を指定しない場合、rootユーザへ切り替わる
・ユーザを切り替える時に求められるパスワードは、切り替わる先のユーザのパスワード
・ただし、rootユーザから別のユーザに切り替わる時はパスワードは要求されない


●環境変数「TMOUT」
指定した時間、何も入力が無ければユーザを自動的にシェルからログアウトさせることができる。

TMOUTには自動ログアウトさせるまで入力を待つ秒数を設定。0（ゼロ）を設定した場合はログアウトしない。

例）1分間（60秒）入力が無ければ自動ログアウトさせる
export TMOUT=60
【React学習シリーズ#1】環境構築

# はじめに
React初心者が、Next.js×TypeScriptにてWEBアプリケーションを作成する際の個人的な開発メモになります。
1回あたりの文量は少ないですが、少しづつ学んだことをメモに起こしたいと思います。

# 前提条件
下記、環境については既に構築済の状態から始めます。

# 環境
各バージョンは以下のとおりです。
エディタは、Visual Studio Codeを使用します。
```
node -v
v16.16.0

npm --version
8.11.0

npx -v
8.11.0
```

# create-react-app
Reactプロジェクト作成ツールを利用して、プロジェクトを作成します。
今回はTypeScriptを使用する為、--templete typscriptを使用します。

https://create-react-app.dev/docs/adding-typescript/
```
# npx create-react-app{バージョン} {プロジェクト名} --templete typscript
npx create-react-app@latest react-study-project --templete typscript
```
上記コマンドを実行すると環境が自動で構築されます。
![スクリーンショット 2022-09-13 000142.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638718/2f1deb04-dd9a-9297-1b4a-4a7930390e57.png)

以下が、表示されたら構築完了です。
![スクリーンショット 2022-09-13 000914.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638718/e1a51358-e495-ac6f-2910-c09c1ca0497b.png)

実際に起動してみます。
```
# cd {プロジェクト名}
# プロジェクト直下へ移動
cd .\react-study-project\

# 起動
npm run start
```

無事に見慣れた画面が表示されました！
![WS000007.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638718/937d5518-08ed-27b6-02b6-75e7d093cb6e.jpeg)

# まとめ
今回は非常に基本的な部分ですが、
create-react-appを使用した環境構築を実施しました。
やはり、コマンド一つで環境が出来るのはすごい便利ですね。
次回以降は、作られた環境の中身を色々と見ていきたいと思います。
また、React hooks等もまだ理解できてない部分も多いので、
番外編として記事にまとめて見たいと思います。
第４正規化と多値従属性

## はじめに
本記事は第４正規化について自分の理解をまとめたものです。いままで知識としては知っていたものの、あまりきちんと理解できてなかったような気がするので復習のつもりでまとめました。

## 第２〜ボイスコッド正規化までのおさらい
まず、ボイスコッド正規化までを簡単にまとめます(第1正規化はRDBの条件みたいなものなので除く)。ボイスコッド正規化までテーブルの属性の関数従属をテーブル分割によってなくしていく作業です。
### 関数従属と正規化
関数従属の説明として以下の学生とテストの点数についてのテーブルに付いて考えてみます。
- 学籍番号は生徒を一意に指定できる番号です。
- 生徒は同じ教科のテストを複数回受けることはできません
- 各教科ごとに複数の担当教員がおり、教員は複数の教科を担当することができません
- 成績はテストの点数によって(100~80がA, 79~60がBのように)決まります


| 学籍番号* | 教科* | 氏名 | 教員ID |教員名|
|:-:|:-:|:-:|:-:|:-:|
| 1  | 数学  | 山田太郎  | 001 | 本田 |
| 2  | 国語  | 田中花子  | 002  | 三井 |
...

例えば、学籍番号が決まると一意に生徒の氏名も決定できます。
このようにある属性A(これは複数の属性の集合でも良い)から属性Bが一意に決定することができるとき「BがAに関数従属する」と言い、A→Bと書きます。

上記に置いて、*マークがついてる候補キーに着目して、正規化を分類します。

- 第２正規化は、候補キーの一部から候補キー以外の関数従属をなくす作業です。
学籍番号→氏名
- 第３正規化は候補キー以外から候補キー以外への関数従属をなくす作業です。
教員ID→教員名
- ボイスコッド正規化は、候補キー以外から候補キーへの関数従属をなくす作業です。
教員ID→教科

## 多値従属性
第４正規化は関数従属性に関する正規化ではありません。多値従属性に関する正規化です。
### 多値従とは
まずwikiに載っている定義を引っ張ってみます。
>R を関係とし、A, B, C を、R の属性集合の任意の部分集合とする。 R のある（A値, C値）対に対応するB値の集合がA値だけに依存し、C値には独立かつそのときに限り、B は A に多値従属している

何言ってるかイマイチわかりません。ここでRはリレーションのことでテーブルと思って良いです。下記のようなテーブルがあったとしましょう。
| A | B | C |
|:-:|:-:|:-:|
| a  | b  | c  |
...

このとき、B列に入る値が、Cに列の値には無関係であるがAの値には依存しているときBはAに多値従属していると言います。ここで重要なのは依存しているだけであって関数従属しているわけではないということです。
関数従属であればAの値に対して一意にBの値が決まります。しかし多値従属の場合は、Aの値が決まるとBの取りうる値が制限されます。（Bの取れる値の集合が決まる)

例えば以下のように、大学の授業、講師、参考図書の対応テーブルが合ったとしましょう。

| 授業 * | 講師 * | 参考図書 * |
|:-:|:-:|:-:|
| 力学  | 湯川  |  物理数学基礎 |
| 力学  | 湯川  |  力学入門 |
| 力学  | 江崎  |  物理数学基礎 |
| 力学  | 江崎  |  力学入門 |
| 物理数学  | 湯川  |  物理数学基礎 |
| 物理数学  | 益川  |  物理数学基礎 |

テーブルの見方を説明すると、力学については湯川と江崎の２講座開講されます。力学の授業では、「力学入門」と「物理数学」が参考図書になっています。物理数学も2講座開講されており、参考図書は「物理数学基礎」です。(物理数学で習ったことが力学でも使えるように力学でも「物理数学基礎」が参考図書が選択されています)

多値従属性は{A,C}という属性を選んだときにBとCが独立でBがAに依存している関係性のことでした。
{授業, 講師}と{参考図書}を見てみましょう。講師と参考図の関係について考えます。
参考図書はどの講師を選んだとしても、{物理数学基礎, 力学入門}の集合から選ばれています。一方、物理数学の授業を選択すると、参考図書は{物理数学基礎}のみの集合から選ばれます。参考図書の集合が授業の値に依存しています。
よって、参考図書は授業に多値従属していると言えます。


## 第４正規形
第４正規形は、候補キー以外からの多値従属がないものを指します。
先程の例の候補キーは{授業, 更新, 参考図書}なので、授業 --> 参考図書の多値従属は第４正規形に反しています。

### 第４正規化
では上記テーブルを正規化してみましょう。第４正規化する場合、もう１つの多値従属を見つける必要があります。
これは多値従属の性質から簡単に見つけることができます。あるリレーションRの{A,B,C}という属性があるとします。
ここでA --> Bの多値従属があるならば、A --> {R-B}(A --> C)が成り立つからです。(要証明)
よって、授業 --> 講師の多値従属が存在します。
授業から講師,参考図書の２つの多値従属が存在するので授業を共通キーとしてテーブルを分解します。
| 授業 | 講師 |
|:-:|:-:|
| 力学  | 湯川  |
| 力学  | 江崎  |
| 電磁気学  | 湯川  |
| 電磁気学  | 益川  |

| 授業 | 参考図書 |
|:-:|:-:|
| 力学  | 力学入門  |
| 力学  |  物理数学 |
| 電磁気学  | 物理数学  |

これで第４正規化が完了です。２つのテーブルを授業をキーに結合すると元のテーブルになることが確認できます。
TypeScript 関数の引数と構造的部分型・公称型

TypeScriptの型判定でよくわかってないところがあったのでまとめます。
今回は構造的部分型と公称型についてなのですが、自分が慣れてたのは公称型の考えだったようでTypeScriptで間違いまくってました。
[サバイバルTypeScript - 構造的部分型 (structural subtyping)](https://typescriptbook.jp/reference/values-types-variables/structural-subtyping)
[サバイバルTypeScript - 公称型](https://typescriptbook.jp/reference/object-oriented/class/class-nominality)

関数の引数で考えるとわかりやすそうなのですが、それぞれ次のように関数fが引数としてクラスAとBのインスタンスを受ける場合に型エラーになる場合とならない場合が出ます。

- 構造的部分型

```TypeScript
class A {
  p = 0;
  num: number;
  constructor () {
    this.num = 10;
  }
}

class B {
  p = 0;
  num: number;
  constructor () {
    this.num = 20;
  }
}

const f = (a: A) => {
  console.log(a);
};

const a = new A();
f(a); // OK

const b = new B();
f(b); // OK
```

- 公称型

```TypeScript
class A {
  private p = 0;
  num: number;
  constructor () {
    this.num = 10;
  }
}

class B {
  private p = 0;
  num: number;
  constructor () {
    this.num = 20;
  }
}

const f = (a: A) => {
  console.log(a);
};

const a = new A();
f(a); // OK

const b = new B();
f(b); // NG
```

公称型の場合はprivateプロパティが一致していても関数fにクラスBのインスタンスを渡すことができません。
気をつけてこの辺を扱わないとどうしてもエラーが解消できずに時間を費やすことになりそうです。

逆に意図的に公称型としてクラスを定義したいときは、強制的にprivateもしくはprotectedのプロパティやメソッドを持てばいいことになります。
ただそのためだけに定義されたプロパティなどに意味をもたせるのは難しいのでコメントなどで補足するか、コーディングルールにするとかしておいた方が混乱しないかもしれません。
Androidでリリースアプリ作成の為の情報を忘れてしまった。。。

## はじめに
この記事はリリースアプリを作成する為の情報をAndroidStudioに依存してしまい、キー情報を紛失したと焦って調べた際の情報をまとめました。

## 対象者
この記事は下記のような人を対象にしています。

- jks等のキーストアファイルは残っているが、パスワードを忘れてしまった方

## 結論
パスワードに設定した文字列の予測(こうしたっけ？)が思い付かない方は、Google Play Consoleから、署名鍵の紛失による申請を実施した方が良い。

### 結局情報を諦めるまでに試した手順

### 今回のパターン

Androidのリリースアプリを作成する為には以下の4個の情報が必要

1. keystoreファイル(.jks)
2. Alias名
3. Aliasパスワード
4. keystoreパスワード

今回 1.のkeystoreファイルだけ残っている状態で、2.3.4の情報の復元を試みた。。。

### 実施した内容

本家Googleさんに復旧する為のツールがある事が判明し、ダウンロードしてきた。

[Google Code](https://code.google.com/archive/p/android-keystore-password-recover/wikis/HowTo.wiki)

```実行したコード
java -jar Android_Keystore_Password_Recover_1.07.jar -m 3 -k ./test.key_store -d ./word.txt
```

```word.txtの内容(これじゃないかと推測出来るパスワードの文字列)
AAAAA
BBBBB
CCCCC
```

### 実施した結果

word.txtに記載されているパスワードが一致するかと判定してくれる！！！！

そして一致しない場合、永遠とも思えるパスワード一致作業が始まる。。。。。。

### 何故このパターンが起こるのか

Android Studioでキーストアファイルを作成すると、キーチェーンに保存された情報が自動表示されており、リリースビルドにも困らなかった。
そして、異なる端末でリリースビルドを作成しようとした際に、テキストファイルに保存してたパスワードが違うと通達された。

## おわりに
結局の所、キーストアファイルのみ残っている場合ではパスワードを連想出来ないと詰む。。
キーストアファイル等は、AndroidStudioからの情報入力ではなく、コマンドで作成するようにしましょう！
Unreal Engine5でアニメーション中に同一メッシュにテクスチャ（マテリアル）を貼り替える

# やりたいこと
* Unreal Engine5で簡単なアニメーションを作りたい
* イラストを複数用意し、同一のメッシュ（キャンバスとなるような単純な面メッシュ）にテクスチャを貼り替えることでアニメーションさせる

## 基本的な準備
* 舞台となるマップの作成
* レベルシーケンサの配置
  * 参考 : https://docs.unrealengine.com/5.0/ja/cinematics-and-movie-making-in-unreal-engine/

## 困難な点
* transformやmeshはキーフレーム化することが出来るのでシーケンサ上でキーフレーム毎に状態を変更させやすい
* materialはそのままではキーフレーム化できないので、シーケンサ上で複数のタイミングでmaterialを入れ替えても時間軸上のすべてのmaterialが入れ替わってしまう

## 方法
* レベルシーケンサを追加する
* レベルシーケンサにカメラを追加する
* テクスチャの土台となるメッシュを配置し、それを選択した状態でレベルシーケンサの「+トラック」＞「シーケンサへのアクタ」を選択すると、選択中のオブジェクトをトラックに追加できる
* トラックに追加されたメッシュの「+トラック」をクリックし、そのメッシュのインスタンスのアクターの子要素になっているStaticMeshComponentがあるはずなのでそれを追加する

![テクスチャ貼り替えアニメ01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159641/6a95f942-3a3e-a63f-7a88-3c8e6fbbc917.png)


* 追加されたStaticMeshComponentでさらに「+トラック」をクリックし、「マテリアル要素スイッチャー」を追加する

![テクスチャ貼り替えアニメ02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159641/3b174931-feb3-9790-cf2e-9cd6c91e13d4.png)

* マテリアル要素スイッチャーではキーフレーム毎にマテリアルを適用できる

![テクスチャ貼り替えアニメ03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159641/d81c9c0c-7af7-2a27-3f13-83c44f3046cb.png)

## サンプル動画

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">またしてもたったこれだけのために超苦労した　1.ひとつのメッシュに対してテクスチャだけ入れ替えてアニメーションさせる　2.動画として出力する（Twitterに載せられるのはMP4） <a href="https://t.co/WbEfBfY0Jv">pic.twitter.com/WbEfBfY0Jv</a></p>&mdash; いしいたける (@ishiitakeru) <a href="https://twitter.com/ishiitakeru/status/1569330967294218240?ref_src=twsrc%5Etfw">September 12, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
richmanbtc さんの docker-compose up -d 実行するまでに必要な準備

richmanbtc さんの著書「日給300万円のSS級トレーダーが明かす botterのリアル」に記載の内容でハマったので、備忘録として事前に必要な内容を記しておきます。
https://www.amazon.co.jp/-/en/gp/product/B09NR1683X/ref=ppx_yo_dt_b_d_asin_title_o02?ie=UTF8&psc=1


1. Docker for Desktop のインストールが必要
Docker for Desktop を動作させるにはログインが必要なようでサインアップも必要です。
OS 再起動時は Docker for Desktop を起動することをお忘れなく。

2. Dockerfile の修正が必要
mlbot_tutorial\docker_images\jupyter\Dockerfile  
 ``` 
 ccxt==1.92.20 \  
 ```
 ※ Amazon のコメントを参考にしました。ありがとう！  
3. Python, JupyterNotebook のインストールが必要 
4. (任意) 無料で良いので Code Editor をインストールしておくと編集が楽かも 

これで、docker-compose up -d を実行すると、Creating mlbot_tutorial_notebook_1 ... done まで行ったんでたぶん OK。
日本マイクロソフトYouTube『ネタバース』がおもしろい！

# はじめに

『ネタバース』ってご存じですか？”ネタ＋Birth”で『ネタバース』なのですが、これが何かというと、日本マイクロソフトの公式YouTubeチャンネルの中で配信されている番組です。先日社内のプライベートな勉強会に参加した際にマイクロソフトの方（この方もとても有名な方です）から、この『ネタバース』の紹介をいただきました。
早速見てみたのですが、なんとエバンジェリストの西脇資哲さんが出ているじゃありませんか！！
私は西脇さんの隠れファンでして、マイクロソフトのカンファレンスに参加する際には意の一番で西脇さんのセッションを予約していたものでした。兎にも角にもプレゼンテーションがうまいんですよね。あと、サービスの細かい仕様というよりはマイクロソフトがどんなビジネスをしているのか、キラキラしたテーマと共に話してくれて、それが響くんです。そんな西脇さんがお送りする『ネタバース』を今回一気見してしまいました。

# YouTubeで”ネタバース”って検索してみて！

2022年9月時点では12本程の動画が上がっています。1本の動画は10分弱で構成されていて気軽に見ることができます。まだあまり認知されてないのか、各動画の再生数は3000回ほどです。各回セキュリティや働き方改革など様々なテーマを取り上げて解説してくれています。西脇さんのトークのスピード感とアップテンポなJazzyなBGMがとても良くマッチしてます！

番組の大体の構成は、
* Today's Topics
* Nishiwaki's Point of view
* Prediction
の3つになっていて、始めにそのテーマに合わせた世の中の動向やマイクロソフトの取り組みをファクトベースで解説、続いて西脇さんがこう思うという考察、最後に未来に向けた予測や取り組み、という流れで進みます。見ていてあっという間に終わってしまいます。

# 勝手にランキング
まだそこまで動画数がないものの話題は多岐にわたります。そんな中で「これは面白い！見てみるといいよ！」というのを勝手にランキングしてみました。

### 第3位
**_宇宙ビジネス 徹底解析_**
https://www.youtube.com/watch?v=K5CJkwTocBg
とりあえず「宇宙」には浪漫を感じますね。Azure Spaceと自分の仕事がリンクするとは現段階では到底思えませんが、「なにかできないかなぁ」と無理にでもリンクさせたくなる気持ちを覚えます。長期的にネタにしたいと思わせる一本です。

### 第2位！
**_本気のセキュリティ 徹底解析_**
https://www.youtube.com/watch?v=4t6dkl4ZG0E
昨今、セキュリティがどれだけ脅かされていて、そしてマイクロソフトがセキュリティにどれだけリソースを投入しているかがよくわかる一本です。最新の攻撃では、AIの機械学習への攻撃、なんてのもあるんですね。そういう最新の攻撃を分析して対処するというマイクロソフトの姿勢がよくわかりますし、そんな中で提供されるセキュリティサービスを使ってみたくなりますね。

### 第1位！！
**_データセンター 徹底解析_**
https://www.youtube.com/watch?v=GExEUbUEY_8
とりあえずこれだけでも見てみて、という一本です。”圧巻”です。マイクロソフトがどれだけデータセンターに投資しているかがよくわかり、一番インパクトがある動画となるでしょう。そして、ただ単にデータセンターを拡張しているだけでなく、環境への配慮も怠っていないのがポイントですね。ぜひ日本のデータセンターの更なる投資もお願いしたいところです。

# 私的な見方

『ネタバース』を通じた西脇さんのプレゼンはAzureやマイクロソフトサービスに携わる技術者に勇気を与えてくれるものと思っています。日々Azureに携わっている私としては、時には障害を引いてお客様に謝らないといけないこともありますし、Azureのイケてない仕様に泣かされることもあるし、サポートと喧嘩することもあります。総じてAzureが嫌いになることが一定の周期であります。ただ、自分が関わっているAzureやマイクロソフトがこんなこともやっていて、こんなにすごいんだ！だったらこんなネタも出来るかも！ととってもポジティブになれる瞬間を与えてくれるのが『ネタバース』です。この番組はサービスアップデートとか技術ノウハウの獲得のためではなく、そういう見方をすればいいと個人的には思いました。

# おわりに
今回は日本マイクロソフトがお送りする『ネタバース』について書いてみました。個人的には応援していますので末永く続いてくれればいいなと思います。皆さんも一度でいいのでぜひ御覧になってください！少し勇気が出ると思いますよ！それではまた！

（少々エモい記事になってしまった。Qiitaの主旨違うけどBanされないかな・・・）
社内のファイルサーバーが故障したので修理して監視した話

この記事の関連です。

https://qiita.com/tomgoodsun/items/66b087487c387fa337c8

週に1回、土曜日に`raid-check`が走るのですが、週明けRAIDが外れていることが多い。
すべてのRAIDが外れていたので、すべてのRAIDを一斉にリビルドしたら、すぐに順次リビルドがキャンセルされていきます。
取り出したHDDはというと、素手で触れないくらい熱い。
温度が取れないかと思ったのですが、`hdd_temp`ではUSBストレージの温度は取れないみたいです。

そこでS.M.A.R.T.なら取れるということで、`smartctl`で`Temperature_Celsius`の値を見てみるとMaxで80度とかなってた。
HDDの熱ってそこまで出る？とか思ってたら、3つあるディスクタワーのうち、2つの排熱ファンが回っていない。
これは熱がこもる。

ということで色々調べていると、裸族のスカイタワーを販売するCENTURYの公式ブログにファンの交換方法が載っていました。

http://century1000.jugem.jp/?eid=1111

純正部品もあるみたいなのですが、在庫が少ないみたいです。
ブログの記事によれば、140mmで3ピンであれば問題なさそうなので、これに合うものを探した結果、NOCTUAのものが良さそうでした。

https://www.amazon.co.jp/dp/B00KESSI2A

サーバーの電源を止めてファンを交換。
元々ついていたファンはモーターでは回りそうもないぐらい渋い動きしかしない。
ファン固定用のビスは、元々ついていたもののほうがいい。ファンについてくるものは、裸族のスカイタワーのネジ穴をすり抜けそうで怖い。

で、交換したあとですが、「工業用 高負荷冷却」と書いてあるだけあって、騒音は若干増えたもののしっかり排熱されていました。

Zabbixで監視できるようにもしてみたのですが、週末の空調が効いていないときでも50度ぐらいで高止まっており、排熱効果はあったかなと思います。

https://www.riscascape.net/archives/786

※zabbix-agentをRootで動かしている場合は`/etc/zabbix/zabbix-agentd.conf`で`AllowRoot=1`にする必要があります。

ちなみにこのファンを交換する方法は以下の2つの製品で同じ方法でできました。

- [裸族のスカイタワー 10Bay IS (CRST1035U3IS6G)](https://www.century.co.jp/products/crst1035u3is6g.html)
- [裸族のスカイタワー 10Bay USB3.2 Gen2 IS (CRST1035U32CIS)](https://www.century.co.jp/products/crst1035u32cis.html)
Cloud SQL のネットワーク設定の選択肢について

# はじめに
AWSからクラウド環境を構築する人は違和感があるかもしれませんが、
Google CloudではCloud SQLをパブリックに構築する状態がデフォルトになっています。
それをプライベートで行う場合はどういった設定になるのか？
それぞれのネットワーク環境での接続も含めて記載できればと思っています。

# 概要
Cloud SQLはGoogle CloudでのDBのマネージドサービスです。AWSでいうRDSにあたるものです。

https://cloud.google.com/sql/docs/mysql/introduction?hl=ja

設計思想の違いもありますが、例えばAWSのRDSではベストプラクティス上、プライベートサブネットに構築すること機会が多いと思います(Security Hubのマネージドルールにもありました)。
Googleではデフォルトがパブリック接続となっておりますが、もちろんプライベートでの構築も可能ですので、パブリックな場合、どういった設定になるのか、プライベートでも同様にどういった設定になるのか、また接続はどうなるのか、、記載していきます。

# 構築及び接続の違い

## 構築(パブリックIP)
以下構築時のGUI画面となりますが、Cloud SQL のインスタンス作成画面のNW設定箇所となりますが、パブリックIPにチェックをすると、パブリックIPが割り当てられます。

https://cloud.google.com/sql/docs/mysql/configure-ip?hl=ja

![スクリーンショット 2022-09-12 22.19.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1720034/ba3b004f-af44-f8f1-4581-678f129d0264.png)

また、承認済みネットワークにこのDBに対する接続元含めることで、パブリックIPが付与されます。
単純なSQL接続をパブリックIPに対して行うにあたって、「承認済みにネットワーク」に接続元IPアドレスを記載する必要があります。

https://cloud.google.com/sql/docs/mysql/authorize-networks?hl=ja

なお、Cloud SQL Auth Proxyを利用し、対象に接続するには「補足」にも記載していますが、
追加で準備がございますので、「補足」を参照ください。
### 補足
承認済みネットワークに対象を含めていない場合でもCloud SQL Auth Proxyを利用して接続することが可能です。

https://cloud.google.com/sql/docs/mysql/sql-proxy?hl=ja

この機能を利用することでIAM権限(IAMユーザだけでなくサービスアカウントも可)を利用した認証が可能となります。仕組みは以下の通りです。
またこれを利用することでパブリックに有りながら暗号化通信且つIAMでの権限を利用したセキュアな通信となります。

https://cloud.google.com/sql/docs/mysql/sql-proxy?hl=ja#how-works

なお、それを利用した場合の注意点も以下に記載がございますので、この点を加味して検討が必要となります。

https://cloud.google.com/sql/docs/mysql/sql-proxy?hl=ja#production-environment

## 構築(プライベートIP)
以下GUI画面となりますが、関連付けられたネットワーキング箇所にVPCを選択する必要があります。そのVPCとのプライベート接続が可能となります。画像内だと「h-saito-test-vpc」とプライベートサービス接続が設定されます。
![スクリーンショット 2022-09-12 22.29.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1720034/2f032cf0-f5d5-087d-7f13-bdf97140016e.png)
なお、スクショ内にもある通り、プライベートサービスアクセスを利用しますので、作業アカウントには、ネットワーク管理権限を付与しておく必要がございます(ない場合スクショの通り「ネットワーク管理権限を持つ担当者に〜」という警告が表示されます)。詳細は以下参照ください。

https://cloud.google.com/sql/docs/mysql/configure-private-ip?hl=ja

### 補足
プライベートサービスアクセスは、そのVPC内ではなく、Google Cloudが管理するNWと対象VPCをPeering(紐付けること)ができ、それを行うことで、マネージドサービスで構築される「Cloud SQL」、「MemoryStore」等のマネージドサービスとプライベート接続を行うことが可能となります。イメージとしては以下のような形です。
![スクリーンショット 2022-09-12 23.32.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1720034/646b9056-ccfe-92a7-e315-79179b02a530.png)
プライベートIPを選択しインスタンス作成を進めることで、プライベートサービスアクセスを設定も行うようなウィザードになっていますので、構築時にそこまで意識しなくて良いような状態となっております。
![スクリーンショット 2022-09-12 23.04.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1720034/3cbba12b-edcd-9b53-4d86-bdaae94bbd60.png)

# 所感
粛々とただ設定内容について記載しましたが、選択肢がいくつかあることがわかるかと思います。
この選択肢がベストということはなく、システム要件に応じた選択が必要になります。
パブリックにあってもCloud SQL Auth Proxyのような推奨されている接続であればOKなのか、プライベートIPアドレスのみで接続できればOKなのか、それとも諸々の事情でただのパブリック接続でなければいけないのか、など、それぞれ要件に応じた接続が必要となるので、その点加味して設計、設定していく必要があり、それらの選択肢の広さを意識しもらえればと思います。
【UiPath】要素の存在を確認 (Element Exists) でトップレベルウィンドウが取れなくてもエラーにならなくなってた

**要素の存在を確認 (Element Exists)** アクティビティは要素が見つかったらTrue、見つからなければFalseを返します。
~~なのでエラーにはならなそうですが、部分セレクターでトップレベルウィンドウが取れないとエラーになります。~~
という記事を書こうとしたんですが、**v2022.4時点ではエラーにならなくなってました。**
いつ修正されたかは確認できてないですが、せっかくなので記録として記事にしておきます。

### どこでエラーになるのか
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/543f0fe8-c43e-9e03-7e06-2f1cb448f6e6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/5f64080b-c0de-b49b-15b5-d9f1d9d94e7f.png)

上図のシーケンスでは、次の順番で処理を行っています。
①ブラウザーにアタッチする。
②メッセージボックスを表示する。
③要素の存在を確認する。
④要素の存在の確認結果をログ出力する。

また、③要素の存在を確認する では部分セレクターを使用しています。

この処理の場合、②メッセージボックスを表示する のタイミングでブラウザーを閉じると、
~~次の③要素の存在を確認する がエラーになります。~~ 
~~トップレベルウィンドウのセレクターが取得できないとエラーということですね。~~
v2022.4時点ではエラーにならず、④でFalseが返ります。

## 参考

https://docs.uipath.com/activities/lang-ja/docs/ui-element-exists

https://docs.uipath.com/studio/lang-ja/docs/full-versus-partial-selectors
【Jetpack Compose】Material3でテーマカラーを変更する際に陥りがちなミス

# 概要
Material3で新しくプロジェクトを立ち上げた際、テーマカラーを変えようとしてLightColorSchemeのフィールドをいじるのですが、それだけいじっても反映されないことがあります。![スクリーンショット 2022-09-12 23.04.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524029/f409db17-7f31-5408-62c9-805e6f851e25.png)

# コードの変更箇所
```Kotlin:test.kt
private val LightColorScheme = lightColorScheme(
    primary = Color.Blue,
    secondary = PurpleGrey40,
    tertiary = Pink40

    /* Other default colors to override
    background = Color(0xFFFFFBFE),
    surface = Color(0xFFFFFBFE),
    onPrimary = Color.White,
    onSecondary = Color.White,
    onTertiary = Color.White,
    onBackground = Color(0xFF1C1B1F),
    onSurface = Color(0xFF1C1B1F),
    */
)
```
ためしにLightColorSchemeのprimaryをColor.Blueにしてみましたが、アプリをビルドした際にテーマカラーの変更が反映されません。
何色にしても、secondaryやbackgroundをいじっても変わりません

# 原因
それもそのはず、デフォルトで適用されているのがLightColorSchemeではありませんでした。

プロジェクトを生成した時に自動的に追加されるComposabke関数があります。今回はTestという名前で作ったので、TestThemeという関数ができます。
```Kotlin:test.kt
@Composable
fun TestTheme(
    darkTheme: Boolean = isSystemInDarkTheme(),
    // Dynamic color is available on Android 12+
    dynamicColor: Boolean = true,
    content: @Composable () -> Unit
) {
    val colorScheme = when {
        dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> {
            val context = LocalContext.current
            if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context)
        }
        darkTheme -> DarkColorScheme
        else -> LightColorScheme
    }
    val view = LocalView.current
    if (!view.isInEditMode) {
        SideEffect {
            (view.context as Activity).window.statusBarColor = colorScheme.primary.toArgb()
            ViewCompat.getWindowInsetsController(view)?.isAppearanceLightStatusBars = darkTheme
        }
    }

    MaterialTheme(
        colorScheme = colorScheme,
        typography = Typography,
        content = content
    )
}
```
追加された時には上記のコードなのですが、APIレベルが31以上の時に、dynamicDarkColorSchemeが適用されるようになっているので、ビルドする端末のAPIレベルしだいでは、LightColorSchemeが適用されません。

```Kotlin
        dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> {
            val context = LocalContext.current
            if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context)
        }
```
ここらへん削除するとdynamicLightColorSchemeが適用されなくなるので、LightColorSchemeで変更したテーマカラーが反映されるようになります。