panco’s blog

興味が沸いたことを書く

2024 年 3 月 自作 PC 奮闘記 vol.2(完)~組み立て編~

前回の記事はこちら。

pancokeiba.hatenablog.com

PC パーツを調達した翌日、さっそく組み立てをした。2 日間かかったが運よくトラブルなしで作動した。しかし、組み立て中に小さなミスを何度か犯したため、それらを記録しておく。ちなみにこの記事は自作 PC で執筆している。

出来上がった PC

ケース・パーツともに黒いためガラス面でも中がよく見えない。

完成

小さなミスや躓いた点など

パーツごとにミスや迷った点、感じたことを整理する。パーツの順序=取り付けた順序になるよう記載している。

全般的に言えること

  • 不明点は説明書を熟読すること
    → 至極当然の話(自分のように普段説明書を読まずに捨てる人間には大変だが・・・)。YouTube の自作 PC 作ってみた、のような解説動画はかなり参考になる。しかし、全く同じ構成でもない限りは、自分が買ったパーツの説明書をきちんと読み理解しながら進めることが、パーツ破損・動作不良など大きなトラブルを招かないコツだと感じた。
  • 各パーツは設置する際に開封する(初めから一気に開封しない)
    → 初めて自作する人にとっては意外と重要な点だと思った。組み立てて動作確認し、OS インストールまで含めると少なくとも 6 時間程度はかかると思う。すると、途中から自分が何をどこまでやったのか分からなくなる瞬間がある。そのため、設置が終わったパーツ、これから設置するパーツを箱ごとに分けて進める方法がおすすめ。

CPU(intel Core i5-1450)

  • 特になし

メモリ(KLEVV DDR4 3200 STANDARD MEMORY (8GB × 2))

  • 結構ぐっと押さないと入らないが、垂直に力をかける必要があり初めてだとマザーボードを壊しそうで怖かった
  • メモリの位置と向きはマザーボードの説明書を確認すべし

SSD(SK hynix Platinum P41 SSD (1TB))

  • マザーボードに付属しているクッションパッドの必要性がわからなかった
    マザーボード側に 1 つクッションパッドがついており SSD を設置したときに、SSDヒートシンクの高さが合っていたため付属のクッションパッドは使わなかった。

CPU クーラー(DEEPCOOL AK400 ZERO DARK)

  • 箱から本体を出すときにグリスの保護カバーが抜けてしまい、それに気づかずグリス面を床に置いて作業しており床にグリスがべったりとついたこと
  • 設置する際、左右のねじ穴に合わせて留める必要があるが、はめるのがやや難しく適度に力を入れないとねじが締まらなかった。力を入れすぎるとマザーボードを壊すのではという緊張感。結果的に友人に CPU クーラーを抑えてもらい、自分が左右のねじを少しずつ締めることで解決した。
  • マザーボードに CPU FAN のヘッダーが 2 つ(CPU_FAN と AIO_PUMP)あり、どちらに配線するのか迷った。説明書を見ると CPU_FAN のデフォルト設定は Q-Fan コントロール、AIO_PUMP はフルスピードとなっており前者を選択した。

ケース(NZXT H5 ELITE BLACK)

  • パネルを外す際、思ったよりも力を入れる必要があった。壊しそうで怖かった。

マザーボードASUS TUF GAMING B760-PLUS WIFI D4)

  • ケースに設置する際、ケースにスタンドオフを取り付ける必要があるか否かで迷った。マザーボードのねじ穴の位置とケースのねじ穴と照らし合わせて確認し、不要であればスタンドオフをつける必要はない。今回は不要だった。(マザーボード側にはねじ穴があるが、ケース側の対応する位置にない場合、スタンドオフを取り付けてケース側にもねじ穴を作って設置する必要がある。)

電源(XPG PYLON 650 BRONZE)

  • 配線で後述

