OmniAICreator/Qiita-1.07M huggingface dataset:
恵方巻きガチ勢によるPython恵方チェッカー

どうも恵方巻きガチ勢です。
今年も恵方を向いて食べました。
![IMG_5982.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3952506/526bdb87-22af-3b62-a0a4-72479a8e01a6.png)
今年の恵方は西南西(北から反時計回りに95°の向き)です。

今回はPythonを使って任意の年の恵方を算出するプログラムを書いていこうと思います。

# 1.恵方の決め方
そもそも恵方はどうゆう基準で決められるのでしょうか？
恵方はその年の十干(じっかん)という
甲(きのえ)・乙(きのと)・丙(ひのえ)・丁(ひのと)・戊(つちのえ)・己(つちのと)・庚(かのえ)・辛(かのと)・壬(みずのえ)・癸(みずのと)
の10個が干支のように毎年変わっていくものにいよって定められています。

十干と恵方の対応表はこんな感じです
|甲・己|乙・庚|丙・辛・戊・癸|丁・壬|
|:-:|:-:|:-:|:-:|
|   |   |   |   |
|東北東|西南西|南南東|北北西|

そして十干は毎年変わり、10年周期で繰り返されるので西暦と十干の対応表はこんな感じ

|西暦の一桁目が|0|1|2|3|4|5|6|7|8|9|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|   |   |   |   |   |   |   |   |   |   ||
|十干|庚|辛|壬|癸|甲|乙|丙|丁|戊|己|

つまり西暦と恵方の対応表はこうなります。
|西暦の一桁目が|4・9|0・5|1・3・6・8|2・7|
|:-:|:-:|:-:|:-:|:-:|
|   |   |   |   |
|恵方|東北東|西南西|南南東|北北西|

これを元にコードを書いて行きましょう。
# 2.コード
まずはじめに恵方を知りたい西暦を入力してもらいます
```
print("What year is it now? :")
year=input()
```
しかしこれを実行すると
```
What year is it now? :
2025
<class 'str'>
```
となり要らない部分に改行が入ったり、変数yearの型str型になったりしているので、まずはそこを改善していきます。

Pythonのprint関数はデフォルトで末尾に改行が入るのでこれを無くしましょう。
引数endに任意の文字列を指定することでこれは改善できます。今回は末尾に来てほしい文字列はないので
```
print("What year is it now? :",end="")
```
これでOK。

次に変数yearの型の問題ですがこれはint関数を使って簡単にint型に変更できます。
```
year=int(input())
```
改善したコード
```
print("What year is it now? :",end="")
year=int(input())
```
を実行すると
```
What year is it now? :2025
<class 'int'>
```
いいですね。
次に変数yearから恵方を判定していきます。
|西暦の一桁目が|4・9|0・5|1・3・6・8|2・7|
|:-:|:-:|:-:|:-:|:-:|
|   |   |   |   |
|恵方|東北東|西南西|南南東|北北西|

この表から分かるように

year≡4(mod 5)なら東北東
year≡0(mod 5)なら西南西
year≡2(mod 5)なら北北西
それ以外なら南南東

となりますね。
これを元にコードを書くと
```
if year%5==4:
    print("東北東です")
elif year%5==0:
    print("西南西です")
elif year%5==2:
    print("北北西です")
else:
    print("南南東です")
```
これを追加した完成版のコードが
```Python:ehou-checker.py
print("What year is it now? :",end="")
year=int(input())
print("{}年の恵方は".format(year),end="")
if year%5==4:
    print("東北東です")
elif year%5==0:
    print("西南西です")
elif year%5==2:
    print("北北西です")
else:
    print("南南東です")
```
これです。早速実行してみましょう。
<details><summary>結果</summary>

```
What year is it now? :2025
2025年の恵方は西南西です
```
</details>
完璧ですね。皆様もこれを使って良き節分ライフをお過ごしください。
【「技術書」の読書術】を読んでみた感想【読書記録】

「技術書」の読書術を読んだので、感想や個人的にためになったところをピックアップして書いていく

https://www.shoeisha.co.jp/book/detail/9784798171548

<h2>この本について</h2>
二人の著書がそれぞれ本をどんなふうに、選び、読み、発信するかを書いた本である

技術書の読書術というタイトル通り、エンジニア向けの本の読み方ガイドである

二人の著者がいるものの、ここではざっくり内容面でためになった箇所をごちゃまぜで書く

<h2>選び方</h2>
本をどうやって選ぶかについて、各々書いてある

新刊の情報を得るために、雑誌やSNSを活用するといった内容や、英語の本を選択肢に入れるといった内容があった

また、書店員さんと仲良くなってオススメをなどエクストリームな選書方法もあった(多分真似はできない)

一方で、良書や相性のいい本を選び続けることはできないとも。とはいえ、選書に関する工夫が載っていた

その中でも、個重要だと思ったのは選書する際の「目的」と「レベル」についてである

<h2>・目的</h2>
自分は本を選ぶ際は何となく勉強になりそうだからとか、面白そうだからといった動機で選ぶのだが、本書ではもう一歩踏み込んで「本を読む目的で本選びが変わってくる」と書かれている

本を選ぶ目的を
・概論を把握したい
・資格を取るため
・論文を書くために理論を知りたい
など目的を明確にしてから本を選ぶと、選ぶ本が図鑑、資格本、理論書など変わってくる

例えば、概論を把握したい目的で理論書を手に取っても、あまりにも時間がかかったり難しすぎたりするので目的と合わない

目的を意識して、それに応じた本選びをすると失敗しないという内容だ

このように本書では、目的をわかりやすく大別しているものの、例えばプログラミングの本一つとっても
・初級のお作法を学ぶのか
・ベストプラクティスを学びたいのか
・より複雑な実装について学びたいのか
を、目的を意識するとより良い選書ができると思った

<h2>・レベル</h2>
本を選ぶ際に、その本がどれくらいの読者層を意識したものなのかを把握すると、本選びに失敗しずらいとあった

例えば、その本が
・プログラムを書いたことがない初心者向けなのか
・バキバキ十年選手を対象にしてるか
によって、本に書かれている難易度が変わってくる

書店ではあんまり難しい本が置いていないイメージではあるものの、どういう読者層を想定しているかを読んでみようと思った

<h2>読み方</h2>
電子書籍やオーディオブックなどの媒体についてや読書記録について、パラシュート勉強法など多種多様な読み方について書かれていた

本を切ったりマーカーをひいたりは個人的にはちょっと抵抗感があり真似できそうにないものもあったが、いろいろな読み方が紹介されていた

この中で個人的にためになったのは「一点突破読書法」である

<h2>・一点突破読書法</h2>
「特定の分野の本を複数冊揃えて、集中的に読書する方法」である

メリットは、一つ分野を特化して読書することで、自分の得意分野を作れるところ

得意分野一つだけではナンバーワンにはなれないが、複数得意分野を持つことで組み合わせ次第によっては希少性が高くオンリーワンになれる、という読書法である

読書の目的は、成長して他人と差をつけることであると思っているので、この読書法はかなり有用だと感じた

最低でも20冊は同じ分野の物を揃えて、可能であれば国内外すべての本を網羅することを挙げていたので、まずは20冊挑戦してみてもいいかもしれない

揃えて集中して読書するなので、20冊購入するところからである

<h2>情報発信＆共有(アウトプット)</h2>
アウトプットする理由やツールについて書かれていた

アウトプットの目的は、その本に書かれていたことを身に着けるためである

だからこそ、専門家とかじゃなくてもアウトプットは積極的にすべきだということを再認識できた

また、専門家のアウトプットは良質であるものの、理解している知識の前提条件が難しすぎるため、初心者の視点で書かれたものも役に立つとあった

自分自身もアウトプットで、これ書いていて意味あるのだろうか？大丈夫だろうか？と考えるときがあるものの、誰かの役に立てばぐらいの気持ちで書くと良いのかもと気づかされた

<h2>まとめ</h2>
小難しくなくシンプルで読みやすかった。最初の本として選んで正解だった

今後の読書記録を書いていくうえで、どういった本を選び読みアウトプットしていくかの指針になった

特に、一点突破読書法はぜひ実践してみたいと思った

それを受けて、今後は一つのジャンルに絞って読書していこうかと思っている。記事の書きやすさも加味して書店に足を運んで次回の本について考えたい

ただ、有名どころは読みたいとも思っているので、柔軟に選書する

あと、この記事を書くまでに日を開けてしまって内容面を忘れていたりしたので、適宜メモなり付箋なりをした方が良いのかもしれない

<h2>参考</h2>

https://www.shoeisha.co.jp/book/detail/9784798171548
android用のYolov11物体検出モデルを学習(メモ)

# roboflowを用いたデータセットの準備
・roboflowを使用してアノテーション作成と水増しデータ作成
　→少ないデータであれば無料枠でできるため個人的におすすめ
　 https://app.roboflow.com/
・以下参考
   https://qiita.com/Y_R_/items/07ced51178b38f7b2bde
   https://zenn.dev/nexis_r/articles/0f0ab8670af844
