OmniAICreator/Qiita-1.07M huggingface dataset:
Crashlytics 非致命的なイベント 備忘録

## SDKについて
Crashlyticsの利用方法やSDKの使い方の詳細は以下を参照する
https://firebase.google.com/docs/crashlytics/customize-crash-reports?hl=ja&platform=android

### 非致命的なイベント
Crashlytics SDKを導入しただけでは取得してくれないCrash以外のExceptionを拾うための機能。以下でFirebaseに送信することが可能。
```java
try {
    methodThatThrows();
} catch (Exception e) {
    FirebaseCrashlytics.getInstance().recordException(e);
    // handle your exception here
}
```
Firebase Console上でExceptionを確認することができる。
`recordException(e)`を`recordException(new Throwable("get Stack（任意文字列）"))`とすることで差し込む場所のStack Traceを取ることも可能。
![スクリーンショット 2022-10-04 10.11.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884537/a925a230-25d0-5565-f23d-05e17b80575b.png)

:::note warn
Clashlyticsサイト記載の注意
保管される例外は、最新の 8 件のみです。アプリが 8 件を超える例外をスローすると、古い例外は失われます。
:::
注意書きのように、例外の蓄積が8件までとなっているのでアプリ終了までに8件以上スローしてしまうと取るべき例外情報が破棄される可能性は留意しておく。

### カスタムログ
非致命的なイベントと併せて詳細なログを送信することができる。
```java
FirebaseCrashlytics.getInstance().log("message");
```
時系列で処理ルートや変数の移り変わりを例外と併せて出力することで、アプリがどのような状況になっているか確認することが可能
![スクリーンショット 2022-10-04 10.11.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884537/515b7965-6c55-a534-2862-6f9c09facaa9.png)

`recordException(e)`がアプリ起動中に何度も呼び出される場合、recordException呼び出しまでに取得したログをCrashlyticsに送信する。送信してもログはクリアされず、アプリ終了まで残っている様子。上記スクリーンショットの操作の流れでrecordExceptionを再度呼び出した場合は、前述の送信のあとに蓄積したログも追加して送信する。
起動中にrecordExceptionを3回呼び出された場合には、次のようなログになる。
![スクリーンショット 2022-10-04 10.13.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884537/afead859-8ba1-3106-7c2d-f03f2500edd1.png)
Screen_Viewはイベントなので無視してほしい。
ConsoleUIだとスクロールが必要でスクリーンショットが取れなかったため、「.logをダウンロード」より取得している。
DetailActivityに`recordException(e)`を仕込み、アプリ終了せずにActivityを3回開いたときに送信された場合はこのログとなる。

:::note warn
Clashlyticsサイト記載の注意
アプリの速度低下を避けるため、Crashlytics ではログのサイズを 64 KB に制限しています。セッションのログがこの制限を超えると、古いエントリからログが削除されます。
:::

### カスタムキー
例外と併せて任意のKey-Valueを送信することができる。
ログとは異なり、同一Keyを複数設定した場合にはValueが上書きされていくため、最終的にどのようなアプリ状態となっているのかを確認するために役立つ。
逆に上書きされてしまうため、状態遷移を記録することには向かない。

同一Keyでなければ、新たに記録されるためKey名を工夫することで欲しい状態を記録することは可能そうである。

Key-Valueは注意書きのように上限個数が決まっているため、利用時には個数を注意すること。
```java
FirebaseCrashlytics crashlytics = FirebaseCrashlytics.getInstance();
crashlytics.setCustomKey("my_string_key", "foo" /* string value */);
crashlytics.setCustomKey("my_bool_key", true /* boolean value */);
crashlytics.setCustomKey("my_double_key", 1.0 /* double value */);
crashlytics.setCustomKey("my_float_key", 1.0f /* float value */);
crashlytics.setCustomKey("my_int_key", 1 /* int value */);
```
![スクリーンショット 2022-10-04 10.11.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884537/b72fb334-b097-1d94-732b-fe669d96422a.png)

:::note warn
Clashlyticsサイト記載の注意
最大 64 個の Key-Value ペアがサポートされます。このしきい値に達すると、それ以上値が保存されなくなります。各 Key-Value ペアの最大サイズは 1 KB です。
:::

### 上限を超えた場合の動作
Crashlytics はアプリ終了で送信データを準備し、次回アプリ起動時にデータを送信します。
送信データの各蓄積上限での動作は以下のようになる。

#### カスタムログ　64KB
試しに10KBの1byte文字列を
`FirebaseCrashlytics.getInstance().log(10KB stirng);`で蓄積、
7回目にどうなるのかを確認した。

1回目のログから一部を破棄して64KBではなく、1回目のログが丸々破棄される60KBの動作となった。
カスタムログは例外スローが必要となるが、例外スローの上限数による破棄によって本ログの一部が破棄されるようなことはない。

#### 例外スロー 8件
9件目以降から最古の例外スローが破棄される。
LPC812の素に基板を作ってLチカを書き込む(やく1カ月から2カ月のロング記事)(2)


目的
基板を作る



クラウドワークスのk.komatsu様のご協力を得て、ガーバーが出来上がり
即日、フュージョンPCBにて製造中

ご協力、まことにありがとうございました。





![o_cop165.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/0b844212-f48c-6f0d-9875-5bf57b8f8bfa.jpeg)



![o_cop164.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/6147c6d0-0110-165e-97b5-820837cb5d98.jpeg)



![o_con874.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/0f4f2f1d-cbf5-71ca-8c5e-a224bc640b11.jpeg)



前の記事へ


https://qiita.com/caa45040/items/457a89460be52e822be6


部品一覧

ＬＰＣマイコン　ＬＰＣ８１２Ｍ１０１ＪＤ２０					[LPC812M101JD20]	通販コード　I-13497
ＳＳＯＰ２０ピン（０．６５ｍｍ）・ＳＯＰ２０ピン（１．２７ｍｍ）ＤＩＰ変換基板	[AE-SSOP20]		通販コード　P-10497
基板用リードフレーム　ＳＨＰ－００１　（５０本入）				[SHP-001]		通販コード　C-14182
丸ピンＩＣソケット　（２４Ｐ）　６００ｍｉｌ					[2227MC-24-06-01]	通販コード　P-10682			
チップ積層セラミックコンデンサー　０．２２μＦ５０Ｖ　Ｂ　３２１６　（１０個入	[GRM31MB11H224KA01L]	通販コード　P-09323
超精密級　金属皮膜チップ抵抗器　３２１６　１／４Ｗ１０ｋΩ　±０．１％　（５個	[RG3216P-1002-B-T5]	通販コード　R-11802
ピンソケット（メス）　１×１０（１０Ｐ）・白					[FH-1x10SG-W]		通販コード　C-10298



![o_con850.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/cdc81df9-5ddb-939e-8e7a-1e8739d76413.jpeg)


![o_con851.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/d7374f44-f97a-bc52-913f-8deade633591.jpeg)


![o_con852.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/3cb2383f-2fe5-dba1-609f-983a09626b67.jpeg)


![o_con853.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/b9231b3a-23c2-3340-8b52-bd2cdc5251b0.jpeg)


![o_con854.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/4d618d9a-1f89-47cb-c7b2-8a4a352f3857.jpeg)


![o_con855.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/62c8b57f-d0c8-a29f-9c49-b64f25bae927.jpeg)


![o_con856.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/1b82ddea-1477-4437-248b-2615434b997b.jpeg)


![o_con857.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/6e8fca16-671a-cc1d-220d-0ea66abcec5b.jpeg)


![o_con858.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/08d07bfc-e645-8e55-31dc-6c24ef11f5ec.jpeg)


![o_con859.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/108612a8-4a77-6e13-aedd-f57883245c69.jpeg)
Salesforce認定アドミニストレーター試験の公式練習問題を解説してみた-その043

こんにちは。本橋孝昭です。

Salesforce認定アドミニストレーター試験の公式練習問題があるのはご存じでしょうか。
Trailheadにフラッシュカードとして何度も解ける練習問題がございます。

今回はTrailhead
アドミニストレーター認定の準備: データと自動化
データ管理と分析管理の演習

にある練習問題11問目をご紹介します

今回の内容は動画にも紹介しています

https://www.youtube.com/watch?v=bsXKhgHTDZs

<iframe width="560" height="315" src="https://www.youtube.com/embed/bsXKhgHTDZs" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>




https://trailhead.salesforce.com/ja/content/learn/modules/administrator-certification-prep-security-and-data-management/review-data-management?trail_id=administrator-certification-prep

本日の問題はこちらです
![１１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/301adac4-f2ba-3438-dd17-c1b85940dbff.png)




入力規則があるとします

入力規則に該当するレコードが複数ある状態でインポートどうなるか　という話です
インポートして特定の入力規則がある場合、レコードがどこまで作成されるか　という話です

では入力規則がある状態で実際にインポートウィザードでインポートをします

この場合、入力規則の該当するレコードのみエラーになることが分かりますね

なので正解はＢでした

インポートの動きなどは動画をご参照ください

