OmniAICreator/Qiita-1.07M huggingface dataset:
BigQueryで配列(ARRAY),構造体(STRUCT)を含むテーブルを作成(CREATE)/データ挿入(INSERT)する方法

# 概要
BigQueryでつまづきやすい、ARRAYやSTRUCT。これらのデータにアクセスする方法は比較的記事が散見されるもののテーブル作成やデータ挿入方法については以外と記事が少ないので、自分のためにもまとめておく。

## テーブル作成(CREATE)

```sql
CREATE TABLE `test_dataset.test_table` --作成するテーブルを指定
 (
    t TIMESTAMP, --通常のカラム
    a ARRAY<INT64>, --ARRAY型
    s STRUCT<v1 INT64,v2 STRING>, --STRUCT型
    key_value_array ARRAY<STRUCT<key STRING,int_value INT64, float_value FLOAT64, string_value STRING>> --ARRAY<STRUCT>型,
 )
```

配列型は、```ARRAY<変数型>```
構造体型は、```STRUCT<列1 変数型,列2 変数型,…>```
構造体の配列型はそれらを組み合わせて ```ARRAY<STRUCT<列1 変数型,列2 変数型,…>>```
と指定すれば良い。


## テータ挿入(INSERT INTO)

```sql
INSERT INTO `test_dataset.test_table`  
select
    CURRENT_TIMESTAMP() as t,
    [1,2,3,4] as a,
    struct(123,'test') as s,
    [struct('p1',123,CAST(null as FLOAT64),CAST(null as STRING)),struct('p2',CAST(null as INT64),11.1,'hoge')] as params,
```

配列型は ```[a,b,c,d]```のようにブラケット(大括弧)[]で囲む
構造体型は ```struct(a,b)``` のようにstruct+カッコ()で囲む
構造体の配列型はそれらを組み合わせて ```[struct(a,b,c),struct(d,e,f),…]``` のように記載すれば良い。
なお、構造体要素にnull値を投入する時はINT64型以外の場合はnull値自体の型をcastしないとエラーが出る点は要注意。
エンジニア特化部門の管理職が考えるプログラミング教育　段階的に実装・検証を繰り返す

前の投稿で、下記を実装するという例を出しました。ある程度、ブレークダウンしているので、全部実装できるエンジニアの方も多々いるでしょう。

1.テキストファイルの読込
2.入力データを取り出す
3.素数かどうかを判定する
4.出力する

一方で、全部実装しようとして、はまって完成に至らないエンジニアもいると思います。そこで、次の考え方です。

## 考え方3
* 段階的に実装・検証を繰り返す

実現したいことを『入力』『処理』『出力』に分類する。先の例を分類すると、下記のようになると考えます。

『入力』1.テキストファイルの読込
『入力』2.入力データを取り出す
『処理』3.素数かどうかを判定する
『出力』4.出力する

多くの場合、一番時間を要し、実現困難なものは『処理』の部分だと考えています。
そのため、『入力』『出力』の部分を実装する、『処理』部分は未実装でも、スタブでも良いです。
その上で、比較的実装難易度の低い『入力』『出力』が想定通り動いているかをまず検証し、保証することを推奨しています。
『入力』『出力』を先に実装するメリットは、実行結果が目に見やすい事もあります。

もっと複雑なロジックを実装するなら、『入力2』『処理2』『出力2』と分解してして、上記を繰り返し、動作を保証する部分を広げていくこと、実装していない部分を局所化していくことが良いと考えています。

そして、『処理』部分を実装、検証にうつります。
Writeup: DIVER OSINT CTF 2024

# 概要

https://x.com/DIVER_OSINT_CTF

# Writeup (解けたもの)

- welcome
    - ルール読む
- office
    - `unzip ./mudai.odt` をして中身のファイルを見る 
- dream
    - google image search するだけ
- number
    - 番号の意味を記載してるページを探す
- chain
    - https://map.torikizoku.co.jp/store?keyword=4F
    - https://map.torikizoku.co.jp/store?keyword=4%E9%9A%8E
- serial
    - 機体に写ってる文字でぐぐる
- wumpus
    - 写ってるURLにアクセス
- imagetrack
    - Open Air Brewing = 神戸のブルワリー
    - 神戸市 x 郷土料理 とかで検索で特定可能
    - EXIFのGPS情報からも特定可能
- leak
    - 最近見たツイートにまんま書いてあったのでコピペ
- osprey1
    - https://www.airforcetimes.com/news/your-air-force/2023/12/05/air-force-releases-names-of-7-airmen-killed-in-osprey-crash-off-japan/
    - https://aviation-safety.net/wikibase/348462
- ad_directiare
    - https://gmail-osint.activetk.jp/
    - https://github.com/mxrch/GHunt
    - gmail以外は記載内容で調べても全く情報なし
