OmniAICreator/Qiita-1.07M huggingface dataset:
Visual Studio Code のインストール方法

ごきげよう、百合宮桜です。
市民開発者向けに Visual Studio Code のインストール方法を書いていきます。
私は、Windows を使用しているので、以降の説明は Windows の画面です。
市民開発者はITの専門家ではありません。
なので英語のサイトを見て、ぞわぞわするよりは Microsoft Store を使う方が良いんじゃないかと思って、あえて Microsoft Store からのインストール方法を記載しています。

## 他OS の方へ
サイトからダウンロードも可能です。
https://code.visualstudio.com/download
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/bc1e63f0-843d-6958-05ef-e490f21a87c1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/52796ff9-8db1-286f-f616-47564227f8f6.png)

# インストール方法
1. Microsoft Store を開きます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/11e6b651-7267-07b7-893e-7c2f4f496468.png)

2. 画面上部の検索ボックスで「visual studio code」と検索します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/1cd6b8ba-7021-5ef7-0b02-e01763622054.png)

3. 「Visual Studio Code」の「インストール」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/4396a343-5e7e-7780-5c21-ffb0847a0634.png)

4. インストールが完了すると、インストールボタンが無効化され、「インストール済み」と表記されます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/066056b7-c7e1-0b67-6adf-46580cb2cdaf.png)

# Visual Studio Code を起動する
1. タスクバーの検索ボックスに「visual studio code」と入力します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/0ead6cb0-e8e0-fded-f2c5-481d44324de0.png)

2. 「開く」をクリックして起動します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/b6e69ddd-801c-4343-ca22-e7d4bdd68fc0.png)

3. 「Visual Stuidio Code」が開きます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/d483796b-bf20-5dbe-21e5-9f819fb53b61.png)

# 日本語化する
英語のままでは使いにくいので、日本語化します。

1. 拡張機能のボタンをクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/3a6d8fa4-2f80-2a8b-6979-fd80b2052c56.png)

2. 画面上部の検索ボックスに「Japanese」と入力します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/8a164c32-f6f8-ad75-627b-33b3d7438605.png)

3. 「Japanese Language Pack for Visual Studio Code」の「install」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/0915997e-9fb9-8e9c-3606-6837a3626c15.png)

4. 画面右下の再起動を促す通知が出てくるので、クリックして再起動します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/dc5b5f89-0392-34bb-601b-1ad97731fbe6.png)

5. 日本語化されたことが確認できます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/e38d91fe-a730-c163-1e67-5fe6b0a14fe4.png)
【2023年9月版】AWS Well-Architectedフレームワーク要点整理（備忘用）

## 背景
クラウドプラクティショナー試験対策
## 課題
AWS Well-Architectedフレームワークの要点が整理できていない
## 対策
AWS Well-Architectedフレームワークの要点が整理を書き出しまとめる
## 書き出し
### AWS Well-Architectedフレームワークとは何か
AWSで構築するシステムの設計や実行のための主要な概念や設計原則、ベストプラクティスをまとめた資料。
全体的な設計原則と、「6つの柱」と呼ばれるジャンルごとの設計原則とベストプラクティスから構成。
### 6つの柱とは
* オペレーショナルエクセレンスの柱（運用上の優秀性） 
* セキュリティの柱
* 信頼性の柱
* パフォーマンス効率の柱
* コスト最適化の柱
* 持続可能性の柱
### オペレーショナルエクセレンスの柱（運用上の優秀性）とは
システムの実行とモニタリング、およびプロセスと手順の継続的な改善に焦点。
#### 具体例
変更の自動化
イベントへの対応
日常業務を管理するための標準化

### （以降適宜追加予定）


### 参考
https://aws.amazon.com/jp/architecture/well-architected/?wa-lens-whitepapers.sort-by=item.additionalFields.sortDate&wa-lens-whitepapers.sort-order=desc&wa-guidance-whitepapers.sort-by=item.additionalFields.sortDate&wa-guidance-whitepapers.sort-order=desc
Tableau LOD表現の沼に高頻度でハマる話

## はじめに
この記事は得られた知見を共有しようというものではなく、嘆きです。嗚咽の副音声。
業務でTableauを使うようになって４年ほど経つのに、未だにLODで苦しみ続けてます。

生データを事業のDBから引っ張る事が多いので、業務でLOD計算は多用しています。
が、正しく理解できているかかなり怪しく、沼にハマる度に調べてやりたいことは出来るが、定期的に再発する現状です。

## あがき
そんな中でも自分なりにしっくりきた、理解が深まったのでは？という部分。

**詳細レベル**
LOD、Level of Detailで詳細レベル。
詳細レベルとはなんぞや。一般的によく聞く単語すぎて逆にピンと来ない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986320/7d561172-3ea7-37d0-4aeb-322193484951.png)
　　　↑ここの粒度（レベル）の事だと思う。
行列のディメンションだけならイメージはしやすいが、マークの粒度も該当する。（色・サイズも粒度が分かれるので影響する。）

**FIXEDもフィルターの影響を受けないわけではない**
処理の順番だと④より上にあるので影響なさそうなイメージ
>①抽出フィルター
>②データソースフィルタ
>③コンテキストフィルタ
>**FIXED(LOD)**
>④ディメンションフィルタ
>　INCLUDE/EXCLUDE(LOD)
>⑤メジャーフィルタ
>⑥表計算フィルタ

が、詳細レベルに指定したディメンションと同一のディメンションのフィルターの影響は受けるので注意。
（書いてみたら当たり前の事だった。。。でも僕は何度か引っかかりました。）

**FIXED（LOD）でディメンションを作る**
LODについて調べると、よく例として詳細レベルの四則演算が出てきますが、
FIXEDなら条件式を使ったディメンションを作ることもできます。

例）
{ FIXED [ディメンション]:MAX(IF [メジャー]>0 THEN 'aaa' ELSE 'bbb' END) }
{ FIXED [ディメンション]:MAX(IF [メジャー]>0 THEN 1 ELSE 0 END) }
後者はメジャーとしても使えます。

## あとがき
Vizの表示速度を考えるとデータソース側に計算結果を用意した方いい気がするけど、
見たい粒度って結構後から増える事が多いので、LODはちゃんと理解しておきたいです。

あくまで僕の認識なので、間違ってたりもっといい考え方があったりとかすると思うので、
もしよければ教えてください；


以上です！
ようつべ体験記7

[前回](https://qiita.com/matsukatsu/items/0e141e4d68afa7f0d74d)

前回の投稿で、今月の方針を決めました。

> 今月は東南アジアと西ヨーロッパを交互に公開して、まずは視聴回数を増加させる方針にします。

方針に従って `西ヨーロッパ2` を作成し公開しました。
公開2日で、2週前に公開した動画の視聴回数を抜き去りました。
![チャンネルアナリティクス.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/9b024675-8c59-3ce4-0181-61c1e16c4d5b.png)

自身のチャンネルの視聴回数について分析し、コンテンツ作りに反映したら、視聴回数に関しては増加させられました。

[YouTube のヘルプ](https://support.google.com/youtube/answer/11914225?hl=ja&co=YOUTUBE._YTVideoType%3Dvideo#:~:text=%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E3%81%AE%E6%96%B9%E6%B3%95-,%E8%A6%96%E8%81%B4%E8%80%85%E3%81%8C%E5%A5%BD%E3%82%80%E5%86%85%E5%AE%B9%E3%81%AB%E6%B3%A8%E5%8A%9B%E3%81%97%E3%81%BE%E3%81%97%E3%82%87%E3%81%86,-%E3%80%82%E8%A6%96%E8%81%B4%E8%80%85%E3%81%8C)にこのように書かれています。

> おすすめの方法
視聴者が好む内容に注力しましょう。視聴者が見たいものを作っていれば、おすすめにも表示されるようになります。

何も考えなかったり、自分の思い入れではなく、「視聴者が好む内容」という事が少し体感できた気がします。

[次回](https://qiita.com/matsukatsu/items/9293c465074712e7b3a2)
Snowflake認定資格用のサイトにログインできないと思ったら

## 結論

Email Addressの入力欄には、Candidate ID(SNOW〜で始まるID)を入力するとよい。

<https://snowflake.useclarus.com/login?forward_url=%2F>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475867/a07f6ee3-af46-4601-fe02-5e07fa177bb8.png)

同じことで悩んでいる、困っている人がいたらと思ってご参考に。


## 背景

Snowflakeの認定資格(SnowPro Core等)を受けようとすると、新たに
「Snowflake Certification Portal account」なる別のアカウント登録が必要となる。

<https://learn.snowflake.com/en/certifications/>
Snowflake公式の学習サイトから、認定資格の内容を確認しつつ...


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475867/3c0b6d09-8e82-91ea-0fcc-b508ed8aab9a.png)

「CREATE ACCOUNT」をクリックすると <https://snowflake.useclarus.com/login?forward_url=%2F> のページに遷移する。

<https://snowflake.useclarus.com/login?forward_url=%2F>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475867/a07f6ee3-af46-4601-fe02-5e07fa177bb8.png)

その後、「To start the registration process, fill out a basic profile.」と記載している部分のリンクをクリックしてアカウント登録をする。

登録が完了すると、Snowflake認定資格用のID (Candidate IDなるもの)が発行される。

このIDと紐づけて資格取得状況等を管理する模様。
テストセンターへの申し込みのこちらから行う。

アカウント登録が完了したまではいいとして、後日このサイトにログインしようとすると大抵の場合困惑することになる（と思われる）。

## 久しぶりにログインしてみる

- さて、そろそろSnowPro Coreを受験してみようかな。
- 確か認定資格用の専用サイトに入るんだったな。
- サイトにアクセスして、「Email Address」と「Password」を入力...と。
- ログイン、ポチ
- !?

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475867/45e8344d-1143-c17a-f200-29796bf4b8f6.png)

入れない。
確かに正しいメールアドレスとパスワードを入れているのにも関わらず。

パスワードリセットをすると入ることができるが、毎回パスワードリセットが必要？と勘違いしてしまう。

## そして解決へ...

日を置いたり、ブラウザを変えたり...
何度試してもマジで入れない。


で、ふと思い立った。

メールアドレスじゃないのでは...

物は試しで「ID」を使ってみよう。SNOW〜で始まるIDね。

すると...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475867/9989ff9c-f9a6-7d97-a6f3-c24a9d07100c.png)