配線

  • 各作業の中で一番難易度が高かった。マザーボード側のピンを壊さないかつ間違った箇所にケーブルを接続しないよう慎重な作業が必要であり、集中力を保つことが大変。とにかくマザーボードの説明書と PC ケースの説明書を何度も照らし合わせて確認する。
    → PC ケースのケーブルから配線し、そのあとに電源のケーブルを配線するのがよいと思った。PC ケースのケーブルはすべてどこかしらに配線するが、電源のケーブルの中には不要なものもあるため。
    → PC ケースの SATA ケーブルの接続先が、マザーボードではなく電源ケーブルSATA だったことが初心者にはトリッキーだった。

  • 最終的な配線はこんな感じ。

    表側
    裏側

ケース FAN(ARCTIC P12 PWM PST)

  • 設置する向きを間違えそうになった。
    → ケース内の空気を外に排出したいのか、外の空気をケース内に取り込みたいのかを確認した後に説明書の通り正しい向きで設置すること。

2024 年 3 月 自作 PC 奮闘記 vol.1 ~予算決めからパーツ調達まで~

初心者による初めての自作 PC

格安で購入したノート PC を 5 年ほど使っており、そろそろ買い替えてもいいかなと思った。既製品を買っても良かったが、普段 PC を使っているくせに内部構造を何も知らないので、勉強がてら作ることにした。
どの程度初心者かというと、CPU とかメモリとかグラボは聞いたことあるけど、それらを知らない人に自分の言葉で解説できない。世の中の PC がどのようなパーツで成り立っているのかも知らない。そんなレベルだ。

現時点ではパーツを調達しただけで、これから組み立てるためうまくできるかわからないが、パーツ調達~実際に使えるようになるまでの作業などを順を追って記録していく予定。(失敗談&トラブルシューティングまみれになりそうだが・・・)

予算決め

まず、自作 PC にいくら金額を投じられるかを考えた。モニター、PC ケース、OS 込みで 20 万円とした。ゲーミング PC を作りたいわけではなかったため、予算感としては妥当なのではと思う。(いろいろな人のサイトを見た感じ)
パーツ調達の章で後述するが、20 万円という予算にしてはかなり良いものを入手できたと思う。

自作 PC の用途を整理

次にやったこととして、PC の用途を整理した。スペックがどうとかよく言われるが、パーツ調達時に店員さんにうまく相談できる気がしなかったため、どういう用途で使うのかを伝えられるようにした。
自分の場合は以下の通り。

  • メインはコーディング用、あとはゲームをちょっとやりたい
  • やりたいゲームは Valheim

正直このぐらいしか思いつかなかったため、あとは店員さんに何か聞かれたら答えようの精神でお店に行った。

パーツの調達

調達方法

前述の通り何も知らない人間がいきなり自作 PC を作り出すため、サポートがないと厳しい。そのため、自作経験ありの友人とツクモに行き PC パーツ一式相談フロアで店員さんに要件を伝えつつほぼ選んでもらった。店員さんがわかりやすく教えてくれてかなりありがたかった。モニター選びから始まり、最後は PC ケースにつけるファンを選び、見積もり、配送手続き、会計をした。計 1 時間ほどだった。

調達したもの

予算内で自分の用途としてはかなり高スペックなパーツを調達することができた。ツクモでそろえたものと価格は以下の通り。

カテゴリ メーカー・品名 価格
モニター BenQ GW2790-JP 19,800
OS Windows 11 Home 16,346
SSD SK hynix Platinum P41 SSD (1TB) 11,255
CPU intel Core i5-14500 31,819
CPU クーラー DEEPCOOL AK400 ZERO DARK 4,073
マザーボード ASUS TUF GAMING B760-PLUS WIFI D4 19,981
メモリ KLEVV DDR4 3200 STANDARD MEMORY (8GB × 2) 4,200
グラフィックボード NVIDIA GEFORCE RTX 4060 38,910
デスクトップ用電源 XPG PYLON 650 BRONZE 6,346
PC ケース NZXT H5 ELITE BLACK 15,437
ケース FAN ARCTIC P12 PWM PST 982
消費税・配送料など 21,336
合計(税込) 190,485

