OmniAICreator/Qiita-1.07M huggingface dataset:
ChatGPTへ自分の認識や対応が間違っていないか相談してみた（PMO・リリース工程）

こんにちは、小磯と申します。
ChatGPTを利用する機会がありました。
その中でChatGPTへプロジェクトのリリースフェーズの流れについて質問の方法と回答について記載します。
PMO業務を4年しておりますがリリース工程の経験が少ないため、全工程を経験した時の対応に少し不安があるためChatGPTに相談しようと思いました。

### 質問事項
プロジェクト　リリースフェーズの流れについて教えて。
- リリースフェーズとは何かを知りたい。
- リリースの流れを箇条書きで知りたい。
- リリースフェーズの注意点を箇条書きで知りたい。
- リリースフェーズが失敗した場合のリカバリをどうするか箇条書きで知りたい。
- リリースフェーズの重要性を知りたい。

### ChatGPTの回答
#### リリースフェーズとは
リリースフェーズは、プロジェクトで開発された製品やサービスをユーザーや顧客に提供するプロセスのことを指します。システム開発プロジェクトでは、本番環境への移行を含み、製品を正式に稼働させる重要な段階です。

#### 1.リリースの流れ（箇条書き）
- リリース計画スケジュール、リソース、リスク対応策を策定。
- ステークホルダーの調整クライアントや運用チームとの合意形成。
- 環境準備本番環境の確認、必要なリソースの配備。
- テスト実施最終的な動作確認（UAT、本番環境での動作テスト）。
- デプロイシステムの本番環境への移行作業。
- リリース確認リリース完了後、動作状況をモニタリング。
- リリース後サポート問題発生時の即時対応体制。

#### 2.リリースフェーズの注意点（箇条書き）
- リリーススケジュールの厳守：スケジュール変更による影響範囲を最小化。
- リスク管理：障害が発生した際の切り戻し計画を準備。
- 品質保証：リリース前のテスト段階で重大な問題をすべて解決。
- 利害関係者への事前通知：クライアントや運用チームへ詳細な情報共有。
- 手順の明確化：各ステップを明確にし、担当者を明確化。
- 影響範囲の最小化：本番環境に影響を与えないよう、非稼働時間帯での実施を検討。

#### 3.リリースフェーズが失敗した場合のリカバリ（箇条書き）
①原因分析：ログやエラーレポートを迅速に確認。
②切り戻し（ロールバック）：失敗時に元の状態に戻せる手順を事前に準備。
③ステークホルダーへの報告：影響範囲と対応策を速やかに共有。
④修正と再リリース：問題を解決し、再度リリース計画を立てる。
⑤リスクの再評価：失敗要因を分析し、将来のリスク軽減策を策定。
⑥運用監視強化：リリース後の動作確認を徹底する。

#### 4.リリースフェーズの重要性
- プロジェクト成功の鍵：リリースが失敗すると、プロジェクト全体の成果が損なわれる可能性がある。
- 顧客満足度向上：リリースがスムーズであれば、信頼を高める。
- リスク軽減：適切な計画と実行により、ビジネスや運用への影響を最小化。
- 製品の品質保証：最終段階として、全体の品質を証明する機会。
- ビジネスインパクト：成功したリリースは、収益や市場での評価に直結する。


リリースフェーズは計画性とリスク管理が鍵となります。PMOとして、全体を俯瞰し、問題が発生しても迅速に対応できる体制を整えておくことが求められます。

### まとめ
今回は分かり易く簡潔に見えるようChatGPTへ質問しました。
数年後に同じ質問をしたらもっと情報量が増えるかもしれませんし、より見やすくなるかもしれません。
またChatGPTを利用する機会がありましたら、別の視点から質問しようと思います。

