OmniAICreator/Qiita-1.07M huggingface dataset:
Teams 会議へ匿名ユーザーで参加する手順  (Teams を利用していない人の会議参加手順も兼ねています)

# はじめに
Teams を使用したオンライン勉強会やコミュニティイベントが催される際にその様子を録画し、YouTube などで公開されることが多くなりました。
その際に、普段利用しているアカウントで会議に参加し、結果的に意図せず氏名が公開される状況を避けるために、匿名参加する手順についてまとめるものとなります。

また、Teams を利用していない人も記載の方法で参加できるので、参考になれば幸いです。

# 留意事項
匿名参加の場合は、一部の機能が使用できない場合があります。
2022年10月現在では、よく利用する以下の機能が利用できないことを確認していますが、今後のアップデートで変わる可能性は考えられます。
・挙手以外のリアクション機能
・背景の設定で任意の画像使用する

また、Teams 会議を開催する組織の設定で匿名参加を許可していない場合は、これらの手順での会議の参加を行うことはできません。

# 方法 1 : ブラウザーのゲスト モードから参加する方法
Web ブラウザーから Teams 会議に参加する場合に、Microsoft 365 にサインインしていない状況で参加することで匿名参加を行うことができます。
サインインしているブラウザーのゲスト モードを使用することで実現することが可能です。

1) ゲスト モードの起動方法は、Chrome の場合は、Chrome を起動し、右上のプロフィールアイコンをクリックし、[ゲスト] をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/14da092b-ccd5-04d0-668b-d0c41d6689b8.png)

Edge の場合は、Edge を起動し、右上のプロフィールアイコンをクリックし、[ゲストとして参照] をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/e7650eff-49ae-ba28-f49e-f26259c77557.png)

2) 開かれたウィンドウのアドレス欄に Teams 会議の URL を貼り付けて、[このブラウザーで続ける] をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/dd45bd4c-e1c4-09b5-0d28-4d279754c9ab.png)

3) マイクとビデオの許可は任意で選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/7bd69125-30bb-b01f-1de1-d0e295895918.png)

4) 名前を入力して、[今すぐ参加] をクリックして完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/45cbaea7-f55e-9443-c49e-4951ddd73b92.png)

# 方法 2 : Teams アプリからサインアウトした状態で参加する方法
Teams アプリからサインアウトすることで、アプリからも匿名参加することが可能です。
ただし、サインアウトした場合にもアプリ側でキャッシュが残っていて普段使用しているユーザーで参加してしまう状況もあり得るため、特に理由がなければブラウザーからの利用が良いのではないかと思います。

1) Teams アプリで、ユーザーアイコンをクリックし、サインアウトをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/54d7e2d0-0726-648b-72ba-3a381575499f.png)

2) サインアウトが完了後に、Teams 会議のリンクをクリックまたはブラウザーのアドレス欄に URL を貼り付けて、[Teams (職場または学校) を開く] をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/b5efb20c-e5cb-47b5-d201-f67d9bcbd96f.png)

3) 名前を入力して、[今すぐ参加] をクリックして完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/3bc3187f-6280-c3e9-ab54-b078fecf35c0.png)
Drivetrain with internal combustion engine, ボッシュ自動車handbook 11版(43) p.594

Drivetrain, Drivetrain with internal combustion engine, ボッシュ自動車handbook 11版(43)

人生で影響を受けた本100冊。
https://qiita.com/kaizen_nagoya/items/16af53acbb147a94172e

に掲載した本のうち、「新人プログラマ応援」企画で「私の推薦書３３冊」として３３冊紹介した。

新人プログラマ応援　私の推薦書３３冊
http://qiita.com/kaizen_nagoya/items/98c62f051dbdb4f8aca2
残りの６７冊から、順に過去の読書感想を引用し、新たな読書感想文を追記する。

 <この項は書きかけです。順次追記します。>


# ボッシュ自動車ハンドブック version 11, 2022

Automotive Handbook  May 2, 2022

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

ボッシュ自動車handbook(英語)11版(0)＜エンジニア夏休み企画>【読書感想文】

https://qiita.com/kaizen_nagoya/items/dfa35aa6f669e5df983e
# Contents
Motor vehicle, 28
Basic principles, 32
Mathematics and methods, 204
Materials, 258
Machine parts, 354
Joining and bonding techniques, 426
Vehicle physics, 462
Operating fluids, 538
Refrigerants for air-conditioning systems, 591
Drivetrain(駆動系), 594
#  Drivetrain with internal combustion engine
P.594
## Drivetrain elements 
## Function of the drivetrain
## Tractive force curves 
## Drive types 
### Standard drive
### Front wheel drive
### All wheel drive
### Mid engine drive
### Rear engine drive
### Transaxle drive
### Underfleer engine drive


# 自己参考資料(self reference)

ボッシュ自動車ハンドブック 

https://qiita.com/kaizen_nagoya/items/8e330ce57880f04d71d9
ボッシュ自動車handbook(英語)10版　目次

https://qiita.com/kaizen_nagoya/items/57c799ff544c96efdea9

自動車工学とBosch Vehicle Handbook

https://qiita.com/kaizen_nagoya/items/d13ff6b0e4d7c8907c0d

 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

# 文書履歴(document history)
ver. 0.01 初稿 　20221023
【Java】実は難しいIntegerの配列（1～Nまでの初期化）

# はじめに
そもそもJavaで`Integer`の配列を扱うことは少ないと思います。
`java.util.List`を使うほうが一般的です。これは`Integer`の配列をどうしても生成したかったため、筆者が試した記録です。

# 基本的な定義方法
要素数3の`Integer`配列の定義は以下のようになります。
```java:要素数3のInteger配列の定義
Integer[] numbers = new Integer[3];
```
このときの配列の中身は`null`が並びます。
```java:出力
Integer[] numbers = new Integer[3];
Arrays.stream(numbers).forEach(System.out::println);
```
```:出力結果
null
null
null
```
# 1～NまでのInteger配列を作る
単純にやるのであれば以下の方法でいけます。
```java:1～Nまでの配列を作るメソッド
private Integer[] createNumbers(int n){
  Integer[] numbers = new Integer[n];
  for (int i = 0; i < n; i++) {
    numbers[i] = Integer.valueOf(i + 1);
  }
  return numbers;
}
```
オートボクシングが働くので`Integer#valueOf`はなくても動きます。
```java:オートボクシング
private Integer[] createNumbers(int n){
  Integer[] numbers = new Integer[n];
  for (int i = 0; i < n; i++) {
    numbers[i] = i + 1;
  }
  return numbers;
}
```
# Stream APIを使ってなんとかしたい！
さてintの配列であればStreamを使って作ることができます。
```java:intの配列
private static int[] createNumbers(int n) {
  return IntStream.rangeClosed(1, n).toArray();
}
```
すっきりしたコードでかけますね。
Integerだとそもそも1～NまでのStreamを作ることが少しめんどくさいです。
```java:Streamを使った例
private Integer[] createNumbers(int n){
  return IntStream.rangeClosed(1, n).mapToObj(Integer::valueOf).toArray(Integer[]::new);
}
```
以下の手順でIntegerの配列を作ることができます。
1. `IntStream`で1～NまでのStreamを作り、
1. `mapToObj`でIntegerのStreamに変換し、
1. `toArray`で配列に変換

なお、`toArray`を引数なしで呼び出すと`Object[]`が戻り値になってしまいます。

# Stream#toArrayの引数
さて`IntStream#toArray`の引数は配列の生成関数（`IntFunction<A[]>`）となっています。
これは以下のようなシグネイチャを指します。
```java
A[] function(int i){
  return hoge; // A[]型
}
```
なおJavaDocを見ると、「要求された配列のサイズを表す整数を受け取り」とあります。
軽く検証するために以下のようなコードを実行してみました。
```java:検証コード
IntStream.rangeClosed(1, n).mapToObj(Integer::valueOf).toArray(i -> {System.out.println(i);return new Integer[i];});
```
結果は当然nの値が表示されます。たとえば`n=3`であれば`3`です。
しかし10だけ余裕を持った配列を生成したい場合、以下のように処理を書けば良さそうですがそうはいきません。
```java
private Integer[] createNumbers(int n){
  return IntStream.rangeClosed(1, n).mapToObj(Integer::valueOf).toArray(i -> new Integer[i + 10]);
}
```
実行時エラーとなり、`n=3`のときは以下のようなメッセージが出力されます。
`java.lang.IllegalStateException: Begin size 3 is not equal to fixed size 13`
要素に余裕がほしい場合、（Integerに限らず）Streamは使わないほうが賢明でしょう。

# まとめ
普通にforを回す or `IntStream.rangeClosed(1, n).mapToObj(Integer::valueOf).toArray(Integer[]::new)`で生成できます。

Stream#toArrayは微妙に使いにくいという印象を受けました。
引数なしで`Stream<T>.toArray()`の結果はT[]のほうがみんな幸せな気がしますがどういう経緯なんですかね？
初期化用の関数渡せるわりに要素数を指定できないので`T[]::new`以外で使い道がほぼないのに・・・。
WSL2 with Windows Docker Desktop 上の krustlet-wasi で node が 404 エラーで作れない問題 (k8s v1.22 以降)

