OmniAICreator/Qiita-1.07M huggingface dataset:
React useState useEffectについて

開発中関数の挙動理解が不十分のため機能実装に時間を要したため投稿します。

# useStateについて
useStateとは 状態を管理する関数。Stateの状態が変化した際に再レンダリングされる。（再レンダリング条件は他にもあります。）
値が変わってすぐに再レンダリングするわけではない。
どのタイミングで行っているのかは確認することができないと思われます。

# useEffectについて
useEffectとは コンポーネントの「状態」や「タイミング」に応じて動く処理を設定するもの。

~~ということで以下のとおり記述して値の変化を確認することで再レンダリングするタイミングは確認できないこと。値変化後すぐに再レンダリングしないことを確認することができました。~~
👆2024.12.11 honey32様のご教から取り消しました。

```.jsx
const [a, b] = userState("c");
// aは現在の値　bは値を更新する関数　cは初期値。

// eventの中身や入力前、入力後の値を確認したい。
const inputChange = (event) => {
  console.log("event:", event); // event情報が確認できる
  console.log("入力前のaの値:", a); // 入力前なので空
  console.log("event.target.valueの中身:", event.target.value); // valueの内容が確認できる
  console.log("入力後のa-1:", a); // ここでは値まだ更新されていない！👈 値が変わらないのは再レンダリングの有無のためではなく、公式ドキュメントに記載あるようにaの値を保持するため（2024.12.11記述追加したもの）
  b(event.target.value); // 更新関数へ入力された値を渡す
  console.log("入力後のa-2:", a); //ここでもまだ値は更新されていない！
  // よって、すぐに再レンダリングされるわけではない 👈 値が変わらないのは再レンダリングの有無のためではなく、公式ドキュメントに記載あるようにaの値を保持するため。（2024.12.11記述追加したもの）

useEffect(() => {
  console.log("入力後のa-3:", a); // ここでは更新されたaの値を確認できる
  }, [a] // aの値に変化があった時にuseEffectが動くように配列で設定する
  );

    
<input placeholder="入力してください" value={a} onChange={inputChange} />
// aの値をvalueへ渡している onChange:値が変更された際にinputChangeが発火
// eventはHTML要素のイベント（クリック、入力変更など）が発生したときに、ブラウザが自動的に生成する 「イベントオブジェクト」 でReactでも、このイベントオブジェクトが自動的に渡される。
```

# JISOUのメンバー募集中！
プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？
興味のある方は、ぜひホームページをのぞいてみてくださ！
▼▼▼

https://projisou.jp
エンタープライズアーキテクチャって何？味見してみた