入れた!

どうやら誤記らしい。
もしくはメールでも入れる仕様だったのかもしれない。

かれこれ5回くらいパスワードリセットをしてしまったのだった。
複数チェックボックスで要素の表示非表示を切り替える

備忘録と勉強のために残しておくだけ。

# 要件

1. 以下の項目を記載したチェックボックスを作成
・りんご(value = apple)
・バナナ(value = banana)
・みかん(value = orange)

2. 各項目のvalueと同じクラス名をもつdivを作成

    ```
    <div class="apple">りんご</div>
    <div class="banana">バナナ</div>
    ...
    ```

3.  2で作成したdivの初期状態は非表示

4. 1で作成したチェックボックスをオンにしたら、valueに対応したdivに.selectedクラスをつける

5. .selectedがついたdivを表示する

6. チェックボックスはオフになったら、対応しているdivの.selectedクラスを削除する

## コードとデモ
JSに関してはコードの中にコメントあり。

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="abPBRpz" data-user="mamenon" style="height: 300px; 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/mamenon/pen/abPBRpz">
  複数チェックボックスJS</a> by mamenon (<a href="https://codepen.io/mamenon">@mamenon</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>
Unsupervised Domain Adaptation for Detection Transformer (DETRのための教師なしドメイン適応)

# DETRのための教師なしドメイン適応
Detection Transformer(DETR)は近年発表された手法で，物体検出のアーキテクチャにTransformerを入れたものであり，かなり高精度なものとなっています．
教師なしドメイン適応は学習データとドメインの異なるデータを入力されたときに精度が低下してしまう問題を改善するタスクであり，DETRにおいてもこれが研究されています．
今回はそのような論文についていくつかまとめてみました．
<iframe src="https://www.slideshare.net/slideshow/embed_code/key/kGMbktjlHUGG7z?hostedIn=slideshare&page=upload" width="476" height="400" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>


参考文献はこちら
- [DA-DETR: Domain Adaptive Detection Transformer With Information Fusion](https://openaccess.thecvf.com/content/CVPR2023/html/Zhang_DA-DETR_Domain_Adaptive_Detection_Transformer_With_Information_Fusion_CVPR_2023_paper.html)
- [Exploring Sequence Feature Alignment for Domain Adaptive Detection Transformers](http://arxiv.org/abs/2107.12636)
- [Improving Transferability for Domain Adaptive Detection Transformer](http://dx.doi.org/10.1145/3503161.3548246)
- [Cascading Alignment for Unsupervised Domain-Adaptive DETR with Improved DeNoising Anchor Boxes](http://dx.doi.org/10.3390/s22249629)
【Xcode】ターミナルからXcodeプロジェクトを開く

# はじめに
昨日、VSCodeをターミナルから開く方法を記事にしました。
VSCodeができるならXcodeもできるのでは？
と思い調べたらできたので記事にしておきます

# やりかた
```:ターミナル
cd 開きたいプロジェクトのフォルダパス
```

```:ターミナル
xed .
```

![スクリーンショット 2023-09-05 21.19.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/d84a51dc-f32a-9369-1539-d534d53c02a8.png)

# おわり
こんなに簡単にできるんですね
でもなぜ`xed`？？笑
Oracle Database（Oracle APEX）で登録日や更新日の列を機能させる方法（トリガー）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072159/e0411cc3-affc-e8d6-84dc-b4a4495beb2e.png)

## はじめに

表の列にレコードの登録日や更新日を設定したい場面は多いと思いますが、実装に意外に手間取ったので、記録を取りたいと思います。
サンプルデータを作って、実装してみました。
## デモデータの準備

```SQL
create table sample(
    ID number(20),
    first_name varchar2(50),
    last_name varchar2(50),
    salary number(20),
    REGISTER_ON date,
    UPDATE_ON date
    );
```

```SQL
insert into sample
    (ID,
    first_name,
    last_name,
    salary) 
VALUES
    (1,'TARO','SUZUKI',1000);

insert into sample
    (ID,
    first_name,
    last_name,
    salary) 
VALUES
    (2,'HANAKO','YAMADA',2000);

insert into sample
    (ID,
    first_name,
    last_name,
    salary) 
VALUES
     (3,'YUKI','YAMADA',1500);
```



```SQL
describe sample;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072159/19192073-892e-bb64-1b8c-843387ce72af.png)

```SQL
select * from sample
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072159/0946e70b-790b-52c6-b20f-3c8a637efb5a.png)

以上のようにサンプルデータを用意しました。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072159/0367b68d-e904-595b-2fa9-cf27ea2793d7.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072159/18045516-4842-e0f9-b017-fb83f91f41ab.png)

APEXの画面で見ると以上のようになります。

Register On（登録日）やUpdate ON(更新日)に関しては何もデータ入力していないので、空っぽです。


## 登録日と更新日を記録する方法

結論から言うと、トリガーを使用します。
以下がトリガー作成のコードです。

```SQL
create or replace trigger "SAMPLE_TABLE_BIU"
before insert or update on SAMPLE
    for each row
begin

    if inserting then
        :new.register_on :=localtimestamp;
        :new.update_on   :=localtimestamp;
    end if;
    if updating then
        :new.update_on   :=localtimestamp;
    end if;
end;

```

トリガーは作成するだけでなく有効化しないと発動されないので、有効化まで行います。

```SQL
ALTER TRIGGER "SAMPLE_TABLE_BIU" ENABLE;
```

以上で設定が完了しました！
実際に動きを見てみましょう。

## 結果


### ケース①TAROのレコードを更新してみる

現状、TAROのレコードは以下のように登録日、更新日は空っぽになっています

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072159/6f27eca9-6f9d-06e8-a365-54e86e1a3aac.png)


このレコードを更新してみます。

Salaryを1000から2000に変えてみます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072159/c0c4db31-7cd9-b158-cf80-2cbb164152e5.png)


そうすると更新日がトリガーの効果で入力されました！


### ケース②新規レコードを挿入してみる



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072159/b4ff0ad0-72c9-a857-f2fc-19e3f267dd0f.png)

以上の内容の新規レコードを挿入しました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072159/3c4ef573-9728-43cf-3b06-5a85e829385b.png)


登録日も更新日もトリガーによって入力されました！


## まとめ

レコードの登録日、更新日列の作成方法についてのまとめでした。
頻繁に使えるトリガーコードだと思うので、忘れないようにQiitaで記事を書いてみました。何かの参考になればと思います。
暗号資産(仮想通貨)ブログの始め方

4年に一度のビットコイン半減期で盛り上がるのがクリプト界隈。この記事では、これから暗号資産(仮想通貨)ブログを始める初心者の方へ向けて、暗号資産ブログで稼ぐ方法について解説しています。
https://side-business.blog/crypto-blog-start/
AzureのFunctionAppにDurableFunctionを作ってみましたが、503 Service Unavailable

AzureでFunctionAppを作って、その中にDurable Function(activity, orchestrator, HTTP starter)を作ってみました。
しかし、テストするとき、503 Service Unavailable　のHTTPResponseでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526348/06e29966-5d09-3e00-02ea-b755745c416d.png)

AzureのTroubleshootingツールを使って問題を発見しましょう。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526348/cdae3fe8-fadb-6143-4c71-8829e339b864.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526348/feef80eb-9d06-9687-8377-42383f5e66d8.png)

	
System.InvalidOperationException : Unable to resolve the Azure Storage connection named 'Storage'.

という問題があるようですが、なぜですか？

少し調べたところ、StorageAccountの設定に問題があるようです。

FunctionAppのConfigurationを確認して。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526348/c7e25a19-0f63-bbfc-7f31-4c664a8a1ad2.png)
確かにStorageAccountの設定はないですね（そもそも作ったときに設定すると言われなかった）