主なパーツの購入理由

店員さん・友人のアドバイスをもとに初心者なりに考えつつ選んだ。いくつかのパーツについて、購入した理由を記載する。

モニター

  • このモニターだけで作業する想定で、デスクサイズ・好み・予算で 27 インチにした

PC ケース

  • 全体的に黒を基調とした PC にしたかった
  • メッシュタイプを選ばなかったのは、埃が溜まることを懸念した
  • NZXT のケースは配線しやすいと口コミがあった

マザーボード・CPU

  • セット売りでお得になっていた
  • Wi-Fi, Bluetooth 搭載だった

メモリ

  • 16GB か 32GB か迷ったが、現状 8GB で特に困っていないため予算も考慮し 16GB とした
  • 仮に今後使って困ったら増設すればよいとも思った

グラフィックボード

  • 求めるスペックとしては GEFORCE RTX 3060 でよいと思っていたが、4000 円ほどしか値段が変わらなかったため 4060 にした
  • 4060 のメモリサイズは 8GB だが 3060 のほうが 12 GB と大きいため、4060 より速度は遅いが容量の大きいデータを扱うことができるとのこと。そのため CG 制作なんかをする人には、3060 が好まれる場合があるらしい

デスクトップ用電源

  • 650W にしたのは店員さんの勧め
  • GOLD ではなく BRONZE にしたのは、予算上の問題が大きい。GOLD と異なり使用しない配線を抜くことができない特徴があるが、大きめの PC ケースを選んだこともあり BRONZE でよいかと考えた

ケース FAN

  • 購入した PC ケースにはファンが 2 個ついているが、背面にはついておらず必要だった

今後に向けて

一通りパーツを調達したため、組立てに着手する。いろいろな解説動画を見つつ、本当に慎重に作ることを心掛ける。

軽い気持ちで音声データをテキスト化したら全然うまくいかず頓挫している件

進捗が悪く、一度もブログ化できていなかったトピックを記事にする。

「進捗が悪い」の裏には「仕事が忙しくてそもそも時間が取れていない」「トライアンドエラー祭りで滞る」「なんかやる気出ない」といった状況が絡んでくるが、2023 年 11 ~ 12 月はすべてが該当した。
最後にこの件で Github に Push したのが 2023 年 11 月上旬ということを知り、戦慄している 1 月下旬の深夜 2 時。(しかも first commit が最初で最後だったという・・・戦慄極まりない)

震えていても何も始まらないので、今回やりたかったこと、実施したこと、何がうまくいかなくて断念したのかをこの記事で整理しておく。

執筆時点では失敗に終わっており、他に取り組まねばならない趣味の開発があるため一旦切り上げる。興味はまだあるため、諸々落ち着いたら自分でこのブログを読み返して再チャレンジしたい。おそらく GW の時期になりそう。

前置きが長くなったが、本題に入る。

やりたかったこと

  • 国内外の競馬実況で頻繁に使われる単語を抽出し、何かしら特徴があるかを分析する
  • 国内外の競馬実況の周波数を可視化し、何かしら特徴があるかを分析する

単なる好奇心から気になったことであり、1 ~ 2 日あればできそうだと思っていた。しかし、やってみたら全然できなかった。すでに分析している人がいるのかもしれないが(いないか)、結果より過程を楽しみたいので調べていない。。

執筆時点の状況

国内外の競馬実況で頻繁に使われる単語を抽出し、何かしら特徴があるかを分析する

→ 紆余曲折を経て挫折(この記事のトピック。詳細は後述する)

国内外の競馬実況の周波数を可視化し、何かしら特徴があるかを分析する