※この記事は[NTTコムウェア Advent Calendar 2024](https://qiita.com/advent-calendar/2024/nttcomware)15日目の記事です。

# はじめに
　みなさん、こんにちは！NTTコムウェア入社６年目の佐藤克哉です。入社してから金融系のお客様先に常駐しプロジェクトマネージャーとして業務に携わっており、現在は2024年７月よりビジネスアナリシス（ビジネス上の要求とITソリューションを繋ぐための考え方）に関する支援や人材育成を推進している担当に所属しています。

　7月より新たな担当になったこともありますが、会社全体の変革や、世の中の急速な変化に直面していて、「もっとスキルを磨かなきゃ！」という気持ちが強くなっています。特に、今までプロジェクトマネージャーとしてQCD（品質、コスト、納期）を守り、お客様にシステムをお届けすることが重要と捉えて業務に励んでいましたが、組織からは「お客様目線でシステムを作れ」「お客様に価値のあるものをつくれ」と声が上がることもあって、正直なところ、どうやってその要求に応えればいいのか悩んでいました。

　そこで今回、エンタープライズアーキテクチャ（EA）を学ぶことで、お客様へ本当に価値のあるものを提供するためには何が必要かを考えるヒントにしたいと思っています。正しく正確に作る（QCDを守る）ことに加えて、正しいものを作る（価値のあるものを作る）ための新たな目線を広げるチャンス！というわけで、EAについて学んだことを少しご紹介させていただきます。

![EAの構成と、今回のスコープ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3938420/d908d179-8f51-4036-efda-028d02c851ce.png)

# エンタープライズアーキテクチャ(EA)って何？

　エンタープライズアーキテクチャ、略してEAって、具体的に何なのか？みなさんも耳にしたことがあると思いますが、「エンタープライズ」は企業全体を指し、「アーキテクチャ」は構造や設計のことです。これはまるで大きな都市を設計するようなものです。
　たとえば、新しい街を作るとき、まずはその街の全体像を考えます。交通の流れ、住宅、商業施設、公園、学校など、それぞれの要素がどのように調和して機能するかを計画する必要があります。EAもこれと似ており、企業のビジネスプロセス、情報、アプリケーション、インフラなど、すべての要素がどのように連携するかを考えて設計を行います。
　また、EAは建物の設計図とも言えます。建物を建てるためには、まずは設計図を描かなくてはなりません。設計図があれば、どんな材料を使い、どのように構築するかが明確になり、建物が安全で機能的になります。同様に、EAは企業が目指すビジョンや戦略を実現するための道筋を示してくれます。

　EAを通じてビジネスプロセス、情報、アプリケーション、インフラの整合性を保つことができるようになります。ビジネス戦略に基づいた統一的なアプローチを考えることで、部門の壁を越えて全体最適を追求できるのが、EAの魅力かもしれません。
　さらに、EAにより、エンタープライズのフワッとした曖昧な世界を視覚化し、誰かの頭の中に存在するアイデアやコンセプトを具現化することが可能になります。すなわち、複雑なプロセスや情報フローを明示化することで、組織全体が同じ方向を向いて動きやすくなっていきます。

　ただ、日本でEAが普及し始めたのは、2000年代初頭なのですが、その後は少し停滞気味だったりもしました。最近になってまた注目されているのはなぜなのでしょうか。

# なぜ、今EAなのか？
　クラウドコンピューティングやAI、ビッグデータの登場で、企業の運営がダイナミックに変化しています。これらの技術に対応しないと、生き残れない時代が来ているのです。お客様からのオーダーも多様化してきて、「QCD」という考え方だけでは太刀打ちできなくなってきました。

　特に、デジタルトランスフォーメーションを進める多くの企業において、経営とITの協力が一層重要となっています。EAがその架け橋となり、ビジネス戦略とIT戦略との整合性を保つための基盤を提供します。顧客目線での業務運営を推進するためにも、EAは活躍します。

　EAとは単なる手法やフレームワークではなく、企業が将来を見据えて進化し続けるための基盤となるものです。今、このタイミングでEAを学び、さらなる能力を磨くことで、私自身も変革の波に乗り遅れないよう行動していきたいです。

# 具体的な手法は何？
　有名なフレームワークとしては「ザックマンフレームワーク」と「TOGAF」がありますが、所属組織では、TOGAF認定者が多くノウハウを身に着けやすいことから、「TOGAF」を学ぶこととしました。

　TOGAFとは「The Open Group Architecture Framework」の略です。特徴は、アーキテクチャ開発プロセス（ADM: Architecture Development Method）を通じて、企画から実装、管理に至るまでのプロセスを整理できるところです。具体的には、ビジネスアーキテクチャや情報システムアーキテクチャ、技術アーキテクチャなど、さまざまな側面から組織全体を見渡すことができます。そして、これを土台にして、ビジネスニーズに合致したITシステムを効率よく設計・実施していきます。

　TOGAFを学ぶことで、企業のデジタルトランスフォーメーション（DX）をよりスピード感を持って実現するための基盤が得られると考えています。フレームワークを理解することにより、さまざまな視点から見えるプロジェクトの構造や要件が明確になり、効率的に進めるための仕組みを築けると期待しています。しかし、これが本当に実務にどのように役立つのかは、実際のプロジェクトを通じて学んでいきたいです。

# まとめ
　というわけで、最初に思っていた「エンタープライズアーキテクチャって何だ？」から始まり、EAの重要性、具体的手法について考えてきました。やはり、EAは単なる理論ではなく、実際のプロジェクトに役立つものだと思いました 。ビジネスとITのコミュニケーションを円滑にし、正しいものを作るための強固な基盤を築く道具だと思いました。

　EAが何か、どのように活用できるかの理解を深め、一丸となって進めていく必要があります。また、連携を強化し、さまざまな部門でEAの重要性を伝えていくことも必要だと感じているため、私の担当がその中心となって推進していけるように貢献していきます。

　これからの自分の目標は、学んだことを社内に展開し、実案件を通じてその先のお客様に価値のあるものを提供していくことです。やることや、学ぶべきことは山積みですが、EAを通じてビジネス側とIT側の間に架け橋を作り、持続可能で競争力のある企業をめざしていきたいと思います（目標は大きく！！）。

　EAは一過性のものではなく、継続的に見直し、進化していくもの。これからも常に学び続け、変化に対応していくつもりです。皆さんも一緒にこの道を歩んでいきましょう！



　記載されている会社名、製品名、サービス名は、各社の商標または登録商標です。
「ionic」について検索してみた

ionic Freameworkについて調べていたら、たまに「ionic」名前の製品が該当するので、この機会にどんなものがあるのか気になって調べてみました。

# ionic(イオン/アイオニック)
「ionic」は英語の単語で、日本語は「イオン」と翻訳されます。
化学において、物質を構成する最も小さな粒子の原子からできた、電荷を帯びた「イオン」という非常に小さな粒子の事を指すので、電化製品に使用されることが多いようです。

<details><summary>「イオン」はどうやって作るのか</summary>
イオンを作るためには物質が水に溶けてイオンに分かれる現象を「電離」といい、このような物質を「電解質」と言います。
電解質を水に溶かして電子を失うと陽イオン(プラスイオン)になり、電子を受け取ると陰イオン（マイナスイオン）になり、電離しているため電流が流れます。

原子が電子を失う(正の電荷をもつ)と、陽子の数が多くなり、原子は＋の電気を帯びる陽イオンになります。 
反対に原子が電子を受け取る(負の電荷をもつ)と、陽子の数より多くなるので、－の電気を帯びる陰イオンになります。
陽イオンになるか陰イオンになるかは、原子の種類で決まっているそうです。

参考：[ホームメイトリサーチ「化学変化とイオン」](https://www.homemate-research-junior-high-school.com/useful/20100_junio_study/3_science/ion/#:~:text=%E5%8E%9F%E5%AD%90%E3%81%8C%E9%9B%BB%E5%AD%90%E3%82%92%E5%A4%B1%E3%81%86,%E7%A8%AE%E9%A1%9E%E3%81%A7%E6%B1%BA%E3%81%BE%E3%81%A3%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82)

</details>

# ionic(アイオニック)
IT業界ではご存知の方もいらっしゃると思いますが、ハイブリッドモバイルアプリ開発に特化したionicがあります。

https://ionicframework.com/docs/ja

最近では2024年11月にIonic8.4がリリースされました

https://ionic.io/blog/announcing-ionic-8-4

# 電化製品のionic(イオン/アイオニック)
それでは早速今回お目当ての「Ionic」商品を見て行きたいと思います。

◯<strong>歯ブラシ</strong> ：アイオニック株式会社
こちらは私も使用している歯ブラシで、ホワイトニング効果と歯石除去効果があるのでおすすめです。
近くのダイエーやコーナンでは細かい所を掃除しやすい（歯茎が腫れている方や歯周病が気になる方オススメの）極細しか売ってないので、歯と歯の汚れを落としやすい（虫歯予防にオススメの）山切りなども売って欲しい所です。

https://www.ionic.co.jp/ionic/

◯<strong>ドライヤー</strong>：Dyson Limited
2019年に販売されたドライヤーしか「Ionic」はついてませんでした。
最新の製品にも名前がついて欲しいですね。

Dyson Supersonic Ionic HD03 ULF IIF(2019販売)

https://kakaku.com/item/K0001187033/

◯<strong>スマートウィッチ</strong>
残念ながら発売中止になってしまったので、この様な商品があったというご紹介です。

fitbit ionic（製造中止）

https://www.recall.caa.go.jp/result/detail.php?rcl=00000029148

◯<strong>ステージボックス</strong>：Waves Audio Ltd.
専門的すぎて買う機会が少ないと思いますが、音楽好きな方にオススメです。

IONIC 16
Step Up to Superior Stagebox Sound

https://wavesjapan.jp/hardware/ionic16

IONIC 24
Step Up to Superior Stagebox Sound

https://wavesjapan.jp/hardware/ionic24

◯<strong>空気清浄機</strong>：	株式会社アントレックス
この時期オススメの空気清浄機です！

Ionic Breeze

https://www.entrex.co.jp/brand/ionic-breeze/lineup/

◯<strong>IONIC界面活性剤電極</strong>：柴田科学株式会社
水溶液の陰/陽イオン界面活性剤測定用

https://www.sibata.co.jp/item/6776/?srsltid=AfmBOopAB2T3wk_oIP-4M1bnJo86XasIj-Ys1IyxpOyChWqR2c6SeLkE

# その他のionic
◯<strong>車</strong>：Hyundai Mobility Japan Co.
韓国産の車です。
「ionic」という名前がつく車はこれだけなので、ionicの名前で揃えたい方はオススメです！

IONIQ 5

https://www.hyundai.com/jp/ioniq5

◯<strong>病院</strong>：IONIC Health

https://www.ionic.health/

# 最後に
 UIツールキットの「Ionic」を始めた時はフレームワークを調べるたびに何かしらionicという名前の商品が出てきていたので、機会があったらどんな商品があるのか調べようと思っていました。
 今回調べてみて、もっと「Ionic」名前の製品があるかと思ってましたが、調べてみると思っていたより少なかったというのが感想です。
 
 
ionicファンの方はクリスマスプレゼントの参考にしてみてください:santa_tone1:
【スクレイピング】Seleniumチートシート

# よく使うもの
```python
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
```

# Webドライバーを読み込み
```python
# Chromeの場合
with webdriver.Chrome() as driver:
    ...
    
# Edgeの場合
with webdriver.Edge() as driver:
    ...
    
# Firefoxの場合
with webdriver.Firefox() as driver:
    ...
```

# サイトを開く
```python
driver.get("https://example.com")
```

# 要素を選択
```python
driver.find_element(By.TAG_NAME,"h1")       # タグ名から
driver.find_element(By.CLASS_NAME,"class")  # クラスから
driver.find_element(By.ID,"id")             # idから

driver.find_elements(By.CLASS_NAME,"hoge")  # クラスから複数のタグを取得
```

# 要素をクリック
```python
elm = driver.find_element(By.ID,"button")
elm.click()
```

# キーを入力
```python
driver.send_keys("hoge")
elm.send_keys(Keys.ENTER) # 特殊なキーはKeysを使用
```
ZStackの要素の配置時に便利なModifier

# 概要

ZStackの時に便利なModifierを書いたので、新しいプロジェクトなどでコピペできるよう置いておきます

こんな感じのものがすでに公式から提供されていたらすみません

# 使い方

つけるだけ、特に複数のViewを異なる場所に寄せたい時に便利

```swift
ZStack {
    HogeView()
        .topLeading() // 左上に配置される

    HogeView()
        .topTrailing() // 右上に配置される
}
```

# コード

```swift
import SwiftUI

public extension View {
    // 左上
    func topLeading() -> some View {
        self.modifier(TopLeadingAlignmentModifier())
    }

    // 右上
    func topTrailing() -> some View {
        self.modifier(TopTrailingAlignmentModifier())
    }

    // 左下
    func bottomLeading() -> some View {
        self.modifier(BottomLeadingAlignmentModifier())
    }

    // 右下
    func bottomTrailing() -> some View {
        self.modifier(BottomTrailingAlignmentModifier())
    }
}

struct TopLeadingAlignmentModifier: ViewModifier {
    func body(content: Content) -> some View {
        VStack(spacing: 0) {
            HStack(spacing: 0) {
                content
                Spacer()
            }
            Spacer()
        }
    }
}

struct TopTrailingAlignmentModifier: ViewModifier {
    func body(content: Content) -> some View {
        VStack(spacing: 0) {
            HStack(spacing: 0) {
                Spacer()
                content
            }
            Spacer()
        }
    }
}

struct BottomLeadingAlignmentModifier: ViewModifier {
    func body(content: Content) -> some View {
        VStack(spacing: 0) {
            Spacer()
            HStack(spacing: 0) {
                content
                Spacer()
            }
        }
    }
}

struct BottomTrailingAlignmentModifier: ViewModifier {
    func body(content: Content) -> some View {
        VStack(spacing: 0) {
            Spacer()
            HStack(spacing: 0) {
                Spacer()
                content
            }
        }
    }
}
```
Internet Servicesに定義された権限

# はじめに
こちらの記事は下記Advent Calendar 2024で紹介しているIBM Cloud権限設定における `Internet Services` になります。

https://qiita.com/katahiro/items/274bec5ad4a9e2604dcf

# 共通権限は割愛
こちらの記事に記載しているように、プラットフォーム・アクセス、サービス・アクセスの権限でそれぞれどのようなものが共通して設定されているかを紹介させて頂きました。

https://qiita.com/katahiro/items/b5e367666fe984944d4b

こちらの記事では共通部分で出現する権限を除いた各サービス毎の権限設定を紹介します。

# Internet Servicesで指定可能な権限のアクセス範囲
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/61169a0c-c18c-6f20-da96-33499491700a.png)
- リソース・グループ
- サービス・インスタンス
- ドメインID
- CIS機能の適用範囲
- sub-scope

## リソース・グループの指定
これは指定されたリソース・グループに所属するInternet Servicesのみに対してアクセス権限を適用します。異なるリソース・グループのInternet Servicesに対しては別途権限を設定する必要があります。

## サービス・インスタンスの指定
これは指定されたInternet Servicesのサービスインスタンスにのみ権限適用するものです。

## ドメインIDの指定
これは指定されたドメインに対するInternet Servicesにのみ権限適用するものです。Internet Servicesでは複数のドメインを1つのサービスインスタンスに登録することが可能なので、サービスインスタンスの中で権限を分割する場合は必要になります。

## CIS機能の適用範囲
下記添付のようにInternet Servicesの中の機能である `セキュリティ`、`パフォーマンス`、`信頼性`の機能に限定して権限を適用することが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/b7f29ab2-6e90-3c0a-e538-010215568dd6.png)

## sub-scopeの指定
ここでは現在 `DNS Record`のみ指定が可能で、Internet ServicesはDNSとしての機能提供も行うので、DNSの設定のみ権限付与する場合はこちらの利用が必要になります。

# Internet Servicesに設定された権限
## プラットフォーム・アクセスの権限
※Admin : Administrator, KM : Key Manager, SCR : Service Configuration Reader
|権限|Viewer|Operator|Editor|Admin|KM|SCR|
|:---|:---:|:---:|:---:|:---:|:---:|:---:|
|internet-svcs.performance.read||||||〇|
|internet-svcs.reliability.read||||||〇|
|internet-svcs.security.read||||||〇|
|internet-svcs.zones.read||||||〇|

プラットフォーム・アクセスは基本となる共通部分の採用がベースになっており、サービス固有の権限はServoce Configuration Readerにのみ権限付与となっていました。

## サービス・アクセスの権限
|権限|Reader|Writer|Manager|
|:---|:---:|:---:|:---:|
|internet-svcs.performance.read|〇|〇|〇|
|internet-svcs.performance.update||〇|〇|
|internet-svcs.performance.manage|||〇|
|internet-svcs.reliability.read|〇|〇|〇|
|internet-svcs.reliability.update||〇|〇|
|internet-svcs.reliability.manage|||〇|
|internet-svcs.security.read|〇|〇|〇|
|internet-svcs.security.update||〇|〇|
|internet-svcs.security.manage|||〇|
|internet-svcs.zones.read|〇|〇|〇|
|internet-svcs.zones.update||〇|〇|
|internet-svcs.zones.manage|||〇|

サービス・アクセスについては全体でこの権限数しかなく、パフォーマンスや信頼性といった機能ごとに、Writerは変更権限のみ、作成や削除はManager権限が必要だ、ということがここから読み取れます。

細かな役割の指定が無いので、特定の権限のみ与えたい場合は、アクセス範囲の機能をうまくつかう必要があります。