では設定しましょう。StorageAccountを作って、ConnectionStringをコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526348/08773edb-43bf-926e-d8d2-89991e807ecf.png)
FunctionAppに戻って、Configurationに新しい設定を追加します。
Name:AzureWebJobsStorage
Value:コピーしたもの
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526348/7956da64-941d-7a2e-4847-706d8efd096e.png)
Configurationを保存して、念のためFunctionAppも再起動させました。
再テストすると、503の問題が解消されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526348/5952db19-0287-baae-bebe-fb39278693a4.png)
Windowsで仮想環境とVScodeを使ってjupyter notebookでprophetを使う方法

# はじめに

Metaが開発した時系列データの統計予測モデルであるProphetですが、Windowsに関してはインストールに難があるという報告があります。

[Prophetのインストール方法（Windows） - インドネギヤ王国情報技術開発局](https://indonegiyaland.hatenablog.com/entry/2022/04/01/172211)

が、今回情報を集めてWindowsでもインストールできる方法を発見したので挑戦してみます。具体的には、

- Windowsで
- anacondaの仮想環境を使って
- VSCode上のjupyter notebookを使って
- prophetをimportできる

方法を述べています。

# 環境

- Windows 10 Pro 64 bit
- anaconda 22.9.0

# 手順

## anacondaで仮想環境を構築

[Anacondaで仮想環境を構築する方法 | sakizo blog](https://sakizo-blog.com/206/)を参考にconda環境を構築します。

myenvという名前のConda環境を構築します。このとき、PyEphem、Plotly、Cython、PyStanなどProphetが依存しているパッケージなども一緒にインストールします。これは[Prophetインストール手順](https://aisinkakura-datascientist.hatenablog.com/entry/2023/06/21/000045)を参考にしました。

```cmd
conda create -n myenv python==3.8 ephem plotly cython pyStan==2.19.1.1 holidays==0.24 prophet==1.1.2 pandas numpy matplotlib jupyterlab
```

pythonはバージョン3.8必須です。元記事ですと、`holidays`がなかったのですが、これがないと`TypeError: This is a python-holidays entity loader class.`エラーが発生します。また、`holidays`と`prophet`のバージョンを固定にしておくのもポイントです。

参考：[Cannot import prophet · Issue #2432 · facebook/prophet](https://github.com/facebook/prophet/issues/2432)


ここで、base環境（最初の状態で既にある環境）と、作成した環境を確認します。

```cmd
conda info -e
```

以下の様に出力されます。今使っている環境には\*が付きます。

```cmd
# conda environments:
#
base                  *  E:\****\anaconda3
myenv                    E:\****\anaconda3\envs\myenv
```

このとき、私はpowershellで実行していて*がつかなかったのですが、`conda init powershell`を実行してpowershellを再起動したところ正常に\*が出ました。

次のコマンドで作成したconda環境に移動します。

```cmd
conda activate myenv
```

もう一度`conda info -e`を実行すると、作成した`myenv`に*が移っていることがわかります。

```cmd
# conda environments:
#
base                     E:\usr\anaconda3
myenv                 *  E:\usr\anaconda3\envs\myenv
```

## VSCodeでjupyter notebookを起動する

myenv環境に移動したディレクトリでVSCodeを開き、jupyter notebookのファイル(*.ipynb)を作成します。そのファイルを開き、右上にある"base(python 3.9.13)"をクリックします。すると、画面上部中央に小窓が表示されますので、"Select another kernel..."をクリックします。順次、"Python environments...", "myenv Python(3.8.0)"とクリックします。すると、作成した仮想環境が設定されます。ここでjupyter notebookを作成して、`import prophet`すると、正常にインポートできます。

# おわりに

Windowsでprophetを使う方法について述べました。強力な時系列データの解析アルゴリズムなので是非使ってみましょう。
Go言語　ローカルパッケージのインポート

Go言語で main.go が大きくなってきたので分割したい。本格的にコードを書きたいと思った時に困った事が、GitHubに登録することなく、ローカルに分割したモジュールを利用する方法でした。

他のコードを参照して、見様見真似で分割して、`go run main.go` で実行しようとすると、`import cycle not allowed` や `is not in GOROOT` のエラーが発生してしまい、目的を果たすことができませんでした。

答えを探して、いろいろ検索しても、なかなか問題を解決する方法に出会えませんでした。いろいろ調べて整理できたので、忘備録として整理します。本記事は go v1.19 で検証しました。


## mainの書き方（インポートする側）

Go言語のインポートに以下の例に従って追記する。`tkr/mypkg` は モジュール名/パッケージ名となります。

```file:main.go
package main

import (
	"fmt"
	"net/http"
	"tkr/mypkg"  <-- ローカルパッケージも標準のパッケージと同じ様に記述
)

func main() {
<以下省略>
```

モジュール名は go.mod に指定するものと同じ名前であり、パッケージ名は、*.goの最初の行に指定する名前と同じです。


## go.modの作成

コマンド`go mod init <モジュール名>`を実行して、go.modを生成するか、それとも go.modを編集する。モジュール名は任意の名前で良い。

```file:go.mod
module tkr  <-- モジュール名

go 1.19
```


## パッケージ名でディレクトリを作成

パッケージ名のディレクトリの下には、任意の名前のファイルを配置できます。

```console
.
├── go.mod
├── main.go
├── mypkg
│   ├── myfunc.go
│   └── mypkg.go
└── README.md
```

パッケージのディレクトリに配置する .go ファイルの先頭には、パッケージ名を設定しなければなりません。

```file:myfunc.go
package mypkg

func Add(x int, y int) (int) {
```


## メインプログラムからの呼び方

関数などの頭にパッケージ名を付与して、関数名を記述します。

```
	ans := mypkg.Add(1,2)
```


## ビルド

以下のコマンドを実行すると、モジュール名と同じファイル名の実行形式が生成されます。

```
go build
```


## 参考資料
* [Golang Import Local Package](https://linuxhint.com/golang-import-local-package/)
* [Tutorial: Create a Go module](https://go.dev/doc/tutorial/create-module)
挫折したエンジニアと反発したエンジニアがタッグを組んでWebサービスを立ち上げた話

# 「お前、プログラミングに向いてないよ」
私は新卒2年目、エンジニア時代にして開発者になる道を断念した結果、SEになる道を選んだ元SEです。(今はITコンサルタントです。)

今でも鮮明に覚えています。会議室で、フローチャートと簡単な関数のレビューを受けたとき、一方的にダメ出しされて堪えられず、シクシク泣いていたことを。


<dl>
  <dt>上司</dt>
  <dd>「お前この程度の関数すらフローチャートに書き起こせないの？全然わかんないんだけど。絶対向いてないから、開発者になるのやめた方がいいよ？(教育担当)、お前はどう？」</dd>
  <dt>教育担当</dt>
  <dd>「んー...そうですねー。............(長い沈黙)、ハイ。」</dd>
</dl>

そんな私が辛い挫折経験を乗り越えて、とんでもなくすごいWebサービスを開発しました！！！

と、言いたいところですが、そんなこともなく。私は開発者になることをキッパリと諦め、SEになる道を選びました。

一方で、私と似たような境遇を通った旧友がいました。彼も上司からプログラミングが向いていないと言われていたのです。でも、彼は私の取った行動とは裏腹に、人からの心許ない意見に対して、それを糧にしたのです。彼は開発者になる道を選び、今も開発者としての役目を全うしています。

これはそんな彼と私が力を組んで、なんか良いモノ作ろう！と決めてWebサービスを立ち上げた話です。この記事では以下のことについて述べたいと思います。

# 目次
[1. こんな人に読んでほしい](#1-こんな人に読んでほしい)
[2. 立ち上げたWebサービス : Tech Course Rank](#2-立ち上げたWebサービス-:-Tech-Course-Rank)
[3. 2人で取り組むことのメリット・デメリット](#3-2人で取り組むことのメリット・デメリット)

# 1. こんな人に読んでほしい

* 個人で何かを開発してみたいと思っている人
* 自分が何を成し遂げたいか分からない人
* 挫折しそうな人


子供の成長に無限の可能性を信じるように
大人の成長にも無限の可能性があると信じたい。そうでありたい。

挫折したら違う道を選んでもいいし、同じ道を突き進んでもいい。あなたの行く手を阻むものは何もない。**ただやればいいだけです。**
少しでもそう思う人が増えたらいいなと思い、備忘録をつづりたいと思います。

# 2. 立ち上げたWebサービス : Tech Course Rank

Udemy、O'Reilly、CodeAcademyなどといったワードは聞いたことありますか？オンラインで様々な教育コースを受けることができる学習サイトです。

私たちはこれらの学習サイトで受講できるコースを、**１つのサイトでまとめてランキング形式で一覧表示できるWebサイト**を立ち上げました。


[Tech Course Rank](https://www.techcourserank.com/ "Tech Course Rank")
![Tech Course Rank](https://slack-imgs.com/?c=1&o1=ro&url=https%3A%2F%2Fwww.techcourserank.com%2Fimages%2Fog-image.jpg "Tech Course Rank")


**主にフロントエンジニアやバックエンドエンジニアなどのソフトウェアエンジニアにとって役立つコースを並べています。**

世の中には既に沢山のオンライン教育コースが公開されています。一体どれが一番良いコースなのか？別のサイトで、他にもっと良いコースが受講できるサイトがないか？そんなことを気にしたことはありませんか？
学習したい人にとっては、「どの学習サイト」よりも「**どのコース**」が自分にとって有益なのかが気になるはずです。私たちのサイトを使えば、世に出回っているコースの内、どのコースの評価が良いかを１つのWebサイトで見ることができます。

是非、エンジニアの方々には私たちのサイトを活用して、自分にとってベストなコースを見つけて欲しいと願います。

# 3. 2人で取り組むことのメリット・デメリット

<dl>
  <dt>メリット１　やりたくないことを押し付けあえる</dt>
</dl>

<strong>私は極力開発をしたくありません。</strong>メンドくさいです。コーディングでドツボにはまったとき、永遠かと思うぐらいトラシューに時間を要してしまうことを嫌います。
それなら、こなせることが分かる雑務をする方を選びます。

逆に、<strong>私の友人は開発以外のことを極力したくありません。</strong>自分の興味のないことに労力を使うことが苦痛のようです。

つまり、<strong>利害関係が一致しているんです。</strong>よって、なるべく私は開発以外の役回り、友人は開発に集中できる役回りをこなすことにしています。(彼はパッションがあるので私よりも多くの仕事量をこなしていますが汗)

<dl>
  <dt>メリット２　意見交換できる</dt>
</dl>

人によっては正しいことが、別の人にとっては正しくないことがあるかと思います。
2人で考えることで、自分1人の固定概念にとらわれず、<strong>よりフラットな目線で物事の良し悪しを見定めることができます。</strong>これはWebサービスのコンセプトを考える上でかなり有用だったかと思います。

<dl>
  <dt>メリット３　モチベを高めあえる・ケツを叩き合える</dt>
</dl>

「〇〇の調査、どう？」　→　「すまね、今日明日でやっとくわ」
「〇〇円の収益あがったよ、やったね！」
「グッジョブ！」

私たちは基本「無理なく、時間があったらこなそうぜ」といったスタンスで取り組んでいるので圧は少ないのですが、<strong>お互いの状況をフォローすることで、止まらずに前に進むことができます。</strong>また、お互いを讃えあったり、労うこともモチベーションに繋がりますね。

<dl>
  <dt>唯一のデメリット　意見がぶつかる</dt>
</dl>

意見交換できることはいいですが、意見がぶつかったときは妥協点を見つけたり、譲り合う必要があります。そういった場合、「こっちが正しいはずなのに、なぜ反対のことを言うんだろう？」と思ったり、前向きに物事を考えにくくなります。

相手が誰であろうと2人以上で何かに取り組む以上は起こりえることです。私の場合は、「相手」そのものを真っ向に否定するのではなく、「相手の考え」と向き合うようにしていたりします。その上で「相手」を理解すると、意外と「あ、だからその考えに至ったのね」と腑に落ちたりします。

長くなってしまったので、続きは続編で述べたいと思います。続きはリリースまでにやったことや、気をつけたことに触れたいと思います。
ROSA upgrade記録 4.12.25 -> 4.12.26

使用中のROSAのクラスターでOpenShiftのupgradeが利用可能になると、`New upgrade version available`というメールが届きます。
![mail1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2164968/ada7c29c-2101-65c9-2256-5d7f373c1192.png)

クラスター名をクリックすると、Red Hat Hybrid Cloud Consoleが起動し、そのクラスターが表示されます。`Update`をクリックします。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2164968/cc6bebdf-5989-0694-c087-ab8283b9cc72.png)

Update clusterというパネルが表示されます。`Next`をクリックします。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2164968/aecbf67c-6f87-b7af-c754-d12d24703113.png)
デフォルトでは1時間以内にUpdateが開始するようスケジュールされます。`Next`をクリックします。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2164968/c519d6c8-9e12-4949-5efe-4f72aedb9fd3.png)
`Confirm update`をクリックします。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2164968/9ca84bfa-fef6-3571-ccf2-168dbc825937.png)
Updateがスケジュールされました。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2164968/4ab4cf87-888b-7d0a-1555-b150ae511808.png)
元の画面に戻ります。（この時点ではCancelすることも可能のようです。）
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2164968/3be1f7a5-aa40-0b6e-5abb-a05ef6164f68.png)
Updateがスケジュールされると、`Upgrade maintenance scheduled`というメールが届きます。
![mail2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2164968/279ea910-5fe3-30f5-f5be-3d7000b652bc.png)
しばらくすると、スケジュールされた時刻も表示されていました。
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2164968/aea0d521-4fb1-8e58-79a4-7741bb01e7b2.png)
Updateが始まる頃`Upgrade maintenance beginning`というメールが届きます。
![mail3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2164968/3f09e141-5acf-e5da-093f-2b38633db6d9.png)
Updateが開始しました。
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2164968/db66cc8a-fbc6-7568-e136-e23b4ce38c7f.png)
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2164968/f0d7cf33-d1a9-676f-8602-6dc7465a0f8c.png)

完了すると `Upgrade maintenance completed` というメールが届きます。
![mail4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2164968/4c91c135-3022-9bad-b2f7-8a19af49d8c2.png)
しかし、この段階では`Ready`にはなっているものの、本来のノード数より多い状態です。
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2164968/4295aa52-705f-4a5e-fa6f-75b4b8391b80.png)
10分程度すると、Upgrade後のバージョンで通常の状態に復旧しました。
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2164968/f7b4e484-2cf4-1d04-3611-de3338b2406c.png)