他にもプロジェクトに関する記事を投稿しておりますのでお役に立てればと思います。
[プロジェクト ウォーターフォールとアジャイルの違い](https://qiita.com/pesysyon/items/e77b869b5c90b667680b)

[初めてプロジェクトに参画する方へプロジェクトとタスクの意味について](https://qiita.com/pesysyon/items/a7da021a7d596df5e5fd)

[初めて参画するプロジェクトPM(PMO) 要件定義の工程](https://qiita.com/pesysyon/items/cf40037f484b99e16621)

[初めて参画するプロジェクトPM(PMO) 基本設計の工程](https://qiita.com/pesysyon/items/c0b936f325244be7688d)

以上、小磯でした。
generated_attribute_methods

### generated_attribute_methods
```rb
        def generated_attribute_methods
          @generated_attribute_methods ||= Module.new.tap { |mod| include mod }
        end
```
https://github.com/rails/rails/blob/cf6ff17e9a3c6c1139040b519a341f55f0be16cf/activemodel/lib/active_model/attribute_methods.rb#L400C9-L402C12

* `@generated_attribute_methods`がnilまたはfalseであれば無名のモジュールを返す

### `=||`とは

https://qiita.com/masatom86650860/items/424c45935529e965be84

### tap 途中結果を表示させるためのメソッド レシーバの内容を返してくる
```rb
irb(main):001> (1..10)                  .tap {|x| puts "original: #{x}" }
irb(main):002>   .to_a                  .tap {|x| puts "array:    #{x}" }
irb(main):003>   .select {|x| x.even? } .tap {|x| puts "evens:    #{x}" }
irb(main):004>   .map {|x| x*x }        .tap {|x| puts "squares:  #{x}" }
original: 1..10
array:    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
evens:    [2, 4, 6, 8, 10]
squares:  [4, 16, 36, 64, 100]
=> [4, 16, 36, 64, 100]
```
### `@generated_attribute_methods`がnilかfalseならばModule.newが生成されるし、生成したモジュールもインクルードされる
```rb
        def generated_attribute_methods
          @generated_attribute_methods ||= Module.new.tap { |mod| include mod }
        end
```
https://qiita.com/masatom86650860/items/79b144cdf660e58abfad

### Mduleクラスのnew

https://qiita.com/masatom86650860/items/938f110d83737219286b
apacheでmod_rewriteで一時的に変数使いたくてハマったお話

# 結論
mod_rewriteで設定した環境変数にmod_rewriteでアクセスする場合、変数名の最初に'REDIRECT_'がつく

# 背景
laravelで動いているサービスでメンテナンスモードを追加したい。
laravelにメンテナンスモードの仕組みはあるけど、特定のapiだけはメンテナンスモード中でも使いたいとか、特定のIPからはメンテナンス中でも使えるようにしたいけど、URLにシークレットコードつけたりは難しいなどがあり、.htaccessをゴニョゴニョすることで対応しようとした。

# 条件
* /api/aaa はメンテナンス中でも使いたい
* それ以外のapiは403を返す
* api以外のアクセスはccc.htmlを表示
* favicon.icoは表示
* ほんとはもうちょっと条件あったけど、例として簡単にした

# とりあえすこんな感じで書いてみた

```
<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # aaa以外のapiは403　・・・ ①
    RewriteCond %{REQUEST_URI} /api
    RewriteCond %{REQUEST_URI} !/api/aaa
    RewriteRule ^.*$ - [F,L]

    # API以外のアクセスはccc.htmlを表示　・・・　②
    RewriteCond %{REQUEST_URI} !/(api|favicon.ico|ccc.html)
    RewriteRule ^.*$ /ccc.html [L]

    ・・・
    
    # Send Requests To Front Controller...　・・・　③
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>
```
結果、/api/aaa以外のapiは403になったし、api以外はccc.htmlが表示された
しかし、/api/aaaにアクセスするとccc.htmlが返ってきた

③で/api/aaa が index.phpにrewriteされた後、また上から評価されて、②でapi以外なのでccc.htmlにrewriteされてしまった

②でindex.phpを対象外にすれば良さそうだけど、index.phpにアクセスされた場合に素通りしてしまう
rewriteする前のURLを判定できればなんとかなりそうだということで・・・

# 一時的に変数に元のURLを保持してみた
RewriteRule時のフラグのE or ENVでapacehの環境変数に値を設定できるらしい
RewriteCondでは%{ENV:・・・}でapacheの環境変数を使用できるらしい
ということで、③でindex.phpにrewrite時に元のURLを環境変数に設定しておいて、再評価時に②で/api/aaaからrewriteされたアクセスは除外すればいけそうかなとこんな感じで試してみた。

```
<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # aaa以外のapiは403　・・・ ①
    RewriteCond %{REQUEST_URI} /api
    RewriteCond %{REQUEST_URI} !/api/aaa
    RewriteRule ^.*$ - [F,L]

    # API以外のアクセスはccc.htmlを表示　・・・　②
    RewriteCond %{REQUEST_URI} !/(api|favicon.ico|ccc.html)
    RewriteCond %{ENV:ORG_URI} !/api/aaa
    RewriteRule ^.*$ /ccc.html [L]

    ・・・
    
    # Send Requests To Front Controller...　・・・　③
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [E:ORG_URI=%{REQUEST_URI},L]
</IfModule>
```

結果、/api/aaaにアクセスするとccc.htmlが帰ってきてしまう・・・
ログを出してみて確認すると、確かに③で環境変数ORG_URIに/api/aaaを入れているようだが、再評価時の②のORG_URIは空になっている？？

# 結局・・・
調べてみると、どうやらmod_rewriteのEフラグで環境変数に設定したものは、mod_rewriteの変数ENV:で取得する場合は、頭に「REDIRECT_」がつくらしい！！

ということで、
```
<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # aaa以外のapiは403　・・・ ①
    RewriteCond %{REQUEST_URI} /api
    RewriteCond %{REQUEST_URI} !/api/aaa
    RewriteRule ^.*$ - [F,L]

    # API以外のアクセスはccc.htmlを表示　・・・　②
    RewriteCond %{REQUEST_URI} !/(api|favicon.ico|ccc.html)
    RewriteCond %{ENV:REDIRECT_ORG_URI} !/api/aaa
    RewriteRule ^.*$ /ccc.html [L]

    ・・・
    
    # Send Requests To Front Controller...　・・・　③
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [E:ORG_URI=%{REQUEST_URI},L]
</IfModule>
```

これで、/api/aaaは使えるようになった

# 参考サイト
https://httpd.apache.org/docs/2.4/rewrite/advanced.html#setenvvars
Moduleクラス

>new {|mod| ... } -> Module
>`名前の付いていないモジュールを新しく生成`して返します。
>
>ブロックが与えられると生成したモジュールをブロックに渡し、モジュールのコンテキストでブロックを実行します。

例
```rb
mod = Module.new
mod.module_eval {|m|
  # ...
}
mod
mod = Module.new
mod.module_eval {|m|
  # ...
}
mod
```
>と同じです。ブロックの実行は Module#initialize が行います。

>ブロックを与えた場合も生成したモジュールを返します。

>このメソッドで生成されたモジュールは、`最初に名前が必要になったときに名前が決定`します。モジュールの名前は、そのモジュールが代入されている定数名のいずれかです。

例
```rb
m = Module.new
p m               # => #<Module 0lx40198a54>
p m.name          # => nil   # まだ名前は未定
Foo = m
# m.name          # ここで m.name を呼べば m の名前は "Foo" に確定する
Bar = m
m.name            # "Foo" か "Bar" のどちらかに決まる
```
https://docs.ruby-lang.org/ja/latest/class/Module.html#S_NEW:~:text=new%20%2D%3E%20Module,%E3%81%8B%E3%81%AB%E6%B1%BA%E3%81%BE%E3%82%8B

```rb
irb(main):007> a = Module.new
=> #<Module:0x0000000112eb9ac0>
irb(main):008> p a.name
nil
=> nil
irb(main):009> Foo = a
=> Foo
irb(main):010> Boo = a
=> Foo
irb(main):011> a.name
=> "Foo"
```
【Unity】 error CS0246の治し方

# はじめに
この記事は[Hamster Output Advent Calendar 2024](https://qiita.com/advent-calendar/2024/game_hamster)の18日目の記事です！

ビルドしようとした時にとあるエラーが出てきました。今回はこのerror CS0246の治し方を記事にしたいと思います。

:::note alert
error CS0246: The type or namespace name 'MenuItem' could not be found (are you missing a using directive or an assembly reference?)
:::

# エラー原因を探る
まずは、出てるエラーの箇所を見て見ます...今回のエラーの場所はCreateScriptTemplate.csの26,10行目で起こっている見たいですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588406/86e4c287-120e-197b-4f40-b3942e4d4ee0.png)

このCreateScriptTemplate.csは自分が少し前に作ったテンプレートを元にスクリプトを作るエディタ拡張です。今回のエラー内容からこのエディタ拡張をしているクラスに問題があるらしく、ネットで調べると同じ用な状態になっている人を見つけました。

https://teratail.com/questions/330085

> namespaceがUnityEditorのものはビルドに含められないのでそのエラーが出ます。

回答から、UnityEdiotr関連の内容はビルドに含むことができないエラーだということが分かりました！

# 解決方法

ありがたいことに、先ほどの記事に解決方法が書いてありました。

> 1.スクリプトの場合UnityEditorの部分を #if UNITY_EDITOR ～ #endif で囲う
2.Editorフォルダーを作り、その中にエディタ拡張を入れる

この2つのどれかで解決する見たいです。

また、Assemblyを切り分けている場合はプラットフォームをEditorのみを選択する必要もあるみたいです。
ワークライフバランスは崩壊する～ワークライフ・ソーシャルバランスのすすめ

# ワークライフバランスは崩壊する（している）

"ワークライフバランス"という言葉が世に出てしばらくたちます。我々ストレスが多い業種であるエンジニアにとっては、お勤めの会社でさんざん叫ばれているワードではないでしょうか。
ワークライフバランス定義は、以下のようなものだそうです。

> 内閣府が2007年に策定した「仕事と生活の調和（ワーク・ライフ・バランス）憲章」では、ワーク・ライフ・バランスが実現した社会を次のように定義しています
(1)就労による経済的自立が可能な社会
(2)健康で豊かな生活のための時間が確保できる社会
(3)多様な働き方・生き方が選択できる社会

そもそも税金や社会保険料が今よりだいぶ安い2007年の定義なので、（１）は満たしておらず、生活のための残業も横行しているので（２）も満たしていません。リモートワークの普及な
どで（３）はセーフかと思いきや、近年はオフィス回帰も叫ばれています。つまり、定義上、想定されていた"ワークライフバランス"という意味では崩壊しつつあると言えるでしょう。
また、文字通り『仕事と私生活のバランス』と考えても、そもそも無理があります。仕事はきついもの、私生活は楽しいもの、という前提で会話が進んでいると思いますが、そもそも私生活もつらい時期はあります。

## シミュレーション
例えば以下のような人がいると仮定します。
>私生活では、1年間で夫婦喧嘩を2週間に1回はする人がいます。また、けがや病気で、1年のうち連続で5日間体調がよくない日がランダムで2期間あります。
仕事では平日（月～金）勤務ですが、仕事で失敗することも多々あり、週に1回は怒られています。

この人が、<b>私生活で嫌なことがある日と、仕事で嫌なことがある日が重なってしまう確率を考えます。</b>
```python
import random

# 日付の範囲を設定
year_days = 365

# 喧嘩の頻度（2週間に1回）
argument_days = [i for i in range(year_days) if i % 14 == 0]

# 体調が悪い期間（ランダムな連続5日間が2期間）
bad_health_periods = [
    range(random.randint(0, year_days - 5), random.randint(0, year_days - 5) + 5),
    range(random.randint(0, year_days - 5), random.randint(0, year_days - 5) + 5)
]
bad_health_days = set(day for period in bad_health_periods for day in period)

# 喧嘩の日と病気の日を統合（BadDayとする）
bad_days = set(argument_days) | bad_health_days

# 仕事の平日（月〜金）設定と怒られる日の設定
work_days = [i for i in range(year_days) if i % 7 in [0, 1, 2, 3, 4]]
scolding_days = random.sample(work_days, year_days // 7)

# BadDayと仕事で怒られる日が重なる日を見つける
common_days = bad_days & set(scolding_days)

# 確率を計算
probability = len(common_days) / year_days

# 結果を表示
print("1年間でBadDayと仕事で怒られる日が重なる日数: ", len(common_days))
print("重なる日付: ", sorted(common_days))
print("BadDayと仕事で怒られる日が重なる確率: {:.2%}".format(probability))
```

100回ほど実行させると、平均はだいたい5.5%となり、<b>年に20日近く仕事と私生活で嫌なことが重なる日</b>があるということになります。ブラックな会社やミッションクリティカルなシステムを運用している会社であれば怒られる頻度は増えるでしょう。また、加えて配偶者の病気だったり、子供がいる人は子供の病気だったり、受験などのイベントだったり、実際には仕事と私生活で嫌なことが重なる日はさらに増えることでしょう。

# ワークライフソーシャルバランスとは
シミュレーションの通り、年に15日－20日に1度は私生活と仕事で悪いことが起きます。そこで、ワークライフソーシャルバランスとは、ワーク・ライフのポートフォリオにソーシャル（社会事）も加えましょう、という考え方です。ソーシャルとは、<b>社会活動、社会との繋がり、貢献のこと。地域活動への参加、ボランティア活動、NPO活動、社会貢献活動などが含まれます。</b>

## エンジニアのコミュニティに参加してみましょう
とはいえ、仕事で疲弊しているとなかなかボランティアやNPO活動に参加するのは忙しいと思います。ただし、エンジニアは色々なコミュニティ活動があり、コミュニティに参加するというある種の裏技があります。メリットとしては以下の通りです。
- 仕事の延長で参加: これは会社によりますが、仕事という理由付けで参加できることがあります
- 同業者との繋がり: 同じ技術分野に関心を持つエンジニアと繋がり、人脈を広げることができます
- 情報交換と相互支援: 困ったときに相談できる相手や、情報交換ができる仲間を見つけることができます
- キャリアチャンスの拡大: （いやらしい話ですが）コミュニティでの繋がりが、転職などのキャリアチャンスにつながることがあります

## GoogleCloud ユーザー会(Jagu’e’r）はいかが？
私は会社でGoogleCloudを担当しているので、GoogleCloud ユーザー会(Jagu’e’r）によく参加・運営しています。コロナも終わりアフター付きのMeet upも増えてきて、参加者が主体的にかかわれる場面も増えてきています。1つの選択肢として、GoogleCloudをお使いの方は参加をご検討ください！
https://jaguer.jp/
tap

### tap 途中結果を表示させるためのメソッド
>tap {|x| ... } -> self
self を引数としてブロックを評価し、self を返します。
>
>`メソッドチェインの途中で直ちに操作結果を表示するためにメソッドチェインに "入り込む" こと`が、このメソッドの主目的です。

https://docs.ruby-lang.org/ja/latest/method/Object/i/tap.html#:~:text=tap%20%7B%7Cx%7C%20...%20%7D%20%2D%3E%20self,%E4%B8%BB%E7%9B%AE%E7%9A%84%E3%81%A7%E3%81%99%E3%80%82

```rb
irb(main):001> (1..10)                  .tap {|x| puts "original: #{x}" }
irb(main):002>   .to_a                  .tap {|x| puts "array:    #{x}" }
irb(main):003>   .select {|x| x.even? } .tap {|x| puts "evens:    #{x}" }
irb(main):004>   .map {|x| x*x }        .tap {|x| puts "squares:  #{x}" }
original: 1..10
array:    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
evens:    [2, 4, 6, 8, 10]
squares:  [4, 16, 36, 64, 100]
=> [4, 16, 36, 64, 100]
```
tokioランタイム上の同期コールバック内で非同期処理を行う方法

# tokioランタイム上の同期コールバック内で非同期処理を行う方法

## はじめに
Rustで非同期プログラミングを行う際、tokioは非常に強力なツールです。しかし、既存のライブラリとの統合時に、同期的なコールバック関数の中で非同期処理を行いたいという状況に遭遇することがあります。この記事では、そのような状況での問題と解決方法を紹介します。

## 問題の背景
- 同期的なコールバックしか受け付けないライブラリに対して関数を登録する必要がある
- コールバック内でHTTPリクエストなどの非同期処理を行いたい
- `reqwest::blocking`は非同期コンテキスト内では使用できない（パニックする）

## なぜ難しいのか
1. 非同期ランタイム上で同期的なブロッキング処理を行うとデッドロックのリスクがある
2. 単純な`blocking_recv()`の使用はデッドロックを引き起こす可能性が高い
3. ランタイムの設定（スレッド数など）によって挙動が変わる

## 解決方法
以下の3つのtokioの機能を組み合わせることで問題を解決できます：

1. `tokio::spawn`: 非同期処理を別タスクで実行
2. `tokio::sync::oneshot`: タスク間でのデータの受け渡し
3. `tokio::task::block_in_place`: 安全なブロッキング処理の実現

```rust
use std::error::Error;
use tokio::sync::oneshot;
use tokio::task::block_in_place;

// ライブラリが提供する型やトレイトを模倣
trait DataProcessor {
    fn process(&self, data: &str) -> String;
}

struct Handler {
    processor: Box<dyn DataProcessor>,
}

impl Handler {
    fn new<P: DataProcessor + 'static>(processor: P) -> Self {
        Self {
            processor: Box::new(processor),
        }
    }

    fn handle(&self, data: &str) -> String {
        self.processor.process(data)
    }
}

// 実際の実装
struct MyProcessor;

impl DataProcessor for MyProcessor {
    fn process(&self, data: &str) -> String {
        // この中で非同期処理（HTTP リクエストなど）を行いたい
        // しかし、これは同期的なコンテキスト
        
        // 非同期処理の結果を受け取るためのチャネルを作成
        let (tx, rx) = oneshot::channel();
        
        // 新しいタスクで非同期処理を実行
        tokio::spawn(async move {
            // 実際のコードでは reqwest::Client を使用してリクエストを行う
            // この例では非同期処理をシミュレート
            tokio::time::sleep(std::time::Duration::from_millis(100)).await;
            let result = format!("Processed: {}", data);
            let _ = tx.send(result);
        });

        // ブロッキング処理を明示的に行う
        // これにより、tokio のワーカースレッドがブロックされることを防ぐ
        block_in_place(move || {
            rx.blocking_recv().unwrap_or_else(|_| "Error".to_string())
        })
    }
}

#[tokio::main(worker_threads = 2)]
async fn main() -> Result<(), Box<dyn Error>> {
    let processor = MyProcessor;
    let handler = Handler::new(processor);
    
    // 同期的なコンテキストで呼び出し
    let result = handler.handle("test data");
    println!("Result: {}", result);
    
    Ok(())
}
```

## 実装時の注意点
- `current_thread`ランタイムでは動作しない（パニックする）
- ワーカースレッド数は2以上必要
- `block_in_place`を使用することで、明示的にブロッキングポイントを示す

## まとめ
この方法を使うことで、以下のメリットがあります：
- 既存の同期APIと非同期処理の統合が可能
- デッドロックを防ぎつつ、非同期処理の結果を同期的に取得できる
- エラーケースが明確になる（`current_thread`でのパニック）
ControlDeskでUI用ウィンドウを出して変数をリンク

## 1. はじめに
dSPACe ControlDeskではInstumentとPythonを組み合わせれば大抵の計測をこなすことができます．しかしグラフィカルに動作するオリジナルのUIを作成することはできません．
今回はPythonのライブラリTkinterを利用して別のウィンドウにUIを実装する手法を説明します．

## 2. 準備
[dSPACE用のPythonにライブラリをインストールする手法](https://qiita.com/3084LAB/items/e5b54b979cc62e4f9c11)を参考に以下のライブラリをインストールしてください．
- Tkinter

<!-- numpy
- ctypes
- matplotlib
-->

## 3. 記述
ひとまず新しい画面をポップする方法を記載しておきます．
これをControlDeskのRun Scriptから実行するとウィンドウが出現します．
このままだとメインのControlDeskがフリーズしてしまうのでスレッドを使用する必要がでてきます．

※後ほど1つの変数をリンクと原点周りに動かくバーを設置します．（エンコーダに連動したアーム）
```python
# libraries
import tkinter as tk

# Get Tkinter object.
window = tk.Tk()

# Set window title.
window.title("My first Tkinter")

# Set window size
# window.geometry(f"{width}x{height}+{xPos}+{yPos}")
window.geometry("640x480+200+200")

#---- Widgets ----
# Button
btn = tk.Button(window, text="OK")

# Text
label = tk.Label(root, text='HOGE')

# Place widgets on the window
btn.pack()
label.pack()

# ウィンドウのループ処理
window.mainloop()
```


## 4. 実行結果
後ほどスクショします．
【力技】Vue.js開発中に強制リロードする



Vueで下記のようなAPI通信をしていたときに詰まったので、メモします。

API通信でPOSTリクエストの処理後に一覧表示をさせるのですが、タイマーなどを使っている事情で、データ取得後に一度画面をリロードする必要がありました。

方法として下記の記事のようにVueRouterを使用する方法があったのですが、仕様の変更によりうまく動かなくなっているようです。


そこで、かなり力技ですが素のjsで実装したところ、とても簡潔に解決しました（全部Vueでやらなきゃと視野が狭まっていましたね）




    
    
    submit() {
      let data = {
            //省略
      };

      axios.post('/api/store',data)
        .catch(error => {
          alert(error);
        })
        //下記の一文を終わらせたい処理の下に追加する
        window.location.reload();
      },



  これで無事、API通信後に画面がリロードされるようになりました！！
  SPAのプロジェクトを前提としているので画面遷移は、対象外ですが、うまく組み合わせれば、場面遷移とリロードもできそうですね。

【追記：リンクを追加する方法】
下記のような記載で好きなURLへ飛ばせました。
    submit() {
      let data = {
            //省略
      };

      axios.post('/api/store',data)
        .catch(error => {
          alert(error);
        })
        //飛ばしたいリンクを指定する
              window.location.href = '/';
      },
Bluepill クローンで JTAG/SMD ピンを GPIO に変更した時のトラブル回避

きわめてレアなトラブルだとは思いますが、解決したので記録しておきます。

# ピン機能の変更
![PXL_20241225_085616277.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3962189/28386688-097f-3940-c229-ae007d6ce0a0.jpeg)

Bluepill に載っているマイコン STM32F103 では、フラッシュメモリの書き込みやデバッグに使う JTAG/SMD ピンを、下記のコードで GPIO(PA13, PA14) に変更できます (RM0008 リファレンスマニュアル 8.3.5 「JTAG/SWD オルタネート機能の再配置」参照)。

````C:main.c
RCC->APB2ENR |= (1 << 0); // AF クロック有効化
AFIO->MAPR=0x04000000| (AFIO->MAPR & 0x00ffffff); // SW 無効化
````

# 発生したトラブルと回避方法
PA13, PA14 を両方出力ピンにして、そこに DMA を使ってパルスを出力すると、<FONT COLOR="RED">突然リセットがかかるという異常な動作が起こりました</FONT>。本来は発生しないはずですが、STM32F103 がクローン品だと発生する現象のようです。

あらかじめ RM0008 リファレンスマニュアル 30.3.1 「JTAG-DP または SW-DP の選択メカニズム」に沿って、モードを JTAG から SW-DP に切り替えておくことで、この問題を回避して、PA13, PA14 を両方出力ピンにできました。

STM32CubeMX で PA13 と PA14 を出力ポートに設定し、MX_GPIO_Init() が呼ばれた後に、下記のコードを挿入すれば OK です。

````C:main.c
RCC->APB2ENR |= (1 << 0); // AF クロック有効化
AFIO->MAPR=0x04000000| (AFIO->MAPR & 0x00ffffff); // SW 無効化
// SWDIO:PA13, SWCLK:PA14
#define SWDIO_H do { GPIOA->BSRR = (1<<(13+0)); } while(0)
#define SWDIO_L do { GPIOA->BSRR = (1<<(13+16)); } while(0)
#define SWCLK_H do { GPIOA->BSRR = (1<<(14+0)); } while(0)
#define SWCLK_L do { GPIOA->BSRR = (1<<(14+16)); } while(0)
int i;
SWDIO_H;
for (i=0; i<60; i++) {SWCLK_H; SWCLK_L;}
// SWCLK のアップエッジで 0111 1001 1110 0111 を出力
SWDIO_L; SWCLK_H; SWCLK_L; // 0
SWDIO_H; SWCLK_H; SWCLK_L; // 1
SWDIO_H; SWCLK_H; SWCLK_L; // 1
SWDIO_H; SWCLK_H; SWCLK_L; // 1
SWDIO_H; SWCLK_H; SWCLK_L; // 1
SWDIO_L; SWCLK_H; SWCLK_L; // 0
SWDIO_L; SWCLK_H; SWCLK_L; // 0
SWDIO_H; SWCLK_H; SWCLK_L; // 1
SWDIO_H; SWCLK_H; SWCLK_L; // 1
SWDIO_H; SWCLK_H; SWCLK_L; // 1
SWDIO_H; SWCLK_H; SWCLK_L; // 1
SWDIO_L; SWCLK_H; SWCLK_L; // 0
SWDIO_L; SWCLK_H; SWCLK_L; // 0
SWDIO_H; SWCLK_H; SWCLK_L; // 1
SWDIO_H; SWCLK_H; SWCLK_L; // 1
SWDIO_H; SWCLK_H; SWCLK_L; // 1
SWDIO_H;
for (i=0; i<60; i++) {SWCLK_H; SWCLK_L;}
````

<!--
<div class="meta_for_parser tablespecs" style="visibility:hidden">
Pin Function Change
On the STM32F103 microcontroller used in Bluepill, the JTAG/SMD pin normally used for writing and debugging flash memory can be changed to GPIO with the following code (see RM0008 Reference Manual 8.3.5 “Relocation of JTAG/SWD Alternate Function” RM0008 Reference Manual 8.3.5 “Relocation of JTAG/SWD Alternate Functions”).

Troubles and workaround
When both PA13 and PA14 are output pins and many pulses are output to them using DMA, abnormal behavior such as sudden reset occurred.

Switching from JTAG to SW-DP according to RM0008 Reference Manual 30.3.1 “Selection Mechanism for JTAG-DP or SW-DP” before outputting signals avoided this problem and both PA13 and PA14 could be output pins.

After executing MX_GPIO_Init() and being able to output to PA13 and PA14, execute the following code.
</div>
-->
Elastic Cacheのハンズオンやってみた

タイトルの通り、下記のハンズオンやってみました!
https://aws.amazon.com/jp/getting-started/hands-on/boosting-mysql-database-performance-with-amazon-elasticache-for-redis/

英語でのみしかハンズオンがない＋英語読解に時間をかけたくなかったので下記を参考にしながらEC2/VPC/SG/RDS/Redis立ち上げていきました。基本的に記事を参考にして行ったので、Redisについて/詰まった箇所をまとめます。
https://zenn.dev/rescuenow/articles/41ad9d369a74ca

構成図は下記のとおりです（拝借させていただきます🙇‍♀️）
![スクリーンショット 2024-12-25 18.16.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/748934/10ae4e2e-b19c-de2a-da4d-5f86a1db890f.png)

## RedisとMemcachedについて（ついでなので比較して覚えるためにMemも..)
| 特徴           | Redis                                    | Memcached                     |
|----------------|------------------------------------------|-------------------------------|
| データ構造     | 複数（リスト、セット、ハッシュなど）   | シンプルなキーバリューのみ   |
| 永続性         | あり（データの永続化が可能）            | なし（メモリ上のみ）         |
| スケーラビリティ| シャーディング、クラスタリング機能      | マルチスレッドでスケールアップ |
| パフォーマンス  | 多機能だが高速                          | シンプルで非常に高速         |
| データサイズ   | キー：最大512MB、バリュー：最大512MB   | キー：最大250B、バリュー：最大1MB |
| 用途           | 複雑なデータ処理、永続化が必要な場合   | シンプルで高速なキャッシュ専用 |
| 複雑性         | より複雑で機能豊富                      | シンプルで使いやすい         |
| メモリ効率     | データ構造により異なる                  | 非常に効率的                 |


## 学んだこと
1.redis暗号化について
redisのエンドポイントにpingをして疎通確認をしたがエラーが返ってきた。
暗号化したプロトコルにできてなかった。（rediss://）
またRedisの設定は固定で暗号化される
（暗号化してないプロトコル：redis://）

2.TTL
Time To Liveの略で、データやパケットが破棄されるまでの時間や、処理の繰り返し回数の上限を意味する
TTL = 10とすると、１０秒間キャッシュは保持され、その後削除される

3.Redisのためのコード書く
下記のソースコードが必要らしい、てっきり自動でやってくれると思ってました。
```
 1)Redisにデータがキャッシュされているか
 2)キャッシュがある場合はRedisから取得
 3)キャッシュがない場合はDBから取得しRedisに保存
```

4.Redisのキーについて
Redisでは
```key = f"planet:{id}"```
のようにコロンで区切るらしい
https://qiita.com/morrr/items/271548776938e7ddc0ec#%E3%82%AD%E3%83%BC%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6
[RxSwift]詰み① アプリキル直前にデータを保存したい

RxSwift初心者です。完全自分用の学習備忘録として残します。

開発中、RxSwiftで以下の実装方法に詰まりました。

1. ユーザーが誤ってデータをDBへ保存せずに、アプリをキルしようとする
2. アプリがバックグラウンドに移行した際にローカルにデータを保存 
3. アプリがキルされ、再度、アプリを起動する
4. ローカルに保存されたデータの有無を確認
5. データがある場合、「前回保存されていないデータがあります。データを保存しますか？」という文言で`UIAlert`を表示
6. 保存ボタンを押下し、データを保存する非同期処理を実行
7. 非同期処理中、仮にエラーが発生するとする
8. 画面上に「エラー　データの保存に失敗しました。保存しますか？」というエラー`UIAlert`を表示
9. `6, 7, 8` を繰り返す

この記事では、`1 〜 2` を扱い、`3 〜 9`は別の記事**「[RxSwift]詰み② UIAlertを活用してデータ保存の失敗時に繰り返しリトライさせたい」**で扱います。

### 1. ユーザーが誤ってデータをDBへ保存せずに、アプリをキルしようとする

うっかりデータを保存し忘れてアプリを終了させてしまうユーザーもいると思います。開発者は対策を考える必要があります。

### 2. アプリがバックグラウンドに移行した際にローカルにデータを保存

結論から言うと、`Realm`を使用してローカルにデータを保存させています。

特定のViewControllerに以下の処理を実装して、アプリがバックグラウンドに移行したことを検知し、その時点でのユーザーの勉強時間等を`Realm`に保存するようにしています。

```swift

    // バックグラウンド移行時
     NotificationCenter.default.addObserver(
            self,
            selector: #selector(self.didEnterBackground),
            name: UIApplication.didEnterBackgroundNotification,
            object: nil
    )
        
    // バックグラウンドへの移行時の処理
    @objc func didEnterBackground() {
        // アプリをキル（完全終了）した場合でもローカルに勉強記録等を保存しておく
        viewModel.saveStudyProgress(shouldSaveLocallyOnKill: true)
    }
```

- **少し苦戦した話**

はじめは、`Realm`ではなく、直接`Firebase`に保存する処理を実装していましたが、以下のフローを行うと`Firestore`へデータが正常に更新されない時がありました。

1. アプリをフォアグラウンド状態にする（普通にアプリの画面を表示させている状態）

2. `app switcher`にアプリ画面を表示する（以下のような状態です）
    （この時点ではまだ`@objc func didEnterBackground()`は呼ばれません。）
    
3. 2の状態からアプリをキル（アプリ画面を上にスワイプさせて完全終了させた状態）させる
4. ここで初めて`@objc func didEnterBackground()` に処理が入り、`Firestore`へのデータ保存処理を実行
5. `Firebase console`で`Firestore`を確認するも、データが正常に更新されない
    ・ とあるフィールドは正常に更新されていて、とあるフィールドが更新されなかったり…
    ・ 時には、全てのデータが正常に更新されていたり… 逆も然り…
    
アプリがキルされる”直前”に`@objc func didEnterBackground()` が呼ばれている → すなわち、言い換えれば、`app switcher`からであれば、キルされないと`@objc func didEnterBackground()` が呼ばれないということか…

そして、データが正常に更新されない理由は、おそらく非同期処理中にアプリがキル（完全に終了）されたためだと思います。

`app switcher` に移行した時点で`@objc func didEnterBackground()` が呼ばれると思っていたのですが、違ったようです。勉強になりました。

以上の問題から、`Realm`を使用して、一旦ローカルにデータを保存しておくと言う方針にしました。
今年学んだ3つのこと

# はじめに
大学3年目の一年間で、多くの経験を積み、多くの学びを得ました。その中で特に大切だと感じた三つのことを振り返ります。

# 1. 行動が不安を克服する力になる
今年は、大学1・2年に比べて、未知の技術や新しい機会への挑戦が圧倒的に増えた一年でした。
ハッカソンやインターン、勉強会への登壇、さらにはハッカソンの運営にも関わる中で、最初は「右も左も分からない」「不安でしかない」と感じる場面が数多くありました。

しかし、「調べて」「人へ相談して」「挑戦して」「失敗する」ことを繰り返す中で、少しずつ自信がつきました。特に「不安だから行動しない」のではなく、「行動することで不安が消え、自分の力になる」ということが身に染みました。

今では、同じ挑戦をもう一度求められたとしても、大抵のことは乗り越えられる自信があります。この「行動する事」が、どれだけ重要かがとても実感できた一年となりました。

# 2. チーム開発での方向性を揃える難しさとその大切さ
今年経験したチーム開発では、設計や方向性を揃えることの重要性を痛感しました。特にハッカソンのような短期間で成果を出す場面では、ゴールが明確でないまま進めてしまうと、各メンバーの作業がバラバラになり、成果物の見直しに大きなコストがかかることを経験しました。

コードを書く以前に、設計やビジョンをしっかりと共有することが、プロジェクト成功のカギだと学びました。どの機能を優先するか、命名規則をどう統一するか、役割分担をどうするかなど、事前に合意しておくことで、作業効率が大きく変わることを実感しました。

さらに、会議内容を文字として記録に残す重要性も感じました。実際に、前回の会議内容が曖昧なままで再度議論するという無駄な時間を過ごすことがあり、このような経験を通じて、「情報を残すこと」がチーム全体の生産性を高めると理解しました。

「コードを書く以前の準備がプロジェクトの成否を分ける」という教訓は、来年以降も忘れずに活かしていきたいと思います。

# 3. 一年あれば大きく変われる
1月の自分を振り返ると、APIやバックエンド、XR開発のことはほとんど知らない状態でした。それが、この一年でWeb開発の基礎からXR開発、GoやNextといった新たな技術スタックの取得、インターンでの実務経験にまでスキルを広げることができました。

「興味はあるけれど始められない」と思っていたことも、実際にやってみると想像以上に楽しく、新しい可能性が見えてきました。来年もこの経験を活かして、もっと積極的に挑戦していきたいと思います。

# 今後(来年)の展望
今年を振り返り、たくさんの経験を積むことができました。これらの経験を活かし、来年以降も積極的に挑戦し続けたいと考えています。

大学4年目を迎える来年は、さらに広い範囲で自分の技術を高めていきたいです。現在進行中の共同開発プロジェクトのローンチや、AWSを始めとするインフラ技術の習得、XR分野での研究に加え、セキュリティやCGといった新しい領域にも挑戦したいと考えています。

特に、学生の時間が限られている中で、できるだけ多くのことに挑戦し、実践的なスキルを積んでいくことが大切だと思っています。来年も学びの姿勢を持ちながら、一歩ずつ着実に成長していきたいです。
Microsoft Dataverse でリレーションシップの設定をした際、Power Automate で行のフィルターをする方法


こちらの記事にありますが (ありがとうございます！)、久しぶりにやるとはまったので備忘のために自分でも記事書いておきます。恐らく Dataverse が浸透すればはまる人が結構出てくる気がするので、、、

https://qiita.com/skuramoto/items/11f1111a8eba7673714c#%E8%A1%8C%E3%81%AE%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC

今回は、こんな感じで、リレーションシップの設定がされているとします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/55332709-1e1b-e409-97c2-bdad28860449.png)

この際、例えば、Power Automate で、あるトレーニングに対して申し込んだユーザーの一覧をフィルターして取得したいとします。

トレーニングリクエスト側ではこのようにトレーニングテーブルとリレーションシップの設定をしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/10c31186-ecb8-f072-2618-53801a7d5179.png)

この際、トレーニングリクエストのテーブルからあるトレーニングの申し込みしている一覧を取得したいとします。

とりあえず思いつくこととしては、こんな感じで、`列名 (論理名) eq トレーニングテーブルの一意識別子`と書くのかなと思いました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/b322abf0-ee4c-801c-1ba5-52272e5fc6c7.png)

:::note

シングルテーブルの場合は、そのテーブルの一意識別子列の論理名を使って以下のような感じで書くので。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/7cd4edf0-c00b-b16a-8429-9742d9967db1.png)

:::

しかし、こちらだとエラーになります。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/839215ff-0c07-763a-82fd-6951de58450d.png)

最終的には、以下のようにすると上手く動作します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/06121728-df9f-b3eb-d244-df3de4ff2551.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/63895315-ae4f-de3b-a69a-0fb49df61204.png)