→ 未着手(上述の単語抽出で詰まったため余力なし)

実施したこと

1.競馬実況音声データ取得

5 か国のマイルの G1 レースを対象にした。レース映像から適当に wav を作成して音声データとした。5 か国 × 3 レースで計 15 レースをサンプルとした。

2.音声データをテキスト化(ここで詰まった)

1 で用意した wav ファイルをテキスト化して、形態素解析なんかをする想定だった。しかし、想定外なことに音声データのテキスト化に苦戦してしまい、断念している。
音声データのテキスト化にあたり、SpeechRecognition というライブラリを使った。

GitHub - Uberi/speech_recognition: Speech recognition module for Python, supporting several engines and APIs, online and offline.

SpeechRecognition は音声認識に関する様々なエンジン・API に対応しているが、導入が簡単そうだった Google Speech Recognition で音声認識・テキスト化に取り組んだ。簡単そうという判断がすでに間違っていたのかもしれないが、現時点では何が最適解かわからずにいる。(マイクの音声をリアルタイムでテキスト化する用途で SpeechRecognition を使っている記事は何個か見つけたが、wav ファイルをテキスト化した事例は比較的少なかった。)

次に実装内容や詰まった点を記載する。

実行環境

実装 ver.1.0

まず、サンプルコードを見つつ実装したものがこちら。
サンプルコードは以下 URL を参照。

speech_recognition/examples/audio_transcribe.py at master · Uberi/speech_recognition · GitHub

import speech_recognition as sr

r = sr.Recognizer()

# ファイルパス設定
audio_file = 'horseracing-commentary/data/wav/02_DoncasterMile.wav'

# wav ファイル読込
with sr.AudioFile(audio_file) as source:
    audio_data = r.record(source)

# recognize speech using Google Speech Recognition
try:
    # 音声データをテキストに変換
    text_data = r.recognize_google(audio_data, language='en-US')

    # テキストファイルのファイル名を作成('wav' を 'txt' に変換)
    file_name = audio_file.replace('wav', 'txt')
    # テキストファイルに書き込み
    f = open(file_name, 'w')
    f.write(text_data)
    f.close()

# Raises a speech_recognition.UnknownValueError exception if the speech is unintelligible.
except sr.UnknownValueError:
    print('Google Speech Recognition could not understand audio')
# Raises a speech_recognition.RequestError exception if the speech recognition operation failed, if the key isn't valid, or if there is no internet connection.
except sr.RequestError as e:
    print('Could not request results from Google Speech Recognition service; {0}'.format(e))

OSError 発生(解決済み)

まあ動くでしょうと思い「実装 ver.1.0」を実行すると思わぬエラーが発生。

OSError: FLAC conversion utility not available - consider installing the FLAC command line application by running `apt-get install flac` or your operating system's equivalent

なんそれ!と思いつつググったら、stackoverflow が教えてくれた。

python - FLAC conversion utility not available - consider installing the FLAC command line application on Spyder/Windows 10 - Stack Overflow

According to the source code it is searching for a flac without exe extension that will not work in Windows. If that fails it looks for a file with a specific name (flac-win32.exe) in module folder. You can either try to remove the extension of the file in the System32 folder or put the file in the module folder.

上記ベストアンサーの通り、flac.exe -> flac に変更した。拡張子を外していいのかそわそわしたが、これで OSError が解消された。(自分は conda 環境の \Library\bin 配下にある flac.exe を flac に変更した。)

しかし、次のエラーが発生し、ドツボにはまる。

途中までしかテキスト化されない・・・(ほぼ頓挫)

プログラムは正常終了しているが、期待通りではない。2 分程実況し続けている実況者の声が、途中までしかテキスト化されていない。

実際の出力結果
02_DoncasterMile.txt

