OmniAICreator/Qiita-1.07M huggingface dataset:
deactivate an user でのエラー


+ [Unable to create or edit user](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000NFYwd)

:::note alert
Error: Invalid Data.Review all error messages below to correct your data. You can't access this field .
:::

:::note
The error message you are encountering suggests that there is a field level security setting that is preventing you from modifying the fields you're trying to change, even though you have the System Administrator profile. 

Here are a few things you can check to resolve the issue: 

+ Check the user's profile and see if the field level security settings for the fields you're trying to modify are set to "Read Only". If they are, change them to "Editable". 
+ Check if there are any validation rules or triggers on the User object that are preventing you from making the changes. If there are, either modify or temporarily disable them. Ensure that the Organization-Wide Default settings for the User object are set to "Grant access" for your profile. 
+ Check if there are any field-level security settings at the organization level that might be preventing you from making the changes. If there are, modify them to allow you to make the changes. 
 
 By following these steps, you should be able to resolve the issue and modify the fields you need to
:::

メセージは、システム管理者プロファイルを持っていても、変更しようとしているフィールドを変更できないフィールド レベルのセキュリティ設定があることを示唆しています。

問題を解決するために確認できることをいくつか示します。 

+ ユーザーのプロファイルを確認し、変更しようとしているフィールドのフィールド レベルのセキュリティ設定が「読み取り専用」に設定されているかどうかを確認します。ある場合は、「編集可能」に変更します。

+ ユーザーオブジェクトに、変更を妨げている検証ルールまたはトリガーがあるかどうかを確認します。ある場合は、それらを変更するか、一時的に無効にします。

+ ユーザー オブジェクトの組織全体の既定の設定が、プロファイルの [アクセスを許可する] に設定されていることを確認します。組織レベルでフィールド レベルのセキュリティ設定が変更を妨げている可能性があるかどうかを確認します。存在する場合は、それらを変更して、変更できるようにします。


これらの手順に従うことで、問題を解決し、必要なフィールドを変更できるはずです。
リアクティブというコンセプトとメッセージ駆動に関する学習ログ

# リアクティブアーキテクチャ

## はじめに

アーキテクチャについていろいろと調べているうちに、「リアクティブシステム」「メッセージ駆動」といったワードを見つけてどんなものなのかが気になったので簡単にまとめました。同じテーマで学習されている方の参考になれば幸いです。

## リアクティブ宣言

リアクティブ宣言とは、AkkaやScalaを開発しているLightbend社が「大規模で要求が高度化する昨今のソフトウェアアーキテクチャはリアクティブであるべき」という宣言で、2014年の9月から変わらずに公開されています。

https://www.reactivemanifesto.org/

![image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184849/5b464af3-8217-371a-dc51-7ba0bb48037f.png)



最終的に届けたい価値は、どんな状況でもレスポンシブ（即応性）が確保されている状態。＝「いつでも使えるシステム」の実現です。
このある種の当たり前を、伸縮性 や 耐障害性 を原理として、メッセージ駆動 で実現していくというのがコンセプトとなります。

また、即応性、伸縮性、耐障害性、メッセージ駆動を実現できれば、メンテナンス性や拡張可能性の高いシステムに繋がります。

## メッセージ駆動

リアクティブ宣言にある4つの構成要素のうち、リアクティブなシステムを構成する上で不可欠となる手段が「メッセージ駆動」です。

- 非同期・ノンブロッキングなメッセージングによってコンポーネント間の境界を確立します
    - 疎結合性、隔離性、位置透過性を確立します
    - エラーすらもメッセージとして委譲する手段を確保して耐障害性をもたらします
    - ノンブロッキングにより、メッセージの受信側はアクティブな時だけリソースを消費し、オーバーヘッドを抑制し、弾力性をもたらします
- 位置透過なメッセージングを使います
    - クラスターを跨ぐ場合も、単一のホストの中で閉じる場合も同じ構成とセマンティックで扱うことができ、耐障害性をもたらします

### AWS・GCPのメッセージングに関連するサービス

 AWSはこちらにサービスの一覧がまとまっています。
https://aws.amazon.com/jp/messaging/

GCPの Pub/Sub に関する説明はこちらで確認できます。
https://cloud.google.com/pubsub?hl=ja

身近な例だと、インフラの予算上限を監視していて上限を超えたら AWS SNS から Slack に通知を飛ばすのに活用しています。
メッセージングにより負荷を管理したり、メッセージキューによる監視や、必要に応じたバックプレッシャーを適用することでフロー制御が可能となり、弾力性をもたらしています。


## リアクティブシステム

アーキテクチャレベルでリアクティブ原則に従ったシステムがリアクティブシステムとなります。

- リアクティブ原則
    - 応答性を維持する
    - 不確実性を受け入れる
    - 失敗を受け入れる
    - 自律性を表明する
    - 一貫性を調整する
    - 時間を分離する
    - 空間を分離する
    - ダイナミクスを処理する

https://www.reactiveprinciples.org/principles/index.html

例えば、ローカルキャッシュを使用していたら、ローカルキャッシュを複数のノードと同期させる方法はないのでスケールアップが非常に難しくなり、最大のスケーラビリティと可用性（＝一貫性を調整する）を維持できないので、「RxJava等のリアクティブプログラミングでコーディングしているから」「Akkaを使っているから」といって必ずしもリアクティブシステムにはなりません。

### 上記の説明としてソフトウェアアーキテクチャ例

この記事の説明がわかりやすかったので紹介します。

