OmniAICreator/Qiita-1.07M huggingface dataset:
合格のための情報処理安全確保支援士試験対策 情報セキュリティ実践技術編


# 1.セキュリティプロトコル

### TLSのセキュリティ機能
①証明書による認証・・証明書のデジタル署名を確認することで、通信相手を認証。証明書の改竄を検知し、証明書に記載されているFQDNが正しいかどうか検証する。
②鍵交換・・TLSレコードプロトコルの共通鍵暗号方式による通信で使用するセッション鍵を生成する元となる情報を公開鍵暗号方式で交換し、共有する。
③暗号化通信・・鍵交換で取得したセッション鍵を用いて共通鍵暗号方式での暗号化通信を行う。

### TLSの利用
TLSを利用する場合、公開鍵と秘密鍵のキーペアを作成し、公開鍵を認証局に提出して証明書を作成するため、利用には証明書と秘密鍵のペアが必要となる。

### SSL/TLSアクセラレータ
SSL/TLS専用のハードウェア。サーバ負荷の軽減を図れる。

### 常時SSL/TLS
Webサイトにおいて、すべてのWebページをTLSで保護するように設定を行うこと。

### IPsec
ネットワーク層のプロトコル。通信を行うときに仮想的な通信路であるSAを生成し、その中で通信を行う。SAには以下の二種類がある。

#### 1.IKE SA・・・制御用のSA。通信に先立ち、データ交換を安全に行うために暗号化プロトコルや暗号鍵などの情報をやり取りする。
#### 2.IPsec SA・・通信データを送るためのSA。上り用と下り用でそれぞれ別のSAを生成。IPアドレスやポート番号、プロトコルが異なると別々のSAを生成する。

### IKE
共通鍵を安全に共有するためのプロトコル。IKE SAを確立し安全な通信に必要となる情報を交換するフェーズ1と、IPsec SAを確立し安全な通信路を生成するフェーズ2がある。フェーズ1で行われる処理の内容は以下。

1.パラメータの交換・・暗号化アルゴリズム、認証アルゴリズムなどのパラメータを交換し、2と3でやり取りする内容を決定する。
2.共通鍵の生成・・DH鍵交換アルゴリズムで互いに乱数を交換することで暗号化に使用する共通鍵を安全に生成する。
3.認証・・通信相手のルータやPCを認証する。

### IPsecの通信モード
①トランスポートモード・・IPヘッダが付加されないモード。PC同士のエンドツーエンド通信で使われる。
②トンネルモード・・IPヘッダが付加されるモード。IPsecゲートウェイでLAN内のIPアドレスを隠蔽する場合などに使われる。

### VPN
仮想的な専用線。トンネリングや暗号化などを利用し、共有のネットワークに専用のネットワークを構築する。

### IEEE 802.1X
LAN接続時に使用する認証プロトコル。ポートごとに認証を行い、接続を認めた端末以外がネットワークを利用することがないように接続規制を行う。

### RADIUS
認証と利用事実の記録を一つのサーバで一元管理する仕組み。

###フィンガプリント
情報の同一性を確認するために用いられる値。

### SSID
無線LANアクセスポイントなどに設定される最長32バイトのネットワーク識別子。

### 無線LANのセキュリティ機能
1.プライバシーセパレータ・・同じアクセスポイントに接続されている機器同士の通信を禁止する。
2.MACアドレスフィルタリング・・事前に登録されたMACアドレスを持つ機器だけに無線LANへの接続を許可する。


# 2.アプリケーションセキュリティ

### HSTS
一度あるサイトにアクセスすると、次回から当該WebサイトにはすべてHTTPSでアクセスすることをWebブラウザに強制する仕組み。HTTPヘッダにStrict-Transport-Securityパラメータを設定して適用する。

### HTTPヘッダにおけるセキュリティ対策

①Secure属性・・SSL/TLSを使用して暗号化しているかどうか確認し、暗号化されている場合のみCookieを送信することを指定する。
②HttpOnly属性・・HTMLテキスト内のスクリプトからアクセスすることを禁じる。
③Strict-Transport-Security・・HSTSを利用することを設定する。
④X-Frame-Options・・HTMLのフレーム内でのコンテンツ表示を許可するかどうか設定する。
⑤X-XSS-Protection・・クロスサイトスクリプティングを防ぐためのフィルタを有効化・無効化する。
⑥Content-Security-Policy・・特定の攻撃を検知し、影響を軽減するために追加する情報を定義する。

### S/MIME
MIME形式の電子メールを暗号化し、デジタル署名を行う標準規格。共有鍵でメール本文を暗号化した後、その共通鍵を受信者の公開鍵で暗号化し、メールに添付する。

### 電子メールの認証

①SPF・・差出人のIPアドレスなどをもとにメールのドメインの正当性を検証する。
②DKIM・・デジタル署名を用いて送信者の正当性を検証する。
③SMTP-AUTH・・送信メールサーバでメール送信時にユーザ名とパスワードなどを用いてユーザを認証する。
④POP before SMTP・・送信メールサーバでメール送信前にメール受信のプロトコルでユーザ名とパスワードなどを用いてユーザを認証する。
⑤OP25B・・自社ISPのネットワークの動的IPアドレスから他社ISPの管理するメールサーバへの25番ポートでのSMTP通信を制限する。


### DNSSEC
DNSのセキュリティを改善する拡張仕様。クライアントとサーバの両方がDNSSECに対応しており、該当するドメインの情報が登録されていれば、DNS応答レコードの偽造や改竄などを検出できる。

### ゾーン転送
オリジナルの情報を保持しているプライマリDNSサーバから情報をセカンダリDNSサーバにコピーする際に使われる手法。

### SIEM
サーバやネットワーク機器から集めたログ情報を分析し異常があれば管理者に通知する仕組み。
napkin.aiの図解を試してみた

## napkin.aiとは

napkin.aiは、テキストから適切な図解を提案してくれるサービスです。私は一目惚れして、これからヘビーユースするかもしれないと思ってサービスについて調べてみました。

https://www.napkin.ai/


私はこれまでmermaid.jsが大好きで、シンプルな図解であれば事足りるのですが、より手間をかけた高レベルの図解をしてみたいと常々思っていました。図解にそんな時間をかけていられないので、実務で図解をアーティスティックにすることはほとんどありません。



### 文章に対して、図解を提供してくれる

以下は、サンプルとなる文章ですが、見事に図解してくれています。

- 複数の候補から、自分の好きなタイプを選択できる
- 仮で出力後に文字の色や矩形の色などを自在にカスタムできる
- PNGとして出力できる

というのが魅力的でした。


パターンAの出力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253735/09f8a0fc-eb63-cfd6-2c27-52bb848b1985.png)


パターンBの出力
![napkin-selection.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253735/c568e259-f217-cf58-d6c7-fff9cd13794b.png)



## 2024年8月現在、無料

Pricingには以下のように記載があり、今はすべての機能を使い倒してみるのが良さそうです。そのうち有料になっても継続して利用するか判断する材料になりそうです

>* Keep generating your visuals, it’s free for now! We won’t lock your data behind a paywall, and we’ll offer a deal for our long-time followers.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253735/a9c92bc7-f0bd-3038-bc8c-388cafa1a100.png)




## まとめ

- より良い図解を学ぶ
- 良い図解を瞬足で出力する

方法として、napkin.aiは非常に利便性が高いと思います。どんどん使っていきたいと思いました。
Cannot start Docker Compose application....というエラーが出てDockerが使えなくなったとき

```
Cannot start Docker Compose application. Reason: compose [start] exit status 1. request returned Internal Server Error for API route and version
```
というエラーが突然出てDockerが使えなくなった。
Dockerに関するどのコマンドを打っても同じエラーの繰り返しでどうにもならなくった。
# 解決方法
DockerデスクトップでDockerエンジンの再起動をすることで解決した。
1. Dockerデスクトップの右上の虫みたいなアイコンをクリック
2. Restartを選択
![スクリーンショット 2024-08-28 22.04.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3813857/c14d0d9c-6663-5d66-252a-a4d064c8bb2a.png)

# 原因
おそらく何度もコンテナの削除、ビルドを繰り返していたためその過程で不整合が起きたと考えられる。
何度も繰り返すとメモリのリソースを圧迫して正常に動作しなくなる可能性があるらしい。

# 対策
- 定期的なクリーンアップ: 不要なイメージ、コンテナ、ボリューム、ネットワークを定期的に削除することで、リソースの枯渇や不整合を防ぐ。例えば、docker system prune を使用して、使われていないデータをまとめて削除するなど。

- Dockerの設定を見直す: Dockerの設定（特にストレージドライバやキャッシュ設定）を見直し、適切なものに変更することで、パフォーマンスの改善やエラーの軽減を試みる。
AtCoder 勉強記録[C++] その57