## 前提
- 環境 : WSL2 with Windows Docker Desktop
- k8s : v1.22 以降
- krustlet : v1.0.0-alpha.1 もしくは v0.7.0
- 想定 : 上記 krustlet 利用者、以下で Krustlet’s WASI provider を用いてノード作成時に下部の事象が発生

https://docs.krustlet.dev/howto/krustlet-on-wsl2/#step-3-install-and-run-krustlet

## 事象
WSL2 with Windows Docker Desktop を利用時に kubernetes の v 1.22 以降にて、krustlet / krustlet-wasi を用いて krustlet 用の node を作ろうとすると 以下のエラーで失敗する問題が発生しています。

```
Error: ApiError: the server could not find the requested resource: NotFound (ErrorResponse { status: "Failure", message: "the server could not find the requested resource", reason: "NotFound", code: 404 })
```

## 解決法
krustlet のバージョンを v1.0.0-alpha.1 もしくは v0.7.0 のものではなく、以下の Canary ビルドを利用することで解決できます。

https://docs.krustlet.dev/intro/install/#from-canary-builds


## 参考
https://github.com/krustlet/krustlet/issues/699
AndroidのJetpack Composeアニメーションを触ってみる（AnimatedVisibility）

Jetpack Composeアニメーション使用して動かしてみようと思います。

今回は高レベル アニメーション API　の　AnimatedVisibilityについてやっていこうと思います。

https://developer.android.com/jetpack/compose/animation?hl=ja#low-level-apis


# AnimatedVisibilityコンテンツの表示と非表示をアニメーション化

```AnimatedVisibilityView.kt
@Composable
fun AnimatedVisibilityView(name: String) {
    var isExtended by remember { mutableStateOf(false) }
    Box(
        modifier = Modifier.fillMaxSize(),
        contentAlignment = Alignment.Center,
    ) {
        Button(modifier = Modifier
            .width(200.dp)
            .height(200.dp), onClick = { isExtended = !isExtended }) {
            Row(
                modifier = Modifier
                    .width(100.dp)
                    .height(100.dp),
                horizontalArrangement = Arrangement.Center,
                verticalAlignment = Alignment.CenterVertically
            ) {
                AnimatedVisibility(isExtended) {
                    Text(
                        text = name,
                        Modifier
                            .padding(start = 8.dp, end = 12.dp)
                            .background(Color.Red)
                    )
                }
            }
        }
    }
}
```

![Videotogif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/d7db3a7b-56af-42e5-4708-61867038c249.gif)


# AnimatedVisibility
重要なのはここの部分です`AnimatedVisibility(isExtended)`表示、非表示の切り替えたいViewをこの中に記載します。
渡す引数ですが、`false`非表示`true`が表示です。

EnterTransition と ExitTransitionを設定することで、表示時、非表示時のアニメーションの方向などカスタムする事ができるみたいです。
こちらはまた今度触ってみようと思います。
【Linux】grepコマンドの使い方

## 基本的な使い方

grepコマンドは標準入力や指定したファイルから特定の文字列が含まれている行を取得できます。

`sample.txt`を作成します。

```sample.txt
12345
67890
ABCDE
FGHIJ
123
678
ABC
FGH

```

grepコマンドを以下のように実行します。

```zsh
$ grep '1' sample.txt
12345
123
```

標準入力を対象に実行する場合には以下のようにします。

```zsh
$ cat sample.txt | grep '1'
12345
123
```

## AND検索

複数の文字列を含む行を取得するには以下のように実行します。

```zsh
$ grep '1' sample.txt | grep '5'
12345
```

`1`と`5`の両方が含まれる行のみ取得できています。

## OR検索

複数の文字列のいずれかが含まれている行を取得するには以下のように実行します。

```zsh
$ grep -e '1' -e 'D' sample.txt
12345
ABCDE
123
```

または正規表現を使用して以下のように実行します。

```zsh
$ grep -E '1|D' sample.txt
12345
ABCDE
123
```

上記どちらの方法でも`1`または`D`を含んだ行を取得できています。

## NOT検索

特定の文字列を含まない行を取得するには以下のように実行します。  

```zsh
$ grep -v 'A' sample.txt
12345
67890
FGHIJ
123
678
FGH
```

`A`を含まない行を取得できています。

## 完全一致

特定の文字列に完全一致する行を取得する場合には以下のように実行します。

```zsh
$ grep -x 'ABC' sample.txt
ABC
```

`ABC`に完全一致する行のみ取得できています。
エスペラント語を漢字変換するpythonコードを書いて、streamlitでアプリ化した。

漢字化アプリ　https://esperantokanjika20240310-yxnk6e4xgwkm7swpmff9xc.streamlit.app/

エスペラント文を漢字変換するアプリを書きました。　コードの仕組みは、決して複雑な仕組みではありませんが、
https://github.com/Takatakatake/Esperanto_kanjika_20240310/tree/main/%E4%B8%96%E7%95%8C%E8%AF%AD%E6%96%87%E6%9C%AC%E6%B1%89%E5%AD%97%E8%BD%AC%E6%8D%A2%E4%BB%A3%E7%A0%81%E7%9A%84%E8%AF%B4%E6%98%8E(%E3%82%A8%E3%82%B9%E3%83%9A%E3%83%A9%E3%83%B3%E3%83%88%E6%96%87%E3%81%AE%E6%BC%A2%E5%AD%97%E5%A4%89%E6%8F%9B%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E8%AA%AC%E6%98%8E)
の
"20240323世界语全部单词_大约44100个(原pejvo.txt)のすべての単語を漢字化し、それを以て漢字置換_html形式＿中国語、日本語の注釈付き.ipynb"に注釈をつけています。(何らかの生成AIに投げて何をしているか要約してもらったほうが早いかもしれません。)　streamlitには、上のブランチの、"Esperanto_kanjika_20240310"レポジトリをまるごと登録し、"Esperanto_kanjika_20240310"レポジトリ上のmain.pyをdeployしています。

エスペラントの漢字化の背景にある思想についてはhttps://twitter.com/WM6GIHcMvvY41kf/status/1769520022031138956
をご覧ください。

また、
https://stkyotouac-my.sharepoint.com/:f:/r/personal/yamauchi_takafumi_72n_st_kyoto-u_ac_jp/Documents/%E4%B8%96%E7%95%8C%E8%AF%AD%E6%B1%89%E5%AD%97%E5%8C%96%E9%A1%B9%E7%9B%AE?csf=1&web=1&e=cO8FOv
には、今までエスペラントの漢字化についてすすめてきた全てのファイルが入っています。
rubizipでzipファイル中のzipファイルにアクセスしてみた


## はじめに

rubyで、zipファイル中のzipファイルにアクセスする必要があり、いろいろ悩んでアクセスできたので、記録しておきます。
zipファイル中のzipのデータをioとして処理できずに悩みましたが、StringIOを使って解決することができました。

## やりたい事例

* `hoge_hoge.zip`の中に`hoge.zip`ファイルがアーカイブされている。
* `hoge.zip`の中に`hoge1.txt`と`hoge2.txt`がアーカイブされている。
* `hoge_hoge.zip`から`hoge1.txt`と`hoge2.txt`にアクセスしたい。

```
hoge_hoge.zip
  +-- hoge.zip
      +-- hoge1.txt
      +-- hoge2.txt
```

```hoge1.txt
hoge1 contents
```

```hoge2.txt
hoge2 contents
```

## コード

```ruby:zip_in_zip.rb
require 'zip'

Zip::InputStream.open('hoge_hoge.zip') do |zio1|
  while (entry1 = zio1.get_next_entry)
    puts "entry1 file:  [#{entry1.name}]"
    if entry1.name == 'hoge.zip'
      sio = StringIO.new(zio1.read, 'r+')
      Zip::InputStream.open(sio) do |zio2|
        while (entry2 = zio2.get_next_entry)
          puts "+- entry2 file: [#{entry2.name}]"
          puts "   contents:    [#{zio2.readline.chomp}]"
        end
      end
    end
  end
end
```

### 実行結果
```
entry1 file:  [hoge.zip]
+- entry2 file: [hoge1.txt]
   contents:    [hoge1 contents]
+- entry2 file: [hoge2.txt]
   contents:    [hoge2 contents]
```
Rails7でtailwindCSSをインストールする方法

まだアプリケーションを作成していない場合は、下記コマンドでtailwindが使えるようになります。
```
rails new myapp --css tailwind
```