# さいごに
Internet Servicesとして個別に設定されている権限はあまり多くなかったですね。
ネットワークやセキュリティを担うサービスなので、アクセス権限はあまり不用意に広めず限定的にしたいところですが、それに応じた役割があまりないので、うまくアクセス範囲と組み合わせて適切な権限設定の実現にこちらの記事が参考になると幸いです。
可茂IT塾のFlutterインターンに参加して5ヶ月が立ちました。

### 可茂IT塾とは？
美濃加茂市太田町にある、フリーランスが集まって合同会社を設立したアプリ開発会社です。日本各地から多くのインターン生も受け入れています！

https://www.kamo-it.org/

https://note.com/kamo_it/n/n963c42fbf027

### インターンに参加した理由

アプリ開発企業に就職するという目標があり、そのためには自分のスキルや経験を高める必要があると考えていました。また、「Flutter インターン」と調べた際、上位に表示された企業が可茂IT塾で、以前から技術記事などで名前を見かけていたこともあり、興味を持ち応募まで至りました。

### 応募時点でのレベル

インターンに応募した時点では3つのFlutterアプリをリリースしており、Firebaseを使ったアプリ開発の経験もありました(今コードを見返すと酷いレベル)。また、GitHubの使い方には不安があり、チーム開発の経験も全くありませんでした。自分の技術をさらに成長させるために、このインターンは絶好の機会だと感じていました。

https://qiita.com/yato_zZ/items/4e00bce40e5941e4b7c4


### インターン開始までの流れ

応募後、代表の大島さんとの面接がありました。この面接は硬い雰囲気ではなく、雑談を交えたリラックスしたものでした。面接後、インターン生として可茂IT塾に入塾し、アプリ画面を作成するタスクをいただき、その後、次のタスクからは有給でのインターンがスタートしました。

### インターンで得た成長

##### 1. チーム開発の実践的な学び
インターンでは、GitHubを使ったチーム開発を経験し、独学では得られなかった「チームで進める開発」の重要性や具体的な手法を学びました。特に、先輩エンジニアのコードを直接見る機会が多くあり、「何が正解か」を理解することができました。この学びを、自分のアプリ開発にも積極的に活かすことができました。

##### 2. Flutterスキルの向上
毎日Flutterを触れる環境に身を置けたことで、技術的スキルが飛躍的に向上しました。丁寧なコードレビューと日々の学びを通して「これで時給が発生していいのか？」と思うほど価値ある経験を積むことができました。

##### 3. コミュニケーションスキルの課題
自分の考えや困っている点を正確に言語化し、他者にわかりやすく伝えることの難しさを痛感しました。この経験を通じ、より明確で的確な情報伝達のスキルを身につける必要性を感じました。


### 終わりに
振り返ってみると、この五ヶ月間は自分にとって最高の成長の環境でした。日々の学びや経験を通じて、多くのことを吸収できたと感じています。これからも可茂IT塾で学び続け、さらなる成長を目指していきたいと思います。
DockerfileとWebサーバーとDBサーバー構築の方法

**Dockerを使ってWebサーバーとデータベースサーバーを構築することで、簡単に開発環境を整えることができます。本記事では、NginxをWebサーバー、MySQLをデータベースサーバーとして設定し、Dockerfileとdocker-compose.ymlを使った環境構築手順を解説します。**

**必要なファイル**

以下のファイルを作成します：

Dockerfile（Webサーバー用）

docker-compose.yml（サーバー構築設定用）

静的ファイルやNginx設定ファイル（必要に応じて）

# 1. Dockerfile

まず、WebサーバーのためのDockerfileを作成します。

```
Dockerfile for the Web Server
FROM nginx:latest

Copy custom configuration (optional)
COPY ./nginx.conf /etc/nginx/nginx.conf

Copy static files to the web root
COPY ./html /usr/share/nginx/html

Expose the port Nginx will listen on
EXPOSE 80
```

ファイルの説明

nginx:latest: 最新のNginxイメージを使用。

COPY: Nginx設定ファイルや静的ファイルをコンテナ内にコピーします。

EXPOSE: コンテナがリッスンするポートを指定します。

静的ファイルはhtmlディレクトリに配置し、必要に応じてカスタマイズしたnginx.confも用意します。

# 2. docker-compose.yml

docker-compose.ymlを使ってWebサーバーとDBサーバーを同時に起動できるように設定します。

```
version: '3.8'

services:
  web:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8080:80" # Map host port 8080 to container port 80
    volumes:
      - ./html:/usr/share/nginx/html
    depends_on:
      - db

  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: exampledb
      MYSQL_USER: exampleuser
      MYSQL_PASSWORD: examplepassword
    ports:
      - "3306:3306" # Map host port 3306 to container port 3306
    volumes:
      - db_data:/var/lib/mysql

volumes:
  db_data:
```

ファイルの説明

webサービス:

build: Dockerfileを指定してNginxコンテナをビルド。

ports: ホストの8080番ポートをコンテナの80番ポートにマッピング。

volumes: ローカルの静的ファイルをコンテナ内にマウント。

depends_on: DBサーバーの起動後にWebサーバーを開始。

dbサービス:

image: MySQLの公式イメージを指定。

environment: 環境変数でMySQLの設定（パスワード、データベース名など）を指定。

ports: ホストの3306番ポートをコンテナの3306番ポートにマッピング。

volumes: データを永続化するためのボリュームを設定。


# 3. プロジェクト構造

以下のような構造を想定しています：
```
project/
├── Dockerfile
├── docker-compose.yml
├── html/
│   └── index.html
└── nginx.conf
```

index.html: 静的ファイルの例。

nginx.conf: 必要に応じてカスタマイズしたNginx設定。

# 4. 環境の起動

準備が整ったら、以下のコマンドで環境を起動します：
```
docker-compose up --build
```

--build: 必要に応じてイメージを再ビルドします。

起動後、http://localhost:8080にアクセスしてWebサーバーが動作していることを確認します。

データベースへの接続には、以下の設定を使用してください：

ホスト: localhost

ポート: 3306

ユーザー名: exampleuser

パスワード: examplepassword

データベース名: exampledb

# まとめ

Dockerを使用することで、Webサーバーとデータベースサーバーを効率的に構築できます。この方法はローカル開発環境だけでなく、本番環境でも利用可能です。必要に応じて他のサービス（例えばバックエンドアプリケーション）も追加できます。
PythonでテキストとWordドキュメントを相互変換する簡単な方法

デジタル時代において、テキストとWordドキュメント（.docx）の間でデータを変換するニーズは、多くの場面で重要です。例えば、簡単なメモを見やすいレイアウトの文書に変換したり、Wordドキュメントから必要な情報を抽出して分析に活用したりする場合があります。Pythonを活用することで、これらの作業を効率的かつ柔軟に行うことが可能です。本記事では、**Pythonを使ってテキストをWordドキュメントに変換する方法と、その逆の手順**について解説します。

