OmniAICreator/Qiita-1.07M huggingface dataset:
AWS Well-Architected Framework

本記事ではAWSが提供するベストプラクティスと設計原則をまとめたWell-Architected Frameworkについて説明していきます。
※Well-Architected Frameworkは常に変わるためこと位のベストプラクティスは来年のバッドプラクティスになる場合もあります。本記事は2024年7月現在の情報です。
## AWS Well-Architected Framework
クラウドベースのアーキテクチャを設計、運用、改善するためのベストプラクティスとガイダンスを提供するフレームワークです。絶対に厳守すべきルールと言わけではなく、理解した上でAWSの利用が推奨されています。
## Well-Architectedホワイトペーパー
ホワイトペーパーは、AWSが提供する公式なドキュメントで、フレームワークの詳細な説明やベストプラクティスを包括的に解説しています。
以下の6つの柱で構成されています。
#### 1.オペレーショナルエクセレンス(運用上の優秀性)
オペレーショナルエクセレンスの柱ではシステムの実行とモニタリングおよびプロセスと手順の継続的な改善に焦点を当てています。変更の自動化、イベントへの対応、日常業務を管理するための標準化などが含まれており、以下の設計原則が提供されています：
1.ビジネス成果に基づいてチームを編成する
2.オブザーバビリティを実装して実用的なインサイトを取得する
3.ワークロードを可能な限り安全に自動化し、人的ミスを削減する
4.小規模、可逆的な変更を頻繁に行う
5.運用手順を頻繁に改善する
6.障害を想定し、対策を考えテストを行う
7.運用やメトリクスから学ぶ
8.マネージドサービスを利用する
#### 2.セキュリティ
セキュリティの柱では情報とシステムの保護に焦点を当てています。データの機密性と完全性、ユーザー許可の管理、セキュリティイベントを検出するためのコントロールが含まれており、以下の設計原則が提供されています：
1.強力なアイデンティティ基盤の実装
2.トレーサビリティを実現し、維持する
3.セキュリティを全レイヤーへ適用する
4.セキュリティベストプラクティスを自動化する
5.伝送中と保管中データを保護する
6.データを人の手で扱わない
7.セキュリティイベントへ備える
#### 3.信頼性
信頼性の柱は期待通りの機能を実行するワークロードと、要求に応えられなかった場合、迅速に回復する方法に焦点を当てています。分散システムの設計、復旧計画、および変化する要件への処理方法が含まれており、以下の設計原則が提供されています：
1.障害から自動的に復旧する
2.復旧手順をテストする
3.水平スケーリングを行い、集合的なワークロードの可用性を向上する
4.キャパシティの推測をやめる
5.オートメーションで変更を管理する
#### 4.パフォーマンス効率
パフォーマンス効率の柱は、IT およびコンピューティングリソースの構造化および合理化された割り当てに重点を置いています。ワークロードの要件に応じて最適化されたリソースタイプやサイズの選択、パフォーマンスのモニタリング、ビジネスニーズの増大に応じて効率を維持することが含まれており、以下の設計原則が提供されています：
1.最新テクノロジーを誰もが利用できるようにする
2.短時間でグローバル展開する
3.サーバーレスアーキテクチャを使用する
4.頻繁にテストする
5.メカニカルシンパシーを重視する
#### 5.コスト最適化
コスト最適化の柱は、不要なコストの回避に重点を置いています。主なトピックには、時間の経過による支出の把握と資金配分の管理、適切なリソースの種類と量の選択、および過剰な支出をせずにビジネスのニーズを満たすためのスケーリングが含まれます。以下の設計原則が提供されています：
1.クラウド財務管理を実装する
2.消費モデルを導入する
3.全体の効率を測定する
4.差別化につながらない高負荷の作業に費用をかけるのをやめる
5.費用を分析し帰属関係を明らかにする
#### 6.サステイナビリティ(持続可能性)
持続可能性の柱は、実行中のクラウドワークロードによる環境への影響を最小限に抑えることを重点としています。主なトピックには、持続可能性の責任共有モデル、影響についての把握、および必要なリソースを最小化してダウンストリームの影響を減らすための使用率の最大化が含まれます。以下の設計原則が提供されています：
1.影響を理解する
2.持続可能性の目標を設定する
3.使用率を最大化する
4.より効率的なハードウェアやソフトウェアの新製品を予測して採用する
5.マネージドサービスを使用する
6.クラウドワークロードのダウンストリームの影響を軽減する
## Well-Architected Tools
クラウドアーキテクチャを評価し、ベストプラクティスに従って設計されているかを確認できます。問題点を特定し、改善のための推奨事項を提供します。
## Well-Architected Lens
金融やIoT、ゲームなどの特定の業界や技術領域に対するベストプラクティスを提供するために設計されたガイドラインのセットです。
## AWS Well-Architectedパートナーによる支援制度
SAなどの認定を持ったAWSパートナーにサービスコストやアプリ開発の支援を受けることができます。
## 参考文献
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
IBM Blueworks Live 基本操作ガイド

# IBM Blueworks Live 初めの一歩：基本操作ガイド動画
IBM Blueworks Live(BWL)は、業務プロセスを可視化し、モデル化するツールです。


業務プロセスをBPMN(※)形式で書くためには、BPMNを理解し、
どの記号が何を示すのかを把握する必要がありますが、
BWLを使えば**専門知識がなくとも、自ずとBPMN形式でプロセスを書くこと**ができます。

*※BPMN："Business Process Model and Notation" の略で、ビジネスプロセスモデルの表記に関する国際標準、どの立場のユーザーが見ても理解できる表記法として定義されている。*

[ BWLの画面例 ]

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709056/1cdb0eb1-9709-6230-45e5-e3572686b33c.png)




とはいえ、一度1時間半程度のハンズオンを実施して、操作感を理解する必要があります。

そのハンズオンの内容を動画にまとめましたので、BWLでの操作感の良さを体感いただくためにこちらの動画を見ながらハンズオンを実施いただければと思います。

https://video.ibm.com/recorded/133758358

### ハンズオン事前準備：BWL環境の準備

30日間のトライアル環境にて、お試しすることが可能です。
無償環境の登録URL：https://www.ibm.com/account/reg/jp-ja/signup?formid=urx-37086
sarashina2-7bは『雪国』の冒頭をどうトークナイズするのか

