OmniAICreator/Qiita-1.07M huggingface dataset:
2022/8/13主にITとかセキュリティの記事

Zoomに深刻な脆弱性、悪意ある会議URL開くと攻撃受けるおそれも
https://www.security-next.com/138859

Palo Alto Networks製品に脆弱性 - 反射型DoS攻撃の踏み台となるおそれ
https://www.security-next.com/138855

“電力ひっ迫“ 経済産業省かたり個人情報求める偽メール(8/11)
https://www3.nhk.or.jp/news/html/20220811/k10013764651000.html

PCがハッキングされた時に現れる10の兆候、修復するための5つの操作(8/11)
https://news.mynavi.jp/techplus/article/20220811-2422291/

【デンマーク】セブン-イレブン、レジと決済システムがダウン。全店舗営業停止。サイバー攻撃の疑い(8/11)
https://sustainablejapan.jp/2022/08/11/seven-eleven-denmark-cybersecurity/76193

韓国車にUSBケーブルだけで始動できる問題　米国で盗難が多発(8/11)
https://www.zaikei.co.jp/article/20220811/684823.html

Gmailを捨ててProtonMailを選ぶ5つの理由(8/10)
https://news.livedoor.com/article/detail/22656085/

クロスチェーンブリッジ、ハッキング収益のロンダリングに悪用される＝Elliptic分析(8/11)
https://jp.cointelegraph.com/news/cross-chain-bridge-renbridge-laundered-540m-in-hacking-proceeds-elliptic

匿名通信システム「Tor（トーア）」とは？  主な使用目的や利用時の注意点(8/10)
https://allabout.co.jp/gm/gc/493454/

ITは自社でコントロールし、クラウドを前提とした柔軟なシステム像を描け(8/10)
https://dxmagazine.jp/strategy/reform/72sNg

決済システムの次世代フォーマット移行について
https://arayz.com/column/mekong5-202208/

米スターバックス、Web3.0型ロイヤルティ・プログラムを発表へ(8/11)
https://zuuonline.com/archives/240506

イリノイ大学研究者がBitcoin Lightning Networkの重大な脆弱性を発見(8/11)
https://nextmoney.jp/?p=52255

OpenSeaが盗難されたNFTへのポリシー変更を発表(8/11)
https://crypto-times.jp/opensea-policy/

消費者庁、偽アウトドアECに注意喚起 「モンベル」「ロゴス」の偽サイトが発覚(8/11)
https://news.goo.ne.jp/article/netkeizai/business/netkeizai-6877.html

暗号決済 をローンチするために必要なこと 。そしてブランドがまだそれを「必須」と考える理由(8/11)
https://digiday.jp/glossy/what-it-takes-to-launch-crypto-payments-and-why-brands-still-consider-it-a-must/

暗号資産取引所「Hotbit」取引・入出金などを一時停止｜停止理由は？(8/11)
https://bittimes.net/news/130089.html

スイス、ブロックチェーン人材の育成に注力(8/11)
https://www.swissinfo.ch/jpn/%E3%82%B9%E3%82%A4%E3%82%B9-%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3%E4%BA%BA%E6%9D%90%E3%81%AE%E8%82%B2%E6%88%90%E3%81%AB%E6%B3%A8%E5%8A%9B/47816686?utm_campaign=teaser-in-querylist&utm_source=swissinfoch&utm_medium=display&utm_content=o

Webサイトから情報を抽出する技術「スクレイピング」とは？(8/11)
https://gunosy.com/articles/eJaXy

米SEC、約400億円の被害を生んだポンジスキームプロジェクト「Forsage」を提訴(8/10)
https://zuuonline.com/archives/240477

VMware vRealize Operationsに重要な脆弱性、アップデートを(8/11)
https://news.mynavi.jp/techplus/article/20220811-2422168/

ソラナ関連のウォレット不正流出、Phantomのシステムに異常見つからず(8/11)
https://coinpost.jp/?p=376010

「Microsoft Edge」、ウェブ閲覧時のセキュリティ機能を強化--3つのレベルから選択可(8/10)
https://japan.cnet.com/article/35191713/

速報：Tornado Cashは米国の制裁に対抗で新サイトを構築(8/10)
https://nextmoney.jp/?p=52239

DeFiが一般の人々にも広まるには「キラーアプリ」が必要になる＝リップル幹部(8/11)
https://jp.cointelegraph.com/news/defi-needs-a-killer-app-to-go-next-level-says-ripple-exec

IT開発で失敗は不可避　澤円氏
圓窓代表取締役(8/11)
https://www.nikkei.com/article/DGXZQOCD232ZD0T20C22A7000000/

「多要素認証」を破るフィッシング　1万超のMS365利用企業を襲う(8/12)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/052100113/080200088/

AWSのDWHがサーバーレスに　10年で様変わりした内部構造(8/12)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/052100111/080400080/

KDDI通信障害、補償の不条理　格安スマホ事業者が持ち出しも(8/12)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/052100110/080400086/

Web3は本当に日本に必要か　投機性が問題視されるNFT(8/12)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/052100112/080200046/
Macでログインと同時にシェルスクリプト（commandファイル）実行（Windowsでいうところのスタートアップ）

# 概要

ログインと同時にネットワークドライブマウントとか処理自動化したい。
Shellスクリプトを記述したcommandファイルの作り方までは分かる。

でも **作ったcommandファイルをどこに登録すればよいか分からない** …

そんな時。

Windowsでいうところのスタートアップ。

# やり方

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/0db5fb17-0d5c-0f47-6041-6c95bfc79d85.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/bd9782b2-672a-951c-8bc9-50a84a414ded.png)

# 登録できるファイルの拡張子

拡張子がshのファイルは登録できない。
拡張子はcommandである必要がある。

# バージョン

macOS Monterey 12.4
VSCodeで利用できるクイックフィックスはありませんが出た時の対処方法（PHP）

# 動機
文法的に間違ってない＋エラーも出なく、出力されるのに、クイックフィックスはありませんと出てきたので気になって調べてみました。
# 要点
1.PHP Suggest : Basicのチェックを外す
2.PHP Intelephenseを導入する。

# PHP Suggest : Basicのチェックの外し方
1.「ファイル＞ユーザー設定＞設定」と進む。
2.Suggest:Basicと検索し、チェックを外す。

# PHP Intelephenseの導入の方法
1.拡張機能ボタンを押す。
2.PHP Intelephenseと検索する
3.インストールボタンを押す。

#結果
この方法を試すと、治りました。
もし同じ症状が出ているなら、試してみてください。


# 参考サイト
https://trios.pro/visual-studio-code-how-to-use/
https://yama-itech.net/visual-studio-code-recommend-setting-php
【Bootstrap】ヘッダーをレスポンシブに横スクロール対応

# はじめに
ウィンドウを小さくすると、ヘッダーのレイアウトがくずれてしまう。
これを解決するために、Qiitaと同じように、表示部の幅を超えた所で横スクロールできるようにする。

**完成図**
![responsive.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2684787/b243e006-57dd-7044-a9d9-4d7c90178c06.gif)

# 前提

使用環境は以下の通りである。
| No |    項目     |   内容    |
|---:|-------------|------------|
| 1  |      OS       |   Mac     |
| 2  |       Ruby      |   2.6.3   |
| 3  |       rails      |      6.0.4 |
4|bootstrap-sass| 3.4.1　
5|sass-rails|5.1.0
# 実装
https://csshtml.work/side-nowrap/

上記のサイトを参考に実装した。
ヘッダーの構成は以下のようになっている。
```html:app/views/layouts/_header.html.erb
...
      <ul class="nav navbar-nav navbar-right">
        <li><%= link_to "ホーム",   root_path %></li>
        <li><%= link_to "人気記事",   posts_path %></li>
        <li><%= link_to "人気ユーザー",  users_path %></li>
...
```
上記親要素『.nav』と、その子要素『li』についてsassで記載する。
```custom.scss
.nav {
//　ウィンドウが小さくなり、画面に収まらなくなると、横スクロールが表示される。
  overflow-x: auto;
// 要素全体が垂直ではなく横並びにする。
  display: flex;
  li {
// 文字が自動で折り返さないようにする。
    white-space: nowrap;
  }
}
```
これでウィンドウを狭めた時に、文字が入りきらなくなるタイミングで、横スクロールが表示され、ヘッダーのレイアウトが崩れることがなくなった。

# さいごに
下記を実装して、横スクロール対応をした。
・文字を折り返しにしない。=> white-space: nowrap;
・垂直に並べない。 => display: flex;
・ウィンドウサイズに合わせて表示方法を変える。=> overflow-x: auto;

https://getbootstrap.jp/docs/5.0/components/navbar/#how-it-works

ナビゲーションバーにもさまざまな設定がありそうなので、機会があればいろいろ試してみたいと思う。
Vue.jsでローカルのwebフォントを読み込みつつmixinで使用する

# 背景
これまで、Vue.jsのプロジェクトのstyleタグの中で、font-familyを直書きしてfontを当てていました。
そうすると、長いfont-familyの一文が何度も登場してしまいます。
これは見にくいので改善していきたいという気持ちになり、記事を書くに至りました。

# 開発環境
macOS: Monterey 12.4
Vite: 2.9.2
Vue: 3.2.25

# 今回やる事

- ローカルに配置したfontファイルの読み込みの定義を行う
- mixinの定義を行う
- vueファイルのstyleタグ内でmixinを使用してフォントを当てる

それではやっていきましょう。

# ローカルに配置したfontファイルの読み込みの定義を行う
何でも良いのですが、今回無料で使用できるfontとして有名な[Google Fonts][1]を使用します。
可愛かったので、今回RubikDirtというフォントを使用します。
Download allボタンよりダウンロードします。
（良ければお好きなフォントをダウンロードしてみましょう。）