<iframe width="560" height="315" src="https://www.youtube.com/embed/bsXKhgHTDZs" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
「プログラミング」「システム開発」とは何か知った気になれる記事

# はじめに

私は大学からプログラミングを学んでおり、業務経験4年目のエンジニアです。

知人から「プログラミング」や「システム開発」について聞かれることがよくあるので
なるべくわかりやすく説明する記事を書いてみようと思い、本記事を書きました。


# そもそもプログラミングとは何か

### 難しく言うと

「プログラミング」 ＝ 「プログラムを作る作業」

プログラムとは、何かというと「`コンピュータ（PCやスマホ）にさせる処理を順番に書き出したもの`」


### 簡単に言うと

コンピュータにお願いすること
もう少し詳しく言うと、`お願いごとの手順（プログラム）を書くこと`

### 例えると

`料理のレシピ`のようなイメージ

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987057/8063b495-d718-e3d8-4581-44990dcde0b2.png" width="400">

これの次にこれをして、その次にこれ・・・・というように
手順をまとめて書いておくことで、
コンピュータ（PCやスマホ）がその指示を理解し その通りに動いてくれます。

<br>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987057/2887d653-7911-6226-ebf5-6ea217ee0517.png" width="400">

Twitterのように世界で何億ものユーザーがリアルタイムで
いいねしたりフォローしたりユーザー登録したりするのを
人間だけで処理することは不可能です。

人間には到底不可能な作業をコンピュータにお願いして
`やりたいことを実現（しかも高速で正確に）することができるのがプログラミング`です。

このお願いをうまくしていくことでTwitterのようなアプリがつくれたり、人間の生活を豊かにするサービスを生み出すことができます。

つまりプログラマーとは`「コンピュータにお願いするのがうまい人」`ですね。


## プログラミングの活躍事例

プログラミングを使った活用事例の一例を紹介します。

1. Webアプリケーション
2. ゲーム開発
3. AI分野

### Webアプリケーションの開発

SNS、YouTubeなどの動画共有サイト、ショッピングサイトなど、PC/スマホ･アプリ/ブラウザ問わずWebアプリケーションと言います。

Web系のプログラミング言語で作られており、私たちの生活にも非常に身近なものです。

### ゲーム開発

スマホのゲーム、家庭用ゲーム、パソコンゲームなど、あらゆるゲームはプログラミングによって作られています。

近年はスマートフォンが急速に普及したため、スマートフォン向けアプリゲーム開発は成長が著しい業界の1つです。
Android向けかiOS向けかによっても、使用されるプログラミング言語が異なってきます。

またVRゲームもこれから普及すると言われており、当然プログラミング言語を利用して作られています。

### AI分野

注目が集まるAI分野にもプログラミングは活用されています。

例えば今注目のAI分野の1つに自動車の自動運転がありますが、車の周囲の状況をリアルタイムでデータに変換して、加速したりブレーキをかけるといった一連の動作はすべてプログラミングで成り立っています。

プログラミング初心者が学ぶべき言語

プログラミングを初めて学ぶ初心者はWebサイトを自分で作ることをおすすめです。（上記の「Webアプリケーションに該当するもの」）


### プログラミング言語について

プログラミング言語は以下のような様々な言語があります。


```
HTML, CSS, JavaScript, Java, PHP ...etc
```

プログラミングをするにしても、数多くのプログラミング言語があり初心者は困惑すると思います。

`そもそもなぜこんなプログラミング言語が多いのか？
1つにまとめれば楽なのではないか？`

そのように思われる方がいると思います。

結論から言うと`「用途によってそれぞれのプログラミング言語を使い分けて無駄を省くため」`です。

あるプログラミング言語で
特定の領域ではうまく問題を解決できても、
別の領域ではそれほどうまく問題を解決できない。という事があります。


#### 例えば、
Webブラウザを使ったアプリケーションを開発する場合に適したプログラミング言語は「PHP,Ruby,Go」など

iPhoneのアプリを作る場合に適したプログラミング言語は「Swift,Objective-C」など
iPhoneのアプリを「PHP,Ruby,Go」では作ることが難しいです。

それぞれの`プログラミング言語に得意分野があるので、システム開発する側は言語を使い分ける`ことをします。

また使う`プログラミング言語によって、「書き方」が変わってきます`。
そのためそれぞれのプログラミング言語ごとに「書き方」を学習する必要があります。


### 参考記事

https://qiita.com/chousensha01/items/208ab4bc79c8755885b7
VSCodeでM5stack開発環境構築（中編）

# VSCodeでM5stack開発環境構築（中編）

この記事では`VSCode`で`M5Stack`開発環境構築を行った手順を示します．

