OmniAICreator/Qiita-1.07M huggingface dataset:
Homebrew で MacOS のパッケージを管理する

# Homebrewでパッケージを管理する

HomebrewはMacでのパッケージ管理を効率化するツールです。コマンド一つでソフトウェアのインストール、更新、削除が可能で、開発効率が格段にアップします。本記事では、Homebrewの基本的な使い方について解説します。

## Homebrewのインストール

Z Shellを起動して、[公式ドキュメント](https://brew.sh)のとおり Homebrew をインストールします:

```zsh:zsh
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

HomebrewのPATHを追加します:

```zsh:zsh
echo >> /Users/YOUR_HOST_NAME/.zprofile
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/YOUR_HOST_NAME/.zprofile
```

Z Shell のプロファイルを読み込みます:

```zsh:zsh
source ~/.zprofile
```

インストールが完了したら、次のコマンドでバージョンを確認します。

## バージョンの確認: `brew --version`

Homebrewのバージョンを確認します:

```zsh:zsh
brew --version
```

## インストール済みパッケージ一覧: `brew list`

インストールされているパッケージを確認するには、次のコマンドを使用します:

```zsh:zsh
brew list
```

## Homebrew自体を更新: `brew update`

Homebrew本体を最新バージョンにアップデートするには次のコマンドを実行します:


```zsh:zsh
brew update
```

## パッケージの更新: `brew upgrade`

インストール済みのすべてのパッケージを更新する場合は次のコマンドを実行します。


```zsh:zsh
brew upgrade
```

## 不要なファイルを削除: `brew cleanup`

古いバージョンやキャッシュなど、不要になったファイルを削除してディスク容量を確保します:


```zsh:zsh
brew cleanup
```

## パッケージのインストール `brew install`

新しいパッケージをインストールする場合は次のコマンドを使用します:

```zsh:zsh
brew install PACKAGE_NAME
```

**例: Gitをインストールする場合:**

```zsh:zsh
brew install git
```

## パッケージのアンインストール: `brew uninstall`

不要になったパッケージを削除する場合は次のコマンドを使用します。

```zsh:zsh
brew uninstall PACKAGE_NAME
```

## パッケージの検索: `brew search`

```zsh:zsh
brew search PACKAGE_NAME
```

## Homebrewでの問題診断: `brew doctor`

Homebrewの調子が悪いと感じたら、brew doctorコマンドを使って問題を診断できます。このコマンドは、Homebrewの設定や環境で発生している問題を検出し、解決のヒントを教えてくれます。

次のコマンドをターミナルで実行します:

```zsh:zsh
brew doctor
```

**実行結果の例**

コマンドを実行すると、診断結果が表示されます。問題がない場合は次のように表示されます:

```zsh:zsh
Your system is ready to brew.
```

問題がある場合は、エラー内容や警告メッセージが表示されます。
【AWS re:Invent 2024】小ネタ 認定者ラウンジに入る準備編

# はじめに
今年も学びの1週間、re:Inventがやってきました。
新しいアップデートが発表されるセッションの合間やGameDayやJamで自分の出来なさっぷりに砕けた心を癒す大事な場です。
認定資格を取得している人であれば誰でも入れる場所なので、ここをキャンプ地として一週間を過ごしていきたいですね。

# なんかバッジおかしい
事前にre:Inventのページで資格のIDを登録しておくことで、入場者バッチに認定者であることを示すバッチが印字されるのですが、渡されたものを見ると、うまく印字がされていないように見受けられる。。。

![1000000404.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822205/e9876c4e-46c9-6af4-b41e-821c0dc35c7f.jpeg)

一目で画像ファイルがなく、印刷がうまく出来ていない状態です。
いろいろ聞いてみるとバッチを受け取った場所によってはこういうことがあるっぽいです

# 認定者ラウンジに駆け込む
認定者ラウンジは2024/12/3から入れるようになりますが、このままでは絶対にすんなりとは入れない。。。

ということで認定者ラウンジの受付いた係員に相談をしてみると「 [credly](https://www.credly.com/)の認定者バッチを見せて」と。
言われた通りに、見せるとシールのバッチを貼ってくれました。

![1000000414.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822205/6cade3f7-7588-a555-5877-7c33df1962b9.jpeg)

これで12/3以降もすんなりと認定者ラウンジに入れるはずです！

# 会期中はいろいろ貰える
会期中は曜日ごとにSWAGが配布のイベントが用意されているようですね。

![1000000418.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822205/8c39bd52-93d5-bd95-cb78-bb037ee69d11.jpeg)

re:Inventは学びの場ですが、こういう遊び心も大切にして体験していきたいですね！

# 弊社では一緒に働く仲間を募集中です
現在、様々な職種を募集しております。
カジュアル面談も可能ですので、ご興味のある方は是非ご連絡ください！

募集内容等詳細は、是非採用サイトをご確認ください。
https://engineer.po-holdings.co.jp/
rails + typescript で開発を始める時に毎回使うテスト用のtasks.jsonの覚書

新規プロジェクトで大概同じ様な設定をしているのに毎回探すので覚書。
dockerのコンテナ名なんかは適時変更、ここではrailsが `backend` 、jestは `yarn` で実行しています。


### 開いているファイルをrspec
```json
    {
      "label": "rspec",
      "type": "shell",
      "command": "filepath=$(printf %q '${relativeFile}'); docker-compose exec -e RAILS_ENV=test backend bundle exec rspec ${filepath}",
      "presentation": {
        "reveal": "always",
        "panel": "shared",
        "focus": true
      },
    },
```

### 選択中の行をrspec
```json
    {
      "label": "rspec:line",
      "type": "shell",
      "command": "filepath=$(printf %q '${relativeFile}'); docker-compose exec -e RAILS_ENV=test backend bundle exec rspec ${filepath}:${lineNumber}",
      "presentation": {
        "reveal": "always",
        "panel": "shared",
        "focus": true
      },
    },
```

### 開いているファイルをjest
```json
    {
      "label": "jest",
      "type": "shell",
      "command": "filepath=$(printf %q '${relativeFile}'); yarn jest --silent $filepath$",
      "presentation": {
        "reveal": "always",
        "panel": "shared",
        "focus": true
      }
    },
```

### 開いているファイルをjestでログを全出力（差分みたい時とか）
```json
    {
      "label": "jest:log all",
      "type": "shell",
      "command": "filepath=$(printf %q '${relativeFile}'); DEBUG_PRINT_LIMIT=999999 yarn jest --silent=false --verbose $filepath$",
      "presentation": {
        "reveal": "always",
        "panel": "shared",
        "focus": true
      }
    },
```
特定のyoutubeチャンネルの全動画をcsvにする


プロもくチャットアドベントカレンダー6日目です!

https://qiita.com/advent-calendar/2024/puromoku


# 勉強も兼ねてJSでツールを作りました

こんな感じで実行すると指定のチャンネルの全動画がoutput.csvに書き込まれます

```sh
npm run start -- <channelId>
```

・チャンネルIDの確認方法

youtubeのチャンネルのページに行くと大体`@account`のようにエイリアスがつけられていますがこれはidじゃないです

詳細ページにいってチャンネルIDをコピーで取得できました

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329559/a2156c58-ebb7-0804-485e-2540e7122b4d.png" width=50%>

このチャンネルの動画を取得してみましょう

maxPageをつければお試しで取得できます(1ページあたり50件)

```sh
npm run start -- UCrXUsMBcfTVqwAS7DKg9C0Q  --output=test.csv --maxPage=1
```

よさそう

```sh
 head -n 3 test.csv 
id,title,thumbnail
LoXtRJZtVGA,#PokemonTCGPocket のエフェクトはもう試した？👀あなたも #YouTubeショート でポケモンカードを引いてみよう！,https://i.ytimg.com/vi/LoXtRJZtVGA/default.jpg
AaAF7gl3BIw,YouTube Fanfest Japan 2024 🎉メッセージ第三弾✨出演クリエイターのみなさんから動画が届きました！ #YTFF 当日をお楽しみに！,https://i.ytimg.com/vi/AaAF7gl3BIw/default.jpg
```

フィールドも指定できます

カラム名:アクセスするリソースの階層をドットつなぎで指定する

https://developers.google.com/youtube/v3/docs/playlistItems?hl=ja#resource

```sh
# id, title, publishedAtを取得
npm run start -- UCrXUsMBcfTVqwAS7DKg9C0Q  --output=test.csv --maxPage=1 --fields=id:snippet.resourceId.videoId,title:snippet.title,published:snippet.publishedAt
```

よさそう

```sh
head -n 3 test.csv 
id,title,published
LoXtRJZtVGA,#PokemonTCGPocket のエフェクトはもう試した？👀あなたも #YouTubeショート でポケモンカードを引いてみよう！,2024-12-02T02:00:10Z
AaAF7gl3BIw,YouTube Fanfest Japan 2024 🎉メッセージ第三弾✨出演クリエイターのみなさんから動画が届きました！ #YTFF 当日をお楽しみに！,2024-12-01T03:00:08Z
```

# こまったとこ

初期の実装はsearch listでチャンネルIDを指定して取得していました

しかしsearch listはquotaを100使うので5000件くらいしか取得できません

https://developers.google.com/youtube/v3/determine_quota_cost?hl=ja

そこで、channelの全動画が入っているplaylistを取得して、そこからvideo listで取得するように変えました

簡単に表すとこんな感じ

```js
// channelの全動画が入っているplaylistを取得
const playlistId = await fetchPlaylistId(channelId)

// playlistidを指定して動画一覧取得
const response = await youtube.playlistItems.list({playlistId})
```


そうするとchannel list=1quota playlist list=1quota なのでめっちゃ取得できるようになりました



# 助かった

簡易的な実装をしてからオプションが色々欲しくなったのでcommanderを入れました

参考になりました :pray: 

https://zenn.dev/yamaden/articles/40e3c646b7df09

# ソース

https://github.com/babu-ch/youtube_csv/

# 使い方

1. GoogleCloudのYoutube Data API V3を有効にする

2. 認証情報からAPIキーを作成(作成時にYoutubeAPIだけに制限すること！)

3. [readmeに従う](https://github.com/babu-ch/youtube_csv/blob/main/README.md)

```sh
cp .env.example .env

.envにAPIキー設定

npm i

npm run start -- <channelId> --maxPage=1
```



# おわり

間に合ってよかった〜

本当はTSで書きたかったのですが,速度が追いつかず断念

後日やりたい

---

明日は https://qiita.com/yosoyalumno さん！
AWS SOA 対策

SysOpsに合格しましたので、メモを貼っておきます。
かなり雑にまとめたメモになってますので参考にはならないかもしれせんが、残しておきます。

下記試験対策サイト

https://www.jpnshiken.com/shiken/Amazon.SOA-C02-JPN.v2024-09-05.q195.html



37　RDPアクセス不可能はACLとインターネットGW設定
クラウドテックの114は覚えて
Immutable
Rooling with additonal batch
133
Cloudフォーメーション起動で2−3時間まつCreationPolicy

168 クラウドFrontはグローバルサービス
180
ファイル整合性　no-reboot false


1　SQSの処理→クラウドウォッチで処理して、数を計算してターゲット追跡スケーリングポリシーを作成する 　ALBでSQSの負荷分散はできません

2　ACMの更新期限確認はAmazonイベントブリッジとSNSでできる
3　S3に保存されているログ検索→クラウドウォッチインサイトではS3に保存さてているログは確認できない、Athenaとかで検索する

9 S3バケットのオリジンが古いまま→Cloudfrontを無効化して、更新したパスを追加する

13 セッションマネージャーでEC2制御はIAMポリシーとcondetion要素で制御

15 独自のクラウドウォッチダッシュボードを使用　 　. 既存の CloudWatch ダッシュボードを JSON としてエクスポートします
16 SSHポート確認 AWS configとRunbook

20　ヨーロッパだけウェブサイトわける→ジオロケーション

22　S3へのアクセス　VPCエンドポイントとバケットポリシーで制御
29 S3バックアップ3ヶ月削除しない→コンプラモード
　　※カバナンスは管理者は削除いける
38 RDSの災害復旧対応はクロスリージョンリードレプリカ
41 Ipv6ブロックラフィックを下り専用のインターネット ゲートウェイにルーティングする →enngleyみたいなやつと同じ意味

46 サービスクォータの増加→クラウドウォッチで監視

47 アカウント作成を効率的に行うにはControl Tower

48　S3バケットに1時間通知設定　バケットに入るとLambda関数が呼び出されるのでLambda関数の呼び出しが0のときにクラウドウォッチが呼び出されるようにする

50　SQS処理中にAutoScalingを終了させない方法　スケールイン保護を有効にして、処理終了後にAPIを経由してスケールイン保護を無効にする



52 EC2サービスクォートを管理するには、サービスクォータコンソールを使用してクラウドウォッチと連携する
※サービスクォータはt2Microなどといったリソース

54 AutoScalingの調査するにはライフサイクルフックで一時停止とかでしてEventブリッジでlamda関数を呼び出す(route53でLambda関数呼び出しできない)

50　Secretマネージャのデータベス認証失敗調査→Lambda関数ログ


64　システムManagerでパッチ適用を自動化する方法
システムManagerインベントリ(EC2にどのようなパッケージがインストールされているか確認できる)
→「RunRemoteScripでインストールしていく

67
71

74  顧客の20%のみ新規webサイトを展開したい場合は重ね付けルーティングで20%だけ新規webサイトとかに誘導できる

86　CD

88　ログインが求められる回数が多い　スティッキーセッションを有効にする

92 複数アカウントのアラート設定　すべての公開権限をもつSNSトピックろ作成

104 同じ検索回数が複数回実行されることはほぼない→エラスティックキャッシュ

117 新しいフロー切り替えを作成するだけで良い
126　S3の不完全なアップロードを自動的に削除する場合S3ストレージダッシュボードとライフサイクルポリシーで自動削除できる

128 オーロラのストレージ不足は自動スケーリングで対応できる

130　Lambdaの推薦事項はcomputepotimizerで管理できる


133　メモリを上げればCPU性能もあがる(Lambdaのみ)
135　SQSでFIFOに変更するには重複保護を有効化する必要がある
137　AWS --> カスタマーゲートウェイリソース --> NATゲートウェイのパブリックIP --> カスタマーゲートウェイデバイス（プライベートIP） --> データセンター
選ぶのは、カスタマーゲートウェイデバイスの前にあるNATデバイスのパブリックIPアドレス
138　HTTP404のコードのみたったらメトリクスフィルターで良い、もっと複雑とかであればサブスクリプションでする必要があるけど、メトリクスのみでOK
139　AWSアカウントが別にあるのでクロスアカウントがいる
140　EBSって複数EC2で共有できない→EFSに切り替えるマウント設定も必要
144  オンプレーAWS　オンプレに接続できない、route53、アウトバウンドエンドポイント

147　Compute Savings Plan を購入します。→リザーブドインスタンスはリージョン指定があるため複数のリージョンだと利用できない

148　確認して
150　特定の国(フランスだけ)とかであれば地理位置情報ルーティングで対処、　近接だと難しい
151 データ共有→EFS

156　暗号化されていないS3S3 バッチオペレーションで暗号化できる(コピーする際に暗号化)

158　S3のバケット変更はイベント通知では検知できない。追加、削除のみ検知する。aws config で検知してくだいさ


Cloudfomesionの起動順番を決めるのはdpendson

170　EC2クォータ申請はコンソールから行う、EC2設定はつかわない

171　B
176　AutoScalingが失敗時はunhelthカウント0で検知

178  既存のEC2に対して新しいログを監視したい→クラウドウォッチエージェント設定ファイルを使用して、run commandを使用してクラウドウォッチでエージェントを再起動する

179　パッチ適用方法　AWSリソースグループでグループ分け→パッチマネージャーを適用(パッチ適用すれば、欄コマンドはいらない)→リソース事にメンテナンスウィンドウを作成する

181 InstanceLimitExceeded クウォータ申請

190　汎用インスタンスはCPUとかメモリ向上するだけ、EBSのボリュームを上げればIOパフォーマンスあがる

192　AWS Secrets Managerは30日で自動ローテーションがあるからLambda関数とかいらない(KMSは1年)

193　S3バケットの安全接続　ゲートウェイVPCエンドポイント
製造業における非構造化ドキュメントの解析と入力を自動化

詳細については、[製造業向けドキュメント解析](https://www.compdf.com/blog/automate-unstructured-doc-parsing-entry-in-manufacturing?utm_source=qiita_20241202&utm_medium=doc-parsing)に関する元の記事を参照してください。

製造業では、大量の文書、特に非構造化文書の処理が一般的な課題です。これらの文書は Word や PDF などの形式で提供されることが多く、さまざまな製品カテゴリとパラメータが含まれています。この情報を手動で抽出して Excel などの構造化形式に整理すると、時間がかかり、エラーが発生しやすくなります。ここで、インテリジェント ドキュメント処理 ( [IDP](https://www.compdf.com/solutions/intelligent-document-processing?utm_source=qiita_20241202&utm_medium=doc-parsing) ) ソリューションが役立ち、効率と精度が大幅に向上します。

## 製造業における現在の課題
メーカーは、構造化されていない大量のドキュメントを頻繁に扱います。たとえば、スマート メーター メーカーは、入札プロセス中に多数の技術入札ドキュメントを受け取ることがあります。これらのドキュメントは、多くの場合 Word または PDF 形式であり、さまざまな製品仕様とパラメータが含まれています。特定のパラメータを抽出して技術仕様書にまとめるには、通常、手作業が必要であり、これは労働集約的であるだけでなく、エラーが発生しやすくなります。
製品仕様の多様性と、さまざまなテーブルにわたるパラメータ データの分散性を考慮すると、人工知能 (AI) を活用して関連データを正確に抽出して照合することで、時間と労力を大幅に節約できます。この自動化されたアプローチにより、技術仕様書を効率的に生成できます。

## インテリジェントドキュメントソリューション
**AI ドキュメント解析:**
非構造化ドキュメントでは、キー情報の約 70% が表データであり、残りの 30% は段落テキストに分散されています。表データは比較的標準化されていますが、フィールドと列名の順序は異なる場合があります。構造化パラメータ ドキュメントは固定テンプレートに基づいていますが、主に列名が異なる複数のバージョンがあります。

これらのドキュメントに対処するために、当社の開発チームはまず、インポートされた Word および PDF ファイルのレイアウト分析を実行します。ComIDP のインテリジェントなドキュメント解析テクノロジは 24 を超えるデータ タグをサポートし、テキスト、表、画像、ヘッダー、フッター、ディレクトリ、数式、コードの高精度な解析を可能にします。これにより、解析されたデータが元のドキュメントと一致することが保証されます。

ComIDP は、ドキュメントの種類と顧客の要件に基づいて、ドキュメント内のテキストと表を解析します。また、入力する必要がある Excel パラメータ テンプレートを解析し、リスト データを反復処理して各行のパラメータ情報を抽出し、後続のデータ入力の基礎を築きます。

**インテリジェントなドキュメント認識と抽出:**

ComIDP はインテリジェントなドキュメント解析を基盤として、高度な AI OCR テクノロジーを採用し、技術文書から段落にまとめられたテキスト情報を正確に認識して抽出します。

さらに、当社独自の表認識技術は、境界線のない表や結合されたセルを含むさまざまな複雑な表を効率的に処理します。ComIDP のインテリジェントな表抽出は、構造化された Excel または JSON 形式に変換するときに 85% を超える精度を達成し、ドキュメント コンテンツの高精度な抽出と構造化変換を保証して、顧客のデータ品質と効率の要件を満たします。

インテリジェントな認識、解析、抽出テクノロジーを統合することで、運用効率を大幅に向上させる効率的な自動ドキュメント処理ワークフローを開発しました。このインテリジェントなドキュメント処理ソリューションは、メーカーがより効率的でスマートな運用を実現するのに役立ちます。
APIの機能を用いてクイズゲームを作ってみた

# はじめに
こんにちは! 開志専門職大学情報学部2年(2027年卒)の@kondokarenと申します!

前回のハングマンゲームに続いて、今回は、APIの機能を用いてクイズゲームを作ってみたいと思います。
クイズゲームは、プログラミングの練習に最適なシンプルで楽しいゲームです。この記事では、Pythonを使って外部APIからクイズの質問を取得し、その質問を使ってクイズゲームを作成する方法を紹介します

# ステップ1:必要なライブラリのインストール
まず、requestsライブラリをインストールします。このライブラリを使って外部APIからデータを取得します。
```
pip install requests
```

# ステップ2: クイズの質問を取得するAPIを選ぶ
ここでは、Open Trivia Database APIを使用します。このAPIは様々なカテゴリのクイズ質問を提供してくれます。

https://opentdb.com/api_config.php

# ステップ3: ゲームのコードを書く
以下は、APIを使ってクイズの質問を取得し、クイズゲームを実装するコードの例です。
```ruby:Python
import requests
import random

def get_quiz_questions(amount=5, category=9, difficulty='easy'):
    url = f"https://opentdb.com/api.php?amount={amount}&category={category}&difficulty={difficulty}&type=multiple"
    response = requests.get(url)
    if response.status_code == 200:
        return response.json()['results']
    else:
        return []

def play_quiz():
    questions = get_quiz_questions()
    score = 0

    for i, question in enumerate(questions):
        print(f"Q{i+1}: {question['question']}")
        options = question['incorrect_answers'] + [question['correct_answer']]
        random.shuffle(options)
        for j, option in enumerate(options):
            print(f"{j+1}. {option}")
        
        answer = input("答えを選んでください (1-4): ")
        if options[int(answer)-1] == question['correct_answer']:
            print("正解！\n")
            score += 1
        else:
            print(f"不正解。正しい答えは: {question['correct_answer']}\n")

    print(f"あなたのスコアは {score}/{len(questions)} です。")

if __name__ == "__main__":
    play_quiz()
```

# ステップ4: ゲームを実行する
上記のコードを実行すると、APIからクイズの質問を取得し、クイズゲームが始まります。プレイヤーは選択肢から正しい答えを選び、スコアが表示されます。

# まとめ
このクイズゲームの実装は基本的なものですが、さらに機能を追加してカスタマイズすることも可能です。例えば、カテゴリや難易度を選べるようにしたり、GUIを使って視覚的に楽しめるようにすることもできます。プログラミングのスキルを磨きながら、楽しいクイズゲームを作ってみてください！
OMC236A(823)

https://onlinemathcontest.com/contests/omc236/tasks/13334

まずは$2×4$で以下のように配置されている場合で考えます。
![2x4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543462/9805ebc9-66a7-2ebd-2b02-b5ee5f64095a.png)

隣り合う箇所に印を付けてみます。
![2x4_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543462/2ddcd406-9869-35d7-7a2c-89e481ce2bc6.png)

線は$2$本ですが、その両端の点は$4$つで、すべての黒マスの隣の黒マスを数え上げた合計は$4$になります。
問題文の$2$つめの条件より、点の数が$12$なので、線の数はその半分の$6$本になります。

また、問題文の$1$つめの条件より、黒マスが縦に並ぶことはなく、また白マスも縦に並ぶことはないので、
下図のように黒マスが$1$行目にあるか$2$行目にあるかということも言えます。

![2x10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543462/167e04aa-ab09-e02a-749b-84e9705cf09c.png)

もっというと、$1$行目が黒マスなら$2$行目は白マスなので、$1$行目だけ考えても解くことができます。

![2x10_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543462/7b3b6ead-1223-c81a-6016-566bf2e7553a.png)

上図においては、隣のマスと色が同じが違うかということを見つけるだけになりました。
つまり、$9$箇所の任意の$2$列の色が同じ箇所が$6$箇所である組み合わせを見つけるということになります。

${}_9C_6=84$

しかし、これだけだと考察が不足していて、最初の黒マスが$1$行目にあるか$2$行目にあるかを考慮しなくてはいけません。

![2x10_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543462/935d3c0a-4146-154f-ac2a-ecb64715f4f2.png)

したがって、解は$2×_9C_6=168$になります。
ラズパイで時刻同期にてこずる。

systemd-timesyncdの設定でどうしても時刻同期ができないのでchronyを導入する。
１．サービスの停止と削除、chronyインストール
```
sudo systemctl stop systemd-timesyncd
sudo apt remove systemd-timessyncd
sudo apt install chrony
```
２．コンフィグ修正
```
sudo cp /etc/chrony/chrony.conf /etc/chrony/chrony.conf.bak
sudo vim /etc/chrony/chrony.conf
```

Use Debian vender zoneの位置で
 サーバの記述部分をコメントアウトして、
以下　記述を追加
server ntp.nict.jp iburst minpoll 8 maxpoll 14
server ntp.jst.mfeed.ad.jp iburst minpoll 8 maxpoll 14
server time.google.com iburst minpoll 8 maxpoll 14


ちなみに、サーバ横のオプションは　以下だそう。

iburst : 起動直後に短い間隔で4回問い合わせをする
minpoll n : ポーリング間隔最小値のべき乗数(2のn乗秒)
maxpoll n : ポーリング間隔最大値のべき乗数(2のn乗秒)


３．chrony起動とステータス確認
```
sudo systemctl restart chrony
sudo systemctl status chrony
```

うまくいった。

念のため　時刻比較
```
sudo apt install nptdate
sudo ntpdate ntp.nict.jp　&&　date
```
dateの秒が若干ずれているが、コマンドの発行時間だと思う。。。
2台とも同じズレなのでたぶんそうだろう。

参考サイト
https://qiita.com/ngkazu/items/916f476985fa3e3f2951
Android 版 Firefox の APK を公式からダウンロードする

## GitHub での公開は終了した
先日購入した MeePet は Play ストアに未対応のため、アプリをインストールするには APK ファイルを直接ダウンロードする等の手段が必要となる。
Android 版 Firefox の APK ファイル（Firefox, Focus, Klar の3種類）が GitHubで公開されていたが、2024年3月で更新が終了した。

https://github.com/mozilla-mobile/firefox-android

## ftp サイトから入手できる
開発が Mozilla Central に移り、インストールパッケージの所在が把握できなくなってしまった。

一方、公式サイトには Android 版の APK 入手先について以下のように紹介されている。

https://support.mozilla.org/ja/kb/install-firefox-your-phone-or-tablet

GitHub と違う felix というフォルダになっているが、この中の releases から Android 版 Firefox の APK ファイルをダウンロードすることができる。

https://ftp.mozilla.org/pub/fenix/
(そういえば)入茶できてたので、やったことをまとめてみる

# はじめに
お久しぶりです。大学4年生になりましたFJ2123です。
そろそろ卒業も間近ですが、ちょくちょくNePPに顔を出したり、長期インターンでエンジニアとして働いたりと充実した日々を過ごしています。

今年も、サークルの方でアドベントカレンダーを書くことになったようなので、~~老◯の身ではありますが~~記事を投稿させていただきます。久々だから短めだけどご容赦を🙇

内容としては、3ヶ月ほど前に、AtCoderのほうで茶色(400↑)になれたので、やったことや、色々思ったことを総括しようというものになります。(自分のコミット量が少なかったこともありますが、結局1年ほどかかってしまいました、、、、)


![スクリーンショット 2024-12-01 13.41.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194385/a9e700e5-c8af-01b0-9a51-127e0b29c009.png)

# なぜ茶色を目指そうと思ったか
(かなり古い記事ですが)
https://chokudai.hatenablog.com/entry/2019/02/11/155904
には、茶色コーダーのレベル感について以下の記述がありました

> 情報系の学生が茶色であれば、ちゃんと勉強してるなって印象になる

> スキル的に確実に保証出来る点は、
> 標準入出力、if、forなどの単純な操作はできる
> 問題文を正しく理解し、計算量を考えない仕様通りの実装をすることが出来る
> の２点です。ただし、完全に上の能力しか持っていないと茶色になることはできず、
> - MARCH理系学部以上に入れる程度の数学力や論理的思考力があり、数学的な工夫が必要な問題を正解出来る
> - 典型アルゴリズムに関する知識を多く持ち、探索による全列挙や単純な動的計画法など、典型的な問題に正解することが出来る。
> - コーディングや読解速度が早く、単純な問題を早く正確に実装することが出来る
> などの特徴を持っていなければ、茶色になることはできません。


上記を見て、自分でも達成できそうだなと感じたことや、来年就職する身として、同期となりうるだろう情報系学科の学生と同じくらいのアルゴリズム力を身に付けたかったというのが、目指した動機になります。

# やったこと
**結論**
アルゴ式が最強です。異論は認めます。

https://algo-method.com/

理由は以下です

- アルゴリズムを段階を踏んで学ぶことができる
- Pythonが全然わかんないみたいな初心者レベルでも、標準入力の仕方から丁寧に学べる
- 問題形式が、前解いた問題に、違いを1点加えたものが多いので、負荷のかかり方が程よい

私自身大学では、アルゴリズム・プログラミングに関する授業はそれほど受けていませんでしたが、アルゴ式を画像の進度くらい進めて、その後はガンガンABC(AtCoder Beginners Challenge)に出ることで、Rateを順調に挙げられたかと思います。

![スクリーンショット 2024-12-02 13.25.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194385/f3c1acd0-f09c-7caf-7c61-7dca1e1af6ad.png)


# 得られた成果と思ったこと
プログラミング言語はPythonを使用していましたが、言語によらない基礎的な実装力は身についたかなと思います。
茶色に上がった段階では、まだ計算量などを検討して問題を解くことは意識できていませんが、今後も精進して、実装力を上げていければなと思います。

※ちなみに、就活をしていた当時は灰色コーダーだったのですが、面接などで聞かれることは特にありませんでした。就活のアピールポイントにするため取り組むというよりは、エンジニアとしての基礎体力向上といった名目で取り組むほうが長続きすると思います。
prependで既存メソッドを置き換える

# prependがなかったころは次のようにエイリアスメソッドを使って実現しました
```rb
irb(main):001* class Product
irb(main):002*   def name
irb(main):003*     "A great film"
irb(main):004*   end
irb(main):005> end
=> :name
irb(main):006> product = Product.new
=> #<Product:0x0000000107eb8bd0>
irb(main):007> product.name
=> "A great film"
irb(main):008* class Product
irb(main):009*   alias name_original name
irb(main):010*
irb(main):011*   def name
irb(main):012*     "<<#{name_original}>>"
irb(main):013*   end
irb(main):014> end
=> :name
irb(main):015> product.name
=> "<<A great film>>"
```
# prependを使ってエイリアスなしでメソッドの置き換えができる
```rb
irb(main):001* class Product
irb(main):002*   def name
irb(main):003*     "A great film"
irb(main):004*   end
irb(main):005> end
=> :name
irb(main):006* module NameDecorator
irb(main):007*   def name
irb(main):008*     "<<#{super}>>"
irb(main):009*   end
irb(main):010> end
=> :name
irb(main):011* class Product
irb(main):012*   prepend NameDecorator
irb(main):013> end
=> Product
irb(main):014> product = Product.new
=> #<Product:0x00000001070830b0>
irb(main):015> product.name
=> "<<A great film>>"
```
#
```rb
irb(main):001* module NameDecorator
irb(main):002*   def name
irb(main):003*     "<<#{super}>>"
irb(main):004*   end
irb(main):005> end
=> :name
irb(main):006* class User
irb(main):007*   def name
irb(main):008*     'Alice'
irb(main):009*   end
irb(main):010> end
=> :name
irb(main):011* class User
irb(main):012*   prepend NameDecorator
irb(main):013> end
=> User
irb(main):014> user = User.new
=> #<User:0x0000000111c779c0>
irb(main):015> user.name
=> "<<Alice>>"
```

# aliasなしで実行してみる
```rb
irb(main):001* class Product
irb(main):002*   def name
irb(main):003*     "A great film"
irb(main):004*   end
irb(main):005> end
=> :name
irb(main):006* class Product
irb(main):007*   # alias name_original name
irb(main):008*
irb(main):009*   def name
irb(main):010*     "<<#{name}>>"
irb(main):011*   end
irb(main):012> end
=> :name
irb(main):013> product = Product.new
=> #<Product:0x000000010c4d3f20>
irb(main):014> product.name
(irb):10:in `name': stack level too deep (SystemStackError)
```

# SystemStackError
>システムスタックがあふれたときに発生します。
>
>典型的には、メソッド呼び出しを無限再帰させてしまった場合に発生します。

* 関数nameが関数nameを呼び続けてるから無限再帰になる

# 色々やってみた
```rb
irb(main):016* class Hihi
irb(main):017*   prepend NameDecorator
irb(main):018*
irb(main):019*   def name
irb(main):020*     "bob"
irb(main):021*     "coc"
irb(main):022*   end
irb(main):023> end
=> :name
irb(main):024> hihi = Hihi.new
=> #<Hihi:0x0000000111d27f78>
irb(main):025> hihi.name
=> "<<coc>>"
```

https://gihyo.jp/book/2017/978-4-7741-9397-7
リモート環境でのOJT研修について

# はじめに
皆様、はじめまして。
テストリーダー兼テスターをしている@QA_jellyです。
普段は運用中のゲームタイトルに対して、テスト実行やテストケース作成を担当しています。
今年は新しい業務領域として、新規テスターの人材育成に挑戦しました。
本記事では、当時直面した課題や対策、そこから得た改善案などについてご紹介します。

## 研修概要
今回は別拠点にいる新規テスターを対象に、リモート環境上でOJT研修を行いました。

**実施期間**　　：半年程度
**対象メンバー**：少人数（2~3人）
**実施環境**　　：完全リモート

# 研修の実施例
新規テスターの育成において、リモート環境での研修を効果的に進めるために4つの取り組みを実施しました。
各取り組みは**コミュニケーションの質の確保**と**自己学習環境の整備**を重視して設計しています。
### 資料作成
内容：ドメイン（テスト対象）、各ツールの使用方法の資料
目的：作業効率化と独力で進められる環境

研修に必要となる2種類の資料を用意します。
ドメイン（テスト対象）の資料では、機能の全体像から細かな仕様までを整理。
ツールの使用方法は、実施の手順と注意点を含んだ構成としました。
### 質問シートの用意
内容：スプレッドシートにて、Q&A集を用意
目的：質問の可視化と展開
![質問シートサンプル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624661/7e06cf55-1fde-5fc6-974d-a8374f721ceb.png)

リモート環境での質問のしづらさを解消するため、スプレッドシートを活用したQ&A集を作成しました。
研修生からの質問とその回答を一元管理することで、同様の疑問を持つメンバー同士での共有ができます。
### 質問タイム
内容：毎日30分程度の質問タイムを設定
目的：リアルタイムでの課題の抽出と早期解決

日々の業務の中で、質問専用の時間を確保しました。
この時間では研修生が抱える疑問や課題について、リアルタイムでの解決を図ります。
### 振り返りMTG
内容：自己評価とKPT形式での振り返り
目的：進捗確認と次回への改善案抽出

定期的な振り返りミーティングでは、研修生による自己評価とKPT（Keep/Problem/Try）形式での振り返りを実施しました。
これにより、研修の進捗状況を確認するとともに、カリキュラムの改善点抽出も目指します。

# 結果と振り返り
## 成功例とその効果
### 質問シート
リモート環境では、相手の状況が見えないため、研修生の作業進捗や躓きポイントの把握が困難です。
これに対して、スプレッドシートを利用したQ&A集を導入したことで、以下の効果が得られました。
- 過去の質問履歴が学習リソースとして機能
- 同じ疑問を持つメンバーが過去の回答を参照可能
- 質問シートに記載しておくことで、躓いたときに回答を待ちながら別の作業を行える

特にテストケース進捗の定期確認と組み合わせることで、相手の状況が見えないことを解決しながら質問の可視化と共有を実現できました。

### 質問タイム
リモート環境では、相手の端末に触れないという物理的な制約がある中、毎日の質問タイムを設けたことで、以下の効果が得られました。
- 疑問の早期解決により、業務に集中できる環境を構築
- 専用の時間を設けることで、積極的なコミュニケーションを促進
- 質問タイム以外の時間でも、画面共有を活用
:::note info
操作指示の際には、ショートカットキーを活用して明確に手順を伝達
例：chromeのディベロッパーツールを開く
「右上の丸ボタンをクリックして...」→「F12キーを押してください」
:::
特に積極的に画面共有を活用することで、相手の端末に触れないことを解決しながらリアルタイムでの課題抽出と早期解決を実現できました。

## 失敗例と改善案
### 資料作成の課題
#### 失敗例
- 初心者の目線を欠いた説明構成
- 機能一覧が不足し、注意点の説明に偏重
- 基本的な操作手順の説明が省略され、実用性の低い内容
#### 改善案
- 機能ツリーやキャプチャ画像を追加し、視覚的な理解を促進（図1参照）
- 前提知識の補足資料を作成し、段階的な学習をサポート
- 基本操作から応用まで、体系的な説明構成に修正

リモート環境では、何かを教える際に目の前で実演することができません。
そのため、効率的な手順や注意点などのポイントを伝えるためには、周りに誰もいない環境でも伝わる資料を用意する必要がありました。

※図1　視覚的な理解を促進
| 改善前 | 改善後 |
|:-:|:-:|
| 目次が無く、キャプチャ画像も無い  | 目次と、キャプチャを追加  |
|![資料サンプル改善前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624661/3d6e7357-8615-3c46-4164-6d05b60facbe.png)   | ![資料サンプル改善版.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624661/ceafe4f9-3021-835e-1d1b-2d86b5422b17.png)|
### 振り返りMTG
#### 失敗例
- ファシリテーターとして緊張し、研修メンバーにも影響を与えてしまった
- 課題の議論が質問タイムと重複することが多く、MTGの意義が薄れる
- KPT形式に固執し、自由な意見が出にくい雰囲気だった

#### 改善案
- アイスブレイクの導入でリラックスした雰囲気作り
- MTGの目的を明確化し、質問タイムとの差別化を図る
- 状況に応じて異なるフレームワークを活用し、柔軟な振り返りを実施

リモート環境では、同じ空間での会議ができないため、実際に同じ場で会議をするよりも緊張が伝わりやすいです。
そのため、アイスブレイクを導入したリラックスした雰囲気作りや、声のトーンなどにも気を配る必要がありました。

# 最後に
今回初めてリモート環境でのOJT研修を担当して、**初心者視点の重要性**と**コミュニケーションの質**が最も重要でした。
初心者視点の重要性については、実際に研修生が学ぶ環境を十分に考慮する必要がありました。
また、物理的な距離が離れていることで発生するコミュニケーションの質低下については、定期的な質問タイムや質問シートが、効果的に働いていたと感じます。

これから初めて研修を担当される方やリモート研修を検討している方にとって、本記事が少しでも力になれば幸いです。
ドメインとIPアドレスとは

## ドメインとIPアドレスとは？
インターネット上で通信を行うためには、ネットワーク上の「住所」に相当する仕組みが必要です。この「住所」に当たるものがIPアドレスであり、人間が覚えやすい形に変換したものがドメイン名です。この記事では、両者の役割や仕組みについて詳しく解説します。

## IPアドレスとは？
IPアドレス（Internet Protocol Address）は、インターネット上の機器を一意に識別するための番号です。
インターネットで通信するためには、送信元と送信先のIPアドレスが必要になります。
（郵便や宅急便でも送り元と送り先が必要なのと同じイメージ）

## IPアドレスの種類
### IPv4
形式: 192.168.1.1 のような「ドットで区切られた4つの10進数」
特徴: 32ビットで構成され、約43億個のアドレスが利用可能
課題: **アドレスの枯渇が問題になっている**

### IPv6
形式: 2001:0db8:85a3:0000:0000:8a2e:0370:7334 のような「16進数とコロンを使用した形式」
特徴: 128ビットで構成され、ほぼ無限のアドレスを提供可能
メリット: セキュリティやパフォーマンスが向上

ちなみにGoogle社がIPv6の利用率を統計で算出してくれています
記事投稿時点(2024/12)では世界的には約46%の利用率だそうです。（日本は51.2%)