Wakefield the 20 for better than love this year's favorite and the guy's open now they're offering no speed by inspirational girl she'll settle last and Dillsburg won the start from Converse going forward is Forbidden Love and just focus slicing through as well then came Dallas and for my Thunderstruck and Miss Bristol Mr Brightside on the emperor River lighthouses pretty deep for let them by Lewis of indices who's improving on the rails then kissing on the inside of us from inspirational songs on the outside of ice bath and then came back to private eye from 55504 139.99 by the

文字起こしの精度が怪しい気もするがそれはさておき、どう見ても 2 分間実況し続けている人の語数にしては少なすぎるし、中途半端なところで切れてしまっている。

エラー解析の教訓だが、切り分けをせずにとりあえずググったり、思いついて怪しそうと思ったりした点から潰しにかかって自爆した。切り分けをしていないだなんて死にたくなるが、当時はこんなにはまると思っていなかったのもあり、軽い気持ちでやりすぎたのは反省。
まずはそもそも wav ファイルの読込が正常にできているのかをデバッグすべきだった、と今になって思う。

ということで、トライアンドエラーの内容を次に記載する。あれこれやったが、冒頭に書いた通り期待通りにはならなかった。

トライアンドエラー 1.無音状態が 5 秒続いたら読込終了とする

Recognizer をインスタンス化した後にコード追加。デフォルトでは 0.8 秒無音が続くと音声認識を終了させる仕様になっている。実況の場合、その程度一時的に無音となることはあり得るため、0.8 秒から 5 秒に変更した。(さすがにマイルの競馬実況で 5 秒無音だと放送事故という感覚)

r = sr.Recognizer()
# 無音の長さ(秒)を設定。5秒無音状態が続くと読込終了。
r.pause_threshold = 5

結果は「実装 ver.1.0」の出力結果と変わらず NG。

トライアンドエラー 2.無音状態の他にもいろいろ追加してみる

recognizer_instance.pause_threshold の他にもいろいろと設定変更できる(デフォルトで定義されている)属性があることを知り、とりあえず諸々調整した。しかし、結果は全く変わらなかった。音声データには実況以外に馬の走る音や歓声、雑音などが入っているため、それらが影響しているのではと疑ったが、検証した限りでは関係なかった。よって NG。

r = sr.Recognizer()
# 無音の長さ(秒)を設定。5秒無音状態が続くと読込終了。
r.pause_threshold = 5
# 周囲のノイズレベルを自動調整
r.dynamic_energy_threshold = False
# 閾値。設定値より小さい値は無音、大きい値は音声とみなされる。デフォルトは300
r.energy_threshold = 200

トライアンドエラー 3.読込の最大時間を設定

wav ファイルの読込で、duration という読込の最大時間を設定するパラメータが追加できたので実装。2 分程度のファイルに対し、3 分(180 秒)を設定。出力結果は変わらず NG。

# wav ファイル読込
with sr.AudioFile(audio_file) as source:
    audio_data = r.record(source, duration=180)

トライアンドエラー 4.サンプリングレート周りを確認

トライアンドエラー 1 ~ 3 をやった段階で、もう 12 月下旬だった。軽い好奇心から「実装 ver.1.0」を作ったのが 11 月上旬だったため、結構時間が経っておりらちが明かないため、stackoverflow に投げかけてみた。そこでもらったコメントを参考にサンプリングレート周りを確認した。
観点と確認結果は次の通り。

  • wav ファイルのサンプリングレートは?
    → 48kHz / 16bit
  • 変数 audio_data が持っているサンプリングレートは?
    → sample_rate: 48000, sample_width: 2

sampling width が怪しそうではある。stackoverflow では、sample_width に 1 or 4 を明示的に渡して検証してみては?というアドバイスをもらった。しかし、結果は変わらずお手上げモード。とても丁寧に教えてくれたので申し訳なかったが、結果 NG で頓挫した。

おわりに

消化不良過ぎるので、まじで落ち着いたらなんとかしたい。