書き方としては、トレーニングリクエスト側のテーブルに存在する、トレーニング列の論理名 (cr596_training) を `_cr596_training_value`のように書き換えます。これは情報ないと間違いなくはまると思います。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/21a3dd43-d959-a6b7-b74e-f604b7c11964.png)
YouTube の URL から埋め込み用の HTML を作成する方法

# はじめに
本記事では、YouTube の URL を解析して動画を埋め込む HTML を生成する JavaScript の関数を解説します。

このコードは、さまざまな形式の YouTube の URL に対応しています。

# 実装

コードには以下の 2 つの関数が含まれています。

1. `escapeHTML(str)`  
   特殊文字をエスケープして安全な HTML を生成するための補助関数。
2. `renderYouTube(url)`  
   YouTube の URL を解析し、埋め込み用の HTML を生成するメインの関数。


## 1. `escapeHTML(str)`

この関数は、HTML で使われる特殊文字（`&`, `<`, `>`）をエスケープして、HTML インジェクションなどのセキュリティリスクを回避します。

```javascript
function escapeHTML(str) {
    return str.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
}
```

## 2. `renderYouTube(url)`

この関数は、YouTube の URL を解析して動画 ID を抽出し、埋め込み用の HTML を生成します。

```javascript
function renderYouTube(url) {
    let videoId = null;
    if (url.startsWith('https://www.youtube.com/watch?v=')) {
        videoId = url.split('&')[0].split('/watch?v=')[1];
    } else if (url.startsWith('https://youtu.be/')) {
        videoId = url.slice(17).split('?')[0];
    } else if (url.startsWith('https://www.youtube.com/shorts/') && url.length > 32) {
        videoId = url.slice(31).split('?')[0];
    } else if (url.startsWith('https://m.youtube.com/shorts/') && url.length > 31) {
        videoId = url.slice(29).split('?')[0];
    }
    if (videoId && videoId.length < 15) {
        return `<div style="width: 100%; height: 100%; aspect-ratio: 560 / 315;"><iframe width="100%" height="100%" src="https://www.youtube.com/embed/${escapeHTML(videoId)}" frameborder="0" allowfullscreen></iframe></div>`;
    }
    return '';
}
```