- **[PythonでテキストファイルをWord文書に変換する](#pythonでテキストファイルをword文書に変換する)**
- **[PythonでWord文書をテキストファイルに変換する](#pythonでword文書をテキストファイルに変換する)**

この記事で使用する方法には、[Spire.Doc for Python](https://jp.e-iceblue.com/introduce/spire-doc-for-python.html)が必要である。PyPI: `pip install spire.doc`。

## PythonでテキストファイルをWord文書に変換する
テキストファイルは、Document.LoadFromFile メソッドを使用して読み込むことができ、その後、Document.SaveToFile メソッドを使用して Word ドキュメントに変換することができます。また、ドキュメントの内容をフォーマットするために、ライブラリーのインターフェイスを使うこともできます。
詳しい手順は以下の通りです。
- 必要なモジュールをインポートする： `Document` と `FileFormat`。
- `Document` クラスのインスタンスを作成します。
- `Document.LoadFromFile()` メソッドを使用してテキストファイルを読み込みます。
- `Document.SaveToFile()` メソッドを使用して、テキストファイルを Word ドキュメントに変換して保存します。
- リソースを解放します。

**コード例**
```python
from spire.doc import Document, FileFormat, ParagraphStyle

# Document のインスタンスを作成
doc = Document()

# テキストファイルを読み込む
doc.LoadFromFile("Sample.txt", FileFormat.Txt)

# 書式設定を適用（任意）
style = ParagraphStyle(doc)
style.CharacterFormat.FontName = "Yu Gothic UI"  # フォント名を設定
style.CharacterFormat.FontSize = 12  # フォントサイズを設定
style.Name = "Style1"  # スタイル名を設定
doc.Styles.Add(style)
for i in range(doc.Sections.get_Item(0).Paragraphs.Count):  # 各段落にスタイルを適用
    paragraph = doc.Sections.get_Item(0).Paragraphs.get_Item(i)
    paragraph.ApplyStyle(style.Name)

# ファイルをWord文書に変換して保存
doc.SaveToFile("output/TextToWord.docx", FileFormat.Docx)
doc.Close()
```

結果
![テキストファイルをWord文書に変換](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/00bee4aa-544c-bc89-daa2-78cb7fe47239.png)

## PythonでWord文書をテキストファイルに変換する
同じメソッドを異なるパラメータで使用することで、Word ドキュメントをテキストファイルに変換することもできます。詳しい手順は以下の通りです。
- 必要なモジュール（`Document` と `FileFormat`）をインポートします。
- `Document` クラスのインスタンスを作成します。
- `Document.LoadFromFile()` メソッドを使用して Word ドキュメントを読み込みます。
- `Document.SaveToFile()` メソッドを使用して、ドキュメントをテキストファイルに変換して保存します。
- リソースを解放します。

**コード例**
```python
from spire.doc import Document, FileFormat

# Document クラスのインスタンスを作成
doc = Document()

# Word ドキュメントを読み込む
doc.LoadFromFile("Sample.docx", FileFormat.Docx)

# ドキュメントをテキストファイルに変換して保存
doc.SaveToFile("output/WordToText.txt", FileFormat.Txt)
doc.Close()
```

結果
![Word文書をテキストファイルに変換](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/da0acbc4-8197-f377-92d3-c854d830fb20.png)

この記事では、Pythonを使ってテキストファイルをWord文書に変換する方法と、Word文書をテキストファイルに変換する方法を紹介します。

[無料ライセンスの申請](https://www.e-iceblue.com/TemLicense.html)
福岡出身システムエンジニア誕生記(フリーランスになるまで)

# はじめに

初めまして、自己紹介させていただきます。

1995年生まれ福岡出身フリーランスエンジニアです。
先日福岡に帰省して、いろいろ自分のこと振り返るの大切だなとおもい、
今回記事を書くことを決断しました。

普通の人間がフリーランスになって生活しているという一例をシェアできたらとおもいます。
誰かの参考になれば幸いです！

今回は社会人2年目後半について書いてみようと思います。

# 目次
少し細かく振り返りながら記載するので複数記事書く予定です！
##### ・学生~就活編⇒https://qiita.com/Yutajino/items/bf074102e254457af934
##### ・1年目前半編⇒https://qiita.com/Yutajino/items/37d0ab0cd64d063870b7
##### ・1年目後半編⇒https://qiita.com/Yutajino/items/a4f3ac0e4f6821a3b264
##### ・2年目前半編⇒https://qiita.com/Yutajino/items/fccb4ce3c38186d0eb3b
##### ・2年目後半編⇒本記事
##### ・3年目編⇒完成次第リンク貼ります
##### ・フリーランス~失敗編⇒完成次第リンク貼ります
##### ・失敗~現在編⇒完成次第リンク貼ります

# なんとなく将来を考え始める
2年目の後半になると
独特ですが、素敵な先輩のもとで色々仕事を任されるようになり、
自分のこともたよりにしてくれるお客様も少しずつ増えるようになってました。

成長しているかもなという実感もありつつ、
将来のことを考える時期でもあります。

仕事ができるようになると
上司や部長、その上の人たちが何をやっているのかだんだんわかってくるようになり
自分がこのまま仕事を続ける先がなんとなく見えてきます。

また、
会社では将来的にどのようなキャリアを歩んでいきたいのか
面談や会話が増えることになります。

当時の会社は
マネジメントコースかスペシャリティコースのような形で
管理を担当するマネージャーとして進んでいくのか、
専門的な知識を持ったエンジニアとして進んでいくのか
の二つのコースが用意されてました。

個人的に専門的な知識を持つエンジニアになるより
上流工程に入って、
エンジニアという立場で色々な業界に関わっていきたいと考えていたので
マネジメントコースで進んでいくことにしてました。

ただ、SQLとBIツールのみで10年以上、
うまくやっていけるのかとなんとなく不安になってました。

# 同期、近くの先輩、周囲の動きが気になり始める
同期は20名近くいたのですが、
そのうち5名近くは2年を経たずして転職等を経て会社を離れてました。

※内定式後の飲み会で「いつ転職する？」と発言していた人は、
しっかり会社に根付いてバリバリ仕事をしていました。

一つ上の先輩でも、2人で飲みいった時際に
給料をもっとあげてほしい、転職しようかなあなど
現実的な話を色々をしていました。

当時のの会社に勤める以外の選択肢を考えてこなかった自分は、
先輩や同期の話を聞いて
「もっとこの会社でできることもたくさんあるだろう」と思いつつも
自分の将来についてしっかり考えていないなとも気付かされました。

何をしたらいいのかはわからないけど色々動いてみようと思い
動き始めました。

# していたこと
情報収集、視野を広げるためにやっていたことを何点か書き出してみます。
### 1．会社経由で知ったセミナーとか講演に参加してみる
今使っているツールや、製品に関しての将来性を知りたくて参加してました。
ツールを使ってどんなことができるのかを知って、
目の前の業務課題の解決にもつながるので、
足を運ぶようにしてました。

### 2．ビジネス本を読む
何かしらヒントになることはないかとおもにビジネス書を読み始めました。
最初は自分では買わず、会社に置いてある本を借りて読んでました。
機械学習、ディープラーニング、AIの概念を理解し始めたのもこの時期です。
※確か下記の本を読んで興味持ち始めました
「グーグルに学ぶディープラーニング」
https://amzn.asia/d/aTwbnay

### 3．将来のことについて紙にかきだしまくる
ビジネス書を漁っていく中で、下記の本に出会いました。
「ゼロ秒思考 頭がよくなる世界一シンプルなトレーニング」
https://amzn.asia/d/52EKIPE

紙書き出すというシンプルなやり方ですが、
頭の中がどんどん整理されて、業務でも活用していました。

将来のこと考え始めてから
今後のキャリアをどうしていくかを具体的に書き出すようになりました。

何かがまとまったかと言われるとその当時はよくわかりませんでしたが
自分の頭を常に整理することで不安が減りました。

# 今思うと
2年目の後半は仕事が面白くなり始めて、
当時の会社も悪くないなとおもいつつ
漠然とした不安を感じ始めてました。

納得させようとしている自分もいましたが、
同時並行で、情報収集や視野を広げる行動していたので、
フリーランスになる時もその当時の業務に関しても、プラスになることが多かったです。

しっかり仕事をすることで、転職しなければならないという切迫感もなく
リラックスして自分のことと向き合えたのは良かったと思ってます。

いきなり、セミナーや講演会にいくのはハードルが高い人もいると思うので
身近な他の人の話を聞いてみるのもいいし、本を読むのもいいし、
まず小さいことからうごいてみるのは効果的だなと思います。

# あとがき
・この頃、仕事の発散のために、週3ランニングと縄跳びをやってました
・縄跳びは毎回1000回跳んでました。変ですね
・お笑いライブや、芸人さんと同行できるバスツアーにも参加しました
　娯楽に関しても新たなチャレンジをしていました
・本は、また毎日10分でも読みます！
キャンフェスでメッセージが表示できる電子工作を作った話

# 自己紹介
こんにちは。N高等学校1年次生(9期生)、まだいと申します。主に編み物とゲームばっかりしているエンジニアとは程遠い人間です。普段文系をやっている人間なので、プログラミングは気になった言語(Python、HTML、JS)を少し齧ってみる程度しか知らないです。
なので、用語はほぼ出ません。初心者の方に優しい記事...？()

# 経緯
:::note info
N/S高の通学コースにおける学期システムは4学期制です。
1学期を「1クオーター」もしくは「1Q」と呼びます。
:::
私の所属するN/S高等学校の通学コースの授業には電子工作をする授業...というか、4Qを通じてとかではなく2Qに電子工作をするみたいな授業がありました。
そこでキャンパスフェスティバル(文化祭のようなもの)で作った電子工作を発表するという機会があり、そのために作ることとなったというのが経緯です。

# 用意するもの
マイコンボード　今回はArduino UNOの互換ボード「ELEGOO UNO r3」を使用します
大量のケーブル　配線に必要なやつです　とりあえずたくさん用意しとけばいいと思います(~~何本使ったか覚えてないとか言えない~~)
可変抵抗器　今回はネジを回すと抵抗が変わるボリューム型のものを使用します
LCD(ディスプレイ)　互換ボードのセットに入っていたものを使います
ブレッドボード　こいつがいなきゃ始まらない。

# 作り方
どう足掻いても完成品以外の写真がないのでfritzingの配線図になります。

まずはブレッドボードにLCD(ディスプレイ)を挿します。これを元に配線を進めます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3931744/3f1f078d-f92a-e44b-b3bc-51de5ef24980.png)

こんな感じで。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3931744/cfaf32a9-8f50-0167-8297-e4a215e2d404.png)
可変抵抗器はこのネジみたいなやつを使っています。だいたいこの通りに組めば大丈夫です。


# プログラム
マイコンボードに書き込むプログラムを書いていきます。
今回は四日市キャンパスのキャンパスフェスティバルでの展示品なので「Welcome to YokkaichiCP!!」と表示させます。
前述の通り私はちょこちょこ気になる言語を齧る程度しか触っていないのでこればかりは調べました。電子工作は少しだけそれに近いものを小学生の時授業や課外活動でやらせてもらったことがあるのでちょっと調べたらどうにかなるんですが。

##### マイコンボードに書き込むために
今回は「Arduino IDE」というアプリを使います。このアプリでプログラムを入力します。
なお言語はCを元にした独自言語、とのことだそうです。

:::note warn
このコマンドは**上が2行目に表示される内容、下が1行目に表示される内容**になっています。変更する際はお気をつけて。
英字しか表示できません。日本語は文字化けしたので、どうしても日本語がいい場合はローマ字を検討してください。
:::

```
#include <LiquidCrystal.h>
 
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
 
void setup() {
  lcd.begin(16, 2);
  lcd.setCursor(2, 1);
  lcd.print("Yokkaichi CP!!");
}
 
void loop() {
  lcd.setCursor(0, 0);
  lcd.print("Welcome to");　

}
```
このコマンドを打ち込みます。
表示させる文字を変えるときは「lcd.print("Yokkaichi CP!!");」と「lcd.print("Welcome to");」のダブルクオーテーションの中身を好きな文字に変えればなんでも表示させられます。

書けたら繋がっているボードの名前が太字になっていることを確認して、検証(チェックマーク)と書き込み(右矢印)を行ってください。「Arduino UNO」などのボードの名前が太字になっているようにしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3931744/e32344ec-b658-00f5-489b-a280bd4c4eea.png)

これで全ての工程が完了です！お疲れ様でした。

## 欠点
配線を少し握ると文字化けします。また、特定の状況下で場所移動させると文字化けします。おそらく気温が高い状況かと思われますが、真偽は不明です。
文字化けしても、書き込みをすると直るので、文字化けした場合はもう一度Arduino IDEから書き込みを行ってください。

# 完成品
当日実際に展示したものがこれです。可変抵抗器で文字の見え方を変えることができるので、ねじを回して調整してください。
![PXL_20241109_025258706.MP~2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3931744/d6389750-23af-15b8-dc72-1793c74ab091.jpeg)


ハロウィンの日に授業があったのでプログラムを書き換えて作ったもの。こんな感じで割となんでも表示できます。
![7E4DCE36-41E1-42BC-A8F6-D5B50BD2EF88_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3931744/3eeb20ca-b7f1-1f1c-eb9d-ab843b5b5e84.jpeg)

# 終わりに
電子工作については本当にやったことがなくて、とても面白くて貴重な体験だったなあとしみじみ感じます。Arduinoは割と参考になる資料が多くあって入門にちょうどいいのかなと思います。ぜひ気になっている方、一度やってみてはいかがでしょうか。

# 参考文献

https://blog.proglus.jp/5069/
【Datadog Database Monitoring】ECS上で複数ホストを１つのエージェントで実行させる

# 1.はじめに

[Datadog データベース モニタリング](https://docs.datadoghq.com/ja/database_monitoring)とは(公式ページ参照)
>Datadog Database Monitoring は、すべてのホストにわたるデータベースの詳細な可視性を提供します。データベースの正常性とパフォーマンスを理解し、問題が発生したときにトラブルシューティングを行うために、過去のクエリパフォーマンスメトリクスを掘り下げ、計画とホストレベルのメトリクスをすべて 1 か所で説明します。

今回、Datadogデータベースモニタリング（以降DBMと略す)をECSを利用して実装するにあたり、複数ホストを１つのエージェントで動作させるのに手間取ったため、やり方を本記事に記載する

# 2.構成

- Aurora マネージド MySQL (エンジンバージョン:8.0.mysql_aurora.3.04.1)
- ECS

# 3.DBMの準備

[Aurora マネージド MySQL のデータベースモニタリングの設定](https://docs.datadoghq.com/ja/database_monitoring/setup_mysql/aurora/?tab=mysql57)を参考に設定を行なっていく。
- MySQL 設定を構成する
    - 公式の手順通り実施  
- Agent にアクセスを付与する
    - 公式の手順通り実施
- ランタイムセットアップコンシューマー
    - 公式の手順通り実施
- Agent のインストールと構成
    - Dockerfileを作成する手順を参考に、ECSを構築する
ECSの[containerdefinitions.dockerLabels](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#container_definition_labels:~:text=the%20ulimit.-,Docker%20labels,-dockerLabels)に対して、必要なdockerLabelを記述していく。その際に[【Datadog】Docker and Integrations](https://docs.datadoghq.com/ja/containers/docker/integrations/?tab=labels)に記載があるとおり、現在の記法を参考にすると、以下一つのラベルを設定すればよい
```
com.datadoghq.ad.checks: '{"mysql":{"instances":[{"ここにインスタンス情報を書く"}]}}'
```

上記の手順を実施すると、DatadogのDatabaseMonitoringから設定した接続先ホストの情報が確認できるようになる。

# 4.複数ホストの監視

先ほどの手順で、ECSのタスク定義にDockerLabelsを設定したと思うが、そのラベル情報を書き換えることで追加のホストを監視できる。
```
com.datadoghq.ad.checks: '{"mysql":{"instances":[{"1.ここにインスタンス情報を書く"}{"2.ここにインスタンス情報を書く"}{"3.ここにインスタンス情報を書く"}]}}'
```

# 5.まとめ

今回は、私が悩んだECS（Docker）を用いて複数ホストを１つのエージェントで監視する場合の設定方法について記載しました。
DBMを導入してどのような変化があったや、どのような効果があったは運用をしていく上でなにかネタがあったらまたそれについても書きたいと思います。
【FuelPHP】クエリビルダで名前付きサブクエリを結合する方法

## 概要

FuelPHPにおける、クエリビルダで名前付きサブクエリを結合する方法を記載します。
以下のSQLの構築を例に説明します。(SQLの内容がイマイチですが不問とします)

```sql
select
    *
from
    user
    inner join (
        select
            *
        from
            branch_user
        where
            branch_name = '関東'
    ) branch_table on user.id = branch_table.id -- サブクエリにbranch_tableという名前を付与
```

テーブルは以下を用意します。

**userテーブル**
|id |name |area |
|---|---|---|
|1 |田中太郎 |関東 |
|2 |山田花子 |関東 |
|3 |山田五郎 |北海道 |
|4 |高橋玉子 |東北 |
|5 |伊藤はな |九州 |
|6 |里中さとる |九州 |

**branch_userテーブル**
|id |name |area |
|---|---|---|
|1 |田中太郎 |関西 |
|2 |藤倉宗則 |関東 |
|3 |青木隼也 |関東 |
|4 |高橋玉子 |関東 |
|5 |伊藤はな |関東 |
|6 |里中さとる |関東 |
|7 |安奈真優 |関東 |

## コード
```php
$sub_query = DB::select()->from('user')->where('area', '=', '関東')->compile();
$query = DB::select()->from('user')
	->join(array(DB::expr($sub_query), 'branch_table'), 'INNER')
	->on('user.id', '=', 'branch_table.id')
	->compile();
Debug::dump($sub_query,$query);
```

## 解説
1行目の$sub_queryに、サブクエリのSQLを設定しています。
2行目〜5行目は、実行するSQLの構築処理になります。
3行目の以下の処理で名前付きサブクエリを内部結合しています。
```php
->join(array(DB::expr($sub_query), 'branch_table'), 'INNER')
```
join()の第一引数に結合するテーブル（今回はサブクエリ）、名前を配列で指定しています。ここで重要なのは、サブクエリの指定にDB::expr()を使用することです。これを使わないとエスケープ処理が正しく行われません。

## 実行結果

![スクリーンショット 2024-12-11 16.04.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2323383/a1122933-e813-b862-34ae-56c7d2709154.png)


## 補足

なおOracleを使用している場合は、coreファイルをオーバーライドする必要があります。
オーバーライドの方法については割愛します。

core/classes/database/query/builder/join.php@compile
```
//   Add the alias if needed
if ($this->_alias)
{
    $sql .= ' AS '.$db->quote_table($this->_alias);
}
```

## 参考にしたサイト
[公式ドキュメント](https://fuelphp.com/docs/index.html)
[Query builder subquery in join?](https://fuelphp.com/forums/discussion/13888/query-builder-subquery-in-join/p1)
Context-Based Restrictionsに定義された権限

# はじめに
こちらの記事は下記Advent Calendar 2024で紹介しているIBM Cloud権限設定における `Context-Based Restrictions` になります。

https://qiita.com/katahiro/items/274bec5ad4a9e2604dcf

# 共通権限は割愛
こちらの記事に記載しているように、プラットフォーム・アクセス、サービス・アクセスの権限でそれぞれどのようなものが共通して設定されているかを紹介させて頂きました。

https://qiita.com/katahiro/items/b5e367666fe984944d4b

こちらの記事では共通部分で出現する権限を除いた各サービス毎の権限設定を紹介します。

# Context-Based Restrictionsで指定可能な権限のアクセス範囲
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/9f76949b-20e2-48bd-e961-fcc9335d6fc6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/335ef9ac-e939-55f3-e044-990186784a45.png)
- リソース・グループ
- リソース・タイプ

## リソース・グループの指定
これは指定されたリソース・グループに所属するContext-Based Restrictionsに対応したサービスにのみアクセス制限を設定するための権限です。リソース・グループ毎に明確にアクセス制御等の管理者が異なるのであれば、分けて運用するのが良さそうです。

## リソース・タイプの指定
これは現状 `NetworkZone Management`しか選択できない状態です。ルールの設定ではなく、Zoneの定義だけ実行させたいケースに使えるようにも思えますが、その場合はプラットフォーム・アクセスの権限で記載しますが、Editorの権限を与えたら実現できるようにも思います。Zoneの設定だけ確認させて、ルールの設定は何か一切見せない、という場合は利用できそうな設定です。

# Context-Based Restrictionsに設定された権限
## プラットフォーム・アクセスの権限
※Admin : Administrator, KM : Key Manager, SCR : Service Configuration Reader
### Network Zoneに関する権限
|権限|Viewer|Operator|Editor|Admin|KM|SCR|
|:---|:---:|:---:|:---:|:---:|:---:|:---:|
|context-based-restrictions.zone.read|〇||〇|〇|||
|context-based-restrictions.zone.create|||〇|〇|||
|context-based-restrictions.zone.update|||〇|〇|||
|context-based-restrictions.zone.delete|||〇|〇|||

どこからのアクセスに許可を出すか、そのネットワークゾーンの設定Editor以上であれば作成、編集が可能となっています。

### ルール設定に関する権限
|権限|Viewer|Operator|Editor|Admin|KM|SCR|
|:---|:---:|:---:|:---:|:---:|:---:|:---:|
|context-based-restrictions.account-settings.read|〇||〇|〇|||
|context-based-restrictions.account-settings.update||||〇|||

編集権限はAdministratorにしか割り当てられていません。
manageの権限ではなくupdateなんだ、という突っ込みはあるのですが…

## サービス・アクセスの権限

サービス・アクセスの権限設定はありません。

# さいごに
Context-Based Restrictionseとして個別に設定されている権限は少なかったですね。
ただ、セキュリティに対して敏感な昨今では利用しているサービスのエンドポイントに対する保護が求められるので、Context-Based Restrictionsを実行する際に、誰にどの権限を与えるべきなのか、こちらが参考になれば幸いです。
アリババクラウドのバックアップ戦略活用でサイバー脅威に対処する

> 本記事は[こちらのブログ](https://www.alibabacloud.com/blog/menggunakan-strategi-backup-di-alibaba-cloud-guna-mengatasi-ancaman-siber_601839?spm=a2c65.11461433.0.0.4ee35355mzU0fa)を参考にしています。
> 翻訳にはアリババクラウドの[ModelStudio](https://www.alibabacloud.com/en/product/modelstudio)([Qwen](https://www.alibabacloud.com/en/solutions/generative-ai/qwen))を使用しております。

## デジタル時代におけるサイバー犯罪への備え：アリババクラウドのバックアップ戦略

### サイバー犯罪への深刻な脅威

進化するデジタル時代において、サイバー犯罪は世界中の企業にとって重大な胁威となっています。ランサムウェア攻撃、情報漏洩、DDoS攻撃などは、財政的な大打撃をもたらすだけでなく、企業の信頼性を根底から揺るがす可能性があります。これらの脆弱性に対処するために、データ保護のための包括的な備えが不可欠となります。アリババクラウドは、リーディングなクラウドサービスプロバイダーとして、サイバー脆弱性からデータを守るために設計された対策を提供しています。

### バックアップの重要性

バックアップはデータ保護戦略の中心的な要素であり、以下のような利点を提供します：

- ランサムウェアなどのサイバー攻撃後にデータを復元する。
- データ漏洩やハードウェア障害による損害を防ぐ。
- 活動の継続性を確保し、ダウンタイムを最小限に抑える。

### アリババクラウドのバックアップ戦略

アリババクラウドは、データの保護に向けた多様なサービスと機能を提供しています。以下が採用できる戦略です：

1. **アリババクラウド・バックアップサービスの活用**
   - 自動化されたバックアップを提供し、物理サーバーや仮想サーバーやデータセンターなどからのデータを統合管理。
   - スケジュール可能な自動バックアップ。
   - 不正アクセスを防ぐための暗号化ストレージ。
   - 地域間レプリケーションで、単一のデータセンターの危険にもかかわらずデータ可用性を維持。

2. **3-2-1バックアップ原則の実践**
   - 3つのコピーを保存（元データと2つのバックアップ）。
   - OSSやApsara File Storageなどの2種類以上のストレージサービスを使用。
   - 地理的に分離した場所に少なくとも1つのコピーを格納。

3. **バックアップデータの暗号化**
   - AES 256ビットでデータを暗号化し、Key Management Service (KMS)により独自の暗号化設定も可能。

4. **バックアップの監視と管理**
   - リアルタイムのバックアップ状況確認ができるDashboardを提供。

5. **データ復元のシミュレーション**
   - サイバー攻撃への対応の際、データ復旧プロセスを事前にシミュレーション可能。

6. **バックアップと他のセキュリティ戦略の統合**
   - Firewall、WAF、セキュリティ監視、ゼロトラストアーキテクチャなどとの連携。

### 結論

堅牢なバックアップ戦略は、サイバー脅威の時代におけるデータ保護の重要な部分です。アリババクラウドのサービスと機能を利用することで、企業はデータをより効果的に保護し、業務の継続性を確保し、サイバー犯罪によるリスクを低減することができます。データ保護に対する包括的かつ前向きなアプローチは、デジタル資産を守りながら長期的なビジネス成長を支える投資と言えます。[アリババクラウドのデータバックアップソリューション](https://www.alibabacloud.com/id/solutions/hybrid/cloud-backup?_p_lc=1)について詳しくは、こちらをご覧ください。
サーバへのアクセス権の死活確認実装のテスト

## あまり内容はありません
出落ちになりますが、あまりノウハウや失敗談というほど大きな話ではありません。

## DBへのアクセス権がなくなり定時処理に失敗！
あるユーザのDBへのアクセス権がなくなる事態が発生しました。
そのユーザはDBで定時まとめ処理を行うのですが、アクセス権がなくなったことでその処理が行われず、ユーザ部門ではちょっとしたパニックに。
そもそもアクセス権がなくなること自体が想定されていなかったことや、ずさんな権限管理などが根本の原因ですが、少なくとも当面は何かしらの再発防止を実施する必要がありました。

## アクセス権がなければメール送信するアプリを開発
アクセス権の死活を確認するアプリを作成しました。
DBのユーザ情報を取得しアクセス権がない状態であれば、異常として関係者にメール送信をするアプリです。
定時処理の前に一度確認すればいいのでタスクスケジューラで定時の少し前に起動するような簡易な仕組みとしていました。
ショートメール送信なども検討しましたが、実装スピードとコストからメールにしました。

## テストのためにどんどんメールを送信する！
異常時にはちゃんと動作をして通知する必要があるので、アクセス権の確認とメール送信の動作確認は念入りに実施しました。
「ヨシッ！ちゃんと動作してる！これなら先日の失敗を防げる！」
テストが終わってイザ本番に実装しようとしたとき、気が付きました。
テストの間、本番同様の送信先設定であったことに...

幸い本番での送信先も関係者だけだったので大きな実害はないのですが、味気ないテストメールが関係者のメールボックスを埋めていたかと思うと...いやー申し訳ない！

## その後
アプリは正常に動作し確認を実施していたようですが、実際にメールが送信されるような異常状態になることはありませんでした。
デスヨネー。うん、知ってた。
オブザーバビリティとはなんだ

『オブザーバビリティ・エンジニアリング』という本を見つけて「オブザーバビリティとはなんだ」と思ったので、読みました。

この記事は[株式会社要 cavacanチーム Advent Calendar 2024](https://qiita.com/advent-calendar/2024/cavacan) 12日目の記事です。

# オブザーバビリティ・エンジニアリング

https://www.oreilly.co.jp/books/9784814400126/

読んだ感想ですが、「オブザーバビリティ」という言葉に聞き覚えがなくても、本番環境の対応をしたことがあるなら「なるほど～～」と思うことが間違いなしの内容でした。

下記の見出しを読んで興味のあるトピックがあれば、そこの章から読み始めるというのもよいでしょう。

## 本番環境で不具合おきたので原因調査お願いします

…と連絡が来たのでとりあえずダッシュボードを開いてみると、見覚えのあるパターンでグラフが異常を示している。「この雰囲気はたぶんあの障害が起こっている」「あの機能が悪さしてるかな」とピンと来ました。

これ、やっているひとおおいと思います。経験のあるエンジニアほどよくやっているいわば「障害占い」です。

本来、原因の追求としてやらなければならないのは何のバイアスも無い事実（データ）に基づく調査です。占いでは既知の問題を当てることは出来るかもしれませんが未知の問題には対処できません。

原因調査をするべきなのはわかっていても、調査がしにくいアプリケーションを作ってしまった／担当になってしまった場合、当たろうが外れようが占うしかありませんね。これはオブザーバビリティの低いアプリケーションです。

逆に、調査がしやすいアプリケーションというのはログやリクエストの情報の探索性が高いということになります。これはオブザーバビリティが高いアプリケーションということになります。

## TDDで不足するものとは

開発段階からオブザーバビリティ向上に取り組むうえで、改めてTDD（テスト駆動開発）の良いところ・悪いところを確認します。

## DevOps・SRE

組織単位でオブザーバビリティを考えたときに、そもそもオブザーバビリティが必要となった要因としてDevOpsやSREの思想や動きがあったことがわかります。
この書籍のタイトルにはそのへんの単語が入っていませんが、実はよく触れられています。

## まとめ

この本では具体的にどのようなアプローチを取ればアプリケーションのオブザーバビリティを高めることが出来るかが説明されています。

実際のアプリケーションに今すぐ取り入れたい、というせっかちな人はこの本があればとりあえず導入できるので、入手すると良いと思います。

次回のアドベントカレンダーは @matsujunjun さんの「初めての自動テスト ―Webシステムのための自動テスト基礎」の書評記事です。
OCamlでEthereumのスマートコントラクトを開発できるようにするプロジェクトの紹介2 (bool 演算と if 式)

株式会社 [proof ninja](https://proof-ninja.co.jp/MainJa.html) 技術顧問の池渕です．

この記事はこちらの記事
[OCamlでEthereumのスマートコントラクトを開発できるようにするプロジェクトの紹介](https://qiita.com/mrkbc/items/64cd4eb0edd15a883285)
の続きです．今回は，新しく bool 値や if 式の実装を行ったのでその紹介をします．

ソースコードはこちら：

https://github.com/proof-ninja/ocaml2evm

具体的には今回，ocaml2evm に以下のような値や式が追加されました．

- bool 値 `true`, `false`
- bool 演算 `&&`, `||`, `not`
- sint 型の整数の比較演算 `<`, `>`, `<=`, `>=`
- `if ... then ... else ...`

具体例として，サンプルコードである `ocaml2evm/sample/src/simple_storage.ml` の中身を見てみましょう．

```ocaml
open OCamYul.Primitives

module SimpleStorageIf : sig
  type storage

  val set : sint -> storage -> unit * storage
  val get : unit -> storage -> sint * storage
  val lt : sint * sint -> storage -> bool * storage
  val gt : sint * sint -> storage -> bool * storage
  val lte : sint * sint -> storage -> bool * storage
  val gte : sint * sint -> storage -> bool * storage
  val xor : bool * bool -> storage -> bool * storage
  val xor2 : bool * bool -> storage -> bool * storage
  val max : sint * sint -> storage -> sint * storage
end = struct
  type storage = sint

  let set n _ = ((), n)
  let get () s = (s, s)
  let lt (x, y) s = (x < y, s)
  let gt (x, y) s = (x > y, s)
  let lte (x, y) s = (x <= y, s)
  let gte (x, y) s = (x >= y, s)

  let xor (x, y) s =
    let b = (x || y) && not (x && y) in
    (b, s)

  let xor2 (x, y) s =
    let b = if x then (if y then false else true) else (if y then true else false) in
    (b, s)

  let max (n, m) s =
    let b = n > m in
    ((if b then n else m), s)
end
```
ここで定義している `xor` や `xor2` は，上記のブール値演算や if 式を使って xor を(あえて複雑に)実装してみています．
OCaml の if は式なので，`let b = if x then ... else ...` のように代入の `=` の右側に if が書けます．C 言語などでいう三項条件演算子と同じです．

また，`>` を使って，整数の `max` 関数も定義しています．

このファイルをコンパイルするには，前回の記事と同様に，
```
$ dune exec ocamyulc sample/src/simple_storage_if.ml
```
を実行します．また，その結果は `sample/contracts/SimpleStorageIf.json` として出力されます．

bool 演算や if 式が使えるようになったことにより，前回よりいろいろなコントラクトが実装できるようになったと期待できます．
今後はこの機能の範囲でもう少し実用的なコントラクトを定義し，さらには簡単な形式検証を行っていくことが目標です．
[論文紹介] 現実的なサンプル生成によるPath-CNNの性能向上

# 論文について
Segmentation of Tubular Structures Using Iterative Training with Tailored Samples
Wei Liao, ICCV, 2023

https://arxiv.org/abs/2309.08727

## Path-CNNとの関連について
Path-CNNの元論文(同著者)はこちら

https://arxiv.org/abs/2204.00944

解説記事はこちら

https://qiita.com/thoth000/items/d2ae95c5395b251d429d

---

本論文はPath-CNNの訓練法について改良した論文になっており、中心線およびマスクセグメンテーションの手法はPath-CNNと同じダイクストラで行う。
（Path-CNNは始点・終点間の最小経路を求めるアルゴリズムになっていた。本論文では、始点から任意のピクセルまで最小コスト経路を求めるアルゴリズムになっている。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539025/dc67b2c6-a212-734e-65ac-1017c77c3323.png)


## 分類用CNNの訓練に使われるサンプルについて
Path-CNNでは中心線アノテーションを直接使用してサンプルを生成(添付図左)するが、このような中心線は推論中に厳密に一致しない。
そこで推論中に遭遇するサンプルに近いもの(添付図中央および右)でCNNを訓練させ、最小経路法の性能を向上させるために、反復的な訓練法を提案した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539025/fb72e3a3-8b60-c62c-494c-9bcd9604a449.png)

### 訓練に適したサンプルの生成法
Path-CNNは中心線アノテーションを用いてサンプルを生成したが、本論文では**マスクアノテーション**を用いてサンプルを生成する。
また、訓練中のCNNの分類結果を用いて訓練サンプルを生成し、そのサンプルでCNNを訓練することを繰り返すため、効果的な反復スキームになっている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539025/1d5d796b-33d2-b1c7-daa8-4ba78eade555.png)

**アルゴリズムの概要**

- 初期ステップ
    1. マスクアノテーションを利用し、エッジの重みを初期化する。エッジの両頂点が前景に含まれるなら1, そうでないなら大きな正定数に設定。
    2. この初期重みからパス$\pi$を求め、任意のピクセル$x$から$\pi$をたどって局所経路$\gamma_L$を生成、$\gamma_L$に沿ったパッチ$P$($x$が前景ならポジティブ, 背景ならネガティブとしてラベル付け)の集合$\chi$を生成。

- 反復ステップ
    1. CNNモデルをサンプル$\chi$で訓練
    2. Algorithm 1で最短経路情報$\pi$と推論マスク$M$を生成
    3. $\pi$を用いて、任意のピクセル$x$から局所経路を生成し、それに沿ったパッチ$P$の集合$\chi$を生成。
    3. $M$についてDiceスコアを評価し、上昇すればステップ1のモデル学習に戻る。

## 実験結果
### 中心線の精度
真の中心線からの絶対距離平均で評価したところ、比較手法と比べて最も低い誤差を達成した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539025/d52c704a-6877-12fe-8128-0f76f0014c3f.png)

Path-CNNの中心線抽出の結果と比べても、本論文の手法が適した中心線を抽出する場合が確認できる。
(黄色がPath-CNN, 赤色が本論文)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539025/43bd8b26-dcd7-5406-cbc1-0dd71844e58f.png)


### セグメンテーションマスクの精度
EPFL(衛星画像データセット)で比較手法と比べて良い精度が得られた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539025/955ac6f0-51a2-c5b8-2d9e-7909c11b5e21.png)

本論文はデータセットが少ない場合に有効であることが強みであり、アノテーション画像が3枚である場合にも良いセグメンテーションマスクが得られている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539025/fdd81d8e-8c34-1d0b-b0d0-daf7b3374eaa.png)

### 反復的な訓練による効果
反復Iterationが進むことで、初期ステップに比べて検証データのDiceが向上している。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539025/1998caa1-0604-1823-0fe2-94138e0dcbf3.png)
Librosaで音響信号分析をしてみよう

## はじめに
こんにちは！ MYJLab Advent Calendar 2024、12日目を担当する松田です。

昨日はうのちゃんの色彩検定についてのお話でした。
PCCSの色相環は見たことありましたが、ドミナントカラーやドミナントトーンについては初めてで、勉強になりました！！
企業のロゴや標識は日常的に目にするのでとても身近に感じ、興味を持てましたよね！
クイズは難しかったなあ☺☺

さて、本記事は、簡単にできる音響信号分析についてになります。
私は、卒業研究で音楽データを解析していたのですが、そこで使用したLibrosaというPythonのライブラリの説明をしようと思います。
簡単にできるので、良かったら一緒にやってみてください！！

## Librosaとは？
**Librosa**は、Pythonで音響信号を処理・分析するためのライブラリです。  
音楽や音声データの解析を簡単に行うことができ、音響信号処理における基本的なツールとして活用されています！


## インストール方法 
Librosaをインストールするには、以下のコマンドを実行します。
```
pip install librosa
```

## 音楽ファイルの読み込み 
まずは、音声ファイルを読み込みます。
librosa.loadを使ってファイルの読み込みと音声信号データ（y）とサンプリングレート（sr）の取得ができます。

```
import librosa

audio_path = 'demo.wav'
y, sr = librosa.load(audio_path)

print(f"サンプルレート: {sr} Hz")
print(f"データの長さ: {len(y)} サンプル")

```
**結果**
```
サンプルレート: 22050 Hz
データの長さ: 3487104 サンプル
```
## 波形の描画 
次は、波形の描画です。
波形を描画することで、音声データの全体像を視覚的に把握することができます。
```
import librosa.display
import matplotlib.pyplot as plt

# 波形を描画
plt.figure(figsize=(10, 4))
librosa.display.waveshow(y, sr=sr)
plt.title('Waveform')
plt.xlabel('Time (s)')
plt.ylabel('Amplitude')
plt.show()

```
出力をみると、なんだか音が発生しているのが分かりますね！
![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617888/8aecf2ed-2425-3d2b-90bf-580cc42fb97b.png)


## クロマグラム 
次は、クロマグラムです。

クロマグラムは、音声データの音の高さ（ピッチ）を12の音階 [C, C#, D, D#, E, F, F#, G, G#, A, A#, B] に分類し、それを時間軸に沿って可視化したものです。

クロマは音階を意味しており、クロマグラムはクロマをヒートマップで視覚的に表現したものです。
楽曲の調性やコード進行を分析する際に活用されます。
```
chromagram = librosa.feature.chroma_stft(y=y, sr=sr)

plt.figure(figsize=(12, 4))
librosa.display.specshow(chromagram, y_axis='chroma', x_axis='time')
plt.colorbar()
plt.title('Chromagram')
plt.tight_layout()
plt.show()

```
出力をみると、時間経過に伴った音階の強度を把握することができます！
ヒートマップのx軸は時間、y軸は12の音階を示しています。
黄色など明るい色はその音階のエネルギーが高く、
黒など暗い色はその音階がほとんど現れていないことになります。
![Figure_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617888/d8c7b861-4ff1-b42a-0aae-76ecf5e33d50.png)



## 音圧（RMS） 
次は音の大きさの変化や強弱の推定です。
音声データのエネルギー変化を表すRMS値を計算しています。
```
import numpy as np

# RMSを計算
rms = librosa.feature.rms(y=y, frame_length=65000, hop_length=16250)[0]
rms /= np.max(rms)  # 正規化
times = librosa.times_like(rms, hop_length=16250, sr=sr)

# RMSをプロット
plt.figure(figsize=(12, 4))
plt.plot(times, rms, label="RMS")
plt.ylabel("Normalized RMS")
plt.xlabel("Time (s)")
plt.legend()
plt.tight_layout()
plt.show()

```
出力をみると、音の大きさの変化が見えますね！
![Figure_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617888/777a8425-184c-754d-764a-89708881ac12.png)


## テンポ 
最後に、楽曲のテンポ推定です。
ビートの位置を検出し、音楽のテンポを推定することができます！
```
tempo, beats = librosa.beat.beat_track(y=y, sr=sr)
print(f"テンポ: {tempo} BPM")
```


**結果**
```
テンポ: [69.83741554] BPM
```



## まとめ 
今日はLibrosaを用いた音響信号分析についてのお話でした。
今回は基本的な機能のみを紹介しましたが、Librosaにはさらに多くの機能があるので、
興味がある方はぜひトライしてみてください～

最後までお読みいただき、ありがとうございました！
unerryのテクノロジースタック刷新プロジェクトの裏側

### はじめに
unerryのプラットフォームチームでフロントエンドエンジニアをしている堀江です。
私のプロジェクトでは、この半年間テクノロジースタック刷新を行い、リリースまで完遂しました。
そのプロジェクトの背景から、新旧テクノロジースタックを公開しちゃいます。

### プロジェクト概要
私が所属しているプロジェクトは、ユーザー数が大規模のtoC向けネイティブアプリ（以下、アプリ）を開発、保守しております。
このアプリには、弊社のBeacon Bank SDKを導入しており、位置情報を活用した顧客体験の設計、コンテンツ開発を行なっております。

### 刷新前の状況、課題
このアプリは、長年にわたって開発されており課題を抱えておりました。

1つ目は、複数の言語、フレームワークを使って実装されている点です。
もちろん、フロントエンドとバックエンドで言語やフレームワークが違っているのはよくあることです。

しかし、私のプロジェクトでは、アプリをSwift、Kotlinに加え、アプリ内WebViewをVue.js(JavaScript)で、バックエンドをPHPとRuby on Railsで実装しており、1つの領域に複数の言語、フレームワークを採用しておりました。

2つ目は、MySQLのバージョンが古いという点です。
刷新前はMySQL5.7で、そもそもサポート終了しているし、GCPのCloudSQLも拡張サポートに入るという状況でした。

### 旧テクノロジースタック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187033/d40d2a6b-4472-3999-db31-8709bea605c9.png)

このようなテクノロジースタックになった背景は、1つにストアへのアプリ申請の煩わしさがあったからでした。
そのため、元々Swift、Kotlinで開発されていたのですが、追加開発する画面についてはアプリにWebViewを設置し、Vue.jsで実装した画面を表示するという形になりました。
また、バックエンドはレガシー技術を使っていおり開発効率が悪いという点から、追加開発をRuby on Railsで行いました。

それにより、一部改修はアプリ申請不要となりましたが、複数の言語、フレームワークを使って実装する形となり、結果として改修コストが高まってしまいました。

この点から、長年刷新したいという思いはあったものの、やはり踏ん切りがつかなかったのですが、MySQL5.7のサポート切れがダメ押しとなり、刷新することとなりました。

### 刷新後のテクノロジースタック

では、ここから本題の新テクノロジースタックです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187033/d9d927cc-252a-7764-257c-e314a7eaa518.png)

アプリをFlutter、フロントエンドとバックエンドをTypeScriptとNext.jsにそれぞれ統一しました。
それに加え、ORMにPrisma、スキーマ定義とデータ検証にZodを採用しました。
※Flutterは、基本的にWebViewでNext.jsの画面を表示し、ネイティブ特有の機能のみ実装（位置情報の許諾や取得など）

### メリット・デメリット
#### 恩恵・メリット
- **フロントエンド、バックエンド、DBの垣根がなく、シームレスに開発が行える**
    - Next.jsのServer Actionsによりバックエンドも実装可能
        - フロントエンドとバックエンドで、言語やライブラリの切り替えコストが不要
        - フロントエンドからのAPI呼び出しが不要で、Server Actions内の関数を直接呼ぶだけ
    - チーム開発が効率的
        - フロントエンド、バックエンド、DBを1人の開発者が担当できるため、フルスタックエンジニアが活躍しやすい
        - タスク分担の調整が容易
- **IF設計がほぼ不要**
    - フロントエンド↔︎バックエンド
        - フロントエンドがServer Actionsの関数を直接呼ぶので、フロントエンドとバックエンドでIF設計が簡単
            - フロントエンドとバックエンドの垣根がないため、設計の違いから認識齟齬が生まれずらい
                - 例えば、フロントエンドとバックエンドでIFの設計者が異なり、認識齟齬により手戻りが発生するなどが起きずらい
            - APIの認証などの設計が不要
        - 型定義が必要な場合は`ReturnType<typeof function>`で簡単実装
    - バックエンド↔︎DB
        - Server Actionsの関数内でPrismaを用いたデータ操作が可能
        - Prismaのスキーマ定義からデータベース関連の型を自動生成してくれるので、データ操作時の型の安全性を担保できる
- **アプリUIの更新が容易**
    - Flutterで最低限のネイティブ機能を実装し、UIはNext.jsで実装しているため、UI改修はアプリストアへの再申請なしでリリースできる
- **CMSの実装が容易**
    - Next.jsのServer ActionsやPrismaを活用し、効率的にCMSを構築可能
    - ZodとReact Hook Formを組み合わせたスキーマ定義とバリデーションにより、高い拡張性と安全性を確保

#### デメリット
- **ネットワーク依存性**
    - ネットワークが不安定だと、Next.jsサーバからのレスポンスが遅延し、アプリの画面に何も表示されない
    - アプリ単体で実装する場合、ダウンロードされたデータによりオフライン状態でも画面表示が可能だがその実現が難しい

### まとめ

以上が、とあるプロジェクトのテクノロジースタック刷新プロジェクトの裏側でした。
アプリ、フロントエンド、バックエンド全てが刷新されているので、プログラムからインフラまですべてリプレイスされており、非常に大変ではありました。

私自身、フロントエンドしかほぼ分からない状態だったのですが、この刷新プロジェクトを通じてバックエンドからインフラまで触れるようになり、フルスタックエンジニアとしての第一歩が踏み出せたと思っております。

また、unerryにはこのプロジェクト以外にも多くのプロジェクトおよびサービスが開発、運用されておりますが、レガシー技術を使っているも少なくなく、この刷新プロジェクトの経験を生かせる場があると思っているので、引き続き頑張っていこうと思います。

最後まで読んでくださりありがとうございました。
Alibaba Cloud ECSでの脅威の検出

>本記事は[こちらのブログ](https://www.alibabacloud.com/blog/mendeteksi-ancaman-di-alibaba-cloud-ecs_601840?spm=a2c65.11461433.0.0.4ee35355mzU0fa)を参考にしています。
>翻訳にはアリババクラウドの[ModelStudio](https://www.alibabacloud.com/en/product/modelstudio)([Qwen](https://www.alibabacloud.com/en/solutions/generative-ai/qwen))を使用しております。

セキュリティは、特にアリババクラウドの <a href=https://www.alibabacloud.com/product/ecs target=_blank>弾性的なコンピューティングサービス</a>（ECS）のようなクラウドインフラ管理において、最も重要な一方向の誤りです。ECSは企業が高いスケーラビリティを実現することを可能にしますが、同時にブルートフォース攻撃、マルウェア、権限滥用了被害などのサイバー脆弱性の目標にもなります。この記事では、ECSにおける脆弱性の感知方法と、アリババクラウドが提供するツールと機能を使用してセキュリティを確保する方法について解説します。

**ECSでの脅威検出が重要な理由**

ECSは、機密性の高い入力を扱う重要なアプリケーションを実行するために広く使用されます。ECSに対する攻撃により、以下のような影響が生じることがあります。

- オペレーションの中断とダウンタイムの発生
- 消費者のデータや企業内部の情報の漏洩
- クラウド運営コストの増大

そのため、ECS内の実装とデータを保護するために、脆弱性の検出は不可欠です。

**アリババクラウド ECSにおける脅威検出戦略**

1. **アリババクラウド セキュリティセンターの活用**
   <a href=https://www.alibabacloud.com/product/security-center?spm=a3c0i.14509290.6791778070.469.5df97b8dzpC2gY target=_blank>アリババクラウド セキュリティセンター</a>は、クラウド環境全体、ECSを含む、統合セキュリティソリューションです。脆弱性検出の主要機能には次のようなものがあります。
   - **脆弱性スキャン**
     ECS内のアプリケーション、システム、設定の脆弱性を自動的に調査し、改善アクションの提案を行う。
   - **異常監視**
     不明な場所からのログインや公にならないデータアクセスなどの異常アクティビティをマークし、管理者に報告する。
   - **マルウェア検出**
     ECS内でインストールされたマルウェアを検出し、隔離する。

2. **ログ監査とActionTrailの有効化**
   ActionTrailは、ECS上のAPIアクティビティを追跡できるログ監査サービスであり、これを使用すると、
   - 不正な構成変更を検出
   - 怪しいアクセスパターンを特定
   - セキュリティイベントの詳細な調査を行うことができます。

3. **クラウドファイアウォールの利用**
   <a href=https://www.alibabacloud.com/product/cloud-firewall?spm=a3c0i.14509290.6791778070.126.5df97b8dzpC2gY target=_blank>アリババクラウド クラウドファイアウォール</a>は、ECSへの接続層を保護するためのツールで、自動的に危険なトラフィックを検出しブロックできます。主な機能は：
   - **リアルタイムトラフィックモニタリング**
     DDoS攻撃、ポートスキャン、または他の悪意のある活動を記録できる。
   - **脅威インテリジェンスとの統合**
     グローバルな脅威データベースを用いて、危険なIPやパターンを検出する。

4. **ログサービスの活用による高度な分析**
   <a href=https://www.alibabacloud.com/product/log-service?spm=a3c0i.14509290.6791778070.444.5df97b8dzpC2gY target=_blank>アリババクラウド ログサービス</a>を使用して、ECSに関するログを収集・分析することで、
   - ブルートフォース攻撃やポートスキャンなどの攻撃パターンを検出
   - CPU、メモリ、帯域幅の操作パターンに基づく異常を特定
   - ITチームへのセキュリティ要件の伝達ができるようになります。

5. **ECS上でのIDS/IPSの実装**
   アリババクラウドでは、侵入検知システム（IDS）と侵入防止システム（IPS）の統合と展開が可能です。IDS/IPSは、例えば以下の脆弱性を感知します：
   - ネットワークベースの攻撃（SQLインジェクション、クロスサイトスクリプティング）
   - 内部ユーザーの怪しい行動

**ECSでの脅威検出強化のための実践的なヒント**

1. **定期的にシステムを更新**
   ECS上で実行されているアプリケーションやシステムを最新状態に維持して、セキュリティホールを塞ぐことが重要です。
2. **ログインにMFAを使用**
   マルチファクタ認証（MFA）を使用することで、ECSへの不正アクセスを防ぐことができます。

**まとめ**

<a href=https://www.alibabacloud.com/product/ecs target=_blank>アリババクラウド ECS</a>はクラウドインフラ構築の強力なツールですが、セキュリティは常に最優先事項です。Security Center、ActionTrail、Cloud Firewallなどの機能を活用することで、組織は早期に脅威を検出し、悪影響を防ぐことができます。これらのソリューションを厳しいセキュリティポリシーと組み合わせることで、ECSがサイバー脅威から安全に守られることが保証されます。セキュリティはシステムを守ることだけでなく、デジタル時代でのビジネス継続性を確保することでもあります。脅威分析のための製品については、<a href=https://www.alibabacloud.com/id/marketplace/qradar_siem?_p_lc=1 target=_blank>こちら</a>をご覧ください。

**免責事項**: この記事に表明された見解は参考のみであり、必ずしもアリババクラウドの公式見解を代表するものではありません。
"Vec"の中身を"Clone()"なしで返す （into_iter()の使い方）

Rustで開発していると、Cloneに頼りたくなる場面は多い。
しかし、大きなデータをCloneすることはパフォーマンス低下につながる。

この記事では、into_iter()を活用してclone()なしでVec内の要素を返す方法を紹介する。

`Board`という構造体が入っている`Vec<Board>`から、`iter().min()`で最小値を直接取得し、そのまま返す例を使って説明する。

``` Rust
fn get_unique_board(board: &Board) -> Board {
    let boards: Vec<Board> = board.get_all_symmetries();
    boards.iter()
          .min()     // -> Option<&board>
          .unwrap()  // -> &Board
          .clone()   // -> Board (ここで clone() が必要になっている)
}

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598104/7407637e-f02e-6f38-b5e2-84ec8d3b6de8.png)

min()の返り値は、`Board`ではなく`&Board`である。
そのまま`Board`を返したいなら`clone()`が必要になる。

`into_iter()`を使えば、`Vec<Board>`の所有権を直接イテレータに渡すことができる。結果的に、min()で返ってくるのは`Board`自体となり、`clone()`が不要になる。

``` Rust
fn get_unique_board(board: &Board) -> Board {
    let boards: Vec<Board> = board.get_all_symmetries();
    boards.into_iter() // 所有権を移動
          .min()       // -> Option<Board>
          .unwrap()    // -> Board
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598104/7f57fda4-c4d3-e266-fb1c-48ffb48d7803.png)

このようにすることで、Vec<board>の中のBoardを直接返す事ができる。
（Vec<board>の中のBoardをコピーする必要がなくなる。）