因みにですが、クライアントから求められるフォントがGoogleFontsなどの無料で利用できるフォントではなく、有料のwebフォントであるパターンを想定していますので、今回GoogleFontsをCDNで利用しません。
フォントファイルをサーバーに配置する想定で話を進めていきます。なのでGoogleFontsをダウンロードして使用します。

まずは、フォントを配置するためのディレクトリを作成します。
```
$ mkdir src/assets/font
```
ここに、ダウンロードしたフォントを置きます。

次に、fontファイルの読み込みの定義を行うためのディレクトリ・ファイルを作成します。
```
$ mkdir src/assets/sass
$ touch src/assets/sass/font.scss
```

fontfaceの定義をします。
``` font.scss
@font-face {
  font-family: 'RubikDirt';
  src: url('@/assets/font/RubikDirt-Regular.ttf') format('truetype');
}
```
ここで記述するfont-familyは自分で分かりやすい命名にしましょう。
この名前で実際にstyle指定する事ができるようになります。
また、srcでローカルに配置したフォントファイルへのパスを記載し、読み込めるようにします。
formatに関しては、フォントの拡張子に応じて適切な指定をしましょう。

これらの詳細については、[ドキュメント][2]をご覧ください。

# mixinの定義を行う
mixinの定義を記述するためのファイルを作成します。
mixinを使う事で、複数の処理をひとまとまりの塊としてまとめる事ができます。
```
$ touch src/assets/sass/mixin.scss
```

RubikDirtという名前で定義をします。
名前は自分で分かりやすい命名にしましょう。
``` mixin.scss
@mixin RubikDirt {
  font-family: 'RubikDirt', sans-serif;
  font-weight: bold;
}
```
# vueファイルのstyleタグ内でmixinを使用してフォントを当てる
次は、定義したものを使えるようにしていきましょう。

エントリーポイントのmain.tsでfontfaceの読み込みをします。
これでプロジェクト内で、ローカルに配置したフォントを使用できる状態となります。
``` main.ts
import { createApp } from 'vue'
import App from './App.vue'
import '@/assets/sass/font.scss'

createApp(App).mount('#app')
```
vueファイル内でmixin.scssをimportし、定義した名前でmixinを呼び出します。
@includeで呼び出せます。
``` sample.vue
<template>
  <div class="title">
    <h1>HelloWorld</h1>
  </div>
</template>

<style scoped lang="scss">
@import '@/assets/sass/mixin.scss';

.title {
  text-align: center;

  h1 {
    @include RubikDirt;
  }
}
</style>
```
これでローカルに配置したwebフォントを当てる事ができます。

# まとめ
経験談として、開発途中でやっぱりこのフォントの太さをもうちょっと細くしたい、という要望があり、
そのフォントを適応している箇所全てを修正した覚えがあります。
そういう時に、mixinならば大元の定義のみ修正すれば完了しますので、楽です。
呼び出し側の記述自体もスッキリするので、気持ちよいですね！


[1]:https://fonts.google.com/specimen/Rubik+Dirt
[2]:https://developer.mozilla.org/ja/docs/Web/CSS/@font-face
俺はこうして PHPUnit を爆速にした

## 概要
最近、配属されているチームで、ユニットテストコード（PHPUnit）を導入しました。
テストは、きちんと書くと仕様変更や仕様追加時の実装によるバグを検出してくれるので
テストがない時とは精神的な安心感がまるで違いますね。こりゃあ本当に導入して良かったと思っています。
ですが、、、元々全テストケースを回すと7〜10分くらい掛かっており、
何回も回したい自分としてはもう少し早くならないかな〜と思って色々試した結果
下にある画像の様に1600テストの4000アサーションで1分20秒くらいまで短縮しました！
ちなみにテストコード内でモックDBにテストデータの書き込みとかもしていてこの速度なんで
「あれ・・・もしかしてこれ結構いい感じなのでは？」とか一人で思ってたりしていますw
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304462/2f7276ba-db8f-d90c-617a-ee3a82e5d914.png)

## 基本的な考え方
PHPUnit には `setUp` と `tearDown` があります。
これらはテストケース毎に決まった処理を行ってくれる非常にありがたいメソッドですが、
実は裏でLaravelのアプリケーションを立ち上げたり、それを解放したり・・・
などなどやっていて、これが中々コストを食っていてテストを非常に遅くしている様です。
なので、これらをオーバーライドして親のメソッドが呼ばれるのを最低限にします。

## 実践（基本型）
以下が基本型になります
```php
// 初回読み込み管理変数（初期値false）
private static bool $is_initialized = false;

//　setUp をオーバーライド
protected function setUp(): void
{
    // 初回の場合のみ親クラスの setUp を呼び出す
    if (!self::$is_initialized) {
        parent::setUp();
        self::$is_initialized = true;
    } else {
        return;
    }

    // 1回だけ呼びたい処理（DB登録など）
    factory(Hoge::class)->create();
}

// 何も書かないと親クラスでアプリが一度落とされるので tearDown もオーバーライドする
// この時親の tearDown は呼び出さないのがミソ
protected function tearDown(): void { 
    // use Illuminate\Support\Facades\DB;
    // テストコード内でDB書き込みしている場合は接続を切っておく（なければ書かなくてOK）
    // DB書き込みしている場合はこれ書かないとDBのコネクション上限まで達してテストが落ちるので注意！
    DB::connection()->disconnect();
}
```
まずは static で初回読み込みを完了したことを管理する static 変数を用意して初期値に false を入れておきます。
そして、初回読み込み時に `parent::setUp` を呼び出し、フラグに true を入れることで2回目以降はアプリケーションの立ち上げは行わない様にしています。
`tearDown` でもアプリケーションの終了処理などがされているのできっちりオーバーライドして親メソッドを呼ばない様にしておきます。
これでうまくいくと目の前を新幹線が通るかの如く物凄い速さでテストが実行されていきます・・・
おそらくテストの実行速度の遅さに悩んでいる人は結構感動しちゃうんじゃ無いかと思っていますw

## 例外その１（dispatchを使うテストケース）
元々僕のいたプロジェクトにあったテストコードでは Laravel の dispatch（Queueに突っ込む処理）のテストコードが以下の様に書かれていました。
```php
$this->expectsJobs();
```
上記のコードは爆速化をするとアサーションとしてみなされなくなりテストが risky になってしまいます。
そこで僕のいたプロジェクトでは以下の様に Bus のモックを作ってテストする方法に書き換えてうまく動くようになりました！
```php
// use Illuminate\Support\Facades\Bus;
Bus::fake();
// 念の為にまだ突っ込まれてないよね〜確認
Bus::assertNotDispatched(DelayedProcess::class);

// ・・・ dispatch　に突っ込むロジックを呼び出し例
$dispatch_service->excec();

// キューに処理突っ込まれたよね〜確認
Bus::assertDispatched(DelayedProcess::class);
```

## 例外２（sessionを使うテストケース）
このケースがある場合は各テストケース内の先頭で `$this-refreshAppliacation()` を書くと動きます。
動くんですが、結局全然早くならないのでやった意味がほとんど無いです（笑）
ただし、セッションを使っていない箇所については今まで通り高速で実行してくれるので、
全てのテストケースがsessionを使わないのであれば導入する価値はあるかもしれないです。
もし「こうしたらうまくいくよ〜」というのがあれば是非教えていただきたいです！

## まとめ
パッと思いつくのが上であげたものだけですが、思い出したら追記していきます！
最後まで読んでいただきありがとうございました！
[SQL]CASE式の中で集約関数を使う


いきなりですが、以下のようなテーブルから
①一つのチームにしか所属してない人はそのチームID
②複数のチームに所属している人はメインチームID
を取得するとします。

| p_id | p_name | team_id | team_name | is_main_team |
|:-:|:-:|:-:|:-:|:-:|
|1|いちろう|1|チームA|True|
|1|いちろう|2|チームE|False|
|1|いちろう|3|チームY|False|
|2|よしお|1|チームA|False|
|2|よしお|3|チームE|True|
|3|ごろう|4|チームH|False|
|4|うえい|5|チーム！|False|

色々なやりかたがあると思いますが、ぱっと思いつくのは
①、②それぞれについてselectを書き、unionするとかでしょうか。

それでも必要な結果は得られますが、複数回のテーブルアクセス等、
パフォーマンス面で無駄が発生します。

以下のSQLのように、CASE式と集約関数を組み合わせることで、
一つのselectで条件に沿ったデータの取得が行えます。

## SQL
```sql:
SELECT 
	p_id,p_name,
　　--一つのチームにのみ所属してる人
	CASE WHEN COUNT(*) = 1 THEN MAX(team_id)
    --複数チームに所属してる人
	ELSE
		MAX(
            CASE WHEN is_main_team = 1 THEN team_id
    		ELSE NULL 
            END
        )
	END AS main_team
FROM 
	test1
GROUP BY 
	p_id,p_name
ORDER BY
	p_id
```

## 実行結果
| p_id | p_name | team_id |
|:-:|:-:|:-:|
|1|いちろう|1|
|2|よしお|3|
|3|ごろう|4|
|4|うえい|5|

M根さん「いやそのまえに、このテーブルどうですの。」
M根さん「正規化もクソもあらへんやん。」
ワイ「ワイが来た時には既にこうでした。」
コマンド一発で Sandbox 環境にマスキングした本番データを連携する

# はじめに
顧客の個人情報含む本番のデータを Sandbox 上に構築することはシステムの評価上望ましいですが、コンプライアンスやセキュリティの観点からは好ましくありません。そのため氏名や住所などの個人情報はマスキング処理した上で Sandbox にデータ移行する必要があります。今回それを実施するために SFDX で手軽にできそうなプラグインツールがあったため試して記事にまとめました。

# 事前環境準備
## SFDX のインストール
SFDX が必要なので公式が提供しているインストーラなどを使って環境を構築します。