今回の場合、メール通知 `Upgrade maintenance beginning` から `Upgrade maintenance completed` まで2時間40分かかっていました。
ド根性エンジニアの奮闘記1.JavaScriptを使うな？

初めまして

本記事が<font color="red">初めて</font>の投稿となります。

私が実際に経験している<font color="blue">怖い話</font>です。

客先勤務にて、派遣エンジニアをしています。
客先常駐のPMに
PM「よし、○○君。未経験だったね。WEBアプリの開発をお願いします。」

私「はい。」

HTML、CSS、JavaScriptを使いつつ何とかサイトを作っていく過程で、

私「PM、JavaScriptで入力制限を作ってみました。」

PM「そう、○○君」

<h3>ここで、驚きの発言！</h3>

PM「<font color="red">JavaScript</font>使わなくていいんじゃない？ 他の人もわからないだろうし......」

私は、この時WEBアプリ開発が未経験であったためか、よくわからないのか......
使わないようにしないとな......と思ってしまったのだが、大いに問題のある発言である!

私の認識です。
HTML:Hyper Text Markup Languageは、「文章自体を修飾することができる記法」
CSS:Cascading Stye Sheetsは、「デザインに統一性を持たせることができ、位置調整を毎回せずに済む便利」

当時
JavaScript「動き(Dynamic)を出すためのもの？」

現在の私の指摘
JavaScript「AutoPostback（オートポストバック）を起こさず、frontEnd（フロントエンド）で、入力制限ができる。」

AutoPostbackの前に、

Postback（ポストバック）に関して、WEBアプリケーションでは、
私たちが使用しているSafari（サファリ）やEdge（エッジ）、Google Chrome（グーグルクローム）といった――WEBブラウザといいます――経由で、サーバにあるデータへアクセスをしています。
Postbackとは、まず、私たちが、コントロールの一種であるButton（ボタン）なんかをクリックした際に、Event（イベント）を起こします。
そして、ネットワーク経由でServer（サーバ）へAccess（アクセス）して、このButtonが押されました。その際に、TextBox（テキストボックス）に「ABCDE」と入力されています。では、その値をCheck（チェック:検証）しましょう。処理のことです。
    AutoPostbackは、これを自動化していることです。例えば、先のTextBox自体にAutoPostbackを有効にすると、Buttonを押さずにやり取りが発生します。当然、Server側でも、処理のチェックが必要なわけなのですが......
今の説明で、読み取れるとよいのですが、JavaScriptでは、このPostbackを起こさずに、私たちが見えている表側で、入力エラーチェックを行うことができます。
　利点の一つとして、traffic（トラフィック:ネットワークの通行量といった具合でしょうか）を圧迫せずに済みます。

付け加えますが、例え、JavaScriptで入力制限をしたからと言って、serverside（サーバサイド）の入力制御が不要という意味ではありません。

初めての投稿となりましたが、私が経験した<font color="blue">怖ろしい話</font>でした。
【プラクティス紹介】1分でさらっと分かる「サインアップ」

## プラクティス名
サインアップ

## プラクティスの目的・狙い
* 状況に応じた柔軟な要員配置
* 主体性を育てる（「やらされ仕事」から「やりたい仕事」へ）

## どんな時に使うか
* DEVが割り当てられた仕事以外のことを自主的にやろうとしない時
* 誰がどの領域を担当するのかが固定化しており、ボトルネックが発生しがち

## 実施手順
1. タスク分解した後も、直前まで実施担当者をアサイン（割り当て）しない
1. その日のタスク分担を決めるため、DEV全員がタスクボードの前などに集まる
1. 各自が自主的に手を挙げ、今日どのタスクに取り組むかサインアップ（自己申告）する

メンバーの都合や進捗状況に応じて動的に要員配置を変えられるのが利点。また自らサインアップすることで意識も変わる。一方、このペースで全体的に終わりそうかどうかは別途バーンダウンチャートなどで分かりやすく可視化しておく必要がある。