# 学習データの準備
・以下参考(ただし、roboflowを使うとアノテーションファイルなども自動で作成してくれるので便利)
https://qiita.com/ryuka0610/items/a47fd253708a98d3726c
・準備した学習データはGoogleドライブに保存しGoogle Colabから参照できるようにする。
https://www.kikagaku.co.jp/kikagaku-blog/google-colab-drive-mount/
# Google Colabを用いたYolov11モデル学習
・ランタイムのタイプはGPUを指定する必要がある。
```python
# 必要なライブラリをインポート
!pip install ultralytics
!pip install torch torchvision torchaudio --upgrade

#モデルの学習(model=yolo11n.yamlとすることで事前学習済みモデルを使用せずに学習できる模様)
!yolo train data=/content/drive/MyDrive/dataset/data.yaml model=yolo11n.yaml epochs=100 imgsz=1280
```

上記の実行が成功すると以下のYolov11のモデルが生成される。
/content/drive/MyDrive/dataset/runs/detect/train/weights/best.pt
# Yolov11をTFLite形式にエクスポート
```python
# 必要なライブラリをインポート(2025/1/31時点ではバージョンを以下に合わせないとエラーになった)
!pip install --upgrade onnx onnx-tf typeguard
!pip install tensorflow==2.16.1
!pip install tf-keras==2.16.0
!pip install ultralytics


from ultralytics import YOLO
# YOLOモデルの読み込み
model = YOLO("best.pt")

# TFLite形式にエクスポート（imgszは省略可能）
model.export(format="tflite", imgsz=(1280, 1280))
```
# 検証環境構築&検証
 ・以下参考。
 ・作成したTFLite形式のモデルをassetsに配置およびlabels.txtのラベル名を学習時のモデルに合わせて変更。
 ・Constants.ktのMODEL_PATHを作成したTFLite形式のモデル名に変更。
 https://github.com/surendramaran/YOLOv8-TfLite-Object-Detector/tree/main/app/src/main/assets
 https://github.com/surendramaran/YOLOv8-TfLite-Object-Detector/blob/main/app/src/main/java/com/surendramaran/yolov8tflite/Constants.kt
 https://qiita.com/john-rocky/items/ee69f8a396655d739e4b
後輩のためのFigma入門（Step5）

# 後輩のためのFigmaの使い方

後輩のためにFigmaに関して書きました。

Step5は「枠線を極めよう」です。

今回は、影や枠線の機能について書きました。
以下の機能ごとに書いたため、知りたい機能をご覧ください。

# 目次
#### 枠線
- [枠線の追加](#枠線の追加)
- [枠線の太さ](#枠線の太さ)
- [枠線の位置](#枠線の位置)
- [枠線の角の設定](#枠線の角の設定)
- [枠線の線の設定](#枠線の線の設定)
- [枠線を一部分だけ表示](#枠線を一部分だけ表示)
- [枠線の一部分の太さを設定](#枠線の一部分の太さを設定)

## 枠線の追加
枠線を追加するときは以下の場所をクリックしましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950744/6eeb41be-764e-8e58-374b-314fc3186009.png)

<br> <!-- 空行を追加 -->

## 枠線の太さ

枠線の太さは以下の場所で調節することができます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950744/1186f44b-80b2-e235-7cb3-a62e7ac70d40.png)

<br> <!-- 空行を追加 -->

## 枠線の位置

**Step1** 枠線の位置は、以下のボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950744/f9893a88-817b-378b-b22e-35e03d335230.png)

**Step2** 内側、外側、中央から選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950744/a3a36de9-ad64-6db0-c32e-8d6b0c582fa3.png)

## 枠線の角の設定

**Step1** 枠線の角は、以下のボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950744/dc179b19-182b-55c9-6708-90b63b446588.png)

**Step2** 角の種類を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950744/15164625-9cd9-17d8-e0fb-654c689e2a60.png)

## 枠線の線の設定

**Step1** 枠線の角は、以下のボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950744/dc179b19-182b-55c9-6708-90b63b446588.png)

**Step2** 角の種類を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950744/08368142-ee35-f260-3bed-d20dae599adb.png)

## 枠線を一部分だけ表示

**Step1** 枠線を一部分だけ表示したい場合は、以下のボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950744/c2e525a6-4558-77b6-65f2-53b33643583b.png)

## 枠線の一部分だけ線を設定

**Step1** 枠線の一部分を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950744/c2e525a6-4558-77b6-65f2-53b33643583b.png)

**Step2** Customを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950744/b9d7304d-8768-9ae1-f37b-2f586caea4f0.png)

**Step3** それぞれの太さを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950744/b3cf9807-20be-269d-a038-ab8c2397e7c6.png)

## 続き
今回は、図形の詳細設定を解説しました。
次回は影を解説しようと思います。
Bashバージョン履歴 - Bashism！の多くはkshのパクリ？

## はじめに

Bashism などと言われ、あたかも bash でしか使えない機能のように言われている機能の多くは、実は ksh（ksh88 や ksh93）で最初に実装された機能です。**Bashism の多くは bash でしか使えない機能ではありません**。現実のシェルスクリプトは POSIX で標準化された機能だけをシェルが実装していれば動くわけではありません。ksh で実装された機能を使うシェルスクリプトを動かすには、bash にもその機能を実装しなければいけません。bash はむやみに独自の拡張機能を追加しまくったわけではなく、単に ksh の代替となるシェルを作っていただけなんです。つまり Kshism です。もちろん独自機能もありますが、zsh からの導入、つまり Zshism もあります。

## zsh は bash の上位互換シェルではない

一部に勘違いが見られますが **zsh は bash の上位互換シェルではありません**。bash、ksh、zsh、これらのシェル（その他のシェルも）はお互いのシェルの機能を参考にしながらも、**独自のシェル**を作っています。自分たちの考え方に合わなければ、お互いのシェルの機能を導入しません。

ですが一部の機能は複数のシェルで同じように実装されており、すべてが bash でしか使えない機能というわけでもありません。特に bash は ksh とは互換性が高く、たとえ bash が使えなくなっても、代わりに ksh で動かすなんてこともできちゃうわけです。

bash の独自機能ではないものを Bashism と呼んで移植性がない機能だと言うのは、いい加減やめませんか？ ksh や zsh でも動くのであれば移植性あるでしょう？

## Bashのバージョン履歴と追加機能

**Is there a list of which features were added to specific releases (versions) of Bash?**

https://mywiki.wooledge.org/BashFAQ/061

詳細は↑を参照してください

:::note
もともとこの記事は Bash の初期のバージョンがいつリリースされたか、そのときに導入された機能がどのシェルから来たのかをまとめた記事にしようと思ったのですが、探したらまとまった情報があったので単にそれを紹介するだけの記事に成り下がりました。つまり自分用メモです。
:::

上記の記事より。以下のページにはもっと詳細な情報があります。

https://web.archive.org/web/20230401195427/https://wiki.bash-hackers.org/scripting/bashchanges

## Greg's Wiki BashFAQ/061の補足

読んでいて少し勘違いされそうな点について補足です。