**処理の流れ**

1. **動画 ID の抽出**:  
   URL の形式に応じて、`videoId` を抽出します。
   - **通常の再生ページ**:  
     例: `https://www.youtube.com/watch?v=jNQXAC9IVRw`  
     → `videoId = "jNQXAC9IVRw"`
   - **短縮 URL**:  
     例: `https://youtu.be/jNQXAC9IVRw`  
     → `videoId = "jNQXAC9IVRw"`
   - **ショート動画（通常版）**:  
     例: `https://www.youtube.com/shorts/jNQXAC9IVRw`  
     → `videoId = "jNQXAC9IVRw"`
   - **ショート動画（モバイル版）**:  
     例: `https://m.youtube.com/shorts/jNQXAC9IVRw`  
     → `videoId = "jNQXAC9IVRw"`

2. **エラーチェック**:  
   動画 ID が 15 文字未満の場合のみ埋め込み HTML を生成します（YouTube の ID の長さに基づくルール）。

3. **埋め込み HTML の生成**:  
   `iframe` タグを使って安全に動画を埋め込む HTML を生成します。
   - **`aspect-ratio`**: 16:9 の比率で動画を表示。
   - **`max-width`**: デザインのために最大幅を制限。
   - **`escapeHTML(videoId)`**: 動画 ID をエスケープ。

