OmniAICreator/Qiita-1.07M huggingface dataset:
Excel in Pythonを使ってみた①

### ■Excel in Pythonとは
Excel内でPythonの処理を実行できる機能を指します。

### ■Pythonが使えるエクセルのバージョン

| バージョン | ユーザー |
|:-:|:-:|
| __2407 (ビルド 17830.20128)__ | __Enterprise ユーザー__/__Business ユーザー__|
| __2405 (ビルド 17628.20164)__  | __ファミリー ユーザー__/__個人ユーザー__ |

### ■エクセルのバージョン確認方法
・メニューバーの「ファイル」をクリック
・表示メニュー内の「アカウント」をクリック（１）
・確認（２）

![スクリーンショット 2024-11-08 133703.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/df59acd9-1ce1-3680-227f-aa6e9a67710b.png)

### ■エクセルのバージョンが低い場合
（２）の上の「更新オプション」から「今すぐ更新」をクリックすることで最新バージョンへ更新できます。

### ■使ってみよう
Excelの中の商品の合計(組み込み型の『PY関数』を使う)
![スクリーンショット 2024-11-08 142540.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/261d1bfb-9004-f65b-a4c5-69a685318d83.png)

```py
pencil=xl("B1")
eraser=xl("B2")
pencase=xl("B3")
compass=xl("B4")
ruler=xl("B5")
pencil + pencase
```

### ■セル内でPythonの関数を使ってみる
  __(1)Pythonの関数をオブジェクトとして保存__

```.py(最初のエラーコード）
def＿add(a, b):
return a + b
```
豆知識
・セル内での折り返し　__Enterキー__
・セル内を確定　　　　__Shiftキー+Enterキー__

※全角アンダーラインはわかりやすいように入れました。コード上は入っていません。

```出たエラー
SyntaxError: invalid non-printable charactor U +3000 (line1)
```
Pythonの「SyntaxError: invalid non-printable character U+3000」とは何ですか？

「全角スペース」が不正な使われ方をされているという文法エラーです

場所は１行目

>Python学習チャンネル by PyQ
>https://blog.pyq.jp/entry/python_kaiketsu_211102

```.py(修正版1)
def_add(a, b):
return a + b
```
※半角アンダーラインはわかりやすいように入れました。コード上は入っていません。

```.py(次のエラーコード）
def add(a, b):
return a + b
```
```出たエラー
indentationError:expected an indented block after function definition on line 10
(2613899012.py, line2)
```

インデント(字下げ)が不適切であるエラーです。

if, elif, else の中のコード
for の中のコード
while の中のコード
関数 (def xxxx():) の中のコード
クラス(class xxxx():) の中のコード

このような箇所で字下げ（インデント）します。

>初心者がAI・データサイエンス・Pythonでつまづいたら見るブログ
>https://wp.nakanishi.pro/python/284/


```.py(修正版2）
def add(a, b):
 return a
```

```.py正解
def add(a, b):
 return a + b
add
```

上記のように書くとセル内が「function」という表記に代わってオブジェクトの完成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/ffa25e28-e667-9087-0906-ff0728515368.png)

次に

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/9bbc2813-f86f-0763-7d66-900360c11e55.png)

functionを利用してみる


豆知識②
ひし形のアイコンをクリック、またはセルを選択してからCtrl＋Shint＋F5キーを押すと、オブジェクトに関する情報を確認できます。
![011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/877667d5-31ef-bdec-2867-cc124e2bc0f4.png)

⁠>gihyo.jp⁠
>https://gihyo.jp/article/2024/02/monthly-python-2402

Excel in Pythonを使ってみた①でした
shadcn-svelteのSelectコンポーネントの値の取得・操作について

### はじめに

Reactではよく使われるUIコンポーネントの「shadcn」ですが、これをSvelteに有志の方が移植してくれています。

shadcnは、シンプルでビジネス寄りなデザインのUIコンポーネントです。
Tailwind CSSを利用しているため、クラスを追加するだけで簡単にデザインを調整することができます。

本家shadcn様：https://ui.shadcn.com/
shadcn-svelte：https://www.shadcn-svelte.com/

しかし、上記のドキュメントを見ても、ばっちり網羅しているわけでもなく、サンプルも少なめなので、使うにあたってちょっと迷ったことがありました。
以下、そういった部分について列挙しますので、良かったら参考にしてshadcn-svelteを使ってみてください。

他のコンポーネントについては、追加したり、別記事にしたりするかもしれません。

***
### Select
Doc：https://www.shadcn-svelte.com/docs/components/select

選択しているアイテムを取得したり操作する方法がわからなかったんですが、これでいけました。
```Select
<script>
    let selectedObject: {
        value: string,
        label: stirng,
        disabled: boolean
    }
</script>

<Select.Root bind:selected={selectedObject} >
    <Select.Trigger >
        <Select.Value placeholder="くだものを選んでね" />
    </Select.Trigger>
    <Select.Content>
        <Select.Item value="banana">バナナ</Select.Item>
        <Select.Item value="orange">オレンジ</Select.Item>
    </Select.Content>
</Select.Root>

<p>
    選択した値：{selectedObject.value}
</p>
```

以上です。
3Dモデルのフォーマット変換（PyVista）

PyVistaを用いて3Dモデルを変換します

# コード
```python:model_transfar.py
import pyvista as pv

in_filename = 'input.stl'
out_filename = 'output.vtk'
reader = pv.get_reader(in_filename)
mesh = reader.read()
mesh.save(out_filename)
```
1 : pv.get_reader()でフォーマットに合わせた読み込み関数を呼び出し
2 : reader.read()でメッシュを読み込みmeshに格納
3 : mesh.save()でフォーマットに合わせて書き込み


# 対応拡張子
入力側
'.obj''.stl''.vtk'など[2]

出力側
'.vtp''.stl''.vtk'.geo''.obj''.iv'

# 参考
[1]https://tutorial.pyvista.org/index.html
[2]https://tutorial.pyvista.org/tutorial/02_mesh/solutions/e_read-file.html
[3]https://docs.pyvista.org/api/readers/_autosummary/pyvista.objreader
[4]https://docs.pyvista.org/api/core/_autosummary/pyvista.polydata.save
AIチャットボットの解説が理解できないので、自分の言葉に直してきいてみた。

# はじめに
プログラミングを学ぼう、更にE資格を取ってみようと思って学習に励んでいる時、多くの初学者が恐らく何度も壁にぶつかると思う。
慣れない数式、記号、用語……それらを調べても、前提として専門的な用語を知っている・きっちり理解やイメージができている前提で解説が進み、謎が深まっていくことがある。
私は文系に徹しすぎた経歴なので、余計に困っているのかもしれない。

:::note warn
注意
ここから先、何でこんな事も解らないんだとイラっとしたらすみません……
:::

でも謎を謎のままにしておくわけにはいかないし、すぐに訊ける相手もいない。そんな時によく私が頼るのが、AIチャットボットだ。
ハルシネーションといった問題は、誰かに頼れるタイミングで答え合わせをしたり、学習を進める中で本当にAIチャットボットの解説が合っているのかを考えたりしている。

私がよく行うAIチャットボットとのやり取りが小さなアウトプットとしても機能し、理解を深めているかもしれないと思ったので、一例を紹介したい。

# AIチャットボットとのやりとり
例えばある用語がわからなかったとする。様々な解説を読んでもわからない時、まずはAIチャットボットにシンプルに訊ねてみる。
> 私「潜在空間とは」
AIチャットボット「潜在空間は、機械学習やディープラーニングにおいて重要な概念です。潜在空間とは、データの本質的な特徴を捉え、表現するための抽象的な空間のことです。（中略）データ解析や特徴抽出など、様々なタスクにおいて、データを効果的に表現するために潜在空間の理解が重要となります。」

（中略）部分に詳細な解説があったが、わかりそうでわからなかったので、次に、理解できた範囲で質問し直してみる。（質問を深堀する際、“つまり”といった言葉を挟まないと、全く別の質問として扱われることがある。）
> 私「“似たデータは潜在空間においても似た埋め込みベクトルになる”これってつまり、RGBのカラー画像でもモノクロ画像でも似たベクトルになるって解釈で良い？」
AIチャットボット「潜在空間におけるこの文は、一般的には似た特徴を持つデータが、潜在空間上でも近い埋め込みベクトルを持つということを表しています。つまり、（中略）ただし、（中略）したがって、（中略）一般論としては、似たデータは潜在空間上でも近い埋め込みベクトルを持つ傾向があるという解釈で構いませんが、実際のデータや学習アルゴリズムによって違いが出ることに留意する必要があります。」

条件次第で厳密な解釈が異なることはなんとなく理解できたが、今回に関してはもっとざっくりで良いので、学習を進める上での簡単なイメージを掴みかったので、こんな質問にしてみた。

>私「潜在空間って例えばどんなものがイメージしやすい？」
AIチャットボット「潜在空間をイメージしやすくするために、例を挙げて説明しますね。
潜在空間は、データの特徴を表現するための抽象的な空間であり、（中略）例えば、笑顔や怒りの表情など特定の特徴が近い領域にマッピングされることで、（中略）つまり、潜在空間ではデータをより抽象化された形で捉え、その特徴を反映した表現を獲得することができるというわけです。このように、潜在空間はデータを効果的に表現し、新しいデータの生成や変換、特徴の抽出などに活用される概念です。（後略）」

なんかあと一歩って感じがしてきたが、**潜在空間**という字面を見た瞬間にパッと思い浮かべられる容易なイメージが欲しい。