https://www.google.com/intl/ja/ipv6/statistics.html

### IPv6でなぜセキュリティやパフォーマンスが向上するのか
- セキュリティ向上
    - IPv6はIPsec（IP Security）を標準でサポートしている
        - IPsecは、データの暗号化と認証を行い、安全な通信を実現するプロトコル
    - IPv4ではアドレス枯渇問題を解決するためにNATが使われていたが、IPv6はNATがなくとも十分なアドレス空間があるので不要となる。→シンプルなネットワーク構成になる
    - IPv6のヘッダー構造は柔軟で、セキュリティ関連の拡張を容易に追加できる
- パフォーマンス向上
    - IPv6のパケットのヘッダは、IPv4に比べて構造がシンプルなため、パケットの処理速度が高い
    - 前述の通りNATの処理が不要となる

## ドメインとは？
ドメイン名は、IPアドレスを人間が扱いやすい形に変換したものです。例えば、192.168.1.1 のような数字の列を覚える代わりに、example.com のような文字列を使えます。

### ドメイン名の構造
ドメイン名は階層構造になっており、右から左に向かって特定されます。 例: www.example.com

.com: トップレベルドメイン（TLD）
example: セカンドレベルドメイン
www: サブドメイン

### ドメイン名の役割
識別性: サービスや企業を表す分かりやすい名前を提供
利便性: 数字よりも覚えやすい
柔軟性: IPアドレスが変わっても、ドメインを変更する必要はない（後述のDNSの仕組みで解決）