既にアプリケーションがある場合、下記二つのコマンドを実行すればインストールされます。
（参考にしたサイト→ [tailwindcss-rails](https://github.com/rails/tailwindcss-rails/blob/main/README.md "")）

```
./bin/bundle add tailwindcss-rails
./bin/rails tailwindcss:install
```
Pythonでネットワークアドレス同士の差を求める

# はじめに
　以前、Pythonでネットワークを集約する[スーパネット化の記事](https://qiita.com/aikamanami11/items/4e8348d7369d9dadb1c4
)や[ネットワークを分割する記事](https://qiita.com/aikamanami11/items/6ecb4fe19ea94cd1b5e3)を書きましたが、今回はPythonでネットワークアドレス同士の差を算出する方法について書こうと思います。
　この方法で、あるネットワークアドレスから別のより小さいネットワークを切り出した後に残るネットワークアドレスを求めることができます。

　手っ取り早くそれを実現したい方は[こちら](http://ossan.jp/ipaddr/diff/)をご利用ください。

http://ossan.jp/ipaddr/diff/

# ネットワークアドレス同士の差を求める

　ここでは<code>192.168.32.0/24</code>のネットワークと<code>192.168.0.128/26</code>の差を求めて、前者のネットワークから後者のネットワークを切り出した後に残るネットワークアドレスを計算したい。

・準備

　必要なライブラリのインストール。
```
pip install netaddr
```

・ネットワークの差を求める


```python:differ.py
#便利なライブラリのnetaddrを読み込む
from netaddr import IPSet

#192.168.32.0/24のネットワークをIPSetクラスに渡してオブジェクトs1を生成。
s1 = IPSet(['192.168.0.0/24'])

#192.168.32.128/26のネットワークをIPSetクラスに渡してオブジェクトs2を生成。
s2 = IPSet(['192.168.0.128/26'])

#差分を求める
s3 = s1.difference(s2)

#算術演算の様にしても差分を求められる!
#s3 = s1 - s2
print(s3)
```

・結果
　この様に<code>192.168.32.0/24</code>のネットワークから<code>192.168.0.128/26</code>を切り出すと<code>192.168.0.0/25</code>と<code>192.168.0.192/26</code>のネットワークが残ることがわかる。
```:結果
IPSet(['192.168.0.0/25', '192.168.0.192/26'])
```

　特にnetaddrライブラリを推しているわけではないけれど、この記事をnetaddrで書き始めてしまったので、ここまで書いたが、[ipaddress](https://docs.python.org/ja/3/library/ipaddress.html)ライブラリでも同じことが出来る。このライブラリは[標準ライブラリ](https://docs.python.org/ja/3/library/index.html)に含まれていて、インストール不要なので一つのネットワークアドレス同士の差を求める場合はこちら方が使いやすい。

```python:differ1.py
from ipaddress import IPv4Network

s1 = IPv4Network('192.168.0.0/24')
s2 = IPv4Network('192.168.0.128/26')
s3 = list(s1.address_exclude(s2))  

print(s3)
```
```:結果
[IPv4Network('192.168.0.0/25'), IPv4Network('192.168.0.192/26')]
```
# さいごに
　この[netaddr](https://netaddr.readthedocs.io/en/latest/index.html)や[ipaddress](https://docs.python.org/ja/3/library/ipaddress.html)というライブラリはIPアドレスやネットワークアドレスに対する操作をするのにすごく便利なライブラリで、サブネット分割だけでなく、さまざまな操作ができます。

　これまでにいくつか記事を書きましたので、そちらもご参照ください。
　また、そのような操作をWeb上でできる[サイト](http://ossan.jp/ipaddr/)を提供しているので是非ご利用ください。

https://qiita.com/aikamanami11/items/d88183c7ced2df071ea0

https://qiita.com/aikamanami11/items/4e8348d7369d9dadb1c4

https://qiita.com/aikamanami11/items/b63f9d663db0fdb34530

https://qiita.com/aikamanami11/items/6ecb4fe19ea94cd1b5e3

IP Addr Tools: IPアドレスやサブネットを操作するいくつかのツールを提供しています。

http://ossan.jp/ipaddr/

以上

参考サイト:

https://netaddr.readthedocs.io/en/latest/index.html

https://docs.python.org/ja/3/library/ipaddress.html
Db2,Sybase個人的メモ

# この記事の目的
タイトル通り個人的メモ。
仕事で毎度調べるのが億劫なので、一まとめにしたく書いてます。

# 目次
[1.Db2コマンド](#1-Db2コマンド)
[2.Sybaseコマンド](#2-Sybaseコマンド)
[3.参考サイト](#3-参考サイト)

# 1. Db2コマンド
### データベース接続状況を表示
```
db2 connect
```
### オプション一覧を表示
```
db2 ? options
```
### スキーマ名を設定する
```
db2 set schema スキーマ名
```
### 自動コミットオフ
デフォルトで自動コミットがオンなので、+cオプションをつけてあげることで安心。
```
db2 +c "SQL文"
db2 commit
```
### テーブルの一覧表示
```
db2 "list tables"
```
### 全てのテーブルの一覧表示
```
db2 "list tables for all"
```
### スキーマを指定してテーブルの一覧表示
```
db2 "list tables for スキーマ名"
```
### テーブル定義を表示
```
db2 "describe table テーブル名"
```
### スキーマを指定してテーブル定義を表示
```
db2 "describe table スキーマ名.テーブル名"
```
### 接続クライアント一覧
```
db2 "list applications"
```
### 1行目だけ表示
```
db2 "select * from テーブル名 fetch first 1 rows only"
```

### 5行目から10行目を表示
```
db2 "select * from テーブル名 offset 4 rows fetch first 6 rows only"
```
### SQLファイルを実行
```
db2 -tvf ファイル名
-t セミコロンをステートメントの終了文字とする
-v 実行結果を標準出力に出す
-f ファイルを入力する
```
### SQL実行結果をファイルに書き出す
ファイルタイプはDEL(カンマ区切りアスキー)とIXF(DB2バイナリ形式)の２種類がある。
```
db2 "export to ファイル名 of ファイルタイプ "select文" 
```
### ファイルからimport
insertが挿入、replaceが洗い替え。
```
db2 import from FILENAME of del [insert|replace] into TABLENAME
```
### ファイルからload
loadはトランザクションログを残さないので、importよりも高速。
なおloadが失敗したテーブルはロードペンディング状態になりアクセスできなくなる。
```
db2 load from FILENAME of del [insert|replace] into TABLENAME nonrecoverable
```

# 2. Sybaseコマンド
### クエリが返す行数を1行に制限
```
select top 1 * from テーブル名
```
もしくは
```
set rowcount 1
select * from テーブル名
set rowcount 0 (出力行数制限解除。）
```
### コマンドを実行する
infileにselect文など実行したいコマンドを書く。
```
isql -Uuser -Ppassword -Sservername -iinfile
```
### コマンド実行結果をファイルに書き出す
```
isql -Uuser -Ppassword -Sservername -iinfile -oOutfile
```
### セパレータ文字を指定する
デフォルトはスペースがセパレータ。
カンマ「,」をセパレータにした場合を参考。
```
isql -Uuser -Ppassword -Sservername -s,
```
### シェルコマンドを実行する
!!をつけることで、OSコマンドを実行できる。
```
isql -Uuser -Ppassword -Sservername
!!コマンド
```
### ヘッダを表示する間隔を指定する。
3行ごと表示する場合を参考。
```
isql -Uuser -Ppassword -h 3
```
### コマンドを複数回実行する
```
go 数値
```
### SQLのパフォーマンス統計情報を出力する
```
isql -Uuser -Ppassword -Sservername -p
select * from テーブル名
go
```

# 3. 参考サイト
### Sybase

http://www.ujp.jp/modules/tech/index.php/DB/Sybase/Common/Tools/isql.html

### Db2

所謂神ページというやつ。

https://portablecode.info/wp-content/uploads/2012/05/db2_cheat.pdf

https://qiita.com/sooogle/items/95d88facaf31f010ea05

ロックについて書いてある記事。今度読んでみよう😏😏😏

https://qiita.com/yatan/items/a109fa3be455c85e7bfd
Rstudio で色々なグラフを作成

こちらと同じデータを使って、色々なグラフを作成します。
[Rstudio で折れ線グラフを作図](https://qiita.com/ekzemplaro/items/38fae731813d198eeda3)

## 棒グラフ

```text
> tokyo <- c(3239,2714,1588,4213,4204,3489,2840)
> barplot(tokyo)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/cf0611db-6f30-d31f-6a21-d842c489739a.png)

```text
> barplot(tokyo, main="Covid19 Tokyo")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/9177cbec-adb6-5c91-ec4c-6f55a5634171.png)

## 円グラフ

```text
> pie(tokyo)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/650acf31-e47f-00f2-a854-358c3a4ff184.png)

```text
> pie(tokyo, main="Covid19 Tokyo")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/10f1d717-926a-e504-99ac-461c29f84a25.png)

## ヒストグラム

```text
> hist(tokyo)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/42689d6c-eb8e-2ce8-21d9-89041f15f02e.png)

```text
> hist(tokyo, main="Covid19 Tokyo")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/fe205b44-ea62-0704-4fdd-852cfb3c1495.png)
piyopiyo.exポータルチュートリアル ５章～faviconとページタイトルを設定する～

本記事はpiyopiyo.exポータルチュートリアルの５章となります。

https://qiita.com/tuchiro/items/050e6b86afc35a843a7c

# 本章の目的

ブラウザのタブに表示される、faviconとサイト名を変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243163/96d0438a-7bb6-7b7b-a867-a0b098555837.png)

# faviconを設定する

faviconの設定についてはプロジェクト生成時に下記に設定されているので、該当箇所に画像を配置するだけで置き換えることができます。

```Elixir:lib/phoenix_app_web/endpoint.ex
～中略～
  plug Plug.Static,
    at: "/",
    from: :phoenix_app,
    gzip: false,
    only: ~w(assets fonts images favicon.ico robots.txt) # <-- favicon setting here
～中略～
```

デフォルトでは空のファイルが配置されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243163/154f390e-c8c4-0dc7-f039-8499512777c2.png)
上書きすることで画像ファイルを置き換えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243163/26890cdf-e248-659d-7f6f-ae689169aac9.png)
置き換え後の画像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243163/7c453006-6230-f5f1-0918-50b80c0d4806.png)

# サイトのタイトルを変更する

サイトタイトルについては、すでに[３章でroot.htmlを修正したタイミング](https://qiita.com/tuchiro/items/df820f7e0c0dae873127#%E3%83%AB%E3%83%BC%E3%83%88%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%81%AE%E4%BF%AE%E6%AD%A3)で変更済です。

```HTML:lib/phoenix_app_web/templates/layout/root.html.heex
～中略～
    <meta name="og:type" content="website">
    <meta name="og:title" content="piyopiyo.exポータル"> <!-- Web Site Title here --> 
    <meta name="twitter:card" content="summary">
～中略～
```

ただし、現在トップページとなっているmessages一覧画面のハンドラで上書きされているため、「Listing Messages」が表示されています。
該当箇所を削除します。


```Elixir:lib/phoenix_app_web/live/message_live/index.ex
  defp apply_action(socket, :index, _params) do
    socket
#    |> assign(:page_title, "Listing Messages") # <-- delete here
    |> assign(:message, nil)
  end
```

# 結果の確認

faviconとページタイトルが反映されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243163/3e91d9bf-0006-b3f4-4ae6-ad329e83db39.png)

# 関連情報

- この演習完了時点のリポジトリ断面

https://github.com/TakutoYoshimura/LiveViewJpTutorial_PiyoPiyoExPortal/releases/tag/v0.5.0-setting-favicon

- 使用したpiyopiyo.exポータル公式のfavicon画像

https://github.com/TakutoYoshimura/LiveViewJPTutorial_PiyoPiyoExPortal/blob/main/priv/static/favicon.ico
Excel業務(無駄)を自動化したい　part4 表作り

# はじめに
このサイトでは、社会人なりたての私が無駄を省くための戦いをまとめています。
今回のテーマは、pythonのライブラリを用いて、Excelをいじっていきます。
ライブラリ名は、openpyxlです。

# 実行環境
Windows10
Python 3.10.5

# openpyxlとは？
openpyxlはExcelファイル(`.xlsx`)を読み書きできるツールです。
公式ドキュメント　[openpyxl/openpyxl-Bitbucket](https://bitbucket.org/openpyxl/openpyxl/src/master/)
詳しくは[こちら！](https://note.nkmk.me/python-openpyxl-usage/)
**今回はExcelファイル内のデータを読み込んで、分析するのではなく、
代入したいだけなので、pandasではなくopenpyxlを使用しています！**

# 指定の表をExcelで作成
今回は、openpyxlを使用して表を作っていきます。
表を作る上で、セルの操作が必要です。
openpyxlを用いて、以下を操作します。    
・セルの枠線
・セルの背景色
・文字の代入
セルの枠線はBorder関数、Side関数、
セルの背景色はPatternFill関数で操作できます。
```python:セルの枠線の操作に使用する関数    
border = Border(top=Side,    #上枠線
                bottom=Side, #下枠線
                left=Side,   #左枠線
                right=Side)  #右枠線

Side = Side(style="thin",    #枠線のスタイル ex)点線、直線 etc.
            color="000000")  #枠線の色
```
```python:セルの背景色を変更する関数    
color = PatternFill(patternType='solid', #塗りつぶすパターン ex)単色、ドット、縞模様 etc.
                    fgColor='ffffff')    #背景色
```
以上の関数を使用して、表を作成していきます。

## 実践
今回は以下の表をExcelに表示していきます。
|  No  |  name  | year |
| ---- | ---- | ---- |
|  1  |  nakano  | 26 |
|  2  |  ito  | 26 |
|  3  |  sato  | 23 |

```python:importリスト
import openpyxl
from openpyxl.styles.fills import PatternFill
from openpyxl.styles.borders import Border, Side
```
```python:表作成
xlsx_path = "Excelファイルのパス"
wb = openpyxl.load_workbook(xlsx_path)
ws = wb.worksheets[0]

tableList = [["No","name","year"],
            ["1","nakano","26"],
            ["2","ito","26"],
            ["3","sato","23"]]

gray = PatternFill(patternType='solid',fgColor='cccccc')
white = PatternFill(patternType='solid',fgColor='ffffff')
Side = Side(style="thin",color="000000")
border = Border(top=Side,bottom=Side,left=Side,right=Side)

for x in range(1,5):
    for y in range(1,4):
        ws.cell(row=x,column=y).value = tableList[x-1][y-1]
        ws.cell(row=x,column=y).border = border
        if x%2==1:
            ws.cell(row=x,column=y).fill = white
        else:
            ws.cell(row=x,column=y).fill = gray

wb.save(xlsx_path)
```
上記のコードを実行すると、指定の表を作成することができました。
![スクリーンショット 2022-10-23 190412.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433191/08e9df6a-7e25-a1e8-2b11-5171fa71dc17.png)

# 終わりに
セルの操作に関しては、すべて紹介できる技量がなかったので、表作成の部分に絞って紹介しました。PatternFill関数のpatternTypeや、Side関数のstyleはいじっていて面白いのでお試しください。
Reactで作品を作成してみたので評価してください！！

<h1>作品を作成してみました（評価してください！！）</h1>

<p>　はじめまして、未経験エンジニアの川北翔です。今回就職をするための作品として、ReactのuseStateを使った、<a href="https://task-manager-fb3b0.firebaseapp.com/">Trello風タスク管理ツールアプリ</a>を作成してみました。<br>
今まで独学で学習を進めてきたので知識に偏りがあったりしてまだまだ未熟なので他者の方に見ていただいて自分の不足している部分を学ぼうと考え今回投稿させていただきました。
<br>具体的ご教授いただきたい点として、</p>

<ul>
<li>Reactの設計の仕方</li>
<li>環境構築の部分（Webpackの設定方法など）</li>
<li>作品自体の評価</li>
</ul>

<p>などを中心に教えていただけたらと思います。また、今後エンジニアとして転職したいと考えていますので、厳しい意見やおすすめの勉強などもご教授いただけると幸いです！！</p>
<p>誠に勝手ながら、評価の方よろしくおねがいします！！</p>

<a href="https://github.com/shokawakita/Task-Manager-App">アプリのソースコード</a>

<p>　コードの設計や環境構築に関しては<a href="https://my-portfolio-da9ba.web.app/#artifact"　>ポートフォリオ</a>の方に詳細を記述させていただきましたのでそちらで確認していただければ思います。</p>
Reactの"メモ化"とは

# 軽く自己紹介
今回が初投稿になります．
普段はDeep Learningによる画像AIの開発に携わっているのですが，興味で最近web技術，特にフロントエンド領域に触れ始めました．
まだまだ未熟ではありますが，備忘録的に投稿できたらなと思います

# はじめに
タイトルにもあるとおり，Reactを勉強していると必ず耳にする"メモ化"についてまとめたいと思います．
React.memoやuseCallback()などの使用方法に関する記事は多く目にするのですが，私からすると"そもそも Reactのメモ化ってなんやねん"と思ったのでその備忘録です．

この記事は初学者の私がまとめたものですので，解釈の誤り等ありましたらぜひコメントいただけますと嬉しいです．

# (一般的な)メモ化とは
早速，本題ですがwikipediaでメモ化と検索すると以下のように定義されています
> メモ化（英: memoization）とは、プログラムの高速化のための最適化技法の一種であり、サブルーチン呼び出しの結果を後で再利用するために保持し、そのサブルーチン（関数）の呼び出し毎の再計算を防ぐ手法である。メモ化は構文解析などでも使われる（必ずしも高速化のためだけとは限らない）。キャッシュはより広範な用語であり、メモ化はキャッシュの限定的な形態を指す用語である。

[引用URL](https://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%A2%E5%8C%96#:~:text=%E3%83%A1%E3%83%A2%E5%8C%96%EF%BC%88%E8%8B%B1%3A%20memoization%EF%BC%89,%E3%81%A0%E3%81%91%E3%81%A8%E3%81%AF%E9%99%90%E3%82%89%E3%81%AA%E3%81%84%EF%BC%89%E3%80%82)

かなりわかりやすいですね
このことから（一般的な）メモ化の利点として
***もう一回使うものを保存(メモ)しておけば，次使う時にわざわざ最初から計算しなくて良い***
ことがわかります

# Reactのメモ化とは
先ほどの話からメモ化は効率を上げるために有効であることがわかりました．そのためReactでもメモ化はパフォーマンスを上げるために使用されています．

## Reactのパフォーマンスとレンダリング
ではReactは何をメモ化するのでしょうか？
ここで深く関わってくる言葉が***レンダリング***です．
またここで複雑なのですが一般的なレンダリングの意味とReactの指すレンダリングは少し意味が異なります．
意味の違いについては以下の記事がとても参考になりました．
[Reactのレンダリングを理解する](https://zenn.dev/1129_tametame/articles/bf4fc2005bea4d)
Reactのドキュメントではレンダリングは以下のように定義されています．
> “Rendering” is React calling your components.

これはまたややこしいですね...
この定義からReactにおけるレンダリングではコンポーネントが鍵になることは間違いなさそうです．

Reactのパフォーマンスはレンダリングとかなり強い結びつきがあるので，***無駄なコンポーネントの呼び出しを防止すれば，パフォーマンス向上につながります．***

## 改めてReactのメモ化について
やっとReactが何をメモ化するか見えてきました．
Reactのメモ化ではパフォーマンス向上のため
***コンポーネント（コンポーネントのレンダリング結果）をメモ化する***
ことが基本になっています．
もちろん細分化するとコールバック関数をメモ化するなどの話に発展していきます．

# おわりに
今回はそもそもReactのメモ化とは何かについてまとめてみました．
メモ化のやり方については他に素晴らしい記事がたくさんありますので，そちらを参考にしていただけると良いかと思います．

# 参考記事
https://qiita.com/soarflat/items/b9d3d17b8ab1f5dbfed2
Windows 10 22H2 64 bit を一層 DVD に分割する

## Windows 10 22H2 64 bit が一層 DVD 1 枚に収まらない

Windows 10 22H2 が利用可能になりました。
早速、下記のメディア作成ツールでISOイメージをダウンロードしました。

https://www.microsoft.com/ja-jp/software-download/windows10

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/edd295ec-ea8f-4bb4-7f05-7309f4fc5b4d.png)

私は、導入メディアは一層の DVD に焼いて、管理しています。
しかし、今回、メディア作成ツールでダウンロードした Windows 10 22H2 64 bit は
一層 DVD に収まらない容量になっていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/7b7f74c3-3206-6f0a-debb-a7ff3eb81090.png)


そこで、一層 DVD に収まるように 2 枚に分割することにしました。

##  Oscdimg の入手

今回、分割後の ISO イメージの再作成に Windows アセスメント & デプロイメント キット (Windows ADK) の Oscdimg を利用します。

作業環境は Windows 10 ですが、今回はこちらからWindows 11 バージョン 22H2 の ADK をダウンロードしました。

https://learn.microsoft.com/ja-jp/windows-hardware/get-started/adk-install

導入するのは Deployment Tools だけで構いません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/d7c20a88-2c80-fe44-e24e-7183403a6370.png)

## ダウンロードした ISO をマウント

メディア作成ツールでダウンロードした Windows 10 22H2 64 bit の ISO をマウントします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/ee7b835c-6823-e9e9-942a-2c4c8fec9623.png)

今回は D ドライブにマウントされました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/70d84bd9-97ae-3874-1f84-209b365646a5.png)

## 分割の実施

作業ディレクトリーにファイルをコピーします。

一枚目のDVD には全体のをディレクトリーを含めます。
ただし sources ディレクトリーは boot.wim だけをコピーします。

2枚目のDVD は boot.wim を除いた sources ディレクトリーをコピーします。

その後、ADK の Oscdimg で iso ファイルを作成します。

この作業をまとめたものが下記のバッチコマンドです。
オリジナル ISO のマウントドライブは環境によって変更してください。

```
rem ADK Oscdimgの場所
set PATH=%PATH%;"C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Deployment Tools\x86\Oscdimg"

rem　オリジナルISOのマウント先
set ORGDRV=d:

rem 作業用ディレクトリー(存在しない/空を想定)
set WRKDIR=c:\dvd

mkdir %WRKDIR%
mkdir %WRKDIR%\dvd1
mkdir %WRKDIR%\dvd2
mkdir %WRKDIR%\dvd1\sources
mkdir %WRKDIR%\dvd2\sources

echo sources > %WRKDIR%\excludelist.txt
xcopy %ORGDRV%\ %WRKDIR%\dvd1 /s /e /h /EXCLUDE:%WRKDIR%\excludelist.txt
copy  %ORGDRV%\sources\boot.wim %WRKDIR%\dvd1\sources

echo boot.wim > %WRKDIR%\excludelist.txt
xcopy %ORGDRV%\sources %WRKDIR%\dvd2\sources /s /e /h /EXCLUDE:%WRKDIR%\excludelist.txt
 
oscdimg -u2 -udfver102 -bootdata:2#p0,e,b%ORGDRV%\boot\etfsboot.com#pEF,e,b%ORGDRV%\efi\microsoft\boot\efisys.bin %WRKDIR%\dvd1 %WRKDIR%\dvd1.iso 
oscdimg -u2 -udfver102 %WRKDIR%\dvd2 %WRKDIR%\dvd2.iso 
```

作業用ディレクトリーに dvd1.iso・dvd2.iso が作成されます。
dvd1.iso・dvd2.iso は一層 DVD に焼ける容量になっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/2bd921d3-9918-f8d5-b2ab-fd58774ada34.png)


## 導入

dvd1.iso で起動します。
下記の画面で止まります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/67c8bc8d-c95e-2c37-ee89-7077b1a9d836.png)