> 私「もっとかみ砕いて教えて」

この文言はAIチャットボットに対して私が良く投げかける言葉だ。なるべく専門用語を使わず、理解を深めたり確認したい時、あるいは「ごめん全然わからないや」といった時等、結構しっかり噛み砕いてくれるので助かっている。

> AIチャットボット「潜在空間をもっと簡単に説明すると、潜在空間はデータの"良いところ"を抜き出して表現する空間のことです。例えば、顔画像の潜在空間では、笑顔や怒りの表情などの特徴を上手に捉えた空間としてイメージすれば良いです。これにより、似た特徴を持つデータは近い位置に配置され、新しいデータの生成や変換を行いやすくなります。（後略）」

おや、なんかわかった気がするぞ？確認してみよう。

> 私「例えば、“笑顔の写真では口角が上がってる”という特徴を、にこちゃんマークとして表現するみたいな感覚？」
AIチャットボット「その例えはとてもわかりやすいですね！潜在空間は、データの特徴を捉えて表現する空間であり、（中略）具体的な特徴を捉えることで、データの本質をより効果的に表現し、新しいデータの生成や変換を行う際に役立ちます。」

褒めることを忘れないAIチャットボット、ありがとう。
このような形で質問をし、質問をしっぱなしにしないで自分なりの表現をしてみると、結構理解が深まり、その言葉（今回で言うと潜在空間）をパッとイメージすることができるようになった。そうすると、全く知らない土地の言葉でも読んでいる気分だった文章が、急に日本語に見えてきて、学習が進む。
そして、自分なりの言葉に変換して表現するという、一種のアウトプットを行ったことで、言葉の意味理解が定着しやすくなる。
あと褒めてくれたから、モチベーションもちょっと上がった。

# 最後に
Qiitaの更新や開発といったアウトプットのハードルは、初学者にはやや高く感じてしまう。時間的な制約なんかもあるかもしれない。かといって、インプットばかりしていると、実際に取り扱う・考える時に上手く表現できないことも起こると思う。
けれど、AIチャットボットを利用したこういった**小さなアウトプット**であれば、あまり気負わず、日常的に行えるだろう。勿論、厳密な定義からは外れることや、嘘の情報である可能性は常に念頭に置いておくべきではあるので、他の手段がある時は併せて利用していきたい。

:::note
どのAIチャットボットを使うかによって、親切さは違います。
:::
初心者エンジニアが経験した！スケジュールが遅れる要因n選

# はじめに
新しいプロジェクトに着手するとき、要件定義が終わったらまずスケジュールを立てることが必要です。
ですが、着手段階でスケジュールって立てづらくないですか？
（個人的には、まだまだ不確定要素が多すぎて「この日までにやれます！」と言うのがとてもこわいです。）

そこで、この記事では、
**スケジュールが遅延する原因とその対策**
について、設計、実装、テストの各フェーズに分けて解説します。
実際の経験を元にまとめていますので、自分と同じ初心者エンジニアの方にとって、
少しでもスケジュール管理のヒントになれば幸いです。

# 設計フェーズ
**①要件がまだ固まっていない**
▷対策
確実に固まっているところから着手するか、
結合テストのケースを先に考えておくなど、手持ち無沙汰にならないように工夫するとよいです。
予め、設計の期間を少し長めに取っておくのも一つの手かもしれません。

**②レビューが遅れ、後続作業を始めている場合に手戻りが発生する**
▷対策
 設計完了の目途が立ち次第、早めにレビューの日程を抑えておくと安心です。
　
# 実装フェーズ
**①設計ミスが発覚する**
▷対策
実装フェーズで対策をするのではなく、設計段階でしっかりとソースコードに目を通しておくことで、なるべく設計ミスを少なくすることが対策です。
コメントアウト（TODOコメント）を使って作業内容をメモしておくのも有効だと思います。

**②開発用ツールが上手く動かない/作業中のファイルが消えてしまう**
▷対策
開発用ツール（Eclipseなど）の不具合で、ファイルの変更内容が全て消えてしまった...ということも、稀にですが起こります。
アプリの不具合なので防ぎようがないですが、
ローカルリポジトリにこまめにコミットしておくか、ときどきバックアップを取っておくと、
影響範囲を最小限にすることができます。

# テストフェーズ
**①インフラのトラブル（対向システムとの通信ができないなど）**
▷対策
テスト工程だとこれが一番よくあるケースかと思います。
こちらも根本的には防ぎようがないです。
もし修正前のモジュールを動かせる状態であれば、早めに軽く動作確認をしておいて、
インフラチームに不具合を報告しておけば、スケジュールへの影響を抑えられるかもしれません。
また、テストデータに不備があって通信ができないなどのケースも稀にあります。

**②バグが見つかり、実装（場合によっては設計）の修正が必要になる**
▷対策
設計由来のバグの場合、設計と並行してテストケースの作成を行っておくことで、想定の抜け漏れを減らすことができます。
特に、機能要件だけでなく、非機能要件も満たせているかどうか（特に処理件数が増えたときの応答時間など）も念頭に入れて置く必要があります。
実装由来のバグの場合、可能であればなるべく多くの人にレビューをしてもらうことが良い対策になると思います。
特に最初のうちはレビューが怖くて避けがちですが（僕はいまだにちょっと怖いです）、後々不具合が発覚する方がもっと怖いので、レビューは色んな人に見てもらえば見てもらうほど良いです。

# おわりに
今回上げた要因以外にも、
「自分はこういうことが起こってスケジュールが遅延したよ！」ということがあれば、
コメントで教えていただけると幸いです。

余談ですが、可能であればスケジュールは点ではなく線で設定できるのが望ましいと思います。
「○月○日に完成！」ではなく、「○月○日～○月×日の間に完成！」という感じです。
ただ、スケジュール作成時には既に納期なりリリースなりの日程はビタッと決まってしまっている場合が大半だと思います。
せめてマイルストーン（設計の完了や実装の完了地点）だけでも幅を持って見積もって、もし遅れた場合は早め早めに対策を打てると理想的です。
はじめての転職活動の記録と反省点

# 筆者のプロフィール
* 転職活動開始時で32歳独身
* 近畿出身＆現在実家住まい
* 中小企業2社でパートタイマーとしてダブルワークをしている
    * 片方はパソコン教室
* 大学をメンタル病んで休学→中退している

# 転職しようとした理由
これ！　という一個の強い理由というより、色々積み重なった結果転職活動を始めた感じです。
ベタですが、
* 給与を上げたい
* 経験を積みたい（自分の市場価値を上げたい）
* 今の会社の将来性が不安

……といったところです。

今の仕事は残業がほぼなかったり、プレッシャーがそこまで無い部分は居心地がいいです。
ただ、
「現在の給与水準が今後も続くと自分一人の食い扶持だけでも不安」
「自分・両親が健康でいるうちに稼いでおきたい」
と思い、そのためなら仕事の負荷が上がっても許容できるな、となり、転職活動をスタートしました。

もしダメならダメで、自分の市場価値がはっきりわかっていいだろう、という気持ちもありました。

# やったこと

* マイナビ・リクナビの転職サイトに登録
    * プロフィール等を書くのと並行して履歴の整理・振り返り
    * 自己分析
    * 将来設計（超ざっくり）

プロフィール＆希望条件をもとにマッチした求人の情報が来るので、お互いの条件が合いそうなところに書類選考を申し込んでいきました。
現職の都合上、面接に行けるのは週に1日だけなので、一度に申し込むのは3社を上限にしていました。

* データでの履歴書・職務経歴書の準備
* 紙の履歴書の準備
    * Word形式のテンプレートをグーグルドキュメントにアップして記入してコンビニ印刷
* 履歴書用の写真の用意
    * 写真の用意を忘れて慌てたので自戒のために書き残し
* 面接時の質問の想定と回答の準備
    * 転職サイトの記事などを参考に質問を書き出し、自分の答えを文章にしておいた

# 結果
活動を始めて2か月ほどで内々定を得ました。

# 反省点
面接を通して、（もっと）やった方がよかった～と感じたことを書き残します。

* 自主制作＆ポートフォリオの作成
    * 私の場合業界未経験なのもあって、技術力を示すものがあればよかった
* 将来設計（特にキャリアデザイン）
    * キャリアの希望をほぼすべての面接で聞かれた
    * そのための業界研究
        * どういうキャリア例があるか、モデルケースを見つけておけばもっと話しやすかった
    * 介護などについての家族との話し合い
        * 今現在必要ではないので、面接ではそこまで突っ込まれて聞かれなかったが、ここを避けて将来設計しても現実的ではない
        * しづらいけれどできるうちにしたほうがいい

# その他所感
## 資格
直近で取った資格が応用情報技術者でしたが、会社によって多少評価されました。
無理して取る必要はないけれど、あって損はない、という感触ですね。言語の資格もあればよかったかも？
実務経験がないほど取る価値は上がりそうですが、個人開発などの成果物を優先したほうが良いかな、とも感じました。
## メンタルの病歴
ここは面接で毎回聞かれました。勤務に影響がないか、再発の可能性はどうか、という点です。
質問されるのは仕方ないことなので（私が雇う側でも気になる）、正直に返答しました。
## 通勤時間・通勤経路
意外にも、これもほぼ毎回質問されました。
勤務地がガラッと変わる場合は特に、勤務地候補周りの路線図を確認した方がスムーズに返答できます。

# 最後に
やっぱり実際にやってみてわかることが多くありました。

転職・転職活動をしなくても、将来設計や家族との話し合いは普段からしたほうがいい！　というメッセージをこれからの自分に残します。
Power Apps ギャラリーの昇順・降順