前編は[こちら](https://qiita.com/HorimotoHiroto/items/7e47ccab7774ff1c48a2)
後編は[こちら](https://qiita.com/HorimotoHiroto/items/3ea83dd7197a8d48bfc0)

## 動作環境
Windows 11
M5Stack BASIC

# 3. Arduino IDEの設定
+ `Arduino IDE`を開いて「ファイル→環境設定」を選択してください．
そこから**追加のボードマネージャのURL**にリンク[https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/arduino/package_m5stack_index.json]を追加してください．
![image5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2706668/5fd99643-f2be-56c9-94ce-4804611bf5fe.png)

+ 次に，「ツール→ボード:→ボードマネージャ」を選択してください．
そこから検索欄に**M5Stack**と入力して`M5Stack`をお使いのバージョンに合わせてインストールしてください．
インストールされれば`INSTALLED`と表示されます．
![image6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2706668/06f79de6-7c6e-43f1-9071-eff2df9b5624.png)

+ 次に，「ツール→ボード:→M5Stack Arduino」から**M5Stack-Core-ESP32**を選択してください．
その後，前編の[シリアル通信のドライバインストール](https://qiita.com/HorimotoHiroto/items/7e47ccab7774ff1c48a2#2-%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%AB%E9%80%9A%E4%BF%A1%E3%81%AE%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)のところでタスクマネージャーで確認したポート番号を「ツール→ボード:→シリアルポート:」から選択します．
![image17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2706668/0254c51b-f4ca-97b2-0cd0-ff50c061eda0.png)
![image18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2706668/50cbaa83-0b76-e880-f60e-f1084f9c2049.png)


+ 次に，`M5Stack Library`をインストールするために 「スケッチ→ライブラリをインクルード→ライブラリ管理」を選択してください．
そこから検索欄に**M5Stack**と入力して`M5Stack`を**お使いのバージョンに合わせて**インストールしてください．
インストールされれば`INSTALLED`と表示されます．
![image7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2706668/d9dc4b5c-1dc5-d1ec-2610-4db3167a8c3a.png)

+ 先ほどインストールしたライブラリが保存されているかパス[C:\Users\username\Document\Arduino]を確認しましょう．
私の端末ではOneDriveの中に入っていました．各自の端末でどこに入っているか**必ず**確認してください．今後使用します．
![image8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2706668/30b06f58-c1b1-ea21-bf04-9dd7e58c74fe.png)
Django×Vue.jsで日本語ファイル名を返すまで

## 要件

- Django側で生成したCSVファイルを、ブラウザ側でそのまま保存する動きを作りたい
- CSVファイル名はパラメータに変化し、日本語も含まれる

## 結論

```python
    # ファイル名はURLエンコードする
    parsed_filename = urllib.parse.quote(filename)
    response = HttpResponse(file_data, content_type="text/csv")
    response["Content-Disposition"] = f"attachment; filename={parsed_filename}"

    return response
```

```javascript
    this.$axios.post('/download/csv', params, {responseType: 'blob'}).then((res) => {
      if (res) {
        const blob = new Blob(
          [res.data],
          {
            type: res.data.type
          }
        )

        const contentDisposition: string = res.headers['content-disposition'];
        const match = contentDisposition.match(/attachment; filename=(.*)/)

        //ブラウザにダウンロードせるときに、ファイル名をURLデコード
        saveAs(blob, decodeURI(match[1]));
      }
    })
```

## 経緯や学んだこと

Djangoだけで作られている場合を想定している情報が多いようで、こういったコーディングはよく見かけた。

```python
    response = HttpResponse(file_data, content_type="text/csv")
    response["Content-Disposition"] = f"attachment; filename={filename}"

    return response
```

これだと、Vue側で受け取るときにContent-Dispositionが文字化けしてファイル名が取得できなかった。

    ファイル名の文字化けに対策が必要なんだな・・・

とググっているとこういう情報に行き着く。

```python
    # ファイル名はURLエンコードする
    parsed_filename = urllib.parse.quote(filename)
    response = HttpResponse(file_data, content_type="text/csv")

    # 更にファイル名の文字コードをUTF-8に指定
    response["Content-Disposition"] = f"attachment; filename={parsed_filename}; filename*=UTF-8''{parsed_filename};"

    return response
```

### ここでハマった
ファイル名をURLエンコードする情報は確かにたくさん在って、他の人はこれで対処できたのかもしれない。
（おそらく、Vueでなく、直接ブラウザがファイルのダウンロードを受け取る仕組みであればこれでも動いたのだろう）

ただ、今回私のところではまだ文字化けしていた。
というか、URLエンコードされた文字列のままのファイル名でダウンロードされた。

ここで、たどり着いた情報のファイル名の指定の意味をよく考えた。

    これ、本来は
        filename={parsed_filename}; filename*=UTF-8''{parsed_filename};
    じゃなくて
        filename*=UTF-8''{filename};
    なのでは？

`*=UTF-8''`で指定した場合、後ろに続く文字列はUTF-8だと明示するということなのではと。（裏付けなし）

だとして、変換された文字列はURLエンコードの文字列なわけだから、UTF-8とかは関係ないなと。

### 解決

ファイル名がURLエンコードされていても、ブラウザだったらそのまま普通のファイル名に変換してくれるのだろう。
だが、Vueはそんなことしてくれないわけだ。
→ ファイル名URLデコードすれば良いんだな。
→ 結論のコード

## 感想

今回、
- よく分からないレスポンスの意味を、一旦鵜呑み
- 文字コード指定できる書き方あるんだ！

で変にDjango側で解決しようと右往左往してしまった。
コードの意味を解釈して、諦めるところはすっぱり諦める判断が重要だなと。

ちなみに`*=UTF-8''`の裏付けについてはなんか読みにくいRFCとか、リンク先が消えているとかで5分で諦めた。
An error occurred while installing libv8-node (16.10.0.0)

Railsプロジェクトはmini_racerを使っていますね。
bundle installを実行する時、以下のようなmini_racerインストールはエラーがよく発生しました。
```
/home/bunbu/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0/gems/libv8-node-16.10.0.0/src/node-v16.10.0/out/Release/icupkg: /lib64/libstdc++.so.6: version
`CXXABI_1.3.9' not found (required by
  make: *** [/home/bunbu/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0/gems/libv8-node-16.10.0.0/src/node-v16.10.0/out/Release/obj/gen/icudt69l.dat] Error
```
問題なのはGCCバージョンが古いですから。
エラーを解決する方法をまとめました。

※ 環境
ー　Centos 7
ー　Rails 6.1.4.7
ー　mini_racer 
ー　libv8-node 16.10.0.0

# 1. まず、GCCバージョンを更新する
Centos 7ではデフォルトGCC最新バージョンが4.8.5のようです。
YUMで4.8.5より新しいバージョンをインストールできないです。
ですので、ソースコードからインストールしましょう。
gcc 7.3.0をインストールしてみました。
```
wget http://ftp.mirrorservice.org/sites/sourceware.org/pub/gcc/releases/gcc-7.3.0/gcc-7.3.0.tar.gz
tar zxf gcc-7.3.0.tar.gz
cd gcc-7.3.0
sudo yum -y install bzip2
./contrib/download_prerequisites
./configure --disable-multilib --enable-languages=c,c++
make -j 4
sudo make install
```
# 2. v8-devel再インストール
libv8-nodeが使うライブラリです。
最新版をインストールしましょう。
```
sudo yum remove v8-devel
sudo yum install v8-devel
```

# 3. CXXABIをチョックする
gcc 7.3.0をインストールできたが、libstdc++が古い版を参照しているケースがありますね。
```
strings /usr/lib64/libstdc++.so.6 | grep CXXABI
```

バージョン1.3.9がない場合、以下のコマンドで修正します。
```
# libstdcを探す
ls /usr/local/lib64 | grep libstdc++

# 私のPCでは6.0.28が最新です。
cp /usr/local/lib64/libstdc++.so.6.0.28 /usr/lib64/
cd /usr/lib64/
rm -rf libstdc++.so.6
ln -s libstdc++.so.6.0.28 libstdc++.so.6
```

これでRailsプロジェクトフォルダーでbundle installを再実行して、問題なくインストールできるはずだと思います。
モデル駆動型アプリとDataverse


# モデル駆動型アプリの全体像
モデル駆動型アプリは一言で言うと**Dataverseのデータの操作・管理を目的としたアプリ**です。

モデル駆動型アプリはDataverseがないと使えません。
運命共同体です。

Dataverseで設定した構成要素をモデル駆動型アプリで表示するというイメージなんです。

::: note
モデル駆動型アプリの「モデル駆動」と呼ばれる所以ですね。英語だとModel Drivenです。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/21d9e4fb-355e-8c25-3266-74635538aec9.png)



# キャンバスアプリとの違い

Power Appsのもう一つのアプリ開発パターンであるキャンバスアプリはテーブルとは関係なく開発します。
それに対して、モデル駆動型アプリはDataverseで設定したモデルを前提として駆動するアプリです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/89939c25-d9f0-25e2-58bd-59474de64555.png)

自由度は高くないですが、Dataverseのデータベースで定義したデータ構造、データの関連の構造によって半自動的にアプリを作ってくれますので、**アプリで必要となる機能をすばやく作ることができます**。
データを管理することが目的のアプリを作る場合、モデル駆動型アプリがおすすめです。

この２つのアプリタイプを使い分けると、より速く、より簡単にソリューションを作ることができます。


# Dataverseで設定する構成要素

Dataverseで設定する構成要素は主に以下の5つがあります。
①ビュー
②フォーム
③グラフ
④ダッシュボード
⑤ビジネスプロセスフロー

### ①ビュー
**ビューとは：Dataverseのレコードの一覧画面のこと**
一般的なSQLのVIEWと意味的には同じで、モデル駆動型アプリではビューは一覧画面としても使われます。
以下のような特徴があります。
- データの抽出条件（クエリ）を設定可能
    - 表示する列
    - 列の表示順
    - 各列の幅
    - 並べ替え方法
    - フィルター
- ビューを複数用意することで、様々な切り口で素早くデータの閲覧が可能
例：「優先度高の案件一覧」、「自分の商談一覧」、「ステータスが対応中のインシデント一覧」
- 作成したビューはキャンバスアプリ上でも、フィルター条件として利用可能
ビューを使うことで複雑な検索条件もキャンバスアプリで利用可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/291031d5-3293-5981-8bae-4b46f99e8e3c.png)


### ②フォーム
**フォームとは：Dataverseのレコードの一行を表示する画面のこと**
ITでは一般的に入力フォーム（内容を書き込んだり選択肢から一つを選ぶ操作要素が並んだ画面）をフォームと呼びますが、似たようなイメージです。
レコードの新規作成・編集・閲覧に利用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/1e7d2f7b-f903-eb96-5972-9c21144aa065.png)


### ③グラフ
**グラフとは：グラフ**
データを可視化するのに便利なグラフの機能もあります。
Dataverse標準で利用可能なグラフとして以下があります。
棒グラフ（縦・横）
面グラフ
折れ線グラフ
円グラフ
じょうごグラフ
ドーナツグラフ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/db0a9594-9057-b993-e9fb-1330c2861bf2.png)
グラフの機能として、このようにDataverseでも標準で存在しますが、
Power BIという製品と組み合わせてよりいろんなグラフを表示させることもできます。

### ④ダッシュボード
**ダッシュボードとは：集計値や表、グラフなどで一覧できるようにした画面**
いわゆる一般的なダッシュボードと同じです。
この画面で包括的にデータの可視化を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/ac1ec11d-789e-dbc8-4671-6563d7fb2b4a.png)



### ⑤ビジネスプロセスフロー
**ビジネスプロセスフローとは：業務の流れを管理するのに便利な図**
フォーム画面の上に表示されるもので、
データ確認・管理の際に必要な業務の流れ（プロセス）全体と今どの段階まで進んでいるのかを一目で確認できる便利なものです。
段階をステージと呼び、そのステージで期待される入力やアクションを定義することが可能です。
その為、社員の経験によらず業務品質を平準化することができます。
また、便利な機能として、各ステージの滞在時間や、プロセス全体の完了時間を計測しています。その計測データを基に業務プロセスのそのものの分析・改善することができてしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/2d9d5b14-837c-dbc7-8220-ef10bbecd06a.png)

こういった構成要素をDataverseでテーブルごとに設定することで、「このデータはこの表示方法で！」と一度カスタマイズしてしまえばそれが使いまわせるという便利さがあるんですね。



# まとめ
- Dataverse のテーブルの構成要素とテーブル間のリレーションをベースにアプリが構成される ＝ モデル駆動
- 構成要素をアプリ毎ではなく、テーブル毎に設定、カスタマイズをする
→アプリで扱いたいテーブルを選択するだけで自動的にアプリが作成される
その為、Dataverseのデータを横断的に扱うアプリはキャンバスアプリ以上の高速開発が可能！！

- Dataverseでテーブルごとに設定できる構成要素
①ビュー
②フォーム
③グラフ
④ダッシュボード
⑤ビジネスプロセスフロー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/554512f5-2bff-0b35-a45c-74b14eff6897.png)
PostgreSQLのビュー、マテリアライズドビューについて

# ビューとは
- 複雑な処理を1つの処理にまとめる機能である
- SELECT文を置き換えたもの。（つまり、SELECT ≒ ビュー）
- 実体としてのデータを持たないため、仮想的なテーブルとも呼ばれる。
- 実体としてのデータを持たない＝ビューを実行するたびに、ビューに定義されたSELECT文を発行している。
- ビューの中にビューを定義することもできるが処理が遅くなる。
- メリット：
    - ビューを定義しておくことで毎回、複雑なSELECT文を書かなくて済む。
    - シンプルなSQL文を書くことができる。
    - 効率化、セキュリティ的にメリットがある。
- デメリット：
    - 処理速度が遅い（データの実体を持たないため）

# マテリアライズドビューとは
- ビューと同じように、複雑なSQL文のSELECT結果を頻繁に取得する場合に使用する機能。
- ビューは定義したSQL文で取得するデータを保持しない(データの実体がない)のに対し、マテリアライズドビューでは対象のデータをキャッシュし、実体として保持する。
- マテリアライズドビューではデータの実体を保持するため、元のテーブルが変更された場合は、マテリアライズドビューが保持していいる実体が古くなっているため、マテリアライズドビュー自体も更新しなければいけない。
- PostgreSQLではマテリアライズドビューの更新はREFRESH MATERIALIZED VIEWコマンドによって**手動で行う（自動では行われない）**。
- スナップショット。
- メリット：
    - マテリアライズドビューに定義したSELECT文の結果を常に持つ（データの実体を持つ）ため、ビューに比べて高速。
- デメリット：
    - データの実体を持つため、マテリアライズドビュー作成後から実体のデータが古くなってしまう可能性がある。
    - それに対応するように、最新のものに更新するコマンドがある。作成方法もビューと多少異なる。

# 両者の違い
- SELECT文の置き換えで、SELECT結果を返すという役割は同じ

|項目|ビュー|マテリアライズドビュー|
|-|-|-|
|処理速度|遅|早|
|データ保持|しない|する|
|参照時の処理|SQLを発行し、結果を返す|保持しているデータを返す|
|主な利用目的|セキュリティ確保など|パフォーマンス向上など|

# ビューの作成、変更、削除
## 作成
書式：`CREATE VIEW ビュー名 AS SELECT文;`
```:ビュー（VIEW_DBLIST）の作成
postgres=# CREATE VIEW VIEW_DBLIST AS
postgres-# SELECT　oid, datname
postgres-# FROM
postgres-# pg_database
postgres-# ;
```

## 変更
- ビューの変更方法は3通り
    - `Create OR Replace VIEW`コマンドを用いて変更する場合
    - ビューを削除して新たに作成する場合
    - `ALTER VIEW`

### `Create OR Replace VIEW`コマンドを用いて変更する場合
- `Create OR Replace VIEW`に指定したビューが無ければ新たに作成し、ビューがあれば変更する
```:ビュー（VIEW_DBLIST）の変更
postgres=#　CREATE OR REPLACE VIEW VIEW_DBLIST AS
postgres-# SELECT *
postgres-# FROM pg_database
postgres-# WHERE oid > 0
postgres-# ;
```

## 削除
```:ビュー（VIEW_DBLIST）の削除
postgres=# DROP VIEW VIEW_DBLIST;
```

# マテリアライズドビューの作成、変更、削除

## 作成
書式：`CREATE MATERIALIZED VIEW マテリアライズドビュー名 AS SELECT文;`
```:マテリアライズドビュー（VIEW_DBLIST）の作成
postgres=# CREATE MATERIALIZED VIEW mymatview AS 
postgres-# SELECT　oid, datname
postgres-# FROM
postgres-# pg_database
postgres-# ;
```

## 変更
- マテリアライズドビューの変更方法は2通り
    - `ALTER MATERIALIZED VIEW`
    - マテリアライズドビューを削除して新たに作成する場合

## マテリアライズドビューのカラムを変更（ALTER MATERIALIZED VIEW）
- マテリアライズドビューが所有するテーブルのカラム名を変更する
- 以下の例では、マテリアライズドビューが所有するテーブルのnameカラムをzoo_nameカラムに名前を変更する
```
postgres=# ALTER MATERIALIZED VIEW ビュー名 RENAME name TO zoo_name;
```

## 更新（最新のテーブルに更新）
書式：`REFRESH MATERIALIZED VIEW マテリアライズドビュー名;`
- `REFRESH MATERIALIZED VIEW`コマンドを用いて変更する場合（最新のテーブルに更新）
```:マテリアライズドビュー（VIEW_DBLIST）を最新に更新
postgres=# REFRESH MATERIALIZED VIEW VIEW VIEW_DBLIST;
```

## 削除
書式：`DROP MATERIALIZED VIEW マテリアライズドビュー名; `
```:マテリアライズドビュー（VIEW_DBLIST）の削除
postgres=# DROP MATERIALIZED VIEW VIEW_DBLIST;
```
Falco Ruleを紹介するシリーズ - Disallowed K8s User

:::note info
10/28（金）コンテナクラウドセキュリティで訊かれる「ランタイムセキュリティ」とは？と題してFalcoをSysdigが徹底解説するウェビナーを開催します。ご興味ある方はこちらから
https://go.sysdig.com/20221028JapanWebinar1.html
:::
本シリーズでは、ランタイム脅威検知のデファクトスタンダードである<a href=https://falco.org/ target=new>Falco</a>の検知Ruleを、１つの記事で１つ簡単に紹介していきます。
ランタイムセキュリティやFalco自体の概要を知りたい方は<a href=https://sysdig.jp/blog/intro-runtime-security-falco/ target=new>こちらのブログ記事</a>をご参照ください。
今回ご紹介する検知Ruleは<b>「Disallowed K8s User」</b>です。
# Rule記述
```
- rule: Disallowed K8s User
  desc: Detect any k8s operation by users outside of an allowed set of users.
  condition: kevt and non_system_user and not ka.user.name in (allowed_k8s_users) and not ka.user.name in (eks_allowed_k8s_users)
  output: K8s Operation performed by user not in allowed list of users (user=%ka.user.name target=%ka.target.name/%ka.target.resource verb=%ka.verb uri=%ka.uri resp=%ka.response.code)
  priority: WARNING
  source: k8s_audit
  tags: [k8s]
```
# Rule概要
<a href="https://github.com/falcosecurity/plugins/tree/master/plugins/k8saudit" target=new>Kubernetes Audit Events Plugin</a>をインストールすることで使用可能になるルールです。
Kubernetes（K8s）はコンテナオーケストレーションのデファクトスタンダードであり、クラウドネイティブ環境を実現する重要な基盤となっています。
そのため、K8s環境の操作は限られたユーザーに限定することが重要であり、このルールを使うことで許可されていないユーザーによるK8sオペレーションを検知することが可能です。
K8s環境のセキュリティ保護に関する基礎とベストプラクティスについては、<a href="https://sysdig.jp/blog/kubernetes-security-101/" target=new>こちらのブログ記事</a>もご参照ください。

# Condition（条件）
`kevt and non_system_user and`
システムユーザーによるものではないK8s Auditイベントで、

`not ka.user.name in (allowed_k8s_users) and`
K8sユーザー名が許可されたユーザー名に含まれておらず、

`not ka.user.name in (eks_allowed_k8s_users)`
許可されたEKSのユーザー名にも含まれていない場合

---
non_system_userマクロの内容は以下となります。
```
- macro: non_system_user
  condition: (not ka.user.name startswith "system:")
```
`(not ka.user.name startswith "system:")`
K8sユーザー名が"system:"から始まらない場合

# Output（出力）
許可されたユーザーリストに含まれていないユーザーによって実施されたK8sオペレーション

`%ka.user.name`
K8sユーザー名

`%ka.target.name`
K8sターゲットオブジェクト名

`%ka.target.resource`
K8sターゲットオブジェクトリソース名

`%ka.verb`
実行されたアクション

`%ka.uri`
クライアントからサーバーにリクエストされたURI

`%ka.response.code`
レスポンスコード
VSCodeでM5stack開発環境構築（前編）

# VSCodeでM5stack開発環境構築（前編）

この記事では`VSCode`で`M5Stack`開発環境構築を行った手順を示します．

中編は[こちら](https://qiita.com/HorimotoHiroto/items/08d9acfbcfffd3cf715c)
後編は[こちら](https://qiita.com/HorimotoHiroto/items/3ea83dd7197a8d48bfc0)

## 動作環境
Windows 11
M5Stack BASIC

## 1. Arduino IDEのインストール
+ `Arduino IDE`をインストールします．
この[ページ](https://www.arduino.cc/en/software)から**Arduino IDE 1.8.x**の1番上のオプション（`Installer`）をダウンロードしてください．
現在，最新バージョンをインストールすると`VSCode`で環境構築ができません．（**調査中**）
![image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2706668/2b258d4c-0948-b7f1-d330-edc02ce7fbe9.png)
+ ダウンロード前に，`Arduino IDE`開発への支援するか確認がありますが，支援する方は`CONTRIBUTE & DOWNLOAD`を選択し，ダウンロードだけの方は`JUST DOWNLOAD`を選択してください．
![image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2706668/bed27a2a-da77-68fe-3a4d-4f26206d89c9.png)
+ `Installer`がダウンロードされたら，起動して**何もいじらず**`I agree`や`Next`等を選択してインストールを完了させてください．

## 2. シリアル通信のドライバインストール
+ `M5Stack`のプログラム書き込みは，シリアル通信で行っています．そのため，`PC`側にドライバがインストールされている必要があります．
まず，`M5Stack`を`PC`に接続してタスクマネージャーを開いてください．おそらく下の画像のように`CH9102`という文字が確認できると思います．
![image3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2706668/09400661-f5c7-13b6-95e5-19d3cfee832b.png)
+ ドライバをこの[ページ](https://shop.m5stack.com/pages/download)から先ほど確認した`CH9102`専用のドライバーをインストールしましょう．`USB DRIVER & OPEN SOURCE LIBRARY`から`Windows`のドライバである`CH9102_VCP_SER_Windows`を選びダウンロードします.
ドライバは`SER`と`CDC`の2種類がありますが，特に理由がない場合は`SER`を選びます．
![image4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2706668/3e87b7a9-045b-bf1d-ac2e-0ebb35300dfd.png)
TL;DR 2022年版macOSにJavaをインストールする方法

```sh
brew install java

sudo ln -sfn /opt/homebrew/opt/openjdk/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk.jdk

echo 'export PATH="/opt/homebrew/opt/openjdk/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
```
【正規表現/RegExp】(?<=<p>).*?(?=<\/p>)【先読み/後読み/lookahead/lookbehind】




https://regexr.com/6vbem

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/5101653d-754c-ad98-fde1-1110affdcadf.png)
デバイスごとに異なる画像を表示する方法

# 目次
1. はじめに
1. 完成イメージ
1. 実装方法
1. 動作チェック
1. 最後に

# はじめに
同じ画面上でiOS/Android等の異なる端末ごとに
異なる画像を表示したい場合があると思います。

通常だとif文を書いて、
それぞれの端末ごとにどの画像を表示するかをコーディングする必要があります。

今回は、より簡単に画像を表示する方法をご紹介していきます！

# 完成イメージ

|iOS端末|Android端末|その他端末|
|--|--|--|
|![スクリーンショット 0004-10-04 9.47.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/e9cee5c2-b3b1-8a29-f30e-23b737d9bccb.png)|![スクリーンショット 0004-10-04 9.47.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/03cfaa04-7407-6792-47d8-56d767f7fc6d.png)|![スクリーンショット 0004-10-04 9.47.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/00883b42-cedb-24bc-e016-3dddb8feda5f.png)|

iOS端末では、ハートの猫
Android端末では、寝てる猫
それ以外の端末でクエスチョンマークの猫

がそれぞれ表示されるよう、実装していきます！

# 実装方法

実装方法は、とっても簡単です:point_up_tone1:

同じ画像名のものを、それぞれのResourceフォルダに入れるだけでOKです。

詳しく説明していきます。

## 画像を準備
まずは、左メニューのAssetsタブを開き、
Media->Mobileで右クリックをしResouceフォルダを開きます。
![スクリーンショット 0004-10-04 9.58.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/f964797c-1634-cd8e-5102-60e3fe37457d.png)

以下のようなフォルダが開きます。
![スクリーンショット 0004-10-04 9.58.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/655f7031-14f6-516f-12f9-b7c275c0714c.png)

異なる画像を用意し、それぞれ以下のディレクトリに同じ名前で格納してください。

|デバイス||対象のディレクトリ|
|--|--|--|
|iOSで表示する画像|→|`~resources/mobile/native/iphone`|
|Androidで表示する画像|→|`~resources/mobile/native/iphone`|
|共通で表示したいもの|→|`~resources/mobile/common`|

※SPAで表示したい場合も同様で、
`~resources/mobile/web`の配下にあるiphone,androidをそれぞれ指定します。

今回は、同じ「cat3」という画像名で
それぞれのディレクトリ内に格納しています。

|デバイス|画像|
|--|--|
|iOS（SPA）|![spaiphone.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/1b54db14-574d-8310-676c-9150a53c1b16.png)|
|Android（SPA）|![spaandroid.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/97eb6202-b4ec-e9ab-8055-f2f986565cc1.png)|
|共通|![common.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/1c9b8915-d92d-d974-a6cf-832b980611b5.png)|

画像を格納できたら、Visualizerに戻ります。

## Image Widgetを配置

画像を表示するため、ワークスペースにImage Widgetを配置します。
![スクリーンショット 0004-10-04 9.54.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/4555fe62-05b1-9e7a-ca8b-b35347194db5.png)

次に、デフォルトで表示したい画像を指定します。

Image Widgetを選択した状態で、PROPERTIES->Image->Sourceをクリックし、
先ほど格納した「cat3」を選択します。
![スクリーンショット 0004-10-04 10.36.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/e8287da6-c33c-55ec-17ed-df956c9d1f3a.png)

以上で完了です！

実際に動作を見てみましょう👀

# 動作チェック
![ezgif-4-fe50fc6d9b.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/65d12386-346f-f46c-564c-1e8cdb2812bf.gif)

端末を切り替えると別の画像が表示され、
切り替わっていることがわかりますね！

# まとめ
今回ご紹介した方法は、
コーディングの必要がなく簡単にデバイス毎に異なる画像を表示したい時に便利です！

是非活用してみてくださいね:relaxed:
論理回路

# ３入力多数決回路
```３つの入力のうち、２つ以上同じであれば、その値を出力```する。

# 順序回路
* 現在の入力値だけでなく、```過去に入力された値によって出力値を決定```する論理回路。
    出典 https://kotobank.jp/word/%E9%A0%86%E5%BA%8F%E5%9B%9E%E8%B7%AF-4491#:~:text=%E9%A0%86%E5%BA%8F%E5%9B%9E%E8%B7%AF%E3%80%90%E3%81%98%E3%82%85%E3%82%93%E3%81%98%E3%82%87%E3%81%8B,%E3%81%AF%E9%A0%86%E5%BA%8F%E5%9B%9E%E8%B7%AF%E3%81%A8%E3%81%84%E3%81%88%E3%82%8B%E3%80%82
* 「順序回路」は、「組み合わせ回路」ではできない、現在の入力に加えて、```過去の入力により出力を決定する論理回路```です。
    出典 https://www.renesas.com/jp/ja/support/engineer-school/digital-circuits-03-sequential-logic
## フリップフロップ回路
```現在の入力と、過去の入力（保持されている値）の両方によって出力が決定```する回路。
レジスタ、SRAMなどに使われる。

# 関連記事
https://qiita.com/masatom86650860/items/cbd88af6c02b59261b98

https://qiita.com/masatom86650860/items/5671c66c163a13ac5c57

# 出典
https://gihyo.jp/book/2022/978-4-297-12375-8
wordpress関数〜ディレクト編


## ホームディレクトリ
/(スラッシュ)は含まれない。
esc_url()は危険な文字をエスケープしてくれる。
```
<?php echo esc_url(home_url(‘sample’));?>
https://example.com/sample

<?php echo esc_url(home_url( ));?>
https://example.com

```

## テーマ　ディレクトリの絶対パス・URLを取得
```
絶対パス
<?php echo get_theme_root(); ?>
/home/user/public_html/wp-content/themes

URL
<?php echo get_theme_root_uri(); ?>
https://example.com/wp-content/themes
```

## 親テーマまたはテーマ　ディレクトリの絶対パス・URLを取得
```
絶対パス
<?php echo get_template_directory(); ?>
/home/user/public_html/wp-content/themes/my_theme

URL
<?php echo get_template_directory_uri(); ?>
https://example.com/wp-content/themes/my_theme
```

## 子テーマ　ディレクトリの絶対パス・URLを取得
```
絶対パス
<?php echo get_stylesheet_directory(); ?>
/home/user/public_html/wp-content/themes/my_theme

URI
<?php echo get_stylesheet_directory_uri(); ?>
https://example.com/wp-content/themes/my_theme
```
Azure Fundamentals(AZ-900)：クラウドの概念について説明する「可用性と拡張性」

Microsoft Learnを用いたMicrosoft Azure Fundamentals(AZ-900)の試験内容をまとめる投稿です。
この投稿ではMicrosoft Learnで学ぶ内容をできるだけ簡潔にまとめております。
Azureの勉強を一から始める方の参考になれば幸いです。

## 今回の学習内容
**◆「可用性と拡張性」**
◇対応するMicrosoft Learn ラーニングパス
[Microsoft Azure の基礎: クラウドの概念について説明する](https://learn.microsoft.com/ja-jp/training/paths/microsoft-azure-fundamentals-describe-cloud-concepts/)
◇対応するモジュール
[クラウドでの高可用性とスケーラビリティの利点について説明する](https://learn.microsoft.com/ja-jp/training/modules/describe-benefits-use-cloud-services/2-high-availability-scalability-cloud)

※前回の投稿は下記から確認できます。
[Azure Fundamentals(AZ-900)：クラウドの概念について説明する「従量課金ベースモデル」](https://qiita.com/fsd-jume/items/17f551a1f93c0dace855)

## 可用性(Availability)
**システムが継続して稼働できる能力**
一般的には「一定時間のうち、システムを稼働可能な時間の割合(％)」を意味する「稼働率」で表現される。

**◆高可用性(HA：High Availability)**
障害などによりサービス提供が不可能になる時間が短く、安定して利用できる時間が長い
= 可用性が高い状態

**◆SLA(Service Level Agreement)**
サービスを提供する事業者がサービス利用者に対して、保証するサービスレベル(内容や品質水準)を定義したもの
→可用性(稼働率)もSLAの一つの指標。
Azure SLAはサービスやアプリの可用性に関する%で表され、アップタイムとも呼ばれる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851723/14ff7cec-fab0-ce1e-b93b-ca2408a00928.png)

## 拡張性(Scalability)
**需要(負荷)に合わせてリソースを調整する機能**
サービスに対する支払いが需要に合わせて最適化される
・負荷が増加：必要なリソースを追加し、その分のコストが増加
・負荷が減少：不要なリソースを削除し、その分のコストが削減

**◆垂直スケーリング**
負荷に応じてマシン自体の性能を増減させ、システム全体の性能を変化させること

**◆水平スケーリング**
負荷に応じてマシンの数を増減させ、システム全体の性能を変化させること
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851723/0169a9ae-e084-e60a-08e5-a918a00752b5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851723/574e592c-b8b2-c467-d2fb-690fd58b68e2.png)

## 次の学習内容
**◆信頼性と予測可能性 セキュリティとガバナンス**

https://qiita.com/fsd-jume/items/592be27a2e3c3f9ee4c9

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/e4ec76959adb547ac5e8
PMをはじめてやって気づいたこと

現在進行形でPMを初めてやってます。
そこでの気づきをまとめていきます。
※随時更新

## WBSは何をどこまでいつまでにやるのかを正確に起こす

WBSは単純にタスクをまとめるものだけではなく、納品物とそれに対するタスクに対してどこまでやるのかいつまでにやるのかを正確に書き起こして、顧客と合意する必要がある

というのも顧客も人間だし、忘れる
何をどこまでやるかなんて正確に覚えていない
顧客と自社の作業領域を明確にするためにも何をどこまで、いつまでにやるのかということは正確に書き起こしておくことで、後々の事故を防止することができる

## 常に先手で動く

WBSの期日よりも1週間前にはある程度タスクが完了している状態がベスト
【JSF】アノテーションを使わず任意のデータ型の項目すべてに自動でバリデーションをかける

## ソース
このように、2つの変数を持ったバッキングビーンを用意しました。
個別にバリデーションをしたかったら	@NotNullだったり@Size(min = 2, max = 5)のように指定したらよいですが、アノテーションをつけずに例えばIntegerで宣言されている変数はデフォルトで任意のバリデーションを反映させることができる。つまり、すべてのソースが対象になる。

```java:hoge.java
@Named
@RequestScoped
public class HogeBb {

    private Integer num;
    private String hoge;
```


# プロパティファイルを作成し、バリデーションメッセージを書く
プロパティファイルには、以下のように書きます。
※以下の2行のどちらかで問題ありません。
- 1つ目の末尾が「INTEGER」は、概要メッセージで、xhtmlファイル側でfaceletsタグを使う場合messageタグを使う際にこのメッセージが表示される。

- 2つ目の末尾が「INTEGER.detail」は、詳細メッセージで、xhtmlファイル側でfaceletsタグを使う場合messages(messageにsがつく)タグを使う際にこのメッセージが表示される
```properties:messages.properties
javax.faces.converter.IntegerConverter.INTEGER=整数を記入してね
javax.faces.converter.IntegerConverter.INTEGER_detail=整数で入力してください
```


## faces-config.xmlにバリデーションを反映させるための設定
上記で作った「messages.properties」を使える状態にする。
※このファイルはvmという名前のパッケージの中にあります。もしsrc直下に置く場合は、「vm/」は不要です。
faces-config.xmlに、以下を追加
※「パッケージ名/プロパティファイル名(拡張子なし)」
```xml:faces-config.xml
     <application> 
 		<message-bundle>
 			vm/message
 		</message-bundle> 
 	</application> 
```

## 実行結果
バリデーションのアノテーションはつけていないですが、バッキングビーンでIntegerとして定義されている場合は自動でバリデーションを適用させることができました
![スクリーンショット 2022-10-04 093059.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179803/49475f27-3888-7a3b-bf8c-53da84a75d71.png)

## 感想
なかなかJSFを触る人は少ないかと思うが、今回JSFを触ってみて個人的にはやりやすい。ただ、このフレームワークで慣れるとSpring、Laravelが大変になりそう(小並感)
PostgreSQLのスキーマについて

# スキーマとは
- 1つの**DBの中**に複数設定することができる名前空間のこと
- 階層化できないディレクトリ構造のようなものという認識でok
- テーブルを含めた、全てのオブジェクトはいづれかのスキーマに必ず所属する（ディレクトリ構造と同じ）
- スキーマが異なれば、同じ名前のテーブルを作成してもいい（ディレクトリ構造と同じ）
- スキーマを省略してテーブルなどのオブジェクトを参照することができる（一般的に省略する）
- 省略した場合は、スキーマ検索パスに指定されているスキーマ内からオブジェクトを参照する
- スキーマ検索パスは変更可能（postgresql.conf）
- スキーマを作成、削除することもできる
- PostgreSQLでDBを作成すると6つのスキーマが作成される（以下では、主なスキーマを表示）

|スキーマ|説明|
|--|--|
|information_schema(情報スキーマ)|データベースのメタデータを取得するために利用されるビューの集まり。標準SQL（PostgreSQL独自のSQLでない）で定義されており、MySQLやOracleなどの他のDBでも存在している。|
|pg_catalog(システムカタログ)|PostgreSQLがシステム的に備えているオブジェクトを格納しているスキーマ。pg_catalogの中に存在するオブジェクトは基本的にpg_という名前で始まる。|
|public|テーブルやインデックスなどを新規作成する場合は、基本このスキーマの下に作成される。|

# スキーマ検索パス
- スキーマ名を省略して、オブジェクトを参照する場合に使用される（一般的）
- スキーマ検索パスはpostgresql.conf内の`search_path`で設定されている
- デフォルトでは、`"$user"`と`"public"`でユーザー名と同名のスキーマとpublicのスキーマが使用できるようになっている
- スキーマの優先順位として、**左のスキーマから順に検索される**
    - まず、$userスキーマが参照されそこでオブジェクトがなかった場合に、publicスキーマを参照する
- #でコメントアウトされていてもデフォルトの設定として有効になっているとのこと
```
postgres=# SHOW search_path;
#search_path = '"$user",public' # schema names

※ "$user"はデータベースユーザーのスキーマ
```
# スキーマ検索パスの変更
```
-- スキーマ検索パスの変更
postgres=# SET search_path TO schemaA,schemaB,schemaC,public;
```

## スキーマを省略しない場合(SELECT時)
書式①：`SELECT * FROM DB名.スキーマ名.テーブル名;`
書式②：`SELECT * FROM スキーマ名.テーブル名;`
- これだと冗長
- 通常、DBに接続してコマンド（SELECT）を実行するためDB名は省略可


## スキーマを省略する場合(SELECT時)
書式：`SELECT * FROM テーブル名;`
- この方法が一般的に使用される
- スキーマ検索パスを意識する必要がある
    - postgresql.confの`search_path`に指定されているスキーマを左から優先して参照する
    - 実際スキーマが省略された場合でも、以下のように参照が行われている
    - `SELECT * FROM $user.テーブル;` → `SELECT * FROM public.テーブル;`
    - 参照したスキーマにSELECTしたいオブジェクトがない場合はエラー

# 作成済みのスキーマを確認する
- 以下では、postgres（DB）内に存在するスキーマの一覧を表示する
- また、スキーマの所有者も確認することができる
```
postgres=# \dn
```

# スキーマを作成、削除
- 接続しているDB内にスキーマを作成、または削除する
- 以下では、postgres（DB）内にスキーマを作成する
- スキーマを作成するには、**スーパーユーザー**か、**スキーマを作成するデータベースでCREATE権限**を持っている必要があります。

```:スキーマの作成
-- "test_schema" というスキーマを作成
postgres=# CREATE SCHEMA test_schema;

-- スキーマ名は省略可能。ユーザー名がスキーマ名となる
postgres=# CREATE SCHEMA userB;
```
- 以下では、postgres（DB）内のtest_schema（スキーマ）を作成する
```:スキーマの削除
-- "CASCADE"は、スキーマ削除時にオブジェクトも合わせて削除するオプション
postgres=# DROP SCHEMA test_schema CASCADE;
```

# スキーマの変更
`ALTER SCHEMA スキーマ名 RENAME TO 新しいスキーマ名;`
`ALTER SCHEMA スキーマ名 OWNER TO 新しい所有者名;`
- 変更できること
    - スキーマ名
    - スキーマの所有者


```:スキーマの変更
-- "test_schema" というスキーマ名を変更
postgres=# ALTER SCHEMA test_schema RENAME TO new_schema;

-- "new_schema"の所有者を変更
postgres=# ALTER SCHEMA new_schema OWNER TO user1;
```

# スキーマの所有者
- スキーマを作成したロールがスキーマの所有者になる
- `AUTHORIZATION`オプションを指定することでコマンド実行時にスキーマの所有者を指定することができる
- スキーマの所有者を別のロールに変更することも可能
- **スキーマの所有者だけが、スキーマ内にオブジェクトを作ったり、スキーマ内のオブジェクトを参照できる**
- **他のロールがスキーマにアクセスできるようにするには、GRANT文で適切に権限を付与する必要がある**

```
-- "schemaB" というスキーマを作成し、スキーマの所有者は以下のコマンドを実行したロール
postgres=# CREATE SCHEMA schemaB;

-- "schemaA" というスキーマを作成し、スキーマの所有者は "userA"
postgres=# CREATE SCHEMA schemaA AUTHORIZATION userA;
```
情報処理安全確保支援士　平成23年秋期　午後Ⅰ

■問3（難易度：普通）
テーマ：HTTPS通信をしつつ、プロキシサーバも導入する方法
【問われていること】
・HTTPによる認証
 HTTPの概要：TCP、つまり、コネクションを確立して通信する。keep aliveを利用するのが一般的なので忘れがちだが、要求・応答を1回やるとコネクションは切断する通信。
 ・HTTPパケットの構造
図4.1.2 P250
　要求側はリクエストライン、HTTPヘッダ、HTTPボディ
　応答側はステータスライン、HTTPヘッダ、HTTPボディ
の構造になっている

リクエストラインに入るものは以下。Webサーバに（大きな分類で）何をしたいのかを記述する。
GET    ：指定したページを取得する。Get /....html HTTP/1.1
POST   ：指定したページに情報を送る。情報はHTTPボディに書いてあるので、URLには表示されない。
CONNECT：指定したサーバへのトンネリングを要求する。CONNECT www...co.jp:443 HTTP/1.1

↑でざっくりとしたことは書いた。
次は追加情報をHTTPヘッダに記述する。代表的な項目は以下。
要求側
Authorization   ：認証はBASIC認証 or ダイジェスト認証？
User-Agent      ：ブラウザの種類
Referer         ：遷移前にいたURL。XSS対策。必要
Cookie　　　　　　：セッションIDやタイムスタンプなどブラウザに保存されているデータ=Cookie。
X-Forwarded-For ：プロキシを経由していると経由したサーバの履歴が載ってる。

応答側
Set-Cookie      ：クライアントのブラウザにクッキーを設定する
Location        ：リダイレクト先のURL
WWW-Authenticate：認証が必要かどうかの情報

・プロキシサーバでクライアント↔サーバの通信をチェックするには？
本問題ではHTTPSの場合、プロキシサーバはHTTPパケットをどこまで見れるか？が焦点になっている。
クライアント↔サーバでトンネリングが成立していると、クライアントとサーバの間にいるプロキシサーバはリクエストライン（ステータスライン）より下にあるパケットは読み取ることができない。
トンネリングが成立=クライアントとサーバが持つセッション鍵で通信が暗号化されているため、セッション鍵を持たないプロキシサーバは中身の閲覧が不可能。

上記を解決する方法は「プロキシサーバをプライベート認証局にして、公開鍵証明書を発行する」。
具体的な手順は以下。
事前準備
0.クライアントにプロキシのルート証明書を入れる。これでクライアントはプロキシが発行した証明書を信用する。

クライアント→サーバに通信開始
1.クライアント→プロキシ→サーバとHTTP要求され、サーバはサーバのデジタル証明書を送り返す。
2.プロキシはサーバのディジタル証明書を横取りして、プロキシ自身のディジタル証明書をクライアントに送る。
　プロキシのディジタル証明書のCN=サーバのディジタル証明書のCNに設定しておく。
　これをやっておかないと3で拒否される。
3.クライアントはプロキシから送られてきた、プロキシの証明書を確認する。
　0より、クライアントはプロキシの証明書を信じる。
　プロキシの証明書のCNがサーバのCNと同じであるため、クライアントはプロキシの証明書をサーバの証明書と信じていることになった。

結果、クライアント↔プロキシとプロキシ↔サーバは別々のセッション鍵を持つ。
クライアントとサーバの通信は第3者からは暗号化され、その通信の内容はプロキシのみ確認できる状態になっている。

・証明書の正当性はなにで確認するのか？
本問題だと、クライアントがプロキシから送られてきた証明書を検証するが（2）、具体的に何を見ていたかが問われている。以下を確認していた。
　・有効期限内か？
　・失効リストに入っていないか？
　・CNが接続先のURLになっているか？
　・証明書の発行先（CA）は信頼できるのか？
　・証明書に付与したディジタル証明が正しいか？

この検証に失敗した=変なところから証明書が送られてきている
つまり、中間者攻撃されていると思ったほうが良い。
第1回 roboflow：ワークスペースとプロジェクトの作成（2/2）

:::note info
本記事は、システムズナカシマの[ブログ記事](https://www.systems.nakashima.co.jp/rf/roboflow/blog/)を基に作成しています。
:::

こんにちは、システムズナカシマの松浦です。

今回は、「**#1 roboflow：ワークスペースとプロジェクトの作成**」の後編になります。主にプロジェクトの作成について説明します。

前回の「[#1 roboflow：ワークスペースとプロジェクトの作成](https://qiita.com/ShingoMatsuura/items/7d7a7940061f8990f50b)」をご覧になっていない方は、まずこちらをご確認ください。

また、roboflowで何ができるか、概要を知りたい方は[「はじめてのroboflow」](https://qiita.com/ShingoMatsuura/items/c2df30e0b6109ab25c32)の記事をご参照ください。

<iframe width="560" height="315" src="https://www.youtube.com/embed/kbD96rTLKp4?si=lJiRTcwoeG4dkrfL" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

## プロジェクトとは？
物体検出のモデル・画像分類のモデルなどAIモデル単位に「**プロジェクト**」を作成します。

画面左メニューにある「**Projects**」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2882762/f3ea44f5-b27c-8521-61fd-4dda5617180f.png)

画面の中央に「**New Projects**」ボタンが表示されるので押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2882762/ee3bf53b-ecb2-ab01-445f-c769e672e1c0.png)

## 1. プロジェクトの作成
roboflowでは以下の画像系のAIモデルを構築することができます。主流の画像系AIモデルは、全て対応できてますね。:astonished:

| モデル | 区分 | 説明 | 例 |
|:-:|:-:|:-:|:-:|
| **Object Detection**  | 物体検出  | 画像内の対象物の種類と位置を認識する  | 画像内から犬を検出  |
| **Single-Label Classification**  | シングルラベル画像分類  | 対象の画像に一つのラベルを付け識別する  | 良品写真 or 不良品写真  |
| **Multi-Label Classification**  | マルチラベル画像分類  | 対象の画像に複数のラベルを付け識別する  | 画像に犬と猫が写っていることを識別  |
| **Instance Segmentation**  | インスタンスセグメンテーション  | 画像内に映っている対象物を種類毎に**個別**に認識し領域を抽出する  | 自動運転などで車・人を個体毎に識別  |
| **Keypoint Detection**  | キーポイント検出  | 画像内に映っている対象物の向きを識別する  | 骨格検知、顔の向きの検知  |
| **Multimodal**  | マルチモーダル  | 画像を表現する区分・内容を定義し画像からテキストを生成する  | 画像からテキストを生成し、画像の説明等を行う  |

今回は、画像の中からお寿司を検出する物体検出モデルを作る場合を例に説明します。

- **Project Name**：プロジェクトを識別するための「**名称**」を入力します。例）**Sushi-finder**（寿司検出）
- **Visibility**：プロジェクトのデータを[Roboflow universe](https://universe.roboflow.com)で共有するか、プライベートな環境で管理するかを選択します。基本的に「**Private**」を選択します。
- **Annotation Group**：アノテーションする対象が何かを設定します。今後、複数のプロジェクトをマージする場合に利用されます。例）**Sushi**

以下のように情報を入力し、「**Object Detection**」を選択し「**Create Private Project**」ボタンを押下し、プロジェクトを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2882762/3e93c26c-1803-dc57-fdfc-e103ff6b9da0.png)

以上で、データをアップロードする準備ができました。
基本的に新しくモデルを構築する際はこの作業を行うので是非覚えておいてください。:wink::point_up_tone1:





## 最後に

次回の記事でアノテーションを行うための、[第2回：データのアップロード](https://qiita.com/ShingoMatsuura/items/5443bd69f2ee51ae6b1f)について説明したいと思います。

システムズナカシマでは、roboflowに関する個別相談・無料デモを行っております。
是非お気軽にご相談ください。

https://www.systems.nakashima.co.jp/inquiry/roboflow/contact/
フォルダId単位で画像ファイルをグーグルドキュメントでocrし、結果をまとめるGAS

<h3>フォルダId単位で画像ファイルをグーグルドキュメントでocrし、結果をまとめるGAS</h3>
<a href="https://qiita.com/shizuoka_miyako_19911118/items/a58406849fa61dcdf4c4">前回のPGM</a>の続きです。
フォルダId単位で画像ファイルをグーグルドキュメントでocrし、文字内のルビ(サイズが
一定値以下の文字)を削除し、一つにまとめるGASを作成しました
<hr>
GASURL1:
https://docs.google.com/spreadsheets/d/1q4H_yL1qBJIX6toU8MRt4W31piT57WVCahipZ0s5izQ/edit?usp=sharing

<br>

GASURL2:
https://docs.google.com/document/d/1JvN28u2OFrkPtyFIppP5OPTUxaVBO-nRunymVlUet18/edit?usp=sharing

<hr>
使い方<br>
1. まずGASURL1の内容で入力ファイルのフォルダと出力ファイルのフォルダを入力し、
MyFunction()の関数を実行しました。
なお当該ファイルは以下のサイトのGASスクリプトを元に修正を加えたものです
<br>
<a href="https://juso.site/life/drive-script">Googleドライブのファイルを一括で文字起こしできるスプレッドシート作りました｜Jusolog</a>

2.次にGASURL2の内容でgas内のフォルダId、ファイルId部分を入力し、
そのファイルのMyFunction()の関数を実行します。


<hr>
参考サイト<br>
<a href="https://juso.site/life/drive-script">Googleドライブのファイルを一括で文字起こしできるスプレッドシート作りました｜Jusolog</a><br>
<a href="http://pineplanter.moo.jp/non-it-salaryman/2021/12/12/gas-filelist/">【GAS】Googleドライブのファイル一覧の取得とスプレッドシート用ファイルかどうかを判別する方法 | 非IT企業に勤める中年サラリーマンのIT日記</a><br>
<a href="https://it.cotomil.com/format-control/#toc2">【GAS】Gドキュメントの書式をスクリプトで制御する方法(上付き下付き文字、色、サイズなど) | コトミルIT</a><br>
<a href="https://e-work-education.com/2021/12/11/filesmove/">【GAS】Googleドライブ内のファイルを移動させよう - E-Work Education</a><br>
<a href="https://www.teijitaisya.com/gas-googledocument/">GASでGoogleドキュメント操作する方法【Google Apps Script】</a><br>
LPC812の素に基板を作ってLチカを書き込む(やく1カ月から2カ月のロング記事)(1)(Fusion PCB)


x Fusion PCB


目的
基板を作る

定義の例

```c++

//        TX      RX
Serial pc(USBTX, USBRX); //812

//        TX  RX
Serial pc(D1, D0); //812

//       SDA    SCL
I2C i2c(A4, A5); //812


```




クラウドワークスのk.komatsu様のご協力を得て、ガーバーが出来上がり
即日、フュージョンPCBにて製造中

ご協力、まことにありがとうございました。


![o_cop165.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/4a0bac38-3106-6641-ef15-aa886570b2a0.jpeg)



![o_cop164.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/1688263c-adb3-784d-da6a-cad07be12725.jpeg)



![o_con874.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/422dc91a-8f33-3bb0-a0a9-71fe9e767ffc.jpeg)


![o_cop106.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/32e12a7f-4d72-a38a-ca12-954c414726be.jpeg)


![o_cop163.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/8fa6092e-702f-4091-fe3a-0f17ed482715.jpeg)



次の記事


https://qiita.com/caa45040/items/54816b3170e325dced6e




![o_con833.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/c0649a1d-6413-20cc-aee9-cc0d2b9c5d59.jpeg)


![o_con840.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/5502fbb9-b7b5-21e8-a715-54fcccb80366.jpeg)


![o_con841.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/f3ee4786-ac85-5e66-3382-d06d586ee1d3.jpeg)


![o_con842.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/b5ed9581-23e1-8cd7-bb08-d1e7598afd1f.jpeg)



![o_con843.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/edbad173-f96a-5046-6a9f-73fc27c06ddd.jpeg)


![o_con844.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/cb6538ec-c15b-d5d1-d030-7e4fd5792b22.jpeg)


![o_con845.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/d037a20a-b5e4-776b-1434-10a9f5bec80d.jpeg)


![o_con846.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/d7abbede-435b-2f97-68ed-73fb57e3ea34.jpeg)
Python,Ruby,PHP,Java,JavaScript,Perlのオブジェクト指向プログラミングの比較 | プログラミング言語比較

Python JavaScript PHP Java Ruby


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

プログラミング言語Python,Ruby,PHP,Java,JavaScript,Perlのオブジェクト指向プログラミングの比較

# Python

https://qiita.com/kaitolucifer/items/926ed9bc08426ad8e835

# Ruby

https://qiita.com/shogo-1988/items/e749208c0733bbe025c0

# PHP

https://qiita.com/mpyw/items/41230bec5c02142ae691

# Java

https://qiita.com/nao0725/items/aba8126c50bf85543c78

# JavaScript

https://qiita.com/shotets/items/e4b2ca36f5cbdc393117

# Perl

https://perlzemi.com/blog/20161030147778.html
ROS講座134 Gazeboで周囲に物を置く

# 環境
この記事は以下の環境で動いています。

| 項目 | 値 |
|:-:|:-:|
| CPU | Core i5-8250U |
| Ubuntu | 20.04 |
| ROS | Noetic |
| Gazebo | 11.9.0 |

インストールについては[ROS講座02 インストール](https://qiita.com/srs/items/e0e0a9dc3f94c2d3348e)を参照してください。
またこの記事のプログラムはgithubにアップロードされています。[ROS講座11 gitリポジトリ](https://qiita.com/srs/items/25a56a6abda41dcf396e)を参照してください。

# 概要
ここまでGazeboシミュレーションで「自機」の設定をしてきましたが、それと同じように周りの物を置くこともシミュレーションの上では重要です。ここでは周囲の環境の設定をしてみましょう。

# Gazeboモデルデータベースの利用
Gazeboにはモデルデータベースがあり、ここに便利なGazeboモデルがたくさん収録されています。

## GUIから利用
これらを見るためにはGazeboの「Intsert」タブを開き、「Connection to model database」を押します。ここでサーバーに通信するので数分待ちます。
![other_model1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254442/f9fadd84-92fd-ad35-20b6-a592bff87d72.png)

しばらくすると以下のように表示が変わるのでメニューを開きます。様々なモデルが出てきますが、ここでは「cafe」を選んで、3Dビューの上でクリックしましょう
![other_model2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254442/9465376f-5b61-60ce-39fb-34112d12373b.png)

すると以下のように「cafe」のモデルが登場します。
![other_model3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254442/95a7cb24-849e-5681-aae1-b0685b675290.png)

一度このように使ったファイルは`~/.gazebo/model`以下に保存されます。

## worldファイルで記述

自作のモデルと同じように以下のようにincludeを書けば使用できます。また事前に上記の方法でモデルをダウンロードしていなくても、Gazebo起動時に自動的にダウンロードできます（その代わり起動までしばらく待つことになります）。

```xml:gazebo2_lecture/worlds/objects_from_db.worldの一部
<include>
  <uri>model://cafe</uri>
</include>
```

# 一定の範囲に分布させる

障害物を一定の領域に分布させたい場合は`<population>`機能を使うと実現できます。

```xml:gazebo2_lecture/worlds/objects_from_db.worldの一部
<population name="can_population1">
  <model name="can1">
    <include>
      <uri>model://coke_can</uri>
    </include>
  </model>
  <pose>1.5 0 0.2 0 0 0</pose>
  <box>
    <size>1 2 0.01</size>
  </box>
  <model_count>5</model_count>
  <distribution>
    <type>random</type>
  </distribution>
</population>
```

* `<population>`タグの直下の`<model>`タグで出現させるモデルを指定します。
* 出現範囲は矩形か円形で選べます。矩形なら`<box>`タグで範囲を指定します。
* `<model_count>`は出現させるモデルの数です。
* `<distribution/type>`では分布のタイプを指定できます。randomでは無作為に配置します。起動ごとに配置が変わります。

# シミュレーションのステップの調整

デフォルトでは秒間1000ステップで物理演算を行います。高速で動くものでない限りはここを調整することでCPU負荷を抑えることが出来ます。
例えば秒間200ステップに抑えるには`<world>`タグ以下に記述を追加します。

```xml:gazebo2_lecture/worlds/objects_from_db.worldの一部
<physics type='ode'>
  <max_step_size>0.05</max_step_size>
  <real_time_factor>1</real_time_factor>
  <real_time_update_rate>200</real_time_update_rate>
</physics>
```

# 実行

```shell:実行
roslaunch gazebo_ros empty_world.launch world_name:=objects_from_db.world verbose:=true
```

cafeモデルの出現とcoke_canを無作為に5個出現します。

![other_model4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254442/2fa7b0a3-1959-cfa3-a7a4-65b367584242.png)

# 参考
[gazebo_models](https://github.com/osrf/gazebo_models)
[populationの使い方](https://classic.gazebosim.org/tutorials?tut=model_population&cat=build_world)

# 目次ページへのリンク
[ROS講座の目次へのリンク](https://qiita.com/srs/items/5f44440afea0eb616b4a)