https://developer.salesforce.com/docs/atlas.ja-jp.sfdx_setup.meta/sfdx_setup/sfdx_setup_install_cli.htm

## プラグインのインストール
[SFDMU (SFDX Data Move Utility)](https://github.com/forcedotcom/SFDX-Data-Move-Utility) というプラグインツールを使います。インストールは sfdx コマンドを叩くだけです。

```
sfdx plugins:install sfdmu
```

## SFDX の認証
SFDX でアプリケーションの認証を通していない場合下記コマンドを叩いてログインしましょう。aオプションの値はエイリアスなので任意の値に変えても問題ないです。（記事中は以下のエイリアス前提で進めます）

```
sfdx auth:web:login -a production   # 本番環境へのログイン
sfdx auth:web:login -a sandbox      # Sandbox 環境へのログイン
```

# データ移行のやり方
## 設定ファイル作成
最初にデータ移行したいオブジェクトの設定ファイルを下記のように作成します。以下の例だと Name のみを取得し連携するので、他に必須項目がある場合は `query` で `SELECT` する項目を増やす必要があります。

```json:export.json
{
  "objects": [
    {
      "query": "SELECT Id, Name FROM Account",
      "operation": "Insert",
      "externalId": "Name",
      "mockFields": [
        {
          "name": "Name",
          "pattern": "c_seq_number('***', 0, 1)"
        }
      ],
      "updateWithMockData": true
    }
  ]
}
```

各キーの意味は以下の通りです。
- query: 連携元で抽出するためのSOQL
- operation: 連携先で実行する操作。Insert, Update, Upsertなど
- mockFields: モック値を入れるフィールドを定義
- mockFields.name: モック値を入れるフィールド名（=フィールドのAPI参照名)
- mockFields.pattern: 代わりに入れるモック値
    - c_seq_number関数: SFMDUで定義されている連番を入れる関数。c_seq_number(値のprefix, start, step)

## データ移行
export.json を作成したディレクトリ下で下記コマンドを実行すると、 Sandbox 環境へデータ連携されます。
```
sfdx sfdmu:run --sourceusername production --targetusername sandbox
```

## データ移行例
### 連携元
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445743/71cf7049-abdd-5091-c539-91f93f8cad69.png" width="400px"/>

### 連携先
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445743/bd89fc3a-fc76-4e69-8134-95404bb02dab.png" width="400px"/>

# 参考
部分的なマスキングなどもできるようなので、もっと細かくやりたい方は本家のヘルプを参照されたし

https://help.sfdmu.com/

https://help.sfdmu.com/full-documentation/advanced-features/data-anonymization
React学んだこと②

## はじめに
自分用です。
書いてある内容は、参考文献に掲載している元動画のほとんど模写です。
自分用に学んだことを殴り書きしているだけなので、見づらいと思います。

#### JSXとは
HTMLを書いているように、Javascriptを書くことができるもの。
Javascriptの拡張言語であって、テンプレート言語とは異なることに注意

#### JSXを使う為には
Reactライブラリをimportする
なぜ、毎回「import React from "react"」しないといけないのか？と思っていたけど、このインポートをしないとJSXを使えない。


#### HTMLとの違い
##### ①class→className

例
HTML
`<div class="test_design">てすと</div>`

React
`<div className="test_design">てすと</div>`

##### ②キャメルケースで記述する
×：image_Path
○：imagePath

Javascriptは"_"が読めないから


##### ③{}内で変数を扱える
{}内に変数を書くことで、jsに変数であることを伝える必要がある


### 参考文献
https://www.youtube.com/watch?v=gLbTluYSb_U

#### React.Fragment
JSXの最上位コンポーネントはかならず一つに留める必要がある。
最上位の要素をdivタグで囲っていたが、HTML的にそのdivタグに意味がないのであれば、書かない方が良い。
そんな時のReact.Fragment

しかし、これを毎回書くのは面倒なので、省略できる
この<></>要素なんだとおもってたけどやっとわかった

例.
```return (
  <React.Fragment>
   <p>これは学んだことのメモです</p>
  </React.Fragment>
)```


```return (
  <>
   <p>これは学んだことのメモです</p>
  </>
)```
The Analytics Engineering Guide 「Why does it exist? 」を読んでみた

# Why does it exist?