[『“止まらないシステム”ではなく“回復する能力”に価値がある リアクティブシステムを実現するためのCQRSとEvent Sourcing』](https://logmi.jp/tech/articles/324766)

まず、ショッピングカートがあったとして、カートを制御するClientからショッピングカートに、アイテム追加のタスクを依頼するメッセージを送信したとします。
このとき、ショッピングカートからClientへ成功・失敗の結果を返すが、Client側はメッセージを投げた後、依頼したタスクの完了を待ちません。戻りが来るまでの間は別のタスクを行うことで、スループットを最適化していくという「非同期・ノンブッキング」の特徴を持っています。


![image2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184849/fc443720-8727-9b8f-b8ce-053b3a54daf7.jpeg)


また、メッセージに反応するかは受信側のコンポーネントの状況次第。処理する仕事がなければリソースはまったく消費しません。
ショッピングカートは状態を持っていますが、「アイテムの追加」等という仕事がなければ、CPUのリソースを食わないという「位置透過性」の特徴を持っています。



さらに、このまま構築したシステムを1つのノードにデプロイした場合、そのノードがクラッシュするとシステム全体が失われて、「リアクティブ原則：失敗を受け入れる」ことができていない状態となってしまいます。

この場合、複数のAvailability zone/リージョンにノードを分散することで、システム全体が同時にダウンする確率を下げたり、アプリケーションやサーバの負荷に応じてオートスケーリングをするなどの対応によって応答性が高い状態を維持することができます。


---

リアクティブ、メッセージ駆動についてはあまり説明されている本や日本語のコンテンツがなかったので、そもそも何？の部分を学びたく、まとめてみました。
ここまでを頭に入れた上で、今後は実際に何かを作りながら理解を深めていこうと思います。
【ネタ?】みずほのシステムとこれからの日本のクラウド化についてリプがおもろかったのでメモ

# どうなる日本のクラウド

とりあえずメモで書きます。

## 当記事の概要

事の発端はわたくしのちょっとしたつぶやき。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">＞バラバラだったのを無理やりドッキングしたせいで内部崩壊<br><br>古いシステムやデータを新しいものに移行しなかった場合必然的にそうなります。<br>多分ですが、新規開発費をケチって古いシステムを延命し続けた結果起きた必然です。<br><br>日本企業ってとにかくシステムに投資しないので・・・</p>&mdash; ゲムプレXX (@game_prayer_xx) <a href="https://twitter.com/game_prayer_xx/status/1621147034702213121?ref_src=twsrc%5Etfw">February 2, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

とゲムプレXX氏からリプをいただきました。(一応掲載許可はいただいております。)

## クラウドの独占が心配だ...(バカ)

ことあともいろいろ日本のクラウド化に関していろいろ話したのですが、私自身なんとなくお金がかかる(特にAzureとかの従量課金制の
クラウド)ので敬遠していたのですが、まぁ大手はお金持ってますからあとはひたすらエンジニアを突っ込めばどうにかなるのでしょうが、、、こんなんで本当にDXは実現するのでしょうかね

## ソース記事

https://gendai.media/articles/-/87382
JavaScript で矢印キーで移動する枠をつくってみる

JavaScript で矢印キーで移動する枠を簡単につくってみる
出来上がったやつのサンプルページのリンク、イメージはこんな感じ

https://sueasen.github.io/javascript-exercise/work/keyarrowmove/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/c9560f35-7bd3-08c5-f481-d87cdef8df82.png)

<p class="codepen" data-height="550" data-default-tab="html,result" data-slug-hash="GRXJRKN" data-user="sueasen" style="height: 550px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/sueasen/pen/GRXJRKN">
  Untitled</a> by sueasen (<a href="https://codepen.io/sueasen">@sueasen</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

- HTML 3×3 のマス用意
```html:index.html
<!doctype html>
<html>

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <link rel="stylesheet" href="./style_posmove.css">
</head>

<body>
    <div class="title">
        <p>矢印キーで移動</p>
        <p class="keyret">押したキー</p>
    </div>
    <div class="flex-row">
	    <div class="box"></div>
	    <div class="box"></div>
	    <div class="box"></div>
    </div>
    <div class="flex-row">
	    <div class="box"></div>
	    <div class="box"></div>
	    <div class="box"></div>
    </div>
    <div class="flex-row">
	    <div class="box"></div>
	    <div class="box"></div>
	    <div class="box"></div>
    </div>
</body>

<script src="script_posmove.js"></script>

</html>
```

- CSS マス設定
```css:style.css
@charset "utf-8";

.title {
  text-align:center;
  font-size: 20px;
}

.flex-row {
  display: flex;
  justify-content: center;
  height: 100px;
}
.box {
  width: 100px;
  border: 1px solid black;
  background-color: white;
}
.box-now {
  background-color: black;
}
```

- JavaScript で矢印キーの動きを設定
```javascript:script.js
// 枠クラスリスト取得
const getGridClassList = (pos) => document.querySelectorAll('.flex-row')[pos.y]?.children[pos.x]?.classList;

// 最初の枠
const now = {x: 1, y: 1};
const nowGrid = {pos: now, classList: getGridClassList(now)};
nowGrid.classList.add('box-now');

// 矢印キー
const keyArrows = {
    ArrowUp   : {y: -1, x:  0},
    ArrowDown : {y:  1, x:  0},
    ArrowLeft : {y:  0, x: -1},
    ArrowRight: {y:  0, x:  1},
};


// キーイベントで矢印キーの操作
document.querySelector('body').addEventListener('keydown', (e) => {

    console.log(e);
    document.querySelector('.keyret').textContent = e.keyCode + ':' + e.key;

    const keyArrow = keyArrows[e.key];
    if (!keyArrow) return;

    const after = {x: nowGrid.pos.x + keyArrow.x, y: nowGrid.pos.y + keyArrow.y};
    const afterGridClassList = getGridClassList(after);
    if (!afterGridClassList) return;

    nowGrid.classList.remove('box-now');
    nowGrid.pos = after;
    nowGrid.classList = afterGridClassList;
    nowGrid.classList.add('box-now');
});
```
Quick Start: Process Builder > Create a New Process on the Account Object

[Trailhead関係　個別の課題別](https://qiita.com/Keiji_otsubo/items/56eb7a90bb72138ece1f)


+ [Create a New Process on the Account Object](https://trailhead.salesforce.com/content/learn/projects/quickstart-process-builder/quickstart-process-builder1)


+ [Test Your Process](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000NFZPjSAP)

:::note alert
 The 'Contact address change' Process was not found, or it is not active. 
:::


何もせずに確認ボタンを押すと以下になります。

:::note alert
The 'Contact address change' Process was not found, or its not related to the Account object
:::

ちょっと違いますね。
しかし簡単にクリアーできました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/a15c32f0-4ce3-5d77-661b-d0e0e9c2eb87.png)
PHPのforeach文で一部だけ2次元の連想配列からキーだけを取り出す方法

# はじめに
備忘録
タイトルの通りです。
どなたかのお役に立てれば幸いです。

※追記
コメント欄にて、すっきりと書けるコードや、コードの補足情報を教えていただけました。
ぜひコメント欄の方も参照してください。
コメントしてくださった方々、ありがとうございました！


# foreach文で一部だけ2次元の連想配列からキーを取り出す
例えば、以下のような2次元の連想配列があったとします。
```php
$array = [
    "aaa" => true,
    "bbb" => "foo",
    "ccc" => [
        "ddd" => "this",
        "eee" => "is",
        "fff" => "sample",
        "ggg" => "array"
    ]
];
```
この場合は以下のように書くことで全ての次元からキーだけを取り出すことができます。
```php
$key_array = [];
foreach ($array as $key1 => $value1) {
    array_push($key_array, $key1);
    if (gettype($value1) == "array") {
        foreach ($value1 as $key2 => $value2) {
            array_push($key_array, $key2);
        }
    }
}
```
:::note info
`gettype()`は、引数の型を調べる関数です。
1回目の`foreach`で取り出した値（`$value1`）が配列だった場合のみ、もう一度`foreach`を実行することで2次元配列に対応しています。
:::

`print_r($key_array);`すると
```php
Array
(
    [0] => aaa
    [1] => bbb
    [2] => ccc
    [3] => ddd
    [4] => eee
    [5] => fff
    [6] => ggg
)
```
キーだけを取り出せたことが確認できます。
制約があるエンジニアこそアウトプットをしていくべき

アジャイル開発が主流の世の中、
アウトプットに重きを置かない開発が今のベターなのかなと肌感として感じている今日この頃です。

ただ、そんな中でも「何かしらの制約があるエンジニア」にとってはアウトプットは自分を守る上でも他のメンバーにとっても必要なんじゃないかなと個人的には思っています。

今回はその「なんで必要なの？」みたいなところを「制約があるエンジニア」の１個人の意見でつらつら書き留めていこうと思います。

# 制約のあるエンジニアとは？
本題に入る前に、この記事でいう「制約がある」とはそもそもどういうことを指すのかをご説明します。
具体的には下記のようなエンジニアを今回「制約がある」と仮定して話を進めていこうと思います。

1. 地方在住&フルリモートで開発をしている人
1. 子供がいる・介護をする必要がある・家庭があるなど自分以外の要因で開発のみに集中できない人
1. 病気などで思うような時間が取れない、とってはいけない人

きっと一定数組織に存在する人かなと思います。
この記事を書いている私も「1」「２」に当てはまる「 **制約のあるエンジニア** 」かなと思っています。
もちろん制約があるから開発に対して甘えが出ているとかではなく、正直しょうがないかなと思う部分になるので「そんなことで甘えた記事書くんじゃねえ」みたいな人は回れ右していただきたいです。

# なんで制約のあるエンジニアはアウトプットする必要があるのか

いよいよ本題です。
制約のある人ほどなんでアウトプットする必要があるのか。
実はすごい難しい話ではないかなと思っています。

「制約があるんだからアウトプットしている余裕ないんじゃない？」
「アウトプットしている余裕があったら開発少しでも進めたほうが自分のためでは？」

はい。5年前までの私の意見です（笑）
正直環境によってはいまだにこの意見は私のなかに残り続けています。

そして最近私の中で出た結論として
制約がある人がアウトプットするべき環境とそうではない環境があるなと思いました。
具体的にはこんな感じ

## アウトプットしていくべき環境
1. メンバーに「制約のある人」がいる
1. 全体的にスキルが未熟で「制約のある人」に頼ることが多い
1. クライアントの意見・仕様がコロコロ変わる
1. 組織内でプロジェクトメンバーの移動が頻発している

## アウトプットしなくてもいい環境
1. 制約のある人がいない
1. 全体的にメンバーのスキルが高く、キャッチアップ能力が高い
1. クライアントから提示された仕様が確定されていて仕様変更があまりない
1. プロジェクトの移動があまりない（基本メンバーは固定）

何が言いたいかというと「アウトプットする」行為はプロジェクト全体のためであるようで、
実は制約のある人自身のためにしていくことなんじゃないかなと思っています。

「制約がある人」って絶対何かの要因で開発に入れない時間があったり、
物理的にいけないことが多々あるなと思っていて、
そんな時に「その人しかわからないから聞く&やってもらうしかない」みたいな状況が生まれてしまうと
「制約のある人」自身またはその家族がしんどい思いするんですよね。
だからその人しかできないことを少しでも減らしてみんなでできることにするために
アウトプットって必要なんじゃないかなと思っています。

もちろんエビデンスとしても使えるし、ないよりあった方がいいことが多いのも事実ですしね。

# 結論

アウトプットは人のためじゃなくて自分のためにやろう。

以上！
Vuetifyのv-data-tableでチェックボックスがすべて選択されてはまった

# 事象
Vuetifyのv-data-tableで **show-select** プロパティを設定すると、各行を選択するチェックボックスが表示される。

デフォルトでは複数の行にチェックをつけることができるが、任意の行のチェックを入れるとすべての行にチェックがつくようになってしまった。

# show-selectの動作
チェックをつけた行はv-modelプロパティで設定した変数の行列にオブジェクトが追加される。問題が起きているとき、v-modelに設定した変数にはクリックした行のみが追加されていたが、チェックはすべての行についていた。

また最上部には全選択チェックボックスが表示されるが、これをクリックした場合も1つの行だけが変数に追加され、すべての行がチェックされた。

# 解決方法
v-data-taleの **item-key** の指定が抜けていた。

重複のない主キーを指定することで無事チェックした行だけが選択されるようになった。

# 参考
* [v-data-tables](https://vuetifyjs.com/ja/components/data-tables/)
Redmine チケットのデータ構造

Redmine チケットのデータベース上のデータ構造について調べました

# チケット関連の主なテーブル

<table>
  <tr><td style="vertical-align:bottom;background:#dce6f1;">テーブル名</td><td style="vertical-align:bottom;background:#dce6f1;">用途</td><td style="vertical-align:bottom;background:#dce6f1;">主なフィールド</td></tr>
  <tr><td style="vertical-align:bottom;">issures</td><td style="vertical-align:bottom;">チケット本体</td><td style="vertical-align:bottom;">id/tracker_id/poject_id/subject/description</td></tr>
  <tr><td style="vertical-align:bottom;">issue_statuses</td><td style="vertical-align:bottom;">チケットのステータス</td><td style="vertical-align:bottom;">id/name/is_closed/position</td></tr>
  <tr><td style="vertical-align:bottom;">trackers</td><td style="vertical-align:bottom;">トラッカーの種類</td><td style="vertical-align:bottom;">id/name/description</td></tr>
  <tr><td style="vertical-align:bottom;">journals</td><td style="vertical-align:bottom;">チケットの更新（返信）</td><td style="vertical-align:bottom;">id/user_id/notes</td></tr>
  <tr><td style="vertical-align:bottom;">journal_detail</td><td style="vertical-align:bottom;">チケットを編集した場合の編集前後の情報</td><td style="vertical-align:bottom;">id/joournal_id/old_value/value</td></tr>
  <tr><td style="vertical-align:bottom;">time_entries</td><td style="vertical-align:bottom;">チケットのコメント</td><td style="vertical-align:bottom;">id/issure_id/comments</td></tr>
  <tr><td style="vertical-align:bottom;">Versions</td><td style="vertical-align:bottom;">チケットのバージョン</td><td style="vertical-align:bottom;">id/project_id/name/sharing</td></tr>
  <tr><td style="vertical-align:bottom;">projects</td><td style="vertical-align:bottom;">プロジェクト情報</td><td style="vertical-align:bottom;">id/name/description</td></tr>
  <tr><td style="vertical-align:bottom;">projects_trackers</td><td style="vertical-align:bottom;">プロジェクトで使用るトラッカー</td><td style="vertical-align:bottom;">project_id/tracker_id</td></tr>
  <tr><td style="vertical-align:bottom;">users</td><td style="vertical-align:bottom;">ユーザー情報</td><td style="vertical-align:bottom;">id/login/password</td></tr>
  <tr><td style="vertical-align:bottom;">custom_fields</td><td style="vertical-align:bottom;">カスタムフィールドの定義</td><td style="vertical-align:bottom;">id/type/name/field_format</td></tr>
  <tr><td style="vertical-align:bottom;">custom_values</td><td style="vertical-align:bottom;">カスタムフィールドに入っている値</td><td style="vertical-align:bottom;">id/customized_type/value</td></tr>
</table>

# テーブル相関図

![DB構造_Redmine-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3114660/275828bb-32ff-a4d7-0794-8237fcc9c3ae.jpeg)
【Flutter】スマホカメラのスキャン精度について色々調査した話

・スマホカメラと専用スキャナーの精度を限りなく近づけたかった話(備忘録)

## それぞれのスキャンロジックを調査
### 1. スマホカメラ

https://shop.insatsu-net.com/knowledge-barcode-reader-etc

1. バーコードをカメラで読み取り、その画像を2色に単純化して、そこから数字を読み取る。
2. 画像のコントラスト差から数字を取り出している。


### 2. 専用スキャナー

https://www.denso-wave.com/ja/adcd/fundamental/barcode/scan/index.html

1. 白と黒のバーに光を当て、その反射光を捉え、黒白を2値のデジタル信号に置き換える事でデータを取り出す仕組み。
2. 白いところは光の反射が強く黒いところは光の反射が弱くなります。センサでこの反射光を受け取り、アナログ波形を得ます。
3. アナログ信号をA/Dコンバータでデジタル信号に変換します。(2値化)
4. 得られたデジタル信号からコード体系を判別し、データを取り出します。(デコード処理)

なるほど、、

## 結論
スマホカメラだと専用スキャナーと異なり「光を当ててその反射光を捉える」ようなことが出来ないので精度が低くなるのかな、、、
環境の明るさも影響あるから、色々対策をしないといけなそうですね。

## 最後に
iOSアプリ開発をしています。
主にSwiftですが、最近は熱が入ってきてFlutterも🦾
色々やってます。もし良かったら見てってください。

https://sogablog.net/
No.3 ビジュアル内のグラフの色を変える

## はじめに
このセッションではグラフの色を変更する方法をお伝えします。
個人的には標準で作成してくれる色合いをそのまま使っていただければと良いと考えていますが、
**・コーポレートカラーに合わせたい
・標準の色合いだと見辛い
・特定のエリアを強調したい**
などがあるとは思うので、必要に応じて変更してみてください。

## 【前提】変更対象のビジュアルを作成する
こちらは[NO.1 円グラフの追加方法](https://qiita.com/shinyasasaki/items/168e777afa9f566d33d6)のセッションを元に参考に作成してみてください

## ビジュアルの色を変更
**1．ビジュアルの書式設定を選択**
**2．円グラフの場合、「スライス」から色を選択する**
**3．各項目を任意の色に変更する**
![ezgif-1-6ff30643bf.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/dcfdbd52-1610-a2fa-c857-dd85174b6efd.gif)


若干わかり辛いのですが、ビジュアルによって書式選択で選ぶ表示（円グラフだとスライスの部分）が異なっていますので、ご注意ください。

**※横棒グラフの場合、「バー」から色を選択する**
![スクリーンショット 2023-02-03 9.24.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/b10d6053-5bc8-f710-6b1b-d62f5f966253.png)

**※縦棒グラフの場合、「列」から色を選択する**
![スクリーンショット 2023-02-03 9.25.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/792c62e2-a277-60a4-0a29-7f75846ca43f.png)

**※ツリーマップの場合、「色」から色を選択する**
![スクリーンショット 2023-02-03 9.28.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/09fd533b-4518-660c-fcca-ed5be590a2c0.png)


## ビジュアルの色変更の利用シーン
円グラグを色合いに意味を持たせてみた例を紹介します

**Before** →標準の色合い
![スクリーンショット 2023-02-03 9.21.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/52d6809c-7f36-ec52-0a98-ab71c78f4767.png)

**After** →グラフの色をカスタマイズ
![スクリーンショット 2023-02-03 9.21.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/8fb78573-5974-9a7e-8e5c-5513ff88398f.png)


上位の3支社の売上を黄色系に変えて、それ以外を黒系にしています。
パッと見、**上位3つで75％くらいを占めているのがわかる**かと思います。
タイトルにも書いていますが、**この色が一体、何を意味しているのか**？は誰が見てもわかるようにしておく事をオススメします。


こちらのセッションは以上です。
[→ Power BI サービス練習帳に戻る](https://qiita.com/shinyasasaki/items/391d50c2508794e8fcfd)
Markdownが数ファイルだけの構成でAstroを使う

## この記事の概要

Astroは[コンテンツが豊富なウェブサイトを構築するために設計されています](https://docs.astro.build/en/concepts/why-astro/#content-focused)。

しかし、自分が今回使ったのは以下の構成です。

- indexページすらMarkdown（から出力されたHTML）
- 2, 3ページで足りそう

本来想定されている使い方とは違う気もしますが、それでも構築が簡単だったので備忘録も兼ねて記事にします。

## プロジェクト構成

公式ドキュメントの[Project Structure](https://docs.astro.build/en/core-concepts/project-structure/)の内容を拝借します。

```
root/
├── public/
│   ├── robots.txt
│   ├── favicon.svg
│   └── social-image.png
├── src/
│   ├── components/
│   │   ├── Header.astro
│   │   └── Button.jsx
│   ├── layouts/
│   │   └── PostLayout.astro
│   ├── pages/
│   │   ├── posts/
│   │   │   ├── post1.md
│   │   │   ├── post2.md
│   │   │   └── post3.md
│   │   └── index.astro
│   └── styles/
│       └── global.css
├── astro.config.mjs
├── package.json
└── tsconfig.json
```

対して、今回の私の構成はこうです。

```
root/
├── public/
│   ├── assets/
│   │   └── 画像いくつか
│   ├── robots.txt
│   ├── favicon.svg
├── src/
│   ├── layouts/
│   │   └── Layout.astro
│   └── pages/
│       ├── index.md
│       └── another.md
├── astro.config.mjs
├── package.json
└── tsconfig.json
```

大きくは以下の違いがあります。

- `index.astro`を用意してすらいない
    - 機能的なトップページは不要で、いきなり記事でOKだったため
- `components/`や`styles/`ディレクトリがない
    - 記事しかないので`layout/`のstyleだけで事足りたため

## `index.astro`を作らなくても特に問題ない

`pages/index.md`の中身はこのようになっています。

```md:pages/index.md
---
layout: ../layouts/Layout.astro
title: # タイトル
description: # 説明

# 以下、本文
---
```

`layouts/Layout.astro`ではこうです。

```astro:layouts/Layout.astro
---
const { frontmatter } = Astro.props;
---

<html lang="ja">
	<head>
		<meta charset="utf-8" />
		<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
		<meta name="viewport" content="width=device-width" />
		<meta name="generator" content={Astro.generator} />
		<title>Astro</title>
	</head>
	<body>
		<header class="header">
			<h1>{frontmatter.title}</h1>
			<p class="header-description">{frontmatter.description}</p>
		</header>
		<div class="container">
			<slot />
		</div>
	</body>
</html>

<style is:global>
  /* 以下、スタイル */
</style>
```

スタイリングの都合上`h1`と説明だけは分けてレイアウトしたかったので`Astro.props`から`frontmatter`を使っていますが、他は特に何もしていません。
しかし、これで問題なくページを表示できました。

Markdown間のリンクも通常のように`[テキスト](./path)`の書式で問題なく動きます。

## 最後に

Markdownから数ページのドキュメントを生成したいだけでNext.jsやらGatsbyやらを使う若干やりすぎな気がしていましたが、Astroならアリかも？と思っています。

Astroの仕組みはそれ単体でも使えますし、Astroの上にReactでもSvelteでもVueでも好きなものを乗せられるので、好みを反映させやすい気もします。

---

最後まで読んでくださってありがとうございます！
Twitterでも情報を発信しているので、良かったらフォローお願いします！

https://twitter.com/xrxoxcxox

Devトークでのお話してくださる方も募集中です！

https://jobs.qiita.com/employers/qiita-inc/dev_talks/489
顧客分析の手順 - 分析フォーマットの適用例：行動トレンド分析 顧客解約トレンドとリレーションシップ年数 

:::note
この本書は2017年4月1日にTeradata Japanのブログに掲載された内容を、再掲載したものです。
掲載内容の正確性・完全性・信頼性・最新性を保証するものではございません。
また、修正が必要な箇所や、ご要望についてはコメントをよろしくお願いします。
:::


著者 山本 泰史 （やまもと やすし）

# 顧客分析の手順

## 第13回： 顧客解約トレンドとリレーションシップ年数
第13回： 顧客解約トレンドとリレーションシップ年数
行動トレンド分析を利用した分析例の 3回目。今回は「顧客リテンション」を目的とした分析例をご紹介します。

### 分析の前提
今回は電話会社を想定し、解約顧客を対象とした分析を実施します。既に解約してしまった顧客であるため、少なくとも当分は自社に戻ってくることはないかもしれませんが、解約顧客に特徴的なプロファイルを見つけ出すことができれば、今後の解約候補顧客を見つけ出すことが容易となり、解約を阻止する際に役立てることが可能となります。

そしてこれは電話会社を想定した分析例ですが、同様のケースは他の業界にも当てはまります。クレジットカードや物販業の場合、一定期間以上利用の無くなった顧客を休眠顧客として定義しますが、このような顧客群も同じ状況と言えます。

唯一違いがあるとすれば、電話というサービスの特徴です。特別なケースを除いて、顧客が電話会社と契約する際に、その契約先は　1社であり、複数事業者と契約することはありません。例外となるのは固定電話と携帯電話で契約事業者が異なるようなケース、そして法人等で複数回線を用いていて何らかの理由で契約先を複数にしているケースでしょうか。そして一般の消費者にとって契約先の事業者をスイッチする行為は、それなりに手間のかかる行為であり、他社がスイッチを促す際の障壁としても高くなります。

このため、顧客が自社との解約をしたという事実は非常に重いものです。もちろん止まれぬ理由で解約される顧客も常に一定数いらっしゃるとは思いますが、解約顧客が目に見えて目立つのであれば、その顧客行動は充分に分析に値するものと言えます。

### 解約トレンドの理解
図21A では、基本契約を解約した顧客群を対象に、解約時期をトレンドで、解約顧客のそれまでの契約年数区分毎に見ています。第2週から第4週にわたって、解約顧客数が減少トレンドにあるのは好ましい傾向です。もちろん 30,000名強の顧客が毎月解約しているということは年間36万名に及び、ちょっとした地方都市の人口分が解約することを意味します。従ってこれに関しても改善の余地がありますが、その数は順調に縮小してきています。


<img width="700" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2768546/1d0cc41b-5336-dc69-097f-b44c9421279c.png">


このチャートをグリッドで示したのが以下の図21B ですが、契約年数別の構成比で見ても、第2週から第4週で大きな変化はありません。強いて言えば 1年未満で解約に至る顧客が減っていないことが気になりますが、ここでそれを追求するのは割愛します。


<img width="700" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2768546/71310f4e-b3f4-76fd-1d72-8428391ed409.png">


それより、第5週で解約顧客数が増加に転じていること、そして契約年数が 5年以上の顧客において解約が増加していることが気になります。いままで電話というサービスを使っていた顧客が、突然不要になるということも考えにくいため、おそらく他社にスイッチされたと考えるのが妥当でしょう。「本当の」電話会社におけるマーケティング担当者の方であれば、筆者や読者のみなさまのように、このグラフだけで判断するのではなく、競合他社が新たに打ち出したサービス等についても詳しい情報を仕入れているはずです。従って、その情報と併せると「2009年第5週に解約した、これまでの契約年数 5年以上の顧客 = 7,366名（グリッド参照）」の理由はより明快だと思います。

いずれにしても、他社にスイッチしたという前提で想定できる理由は、長期契約者優遇／割引プログラムのような囲い込みプログラムの料金プランが、他社の新規投入プランに比べて 5年目以降で大きく見劣りしてしまうようにデザインされていることです。


### アプローチの方向性
まずは、5年以上の利用顧客が魅力的に感じる料金プランを整えることが必要になります。そして次に、5年目以上の未解約顧客をこちらの料金プランへと誘導することが求められます。どの程度魅力的であるべきかは、競合になっている他社のプランと同等程度であれば充分です。スイッチングの手間とコストを考えれば、引き分け狙いで充分だからです。また、対象となっている顧客は既に 5年以上契約関係にあり、基本的にはキャリア･ホッピングを好まないであろう顧客も想定できることからも、「当社との契約を続けて頂ける限り、損はさせない」というメッセージが打ち出せれば維持に充分です。

そして、既存の料金プランを契約している顧客に関しても、毎月契約が 5年目に突入することを考慮すべきです。これらの顧客に関しては 5年目以前のタイミング（例えば 4年半を過ぎたタイミング）で新規の料金プランへの誘導を促します。料金差を問題としていない顧客群であるかどうかを選り分けることができれば、5年目以降に解約してしまう顧客に対してさらにピンポイントにアプローチすることが可能となりますが、ここでは話をシンプルに保つため、契約期間が 4年半に達した顧客に対して、毎月誘導キャンペーンを張っていくことにします。


### 行動トレンド分析の適用分野
以上、ここまで 3回に渡って行動トレンド分析を利用した「新規顧客の獲得」、「優良顧客の育成」、「顧客リテンション」のための分析例をご紹介してきました。行動トレンド分析は、任意の期間を指定し、その期間内トレンドを、特定指標で、特定の属性に分割して把握していく分析です。

そのため、図21 の顧客数（指標）は、利用回数や通話時間、課金額等で把握することも可能ですし、同様に図21 の契約年数（属性）は、性別や年齢層のような純粋な顧客属性だけでなく、一般に指標値と目される定量的な変数を分割、集計して利用することも可能です。また、分析の対象顧客としても、任意のセグメントを利用することが可能となっています。そのため、時系列で見た変化を把握し、どのような顧客行動が増加しているか、もしくは減少しているかを見つけ出すためには適切な分析と言えます。



#### Teradata Vantageへのお問合せ
[Teradata Vantage へのお問合せ](https://www.teradata.jp/About-Us/Contact)
【WordPress】the_contentで取得する本文にカスタムフィールドの値を入れる方法

プラグインなしでSEO実装をする案件にて。

カスタム投稿＋カスタムフィールドの構築で、SEO対策として記事本文の最初の130文字をdiscriptionに入れてほしいという要望がありました。

本来なら、`th_content` から130文字抜くだけなので簡単ですが、カスタムフィールドだとそれができませんね。

なので、カスタムフィールドの値を全部取ってきて、`th_content` の中に自動で入れ込み、そこから130文字抜き出そうという実装です。

ポイントなのが、**柔軟コンテンツをループして1つのテキストにまとめる** です。

```php
// the_contentで取得する本文に、カスタムフィールドの値を含める
function set_contents($post_id) {
    if(!wp_is_post_revision($post_id) && get_post_type($post_id) === 'contents') {

        remove_action('wp_insert_post', 'set_contents');

        $contents_description = '';
        $contents_inner = get_field('contents_inner', $post_id);
        $contents_article_migration = get_field('contents_article-migration', $post_id);

        // 柔軟コンテンツをループして1つのテキストにまとめる
        if($contents_inner) {
            foreach($contents_inner as $item) {
                $post_set_type = $item['acf_fc_layout'];

                if($post_set_type === 'contents_inner_h2') {
                    $field_val = $item['contents_inner_h2_title'];
                    if($field_val) {
                        $contents_description .= $field_val;
                    }
                } elseif($post_set_type === 'contents_inner_h3') {
                    $field_val = $item['contents_inner_h3_title'];
                    if($field_val) {
                        $contents_description .= $field_val;
                    }
                } elseif($post_set_type === 'contents_inner_h4') {
                    $field_val = $item['contents_inner_h4_title'];
                    if($field_val) {
                        $contents_description .= $field_val;
                    }
                } elseif($post_set_type === 'contents_inner_h5') {
                    $field_val = $item['contents_inner_h5_title'];
                    if($field_val) {
                        $contents_description .= $field_val;
                    }
                } elseif($post_set_type === 'contents_inner_h6') {
                    $field_val = $item['contents_inner_h6_title'];
                    if($field_val) {
                        $contents_description .= $field_val;
                    }
                } elseif($post_set_type === 'contents_inner_text') {
                    $field_val = $item['contents_inner_text_text'];
                    if($field_val) {
                        $contents_description .= $field_val;
                    }
                } else {}
            }
        }

        $update_post = array(
            'ID' => $post_id,
            'post_type' => 'contents',
            'post_content' => $contents_article_migration . $contents_description,
        );

        wp_update_post($update_post);
        add_action('wp_insert_post', 'set_contents');

    }
}
add_action('wp_insert_post', 'set_contents', 10, 1);
```

こうすることで、更新ボタンを押したときに、`the_content`の中に自動でカスタムフィールドの値が全部入るようになります。
【資格合格】AWS ソリューションアーキテクト（SAA-C03）の振り返り

AWSソリューションアーキテクト（SAA-C03）に合格したので、学習方法の振り返りや受験の所感などを共有します。
また、AWS認定の有効期限は3年のため、次回受験時の備忘録としても残しておきたいと思います。
# 学習開始時点のスペック
- エンジニア歴2年半
- 普段はVue.jsやlaravelでのwebアプリケーション開発がメイン
- 実務でのAWS経験はなし
- 個人の学習で3ヶ月程度AWSに触れたことがある程度
# 受験背景
個人で作ったアプリのデプロイにAWSを使ったのですが全くうまくいかなかったことがきっかけです。

qiitaの記事やブログ記事などを参考に色々と試してみましたが、前提知識が乏しすぎたため、何が問題がかもわからず多くの時間を使ってしまいました。結果的にデプロイはできたのですが、思っていたものとは違いあまり達成感が得られなかったです。
もっときちんと理解したい、実務でも使えるようになりたいと思ったので、AWSについて体系的に学び、どうせならということで資格取得を目指しました。

勉強してからですが、思い返すとAWSが提唱するベストプラクティスを無視した大変お粗末なものでした。
（AWSアカウントで作業、セキュリティグループ・ネットワークACLは誰でもスルー、DBはpublicサブネットに置く などなど）
# 学習方法
qiitaの記事を参考にして、どのように学習を進めていくかを調べました。
- AWSの前提知識が少ない状態から合格した
- 短期間での合格を目標としていない

と言った点から「[AWS未経験者がAWS認定ソリューションアーキテクトアソシエイトに一発合格した方法](https://qiita.com/certain_qiita/items/e9c3668b9b35b41c09bd)」を参考にさせてもらいました。

学習期間は3.5ヶ月で120時間程度だと思います。
平日1~2時間程度の学習です。休日はあまりやっていないです。

## クラウドプラクティショナー
まず初めに取り組んだのが、クラウドプラクティショナーの学習でした。
そもそも、クラウドに対しての知識が曖昧だったのもあり、どうせなら着実にと思い取り組みました。
いきなりSAA試験を受ける方もいらっしゃるので、好みの問題だとは思います。個人的には少しづつステップアップしながら学習していく方が性に合っていてモチベーションも保ちやすいので受験を決めました。

学習には以下の参考書を使いました。

https://amzn.asia/d/5Gfp2gl

学習期間は3週間〜1ヶ月ほどでした。
クラウドプラクティショナーの学習をしたことで得られたこととしては、AWSの基礎的な考え方やサービスの全体像を広く浅く知れたことです。
いきなりSAAの学習を始めるよりも、ハードルが低く、とっかかりやすかったです。
- クラウド
- 設計原理
- Well-Architected フレームワーク
- セキュリティ
- 基本サービス
EC２, S3, VPC, DynamoDBなど
- コスト管理

おまけですが、受験料はアソシエイトレベルの試験よりも安い11,000円です。
合格すれば、他の認定試験で使用できる割引チケット（５０％オフ）を取得できます。
## 【SAA-C03版】これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座
https://www.udemy.com/course/aws-associate/

どの記事を見ても目にする、定番の教材かと思います。色々なところで紹介されており、udemyの評価も高かったため、セール期間中に購入しました。
### 進め方
各単元ごとに「講義」「ハンズオン」「小テスト」で構成されており、最後に「模擬試験」が用意されています。
また、講義には資料が添付されています。

私は、講義の方は資料を眺めることを中心にして、ハンズオンでの学習を優先して行いました。
資料（講義）→ハンズオン→小テスト（全然できない）
というようなサイクルです。

学習する上で実際に触るというのが一番楽しく、モチベーションも上がるためです。

1ヶ月くらいはハンズオンを中心にこちらの講座で学んでいました。

残りの1.5ヶ月程度は各回の小テストや、最後についている模擬試験を繰り返しました。
また、次に紹介するping-tでの問題演習もおすすめです。
とにかく、問題を解いて、復習を繰り返して知識の定着を試みました。
## ping-t
https://mondai.ping-t.com/g#content-large_category_2

SAA-C03の問題集が公開されてたので使用しました。（しかも無料！）
序盤400問は各サービスについての一問一答形式なので、完璧にする必要はないと感じました。
SAAの問題には一問一答のような問題は出ないので、試験の対策としては不十分です。

ただし、各サービスの知識についての確認をするのには良いとは思います。
また、一問一答形式での学習が好きな方は取り組んでも良いと思います。

実際にSAAの対策となる問題は「Well-Architected Frameworkに基づいた設計」という分野が用意されているので、こちらを利用しましょう。

## AWS認定資格 ソリューションアーキテクトアソシエイトの教科書: 合格へ導く虎の巻
https://amzn.asia/d/jfVyqpv

こちらkindleのみではありますが、無料で読むことができました。
理解の浅いサービスや、細かいサービスについて補完するため、辞書的な形で使っていました。
SAA-C03に対応しているのも良いポイントかと思います。

# 試験について
## 問題の難易度
udemyの模擬試験とping-tの「Well-Architected Frameworkに基づいた設計」と比べたいと思います。
まずは単純な難易度です。
udemy > 本番 > ping-t

次に問題文の長さです。
本番 > udemy > ping-t

udemyの模擬試験では細かいサービスが問題に出ることもあり、難しかった感覚です。
それに比べると、本番の問題は知らないサービスや表現に戸惑うことはありませんでした。しかし、問題文・設問文が長く何を聞かれているのか理解するのに時間がかかりました。65問もあると、徐々に集中力を削がれていきます。
そのため、出題傾向を整理して、問題にどのようにアプローチするのかを考えるのは重要になるかと思います。

# 所感
とにかく難しかったです。また、覚えることが多いのも大変でした。
しかも、ただ覚えるだけでは問題を解くことができないのもこの試験の難しいところだと思います。

試験の学習を通して、各サービスのおおまかな特徴は捉えることができるようになったとは思います。
しかし、実際に開発、運用していくイメージが湧いていないです。
今は、AWSについて知ってるけど使えない状態になってしまっているので、今後は簡単なアプリケーションの開発をして、AWSに触る機会を増やしていこうと思います。
SpringBoot備忘録

# はじめに
たまに使用するコマンドとか忘れがちなので記録します。

# SpringBoot起動

```bash
# maven
mvn spring-boot:run -Dspring-boot.run.profiles=dev,local -Dspring-boot.run.arguments=パラメータ

# gradle
gradle bootRun -Pprofiles=dev --args='パラメータ'
```
C#でDataverseのテーブルのビューを更新してみた

# はじめに
PowerAppsのモデル駆動の設定が面倒なのでC#からDataverseを操作してみたくなった。
今回はdataverseにテーブルに定義されているビューを更新するC#コードを実行してみる。

# 前提
参照ライブラリやCreateCrmService関数の中身は以前の以下の記事を参考に

C#でDataverseに接続してテーブル一覧を表示してみた
https://qiita.com/akihiroe_/items/2db8e2634d7962ef0df7

# 注意
以下のコードはdataverse上のシステムが管理しているテーブルのデータを直接変更しています。予期せぬ副作用が発生する可能性があるかもしれませんので、留意お願いします。

# コード
dataverseのテーブルのビューの情報はSavedQueryテーブルに格納されています。そして、このテーブルの属性のLayoutXmlにビューのレイアウトが、FetchXmlに検索条件が格納されています。それらを更新することでビューを更新できそうです。
以下のコードではレイアウトにID列を追加、検索条件に更新日が最新7日間の条件を追加しています。

```C#
var organizationService = CreateCrmService(user, password, url);

var tableName = "savedquery";
var id = Guid.Parse("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx");
var columns = new string [] { "name", "layoutxml", "fetchxml"};
var entity = organizationService.Retrieve(tableName, id, new ColumnSet(columns));

var layoutxml = XDocument.Parse((string)entity.Attributes["layoutxml"]);
var fetchxml = XDocument.Parse((string)entity.Attributes["fetchxml"]);

Console.WriteLine(layoutxml);
Console.WriteLine(fetchxml);

layoutxml.Descendants("row").First().AddFirst(
    new XElement("cell",
        new XAttribute("name", "test_table1id"),
        new XAttribute("width", 300)
        ));

fetchxml.Descendants("filter").First().Add(
    new XElement("condition",
        new XAttribute("attribute", "modifiedon"),
        new XAttribute("operator", "last-seven-days")
        ));

entity.Attributes["layoutxml"] = layoutxml.ToString();
entity.Attributes["fetchxml"] = fetchxml.ToString();
organizationService.Update(entity);
```
*idは該当ビューのデザイナーをWeb画面で表示したURLのview/以降のGUIDを指定する
https://make.powerapps.com/.../view/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx?...

# ビューのレイアウトXMLのサンプル
以下はテーブルを作成すると自動的に作成されるアクティブなXXXXのビューのレイアウトのXMLです。名前と作成日の２つの列がありそれぞれに幅が指定されているようです。
```xml
<grid name="resultset" object="10627" jump="test_name" select="1" icon="1" preview="1">
  <row name="result" id="test_table1id">
    <cell name="test_name" width="300" />
    <cell name="createdon" width="125" />
  </row>
</grid>
```

# ビューの検索条件XMLのサンプル
以下はテーブルを作成すると自動的に作成されるアクティブなXXXXのビューの検索条件のXMLです。statecodeが0のレコードで、名前の昇順で表示されるようです。
```xml
<fetch version="1.0" mapping="logical">
  <entity name="test_table1">
    <attribute name="test_table1id" />
    <attribute name="test_name" />
    <attribute name="createdon" />
    <order attribute="test_name" descending="false" />
    <filter type="and">
      <condition attribute="statecode" operator="eq" value="0" />
    </filter>
  </entity>
</fetch>
```

# おわりに
ビューの定義はdataverseのレコードとして保存されているのでこのデータを操作することでビューのレイアウトや表示するデータの条件を指定できそうです。これで複数のビューの一括変更とかできそうですね。:smiley:

# 参照情報
https://learn.microsoft.com/ja-jp/power-apps/developer/data-platform/reference/entities/savedquery
Databricksノートブックで変数エクスプローラがサポートされます

こちらのリリースです。RStudioなどでは重宝していたので、個人的にも嬉しいです。

**Variable explorer in Databricks notebooks**

https://docs.databricks.com/release-notes/product/2023/february.html#variable-explorer-in-databricks-notebooks

# 要件

Databricksランタイム12.1以降が必要です。

# 画面構成

画面右のメニューに![](https://docs.databricks.com/_images/variable-explorer-icon.png)が表示されるようになります。
![Screenshot 2023-02-03 at 6.55.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c30bafa3-71bf-1318-572b-9059d012df61.png)

コードを実行し、変数が生成された状態で![](https://docs.databricks.com/_images/variable-explorer-icon.png)をクリックして、変数エクスプローラを展開することで、変数の中身を確認することができるようになります。
![Screenshot 2023-02-03 at 6.58.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c4d2226d-45fd-f6c8-e3f8-b32c5c3d73b6.png)

値、データ型、形状が表示されます。なお、PySparkデータフレームに関しては、形状の計算に計算リソースを必要とするので、行数は`?`と表示されます。

マニュアルはこちらです。

https://docs.databricks.com/notebooks/notebooks-code.html#variable-explorer-1
DBのデータを自在に扱うSQLを知ろう！

未経験からエンジニアになりたい人は、プログラミングから始める人が多いと思いますが、
エンジニアの仕事は、プログラミングだけではありません。そして、プログラミングだけでは、エンジニアになれません。同時にプログラミングが苦手でも、システム構成や開発の流れを理解するとエンジニアに近づきます！
今回はDBのデータを操るSQLについて更に詳しく調べてみましょう！
![インスタスライド_202301221.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/69a3f121-b9dc-26b5-7335-0db983e3ed66.gif)


# SQLについて
SQL(Structured Query Language) とはデータベース操作言語。
ANSIやJISで標準化されている

・DDL（Data Definition Language : データ定義言語）
・DML(Data Manipulation Language : データ操作言語）

がある。

# DDLとは
DDLは、Create Database文や Create Table文を指し、DBMSへの定義関連を行うための言語
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/affb80ec-1f6e-62fc-1839-7fd00c5983c1.png)

# DMLとは
DMLは、Select, Update, Insert, Delete 等のデータを操作するための言語
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/3c54b0b7-cf79-9962-9c63-f5e4b64bc105.png)

# まとめ
ーSQL(Structured Query Language)はデータベース操作言語

ーDDLはデータ定義言語

ーDMLはデータ操作言語

ーANSIやJISで標準化されているのでどのデータベースでも基本共通

# 最後に
未経験の皆さん、若手エンジニアの皆さん、勉強方法について悩みがあればなんでも気軽に質問して下さい！
これからも記事を書いていきますので、モチベーションアップのためフォロー、イイねお願いします。
QwikでGET以外のmethodにredirectする

通常Qwikでredirectするには以下のように`redirect`を使います。

```ts
export const onGet = ({redirect}) => {
  redirect(302, "/path");
}
```

しかし状況によってはリダイレクト先の`onPost`を呼びたい場合などがあり、そういうケースはサポートされていません。

ということで、methodを書き換えるために以下のような Viteプラグインを使うことができます。

```ts
import type { Plugin, ViteServer } from 'vite';

const METHODS = [
  'GET', 'HEAD', 'POST', 'PUT', 'DELETE',
  'CONNECT', 'OPTIONS', 'TRACE', 'PATCH',
];
const PATTERN = new RegExp(`[?&]__method=(${METHODS.join('|')})$`);

const methodRewrite = (req, res, next) => {
  if (req.method == 'GET') {
    const match = req.url.match(PATTERN);
    if (match) req.method = match[1];
  }
  next();
};

export default function ():Plugin {
  return {
    configureServer(server: ViteServer) {
      server.middlewares.use(methodRewrite);
      qwikCity.configureServer(server);
    },
  };
}
```

これを `vite.config.ts`から以下のようにpluginします。

```ts
import methodRewrite from './method-rewrite';

export default defineConfig(() => {
  return {
    plugins: [methodRewrite(),qwikCity(), qwikVite(), tsconfigPaths()],
```

~~普通にプラグインを追加すると`qwikCity`へのリクエストを横取りできないのでラップする感じにしています。~~ ([この修正](https://github.com/BuilderIO/qwik/commit/0dd3a8244eaff9b45c2ad0cb60826cfb43bcb733)で直ったようです)
これを使用すると、例えば`POST`へのリダイレクトは以下のように書けます。

```ts
export const onGet = ({redirect}) => {
  redirect(302, "/path?__method=POST");
}
```

queryの末尾に `__method={METHOD}` をくっつければokです
HTML5アワードで技術賞を受賞しました

# HTML5アワードとは
HTML5アワードとは、専門学校生のみ応募可能で、HTMLを使用されている作品であればどのようなテーマでも提出できるコンテストです。
開催は主にアシアル株式会社が行っているようです。
https://html5award.com/

私たちの作品
https://warm-puppy-2c306b.netlify.app/

# 作品提出
このコンテストに提出する方法を説明します。
提出方法はGoogleフォームへの入力です。
このGoogleフォームに必要な項目の中で特に大事な項目は以下の通りです。

・３分間以内のプレゼン動画
・作品URL(デプロイできていれば)
・チーム名

コンテストに提出するプレゼン動画は3分以内に収めなければ原点対象になります。動画はYoutube等にアップロードし、動画のURLをフォームに入力します。
作品URLはデプロイしている場合必ず記入しましょう。私たちが作った作品は審査期間にアカウントが増えていたので、必ず動かしていただけます。
チーム名が重要な理由は、もし受賞したときに賞状に記載されるのがここで入力したチーム名だからです。去年個人で参加して受賞した際、個人参加だったためきゅうりというチーム名にしていたら、個人でも賞状に「きゅうり」と記載されてしまいました笑

# 主な賞
賞は下記の通り、大きく4つの種類があります。

最優秀賞にあたる「グランプリ賞」
優秀賞にあたる「技術賞・デザイン賞・アイディア賞・実用賞」
参画企業が用意していただいている「企業賞」
努力賞などにあたる「入選」

今年受賞した技術賞は副賞があるかどうかはまだわかりませんが、去年は企業賞のアシアル賞を受賞し、アシアル株式会社はMonacaというサービスを運営していることから、最中が届きました笑

入選以外はそれぞれ受賞にあたる着眼点が分かる賞になっています。
技術賞・デザイン賞・アイディア賞は名前のままで、実用賞はアプリストアにリリースしており、ユーザーに使われている作品だと受賞しやすいようです。
企業賞は、その企業の特徴と一致する作品が受賞しやすいです。
たとえばSEGAのぷよぷよプログラミング賞はゲーム関連の作品が受賞しやすいです。

# 個人的なポイント
賞を狙う際に意識するべきポイントは以下の3つだと思います。

・提出する作品がどの賞を狙っているかを考え、その賞のテーマに沿うプレゼンにする
・プレゼンは、一般人が見るわけではないので技術的なアピールは多めで大丈夫
・プレゼンは、できること、機能の説明ではなく、この作品を使うことによって何のメリットがあるのか、使用者はどのような体験ができるのか、この作品の特徴はなにかを伝えるといい

# 最後に
専門学生であればチャレンジして損はないコンテストだと思います。
受賞することでインターンや就活で有利になることは間違いないです。
また、このコンテストは、過去に受賞したことがない作品であれば、別のハッカソン等に出していても提出可能です。
ですので、昔作ったやつをブラッシュアップして出すのもいいと思います。
賞の数も多いのでぜひみなさんチャレンジしてみましょう！
ではこの辺で！
React、npm run devコマンド実行時のエラー解決

Reactプロジェクトで
```
npm run dev
```
コマンドを実行した際に、
下記エラー
```

プロジェクト名

sh: vite: command not found
npm ERR! code ELIFECYCLE
npm ERR! syscall spawn
npm ERR! file sh
npm ERR! errno ENOENT
npm ERR! react-output-router-ts@0.0.0 dev: `vite`
npm ERR! spawn ENOENT
npm ERR! 
npm ERR! Failed at the react-output-router-ts@0.0.0 dev script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
npm WARN Local package.json exists, but node_modules missing, did you mean to install?

```

が表示されたので解決策コマンドを記述します。


結論npmとmodulesの依存関係のエラーなので、
```
//時々バグがあるのでnpmを更新
npm install -g npm@latest
//既存のモジュールを削除
rm -rf node_modules
//プロジェクトの依存関係を再インストール
npm install
```

コマンドを実行で解決します！！
【Rails】render.comを使ってデプロイする

# 概要
- render.comを使用して、アプリケーションをデプロイする
- 無料プランを利用＆クレジットカードの登録は行ない

# 開発環境
- OS：MacOS（m1チップ）
- 言語：ruby　3.1.2
- フレームワーク：Ruby on Rails7.0.2
- DB：PostgreSQL（←要注意：詳細後述）
- Docker等のコンテナは使わず、PCのローカル環境に構築

# 本番環境（production環境）を用意する
```ruby:Gemfile
group :production do
  gem "pg"
end
```
ここで注意が必要
`gem "pg"`はPostgreSQLを使用するために導入（筆者はsqliteを使用していた）
render.comはデータベースをPostgreSQLしかサポートしていないため、
MySQLやSQLite等を使用している場合は、本番環境のデータベースのみPostgreSQLnに変更する必要がある

### gemをインストールする
```
bundle install
```
# render.yamlの作成
以下を参考に作成してみてください
```ruby:render.yaml
databases:
  - name: lunch_bot_production
    databaseName: lunch_bot_production
    user: lunch_bot
    region: singapore
    plan: free

services:
  - type: web
    name: lunch_bot_production
    env: ruby
    region: singapore
    plan: free
    buildCommand: "./bin/render-build.sh"
    startCommand: "bundle exec puma -C config/puma.rb"
    envVars:
      - key: DATABASE_URL
        fromDatabase:
          name: lunch_bot_production
          property: connectionString
      - key: RAILS_MASTER_KEY
        sync: false
```
:::note warn
regionはsingaporeを指定します（日本から一番近い拠点）
:::

:::note alert
databaseとserviceどちらにも`plan:free`を必ず指定してください。
:::

# render.comの設定を進める
### render.comのアカウントを作成する
- [render.com](https://render.com/)の公式ページからアカウントの作成を行なってください。
### 公式のドキュメントに沿って進めていく
- [公式ドキュメント](https://render.com/docs/deploy-rails#update-your-app-for-render)の通りに進めれば問題ありません。
※今回はRuby on Railsで作ったアプリのデプロイです。様々なフレームワークに対応した公式ドキュメントが用意されているようですので、開発環境に合わせて読み替えてください。

# デプロイを確認する
- デプロイボタン押下に生成されたURLをクリックしてデプロイされているか確認してください。
- freeプランの場合、デプロイおよびURLをクリックした後の表示に少々時間がかかります（約3分）

# まとめ
- 公式のドキュメントに沿って進めていけば簡単にデプロイができた
- 無料＆クレジットカードの登録を行いたくない場合は、`render.yml`にplanを明示する
【メモ】AWS SAA-C03におけるメモ

# 初めに
SAAの勉強中なのですが、単にとある問題集の復習として
備忘録やメモを取るための記事になります。

何か間違えなどあれば教えていただけると幸いです。
# メモ一覧
### ■Transfer Accelerationとは？
クライアントとS3バケットの間で長距離に渡るファイルの転送を
高速で簡単に、その上安全に行えることが可能！


### ■マルチパートアップロードとは？
大容量のオブジェクトをいくつかに分けてアップロード可能
既存オブジェクトのコピーを作成できる


### ■マルチAZについての注意点
セカンダリーDBは別AZは可能だが、別リージョンは不可能
またリードレプリカは別AZやリージョンに生成可能

リードレプリカを利用したフェイルオーバー構成は
RDSではないが、Auroraであれば可能


### ■マウントターゲット
VPC内のEFSにアクセスするには、マウントターゲットが必要。
・AZごとに1つのマウントターゲットを作成できる
・VPCのAZに複数のサブネットがある場合、それらのサブネットの1つのみに
　マウントターゲットを作成できる。
・AZ内のEC2は1つのマウントターゲットを共有可能。

### ■ユーザ数の増加に柔軟に対応する方法
・AutoScaling
・Route53 にルーティングポリシーを作成し、加重ルーティングを
　使用することで、複数のリソースを単一のDNS名に関連づけることが可能。

### ■DNSレコード
例えばCNAMEはドメインの別名を定義するが、これはRDSの
自動フェイルオーバーをルーティングする際に切り替わったりする。

・TXT→ホスト名に関連づけるテキスト情報
・MX→対象ドメイン宛のメール配送先ホスト名を定義
・Aレコード→FQDNとサーバーを識別するグローバルIPアドレスの関連づけを定義する
・DNAME→別のドメインに対してDNS名の部分木全体をマッピングする機能を提供

### ■Elastic IPの特徴
・固定化したIPアドレス
・パブリックIPはEC2インスタンスが開始するたびに
　別のIPアドレスに変わる。

・EIPは外部からのアクセスを受けるために利用する
 ex. NATゲートウェイなど。。
※仮にEC2で障害が発生しても、新しく用意したEC2へ「EIP」を付け治せるメリットがある。

・連携先のシステムでIP制限を掛けている場合、こちらからアクセスする際のIPアドレスを固定しておく必要あり。
　NATゲートウェイに「EIP」を割り当てることで実現可能です。

### ■プレイスメントグループとは？
単一のAZ内のインスタンスの論理的なグループ

以下ののメリットがあるアプリに推奨される
・ネットワークの待ち時間 が短い、
・ネットワークのスループットが高い
・両方

### ■[Cloud Front]不明単語
・エッジロケーション：
クライアントに対する高速配信を可能にする
・地域制限(地理的ブロッキング)：
CloudFrontウェブディストリビューションを通じて配信しているコンテンツに
ついて特定地域のユーザによるアクセスを回避できる

### ■[Amazon S3] APIの高レベルセキュリティリクエスト
API認証情報を利用しない方式が可能。
認証情報を利用するとどうしても漏洩リスクが存在してしまうため。。

方法は、認証情報の代わりにIAMロールを使用して
APIリクエストを作成するためのアクセス許可を委任できる。

### ■[SQS]クラッシュした場合のメッセージ
クラッシュやエラーの場合、メッセージはキューに残ることに注意

他のコンシューマーが同じメッセージを再処理しないように
SQSは可視性タイムアウトを設定する。
設定した時間内は、他のコンシューマーが同じメッセージを受信したりすることは
なくなる。。

デフォルトで設定時間は30秒。
Min0s max 12h

### ■EC2インスタンスを特定のS3にのみにアクセスを制限する方法
基本はIAMロールを利用して、S3バケットへの特定のアクセスを必要とする
EC2インスタンスにアクセス権限を付与する。

バケットポリシーでも可能だが、特定ユーザ単位でのアクセス制御を
主としてる場合、特定IPのEC2からのアクセス制御はIAMロールのがベター


### ■AmazonS3 CORSとは？
結論から言うと、外部サイトからの通信アクセスを制御するための機能。
デフォルトでは、外部からのアクセスはブロックされる。。

また他ドメインへのリクエスト(HTTP)もできない。
例えばフロントエンドエンジニアがWebページを作成した際
「同一生成元ポリシー」によって生成したドメイン以外への
リクエストは不可能。

しかしデータを共有するためには、同一生成元ポリシーを無視することが
必要。。

そこでCORSの出番！
S3に対するクロスオリジンアクセスを選択的に許可できる。
実装も容易だと言われている。。

### ■ヘルスチェックの種類
・HTTPヘルスチェック：
アプリケーション層で稼働状況を確認する方法。
Webサーバ上で稼働するアプリにHTTPリクエストを送信し、
正常応答なら稼働と判断する

・UDP/TCPヘルスチェック：
トランスポート層で稼働状況を確認する方法。
リクエストがTCP or UDPになること以外は
HTTPヘルスチェックと同様。

### ■VPCのDNS設定
DNS hostnamesオプションが無効の場合、
サブネットで起動されたインスタンスはDNS名を取得できない。。

その場合、VPC構成を変更して有効化をする。
【Git】push時に生じる error:refspec src ... does not match any とは何なのか？

# 結論
* pushしようとしているブランチがリモートのどのブランチに対応するのか未知なのが原因。
* ``` git push <remote> <local-branch>:<remote-branch> ``` のように対応関係を指定することで解消できる。
    * もちろん、上記の問題を解消できるならほかの方法でも問題ない。

# 背景
* リモートリポジトリをcloneし、新たにbranchを作成後、再びリモートにpushしようとすると ``` error:refspec src <新しく作成したローカルブランチ名> does not match any ``` というエラーが発生してしまった。

# 原因
エラーメッセージを読むと、どうやら **refspec** なるものが原因のようだったので調べてみる。
Pro Git [10.5 Gitの内側 - Refspec](https://git-scm.com/book/ja/v2/Git%E3%81%AE%E5%86%85%E5%81%B4-Refspec) に記載があったので、一部引用する。
> Suppose you were following along with the last couple sections and had created a small local Git repository, and now wanted to add a remote to it
>(筆者訳:こんな感じでリモートに追加したいとします：)
>```bash 
>$ git remote add origin https://github.com/schacon/simplegit-progit
>```
>Running the command above adds a section to your repository’s .git/config file, specifying the name of the remote (origin), the URL of the remote repository, and the refspec to be used for fetching:
>(筆者訳:上のコマンド打つと、fetchに使うリモートの名前とURL、それに **refspec** が.git/configに追加されます：)
>```.git/config
>[remote "origin"]
>    url = https://github.com/schacon/simplegit-progit
>	 fetch = +refs/heads/*:refs/remotes/origin/*
>```
>The format of the refspec is, first, an optional +, followed by <src>:<dst>, where <src> is the pattern for references on the remote side and <dst> is where those references will be tracked locally. The + tells Git to update the reference even if it isn’t a fast-forward.
>(筆者訳: **refspec** は + のあとに \<src>:\<dst> が続く、という書式になっています。\<src>はリモートのリファレンスを、\<dst>はそれを追跡するローカルのリファレンスを示しています。+ はfast-forwardでなくてもリファレンスを更新することを意味しています。)

（リファレンスというワードが出てきたが、これはGit内のオブジェクトを示すハッシュの別名のようなものらしい。[10.3 Gitの内側 - Gitの参照](https://git-scm.com/book/ja/v2/Git%E3%81%AE%E5%86%85%E5%81%B4-Git%E3%81%AE%E5%8F%82%E7%85%A7)）

以上のことを踏まえると、**refspec** とは、**リモートのオブジェクトとローカルを結びつける対応表のようなもの** と思っておけばよさそうだ。

上の例ではfetchの場合のrefspecだったが、pushの場合のrefspecも同様に定義できる。pushのときはfetchのときと逆で、**\<src>はローカルオブジェクトの参照を、\<dst>はリモートオブジェクトの所在**を示す。

ここまでの内容を踏まえて最初のエラーメッセージを振り返ってみると、
```bash
error:refspec src <新しく作成したローカルブランチ名> does not match any
```
「ローカルオブジェクト<新しく作成したローカルブランチ名>に対応するrefspecがありません」という意味であることがわかる。

エラーメッセージを検索してこのページにたどり着いた方は、（筆者と同じように）新しく作成したブランチで最初のpushをしようとしてエラーが発生したのではないだろうか？Pro Gitで記載があったように、refspecはpushやfetchしたときにconfigに追記されるが、新規に作成したブランチではrefspecがないので、このようなエラーが発生するようだ。


# 対処法
push時のrefspecを作ればいい。
Pro Gitのように.git/config に記載してもよいが、push時に手動で指定することもできる。
```bash
$ git push <remote> <local-branch>:<remote-branch>
```
\<local-branch>:\<remote-branch> となっている部分がrefspec。

# まとめ
* refspecとはリモートとローカルのオブジェクトを対応付けているしくみのこと。
* 表記のエラーは、refspecが指定されていないことによるエラー。
* .git/configに記載するか、push時にrefspecを指定することで解消できる。
Cesium Z軸0の円サンプル

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3077774/2d4164c9-1024-7d80-373f-5ee1050d6cb0.png)


```
const viewer = new Cesium.Viewer("cesiumContainer");
const entities = viewer.entities;
const scene = viewer.scene;
const globe = scene.globe;
/*
  globe.showGroundAtmosphere = false;
  globe.baseColor = Cesium.Color.TRANSPARENT;
  globe.translucency.enabled = true;
  globe.undergroundColor = undefined;
const baseLayer = viewer.scene.imageryLayers.get(0);
  baseLayer.colorToAlpha = new Cesium.Color(0.0, 0.016, 0.059);
  baseLayer.colorToAlphaThreshold = 0.2;
*/

// X,Yの円 (x−a)2+(y−b)2=r2
// 中心緯度経度 36,135,
// 半径300,000 m
let Hankei = 300000;
let Ido = 90.0;
let Keido = 135.0;

let centerXYZ = new Cesium.Cartesian3.fromDegrees(Keido, Ido);

// 中心ポイント
const centerPoint = viewer.entities.add({
  position: Cesium.Cartesian3.fromDegrees(Keido, Ido),
  ellipsoid: {
    radii: new Cesium.Cartesian3(10000.0, 10000.0, 10000.0),
    material: Cesium.Color.RED,
  },
});

console.log("center:"+centerXYZ);

let line_XY = [];

for( let theta = 0; theta <= 360; theta+= 40 ){
  
  let radi = theta * (Math.PI / 180)
  let X = centerXYZ.x + Hankei * Math.cos(radi);
  let Y = centerXYZ.y + Hankei * Math.sin(radi);

  line_XY.push(new Cesium.Cartesian3.fromElements(X, Y, centerXYZ.z));

  
  let point =  viewer.entities.add({
    position: Cesium.Cartesian3.fromElements(X, Y, centerXYZ.z),
    ellipsoid: {
      radii: new Cesium.Cartesian3(10000.0, 10000.0, 10000.0),
      material: Cesium.Color.YELLOW,
    },
  });
}

let line_Z_0 =  viewer.entities.add({
    polyline: {
      positions: line_XY,
     }
  });

viewer.zoomTo(viewer.entities);
```
pythonの内包表記について

## はじめに
内包表記は、Pythonでリスト等を作成するための短い構文です。

## pythonの内包表記
通常のfor文を使用した以下のプログラムがあるとします。
```python
numbers = [1, 2, 3, 4, 5]
doubled_numbers = []
for n in numbers:
    doubled_numbers.append(n * 2)
```

このプログラムを内包表記で表現すると以下のようになります。
```python
numbers = [1, 2, 3, 4, 5]
doubled_numbers = [n * 2 for n in numbers]
print(doubled_numbers) 
```
 print(doubled_numbers) の出力結果は
[2, 4, 6, 8, 10]となります。


また、リスト内の数字が偶数かどうかを確認し、偶数だけを含むリストを作成することもできます。
```python
numbers = [1, 2, 3, 4, 5]
even_numbers = [n for n in numbers if n % 2 == 0]
print(even_numbers)
```
print(even_numbers) の出力結果は
[2, 4]となります。

# まとめ
for文を使うと少し長めですが、内包表記にすると1行で済んでスッキリしますね。
ですが、全てを内包表記でいいかと言われればそんな事もなく、むしろ分かりにくいと言われることもあります。
適材適所で使っていきましょう。
【UE4 , UE5】BPの関数にEventをBindする

# 0. 最初
こんにちは、皆さんはペペロンチーノ食べていらっしゃいますか？
今回はタイトルにある通り「BPの関数にEventをBindする」方法を記載します

# 1. 問題
クラス名をしている場所で「Delegate」と入力しても
Enumが出るだけで表示されません
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1918199/de29af26-5c58-5e72-eae4-b0aaefdaf810.png)

# 2. 解決
解決方として
イベント ディスパッチャーのBindのピンを繋げると
関数に引数としてDelegateがBindできるみたいです
![無題の動画-‐-Clipchampで作成.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1918199/255f673e-d16c-4eb1-d605-74a85162a52a.gif)

# 3. 締め
関数にDelegateで関数を渡す際にディスパッチャーを使用するなら
イベントディスパッチャーを直接使えばいいのでは？と思った人もいるはずです
私もそう思いました

BPを書く際はなるべく複雑にならない書き方をしたいですね
[Davinci Resolve]音声と動画がリンクされない

## はじめに

ダビンチリゾルブのエディットを使って動画編集していたら、突然ビデオとオーディオがリンクしなくなったので対処法をメモ。


## 使用バージョン

Davinci Resolve 18


## 事象

ダビンチリゾルブで動画と音声をリンク🔗している時に
ビデオとオーディオを同時に選択して消去してもズレが生じる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667288/303b0db0-ee64-e6f3-6108-f8ab5ce4b713.png)


## 解決方法

オーディオの「自動トラック選択」を有効にする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667288/98fba131-4d65-3ccf-3066-b61d1ba4b550.png)


## 備考

自動トラック選択を有効にしても解消されない場合は、以下を確認する。

- マスター設定とタイムラインのフレームレートが一致しているか？

- ビデオーとオーディオのリンク🔗が有効になっているか？以下のボタンを押す or ビデオ上で右クリックして「クリップをリンク」を有効にする

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667288/2ea8b31d-5ec5-373c-924e-7daa4b9c1e5c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667288/8d9d8a9a-4324-1781-4208-97e9eaa8920c.png)