dvd2.iso に入れ替えます。
導入が継続されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/79e04ba2-2389-523d-3d12-3dea30e8bce2.png)

後は通常通り導入可能です。
Google UXデザイン：競合分析について学ぶ

# はじめに

わたしが[Google UX Design Certificateで得られた素晴らしい体験][google]を、特に重要だと思われるポイントを小さく分割して、わかりやすく簡潔に紹介していきます。

興味があれば、ぜひ Google UX Design Certificateを受講してみてください。

[google]: https://qiita.com/mapami/items/7a0d0a3d4661c50f8bec

https://www.coursera.org/professional-certificates/google-ux-design

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/c3d622bb-c1ed-447b-c15e-c1bccff32a4a.png" width="800">

# 競合分析とは

競合分析は、アイディエーションのプロセスで行うことができる重要なステップの1つです。

***<font color="MediumVioletRed">『競合他社の強みと弱みの概要を把握すること』</font>***　

競合他社のブランドや製品、あるいは自社と同様の製品を提供している企業を分析することで、自社製品が参入する市場について、充実した知識の基礎を得ることができます。その知識はデザインに反映され、ユーザーにとって有益でユニークな製品を生み出すのに役立ちます。

UXデザイナーは、マーケティングやプロダクトマネジメントなど、他のチームと協力して競合分析を行うことが多いでしょう。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/520d85fb-dfe5-38a4-feb2-dc90abae0b36.jpeg" width="800">