bash 2.0 (1996) で導入された配列の機能は「csh (1979), zsh (1991) for array=(assignment) syntax」と記事には書かれていますが、ksh88 にも異なる文法 (`set -A` を使う）で導入されており、zsh からは `array=(assignment)` という文法が採用されたという意味です。配列そのものは csh にもあるのはそのとおりですが、bash が導入した理由としては ksh88 にもあったからだと考えられるでしょう。

## POSIX シェルの標準規格の話

POSIX ではシェルの標準規格が作られていますが、POSIX 自身が新しい機能を考えて、それを実際のシェルが追加しているわけではありません。POSIX シェルの標準規格は、bash、ksh、zsh などのシェルで広く使える機能から選ばれて採用されます。したがって一部の人が忌み嫌う（？）Bashism は将来の POSIX 標準規格の候補なのです。
iPhone でローカルLLM によるチャットを試す（「TinySwallow-1.5B」と「LLMFarm」アプリを利用）

## はじめに
今回の記事は、「iPhone でローカルLLM」という話です。

### 使ったモデル
使ったのは、以下の公式のポストに書かれている「TinySwallow-1.5B」です。

https://x.com/SakanaAILabs/status/1884770664353325399

公式の記事によると、「[新手法「TAID」を用いた小規模日本語言語モデル](https://sakana.ai/taid-jp/)」とのことです。
　

### 自分が動作させた時の様子
先に、自分が iPhone で動作させた時の様子を動画で示します。

<iframe width="560" height="315" src="https://www.youtube.com/embed/8hxP6IEcwEg?si=RSCrksKQSCQ2eUl-" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

上記の動画は「機内モードにした iPhone で試している時の様子」を、画面収録機能で撮っています（インターネットへの接続をがなくても動作することを分かるようにする意図）。

上記で使っている iPhone が、iPhone 16 Pro というのが処理速度に寄与している部分があるかもしれないですが、サクサク動作しています。

なお上記のセットアップは、PC などを使わず iPhone だけで進めることができました。

## 進めた時の手順
ここからは、進めた手順に関する話です。

### 元にする情報
手順は、以下で公式が書いている内容をなぞっていけばできてしまいます。

●TinySwallow-ChatUI/docs/iphone.md at main · SakanaAI/TinySwallow-ChatUI
　https://github.com/SakanaAI/TinySwallow-ChatUI/blob/main/docs/iphone.md

ちなみに自分は、iPhone用アプリのダウンロードも、その後のモデルのダウンロードなども外出先で行った形でした。
PC などは不要で、iPhone のみでセットアップを完結されられました。

### iPhone で試した時の流れ
iPhone でセットアップをしてる時の様子を画像としてキャプチャしていたので、それを掲載しつつ流れを書いていきます。

#### 公式手順・アプリ
以下は、「公式の手順が書かれたページの冒頭」「公式手順で利用するアプリとして掲載されている LLM Farm」「LLM Farm を立ち上げた直後の画面」の 3つを、並べている状態の画像です。

![2025-02-03_00-21-24.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/c3870a4b-6383-bd43-a6cc-dc3c5d12b09b.jpeg)

公式手順を見つつ、その手順で指定されていた iPhoneアプリをダウンロード・起動した際の流れです。

#### モデル関連
次に、公式のページに掲載されている 2種類のモデル「Q8バージョン」「Q5バージョン」のうち、「より正確な応答が可能」と書かれている「Q8バージョン」のほうをダウンロードしてみました。

以下は、ダウンロード中の様子です。

![2025-02-03_00-25-09.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/0e02e329-22b0-247b-fc01-3b340ab80984.jpeg)

ダウンロードしたモデルのサイズは「1.65GB」でした。

#### アプリでの設定操作
モデルのダウンロードが完了した後は、アプリ上での操作を進めました。

以下は、先ほどダウンロードしたモデルをセットした時の流れです。

![2025-02-03_00-32-09.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/2bc6aece-718e-89e6-e7b1-1fc2b2f0cd97.jpeg)

その後、以下の操作を行ってテンプレートを「ChatML」にしました。

![2025-02-03_00-32-58.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/8402ab73-8238-d078-2f74-d8a4377cd423.jpeg)

上記を進めた結果、アプリのトップ画面で以下の赤枠で囲んだ部分を選ぶことで、ローカルLLM によるチャットを試せる状態になりました。

![475918937_9259890327439642_8991448929942548441_n.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/50d98644-729b-c979-02ea-d72ae421812f.jpeg)

#### アプリでのチャット
上記の設定を完了させた後、機内モードにしてチャットを試しました。

その際の様子は以下のとおりです。

![a2025-02-03_00-34-54.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/f42a143f-c154-d76b-011c-da33931f9397.jpeg)

この後、冒頭に掲載した動画の内容も試した、という流れでした

## その他

### 他に試された方のポスト
自分がこの話の動画あをポストした後、それを引用する形でご自身で試された内容をポストされた話があるので掲載しました。
（引用ポストだったので、X の通知に出てきました）

#### A-Uta さん
以下は A-Uta さんのポストです。

https://x.com/UtaAoya/status/1886036037233000617

試された環境としては、iPhone 12 Pro で、アプリは「PocketPal」を使われたとのことです。

https://x.com/UtaAoya/status/1886047411652669593

#### 菅原のびすけ さん
こちらは 菅原のびすけ さんのポストです。

https://x.com/n0bisuke/status/1886062571679342895

サイズ 1.6GB のモデルで、機内モードで試されたようです。
Nordic nRF9160 DKをはじめよう3～Visual Studio Code編～

__Nordic nRF9160 DKをはじめよう2～Toolchain Manager編～__ の続きです。

https://qiita.com/usashirou/items/84bdaecaa72daf6ce783
# サンプルを開く
__Visual Studio Code__ を立ち上げ __nRF connect__ を __クリック__ します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/361fd25b-1259-19ed-cb4f-26a6836b9222.png)
__Create a new application__ を __クリック__ します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/ff13f32b-eafa-150a-d7ab-1eb6a26f9b7d.png)
__Copy a sample__ を __クリック__ します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/4eebd36a-ca97-9857-7acd-b5c850cfb9c9.png)
__Blinky Sample__ を __クリック__ します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/1d1ba4d1-e40f-a9d4-cc56-90655669c679.png)
__インストール__ する __ディレクトリ__ を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/6fa03af4-7dd1-a58e-349e-619086bf7fda.png)
__Open__ または __Add to workspace__ を __クリック__ します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/c8b57865-05d3-27c9-bf3d-4aa408083616.png)
__+Add build configulation__ を __クリック__ します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/3497d27d-4bfc-e25f-a3cf-3ef98df9f096.png)
__Board target__ に __nrf9160/nrf9160ns__ を選択します。
__nrf9160/nrf9160ns__ は __NonSecure環境__ になります。
__セキュア環境__ にしたい場合 __nrf9160/nrf9160__ にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/86d3d9e3-3aa6-354b-ad6b-5b69433a479f.png)
__Build Configuration__ を __クリック__ します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/5a4ef80b-79ff-6055-5a8d-bb6960ea568a.png)
hexファイルが生成されれば完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/9b3d834d-697d-3f6a-2466-4d1155af4eb7.png)
# nRF9160 DKに書き込む
__Flash__ でボードに書き込みします。
LEDがチカチカすれば終了です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/2e4408a9-a9de-f06e-5de7-006590942bb8.png)
## Toolchain&SDKバージョン変更
Nordic nRF9160 DKをはじめよう4～toolchains&SDK追加編～に続きます。
o1-Like LLMsの思考の浅さを克服する—新たなデコード戦略TIPの提案

# **Thoughts Are All Over the Place: On the Underthinking of o1-Like LLMs**

今回は、最新の研究成果である **"Thoughts Are All Over the Place: On the Underthinking of o1-Like LLMs"** という論文をご紹介します。本研究は、o1 に似た大規模言語モデル (LLMs) が **「考えの浅さ (underthinking)」** という問題を抱えていることを明らかにし、その影響を分析し、改善策を提案したものです。

## **論文情報**
- **タイトル**: Thoughts Are All Over the Place: On the Underthinking of o1-Like LLMs
- **リンク**: [arXiv:2501.18585v1](https://arxiv.org/abs/2501.18585)
- **発表日**: 2025年1月30日
- **著者**: Yue Wang, Qiuzhi Liu, Jiahao Xu, Tian Liang, Xingyu Chen, Zhiwei He, Linfeng Song, Dian Yu, Juntao Li, Zhuosheng Zhang, Rui Wang, Zhaopeng Tu, Haitao Mi, Dong Yu
- **所属**: Tencent AI Lab, Soochow University, Shanghai Jiao Tong University
- **DOI**: 未提供

---

## **背景と目的**
近年、大規模言語モデル (LLMs) の進化により、複雑な推論が可能になっています。特に **OpenAI の o1 モデル** およびその類似モデル (Qwen, DeepSeek, Kimi など) は、**スケーリングによる推論能力の向上** を目指しています。

### **LLM の推論プロセスと underthinking**
LLMs は、基本的に「確率的トークン生成」に基づいて推論を行います。しかし、そのアプローチには以下の 3 つのパターンがあります。

1. **直線的推論 (Linear Reasoning)**:  
   - 人間のように 1 つの思考を深く掘り下げ、正解を導く。
   - LLM においては CoT (Chain of Thought) で再現されることが多い。

2. **分岐的推論 (Branching Reasoning)**:  
   - 複数の解法を並列に展開し、適切なものを選択する。
   - Self-consistency や Tree of Thoughts (ToT) に近い戦略。

3. **発散的推論 (Divergent Reasoning)**:  
   - 考えを広げすぎて収束しない。
   - o1-Like モデルはこの傾向が強く、**underthinking の主要な原因** となる。

本論文では、この「発散的推論」が underthinking を引き起こし、正しい解法を途中で捨てる原因になっていることを明らかにしました。

---

## **実験と分析**
### **1.「考えの浅さ」の観察**
研究者たちは、以下の 3 つのデータセットを用いて、o1-Like LLM の推論パターンを分析しました。

| データセット | 内容 |
|-------------|------|
| **MATH500** | 高校数学コンテスト問題 |
| **GPQA Diamond** | 物理・化学・生物の大学院レベル問題 |
| **AIME2024** | 数学オリンピック予選問題 |

#### **主な発見**
- **誤答の方が、正答よりも 225% 多くのトークンを消費し、思考の切り替えが 418% 多い。**
- **多くの誤答は「途中の考え方は正しかったが、十分に掘り下げられずに別の方針に移ってしまった」ために発生している。**

---

### **2.「考えの浅さ」の定量化**
本研究では、**「Underthinking Score」** という新しい指標を導入しました。

#### **定義**
$$
\xi_{UT} = \frac{1}{N} \sum_{i=1}^{N} \left( 1 - \frac{\hat{T}_i}{T_i} \right)
$$

---

### **3.「考えの浅さ」の解決策**
研究者たちは、**デコード時に「思考の切り替えにペナルティを加える」 (TIP: Thought Switching Penalty) 戦略** を提案しました。

#### **TIP のアルゴリズム**
```python
def apply_thought_penalty(logits, step, alpha, beta, switch_tokens):
    if step < beta:
        for token in switch_tokens:
            logits[token] -= alpha  # ペナルティを適用
    return logits
```

#### **TIP の効果**
| データセット | 通常の正答率 | TIP 適用後 |
|-------------|------------|------------|
| **MATH500** | 82.8% | 84.3% |
| **GPQA** | 57.1% | 59.3% |
| **AIME2024** | 41.7% | 45.8% |

---

## **今後の展望**
- **TIP の応用範囲**: 文章要約、コード生成、翻訳タスクでの適用
- **「自己監視的推論 (Self-reflective Reasoning)」の実装**
- **TIP の動的適用 (Adaptive TIP)**: タスクの種類に応じた動的制御

---

## **まとめ**
この研究は、LLMs の **「考えの浅さ」** という新たな課題を明確にし、**TIP という実用的な解決策を提示した画期的な研究** です。今後の LLM の推論能力向上に大きな影響を与える可能性があります。
win11 24h2 でbrother複合機のスキャナードライバだけがインストールに失敗する

再発しそうなので、メモ。

# 状況
windows11 24h2 に、brother複合機の（今回は[MFC-J6973CDW](https://www.brother.co.jp/product/printer/inkjet/mfcj6973cdw/index.aspx)）、ドライバのインストールをしたい。
[フルパッケージ](https://support.brother.co.jp/j/b/downloadend.aspx?c=jp&lang=ja&prod=mfcj6973cdw&os=10068&dlid=dlf106150_000&flang=1001&type3=11)をインストールしても、スキャナードライバーだけが失敗する。

インストール後に「インストール診断ツール」で確認すると「失敗」となっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487385/a72786f9-4d8b-860f-af6c-97e020ad48bf.png)


これらと同じ状況。リンク先に改善策はなし。
https://okbizcs.okwave.jp/brother/qa/q10302551.html
https://okbizcs.okwave.jp/brother/qa/q9972231.html

こちらによると、Windows11 24h2での問題らしい。
https://karigane-ababababa.hatenablog.com/entry/2025/01/08/215021
brotherは把握しているなら、サイトに掲載してほしい。

# 対応
### １．一度、Brotherのフルパッケージドライバをインストールする
スキャナーだけが失敗している状態

### ２．Windowsの「設定」から、プリンターを手動で「追加」する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487385/9178ec4c-73af-ef27-799b-5b5d99afe2c0.png)
ドライバーはインストール済みのため、Windowsが自動で適用してくれる。

### ３．Brother複合機が表示され、「スキャナー設定」タブが表示されたら成功
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487385/26ced08c-e7d5-6b17-4a89-af020934ab06.png)

### ４．Brotherのアプリ（ControlCenterなど）は使えないが、Windows標準のスキャナアプリなどは利用できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487385/71ac66fe-33ae-9426-7b4a-c0272e1a3a0c.png)
学部生からできるLinux解析（超基本編:ディレクトリの作り方）

この記事は研究室内で学部生の後輩向けに書いた文章をまとめたものです。
情報は2025年1月時点、Linux用です。何か問題がありましたらお気軽にご質問ください。

## 解析を始める前に：Linuxの基本動作


##### ディレクトリを作る
解析を実行するフォルダのことを「ディレクトリ」と呼ぶ。
これは後述するが、作業机のようなイメージである。


解析を行う際は、元データ（ショットガンシーケンスのファイル.fastq.gzや、NCBIから取り込んだSRAなど）を別の場所（ここでは例として「motodate」内の「kaiseki」）に **コピー** する。
（※移動じゃなくてコピー。元データは触らないようにするのが吉）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4000526/cad63e6d-6175-79c0-4183-6d8346b5c62b.png)