SB Intuitionsから日本語生成AI「Sarashina1・2」が[リリースされた](https://www.sbintuitions.co.jp/blog/entry/2024/06/26/115641)。独自構築のトークナイザに力を入れたらしい。

> Sarashina1・2にはそれぞれ独自に構築したトークナイザを用いました。 具体的には，sentencepieceの提供するユニグラム言語モデルのアルゴリズムを用いてサブワードを構築しました。 その際，Sarashina2の語彙サイズ（102,400）はSarashina1の語彙サイズ（51,200）の倍に設定しました。 これにより，日本語・英語・プログラミングコードといった複数種類のデータを効率的に学習可能です。

とりあえず、[sarashina2-7b](https://huggingface.co/sbintuitions/sarashina2-7b)のトークナイザを試してみよう。

```
>>> from transformers import AutoTokenizer
>>> tkz=AutoTokenizer.from_pretrained("sbintuitions/sarashina2-7b")
>>> print(tkz.convert_ids_to_tokens(tkz("国境の長いトンネルを抜けると雪国であった。","夜の底が白くなった。")["input_ids"]))
['国境', 'の長い', 'トンネル', 'を抜け', 'ると', '雪', '国', 'であった', '。', '
', '夜の', '底', 'が', '白', 'くなった', '。', '
']
```

残念ながら、日本語トークナイザとしてはボロボロだ。特に「の長い」「を抜け」「ると」に関しては、単語の切れ目を完全に無視していて、日本語における言語処理としては話にならない。Sentencepieceのサブワード構築については「[Sentencepieceの分割をMeCabっぽくする](https://qiita.com/taku910/items/fbaeab4684665952d5a9)」っていう記事が1年以上前に出てるのだけど、ちゃんと読まずに構築しちゃったんだろうなあ。
論理否定の`!`と`nil?`メソッドを組み合わして使った際のメモ

# やろうとしたこと
- 条件分岐をさせるにあたって boolean で結果を取得したかった
- 「オブジェクトが nil なら false を返してほしい」という目的
    - `nil?`は「nil なら true を返す」ので論理否定と組み合わせた

▲しかし、論理否定`!`をと`nil?`を組み合わせて使うと自分が想定している結果が返ってこない

以下にサンプルを示す
```:ソースコード
p ("aaa")
p !("aaa")
p (nil)
p !(nil)
p ("----------")
p ("aaa").nil?     #【1】
p !("aaa").nil?    #【2】
p !(("aaa").nil?)  #【3】
p ("##########")
p (nil).nil?       #【4】
p !(nil).nil?      #【5】
p !((nil).nil?)    #【6】
```

```:実行結果
"aaa"
false
"----------"
false   #【1】
true    #【2】
true    #【3】
"##########"
true    #【4】
false   #【5】
false   #【6】
```
## 何が想定外と感じたか
- 【5】【6】の処理結果は異なると思っていた<br> ⇒【5】は false になると思っていた
    - 【5】について<br>「`nil`という値がある」という状態なのだから「`(nil)`はtrue」と思っていた

**＊`nil`は「false」であるという原理原則を理解していなかった** 

:::note warn
原理原則として以下が存在する
1. `true` は「真」
1. `false` と `nil` 以外はすべて「真」
1. `false` と `nil` は「偽」

（引用 ： https://www.javadrive.jp/ruby/if/index2.html ）
:::

# 他メモ
- 今回、自分は Rails で開発していたのだから他のメソッドに頼ればよかった
    - `present?`を使えば論理否定を使わなくて済んだはず<br>そっちの方が直感的で分かりやすい

https://qiita.com/somewhatgood@github/items/b74107480ee3821784e6
【2024年7月版】Debian BusterをBullseyeにアップデート・アップグレード【Lightsail】

# はじめに

2024/06/30 ついに、debian 10のサポート期限が切れた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143127/725f4e4f-a53d-4af3-a17e-99e81e5dce18.png)

`sudo apt update` っと、あれ？エラーがでてるぞ。。。
なんや、debian10のサポートおわってるやん。。どうしよ。。。

light sailで運用しているDebianが期限切れになったので、BusterからBullseyeに更新する方法です。

# 更新方法

ここでは、最小アップグレードを行っています。AWSのコンソールからスナップショットなどを取っておくとトラブル時に復元が楽です。

## `/etc/apt/source.list` の更新

`sudo vim /etc/apt/source.list` を実行して、以下のとおり、修正します。

```/etc/apt/source.list
#deb http://cdn-aws.deb.debian.org/debian buster main
#deb-src http://cdn-aws.deb.debian.org/debian buster main
#deb http://security.debian.org/debian-security buster/updates main
#deb-src http://security.debian.org/debian-security buster/updates main
#deb http://cdn-aws.deb.debian.org/debian buster-updates main
#deb-src http://cdn-aws.deb.debian.org/debian buster-updates main
#deb http://cdn-aws.deb.debian.org/debian buster-backports main
#deb-src http://cdn-aws.deb.debian.org/debian buster-backports main

deb http://cdn-aws.deb.debian.org/debian bullseye main
deb-src http://cdn-aws.deb.debian.org/debian bullseye main
#deb http://security.debian.org/debian-security bullseye/updates main
#deb-src http://security.debian.org/debian-security bullseye/updates main
deb http://cdn-aws.deb.debian.org/debian bullseye-updates main
deb-src http://cdn-aws.deb.debian.org/debian bullseye-updates main
deb http://cdn-aws.deb.debian.org/debian bullseye-backports main
deb-src http://cdn-aws.deb.debian.org/debian bullseye-backports main
```

## update && upgrade

update と upgrade を行います。
途中、設定ファイルをどうするか聞いてくることがあります。
わたしは既存の修正をしている設定ファイルを残すように指示しました。

```terminal
$ sudo apt update
$ sudo apt upgrade --without-new-pkgs
```

## full-upgrade

`apt full-upgrade` は、`apt upgrade` と似ていますが、重要な違いがあります。`apt upgrade` はパッケージのバージョンを上げるだけで、依存関係の変更に伴うパッケージのインストールや削除を行いません。一方、`apt full-upgrade` は依存関係の変更に伴うパッケージのインストールや削除も行います。

```terminal
$ sudo apt full-upgrade
```

## 確認

`bullseye` になっていることを確認する。

```
$ cat /etc/os-release 
PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
```

# さいごに

かんたんでしたね

# 参考リンク

- [Debian Wiki LTS](https://wiki.debian.org/LTS)
- [第4章 Debian 10 (buster) からのアップグレード](https://www.debian.org/releases/bullseye/amd64/release-notes/ch-upgrading.ja.html)
Flutter環境構築：M1 MacのAndroidStudio設定でも手こずった話

6年前までKotlinをちょこっと（ほんとにちょこっとだけ）勉強してたのですが、
開発をやめてしまったので、AndroidStudioをMacから消していたんです。
だからFlutter環境構築でAndroidStudioを選択するのも「ああ、簡単でしょう」なーんて思っていました。すみません、わたしが舐めていました。こちらでも手こずりました。

# 手こずった主な原因：cmdline-tools component is missing #
flutter doctorをコマンドにいれると
*cmdline-tools component is missing*
というメッセージが表示されます。

でもchat GPTに聞けばいいか、って安易な発想もまずかった
* `cmdline-tools`コンポーネントが不足しています。このコンポーネントをインストールする必要があります。path/to/sdkmanager --install "cmdline-tools;latest”+
このコマンドを打っても何の解決にもなりません。



## 対処した方法は次の通りです ##
* Android Studioを立ち上げる。
Projectの下の「More Actions」をクリック
![Welcome to Android Studio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586438/76397064-5999-13b0-2f0e-038ea90082b4.png)

* リスト表示がでてくるので「SDK　Manager」を選択
![New Flutter Project.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586438/dd943793-71c7-0d37-d48c-2a52af1b45e0.png)

* 開いた直後は下記のように「SDK Platforms（青い線が引いてある）」が選択されているので、右隣りの「SDK Tools」を選択
![Pasted Graphic 38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586438/94a0b60c-cc96-f2c8-c298-58c2d1db368a.png)

* 真ん中あたりに 「Android SDK Platform-Tools」があるので選択。
(この写真ではすでに選択済みです)
![Pasted Graphic 39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586438/d4897dc7-237d-3f0b-6e75-41ecb39b39c7.png)

* 変更確認がでてくるのでOKを選択!
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586438/501ac64e-216e-ef1d-c4d1-6311ea9c21ef.png)

これが終わったら、`flutter doctor`　をターミナルで入力して、確認・終了。


###参考記事###
Flutter環境構築 on M1 Macにおける`cmdline-tools component is missing`への対処2023
https://zenn.dev/watarungurunnn/articles/7ab04a8a3b4625
IBM i Services Directory : QSYS2.ASP_Info ビュー

IBM i システムに接続されているASP（IBM i の管理するLUN、仮想ストレージの管理単位）の情報を表示します。


## 概要
■表名：QSYS2.ASP_INFO ビュー
■カテゴリ：ストレージサービス
■サポート：IBM i 7.2 SF99702 Level 19以降
■参照URL（IBM i 7.5）：https://www.ibm.com/docs/ja/i/7.5?topic=services-asp-info-view

## 使用例

```
SELECT * FROM QSYS2.ASP_INFO;
```

### 実行例①　ASP1（システムASP）しか接続（構成）していないシステムの例。この構成のIBM i は多いかもしれません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/e9c12029-ba42-0c78-1c81-a4921340a80e.png)

ASP_Number 1 = システムASPとよばれます。ブートディスクを含むIBM i OSの必須部分がASP1に含まれます。AIXのrootvgと似たイメージでしょうか。

### 実行例②　複数のASPが接続された例

複数の行が返されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/54c391d3-d534-bfe0-4fcb-8323f309ee71.png)


## 主なカラムの説明

よく使われると思わるカラムについてご説明します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/a6c96840-6047-f676-d8e6-565545749519.png)

***ASP_STATE*** : IASPについてこのIBM i OSに接続している（オン）か、接続していないか（オフ）化を示します。

***ASP_TYPE*** : 以下のようなASPの種類を示します。

ASP1, 2, 33が見えます。ASP_Numberを見ると、ASPの種類か分かります。

***ASP1=システムASP***
***ASP2=2～32はユーザーASPとよばれます***
***iASP33～iASP255は独立ASPとよばれます***

[ASPの説明はこちら](https://qiita.com/gomAnomalocaris/items/ee93a0ea636b62e21878)

***RDB_NAME*** : WRKRDBDIREコマンドで確認できるDb2 for i のデータベース名です。
通常はASP1のRDB名がこのIBM i Db2 for i のデータベース名になります。

IASPはASP1と別でRDB名を持つんですね。ちなみに同じシステムのWRKRDBDIREコマンドでデータベース名を見ると、、、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/b1ad2104-367e-7113-249a-c36b34d3663d.png)

カーソル行がIASPのRDB名になります。さらにOPT欄に5を見ると、、ASP番号が分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/9c1d00e5-c5af-53b9-a941-71dd2b18e3ce.png)

***NUMBER_OF_DISK_UNITS*** : それぞれのASPグループに構成されているディスク（LUN）の数です。
この数は***WRKDSKSTSコマンド***で確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/96333f00-bc31-7ba7-2009-e6f92509e259.png)

WRKDSKSTS *PRINTで出力結果ですが、右から3つ目のカラムがASP/IASP番号です。ASP2, IASP33は1つずつLUNが構成されています。

***TOTAL_CAPACITY / TOTAL_CAPACITY_AVAILABLE*** : ASPの容量と使用可能容量MB


下記のカラム'sはエラーログ、マイクロコードログ、マイクロコードトレース、MSD(メインストレージダンプ）などログ・ダンプ系のサイズが表示されています。この情報一覧で取れるのは他にないかもしれないですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/bd8601e8-a12e-588f-488d-797408a070b1.png)

マイクロコード（57xx-999のライセンスプログラム）のサイズも表示されています。
OpenSSHバージョン確認方法

# 各種バージョン確認方法
OpenSSHにやばい脆弱性(CVE-2024-6387)が見つかったので、バージョン確認方法をまとめてみました。
## rpm
```
rpm -q openssh-server
または
rpm -qa | grep -i openssh
```
## dnf
```
dnf list openssh-server
```
[備忘録]　読んだネットの記事 (テクノロジーver.3)

# はじめに
こんにちは，Umamusume22です．再び読んだネットの記事の備忘録を書きます．

# 備忘録
[1] "ハイスピードカメラとAIを用いた高精細な音の見える化技術を開発"
https://monoist.itmedia.co.jp/mn/articles/2407/02/news085.html

- カメラやAIを活用して音をみえる化にする「光学的音場イメージング技術」を開発
    - 深層学習モデルによって光学的音場イメージング技術による高精細な音を可視化
    - レーザー光を音場内に伝搬
    - 干渉計によって光の微弱な変化を検出．この変化をハイスピードカメラで捉える
    - 動画像の中から不要なノイズを除去する独自の深層学習モデルを考案
        - 画像中の微弱な音波成分のみを抽出するニューラルネットワークを適用して高精細な音の画像化が可能となる

[2] "キヤノンが車載用大型特殊ディスプレイ向け露光装置、スマホ向け装置の活用促進"
https://monoist.itmedia.co.jp/mn/articles/2407/01/news090.html

- 自動車の多機能化で需要が高まる大型ディスプレイ
- 異形ディスプレイを採用する例も増えている
- 自動運転技術の発展やEVの市場拡大により，多様な車載用ディスプレイの需要が向上
    - 車載向けやスマホ向けのディスプレイの製造では，薄型，軽量が要求される
    - MPAsp-E1003HというFPR露光装置でディスプレイを製造
- ディスプレイ業界では解像力と重ね合わせ精度、生産性の3つが重要な要素