## アレンジ例
* 有識者とペアでサインアップする（習得目的で未経験のタスクに取り組む場合など）
* サインアップのローカル運用を決める（やりたいタスクが被った場合はペア作業にするなど）
* 早めに終わりそうな場合は、次に取り掛かるタスクもサインアップしておく

## アンチパターン
* 難易度の高いタスクや面倒なタスクに誰も手をつけようとしない
* 特定の人しかできない作業が残り、結局それがボトルネックになる

## 参考情報

Ryuzeeさんがサインアップのアンチパターンについてさらに深く解説してくれています。

https://www.ryuzee.com/contents/blog/7111


## こぼれ話（私的コメント）
アサインされることに慣れ切った従来開発出身者のチームでいきなりこのプラクティスに臨むと「マネージャーが仕事をせずに丸投げしてきた」といった誤解を生みかねません。また要員のパフォーマンス差も浮き彫りになりやすいので、準備体操として「チーム主義」のマインドセットを忘れずに。
物理的なタスクボードで運用している場合、自分の完了レーンに付箋が溜まっていくのは、かなりモチベーションになります。まぁ、次のスプリントに進むとあっさりリセットされちゃうんですけどね。

　[アジャイルプラクティス一覧へ戻る](https://qiita.com/kakashi_h5/items/20584998c5ca4594b9ea)
WindowsServerに監視ツール「Prometheus」をいれてみた

## はじめに

オンプレミスで動いているシステム向けで負荷の影響から、パフォーマンスが劣化している可能性があることがわかりましたので、まずは測定しよう！ということで、監視ツールの「Prometheus」を導入しました！
Zabbixとどちらを入れようか悩んだのですが、シンプルそうという理由からPrometheusにしました。
Zabbix使ってるよーとか、他なにか使っている人あれば教えてください・・・

## Prometheusとは

Prometheus(プロメテウス）は、サーバーのCPUやRAM、トラフィックを始めとした各リソースの監視を行うアプリケーションです。Go言語により実装されていることで、バイナリファイル１つで動作する上に、DBの用意も不要、簡単な可視化ツールもついてます。

また、**Grafana**との連携も簡単にできるので、オシャレな可視化も可能です。

Prometheusは以下の要素に分かれます。
・Exporter： メトリックスを収集し、サーバーに連携します。
・Prometheus： 監視を行うサーバーとなり、各Exporterからデータを収集し、保存します。
・AlertManager：収集したメトリックスを元に、メールの送信などルールを作成し、通知を実行します。

## 構成

- OS: Windows Server 2019

## 導入手順

### 1. Prometheusのインストール

1. Prometheusの公式ページから、対象OS向けの実行ファイルをダウンロードします。
    今回はWindowsServerなので、下記を選択します。
    - Operating System：「windows」
    - Architecture：「amd64」
    **公式ページ**
    [Prometheus - Monitoring system & time series database](https://prometheus.io/)

1. とりあえず起動してみる。
ダウンロードしたファイルを展開した中に、prometheus.exeがあるので、実行します。
Server is ready to receive web requestsというメッセージが表示されたら、起動完了です。
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39308/4a11b9b0-98f6-6c33-bdfa-da506cb7aa4f.png)

1. アクセスしてみる。
ブラウザで、http://localhost:9090にアクセスすると、Prometheusの画面が表示されます。
![Untitled 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39308/1137431b-6d27-4f0b-28d0-f7a9d3f4fb8c.png)

### 2. Exporterのインストール

今回は、WindowsServerのメトリックスを収集したいので、**windows_exporter**を利用します。

1. Githubから実行ファイルをダウンロードします。
https://github.com/prometheus-community/windows_exporter/releases
2. ダウンロードした実行ファイルを起動し、インストールします。
3. 収集対象に追加する。
1. でダウンロードし、展開したファイルの中にあるprometheus.ymlに収集対象として追加します。

    ```yaml
    scrape_configs:
      # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
      - job_name: "prometheus"
    
        # metrics_path defaults to '/metrics'
        # scheme defaults to 'http'.
    
        static_configs:
          - targets: ["localhost:9090"]
    
      - job_name: "windows_exporter"
        static_configs:
          - targets: ['localhost:9182']
    ```

1. Prometheusを起動後、再度アクセスすすると収集したメトリックスが確認できるようになっています。
![Untitled 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39308/fd584b34-f402-1a28-b4b0-26c61e04a485.png)

## Tips

### データの保持する期間を設定する

prometheus.exeのオプションに`-storage.tsdb.retention.time`を指定することで、保持する期間を指定できます。（デフォルトは、15日）
利用可能なフォーマットは、y、w、d、h、m、s、msです。

## さいごに

Grafanaと連携すると、カッコイイ画面となるのですが、この説明はいつかやります。
Windowsに付属しているパフォーマンスモニタでも構わないのですが、なんかUI的に見る気がしないんですよね・・・
アプリケーションがちゃんと動いているか監視することは大事なので、ぜひぜひ試してみてください！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39308/70a4276a-cc01-73f2-ca0e-521659aeb87e.png)


## 参考文献

1. **Prometheus（公式）**
[https://prometheus.io/](https://prometheus.io/)

2. **Prometheus+Grafanaを自分のWindows PCだけで15分で体感する**
[Prometheus+Grafanaを自分のWindows PCだけで15分で体感する - Qiita](https://qiita.com/fujiyamaegg/items/452ea39fd638d195c105)

3.  **Prometheusのストレージのドキュメントをさらっと読んでみて、retentionの設定もしてみる**
[Prometheusのストレージのドキュメントをさらっと読んでみて、retentionの設定もしてみる - CLOVER🍀 (hatenablog.com)](https://kazuhira-r.hatenablog.com/entry/2019/05/02/232813)
Google Cloud (GCP)資格受ける前に必読：Professional Cloud Security Engineer 編

皆さんこんにちは！iret Global Solutions 事業部の浜田です。今回はProfessional Cloud Security Engineerについて書いてみました。セキュリティは実際の業務でも必ずといっていいほど重要な項目となってくるのでクラウドを扱うエンジニアは勉強しておいて損はないです。

<h1>前提条件</h1>
本記事は既にVPC, Google Compute Engine, Cloud Functions,
Cloud storageなどの基本的なGCPのサービスを知っていることを前提としています。


<h1>試験概要</h1>
他の試験と同様、試験時間は2時間で問題数は50問です。

https://cloud.google.com/learn/certification/cloud-security-engineer?hl=ja

https://cloud.google.com/learn/certification/guides/cloud-security-engineer?hl=ja

<h1>絶対覚えておいた方がいいサービス</h1>


<strong>Cloud KMS</strong>
結構本試験の肝となってくるサービスです。Cloud Key Management Serviceの略で、Google Cloud で秘密鍵の作成・保管・管理ができ、その鍵を用いてGoogle Cloud サービスのストレージを暗号化すること等に用いることができます。奥が深いサービスとなっているので<strong>徹底的な学習をお勧めします。</strong>

<strong>IAP</strong>
正式名称はIdentity-Aware ProxyでGoogle Cloud が提供するWeb アプリケーションや、仮想マシンなどのクラウドリソースに対して、アプリケーションレベルの認証機能を提供するサービスです。IAPを使用すると、Web アプリケーションや仮想マシンにアクセスできるユーザーを、IAP を利用できるIAM ロール がアタッチされた組織内 Googleアカウントやグループ に制限することができます。


<strong>Cloud Interconnect</strong>
オンプレミスネットワークとGoogle Cloud間に専用のネットワーク接続を可能にするサービスです公共のインターネットを避けることでオンプレミスデータセンターとGoogle Cloud間のデータ転送をセキュアに行うことができます。

<strong>Private Google Acces</strong>
VPC内の仮想マシンが他のGoogle Cloudサービスにインターネットを経由せずにアクセスできます。公共のインターネットへを避けることでVPCとGoogleサービス間のセキュアなデータ転送を確保します。


<strong>Cloud NAT</strong>
外部IPを持たないインスタンスがインターネットへのアクセスをするために利用する ツールです。Cloud NAT を使うことで外部からのアクセスを防ぐことができ、VM がある VPC を外部のネットワークと切り離すことが可能です。


<strong>Cloud DLP</strong>
Cloud DLPは、主に個人情報（PII）を検出、分類、保護するためのサービスです。氏名や住所、生年月日や電話番号、またメールアドレスにカード番号などといった情報を保護するときに使います。



<strong>Cloud Armor</strong>
Cloud Armorは、DDoS　対策およびWAFを提供するサービスです。悪意のあるトラフィックからアプリケーションを保護し、DDoS攻撃に対抗し、一般的なWebアプリケーションの脆弱性をフィルタリングしてWebサービスのセキュリティを向上させます。


<strong>VPC Service Controls</strong>
Google Cloudのリソース間で境界線を張ることで外からのアクセスを制限できます。Google Cloudのインフラ内でも、認証されていないアクセスからリソースを保護するための細かいアクセス制限を行うことが可能です。

<strong>Google Cloud Directory Sync</strong>
Google アカウントのデータを Microsoft Active Directory や LDAP サーバーと同期するために使います。


<strong>Secret Manager</strong>
アプリケーションで使用されるAPIキー、データベースの資格情報などの機密情報を安全に保存して管理します。機密情報を安全に保護することで漏洩を防いでくれます。

<h1>覚えといた方が良いサービス</h1>

<strong>VPC関連のサービス </strong>

VPCについてもセキュリティに関連するサービスは沢山あります。VPC Flow Logs や VPC Peeringはもちろんのこと、Shared VPC や Packet Mirroringについてもしっかり説明できるようにしましょう。

<strong> その他セキュリティサービス</strong>

Google Cloud のセキュリティーサービスはまだまだ沢山あります。基本的な<strong>IAM管理や組織管理</strong>はもちろんのことKMSと一緒に使われることが多い<strong>Cloud HSM</strong>やウェブ アプリケーションにおけるセキュリティの脆弱性を特定してくれる<strong>Web Security Scanner </strong>などしっかり目を通しておきましょう。


<h1>試験対策</h1>
やはりどのGoogle Cloud認定資格も情報をインプットしただけで受かるほど甘くないです。まずはGoogleが出している模擬試験を解きまくりましょう。

https://docs.google.com/forms/d/e/1FAIpQLSf4ADmZr8WnDZjIK6dWvRTel2VmsP0fJtONy6UOFjWZHe-MpQ/viewform?hl=ja

また、僕は本試験では使いませんでしたがUdemyでも沢山コースや問題集があるので是非活用してみてください。

<h1>最後に</h1>

さて、今回の記事は以上になりますが僕の感覚ではAWS,GCP関係なくSecurityの試験はサービスさえしっかり理解していればあまり迷わなかった記憶があります。かといって簡単な試験では全くないのでしっかり勉強してみてください。

他のGoogle Cloud の試験に興味がある方は以下に難易度順のランキングを載せているので参考程度に是非。

https://qiita.com/sina-cloud/items/bbe1d263c6b69954867f

それでは皆さん、ご武運を。
アクセス制御手順（データリンク層）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/774e0f85-2e90-e578-dd03-3491ce863632.png)
１：CSMA/CD（Carrier Sence Multiple Access with Collision Detection）
 CSMA/CDはイーサネット（有線LAN）のアクセス制御手順です。回線使用中を表すキャリア信号がない時に、フレームの送信が行えます。つまり、回線が空いていれば、いつでもフレームを送信できます。

　複数のノードが、回線が空いていると判断し、同時にフレームを送信すると、フレームが衝突してしまいます。CSMA/CDでは、衝突が発生したことを検知すると、フレームの送出を中断し、しばらく待ってから、フレームを再送します。互いにタイミングをずらして再送するよう、各ノードが待つ時間はランダムに決めます。

　CSMA/CDを利用するのは、リピータハブを用いて半二重通信をする場合です。近年はスイッチングハブを用いて全二重通信をするため、ノードとハブ間で衝突が発生しません。したがって、CSMA/CDによる制御は必要なくなっています。

２：CSMA/CA（Carrier Sence Multiple Access with Collision　Avoidance）
　CSMA/CAは無線LANのアクセス制御手順です。回線使用中をキャリア信号がない時に、フレームの送信が行えます。

　CSMA/CDでは、初凸を回避するように対応します。衝突を回避するために、フレームを送信する前にしばらく待って、他のノードが利用する気配がないことを確かめてから送信します。つまり、回線が空いたからといって真っ先に食いつかないようにします。

　身近な例では、狭い通路をみんなでわれ先に通ろうとすると、押し合いになってうまく通れません。「お先にどうぞ」という余裕のある対応で丸く収められます。CSMA/CAも同じ考え方です。
AlmaLinux8にlxd環境を構築する

## 目的
本来、ubuntu上に構築することを推奨されているlxdだが、almalinux上に構築してみようと思う。

## TL;DL
```bash
dnf -y install epel-release
dnf -y update
dnf install certbot snapd -y
systemctl enable --now snapd.socket
ln -s /var/lib/snapd/snap /snap
systemctl start snapd
systemctl enable snapd
snap install lxd
usermod -aG lxd $USER
newgrp lxd
lxd init --auto
```


## 解説

epel-releaseのrepositoryを追加
```bash
dnf -y install epel-release
dnf -y update
```
snapdをインストール
```bash
dnf install certbot snapd -y
```

snapの起動
```bash
systemctl enable --now snapd.socket
ln -s /var/lib/snapd/snap /snap
systemctl start snapd
systemctl enable snapd
```

lxdのインストール
```bash
snap install lxd
lxd init --auto
```

権限の追加
```bash
usermod -aG lxd $USER
newgrp lxd
```

LXDの初期化
```bash
lxd init --auto
```
スマホゲームでのChatGPTの活用　アンジュ・リリンクのエイプリルフール施策

## はじめに 
今回は業務においてChatGPT を活用した件についてお話しします。
作ったものは、2023年4月1日（土）の24時間のみ公開された、エイプリルフール限定施策のWebサイトです。




> 【日向美海の事件簿２】
アンジュ・リリンクの公式HPに4/1限定でチャットAIが登場！
日向美海と一緒にAIから聞き取り調査を行い、とある事件の真相を追いましょう。
今すぐ☟からご確認ください。https://t.co/MCZfcezmsH#アンジュ・リリンク#アンジュAI#エイプリルフール pic.twitter.com/KGNgq0ZQcl
— 【公式】アンジュ・リリンク (@angeRelink) 2023年3月31日




▼本施策に関するプレスリリース

https://prtimes.jp/main/html/rd/p/000000081.000068754.html

## エイプリルフールストーリーの概要

『アンジュ・リリンク』の公式HPにチャットAIが登場。青蘭学園の情報が搭載されたAIに対して自由にメッセージを送ることで、ストーリーが展開していきます。




＜ストーリーあらすじ＞

Dr.ミハイルが開発した最新鋭AIが突然、記憶を喪失してしまった！

あなたと日向美海はDr.ミハイルから依頼を受け、記憶を喪失し、ポンコツAIとなってしまったAIから聞き取り調査を行うことに。

最新鋭AIに何があったのか？

事件の真相を聞き出そう！




## 施策の仕様とポイント

・特設Webサイト上で、プレイヤーはチャット形式で自由に会話ができる。

・会話が10往復するまでの間に記憶喪失の原因を特定し、フォームに正解を入力すればクリアとなる。

・ロボットとの会話にChatGPT APIを使用している。




## 構成

Webフロントエンド (JavaScript) 

↕ 

AWS API Gateway 

↕

 AWS Lambda (Python) 

↕

 ChatGPT API




## コスト

ChatGPT APIにリクエストするたびに、パラメータで渡す文字列とレスポンスとして返ってくる文字列のサイズ（トークン数）に比例して課金されます。実装時点で一番お安いgpt-3.5-turboモデルだと1000トークンごとに$0.002（0.27円）という設定です。トークンの計算方法は、日本語だと平均して0.91文字で1トークンに相当するのだそうです。




今回の仕組みだと、会話1回のリクエストごとにそれまでの会話履歴をまるごとパラメータにして送る形なので、会話の往復回数が増えるほど1リクエストあたりのトークン数が多くなっていきます。また、初期設定としてChatGPTに与える指示の文字数は毎回のリクエストに乗ってきます。実測として、会話の1回目が1000トークン、10回目だと2500～3000トークンくらいになる感じで、10回の会話を行なうと合計4円程度がかかりました。

※会話履歴をすべて送らずに直近数回分に絞ったりすることで、会話の往復回数が増えたときのトークン数を抑える工夫ができるとのこと。



ユーザ数と1利用あたりの会話回数を予想すると、ChatGPT APIの使用料は$100あれば収まる見込みでした。ただ、会話ボタンを連打したらその分だけ課金されるのは危ないですし、急にバズったりしてうれしい悲鳴が上がる場合も考慮して、いくつかの対応を入れました。

* 会話は10往復を上限とし、それ以上続けられないルールにした（Lambda側のバリデーションでも配列の長さをチェックしている)。

* 10往復の会話をしたあとに最初からやり直したい場合、1時間のインターバルを待つ必要がある、という仕組みにした（これはフロントエンドでチェックしているだけなので、仕組みが分かれば回避できてしまう)。

* ChatGPT APIのHard limitに＄400（見込みの4倍）を設定した。Hard limitは月の課金額の上限で、この予算額を超えると以降のAPIリクエストに対してエラーを返してくれる。※初期状態だとHard limitとして設定できる最大値が$100なので、この上限解放申請をOpenAI社に送らないといけない。1日で対応してもらえた。

* API Gatewayのスロットリング（時間あたりのリクエスト上限数という意味合いのもの）を設定した。仮に短時間にどれだけアクセス集中したとしても、$400を使い切るのに24時間はかかる程度のしきい値にした。

結果として、4月1日の24時間で約1万リクエストがあり、API使用料は約4000円で済みました！




## 総括
Python初心者でも実装できた
ゲームとしてどのように面白くするかの工夫は必要
今までにないユーザー体験を提供できる




## 後記

実装段階ではあまりにうまくいかないので、登場人物を演じてもらうことは諦めて、言うことが一切アテにならない「記憶喪失のポンコツAI」という逆の方向に振り切りました。記憶喪失のAIではあるけど、「青蘭学園」「風紀委員」「東条遥」などのキーワードには反応するように指示しておいて、記憶喪失の原因を解き明かすという部分でゲーム性を出せないか、という狙いでした。




「あなたは記憶喪失です」と指示してもダメで、「記憶喪失になったポンコツロボットを演じてください（ロールプレイしてください）」と指示した方が意図に近い受け答えをしてくれました。

[エンジニア採用特設サイトはこちら](https://www.notion.so/f4samurai-Engineer-Recruiting-33fd41dc956242f6a172ad52038fc653)
Angular：Formの入力チェック

## 前書き
* 自分の勉強メモ、ご参考まで

## Formの入力チェック

* HTMLテンプレートを作成

```typescript:HTML
<form #loginForm="ngForm" (ngSubmit)="onLogin()">
  <mat-form-field style="width:300px;">
    <mat-label>Mail Address</mat-label>
    <input matInput id="Mail" name="Account" type="email" [(ngModel)]="user.Mail" required minlength="2" maxlength="100" #Mail="ngModel" style="ime-mode: inactive">
    <button *ngIf="user.Mail" matSuffix mat-icon-button aria-label="Clear" (click)="user.Mail=''"><mat-icon>close</mat-icon></button>
    <mat-hint>
      <span [hidden]="!Mail.errors?.required">メールアドレスは必要です。</span>
      <span [hidden]="!Mail.errors?.minlength">2文字以上入力ください。</span>
      <span [hidden]="!Mail.errors?.maxlength">100文字以下入力ください。</span>
    </mat-hint>
  </mat-form-field>
  <button mat-stroked-button [disabled]="loginForm.invalid" color="primary" (click)="onLogin()">ログイン</button>
</form>
```
ポイント：
`<form #loginForm="ngForm" (ngSubmit)="onLogin()">`
`<input [(ngModel)]="user.Mail" required minlength="2" maxlength="100" #Mail="ngModel">`
`<span [hidden]="!Mail.errors?.required">メールアドレスは必要です。</span>`
`<button mat-stroked-button [disabled]="loginForm.invalid" color="primary" (click)="onLogin()">ログイン</button>`


* HTMLテンプレートを作成

```typescript:ts
import {Component} from '@angular/core';
import {MatIconModule} from '@angular/material/icon';
import {MatButtonModule} from '@angular/material/button';
import {MatInputModule} from '@angular/material/input';
import {MatFormFieldModule} from '@angular/material/form-field';
import {FormsModule} from '@angular/forms';
import {NgIf} from '@angular/common';

@Component({
  templateUrl: './login.component.html',
  styleUrls: ['./login.component.css'],
  standalone: true,
  imports: [
    MatIconModule, 
    MatButtonModule, 
    MatInputModule, 
    MatFormFieldModule, 
    FormsModule, 
    NgIf, 
  ], 
})

export class LoginComponent {
  user = {
    Mail: '',
    Password: '',
  };

  async onLogin () {
  }
}
```
Angular：HttpClientのサンプル（同期版、非同期版）

## 前書き
* 自分の勉強メモ、ご参考まで
## AngularのHttpClient(AJAX)のサンプル(非同期版)

**app.module.ts**に**HttpClientModule**をimport。

```typescript:app.module.ts
import { HttpClientModule } from '@angular/common/http';
@NgModule({
  ......
  imports: [
    HttpClientModule
  ]
  bootstrap: [AppComponent]
  ......
})
```

**HttpClient**を利用する
```typescript:home.component.ts
import { HttpClient, HttpHeaders } from '@angular/common/http';

constructor(private http: HttpClient) { }

onSearch () {
  let httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json'  }) };

  console.log('1) ajax start...');
  this.http.get('http://localhost/Mock/receiptMap.json', httpOptions)
    .subscribe(response => {
      console.log(response);
      console.log('2) ajax over...');
    });    
  console.log('3) search over...');
}

// 結果は以下である
1) ajax start...
3) search over...
2) ajax over...
```

## AngularのHttpClient(AJAX)のサンプル(同期版)

**HttpClient**を利用する
```typescript:home.component.ts
import { lastValueFrom } from 'rxjs';

async onSearch () {
  let httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json' }) };

  console.log('1) ajax start...');
  const f = await lastValueFrom(this.http.get('http://localhost/AiReceiptApiMock/receiptMap.json', httpOptions));
  console.log(f);
  console.log('2) ajax over...');
  console.log('3) search over...');
}

// 結果は以下である
1) ajax start...
2) ajax over...
3) search over...
```
Angular：自学メモの目次

## 目次


https://qiita.com/tanakatian/items/7127b8109d7b6a901023

https://qiita.com/tanakatian/items/8cf2c2edaa8f6d1603c5

https://qiita.com/tanakatian/items/40cd8e709f82a66e8681

https://qiita.com/tanakatian/items/0ddd1b9fed51ce83f503
Javaファイルをコンパイルする際のエラーの対応

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3553242/ecf275a8-44ca-7d1d-706a-880e2ba18956.png)

上記の写真のようなエラー文が出てしまいうまくコンパイルできなかった。

⇒少し調べてみるとどうやらjavaファイル上の文字コードとコンパイルする際にwindows側が解釈し翻訳する文字コードに乖離があるためだと発覚。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3553242/4569b536-4f7f-c784-2413-fd3529884fc5.png)