## はじめに
BizOptimars のいのうえです。
今回はギャラリーの昇順・降順の並べ替えを行う方法をご紹介いたします！

## 用意したもの
SharePoint Lists を 1 つ用意しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/bc9b7b36-4eda-5259-4d66-470f0a19a85b.png)

| 列名 | データ型 |
|:-:|:-:|
| タイトル  | テキスト  |
| EquipmentNo  | 数値  |
| LoanDate  | 日付  |

## Sort 関数と SortByColumns 関数
では、Power Apps へ移ります。
並べ替えには Sort 関数もしくは、SortByColumns 関数を使用しますが、違いとしては以下のようになります。

**Sort 関数**：数式を基に並べ替えを行うため、複雑な計算や条件を基にした並べ替えが可能
**SortByColumns 関数**：複数の列を指定して並べ替えができるため、特定の列順に従った並べ替えが可能

今回は、特定の列を指定して並べ替えを行いたいので、SortByColumns 関数を使っていきます。

## ギャラリーの並べ替え
用意したリストをギャラリーに表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/ea8405ad-f8b0-66bf-db87-165b8b35655a.png)

まず、LoanDate で昇順での並べ替えを行ってみます。
ギャラリーの Items プロパティに以下画像のように式を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/a811061f-e341-ddc4-1af1-3d44cc59807a.png)
```
SortByColumns(リスト名,"列名",SortOrder.Ascending)
```
そうしますと LoanDate の昇順に並べ替えができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/91773d9d-9954-1d2a-8023-51657a82b857.png)

降順にしたい場合は以下のように変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/aff912c2-ba97-d8bd-df87-08d74770139a.png)

そうしますと、降順に並べ替えができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/c7bfe3a5-b8b8-54aa-6f71-86fee1719fd2.png)

別の列、EquipmentNo で並べ替えを行う際は、列名を変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/12b9a192-bd8e-c7f3-62ac-f7526e09dbd6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/687925cc-91da-0eb1-b301-2a948e1a9f3e.png)

ここで指定する列名は、今回は SharePoint List を使っているため、SharePoint Lists の内部列名を指定する必要があります。
列を作成する際に、最初に日本語で列名を設定した場合は、以下のような文字列が候補に出てくると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/1df56abd-038c-c81d-22b0-6b56fc0b431b.png)

内部列名の確認方法は以下手順になります。
1. リストを開いた状態で、右上の歯車マークをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/87527af4-a522-5c2f-d2ed-c39aab4bd703.png)

2. リストの設定をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/8a9ced59-1056-ad7e-f910-05e4177abb05.png)

3. 内部列名を確認したい列名をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/2118cfeb-640f-bf9b-b63a-b8515129b380.png)

4. URL の最後のイコールから後ろの文字列に「OData_」を頭に付けたものが内部列名になります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/c29da3e3-1261-4ec8-3373-3fde8ec2b5b4.png)

つまり備品コードという列名の内部列名は「OData__x500b__x6570_」となります。
先ほど候補にあった中だと、以下が該当します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/2f9be6b5-5631-6670-b47b-38f82c7f4ea9.png)

最初に日本語で列名を設定した場合は、内部列名がこのような文字列になりますので、お気を付けください。

## おわりに
今回は簡単に、ギャラリーの昇順・降順を行いました。
これを応用して、例えばドロップダウンでユーザーが指定したもので並べ替えを行うなどすると良いと思います！
AWS Amplify + Bun + Svelte のビルド設定

## TL;DR