コピー先のフォルダを開き、何もないところで右クリック、出てきた選択肢の中から「端末で開く」を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4000526/a8196d36-1971-86c3-dc75-30a671955235.png)

端末（コマンドプロンプト）が現れた。
コマンドを使う解析は基本的にここで進めていく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4000526/a81e5608-8b2f-42f5-fbd1-1ebc23c71cda.png)

「ディレクトリ名」に続く＄　の先に何かしらの命令（コマンド）を入力することで、「motodate」内の「kaiseki」を対象（ディレクトリ）としたコマンド操作が可能になる。

 **Windouwsで使えるようなショートカットキーは使えないどころか異なるコマンドを出してくるので注意！！！例としてCtrl＋Cを押すと解析が中止されてしまう。罠。** 

例として、ディレクトリ内のファイルの名前を全て表示してくれるコマンド「ls」を打ち込んでみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4000526/5bbb1bd9-8321-3bf2-f5b5-5b34d0a3f8b2.png)

ディレクトリ内のファイルの名前が表示された。
端末に打ち込んだコマンドは、基本的にそのディレクトリ内のファイルにしか影響しない。

概念図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4000526/1d25da77-9ff7-a0af-2fc0-36e1f0a646c8.png)
ディレクトリは作業机のイメージであり、「kaiseki」というフォルダで店を広げている場合（ディレクトリとして認識させている場合）「motodate」の中のファイルは開けない。机の上にあるものを知りたい場合は ls で確認するとよい。


ディレクトリを変える際は、「cd」と打つと一番大元のディレクトリに戻るので、そこから「cd + 移動したいディレクトリ名」を入力する。

概念図。試しに色々なディレクトリに移動してみると良い。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4000526/2a0e6f5d-aeab-e179-2161-d4ef89063ff5.png)
柔道整復師の施術録は電子的であってはいけない？（開発日誌＃3）



## 1. 柔道整復師の施術録の現状

現在、**柔道整復師法には施術録の作成や保存に関する明確な規定は存在しない**。  
しかし、**受領委任の協定**においては、施術録の作成が求められている。  
このため、施術録の作成・保存は**実質的に義務とされている**が、**その形式（紙媒体か電子媒体か）についての明確な指針は示されていない**。

### 1-1. 受領委任制度と施術録の義務
受領委任制度とは、柔道整復師が療養費（健康保険の適用を受ける施術費）を患者に代わって請求できる仕組みであり、この制度を利用するためには施術録の作成が必要とされている。

#### 受領委任制度における施術録の義務
- **記録の保存期間**：原則5年間
- **記録の内容**：患者の氏名、傷病名、施術内容、施術日など
- **記録の提出義務**：保険者の審査に応じるため、適切に保存する必要がある

ただし、**この施術録が「紙」でなければならないという規定はない**。  
したがって、電子的な施術録も理論上は可能であるが、現在の行政の運用上では紙が一般的に使用されている。

---

## 2. 医科における電子カルテの歴史

### 2-1. 1999年以前の状況
1999年以前、**診療録（カルテ）は紙媒体で保存するのが一般的**であり、  
法律上も**電子カルテに関する明確な規定は存在していなかった**。

- 医療法では診療録の作成と保存が義務付けられていたが、**電子媒体での保存は法的にグレーゾーン**であった。
- **一部の病院では独自に電子カルテを導入していたが、正式な法的根拠はなかった**。
- **電子カルテの法的位置付けが不明確だったため、紙カルテの併用が求められる場合もあった**。

### 2-2. 1999年のガイドライン制定
1999年に厚生労働省が「診療録等の電子媒体による保存について」の通知を発表し、  
**電子カルテの運用が正式に認められた**。

#### 1999年の通知のポイント
- 電子カルテの保存には**「真正性」「見読性」「保存性」** の3つの原則を満たす必要がある。
- 紙カルテと同等の法的効力を持たせるため、適切なシステム管理が求められた。
- **このガイドラインにより、電子カルテが合法であることが明確化された**。

### 2-3. 1999年以前は電子カルテは違法だったのか？
1999年以前は、電子カルテが明確に違法とされていたわけではないが、  
**法的な明確性が欠如していたため、ほとんどの医療機関は紙のカルテを使用していた**。

- **電子保存が法律上認められていなかったため、裁判での証拠能力に疑問があった**。
- **病院によっては独自の電子記録を使っていたが、紙カルテも併用する必要があった**。
- **1999年のガイドライン制定により、電子カルテが正式に合法化され、普及が進んだ**。

---

## 3. 柔道整復師の施術録の電子化に向けて

現在、柔道整復師の施術録に関しては、電子化に関する明確な規定がないため、  
**電子施術録の導入は各施術所の判断に委ねられている**。

しかし、以下の理由から、施術録の電子化を検討する価値は十分にある。

### 3-1. 業務効率化の観点
- **手書きカルテでは検索・管理に時間がかかる**が、電子カルテなら素早く検索可能。
- **紙の保管スペースが不要になり、管理コストが削減できる**。
- **バックアップを取ることで、紛失や劣化のリスクを回避できる**。

### 3-2. 法的適用の可能性
- **電子施術録が法律で禁止されているわけではない**ため、導入は可能。
- 医科の電子カルテと同様に、**「真正性」「見読性」「保存性」を満たせば問題ないと考えられる**。
- **将来的に柔道整復師の施術録にも電子化のガイドラインが制定される可能性がある**。

### 3-3. 施術録電子化のために考慮すべき点
- **改ざん防止の仕組み（電子署名・ログ管理など）を導入することが望ましい**。
- **保険者や監査機関が電子施術録を受け入れるかの確認が必要**。
- **医科の電子カルテガイドラインを参考に、適切なデータ保存体制を整える**。

---

## 4. まとめ

- **柔道整復師の施術録は、受領委任の協定により作成・保存が求められているが、電子化に関する明確な規定はない**。
- **医科では1999年以前は電子カルテの法的位置付けが不明確だったが、ガイドラインの制定により正式に認められた**。
- **柔道整復師の施術録も、医科と同様に「真正性」「見読性」「保存性」を満たせば電子化が可能と考えられる**。
- **電子施術録の導入により、業務の効率化や管理コストの削減が期待できる**。
- **今後の法整備に向けて、現場レベルでの電子化の検討が求められる**。

---
**柔道整復師の施術録は電子的であっても良いのではないか？**

しかし，実際に採用するまでも採用してからも，課題も多そうだ．．．．
【Zod】nullableとnullishの違い

Zod の `.nullable()` と `.nullish()` は `undefind` を許容するか。  
`.nullable()` は `undefind` を許容せず、 `.nullish()` は許容する。

## `.nullable()`

`.nullable()` は `null` のみを許容する。  
使用方法は以下のとおり。