コマンドプロンプトでコンパイルする時に「-encoding 文字コード」という文をjavacとファイル名の間に入力することで下記のように上手く表示させることができた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3553242/78ce07fc-465c-b919-8d81-a63e7a928e03.png)


他にも解決策はあるかもしれないがひとまず目先のエラーに対して対応ができたので個人的に満足している。
knowledge を CentOS6からalmalinux9に移行するメモ

knowledge(https://github.com/support-project/knowledge) をかなり古いOSで動かしていたので新しいサーバーに移行しようとして悪戦苦闘した結果。

## 起きたこと

* java11 では jaxb が本体から分離したことにより動作しない
* ならば、と maven + jdk 入れて mvn package したらコンパイルは通るがテストが悉く失敗する
* pom.xml を頑張っていじってたら h2 のデータベースが開けないとか言われる
* h2 の jar をビルドしてコンソールを開いてデータベースを作成することには成功した
* が、 mvn test が通らない。
* sql関係で結構変更があるのかも

そんなわけで java11以降への移行…はあきらめる。まあどうせアレがアレだしもういいや。


## requirements

* java 8
* postgresql (13以降)
* tomcat 9

AJP 使って httpd からアクセスさせるなら apache httpd が必要となる。

## 移行元データのバックアップ

```
pg_dump -U knowledge_user knowledge_db > /backup/knowledge_db.bak
```

## 各種サービス等をインストールする

インストール

```sh
sudo dnf install java-1.8.0-openjdk
sudo dnf install tomcat
sudo dnf remove postgresql-server
```

起動設定

```sh
sudo systemctl enable tomcat
sudo systemctl enable postgresql
```

postgresql は指定したロールでホスト指定でログインさせるために  にそういう設定が必要。

/var/lib/pgsql/data/pg_hba.conf

```conf
# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            password
# IPv6 local connections:
host    all             all             ::1/128                 password
```


## knowledge をインストールする

knowledge.war を https://github.com/support-project/knowledge からダウンロードして tomcat/webapps にコピーする。

```sh
sudo cp knowledge.war /usr/share/tomcat/webapps
```

アプリケーションにアクセスしたら一度 admin でログインする。

## 初回起動

tomcat を起動してから knowledge (http://192.168.0.nnn:8080/knowledge) にアクセスする。


tomcat を起動する

```
sudo systemctl start tomcat
```

## データベースを作成して移行元データベースを復元する

必要なロール、データベースを作成してロールに対するアクセス権限を与える。
psql で以下

```sql
create database knowledge_db;
create role knowledge_user login password 'xxxxxxxx';
grant all priviledges on database knowledge_db to knowledge_user;
```

復元

```sh
 psql -d knowledge_db < /vagrant/knowledge_db.bak
```

## カスタム設定を編集する

/usr/share/tomcat/.knowledge/custom_connection.xml

```xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><connectionConfig><autocommit>false</autocommit><driverClass>org.postgresql.Driver</driverClass><maxConn>0</maxConn><name>custom</name><password>knowledge</password><schema></schema><URL>jdbc:postgresql://localhost:5432/knowledge_db</URL><user>knowledge_user</user></connectionConfig>
```

## アプリケーションを再起動する

```
sudo systemctl stop tomcat
sudo systemctl start tomcat
```

## アプリケーション設定を完了する

### ログイン

knowledge (http://192.168.0.nnn:8080/knowledge) にアクセスして移行元で設定した管理者(多分 admin で、パスワードはデフォルト設定ではなく変更したもの)でログインする。

### インデックス再作成

システム設定メニュー＞検索用のインデックスの再作成 にアクセスし、記事番号の開始と終了を設定して「開始」ボタンをクリックする
ベテランSEの事件簿　～UNIXサーバで「# rm *」事件のフォロー～

# プロローグ
数年前(確か4年前の2019年)の話になります。

たまたま別件打ち合わせで帰社した際に周辺がざわざわしていて、
何があったんだろう？と思いながら聞き耳を立てていたところ

「客先のUNIXサーバで障害を引き起こしたので助けてほしい」というSOSを受けました。

ワタクシ、インフラエンジニア歴25年のおじさん(ベテラン？)エンジニア
なのですがUNIX=今は全然聞かなくなってしまった「Solaris」という事もあり諸々調整の上フォローを実施する事と相成りました。

内心ドキドキしながら翌日フォローへ向かったのですが、いろいろと衝撃を受けました。。。その際の教訓を残すべく、今回初めて筆を執った次第です。

# 事件内容
端的に言うと、タイトル通りでお客様環境の開発用(本番ではない)サーバで「rm *」というコマンドを誤って実行してしまったという内容でした。

(ちょっと脱線)
Solaris含むUNIXサーバで「rm *」を実行すると
OSが問答無用で破壊されてしまいます。

興味のある方はこのあたりの記事をご覧頂ければと思います。

(Solarisについてではありませんが、壊れゆくのは変わらないので。
もし試す場合は全く影響のない環境での自己責任でお願いしますm(__)m)

https://dev.classmethod.jp/articles/tried-rm-rf-root-on-amazon-linux-2/

# 事象ヒアリング
上記事象について、作業を担当したメンバーにヒアリングしてみました。

少々技術的な話になってしまうのですが、実際にやりたかったコマンドを
誤ってしまったのが事実との事。。。

- **本来やりたかった事**
作業用ディレクトリ配下のファイル一括削除

- **本来実行すべきコマンド**
#cd (作業用ディレクトリパス)
#rm ./*

- **やってしまったコマンド**
#cd (作業用ディレクトリパス)
#rm *
※「./」を付け忘れてしまっています。

# ちょっと深堀（なぜなぜ分析）
問題が発生した際には

『なぜなぜ分析』という手法(「なぜ」を掘り下げ)で真因を見つける事が多いです。

詳細についてはこのあたりの記事が参考になるかと思いますが、今回も実施しました。

https://biz-skill.com/why-analysis/

![1693875500278-r7qDpALtQU.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552913/861e9443-7647-69b8-d913-6c4420bfc2e0.png)

当時の記憶がだいぶ欠落してしまったのですが、結果はこのような感じでした。
↓

- 事象
「rm *」を実行してしまった。

- なぜ１
　・単独作業だった為、作業時のコマンド誤りに気付けなかった
　・ファイル削除時に「-i」オプションが付与されてなかった
　・作業手順のレビューが実施できていなかった

- なぜ２
　・プロジェクト体制として複数人で作業できる形になっていなかった
　※もう少し分析結果があったような記憶があるのですが失念してしまいました。。。

# 復旧対応について
今回実行してしまった「rm *」ですが、短時間で気付き「Ctrl+C」で処理を止めていたのが功を奏して完全に業務処理に必要なファイルが消えずに済んでいました。
それを受けて以下の流れで対応し、復旧に漕ぎ付けることに成功しました。
1. tarコマンドで生きているファイルをひたすらバックアップ取得
2. OS初期インストール、ミドルウェアインストール・セットアップ
3. バックアップからのファイル戻し
→必要なファイル権限含めてバックアップ出来ていたのでダメージは最小限

# エピローグ（教訓）
今回得られたものは大きく以下であったと考えます。
- 作業手順書の品質向上
- バックアップ取得の重要性

前者については昔の話になりますが、
**幼稚園児が実施しても同じ結果が得られる**レベルで作業手順書の品質向上を目指すという事を聞いたことがあります。
なかなかコストパフォーマンスを考えると実現は難しいのですが、決して誤っているものでは無いので可能な限り目標としては意識付ける必要があるかと思った次第です。

後者についてはこれも環境・コスト等を考慮すると難しい部分もあるかもしれませんが、何事においても「耐障害性」を意識するのは重要なのでこれも改めて意識付けが必要かなと考えます。

※今回の事象発生時に取得できていたバックアップで対応のスピード感も劇的に上がりましたので。。。
【Flutter】手軽に実装できる美しいアニメーション背景 8選

# はじめに

Flutterを用いてアプリを開発する際、魅力的なアニメーション背景はユーザーエクスペリエンスを格段に向上させます。しかし、どのようにしてそういったアニメーションを実装するのか、ゼロからコーディングするのは難しいと感じることもあるでしょう。

今回の記事では、Flutterで手軽に美しいアニメーション背景を実装できる優れたパッケージを8選ご紹介します。

# デモアプリ
![](https://storage.googleapis.com/zenn-user-upload/b9793b075b39-20230905.png)

今回紹介するアニメーション背景を一覧で確認できるデモアプリです。
GitHubからクローンするだけで、各アニメーションを手軽に体験できます。

https://github.com/mnengineer/flutter_beautiful_backgrounds

:::note info
注意： このデモアプリを動かすには、Flutterの開発環境が必要です。まだ環境を構築していない方は、[Flutterの公式ドキュメント](https://docs.flutter.dev/get-started/install)を参照してください。
:::

# パッケージ8選

それでは、Flutterで簡単に実装できるパッケージを8選ご紹介します。

※今回の記事では、実装の詳細には触れません。各パッケージの具体的な実装方法は、それぞれのpub.devページで確認することができます。ReadmeやExampleセクションには実装手順が簡潔かつわかりやすく説明されているためそちらを参照してください。

## 1. Metaballs
![](https://storage.googleapis.com/zenn-user-upload/8c1b41ee2074-20230905.png)

このパッケージを使用すると、液体のように結合するメタボールのアニメーションが簡単に追加できます。パフォーマンスが高く、利用可能なエフェクトはすべてマウスとタッチ入力の両方に最適化されており、ユーザにインタラクティブで感覚的な体験を提供することができます。

https://pub.dev/packages/metaballs

## 2. Weather Animation
![](https://storage.googleapis.com/zenn-user-upload/881498cefc1a-20230905.png)
天気に応じたリアルなアニメーションがこのパッケージで簡単に実装できます。例えば、晴れ、雨、雪といった異なる天候状況を表現可能です。

https://pub.dev/packages/weather_animation

## 3. Animated Background
![](https://storage.googleapis.com/zenn-user-upload/bfd7c1c255a0-20230905.png)
背景にさまざまな動きを追加することができる汎用的なパッケージです。滑らかなグラデーションや波紋など、多くのエフェクトが用意されています。

https://pub.dev/packages/animated_background

## 4. Particles Flutter
![](https://storage.googleapis.com/zenn-user-upload/9174a7176445-20230905.png)
小さな粒子が画面上を動き回るようなアニメーションを作成できます。特にログイン画面やトランジションに使うと印象的です。

https://pub.dev/packages/particles_flutter

## 5. Parallax Rain
![](https://storage.googleapis.com/zenn-user-upload/ce4441e95980-20230905.png)
雨が降るようなパララックス効果のアニメーションを簡単に追加できます。リアリティのある雨の降り方と反応が可能です。

https://pub.dev/packages/parallax_rain

## 6. Floating Bubbles
![](https://storage.googleapis.com/zenn-user-upload/848050191061-20230905.png)
画面上に浮かぶ気泡がゆっくりと上昇していくアニメーションが特徴です。落ち着いた雰囲気やリラックスしたい状況でよく使われます。

https://pub.dev/packages/floating_bubbles

## 7. Animated Glitch
![](https://storage.googleapis.com/zenn-user-upload/b6706d909fad-20230905.png)
テキストや画像にグリッチ（不具合）風のアニメーションを追加できます。独特のスタイリッシュな印象を与えることができます。

https://pub.dev/packages/animated_glitch

## 8. Rive
![](https://storage.googleapis.com/zenn-user-upload/36fc7c77dc77-20230905.png)
リアルタイムで対話型のデザインとアニメーションを可能にするツール [Rive](https://rive.app/) のランタイムライブラリです。アプリやウェブプロジェクトに動きを加えたいデザイナーや開発者にとって強力な選択肢です。

https://pub.dev/packages/rive

# まとめ

以上がFlutterで手軽に美しいアニメーション背景を実装できる優れたパッケージ8選です。この記事が皆さんのアプリ開発に役立てば嬉しいです。
他にも気になるパッケージがある場合、ぜひコメントでお知らせください。

今回紹介したアニメーションを一覧表示で確認できるデモアプリはこちら：

https://github.com/mnengineer/flutter_beautiful_backgrounds

# 参考サイト

https://fluttergems.dev/effects-gradients-shaders/

https://flutterassets.com/animated-backgrounds-in-flutter-with-examples/

https://flutterawesome.com/animated-app-with-rive-and-flutter/
Maya CgAbBlastPanelOptChangeCallback

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399596/8d876b17-bf3b-29e9-b50b-8f59fe66495d.png)

```python
import pymel.core as pm
def cleanupPanelCallback():
    for item in pm.lsUI(editors=True):
        if type(item) == pm.ui.ModelEditor:
            pm.modelEditor(item, e=True, ec='')
cleanupPanelCallback()
```