AtCoderで入茶を目指して勉強しています。
勉強を継続するために投稿を始めました。
もともとアカウントを作成していましたが、今年の4月から本格的に勉強を始めました。
一応自分用に解法を書いていますが雑です、自分で読み返して困ったら修正します。
[私のアカウント](https://atcoder.jp/users/nanami_brother)
[解いた問題](https://kenkoooo.com/atcoder/#/table/nanami_brother)
# 本日解いた問題
## A - Cut
[A - Cut](https://atcoder.jp/contests/abc368/tasks/abc368_a)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define mod 998244353

int main() {
  ll n, k;
  cin >> n >> k;
  vector<int> a(n);
  rep(i, n) cin >> a[i];
  vector<int> b;
  for(int i = n-k; i < n; i++){
    b.push_back(a[i]);
  }
  for(int i = 0; i < n-k; i++) b.push_back(a[i]);
  rep(i, n) cout << b[i] << " ";
}
```
### 解法
解答用の配列`B`を用意しておく。`N-K-1`番目のカードから`N`番目のカードを`B`に入れ、その後に1番目から`N-K`番目のカードを入れる。
## B - Decrease 2 max elements
[B - Decrease 2 max elements](https://atcoder.jp/contests/abc368/tasks/abc368_b)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define mod 998244353

int main() {
  ll n;
  cin >> n;
  vector<int> a(n);
  ll plu = 0;
  rep(i, n) {
    cin >> a[i];
    if(a[i]>0) plu++;
  }
  ll cnt = 0;
  while(plu>1){
    sort(a.rbegin(), a.rend());
    a[0]--;
    a[1]--;
    if(a[0]==0) plu--;
    if(a[1]==0) plu--;
    cnt++;
  }
  cout << cnt << endl;
}
```
### 解法
`A`の要素のうち、正の値の個数を入れる変数`plu`を用意しておく。`plu`の要素が1以下になるまで`while`文ループ内で操作を行い、その回数を出力する。
## C - Enumerate Sequences
[C - Enumerate Sequences](https://atcoder.jp/contests/abc367/tasks/abc367_c)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define mod 998244353

ll n, k;
vector<int> r(8);
vector<int> res(8);

void dic(int x){
  if(x==n){
    int sum = 0;
    for(int i = 0; i < n; i++) sum += res[i];
    if(sum%k==0){
      for(int i = 0; i < n; i++) {
        cout << res[i] << " ";
      }
      cout << endl;
    }
  }
  for(int i = 1; i <= r[x]; i++){
    res[x] = i;
    dic(x+1);
  }
}

int main() {
  cin >> n >> k;
  rep(i, n) cin >> r[i];
  dic(0);
}
```
### 解法
再起関数を用いることで条件を満たす長さ`N`の整数列を作ることができる。計算量は高々`5^8`なので問題ない。
## C - Triple Attack
[C - Triple Attack](https://atcoder.jp/contests/abc368/tasks/abc368_c)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define mod 998244353

int main() {
  ll n;
  cin >> n;
  vector<ll> h(n);
  rep(i, n) cin >> h[i];
  ll t = 0;
  for(int i = 0; i < n; i++){
    t += 3*(h[i]/5);
    ll tmp = h[i] % 5;
    h[i] = h[i] % 5;
    while(h[i]>0) {
      t++;
      if(t%3!=0) h[i]--;
      else h[i] -= 3;
    }
  }
  cout << t << endl;
}
```
### 解法
3回`T`を増やすごとに`H[i]`を5減らすことができるので、`H[i]`を5で割ったあまりを求め、あまりについて愚直に減らすことをすべての`H`において行う。
Python イテレータとイテラブルの違いを理解する

## 前提条件
この記事は、Python 3.6以降のバージョンを対象としています。ほとんどの概念は以前のバージョンでも適用されますが、一部の機能や構文は新しいバージョンで導入されたものがあります。

## 記事の概要

Pythonプログラミングにおいて、イテレータとイテラブルは非常に重要な概念です。これらの概念を理解することで、より効率的で柔軟なコードを書くことができます。本記事では、初級者から中級者まで幅広い読者を対象に、イテレータとイテラブルの違いを解説し、それぞれの特徴と使用方法を明確にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/3659455e-c639-128f-d3f4-8d636db7a2b4.png)

## イテラブルとは

イテラブル（iterable）は、繰り返し可能なオブジェクトのことを指します。簡単に言えば、for文で反復処理できるオブジェクトです。

主なイテラブルの例：
- リスト（list）
- タプル（tuple）
- 文字列（str）
- 辞書（dict）
- 集合（set）
- ファイルオブジェクト

イテラブルは、`__iter__()` メソッドを実装しているオブジェクトです。このメソッドはイテレータを返します。

## イテレータとは

イテレータ（iterator）は、データの流れを表現するオブジェクトです。イテレータは以下の2つのメソッドを実装しています：

1. `__iter__()`: 自分自身（イテレータ）を返します。
2. `__next__()`: 次の要素を返します。要素がない場合は `StopIteration` 例外を発生させます。

イテレータの主な特徴：
- 一度に1つの要素を返す
- 状態を保持する（現在の位置を覚えている）
- 全ての要素を走査したら終了する

## サンプルコード

以下に、イテレータとイテラブルの違いを示すサンプルコードを提供します。

```python
# イテラブルの例
my_list = [1, 2, 3, 4, 5]  # リストはイテラブル

# イテレータの例
my_iterator = iter(my_list)  # iter()関数でイテラブルからイテレータを作成

# イテラブルの使用
print("イテラブルの使用:")
for item in my_list:
    print(item, end=' ')
print("\n")

# イテレータの使用
print("イテレータの使用:")
print(next(my_iterator))  # 1
print(next(my_iterator))  # 2
print(next(my_iterator))  # 3

# カスタムイテレータの作成
class CountDown:
    def __init__(self, start):
        self.start = start

    def __iter__(self):
        return self

    def __next__(self):
        if self.start <= 0:
            raise StopIteration
        self.start -= 1
        return self.start + 1

# カスタムイテレータの使用
print("\nカスタムイテレータの使用:")
for num in CountDown(5):
    print(num, end=' ')
```

## 実行例

上記のコードを実行すると、以下のような出力が得られます：

```
イテラブルの使用:
1 2 3 4 5 

イテレータの使用:
1
2
3

カスタムイテレータの使用:
5 4 3 2 1 
```

## イテラブルとイテレータの違い

1. **メモリ使用**: イテラブルは通常、すべての要素をメモリに保持しますが、イテレータは現在の状態のみを保持します。
2. **アクセス方法**: イテラブルは添字でアクセスできることがありますが（例：リスト）、イテレータは `next()` 関数でのみアクセスします。
3. **再利用**: イテラブルは何度でも反復できますが、イテレータは一度走査すると再利用できません。

## ジェネレータ - イテレータの特殊な形

ジェネレータは、イテレータを簡単に作成する方法です。`yield` キーワードを使用して定義します。

```python
def countdown_generator(start):
    while start > 0:
        yield start
        start -= 1

# ジェネレータの使用
for num in countdown_generator(5):
    print(num, end=' ')  # 出力: 5 4 3 2 1
```

ジェネレータは、大量のデータを扱う際にメモリ効率が良いため、中級者以上のプログラマーにとって非常に有用なツールです。

## 公式の参考情報

Pythonの公式ドキュメントでは、イテレータとイテラブルについて詳しく説明されています：

- [イテレータ型 - Python 公式ドキュメント](https://docs.python.org/ja/3/library/stdtypes.html#iterator-types)
- [イテレータ - Python チュートリアル](https://docs.python.org/ja/3/tutorial/classes.html#iterators)

## まとめ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/ecef26e5-4bc9-2b05-663d-cd188ce60def.png)

1. イテラブルは、繰り返し可能なオブジェクト（例：リスト、タプル、文字列）です。
2. イテレータは、`__next__()` メソッドを持ち、要素を一つずつ返すオブジェクトです。
3. `iter()` 関数を使ってイテラブルからイテレータを作成できます。
4. カスタムイテレータを作成することで、独自の反復処理を実装できます。
5. ジェネレータは、イテレータを簡単に作成する方法で、メモリ効率が良いです。
6. イテレータとイテラブルを理解することで、より効率的なPythonコードを書くことができます。

初級者の方は、基本的なイテラブルの使用方法とイテレータの概念を理解することから始めてください。中級者の方は、カスタムイテレータの作成やジェネレータの活用にチャレンジしてみてください。イテレータとイテラブルの概念を深く理解することで、Pythonプログラミングのスキルを大きく向上させることができます。

## 参考記事

https://qiita.com/Tadataka_Takahashi/items/d46850d29eeb3721ac44
[Unity]いらなくなったアセットを削除する方法

# 概要
いらなくなったアセットを削除したくてもPackagesの中にあると削除することができません。
![スクリーンショット 2024-08-28 213231.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/98411189-ddc1-188b-743f-5f9be34cea6d.png)


# 本文
練習で今回は「HotReload」をImportします。
![スクリーンショット 2024-08-28 213142.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/1cfae4e0-f49e-762d-d751-8c9a85fe1702.png)

Packageの中にあるHotReloadフォルダをAssetsフォルダにドラッグ&ドロップします。
![スクリーンショット 2024-08-28 213231.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/89c55e83-2501-8fee-0eac-be14c66f4147.png)
するとちょっと名前が違いますがHotReloadがAssetsの中に移動しています。ここまで移動できたらいつものように削除することができます。
![スクリーンショット 2024-08-28 213358.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/ffd1e985-0316-1339-abfc-92521c14ce0e.png)




# 補足
SourceTreeで確認したら差分が綺麗に（ちょっと残っていますが）消えていることが確認できます！
![スクリーンショット 2024-08-28 213301.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/507869c4-f17a-6c6a-c041-8b9198861f2e.png)

　　　　　　　　　　　　↓

![スクリーンショット 2024-08-28 213421.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/00066a31-00b1-b869-89f4-e33af94af354.png)


:::note warn
ちょっと乱暴なやり方かもしれません。やる時は自己責任でお願いします。
:::


# 補足２
もっと丁寧にやりたい時はこちらの記事を参考にすると良さそうです

[【Unity実践】#26 番外編 ～ 不要なアセットの削除 ～【Boxゲーム】](https://tech.pjin.jp/blog/2021/07/30/unity_break-the-box-26/)
AWS Certified AI Practitioner早速受けました

新設のAWS Certified AI Practitionerが8月中旬から受けることができます。予約開放当日に申し込んたけど最速でも8月下旬受験になりました。結果は無事合格だけど、少し体験を話しします。

![Screenshot from 2024-08-28 21-49-55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893830/d5bf9626-99f2-4192-8a65-c4d48b19cdfd.png)

**注意してほしいのは、今回ベータ試験を受けたので、今後出題形式など大幅に変わる可能性がある**

# 勉強

### 資料
AWS公式の資料だけ見ました。出たばかりなので、公式以外の資料がたぶんないと思います。（探さなかった）

模擬試験「AWS Certified AI Practitioner Official Pretest (AIF-C01)」は絶対に1回軽くやっても良いと思います。自分は約20秒ぐらい1問でさっさとやって、75%正解でした。ただし重要なのは1問ずつ1選択肢ずつも解説がありますので、資料より価値があると言っても過言ではないです。

### 時間
1週間ぐらいがあれば十分だと思います。全くAWSとAIを触ったことがない方であれば、資料を見ながら検索なども必要なので、2-3週間かかるかもしれません。

# 試験内容
一番気になったのは範囲の部分です。だいぶ昔にAWS Certified Cloud Practitionerを受けたけど、割と簡単だと思いました。ただし、AI Practitionerの方が、やや難しい感じもあります。

### 試験範囲
AIの部分ももちろんありますが、AIを使うために、関連のAWSサービスへの知識も問われました。データの保存場所だったらAWSの保存サービス・処理に関する部分ならEC2とかのサービス・セキュリティの領域だとAWSのいろんなセキュリティ機能など、AWSのAIサービス以外に全く知らないと、何問が答えられない可能性があります。

### 難易度
まず模擬試験より少し難しいと感じています。もしかしてベータ試験なのでいくつか点数をつけない難問も入っているかもしれなくて、正式試験の場合が違う可能性もあります。

詳しく言うと、AIに関するAWSサービスが近年ものすごく増えたので、正直全部触ったことがあるのは無理だと思うけど、少なくとも名前とそのサービスの主な用途を覚える必要があります。（自分はLex、Transcribe、Q、Pollyなども使ったことがないので、名前でサービスの内容を推測しかない…）

AWSサービス以外にも、AI領域の用語も、普段そこまでガッツリAIの開発をしない限り、おそらく聞いたことあるけど実際の意味が把握していない言葉も多いので、そちらも事前に調べておくと、そこまで難しくはないかもしれません。

### 時間
85問があるけど、40秒ぐらい1問のスピードで回答しました。余裕に60分前後で完成しました。Practitionerレベルなので、Professionalみたいな超絶長い文章や引っかかる部分がぼほないです。

*一点補足で、今回の結果は試験後すぐ確認できなくて、数時間後にメールが来るとの形です。ベータ試験のせいですかね。よくわかりません。*
初心者が新しいデジタル企画作り！？WebARで集客策を作ろう

こんにちは、TOMです。

今回は**WebARである『palanAR』を使って、集客策に使えそうなポスターにカメラ映して出ている文字の粗品をプレゼントする企画**を試みました。

# 1. 使用ツール
**●palanAR**

https://palanar.com/

# 2. やりたかったこと
前回は業務効率、業務改善を意識したツールを作成しましたが、今回は集客策に活かせる仕組みを作成したいと考えました。

そこで、『palanAR』というものを学んだので、簡易的なフォトスポットを作成したいと思います。

:::note warn
集客策ですが、私自身クレジットカードの募集業務に携わっておりますが、当たり前ですがお客さまに入会していただくって大変なんですよね。
:::

<br>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819461/8040de50-7fdb-caae-0d7b-a8769a90fadd.png)

<br>

お客さまが商品やサービスを購入（クレジットカードの場合は入会）に至るまでには4つのステップが大切となります。

検討フェーズに入っている人を入会に導くのはもちろん、その場で入会しなくとも、認知や興味・関心を持つ層を増やす、アプローチすることが大変重要となっていきます。

ですので、とりあえず入会場所（カウンターといいます）に集客してアプローチをしたいと常日頃考えております。

:::note info
集客方法としては、専門店の方に紹介・送客していただいたり、抽選会などイベントで集客したりしますが、ヒト・モノ・カネが使えないときもあるので、簡易的な集客策を作成したいと思います。
:::

# 3. palanARを使う

**①AR新規作成を押す**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819461/98eef683-e38e-868a-a3eb-8107aa333337.png)


**②画像認識を選択**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819461/cb7cae72-5cf4-b9f5-a2e1-2942027d7a7d.png)

**③プロジェクト名・URL設定**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819461/11fcec2d-c248-67e9-208c-c90207a574e5.png)

<br>

今回は、フリー素材のポスターを用意していますが、本来はキャンペーン用のポスターなどの画像データを用意します

<br>

![A3ポスター　広島　しまなみ街道　青　旅行　.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819461/af38a9fa-bcb0-620c-7ff3-39fb60d41d9e.png)

**④画像マーカー設定**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819461/f160974a-b1dd-f7e5-79f5-0c7b98ff524d.png)

**⑤マーカーの設置方法**
今回は、壁に掛かっているポスターを想定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819461/f5002667-838f-9701-0c3c-7883c311a8dc.png)