`z.nullable()` を使用する。

```typescript
const nullableString = z.nullable(z.string());
nullableString.parse("asdf"); // => "asdf"
nullableString.parse(null); // => null

```

または、 `.nullable()` メソッドを使用する。

```typescript
const E = z.string().nullable(); // equivalent to nullableString
type E = z.infer<typeof E>; // string | null
```

https://zod.dev/?id=nullables

## `.nullish()`

`.nullish()` は `null` と `undefind` を許容する。  
使用方法は以下のとおり `.nullish()` を使用する。

```typescript
const nullishString = z.string().nullish(); // string | null | undefined

// equivalent to
z.string().nullable().optional();
```

https://zod.dev/?id=nullish
【2024年02月版】Debian12 に proxmox8.3 (arm64) をインストールするメモ 【arm64】

# はじめに

ProxmoxのISOからのインストールが上手くいかない時に、Debian経由でインストールしたのでその時のメモ

公式のマニュアルのとおりに作業するだけ

# 手順

## `/etc/hosts` の修正
1. `/etc/hosts` に自分のホストIPを記載する
## Proxmox VE のリポジトリを追加
1. `echo 'deb [arch=arm64] https://mirrors.apqa.cn/proxmox/debian/pve bookworm port'>/etc/apt/sources.list.d/pveport.list`
    - arm64 を追加しているのに注意
1. `curl -L https://mirrors.apqa.cn/proxmox/debian/pveport.gpg -o /etc/apt/trusted.gpg.d/pveport.gpg`
1. `apt update && apt full-upgrade`

## Proxmox VE のパッケージのインストール
1. `apt install ifupdown2`
1. `apt install proxmox-ve postfix open-iscsi`

# 確認

ブラウザでインストールしたホストのPort 8006 にアクセスして、ProxmoxのWegGUIにアクセスできることを確認する

- 例: ホストが `10.0.0.240` の場合
    - `https://10.0.0.240:8006`
# リンク

- [Install a standard Debian bookworm (arm64)](https://github.com/jiangcuo/Proxmox-Port/wiki/Install-Proxmox-VE-on-Debian-bookworm)

# さいごに

かんたんでしたね
ツイートアプリを作成しながら学習 1-3【Django + React】 💻Renderへのデプロイ手順💻

## はじめに

本記事では、Django + React アプリを**Render**にデプロイする方法について詳しく解説します。今回のデプロイでは、多くのエラー に遭遇し、それらを解決するためにさまざまな手順を試しました。

その経験を活かし、同じミスをしないようにするための手順書を作成しました。

`本記事の目的`
- Render へのデプロイ手順 を最初から最後まで詳しく解説
- エラーの原因と解決策 を記録し、今後の参考に
- Render の仕組みを理解し、どこを見ればよいかを明確にする
- 技術ブログとして公開し、他の開発者にも役立つ情報にする

## 目次

#### 1. Renderとは？
#### 2. デプロイの準備
#### 3. データベースの設定 (PostgreSQL) とマイグレーション
#### 4. Render にフロントエンド (React) をデプロイ
#### 5. Render にバックエンド (Django) をデプロイ
#### 6. 環境変数の設定 (SECRET_KEY, DATABASE_URL)
#### 7. 今後の改善点と学び

## Renderとは？

Render は、サーバーレスでアプリケーションをデプロイできる PaaS (Platform as a Service) です。

`特徴`

- 簡単にデプロイ可能 → GitHub 連携で簡単にデプロイできる
- バックエンド・フロントエンド・データベースをまとめて管理できる
- 環境変数 (SECRET_KEY など) を設定しやすい
- 無料プランあり → 小規模な開発では十分

## デプロイの準備

デプロイをスムーズに進めるため、以下の準備を行う。

#### 1.GitHubリポジトリの準備
- .gitignore に .env や node_modules を追加

#### 2.Docker の設定 (Render は Docker にも対応)
- Dockerfile を作成し、アプリをコンテナ化

#### 3.環境変数を .env に記述

開発時はここを読み込んで`DEBUG=True`、`DATABASE_URL="sqlite:///db.sqlite3"`
とします。

```python

# backend/.end

DJANGO_SECRET_KEY="xxxxxxxx"
DEBUG=True
ALLOWED_HOSTS="localhost,127.0.0.1"
DATABASE_URL="sqlite:///db.sqlite3"

```
→ .gitignore に .env を追加し、GitHub に push しないように注意！

## データベースの設定 (PostgreSQL) 

#### 1.Render で PostgreSQL を作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3895655/7d9bbc7a-0503-f81b-ba33-4163adb01869.png)

#### 2.Freeプランを選択

#### 3.内部接続用の DATABASE_URL を取得

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3895655/28622f86-f885-4e03-c02a-4851ed22c57e.png)


## Render にフロントエンド (React) をデプロイ

#### 1.New Web Service を作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3895655/523260bf-7695-f3b1-52ea-1b7965b927ac.png)

#### 2.GitHub と連携し、リポジトリを選択

#### 3.connectを選択

#### 4.Build CommandとPublish Directorryを設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3895655/8fe3e028-7950-4fc0-3b4b-87bb85b2b276.png)



##  Render にバックエンド (Django) をデプロイ

#### 1.Renderにサインアップします。

#### 2.New Web Service を作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3895655/197a1fdf-c6ec-bc52-25dc-c652025d9953.png)

#### 3.GitHub と連携し、リポジトリを選択

#### 4.connectを選択

#### 5.Freeプランを選択

#### 6.Environment Variables (環境変数) を設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3895655/4ffa5249-4a6d-2c99-9761-c94b9e0b5ccc.png)

#### :pencil2: 解説

- DATABASE_URL = 上記で説明したPostgresのInternal Database URLを設定

- DEBUG = False

- ALLOW_HOSTS = デプロイしたフロントエンドのURLを設定

## 今後の改善点と学び

- 環境変数は最初に Render に設定する！

- エラー発生時は Render の「Logs」を確認

- データベース URL を間違えないように注意

- GitHub に機密情報 (.env) を push しない！
【React】react routerを使用してコンポーネントを切り替えたいけど、画面が表示されなかった

## 経緯
react routerを使用してコンポーネントを切り替えるようにしたくて以下のような実装をしていました。

```typescript
App.tsx

<main>
<BrowserRouter>
    <Routes>
    <Route path='/pageA' element={<A />} />
    <Route path='/movie' element={<B />} />
    </Routes>
</BrowserRouter>
</main >
```

しかしこの状態では、いざ画面を表示してみるとエラーがdevツールに出力されており、何も表示されません。
```
TypeError: Cannot destructure property 'basename' of 'm.useContext(...)' as it is null.
```

## 解決
少し調べてみると`BrowserRouter`はアプリケーション全体をラップするようにしないといけないようです。
`main.tsx`で`App.tsx`を`BrowserRouter`でラップするようにすると・・・

```typescript
main.tsx

<BrowserRouter>
    <App />
</BrowserRouter>
```

```typescript
App.tsx

<main>
    <Routes>
    <Route path='/pageA' element={<A />} />
    <Route path='/movie' element={<B />} />
    </Routes>
</main >
```

うまく画面表示されました。
AWK覚え書き

# はじめに

最近AWKを使って他のコマンドの出力を加工することが多いため、使い方を覚えておくために記事として残しておきたいと思います。
s
# AWKとは

- LinuxやMacで使用可能なコマンド(プログラミング言語)
- 入力として与えたテキストを加工して出力できる

## コマンド例

例えば次のようなCSVファイルを想定します。

```csv:sample.csv
id,price
0,100
1,10
2,200
3,150
4,100
```

CSVファイルの特定の列だけを切り出して表示することや

```bash:コマンド
cat sample.csv | awk -F'[,]' '{print $2}'
```

```bash:出力
price
100
10
200
150
100
```

列の合計を計算することができます。

```bash:コマンド
cat sample.csv| awk -F'[,]' 'NR>1{sum += $2} END {print sum}'
```

```bash:出力
560
```

## よく使用するコマンド

### 空白区切りでn列目を表示
  - `$0`で入力行全体、`$1`~で入力を空白区切りにした場合の1列目、２列目、・・・を表示します

```bash
{任意のコマンド} | awk '{print $2}'
```

### 任意の区切り文字でn行目を表示
  - `-F`の直後に区切り文字にしたい文字を設定します
  - 区切り文字は２文字以上でも設定可能です
  - 組み込み変数である`FS`を使用しても区切り文字を変更することができます

```bash
# "="を区切り文字として２列目を表示
{任意のコマンド} | awk -F= '{print $2}' # -Fオプションを使用する場合
{任意のコマンド} | awk -v FS="=" '{print $2}' # 組み込み変数を使用する場合
```

### 先頭行を除いた残りの行を表示
  - コマンドやファイルからヘッダ行を取り除きたい場合に使用します
  - NRはビルトイン変数であり、現在行のレコード番号を表します

```bash
{任意のコマンド} | awk 'NR>1{print $0}'
```

### n行目のみを表示
  - 指定した行のみを取り出したい場合に使用します
  - 行指定より`grep`で絞り込んでしまうことが多いのであまり使わないかも

```bash
# ２行目だけを表示する場合
{任意のコマンド} | awk 'NR==2{print $0}'
```

### 最終行のみを表示
  - 最後に必要な情報（集計結果など）がある場合に、その行だけ取り出したい場合などに使用します
  - `END`を使用することで最後の行でのみ処理が実行されます
  - `tail`と組み合わせても同じことができます