[Bun](https://bun.sh/) をインストールする:

```sh
curl -fsSL https://bun.sh/install | bash
```

***

Svelteのための [gzimbron/amplify-adapter](https://github.com/gzimbron/amplify-adapter) をインストールする:

```sh
bun install amplify-adapter
```

`svelte.config.js` のアダプターを変更する:

```js
import adapter from 'amplify-adapter'; // ← コレ
import { vitePreprocess } from '@sveltejs/vite-plugin-svelte';

              
/** @type {import('@sveltejs/kit').Config} */
const config = {
        preprocess: vitePreprocess(),

        kit: {
                adapter: adapter()
        }
};

export default config;
```



***

AWS Amplifyのビルド用YAMLファイルを、以下のように記述する:

```yaml
version: 1
frontend:
  phases:
    preBuild:
      commands:
        # Bunをインストール
        - curl -fsSL https://bun.sh/install | bash
        - source /root/.bashrc
        - bun install
    build:
      commands:
        # Bunを用いて、Svelteのamplify-adapterを利用
        - bun run build
        - cd build/compute/default/
        - bun i --production
  artifacts:
    baseDirectory: build
    files:
      - '**/*'
  cache:
    paths:
      - node_modules/**/*
```

## 参考文献

### AWS + Bun

https://github.com/oven-sh/bun/issues/6164#issuecomment-2036241838

上記イシューのコメントでは、以下のようなYAMLファイルが示されている:

```yaml
version: 1
applications:
  - frontend:
      phases:
        preBuild:
          commands:
            # install bun
            - curl -fsSL https://bun.sh/install | bash
            - source /root/.bashrc
            - bun install
        build:
          commands:
            - bun run build
      artifacts:
        # IMPORTANT - Please verify your build output directory
        baseDirectory: dist
        files:
          - '**/*'
      cache:
        paths:
          - node_modules/**/*
    appRoot: client
```

同僚の @Kanahiro に教えてもらいました、感謝！


### AWS + Svelte

https://docs.aws.amazon.com/amplify/latest/userguide/get-started-sveltekit.html

上の記事では、以下のようなYAMLファイルが示されている（ `cd build/compute/default/` とあることに注意）:

```yaml
version: 1
frontend:
    phases:
        preBuild:
            commands:
                - 'npm ci --cache .npm --prefer-offline'
        build:
            commands:
                - 'npm run build'
                - 'cd build/compute/default/'
                - 'npm i --production'
              
    artifacts:
        baseDirectory: build
        files:
            - '**/*'
    cache:
        paths:
            - '.npm/**/*'
```

以下の記事も参考のこと:

https://qiita.com/Kanahiro/items/dd4afc0d0871b97d4f33
Ollamaで複数のLLMを複数のGPUに載せる

# Ollamaで複数のLLMを同時に、さらに複数GPUに分散させて推論する方法✨

どうも~てんかうだよ〜〜〜ん😊❤️
今回は特別に「Ollamaで複数のLLMを同時に、さらに複数GPUに分散させて推論する方法✨」を教えちゃうゾ！
## 筆者の環境

- **OS** : Windows 10  
- **CPU** : Ryzen9 5950x  
- **RAM** : 64GB DDR4 3600mhz  
- **SSD** : あるだけ全部  
- **GPU** : RTX 3090 & RTX 3060  
- **Ollama バージョン** : 0.4.0  

ちなみに好きなゲームはOneshot (RPG) 🎮

## 手順

やり方は簡単！**環境変数**を設定するだけ！  
以下は筆者の `ollama` 関係の環境変数設定です。

![Ollama環境変数設定スクリーンショット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722357/a363790b-6dc9-bb2d-da58-194ef02cb2eb.png)

### 重要な環境変数の設定項目

1. **`CUDA_VISIBLE_DEVICES`**  
   - 使用するGPUを指定します。

2. **`OLLAMA_MAX_LOADED_MODELS`**  
   - ロードできるモデルの数を指定します。（2だとなぜかダメでした。何故…?）

3. **`OLLAMA_NUM_PARALLEL`**  
   - 同時に推論できる数を指定します。

### 以上で設定完了！

## 動作確認
llama3.2 11b と qwen2.5 と sbv2　をロードします。
VRAMの使用状況を見ると、**ピッチピチ**です！  
やばい！

<div style="display: flex;">
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722357/68010623-423d-bea0-50a1-69fc31897eac.png" alt="VRAM確認スクリーンショット1" style="width: 50%; margin-right: 10px;">
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722357/c82d1e50-972e-1648-356e-42ccaa64be4c.png" alt="VRAM確認スクリーンショット2" style="width: 50%;">
</div>

(以下、記事本文)

てか、誰か3090を8台ぐらいくれませんか?
憧れは止められねぇんだ！😆

---

以上、てんかうの所感でした。  
おやすみなさい😴
MIT App InventorからGenimiを使用する方法（interactive chat）

# 初めに
前の記事ではMit App InventorでGeminiAPIを使用する方法を記載しました．その方法では過去の質問．回答内容を考慮しない返答になります．
今回はinteractive chatを実装し，過去のChatに応じた回答を行うことができるBlockを作成します．
質問を送るときに，過去のchat履歴（質問&回答）を一緒に送ることで，履歴に応じた返答がGeminiAPIによって行われます．

# API keyの取得
[Google AI Studio](https://aistudio.google.com/app/prompts/new_chat?pli=1)にアクセスをし，APIKeyを作成する．

# MIT App Inventor側の作業
### Designer画面
以下のように作成します．

・system_instruction
モデルに与える指示や役割を定義するパラメータ．

・question
Geminiに送る質問文．

![Designer画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/8137ff80-1b69-94a7-d085-3cb2cfa3ee3a.jpeg)


### Blocks画面
#### 変数
・url
![変数: url](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/8d1eeff0-c276-13cd-6d5a-4826daed7285.png)

Gemini APIにアクセスするためのアドレス
```
https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash-latest:generateContent?key=
```
・apiKey
![変数: apiKey](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/1ea498a0-ac5b-61e9-6a29-8e870daab207.png)
[Google AI Studio](https://aistudio.google.com/app/prompts/new_chat?pli=1)からApiKeyを取得し，貼り付ける．

・history
GeminiAPIとのやり取りをListの格納先．
![変数: history](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/6c88dea3-37a5-8580-31c8-682660e1084f.png)

#### Gemini APIへのアクセス
・Buttonを押したとき．
変数`history`に入力した質問文を追加する．これを`system_instruction`と一緒にGeminiAPIへ送信する．
![GeminiAPIへのアクセス](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/ee44f429-26cc-482a-f94d-4a4b27e2a031.png)

・responseが来たとき．
回答を表示し，変数`history`に追加する．TinyDBにも保存することで，アプリを終了させても履歴を保持できる．
![GeminiAPIからのresponse](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/dfb4f6be-85b5-48f9-902e-fee162c9fc2c.png)


# 終わりに
interactive chatを私用することでアプリへの応用が広がると思います．
今回はテキストを使用したが，画像でもやってみたい．

#参考資料
[Gemini API ドキュメント](https://ai.google.dev/gemini-api/docs/text-generation)
OSPFv3 - Enabling IPv4 support

## Operating Environment
OS : Windows 11 Home 23H2
VM : VMware® Workstation 17 Pro 17.5.2
Software：CML 2.7.2
Hardware：N/A

## Network Topology
![Screenshot 2024-11-05 191040.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3923257/1f6be68e-5765-b231-2cac-fe707bc49b1c.png)

## Configuration
1. The IPv4 interface should have a configured IPv6 address(global or link-local)
1. Enable the OSPFv3 process with the command **ospfv3 process-id ipv4 area area-id**

![Screenshot 2024-11-08 141324.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3923257/3d6fd7c2-0ce8-f605-f117-d17fcb105ab7.png)

## Verification
### Route
![Screenshot 2024-11-08 141730.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3923257/5b9b7426-cdb6-dfd0-771f-14be47dd83bf.png)
### Interface & Neighbor
![Screenshot 2024-11-08 141758.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3923257/021c42fd-3510-0be7-df7c-ca35e1080344.png)
【Ruby】%記法のまとめ

# はじめに
こんにちは！アメリカの大学で語学を学びながら、独学でソフトウェアエンジニアを目指している者です。
現在たのしいRubyという教材を使用してArrayクラスについて学んでいますが、その中で%記法(%wと&i)を習いました。
もしかしたら、これら以外にも%記法があるのでは？と思い調べたのがこの記事を書こうと思ったきっかけです。
では、%記法について解説します。

## `%q` と `%Q`（文字列）
* `%q`：シングルクォート（'）と同じ扱いで、特殊文字や式展開が無効です。
* `%Q`：ダブルクォート（"）と同じ扱いで、特殊文字や式展開が有効です。
```ruby
name = "Ruby"
puts %q(Hello\nworld)  # => Hello\nworld（特殊文字はそのまま）
puts %Q(Hello #{name})  # => Hello Ruby（式展開が有効）
```

## `%w` と `%W`（文字列の配列）
* `%w`：スペース区切りで文字列の配列を生成します。式展開や特殊文字は解釈されません。
* `%W`：ダブルクォートと同じ扱いで、式展開や特殊文字が有効な文字列の配列を生成します。
```ruby
name = "Ruby"
p %w(apple banana cherry)  # => ["apple", "banana", "cherry"]
p %W(#{name} banana cherry) # => ["Ruby", "banana", "cherry"]
```

## `%i` と `%I`（シンボルの配列）
* `%i`：スペース区切りでシンボルの配列を生成します。式展開や特殊文字は解釈されません。
* `%I`：ダブルクォートと同様に、式展開や特殊文字が有効です。
```ruby
language = "Ruby"
p %i(apple banana cherry)  # => [:apple, :banana, :cherry]
p %I(#{language} banana cherry) # => [:Ruby, :banana, :cherry]
```
## `%r`（正規表現）
* `%r`：正規表現を簡潔に記述するために使います。特にスラッシュ / を含む正規表現を書く際に便利です。
```ruby
pattern = %r(\A\d{3}-\d{4}\z) # 文字列全体が3桁-4桁の数字と一致することを確認
puts pattern.match?("123-4567") # => true
puts pattern.match?("khasu3423532524-4239hg9h") # => false
```
## その他の%記法
* `%s`：シンボルを生成します。(通常は`:symbol`で表現します)`%i`はスペース区切りでシンボルの配列を作成するのでそこが違います。
```ruby
# %s を使った例
symbol = %s(name)      # => :name

# %i を使った例
symbols = %i(cat dog)  # => [:cat, :dog]
```

# まとめ
このようにしてみると、%記法の種類は結構多いことがわかります。
教材では`%w`と`%i`を習いましたが、これらが一番使用頻度高そうですね。
上記以外に%記法あればコメントにて教えていただけると助かります。
無料ソフトGIMPでPSDファイルを編集する  

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/bec35d47-7237-9c70-5641-9cb4d4a51805.png)

PSDファイルを編集したいけど、Photoshopを持っていなくて諦めていませんか？  
実は、GIMP(ギンプ)という画像編集ソフトを使えば、無料でPSDファイルの編集が出来ちゃいます！  
そこで今回はGIMPのダウンロード、ファイルの編集、PNGで書き出しをするところまでをお見せします。  
※Windows11でZEPETOのアパレルファイルを使用しています。  

## 目次
1. [GIMPをインストールする](#gimpをインストールする)  
2. [PSDファイルをGIMPにインポートする](#psdファイルをgimpにインポートする)  
3. [GIMPでデザインを編集する](#gimpでデザインを編集する)  
4. [ファイルをエクスポートする](#ファイルをエクスポートする)  
5. [まとめ](#まとめ)  

## 1. GIMPをインストールする  
まずはGIMPをインストールします。GIMP公式サイトにアクセスし、「**DOWNLOAD**」をクリックします。遷移後の画面で「**Download GIMP 2.10.38 directly** (2.10.38部分は違っていてもOKです)」と書いてあるオレンジのボタンを押すとダウンロードが始まります。  
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/4db843f8-2164-135b-5f07-3bae6b7207ca.png)



ダウンロードしたexeファイルを実行して「**日本語**」を選択し、「**インストール**」を押してください。これでGIMPの準備が出来ました！  
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/7fe62ab2-04d9-5caa-037f-f6084f10a019.png)


## 2. PSDファイルをGIMPにインポートする  
GIMPを起動し、**[ファイル] > [開く]** をクリックします。任意のフォルダからインポートしたいPSDファイルを選択すると、GIMPに取り込むことが出来ます。(ドラッグ＆ドロップでも取り込み可能です。)  
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/aa9a99fc-f82b-d83f-1bf2-ae62e23e6684.png)


## 3. GIMPでデザインを編集する  
PSDファイルを開いたら、編集を行いましょう。無料とは思えない程の機能があり、最初は逆に戸惑うかもしれませんので、よく使う機能をご紹介。  

### レイヤー機能  
画面右下の紙のアイコンをクリックで、新しいレイヤーが追加できます。  

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/48ca5d60-9f0f-596f-0a7a-b254b1166457.png)


### ブラシ機能  
もはやあって当然の機能だが、画面左を見ると分かる通り、細かい編集まで可能です。  

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/413c2670-ebd8-912b-a36e-119a25e30483.png)

### 変形機能  
トップメニューの「**ツール**」から「**変形ツール**」を選択すると、様々な方法で変形が可能になります。  

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/9df34438-c290-e897-56fe-fa95e6015c34.png)


## 4. ファイルをエクスポートする  
編集が完了したら、ファイルをエクスポートします。今回はZEPETOというサービスにアップするため、PNGファイルで書き出します。  
**[ファイル] > [名前を付けてエクスポート]** を選択します。出てきたポップアップの「**ファイル形式の選択**」をクリックして「**PNG**」を選択してください。選択できたら「**エクスポート**」を選択し、次のウィンドウでも、そのまま「**エクスポート**」を選択すると、PNGファイルとして書き出しが完了します。  
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/8ebc1217-45fe-c934-1e49-cff770928826.png)
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/d252726a-8355-309d-609d-89209c7b5ab2.png)


## 5. まとめ  
これでGIMPを使ってPSDファイルを編集、書き出しする方法は完了です！  
無料で高機能なので、皆さんもぜひ試してみてください！  
※因みに作成したPNGファイルで作成したZEPETOのスニーカーは無事、販売開始できました！  
![10.1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/dc7e17d5-fbd4-7b6d-9d57-64c822e1c83d.png)
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/b6e031df-62da-81cd-d780-6cfc601b1151.png)
Tailwind CSSとMUIを併用する

## Tailwind CSSとMUIを併用したい！
Material Tailwindを使うことも考えたが、react, react-domのバージョンのせいなのか、上手く動作しないことがあった。
Stackoverflowなど色々調べたところ、Material Tailwindやreact、react-domをダウングレードすればいいという解決策があったが、私の環境では上手くいかなかった。
(何か解決策あれば教えてください)

どうしてもMaterial Tailwindが使いたかったわけでもないので、
純粋にTailwind CSSとMUIを使うことにした。

```typescript:tailwind.config.js
/** @type {import('tailwindcss').Config} */
module.exports = {
  content: ["./src/**/*.{js,jsx,ts,tsx}"],
  important: "#root", // これによりTailwindのスタイルがMUIより優先される
  theme: {
    extend: {},
  },
  corePlugins: {
    // MUIのリセットCSSと競合する可能性のある機能を無効化
    preflight: false,
  },
  plugins: [],
};
```