【Windows】VSCode で Go 言語のプログラムをデバッグする

VSCode で Go 言語のデバッグ環境を整えるのに少し手間取ったため、手順を残しておく。

実行環境

前提

Go 言語のインストール、環境変数の設定ができていること。(他のサイトにいくつか解説されていたためここでは割愛する)
インストールは以下のサイトから msi ファイルをダウンロードし実行した。

Download and install - The Go Programming Language

1.Go 拡張機能のインストール

VSCode の Extensions から Go をインストールする。

Go Extension

2.go-delve のインストール

インストールした Go Extension のデバッグ機能を使うには go-delve が必要。
PowerShell で以下のコマンドを実行し、Github から最新バージョンの go-delve をインストールする。

go install github.com/go-delve/delve/cmd/dlv@latest

コマンド実行結果

go-delve のインストール

3.launch.json の編集

初めて Run and Debug を押して F5(Start Debugging)を押すと、launch.json が生成される。 そのファイルに以下のように記載する。今回はserver.goというプログラムをデバッグする例を記載している。
launch.json

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Launch",
      "type": "go",
      "request": "launch",
      "mode": "debug",
      // デバッグ対象プログラムのパス
      "program": "${workspaceFolder}/001-echoserver/main/server.go",
      "env": {},
      "args": ["-test.v"],
      "showLog": true
    }
  ]
}

4.デバッグ実行

以下の流れでデバッグを実行する。Go 言語に限らず、Python など他のコードを VSCodeデバッグするときと同じ。

  1. デバッグ対象の任意のコードにブレイクポイントを仕込む
  2. Run and Debug から Lauch を選択して F5(Start Debugging)を押す
  3. デバッグが開始され、ブレイクポイントを設置した箇所で止まる。以下のような画面になる。DEBUG CONSOLE が表示されたり変数の値が左のウィンドウから確認できたりする。

参考

Windows PowerShell で curl コマンドを実行する方法

『Real World HTTP』を読んでいて、curl コマンドでヘッダ送信する際にエラーになったため対処を記載する。

www.oreilly.co.jp

実行環境

対処前(エラー)

実行コマンド

curl --http1.0 -H "X-Test: Hello" http://localhost:18888

実行結果

Invoke-WebRequest : パラメーター 'Headers' をバインドできません。"X-Test: Hello" の値を "System.String" 型から "System.Collections.IDictionary" 型に変換
できません。
発生場所 行:1 文字:19
+ curl --http1.0 -H "X-Test: Hello" http://localhost:18888
+                   ~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Invoke-WebRequest]、ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

対処

エイリアスの設定を削除する。

デフォルトのエイリアス設定

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           curl -> Invoke-WebRequest

エイリアス削除コマンド

設定の解除は、その PowerShell コンソールのセッションでのみ有効。

del alias:curl

エイリアス削除コマンド実行後、エイリアス設定は以下の通り解除されている状態となる。

PS C:\Users\fossi\01_research\01_programming\go> Get-Alias curl
Get-Alias : name 'curl' を含むエイリアスは存在しないため、このコマンドは一致するエイリアスを見つけられません。
発生場所 行:1 文字:1
+ Get-Alias curl
+ ~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (curl:String) [Get-Alias], ItemNotFoundException
    + FullyQualifiedErrorId : ItemNotFoundException,Microsoft.PowerShell.Commands.GetAliasCommand

対処後(正常)

実行コマンド

curl --http1.0 -H "X-Test: Hello" http://localhost:18888

実行結果

curl コマンドが正常に実行され、期待通りの結果が得られた。