## ドメインとIPアドレスを結びつける仕組み: DNS
DNS（Domain Name System）は、ドメイン名を対応するIPアドレスに変換する仕組みです。
これにより、ユーザーは「www.example.com」と入力するだけで、対応するサーバーにアクセスできます。

### DNSの流れ
1. ユーザーがブラウザでwww.example.comを入力
2. ブラウザがDNSサーバーに問い合わせを行う
3. DNSサーバーが対応するIPアドレス（例: 192.0.2.1）を返す
4. ブラウザがそのIPアドレスにアクセス

## ドメイン名の取得と管理
### ドメイン名の取得方法
1. ドメインレジストラ（例: お名前.com、GoDaddy）で希望の名前を検索し、利用可能であれば購入
2. 購入後、利用するサーバーのIPアドレスと紐付ける設定を行う（DNS設定）

### 管理上の注意
- 有効期限が切れないように更新を忘れない
- ブランドに関連したドメイン名を先に確保する
    - 基本的には早いもの勝ちなので

## まとめ
IPアドレス：インターネット上でデバイスを識別するための「住所」
ドメイン名：IPアドレスを覚えやすくした「名前」
DNS：両者を橋渡しする重要な仕組み
推薦システムにおける新規性に関して、考えてみませんか？

:::note info
🎄 本記事は [ZOZO Advent Calendar 2024](https://qiita.com/advent-calendar/2024/zozo) シリーズ 2 の 2 日目です。
推薦基盤ブロックの1日目の記事は 荒木さんによる [強化学習で作る最強のCCレモンAI~ルール編~](https://zenn.dev/imiko/articles/f5e42a629a7d93)でした。
:::

# はじめに
こんにちは！スミスと申します。

皆さん、ECサイトや動画配信サービスで「同じような商品や動画ばかりで飽きてしまった」という経験はありませんか？
その結果、別のプラットフォームに移行してしまった…なんてこともあるかもしれません。

こうした課題を解決するために、推薦システムでは 新規性 という指標が注目されています。
新規性を測定し、それを改善することで、ユーザーが新しい発見を楽しみながら、同じプラットフォームを継続して利用してくれるようにする狙いがあります。

今回は、この新規性について、これまでの研究をサーベイしてみました。
紹介する内容は比較的古典的な論文やシンプルな指標が中心なので、スッと読みやすいと思います！
ぜひご一読いただき、新規性について一緒に考えてみませんか？

<iframe src="https://docs.google.com/presentation/d/e/2PACX-1vTDjg4f0eGshItk89mwqMPW3g9aOEVviWtM6I9Zc33F6wWohmjYozndcQkCi3oKwB5b5NrbiS-ZS2O8/embed?start=false&loop=false&delayms=3000" frameborder="0" width="1440" height="839" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true"></iframe>
Hyper-Vで内部仮想スイッチを作成したがNATで疎通できないときのチェックリスト

## はじめに
この記事は、NTTテクノクロス Advent Calendar 2024 シリーズ1の8日目の記事になります。
NTTテクノクロスの宮崎です。この記事はHyper-Vで内部仮想スイッチを使用して仮想マシンをネットワークに接続する際、接続がうまくいかなくてつらいときに見る対処法一覧です。
ホストOSとゲストOSの両方で発生したありがちな問題とその対処法を紹介します。

## 対象：
HyperVを使用しているが、会社のネットワーク的に仮想マシンのIPアドレスが見えてはいけなくて、Hyper-Vで内部スイッチを設定してNATを行おうとしている人向け。

## 環境
- ホストOS: Windows10
- ゲストOS: Ubuntu Desktop 22.04(LTS)


 
## 問題点1: ホストOSのWinNATの問題
 
### 現象
 
- **問題**: WinNATの調子が悪くなり、NATが機能しなくなる。
- **詳細**:ホストマシンで `Get-NetNat`コマンドで確認すると、`Active`フィールドが`False`になっており、NATが削除できない状態になる。
 
### 対処法
 
1. **レジストリキーの削除**:
   - レジストリエディタを開き、以下のキーを削除する。
   - `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\FirewallRules`
 
2. **NATの再作成**:
   - WinNATを削除し、新しく作り直す。
 
   ```powershell
   Remove-NetNat -Name "NAT-NW01"
   New-NetNat -Name "NAT-NW01" -InternalIPInterfaceAddressPrefix "192.168.0.0/24"
   ```
 
### 参考リンク
 
- [開発メモ その257 WinNATが削除できない · A certain engineer "COMPLEX"](https://taktak.jp/2022/04/29/4416/)
- [Set up a Hyper-V Virtual Switch using a NAT Network - Thomas Maurer](https://www.thomasmaurer.ch/2016/05/set-up-a-hyper-v-virtual-switch-using-a-nat-network/)

## 問題点2: ゲストOSの接続問題

### 現象

- **問題**: 以前は接続できていたゲストマシンが接続できなくなった。
- **詳細**: `nmtui`や`Advanced Networkmanager`から設定を変更しようとしたが、変更が反映されない。`ip addr show`で確認すると、現在のIPアドレスが反映されるべき設定と異なる。

### 対処法

1. **新しいゲストマシンの作成**:
   - 同様の設定で新しいゲストマシンを作成し、接続を確認する。

2. **ネットワーク設定の確認とリセット**:
   - `ip addr show`コマンドで現在のIPアドレスを確認し、設定が反映されているか確認。

   ```bash
   ip addr show
   ```

3. **NetworkManagerの設定リセット**:
   - 設定ファイルを削除してネットワーク設定を初期状態に戻す。

   ```bash
   sudo rm /etc/NetworkManager/system-connections/*
   ```

4. **NetworkManagerの再起動**:
   - 設定ファイルを削除した後、NetworkManagerを再起動して新しい設定を適用する。

   ```bash
   sudo systemctl restart NetworkManager
   ```

5. **ネットワークインターフェースのリセット**:
   - ネットワークインターフェースをリセットして、再度有効化する。

   ```bash
   sudo ip link set dev <インターフェース名> down
   sudo ip link set dev <インターフェース名> up
   ```


---

### 問題点3: netplan設定が反映されない問題

#### 現象

- **問題**: netplanで設定したネットワーク設定が反映されず、手動で設定を行う必要がある。
- **詳細**: `/etc/netplan/10-network-manager.yaml`に設定を記述しても、`netplan apply`を実行しても設定が反映されない。

#### 対処法

nmtuiを使用してネットワーク設定を行う手順は以下の通り。
nmtui is これ。
![nmtui.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590828/80867b0d-4853-39a2-2ffd-ae2b53ece23d.png)


1. **ターミナルを開き、nmtuiコマンドを実行。**

   ```bash
   sudo nmtui
   ```

2. **ネットワーク接続の編集:**

   - nmtuiのメニューから「Edit a connection」を選択します。
   - 設定したいネットワークインターフェース（例: `eth0`）を選択し、「Edit」を選択します。

3. **IPアドレスの設定:**

   - 「IPv4 CONFIGURATION」セクションで「Manual」を選択。
   - 「Addresses」に`192.168.137.55/24`（適宜変更）を入力。
   - 「Gateway」に`192.168.137.1`（ホストマシンのIPアドレスに適宜変更）を入力。
   - 「DNS servers」に`192.168.137.1`（会社のDNSなどに適宜変更）を入力。

4. **設定の保存と適用:**

   - 設定を保存し、nmtuiを終了。
   - 設定を適用するために、ネットワークインターフェースを再起動する。

   ```bash
   sudo systemctl restart NetworkManager
   ```

5. **設定の確認:**

   - 設定が正しく反映されているか確認する。

   ```bash
   ip addr show
   ```


---

この記事が皆さんのネットワークトラブル解決の一助となればHAPPY。いろんな記事見て設定したけど、全然開通できなくてとてもつらかったので、そういう目にあう人を減らしたいです！
何か質問があればコメントでお知らせください。
[crypto] 6 3 4 RSA (SH365CTF) writeup

---

- Source: SH365CTF
- Author: [hiikunZ](https://x.com/hiikun_Z)

 ※ SH365CTFは[SecHack365](https://sechack365.nict.go.jp/)（2024 4th Event Week）にて、有志によって非公式に開催されたCTFです。

---

ヒント付きRSAの問題。

<details><summary>6_3_4_RSA.py</summary>

```py
from Crypto.Util.number import bytes_to_long, getPrime
import os

flag = os.getenv("FLAG", "SecHack365{DUMMY_FLAG}").encode()

p = getPrime(256)
q = getPrime(256)
n = p * q
e = 0x10001
m = bytes_to_long(flag)
c = pow(m, e, n)
print(f"n = {n}")
print(f"e = {e}")
print(f"c = {c}")

m2 = p * 63 + q * 4
c2 = pow(m2, e, n)
print(f"c2 = {c2}")

m3 = p * 6 + q * 34
c3 = pow(m3, e, n)
print(f"c3 = {c3}")
```

</details>

n, e, cの他、c2, c3が与えられている。
```
n = 8787853186604501465350440400554867782683216927926017112267287590780322575979212002323860584291544916443498557046604413617496140916981417512780552626597057
e = 65537
c = 6994703800679360207351562852610768968758729109353781576204971881715149388015793249124620755345161501651173676074901239500988866504240518770986069965529302
c2 = 6385814305925723080682880515729304169424155137644522369442741557055936719078382330339372646166228859072058894989677178856926023196039446519300197152837681
c3 = 644703175078956118713579365177642398682242507389616543933739174119564639977801086892890065740791849826185480118205694510645997115106095875550962657999393
```

```math
\displaylines{
c2 ≡ (63p+4q)^{e} \qquad (mod \: n)
\\
c3 ≡ (6p+34q)^{e} \qquad (mod \: n)
}
```

c2, c3からp, qを復元したい。

以下、mod n の世界で考える。n = pq より、mod n の世界においてpqを含む項は全て0となるので、
```math
\displaylines{
c2 ≡ (63p+4q)^{e} ≡ 63^{e}p^{e}+4^{e}q^{e}
\\
c3 ≡ (6p+34q)^{e} ≡ 6^{e}p^{e}+34^{e}q^{e}
}
```

が得られる。開催期間中はここで詰まってしまったので、ここからはupsolveとなる。

ここからqを消去する。c2の式は
```math
\displaylines{
q^{e} ≡ (c2-63^{e}p^{e}) / 4^{e}
}
```
と変形できるので、これををc3の式に代入して、
```math
\displaylines{
c3 ≡ 6^{e}p^{e}+34^{e}(c2-63^{e}p^{e}) / 4^{e}
\\
(34^{e}63^{e} - 4^{e}6^{e}) p^{e} ≡ 34^{e}c2 - 4^{e}c3
}
```

が得られ、この式の右辺はpの倍数であることが十分に期待できる。よって、n = pq との最大公約数を求めることでpが求まる。

あとは復号するだけ。
```py
import math
from Crypto.Util.number import long_to_bytes

n = 8787853186604501465350440400554867782683216927926017112267287590780322575979212002323860584291544916443498557046604413617496140916981417512780552626597057
e = 65537
c = 6994703800679360207351562852610768968758729109353781576204971881715149388015793249124620755345161501651173676074901239500988866504240518770986069965529302
c2 = 6385814305925723080682880515729304169424155137644522369442741557055936719078382330339372646166228859072058894989677178856926023196039446519300197152837681
c3 = 644703175078956118713579365177642398682242507389616543933739174119564639977801086892890065740791849826185480118205694510645997115106095875550962657999393

a = 34**e
b = 4**e

p = math.gcd(a*c2 - b*c3, n)
q = n // p
assert p*q == n
print(f"p = {p}")
print(f"q = {q}")

phi = (p - 1) * (q - 1)
d = pow(e, -1, phi)

m = pow(c, d, n)
flag = long_to_bytes(m)
print(f"flag: {flag.decode()}")
```

flagが得られた。
`SecHack365{don't_3ncrypt_f4ctors_relat3d_number5_in_RSA!}`
エンジニアのための分報チャンネル活用術 ～SECIモデルで知識共有を深化させよう～

### 分報チャンネル、使いこなせていますか？
SlackやDiscord、Teamsなどで「作業進捗」や「学び」を共有する場として分報チャンネルを活用しているチームも多いと思いますが、そのポテンシャルを最大限引き出すための工夫はまだまだあります。今回はSECIモデル（共同化・表出化・連結化・内面化）を基に、分報チャンネルをさらに価値ある場に変える方法を解説します！

:::note warn
ここではSECIモデル自体については詳しく触れていません。
:::

---
### 分報チャンネルを活かす4つのポイント
#### 1. 共同化: 日々の気づきを共有しよう
「共同化」とは、メンバー同士で経験や暗黙知を共有することです。
分報チャンネルでは、小さな気づきや作業の進捗、困りごとをリアルタイムで共有するのが鍵となります。特に暗黙的な学びをその場で共有することで、他のメンバーが新たな視点を得るきっかけになります。

具体例

「OOでエラー発生、XXを調査中」
「今日、新しいライブラリを試してみたら、依存関係の解決が楽になりました！」
「デプロイのエラー、こうやって解決しました（スクショ付き）」
「レビューの際に指摘された○○について調べた結果、こう理解しました！」

:::note
ヒント
・今日の作業で一番やりがい、成長を感じた瞬間
・トラブル解決の際に、どの判断基準が役立ったか
:::

#### 2. 表出化: 暗黙知を言語化する
暗黙知とは、「なんとなくわかるけど、うまく言葉にできない知識」です。これを言語化して共有することが「表出化」。分報チャンネルでは、自分の経験や考えを他人に伝わる形で説明する練習をするのに最適です。

具体例

「バグを修正する際、まず○○を確認すると効率的でした！」
「このロジック、△△がポイントなので、新人さんにはここを説明すると良さそうです。」

:::note
ヒント
・「もし新人に説明するなら？」と言った視点など、他者の視点を意識して書いてみる
・その方法を新人にもわかりやすく説明するとしたら、どんなポイントを強調するか
・初めてその方法を説明したとき、どんな言葉を使うか
:::


#### 3. 連結化: 過去の知見とつなげる
「連結化」は、過去の自分の経験、メンバーの分報や他部署の知識を組み合わせて、新たなアイデアを生み出すプロセスです。
分報チャンネルを検索して似たケースや過去の議論を振り返る習慣を持つことで、より深い知識を得られます。

具体例

「去年のプロジェクトで使った○○のコード、今回の要件にも使えそう」
「この方法、別のチームの事例を参考にしています。」

:::note 
ヒント
・これまでの経験や分報の中で、今やっているプロジェクトと似ていることはないか
・他部署や他チームのやり方で取り入れられることは？
:::

#### 4. 内面化: 分報を実践につなげる
最後は「内面化」。分報で得た知識を、実務に応用して自分のスキルとして吸収することです。重要なのは、共有された知識を「試してみる→振り返る→学ぶ」というサイクルを回すこと。

具体例

「分報で共有された手法を試した結果、こんな発見がありました！」
「あの時のアドバイスを応用してみましたが、さらに効率的にするにはこうしたら良さそうです。」

:::note 
ヒント
・分報で共有された方法を試してみた結果、予想外の発見はありましたか？
・実際に使ってみたとき、どんな工夫が役立ちましたか？
:::

### モチベーションを維持する工夫
分報チャンネルを活発にするには、心理的安全性を確保し、メンバーが気軽に投稿できる雰囲気を作ることが大事です。

#### 感謝やポジティブなフィードバックを意識する
「○○さんの投稿、すごく参考になりました！」といった一言で、投稿するハードルがぐっと下がります。

#### 共感を生むテーマや定期的な振り返りを設ける
「今週のベスト分報を選ぶ」
「分報に投稿されたTipsを月1でまとめる」
こうした取り組みで分報の価値をチーム全体に浸透させることができます。（やりたい）

## まとめ: 分報チャンネルを知識共有のエンジンに
分報チャンネルは、ただの進捗報告の場ではなく、知識共有とチームの成長を促す強力なツールです。SECIモデルの各段階（共同化・表出化・連結化・内面化）を意識して運用することで、チームの学びと生産性が飛躍的に向上します。

ぜひ、今回紹介したポイントを取り入れて、あなたのチームの分報チャンネルを「学びの場」に進化させてみてください！
また他にもこんなことしているよ！みたいなのをぜひコメントで教えてください！
クライアント・サーバー方式とは

## 概要
クライアントサーバー方式（Client-Server Model）は、コンピュータネットワークにおける分散システムの設計パターンの一つです。この方式では、クライアント（client）とサーバー（server）という2つの役割に分かれたデバイスが通信を行い、それぞれ特定の役割を果たします。

反対に、情報を一元管理するサーバーが存在せず、ネットワークに接続している端末同士で直接データの検索や転送を行う方式をP2P(Peer to peer)方式と言います。P2Pでは、1つの端末がクライアントとサーバーの両方の役割を担っています。具体的には、情報を所持している端末がサーバーの役割をするのに対して、情報を必要としている端末がクライアントとなり、サーバー役の端末に対してデータの検索要求を行います。LINEの一部の機能や、仮想通貨のブロックチェーンによる台帳システムなどで使われています。

## クライアントとサーバーの役割
### クライアント
- ユーザーの入力やリクエストを処理する
- サーバーにデータやサービスを要求する
  - 例: Webブラウザ、モバイルアプリ、デスクトップソフトウェア

### サーバー
- クライアントからのリクエストを受け取り、適切なレスポンスを返す
- データベースやファイルストレージ、アプリケーションロジックを提供する
  - 例: Webサーバー（Apache, Nginx）、データベースサーバー（MySQL, PostgreSQL）

## クライアントサーバー方式のメリット
1. 集中管理
サーバー側でデータやアプリケーションを一元管理できるため、メンテナンスが容易
2. セキュリティ
基本的にクライアント側にはデータを保存せず、サーバー側で管理するため、情報漏洩のリスクを低減
3. スケーラビリティ
サーバーのリソースを強化することで、多数のクライアントに対応可能。
4. 柔軟性
異なるプラットフォームやデバイス間での通信が可能。

## クライアントサーバー方式のデメリット
1. サーバーへの依存
サーバーがダウンすると、システム全体が停止する可能性がある。
2. スケールコスト
大量のリクエストを処理するために、サーバーのリソース増強が必要になる。
3. ネットワークへの負荷
通信が増えるとネットワーク帯域に影響を与える可能性がある。

## 実構成例
### Webアプリケーション
クライアント: Webブラウザ
サーバー: Webサーバー + データベースサーバー

### メールシステム
クライアント: メールソフト（Outlook、Thunderbird）
サーバー: メールサーバー（SMTP、IMAP）

### オンラインゲーム
クライアント: ゲームアプリ
サーバー: ゲームサーバー


## クライアントサーバー方式とP2P方式の比較
| 特徴 | クライアントサーバー方式 | P2P方式（ピアツーピア） |
|:-----------|:------------|:------------|
|構造|サーバーが中心|各デバイスが対等(中心がいない)|
|メンテナンス性|高い|低い|
|可用性|サーバー依存|ピアが多いほど高い|
|セキュリティ|サーバーに集中管理可能|各ピアに依存|
|使用例|Webアプリケーション|ブロックチェーン|

## 昔はどうだったのか
1970年代頃までは、少数のコンピュータ(メインフレーム)に計算機資源を集中させ、 それを一つあるいは複数の通信専用端末(ターミナル)から利用するということが行われていました。しかし、コンピュータの低価格化やネットワークの普及によって、 複数のコンピュータで分業した方がトータルコストが低くなることが多くなってきたため、現在ではクライアントサーバー方式が広く普及しています。

## まとめ
クライアントサーバー方式は、アプリケーション設計の基盤であり、Webアプリケーションやクラウドサービスを支える重要なアーキテクチャです。一方で、サーバー依存やスケーラビリティにおける課題も存在するため、用途に応じた設計が必要となります。

## 参考文献
https://www.nic.ad.jp/ja/basics/terms/client-server-system.html
https://wa3.i-3-i.info/word12356.html
レトロPCのためのBASIC講座２　代入演算子

# 数値を記録して使う（変数）
電卓で計算結果を利用したい場合、[M]キーを押して記憶、[+M]キーで記憶した値にプラスするという使い方をしますが、BASICでは数値を記録するために変数というものを使います。

変数にはBASIC命令を除いた、任意の名前をつけることができます。
前回作ったプログラムはPRINT命令の後ろに書かれた２つの数値の足し算結果を表示するというものでしたが、この数値の部分を変数に置換えると固定された数値ではなくなるので少し便利に使えます。

# 代入演算子
では変数に値を記録するにはどうすればいいかというと
S1＝10[ENTER]
でS1という名前の変数に値１０を記録します。
ここで＝という記号は、＝の左にあるS1という名前の変数に、右側にある値の１０を代入（記憶させる）するため代入演算子と呼ばれます。
数学で使う＝とは意味が違うので注意が必要です。

では、[前回](https://qiita.com/kawamo55/items/ffb2e9c4173f7b2a3bd1)書いたプログラムは
10 PRINT 1+2
でしたが今回は、
10 PRINT S1+S2
というプログラムに書き換えます。

# 実行してみよう！
つぎに、
S1=1[ENTER]
S2=2[ENTER]
と打ち込んで実行
RUN[ENTER]
すると・・・
０と表示されたかと思います
これは、RUNコマンドを実行すると変数は０に初期化されるというルールがあるためです。
これを回避するために
S1=1[ENTER]
S2=2[ENTER]
GOTO 10[ENTER]
とすれば、正常に実行されます。
ここで出てきたGOTO命令は後ろに指定された行番号から実行するという命令です。

# 今回の操作動画
https://youtu.be/3jdg5l1GMKI
Arch Linuxのzshをいい感じにする

zsh-syntax-highlighting、zsh-autosuggestionsを導入します。
これをいれるとめちゃくちゃターミナルが使いやすくなります。

Arch派生のAlter Linuxにはデフォルトで入っているのですが、初めてAlter Linuxを使った時は感動しましたね

# インストール
```
sudo pacman -S zsh-syntax-highlighting zsh-autosuggestions
```
以下を.zshrcに追記します。
```
source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
source /usr/share/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh
```
ターミナルを再起動しましょう。

# おわり
ターミナルがいい感じになったことを確認します。
React Nativeでスワイプジェスチャーを実装する際の課題と解決策

## はじめに
React Nativeアプリでスワイプジェスチャーを実装する際、アプリがクラッシュしたり、ステートが正しく更新されないといった問題に直面することがあります。本記事では、スワイプジェスチャーを用いて画像を左右に切り替える際の課題とその解決策について解説します。

## 問題の背景
スワイプジェスチャーを実装する際、以下のような課題が発生しました。

### Reactの状態更新の非同期性
- 状態(state)が更新される前に古い値を参照してしまう。
- 状態が適切に更新されず、スワイプが正しく機能しない。

### UIスレッドとJSスレッドの分離
- React Native Gesture HandlerとReanimatedを組み合わせた際、JSスレッドで状態更新を行おうとするとエラーが発生する。

### スワイプ可能範囲の制限
- 最初の画像では右スワイプを無効化、最後の画像では左スワイプを無効化する必要があった。

## 解決策
### 1. 状態更新の適切な管理
Reactの状態(state)は非同期で更新されるため、最新の値を確実に取得するにはuseRefを利用して状態を保持するのが有効です。以下のコードは、この問題を解決した例です。


```
import { Gesture } from "react-native-gesture-handler";
import { useRef } from "react";
import { runOnJS } from "react-native-reanimated";

const currentPageRef = useRef(0); // ページ番号を保持

const swipeGesture = Gesture.Pan()
  .onEnd((event) => {
    console.log("Gesture ended, translationX:", event.translationX, currentPageRef.current);

    // 右スワイプ (前の画像へ移動)
    if (event.translationX > 100 && currentPageRef.current > 0) {
      console.log("Swiped Right@@@", currentPageRef.current);
      currentPageRef.current = Math.max(currentPageRef.current - 1, 0); // 0以下にならないよう制御
      runOnJS(setCurrentPage)(currentPageRef.current); // Reactの状態を更新
    } 
    // 左スワイプ (次の画像へ移動)
    else if (event.translationX < -100 && currentPageRef.current < tutorialImages.length - 1) {
      console.log("Swiped Left@@@", currentPageRef.current);
      currentPageRef.current = Math.min(currentPageRef.current + 1, tutorialImages.length - 1); // 範囲外にならないよう制御
      runOnJS(setCurrentPage)(currentPageRef.current); // Reactの状態を更新
    }
  });
```

### 2. UIスレッドとJSスレッドの分離
React Native Gesture Handlerでジェスチャーイベントを処理する場合、UIスレッドとJSスレッド間の通信が必要です。状態を直接UIスレッドから更新することはできないため、ReanimatedのrunOnJSを利用してJSスレッドでReactの状態を更新します。

```
runOnJS(setCurrentPage)(newPage); // newPageをJSスレッドで更新
```

## 実装結果
上記の解決策を適用した結果、スワイプジェスチャーの問題を解決することができました。スワイプ時に画像が適切に切り替わり、最初と最後の画像でスワイプが無効になることも確認できました。

## まとめ
本記事では、React Nativeアプリでスワイプジェスチャーを実装する際の課題とその解決策について解説しました。特に、以下のポイントが重要です。

- 状態管理にはuseRefを活用し、非同期性の影響を受けにくくする。
- UIスレッドとJSスレッド間の通信にはrunOnJSを利用する。


このアプローチは、他のReact Nativeプロジェクトでも再利用可能な汎用的な方法です。この記事が、同様の課題を抱えるエンジニアの参考になれば幸いです。
【超シンプルでモダンなWBS WebAppを作る】構想・設計編

## 背景・目的
スプレッドシートやプロジェクト管理ツールでのタスク管理に飽きました。
おしゃれじゃなくていい。シンプルであってほしい。
個人開発で儲けを（ほぼ）考えないからこそできる最高にシンプルなWBS Webアプリを作ってやろうじゃないか。ということでやっていきます。

私はReact大好きマンなのでNext.jsを使っていきます。
バックエンドどうしようかなぁと思っていましたが、ちょい昔にprismaとsupabaseでなんかいい感じに（それこそシンプルに）実装を進められた記憶があるのでそれを使っていこうかなと。

作るものがシンプルなら開発環境もシンプルでありたいのだ。

## 【開発環境・技術スタック】
FE：Next.js（React18 , TypeScript, Next.js15）
ORM：prisma
DB：Supabase
Deployment：Vercel
UIコンポーネント：MaterialUI（要検討）
VCS：git
VCS Hosting：GitHub
デザインツール：Figma
（API設計ツール：Swagger）※やらないかも

コンポーネント設計にはFigma + Storybookを使用する予定 ※やらないかも

## 【機能要件】
### 「プロジェクト管理機能」
#### 要素：
・プロジェクト名
・削除フラグ
・完了フラグ
（・プロジェクト完了予定日）
（・プロジェクト予想工数）
（・プロジェクト実績工数）
（・プロジェクト予算）

#### 説明：
タスクを分類するためのプロジェクト
プロジェクトは複数のタスクを持つ
括弧で囲まれている要素は最終的に実装予定ではあるが、初期リリース時点では含めない要素
サイドバーに表示される
プロジェクトに関する作成や編集は独自の画面を持たない（モーダルやインライン編集などで管理する）
削除機能は物理的に削除されず、削除フラグによって実現される（復元可能な形にする）

### 「タスク機能」
#### 要素：
・完了フラグ
・タスク名
・完了予定日
・プロジェクトID(belongs_to プロジェクト)
・削除フラグ
（・カテゴリ）
（・備考）
（・タスク予想工数）
（・タスク実績工数）

#### 説明：
タスクは作成・編集・照会・削除の機能をもつ
タスクは一つのプロジェクトを持つ
括弧で囲まれている要素は最終的に実装予定ではあるが、初期リリース時点では含めない要素
タスク一覧またはガントチャートで表示される
削除機能は物理的に削除されず、削除フラグによって実現される（復元可能な形にする）

### 「その他・非機能要件」
・初期リリース時点は認証機能を持たないが、最終的に実装予定
・将来的にはシンプルなタスク管理ツールとして公開予定
・想定ブラウザはChrome
・想定デバイスはPC & SP（TBは非要件）

## 【画面・コンポーネント項目】
・プロジェクト & ガントチャート画面
プロジェクト全体の進捗状況と、タスクがガントチャートになっている画面が表示される
できれば月・週・日で表示範囲を変更できるようにしたい
ここの画面から直接タスクのCRUDをできるようにする
日付が登録されていないタスクは別の場所（画面下部など）に保管、そこからドラッグ&ドロップで好きな日付にタスクを登録できるようにする

・サイドバーコンポーネント（プロジェクトの一覧が常に表示されている、開閉可能）
サイドバーの「プロジェクト追加」ボタンからプロジェクトが追加できる

（・ダッシュボード画面：実績工数や予算、全プロジェクトの解析情報などをダッシュボードとして表示）
（・プロジェクト設定画面：プロジェクトにあるタスクは工数や予算を持つかどうか、プロジェクト自体の予算や完了予定日はいつか、などを設定できる画面）

※括弧で括られている画面は後ほど実装予定

## 【スケジュール】
・4日程度で完成できる予定

## 【プロジェクト規模】
・私一人！！（夜や週末で頑張る）

## 【予算】
・0円（利用する全てのサービスの無料枠で初期リリースまでは持っていく）

## 【制作進行管理】
・スプレッドシート

## 【主な制作方針】
1. 画面・コンポーネント設計
2. API設計・DB設計
3. 開発環境構築
4. FE開発
5. API構築
6. 統合
7. テスト・検証・修正・調整
8. デプロイ・リリース 

ということでやっていきます。
次回は画面設計編〜
TDbasedUFE/TDbasedUFEadvの紹介

私は長年「[テンソル分解を用いた教師無し学習による変数選択法](https://qiita.com/Yh_Taguchi/items/ce6acecc2e3007eba2fe)」というものを展開してきた。この９月にはシュプリンガー社からその成果を５００頁の[ハードカバー](https://doi.org/10.1007/978-3-031-60982-4)で出すことができた。
    
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199087/5efb4490-7b26-e4e6-6a17-0f02ea67283e.png)
この方法を誰でも簡単に使えるように２つのBioconductorパッケージを公開している。[TDbaseduFE](https://doi.org/doi:10.18129/B9.bioc.TDbasedUFE)と[TDbaseduFEadv](https://doi.org/doi:10.18129/B9.bioc.TDbasedUFEadv)である。

TDbasedUFEの方は遺伝子発現プロファイルなど単一のプロファイルの解析、または基本的なマルチオミックス解析に特化しており、TDbasedUFEadvの方はより複雑なもっと高度な目的に適応している。
前者については[解りやすい解説](https://qiita.com/Kazari_Kei/items/ceb8bf8b5570e7179e61)を昔の学生さんが書いてくれた。ここで屋上屋を重ねるのもあれなので、ここはその説明を見てください。
なんだか中身のない、ただの宣伝記事になってしまいましたが、ご勘弁ください。
LeetCodeを1日1題解いてみる (day33)

33日目に取り組んだ問題はこちら！

# 145. Binary Tree Postorder Traversal

https://leetcode.com/problems/binary-tree-postorder-traversal/description/

## 問題文
Given the root of a binary tree, return the postorder traversal of its nodes' values.

## 僕の回答 (GPTの回答)
```py
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        if not root:
            return []

        stack = [root]
        result = []

        while stack:
            node = stack.pop()
            result.append(node.val)

            if node.left:
                stack.append(node.left)
            if node.right:
                stack.append(node.right)

        return result[::-1]
```

## より効率の良い回答例
特になし

## コメント
右から探索して反転させるということが思いつかなかった。前問のコードを活用すれば良いとは思ったが、具体的な変更内容がわからなかった。

## 次の問題はこちら!
https://qiita.com/h_y_s_d/items/7ea4e9362e87770998b0
HivePress の落とし穴：日本円での Transfer 問題とその解決方法

## HivePress の落とし穴：日本円での Transfer 問題とその解決方法

HivePress は、WordPress によるマーケットプレイスの構築を簡単にする便利なプラグインです。しかし、日本円（JPY）を利用する場合に思わぬ問題が発生することがあります。この記事では、その問題の詳細と解決方法をご紹介します。
サイトURL -> https://hivepress.io

### 問題の概要
HivePress の設定に不備があると、日本円（JPY）を使用した場合に Stripe を通じた Transfer（送金）が正常に行われない場合があります。

この原因は、HivePress が Transfer の際に金額（amount）を 100 倍にして処理していることです。日本円では整数単位で金額を指定する必要があるため、この設定ミスが残高不足を引き起こし、送金エラーとなります。

### 解決方法：カスタムコードの追加

この問題を解決するには、以下のコードを WordPress テーマの functions.php ファイルに追加します。このコードは、Transfer 処理の際に金額の単位を正しく調整するものです。

## 修正コード
```PHP themes/functions.php 
add_filter( 'hivepress/v1/components/stripe/create_transfer', 'custom_modify_transfer_args', 10, 1 );

function custom_modify_transfer_args( $transfer_args ) {
    // 変更前の $transfer_args をログに出力する
    error_log( 'Before modification: ' . print_r( $transfer_args, true ) );

    // 日本円の場合の金額を修正
    if ($transfer_args['currency'] == 'JPY') {
        $transfer_args['amount'] = round($transfer_args['amount'] * 0.01);	
    }

    // 変更後の $transfer_args をログに出力する
    error_log( 'After modification: ' . print_r( $transfer_args, true ) );
  
    return $transfer_args;
}

```

コードの解説

1. フィルターフックの追加
add_filter を使用して、HivePress の create_transfer コンポーネントをフックします。これにより、送金データをカスタマイズ可能になります。
```PHP
add_filter( 'hivepress/v1/components/stripe/create_transfer', 'custom_modify_transfer_args', 10, 1 );
```
2. 金額の調整
currency が日本円（JPY）の場合、金額（amount）を 0.01 倍して調整します。これで正しい整数値が送信されるようになります。
```PHP
if ($transfer_args['currency'] == 'JPY') {
    $transfer_args['amount'] = round($transfer_args['amount'] * 0.01);	
}
```
3. ログの追加
エラーが発生した場合やデバッグが必要な場合のために、処理前後のデータをログに出力します。
```PHP
error_log( 'Before modification: ' . print_r( $transfer_args, true ) );
error_log( 'After modification: ' . print_r( $transfer_args, true ) );
```

### 動作確認

コードを追加した後、テスト環境で実際に送金処理を行い、エラーが解消されたことを確認してください。特に、送金金額が正しく計算され、日本円での Transfer が成功することを確認することが重要です。

### まとめ

HivePress の日本円対応における不具合を解決するために、少しのカスタマイズが必要です。このコードを導入することで、日本円での送金エラーを防ぎ、スムーズな送金処理を実現できます。

問題解決の参考になれば幸いです。もし不明点や別の方法がありましたら、ぜひコメントで教えてください！

いいねしてもらえるととても励みになります🙇‍♂️🙇‍♂️🙇‍♂️
【Rails】【devise】パスワードの文字数についてのエラーメッセージが余分に出力されてしまう

### はじめに
* 以下の記事を参考に**deviseを使用するモデルに直接記述する方法**で適用した際に遭遇した現象についてまとめました

https://qiita.com/hirokihello/items/862284c60429be5e01cd

* 冒頭に紹介した記事には以下の2種類の方法が紹介されており、**私は後者の 2. の方法を実施しました**
    * 2．devise を使用するモデルに直接記述する方法

---
# 概要
* devise を使用するモデルにだけ文字数に関するバリデーションを適用した
    * すると２つのバリデーションエラーのメッセージが確認された

```ruby:config/initializers/devise.rb
# ==> Configuration for :validatable
# Range for password length.
config.password_length = 6..128
```

```ruby:app/models/user.rb
devise :validatable, password_length: 8..128
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518714/792bb6cd-800e-934e-3ec8-0c4777b0d941.png)

:::note warn
* `app/models/user.rb` ファイルと `config/initializers/devise.rb` ファイルのそれぞれのバリデーションエラーが表示されていると思われる
    * そこで両方ともにバリデーション内容は統一しなければならないと考えた
:::


# 修正後
* `app/models/user.rb` ファイルにも `config/initializers/devise.rb` ファイルにも同じ文字数で設定を施した
    * 結果としてエラーメッセージが１つだけに統一された

```ruby:config/initializers/devise.rb
# ==> Configuration for :validatable
# Range for password length.
config.password_length = 8..128
```

```ruby:app/models/user.rb
devise :validatable, password_length: 8..128
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518714/65c4053d-23c2-f540-f0ed-41b490a5a4b6.png)

---
### 所感
今回私の場合はどちらとも変更しても支障が無かったので当記事の内容で問題ありませんでしたが、他に解決策があれば教えていただきたいです。

---
### 参考資料

https://qiita.com/hirokihello/items/862284c60429be5e01cd