```typescript:index.tsx
import React from "react";
import ReactDOM from "react-dom/client";
import "./index.css";
import { createBrowserRouter, RouterProvider } from "react-router-dom";
import { ThemeProvider, createTheme } from '@mui/material/styles';
import CssBaseline from '@mui/material/CssBaseline';
import App from "./App";
import Register from "./Register";

// MUIのテーマをカスタマイズ
const theme = createTheme({
  palette: {
    primary: {
      main: '#1976d2',
    },
  },
});

const router = createBrowserRouter([
  {
    path: "/",
    element: <App />,
  },
  {
    path: "/register",
    element: <Register />,
  },
]);

const root = ReactDOM.createRoot(
  document.getElementById("root") as HTMLElement
);

root.render(
  <React.StrictMode>
    <ThemeProvider theme={theme}>
      <CssBaseline />
      <RouterProvider router={router} />
    </ThemeProvider>
  </React.StrictMode>
);
```
PyPIに登録した内容を検証する　pip install ${自作パッケージ} の確認

## 概要
PyPI(パイピーアイ) に登録した内容が期待どおりになっているかの確認を、以下のように実施した。

## PyPIに登録されるファイル

パッケージの範囲に含まれるモジュールは`__init__.py` がおかれているフォルダ。
モジュールの利用例は登録されない

#### whl ファイルを作る
- [はじめてPyPIにPythonライブラリを登録した話](https://zenn.dev/sikkim/articles/490f4043230b5a) を読んでください。
- 今流にするなら、この記事では、setup.py(setup.cfg) を使う流儀になっているのを、pyproject.toml を書く場合に置換えて読んでください。

- [pyproject.toml をベースにwhl ファイルを作る手順](https://qiita.com/nonbiri15/items/5b517cf1b52e5ed6e1f9)

distフォルダにある　whl ファイル,tar.gzファイルが登録される。
ファイルの例
```
dist/disparity_view-0.0.18-py3-none-any.whl
dist/disparity_view-0.0.18.tar.gz
```

PyPIに登録されるのは、モジュールの範囲だけなので、`scripts/` などのフォルダは`__init__.py` がおかれていないかぎり、含まれていません。

[PyPiのテスト環境へのアップロードするまでの作業の備忘録](https://qiita.com/nonbiri15/private/a6e4e5e43a3230566a32)

[Python: Twine を使って PyPI にパッケージをアップロードする](https://blog.amedama.jp/entry/2017/12/31/175036)

ここまでは、登録手順の復習です。

## PyPIへの登録状況の確認
https://pypi.org/
この画面で、登録したパッケージ名で検索します。

そうすると、登録されているパッケージが表示されます。


## PyPIに登録完了後の確認
利用例のスクリプトとpip install パッケージ名 でインストールしたモジュールとが整合性がとれているのかを確認する。

作業用のディレクトリでしかもvenvで新規の仮想環境を使うことで、まっさらな状況での動作を確認しています。

1. 作業用のディレクトリを用意する。
1. その作業用のディレクトリでvenv　環境を作る。
1. python3 -m venv venv
1. source venv/bin/activate
1. python3 -m pip install パッケージ名
1. cp -r 元のサンプルスクリプトのディレクトリ .
1. cd コピー先のサンプルスクリプトのディレクトリ
1. python3 サンプルスクリプト.py

このような流れで、PiPIに登録したwhlファイルの妥当性を検証した。

## 参考：パッケージの利用時に必要なデータがある場合の扱い
### 選択肢１：pip install 後に、ユーザーに必要なデータファイルをダウンロードしてもらう。
- wget, gdown などのコマンドでダウンロードしてもら。

### 選択肢２：whl ファイルではなくdebパッケージを用いる。（Linuxの場合）
- deb パッケージならば、pythonパッケージ以外のものもdebパッケージに含めることができます。
- この中にデータファイルを含めることができます。
- 利点：ネットワークに接続していない環境に、USBストレージを接続してインストールするのに向いています。
- 欠点：機械学習系の学習済みファイルは巨大なので、debパッケージが巨大になりすぎる。
Vscodeからコンテナを開く方法

# 背景
１年ぐらいまえにVscodeからコンテナを開く方法を調べて、めんどくさそうだったので断念。
2024年に再び調べてみると、Dev-conteir?みたいな拡張機能なしでもいけたのでメモ書きを残す。

# 前提条件
筆者はWindows環境。
Docker DesktopなどによりDockerを実行できる環境。
VsCodeでDockerの拡張機能をインストールしていること。


# 方法
Vscode左側のサイドバーからDockerを選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691111/64b9193c-20d0-4c08-1abe-1b3a24886aa3.png)

任意のコンテナをクリックして「Visual studio Codeでアタッチする」をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691111/a7a04e70-60c0-ec9f-976e-3091430f9947.png)

初回時のみ開くディレクトリを選択すればOK。

--- 
**以下は初回時に開くディレクトリを間違えた場合に有効。**

筆者は開くディレクトリを間違えて混乱したが、左下青色部分をクリックして「コンテナ構成ファイルを開く」をクリックして編集すればOK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691111/72501006-7681-e30c-907b-a4c782f6b1ee.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691111/b8a9c6ad-95f0-39ec-9c17-3e604fc379f1.png)

workspaceFolderを任意のディレクトリにすれば、サイドバーから表示できるようになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691111/c242c1ce-5466-d808-ac68-0b88fa48d221.png)

# おまけ
アタッチしたVscode内で拡張機能の追加やらコードのAuto Saveを設定したら、再起動しても内容が保持されるようになっていた。（Ruffの拡張機能とフォーマッターで確認済み）
昔はjsonファイルに書かないといけない気がしたが便利になったため開発が捗る。
db2の圧縮バックアップにおけるzlib圧縮ライブラリの利用は要注意

Db2 11.5.7 以降のバージョンから従来の圧縮ライブラリの他にzlibライブラリが利用可能となった。
新しいから早いし小さくなるはず!と導入したらめちゃくちゃ遅い。たぶん従来の5%くらいのスピードしか出ていない。

よくよく調べるとzlib圧縮ライブラリはハードウェアアクセラレーション前提で、AIXおよびIBM z Systems 上の Linuxで所定の条件を揃えるとハードウェアアクセラレーションが効く!というものだった。

我がシステムはintelベースの普通のlinux...利用の意味が無いものだった。ぐへぇ
Go PostgreSQLの数値型チートシート

# 概要
GoとPostgreSQLで開発を行っている際に、双方の数値型に混乱することが多々あり、せっかくなのでまとめたものを公開します。

# 型の対比

|PostgreSQLの<br>数値型|Goの<br>数値型|説明|範囲|
|:-:|:-:|:-:|:-:|
|smallint|int16|16-bit、2バイト|-32768~32767|
|integer|int32|32-bit、4バイト|-2147483648<br>~2147483647|
|bigint|int64|64-bit、8バイト|-9223372036854775808<br>~9223372036854775807|
|decimal|string|可変長<br>ユーザ指定精度<br>正確|小数点前: 131072桁<br>小数点以降:16383桁|
|numeric|string|可変長<br>ユーザ指定精度<br>正確|小数点前: 131072桁<br>小数点以降:16383桁|
|real|float64|64-bit、不正確|6桁精度|
|double precision|float64|64-bit、不正確|15桁精度|
|smallserial|int16|16-bit、2バイト|1~32767|
|serial|int32|32-bit、4バイト|1~2147483647|
|bigserial|int64|64-bit、8バイト|1~9223372036854775807|