4. **結果を返却**:  
   有効な `videoId` がない場合、空文字列を返します。


#### 使用例:

```javascript
console.log(renderYouTube("https://www.youtube.com/watch?v=jNQXAC9IVRw"));
// 出力: <div style="width: 100%; height: 100%; aspect-ratio: 560 / 315;"><iframe width="100%" height="100%" src="https://www.youtube.com/embed/jNQXAC9IVRw" frameborder="0" allowfullscreen></iframe></div>
```
非エンジニアがおすすめ！初心者向けUdemy講座

こんにちは、ふるすです。
以前にこちらの記事を書きましたので、今日はUdemy版を書いてみます。

https://qiita.com/furusu_y/items/4f543462cf8f6da1b5e2


## 1.～始めから効率よく学ぶ～ 基本情報技術者試験 最速 合格講座
技術の勉強をせねばならん！となったタイミングで、はじめにこの講座を視聴しました。
体系的にざっくりと「技術領域」に触れられますし内容もそこまで難しくないのでおすすめです。
また確認テストや過去問つきなのもうれしいポイントです。


## 2.【CLF-C02版】これだけでOK! AWS認定クラウドプラクティショナー試験突破講座（豊富な試験問題300問付き）

社内でもAWSの勉強がかなりHOTだったのですが、私は話題に全くついていけず…。
AWSってなんぞや？というところから学べるので助かりました。
もう少し上級編に臨んで資格とりたい！

## 3.【導入編・無料】Javaプログラミング基礎入門講座（完全未経験者可/丁寧解説/豊富な図解/ハンズオン/演習問題）

こちらは無料講座ですが、有料講座もあります。
これまた「Javaってなんぞや」から学べるので、プログラミング完全未経験の方でも挫折せずに最後まで見れるかと思います。
書籍やYoutubeなどの動画もいろいろと見ましたが、一番見やすかったです。

## 4.短時間で部下のやる気を促す 「1on1ミーティングの進め方」講座
これは技術関連ではないのですが、「1on1のやり方」を学んだ機会がなかったので見てみたよ、というものです。
傾聴力や反復の重要性など1on1に限らずビジネスコミュニケーションでは必要なスキルが紹介されているので、コミュニケーションに悩みのある方は一度見てみて損はないかなと思います。


非エンジニア・過去に学習挫折経験ありの私でも最後までやりきれた講座ばかりですので、ぜひご覧になってみてください！
dSPACE ControlDeskの計測方法まとめ

## 1. はじめに
dSPACE ControlDeskの計測手法をまとめました．
よくやるMeasuringして後からバッファを保存する方法だけだと保存し忘れなどが怖いですからね．

## 2. Measuring
**(1) 変数をリンク**
保存したいセンサ値のScopeの変数をTime Plotterにアタッチします．
この方法の場合，1つのTime Plotterに保存したいものをまとめておきましょう．
後でcsvファイルをまとめる作業とかするのは面倒なので...
**(2) Start Measuring**
`Start Measuring`ボタンを押して計測を開始します．
右下のバナーが青色になります．
**(3) 計測中**
記録しておける時間の範囲はデフォルトだと1分ですので，ゆったり計測していると始め方のデータが切れることもあるので注意してください．PCのメモリが許す限りこの時間を延長すれば問題ありません．
**(4) Stop Measuring**
`Stop Measuring`ボタンを押して計測を終了します．
**(5) データ保存**
対象のTime Plotter上で右クリック．`Save displayed buffer`を選択し時間幅を選択して保存します．
データを圧縮する場合はダウンサンプリングも設定してください．
dSAPCEのバージョンの新旧によって出力されるファイルの拡張子が異なります．

## 3. Recording
レイアウトのTime Plotterに変数を連動させるとSignalとしてDefaultのRecoderに登録されます．
そのRecoder内の項目を全て保存してくれる手法です．
もちろんRecoder内の保存するか否かや新規作成も柔軟に行えます．
### (1) 即席recording
**(1) 変数をリンク**
保存したいセンサ値のScopeの変数をTime Plotterにアタッチします．
Measuringしてから保存する場合と異なり，1つのTime Plotterにまとめる必要はありません．
**(2) Start Immediate**
`Homeタブ > Start Immediate`を押してレコーディングを開始します．
右下のバナーが赤色になります．
**(3) 計測中**
Measuringと一緒
**(4) Stop Measuring**
`Stop Measuring`で計測を終了するのはMeasuringと同一です．
違うのはそのままMeasurementデータが自動的に保存される点です．

### (2) Triggered recording
Trigger Ruleを設定し，Recoderにそのルールをリンクするとトリガー駆動のレコーディングができます．
センサ値が一定値を超えた瞬間や物理的なスイッチを押した瞬間に計測をしたいときに使います．
トリガー待機中は右下のバナーが黄色になります．
具体的なRuleの設定方法は後日追記します．

## 4. おわりに
これらの計測方法はPythonスクリプトから呼び出せるので自動化もできます．
【Power Platform】システム管理者への自己昇格

# 【Power Platform】システム管理者への自己昇格

試用テナントで環境作ったグローバル管理者なのに、セキュリティロールの管理とかできないぞ...？
Default 環境のセキュリティロール『システム管理者』に誰も入ってない！どうしたらいいんだ！と詰まったので、システム管理者に昇格する方法をまとめました。

## システム管理者への自己昇格手順

1. Power Platform 管理者権限のあるユーザーで、[Power Platform の管理センター](https://admin.powerplatform.microsoft.com/home) にアクセスします。
1. 対象の **環境** を選択しチェックマークをつけます。
1. 上部のメニューバーで **メンバーシップ** を選択します。
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111975/3bd5f68c-abe0-b2a9-1047-33050479137e.png)
1. **システム管理者** の設定ダイアログで、[**＋ 自分を追加する**] を選択します。
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111975/44e1015e-87ae-8b2a-730f-474d3235ee0f.png)