# 競合分析の種類

### 直接競合

- 自社製品と同様の製品を提供し、同じ顧客に焦点を合わせている企業を対象にする。

### 間接競合

- 似たような製品を持ちながら異なるユーザーを対象にする。
- 同じユーザーで異なる製品を対象にする。

この2つの競合を分析することで、あなたのデザインが進むべき道と、あなたがデザインするユーザーについての洞察を得ることができます。

:::note info
例）30代にフォーカスしたダイエットアプリをデザイン

- 直接競合
    - 同じく30代をターゲットにしたダイエットアプリを作っている他の企業
- 間接競合
    - 30代の人々をターゲットにした健康やウェルネスのアプリを作る企業
    - 異なる年齢層の人々をターゲットにした減量アプリを作る企業
:::

# なぜ競合分析が重要？

### あなたのデザインプロセスに情報を提供するのに役立つ
「競合他社はどのように製品設計に取り組んでいたのでしょうか?」
→ 他社が何をしたかを知ることは、自社製品の設計をより良く決定するのに役立ちます。
  
### ユーザビリティの問題を解決するのに役立つ
「競合のウェブサイトは使いにくいですか？」
→ もしそうであれば、自社のWebサイトでは何を避けるべきかがわかります。

### 市場とのギャップを明らかにできる
「競合他社が満たしていないユーザーニーズがあるでしょうか？」
→ 自社の製品は、そのようなユーザーニーズに対応できるかもしれません。

### 信頼できるエビデンスを提供する
「なぜ、エビデンスを集めることが重要なのでしょうか？」
→ ビジネスニーズと市場のギャップを深く理解することで、デザインアイデアは最も成功するのです。

# 競合分析の留意点

### 創造性を阻害する

他社が何をしているかに注目することに時間を費やしすぎると、革新的な製品を生み出すことができなくなる可能性があります。イノベーションは、競合のコピーでは起こりません。重要なのは、競合が何をしているかを理解し、それを出発点として、突き進み、イノベーションを起こすことなのです。

### 分析結果の解釈次第

競合分析の成功は、調査結果をいかにうまく解釈するかにかかっていることです。データの分析は難しいものですが、これはデザイナーとしてのキャリアを通じて身につけるべきスキルです。

### すべてのデザインが全てのユースケースで機能するわけではない

競合他社ではうまくいっている機能でも、ユーザー層が異なれば、あなたの製品ではうまくいかないかもしれません。

### 定期的な競合分析

競合が何をしているかを常に把握し、新たな競合が出現しないか目を光らせておく必要があります。

# さいごに