**⑥テンプレートの設定**
本来は自由作成を選んだ方が良いですが、今回は自己紹介の画像を使用します。
理由は文字を使いたいからです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819461/56e48695-a9df-4de8-9cbe-7a49825d347c.png)

**⑦AR編集**
想定としては、ポスターにカメラ映して「サランラップ1本をプレゼント！！！」が出たらサランラップ進呈するスキームです。
「ポスターのキャンペーンなどはご存知でしょうか？」などのセールストークにもつながりやすいと考えております。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819461/dd23b585-4ab0-c345-d274-c446783b206d.png)

**⑧試作品完成**
実際のポスターとデザインのセンスがあればそれっぽいものができそう。。笑

https://x.com/tom678174/status/1828768478498791588

# 4. 実際にARを使えるような未来はあるのか
:::note warn
根本的に私が勤めている会社では、当該サイトのようなログインをして使用するサイトは全面不可となっております。
:::

ただし、販促物の制作会社などにAR制作を任すなどすれば、集客策としてはありかなぁという感じです。
恐らく、趣味で触っていないとモデル作成センスは伸びなさそうである。
（そもそもチープだとマイナスプロモーションになる）

反対に、プラスに感じたことは自分でもそれなりに作成できると知ったことです。
今の自分では抽選会や送客カードなどの施策に逃げがちですが、このようなデジタル企画を身近に感じられるようにアンテナを張っていきたいと思います。

# 5.参考資料
https://qiita.com/am003004/items/159c2371018a7d7e095e
Fast API構築

1, ディレクトリ作成

```
mkdir fast-api-test
cd fast-api-test
```

2, pythonの仮想環境構築。ライブラリの構成を環境ごとに分けるため
```
python -m venv venv
```

```
-m venv: Pythonのモジュールを指定するオプション。-mは「モジュール」を意味し、venvモジュールを使って仮想環境を作成するよう指示。
venv: 作成する仮想環境のディレクトリ名。
```

```
. venv/bin/activate
```
で仮想環境に入る。

3, ライブラリインストール
```
pip install fastapi
pip install "uvicorn[standard]"
```
で必要なライブラリのインストール

4, 簡単なアプリケーションの例
```
from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
    return {"item_id": item_id, "q": q}
```

以下のコマンドでサーバー起動
```
uvicorn main:app --reload
```

各コマンドの意味はこちら
`main`: `main.py`ファイル
`app`: `main.py`の`app = FastAPI()`の行で生成されたオブジェクト
`--reload`:コードを変更したらサーバーを再起動する
Mapbox GL JS v3 のスタイル設定 "random" について 