GET / HTTP/1.0
Host: localhost:18888
Accept: */*
User-Agent: curl/8.4.0
X-Test: Hello

補足

他の対処として、エイリアス削除コマンドを実行せず、curl.exeとつけて実行する方法もあるらしい。

curl.exe --http1.0 -H "X-Test: Hello" http://localhost:18888

閑話 技術書典 15 に行ってきた

先日、技術書典 15 のオフライン会場に行ってきた。感想を雑に書く。

techbookfest.org

そもそも技術書典なるものを知らず今回初めて行ったのだが、Wikipedia によるとこういうイベントらしい。

技術書典(きじゅつしょてん)は、IT や機械工作とその周辺領域について書いた本を対象にした同人誌即売会。 技術者たちの「コミケ」とも言われる。運営はテックベース合同会社技術書典 - Wikipedia

生成 AI、LLM、アプリ開発、組込み系、言語用法系、クラウド系・・・いろいろなジャンルの技術書があった。今回、基盤寄りの技術書はやや少なかった印象。仕事ではアプリ開発に触れているが、普段触れない分野のニッチな技術書も見て回ることができて楽しかった。

売っている人もさまざまで、個人開発の人、研究者っぽい人、学生、企業の有志などなど。 私は見知りなので、著者にどういう内容か尋ねることにそわそわしたが、丁寧に教えてくれた人が多かった。見本もあったので手に取って内容を見れた点も良かった。多くの本は電子+紙で 500 円~ 1000 円程度で買えたので、仕事で役立ちそうなものと個人開発に役立ちそうなものを数冊購入した。
押し売りがなかったのもありがたかったな。

今は Python 初心者で作りたいものを作って躓いた点をブログ化している段階だが、そのうち自分も出展してみたいな~と思ったイベントだった。

【Python】相対パスを設定して FileNotFoundError が出た時の対処

Python 初心者です。時々起きてしまうエラーで毎回はまるため、対処を残しておく。

実行環境

ディレクトリ構造

sample-project
└─sample
    │  sample.py (実行するスクリプト)
    │
    └─data
        └─txt
                hoge.txt (参照するファイル)

サンプルコード(FileNotFoundError)

sample.py(FileNotFoundError)

# hoge.txt を読み込んで、テキストの本文を表示するサンプルコード

# hoge.txt の場所を相対パスで設定
source = 'data/txt/hoge.txt'
# hoge.txt を読み込む
f = open(source, 'r', encoding='utf-8')
data = f.read()
f.close()
# hoge.txt の本文を表示
print(data)

サンプルコード(FileNotFoundError)実行結果

FileNotFoundError: [Errno 2] No such file or directory: 'data/txt/hoge.txt'

FileNotFoundError が出た時に確認すること

1.パスを誤記していないか確認する

いわゆるケアレミスしていないか。 ※元ネタを知らないと伝わらない。ケアレミス。。

2.1 が OK の場合、実行時のカレントディレクトリを取得&確認する

sample.py(カレントディレクトリ取得版)

# hoge.txt を読み込んで、テキストの本文を表示するサンプルコード

# カレントディレクトリを取得・表示する
import os
print(os.getcwd())

# hoge.txt の場所を相対パスで設定
source = 'data/txt/hoge.txt'
# hoge.txt を読み込む
f = open(source, 'r', encoding='utf-8')
data = f.read()
f.close()
# hoge.txt の本文を表示
print(data)

sample.py(カレントディレクトリ取得版)実行結果
赤のアンダーラインが実行時のカレントディレクトリ。ここを起点とした相対パスを設定する必要がある。

実行結果

サンプルコード(修正版)

相対パスを正しい値に修正。('data/txt/hoge.txt' → 'sample/data/txt/hoge.txt')
sample.py(修正版)

# hoge.txt を読み込んで、テキストの本文を表示するサンプルコード

# hoge.txt の場所を相対パスで設定
source = 'sample/data/txt/hoge.txt'
# hoge.txt を読み込む
f = open(source, 'r', encoding='utf-8')
data = f.read()
f.close()
# hoge.txt の本文を表示
print(data)

サンプルコード(修正版)実行結果

hoge.txt の本文が正常に表示された。

Hello hoge!