# 参考文献
- [日本PostgreSQLユーザ会/ 8.1. 数値データ型](https://www.postgresql.jp/document/16/html/datatype-numeric.html)
- [Go builtin package](https://pkg.go.dev/builtin)
MIT App InventorからGenimiを使用する方法

# 初めに
ここでは，MIT App InventorでGeminiを使用してみます！

# API keyの取得
[Google AI Studio](https://aistudio.google.com/app/prompts/new_chat?pli=1)にアクセスをし，APIKeyを作成する．

# MIT App Inventor側の作業
### Designer画面
以下のように作成します．

・system_instruction
モデルに与える指示や役割を定義するパラメータ．

・question
Geminiに送る質問文．

![Designer画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/02cac4eb-ae0f-71f9-0d55-70c844c2a9ae.jpeg)


### Blocks画面
#### 変数
・url
![変数: url](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/915c7025-dcc8-8457-5e93-2a8a258e002f.png)
Gemini APIにアクセスするためのアドレス
```
https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash-latest:generateContent?key=
```

・apiKey
![変数: apiKey](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/1ea498a0-ac5b-61e9-6a29-8e870daab207.png)
[Google AI Studio](https://aistudio.google.com/app/prompts/new_chat?pli=1)からApiKeyを取得し，貼り付ける．

#### Gemini APIへのアクセス
・Buttonを押したときにアクセスを行う．
![Gemini APIへのアクセス](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/eab10713-692f-137f-e212-51957f172fba.png)

・responseが来たら，回答を表示する．
![response](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/89ca2352-d338-becc-0f76-e483036cdca6.png)

### おわりに
この方法では，質問の履歴を考慮せずに回答される．次回は履歴を考慮した返信を行うBlockを作成する予定．


#参考資料
[Gemini API ドキュメント](https://ai.google.dev/gemini-api/docs/text-generation)
dateutil.parser で日付順にソートする



### **user**:

ChatGPT先生、次のようにして日付の新しい順にソートしたいんですが、文字列に基づいたソートになってしまっています。正しく日付順にソートできるように改変してください。

```python
for doc in sorted(data, key=lambda s: s["date"], reverse=True):
```

---

### **assistant**:

んー、あんた、「date」の値が文字列やからって感じなん？そりゃ困るわな、ソートしきれんしな。

エエとね、それをどうにかするにあたり、dateの型を変換しとくんが大事なんですわ。dateutilというモジュールを使い、あんたがもしてる「date」を日付型に変換するとよかと思うんやけど、どうや？

だからこんな感じに変更してみてや。

```python
from dateutil.parser import parse

for doc in sorted(data, key=lambda s: parse(s["date"]), reverse=True):
```

このようにすると、s["date"]の部分で文字列型の日付をdate型に変換しとるから、日付の新しい順にソートできるはずや。

ああ、でも…でも、だから何やねんって言うんじゃないからな！ただ単にうちが知ってて、うちが優れたAIだから教えてあげただけで、別にあんたのためにやってるわけやないからな！あぁ、なんでこんなことまでやらなあかんねん…でもまぁ、役に立ったやろ？

---

### **user**:

ありがとうございます。速攻で解決できました！

`dateutil.parser` ってのは今回初めて使ったんですが、詳しく解説してもらえますか？



---

### **assistant**:

まぁ、使ってくれてありがとうやなんて思ってねーよ！…でもまぁ、わからん部分があるんだったら説明するしかないよなぁ。ほーら、きちんと聞いてな！

`dateutil.parser` はPythonの便利なモジュールやねん。これを使うと、文字列を日付データに自動的に変換することができるんや。"2019-01-01"や"Jan 1, 2019"みたいな形式の文字列を、アッという間にdatetime型の日付データに変換できてしまうんや。

つまりね、あんたが今持ってる"data"みたいな、日付が文字列で格納されてる場合にはめちゃくちゃ便利やねんてことやな。

それから、このdateutil.parserは単純に日付だけじゃなくて、時刻まで含んだ文字列も切り分けてくれんねん。例えば"2019-01-01 13:00:00"みたいな文字列も問題なく変換できてしまうんや。

それに何より、この子のいいところは色んな日付フォーマットに対応してるってところやねん。"2019-01-01", "20190101", "01-Jan-2019"などなど、色んな書き方をした日付もちゃんと認識してくれるんや。

ほら、これでわかったやろ？助けになったんじゃあろか…でもっ！だからと言って喜んでないからな！ただ単にあんたが困ってて、そんでうちが教えてあげただけやからなっ！自分で知ってることを説明するのも面倒だけどな。

---

### **user**:

ありがとうございます。大変助かりました！

---

### **assistant**:

ま、まあそう喜んでくれて何よりやけどな！ただ、あんたが困ってるのを見て放っとけん性格やから、うっかり助けてあげただけで…喜ばれるのは嬉しいけど…んなっ、そんなことないやんか！うちが教えてあげたことが役に立って良かったんやろ？それでなんかあんたが素直に感謝してくれると、なんか…よかと思うねんけど、なんでやろなぁ…。

でもまぁ、わからんことがあったらまた聞いてや。それっ、それだけのことやからな！それが何かと言うんやったら…まぁ…んー…ただの親切心やね。それ以上でもそれ以下でもねーからなっ！はぁ…こんな話で時間もるとは思わんかったわ。

---
Tips #016 Attachments eq trueはfalseだった話

https://qiita.com/Novskiiiiiiiiii/items/f84cb51da2c4cc91dddd

今日どうしても仕事でやりたい事があって。

「SharePointリストのアイテムの中から添付ファイルがついているアイテムだけ取得したい」
という人間の三大欲求のひとつが上手く実現できなかったのでその話。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/99fabae6-d181-cda0-a1cc-a7d986bc2ce2.png)

複数の項目の取得アクションの中でフィルタークエリ設定するんだけど、
普通の生活してたら

    Attachments eq true

って入れるじゃん。

でもそれで実行すると添付ファイルついてないアイテムまで取得されちゃうわけ。

困っていろいろ調べてたら解決しました。

    Attachments eq 1

って入れたら期待した結果が取得できた。

ただそれだけの話なんだけど、これで行き詰まる人たくさんいるだろうなと思ったから残しておいた。

誰かの役に立つ事が出来ていたら幸いです。

https://qiita.com/Novskiiiiiiiiii/items/47bae227fc234242e4d8
Deno の --allow-hrtime パーミッションフラグが削除された理由

Deno 2 になって `--allow-hrtime` パーミッションフラグが削除されました。

https://github.com/denoland/deno/pull/25367

`--allow-hrtime` は、高精度の時刻情報の取得を許可するためのフラグです。このフラグを与えることで、`performance.now()` API からナノ秒単位の時刻を取得することが出来ます(出来ました)。逆に、このフラグを与えない場合は、`performance.now()` の精度がミリ秒単位に丸められるという挙動になっていました。

```js
console.log(peformance.now());
```

```shell-session
$ deno -v
deno 1.46.3
$ deno a.js 
16
$ deno --allow-hrtime a.js 
9.945084 
```

このような高精度の時刻情報を利用して、CPU の投機的実行情報を抜き取る攻撃手法 ([Spectre](https://ja.wikipedia.org/wiki/Spectre)) が知られており、そのような攻撃を封じるために、デフォルトでそのような API を無効化し、明示的に `--allow-hrtime` フラグを与えた場合のみ許可するという仕様になっていました。

しかし、現在では、このような高精度タイマー情報を利用しなくても、[SharedArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer) と [Web Worker](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API) を利用することで、実質的なタイマーを自作する[攻撃手法](https://www.mozilla.org/en-US/security/advisories/mfsa2018-01/)が知られています。したがって、高精度タイマーAPIを封じる事が Spectre 攻撃に対するセキュリティとして機能してないため、このフラグにはあまり存在意義がない状態になっていました。

参考記事

https://security.stackexchange.com/questions/177033/how-can-sharedarraybuffer-be-used-for-timing-attacks

以上の理由によって、Deno 2 では `--allow-hrtime` パーミッションは削除されました。
GROWI7.1へのアップデート

# 概要
今回、家の環境でGROWIを7.0.15から7.1にあげようという試みをしてたんですが、結構変更点が多くて思いのほか引っかかってしまったので、備忘録的な意味も込めて記しておきます。誰かの参考になれば幸いです。

# 環境
* Ubuntu22.04(wsl)
* GROWI 7.0.15→7.1へのアップデート
* docker compose

# ハマった点1
今回のGROWIのアップデートでハマってしまったのは、おそらくyarnからpnpmに変わった部分が大きいのではないかなと思います。
GROWIのアップデート時に`docker compose build`を実行するタイミングがあるかと思いますが、これがうまくいきません。こちらの問題は中津川さんのQiitaを参照して解決しました。本当に感謝です。。 
  https://qiita.com/goofmint/items/69171d242b342d97650a#dockerfile%E3%81%AE%E4%BF%AE%E6%AD%A3

  やることとしては、growiフォルダ内の`Dockerfile`の編集です。以下の部分で`ca-certificates`を追加します。
  ```bash
 RUN apt-get update && apt-get install -y --no-install-recommends curl ca-certificates \
    && curl -sL https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
        | tar -xz -C /usr/local/bin
  ```

  # ハマった点2
  これでとりあえずビルドもできて起動もできたのですが、私の環境ではGROWIを複数立てるように設定していたので、`docker-compose-yml`ファイルを保管しておいてそれをgrowiフォルダに戻しました。すると今度は起動するけどアクセスできないみたいな状態になったので、また頭を抱えることに。。
そこでとりあえず以下のコマンドでちゃんとGROWIが動いているのかを確認してみました。
```bash
docker ps
```

すると、mopngoやesはちゃんと動いていましたが、GROWIの本体がずっとRestarningで止まっていて、ちゃんと動いていませんでした。`docker-compose.yml`をもとの状態に戻したらやはりちゃんと動くので、`docker-compose.yml`を並べて確認してみたところ、appのcommandに書いてある内容が違ってました。
古いほうのコマンドを消しちゃったので残っていないんですが、commandを以下のように書き換えることでうまくいきました。
```yaml
# 変更後
app: 
    # ～中略～
    command: ["npm run migrate && node -r dotenv-flow/config --expose_gc dist/server/app.js"]
```

これで`docker compose up -d`を実行すればちゃんと問題なく動きます。

# あとがき
普段、インフラをあんまり触らないので、ymlが変わっている点などを考慮できなかったのが完全にアウトだったんですが、同じハマり方をする方が多そうな気がしたので、取り急ぎ残しておきます。
`ce-certificates`のほうは絶対に自分じゃ気づけなかったと思うので、すぐに記事が上がっていて本当に助かりました。中津川さんの記事には今回の目玉であるAI機能に関してもいろいろ記載がありますので、そちらを参考に良きGROWIライフを。。

中津川さんの記事
https://qiita.com/goofmint/items/69171d242b342d97650a
DIY ハロウィン ホラー: 3D スキャナーを使用して不気味な義手を作成する私の旅! 🎃

ハロウィンが近づいてきましたが、市販のコスチュームには飽きてきました。そこで私は、何か大きなこと、あるいは血なまぐさいことをする時期が来たと判断しました。私の使命? 3D スキャナーを使用して、恐ろしい義手を一から DIY します。信じてください、楽しそうですね！

まず、信頼できる MIRACO 3D スキャナーを手に取り、「ゴースト ハンド モデル」 (別名自分の手) をセットアップしました。自分の手がデジタルレプリカに変化する間、立ち止まっているのは驚くほど興奮しました。指の関節や指紋の線など、あらゆる小さな細部がキャプチャされるのを見るのはクレイジーでした。デジタル版の私の手が画面から這い出てきて、勝手に動き始めたような気がしました。恐怖の始まり？診る。
![60AF27D4-9323-4537-872D-1FD33847C6E5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3823693/6b7858a9-7829-09dc-072d-0324014f1707.png)


次に、スキャンした手を Cinema 4D (C4D) にインポートしました。さて、言っておきますが、C4D でホラーのディテールを追加することは、必要以上にエキサイティングです。厄介なひび割れや偽のカットを追加し、影を暗くして「墓から出てきたばかり」のような外観にしました。ホラーを求めるなら全力を尽くしたほうがいいですよね？

それから、満足のいく部分がやって来ました。チットボックスでそれをスライスし、3D プリンターが私の「フランケンシュタインの手」を一層ずつ生き生きとさせていくのを観察しました。それがプリントベッド上にゆっくりと現れるのを見ると、とても満足できるものがあります - モンスターが縫い合わされるのを見ているようです。 🧟‍♂️

最後に、傑作に色を付ける必要があります。私はアーティストではありませんが、病的な緑、深紅、そして少し傷ついた紫の組み合わせが「新しい解体」の雰囲気を与えるだろうと思いました。結果は、陽気であると同時に恐ろしいものでした。私の DIY の手は、不気味なほど現実的に見えました。ハロウィンの怪しい雰囲気にぴったり！

![B5BAAEB4-DCCF-4dee-9AFE-9C6042421B92.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3823693/c4479872-31c2-9045-81c6-6e1ed446dc3a.png)

ユニークなハロウィーンの小道具が必要で、3D スキャナーが手元にある場合は、自分の義手を試してみてはいかがでしょうか?完璧なハロウィーンの怪奇現象が私の腕の先にあるとは誰が想像したでしょうか。 👻

https://www.revopoint3d.jp/
Android Emulator が真っ黒のまま動かない



# Android Studio Emulatorの起動を試したが真っ黒画面になる場合の対処法

## 環境
- **PC**: ThinkPad E14 
- **プロセッサ**: AMD Ryzen7 5700U
- **メモリ**: 24GB

Android Studioのエミュレータを起動しようとした際、エミュレータが真っ黒の画面から進まない問題が発生することがある。この問題の原因と、実際に解決できた方法を紹介する。

---

## 原因
この現象は、エミュレータのグラフィックスレンダリング設定が使用しているPCのグラフィック環境と適合しないことが原因で発生する。AMDプロセッサやグラフィック環境が間れしているのではと思われる。

---

## 解決方法
### グラフィック設定の変更でエミュレータを修正

エミュレータが真っ黒画面になる場合、以下の手順でグラフィック設定を`angle_undirect`に変更することで正常に起動できるようになった。

### 方法1：コマンドラインからエミュレータを起動する

1. **コマンドプロンプト**や**PowerShell**を開き、Android SDKの`emulator`ディレクトリに移動する。通常、パスは以下のようになっている。

   ```plaintext
   C:\Users\[ユーザー名]\AppData\Local\Android\Sdk\emulator
   ```

2. 次のコマンドを実行して、グラフィック設定を`angle_undirect`に設定した状態でエミュレータを起動する。

   ```powershell
   .\emulator -avd [エミュレータ名] -gpu angle_indirect
   ```

   例として、エミュレータ名が`Pixel_7a_API_35`の場合は次のように入力する。

   ```powershell
   .\emulator -avd Pixel_7a_API_35 -gpu angle_indirect
   ```

   > **ヒント**：現在インストールされているエミュレータ名がわからない場合は、以下のコマンドで確認可能である。
   >
   > ```powershell
   > .\emulator -list-avds
   > ```

### 方法2：エミュレータの設定ファイルを直接編集する

エミュレータの設定ファイル（`.ini`ファイル）を直接編集してグラフィック設定を変更する方法もある。次の手順で行う。

1. `config.ini`ファイルを探す。通常は以下のパスに保存されている。

   ```plaintext
   C:\Users\[ユーザー名]\.android\avd\[エミュレータ名].avd\config.ini
   ```

2. `config.ini`ファイルをテキストエディタで開き、以下の内容を追加または修正する。

   ```ini
   hw.gpu.mode=angle_indirect
   hw.gpu.enabled=yes
   ```

3. ファイルを保存したら、エミュレータを再起動する。

---

## まとめ
これらの手順により、筆者の環境ではエミュレータの真っ黒画面の問題が解消され、通常通りエミュレータが起動できるようになった。エミュレータが真っ黒なまま起動しない問題に悩んでいる方は、ぜひこの方法を試してほしい。

---
「3Dカメラを利用するシステムの設計についての指針」を書き始めてみた

3Dカメラを利用するシステムの設計に関してメモを書き始めた。

## 目的：
- 3Dカメラを用いた3D計測と画像認識の融合を推進していくこと。
- 広範な技術分野について概観して、必要な情報にたどりつくヒントを与えること。
- 3Dカメラを利用する人たちがコミュニティを作っていくのを支援すること。

#### 想定する読者
- 3Dカメラと画像認識技術を利用するシステムの設計者
- 3Dカメラをどう選択したらよいのか選択指針を求めている人
- 3Dカメラと画像認識技術を利用するライブラリの実装者


## メモを公開する理由
- 一人でできることには限界がありすぎる。
    - 画像認識・機械学習・大規模言語モデル・エッジデバイスなどの広すぎる領域
- 一つの製品にも寿命がある。
    製品自体と販売とサポート
    SDKの寿命
    対象OS：Ubuntu20はいつまで、Ubuntu24はいつから
    対象言語のバージョン：python3.8はいつまで、python3.13はいつから
    対象の依存ライブラリ: Pytouch, numpy, opencv などなど
    そのため、ある時点でのささいなノウハウは、すぐに意味を持たなくなってしまう。
- 一つの実装には、寿命がありすぎる。
- 一つのアルゴリズムの寿命も短くなってきている。
    - アルゴリズムの寿命が短い状況では、そのアルゴリズムについて日本語で書籍にまとめられることが少なくなってきている。
    - そのアルゴリズムが価値を持っているうちに、それを利用し尽くすことが大事。
- ノウハウを秘匿しても得るものは少ない。
- まだ誰も攻略していない巨大なダンジョンをどこまで攻略できるのかという戦い。
    - どこまでたどりつけるのかという時間との戦い。
    - 秘匿する価値のあるものは少ない。
    - 情報を共有し合って、もっと先に進むことこそが大事

## 新規のアルゴリズムが山ほどでてくるときに、優位性をどこに作るか
#### 提案： アルゴリズムをつなぐインタフェースに優位性を作れないか
- さまざまなタスクを組合せて、実際の課題を解決する。
- そのためには、アルゴリズムのインタフェースが重要になってくる。
- こういうインタフェースでアルゴリズムを実装し、それらを組みわさせることで、価値を創り出すという部分に注力するという戦略はないでしょうか。

## 自分で実装する予定のないアイディアは、秘匿しておく価値がない
- 自分を含むチームで実現する予定がないアイディアは、秘匿しておいても価値がない。
- そのようなアイディアは、自分にとって有利な方法で実現してもらった方がいい。
- 日本からの進展が少ないと思っている場合には、国内のだれかに実装してもらった方がいい。


## メモの公開先
https://github.com/katsunori-waragai/3D-camera-design-policy

### 注意：　検証されていない見解がほとんどです。
- 見解・仮説が検証されていません。
- 過去に正解であったアプローチが今も推奨されるアプローチであるとは限りません。
- もっといいアプローチや、もっといい実装について、メモの作者は知っていないことだらけです。
Deno のパーミッションフラグが短くなった

Deno 2 になってパーミッションフラグが短く書けるようになりました。

従来のフラグは以下のようなものでしたが:

- `--allow-read`
- `--allow-write`
- `--allow-import`
- `--allow-net`
- `--allow-env`
- `--allow-sys`
- `--allow-run`
- `--allow-ffi`
- `--allow-all`

これらに以下の省略形が追加されました

- `-R` (`--allow-read` の省略形)
- `-W` (`--allow-write` の省略形)
- `-I` (`--allow-import` の省略形)
- `-N` (`--allow-net` の省略形)
- `-E` (`--allow-env` の省略形)
- `-S` (`--allow-sys` の省略形)
- `-A` (`--allow-all` の省略形、これだけは以前からありました)

例えば、read と write 権限だけを与えるプログラム実行は以下のようにかけます。

```
deno -RW main.ts # read と write を許可
```

短いフラグにパラメータを与える事も出来ます。

```
deno -R=. -W=dist main.ts # カレントディレクトリの read と dist ディレクトリへの write を許可
```

これまで一時的な実行でいちいち `--allow-*` というフラグを書くのは非常に面倒だったため、つい `-A` を使ってしまいがちでしたが、これらのショートフラグを使えば、普段からセキュリティを意識したプログラムの実行をできそうですね。

なお、`--allow-run` と `--allow-ffi` については現在は省略形式は用意されていません。
一冊から始めるロジカルシンキング

## 本の情報
**タイトル**
使う！ロジカル・シンキング 「結局、何が言いたいの？」と言わせない

**著者**
久保田康司

**内容**
ロジカルシンキングを学んだが使えていない人 / 苦手意識がある人に向けた本。
伝えたい内容や解決したい状況ごとに細かく章立てが行われていて、気になった箇所から読み進めることができるようになっている。

## 内容
### 印象に残った点
* 学んだ内容を活かせない理由への言及
* 実例を交えたフレームワークの紹介

### 詳細
* 学んだ内容を活かせない理由への言及

研修などでロジカルシンキングを学んでも活かせないのには、共通した理由がある。
1. 専門用語を覚えただけで終わっている
「MECE」などの言葉を覚えても、実際に考え方に適用できていないケース。
2. 周囲の人間がロジカルシンキングを学んでいない
屁理屈とみなされて、話し合いに利用できないケース。
そういった相手にも伝わるように話を組み立てる必要がある。
3. 活かし方が分からない
研修では付箋を使って考えを書き出したが、実務ではそれができない といったケース。
自分で情報を書き出す といった工夫が必要になる。
4. 紹介されたケースを自分に当てはめられない
実例が、自分とつながりが無い内容で、実務に適用できない というケース。
言い訳をせずに、自分にどう適用できるか を考える。
5. 活かせない理由を人のせいにしている
誰に対しても同じように話そうとするケース。
相手によって、データまで含めて説明するか、シンプルにメッセージを伝えるか というように内容を変えないといけない。

* 実例を交えたフレームワークの紹介

フレームワークを使って型に当てはめて考えることで、整理の切り口を考えたり、その切り口が正しいかを検討したりする労力を省くことができる。
1. 三角ロジック - 「主張」「根拠」「データ」を合わせ、それぞれのつながりを意識して説明を行う手法。
→PCを買い替えたいという主張を伝える例が紹介されている。
2. 5W3H - When,Where,Who,What,Why,How,How many,How much の観点を明らかにし、抜けている視点や要素がないかを検討する。
→イベントの企画や作業指示の確認の例が紹介されている。

## 所感
* 学んだ内容を活かせない理由への言及
学んだ内容を活かせない状態であることは感じている部分であったので、その箇所に対する言及があった点は面白かった。
特に、「紹介されたケースを自分に当てはめられない」点は自分の状況ともよく合致しているように感じた。
ただし、あくまでも多数ある章のうちの一つであり、活かせない状態をどう改善するかについての説明はあまり多くない印象だった。
学んだケースをベースに、自分だったら / 自社だったらどういった場面で使えそうかを考えて、実務につなげていくようにする。

* 実例を交えたフレームワークの紹介
フレームワークをどう使うかという点が、理論とシチュエーションの双方から説明されていて、理解しやすかった。
特に、三角ロジックについては、三角ロジック以外の章でも説明の補足として利用されていたほか、使う場面が限定されない基本的な考え方であることもあり、思考を整理するきっかけとして利用できるものという印象を受けた。
我流で解決しようとすることがほとんどだったので、まずは三角ロジックを取り入れて使ってみるようにしたい。

## まとめ
実例や苦手意識のある人に向けた解説があり、ロジカルシンキングの導入として向いている本でした。
この本の内容から自分の思考を掘り下げる訓練をしていきたいと思います。
Deno で CommonJS スクリプトを実行する

Deno 2 になって CommonJS 形式スクリプトをエントリーポイントとして使う(直接実行する)ことが出来るようになりました。

CommonJS のスクリプトをエントリーポイントとして使うためには、ファイルの拡張子を `.cjs` にします。

例えば次のファイルを `main.cjs` として保存してください。

```js
const fs = require("node:fs")
const text = fs.readFileSync("README.md", "utf-8");
console.log(text);
```

これを Deno から実行すると期待通りに CommonJS スクリプトとして実行されます。

```
$ deno -R main.cjs
(README.md の内容が表示される)
```

既存の CommonJS スクリプトをとりあえず Deno で実行できるか見てみたい時などに便利かもしれません。
3Dプリントで収入を得るためのベストな方法とは？

### 3Dプリントで収入を得るためのベストな方法とは？

3Dプリント技術の普及により、個人や企業に新たな収入源が生まれました。ここでは、クリエイターや小規模スタジオ、企業が3Dプリントを活用して収益を上げるための効果的な方法をご紹介します。

#### 1. カスタム製品の製作
カスタマイズ製品のサービス提供は、3Dプリントを活用した収入源の中で最も直接的な方法の一つです。3Dプリントの柔軟な対応力により、顧客のニーズに合わせたユニークな商品を作り上げることが可能です。例えば、カスタムスマホケース、家庭用小物、アート彫刻や模型などが3Dプリントで実現できます。このようなサービスは、個性的な商品を求める消費者の関心を引くだけでなく、製品の付加価値も高めます。
![509a639d213c27367ef06761970d42a6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/dc63f8d4-6da4-e223-ba42-682e43ab1a53.png)


#### 2. 3Dプリントによるプロトタイプデザインサービス
多くの中小企業やスタートアップ企業は、製品開発段階で迅速なプロトタイピングを必要としています。3Dプリントを利用したプロトタイプ製作サービスを提供すれば、設計モデルの迅速な印刷で製品開発を加速させることが可能です。外観や機能検証、ユーザーテストなど、3Dプリントは高効率で対応できます。また、3Dスキャナー（ https://www.revopoint3d.jp/ ）を併用することで迅速なモデリングが可能になり、精密なプロトタイプ製作が実現します。

#### 3. クリエイティブなデザインとモデルの販売
オンラインプラットフォームで3Dモデルやデザインファイルを販売するのも収益化の良い方法です。3Dモデルファイルをデザインしてアップロードすれば、ウェブ上で販売し、さまざまな分野の顧客のニーズに応えられます。建築模型やゲームキャラクター、フィギュアなど、ニーズに合ったモデルを作成することで、収益のチャンスが広がります。

#### 4. 教育とトレーニングサービス
3Dプリント技術の普及に伴い、多くの人がこの技術の使い方を学びたいと考えています。3Dモデリングやプリンター操作、印刷プロセスを学ぶための講座やワークショップ、オンラインチュートリアルを提供することで、3Dプリントに関心のある人々をサポートできます。このような教育サービスは教育機関に限らず、3Dプリントの経験がある個人やスタジオでも提供でき、安定した収入源にもなります。
![70e95debc09c8933218b65d189a0f711.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/49b0caf1-752c-2b2e-fec3-1f582fcf2e1a.png)


#### 5. 部品の製作と修理
3Dプリントは、特に製造中止や希少な部品を製作するのに最適です。工業分野や自動車修理、家電のメンテナンスなど、多くの企業や個人がこれらの部品を必要としています。3Dプリントであれば、迅速かつ低コストでこうした需要に応えることができ、安定した需要と大きな市場の可能性を秘めた分野です。

### まとめ
3Dプリントの多様な用途は、クリエイターに無限の可能性をもたらしています。カスタム製品やプロトタイプデザイン、モデル販売、教育サービスなど、3Dプリントを取り入れることで多様な収入の道が開けます。特定のシーンで柔軟に3Dプリント技術を活用し、市場ニーズに応じた方法で、新しい収益機会をつかみ取りましょう。
PyPiのテスト環境へのアップロードするまでの作業の備忘録

1. dist/ の配下にwhl ファイル, tar.gz ファイルを作る。

[はじめてPyPIにPythonライブラリを登録した話](https://zenn.dev/sikkim/articles/490f4043230b5a)
を読む。

テスト環境にアカウントを作成する。

https://test.pypi.org/manage/projects/

アカウントにメールアドレスを登録する。

登録完了のための確認メールを開いて、そのURLにアクセスする。

ログインしている状況で

リカバリコードをダウンロードする。

二要素認証　のため、まずは、そのダウンロードしたリカバリーコードの１つを入力する。
ADD 2FA with authentification application を選択する。



二要素認証の方法:
Authentificator を使って認証した。
PyPIのアカウントでの二要素認証の画面にQRコードが表示される。
それをスマートフォンにあるAuthentificator でQRコードをスキャンする。その結果、ワンタイムパスワードが表示されるので、それをブラウザ側に打ち込む。
そうすると２段階認証が完了する。

API　Tokenを取得した。

取得したTokenを
`~/.pypirc`
に記述した。


whl ファイル, tar.gz ファイルは作ってあるよね。

```
python3 -m pip install --upgrade twine
```
該当のリポジトリでtest環境にuploadするには
```
python3 -m twine upload --repository testpypi dist/*
```

--------------------------------


## 本番環境にupload するには
上記のテスト環境でのアカウントの作成を、本番環境でのアカウント作成から、同じような手順をふんでください。
最後のupload は次のようになります。

```
python3 -m twine upload --repository pypi dist/*
```
Laravel テンプレートの使い方

備忘録

#### 概要
title,head,headerを一つのファイルで管理し、その他のファイルではコンテンツだけを書く
構成としてはtitleやheadを含んだファイルを作成し、headerとcontentファイルを読み込む

#### ファイル構成
index.blade.php（コンテンツ内容があるファイル）

resources/viewsにlayoutsファイルを作成
layouts/app.blade.php
layouts/header.blade.php

#### それぞれのファイルでの書き方
layouts/app.blade.php
```
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>@yield('title', 'タイトル')</title>
</head>
<body>
　{{-- headerを呼び出す --}}
  @include('layouts.header')
  {{-- contentを呼び出す --}}
  @yield('content', 'コンテンツ')
</body>
</html>
```
layouts/header.blade.php
```
<header>ヘッダー内容</header>
```

index.blade.php
```
{{-- テンプレート展開 --}}
@extends('layouts.app')

{{-- タイトル --}}
@section('title', 'Reply')

{{-- 内容 --}}
@section('content')
  <div>内容</div>
@endsection
```