```bash
{任意のコマンド} | awk 'END{print $0}'
```

### 四則演算
  - 出力に対して加減乗除などの演算子が使用できます
  - 出力の単位を変換したり、オフセットを加えるなどの用途で使用できます

```bash
echo 10 | awk '{print $1 + 1}' # 11
echo 10 | awk '{print $1 - 1}' # 9
echo 10 | awk '{print $1 * 2}' # 20
echo 10 | awk '{print $1 / 2}' # 5
```

## 参考文献

- [とほほのAWK入門](https://www.tohoho-web.com/ex/awk.html)
GitHub Pagesが更新されないときに確認すること

# はじめに
GitHub Pagesで公開しているリポジトリにプッシュしたのに、ページが更新されないときに確かめること

### デプロイは正常に終了しているか？

デプロイが正常に終了しているかを github.com で確認する

リポジトリのサイドバーにある Deployments をクリックするか、`https://github.com/<ユーザーID>/<リポジトリ名>/deployments`に直接移動すればデプロイ履歴が表示できる

デプロイが異常終了している場合は再実行する

![github.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3917871/259f8650-2c20-2aab-60e4-7a968140a6ca.png)

### 意図した内容がデプロイに取り込まれているか？

最新のデプロイに使用されたコミットを見て、意図した変更が取り込まれているかを確認する

デプロイ履歴ページで`Active`タグが付いているコミットタイトルをクリックすれば、取り込まれたコミットに移動できる

意図した変更が取り込まれていなければ、再度コミット&プッシュする

![github2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3917871/cab5229d-fe73-3206-97b5-8d3820c79985.png)

### キャッシュに邪魔されていないか？

cssやjsを含んだ変更の場合、ブラウザの強力なキャッシュのために以前の読み込み内容が表示されている場合がある

閲覧に使用しているブラウザの「閲覧履歴を削除」などでキャッシュを削除する

ChromeやEdgeであれば「キャッシュされた画像とファイル」にチェックを入れて削除すればよい

![github3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3917871/5688eda2-f820-7ef7-7bf2-d90d4e4b85ca.png)
M4 mac miniのMAMPでxdebugを動かす方法

結論：xdebugがうまく動作しない原因はmamp内のPHPでlaravelをインストールしていなかった事が原因だった

①mampをインストール
インストール後、mamp7からhttpd.confのLoadModule rewrite_module modules/mod_rewrite.soがコメント化されているので有効化してあげる

②ホームディレクトリにある.zprofileにmampのPHPのパスを通す。
export PATH="/Applications/MAMP/bin/php/php8.X.X/bin:$PATH"
source ~/.zprofileで反映

※XAMPPの場合は以下を設定すること
export PATH=/Applications/XAMPP/bin:$PATH;

③sudo pecl install xdebugを実行すると
/Applications/MAMP/bin/php/phpX.X.X/lib/php/extensions/no-debug-non-zts-XXXXXXX内に
xdebug.soが作成される。
【mac版】yt-dlpで、Youtubeの動画を、音声+動画を結合して、ダウンロード先も指定、Quicktime Playerで再生されない不具合も解決するのを、初心者にもわかりやすく解説

yt-dlpとは？
youtubeの動画をPCにダウンロードできる、Pythonパッケージ。
元は2006年に開発されたyoutube-dl（wiki参照）というものだったが、それがダウンロード速度を100倍ほどに改良されたものが、コレである。

どうするのか。

macのターミナルを開く（command + Shiftボタンで、ターミナルと検索）
そこにこれをコピーして打ち込む↓
```
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
んで次にターミナルにこれを打ち込む↓
```
touch ~/.zshrc
open -e ~/.zshrc
```
開いたファイルにこれを打ち込む↓
```
export PATH="/opt/homebrew/bin:$PATH"
```
次に、yt-dlpをインストールするから、ターミナルにこれを打ち込む
```
brew install yt-dlp
```
そしたら、ダウンロードしたいYoutubeの動画を用意する

そして、以下のコマンドを打ち込む（ナンタラカンタラの部分は、自分のそのダウンロードしたい動画のURLリンクに載ってるやつをつなげる）
```
yt-dlp "https://www.youtube.com/watch?v=ナンタラカンタラ" -F
```
すると、なんかいろいろ長い文字列が出てくると思う、最も左にはIDがあり、そこにそれぞれ、3桁の数字が書いてあるはず
![](https://storage.googleapis.com/zenn-user-upload/c13305dbce81-20250202.png)


EXTの、m4aのなかで一番下にあるIDの3桁と、mp4で一番下に表示されてるIDの3桁をメモする
画像の場合、m4aなら140、mp4なら299になる（それが最も質のいい動画ができる選択）

注意⚠️：この時、音声はm4a、動画はmp4を選択し、さらにmp4は、右のINFOが、mp4_dashを選択しなければならない、そうしないとQuicktime Player上でコーデック不対応により再生ができない動画が誕生するだけ

そしたら、早速ダウンロードしたいところだが、一旦落ち着いて、
ffmpegというものをダウンロードしとく
ターミナルに、これを打ち込む
```
brew install ffmpeg
```
そしたら、これをターミナルに打ち込んで、いざ動画をダウンロードする↓
（この時 -f 299+140となっているように、idは、mp4のもの+m4aのものの順に書く）
あとちなみに下のコードは、動画と音声を結合させて、さらにそれをFinderの「ダウンロード」内にダウンロード先を指定させた。このコマンドにしないと動画と音声は結合されず２つのファイルでダウンロードされ、さらにダウンロードに保存されておらず保存先がどうなってるのかわかりずらいからこれにしよう
```
yt-dlp -o '~/Downloads/%(title)s.%(ext)s' "https://www.youtube.com/動画のURL末尾のナンタラカンタラ" -f 299+140 --merge-output-format mp4
```
ここで、問題が発生
「これでもmacのquicktime playerで再生できないときがある（^o^)」

これを解決するには、2パターンの解決策を見つけた

1. オープンソースメディアプレーヤーのVLCをダウンロードしてそこでその動画を視聴する
https://www.videolan.org/vlc/index.ja.html　（無料）

2. Youtubeの動画をダウンロードするのではなく、Youtube再生リストに入れて（新規作成するとか）、その再生リストのURLをナンタラカンタラに入れて動画をダウンロードする
つまり、

```
yt-dlp -o '~/Downloads/%(title)s.%(ext)s' "https://www.youtube.com/動画のURL末尾のナンタラカンタラ" -f 299+140 --merge-output-format mp4
```
そうすると、なんかQuicktime Playerでも再生リスト内のダウンロードされた動画はすべて再生できた。意味わからんな。ﾊﾊッ!!!
（この時、再生リストに入っているすべての動画が、画面サイズや投稿された画質（例えば1080p*30fps）などがすべて統一されていないと、これは不発に終わる（IDが違くなる為）

一体何をやったのか。

1. homebrewをインストールした（これはyt-dlpをインストールするためのインストーラ）
2. その後yt-dlpをインストールした（これがyoutubeの動画をダウンロードする為のもの）
3. コマンドに-Fを付けて、欲しい動画に関するダウンロード可能なファイル形式を見た
4. ffmpegをインストールした（ダウンロードする際に動画と音声が別々にならず結合させるため）
5. Quicktime playerで再生できなくなる（コーデックにav01が含まれてしまう）のを阻止する為、6. Youtube動画ではなく、その動画を入れた「再生リスト」URLを何たらかんたらに入れる
んでコマンド
```
yt-dlp -o '~/Downloads/%(title)s.%(ext)s' "https://www.youtube.com/再生リストのURLの末尾のナンタラカンタラ" -f 299+140 --merge-output-format mp4
```
を打ち込んで、ダウンロードした
7.すると動画と音声を結合させ、ダウンロード先をFinder「ダウンロード」を指定したから、macの「ダウンロード」に保存される

皆さんが無事にダウンロードできたことを祈ります
（299+140のとこは、ちゃんと自分でIDみつけて変えなきゃエラー出ると思うよ）
（299じゃなくて136とか、youtuberさんが投稿されてる動画が、どんだけ良い画質とか画面サイズなのかとかで、IDの数字もちょっと変わってくるからね。）


参考になったら、いいねお願いします🥺（どれだけの人がこの記事に対してリアクションがあるのか知りたいです）
Git 勉強会3

# Git 勉強会3

## 全体目標

gitを使って開発ができるようになる

## 方針

基本的にはCLI（コマンドベース）
CLIができたらGUIだってできるだろうって考え

## 今回の概要

- rebase
    - コマンド一覧
- ssh
    - githubからsshを使ってプロジェクトをclone
- stash
- プルリクベース開発
- blame
- diff
    - 特定期間の変更一覧
- author修正
- grep


## コマンド集

### rebase

commitの履歴を編集する機能  
`head`〜2つのコミットを編集するとした場合

```
git rebase -i head~2
```

実行するとこんなこんな感じで表示される

```
pick 0c1b4b9 hoge追加
pick 9859ba9 hogehoge追加
```

pickの所を以下のコマンドに書き換えて保存するとrebaseが実行される

#### コマンド一覧

> p, pick = use commit  
> r, reword = use commit, but edit the commit message  
> e, edit = use commit, but stop for amending  
> s, squash = use commit, but meld into previous commit  
> f, fixup = like "squash", but discard this commit's log message  
> x, exec = run command (the rest of the line) using shell  
> d, drop = remove commit


### ssh

`https`ではなく、`ssh`を使って認証もできる  
`ssh`では[公開鍵認証](http://knowledge.sakura.ad.jp/beginner/3543/)という技術を利用してる

```
git clone git@github.com:facebook/react.git
```

sshの場合の利点はリポジトリにアクセスする際にIDとパスワードを毎回求められません

#### githubからsshを使ってプロジェクトをclone

- 公開鍵作成
    - `id_rsa`と`id_rsa.pub`ができる
        - `id_rsa`が秘密鍵
        - `id_rsa.pub`が公開鍵（publicの略）
- githubに公開鍵を登録
- 「clone or download」でsshのアドレスを選ぶ


### stash

現在の作業を一時的に退避させるコマンドです

作業中に別のブランチで作業しないといけなくなった時に、移動しようとするとエラーが出る時があります  
そんな時に使えるのが`stash`コマンドです

```
git stash
```

Link: [Stash | 逆引きGit | サルでもわかるGit入門](http://www.backlog.jp/git-guide/reference/stash.html)

### プルリクベース開発

githubの機能であるプルリクエストを使用した開発手法です  
（github以外にもある 例:bitbucket, gitlab, gitbucket）

プルリクベースの開発モデルとしては「github flow」を検索してみましょう


### blame

誰が何行目のコードをコミットしたのかという犯人探しのコマンド

```
git blame file_name
```

特定の行数を調べたい時は

```sh
# 5行目
git blame -L 5 file_name

# 先頭から5行目
git blame -L ,5 file_name

# 5行目から10行目まで
git blame -L 5,10 file_name

# 5行目から3行
git blame -L 5,+3 file_name

# 5行目までの3行
git blame -L 5,-3 file_name
```



### diff

```
git diff --stat --name-only commitid1 commitid2
```


### author修正

`git commit --amend`ではcommiterは修正できてもauthorは修正できない

詳しくはLink先で

Link: [CommitとAuthorを修正する時は--authorではなく--reset-authorを使おう](http://yuzu441.hateblo.jp/entry/2016/06/29/214535)


### grep

普通の`grep`と違ってgitで管理しているファイルだけを対象にgrepできる

```sh
git grep -e 'regex'

# and や or を設定できる
git grep -e 'aaa' --and -e 'bbb' --or -e 'ccc'
```

- `-i / --ignore-case` 大文字/小文字区別しない
- `-n / --line-number` 行数を表示する

regexの部分は正規表現を入れて検索する

## switch

新しくブランチを切る時や、ブランチを切り替える時に使うことができる

```sh
# old
git checkout -b hoge

# new
git switch -c hoge
```

> `-c`は`--create`の略

ブランチの切り替えは

```sh
# old
git checkout master

# new
git switch master
```


## restoreコマンド

変更したファイルを変更前の状態（直前のコミット）に戻す時に使用する

```sh
# old
git checkout hoge.txt

# new
git restore hoge.txt
```
Git 勉強会2

# Git 勉強会2

## 全体目標

gitを使って開発ができるようになる



## 方針

基本的にはCLI（コマンドベース）
CLIができたらGUIだってできるだろうって考え



## 今回の概要

- clone
- push
    - pushの引数
- branch
    - branchとは
- checkout
    - ブランチの作成と移動を同時にする
- fetch
- merge
- conflict
    - conflict時の対応
- pull



## コマンド集

### clone

サーバからgitプロジェクトを取ってくるコマンド

```
git clone https://~ directory
```

directoryは`git clone`したリポジトリをどこに保存するのかを指定できる

```
git clone https://github.com/facebook/react.git reactProject
```

これで`reactProject`というディレクトリにgithubからダウンロードしたプロジェクトが保存されます

directoryは省略可能で、省略した場合はプロジェクト名のディレクトリが作成され保存される

-----

### push

自分の更新分をサーバにアップロードするコマンド

```
git push remote branch_name
```

#### pushの引数

- remote
    - サーバアドレスのエイリアス（originが慣例）
    - 自由に設定可能
    - `git push hoge master`のようにすれば`hoge`で設定されているサーバに`push`できる
- branch_name
    - ブランチ名


`git push`について詳しくはブログにまとめてる

Link: [git push](http://yuzu441.hateblo.jp/entry/2014/08/11/000959)

-----

### branch

ブランチを切るためのコマンド

```
git branch branch_name
```

#### ブランチとは

簡単に言うと特定のコミット（大概最新）から  
「○○機能作成」「リリース準備」のように分岐して開発をするためのもの

Link: [サルでもわかるgit入門 - ブランチとは](http://www.backlog.jp/git-guide/stepup/stepup1_1.html)

-----

### checkout

ブランチを切り替えるためのコマンド

Git 2.23から入った`switch`コマンドの方がわかりやすいので、そちらを使うといいです  
https://gist.github.com/yuzu441/9cc191aa9bdfdd39ee5da07284f2d1b6/#file-git_study04-md

<del>

```
git checkout branch_name
```

個人的には`git reset`使うからあんまり使わないけど  
変更したファイルを最新のコミットの状態まで戻す機能もある

```
git checkout appplication/app.js
```

#### ブランチの作成と移動を同時にする

`branch`で作って、`checkout`で移動をするのは面倒くさい  
`checkout`コマンドの`-b`オプションを使えば同時にできる

```
git checkout -b branch_name
```

</del>

-----

### fetch

サーバのリポジトリから更新分を取ってくるコマンド

```
git fetch remote branch_name
```

基本的には`remote`と`branch_name`まで指定して使用する

`git fetch`にはリモートで削除されたブランチを  
ローカルで持ってるリモートブランチ情報を削除してくれる機能もあるので  
おまじないの用に`--prune`オプションを付けておくといい

```
git fetch -p remote branch_name
```

（`-p`は`--prune`の省略）

-----

### merge

ブランチとブランチを結合（マージ）するコマンド

```
git merge branch_name
```

mergeには

- fast forward
- non fast forward

の2種類があって


- fast forward  
マージ元のブランチに続けるようにコミットをします  
（branchAの先頭にbranchBの更新分をつなげるイメージ）
- non fast forward  
マージする際に、下の例のようなマージコミットというコミットをする  
> Merge pull request #1327 from TheBits/silent-merge

-----

### conflict

マージの際に競合（conflict）が起きることがあります

これはAの更新分とBの更新分が同じ場合いかに賢いgitのマージ機能といえど

- どちらを残すのか
- どちらとも残すのか
- どちらも残さないのか

というのをgitが自動で処理をすることができません  
そこであなたがgitに変わってマージ作業をしてやる必要があります

#### conflict時の対応

コンフリクトが起きた部分には

```
<<<<<<<<< HEAD
今のブランチの最新のコミットの状態
=========
マージをしようとしてるブランチの状態
>>>>>>>>> commit id
```

のようになっているので、残す所を残して、消す部分を消します  
（<<<< head や =====, >>>> commitidは消してください）

今回は両方を残すことにします

```
今のブランチの最新のコミットの状態
マージしようとしているブランチの状態
```

編集後`git add`でコンフリクトが起きたファイルをaddして  
すべてのコンフリクトが解決したら変更が確定したので`git commit`しましょう

-----

### pull

厳密に言うと違いますが  
`git fetch`と`git merge`を合わせてような機能です

```
git pull origin master
```

`origin`リポジトリの`master`を`fetch`して  
現在のブランチに`merge`するイメージです
Mac（M1）でPostgreSQLの環境構築してみた

## 目的
PostgreSQL環境をMac（M1）上に構築する。
以下の順で構築を進める。
①HomebrewでPosgreSQLをインストールする
②PosgreSQLを起動する
③DBに接続してテーブルを作成する
## 注意点（既にHomebrewでパッケージ管理されている場合）
x86_64ベースのHomebrewを使っている場合、この手順は実施しないでください。
（パッケージ管理が面倒になります。）

ターミナルで以下のコマンド入力し、環境を確認してください。
```
% uname -u
arm64
% which brew
/opt/homebrew/bin/brew
-->こんな感じで表示されたらOK
```
```
% uname -u
x86_64
% which brew
/usr/local/bin/brew
-->こんな感じで表示されたらNG
```

## 事前作業
Homebrewを使うので、インストールする。
インストールされていない場合は以下のサイトを参考にインストールすること。
[macOS（またはLinux）用パッケージマネージャー — Homebrew](https://brew.sh/ja/)

インストール後、以下のコマンドでARMベース版がインストールされていることを確認すること。
```
% which brew
/opt/homebrew/bin/brew
```

## ①HomebrewでPostgreSQLをインストールする
ターミナル上で以下のコマンドを入力し、インストールを実行する
```
% brew install postgresql@14
```
成功すると以下のように表示されてインストールが完了する
```
To start postgresql@14 now and restart at login:
  brew services start postgresql@14
Or, if you don't want/need a background service you can just run:
  /opt/homebrew/opt/postgresql@14/bin/postgres -D /opt/homebrew/var/postgresql@14
```
インストールが完了したら、以下のコマンドでPostgreSQLのバージョンが表示されていることを確認しておきます。
```
% psql -V
psql (PostgreSQL) 14.15 (Homebrew)
```

## ②PosgreSQLを起動する
以下のコマンドを入力し、PostgreSQLを起動する
```
% postgres -D /opt/homebrew/var/postgresql@14
LOG:  starting PostgreSQL 14.15 (Homebrew) on aarch64-apple-darwin24.1.0, compiled by Apple clang version 16.0.0 (clang-1600.0.26.4), 64-bit
LOG:  listening on IPv6 address "::1", port 5432
LOG:  listening on IPv4 address "127.0.0.1", port 5432
LOG:  listening on Unix socket "/tmp/.s.PGSQL.5432"
LOG:  database system was shut down at YYYY-MM-DD HH:MM:SS
LOG:  database system is ready to accept connections
```
➡︎こんな感じでログが表示されれば起動完了！

停止するときは[control]＋[C]で終了できます。
```
LOG:  received fast shutdown request
LOG:  aborting any active transactions
LOG:  background worker "logical replication launcher" (PID XXXXX) exited with exit code 1
LOG:  shutting down
LOG:  database system is shut down
```

## ③DBに接続してテーブルを作成する
DBを起動している状態で、新規ウインドでターミナルを起動し、以下のコマンドで起動したDBに接続をする
```
% psql -d postgres
psql (14.15 (Homebrew))
Type "help" for help.

postgres=# 
```
「postgres=#」のようにPostgreSQLのプロンプトに変われば接続成功です。

---
試しにテーブルを作成してみる
```
postgres=# CREATE TABLE table1 (
    id SERIAL PRIMARY KEY,
    name VARCHAR(50),
    category VARCHAR(20),
    price DECIMAL(10,2),
    stock INT,
    created_at TIMESTAMP,
    updated_at TIMESTAMP,
    description TEXT,
    status VARCHAR(10),
    supplier_id INT
);
CREATE TABLE
postgres=# 
```

テーブルが問題なく作成できましたね！

## 終わりに
今回、M1チップのMac環境でPostgreSQLの構築をしてみました。
問題なく構築できましたでしょうか？？
MacだとHomebrewに惑わされることが多々あるので、自分が今どのような環境でHomebrewを使っているのかを確認してから作業するのをオススメします！
技術選定について

# はじめに
ライブラリやフレームワーク、テストツールや運用、開発ツールなどの技術選定に関する記事となる。

長いことエンジニアをやっていると、技術選定を客から依頼されるケースがある。
が、本当にそれが正しかったのかは後になってみないと分からない気がするなと。。
では正しい or 適切な技術選定とは？と言うものを改めて考えてみたので、記事にしてみた。

# 技術選定について
技術選定は開発プロジェクトの成功に大きく影響する重要な決断です。
以下に、適切な選定方法を簡潔に説明します。

## 1. プロジェクトの要件を明確にする

まず、プロジェクトの目的と要件を明確に理解することが重要です。これにより、必要な機能や性能を満たす技術を絞り込むことができます。

## 2. 技術の特徴を理解する

各技術の特徴、長所、短所を理解しましょう。例えば、あるフレームワークは大規模プロジェクトに適している一方で、別のものはシンプルな機能に特化している場合があります。

## 3. コミュニティとサポート、安定性と成熟度の観点

活発なコミュニティと充実したドキュメントを持つ技術を選ぶことで、問題解決が容易になり、長期的な運用が安定します。
- 使用頻度（GitHubのスター数など）
- ドキュメントの充実度
- コミュニティの評価や人気

また活発にメンテナンスされているかどうかを確認することも重要です。
- コミットログの頻度
- Issues/Pull Requestsの対応状況
- 最終更新日

さらに、安定性と成熟度の観点として重要な観点は以下となります。
- 破壊的な変更の頻度が低いこと
- リリースから十分な時間が経過していること
- 安定版であること

## 4. 学習コストを考慮する

チームの技術レベルに合わせて、適切な学習コストの技術を選びましょう。
過度に複雑な技術は開発の遅延につながる可能性があります。
- 学習コストの低さ
- 守備範囲が適切であること
- 代替案の有無

## 5. パフォーマンスと拡張性を評価する

プロジェクトの成長を見据えて、パフォーマンスと拡張性に優れた技術を選択することが重要です。
観点としては以下となります。
- 依存関係の少なさ
- アプリケーションとの疎結合性
- テストの充実度
- パフォーマンス
- 互換性

## 6. 法的考慮事項

ライセンス上の問題がないことを確認します。

## 7. 個人的な興味や「ときめき」も大切に

技術的な観点だけでなく、チームが興味を持てる技術を選ぶことで、モチベーションの維持と技術の習得が促進されます。

以下記事が非常に興味深い記事となるが、
　https://blog.craftz.dog/tech-stack-lessons-from-my-7-year-indie-dev-journey-596e71b483ce
とっつき易さ（コミュニティの活発性や公式Documentの充実さ、または理解し易さ）と、
<font color="red">**一番重要なのはチームとして実際に触るであろう開発者が興味を持って取り組めるかどうか**</font>が重要だと思います。
※一時的に使って終わり、なケースは少なく長期的に使用することになるので。


これらの基準を総合的に評価し、プロジェクトに最適な技術を選定することが重要です。
また、選定基準を満たさない項目がある場合は、**それをリスクとして認識し対策を検討すること**が賢明です。


以上
最小努力と最短時間でPython3エンジニア認定基礎試験合格記

いつもマイクロソフトの認定資格試験ばかり受けていますが、そうじゃない試験も実は受けていたりします。今回は巳年🐍にちなんで、「Python3エンジニア認定基礎試験」を受けました（あまりにも安直すぎる）。いつも通りショートカット勉強法のため、真面目に点を取りたい方、コツコツ基礎を積み上げたい方にはあまり参考にならない記事になると思います。

また、今年はPython in Excelについて同人誌を執筆したいため、再学習したくなったという密かな目的も実はありました。普段はPythonユーザーでもプログラマーでもありません。

## 試験について
「Python3エンジニア認定基礎試験」とはPythonの民間資格で、[一般社団法人Pythonエンジニア育成推進協会](https://www.pythonic-exam.com/aboutus)が主催しています。SNS等でもよく合格報告している方がいたり、Qiitaのタグでも130以上の記事があるためそれなりにメジャーな資格であると思います。経産省の定めたITスキル標準にも資格の掲載があるようです。

現在は
 * Python 3 エンジニア認定基礎試験
 * Python 3 エンジニア認定データ分析試験
 * Python 3 エンジニア認定実践試験
 * Python3エンジニア認定データ分析実践試験

の4つの種類の試験があり、今回の基礎試験は最もベーシックなものとなります。
MOSでおなじみ、オデッセイさんのページから申し込むことができます。

https://cbt.odyssey-com.co.jp/pythonic-exam/

## 私のPython理解度について
5年くらい前にPythonの勉強を少しかじった時代がありました。Pythonといえばデータサイエンスのイメージが強いですが、当時はRPAツールが貧弱であったため、Seleniumでブラウザを操作して、自分の業務を効率化するためのツールを作っていました。懐かしい。データサイエンスもその後少しだけかじっています。

## 利用教材について
昨年の8月からずっと本棚に飾られていた公式推奨の以下2冊を使って勉強を行いました。（実はテキストは昨年の8月に購入していましたが、マイクロソフトの認定資格に追われて放置していました。）資格棚のあるような書店には、黒いほうの問題集は高確率で置いてあると思います。オライリー本は隣に親切においてくれているパターンもあれば、もしかすると、プログラミング棚にあるかも。オライリー本は翻訳本のため、かなり読みにくい日本語になってます。気になる方はUdemyの教材とかで学習したほうがいいかも。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">当日からの勉強でギリ合格笑<br>今年1個目の資格げと✌️ <a href="https://t.co/T9LAqGihyt">pic.twitter.com/T9LAqGihyt</a></p>&mdash; 🍊 (@ponponmikankan) <a href="https://twitter.com/ponponmikankan/status/1885662042377572366?ref_src=twsrc%5Etfw">February 1, 2025</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 学習について
年始に試験を申し込んでおり、実はやる気だけはありました。しかしながら結局今回もなんやかんやで体調を崩したり、予定がたてこんだりで当日の朝から勉強…。5時間くらいの勉強時間でした。出題範囲は基礎文法から出題されるため、オライリー本はすべて読まなくても正直いけます。また、黒い問題集も問題がぎっしり詰まっているわけでなく、ゆとりがあるので本当に時間がない人は先に問題集を問くとよいと思います(たぶん本気で机に向かってやれば2－3時間で一周できると思います)。プログラミング完全初心者の場合は、そのやり方はちょっときびしいかもしれません…。あまりにも黒い本の問題数が少ないため解説も読み込んで、繰り返し解くとよいです。

章別の比重については公式サイトをみるのと、下記の方の記事を参考にしてみてください。

https://qiita.com/python_academia/items/eac2bbf831caa610866f

## 本番について
テストセンターで60分の回答時間の中で択一で回答します。並べ替えや複数選択等はありません。40問しかないのでライトな割に、比重が重くなるため、結構緊張します。問題集になかったような質問ももちろん出ますが、基本的には問題集の問題が正しく回答できれば問題なく合格できると思います。そのまま出題のラッキー問題もいくつかあります。さすが公式問題集。ありがたい。30分くらいで回答し終わりました。最後に合否判定されます。認定証は受験後6週間くらいで届くようです。

というわけで、ヘビ年いいスタートが切れました(笑)今年は資格試験5つ以上を目指していますが、すでに2つ控えているので上半期に達成できるかも…！資格勉強されている方、一緒に頑張りましょう！！