競合分析に時間を費やすことで、チームは競合他社の失敗から学ぶことができ、自分たちもそのような失敗を避けることができるようになります。

競合他社が提供する製品の長所をすべて組み合わせて1つの素晴らしい製品を作り、競合他社とはまったく異なるものをユーザーに提供するためのツールとして、競合分析を実践してみてください。
[Angular] ビルド時に環境変数を参照する方法 - @angular-builders/custom-webpack を使って

# はじめに

Angular プログラムの中で環境変数を参照したいなと

```ts:environment.ts
export const environment {
  user: process.env['USER']
}
```

なんて書いても、うまくいきません。
その解決方法です。

# 必要なもの

* [@angular-builders/custom-webpack](https://www.npmjs.com/package/@angular-builders/custom-webpack)

# やること

やることの一覧です。

* 各パッケージをインストール
* `angular.json`ファイルを変更　
* webpackの設定ファイルを作る
* TypeScriptの宣言ファイルを作る
* プログラムの中で参照する

ひとつずつ見てみます。

## 各パッケージをインストール

いつものようにやります。

```console
npm i -D @angular-builders/custom-webpack
```
## `angular.json` ファイルを変更

builder を `@angular-devkit/build-angular` から `@angular-builders/custom-webpack` へ変更します。
オプションとして webpack の設定ファイルを指定します。
プロジェクトひとつあたり、4ヶ所書き換えるところがあります。

```diff
       "architect": {
         "build": {
-          "builder": "@angular-devkit/build-angular:browser",
+          "builder": "@angular-builders/custom-webpack:browser",
           "options": {
+            "customWebpackConfig": {
+              "path": "./custom-webpack.config.js",
+            },
             "outputPath": "dist/ms365-events-of-day",
             "index": "src/index.html",
             "main": "src/main.ts",
```

## webpackの設定ファイルを作る

プロジェクトのルートに `custom-webpack.config.js` という名前で作りました。

Defineプラグインを使って、環境変数を参照します。

```js
const webpack = require("webpack");

module.exports = {
  plugins: [
    new webpack.DefinePlugin({
      USER: JSON.stringify(process.env["USER"]),
    }),
  ],
};
```

## TypeScriptの宣言ファイルを作る

`src`の下のどこか適当なところに、拡張子 `.d.ts` でファイルを作ります。

ここでは `src/defined.d.ts` というファイルを作りました。

Defineプラグインに書いた名前と、同じ名前で宣言します。

```ts
declare const USER: string;
```

# プログラムの中で参照する

プログラムの中では、宣言した名前で使用できます。
Webpack Define プラグインが、これをよしなに置き換えてくれるというわけです。

例えば、このように参照します。

```ts
@Component()
export class AppComponent implements OnInit {
  title = USER;
}
```


# 環境

最後に環境です。

* Angular 14
PHPファイルをブラウザで確認する方法（VSCode）

## はじめに
PHPファイルをブラウザで確認する方法を先程解決出来ましたので、記録としてここに残します。

##### 補足情報
Mac(OS 12.5.1 Monterey)
PHP 8.0
Chrome
注）MAMPなどは使用していません。

## 経緯
HTMLのサイトをコーディング中にVSCodeの拡張機能のLive Serverで.phpの拡張子のファイル（index.php）をブラウザにて確認しようとしたところフォルダ一覧の画面になってしまい、確認出来なかったため調べ始めました。
注）index.htmlなら問題無くLive Serverで見れる。

## 見れなかった原因
調べたところ、Live Serverはサーバーサイドの言語を処理する機能を持っていないということが分かりました。（PHPはサーバーサイドの言語）

参考サイト：[Visual Studio CodeでPHPファイルをブラウズできません
](https://teratail.com/questions/268757)

## 解決に至るまで
まず上記参考サイトを見つけたのでそちらに書いてある下記のことを実行しました。


>ユーザーのsetting.jsonに
>```
>"liveServer.settings.useWebExt": true
>```
>を追記し、Chromeに機能拡張の「Live Server Web Extension」をインストールする。

しかし、自分の場合はMAMPが無いせいか、上記では解決しませんでした。

また同じく、参考サイトにある

>setting.jsonにも
>```
>"liveServer.settings.proxy": {
>"enable": true,
>"baseUri": "/",
>"proxyUri": "http://localhost:80/hoge"
>}
>```
>
>を追記する必要があるようです。

上記記述部分ですが、最後の"proxyUri"の部分が分からなかったため、こちらはやっておりません。

## 解決法
それでさらに調べ続けたところ、解決の糸口になるサイトを見つけました。


[Visual Studio Code で PHPコーディングの準備 (ローカルサーバー起動まで)！
](https://programmer-life.work/php/visual-studio-code-php#PHP_Serverinstall)

[【Visual Studio Code】PHP開発環境構築（PHP not found）原因
](https://teradblog.com/php_vscode_notfound/)

----------
まずは上の方のサイトの内容から、VSCodeの拡張機能のPHP Serverを入れます。
<a href="https://gyazo.com/1ebe91aa9f9183e9f043a21cb30378d6"><img src="https://i.gyazo.com/1ebe91aa9f9183e9f043a21cb30378d6.png" alt="Image from Gyazo" width="969"/></a>

本来ならここで起動すれば解決なのですが、「PHP not found」と表示されてしまいました。

>参考サイトより
>「PHP not found」と表示された場合はPHPが正しくインストールされていない可能性があります。

<a href="https://gyazo.com/f66034bce14b0aac90014aa06ac8f769"><img src="https://i.gyazo.com/f66034bce14b0aac90014aa06ac8f769.png" alt="Image from Gyazo" width="571"/></a>

ここで今度は下のサイトを見たところ、解決法が分かりました。

VSCodeのsetting.jsonの検索窓に「phpserver.php」と入れて、
Phpserver:PHP Pathに自分のPHPのあるパスを入れます。
（自分の場合は参考サイトとは違っています。）
（ちなみにPHPのあるパスはターミナル上で「which php」と打つと分かります。）

<a href="https://gyazo.com/72cc9d7fdf1d9bd9b2c8521eae3680b1"><img src="https://i.gyazo.com/72cc9d7fdf1d9bd9b2c8521eae3680b1.png" alt="Image from Gyazo" width="1044"/></a>

以上の工程で無事にブラウザ上でindex.phpが確認出来るようになりました。

ここまでお付き合い頂きましてありがとうございました！


## 参考サイト一覧


- [Visual Studio CodeでPHPファイルをブラウズできません
](https://teratail.com/questions/268757)

- [Visual Studio Code で PHPコーディングの準備 (ローカルサーバー起動まで)！
](https://programmer-life.work/php/visual-studio-code-php#PHP_Serverinstall)

- [【Visual Studio Code】PHP開発環境構築（PHP not found）原因
](https://teradblog.com/php_vscode_notfound/)

- [Live Server公式 GitHub](https://github.com/ritwickdey/live-server-web-extension/blob/master/docs/Setup.md)
Word互換モードで確実にテキストボックスの枠を選択する

豊富な罫線で精密に作り込まれたWord書類のレイアウトを崩さないよう、枠と塗りつぶしをなくした透明なテキストボックスを使用して追記を行うことがある[^textbox]。問題はこの手の書類が互換モードで作成されていた場合である。2022年10月現在Microsoft 365のWordにおいて、互換モードのテキストボックスは枠やハンドルの通常モードのものと仕様が異なり選択しにくくなっている。枠が選択できないとテキストボックスを自由自在に操ることができずレイアウトの調整に支障を来す。互換モードを解除すればテキストボックスの枠が簡単に選択できるようになるが、互換モードを解除した途端にレイアウトが崩れる場合があり本末転倒である。

下図のように罫線や表の上にテキストボックスを配置した場合を考える[^example]。
<img width="480px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43042/ee1a28ff-877a-497a-208e-f2faf39ad102.png">
ここで我々は中段のテキストボックス「すけさん」の枠を選択したいと仮定する。

互換モード初心者はマウスポインターを見えない枠に重ねれば十字線アイコンが現れるはずだと期待するかもしれないが、当たり判定はあたかもバグであるかのように小さい。

### 1. テキストボックス内の文字をクリックする。

<img width="480px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43042/43fb6d0b-643c-9883-06e4-18b93b1e5c41.png">

「すけさん」の一部をクリックするとテキスト入力モードへと移行し文字入力カーソルが点滅し始める。ハンドルや枠はまだ見えない[^bug]。

### 2. エスケープキーを押す。

<img width="480px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43042/c43ed708-f6dd-da8d-62f5-77073467daf8.png">

テキスト入力モードが解除され、テキストボックスの周りに灰色のハンドルが表示される。枠はまだ見えない。

### 3. ハンドルのコンテキストメニューから「テキストの編集」を選択する。


表示されているハンドルの1つを右クリックしてコンテキストメニューを表示する。

<img width="480px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43042/5396f82a-1f9b-f3fb-04c5-f1e2661c5db4.png">

コンテキストメニューの「テキストの編集」をクリックする。

<img width="480px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43042/2f955495-0ffe-8703-9a64-a1051756d714.png">

再びテキスト入力モードへと移行するが、今度はハンドルに加え細い枠が表示される。この枠は十分な大きさで当たり判定を持っており、自由自在に操ることができるはずである。

なお、編集中にレイアウトが崩れなかったからといって、印刷時にレイアウトが崩れないとは限らない。我々にできることは人事を尽くして天命を待つのみである。

[^example]: 実在する書類様式を例として出すのは憚られるので、今回はこのような例を採用した。この例の詳細については、たとえば[「通信用語の基礎知識」の該当ページ](https://www.wdic.org/w/MOE/%E3%82%82%E3%82%87%E3%82%82%E3%81%A8)を参照せよ。

[^textbox]: テキストボックスと文字列の間隔を上下左右ともに0にした方が扱いやすい。また、レイアウトのオプションで「アンカーを段落に固定する」をオン、「表のセル内で配置する」をオフなどにする必要もあるかもしれない。

[^bug]: まれに一瞬ハンドルや枠が見えたり、以前選択されていたハンドルや枠の一部が描画されていることがある。やはりバグのように思える。
matplotlibの色覚異常向け設定

matplotlibには色覚異常向けのスタイル `tableau-colorblind10` が存在する。名前の通り[Tableau由来のカラーパレット](https://github.com/matplotlib/matplotlib/pull/9255)である。

```python
import matplotlib.pyplot as plt
import numpy as np

x = np.arange(-5, 15, 0.01)
ys = [1 / (np.exp(-x + i) + 1) for i in range(10)]

plt.style.use('tableau-colorblind10')
for y in ys:
  plt.plot(x, y);
```
![tableau-colorbling10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100698/d6b2a724-30a5-5c18-c4b0-efc87a96744b.png)

比較のため、デフォルトのスタイルは以下である。こちらは[Tableauの古いカラーパレット](https://www.tableau.com/about/blog/2016/7/colors-upgrade-tableau-10-56782)と同じ配色である。

```python
plt.style.use('default')
for y in ys:
  plt.plot(x, y);
```
![default.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100698/2c14bc44-c71e-9a49-6991-ef268d1df7f2.png)

また色覚異常向けのカラーマップ `cividis` も存在する。ただ濃淡二色のグラデーションなので敢えてカラーにする理由がなく、グレースケールを選択した方がよいように思える。

```python
fig, ax = plt.subplots()
pcm = ax.pcolormesh(np.random.rand(32,32), cmap='cividis')
fig.colorbar(pcm)
```
![cividis.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100698/d6a95250-cdcc-9212-a2a9-4a49bf204eca.png)

これらのスタイルは[v2.2で導入](https://matplotlib.org/stable/users/prev_whats_new/whats_new_2.2.html)されており、この記事の投稿時点（2022年）で既に4年くらい存在しているが、あまり周知されていないようだ。
3色色覚の人間にも見づらくはない配色だと思うので、フルカラーでなければならない場合を除けば普段遣いで問題ない気がする。
なお、第一色と第二色はデフォルトと同じである。このあたりは元のカラーパレットの時点で配慮されているようだ。
マルウェアについて


## マルウェアとは
ウイルスやスパイウェアなど、悪意のあるソフトウェアを総称して、マルウェアと呼ぶ。

## ウイルス
パソコンの破壊活動を中心に行われる。
第三者のプログラムやデータべースに対して意図的に何らかの被害を及ぼすように作られたプログラムであり、 次の機能を一つ以上有するもの。

|  名称 |  機能  |
| ---- | ---- |
|  自己伝染機能| 自らの機能によって他のプログラムに自らをコピーし又はシステム機能を利用して自らを他のシステムにコピーすることにより、 他のシステムに伝染する機能|
| 潜伏機能  |  発病するための特定時刻、一定時間、処理回数等の条件を記憶させて、発病するまで症状を出さない機能   |
|  発病機能    |  プログラム、データ等のファイルの破壊を行ったり、設計者の意図しない動作をする等の機能|



## スパイウェア
ウイルスとの違いとして、基本的にウイルスは増殖するが、スパイウェアは増殖しない。
また、ウイルスがパソコンの破壊活動を中心に行うのに対して、スパイウェアは個人情報を盗んだり、経済活動が目的である。

## ランサムウェア
身代金要求型ウイルスともいわれる。
コンピューターのデータを暗号化し、解除と引き換えに代金を要求するソフトウェアでスパイウェアが発展したもの。

ウイルスやスパイウェアは、不特定多数のユーザーを対象とする傾向があるが、ランサムウェアは特に企業・組織などを意図的に対象としている傾向がある。
一般的に企業や組織はネットワークを構築しているため、感染が1台だけではなく複数であったり、重要な情報が暗号化されることもある。

メールに添付されたウイルス、機器やシステムの脆弱性からの侵入などが指摘されている。

## 主な感染経路
**１.ホームページの閲覧**
現在のWebブラウザは、ホームページ上でさまざまな処理を実現できるように、各種のプログラムを実行できるようになっているがこれらのプログラムの脆弱性を悪用するウイルスが埋め込まれたホームページを閲覧すると、それだけでコンピュータがウイルスに感染してしまう危険がある。最近では、Webブラウザへ機能を追加するプラグインソフトの脆弱性を利用した感染方法が増加している。

**2.信頼できないサイトで配布されたプログラムのインストール**
あたかも無料のウイルス対策ソフトのように見せかけて、悪意のあるプログラムをインストールさせようとする。その代表的な手口は、ホームページなどで「あなたのコンピュータはウイルスに感染しています」のようなメッセージを表示し、利用者を偽のウイルス対策ソフトを配布するWebサイトに誘導する方法がある。

**3.電子メールの添付ファイル**
 電子メールの添付ファイルもウイルスの感染経路として一般的。電子メールに添付されてきたファイルをよく確認せずに開くと、それが悪意のあるプログラムであった場合はウイルスに感染してしまう。

**4.USBメモリからの感染**
多くのコンピュータでは、USBメモリをコンピュータに差し込んだだけで自動的にプログラムが実行される仕組みが用意されているが、この仕組みを悪用して、コンピュータに感染するウイルスがある。このようなウイルスの中には、感染したコンピュータに後から差し込まれた別のUSBメモリに感染するなどの方法で、被害を拡大させるものもある。

**5.無線LANを使用する際**
無線LANにはどこからでもデータ接続できるというメリットがあるが、十分なセキュリティ対策の行われていない無線LANを使用するのは危険。
セキュリティが不十分なままでは第三者から不正にアクセスをされたり、通信中のデータが悪意のある者によって収集・解析され、大切な個人情報（IDやパスワード）が盗まれたりする可能性がある。無線LANを使用する際には、盗聴や不正アクセス、ウイルス感染のリスクを理解する。




## 代表的なマルウェア
| 　名称  |  機能  |
| ---- | ---- |
|  ワーム | マルウェアの中でも一番高い感染力を持つ。感染すると、パソコン内のファイル等を削除するなどの破壊活動や、別のパソコンへの侵入活動などが伴なう場合がある。  |
|  ボット  |  外部から操作し、迷惑メール送信や踏み台など不正な処理を行う。コンピューターに直接的な被害を与えるものではないので感染しても気づきにくいという特徴がある。 |
| マクロウイルス |  WordやExcelのマクロ機能を悪用。普段使っているオフィスのファイルと同じ拡張子、ファイル形式であることから、疑うことなくクリックしてしまい、結果として悪意のあるスクリプトを「自分自身で実行」しいてしまう。データやファイルの破壊、他のマルウェアを感染、パソコンの不正利用、監視や覗き見、さらなる感染の拡大が考えられる。 |
|　ガンブラー |　Webページを改ざんし不正なコードを埋め込み感染させる。悪質なWebサイトが訪問者をマルウェア感染させてしまうのではなく、正規のWebサイトがサイバー攻撃によって訪問者をマルウェア感染させる可能性がある|
|　トロイの木馬 | 通常のソフトウェアに見せかけてパソコンに侵入する。一見すると問題のないプログラムに見える上に、情報を盗む際なども目立たずに活動するので感染自体に気づきにくく、正しい知識が無ければ被害がどんどん拡大してしまう。知らずに放置した結果、取引先へのサイバー攻撃の踏み台にされてしまうこともあり得る。|
| バックドア | 不正アクセスの原因をつくる。PCやスマホなどの端末を遠隔操作する恐れがありサイバー攻撃への踏み台として悪用されたり、金融機関から不正送金、システムへ不正侵入され、システムそのものやデータを改ざん・破壊されるケースがある。|
| アドウェア |　パソコンに広告を表示させる。ユーザーを追跡してデータを収集し、その情報を第三者に販売したり、広告のターゲティングに無断に使用したりする。 |
| キーロガー | キーボードで入力されたIDやパスワードなどを記録し送信する。元々デバッグや通信ログをチェックするといった目的で使用されるだったがキーボードへの入力を全て記録できることから、インターネットバンキングのIDやパスワードを窃盗するなど、悪意を持った第三者に使われ事件となるケースが増えている|
Python、selenium、webdriverでログイン後の画面の要素をスクレイピング（仮）

# 前提
```
$ python --version
Python 3.9.0
$ pip list
Package          Version
---------------- ---------
pandas           1.5.1
selenium         4.5.0
```

# コード
```scraping.py
from selenium.webdriver.common.by import By
from selenium import webdriver
import pandas as pd
import csv

USER = 'メールアドレスとかIDとか'
PASS = 'パスワード'

browser = webdriver.Chrome()
# ログイン画面
browser.get('ログイン画面のURL')

# ID,PW,送信ボタン
elem_username = browser.find_element(By.CSS_SELECTOR, "#ID名やClass名など")
elem_password = browser.find_element(By.CSS_SELECTOR, "#ID名やClass名など")
browser_from = browser.find_element(By.CSS_SELECTOR, "#ID名やClass名など")
# 値を入力し、送信ボタンを押下
elem_username.send_keys(USER)
elem_password.send_keys(PASS)
browser_from.click()

# 取得したい文字列の要素
elm = browser.find_element(By.CSS_SELECTOR, "#ID名やClass名など")
# 要素のテキスト内容を取得
num = [elm.text]
header = ["タイトル"]
df = pd.DataFrame({
  '成果':num
}, index = header)
df.to_csv("test.csv",encoding="UTF-8")

# Webdriverを閉じる
browser.close()
```

# 実行
```
$ python scraping.py
```

# 実行後
`test.csv` というファイルが、実行した `scraping.py`　と同じディレクトリに生成される

## 内容
```test.csv
,成果
タイトル,取得したテキスト内容
```
# 今後
- pandasの使い方
- pythonでのHTML要素の取得方法
- 実行後にページ遷移して、さらに同様にCSVにデータを入れる

## 参考
https://www.miracleave.co.jp/contents/1202/post-1202/

https://qiita.com/suke_masa/items/f4db76408b4739de11e3

https://qiita.com/syoshika_/items/288fc8bf552672589f4c
タスク管理ツールをReact + ASP.Coreで作る 02ソリューションと空プロジェクト生成

[前回](https://qiita.com/mosuma/items/2c1d07788632b5e3c242)の続きです。

タスク管理ツールの機能を作る前に、開発用の環境が動く状態まで、ソリューション・プロジェクトの整備をしていこうと思います。


### [index](https://qiita.com/mosuma/items/88e40dc44e7bff1a54d8)


## 構築の基本的な流れ


.netフレームワークを使用する場合、あらかじめ用途に合わせたテンプレートを選択していくことになります。
その中にasp.net + reactのテンプレートもあるのですが、Reactと関連するフレームワークのバージョンが古かったり、typescriptが選択できなかったり、完全なSPAになっていなくて認証時は認証用のRazorページに飛んでログイン後に戻ってくるなど、若干癖があるつくりになっているので、今回はサーバーサイドはasp.net coreのwebapiのプロジェクト、クライアントサイドはCreate React Appで作り、連携させて動かすという構成で構築していきます。

## サーバーサイドのプロジェクト構築

ではサーバーサイド用ソリューションとプロジェクトを作っていきます。
補足ですがOSはWindows11、エディタはVS Codeを使用しています。

作業フォルダを作ってからVS Codeでフォルダを開き、ターミナルからコマンドを実行します


```
> cd [作りたい場所]
> dotnet new sln
```


ソリューション名は指定していないので、フォルダ名が自動で設定されます。
今回は「Tasket」(Task + Basketでtasket)という名前のフォルダにしたので、その名前で生成されています。

ソリューションが生成されたら次にサーバーサイド用のプロジェクトを作ります。
以下のコマンドで、webapi用のひな型が .NET5のバージョンで生成されます。
```
> dotnet new webapi -n server-app -f net5.0
```

生成したプロジェクトをソリューションに追加します。こうすることで、Visual Studio(VS Codeではなく2019や2022等)でソリューションを開いたときにプロジェクト込みで開いたり、ソリューションフォルダで「dotnet build」コマンドを実行することで「server-app」のビルドも併せて実行などが行われるようになりなります。
```
> dotnet sln add server-app/server-app.csproj
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2664470/7c90ab67-2463-b641-eed7-c60fd0d99f71.png)


動作確認もしておきましょう。
サーバーサイドのプロジェクトがおかれたフォルダに移動して、実行コマンドを入力するとビルドが行われて環境が実行されます。
```
> cd server-app
> dotnet run
```

生成したのはwebapiなので、web画面などは出ませんが、サンプルで含まれているapiにアクセスするとデータを出力することができます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2664470/b60bad14-3c81-e467-a619-d148ac862cc4.png)

サーバーサイドのプロジェクト構築はこれで一通りです


## クライアントサイドのプロジェクトの構築

次は、クライアントサイドのプロジェクトを生成します。



### ①[Create React App](https://ja.reactjs.org/docs/create-a-new-react-app.html#create-react-app)を使用してテンプレートを生成する

Create React AppはFacebookが提供するReactフロントエンドのひな型を生成してくれるツールです。煩雑な環境設定や関連するパッケージ類のインポートなどの手間を省略して、初心者でも簡単にひな型を作ることができます。

今回は、Create React Appを使用して、ソリューションフォルダの直下に、「client-app」という名称で、TypeScript有りでひな型を作ります。
ソリューションがおかれているフォルダに移動してから、以下のコマンドを入力します。

```
> npx create-react-app client-app --use-npm --template typescript
```

生成が成功すると、成功メッセージが表示され、以下のようにclient-appが生成されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2664470/a07ec77e-64d7-ece1-6ddd-272c80569a8b.png)


成功した段階で、以下のコマンドを実行すればトップ画面を表示させることが可能になります。
```
> cd client-app
> npm start
```

実行結果です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2664470/4a6fbab4-cb2b-3a8f-b343-2690955a2597.png)

今回は以上です
続きは[次回](https://qiita.com/mosuma/items/b6140751f5148efc9e42)です





## 初期段階

初期段階：カラ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2664470/2524eee8-a985-655b-fecd-7fe0e3817c19.png)
【Android】Roomについて

# はじめに
前回アノテーションについて調べた時に　Room関連のアノテーションが多かったのでRoomについて調べたので、
その内容を記事にしたいと思います。

# Room
Androidデベロッパーでは
>Room 永続ライブラリは SQLite 全体に抽象化レイヤを提供することで、データベースへのより安定したアクセスを可能にし、SQLite を最大限に活用できるようにします。

https://developer.android.com/jetpack/androidx/releases/room?hl=ja

とあります。

SQLiteとはデータベースの一つで、
データの保存に単一のファイルのみを使用することが特徴である サーバーではなくアプリケーションに組み込んで利用されるデータベースのことです。

今回はRoomについてですので、SQLiteの説明は簡単に終わりにしておきます

https://ja.wikipedia.org/wiki/SQLite


今回の本題「Room」とは　簡単にいうと
**Android Jetpackライブラリの一つ** で「アプリ内で入力されたデータを **登録**、**更新**、**削除**することができる」
という機能を持った　データベース(SQLite)の操作を簡単にできるライブラリです。

# 主要コンポーネント
**以下の３つのクラスを作ることでRoomを扱うことができます**

・Database class

・Data entities

・Data access objects

それぞれ以下で簡単に説明していきます


# Database　（Database class）
abstract classに＠Databaseアノテーションをつける
Androidデベロッパーでは
・Room Databaseを継承している必要がある
・データベースに紐づけられたEntityのリストを含むアノテーションをつける必要がある
・Daoアノテーションが付けられたインターフェースの抽象メソッドを定義する必要がある

とあります
最後に作った方が分かりやすそう？
```
@Database(entities = [userItemEntity::class], version = 1)
abstract class UserItemDataBase : RoomDatabase() {
    abstract fun UserItemDao(): UserItemDao
}
```


# Entity　（Data entities）
Databaseクラスに　＠Entityアノテーションをつける
・Roomではクラス名がデータベーステーブル名として使用される。テーブル名を別の名前にしたい場合は＠EntityのtableNameを設定する
・同じようにフィールド名もデータベースの列名として使用される。別で名前をつけたい場合は＠ColumnInfoアノテーションを追加しnameを設定する
・一つのEntityクラスに最低一つの　＠PrimaryKeyが必要　基本的には変数につけるアノテーション
・＠Ignoreがついた要素はDBに追加されない

```
@Entity(tableName = "item_data")
data class userItemEntity(
    @PrimaryKey(autoGenerate = false)val id: String

```
RoomでEntityインスタンスに自動でIDを割り当てる必要がある場合は @PrimaryKeyのautoGenerateをtrueにする必要があります。



# DAO（Data access objects）
interfaceに　＠DAOアノテーションをつける
＠DAOアノテーションをつけたインターフェース内で
・＠Insert Entityに基づくデータをDBに挿入する
・＠Delete Entityを引数にもつメソッドにつけるとDB内から削除する
・＠Query SELECT文を記述することで取得することができる？



# おわりに
今回の記事を書くことで前回何と無く調べた内容で書いた
アノテーション達の詳しい内容やルールがわかった気がします
これで、Roomを使うときやRoomを使ったロジックを読むときに臆さずにいることができます
自分で調べた中での解釈で書いているので間違いがある可能性もあり、まだまだ勉強が必要だと思いました


実際に一から使う機会があったら、また記事にできたらいいなと思います