前回に引き続き、dbt記事の第2弾。
[Why does it exist?](https://www.getdbt.com/analytics-engineering/why/)の記事を要約＋和訳する。

## 1. Analytics code should be version controlled

#### The Before Times
データサイエンティストは、クエリを個人のマシンに保存するか、せいぜいストアドプロシージャとしてリポジトリにチェックするだけ。

#### Today
分析コードを共有のgitリポジトリで共同作業しています。お互いのコード変更をレビューし、本番環境にマージする前に品質テストを行う。


## 2. Analytics code should have quality assurance

#### The Before Times
またデータ変換の処理に関するテストが不足していたため、データパイプラインの作成・保守を行う際問題がしばしば生じた。
#### Today
dbtテストを導入するため、バグの発生を事前に検知することができるようになった。

## 3. Analytics code should be modular

#### The Before Times
データ分析を行う人々が指標やフィルタリングなど各々の基準で定義づけを行なっていた。コーデの共有が難しい状況。

#### Today
統一されたコードベースで作業を行う。一つのモデルが複数のモデルのベースとなる。SQLに加えてJinjaのようなテンプレート言語を使用することでよりモジュール化されたSQLを利用することができる。


## 4. Analytics should use environments

#### The Before Times
アナリストは本番環境を利用してテストを行なっていた。そのため本番環境が壊れないように祈ることが往々にしてあった。

#### Today
本番環境・開発環境を切り替えることで、変更や追加を開発・テスト・レビューを行える。また本番環境にコミットする前に変更結果の内容を確認できるため安全な運用が可能になる。

## 5. Analytics code should be designed for maintainability

#### The Before Times
新しいデータの追加で既存のデータモデルが壊れることがある。また通知機能を設定していなければ、アラートもなることがない。

#### Today
モジュール化されていくことで、データソースを追加した際、単体かつ個別に切り分けて結果を確認することができる。

## まとめ
dbtを通じて、コードのバージョン管理・テストの逐次実行・モジュールとして切り分けることで管理が容易になると言った利点がありそう。
Fortigateのソフトウェアスイッチでポリシーが反映されない時の対処法

<h1>ソフトウェアスイッチで何故か反映されないファイアウォールポリシー</h1>
Fortigateでソフトウェアスイッチ上を通信させた時に気づいたんですが<br>
なぜかファイアウォールポリシーが反映されてない、、、<br>
結構ハマったんですが、英文翻訳させながらやっとたどり着けたので残しておきます。<br><br>
結論から言えば、CLIで対処しないといけなかったということなんですね。<br>
なんとソフトウェアスイッチはデフォルトでポリシー適用しないスカスカモードなんです<br>
これはもしかしたらバージョンによるのかもしれませんが、自分の場合はスカスカモードでした<br>
ファイアウォールなのにポリシー設定できないモードとかいる？まあよくわからない、、、<br><br>

以下にポリシーが反映されるようにした手順を残しておきますので、同じようにハマらないようにしてください

<h1>既存のソフトウェアスイッチは先に削除！</h1>
既に作成済のソフトウェアスイッチは先に削除しておいてください。<br>
でないと次に紹介する「ポリシーの適用」ができません。<br>
なんと、新規作成した自然体ソフトウェアスイッチ君しか変更ができないのです。ク〇ですね。


<h1>ポリシー適用するコマンド</h1>

```
# config system switch-interface 　　　　　　　#ソフトウェアスイッチを作成できるモード
    edit "soft001"                            #ソフトウェアスイッチの名前(なんでもいい)
         set vdom [root]　                    #rootを指定(vdom複数作るとroot以外にもできるけど、基本root)
         set member [internal1]               #なんでもいいからインターフェースを所属させる必要がある
         set intra-switch-policy [implicit]   #この[]内をexplicitにする
       next
    end　　　　　　　　　　　　　　　　　　　　　 #endで設定反映
```


これでできるはずです。<br>
ちなみに「implicit」がいわゆるスカスカモード。

<h1>最後に</h1>
もしかしたら古いバージョンだったので、ソフトウェアスイッチ作成時にそんなエラーがでたのかも<br>
新しいバージョンでソフトウェアスイッチを新規作成したらデフォルトでポリシー適用されていたのかもしれない<br>
そのあたりは検証してなかったので分かりませんが、同じように困ってる方がこれで解決したのなら幸いです。<br><br>

いやそれ解釈おかしいよ、というのがあればコメント頂ければ幸いです。
[Unity]UIのTextが表示されない問題について

こんにちは！
先日unityでゲーム開発をしようとしたところ、
「あれ？Textがないぞ。。」となって焦ったことがあり色々調べても難しかったので、自分へのメモという意味も込めて記事を書こうと思います。
同じような問題に直面してる方の助けになれば幸いです✨
(これが初投稿なので読みにくい部分があればすみません😅)


# 今回の問題
![スクリーンショット 2022-08-13 0.17.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782402/96d1b366-cf75-9d75-8ea8-82a7f9d67f7d.png)
写真のバージョン：2021.3.8f1

# 試したこと①
以下の記事の内容のように、Unity UIをRemoveして再度Installしようとしたのですが、Installがそもそも表示されなかったので、改善できませんでした。
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11252908236

# 試したこと②
バージョンを落として「2020.3.36f1」でプロジェクトを作成してみました。
結果、無事Textが表示されました！！
![スクリーンショット 2022-08-13 0.23.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782402/cc5dcf0e-d6d2-d8e6-4804-44a0425992a9.png)

# 試したこと③
友人に、2021以降は「Legacyにあるよ」と言われたので確認してみました。
結果、無事2021ver以降でもTextを見つけることができました！(持つべきは友達かな笑)
![スクリーンショット 2022-08-13 21.00.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782402/5efe487f-c172-7c85-66a9-8f1ce8fb0b0c.png)


# 最後に
ということで今回は、UnityのTextが出ない問題について記事を書いてみました！
最後まで読んでいただきありがとうございました😊
ps | grep proc | grep -v grepと実行しても「proc」の有無が行全体のExit codeに反映される

具体的には以下のようなコマンドを実行するとき、
`ps | grep bash | grep -v grep`
その行全体のExit code（次の`echo $?`で表示されるもの）はpsコマンドの出力にbashが含まれるか含まれないかで決まる。bashが含まれれば行全体のコマンド実行結果、`$?`は0になるし、検索文字列をbashじゃなくcashみたいな存在しないプロセス名に置き換えれば行全体として失敗し、`$?`は1になる。

つまり、例えば以下のようなrsyslogdの起動状態を確認するシェルスクリプトで`grep -v grep`と差し込んでも、rsyslogdプロセスの存在を確認するコマンドとして有効である。

```
ps aux | grep /usr/sbin/rsyslogd | grep -v grep > /dev/null
if [ $? == 0 ]; then echo true; else echo false; fi
```

上記を、`grep -v grep`部分のExit codeが分からないなとか考えて、代わりに`wc -l`の行数で判別しようと以下の様にするのは、悪い。

```
l=$(ps aux | grep /usr/sbin/rsyslogd | wc -l)
if [ $l -gt 2 ]; then echo true; else echo false; fi
```

何が悪いかというと、ps auxの実行結果には「grep ～」のプロセスがごくまれに含まれない場合が有って、たまに、rsyslogdプロセスは存在するにも関わらず「wc -l」の実行結果としては「1」が出力されてしまい、プログラムがrsyslogが存在しないと判断を誤るからである。結構判りづらいバグになる。
対して１番目の例は、ps auxの出力にgrepが含まれようが含まれまいが、「/usr/sbin/rsyslogd」が含まれていれば行全体としてのExit codeは0で、rsyslogdがなければ1である。
というか、最近２番目を使うシェルスクリプトを書いてへまをした反省をメモにしたためているのが本記事である。

# なぜそうなるのか

もう少し掘り下げると、`grep -v`のExit codeは、最終的な出力行数が0行になるときに1になり、-vを掛けても何らかの出力行がある場合は0になる。

つまり、aaaというプロセスをチェックしたいとして、psコマンドの出力には以下のように`aaa`が含まれ、

```
aaa
bbb
```

となる時、

```
ps | grep aaa
```

の出力は、

```
aaa
```

で、これに`grep -v grep`を掛けても、その出力は

```
aaa
```

となり、１行出力があるので最終的な`grep -v grep`のExit codeは0になる。

逆に、psコマンドの出力に`aaa`が含まれない以下、

```
bbb
ccc
```

となる時、

```
ps | grep aaa
```

の出力は１行も無く

```
```

となり、そこに`grep -v grep`を掛けても、その出力は空のままで、

```
```

この時、出力行は０行となるので`grep -v grep`のExit codeは1になる。

また、psコマンドの出力に`aaa`が含まれず、`grep aaa`が含まれる以下、

```
bbb
ccc
grep aaa
```

の場合は、

```
ps | grep aaa
```

の出力結果は以下のようになり、

```
grep aaa
```

そこに`grep -v grep`を掛けると、その出力は最終的に空となり、

```
```

結果として出力行は０行となるので、この時の`grep -v grep`のExit codeは1になる。

いやー、上手くできているものだと感心しきり。

なお、その他のテクとしてgrep検索文字列の１文字目を`[]`で囲む方法もあるが、検索文字列が変数となる場合、例えばスクリプト内で以下のように書くときは都合が悪い。

```
p=/usr/sbin/rsyslog
ps aux | grep "$p" | grep -v grep > /dev/null
if [ $? ～
```

さらに、シェルスクリプト内でプロセスの存在を確認するならpgrepを使うのが良いかもしれない。pgrep -fで、プロセスのコマンド行全体を検索することもできるようだ。
React学んだこと①

# 学んだこと


#### 結局DOMってなに？
DOMとは、Document Object Modelのことで、HTMLにアクセスする窓口のこと
Reactを使わない画面描画をすると、このHTTMLにアクセスする窓口を直接編集して、HTMLを描画させる必要があるので、
コストが高い
→あるdiv要素を変更したい、
→特定のdivタグのDOM要素を取得・変更する

#### ではどうするのか？
そこで、現れたのが仮想DOM。
ReactがDOMツリーをJavascriptのオブジェクトとして扱うことで、ただのデザインではなく。窓口の状態を持ったUIを作ることができる。

#### なぜ、それが実現できるのか？
仮想DOMにすることで、DOMの情報・状態をJavascript内で完結・管理することができるから


## 参考文献
https://www.youtube.com/watch?v=XKSYF2aZnkQ
ブラウザなどで使う検索方法５つまとめてみた（除外検索、完全一致検索など）

# 動機
エンジニアはエラー検索など、検索力が大事ということを知り、検索についてのスキルを高めるために、検索方法を調べました。
同じような人がいるかもと思い、記事を書きました。

# AND検索
A　Bと検索する方法。
AとBの間にはスペースを入れます。
複数の条件をいずれも満たすものを検索すること（この場合だと、AとBを満たすものを検索します）。

# OR検索
A　OR　Bと検索する方法
複数の条件のうち少なくともいずれか一つを満たすものを検索すること（この場合だとAかBの少なくともいずれか１つは満たすものを検索します）。

# 完全一致検索
"キーワード"で検索します。
キーワードと完全に同じものを探す検索方法
例："ノートパソコン"
途中でスペースがあるキーワードや文章を検索するときに役立ちます。

# 除外検索
A -Bと検索する方法
例：パソコン -通販
通販を行っているページが除外されたパソコン関連の情報が検索されます。

# ワイルドカード検索
検索したいキーワードの一部がわからないときに使います。
例：パソ＊ンと検索をかけると、パソコンが検索されます（例）。

https://affikatsu.com/research-method-891/
を参考にしました。
# 気づき
AND検索以外、知らない検索方法ばかりだった。
これからはこれらを駆使していきます。
Terraformの概要とAWS EC2作成の定義のやり方について

今回は、Terraformを学んでみました。
Terraformとは、AWS、GCP、Azureなどのクラウドリソースを、
コードで定義して、構築できるオープンソースです。

AWSでいう、Cloud Formationに似ているものですが、
AzureやGCPも汎用的に使えるということで、
Dockerや、Kubernetesと同様に広く愛されている技術です。

最低限の使い方ということで、
試しに、AWS EC2のt2マイクロを作成するための、
定義ファイルをmain.tfという名前で作ってみました。

<h3>事前準備</h3>

まずは、最初の準備として、
・Terraformがインストールされていること
・AWS CLIがインストールされていること
```
yusuke@mbp terraform % terraform --version
Terraform v0.15.4
on darwin_amd64
+ provider registry.terraform.io/hashicorp/aws v4.26.0

Your version of Terraform is out of date! The latest version
is 1.2.8. You can update by downloading from https://www.terraform.io/downloads.html
yusuke@mbp terraform % aws --version
aws-cli/2.7.20 Python/3.9.11 Darwin/20.4.0 exe/x86_64 prompt/off
```
また、AWS CLIの初期設定や、IAM設定も、
今回は触れませんが必要です。

<h3>.tfファイルにEC2起動の定義を記載する。</h3>
.tfファイルはTerraformを表しています。

```
provider "aws" {
  profile = "terraform"
  region = "ap-northeast-1"
}

resource "aws_instance" "test" {
  ami = "ami-0ecb2a61303230c9d"
  instance_type = "t2.micro"

  tags = {
    Name = "test"
  }
} 
```
EC2の作成だけなら、やることはこれだけです。
実際使用するときは、サブネットや冗長化、インターネットゲートウェイなど、もっと大量に記載するものはありますね。

今回は、これだけで、
別の記事で、実際の使い方や、以下のコマンドについて触れていきます。
```
terraform init
terraform plan
terraform apply
```
Cloud9でphpMyAdminを使用する方法

## 環境
PHP 7.3.30
laravel 8.83.23
mysql  Ver 14.14


## 方法
1. mysql -u root -p
2. update mysql.user set password=password('root') where user='root';
2. exit;
2. cd your_project/public
2. wget https://files.phpmyadmin.net/phpMyAdmin/4.8.3/phpMyAdmin-4.8.3-all-languages.zip
2. unzip phpMyAdmin-4.8.3-all-languages.zip
2. public 以下に回答されたフォルダ名をphpMyAdminへ変更
2. cd ../
2. php artisan serve --port=8080
2. Previewを表示
2. URLの末尾に/phpMyAdmin/index.phpを追加して表示
2. .env内を修正する
MeCabとCaboChaのPythonバインディングWindows10編

# 1. はじめに
PCを更新すると、MeCabとCaboChaもインストールしなおし。
なかなか、うまくできない。
Qiitaはもちろん、Webを駆け回って、何とか解決した。

# 2. インストール手順
## 2.1. Windows 10
* もちろん64ビット

## 2.2. 32ビットのPythonをインストール
* ストアアプリのPythonもダメ

## 2.3. MeCabとCaboCha
* 公式のインストーラからインストール
* インストール先がデフォルトと違うと、Pythonバインディング方法が異なる
Linuxはどこにインストールされているかわかるからいいのか
* UTF8を呪文のように唱えながら

## 2.4. Visual Studio 2022でいいかぁ

ライセンス違反にならないように、好きなのをインストール

## 2.5. Pythonバインディング

### 2.5.1. MeCabとCaboChaがデフォルトのインストール先のとき
次でインストールできるはず
* pip install mecab
* pip install cabocha-python

ikegamiさん感謝です

### 2.5.2. MeCabとCaboChaはデフォルト以外にインストール c:\ 直下など


この場合はソースコードからインストール
さがしたらパッケージもあるかもしれないけど
ソースコードからインストールってWindowsユーザーからしてみるとかっこいい
で、たくさんの人が

* include_dirs
* library_dirs
* libraries

をインストール環境に合わせたらOKとあるんだけど、どうもダメ。
Linuxユーザーさんかな。
dllのPathを通すとか、dllをsite-packageに置くとか説明があってもよくわからない。

ikegamiさんのコードはどうなっているの?
プロパティ data_files が設定してある。ここに dllの場所を設定すると、一緒にインストールされるみたい。
パッケージ登録している人はちゃんと設定してあるのに、web上では探せなかった。

次に、pip install と python setup.py installでは動きが違うのか、ソースコードを持ってきて、python setup.py install してもダメ。

そこで、ikegamiさんのソースコードをいただいてきて、setup.py を次に変更して、python setup.py install で完了。さらに、ikegamiさんのコードはいろいろ修正済みでそのまま使える。

再び感謝です。

```python:setup.py(mecab)
from distutils.core import setup, Extension, os

current_ver ="0.996" # バージョンに合わせて変更
bin_dir = r"C:\Program Files (x86)\MeCab\bin"  # インストール環境に合わせて変更
include_dir = r"C:\Program Files (x86)\MeCab\sdk" # インストール環境に合わせて変更
libs_dir = include_dir
libmecab_dir = os.path.join(bin_dir, "libmecab.dll")


setup(name = "mecab",
    version = current_ver,
    py_modules=["MeCab"],
    ext_modules = [
        Extension("_MeCab",
            ["MeCab_wrap.cxx",],
            library_dirs=[libs_dir],
            libraries=["libmecab"]
            )
    ],
    data_files = [('', [libmecab_dir])]
)

```


```python:setup.py(cabocha)
from distutils.core import setup, Extension, os

current_ver ="0.69" # バージョンに合わせて変更
bin_dir = r"C:\Program Files (x86)\CaboCha\bin"  # インストール環境に合わせて変更
include_dir = r"C:\Program Files (x86)\CaboCha\sdk" # インストール環境に合わせて変更
libs_dir = include_dir
libcabocha_dir = os.path.join(bin_dir, "libcabocha.dll")
libcrfpp_dir = os.path.join(bin_dir, "libcrfpp.dll")

setup(name = "cabocha-python",
    version = current_ver,
    py_modules=["CaboCha"],
    ext_modules = [
        Extension("_CaboCha",
            ["CaboCha_wrap.cxx",],
            include_dirs=[include_dir],
            library_dirs=[libs_dir],
            libraries=["libcabocha"]
            )
    ],
    data_files = [('', [libcabocha_dir, libcrfpp_dir])]
)

```
SageMaker運用(ライフサイクル編)

# はじめに
最近、PoCがてらSageMakerを利用しており少し工夫したので本記事で共有したい

# SageMakerとは
機械学習やAIを使った分析をしたい従来であれば幅広い知識と環境を用意する必要があった。
幅広い知識でいうと、分析とは数学チックな知識や、高度なプログラミング知識を要求されるデータサイエンティストがまさにそれだ。環境面でいうとGPUであったり、Hadoopの環境を整えたりと分析以前に準備でとん挫することが多々あったが、このマネージドサービスを利用すれば多少なりとも素人なりに分析環境やアセットを提供するよといったサービスと思ってもらえればよい（かなりかみ砕いた）

# 今回は
本記事ではSageMakerのノートブックインスタンスを運用するうえで便利なライフサイクルというものがあるが、それを利用するうえで工夫した内容を書き記していく

# ライフサイクルとは
SageMakerで動いているサーバはベースに関してはEC2で動いてるが、これが絶妙に厄介で（利用者はEC2の運用をしない点では嬉しいが）、ノートブックインスタンス自体を停止してしまうと、設定内容や、インストールしたモジュール等が全てリセットされてしまうという何とも言い難い仕様になっている。なのでこういった問題を解決するためにライフサイクルという機能が本サービスには備わっている。

具体的には画面を見るとイメージが付きやすい
![8DA3CC6E-871F-4683-B036-E2560DD6EA45.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187693/7c3b7c92-3dd5-8cf3-7ed7-1c23b560c324.jpeg)

上記はライフサイクルの設定画面であり
スクリプトをクリックすると
![E11206FC-679C-4DF8-A2DF-2C3ED77F2928.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187693/98ecdf33-2f24-bdf1-7668-09d3f11544d0.jpeg)


こういった形で表示される

これが何とも言えない形で(別画面のもあるがコード管理もできないし不便)もあるし
設定したい内容が複数あった場合に非常に醜いと感じたため下記で
ライフサイクルスクリプトの設計を行った

# ライフサイクル設計
![lifecycle.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187693/bbcfdd09-e3ba-5580-9c38-cb1a1f55c248.png)

図式した内容をベースに話すと
ライフサイクルが実行されたら（停止→起動）
ライフサイクルのジョブはマニフェストに記載されている内容を
読み込み、ジョブとして実行する（1個1個のジョブは中規模のスクリプト）
こういった構成することにより、新規で設定を追加したい場合は
ライフサイクル設定からではなくマニフェストファイルにジョブを記載し
実際のジョブスクリプトと疎結合で開発が可能になる。またコード管理化も行った。
（ライフサイクルに記載されているものはコード管理ができないのでこの構成は大いに享受できる）
![7D8F8E79-4E01-4E4D-9C9D-A5206F0789DA.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187693/ffef856f-f04c-552d-6544-79d0c043c347.jpeg)
(ライフサイクル上は数行で完結)



# 終わりに
SageMakerを利用したPoCはまだまだ発展途上なので進捗あり次第記事化したい
ROCm で Stable Diffusion 動きます(Stable Diffuson 2.0 も動くよ)


ふえぇ... AMD GPU で Stable diffusion 計算代行してがっぽがっぽしたいよぉ...

## 情報

https://www.reddit.com/r/StableDiffusion/comments/wv3zam/i_got_stable_diffusion_public_release_working_on/

https://www.reddit.com/r/StableDiffusion/comments/ww436j/howto_stable_diffusion_on_an_amd_gpu/

## 環境

 * Ubuntu 22.04(20.04 推奨)
 * RX6800(RDNA2) 16GB
 * Docker で ROCm 実行
 
手元ですぐに試せる環境が Ubuntu 22.04 のみで, 22.04 は ROCm 正式対応していないため,

https://askubuntu.com/questions/1417418/unmet-dependencies-ubuntu-22-04-amdgpu-hip-support

を参考にして無理やりインストールしました!
(20.04 環境がある方は 20.04 使ったほうがいいです)

## ROCm pytorch

オフィシャル? からだと ROCm 5.1.1 なのと, セットアップ容易 + ROCm 最新 5.2.3 を使うため docker を使います.

https://hub.docker.com/r/rocm/pytorch

から適したのを取得します.

執筆時点では `rocm/pytorch:rocm5.2.3_ubuntu20.04_py3.7_pytorch_1.12.1` が最適でした.

## 実行

https://github.com/RadeonOpenCompute/ROCm-docker

ROCm(amdgpu)自体, Ubuntu 20.04 以降であれば `video` group(`render` も?) があれば usespace で動かせます.
(このあたり細かいところのセキュリティはディストリビューションによると思われる)

また, 最近では sudo などつけなくても user space で docker 動かし GPU アクセスできます.

ROCm 使うには `/dev/kfd`, `/dev/dri` が見えている必要があるため, `--device` でコンテナ内で見れるようにします.

`--security-opt seccomp=unconfined` は無くても大丈夫そう.
(ROCm で Stable diffusion 計算代行など, GPU 計算をインターネット越しで提供する場合は適切に設定するのが推奨と思われる: https://www.creationline.com/lab/46861)

`--privileged`(特権モード)は deprecated になったようでつけなくてよいです.

`--group-add` で `video` group にユーザを追加しないといけません.

```
docker run --name pytorch_rocm -it --rm --device=/dev/kfd --device=/dev/dri --group-add video rocm/pytorch:rocm5.2.3_ubuntu20.04_py3.7_pytorch_1.12.1
```

で Docker 起動し,


```
import torch
torch.cuda.is_available()
```

で pytorch の import と, cuda(ROCm GPU)使えるか確認しておきます.

あとは 

https://tadaoyamaoka.hatenablog.com/entry/2022/08/23/222813

あたりを参考にして動かせばいけます!

![Screenshot from 2022-09-01 22-30-20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36275/f125b5c8-a558-2419-200f-3c85281714b7.png)

Voila!
(X11 とか volume 共有していなかったのでとりあえず imcat https://github.com/stolk/imcat で terminal で表示) 

実行時間は推論だからか reddit にあるように CUDA と遜色ない速度で処理できている感がありました.

## 解像度

RX6800 16GB で,

* 768x768 いけました.

~~768x1024 などは CUDA と同様にメモリ不足で実行できずになりました.~~ そもそも学習が 512x512 なので解像度たかくしてもうまくいかない. SD 2.0 や upscalar を使いましょう.


## Stable diffison 2.0

2.0 も動きました :tada:

![output.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36275/e3aaad99-00fc-d22e-e4e2-af6c31361b0b.png)

https://github.com/ShivamShrirao/diffusers

こちらのメモリ削減版を使い

768x768 で memory usagge 33% (~5.5 GB)

で行けました. GPU メモリ 8GB でもいけるやも.

## TODO

* [x] pip install あたりのセットアップの履歴を docker イメージに残す(https://github.com/l1na-forever/stable-diffusion-rocm-docker 当たり参考に `Dockerfile` 作らないとダメかしらん)
* 学習もさせてみる(以前(昨年あたり)は pytorch rocm とりあえず動くものの, おそすぎたり計算 nan でたりとダメダメでしたが, 一応 Pytorch ROCm は `beta` 取れているのでいまはきちんと動きそう?)
  * finetune は Dreambooth でできるのを確認ずみ 
* AMD GPU たくさん並べて Stable diffusion 計算代行でがっぽがっぽするスキームを確立する(GeForce では EULA で商用ホスティングサービス提供が禁止されているので計算代行は EULA に抵触する可能性があるため)
docker環境化でReactのproxyが通らない時の対処法

Docker環境化でpackage.jsonの中に`"proxy": "http:localhost:8000/api"`と書いてGETリクエストを送っても、`Proxy error: Could not proxy request`とエラーが出て怒られました。
### 期待した動き
`http://localhost:3000/posts`に対してGETリクエストを送った際に、proxyを通して`http://localhost:8000/api/post`に飛んでほしかった
### 実際の動き
めっちゃエラーでてくる

### 原因
docker環境化でlocalhostを指定するとどこにいけばよいかわからなくなるらしい

### 対応策
package.jsonでproxyを指定する時にdockerコンテナのサービス名を指定してあげるとうまく行く
```
"proxy": "http://<dockerのサービス名>:8000/api"
```

proxyを変えた後は`docker-compose restart`で再起動する
Growi 4.5.8から5.1.3までアップグレードした時の記録

# 概要と前提

docker-composeで設定したGrowiを、ちょっとした外部接続なし環境でdocker saveしたイメージベースで運用している。

既存Growiは4.5.8だが、ページツリーのある5.1系にアップグレードしたいと思った。
データアーカイブで中味を書き出して、インポートすればすぐなのでは?と気楽に考えていたが、ドキュメントをみると作成したアーカイブは同一バージョン間でしか利用できない。

GrowiのSlackで聞いてみたが、直接Growi上げては?との回答だったので、どうすればいいのかな～と思ったり、単にイメージを差し替えても動かないのでどうしようかと思った。

## 結論

MongoDBのアップデートがキモだった。

https://www.mongodb.com/docs/manual/release-notes/4.0-upgrade-standalone/


## 手順

当初docker-composeで動いていたのはGrowi4.5.8+mongoDB3.6。
GrowiのDockerfileで新しいバージョンに書き換えて実行したが、Growi5.1はmongoDB4.4以上を求めておりエラーになる。

Growiのアップグレードガイドばかり見ていたが、ふと目を下すとmongoDBのアップグレードについて記載があった。
関連してググると、下記Wikiをみつけた。
https://dev.growi.org/5f6afa883a72dc0048e54ab7

結果以下のやり方でアップデートできた。

1. 初期docker-compose.ymlの状態(Growiは4系のまま)で、mongoDB 3.6→4.0にアップデート(イメージ差し替え)
1. docker-compose upしている状態で `docker-compose exec mongo bash` 実行
1. mongoDBの機能互換バージョン(FCV)を確認: `db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )`
1. mongoDBの機能互換バージョンを次のバージョンに書き換え: `db.adminCommand( { setFeatureCompatibilityVersion: "4.0" } )`

```bash:実行イメージ
> docker-compose exec mongo bash
> db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )
{ "featureCompatibilityVersion" : { "version" : "3.6" }, "ok" : 1 }
>  db.adminCommand( { setFeatureCompatibilityVersion: "4.0" } )
```

3.6から一度に4.4まではアップグレードできない。
docker-compose.ymlのmongdbを 3.6 から 4.0 に書き換えて FCV を同4.0に。
いったんコンテナを停止し、docker-composeのmongodbを再び4.0から4.2に書き換え、設定。
繰り返して 3.6 → 4.0 → 4.2 → 4.4 と順番に作業することで、最終的にmongodb:4.4としていてもコンテナが再起動を繰り返すことがなくなった。

mongodbを4.4まであげられたら、Dockerfileのgrowiを4.5.8→5.1.3に書き換えて docker-compose up 、これでようやく5.1系統にアップデート終了。
あとはGrowiの上からメンテナンスモードに落として、V5形式に変換を行う。

### 参考リンク

- [GrowiDocs - mongoDBのアップグレード](https://docs.growi.org/ja/admin-guide/admin-cookbook/upgrade-mongodb.html#%E4%BB%98%E9%8C%B2b-docker-compose-%E3%83%A6%E3%83%BC%E3%82%B5%E3%82%99%E3%83%BC%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%82%A2%E3%83%83%E3%83%95%E3%82%9A%E3%82%AF%E3%82%99%E3%83%AC%E3%83%BC%E3%83%88%E3%82%99%E6%89%8B%E9%A0%86%E4%BE%8B)
Ruby入門

# Ruby超基礎文法
自分用

## Hello World
```ruby
puts "Hello World"
puts "Hello" + "World"
```
- puts
出力命令

- 文字列
文字列にはシングルクォーテーションかダブルクォーテーションをつける
数値には不要
`+` で文字列の連結もできる

## 変数
```ruby
number = 1
number += 1   #　number = 2 になる
user_name = "イチロー"
```
- 変数
スネークケース
数字スタート・ローマ字不可

- 変数更新
後に代入すれば上書きできる
`+=`　などは利用可能
`++` `--` 　は利用不可らしい 

```ruby
hello = "こんにちわ"
name = "イチロー"
puts hello + name  #　こんにちわイチロー
name += "さん"   # イチローさん
puts "こんにちわ#{name}"  # こんにちわイチローさん
```
- 文字列の結合
`+` を用いることで文字列を連結可能

- 変数展開
文字列内に変数を挿入する場合はダブルクォーテーションで囲む
`#{変数}`　の形

## 条件分岐
```ruby
number = 50

if number > 40
 puts '40より大きい'
elsif number >= 30
 puts '30以上'
else
 puts '30より小さい'
end  # ４０より大きい

remainder = number % 3

case remainder
 when 0 then
  puts '大吉'      
 when 1 then
  puts '中吉'
 when 2 then
  puts '小吉'        
 else
  puts '凶'
 end
```
- 条件分岐 if
if 条件式 ~ elsif 条件式 ~ else　 ~ end の形

- 条件分岐 case 
case ~ when ~ then 処理 ~ end の形

- 比較演算子
`==` `!=` `>` `<`　など
and条件 `&&` ,  or条件 `||`


## 配列
```ruby
titles = ['aaa','bbb','ccc']
titles.push('ddd') # 配列の値を末尾に追加
titles[1] = 'eee' # bbbがeeeに値更新

titles = {
           'a' => 'aaa', 
           'b' => 'bbb',
           'c' => 'ccc'
          } # キー => 値　または　キー:値
puts titles['a']; # 結果:aaa
titles['d'] = 'ddd' # 値の追加
```
- 配列
〇〇 = ['aaa','bbb','ccc']　の形
[]で囲む

- 連想配列（ハッシュ）
'キー' => '値'　または　キー:値
{}で囲む

## 繰り返し処理
- 繰り返し処理 times
```ruby
5.times do |t|  # 5回繰り返す
 puts "#{t}"  # 0 1 2 3 4
end
```

- 配列の繰り返し処理　each

```ruby
names = ['Taro','Ichiro','Jiro']
names.each do |name|
 puts name # Taro Ichiro Jiro
end

names = [
 'Tanaka' => 'Taro',
 'Suzuki' => 'Ichiro'
 'Yamada' => 'Jiro'
]
names.each do |key, value|
 puts key + value # TanakaTaro SuzukiIchiro YamadaJiro
end
```

***
## 関数
```ruby
def hello(world)
  puts "Hello #{world}"
end

hello("Tokyo") # Hello　Tokyo
```
- 関数の定義
def 関数（引数） 処理 end　　の形で定義する
値渡しのみ
VS Code XDebug Mac ブレークポイントが止まらない件

ローカルMacに、Laravelを入れた。

最近はphpでもデバッグできるらしい。
「printデバッグよりも、全然効率が違いますから」なんて書いてあると気になる。
VS Code上で、PHPのデバッグとコード補完が利用できるらしい。

今さら気が付いたのだが、本やブログなどを見ると、SailだのDockerだの、
環境を一まとめにしたツールを使っている。

解説もそれを前提としているので、環境が違うと動かなかったりする。
だから、最初は、面倒であっても、その本やブログで紹介されているツールと同じのを使うのがいいのかな。
※私の環境では、そういったものは使用していない。
他のブログや本で動かなかった時のヒントになればと思います。

インストールメモ。

環境：
・Mac OS 12.5.1 M1
・php 8.0
・Laravel 9
・VS CODE
・XDebug 3.1.5 （２系、３.２系と微妙に設定が違うようです）
・サーバは、php artisan serve

VS Codeは、インストーラーがあったので、それを利用。
私のバージョンでは、VS Codeを起動して、[Code]->[基本設定]->[機能拡張］と進み、
PHP Debugと、PHP IntelliSenseがセットになった、PHP Extension Packとかいうのをインストールした。

XDebugは、
```
pecl install xdebug
```
でできた。

そして、ローカルなphpファイルにブレークポイントを設定してデバッグ実行すると、
そのブレークポイントを設定した地点で実行が停止した。

ここまではよかったのだが、サーバー上で実行するとブレークポイントで止まってくれない。

ブログや本とはパスなどが違い、なかなか動いてくれない。
色々やってやっと動いた。数時間は掛かった。
XDebugとサーバを連動させることが肝であった。


以下は、私の環境でできたものである。

【重要かつ基本】
php -vやphpinfoなどの出力でXDebugが組み込まれているか調べること。
これが一番大事。つまりキングです。
設定ファイルが複数あるケースで、どれが反映しているかわからないときは、
実際に読み込まれている情報を確認すること。
そして、（あれば）ログファイルのエラーを見ること。  

php.ini

先頭に
```
zend_extension="xdebug.so"
```
これでよかった。homebrewでインストールした先のパスを調べて書かなくても私の環境では問題ない。
コマンドで確認できた。

ファイル末尾に、
```
[xdebug]
xdebug.mode=debug
xdebug.start_with_request=yes
```


この２行追加。
これがないと、サーバーで実行した時にブレークポイントで停止してくれない。
Xdebug.client_hostや、xdebug.client_portを指定するとエラーになった。
これはバージョンにもよるのだろう。ちなみに私のはXDebug 3.1.5

ここが一番のハマリだった。
つまり、xdebug.modeとxdebug.start_with_requestだけ設定して、他のものは設定しない。大抵、remote_hostやclient_hostを設定する例が載っている。

今回、デフォルトで動くものがほとんどだった。逆に、値を設定してエラーになるケースが本当に多かった。
私の知識不足なんだろう。おそらく、ツールの配布元など、オーソリティーを詳しく調べると分かるものもあったのかも。


launch.json (VS CODE)

```
[...]
        {
            "name": "Listen for Xdebug",
            "type": "php",
            "request": "launch",
            "port": 9003
        },
[...]
```


デフォルトでいい。ローカルなので"pathMappings"は必要ない。
下手に入れるとエラー（Class Not Found）になりがち。

デバッグ実行は、launch.jsonを開いたタブで実行。
ソースファイルだと階層違いでClass Not Foundエラーになった。

ファイルが見つからないときは、隠しフォルダの.vscodeを削除して、
もう一回、launch.jsonを作成する。（VS Codeのキャッシュエラー？）

次は、myPHPAdmin行ってみよう！

以上


【昔話】
そういえば、昔（２０年くらい前？）、Visual Studioのエディタに補完機能が付いていて、
それで色々と表示される候補を見て、クラスライブラリの使い方を覚えていったっけなぁ。

VCのエディタが便利で、Windowsが関係ないCのソースコードなんかにも、使っていた。
秀丸はその時あったのかな？ 先輩はMifesというエディタの方が多かったと記憶している。

なんでもvimでやるのが「通」だと思っていたのだが、結局マスターできず。
今回、VS CodeにVimプラグインがあったので、早速インストールして喜んでいる。
Terapadで直接Edgeを起動させる方法

ツールの設定で追加。

名前：Edge
実行ファイル：Edgeのexeファイル
コマンドラインパラメータ：ファイルのパス（長）

OKボタンを押して終了。

HTMLファイルを開いているときにツール→Edgeをクリック。
Edgeが起動します。

HTMLファイルを編集して、確認したいときに便利です。
pythonでExcel操作を自動化する

openpyxlを使用して、seleniumで取得したデータをExcelへ入力する作業を自動化します。
csvに出力する等もあると思いますが、Excelはどこでも使っていると思うのでExcelを選びました。

## インストール

openpyxlを以下でインストールします

```bash
$ pip install openpyxl
```

インストール確認は以下です。

```bash
$ pip list | grep openpyxl
openpyxl           3.0.10
```

## ファイル読み込み

```python
import openpyxl
wb = openpyxl.load_workbook("読み込みたいファイル")
```

## シート読み込み

```python
sheet = wb["読み込みたいシート名"]
```

## セル読み込み

```python
value = sheet.cell(row=1, column=1).value
```

A1セルを読み込む

row=行、column=列

```python
value = sheet["A1"].value
```

## データ書き込み

```python
wb = openpyxl.load_workbook('./Excelサンプル.xlsx')
sheet = wb['サンプル']
sheet.cell(row=1, column=1).value = 0
wb.save('./Excelサンプル.xlsx')
wb.close()
```

## シート名変更

```python
#シート名を変更
ws.title = 'シート2'
```

## 名前をつけて保存
```python
wb.save('C:/Users/xxx/Desktop/test/testシート名変更.xlsx')
```
Amazon QuickSight とは

## 勉強前イメージ

んーなんか環境を可視化できる的なやつ？

## 調査

### Amazon QuickSight とは

AWSで使用できる、完全マネージド型のBIツールになります。
BIツールのBIとはBusiness Intelligenceの略で、組織が蓄積したデータを収集・分析・報告することで経営上の決定に役立てるツールのことを言います。
BIツールの基本機能としては以下になります。

- データ抽出
- データ加工
- データ分析・可視化
- ダッシュボード作成・共有

QuickSightとは、AWSで利用できる収集・分析・報告のサービスということになります。

### Amazon QuickSight の特徴

- データソースとの統合が可能

RedshiftやRDS、またデータベースインスタンスをデータソースとして
既存のデータソースで使用することができます。

- 複数人で共有できる

ダッシュボードを共有することで使用したい人全員が見られるようになります。

- コストを抑えられる

QuickSightの費用はストレージ容量とユーザ数です。
利用ユーザが一人であれば一定の容量までは無料ですし、無料期間もあるので動作確認をすることができます。

- 作業時間を短縮できる

SPICEという計算エンジンを使用することで高速なパフォーマンスが期待できます。

- いろんなデバイスで利用できる

共有されるダッシュボードはデバイスを選ばずアクセスすることができ、
iphone用のアプリも存在します。

## 勉強後イメージ

AWSで使えるBIツール・・・。

## 参考

- [AWSのAmazon QuickSightとは？特徴6つと使用方法を解説](https://www.fenet.jp/aws/column/aws-beginner/376/)
gqlgenでコードを再生成できない！


[こちら](https://www.howtographql.com/graphql-go/1-getting-started/)のGetting Startedをやっている時に遭遇。

記載通りにスキーマを`schema.graphqls`定義し直して、
次のコマンドで再生成！
```
go run github.com/99designs/gqlgen generate
```

やってみると次の文言が複数行出てうまくいかない。。。
```
missing go.sum entry for module providing package 
```

以下の手順で解決した。
`tools.go`を作成して下記を記載。
```golang
package tools

import (
	_ "github.com/99designs/gqlgen"
)
```

その後で`go mod tidy`を実行後に再度
```
go run github.com/99designs/gqlgen generate
```
を叩くとコードが生成された^^

`go mod tidy`では不要なimportを消すため、
gqlgenなどのコード生成にしか使わないようなmoduleも削除されてしまうらしい。

そのため、tools.go のようなファイルを作ってimportすることで,
`go mod tidy`で消えないようにする。
JavaScriptで列挙型(Enum)を使用する

### 列挙(Enum)とは

多くのプログラミング言語では、列挙型(Enum)があります。
JavaScriptのビルトインオブジェクトにはこの機能がないので独自で作成してみます。

### 配列で作る

```JavaScript
const fruits = ['🍎', '🍌', '🍇']
```

配列を使用すると、果物の一覧を保存できますが、
利用者は配列の順序を覚えておく必要があります。

```
console.log(fruits[0])
// 0要素目が'🍎'であることを覚えている必要がある
```

### オブジェクトで作る
これは、オブジェクトを使用することで解決できます。

```JavaScript
const fruits = {
  apple: '🍎',
  banana: '🍌',
  grape: '🍇',
  orange: '🟠',
}
```

オブジェクトを使用すると、配列のようにインデックスを指定する必要がなくなります。

```JavaScript
console.log(fruits.apple) // 🍎
```

しかし、まだプロパティを編集または削除できてしまうという問題があります。

### JavaScript列挙型の作成

列挙型として使うためには、読み取り専用にする必要があります。
これは`Object.freeze()`を使用することで実現できます。

```JavaScript
const fruits = Object.freeze({
    apple: '🍎',
    banana: '🍌',
    grape: '🍇',
    orange: '🟠',
})
fruits.apple = 'りんご'
console.log(fruits.apple) // 🍎
```

これで、プロパティが編集されるのを防ぐことができます。
[Vagrant] vagrant up時の "umount /mnt" を一瞬で解決

## 概要
　Vagrantで仮想環境を構築している際によく出くわすエラーなので、
誰かの役に立てば思いここに残しておきます。

## 発生したエラー
`vagrant up` を実行すると以下のようなエラー

```shell
...
    default: in which case you may ignore this message.
==> default: [vagrant-hostsupdater] Checking for host entries
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!

umount /mnt

Stdout from the command:

Stderr from the command:

umount: /mnt: not mounted
```

## 解決方法
`vagrant ssh` でゲストOSとしてログイン

そしたら次に、

```
[vagrant@localhost ~]$ sudo yum update -y # モジュールのアップデート

[vagrant@localhost ~]$ exit
```

最後に、

`vagrant reload`
[PLATEAU入門] CityGMLをOBJやFBX形式に変換する際の注意

# はじめに
どうも、べちおです。

山奥の大学で学生エンジニアをしています。
よろしくお願いいたします。

# 今回の内容

今回は国土交通省が提供しているPLATEAU - 3D都市モデルをCGソフトで利用できる形式に変換する方法を紹介したいと思います。

PLATEAUの3D都市モデルはCityGMLという特殊な形式になっており、通常のCGソフトでは読み込むことができません。(UnityとかBlenderとか・・・)
そのため、一度形式を読み込める形で変換してあげる必要があります。

詳しい変換の方法はPLATEAU公式の[**Libraries**](https://www.mlit.go.jp/plateau/libraries/)の[**3D都市モデルのデータ変換マニュアル**](https://www.mlit.go.jp/plateau/file/libraries/doc/plateau_doc_0007_ver01.pdf)に記載されています。(一読することを強くお勧めします)

ぶっちゃけると、**3D都市モデルのデータ変換マニュアル**が優秀すぎてこちらの方で細かく書く必要がないレベルなので、私が実際にデータの変換を行った際に気づいた点も含めながら紹介していきます。

そのため、この記事は**3D都市モデルのデータ変換マニュアル**を別タブで開くなどして確認しながらお読みいただけるとよりわかりやすいと思います。


※ーこの記事の内容は 2022/8/27 時点の資料をもとに記載しております。資料が更新された場合はそちらの方をご確認ください。

## 記事の対象者
 - PLATEAUの3D都市モデルに興味がある方
 - Unityなどで3D都市モデルを使用してみたい方

## この記事でできること
 - CityGMLを他の形式に変換

## 作業環境
 - Macbook (M1 Pro)
   - macOS  Monterey 12.5 
   - メモリ:16GB

# 全体の流れ
 - FME Desktop をインストール
 - FMEのワークスペースをGitHubからダウンロード
 - 3D都市モデル(CityGML)のダウンロード
 - 変換作業



# いざ変換！

基本的には**3D都市モデルのデータ変換マニュアル**の第一章の流れに沿って変換作業を行っていきたいと思います。(CityGML　→　OBJ)



## とりあえず指示通りGitHubへ

まず初めに、「3D都市モデルのデータ変換マニュアル」1ページの目次の下に
"各項で利用するFMEのサンプルワークスペースファイル（.fmwt）は以下より入手可能である"
という記述とともにGitHubのリンクが貼ってあるので、GitHubのページに向かいます。

GitHubの"README"を読み進めていくと、"前提ソフトウェア"の欄に、"商用ソフトウェア"として[**FME Desktop**](https://www.safe.com/fme/fme-desktop/)というものがあります。
こちらのリンクをクリックすると、SAFE SOFTWARE のページに辿り着くと思います。



## FME Desktop をダウンロード

SAFE SOFTWARE　のページの上のメニューバーの"Support"から"Downloads"をクリックすると、"FME Downloads"のページに辿り着くと思います。

FME Downloadsページで、"FME Desktop"のご自身の環境に合わせたものをダウンロードしてください。

ダウンロードが完了したら、一度　"**FME Workbenchspace**"の起動を確認してください。



## FME のワークスペースをダウンロード

実際にCityGMLをOBJやFBXに変化するためのワークスペースが用意されているので、そちらの方をダウンロードしていきます。
GitHubのページに"Sample Workspace"というフォルダがあり、その中にいくつかのワークスペースファイル(.fmwt)が用意されていることがわかります。

ここから一つワークスペースをダウンロードするのですが、
**citygml2obj.fmwt**
の場合、
「"CityGML形式"から"OBJ形式"に変換する」
を意味します。
今回はマニュアルに通りに**citygml2obj.fmwt**を使用したいと思います。

では、任意のワークスペースをダンロードしてください。



## CityGMLを用意する

ここの説明は以下の記事で詳しく記載しておりますので、そちらの方を参考にCityGMLを用意してください。

https://qiita.com/betio/items/9b54251cb246c696d7bd



## いざ変換！

ここから実際に変換作業に移りたいと思うのですが、はじめの方でも述べたとおり**3D都市モデルのデータ変換マニュアル**がとても優秀でこちらで細かく説明することがない、というのが本音なのです。

しかし、それでも注意しなければならないことがいくつかあるので、そちらの方を記載していきたいと思います。



### 3D都市モデル（CityGML形式）に記述されたURLの更新を忘れないように！

こちらはGitHubのREADMEに記載されている内容ですが、注意する点があります。

READMEの記載には、名前空間と、schemaLocationで使用されているリンクが変更になったので更新しなければならないという趣旨が述べられています。

そのため、ご自身のエディターで中身を書き換える必要があります。

ここで<font color="red">**注意点**</font>なのですが、「bldg」、「dem」を使用した際は、どちらも、名前空間と、schemaLocationの一番上のリンクだけしか存在しませんでした。

そのため、名前空間、schemaLocation一番上のリンクだけを更新すれば問題ないです。(これで問題なく動きました)



### 変換するCityGMLの指定について

この話はCityGMLの仕様が関わってくるのですが、FMEのワークスペースで**LOD1**のデータを処理しようとしてもうまくいきません。正確には「処理は成功するが、ファイルが書き出されない」です。

というのも、「LOD1」はいわゆる「箱モデル」になります。そのため、あえてCityGML形式からOBJ形式に変換しなくとも、CityGMLと一緒に提供されているOBJ形式を使用すればよい、ということになります。

FMEのワークスペースでデータの変換を行う際には、「LOD2」以上のデータを扱うのが良いのかもしれません。



# おわりに

ここまでお読みいただきありがとうございます。

どこか間違いがございましたらコメント欄にご記入ください。

この記事が新たなプロダクトのお役に立てれば幸いです。
オンラインの1on1ミーティングで画面共有してまとめを一緒に作る

# まとめ作りを画面共有で

今までは1on1ミーティングのまとめを1on1の後に作っていたが、これをミーティング中にやってしまうことにした。

ミーティングの最後の15分ぐらいで画面共有して、相手と一緒にまとめを作るのだ。

具体的には、テキストの箇条書きのメモだ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/6d94fff6-ddf9-cd37-7776-b5eeec53d06d.png)

# メリット: 誤解の防止

自分の解釈が本当に合っているか確認できる。
間違った解釈やニュアンスの違いがあれば相手が指摘してくれる。

# メリット: 客観視

相手もテキストを見ながら改めて話すことで、客観的に物事を整理しやすい気がした。

# メリット: コスト削減

ミーティング後にまとめを作るのはなかなかひと手間だ。
相手と話しながら作ってしまった方がずっとやりやすい。

# メリット: フィードバックの合意

フィードバックの合意を作れる。
ミーティングの結果はボスに報告しているのだが、何を報告するかという合意を相手自身と作ることが出来る。

<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# Twitter

https://twitter.com/YumaInaura

<!-- Update From Qiita API -->
ウマ娘で学ぶポリモーフィズム（多態性）

# ポリモーフィズム（多態性）の特徴とは・・・
あるメソッドの呼び出しに対して、それぞれのオブジェクト毎に異なる動きを実現出来ること。

# ウマ娘を例にすると
”あるメソッド”は、以下HorseGirlクラスのcallメソッドとする。
```java:HorseGirl.java
package sample;

// ウマ娘クラス（抽象クラス）
public abstract class HorseGirl {
	// トレーナーを呼ぶ！
	public abstract void call();
}
```
これをもとに、各オブジェクトに異なる動きを与える。
```java:AirGroove.java
package sample;

// ウマ娘クラスを継承したエアグルーヴクラス
public class AirGroove extends HorseGirl{

	@Override
	public void call() {
		System.out.println("たわけ！");
		
	}

}
```
```java:RiceShower.java
package sample;

//ウマ娘クラスを継承したライスシャワークラス
public class RiceShower extends HorseGirl{

	@Override
	public void call() {
		System.out.println("お兄様！");
		
	}

}
```
```java:AgnesTachyon.java
package sample;

// ウマ娘クラスを継承したアグネスタキオンクラス
public class AgnesTachyon extends HorseGirl{

	@Override
	public void call() {
		System.out.println("モルモットくぅん！");
		
	}

}

```

以下、メインクラス。
```java:Main.java
package sample;

public class Main {

	public static void main(String[] args) {
		
		HorseGirl ag = new AirGroove();
		HorseGirl rs = new RiceShower();
		HorseGirl at = new AgnesTachyon();
		
		// エアグルーヴクラスの実行
		System.out.println("――エアグルーヴが呼んでるよ――");
		ag.call();
		System.out.println("");
		// ライスシャワークラスの実行
		System.out.println("――ライスシャワーが呼んでるよ――");
		rs.call();
		System.out.println("");
		// アグネスタキオンクラスの実行
		System.out.println("――アグネスタキオンが呼んでるよ――");
		at.call();
		System.out.println("");

	}

}



```
以下、出力結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287651/746ad7bd-38cd-3ba7-2441-8b4fec122e97.png)

この通り、同じcallメソッドを呼んでいるにも関わらずそれぞれのウマ娘（オブジェクト）が別の動きをすることが出来ることが分かる。

# 参考資料
https://medium-company.com/%E3%83%9D%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%95%E3%82%A3%E3%82%BA%E3%83%A0/

https://engineer-life.dev/polymorphism/

https://it-kyujin.jp/article/detail/678/
【Swift】バックグラウンドスレッドからの変更はできないらしい

# はじめに
https://qiita.com/mesummery/items/9d096162a351e2e922c5

上記のリンクを参考にインターネット接続の監視を実装してる際にViewの切り替え時に紫色警告が発生したので対処法を載せておきます。

# 実装内容
```swift
// ネットワーク監視
private func observeNetwork() {
    monitor.pathUpdateHandler = { path in
        if path.status == .satisfied {
            self.isNetwork = true // オンライン
        } else {
            self.isNetwork = false // オフライン
        }
    }
    monitor.start(queue: queue)
}
```
```swift
import SwiftUI

@main
struct TwitterSearchApp: App {
    @ObservedObject private var appViewModel = AppViewModel()
    var body: some Scene {
        WindowGroup {
            if !appViewModel.isNetwork {
                OfflineView()
            } else {
                HomeView()
            }
        }
    }
}
```

# 警告文
```
Publishing changes from background threads is not allowed; make sure to publish values from the main thread (via operators like receive(on:)) on model updates.
```
![スクリーンショット 2022-08-13 23.37.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/05fb3468-6c64-2e55-49bb-ceefeb172465.png)

DeepL翻訳によるとこんな事を言ってるらしいです。
>バックグラウンドスレッドからの変更の発行は許可されていません。モデルの更新時には、必ずメインスレッドから (receive(on:) のような演算子を使って) 値を発行するようにしてください。

# 解決方法
`DispatchQueue.main.async`で囲う事によって解決しました。
```swift
// ネットワーク監視
private func observeNetwork() {
    monitor.pathUpdateHandler = { path in
        if path.status == .satisfied {
            DispatchQueue.main.async {
                self.isNetwork = true // オンライン
            }
        } else {
            DispatchQueue.main.async {
                self.isNetwork = false // オフライン
            }
        }
    }
    monitor.start(queue: queue)
}
```

# おわり
紫色警告はレアです