OmniAICreator/Qiita-1.07M huggingface dataset:
データからは判別できない事象を解釈したい

　私は、今年度意識したいこととしてデータの解釈というものを挙げていました。様々なデータから見える特徴を考えていった際に、ドメイン知識から考える仮説と分析結果が異なることが多くあります。そこで、すぐにビジネスに適用することは難しいかもしれませんが、学術的なデータ分析に関する研究にはどんなものがあるのかなと思い、「質的研究・量的研究・混合研究」について、特に質的研究・混合研究について自分向けにまとめようと思います。​​

## 質的研究・量的研究・混合研究とは？[1][2]​

　質的研究とは、当事者の視点から見える事象や人々との関わり、その人の心情などの内面的世界を理解することで、他のケースに応用できる示唆を見出すこと。​

　量的研究とは、大規模データを分析した結果を一般化すること。​

⇒質的研究は問題を解決するための研究ではなく、潜在する課題を見つけるための研究であり、探索的な特性を有することで、一般的な統計解析（量的研究）とは異なる手段・目的をもったものであるものが大切となる。​

　また、質的研究と量的研究の両方の情報を合わせ持つ混合研究がある。混合研究とは、質的研究と量的研究の両者を相互補完し、組み合わせる研究方法で、質的データと量的データを一つの研究のプロセスの中で行い、結果を統合する研究方法として発展した研究パラダイムである。​

​

## 方法論について[2]​

　質的研究の方法論として1990年代に提唱されたグラウンデッド・セオリー・アプローチについてまとめる。グラウンデッド・セオリー・アプローチ（grounded theory approach: GTA）とは、データに基づいて概念をつくり、その概念同士の関係性を見て相関関係や因果関係を推察する手法である。ほかにも、修正版グラウンデッド・セオリー・アプローチやSteps for Coding and Theorization（SCAT）、主題分析法など体系的・帰納的に質的データを分析する手法が提唱されている。様々な質的分析手法があるが、各々で共通していることは数値化できないデータからテーマやストーリー、パターン、理論があるかを考えることであり、質的データ分析は、仮説検証ではなく仮説生成であるという意識が大切であるという。また、いずれの手法であっても、どのようなデータから仮説や概念は生まれたのか、どのような思考プロセスが分析者にあったかを明示することが共通している。​

​混合研究に関する方法論として基本型としては以下３つに分類できる[3]。​

#### 収斂デザイン​
　質データ、量データを独立的に並行して収集する方法。各データ収集は独立して行われるため、双方のデータはもう一方のデータから影響を受けることはない。収斂するタイミングは各々のデータ解析の後となる。​

#### 説明的順次デザイン​
　量的データの収集や量的研究を先に行い、その結果について、後に行う質的研究によって深化する方法。​

#### 探索的順次デザイン​
　質的研究を先に行い、そこから導かれた仮説を後から行う量的研究により一般化したり、検証したりする方法。​

　混合研究では、これらの方法論を目的に応じて使いわける。混合研究において、質的データと量的データを統合する理由としては以下のようなものがある。​
+ 分析結果に複数の視点をもつため​
+ データを組み合わせて包括的に理解するため​
+ 量的な結果を質的に説明するため​
+ 質的結果と量的結果の両者を探求して背景情報を考慮して探求するため​
+ 介入プログラムの実施経過を観察するため​
+ 事例を説明するため​

​

## 調べてみて​

　これまで研究法の流れについて要点をまとめてみましたが、実際にこれらの研究で大切にしている意味・行動の解釈はビジネスに適用する際にも大切なことであると思いました。以下の図1,2はDX時代に必要なスキルセットやそれぞれのスキルに関連した方法論をまとめたものです。​
 
|　　　　　　　　  　　　　　　　　   　　　　　　　　　　　　　　　　　　　　　|
|:-:|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951283/504f5a36-1a0b-b9f7-7fb1-99e513cc2419.png)|
図1. DX時代のスキルセット[4]

|　　　　　　　　  　　　　　　　　   　　　　　　　　　　　　　　　　　　　　　|
|:-:|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951283/404510b8-1f2f-43b5-451a-1abec2b8d13b.png)|
図2. 3つの研究方法[4]

　3つの方法論のうち数理演繹法や数理帰納法はこれまでまとめた量的研究において重視される方法論に当てはまると思いますし、意味解釈法は質的研究や混合研究が重視している目的に当てはまると思います。これらのように改めてデータサイエンティストに必要な力を見直すとともに、より広い視野でデータを見て解釈することができるよう勉強・実務への応用を試行錯誤していきたいと思います。


## ＜参考文献＞
[1]質的データ分析研究会
https://www.qdaa.info/qualitative-analysis/
[2]質的研究を実施するうえで知っておきたい基本理念 
https://doi.org/10.24489/jjphe.2020-002
[3] 地域保健活動に活かす混合研究法：質と量 両者の統合から見えるもの
https://doi.org/10.32117/hokenshikyouiku.5.1_7
[4]第2回：データ社会におけるデータリテラシーとは何か？
https://thinkindata.info/column/582/
python --version→command not found: pythonと表示された場合の対処法

:::note warn
これはプログラミング初心者が2024年12月に作成した記事です
:::
## どんな記事
Pythonのインストール後に
`python --version`
`python –version`
`python3 –version`
を実行
→`command not found: python`と表示された場合の対処法
## 背景
1. Progateの[Pythonの開発環境を用意しよう！（Mac）](https://prog-8.com/docs/python-env)を元にPythonのインストールを進めた
2. **④Pythonのインストール**で`python --version`を実行
3. `command not found: python`と表示された
## 解決策
```
python3 --version
```
Azureの請求書を分ける方法

# 目次
[1.はじめに](#はじめに)
[2.Azureの請求に関する全体像](#azureの請求に関する全体像)
[3.請求書を分ける方法](#請求書を分ける方法)
[4.請求書のセクションを分ける方法](#請求書のセクションを分ける方法)
[5.参考](#参考)

# はじめに
会社の事情によっては請求書を部署単位で請求する、または請求書自体を部署単位で発行するということが発生しますが、Azureにおいては「請求書を分ける」方法と「請求書をセクション別に分ける」方法の2通りの選択肢があります。

# Azureの請求に関する全体像
Azureにおける請求書の概念は下図の通り。
課金アカウント＞課金プロファイル＞請求書セクション＞サブスクリプション の階層となっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2511911/3647b062-60a6-baf4-04bb-dcf9336dff42.png)
出典：[課金アカウントをカスタマイズしてコストを整理する](https://learn.microsoft.com/ja-jp/azure/cost-management-billing/manage/mca-section-invoice)

このうち、請求書は「課金プロファイル」と１対１の関係になるので、請求書を分割したい場合は課金プロファイルを新しく作る、請求書セクションを分ける場合は課金プロファイルの請求書セクションを新しく作るということになります。

# 請求書を分ける方法
請求書を分ける場合は課金プロファイルを作成します。

Microsoft Azureのホームから「コストの管理と請求」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2511911/f20ae30c-82ac-471c-aa6b-3a11f953f4b5.png)

左パネルから「課金」＞「課金プロファイル」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2511911/9fdac2a0-40b3-5617-296d-e5f92287e432.png)

表示された画面の左上、「＋ Add」から課金プロファイルを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2511911/b9856d5b-7b1e-a715-ed9c-5d04ef44d4fd.png)

最後に、作成された課金プロファイルに対してサブスクリプションを紐づけてやれば、翌月の請求から請求書が２つ作成されます。

# 請求書のセクションを分ける方法
請求書は１枚でいいけれど、請求書内では別のセクションで表示されてほしい場合はこの方法になります。

Microsoft Azureのホームから「コストの管理と請求」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2511911/f20ae30c-82ac-471c-aa6b-3a11f953f4b5.png)

左パネルから「課金」＞「課金プロファイル」を選択して、セクションを作りたい請求書が発行される課金プロファイルを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2511911/f5dfab5e-0cd1-9349-b6e9-33a9ea3ee2eb.png)

左パネルの「請求書セクション」を選択し、左上にある「＋ Add」から請求書セクションを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2511911/886561aa-0c14-3969-8cc6-8e7cece50f9d.png)

最後に、作成された請求書セクションに対してサブスクリプションを紐づけてやれば、翌月の請求から請求書のセクションが分割されて表示されます。

例としてはこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2511911/6a465d3e-06e1-8048-5de2-694821030be0.png)
青とオレンジの部分がそれぞれのセクションです。