# 参考サイト

https://learn.microsoft.com/ja-jp/power-platform/admin/manage-high-privileged-admin-roles#self-elevate-through-power-platform-admin-center
テクノロジー業界の面接成功の秘訣

テクノロジー業界での面接は、技術的なスキルだけでなく、問題解決能力やコミュニケーション能力も求められます。今回は、テクノロジー業界の面接を受ける際のコツを紹介します。これらのアドバイスを活用することで、面接を成功に導くことができるでしょう。

1. 事前準備が重要
面接の前に、企業の事業内容や文化を十分に調べておきましょう。会社のウェブサイトやSNSを通じて、最新のプロジェクトや技術に関する情報を得ることが大切です。特に、使用されているプログラミング言語やフレームワーク、開発環境などについての理解を深めると良いでしょう。また、企業の価値観やミッションも確認し、それに自分がどのように貢献できるかを考えることが重要です。

2. 技術的なスキルを強調
テクノロジー業界では、面接官が候補者の技術的なスキルを重視します。プログラミング言語やソフトウェア開発の経験について、自信を持って話せるように準備しましょう。特に、自分が得意とする言語やツールについて、具体的なプロジェクトや実績を交えて説明することが求められます。例えば、「Pythonを使用してデータ解析ツールを開発した経験」や「Reactを使ったWebアプリケーションの開発に携わったこと」など、実績を具体的に示すことが大切です。

3. 問題解決能力をアピール
テクノロジー業界では、問題解決能力が非常に重視されます。面接中には、特定の技術的な問題や課題に対してどのようにアプローチしたかを説明することが求められることがよくあります。その際、単に結果を話すのではなく、どのような思考プロセスで解決策を見つけたのか、どのようにチームと協力したのかを説明することが重要です。問題解決能力は、面接官にあなたの論理的思考やチームワーク能力をアピールするための絶好の機会です。

4. コミュニケーション能力を強化
テクノロジー業界では、技術的なスキルだけでなく、コミュニケーション能力も重要です。チームメンバーやクライアントと効果的に連携するためには、意見を分かりやすく伝える力が求められます。面接中には、技術的な内容をわかりやすく説明するスキルや、異なる意見を尊重する姿勢を示すことが大切です。例えば、複雑な技術的な問題を簡潔に説明する方法や、意見の違いを建設的に議論する方法について話すことができれば、あなたのコミュニケーション能力をアピールすることができます。

5. 自己PRを工夫する
面接では自己PRの時間が与えられることが多いです。自分の強みをアピールする際には、単に「私は〇〇が得意です」と言うのではなく、具体的なエピソードを交えて話すことが効果的です。例えば、「前職では〇〇の技術を使ってプロジェクトを成功させました」といった具体的な成果を話すことで、面接官に印象を与えることができます。また、今後のキャリアプランや、この企業でどのように成長していきたいかを話すことで、企業への興味や意欲を示すことも大切です。

6. 質問を準備する
面接の終わりに「質問はありますか？」と聞かれることが一般的です。この際に適切な質問をすることは、あなたの準備度や企業への関心を示す良い機会です。例えば、「この企業が今後注力していく技術やプロジェクトについて教えてください」といった質問をすることで、業界に対する関心を示すことができます。また、チームの文化や働き方について質問することも、企業の雰囲気を理解する手助けになります。

結論
テクノロジー業界の面接では、技術的なスキルや問題解決能力だけでなく、コミュニケーション能力や自己PRが重要です。事前準備をしっかり行い、自己アピールを工夫することで、面接を成功に導くことができます。自信を持って面接に臨み、企業とのマッチングを確かめることが大切です。
Find oppotunity here: https://job.skysolution.com/career/
技術哲学の視点から考えるITエンジニアの役割

はじめに
Qiitaはもともと技術的な話をする場所だと思いますが、アドベントカレンダーの最終日だからこそ、少しだけ異なる分野の話も許されるはず！ということで、今回は「技術そのもの」について考える技術哲学に関するお話を少しだけお届けしたいと思います。これが私からのクリスマスプレゼントです :santa_tone1:

技術哲学とは
そもそも技術哲学って何？という疑問から始めます。技術哲学とは、哲学の一分野で、技術的な人工物やプロセスの性質、意義、倫理的意味などを探求する学問です。哲学は世界の万物を学問の対象にしており、もちろん技術もその一部です。技術がどのように機能するかだけでなく、技術が人間社会や文化にどのような影響を与え、逆に影響を受けているのかを理解することが含まれます。技術哲学は、技術そのものの性質を理解するとともに、技術がもたらす問題や可能性に対して批判的かつ原理的な視点を提供し、技術の発展がより良い方向へ進むための指針を探ることを目的としています。

なぜ技術哲学が必要か
現代社会を自律的な個人として生きるために必要だからです。何を言っているのか分からないかもしれませんので、順を追って説明します。
私たちの生活において、技術は欠かせない存在であることは誰もが感じていることでしょう。スマートフォンなしの生活は考えられませんよね。その技術の存在に頼っているのは社会全体も同じで、仕事をする上でも、余暇を楽しむ上でも、今や技術が関わらない生活は不可能です。

不可視なままの技術
技術は現代社会にとって欠かせない存在ですが、普段の生活でその存在を意識することは少ないのではないでしょうか？ 例えば車に乗ったり、本を読んだり、スマートフォンを使ったり、病気になったら病院に行ったりすることがあるでしょう。その時、技術のことを深く考えることはあるでしょうか？（自分の分野の技術について毎秒考えること、それが職業病と言えるかもしれません！）

技術は現代社会で当たり前に存在し、私たちはその恩恵を受けながらも、普段その存在を問い直すことは少ないものです。もちろん、技術に問題が発生した時には、例えば脆弱性が発見されたり、新しい技術が社会に与える影響に懸念が生じたとき、技術は注目されます。何も問題が起きていなければ、ただの当たり前のものとして意識することなく過ごしてしまうのです。

文明社会の野蛮人
スペインの哲学者ホセ・オルテガ・イ・ガセットは、『大衆の反逆』で、こうした人々を「文明社会の野蛮人」と呼んで批判しています。「新しい人間は自動車を欲し、それを楽しむ。しかし、彼は自動車が自然にエデンの園の木から生じた果実だと信じている」と語るように、私たちは自動車がどう作られ、どのように動くのかを知らずに、その恩恵を享受しているのです。

現代社会では、誰もがすべての技術を理解することはほぼ不可能です。しかし、技術に対する無関心を許容することは、「野蛮人」として生きることを意味します。IT技術も膨大で、賢者と呼ばれる領域もあれば、ただの野蛮人であることもあります。大切なのは、技術に対して興味を持ち、理解を深める努力を怠らないことです。

技術者は結局何をすべきか
結論として、我々技術者は技術そのものに対して興味を持ち、技術がどのように機能しているのか、またそれが人間や世界にどんな影響を与えているのかを考えることが求められています。高度化・複雑化した技術、ブラックボックス化された技術の背後にある原理や影響を考察することが、より良い使い方への第一歩です。

技術が私たちの生活に与える影響は大きく、私たちの生活様式や社会そのものを大きく変えました。技術がもたらす変化を深く理解し、必要な変化を先取りすることが求められる時代です。

読書案内
技術哲学についてもっと学びたい方のためにおすすめの本をいくつか紹介します。

金光秀和, 吉永明弘編, 2024,『技術哲学』 昭和堂
M. クーケルバーク, 直江清隆・久木田水生監訳, 2023,『技術哲学講義』丸善出版
黒田光太郎・戸田山和久・伊勢田哲治編, 2012,『誇り高い技術者になろう[第2版]-工学倫理ノススメ-』名古屋大学出版会
さいごに
技術哲学はまだ発展途上であり、技術が進歩する中で、我々はその進化を理解し、導いていかなければなりません。哲学的なアプローチだけでなく、技術者としてのアプローチも必要です。技術が社会を豊かにする力となるよう、考え、学び続けていきましょう。
Learn more: https://cto.skysolution.com/blog/
awakeFromNibメソッドで発生するSwift Concurrencyのwarning対処方法

## 該当するWarning

```
Main actor-isolated property '〜UIKitのプロパティ〜' can not be referenced
from a nonisolated context; this is an error in the Swift 6 language mode
```

## 原因

awakeFromNibはNSObjectを継承しており、NSObject は Main Actor に紐付けられていないため

## 対処法

awakeFromNibはメインスレッドで実行されるので、ワークアラウンドとしてMainActor.assumeIsolatedで対応


```swift
override func awakeFromNib() {
    super.awakeFromNib()

    moreButton.setTitle("Buttonタイトル", for: .normal)
    moreButton.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
}
```

👇 変更

```swift
override func awakeFromNib() {
    super.awakeFromNib()

    // 追加
    MainActor.assumeIsolated {
        moreButton.setTitle("Buttonタイトル", for: .normal)
        moreButton.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
    }
}
```

## 参考

- https://forums.swift.org/t/should-awakefromnib-be-manually-marked-as-mainactor/55926/2
- https://forums.swift.org/t/swift-concurrency-in-real-apps/73790/49
Decode a Transaction