- 246
    - 写真奥の橋を画像検索、似たような橋がいっぱいあるが、鉄塔とセットなのは関門橋だけっぽい
    - 車のナンバープレートが「下関」っぽいのも合わせて確信、ざっくり同じようなアングルで見えそうな場所をストリートビューで探しておく
    - 道路標識の番号246は山口県道246号 [交差道路・路線番号・通称名
](https://www.skr.mlit.go.jp/road/hyousiki/h_annai/guidesign/crossing.html)
    - 起点終点含めて名前のついた交差点がそんなになさそうなので絞れる [Wikipedia](https://ja.wikipedia.org/wiki/%E5%B1%B1%E5%8F%A3%E7%9C%8C%E9%81%93246%E5%8F%B7%E9%95%B7%E5%BA%9C%E5%89%8D%E7%94%B0%E7%B7%9A)
    - ( うっすら標識の下に「33」って見えるけどこれ何かに使える？ )
- osprey2
    - https://www.stripes.com/branches/air_force/2024-02-15/osprey-crash-japan-yokota-service-13010379.html
    - 写真と文章からがんばってOpenStreetMapで特定する。右クリックから「アドレスを表示」だと周囲の道が出てしまうので、「地物を検索」から運動場のウェイNoをとる
- promoter
    - 池をGoogle画像検索で特定
    - 江崎善左衛門宗度と没年1627で検索
    - このPDFにたどり着く https://www.jstage.jst.go.jp/article/jjsidre1965/49/7/49_7_630/_pdf
- youtuber
    - Find Fidias deleted video (reuploaded everywhere) 
        - https://www.youtube.com/watch?v=YzUDKBolwXY
    - Train number is in the video (but need to convert it into proper format) 
        - https://timetable.jr-odekake.net/train-timetable/104121?date=20240217
    - Guess 乗り換え駅 based on their path on the video and 新幹線路線図 
        - https://www.zenrin.co.jp/magazine/160329/
    - Additional check on youtube "新幹線乗り場 + Station Name" to be more confident, one by one

# 解けなかったもの

- label
    - 永遠にトラッキングNoを追跡サービスに入れてたけど何も出てこない
    - FROM:の"DIVER" MEDICALとかDATE/TRACING Noからなんか嘘っぽいなと感じ始める
    - 2つめのQRとバーコードの読み方をあとで調べる
- chiban
    - 場所特定まで
        - サンディ7号店はそのままググっても出てこない(どこかで店舗名が番号でなく地名に変わったっぽい)
            - 店舗一覧 https://www.sundi.co.jp/shop/
        - 画像奥のぎょうざの〇〇(潰れてて読めない)を画像検索 > 「ぎょうざの満洲」と特定
            - 店舗一覧 https://www.mansyu.co.jp/annai/annai.html
        - 出題の傾向から関西っぽさあり
        - ぎょうざの満州の関西店舗は数えるほどしかないのでひとまず全部ストリートビューで見て特定
    - 地番
        - 地番特定の方法がわからない
        - 近隣の賃貸物件の地番表記がホームズ等に掲載されているが、道路自体は不明
        - 他の人のWriteupで MAPPLE法務局地図ビューア を使うと取れることを知った
- championships
    - 画像検索で台湾の光華商場は判明。
    - 「台湾 2010/10 光華商場」などで検索するもそれ以上はわからず
    - 関係ないけどこの記事とかノスタルジー感じる https://game.watch.impress.co.jp/docs/news/348131.html
- island
    - [別表－1 国土地理院の南極観測概要](https://www.gsi.go.jp/common/000054629.pdf)
    - とあわせて、ひたすら関係しそうな第○次南極地域観測隊越冬隊報告の測地のパートを読んでいく
    - が記載見つけられず
- mapper
    - 場所は中日新聞から特定、そのあとは全くわからず
    - 日時計とか使う？
２０２４年６月版　最新のAI動向について

# 生成AI(LLM)技術情報　2024年5月版

こんにちは。株式会社システナ フレームワークデザイン本部です。
弊社でも力を入れている生成AIについて、最新情報を紹介致します。

## 導入

生成AIに関しては昨今の技術進歩が凄まじく、
最新情報に着いていくのがやっとになります。

そこで、
今回は生成AIの現状と、ビジネスユースケースについてまとめてみたいと思います。


## 最新情報

この春、各社から一斉に最新サービスの発表がありました。
まずはこれらについて、簡単に紹介いたします。

### GPT-4o

GPT-4oは、GPT-4の発展版という位置づけとなります。
（※GPT-5ではなく、あくまでGPT-4oの発展版という位置づけ）

主な進化ポイントは以下となります。
- 速度向上
- 日本語への最適化
- 動画をインプットした回答
- 価格が半額に（API利用時）

それぞれについて、もう少し詳しくご説明いたします。
- 速度向上
    - GPT-4ではTurbo版であっても回答生成時間が遅く、少し使用を躊躇うものでした
    - GPT-4oでは大幅に改善しており、体感で3倍以上は早くなった気がします
    - 待ち時間が大幅に減少したことにより、更なる利用促進に繋がりそうです
- 日本語への最適化
    - AIは文章をトークンと呼ばれる単位に分割しますが、日本語ではほとんど1文字ごとに分割されていました
    - この単位が単語ごとに近い形へと変更され始め、回答速度と質の向上に繋がっています
- 動画をインプットした回答
    - OpenAIのデモ動画では、スマートホンのカメラで映した映像に対して、リアルタイムでAIが回答するようなシーンが公開されていました
    - まるでAIとビデオ通話をしているかのような体験が出来るようになります
- 価格が半額に（API利用時）
    - GPT-4ではGPT-3.5に比べて割高なAPI利用料がネックとなっていました
    - GPT-4oではAPI利用料が半額になった上に、トークン数カウントも見直されたため、大幅な利用コスト減少になります


### Copilot+ 

Microsoftは新たなCopilot＋PCというカテゴリのPCを発表しました。
これは生成AIをローカル端末で動かす能力があるPC（NPU搭載PC）において、
WindowsOSに統合されたAIを様々なシーンで活用できる事がポイントとなります。

現時点では、スマホ向けCPUチップセットで有名なSnapDragonのPC版、
SnapDragon Elite/PlusというCPUチップセットを搭載した端末が対象となります。
（Nvidia製のGPUを搭載したPCの方が性能は上であると思われますが、Copilot＋PCの対象は現時点ではSnapDragon Elite/Plusのみとなっています）

## 生成AIのビジネスユースケース

### 現状

生成AI（LLM）のビジネスにおける活用シーンは、
下記のようなものがあります。
- チャットボット
    - 普通にGPTを使用する
- RAG検索
    - 社内ナレッジを文章としてユーザの質問と一緒にAIへ渡し、あたかもAIが社内のナレッジを知っているかのような回答をさせる
- 電話応対
    - RAG検索との組み合わせによって、ユーザからの電話にAIが対応するというものです
    - 既にMicrosoft社などは導入しており、人と話すのと遜色がないレベルとなっています
        - 私も先日計らずもお世話になりました

## 今後

現在の主なユースケースは「チャットボット」となっています。
各企業様の中では人間が行う業務を代替して工数削減を目指している所が多いと思いますが、
残念ながらチャットボットだけではたとえRAG検索を行っても工数削減は限定的です。（KPIも出しにくい）

今後のAIの業務への活用を考えると、
**~脱チャットボット　目指せ業務自動化！~**
が大事なスローガンと言えます。

弊社では業務自動化を目指したユースケースの検討・簡易プロトタイプ制作＆検証を行っております。
来るAI時代をリードしていけるよう、若手を中心に専門チームが日々頑張っております。
Fermat_little_theorem

# フェルマーの小定理の証明 (個人的備忘録)

## フェルマーの小定理
証明する式はこちら。

pが素数、かつaがpの倍数でない整数の時、以下の式が成り立つ。

$$
a^{p-1} \equiv 1 \;(mod \; p)
$$

## フェルマーの小定理の別表現

$$
a^p \equiv a \; (mod \; p)
$$

:::note info
別表現の場合、aの制約が緩くなっていることに注意してください。
:::

別表現で"pの倍数でない"という制約が取り払われているのは、aがpの倍数である場合のことを考えれば理解できます。

もしaがpの倍数であれば、$0 \equiv 0$となり、式が成り立つので問題ありません。

## フェルマーの小定理の証明①
フェルマーの小定理の証明の方法はいくつかあるようですが、今回は[ヨビノリたくみさんのYoutube動画](https://www.youtube.com/watch?v=-4QXGVyYVq8)で採用されていた方法で証明していきます。（全ての合同式で mod p を省略していることに注意）

### step 1
まず、$a, 2a, 3a, ..., (p-1)a$を $p$ で割った余りはどれも異なることを背理法により示す。

$$
\begin{equation}
1 \leqq 1 < j \leqq p - 1　\pmod{n}
\tag{1}

\end{equation}
$$ 

となる $i,j$を仮定したときに、$ia \equiv ja$が存在すると仮定すると、aとpは互いに素なことより、両辺からaを割って$i \equiv j$が成り立つ。iもjも1以上p未満より、$i = j$ が成り立つ。しかし、それは(1)の仮定に反してしまうため存在しない。

つまり、$a, 2a, 3a, ..., (p-1)a$を $p$ で割った余りはどれも異なることが示された。

### step 2
step1より、以下の式が成り立つ。

$$
a+ 2a+ 3a+ ...+ (p-1)a \equiv (p-1)!
$$

左辺を整理すると、
$$
a^{p-1}× (p-1)! \equiv (p-1)!
$$

ここで、$(p-1)!$と$p$は互いに素であるので、

$$
a^{p-1} \equiv 1
$$

となり、証明が完了する。
:first(last)-childと:first(last)-of-typeの違い

コーディングの際に「**:first(last)-child」「:first(last)-of-type**」が効かないということがあったため、改めてまとめます。

## **スタイルの仕様（:first(last)-child）：**

「**:first(last)-child」は、親要素の最初（最後）の子要素に対してスタイルが適応されます。**

もし親要素の最初（最後）にある要素に対して別のタグがあると機能しません。
例のようにHTMLに下記のスタイルを適応した場合に結果が異なってきます。

今回の場合、親要素の中にある「子要素＝最初（最後）のpタグ」にスタイルを当てようとしています。

「パターン１」はどちらも適切にスタイルが適応されています。
しかし、どちらの「パターン２」も最初（最後）の要素が「h2」のためスタイルが適応されません。

例
```scss
div {
  p:first-child {
    font-weight: bold; // 最初の段落のみスタイルを変更
  }
}

div {
  p:last-child {
    font-weight: bold; // 最後の段落のみスタイルを変更
  }
}
```

結果（first-child）
```html
<-- パターン1 -->
<div>
  <p>Paragraph 1</p>　　　<-- 適応⭕️ -->
  <h2>Header 1</h2>
  <p>Paragraph 2</p>
  <h2>Header 2</h2>
  <p>Paragraph 3</p>
</div>

<-- パターン２ -->
<div>
  <h2>Header 1</h2>　　<-- 適応❌ -->
  <p>Paragraph 1</p>
  <h2>Header 2</h2>
  <p>Paragraph 2</p>
</div>
```

結果（last-child）
```html
<-- パターン1 -->
<div>
  <h2>Header 1</h2>
  <p>Paragraph 1</p>
  <h2>Header 2</h2>
  <p>Paragraph 2</p>　　　<-- 適応⭕️ -->
</div>

<-- パターン２ -->
<div>
  <p>Paragraph 1</p>
  <h2>Header 1</h2>
  <p>Paragraph 2</p>
  <h2>Header 2</h2>
  <p>Paragraph 3</p>
  <h2>Header 2</h2>　　<-- 適応❌ -->
</div>
```

このように「:first(last)-child」では、同じ階層に別のタグが入る場合、例のような不具合が発生する場合があるので、注意しましょう。

## **スタイルの仕様（:first(last)-of-type）：**

**「:first(last)-of-type**」でも**親要素の最初（最後）の子要素に対してスタイルが適応されます。**

しかし、「:first(last)-child」と異なり、親要素の中でpタグが複数あるとして、かつ別の子要素（例えばh2）が入っている場合などにも機能します。

例を用いて説明します。

今回は打って変わってどちらも適切にスタイルが適応されています。

例
```scss
div {
  p:first-of-type {
    color: green; // 最初の <p> 要素に適用
  }
}
  
  
div {
  p:last-of-type {
    color: orange; // 最後の <p> 要素に適用
  }
}
```

結果
```html
<div>
	<h2>Header 1</h2>
  <p>Paragraph 1</p>　　　<-- 適応⭕️（**first-of-type**） -->
  <h2>Header 2</h2>
  <p>Paragraph 2</p>
  <h2>Header 3</h2>　　　<-- 適応⭕️（last**-of-type**） -->
  <p>Paragraph 3</p>
</div>
```

しかし、親要素の中に指定したタグがない場合には機能しません。

例
```html
div {
  p:last-of-type {
    color: orange;
  }
}

```

結果
```html
<div>
  <h2>Header 1</h2>
  <h2>Header 2</h2>
  <h2>Header 3</h2>　　　<-- 適応❌（last**-of-type**） -->
</div>
```

結構大規模なHTMLを書いていると階層が深くなって来るため、「**:first(last)-childと:first(last)-of-typeの違い」を理解していないとスタイルが適応されないなどで、詰まることになるため理解しておきましょう。

参考文献：
https://web-create-kokusyo.com/css/%E3%80%90css%E3%80%91%E3%80%8Clast-of-type%E3%81%8C%E5%8A%B9%E3%81%8B%E3%81%AD%E3%81%88%E3%81%88%E3%80%8D%E6%99%82%E3%81%AE%E5%8E%9F%E5%9B%A0%E3%81%A8%E5%AF%BE%E7%AD%96/
CSSの擬似要素::beforeや::afterのcontentプロパティを動的に変更する方法

CSSの擬似要素`::before`や`::after`を使って、文字列や画像等を挿入する際に`content`プロパティを使用しますが、基本的には値をjQueryで直接変更することができません。

理由はそもそも**擬似要素は非DOMであるため、JavaScriptから操作することができない**ようです。

そんな時に値を動的に変更するための方法をまとめます。

方法として「**content:attr(属性名)を使って変更する**」という方法があります。

詳しく説明するとここにある**`attr()`**は、()内に属性名を指定すると、擬似要素が設定されている要素の属性の値を、`content`プロパティの値として指定することができます。

そしてjQueryでは要素に対して「.attr( 'warning-message', '請求IDが重複しています。' );」とコンテンツを挿入する設定をすることで動的にコンテンツの中身（テキスト）を変更できるようになります。

例
```
要素名::before{
  content: attr(属性名);
}
```

jQuery
```
$( 'クラス名' ).attr( '属性名', '値' );
```

参考文献：
https://www.tam-tam.co.jp/tipsnote/html_css/post9753.html
ラブラッドで住所変更ができなかった話

Qiitaに書くのが適切な話題なのか微妙ですが、同様の事象で困っている方の参考になれば幸いです。

# 発生した現象

私はしばしば献血をするので、日本赤十字社の献血web会員サービス「ラブラッド」に登録しています。先日、引っ越しに伴って、ラブラッドに登録している住所を変更しようとしました。ところが、登録内容を確認するページで「変更する」をクリックして確定しようとすると

>予期せぬエラーが発生しました。
>しばらく時間をおいて、再度お試しください。
>ご不明な点は最寄りの赤十字血液センターまでお問い合わせください。

と表示され、登録情報の変更に失敗しました。

# 原因と解決策

原因は、私が郵便番号から住所を自動入力したことと、登録情報の変更画面の「住所1」欄に15文字以内という字数制限があることでした。直接入力しようとすると16文字目以降が自動的に削除されるのですが、郵便番号からの自動入力だと16文字以上の住所を入力できてしまい、登録する段階になってからエラーが発生したようです。

そこで、「住所1」は15文字以内にして、残りを「住所2」に入力することで解決しました。
Live Sass Compilerを使わずにSassをコンパイルする環境を作る方法

Sassの練習としてVScodeの拡張機能である「Live Sass Compiler」などを使うことがありますが、実際の業務ではこのような個人の環境に依存する方法は取れません。

そのため、今回は実際に行った「Live Sass Compiler」を使わずにSassをコンパイルする環境を作る方法を記録しておきます。

## 手順

### **Node.jsをインストール**

[Node.js — Download Node.js®](https://nodejs.org/ja/download)

インストールができたら、下記のコマンドでバージョン確認をしてください。
きちんとバージョンが表示されたらインストールは無事完了です。

※プロジェクトディレクトリ内でコマンドは打ってください。

```
node -v
```


### **npmで「Sass」パッケージをインストール**

下記のコマンドを入力してください。
そうするとpackage.jsonというファイルがフォルダ内に作られたと思います。

※プロジェクトディレクトリ内でコマンドは打ってください。
```
npm init -y
```

次に、Sassを使うためのパッケージをインストールします。
そうすると、フォルダ内に、node_modulesとpackage-lock.jsonが生成されます。
```
npm install --save-dev sass
```
※package.jsonを開き、「devDependencies」を確認するとsassが入っているか確認してください。

### **コンパイルするためのコマンドを記述**
package.jsonを開いて、scriptsの{}内にパッケージを実行させるコマンドを書きます。

例
```
"scripts": {
    "sass": "sass src/style.scss css/style.css"
},
```
※「src」というフォルダの中に「style.scss」というファイルがある場合の記述です。

### 実際に使用する

実際に使用する場合には、下記のコマンドをターミナルで打ち込むことで機能させることができます。
実行するとコンパイルされることがわかると思います。
```
npm run sass
```

しかし、上記のままではcssファイルを更新するたびに「npm run sass」を実行しなければいけません。
これを解決するには、更新するたびに自動でコンパイルさせる設定にする必要があります。

下記の記述に書き換えることで、設定できます。
```
  "scripts": {
    "sass": "sass --watch css/style.scss css/style.css"
  },
```

参考文献：
https://zumilog.org/sass_dev-enviroment
文字化けしやすい文字

ITシステムにおいて、文字化けを起こしてしまう文字だったり、
システムに入れると突然不具合を起こす可能性の文字というものが存在します。

最近ですと、UTF-8が標準になってきて平和になりつつありますが、
文字化け、文字によって制御が障害となる場合がある文字がいくつかあります。
漢字コードの違いによる変換不能文字と、機種依存文字、外字あたりが該当します。
またシステムとして予約している文字が該当すると文字化けが発生するかのせいもあります。

■旧字体
--------------------------------------------------------
髙 﨑 㟢 瀨 𣘺 槗 栁 桺 德 隆 塚 琢 耒 濵 羽 𡈽 尭 黑
--------------------------------------------------------

■機種依存文字
--------------------------------------------------------
①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳
Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ Ⅶ Ⅷ Ⅸ Ⅹ ⅰ ⅱ ⅲ ⅳ ⅴ ⅵ ⅶ ⅷ ⅸ ⅹ
㎜ ㎝ ㎞ ㎎ ㎏ ㏄ ㍉  ㌢ ㍍ ㌘ ㌧ ㌃ ㌶ ㍑ ㍗ ㌍ ㌦ ㌣ ㌫
№ ℡ № ㏍ ℡ ㊤ ㊥ ㊦ ㊧ ㊨ ㈱ ㈲ ㈹ ㍾ ㍽ ㍼ ㍻ ≡ ∑ ∫
--------------------------------------------------------

■システム的に問題になりそうな文字列はこの辺り
--------------------------------------------------------
! " # $ % & ' ( ) - ^ \ @ [ ; : ] , . / = ~ | ` { + * } < > ? _
--------------------------------------------------------

テストを行うときは、
あらかじめ上記のような半角の記号は全部試しておけば、ある程度は回避ができますね。

テスト用のメモでした。
C#から、Officeアプリを操作する時のメモ


:::note info
要約
・Microsoft.Office.Interop.なんたら、をusing
・DLLをさがせ
・DLLのバージョンを確認しろ
・コンパイル時にDLLをrefしろ
:::


# ソース


```c#
using System;
using Excel = Microsoft.Office.Interop.Excel;

Excel.Application excelApp = new Excel.Application();


using System;
using PowerPoint = Microsoft.Office.Interop.PowerPoint;

PowerPoint.Application pptApp = new PowerPoint.Application();
```


# コンパイル
```
c:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe
/target:exe
/reference:"C:\Path\
Microsoft.Office.Interop.Excel.dll"
Program.cs
```

/reference:OFFICE.DLL;Microsoft.Office.Interop.PowerPoint.dll

# DLLのバージョン確認

powershell (Get-Item "C:\Users\Office.dll").VersionInfo.ProductVersion


# PC内のDLLの探索

```
c:\> dir /s OFFICE.DLL

 c:\Program Files\Microsoft Office\root\Office16\ADDINS\Microsoft Power Query for Excel Integrated\bin のディレクトリ

2022/08/19  13:15           458,544 Office.dll
               1 個のファイル             458,544 バイト
```
【AtCoder】多重ループの簡潔化

## ポイント
n以下のm個の数値を管理したい場合、n進数として一括管理ができる。
（計算量に注意！）

```C++
// 多重ループ
for (int i = 0; i < N; i++) {
  for (int j = 0; j < N; j++) {
    for (int k = 0; k < N; k++) {
      for (int l = 0; l < N; l++) {
        /* 処理 */
      }
    }
  }
}

// n進数を活用した方法
int n4 = N*N*N*N;
for (int x = 0; x < N; x++) {
  int tmp = x
  int i = tmp % N; tmp /= N;
  int j = tmp % N; tmp /= N;
  int k = tmp % N; tmp /= N;
  int l = tmp % N; tmp /= N;
  /* 処理 */
}
```

## 例題
[ABC256C - Filling 3x3 array](https://atcoder.jp/contests/abc256/tasks/abc256_c)

```C++
#include <bits/stdc++.h>
using namespace std;
using vi = vector<int>;
#define rep(i, n) for (int i = 0; i < (n); i++)

int main() {
  const int N = 3, M = 30;
  vi h(N), w(N);
  rep(i, N) cin >> h[i];
  rep(i, N) cin >> w[i];
  
  int ans = 0;
  vector<vi> x(N, vi(N));
  int M4 = M*M*M*M;
  rep(i, M4) {
    int tmp = i;
    x[0][0] = tmp % M + 1; tmp /= M;
    x[0][1] = tmp % M + 1; tmp /= M;
    x[1][0] = tmp % M + 1; tmp /= M;
    x[1][1] = tmp % M + 1; tmp /= M;
    
    bool ok = true;
    rep(i, 2) {
      x[i][2] = h[i] - x[i][0] - x[i][1];
      if (x[i][2] <= 0) ok = false;
    }
    rep(j, 3) {
      x[2][j] = w[j] - x[0][j] - x[1][j];
      if (x[2][j] <= 0) ok = false;
    }
    if (x[2][0] + x[2][1] + x[2][2] != h[2]) ok = false;
    if (ok) ans++;
  }
  
  cout << ans << endl;
}
```
確率変数の周辺化とは

# 確率変数の周辺化とは

確率変数の周辺化とは同時確率分布においてある確率変数を削除して新しい確率分布を作成する操作のことです

こんなかたっ苦しくいわれても分かるわけがないので、具体例を元に説明していきます

# 同時確率分布とは

本題を前に同時確率分布について説明します
同時確率分布とは**複数の確率変数を持つ確率分布**のことですが、定義だけでは分からないのでこれも具体例を元に説明します

<img width="469" alt="スクリーンショット 2024-06-09 11.04.44.png (49.4 kB)" src="https://img.esa.io/uploads/production/attachments/13979/2024/06/09/137443/460cc968-33d6-4273-84ae-3021098b04e5.png">

以上のような質問を全国から無作為に抽出した 100 人の人に質問します（~~ちなみに僕はマクドナルドが一番好きです~~）

すると以下の結果が得られました

| 性別 | マクドナルド | モスバーガー | ロッテリア | 合計 |
| ---- | ------------ | ------------ | ---------- | ---- |
| 男性 | 30           | 20           | 6          | 56   |
| 女性 | 3            | 23           | 18         | 44   |
| 合計 | 33           | 43           | 24         | 100  |

今回は確率の話をしているため全て 100 で割ります

| 性別 | マクドナルド | モスバーガー | ロッテリア | 合計    |
| ---- | ------------ | ------------ | ---------- | ------- |
| 男性 | 3 / 10       | 1 / 5        | 3 / 50     | 14 / 25 |
| 女性 | 3 / 100      | 23 / 100     | 9 / 50     | 11 / 25 |
| 合計 | 33 / 100     | 43 / 100     | 6 / 25     | 1       |

このとき**アンケートを取るという事象**には、2 つの確率変数 x = **アンケートを取った相手が男性か女性か**と y=**好きなお店がマクドナルドかモスバーガーかロッテリアのどれが選ばれたか**が存在すると定義できます
また、x の確率を p(x)、y の確率を p(y)とします

<img width="899" alt="スクリーンショット 2024-06-09 11.41.13.png (110.9 kB)" src="https://img.esa.io/uploads/production/attachments/13979/2024/06/09/137443/f2576987-c964-454d-bdb6-8ee8e5f2aff9.png">

このとき、同時確率分布とは p(x, y)を指します
このように同時確率分布とは**ある事象と別のある事象の積事象**における確率分布のことを指します

# 改めて確率変数の周辺化とは

改めて本題に入っていきます
同時確率分布が理解できれば確率変数の周辺化もすぐに理解できます

先ほどのハンバーガー店の例を元に考えると赤枠、青枠の部分が周辺化した確率分布の結果です

<img width="683" alt="スクリーンショット 2024-06-09 12.08.32.png (103.3 kB)" src="https://img.esa.io/uploads/production/attachments/13979/2024/06/09/137443/0d5c42dd-f656-41d4-b1f7-ff639bfcc5a5.png">

確率変数の周辺化とは同時確率分布においてある確率変数を削除して新しい確率分布を作成することです
つまり、確率変数を削除した合計の部分を指すのです

また、p(x, y)から x を削除することを**p(x,y)を x で周辺化**する、逆に y を削除することを**p(x,y)を y で周辺化**すると言います

# 参考記事

https://disassemble-channel.com/joint-probability-marginalization/
DIVER OSINT CTF Writeup [非公式・一部のみ]

# 公式サイト
https://ctfd.diverctf.org/
# Writeup
自分で解けた問題と、そのやり方だけです。
模範解答は公式のWriteupを参照してください。
## introduction
### office
`unzip`コマンドで`mudai.odt`を解凍すると画像ファイルが出てくる。
### dream
`dream.JPG`をGoogleレンズに通すだけ。
### serial
機体にシリアルナンバーが描かれている。
### ad_directiare
名刺のGmailアドレスをGHuntに通す。Googleマップのレビューが現れる。
## military
### ospery1
以下の投稿を参照
- https://x.com/jpg2t785/status/1732331400278520246?lang=ja
- https://twitter.com/oldconnie/status/1730222512791797808
## geo
### imagetrack
画像のexifに位置情報が仕込まれている。ストリートビューで確認すると郷土料理屋がある。
## transportation
### youtuber
当該動画は[こちら](https://youtu.be/YzUDKBolwXY)。
`4:26`から以下の情報がわかる。
- さくら572号
- 新大阪行
- 次は博多

[時刻表](https://timetable.jr-odekake.net/train-timetable/104121?date=20240217)から、博多の1つ前の停車駅は新鳥栖であること、列車番号が572Aだとわかる。
### Italy
もともと契約していた[Flightradar24](https://www.flightradar24.com/)の有料プランを使用。Playback機能で日付を合わせると、日本時間で午後に新潟大学上空を通過するヘリコプターを観測できる。
全ての問題は無料で解けるとのことだが他の方法は不明（有料ソフトの使用は禁止されていない）。

# おまけ：惜しくも解けなかった問題
解けなかった問題をそのままにするのも勿体ないので、途中経過だけでも記しておきます。
### satellite
偵察衛星は[これ](https://youtu.be/DfhT_sD3sxY)。衛星の名前だけでなく追跡できるサイトも教えてくれる。
問題で指定されている時刻は、どうやら「元期に近い昇交点通過時刻」というらしい。なお高度は503.02kmと確認できる。
![スクリーンショット 2024-06-08 220251.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3682739/48e88e05-2c73-a083-5db2-2c407e4588aa.png)
しかし、肝心の空軍基地が不明だった。
[空軍基地の一覧](https://ja.wikipedia.org/wiki/%E7%A9%BA%E8%BB%8D%E5%9F%BA%E5%9C%B0%E3%81%AE%E4%B8%80%E8%A6%A7)で確認できる、スリランカの最も南部に位置するコッガラ空港（現地表記：කොග්ගල ගුවන්තොටුපළ）と503を入力したが、incorrectであった。
何か致命的な勘違いをしている可能性？

### Akeome
akemashite omedetouの正体は、Roman Sterlingov。暗号管理ミキサー「Bitcoin Fog」の創設者で3年前に逮捕されている。
Bitcoin Fourmにおけるakemashite omedetouの投稿を確認すると、「Bitcoin Fog」というサービスの管理者であることが示唆されており、「Bitcoin Fog akemashite omedetou」と検索すると、管理者の正体と逮捕されたことがわかる。

その後、[刑事告訴状](https://media.complianceconcourse.willkie.com/uploads/2024/04/20240312-Sterlingov-Complaint.pdf)を調べると、Roman Sterlingovが`heavydist@gmail.com`というアドレスを使っていたとのこと。しかし、これ以降YouTubeアカウントの特定に繋がる手がかりは掴めず。

### mapper
画像を開くと中日新聞に目が行きがちだが、注目すべきは「松波歯科」である。
Googleマップで検索すると岐阜駅前だとわかり、撮影地点はおおよそ[このあたり](https://maps.app.goo.gl/s1T7U2inakVbiFTWA)だと特定できる。
また、画像から次のような情報を得ることができる。
- 影から午前中（閑散としていて6時前？）
- 葉が落ちており、冬頃である
- 「ベストグランド」の看板が無いのは2018/07までなので、撮影日はそれ以降

しかし、秒単位で日時を特定しなければならず、正解に辿り着くことはできなかった。
この情報だけでは秒までの特定は困難であるため、そもそものやり方が違うのだろう。
ステガノグラフィも疑ったが、さすがに違うっぽい。
Poetryで仮想環境を作ろう！Python開発をもっと快適に

# Poetryで快適Python開発ライフ！依存関係と仮想環境の管理が超ラク！

Pythonでアプリ開発していると、依存パッケージと仮想環境の管理って面倒ですよね。
Poetryを使えば、そんな悩みともサヨナラできちゃいます！


## Poetryとは

Poetryは、Pythonのパッケージ管理と仮想環境構築を統合的に行えるツールなんです。つまり、依存関係管理、仮想環境構築、ビルド、パッケージングを統合的におこなうことができるツールで、プロジェクトで使うパッケージをpyproject.tomlってファイルで管理して、コマンド一発で仮想環境の構築からパッケージのインストールまでできちゃう優れものなのです！

## pyproject.tomlが全ての基本！

pyproject.tomlは、Poetryの設定ファイルで、プロジェクトの情報を一箇所に集約できるんです。こんな感じで書くよ。

```toml
[tool.poetry]
name = "my-awesome-project"
version = "0.1.0"
description = "超かっこいいプロジェクト"
authors = ["あなたの名前 <you@example.com>"]

[tool.poetry.dependencies]
python = "^3.9"
requests = "^2.28.1"

[tool.poetry.dev-dependencies]
pytest = "^7.1.2"

[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"
```

- プロジェクトの基本情報
- 本番用の依存パッケージ
- 開発用の依存パッケージ
- ビルド設定

これだけ書けば、プロジェクトの青写真は完成！

## Poetryのインストール方法

まずはpipでPoetryをインストールしましょう。

```bash
pip install poetry
```

## 新しいプロジェクトの始め方

新しいプロジェクトを始めるには、`poetry new`コマンドを叩くだけ！

```bash
poetry new my-awesome-project
```

## 既存のプロジェクトにPoetryを導入する場合

既存のプロジェクトにPoetryを導入する場合は、プロジェクトのルートディレクトリで`poetry init`を実行。

```bash
poetry init
```

質問に答えていくと、pyproject.tomlが自動生成されます。

## Poetry環境に新しいパッケージを追加

Poetry環境に新しいパッケージを追加したいときは、`poetry add`コマンドを使います。

```bash
poetry add requests
```

開発用のパッケージを追加したい場合は、`--dev`オプションを付ければOKです。

```bash
poetry add --dev pytest
```

## 仮想環境の構築とパッケージのインストール

仮想環境の構築とパッケージのインストールするには、`poetry install`コマンドを実行します。これで仮想環境の構築とパッケージのインストールが一気に完了できます。

```bash
poetry install
```

## 仮想環境でコマンドを実行する

仮想環境でコマンドを実行するときは、`poetry run`コマンドを使えば、仮想環境内でコマンドを実行できます。

```bash
poetry run python script.py
```

## 仮想環境のシェルに入るとき

仮想環境のシェルに入るときは、`poetry shell`コマンドを実行すれば、仮想環境のシェルに入れます。

```bash
poetry shell
```

## Poetryを使うメリット

- pyproject.tomlで依存関係を一元管理できる
- 仮想環境の構築とパッケージのインストールが自動化される
- `poetry build`でパッケージのビルドが簡単
- `poetry publish`でPyPIへの公開もラクラク
- 依存関係の競合も自動で解決してくれる

## まとめ

Poetryを使えば、Pythonプロジェクトの依存関係と仮想環境の管理が超ラクになります！
この記事を参考に、ぜひPoetryを導入してみてくださいね！

## 関連記事
https://qiita.com/shioccii/items/12c05c3cba419f0e5f40
【ChatGPT＋DALL-E3】マンデルブローをアニメ化


　どうも、カーブミラーです。

　今回は、マンデルブローを描いて、アニメ化します。といっても、色相を変えるだけですけどね😅

:::note info
本記事は、ChatGPT（有料版）
＋DALL-E3で行なっております。
画像はあります。　あしからず。
:::

　まずは、ニュース。

　昨日（2024/06/08）
　　にじジャーニーの
　　　アップデートが行われました。
[Midjourney](https://x.com/midjourney/status/1799228813265760612?t=ka-in5EX0syOKiPXNHOwRQ&s=03)

　niji 6 バージョンにて、
　　簡単な漢字に
　　　対応できるように
　　　　なったようです。
[にじジャーニーのアップデート](https://x.com/Wbzbu13WytaulAC/status/1799239829072617484?t=f7kwuQMYJyR4BSF2tC09Eg&s=19)

　お～い、OpenAIさぁん、
　　DALL-E3も漢字を出せるようにして。
　　　せめて、ひらがなカタカナだけ
　　　　でもいいから😫
***
　ChatGPTの
　　日時の取得方法ですが、

　GPT-4は、Code Interpreter
　GPT-4oは、システム時計
　　（両者とも違う時刻であり
　　　　また、日本時間でもない）

　DALL-E3は、GPT-4oによると、
　　“DALL-E 3は画像生成AIであり、
　　　現在の日時や時間に
　　　　関する情報を保持していません”
　　　　　とのこと。ハルシかも。

　だから何を言いたいのかというと、
　　**日時をChatGPTやDALL-E3に
　　　求めてはダメ**、ということです。
***
　さて、本題です。

　今回は、
　　カラフルな
　　　マンデルブローを
　　　　描いて、色相を変化させる
　　　　　アニメを作成します。

***
***user***
マンデルブローとは

***ChatGPT***
マンデルブローとは、フラクタル幾何学における重要な概念であり、数学者ブノワ・マンデルブローによって研究されました。マンデルブロ集合（Mandelbrot set）は、複雑な数の平面上で定義される自己相似の形状を持つ集合です。この集合は、z = z^2 + c の形の複素数の関数に基づいており、c の特定の値に対して z の反復によって発生する軌道が無限に発散しない複素数 c の集合です。

マンデルブロ集合は、フラクタルとして知られる自己相似パターンを持ち、無限に拡大しても同じような構造が現れるという特徴があります。この集合の視覚的な美しさと数学的な複雑さは、多くの研究者や芸術家にとって興味深いテーマとなっています。
***

　なお、今回の元ネタは
　　X-Twitterでのポストです。
[IT naviさんのポスト](https://x.com/itnavi2022/status/1799611454800494782?t=WYBO4SrdwdX6yYdSBaMDxw&s=03)

　まずは
　　元画像を準備します。

　ここでは、
　　“サイケデリックなマンデルブロー”
　　　と入力して送信します。
![1717899812630.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/ea5a38fb-7ba2-12f0-1108-42b5a3d78ef4.jpeg)

　そのまま、
　　同じセッションで、
　　　下記Promptを入力して送信。
```Text:
この画像の色相が次々と変わっていくGIFファイルを作成して
```

　出来上がったのが、こちら。
![psychedelic_mandelbrot_hue_shift.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/28294ab7-0612-2948-4469-6c5407ad96c1.gif)

　あんまり眺めていると
　　気持ち悪くなるかも
　　　しれません。

　ご注意を。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
ADユーザのパスワードがパスワード一覧のパスワードと合っているかをチェックするPowerShellスクリプト

職場で約1800のADアカウントのパスワードがパスワード一覧と合っているか？をチェックする為に
PowerShellスクリプトをChatGPTと共に作成しました。

### パスワード一覧ファイル
```aduser_check_input.csv
ADUserID,Password
User1,password1
User2,password2
User3,password3
```

### Powershellスクリプト
```ADUser_Check.ps1
# 管理者権限の接続情報
$AdminUserID = 'Domain\adminuser'
$AdminPW = "password"
$ADServer = "101.101.200.100"

# CSVファイルのパスを設定
$inputCsvPath = "C:\Work_AD2\aduser_check_input.csv"
$outputCsvPath = "C:\Work_AD2\aduser_check_output.csv"

# 管理者権限の資格情報を作成
$AdminSecurePassword = ConvertTo-SecureString -String $AdminPW -AsPlainText -Force
$AdminCredential = New-Object System.Management.Automation.PSCredential($AdminUserID, $AdminSecurePassword)

# CSVファイルを読み込む
$users = Import-Csv -Path $inputCsvPath

# 結果を格納する配列
$results = @()

function Test-UserCredentials {
    param (
        [string]$ADUserID,
        [string]$Password,
        [string]$ADServer
    )

    $securePassword = ConvertTo-SecureString $Password -AsPlainText -Force
    $credential = New-Object System.Management.Automation.PSCredential($ADUserID, $securePassword)

    try {
        $ldapConnection = New-Object System.DirectoryServices.DirectoryEntry("LDAP://$ADServer", $ADUserID, $Password)
        if ($ldapConnection.Properties["distinguishedName"].Count -gt 0) {
            return $true
        }
    } catch {
        return $false
    }

    return $false
}

foreach ($user in $users) {
    $ADUserID = $user.ADUserID
    $Password = $user.Password

    # パスワードが正しいかどうかを確認
    $authResult = Test-UserCredentials -ADUserID $ADUserID -Password $Password -ADServer $ADServer

    # 結果を配列に追加
    $results += [pscustomobject]@{
        ADUserID = $ADUserID
        AuthResult = $authResult
    }
}

# 結果をCSVファイルにエクスポート
$results | Export-Csv -Path $outputCsvPath -NoTypeInformation

Write-Output "認証結果を $outputCsvPath にエクスポートしました。"
```
### 3.まとめ
1800という大量のアカウント数のパスワードが台帳と一致しているか？を無事に確認することが出来ました。
ちなみに処理時間は30分程度でした。
Pipenvで仮想環境を作ろう！Python開発をもっと快適に

# Pipenvの使い方 - Pythonの依存関係と仮想環境を簡単に管理しよう！

最近ようやくvenvを使って仮想環境を管理するようになったので、同じような仮想環境の構築方法についてついでに調べてみました。pipenvはPythonプロジェクトの依存関係と仮想環境を管理するためのツールで、仮想環境の管理に加えて、パッケージの依存関係管理も行えるツールです。

## インストール

まずは、pipenvをインストールしましょう。pipを使って、次のようにインストールします。

```bash
pip install pipenv
```

## 新しいプロジェクトの開始

新しいプロジェクトを始める際は、プロジェクトのディレクトリを作成し、そこに移動します。

```bash
mkdir myproject
cd myproject
```

次に、以下のコマンドを実行して、プロジェクトの初期化を行います。

```bash
pipenv install
```

このコマンドにより、仮想環境が作成され、`Pipfile`と`Pipfile.lock`というファイルが生成されます。

## 依存パッケージのインストール

プロジェクトで必要なパッケージをインストールするには、以下のコマンドを使います。

```bash
pipenv install <package_name>
```

例えば、`requests`というパッケージをインストールする場合は、次のようにします。

```bash
pipenv install requests
```

開発用のパッケージをインストールする場合は、`--dev`オプションを追加します。

```bash
pipenv install --dev pytest
```

## 仮想環境の有効化

プロジェクトの仮想環境を有効化するには、以下のコマンドを実行します。

```bash
pipenv shell
```

このコマンドを実行すると、仮想環境がアクティブになり、シェルのプロンプトが変化します。

## 仮想環境でのコマンド実行

仮想環境内でPythonスクリプトを実行するには、以下のようにします。

```bash
pipenv run python <script_name>.py
```

他のコマンドを実行する場合も、同様に`pipenv run`を先頭に付けます。

## 仮想環境の終了

仮想環境を終了するには、以下のコマンドを実行します。

```bash
exit
```

## まとめ

以上が、Pipenvの基本的な使い方でした。

Pipenvを使うことで、プロジェクトの依存関係と仮想環境を簡単に管理することができそうですね。

- `pipenv install`で新しいプロジェクトを初期化
- `pipenv install <package_name>`で依存パッケージをインストール
- `pipenv shell`で仮想環境を有効化
- `pipenv run`で仮想環境内でコマンドを実行

ぜひ、Pipenvを活用してみてください！

## 関連記事

https://qiita.com/shioccii/items/12c05c3cba419f0e5f40
70歳の挑戦... CDC(Communication Device Class)を使ってみた　at STM32F103CB(or C8 with 128k Flash)

　前回の続きで、ほぼオマケレベルの「BluePill」がどの程度使えるのか試しています。
　今回はCDC(Communication Device Class)をつかってみます。普通のArduinoボードにはUSBシリアル変換ICが載っており、デフォルトはそれで通信をしているようです。BluePillやBlackPillにそのようなICはありませんが、その代わりにCDCの機能が使えます。
　まずは「ArduinoIDE 2.3.2」で使うために、「Tools」ではこのように設定しました。
![BluePill_CDC.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3189926/c82148b6-d4d1-c676-4414-5b53b4374f25.jpeg)
STM32CubeProgrammerで見ると「Flash size 128KB」なので、

    Board part number:"BluePill F103CB(or C8 with 128k)
としてます。

    Examples -> 04.Communication -> ReadASCIIString
を読み込んで少し変更を加えます。
```c:ReadASIIString_1.ino
// pins for the LEDs:
const int redPin = PB10;
const int greenPin = PB1;
const int bluePin = PB0;

void setup() {
  // initialize serial:
  Serial.begin(9600);
  // make the pins outputs:
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);
  Serial.println("Input 3 integers between delimmiter(sp or commma)");
}

void loop() {
  // if there's any serial available, read it:
  static int n=0;
  while (Serial.available() > 0) {

    // look for the next valid integer in the incoming serial stream:
    int red = Serial.parseInt();
    // do it again:
    int green = Serial.parseInt();
    // do it again:
    int blue = Serial.parseInt();

    // look for the newline. That's the end of your sentence:
    if (Serial.read() == '\n') {
      // constrain the values to 0 - 255 and invert
      // if you're using a common-cathode LED, just use "constrain(color, 0, 255);"
      red = constrain(red, 0, 255);
      green = constrain(green, 0, 255);
      blue = constrain(blue, 0, 255);

      // fade the red, green, and blue legs of the LED:
      analogWrite(redPin, red);
      analogWrite(greenPin, green);
      analogWrite(bluePin, blue);

      // print the three numbers in one string as hexadecimal:
      Serial.printf("No.%d - > R %d:",n++,red);
      Serial.printf(" G %d:",green);
      Serial.printf(" B %d\n\r",blue);
      Serial.println("Input R G B or R,G,B(0-255)");
    }
  }
}

```
BluePillと４線（GND,SDCLK,SWDIO,3.3V）結線したST-LINKをUSBポートに、ボード本体もUSBケーブルを介しPCに接続しておきます。ArduinoIDEで普通に「Upload」をすると次のエラーが出ます。

    Error: No STM32 target found!
    Failed uploading: uploading error: exit status 1

そこで

:::note
ボード上のリセットボタンを押しながらUploadを始め、
    コンパイルが終了し書込みが始まりそうな時点でボードのリセットボタンを離す
:::
という”離れ業”を試してみたら、書込みが出来ました。
　その後現れるシリアルポートを開き、255までの整数をスペースかカンマで区切って入力します。

![input_RGB.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3189926/bbae7c14-4b58-1885-d4ed-6360fedd3779.jpeg)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3189926/bc07990b-7a43-040b-326e-5539a61020f2.png)

USBケーブルを介して通信し、無事に動いているようです。一つ不明なのがSETUP最後、LOOP直前のSerial.printが無効になっているということです。これは「STM32CubeIDE」でも同様に起こる現象でした。それはまたの機会に。
　本日も拙い内容にもかかわらず最後までご覧いただき有難うございました。
virtualenvで仮想環境を作ろう！Python開発の効率化に

# Python開発の効率化に欠かせない！virtualenvで仮想環境を構築しよう

最近ようやくvenvを使って仮想環境を管理するようになったので、同じような仮想環境の構築方法についてついでに調べてみました。古いpython環境を使用されている方もプロジェクトごとに最適な環境を整える場合は、virtualenvの活用をおすすめします。

## virtualenvとは

virtualenvは、プロジェクトごとに独立したPython環境を構築するためのツールです。それぞれの仮想環境では、必要なパッケージとそのバージョンを個別に管理できるため、プロジェクト間の依存関係の衝突を回避できます。

## virtualenvのメリット

- プロジェクトごとに環境を分離し、依存関係の競合を防ぐことができます。
- 仮想環境を他の開発マシンに複製することで、同一の開発環境を簡単に再現できます。
- 仮想環境内でパッケージの追加・削除を行っても、グローバルなPython環境に影響を与えません。

## 仮想環境の構築手順

1. virtualenvのインストール
   ```
   pip install virtualenv
   ```

2. プロジェクトのディレクトリで仮想環境を作成
   ```
   virtualenv myvenv
   ```
   ※ `myvenv`は任意の名称に変更可能です。

3. 仮想環境の有効化
   - Windows: `myvenv\Scripts\activate`
   - macOS/Linux: `source myvenv/bin/activate`

   有効化されると、プロンプトに`(myvenv)`と表示されます。

4. 必要なパッケージのインストール
   ```
   pip install パッケージ名
   ```
   仮想環境が有効な状態でインストールすると、そのパッケージは仮想環境内にのみ保存されます。

5. 仮想環境の無効化
   ```
   deactivate
   ```

## 便利なTips

- `pip freeze > requirements.txt`で現在の環境のパッケージ一覧を保存できます。
- 別の環境で`pip install -r requirements.txt`を実行すると、同一のパッケージ構成を再現できます。
- VSCodeを使用している場合、Pythonインタープリターの設定を仮想環境のものに変更することで、その環境でコードを実行できます。

## まとめ
virtualenvを使った仮想環境の管理、いかがでしたか？

virtualenvを活用することでプロジェクトごとに最適な環境を構築し、依存関係の衝突を回避できます。開発の効率化と安定性の向上に役立つため、ぜひ一度お試しいただくことをおすすめします。

## 関連記事

https://qiita.com/shioccii/items/12c05c3cba419f0e5f40
Reactの基礎学習(Propについて)

# 概要
Reactを勉強し始めたので、学習用＆記録用にまとめる(2)
[前回はstateについてまとめた](https://qiita.com/matsumotoSalmon/items/a01fcc9ecd341f970e3c)

# 学習に使用している本
https://wings.msn.to/index.php/-/A-03/978-4-8156-1948-0

# 早速実践
* 「Reactアプリを生成」「index.htmlを編集する」は前回と同じなので省略

### 1. index.jsを書き換える(srcディレクトリの直下)
* Test2に対して、watasuという属性を渡しています
```react:index.js
import React from 'react';
import ReactDOM from 'react-dom/client';
import Test2 from './Test2';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
    <>
        <Test2 watasu='お渡しします' />
    </>
);
```

### 2. コンポーネントの作成
* index.jsから渡された「watasu」は、引数の`props`の中に入っている(propsは別の変数名にしてもOK)
```react:Test2.js
export default function Test2(props) {
    
    return (
        <div>
            index.jsから受け取ったのは、「{props.watasu}」です。
        </div>
    )
}
```

### 3. コンポーネントの作成(別解)
* このようにしてもOK（引数部分が違う。{ }によって「分割代入」している）
```react:Test2.js
export default function Test2({watasu}) {
    
    return (
        <div>
            index.jsから受け取ったのは、「{watasu}」です。
        </div>
    )
}
```

### 4. 実行！
```
$ cd {配置したいディレクトリ}/test
$ npm start
```

### 5. 結果
![スクリーンショット 2024-06-09 111424.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1719849/2576ca8d-85c7-ef2e-e30c-4c4e6dc3a35d.png)
Wordpressで作ったホームページを安全に公開する方法

デザインテンプレートの豊富さ、端末に依存しないUI、コンテンツ管理のしやすさなど、ホームページを作る際にWordpress は必須と思いますが、プラグインを含めた脆弱性対策が難しく、そのままインターネットに晒すのはちょっと勇気が要ります。そこで私は、Wordpress で作ったコンテンツを静的コンテンツに変換して、AWS の Cloudfront で公開する方法を取っています。使えなくなってしまう Wordpress の便利な機能も多いですが、それが許容できる方にはお薦めします。今回は、2024年3月に会社のホームページを作った際の作業記録を残しておきます。

# Wordpress サイトを AWS Lightsail で動かす
Wordpress を動かすサイトは、インターネットで公開するつもりがないので、ローカルPC上でも構いません。私の場合、どの端末からでもアクセスできるようにしたかったので、安価で管理が楽なものをと探して、AWS Lightsail を使うことにしました。

https://aws.amazon.com/jp/lightsail/

Lightsail には、最初からWordpressがインストールされたインスタンスイメージがあるので、それを選択すれば、数分でWordpress を使い始められます。Wordpress 用のインスタンスのスペックは 1GB RAM / 2vCPU / 40GB SSD を勧められるのでそれを選びます。IPv4アドレスはStatic で1個付けると、自分のドメインのホスト名と紐付けて、ブラウザからその FQDN でアクセスできるようになります。料金は1ヶ月固定で 7.00 USD（約1,100円）。

こうして作ったWordpress 環境でホームページを作っていきます。ここではあくまでコンテンツを作るだけなので、使い終わったらインスタンスは停めておきます。動かしっぱなしでも料金は変わりませんが、脆弱性対応のアップデートなどを頻繁にやらず、コンテンツを更新する際に立ち上げてついでにアップデートするという運用で、日頃は Wordpress の脆弱性を気にせずに済みます。

# Wordpress で静的コンテンツを作る
静的コンテンツを作るためのプラグインはいろいろあるようですが、私は Simply Static を使っています。このプラグインを使って「Generate Static Files」ボタンを押すと、Lightsail で動いているLinux マシン上に静的コンテンツが生成されます。Lightsail のWordpress をデフォルトのまま使っている場合、/opt/bitnami/wordpress/public_static/ に配置されます。

https://ja.wordpress.org/plugins/simply-static/

# 静的コンテンツを S3 にコピーする
生成した静的コンテンツを Cloudfront で公開するために、AWS S3 にコピーします。S3へのローカルファイルのコピーにはAWS CLIのインストールや環境設定が必要です。その方法の詳細は、以前書いた「S3バケットのコピーを作る」をご覧ください。

https://qiita.com/sawabenaota/items/b99fd1246ddd5c82ec93

静的コンテンツを S3にコピーする際には、Lightsail で動いているLinux マシンのコンソール（Lightsail の管理画面からアクセス可能）にて、次のようなコマンドを実行します。
<pre>aws s3 cp /opt/bitnami/wordpress/public_static s3://copy.foo.bar --recursive</pre>

# Cloudfront で S3 コンテンツを公開する
公開したいコンテンツが S3にあるので、あとは AWS Cloudflont で設定して公開するだけです。Cloudfront での設定方法は、詳しいチュートリアルをAWS が提供してくれているので、こちらを参考にしましょう。

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/HostingWebsiteOnS3Setup.html

このチュートリアルに則ってコンテンツを公開すると、https://foo.bar/index.html のように実在するファイルをアクセスすることができますが、https://foo.bar/ のようにディレクトリアクセス（ルートアクセス）すると、Access Denied というメッセージが表示されてしまいます。
この現象を解消するために、CloudFront の関数（Function）を作り、それをCloudfront のディストリビューションに適用する、という一手間が必要です。

https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/example-function-add-index.html

Cloudfront 上で次の関数を作り、それらをディストリビューションに関連付けすることで、ルートアクセスでもコンテンツにアクセスできるようになります。
<pre>function handler(event) {
    var request = event.request;
    var uri = request.uri;
    
    // Check whether the URI is missing a file name.
    if (uri.endsWith('/')) {
        request.uri += 'index.html';
    } 
    // Check whether the URI is missing a file extension.
    else if (!uri.includes('.')) {
        request.uri += '/index.html';
    }

    return request;
}</pre>
venvで仮想環境を作ろう！Python開発をもっと快適に

# venvで仮想環境を作ろう！Python開発をもっと快適に

Pythonを使った開発をしている皆さん、仮想環境は使っていますよね？
私のロールは開発者ではないのですが、個人的なツールを作るときに仮想環境の便利さを知ってしまい、最近ようやくvenvを使って仮想環境を管理するようになりました。

## venvって何？

venvとは、Python 3.3以降に標準ライブラリに追加された仮想環境管理ツールのことです。仮想環境を使うと、プロジェクトごとに独立したPython環境を作ることができます。つまり、プロジェクトAとプロジェクトBで、別々のパッケージやそのバージョンを使い分けられるということです。

## venvを使うメリット

- 標準ライブラリなので、別途インストールが不要
- 軽量で使いやすい
- プロジェクトごとに環境を分離できるので、依存関係の衝突を防げる

## 仮想環境の作り方

1. プロジェクト用のディレクトリを作成
   ```
   mkdir myproject
   cd myproject
   ```

2. 仮想環境を作成
   ```
   python3 -m venv myvenv
   ```
   ※ `myvenv`は仮想環境の名前なので、好きな名前に変更できます。

3. 仮想環境を有効化
   - Windows: `myvenv\Scripts\activate`
   - macOS/Linux: `source myvenv/bin/activate`

   有効化すると、シェルのプロンプトに`(myvenv)`と表示されます。

4. 必要なパッケージをインストール
   ```
   pip install パッケージ名
   ```
   仮想環境が有効な状態でインストールすると、パッケージはその環境だけに入ります。

5. 仮想環境の無効化
   ```
   deactivate
   ```

## Tips

- `pip freeze > requirements.txt`で、現在の環境のパッケージ一覧を保存できます。
- 別の環境で`pip install -r requirements.txt`を実行すると、同じパッケージがインストールされます。
- VSCodeを使っている場合、Pythonインタープリターの設定を仮想環境のものに変更すると、その環境でコードを実行できます。

## まとめ

venvを使った仮想環境の管理、いかがでしたか？
プロジェクトごとに環境を分離できるので、依存関係のバージョン衝突に悩まされることもありません。

最初は慣れないかもしれませんが、使っているうちにその便利さが実感できると思います。

## 関連記事

https://qiita.com/shioccii/items/12c05c3cba419f0e5f40
tanhで滑らかに値をゼロにつなげる時の目安

# この文章の目的

ハイパボリックタンジェントを数値パラメタ設定でよく使うのだが、実際に値をどのように設定すれば値を繋いだことになるのかよく覚えておらず、毎回計算して求めているので、ここに書いておくことにした。

# ハイパボリックタンジェント

2024年現在的には、深層学習の活性化関数として最もよく使われている
$$
\tanh(x) = \frac{e^x - e^{-x}}{e^{x} + e^{-x}}
$$

である。$\tanh$は-1から1へ変化する関数なので、何か二つの値を滑らかに繋ぎたい場合は、数値計算でも入力パラメタの調整にしばしば使われる。その際は
$$
f(x) = \frac{1}{2}\left[1 + \tanh \frac{(x-x_0)}{d}\right]
$$

というようになる。この場合は、値は0から1を取るようになり、$x_0$は値の切り替わりの座標、$d$は大雑把に切り替わりの幅である。
ハイバボリックタンジェントは以下のような形をしている。
(a) $\tanh(x)$, (b) $[1 + \tanh(x)]/2$, (c) (b)の図を縦軸を対数にしたもの。

![tanh.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167290/d2f4cf13-b9ed-c8a6-2ee8-db5ff8259db6.png)

ここでは
$$
f(x) = \frac{1}{2}\left[1 + \tanh x\right]
$$
という関数を考える。$x_0=0$、$d=1$とした場合である。すると逆関数は

$$
x = \frac{1}{2}\log\frac{f(x)}{1-f(x)}
$$

となる。$f(x)=10^{-2},~10^{-3},~10^{-4}$となる$x$を計算すると、それぞれ
$x = -2.23,~-3.45,~-4.61$程度となる。精度3桁程度で値を滑らかに繋ぎたい場合は、切り替わりの座標$x_0$を設定した後、$x_0 - h<x< x_0 + h$と定義、$h=3.45d$と設定するのが良い。
Python開発の環境管理について調べてみた

# Python開発での仮想環境管理
個人で使うツールはPythonで開発していますが、環境管理ができるとすごく便利そうだったので、Pythonの環境管理ツールを徹底比較し、それぞれの特徴・メリット・デメリットについていろいろと調べてみました。

## 1. venv: Python標準の仮想環境管理ツール

Python 3.3以降に標準搭載されているvenvは、まさに「シンプルイズベスト」を体現したツールです。

### 特徴

- Python標準ライブラリに含まれているため、追加のインストールが不要
- プロジェクトごとに独立した仮想環境を作成可能
- 軽量で、リソース消費が少ない

### 注意点

- 仮想環境内では、仮想環境作成時のPythonバージョンが使用される
- 依存関係の管理機能は限定的

### 使い方
venvの使い方についてはこちらをご確認ください。

https://qiita.com/shioccii/items/1c14f48e0c50f9ca42d6

## 2. virtualenv: Python 2系でも使える仮想環境管理ツール
virtualenvは、venv登場以前からPython 2系で使われていた仮想環境管理ツールです。

### 特徴*

- Python 2系でも仮想環境を作成可能
- venvと比べて、より柔軟なカスタマイズが可能
- `--python`オプションで、使用するPythonインタープリタを指定可能

### 注意点

- 依存関係の管理機能は限定的

### 使い方
virtualenvの使い方についてはこちらをご確認ください。

https://qiita.com/shioccii/items/6e97dc2a4e1b6b10b2ea

## 3. pipenv: 仮想環境と依存関係の管理を統合したツール

pipenvは、仮想環境の管理に加えて、パッケージの依存関係管理も行えるツールです。

### 特徴

- PipfileとPipfile.lockで依存関係を明確に記録
- `install`コマンドで仮想環境の作成とパッケージのインストールを実行
- チーム開発での環境共有に適している

### 注意点

- PipfileとPipfile.lockの形式に慣れる必要がある
- 他のツールとの連携が難しい場合がある

### 使い方
pipenvの使い方についてはこちらをご確認ください。

https://qiita.com/shioccii/items/61e19b18453d3521db51

## 4. poetry: パッケージ管理とビルド・公開機能を備えたツール

poetryは、仮想環境と依存関係の管理に加えて、パッケージのビルドや公開機能を提供するツールです。

### 特徴

- pyproject.tomlでプロジェクトの設定を一元管理
- 強力な依存関係解決機能を持つ
- パッケージのビルドと公開をサポート

### 注意点
- pyproject.tomlの形式に慣れる必要がある
- 他のツールとの連携が難しい場合がある

### 使い方
poetryの使い方についてはこちらをご確認ください。

https://qiita.com/shioccii/items/a7d7a00ec9a468de120b

## 5. conda: データサイエンス分野で人気の高い包括的な環境管理ツール

condaは、Anacondaディストリビューションに含まれる環境管理ツールで、Python以外の言語環境も管理できます。

### 特徴

- データサイエンスや科学技術計算に特化した豊富なパッケージを提供
- バイナリパッケージが多く、インストールが高速
- 異なるOS間での環境再現性が高い

### 注意点

- ディスク容量を多く消費する
- pipとの互換性に注意が必要


## 6. Docker: コンテナ技術を用いた環境管理ツール

Dockerは、コンテナ技術を使ってアプリケーションの実行環境を隔離し、パッケージ化するツールです。

### 特徴

- アプリケーション全体をコンテナ化し、環境の再現性を向上
- 開発環境と本番環境の差異を最小化
- マルチプラットフォームでの環境共有が可能

### 注意点

- Dockerの概念を理解する必要がある
- コンテナの管理に手間がかかる場合がある

## まとめ：最適なツールでPython開発をもっと快適に！

Pythonの環境管理ツールは、それぞれに特徴があるようですので、要件に合わせて最適なツールを選ぶことが大事だと思いました。
cocoapods の pod install で `[!] Unable to find a specification for 'ライブラリ名'` というエラーが出たら

## 落ち着いて

ライブラリ名のスペルミスや TYPO の可能性がないか、確認しましょう（私はこれが一番多い）。

## そうでなければ

そうでないことがハッキリしたら、以下を参照しましょう。

- [pod install で Unable to find a specification エラーがでたら #iOS - Qiita](https://qiita.com/amazedkoumei@github/items/fef8f9b04930927f4069)
- [cocoapodsで \[!\] Unable to find a specification for `ライブラリ名`のとき #iOS - Qiita](https://qiita.com/burakon/items/716174ee003ea48373ed)
- [ios - Unable to find a specification in CocoaPods - Stack Overflow](https://stackoverflow.com/questions/25913733/unable-to-find-a-specification-in-cocoapods)

## おわりに

本当に私はいろいろな場面で TYPO が多いので、戒めのために書きました。

ググる前に自分の足下を見ろと...:sleepy:。
GitHubのリポジトリをcloneしたい

## 本日のお悩み
### githubのリポジトリをクローン(コピー)したい
## 本日の処方箋
### クローンするための手順を解説します。
**１.まずはクローンするためのディレクトリを作成します。**
今回はデスクトップにディレクトリを作成する例で解説します。

```sh
cd desktop
mkdir sample
```
**２. 先ほど作成したディレクトリをvscodeで開きます。**

**３. メニューバーのターミナルから新しいターミナルをクリックしターミナルを開きます。**

**４. githubからクローンしたいリポジトリのURLをコピーします。**
![スクリーンショット 2024-06-09 9.49.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768511/479b3fc0-7cff-e58d-f9bf-a631a78fb806.png)

**５. vscodeでコマンドを入力します。**

```sh
git clone https://github.com/Ucchii70/image_analysis.git
```

**６.そうするとコピーされた新しいディレクトリが作成される。以上で基本的な解説は終わります。**

## 複数のブランチがある場合のクローンの仕方

* 一番最初の階層に戻る
  
  ```sh
  cd ../
  ```
* ブランチ名を指定してクローンする

  ```sh
  git clone -b (ブランチ名) (リポジトリURL) (変更後のフォルダ名)
  ```
  ここでリポジトリ名がディレクトリ名となり作成されてしまうためここでバッティングが起きてしまう。最後に任意でフォルダ名を変更することで防げる。
以下例↓

  ```sh
  git clone -b sample https://github.com/Ucchii70/image_analysis.git sample
  ```
【効率化】Onenoteでよく利用するショートカット集

# はじめに
お気に入りのノートアプリはなんでしょうか？
私はNotionです。

会社で利用しているコミュニケーションツールがTeamsである場合、
ノート共有はOnenoteが一般的かと思います。

本記事は業務効率化を目的として、
使用している各操作のショートカットキーを確認してみた記事となります。

# 1日を通して使用していたショートカット
打合せなど1日を通して使用していたショートカットキーやマウス操作に対応しているショートカットキーを箇条書きした内容です。

## ノートブック操作(ナビゲーション)ショートカット
- `Ctrl + T`：セクションの追加
- `Ctrl + N`：ページ追加
- `Ctrl + Tab`：セクション移動
- `Ctrl + pgUp or pgDn`：ページ移動
- `Alt+ ←`：1つ前にいたページに戻る
- `Alt+ →`：1つ先にいたページに進む

## 文字入力操作/書式ショートカット
- `- + スペース`：-で箇条書き
- `Ctrl + .`：・で箇条書き
- `Ctrl + /`：数字で箇条書き
- `Tab`：インデント(箇条書きスタイル記載行であればスタイルも含め)
- `Shift + Tab`：インデントが戻る(箇条書きスタイル記載行であればスタイルも含め)
- `Ctrl + Alt + 1~6`：見出しを作成する
- `Ctrl + Shift + →`：単語単位の選択
- `Shift + ↓`：行の選択
※`Ctrl + a`でも可
- `Alt+ Shift + ↓↑`：行を上下に移動
- `Ctrl + 1`：チェックボックスを表示する
    - もう一度実行でチェックボックスにチェックを入力
- `Ctrl + z`：元に戻す(直前にした操作を戻す)
- `Ctrl + y`：操作のやり直し(「Ctrl + Z」（元に戻す）で実行した操作を元に戻す)
- `Ctrl + Shift+ < or >`：文字サイズの変更
- `Ctrl + 設定した数字`：文字色を変更
    - ノートシールのカスタマイズ設定が必要であり、
ノートシール設定については[OneNote　ノートシールについて](https://live-style.jp/about-onenote-note-tags/)参照
- `行の途中でTAB`：表作成
- `Alt + JL + G`：表の塗りつぶし

## 打合せページの中で使用しているショートカット
![2024-06-08_10h32_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1764568/0af824ce-47fc-23be-f0f0-ce215012bc86.png)

## 終わりに
本記事がonenoteを利用する方の助けになれば幸いです。
無料で使えるLLMのAPIに関する覚書

# LLMAPIについて

こんにちは、皆さん！この記事では、LLMAPIについて初心者向けにわかりやすく説明します。まずは、LLMとは何か、そしてAPIとは何かを理解しましょう。その後、LLMAPIについて詳しく見ていきます。

## LLMとは？

LLMとは「Large Language Model」の略で、大規模な言語モデルのことを指します。これらのモデルは、膨大な量のテキストデータを基にして訓練され、自然言語処理（NLP）タスクを実行できるように設計されています。

### 主な特徴
- **自然言語の理解**：テキストの意味を理解し、人間のように文章を生成できます。
- **多様なタスクに対応**：文章の生成、要約、翻訳、質問応答など、多くのタスクに対応できます。
- **大規模データの使用**：インターネット上の大量のテキストデータを使用して訓練されるため、広範な知識を持っています。

## APIとは？

APIとは「Application Programming Interface」の略で、アプリケーションプログラムインターフェースのことです。APIは、異なるソフトウェア間でデータや機能をやり取りするための方法を提供します。

### 主な特徴
- **機能の共有**：一つのソフトウェアが持つ機能を他のソフトウェアが利用できるようにします。
- **標準化されたインターフェース**：プログラマが理解しやすく、使いやすい形式で機能やデータにアクセスできます。
- **セキュリティと制御**：外部からのアクセスに対してセキュリティを提供し、使用範囲を制御できます。

## LLMAPIとは？

LLMAPIは、LLM（大規模言語モデル）の機能をAPIを通じて利用できるようにしたものです。これにより、開発者は自分のアプリケーションやサービスにLLMの強力な自然言語処理能力を簡単に組み込むことができます。

### LLMAPIの利用例
1. **チャットボット**：ユーザーの質問に対して自然な回答を生成するチャットボットを作成できます。
2. **テキスト生成**：文章やコンテンツを自動生成する機能をアプリケーションに追加できます。
3. **言語翻訳**：多言語対応の翻訳サービスを提供できます。

### 使い方の例
以下は、Pythonを使ってLLMAPIを呼び出す簡単な例です。

```python
import requests

api_url = "https://example.com/llmapi"
headers = {
    "Authorization": "Bearer YOUR_API_KEY",
    "Content-Type": "application/json"
}
data = {
    "prompt": "今日は天気がいいですね。どう思いますか？",
    "max_tokens": 50
}

response = requests.post(api_url, headers=headers, json=data)
result = response.json()

print(result["text"])
```

# 無料で使えるLLM API

- **Claude**
- **Command R**
- **Llama 3**

## Claude
![スクリーンショット 2024-06-08 221735.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634370/7c4c9214-774b-ae80-18f4-6ec1d02a328b.png)
Claudeは、少し前から話題になっているChatGPTとは別枠のチャットが出来る生成AIです。
性能もChatGPT3.5と同じくらい、あるいは上回るくらいの実力を持っています。

### 無料枠は5ドル分まで
APIの利用にはクレジットカードの登録が必要

URL:https://www.anthropic.com/api

## Command R＋

![スクリーンショット 2024-06-08 222721.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634370/38a17830-643f-4a9b-ef01-a9b8f6776bd3.png)


command R＋はTwitterで話題になっていたローカルLLMです。
何が凄いかと言えば、ちゃんとしたGPUを積んでいれば、自分のパソコンに入れて動かせるという点。加えて、出てくる回答がかなり長文になるのも特徴です。

URL：https://dashboard.cohere.com/api-keys

API利用を試す分にはクレジットカードの登録なしでいける

## Llama3

Llama3はMetaが開発したオープンソースのLLMです。
オープンソースとは公開されているソース、つまりCommand Rと同じようにPCにダウンロードできるLLMということです。

URL：https://console.groq.com/keys

期間が限られていると考えられるが、現在はかなり無制限で使えるっぽい



## 最後に
今回は、LLMのAPIを無料で利用できるモデルを幾つか紹介しました。
次の記事では、これらのAPIを用い、無料でチャットボットを作る方法について調べようと思います。
gradle を使用して jar ファイルを作成する

## 想定読者
 - gradle の task で jar ファイルを作成する方法を知りたい人

## 結論
- 基本的には build task を実行すれば ok

    ``` bash:linux cli
    ./gradlew build
    ```
<br>

ただ、別の task を利用して jar を生成することも可能
以下はそういった別の task も含めた解説
## 解説
- jar ファイルの作成には jar, bootJar, build の 3 つの task が利用できる

    #### jar
    - plain jar を作成する (依存関係 や マニフェストファイルは含まれない)
    - ライブラリとして使用する jar の作成に使用される
    - (jarファイル名)-plain.jar の形式で ./build/libs/ に出力される
    #### bootJar
    - 実行可能 jar を作成する (全ての依存関係を含み、単独で実行可能)
    - (jarファイル名).jar の形式で ./build/libs/ に出力される
    #### build
    - plain jar 、及び実行可能 jar を作成する
    - bootJar task と jar task を両方実行したときと同じ結果が得られる
<br>

- __そのため、基本的には build task によって jar を生成すれば良い__

#### (補足) plain jar と 実行可能 jar の違いについて
上述の通り、依存関係とマニフェストファイルが含まれているかが異なる

生成された jar ファイルを解凍してディレクトリ構成を確認した結果を以下に示す

``` plain.jar
root
├─com
│  └─example
│      └─demo2
└─META-INF
```

``` 実行可能.jar
root
├─BOOT-INF
│  ├─classes
│  │  └─com
│  │      └─example
│  │          └─demo2
│  └─lib
├─META-INF
│  └─services
└─org
    └─springframework
        └─boot
            :
           (略)
```

差分は以下 2 点である
①META-INF 配下にマニフェストファイルを含むディレクトリが存在する
➁springframework の依存関係が含まれている

## Tips
##### ./gradlew task -all から各 task の詳細を確認できる
以下は bootJar と jar の説明を抜粋したもの
``` bash:linux cli
> ./gradlew task --all

:
bootJar - Assembles an executable jar archive containing the main classes and their dependencies.
:
(中略)
:
jar - Assembles a jar archive containing the classes of the 'main' feature.
:
```

##### 一方の jar だけが欲しい場合
- jar task または bootJar を使用する、もしくは build.gradle に以下を記載することで不要な jar が出力されなくなる
``` build.gradle
jar {
    enabled = false
}
```
あるいは
``` build.gradle
bootJar {
    enabled = false
}
```
AlfredからPerplexityと会話する

:::note
* `2024/11/21` これの進化版の記事書きました。ChatGPTベースになってますがPerplexityに置き換えてそのまま使えます。
[Alfredのデフォルト検索をChatGPTにしたらめっちゃ捗った話](https://qiita.com/zeero/items/9e1eec33c452d405364c)
:::

検索特化AIチャットボット [Perplexity](https://www.perplexity.ai/) との会話を [Alfred](https://www.alfredapp.com/) から始める方法です。

Perplexityに聞いたら、さくっと教えてくれました :tada: 

`Alfred Preference` > `Features` > `Web Search` > `Add Custom Search` で `Search URL` のところに以下を設定。

```
https://www.perplexity.ai/?q={query}
```

ChatGPT版はこちら :point_down: 

https://qiita.com/zeero/items/bb32d5baeb3ae5b01977