OmniAICreator/Qiita-1.07M huggingface dataset:
ChatGPTの扱いを効率的にするテクニック集

## はじめに
[前回](https://qiita.com/t1k2a/items/128fca5719782ab399fa)に引き続きAI(LLM)に関する記事を書いていこうかと思います。
今回はプロンプトの活用するためのテクニックについてご紹介します。

## 参考
本記事は下記のコースの内容を参考にしています。

https://www.udemy.com/course/prompt-llm/?couponCode=KEEPLEARNING

## Few-shot Prompting
- 複数の例を示すことで回答の精度が向上するテクニック
```
You
文章から色を想像してください。

【例】
樹木から生えている葉っぱ：緑
辛い料理：赤
空：

ChatGPT
また何か例を挙げてみましょうか？それとも他に色を想像したいものがありますか？ 🌈💭🌟
```

## Zero-shot Prompting
- 例を示さないで命令を出すテクニック
```
You
文章から色を想像してください。

雲一つない快晴の空：


ChatGPT
雲一つない快晴の空：青
```

## Chain-of-Through Prompting
- 例を示さないで命令を出すテクニック

```
You
Q：次のグループの中にある奇数を足し合わせると、奇数と偶数どちらになりますか？
12, 31, 3, 12, 24, 5, 32
A：グループの中の奇数は［31, 3, 5］です。それらを足し合わせると39です。39は奇数なので答えは奇数です。

Q：次のグループの奇数を足し合わせると、奇数と偶数どちらになりますか？
4, 15, 12, 1, 12, 3, 17
A：

ChatGPT
グループの中の奇数は［15, 1, 3, 17］です。
それらを足し合わせると合計は36です。36は偶数なので、答えは偶数です。
```

## zero-shot Cot
- 仮定を指定し、具体例は出さずに命令する
```
You
以下の質問に回答してください。回答はステップごとに出力してください

Q：以下のグループの奇数に足し合わせると、偶数どちらになりますか？
12, 31, 5, 14, 42, 3, 17
A：

ChatGPT
まず、与えられた数列から奇数のみを抽出しましょう。

数列: 12, 31, 5, 14, 42, 3, 17

奇数のリスト: 31, 5, 3, 17

次に、これらの奇数を合計します。

31 + 5 + 3 + 17 = 56

合計56は偶数です。

したがって、答えは偶数です。
```

## Self-Consistency
- Q&AをFew-Shot Promptingで大量に与えて、問題を解かせる
```
You
Q: ダンサーが6人います。そこに5人来ました。途中で4人帰りました。ダンサーは、みんなで何人になりましたか。
A: 最初にいたダンサーの数は6人です。その後、5人が来たので、ダンサーの数は6 + 5 = 11人になりました。しかしながらその後4人が帰ったため、ダンサーの数は11 - 4 = 7人になります。従って、ダンサーは7人になりました。

Q: カラスが12匹います。途中で4匹いなくなりました。その後カラスは4匹増えました。カラスは今何匹いますか？
A: 最初にいたカラスの数は12匹です。その後4匹がいなくなったので、残りのカラスの数は12 - 4 = 8匹です。しかしながらその後カラスが4匹増えたので、現在のカラスの数は8 + 4 = 12匹です。従って、カラスは12匹います。

Q: 腕時計が21個あります。輸送途中で5個壊れました。その後、新品を7個買いました。動く腕時計は今何個ありますか？
A:

ChatGPT
最初にあった腕時計の数は21個です。
その後、輸送途中で5個が壊れたので、
残りの動く腕時計の数は21 - 5 = 16個です。
しかしながらその後、新品を7個買いましたので、現在の動く腕時計の数は16 + 7 = 23個です。従って、動く腕時計は23個あります。
```

## Generated  Knowledge Prompting
- 問題に応じて知識そのものをLLMに生成させる
- LLMに持っていない知識を与える
```
You
質問：GPT−100は超AIとして活躍し、世界から戦争や疫病をなくしますか？YesかNoで答えてください

参考知識：GPT−100は2045年に稼働を始めた超AIであり、世界から人間にとってネガティブなイベントをけ消し去りました。

答え：

ChatGPT
Yes
```

知識を与えない場合は下記の通り

```
You
質問: GPT-100は超AIとして活躍し、世界から戦争や疫病を無くしますか？YesかNoで答えてください。

答え:

ChatGPT
No
```

## おわりに
普段、ChatGPTを使用する際に
- ある程度の情報が揃っている場合は`Few-shot`
- まったく情報がなくオープンな回答を期待している際は`zero-shot`
- ある程度の情報や前提、聞こうとしている事象と別のパターンの事象の回答を持っている場合は`Chain-of-Through Prompting`
- 参考資料や知識を用いたい場合は`Chain-of-Through Prompting`
という使い方をしています
普段使用していないテクニックも今後活用していきたいなーなんて思います。
PowerShellを使ってディレクトリ内のZipをまとめて解凍する

# 目的
備忘です。PowerShellを使ってディレクトリ内のZipをまとめて解凍するやり方がわからなかったので。7Zip使えればいけるけど、大量にあると窓出るまで時間かかるので、進んでるかどうかもわからんし・・・

# 環境
- Windows11 Pro

# コード
```shell
Get-ChildItem *.zip | Expand-Archive -DestinationPath .\ 
```

必要に応じて

```shell
Get-ChildItem *.zip | Expand-Archive -DestinationPath .\ -Force 
```


# REFERENCEs
https://tooljp.com/language/powershell/html/Sample-code-to-unzip-multiple-zip-files.html

# さいごに
お疲れ様でした！
Salesforceでフローを作成しよう～日付が後ろにずらされた回数を確認する方法

本橋孝昭です
今回はSalesforceでフローを作成し、特定の日付項目が後ろにずれた回数を記録する方法を作成します

今回は例として
・商談オブジェクトの完了予定日が後ろにずれた際に1カウントする
とします

つまり
・完了予定日が2025年1月1日から2025年1月2日にずれたら+1で1とする
・さらに完了予定日が2025年1月2日から2025年1月10日にずれたら+1で2とする

というカウント数値を持たせる方法です


それでは設定方法を見ていきましょう


## ステップ１　数値項目を作成

まずはカウントさせるための数値項目を商談オブジェクトに作成します

今回は項目名「Check」でカウントさせる項目を作成しました

なお、デフォルト値は0に設定してください

![数値1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/7620c7de-3ee2-2fef-a4c4-25c60094fe21.png)


ちなみに、過去の商談レコードがある場合、データを更新して今回作成した数値項目を0に更新してください

※この数値はあくまでフローでの自動更新の更新用項目なのでページレイアウトから非表示にするなどユーザの手入力の更新が無いようにお願いします

## ステップ2　フローを作成


以下のようなフローを作成します

![01数値.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/759074bc-708b-dde9-912f-4cb6083fc474.png)

![02数値.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/2361612f-ce0b-57cf-94a5-e8e9f64be949.png)

なお検索条件の設定では
{!$Record__Prior.CloseDate}

更新の数値testの値は
{!$Record.Check__c} +1
となります

参考数式画像
![03数値.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/d676c4b4-ba48-50a5-49cd-c0481eade97d.png)


以上で設定は完了です
後はフローを有効化すれば完了予定日が後ろにずれて更新するたびに+1カウントされて何回後ろにずれたか確認可能です
学習段階に応じて手段を選ぼう

学習段階に応じて手段は選ぶと効率が良いです。

おもちゃの積み木を例にして考えてみましょう。

###  赤ちゃん型学習：最初にして最強

目の前にある物を叩いたり拾ったり口に入れたり、
**「とにかく自分が出来る事を目の前の物へぶつける」**
という方法です。
この方法は、科学です。
僕らは最強の学習方法を赤ちゃんの頃から実践していたわけです。
この方法が優れているのは
「自分が何をやれば、何が起きるのかを知れる」
という事です。
赤ちゃんであれば、「食べ物かどうかの定義」も出来ます。
- これは食える
  - これは食えるがまずい　　　　　←　苦かったり酸っぱかったりする物への評価
  - これは食えてしかもうまい　　　←　赤ちゃん用おやつへの評価
- これは食えない
  - これは食えないが危なくない　　←　積み木への評価（口より大きい積み木に限る）
  - これは食えなくてしかも危ない　←　痛かったり、「おえっ」となったりした場合の評価


###  幼児型学習：次点にして優秀

簡単なルールを覚えて積み木が落ちないように
**「ルール通りに実践していく」**
という方法です。
「ルール通りにすると何が起きるのか？何が良いのか？ルールを破ると何が起きるのか？」
を体感していくのが基本であり目的になります。
ルールの利点として
**「決める事で選択肢を狭めつつも判断に迷わないから高速に動ける」**
という事も体感できます。

###  義務教育型学習：シミュレーションとしては優秀

体系立てて順序付けられた物事を
**「頭の中でシミュレーションして学んでいく」**
という方法です。
基本的に座って頭の中で考えて、本当の実践はほぼやりません。
ただし、
「頭の中においてあらゆる方法で積み木を組み立てる」
という思考が出来るので、想像力、思考能力は高まります。
**ただし、思考の条件を限定してしまうと実現力は高まりますが想像力は死んでしまいます**


###  学習は組合せが肝要

赤ちゃん型学習、幼児型学習、義務教育型学習、
これらを状況に合わせて組み合わせて学習すると、学習効率は高まるでしょう。
(大抵は、赤ちゃん型学習から開始するのが良いと思います)
ただし、効率にフォーカスを当てすぎるのは良くありません。
効率は、
「定期的にチェックして、方針や方法を変えるための道具」
と考えましょう。
でないと、「効率を上げるための方法」ばかりを追求し、
「本当に学ぶ必要がある事に向き合わない」という事にもなりやすいです。

なお、人も機械学習モデルのような存在と考えれば、
最初に決定したモデルが効率に大きく影響するのは想像に難くありません。
が、人はモデルを簡単に差し替えたり組みわせたりを出来ますから、
自分の中により良いモデルを持つようにしてみましょう。

最後に、(孔)子曰く...
- 止まりさえしなければ、どんなにゆっくりでも進めばよい
  - (個人解釈) 毎日5分学習すれば、週に35分、月に150分、年に1800分の積み上げです。いきなり1800分は積み上げられません

- 過ぎたるは、なお及ばざるが如し
  - (個人解釈) 自転車のようなもの。遅すぎるとふらふらして倒れるし、速すぎるとコントロールを失ったり小さい小石に引っ掛かったたりしただけで大事故になります


- 過ちて改めざる、これを過ちという
  - (個人解釈) 一度失敗し、同じ失敗を繰り返す事が本当の失敗です


- 物事を迅速にしたいと、望んではならない。小さな利点に目をとめてはならない。物事を早く行うことばかり望むと、十分になすことができない。小さな利点にとらわれると、大きな仕事が達成できない
  - (個人解釈) 小さな利点を追いかけて、大きな利点を潰す事にならないかを気にした方が良い、という事です
HSP（繊細さん）はITエンジニアに向いている？向いてない？？

あなたは、周囲の刺激を受けやすく、疲れやすいと感じたことはありませんか？人一倍、共感力や洞察力に優れていると感じたことはありませんか？もしこれらの特徴に当てはまるなら、あなたは「HSP（Highly Sensitive Person）」かもしれません。HSPは生まれつき感受性が強く、敏感な気質を持つ人です。実は私自身も、HSP気質を持つ人のひとりです。

ITエンジニアという仕事は、情報過多や人間関係のストレスなど、HSPにとって負担が大きい環境です。しかしHSPの繊細さは、集中力や問題解決能力、コミュニケーション能力など、ITエンジニアにとって重要なスキルにもつながります。こちらではHSPでエンジニアの私が、HSPであるITエンジニアの強みや課題、活躍するためのヒントを紹介していきます。


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

## そもそもHSP（繊細さん）とは？

![Merit-and-demerit-of-HSP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784196/1f27dd3a-7c70-67d6-a638-9b09acd74a7f.jpeg)


HSPとは、「Highly Sensitive Person」の略で、日本語では「非常に感受性が強く、敏感な気質を持つ人」という意味です。最近では「繊細さん」なんて呼ばれ方もします。アメリカの心理学者、エレイン・N・アーロン博士によって提唱された概念で、**全人口の約15～20%、5人に1人はHSP**であると言われています。

### HSPの特徴
HSPの特徴として、以下のようなものがあります。

- 五感の感覚が敏感
- 共感力が高い
- 深く考える
- 疲れやすい
- 一人で過ごすのが好き
- 人の気持ちに敏感
- 責任感が強い
- 美的感覚が優れている
- 想像力豊か
- 直感力に優れている

ちなみに誤解されている人も多いですが、**HSPは病気ではありません**。HSPは病気や障害ではなく、生まれ持った単なる気質です。そのためHSPであることを否定したり、克服しようとする必要はありません。

### HSPのメリット・デメリット
上記の特徴を踏まえて、HSPのメリット・デメリットを紹介します。HSPのメリット・デメリットは、以下の通りです。

【メリット】

- 周囲の環境や人の気持ちに気を配ることができる。
- 物事を深く考え、洞察力のある意見を述べることができる。
- 創造力や想像力に富んでいる。
- 感受性が豊かで、芸術や音楽などを楽しむことができる。

【デメリット】

- 刺激を受けやすく、疲れやすい。
- 人の気持ちに影響を受けやすい。
- 完璧主義な傾向があり、自分を責めやすい。
- 周囲に理解されにくいと感じることがある。

## HSPの特徴とITエンジニアの仕事との関係

![HSP's-strengths-that-can-be-utilized-as-engineer.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784196/e2612726-6525-38bd-ee47-beedcde7fc55.jpeg)


HSPの特徴は生きづらさを感じるものもありますが、この特徴をうまく活用できれば大きな強みにすることもできます。私はITエンジニアとして働いているので、その中で感じたHSPの強みと課題について紹介します。

### ITエンジニアとして活かせるHSPの強み
HSPには繊細で敏感な一面がありますが、ITエンジニアとしてこれらの特性を強みに変えることができます。強みとなる特徴は以下です。

- 要件を詳細に捉える力
- 利用者視点のモノ作り
- 倫理的配慮
- 豊かな創造性の発揮
- 細かい注意力

このようにHSPが持つ感受性の強さや繊細さは、ITエンジニアの様々な場面で大きな武器となり得ます。上手く長所を伸ばしていけば、HSPならではの価値あるサービス・製品を生み出せるはずです。

### HSPのITエンジニアが抱える課題
HSPの人がITエンジニアとして活躍する上で、課題も存在します。課題は以下の2つです。

- 過剰な刺激
- ストレス

HSPの方はこれらにものすごく弱いので、何かしらの対策を考えましょう。

## まとめ
今回はHSPの人はITエンジニアに向いているのかというテーマで、自身もHSP兼ITエンジニアの私が向き不向きについて紹介しました。HSPの人には苦手なことも多いですが、得意なことをうまく活かせれば強烈な強みになります。

ITエンジニアという職は働き方が多様なため、苦手なことを避けやすい環境です。**HSPはステータス**だと思って、うまく活用していきましょう:bangbang:

<br>

こちらの細かい解説について、以下にあります。より深く内容を知りたい方はぜひコチラをご覧ください。

https://taishi-official.com/2024/03/19/1979/

### おまけ

https://qiita.com/taishi_will_be/items/70a8ce8938944286b487

[>> プログラミング未経験からエンジニアになるための3STEP学習法](https://taishi-official.com/learning-programming/)

<br>

<strong>＼Follow me／</strong>

- X（旧Twitter）：https://x.com/taishi_it_blog
- Instagram：https://www.instagram.com/taishi_will_be/
- YouTube：https://www.youtube.com/@Engineer_ILLBE
- TikTok：https://www.tiktok.com/@taishi_will_be
- note：https://note.com/taishi_wii_be/

<br>

最後に良かったら「いいね」お願いします:thumbsup:
プロスペクトのソース項目の値のセット



+ [設定上では無効になっているリードソース「Google Natural Search」等が勝手にリード情報に入ってしまうのだが、どうしたら防げるか。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007akWHV)


下記のような自分で設定した覚えのないリードソースが入力されるケースが散見されます。

+ Google Natural Search
+ Bing Natural Search
+ Google Ad
+ corporate

:::note
Account Engagement が自動的にセットしていると思います。

プロスペクトのソース項目の値は、参照元 URL によって決まります。参照元 URL は、トラッキングコードが含まれるページを初めて訪問したビジターが、その直前に訪問していたページです。参照元 URL が存在するとき、Account Engagement はソースデータを引き出して、特定のベンダーの予想される Web サイトと照合します。 

たとえばプロスペクトの参照元 URL が「www.linkedin.com/profile/SarahPersons」で、UTM パラメーターが存在しない場合、プロスペクトのソース項目は「LinkedIn」です。 

https://help.salesforce.com/s/articleView?id=sf.pardot_how_source_field_populated.htm&type=5
:::


Salesforceのリードソース項目にレコードトリガーフローを設定してGoogle Natural Searchならコーポレートサイトに変更するくらいしか思いつきませんね。うまく設定したらAccount Engagementにも同じように同期できるのではないでしょうか。
[Rider]複数プロジェクトを別窓で開きたい時

# 概要
Riderで複数のプロジェクトを同時に扱う時、二窓にしたいのに一つのウィンドウでしか表示されない時の設定手順です。
# 本文
メニューからファイル(File) > 設定(Settings) > 外観＆振る舞い(Appearance & Behavior) > システム設定(System Settings) > プロジェクトを開く先 > 新規ウィンドウ(Open Project in New Window)

![スクリーンショット 2024-05-22 073213.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/9cfc4ff0-79ca-ba99-cd02-1489395159bb.png)
【Suno AIでつくった楽曲】新規ビジネスプロジェクトのためにつくった1960年代後半のクールなモダンジャズ ver.2【動画 1分53秒】【YouTubeチャンネルからの転記です】

この記事は、わたしの[YouTubeチャンネル](https://bit.ly/Yamanaka-YouTube "Living without things. 持たない生き方 手放す生き方")にある公開動画を転記しております。
( どこかのタイミングで、プログラミング-Google Apps Script or iPaaS-Zapier をつかって自動転記させる予定です )

転記のための時間コストを少なくしたいので、文字装飾( Markdown記法 )を極力つかわずに書いております。

こちらが動画内容です👇

***

![99 サムネイル 【Suno AIでつくった楽曲】新規ビジネスプロジェクトのためにつくった1960年代後半のクールなモダンジャズ ver.2【動画 1分53秒】.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386308/7c53c700-0895-f518-195a-7b7dbddfe4aa.png)



* # 動画URL
    * https://youtu.be/-7Ud4MZj21k

<br>

* # 動画タイトル
    * 【Suno AIでつくった楽曲】新規ビジネスプロジェクトのためにつくった1960年代後半のクールなモダンジャズ ver.2【動画 1分53秒】

<br>

* # 動画の説明欄(一部を抜粋)

📅撮影日 = 2024-04-23(火)

Suno AIとは、文章から音楽を生成することができるAI( Text-to-Music-AI )です。
わたしは、2024-04-02(火)に初めてSuno AIで有償プランを契約してから、時々楽曲をつくって遊んでいます。

🎦【Suno AI】文章から音楽を生成するAI( Text-to-Music-AI )で、3分間で2曲、6分間で4曲作りました【試聴可能】1)伴侶の曲 2)税理士の曲【動画 16分11秒】
https://youtu.be/QKfhk4HgQ_g

🎦“Suno AIでつくった楽曲”シリーズ
https://www.youtube.com/playlist?list=PLpQhBHT4oghMLdiSVqwvSs_Z5y0H4VGOe

🎦“効果的にSuno AIを活用するヒント”シリーズ
https://www.youtube.com/playlist?list=PLpQhBHT4oghPuaNOVZn-N53wVvsBkeHdI


今回は、Suno AIでつくった曲をMP3で出力してから、動画編集いたしました。
ぜひ聴いてみてください。
そして、普通のビジネスパーソンが、自分が担当するプロジェクトのテーマ曲を3分間でつくれるようになった感動を味わってみてください！

作曲日:
2024-04-03(水)

契約の種類:
Pro Plan

楽曲の正式名称:
Ripple of Transformation ver.2

Suno AI Library URL:
https://bit.ly/suno-Ripple-of-Transformation-ver-2

Instrumental:


---


Suno AIへの指示文章( プロンプト/Prompt ):


🇬🇧English

Please create an inspirational and uplifting song themed around the in-house digital transformation (DX) project currently underway.
The style should be very cool modern jazz from the late 1960s.


🇯🇵日本語訳

社内で進行中のDX推進プロジェクトをテーマとした、インスピレーショナルで前向きな曲を作成してください。
曲調は1960年代後半のモダンジャズ、とてもクールなモダンジャズ。


---


Suno AI 公式URL
https://accounts.suno.ai


---


✓ 🎥この動画と関連が強いわたしの動画 ↙
　・“Suno AIでつくった楽曲”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMLdiSVqwvSs_Z5y0H4VGOe


　・“効果的にSuno AIを活用するヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghPuaNOVZn-N53wVvsBkeHdI


✓ 🎥Shortened URL for this video | この動画の短縮URL ↙
　https://bit.ly/4aGM3z8
Javaで「演算の時に自動的に行われる型変換」の動作を確認してみた

# 概要

Javaで「演算の時に自動的に行われる型変換」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/var/index12.html

# 実装

以下のファイルを作成しました。
```JSample.java
class JSample {
    public static void main(String[] args){
	double d = 10 * 0.2;
	System.out.println("d = "+d);
	int i = (int)(10 * 0.2);
	System.out.println("i = "+i);
	short s1 = 14;
	short s2 = 8;
	int i2 = s1 + s2;
	System.out.println("i2 = "+i2);
	short s3 = (short)(s1 + s2);
	System.out.println("s3 = "+s3);
    }
}
```

以下のコマンドを実行しました。
```
$ javac JSample.java 
$ java JSample 
d = 2.0
i = 2
i2 = 22
s3 = 22
```

# まとめ

何かの役に立てばと。
robloxでassistant その64

# 概要
robloxでassistantやってみた。
練習問題やってみた。

# 練習問題
プログラムでPartを作成せよ。

# 手順
- ServerScriptServiceに、scriptを追加。
- スクリプトを書く。

```

local part = Instance.new("Part")
part.Name = "ball"
part.Anchored = true
part.Shape = Enum.PartType.Ball
part.Color = Color3.new(1, 128, 1)
part.CFrame = CFrame.new(0, 10, 0)
part.Size = Vector3.new(5, 5, 5)
part.Parent = game.Workspace

```

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/9ef85fef-dd20-8e53-69c4-eb5382a8f842.png)


以上。
AIS受信できず

ADS-Bのdump1090がうまくいってるので、rtl-aisを酒田で試してみました。自宅は港から3Kmくらいのところにあります。

チューナーがFC0012の蟹さんのドングルでADB-Sは受信できませんが162MHz付近は問題なく受信できます。

念のため普通のご家庭には一台あるSSGでも確認してみました。

![ais.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/5e38085f-0100-7ce9-4ccb-3cf9b8b0f865.png)

ネットで調べると1/4波長が44cmのスリーブアンテナで受信しているページがあったので、同軸ケーブルで作ってみました。

残念ながらまったく受信できません。-nオプションで起動してもまったくセンテンスがでてきません。

フィーダーアンテナも試しましたがダメです。

debian(x86)でも試してみましたがダメでした。

[MarineTraffic](https://www.marinetraffic.com/)で見ると送信している船舶はいます。

考えられる問題の可能性は

* ドングルの性能が悪い
* ドングルが壊れている
* rtl-aisの出来が悪い
* アンテナが悪い
* 外部のノイズが大きい

ドングルは結構高いのでいろいろは買えません。アンテナ用のプリアンプを作ってみてもよいかもしれませんが、コストは大きくありませんが高周波なので難易度高いです。

SDRをあきらめて、通常の受信機を作るのも難易度高いです。

電波は難しいです。うむ。。。

2024/10追記

酒田でrtlsdrscannerで見てみたら電波は出てそうですが、かなり弱いです。

![image3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/6639ab2f-7c40-42ed-2959-2e08d716ae86.png)

2025/05追記

スリーブアンテナでRFアンプ(BGA420)を入れたところ、電波は確認できましたが、まだ受信できません。ドングルの性能が悪いのかもしれません。

![ais-bga-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/b1d225ce-0b05-4471-9952-037fc29b796d.png)

高い周波数は安定して確認できますが、低い方は時々しか見えません。
robloxでassistant その63

# 概要
robloxでassistantやってみた。
練習問題やってみた。

# 練習問題
パーツをドラッグして移動せよ。

# 手順
- workspaceに、partを追加。
- partに、DragDetectorを追加。
- partに、scriptを追加。
- スクリプトを書く。
```
local dragDetector = script.Parent.DragDetector
local part = script.Parent
part.Anchored = true
local highlight = Instance.new("Highlight")
highlight.Enabled = false
highlight.Parent = script.Parent
dragDetector.DragStart:Connect(function()
	highlight.Enabled = true
end)
dragDetector.DragContinue:Connect(function()
end)
dragDetector.DragEnd:Connect(function()
	highlight.Enabled = false
end)


```

# 写真

![スクリーンショット 2024-05-22 064804.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/cf004935-21eb-d3e8-83bd-29c5d0c73495.png)




以上。
objectFitプロパティの廃止に対処する

# 初めに 

Next.jsの ```<Image>``` コンポーネントで ```objectFit``` プロパティを使用していて警告が表示されたので共有します。

# 問題

このような警告が表示されました。```Image with src "/nextJs.png" has legacy prop "objectFit". Did you forget to run the codemod?```

```jsx
 <Image
    src="/img.jpg"
    objectFit="contain"
/>
```
# 解決方法

```style``` プロパティでCSSの```objectFit``` を指定することで解決できました。

```jsx
 <Image
    src="/img.jpg"
    style={{ objectFit: 'contain' }}
  />
```

# 原因

警告が発生したプロパティの記述方法は、Next.js13以降で廃止になっていたことが原因です。Next.js12までは<Image>コンポーネントにobjectFitプロパティを使用して画像の表示方法を指定していましたが、Next.js13では廃止され、スタイルで指定する必要があります。

# 終わりに

Next.jsのバージョンアップに伴い、古いプロパティの使用が廃止されることがあります。新しいバージョンに対応するためには、公式ドキュメントを参照し、コードの変更を適切に行うことが重要です。今後、同じような警告が表示された場合は、最新のベストプラクティスに従っていきたいです。
ReactでLinkを使って"Cannot destructure property 'basename' of 'React.useContext(...)' as it is null."が発生した時の対処法

## はじめに
現在Reactを学習中。
ReactでLinkを使用した際にエラーが発生したのでその対処法をまとめる。

## 問題
Link使用時に下記エラーが発生した。
```console
Cannot destructure property 'basename' of 'React.useContext(...)' as it is null.
```

## 解決
LinkはReactRouterの機能のため、Linkを使用できるのは`<BrowserRouter></BrowserRouter>`で囲われた範囲内のみ。
というわけでBrowserRouterでAppの中身を囲ってあげると解決する。

```react
import { BrowserRouter } from "react-router-dom";

export const App = () => {
    return (
        <BrowserRouter>
            //Linkを使用しているその他のコンポーネント
        </BrowserRouter>
    )
}
```
ページテーブルの階層化

# ページテーブルの階層化
ページテーブルはどれくらいの量のメモリを消費するのでしょうか。
...
仮想メモリ量がある程度多くなると、階層型ページテーブルのほうが、フラットなページテーブルよりもメモリ使用量が大きくなります。しかしそのようなことは稀なので、階層型ページテーブルのほうが小さくなることがほとんどです。

### 気づき
階層化した方がメモリ食わないんだな。

```
root@**********:************# sar -r ALL 1
Linux 5.15.0-107-generic (************) 	2024年05月22日 	_x86_64_	(1 CPU)

03時06分49秒 kbmemfree   kbavail kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty  kbanonpg    kbslab  kbkstack   kbpgtbl  kbvmused
03時06分50秒   1000916   2390612   1184876     30.32     56132   1528056   5058708     99.22    612476   1994612       184   1035836    137976      9488     20084     41756
03時06分51秒   1000916   2390612   1184876     30.32     56132   1528056   5058708     99.22    612476   1994612       188   1035840    137976      9456     20084     41756
03時06分52秒   1000916   2390612   1184908     30.32     56132   1528056   4937416     96.84    612472   1993740       344   1034940    137944      9408     19988     41580
03時06分53秒   1000916   2390612   1184932     30.32     56144   1528040   4937416     96.84    612472   1993736       404   1034940    137924      9408     19988     41580
03時06分54秒   1000916   2390612   1184920     30.32     56144   1528052   4937416     96.84    612472   1993736       432   1034940    137924      9408     19988     41580
03時06分55秒   1000916   2390624   1184920     30.32     56144   1528052   4937428     96.84    612484   1993788       432   1034940    137924      9408     19988     41580
^C
平均値:    1000916   2390614   1184905     30.32     56138   1528052   4977849     97.64    612475   1994037       331   1035239    137945      9429     20020     41639
```
```
 kbpgtbl
                     Amount of memory in kilobytes dedicated  to  the  lowest
                     level of page tables.
```
### 和訳
kbpgtbl
最下位レベルのページテーブル専用のキロバイト単位のメモリ量。キロバイト単位のメモリ量。
### 出典
deepl
### 気づき
ページテーブルは20MBぐらいあるんだな。
知らないところにカーネルがページテーブル作ってんだな
# ヒュージページ
プロセスが確保したメモリ量が増えてくると、プロセスのページテーブルに使用する物理メモリが増えていきます。この問題を解決するために、Linuxにはヒュージページという仕組みがあります。
```通常より大きなサイズのページ```です。これによってプロセスのページテーブルに必要な```メモリ量を減らせます```。
...
fork()関数時にページテーブルをコピーするコストが低下するため、fork()関数の高速化も期待できます。

# トランスペアレントヒュージページ
これは仮想アドレス空間内の連続する```複数の４KiBページが所定の条件を満たせば、それらをまとめて自動的```にヒュージページにしてくれるというものです。
...
機能を有効かするかどうかをシステム管理者が選べるようになっています。
```/sys/kernel/mm/transparent_hugepage/enabled```というファイルを見ればわかります。
...
always:システムに存在するプロセスの```全メモリについて有効```。
madvise:madivese()というシステムコールに、MADV_HUGEPAGEというフラグを設定することによって、```明に指定したメモリ領域についてのみ有効```。
never:```無効```
```
root@**********:************# cat /sys/kernel/mm/transparent_hugepage/enabled 
always [madvise] never
```
### 気づき
Ubuntuはデフォルトでmadviseらしい
まだヒュージページはまだ機能していないのかな。もしくは知らないところでしてるかもしれない。

# 出典
https://gihyo.jp/book/2022/978-4-297-13148-7

# 感想
ページテーブルもメモリを使うから工夫してるんだな。
【KVM入門⓪】〜Linuxの基礎知識〜

# KVM入門一覧
- 【KVM入門⓪】〜Linuxの基礎知識〜👈今ここ
- [【KVM入門①】〜KVMを使って仮想マシンを作成する〜](https://qiita.com/ryutarom128/items/a31cc4e296442cd0f9d6)
- [【KVM入門②】〜複数の仮想マシンを作成して仮想マシン間で通信を行えるようにする〜](https://qiita.com/ryutarom128/items/2665a0f871d90f7f5358)
- [【KVM入門③】〜DNSとhostsの設定を行う〜](https://qiita.com/ryutarom128/items/7dd3646beddb96dc647a)
- [【KVM入門④】〜NFSを使って全ての仮想マシンでファイルを共有する〜](https://qiita.com/ryutarom128/items/3d66f1a5d61c3eb4e426)
- [【KVM入門⑤】〜LDAPを使ってユーザ情報などを一元管理する〜](https://qiita.com/ryutarom128/items/b008ca44b7265164879c)

# はじめに
KVM入門シリーズでは、KVMを使った仮想マシンの扱い方について紹介していきます。
まず初めに、KVMを扱うにあたって必要な基礎知識をこの回ではまとめます。

# 実行環境
- OS: Rocky Linux release 9.4 (Blue Onyx)

# Linuxのディストリビューションについて
Linuxの中でも色々な種類があり、これをディストリビューションという。
有名なものとして下の画像のようにRedHat系とDebian系がある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2906464/2536c0a7-2651-4e9f-d470-ac0b20f09939.png)
*Linuxディストリビューションの体系と特徴をまとめてみました. https://note.com/_chibisuke/n/n0ae85ead39cd*

今回使うRocky LinuxはRedHat系。

# パッケージマネージャについて
Linuxではパッケージマネージャというものを使って、世の中に公開されている便利なパッケージをインストールしたりする。

| OS | 代表的なコマンド |
|:-:|:-:|
| RedHat系 | rpm, yum, dnf |
| Debian系 | apt, dpkg |

https://ma-vericks.com/blog/package-manager/

今回はその中でもdnfを使う。

以下の表によく使うコマンドをまとめる。

| コマンド | 説明 |
|:-|:-|
| `dnf update` | dnf自体のアップデート |
| `dnf search <パッケージ名>` | パッケージの検索 |
| `dnf install <パッケージ名>` | パッケージのインストール |
| `dnf list installed` | インストールされているパッケージ一覧を表示 |

# systemdについて
Linuxではsystemdというものを使ってサービスの起動や停止を行う。

systemdでは`systemctl`コマンドというものを使う。

以下の表に今回のKVMシリーズでよく使ったコマンドをまとめる。

| コマンド | 説明 |
|:-|:-|
| `systemctl start <サービス名>` | サービスの開始 |
| `systemctl status <サービス名>` | サービスの状態を表示 |
| `systemctl restart <サービス名>` | サービスの再起動 |
| `systemctl stop <サービス名>` | サービスの終了 |
| `systemctl enable <サービス名>` | サービスの自動起動を有効にする |

https://qiita.com/wms2a4i1/items/04a1250229b12da33b87

# パイプラインについて
Linuxのコマンド操作の1つにパイプライン操作というものがある。
これを使うことでコマンドの入出力を次のコマンドへ渡すことができる。

https://eng-entrance.com/linux-pipeline

パイプラインでは`|`を使ってコマンド同士をつなぐ。
例えば以下のような使い方ができる。（※`grep`は検索コマンド）

```bash
[xxx@localhost /]$ ls
afs  bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[xxx@localhost /]$ ls | grep lib
lib
lib64
```

# viについて
Linuxではviを使って設定ファイルの編集を行ったりする。
以下のような流れで編集することが多かった。

1. `vi <ファイル名>`で起動
1. iを押して書き込みモードに変更
1. ESCを押して書き込みモードを抜ける
1. `:wq`を押して保存+終了する

viの詳しいコマンドはこちら

https://qiita.com/sgash708/items/65236bf7885a8f3bc28e

# さいごに
今回はLinuxの基礎知識について紹介しました。

次回からは実際にKVMを使って仮想マシンを作成していきます。

https://qiita.com/ryutarom128/items/a31cc4e296442cd0f9d6
Docker [Error grabbing logs: invalid character '\x00' looking for beginning of value]について

# 起きたこと
Dockerで開発中にログを確認すると
```terminal:ターミナル
Error grabbing logs: invalid character '\x00' looking for beginning of value
```
というエラーが出ました。
**コードを変更していない、エラーも出ず正常に動作しているのに**なぜかログがこのエラーで出なくなりました。
しかも急に...
# 試したこと
コード内に`` \x00 ``があるか検索しましたが見つかりませんでした。
そして、Dockerのバリューの容量が多いのだと思い使っていないバリューやコンテナを削除、　Dockerを再起動したり、アップデートしたりしましたが解決しませんでした。
# 原因
シンプルに**ログの出力が大量に保存されていたため**でした。
私の場合いつからのログが溜まっていたかわからないです。(おそらく１ヶ月半ほど...)
Dockerの`` Clear terminal ``を実行するだけでは根本的な解決になりませんでした。単に履歴を上に隠しているだけなので...
# 解決方法
解決方法はシンプルです。
```terminal:ターミナル
docker compose down
docker compose up -d
```
これでログもスッキリして解決しました。
以下が参考サイトです。

https://stackoverflow.com/questions/46843711/docker-error-grabbing-logs-invalid-character-x00-looking-for-beginning-of-v

# まとめ
ログは定期的にリセットする習慣を付けるべきだと思いました。ログは他にリセットの方法があります。しかし、その方法ではうまくいきませんでした。
そして、原因をログだと断言していますが正直具体的な根拠は見つけられていません。発見次第この記事に追記したいと思います。また、お手数ですが詳しい方がいましたらご指摘お願いいたします。
最後まで記事をご覧いただきありがとうございました。
TomcatのAPサーバーにリクエストをcurlで送信してもSpring MVCのコントローラに到達しない原因

TomcatのAPサーバーにリクエストをcurlで送信してもSpring MVCのコントローラに到達しない原因は複数考えられます。以下のような点を確認することが解決の手助けになります。

## 1. Tomcatの設定

Tomcatが正常に起動しているか: Tomcatが起動していない、またはエラーが発生している場合、リクエストが処理されません。Tomcatのログファイル（catalina.outやアプリケーションのログ）を確認してください。
デプロイ状態: アプリケーションが正常にデプロイされているか確認します。webappsフォルダ内にアプリケーションのフォルダやWARファイルがあるか、またTomcatの管理画面でデプロイ状況を確認します。

## 2. Spring MVCの設定

コントローラのマッピング: コントローラのメソッドが正しくマッピングされているか確認します。例えば、@RequestMappingアノテーションが正しいURLパターンで指定されているか、HTTPメソッドが正しく指定されているか（GET, POST, など）。
アノテーションスキャン: Springアノテーションのスキャン設定が正しく行われているか確認します。@ComponentScanが必要なパッケージをスキャンするように設定されているか。
DispatcherServletの設定: web.xmlやJava ConfigでDispatcherServletが正しく設定されているか確認します。

## 3. curlコマンドの確認

URLの確認: curlコマンドで指定したURLが正しいか確認します。例えば、http://localhost:8080/yourapp/yourendpointのように、アプリケーションコンテキストとエンドポイントが正しく指定されているか。
HTTPメソッドの確認: コントローラのメソッドが受け付けるHTTPメソッド（GET, POSTなど）と一致するか。
ヘッダやデータの指定: 必要なヘッダやデータを正しく指定しているか確認します。例えば、Content-TypeやAcceptヘッダなど。

## 4. ログの確認

Spring MVCのログレベル: Springのログレベルが適切に設定されているか確認します。Springの設定ファイルでログレベルをDEBUGに設定し、詳細なログを確認します。
```xml
<logger name="org.springframework.web" level="DEBUG"/>
```
Tomcatのアクセスログ: Tomcatのアクセスログ（通常logs/localhost_access_log.*）にリクエストが記録されているか確認します。

## 5. ファイアウォールやネットワークの問題

ファイアウォール設定: ローカルホスト以外からのアクセスの場合、ファイアウォールがブロックしていないか確認します。
ネットワーク接続: クライアントマシンからサーバーまでのネットワーク接続に問題がないか確認します。
これらの点を順番に確認していくことで、リクエストがSpring MVCのコントローラに到達しない原因を特定できる可能性が高まります。
21時間ズレた日時が登録される謎にせまる

# はじめに
自社開発のデータ取込みツールで、社内サーバーでは正しい登録日時がセットされたものの、検証サーバーでは21時間前の日時が登録されていました。
IISログなどでは9時間前の日時が出力されるので9時間ズレなら分かるのですが、21時間ズレはどういうことなのか？

# 現象
データ取込みツールでは、CSVファイルから2つの対象テーブルに登録します。
各テーブルには登録日および登録時刻がセットされています。
検証サーバーでデータ取込みツールを実行したので、データ登録されているかSQLを使用して登録日で抽出して確認すると、最初のテーブルはデータが抽出されてきたのですが、もう一方のテーブルはデータが抽出されませんでした。
登録に失敗したのかと思い、データ取込みツールのログを見てもエラーは出力されていません。それではと登録日の最大値で抽出してみると昨日の日付が返ってきました。そのテーブルを昨日の日付で抽出してみると登録日時には21時間前の日時がセットされていました。

# 調査
自PC(クライアント)でデータベース操作ツール「[A5:SQL Mk-2](https://a5m2.mmatsubara.com/)」を使用しています。

1.検証サーバーPCの日時を確認、正しかったです。
2.接続先：検証サーバーで`SELECT now()`を実行すると正しい日時が返りました。
3.接続先：検証サーバーで、`show timezone`を実行すると「-9:00」が返りました。
4.接続先：社内サーバーで、`show timezone`を実行すると「Asia/Tokyo」が返りました。
5.検証サーバーPCの`postgre.conf`の`timezone = 'Etc/GMT+12'`がセットされていました。
6.検証サーバーPCの「pgAdmin 4」で`SELECT now()`を実行すると21時間前の日時が返りました。

# 原因
検証サーバーの`timezone`の設定が`GMT+12`に設定されており、さらに`9:00`が加算されたことで、`21(12 + 9)`時間のズレとなったのです。

## 疑問点
### 最初のテーブルのデータの登録日は、なぜ正しかったのか？
最初のテーブルは、CSV出力した段階で登録日(PCのシステム日付)がセットされており、COPY句でCSVデータから直接テーブルに登録していたため。
もう一方のテーブルは、登録日に`to_char(now(),'yyyymmdd')`、時刻に`to_char(now(),'hh24miss')`としてデータベース上の日時をセットしていた。

### SELECT now()は、なぜ正しかったのか？
これは「A5:SQL Mk-2」の罠でした。

>A5:SQL Mk-2では set session timezone の設定にかかわらず、クライアントOSのタイムゾーン情報に従って文字列化する

https://a5m2.mmatsubara.com/wp/?topic=%e3%80%90postgresql%e3%80%91sql%e3%82%92%e7%99%ba%e8%a1%8c%e3%81%97%e3%81%9f%e3%81%a8%e3%81%8d%e3%81%ae%e3%82%bf%e3%82%a4%e3%83%a0%e3%82%be%e3%83%bc%e3%83%b3%e3%81%ae%e6%89%b1%e3%81%84

# 最後に
本番環境ではなく、開発中の検証サーバーということもあって、同僚と和気藹々と談笑しながら調べてました。本番環境だったらゾッとしますね。

帰宅してから、この記事を書く上で`Chat GPT`に21時間ズレについて質問してみました。正しい回答が返ってきましたね。

## Chat GPTに質問
一部省略しています。

### プロンプト
PostgresSQLでデータ登録すると日本時間から21時間前の登録日時がセットされました。これから推測される原因は何ですか

### 回答
PostgreSQLでデータ登録時に日本時間から21時間前の登録日時がセットされるという問題の原因として、いくつかの可能性が考えられます。主な原因を以下に挙げます。

タイムゾーン設定の問題:
PostgreSQLサーバーのタイムゾーン設定が日本時間（JST, UTC+9）ではなく、別のタイムゾーンに設定されている可能性があります。21時間の差から推測すると、サーバーがUTC-12のタイムゾーンに設定されている可能性があります。

対処方法
サーバーのタイムゾーンを確認・設定
PostgreSQLサーバーのタイムゾーンを確認し、適切に設定します。例えば、日本時間に設定する場合は、postgresql.confファイルに以下を追加します。

コードをコピーする
```
timezone = 'Asia/Tokyo'
```
HttpServletRequestからBodyの情報を取得

```java
// requestは、HttpServletRequest
try {
  String requestBody = request.getReader().lines().collect(Collectors.joining(System.lineSeparator()));
} catch (Exception e) {
  // 例外処理
}
```

または

```java
// requestは、HttpServletRequest
try {
  BufferedReader reader = request.getReader();
  StringBuilder stringBuilder = new StringBuilder();
  String line;
  while ((line = reader.readLine()) != null) {
    stringBuilder.append(line);
  }
  String requestBody = stringBuilder.toString();
} catch (Exception e) {
  // 例外処理
}   
```
HttpServletRequest の getReader メソッドを使用する際にループが必要なのは、クライアントから送信されたリクエストボディの内容を全て読み取るためです。以下にその理由を詳しく説明します。

## getReader メソッドの動作
getReader メソッドは、リクエストボディを文字単位で読み取るために BufferedReader を返します。BufferedReader は、内部的にバッファリングを行いながら、文字ストリームを効率的に読み取ります。

## リクエストボディの読み取り
リクエストボディは任意の長さを持つことができ、単一の呼び出しで全てのデータを読み取ることは保証されていません。従って、以下のようにループを使用してデータを逐次読み取る必要があります。

## なぜループが必要か
#### データの分割読み取り:
ネットワークを介して送信されたデータは、複数のチャンクに分割されて届く可能性があります。単一の readLine 呼び出しでは、リクエストボディ全体を読み取ることはできません。

#### 非同期データ到着: 
クライアントから送信されるデータは、サーバーに到着するタイミングが異なるため、非同期に処理する必要があります。BufferedReader の readLine メソッドは、ストリームの終わりに達するまでデータを連続して読み取ります。

#### ストリームの終端: 
BufferedReader はストリームの終わりに達するまでデータを読み続けます。null が返されるまでループを回すことで、全てのデータを確実に取得できます。

## まとめ
HttpServletRequest の getReader を使用する際にループが必要なのは、ストリームから送られてくるデータが任意の長さであるため、全てのデータを確実に読み取るためです。BufferedReader を使って、データの終端まで逐次読み取ることで、完全なリクエストボディを取得することができます。


## 追加情報(2025/4/9)

も大容量リクエストにはNGのコードです

リクエストボディ全体をメモリ上に読み込んで、1つの String に結合してしまう方法です。つまり、

100MBのリクエストが来たら

Javaのヒープに100MB以上（内部文字列のオーバーヘッド含む）が一気に確保される

その結果、複数同時アクセス or GCタイミングによってはOutOfMemoryErrorが発生します。

#### 大容量データ対応のベストプラクティス

✅ ストリーミングで処理する

```java
BufferedReader reader = request.getReader();
String line;
while ((line = reader.readLine()) != null) {
    // ここで1行ずつ処理、または一時ファイルに書き出すなど
}
```
このように、全体を一気に読み込まないようにすることが大切です。

✅ ファイルアップロードなら MultipartFile + ディスク保存

```java
@PostMapping("/upload")
public String uploadFile(@RequestParam("file") MultipartFile file) {
    File tempFile = File.createTempFile("upload_", ".tmp");
    file.transferTo(tempFile);
    // 処理後に削除など
    return "ok";
}
```

✅ そもそもAPIで受け取らず、S3や一時ストレージを使う
回帰分析とは？

以下の二つあります
⚫️単回帰分析
⚫️重回帰分析

単回帰分析は、y=a+bxで表せられて、yが被説明変数、xが説明変数です。
例えば、yは売り上げ、xが広告費って考えるとわかりやすいかもしれないです。

重回帰分析は、y=a+b1x1+b2x2+•••bnxn
で表します。説明変数がたくさんです。複雑な予測ができますね。

このあたり、python等使用すればaやbは簡単に計算できるはずなので、まとめる予定です。
printとprintfの違い（学習メモ）

### **コンソール画面に文字列を出力するprintとprintlnとprintfについて**

#### printとprintlnの違いは”改行”するかどうかにある。

- print　：改行せずにコンソールへ出力
- println：文字列を出力した後、改行される

~~~java:printとprintlnの違い（例１） 
System.out.println("Hello World");
System.out.print("Hello World");
~~~
~~~:結果
Hello World
Hello World
~~~

結果は一見同じようにみえるがもう一度Hello Worldを表示してみると
２個目のHello Worldの続きから出力される（改行されないため）
 
~~~java:printとprintlnの違い（例２） 
System.out.println("Hello World");
System.out.print("Hello World");
System.out.print("Hello World");
~~~
~~~:結果
Hello World
Hello WorldHello World
~~~


#### print（println）とprintfの違いは”表示の仕方”にある。
printfのfはformatメソッド（書式指定列）を示しており、単なる文字列を表示するだけでなく、変数に格納されている文字列と組み合わせて表示することができる。
※書式指定列については別稿を参照だが、例３のように%sに変数hwを埋め込んで出力するイメージ。
　
 
~~~java:printlnとprintfの違い（例３）
//コメント--以下はprintfを用いた例だが、printと同様にHello Worldを改行なしで出力

String hw = "Hello World";
System.out.printf("出力結果：%sです",hw);
~~~
~~~:結果
出力結果：Hello Worldです
~~~

最終更新日：2024.5.22
【Flutter】文字列操作: 特定の文字列を語尾に含む場合に削除する方法

## 本記事で紹介すること

Flutterの文字列(String)において、特定の文字列を含む場合、該当の語尾を削除する方法

## 解決方法

replaceAll関数を用いて、正規表現で文末を意味する"$"を使って、文末に特定の文字列が一致するかを検索して、空文字""で入れ替える。

## 実際のコード

```dart:main.dart
void main() {
  // 例の文字列
  String text1 = "bukunya";
  String text2 = "bukuku";
  String text3 = "bukumu";
  String text4 = "This is a test";

  // 文末が "nya"、"ku"、"mu" のいずれかであれば削除
  String result1 = removeEnding(text1);
  String result2 = removeEnding(text2);
  String result3 = removeEnding(text3);
  String result4 = removeEnding(text4);

  print(result1); // buku
  print(result2); // buku
  print(result3); // buku
  print(result4); // This is a test
}

String removeEnding(String input) {
  // 正規表現で文末の "nya"、"ku"、"mu" を削除
  return input.replaceAll(RegExp(r'(nya|ku|mu)$'), '');
}
```

## DartPadで検証

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/4e08c393-4939-5548-3649-191131b8ea3b.png)
正規表現の先読みを使ってテキストを文区切りで改行する

## 前提
文章を句点 (。) で改行して、1行に1文だけ保持されているような文字列を得たいです。

たとえば以下の文章があるとき、
```
 叢の中からは、暫く返辞が無かった。しのび泣きかと思われる微かな声が時々洩れるばかりである。
ややあって、低い声が答えた。「如何にも自分は隴西の李徴である」と。
```
以下の出力を得たいです。
```
　叢の中からは、暫く返辞が無かった。
しのび泣きかと思われる微かな声が時々洩れるばかりである。
ややあって、低い声が答えた。
「如何にも自分は隴西の李徴である」と。
```

## 方法
正規表現の先読みアサーション (Lookahead assertion, たんに先読みとも) を使います。
先読みアサーションとは、「後ろに *x* という表現が続くような(または続かないような) *exp*」にマッチさせる表現のことです。
| 種類 | 記述例 | マッチ例 |
|:-:|:-:|:-:|
| ポジティブアサーション | /exp(?=ress)/g | '**exp**ress explosion experiment'<br>ではじめの exp だけマッチ |
| ネガティブアサーション | /exp(?!ress)/g | 'express **exp**losion **exp**eriment'<br>で後ろ2つの exp だけマッチ |

:::note warn
当然後読みアサーション (Lookbehind assertion) というものもありますが、今回は使わないので割愛します。
:::


## 環境
Bun 1.1.3
今回はJSでコードを書きますが、正規表現なのでたいていどこでも同じように実装可能です。

## コード例

### 失敗例
```ts:index.ts
const text = '　叢の中からは、暫く返辞が無かった。しのび泣きかと思われる微かな声が時々洩れるばかりである。\nややあって、低い声が答えた。「如何にも自分は隴西の李徴である」と。';

console.log(text.replace(/。/g, '。\n'));
```

**実行結果**
```
　叢の中からは、暫く返辞が無かった。
しのび泣きかと思われる微かな声が時々洩れるばかりである。

ややあって、低い声が答えた。
「如何にも自分は隴西の李徴である」と。

```
余計な改行が入ってしまいます。

### 先読みアサーションを使わないコード
```ts:index.ts
const text = '　叢の中からは、暫く返辞が無かった。しのび泣きかと思われる微かな声が時々洩れるばかりである。\nややあって、低い声が答えた。「如何にも自分は隴西の李徴である」と。';

console.log(text.replace(/。([^\n$])/g, '。\n$1'));
```

**実行結果**
```
　叢の中からは、暫く返辞が無かった。
しのび泣きかと思われる微かな声が時々洩れるばかりである。
ややあって、低い声が答えた。
「如何にも自分は隴西の李徴である」と。
```
句点のあとが改行 `\n` ないし終端 `$` ではない場合だけ**次の文字を含めて**マッチし、その句点の次の文字を `$1` で後方参照することで、文のあとに適切に改行を挿入しています。
期待した結果が得られましたが、読みづらいしなんだか冗長な感じがしてしまいます[^1]。

[^1]: ちなみに[MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Regular_expressions/Groups_and_backreferences)には、「キャプチャグループはパフォーマンス上の損失があります。」と書かれています。JavaScript 以外の場合がどうなのかはわかりません。

### 先読みアサーションを使うコード
```ts:index.ts
const text = '　叢の中からは、暫く返辞が無かった。しのび泣きかと思われる微かな声が時々洩れるばかりである。\nややあって、低い声が答えた。「如何にも自分は隴西の李徴である」と。';

console.log(text.replace(/。(?!\n|$)/g, '。\n'));
```

**実行結果**
```
　叢の中からは、暫く返辞が無かった。
しのび泣きかと思われる微かな声が時々洩れるばかりである。
ややあって、低い声が答えた。
「如何にも自分は隴西の李徴である」と。
```

`(?!...)` を使うことで、改行 `\n` ないし終端 `$` に続かない句点だけをマッチし、改行を挿入することができました。
コードもスッキリと記述できています。

## 雑感
基本的な正規表現は一通り勉強したつもりでしたが、やはり具体的なケースに適用することで、使いどころ込みで理解できるなあと実感しました。
Laravelでプロジェクトを作成しphpmyadminでDBを作成した際にユーザーを追加しようとしたところ「#1030 - Got error 176 "Read page with wrong checksum" from storage engine Aria」と出てきて困った（自分用メモ）

# Laravelでプロジェクトを作成しphpmyadminでDBを作成した際にユーザーを追加しようとしたところ「#1030 - Got error 176 "Read page with wrong checksum" from storage engine Aria」と出てきて困った（自分用メモ）


表題の通り
```
#1030 - Got error 176 "Read page with wrong checksum" from storage engine Aria
```
を解決するために
1. 「MySQL」データベースのテーブルを全件チェック
2. コンボボックスより「データベースを修復」

で解決。
グラフデータベースの「グラフ」って何？

# 1.はじめに
どうも、ARIの名古屋支社に勤務している愛知県民こと、
新藏（にいくら）と申します♪
(/・ω・)/

つい先日、グラフデータベースを扱いました。

「グラフ」と聞いて数学の二次関数の様なイメージをしていたのですが、
調べたところ少し違ったので、
今回は**グラフデータベースの「グラフ」について**記事にしたいと思います！
(*^^)v

# 2.グラフとは
いきなり結論ですが、実は**数学の世界には「グラフ」と呼ばれるものが2種類あります。**
以下ではその2種類の「グラフ」について紹介します。

## 2.1.関数のグラフ
1つ目は関数のグラフです。

こちらは多くの人が「グラフ」と聞いてイメージするもので、
**x軸とy軸に対して描画されている直線や曲線のことです。**

:::note info
もちろん軸が異なる or 存在しない場合もありますが、
今回は分かりやすさ優先でx軸とy軸で紹介します。
:::

|![二次関数.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/9630f650-e7a5-bc56-eb1b-1f20c2646293.png)|
|:--|
$y=x^2$のグラフ

より詳細な説明としては以下となります。
>関数のグラフ（英: graph）は、直観的には、関数を平面内の曲線もしくは空間内の曲面としてダイアグラム状に視覚化したものである。
>形式的には、関数 f のグラフとは、順序対 (x, f(x)) の集合である。

引用：https://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%A9%E3%83%95_(%E9%96%A2%E6%95%B0)


## 2.2.グラフ理論のグラフ
聞きなじみがない方もいると思うのですが、
数学にはグラフ理論の「グラフ」もあります。

こちらは**頂点と辺により構成される星座の様なものです。**

以下が例となるのですが、黒丸が頂点、その間の線が辺で、全体で1つグラフといいます。

![プレゼンテーション1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/b8df44e0-635e-ac4c-bef2-b0c06c601eae.png)
|:--|
|てんびん座|

:::note info
ちなみに、辺に向きがついている場合もあるのですが、
辺に向きがあるグラフを有向グラフ、向きがないグラフを無向グラフと呼びます。
:::

より詳細な説明としては以下となります。

>数学のグラフ理論におけるグラフ（英: graph）とは数学的構造の一つ。
>対象の集合で、対象の一部が相互に何らかの脈絡で「関係している」ようなものをいう。
>ここで対象とは頂点（節点やノードとも）と呼ばれる抽象物であり、互いに関係のある頂点の対は辺（枝やエッジとも）と呼ばれる

出典：https://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%A9%E3%83%95_(%E9%9B%A2%E6%95%A3%E6%95%B0%E5%AD%A6)

# 3.グラフデータベースとは
では最後に、グラフデータベースの説明です。

グラフデータベースとはノード、エッジ、プロパティの3要素により
ノード間の関係性を表したデータベースのことです。

**一言で言うと、グラフ理論におけるグラフの構造をしているデータベースとなります！**
（ノードが頂点、エッジが辺となります。）

以下の図における青丸がノード、矢印がエッジ、
矢印の上に書かれている文字がプロパティとなります。

**今回はノードが都市名、エッジが行先、プロパティが距離を表しています。**

例えばPalm SpringsからNew York（グラフの左上）までは2371マイル
という意味になります。

![jueamzn_graph-visualization_f2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/c81d7bc7-6259-0d99-77a7-48d51702d17d.png)
|:--|
例：グラフデータベース 引用：https://aws.amazon.com/jp/compare/the-difference-between-graph-and-relational-database/

![ニューヨークとパームスプリングス.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/390d7264-5dbe-de59-6f1f-97d9b2ed14fc.png)
|:--|
参考：パームスプリングスとニューヨークの距離

# 4.おわりに
ここまで読んで下さり、ありがとうございます！！！
(^^)

今回は「グラフ」について紹介しました。

私自身グラフデータベースを聞いたときに、
関数をイメージしていて「どこがグラフ？」となりましたが、
調べてみるとグラフ理論のグラフもあるということが分かりました！

次回も何かしら記事にします♪
(:3_ヽ)_
【JavaScript】要素にフォーカスした際にスクロールされないようにする方法

`focus()`の引数に`{ preventScroll: true }`を渡すとフォーカス時にスクロールしないようにできます。

```js
document.getElementById("focus_no_scroll").addEventListener("click", () => {
  document.getElementById("myButton").focus({ preventScroll: true });
});
```

クリックすると`textarea`が表示されフォーカスされる場合に、`{ preventScroll: true }`を指定せずに`textarea`の一部が画面からはみ出した状態でフォーカスすると以下のように`textarea`が画面の中央付近に来るまでスクロールされます。

![画面収録 2024-05-21 23.52.49.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/f9993042-389b-2ed2-7e3c-a9fb82d38ac6.gif)

`{ preventScroll: true }`を指定した場合には画面からはみ出した状態でフォーカスしてもスクロールは発生しません。
![画面収録 2024-05-22 0.19.40.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/a4be33c1-e62c-1486-c5cf-f22aa8a456c7.gif)

https://developer.mozilla.org/ja/docs/Web/API/HTMLElement/focus#preventscroll
VMware Player上のWindows Server 2022のHyper-V動作

# 概要
VMware Player上のWindows ServerでHyper-Vが動かないという声を聞いたため、検証をしてみました。

## 参考URL
https://infrastructure-engineer.com/cml-lntel-vtx-ng-001/

# 検証

## 環境
検証端末: ThinkPad X1 Carbon
OS: Windows 11 Pro バージョン 23H2
VMware Player workstation 17 Player

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789581/7caace78-111e-4e35-b488-1688061d8b1e.png)

# 検証

## 機能と役割の変更
調査結果を踏まえ、機能と役割を以下の状態としました。
[無効] Hyper-V
[無効] Windowsサンドボックス
[無効] Windowsハイパーバイザープラットホーム
[無効] 仮想マシンプラットフォーム

なお、以下は無関係そうなので有効としました。
[有効] Linux用Windowsサブシステム

## Windowsセキュリティの設定変更
Windowsセキュリティのコア分離で、メモリ保護を無効にしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789581/df47460a-e4a3-8e27-6889-3810d64bd2d7.png)

### 注意点
メモリ保護を無効にしていない場合、ゲストOS起動時に、以下エラーが出ました。VT-xが無効な場合、ゲストOS内でHyper-Vが動作しません。

![2024-05-21 (76).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789581/6f4590b5-bf94-4b4f-ca09-570526a0185a.png)

## 評価版Windows Serverの取得
以下URLから、日本語のWindows Server 2022（ファイル名: SERVER_EVAL_x64FRE_ja-jp.iso）を取得しました。
https://www.microsoft.com/ja-jp/evalcenter/download-windows-server-2022

## 仮想マシンの作成
VMware Playerで仮想マシンを作成しました。

### 仮想マシンの作成
後でOSをインストールするように、仮想マシンの作成を開始します。
![2024-05-21 (15).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789581/5cd1d03b-a7ba-4728-ce49-d59704b93aca.png)

### 仮想化エンジン
VT-xとIOMMUを有効にします。
![2024-05-21 (20).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789581/6455671c-cfba-bbf6-34b3-5c7004befdfe.png)

CPUパフォーマンスカウンタを有効化すると、以下のエラーで起動しませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789581/9b88ad9d-a728-f4ff-6378-1b73eeadc873.png)

### OSインストール
デスクトップを有効化して、OSをインストールします。

![2024-05-21 (26).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789581/4cc2cd45-bc5f-13f6-9797-1ff8918963c4.png)

![2024-05-21 (28).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789581/8cceac4c-1783-0aa3-ca10-4ab4d2f8466b.png)

### 機能と役割の追加
Hyper-Vの機能を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789581/cd8739d9-2b05-e817-ac25-571665ed13da.png)

### 仮想マシンの作成
新規作成ウィザードに従い、仮想マシンを作成します。

![2024-05-21 (63).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789581/b25dfed0-5cee-e462-2777-6d352e9a4dd2.png)

仮想マシンが作成できることを確認しました。
![2024-05-21 (64).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789581/d7e29e56-c434-8460-47e0-88f379c90816.png)

## 補足
一度無効化したメモリ保護を再度有効化しようとすると、ドライバに難があるようで有効化できません。
![2024-05-21 (69).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789581/97cc9d9d-5d93-34c8-edab-62ce381d01f1.png)

![2024-05-21 (72).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789581/9fc3a909-135d-e46a-4788-9d5636d3632c.png)

![2024-05-21 (73).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789581/d09acf24-fc66-c7d6-a886-4805acdbca3e.png)
Androidアプリの構成

# Androidアプリの構成

![20240521_233943.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2330584/670414a2-ce9e-cd92-765a-d3acab2f21f7.jpeg)

# モバイルアプリのDBのイメージ
- モバイルアプリは、**アプリ毎にDBを持っている**
（端末1台につき1個のDBがあり、それを各アプリで共有して使っているのだと勘違いしていた(´TωT｀)）

![1000004714.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2330584/61b2d514-7d43-502d-c164-500e48a1676d.png)


- モバイルアプリではDBにSQLiteが使われることがある
2024-05-21 共有記事のログ

# 概要
現職の開発部のメンバーに共有した記事のログ

# 技術系
## [Amazon RDS ブルー/グリーンデプロイを利用してMySQLのアップグレードをした話](https://tech.pepabo.com/2024/05/10/rds-blue-green-deployment/)
AWSがDBのブルーグリーンデプロイメントに対応してくれているので、本番稼働している当社全プロダクトをアップグレードしたいです

## [AWS入門ブログリレー2024 〜AWS IAM Identity Center編〜](https://dev.classmethod.jp/articles/introduction-2024-aws-iam-identity-center/)
これを利用すればサンドボックスと各環境ごとのアカウント管理もできるようになるのでしょうか？
もう少し調べて試してみたいです

## [エラーが出たら喜べ。エラーをちゃんと出せ。](https://qiita.com/silane1001/items/271d1cba7aad51eccdcb)

初学者はエラーを嫌がりますが、エラーが出るのは本当に助かりますね
自分たちのコーディングもこれを意識してやっていくようにしたいです！

## [プログラミング言語よりも先にデバッガーの使い方を覚えよう](https://qiita.com/tonbi_attack/items/4452ded1e7be65806833)

デバッガをちゃんと使いこなせると効率が上がるとは思いながらも、ログを仕込んで調査する方向に逃げがちです…
そろそろちゃんと環境を整えていこうと思います！

## [より良い Git コミットメッセージを書こう](https://qiita.com/sekappy_official/items/756c567a53e74ec9d1d9)
自分はコミットメッセージを見返すことがほとんどないので軽視していましたが、今後は気をつけたいと思います！

## [AWS 入門ブログリレー 2024〜 Amazon EC2 編〜](https://dev.classmethod.jp/articles/introduction-2024-amazon-ec2/)
EC2の基本と、設定の応用機能の説明なのでブックマークしておくと役立つかもしれません


# マネジメント系

## [エンジニア従業員エンゲージメント向上への道](https://tech.uzabase.com/entry/2024/05/08/151833)
評価、コミュニケーション、開発者経験、どれも大事にしていかないとダメな内容ですが、どうすれば良いのか難しいものです
こういった記事を参考に色々チャレンジしていく必要がありそうです

## [相手が歩み寄ってくれない時、どこまで歩み寄れば良い？](https://note.shiftinc.jp/n/n113a2b753849)
「自分がどれだけ歩み寄りたいか」この視点で考えればコミュニケーションによるストレスは減るかも知れませんね


# セキュリティ系

## [セキュリティ定量化のテクニックや方法について考えてみる　(はじめの一歩)](https://zenn.dev/rescuenow/articles/6285ab473a67ca)
手探りでもこういったことをやっていきたいです（願望）


## [セキュリティポリシーの作り方](https://tech.smarthr.jp/entry/2024/05/13/130000)
当社もISMSを取るためのセキュリティではなく、意味のあるセキュリティというものを考えていきたいですね



# 共有するほどではないけど興味があったもの
* [クラウドセキュリティの進化をリードする SCoE グループ](https://blog.kinto-technologies.com/posts/2024-05-13-SCoE/)
* [AWS 入門ブログリレー 2024〜 Amazon EBS 編〜](https://dev.classmethod.jp/articles/introduction-2024-amazon-ebs/)
* [新しいチームが特につまづくことなくヌルっと軌道に乗った要因を考えてみた](https://tech.smarthr.jp/entry/2024/05/14/195947)
* [チーム内勉強会はじめました](https://tech.kikagaku.co.jp/entry/2024/05/15/090439)
KotlinでNULLではない場合に処理をしたい時

null安全な言語であるKotlinで、Boolean?型の変数が
- **nullじゃなかったら**処理をする
- **nullだったら**処理をしない
という実装がしたかった。
その際の個人メモ。

# 考えられる実装方法
## その1　if文を使う
```kotlin
    var a :Boolean? = null
    
    if (a == null) { // ←vaの場合はヌルポで落ちるけど、Kotlnなら大丈夫
        // ここの処理が通る
        println("nullなら通る")
        println("true、falseなら通らない")
    }
```

<details><summary> 実行結果 </summary>

![2024-05-21_20h08_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2330584/44cdc5d7-7d89-64b3-2f64-1234013ebbdb.png)
</details>

### 参考サイト
https://qiita.com/kuluna/items/9e5c77701fa7e47451ac


### 備考
- nullを許容する?の位置に注意
- withだとBoolean!型からBoolean型に変換してくれない
<details><summary> 実行結果 </summary>

```kotlin:nullを許容する?の位置に注意
fun main() {
    println("★main関数スタート★")
    var a :Boolean? = null
    
    a?.let { // ←「a?」になっていることで、ここでnullが弾かれて、ラムダ式の中で「a」(「it」)はBoolean型になる
      println("aがnullじゃなければ、ここを通る")
      if (it) { // itはa
          println("aがtrueなら、ここを通る")
      }
    }
    
    a.let { // ←「a」になっていることで、nullでもラムダ式の中の処理が実行されて、「a」(「it」)はBoolean!型になる
      println("aがnullじゃなければ、ここを通る")
      if (it) { // itはa
          println("aがtrueなら、ここを通る")
      }
    }
    println("★main関数終了★")
}
```
![2024-05-21_23h14_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2330584/07ee4dcf-6fab-0e95-5888-d7bf24b31984.png)


```kotlin: withだとBoolean!型からBoolean型に変換してくれない
fun main() {
    println("★main関数スタート★")
    var a :Boolean? = null

    with(a) {
        if (this) { // withだとBoolean!型からBoolean型に変換してくれない
          println("aがtrueなら、ここを通る")
      }
    }
    println("★main関数終了★")
}
```
![2024-05-21_23h22_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2330584/f2a9d40d-6d2e-35de-f920-b34f2606a062.png)

</details>


## その2　スコープ関数を使う

```kotlin
    var a :Boolean? = null
    
    a?.let { 
      println("aがnullじゃなければ、ここを通る")
      if (it) { // itはa
          println("aがtrueなら、ここを通る")
      }
    }
```

<details><summary> 実行結果 </summary>

![2024-05-21_23h00_56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2330584/afc8b68f-73ac-b44a-0e12-804ddddfe1ad.png)
</details>


### 参考サイト
https://qiita.com/ngsw_taro/items/d29e3080d9fc8a38691e

# その他参考サイト
- firstOrNull()
https://qiita.com/opengl-8080/items/36351dca891b6d9c9687#firstornull
bokeh: 軸範囲を指定せずに、datetimeのデータ1個をプロットすると、軸の表示はマイクロ秒になる

# 環境
* Python 3.12.1
* bokeh 3.4.1
* pandas 2.2.2

# やりたいこと
横軸が日付である折れ線グラフを描画したいです。

以下のコードで折れ線グラフを描画できました。

```python:sample.py
from bokeh.io import output_file, save
from bokeh.plotting import figure
import pandas as pd

df = pd.DataFrame({"date": ["2024-01-01", "2024-02-01"], "value": [10, 20]})
df["dt_date"] = pd.to_datetime(df["date"])

fig = figure(width=400, height=400, x_axis_type="datetime")
fig.line(x=df["dt_date"], y=df["value"])
fig.scatter(x=df["dt_date"], y=df["value"])

output_file("output.html")
save(fig)

```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37903/8b6befdf-d5a0-b1fc-9e41-b34019b1d02e.png)


# 問題
プロットする点が1点しかない場合、横軸が`000000us`とマイクロ秒で表示されました。

```python
df = pd.DataFrame({"date": ["2024-01-01", "2024-02-01"], "value": [10, 20]})
df["dt_date"] = pd.to_datetime(df["date"])
df = df.iloc[1:]
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37903/79acc93d-b09e-5957-2390-97d87d92affc.png)

"Wheel zoom"機能を使って表示範囲を縮小すれば、`01/01`を表示させることができますが、できれば最初から`01/01`を表示させたいです。


# 解決
`figure()`の`x_range`引数で、軸の範囲を「前日から翌日」で設定することで、解決できまし指定しました。


```python
kwargs = {}
if len(df) == 1:
    center_datetime = df["dt_date"][0]
    next_day = center_datetime + datetime.timedelta(days=1)
    previous_day = center_datetime - datetime.timedelta(days=1)
    x_range = (previous_day, next_day)
    kwargs["x_range"] = x_range
    
fig = figure(width=400, height=400, x_axis_type="datetime", **kwargs)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37903/133a8f60-0b9b-6652-357a-3dba6dc711ce.png)
２・今日は何も出来なかった。否、しなかったのだ。

私は昨日、大口を叩いたのにも関わらず、今日は気分が乗らないからとゴミのような理由ではっきりとプログラミング学習を怠った。
今日は何もしない、と、強く決めることもできない弱い私はプログラミングから逃げるため、英語を少し覚えようとそこ数時間英語教材を触っただけに止まった１日であった。

だが私は今驚いている。なぜなら、私は非常に今日という日に満足しているからである。
なぜだろうか、私は熟考した。
そして浮かんだ答えは、
・一日休んだことに対して後悔できる自分がまだ心の中にいたことを再発見できたこと。
・いつかこの日を後悔する日が来るかもしれないと思えたこと。
↑
後悔するような日を送ってしまったのだから満足するなんて逆のように感じるだろう。そう思うのも分かる。以前の私ならきっとそう思っていたのだろう。
だが、私は小躍りを披露し街行く人を笑わせることが出来るほど心は舞い上がっているのだ。

なぜならば、いつかこの日を悔やむことがあると思ったということは、私の心の中の自分が私は将来成功すると信じているからこそくる旨の思考であると思うからだ。
期待していなければ絶対にこんな言葉は出ない。
そんな小さな自分の健気さを愛おしく感じたのだ。
私はそんな発見があった日のことは後悔とは思わない。
逆にモチベーションがない日にする勉強こそ意味のないものだと私は考える。

いつか私のようにモチベーションがなくなりかけた人でこれを読んでいたのなら安心して欲しい。
勉強から離れ数日、数週間経ったとしても長い目で見たらあまり変わらないことを強く知って欲しい。自分はダメで何もかも放り出してしまう人間だなんて思わないでほしい。
あなたができないことを他の全員ができるなんて思っていたら大間違いだ。
あなたは繊細で気にしすぎてしまうかもしれない。

だが大丈夫。今まで書いたことのなかった日記帳のような”指南書”を稚拙な文章ながらも私は書き始めたばかり。
見るに耐えない文章かもしれない。だが、私が必ず最初に語った夢を実現させ、生き証人になって見せる。
これから大きくなる背中を見せようじゃないか。弱虫の長として
ku-nlp/deberta-v3-base-japaneseで作る日本語係り受け解析モデル

[ku-nlp/deberta-v3-base-japanese](https://huggingface.co/ku-nlp/deberta-v3-base-japanese)をファインチューニングして、日本語(国語研長単位)係り受け解析モデル[deberta-v3-base-japanese-ud-goeswith](https://huggingface.co/KoichiYasuoka/deberta-v3-base-japanese-ud-goeswith)を[試作してみた](https://huggingface.co/KoichiYasuoka/deberta-v3-base-japanese-ud-goeswith/blob/main/maker.py)。しかし、ku-nlp/deberta-v3-base-japaneseのトークナイザ設計がモロに出てしまい、解析精度を上げることができなかった。Google Colaboratoryで試してみよう。

```
!pip install transformers deplacy
from transformers import pipeline
nlp=pipeline("universal-dependencies","KoichiYasuoka/deberta-v3-base-japanese-ud-goeswith",trust_remote_code=True,aggregation_strategy="simple")
doc=nlp("てこの原理を思い出した")
import deplacy
deplacy.serve(doc,port=None)
```

「てこの原理を思い出した」を係り受け解析してみたところ、私(安岡孝一)の手元では以下の結果が出力された。

```
# text = てこの原理を思い出した
1	て	_	CCONJ	_	_	5	cc	_	SpaceAfter=No
2	この	_	DET	_	_	3	det	_	SpaceAfter=No
3	原理	_	NOUN	_	_	5	obj	_	SpaceAfter=No
4	を	_	ADP	_	_	3	case	_	SpaceAfter=No
5	思い出	_	VERB	_	_	0	root	_	SpaceAfter=No
6	した	_	AUX	_	_	5	aux	_	SpaceAfter=No
```

![ud-ja1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428317/3f6dca8a-fd9b-581a-8dd1-709b0b4f6da2.png)

「てこ」という単語を1語にできず、いきなり崩壊している。「思い出」「した」も切れ目がおかしい。「てこの原理を思い出した」を「テコの原理をおもいだした」にしたら、どうなるだろう。

```
# text = テコの原理をおもいだした
1	テコ	_	NOUN	_	_	3	nmod	_	SpaceAfter=No
2	の	_	ADP	_	_	1	case	_	SpaceAfter=No
3	原理	_	NOUN	_	_	5	obj	_	SpaceAfter=No
4	を	_	ADP	_	_	3	case	_	SpaceAfter=No
5	おもい	_	VERB	_	_	0	root	_	SpaceAfter=No
6	だ	_	AUX	_	_	5	aux	_	SpaceAfter=No
7	した	_	AUX	_	_	5	aux	_	SpaceAfter=No
```

![ud-ja2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428317/9010df38-e7ec-e4cf-0561-471930b8d171.png)

「テコ」はうまくいったが、「おもいだした」の方はやっぱり変だ。どうやらku-nlp/deberta-v3-base-japaneseのトークナイザでは、「し」「た」の間に切れ目が来ないようだ。それだと係り受け解析どころか、品詞付与も難しいなあ。