## はじめに

Mapbox GL JS が v3 となって久しいですが、v3 の新機能として Style Specification に `random` という Expressions が登場しました。

この機能について、私は、当時の記事で以下のように記載しましたが、これがあまり使い勝手がよくなかった（私が使い方を勘違いしていた）ので、その補足を兼ねて挙動をメモします。

> 地味に、ランダムな値を発生させる `random` もうれしいです。今までは、同じ種類の地物（建物など）を少しずつ違った色合いで見せたい、というような場合、データ段階で色のデータを仕込んでおかねばならなかったので。

https://qiita.com/mg_kudo/items/92283d017f7528f06c5e

## `random` の使い方

使い方は[ドキュメント](https://docs.mapbox.com/style-spec/reference/expressions/#random)の通りなのですが、以下のように、number_1 と number_2 の間のランダムな値を seed をもとに生成します。

```
["random", number_1, number_2, seed]
```

ここで、seed の値が同じであれば同じ値が返ってくることになります。そのため、単に以下のように単一のスタイルレイヤで共通の seed を用いる場合、そのスタイルレイヤで記述される地物については、全て同じ値が適用されることになります。

たとえば、以下のようにポリゴン（fill）の色をランダムに発生させた場合、このスタイルレイヤで再現される地物は、**全て同じ色**で塗られることになります。

```JavaScript:ランダムな同一の色ですべての地物を塗る
"fill-color": ["hsl", ["random", 0, 360, 123], 50, 50],
```

これを**地物毎**にランダムな値で塗りつぶしたい場合は、seed を地物に合わせて変更する必要があるようです。以下の例は、例えば、地物毎に id というユニークな属性値を持っている場合の記述方法です。

```JavaScript:地物毎にランダムな色で塗り分ける
"fill-color": ["hsl", ["random", 0, 360, ["get", "id"]], 50, 50],
```

そのため、地物毎にユニークな値がない場合、それをスタイル側の設定でランダムに塗り分けるというのは、どうやら難しいようです。

結果として、私の過去の記述は、「ランダム/ユニークな**色そのもの**をデータ段階で仕込む必要はない」という点は誤りないのですが、同じ種類の地物（建物など）を少しずつ違った色合いで見せたい場合は、「データ段階で各地物の**ユニークな値**を仕込んでおく必要がある」という知識が抜けておりました。

> 地味に、ランダムな値を発生させる `random` もうれしいです。今までは、同じ種類の地物（建物など）を少しずつ違った色合いで見せたい、というような場合、データ段階で色のデータを仕込んでおかねばならなかったので。

## 無理やり地物毎に塗分けてみる

たとえば、地理院地図Vector や最適化ベクトルタイルの建物データを塗り分けようとすると、地物（建物ポリゴン）毎にユニークな属性値はありません。そのため、`random` を用いて塗分けるのは無理だと思っていました。

ただ、属性値としてはユニークなものがないとしても、**座標値（geometry）** は地物毎にユニークなはずです。そのため、座標値を評価できる Expressions がないか探したところ、`disatance` という Expressions が利用できそうでした（[ドキュメントはこちら](https://docs.mapbox.com/style-spec/reference/expressions/#distance)）。

```
["distance", geojson_object]
```
そこで、各地物と座標 [0, 0] の距離を `random` の seed として入れてみると、見事にランダムな色で各地物を塗り分けることができました。

```JavaScript:座標を用いて地物毎にランダムな色で塗り分ける
"fill-color": ["hsl", ["random", 0, 360, ["distance",
  {
    "type": "Feature", 
    "geometry": {"type": "Point", "coordinates": [0, 0]},
    "properties": {}
  }
]], 50, 50],
```
![建物をランダムに塗り分けた地図のサンプル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2842832/eb38141c-50f8-d0cf-b0d0-a4a40b09c0e1.png)
※地図データ：地理院地図Vector（実際は、fill ではなく、fill-extrusion で表示）

ただし、以下のような懸念は残っています。

* 無駄に距離の演算をさせるので、パフォーマンスが心配
* 距離演算の精度や Simplification 等で ZL 毎に地物の形状が異なるためか、ZL を変更する毎に色が変わってしまい安定しない
* 地物がデータ上分かれていると別の色に塗られてしまう


### サンプル

https://mghs15.github.io/random-colorful-features/

### レポジトリ

https://github.com/mghs15/random-colorful-features

## おわりに

期待していた `random` について、私が当初想定していた通りの挙動をしていないことに気づき、あきらめかけたところですが、`distance` を用いることで100点でないにしろやりたいことができるとわかりました。いろいろな地図表現を楽しめることに感謝です。

ただ、機能の充実に伴い、それらの組み合わせで様々なことができるようになりますが、果たしてそれが開発陣の想定している使い方なのかは分かりません。今回の記事を書きながら、あまりにも想定を外れる使い方は避けた方が良いな、とも思いました。
VSCodeでTypeScriptファイルをデバッグする方法（esbuildを使用）

expressなどサーバーサイドの開発をしているときにデバッガーで処理の流れを追いたいときがあるかもしれません。今回はesbuildを使った例を見てみましょう。

## 準備

```sh
npm init -y
npm install -D typescript esbuild @types/node
mkdir ./src && mkdir ./.vscode
touch ./src/main.ts
```

いつもの超基本的なインストールです。main.tsには適当にaddとか関数を作成して、左にある赤い丸を押すと、ブレークポイントを仕込めます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679704/30534d94-e7e1-0d49-178d-e701585f5c0b.png)


```ts:main.ts
const add = (num1: number, num2: number): number => {
  console.log('Adding two numbers');
  return num1 + num2;
}
const main = () => {
  const result = add(1, 2);
  console.log(result);
}
main()
```

## `package.json`の設定

```json:package.json
{
  "name": "typescript-debug",
  "version": "1.0.0",
  "scripts": {
    "build": "esbuild ./src/main.ts --bundle --sourcemap --platform=node --outfile=./dist/main.js"
  },
  "devDependencies": {
    "typescript": "^5.0.0",
    "esbuild": "^0.19.0",
    "@types/node": "^20.0.0"
  }
}
```

esbuildで./src/main.tsにあるファイルをbuildします。`--sourcemap`が重要です。buildしたあとのmain.jsファイルを起動するときに、sourcemapを見てもとのTSファイルの位置を判断してくれます。

## VSCodeのデバッグ設定

次に、VSCodeでデバッグを行うために、`.vscode`ディレクトリにlaunch.jsonとtasks.jsonファイルを作成します。

```json:launch.json
{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "launch",
      "name": "ts-debug",
      "program": "${workspaceFolder}/src/main.ts",
      "preLaunchTask": "prebuild",
      "outFiles": ["${workspaceFolder}/dist/**/*.js"]
    }
  ]
}
```

```json:tasks.json
{
  "version": "2.0.0",
  "tasks": [
    {
      "type": "npm",
      "label": "prebuild",
      "script": "build"
    }
  ]
}
```

この設定により、デバッグ開始前に自動的にnpm run buildが実行され、最新のビルドが反映されるようになります。

## デバッグの実行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679704/cfaa4a69-147a-4e3d-b3cb-49e62a181b1c.png)


画面左にある虫ボタンを押したらデバッグ画面、そのあと上にあるts-debugの横にある三角を押したらデバッグがはじまります。

たぶんtscでも大体一緒だと思います。sourcemapを出すようにしたらいけるんではないかな。
各種ユーザ情報確認

## OS

```
#!/bin/bash

# アカウントロック回数の取得 (デフォルト値を設定)
lock_count=$(grep -Po 'deny\s*=\s*\K[0-9]+' /etc/security/faillock.conf 2>/dev/null || echo "5") 

echo "ユーザ,アカウントロック回数,PW有無,PW有効期限"
for user in $(cut -d: -f1 /etc/passwd); do
    pw_field=$(awk -F: -v u=$user '$1==u {print $2}' /etc/shadow)
    
    # パスワードステータスの判定
    if [ -z "$pw_field" ] || [ "$pw_field" = "!!" ]; then
        pw_status="-"
    else
        pw_status="○"
    fi
    
    # パスワード有効期限の判定
    expiry_field=$(awk -F: -v u=$user '$1==u {print $5}' /etc/shadow)
    if [ -z "$expiry_field" ] || [ "$expiry_field" = "" ]; then
        expiry_days="-"
    else
        expiry_days=$expiry_field
    fi
    
    echo "$user,$lock_count,$pw_status,$expiry_days"
done
```

## Oracle

```SQL
SET COLSEP ','
SET PAGESIZE 0
SET TRIMSPOOL ON
SET HEADSEP OFF
SET LINESIZE 1000

SELECT 
    u.USERNAME || ',' || 
    COALESCE(p2.LIMIT, '-') || ',' || 
    CASE 
        WHEN p1.LIMIT IS NOT NULL THEN '○' 
        ELSE '-' 
    END || ',' ||
    CASE 
        WHEN p1.LIMIT IS NOT NULL THEN p1.LIMIT 
        ELSE '-' 
    END AS "ユーザ,アカウントロック回数,PW有無,PW有効期限"
FROM 
    DBA_USERS u
JOIN 
    DBA_PROFILES p1 
ON 
    u.PROFILE = p1.PROFILE AND p1.RESOURCE_NAME = 'PASSWORD_LIFE_TIME'
LEFT JOIN 
    (SELECT PROFILE, LIMIT 
     FROM DBA_PROFILES 
     WHERE RESOURCE_NAME = 'FAILED_LOGIN_ATTEMPTS') p2
ON 
    u.PROFILE = p2.PROFILE;
```

## Dovecot

```
#!/bin/bash

echo "ユーザ,アカウントロック回数,PW有無,PW有効期限"

while IFS=: read -r user pass rest; do
    if [ -n "$pass" ]; then
        pw_status="○"
    else
        pw_status="-"
    fi
    echo "$user,設定なし,$pw_status,設定なし"
done < <(grep -v ^# /etc/dovecot/passwd)
```
Chrome, Edge バージョン128 css zoom標準化のメモ書き

# はじめに
ChromeやEdgeのバージョンが128に更新された時、
縦スクロール固定、横スクロールは動的に動かしている要素の位置がずれた。

# 状況
cssのzoomプロパティが適用されたdiv要素の子要素に対して、
縦スクロールはposition:fixedで固定されるけど
横移動した時に位置を動的に動かすために
jQueryのoffset().leftで絶対位置を取得してスクロールしたpxと引き算して動かすということをしていた。
jQueryのバージョンはv1.12.4とかなり古い...

# 原因
Chromeのバージョンが127から128に変わった時に、
cssのzoomが標準化されて、それに合わせてjavascriptのAPIが色々変更されたらしい。

#### リリースノート
https://developer.chrome.com/release-notes/128?hl=ja

#### API影響
https://docs.google.com/document/d/1AcnDShjT-kEuRaMchZPm5uaIgNZ4OiYtM4JI9qiV8Po/edit#heading=h.6o0644leczfb

>iframe コンテンツ ドキュメントに適用するズームを変更する 継承されたすべての長さのプロパティに適用されるように変更します。 （以前は、継承された font-size のみが変更されました）。

例えば、横幅100pxのdiv要素をzoom: 2とした時に
その要素が表示されるときは200pxでレンダリングされる。
その子要素にposition: fixedの要素があったとして、
バージョン127までは、left: 20pxとした時は、左から20pxの位置に表示されていた。
128からはzoom: 2の値が積算されて、左から40pxの位置に表示されるようになった。
という感じかな?

これまでは、position:fixedの要素は親要素に関係なく絶対位置に配置されていたけど、
親要素にzoomが含まれる場合は、例外にならず全ての長さ要素が相対化されるっぽい。

# 根本対策
zoomを使い続けたまま他だけを修正する場合の対策だけど、

zoomが使用されている子要素の全ての長さのプロパティーがzoomの値で再計算されるので、
動的に長さを出してる場合は以下のような感じで、
静的に書いてる場合はzoomの値をかけてやる必要がある。
```ruby:ChatGPT出力
$(document).ready(function() {
    // 例として要素を選択
    var element = $('#yourElement');

    // 要素のオフセットの left 値を取得
    var offsetLeft = element.offset().left;

    // document の zoom 値を取得
    var zoom = window.getComputedStyle(document.documentElement).zoom;

    // zoom の値が取得できない場合は 1 とする（デフォルト値）
    zoom = zoom ? parseFloat(zoom) : 1;

    // zoom を適用した新しい left 値を計算
    var adjustedLeft = offsetLeft / zoom;

    console.log("Adjusted Left: ", adjustedLeft);
});
```
# 回避策
css zoom 標準化前の仕様にする。

2025年4月16日までは**Trial for DisableStandardizedBrowserZoom**
のOrigin Trialsに登録してヘッダーとかmetaタグとかで設定すると元の仕様になるっぽい？

まぁそこらへんはやったことないし、調査不足なんでドキュメントを見てもろて

##### Chromeの場合 Trial for DisableStandardizedBrowserZoom
https://developer.chrome.com/origintrials/#/view_trial/3499859860420296705

##### Edgeの場合 Trial for DisableStandardizedBrowserZoom
https://microsoftedge.github.io/MSEdgeExplainers/origin-trials/

##### Origin Trials 説明
https://chrome-apps-doc.appspot.com/ja/docs/web-platform/origin-trials/

# 関連リンク
#### css zoomの仕様に関する議論
https://github.com/w3c/csswg-drafts/pull/9699

#### Feature
https://chromestatus.com/feature/5198254868529152

#### Demo
https://jsbin.com/wasafateko/edit?html,css,js,output
チェックボックス

```tsx
import React, { useState } from "react";
import { Checkbox, FormControl, FormControlLabel, FormLabel, Typography, Grid } from "@mui/material";

const CheckboxGroup: React.FC = () => {
  // 選択された項目のIDを保持するステート
  const [selectedValues, setSelectedValues] = useState<number[]>([]);

  const items = [
    { id: 1, name: "Item 1" },
    { id: 2, name: "Item 2" },
    { id: 3, name: "Item 3" },
    { id: 4, name: "Item 4" },
    { id: 5, name: "Item 5" },
    { id: 6, name: "Item 6" },
    { id: 7, name: "Item 7" },
    { id: 8, name: "Item 8" },
    { id: 9, name: "Item 9" },
    { id: 10, name: "Item 10" },
    { id: 11, name: "Item 11" },
    { id: 12, name: "Item 12" },
  ];

  const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {
    const value = parseInt(event.target.value, 10);
    setSelectedValues((prevSelectedValues) =>
      prevSelectedValues.includes(value)
        ? prevSelectedValues.filter((id) => id !== value) // 既に選択されていれば解除
        : [...prevSelectedValues, value] // 選択されていなければ追加
    );
  };

  return (
    <div>
      <FormControl component="fieldset">
        <FormLabel component="legend">Select Items</FormLabel>
        <Grid container>
          {items.map((item) => (
            <Grid item xs={2} key={item.id}>
              <FormControlLabel
                control={
                  <Checkbox
                    value={item.id}
                    checked={selectedValues.includes(item.id)}
                    onChange={handleChange}
                  />
                }
                label={`Checkbox ${item.id}`}
              />
            </Grid>
          ))}
        </Grid>
      </FormControl>
      {selectedValues.length > 0 && (
        <Typography variant="h6" component="div">
          Selected Items: {selectedValues.map((id) => items.find((item) => item.id === id)?.name).join(", ")}
        </Typography>
      )}
    </div>
  );
};

export default CheckboxGroup;
```
Amazon Bedrock - Guardrails for ハルシネーション検出

# Guardrails for ハルシネーション検出

Bedrock の Guardrails に、生成 AI アプリケーションが誤った情報（ハルシネーション）を生成しないように保護する機能を追加したよ。

# コンテキストグラウンディングチェック

AI がデータに基づかない不正確な回答や、質問に無関係な回答を検出し、除外するための仕組み

## 2つのフィルタリング基準

### グラウンディング 

- AI の回答がデータに基づいているかを確認し、設定された基準を下回る場合、回答をブロック
- しきい値のスコアが高いほど、ブロックされる回答が多くなります

### 関連性

- AI の回答がユーザーの質問に関連しているかを確認し、基準を下回る場合は回答をブロック
- しきい値のスコアが高いほど、ブロックされる回答が多くなります

## コンソールから動作確認

Guardrails の設定で「Grounding」と「Relevance」をオンにするだけのようです。
まず、閾値はデフォルトの 0.7 で試してみます。

![スクリーンショット 2024-08-28 19.34.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/b7069557-4e9b-d991-4a82-d3c42adc3f1f.png)

今回は良い例が思いつかなかったので、AWS ブログにある例を実行してみます。
閾値は値 0.7 を上回っっているので、合格しました。

![スクリーンショット 2024-08-28 19.43.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/b0deb21e-c1d9-732c-d6e7-449976ef85ec.png)

次に、閾値を 0.８ にして試してみます。

![スクリーンショット 2024-08-28 19.48.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/032e58e0-e589-931f-892b-36e81510fe21.png)

先程と同じ質問を投げてみます。
今度は、閾値を下回り失敗となり、最終応答が得られなかったことを確認できました。

![スクリーンショット 2024-08-28 19.54.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/19078a15-b1f3-b29c-0d4d-3ca199886d46.png)

## SDK

SDK での実装は `create_guardrail` で `contextualGroundingPolicyConfig` を指定します。

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/bedrock/client/create_guardrail.html#create-guardrail


# リンク

https://aws.amazon.com/jp/about-aws/whats-new/2024/07/guardrails-bedrock-hallucinations-safeguard-apps-fm/

https://aws.amazon.com/jp/blogs/news/guardrails-for-amazon-bedrock-can-now-detect-hallucinations-and-safeguard-apps-built-using-custom-or-third-party-fms/


# その他

Guardrails が価格を最大 85% 引き下げになったと！！！

https://aws.amazon.com/jp/about-aws/whats-new/2024/12/amazon-bedrock-guardrails-reduces-pricing-85-percent/
「jdk-11.0.2.jdkは、開発元を検証できないため開けません。」というメッセージが出てきた時の対処方法

最新バージョンに変わり、どこにボタンが行ってしまったの？
となっているそこのあなたへ、お助けできる記事を書きました。
macOS Sonoma バージョン14.6.1

出てきたメッセージです。
「jdk-11.0.2.jdk”は、開発元を検証できないため開けません。」と出ています。
「キャンセル」を押します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95052/69bb4806-1e6b-07cc-71ab-3863af96f976.png" width=50%>

するとターミナルだとこうなります。
```
java -version
```

![スクリーンショット 2024-08-28 19.44.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95052/ad7cb807-7321-74c1-f533-00e421d0453d.png)


プライバシーとセキュリティ>セキュリティ
を確認すると、キャンセルを押した途端、ブロックされている旨の通知が現れます。
「このまま許可」
を押します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95052/ee11b4cb-7394-09fd-5c16-3111213a95c9.png" width=50%>

するとさらにしつこく、今度はこうなります。
「開く」を押しましょう

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95052/6320b99b-5abc-18f6-2210-fd5bc90317d8.png" width=50%>

再度バージョンを確認すると、やっと出てきます。
```
java -version
```
![スクリーンショット 2024-08-28 19.45.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95052/f2d10e2c-315c-730d-41b8-459f99514a02.png)

これでOpenJDKのインストールの確認ができました。
OracleJDKだとこんなメッセージは出ないので、ご安心ください。

OracleJDKをインストールしたいあなたへ
https://qiita.com/giito/items/11bd88f38c1ea15bf53f

それでは！
【メモ】S3にアップロードするときの設定

ポリシーとアクセス許可について
![スクリーンショット 2024-08-28 200306.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3439167/1965e817-f00a-3885-c367-a30247a4191b.png)
Office 365への段階的なExchange移行： 主なポイント

現在、多くの理由から、ほとんどのユーザーが Exchange Server ではなくクラウドベースのサービスを選択しています。ユーザーはインターネット上で段階的な Exchange から Office 365 への移行のソリューションを探していますが、そのための完璧な手順を見つけることができません。

そのため、この詳細なガイドでは、スムーズな移行のための手動および自動アプローチの両方のガイドラインを概説しています。さらに、オンプレミスの Exchange をハイブリッド構成で設定する方法についても説明します。これ以外にも、カットオーバー、ハイブリッド、IMAP など、この移行にはより伝統的な手法がありますが、その中でも段階的な移行が最適です。

ただし、段階的な移行手法は Exchange Server 2003 または 2007 とのみ互換性があります。これを使用すると、一度に 2000 個のメールボックスしか移動できません。

完璧な移行を確実に行うための前提条件を簡単に見てみましょう。このセクションは非常に重要な部分なので、飛ばさないようにしてください。
<h2>Exchange Server を Office 365 に移行するための移行前チェックリスト</h2>
Exchange から Office 365 への段階的移行を開始する前に、移行をスムーズに行うために <a href="https://www.systoolsgroup.com/updates/microsoft-office-365-pre-post-migration-checklist/">pre migration checklist plan</a> を把握しておく必要があります。さらに、次の点に従うことが必須です。

1. オンプレミスの Exchange で Outlook Anywhere を構成する。

2. Exchange 組織への接続を確認する。

3. 権限を設定し、ユニファイド メッセージングの移行前を無効にする。

4. オンプレミスのドメインが Office 365 と一致することを確認する。

5. ユーザーの同期に Azure AD Sync を使用する。

6. 移行ユーザーの CSV ファイルを特定して作成する。

7. Outlook Anywhere 移行エンドポイントを生成する。

8. CSV ごとに段階的移行バッチを作成する。

9. 移行ダッシュボードとログでバッチを監視する。

10. Office 365 の電子メール配信用に MX レコードを更新する。

11. 電子メールが Office 365 メールボックスにルーティングされていることを確認する。

12. 検証が完了したら、段階的移行バッチを削除する。
13. ライセンス割り当てを使用して Office 365 ユーザー アカウントをアクティブ化し、14. 自動検出 DNS レコードを作成し、オンプレミスの Exchange サーバーを廃止します。

移行手順の前提条件を確認した後、次のセクションでは、続行するための手順を確認します。
<h2>Exchange から Office 365 への段階的移行の手順</h2>
転送手順を実行するための手順を次に示します。1 つのミスですべてが消えてしまう可能性があるため、賢明に従うことを忘れないでください。

1. Exchange 管理センターにアクセスします。

2. 受信者に移動して移行を選択します。

3. [新規 +] をクリックし、[Exchange Online に移行] を選択します。

4. 移行の種類画面で段階的な移行を選択します。

5. プロンプトに従って CSV ファイルを選択し、Office 365 検証を使用して検証します。

6. [移行エンドポイントの確認] 画面で移行エンドポイントを認証します。

7. [移動構成] でバッチ名を入力して、続行します。

8. [バッチの開始] 画面で [自動開始] または [手動開始] を選択します。

9. [新規] をクリックして移行バッチを作成します。

10. Exchange 管理センターに戻り、[受信者]、[移行] の順に選択します。

11. 移行ダッシュボードでバッチを選択し、[開始] をクリックします。

正常に開始されると、ダッシュボードに同期ステータスが表示されます。

したがって、これらのガイドラインの助けを借りて、段階的な Exchange から Office 365 への移行を簡単に実行できます。それでも、これは時間がかかり、エラーが発生しやすいアプローチであると思われるかもしれません。さらに、この移行プロセスを障害とともに実行したいユーザーはいないことはわかっています。そのため、次のセクションでは、同じことを自動化する手法を学びます。
<h3>オンプレミス Exchange からオンライン Exchange への移行を実行するための専門的な方法</h3>
「Exchange Server を Office 365 に移行する」には、評判の高いユーティリティである SysTools <a href="https://www.systoolsgroup.com/exchange-to-office365-migrator.html">Exchange to Office 365 Migration Tool</a> を検討してください。このアプリケーションは、効果的で信頼性の高い移行のために特別に設計されており、新しく到着したデータのデルタ移行、特定のデータ移行の日付フィルタリングなどの機能を提供します。

評価用にデモ バージョンが用意されており、フル バージョンを選択すると、より効率的な移行のための高度な追加機能が提供されます。

手順が気になる場合は、次のとおりです。

手順 1. 前述のソリューションをインストールして実行します。

手順 2. 「Exchange」をソースとして設定し、「Office 365」を宛先として設定します。

手順 3. 必要な移行カテゴリ (メール、連絡先など) を選択します。

手順 4. 日付フィルターとグループ マッピングを構成します。
ステップ 5. Exchange Server の詳細を入力します:
1. Exchange バージョン
2. 管理者のメール
3. 管理者のパスワード
4. Active Directory IP
5. Exchange Server IP
6. サブドメインを含める
ステップ 6. [検証] をクリックし、[次へ] に進みます。
ステップ 7. [宛先] ウィンドウに管理者のメールとアプリケーション ID を入力します。
ステップ 8. [ユーザーの取得]、[ユーザーのインポート]、または [テンプレートのダウンロード] を使用して、古いアカウントからユーザーを追加します。
ステップ 9. [移行の開始] をクリックして移行を開始します。
<h3>結論！</h3>
Office 365 への段階的な Exchange 移行は、オンプレミス Exchange からオンライン Exchange にデータを転送するプロセスです。これを手動で行う場合、複雑で時間のかかる手順になります。複雑さを回避し、移行をスムーズに行うために、スマートなソリューションを検討します。
初めてのアプリ開発

# 目次

[1. 背景](#背景)
[2. この記事では](#この記事では)
[3. 開発手法](#開発手法)
[4. 要件定義](#要件定義)
[5. 基本設計](#基本設計)
[6. 詳細設計](#詳細設計)
[7. 製造](#製造)
[8. テスト](#テスト)
[9. 終わりに](#終わりに)

# 背景

まだ１からリリースまでの開発を経験したことがなく、SESとして働く今でも経験不足から要件定義〜テストまでやれる案件が私には難しいところから、仕事ではないものの勉強として経験してみようと思い、その勉強結果を記録に残そうかと思いました。

途中で不備があったとしても、その内容を記事にまとめることができれば、失敗例も含めて記録できるのかと。

# この記事では

今回の作業過程毎に記事を作成して、この記事にまとめる用です。

# 開発手法

勉強中・・・

# 要件定義

https://qiita.com/ogu-bob/items/7add397ef77120c2a57d

# 基本設計

勉強中・・・

# 詳細設計

勉強中・・・

# 製造

勉強中・・・

# テスト

勉強中・・・

# 終わりに
Arch Linuxでの AMD ATI Mobility Radeon HD 5650/5 デバイスドライバの設定方法

Arch Linuxでの AMD ATI Mobility Radeon HD 5650/5 デバイスドライバの設定方法

まずは基本
```
sudo pacman -S xf86-video-ati
```
```/etc/X11/xorg.conf.d/20-radeon.conf
Section "Device"
    Identifier "Radeon"
    Driver "radeon"
EndSection
```

そして、Advanced settings.

```
yay -S xf86-video-amdgpu mesa-vdpau rocm-opencl-runtime vulkan-radeon
```

```
# /etc/environmentに以下を追加
LIBVA_DRIVER_NAME=radeonsi
LIBVA_DRIVER_PATH=/usr/lib/dri/radeonsi_drv_video.so
VDPAU_DRIVER=radeonsi
DISABLE_LAYER_AMD_SWITCHABLE_GRAPHICS_1=1
VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/radeon_icd.i686.json:/usr/share/vulkan/icd.d/radeon_icd.x86_64.json
RADV_PERFTEST=rt,gpl,nv_ms # Ray Tracing等の有効化
```

これで、動きました。
僕の環境では基本機能しか必要でないため、advanced settingsは無効にし、シンプル化しています。
【豆知識】入力フォームと表示形式の理解

# はじめに
今回は表題にある通り、入力形式の時のコードの書き方とただの表示形式のコードの書き方が今になり、少し理解したので、簡単な例を挙げてアウトプットしたいと思います。

## 環境
- Windows, WSL
- Docker
- Ruby 3.2.3
- Rails 7.1.3



## **1. フォーム形式で表す**
マイページの情報を編集する画面を作成している想定です。メールアドレス、名前、アバター画像を編集できるようなコードとなっています。
```
<%= form_with(model: current_user, local: true) do |f| %>
  <div class="mb-3">
    <%= f.label :email, class: 'form-label' %>
    <%= f.email_field :email, class: 'form-control' %>
  </div>
  <div class="mb-3">
    <%= f.label :full_name, class: 'form-label' %>
    <%= f.text_field :full_name, class: 'form-control' %>
  </div>
  <div class="mb-3">
    <%= f.label :avatar, class: 'form-label' %>
    <%= f.file_field :avatar, class: 'form-control' %>
  </div>
  <%= f.submit 'Update', class: 'btn btn-primary' %>
<% end %>

```

### **特徴**

- **入力フィールド**: ユーザーが情報を入力するためのフィールド（`email_field`, `text_field`, `file_field`）が使われています
- **`form_with`メソッド**: これはRailsのフォームビルダーで、モデルに基づいたフォームを簡単に作成できるものです。`model: current_user`で、現在のユーザーの情報をフォームにバインドしています。
- **CSSクラス**: Bootstrapのクラス（例: `form-label`, `form-control`）が使われていて、スタイルが整っています。

## **2. 表示形式**
次は先ほどの編集画面とは異なり、単純にマイページで自身の情報を確認できる画面のコードとなります。
```
<div class="mb-3">
  <label class="form-label">Email</label>
  <p class="form-control-plaintext"><%= current_user.email %></p>
</div>
<div class="mb-3">
  <label class="form-label">Full Name</label>
  <p class="form-control-plaintext"><%= current_user.full_name %></p>
</div>
<div class="mb-3">
  <label class="form-label">Avatar</label>
  <p>
    <%= image_tag current_user.avatar_url, class: 'rounded-circle', size: '50x50' %>
  </p>
</div>

```

### **特徴**

- **情報表示**: `current_user.email`や`current_user.full_name`を表示するための部分になります。ユーザーの情報を直接表示するだけなので、入力フィールドはありません。
- **`form-control-plaintext`クラス**: これはBootstrapのクラスで、読み取り専用のテキストを表示するために使われています。スタイルがシンプルで、編集できないことを示しています。
- **`image_tag`**: アバター画像を表示するために使われていて、`current_user.avatar_url`でユーザーのアバター画像のURLを取得しています。

### **まとめ**

- フォーム部分はユーザーが情報を入力するためのインターフェースで、モデルと連携してデータを送信する役割があります。
- ユーザー情報表示部分は、すでに登録されている情報を見せるだけで、変更はできないようになっています。

この2つは、ユーザーのプロフィールを表示しながら、情報を更新するためのインターフェースを提供するために組み合わせられているもの。少し修正するだけで表示形式に変えたり、編集できるようなフォーム形式に変えたりと、便利だなと感じました。
🌟 Just Published: Google Cloud Digital Leader Exam - Your Ultimate Preparation Guide! 🌟

# 🌟 Just Published: Google Cloud Digital Leader Exam - Your Ultimate Preparation Guide! 🌟
![Professional-Machine-Learning.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442951/e5101852-ee7d-8456-f119-155708ba1ec3.jpeg)

Source: https://awslagi.com/course/google-cloud-digital-leader-actual-exam/

🚀 Exciting news, everyone! The **Google Cloud Digital Leader exam** is now live, and it's time to gear up for success! Whether you're looking to validate your foundational knowledge of Google Cloud or aiming to stand out in the ever-growing cloud industry, this certification is your key to unlocking new opportunities.

## About the Google Cloud Digital Leader Exam
This certification is designed for individuals who want to demonstrate their understanding of Google Cloud's core products and services. It covers the essential concepts of cloud computing, the benefits of Google Cloud, and how to use Google Cloud's tools to achieve business objectives.

## Exam Format
- **Number of Questions:** Approximately 50 multiple-choice questions.
- **Duration:** 90 minutes.
- **Passing Score:** 70%
- **Delivery Method:** Online proctored or at a testing center.

## Exam Preparation
1. **Official Google Cloud Study Guide:** Start with the official resources provided by Google. They offer comprehensive guides that cover all exam topics.
2. **Practice Tests:** Take advantage of practice exams to familiarize yourself with the question format and time constraints.
3. **Hands-On Labs:** Get practical experience with Google Cloud services by completing hands-on labs. This will solidify your understanding and boost your confidence.

## Benefits of Certification
- **Career Advancement:** Stand out to employers with a Google Cloud certification on your resume.
- **Skill Validation:** Prove your knowledge of Google Cloud's core products and services.
- **Industry Recognition:** Join a global community of certified professionals who are recognized for their cloud expertise.

## Requirements
- No prior Google Cloud experience is required, but a basic understanding of cloud computing concepts is beneficial.

## Target Audience
- **Business Professionals:** Understand the value of Google Cloud in driving business objectives.
- **Technical Specialists:** Gain a foundational understanding of Google Cloud's products and services.
- **New to Cloud:** Perfect for those starting their cloud journey and looking to build a solid foundation.

Prepare now, practice diligently, and you’ll be on your way to becoming a **Google Cloud Digital Leader**. Start your journey today and achieve the certification that sets you apart!

---

Good luck to everyone preparing for the exam! 💪
Common Lisp風のLISPを作ってみる（４．コンスバッファ）

今回は、コンスバッファと私が呼んでいるモジュールを解説します。みなさんご承知のように、リスト`'(1 2 3)`の先頭に要素`4`を付け加えるのは容易ですが、末尾に付け加えるのは容易ではありません。また、リストは先頭から読むことはできますが末尾から読むことはできません。単方向リストだからです。だからLispの初心者は`reverse`関数を使っていい感じにまとめることを学びます。コンスバッファは、先頭と末尾の要素のアドレスを保持することで`reverse`関数を用いずにリストの末尾に要素を追加します。
[ソースコード](https://github.com/haruo-wakakusa/my-lisp2/tree/main/chapter04)
## cons_buffer.h
まずヘッダーファイルから見ていきます。
```cons_buffer.h
/*
 * cons_buffer.h
 */

#ifndef CONS_BUFFER_H_
#define CONS_BUFFER_H_

typedef void * CONS_BUFFER;

CONS_BUFFER cons_buffer_allocate(void);
void cons_buffer_add(CONS_BUFFER buf, void *obj);
void *cons_buffer_get_list(CONS_BUFFER buf);
void cons_buffer_free(CONS_BUFFER buf);

#endif
```
文字列バッファの時と同じように、バッファの構造自体はソースファイルに記しています。
## cons_buffer.c
ソースファイルを上から見ていきます。`CBUF_HEADER`構造体がリストの先頭と末尾のアドレスを保持します。
```cons_buffer.c
/*
 * cons_buffer.c
 */

#include <stdlib.h>
#include "cons_buffer.h"
#include "../chapter02/type.h"
#include "helper.h"

typedef struct {
    CONS *top;
    CONS *last;
} CBUF_HEADER;
```
`cons_buffer_allocate`関数はコンスバッファを初期化します。
```cons_buffer.c
CONS_BUFFER cons_buffer_allocate(void) {
    CBUF_HEADER *h = (CBUF_HEADER *)malloc(sizeof(CBUF_HEADER));
    h->top = NIL;
    h->last = NIL;
    return (void *)h;
}
```
`cons_buffer_add`関数はリストの末尾に要素を追加します。コンスバッファが何もデータを持っていない場合と持っている場合で処理が異なることに注意してください。
```cons_buffer.c
void cons_buffer_add(CONS_BUFFER buf, void *obj) {
    CBUF_HEADER *h = (CBUF_HEADER *)buf;
    if (h->top == NIL) {
        h->top = (CONS *)cons(obj, NIL);
        h->last = h->top;
    } else {
        h->last->cdr = (CONS *)cons(obj, NIL);
        h->last = h->last->cdr;
    }
}
```
`cons_buffer_get_list`関数はコンスバッファが持っているリストを取得します。
```cons_buffer.c
void *cons_buffer_get_list(CONS_BUFFER buf) {
    return (void *) ((CBUF_HEADER *)buf)->top;
}
```
`cons_buffer_free`関数はコンスバッファを解放します。
```cons_buffer.c
void cons_buffer_free(CONS_BUFFER buf) {
    free(buf);
}
```
## helper.h
ヘルパー関数をまとめたファイルである、`helper.h`, `helper.c`を見ていきましょう。これらのファイルは、必要に応じて関数が追加されていきます。
```helper.h
/*
 * helper.h
 */

#ifndef HELPER_H_
#define HELPER_H_

void * cons(void *car1, void *cdr1);

#endif
```
## helper.c
今回は`cons`関数を書きました。Lispの`cons`関数のようにコンスセルを返します。
```helper.c
/*
 * helper.c
 */

#include <stdlib.h>
#include "helper.h"
#include "../chapter02/type.h"

void * cons(void *car1, void *cdr1) {
    CONS *c = malloc(sizeof(CONS));
    c->h.type = TYPE_CONS;
    c->car = car1;
    c->cdr = cdr1;
    return (void *)c;
}
```
Salesforceの見え方がちょっと変わる「表示密度」について調べてみた

本橋孝昭です

今回はSalesforceの見え方がちょっと変わる「表示密度」について解説します

設定はこちらの右上のマークをクリックしたら「表示密度」が現れます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/d4bd6921-661a-9f24-b37c-e1df430cf53f.png)

表示密度を「コンパクト」にすると項目の並びがこのようになります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/82c29d6b-b582-30ae-eae2-53cb3f8b6295.png)


表示密度を「カンファタブル」にすると項目の並びがこのようになります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/0ec2fbcc-4137-a7d1-aa65-5215541e103e.png)

項目名の横に項目値が表示されるのが「コンパクト」
項目名の下に項目値が表示されるのが「カンファタブル」ですね


最後にヘルプの注意事項を確認しましょう

>密度を変更すると、ページが即座に再読み込みされるため、事前に変更を保存しておきます。複数のブラウザータブを開いている場合、新しい表示密度設定を確認するには、使用中の別のタブを更新します。

このように密度を変更すると読み込みに時間がかかるため注意をしましょう

https://help.salesforce.com/s/articleView?id=sf.user_overview_lex.htm&type=5
Vuetifyで2か月カレンダーが並んだDatePickerをつくる

もともとはFlatpickrでやってたやつを移植するために作ったもの。
消えてしまうのも惜しいのでおいておく。
左右のカレンダーをうまく動かすのに一工夫いる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61516/7f9344df-7730-2d79-3e56-31e19715058e.png)

[CodePen](https://codepen.io/nogutk/pen/poXZyoy)

---

**HTML**

```html
<script type="text/x-template" id="app-template">
  <v-app>
    <v-card>
      <v-date-picker
        v-model="range"
        :day-format="dayFormat"
        locale="ja-jp"
        next-icon=""
        no-title
        :picker-date.sync="leftPicker"
        range
      />
      <v-date-picker
        v-model="range"
        :day-format="dayFormat"
        locale="ja-jp"
        no-title
        :picker-date.sync="rightPicker"
        prev-icon=""
        range
      />
    </v-card>
  </v-app>
</script>

<div id="app"></div>
```

**CSS**

```css
/* 月送りの矢印を隠す */
.v-picker--date:first-of-type
  .v-date-picker-header
  button.v-btn--round:last-of-type {
  z-index: -1;
}
.v-picker--date:last-of-type
  .v-date-picker-header
  button.v-btn--round:first-of-type {
  z-index: -1;
}

/* 土日の色を変える */
.v-date-picker-table--date thead th:first-of-type {
  color: rgba(255, 0, 0, 0.62);
}
.v-date-picker-table--date thead th:last-of-type {
  color: rgba(0, 0, 255, 0.62);
}
```

**JS**

```JavaScript
const App = {
  template: '#app-template',
  data: () => ({
    range: ['2024-01-11', '2024-02-09'],
    leftPicker: '2024-01',
    rightPicker: '2024-02',
  }),
  watch: {
    leftPicker(val) {
      const d = dateFns.parse(val, 'yyyy-MM', new Date())
      const rd = dateFns.addMonths(d, 1)
      const f = dateFns.format(rd, 'yyyy-MM')
      this.rightPicker = f
    },
    rightPicker(val) {
      const d = dateFns.parse(val, 'yyyy-MM', new Date())
      const ld = dateFns.subMonths(d, 1)
      const f = dateFns.format(ld, 'yyyy-MM')
      this.leftPicker = f
    }
  },
  methods: {
    dayFormat(date) {
      return new Date(date).getDate()
    }
  }
}

new Vue({
  vuetify: new Vuetify(),
  render: h => h(App)
}).$mount('#app')
```
(BizRobo!)変数(文字列)内に指定の文字列が何個含まれているかDSでカウントする方法

# はじめに
対象文字列中に含まれる文字列の数をカウントする方法です。
例えば、対象文字列が「りんごみかんりんごりんごぶどう」なら「3
対象文字列「りんごみかん」なら「1
対象文字列「みかん」なら「0」
といった数をカウントする方法の記事です。

# カウント方法
以下の①,②,③の文字数をそれぞれ変数に取得し、
(② - ③) / ①の形で計算すれば取得可能です。

①カウントしたい文字列の文字数
②対象文字列の文字数
③対象文字列からカウントしたい文字列を全て削除した文字列の文字数

文字列の文字数を数えるには、エクスプレッションでlength関数を利用します。
~~~
length([変数])
~~~
上記のような形にすれば変数内の文字列の文字数を調べられます。
変数ではなく>><<や""で囲った文字列を直接入力しても大丈夫です。

③を取得するには、対象となる文字列(りんご)を全て削除する必要がありますが、以下のようにreplaceText関数(replacePattern関数でも可)を利用することで、対象文字列から指定した文字列に該当するものを全て置換できます。

~~~
replaceText([対象文字列変数],[指定文字列変数],>><<)
~~~~
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2736479/a0706583-34a4-2278-0020-ab78a3d8e0d5.png)
上記は該当した文字列を>><<で置き換えて削除する形にしています。

Excelでいうところの以下の作業をやる感じですね。
https://learn.microsoft.com/ja-jp/office/troubleshoot/excel/formulas-to-count-occurrences-in-excel

# まとめ
今回は簡単ですが、以前COMMUNITYで見かけた質問をもとに記事にしました。
半ば算数の問題になっていますね。
地図をグリッチさせる

# やること
- WEB地図でグリッチアートする

### 利用ライブラリー
- Maplibre GL JS

https://github.com/maplibre/maplibre-gl-js/

- VFX-JS

https://amagi.dev/vfx-js/

### グリッチアートとは

https://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%AA%E3%83%83%E3%83%81%E3%82%A2%E3%83%BC%E3%83%88

# 方法
- Maplibre GL JSで地図を描画
- MaplibreのgetCanvasメソッドでCanvasにアクセス
- VFX-JSでCanvasにエフェクトをかける

```javascript
import {VFX} from '@vfx-js/core';
import {Map} from 'maplibre-gl';

let mapContainer: HTMLDivElement;
const map = new Map({
			container: mapContainer,
			style: `https://api.maptiler.com/maps/jp-mierune-dark/style.json?key=${MAPTILER_KEY}`,
			center: [139.767125, 35.681236],
			zoom: 12,
			hash: true,
			attributionControl: false
});

const vfx = new VFX();
const canvas = map.getCanvas();
function drawCanvas() {
	vfx.update(canvas);
	requestAnimationFrame(drawCanvas);
}
drawCanvas();

vfx.add(canvas, { shader: 'glitch', overflow: 100 });
```

# 結果

![Kapture 2024-08-15 at 02.18.15のコピー.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2788/593c6d76-4ab5-5892-efeb-b8f377a8a5f0.gif)


![Kapture 2024-08-15 at 02.20.47のコピー.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2788/07b6ae17-291a-3096-707b-f5a894234874.gif)

このまま地図をグリグリ動かせます

### 注意点

- プリセットのエフェクトは、かけると地図のコントローラーなどの要素が見えなくなってしまうものが多い（ノーマルなグリッチは大丈夫だった）

### 感想

- お手軽にエフェクトをかけることができるVFX-JSは最高です
- グリッチ好きな私としては、10数分でこの効果が出せたので、満足度が高いです