[3] "グリーン水素の製造装置に使える、チタン多孔質体薄板の生産工場を新設"
https://monoist.itmedia.co.jp/mn/articles/2407/02/news037.html

- チタン多孔質体薄板「WEBTi」を生産する新工場を建設
- WEBTiは、耐食性や導電性に優れたチタンを多孔質化

# 最後に
今回もまた備忘録の内容が短くて申し訳ありません．今，以前に書いたウマ娘の記事を発展させたエンジニアリングに取り組んでいます．完成したら投稿いたします．それまで楽しみにお待ちください．
記事を読んでいただきありがとうございました！

※ウマ娘の声をフーリエ変換した記事や水栓の開閉判定をLineに通知する記事も書いています．suzuが私です．興味がある方はぜひご覧ください！
https://vigne-cla.com/31-1/#toc5

※noteも始めました．
https://note.com/madoka235/n/nbba2153326e1

ぜひフォローよろしくお願いします!
【OpenSSH】CVE-2024-6387について

# はじめに
昨日、OpenSSHの開発元より、深刻な脆弱性([CVE-2024-6387](https://nvd.nist.gov/vuln/detail/CVE-2024-6387))が確認されたとして脆弱性の修正を行ったバージョン(OpenSSH 9.8p1)と共に情報が公開されました。

発出されたセキュリティ情報によると、規定設定のsshd環境において、リモートコード実行(RCE)の危険性があるとされています。

この記事では、当該脆弱性の詳細と、対策について書いていきます。


# 脆弱性の詳細
[CVE-2024-6387](https://nvd.nist.gov/vuln/detail/CVE-2024-6387)は、OpenSSHサーバー(sshd)に存在する脆弱性(およびエクスプロイト)あり、シグナルハンドラの競合状態に起因します。
glibcベースのLinux環境かつOpenSSHが規定設定で起動している場合に影響を受け、攻撃者はシステム上で任意のコードをroot権限で実行することができます。

ちなみに、この脆弱性が回帰バグ起因のものであることから、regreSSHionと呼称されていたりします。

# 影響
この脆弱性は、OpenSSH 4.4p1以前、あるいは8.5p1 ‐ 9.8p1以前のバージョンの環境で影響をウケる可能性があります。

また、OpenSSH 4.4p1以前のバージョンの場合に限っては、[CVE-2006-5051](https://nvd.nist.gov/vuln/detail/CVE-2006-5051)、[CVE-2008-4109](https://nvd.nist.gov/vuln/detail/CVE-2006-4109)に対する修正パッチが適用されている場合は影響を受けないようです。

加えて、OpenBSDにおいては独自の修正が入っているようで、影響を受けません。

この脆弱性を発見したQualys氏による分析では、公開ホストのうち、3割程度、約70万件のホストが脆弱な状態にあると推定されているようです。

また、OpenSSHの開発チームによる実証実験によると、[CVE-2024-6387](https://nvd.nist.gov/vuln/detail/CVE-2024-6387)による悪用が可能になるまで平均で6-8時間の連続した接続が必要だったとのことです。

これは、前述の通り[CVE-2024-6387](https://nvd.nist.gov/vuln/detail/CVE-2024-6387)がシグナルハンドラの競合状態に起因しているためで、Qualysも「実際に任意のコマンドを実行するには何度か繰り返しの試行が必要で、この脆弱性を悪用するのは困難だ」と言われています。

# 対策について
既にパッチ適用バージョンが公開されているので、可能な限り最新のものへ更新しましょう。

どうしても更新ができない環境である場合は、`LoginGraceTime`を0とし、タイムアウトを無効化することで影響を受けるリスクが軽減されるかと思います。

ネットワークレベルでのアクセス制限の見直しや、セグメンテーションも有用な手段といえます。

# さいごに
今回触れた[CVE-2024-6387](https://nvd.nist.gov/vuln/detail/CVE-2024-6387)に限らず、脆弱性への対策はシステムの運用者にとって重要な責務であり、継続的な取り組みが必要です。

ここで重要なことは、単に更新・対策をして完了するものではありません。
常にあたらしい情報を追いかけ、適切な対策を講じ続けることを心掛けなければなりません。

この記事が誰かのお役に立てれば幸いです。
Snowflakeで初めてのFunction作成

Snowflakeで関数作れるらしいです。

UDF（user-defined function：ユーザー定義関数）というやつですね。
OracleのFunctionとだいたい一緒かな？となんとなく思っているものの、
触ったことがないので一度作ってみようとやってみました。

お試しでどんな関数を作りましょうか？
西暦から和暦変換をする関数でも作りましょう。
言語はPythonです。
私の頭では考えられないのでClaude 3.5 Sonnetに書いてもらいました。

私：`Pythonで西暦から和暦に変換するコードを書いてください`
Claude先生：`以下に、西暦から和暦に変換するPythonコードを示します。このコードは、明治、大正、昭和、平成、令和の5つの元号に対応しています。`
```
def seireki_to_wareki(year):
    if year < 1868:
        return f"{year}年は明治以前です"
    elif 1868 <= year < 1912:
        era = "明治"
        era_year = year - 1867
    elif 1912 <= year < 1926:
        era = "大正"
        era_year = year - 1911
    elif 1926 <= year < 1989:
        era = "昭和"
        era_year = year - 1925
    elif 1989 <= year < 2019:
        era = "平成"
        era_year = year - 1988
    else:
        era = "令和"
        era_year = year - 2018
    
    return f"{era}{era_year}年"

# 使用例
print(seireki_to_wareki(2024))  # 令和6年
print(seireki_to_wareki(1989))  # 平成1年
print(seireki_to_wareki(1926))  # 昭和1年
print(seireki_to_wareki(1912))  # 大正1年
print(seireki_to_wareki(1868))  # 明治1年
print(seireki_to_wareki(1867))  # 1867年は明治以前です
```
2秒くらいで返ってきました。
天才ですね。

ではこれをSnowflakeのUDFにして見ましょう。
```
CREATE OR REPLACE FUNCTION seireki_to_wareki(year int)
RETURNS VARCHAR
LANGUAGE PYTHON
RUNTIME_VERSION = '3.8'
HANDLER = 'seireki_to_wareki_py'
as
$$
def seireki_to_wareki_py(year):
    if year < 1868:
        return f"{year}年は明治以前です"
    elif 1868 <= year < 1912:
        era = "明治"
        era_year = year - 1867
    elif 1912 <= year < 1926:
        era = "大正"
        era_year = year - 1911
    elif 1926 <= year < 1989:
        era = "昭和"
        era_year = year - 1925
    elif 1989 <= year < 2019:
        era = "平成"
        era_year = year - 1988
    else:
        era = "令和"
        era_year = year - 2018
    
    return f"{era}{era_year}年"
$$;
```

Snowflake上に関数ができたので使ってみます。
```
select seireki_to_wareki(1989);
```
| SEIREKI_TO_WAREKI(1989) |
|:-:|
| 平成1年 |

こういう汎用的なのではなくて、自社データを使った関数なんかを作っていけばいろんな処理からこの関数呼ぶといいよって言えますね。
SageMakerでのデプロイメント(1/2): SageMakerデプロイについて

# 背景

- 機械学習プロジェクトで、GPUを使ったサーバーが必要になりました
- 仕様としてサーバーで行う処理はジョブ形式で、常時サーバーを起動しておく必要はありませんでした
- そこで、AWSのSageMakerを使うことにしました。SageMakerは、機械学習モデルの構築、トレーニング、デプロイを効率的に行えるサービスで、コストも抑えられます。

この記事では、SageMakerについての基本的な情報や、私が参考にした記事を紹介します。

# SageMakerとは

https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/whatis.html

> SageMakerはフルマネージドのMLサービスです. SageMakerによって、データサイエンティストはMLモデルの構築・学習・デプロイを本番環境レベルの環境で高速に行うことが可能になります. 

![スクリーンショット 2024-07-02 10.07.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20307/66938c82-540b-00aa-d128-fdeb60a5d69a.png)


SageMakerでは以下の処理を行うことができます。

1. データの前処理
2. モデルの学習
3. モデルのデプロイ

今回の記事では、**モデルのデプロイ** に焦点を当てています。


# SageMakerのデプロイとは

https://docs.aws.amazon.com/sagemaker/latest/dg/how-it-works-deployment.html

SageMakerデプロイには大きく分けて4種類あります

- リアルタイム
- サーバーレス
- 非同期
- バッチ


使い分けは以下のフローチャートから

![スクリーンショット 2024-07-02 10.09.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20307/0ddb87b7-dea7-c9ac-1138-8345b888c555.png)

### デプロイの大まかな流れ
- SageMaker用のContainer Image(※1)とMLモデルを組み合わせてSagemaker用のモデルを作成します
- SageMaker用のモデル(※2)が作成とエンドポイント設定(※3)を使ってデプロイするとサーバーが用意されます

![スクリーンショット 2024-07-02 10.09.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20307/de818d65-4a26-b677-c042-e5b0ef8cb44a.png)

- (※1) SageMaker用のContainer Image一覧: https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg-ecr-paths/ecr-ap-northeast-1.html 
- (※2) SageMakerのモデル: AWSのコンソールの SageMaker -> 推論　-> モデル で表示されるオブジェクト
- (※3) エンドポイント設定: AWSのコンソールの SageMaker -> 推論　-> エンドポイント設定 で表示されるオブジェクト

# 詳細とGettingStarted

色々書いてきましたが以下のyoutubeで、デプロイの全体像がめちゃくちゃわかりやすく説明されています

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

この動画を見てサンプルのScikit-Learnコンテナや、Pytorchコンテナのデプロイまで一通りやるとかなり理解が深まります.

https://github.com/aws-samples/aws-ml-jp/tree/main/sagemaker/sagemaker-inference/inference-tutorial

Python Libraryでのデプロイサンプルコードもありますが、基本的にはboto3でのデプロイサンプルで挙動を把握していくことをお勧めします. 非同期推論や、バッチ推論のサンプルはboto3でのものが多いですし、挙動の詳細がよくわかります.
【UiPath】セマンティック アクティビティのフォームに入力を試す

# はじめに

本記事では、UiPath.UIAutomation.Activities v24.10.0 でリリースされたセマンティック アクティビティの中から`フォームに入力`アクティビティを紹介します。

:::note info
セマンティック アクティビティは v24.10.x では試験段階のプレビュー版となります。そのため記事の内容と今後異なる可能性があることご承知おきください。
:::

この記事は、UiPathブログ 発信チャレンジサマー2024の4日目の記事です。

https://note.com/shumpei_w/n/n023a4401b040

# セマンティックってなに
セマンティック（Semantic）とは「意味の、語義の、意味論の、意味論的な」などの意味を持つ形容詞のようです。セマンティック アクティビティは意味を解釈して実行するアクティビティということでしょうか。

https://eow.alc.co.jp/search?q=semantic

# セマンティック アクティビティとは
ドキュメントがまだ日本語化されておらず意訳すると、フォーム自動化をより簡単に、よりシンプルにするためのアクティビティ群となります。

[UIAutomationアクティビティパック v24.10.0 リリースノート](https://docs.uipath.com/ja/activities/other/latest/ui-automation/release-notes-uipath-uiautomation-activities-v24-10#semantic-activities)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/546552e2-8b32-9ca0-fc47-ba28ddffd6f1.png)

UIAutomation v24.10.0 では以下の3つのアクティビティが提供されます。

* **[フォーム データを抽出](https://docs.uipath.com/ja/activities/other/latest/ui-automation/n-extract-form-data-generic)**
AI を使用してフォーム データをシームレスに抽出します。

* **[フォームに入力](https://docs.uipath.com/ja/activities/other/latest/ui-automation/n-fill-form)**
AI を使用して、指定したデータ ソースから抽出した情報を画面上のフォームへシームレスに入力します。DocumentData、Dictionary、DataEntity、DataRow、DataTable、JSONファイルなどをデータソースとして使うことができます。

* **[値を設定](https://docs.uipath.com/ja/activities/other/latest/ui-automation/n-set-value)**
AI を使用して、入力ボックス、ドロップダウン、チェック ボックス、ラジオ ボタンなどの任意の入力フィールドへシームレスに値を設定します。

# 使ってみる
`フォームに入力`アクティビティは`アプリケーション/ブラウザーを使用`アクティビティの中に配置する必要があります。

:::note info
UIAutomation v24.10.x ではブラウザー上のウェブアプリケーションのみ対応しており、デスクトップアプリの自動化はできないようです。今後の改善に期待ですね。
:::

プロパティはとてもシンプルで要素の指定すらできません。データソースにDictionaryやDataTable型の変数を渡すことで、画面上の入力フォームを自動判別して入力してくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/df08d449-5366-9b9b-7db1-4e7f7437284c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/347f7236-02fc-1be3-6805-69f0db84150d.png)

## RPA Challengeで試してみる

`フォームに入力`アクティビティ使ってRPA Challengeを自動化してみます。
項目ごとに`文字を入力`アクティビティを使わないので非常にシンプルになっています。

https://www.rpachallenge.com/?lang=JA

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/bae2dbde-4fca-1435-3b2c-1b3fb320f5a5.png)

フォームの解析に少し時間がかかっていますが、項目を間違えずに入力できています。

![RPAChallenge.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/3b9cecca-1e12-fb50-4de3-2c89ada732ef.gif)

## 他のフォーム画面で試してみる

続いてUiPath Demoサイトにある経費登録を試してみます。

https://www.expense-demo.com/

このフォームでは、種別がドロップダウンになっていて残念ならが`フォームに入力`アクティビティでは入力することはできず実行エラーが発生してしまいました。

![UiPathDemo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/f364a457-4891-47ea-36b1-87adff5e724e.gif)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/30cbedf8-34ec-f97d-102d-c8e4830a8107.png)

# おわりに
試験段階ということで対応していない入力項目もありまだ発展途上ですが、今後の展開次第では開発生産性が劇的に上がる可能性を秘めているように感じます。

是非皆さんもお試しください。
システム内製化の経営学（１）

 これまで経営者やコンサルタント、また情報システム部門や管理部門の責任者としてシステムの内製に携わった経験をもとに、勝手な与太話を展開させていただきます。
 
 まず、そもそも論になりますが、システム開発がもたらす最大の価値はどのようなものかというと、以下のように大別できるかと思います。
 
１．新たなビジネスモデルや収益源の創出（戦略的価値）

２．既存プロセスの効率化・省人化（効率的価値）

　電子計算機の発明いらい、ビジネスにおいて求められた役割は、人手による事務作業を代替できることでした。上の二分法でいうと、２の効率的価値の実現を主眼としてきたことは間違いありません。ただ一方で、コンピューターが珍しかった時代は特にそうですが、最新鋭の機械を用いて革命的ともいえる程度に効率化や省人化を達成すれば、そのこと自体で戦略的とも言える大きな経済的価値がありました。こんにち、一般的に戦略的価値を実現していると考えられているさまざまなプラットフォームやアプリケーションにしても、何かを組み合わせて革命的にビジネスの効率を高めるということが発想の出発点となっていること多いことも事実です。戦略的か効率化かといった杓子定規な二分法ではなく、企業経営や経済に与える影響をありのまま柔軟に見ていきたいものです。
 
　次に、これらの価値を生み出すシステムの企画や開発の過程を見てみましょう。戦略的価値というのは、画期的なサービスや新しいビジネスモデルの創出のことなのですが、その典型的な形として、GoogleやAmazonなどのいわゆるBig Techの社内で開発され世に出される製品やサービスがあります。これは「究極の内製」ともいえるパターンですが、通常の内製と違うのは、これらBig Techにはそのような戦略的な大仕事を目論む逸材が集積し、常に次の一発を狙って企画開発にいそしんでいるという意識の在り様です。Big Techにとっては、そのようなプロセスが本業の重要な一部であり、他社と、また社内でも厳しい競争の中で切磋琢磨しながらさらに能力を高めているのです。
 
　このようなBig Techのシステム開発の在り方は、それを本業としていない大多数の企業にとって真似のできるものではありません。ただし、きわめて限定的ながら、通常のベンダー外注で戦略的価値のあるシステムができる場合もあります。それは、すでに発注側の社内に競争優位を確立したビジネスモデルがあって、それを情報システムに固定するようなケースです。日本でも、このようなシステム要件によってビジネスモデル特許が申請できるようになりました。
 
　このように考えると、戦略的価値をもたらすシステム開発というのは希少で、世の中のほとんどの開発は、内製、外注を問わず、効率的価値を実現するためのものであるといえます。ただし、上述のように、仮に市場構造を変革するくらいに革命的な効率化を成し遂げることができるならば、そのシステムは戦略的価値を帯びることになります。
 
　いささかそもそも論が長くなってしまいましたが、この情報システム開発を内製で行うことの意味、メリットとしては、一般的に以下のようなことが言われています。
 
 　まず、開発する側もユーザー側も同僚であるため、開発者はユーザーの事情・経緯について知識・認識があり、そのうえ企画・開発過程での連携・調整も慣れ親しんだ社内コミュニケーションの範疇であるため誤解や齟齬が起こりにくい。結果的にシステムの内製開発は
  
１．フィット感・ユーザー満足度が高くなる

２．企画からゴーライブまでが迅速

という利点が強調されます。
 
 これに加えて、３点目として「ベンダー外注よりも低コストで開発できる」ということもよく言われています。この点はまさに本稿の議論の中心のひとつとなる部分で、慎重な吟味を要するというのが筆者の見解です。
 
　確かにシステム外注費（保守・運用工数も含む）という目に見える支出を節約するという意味で低コストとなることは間違いないでしょう。しかしながら、この後に説明する内製を可能とする条件を整えるまでの投資や埋没費用の累積を考えれば、それほど低コストとは言えません。少し結論を先取りすると、内製化は、過去のコストを回収するような状況であれば節約になるが、内製化のために新たにまとまった支出を行うような場合には、おそらく外注する場合よりも財務上は有利にはならないであろう、ということです。このことについて、以下なるべくわかりやすく説明したいと思います。
 
　まず、大前提として、情報システムの内製には「内製された人材」すなわち内部で育った人材が不可欠である、ということです。そんなことは当たり前だとおっしゃる向きもあるかも知れませんが、内製の人材が当たり前に存在していない企業も数多くあります。
 
 　ここで、システム内製のための「内製の人材」とはどのような人々なのか、定義しておきます。内製人材には２種類あります（以下のＡおよびＢ）。

Ａ. 自社のビジネスモデルや社内のプロセス・慣行について知識・認識のある社員エンジニア、またはグループ内ベンダーなどからの派遣エンジニア

Ｂ. 一定期間の勤続を経た中堅・管理社員で、ローコード/ノーコードのツールをカ活用して自社用のシステムを作成する能力・意欲・時間のある人々

　いずれの場合でも、ある程度の年月、その会社にいることが大前提となります。
　加えて、特にＢの場合ですが、ある程度の能力・ポジションの人材を本来の担当業務から外して内製プロジェクトに従事させることができなければなりません。
 
　このような内製された人材はいかにして確保できるのか。次回以降でその条件について整理していきたいと思います。
JetBrains IDE+リモートDev Containerな開発

リモートサーバーにてDev Containerを起動して、そこにJetBrains IDEで乗り込んで開発する方法について説明します。

以下のような構成を前提としています。

```mermaid
graph TB

subgraph tailnet["Tailscale VPN"]
  subgraph your-machine["ローカル (macOSなど)"]
    ide("JetBrains IDE")
  end
  subgraph remote-host["リモートサーバー (Ubuntuなど)"]
	    docker-daemon("🐳 Dockerデーモン")
	    .devcontainer/devcontainer.json
		  subgraph dev-container["Dev Container (Docker Container)"]
			  code("Code")
		  end
  end
end

your-machine --->|直接SSH| dev-container
```

# 必要なもの

## ローカルマシンに必要なもの

[JetBrains Gateway](https://www.jetbrains.com/ja-jp/remote-development/gateway/) をインストールしておいてください。WebStormなどの個別のIDEは一旦不要です。Gateway利用時に勝手にインストールされるので。

## リモートサーバーに必要なもの

- TailscaleなどでSSH可能な状態になっていること。環境セットアップのタイミングでのみ使います。
- Dockerと[Dev Container CLI](https://github.com/devcontainers/cli)がインストールされていること
- 開発対象のアプリケーションコードが `git clone` されていること
    - そのコードベースには、`.devcontainer/devcontainer.json` があること

## Dev Containerに必要なもの

- TailscaleなどでSSH可能な状態になっていること。

# 手順

## リモートサーバーでDev Containerを起動する

リモートサーバーにSSHし、Dev Container CLIでDev Containerを起動します。

```jsx
devcontainer up --workspace-folder .
```

## JetBrains GatewayでDev Containerに繋ぐ

左ペインの「SSH」タブを開き、右上の「New Project」ボタンを押す。

![CleanShot 2024-07-02 at 15.56.00@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889/d52e68d6-6cb6-4450-0773-831b4c5bf301.png)


「Connect to SSH」ダイアログが出るので、「Username」と「Host」、「Port」を埋めて、「Check Connection and Continue」ボタンを押す。

![CleanShot 2024-07-02 at 16.00.30@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889/50c46d6c-17b5-bad3-9f85-1e3af296122f.png)


次に、「Choose IDE and Project」ダイアログが出るので、「IDE version」と「Project directory」を指定し、「Download IDE and Connect」ボタンを押す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889/31ca154d-ffb3-c4a8-49f7-e5c719088b7b.png)


しばらくするとIDEが起動して作業に取り書かれる状態になります。

# Q&A

## JetBrains Gatewayの「Dev Container」機能は使わないの？

JetBrains Gateway自体Betaですが、さらにその機能のひとつである「Docker Dev Container」もBetaなので、そのうち改善されるかもしれませんが、現状はいろいろ機能が足りてなくて実用するには難しいです。簡単な構成のDev Containerなら使えなくもないですが、Dev Container起動時に環境変数を求める構成になっていると、JetBrains Gatewayには環境変数がセットできないため積みます。
IBM i のストレージ管理 : システムASP,ユーザーASP, IASP

IBM i のストレージはASPとよばれる仮想ストレージボリューム単位で管理されます。ASPは一言で言うと、IBM i OSが管理するLUNと思えば大筋あってます。

***ASP：補助記憶域プール（Auxiliary Storage Pool）*** の略です。


## ASPの種類は3つ 

ASPは3つの種類があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/6698dee8-246a-d707-cf51-9e1f542c1693.png)

***システムASP、基本ユーザーASPはIBM i OS IPL時に必須のボリューム***
***IASPはIBM i OS IPL時に必須ではない（IBM i 起動中にオフ・オン（接続・切断）ができる）***


## システムASP(ASP1)
ロードーソース（ブートドライブ）とその他のOS基本部分は必ずシステムASPにインストールされます。
システムASPはASP1とよばれることもあります。

※上図ではロードソース以外のシステムASPのディスクをASP1と表現していますが、ロードソース含むシステムASP全般をASP1と呼ぶことも多いと思います。

## 基本ユーザーASP (ASP2～ASP32)
または単にユーザーASPとよばれることも多いと思います。（理由はIASPは途中から登場した追加機能だからです。ユーザーASPはOS/400 V1の初版から存在する機能です。）

基本ユーザーASPはASP2～ASP32の番号が振られます。（1つのIBM i OSで最大31個の基本ユーザーASPが割当可能という事です。）

***基本ユーザーASPのユースケースとして、ASP1にOS、M/W、業務アプリ、データベース（テーブルほか）をインストールし、ASP2～にジャーナル（データベースログ）を分離して格納する事が多いです。
理由はストレージパフォーマンス最適化があります。かつてはジャーナル用ASP2には低速で容量単価の安いストレージで構成することもよく行われました。近年ですとNVMeで劇的に性能・MB単価が改善しているのでこのような例は少なくなっているはずと思います。）***

以上2つがIBM i OS起動時必須のストレージとなります。

***システムASPと基本ユーザーASPを合わせて、＊*SYSBASと表現することもあります。***

## 独立ASP(iASP) (iASP33～iASP255）

***iASP：独立ASP（Independent Auxiliary Storage Pool）***　の略です。

IASPが登場した背景はHA/DR構成を作成する際、複数のIBM i (Powerサーバーハードウェア）間でIASPディスクグループを切替接続したい、という要件の為です。

したがって ***IASPはIBM i OSブート時の必須ストレージではありません。IBM i OS起動時（起動後）に随時オフ・オンできるストレージボリュームになります。***

※IASPはIBM公式マニュアル系でもiASPと表記していることもありますね、どちらでも同じです。以前はiASPと表記が多かった記憶がありますが、最近の記載はIASPと大文字が多いようです。
【Ruby】ifとunless

# if文
```ruby:qiita.rb
a = 100
if a == 100 #条件
  puts "aは100です" #条件を満たした時の処理
end
```
if文は、条件を満たした時に処理を実行。
条件を満たす時とは、条件がtrueの時。
# unless文
```ruby:qiita.rb
a = 200
unless a == 100 #条件
  puts "aは100ではありません" #条件を満たした時の処理
end
```
unless文は、条件を満たさない時に処理を実行。
条件を満たさない時とは、条件がfalse若しくはnilの時。
unless == if notのイメージ。


なお、下記のようにif文を用いて書き換えも可能。
```ruby:qiita.rb
a = 200
if a != 100 #条件
  puts "aは100ではありません" #条件を満たした時の処理
end
```
この場合は、条件（a != 100）がtrueなので、条件を満たした時の処理が実行される。
PythonでFizzBuzz問題を解いてみよう

# PythonでFizzBuzz問題を解いてみよう

こんにちは！今回はプログラミングの基本中の基本である「FizzBuzz問題」をPythonで解いてみたいと思います。
FizzBuzz問題は、簡単ながらも様々な解法があるため、初心者から上級者まで楽しめる問題です。

## FizzBuzz問題とは？

1から100までの数字を順に表示するプログラムを作成します。ただし、次の条件を満たす場合には数字の代わりに特定の単語を表示します：

- 数字が3で割り切れる場合は「Fizz」
- 数字が5で割り切れる場合は「Buzz」
- 数字が3でも5でも割り切れる場合は「FizzBuzz」

では、さっそく基本的な解答例から見ていきましょう。

## 基本的な解答例

まずはシンプルな解答です。

```python
for i in range(1, 101):
    if i % 3 == 0 and i % 5 == 0:
        print("FizzBuzz")
    elif i % 3 == 0:
        print("Fizz")
    elif i % 5 == 0:
        print("Buzz")
    else:
        print(i)
```
        
このコードは、条件に従って適切な文字列を出力します。

結果
```
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
・・・
```

## 条件分岐を1行で書く
次に、条件分岐を1行で書く方法を見てみましょう。三項条件演算子（Pythonでは三項条件式）を使います。

```python
for i in range(1, 101):
    print("FizzBuzz" if i % 3 == 0 and i % 5 == 0 else "Fizz" if i % 3 == 0 else "Buzz" if i % 5 == 0 else i)
```
このコードでは、if文を使わずに1行でFizzBuzzの条件分岐を実現しています。

## 条件分岐を禁止
次に、条件分岐を使わずにFizzBuzz問題を解く方法です。文字列の結合を利用します。

```python
for i in range(1, 101):
    output = ""
    output += "Fizz" * (i % 3 == 0)
    output += "Buzz" * (i % 5 == 0)
    print(output or i)
```
このコードでは、outputという文字列を初期化し、iが3で割り切れる場合には"Fizz"を、5で割り切れる場合には"Buzz"を追加しています。どちらにも当てはまらない場合にはoutputが空文字になるので、その場合には数字を出力します。

## 剰余を禁止
最後に、剰余を使わずにFizzBuzz問題を解く方法です。ループカウンタと別のカウンタを使って割り切れるかどうかを判定します。

```python
コードをコピーする
fizz_count = 0
buzz_count = 0

for i in range(1, 101):
    fizz_count += 1
    buzz_count += 1

    output = ""
    
    if fizz_count == 3:
        output += "Fizz"
        fizz_count = 0
    if buzz_count == 5:
        output += "Buzz"
        buzz_count = 0

    print(output or i)
```
このコードでは、fizz_countとbuzz_countというカウンタを使って3の倍数と5の倍数を判定しています。
fizz_countが3になったら"Fizz"を、buzz_countが5になったら"Buzz"を追加し、それぞれのカウンタをリセットします。いずれのカウンタもリセットされない場合は数字を出力します。

# まとめ
FizzBuzz問題は、プログラミングの基本的なロジックを学ぶのに最適な問題です。
様々な制約条件を追加することで、同じ問題でも異なるアプローチを試すことができます。是非、自分なりのFizzBuzz解法に挑戦してみてください！

楽しんでいただけたなら、いいねやコメントをいただけると嬉しいです！
go言語 メモリ領域

# メモリ領域
Go言語でどのメモリが使用されるのか残しておきたかったので、その記録です。
```
[低アドレス]
+------------------+ 0x00000000
|   ブートローダー  　　　　　|  BIOS/UEFIによって最初に実行されるコード
+------------------+ 例: 0x00080000
|   カーネル         |  オペレーティングシステムの中心部分
+------------------+ 例: 0x00100000
| スタティック初期化領域 |
+------------------+ 例: 0x00200000
|    *テキスト領域  　　　　|  プログラムのコード（命令）
+------------------+ 例: 0x00400000
|    *データ領域   　　 |  グローバル変数、静的変数
+------------------+ 例: 0x10000000
|    バッファ領域  　　　　 |  I/O操作のための一時データ保存
+------------------+ 例: 0x20000000
|   *ヒープ領域     　　　|  動的に確保されるメモリ
|                  |  動的メモリ割り当てが行われる
|                  |
+------------------+ 例: 0x7FFFFFFF
|                  |
|   *スタック領域  　　　　　　|  ローカル変数、関数引数、戻り値
+------------------+ 0xFFFFFFFF
[高アドレス]
```
低アドレスには、コンピュータを動かす上で重要な、変動しづらい値やコードが格納される傾向があるようです。

Go言語において、主に関係するメモリ領域はテキスト領域、データ領域、ヒープ領域、スタック領域の4つです。それぞれの領域がどのように使用されるか、簡単なコード例を使って説明します。

## 1. テキスト領域 (Program/Code)
プログラムの機械語の命令が格納される領域です。Goでは特に明示的に触れることは少ないですが、バイナリに変換されたコードがこの領域に格納されます。

## 2. 静的領域 (Static/Data)
グローバル変数や静的変数が格納される領域です。Goではパッケージレベルの変数がこの領域に格納されます。
```go
package main

import "fmt"

// グローバル変数
var globalVar int = 10

func main() {
    fmt.Println(globalVar)
}
```
この例では、`globalVar`は静的領域に格納されます。

## 3. ヒープ領域
動的に確保されるメモリ領域で、Goではポインタやスライス、マップなどがこの領域に格納されることが多いです。ヒープ領域は、new や make で動的にメモリを確保します。

```go
package main

import "fmt"

func main() {
    // ヒープ領域に確保される
    p := new(int)
    *p = 20
    fmt.Println(*p)

    // ヒープ領域に確保される
    s := make([]int, 5)
    s[0] = 1
    fmt.Println(s)
}
```
この例では、`p`と`s`はヒープ領域にメモリが確保されます。

|  |  |
|:-:|:-:|
| 目的  |動的に確保されるメモリ（ランタイム中にサイズが変わるデータ）を保存する。|
| 管理方法 |手動で確保と解放（Goではガベージコレクタが自動で解放）。|
| 特徴  |スタックよりも大きなメモリを扱うことができるが、管理が複雑でアクセス速度が遅くなることがある。|

## 4. スタック領域
関数内のローカル変数や関数の引数、戻り値などが格納される領域です。Goではローカル変数がこの領域に格納されます。
```go
package main

import "fmt"

func main() {
    // スタック領域に確保される
    localVar := 30
    fmt.Println(localVar)
}
```
この例では、`localVar`はスタック領域に格納されます。

|  |  |
|:-:|:-:|
|目的   |関数呼び出しに関連するデータ（ローカル変数、関数引数、戻り値など）を保存する。|
|管理方法   |LIFO（Last In, First Out）方式で管理され、自動的に確保および解放される。|
|特徴   |高速ですが、サイズが限られているため、大きなデータ構造や長期間保持するデータには適していない。|

# まとめ
__テキスト領域__: プログラムの機械語の命令が格納される。
__静的領域__: グローバル変数や静的変数が格納される。
__ヒープ領域__: 動的に確保されるメモリ（ポインタ、スライス、マップなど）。
__スタック領域__: 関数内のローカル変数や引数、戻り値が格納される。

| 項目 | スタック領域 | ヒープ領域 |
|:-:|:-:|:-:|
|管理方法|自動|手動（GC）|
|サイズ|制限あり|大きい|
|速度|高速|遅い|
|メモリ解放|自動|手動（GC）|
|使用例|ローカル変数|動的メモリ|

このように、Go言語でもメモリは4つの領域に分かれており、それぞれの領域でどのように変数が格納されるかが決まっています。
さまざまな方法: Outlook PST 連絡先から vCard (VCF) へのエクスポート/転送

<p>このサイトでユーザーが Outlook の連絡先を vCard ファイルにエクスポートする理由と状況は、私たちにはわかっています。ここでは、4 つの手動の方法と 1 つの自動化ツールについて説明します。まずは無料の方法を試してから、経験豊富な DataVare アドレス帳マネージャーを使用してください。まずは簡単な概要から始めましょう。</p>
<p>vCard は仮想名刺です。vCard は使いやすい UI と、メモや写真のプレースホルダーなどの追加機能を提供します。保存された .vcf ファイルには、電話番号、FAX 番号、電子メール アドレスと住所、誕生日、メモ、その他の連絡先フィールドなど、すべての連絡先情報が含まれています。</p>
<h2><strong>Outlook から vCard ファイルに連絡先をエクスポートする主な理由</strong></h2>
<ul>
    <li>連絡先を Gmail などの別のメール クライアントに移動します。</li>
    <li>たとえば、Excel で連絡先を編集し、それを Outlook にインポートして連絡先を一括管理できます。</li>
    <li>連絡先やその他のアイテムの種類を新しいコンピューター、デバイス、またはアカウントに移動します。</li>
    <li>連絡先をバックアップします</li>
</ul>
<h2><strong>Outlook から vCard ファイルに連絡先をエクスポートする 4 つの実証済みの方法</strong></h2>
<ul>
    <li>Outlook から連絡先を vCard (.vcf) 形式にエクスポートするには、[名前を付けて保存] を使用します。</li>
    <li>Outlook のインポート/エクスポート ウィザードを使用して、Outlook の連絡先を vCard ファイルにエクスポートします。</li>
    <li>転送機能と多数の連絡先を含む vCard を作成します。</li>
    <li>エキスパート ツール。</li>
</ul>
<h3><strong>方法 1: [名前を付けて保存] を使用して Outlook の連絡先を vCard (.vcf) ファイルにエクスポートします。</strong></h3>
<ul>
    <li>Microsoft Outlook を開きます。</li>
    <li>メニュー バーに進みます。</li>
    <li>Outlook 2007 および 2010 では [連絡先] を選択し、Outlook 2013 では [連絡先] を選択します。</li>
    <li>vCard 形式でエクスポートする連絡先を選択します。</li>
    <li>[ファイル] タブを選択した後、[名前を付けて保存] ボタンをクリックします。</li>
    <li>ファイルを保存するフォルダーと場所を指定し、vCard ファイルの種類として [保存] を選択します。</li>
    <li>[保存] をクリックして、すべての連絡先を vCard ファイルとしてエクスポートします。</li>
</ul>
<h3><strong>方法 2: Outlook のインポートとエクスポート ウィザードを使用して、連絡先を vCard ファイルにエクスポートします。</strong></h3>
<ul>
    <li>連絡先フォルダを開いて、連絡先を vCard にエクスポートします。</li>
    <li>連絡先が開いた状態で開いたウィンドウから、[ファイル] を選択します。</li>
    <li>[名前を付けて保存] をクリックし、適切な場所を .vcf として選択します。</li>
</ul>
<h3><strong>方法 3: 転送機能と多数の連絡先を備えた vCard を作成します。</strong></h3>
<ul>
    <li>膨大な連絡先リストを vCard としてエクスポートするには、連絡先を名刺として送信し、フォルダーに保存します。</li>
    <li>vCard としてエクスポートする連絡先を選択します。連絡先を名刺として送信するには、[ホーム] &gt; [転送] をクリックします。</li>
    <li>メッセージ ウィンドウの [添付] ボックスで各連絡先を右クリックし、コンテキスト メニューからすべてを選択します。</li>
    <li>Ctrl + C を使用して連絡先のコピーを作成します。フォルダーに移動して連絡先を見つけます。最後に、Ctrl + V をクリックして挿入します。</li>
</ul>
<p>Outlook 2007 以前のバージョンでは、[アクション] &gt; [完全な連絡先を vCard 形式で Web に送信] を選択することに注意してください。</p>
<h3><strong>Outlook の連絡先を vCard (VCF) ファイルにエクスポートする自動プログラム</strong></h3>
<p>インテリジェントな <strong>DataVare アドレス帳マネージャー ツー</strong>ルは、インタラクティブでユーザー フレンドリ、わかりやすく、わかりやすいグラフィカル ユーザー インターフェイスを備えているため、<a target="_blank" rel="noopener noreferrer" href="https://www.datavare.com/jp/address.html"><strong>Outlook PST 連絡先から vCard (VCF) ファイルにエクスポート/転送</strong></a> を正確かつ簡単に実行できます。サードパーティ アプリケーションは無料でダウンロードでき、いくつかの連絡先を vCard (.vcf) 形式で保存します。すべての Microsoft Outlook バージョンに適しています。すべての Windows バージョン (11、10、8.1、8、7、Vista、XP) は、サードパーティ アプリケーションと互換性があります。</p>
<h3><strong>最終的な考え</strong></h3>
<p>ユーザーは、このブログ投稿を読むことで、PST 連絡先を VCF ファイル形式にエクスポートする方法を見つけることができます。Outlook PST 連絡先を VCF ファイル形式に変換するには、ブログで詳細かつ安全な手順が提供されています。PST 連絡先を VCF にエクスポートする場合、ユーザーは好きな方法を選択できます。追加の機能を確認するには、アドレス帳マネージャー ツールのサンプル版を無料でお試しください。</p>
Vue.jsとは ？ #JavaScript初心者

## はじめに

JavaScriptについてチュートリアルを用いて基礎的な部分を中心に学習を進めていく中で少し自信がついてきたので今回はフレームワークの一つであるVue.jsについて触れていきたいと思います！

最初は描き方ではなく、Vue.jsの概要についてまとめ、具体的な記述方法については学習が終わり次第、記事にまとめて公開したいと思います。

本記事の作成にあたって参考にしたサイトのリンクを掲載しておきます。いまいち理解出来なかった方は是非参考にしてみてください。

https://ja.vuejs.org/guide/introduction


https://www.sejuku.net/blog/10766

## Vue.jsとは？

Vue.jsは、標準的な HTML、CSS、JavaScript の上に構築されるユーザーインターフェースの構築のためのJavaScriptフレームワークです。

ほかの開発ツールと組み合わせやすく、保守・運用が簡単に行える（らしい）のでフロントエンド開発を行う方に人気なフレームワークとなっています。

> フレームワーク：
ソフトウェア開発において開発者が効率的にアプリケーションを構築するための基本的な構造や機能を提供するツールやライブラリの集合体。

## 特徴

次にVue.jsの特徴を４つ紹介します。

### 高速に動作できる

Vueでは、仮想DOMという概念を適用しJavaScriptオブジェクトを使って差分のみをDOMに反映する処理を行うことで処理の高速化を図っています。

つまりwebページの要素に差分が出たときのみその部分を再描画するため表示がその分スムーズになるということです。

また、Vue.jsは軽量なフレームワークなためユーザーがWebページにアクセスする際に、大量のデータを読み込む必要がないことも、読み込みの速さにつながっています。

### JavaScriptライブラリを組み合わせることができる

「Vue.jsでWebサービスの骨組みを構築しつつ、〇〇には[jQuery][jQuery]を用いる」というようにほかのライブラリを一緒に用いることが出来ます。

### 開発にかかる工数を削減できる

Vue.jsにおけるコンポーネントは独立性が強く、相互に依存していません。したがって複数の画面でコンポーネントを使いまわすことが出来ることから効率的に開発を行うことが出来ます。

> コンポーネント：
プログラムを構成する要素を「部品化」し、部品を組み合わせながらコーディングを行う仕組み

### データの変更を自動で画面に反映する

Vue.jsには、内部で管理しているデータをシームレスに画面へ反映させる リアクティブシステムがあります。リアクティブシステムとは、データ同士が紐付けられて、どちらか一方のデータが更新されると、もう一方も更新される仕組みのことです。具体的には、JavaScriptで扱うデータと、Viewとしてユーザーに見えているDOMのデータを同期させることを指します。また、データ同士を紐付けることをデータバインディングといいます。

## できること
### フロントエンド開発

Vue.jaはフロントエンド開発に特化したフレームワークとなっています。

また、スマートフォンやタブレットなどのモバイル端末にインストールするアプリケーションの開発であったり「[Electron][Electron]」を組み合わせることで、パソコンにインストールして使うデスクトップアプリだったりも開発できます。

### PSA(シングルページアプリケーション)の構築

Vue.jsはルーティングという機能を使ってページ遷移をしているように見せることができます。画面遷移を最小限におさえることでユーザーのストレスを減らすことでUX（ユーザー体験）を高められるメリットもあります。UXが重視される近年のWeb開発において、SPAが持つ強みは無視できません。

> シングルページアプリケーション：
単一のページとして動作するアプリケーション」の総称です。ページ遷移が発生しないため通信負荷が小さく、外観の同一性も維持しやすいため、クロスプラットフォーム対応のアプリケーションなどで頻繁に使用されています。


## 勉強方法

私の調査不足感が否めませんが、やはり[公式ドキュメント][公式]に従って学習を進めていくのが、独学・無料という観点では最強なのかなと感じました。

また、Vue.jsの公式サイトに記載されているCDNを用いることですぐに実行することが出来るので下記サイトを是非チェックしてください！

https://ja.vuejs.org/tutorial/#step-2

## さいごに

本記事ではVue.jsの概要と特徴について初心者ながら調べたことをまとめました。

これ以降のVue関連記事では、貧乏人の端くれとしてチュートリアルで学んだことを自分なりに理解して記事にまとめていきたいなと思います！

[jQuery]: jQuerhttps://jquery.com/
[Electron]: https://www.electronjs.org/ja/
[公式]: https://ja.vuejs.org/
【Ruby】演算子達の備忘録

# 比較演算子
```ruby:qiita.rb
a == b        # a と b が等しい
a != b        # a と b が等しくない
a < b         # a が b よりも小さい
a > b         # a が b よりも大きい
a <= b        # a が b 以下である
a >= b        # a が b 以上である
```
等しいかどうかの判断は`==`、変数への代入は`=`となるので注意。
条件を満たせばtrue、満たさなければfalseを返す。

# 論理演算子
```ruby:qiita.rb
!a                   # a が false であれば
a && b               # a かつ b が true であれば
a || b               # a または b が true であれば
not a                # a が false であれば
a and b              # a かつ b が true であれば
a or b               # a または b が true であれば
```
３つ以上の条件をつなぐこともできる。例えば`a && b && c`や`a || b || c`といった具合。

# 三項演算子
```ruby:qiita.rb
a ? b : c            # a(条件式)　　?　　　b(条件式が真の時の値) ： c(条件式が偽の時の値)
```

# 文字列演算子
```ruby:qiita.rb
str1 + str2       # 文字列str1とstr2を連結(遅い、str1自体は変更無し)
str1 << str2      # 文字列str1とstr2を連結(高速、str1自体が変更される)
str1 * n          # 文字列str1を n回繰り返した文字列
```
ArgoCD の Sync Policy で Auto Sync を Disable にしたい（コマンドで）

Voicy で SRE してます
今日は、ArgoCD の Auto Sync の Disable について少し書いていきたいと思います

## ArgoCD って？
- KubernetesネイティブなGitOpsツール
- 視覚的なUIでクラスタの状態を管理
- Gitベースの変更管理で安全なデプロイ

## ArgoCD の Auto Sync とは
- ArgoCD にはアプリケーションをレポジトリと同期する、Sync Policy がある
- 自動同期したり、同期する際の挙動とかが設定可能

![スクリーンショット 2024-07-02 14.49.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618488/019a63f3-ab73-cbd3-127e-9eb0d2701102.png)

## 前提条件
- ArgoCD　がインストールされているサーバ
- ArgoCD　がインストールされているPC（CLIコマンドつかればOK）
- Sync　を止める例は、app-of-apps を例として使用

## 何がしたいか
- コマンドラインで、Auto-Sync　を Disable にしたり、Enableにしたりをやりたい

## では、Disable　にしてみよう
```
- まず、ログイン
# argocd login localhost(サーバのホスト名)

- ログインできたら、まずは Auto-Sync のステータスを確認
# argocd app get argocd/app-of-apps -o json | jq -r '.spec.syncPolicy.automated'
{}
↑
わかりにくいですけど、これで正解

- 次に、 Auto-Sync を Diasble にしてみる
# argocd app set argocd/app-of-apps --sync-policy none

- ステータスを確認
# argocd app get argocd/app-of-apps -o json | jq -r '.spec.syncPolicy.automated'
null
↑
null になってたら、Diableになってる
```
![スクリーンショット 2024-07-02 15.05.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618488/36190340-96ce-e503-a9e7-6d44da7c1507.png)


## Enable　にするには？
```
- Enable にする
# argocd app set argocd/app-of-apps --sync-policy automated

- ステータス確認
# argocd app get argocd/app-of-apps -o json | jq -r '.spec.syncPolicy.automated'
{}
↑
わかりにくいですけど、これで正解
```
![スクリーンショット 2024-07-02 14.49.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618488/eb272150-f7e7-759e-f3d3-8e8050a27427.png)

## まとめ
- これで、全部停止とかするのに楽ちん

## 注意点
- app-of-apps 系は先に止めないとダメ
- バージョンによって挙動は違うかも

## 参照
https://argo-cd.readthedocs.io/en/stable/user-guide/commands/argocd_app_set/

## We're hiring
絶賛、エンジニア（だけではなく）募集してます
カジュアル面談もやっていますので、お待ちしています

https://recruit.voicy.jp/
Flutter環境構築で意外と困った備忘録

普段はマーケティングリサーチャー・プランナー・モデレーターをしつつ、週末だけほそぼそとアプリを作っているキムラといいます。これまでswiftだけを使っていましたが、Flutterも使えるようになりたいなぁと思い立ち、Flutterの勉強を始めました。
…と勢いはいいものの、設定に結構つまづきました。その備忘録メモです。

# vim の立ち上げ
**vim のあとはスペースを入れる**
:frowning2:`vim.zshrc`　→command not found: vim.zshrc と表示がでます
:relaxed: `vim .zshrc`

# vimを閉じられない
**正しいコマンドを入力する**
:frowning2:`:WQ`→大文字だと認識されません（Vimのコマンドではない）
:relaxed:`:wq`→「:w」内容を保存「q」終了

# パスの入力
**スペースはいらない**
:frowning2: `export PATH = “$PATH:ディレクトリ名/flutter/bin” `→which flutterを実行した時にflutter not foundが表示される
:relaxed:`export PATH=“$PATH:ディレクトリ名/flutter/bin”` 

# パスの有効化
**スペースをいれる**
:frowning2:`source ~/.zshrc`　→.zshrc:1: bad assignment
:relaxed:`source ~/ .zshrc`

# パスの確認１
which flutterを入力したあとにflutter not foundが表示される
:frowning2:原因１：パスが正しくない
:frowning2:原因２：パスの有効化コマンド（source ~/ .zshrc）を忘れた

# パスの確認２
flutter doctorを入力
無事パスが通っていることを確認
![Flutter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586438/5946d0c0-c9b8-42fa-909a-1a424b0dd56d.png)


vimもきちんと勉強する必要があるな、と改めて感じた体験でした。
MVVM について軽く調べたのでまとめた

## ■ はじめに

### 説明
先日ふと個人開発しようと思い、技術要件だったり実装する機能だったりをまとめていました。
そんな中、「アーキテクチャどうしよう。そもそも MVC 以外よく知らないや」という状況だったんで MVVM（クリーンアーキテクチャはまた今度）について調べて自分の言葉でまとめてみました。
過不足あれば是非ご指摘ください！

## ■ MVVM (Model View ViewModel) とは
ソフトウェアアーキテクチャの一つであり、アプリケーションの設計パターンの一つです。

- Model：
    - 【役割】データやビジネスロジックを管理する。
    - 【説明】ユーザーの情報やアプリケーション全体のデータを保持し、ビジネスロジックを実行する。
    - 【例】  例えば、タスク管理アプリの場合、ユーザーが作成したタスクのリストやその状態（完了しているかどうか）を管理する。新しいタスクを追加したり、タスクの完了状態を更新したりする処理もここで行う。
- View：
    - 【役割】ユーザーインターフェース（UI）を構築し、ユーザーの操作を受け付ける。
    - 【説明】画面上にボタンやテキストフィールドなどの UI 部品を画面に配置し、ユーザーがそれらを操作する。
    - 【例】タスク管理アプリの場合、画面上にタスクの一覧や新規タスクの入力フィールドを表示する。ユーザーはここでタスクを追加したり、完了したタスクをチェックすることができる。
- ViewModel：
    - 【役割】View と Model の間でデータのやり取りを行い、ビジネスロジックを処理する。
    - 【説明】View から受け取ったデータを整形し、Model に送る。また、Model の変更を View に通知して UI を更新する。ビジネスロジックの実装やデータの整形を担当する。
    - 【例】View から新しいタスクの入力を受け取ってそれを適切なデータ構造に変換し Model に渡す。タスクが完了した際にはその情報を View に反映させて UI を更新する。

タスクアプリで MVVM を採用した場合、どういう流れになるのかを考えてみる。

1. 【View（ユーザー）】アプリを操作し、タスクAを追加する。
2. 【View（ViewModelへの通知）】View はタスクAの追加を ViewModel に通知する。
3. 【ViewModel】View から受け取ったタスクAの情報を適切なデータ構造に整形し、Model に渡す。
4. 【Model】ViewModel から受け取ったデータ（タスクA）を実際にデータベースやストレージに追加する。
5. 【ViewModel】View に必要な更新を通知する。
6. 【View】ViewModel からタスクAが追加された通知を受け取り、必要に応じて UI を更新して、ユーザーに新しいタスクが追加されたことを表示する。

### メリット

- 運用・メンテナンスの向上
    - ロジック（Model）とUI（View）を分離することで、コードの可読性と再利用性が向上。
- **単体テストのしやすさ**
    - ViewModel は UI に依存しないため、単体テストがやりやすい。
- **データバインディング**
    - View / View Model どちらかの値（データ）が変わると、自動的にもう片方も変更される。なので、2回の変更が必要なくなり1回で済む。手間が減るのはもちろんのこと、あっちはAなのにこっちはBみたいな不整合が起きない。

### デメリット

- ViewModel の負担増加
    - ViewModel に多くの責任が集中し、複雑化する可能性がある。
- 過剰設計
    - プロジェクトが小さい（ミニマムな個人開発レベル）場合、MVVMの導入が過剰設計となり、逆に負担になることがある。
    この場合、MVCの方が適しているかも？（個人の見解）

### ディレクトリ構造
ディレクトリ構造としては下記のような感じ。
JavaScript のライブラリである mermaid というもので作成。
各フォルダを作り、その配下にファイルを作成する。
（Flutter のプロジェクトなので拡張子が dart だが、ここは気にしなくて大丈夫です）

![スクリーンショット 2024-07-02 14.56.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3282990/3560aae2-e626-a526-3a93-289d593ba9c9.png)

以上。

## ■ 参考文献

https://zenn.dev/namioto/articles/4ff020a6835ea9#mvvm

https://zenn.dev/hyung8/articles/d9fb1575f25a64

https://zenn.dev/goldsaya/articles/7a0d3baa645463

https://qiita.com/shunta01/items/ed46b904071841957f8a
ナンセンスなCLIログを生成する「genact」でコーヒーブレイク

## はじめに
傍から見たらなんかのビルドやなんかのインストールをしているように見えるCLIログを生成する「genact」を紹介します。
genactを活用して、コーヒーブレイクを楽しみましょう。

## インストール
genactは、Homebrewを使ってインストールできます。

```bash
brew install genact
```

他にも様々なインストール方法が用意されているので、以下のリンクから詳細を確認してください。(ブラウザでもできます。)

https://github.com/svenstaro/genact

## 使い方
手っ取り早くブラウザでどんなものなのか確認したい場合は、以下のリンクから試すことができます。

https://svenstaro.github.io/genact/

CLIで使う場合は、以下のコマンドを実行します。

```bash
genact
```

以下のような様々なバリエーションのログが表示されます。

![v1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403148/69af1592-c657-3ed2-81a7-56b43e432135.gif)

![v2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403148/cb441c29-9d45-7660-b0f1-be3765f6a7f1.gif)

![v3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403148/2d812079-ccbd-ead9-8a53-e3d6a2022bd0.gif)

## おわりに
素敵なコーヒーブレイクを
GSOC受験記

# はじめに
GSOCはGIACが提供する資格試験の1つで、SOCアナリストやSOCを立ち上げる人を主とした資格試験です。
詳細は公式サイトを参照してください

https://www.giac.org/certifications/security-operations-certified-gsoc/

# 試験概要
試験範囲は以下のとおりです。試験時間は2時間、問題数は75問ですべて選択式です。合格ラインは67%（受験時）です。
Analytic Design and Tuning
Blue Team Defense Concepts
Endpoint Defense
HTTP(S) Analysis and Attacks
Interpreting Events
Intrusion Triage and Analysis
Network Traffic Analysis
Operational Improvement
Protocol Attacks and Analysis
SOC Management Systems


# 試験のレベル感
全体としてはそれほど難しくはありません。ある程度セキュリティの経験があれば、６～７割程度ある技術的な問題のほとんどは問題なく解答できます。ただしSOC全体のマネジメントに関わる設問もあるため、高得点を狙うのは少し難しいかもしれません。

# 試験対策
基本的な対策は以下が参考になると思います。

https://qiita.com/log0417/items/1c49979b0c3d1dd15946

なお、私はいつものとおり模擬試験のみで突破しました。突破するだけであればある程度の経験があれば可能だと思います。模擬試験は77%と81%、本番は87%でした。わからない問題も多かったのですが、本番では運よく採点対象外の問題だったのかな？という印象です。

# 感想
全体としては難しくはないので、GIACの更新をとりあえずしたいという方で、SOCの経験がある方にはおすすめかもしれません。
一方で、対応するSEC450のトレーニングを受けるべきかというと微妙です。技術面ではトレーニング不要で合格できるレベルの出題ですので、トレーニングによって大きくスキルアップできるとは考えにくいです。ただSOC全体のマネジメントに関する出題がそれなりにあり、この部分を深く理解する必要がある場合は受けても良いかもしれません。
例えば自社でSOCを運用していたり、SOCサービスを提供している場合には、チーム内に1人くらいは受けても良いかもしれませんが、全員が受けるべき内容とは言えないと思います。SOCで管理職をやるような人がちょうど良いレベルかと思います。
Webアプリに必要なあれこれ

## 概要
ホームページやWebアプリなどを公開運用する際に必要なものをまとめます。

※ 法令の変更などによって項目や内容が変わることはありますので予めご理解ください。

## 必要なあれこれ

以下の項目を適切に表示することで、ユーザーの信頼を得るとともに、法的な義務を果たすことができます。具体的な表示方法や内容については、各国の法律や規制に基づいて調整する必要があります。

|| 項目 | 必須 | 概要 |
|----|----|----|----|
|1| プライバシーポリシー | 必須 | プライバシーポリシーは、個人情報の収集、使用、保護方法について説明するものです。ユーザーが安心してサービスを利用できるように、明確に記載することが法律で義務付けられている場合があります。 |
|2| コピーライト | 必須 | ホームページの内容が著作権で保護されていることを示すための表示です。著作権法に基づき、コピーライト表示を行うことで、自分の著作物を守ることができます。 |
|3| 利用規約 | 条件により必須 | サービスを利用する際のルールやユーザーの権利・義務について説明します。特にオンラインサービスや商品販売を行う場合には、明示することが望まれます。 |
|4| お問い合わせ情報 | 必須 | ユーザーが問い合わせを行えるように、メールアドレスや電話番号、問い合わせフォームなどの情報を提供する必要があります。 |
|5| 会社情報（特定商取引法に基づく表示） | 必須（日本国内の商取引に関して） | 日本の特定商取引法では、会社名、所在地、電話番号、代表者名などの情報をホームページに記載することが義務付けられています。 |
|6| クッキーポリシー | 条件により必須 |　クッキーを使用している場合、その使用目的や管理方法について説明するポリシーです。特に欧州連合（EU）の一般データ保護規則（GDPR）に準拠する場合は必須です。|
|7| サイトマップ | 任意 | サイト内のページ構成を視覚的に示すもので、ユーザーが目的のページに簡単にアクセスできるようにするためのものです。 |
|8| ソーシャルメディアリンク | 任意 | 企業やサービスのソーシャルメディアアカウントへのリンクを提供し、ユーザーとの交流を深めるために使用されます。　　|
[ReactNative] アプリがフォアグラウンド・バックグラウンドにいった場合をハンドリングするメモ


### ユースケース
[react-native-webview](https://github.com/react-native-webview/react-native-webview/blob/master/docs/Reference.md)を使用していて、アプリをバックグラウンドで起動した状態で放置していると、画面が真っ白になる現象が発生した。
コンポーネントなのか、webviewで表示しているオリジンの問題なのかわからなかったが、とりあえず解決するために、アプリがフォアグラウンドにきたことを検知してリロードを挟むことで対処した。
この方法他にも使えそうなので、メモとして残しておく。

公式↓

https://reactnative.dev/docs/appstate


### 実装
```Sample.tsx
import { AppState } from 'react-native';

export const Sample = () => {

 const appState = useRef(AppState.currentState);


 useEffect(() => {
    const subscription = AppState.addEventListener('change', 
 (nextAppState) => {
      if (
        appState.current.match(/inactive|background/) &&
        nextAppState === 'active'
      ) {
        // ここにフォアグラウンドにきた場合の処理
        webViewRef.current && webViewRef.current.reload();
      }
      appState.current = nextAppState;
    });
    return () => subscription.remove();
  }, []);


 return (
  <WebView
    {...props}
    ref={ref}
    source={{ uri: props.uri }}
  />
 );
};
```

**AppState.addEventListener**
AppState.addEventListener('change', ...) はアプリの状態（フォアグラウンド、バックグラウンド、非アクティブ）の変更を監視する。'change'イベントが発生すると、指定したコールバック関数が実行される。

<br>

**コールバック関数**
コールバック関数は、アプリの次の状態 (nextAppState) を受け取り、現在の状態 (appState.current) と比較する。
appState.currentが'inactive'または'background'であり、次の状態 (nextAppState) が'active'の場合に、WebViewをリロードする。
webViewRef.current && webViewRef.current.reload() は、 webViewRef が存在する場合にリロードメソッドを呼び出す。

<br>

**クリーンアップ関数**
return () => subscription.remove() によって、コンポーネントがアンマウントされるときにイベントリスナーを削除する。これにより、メモリリークを防ぐ。