[Previous << Send Signed Transaction](https://qiita.com/flowcadence/items/f87b20072a4a66f15e23)
[Next >> Initialize Configuration](https://qiita.com/flowcadence/items/df96ca5d6c335d25ea2f)

https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a#flow-cli-と-fcl

Flow CLIは、ファイル内のRLPからトランザクションをデコードするコマンドを提供します。getコマンドと同じトランザクション形式を使用します。

```ruby
flow transactions decode <file>
```

<h1>Example Usage</h1>

```ruby
> flow transactions decode ./rlp-file.rlp 

ID		c1a52308fb906358d4a33c1f1d5fc458d3cfea0d570a51a9dea915b90d678346
Payer		83de1a7075f190a1
Authorizers	[83de1a7075f190a1]

Proposal Key:	
    Address	    83de1a7075f190a1
    Index	    1
    Sequence	1

No Payload Signatures

Envelope Signature 0: 83de1a7075f190a1
Signatures (minimized, use --include signatures)

Code (hidden, use --include code)

Payload (hidden, use --include payload)
```

<h1>Arguments</h1>

<h3>Filename</h3>

* Name: `<file_name>`
* Valid inputs: file name.

最初の引数は、トランザクションRLPを含むファイル名です。

<h1>Flags</h1>

<h3>Include Fields</h3>

* Flag: `--include`
* Valid inputs: `code`, `payload`, `signatures`

出力結果に含めるフィールドを指定します。テキスト出力のみに適用されます。

<h3>Output</h3>

* Flag: `--output`
* Short Flag: `-o`
* Valid inputs: `json`, `inline`

コマンド結果のフォーマットを指定します。

<h3>Save</h3>

* Flag: `--save`
* Short Flag: `-s`
* Valid inputs: a path in the current filesystem.

結果を保存したいファイル名を指定してください。

<h3>Version Check</h3>

* Flag: `--skip-version-check`
* Default: `false`

低速な接続を避けて処理を高速化するために、起動時のバージョンチェックをスキップします。

*Last updated on **Dec 17, 2024** by **j pimmel***

翻訳元

https://developers.flow.com/tools/flow-cli/transactions/decode-transactions

***
<b>[Previous << Send Signed Transaction](https://qiita.com/flowcadence/items/f87b20072a4a66f15e23)
</b>

[Flow blockchain / Cadence version1.0ドキュメント](https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a) (Decode a Transaction)

<b>[Next >> Initialize Configuration](https://qiita.com/flowcadence/items/df96ca5d6c335d25ea2f)</b>
テスト仕様書を設計書からGeminiで自動生成！〜生成AIを活用した仕組みづくりでドキュメント陳腐化を防ぐ！〜

最近、開発ドキュメントの陳腐化を防ぐ方法を必死に考えているエンジニアです。今回はなぜドキュメントが陳腐化してしまうのか、その原因を考え、それに対する部分的な解決策として、生成AIを活用した解消法を紹介したいと思います。

なぜドキュメントは陳腐化するのか（更新されないのか）
システムが問題なく稼働しているため、ドキュメントの更新が後回しになる。
ドキュメントを書くことの重要性がチーム全体に認識されていない。
緊急対応時にコードの修正は行うが、ドキュメントの更新が漏れてしまう。
どうしたら解決できるのか
ドキュメントとコードの距離を縮め、バージョン管理をする
普段GitHubでソースコードを管理しているため、ドキュメントも同様に管理することで、設計ドキュメントを更新した際にテスト仕様書も一緒に更新される仕組みを作れば、更新漏れが減少するのではないかと考えました。

ドキュメントを更新することのメリットを大きくする
ドキュメントが更新されないのは、そのメリットが享受されていないためだと思います。ドキュメントを更新することのメリットを増やせば、自然と更新が進み、ドキュメントが現行のシステムに即したものとなります。

テスト仕様書自動生成フロー
開発者が設計ドキュメントを記載し、プルリクエストを作成
GitHub Actionsがプルリクエストをトリガーに変更された設計ファイルを基に、Vertex AIでGeminiにテスト仕様書を自動生成
生成されたテスト仕様書はCSV形式に整形され、プルリクエスト内でコミット
レビュワーは設計内容と一緒にテスト仕様書をレビュー
メリット
テスト仕様書の作成作業が不要になる（多少の修正はあるものの、ゼロからの作成は不要）
設計書の更新が動機づけになり、テスト仕様書も一緒に更新される
設計に対するテストの状態を保てる
実際の出力結果
設計書（Markdown形式）とGeminiで生成されたテスト仕様書の一例です。

設計書の例
ログイン
概要: TODOアプリの認証機能
項目設計:
項目名	I/O	データ型	制約
メールアドレス	I	String	必須、最大255文字、メールアドレス形式
パスワード	I	String	必須、8〜12文字、半角英数字記号
生成されたテスト仕様書
テスト仕様書は設計書を基に自動生成され、CSV形式で保存されます。

実践の手順
Workload Identityの設定
GitHub ActionsでGoogle Cloudのサービスにアクセスするための設定を行います。OIDCを使ってGoogle Cloudにアクセスするための設定を行います。

サービスアカウントの設定
必要な権限（Vertex AIユーザー、サービスアカウントトークン作成者）を付与し、設定を完了します。

GitHub Actionsの設定
プルリクエストが発行された際に、自動でテスト仕様書を生成するようGitHub Actionsを設定します。

まとめ
今回の仕組みでは、テスト仕様書を自動生成し、GitHubのプルリクエスト内でレビューできる体制を整えました。テスト仕様書の管理をCSVからGoogleスプレッドシートに移行することで、さらに効率的な運用が可能になると考えています。

生成AIを活用したこの仕組みは、開発の効率化に貢献し、ビジネスのコア部分に集中できる環境を作り出します。今後もより良い仕組み作りを目指して改善を続けていきたいと思います。
Explore this: https://ceo.skysolution.com/category/ai/
プログラミングにおける命名規則について

### そもそもプログラミングにおける命名規則とは？

プログラミングの命名規則は、コード内で使用される変数、関数、クラス、モジュールなどの名前を決定するためのガイドラインのことです。命名規則を統一することで、コードの可読性や保守性を向上させ、チーム開発での混乱や誤認を防ぐことができます。自分が想定していたケースと違うケースで命名してる方がいて、自分自身ケースを全てきちんと使い分けできているか微妙だったので自分が見返す用に記事にしました。この記事では、命名規則の重要性や具体的なケースについて解説していこうとおもいます。

---

### 命名規則が重要な理由

1. **可読性の向上**  
   他の開発者や将来の自分がコードを読みやすくするため、直感的な命名が必要です。
　　
2. **一貫性の維持**  
   命名がバラバラだと、コードの理解が難しくなり、バグの原因になります。
　　
3. **効率的なコミュニケーション**  
   チームメンバー間でのコード共有やレビューがスムーズになります。
　　
4. **ツールとの親和性**  
   命名規則を守ることで、自動補完や静的解析ツールが正しく機能します。
　　
---

### 主な命名スタイル

1. **キャメルケース (Camel Case)**  
   最初の単語を小文字、2つ目以降の単語の先頭を大文字にするスタイル。  
   - **例:** userName, calculateTotalPrice  
   - 使用例: JavaやJavaScriptの変数・関数名
　　
2. **パスカルケース (Pascal Case)**  
   全ての単語の先頭を大文字にするスタイル。  
   - **例:** UserName, CalculateTotalPrice  
   - 使用例: クラス名や構造体名 (C#, Javaなど)
　　
3. **スネークケース (Snake Case)**  
   単語をアンダースコア（_）で区切り、小文字で記述するスタイル。  
   - **例:** user_name, calculate_total_price  
   - 使用例: Pythonの変数名や関数名
　　
4. **ケバブケース (Kebab Case)**  
   単語をハイフン（-）で区切るスタイル。  
   - **例:** user-name, calculate-total-price  
   - 使用例: HTMLやCSSのクラス名
　　
5. **ハンガリアン記法**  
   名前の先頭にデータ型や役割を示すプレフィックスを付けるスタイル。  
   - **例:** strUserName, btnSubmit  
   - 使用例: レガシーコードや特定の業界標準

---

### 命名の基本ルール

1. **意味のある名前を付ける**  
   名前から役割や用途が明確に分かるようにします。  
   - 良い例: calculateTax  
   - 悪い例: ct  
　　
2. **略語を避ける**  
   誰でも理解できるフルネームを使うことが望ましい。  
   - 良い例: maximumValue  
   - 悪い例: maxVal  
　　
3. **一貫性を保つ**  
   プロジェクト全体で同じスタイルを使用します。
　　
4. **言語やフレームワークの慣習に従う**  
   各言語やフレームワークには推奨される命名規則があります。それを尊重しましょう。

---

### よくある命名の失敗例と改善方法

1. **短すぎる名前**  
   - **例:** x, y  
   - **改善:** 意味を付け加える。  
     **改善後:** userAge, productPrice
　　
2. **略語の多用**  
   - **例:** usrNm  
   - **改善:** 略語を避け、明確な名前を使用。  
     **改善後:** userName
　　
3. **多すぎる接頭辞や接尾辞**  
   - **例:** calculateDataOfTotalUserFunction  
   - **改善:** 必要最低限の情報に削減。  
     **改善後:** calculateTotalUsers

---

### 言語別の命名規則

- **Python:**
  - 変数・関数: スネークケース (calculate_total)  
  - クラス名: パスカルケース (MyClass)  
  - 定数: 全て大文字 (MAX_LENGTH)  
　　
- **JavaScript:**  
  - 変数・関数: キャメルケース (calculateTotal)  
  - クラス名: パスカルケース (MyComponent)  
  - 定数: 全て大文字 (MAX_VALUE)  
　　
- **Java:**  
  - 変数・メソッド: キャメルケース (getUserName)  
  - クラス名: パスカルケース (UserService)  
  - 定数: 全て大文字 (PI)  
　　
- **C#:**  
  - メソッド・プロパティ: パスカルケース (CalculateTax)  
  - 変数: キャメルケース (userName)  
  - 定数: パスカルケース (MaxLength)  
　
- **COBOL#:**  
  - 変数・関数: 全て大文字。単語をハイフンで区切る (USER-NAME)  
  - セクション名・段落名: 全て大文字。ハイフンまたはアンダースコアで区切ることもある。 (READ-DATA)  
  - 定数: 全て大文字が推奨。 ハイフンまたはアンダースコアで区切ることもある。(COMPANY-NAME)  

---

### 命名規則の導入と管理

1. **スタイルガイドを作成**  
   プロジェクト固有の命名規則を文書化します。
　　
2. **コードレビューを徹底する**  
   命名規則に従っているか確認するプロセスを設けます。
　　
3. **静的解析ツールを活用**  
   ESLintやPylintなどのツールで規則違反を検出します。
　　
4. **命名を変更する際は慎重に**  
   リファクタリングの際は既存コードへの影響を考慮します。

---

### まとめ

命名規則は、コード品質を大きく左右する重要な要素となります。一貫性を持って適用することで、コードの可読性や保守性が向上し、生産性が向上します。プロジェクトに最適な命名規則を選び、常に守れているか心がけましょう。
ショート動画でクイックに知る！10分でご紹介！『IBM z16』


# はじめに

みなさん、IBM Videoというサイトをご存知でしょうか？
IBMが提供する製品をショート動画でわかりやすくご紹介している動画サイトです。
* スキルアップしたくてもなかなか時間が取れない
* 気になる製品があるけど、マニュアルを読んで理解するのはきつい
* 製品の特徴やメリットをクイックに知りたい

という方には、うってつけの動画を提供するサイトです。
興味のある方はぜひご覧いただければと思います。

# 今回ご紹介する動画へのリンク

[10分でご紹介！『IBM z16』](https://video.ibm.com/recorded/131609612)

IBMのメインフレームであるIBM Zシリーズを紹介するビデオです

# 概要
IBM Zシリーズの最新モデル「IBM z16」は、2022年4月5日に発表され、5月31日から出荷開始予定です。AI、セキュリティ、ハイブリッドクラウドに対応し、デジタル変革を推進するために設計されています。

# 主要特徴

* AI推論と自動化
    * AI専用エンジン「Telumプロセッサー」を搭載し、リアルタイムのAI推論を実現。
    * 不正検知の適用範囲を100%に拡大し、従来のシステムより25倍速い応答速度を提供。
    * AIモデルはオープンソースフレームワークと互換性があり、カスタム開発の必要がない。

<br>

* セキュリティ強化
    * 高度な対量子暗号を導入し、将来の量子コンピュータによる攻撃にも対応可能。
    * 全方位型暗号化、HPDC、耐量子暗号により、分散データも安全に保護。
    * シームレスな業務継続性を提供する「Flexible Capacity for Cyber Resiliency」機能で、災害時や停電時にも迅速に業務復旧を実現。
<br>

* ハイブリッドクラウド対応
    * クラウドとオンプレミスの統合管理が可能で、柔軟なモダナイゼーションを実現。
    * DevSecOpsを支援する「Wazi as a Service」により、6分以内でテスト環境を提供し、従来のx86環境に比べて8〜15倍のパフォーマンスを実現。
    * 「IBM Z & Cloud モダナイゼーションセンター」を通じて、日本市場向けの最適化支援を提供。

# 実際の事例と応用分野
* 不正検知：銀行業務でリアルタイムにAIを活用し、不正取引を即時検出。
* ローン承認：迅速かつ正確な意思決定を支援。
* 保険請求審査：請求の適正検査を効率化。
* 貿易決済：支払い処理を高速化し、業務効率を向上。

# まとめ
* IBM z16は、AI、セキュリティ、ハイブリッドクラウドという現代のITニーズに対応した最先端のメインフレームです。リアルタイム処理、高度なセキュリティ、ハイブリッドクラウド環境の最適化により、デジタルトランスフォーメーションを加速し、企業の競争力を高める設計がされています。

* 今後もIBMは開発投資を継続し、パートナーとともに新しい価値を創造していく方針です。

# 参考
10分でご紹介！『IBM z16』

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

https://jp.newsroom.ibm.com/2024-08-29-ai-on-z
202X年、システム開発の世界はかつてないほどの複雑さと混沌を迎えていた。

技術の進化は急速で、日々新しいツールやライブラリ、フレームワークが登場し、プログラミング言語の選択肢は膨大に増えていた。GitHubや他のソースコード管理サービスでは、次々と新しいライブラリが登場するものの、その多くは人気を集めた瞬間から急速にメンテナンスモードに入ってしまう。人気のフレームワークが突然更新を停止し、ユーザーが困惑する場面も珍しくなくなっていた。X（旧Twitter）では、毎日のように新しい技術やトレンドが取り上げられ、議論の渦に巻き込まれている。メディアサイトでは毎年、プログラミング言語のランキングが発表され、どの言語が今年の注目すべきものかが注目される。AI技術の発展は、多くのエンジニアにとって希望の光のように感じられたが、OpenAI、Perplexity AI、Anthropicなどの企業は、世界の覇権を巡って競争を繰り広げ、血で血を洗う戦いが続いていた。
![ẻtyh.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3963793/b21b0f2f-7724-0539-8d3c-2aa1cd55f7e3.png)


CMS業界では、圧倒的な人気を誇っていたWordPressでさえ、WP Engineとの競争が激化しており、ACFなどの有名なプラグインも、更新や改善が難しくなりつつあった。WordPressが生み出したエコシステムは非常に大きく、その影響力は未だに強いが、進化し続ける技術の波に押され、時にはその進化が停滞することもあった。

フロントエンドの世界では、技術革新が止まることなく続き、Reactが登場したことにより、フロントエンド開発は全く新しい局面を迎えた。Reactに続き、AngularやVueが登場し、フレームワーク同士の競争は過熱していた。さらに、Remixやqwikといった新たなフレームワークが登場し、SvelteやElm、Imbaなどの独立した技術が次々と登場し、フロントエンドの世界はますます分裂していった。jQueryはすっかり時代遅れとなり、過去の栄光を背負った技術として、かつての輝きを失っていた。

フロントエンドの激しい戦争を避けた者たちは、バックエンドの領域に移住し、平穏を求めていた。しかし、そこにも厳しい戦いが待ち受けていた。サーバレスアーキテクチャを支持する者、コンテナ技術を推進する者、物理サーバを重んじる者たちが争いを繰り広げ、平穏な時代が来る気配は全くなかった。バックエンドの選択肢も多様化し、従来のJavaやC#、PHPの領域に加え、新たに登場したGolang、Elixir、Rustなどの言語が勢力を拡大していた。さらに、関数型プログラミングの原則を重視する勢力も無視できないほどの存在感を示し、競争はますます熾烈になっていた。

データベースの領域でも、Oracleとの決別を目指す動きが加速していた。MySQLやPostgreSQLといった従来型のデータベースは、NoSQL系のデータベースや次世代の分散データベースであるCockroachDBといった新たな技術に圧倒されつつあった。データベース技術の進化は、単に選択肢が増えるというだけでなく、システムのアーキテクチャそのものを大きく変える力を持つようになっていた。

クラウドコンピューティングが全盛となった今、AWSは圧倒的なシェアを持っていたが、AzureやGoogle Cloud、Oracle Cloud、IBM Cloudといった他のクラウドサービスも必死に栄光を取り戻そうとしていた。クラウドインフラの選択肢が増える一方で、それぞれのクラウドが独自のエコシステムを構築し、競争はますます激化していた。

こうした技術選定の世界で、最も重要なことは、どの技術が「最適」であるかを見極めることだと私は考えている。しかし、最適な技術を選ぶということは、決して簡単なことではない。最も重要なのは、その技術が「最新」であるかどうかではなく、そのプロジェクトにとって「最適」であるかどうかだと私は思う。そのプロジェクトにとって長期間にわたって維持管理しやすい技術であるか、運用・保守時にコストがかからないか、将来的に技術が陳腐化するリスクが低いか、そしてチームのエンジニアがそれを使いやすいかという観点を重視するべきだ。

例えば、Javaを「レガシー」として避ける声もありますが、私はJavaが非常に優れたプログラミング言語だと考えています。特に、大規模なシステムを運用する際の安定性や成熟度において、Javaには他の言語にはない強みがあります。F#でWebアプリケーションを開発することも可能ですが、私が企業のシステム開発でF#を選ぶことは少ないでしょう。個人的には、趣味のプログラミングではLispを愛用していますが、それを商業システムに適用することはありません。技術選定は、単に好みに基づくものではなく、プロジェクトの規模や性質、将来の維持管理の観点を総合的に考慮する必要があります。

また、技術選定においては、トレンドを追いかけることが必ずしも最良の選択肢であるとは限りません。短期的な流行や注目を集める技術に飛びつくのではなく、長期的に見て安定した運用が可能で、将来のリスクが低い技術を選ぶことが求められます。特にエンタープライズのシステム開発においては、プロジェクトが完了した後の運用や保守が長期間続くことを考慮し、持続可能な技術選定が重要となります。

もっと学ぶ: https://news.skysolution.com/category/ai-ml/

最適な技術選定は非常に難しく、常に正解があるわけではありません。しかし、その過程で得られる経験や知識は、次のプロジェクトに必ず生かされます。選定の結果がどのようであれ、それを実行に移し、改善しながら進んでいくことが最も大切です。そして、最適な技術選定を行ったときに得られる成果や自信は、今後のキャリアに大きな影響を与えることでしょう。

技術選定は、最適解を見つけるための試行錯誤の過程であり、その過程で得られる成長が最も重要です。自信を持って技術選定を行えるようになる日は必ず訪れるでしょう。それを信じて、毎日積み重ねていきましょう。
databricks認定資格対策でudemyを活用

この記事は、[Udemyおすすめ講座をシェアしよう！ by Udemy Advent Calendar 2024](https://qiita.com/advent-calendar/2024/udemy) 22日目の記事です。  
※遅刻しました、すいません。。。

# はじめに
先日、[databricks認定資格を取得](https://zenn.dev/t88/articles/c8f3dab7de2b6c)する機会があり、その中でudemyをフル活用しました。

# なぜudemyが役に立ったか
databricks認定資格は、まだ日本語化されていない種類も多く、また資格対策の参考書なども乏しい現状です。udemyには英語の模擬問題集が多数存在しており、資格対策にとても有用です。

# オススメ講座
各試験種類ごと対策問題集が揃ってます。udemy businessに含まれるものもそれなりにあって大変助かりました。　　

https://www.udemy.com/course/practice-exams-databricks-certified-data-engineer-associate/  

https://www.udemy.com/course/practice-exams-databricks-data-engineer-professional-k/

https://www.udemy.com/course/databricks-machine-learning-associate-practice-tests-2024

https://www.udemy.com/course/databricks-certified-machine-learning-professional-exam-2024

https://www.udemy.com/course/databricks-certified-data-analyst-associate-practice-exams-j


# めちゃくちゃ嬉しい機能
最近、追加されたこの機能。便利です！
![IMG_4302.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160102/366cb820-597d-5c1d-0858-03ad2791fe1c.jpeg)  
これまでは一通りテストを終えてからでないと、解答と解説が見れませんでした。この演習モードでは、一つの問題を解く度に確認ができるので学習にとても役立ちます！

# さいごに
来年もudemy活用していろいと学んでいきたいと思います。