# 参考
[課金アカウントをカスタマイズしてコストを整理する](https://learn.microsoft.com/ja-jp/azure/cost-management-billing/manage/mca-section-invoice)
Docker+PHP+VScode+Xdebugでステップ実行をする

[qnote Advent Calendar 2024](https://qiita.com/advent-calendar/2024/qnote) の4日目です。

---------------------------------------
ログを仕込むのが大変、ステップ実行でリアルタイムに処理を追いたいため実装しました。試行錯誤した結果、わたしの環境ではこうやって実装できましたという備忘録です。

# 環境

OS: ubuntu18.04(williamyeh/ansible)

php:8.1-v4-apache

※Visual Studio Codeを使っていることを前提にしています。

## **Dockerfile**

```sql
FROM williamyeh/ansible:ubuntu18.04

RUN apt-get update -y && \
    apt-get install -y rsync

# for Xdebug
# PECLでXdebugをインストールする
# Xdebugを有効化する
RUN pecl install xdebug \
    && docker-php-ext-enable xdebug
```

## docker-compose.yml

```sql
version: '3'

services:
  meettech:
    platform: linux/x86_64
    image: thecodingmachine/php:8.1-v4-apache
    ports:
      - '${APP_PORT:-8080}:80'
    environment:
      PHP_EXTENSIONS: bcmath gd intl pdo_pgsql pgsql
      PHP_INI_MEMORY_LIMIT: 512M
      PHP_INI_DATE__TIMEZONE: Asia/Tokyo
      PHP_INI_MBSTRING__LANGUAGE: Japanese
      APACHE_DOCUMENT_ROOT: /var/www/html/public
    volumes:
      - '.:/var/www/html'

			# #######ここを追加#######
      # Xdebugの設定ファイルをマウント
      - type: bind
        source: ./php/docker-php-ext-xdebug.ini
        target: /etc/php/8.1/apache2/conf.d/docker-php-ext-xdebug.ini
			# #######################
    networks:
      - meettechdev
      - webdev
    extra_hosts:
      - '${VITE_HOST:-host.docker.internal}:host-gateway'

networks:
  meettechdev:
    driver: bridge
  webdev:
    external: true
```

## docker-php-ext-xdebug.ini

./php/docker-php-ext-xdebug.iniを作成します。

```sql
[xdebug]
xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.client_host=host.docker.internal
xdebug.client_port=9003
zend_extension = /usr/lib/php/20210902/xdebug.so
```

## **PHP Debug**

VScodeの拡張機能からPHP Debugをインストールします。

![スクリーンショット 2023-09-22 15.33.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618564/0770a8e4-f6b4-e631-461f-47477b854985.png)


「実行とデバッグ」から「create a launch.json file」をクリックし、PHPを選択します。
![スクリーンショット 2023-09-22 15.35.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618564/17c8c228-8352-e316-effc-d203bbda6ff9.png)


## launch.json

`pathMappings` には `docker のドキュメントルート: ローカルのドキュメント（「${workspaceRoot}」orフルパス）`を書く

```sql
{
    "configurations": [
        {
            "name": "Listen for Xdebug",
            "hostname": "0.0.0.0",
            "type": "php",
            "request": "launch",
            "port": 9003,
            "pathMappings": {
                "/var/www/html": "${workspaceRoot}"
            }
        }
    ]
}
```

## 動作確認

コンテナを起動します。

```sql
# コンテナ起動
[hoge-project] $docker-compose up -d
```

適当な場所にブレークポイントを貼って先ほどの「実行とデバッグ」の▶️ボタンをクリックします。
⚠️デバッグ開始前に「Listen for Xdebug」が選択されていることを確認します。
![スクリーンショット 2023-09-22 15.45.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618564/0a7e1766-6023-b491-e8cd-eafd96154356.png)

デバッグ開始後に画面をリロードすると、ブレークポイントを貼った箇所で止まります。
処理を細かく追いかけたい時に便利です！
![スクリーンショット 2023-09-22 15.48.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618564/ed9d2650-6e21-099d-7a82-6f9f384fe117.png)



## 参照
詳細は以下をご参照ください。
https://zenn.dev/flyingbarbarian/articles/39b80d91144f31#php-debug
過去のコミットから特定のファイルを取得する操作

# コミットを遡り，特定のファイルをローカルへ保存する方法

## 操作手順
### １. コミット履歴の確認
>`$ git log`　でコマンドで履歴を確認します．

>実行結果は以下のようになります．
```sql
commit <コミットハッシュ>
Author: 名前 <メールアドレス>
Date:   曜日-月-日 時間 

    Commit message 〇〇〇〇
```


### ２. ファイルの取得
>特定のコミットからファイルを取得するには，以下のコマンドを使用します．

`$ git show <コミットハッシュ>:<ファイルパス> > <保存先ファイル名>`

>（例）
【<コミットハッシュ>　 → abcd1234】<br>【取得したいファイルパス → Sample/test.js】<br>である場合

`$ git show abcd1234:Sample/test.js > test_2.js`

この操作により【test_2.js】としてローカルに保存されます．


### ３. 補足（ファイルパスの確認方法）
>`$ git show --name-only <コミットハッシュ>` を実行．

そのコミットハッシュのタイミングで，コミットされたファイルのファイルパスが表示されます．

### ４. 注意事項
- 適切なコミットハッシュとファイルパスが必要．
- 保存先のファイル名（例: test_2.js）が上書きされないように工夫する．
VPoE室としての組織力強化 

VPoE室にてリーダーを担当している藤井 靖弘です。 

前職は株式会社ラクスにてインフラ開発部に所属、マネジメントを担当しておりました。 
Skillnoteの理念に強く共感、2024年10月にジョインしました。 
趣味は冬山登山、世界で羽ばたくBABYMETALをこよなく愛しています。 

今後とも、よろしくお願いします。 


今回はVPoE室の役割、現在私が着手している組織力強化について書いていこうと思います。 

一般的にVPoE(Vice President of Enfineering)は、エンジニアリング組織の構築、成長、運営に責任を持ちます。 

具体的には以下の役割が挙げられます。 

**・技術戦略の策定と実行** 
　ビジネス目標に基づいた技術ロードマップの作成と推進。 

**・エンジニアリングチームの運営** 
　チームの採用、育成、組織構築を通じて成長を支援。 

**・プロダクト開発のリーダーシップ** 
　開発プロセスの最適化、品質基準の設定、技術的意思決定。 

**・クロスファンクショナルな連携** 
　他部門と協力してビジネスニーズと技術要件の調整。 

**・成果とリスクの管理** 
　KPIを通じた成果測定、リスク予測と管理。 

VPoE室の一員は技術的リーダーだけではなく、ビジネスの視点を用いながら組織を率いる能力も求められます。 
 
**リーダーシップ**
•多様なバックグラウンドを持つエンジニアを一つのチームとしてまとめ、方向性を示す能力。 

**マネジメントスキル** 
•人材管理、プロジェクト管理、予算管理など、エンジニアリング組織を運営するための総合的なスキル。 

**コミュニケーション能力** 
•経営陣、他部門、チームメンバーとの円滑なコミュニケーションを図るスキル。 

**技術的知識** 
•開発プロセスや最新技術について深い知識を持ち、エンジニアの課題解決を支援できる能力。 

**ビジネス理解** 
•技術戦略を企業のビジネス目標にリンクさせるためのビジネスセンス。 

このような役割、スキルを生かしつつ、現在私が着手していることは以下となります。 

**『開発組織の自発的成長を促す仕組み強化』**

スタートアップ期は一人が複数案件を回しつつ、業務量も多くなりがち、目先の仕事だけに常に追われがちです。 
重要度と優先度が高い物を回しがち、いわゆる飯の種的な重要度は高く、優先度の低いものを後回しにしがちです。 
結果、能力を高めるインプットは減りがち、成長も止まりがちになります。 
このような状況では、メンバーの意思やモチベーションに頼らず、成長とモチベーションが自然と高まる組織構造を目指す必要があります。 
そこで困難な状況にあっても個々人ではなく組織全体に影響がある目標管理制度の更なる利用促進に着手しました。 

Skillnoteでは以前、目標管理手法として OKRを採用していましたが、現在はMBOに戻し、その効果を最大化する取り組みを進めています。 
MBOを活用し、メンバーの成長を中心に据えた評価・目標管理制度の設計を進めています。 

私が考える評価・目標管理制度を構造的に示します。 

![目標設定-評価-成長のループ図.001-resized.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3952150/d151fb85-c94b-8d81-3ac9-7018dca139e0.png)

大事なポイントはメンバーの成長中心に据えてこれを高める構造を目指しています。 
評価・目標管理制度に対するよくある誤解として単にメンバーの役職や給与を決定する為だけのツールとして考える方がいます。 
その側面があることは否めませんが、本来の目標管理制度はそれに留まらず、 

・評価制度 
・フィードバック 
・スキル開発 
・キャリアパス 
・モチベーション 

などのへの影響や強化にも繋がります。 
目標管理制度がメンバーにもたらす構造要因とその方向についてを改めて説明すると 

・目標設定→ 評価制度 
設定された目標が評価制度の基準やプロセスに影響を与えます。 

・目標設定 → フィードバック 
適切な目標設定がフィードバックの質や有効性に影響を与えます。 

・評価制度 → フィードバック 
評価制度がフォードバックの内容や頻度を規定します。 

・評価制度 → 成長 
評価結果がメンバーの成長にフィードバックされます。 

・フィードバック → 成長 
フィードバックがメンバーの更なる成長を促します。 

・成長 → 報酬 
成長した成果が報酬にも反映されます。 

・成長 → スキル開発 
成長過程を通じてメンバーは更なるスキルアップの機会が生まれます 

・スキル開発 → キャリアパス 
スキルが向上するとキャリアパスの選択肢が増えます。 

・キャリアパス → モチベーション  
明確なキャリアパスがモチベーションに繋がります。 

・報酬 → モチベーション   
適切な報酬がモチベーションを高めます。 

目標管理は目標達成に対して単に評価、報酬を与えて終わりではなく、目標達成にて得られた成長に対して評価を与えること。 
そしてこの制度がメンバーのモチベーションアップに繋がっている事だと私は考えています。 
実際のところは成長それ自体を定量的に評価することは難しいため、等級制度と組み合わせつつ評価することになります。 
しかし、目標管理制度が目指すべき姿はメンバーのモチベーションを高めつつ成長してもらい、会社の成長にも繋がるように設計されるべきだと考えております。 
今後も試行錯誤して評価・目標管理制度をブラッシュアップしていこうと考えています。 

次回は、スタートアップ期におけるモチベーションを高める要因や、時間の経過に伴う変化について詳しく考察します。
esbuild-deno-loader を使ってみる

[esbuild-deno-loader](https://github.com/lucacasonato/esbuild_deno_loader) という esbuild 向けのプラグインを使うと、Deno と互換なモジュール解決ルールで、プログラムをバンドルすることが出来ます。

使い道としては、例えば、Deno で動くように書いてあるツール/ライブラリなどを、esbuild-deno-loader でバンドルし、それをブラウザ、Node、Cloudflare Workers など、いろいろなランタイム上で使うというような使い道が考えられます。

筆者は、esbuild-deno-loader でバンドルしたコードを VSCode Extension のカスタムエディター WebView の中に読み込んで、Deno 用のライブラリなどに依存しつつ、カスタムエディタの UI を開発するという使い方をしています。

サンプルリポジトリ
https://github.com/kt3k/vscode-pixeledit

以下では、esbuild-deno-loader の基本的な使い方を紹介します。

```ts
import * as esbuild from "npm:esbuild@0.24";
import { denoPlugins } from "jsr:@luca/esbuild-deno-loader@0.11";
import { resolve } from "jsr:@std/path@1";

const result = await esbuild.build({
  plugins: [...denoPlugins({
    configPath: resolve("path/to/deno.json")
  })],
  entryPoints: ["入力ファイル.ts"],
  outfile: "./出力ファイル.js",
  bundle: true,
  format: "esm",
});

console.log(result.outputFiles);

esbuild.stop();
```

上記サンプルが基本的な使い方です。`入力ファイル.ts` と `出力ファイル.js` の部分は適宜置き換えてください。

上のスクリプトを実行すると、`入力ファイル.ts` の内容がバンドルされて `出力ファイル.js` として書き出されます。ファイル名が表すように、入力ファイルは TypeScript ですが、出力ファイルは JavaScript になることに注意してください。

`denoPlugins()` という呼び出しで、Deno 互換のリゾルバーとローダーが作成され、それを esbuild に渡しています。`configPath` というオプションに `deno.json` の絶対パスを渡していて、これを渡すことで [import map](https://docs.deno.com/runtime/fundamentals/modules/#managing-third-party-modules-and-libraries) の解決が出来るようになります (なお、`configPath` は絶対パスしか受け付けていないため、`@std/path` モジュールの resolve 関数で絶対に解決してから渡しています)。

Happy Isomorphic Coding!
Bash使い必見！便利な設定が詰まったおすすめ`.bashrc`サンプル

# はじめに

Bashを使っていると、ターミナル操作をより効率的にするための設定が欲しくなることがありますよね。この記事では、私が日々使っている便利な`.bashrc`設定を紹介します。これをコピーして使うだけで、作業効率がグッと上がるはずです！

---

## `.bashrc`とは？

`.bashrc`は、Bashシェルが起動する際に読み込まれる設定ファイルです。このファイルにコマンドやエイリアス、環境変数を記述することで、ターミナルの動作をカスタマイズできます。

---

## おすすめの`.bashrc`設定例

以下は、私が愛用している`.bashrc`の設定例です。適宜、自分の環境に合わせて調整してください。

```bash
# 色付きのプロンプト
PS1='\[\e[1;32m\]\u@\h:\w\$\[\e[0m\] '

# コマンド補完を強化する
if [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
fi

# コマンド履歴を拡張する
export HISTSIZE=10000      # 保存する履歴の数
export HISTFILESIZE=20000  # 履歴ファイルのサイズ
shopt -s histappend        # 履歴を追記する
PROMPT_COMMAND='history -a'

# alias（短縮コマンド）を設定する
alias ll='ls -lh --color=auto'
alias la='ls -A'
alias l='ls -CF'
alias gs='git status'
alias ga='git add'
alias gc='git commit'
alias gp='git push'

# PATHを追加する
export PATH="$HOME/bin:$PATH"

# シンプルで便利な関数
mkcd() {
    mkdir -p "$1" && cd "$1"
}

# Gitブランチをプロンプトに表示する
parse_git_branch() {
    git branch 2>/dev/null | grep '*' | sed 's/* //'
}
PS1='\[\e[1;32m\]\u@\h:\w\[\e[1;33m\]$(parse_git_branch)\[\e[0m\]\$ '

# vimをデフォルトエディタに設定する
export EDITOR=vim

# ターミナルの動作を高速化する
bind 'set completion-ignore-case on'
bind 'set show-all-if-ambiguous on'
bind 'set bell-style none'
```

---

## 設定の解説

### 1. **プロンプトのカスタマイズ**
プロンプトに現在のユーザー、ホスト名、カレントディレクトリ、Gitブランチ名を表示する設定です。視覚的にわかりやすくなるのでおすすめです。

### 2. **コマンド補完の強化**
`bash_completion`を有効にすると、より多くのコマンドの補完が使えるようになります。

### 3. **履歴の拡張**
履歴の保存数を増やし、ターミナルを閉じても履歴が失われないようにしています。

### 4. **エイリアス**
よく使うコマンドを短縮形で登録することで、タイピングの手間を減らします。

### 5. **PATHの設定**
カスタムスクリプトやツールのディレクトリを`PATH`に追加します。

### 6. **便利な関数**
`mkcd`は、ディレクトリを作成してその場で移動する便利な関数です。

### 7. **ターミナル動作の高速化**
補完時の大文字小文字の区別を無効化したり、ベル音をオフにしたりしています。

---

## 設定を反映させる方法

`.bashrc`を編集した後は、以下のコマンドで変更を反映させましょう。

```bash
source ~/.bashrc
```

---

## まとめ

この記事で紹介した設定を使えば、Bashの操作がより快適になるはずです。自分好みにカスタマイズしながら、さらに便利な環境を作ってみてください！

**あなたのお気に入りの`.bashrc`設定があれば、ぜひコメントで教えてください！**
Crystalでlibeventが不要になる

## はじめに

Crystal言語は、Rubyによく似た文法の言語です。
C言語やRust並に高速です。
コンパイル時間は遅い。

## Crystalはlibeventに依存する

Crystalで作成した実行ファイルは（特殊な場合を除き）必ず以下の2つのライブラリにリンクされる。

- [libgc](https://github.com/ivmai/bdwgc)
- [libevent](https://en.wikipedia.org/wiki/Libevent) - 非同期イベント通知

以前はlibpcre2にも必ずリンクされていたが、[プルリクエストを送って修正](https://qiita.com/kojix2/items/091e146da769e36c077f)した。

libgcはガベージコレクション用のライブラリである。
libeventは、非同期イベントの通知を行うライブラリで、Fiberの切り替え(ファイルやIOで発生する)に関わっている。

## RFC #0009 のマージ

Crystalでは、重要な変更はRFC(request for comments)で議論する慣習である。[RFC #0099](https://github.com/crystal-lang/rfcs/blob/main/text/0009-lifetime-event_loop.md) では、libeventのかわりに、epoll (Linux、Android) または kqueue (macOS) を直接利用する変更が議論された。WindowsではIOCPが使われるので影響を受けないそうだ。

https://crystal-lang.org/2024/11/05/lifetime-event-loop/

[NightlyのCrystal](https://crystal-lang.org/install/nightlies/)をインストールして、小さなスクリプトをビルドしてみたところ、確かにlibeventにリンクされなくなったことを確認した。パフォーマンスも向上するらしいです。
永続的オンボーディング　インタラクティブな組織づくり　後編

前編記事:[永続的オンボーディング　インタラクティブな組織づくり　前編](https://qiita.com/3otika/items/d875ac7ad60ca32a6353)

この記事は[Hacobu Advent Calendar 2024](https://qiita.com/advent-calendar/2024/hacobu)の4日目の記事です。

# はじめに

こんにちは、Hacobuで組織開発室の室長をしているAKITO([@3otika](https://x.com/3otika))です。

今回は、前回の「Connection　つながり」を意識したオンボーディングの取り組みとその効果について深掘りしていきます。


# テック定例を変えよう！

これまでHacobuではテック定例というテック全体のMTGを行っていました。

しかし、それらはCTOが一方的に話すだけの場になっており、情報伝達だけで交流やつながりの意味合いは非常に薄くなっていました。

リモートでの開催でしたが、CTO以外はほとんどのメンバーが画面オフ状態で実施されており、あまりいい雰囲気ではありませんでした。

そこで我々は、テック定例を「Connection　つながり」を作る場と定義して設計を見直してみることにしました。

以下がその取り組みの具体例です。

## テック定例の名前を変える

テック定例は非常にシンプルな名前ではありましたが、今までの定例とのイメージを変えるため、また皆が親しみやすくするために、テック定例の名前を公募しました。自分たちに名前を考えてもらうことによって、より会に親しみを持ってもうことも狙っています。結果、「はこてくMeetup」という名前に変更しました。まだまだ名前は浸透中ですが、みんなで考えた名前を大事にして、会を盛り上げています。

## 運営スタイルを変える

これまでのはこてくMeetupは、オンラインで一方的にCTOが話す場になっていました。これをオフラインを中心の時間に変更し、CTOからの発信だけでなく、メンバーからの発信も行ってもらう場へと変更しました。新入社員の紹介やLT会を開くことでメンバー相互で会話が生まれることを意識しました。

結果的に一方的な発信ではなく、相互の会話の場として機能するようになり、CTOと社員だけのつながりではなく、社員同士の相互コミュニケーションを生むことができました。

![IMG20240913155932.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623146/8f7b5dbf-746c-9e7f-302a-954bd4bded4f.jpeg)


※チームについてのLT会の様子

## Fikaの導入

「Fika（フィーカ）」とはスウェーデンの文化で、コーヒーブレイクしながら雑談をする習慣です。この文化をはこてくMeetupに導入しました。毎回少し贅沢なお菓子を用意し、雑談を促す効果を狙っています。実際のところ、食を共にすることで会話も弾み、最初はオフラインに否定的なメンバーも、美味しいお菓子があるなら出社して、はこてくMeetupに参加しようというメンバーも多く、出社のきっかけ作りに効果をあげています。

![NjiLKMP.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623146/46fbdff4-642f-5ab4-5246-e281ffabb446.jpeg)


![IMG20241004135826.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623146/40d75def-43a6-fff4-c388-de3a5f2a1efb.jpeg)


※軽食やお菓子を食べながら和気藹々としています

# 結果、どうなったの？

社内では交流が活発化し、違うチームの人の顔と名前が一致する、隣の人を知っている状態を作ることができたと考えています。

特に、アンケート結果でもポジティブなフィードバックが増え、他部署からも関心が寄せられるようになったことは非常に大きな進歩だと考えています。

![スクリーンショット 2024-12-02 15.50.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623146/9064b786-7568-da05-e11f-071ab91c8996.png)
※フィードバックの一部

~~メガネ似合ってますが一番嬉しい~~

# 終わりに

オンボーディングは通常3ヶ月、半年などのスパンで区切るものと考えがちですが、社員の定着や活躍を促す意味では終わりのない活動だと考えています。

是非、皆さんもオンボーディングの4Cを意識したオンボーディング設計にトライしてみてください。

おすすめのお菓子があれば是非コメント欄まで！笑
ChatGPT APIを使って業務プロセスを自動化する方法

## はじめに
現代のテクノロジーにおいて、業務プロセスの自動化は時間を節約し、生産性を向上させる重要な手段です。OpenAIが提供するChatGPT APIを使えば、AIをシステムに統合し、効率的なアプリケーションを構築できます。本記事では、ChatGPT APIを利用して基本的な自動化アプリを作成する方法をご紹介します。
## 前提条件
ChatGPT APIを使用するには、以下の準備が必要です。

OpenAIのAPIキー: OpenAIでアカウントを作成し、APIキーを取得してください。
Pythonの基本的な知識: サンプルコードはPythonを使用します。
環境のセットアップ: Python環境（バージョン3.7以上）と必要なライブラリがインストールされていること。
## 環境構築
以下のコマンドで必要なライブラリをインストールします：

` pip install openai `
## サンプルコード
以下は、ChatGPT APIを使用して簡単なチャットボットを作成するコードです。
```import openai
 OpenAI APIキーを設定
openai.api_key = "YOUR_API_KEY"

def chat_with_gpt(prompt):
    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=[
            {"role": "system", "content": "あなたは有能なアシスタントです。"},
            {"role": "user", "content": prompt}
        ]
    )
    return response['choices'][0]['message']['content']

if __name__ == "__main__":
    user_input = input("質問を入力してください: ")
    answer = chat_with_gpt(user_input)
    print(f"GPTの回答: {answer}")
【個人開発mini.vol4】Qiita企画のためのくそアプリ制作

## はじめに
はじめまして。
2024年3月よりプログラミングスクールRUNTEQに通っている、わーちゃんと申します。
未経験からのWebエンジニア転職を目指して、学習を続けております。
今回以下アドベンドカレンダーの為にアプリを開発しました。

https://qiita.com/advent-calendar/2024/kuso-app

> 今年も役に立たない、世の中に貢献しないアプリとかサービスを出しあって遊ぼうぜ！
年末のお祭りに乗っかってラフに開発を楽しみましょう！

と記載ありますが、本心は少し役にたったらうれしいな。という気持ちがあります。:joy:具体的にどんなアプリを作成したのかをこの場をかりて発表したいと思います。


## Apple-pomotimer

![Apple-pomotimer](https://cdn.glitch.global/b1f148e8-57f3-4366-9049-0dcfc3e36928/apple-pomotimer.jpg?v=1733207361428)


**▶ Service URL**：[Apple-pomotimer](https://apple-pomotimer.glitch.me)
**▶ Git hub**：[リポジトリ](https://github.com/canopus222/apple-pomotimer)


# Overview
- 通常のポモロードタイマーは25分5分休憩です。
- こちらのアプリでは1分経過後ランダムでやる気を阻害するアラートが表示されます
- 最悪なことにアラートのＯＫボタンを押さないと計測が再開されません。
- 本来のポモロードタイマーの機能の恩恵をまったく教授することのできないようになっています。

# Thoughts on service
Qiitaのアドベントカレンダーの企画の一つ[クソアプリ Advent Calendar 2024](https://qiita.com/advent-calendar/2024/kuso-app)に参加したいがために作成したアプリになります
クソアプリと思っていただけると幸いです。:joy:

# Target user
- Qiitaイベントを楽しみたい方。

# How to acquire users
- SNSでの情報発信
- Qiita記事作成

# Technology used
| カテゴリー        | 使用技術                                                                                                                 |  
| ----------------- | ------------------------------------------------------------------------------------------------------------------------ |  
| **フロントエンド** | HTML (Hypertext Markup Language)<br>CSS (Cascading Style Sheets)<br>JavaScript (JS)<br>JSON (JavaScript Object Notation) |  
| **バックエンド**   | Node.js (14.x)<br>Fastify (v4.21.0)<br>Handlebars (テンプレートエンジン)                                                |  
| **データベース**   | SQLite (ライブラリ: `sqlite`, `sqlite3`)                                                                                |  
| **Fastify プラグイン** | @fastify/view (テンプレートエンジン統合)<br>@fastify/static (静的ファイルの提供)<br>@fastify/formbody (フォームデータ処理) |  
| **開発環境**      | Glitch（ホスティングと開発プラットフォーム）                                                                             |  
| **インフラ**      | Glitch（サーバーを運営する環境）                                                                                          |  
| **依存管理**      | npm（Node.js パッケージマネージャー）                                                                                      |  
| **バージョン管理** | Git（Glitch のプロジェクト管理）                                                                                          |  


## 頑張った点など
- はじめての技術fastifyとHandlebarsに対する理解
- 木とリンゴの描写（なかなか本物に近づけるには技術不足を感じています💦）
- 今まで役に立つ目線でアプリ制作を行っていた分、「役に立たない」を考えるのが難しかったです。


## さいごに
- 今回はSQLiteを使用してアプリを作成しようかと思いましたが、ユーザー登録不要のポモロードタイマーなら、不要なのでは？となったため、SQLiteは使用せず。今後新たに制作するものでSQLiteに触れてみたいと思います。
- 役に立たない目線でアプリを開発するというのは新鮮でした。興味がある方はぜひ参加してみることをお勧めします。
飛行機に搭乗を続けたいなら...

ITエンジニアの私は、東京、神戸、札幌と全国各地を飛び回る日々。飛行機に乗る機会も多く、機内で企画資料を作ったり、次のミーティングの準備をしたりと、限られた時間を有効活用していました。
# 機内にて
ある日、そんな移動中の空港で驚きの出来事が。搭乗し、シートベルトを締めて離陸を待っていると、CAさんから「申し訳ございませんが、お降りいただけますか」と告げられたのです。

理由は、遅れてきた乗客との入れ替えだそう。実は空席まちで席を確保した身ですが、すでに搭乗手続きを終え、機内で座席に座っていた私としては、「えっ？」とかなり驚きました。ただ航空会社としては、本来の搭乗者を優先するのがポリシーなのでしょう。

素直な私はごねる事もなく、みなさん着席している機内を一人出口へ。タラップで遅れたきた方とすれ違い、バスに乗り込みました。搭乗口までたった一人戻るバスの中で、なぜxなぜ？と考えると、手荷物を預けていなかったことが一因だったのかもしれません。手荷物には預けられないパソコンは持ち歩いていますし、機内に持ち込める程度の荷物で済ませることを心がけていたのですが、貨物室から荷物を下ろす必要のない私なら、面倒が少なく対応できますので、多分それが裏目に出たようです。
# 教訓
この経験から学んだことは、**「飛行機を利用する際は、手荷物は預けるべきかも」** ということ。多少面倒でも、こんなトラブル？に巻き込まれないための保険になるかもしれません（ そう度々ある状況ではなさそうですが^^; ）。

なお、搭乗待合室に戻ってからは、そのまま待機。次の便の席を用意してもらって無事目的地に到着できました。よかった、よかった。

[写真は上空から見た秋の富士山]
![Image.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1195121/aaf0a4a5-dfb5-0743-bc42-3cd904c47d24.jpeg)

::: note
所属する会社とは無関係の個人の見解です
:::
.htaccessを設置するとhttp://example/.well-known/acme-challenge/<TOKEN>にアクセスできなくなるパターン

- Redirect
- RewriteRule
- IPアドレスでアクセス制限
- Basic認証
- HTTPS強制
- キャッシュコントロール( fileauth.txtが更新されない場合 )
- TXTファイルへのアクセスを拒否

https://help.sakura.ad.jp/rs/2268/
Kubernetes クラスタの Node をメンテナンスしたいとき

# Node 内の Pod を退避したい

Kubernetes クラスタの Node で、メンテナンス(*)を実行したいとき、Node 内で現在動作している Pod を退避させる必要があります。
退避するときに使える次のコマンドを、この記事では説明します。

* `kubectl drain`
* `kubectl cordon`
* `kubectl uncordon`

(*) カーネルのアップグレード、ハードウェアのメンテナンスなどを指します

## kubectl drain

Node からすべての Pod を安全に削除できるコマンド。
Pod 内のコンテナは正常に終了し、指定した `PodDisruptionBudget` が優先されます。
コマンド実行例を、次に示します。

```sh
$ kubectl drain --ignore-daemonsets NODE_NAME
```

上記実行例のように、`--ignore-daemon-sets` オプションを指定すると、
DaemonSet によって管理されている Pod がある場合でも、正常に Pod を退避することが可能です。

退避後にメンテナンスが完了し、
対象の Node を再度 Pod スケジューリング対象にしたい場合は、後述の `kubectl uncordon` を実行ください。

### 注意点

ただし、この `kubectl drain` で退避できるのは、Replicaset で管理されている Pod のため、注意してください。
Replicaset で管理されていない Pod を含めて退避させようとすると、次のようなエラーが出力されます。
エラー文にある通り、`--force` オプションを利用して、強制的に実行することも可能ですが、
その場合、Replicaset で管理されていない Pod は退避ではなく削除され、復活させることができないことに注意してください。

```sh
$ kubectl drain --ignore-daemonsets NODE_NAME
node/NODE_NAME cordoned
error: unable to drain node NODE_NAME due to error: cannot delete cannot delete Pods that declare no controller (use --force to override): default/POD_NAME, continuing command...
There are pending nodes to be drained:
 node01
cannot delete cannot delete Pods that declare no controller (use --force to override): default/POD_NAME
```

## kubectl cordon

Node のステータスを、`NodeNotSchedulable` に変更します。
`NodeNotSchedulable` は、Node がスケジューリング対象から外れていることを、示します。
これは、Pod を新たに起動できない状態なので、すでに起動されている Pod を退避・排除することはせず、
新しく起動させて Pod が、この Node に割り当てられないことを指します。
`kubectl drain` コマンドには、このステータス変更も含まれています。

コマンド実行例を次に示します。

```sh
$ kubectl cordon NODE_NAME
```

## kubectl uncordon

Node のステータスを、`NodeSchedulable` に変更します。
`NodeSchedulable` は、Node がスケジューリング対象であることを、示します。
`kubectl cordon` と同様に、起動中の Pod に対して影響はないため、これを実行しても、すぐに Pod がスケジュールされるわけではありません。
新しい pod が作成されたときに、この Node もスケジュール先対象になることを指しています。

コマンド実行例を次に示します。

```sh
$ kubectl uncordon NODE_NAME
```

# 参考

* [Kubernetes Documentation - Administer a Cluster - Safely Drain a Node](https://kubernetes.io/docs/tasks/administer-cluster/safely-drain-node/)
* [Kubernetes Documentation - Cluster Architecture - Nodes]()
lolcatをCrystalに移植した

![lolcat.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/01493993-cc1c-bd12-7d0a-bcebb0fd4325.gif)

https://github.com/kojix2/lolcat.cr

### はじめに

lolcatとは、Rubyで作られたツールで、ファイルや、標準入力からインプットされたデータをカラフルに出力するツールである。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/0c578cdc-d932-4b96-72d8-8f12ea33ddf0.png)

https://github.com/busyloop/lolcat

lolcat（ロルキャット）は海外のインターネットミームで、ネコの画像にユーモラスで風変わりなキャプションを、正しくない英語で付けたものだそうである。

なおChatGPTでも念のため確認したがlolcatコマンドにLGBTの社会的文脈はありません。

https://ja.wikipedia.org/wiki/Lolcat

### できたもの

標準ライブラリしか使っていないので、Windowsでも動くのである。
ここでは help メッセージを表示しているけど、普通の使い方としては、

```
ls | lolcat
```

みたいな感じで標準入力からデータを渡す感じだと思う。

### 気づき

- Rubyのeach_lineはデフォルトでchompしないがCrystalはする（罠）
これについては、下記のフォーラムを参照してほしい。
 

 https://forum.crystal-lang.org/t/how-to-run-a-steam-locomotive-sl-through-a-pipe/7425/7

- ARGF.each_line はMacではOKだがUbuntuでは何らかのバッファーがあり、リアルタイムで標準入力を読まない(RubyでもCrystalでも同様)。なのでRubyでは[IO#sysread](https://docs.ruby-lang.org/ja/latest/method/IO/i/sysread.html)、Crystalでは IO#read(byte_chunk) 使うなど小技が必要になる。

### ちょっと疑問が残っているところ

コマンドラインオプションを構造体にしているけれども、これが本当にいいかどうかはちょっと考えどころ。構造体はスタックに確保されるため効率はいいのだけれども、メソッドに渡されるたびにコピーされてしまう。これは、getter を使っている場合でも同じだったはず。そしてLolcatは、このコマンドラインオプションをメソッドに渡すコードがたくさんある。classにして参照するか、@で直接参照した方がいいのかも。

このツールはコマンドラインツールを作成するためのサンプルの一つとして作成したけれども、そのあたりは今後の課題です。
ChakraUI v3でJestを実行するとContextError: useContext returned `undefined`. Seems you forgot to wrap component within <ChakraProvider />エラーが出る

# はじめに

ChakraUI v3に伴ってJestでエラーがでるようになったのでまとめます

# 問題

テストを実行すると以下のエラーが出ます

```
 ContextError: useContext returned `undefined`. Seems you forgot to wrap component within <ChakraProvider />

       5 | describe("title", () => {
       6 |   it("should render title", () => {
    >  7 |     render(<App />);
         |           ^
       8 |     expect(screen.getByText("Hello World")).toBeInTheDocument();
       9 |   });
      10 | });

      at node_modules/@chakra-ui/react/dist/cjs/styled-system/factory.cjs:97:47
      at node_modules/@emotion/react/dist/emotion-element-832b737b.browser.cjs.js:72:12
      at renderWithHooks (node_modules/react-dom/cjs/react-dom.development.js:15486:18)
      at updateForwardRef (node_modules/react-dom/cjs/react-dom.development.js:19245:20)
      at beginWork (node_modules/react-dom/cjs/react-dom.development.js:21675:16)
      at beginWork$1 (node_modules/react-dom/cjs/react-dom.development.js:27465:14)
      at performUnitOfWork (node_modules/react-dom/cjs/react-dom.development.js:26599:12)
      at workLoopSync (node_modules/react-dom/cjs/react-dom.development.js:26505:5)
      at renderRootSync (node_modules/react-dom/cjs/react-dom.development.js:26473:7)
      at recoverFromConcurrentError (node_modules/react-dom/cjs/react-dom.development.js:25889:20)
      at performConcurrentWorkOnRoot (node_modules/react-dom/cjs/react-dom.development.js:25789:22)
      at flushActQueue (node_modules/react/cjs/react.development.js:2667:24)
      at act (node_modules/react/cjs/react.development.js:2582:11)
      at node_modules/@testing-library/react/dist/act-compat.js:47:25
      at renderRoot (node_modules/@testing-library/react/dist/pure.js:180:26)
      at render (node_modules/@testing-library/react/dist/pure.js:271:10)
      at Object.<anonymous> (src/tests/AppComponent.test.tsx:7:11)

Test Suites: 1 failed, 1 total
```

# 解決方法

renderで`ChakraProvider`で囲むことでうまく行きました

```ts
import { ChakraProvider, defaultSystem } from "@chakra-ui/react";
import App from "../App";
import { render, screen } from "@testing-library/react";

describe("title", () => {
  it("should render title", () => {
    render(
      <ChakraProvider value={defaultSystem}>
        <App />
      </ChakraProvider>
    );
    expect(screen.getByText("Hello World")).toBeInTheDocument();
  });
});
```

以前は、`defaultSystem`というのを渡していませんでしたが、v3から渡す必要があるようです
詳しくは`<Provider>`の中をみてください

# おわりに

大きな仕様変更があるのでまだなれませんががんばります
dockerで運用しているFlaskアプリからoracleDBに接続する。

## oracle instant client ダウンロード
ホストはwindowsでもコンテナの中はlinuxになるのでlinux用をダウンロードする！！！！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/836ccb9d-f22f-6e90-a7f3-2e908bef57fd.png)

dockerfileと同じ階層にクライアントを移動。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/9a0f80bd-375b-0535-cb95-242f2d49c75a.png)

## Dockerfile(dockerimageを作る設計図)を作成する。

```
# ベースイメージとしてPython 3.12.3の軽量バージョンを使用
FROM python:3.12.3-slim

# 作業ディレクトリを作成
WORKDIR /app

# Oracle Instant Client のライブラリをダウンロードして配置
RUN mkdir -p /opt/oracle && \
    apt-get update && \
    apt-get install -y libaio1 curl unzip

# Instant Clientファイルをコピー
COPY instantclient_21_12 /opt/oracle/instantclient_21_12

# Oracle Instant Clientのライブラリのパスを環境変数に設定
ENV LD_LIBRARY_PATH="/opt/oracle/instantclient_21_12:$LD_LIBRARY_PATH"
ENV ORACLE_HOME="/opt/oracle/instantclient_21_12"

# Instant Clientの展開と確認
RUN ls -l /opt/oracle/instantclient_21_12 && \
    ls -l /opt/oracle/instantclient_21_12/libclntsh.so

# Pipを最新バージョンにアップデート
RUN pip install --upgrade pip

# requirements.txtをコンテナにコピー
COPY requirements.txt .

# 必要なPythonパッケージをインストール
RUN pip install --no-cache-dir -r requirements.txt

# アプリケーションファイルをすべてコンテナにコピー
COPY . .

# 環境変数の設定
ENV FLASK_APP=flaskr
ENV FLASK_ENV=development

# ポート8083を公開
EXPOSE 8083

# アプリを起動
CMD ["flask", "run", "--host=0.0.0.0", "--port=8083", "--debug"]
```

【やっていること】
コンテナの中に ディレクトリを作成する
app COPY . .を実行した際に　ホストのファイルがappにコピペされる。
/opt/oracle/
環境変数の設定
公開ポートの指定
Flask起動コマンド

## Dockerfileからdockerimage(コンテナの設計図)作成。
image作成コマンド
```
docker build -t lossamount-flask-app .
```

## docker-compose-yamlの作成
```
version: '3'		
services:		
  flask-app:		
    build: .		
    ports:		
      - "8083:8083"		
    volumes:		
      - .:/app		
    environment:		
      FLASK_ENV: development		
      FLASK_APP: flaskr		
      ORACLE_HOME: /opt/oracle/instantclient_21_12		
      LD_LIBRARY_PATH: /opt/oracle/instantclient_21_12:$LD_LIBRARY_PATH		
    command: flask run --host=0.0.0.0 --port=8083 --debug		
```
【やっていること】
コンテナ起動に関する設定を書いてある。
設定ファイルを使うことで、コンテナ起動を用意にできる。

## コンテナ起動コマンド
```
docker-compose up -d
```
ChakraUI v3でJestを実行するとReferenceError: structuredClone is not definedになる

# はじめに

ChakraUIがv3に変わってjestが動かなくなる問題があったのでまとめます

# 問題

ChakraUI v3のコンポーネントを使っている状態でjestを動かすとエラーが出ました

```
 ● Test suite failed to run

    ReferenceError: structuredClone is not defined

    > 1 | import { Box } from '@chakra-ui/react'
        | ^
      2 |
      3 | function App() {
      4 |

      at node_modules/@chakra-ui/react/dist/cjs/styled-system/token-middleware.cjs:21:25
          at Array.forEach (<anonymous>)
      at Object.transform (node_modules/@chakra-ui/react/dist/cjs/styled-system/token-middleware.cjs:15:12)
      at node_modules/@chakra-ui/react/dist/cjs/styled-system/token-dictionary.cjs:295:20
          at Array.forEach (<anonymous>)
      at applyMiddlewares (node_modules/@chakra-ui/react/dist/cjs/styled-system/token-dictionary.cjs:293:17)
      at build (node_modules/@chakra-ui/react/dist/cjs/styled-system/token-dictionary.cjs:337:5)
      at Object.createTokenDictionary (node_modules/@chakra-ui/react/dist/cjs/styled-system/token-dictionary.cjs:349:3)
      at Object.createSystem (node_modules/@chakra-ui/react/dist/cjs/styled-system/system.cjs:35:34)
      at Object.<anonymous> (node_modules/@chakra-ui/react/dist/cjs/preset.cjs:10:30)
      at Object.<anonymous> (node_modules/@chakra-ui/react/dist/cjs/index.cjs:15:14)
      at Object.<anonymous> (src/App.tsx:1:1)
      at Object.<anonymous> (src/tests/AppComponent.test.tsx:2:1)
```

# 解決方法

jestのセットアップのスクリプトに以下を追加しました

```ts:jest.setup.ts
if(!global.structuredClone){
  global.structuredClone = function structuredClone(objectToClone: any) {
    if (objectToClone === undefined) return undefined;
    return JSON.parse(JSON.stringify(objectToClone));
  };
}
```

https://stackoverflow.com/questions/73607410/referenceerror-structuredclone-is-not-defined-using-jest-with-nodejs-typesc

# おわりに

なんとか解決できたので良かったです。
Adobe Premier Proで、Log撮影された動画にLUTを適用して通常の見た目に戻す方法

## はじめに

プロフェッショナルな映像制作では、より広いダイナミックレンジを確保するためにLog撮影が一般的に使用されます。しかし、Log映像はそのままでは暗く、コントラストの低い状態です。この記事では、Log撮影された映像を通常の見た目に戻すための基本的なワークフローを解説します。

## Log映像の特徴

Log撮影された映像には以下のような特徴があります：

- 全体的に暗く見える
- コントラストが低い
- 色味が薄い
- ハイライトからシャドウまでの情報が保持されている

## LUTとは

LUT（Look Up Table）は、映像の色やコントラストを変換するための参照テーブルです。Log映像を通常の見た目（Rec.709など）に変換する際に使用します。

## 主要カメラメーカーのLUT入手方法

### 1. Sony

**ダウンロード先**：
[テクニカルナレッジ | ラージセンサーカメラ | ソニー](https://www.sony.jp/ls-camera/knowledge/)

**推奨LUT**：
- S-Gamut3 & S-Gumut3.cine/S-Log3（Rec.709）
  - 最新のSonyカメラで撮影したS-Log3素材用の標準的なLUT
  - 一般的なウェブ配信や放送用途に最適

### 2. Panasonic

**ダウンロード先**：
[LUT（ルックアップテーブル） | Panasonic](https://av.jpn.support.panasonic.com/support/dsc/download/lut/index.html)

**推奨LUT**：
- VLog_to_V709_forV35_JP
  - LUMIX GH5、GH6、S1H、S5などの標準的なLUT
  - V-Log撮影素材をRec.709に変換

### 3. Canon

**ダウンロード先**：
[Canon 3D LUT for CMT 709 Ver.1.0｜キヤノン](https://canon.jp/support/software/os/select/dvc/canon-lut-cmt709-202210)

**推奨LUT**：
- CinemaGamut_CanonLog3-to-CMT709_33_Ver.1.0.cube
  - 33 gridバージョンが最も一般的
  - 処理速度と品質のバランスが良い

## Adobe Premiereでの適用方法

1. プロジェクトパネルにLUTファイルをインポート
2. エフェクトパネルからLUTを適用したいクリップにドラッグ＆ドロップ
3. エフェクトコントロールパネルで必要に応じて調整

## 注意点

- 撮影時のカメラ設定（Log形式）を確認することが重要
- 適切なLUTを選択することで、より自然な見た目が得られる
- LUT適用後も必要に応じて色調整を行う
- 編集作業中はプレビュー品質を下げることで、スムーズな作業が可能

## まとめ

Log撮影された映像は、適切なLUTを適用することで通常の見た目に戻すことができます。カメラメーカーが提供する標準的なLUTを使用することで、多くの場合十分な品質が得られます。特に需要の高い日本国内の主要3社（Sony、Panasonic、Canon）のLUTを使いこなすことで、多くの現場のニーズに対応できるでしょう。
flaskアプリでoracleDBに接続する。

## flaskアプリでoracleDBに接続
まずolacleのクラインアントソフトウェアをインストール。
OSに合わせてインストールする。

ポスグレDBと接続する際はクライアントソフトウェアはインストール不要だったのにoracleは必要。

Oracle Instant Clientって検索して対象のソフトインストールします。
解凍します。

## 環境変数の設定

Path
D:\oracle\instantclient_21_9

ダウンロードしてソフトを置いた場所に設定。

## Flaskアプリのコードを編集する。
mainコードの最初のほうにこれを入れます。
Oracle Clientを初期化するコードです。
```
oracledb.init_oracle_client(lib_dir="D:\\oracle\\instantclient_21_9")
```

DB接続文も入れる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/aa06197f-4d41-9198-e35e-8fecf987a9ea.png)


## 最後に
これまではDB接続のためにクライアントソフトウェアのインストールはしたことがありませんでしたので、調べました。

Oracle Instant Client　とは　何者なのか？
データベース接続に必要なライブラリを提供 Oracleデータベースは独自のプロトコルで通信を行います。そのため、PythonなどのプログラムがOracleデータベースに接続するには、Oracle独自の通信ライブラリ（例: oci.dll）が必要です。これを提供するのがOracle Instant Clientです。
推しの誕生日に向けて動き出したい

### はじめに
こんにちは、恐れ多くも憧れの（いつもお世話になっている）Qittaに初投稿させていただきます。というのも、推しの誕生日が近づいている！ということで最近研究でUnityを触り始めたこともあり、推しの誕生日を祝福する何かを作りたいという思いがきっかけです。

「拙い文章」かつ「間違っていること」などいろいろあると思いますが、備忘録として残させていただきますッ！

### 何から始めるか？
なんとな～～く、推しが動くものをUnityで2Dでつくりたいと考えているので、やるぞ！という気持ちを乗せるために、一旦推しのドット絵を描くことから始めました。

### さぁドットを描いてみよう。
なんと、オンラインツールでドット絵がかけるということだったので、使わせていただきました。
（使用させていただいたサイト：https://neutralx0.net/tools/dot3/ ）

そこで、作成したドット絵がこちらになります。

![rinshan_left2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3952100/4e9f0591-fb97-275d-06ca-2cffaa9889f9.png)

50(px)×50(px)なので、とても小さいですねッ！
この調子で、歩いてるアニメーションを作るために、足を開いている場面も描いてみました。

![rinshan_left1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3952100/26b46fa8-e31d-dfae-4d6e-650cae6a636a.png)

かわいい...！！推しが小さくドット絵になっているのを見ると、とてもテンションが上がります。
私自身、絵をたしなむ習慣がないため、影のつけ方や形が本物の推しとは到底につかないものにはなっていますが、なんとか満足のいく（？）推しが描けたと思います。

### テンション上げるためにGIFをつくってみた
さぁ、ドット絵ができたので、もちろんアニメーションを作るのはUnity上なのですが、一旦動かして・歩かせてみたい！という欲が出ました。そこで、一旦GIFをつくりました。

これもなんと！！！オンラインで簡単にGIFが作れるサイトがあり、その技術に感謝しながら使わせていただきました。。（参考にしたサイト：https://www.bannerkoubou.com/anime/ ）

できたGIFがこちらになります。

![[left]rinshan_walk.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3952100/81d307c0-50bd-31cb-656b-70909212fa72.gif)

歩いてる～～～！！！！
ただ、ドット絵を描いて、存在するありがたいサイトを使ってGIFを作っただけなのに、とんでもない達成感です。これは、頑張れますね。

では、ここから、Unityを使って勉強しながら初心者が2Dゲームっぽいものを作っていく姿を、備忘録として残していきたいと思います。
よろしくお願いします。

### 追記
推しについて説明していなかったので、追記にて説明させていただきます。
Apexを中心にゲーム配信をしている方で、りんしゃんつかいさん（Youtube：https://www.youtube.com/@Rinshan 、X：https://x.com/Rinshannnn ）です。
良さを語るとここには収まらないので、簡潔に説明すると、ゲームめちゃうまでお話しユニークなおもしろお兄さんです。気になる方は、ぜひ一緒に配信を見守りましょうッ！
IoT演習第９回の演習解答例

# 演習問題

「IoT演習第９回、センサとアクチュエータ」の「5. 演習」「光の強さが強い時と、弱い時で、サーボモータの向きを変える回路とプログラムを作ってください。(2.6と3.2を参考にしてください)」の演習の解答例です。

## 解答へのアドバイス
ー　ヒントになる回路やプログラムや今までに学習した回路やプログラムを良く理解することが必要になります。回路の細かいところや、プログラムの一行一行に意味があります。その意味を理解すると良いです。
ー　論理的に考えてください。

## 参考になる「2.6 光センサ」の回路

光の強弱によって、アナログ入力端子 A0 の電圧が変化するように作成しています。

![20241208-pht-tr-bbd-schm-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585767/19f6f777-6c10-aaab-48b8-37df4ba2c722.png)

## 参考になる「2.6 光センサ」のプログラム

「IoT演習第５回、アナログ値の入力とPWM出力」の、「5.2 プログラム」と同じプログラムを実行することで、１秒ごとに、$9.9 l_x$の値が表示されます。以下、プログラムを再掲します。

アナログ入力端子A0の電圧を0Vの時0, 3.3Vの時、65537 になるように比例配分して出力します。

```Python
from machine import ADC, Pin
import time

adc = ADC(Pin(26))

while True:
    print(adc.read_u16())
    time.sleep(1)
```

## 参考になるサーボモータを動かす回路の例：

GPIO GP9からPWM信号が出力されることを想定してそのデューティー比によりサーボモータ(SG90)が動くように回路を作っています。

![20240824-pico-w-servo-brdb-sche-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585767/67b12b26-eef7-6b16-5c64-91367bd4b797.png)


## 参考になるサーボモータを動かすプログラムの例

SG90の仕様から、SG90のホーンの向きを、0度、90度、0度、-90度に変化させるようにデューティー比を作り、その出力を繰り返しています。

```Python
from machine import PWM, Pin
from time import sleep

servo = PWM(Pin(9))
servo.freq(50)

angle_M90 = int(2.5 / 20 * 65536)
angle_0 = int(1.5 / 20 * 65536)
angle_90 = int(0.5 / 20 * 65536)

while True:
    servo.duty_u16(angle_0)
    print(angle_0)
    sleep(2)
    servo.duty_u16(angle_90)
    print(angle_90)
    sleep(2)
    servo.duty_u16(angle_0)
    print(angle_0)
    sleep(2)
    servo.duty_u16(angle_M90)
    print(angle_M90)
    sleep(2)
```

# 解答例

光の強弱により、アナログ入力端子A0にかかる電圧が変化し、
```Python
adc = ADC(Pin(26))
v=adc.read_u16()
```
で得られた光の強弱に比例した値（およそ$9.9 l_x$）が、500より小さい時は、サーボモータの角度を0にし、500以上の時は、サーボモータの角度を90度に変化させます。

## 回路の例

A0端子で、光センサで得られる、照度にほぼ比例した電圧を計測し、
GPIO 9の端子でサーボモータの信号線にPWMの信号を与えるようにします。

![20241204-phttr-servo-bbd-sch-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585767/15f004e2-b842-0e16-9555-49ca766d7387.png)

## プログラムの例

while ループの前に、サーボモータのホーンの位置が-90度、0度、90度になる場合のPWMのデューティー比の設定、を行っています。アナログ入力の設定も行っています。

whileループの中では、A0端子で計測した光の強さ(およそ$9.9 l_x$)が500より大きければ、サーボモータの信号線に、ホーンの向きが0度になるようなデューティー比のPWM信号を出力します。A0端子で計測した光の強さ(およそ$9.9 l_x$)が500以内であれば、サーボモータの信号線に、ホーンの向きが90度になるようなデューティー比のPWM信号を出力します。

```Python
from machine import PWM, ADC, Pin
from time import sleep

servo = PWM(Pin(9))
servo.freq(50)

angle_M90 = int(2.5 / 20 * 65536)
angle_0 = int(1.5 / 20 * 65536)
angle_90 = int(0.5 / 20 * 65536)
adc = ADC(Pin(26))

while True:
    v=adc.read_u16()
    print(v)
    if v<500:
        servo.duty_u16(angle_0)
    else:
        servo.duty_u16(angle_90)
```
学習コンテンツオススメ

記載内容は所属会社を代表したものではなく、私の個人的な意見ということをご了承ください。

# はじめに
エンジニアとしてのスキル磨きやもっと学習したいと言った思いはないでしょうか？

私も現在入社5年目ですが4年目の時点でAWSの業務未経験の中、2024 Japan AWS All Certifications Engineersを受賞させて頂きました。

普段はC#を使った組み込み開発、最近ではWEB APIの開発や生成系AIを使った業務と様々な業務に携わらせていただいております。

そこで、今まで活用してきた学習コンテンツの紹介をさせていただきたいと思います。

# ソフトウェア開発編
<a href="http://www.oreilly.co.jp/books/9784873115658/">リーダブルコード</a>
「読みやすいコード」をどうやって実現するかを具体例を交えながら非常にわかりやすく紹介されています。
こちらに関しては、内容の説明に関する記事が多く取り上げられているので詳しい説明は割愛させていただきます。

<a href="https://gihyo.jp/book/2022/978-4-297-12783-1">良いコード／悪いコードで学ぶ設計入門</a>
良い例と悪い例がどちらも取り上げられており、私の場合悪い例で心に刺さるものが多く、どんな悪いコードをどう良いコードに直せば良いのかが分かりやすく非常におすすめです。
こちらも、内容の説明に関する記事が多く取り上げられているので詳しい説明は割愛させていただきます。

# C#を使った開発編
<a href="https://www.bookcellar.jp/product/detail/1847040">［改訂新版］実戦で役立つ C#プログラミングのイディオム/定石＆パターン</a>
私が読んでいたのはもう1つ前の版ですが、C#を書き始めてすぐの時期にはかなり役立つと思います。
とにかく実用例がたくさん載っている所が良いと思います。
ソースコードからの外部ファイル出力など即時使える例も多数あり、使いやすいです。

<a href="https://www.udemy.com/share/1029ju3@edgYhOFdXDA5TkAXI5EjOnoVFtyR3yzvGjvez0o6iFC3e4YqtFMMBEb8PW-lrHHUaw==/">C#を勉強する順番</a>
業務でC#を使いますと言われて、「さぁ勉強するぞ！」と意気込みの方も多いのではないでしょうか？
でもいったい何から勉強すれば良いのかお悩みかと思います。そこでこちらのコースがおすすめです。無料コースでも充分に知りたいことを知れると思います。(有料コースだとQAとかが出来るようになる。)

<a href="https://www.udemy.com/share/101IBa3@gR-5aZeTp-lK6GDhlyOLrQaIZpx5w3_O937W1JChFXB-t-zs3hlLIoyVyZkLBBmK5Q==/">C#のWPFでXAMLを書く方法</a>
さて、これはお悩みの方が多いと思います。製品開発に携わり始めたりするとXAML上にStackPanelやGridなどが出てきて、自己学習だけじゃしんどいなと思ってきた頃におすすめです。職場で言われたことについて「これかぁ！」と言った体験に繋がるのではないかな？と思います。

# AWS編
<a href="https://qiita.com/wasyokusatoshi/private/153fb3c47a03ed79a06c">CloudTech</a>
私がAWSの勉強をするにあたって、最もお世話になったコミュニティです。
資格試験対策やAWSの各サービスの講座はもちろんのこと、コミュニティとして何気ない雑談や試験結果報告、他の受講者の学習レポートなど1人で勉強をするんだけど、1人ではないと言った気持ちになれます。
また、不定期に外向けの勉強会のメンバー募集や技術書籍の執筆メンバーの募集もあり、個人で勉強をしていると体験しづらい経験もたくさん出来ます。

<a href="https://aws.amazon.com/jp/training/digital/aws-cloud-quest/">AWS Cloud Quest</a>
実用的なAWSのロールプレイングゲームです。
街で困っている人をAWSを使って助けていきます。
最近では日本語対応してきたロールもありますが、やはり英語のロールの方が多いので私はChromebookでAndroidの翻訳アプリを平行して使いながらしてました。
また、このゲームで解決するユースケースは実際の試験問題で問われるユースケースにも近く、テスト勉強に使うのもおすすめです。

<a href="https://aws.amazon.com/jp/events/aws-event-resource/?cards.sort-by=item.additionalFields.SortDate&cards.sort-order=desc">AWS Black Belt Online Seminar</a>
資格試験の勉強で何となく知った気になっているけど試験になると分からなくなるようなサービスってないでしょうか？
AWS Black Belt Online Seminarでは各サービスに対してYouTube動画やPDFで詳しく紹介されています。

# Web API開発編
<a href="Udemyのこのコースは私の大のお気に入りです。あなたもいかがですか。
https://www.udemy.com/share/107k3O3@lr3C-JzjmAXDPBCEsASMYmStUes-ay9VZakTh0aBR_9akcLffkpXXeDmYTMlgantVQ==/">はじめてのPostman（ポストマン）入門。HTTP通信やREST APIの基礎を学び、APIデバッグ手法の基礎を学ぼう</a>
API開発の初歩的なところから教えてくれます！
私も現在勉強中！

# さいごに
偉そうな事を言える程の実績はありませんが少しでも皆さまの学習の励みになればと思います！
以上！
paddingとmarginの覚え方

CSSのpaddingとmarginについて、どちらが内でどちらが外か分からなくなる時があると思いますので、覚え方を１つ持ち合わせておいて迷わないようにしましょう:wink:

padding・・・要素の内側の余白
そもそもの意味は「詰め物をすること」

margin・・・要素の外側の余白
そもそもの意味は「余白、縁、欄外、儲け」など。

　パディング(padding)はパッド(pad)「詰め物」から派生した言葉で、「詰め物をする」という意味がありますので、<font color="#1e90ff">**詰め物＝中に入れるもの＝内側**</font>。
　マージンは「マージンを貰う」と使用される言葉のように儲けという意味がありますので、<font color="#1e90ff">**儲け＝余分＝外側の余白**</font>。

 これで迷わなくなりますね！

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

https://projisou.jp
OMC236D(1586)

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

![OMC236D.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543462/05864d2d-0bb6-acb5-2985-09f793a86103.png)

上はOMC236 D問題の別解を図示したものです。

点$Q$から辺$AB,BC$への垂線の足をそれぞれ点$X,Y$とします。
このとき、四角形$BXQY$は長方形なので、$∠XQY=90°$なので、$∠RQX=∠PQY$です。
また、$QR=QP$であるので、直角三角形の合同条件より、$△RQX≡△PQY$となり、$QX=QY$になります。
したがって、長方形$BXQY$は正方形になります。

ここで、$BQ$(正方形$BXQY$の対角線)は$∠ABC$の二等分線であるので、
$AB:BC=AQ:QY$が言え、$5:12$になります。
また、三平方の定理から$AB:BC:CA=5:12:13$となります。
よって、$QX=QY=\frac{5×12}{13}=\frac{60}{13}$です。

(ここから、別解とは違う解き方です。)

$RX=PY=x$と置きます。
$△PBR$の周長が$17$であるので、$PR$は、
$17-(\frac{60}{13}+x)-(\frac{60}{13}-x)$
$=17-2×\frac{60}{13}$
$=\frac{101}{13}$
です。

また、三平方の定理から
$(\frac{60}{13}+x)^2+(\frac{60}{13}-x)^2=(\frac{101}{13})^2$
$2×\lbrace(\frac{60}{13})^2+x^2\rbrace=(\frac{101}{13})^2$
$2x^2=(\frac{101}{13})^2-2×(\frac{60}{13})^2$
$x^2=\frac{1}{2}×(\frac{101}{13})^2-(\frac{60}{13})^2$ $...①$
です。

$△PBR$の面積は、
$\frac{1}{2}×(\frac{60}{13}+x)×(\frac{60}{13}-x)$
$=\frac{1}{2}\lbrace(\frac{60}{13})^2-x^2\rbrace$
$①$を代入して、
$=\frac{1}{2}\lbrace(\frac{60}{13})^2-(\frac{1}{2}×(\frac{101}{13})^2-(\frac{60}{13})^2)\rbrace$
$=(\frac{60}{13})^2-\frac{1}{4}×(\frac{101}{13})^2$
$=\frac{1}{4×13^2}×(4×60^2-101^2)$
$=\frac{1}{4×13^2}×(120+101)×(120-101)$
$=\frac{1}{4×13^2}×(13×17)×19$
$=\frac{17×19}{4×13}$
$=\frac{323}{52}$

上記より、解$a+b$は、$323+52=375$となります。
【PowerPoint VBA】スライドのシェイプ数を表示するマクロ

# はじめに
PowerPoint VBAを使った自動化ツールを実装している際に、検証としてシェイプ数を取得する簡単なマクロを作りました。

##　取得するスライド 
シェイプ数を取得するPowerPointのスライドは下記の画像です。

![Slide2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1055346/a50c5e33-c439-88ec-f9d8-68fa98b3b5b4.jpeg)

## 実装したソースコード
実装したソースコードです。
```
Sub GetShapeCount()
    'スライドオブジェクト変数
    Dim Slide As Slide
    'シェイプ数カウント変数
    Dim shapeCount As Integer
    'PowerPointアプリケーション、pptファイルオブジェクト
    Dim ppt As Object
    Dim ppt_file As Object
    
    Set ppt = CreateObject("PowerPoint.Application")

    
    Set ppt_file = ppt.ActivePresentation
    
    'アクティブなスライドを取得
    Set Slide = ppt_file.Slides(2)
    
    ' スライド内のシェイプ数を取得
    shapeCount = Slide.Shapes.Count
    
    ' 結果を表示
    MsgBox "このスライドには " & shapeCount & " 個のオブジェクトがあります。"
End Sub
```

## テストした結果
テスト結果は以下の画像です

![result1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1055346/8aa4ace5-dd57-6dc8-3f8a-0a6b48722dfd.jpeg)

# 最後に
PowerPoint VBAで何か開発することも少ないので、勉強になります。
Kotlinのhelloworldをシンプルに動かす

# 概要
Kotlinに入門すると、ツールや用語が多いので、手っ取り早くPodman(Docker)で実行できるようにしたときの備忘録です。

- コンテナエンジンは、`Podman 5.2.5`を利用する
- 簡単のため、ビルドツールであるgradleは使わない。[kotlinc](https://kotlinlang.org/docs/command-line.html)というKotlinのコンパイラを使います

# ファイルの用意

```kotlin:HelloWorld.kt
fun main() {
    print("hello world")
}
```

```docker:Dockerfile
FROM openjdk:21-jdk-slim as build
# ビルドに必要なパッケージをインストール
RUN apt-get update && apt-get install -y wget unzip curl jq
# 最新バージョンのKotlinをインストール
RUN LATEST_KOTLIN_VERSION=$(curl -s https://api.github.com/repos/JetBrains/kotlin/releases/latest | jq -r .tag_name | sed 's/^v//') && \
    wget https://github.com/JetBrains/kotlin/releases/download/v${LATEST_KOTLIN_VERSION}/kotlin-compiler-${LATEST_KOTLIN_VERSION}.zip && \
    unzip kotlin-compiler-${LATEST_KOTLIN_VERSION}.zip -d /opt && \
    ln -s /opt/kotlinc/bin/kotlinc /usr/local/bin/kotlinc
WORKDIR /app
# カレントディレクトリ直下にあるHelloWorld.ktを使う
COPY HelloWorld.kt .
RUN /usr/local/bin/kotlinc HelloWorld.kt -include-runtime -d HelloWorld.jar

# 6. 実行環境の準備
FROM openjdk:21-jdk-slim
WORKDIR /app
COPY --from=build /app/HelloWorld.jar .
# コンテナ起動時に実行するコマンド
ENTRYPOINT ["java", "-jar", "HelloWorld.jar"]
```

## Dockerfileの補足
### マルチステージビルド
- `FROM`が2つあるのは、[マルチステージビルド](https://docs.docker.jp/develop/develop-images/multistage-build.html#id11)というもので、イメージをビルド用と実行用にわけて作成し、実行用のイメージ（`podman run`で実行）を軽量化できる
- 実行ステージ（2番目の`FROM`以降）で、`--from=build`を指定することで、ビルド用で作成した`jar`ファイルをコピってくる

### Javaのバージョン
- Kotlinでは、Java 9～23を対象としている（2024.12現在）。
https://kotlinlang.org/docs/faq.html#which-versions-of-jvm-does-kotlin-target
- そのためJavaの最新のLTS（Long Term Support）を確認しておき、Version.23以下でLTSのモノを探す
- 今回はVersion21を使うことにした
    - https://openjdk.org/projects/jdk/21/
    - https://www.oracle.com/jp/java/technologies/java-se-support-roadmap.html
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30994/c3a6cccc-813f-19dc-25fb-a1a900172925.png)


### kotlinc
- `-include-runtime`オプションを指定すると、[Kotlinのランタイムjarが組み込まれる](https://discuss.kotlinlang.org/t/kotlin-1-4-21-where-is-kotlin-runtime-jar/20655/2)

# 実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30994/0351cd96-49e8-ae2a-2418-032aacea29f6.png)

- `podman build -t kotlin-helloworld .`でビルドする
- `podman run --rm kotlin-helloworld`でコンテナを実行する
    - Dockerfileの`ENTRYPOINT`で指定した処理（`java -jar HelloWorld.jar`）が実行される